Fedora20と裸族の集合住宅
Rev.3を表示中。最新版はこちら。
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; }