Fedora20と裸族の集合住宅
Fedora20で裸族の集合住宅 5Bay(CRSJ535EU3)を接続するまでの過程。
Fedora20をインストールした。
裸族の集合住宅 5Bay(CRSJ535EU3)をeSATAで接続したいのだが、起動中に
ata5.15: PMP product ID mismatch
のエラーが発生して、
ata5.00: disabled
結局、見えなくなってしまう。
この現象は、以前Fedora13の時にも発生していて、Kernel 2.6.33.8-149.fc13.x86_64だと正常に接続できていたのだが、2.6.34.9-69.fc13.x86_64に更新すると見えなくなっていた。そのうち解決されるかと思いほったらかしにしていたのだが、最近のカーネルでも状況は変わらないようだ。
動作しなくなった2.6.33.8->2.6.34.9のソース差分を見ていると、Port Multiplier関連でFBSがサポートされており、これが影響しているようだ。
集合住宅に搭載されているSATAコントローラーはdmesgによると
ata5.15: Port Multiplier 1.2, 0x197b:0x0325 r0, 5 ports, feat 0x5/0xf
VendorID 0x197b、DeviceID 0x0325でJMB321のようで、JMB321はFBSには対応していない模様。
dmesgを見るとFBSを有効にしようとしているので、FBS未対応のJMB321にFBSでアクセスしようとしているのが原因のようだ。
[ 1.173618] ahci 0000:00:1f.2: FBS is enabled [ 1.174000] ata5.15: PMP product ID mismatch
カーネルの起動パラメータで、FBS/CBSを指定できるといいのだが、ないようなので、Fedora20と同じKernel 3.12.9をダウンロードして修正することにする。
修正箇所はdrivers/ata/libahci.cのahci_save_initial_config()関数。
if (!(cap & HOST_CAP_FBS) && (hpriv->flags & AHCI_HFLAG_YES_FBS)) { dev_info(dev, "controller can do FBS, turning on CAP_FBS\n"); cap |= HOST_CAP_FBS; } cap &= ~HOST_CAP_FBS; /* 追加 */
HOST_CAP_FBSを強制的に落として、AHCIホストコントローラをFBS未対応扱いにすることで、CBSで動作させるようにしている。
この修正を加えて、KernelをBuildしたら無事、集合住宅上のディスクにアクセスできるようになった。
複数のeSATAポートがあり、他方でFBS対応したデバイスがあるとそちらもCBSになってしまうので、本当なら、ahci_enable_fbs()あたりで、VendorID/DeviceIDをチェックして、JMB321ならfbs_enabledをfalseのままにするようにした方がよい。
そもそも、なぜFBS未対応のデバイスに対してFBSを有効にしようとしているかというと、AHCIコントローラのPxFBS Port(40h)をReadして、FIS based Switching Capable Port (FBSCP) bit (bit 22)でFBSサポートの有無を判定できるのだが、ここでなぜかFBSCP bitが立っているため、FBS対応デバイスとして扱ってしまっている。なぜ、FBSCP bitが立っているのかは不明。
static void ahci_enable_fbs(struct ata_port *ap) { struct ahci_port_priv *pp = ap->private_data; void __iomem *port_mmio = ahci_port_base(ap); u32 fbs; int rc; if (!pp->fbs_supported) return; fbs = readl(port_mmio + PORT_FBS); if (fbs & PORT_FBS_EN) { pp->fbs_enabled = true; pp->fbs_last_dev = -1; /* initialization */ return; }
参考
パッチ適用前(接続不可時)のdmesg(関連箇所のみ)
[ 1.172446] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300) [ 1.172521] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300) [ 1.172541] ata5: SATA link up 3.0 Gbps (SStatus 123 SControl 300) [ 1.173153] ata5.15: Port Multiplier 1.2, 0x197b:0x0325 r0, 5 ports, feat 0x5 /0xf [ 1.173618] ahci 0000:00:1f.2: FBS is enabled [ 1.174000] ata5.15: PMP product ID mismatch <snip> [ 6.635825] ata5.15: SATA link up 3.0 Gbps (SStatus 123 SControl 300) [ 6.635830] ata5.15: link online but device misclassified [ 6.636426] ata5.15: Port Multiplier vendor mismatch '0x197b' != '0x0' [ 6.636430] ata5.15: PMP revalidation failed (errno=-19) [ 6.636482] ata5.15: limiting SATA link speed to 1.5 Gbps [ 12.099160] ata5.15: SATA link up 1.5 Gbps (SStatus 113 SControl 310) [ 12.099167] ata5.15: PMP revalidation failed (errno=-19) [ 17.562496] ata5.15: SATA link up 1.5 Gbps (SStatus 113 SControl 310) [ 17.563125] ata5.15: Port Multiplier vendor mismatch '0x197b' != '0x0' [ 17.563130] ata5.15: PMP revalidation failed (errno=-19) [ 17.563180] ata5.15: failed to recover PMP after 5 tries, giving up [ 17.563232] ata5.15: Port Multiplier detaching [ 17.563240] ahci 0000:00:1f.2: FBS is disabled [ 17.563244] ata5.00: disabled