From 3f8e2146d0c4ea5abc8532ae74b053faf9e77bc8 Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Thu, 23 Apr 2026 18:43:30 +0200 Subject: [PATCH 01/19] ata: libahci: use ahci_nr_ports() helper Use ahci_nr_ports() helper instead of open coding the same. No functional change. Reviewed-by: Damien Le Moal Signed-off-by: Niklas Cassel --- drivers/ata/libahci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index c79abdfcd7a9..7169e9e89034 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c @@ -2636,7 +2636,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, From c4086c6e1af757e1ff26fa2d2926b3ec0195de79 Mon Sep 17 00:00:00 2001 From: liyouhong Date: Tue, 28 Apr 2026 10:09:35 +0800 Subject: [PATCH 02/19] ata: ahci: fail probe if BAR too small for claimed ports When an AHCI controller is disabled in BIOS, its HOST_CAP register may contain a bogus value, e.g. 0xFFFFFFFF. Since CAP.NP (Number of Ports) is a zeroes based 5-bit register field, a value of 0x1f means 32 ports. If CAP.NP claims more ports than can physically fit within the mapped BAR region, accessing port registers beyond the BAR boundary causes a kernel panic. Add validation in ahci_init_one() to check that the BAR size is sufficient for the number of ports claimed in CAP.NP. The check calculates the required MMIO size as: required_size = 0x100 (global registers) + max_ports * 0x80 If required_size exceeds the actual BAR size, the probe fails with -ENODEV, preventing the panic and providing a clear error message. Reported-by: liyouhong Closes: https://lore.kernel.org/all/20260422080322.1006592-1-dayou5941@163.com/ Suggested-by: Damien Le Moal Suggested-by: Niklas Cassel Reviewed-by: Damien Le Moal Signed-off-by: liyouhong [cassel: commit log] Signed-off-by: Niklas Cassel --- drivers/ata/ahci.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 1d73a53370cf..b4e5d347151a 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1888,6 +1888,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 +2006,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); From f4034ae06b7c93d159318663349d372dfe851307 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 5 May 2026 06:23:10 +0200 Subject: [PATCH 03/19] ata: ahci: Move EXPORT_SYMBOL_GPL(ahci_do_softreset) From Documentation/process/coding-style.rst: In source files, separate functions with one blank line. If the function is exported, the **EXPORT** macro for it should follow immediately after the closing function brace line. Hence, move EXPORT_SYMBOL_GPL(ahci_do_softreset) to just below the definition of the ahci_do_softreset() function. Signed-off-by: Bart Van Assche Reviewed-by: Damien Le Moal Signed-off-by: Niklas Cassel --- drivers/ata/libahci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index 7169e9e89034..0c5e5b29bce4 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c @@ -1527,6 +1527,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 +1545,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) { From 5e46e031fe28d931c93c45ac971a80ff124d996b Mon Sep 17 00:00:00 2001 From: Marco Crivellari Date: Thu, 30 Apr 2026 11:29:47 +0200 Subject: [PATCH 04/19] ata: libata-scsi: Move long delayed work on system_dfl_long_wq Currently the code enqueue work items using {queue|mod}_delayed_work(), using system_long_wq. This workqueue should be used when long works are expected, but it is a per-cpu workqueue. This is important because queue_delayed_work() queue the work using: queue_delayed_work_on(WORK_CPU_UNBOUND, ...); Note that WORK_CPU_UNBOUND = NR_CPUS. This would end up calling __queue_delayed_work() that does: if (housekeeping_enabled(HK_TYPE_TIMER)) { // [....] } else { if (likely(cpu == WORK_CPU_UNBOUND)) add_timer_global(timer); else add_timer_on(timer, cpu); } So when cpu == WORK_CPU_UNBOUND the timer is global and is not using a specific CPU. Later, when __queue_work() is called: if (req_cpu == WORK_CPU_UNBOUND) { if (wq->flags & WQ_UNBOUND) cpu = wq_select_unbound_cpu(raw_smp_processor_id()); else cpu = raw_smp_processor_id(); } Because the wq is not unbound, it takes the CPU where the timer fired and enqueue the work on that CPU. The consequence of all of this is that the work can run anywhere, depending on where the timer fired. Recently, a new unbound workqueue specific for long running work has been added: c116737e972e ("workqueue: Add system_dfl_long_wq for long unbound works") So change system_long_wq with system_dfl_long_wq so that the work may benefit from scheduler task placement. Signed-off-by: Marco Crivellari Signed-off-by: Niklas Cassel --- drivers/ata/libata-scsi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index d43207c6e467..1f4a4329fc11 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -4768,7 +4768,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)); } From 28afe01eb75cf8e858b9eecebb0e2e7ee0ceb236 Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Wed, 13 May 2026 10:10:01 +0200 Subject: [PATCH 05/19] ata: libata-eh: queue hotplug work on the system_dfl_long_wq workqueue ata_scsi_port_error_handler() uses schedule_delayed_work() to queue the ap->hotplug_task work. schedule_delayed_work() always uses the system_percpu_wq per-cpu workqueue. ata_scsi_scan_host() queues the ap->hotplug_task work on the unbound system_dfl_long_wq workqueue. It seems counter-intuitive to queue the same work on two different workqueues. Thus, change ata_scsi_port_error_handler() to also queue the ap->hotplug_task work on the system_dfl_long_wq workqueue, such that the work is always queued on the same workqueue. Reviewed-by: Damien Le Moal Signed-off-by: Niklas Cassel --- drivers/ata/libata-eh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index d623eb32ed8b..715bc525b38f 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c @@ -819,7 +819,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"); From fa0f6679c73553d3e457884759ae4c6f220a71de Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Tue, 12 May 2026 13:22:55 -0700 Subject: [PATCH 06/19] ata: pata_arasan_cf: simplify ioremap Use devm_platform_get_and_ioremap_resource() to combine platform_get_resource, request_mem_region, and ioremap. Signed-off-by: Rosen Penev Reviewed-by: Damien Le Moal Signed-off-by: Niklas Cassel --- drivers/ata/pata_arasan_cf.c | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/drivers/ata/pata_arasan_cf.c b/drivers/ata/pata_arasan_cf.c index b1e281b64f57..a77fefd320c2 100644 --- a/drivers/ata/pata_arasan_cf.c +++ b/drivers/ata/pata_arasan_cf.c @@ -803,16 +803,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 +817,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)) { From aa0ae1c35f7b3e9afed2324bed5f5c87ad55b92c Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Thu, 21 May 2026 10:33:29 -0700 Subject: [PATCH 07/19] ata: libata: Fix ata_exec_internal() Some but not all ata_exec_internal() calls happen from the context of the ATA error handler. Commit c0c362b60e25 ("libata: implement cross-port EH exclusion") added ata_eh_release() and ata_eh_acquire() calls in ata_exec_internal(). Calling these functions is necessary if the caller holds the eh_mutex but is not allowed if the caller doesn't hold that mutex. Fix this by only calling ata_eh_release() and ata_eh_acquire() if the caller holds the eh_mutex. An example of an indirect caller of ata_exec_internal() that does not hold the eh_mutex is ata_host_register(). Fixes: c0c362b60e25 ("libata: implement cross-port EH exclusion") Signed-off-by: Bart Van Assche Reviewed-by: Niklas Cassel Reviewed-by: Damien Le Moal Reviewed-by: Hannes Reinecke Signed-off-by: Niklas Cassel --- drivers/ata/libata-core.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 3d0027ec33c2..3e19a00a9239 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; @@ -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); From f80cea847028bb9eb1149badebf9f142d96b2e8b Mon Sep 17 00:00:00 2001 From: TanZheng Date: Thu, 28 May 2026 14:00:50 +0800 Subject: [PATCH 08/19] ata: ahci: use hweight_long() to count port_map bits Replace the open loop used to calculate the number of set bits in the port mapping with the `hweight_long()` function, which simplifies the code without altering its functionality. Signed-off-by: TanZheng Reviewed-by: Damien Le Moal Reviewed-by: Hannes Reinecke Signed-off-by: Niklas Cassel --- drivers/ata/libahci.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index 0c5e5b29bce4..e0af4b5716b3 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. From 4b3c2ca268b0a66093793466e02d8566d642f19c Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Fri, 29 May 2026 11:03:09 -0700 Subject: [PATCH 09/19] ata: libata: Add an argument to ata_eh_reset() Pass the ATA port pointer as first argument to ata_eh_reset(). No functionality has been changed. This patch prepares for enabling lock context analysis. Without this patch, lockdep_assert_held() statements would have to be added before each ata_eh_reset() call because the compiler doesn't know that ap->link.p == ap. See also ata_link_init(). Signed-off-by: Bart Van Assche Signed-off-by: Niklas Cassel --- drivers/ata/libata-eh.c | 6 +++--- drivers/ata/libata-pmp.c | 2 +- drivers/ata/libata.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 715bc525b38f..ecfb9d96249f 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c @@ -2831,10 +2831,9 @@ 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) { - 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; @@ -3882,7 +3881,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; diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index e8540931b4a1..ffd654996067 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c @@ -777,7 +777,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; diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index b5423b6e97de..a5920c10aaca 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h @@ -187,8 +187,8 @@ 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); extern int ata_eh_recover(struct ata_port *ap, struct ata_reset_operations *reset_ops, struct ata_link **r_failed_disk); From 7725c45682abd7a6590676c33c35a7bdfdec6db5 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Fri, 29 May 2026 11:03:10 -0700 Subject: [PATCH 10/19] ata: libata: Document when host->eh_mutex should be held Annotate the following functions with __must_hold(&host->eh_mutex): * All ata_port_operations.error_handler() implementations. * ata_eh_reset() and ata_eh_recover() because these functions call ata_eh_release() and ata_eh_acquire(). * All callers of ata_eh_reset() and ata_eh_recover(). Enable Clang's context analysis. This will cause the build to fail if e.g. a locking bug would be introduced in an error path. This patch should not affect the generated assembler code. Signed-off-by: Bart Van Assche [cassel: drop note about clang 23 from commit log] Signed-off-by: Niklas Cassel --- drivers/ata/Makefile | 2 ++ drivers/ata/ahci.h | 3 ++- drivers/ata/ahci_imx.c | 1 + drivers/ata/libahci.c | 1 + drivers/ata/libata-core.c | 2 ++ drivers/ata/libata-eh.c | 5 +++++ drivers/ata/libata-pmp.c | 3 +++ drivers/ata/libata-sff.c | 2 ++ drivers/ata/libata.h | 12 ++++++++---- drivers/ata/pata_arasan_cf.c | 1 + drivers/ata/sata_dwc_460ex.c | 1 + drivers/ata/sata_fsl.c | 1 + drivers/ata/sata_inic162x.c | 1 + drivers/ata/sata_mv.c | 1 + drivers/ata/sata_nv.c | 2 ++ drivers/ata/sata_promise.c | 1 + drivers/ata/sata_qstor.c | 1 + drivers/ata/sata_sil24.c | 1 + drivers/ata/sata_sx4.c | 1 + drivers/ata/sata_via.c | 1 + include/linux/libata.h | 15 ++++++++++----- 21 files changed, 48 insertions(+), 10 deletions(-) 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/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/libahci.c b/drivers/ata/libahci.c index e0af4b5716b3..6d72eb017b49 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c @@ -2208,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; diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 3e19a00a9239..f68882706fdc 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -6835,6 +6835,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; @@ -6909,6 +6910,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 ecfb9d96249f..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; @@ -2833,6 +2835,7 @@ static bool ata_eh_followup_srst_needed(struct ata_link *link, int rc) 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_link *slave = ap->slave_link; struct ata_eh_context *ehc = &link->eh_context; @@ -3815,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; @@ -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 ffd654996067..736eaf0586f7 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c @@ -756,6 +756,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; @@ -921,6 +922,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 +1100,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-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 a5920c10aaca..d0b0ecd3d086 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h @@ -173,8 +173,10 @@ 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); @@ -188,10 +190,12 @@ 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_port *ap, struct ata_link *link, - int classify, struct ata_reset_operations *reset_ops); + 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_arasan_cf.c b/drivers/ata/pata_arasan_cf.c index a77fefd320c2..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; 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 @@ static int sata_fsl_softreset(struct ata_link *link, unsigned int *class, } 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..f6942fd80bae 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; diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 841e7de2bba6..19b927065868 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c @@ -1626,6 +1626,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 +1796,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..c5fad448bafc 100644 --- a/drivers/ata/sata_promise.c +++ b/drivers/ata/sata_promise.c @@ -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..1add7a7d5ff6 100644 --- a/drivers/ata/sata_qstor.c +++ b/drivers/ata/sata_qstor.c @@ -220,6 +220,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_sil24.c b/drivers/ata/sata_sil24.c index 57f1081b86db..b4549ba968a4 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c @@ -1171,6 +1171,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_sx4.c b/drivers/ata/sata_sx4.c index 0986ebd1eb4e..227dc1d4e85b 100644 --- a/drivers/ata/sata_sx4.c +++ b/drivers/ata/sata_sx4.c @@ -853,6 +853,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_via.c b/drivers/ata/sata_via.c index 68e9003ec2d4..b672a1e05867 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c @@ -573,6 +573,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/include/linux/libata.h b/include/linux/libata.h index 127229fbd1a6..7091bc903c05 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); @@ -1419,7 +1420,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 +2001,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 +2066,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 +2097,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); From b2412353ad10c480531055dac1f3c5f60c189331 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Thu, 28 May 2026 19:28:58 +0200 Subject: [PATCH 11/19] ata: libata: Pass ap parameter directly to functions in the issuing path Context analysis cannot recognize that qc->ap == ap. Therefore, grow a struct ata_port parameter to the following functions: ata_qc_issue(), __ata_scsi_queuecmd(), and ata_scsi_translate() such that we will be able to enable context analysis in a follow-up commit. No functionality has been changed. Signed-off-by: Bart Van Assche Reviewed-by: Hannes Reinecke Signed-off-by: Niklas Cassel --- drivers/ata/libata-core.c | 6 +++--- drivers/ata/libata-sata.c | 2 +- drivers/ata/libata-scsi.c | 16 ++++++++-------- drivers/ata/libata.h | 5 +++-- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index f68882706fdc..938e95138a8f 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -1605,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); @@ -5150,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. @@ -5160,9 +5161,8 @@ 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) { - struct ata_port *ap = qc->ap; struct ata_link *link = qc->dev->link; u8 prot = qc->tf.protocol; diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c index 2ee54d60ea4b..5e5be6bbf32a 100644 --- a/drivers/ata/libata-sata.c +++ b/drivers/ata/libata-sata.c @@ -1379,7 +1379,7 @@ EXPORT_SYMBOL_GPL(ata_sas_sdev_configure); int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap) { 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 1f4a4329fc11..0375c5c2d2f3 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); @@ -1812,7 +1812,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 +1840,7 @@ static int ata_scsi_qc_issue(struct ata_port *ap, struct ata_queued_cmd *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 +1863,8 @@ static int ata_scsi_qc_issue(struct ata_port *ap, struct ata_queued_cmd *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) { - struct ata_port *ap = dev->link->ap; struct ata_queued_cmd *qc; lockdep_assert_held(ap->lock); @@ -4521,9 +4521,9 @@ 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) { - struct ata_port *ap = dev->link->ap; u8 scsi_op = scmd->cmnd[0]; ata_xlat_func_t xlat_func; @@ -4564,7 +4564,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 +4610,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); diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index d0b0ecd3d086..16d0818b2b16 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h @@ -88,7 +88,7 @@ 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); 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,7 +166,8 @@ 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); void ata_scsi_deferred_qc_work(struct work_struct *work); void ata_scsi_requeue_deferred_qc(struct ata_port *ap); From 042f5526cf2c44eac17ed2fa57a9a6e8d30d6279 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Thu, 28 May 2026 19:28:59 +0200 Subject: [PATCH 12/19] ata: Annotate functions in the issuing path with __must_hold() Annotate the following functions used in the issuing path: ata_qc_issue(), ata_sas_queuecmd(), ata_scsi_qc_issue(), ata_scsi_translate(), __ata_scsi_queuecmd() These functions are all used in the issuing path, so context analysis will be able to verify that the ap lock is held, from it is taken in sas_queuecommand() or ata_scsi_queuecmd() all the way down to ata_qc_issue(). Commenting out the spin_lock_irqsave() successfully results in a compiler error on Clang 23. Signed-off-by: Bart Van Assche Co-developed-by: Niklas Cassel Reviewed-by: Hannes Reinecke Signed-off-by: Niklas Cassel --- drivers/ata/libata-core.c | 1 + drivers/ata/libata-sata.c | 1 + drivers/ata/libata-scsi.c | 3 +++ drivers/ata/libata.h | 6 ++++-- include/linux/libata.h | 3 ++- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 938e95138a8f..3b6243f0f91e 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -5162,6 +5162,7 @@ EXPORT_SYMBOL_GPL(ata_qc_get_active); * spin_lock_irqsave(host lock) */ void ata_qc_issue(struct ata_port *ap, struct ata_queued_cmd *qc) + __must_hold(ap->lock) { struct ata_link *link = qc->dev->link; u8 prot = qc->tf.protocol; diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c index 5e5be6bbf32a..b0706c30da05 100644 --- a/drivers/ata/libata-sata.c +++ b/drivers/ata/libata-sata.c @@ -1377,6 +1377,7 @@ 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, ap); diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 0375c5c2d2f3..d54ec1631e9a 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -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; @@ -1864,6 +1865,7 @@ static int ata_scsi_qc_issue(struct ata_port *ap, struct ata_queued_cmd *qc) */ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, ata_xlat_func_t xlat_func, struct ata_port *ap) + __must_hold(ap->lock) { struct ata_queued_cmd *qc; @@ -4523,6 +4525,7 @@ 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_port *ap) + __must_hold(ap->lock) { u8 scsi_op = scmd->cmnd[0]; ata_xlat_func_t xlat_func; diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index 16d0818b2b16..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_port *ap, 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); @@ -167,7 +168,8 @@ 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_port *ap); + 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); diff --git a/include/linux/libata.h b/include/linux/libata.h index 7091bc903c05..96e626d6a7ca 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -1315,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); From cde1e86eec1c5de7b83bfb4e3ae26755e61a54d2 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Fri, 29 May 2026 17:36:25 -0700 Subject: [PATCH 13/19] ata: pata_ep93xx: avoid asm on non ARM The raw ARM asm delay loop prevents COMPILE_TEST builds on non-ARM architectures. Guard it with CONFIG_ARM and provide a cpu_relax() fallback for compilation on other architectures. Signed-off-by: Rosen Penev Signed-off-by: Niklas Cassel --- drivers/ata/pata_ep93xx.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/ata/pata_ep93xx.c b/drivers/ata/pata_ep93xx.c index b2b9e0058333..f7e87d6af264 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, From 8bbb394e611021f8ca90e5932e49b5e923e13824 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Fri, 29 May 2026 17:36:26 -0700 Subject: [PATCH 14/19] ata: pata_ep93xx: use unsigned long for data An int is being encoded as a void pointer but that breaks on 64-bit systems as the type needs to match pointer size. Signed-off-by: Rosen Penev Signed-off-by: Niklas Cassel --- drivers/ata/pata_ep93xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ata/pata_ep93xx.c b/drivers/ata/pata_ep93xx.c index f7e87d6af264..1663dcd00a93 100644 --- a/drivers/ata/pata_ep93xx.c +++ b/drivers/ata/pata_ep93xx.c @@ -977,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; } From 590da526959499e58671f65655825d8a1973ff27 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Fri, 29 May 2026 17:36:27 -0700 Subject: [PATCH 15/19] ata: pata_ep93xx: add COMPILE_TEST support Now that the build failures have been fixed, we can add COMPILE_TEST so the buildbots can find potentially more problems. Signed-off-by: Rosen Penev Signed-off-by: Niklas Cassel --- drivers/ata/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 0a77385b1080a0715f79f2ba7758b59d81ed2e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig=20=28The=20Capable=20Hub=29?= Date: Tue, 9 Jun 2026 18:51:13 +0200 Subject: [PATCH 16/19] ata: pata_isapnp: Drop unused assignments from pnp_device_id array MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Explicitly assigning .driver_data in drivers that don't use this member is silly and a bit irritating. Drop it. Also simplify the list terminator entry to be just empty to match what most other device_id tables do. There is no changed semantic, not even a change in the compiled result. Signed-off-by: Uwe Kleine-König (The Capable Hub) Reviewed-by: Damien Le Moal Signed-off-by: Niklas Cassel --- drivers/ata/pata_isapnp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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); From c62aff1174cf88e10716c7513702443c47551fc6 Mon Sep 17 00:00:00 2001 From: Xu Rao Date: Wed, 10 Jun 2026 13:28:35 +0800 Subject: [PATCH 17/19] ata: libata-pmp: add JMicron JMS562 quirk JMicron JMS562, as used in QNAP QDA-A2AR RAID1 adapters, may keep the exported ATA device not ready while the array is rebuilding. In this state, libata may repeatedly try to softreset and classify the fan-out link. On the affected adapter, this can time out, make PMP/SCR access fail, and eventually disable the fan-out link before the RAID volume is exported. A failing boot shows the fan-out link failing SRST, PMP access timing out, SCR read failing, and the link being disabled: ata4.00: softreset failed (device not ready) ata4.15: qc timeout after 3000 msecs (cmd 0xe4) ata4.00: failed to read SCR 0 (Emask=0x4) ata4.00: failed to recover link after 3 tries, disabling After that, the root filesystem on the exported RAID volume cannot be found. Add JMS562 to the existing JMicron PMP quirk that disables LPM, avoids softreset on fan-out links, and assumes an ATA device. This prevents libata from dropping the exported RAID volume during rebuild recovery. Signed-off-by: Xu Rao Reviewed-by: Damien Le Moal Signed-off-by: Niklas Cassel --- drivers/ata/libata-pmp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index 736eaf0586f7..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. */ From 3b5b35f28e6e05acc0edb5fe0641317f6fc628c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig=20=28The=20Capable=20Hub=29?= Date: Fri, 12 Jun 2026 10:21:47 +0200 Subject: [PATCH 18/19] ata: Drop unused assignments of pci_device_id driver data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The drivers explicitly set the .driver_data member of struct pci_device_id to zero without relying on that value. Drop these unused assignments. While touching these arrays, convert the one driver not using PCI_DEVICE to use that macro and align the array's coding style to what is used most for these. (i.e. break very long lines, a single space in the list terminator and no trailing comma.) This patch doesn't modify the compiled array, only its representation in source form benefits. The former was confirmed with builds on x86 and arm64. Reviewed-by: Damien Le Moal Signed-off-by: Uwe Kleine-König (The Capable Hub) Signed-off-by: Niklas Cassel --- drivers/ata/pata_atp867x.c | 6 +++--- drivers/ata/pata_cmd640.c | 4 ++-- drivers/ata/pata_jmicron.c | 7 +++++-- drivers/ata/pata_macio.c | 12 ++++++------ drivers/ata/pata_ninja32.c | 14 +++++++------- drivers/ata/pata_sch.c | 2 +- drivers/ata/sata_vsc.c | 14 +++++++++----- 7 files changed, 33 insertions(+), 26 deletions(-) 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_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_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/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 */ }; From 21e7b9710a24bd7688c02f136923c89bee2fda5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig=20=28The=20Capable=20Hub=29?= Date: Fri, 12 Jun 2026 10:21:48 +0200 Subject: [PATCH 19/19] ata: Use named initializers for pci_device_id arrays MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While being less compact, using named initializers allows to more easily see which members of the structs are assigned which value without having to lookup the declaration of the struct. And it's also more robust against changes to the struct definition. The mentioned robustness is relevant for a planned change to struct pci_device_id that replaces .driver_data by an anonymous union. Also drop the comma after a few list terminators. This patch doesn't modify the compiled array, only their representation in source form benefits. The former was confirmed with x86 and arm64 builds. Reviewed-by: Damien Le Moal Signed-off-by: Uwe Kleine-König (The Capable Hub) Signed-off-by: Niklas Cassel --- drivers/ata/acard-ahci.c | 8 +- drivers/ata/ahci.c | 1626 ++++++++++++++++++++++++------- drivers/ata/ata_piix.c | 532 ++++++---- drivers/ata/pata_acpi.c | 5 +- drivers/ata/pata_amd.c | 88 +- drivers/ata/pata_artop.c | 11 +- drivers/ata/pata_cmd64x.c | 11 +- drivers/ata/pata_opti.c | 7 +- drivers/ata/pata_pdc2027x.c | 30 +- drivers/ata/pata_pdc202xx_old.c | 13 +- drivers/ata/pata_serverworks.c | 24 +- drivers/ata/pata_sis.c | 1 - drivers/ata/pata_via.c | 19 +- drivers/ata/pdc_adma.c | 3 +- drivers/ata/sata_mv.c | 34 +- drivers/ata/sata_nv.c | 58 +- drivers/ata/sata_promise.c | 34 +- drivers/ata/sata_qstor.c | 3 +- drivers/ata/sata_sil.c | 15 +- drivers/ata/sata_sil24.c | 15 +- drivers/ata/sata_sis.c | 32 +- drivers/ata/sata_svw.c | 15 +- drivers/ata/sata_sx4.c | 3 +- drivers/ata/sata_uli.c | 7 +- drivers/ata/sata_via.c | 38 +- 25 files changed, 1932 insertions(+), 700 deletions(-) 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 b4e5d347151a..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 */ + { + /* 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, + }, + /* 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 */ + { + /* 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, - /* 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 }, + }, { + 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 */ + { + /* 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, - /* - * 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 }, + }, { + 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, - /* 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 }, + }, { + /* Generic, PCI class code for AHCI */ + PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff), + .driver_data = board_ahci, + }, { } /* terminate list */ }; 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/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_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_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_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_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_mv.c b/drivers/ata/sata_mv.c index f6942fd80bae..41647a56a9f4 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c @@ -4274,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 19b927065868..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 */ }; diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c index c5fad448bafc..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, 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), 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, 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), board_20619 }, + { PCI_VDEVICE(PROMISE, 0x6629), .driver_data = board_20619 }, { } /* terminate list */ }; diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c index 1add7a7d5ff6..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 */ }; 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 b4549ba968a4..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 */ }; 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 227dc1d4e85b..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 */ }; 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 b672a1e05867..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 */ };