Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 112874
b: refs/heads/master
c: b163f46
h: refs/heads/master
v: v3
  • Loading branch information
Bartlomiej Zolnierkiewicz committed Oct 10, 2008
1 parent 801286e commit 078a29c
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 29 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c36a7e98846a7a4a1c09b7f148395089bce512d8
refs/heads/master: b163f46d5ecf48d883ce156e5e5a21a1a9a125c7
15 changes: 5 additions & 10 deletions trunk/drivers/ide/ide-iops.c
Original file line number Diff line number Diff line change
Expand Up @@ -666,7 +666,7 @@ int ide_driveid_update(ide_drive_t *drive)
ide_hwif_t *hwif = drive->hwif;
const struct ide_tp_ops *tp_ops = hwif->tp_ops;
u16 *id;
unsigned long timeout, flags;
unsigned long flags;
u8 stat;

/*
Expand All @@ -678,16 +678,11 @@ int ide_driveid_update(ide_drive_t *drive)
tp_ops->set_irq(hwif, 0);
msleep(50);
tp_ops->exec_command(hwif, ATA_CMD_ID_ATA);
timeout = jiffies + WAIT_WORSTCASE;
do {
if (time_after(jiffies, timeout)) {
SELECT_MASK(drive, 0);
return 0; /* drive timed-out */
}

msleep(50); /* give drive a breather */
stat = tp_ops->read_altstatus(hwif);
} while (stat & ATA_BUSY);
if (ide_busy_sleep(hwif, WAIT_WORSTCASE, 1)) {
SELECT_MASK(drive, 0);
return 0;
}

msleep(50); /* wait for IRQ and ATA_DRQ */
stat = tp_ops->read_status(hwif);
Expand Down
30 changes: 12 additions & 18 deletions trunk/drivers/ide/ide-probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -291,17 +291,9 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
tp_ops->exec_command(hwif, cmd);

timeout = ((cmd == ATA_CMD_ID_ATA) ? WAIT_WORSTCASE : WAIT_PIDENTIFY) / 2;
timeout += jiffies;
do {
if (time_after(jiffies, timeout)) {
/* drive timed-out */
return 1;
}
/* give drive a breather */
msleep(50);
s = use_altstatus ? tp_ops->read_altstatus(hwif)
: tp_ops->read_status(hwif);
} while (s & ATA_BUSY);

if (ide_busy_sleep(hwif, timeout, use_altstatus))
return 1;

/* wait for IRQ and ATA_DRQ */
msleep(50);
Expand Down Expand Up @@ -383,19 +375,21 @@ static int try_to_identify (ide_drive_t *drive, u8 cmd)
return retval;
}

static int ide_busy_sleep(ide_hwif_t *hwif)
int ide_busy_sleep(ide_hwif_t *hwif, unsigned long timeout, int altstatus)
{
unsigned long timeout = jiffies + WAIT_WORSTCASE;
u8 stat;

timeout += jiffies;

do {
msleep(50);
stat = hwif->tp_ops->read_status(hwif);
msleep(50); /* give drive a breather */
stat = altstatus ? hwif->tp_ops->read_altstatus(hwif)
: hwif->tp_ops->read_status(hwif);
if ((stat & ATA_BUSY) == 0)
return 0;
} while (time_before(jiffies, timeout));

return 1;
return 1; /* drive timed-out */
}

static u8 ide_read_device(ide_drive_t *drive)
Expand Down Expand Up @@ -489,7 +483,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
SELECT_DRIVE(drive);
msleep(50);
tp_ops->exec_command(hwif, ATA_CMD_DEV_RESET);
(void)ide_busy_sleep(hwif);
(void)ide_busy_sleep(hwif, WAIT_WORSTCASE, 0);
rc = try_to_identify(drive, cmd);
}

Expand Down Expand Up @@ -529,7 +523,7 @@ static void enable_nest (ide_drive_t *drive)
msleep(50);
tp_ops->exec_command(hwif, ATA_EXABYTE_ENABLE_NEST);

if (ide_busy_sleep(hwif)) {
if (ide_busy_sleep(hwif, WAIT_WORSTCASE, 0)) {
printk(KERN_CONT "failed (timeout)\n");
return;
}
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/ide.h
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,8 @@ void ide_fix_driveid(u16 *);

extern void ide_fixstring(u8 *, const int, const int);

int ide_busy_sleep(ide_hwif_t *, unsigned long, int);

int ide_wait_stat(ide_startstop_t *, ide_drive_t *, u8, u8, unsigned long);

extern ide_startstop_t ide_do_reset (ide_drive_t *);
Expand Down

0 comments on commit 078a29c

Please sign in to comment.