IDE updates
PATCH 1/1 IDE updates
What's in:
- host driver updates (scc_pata, atiixp, siimage, serverworks)
- various fixes for handling PIO modes
- SCSI-ioctls support for ide-floppy
- some other improvements/cleanups
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6.git/
to receive the following updates:
drivers/ata/pata_pcmcia.c | 1 + drivers/ide/cris/ide-cris.c | 9 +-- drivers/ide/ide-floppy.c | 18 +++++- drivers/ide/ide-io.c | 5 +- drivers/ide/ide-lib.c | 72 ++++++++++++--------- drivers/ide/ide-timing.h | 20 +----- drivers/ide/ide.c | 86 +----------------------- drivers/ide/legacy/ali14xx.c | 7 +- drivers/ide/legacy/dtc2278.c | 3 +- drivers/ide/legacy/ht6560b.c | 12 ++- drivers/ide/legacy/ide-cs.c | 1 + drivers/ide/legacy/qd65xx.c | 21 +++--- drivers/ide/legacy/umc8672.c | 4 +- drivers/ide/mips/au1xxx-ide.c | 4 +- drivers/ide/pci/aec62xx.c | 18 ++---- drivers/ide/pci/alim15x3.c | 5 +- drivers/ide/pci/amd74xx.c | 24 ++++--- drivers/ide/pci/atiixp.c | 37 ++++++---- drivers/ide/pci/cmd640.c | 19 +++--- drivers/ide/pci/cmd64x.c | 21 +++--- drivers/ide/pci/cs5520.c | 6 +- drivers/ide/pci/cs5530.c | 4 +- drivers/ide/pci/cs5535.c | 9 ++- drivers/ide/pci/cy82c693.c | 5 +- drivers/ide/pci/generic.c | 15 ---- drivers/ide/pci/hpt34x.c | 17 ++---- drivers/ide/pci/hpt366.c | 36 ++++------ drivers/ide/pci/it8213.c | 7 +- drivers/ide/pci/it821x.c | 8 +- drivers/ide/pci/jmicron.c | 4 +- drivers/ide/pci/ns87415.c | 1 - drivers/ide/pci/opti621.c | 8 +- drivers/ide/pci/pdc202xx_new.c | 23 ++---- drivers/ide/pci/pdc202xx_old.c | 20 ++---- drivers/ide/pci/piix.c | 8 +- drivers/ide/pci/rz1000.c | 1 - drivers/ide/pci/sc1200.c | 43 +----------- drivers/ide/pci/scc_pata.c | 76 +++++++++++++++++----- drivers/ide/pci/serverworks.c | 105 +++++++++++++++--------------- drivers/ide/pci/sgiioc4.c | 3 +- drivers/ide/pci/siimage.c | 139 ++++++++++++---------------------------- drivers/ide/pci/sis5513.c | 4 +- drivers/ide/pci/sl82c105.c | 22 ++++--- drivers/ide/pci/slc90e66.c | 4 +- drivers/ide/pci/tc86c001.c | 7 +- drivers/ide/pci/triflex.c | 4 +- drivers/ide/pci/trm290.c | 1 - drivers/ide/pci/via82cxxx.c | 26 ++++--- drivers/ide/ppc/mpc8xx.c | 5 +- drivers/ide/ppc/pmac.c | 16 +++-- drivers/ide/setup-pci.c | 18 ++---- include/linux/ata.h | 9 +++ include/linux/ide.h | 31 ++++++--- 53 files changed, 473 insertions(+), 599 deletions(-)
Alan Cox (1):
ide: Stop mapping ROMs
Bartlomiej Zolnierkiewicz (18):
atiixp: PIO mode setup fixes
siimage: PIO mode setup fixes (take 2)
ide: make ide_get_best_pio_mode() print info if overriding PIO mode
ide: add ide_dev_has_iordy() helper (take 4)
ide: add ide_pci_device_t.host_flags (take 2)
serverworks: always tune PIO
serverworks: fix DMA
ide: ide_start_power_step() fix WRT disabling DMA
sc1200: remove stale Power Management code
ide: add ide_pio_cycle_time() helper (take 2)
ide: ide_find_best_pio_mode() fixes (take 2)
ide: drop "PIO data" argument from ide_get_best_pio_mode()
ide: remove ide_find_best_pio_mode()
ide: add PIO masks
ide-cris: handle PIO auto-tuning in tune_cris_ide()
ide: remove stale changelog/comments/TODO from ide.c
ide: remove stale changelog from setup-pci.c
ide: add support for SCSI ioctls to ide-floppy
Kou Ishizaki (1):
scc_pata.c: Workaround for errata A308 (take 2)
Kumar Gala (1):
scc_pata: Use inline function for eieio
Marcin Juszkiewicz (1):
PCMCIA: Add another MemoryCard to ide-cs/pata_pcmcia
Robert P. J. Day (1):
IDE: Remove references to dead ETRAX-related variables.
drivers/ata/pata_pcmcia.c +1 -0
@@ -382,6 +382,7 @@ static struct pcmcia_device_id pcmcia_devices[] = {PCMCIA_DEVICE_PROD_ID12 ("HITACHI" ,"microdrive" ,0xf4f43949 ,0xa6d76178 ),PCMCIA_DEVICE_PROD_ID12 ("IBM" ,"microdrive" ,0xb569a6e5 ,0xa6d76178 ),PCMCIA_DEVICE_PROD_ID12 ("IBM" ,"IBM17JSSFP20" ,0xb569a6e5 ,0xf2508753 ), +PCMCIA_DEVICE_PROD_ID12 ("KINGSTON" ,"CF8GB" ,0x2e6d1829 ,0xacbe682e ),PCMCIA_DEVICE_PROD_ID12 ("IO DATA" ,"CBIDE2 " ,0x547e66dc ,0x8671043b ),PCMCIA_DEVICE_PROD_ID12 ("IO DATA" ,"PCIDE" ,0x547e66dc ,0x5c5ab149 ), PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDEII", 0x547e66dc, 0xb3662674),
drivers/ide/cris/ide-cris.c +3 -6
@@ -414,12 +414,6 @@ cris_ide_reset(unsigned val)#ifdef CONFIG_ETRAX_IDE_G27_RESET REG_SHADOW_SET (R_PORT_G_DATA , port_g_data_shadow,27 , val);#endif -#ifdef CONFIG_ETRAX_IDE_CSE1_16_RESET -REG_SHADOW_SET (port_cse1_addr, port_cse1_shadow,16 , val); -#endif -#ifdef CONFIG_ETRAX_IDE_CSP0_8_RESET -REG_SHADOW_SET (port_csp0_addr, port_csp0_shadow,8 , val); -#endif #ifdef CONFIG_ETRAX_IDE_PB7_RESET port_pb_dir_shadow = port_pb_dir_shadow |IO_STATE (R_PORT_PB_DIR , dir7, output);
@@ -690,6 +684,8 @@ static void tune_cris_ide(ide_drive_t *drive, u8 pio) {int setup, strobe, hold; + pio =ide_get_best_pio_mode (drive, pio,4 ); +switch (pio) {case 0 :
@@ -820,6 +816,7 @@ init_e100_ide (void) hwif->dma_host_on = &cris_dma_on; hwif->dma_off_quietly = &cris_dma_off; hwif->cbl =ATA_CBL_PATA40 ; + hwif->pio_mask =ATA_PIO4 , hwif->ultra_mask = cris_ultra_mask; hwif->mwdma_mask =0x07 ;/* Multiword DMA 0-2 */ hwif->autodma =1 ;
drivers/ide/ide-floppy.c +17 -1
@@ -99,6 +99,8 @@#include <linux/bitops.h> #include <linux/mutex.h> +#include <scsi/scsi_ioctl.h> +#include <asm/byteorder.h> #include <asm/irq.h> #include <asm/uaccess.h>
@@ -2099,7 +2101,21 @@ static int idefloppy_ioctl(struct inode *inode, struct file *file,case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS :return idefloppy_get_format_progress (drive, argp); } -return generic_ide_ioctl (drive, file, bdev, cmd, arg); + +/* +* skip SCSI_IOCTL_SEND_COMMAND (deprecated) +* and CDROM_SEND_PACKET (legacy) ioctls +*/ +if (cmd !=CDROM_SEND_PACKET && cmd !=SCSI_IOCTL_SEND_COMMAND ) + err =scsi_cmd_ioctl (file, bdev->bd_disk->queue, + bdev->bd_disk, cmd, argp); +else + err = -ENOTTY ; + +if (err == -ENOTTY ) + err =generic_ide_ioctl (drive, file, bdev, cmd, arg); + +return err; }static int idefloppy_media_changed (struct gendisk *disk)
drivers/ide/ide-io.c +3 -2
@@ -224,11 +224,12 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request ** we could be smarter and check for current xfer_speed * in struct drive etc... */ -if ((drive->id->capability &1 ) ==0 ) -break ;if (drive->hwif->ide_dma_check ==NULL )break ; drive->hwif->dma_off_quietly (drive); +/* +* TODO: respect ->using_dma setting +*/ ide_set_dma (drive);break ; }
drivers/ide/ide-lib.c +42 -30
116 lines not on this page · raw message
drivers/ide/ide-timing.h +2 -18
@@ -106,23 +106,6 @@ static struct ide_timing ide_timing[] = {#define XFER_EPIO 0x01#define XFER_PIO 0x00 -static short ide_find_best_pio_mode (ide_drive_t *drive) -{ -struct hd_driveid *id = drive->id; -short best =0 ; - -if (id->field_valid &2 ) {/* EIDE PIO modes */ - -if ((best = (drive->id->eide_pio_modes &4 ) ?XFER_PIO_5 : - (drive->id->eide_pio_modes &2 ) ?XFER_PIO_4 : - (drive->id->eide_pio_modes &1 ) ?XFER_PIO_3 :0 ))return best; - } - -return (drive->id->tPIO ==2 ) ?XFER_PIO_2 : - (drive->id->tPIO ==1 ) ?XFER_PIO_1 : - (drive->id->tPIO ==0 ) ?XFER_PIO_0 :XFER_PIO_SLOW ; -} -static void ide_timing_quantize (struct ide_timing *t,struct ide_timing *q,int T ,int UT ) { q->setup =EZ (t->setup *1000 ,T );
@@ -212,7 +195,8 @@ static int ide_timing_compute(ide_drive_t *drive, short speed, struct ide_timing*/ if ((speed &XFER_MODE ) !=XFER_PIO ) { -ide_timing_compute (drive,ide_find_best_pio_mode (drive), &p,T ,UT ); +u8 pio =ide_get_best_pio_mode (drive,255 ,5 ); +ide_timing_compute (drive,XFER_PIO_0 + pio, &p,T ,UT );ide_timing_merge (&p, t, t,IDE_TIMING_ALL ); }
drivers/ide/ide.c +4 -82
110 lines not on this page · raw message
drivers/ide/legacy/ali14xx.c +4 -3
@@ -115,13 +115,12 @@ static void ali14xx_tune_drive (ide_drive_t *drive, u8 pio)int time1, time2;u8 param1, param2, param3, param4;unsigned long flags; -ide_pio_data_t d;int bus_speed =system_bus_clock (); - pio =ide_get_best_pio_mode (drive, pio,ALI_MAX_PIO , &d); + pio =ide_get_best_pio_mode (drive, pio,ALI_MAX_PIO );/* calculate timing, according to PIO mode */ - time1 = d.cycle_time; + time1 =ide_pio_cycle_time (drive, pio); time2 = ide_pio_timings[pio].active_time; param3 = param1 = (time2 * bus_speed +999 ) /1000 ; param4 = param2 = (time1 * bus_speed +999 ) /1000 - param1;
@@ -212,10 +211,12 @@ static int __init ali14xx_probe(void) mate = &ide_hwifs[1 ]; hwif->chipset = ide_ali14xx; + hwif->pio_mask =ATA_PIO4 ; hwif->tuneproc = &ali14xx_tune_drive; hwif->mate = mate; mate->chipset = ide_ali14xx; + mate->pio_mask =ATA_PIO4 ; mate->tuneproc = &ali14xx_tune_drive; mate->mate = hwif; mate->channel =1 ;
drivers/ide/legacy/dtc2278.c +2 -1
@@ -71,7 +71,7 @@ static void tune_dtc2278 (ide_drive_t *drive, u8 pio) {unsigned long flags; - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 );if (pio >=3 ) {spin_lock_irqsave (&ide_lock, flags);
@@ -123,6 +123,7 @@ static int __init dtc2278_probe(void) hwif->serialized =1 ; hwif->chipset = ide_dtc2278; + hwif->pio_mask =ATA_PIO4 ; hwif->tuneproc = &tune_dtc2278; hwif->drives[0 ].no_unmask =1 ; hwif->drives[1 ].no_unmask =1 ;
drivers/ide/legacy/ht6560b.c +8 -4
@@ -203,19 +203,21 @@ static u8 ht_pio2timings(ide_drive_t *drive, u8 pio) {int active_time, recovery_time;int active_cycles, recovery_cycles; -ide_pio_data_t d;int bus_speed =system_bus_clock ();if (pio) { - pio =ide_get_best_pio_mode (drive, pio,5 , &d); - +unsigned int cycle_time; + + pio =ide_get_best_pio_mode (drive, pio,5 ); + cycle_time =ide_pio_cycle_time (drive, pio); +/* * Just like opti621.c we try to calculate the * actual cycle time for recovery and activity * according system bus speed. */ active_time = ide_pio_timings[pio].active_time; - recovery_time = d.cycle_time + recovery_time = cycle_time - active_time - ide_pio_timings[pio].setup_time;/*
@@ -331,12 +333,14 @@ int __init ht6560b_init(void) hwif->chipset = ide_ht6560b; hwif->selectproc = &ht6560b_selectproc; + hwif->pio_mask =ATA_PIO5 ; hwif->tuneproc = &tune_ht6560b; hwif->serialized =1 ;/* is this needed? */ hwif->mate = mate; mate->chipset = ide_ht6560b; mate->selectproc = &ht6560b_selectproc; + mate->pio_mask =ATA_PIO5 ; mate->tuneproc = &tune_ht6560b; mate->serialized =1 ;/* is this needed? */ mate->mate = hwif;
drivers/ide/legacy/ide-cs.c +1 -0
@@ -386,6 +386,7 @@ static struct pcmcia_device_id ide_ids[] = {PCMCIA_DEVICE_PROD_ID12 ("HITACHI" ,"microdrive" ,0xf4f43949 ,0xa6d76178 ),PCMCIA_DEVICE_PROD_ID12 ("IBM" ,"microdrive" ,0xb569a6e5 ,0xa6d76178 ),PCMCIA_DEVICE_PROD_ID12 ("IBM" ,"IBM17JSSFP20" ,0xb569a6e5 ,0xf2508753 ), +PCMCIA_DEVICE_PROD_ID12 ("KINGSTON" ,"CF8GB" ,0x2e6d1829 ,0xacbe682e ),PCMCIA_DEVICE_PROD_ID12 ("IO DATA" ,"CBIDE2 " ,0x547e66dc ,0x8671043b ),PCMCIA_DEVICE_PROD_ID12 ("IO DATA" ,"PCIDE" ,0x547e66dc ,0x5c5ab149 ), PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDEII", 0x547e66dc, 0xb3662674),
drivers/ide/legacy/qd65xx.c +11 -10
@@ -252,38 +252,38 @@ static void qd6500_tune_drive (ide_drive_t *drive, u8 pio)static void qd6580_tune_drive (ide_drive_t *drive,u8 pio) { -ide_pio_data_t d;int base =HWIF (drive)->select_data; +unsigned int cycle_time;int active_time =175 ;int recovery_time =415 ;/* worst case values from the dos driver */ if (drive->id && !qd_find_disk_type (drive, &active_time, &recovery_time)) { - pio =ide_get_best_pio_mode (drive, pio,4 , &d); + pio =ide_get_best_pio_mode (drive, pio,4 ); + cycle_time =ide_pio_cycle_time (drive, pio);switch (pio) {case 0 :break ;case 3 : -if (d.cycle_time >=110 ) { +if (cycle_time >=110 ) { active_time =86 ; - recovery_time = d.cycle_time -102 ; + recovery_time = cycle_time -102 ; }else printk (KERN_WARNING "%s: Strange recovery time !\n" ,drive->name);break ;case 4 : -if (d.cycle_time >=69 ) { +if (cycle_time >=69 ) { active_time =70 ; - recovery_time = d.cycle_time -61 ; + recovery_time = cycle_time -61 ; }else printk (KERN_WARNING "%s: Strange recovery time !\n" ,drive->name);break ;default : -if (d.cycle_time >=180 ) { +if (cycle_time >=180 ) { active_time =110 ; - recovery_time = d.cycle_time -120 ; + recovery_time = cycle_time -120 ; }else { active_time = ide_pio_timings[pio].active_time; - recovery_time = d.cycle_time - -active_time; + recovery_time = cycle_time - active_time; } }printk (KERN_INFO "%s: PIO mode%d\n" , drive->name,pio);
@@ -346,6 +346,7 @@ static void __init qd_setup(ide_hwif_t *hwif, int base, int config, hwif->drives[1 ].drive_data = data1; hwif->drives[0 ].io_32bit = hwif->drives[1 ].io_32bit =1 ; + hwif->pio_mask =ATA_PIO4 ; hwif->tuneproc = tuneproc;probe_hwif_init (hwif); }
drivers/ide/legacy/umc8672.c +3 -1
@@ -110,7 +110,7 @@ static void tune_umc (ide_drive_t *drive, u8 pio)unsigned long flags;ide_hwgroup_t *hwgroup = ide_hwifs[HWIF (drive)->index^1 ].hwgroup; - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 );printk ("%s: setting umc8672 to PIO mode%d (speed %d)\n" , drive->name, pio, pio_to_umc[pio]);spin_lock_irqsave (&ide_lock, flags);
@@ -149,10 +149,12 @@ static int __init umc8672_probe(void) mate = &ide_hwifs[1 ]; hwif->chipset = ide_umc8672; + hwif->pio_mask =ATA_PIO4 ; hwif->tuneproc = &tune_umc; hwif->mate = mate; mate->chipset = ide_umc8672; + mate->pio_mask =ATA_PIO4 ; mate->tuneproc = &tune_umc; mate->mate = hwif; mate->channel =1 ;
drivers/ide/mips/au1xxx-ide.c +3 -1
@@ -106,7 +106,7 @@ static void auide_tune_drive(ide_drive_t *drive, byte pio)u8 speed;/* get the best pio mode for the drive */ - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 );printk (KERN_INFO "%s: setting Au1XXX IDE to PIO mode%d\n" , drive->name, pio);
@@ -692,6 +692,8 @@ static int au_ide_probe(struct device *dev) hwif->swdma_mask =0x0 ;#endif + hwif->pio_mask =ATA_PIO4 ; + hwif->noprobe =0 ; hwif->drives[0 ].unmask =1 ; hwif->drives[1 ].unmask =1 ;
drivers/ide/pci/aec62xx.c +6 -12
@@ -142,7 +142,7 @@ static int aec6260_tune_chipset (ide_drive_t *drive, u8 xferspeed)static void aec62xx_tune_drive (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 ); (void )HWIF (drive)->speedproc (drive, pio +XFER_PIO_0 ); }
@@ -174,12 +174,6 @@ static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const ch {int bus_speed =system_bus_clock (); -if (dev->resource[PCI_ROM_RESOURCE ].start) { -pci_write_config_dword (dev,PCI_ROM_ADDRESS , dev->resource[PCI_ROM_RESOURCE ].start |PCI_ROM_ADDRESS_ENABLE ); -printk (KERN_INFO "%s: ROM enabled at 0x%08lx\n" , name, - (unsigned long )dev->resource[PCI_ROM_RESOURCE ].start); - } -if (bus_speed <=33 )pci_set_drvdata (dev, (void *) aec6xxx_33_base);else
@@ -271,48 +265,48 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = { .init_setup = init_setup_aec62xx, .init_chipset = init_chipset_aec62xx, .init_hwif = init_hwif_aec62xx, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask = 0x07, /* udma0-2 */ },{ /* 1 */ .name = "AEC6260", .init_setup = init_setup_aec62xx, .init_chipset = init_chipset_aec62xx, .init_hwif = init_hwif_aec62xx, - .channels = 2, .autodma = NOAUTODMA, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask =0x1f ,/* udma0-4 */ },{ /* 2 */ .name = "AEC6260R", .init_setup = init_setup_aec62xx, .init_chipset = init_chipset_aec62xx, .init_hwif = init_hwif_aec62xx, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, .bootable = NEVER_BOARD, + .pio_mask = ATA_PIO4, .udma_mask = 0x1f, /* udma0-4 */ },{ /* 3 */ .name = "AEC6280", .init_setup = init_setup_aec6x80, .init_chipset = init_chipset_aec62xx, .init_hwif = init_hwif_aec62xx, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask = 0x3f, /* udma0-5 */ },{ /* 4 */ .name = "AEC6280R", .init_setup = init_setup_aec6x80, .init_chipset = init_chipset_aec62xx, .init_hwif = init_hwif_aec62xx, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask = 0x3f, /* udma0-5 */ } };
drivers/ide/pci/alim15x3.c +2 -3
@@ -295,7 +295,6 @@ static int ali_get_info (char *buffer, char **addr, off_t offset, int count)static u8 ali15x3_tune_pio (ide_drive_t *drive,u8 pio) { -ide_pio_data_t d;ide_hwif_t *hwif =HWIF (drive);struct pci_dev *dev = hwif->pci_dev;int s_time, a_time, c_time;
@@ -307,7 +306,7 @@ static u8 ali15x3_tune_pio (ide_drive_t *drive, u8 pio)u8 cd_dma_fifo =0 ;int unit = drive->select.b.unit &1 ; - pio =ide_get_best_pio_mode (drive, pio,5 , &d); + pio =ide_get_best_pio_mode (drive, pio,5 ); s_time = ide_pio_timings[pio].setup_time; a_time = ide_pio_timings[pio].active_time;if ((s_clc = (s_time * bus_speed +999 ) /1000 ) >=8 )
@@ -817,9 +816,9 @@ static ide_pci_device_t ali15x3_chipset __devinitdata = { .init_chipset = init_chipset_ali15x3, .init_hwif = init_hwif_ali15x3, .init_dma = init_dma_ali15x3, - .channels = 2, .autodma = AUTODMA, .bootable = ON_BOARD, + .pio_mask = ATA_PIO5, };/**
drivers/ide/pci/amd74xx.c +14 -10
@@ -1,5 +1,5 @@/* -* Version 2.20 +* Version 2.21 * * AMD 755/756/766/8111 and nVidia nForce/2/2s/3/3s/CK804/MCP04 * IDE driver for Linux.
@@ -272,10 +272,8 @@ static int amd_set_drive(ide_drive_t *drive, u8 speed)static void amd74xx_tune_drive (ide_drive_t *drive,u8 pio) { -if (pio ==255 ) { -amd_set_drive (drive,ide_find_best_pio_mode (drive)); -return ; - } +if (pio ==255 ) + pio =ide_get_best_pio_mode (drive,255 ,5 );amd_set_drive (drive,XFER_PIO_0 +min_t (byte, pio,5 )); }
@@ -284,12 +282,14 @@ static int amd74xx_ide_dma_check(ide_drive_t *drive) {u8 speed =ide_max_dma_mode (drive); -if (speed ==0 ) - speed =ide_find_best_pio_mode (drive); +if (speed ==0 ) { +amd74xx_tune_drive (drive,255 ); +return -1 ; + }amd_set_drive (drive, speed); -if (drive->autodma && (speed &XFER_MODE ) !=XFER_PIO ) +if (drive->autodma)return 0 ;return -1 ;
@@ -448,10 +448,12 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif) .name = name_str, \ .init_chipset = init_chipset_amd74xx, \ .init_hwif = init_hwif_amd74xx, \ - .channels = 2, \ .autodma = AUTODMA, \ .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, \ .bootable = ON_BOARD, \ + .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST \ + | IDE_HFLAG_PIO_NO_DOWNGRADE, \ + .pio_mask = ATA_PIO5, \ }#define DECLARE_NV_DEV (name_str) \
@@ -459,10 +461,12 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif) .name = name_str, \ .init_chipset = init_chipset_amd74xx, \ .init_hwif = init_hwif_amd74xx, \ - .channels = 2, \ .autodma = AUTODMA, \ .enablebits = {{0x50,0x02,0x02}, {0x50,0x01,0x01}}, \ .bootable = ON_BOARD, \ + .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST \ + | IDE_HFLAG_PIO_NO_DOWNGRADE, \ + .pio_mask = ATA_PIO5, \ }static ide_pci_device_t amd74xx_chipsets[]__devinitdata = {
drivers/ide/pci/atiixp.c +22 -15
@@ -1,9 +1,8 @@/* -* linux/drivers/ide/pci/atiixp.c Version 0.01-bart2 Feb. 26, 2004 +* linux/drivers/ide/pci/atiixp.c Version 0.02 Jun 16 2007 * * Copyright (C) 2003 ATI Inc. <[email protected]> -* Copyright (C) 2004 Bartlomiej Zolnierkiewicz -* +* Copyright (C) 2004,2007 Bartlomiej Zolnierkiewicz */ #include <linux/types.h>
@@ -123,14 +122,14 @@ static void atiixp_dma_host_off(ide_drive_t *drive) }/** -* atiixp_tune_drive - tune a drive attached to a ATIIXP +* atiixp_tune_pio - tune a drive attached to a ATIIXP * @drive: drive to tune * @pio: desired PIO mode * * Set the interface PIO mode. */ -static void atiixp_tuneproc (ide_drive_t *drive,u8 pio) +static void atiixp_tune_pio (ide_drive_t *drive,u8 pio) {struct pci_dev *dev = drive->hwif->pci_dev;unsigned long flags;
@@ -154,6 +153,13 @@ static void atiixp_tuneproc(ide_drive_t *drive, u8 pio)spin_unlock_irqrestore (&atiixp_lock, flags); } +static void atiixp_tuneproc (ide_drive_t *drive,u8 pio) +{ + pio =ide_get_best_pio_mode (drive, pio,4 ); +atiixp_tune_pio (drive, pio); + (void )ide_config_drive_speed (drive,XFER_PIO_0 + pio); +} +/** * atiixp_tune_chipset - tune a ATIIXP interface * @drive: IDE drive to tune
@@ -175,6 +181,11 @@ static int atiixp_speedproc(ide_drive_t *drive, u8 xferspeed) speed =ide_rate_filter (drive, xferspeed); +if (speed >=XFER_PIO_0 && speed <=XFER_PIO_4 ) { +atiixp_tune_pio (drive, speed -XFER_PIO_0 ); +return ide_config_drive_speed (drive, speed); + } +spin_lock_irqsave (&atiixp_lock, flags); save_mdma_mode[drive->dn] =0 ;
@@ -201,7 +212,7 @@ static int atiixp_speedproc(ide_drive_t *drive, u8 xferspeed)else pio = speed -XFER_PIO_0 ; -atiixp_tuneproc (drive, pio); +atiixp_tune_pio (drive, pio);return ide_config_drive_speed (drive, speed); }
@@ -216,18 +227,13 @@ static int atiixp_speedproc(ide_drive_t *drive, u8 xferspeed)static int atiixp_dma_check (ide_drive_t *drive) { -u8 tspeed, speed; - drive->init_speed =0 ;if (ide_tune_dma (drive))return 0 ; -if (ide_use_fast_pio (drive)) { - tspeed =ide_get_best_pio_mode (drive,255 ,5 ,NULL ); - speed =atiixp_dma_2_pio (XFER_PIO_0 + tspeed) +XFER_PIO_0 ; -atiixp_speedproc (drive, speed); - } +if (ide_use_fast_pio (drive)) +atiixp_tuneproc (drive,255 );return -1 ; }
@@ -285,17 +291,18 @@ static ide_pci_device_t atiixp_pci_info[] __devinitdata = { {/* 0 */ .name = "ATIIXP", .init_hwif = init_hwif_atiixp, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x48,0x01,0x00}, {0x48,0x08,0x00}}, .bootable = ON_BOARD, + .pio_mask = ATA_PIO4, },{ /* 1 */ .name = "SB600_PATA", .init_hwif = init_hwif_atiixp, - .channels = 1, .autodma = AUTODMA, .enablebits = {{0x48,0x01,0x00}, {0x00,0x00,0x00}}, .bootable = ON_BOARD, + .host_flags = IDE_HFLAG_SINGLE, + .pio_mask = ATA_PIO4, }, };
drivers/ide/pci/cmd640.c +9 -10
@@ -633,9 +633,8 @@ static void cmd640_set_mode (unsigned int index, u8 pio_mode, unsigned int cycle*/ static void cmd640_tune_drive (ide_drive_t *drive,u8 mode_wanted) { +unsigned int index =0 , cycle_time;u8 b; -ide_pio_data_t d; -unsigned int index =0 ;while (drive != cmd_drives[index]) {if (++index >3 ) {
@@ -662,16 +661,14 @@ static void cmd640_tune_drive (ide_drive_t *drive, u8 mode_wanted) return; } - (void )ide_get_best_pio_mode (drive, mode_wanted,5 , &d); -cmd640_set_mode (index, d.pio_mode, d.cycle_time); + mode_wanted =ide_get_best_pio_mode (drive, mode_wanted,5 ); + cycle_time =ide_pio_cycle_time (drive, mode_wanted); +cmd640_set_mode (index, mode_wanted, cycle_time); + +printk ("%s: selected cmd640 PIO mode%d (%dns)" , + drive->name, mode_wanted, cycle_time); -printk ("%s: selected cmd640 PIO mode%d (%dns)%s" , - drive->name, - d.pio_mode, - d.cycle_time, - d.overridden ?" (overriding vendor mode)" :"" );display_clocks (index); -return ; }#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
@@ -769,6 +766,7 @@ int __init ide_probe_for_cmd640x (void) cmd_hwif0->name, 'a' + cmd640_chip_version - 1, bus_type, cfr); cmd_hwif0->chipset = ide_cmd640;#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED + cmd_hwif0->pio_mask =ATA_PIO5 ; cmd_hwif0->tuneproc = &cmd640_tune_drive;#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
@@ -824,6 +822,7 @@ int __init ide_probe_for_cmd640x (void) cmd_hwif1->mate = cmd_hwif0; cmd_hwif1->channel =1 ;#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED + cmd_hwif1->pio_mask =ATA_PIO5 ; cmd_hwif1->tuneproc = &cmd640_tune_drive;#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ }
drivers/ide/pci/cmd64x.c +11 -10
@@ -221,17 +221,18 @@ static u8 cmd64x_tune_pio (ide_drive_t *drive, u8 mode_wanted) {ide_hwif_t *hwif =HWIF (drive);struct pci_dev *dev = hwif->pci_dev; -ide_pio_data_t pio; +unsigned int cycle_time;u8 pio_mode, setup_count, arttim =0 ;static const u8 setup_values[] = {0x40 ,0x40 ,0x40 ,0x80 ,0 ,0xc0 };static const u8 arttim_regs[4 ] = {ARTTIM0 ,ARTTIM1 ,ARTTIM23 ,ARTTIM23 }; - pio_mode =ide_get_best_pio_mode (drive, mode_wanted,5 , &pio); -cmdprintk ("%s: PIO mode wanted %d, selected %d (%d ns)%s\n" , - drive->name, mode_wanted, pio_mode, pio.cycle_time, - pio.overridden ?" (overriding vendor mode)" :"" ); + pio_mode =ide_get_best_pio_mode (drive, mode_wanted,5 ); + cycle_time =ide_pio_cycle_time (drive, pio_mode); -program_cycle_times (drive, pio.cycle_time, +cmdprintk ("%s: PIO mode wanted %d, selected %d (%d ns)\n" , + drive->name, mode_wanted, pio_mode, cycle_time); + +program_cycle_times (drive, cycle_time, ide_pio_timings[pio_mode].active_time); setup_count = quantize_timing(ide_pio_timings[pio_mode].setup_time,
@@ -618,40 +619,40 @@ static ide_pci_device_t cmd64x_chipsets[] __devinitdata = { .init_setup = init_setup_cmd64x, .init_chipset = init_chipset_cmd64x, .init_hwif = init_hwif_cmd64x, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, .bootable = ON_BOARD, + .pio_mask = ATA_PIO5, .udma_mask = 0x00, /* no udma */ },{ /* 1 */ .name = "CMD646", .init_setup = init_setup_cmd646, .init_chipset = init_chipset_cmd64x, .init_hwif = init_hwif_cmd64x, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, .bootable = ON_BOARD, + .pio_mask = ATA_PIO5, .udma_mask = 0x07, /* udma0-2 */ },{ /* 2 */ .name = "CMD648", .init_setup = init_setup_cmd64x, .init_chipset = init_chipset_cmd64x, .init_hwif = init_hwif_cmd64x, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, .bootable = ON_BOARD, + .pio_mask = ATA_PIO5, .udma_mask = 0x1f, /* udma0-4 */ },{ /* 3 */ .name = "CMD649", .init_setup = init_setup_cmd64x, .init_chipset = init_chipset_cmd64x, .init_hwif = init_hwif_cmd64x, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, .bootable = ON_BOARD, + .pio_mask = ATA_PIO5, .udma_mask = 0x3f, /* udma0-5 */ } };
drivers/ide/pci/cs5520.c +3 -3
@@ -126,7 +126,7 @@ static int cs5520_tune_chipset(ide_drive_t *drive, u8 xferspeed)static void cs5520_tune_drive (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 );cs5520_tune_chipset (drive, (XFER_PIO_0 + pio)); }
@@ -194,10 +194,10 @@ static void __devinit init_hwif_cs5520(ide_hwif_t *hwif) .name = name_str, \ .init_setup_dma = cs5520_init_setup_dma, \ .init_hwif = init_hwif_cs5520, \ - .channels = 2, \ .autodma = AUTODMA, \ .bootable = ON_BOARD, \ - .flags = IDEPCI_FLAG_ISA_PORTS, \ + .host_flags = IDE_HFLAG_ISA_PORTS, \ + .pio_mask = ATA_PIO4, \ }static ide_pci_device_t cyrix_chipsets[]__devinitdata = {
drivers/ide/pci/cs5530.c +2 -2
@@ -82,7 +82,7 @@ static void cs5530_tunepio(ide_drive_t *drive, u8 pio)static void cs5530_tuneproc (ide_drive_t *drive,u8 pio)/* pio=255 means "autotune" */ { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 );if (cs5530_set_xfer_mode (drive,XFER_PIO_0 + pio) ==0 )cs5530_tunepio (drive, pio);
@@ -341,9 +341,9 @@ static ide_pci_device_t cs5530_chipset __devinitdata = { .name = "CS5530", .init_chipset = init_chipset_cs5530, .init_hwif = init_hwif_cs5530, - .channels = 2, .autodma = AUTODMA, .bootable = ON_BOARD, + .pio_mask = ATA_PIO4, };static int __devinit cs5530_init_one (struct pci_dev *dev,const struct pci_device_id *id)
drivers/ide/pci/cs5535.c +5 -4
@@ -89,7 +89,7 @@ static void cs5535_set_speed(ide_drive_t *drive, u8 speed) pioa = speed -XFER_PIO_0 ; piob =ide_get_best_pio_mode (&(drive->hwif->drives[!unit]), -255 ,4 ,NULL ); +255 ,4 ); cmd = pioa < piob ? pioa : piob;/* Write the speed of the current drive */
@@ -159,7 +159,7 @@ static void cs5535_tuneproc(ide_drive_t *drive, u8 xferspeed)/* cs5535 max pio is pio 4, best_pio will check the blacklist. i think we don't need to rate_filter the incoming xferspeed since we know we're only going to choose pio */ - xferspeed =ide_get_best_pio_mode (drive, xferspeed,4 ,NULL ); + xferspeed =ide_get_best_pio_mode (drive, xferspeed,4 );ide_config_drive_speed (drive, modes[xferspeed]);cs5535_set_speed (drive, xferspeed); }
@@ -174,7 +174,7 @@ static int cs5535_dma_check(ide_drive_t *drive)return 0 ;if (ide_use_fast_pio (drive)) { - speed =ide_get_best_pio_mode (drive,255 ,4 ,NULL ); + speed =ide_get_best_pio_mode (drive,255 ,4 );cs5535_set_drive (drive, speed); }
@@ -228,9 +228,10 @@ static void __devinit init_hwif_cs5535(ide_hwif_t *hwif)static ide_pci_device_t cs5535_chipset__devinitdata = { .name ="CS5535" , .init_hwif = init_hwif_cs5535, - .channels =1 , .autodma =AUTODMA , .bootable =ON_BOARD , + .host_flags =IDE_HFLAG_SINGLE , + .pio_mask =ATA_PIO4 , }; static int __devinit cs5535_init_one(struct pci_dev *dev,
drivers/ide/pci/cy82c693.c +3 -2
@@ -330,7 +330,7 @@ static void cy82c693_tune_drive (ide_drive_t *drive, u8 pio)#endif /* CY82C693_DEBUG_LOGS */ /* first let's calc the pio modes */ - pio =ide_get_best_pio_mode (drive, pio,CY82C693_MAX_PIO ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,CY82C693_MAX_PIO );#if CY82C693_DEBUG_INFO printk (KERN_INFO "%s: Selected PIO mode %d\n" , drive->name, pio);
@@ -483,9 +483,10 @@ static ide_pci_device_t cy82c693_chipset __devinitdata = { .init_chipset = init_chipset_cy82c693, .init_iops = init_iops_cy82c693, .init_hwif = init_hwif_cy82c693, - .channels = 1, .autodma = AUTODMA, .bootable = ON_BOARD, + .host_flags = IDE_HFLAG_SINGLE, + .pio_mask = ATA_PIO4, };static int __devinit cy82c693_init_one (struct pci_dev *dev,const struct pci_device_id *id)
drivers/ide/pci/generic.c +0 -15
@@ -95,92 +95,77 @@ static ide_pci_device_t generic_chipsets[] __devinitdata = { { /* 0 */ .name = "Unknown", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = AUTODMA, .bootable = ON_BOARD, },{ /* 1 */ .name = "NS87410", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x43,0x08,0x08}, {0x47,0x08,0x08}}, .bootable = ON_BOARD, },{ /* 2 */ .name = "SAMURAI", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = AUTODMA, .bootable = ON_BOARD, },{ /* 3 */ .name = "HT6565", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = AUTODMA, .bootable = ON_BOARD, },{ /* 4 */ .name = "UM8673F", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = NODMA, .bootable = ON_BOARD, },{ /* 5 */ .name = "UM8886A", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = NODMA, .bootable = ON_BOARD, },{ /* 6 */ .name = "UM8886BF", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = NODMA, .bootable = ON_BOARD, },{ /* 7 */ .name = "HINT_IDE", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = AUTODMA, .bootable = ON_BOARD, },{ /* 8 */ .name = "VIA_IDE", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = NOAUTODMA, .bootable = ON_BOARD, },{ /* 9 */ .name = "OPTI621V", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = NOAUTODMA, .bootable = ON_BOARD, },{ /* 10 */ .name = "VIA8237SATA", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, },{ /* 11 */ .name = "Piccolo0102", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = NOAUTODMA, .bootable = ON_BOARD, },{ /* 12 */ .name = "Piccolo0103", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = NOAUTODMA, .bootable = ON_BOARD, },{ /* 13 */ .name = "Piccolo0105", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = NOAUTODMA, .bootable = ON_BOARD, },{ /* 14 */ .name = "Revolution", .init_hwif = init_hwif_generic, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, }
drivers/ide/pci/hpt34x.c +5 -12
@@ -80,7 +80,7 @@ static int hpt34x_tune_chipset (ide_drive_t *drive, u8 xferspeed)static void hpt34x_tune_drive (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,5 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,5 ); (void )hpt34x_tune_chipset (drive, (XFER_PIO_0 + pio)); }
@@ -120,17 +120,10 @@ static unsigned int __devinit init_chipset_hpt34x(struct pci_dev *dev, const chapci_write_config_byte (dev,HPT34X_PCI_INIT_REG ,0x00 );pci_read_config_word (dev,PCI_COMMAND , &cmd); -if (cmd &PCI_COMMAND_MEMORY ) { -if (pci_resource_start (dev,PCI_ROM_RESOURCE )) { -pci_write_config_dword (dev,PCI_ROM_ADDRESS , - dev->resource[PCI_ROM_RESOURCE ].start |PCI_ROM_ADDRESS_ENABLE ); -printk (KERN_INFO "HPT345: ROM enabled at 0x%08lx\n" , - (unsigned long )dev->resource[PCI_ROM_RESOURCE ].start); - } +if (cmd &PCI_COMMAND_MEMORY )pci_write_config_byte (dev,PCI_LATENCY_TIMER ,0xF0 ); - }else { +else pci_write_config_byte (dev,PCI_LATENCY_TIMER ,0x20 ); - }/* * Since 20-23 can be assigned and are R/W, we correct them.
@@ -182,10 +175,10 @@ static ide_pci_device_t hpt34x_chipset __devinitdata = { .name = "HPT34X", .init_chipset = init_chipset_hpt34x, .init_hwif = init_hwif_hpt34x, - .channels = 2, .autodma = NOAUTODMA, .bootable = NEVER_BOARD, - .extra = 16 + .extra = 16, + .pio_mask = ATA_PIO5, };static int __devinit hpt34x_init_one (struct pci_dev *dev,const struct pci_device_id *id)
drivers/ide/pci/hpt366.c +14 -22
@@ -652,7 +652,7 @@ static int hpt3xx_tune_chipset(ide_drive_t *drive, u8 speed)static void hpt3xx_tune_drive (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 ); (void )hpt3xx_tune_chipset (drive,XFER_PIO_0 + pio); }
@@ -994,14 +994,6 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha*/ *info = *(struct hpt_info *)pci_get_drvdata (dev); -/* -* FIXME: Not portable. Also, why do we enable the ROM in the first place? -* We don't seem to be using it. -*/ -if (dev->resource[PCI_ROM_RESOURCE ].start) -pci_write_config_dword (dev,PCI_ROM_ADDRESS , - dev->resource[PCI_ROM_RESOURCE ].start |PCI_ROM_ADDRESS_ENABLE ); -pci_write_config_byte (dev,PCI_CACHE_LINE_SIZE , (L1_CACHE_BYTES /4 ));pci_write_config_byte (dev,PCI_LATENCY_TIMER ,0x78 );pci_write_config_byte (dev,PCI_MIN_GNT ,0x08 );
@@ -1491,7 +1483,7 @@ static int __devinit init_setup_hpt366(struct pci_dev *dev, ide_pci_device_t *d)* to both functions -- really stupid design decision... :-( * Bit 4 is for the primary channel, bit 5 for the secondary. */ - d->channels =1 ; + d->host_flags |=IDE_HFLAG_SINGLE ; d->enablebits[0 ].mask = d->enablebits[0 ].val =0x10 ; d->udma_mask = HPT366_ALLOW_ATA66_3 ?
@@ -1554,71 +1546,71 @@ static ide_pci_device_t hpt366_chipsets[] __devinitdata = { .init_chipset = init_chipset_hpt366, .init_hwif = init_hwif_hpt366, .init_dma = init_dma_hpt366, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .bootable = OFF_BOARD, - .extra = 240 + .extra = 240, + .pio_mask = ATA_PIO4, },{ /* 1 */ .name = "HPT372A", .init_setup = init_setup_hpt372a, .init_chipset = init_chipset_hpt366, .init_hwif = init_hwif_hpt366, .init_dma = init_dma_hpt366, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .udma_mask = HPT372_ALLOW_ATA133_6 ? 0x7f : 0x3f, .bootable = OFF_BOARD, - .extra = 240 + .extra = 240, + .pio_mask = ATA_PIO4, },{ /* 2 */ .name = "HPT302", .init_setup = init_setup_hpt302, .init_chipset = init_chipset_hpt366, .init_hwif = init_hwif_hpt366, .init_dma = init_dma_hpt366, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .udma_mask = HPT302_ALLOW_ATA133_6 ? 0x7f : 0x3f, .bootable = OFF_BOARD, - .extra = 240 + .extra = 240, + .pio_mask = ATA_PIO4, },{ /* 3 */ .name = "HPT371", .init_setup = init_setup_hpt371, .init_chipset = init_chipset_hpt366, .init_hwif = init_hwif_hpt366, .init_dma = init_dma_hpt366, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .udma_mask = HPT371_ALLOW_ATA133_6 ? 0x7f : 0x3f, .bootable = OFF_BOARD, - .extra = 240 + .extra = 240, + .pio_mask = ATA_PIO4, },{ /* 4 */ .name = "HPT374", .init_setup = init_setup_hpt374, .init_chipset = init_chipset_hpt366, .init_hwif = init_hwif_hpt366, .init_dma = init_dma_hpt366, - .channels = 2, /* 4 */ .autodma = AUTODMA, .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .udma_mask = 0x3f, .bootable = OFF_BOARD, - .extra = 240 + .extra = 240, + .pio_mask = ATA_PIO4, },{ /* 5 */ .name = "HPT372N", .init_setup = init_setup_hpt372n, .init_chipset = init_chipset_hpt366, .init_hwif = init_hwif_hpt366, .init_dma = init_dma_hpt366, - .channels = 2, /* 4 */ .autodma = AUTODMA, .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .udma_mask = HPT372_ALLOW_ATA133_6 ? 0x7f : 0x3f, .bootable = OFF_BOARD, - .extra = 240 + .extra = 240, + .pio_mask = ATA_PIO4, } };
drivers/ide/pci/it8213.c +4 -3
@@ -82,7 +82,7 @@ static void it8213_tuneproc (ide_drive_t *drive, u8 pio) { 2, 1 }, { 2, 3 }, }; - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 );spin_lock_irqsave (&tune_lock, flags);pci_read_config_word (dev, master_port, &master_data);
@@ -214,7 +214,7 @@ static int it8213_config_drive_for_dma (ide_drive_t *drive)if (ide_tune_dma (drive))return 0 ; - pio =ide_get_best_pio_mode (drive,255 ,4 ,NULL ); + pio =ide_get_best_pio_mode (drive,255 ,4 );it8213_tune_chipset (drive,XFER_PIO_0 + pio);return -1 ;
@@ -272,10 +272,11 @@ static void __devinit init_hwif_it8213(ide_hwif_t *hwif) { \ .name = name_str, \ .init_hwif = init_hwif_it8213, \ - .channels = 1, \ .autodma = AUTODMA, \ .enablebits = {{0x41,0x80,0x80}}, \ .bootable = ON_BOARD, \ + .host_flags = IDE_HFLAG_SINGLE, \ + .pio_mask = ATA_PIO4, \ }static ide_pci_device_t it8213_chipsets[]__devinitdata = {
drivers/ide/pci/it821x.c +4 -4
@@ -255,7 +255,7 @@ static int it821x_tunepio(ide_drive_t *drive, u8 set_pio)* on the cable. */ if (pair) { -u8 pair_pio =ide_get_best_pio_mode (pair,255 ,4 ,NULL ); +u8 pair_pio =ide_get_best_pio_mode (pair,255 ,4 );/* trim PIO to the slowest of the master/slave */ if (pair_pio < set_pio) set_pio = pair_pio;
@@ -276,7 +276,7 @@ static int it821x_tunepio(ide_drive_t *drive, u8 set_pio)static void it821x_tuneproc (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 ); (void )it821x_tunepio (drive, pio); }
@@ -718,10 +718,10 @@ static unsigned int __devinit init_chipset_it821x(struct pci_dev *dev, const cha .name = name_str, \ .init_chipset = init_chipset_it821x, \ .init_hwif = init_hwif_it821x, \ - .channels = 2, \ .autodma = AUTODMA, \ .bootable = ON_BOARD, \ - .fixup = it821x_fixups \ + .fixup = it821x_fixups, \ + .pio_mask = ATA_PIO4, \ }static ide_pci_device_t it821x_chipsets[]__devinitdata = {
drivers/ide/pci/jmicron.c +2 -2
@@ -97,7 +97,7 @@ static void jmicron_tuneproc (ide_drive_t *drive, byte mode_wanted)static void config_jmicron_chipset_for_pio (ide_drive_t *drive,byte set_speed) { -u8 speed =XFER_PIO_0 +ide_get_best_pio_mode (drive,255 ,5 ,NULL ); +u8 speed =XFER_PIO_0 +ide_get_best_pio_mode (drive,255 ,5 );if (set_speed) (void )ide_config_drive_speed (drive, speed); }
@@ -177,10 +177,10 @@ fallback: { \ .name = name_str, \ .init_hwif = init_hwif_jmicron, \ - .channels = 2, \ .autodma = AUTODMA, \ .bootable = ON_BOARD, \ .enablebits = { {0x40, 1, 1}, {0x40, 0x10, 0x10} }, \ + .pio_mask = ATA_PIO5, \ }static ide_pci_device_t jmicron_chipsets[]__devinitdata = {
drivers/ide/pci/ns87415.c +0 -1
@@ -281,7 +281,6 @@ static ide_pci_device_t ns87415_chipset __devinitdata = { .init_iops = init_iops_ns87415, #endif .init_hwif = init_hwif_ns87415, - .channels = 2, .autodma = AUTODMA, .bootable = ON_BOARD, };
drivers/ide/pci/opti621.c +4 -4
@@ -147,12 +147,12 @@ static void compute_pios(ide_drive_t *drive, u8 pio)int d;ide_hwif_t *hwif =HWIF (drive); - drive->drive_data =ide_get_best_pio_mode (drive, pio,OPTI621_MAX_PIO ,NULL ); + drive->drive_data =ide_get_best_pio_mode (drive, pio,OPTI621_MAX_PIO );for (d =0 ; d <2 ; ++d) { drive = &hwif->drives[d];if (drive->present) {if (drive->drive_data ==PIO_DONT_KNOW ) - drive->drive_data =ide_get_best_pio_mode (drive,255 ,OPTI621_MAX_PIO ,NULL ); + drive->drive_data =ide_get_best_pio_mode (drive,255 ,OPTI621_MAX_PIO );#ifdef OPTI621_DEBUG printk ("%s: Selected PIO mode %d\n" , drive->name, drive->drive_data);
@@ -350,17 +350,17 @@ static ide_pci_device_t opti621_chipsets[] __devinitdata = { {/* 0 */ .name = "OPTI621", .init_hwif = init_hwif_opti621, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x45,0x80,0x00}, {0x40,0x08,0x00}}, .bootable = ON_BOARD, + .pio_mask = ATA_PIO3, },{ /* 1 */ .name = "OPTI621X", .init_hwif = init_hwif_opti621, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x45,0x80,0x00}, {0x40,0x08,0x00}}, .bootable = ON_BOARD, + .pio_mask = ATA_PIO3, } };
drivers/ide/pci/pdc202xx_new.c +8 -15
@@ -219,7 +219,7 @@ static int pdcnew_tune_chipset(ide_drive_t *drive, u8 speed)static void pdcnew_tune_drive (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 ); (void )pdcnew_tune_chipset (drive,XFER_PIO_0 + pio); }
@@ -378,13 +378,6 @@ static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev, const chaint f, r;u8 pll_ctl0, pll_ctl1; -if (dev->resource[PCI_ROM_RESOURCE ].start) { -pci_write_config_dword (dev,PCI_ROM_ADDRESS , - dev->resource[PCI_ROM_RESOURCE ].start |PCI_ROM_ADDRESS_ENABLE ); -printk (KERN_INFO "%s: ROM enabled at 0x%08lx\n" , name, - (unsigned long )dev->resource[PCI_ROM_RESOURCE ].start); - } -#ifdef CONFIG_PPC_PMAC apple_kiwi_init (dev);#endif
@@ -573,63 +566,63 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = { .init_setup = init_setup_pdcnew, .init_chipset = init_chipset_pdcnew, .init_hwif = init_hwif_pdc202new, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask = 0x3f, /* udma0-5 */ },{ /* 1 */ .name = "PDC20269", .init_setup = init_setup_pdcnew, .init_chipset = init_chipset_pdcnew, .init_hwif = init_hwif_pdc202new, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask =0x7f ,/* udma0-6*/ },{ /* 2 */ .name = "PDC20270", .init_setup = init_setup_pdc20270, .init_chipset = init_chipset_pdcnew, .init_hwif = init_hwif_pdc202new, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask = 0x3f, /* udma0-5 */ },{ /* 3 */ .name = "PDC20271", .init_setup = init_setup_pdcnew, .init_chipset = init_chipset_pdcnew, .init_hwif = init_hwif_pdc202new, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask = 0x7f, /* udma0-6*/ },{ /* 4 */ .name = "PDC20275", .init_setup = init_setup_pdcnew, .init_chipset = init_chipset_pdcnew, .init_hwif = init_hwif_pdc202new, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask = 0x7f, /* udma0-6*/ },{ /* 5 */ .name = "PDC20276", .init_setup = init_setup_pdc20276, .init_chipset = init_chipset_pdcnew, .init_hwif = init_hwif_pdc202new, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask = 0x7f, /* udma0-6*/ },{ /* 6 */ .name = "PDC20277", .init_setup = init_setup_pdcnew, .init_chipset = init_chipset_pdcnew, .init_hwif = init_hwif_pdc202new, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, + .pio_mask = ATA_PIO4, .udma_mask = 0x7f, /* udma0-6*/ } };
drivers/ide/pci/pdc202xx_old.c +6 -14
@@ -145,7 +145,7 @@ static int pdc202xx_tune_chipset (ide_drive_t *drive, u8 xferspeed)static void pdc202xx_tune_drive (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 );pdc202xx_tune_chipset (drive,XFER_PIO_0 + pio); }
@@ -316,14 +316,6 @@ static void pdc202xx_reset (ide_drive_t *drive)static unsigned int __devinit init_chipset_pdc202xx (struct pci_dev *dev,const char *name) { -/* This doesn't appear needed */ -if (dev->resource[PCI_ROM_RESOURCE ].start) { -pci_write_config_dword (dev,PCI_ROM_ADDRESS , - dev->resource[PCI_ROM_RESOURCE ].start |PCI_ROM_ADDRESS_ENABLE ); -printk (KERN_INFO "%s: ROM enabled at 0x%08lx\n" , name, - (unsigned long )dev->resource[PCI_ROM_RESOURCE ].start); - } -return dev->irq; }
@@ -449,10 +441,10 @@ static ide_pci_device_t pdc202xx_chipsets[] __devinitdata = { .init_chipset = init_chipset_pdc202xx, .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, .extra = 16, + .pio_mask = ATA_PIO4, .udma_mask =0x07 ,/* udma0-2 */ },{ /* 1 */ .name = "PDC20262",
@@ -460,10 +452,10 @@ static ide_pci_device_t pdc202xx_chipsets[] __devinitdata = { .init_chipset = init_chipset_pdc202xx, .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, .extra = 48, + .pio_mask = ATA_PIO4, .udma_mask =0x1f ,/* udma0-4 */ },{ /* 2 */ .name = "PDC20263",
@@ -471,10 +463,10 @@ static ide_pci_device_t pdc202xx_chipsets[] __devinitdata = { .init_chipset = init_chipset_pdc202xx, .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, .extra = 48, + .pio_mask = ATA_PIO4, .udma_mask =0x1f ,/* udma0-4 */ },{ /* 3 */ .name = "PDC20265",
@@ -482,10 +474,10 @@ static ide_pci_device_t pdc202xx_chipsets[] __devinitdata = { .init_chipset = init_chipset_pdc202xx, .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, .extra = 48, + .pio_mask = ATA_PIO4, .udma_mask =0x3f ,/* udma0-5 */ },{ /* 4 */ .name = "PDC20267",
@@ -493,10 +485,10 @@ static ide_pci_device_t pdc202xx_chipsets[] __devinitdata = { .init_chipset = init_chipset_pdc202xx, .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, - .channels = 2, .autodma = AUTODMA, .bootable = OFF_BOARD, .extra = 48, + .pio_mask = ATA_PIO4, .udma_mask = 0x3f, /* udma0-5 */ } };
drivers/ide/pci/piix.c +4 -4
@@ -219,7 +219,7 @@ static void piix_tune_pio (ide_drive_t *drive, u8 pio)*/ static void piix_tune_drive (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 );piix_tune_pio (drive, pio); (void )ide_config_drive_speed (drive,XFER_PIO_0 + pio); }
@@ -495,10 +495,10 @@ static void __devinit init_hwif_piix(ide_hwif_t *hwif) .name = name_str, \ .init_chipset = init_chipset_piix, \ .init_hwif = init_hwif_piix, \ - .channels = 2, \ .autodma = AUTODMA, \ .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, \ .bootable = ON_BOARD, \ + .pio_mask = ATA_PIO4, \ .udma_mask = udma, \ }
@@ -514,11 +514,11 @@ static ide_pci_device_t piix_pci_info[] __devinitdata = {*/ .name = "MPIIX", .init_hwif = init_hwif_piix, - .channels = 2, .autodma = NODMA, .enablebits = {{0x6d,0xc0,0x80}, {0x6d,0xc0,0xc0}}, .bootable = ON_BOARD, - .flags =IDEPCI_FLAG_ISA_PORTS + .host_flags = IDE_HFLAG_ISA_PORTS, + .pio_mask =ATA_PIO4 , }, /* 3 */ DECLARE_PIIX_DEV("PIIX3", 0x00), /* no udma */
drivers/ide/pci/rz1000.c +0 -1
@@ -52,7 +52,6 @@ static void __devinit init_hwif_rz1000 (ide_hwif_t *hwif)static ide_pci_device_t rz1000_chipset__devinitdata = { .name ="RZ100x" , .init_hwif = init_hwif_rz1000, - .channels =2 , .autodma =NODMA , .bootable =ON_BOARD , };
drivers/ide/pci/sc1200.c +4 -39
73 lines not on this page · raw message
drivers/ide/pci/scc_pata.c +59 -17
129 lines not on this page · raw message
drivers/ide/pci/serverworks.c +51 -54
219 lines not on this page · raw message
drivers/ide/pci/sgiioc4.c +2 -1
@@ -586,6 +586,7 @@ ide_init_sgiioc4(ide_hwif_t * hwif) hwif->ultra_mask =0x0 ;/* Disable Ultra DMA */ hwif->mwdma_mask =0x2 ;/* Multimode-2 DMA */ hwif->swdma_mask =0x2 ; + hwif->pio_mask =0x00 ; hwif->tuneproc =NULL ;/* Sets timing for PIO mode */ hwif->speedproc =NULL ;/* Sets timing for DMA &/or PIO modes */ hwif->selectproc =NULL ;/* Use the default routine to select drive */
@@ -724,10 +725,10 @@ static ide_pci_device_t sgiioc4_chipset __devinitdata = { .name = "SGIIOC4", .init_hwif = ide_init_sgiioc4, .init_dma = ide_dma_sgiioc4, - .channels = 1, .autodma = AUTODMA, /* SGI IOC4 doesn't have enablebits. */ .bootable = ON_BOARD, + .host_flags = IDE_HFLAG_SINGLE, };int
drivers/ide/pci/siimage.c +40 -99
234 lines not on this page · raw message
drivers/ide/pci/sis5513.c +2 -2
@@ -521,7 +521,7 @@ static void config_art_rwp_pio (ide_drive_t *drive, u8 pio)static int sis5513_tune_drive (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 );config_art_rwp_pio (drive, pio);return ide_config_drive_speed (drive,XFER_PIO_0 + pio); }
@@ -878,10 +878,10 @@ static ide_pci_device_t sis5513_chipset __devinitdata = { .name = "SIS5513", .init_chipset = init_chipset_sis5513, .init_hwif = init_hwif_sis5513, - .channels = 2, .autodma = NOAUTODMA, .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, .bootable = ON_BOARD, + .pio_mask = ATA_PIO4, };static int __devinit sis5513_init_one (struct pci_dev *dev,const struct pci_device_id *id)
drivers/ide/pci/sl82c105.c +13 -9
@@ -52,12 +52,13 @@* Convert a PIO mode and cycle time to the required on/off times * for the interface. This has protection against runaway timings. */ -static unsigned int get_pio_timings (ide_pio_data_t *p) +static unsigned int get_pio_timings (ide_drive_t *drive,u8 pio) {unsigned int cmd_on, cmd_off; +u8 iordy =0 ; - cmd_on = (ide_pio_timings[p->pio_mode].active_time +29 ) /30 ; - cmd_off = (p->cycle_time -30 * cmd_on +29 ) /30 ; + cmd_on = (ide_pio_timings[pio].active_time +29 ) /30 ; + cmd_off = (ide_pio_cycle_time (drive, pio) -30 * cmd_on +29 ) /30 ;if (cmd_on ==0 ) cmd_on =1 ;
@@ -65,7 +66,10 @@ static unsigned int get_pio_timings(ide_pio_data_t *p)if (cmd_off ==0 ) cmd_off =1 ; -return (cmd_on -1 ) <<8 | (cmd_off -1 ) | (p->use_iordy ?0x40 :0x00 ); +if (pio >2 ||ide_dev_has_iordy (drive->id)) + iordy =0x40 ; + +return (cmd_on -1 ) <<8 | (cmd_off -1 ) | iordy; }/*
@@ -75,14 +79,13 @@ static u8 sl82c105_tune_pio(ide_drive_t *drive, u8 pio) {struct pci_dev *dev =HWIF (drive)->pci_dev;int reg =0x44 + drive->dn *4 ; -ide_pio_data_t p;u16 drv_ctrl;DBG (("sl82c105_tune_pio(drive:%s, pio:%u)\n" , drive->name, pio)); - pio =ide_get_best_pio_mode (drive, pio,5 , &p); + pio =ide_get_best_pio_mode (drive, pio,5 ); - drv_ctrl =get_pio_timings (&p); + drv_ctrl =get_pio_timings (drive, pio);/* * Store the PIO timings so that we can restore them
@@ -101,7 +104,8 @@ static u8 sl82c105_tune_pio(ide_drive_t *drive, u8 pio) }printk (KERN_DEBUG "%s: selected %s (%dns) (%04X)\n" , drive->name, -ide_xfer_verbose (pio +XFER_PIO_0 ), p.cycle_time, drv_ctrl); +ide_xfer_verbose (pio +XFER_PIO_0 ), +ide_pio_cycle_time (drive, pio), drv_ctrl);return pio; }
@@ -449,10 +453,10 @@ static ide_pci_device_t sl82c105_chipset __devinitdata = { .name = "W82C105", .init_chipset = init_chipset_sl82c105, .init_hwif = init_hwif_sl82c105, - .channels = 2, .autodma = NOAUTODMA, .enablebits = {{0x40,0x01,0x01}, {0x40,0x10,0x10}}, .bootable = ON_BOARD, + .pio_mask = ATA_PIO5, };static int __devinit sl82c105_init_one (struct pci_dev *dev,const struct pci_device_id *id)
drivers/ide/pci/slc90e66.c +2 -2
@@ -103,7 +103,7 @@ static void slc90e66_tune_pio (ide_drive_t *drive, u8 pio)static void slc90e66_tune_drive (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 );slc90e66_tune_pio (drive, pio); (void )ide_config_drive_speed (drive,XFER_PIO_0 + pio); }
@@ -214,10 +214,10 @@ static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif)static ide_pci_device_t slc90e66_chipset__devinitdata = { .name ="SLC90E66" , .init_hwif = init_hwif_slc90e66, - .channels =2 , .autodma =AUTODMA , .enablebits = {{0x41 ,0x80 ,0x80 }, {0x43 ,0x80 ,0x80 }}, .bootable =ON_BOARD , + .pio_mask =ATA_PIO4 , };static int __devinit slc90e66_init_one (struct pci_dev *dev,const struct pci_device_id *id)
drivers/ide/pci/tc86c001.c +4 -3
@@ -47,7 +47,7 @@ static int tc86c001_tune_chipset(ide_drive_t *drive, u8 speed)static void tc86c001_tune_drive (ide_drive_t *drive,u8 pio) { - pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); + pio =ide_get_best_pio_mode (drive, pio,4 ); (void )tc86c001_tune_chipset (drive,XFER_PIO_0 + pio); }
@@ -248,9 +248,10 @@ static ide_pci_device_t tc86c001_chipset __devinitdata = { .name = "TC86C001", .init_chipset = init_chipset_tc86c001, .init_hwif = init_hwif_tc86c001, - .channels = 1, .autodma = AUTODMA, - .bootable = OFF_BOARD + .bootable = OFF_BOARD, + .host_flags = IDE_HFLAG_SINGLE, + .pio_mask = ATA_PIO4, }; static int __devinit tc86c001_init_one(struct pci_dev *dev,
drivers/ide/pci/triflex.c +2 -2
@@ -96,7 +96,7 @@ static int triflex_tune_chipset(ide_drive_t *drive, u8 xferspeed)static void triflex_tune_drive (ide_drive_t *drive,u8 pio) { -int use_pio =ide_get_best_pio_mode (drive, pio,4 ,NULL ); +int use_pio =ide_get_best_pio_mode (drive, pio,4 ); (void )triflex_tune_chipset (drive, (XFER_PIO_0 + use_pio)); }
@@ -129,10 +129,10 @@ static void __devinit init_hwif_triflex(ide_hwif_t *hwif)static ide_pci_device_t triflex_device__devinitdata = { .name ="TRIFLEX" , .init_hwif = init_hwif_triflex, - .channels =2 , .autodma =AUTODMA , .enablebits = {{0x80 ,0x01 ,0x01 }, {0x80 ,0x02 ,0x02 }}, .bootable =ON_BOARD , + .pio_mask =ATA_PIO4 , }; static int __devinit triflex_init_one(struct pci_dev *dev,
drivers/ide/pci/trm290.c +0 -1
@@ -327,7 +327,6 @@ static void __devinit init_hwif_trm290(ide_hwif_t *hwif)static ide_pci_device_t trm290_chipset__devinitdata = { .name ="TRM290" , .init_hwif = init_hwif_trm290, - .channels =2 , .autodma =NOAUTODMA , .bootable =ON_BOARD , };
drivers/ide/pci/via82cxxx.c +15 -11
@@ -1,6 +1,6 @@/* * -* Version 3.45 +* Version 3.46 * * VIA IDE driver for Linux. Supported southbridges: *
@@ -203,10 +203,8 @@ static int via_set_drive(ide_drive_t *drive, u8 speed)static void via82cxxx_tune_drive (ide_drive_t *drive,u8 pio) { -if (pio ==255 ) { -via_set_drive (drive,ide_find_best_pio_mode (drive)); -return ; - } +if (pio ==255 ) + pio =ide_get_best_pio_mode (drive,255 ,5 );via_set_drive (drive,XFER_PIO_0 +min_t (u8, pio,5 )); }
@@ -223,12 +221,14 @@ static int via82cxxx_ide_dma_check (ide_drive_t *drive) {u8 speed =ide_max_dma_mode (drive); -if (speed ==0 ) - speed =ide_find_best_pio_mode (drive); +if (speed ==0 ) { +via82cxxx_tune_drive (drive,255 ); +return -1 ; + }via_set_drive (drive, speed); -if (drive->autodma && (speed &XFER_MODE ) !=XFER_PIO ) +if (drive->autodma)return 0 ;return -1 ;
@@ -498,18 +498,22 @@ static ide_pci_device_t via82cxxx_chipsets[] __devinitdata = { .name = "VP_IDE", .init_chipset = init_chipset_via82cxxx, .init_hwif = init_hwif_via82cxxx, - .channels = 2, .autodma = NOAUTODMA, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, - .bootable = ON_BOARD + .bootable = ON_BOARD, + .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST + | IDE_HFLAG_PIO_NO_DOWNGRADE, + .pio_mask = ATA_PIO5, },{ /* 1 */ .name = "VP_IDE", .init_chipset = init_chipset_via82cxxx, .init_hwif = init_hwif_via82cxxx, - .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, .bootable = ON_BOARD, + .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST + | IDE_HFLAG_PIO_NO_DOWNGRADE, + .pio_mask = ATA_PIO5, } };
drivers/ide/ppc/mpc8xx.c +3 -2
@@ -316,6 +316,7 @@ m8xx_ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port, }/* register routine to tune PIO mode */ + ide_hwifs[data_port].pio_mask =ATA_PIO4 ; ide_hwifs[data_port].tuneproc = m8xx_ide_tuneproc; hw->ack_intr = (ide_ack_intr_t *) ide_interrupt_ack;
@@ -402,6 +403,7 @@ void m8xx_ide_init_hwif_ports (hw_regs_t *hw, }/* register routine to tune PIO mode */ + ide_hwifs[data_port].pio_mask =ATA_PIO4 ; ide_hwifs[data_port].tuneproc = m8xx_ide_tuneproc; hw->ack_intr = (ide_ack_intr_t *) ide_interrupt_ack;
@@ -431,13 +433,12 @@ void m8xx_ide_init_hwif_ports (hw_regs_t *hw,static void m8xx_ide_tuneproc (ide_drive_t *drive,u8 pio) { -ide_pio_data_t d;#if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT)volatile pcmconf8xx_t *pcmp;ulong timing, mask, reg;#endif - pio =ide_get_best_pio_mode (drive, pio,4 , &d); + pio =ide_get_best_pio_mode (drive, pio,4 );#if 1 printk("%s[%d] %s: best PIO mode: %d\n",
drivers/ide/ppc/pmac.c +9 -7
@@ -615,24 +615,25 @@ out:static void pmac_ide_tuneproc (ide_drive_t *drive,u8 pio) { -ide_pio_data_t d;u32 *timings;unsigned accessTicks, recTicks;unsigned accessTime, recTime;pmac_ide_hwif_t * pmif = (pmac_ide_hwif_t *)HWIF (drive)->hwif_data; - +unsigned int cycle_time; +if (pmif ==NULL )return ;/* which drive is it ? */ timings = &pmif->timings[drive->select.b.unit &0x01 ]; - pio =ide_get_best_pio_mode (drive, pio,4 , &d); + pio =ide_get_best_pio_mode (drive, pio,4 ); + cycle_time =ide_pio_cycle_time (drive, pio);switch (pmif->kind) {case controller_sh_ata6: {/* 133Mhz cell */ -u32 tr =kauai_lookup_timing (shasta_pio_timings, d.cycle_time); +u32 tr =kauai_lookup_timing (shasta_pio_timings, cycle_time);if (tr ==0 )return ; *timings = ((*timings) & ~TR_133_PIOREG_PIO_MASK ) | tr;
@@ -641,7 +642,7 @@ pmac_ide_tuneproc(ide_drive_t *drive, u8 pio)case controller_un_ata6:case controller_k2_ata6: {/* 100Mhz cell */ -u32 tr =kauai_lookup_timing (kauai_pio_timings, d.cycle_time); +u32 tr =kauai_lookup_timing (kauai_pio_timings, cycle_time);if (tr ==0 )return ; *timings = ((*timings) & ~TR_100_PIOREG_PIO_MASK ) | tr;
@@ -649,7 +650,7 @@ pmac_ide_tuneproc(ide_drive_t *drive, u8 pio) }case controller_kl_ata4:/* 66Mhz cell */ - recTime = d.cycle_time - ide_pio_timings[pio].active_time + recTime = cycle_time - ide_pio_timings[pio].active_time - ide_pio_timings[pio].setup_time; recTime =max (recTime,150U ); accessTime = ide_pio_timings[pio].active_time;
@@ -665,7 +666,7 @@ pmac_ide_tuneproc(ide_drive_t *drive, u8 pio)default : {/* 33Mhz cell */ int ebit =0 ; - recTime = d.cycle_time - ide_pio_timings[pio].active_time + recTime = cycle_time - ide_pio_timings[pio].active_time - ide_pio_timings[pio].setup_time; recTime =max (recTime,150U ); accessTime = ide_pio_timings[pio].active_time;
@@ -1247,6 +1248,7 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif) hwif->cbl = pmif->cable_80 ?ATA_CBL_PATA80 :ATA_CBL_PATA40 ; hwif->drives[0 ].unmask =1 ; hwif->drives[1 ].unmask =1 ; + hwif->pio_mask =ATA_PIO4 ; hwif->tuneproc = pmac_ide_tuneproc;if (pmif->kind == controller_un_ata6 || pmif->kind == controller_k2_ata6
drivers/ide/setup-pci.c +6 -12
@@ -5,12 +5,6 @@* * Copyright (c) 1995-1998 Mark Lord * May be copied or modified under the terms of the GNU General Public License -* -* Recent Changes -* Split the set up function into multiple functions -* Use pci_set_master -* Fix misreporting of I/O v MMIO problems -* Initial fixups for simplex devices */ /*
@@ -407,7 +401,7 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, ide_pci_device_t *d,unsigned long ctl =0 , base =0 ;ide_hwif_t *hwif; -if ((d->flags &IDEPCI_FLAG_ISA_PORTS ) ==0 ) { +if ((d->host_flags &IDE_HFLAG_ISA_PORTS ) ==0 ) {/* Possibly we should fail if these checks report true */ ide_pci_check_iomem (dev, d,2 *port);ide_pci_check_iomem (dev, d,2 *port+1 );
@@ -571,7 +565,7 @@ out:void ide_pci_setup_ports (struct pci_dev *dev,ide_pci_device_t *d,int pciirq,ata_index_t *index) { -int port; +int channels = (d->host_flags &IDE_HFLAG_SINGLE ) ?1 :2 , port;int at_least_one_hwif_enabled =0 ;ide_hwif_t *hwif, *mate =NULL ;u8 tmp;
@@ -582,16 +576,13 @@ void ide_pci_setup_ports(struct pci_dev *dev, ide_pci_device_t *d, int pciirq, a* Set up the IDE ports */ -for (port =0 ; port <=1 ; ++port) { +for (port =0 ; port < channels; ++port) {ide_pci_enablebit_t *e = &(d->enablebits[port]);if (e->reg && (pci_read_config_byte (dev, e->reg, &tmp) || (tmp & e->mask) != e->val))continue ;/* port not enabled */ -if (d->channels <= port) -break ; -if ((hwif =ide_hwif_configure (dev, d, mate, port, pciirq)) ==NULL )continue ;
@@ -616,6 +607,9 @@ void ide_pci_setup_ports(struct pci_dev *dev, ide_pci_device_t *d, int pciirq, aelse ide_hwif_setup_dma (dev, d, hwif); bypass_legacy_dma: + hwif->host_flags = d->host_flags; + hwif->pio_mask = d->pio_mask; +if (d->init_hwif)/* Call chipset-specific routine * for each enabled hwif
include/linux/ata.h +9 -0
@@ -64,6 +64,15 @@ enum {ATA_ID_PROD_LEN =40 ,ATA_PCI_CTL_OFS =2 , + +ATA_PIO0 = (1 <<0 ), +ATA_PIO1 =ATA_PIO0 | (1 <<1 ), +ATA_PIO2 =ATA_PIO1 | (1 <<2 ), +ATA_PIO3 =ATA_PIO2 | (1 <<3 ), +ATA_PIO4 =ATA_PIO3 | (1 <<4 ), +ATA_PIO5 =ATA_PIO4 | (1 <<5 ), +ATA_PIO6 =ATA_PIO5 | (1 <<6 ), +ATA_UDMA0 = (1 <<0 ),ATA_UDMA1 =ATA_UDMA0 | (1 <<1 ), ATA_UDMA2 = ATA_UDMA1 | (1 << 2),
include/linux/ide.h +20 -11
@@ -681,6 +681,10 @@ typedef struct hwif_s {u8 straight8;/* Alan's straight 8 check */ u8 bus_state;/* power state of the IDE bus */ +u8 host_flags; + +u8 pio_mask; +u8 atapi_dma;/* host supports atapi_dma */ u8 ultra_mask;u8 mwdma_mask;
@@ -1244,7 +1248,13 @@ typedef struct ide_pci_enablebit_s {enum {/* Uses ISA control ports not PCI ones. */ -IDEPCI_FLAG_ISA_PORTS = (1 <<0 ), +IDE_HFLAG_ISA_PORTS = (1 <<0 ), +/* single port device */ +IDE_HFLAG_SINGLE = (1 <<1 ), +/* don't use legacy PIO blacklist */ +IDE_HFLAG_PIO_NO_BLACKLIST = (1 <<2 ), +/* don't use conservative PIO "downgrade" */ +IDE_HFLAG_PIO_NO_DOWNGRADE = (1 <<3 ), }; typedef struct ide_pci_device_s {
@@ -1256,13 +1266,13 @@ typedef struct ide_pci_device_s {void (*init_hwif)(ide_hwif_t *);void (*init_dma)(ide_hwif_t *,unsigned long );void (*fixup)(ide_hwif_t *); -u8 channels;u8 autodma;ide_pci_enablebit_t enablebits[2 ];u8 bootable;unsigned int extra;struct ide_pci_device_s *next; -u8 flags; +u8 host_flags; +u8 pio_mask;u8 udma_mask; } ide_pci_device_t;
@@ -1363,6 +1373,11 @@ extern void ide_toggle_bounce(ide_drive_t *drive, int on);extern int ide_set_xfer_rate (ide_drive_t *drive,u8 rate);int ide_use_fast_pio (ide_drive_t *); +static inline int ide_dev_has_iordy (struct hd_driveid *id) +{ +return ((id->field_valid &2 ) && (id->capability &8 )) ?1 :0 ; +} +u8 ide_dump_status (ide_drive_t *,const char *,u8 ); typedef struct ide_pio_timings_s {
@@ -1372,14 +1387,8 @@ typedef struct ide_pio_timings_s {/* active + recovery (+ setup for some chips) */ } ide_pio_timings_t; -typedef struct ide_pio_data_s { -u8 pio_mode; -u8 use_iordy; -u8 overridden; -unsigned int cycle_time; -}ide_pio_data_t ; - -extern u8 ide_get_best_pio_mode (ide_drive_t *drive,u8 mode_wanted,u8 max_mode,ide_pio_data_t *d); +unsigned int ide_pio_cycle_time (ide_drive_t *,u8 ); +u8 ide_get_best_pio_mode (ide_drive_t *,u8 ,u8 );extern const ide_pio_timings_t ide_pio_timings[6 ];