Re: [PATCH 2.6.11-rc2 03/04] ide: ide_read_taskfile() implemented.

From: Tejun Heo
Date: Sun Feb 06 2005 - 06:41:18 EST



03_ide_read_taskfile.patch

Status reading part of ide_end_drive_cmd() is moved into
a separate function ide_read_taskfile().


Signed-off-by: Tejun Heo <tj@xxxxxxxxxxx>


Index: linux-ide-series3-export/drivers/ide/ide-io.c
===================================================================
--- linux-ide-series3-export.orig/drivers/ide/ide-io.c 2005-02-06 19:48:58.680279593 +0900
+++ linux-ide-series3-export/drivers/ide/ide-io.c 2005-02-06 19:49:19.496897703 +0900
@@ -339,7 +339,6 @@ static void ide_complete_barrier(ide_dri

void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)
{
- ide_hwif_t *hwif = HWIF(drive);
unsigned long flags;
struct request *rq;

@@ -351,32 +350,8 @@ void ide_end_drive_cmd (ide_drive_t *dri
ide_task_t *args = (ide_task_t *) rq->special;
if (rq->errors == 0)
rq->errors = !OK_STAT(stat,READY_STAT,BAD_STAT);
-
- if (args) {
- if (args->tf_in_flags.b.data) {
- u16 data = hwif->INW(IDE_DATA_REG);
- args->tfRegister[IDE_DATA_OFFSET] = (data) & 0xFF;
- args->hobRegister[IDE_DATA_OFFSET] = (data >> 8) & 0xFF;
- }
- args->tfRegister[IDE_ERROR_OFFSET] = err;
- /* be sure we're looking at the low order bits */
- hwif->OUTB(drive->ctl & ~0x80, IDE_CONTROL_REG);
- args->tfRegister[IDE_NSECTOR_OFFSET] = hwif->INB(IDE_NSECTOR_REG);
- args->tfRegister[IDE_SECTOR_OFFSET] = hwif->INB(IDE_SECTOR_REG);
- args->tfRegister[IDE_LCYL_OFFSET] = hwif->INB(IDE_LCYL_REG);
- args->tfRegister[IDE_HCYL_OFFSET] = hwif->INB(IDE_HCYL_REG);
- args->tfRegister[IDE_SELECT_OFFSET] = hwif->INB(IDE_SELECT_REG);
- args->tfRegister[IDE_STATUS_OFFSET] = stat;
-
- if (drive->addressing == 1) {
- hwif->OUTB(drive->ctl|0x80, IDE_CONTROL_REG);
- args->hobRegister[IDE_FEATURE_OFFSET] = hwif->INB(IDE_FEATURE_REG);
- args->hobRegister[IDE_NSECTOR_OFFSET] = hwif->INB(IDE_NSECTOR_REG);
- args->hobRegister[IDE_SECTOR_OFFSET] = hwif->INB(IDE_SECTOR_REG);
- args->hobRegister[IDE_LCYL_OFFSET] = hwif->INB(IDE_LCYL_REG);
- args->hobRegister[IDE_HCYL_OFFSET] = hwif->INB(IDE_HCYL_REG);
- }
- }
+ if (args)
+ ide_read_taskfile(drive, args, stat, err);
} else if (blk_pm_request(rq)) {
#ifdef DEBUG_PM
printk("%s: complete_power_step(step: %d, stat: %x, err: %x)\n",
Index: linux-ide-series3-export/drivers/ide/ide-taskfile.c
===================================================================
--- linux-ide-series3-export.orig/drivers/ide/ide-taskfile.c 2005-02-06 19:49:18.730022291 +0900
+++ linux-ide-series3-export/drivers/ide/ide-taskfile.c 2005-02-06 19:49:19.493898191 +0900
@@ -180,6 +180,41 @@ void ide_write_taskfile(ide_drive_t *dri

EXPORT_SYMBOL(ide_write_taskfile);

+void ide_read_taskfile(ide_drive_t *drive, ide_task_t *task, u8 stat, u8 err)
+{
+ ide_hwif_t *hwif = drive->hwif;
+ u8 (*INB)(unsigned long) = hwif->INB;
+ unsigned long *ports = hwif->io_ports;
+ task_struct_t *tf = (task_struct_t *)task->tfRegister;
+ hob_struct_t *hob = (hob_struct_t *)task->hobRegister;
+
+ if (task->tf_in_flags.b.data) {
+ u16 data = hwif->INW(ports[IDE_DATA_OFFSET]);
+ tf->data = (data) & 0xFF;
+ hob->data = (data >> 8) & 0xFF;
+ }
+
+ if (drive->addressing == 1) {
+ /* read HOB first such that HOB bit stays cleared when
+ we leave this function. */
+ hwif->OUTB(drive->ctl|0x80, ports[IDE_CONTROL_OFFSET]);
+ hob->feature = INB(ports[IDE_FEATURE_OFFSET]);
+ hob->sector_count = INB(ports[IDE_NSECTOR_OFFSET]);
+ hob->sector_number = INB(ports[IDE_SECTOR_OFFSET]);
+ hob->low_cylinder = INB(ports[IDE_LCYL_OFFSET]);
+ hob->high_cylinder = INB(ports[IDE_HCYL_OFFSET]);
+ }
+
+ hwif->OUTB(drive->ctl & ~0x80, ports[IDE_CONTROL_OFFSET]);
+ tf->feature = err;
+ tf->sector_count = INB(ports[IDE_NSECTOR_OFFSET]);
+ tf->sector_number = INB(ports[IDE_SECTOR_OFFSET]);
+ tf->low_cylinder = INB(ports[IDE_LCYL_OFFSET]);
+ tf->high_cylinder = INB(ports[IDE_HCYL_OFFSET]);
+ tf->device_head = INB(ports[IDE_SELECT_OFFSET]);
+ tf->command = stat;
+}
+
ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
{
ide_hwif_t *hwif = HWIF(drive);
Index: linux-ide-series3-export/include/linux/ide.h
===================================================================
--- linux-ide-series3-export.orig/include/linux/ide.h 2005-02-06 19:49:18.732021966 +0900
+++ linux-ide-series3-export/include/linux/ide.h 2005-02-06 19:49:19.495897866 +0900
@@ -1296,6 +1296,7 @@ extern int drive_is_ready(ide_drive_t *)
extern int wait_for_ready(ide_drive_t *, int /* timeout */);

void ide_write_taskfile(ide_drive_t *drive, ide_task_t *task);
+void ide_read_taskfile(ide_drive_t *drive, ide_task_t *task, u8 stat, u8 err);

/*
* taskfile io for disks for now...and builds request from ide_ioctl
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/