diff options
| -rw-r--r-- | drivers/scsi/ahci.c | 12 | ||||
| -rw-r--r-- | drivers/scsi/ata_piix.c | 14 | ||||
| -rw-r--r-- | drivers/scsi/libata-core.c | 247 | ||||
| -rw-r--r-- | drivers/scsi/libata-scsi.c | 66 | ||||
| -rw-r--r-- | drivers/scsi/libata.h | 2 | ||||
| -rw-r--r-- | drivers/scsi/sata_nv.c | 24 | ||||
| -rw-r--r-- | drivers/scsi/sata_promise.c | 12 | ||||
| -rw-r--r-- | drivers/scsi/sata_qstor.c | 12 | ||||
| -rw-r--r-- | drivers/scsi/sata_sil.c | 36 | ||||
| -rw-r--r-- | drivers/scsi/sata_sis.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/sata_svw.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/sata_sx4.c | 146 | ||||
| -rw-r--r-- | drivers/scsi/sata_uli.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/sata_via.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/sata_vsc.c | 5 | ||||
| -rw-r--r-- | include/linux/ata.h | 2 | ||||
| -rw-r--r-- | include/linux/libata.h | 8 | ||||
| -rw-r--r-- | include/linux/pci_ids.h | 1 |
18 files changed, 450 insertions, 153 deletions
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c index e3b9692b9688..841f4e2cfe08 100644 --- a/drivers/scsi/ahci.c +++ b/drivers/scsi/ahci.c | |||
| @@ -269,6 +269,8 @@ static struct pci_device_id ahci_pci_tbl[] = { | |||
| 269 | board_ahci }, /* ESB2 */ | 269 | board_ahci }, /* ESB2 */ |
| 270 | { PCI_VENDOR_ID_INTEL, 0x2683, PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 270 | { PCI_VENDOR_ID_INTEL, 0x2683, PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
| 271 | board_ahci }, /* ESB2 */ | 271 | board_ahci }, /* ESB2 */ |
| 272 | { PCI_VENDOR_ID_INTEL, 0x27c6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
| 273 | board_ahci }, /* ICH7-M DH */ | ||
| 272 | { } /* terminate list */ | 274 | { } /* terminate list */ |
| 273 | }; | 275 | }; |
| 274 | 276 | ||
| @@ -584,12 +586,16 @@ static void ahci_intr_error(struct ata_port *ap, u32 irq_stat) | |||
| 584 | 586 | ||
| 585 | static void ahci_eng_timeout(struct ata_port *ap) | 587 | static void ahci_eng_timeout(struct ata_port *ap) |
| 586 | { | 588 | { |
| 587 | void *mmio = ap->host_set->mmio_base; | 589 | struct ata_host_set *host_set = ap->host_set; |
| 590 | void *mmio = host_set->mmio_base; | ||
| 588 | void *port_mmio = ahci_port_base(mmio, ap->port_no); | 591 | void *port_mmio = ahci_port_base(mmio, ap->port_no); |
| 589 | struct ata_queued_cmd *qc; | 592 | struct ata_queued_cmd *qc; |
| 593 | unsigned long flags; | ||
| 590 | 594 | ||
| 591 | DPRINTK("ENTER\n"); | 595 | DPRINTK("ENTER\n"); |
| 592 | 596 | ||
| 597 | spin_lock_irqsave(&host_set->lock, flags); | ||
| 598 | |||
| 593 | ahci_intr_error(ap, readl(port_mmio + PORT_IRQ_STAT)); | 599 | ahci_intr_error(ap, readl(port_mmio + PORT_IRQ_STAT)); |
| 594 | 600 | ||
| 595 | qc = ata_qc_from_tag(ap, ap->active_tag); | 601 | qc = ata_qc_from_tag(ap, ap->active_tag); |
| @@ -607,6 +613,7 @@ static void ahci_eng_timeout(struct ata_port *ap) | |||
| 607 | ata_qc_complete(qc, ATA_ERR); | 613 | ata_qc_complete(qc, ATA_ERR); |
| 608 | } | 614 | } |
| 609 | 615 | ||
| 616 | spin_unlock_irqrestore(&host_set->lock, flags); | ||
| 610 | } | 617 | } |
| 611 | 618 | ||
| 612 | static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc) | 619 | static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc) |
| @@ -696,9 +703,6 @@ static int ahci_qc_issue(struct ata_queued_cmd *qc) | |||
| 696 | struct ata_port *ap = qc->ap; | 703 | struct ata_port *ap = qc->ap; |
| 697 | void *port_mmio = (void *) ap->ioaddr.cmd_addr; | 704 | void *port_mmio = (void *) ap->ioaddr.cmd_addr; |
| 698 | 705 | ||
| 699 | writel(1, port_mmio + PORT_SCR_ACT); | ||
| 700 | readl(port_mmio + PORT_SCR_ACT); /* flush */ | ||
| 701 | |||
| 702 | writel(1, port_mmio + PORT_CMD_ISSUE); | 706 | writel(1, port_mmio + PORT_CMD_ISSUE); |
| 703 | readl(port_mmio + PORT_CMD_ISSUE); /* flush */ | 707 | readl(port_mmio + PORT_CMD_ISSUE); /* flush */ |
| 704 | 708 | ||
diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index d96ebf9d2228..03695616e59e 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c | |||
| @@ -629,13 +629,13 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 629 | port_info[1] = NULL; | 629 | port_info[1] = NULL; |
| 630 | 630 | ||
| 631 | if (port_info[0]->host_flags & PIIX_FLAG_AHCI) { | 631 | if (port_info[0]->host_flags & PIIX_FLAG_AHCI) { |
| 632 | u8 tmp; | 632 | u8 tmp; |
| 633 | pci_read_config_byte(pdev, PIIX_SCC, &tmp); | 633 | pci_read_config_byte(pdev, PIIX_SCC, &tmp); |
| 634 | if (tmp == PIIX_AHCI_DEVICE) { | 634 | if (tmp == PIIX_AHCI_DEVICE) { |
| 635 | int rc = piix_disable_ahci(pdev); | 635 | int rc = piix_disable_ahci(pdev); |
| 636 | if (rc) | 636 | if (rc) |
| 637 | return rc; | 637 | return rc; |
| 638 | } | 638 | } |
| 639 | } | 639 | } |
| 640 | 640 | ||
| 641 | if (port_info[0]->host_flags & PIIX_FLAG_COMBINED) { | 641 | if (port_info[0]->host_flags & PIIX_FLAG_COMBINED) { |
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index f4e7dcb6492b..f15a07f9f471 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
| @@ -1304,12 +1304,12 @@ static inline u8 ata_dev_knobble(struct ata_port *ap) | |||
| 1304 | /** | 1304 | /** |
| 1305 | * ata_dev_config - Run device specific handlers and check for | 1305 | * ata_dev_config - Run device specific handlers and check for |
| 1306 | * SATA->PATA bridges | 1306 | * SATA->PATA bridges |
| 1307 | * @ap: Bus | 1307 | * @ap: Bus |
| 1308 | * @i: Device | 1308 | * @i: Device |
| 1309 | * | 1309 | * |
| 1310 | * LOCKING: | 1310 | * LOCKING: |
| 1311 | */ | 1311 | */ |
| 1312 | 1312 | ||
| 1313 | void ata_dev_config(struct ata_port *ap, unsigned int i) | 1313 | void ata_dev_config(struct ata_port *ap, unsigned int i) |
| 1314 | { | 1314 | { |
| 1315 | /* limit bridge transfers to udma5, 200 sectors */ | 1315 | /* limit bridge transfers to udma5, 200 sectors */ |
| @@ -2377,6 +2377,27 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) | |||
| 2377 | } | 2377 | } |
| 2378 | 2378 | ||
| 2379 | /** | 2379 | /** |
| 2380 | * ata_poll_qc_complete - turn irq back on and finish qc | ||
| 2381 | * @qc: Command to complete | ||
| 2382 | * @drv_stat: ATA status register content | ||
| 2383 | * | ||
| 2384 | * LOCKING: | ||
| 2385 | * None. (grabs host lock) | ||
| 2386 | */ | ||
| 2387 | |||
| 2388 | void ata_poll_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat) | ||
| 2389 | { | ||
| 2390 | struct ata_port *ap = qc->ap; | ||
| 2391 | unsigned long flags; | ||
| 2392 | |||
| 2393 | spin_lock_irqsave(&ap->host_set->lock, flags); | ||
| 2394 | ap->flags &= ~ATA_FLAG_NOINTR; | ||
| 2395 | ata_irq_on(ap); | ||
| 2396 | ata_qc_complete(qc, drv_stat); | ||
| 2397 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
| 2398 | } | ||
| 2399 | |||
| 2400 | /** | ||
| 2380 | * ata_pio_poll - | 2401 | * ata_pio_poll - |
| 2381 | * @ap: | 2402 | * @ap: |
| 2382 | * | 2403 | * |
| @@ -2438,11 +2459,10 @@ static void ata_pio_complete (struct ata_port *ap) | |||
| 2438 | u8 drv_stat; | 2459 | u8 drv_stat; |
| 2439 | 2460 | ||
| 2440 | /* | 2461 | /* |
| 2441 | * This is purely hueristic. This is a fast path. | 2462 | * This is purely heuristic. This is a fast path. Sometimes when |
| 2442 | * Sometimes when we enter, BSY will be cleared in | 2463 | * we enter, BSY will be cleared in a chk-status or two. If not, |
| 2443 | * a chk-status or two. If not, the drive is probably seeking | 2464 | * the drive is probably seeking or something. Snooze for a couple |
| 2444 | * or something. Snooze for a couple msecs, then | 2465 | * msecs, then chk-status again. If still busy, fall back to |
| 2445 | * chk-status again. If still busy, fall back to | ||
| 2446 | * PIO_ST_POLL state. | 2466 | * PIO_ST_POLL state. |
| 2447 | */ | 2467 | */ |
| 2448 | drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 10); | 2468 | drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 10); |
| @@ -2467,9 +2487,7 @@ static void ata_pio_complete (struct ata_port *ap) | |||
| 2467 | 2487 | ||
| 2468 | ap->pio_task_state = PIO_ST_IDLE; | 2488 | ap->pio_task_state = PIO_ST_IDLE; |
| 2469 | 2489 | ||
| 2470 | ata_irq_on(ap); | 2490 | ata_poll_qc_complete(qc, drv_stat); |
| 2471 | |||
| 2472 | ata_qc_complete(qc, drv_stat); | ||
| 2473 | } | 2491 | } |
| 2474 | 2492 | ||
| 2475 | 2493 | ||
| @@ -2494,6 +2512,20 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) | |||
| 2494 | #endif /* __BIG_ENDIAN */ | 2512 | #endif /* __BIG_ENDIAN */ |
| 2495 | } | 2513 | } |
| 2496 | 2514 | ||
| 2515 | /** | ||
| 2516 | * ata_mmio_data_xfer - Transfer data by MMIO | ||
| 2517 | * @ap: port to read/write | ||
| 2518 | * @buf: data buffer | ||
| 2519 | * @buflen: buffer length | ||
| 2520 | * @do_write: read/write | ||
| 2521 | * | ||
| 2522 | * Transfer data from/to the device data register by MMIO. | ||
| 2523 | * | ||
