2.6.24-gregkhなkernelでUSBマウスがautosuspendしそうでしない件、原因を探すべくkernelソースをしばらく眺め、あやしそうな部分をいじってみたところ、drivers/usb/core/driver.cの中で
intf = udev->actconfig->interface[i];
if (!is_active(intf))
continue;
- if (intf->pm_usage_cnt > 0)
+
if (intf->pm_usage_cnt > 1)
return -EBUSY;
if (intf->needs_remote_wakeup &&
とすると自動サスペンドするようになった。
マウスを放置しておいてもpm_usage_cntが完全に0にならないのが原因らしい。
この状態で、
echo auto > /sys/devices/pci0000:00/0000:00:1d.1/usb2/2-1/2-1.3/power/level # MSマウスの動作モード
echo auto > /sys/devices/pci0000:00/0000:00:1d.1/usb2/2-1/2-1.4/power/level # レシーバ&フラッシュメモリの動作モード
echo 60 > /sys/devices/pci0000:00/0000:00:1d.1/usb2/2-1/2-1.3/power/autosuspend # サスペンドまでの時間
と手動設定して使用中。
pm_usage_cnt絡みで使用カウントがおかしいためか、使っているのに不意にサスペンドすることもあるが、まあまあ使える。
ようやくUSBマウスを挿したまま省電力で使えるようになった。
開発陣、おつでございます。
MSマウスのレシーバと合体している余計なUSBメモリ(しかもUSB1.0)は、サスペンドしていると使用できず、かといって起動させているとC3に入らなくなるので、マウスを省電力で使う前提だと使用不可、現状まるっきり存在が無駄である。
せっかく良いマウスなのに、なんでこんな余計なものをつけるかMicrosoftは。
将来的にドライバで工夫されて、省電力と両立させつつ使えるようになるかもしれないが、そこまで完成した形になるのはまだ先の話でしょうな。
GreenhouseのPicoTurbo(2GB USB2.0高速メモリ)でも試したみたところ、モードがautoに設定されているとサスペンドした瞬間にデバイスが失せる。
ただ、EHCI装置なのでモードをonにしておいてもC2に残るのは10%弱くらいで、ほぼ90%弱ほどC3に入る。
EHCI萌え。
ちなみにWindows界隈では、USB selective suspendは2003〜2004年辺りのXPからサポートされていて、2.6kernelではこれを参考にしつつXPのものよりは良いドライバにしようという野望の下に進められているようである。
- C'sGallery Blogっぽく見えるシステム3.2 -
小武
(管理人) eta2@tim.hi-ho.ne.jp