ide: add IDE_HFLAG_ABUSE_SET_DMA_MODE host flag
PATCH 14/18 ide: add IDE_HFLAG_ABUSE_SET_DMA_MODE host flag
* Add IDE_HFLAG_ABUSE_SET_DMA_MODE host flag and use it to decide what to do with transfer modes < XFER_PIO_0 in ide_set_xfer_rate().
* Set IDE_HFLAG_ABUSE_SET_DMA_MODE in host drivers that need it (aec62xx, amd74xx, cs5520, cs5535, hpt34x, hpt366, pdc202xx_old, serverworks, tc86c001 and via82cxxx) and cleanup ->set_dma_mode methods in host drivers that don't (IDE core code guarantees that ->set_dma_mode will be called only for modes which are present in SWDMA/MWDMA/UDMA masks).
While at it:
* Add IDE_HFLAGS_HPT34X/HPT3XX/PDC202XX/SVWKS define in hpt34x/hpt366/pdc202xx_old/serverworks host driver.
There should be no functionality changes caused by this patch.
--- drivers/ide/arm/icside.c | 2 - drivers/ide/cris/ide-cris.c | 2 - drivers/ide/ide-lib.c | 6 +++++ drivers/ide/mips/au1xxx-ide.c | 2 - drivers/ide/pci/aec62xx.c | 13 +++++++++--- drivers/ide/pci/alim15x3.c | 3 -- drivers/ide/pci/amd74xx.c | 1 drivers/ide/pci/atiixp.c | 3 -- drivers/ide/pci/cmd64x.c | 2 - drivers/ide/pci/cs5520.c | 1 drivers/ide/pci/cs5530.c | 2 - drivers/ide/pci/cs5535.c | 2 - drivers/ide/pci/hpt34x.c | 12 ++++++----- drivers/ide/pci/hpt366.c | 19 ++++++++++-------- drivers/ide/pci/it8213.c | 21 +++----------------- drivers/ide/pci/pdc202xx_new.c | 38 +++++++++++-------------------------- drivers/ide/pci/pdc202xx_old.c | 12 ++++++----- drivers/ide/pci/piix.c | 17 +++------------- drivers/ide/pci/sc1200.c | 2 - drivers/ide/pci/scc_pata.c | 14 ------------- drivers/ide/pci/serverworks.c | 17 +++++++++------- drivers/ide/pci/siimage.c | 29 +++++++--------------------- drivers/ide/pci/sis5513.c | 23 +++------------------- drivers/ide/pci/sl82c105.c | 40 +++++++++++++++------------------------ drivers/ide/pci/slc90e66.c | 14 +------------ drivers/ide/pci/tc86c001.c | 3 +- drivers/ide/pci/triflex.c | 2 - drivers/ide/pci/via82cxxx.c | 1 drivers/ide/ppc/pmac.c | 42 +++++++++++------------------------------ include/linux/ide.h | 1 30 files changed, 121 insertions(+), 225 deletions(-)
drivers/ide/arm/icside.c +0 -2
@@ -272,8 +272,6 @@ static void icside_set_dma_mode(ide_drivcase XFER_SW_DMA_0 : cycle_time =480 ;break ; -default : -return ; }/*
drivers/ide/cris/ide-cris.c +0 -2
@@ -747,8 +747,6 @@ static void cris_set_dma_mode(ide_drive_ strobe =ATA_DMA2_STROBE ; hold =ATA_DMA2_HOLD ;break ; -default : -return ; }if (speed >=XFER_UDMA_0 )
drivers/ide/ide-lib.c +6 -0
@@ -438,6 +438,12 @@ int ide_set_xfer_rate(ide_drive_t *drive* case could happen iff the transfer mode has already been set on * the device by ide-proc.c::set_xfer_rate()). */ +if (rate <XFER_PIO_0 ) { +if (hwif->host_flags &IDE_HFLAG_ABUSE_SET_DMA_MODE ) +return ide_set_dma_mode (drive, rate); +else +return ide_config_drive_speed (drive, rate); + }return ide_set_dma_mode (drive, rate); }
drivers/ide/mips/au1xxx-ide.c +0 -2
@@ -198,8 +198,6 @@ static void auide_set_dma_mode(ide_drivebreak ;#endif -default : -return ; }au_writel (mem_sttime,MEM_STTIME2 );
drivers/ide/pci/aec62xx.c +10 -3
@@ -202,6 +202,7 @@ static const struct ide_port_info aec62x .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, .host_flags = IDE_HFLAG_SERIALIZE |IDE_HFLAG_NO_ATAPI_DMA | +IDE_HFLAG_ABUSE_SET_DMA_MODE | IDE_HFLAG_OFF_BOARD, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2,
@@ -211,6 +212,7 @@ static const struct ide_port_info aec62x .init_chipset = init_chipset_aec62xx, .init_hwif = init_hwif_aec62xx, .host_flags =IDE_HFLAG_NO_ATAPI_DMA |IDE_HFLAG_NO_AUTODMA | +IDE_HFLAG_ABUSE_SET_DMA_MODE | IDE_HFLAG_OFF_BOARD, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2,
@@ -220,7 +222,8 @@ static const struct ide_port_info aec62x .init_chipset = init_chipset_aec62xx, .init_hwif = init_hwif_aec62xx, .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, - .host_flags = IDE_HFLAG_NO_ATAPI_DMA, + .host_flags = IDE_HFLAG_NO_ATAPI_DMA | + IDE_HFLAG_ABUSE_SET_DMA_MODE, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA4,
@@ -228,7 +231,9 @@ static const struct ide_port_info aec62x .name = "AEC6280", .init_chipset = init_chipset_aec62xx, .init_hwif = init_hwif_aec62xx, - .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, + .host_flags =IDE_HFLAG_NO_ATAPI_DMA | +IDE_HFLAG_ABUSE_SET_DMA_MODE | + IDE_HFLAG_OFF_BOARD, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA5,
@@ -237,7 +242,9 @@ static const struct ide_port_info aec62x .init_chipset = init_chipset_aec62xx, .init_hwif = init_hwif_aec62xx, .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, - .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, + .host_flags = IDE_HFLAG_NO_ATAPI_DMA | +IDE_HFLAG_ABUSE_SET_DMA_MODE | + IDE_HFLAG_OFF_BOARD, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA5,
drivers/ide/pci/alim15x3.c +0 -3
@@ -402,9 +402,6 @@ static void ali_set_dma_mode(ide_drive_tu8 tmpbyte =0x00 ;int m5229_udma = (hwif->channel) ?0x57 :0x56 ; -if (speed <XFER_PIO_0 ) -return ; -if (speed ==XFER_UDMA_6 ) speed1 =0x47 ;
drivers/ide/pci/amd74xx.c +1 -0
@@ -266,6 +266,7 @@ static void __devinit init_hwif_amd74xx(#define IDE_HFLAGS_AMD \ (IDE_HFLAG_PIO_NO_BLACKLIST | \ IDE_HFLAG_PIO_NO_DOWNGRADE | \ + IDE_HFLAG_ABUSE_SET_DMA_MODE | \ IDE_HFLAG_POST_SET_MODE | \ IDE_HFLAG_IO_32BIT | \ IDE_HFLAG_UNMASK_IRQS | \
drivers/ide/pci/atiixp.c +0 -3
@@ -133,9 +133,6 @@ static void atiixp_set_dma_mode(ide_drivu32 tmp32;u16 tmp16; -if (speed <XFER_MW_DMA_0 ) -return ; -spin_lock_irqsave (&atiixp_lock, flags); save_mdma_mode[drive->dn] =0 ;
drivers/ide/pci/cmd64x.c +0 -2
@@ -322,8 +322,6 @@ static void cmd64x_set_dma_mode(ide_drivcase XFER_MW_DMA_0 :program_cycle_times (drive,480 ,215 );break ; -default : -return ; }if (speed >=XFER_SW_DMA_0 )
drivers/ide/pci/cs5520.c +1 -0
@@ -137,6 +137,7 @@ static void __devinit init_hwif_cs5520(iIDE_HFLAG_CS5520 | \IDE_HFLAG_VDMA | \IDE_HFLAG_NO_ATAPI_DMA | \ +IDE_HFLAG_ABUSE_SET_DMA_MODE |\ IDE_HFLAG_BOOTABLE, \ .pio_mask = ATA_PIO4, \ }
drivers/ide/pci/cs5530.c +0 -2
@@ -116,8 +116,6 @@ static void cs5530_set_dma_mode(ide_drivcase XFER_MW_DMA_0 : timings =0x00077771 ;break ;case XFER_MW_DMA_1 : timings =0x00012121 ;break ;case XFER_MW_DMA_2 : timings =0x00002020 ;break ; -default : -return ; } basereg =CS5530_BASEREG (drive->hwif); reg =inl (basereg +4 );/* get drive0 config register */
drivers/ide/pci/cs5535.c +1 -1
@@ -190,7 +190,7 @@ static const struct ide_port_info cs5535 .name = "CS5535", .init_hwif = init_hwif_cs5535, .host_flags =IDE_HFLAG_SINGLE |IDE_HFLAG_POST_SET_MODE | - IDE_HFLAG_BOOTABLE, + IDE_HFLAG_ABUSE_SET_DMA_MODE | IDE_HFLAG_BOOTABLE, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA4,
drivers/ide/pci/hpt34x.c +7 -5
@@ -129,14 +129,18 @@ static void __devinit init_hwif_hpt34x(i hwif->set_dma_mode = &hpt34x_set_mode; } +#define IDE_HFLAGS_HPT34X \ + (IDE_HFLAG_NO_ATAPI_DMA | \ + IDE_HFLAG_ABUSE_SET_DMA_MODE | \ + IDE_HFLAG_NO_AUTODMA) +static const struct ide_port_info hpt34x_chipsets[]__devinitdata = { {/* 0 */ .name ="HPT343" , .init_chipset = init_chipset_hpt34x, .init_hwif = init_hwif_hpt34x, .extra =16 , - .host_flags =IDE_HFLAG_NO_ATAPI_DMA | -IDE_HFLAG_NO_AUTODMA , + .host_flags =IDE_HFLAGS_HPT34X , .pio_mask =ATA_PIO5 , }, {/* 1 */
@@ -144,9 +148,7 @@ static const struct ide_port_info hpt34x .init_chipset = init_chipset_hpt34x, .init_hwif = init_hwif_hpt34x, .extra = 16, - .host_flags =IDE_HFLAG_NO_ATAPI_DMA | -IDE_HFLAG_NO_AUTODMA | - IDE_HFLAG_OFF_BOARD, + .host_flags = IDE_HFLAGS_HPT34X | IDE_HFLAG_OFF_BOARD, .pio_mask =ATA_PIO5 , #ifdef CONFIG_HPT34X_AUTODMA .swdma_mask = ATA_SWDMA2,
drivers/ide/pci/hpt366.c +11 -8
@@ -1416,6 +1416,11 @@ static int __devinit hpt36x_init(structreturn 0 ; } +#define IDE_HFLAGS_HPT3XX \ + (IDE_HFLAG_NO_ATAPI_DMA | \ + IDE_HFLAG_ABUSE_SET_DMA_MODE | \ + IDE_HFLAG_OFF_BOARD) +static const struct ide_port_info hpt366_chipsets[]__devinitdata = { {/* 0 */ .name ="HPT36x" ,
@@ -1430,9 +1435,7 @@ static const struct ide_port_info hpt366*/ .enablebits = {{0x50,0x10,0x10}, {0x54,0x04,0x04}}, .extra = 240, - .host_flags = IDE_HFLAG_SINGLE | - IDE_HFLAG_NO_ATAPI_DMA | - IDE_HFLAG_OFF_BOARD, + .host_flags = IDE_HFLAGS_HPT3XX | IDE_HFLAG_SINGLE, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, },{ /* 1 */
@@ -1442,7 +1445,7 @@ static const struct ide_port_info hpt366 .init_dma = init_dma_hpt366, .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .extra = 240, - .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, + .host_flags = IDE_HFLAGS_HPT3XX, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, },{ /* 2 */
@@ -1452,7 +1455,7 @@ static const struct ide_port_info hpt366 .init_dma = init_dma_hpt366, .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .extra = 240, - .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, + .host_flags = IDE_HFLAGS_HPT3XX, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, },{ /* 3 */
@@ -1462,7 +1465,7 @@ static const struct ide_port_info hpt366 .init_dma = init_dma_hpt366, .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .extra = 240, - .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, + .host_flags = IDE_HFLAGS_HPT3XX, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, },{ /* 4 */
@@ -1473,7 +1476,7 @@ static const struct ide_port_info hpt366 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .udma_mask = ATA_UDMA5, .extra = 240, - .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, + .host_flags = IDE_HFLAGS_HPT3XX, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, },{ /* 5 */
@@ -1483,7 +1486,7 @@ static const struct ide_port_info hpt366 .init_dma = init_dma_hpt366, .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, .extra = 240, - .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, + .host_flags = IDE_HFLAGS_HPT3XX, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, }
drivers/ide/pci/it8213.c +4 -17
@@ -101,24 +101,11 @@ static void it8213_set_dma_mode(ide_drivpci_read_config_byte (dev,0x54 , ®54);pci_read_config_byte (dev,0x55 , ®55); -switch (speed) { -case XFER_UDMA_6 : -case XFER_UDMA_4 : -case XFER_UDMA_2 : u_speed =2 << (drive->dn *4 );break ; -case XFER_UDMA_5 : -case XFER_UDMA_3 : -case XFER_UDMA_1 : u_speed =1 << (drive->dn *4 );break ; -case XFER_UDMA_0 : u_speed =0 << (drive->dn *4 );break ; -break ; -case XFER_MW_DMA_2 : -case XFER_MW_DMA_1 : -case XFER_SW_DMA_2 : -break ; -default : -return ; - } -if (speed >=XFER_UDMA_0 ) { +u8 udma = speed -XFER_UDMA_0 ; + + u_speed =min_t (u8,2 - (udma &1 ), udma) << (drive->dn *4 ); +if (!(reg48 & u_flag))pci_write_config_byte (dev,0x48 , reg48 | u_flag);if (speed >=XFER_UDMA_5 ) {
drivers/ide/pci/pdc202xx_new.c +12 -26
@@ -162,32 +162,18 @@ static void pdcnew_set_dma_mode(ide_drivif (max_dma_rate (hwif->pci_dev) ==4 ) {u8 mode = speed &0x07 ; -switch (speed) { -case XFER_UDMA_6 : -case XFER_UDMA_5 : -case XFER_UDMA_4 : -case XFER_UDMA_3 : -case XFER_UDMA_2 : -case XFER_UDMA_1 : -case XFER_UDMA_0 : -set_indexed_reg (hwif,0x10 + adj, - udma_timings[mode].reg10); -set_indexed_reg (hwif,0x11 + adj, - udma_timings[mode].reg11); -set_indexed_reg (hwif,0x12 + adj, - udma_timings[mode].reg12); -break ; -case XFER_MW_DMA_2 : -case XFER_MW_DMA_1 : -case XFER_MW_DMA_0 : -set_indexed_reg (hwif,0x0e + adj, - mwdma_timings[mode].reg0e); -set_indexed_reg (hwif,0x0f + adj, - mwdma_timings[mode].reg0f); -break ; -default : -printk (KERN_ERR "pdc202xx_new: " -"Unknown speed %d ignored\n" , speed); +if (speed >=XFER_UDMA_0 ) { +set_indexed_reg (hwif,0x10 + adj, + udma_timings[mode].reg10); +set_indexed_reg (hwif,0x11 + adj, + udma_timings[mode].reg11); +set_indexed_reg (hwif,0x12 + adj, + udma_timings[mode].reg12); + }else { +set_indexed_reg (hwif,0x0e + adj, + mwdma_timings[mode].reg0e); +set_indexed_reg (hwif,0x0f + adj, + mwdma_timings[mode].reg0f); } }else if (speed ==XFER_UDMA_2 ) {/* Set tHOLD bit to 0 if using UDMA mode 2 */
drivers/ide/pci/pdc202xx_old.c +7 -5
@@ -375,6 +375,11 @@ static void __devinit pdc202ata4_fixup_i } } +#define IDE_HFLAGS_PDC202XX \ + (IDE_HFLAG_ERROR_STOPS_FIFO | \ + IDE_HFLAG_ABUSE_SET_DMA_MODE | \ + IDE_HFLAG_OFF_BOARD) +#define DECLARE_PDC2026X_DEV (name_str, udma, extra_flags) \ { \ .name = name_str, \
@@ -382,9 +387,7 @@ static void __devinit pdc202ata4_fixup_i .init_hwif = init_hwif_pdc202xx, \ .init_dma = init_dma_pdc202xx, \ .extra = 48, \ - .host_flags =IDE_HFLAG_ERROR_STOPS_FIFO | \ - extra_flags | \ - IDE_HFLAG_OFF_BOARD, \ + .host_flags = IDE_HFLAGS_PDC202XX | extra_flags, \ .pio_mask = ATA_PIO4, \ .mwdma_mask = ATA_MWDMA2, \ .udma_mask = udma, \
@@ -397,8 +400,7 @@ static const struct ide_port_info pdc202 .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, .extra = 16, - .host_flags =IDE_HFLAG_ERROR_STOPS_FIFO | - IDE_HFLAG_OFF_BOARD, + .host_flags = IDE_HFLAGS_PDC202XX, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA2,
drivers/ide/pci/piix.c +4 -13
@@ -203,20 +203,11 @@ static void piix_set_dma_mode(ide_drive_pci_read_config_byte (dev,0x54 , ®54);pci_read_config_byte (dev,0x55 , ®55); -switch (speed) { -case XFER_UDMA_4 : -case XFER_UDMA_2 : u_speed =2 << (drive->dn *4 );break ; -case XFER_UDMA_5 : -case XFER_UDMA_3 : -case XFER_UDMA_1 : u_speed =1 << (drive->dn *4 );break ; -case XFER_UDMA_0 : u_speed =0 << (drive->dn *4 );break ; -case XFER_MW_DMA_2 : -case XFER_MW_DMA_1 : -case XFER_SW_DMA_2 :break ; -default :return ; - } -if (speed >=XFER_UDMA_0 ) { +u8 udma = speed -XFER_UDMA_0 ; + + u_speed =min_t (u8,2 - (udma &1 ), udma) << (drive->dn *4 ); +if (!(reg48 & u_flag))pci_write_config_byte (dev,0x48 , reg48 | u_flag);if (speed ==XFER_UDMA_5 ) {
drivers/ide/pci/sc1200.c +0 -2
@@ -185,8 +185,6 @@ static void sc1200_set_dma_mode(ide_drivcase PCI_CLK_66 : timings =0x00015151 ;break ; }break ; -default : -return ; }if (unit ==0 ) {/* are we configuring drive0? */
drivers/ide/pci/scc_pata.c +1 -13
@@ -254,19 +254,7 @@ static void scc_set_dma_mode(ide_drive_t offset =0 ;/* 100MHz */ } -switch (speed) { -case XFER_UDMA_6 : -case XFER_UDMA_5 : -case XFER_UDMA_4 : -case XFER_UDMA_3 : -case XFER_UDMA_2 : -case XFER_UDMA_1 : -case XFER_UDMA_0 : - idx = speed -XFER_UDMA_0 ; -break ; -default : -return ; - } + idx = speed -XFER_UDMA_0 ; jcactsel = JCACTSELtbl[offset][idx];if (is_slave) {
drivers/ide/pci/serverworks.c +10 -7
@@ -366,12 +366,17 @@ static void __devinit init_hwif_svwks (i } } +#define IDE_HFLAGS_SVWKS \ + (IDE_HFLAG_LEGACY_IRQS | \ + IDE_HFLAG_ABUSE_SET_DMA_MODE | \ + IDE_HFLAG_BOOTABLE) +static const struct ide_port_info serverworks_chipsets[]__devinitdata = { {/* 0 */ .name ="SvrWks OSB4" , .init_chipset = init_chipset_svwks, .init_hwif = init_hwif_svwks, - .host_flags =IDE_HFLAG_LEGACY_IRQS |IDE_HFLAG_BOOTABLE , + .host_flags =IDE_HFLAGS_SVWKS , .pio_mask =ATA_PIO4 , .mwdma_mask =ATA_MWDMA2 , .udma_mask =0x00 ,/* UDMA is problematic on OSB4 */
@@ -379,7 +384,7 @@ static const struct ide_port_info server .name = "SvrWks CSB5", .init_chipset = init_chipset_svwks, .init_hwif = init_hwif_svwks, - .host_flags = IDE_HFLAG_LEGACY_IRQS | IDE_HFLAG_BOOTABLE, + .host_flags = IDE_HFLAGS_SVWKS, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA5,
@@ -387,7 +392,7 @@ static const struct ide_port_info server .name = "SvrWks CSB6", .init_chipset = init_chipset_svwks, .init_hwif = init_hwif_svwks, - .host_flags = IDE_HFLAG_LEGACY_IRQS | IDE_HFLAG_BOOTABLE, + .host_flags = IDE_HFLAGS_SVWKS, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA5,
@@ -395,8 +400,7 @@ static const struct ide_port_info server .name = "SvrWks CSB6", .init_chipset = init_chipset_svwks, .init_hwif = init_hwif_svwks, - .host_flags =IDE_HFLAG_LEGACY_IRQS |IDE_HFLAG_SINGLE | - IDE_HFLAG_BOOTABLE, + .host_flags = IDE_HFLAGS_SVWKS | IDE_HFLAG_SINGLE, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA5,
@@ -404,8 +408,7 @@ static const struct ide_port_info server .name = "SvrWks HT1000", .init_chipset = init_chipset_svwks, .init_hwif = init_hwif_svwks, - .host_flags =IDE_HFLAG_LEGACY_IRQS |IDE_HFLAG_SINGLE | - IDE_HFLAG_BOOTABLE, + .host_flags = IDE_HFLAGS_SVWKS | IDE_HFLAG_SINGLE, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA5,
drivers/ide/pci/siimage.c +8 -21
@@ -278,27 +278,14 @@ static void sil_set_dma_mode(ide_drive_t scsc =is_sata (hwif) ?1 : scsc; -switch (speed) { -case XFER_MW_DMA_2 : -case XFER_MW_DMA_1 : -case XFER_MW_DMA_0 : - multi = dma[speed -XFER_MW_DMA_0 ]; - mode |= ((unit) ?0x20 :0x02 ); -break ; -case XFER_UDMA_6 : -case XFER_UDMA_5 : -case XFER_UDMA_4 : -case XFER_UDMA_3 : -case XFER_UDMA_2 : -case XFER_UDMA_1 : -case XFER_UDMA_0 : - multi = dma[2 ]; - ultra |= ((scsc) ? (ultra6[speed -XFER_UDMA_0 ]) : - (ultra5[speed -XFER_UDMA_0 ])); - mode |= ((unit) ?0x30 :0x03 ); -break ; -default : -return ; +if (speed >=XFER_UDMA_0 ) { + multi = dma[2 ]; + ultra |= (scsc ? ultra6[speed -XFER_UDMA_0 ] : + ultra5[speed -XFER_UDMA_0 ]); + mode |= (unit ?0x30 :0x03 ); + }else { + multi = dma[speed -XFER_MW_DMA_0 ]; + mode |= (unit ?0x20 :0x02 ); }if (hwif->mmio) {
drivers/ide/pci/sis5513.c +4 -19
@@ -351,25 +351,10 @@ static void sis_program_udma_timings(idestatic void sis_set_dma_mode (ide_drive_t *drive,const u8 speed) { -/* Config chip for mode */ -switch (speed) { -case XFER_UDMA_6 : -case XFER_UDMA_5 : -case XFER_UDMA_4 : -case XFER_UDMA_3 : -case XFER_UDMA_2 : -case XFER_UDMA_1 : -case XFER_UDMA_0 : -sis_program_udma_timings (drive, speed); -break ; -case XFER_MW_DMA_2 : -case XFER_MW_DMA_1 : -case XFER_MW_DMA_0 : -sis_program_timings (drive, speed); -break ; -default : -break ; - } +if (speed >=XFER_UDMA_0 ) +sis_program_udma_timings (drive, speed); +else +sis_program_timings (drive, speed); }static u8 sis5513_ata133_udma_filter (ide_drive_t *drive)
drivers/ide/pci/sl82c105.c +16 -24
@@ -115,32 +115,24 @@ static void sl82c105_set_dma_mode(ide_drDBG (("sl82c105_tune_chipset(drive:%s, speed:%s)\n" , drive->name,ide_xfer_verbose (speed))); -switch (speed) { -case XFER_MW_DMA_2 : -case XFER_MW_DMA_1 : -case XFER_MW_DMA_0 : - drv_ctrl = mwdma_timings[speed -XFER_MW_DMA_0 ]; + drv_ctrl = mwdma_timings[speed -XFER_MW_DMA_0 ]; -/* -* Store the DMA timings so that we can actually program -* them when DMA will be turned on... -*/ - drive->drive_data &=0x0000ffff ; - drive->drive_data |= (unsigned long )drv_ctrl <<16 ; +/* +* Store the DMA timings so that we can actually program +* them when DMA will be turned on... +*/ + drive->drive_data &=0x0000ffff ; + drive->drive_data |= (unsigned long )drv_ctrl <<16 ; -/* -* If we are already using DMA, we just reprogram -* the drive control register. -*/ -if (drive->using_dma) { -struct pci_dev *dev =HWIF (drive)->pci_dev; -int reg =0x44 + drive->dn *4 ; - -pci_write_config_word (dev, reg, drv_ctrl); - } -break ; -default : -return ; +/* +* If we are already using DMA, we just reprogram +* the drive control register. +*/ +if (drive->using_dma) { +struct pci_dev *dev =HWIF (drive)->pci_dev; +int reg =0x44 + drive->dn *4 ; + +pci_write_config_word (dev, reg, drv_ctrl); } }
drivers/ide/pci/slc90e66.c +2 -12
@@ -91,19 +91,9 @@ static void slc90e66_set_dma_mode(ide_drpci_read_config_word (dev,0x48 , ®48);pci_read_config_word (dev,0x4a , ®4a); -switch (speed) { -case XFER_UDMA_4 : u_speed =4 << (drive->dn *4 );break ; -case XFER_UDMA_3 : u_speed =3 << (drive->dn *4 );break ; -case XFER_UDMA_2 : u_speed =2 << (drive->dn *4 );break ; -case XFER_UDMA_1 : u_speed =1 << (drive->dn *4 );break ; -case XFER_UDMA_0 : u_speed =0 << (drive->dn *4 );break ; -case XFER_MW_DMA_2 : -case XFER_MW_DMA_1 : -case XFER_SW_DMA_2 :break ; -default :return ; - } -if (speed >=XFER_UDMA_0 ) { + u_speed = (speed -XFER_UDMA_0 ) << (drive->dn *4 ); +if (!(reg48 & u_flag))pci_write_config_word (dev,0x48 , reg48|u_flag);/* FIXME: (reg4a & a_speed) ? */
drivers/ide/pci/tc86c001.c +2 -1
@@ -222,7 +222,8 @@ static const struct ide_port_info tc86c0 .name = "TC86C001", .init_chipset = init_chipset_tc86c001, .init_hwif = init_hwif_tc86c001, - .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_OFF_BOARD, + .host_flags =IDE_HFLAG_SINGLE |IDE_HFLAG_OFF_BOARD | + IDE_HFLAG_ABUSE_SET_DMA_MODE, .pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, .udma_mask = ATA_UDMA4,
drivers/ide/pci/triflex.c +0 -2
@@ -81,8 +81,6 @@ static void triflex_set_mode(ide_drive_tcase XFER_PIO_0 : timing =0x0808 ;break ; -default : -return ; } triflex_timings &= ~(0xFFFF << (16 * unit));
drivers/ide/pci/via82cxxx.c +1 -0
@@ -439,6 +439,7 @@ static const struct ide_port_info via82c .enablebits = { { 0x40, 0x02, 0x02 }, { 0x40, 0x01, 0x01 } }, .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST |IDE_HFLAG_PIO_NO_DOWNGRADE | +IDE_HFLAG_ABUSE_SET_DMA_MODE |IDE_HFLAG_POST_SET_MODE |IDE_HFLAG_IO_32BIT | IDE_HFLAG_BOOTABLE,
drivers/ide/ppc/pmac.c +12 -30
50 lines not on this page · raw message
include/linux/ide.h +1 -0
@@ -1094,6 +1094,7 @@ enum {IDE_HFLAG_IO_32BIT = (1 <<24 ),/* unmask IRQs */ IDE_HFLAG_UNMASK_IRQS = (1 <<25 ), + IDE_HFLAG_ABUSE_SET_DMA_MODE = (1 << 26), };#ifdef CONFIG_BLK_DEV_OFFBOARD
Quoted 10 lines · Bartlomiej Zolnierkiewicz
* Add
IDE_HFLAG_ABUSE_SET_DMA_MODEhost flag and use it to decide what to do with transfer modes <XFER_PIO_0inide_set_xfer_rate().* Set
IDE_HFLAG_ABUSE_SET_DMA_MODEin host drivers that need it (aec62xx, amd74xx, cs5520, cs5535, hpt34x, hpt366,pdc202xx_old, serverworks, tc86c001 and via82cxxx) and cleanup ->set_dma_mode methods in host drivers that don't (IDE core code guarantees that ->set_dma_mode will be called only for modes which are present in SWDMA/MWDMA/UDMA masks).
Quoted 8 lines
While at it:
* Add IDE_HFLAGS_HPT34X/HPT3XX/PDC202XX/SVWKS define in hpt34x/hpt366/pdc202xx_old/serverworks host driver.
There should be no functionality changes caused by this patch.
Signed-off-by Bartlomiej Zolnierkiewicz <[email protected]>
drivers/ide/ide-lib.c int ide_set_xfer_rate(ide_drive_t *drive · line 443
Quoted 11 lines
Index:
b/drivers/ide/ide-lib.c
===================================================================drivers/ide/ide-lib.c +3
-0@@ -438,6 +438,12 @@ int ide_set_xfer_rate(ide_drive_t *drive* case could happen iff the transfer mode has already been set on * the device by ide-proc.c::set_xfer_rate()). */ +if (rate <XFER_PIO_0 ) { +if (hwif->host_flags &IDE_HFLAG_ABUSE_SET_DMA_MODE ) +return ide_set_dma_mode (drive, rate);
Not sure if it was worth the effort at all...
drivers/ide/ide-lib.c int ide_set_xfer_rate(ide_drive_t *drive · line 445
Quoted 2 lines
drivers/ide/ide-lib.c +2
-0+else +return ide_config_drive_speed (drive, rate);
It's tome that I go and make a patch which deals with 0x00 (default PIO
mode)...
drivers/ide/ide-lib.c int ide_set_xfer_rate(ide_drive_t *drive · line 449
Quoted 4 lines
drivers/ide/ide-lib.c +1
-0+ }return ide_set_dma_mode (drive, rate); }
MBR, Sergei
Quoted 1 line · Hello, I wrote:
It's tome that I go and make a patch which deals with
0x00(default
s/tome/time/
Quoted 1 line
PIO mode)...
But I'm unsure how this value could reach us form userspace because of the
argument check present everywhere that filters out 0 value form being passed -- look at set_xfer_rate() and ide_cmd_ioctl(). So, such fix doesn't seem to be applicable... :-|
Quoted 4 lines
Quoted 4 lines
+ }
return ide_set_dma_mode(drive, rate);}
MBR, Sergei
Hi,
Quoted 4 lines · Sergei Shtylyov
Quoted 1 line · Hello, I wrote:
It's tome that I go and make a patch which deals with
0x00(default
Quoted 8 lines
s/tome/time/
Quoted 1 line
PIO mode)...
But I'm unsure how this value could reach us form userspace because of the
argument check present everywhere that filters out 0 value form being passed -- look atset_xfer_rate()andide_cmd_ioctl(). So, such fix doesn't seem to be applicable... :-|
You are right, I was mislead by "if (arg < 0 || arg > 70)":
static int set_xfer_rate (ide_drive_t *drive, int arg)
{
int err;
if (arg < 0 || arg > 70)
return -EINVAL;
err = ide_wait_cmd(drive,
WIN_SETFEATURES, (u8) arg,
SETFEATURES_XFER, 0, NULL);
if (!err && arg) {
ide_set_xfer_rate(drive, (u8) arg);
ide_driveid_update(drive);
}
return err;
}but value "1" is still theoretically possible. ;)
Anyway fixing 0x00 is a desirable thing as it is needed for cleanly handling many older CF cards (they don't support IORDY).
Thanks,
Bart