NetBSD-1.6.2でUSB2.0 on CardBus
1GのSDカードとDVDマルチドライブを買ったおかげで、NetBSDのUSB2.0対応が急務となった。家に転がっていた玄人志向のUSB2.0-CBを何とかNetBSDで使えるようにしたい。
玄人志向のWebページはこちら。http://www.kuroutoshikou.com/products/usb/usb2-cbfset.html
結論から言うと、認識はする。SDカードリーダ、SDカードも認識して/dev/sd0eでmount、読み書きも成功(あまり負荷はかけてないけど)。でもでもUSB2.0-CBを抜いたときにカーネルパニックしてしまう。もうひとがんばりなのに。orz
落ちたときのsyslogはこちら。
Apr 24 11:48:22 simasima /netbsd: ohci0: 1 scheduling overruns Apr 24 11:48:22 simasima /netbsd: ohci0: resume detect Apr 24 11:48:22 simasima /netbsd: ohci0: blocking intrs 0x8 Apr 24 11:48:22 simasima /netbsd: ohci1: 1 scheduling overruns Apr 24 11:48:22 simasima /netbsd: ohci1: resume detect Apr 24 11:48:22 simasima /netbsd: ohci1: blocking intrs 0x8 Apr 24 11:48:22 simasima /netbsd: ehci0: unrecoverable error, controller halted Apr 24 11:48:22 simasima /netbsd: ehci0: blocking intrs 0x10 Apr 24 11:48:22 simasima /netbsd: uhub1: illegal enable change, port 1 Apr 24 11:48:22 simasima /netbsd: uhub2: illegal enable change, port 1 Apr 24 11:48:22 simasima /netbsd: uhub3: illegal enable change, port 1 Apr 24 11:48:22 simasima /netbsd: uhub1: at usb1 (addr 1) disconnected Apr 24 11:48:22 simasima /netbsd: uhub1 detached
カーネルパニックしてDDBに落ちたとき、以下の場所でuvm faultしてた。
usbd_xfer_handle + 0xf movl 0x2c(%edx), %eax
リブートしてデバッグシンボル付きのカーネルをgdbで逆アセンブルしてみる。
$ gdb -q netbsd.gdb (gdb) disassemble usbd_alloc_xfer Dump of assembler code for function usbd_alloc_xfer: 0xc02c3ea0 <usbd_alloc_xfer>: push %ebp 0xc02c3ea1 <usbd_alloc_xfer+1>: mov %esp,%ebp 0xc02c3ea3 <usbd_alloc_xfer+3>: sub $0x14,%esp 0xc02c3ea6 <usbd_alloc_xfer+6>: push %ebx 0xc02c3ea7 <usbd_alloc_xfer+7>: add $0xfffffff4,%esp 0xc02c3eaa <usbd_alloc_xfer+10>: mov 0x8(%ebp),%eax 0xc02c3ead <usbd_alloc_xfer+13>: mov (%eax),%edx 0xc02c3eaf <usbd_alloc_xfer+15>: mov 0x2c(%edx),%eax 0xc02c3eb2 <usbd_alloc_xfer+18>: mov 0x8(%ebp),%edx 0xc02c3eb5 <usbd_alloc_xfer+21>: mov (%edx),%ecx 0xc02c3eb7 <usbd_alloc_xfer+23>: push %ecx 0xc02c3eb8 <usbd_alloc_xfer+24>: mov 0x14(%eax),%ebx 0xc02c3ebb <usbd_alloc_xfer+27>: call *%ebx ...
ここのソースはこうなってる。
396 usbd_xfer_handle 397 usbd_alloc_xfer(usbd_device_handle dev) 398 { 399 usbd_xfer_handle xfer; 400 401 xfer = dev->bus->methods->allocx(dev->bus); 402 if (xfer == NULL) 403 return (NULL); 404 xfer->device = dev; 405 usb_callout_init(xfer->timeout_handle); 406 DPRINTFN(5,("usbd_alloc_xfer() = %p\n", xfer)); 407 return (xfer); 408 }
んー、あやしいのは401行目かな。
とはいえ、これ以上NetBSD-1.6.2で調べるのは時間の無駄だな。ここから先はNetBSDをバージョンアップしてからにした方がいいな(もう直ってるかもしれないし)。ということで、ゴールデンウィークを利用してNetBSD-2.0.2に上げよう。