diff options
-rw-r--r-- | drivers/ide/pci/generic.c | 8 | ||||
-rw-r--r-- | drivers/pci/quirks.c | 49 |
2 files changed, 57 insertions, 0 deletions
diff --git a/drivers/ide/pci/generic.c b/drivers/ide/pci/generic.c index f82e82109728..2f962cfa3f7f 100644 --- a/drivers/ide/pci/generic.c +++ b/drivers/ide/pci/generic.c | |||
@@ -212,6 +212,9 @@ static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_devi | |||
212 | (!(PCI_FUNC(dev->devfn) & 1))) | 212 | (!(PCI_FUNC(dev->devfn) & 1))) |
213 | goto out; | 213 | goto out; |
214 | 214 | ||
215 | if (dev->vendor == PCI_VENDOR_ID_JMICRON && PCI_FUNC(dev->devfn) != 1) | ||
216 | goto out; | ||
217 | |||
215 | pci_read_config_word(dev, PCI_COMMAND, &command); | 218 | pci_read_config_word(dev, PCI_COMMAND, &command); |
216 | if (!(command & PCI_COMMAND_IO)) { | 219 | if (!(command & PCI_COMMAND_IO)) { |
217 | printk(KERN_INFO "Skipping disabled %s IDE controller.\n", d->name); | 220 | printk(KERN_INFO "Skipping disabled %s IDE controller.\n", d->name); |
@@ -239,6 +242,11 @@ static struct pci_device_id generic_pci_tbl[] = { | |||
239 | { PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12}, | 242 | { PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12}, |
240 | { PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13}, | 243 | { PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13}, |
241 | { PCI_VENDOR_ID_NETCELL,PCI_DEVICE_ID_REVOLUTION, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14}, | 244 | { PCI_VENDOR_ID_NETCELL,PCI_DEVICE_ID_REVOLUTION, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14}, |
245 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15}, | ||
246 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16}, | ||
247 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17}, | ||
248 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18}, | ||
249 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19}, | ||
242 | /* Must come last. If you add entries adjust this table appropriately and the init_one code */ | 250 | /* Must come last. If you add entries adjust this table appropriately and the init_one code */ |
243 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 0}, | 251 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 0}, |
244 | { 0, }, | 252 | { 0, }, |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index e9a57afa1a08..de3bbc88fb26 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -1175,6 +1175,55 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_ | |||
1175 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); | 1175 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); |
1176 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); | 1176 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); |
1177 | 1177 | ||
1178 | #if defined(CONFIG_SCSI_SATA) || defined(CONFIG_SCSI_SATA_MODULE) | ||
1179 | |||
1180 | /* | ||
1181 | * If we are using libata we can drive this chip properly but must | ||
1182 | * do this early on to make the additional device appear during | ||
1183 | * the PCI scanning. | ||
1184 | */ | ||
1185 | |||
1186 | static void __devinit quirk_jmicron_dualfn(struct pci_dev *pdev) | ||
1187 | { | ||
1188 | u32 conf; | ||
1189 | u8 hdr; | ||
1190 | |||
1191 | /* Only poke fn 0 */ | ||
1192 | if (PCI_FUNC(pdev->devfn)) | ||
1193 | return; | ||
1194 | |||
1195 | switch(pdev->device) { | ||
1196 | case PCI_DEVICE_ID_JMICRON_JMB365: | ||
1197 | case PCI_DEVICE_ID_JMICRON_JMB366: | ||
1198 | /* Redirect IDE second PATA port to the right spot */ | ||
1199 | pci_read_config_dword(pdev, 0x80, &conf); | ||
1200 | conf |= (1 << 24); | ||
1201 | /* Fall through */ | ||
1202 | pci_write_config_dword(pdev, 0x80, conf); | ||
1203 | case PCI_DEVICE_ID_JMICRON_JMB361: | ||
1204 | case PCI_DEVICE_ID_JMICRON_JMB363: | ||
1205 | pci_read_config_dword(pdev, 0x40, &conf); | ||
1206 | /* Enable dual function mode, AHCI on fn 0, IDE fn1 */ | ||
1207 | /* Set the class codes correctly and then direct IDE 0 */ | ||
1208 | conf &= ~0x000F0200; /* Clear bit 9 and 16-19 */ | ||
1209 | conf |= 0x00C20002; /* Set bit 1, 17, 22, 23 */ | ||
1210 | pci_write_config_dword(pdev, 0x40, conf); | ||
1211 | |||
1212 | /* Reconfigure so that the PCI scanner discovers the | ||
1213 | device is now multifunction */ | ||
1214 | |||
1215 | pci_read_config_byte(pdev, PCI_HEADER_TYPE, &hdr); | ||
1216 | pdev->hdr_type = hdr & 0x7f; | ||
1217 | pdev->multifunction = !!(hdr & 0x80); | ||
1218 | |||
1219 | break; | ||
1220 | } | ||
1221 | } | ||
1222 | |||
1223 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, quirk_jmicron_dualfn); | ||
1224 | |||
1225 | #endif | ||
1226 | |||
1178 | #ifdef CONFIG_X86_IO_APIC | 1227 | #ifdef CONFIG_X86_IO_APIC |
1179 | static void __init quirk_alder_ioapic(struct pci_dev *pdev) | 1228 | static void __init quirk_alder_ioapic(struct pci_dev *pdev) |
1180 | { | 1229 | { |