Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 71752
b: refs/heads/master
c: 438c470
h: refs/heads/master
v: v3
  • Loading branch information
Bartlomiej Zolnierkiewicz committed Oct 19, 2007
1 parent 67435a9 commit f101fc3
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 41 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b1e03865434ef559222b69ba36ebe4fd9437aa86
refs/heads/master: 438c470261036db25bfae15235ba99812e3dc763
79 changes: 39 additions & 40 deletions trunk/drivers/ide/pci/siimage.c
Original file line number Diff line number Diff line change
@@ -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>
Expand Down Expand Up @@ -57,18 +57,19 @@

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;
case PCI_DEVICE_ID_SII_680:
return 0;
}
BUG();
#endif
return 0;
}

/**
* is_sata - check if hwif is SATA
* @hwif: interface to check
Expand Down Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -376,16 +378,16 @@ 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
*
* Used by the SII3112 to handle bus isolation. As this is a
* 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;
Expand Down Expand Up @@ -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);
Expand All @@ -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;
}
Expand Down Expand Up @@ -502,7 +499,6 @@ static void siimage_reset (ide_drive_t *drive)
drive->failures++;
}
}

}

/**
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit f101fc3

Please sign in to comment.