ide: add ide_read_[alt]status() inline helpers
Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
这个提交包含在:
@@ -264,8 +264,7 @@ err_misc:
|
||||
static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
|
||||
{
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
int rc;
|
||||
unsigned long hd_status;
|
||||
int use_altstatus = 0, rc;
|
||||
unsigned long timeout;
|
||||
u8 s = 0, a = 0;
|
||||
|
||||
@@ -273,19 +272,17 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
|
||||
msleep(50);
|
||||
|
||||
if (IDE_CONTROL_REG) {
|
||||
a = hwif->INB(IDE_ALTSTATUS_REG);
|
||||
s = hwif->INB(IDE_STATUS_REG);
|
||||
if ((a ^ s) & ~INDEX_STAT) {
|
||||
printk(KERN_INFO "%s: probing with STATUS(0x%02x) instead of "
|
||||
"ALTSTATUS(0x%02x)\n", drive->name, s, a);
|
||||
a = ide_read_altstatus(drive);
|
||||
s = ide_read_status(drive);
|
||||
if ((a ^ s) & ~INDEX_STAT)
|
||||
/* ancient Seagate drives, broken interfaces */
|
||||
hd_status = IDE_STATUS_REG;
|
||||
} else {
|
||||
printk(KERN_INFO "%s: probing with STATUS(0x%02x) "
|
||||
"instead of ALTSTATUS(0x%02x)\n",
|
||||
drive->name, s, a);
|
||||
else
|
||||
/* use non-intrusive polling */
|
||||
hd_status = IDE_ALTSTATUS_REG;
|
||||
}
|
||||
} else
|
||||
hd_status = IDE_STATUS_REG;
|
||||
use_altstatus = 1;
|
||||
}
|
||||
|
||||
/* set features register for atapi
|
||||
* identify command to be sure of reply
|
||||
@@ -306,11 +303,15 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
|
||||
}
|
||||
/* give drive a breather */
|
||||
msleep(50);
|
||||
} while ((hwif->INB(hd_status)) & BUSY_STAT);
|
||||
s = use_altstatus ? ide_read_altstatus(drive)
|
||||
: ide_read_status(drive);
|
||||
} while (s & BUSY_STAT);
|
||||
|
||||
/* wait for IRQ and DRQ_STAT */
|
||||
msleep(50);
|
||||
if (OK_STAT((hwif->INB(IDE_STATUS_REG)), DRQ_STAT, BAD_R_STAT)) {
|
||||
s = ide_read_status(drive);
|
||||
|
||||
if (OK_STAT(s, DRQ_STAT, BAD_R_STAT)) {
|
||||
unsigned long flags;
|
||||
|
||||
/* local CPU only; some systems need this */
|
||||
@@ -320,7 +321,7 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
|
||||
/* drive responded with ID */
|
||||
rc = 0;
|
||||
/* clear drive IRQ */
|
||||
(void) hwif->INB(IDE_STATUS_REG);
|
||||
(void)ide_read_status(drive);
|
||||
local_irq_restore(flags);
|
||||
} else {
|
||||
/* drive refused ID */
|
||||
@@ -367,7 +368,7 @@ static int try_to_identify (ide_drive_t *drive, u8 cmd)
|
||||
|
||||
ide_set_irq(drive, 0);
|
||||
/* clear drive IRQ */
|
||||
(void) hwif->INB(IDE_STATUS_REG);
|
||||
(void)ide_read_status(drive);
|
||||
udelay(5);
|
||||
irq = probe_irq_off(cookie);
|
||||
if (!hwif->irq) {
|
||||
@@ -455,7 +456,9 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
|
||||
return 3;
|
||||
}
|
||||
|
||||
if (OK_STAT((hwif->INB(IDE_STATUS_REG)), READY_STAT, BUSY_STAT) ||
|
||||
stat = ide_read_status(drive);
|
||||
|
||||
if (OK_STAT(stat, READY_STAT, BUSY_STAT) ||
|
||||
drive->present || cmd == WIN_PIDENTIFY) {
|
||||
/* send cmd and wait */
|
||||
if ((rc = try_to_identify(drive, cmd))) {
|
||||
@@ -463,7 +466,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
|
||||
rc = try_to_identify(drive,cmd);
|
||||
}
|
||||
|
||||
stat = hwif->INB(IDE_STATUS_REG);
|
||||
stat = ide_read_status(drive);
|
||||
|
||||
if (stat == (BUSY_STAT | READY_STAT))
|
||||
return 4;
|
||||
@@ -482,7 +485,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
|
||||
}
|
||||
|
||||
/* ensure drive IRQ is clear */
|
||||
stat = hwif->INB(IDE_STATUS_REG);
|
||||
stat = ide_read_status(drive);
|
||||
|
||||
if (rc == 1)
|
||||
printk(KERN_ERR "%s: no response (status = 0x%02x)\n",
|
||||
@@ -496,7 +499,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
|
||||
SELECT_DRIVE(&hwif->drives[0]);
|
||||
msleep(50);
|
||||
/* ensure drive irq is clear */
|
||||
(void) hwif->INB(IDE_STATUS_REG);
|
||||
(void)ide_read_status(drive);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
@@ -521,7 +524,7 @@ static void enable_nest (ide_drive_t *drive)
|
||||
|
||||
msleep(50);
|
||||
|
||||
stat = hwif->INB(IDE_STATUS_REG);
|
||||
stat = ide_read_status(drive);
|
||||
|
||||
if (!OK_STAT(stat, 0, BAD_STAT))
|
||||
printk(KERN_CONT "failed (status = 0x%02x)\n", stat);
|
||||
|
在新工单中引用
屏蔽一个用户