linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / scsi / sata_uli.c
index 33cdb48..9635ca7 100644 (file)
@@ -24,6 +24,7 @@
  *
  */
 
+#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/libata.h>
 
 #define DRV_NAME       "sata_uli"
-#define DRV_VERSION    "1.0"
+#define DRV_VERSION    "0.5"
 
 enum {
        uli_5289                = 0,
        uli_5287                = 1,
        uli_5281                = 2,
 
-       uli_max_ports           = 4,
-
        /* PCI configuration registers */
        ULI5287_BASE            = 0x90, /* sata0 phy SCR registers */
        ULI5287_OFFS            = 0x10, /* offset from sata0->sata1 phy regs */
@@ -52,10 +51,6 @@ enum {
        ULI5281_OFFS            = 0x60, /* offset from sata0->sata1 phy regs */
 };
 
-struct uli_priv {
-       unsigned int            scr_cfg_addr[uli_max_ports];
-};
-
 static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
 static u32 uli_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void uli_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
@@ -80,16 +75,17 @@ static struct scsi_host_template uli_sht = {
        .name                   = DRV_NAME,
        .ioctl                  = ata_scsi_ioctl,
        .queuecommand           = ata_scsi_queuecmd,
+       .eh_strategy_handler    = ata_scsi_error,
        .can_queue              = ATA_DEF_QUEUE,
        .this_id                = ATA_SHT_THIS_ID,
        .sg_tablesize           = LIBATA_MAX_PRD,
+       .max_sectors            = ATA_MAX_SECTORS,
        .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
        .emulated               = ATA_SHT_EMULATED,
        .use_clustering         = ATA_SHT_USE_CLUSTERING,
        .proc_name              = DRV_NAME,
        .dma_boundary           = ATA_DMA_BOUNDARY,
        .slave_configure        = ata_scsi_slave_config,
-       .slave_destroy          = ata_scsi_slave_destroy,
        .bios_param             = ata_std_bios_param,
 };
 
@@ -102,18 +98,16 @@ static const struct ata_port_operations uli_ops = {
        .exec_command           = ata_exec_command,
        .dev_select             = ata_std_dev_select,
 
+       .phy_reset              = sata_phy_reset,
+
        .bmdma_setup            = ata_bmdma_setup,
        .bmdma_start            = ata_bmdma_start,
        .bmdma_stop             = ata_bmdma_stop,
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
 
-       .freeze                 = ata_bmdma_freeze,
-       .thaw                   = ata_bmdma_thaw,
-       .error_handler          = ata_bmdma_error_handler,
-       .post_internal_cmd      = ata_bmdma_post_internal_cmd,
+       .eng_timeout            = ata_eng_timeout,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
@@ -128,7 +122,8 @@ static const struct ata_port_operations uli_ops = {
 
 static struct ata_port_info uli_port_info = {
        .sht            = &uli_sht,
-       .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
+       .host_flags     = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET |
+                         ATA_FLAG_NO_LEGACY,
        .pio_mask       = 0x1f,         /* pio0-4 */
        .udma_mask      = 0x7f,         /* udma0-6 */
        .port_ops       = &uli_ops,
@@ -143,8 +138,7 @@ MODULE_VERSION(DRV_VERSION);
 
 static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg)
 {
-       struct uli_priv *hpriv = ap->host_set->private_data;
-       return hpriv->scr_cfg_addr[ap->port_no] + (4 * sc_reg);
+       return ap->ioaddr.scr_addr + (4 * sc_reg);
 }
 
 static u32 uli_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
@@ -189,7 +183,6 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        int rc;
        unsigned int board_idx = (unsigned int) ent->driver_data;
        int pci_dev_busy = 0;
-       struct uli_priv *hpriv;
 
        if (!printed_version++)
                dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n");
@@ -218,18 +211,10 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                goto err_out_regions;
        }
 
-       hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv) {
-               rc = -ENOMEM;
-               goto err_out_probe_ent;
-       }
-
-       probe_ent->private_data = hpriv;
-
        switch (board_idx) {
        case uli_5287:
-               hpriv->scr_cfg_addr[0] = ULI5287_BASE;
-               hpriv->scr_cfg_addr[1] = ULI5287_BASE + ULI5287_OFFS;
+               probe_ent->port[0].scr_addr = ULI5287_BASE;
+               probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS;
                        probe_ent->n_ports = 4;
 
                        probe_ent->port[2].cmd_addr = pci_resource_start(pdev, 0) + 8;
@@ -237,27 +222,27 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                probe_ent->port[2].ctl_addr =
                        (pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS) + 4;
                probe_ent->port[2].bmdma_addr = pci_resource_start(pdev, 4) + 16;
-               hpriv->scr_cfg_addr[2] = ULI5287_BASE + ULI5287_OFFS*4;
+               probe_ent->port[2].scr_addr = ULI5287_BASE + ULI5287_OFFS*4;
 
                probe_ent->port[3].cmd_addr = pci_resource_start(pdev, 2) + 8;
                probe_ent->port[3].altstatus_addr =
                probe_ent->port[3].ctl_addr =
                        (pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS) + 4;
                probe_ent->port[3].bmdma_addr = pci_resource_start(pdev, 4) + 24;
-               hpriv->scr_cfg_addr[3] = ULI5287_BASE + ULI5287_OFFS*5;
+               probe_ent->port[3].scr_addr = ULI5287_BASE + ULI5287_OFFS*5;
 
                ata_std_ports(&probe_ent->port[2]);
                ata_std_ports(&probe_ent->port[3]);
                break;
 
        case uli_5289:
-               hpriv->scr_cfg_addr[0] = ULI5287_BASE;
-               hpriv->scr_cfg_addr[1] = ULI5287_BASE + ULI5287_OFFS;
+               probe_ent->port[0].scr_addr = ULI5287_BASE;
+               probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS;
                break;
 
        case uli_5281:
-               hpriv->scr_cfg_addr[0] = ULI5281_BASE;
-               hpriv->scr_cfg_addr[1] = ULI5281_BASE + ULI5281_OFFS;
+               probe_ent->port[0].scr_addr = ULI5281_BASE;
+               probe_ent->port[1].scr_addr = ULI5281_BASE + ULI5281_OFFS;
                break;
 
        default:
@@ -274,10 +259,9 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 
        return 0;
 
-err_out_probe_ent:
-       kfree(probe_ent);
 err_out_regions:
        pci_release_regions(pdev);
+
 err_out:
        if (!pci_dev_busy)
                pci_disable_device(pdev);