summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-06-18 08:12:50 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2026-06-18 08:12:50 -0700
commit00d07402df810b4dce0ae6828f4a292c20bab916 (patch)
treeddf0c707aee1ba461652fbc7de2aef803a1f6eab
parent2f9f5887b42711595e768b9dc0582dccfdf60c3b (diff)
parent21e7b9710a24bd7688c02f136923c89bee2fda5a (diff)
Merge tag 'ata-7.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux
Pull ata updates from Niklas Cassel: - Bump required Clang version to 23 (Marco), and add Clang context analysis annotations (Bart) - Use the ahci_nr_ports() helper in libahci (me) - Fail to probe the ahci driver if the BAR size is smaller than the required size to support CAP.NP (Number of Ports) (liyouhong) - Move EXPORT_SYMBOL_GPL(ahci_do_softreset) to be just below the function definition (Bart) - Make ata_scsi_scan_host() schedule hotplug work on the system_dfl_long_wq workqueue so that it can benefit from scheduler task placement (Marco) - Make ata_scsi_port_error_handler() schedule hotplug work on the system_dfl_long_wq workqueue, such that the work always uses the same workqueue (me) - Use devm_platform_get_and_ioremap_resource() in pata_arasan_cf driver (Rosen) - Fix ata_exec_internal() to only release and acquire the EH mutex if the calling function is the one holding the EH mutex (Bart) - Use hweight_long() to count the port_map bits (TanZheng) - Add COMPILE_TEST support for pata_ep93xx driver (Rosen) - Drop unused assignments from pata_isapnp driver (Uwe) - Extend existing JMicron PMP quirk to include JMicron JMS562 (Xu) - Drop unused assignments of pci_device_id driver data (Uwe) - Use named initializers for pci_device_id arrays (Uwe) * tag 'ata-7.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux: ata: Use named initializers for pci_device_id arrays ata: Drop unused assignments of pci_device_id driver data ata: libata-pmp: add JMicron JMS562 quirk ata: pata_isapnp: Drop unused assignments from pnp_device_id array ata: pata_ep93xx: add COMPILE_TEST support ata: pata_ep93xx: use unsigned long for data ata: pata_ep93xx: avoid asm on non ARM ata: Annotate functions in the issuing path with __must_hold() ata: libata: Pass ap parameter directly to functions in the issuing path ata: libata: Document when host->eh_mutex should be held ata: libata: Add an argument to ata_eh_reset() ata: ahci: use hweight_long() to count port_map bits ata: libata: Fix ata_exec_internal() ata: pata_arasan_cf: simplify ioremap ata: libata-eh: queue hotplug work on the system_dfl_long_wq workqueue ata: libata-scsi: Move long delayed work on system_dfl_long_wq ata: ahci: Move EXPORT_SYMBOL_GPL(ahci_do_softreset) ata: ahci: fail probe if BAR too small for claimed ports ata: libahci: use ahci_nr_ports() helper
-rw-r--r--drivers/ata/Kconfig2
-rw-r--r--drivers/ata/Makefile2
-rw-r--r--drivers/ata/acard-ahci.c8
-rw-r--r--drivers/ata/ahci.c1654
-rw-r--r--drivers/ata/ahci.h3
-rw-r--r--drivers/ata/ahci_imx.c1
-rw-r--r--drivers/ata/ata_piix.c532
-rw-r--r--drivers/ata/libahci.c11
-rw-r--r--drivers/ata/libata-core.c28
-rw-r--r--drivers/ata/libata-eh.c13
-rw-r--r--drivers/ata/libata-pmp.c12
-rw-r--r--drivers/ata/libata-sata.c3
-rw-r--r--drivers/ata/libata-scsi.c21
-rw-r--r--drivers/ata/libata-sff.c2
-rw-r--r--drivers/ata/libata.h21
-rw-r--r--drivers/ata/pata_acpi.c5
-rw-r--r--drivers/ata/pata_amd.c88
-rw-r--r--drivers/ata/pata_arasan_cf.c25
-rw-r--r--drivers/ata/pata_artop.c11
-rw-r--r--drivers/ata/pata_atp867x.c6
-rw-r--r--drivers/ata/pata_cmd640.c4
-rw-r--r--drivers/ata/pata_cmd64x.c11
-rw-r--r--drivers/ata/pata_ep93xx.c7
-rw-r--r--drivers/ata/pata_isapnp.c4
-rw-r--r--drivers/ata/pata_jmicron.c7
-rw-r--r--drivers/ata/pata_macio.c12
-rw-r--r--drivers/ata/pata_ninja32.c14
-rw-r--r--drivers/ata/pata_opti.c7
-rw-r--r--drivers/ata/pata_pdc2027x.c30
-rw-r--r--drivers/ata/pata_pdc202xx_old.c13
-rw-r--r--drivers/ata/pata_sch.c2
-rw-r--r--drivers/ata/pata_serverworks.c24
-rw-r--r--drivers/ata/pata_sis.c1
-rw-r--r--drivers/ata/pata_via.c19
-rw-r--r--drivers/ata/pdc_adma.c3
-rw-r--r--drivers/ata/sata_dwc_460ex.c1
-rw-r--r--drivers/ata/sata_fsl.c1
-rw-r--r--drivers/ata/sata_inic162x.c1
-rw-r--r--drivers/ata/sata_mv.c35
-rw-r--r--drivers/ata/sata_nv.c60
-rw-r--r--drivers/ata/sata_promise.c39
-rw-r--r--drivers/ata/sata_qstor.c4
-rw-r--r--drivers/ata/sata_sil.c15
-rw-r--r--drivers/ata/sata_sil24.c16
-rw-r--r--drivers/ata/sata_sis.c32
-rw-r--r--drivers/ata/sata_svw.c15
-rw-r--r--drivers/ata/sata_sx4.c4
-rw-r--r--drivers/ata/sata_uli.c7
-rw-r--r--drivers/ata/sata_via.c39
-rw-r--r--drivers/ata/sata_vsc.c14
-rw-r--r--include/linux/libata.h18
51 files changed, 2112 insertions, 795 deletions
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
index fff305ec1e78..28ca856ecc75 100644
--- a/drivers/ata/Kconfig
+++ b/drivers/ata/Kconfig
@@ -692,7 +692,7 @@ config PATA_EFAR
config PATA_EP93XX
tristate "Cirrus Logic EP93xx PATA support"
- depends on ARCH_EP93XX
+ depends on ARCH_EP93XX || COMPILE_TEST
select PATA_TIMINGS
help
This option enables support for the PATA controller in
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
index 20e6645ab737..b96025abd45e 100644
--- a/drivers/ata/Makefile
+++ b/drivers/ata/Makefile
@@ -1,5 +1,7 @@
# SPDX-License-Identifier: GPL-2.0
+CONTEXT_ANALYSIS := y
+
obj-$(CONFIG_ATA) += libata.o
# non-SFF interface
diff --git a/drivers/ata/acard-ahci.c b/drivers/ata/acard-ahci.c
index 3999305b5356..402d3304b94b 100644
--- a/drivers/ata/acard-ahci.c
+++ b/drivers/ata/acard-ahci.c
@@ -91,9 +91,11 @@ static const struct ata_port_info acard_ahci_port_info[] = {
};
static const struct pci_device_id acard_ahci_pci_tbl[] = {
- /* ACard */
- { PCI_VDEVICE(ARTOP, 0x000d), board_acard_ahci }, /* ATP8620 */
-
+ {
+ /* ACard ATP8620 */
+ PCI_VDEVICE(ARTOP, 0x000d),
+ .driver_data = board_acard_ahci,
+ },
{ } /* terminate list */
};
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 1d73a53370cf..58f512f8952a 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -279,384 +279,1312 @@ static const struct ata_port_info ahci_port_info[] = {
static const struct pci_device_id ahci_pci_tbl[] = {
/* Intel */
- { PCI_VDEVICE(INTEL, 0x06d6), board_ahci_pcs_quirk }, /* Comet Lake PCH-H RAID */
- { PCI_VDEVICE(INTEL, 0x2652), board_ahci_pcs_quirk }, /* ICH6 */
- { PCI_VDEVICE(INTEL, 0x2653), board_ahci_pcs_quirk }, /* ICH6M */
- { PCI_VDEVICE(INTEL, 0x27c1), board_ahci_pcs_quirk }, /* ICH7 */
- { PCI_VDEVICE(INTEL, 0x27c5), board_ahci_pcs_quirk }, /* ICH7M */
- { PCI_VDEVICE(INTEL, 0x27c3), board_ahci_pcs_quirk }, /* ICH7R */
- { PCI_VDEVICE(AL, 0x5288), board_ahci_ign_iferr }, /* ULi M5288 */
- { PCI_VDEVICE(INTEL, 0x2681), board_ahci_pcs_quirk }, /* ESB2 */
- { PCI_VDEVICE(INTEL, 0x2682), board_ahci_pcs_quirk }, /* ESB2 */
- { PCI_VDEVICE(INTEL, 0x2683), board_ahci_pcs_quirk }, /* ESB2 */
- { PCI_VDEVICE(INTEL, 0x27c6), board_ahci_pcs_quirk }, /* ICH7-M DH */
- { PCI_VDEVICE(INTEL, 0x2821), board_ahci_pcs_quirk }, /* ICH8 */
- { PCI_VDEVICE(INTEL, 0x2822), board_ahci_pcs_quirk_no_sntf }, /* ICH8/Lewisburg RAID*/
- { PCI_VDEVICE(INTEL, 0x2824), board_ahci_pcs_quirk }, /* ICH8 */
- { PCI_VDEVICE(INTEL, 0x2829), board_ahci_pcs_quirk }, /* ICH8M */
- { PCI_VDEVICE(INTEL, 0x282a), board_ahci_pcs_quirk }, /* ICH8M */
- { PCI_VDEVICE(INTEL, 0x2922), board_ahci_pcs_quirk }, /* ICH9 */
- { PCI_VDEVICE(INTEL, 0x2923), board_ahci_pcs_quirk }, /* ICH9 */
- { PCI_VDEVICE(INTEL, 0x2924), board_ahci_pcs_quirk }, /* ICH9 */
- { PCI_VDEVICE(INTEL, 0x2925), board_ahci_pcs_quirk }, /* ICH9 */
- { PCI_VDEVICE(INTEL, 0x2927), board_ahci_pcs_quirk }, /* ICH9 */
- { PCI_VDEVICE(INTEL, 0x2929), board_ahci_pcs_quirk }, /* ICH9M */
- { PCI_VDEVICE(INTEL, 0x292a), board_ahci_pcs_quirk }, /* ICH9M */
- { PCI_VDEVICE(INTEL, 0x292b), board_ahci_pcs_quirk }, /* ICH9M */
- { PCI_VDEVICE(INTEL, 0x292c), board_ahci_pcs_quirk }, /* ICH9M */
- { PCI_VDEVICE(INTEL, 0x292f), board_ahci_pcs_quirk }, /* ICH9M */
- { PCI_VDEVICE(INTEL, 0x294d), board_ahci_pcs_quirk }, /* ICH9 */
- { PCI_VDEVICE(INTEL, 0x294e), board_ahci_pcs_quirk }, /* ICH9M */
- { PCI_VDEVICE(INTEL, 0x502a), board_ahci_pcs_quirk }, /* Tolapai */
- { PCI_VDEVICE(INTEL, 0x502b), board_ahci_pcs_quirk }, /* Tolapai */
- { PCI_VDEVICE(INTEL, 0x3a05), board_ahci_pcs_quirk }, /* ICH10 */
- { PCI_VDEVICE(INTEL, 0x3a22), board_ahci_pcs_quirk }, /* ICH10 */
- { PCI_VDEVICE(INTEL, 0x3a25), board_ahci_pcs_quirk }, /* ICH10 */
- { PCI_VDEVICE(INTEL, 0x3b22), board_ahci_pcs_quirk }, /* PCH AHCI */
- { PCI_VDEVICE(INTEL, 0x3b23), board_ahci_pcs_quirk }, /* PCH AHCI */
- { PCI_VDEVICE(INTEL, 0x3b24), board_ahci_pcs_quirk }, /* PCH RAID */
- { PCI_VDEVICE(INTEL, 0x3b25), board_ahci_pcs_quirk }, /* PCH RAID */
- { PCI_VDEVICE(INTEL, 0x3b29), board_ahci_pcs_quirk }, /* PCH M AHCI */
- { PCI_VDEVICE(INTEL, 0x3b2b), board_ahci_pcs_quirk }, /* PCH RAID */
- { PCI_VDEVICE(INTEL, 0x3b2c), board_ahci_pcs_quirk }, /* PCH M RAID */
- { PCI_VDEVICE(INTEL, 0x3b2f), board_ahci_pcs_quirk }, /* PCH AHCI */
- { PCI_VDEVICE(INTEL, 0x19b0), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19b1), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19b2), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19b3), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19b4), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19b5), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19b6), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19b7), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19bE), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19bF), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19c0), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19c1), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19c2), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19c3), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19c4), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19c5), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19c6), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19c7), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19cE), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x19cF), board_ahci }, /* DNV AHCI */
- { PCI_VDEVICE(INTEL, 0x1c02), board_ahci_pcs_quirk }, /* CPT AHCI */
- { PCI_VDEVICE(INTEL, 0x1c03), board_ahci_pcs_quirk }, /* CPT M AHCI */
- { PCI_VDEVICE(INTEL, 0x1c04), board_ahci_pcs_quirk }, /* CPT RAID */
- { PCI_VDEVICE(INTEL, 0x1c05), board_ahci_pcs_quirk }, /* CPT M RAID */
- { PCI_VDEVICE(INTEL, 0x1c06), board_ahci_pcs_quirk }, /* CPT RAID */
- { PCI_VDEVICE(INTEL, 0x1c07), board_ahci_pcs_quirk }, /* CPT RAID */
- { PCI_VDEVICE(INTEL, 0x1d02), board_ahci_pcs_quirk }, /* PBG AHCI */
- { PCI_VDEVICE(INTEL, 0x1d04), board_ahci_pcs_quirk }, /* PBG RAID */
- { PCI_VDEVICE(INTEL, 0x1d06), board_ahci_pcs_quirk }, /* PBG RAID */
- { PCI_VDEVICE(INTEL, 0x2323), board_ahci_pcs_quirk }, /* DH89xxCC AHCI */
- { PCI_VDEVICE(INTEL, 0x1e02), board_ahci_pcs_quirk }, /* Panther Point AHCI */
- { PCI_VDEVICE(INTEL, 0x1e03), board_ahci_pcs_quirk }, /* Panther M AHCI */
- { PCI_VDEVICE(INTEL, 0x1e04), board_ahci_pcs_quirk }, /* Panther Point RAID */
- { PCI_VDEVICE(INTEL, 0x1e05), board_ahci_pcs_quirk }, /* Panther Point RAID */
- { PCI_VDEVICE(INTEL, 0x1e06), board_ahci_pcs_quirk }, /* Panther Point RAID */
- { PCI_VDEVICE(INTEL, 0x1e07), board_ahci_pcs_quirk }, /* Panther M RAID */
- { PCI_VDEVICE(INTEL, 0x1e0e), board_ahci_pcs_quirk }, /* Panther Point RAID */
- { PCI_VDEVICE(INTEL, 0x8c02), board_ahci_pcs_quirk }, /* Lynx Point AHCI */
- { PCI_VDEVICE(INTEL, 0x8c03), board_ahci_pcs_quirk }, /* Lynx M AHCI */
- { PCI_VDEVICE(INTEL, 0x8c04), board_ahci_pcs_quirk }, /* Lynx Point RAID */
- { PCI_VDEVICE(INTEL, 0x8c05), board_ahci_pcs_quirk }, /* Lynx M RAID */
- { PCI_VDEVICE(INTEL, 0x8c06), board_ahci_pcs_quirk }, /* Lynx Point RAID */
- { PCI_VDEVICE(INTEL, 0x8c07), board_ahci_pcs_quirk }, /* Lynx M RAID */
- { PCI_VDEVICE(INTEL, 0x8c0e), board_ahci_pcs_quirk }, /* Lynx Point RAID */
- { PCI_VDEVICE(INTEL, 0x8c0f), board_ahci_pcs_quirk }, /* Lynx M RAID */
- { PCI_VDEVICE(INTEL, 0x9c02), board_ahci_pcs_quirk }, /* Lynx LP AHCI */
- { PCI_VDEVICE(INTEL, 0x9c03), board_ahci_pcs_quirk }, /* Lynx LP AHCI */
- { PCI_VDEVICE(INTEL, 0x9c04), board_ahci_pcs_quirk }, /* Lynx LP RAID */
- { PCI_VDEVICE(INTEL, 0x9c05), board_ahci_pcs_quirk }, /* Lynx LP RAID */
- { PCI_VDEVICE(INTEL, 0x9c06), board_ahci_pcs_quirk }, /* Lynx LP RAID */
- { PCI_VDEVICE(INTEL, 0x9c07), board_ahci_pcs_quirk }, /* Lynx LP RAID */
- { PCI_VDEVICE(INTEL, 0x9c0e), board_ahci_pcs_quirk }, /* Lynx LP RAID */
- { PCI_VDEVICE(INTEL, 0x9c0f), board_ahci_pcs_quirk }, /* Lynx LP RAID */
- { PCI_VDEVICE(INTEL, 0x9dd3), board_ahci_pcs_quirk }, /* Cannon Lake PCH-LP AHCI */
- { PCI_VDEVICE(INTEL, 0x1f22), board_ahci_pcs_quirk }, /* Avoton AHCI */
- { PCI_VDEVICE(INTEL, 0x1f23), board_ahci_pcs_quirk }, /* Avoton AHCI */
- { PCI_VDEVICE(INTEL, 0x1f24), board_ahci_pcs_quirk }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f25), board_ahci_pcs_quirk }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f26), board_ahci_pcs_quirk }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f27), board_ahci_pcs_quirk }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f2e), board_ahci_pcs_quirk }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f2f), board_ahci_pcs_quirk }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f32), board_ahci_avn }, /* Avoton AHCI */
- { PCI_VDEVICE(INTEL, 0x1f33), board_ahci_avn }, /* Avoton AHCI */
- { PCI_VDEVICE(INTEL, 0x1f34), board_ahci_avn }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f35), board_ahci_avn }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f36), board_ahci_avn }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f37), board_ahci_avn }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f3e), board_ahci_avn }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x1f3f), board_ahci_avn }, /* Avoton RAID */
- { PCI_VDEVICE(INTEL, 0x2823), board_ahci_pcs_quirk }, /* Wellsburg/Lewisburg AHCI*/
- { PCI_VDEVICE(INTEL, 0x2826), board_ahci_pcs_quirk }, /* *burg SATA0 'RAID' */
- { PCI_VDEVICE(INTEL, 0x2827), board_ahci_pcs_quirk }, /* *burg SATA1 'RAID' */
- { PCI_VDEVICE(INTEL, 0x282f), board_ahci_pcs_quirk }, /* *burg SATA2 'RAID' */
- { PCI_VDEVICE(INTEL, 0x43d4), board_ahci_pcs_quirk }, /* Rocket Lake PCH-H RAID */
- { PCI_VDEVICE(INTEL, 0x43d5), board_ahci_pcs_quirk }, /* Rocket Lake PCH-H RAID */
- { PCI_VDEVICE(INTEL, 0x43d6), board_ahci_pcs_quirk }, /* Rocket Lake PCH-H RAID */
- { PCI_VDEVICE(INTEL, 0x43d7), board_ahci_pcs_quirk }, /* Rocket Lake PCH-H RAID */
- { PCI_VDEVICE(INTEL, 0x8d02), board_ahci_pcs_quirk }, /* Wellsburg AHCI */
- { PCI_VDEVICE(INTEL, 0x8d04), board_ahci_pcs_quirk }, /* Wellsburg RAID */
- { PCI_VDEVICE(INTEL, 0x8d06), board_ahci_pcs_quirk }, /* Wellsburg RAID */
- { PCI_VDEVICE(INTEL, 0x8d0e), board_ahci_pcs_quirk }, /* Wellsburg RAID */
- { PCI_VDEVICE(INTEL, 0x8d62), board_ahci_pcs_quirk }, /* Wellsburg AHCI */
- { PCI_VDEVICE(INTEL, 0x8d64), board_ahci_pcs_quirk }, /* Wellsburg RAID */
- { PCI_VDEVICE(INTEL, 0x8d66), board_ahci_pcs_quirk }, /* Wellsburg RAID */
- { PCI_VDEVICE(INTEL, 0x8d6e), board_ahci_pcs_quirk }, /* Wellsburg RAID */
- { PCI_VDEVICE(INTEL, 0x23a3), board_ahci_pcs_quirk }, /* Coleto Creek AHCI */
- { PCI_VDEVICE(INTEL, 0x9c83), board_ahci_pcs_quirk }, /* Wildcat LP AHCI */
- { PCI_VDEVICE(INTEL, 0x9c85), board_ahci_pcs_quirk }, /* Wildcat LP RAID */
- { PCI_VDEVICE(INTEL, 0x9c87), board_ahci_pcs_quirk }, /* Wildcat LP RAID */
- { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci_pcs_quirk }, /* Wildcat LP RAID */
- { PCI_VDEVICE(INTEL, 0x8c82), board_ahci_pcs_quirk }, /* 9 Series AHCI */
- { PCI_VDEVICE(INTEL, 0x8c83), board_ahci_pcs_quirk }, /* 9 Series M AHCI */
- { PCI_VDEVICE(INTEL, 0x8c84), board_ahci_pcs_quirk }, /* 9 Series RAID */
- { PCI_VDEVICE(INTEL, 0x8c85), board_ahci_pcs_quirk }, /* 9 Series M RAID */
- { PCI_VDEVICE(INTEL, 0x8c86), board_ahci_pcs_quirk }, /* 9 Series RAID */
- { PCI_VDEVICE(INTEL, 0x8c87), board_ahci_pcs_quirk }, /* 9 Series M RAID */
- { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci_pcs_quirk }, /* 9 Series RAID */
- { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci_pcs_quirk }, /* 9 Series M RAID */
- { PCI_VDEVICE(INTEL, 0x9d03), board_ahci_pcs_quirk }, /* Sunrise LP AHCI */
- { PCI_VDEVICE(INTEL, 0x9d05), board_ahci_pcs_quirk }, /* Sunrise LP RAID */
- { PCI_VDEVICE(INTEL, 0x9d07), board_ahci_pcs_quirk }, /* Sunrise LP RAID */
- { PCI_VDEVICE(INTEL, 0xa102), board_ahci_pcs_quirk }, /* Sunrise Point-H AHCI */
- { PCI_VDEVICE(INTEL, 0xa103), board_ahci_pcs_quirk }, /* Sunrise M AHCI */
- { PCI_VDEVICE(INTEL, 0xa105), board_ahci_pcs_quirk }, /* Sunrise Point-H RAID */
- { PCI_VDEVICE(INTEL, 0xa106), board_ahci_pcs_quirk }, /* Sunrise Point-H RAID */
- { PCI_VDEVICE(INTEL, 0xa107), board_ahci_pcs_quirk }, /* Sunrise M RAID */
- { PCI_VDEVICE(INTEL, 0xa10f), board_ahci_pcs_quirk }, /* Sunrise Point-H RAID */
- { PCI_VDEVICE(INTEL, 0xa182), board_ahci_pcs_quirk }, /* Lewisburg AHCI*/
- { PCI_VDEVICE(INTEL, 0xa186), board_ahci_pcs_quirk }, /* Lewisburg RAID*/
- { PCI_VDEVICE(INTEL, 0xa1d2), board_ahci_pcs_quirk }, /* Lewisburg RAID*/
- { PCI_VDEVICE(INTEL, 0xa1d6), board_ahci_pcs_quirk }, /* Lewisburg RAID*/
- { PCI_VDEVICE(INTEL, 0xa202), board_ahci_pcs_quirk }, /* Lewisburg AHCI*/
- { PCI_VDEVICE(INTEL, 0xa206), board_ahci_pcs_quirk }, /* Lewisburg RAID*/
- { PCI_VDEVICE(INTEL, 0xa252), board_ahci_pcs_quirk }, /* Lewisburg RAID*/
- { PCI_VDEVICE(INTEL, 0xa256), board_ahci_pcs_quirk }, /* Lewisburg RAID*/
- { PCI_VDEVICE(INTEL, 0xa356), board_ahci_pcs_quirk }, /* Cannon Lake PCH-H RAID */
- { PCI_VDEVICE(INTEL, 0x06d7), board_ahci_pcs_quirk }, /* Comet Lake-H RAID */
- { PCI_VDEVICE(INTEL, 0xa386), board_ahci_pcs_quirk }, /* Comet Lake PCH-V RAID */
- { PCI_VDEVICE(INTEL, 0x0f22), board_ahci_pcs_quirk }, /* Bay Trail AHCI */
- { PCI_VDEVICE(INTEL, 0x0f23), board_ahci_pcs_quirk_no_devslp }, /* Bay Trail AHCI */
- { PCI_VDEVICE(INTEL, 0x22a3), board_ahci_pcs_quirk }, /* Cherry Tr. AHCI */
- { PCI_VDEVICE(INTEL, 0x5ae3), board_ahci_pcs_quirk }, /* ApolloLake AHCI */
- { PCI_VDEVICE(INTEL, 0x34d3), board_ahci_pcs_quirk }, /* Ice Lake LP AHCI */
- { PCI_VDEVICE(INTEL, 0x02d3), board_ahci_pcs_quirk }, /* Comet Lake PCH-U AHCI */
- { PCI_VDEVICE(INTEL, 0x02d7), board_ahci_pcs_quirk }, /* Comet Lake PCH RAID */
- /* Elkhart Lake IDs 0x4b60 & 0x4b62 https://sata-io.org/product/8803 not tested yet */
- { PCI_VDEVICE(INTEL, 0x4b63), board_ahci_pcs_quirk }, /* Elkhart Lake AHCI */
+ {
+ /* Comet Lake PCH-H RAID */
+ PCI_VDEVICE(INTEL, 0x06d6),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH6 */
+ PCI_VDEVICE(INTEL, 0x2652),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH6M */
+ PCI_VDEVICE(INTEL, 0x2653),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH7 */
+ PCI_VDEVICE(INTEL, 0x27c1),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH7M */
+ PCI_VDEVICE(INTEL, 0x27c5),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH7R */
+ PCI_VDEVICE(INTEL, 0x27c3),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ULi M5288 */
+ PCI_VDEVICE(AL, 0x5288),
+ .driver_data = board_ahci_ign_iferr,
+ }, {
+ /* ESB2 */
+ PCI_VDEVICE(INTEL, 0x2681),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ESB2 */
+ PCI_VDEVICE(INTEL, 0x2682),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ESB2 */
+ PCI_VDEVICE(INTEL, 0x2683),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH7-M DH */
+ PCI_VDEVICE(INTEL, 0x27c6),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH8 */
+ PCI_VDEVICE(INTEL, 0x2821),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH8/Lewisburg RAID*/
+ PCI_VDEVICE(INTEL, 0x2822),
+ .driver_data = board_ahci_pcs_quirk_no_sntf,
+ }, {
+ /* ICH8 */
+ PCI_VDEVICE(INTEL, 0x2824),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH8M */
+ PCI_VDEVICE(INTEL, 0x2829),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH8M */
+ PCI_VDEVICE(INTEL, 0x282a),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9 */
+ PCI_VDEVICE(INTEL, 0x2922),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9 */
+ PCI_VDEVICE(INTEL, 0x2923),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9 */
+ PCI_VDEVICE(INTEL, 0x2924),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9 */
+ PCI_VDEVICE(INTEL, 0x2925),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9 */
+ PCI_VDEVICE(INTEL, 0x2927),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9M */
+ PCI_VDEVICE(INTEL, 0x2929),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9M */
+ PCI_VDEVICE(INTEL, 0x292a),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9M */
+ PCI_VDEVICE(INTEL, 0x292b),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9M */
+ PCI_VDEVICE(INTEL, 0x292c),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9M */
+ PCI_VDEVICE(INTEL, 0x292f),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9 */
+ PCI_VDEVICE(INTEL, 0x294d),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH9M */
+ PCI_VDEVICE(INTEL, 0x294e),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Tolapai */
+ PCI_VDEVICE(INTEL, 0x502a),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Tolapai */
+ PCI_VDEVICE(INTEL, 0x502b),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH10 */
+ PCI_VDEVICE(INTEL, 0x3a05),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH10 */
+ PCI_VDEVICE(INTEL, 0x3a22),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ICH10 */
+ PCI_VDEVICE(INTEL, 0x3a25),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PCH AHCI */
+ PCI_VDEVICE(INTEL, 0x3b22),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PCH AHCI */
+ PCI_VDEVICE(INTEL, 0x3b23),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PCH RAID */
+ PCI_VDEVICE(INTEL, 0x3b24),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PCH RAID */
+ PCI_VDEVICE(INTEL, 0x3b25),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PCH M AHCI */
+ PCI_VDEVICE(INTEL, 0x3b29),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PCH RAID */
+ PCI_VDEVICE(INTEL, 0x3b2b),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PCH M RAID */
+ PCI_VDEVICE(INTEL, 0x3b2c),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PCH AHCI */
+ PCI_VDEVICE(INTEL, 0x3b2f),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19b0),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19b1),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19b2),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19b3),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19b4),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19b5),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19b6),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19b7),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19bE),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19bF),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19c0),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19c1),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19c2),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19c3),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19c4),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19c5),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19c6),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19c7),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19cE),
+ .driver_data = board_ahci,
+ }, {
+ /* DNV AHCI */
+ PCI_VDEVICE(INTEL, 0x19cF),
+ .driver_data = board_ahci,
+ }, {
+ /* CPT AHCI */
+ PCI_VDEVICE(INTEL, 0x1c02),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* CPT M AHCI */
+ PCI_VDEVICE(INTEL, 0x1c03),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* CPT RAID */
+ PCI_VDEVICE(INTEL, 0x1c04),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* CPT M RAID */
+ PCI_VDEVICE(INTEL, 0x1c05),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* CPT RAID */
+ PCI_VDEVICE(INTEL, 0x1c06),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* CPT RAID */
+ PCI_VDEVICE(INTEL, 0x1c07),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PBG AHCI */
+ PCI_VDEVICE(INTEL, 0x1d02),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PBG RAID */
+ PCI_VDEVICE(INTEL, 0x1d04),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* PBG RAID */
+ PCI_VDEVICE(INTEL, 0x1d06),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* DH89xxCC AHCI */
+ PCI_VDEVICE(INTEL, 0x2323),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Panther Point AHCI */
+ PCI_VDEVICE(INTEL, 0x1e02),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Panther M AHCI */
+ PCI_VDEVICE(INTEL, 0x1e03),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Panther Point RAID */
+ PCI_VDEVICE(INTEL, 0x1e04),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Panther Point RAID */
+ PCI_VDEVICE(INTEL, 0x1e05),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Panther Point RAID */
+ PCI_VDEVICE(INTEL, 0x1e06),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Panther M RAID */
+ PCI_VDEVICE(INTEL, 0x1e07),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Panther Point RAID */
+ PCI_VDEVICE(INTEL, 0x1e0e),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx Point AHCI */
+ PCI_VDEVICE(INTEL, 0x8c02),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx M AHCI */
+ PCI_VDEVICE(INTEL, 0x8c03),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx Point RAID */
+ PCI_VDEVICE(INTEL, 0x8c04),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx M RAID */
+ PCI_VDEVICE(INTEL, 0x8c05),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx Point RAID */
+ PCI_VDEVICE(INTEL, 0x8c06),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx M RAID */
+ PCI_VDEVICE(INTEL, 0x8c07),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx Point RAID */
+ PCI_VDEVICE(INTEL, 0x8c0e),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx M RAID */
+ PCI_VDEVICE(INTEL, 0x8c0f),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx LP AHCI */
+ PCI_VDEVICE(INTEL, 0x9c02),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx LP AHCI */
+ PCI_VDEVICE(INTEL, 0x9c03),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx LP RAID */
+ PCI_VDEVICE(INTEL, 0x9c04),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx LP RAID */
+ PCI_VDEVICE(INTEL, 0x9c05),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx LP RAID */
+ PCI_VDEVICE(INTEL, 0x9c06),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx LP RAID */
+ PCI_VDEVICE(INTEL, 0x9c07),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx LP RAID */
+ PCI_VDEVICE(INTEL, 0x9c0e),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lynx LP RAID */
+ PCI_VDEVICE(INTEL, 0x9c0f),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Cannon Lake PCH-LP AHCI */
+ PCI_VDEVICE(INTEL, 0x9dd3),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Avoton AHCI */
+ PCI_VDEVICE(INTEL, 0x1f22),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Avoton AHCI */
+ PCI_VDEVICE(INTEL, 0x1f23),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f24),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f25),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f26),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f27),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f2e),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f2f),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Avoton AHCI */
+ PCI_VDEVICE(INTEL, 0x1f32),
+ .driver_data = board_ahci_avn,
+ }, {
+ /* Avoton AHCI */
+ PCI_VDEVICE(INTEL, 0x1f33),
+ .driver_data = board_ahci_avn,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f34),
+ .driver_data = board_ahci_avn,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f35),
+ .driver_data = board_ahci_avn,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f36),
+ .driver_data = board_ahci_avn,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f37),
+ .driver_data = board_ahci_avn,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f3e),
+ .driver_data = board_ahci_avn,
+ }, {
+ /* Avoton RAID */
+ PCI_VDEVICE(INTEL, 0x1f3f),
+ .driver_data = board_ahci_avn,
+ }, {
+ /* Wellsburg/Lewisburg AHCI*/
+ PCI_VDEVICE(INTEL, 0x2823),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* *burg SATA0 'RAID' */
+ PCI_VDEVICE(INTEL, 0x2826),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* *burg SATA1 'RAID' */
+ PCI_VDEVICE(INTEL, 0x2827),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* *burg SATA2 'RAID' */
+ PCI_VDEVICE(INTEL, 0x282f),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Rocket Lake PCH-H RAID */
+ PCI_VDEVICE(INTEL, 0x43d4),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Rocket Lake PCH-H RAID */
+ PCI_VDEVICE(INTEL, 0x43d5),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Rocket Lake PCH-H RAID */
+ PCI_VDEVICE(INTEL, 0x43d6),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Rocket Lake PCH-H RAID */
+ PCI_VDEVICE(INTEL, 0x43d7),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wellsburg AHCI */
+ PCI_VDEVICE(INTEL, 0x8d02),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wellsburg RAID */
+ PCI_VDEVICE(INTEL, 0x8d04),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wellsburg RAID */
+ PCI_VDEVICE(INTEL, 0x8d06),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wellsburg RAID */
+ PCI_VDEVICE(INTEL, 0x8d0e),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wellsburg AHCI */
+ PCI_VDEVICE(INTEL, 0x8d62),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wellsburg RAID */
+ PCI_VDEVICE(INTEL, 0x8d64),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wellsburg RAID */
+ PCI_VDEVICE(INTEL, 0x8d66),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wellsburg RAID */
+ PCI_VDEVICE(INTEL, 0x8d6e),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Coleto Creek AHCI */
+ PCI_VDEVICE(INTEL, 0x23a3),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wildcat LP AHCI */
+ PCI_VDEVICE(INTEL, 0x9c83),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wildcat LP RAID */
+ PCI_VDEVICE(INTEL, 0x9c85),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wildcat LP RAID */
+ PCI_VDEVICE(INTEL, 0x9c87),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Wildcat LP RAID */
+ PCI_VDEVICE(INTEL, 0x9c8f),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* 9 Series AHCI */
+ PCI_VDEVICE(INTEL, 0x8c82),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* 9 Series M AHCI */
+ PCI_VDEVICE(INTEL, 0x8c83),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* 9 Series RAID */
+ PCI_VDEVICE(INTEL, 0x8c84),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* 9 Series M RAID */
+ PCI_VDEVICE(INTEL, 0x8c85),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* 9 Series RAID */
+ PCI_VDEVICE(INTEL, 0x8c86),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* 9 Series M RAID */
+ PCI_VDEVICE(INTEL, 0x8c87),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* 9 Series RAID */
+ PCI_VDEVICE(INTEL, 0x8c8e),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* 9 Series M RAID */
+ PCI_VDEVICE(INTEL, 0x8c8f),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Sunrise LP AHCI */
+ PCI_VDEVICE(INTEL, 0x9d03),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Sunrise LP RAID */
+ PCI_VDEVICE(INTEL, 0x9d05),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Sunrise LP RAID */
+ PCI_VDEVICE(INTEL, 0x9d07),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Sunrise Point-H AHCI */
+ PCI_VDEVICE(INTEL, 0xa102),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Sunrise M AHCI */
+ PCI_VDEVICE(INTEL, 0xa103),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Sunrise Point-H RAID */
+ PCI_VDEVICE(INTEL, 0xa105),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Sunrise Point-H RAID */
+ PCI_VDEVICE(INTEL, 0xa106),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Sunrise M RAID */
+ PCI_VDEVICE(INTEL, 0xa107),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Sunrise Point-H RAID */
+ PCI_VDEVICE(INTEL, 0xa10f),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lewisburg AHCI*/
+ PCI_VDEVICE(INTEL, 0xa182),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lewisburg RAID*/
+ PCI_VDEVICE(INTEL, 0xa186),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lewisburg RAID*/
+ PCI_VDEVICE(INTEL, 0xa1d2),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lewisburg RAID*/
+ PCI_VDEVICE(INTEL, 0xa1d6),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lewisburg AHCI*/
+ PCI_VDEVICE(INTEL, 0xa202),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lewisburg RAID*/
+ PCI_VDEVICE(INTEL, 0xa206),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lewisburg RAID*/
+ PCI_VDEVICE(INTEL, 0xa252),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Lewisburg RAID*/
+ PCI_VDEVICE(INTEL, 0xa256),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Cannon Lake PCH-H RAID */
+ PCI_VDEVICE(INTEL, 0xa356),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Comet Lake-H RAID */
+ PCI_VDEVICE(INTEL, 0x06d7),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Comet Lake PCH-V RAID */
+ PCI_VDEVICE(INTEL, 0xa386),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Bay Trail AHCI */
+ PCI_VDEVICE(INTEL, 0x0f22),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Bay Trail AHCI */
+ PCI_VDEVICE(INTEL, 0x0f23),
+ .driver_data = board_ahci_pcs_quirk_no_devslp,
+ }, {
+ /* Cherry Tr. AHCI */
+ PCI_VDEVICE(INTEL, 0x22a3),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* ApolloLake AHCI */
+ PCI_VDEVICE(INTEL, 0x5ae3),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Ice Lake LP AHCI */
+ PCI_VDEVICE(INTEL, 0x34d3),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Comet Lake PCH-U AHCI */
+ PCI_VDEVICE(INTEL, 0x02d3),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* Comet Lake PCH RAID */
+ PCI_VDEVICE(INTEL, 0x02d7),
+ .driver_data = board_ahci_pcs_quirk,
+ },
- /* JMicron JMB582/585: force 32-bit DMA (broken 64-bit implementation) */
- { PCI_VDEVICE(JMICRON, 0x0582), board_ahci_jmb585 },
- { PCI_VDEVICE(JMICRON, 0x0585), board_ahci_jmb585 },
+ /* Elkhart Lake IDs 0x4b60 & 0x4b62 https://sata-io.org/product/8803 not tested yet */
+ {
+ /* Elkhart Lake AHCI */
+ PCI_VDEVICE(INTEL, 0x4b63),
+ .driver_data = board_ahci_pcs_quirk,
+ }, {
+ /* JMicron JMB582/585: force 32-bit DMA (broken 64-bit implementation) */
+ PCI_VDEVICE(JMICRON, 0x0582),
+ .driver_data = board_ahci_jmb585,
+
+ }, {
+ PCI_VDEVICE(JMICRON, 0x0585),
+ .driver_data = board_ahci_jmb585,
+ }, {
+ /* JMicron 360/1/3/5/6, match class to avoid IDE function */
+ PCI_DEVICE(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID),
+ .class = PCI_CLASS_STORAGE_SATA_AHCI,
+ .class_mask = 0xffffff,
+ .driver_data = board_ahci_ign_iferr,
- /* JMicron 360/1/3/5/6, match class to avoid IDE function */
- { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
- PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr },
+ },
/* JMicron 362B and 362C have an AHCI function with IDE class code */
- { PCI_VDEVICE(JMICRON, 0x2362), board_ahci_ign_iferr },
- { PCI_VDEVICE(JMICRON, 0x236f), board_ahci_ign_iferr },
+ {
+ PCI_VDEVICE(JMICRON, 0x2362),
+ .driver_data = board_ahci_ign_iferr,
+
+ }, {
+ PCI_VDEVICE(JMICRON, 0x236f),
+ .driver_data = board_ahci_ign_iferr,
+
+ },
/* May need to update quirk_jmicron_async_suspend() for additions */
/* ATI */
- { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */
- { PCI_VDEVICE(ATI, 0x4390), board_ahci_sb700 }, /* ATI SB700/800 */
- { PCI_VDEVICE(ATI, 0x4391), board_ahci_sb700 }, /* ATI SB700/800 */
- { PCI_VDEVICE(ATI, 0x4392), board_ahci_sb700 }, /* ATI SB700/800 */
- { PCI_VDEVICE(ATI, 0x4393), board_ahci_sb700 }, /* ATI SB700/800 */
- { PCI_VDEVICE(ATI, 0x4394), board_ahci_sb700 }, /* ATI SB700/800 */
- { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb700 }, /* ATI SB700/800 */
+ {
+ /* ATI SB600 */
+ PCI_VDEVICE(ATI, 0x4380),
+ .driver_data = board_ahci_sb600,
+ }, {
+ /* ATI SB700/800 */
+ PCI_VDEVICE(ATI, 0x4390),
+ .driver_data = board_ahci_sb700,
+ }, {
+ /* ATI SB700/800 */
+ PCI_VDEVICE(ATI, 0x4391),
+ .driver_data = board_ahci_sb700,
+ }, {
+ /* ATI SB700/800 */
+ PCI_VDEVICE(ATI, 0x4392),
+ .driver_data = board_ahci_sb700,
+ }, {
+ /* ATI SB700/800 */
+ PCI_VDEVICE(ATI, 0x4393),
+ .driver_data = board_ahci_sb700,
+ }, {
+ /* ATI SB700/800 */
+ PCI_VDEVICE(ATI, 0x4394),
+ .driver_data = board_ahci_sb700,
+ }, {
+ /* ATI SB700/800 */
+ PCI_VDEVICE(ATI, 0x4395),
+ .driver_data = board_ahci_sb700,
+ },
/* Amazon's Annapurna Labs support */
- { PCI_DEVICE(PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS, 0x0031),
- .class = PCI_CLASS_STORAGE_SATA_AHCI,
- .class_mask = 0xffffff,
- board_ahci_al },
+ {
+ PCI_DEVICE(PCI_VENDOR_ID_AMAZON_ANNAPURNA_LABS, 0x0031),
+ .class = PCI_CLASS_STORAGE_SATA_AHCI,
+ .class_mask = 0xffffff,
+ .driver_data = board_ahci_al,
+
+ },
/* AMD */
- { PCI_VDEVICE(AMD, 0x7800), board_ahci }, /* AMD Hudson-2 */
- { PCI_VDEVICE(AMD, 0x7801), board_ahci_no_debounce_delay }, /* AMD Hudson-2 (AHCI mode) */
- { PCI_VDEVICE(AMD, 0x7900), board_ahci }, /* AMD CZ */
- { PCI_VDEVICE(AMD, 0x7901), board_ahci }, /* AMD Green Sardine */
+ {
+ /* AMD Hudson-2 */
+ PCI_VDEVICE(AMD, 0x7800),
+ .driver_data = board_ahci,
+ }, {
+ /* AMD Hudson-2 (AHCI mode) */
+ PCI_VDEVICE(AMD, 0x7801),
+ .driver_data = board_ahci_no_debounce_delay,
+ }, {
+ /* AMD CZ */
+ PCI_VDEVICE(AMD, 0x7900),
+ .driver_data = board_ahci,
+ }, {
+ /* AMD Green Sardine */
+ PCI_VDEVICE(AMD, 0x7901),
+ .driver_data = board_ahci,
+ },
/* AMD is using RAID class only for ahci controllers */
- { PCI_VENDOR_ID_AMD, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
- PCI_CLASS_STORAGE_RAID << 8, 0xffffff, board_ahci },
+ {
+ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
+ .class = PCI_CLASS_STORAGE_RAID << 8,
+ .class_mask = 0xffffff,
+ .driver_data = board_ahci,
+ },
/* Dell S140/S150 */
- { PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_SUBVENDOR_ID_DELL, PCI_ANY_ID,
- PCI_CLASS_STORAGE_RAID << 8, 0xffffff, board_ahci_pcs_quirk },
+ {
+ PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
+ PCI_SUBVENDOR_ID_DELL, PCI_ANY_ID),
+ .class = PCI_CLASS_STORAGE_RAID << 8,
+ .class_mask = 0xffffff,
+ .driver_data = board_ahci_pcs_quirk,
+
+ },
/* VIA */
- { PCI_VDEVICE(VIA, 0x3349), board_ahci_vt8251 }, /* VIA VT8251 */
- { PCI_VDEVICE(VIA, 0x6287), board_ahci_vt8251 }, /* VIA VT8251 */
+ {
+ /* VIA VT8251 */
+ PCI_VDEVICE(VIA, 0x3349),
+ .driver_data = board_ahci_vt8251,
+ }, {
+ /* VIA VT8251 */
+ PCI_VDEVICE(VIA, 0x6287),
+ .driver_data = board_ahci_vt8251,
+ },
/* NVIDIA */
- { PCI_VDEVICE(NVIDIA, 0x044c), board_ahci_mcp65 }, /* MCP65 */
- { PCI_VDEVICE(NVIDIA, 0x044d), board_ahci_mcp65 }, /* MCP65 */
- { PCI_VDEVICE(NVIDIA, 0x044e), board_ahci_mcp65 }, /* MCP65 */
- { PCI_VDEVICE(NVIDIA, 0x044f), board_ahci_mcp65 }, /* MCP65 */
- { PCI_VDEVICE(NVIDIA, 0x045c), board_ahci_mcp65 }, /* MCP65 */
- { PCI_VDEVICE(NVIDIA, 0x045d), board_ahci_mcp65 }, /* MCP65 */
- { PCI_VDEVICE(NVIDIA, 0x045e), board_ahci_mcp65 }, /* MCP65 */
- { PCI_VDEVICE(NVIDIA, 0x045f), board_ahci_mcp65 }, /* MCP65 */
- { PCI_VDEVICE(NVIDIA, 0x0550), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x0551), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x0552), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x0553), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x0554), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x0555), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x0556), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x0557), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x0558), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x0559), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x055a), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x055b), board_ahci_mcp67 }, /* MCP67 */
- { PCI_VDEVICE(NVIDIA, 0x0580), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x0581), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x0582), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x0583), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x0584), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x0585), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x0586), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x0587), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x0588), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x0589), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x058a), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x058b), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x058c), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x058d), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x058e), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x058f), board_ahci_mcp_linux }, /* Linux ID */
- { PCI_VDEVICE(NVIDIA, 0x07f0), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07f1), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07f2), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07f3), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07f4), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07f5), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07f6), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07f7), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07f8), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07f9), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07fa), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x07fb), board_ahci_mcp73 }, /* MCP73 */
- { PCI_VDEVICE(NVIDIA, 0x0ad0), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ad1), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ad2), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ad3), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ad4), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ad5), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ad6), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ad7), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ad8), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ad9), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ada), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0adb), board_ahci_mcp77 }, /* MCP77 */
- { PCI_VDEVICE(NVIDIA, 0x0ab4), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0ab5), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0ab6), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0ab7), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0ab8), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0ab9), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0aba), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0abb), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0abc), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0abd), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0abe), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0abf), board_ahci_mcp79 }, /* MCP79 */
- { PCI_VDEVICE(NVIDIA, 0x0d84), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d85), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d86), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d87), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d88), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d89), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d8a), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d8b), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d8c), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d8d), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d8e), board_ahci_mcp89 }, /* MCP89 */
- { PCI_VDEVICE(NVIDIA, 0x0d8f), board_ahci_mcp89 }, /* MCP89 */
+ {
+ /* MCP65 */
+ PCI_VDEVICE(NVIDIA, 0x044c),
+ .driver_data = board_ahci_mcp65,
+ }, {
+ /* MCP65 */
+ PCI_VDEVICE(NVIDIA, 0x044d),
+ .driver_data = board_ahci_mcp65,
+ }, {
+ /* MCP65 */
+ PCI_VDEVICE(NVIDIA, 0x044e),
+ .driver_data = board_ahci_mcp65,
+ }, {
+ /* MCP65 */
+ PCI_VDEVICE(NVIDIA, 0x044f),
+ .driver_data = board_ahci_mcp65,
+ }, {
+ /* MCP65 */
+ PCI_VDEVICE(NVIDIA, 0x045c),
+ .driver_data = board_ahci_mcp65,
+ }, {
+ /* MCP65 */
+ PCI_VDEVICE(NVIDIA, 0x045d),
+ .driver_data = board_ahci_mcp65,
+ }, {
+ /* MCP65 */
+ PCI_VDEVICE(NVIDIA, 0x045e),
+ .driver_data = board_ahci_mcp65,
+ }, {
+ /* MCP65 */
+ PCI_VDEVICE(NVIDIA, 0x045f),
+ .driver_data = board_ahci_mcp65,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x0550),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x0551),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x0552),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x0553),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x0554),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x0555),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x0556),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x0557),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x0558),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x0559),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x055a),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* MCP67 */
+ PCI_VDEVICE(NVIDIA, 0x055b),
+ .driver_data = board_ahci_mcp67,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x0580),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x0581),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x0582),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x0583),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x0584),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x0585),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x0586),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x0587),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x0588),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x0589),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x058a),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x058b),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x058c),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x058d),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x058e),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* Linux ID */
+ PCI_VDEVICE(NVIDIA, 0x058f),
+ .driver_data = board_ahci_mcp_linux,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07f0),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07f1),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07f2),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07f3),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07f4),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07f5),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07f6),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07f7),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07f8),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07f9),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07fa),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP73 */
+ PCI_VDEVICE(NVIDIA, 0x07fb),
+ .driver_data = board_ahci_mcp73,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ad0),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ad1),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ad2),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ad3),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ad4),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ad5),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ad6),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ad7),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ad8),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ad9),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0ada),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP77 */
+ PCI_VDEVICE(NVIDIA, 0x0adb),
+ .driver_data = board_ahci_mcp77,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0ab4),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0ab5),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0ab6),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0ab7),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0ab8),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0ab9),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0aba),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0abb),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0abc),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0abd),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0abe),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP79 */
+ PCI_VDEVICE(NVIDIA, 0x0abf),
+ .driver_data = board_ahci_mcp79,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d84),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d85),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d86),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d87),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d88),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d89),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d8a),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d8b),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d8c),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d8d),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d8e),
+ .driver_data = board_ahci_mcp89,
+ }, {
+ /* MCP89 */
+ PCI_VDEVICE(NVIDIA, 0x0d8f),
+ .driver_data = board_ahci_mcp89,
+ },
/* SiS */
- { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */
- { PCI_VDEVICE(SI, 0x1185), board_ahci }, /* SiS 968 */
- { PCI_VDEVICE(SI, 0x0186), board_ahci }, /* SiS 968 */
+ {
+ /* SiS 966 */
+ PCI_VDEVICE(SI, 0x1184),
+ .driver_data = board_ahci,
+ }, {
+ /* SiS 968 */
+ PCI_VDEVICE(SI, 0x1185),
+ .driver_data = board_ahci,
+ }, {
+ /* SiS 968 */
+ PCI_VDEVICE(SI, 0x0186),
+ .driver_data = board_ahci,
+ },
/* ST Microelectronics */
- { PCI_VDEVICE(STMICRO, 0xCC06), board_ahci }, /* ST ConneXt */
+ {
+ /* ST ConneXt */
+ PCI_VDEVICE(STMICRO, 0xCC06),
+ .driver_data = board_ahci,
+ },
/* Marvell */
- { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
- { PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9123),
- .class = PCI_CLASS_STORAGE_SATA_AHCI,
- .class_mask = 0xffffff,
- .driver_data = board_ahci_yes_fbs }, /* 88se9128 */
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9125),
- .driver_data = board_ahci_yes_fbs }, /* 88se9125 */
- { PCI_DEVICE_SUB(PCI_VENDOR_ID_MARVELL_EXT, 0x9178,
- PCI_VENDOR_ID_MARVELL_EXT, 0x9170),
- .driver_data = board_ahci_yes_fbs }, /* 88se9170 */
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a),
- .driver_data = board_ahci_yes_fbs }, /* 88se9172 */
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172),
- .driver_data = board_ahci_yes_fbs }, /* 88se9182 */
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9182),
- .driver_data = board_ahci_yes_fbs }, /* 88se9172 */
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192),
- .driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a0),
- .driver_data = board_ahci_yes_fbs },
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a2), /* 88se91a2 */
- .driver_data = board_ahci_yes_fbs },
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3),
- .driver_data = board_ahci_yes_fbs },
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9215),
- .driver_data = board_ahci_yes_fbs_atapi_dma },
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230),
- .driver_data = board_ahci_yes_fbs },
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9235),
- .driver_data = board_ahci_no_debounce_delay },
- { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642), /* highpoint rocketraid 642L */
- .driver_data = board_ahci_yes_fbs },
- { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0645), /* highpoint rocketraid 644L */
- .driver_data = board_ahci_yes_fbs },
+ {
+ /* 6145 */
+ PCI_VDEVICE(MARVELL, 0x6145),
+ .driver_data = board_ahci_mv,
+ }, {
+ /* 6121 */
+ PCI_VDEVICE(MARVELL, 0x6121),
+ .driver_data = board_ahci_mv,
+ }, {
+ /* 88se9128 */
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9123),
+ .class = PCI_CLASS_STORAGE_SATA_AHCI,
+ .class_mask = 0xffffff,
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ /* 88se9125 */
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9125),
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ /* 88se9170 */
+ PCI_DEVICE_SUB(PCI_VENDOR_ID_MARVELL_EXT, 0x9178,
+ PCI_VENDOR_ID_MARVELL_EXT, 0x9170),
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ /* 88se9172 */
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a),
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ /* 88se9182 */
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172),
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ /* 88se9172 */
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9182),
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ /* 88se9172 on some Gigabyte */
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192),
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a0),
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a2), /* 88se91a2 */
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3),
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9215),
+ .driver_data = board_ahci_yes_fbs_atapi_dma,
+ }, {
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230),
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9235),
+ .driver_data = board_ahci_no_debounce_delay,
+ },
+
+ /* TTI */
+ {
+ /* highpoint rocketraid 642L */
+ PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642),
+ .driver_data = board_ahci_yes_fbs,
+ }, {
+ /* highpoint rocketraid 644L */
+ PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0645),
+ .driver_data = board_ahci_yes_fbs,
+ },
/* Promise */
- { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
- { PCI_VDEVICE(PROMISE, 0x3781), board_ahci }, /* FastTrak TX8660 ahci-mode */
+ {
+ /* PDC42819 */
+ PCI_VDEVICE(PROMISE, 0x3f20),
+ .driver_data = board_ahci,
+ }, {
+ /* FastTrak TX8660 ahci-mode */
+ PCI_VDEVICE(PROMISE, 0x3781),
+ .driver_data = board_ahci,
+ },
/* ASMedia */
- { PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci_43bit_dma }, /* ASM1060 */
- { PCI_VDEVICE(ASMEDIA, 0x0602), board_ahci_43bit_dma }, /* ASM1060 */
- { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci_43bit_dma }, /* ASM1061 */
- { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci_43bit_dma }, /* ASM1061/1062 */
- { PCI_VDEVICE(ASMEDIA, 0x0621), board_ahci_43bit_dma }, /* ASM1061R */
- { PCI_VDEVICE(ASMEDIA, 0x0622), board_ahci_43bit_dma }, /* ASM1062R */
- { PCI_VDEVICE(ASMEDIA, 0x0624), board_ahci_43bit_dma }, /* ASM1062+JMB575 */
- { PCI_VDEVICE(ASMEDIA, 0x1062), board_ahci }, /* ASM1062A */
- { PCI_VDEVICE(ASMEDIA, 0x1064), board_ahci }, /* ASM1064 */
- { PCI_VDEVICE(ASMEDIA, 0x1164), board_ahci }, /* ASM1164 */
- { PCI_VDEVICE(ASMEDIA, 0x1165), board_ahci }, /* ASM1165 */
- { PCI_VDEVICE(ASMEDIA, 0x1166), board_ahci }, /* ASM1166 */
-
- /*
- * Samsung SSDs found on some macbooks. NCQ times out if MSI is
- * enabled. https://bugzilla.kernel.org/show_bug.cgi?id=60731
- */
- { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_no_msi },
- { PCI_VDEVICE(SAMSUNG, 0xa800), board_ahci_no_msi },
-
- /* Enmotus */
- { PCI_DEVICE(0x1c44, 0x8000), board_ahci },
-
- /* Loongson */
- { PCI_VDEVICE(LOONGSON, 0x7a08), board_ahci },
-
- /* Generic, PCI class code for AHCI */
- { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
- PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
+ {
+ /* ASM1060 */
+ PCI_VDEVICE(ASMEDIA, 0x0601),
+ .driver_data = board_ahci_43bit_dma,
+ }, {
+ /* ASM1060 */
+ PCI_VDEVICE(ASMEDIA, 0x0602),
+ .driver_data = board_ahci_43bit_dma,
+ }, {
+ /* ASM1061 */
+ PCI_VDEVICE(ASMEDIA, 0x0611),
+ .driver_data = board_ahci_43bit_dma,
+ }, {
+ /* ASM1061/1062 */
+ PCI_VDEVICE(ASMEDIA, 0x0612),
+ .driver_data = board_ahci_43bit_dma,
+ }, {
+ /* ASM1061R */
+ PCI_VDEVICE(ASMEDIA, 0x0621),
+ .driver_data = board_ahci_43bit_dma,
+ }, {
+ /* ASM1062R */
+ PCI_VDEVICE(ASMEDIA, 0x0622),
+ .driver_data = board_ahci_43bit_dma,
+ }, {
+ /* ASM1062+JMB575 */
+ PCI_VDEVICE(ASMEDIA, 0x0624),
+ .driver_data = board_ahci_43bit_dma,
+ }, {
+ /* ASM1062A */
+ PCI_VDEVICE(ASMEDIA, 0x1062),
+ .driver_data = board_ahci,
+ }, {
+ /* ASM1064 */
+ PCI_VDEVICE(ASMEDIA, 0x1064),
+ .driver_data = board_ahci,
+ }, {
+ /* ASM1164 */
+ PCI_VDEVICE(ASMEDIA, 0x1164),
+ .driver_data = board_ahci,
+ }, {
+ /* ASM1165 */
+ PCI_VDEVICE(ASMEDIA, 0x1165),
+ .driver_data = board_ahci,
+ }, {
+ /* ASM1166 */
+ PCI_VDEVICE(ASMEDIA, 0x1166),
+ .driver_data = board_ahci,
+ }, {
+ /*
+ * Samsung SSDs found on some macbooks. NCQ times out if MSI is
+ * enabled. https://bugzilla.kernel.org/show_bug.cgi?id=60731
+ */
+ PCI_VDEVICE(SAMSUNG, 0x1600),
+ .driver_data = board_ahci_no_msi,
+
+ }, {
+ PCI_VDEVICE(SAMSUNG, 0xa800),
+ .driver_data = board_ahci_no_msi,
+ }, {
+ /* Enmotus */
+ PCI_DEVICE(0x1c44, 0x8000),
+ .driver_data = board_ahci,
+ }, {
+ /* Loongson */
+ PCI_VDEVICE(LOONGSON, 0x7a08),
+ .driver_data = board_ahci,
+
+ }, {
+ /* Generic, PCI class code for AHCI */
+ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff),
+ .driver_data = board_ahci,
+ },
{ } /* terminate list */
};
@@ -1888,6 +2816,24 @@ static ssize_t remapped_nvme_show(struct device *dev,
static DEVICE_ATTR_RO(remapped_nvme);
+static int ahci_validate_bar_size(struct pci_dev *pdev, int bar,
+ struct ahci_host_priv *hpriv)
+{
+ u32 cap = readl(hpriv->mmio + HOST_CAP);
+ unsigned int max_ports = ahci_nr_ports(cap);
+ u32 last_port_end = 0x100 + (max_ports * 0x80);
+ resource_size_t bar_size = pci_resource_len(pdev, bar);
+
+ if (last_port_end > bar_size) {
+ dev_warn(&pdev->dev,
+ "BAR%d too small for %u ports (last port ends at %#x, BAR %pa)\n",
+ bar, max_ports, last_port_end, &bar_size);
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
{
unsigned int board_id = ent->driver_data;
@@ -1988,6 +2934,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (!hpriv->mmio)
return -ENOMEM;
+ rc = ahci_validate_bar_size(pdev, ahci_pci_bar, hpriv);
+ if (rc)
+ return rc;
+
/* detect remapped nvme devices */
ahci_remap_check(pdev, ahci_pci_bar, hpriv);
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
index 9e8b6319025c..b57cca352faa 100644
--- a/drivers/ata/ahci.h
+++ b/drivers/ata/ahci.h
@@ -448,7 +448,8 @@ void ahci_set_em_messages(struct ahci_host_priv *hpriv,
int ahci_reset_em(struct ata_host *host);
void ahci_print_info(struct ata_host *host, const char *scc_s);
int ahci_host_activate(struct ata_host *host, const struct scsi_host_template *sht);
-void ahci_error_handler(struct ata_port *ap);
+void ahci_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex);
u32 ahci_handle_port_intr(struct ata_host *host, u32 irq_masked);
static inline void __iomem *__ahci_port_base(struct ahci_host_priv *hpriv,
diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
index 3d26595524d3..6aaa18e29abc 100644
--- a/drivers/ata/ahci_imx.c
+++ b/drivers/ata/ahci_imx.c
@@ -598,6 +598,7 @@ static void imx_sata_disable(struct ahci_host_priv *hpriv)
}
static void ahci_imx_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
u32 reg_val;
struct ata_device *dev;
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
index 495fa096dd65..e3aa5c86fb48 100644
--- a/drivers/ata/ata_piix.c
+++ b/drivers/ata/ata_piix.c
@@ -154,184 +154,364 @@ static unsigned int in_module_init = 1;
static const struct pci_device_id piix_pci_tbl[] = {
/* Intel PIIX3 for the 430HX etc */
- { 0x8086, 0x7010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_mwdma },
- /* VMware ICH4 */
- { 0x8086, 0x7111, 0x15ad, 0x1976, 0, 0, piix_pata_vmw },
- /* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */
- /* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */
- { 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
- /* Intel PIIX4 */
- { 0x8086, 0x7199, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
- /* Intel PIIX4 */
- { 0x8086, 0x7601, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
- /* Intel PIIX */
- { 0x8086, 0x84CA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
- /* Intel ICH (i810, i815, i840) UDMA 66*/
- { 0x8086, 0x2411, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_66 },
- /* Intel ICH0 : UDMA 33*/
- { 0x8086, 0x2421, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_33 },
- /* Intel ICH2M */
- { 0x8086, 0x244A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- /* Intel ICH2 (i810E2, i845, 850, 860) UDMA 100 */
- { 0x8086, 0x244B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- /* Intel ICH3M */
- { 0x8086, 0x248A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- /* Intel ICH3 (E7500/1) UDMA 100 */
- { 0x8086, 0x248B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- /* Intel ICH4-L */
- { 0x8086, 0x24C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- /* Intel ICH4 (i845GV, i845E, i852, i855) UDMA 100 */
- { 0x8086, 0x24CA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- { 0x8086, 0x24CB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- /* Intel ICH5 */
- { 0x8086, 0x24DB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- /* C-ICH (i810E2) */
- { 0x8086, 0x245B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- /* ESB (855GME/875P + 6300ESB) UDMA 100 */
- { 0x8086, 0x25A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- /* ICH6 (and 6) (i915) UDMA 100 */
- { 0x8086, 0x266F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
- /* ICH7/7-R (i945, i975) UDMA 100*/
- { 0x8086, 0x27DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100_nomwdma1 },
- { 0x8086, 0x269E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100_nomwdma1 },
- /* ICH8 Mobile PATA Controller */
- { 0x8086, 0x2850, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
+ {
+ PCI_DEVICE(0x8086, 0x7010),
+ .driver_data = piix_pata_mwdma,
+ }, {
+ /* VMware ICH4 */
+ PCI_DEVICE_SUB(0x8086, 0x7111, 0x15ad, 0x1976),
+ .driver_data = piix_pata_vmw,
+ }, {
+ /* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */
+ /* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */
+ PCI_DEVICE(0x8086, 0x7111),
+ .driver_data = piix_pata_33,
+ }, {
+ /* Intel PIIX4 */
+ PCI_DEVICE(0x8086, 0x7199),
+ .driver_data = piix_pata_33,
+ }, {
+ /* Intel PIIX4 */
+ PCI_DEVICE(0x8086, 0x7601),
+ .driver_data = piix_pata_33,
+ }, {
+ /* Intel PIIX */
+ PCI_DEVICE(0x8086, 0x84CA),
+ .driver_data = piix_pata_33,
+ }, {
+ /* Intel ICH (i810, i815, i840) UDMA 66*/
+ PCI_DEVICE(0x8086, 0x2411),
+ .driver_data = ich_pata_66,
+ }, {
+ /* Intel ICH0 : UDMA 33*/
+ PCI_DEVICE(0x8086, 0x2421),
+ .driver_data = ich_pata_33,
+ }, {
+ /* Intel ICH2M */
+ PCI_DEVICE(0x8086, 0x244A),
+ .driver_data = ich_pata_100,
+ }, {
+ /* Intel ICH2 (i810E2, i845, 850, 860) UDMA 100 */
+ PCI_DEVICE(0x8086, 0x244B),
+ .driver_data = ich_pata_100,
+ }, {
+ /* Intel ICH3M */
+ PCI_DEVICE(0x8086, 0x248A),
+ .driver_data = ich_pata_100,
+ }, {
+ /* Intel ICH3 (E7500/1) UDMA 100 */
+ PCI_DEVICE(0x8086, 0x248B),
+ .driver_data = ich_pata_100,
+ }, {
+ /* Intel ICH4-L */
+ PCI_DEVICE(0x8086, 0x24C1),
+ .driver_data = ich_pata_100,
+ }, {
+ /* Intel ICH4 (i845GV, i845E, i852, i855) UDMA 100 */
+ PCI_DEVICE(0x8086, 0x24CA),
+ .driver_data = ich_pata_100,
+ }, {
+ PCI_DEVICE(0x8086, 0x24CB),
+ .driver_data = ich_pata_100,
+ }, {
+ /* Intel ICH5 */
+ PCI_DEVICE(0x8086, 0x24DB),
+ .driver_data = ich_pata_100,
+ }, {
+ /* C-ICH (i810E2) */
+ PCI_DEVICE(0x8086, 0x245B),
+ .driver_data = ich_pata_100,
+ }, {
+ /* ESB (855GME/875P + 6300ESB) UDMA 100 */
+ PCI_DEVICE(0x8086, 0x25A2),
+ .driver_data = ich_pata_100,
+ }, {
+ /* ICH6 (and 6) (i915) UDMA 100 */
+ PCI_DEVICE(0x8086, 0x266F),
+ .driver_data = ich_pata_100,
+ }, {
+ /* ICH7/7-R (i945, i975) UDMA 100*/
+ PCI_DEVICE(0x8086, 0x27DF),
+ .driver_data = ich_pata_100_nomwdma1,
+ }, {
+ PCI_DEVICE(0x8086, 0x269E),
+ .driver_data = ich_pata_100_nomwdma1,
+ }, {
+ /* ICH8 Mobile PATA Controller */
+ PCI_DEVICE(0x8086, 0x2850),
+ .driver_data = ich_pata_100,
+ },
/* SATA ports */
-
- /* 82801EB (ICH5) */
- { 0x8086, 0x24d1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
- /* 82801EB (ICH5) */
- { 0x8086, 0x24df, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
- /* 6300ESB (ICH5 variant with broken PCS present bits) */
- { 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
- /* 6300ESB pretending RAID */
- { 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
- /* 82801FB/FW (ICH6/ICH6W) */
- { 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
- /* 82801FR/FRW (ICH6R/ICH6RW) */
- { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
- /* 82801FBM ICH6M (ICH6R with only port 0 and 2 implemented).
- * Attach iff the controller is in IDE mode. */
- { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID,
- PCI_CLASS_STORAGE_IDE << 8, 0xffff00, ich6m_sata },
- /* 82801GB/GR/GH (ICH7, identical to ICH6) */
- { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
- /* 82801GBM/GHM (ICH7M, identical to ICH6M) */
- { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata },
- /* Enterprise Southbridge 2 (631xESB/632xESB) */
- { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
- /* SATA Controller 1 IDE (ICH8) */
- { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
- /* SATA Controller 2 IDE (ICH8) */
- { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* Mobile SATA Controller IDE (ICH8M), Apple */
- { 0x8086, 0x2828, 0x106b, 0x00a0, 0, 0, ich8m_apple_sata },
- { 0x8086, 0x2828, 0x106b, 0x00a1, 0, 0, ich8m_apple_sata },
- { 0x8086, 0x2828, 0x106b, 0x00a3, 0, 0, ich8m_apple_sata },
- /* Mobile SATA Controller IDE (ICH8M) */
- { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
- /* SATA Controller IDE (ICH9) */
- { 0x8086, 0x2920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
- /* SATA Controller IDE (ICH9) */
- { 0x8086, 0x2921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (ICH9) */
- { 0x8086, 0x2926, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (ICH9M) */
- { 0x8086, 0x2928, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (ICH9M) */
- { 0x8086, 0x292d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (ICH9M) */
- { 0x8086, 0x292e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
- /* SATA Controller IDE (Tolapai) */
- { 0x8086, 0x5028, PCI_ANY_ID, PCI_ANY_ID, 0, 0, tolapai_sata },
- /* SATA Controller IDE (ICH10) */
- { 0x8086, 0x3a00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
- /* SATA Controller IDE (ICH10) */
- { 0x8086, 0x3a06, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (ICH10) */
- { 0x8086, 0x3a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
- /* SATA Controller IDE (ICH10) */
- { 0x8086, 0x3a26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (PCH) */
- { 0x8086, 0x3b20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
- /* SATA Controller IDE (PCH) */
- { 0x8086, 0x3b21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (PCH) */
- { 0x8086, 0x3b26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (PCH) */
- { 0x8086, 0x3b28, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
- /* SATA Controller IDE (PCH) */
- { 0x8086, 0x3b2d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (PCH) */
- { 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
- /* SATA Controller IDE (CPT) */
- { 0x8086, 0x1c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (CPT) */
- { 0x8086, 0x1c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (CPT) */
- { 0x8086, 0x1c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (CPT) */
- { 0x8086, 0x1c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (PBG) */
- { 0x8086, 0x1d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (PBG) */
- { 0x8086, 0x1d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (Panther Point) */
- { 0x8086, 0x1e00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (Panther Point) */
- { 0x8086, 0x1e01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (Panther Point) */
- { 0x8086, 0x1e08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (Panther Point) */
- { 0x8086, 0x1e09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (Lynx Point) */
- { 0x8086, 0x8c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (Lynx Point) */
- { 0x8086, 0x8c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (Lynx Point) */
- { 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb },
- /* SATA Controller IDE (Lynx Point) */
- { 0x8086, 0x8c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (Lynx Point-LP) */
- { 0x8086, 0x9c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (Lynx Point-LP) */
- { 0x8086, 0x9c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (Lynx Point-LP) */
- { 0x8086, 0x9c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (Lynx Point-LP) */
- { 0x8086, 0x9c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (DH89xxCC) */
- { 0x8086, 0x2326, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (Avoton) */
- { 0x8086, 0x1f20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (Avoton) */
- { 0x8086, 0x1f21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (Avoton) */
- { 0x8086, 0x1f30, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (Avoton) */
- { 0x8086, 0x1f31, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (Wellsburg) */
- { 0x8086, 0x8d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (Wellsburg) */
- { 0x8086, 0x8d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb },
- /* SATA Controller IDE (Wellsburg) */
- { 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (Wellsburg) */
- { 0x8086, 0x8d68, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (BayTrail) */
- { 0x8086, 0x0F20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt },
- { 0x8086, 0x0F21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt },
- /* SATA Controller IDE (Coleto Creek) */
- { 0x8086, 0x23a6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
- /* SATA Controller IDE (9 Series) */
- { 0x8086, 0x8c88, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb },
- /* SATA Controller IDE (9 Series) */
- { 0x8086, 0x8c89, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb },
- /* SATA Controller IDE (9 Series) */
- { 0x8086, 0x8c80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
- /* SATA Controller IDE (9 Series) */
- { 0x8086, 0x8c81, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
+ {
+ /* 82801EB (ICH5) */
+ PCI_DEVICE(0x8086, 0x24d1),
+ .driver_data = ich5_sata,
+ }, {
+ /* 82801EB (ICH5) */
+ PCI_DEVICE(0x8086, 0x24df),
+ .driver_data = ich5_sata,
+ }, {
+ /* 6300ESB (ICH5 variant with broken PCS present bits) */
+ PCI_DEVICE(0x8086, 0x25a3),
+ .driver_data = ich5_sata,
+ }, {
+ /* 6300ESB pretending RAID */
+ PCI_DEVICE(0x8086, 0x25b0),
+ .driver_data = ich5_sata,
+ }, {
+ /* 82801FB/FW (ICH6/ICH6W) */
+ PCI_DEVICE(0x8086, 0x2651),
+ .driver_data = ich6_sata,
+ }, {
+ /* 82801FR/FRW (ICH6R/ICH6RW) */
+ PCI_DEVICE(0x8086, 0x2652),
+ .driver_data = ich6_sata,
+ }, {
+ /* 82801FBM ICH6M (ICH6R with only port 0 and 2 implemented).
+ * Attach iff the controller is in IDE mode. */
+ PCI_DEVICE(0x8086, 0x2653),
+ .class = PCI_CLASS_STORAGE_IDE << 8,
+ .class_mask = 0xffff00,
+ .driver_data = ich6m_sata,
+ }, {
+ /* 82801GB/GR/GH (ICH7, identical to ICH6) */
+ PCI_DEVICE(0x8086, 0x27c0),
+ .driver_data = ich6_sata,
+ }, {
+ /* 82801GBM/GHM (ICH7M, identical to ICH6M) */
+ PCI_DEVICE(0x8086, 0x27c4),
+ .driver_data = ich6m_sata,
+ }, {
+ /* Enterprise Southbridge 2 (631xESB/632xESB) */
+ PCI_DEVICE(0x8086, 0x2680),
+ .driver_data = ich6_sata,
+ }, {
+ /* SATA Controller 1 IDE (ICH8) */
+ PCI_DEVICE(0x8086, 0x2820),
+ .driver_data = ich8_sata,
+ }, {
+ /* SATA Controller 2 IDE (ICH8) */
+ PCI_DEVICE(0x8086, 0x2825),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* Mobile SATA Controller IDE (ICH8M), Apple */
+ PCI_DEVICE_SUB(0x8086, 0x2828, 0x106b, 0x00a0),
+ .driver_data = ich8m_apple_sata,
+ }, {
+ PCI_DEVICE_SUB(0x8086, 0x2828, 0x106b, 0x00a1),
+ .driver_data = ich8m_apple_sata,
+ }, {
+ PCI_DEVICE_SUB(0x8086, 0x2828, 0x106b, 0x00a3),
+ .driver_data = ich8m_apple_sata,
+ }, {
+ /* Mobile SATA Controller IDE (ICH8M) */
+ PCI_DEVICE(0x8086, 0x2828),
+ .driver_data = ich8_sata,
+ }, {
+ /* SATA Controller IDE (ICH9) */
+ PCI_DEVICE(0x8086, 0x2920),
+ .driver_data = ich8_sata,
+ }, {
+ /* SATA Controller IDE (ICH9) */
+ PCI_DEVICE(0x8086, 0x2921),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (ICH9) */
+ PCI_DEVICE(0x8086, 0x2926),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (ICH9M) */
+ PCI_DEVICE(0x8086, 0x2928),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (ICH9M) */
+ PCI_DEVICE(0x8086, 0x292d),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (ICH9M) */
+ PCI_DEVICE(0x8086, 0x292e),
+ .driver_data = ich8_sata,
+ }, {
+ /* SATA Controller IDE (Tolapai) */
+ PCI_DEVICE(0x8086, 0x5028),
+ .driver_data = tolapai_sata,
+ }, {
+ /* SATA Controller IDE (ICH10) */
+ PCI_DEVICE(0x8086, 0x3a00),
+ .driver_data = ich8_sata,
+ }, {
+ /* SATA Controller IDE (ICH10) */
+ PCI_DEVICE(0x8086, 0x3a06),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (ICH10) */
+ PCI_DEVICE(0x8086, 0x3a20),
+ .driver_data = ich8_sata,
+ }, {
+ /* SATA Controller IDE (ICH10) */
+ PCI_DEVICE(0x8086, 0x3a26),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (PCH) */
+ PCI_DEVICE(0x8086, 0x3b20),
+ .driver_data = ich8_sata,
+ }, {
+ /* SATA Controller IDE (PCH) */
+ PCI_DEVICE(0x8086, 0x3b21),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (PCH) */
+ PCI_DEVICE(0x8086, 0x3b26),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (PCH) */
+ PCI_DEVICE(0x8086, 0x3b28),
+ .driver_data = ich8_sata,
+ }, {
+ /* SATA Controller IDE (PCH) */
+ PCI_DEVICE(0x8086, 0x3b2d),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (PCH) */
+ PCI_DEVICE(0x8086, 0x3b2e),
+ .driver_data = ich8_sata,
+ }, {
+ /* SATA Controller IDE (CPT) */
+ PCI_DEVICE(0x8086, 0x1c00),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (CPT) */
+ PCI_DEVICE(0x8086, 0x1c01),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (CPT) */
+ PCI_DEVICE(0x8086, 0x1c08),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (CPT) */
+ PCI_DEVICE(0x8086, 0x1c09),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (PBG) */
+ PCI_DEVICE(0x8086, 0x1d00),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (PBG) */
+ PCI_DEVICE(0x8086, 0x1d08),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (Panther Point) */
+ PCI_DEVICE(0x8086, 0x1e00),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (Panther Point) */
+ PCI_DEVICE(0x8086, 0x1e01),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (Panther Point) */
+ PCI_DEVICE(0x8086, 0x1e08),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (Panther Point) */
+ PCI_DEVICE(0x8086, 0x1e09),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (Lynx Point) */
+ PCI_DEVICE(0x8086, 0x8c00),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (Lynx Point) */
+ PCI_DEVICE(0x8086, 0x8c01),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (Lynx Point) */
+ PCI_DEVICE(0x8086, 0x8c08),
+ .driver_data = ich8_2port_sata_snb,
+ }, {
+ /* SATA Controller IDE (Lynx Point) */
+ PCI_DEVICE(0x8086, 0x8c09),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (Lynx Point-LP) */
+ PCI_DEVICE(0x8086, 0x9c00),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (Lynx Point-LP) */
+ PCI_DEVICE(0x8086, 0x9c01),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (Lynx Point-LP) */
+ PCI_DEVICE(0x8086, 0x9c08),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (Lynx Point-LP) */
+ PCI_DEVICE(0x8086, 0x9c09),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (DH89xxCC) */
+ PCI_DEVICE(0x8086, 0x2326),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (Avoton) */
+ PCI_DEVICE(0x8086, 0x1f20),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (Avoton) */
+ PCI_DEVICE(0x8086, 0x1f21),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (Avoton) */
+ PCI_DEVICE(0x8086, 0x1f30),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (Avoton) */
+ PCI_DEVICE(0x8086, 0x1f31),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (Wellsburg) */
+ PCI_DEVICE(0x8086, 0x8d00),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (Wellsburg) */
+ PCI_DEVICE(0x8086, 0x8d08),
+ .driver_data = ich8_2port_sata_snb,
+ }, {
+ /* SATA Controller IDE (Wellsburg) */
+ PCI_DEVICE(0x8086, 0x8d60),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (Wellsburg) */
+ PCI_DEVICE(0x8086, 0x8d68),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (BayTrail) */
+ PCI_DEVICE(0x8086, 0x0F20),
+ .driver_data = ich8_2port_sata_byt,
+ }, {
+ PCI_DEVICE(0x8086, 0x0F21),
+ .driver_data = ich8_2port_sata_byt,
+ }, {
+ /* SATA Controller IDE (Coleto Creek) */
+ PCI_DEVICE(0x8086, 0x23a6),
+ .driver_data = ich8_2port_sata,
+ }, {
+ /* SATA Controller IDE (9 Series) */
+ PCI_DEVICE(0x8086, 0x8c88),
+ .driver_data = ich8_2port_sata_snb,
+ }, {
+ /* SATA Controller IDE (9 Series) */
+ PCI_DEVICE(0x8086, 0x8c89),
+ .driver_data = ich8_2port_sata_snb,
+ }, {
+ /* SATA Controller IDE (9 Series) */
+ PCI_DEVICE(0x8086, 0x8c80),
+ .driver_data = ich8_sata_snb,
+ }, {
+ /* SATA Controller IDE (9 Series) */
+ PCI_DEVICE(0x8086, 0x8c81),
+ .driver_data = ich8_sata_snb,
+ },
{ } /* terminate list */
};
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
index c79abdfcd7a9..6d72eb017b49 100644
--- a/drivers/ata/libahci.c
+++ b/drivers/ata/libahci.c
@@ -552,11 +552,7 @@ void ahci_save_initial_config(struct device *dev, struct ahci_host_priv *hpriv)
/* cross check port_map and cap.n_ports */
if (port_map) {
- int map_ports = 0;
-
- for (i = 0; i < AHCI_MAX_PORTS; i++)
- if (port_map & (1 << i))
- map_ports++;
+ int map_ports = hweight_long(port_map);
/* If PI has more ports than n_ports, whine, clear
* port_map and let it be generated from n_ports.
@@ -1527,6 +1523,7 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class,
ata_link_err(link, "softreset failed (%s)\n", reason);
return rc;
}
+EXPORT_SYMBOL_GPL(ahci_do_softreset);
int ahci_check_ready(struct ata_link *link)
{
@@ -1544,7 +1541,6 @@ static int ahci_softreset(struct ata_link *link, unsigned int *class,
return ahci_do_softreset(link, class, pmp, deadline, ahci_check_ready);
}
-EXPORT_SYMBOL_GPL(ahci_do_softreset);
static int ahci_bad_pmp_check_ready(struct ata_link *link)
{
@@ -2212,6 +2208,7 @@ static void ahci_thaw(struct ata_port *ap)
}
void ahci_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
struct ahci_host_priv *hpriv = ap->host->private_data;
@@ -2636,7 +2633,7 @@ void ahci_print_info(struct ata_host *host, const char *scc_s)
,
hweight32(impl),
- (cap & 0x1f) + 1,
+ ahci_nr_ports(cap),
impl);
dev_info(host->dev,
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 3d0027ec33c2..3b6243f0f91e 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -1540,6 +1540,7 @@ unsigned int ata_exec_internal(struct ata_device *dev, struct ata_taskfile *tf,
{
struct ata_link *link = dev->link;
struct ata_port *ap = link->ap;
+ const bool owns_eh_mutex = ap->host->eh_owner == current;
u8 command = tf->command;
struct ata_queued_cmd *qc;
struct scatterlist sgl;
@@ -1604,7 +1605,7 @@ unsigned int ata_exec_internal(struct ata_device *dev, struct ata_taskfile *tf,
qc->private_data = &wait;
qc->complete_fn = ata_qc_complete_internal;
- ata_qc_issue(qc);
+ ata_qc_issue(ap, qc);
spin_unlock_irqrestore(ap->lock, flags);
@@ -1617,11 +1618,25 @@ unsigned int ata_exec_internal(struct ata_device *dev, struct ata_taskfile *tf,
}
}
- ata_eh_release(ap);
+ if (owns_eh_mutex) {
+ /*
+ * To prevent that the compiler complains about the
+ * ata_eh_release() call below.
+ */
+ __acquire(&ap->host->eh_mutex);
+ ata_eh_release(ap);
+ }
rc = wait_for_completion_timeout(&wait, msecs_to_jiffies(timeout));
- ata_eh_acquire(ap);
+ if (owns_eh_mutex) {
+ ata_eh_acquire(ap);
+ /*
+ * To prevent that the compiler complains about the above
+ * ata_eh_acquire() call.
+ */
+ __release(&ap->host->eh_mutex);
+ }
ata_sff_flush_pio_task(ap);
@@ -5135,6 +5150,7 @@ EXPORT_SYMBOL_GPL(ata_qc_get_active);
/**
* ata_qc_issue - issue taskfile to device
+ * @ap: ATA port of interest
* @qc: command to issue to device
*
* Prepare an ATA command to submission to device.
@@ -5145,9 +5161,9 @@ EXPORT_SYMBOL_GPL(ata_qc_get_active);
* LOCKING:
* spin_lock_irqsave(host lock)
*/
-void ata_qc_issue(struct ata_queued_cmd *qc)
+void ata_qc_issue(struct ata_port *ap, struct ata_queued_cmd *qc)
+ __must_hold(ap->lock)
{
- struct ata_port *ap = qc->ap;
struct ata_link *link = qc->dev->link;
u8 prot = qc->tf.protocol;
@@ -6820,6 +6836,7 @@ EXPORT_SYMBOL_GPL(ata_ratelimit);
* Might sleep.
*/
void ata_msleep(struct ata_port *ap, unsigned int msecs)
+ __context_unsafe(conditional locking)
{
bool owns_eh = ap && ap->host->eh_owner == current;
@@ -6894,6 +6911,7 @@ static unsigned int ata_dummy_qc_issue(struct ata_queued_cmd *qc)
}
static void ata_dummy_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
/* truly dummy */
}
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index d623eb32ed8b..05df7ea6954a 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -469,6 +469,7 @@ static void ata_eh_clear_action(struct ata_link *link, struct ata_device *dev,
* EH context.
*/
void ata_eh_acquire(struct ata_port *ap)
+ __acquires(&ap->host->eh_mutex)
{
mutex_lock(&ap->host->eh_mutex);
WARN_ON_ONCE(ap->host->eh_owner);
@@ -486,6 +487,7 @@ void ata_eh_acquire(struct ata_port *ap)
* EH context.
*/
void ata_eh_release(struct ata_port *ap)
+ __releases(&ap->host->eh_mutex)
{
WARN_ON_ONCE(ap->host->eh_owner != current);
ap->host->eh_owner = NULL;
@@ -819,7 +821,7 @@ void ata_scsi_port_error_handler(struct Scsi_Host *host, struct ata_port *ap)
ap->pflags &= ~ATA_PFLAG_LOADING;
else if ((ap->pflags & ATA_PFLAG_SCSI_HOTPLUG) &&
!(ap->flags & ATA_FLAG_SAS_HOST))
- schedule_delayed_work(&ap->hotplug_task, 0);
+ queue_delayed_work(system_dfl_long_wq, &ap->hotplug_task, 0);
if (ap->pflags & ATA_PFLAG_RECOVERED)
ata_port_info(ap, "EH complete\n");
@@ -2831,10 +2833,10 @@ static bool ata_eh_followup_srst_needed(struct ata_link *link, int rc)
return false;
}
-int ata_eh_reset(struct ata_link *link, int classify,
+int ata_eh_reset(struct ata_port *ap, struct ata_link *link, int classify,
struct ata_reset_operations *reset_ops)
+ __must_hold(&ap->host->eh_mutex)
{
- struct ata_port *ap = link->ap;
struct ata_link *slave = ap->slave_link;
struct ata_eh_context *ehc = &link->eh_context;
struct ata_eh_context *sehc = slave ? &slave->eh_context : NULL;
@@ -3816,6 +3818,7 @@ static int ata_eh_handle_dev_fail(struct ata_device *dev, int err)
*/
int ata_eh_recover(struct ata_port *ap, struct ata_reset_operations *reset_ops,
struct ata_link **r_failed_link)
+ __must_hold(&ap->host->eh_mutex)
{
struct ata_link *link;
struct ata_device *dev;
@@ -3882,7 +3885,8 @@ int ata_eh_recover(struct ata_port *ap, struct ata_reset_operations *reset_ops,
if (!(ehc->i.action & ATA_EH_RESET))
continue;
- rc = ata_eh_reset(link, ata_link_nr_vacant(link), reset_ops);
+ rc = ata_eh_reset(ap, link, ata_link_nr_vacant(link),
+ reset_ops);
if (rc) {
ata_link_err(link, "reset failed, giving up\n");
goto out;
@@ -4112,6 +4116,7 @@ void ata_eh_finish(struct ata_port *ap)
* Kernel thread context (may sleep).
*/
void ata_std_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
struct ata_reset_operations *reset_ops = &ap->ops->reset;
struct ata_link *link = &ap->link;
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
index e8540931b4a1..904f418387d1 100644
--- a/drivers/ata/libata-pmp.c
+++ b/drivers/ata/libata-pmp.c
@@ -457,8 +457,13 @@ static void sata_pmp_quirks(struct ata_port *ap)
* otherwise. Don't try hard to recover it.
*/
ap->pmp_link[ap->nr_pmp_links - 1].flags |= ATA_LFLAG_NO_RETRY;
- } else if (vendor == 0x197b && (devid == 0x2352 || devid == 0x0325)) {
+ } else if (vendor == 0x197b &&
+ (devid == 0x0562 || devid == 0x2352 || devid == 0x0325)) {
/*
+ * 0x0562: JMicron JMS562, as used in QNAP QDA-A2AR RAID1
+ * adapters. The exported device may stay not ready
+ * while the array is rebuilding, and SRST/classify can
+ * time out before the RAID volume is exported.
* 0x2352: found in Thermaltake BlackX Duet, jmicron JMB350?
* 0x0325: jmicron JMB394.
*/
@@ -756,6 +761,7 @@ static int sata_pmp_revalidate_quick(struct ata_device *dev)
*/
static int sata_pmp_eh_recover_pmp(struct ata_port *ap,
struct ata_reset_operations *reset_ops)
+ __must_hold(&ap->host->eh_mutex)
{
struct ata_link *link = &ap->link;
struct ata_eh_context *ehc = &link->eh_context;
@@ -777,7 +783,7 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap,
struct ata_link *tlink;
/* reset */
- rc = ata_eh_reset(link, 0, reset_ops);
+ rc = ata_eh_reset(ap, link, 0, reset_ops);
if (rc) {
ata_link_err(link, "failed to reset PMP, giving up\n");
goto fail;
@@ -921,6 +927,7 @@ static int sata_pmp_handle_link_fail(struct ata_link *link, int *link_tries)
* 0 on success, -errno on failure.
*/
static int sata_pmp_eh_recover(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
struct ata_port_operations *ops = ap->ops;
int pmp_tries, link_tries[SATA_PMP_MAX_PORTS];
@@ -1098,6 +1105,7 @@ static int sata_pmp_eh_recover(struct ata_port *ap)
* Kernel thread context (may sleep).
*/
void sata_pmp_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
ata_eh_autopsy(ap);
ata_eh_report(ap);
diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
index 2ee54d60ea4b..b0706c30da05 100644
--- a/drivers/ata/libata-sata.c
+++ b/drivers/ata/libata-sata.c
@@ -1377,9 +1377,10 @@ EXPORT_SYMBOL_GPL(ata_sas_sdev_configure);
*/
int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap)
+ __must_hold(ap->lock)
{
if (likely(ata_dev_enabled(ap->link.device)))
- return __ata_scsi_queuecmd(cmd, ap->link.device);
+ return __ata_scsi_queuecmd(cmd, ap->link.device, ap);
cmd->result = (DID_BAD_TARGET << 16);
scsi_done(cmd);
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index d43207c6e467..d54ec1631e9a 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -1681,7 +1681,7 @@ void ata_scsi_deferred_qc_work(struct work_struct *work)
if (qc && !ata_port_eh_scheduled(ap)) {
WARN_ON_ONCE(ap->ops->qc_defer(qc));
link->deferred_qc = NULL;
- ata_qc_issue(qc);
+ ata_qc_issue(ap, qc);
}
spin_unlock_irqrestore(ap->lock, flags);
@@ -1769,6 +1769,7 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
}
static int ata_scsi_qc_issue(struct ata_port *ap, struct ata_queued_cmd *qc)
+ __must_hold(ap->lock)
{
struct ata_link *link = qc->dev->link;
int ret;
@@ -1812,7 +1813,7 @@ static int ata_scsi_qc_issue(struct ata_port *ap, struct ata_queued_cmd *qc)
}
issue_qc:
- ata_qc_issue(qc);
+ ata_qc_issue(ap, qc);
return 0;
defer_qc:
@@ -1840,6 +1841,7 @@ free_qc:
* @dev: ATA device to which the command is addressed
* @cmd: SCSI command to execute
* @xlat_func: Actor which translates @cmd to an ATA taskfile
+ * @ap: ATA port of interest
*
* Our ->queuecommand() function has decided that the SCSI
* command issued can be directly translated into an ATA
@@ -1862,9 +1864,9 @@ free_qc:
* command needs to be deferred.
*/
static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
- ata_xlat_func_t xlat_func)
+ ata_xlat_func_t xlat_func, struct ata_port *ap)
+ __must_hold(ap->lock)
{
- struct ata_port *ap = dev->link->ap;
struct ata_queued_cmd *qc;
lockdep_assert_held(ap->lock);
@@ -4521,9 +4523,10 @@ static void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd)
}
enum scsi_qc_status __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
- struct ata_device *dev)
+ struct ata_device *dev,
+ struct ata_port *ap)
+ __must_hold(ap->lock)
{
- struct ata_port *ap = dev->link->ap;
u8 scsi_op = scmd->cmnd[0];
ata_xlat_func_t xlat_func;
@@ -4564,7 +4567,7 @@ enum scsi_qc_status __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
}
if (xlat_func)
- return ata_scsi_translate(dev, scmd, xlat_func);
+ return ata_scsi_translate(dev, scmd, xlat_func, ap);
ata_scsi_simulate(dev, scmd);
@@ -4610,7 +4613,7 @@ enum scsi_qc_status ata_scsi_queuecmd(struct Scsi_Host *shost,
dev = ata_scsi_find_dev(ap, scsidev);
if (likely(dev))
- rc = __ata_scsi_queuecmd(cmd, dev);
+ rc = __ata_scsi_queuecmd(cmd, dev, ap);
else {
cmd->result = (DID_BAD_TARGET << 16);
scsi_done(cmd);
@@ -4768,7 +4771,7 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync)
"WARNING: synchronous SCSI scan failed without making any progress, switching to async\n");
}
- queue_delayed_work(system_long_wq, &ap->hotplug_task,
+ queue_delayed_work(system_dfl_long_wq, &ap->hotplug_task,
round_jiffies_relative(HZ));
}
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 785b6e371abf..734e7c88439a 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -2053,6 +2053,7 @@ EXPORT_SYMBOL_GPL(ata_sff_drain_fifo);
* Kernel thread context (may sleep)
*/
void ata_sff_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
struct ata_queued_cmd *qc;
unsigned long flags;
@@ -2769,6 +2770,7 @@ EXPORT_SYMBOL_GPL(ata_bmdma_interrupt);
* Kernel thread context (may sleep)
*/
void ata_bmdma_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
struct ata_queued_cmd *qc;
unsigned long flags;
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h
index b5423b6e97de..0dd735c2e5b5 100644
--- a/drivers/ata/libata.h
+++ b/drivers/ata/libata.h
@@ -88,7 +88,8 @@ extern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel);
extern unsigned int ata_dev_set_feature(struct ata_device *dev,
u8 subcmd, u8 action);
extern void ata_qc_free(struct ata_queued_cmd *qc);
-extern void ata_qc_issue(struct ata_queued_cmd *qc);
+extern void ata_qc_issue(struct ata_port *ap, struct ata_queued_cmd *qc)
+ __must_hold(ap->lock);
extern void __ata_qc_complete(struct ata_queued_cmd *qc);
extern int atapi_check_dma(struct ata_queued_cmd *qc);
extern void swap_buf_le16(u16 *buf, unsigned int buf_words);
@@ -166,15 +167,19 @@ void ata_scsi_sdev_config(struct scsi_device *sdev);
int ata_scsi_dev_config(struct scsi_device *sdev, struct queue_limits *lim,
struct ata_device *dev);
enum scsi_qc_status __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
- struct ata_device *dev);
+ struct ata_device *dev,
+ struct ata_port *ap)
+ __must_hold(ap->lock);
void ata_scsi_deferred_qc_work(struct work_struct *work);
void ata_scsi_requeue_deferred_qc(struct ata_port *ap);
/* libata-eh.c */
extern unsigned int ata_internal_cmd_timeout(struct ata_device *dev, u8 cmd);
extern void ata_internal_cmd_timed_out(struct ata_device *dev, u8 cmd);
-extern void ata_eh_acquire(struct ata_port *ap);
-extern void ata_eh_release(struct ata_port *ap);
+extern void ata_eh_acquire(struct ata_port *ap)
+ __acquires(&ap->host->eh_mutex);
+extern void ata_eh_release(struct ata_port *ap)
+ __releases(&ap->host->eh_mutex);
extern void ata_scsi_error(struct Scsi_Host *host);
extern void ata_eh_fastdrain_timerfn(struct timer_list *t);
extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);
@@ -187,11 +192,13 @@ extern void ata_eh_done(struct ata_link *link, struct ata_device *dev,
extern void ata_eh_autopsy(struct ata_port *ap);
const char *ata_get_cmd_name(u8 command);
extern void ata_eh_report(struct ata_port *ap);
-extern int ata_eh_reset(struct ata_link *link, int classify,
- struct ata_reset_operations *reset_ops);
+extern int ata_eh_reset(struct ata_port *ap, struct ata_link *link,
+ int classify, struct ata_reset_operations *reset_ops)
+ __must_hold(&ap->host->eh_mutex);
extern int ata_eh_recover(struct ata_port *ap,
struct ata_reset_operations *reset_ops,
- struct ata_link **r_failed_disk);
+ struct ata_link **r_failed_disk)
+ __must_hold(&ap->host->eh_mutex);
extern void ata_eh_finish(struct ata_port *ap);
extern int ata_ering_map(struct ata_ering *ering,
int (*map_fn)(struct ata_ering_entry *, void *),
diff --git a/drivers/ata/pata_acpi.c b/drivers/ata/pata_acpi.c
index 23fff10af2ac..a4f0f81844a1 100644
--- a/drivers/ata/pata_acpi.c
+++ b/drivers/ata/pata_acpi.c
@@ -257,7 +257,10 @@ static int pacpi_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
}
static const struct pci_device_id pacpi_pci_tbl[] = {
- { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 1},
+ {
+ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL),
+ .driver_data = 1, /* is this used at all? */
+ },
{ } /* terminate list */
};
diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c
index a2fecadc927d..2732cb37f268 100644
--- a/drivers/ata/pata_amd.c
+++ b/drivers/ata/pata_amd.c
@@ -597,29 +597,71 @@ static int amd_reinit_one(struct pci_dev *pdev)
#endif
static const struct pci_device_id amd[] = {
- { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_COBRA_7401), 0 },
- { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_VIPER_7409), 1 },
- { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_VIPER_7411), 3 },
- { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_OPUS_7441), 4 },
- { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_8111_IDE), 5 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_IDE), 7 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE), 8 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE), 8 },
- { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CS5536_IDE), 9 },
- { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CS5536_DEV_IDE), 9 },
-
- { },
+ {
+ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_COBRA_7401),
+ .driver_data = 0,
+ }, {
+ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_VIPER_7409),
+ .driver_data = 1,
+ }, {
+ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_VIPER_7411),
+ .driver_data = 3,
+ }, {
+ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_OPUS_7441),
+ .driver_data = 4,
+ }, {
+ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_8111_IDE),
+ .driver_data = 5,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_IDE),
+ .driver_data = 7,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE),
+ .driver_data = 8,
+ }, {
+ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CS5536_IDE),
+ .driver_data = 9,
+ }, {
+ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CS5536_DEV_IDE),
+ .driver_data = 9
+ },
+ { }
};
static struct pci_driver amd_pci_driver = {
diff --git a/drivers/ata/pata_arasan_cf.c b/drivers/ata/pata_arasan_cf.c
index b1e281b64f57..e05a4847e037 100644
--- a/drivers/ata/pata_arasan_cf.c
+++ b/drivers/ata/pata_arasan_cf.c
@@ -658,6 +658,7 @@ static void arasan_cf_freeze(struct ata_port *ap)
}
static void arasan_cf_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
struct arasan_cf_dev *acdev = ap->host->private_data;
@@ -803,16 +804,6 @@ static int arasan_cf_probe(struct platform_device *pdev)
irq_handler_t irq_handler = NULL;
int ret;
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res)
- return -EINVAL;
-
- if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
- DRIVER_NAME)) {
- dev_warn(&pdev->dev, "Failed to get memory region resource\n");
- return -ENOENT;
- }
-
acdev = devm_kzalloc(&pdev->dev, sizeof(*acdev), GFP_KERNEL);
if (!acdev)
return -ENOMEM;
@@ -827,22 +818,20 @@ static int arasan_cf_probe(struct platform_device *pdev)
* support only PIO
*/
ret = platform_get_irq(pdev, 0);
+ if (ret == -EPROBE_DEFER)
+ return ret;
if (ret > 0) {
acdev->irq = ret;
irq_handler = arasan_cf_interrupt;
- } else if (ret == -EPROBE_DEFER) {
- return ret;
} else {
quirk |= CF_BROKEN_MWDMA | CF_BROKEN_UDMA;
}
+ acdev->vbase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
+ if (IS_ERR(acdev->vbase))
+ return PTR_ERR(acdev->vbase);
+
acdev->pbase = res->start;
- acdev->vbase = devm_ioremap(&pdev->dev, res->start,
- resource_size(res));
- if (!acdev->vbase) {
- dev_warn(&pdev->dev, "ioremap fail\n");
- return -ENOMEM;
- }
acdev->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(acdev->clk)) {
diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c
index 6160414172a3..9f8d41639a62 100644
--- a/drivers/ata/pata_artop.c
+++ b/drivers/ata/pata_artop.c
@@ -421,12 +421,11 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
}
static const struct pci_device_id artop_pci_tbl[] = {
- { PCI_VDEVICE(ARTOP, 0x0005), 0 },
- { PCI_VDEVICE(ARTOP, 0x0006), 1 },
- { PCI_VDEVICE(ARTOP, 0x0007), 1 },
- { PCI_VDEVICE(ARTOP, 0x0008), 2 },
- { PCI_VDEVICE(ARTOP, 0x0009), 2 },
-
+ { PCI_VDEVICE(ARTOP, 0x0005), .driver_data = 0 },
+ { PCI_VDEVICE(ARTOP, 0x0006), .driver_data = 1 },
+ { PCI_VDEVICE(ARTOP, 0x0007), .driver_data = 1 },
+ { PCI_VDEVICE(ARTOP, 0x0008), .driver_data = 2 },
+ { PCI_VDEVICE(ARTOP, 0x0009), .driver_data = 2 },
{ } /* terminate list */
};
diff --git a/drivers/ata/pata_atp867x.c b/drivers/ata/pata_atp867x.c
index 308f86f9e2f0..6154a2bf19be 100644
--- a/drivers/ata/pata_atp867x.c
+++ b/drivers/ata/pata_atp867x.c
@@ -526,9 +526,9 @@ static int atp867x_reinit_one(struct pci_dev *pdev)
#endif
static const struct pci_device_id atp867x_pci_tbl[] = {
- { PCI_VDEVICE(ARTOP, PCI_DEVICE_ID_ARTOP_ATP867A), 0 },
- { PCI_VDEVICE(ARTOP, PCI_DEVICE_ID_ARTOP_ATP867B), 0 },
- { },
+ { PCI_VDEVICE(ARTOP, PCI_DEVICE_ID_ARTOP_ATP867A) },
+ { PCI_VDEVICE(ARTOP, PCI_DEVICE_ID_ARTOP_ATP867B) },
+ { }
};
static struct pci_driver atp867x_driver = {
diff --git a/drivers/ata/pata_cmd640.c b/drivers/ata/pata_cmd640.c
index 45a7217b136e..84eb36d02d7d 100644
--- a/drivers/ata/pata_cmd640.c
+++ b/drivers/ata/pata_cmd640.c
@@ -248,8 +248,8 @@ static int cmd640_reinit_one(struct pci_dev *pdev)
#endif
static const struct pci_device_id cmd640[] = {
- { PCI_VDEVICE(CMD, 0x640), 0 },
- { },
+ { PCI_VDEVICE(CMD, 0x0640) },
+ { }
};
static struct pci_driver cmd640_pci_driver = {
diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c
index fafea2b79145..e6c8783ce00e 100644
--- a/drivers/ata/pata_cmd64x.c
+++ b/drivers/ata/pata_cmd64x.c
@@ -506,12 +506,11 @@ static int cmd64x_reinit_one(struct pci_dev *pdev)
#endif
static const struct pci_device_id cmd64x[] = {
- { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_643), 0 },
- { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_646), 1 },
- { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_648), 5 },
- { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_649), 6 },
-
- { },
+ { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_643), .driver_data = 0 },
+ { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_646), .driver_data = 1 },
+ { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_648), .driver_data = 5 },
+ { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_649), .driver_data = 6 },
+ { }
};
static struct pci_driver cmd64x_pci_driver = {
diff --git a/drivers/ata/pata_ep93xx.c b/drivers/ata/pata_ep93xx.c
index b2b9e0058333..1663dcd00a93 100644
--- a/drivers/ata/pata_ep93xx.c
+++ b/drivers/ata/pata_ep93xx.c
@@ -204,6 +204,7 @@ static void ep93xx_pata_enable_pio(void __iomem *base, int pio_mode)
*/
static void ep93xx_pata_delay(unsigned long count)
{
+#ifdef CONFIG_ARM
__asm__ volatile (
"0:\n"
"mov r0, r0\n"
@@ -212,6 +213,10 @@ static void ep93xx_pata_delay(unsigned long count)
: "=r" (count)
: "0" (count)
);
+#else
+ while (count--)
+ cpu_relax();
+#endif
}
static unsigned long ep93xx_pata_wait_for_iordy(void __iomem *base,
@@ -972,7 +977,7 @@ static int ep93xx_pata_probe(struct platform_device *pdev)
match = soc_device_match(ep93xx_soc_table);
if (match)
- ap->udma_mask = (unsigned int) match->data;
+ ap->udma_mask = (unsigned long) match->data;
else
ap->udma_mask = ATA_UDMA2;
}
diff --git a/drivers/ata/pata_isapnp.c b/drivers/ata/pata_isapnp.c
index 0f77e0424066..23139009c40e 100644
--- a/drivers/ata/pata_isapnp.c
+++ b/drivers/ata/pata_isapnp.c
@@ -119,8 +119,8 @@ static void isapnp_remove_one(struct pnp_dev *idev)
static struct pnp_device_id isapnp_devices[] = {
/* Generic ESDI/IDE/ATA compatible hard disk controller */
- {.id = "PNP0600", .driver_data = 0},
- {.id = ""}
+ { .id = "PNP0600" },
+ { }
};
MODULE_DEVICE_TABLE(pnp, isapnp_devices);
diff --git a/drivers/ata/pata_jmicron.c b/drivers/ata/pata_jmicron.c
index b885f33e8980..d18286cbca1b 100644
--- a/drivers/ata/pata_jmicron.c
+++ b/drivers/ata/pata_jmicron.c
@@ -148,8 +148,11 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i
}
static const struct pci_device_id jmicron_pci_tbl[] = {
- { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
- PCI_CLASS_STORAGE_IDE << 8, 0xffff00, 0 },
+ {
+ PCI_DEVICE(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID),
+ .class = PCI_CLASS_STORAGE_IDE << 8,
+ .class_mask = 0xffff00
+ },
{ } /* terminate list */
};
diff --git a/drivers/ata/pata_macio.c b/drivers/ata/pata_macio.c
index 9eefdc5df5df..dd93f613f959 100644
--- a/drivers/ata/pata_macio.c
+++ b/drivers/ata/pata_macio.c
@@ -1368,12 +1368,12 @@ static struct macio_driver pata_macio_driver =
};
static const struct pci_device_id pata_macio_pci_match[] = {
- { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_UNI_N_ATA), 0 },
- { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_IPID_ATA100), 0 },
- { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_K2_ATA100), 0 },
- { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_SH_ATA), 0 },
- { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_IPID2_ATA), 0 },
- {},
+ { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_UNI_N_ATA) },
+ { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_IPID_ATA100) },
+ { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_K2_ATA100) },
+ { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_SH_ATA) },
+ { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_IPID2_ATA) },
+ { }
};
static struct pci_driver pata_macio_pci_driver = {
diff --git a/drivers/ata/pata_ninja32.c b/drivers/ata/pata_ninja32.c
index 76a91013d27d..88db9bd271e8 100644
--- a/drivers/ata/pata_ninja32.c
+++ b/drivers/ata/pata_ninja32.c
@@ -166,13 +166,13 @@ static int ninja32_reinit_one(struct pci_dev *pdev)
#endif
static const struct pci_device_id ninja32[] = {
- { 0x10FC, 0x0003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
- { 0x1145, 0x8008, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
- { 0x1145, 0xf008, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
- { 0x1145, 0xf021, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
- { 0x1145, 0xf024, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
- { 0x1145, 0xf02C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
- { },
+ { PCI_DEVICE(0x10FC, 0x0003) },
+ { PCI_DEVICE(0x1145, 0x8008) },
+ { PCI_DEVICE(0x1145, 0xf008) },
+ { PCI_DEVICE(0x1145, 0xf021) },
+ { PCI_DEVICE(0x1145, 0xf024) },
+ { PCI_DEVICE(0x1145, 0xf02C) },
+ { }
};
static struct pci_driver ninja32_pci_driver = {
diff --git a/drivers/ata/pata_opti.c b/drivers/ata/pata_opti.c
index 3db1b95d1404..dd67bbdf6ecf 100644
--- a/drivers/ata/pata_opti.c
+++ b/drivers/ata/pata_opti.c
@@ -174,10 +174,9 @@ static int opti_init_one(struct pci_dev *dev, const struct pci_device_id *id)
}
static const struct pci_device_id opti[] = {
- { PCI_VDEVICE(OPTI, PCI_DEVICE_ID_OPTI_82C621), 0 },
- { PCI_VDEVICE(OPTI, PCI_DEVICE_ID_OPTI_82C825), 1 },
-
- { },
+ { PCI_VDEVICE(OPTI, PCI_DEVICE_ID_OPTI_82C621), .driver_data = 0 },
+ { PCI_VDEVICE(OPTI, PCI_DEVICE_ID_OPTI_82C825), .driver_data = 1 },
+ { }
};
static struct pci_driver opti_pci_driver = {
diff --git a/drivers/ata/pata_pdc2027x.c b/drivers/ata/pata_pdc2027x.c
index ae914dcb0c83..d1d1cfb22e27 100644
--- a/drivers/ata/pata_pdc2027x.c
+++ b/drivers/ata/pata_pdc2027x.c
@@ -100,14 +100,28 @@ static const struct pdc2027x_udma_timing {
};
static const struct pci_device_id pdc2027x_pci_tbl[] = {
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20268), PDC_UDMA_100 },
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20269), PDC_UDMA_133 },
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20270), PDC_UDMA_100 },
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20271), PDC_UDMA_133 },
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20275), PDC_UDMA_133 },
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20276), PDC_UDMA_133 },
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20277), PDC_UDMA_133 },
-
+ {
+ PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20268),
+ .driver_data = PDC_UDMA_100,
+ }, {
+ PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20269),
+ .driver_data = PDC_UDMA_133,
+ }, {
+ PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20270),
+ .driver_data = PDC_UDMA_100,
+ }, {
+ PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20271),
+ .driver_data = PDC_UDMA_133,
+ }, {
+ PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20275),
+ .driver_data = PDC_UDMA_133,
+ }, {
+ PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20276),
+ .driver_data = PDC_UDMA_133,
+ }, {
+ PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20277),
+ .driver_data = PDC_UDMA_133,
+ },
{ } /* terminate list */
};
diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c
index a32723e46357..2dad77c828f2 100644
--- a/drivers/ata/pata_pdc202xx_old.c
+++ b/drivers/ata/pata_pdc202xx_old.c
@@ -362,13 +362,12 @@ static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id
}
static const struct pci_device_id pdc202xx[] = {
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20246), 0 },
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20262), 1 },
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20263), 1 },
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20265), 2 },
- { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20267), 2 },
-
- { },
+ { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20246), .driver_data = 0 },
+ { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20262), .driver_data = 1 },
+ { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20263), .driver_data = 1 },
+ { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20265), .driver_data = 2 },
+ { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20267), .driver_data = 2 },
+ { }
};
static struct pci_driver pdc202xx_pci_driver = {
diff --git a/drivers/ata/pata_sch.c b/drivers/ata/pata_sch.c
index 8356f1f2a025..fadb5377371b 100644
--- a/drivers/ata/pata_sch.c
+++ b/drivers/ata/pata_sch.c
@@ -42,7 +42,7 @@ static void sch_set_dmamode(struct ata_port *ap, struct ata_device *adev);
static const struct pci_device_id sch_pci_tbl[] = {
/* Intel SCH PATA Controller */
- { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_SCH_IDE), 0 },
+ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_SCH_IDE) },
{ } /* terminate list */
};
diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c
index 4edddf6bcc15..dc595688d3ba 100644
--- a/drivers/ata/pata_serverworks.c
+++ b/drivers/ata/pata_serverworks.c
@@ -467,13 +467,23 @@ static int serverworks_reinit_one(struct pci_dev *pdev)
#endif
static const struct pci_device_id serverworks[] = {
- { PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4IDE), 0},
- { PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE), 2},
- { PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE), 2},
- { PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2), 2},
- { PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000IDE), 2},
-
- { },
+ {
+ PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4IDE),
+ .driver_data = 0,
+ }, {
+ PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE),
+ .driver_data = 2,
+ }, {
+ PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE),
+ .driver_data = 2,
+ }, {
+ PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2),
+ .driver_data = 2,
+ }, {
+ PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000IDE),
+ .driver_data = 2
+ },
+ { }
};
static struct pci_driver serverworks_pci_driver = {
diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c
index 2b751e393771..8262f4f8e6e7 100644
--- a/drivers/ata/pata_sis.c
+++ b/drivers/ata/pata_sis.c
@@ -891,7 +891,6 @@ static const struct pci_device_id sis_pci_tbl[] = {
{ PCI_VDEVICE(SI, 0x5513), }, /* SiS 5513 */
{ PCI_VDEVICE(SI, 0x5518), }, /* SiS 5518 */
{ PCI_VDEVICE(SI, 0x1180), }, /* SiS 1180 */
-
{ }
};
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
index a8c9cf685b4b..cb53fe698c6e 100644
--- a/drivers/ata/pata_via.c
+++ b/drivers/ata/pata_via.c
@@ -675,16 +675,15 @@ static int via_reinit_one(struct pci_dev *pdev)
#endif
static const struct pci_device_id via[] = {
- { PCI_VDEVICE(VIA, 0x0415), },
- { PCI_VDEVICE(VIA, 0x0571), },
- { PCI_VDEVICE(VIA, 0x0581), },
- { PCI_VDEVICE(VIA, 0x1571), },
- { PCI_VDEVICE(VIA, 0x3164), },
- { PCI_VDEVICE(VIA, 0x5324), },
- { PCI_VDEVICE(VIA, 0xC409), VIA_IDFLAG_SINGLE },
- { PCI_VDEVICE(VIA, 0x9001), VIA_IDFLAG_SINGLE },
-
- { },
+ { PCI_VDEVICE(VIA, 0x0415), .driver_data = 0 },
+ { PCI_VDEVICE(VIA, 0x0571), .driver_data = 0 },
+ { PCI_VDEVICE(VIA, 0x0581), .driver_data = 0 },
+ { PCI_VDEVICE(VIA, 0x1571), .driver_data = 0 },
+ { PCI_VDEVICE(VIA, 0x3164), .driver_data = 0 },
+ { PCI_VDEVICE(VIA, 0x5324), .driver_data = 0 },
+ { PCI_VDEVICE(VIA, 0xC409), .driver_data = VIA_IDFLAG_SINGLE },
+ { PCI_VDEVICE(VIA, 0x9001), .driver_data = VIA_IDFLAG_SINGLE },
+ { }
};
static struct pci_driver via_pci_driver = {
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c
index 17a5a59861c3..30aaf5c5337b 100644
--- a/drivers/ata/pdc_adma.c
+++ b/drivers/ata/pdc_adma.c
@@ -157,8 +157,7 @@ static struct ata_port_info adma_port_info[] = {
};
static const struct pci_device_id adma_ata_pci_tbl[] = {
- { PCI_VDEVICE(PDC, 0x1841), board_1841_idx },
-
+ { PCI_VDEVICE(PDC, 0x1841), .driver_data = board_1841_idx },
{ } /* terminate list */
};
diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c
index 64cb544903d8..4fc22ce4bd9a 100644
--- a/drivers/ata/sata_dwc_460ex.c
+++ b/drivers/ata/sata_dwc_460ex.c
@@ -1041,6 +1041,7 @@ static unsigned int sata_dwc_qc_issue(struct ata_queued_cmd *qc)
}
static void sata_dwc_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
ata_sff_error_handler(ap);
}
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
index be829fcc584d..70b210afd291 100644
--- a/drivers/ata/sata_fsl.c
+++ b/drivers/ata/sata_fsl.c
@@ -1035,6 +1035,7 @@ err:
}
static void sata_fsl_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
sata_pmp_error_handler(ap);
}
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c
index 46a8c20daf18..065408975f5b 100644
--- a/drivers/ata/sata_inic162x.c
+++ b/drivers/ata/sata_inic162x.c
@@ -660,6 +660,7 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class,
}
static void inic_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
void __iomem *port_base = inic_port_base(ap);
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index ffb396f61731..41647a56a9f4 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -2398,6 +2398,7 @@ static struct ata_queued_cmd *mv_get_active_qc(struct ata_port *ap)
}
static void mv_pmp_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
unsigned int pmp, pmp_map;
struct mv_port_priv *pp = ap->private_data;
@@ -4273,32 +4274,32 @@ static int mv_pci_device_resume(struct pci_dev *pdev);
#endif
static const struct pci_device_id mv_pci_tbl[] = {
- { PCI_VDEVICE(MARVELL, 0x5040), chip_504x },
- { PCI_VDEVICE(MARVELL, 0x5041), chip_504x },
- { PCI_VDEVICE(MARVELL, 0x5080), chip_5080 },
- { PCI_VDEVICE(MARVELL, 0x5081), chip_508x },
+ { PCI_VDEVICE(MARVELL, 0x5040), .driver_data = chip_504x },
+ { PCI_VDEVICE(MARVELL, 0x5041), .driver_data = chip_504x },
+ { PCI_VDEVICE(MARVELL, 0x5080), .driver_data = chip_5080 },
+ { PCI_VDEVICE(MARVELL, 0x5081), .driver_data = chip_508x },
/* RocketRAID 1720/174x have different identifiers */
- { PCI_VDEVICE(TTI, 0x1720), chip_6042 },
- { PCI_VDEVICE(TTI, 0x1740), chip_6042 },
- { PCI_VDEVICE(TTI, 0x1742), chip_6042 },
+ { PCI_VDEVICE(TTI, 0x1720), .driver_data = chip_6042 },
+ { PCI_VDEVICE(TTI, 0x1740), .driver_data = chip_6042 },
+ { PCI_VDEVICE(TTI, 0x1742), .driver_data = chip_6042 },
- { PCI_VDEVICE(MARVELL, 0x6040), chip_604x },
- { PCI_VDEVICE(MARVELL, 0x6041), chip_604x },
- { PCI_VDEVICE(MARVELL, 0x6042), chip_6042 },
- { PCI_VDEVICE(MARVELL, 0x6080), chip_608x },
- { PCI_VDEVICE(MARVELL, 0x6081), chip_608x },
+ { PCI_VDEVICE(MARVELL, 0x6040), .driver_data = chip_604x },
+ { PCI_VDEVICE(MARVELL, 0x6041), .driver_data = chip_604x },
+ { PCI_VDEVICE(MARVELL, 0x6042), .driver_data = chip_6042 },
+ { PCI_VDEVICE(MARVELL, 0x6080), .driver_data = chip_608x },
+ { PCI_VDEVICE(MARVELL, 0x6081), .driver_data = chip_608x },
- { PCI_VDEVICE(ADAPTEC2, 0x0241), chip_604x },
+ { PCI_VDEVICE(ADAPTEC2, 0x0241), .driver_data = chip_604x },
/* Adaptec 1430SA */
- { PCI_VDEVICE(ADAPTEC2, 0x0243), chip_7042 },
+ { PCI_VDEVICE(ADAPTEC2, 0x0243), .driver_data = chip_7042 },
/* Marvell 7042 support */
- { PCI_VDEVICE(MARVELL, 0x7042), chip_7042 },
+ { PCI_VDEVICE(MARVELL, 0x7042), .driver_data = chip_7042 },
/* Highpoint RocketRAID PCIe series */
- { PCI_VDEVICE(TTI, 0x2300), chip_7042 },
- { PCI_VDEVICE(TTI, 0x2310), chip_7042 },
+ { PCI_VDEVICE(TTI, 0x2300), .driver_data = chip_7042 },
+ { PCI_VDEVICE(TTI, 0x2310), .driver_data = chip_7042 },
{ } /* terminate list */
};
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
index 841e7de2bba6..8624cd4e88cc 100644
--- a/drivers/ata/sata_nv.c
+++ b/drivers/ata/sata_nv.c
@@ -344,21 +344,49 @@ enum nv_host_type
};
static const struct pci_device_id nv_pci_tbl[] = {
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA), NFORCE2 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA), NFORCE3 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2), NFORCE3 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA), CK804 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2), CK804 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA), CK804 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2), CK804 },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA), MCP5x },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2), MCP5x },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA), MCP5x },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2), MCP5x },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA), GENERIC },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2), GENERIC },
- { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3), GENERIC },
-
+ {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA),
+ .driver_data = NFORCE2,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA),
+ .driver_data = NFORCE3,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2),
+ .driver_data = NFORCE3,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA),
+ .driver_data = CK804,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2),
+ .driver_data = CK804,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA),
+ .driver_data = CK804,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2),
+ .driver_data = CK804,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA),
+ .driver_data = MCP5x,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2),
+ .driver_data = MCP5x,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA),
+ .driver_data = MCP5x,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2),
+ .driver_data = MCP5x,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA),
+ .driver_data = GENERIC,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2),
+ .driver_data = GENERIC,
+ }, {
+ PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3),
+ .driver_data = GENERIC,
+ },
{ } /* terminate list */
};
@@ -1626,6 +1654,7 @@ static void nv_mcp55_thaw(struct ata_port *ap)
}
static void nv_adma_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
struct nv_adma_port_priv *pp = ap->private_data;
if (!(pp->flags & NV_ADMA_PORT_REGISTER_MODE)) {
@@ -1795,6 +1824,7 @@ static void nv_swncq_ncq_stop(struct ata_port *ap)
}
static void nv_swncq_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
struct ata_eh_context *ehc = &ap->link.eh_context;
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
index 2a005aede123..6da1dea00b84 100644
--- a/drivers/ata/sata_promise.c
+++ b/drivers/ata/sata_promise.c
@@ -281,25 +281,25 @@ static const struct ata_port_info pdc_port_info[] = {
};
static const struct pci_device_id pdc_ata_pci_tbl[] = {
- { PCI_VDEVICE(PROMISE, 0x3371), board_2037x },
- { PCI_VDEVICE(PROMISE, 0x3373), board_2037x },
- { PCI_VDEVICE(PROMISE, 0x3375), board_2037x },
- { PCI_VDEVICE(PROMISE, 0x3376), board_2037x },
- { PCI_VDEVICE(PROMISE, 0x3570), board_2057x },
- { PCI_VDEVICE(PROMISE, 0x3571), board_2057x },
- { PCI_VDEVICE(PROMISE, 0x3574), board_2057x },
- { PCI_VDEVICE(PROMISE, 0x3577), board_2057x },
- { PCI_VDEVICE(PROMISE, 0x3d73), board_2057x },
- { PCI_VDEVICE(PROMISE, 0x3d75), board_2057x },
-
- { PCI_VDEVICE(PROMISE, 0x3318), board_20319 },
- { PCI_VDEVICE(PROMISE, 0x3319), board_20319 },
- { PCI_VDEVICE(PROMISE, 0x3515), board_40518 },
- { PCI_VDEVICE(PROMISE, 0x3519), board_40518 },
- { PCI_VDEVICE(PROMISE, 0x3d17), board_40518 },
- { PCI_VDEVICE(PROMISE, 0x3d18), board_40518 },
-
- { PCI_VDEVICE(PROMISE, 0x6629), board_20619 },
+ { PCI_VDEVICE(PROMISE, 0x3371), .driver_data = board_2037x },
+ { PCI_VDEVICE(PROMISE, 0x3373), .driver_data = board_2037x },
+ { PCI_VDEVICE(PROMISE, 0x3375), .driver_data = board_2037x },
+ { PCI_VDEVICE(PROMISE, 0x3376), .driver_data = board_2037x },
+ { PCI_VDEVICE(PROMISE, 0x3570), .driver_data = board_2057x },
+ { PCI_VDEVICE(PROMISE, 0x3571), .driver_data = board_2057x },
+ { PCI_VDEVICE(PROMISE, 0x3574), .driver_data = board_2057x },
+ { PCI_VDEVICE(PROMISE, 0x3577), .driver_data = board_2057x },
+ { PCI_VDEVICE(PROMISE, 0x3d73), .driver_data = board_2057x },
+ { PCI_VDEVICE(PROMISE, 0x3d75), .driver_data = board_2057x },
+
+ { PCI_VDEVICE(PROMISE, 0x3318), .driver_data = board_20319 },
+ { PCI_VDEVICE(PROMISE, 0x3319), .driver_data = board_20319 },
+ { PCI_VDEVICE(PROMISE, 0x3515), .driver_data = board_40518 },
+ { PCI_VDEVICE(PROMISE, 0x3519), .driver_data = board_40518 },
+ { PCI_VDEVICE(PROMISE, 0x3d17), .driver_data = board_40518 },
+ { PCI_VDEVICE(PROMISE, 0x3d18), .driver_data = board_40518 },
+
+ { PCI_VDEVICE(PROMISE, 0x6629), .driver_data = board_20619 },
{ } /* terminate list */
};
@@ -816,6 +816,7 @@ static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class,
}
static void pdc_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
if (!ata_port_is_frozen(ap))
pdc_reset_port(ap);
diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c
index cfb9b5b61cd7..4e7f5b2ff3f6 100644
--- a/drivers/ata/sata_qstor.c
+++ b/drivers/ata/sata_qstor.c
@@ -146,8 +146,7 @@ static const struct ata_port_info qs_port_info[] = {
};
static const struct pci_device_id qs_ata_pci_tbl[] = {
- { PCI_VDEVICE(PDC, 0x2068), board_2068_idx },
-
+ { PCI_VDEVICE(PDC, 0x2068), .driver_data = board_2068_idx },
{ } /* terminate list */
};
@@ -220,6 +219,7 @@ static int qs_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val)
}
static void qs_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
qs_enter_reg_mode(ap);
ata_sff_error_handler(ap);
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c
index 1b6dc950a42a..8837e7c37d4c 100644
--- a/drivers/ata/sata_sil.c
+++ b/drivers/ata/sata_sil.c
@@ -112,14 +112,13 @@ static void sil_thaw(struct ata_port *ap);
static const struct pci_device_id sil_pci_tbl[] = {
- { PCI_VDEVICE(CMD, 0x3112), sil_3112 },
- { PCI_VDEVICE(CMD, 0x0240), sil_3112 },
- { PCI_VDEVICE(CMD, 0x3512), sil_3512 },
- { PCI_VDEVICE(CMD, 0x3114), sil_3114 },
- { PCI_VDEVICE(ATI, 0x436e), sil_3112 },
- { PCI_VDEVICE(ATI, 0x4379), sil_3112_no_sata_irq },
- { PCI_VDEVICE(ATI, 0x437a), sil_3112_no_sata_irq },
-
+ { PCI_VDEVICE(CMD, 0x3112), .driver_data = sil_3112 },
+ { PCI_VDEVICE(CMD, 0x0240), .driver_data = sil_3112 },
+ { PCI_VDEVICE(CMD, 0x3512), .driver_data = sil_3512 },
+ { PCI_VDEVICE(CMD, 0x3114), .driver_data = sil_3114 },
+ { PCI_VDEVICE(ATI, 0x436e), .driver_data = sil_3112 },
+ { PCI_VDEVICE(ATI, 0x4379), .driver_data = sil_3112_no_sata_irq },
+ { PCI_VDEVICE(ATI, 0x437a), .driver_data = sil_3112_no_sata_irq },
{ } /* terminate list */
};
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
index 57f1081b86db..38291ae772c9 100644
--- a/drivers/ata/sata_sil24.c
+++ b/drivers/ata/sata_sil24.c
@@ -351,14 +351,13 @@ static int sil24_port_resume(struct ata_port *ap);
#endif
static const struct pci_device_id sil24_pci_tbl[] = {
- { PCI_VDEVICE(CMD, 0x3124), BID_SIL3124 },
- { PCI_VDEVICE(INTEL, 0x3124), BID_SIL3124 },
- { PCI_VDEVICE(CMD, 0x3132), BID_SIL3132 },
- { PCI_VDEVICE(CMD, 0x0242), BID_SIL3132 },
- { PCI_VDEVICE(CMD, 0x0244), BID_SIL3132 },
- { PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 },
- { PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 },
-
+ { PCI_VDEVICE(CMD, 0x3124), .driver_data = BID_SIL3124 },
+ { PCI_VDEVICE(INTEL, 0x3124), .driver_data = BID_SIL3124 },
+ { PCI_VDEVICE(CMD, 0x3132), .driver_data = BID_SIL3132 },
+ { PCI_VDEVICE(CMD, 0x0242), .driver_data = BID_SIL3132 },
+ { PCI_VDEVICE(CMD, 0x0244), .driver_data = BID_SIL3132 },
+ { PCI_VDEVICE(CMD, 0x3131), .driver_data = BID_SIL3131 },
+ { PCI_VDEVICE(CMD, 0x3531), .driver_data = BID_SIL3131 },
{ } /* terminate list */
};
@@ -1171,6 +1170,7 @@ static irqreturn_t sil24_interrupt(int irq, void *dev_instance)
}
static void sil24_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
struct sil24_port_priv *pp = ap->private_data;
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c
index b8b6d9eff3b8..9deb8060101a 100644
--- a/drivers/ata/sata_sis.c
+++ b/drivers/ata/sata_sis.c
@@ -51,13 +51,31 @@ static int sis_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
static int sis_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
static const struct pci_device_id sis_pci_tbl[] = {
- { PCI_VDEVICE(SI, 0x0180), sis_180 }, /* SiS 964/180 */
- { PCI_VDEVICE(SI, 0x0181), sis_180 }, /* SiS 964/180 */
- { PCI_VDEVICE(SI, 0x0182), sis_180 }, /* SiS 965/965L */
- { PCI_VDEVICE(SI, 0x0183), sis_180 }, /* SiS 965/965L */
- { PCI_VDEVICE(SI, 0x1182), sis_180 }, /* SiS 966/680 */
- { PCI_VDEVICE(SI, 0x1183), sis_180 }, /* SiS 966/966L/968/680 */
-
+ {
+ /* SiS 964/180 */
+ PCI_VDEVICE(SI, 0x0180),
+ .driver_data = sis_180,
+ }, {
+ /* SiS 964/180 */
+ PCI_VDEVICE(SI, 0x0181),
+ .driver_data = sis_180,
+ }, {
+ /* SiS 965/965L */
+ PCI_VDEVICE(SI, 0x0182),
+ .driver_data = sis_180,
+ }, {
+ /* SiS 965/965L */
+ PCI_VDEVICE(SI, 0x0183),
+ .driver_data = sis_180,
+ }, {
+ /* SiS 966/680 */
+ PCI_VDEVICE(SI, 0x1182),
+ .driver_data = sis_180,
+ }, {
+ /* SiS 966/966L/968/680 */
+ PCI_VDEVICE(SI, 0x1183),
+ .driver_data = sis_180,
+ },
{ } /* terminate list */
};
diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c
index c5d6aa36c9c3..1f5ce36701c7 100644
--- a/drivers/ata/sata_svw.c
+++ b/drivers/ata/sata_svw.c
@@ -500,14 +500,13 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en
* controller
* */
static const struct pci_device_id k2_sata_pci_tbl[] = {
- { PCI_VDEVICE(SERVERWORKS, 0x0240), chip_svw4 },
- { PCI_VDEVICE(SERVERWORKS, 0x0241), chip_svw8 },
- { PCI_VDEVICE(SERVERWORKS, 0x0242), chip_svw4 },
- { PCI_VDEVICE(SERVERWORKS, 0x024a), chip_svw4 },
- { PCI_VDEVICE(SERVERWORKS, 0x024b), chip_svw4 },
- { PCI_VDEVICE(SERVERWORKS, 0x0410), chip_svw42 },
- { PCI_VDEVICE(SERVERWORKS, 0x0411), chip_svw43 },
-
+ { PCI_VDEVICE(SERVERWORKS, 0x0240), .driver_data = chip_svw4 },
+ { PCI_VDEVICE(SERVERWORKS, 0x0241), .driver_data = chip_svw8 },
+ { PCI_VDEVICE(SERVERWORKS, 0x0242), .driver_data = chip_svw4 },
+ { PCI_VDEVICE(SERVERWORKS, 0x024a), .driver_data = chip_svw4 },
+ { PCI_VDEVICE(SERVERWORKS, 0x024b), .driver_data = chip_svw4 },
+ { PCI_VDEVICE(SERVERWORKS, 0x0410), .driver_data = chip_svw42 },
+ { PCI_VDEVICE(SERVERWORKS, 0x0411), .driver_data = chip_svw43 },
{ }
};
diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c
index 0986ebd1eb4e..cab40c10ad6b 100644
--- a/drivers/ata/sata_sx4.c
+++ b/drivers/ata/sata_sx4.c
@@ -267,8 +267,7 @@ static const struct ata_port_info pdc_port_info[] = {
};
static const struct pci_device_id pdc_sata_pci_tbl[] = {
- { PCI_VDEVICE(PROMISE, 0x6622), board_20621 },
-
+ { PCI_VDEVICE(PROMISE, 0x6622), .driver_data = board_20621 },
{ } /* terminate list */
};
@@ -853,6 +852,7 @@ static int pdc_softreset(struct ata_link *link, unsigned int *class,
}
static void pdc_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
if (!ata_port_is_frozen(ap))
pdc_reset_port(ap);
diff --git a/drivers/ata/sata_uli.c b/drivers/ata/sata_uli.c
index 44985796cc47..122133199ea7 100644
--- a/drivers/ata/sata_uli.c
+++ b/drivers/ata/sata_uli.c
@@ -45,10 +45,9 @@ static int uli_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
static int uli_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
static const struct pci_device_id uli_pci_tbl[] = {
- { PCI_VDEVICE(AL, 0x5289), uli_5289 },
- { PCI_VDEVICE(AL, 0x5287), uli_5287 },
- { PCI_VDEVICE(AL, 0x5281), uli_5281 },
-
+ { PCI_VDEVICE(AL, 0x5289), .driver_data = uli_5289 },
+ { PCI_VDEVICE(AL, 0x5287), .driver_data = uli_5287 },
+ { PCI_VDEVICE(AL, 0x5281), .driver_data = uli_5281 },
{ } /* terminate list */
};
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c
index 68e9003ec2d4..cfd8ff1f529c 100644
--- a/drivers/ata/sata_via.c
+++ b/drivers/ata/sata_via.c
@@ -85,15 +85,35 @@ static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev);
static void vt6421_error_handler(struct ata_port *ap);
static const struct pci_device_id svia_pci_tbl[] = {
- { PCI_VDEVICE(VIA, 0x5337), vt6420 },
- { PCI_VDEVICE(VIA, 0x0591), vt6420 }, /* 2 sata chnls (Master) */
- { PCI_VDEVICE(VIA, 0x3149), vt6420 }, /* 2 sata chnls (Master) */
- { PCI_VDEVICE(VIA, 0x3249), vt6421 }, /* 2 sata chnls, 1 pata chnl */
- { PCI_VDEVICE(VIA, 0x5372), vt6420 },
- { PCI_VDEVICE(VIA, 0x7372), vt6420 },
- { PCI_VDEVICE(VIA, 0x5287), vt8251 }, /* 2 sata chnls (Master/Slave) */
- { PCI_VDEVICE(VIA, 0x9000), vt8251 },
-
+ {
+ PCI_VDEVICE(VIA, 0x5337),
+ .driver_data = vt6420,
+ }, {
+ /* 2 sata chnls (Master) */
+ PCI_VDEVICE(VIA, 0x0591),
+ .driver_data = vt6420,
+ }, {
+ /* 2 sata chnls (Master) */
+ PCI_VDEVICE(VIA, 0x3149),
+ .driver_data = vt6420,
+ }, {
+ /* 2 sata chnls, 1 pata chnl */
+ PCI_VDEVICE(VIA, 0x3249),
+ .driver_data = vt6421,
+ }, {
+ PCI_VDEVICE(VIA, 0x5372),
+ .driver_data = vt6420,
+ }, {
+ PCI_VDEVICE(VIA, 0x7372),
+ .driver_data = vt6420,
+ }, {
+ /* 2 sata chnls (Master/Slave) */
+ PCI_VDEVICE(VIA, 0x5287),
+ .driver_data = vt8251,
+ }, {
+ PCI_VDEVICE(VIA, 0x9000),
+ .driver_data = vt8251,
+ },
{ } /* terminate list */
};
@@ -573,6 +593,7 @@ static irqreturn_t vt642x_interrupt(int irq, void *dev_instance)
}
static void vt6421_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex)
{
struct svia_priv *hpriv = ap->host->private_data;
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
diff --git a/drivers/ata/sata_vsc.c b/drivers/ata/sata_vsc.c
index a53a2dfc1e17..606284a6d387 100644
--- a/drivers/ata/sata_vsc.c
+++ b/drivers/ata/sata_vsc.c
@@ -400,11 +400,15 @@ static int vsc_sata_init_one(struct pci_dev *pdev,
}
static const struct pci_device_id vsc_sata_pci_tbl[] = {
- { PCI_VENDOR_ID_VITESSE, 0x7174,
- PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 },
- { PCI_VENDOR_ID_INTEL, 0x3200,
- PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 },
-
+ {
+ PCI_DEVICE(PCI_VENDOR_ID_VITESSE, 0x7174),
+ .class = 0x10600,
+ .class_mask = 0xFFFFFF,
+ }, {
+ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3200),
+ .class = 0x10600,
+ .class_mask = 0xFFFFFF,
+ },
{ } /* terminate list */
};
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 127229fbd1a6..96e626d6a7ca 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -984,7 +984,8 @@ struct ata_port_operations {
void (*thaw)(struct ata_port *ap);
struct ata_reset_operations reset;
struct ata_reset_operations pmp_reset;
- void (*error_handler)(struct ata_port *ap);
+ void (*error_handler)(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex);
void (*lost_interrupt)(struct ata_port *ap);
void (*post_internal_cmd)(struct ata_queued_cmd *qc);
void (*sched_eh)(struct ata_port *ap);
@@ -1314,7 +1315,8 @@ extern int ata_tport_add(struct device *parent, struct ata_port *ap);
extern void ata_tport_delete(struct ata_port *ap);
int ata_sas_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim,
struct ata_port *ap);
-extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap);
+extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap)
+ __must_hold(ap->lock);
extern void ata_tf_to_fis(const struct ata_taskfile *tf,
u8 pmp, int is_cmd, u8 *fis);
extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);
@@ -1419,7 +1421,8 @@ extern void ata_eh_thaw_port(struct ata_port *ap);
extern void ata_eh_qc_complete(struct ata_queued_cmd *qc);
extern void ata_eh_qc_retry(struct ata_queued_cmd *qc);
-extern void ata_std_error_handler(struct ata_port *ap);
+extern void ata_std_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex);
extern void ata_std_sched_eh(struct ata_port *ap);
extern void ata_std_end_eh(struct ata_port *ap);
extern int ata_link_nr_enabled(struct ata_link *link);
@@ -1999,7 +2002,8 @@ extern void ata_timing_merge(const struct ata_timing *,
extern const struct ata_port_operations sata_pmp_port_ops;
extern int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc);
-extern void sata_pmp_error_handler(struct ata_port *ap);
+extern void sata_pmp_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex);
#else /* CONFIG_SATA_PMP */
@@ -2063,7 +2067,8 @@ extern int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
unsigned long deadline);
extern void ata_sff_postreset(struct ata_link *link, unsigned int *classes);
extern void ata_sff_drain_fifo(struct ata_queued_cmd *qc);
-extern void ata_sff_error_handler(struct ata_port *ap);
+extern void ata_sff_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex);
extern void ata_sff_std_ports(struct ata_ioports *ioaddr);
#ifdef CONFIG_PCI
extern int ata_pci_sff_init_host(struct ata_host *host);
@@ -2093,7 +2098,8 @@ extern enum ata_completion_errors ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *
extern unsigned int ata_bmdma_port_intr(struct ata_port *ap,
struct ata_queued_cmd *qc);
extern irqreturn_t ata_bmdma_interrupt(int irq, void *dev_instance);
-extern void ata_bmdma_error_handler(struct ata_port *ap);
+extern void ata_bmdma_error_handler(struct ata_port *ap)
+ __must_hold(&ap->host->eh_mutex);
extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc);
extern void ata_bmdma_irq_clear(struct ata_port *ap);
extern void ata_bmdma_setup(struct ata_queued_cmd *qc);