diff options
Diffstat (limited to 'drivers/ata/ata_piix.c')
-rw-r--r-- | drivers/ata/ata_piix.c | 79 |
1 files changed, 37 insertions, 42 deletions
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 3183b3f38e49..024e6d52eab2 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -316,7 +316,6 @@ static const struct ata_port_operations piix_pata_ops = { | |||
316 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | 316 | .post_internal_cmd = ata_bmdma_post_internal_cmd, |
317 | .cable_detect = ata_cable_40wire, | 317 | .cable_detect = ata_cable_40wire, |
318 | 318 | ||
319 | .irq_handler = ata_interrupt, | ||
320 | .irq_clear = ata_bmdma_irq_clear, | 319 | .irq_clear = ata_bmdma_irq_clear, |
321 | .irq_on = ata_irq_on, | 320 | .irq_on = ata_irq_on, |
322 | 321 | ||
@@ -348,7 +347,6 @@ static const struct ata_port_operations ich_pata_ops = { | |||
348 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | 347 | .post_internal_cmd = ata_bmdma_post_internal_cmd, |
349 | .cable_detect = ich_pata_cable_detect, | 348 | .cable_detect = ich_pata_cable_detect, |
350 | 349 | ||
351 | .irq_handler = ata_interrupt, | ||
352 | .irq_clear = ata_bmdma_irq_clear, | 350 | .irq_clear = ata_bmdma_irq_clear, |
353 | .irq_on = ata_irq_on, | 351 | .irq_on = ata_irq_on, |
354 | 352 | ||
@@ -375,7 +373,6 @@ static const struct ata_port_operations piix_sata_ops = { | |||
375 | .error_handler = ata_bmdma_error_handler, | 373 | .error_handler = ata_bmdma_error_handler, |
376 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | 374 | .post_internal_cmd = ata_bmdma_post_internal_cmd, |
377 | 375 | ||
378 | .irq_handler = ata_interrupt, | ||
379 | .irq_clear = ata_bmdma_irq_clear, | 376 | .irq_clear = ata_bmdma_irq_clear, |
380 | .irq_on = ata_irq_on, | 377 | .irq_on = ata_irq_on, |
381 | 378 | ||
@@ -521,7 +518,6 @@ static const struct piix_map_db *piix_map_db_table[] = { | |||
521 | static struct ata_port_info piix_port_info[] = { | 518 | static struct ata_port_info piix_port_info[] = { |
522 | [piix_pata_mwdma] = /* PIIX3 MWDMA only */ | 519 | [piix_pata_mwdma] = /* PIIX3 MWDMA only */ |
523 | { | 520 | { |
524 | .sht = &piix_sht, | ||
525 | .flags = PIIX_PATA_FLAGS, | 521 | .flags = PIIX_PATA_FLAGS, |
526 | .pio_mask = 0x1f, /* pio0-4 */ | 522 | .pio_mask = 0x1f, /* pio0-4 */ |
527 | .mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ | 523 | .mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ |
@@ -530,7 +526,6 @@ static struct ata_port_info piix_port_info[] = { | |||
530 | 526 | ||
531 | [piix_pata_33] = /* PIIX4 at 33MHz */ | 527 | [piix_pata_33] = /* PIIX4 at 33MHz */ |
532 | { | 528 | { |
533 | .sht = &piix_sht, | ||
534 | .flags = PIIX_PATA_FLAGS, | 529 | .flags = PIIX_PATA_FLAGS, |
535 | .pio_mask = 0x1f, /* pio0-4 */ | 530 | .pio_mask = 0x1f, /* pio0-4 */ |
536 | .mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ | 531 | .mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ |
@@ -540,7 +535,6 @@ static struct ata_port_info piix_port_info[] = { | |||
540 | 535 | ||
541 | [ich_pata_33] = /* ICH0 - ICH at 33Mhz*/ | 536 | [ich_pata_33] = /* ICH0 - ICH at 33Mhz*/ |
542 | { | 537 | { |
543 | .sht = &piix_sht, | ||
544 | .flags = PIIX_PATA_FLAGS, | 538 | .flags = PIIX_PATA_FLAGS, |
545 | .pio_mask = 0x1f, /* pio 0-4 */ | 539 | .pio_mask = 0x1f, /* pio 0-4 */ |
546 | .mwdma_mask = 0x06, /* Check: maybe 0x07 */ | 540 | .mwdma_mask = 0x06, /* Check: maybe 0x07 */ |
@@ -550,7 +544,6 @@ static struct ata_port_info piix_port_info[] = { | |||
550 | 544 | ||
551 | [ich_pata_66] = /* ICH controllers up to 66MHz */ | 545 | [ich_pata_66] = /* ICH controllers up to 66MHz */ |
552 | { | 546 | { |
553 | .sht = &piix_sht, | ||
554 | .flags = PIIX_PATA_FLAGS, | 547 | .flags = PIIX_PATA_FLAGS, |
555 | .pio_mask = 0x1f, /* pio 0-4 */ | 548 | .pio_mask = 0x1f, /* pio 0-4 */ |
556 | .mwdma_mask = 0x06, /* MWDMA0 is broken on chip */ | 549 | .mwdma_mask = 0x06, /* MWDMA0 is broken on chip */ |
@@ -560,7 +553,6 @@ static struct ata_port_info piix_port_info[] = { | |||
560 | 553 | ||
561 | [ich_pata_100] = | 554 | [ich_pata_100] = |
562 | { | 555 | { |
563 | .sht = &piix_sht, | ||
564 | .flags = PIIX_PATA_FLAGS | PIIX_FLAG_CHECKINTR, | 556 | .flags = PIIX_PATA_FLAGS | PIIX_FLAG_CHECKINTR, |
565 | .pio_mask = 0x1f, /* pio0-4 */ | 557 | .pio_mask = 0x1f, /* pio0-4 */ |
566 | .mwdma_mask = 0x06, /* mwdma1-2 */ | 558 | .mwdma_mask = 0x06, /* mwdma1-2 */ |
@@ -570,7 +562,6 @@ static struct ata_port_info piix_port_info[] = { | |||
570 | 562 | ||
571 | [ich5_sata] = | 563 | [ich5_sata] = |
572 | { | 564 | { |
573 | .sht = &piix_sht, | ||
574 | .flags = PIIX_SATA_FLAGS, | 565 | .flags = PIIX_SATA_FLAGS, |
575 | .pio_mask = 0x1f, /* pio0-4 */ | 566 | .pio_mask = 0x1f, /* pio0-4 */ |
576 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 567 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -580,7 +571,6 @@ static struct ata_port_info piix_port_info[] = { | |||
580 | 571 | ||
581 | [ich6_sata] = | 572 | [ich6_sata] = |
582 | { | 573 | { |
583 | .sht = &piix_sht, | ||
584 | .flags = PIIX_SATA_FLAGS, | 574 | .flags = PIIX_SATA_FLAGS, |
585 | .pio_mask = 0x1f, /* pio0-4 */ | 575 | .pio_mask = 0x1f, /* pio0-4 */ |
586 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 576 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -590,7 +580,6 @@ static struct ata_port_info piix_port_info[] = { | |||
590 | 580 | ||
591 | [ich6_sata_ahci] = | 581 | [ich6_sata_ahci] = |
592 | { | 582 | { |
593 | .sht = &piix_sht, | ||
594 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, | 583 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, |
595 | .pio_mask = 0x1f, /* pio0-4 */ | 584 | .pio_mask = 0x1f, /* pio0-4 */ |
596 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 585 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -600,7 +589,6 @@ static struct ata_port_info piix_port_info[] = { | |||
600 | 589 | ||
601 | [ich6m_sata_ahci] = | 590 | [ich6m_sata_ahci] = |
602 | { | 591 | { |
603 | .sht = &piix_sht, | ||
604 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, | 592 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, |
605 | .pio_mask = 0x1f, /* pio0-4 */ | 593 | .pio_mask = 0x1f, /* pio0-4 */ |
606 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 594 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -610,7 +598,6 @@ static struct ata_port_info piix_port_info[] = { | |||
610 | 598 | ||
611 | [ich8_sata_ahci] = | 599 | [ich8_sata_ahci] = |
612 | { | 600 | { |
613 | .sht = &piix_sht, | ||
614 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, | 601 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, |
615 | .pio_mask = 0x1f, /* pio0-4 */ | 602 | .pio_mask = 0x1f, /* pio0-4 */ |
616 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 603 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -620,7 +607,6 @@ static struct ata_port_info piix_port_info[] = { | |||
620 | 607 | ||
621 | [ich8_2port_sata] = | 608 | [ich8_2port_sata] = |
622 | { | 609 | { |
623 | .sht = &piix_sht, | ||
624 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, | 610 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, |
625 | .pio_mask = 0x1f, /* pio0-4 */ | 611 | .pio_mask = 0x1f, /* pio0-4 */ |
626 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 612 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -630,7 +616,6 @@ static struct ata_port_info piix_port_info[] = { | |||
630 | 616 | ||
631 | [tolapai_sata_ahci] = | 617 | [tolapai_sata_ahci] = |
632 | { | 618 | { |
633 | .sht = &piix_sht, | ||
634 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, | 619 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, |
635 | .pio_mask = 0x1f, /* pio0-4 */ | 620 | .pio_mask = 0x1f, /* pio0-4 */ |
636 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 621 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -640,7 +625,6 @@ static struct ata_port_info piix_port_info[] = { | |||
640 | 625 | ||
641 | [ich8m_apple_sata_ahci] = | 626 | [ich8m_apple_sata_ahci] = |
642 | { | 627 | { |
643 | .sht = &piix_sht, | ||
644 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, | 628 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_AHCI, |
645 | .pio_mask = 0x1f, /* pio0-4 */ | 629 | .pio_mask = 0x1f, /* pio0-4 */ |
646 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 630 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -1256,10 +1240,10 @@ static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev) | |||
1256 | return no_piix_dma; | 1240 | return no_piix_dma; |
1257 | } | 1241 | } |
1258 | 1242 | ||
1259 | static void __devinit piix_init_pcs(struct pci_dev *pdev, | 1243 | static void __devinit piix_init_pcs(struct ata_host *host, |
1260 | struct ata_port_info *pinfo, | ||
1261 | const struct piix_map_db *map_db) | 1244 | const struct piix_map_db *map_db) |
1262 | { | 1245 | { |
1246 | struct pci_dev *pdev = to_pci_dev(host->dev); | ||
1263 | u16 pcs, new_pcs; | 1247 | u16 pcs, new_pcs; |
1264 | 1248 | ||
1265 | pci_read_config_word(pdev, ICH5_PCS, &pcs); | 1249 | pci_read_config_word(pdev, ICH5_PCS, &pcs); |
@@ -1273,11 +1257,10 @@ static void __devinit piix_init_pcs(struct pci_dev *pdev, | |||
1273 | } | 1257 | } |
1274 | } | 1258 | } |
1275 | 1259 | ||
1276 | static void __devinit piix_init_sata_map(struct pci_dev *pdev, | 1260 | static const int *__devinit piix_init_sata_map(struct pci_dev *pdev, |
1277 | struct ata_port_info *pinfo, | 1261 | struct ata_port_info *pinfo, |
1278 | const struct piix_map_db *map_db) | 1262 | const struct piix_map_db *map_db) |
1279 | { | 1263 | { |
1280 | struct piix_host_priv *hpriv = pinfo[0].private_data; | ||
1281 | const int *map; | 1264 | const int *map; |
1282 | int i, invalid_map = 0; | 1265 | int i, invalid_map = 0; |
1283 | u8 map_value; | 1266 | u8 map_value; |
@@ -1301,7 +1284,6 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev, | |||
1301 | case IDE: | 1284 | case IDE: |
1302 | WARN_ON((i & 1) || map[i + 1] != IDE); | 1285 | WARN_ON((i & 1) || map[i + 1] != IDE); |
1303 | pinfo[i / 2] = piix_port_info[ich_pata_100]; | 1286 | pinfo[i / 2] = piix_port_info[ich_pata_100]; |
1304 | pinfo[i / 2].private_data = hpriv; | ||
1305 | i++; | 1287 | i++; |
1306 | printk(" IDE IDE"); | 1288 | printk(" IDE IDE"); |
1307 | break; | 1289 | break; |
@@ -1319,7 +1301,7 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev, | |||
1319 | dev_printk(KERN_ERR, &pdev->dev, | 1301 | dev_printk(KERN_ERR, &pdev->dev, |
1320 | "invalid MAP value %u\n", map_value); | 1302 | "invalid MAP value %u\n", map_value); |
1321 | 1303 | ||
1322 | hpriv->map = map; | 1304 | return map; |
1323 | } | 1305 | } |
1324 | 1306 | ||
1325 | static void piix_iocfg_bit18_quirk(struct pci_dev *pdev) | 1307 | static void piix_iocfg_bit18_quirk(struct pci_dev *pdev) |
@@ -1378,8 +1360,10 @@ static int piix_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1378 | struct device *dev = &pdev->dev; | 1360 | struct device *dev = &pdev->dev; |
1379 | struct ata_port_info port_info[2]; | 1361 | struct ata_port_info port_info[2]; |
1380 | const struct ata_port_info *ppi[] = { &port_info[0], &port_info[1] }; | 1362 | const struct ata_port_info *ppi[] = { &port_info[0], &port_info[1] }; |
1381 | struct piix_host_priv *hpriv; | ||
1382 | unsigned long port_flags; | 1363 | unsigned long port_flags; |
1364 | struct ata_host *host; | ||
1365 | struct piix_host_priv *hpriv; | ||
1366 | int rc; | ||
1383 | 1367 | ||
1384 | if (!printed_version++) | 1368 | if (!printed_version++) |
1385 | dev_printk(KERN_DEBUG, &pdev->dev, | 1369 | dev_printk(KERN_DEBUG, &pdev->dev, |
@@ -1389,17 +1373,31 @@ static int piix_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1389 | if (!in_module_init) | 1373 | if (!in_module_init) |
1390 | return -ENODEV; | 1374 | return -ENODEV; |
1391 | 1375 | ||
1376 | port_info[0] = piix_port_info[ent->driver_data]; | ||
1377 | port_info[1] = piix_port_info[ent->driver_data]; | ||
1378 | |||
1379 | port_flags = port_info[0].flags; | ||
1380 | |||
1381 | /* enable device and prepare host */ | ||
1382 | rc = pcim_enable_device(pdev); | ||
1383 | if (rc) | ||
1384 | return rc; | ||
1385 | |||
1386 | /* SATA map init can change port_info, do it before prepping host */ | ||
1392 | hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL); | 1387 | hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL); |
1393 | if (!hpriv) | 1388 | if (!hpriv) |
1394 | return -ENOMEM; | 1389 | return -ENOMEM; |
1395 | 1390 | ||
1396 | port_info[0] = piix_port_info[ent->driver_data]; | 1391 | if (port_flags & ATA_FLAG_SATA) |
1397 | port_info[1] = piix_port_info[ent->driver_data]; | 1392 | hpriv->map = piix_init_sata_map(pdev, port_info, |
1398 | port_info[0].private_data = hpriv; | 1393 | piix_map_db_table[ent->driver_data]); |
1399 | port_info[1].private_data = hpriv; | ||
1400 | 1394 | ||
1401 | port_flags = port_info[0].flags; | 1395 | rc = ata_pci_prepare_sff_host(pdev, ppi, &host); |
1396 | if (rc) | ||
1397 | return rc; | ||
1398 | host->private_data = hpriv; | ||
1402 | 1399 | ||
1400 | /* initialize controller */ | ||
1403 | if (port_flags & PIIX_FLAG_AHCI) { | 1401 | if (port_flags & PIIX_FLAG_AHCI) { |
1404 | u8 tmp; | 1402 | u8 tmp; |
1405 | pci_read_config_byte(pdev, PIIX_SCC, &tmp); | 1403 | pci_read_config_byte(pdev, PIIX_SCC, &tmp); |
@@ -1410,13 +1408,8 @@ static int piix_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1410 | } | 1408 | } |
1411 | } | 1409 | } |
1412 | 1410 | ||
1413 | /* Initialize SATA map */ | 1411 | if (port_flags & ATA_FLAG_SATA) |
1414 | if (port_flags & ATA_FLAG_SATA) { | 1412 | piix_init_pcs(host, piix_map_db_table[ent->driver_data]); |
1415 | piix_init_sata_map(pdev, port_info, | ||
1416 | piix_map_db_table[ent->driver_data]); | ||
1417 | piix_init_pcs(pdev, port_info, | ||
1418 | piix_map_db_table[ent->driver_data]); | ||
1419 | } | ||
1420 | 1413 | ||
1421 | /* apply IOCFG bit18 quirk */ | 1414 | /* apply IOCFG bit18 quirk */ |
1422 | piix_iocfg_bit18_quirk(pdev); | 1415 | piix_iocfg_bit18_quirk(pdev); |
@@ -1434,12 +1427,14 @@ static int piix_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1434 | /* This writes into the master table but it does not | 1427 | /* This writes into the master table but it does not |
1435 | really matter for this errata as we will apply it to | 1428 | really matter for this errata as we will apply it to |
1436 | all the PIIX devices on the board */ | 1429 | all the PIIX devices on the board */ |
1437 | port_info[0].mwdma_mask = 0; | 1430 | host->ports[0]->mwdma_mask = 0; |
1438 | port_info[0].udma_mask = 0; | 1431 | host->ports[0]->udma_mask = 0; |
1439 | port_info[1].mwdma_mask = 0; | 1432 | host->ports[1]->mwdma_mask = 0; |
1440 | port_info[1].udma_mask = 0; | 1433 | host->ports[1]->udma_mask = 0; |
1441 | } | 1434 | } |
1442 | return ata_pci_init_one(pdev, ppi); | 1435 | |
1436 | pci_set_master(pdev); | ||
1437 | return ata_pci_activate_sff_host(host, ata_interrupt, &piix_sht); | ||
1443 | } | 1438 | } |
1444 | 1439 | ||
1445 | static int __init piix_init(void) | 1440 | static int __init piix_init(void) |