From 629f944bb18c9deccce89ad833f1211c0036a632 Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Sat, 2 Feb 2008 19:56:46 +0100 Subject: ide: use __ide_set_handler() in ide_execute_command() * Use __ide_set_handler() in ide_execute_command(). While at it: * Fix whitespace damage in ide_execute_command(). Acked-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz --- drivers/ide/ide-iops.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) (limited to 'drivers/ide/ide-iops.c') diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 16b1f6e1278..44689f5cc95 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -882,22 +882,17 @@ void ide_execute_command(ide_drive_t *drive, u8 cmd, ide_handler_t *handler, unsigned long flags; ide_hwgroup_t *hwgroup = HWGROUP(drive); ide_hwif_t *hwif = HWIF(drive); - + spin_lock_irqsave(&ide_lock, flags); - BUG_ON(hwgroup->handler); - hwgroup->handler = handler; - hwgroup->expiry = expiry; - hwgroup->timer.expires = jiffies + timeout; - hwgroup->req_gen_timer = hwgroup->req_gen; - add_timer(&hwgroup->timer); + __ide_set_handler(drive, handler, timeout, expiry); hwif->OUTBSYNC(drive, cmd, IDE_COMMAND_REG); - /* Drive takes 400nS to respond, we must avoid the IRQ being - serviced before that. - - FIXME: we could skip this delay with care on non shared - devices - */ + /* + * Drive takes 400nS to respond, we must avoid the IRQ being + * serviced before that. + * + * FIXME: we could skip this delay with care on non shared devices + */ ndelay(400); spin_unlock_irqrestore(&ide_lock, flags); } -- cgit v1.2.3-70-g09d2 From fa017176f7144028aa23c1adcebb1792c891320c Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Sat, 2 Feb 2008 19:56:46 +0100 Subject: ide: unexport SELECT_DRIVE() Acked-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz --- drivers/ide/ide-iops.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'drivers/ide/ide-iops.c') diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 44689f5cc95..09069da2274 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -163,8 +163,6 @@ void SELECT_DRIVE (ide_drive_t *drive) HWIF(drive)->OUTB(drive->select.all, IDE_SELECT_REG); } -EXPORT_SYMBOL(SELECT_DRIVE); - void SELECT_MASK (ide_drive_t *drive, int mask) { if (HWIF(drive)->maskproc) -- cgit v1.2.3-70-g09d2 From 5efe7c540ec6021905d443dfe23cc44a11345edd Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Sat, 2 Feb 2008 19:56:46 +0100 Subject: ide: remove set_transfer() Acked-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz --- drivers/ide/ide-iops.c | 18 ------------------ drivers/ide/ide-taskfile.c | 6 +++++- include/linux/ide.h | 1 - 3 files changed, 5 insertions(+), 20 deletions(-) (limited to 'drivers/ide/ide-iops.c') diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 09069da2274..99fe50e941b 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -627,24 +627,6 @@ int ide_ata66_check (ide_drive_t *drive, ide_task_t *args) return 0; } -/* - * Backside of HDIO_DRIVE_CMD call of SETFEATURES_XFER. - * 1 : Safe to update drive->id DMA registers. - * 0 : OOPs not allowed. - */ -int set_transfer (ide_drive_t *drive, ide_task_t *args) -{ - if (args->tf.command == WIN_SETFEATURES && - args->tf.nsect >= XFER_SW_DMA_0 && - args->tf.feature == SETFEATURES_XFER && - (drive->id->dma_ultra || - drive->id->dma_mword || - drive->id->dma_1word)) - return 1; - - return 0; -} - #ifdef CONFIG_BLK_DEV_IDEDMA static u8 ide_auto_reduce_xfer (ide_drive_t *drive) { diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 16a9a581d08..bf72b6d9f68 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -755,6 +755,7 @@ int ide_cmd_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg) u8 args[4], xfer_rate = 0; ide_task_t tfargs; struct ide_taskfile *tf = &tfargs.tf; + struct hd_driveid *id = drive->id; if (NULL == (void *) arg) { struct request rq; @@ -792,7 +793,10 @@ int ide_cmd_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg) return -ENOMEM; } - if (set_transfer(drive, &tfargs)) { + if (tf->command == WIN_SETFEATURES && + tf->feature == SETFEATURES_XFER && + tf->nsect >= XFER_SW_DMA_0 && + (id->dma_ultra || id->dma_mword || id->dma_1word)) { xfer_rate = args[1]; if (ide_ata66_check(drive, &tfargs)) goto abort; diff --git a/include/linux/ide.h b/include/linux/ide.h index e2048d2ca64..b41eb7d12cd 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -991,7 +991,6 @@ extern int ide_driveid_update(ide_drive_t *); extern int ide_ata66_check(ide_drive_t *, ide_task_t *); extern int ide_config_drive_speed(ide_drive_t *, u8); extern u8 eighty_ninty_three (ide_drive_t *); -extern int set_transfer(ide_drive_t *, ide_task_t *); extern int taskfile_lib_get_identify(ide_drive_t *drive, u8 *); extern int ide_wait_not_busy(ide_hwif_t *hwif, unsigned long timeout); -- cgit v1.2.3-70-g09d2 From af10f77390f6c7c5cf6f53e6b3cdaa38562b03af Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Sat, 2 Feb 2008 19:56:46 +0100 Subject: ide: remove ide_ata66_check() Acked-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz --- drivers/ide/ide-iops.c | 15 --------------- drivers/ide/ide-taskfile.c | 5 ++++- include/linux/ide.h | 1 - 3 files changed, 4 insertions(+), 17 deletions(-) (limited to 'drivers/ide/ide-iops.c') diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 99fe50e941b..e00fbbb423b 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -612,21 +612,6 @@ no_80w: return 0; } -int ide_ata66_check (ide_drive_t *drive, ide_task_t *args) -{ - if (args->tf.command == WIN_SETFEATURES && - args->tf.nsect > XFER_UDMA_2 && - args->tf.feature == SETFEATURES_XFER) { - if (eighty_ninty_three(drive) == 0) { - printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot " - "be set\n", drive->name); - return 1; - } - } - - return 0; -} - #ifdef CONFIG_BLK_DEV_IDEDMA static u8 ide_auto_reduce_xfer (ide_drive_t *drive) { diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index bf72b6d9f68..4e1da1c78cb 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -798,8 +798,11 @@ int ide_cmd_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg) tf->nsect >= XFER_SW_DMA_0 && (id->dma_ultra || id->dma_mword || id->dma_1word)) { xfer_rate = args[1]; - if (ide_ata66_check(drive, &tfargs)) + if (tf->nsect > XFER_UDMA_2 && !eighty_ninty_three(drive)) { + printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot " + "be set\n", drive->name); goto abort; + } } err = ide_raw_taskfile(drive, &tfargs, buf, args[3]); diff --git a/include/linux/ide.h b/include/linux/ide.h index b41eb7d12cd..748af8dc089 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -988,7 +988,6 @@ int ide_task_ioctl(ide_drive_t *, unsigned int, unsigned long); extern int system_bus_clock(void); extern int ide_driveid_update(ide_drive_t *); -extern int ide_ata66_check(ide_drive_t *, ide_task_t *); extern int ide_config_drive_speed(ide_drive_t *, u8); extern u8 eighty_ninty_three (ide_drive_t *); extern int taskfile_lib_get_identify(ide_drive_t *drive, u8 *); -- cgit v1.2.3-70-g09d2 From 99ffbe0e9713c89798c90bde7a462645e098b76b Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Sat, 2 Feb 2008 19:56:47 +0100 Subject: ide: move drive->crc_count check out from check_dma_crc() Acked-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz --- drivers/ide/ide-iops.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'drivers/ide/ide-iops.c') diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index e00fbbb423b..955bac2166a 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -968,13 +968,10 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) static void check_dma_crc(ide_drive_t *drive) { #ifdef CONFIG_BLK_DEV_IDEDMA - if (drive->crc_count) { - ide_dma_off_quietly(drive); - ide_set_xfer_rate(drive, ide_auto_reduce_xfer(drive)); - if (drive->current_speed >= XFER_SW_DMA_0) - ide_dma_on(drive); - } else - ide_dma_off(drive); + ide_dma_off_quietly(drive); + ide_set_xfer_rate(drive, ide_auto_reduce_xfer(drive)); + if (drive->current_speed >= XFER_SW_DMA_0) + ide_dma_on(drive); #endif } @@ -999,17 +996,20 @@ static void pre_reset(ide_drive_t *drive) else drive->post_reset = 1; - if (!drive->keep_settings) { - if (drive->using_dma) { + if (drive->using_dma) { + if (drive->crc_count) check_dma_crc(drive); - } else { + else + ide_dma_off(drive); + } + + if (!drive->keep_settings) { + if (!drive->using_dma) { drive->unmask = 0; drive->io_32bit = 0; } return; } - if (drive->using_dma) - check_dma_crc(drive); if (HWIF(drive)->pre_reset != NULL) HWIF(drive)->pre_reset(drive); -- cgit v1.2.3-70-g09d2 From 296921a4ca01612cb1d9a43343b33a33eb7697ff Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Sat, 2 Feb 2008 19:56:47 +0100 Subject: ide: remove ide_auto_reduce_xfer() While at it: * Remove needless '!drive->crc_count' check. Acked-by: Sergei Shtylyov Signed-off-by: Bartlomiej Zolnierkiewicz --- drivers/ide/ide-iops.c | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) (limited to 'drivers/ide/ide-iops.c') diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 955bac2166a..b7da44c9e91 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -612,33 +612,6 @@ no_80w: return 0; } -#ifdef CONFIG_BLK_DEV_IDEDMA -static u8 ide_auto_reduce_xfer (ide_drive_t *drive) -{ - if (!drive->crc_count) - return drive->current_speed; - drive->crc_count = 0; - - switch(drive->current_speed) { - case XFER_UDMA_7: return XFER_UDMA_6; - case XFER_UDMA_6: return XFER_UDMA_5; - case XFER_UDMA_5: return XFER_UDMA_4; - case XFER_UDMA_4: return XFER_UDMA_3; - case XFER_UDMA_3: return XFER_UDMA_2; - case XFER_UDMA_2: return XFER_UDMA_1; - case XFER_UDMA_1: return XFER_UDMA_0; - /* - * OOPS we do not goto non Ultra DMA modes - * without iCRC's available we force - * the system to PIO and make the user - * invoke the ATA-1 ATA-2 DMA modes. - */ - case XFER_UDMA_0: - default: return XFER_PIO_4; - } -} -#endif /* CONFIG_BLK_DEV_IDEDMA */ - int ide_driveid_update(ide_drive_t *drive) { ide_hwif_t *hwif = drive->hwif; @@ -968,8 +941,20 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) static void check_dma_crc(ide_drive_t *drive) { #ifdef CONFIG_BLK_DEV_IDEDMA + u8 mode; + ide_dma_off_quietly(drive); - ide_set_xfer_rate(drive, ide_auto_reduce_xfer(drive)); + drive->crc_count = 0; + mode = drive->current_speed; + /* + * Don't try non Ultra-DMA modes without iCRC's. Force the + * device to PIO and make the user enable SWDMA/MWDMA modes. + */ + if (mode > XFER_UDMA_0 && mode <= XFER_UDMA_7) + mode--; + else + mode = XFER_PIO_4; + ide_set_xfer_rate(drive, mode); if (drive->current_speed >= XFER_SW_DMA_0) ide_dma_on(drive); #endif -- cgit v1.2.3-70-g09d2 From 578cfa0d72f81526b2fcb1dd2463c47bbf633989 Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Sat, 2 Feb 2008 19:56:47 +0100 Subject: ide: move check_dma_crc() to ide-dma.c * Move check_dma_crc() to ide-dma.c and add inline version for CONFIG_BLK_DEV_IDEDMA=n case. * Rename check_dma_crc() to ide_check_dma_crc(). Signed-off-by: Bartlomiej Zolnierkiewicz --- drivers/ide/ide-dma.c | 20 ++++++++++++++++++++ drivers/ide/ide-iops.c | 24 +----------------------- include/linux/ide.h | 2 ++ 3 files changed, 23 insertions(+), 23 deletions(-) (limited to 'drivers/ide/ide-iops.c') diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 7beaf1e9be1..3cf59f2c392 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c @@ -819,6 +819,26 @@ int ide_set_dma(ide_drive_t *drive) return 0; } +void ide_check_dma_crc(ide_drive_t *drive) +{ + u8 mode; + + ide_dma_off_quietly(drive); + drive->crc_count = 0; + mode = drive->current_speed; + /* + * Don't try non Ultra-DMA modes without iCRC's. Force the + * device to PIO and make the user enable SWDMA/MWDMA modes. + */ + if (mode > XFER_UDMA_0 && mode <= XFER_UDMA_7) + mode--; + else + mode = XFER_PIO_4; + ide_set_xfer_rate(drive, mode); + if (drive->current_speed >= XFER_SW_DMA_0) + ide_dma_on(drive); +} + #ifdef CONFIG_BLK_DEV_IDEDMA_PCI void ide_dma_lost_irq (ide_drive_t *drive) { diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index b7da44c9e91..a95178f5e1b 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -938,28 +938,6 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) return ide_stopped; } -static void check_dma_crc(ide_drive_t *drive) -{ -#ifdef CONFIG_BLK_DEV_IDEDMA - u8 mode; - - ide_dma_off_quietly(drive); - drive->crc_count = 0; - mode = drive->current_speed; - /* - * Don't try non Ultra-DMA modes without iCRC's. Force the - * device to PIO and make the user enable SWDMA/MWDMA modes. - */ - if (mode > XFER_UDMA_0 && mode <= XFER_UDMA_7) - mode--; - else - mode = XFER_PIO_4; - ide_set_xfer_rate(drive, mode); - if (drive->current_speed >= XFER_SW_DMA_0) - ide_dma_on(drive); -#endif -} - static void ide_disk_pre_reset(ide_drive_t *drive) { int legacy = (drive->id->cfs_enable_2 & 0x0400) ? 0 : 1; @@ -983,7 +961,7 @@ static void pre_reset(ide_drive_t *drive) if (drive->using_dma) { if (drive->crc_count) - check_dma_crc(drive); + ide_check_dma_crc(drive); else ide_dma_off(drive); } diff --git a/include/linux/ide.h b/include/linux/ide.h index 748af8dc089..367c17084a2 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -1155,6 +1155,7 @@ void ide_dma_off_quietly(ide_drive_t *); void ide_dma_off(ide_drive_t *); void ide_dma_on(ide_drive_t *); int ide_set_dma(ide_drive_t *); +void ide_check_dma_crc(ide_drive_t *); ide_startstop_t ide_dma_intr(ide_drive_t *); int ide_build_sglist(ide_drive_t *, struct request *); @@ -1182,6 +1183,7 @@ static inline void ide_dma_off(ide_drive_t *drive) { ; } static inline void ide_dma_on(ide_drive_t *drive) { ; } static inline void ide_dma_verbose(ide_drive_t *drive) { ; } static inline int ide_set_dma(ide_drive_t *drive) { return 1; } +static inline void ide_check_dma_crc(ide_drive_t *drive) { ; } #endif /* CONFIG_BLK_DEV_IDEDMA */ #ifndef CONFIG_BLK_DEV_IDEDMA_PCI -- cgit v1.2.3-70-g09d2