linux/drivers/ata
xiangliang yu 89dafa20f3 ahci: disabled FBS prior to issuing software reset
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: Xiangliang Yu <yuxiangl@marvell.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: stable@vger.kernel.org
2013-10-27 08:03:04 -04:00
..
acard-ahci.c Merge branch 'libata/for-3.10-fixes' into libata/for-3.11 2013-07-02 19:54:16 -07:00
ahci_imx.c ahci: imx: setup power saving methods 2013-10-15 08:47:00 -04:00
ahci_platform.c ahci: imx: setup power saving methods 2013-10-15 08:47:00 -04:00
ahci.c Merge branch 'for-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2013-09-03 18:19:53 -07:00
ahci.h ahci: imx: setup power saving methods 2013-10-15 08:47:00 -04:00
ata_generic.c
ata_piix.c ata_piix: minor typo and a printk fix 2013-10-13 16:17:48 -04:00
Kconfig ahci_imx: depend on CONFIG_MFD_SYSCON 2013-07-26 08:57:56 -04:00
libahci.c ahci: disabled FBS prior to issuing software reset 2013-10-27 08:03:04 -04:00
libata-acpi.c Merge branch 'for-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2013-09-03 18:19:53 -07:00
libata-core.c libata: bugfix: Remove __le32 in ata_tf_to_fis() 2013-09-03 10:37:41 -04:00
libata-eh.c libata: update "Maintained by:" tags 2013-05-14 11:13:04 -07:00
libata-pmp.c libata: apply behavioral quirks to sil3826 PMP 2013-08-19 09:38:21 -04:00
libata-scsi.c Merge branch 'for-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2013-09-03 18:19:53 -07:00
libata-sff.c libata: update "Maintained by:" tags 2013-05-14 11:13:04 -07:00
libata-transport.c libata: Fix display of sata speed 2013-10-27 07:43:25 -04:00
libata-transport.h
libata-zpodd.c ata: acpi: rework the ata acpi bind support 2013-08-23 12:09:23 -04:00
libata.h libata: acpi: Remove ata_dev_acpi_handle stub in libata.h 2013-08-27 14:07:12 -04:00
Makefile ahci_imx: add ahci sata support on imx platforms 2013-07-24 12:29:08 -04:00
pata_acpi.c ata: acpi: rework the ata acpi bind support 2013-08-23 12:09:23 -04:00
pata_ali.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_amd.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_arasan_cf.c ata: pata_arasan: Staticize local symbols 2013-08-09 10:12:23 -04:00
pata_artop.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_at32.c ata: use dev_get_platdata() 2013-07-30 08:59:24 -04:00
pata_at91.c ata: use dev_get_platdata() 2013-07-30 08:59:24 -04:00
pata_atiixp.c
pata_atp867x.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_bf54x.c ata: use platform_{get,set}_drvdata() 2013-05-24 10:26:13 +09:00
pata_cmd64x.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_cmd640.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_cs5520.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_cs5530.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_cs5535.c
pata_cs5536.c
pata_cypress.c
pata_efar.c
pata_ep93xx.c drivers/ata: don't check resource with devm_ioremap_resource 2013-05-12 15:19:46 +02:00
pata_hpt3x2n.c
pata_hpt3x3.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_hpt37x.c
pata_hpt366.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_icside.c
pata_imx.c pata_imx: expose module alias for loading from device-tree 2013-07-29 12:13:08 -04:00
pata_isapnp.c
pata_it821x.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_it8213.c
pata_ixp4xx_cf.c ata: use dev_get_platdata() 2013-07-30 08:59:24 -04:00
pata_jmicron.c
pata_legacy.c pata_legacy: bogus clock in opti82c46x_set_piomode() 2013-04-03 19:53:10 -04:00
pata_macio.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_marvell.c
pata_mpc52xx.c ata: use platform_{get,set}_drvdata() 2013-05-24 10:26:13 +09:00
pata_mpiix.c
pata_netcell.c
pata_ninja32.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_ns87410.c
pata_ns87415.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_octeon_cf.c ata: use dev_get_platdata() 2013-07-30 08:59:24 -04:00
pata_of_platform.c
pata_oldpiix.c
pata_opti.c
pata_optidma.c
pata_palmld.c
pata_pcmcia.c drivers/ata: use module_pcmcia_driver() in pcmcia drivers 2013-03-15 12:26:03 -07:00
pata_pdc202xx_old.c
pata_pdc2027x.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_piccolo.c
pata_platform.c ata: use dev_get_platdata() 2013-07-30 08:59:24 -04:00
pata_pxa.c ata: use dev_get_platdata() 2013-07-30 08:59:24 -04:00
pata_radisys.c
pata_rb532_cf.c
pata_rdc.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_rz1000.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_samsung_cf.c ata: pata_samsung_cf: add missing __iomem annotation 2013-08-09 10:12:23 -04:00
pata_sc1200.c
pata_scc.c
pata_sch.c
pata_serverworks.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_sil680.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_sis.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_sl82c105.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_triflex.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pata_via.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
pdc_adma.c libata: update "Maintained by:" tags 2013-05-14 11:13:04 -07:00
sata_dwc_460ex.c
sata_fsl.c sata_fsl: save irqs while coalescing 2013-08-20 08:38:23 -04:00
sata_highbank.c Merge branch 'for-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2013-09-03 18:19:53 -07:00
sata_inic162x.c libata: make it clear that sata_inic162x is experimental 2013-07-22 17:11:14 -04:00
sata_mv.c sata_mv: Remove unneeded CONFIG_HAVE_CLK ifdefs 2013-07-30 09:03:01 -04:00
sata_nv.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
sata_promise.c libata: update "Maintained by:" tags 2013-05-14 11:13:04 -07:00
sata_promise.h
sata_qstor.c
sata_rcar.c drivers/ata/sata_rcar.c: simplify use of devm_ioremap_resource 2013-08-14 09:31:36 -04:00
sata_sil24.c ata: use pci_get_drvdata() 2013-06-02 22:22:03 -07:00
sata_sil.c Merge branch 'libata/for-3.10-fixes' into libata/for-3.11 2013-07-02 19:54:16 -07:00
sata_sis.c
sata_svw.c sata_svw: switch to ->show_info() 2013-04-09 14:13:28 -04:00
sata_sx4.c libata: update "Maintained by:" tags 2013-05-14 11:13:04 -07:00
sata_uli.c
sata_via.c libata: update "Maintained by:" tags 2013-05-14 11:13:04 -07:00
sata_vsc.c
sis.h