]> Pileus Git - ~andy/linux/blobdiff - drivers/ata/sata_promise.c
devres: release resources on device_del()
[~andy/linux] / drivers / ata / sata_promise.c
index da8c362c3eb02432c941d677c167cd69ba9a32b9..2339813ce9f646caf678172bbb85e045d157f2c7 100644 (file)
@@ -45,7 +45,7 @@
 #include "sata_promise.h"
 
 #define DRV_NAME       "sata_promise"
-#define DRV_VERSION    "1.05"
+#define DRV_VERSION    "2.00"
 
 
 enum {
@@ -119,9 +119,7 @@ static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
 static irqreturn_t pdc_interrupt (int irq, void *dev_instance);
-static void pdc_eng_timeout(struct ata_port *ap);
 static int pdc_port_start(struct ata_port *ap);
-static void pdc_pata_phy_reset(struct ata_port *ap);
 static void pdc_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
@@ -215,12 +213,13 @@ static const struct ata_port_operations pdc_pata_ops = {
        .dev_select             = ata_std_dev_select,
        .check_atapi_dma        = pdc_check_atapi_dma,
 
-       .phy_reset              = pdc_pata_phy_reset,
-
        .qc_prep                = pdc_qc_prep,
        .qc_issue               = pdc_qc_issue_prot,
+       .freeze                 = pdc_freeze,
+       .thaw                   = pdc_thaw,
+       .error_handler          = pdc_error_handler,
+       .post_internal_cmd      = pdc_post_internal_cmd,
        .data_xfer              = ata_data_xfer,
-       .eng_timeout            = pdc_eng_timeout,
        .irq_handler            = pdc_interrupt,
        .irq_clear              = pdc_irq_clear,
        .irq_on                 = ata_irq_on,
@@ -253,7 +252,7 @@ static const struct ata_port_info pdc_port_info[] = {
        /* board_20619 */
        {
                .sht            = &pdc_ata_sht,
-               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SRST | ATA_FLAG_SLAVE_POSS,
+               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -389,14 +388,6 @@ static void pdc_pata_cbl_detect(struct ata_port *ap)
                ap->cbl = ATA_CBL_PATA80;
 }
 
-static void pdc_pata_phy_reset(struct ata_port *ap)
-{
-       pdc_pata_cbl_detect(ap);
-       pdc_reset_port(ap);
-       ata_port_probe(ap);
-       ata_bus_reset(ap);
-}
-
 static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
 {
        if (sc_reg > SCR_CONTROL || ap->cbl != ATA_CBL_SATA)
@@ -599,43 +590,6 @@ static void pdc_post_internal_cmd(struct ata_queued_cmd *qc)
                pdc_reset_port(ap);
 }
 
-static void pdc_eng_timeout(struct ata_port *ap)
-{
-       struct ata_host *host = ap->host;
-       u8 drv_stat;
-       struct ata_queued_cmd *qc;
-       unsigned long flags;
-
-       DPRINTK("ENTER\n");
-
-       spin_lock_irqsave(&host->lock, flags);
-
-       qc = ata_qc_from_tag(ap, ap->active_tag);
-
-       switch (qc->tf.protocol) {
-       case ATA_PROT_DMA:
-       case ATA_PROT_NODATA:
-               ata_port_printk(ap, KERN_ERR, "command timeout\n");
-               drv_stat = ata_wait_idle(ap);
-               qc->err_mask |= __ac_err_mask(drv_stat);
-               break;
-
-       default:
-               drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
-
-               ata_port_printk(ap, KERN_ERR,
-                               "unknown timeout, cmd 0x%x stat 0x%x\n",
-                               qc->tf.command, drv_stat);
-
-               qc->err_mask |= ac_err_mask(drv_stat);
-               break;
-       }
-
-       spin_unlock_irqrestore(&host->lock, flags);
-       ata_eh_qc_complete(qc);
-       DPRINTK("EXIT\n");
-}
-
 static inline unsigned int pdc_host_intr( struct ata_port *ap,
                                           struct ata_queued_cmd *qc)
 {
@@ -823,7 +777,8 @@ static int pdc_old_check_atapi_dma(struct ata_queued_cmd *qc)
        return pdc_check_atapi_dma(qc);
 }
 
-static void pdc_ata_setup_port(struct ata_ioports *port, void __iomem *base)
+static void pdc_ata_setup_port(struct ata_ioports *port, void __iomem *base,
+                              void __iomem *scr_addr)
 {
        port->cmd_addr          = base;
        port->data_addr         = base;
@@ -838,6 +793,7 @@ static void pdc_ata_setup_port(struct ata_ioports *port, void __iomem *base)
        port->status_addr       = base + 0x1c;
        port->altstatus_addr    =
        port->ctl_addr          = base + 0x38;
+       port->scr_addr          = scr_addr;
 }
 
 
@@ -950,11 +906,8 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
 
        base = probe_ent->iomap[PDC_MMIO_BAR];
 
-       pdc_ata_setup_port(&probe_ent->port[0], base + 0x200);
-       pdc_ata_setup_port(&probe_ent->port[1], base + 0x280);
-
-       probe_ent->port[0].scr_addr = base + 0x400;
-       probe_ent->port[1].scr_addr = base + 0x500;
+       pdc_ata_setup_port(&probe_ent->port[0], base + 0x200, base + 0x400);
+       pdc_ata_setup_port(&probe_ent->port[1], base + 0x280, base + 0x500);
 
        /* notice 4-port boards */
        switch (board_idx) {
@@ -963,12 +916,8 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
                /* Fall through */
        case board_20319:
                        probe_ent->n_ports = 4;
-
-               pdc_ata_setup_port(&probe_ent->port[2], base + 0x300);
-               pdc_ata_setup_port(&probe_ent->port[3], base + 0x380);
-
-               probe_ent->port[2].scr_addr = base + 0x600;
-               probe_ent->port[3].scr_addr = base + 0x700;
+               pdc_ata_setup_port(&probe_ent->port[2], base + 0x300, base + 0x600);
+               pdc_ata_setup_port(&probe_ent->port[3], base + 0x380, base + 0x700);
                break;
        case board_2057x:
                hp->flags |= PDC_FLAG_GEN_II;
@@ -978,7 +927,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
                tmp = readb(base + PDC_FLASH_CTL+1);
                if (!(tmp & 0x80)) {
                        probe_ent->n_ports = 3;
-                       pdc_ata_setup_port(&probe_ent->port[2], base + 0x300);
+                       pdc_ata_setup_port(&probe_ent->port[2], base + 0x300, NULL);
                        hp->port_flags[2] = ATA_FLAG_SLAVE_POSS;
                        printk(KERN_INFO DRV_NAME " PATA port found\n");
                } else
@@ -988,12 +937,8 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
                break;
        case board_20619:
                probe_ent->n_ports = 4;
-
-               pdc_ata_setup_port(&probe_ent->port[2], base + 0x300);
-               pdc_ata_setup_port(&probe_ent->port[3], base + 0x380);
-
-               probe_ent->port[2].scr_addr = base + 0x600;
-               probe_ent->port[3].scr_addr = base + 0x700;
+               pdc_ata_setup_port(&probe_ent->port[2], base + 0x300, NULL);
+               pdc_ata_setup_port(&probe_ent->port[3], base + 0x380, NULL);
                break;
        default:
                BUG();