DisplayLinkの液晶モニタのせいでx250がSuspendできない

このエントリーをはてなブックマークに追加

しばらく前にMB168B+買ったんですよ。
モバイルでもデュアルディスプレイしたくて、まあ最近使ってないんですけど。
https://www.asus.com/jp/Monitors/MB168BPlus/

で、何かというとドライバ入れると普通にこれLinuxで使えるんですけどなんかSuspendできなくなってて、コマンドでサスペンド(sudo pm-suspend)してログで原因調べた(/var/log/pm-suspend.log)ら、USBでデバイスが繋がれていない時はDisplayLinkのSuspendのhook処理が応答してないんですよ。で、Suspend処理ににコケる。みたいな。

x250:/etc/pm/sleep.d$ ls -lha
total 20K
drwxr-xr-x 2 root root 4.0K  4月  2 07:52 .
drwxr-xr-x 5 root root 4.0K  8月  5  2015 ..
-rwxr-xr-x 1 root root  210  6月 26  2015 10_grub-common
-rwxr-xr-x 1 root root  660 12月  7  2013 10_unattended-upgrades-hibernate
lrwxrwxrwx 1 root root   35 10月 31 20:50 displaylink.sh -> /usr/lib/displaylink/displaylink.sh
-rwxr-xr-x 1 root root 1.3K  5月 23  2012 novatel_3g_suspend

で、このdisplaylink.shを下記の様にlsusbでDisplayLinkのベンダーIDがあるときだけ(lsusb -d 17d9: > /dev/null)実行するように修正したら正常にSuspend処理が実行されました。

#!/bin/bash
# Copyright (c) 2015 DisplayLink (UK) Ltd.

suspend_dlm()
{
  # Check DisplayLink Device
  lsusb  -d 17d9: > /dev/null
  if [ $? -eq 0 ]; then
    #flush any bytes in pipe
    while read -n 1 -t 1 SUSPEND_RESULT < /usr/lib/displaylink/PmMessagesPort_out; do : ; done;

    #suspend DisplayLinkManager
    echo "S" > /usr/lib/displaylink/PmMessagesPort_in

    #wait until suspend of DisplayLinkManager finish
    read -n 1 -t 10 SUSPEND_RESULT < /usr/lib/displaylink/PmMessagesPort_out
  fi
}

resume_dlm()
{
  # Check DisplayLink Device
  lsusb  -d 17d9: > /dev/null
  if [ $? -eq 0 ]; then
    #resume DisplayLinkManager
    echo "R" > /usr/lib/displaylink/PmMessagesPort_in
  fi
}

case "$1" in
  thaw)
    resume_dlm
    ;;
  hibernate)
    suspend_dlm
    ;;
  suspend)
    suspend_dlm
    ;;
  resume)
    resume_dlm
    ;;
esac