BCM5301XのUSB

まずはUSBをいじってみました。USB2がないモジュールもあるので、とりえずUSB2と同じようにXHCIのドライバーを書いてみました。

BCM5301xはNorthstar(ns)とよばれ、レビジョンAとBが存在するようです。

USB2をコピーしたのでBCMXUSBの下にXHCIが付くようになっています。USB2はOCHIとEHCIがあるのでBCMUSBをはさんでいましたが、XHCI直でもよかったです。

最初BCMXUSBではなくBCMUSB3というデバイス名にしたらエラーになりました。ドライバー名の終わりが数字だとデバイス番号と混同するのでダメみたいです。FreeBSDはいけるのですが、厳しいですね。

試してみます。認識しません。

オリジナルのLinuxを起動してログを見てみます。

```
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci_hcd 0000:00:0a.1: EHCI Host Controller
ehci_hcd 0000:00:0a.1: new USB bus registered, assigned bus number 1
EHCI usb2: port detect
EHCI usb1: port detect
ehci_hcd 0000:00:0a.1: irq 111, io mem 0x18021000
ehci_hcd 0000:00:0a.1: USB 0.0 started, EHCI 1.00
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
ohci_hcd 0000:00:0a.0: OHCI Host Controller
ohci_hcd 0000:00:0a.0: new USB bus registered, assigned bus number 2
ohci_hcd 0000:00:0a.0: irq 111, io mem 0x18022000
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 2 ports detected
uhci_hcd: USB Universal Host Controller Interface driver
xhci_hcd 0000:00:0b.0: xHCI Host Controller
xhci_hcd 0000:00:0b.0: new USB bus registered, assigned bus number 3
XHCI usb1: port detect
xhci_hcd 0000:00:0b.0: irq 112, io mem 0x18023000
xhci_hcd 0000:00:0b.0: Failed to enable MSI-X
xhci_hcd 0000:00:0b.0: failed to allocate MSI entry
usb usb3: No SuperSpeed endpoint companion for config 1  interface 0 altsetting 0 ep 129: using minimum values
xHCI xhci_add_endpoint called for root hub
xHCI xhci_check_bandwidth called for root hub
hub 3-0:1.0: USB hub found
hub 3-0:1.0: 1 port detected

...

hub 1-1:1.0: USB hub found
hub 1-1:1.0: 7 ports detected
```

接続したハブを認識してます。壊れてはいません。

GPLなソースを見てみたらPHYの初期化があったので、写経して見ます。

認識しません。

GPLなソースにはpowerの制御もあったので、調べてみます。

bcm4708-buffalo-wzr-1750dhp.dtsというファイルの中に

```
&usb2 {
        vcc-gpio = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
};

&usb3 {
        vcc-gpio = <&chipcommon 10 GPIO_ACTIVE_LOW>;
}
```

とあります。このvccの制御で、外部へのBUSパワーと同時にホストコントローラーのVBUSに電流が供給されロジックが使えるようになるのかもしれません。VBUSは常時ONで、外部パワーの制御のみの場合はセルフパワーのデバイスは見えますが、このモジュールはまったく見えません。

おそらく電源制御用のチップからオーバーカレントの入力もあるのではないかと思われます。

とりあえずGPIOの10を0にしてみます。

認識しました。

https://dmesgd.nycbug.org/index.cgi?do=view&id=7513

PHYの初期化は必要なかったので、消しました。

GPIOの制御はccaに置きました。

USB3とSATAの変換のモジュールを試してみたところ、認識されなかったり、認識されてもパフォーマンスが悪かったりしました。PHYの初期化のコードを追加してみたのですが、だめでした。デバイスはFreeBSD/ryzenでは普通に使えるので壊れているわけではなく、なにか設定が必要なのかもしれません。

```
# dd if=/dev/zero of=/dev/sd0 bs=1m count=10
10+0 records in
10+0 records out
10485760 bytes transferred in 6.482 secs (1617673 bytes/sec)
# dd if=/dev/zero of=/dev/sd0 bs=1m count=100
100+0 records in
100+0 records out
104857600 bytes transferred in 293.984 secs (356677 bytes/sec)
```

USB3のPHYはMDIOで設定できるようです。MDIOは元々はEtherのPHYの設定に使われるものでしたが、PHYだからMDIOにしたのでしょうか。かなり珍しいと思います。

USB3が認識できないので、調べてみたらLinux方面でもxhciのrootのhubのportが0になってるログがありました。

```
[    4.152849] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    4.160270] ehci-fsl: Freescale EHCI Host controller driver
[    4.166755] ehci-platform: EHCI generic platform driver
[    4.175470] ehci-platform 18021000.usb: EHCI Host Controller
[    4.178130] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    4.181262] ehci-platform 18021000.usb: new USB bus registered, assigned bus number 1
[    4.188530] ohci-platform: OHCI generic platform driver
[    4.195537] ehci-platform 18021000.usb: irq 45, io mem 0x18021000
[    4.200937] ohci-platform 18022000.usb: Generic Platform OHCI controller
[    4.213645] ohci-platform 18022000.usb: new USB bus registered, assigned bus number 2
[    4.221604] ohci-platform 18022000.usb: irq 45, io mem 0x18022000
[    4.229260] ehci-platform 18021000.usb: USB 2.0 started, EHCI 1.00
[    4.235934] hub 1-0:1.0: USB hub found
[    4.239846] hub 1-0:1.0: 2 ports detected
[    4.303745] hub 2-0:1.0: USB hub found
[    4.307557] hub 2-0:1.0: 2 ports detected
[    4.339153] xhci-hcd 18023000.usb: xHCI Host Controller
[    4.344442] xhci-hcd 18023000.usb: new USB bus registered, assigned bus number 3
[    4.352089] xhci-hcd 18023000.usb: hcc params 0x02501164 hci version 0x100 quirks 0x0000020000010010
[    4.361295] xhci-hcd 18023000.usb: irq 46, io mem 0x18023000
[    4.368476] hub 3-0:1.0: USB hub found
[    4.372304] hub 3-0:1.0: config failed, hub doesn't have any ports! (err -19)
[    4.379614] xhci-hcd 18023000.usb: xHCI Host Controller
[    4.384874] xhci-hcd 18023000.usb: new USB bus registered, assigned bus number 4
[    4.392310] xhci-hcd 18023000.usb: Host supports USB 3.0 SuperSpeed
[    4.400275] usb usb4: We don't know the algorithms for LPM for this host, disabling LPM.
[    4.408780] hub 4-0:1.0: USB hub found
[    4.412646] hub 4-0:1.0: 1 port detected
```

どうもこのSOCのXHCIには2.0の機能がなく2.0はEHCIが処理するようだ。

こんな風になってる予想図。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3f9d859c-0661-4cc6-9949-e738ceaf4821.png)

MDIOのタイミングをいじったら、PHYでSSが認識されるようになりましたが、xhciでこけます。

```
[ 882.6299733] uhub0: device problem, disabling port 1
```

OpenWRT 6.6.73でもSSのデバイスが見えません。

```
root@OpenWrt:~# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux 6.6.73 ehci_hcd EHCI Host Controller
Bus 002 Device 001: ID 1d6b:0001 Linux 6.6.73 ohci_hcd Generic Platform OHCI controller
Bus 003 Device 001: ID 1d6b:0003 Linux 6.6.73 xhci-hcd xHCI Host Controller
```

壊れているか、OpenWRTのコードに問題があるかのどちらかです。

純正ファームでもxhciサポートしてないようです。

```
# dmesg  | grep usb
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
EHCI usb2: port detect
EHCI usb1: port detect
usbcore: registered new interface driver usb-storage
usbcore: registered new interface driver sxuptp_driver
usb 1-1: new high speed USB device using ehci_hcd and address 2
usb_stor_probe1:Interfaces = 1(limit = 2)
scsi0 : usb-storage 1-1:1.0
```

GPLなコードのxhci-pic.cもいじられているのですが、xhciはpcieではないようです。想像なのですが、プロトタイプではpcieのusb 3.0のホストコントローラーを使っていたが、IPを買ったか作ったかで取り込んでしまった可能性もあります。

pcieが3本なのはWiFiが二つとUSB3を構成するためかもしれません。

xhci_do_command_locked()でxhci_db_write_4(sc, XHCI_DOORBELL(0), 0);して返答がない。なんでかな？

USB2のクロックの初期化を外したら進みましたが、デバイスのディスクリプタのコントロール転送でこけます。