siimage: separate PATA and SATA methods
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 19 Oct 2007 22:32:31 +0000 (00:32 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 19 Oct 2007 22:32:31 +0000 (00:32 +0200)
* Split off sil_sata_udma_filter() from sil_udma_filter()
  and rename sil_udma_filter() to sil_pata_udma_filter().

* Rename siimage_busproc() to sil_sata_busproc().

* Rename siimage_reset_poll() to sil_sata_reset_poll()
  and in init_hwif_siimage() set ->reset_poll method only
  for SATA controllers.

* Rename siimage_pre_reset() to sil_sata_pre_reset(),
  in init_hwif_siimage() set ->pre_reset method only for
  SATA controllers and remove redundant is_sata() call.

* Add CONFIG_BLK_DEV_IDE_SATA #ifdef/#endif to pdev_is_sata()
  so compiler will know to throw out unused SATA code for
  CONFIG_BLK_DEV_IDE_SATA=n case (830 bytes saved on x86-32).

* Bump driver version.

Some minor cleanups while at it:

* Convert sil_{pata,sata}_udma_filter() to use ATA_UDMA* defines.

* In siimage_mmio_ide_dma_test_irq() move 'base' variable
  under 'if (SATA_ERROR_REG)' block.

* Simplify sil_sata_reset_poll() a bit.

* Cache is_sata() result in init_hwif_siimage()

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/pci/siimage.c

index 689786df1edebb39ee1603da2b8887c5ddd5685b..463bfda84265dc02dd1f222aa42d2fdc3805467b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/siimage.c             Version 1.17    Oct 18 2007
+ * linux/drivers/ide/pci/siimage.c             Version 1.18    Oct 18 2007
  *
  * Copyright (C) 2001-2002     Andre Hedrick <andre@linux-ide.org>
  * Copyright (C) 2003          Red Hat <alan@redhat.com>
@@ -57,8 +57,8 @@
  
 static int pdev_is_sata(struct pci_dev *pdev)
 {
-       switch(pdev->device)
-       {
+#ifdef CONFIG_BLK_DEV_IDE_SATA
+       switch(pdev->device) {
                case PCI_DEVICE_ID_SII_3112:
                case PCI_DEVICE_ID_SII_1210SA:
                        return 1;
@@ -66,9 +66,10 @@ static int pdev_is_sata(struct pci_dev *pdev)
                        return 0;
        }
        BUG();
+#endif
        return 0;
 }
+
 /**
  *     is_sata                 -       check if hwif is SATA
  *     @hwif:  interface to check
@@ -136,7 +137,7 @@ static inline unsigned long siimage_seldev(ide_drive_t *drive, int r)
  *     SI3112 SATA controller life is a bit simpler.
  */
 
-static u8 sil_udma_filter(ide_drive_t *drive)
+static u8 sil_pata_udma_filter(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = drive->hwif;
        unsigned long base = (unsigned long) hwif->hwif_data;
@@ -147,23 +148,23 @@ static u8 sil_udma_filter(ide_drive_t *drive)
        else
                pci_read_config_byte(hwif->pci_dev, 0x8A, &scsc);
 
-       if (is_sata(hwif)) {
-               mask = strstr(drive->id->model, "Maxtor") ? 0x3f : 0x7f;
-               goto out;
-       }
-
        if ((scsc & 0x30) == 0x10)      /* 133 */
-               mask = 0x7f;
+               mask = ATA_UDMA6;
        else if ((scsc & 0x30) == 0x20) /* 2xPCI */
-               mask = 0x7f;
+               mask = ATA_UDMA6;
        else if ((scsc & 0x30) == 0x00) /* 100 */
-               mask = 0x3f;
+               mask = ATA_UDMA5;
        else    /* Disabled ? */
                BUG();
-out:
+
        return mask;
 }
 
+static u8 sil_sata_udma_filter(ide_drive_t *drive)
+{
+       return strstr(drive->id->model, "Maxtor") ? ATA_UDMA5 : ATA_UDMA6;
+}
+
 /**
  *     sil_set_pio_mode        -       set host controller for PIO mode
  *     @drive: drive
@@ -340,10 +341,11 @@ static int siimage_io_ide_dma_test_irq (ide_drive_t *drive)
 static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive)
 {
        ide_hwif_t *hwif        = HWIF(drive);
-       unsigned long base      = (unsigned long)hwif->hwif_data;
        unsigned long addr      = siimage_selreg(hwif, 0x1);
 
        if (SATA_ERROR_REG) {
+               unsigned long base = (unsigned long)hwif->hwif_data;
+
                u32 ext_stat = readl((void __iomem *)(base + 0x10));
                u8 watchdog = 0;
                if (ext_stat & ((hwif->channel) ? 0x40 : 0x10)) {
@@ -376,7 +378,7 @@ static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive)
 }
 
 /**
- *     siimage_busproc         -       bus isolation ioctl
+ *     sil_sata_busproc        -       bus isolation IOCTL
  *     @drive: drive to isolate/restore
  *     @state: bus state to set
  *
@@ -384,8 +386,8 @@ static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive)
  *     SATA controller the work required is quite limited, we 
  *     just have to clean up the statistics
  */
-static int siimage_busproc (ide_drive_t * drive, int state)
+
+static int sil_sata_busproc(ide_drive_t * drive, int state)
 {
        ide_hwif_t *hwif        = HWIF(drive);
        u32 stat_config         = 0;
@@ -417,14 +419,14 @@ static int siimage_busproc (ide_drive_t * drive, int state)
 }
 
 /**
- *     siimage_reset_poll      -       wait for sata reset
+ *     sil_sata_reset_poll     -       wait for SATA reset
  *     @drive: drive we are resetting
  *
  *     Poll the SATA phy and see whether it has come back from the dead
  *     yet.
  */
-static int siimage_reset_poll (ide_drive_t *drive)
+
+static int sil_sata_reset_poll(ide_drive_t *drive)
 {
        if (SATA_STATUS_REG) {
                ide_hwif_t *hwif        = HWIF(drive);
@@ -436,27 +438,22 @@ static int siimage_reset_poll (ide_drive_t *drive)
                        HWGROUP(drive)->polling = 0;
                        return ide_started;
                }
-               return 0;
-       } else {
-               return 0;
        }
+
+       return 0;
 }
 
 /**
- *     siimage_pre_reset       -       reset hook
+ *     sil_sata_pre_reset      -       reset hook
  *     @drive: IDE device being reset
  *
  *     For the SATA devices we need to handle recalibration/geometry
  *     differently
  */
-static void siimage_pre_reset (ide_drive_t *drive)
-{
-       if (drive->media != ide_disk)
-               return;
 
-       if (is_sata(HWIF(drive)))
-       {
+static void sil_sata_pre_reset(ide_drive_t *drive)
+{
+       if (drive->media == ide_disk) {
                drive->special.b.set_geometry = 0;
                drive->special.b.recalibrate = 0;
        }
@@ -502,7 +499,6 @@ static void siimage_reset (ide_drive_t *drive)
                        drive->failures++;
                }
        }
-
 }
 
 /**
@@ -864,28 +860,31 @@ static u8 __devinit ata66_siimage(ide_hwif_t *hwif)
 
 static void __devinit init_hwif_siimage(ide_hwif_t *hwif)
 {
+       u8 sata = is_sata(hwif);
+
        hwif->resetproc = &siimage_reset;
        hwif->set_pio_mode = &sil_set_pio_mode;
        hwif->set_dma_mode = &sil_set_dma_mode;
-       hwif->reset_poll = &siimage_reset_poll;
-       hwif->pre_reset = &siimage_pre_reset;
-       hwif->udma_filter = &sil_udma_filter;
 
-       if(is_sata(hwif)) {
+       if (sata) {
                static int first = 1;
 
-               hwif->busproc   = &siimage_busproc;
+               hwif->busproc = &sil_sata_busproc;
+               hwif->reset_poll = &sil_sata_reset_poll;
+               hwif->pre_reset = &sil_sata_pre_reset;
+               hwif->udma_filter = &sil_sata_udma_filter;
 
                if (first) {
                        printk(KERN_INFO "siimage: For full SATA support you should use the libata sata_sil module.\n");
                        first = 0;
                }
-       }
+       } else
+               hwif->udma_filter = &sil_pata_udma_filter;
 
        if (hwif->dma_base == 0)
                return;
 
-       if (is_sata(hwif))
+       if (sata)
                hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA;
 
        if (hwif->cbl != ATA_CBL_PATA40_SHORT)