ahci/pata_jmicron: match class not function number

Make jmiron_ata quirk update pdev->class after programming the device
and update ahci and pata_jmicron such that they match class code
instead of checking function number manually. For ahci, it matches
for vendor and class. For pata_jmicron, it matches vendor, device and
class as IDE class isn't as well defined as AHCI class.

This makes jmicron device matching more conventional and script
friendly.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Tejun Heo and committed by Jeff Garzik e34bb370 5ee2ae7f

+17 -23
+3 -13
drivers/ata/ahci.c
··· 384 384 { PCI_VDEVICE(INTEL, 0x294d), board_ahci_pi }, /* ICH9 */ 385 385 { PCI_VDEVICE(INTEL, 0x294e), board_ahci_pi }, /* ICH9M */ 386 386 387 - /* JMicron */ 388 - { PCI_VDEVICE(JMICRON, 0x2360), board_ahci_ign_iferr }, /* JMB360 */ 389 - { PCI_VDEVICE(JMICRON, 0x2361), board_ahci_ign_iferr }, /* JMB361 */ 390 - { PCI_VDEVICE(JMICRON, 0x2363), board_ahci_ign_iferr }, /* JMB363 */ 391 - { PCI_VDEVICE(JMICRON, 0x2365), board_ahci_ign_iferr }, /* JMB365 */ 392 - { PCI_VDEVICE(JMICRON, 0x2366), board_ahci_ign_iferr }, /* JMB366 */ 387 + /* JMicron 360/1/3/5/6, match class to avoid IDE function */ 388 + { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 389 + PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr }, 393 390 394 391 /* ATI */ 395 392 { PCI_VDEVICE(ATI, 0x4380), board_ahci }, /* ATI SB600 non-raid */ ··· 1661 1664 1662 1665 if (!printed_version++) 1663 1666 dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); 1664 - 1665 - if (pdev->vendor == PCI_VENDOR_ID_JMICRON) { 1666 - /* Function 1 is the PATA controller except on the 368, where 1667 - we are not AHCI anyway */ 1668 - if (PCI_FUNC(pdev->devfn)) 1669 - return -ENODEV; 1670 - } 1671 1667 1672 1668 rc = pcim_enable_device(pdev); 1673 1669 if (rc)
+10 -9
drivers/ata/pata_jmicron.c
··· 202 202 }; 203 203 struct ata_port_info *port_info[2] = { &info, &info }; 204 204 205 - /* PATA controller is fn 1, AHCI is fn 0 */ 206 - if (id->driver_data != 368 && PCI_FUNC(pdev->devfn) != 1) 207 - return -ENODEV; 208 - 209 205 return ata_pci_init_one(pdev, port_info, 2); 210 206 } 211 207 212 208 static const struct pci_device_id jmicron_pci_tbl[] = { 213 - { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB361), 361}, 214 - { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB363), 363}, 215 - { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB365), 365}, 216 - { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB366), 366}, 217 - { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB368), 368}, 209 + { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, 210 + PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xffff00, 361 }, 211 + { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, 212 + PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xffff00, 363 }, 213 + { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, 214 + PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xffff00, 365 }, 215 + { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, 216 + PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xffff00, 366 }, 217 + { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, 218 + PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xffff00, 368 }, 218 219 219 220 { } /* terminate list */ 220 221 };
+4 -1
drivers/pci/quirks.c
··· 1220 1220 */ 1221 1221 static void quirk_jmicron_ata(struct pci_dev *pdev) 1222 1222 { 1223 - u32 conf1, conf5; 1223 + u32 conf1, conf5, class; 1224 1224 u8 hdr; 1225 1225 1226 1226 /* Only poke fn 0 */ ··· 1264 1264 pci_read_config_byte(pdev, PCI_HEADER_TYPE, &hdr); 1265 1265 pdev->hdr_type = hdr & 0x7f; 1266 1266 pdev->multifunction = !!(hdr & 0x80); 1267 + 1268 + pci_read_config_dword(pdev, PCI_CLASS_REVISION, &class); 1269 + pdev->class = class >> 8; 1267 1270 } 1268 1271 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB360, quirk_jmicron_ata); 1269 1272 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, quirk_jmicron_ata);