ide: add ide_busy_sleep() helper
PATCH 4/6 ide: add ide_busy_sleep() helper
Add ide_busy_sleep() helper and use it in do_probe(), enable_nest() and probe_hwif().
As a nice side-effect this fixes a minor bug in enable_nest() (the code was reading status register without any delay).
--- drivers/ide/ide-probe.c | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-)
drivers/ide/ide-probe.c +21 -22
@@ -382,6 +382,20 @@ static int try_to_identify (ide_drive_treturn retval; } +static int ide_busy_sleep (ide_hwif_t *hwif) +{ +unsigned long timeout = jiffies +WAIT_WORSTCASE ; +u8 stat; + +do { +msleep (50 ); + stat = hwif->INB (hwif->io_ports[IDE_STATUS_OFFSET ]); +if ((stat &BUSY_STAT ) ==0 ) +return 0 ; + }while (time_before (jiffies, timeout)); + +return 1 ; +}/** * do_probe - probe an IDE device
@@ -450,7 +464,6 @@ static int do_probe (ide_drive_t *drive,if ((rc ==1 && cmd ==WIN_PIDENTIFY ) && ((drive->autotune ==IDE_TUNE_DEFAULT ) || (drive->autotune ==IDE_TUNE_AUTO ))) { -unsigned long timeout;printk ("%s: no response (status = 0x%02x), " "resetting drive\n" , drive->name, hwif->INB (IDE_STATUS_REG ));
@@ -458,10 +471,7 @@ static int do_probe (ide_drive_t *drive, hwif->OUTB (drive->select.all,IDE_SELECT_REG );msleep (50 ); hwif->OUTB (WIN_SRST ,IDE_COMMAND_REG ); - timeout = jiffies; -while (((hwif->INB (IDE_STATUS_REG )) &BUSY_STAT ) && -time_before (jiffies, timeout +WAIT_WORSTCASE )) -msleep (50 ); + (void )ide_busy_sleep (hwif); rc =try_to_identify (drive, cmd); }if (rc ==1 )
@@ -489,20 +499,16 @@ static int do_probe (ide_drive_t *drive,static void enable_nest (ide_drive_t *drive) {ide_hwif_t *hwif =HWIF (drive); -unsigned long timeout;printk ("%s: enabling %s -- " , hwif->name, drive->id->model);SELECT_DRIVE (drive);msleep (50 ); hwif->OUTB (EXABYTE_ENABLE_NEST ,IDE_COMMAND_REG ); - timeout = jiffies +WAIT_WORSTCASE ; -do { -if (time_after (jiffies, timeout)) { -printk ("failed (timeout)\n" ); -return ; - } -msleep (50 ); - }while ((hwif->INB (IDE_STATUS_REG )) &BUSY_STAT ); + +if (ide_busy_sleep (hwif)) { +printk (KERN_CONT "failed (timeout)\n" ); +return ; + }msleep (50 );
@@ -783,18 +789,11 @@ static void probe_hwif(ide_hwif_t *hwif) } }if (hwif->io_ports[IDE_CONTROL_OFFSET ] && hwif->reset) { -unsigned long timeout = jiffies +WAIT_WORSTCASE ; -u8 stat; -printk (KERN_WARNING "%s: reset\n" , hwif->name); hwif->OUTB (12 , hwif->io_ports[IDE_CONTROL_OFFSET ]);udelay (10 ); hwif->OUTB (8 , hwif->io_ports[IDE_CONTROL_OFFSET ]); -do { -msleep (50 ); - stat = hwif->INB (hwif->io_ports[IDE_STATUS_OFFSET ]); - }while ((stat &BUSY_STAT ) &&time_after (timeout, jiffies)); - + (void )ide_busy_sleep (hwif); }local_irq_restore (flags);/*
Quoted 5 lines · Bartlomiej Zolnierkiewicz
Add
ide_busy_sleep()helper and use it indo_probe(),enable_nest()andprobe_hwif().As a nice side-effect this fixes a minor bug in
enable_nest()(the code was reading status register without any delay).
Huh?
Quoted 1 line
Signed-off-by Bartlomiej Zolnierkiewicz <[email protected]>
Quoted 4 lines
Index:
b/drivers/ide/ide-probe.c
===================================================================drivers/ide/ide-probe.c +0
-0
[...]
Quoted 7 lines
drivers/ide/ide-probe.c +0
-1@@ -489,20 +499,16 @@ static int do_probe (ide_drive_t *drive,static void enable_nest (ide_drive_t *drive) {ide_hwif_t *hwif =HWIF (drive); -unsigned long timeout;printk ("%s: enabling %s -- " , hwif->name, drive->id->model);
drivers/ide/ide-probe.c static int do_probe (ide_drive_t *drive, · line 504
Quoted 10 lines
drivers/ide/ide-probe.c +0
-7SELECT_DRIVE (drive);msleep (50 ); hwif->OUTB (EXABYTE_ENABLE_NEST ,IDE_COMMAND_REG ); - timeout = jiffies +WAIT_WORSTCASE ; - do { - if (time_after(jiffies, timeout)) { - printk("failed (timeout)\n"); - return; - } - msleep(50);
Here's a delay, isn't it?
drivers/ide/ide-probe.c static int do_probe (ide_drive_t *drive, · line 513
Quoted 8 lines
drivers/ide/ide-probe.c +5
-1- }while ((hwif->INB (IDE_STATUS_REG )) &BUSY_STAT ); + +if (ide_busy_sleep (hwif)) { +printk (KERN_CONT "failed (timeout)\n" ); +return ; + }msleep (50 );
MBR, Sergei
Hi,
Quoted 25 lines · Sergei Shtylyov
Quoted 5 lines · Bartlomiej Zolnierkiewicz
Add
ide_busy_sleep()helper and use it indo_probe(),enable_nest()andprobe_hwif().As a nice side-effect this fixes a minor bug in
enable_nest()(the code was reading status register without any delay).Huh?
Quoted 1 line
Signed-off-by Bartlomiej Zolnierkiewicz <[email protected]>Acked-by Sergei Shtylyov <[email protected]>Quoted 4 lines
Index:
b/drivers/ide/ide-probe.c
===================================================================drivers/ide/ide-probe.c +0
-0[...]
Quoted 6 lines
drivers/ide/ide-probe.c +0
-1@@ -489,20 +499,16 @@ static int do_probe (ide_drive_t *drive,static void enable_nest (ide_drive_t *drive) {ide_hwif_t *hwif =HWIF (drive); -unsigned long timeout;
Quoted 13 lines
drivers/ide/ide-probe.c static int do_probe (ide_drive_t *drive, · line 504
Quoted 11 lines
drivers/ide/ide-probe.c +0
-7printk ("%s: enabling %s -- " , hwif->name, drive->id->model);SELECT_DRIVE (drive);msleep (50 ); hwif->OUTB (EXABYTE_ENABLE_NEST ,IDE_COMMAND_REG ); - timeout = jiffies +WAIT_WORSTCASE ; - do { - if (time_after(jiffies, timeout)) { - printk("failed (timeout)\n"); - return; - } - msleep(50);Here's a delay, isn't it?
s/enable_nest/do_probe/
Thanks for pointing this out, I fixed patch description locally.
Quoted 8 lines
Quoted 8 lines
drivers/ide/ide-probe.c +5
-1- }while ((hwif->INB (IDE_STATUS_REG )) &BUSY_STAT ); + +if (ide_busy_sleep (hwif)) { +printk (KERN_CONT "failed (timeout)\n" ); +return ; + }msleep (50 );