projects
/
cascardo
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ide: remove obsoleted "idex=reset" kernel parameter
[cascardo/linux.git]
/
drivers
/
ide
/
ide-io.c
diff --git
a/drivers/ide/ide-io.c
b/drivers/ide/ide-io.c
index
3addbe4
..
0fe89a5
100644
(file)
--- a/
drivers/ide/ide-io.c
+++ b/
drivers/ide/ide-io.c
@@
-218,7
+218,7
@@
static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *
* we could be smarter and check for current xfer_speed
* in struct drive etc...
*/
* we could be smarter and check for current xfer_speed
* in struct drive etc...
*/
- if (drive->hwif->dma_
host_set
== NULL)
+ if (drive->hwif->dma_
ops
== NULL)
break;
/*
* TODO: respect ->using_dma setting
break;
/*
* TODO: respect ->using_dma setting
@@
-301,39
+301,45
@@
void ide_tf_read(ide_drive_t *drive, ide_task_t *task)
struct ide_taskfile *tf = &task->tf;
if (task->tf_flags & IDE_TFLAG_IN_DATA) {
struct ide_taskfile *tf = &task->tf;
if (task->tf_flags & IDE_TFLAG_IN_DATA) {
- u16 data = hwif->INW(
IDE_DATA_REG
);
+ u16 data = hwif->INW(
hwif->io_ports[IDE_DATA_OFFSET]
);
tf->data = data & 0xff;
tf->hob_data = (data >> 8) & 0xff;
}
/* be sure we're looking at the low order bits */
tf->data = data & 0xff;
tf->hob_data = (data >> 8) & 0xff;
}
/* be sure we're looking at the low order bits */
- hwif->OUTB(drive->ctl & ~0x80,
IDE_CONTROL_REG
);
+ hwif->OUTB(drive->ctl & ~0x80,
hwif->io_ports[IDE_CONTROL_OFFSET]
);
if (task->tf_flags & IDE_TFLAG_IN_NSECT)
if (task->tf_flags & IDE_TFLAG_IN_NSECT)
- tf->nsect = hwif->INB(
IDE_NSECTOR_REG
);
+ tf->nsect = hwif->INB(
hwif->io_ports[IDE_NSECTOR_OFFSET]
);
if (task->tf_flags & IDE_TFLAG_IN_LBAL)
if (task->tf_flags & IDE_TFLAG_IN_LBAL)
- tf->lbal = hwif->INB(
IDE_SECTOR_REG
);
+ tf->lbal = hwif->INB(
hwif->io_ports[IDE_SECTOR_OFFSET]
);
if (task->tf_flags & IDE_TFLAG_IN_LBAM)
if (task->tf_flags & IDE_TFLAG_IN_LBAM)
- tf->lbam = hwif->INB(
IDE_LCYL_REG
);
+ tf->lbam = hwif->INB(
hwif->io_ports[IDE_LCYL_OFFSET]
);
if (task->tf_flags & IDE_TFLAG_IN_LBAH)
if (task->tf_flags & IDE_TFLAG_IN_LBAH)
- tf->lbah = hwif->INB(
IDE_HCYL_REG
);
+ tf->lbah = hwif->INB(
hwif->io_ports[IDE_HCYL_OFFSET]
);
if (task->tf_flags & IDE_TFLAG_IN_DEVICE)
if (task->tf_flags & IDE_TFLAG_IN_DEVICE)
- tf->device = hwif->INB(
IDE_SELECT_REG
);
+ tf->device = hwif->INB(
hwif->io_ports[IDE_SELECT_OFFSET]
);
if (task->tf_flags & IDE_TFLAG_LBA48) {
if (task->tf_flags & IDE_TFLAG_LBA48) {
- hwif->OUTB(drive->ctl | 0x80, IDE_CONTROL_REG);
+ hwif->OUTB(drive->ctl | 0x80,
+ hwif->io_ports[IDE_CONTROL_OFFSET]);
if (task->tf_flags & IDE_TFLAG_IN_HOB_FEATURE)
if (task->tf_flags & IDE_TFLAG_IN_HOB_FEATURE)
- tf->hob_feature = hwif->INB(IDE_FEATURE_REG);
+ tf->hob_feature =
+ hwif->INB(hwif->io_ports[IDE_FEATURE_OFFSET]);
if (task->tf_flags & IDE_TFLAG_IN_HOB_NSECT)
if (task->tf_flags & IDE_TFLAG_IN_HOB_NSECT)
- tf->hob_nsect = hwif->INB(IDE_NSECTOR_REG);
+ tf->hob_nsect =
+ hwif->INB(hwif->io_ports[IDE_NSECTOR_OFFSET]);
if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAL)
if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAL)
- tf->hob_lbal = hwif->INB(IDE_SECTOR_REG);
+ tf->hob_lbal =
+ hwif->INB(hwif->io_ports[IDE_SECTOR_OFFSET]);
if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAM)
if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAM)
- tf->hob_lbam = hwif->INB(IDE_LCYL_REG);
+ tf->hob_lbam =
+ hwif->INB(hwif->io_ports[IDE_LCYL_OFFSET]);
if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAH)
if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAH)
- tf->hob_lbah = hwif->INB(IDE_HCYL_REG);
+ tf->hob_lbah =
+ hwif->INB(hwif->io_ports[IDE_HCYL_OFFSET]);
}
}
}
}
@@
-361,17
+367,21
@@
void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)
spin_unlock_irqrestore(&ide_lock, flags);
if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
spin_unlock_irqrestore(&ide_lock, flags);
if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
- ide_task_t *args = (ide_task_t *) rq->special;
+ ide_task_t *task = (ide_task_t *)rq->special;
+
if (rq->errors == 0)
if (rq->errors == 0)
- rq->errors = !OK_STAT(stat,
READY_STAT,
BAD_STAT);
-
- if (
args
) {
- struct ide_taskfile *tf = &
args
->tf;
+ rq->errors = !OK_STAT(stat,
READY_STAT,
BAD_STAT);
+
+ if (
task
) {
+ struct ide_taskfile *tf = &
task
->tf;
tf->error = err;
tf->status = stat;
tf->error = err;
tf->status = stat;
- ide_tf_read(drive, args);
+ ide_tf_read(drive, task);
+
+ if (task->tf_flags & IDE_TFLAG_DYN)
+ kfree(task);
}
} else if (blk_pm_request(rq)) {
struct request_pm_state *pm = rq->data;
}
} else if (blk_pm_request(rq)) {
struct request_pm_state *pm = rq->data;
@@
-388,7
+398,8
@@
void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)
spin_lock_irqsave(&ide_lock, flags);
HWGROUP(drive)->rq = NULL;
rq->errors = err;
spin_lock_irqsave(&ide_lock, flags);
HWGROUP(drive)->rq = NULL;
rq->errors = err;
- if (__blk_end_request(rq, (rq->errors ? -EIO : 0), 0))
+ if (unlikely(__blk_end_request(rq, (rq->errors ? -EIO : 0),
+ blk_rq_bytes(rq))))
BUG();
spin_unlock_irqrestore(&ide_lock, flags);
}
BUG();
spin_unlock_irqrestore(&ide_lock, flags);
}
@@
-443,7
+454,8
@@
static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8
if (err == ABRT_ERR) {
if (drive->select.b.lba &&
/* some newer drives don't support WIN_SPECIFY */
if (err == ABRT_ERR) {
if (drive->select.b.lba &&
/* some newer drives don't support WIN_SPECIFY */
- hwif->INB(IDE_COMMAND_REG) == WIN_SPECIFY)
+ hwif->INB(hwif->io_ports[IDE_COMMAND_OFFSET]) ==
+ WIN_SPECIFY)
return ide_stopped;
} else if ((err & BAD_CRC) == BAD_CRC) {
/* UDMA crc error, just retry the operation */
return ide_stopped;
} else if ((err & BAD_CRC) == BAD_CRC) {
/* UDMA crc error, just retry the operation */
@@
-495,7
+507,8
@@
static ide_startstop_t ide_atapi_error(ide_drive_t *drive, struct request *rq, u
if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT))
/* force an abort */
if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT))
/* force an abort */
- hwif->OUTB(WIN_IDLEIMMEDIATE, IDE_COMMAND_REG);
+ hwif->OUTB(WIN_IDLEIMMEDIATE,
+ hwif->io_ports[IDE_COMMAND_OFFSET]);
if (rq->errors >= ERROR_MAX) {
ide_kill_rq(drive, rq);
if (rq->errors >= ERROR_MAX) {
ide_kill_rq(drive, rq);
@@
-708,15
+721,12
@@
static ide_startstop_t do_special (ide_drive_t *drive)
#endif
if (s->b.set_tune) {
ide_hwif_t *hwif = drive->hwif;
#endif
if (s->b.set_tune) {
ide_hwif_t *hwif = drive->hwif;
+ const struct ide_port_ops *port_ops = hwif->port_ops;
u8 req_pio = drive->tune_req;
s->b.set_tune = 0;
if (set_pio_mode_abuse(drive->hwif, req_pio)) {
u8 req_pio = drive->tune_req;
s->b.set_tune = 0;
if (set_pio_mode_abuse(drive->hwif, req_pio)) {
-
- if (hwif->set_pio_mode == NULL)
- return ide_stopped;
-
/*
* take ide_lock for drive->[no_]unmask/[no_]io_32bit
*/
/*
* take ide_lock for drive->[no_]unmask/[no_]io_32bit
*/
@@
-724,10
+734,10
@@
static ide_startstop_t do_special (ide_drive_t *drive)
unsigned long flags;
spin_lock_irqsave(&ide_lock, flags);
unsigned long flags;
spin_lock_irqsave(&ide_lock, flags);
-
hwif
->set_pio_mode(drive, req_pio);
+
port_ops
->set_pio_mode(drive, req_pio);
spin_unlock_irqrestore(&ide_lock, flags);
} else
spin_unlock_irqrestore(&ide_lock, flags);
} else
-
hwif
->set_pio_mode(drive, req_pio);
+
port_ops
->set_pio_mode(drive, req_pio);
} else {
int keep_dma = drive->using_dma;
} else {
int keep_dma = drive->using_dma;
@@
-1228,12
+1238,12
@@
static ide_startstop_t ide_dma_timeout_retry(ide_drive_t *drive, int error)
if (error < 0) {
printk(KERN_WARNING "%s: DMA timeout error\n", drive->name);
if (error < 0) {
printk(KERN_WARNING "%s: DMA timeout error\n", drive->name);
- (void)
HWIF(drive)->ide_
dma_end(drive);
+ (void)
hwif->dma_ops->
dma_end(drive);
ret = ide_error(drive, "dma timeout error",
ide_read_status(drive));
} else {
printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name);
ret = ide_error(drive, "dma timeout error",
ide_read_status(drive));
} else {
printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name);
- hwif->dma_timeout(drive);
+ hwif->dma_
ops->dma_
timeout(drive);
}
/*
}
/*
@@
-1345,7
+1355,7
@@
void ide_timer_expiry (unsigned long data)
startstop = handler(drive);
} else if (drive_is_ready(drive)) {
if (drive->waiting_for_dma)
startstop = handler(drive);
} else if (drive_is_ready(drive)) {
if (drive->waiting_for_dma)
- hw
group->hwif
->dma_lost_irq(drive);
+ hw
if->dma_ops
->dma_lost_irq(drive);
(void)ide_ack_intr(hwif);
printk(KERN_WARNING "%s: lost interrupt\n", drive->name);
startstop = handler(drive);
(void)ide_ack_intr(hwif);
printk(KERN_WARNING "%s: lost interrupt\n", drive->name);
startstop = handler(drive);