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

Commit 3e52fb4d authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

ide-scsi: merge idescsi_input_buffers() and idescsi_output_buffers()



* Merge idescsi_input_buffers() and idescsi_output_buffers()
  into ide_scsi_io_buffers() helper.

While at it:

* Log device name instead of driver name on error.

* Use xfer_func_t.

Cc: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 6c60bd8e
Loading
Loading
Loading
Loading
+24 −57
Original line number Diff line number Diff line
@@ -129,51 +129,15 @@ static inline idescsi_scsi_t *drive_to_idescsi(ide_drive_t *ide_drive)
#define IDESCSI_PC_RQ			90

/*
 *	PIO data transfer routines using the scatter gather table.
 *	PIO data transfer routine using the scatter gather table.
 */
static void idescsi_input_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
		unsigned int bcount)
static void ide_scsi_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
				unsigned int bcount, int write)
{
	ide_hwif_t *hwif = drive->hwif;
	int count;
	xfer_func_t *xf = write ? hwif->output_data : hwif->input_data;
	char *buf;

	while (bcount) {
		count = min(pc->sg->length - pc->b_count, bcount);
		if (PageHighMem(sg_page(pc->sg))) {
			unsigned long flags;

			local_irq_save(flags);
			buf = kmap_atomic(sg_page(pc->sg), KM_IRQ0) +
					pc->sg->offset;
			hwif->input_data(drive, NULL, buf + pc->b_count, count);
			kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
			local_irq_restore(flags);
		} else {
			buf = sg_virt(pc->sg);
			hwif->input_data(drive, NULL, buf + pc->b_count, count);
		}
		bcount -= count; pc->b_count += count;
		if (pc->b_count == pc->sg->length) {
			if (!--pc->sg_cnt)
				break;
			pc->sg = sg_next(pc->sg);
			pc->b_count = 0;
		}
	}

	if (bcount) {
		printk (KERN_ERR "ide-scsi: scatter gather table too small, discarding data\n");
		ide_pad_transfer(drive, 0, bcount);
	}
}

static void idescsi_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
		unsigned int bcount)
{
	ide_hwif_t *hwif = drive->hwif;
	int count;
	char *buf;

	while (bcount) {
		count = min(pc->sg->length - pc->b_count, bcount);
@@ -183,12 +147,12 @@ static void idescsi_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
			local_irq_save(flags);
			buf = kmap_atomic(sg_page(pc->sg), KM_IRQ0) +
					  pc->sg->offset;
			hwif->output_data(drive, NULL, buf + pc->b_count, count);
			xf(drive, NULL, buf + pc->b_count, count);
			kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
			local_irq_restore(flags);
		} else {
			buf = sg_virt(pc->sg);
			hwif->output_data(drive, NULL, buf + pc->b_count, count);
			xf(drive, NULL, buf + pc->b_count, count);
		}
		bcount -= count; pc->b_count += count;
		if (pc->b_count == pc->sg->length) {
@@ -200,8 +164,10 @@ static void idescsi_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
	}

	if (bcount) {
		printk (KERN_ERR "ide-scsi: scatter gather table too small, padding with zeros\n");
		ide_pad_transfer(drive, 1, bcount);
		printk(KERN_ERR "%s: scatter gather table too small, %s\n",
				drive->name, write ? "padding with zeros"
						   : "discarding data");
		ide_pad_transfer(drive, write, bcount);
	}
}

@@ -370,6 +336,7 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
	ide_hwif_t *hwif = drive->hwif;
	struct ide_atapi_pc *pc = scsi->pc;
	struct request *rq = pc->rq;
	xfer_func_t *xferfunc;
	unsigned int temp;
	u16 bcount;
	u8 stat, ireason;
@@ -445,8 +412,8 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
				temp = pc->buf_size - pc->xferred;
				if (temp) {
					if (pc->sg)
						idescsi_input_buffers(drive, pc,
									temp);
						ide_scsi_io_buffers(drive, pc,
								    temp, 0);
					else
						hwif->input_data(drive, NULL,
							pc->cur_pos, temp);
@@ -464,16 +431,16 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
			printk (KERN_NOTICE "ide-scsi: The scsi wants to send us more data than expected - allowing transfer\n");
#endif /* IDESCSI_DEBUG_LOG */
		}
		xferfunc = hwif->input_data;
	} else
		xferfunc = hwif->output_data;

	if (pc->sg)
			idescsi_input_buffers(drive, pc, bcount);
		else
			hwif->input_data(drive, NULL, pc->cur_pos, bcount);
	} else {
		if (pc->sg)
			idescsi_output_buffers(drive, pc, bcount);
		ide_scsi_io_buffers(drive, pc, bcount,
				    !!(pc->flags & PC_FLAG_WRITING));
	else
			hwif->output_data(drive, NULL, pc->cur_pos, bcount);
	}
		xferfunc(drive, NULL, pc->cur_pos, bcount);

	/* Update the current position */
	pc->xferred += bcount;
	pc->cur_pos += bcount;