NetBSD-1.6.2でUSB2.0 on CardBus

1GのSDカードとDVDマルチドライブを買ったおかげで、NetBSDUSB2.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に上げよう。