]> xenbits.xensource.com Git - seabios.git/commitdiff
blockcmd: Introduce scsi_fill_cmd()
authorKevin O'Connor <kevin@koconnor.net>
Tue, 7 Jul 2015 14:53:12 +0000 (10:53 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Tue, 14 Jul 2015 18:40:08 +0000 (14:40 -0400)
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 <kevin@koconnor.net>
src/hw/blockcmd.c
src/hw/blockcmd.h

index 99ebabcd4a798f8de20c7c80e2367bf612eeb1bd..004c58f5aa259a2f36f3da9e59962d6ff2b6b8c6 100644 (file)
@@ -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)
 {
index df12a6d424be4acc109e4652bc3fc5fd76e93784..9077e82f61e31439296aa05c6be4a7e8beec3bff 100644 (file)
@@ -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;