Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92d3ab27 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

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: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 284aa76b
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -673,8 +673,10 @@ cris_ide_inb(unsigned long reg)
	return (unsigned char)cris_ide_inw(reg);
}

static void cris_ide_input_data (ide_drive_t *drive, void *, unsigned int);
static void cris_ide_output_data (ide_drive_t *drive, void *, unsigned int);
static void cris_ide_input_data(ide_drive_t *, struct request *,
				void *, unsigned int);
static void cris_ide_output_data(ide_drive_t *, struct request *,
				 void *, unsigned int);
static void cris_atapi_input_bytes(ide_drive_t *drive, void *, unsigned int);
static void cris_atapi_output_bytes(ide_drive_t *drive, void *, unsigned int);

@@ -900,8 +902,8 @@ cris_atapi_output_bytes (ide_drive_t *drive, void *buffer, unsigned int bytecoun
/*
 * This is used for most PIO data transfers *from* the IDE interface
 */
static void
cris_ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
static void cris_ide_input_data(ide_drive_t *drive, struct request *rq,
				void *buffer, unsigned int wcount)
{
	cris_atapi_input_bytes(drive, buffer, wcount << 2);
}
@@ -909,8 +911,8 @@ cris_ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
/*
 * This is used for most PIO data transfers *to* the IDE interface
 */
static void
cris_ide_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
static void cris_ide_output_data(ide_drive_t *drive, struct request *,
				 void *buffer, unsigned int wcount)
{
	cris_atapi_output_bytes(drive, buffer, wcount << 2);
}
+1 −1
Original line number Diff line number Diff line
@@ -422,7 +422,7 @@ static void try_to_flush_leftover_data (ide_drive_t *drive)
		u32 wcount = (i > 16) ? 16 : i;

		i -= wcount;
		HWIF(drive)->ata_input_data(drive, buffer, wcount);
		drive->hwif->ata_input_data(drive, NULL, buffer, wcount);
	}
}

+7 −19
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -124,7 +124,7 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)

	id = drive->id;
	/* read 512 bytes of id info */
	hwif->ata_input_data(drive, id, SECTOR_WORDS);
	hwif->ata_input_data(drive, NULL, id, SECTOR_WORDS);

	drive->id_read = 1;
	local_irq_enable();
+9 −7
Original line number Diff line number Diff line
@@ -283,7 +283,8 @@ static u8 wait_drive_not_busy(ide_drive_t *drive)
	return stat;
}

static void ide_pio_sector(ide_drive_t *drive, unsigned int write)
static void ide_pio_sector(ide_drive_t *drive, struct request *rq,
			   unsigned int write)
{
	ide_hwif_t *hwif = drive->hwif;
	struct scatterlist *sg = hwif->sg_table;
@@ -323,9 +324,9 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int write)

	/* do the actual data transfer */
	if (write)
		hwif->ata_output_data(drive, buf, SECTOR_WORDS);
		hwif->ata_output_data(drive, rq, buf, SECTOR_WORDS);
	else
		hwif->ata_input_data(drive, buf, SECTOR_WORDS);
		hwif->ata_input_data(drive, rq, buf, SECTOR_WORDS);

	kunmap_atomic(buf, KM_BIO_SRC_IRQ);
#ifdef CONFIG_HIGHMEM
@@ -333,13 +334,14 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int write)
#endif
}

static void ide_pio_multi(ide_drive_t *drive, unsigned int write)
static void ide_pio_multi(ide_drive_t *drive, struct request *rq,
			  unsigned int write)
{
	unsigned int nsect;

	nsect = min_t(unsigned int, drive->hwif->nleft, drive->mult_count);
	while (nsect--)
		ide_pio_sector(drive, write);
		ide_pio_sector(drive, rq, write);
}

static void ide_pio_datablock(ide_drive_t *drive, struct request *rq,
@@ -362,10 +364,10 @@ static void ide_pio_datablock(ide_drive_t *drive, struct request *rq,
	switch (drive->hwif->data_phase) {
	case TASKFILE_MULTI_IN:
	case TASKFILE_MULTI_OUT:
		ide_pio_multi(drive, write);
		ide_pio_multi(drive, rq, write);
		break;
	default:
		ide_pio_sector(drive, write);
		ide_pio_sector(drive, rq, write);
		break;
	}

Loading