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

Commit 7a00798b authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

ide: add support for arbitrary transfer lengths to ide_pio_bytes()



Add support for arbitrary transfer lengths to ide_pio_bytes()
and then inline ide_pio_multi() into ide_pio_datablock().

There should be no functional changes caused by this patch.

Cc: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 2eba0827
Loading
Loading
Loading
Loading
+37 −36
Original line number Diff line number Diff line
@@ -189,7 +189,7 @@ static u8 wait_drive_not_busy(ide_drive_t *drive)
}

static void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd,
			  unsigned int write, unsigned int nr_bytes)
			  unsigned int write, unsigned int len)
{
	ide_hwif_t *hwif = drive->hwif;
	struct scatterlist *sg = hwif->sg_table;
@@ -202,10 +202,14 @@ static void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd,
	u8 *buf;

	cursg = cmd->cursg;
	if (!cursg) {
		cursg = sg;
		cmd->cursg = sg;
	}
	if (cursg == NULL)
		cursg = cmd->cursg = sg;

	while (len) {
		unsigned nr_bytes = min(len, cursg->length - cmd->cursg_ofs);

		if (nr_bytes > PAGE_SIZE)
			nr_bytes = PAGE_SIZE;

		page = sg_page(cursg);
		offset = cursg->offset + cmd->cursg_ofs;
@@ -223,7 +227,7 @@ static void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd,
		cmd->cursg_ofs += nr_bytes;

		if (cmd->cursg_ofs == cursg->length) {
		cmd->cursg = sg_next(cmd->cursg);
			cursg = cmd->cursg = sg_next(cmd->cursg);
			cmd->cursg_ofs = 0;
		}

@@ -237,21 +241,16 @@ static void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd,
#ifdef CONFIG_HIGHMEM
		local_irq_restore(flags);
#endif
}

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

	nsect = min_t(unsigned int, cmd->nleft >> 9, drive->mult_count);
	while (nsect--)
		ide_pio_bytes(drive, cmd, write, SECTOR_SIZE);
		len -= nr_bytes;
	}
}

static void ide_pio_datablock(ide_drive_t *drive, struct ide_cmd *cmd,
			      unsigned int write)
{
	unsigned int nr_bytes;

	u8 saved_io_32bit = drive->io_32bit;

	if (cmd->tf_flags & IDE_TFLAG_FS)
@@ -263,9 +262,11 @@ static void ide_pio_datablock(ide_drive_t *drive, struct ide_cmd *cmd,
	touch_softlockup_watchdog();

	if (cmd->tf_flags & IDE_TFLAG_MULTI_PIO)
		ide_pio_multi(drive, cmd, write);
		nr_bytes = min_t(unsigned, cmd->nleft, drive->mult_count << 9);
	else
		ide_pio_bytes(drive, cmd, write, SECTOR_SIZE);
		nr_bytes = SECTOR_SIZE;

	ide_pio_bytes(drive, cmd, write, nr_bytes);

	drive->io_32bit = saved_io_32bit;
}