Lines Matching +full:drive +full:- +full:mode
2 * Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org>
4 * Copyright (C) 2007-2008 MontaVista Software, Inc.
5 * Copyright (C) 2007-2008 Bartlomiej Zolnierkiewicz
10 * http://gkernel.sourceforge.net/specs/sii/sii-0680a-v1.31.pdf.bz2
13 * http://gkernel.sourceforge.net/specs/sii/3112A_SiI-DS-0095-B2.pdf.bz2
19 * If you are using Marvell SATA-IDE adapters with Maxtor drives
23 * drive to "Single". "Master" will hang.
35 * - VDMA support
48 * pdev_is_sata - check if device is SATA
57 switch (pdev->device) { in pdev_is_sata()
70 * is_sata - check if hwif is SATA
78 return pdev_is_sata(to_pci_dev(hwif->dev)); in is_sata()
82 * siimage_selreg - return register base
94 unsigned long base = (unsigned long)hwif->hwif_data; in siimage_selreg()
97 if (hwif->host_flags & IDE_HFLAG_MMIO) in siimage_selreg()
98 base += hwif->channel << 6; in siimage_selreg()
100 base += hwif->channel << 4; in siimage_selreg()
105 * siimage_seldev - return register base
114 static inline unsigned long siimage_seldev(ide_drive_t *drive, int r) in siimage_seldev() argument
116 ide_hwif_t *hwif = drive->hwif; in siimage_seldev()
117 unsigned long base = (unsigned long)hwif->hwif_data; in siimage_seldev()
118 u8 unit = drive->dn & 1; in siimage_seldev()
121 if (hwif->host_flags & IDE_HFLAG_MMIO) in siimage_seldev()
122 base += hwif->channel << 6; in siimage_seldev()
124 base += hwif->channel << 4; in siimage_seldev()
134 if (host->host_priv) in sil_ioread8()
147 if (host->host_priv) in sil_ioread16()
159 if (host->host_priv) in sil_iowrite8()
169 if (host->host_priv) in sil_iowrite16()
179 if (host->host_priv) in sil_iowrite32()
186 * sil_udma_filter - compute UDMA mask
187 * @drive: IDE device
191 * For the CMD680 this depends on the clocking mode (scsc), for the
195 static u8 sil_pata_udma_filter(ide_drive_t *drive) in sil_pata_udma_filter() argument
197 ide_hwif_t *hwif = drive->hwif; in sil_pata_udma_filter()
198 struct pci_dev *dev = to_pci_dev(hwif->dev); in sil_pata_udma_filter()
199 unsigned long base = (unsigned long)hwif->hwif_data; in sil_pata_udma_filter()
202 base += (hwif->host_flags & IDE_HFLAG_MMIO) ? 0x4A : 0x8A; in sil_pata_udma_filter()
223 static u8 sil_sata_udma_filter(ide_drive_t *drive) in sil_sata_udma_filter() argument
225 char *m = (char *)&drive->id[ATA_ID_PROD]; in sil_sata_udma_filter()
231 * sil_set_pio_mode - set host controller for PIO mode
233 * @drive: drive
235 * Load the timing settings for this device mode into the
239 static void sil_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive) in sil_set_pio_mode() argument
244 struct pci_dev *dev = to_pci_dev(hwif->dev); in sil_set_pio_mode()
245 ide_drive_t *pair = ide_get_pair_dev(drive); in sil_set_pio_mode()
248 unsigned long addr = siimage_seldev(drive, 0x04); in sil_set_pio_mode()
250 unsigned long base = (unsigned long)hwif->hwif_data; in sil_set_pio_mode()
251 const u8 pio = drive->pio_mode - XFER_PIO_0; in sil_set_pio_mode()
253 u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; in sil_set_pio_mode()
254 u8 addr_mask = hwif->channel ? (mmio ? 0xF4 : 0x84) in sil_set_pio_mode()
256 u8 mode = 0; in sil_set_pio_mode() local
257 u8 unit = drive->dn & 1; in sil_set_pio_mode()
261 u8 pair_pio = pair->pio_mode - XFER_PIO_0; in sil_set_pio_mode()
275 speedp = sil_ioread16(dev, tfaddr - 2); in sil_set_pio_mode()
278 mode = sil_ioread8(dev, base + addr_mask); in sil_set_pio_mode()
279 mode &= ~(unit ? 0x30 : 0x03); in sil_set_pio_mode()
281 if (ide_pio_need_iordy(drive, pio)) { in sil_set_pio_mode()
283 mode |= unit ? 0x10 : 0x01; in sil_set_pio_mode()
286 sil_iowrite16(dev, speedp, tfaddr - 2); in sil_set_pio_mode()
287 sil_iowrite8(dev, mode, base + addr_mask); in sil_set_pio_mode()
291 * sil_set_dma_mode - set host controller for DMA mode
293 * @drive: drive
295 * Tune the SiI chipset for the desired DMA mode.
298 static void sil_set_dma_mode(ide_hwif_t *hwif, ide_drive_t *drive) in sil_set_dma_mode() argument
304 struct pci_dev *dev = to_pci_dev(hwif->dev); in sil_set_dma_mode()
305 unsigned long base = (unsigned long)hwif->hwif_data; in sil_set_dma_mode()
307 u8 mode = 0, unit = drive->dn & 1; in sil_set_dma_mode() local
308 u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; in sil_set_dma_mode()
309 u8 scsc = 0, addr_mask = hwif->channel ? (mmio ? 0xF4 : 0x84) in sil_set_dma_mode()
311 unsigned long ma = siimage_seldev(drive, 0x08); in sil_set_dma_mode()
312 unsigned long ua = siimage_seldev(drive, 0x0C); in sil_set_dma_mode()
313 const u8 speed = drive->dma_mode; in sil_set_dma_mode()
316 mode = sil_ioread8 (dev, base + addr_mask); in sil_set_dma_mode()
320 mode &= ~(unit ? 0x30 : 0x03); in sil_set_dma_mode()
328 ultra |= scsc ? ultra6[speed - XFER_UDMA_0] : in sil_set_dma_mode()
329 ultra5[speed - XFER_UDMA_0]; in sil_set_dma_mode()
330 mode |= unit ? 0x30 : 0x03; in sil_set_dma_mode()
332 multi = dma[speed - XFER_MW_DMA_0]; in sil_set_dma_mode()
333 mode |= unit ? 0x20 : 0x02; in sil_set_dma_mode()
336 sil_iowrite8 (dev, mode, base + addr_mask); in sil_set_dma_mode()
343 struct pci_dev *dev = to_pci_dev(hwif->dev); in sil_test_irq()
352 * siimage_mmio_dma_test_irq - check we caused an IRQ
353 * @drive: drive we are testing
359 static int siimage_mmio_dma_test_irq(ide_drive_t *drive) in siimage_mmio_dma_test_irq() argument
361 ide_hwif_t *hwif = drive->hwif; in siimage_mmio_dma_test_irq()
363 = (void __iomem *)hwif->sata_scr[SATA_ERROR_OFFSET]; in siimage_mmio_dma_test_irq()
366 unsigned long base = (unsigned long)hwif->hwif_data; in siimage_mmio_dma_test_irq()
370 if (ext_stat & ((hwif->channel) ? 0x40 : 0x10)) { in siimage_mmio_dma_test_irq()
377 drive->name, sata_error, watchdog, __func__); in siimage_mmio_dma_test_irq()
387 if (readb((void __iomem *)(hwif->dma_base + ATA_DMA_STATUS)) & 4) in siimage_mmio_dma_test_irq()
393 static int siimage_dma_test_irq(ide_drive_t *drive) in siimage_dma_test_irq() argument
395 if (drive->hwif->host_flags & IDE_HFLAG_MMIO) in siimage_dma_test_irq()
396 return siimage_mmio_dma_test_irq(drive); in siimage_dma_test_irq()
398 return ide_dma_test_irq(drive); in siimage_dma_test_irq()
402 * sil_sata_reset_poll - wait for SATA reset
403 * @drive: drive we are resetting
409 static blk_status_t sil_sata_reset_poll(ide_drive_t *drive) in sil_sata_reset_poll() argument
411 ide_hwif_t *hwif = drive->hwif; in sil_sata_reset_poll()
413 = (void __iomem *)hwif->sata_scr[SATA_STATUS_OFFSET]; in sil_sata_reset_poll()
416 /* SATA Status is available only when in MMIO mode */ in sil_sata_reset_poll()
421 hwif->name, sata_stat); in sil_sata_reset_poll()
430 * sil_sata_pre_reset - reset hook
431 * @drive: IDE device being reset
437 static void sil_sata_pre_reset(ide_drive_t *drive) in sil_sata_pre_reset() argument
439 if (drive->media == ide_disk) { in sil_sata_pre_reset()
440 drive->special_flags &= in sil_sata_pre_reset()
446 * init_chipset_siimage - set up an SI device
456 void __iomem *ioaddr = host->host_priv; in init_chipset_siimage()
458 u8 rev = dev->revision, tmp; in init_chipset_siimage()
524 /* report the clocking mode of the controller */ in init_chipset_siimage()
538 * init_mmio_iops_siimage - set up the iops for MMIO
551 struct pci_dev *dev = to_pci_dev(hwif->dev); in init_mmio_iops_siimage()
553 void *addr = host->host_priv; in init_mmio_iops_siimage()
554 u8 ch = hwif->channel; in init_mmio_iops_siimage()
555 struct ide_io_ports *io_ports = &hwif->io_ports; in init_mmio_iops_siimage()
561 hwif->host_flags |= IDE_HFLAG_MMIO; in init_mmio_iops_siimage()
563 hwif->hwif_data = addr; in init_mmio_iops_siimage()
579 * can't currently use it sanely since we want to use LBA48 mode. in init_mmio_iops_siimage()
581 io_ports->data_addr = base; in init_mmio_iops_siimage()
582 io_ports->error_addr = base + 1; in init_mmio_iops_siimage()
583 io_ports->nsect_addr = base + 2; in init_mmio_iops_siimage()
584 io_ports->lbal_addr = base + 3; in init_mmio_iops_siimage()
585 io_ports->lbam_addr = base + 4; in init_mmio_iops_siimage()
586 io_ports->lbah_addr = base + 5; in init_mmio_iops_siimage()
587 io_ports->device_addr = base + 6; in init_mmio_iops_siimage()
588 io_ports->status_addr = base + 7; in init_mmio_iops_siimage()
589 io_ports->ctl_addr = base + 10; in init_mmio_iops_siimage()
595 hwif->sata_scr[SATA_STATUS_OFFSET] = base + 0x104; in init_mmio_iops_siimage()
596 hwif->sata_scr[SATA_ERROR_OFFSET] = base + 0x108; in init_mmio_iops_siimage()
597 hwif->sata_scr[SATA_CONTROL_OFFSET] = base + 0x100; in init_mmio_iops_siimage()
600 hwif->irq = dev->irq; in init_mmio_iops_siimage()
602 hwif->dma_base = (unsigned long)addr + (ch ? 0x08 : 0x00); in init_mmio_iops_siimage()
605 static int is_dev_seagate_sata(ide_drive_t *drive) in is_dev_seagate_sata() argument
607 const char *s = (const char *)&drive->id[ATA_ID_PROD]; in is_dev_seagate_sata()
611 if ((!memcmp(s + len - 2, "AS", 2)) || in is_dev_seagate_sata()
612 (!memcmp(s + len - 3, "ASL", 3))) { in is_dev_seagate_sata()
614 "errata fix\n", drive->name); in is_dev_seagate_sata()
622 * sil_quirkproc - post probe fixups
623 * @drive: drive
625 * Called after drive probe we use this to decide whether the
630 static void sil_quirkproc(ide_drive_t *drive) in sil_quirkproc() argument
632 ide_hwif_t *hwif = drive->hwif; in sil_quirkproc()
635 if (!is_sata(hwif) || !is_dev_seagate_sata(drive)) in sil_quirkproc()
636 hwif->rqsize = 128; in sil_quirkproc()
640 * init_iops_siimage - set up iops
651 struct ide_host *host = dev_get_drvdata(hwif->dev); in init_iops_siimage()
653 hwif->hwif_data = NULL; in init_iops_siimage()
656 hwif->rqsize = 15; in init_iops_siimage()
658 if (host->host_priv) in init_iops_siimage()
663 * sil_cable_detect - cable detection
671 struct pci_dev *dev = to_pci_dev(hwif->dev); in sil_cable_detect()
727 * siimage_init_one - PCI layer discovery entry
742 u8 idx = id->driver_data; in siimage_init_one()
794 void __iomem *ioaddr = host->host_priv; in siimage_remove()