• xiangliang yu's avatar
    ahci: disabled FBS prior to issuing software reset · 89dafa20
    xiangliang yu authored
    Tested with Marvell 88se9125, attached with one port mulitplier(5 ports)
    and one disk, we will get following boot log messages if using current
    code:
    
      ata8: SATA link up 6.0 Gbps (SStatus 133 SControl 330)
      ata8.15: Port Multiplier 1.2, 0x1b4b:0x9715 r160, 5 ports, feat 0x1/0x1f
      ahci 0000:03:00.0: FBS is enabled
      ata8.00: hard resetting link
      ata8.00: SATA link down (SStatus 0 SControl 330)
      ata8.01: hard resetting link
      ata8.01: SATA link down (SStatus 0 SControl 330)
      ata8.02: hard resetting link
      ata8.02: SATA link down (SStatus 0 SControl 330)
      ata8.03: hard resetting link
      ata8.03: SATA link up 6.0 Gbps (SStatus 133 SControl 133)
      ata8.04: hard resetting link
      ata8.04: failed to resume link (SControl 133)
      ata8.04: failed to read SCR 0 (Emask=0x40)
      ata8.04: failed to read SCR 0 (Emask=0x40)
      ata8.04: failed to read SCR 1 (Emask=0x40)
      ata8.04: failed to read SCR 0 (Emask=0x40)
      ata8.03: native sectors (2) is smaller than sectors (976773168)
      ata8.03: ATA-8: ST3500413AS, JC4B, max UDMA/133
      ata8.03: 976773168 sectors, multi 0: LBA48 NCQ (depth 31/32)
      ata8.03: configured for UDMA/133
      ata8.04: failed to IDENTIFY (I/O error, err_mask=0x100)
      ata8.15: hard resetting link
      ata8.15: SATA link up 6.0 Gbps (SStatus 133 SControl 330)
      ata8.15: Port Multiplier vendor mismatch '0x1b4b' != '0x133'
      ata8.15: PMP revalidation failed (errno=-19)
      ata8.15: hard resetting link
      ata8.15: SATA link up 6.0 Gbps (SStatus 133 SControl 330)
      ata8.15: Port Multiplier vendor mismatch '0x1b4b' != '0x133'
      ata8.15: PMP revalidation failed (errno=-19)
      ata8.15: limiting SATA link speed to 3.0 Gbps
      ata8.15: hard resetting link
      ata8.15: SATA link up 3.0 Gbps (SStatus 123 SControl 320)
      ata8.15: Port Multiplier vendor mismatch '0x1b4b' != '0x133'
      ata8.15: PMP revalidation failed (errno=-19)
      ata8.15: failed to recover PMP after 5 tries, giving up
      ata8.15: Port Multiplier detaching
      ata8.03: disabled
      ata8.00: disabled
      ata8: EH complete
    
    The reason is that current detection code doesn't follow AHCI spec:
    
    First,the port multiplier detection process look like this:
    
    	ahci_hardreset(link, class, deadline)
    	if (class == ATA_DEV_PMP) {
    		sata_pmp_attach(dev)	/* will enable FBS */
    		sata_pmp_init_links(ap, nr_ports);
    		ata_for_each_link(link, ap, EDGE) {
    			sata_std_hardreset(link, class, deadline);
    			if (link_is_online)	/* do soft reset */
    				ahci_softreset(link, class, deadline);
    		}
    	}
    But, according to chapter 9.3.9 in AHCI spec: Prior to issuing software
    reset, software shall clear PxCMD.ST to '0' and then clear PxFBS.EN to
    '0'.
    
    The patch test ok with kernel 3.11.1.
    
    tj: Patch white space contaminated, applied manually with trivial
        updates.
    Signed-off-by: default avatarXiangliang Yu <yuxiangl@marvell.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: stable@vger.kernel.org
    89dafa20
libahci.c 62.7 KB