falconide/q40ide: add ->atapi_*put_bytes and ->ata_*put_data methods (take 2)
* Add ->atapi_{in,out}put_bytes and ->ata_{in,out}put_data methods to falconide and q40ide host drivers (->ata_* methods are implemented on top of ->atapi_* methods so they also do byte-swapping now). * Cleanup atapi_{in,out}put_bytes(). v2: * Add 'struct request *rq' argument to ->ata_{in,out}put_data methods and don't byte-swap disk fs requests (we shouldn't un-swap fs requests because fs itself is stored byte-swapped on the disk) - this is how things were done before the patch (ideally device mapper should be used instead but it would break existing setups and would have some performance impact). Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Michael Schmitz <schmitz@debian.org> Cc: Roman Zippel <zippel@linux-m68k.org> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: Richard Zidlicky <rz@linux-m68k.org> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
@@ -192,7 +192,8 @@ static void ata_vlb_sync(ide_drive_t *drive, unsigned long port)
|
||||
/*
|
||||
* This is used for most PIO data transfers *from* the IDE interface
|
||||
*/
|
||||
static void ata_input_data(ide_drive_t *drive, void *buffer, u32 wcount)
|
||||
static void ata_input_data(ide_drive_t *drive, struct request *rq,
|
||||
void *buffer, u32 wcount)
|
||||
{
|
||||
ide_hwif_t *hwif = drive->hwif;
|
||||
struct ide_io_ports *io_ports = &hwif->io_ports;
|
||||
@@ -215,7 +216,8 @@ static void ata_input_data(ide_drive_t *drive, void *buffer, u32 wcount)
|
||||
/*
|
||||
* This is used for most PIO data transfers *to* the IDE interface
|
||||
*/
|
||||
static void ata_output_data(ide_drive_t *drive, void *buffer, u32 wcount)
|
||||
static void ata_output_data(ide_drive_t *drive, struct request *rq,
|
||||
void *buffer, u32 wcount)
|
||||
{
|
||||
ide_hwif_t *hwif = drive->hwif;
|
||||
struct ide_io_ports *io_ports = &hwif->io_ports;
|
||||
@@ -248,14 +250,7 @@ static void atapi_input_bytes(ide_drive_t *drive, void *buffer, u32 bytecount)
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
|
||||
++bytecount;
|
||||
#if defined(CONFIG_ATARI) || defined(CONFIG_Q40)
|
||||
if (MACH_IS_ATARI || MACH_IS_Q40) {
|
||||
/* Atari has a byte-swapped IDE interface */
|
||||
insw_swapw(hwif->io_ports.data_addr, buffer, bytecount / 2);
|
||||
return;
|
||||
}
|
||||
#endif /* CONFIG_ATARI || CONFIG_Q40 */
|
||||
hwif->ata_input_data(drive, buffer, bytecount / 4);
|
||||
hwif->ata_input_data(drive, NULL, buffer, bytecount / 4);
|
||||
if ((bytecount & 0x03) >= 2)
|
||||
hwif->INSW(hwif->io_ports.data_addr,
|
||||
(u8 *)buffer + (bytecount & ~0x03), 1);
|
||||
@@ -266,14 +261,7 @@ static void atapi_output_bytes(ide_drive_t *drive, void *buffer, u32 bytecount)
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
|
||||
++bytecount;
|
||||
#if defined(CONFIG_ATARI) || defined(CONFIG_Q40)
|
||||
if (MACH_IS_ATARI || MACH_IS_Q40) {
|
||||
/* Atari has a byte-swapped IDE interface */
|
||||
outsw_swapw(hwif->io_ports.data_addr, buffer, bytecount / 2);
|
||||
return;
|
||||
}
|
||||
#endif /* CONFIG_ATARI || CONFIG_Q40 */
|
||||
hwif->ata_output_data(drive, buffer, bytecount / 4);
|
||||
hwif->ata_output_data(drive, NULL, buffer, bytecount / 4);
|
||||
if ((bytecount & 0x03) >= 2)
|
||||
hwif->OUTSW(hwif->io_ports.data_addr,
|
||||
(u8 *)buffer + (bytecount & ~0x03), 1);
|
||||
@@ -668,7 +656,7 @@ int ide_driveid_update(ide_drive_t *drive)
|
||||
local_irq_restore(flags);
|
||||
return 0;
|
||||
}
|
||||
hwif->ata_input_data(drive, id, SECTOR_WORDS);
|
||||
hwif->ata_input_data(drive, NULL, id, SECTOR_WORDS);
|
||||
(void)ide_read_status(drive); /* clear drive IRQ */
|
||||
local_irq_enable();
|
||||
local_irq_restore(flags);
|
||||
|
Reference in New Issue
Block a user