ide: add ide_tf_read() helper
PATCH 7/18 ide: add ide_tf_read() helper
* Factor out code reading taskfile registers from ide_end_drive_cmd() to the new ide_tf_read() helper.
* Add IDE_TFLAG_IN_* taskfile flags to indicate the need to load particular IDE taskfile register in ide_tf_read().
* Update ide_end_drive_cmd() to set respective IDE_TFLAG_IN_* taksfile flags.
* Add ide_get_lba_addr() for getting LBA sector address from taskfile struct.
* Factor out code getting sector address from ide_dump_ata_status() to the new ide_dump_sector() function.
* Convert ide_dump_sector() to use ide_tf_read() and ide_get_lba_addr().
* Remove no longer needed ide_read_24().
The only change in functionality caused by this patch is that ide_dump_ata_status() no longer prints "high"/"low" parts of LBA48 sector address (of course LBA48 sector address is still printed).
--- drivers/ide/ide-io.c | 68 +++++++++++++++++++++++++++++++++--------------- drivers/ide/ide-iops.c | 8 ----- drivers/ide/ide-lib.c | 69 ++++++++++++++++++++++++++----------------------- include/linux/ide.h | 24 +++++++++++++++-- 4 files changed, 106 insertions(+), 63 deletions(-)
drivers/ide/ide-io.c +47 -21
@@ -297,6 +297,48 @@ static void ide_complete_pm_request (idespin_unlock_irqrestore (&ide_lock, flags); } +void ide_tf_read (ide_drive_t *drive,ide_task_t *task) +{ +ide_hwif_t *hwif = drive->hwif; +struct ide_taskfile *tf = &task->tf; + +if (task->tf_flags &IDE_TFLAG_IN_DATA ) { +u16 data = hwif->INW (IDE_DATA_REG ); + + 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 ); + +if (task->tf_flags &IDE_TFLAG_IN_NSECT ) + tf->nsect = hwif->INB (IDE_NSECTOR_REG ); +if (task->tf_flags &IDE_TFLAG_IN_LBAL ) + tf->lbal = hwif->INB (IDE_SECTOR_REG ); +if (task->tf_flags &IDE_TFLAG_IN_LBAM ) + tf->lbam = hwif->INB (IDE_LCYL_REG ); +if (task->tf_flags &IDE_TFLAG_IN_LBAH ) + tf->lbah = hwif->INB (IDE_HCYL_REG ); +if (task->tf_flags &IDE_TFLAG_IN_DEVICE ) + tf->device = hwif->INB (IDE_SELECT_REG ); + +if (task->tf_flags &IDE_TFLAG_LBA48 ) { + hwif->OUTB (drive->ctl |0x80 ,IDE_CONTROL_REG ); + +if (task->tf_flags &IDE_TFLAG_IN_HOB_FEATURE ) + tf->hob_feature = hwif->INB (IDE_FEATURE_REG ); +if (task->tf_flags &IDE_TFLAG_IN_HOB_NSECT ) + tf->hob_nsect = hwif->INB (IDE_NSECTOR_REG ); +if (task->tf_flags &IDE_TFLAG_IN_HOB_LBAL ) + tf->hob_lbal = hwif->INB (IDE_SECTOR_REG ); +if (task->tf_flags &IDE_TFLAG_IN_HOB_LBAM ) + tf->hob_lbam = hwif->INB (IDE_LCYL_REG ); +if (task->tf_flags &IDE_TFLAG_IN_HOB_LBAH ) + tf->hob_lbah = hwif->INB (IDE_HCYL_REG ); + } +} +/** * ide_end_drive_cmd - end an explicit drive command * @drive: command
@@ -339,30 +381,14 @@ void ide_end_drive_cmd (ide_drive_t *driif (args) {struct ide_taskfile *tf = &args->tf; -if (args->tf_flags &IDE_TFLAG_IN_DATA ) { -u16 data = hwif->INW (IDE_DATA_REG ); - - tf->data = data &0xff ; - tf->hob_data = (data >>8 ) &0xff ; - } tf->error = err; -/* be sure we're looking at the low order bits */ - hwif->OUTB (drive->ctl & ~0x80 ,IDE_CONTROL_REG ); - tf->nsect = hwif->INB (IDE_NSECTOR_REG ); - tf->lbal = hwif->INB (IDE_SECTOR_REG ); - tf->lbam = hwif->INB (IDE_LCYL_REG ); - tf->lbah = hwif->INB (IDE_HCYL_REG ); - tf->device = hwif->INB (IDE_SELECT_REG ); tf->status = stat; -if (args->tf_flags &IDE_TFLAG_LBA48 ) { - hwif->OUTB (drive->ctl|0x80 ,IDE_CONTROL_REG ); - tf->hob_feature = hwif->INB (IDE_FEATURE_REG ); - tf->hob_nsect = hwif->INB (IDE_NSECTOR_REG ); - tf->hob_lbal = hwif->INB (IDE_SECTOR_REG ); - tf->hob_lbam = hwif->INB (IDE_LCYL_REG ); - tf->hob_lbah = hwif->INB (IDE_HCYL_REG ); - } + args->tf_flags |= (IDE_TFLAG_IN_TF |IDE_TFLAG_IN_DEVICE ); +if (args->tf_flags &IDE_TFLAG_LBA48 ) + args->tf_flags |=IDE_TFLAG_IN_HOB ; + +ide_tf_read (drive, args); } }else if (blk_pm_request (rq)) {struct request_pm_state *pm = rq->data;
drivers/ide/ide-iops.c +0 -8
@@ -158,14 +158,6 @@ void default_hwif_mmiops (ide_hwif_t *hwEXPORT_SYMBOL (default_hwif_mmiops); -u32 ide_read_24 (ide_drive_t *drive) -{ -u8 sect =HWIF (drive)->INB (IDE_SECTOR_REG ); -u8 lcyl =HWIF (drive)->INB (IDE_LCYL_REG ); -u8 hcyl =HWIF (drive)->INB (IDE_HCYL_REG ); -return (hcyl<<16 )|(lcyl<<8 )|sect; -} -void SELECT_DRIVE (ide_drive_t *drive) {if (HWIF (drive)->selectproc)
drivers/ide/ide-lib.c +37 -32
81 lines not on this page · raw message
include/linux/ide.h +22 -2
@@ -913,6 +913,27 @@ enum {IDE_TFLAG_IN_DATA = (1 <<17 ),IDE_TFLAG_CUSTOM_HANDLER = (1 <<18 ),IDE_TFLAG_DMA_PIO_FALLBACK = (1 <<19 ), +IDE_TFLAG_IN_HOB_FEATURE = (1 <<20 ), +IDE_TFLAG_IN_HOB_NSECT = (1 <<21 ), +IDE_TFLAG_IN_HOB_LBAL = (1 <<22 ), +IDE_TFLAG_IN_HOB_LBAM = (1 <<23 ), +IDE_TFLAG_IN_HOB_LBAH = (1 <<24 ), +IDE_TFLAG_IN_HOB_LBA =IDE_TFLAG_IN_HOB_LBAL | +IDE_TFLAG_IN_HOB_LBAM | +IDE_TFLAG_IN_HOB_LBAH , +IDE_TFLAG_IN_HOB =IDE_TFLAG_IN_HOB_FEATURE | +IDE_TFLAG_IN_HOB_NSECT | +IDE_TFLAG_IN_HOB_LBA , +IDE_TFLAG_IN_NSECT = (1 <<25 ), +IDE_TFLAG_IN_LBAL = (1 <<26 ), +IDE_TFLAG_IN_LBAM = (1 <<27 ), +IDE_TFLAG_IN_LBAH = (1 <<28 ), +IDE_TFLAG_IN_LBA =IDE_TFLAG_IN_LBAL | +IDE_TFLAG_IN_LBAM | +IDE_TFLAG_IN_LBAH , +IDE_TFLAG_IN_TF =IDE_TFLAG_IN_NSECT | +IDE_TFLAG_IN_LBA , + IDE_TFLAG_IN_DEVICE = (1 << 29), }; struct ide_taskfile {
@@ -956,8 +977,7 @@ typedef struct ide_task_s { } ide_task_t;void ide_tf_load (ide_drive_t *,ide_task_t *); - -extern u32 ide_read_24 (ide_drive_t *); +void ide_tf_read (ide_drive_t *,ide_task_t *);extern void SELECT_DRIVE (ide_drive_t *);extern void SELECT_MASK (ide_drive_t *,int );
Quoted 15 lines · Bartlomiej Zolnierkiewicz
* Factor out code reading taskfile registers from
ide_end_drive_cmd()to the newide_tf_read()helper.* Add IDE_TFLAG_IN_* taskfile flags to indicate the need to load particular IDE taskfile register in
ide_tf_read().* Update
ide_end_drive_cmd()to set respective IDE_TFLAG_IN_* taksfile flags.* Add
ide_get_lba_addr()for getting LBA sector address from taskfile struct.* Factor out code getting sector address from
ide_dump_ata_status()to the newide_dump_sector()function.* Convert
ide_dump_sector()to useide_tf_read()andide_get_lba_addr().
Quoted 7 lines
* Remove no longer needed
ide_read_24().The only change in functionality caused by this patch is that
ide_dump_ata_status()no longer prints "high"/"low" parts of LBA48 sector address (of course LBA48 sector address is still printed).Signed-off-by Bartlomiej Zolnierkiewicz <[email protected]>
Quoted 19 lines
Index:
b/include/linux/ide.h
===================================================================include/linux/ide.h +11
-0@@ -913,6 +913,27 @@ enum {IDE_TFLAG_IN_DATA = (1 <<17 ),IDE_TFLAG_CUSTOM_HANDLER = (1 <<18 ),IDE_TFLAG_DMA_PIO_FALLBACK = (1 <<19 ), +IDE_TFLAG_IN_HOB_FEATURE = (1 <<20 ), +IDE_TFLAG_IN_HOB_NSECT = (1 <<21 ), +IDE_TFLAG_IN_HOB_LBAL = (1 <<22 ), +IDE_TFLAG_IN_HOB_LBAM = (1 <<23 ), +IDE_TFLAG_IN_HOB_LBAH = (1 <<24 ), +IDE_TFLAG_IN_HOB_LBA =IDE_TFLAG_IN_HOB_LBAL | +IDE_TFLAG_IN_HOB_LBAM | +IDE_TFLAG_IN_HOB_LBAH , +IDE_TFLAG_IN_HOB =IDE_TFLAG_IN_HOB_FEATURE | +IDE_TFLAG_IN_HOB_NSECT | + IDE_TFLAG_IN_HOB_LBA,
include/linux/ide.h enum { · line 936
Quoted 10 lines
include/linux/ide.h +10
-0+IDE_TFLAG_IN_NSECT = (1 <<25 ), +IDE_TFLAG_IN_LBAL = (1 <<26 ), +IDE_TFLAG_IN_LBAM = (1 <<27 ), +IDE_TFLAG_IN_LBAH = (1 <<28 ), +IDE_TFLAG_IN_LBA =IDE_TFLAG_IN_LBAL | +IDE_TFLAG_IN_LBAM | +IDE_TFLAG_IN_LBAH , +IDE_TFLAG_IN_TF =IDE_TFLAG_IN_NSECT | +IDE_TFLAG_IN_LBA , + IDE_TFLAG_IN_DEVICE = (1 << 29),
Hm, yet the device/head is a part of the LBA in 24-bit mode...
include/linux/ide.h enum { · line 939
Quoted 3 lines
include/linux/ide.h +0
-0};struct ide_taskfile {
MBR, Sergei