Lines Matching +full:drive +full:- +full:mode
2 * Copyright (C) 1999-2000 Andre Hedrick <andre@linux-ide.org>
5 * Copyright (C) 2007-2009 Bartlomiej Zolnierkiewicz
32 * or SiS5596, we can assume we see the first MWDMA-16 capable SiS5513 chip.
41 * ID, while the now ATA-133 capable 5513 still has the same PCI ID.
43 * bits, changing its device id to the true one - 5517 for 961 and 5518 for
110 Indexed by chipset_family and (dma_mode - XFER_UDMA_0) */
115 static u8 cycle_time_value[][XFER_UDMA_6 - XFER_UDMA_0 + 1] = {
128 static u8 cvs_time_value[][XFER_UDMA_6 - XFER_UDMA_0 + 1] = {
140 for PIO0/1/2/3/4 and DMA0/1/2 mode in order */
187 static u8 sis_ata133_get_base(ide_drive_t *drive) in sis_ata133_get_base() argument
189 struct pci_dev *dev = to_pci_dev(drive->hwif->dev); in sis_ata133_get_base()
194 return ((reg54 & 0x40000000) ? 0x70 : 0x40) + drive->dn * 4; in sis_ata133_get_base()
197 static void sis_ata16_program_timings(ide_drive_t *drive, const u8 mode) in sis_ata16_program_timings() argument
199 struct pci_dev *dev = to_pci_dev(drive->hwif->dev); in sis_ata16_program_timings()
201 u8 drive_pci = 0x40 + drive->dn * 2; in sis_ata16_program_timings()
210 if (mode >= XFER_MW_DMA_0) { in sis_ata16_program_timings()
213 t1 |= mwdma_timings[mode - XFER_MW_DMA_0]; in sis_ata16_program_timings()
215 t1 |= pio_timings[mode - XFER_PIO_0]; in sis_ata16_program_timings()
220 static void sis_ata100_program_timings(ide_drive_t *drive, const u8 mode) in sis_ata100_program_timings() argument
222 struct pci_dev *dev = to_pci_dev(drive->hwif->dev); in sis_ata100_program_timings()
223 u8 t1, drive_pci = 0x40 + drive->dn * 2; in sis_ata100_program_timings()
229 if (mode >= XFER_MW_DMA_0) { in sis_ata100_program_timings()
236 t1 = mwdma_timings[mode - XFER_MW_DMA_0]; in sis_ata100_program_timings()
238 t1 = pio_timings[mode - XFER_PIO_0]; in sis_ata100_program_timings()
243 static void sis_ata133_program_timings(ide_drive_t *drive, const u8 mode) in sis_ata133_program_timings() argument
245 struct pci_dev *dev = to_pci_dev(drive->hwif->dev); in sis_ata133_program_timings()
247 u8 drive_pci = sis_ata133_get_base(drive), clk, idx; in sis_ata133_program_timings()
253 if (mode >= XFER_MW_DMA_0) { in sis_ata133_program_timings()
255 idx = mode - XFER_MW_DMA_0 + 5; in sis_ata133_program_timings()
257 idx = mode - XFER_PIO_0; in sis_ata133_program_timings()
265 static void sis_program_timings(ide_drive_t *drive, const u8 mode) in sis_program_timings() argument
268 sis_ata16_program_timings(drive, mode); in sis_program_timings()
270 sis_ata100_program_timings(drive, mode); in sis_program_timings()
272 sis_ata133_program_timings(drive, mode); in sis_program_timings()
275 static void config_drive_art_rwp(ide_drive_t *drive) in config_drive_art_rwp() argument
277 ide_hwif_t *hwif = drive->hwif; in config_drive_art_rwp()
278 struct pci_dev *dev = to_pci_dev(hwif->dev); in config_drive_art_rwp()
284 rw_prefetch = reg4bh & ~(0x11 << drive->dn); in config_drive_art_rwp()
286 if (drive->media == ide_disk) in config_drive_art_rwp()
287 rw_prefetch |= 0x11 << drive->dn; in config_drive_art_rwp()
293 static void sis_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive) in sis_set_pio_mode() argument
295 config_drive_art_rwp(drive); in sis_set_pio_mode()
296 sis_program_timings(drive, drive->pio_mode); in sis_set_pio_mode()
299 static void sis_ata133_program_udma_timings(ide_drive_t *drive, const u8 mode) in sis_ata133_program_udma_timings() argument
301 struct pci_dev *dev = to_pci_dev(drive->hwif->dev); in sis_ata133_program_udma_timings()
303 u8 drive_pci = sis_ata133_get_base(drive), clk, idx; in sis_ata133_program_udma_timings()
311 idx = mode - XFER_UDMA_0; in sis_ata133_program_udma_timings()
318 static void sis_ata33_program_udma_timings(ide_drive_t *drive, const u8 mode) in sis_ata33_program_udma_timings() argument
320 struct pci_dev *dev = to_pci_dev(drive->hwif->dev); in sis_ata33_program_udma_timings()
321 u8 drive_pci = 0x40 + drive->dn * 2, reg = 0, i = chipset_family; in sis_ata33_program_udma_timings()
328 reg &= ~((0xff >> (8 - cycle_time_range[i])) << cycle_time_offset[i]); in sis_ata33_program_udma_timings()
330 reg |= cycle_time_value[i][mode - XFER_UDMA_0] << cycle_time_offset[i]; in sis_ata33_program_udma_timings()
335 static void sis_program_udma_timings(ide_drive_t *drive, const u8 mode) in sis_program_udma_timings() argument
338 sis_ata133_program_udma_timings(drive, mode); in sis_program_udma_timings()
340 sis_ata33_program_udma_timings(drive, mode); in sis_program_udma_timings()
343 static void sis_set_dma_mode(ide_hwif_t *hwif, ide_drive_t *drive) in sis_set_dma_mode() argument
345 const u8 speed = drive->dma_mode; in sis_set_dma_mode()
348 sis_program_udma_timings(drive, speed); in sis_set_dma_mode()
350 sis_program_timings(drive, speed); in sis_set_dma_mode()
353 static u8 sis_ata133_udma_filter(ide_drive_t *drive) in sis_ata133_udma_filter() argument
355 struct pci_dev *dev = to_pci_dev(drive->hwif->dev); in sis_ata133_udma_filter()
357 u8 drive_pci = sis_ata133_get_base(drive); in sis_ata133_udma_filter()
383 if (host->revision >= 0x30) in sis_find_family()
393 if (!chipset_family) { /* Belongs to pci-quirks */ in sis_find_family()
421 if (!chipset_family) { /* Belongs to pci-quirks */ in sis_find_family()
435 lpc_bridge = pci_get_slot(dev->bus, 0x10); /* Bus 0, Dev 2, Fn 0 */ in sis_find_family()
439 if (lpc_bridge->revision == 0x10 && (prefctl & 0x80)) { in sis_find_family()
457 1/ tell IDE channels to operate in Compatibility mode only in init_chipset_sis5513()
458 2/ tell old chips to allow per drive IDE timings */ in init_chipset_sis5513()
465 /* SiS962 operation mode */ in init_chipset_sis5513()
499 /* force per drive recovery and active timings in init_chipset_sis5513()
527 struct pci_dev *pdev = to_pci_dev(hwif->dev); in sis_cable_detect()
531 while (lap->device) { in sis_cable_detect()
532 if (lap->device == pdev->device && in sis_cable_detect()
533 lap->subvendor == pdev->subsystem_vendor && in sis_cable_detect()
534 lap->subdevice == pdev->subsystem_device) in sis_cable_detect()
541 u16 reg_addr = hwif->channel ? 0x52: 0x50; in sis_cable_detect()
546 u8 mask = hwif->channel ? 0x20 : 0x10; in sis_cable_detect()
587 return -ENOTSUPP; in sis5513_init_one()