From: Kevin O'Connor Date: Tue, 7 Jul 2015 14:53:12 +0000 (-0400) Subject: blockcmd: Introduce scsi_fill_cmd() X-Git-Tag: rel-1.9.0~105 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=fb251636765740122e61f9d6a066d6dafbba82d4;p=seabios.git blockcmd: Introduce scsi_fill_cmd() Introduce scsi_fill_cmd() which creates a scsi style "command data block" from a "struct disk_op_s" disk request. Signed-off-by: Kevin O'Connor --- diff --git a/src/hw/blockcmd.c b/src/hw/blockcmd.c index 99ebabc..004c58f 100644 --- a/src/hw/blockcmd.c +++ b/src/hw/blockcmd.c @@ -152,50 +152,43 @@ cdb_mode_sense_geom(struct disk_op_s *op, struct cdbres_mode_sense_geom *data) return process_op(op); } -// Read sectors. -static int -cdb_read(struct disk_op_s *op) -{ - struct cdb_rwdata_10 cmd; - memset(&cmd, 0, sizeof(cmd)); - cmd.command = CDB_CMD_READ_10; - cmd.lba = cpu_to_be32(op->lba); - cmd.count = cpu_to_be16(op->count); - return cdb_cmd_data(op, &cmd, GET_GLOBALFLAT(op->drive_gf->blksize)); -} - -// Write sectors. -static int -cdb_write(struct disk_op_s *op) -{ - struct cdb_rwdata_10 cmd; - memset(&cmd, 0, sizeof(cmd)); - cmd.command = CDB_CMD_WRITE_10; - cmd.lba = cpu_to_be32(op->lba); - cmd.count = cpu_to_be16(op->count); - return cdb_cmd_data(op, &cmd, GET_GLOBALFLAT(op->drive_gf->blksize)); -} - /**************************************************************** * Main SCSI commands ****************************************************************/ +// Create a scsi command request from a disk_op_s request int -scsi_process_op(struct disk_op_s *op) +scsi_fill_cmd(struct disk_op_s *op, void *cdbcmd, int maxcdb) { switch (op->command) { case CMD_READ: - return cdb_read(op); - case CMD_WRITE: - return cdb_write(op); + case CMD_WRITE: ; + struct cdb_rwdata_10 *cmd = cdbcmd; + memset(cmd, 0, maxcdb); + cmd->command = (op->command == CMD_READ ? CDB_CMD_READ_10 + : CDB_CMD_WRITE_10); + cmd->lba = cpu_to_be32(op->lba); + cmd->count = cpu_to_be16(op->count); + return GET_GLOBALFLAT(op->drive_gf->blksize); case CMD_SCSI: - return cdb_cmd_data(op, op->cdbcmd, op->blocksize); + memcpy(cdbcmd, op->cdbcmd, maxcdb); + return op->blocksize; default: - return default_process_op(op); + return -1; } } +int +scsi_process_op(struct disk_op_s *op) +{ + char cdbcmd[16]; + int blocksize = scsi_fill_cmd(op, cdbcmd, sizeof(cdbcmd)); + if (blocksize < 0) + return default_process_op(op); + return cdb_cmd_data(op, cdbcmd, blocksize); +} + int scsi_is_ready(struct disk_op_s *op) { diff --git a/src/hw/blockcmd.h b/src/hw/blockcmd.h index df12a6d..9077e82 100644 --- a/src/hw/blockcmd.h +++ b/src/hw/blockcmd.h @@ -102,6 +102,7 @@ struct cdbres_mode_sense_geom { // blockcmd.c int cdb_is_read(u8 *cdbcmd, u16 blocksize); struct disk_op_s; +int scsi_fill_cmd(struct disk_op_s *op, void *cdbcmd, int maxcdb); int scsi_process_op(struct disk_op_s *op); int scsi_is_ready(struct disk_op_s *op); struct drive_s;