]> xenbits.xensource.com Git - seabios.git/commitdiff
pvscsi: Handle pvscsi drives directly via 'struct disk_op_s' requests
authorKevin O'Connor <kevin@koconnor.net>
Tue, 7 Jul 2015 16:35:34 +0000 (12:35 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Tue, 14 Jul 2015 18:40:08 +0000 (14:40 -0400)
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
src/block.c
src/hw/blockcmd.c
src/hw/pvscsi.c
src/hw/pvscsi.h

index 422e2a29de6424fd70d1f094f2132488f77262c0..8e5bdad5a72f4af0c8ace2d45546b90437a69540 100644 (file)
@@ -14,6 +14,7 @@
 #include "hw/lsi-scsi.h" // lsi_scsi_process_op
 #include "hw/megasas.h" // megasas_process_op
 #include "hw/pci.h" // pci_bdf_to_bus
+#include "hw/pvscsi.h" // pvscsi_process_op
 #include "hw/rtc.h" // rtc_read
 #include "hw/usb-msc.h" // usb_process_op
 #include "hw/usb-uas.h" // uas_process_op
@@ -538,7 +539,7 @@ process_op_32(struct disk_op_s *op)
     case DTYPE_VIRTIO_SCSI:
         return virtio_scsi_process_op(op);
     case DTYPE_PVSCSI:
-        return scsi_process_op(op);
+        return pvscsi_process_op(op);
     default:
         return process_op_both(op);
     }
index 684f42068df0fb4a843915e7f287092c963fabf1..4b4798b41c85f3afb0aaadd78b87912bf12f5082 100644 (file)
@@ -9,7 +9,6 @@
 #include "block.h" // struct disk_op_s
 #include "blockcmd.h" // struct cdb_request_sense
 #include "byteorder.h" // be32_to_cpu
-#include "pvscsi.h" // pvscsi_cmd_data
 #include "output.h" // dprintf
 #include "std/disk.h" // DISK_RET_EPARAM
 #include "string.h" // memset
@@ -21,9 +20,6 @@ cdb_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize)
 {
     u8 type = GET_GLOBALFLAT(op->drive_gf->type);
     switch (type) {
-    case DTYPE_PVSCSI:
-        if (!MODESEGMENT)
-            return pvscsi_cmd_data(op, cdbcmd, blocksize);
     default:
         return DISK_RET_EPARAM;
     }
index 67d1d94ff494e9d61c1a5334959f0692bb8a2c14..4e98b5d56a4a95243e490de2c90893d5c4331e1e 100644 (file)
@@ -206,10 +206,13 @@ pvscsi_get_rsp(struct PVSCSIRingsState *s,
     return status;
 }
 
-static int
-pvscsi_cmd(struct pvscsi_lun_s *plun, struct disk_op_s *op,
-           void *cdbcmd, u16 target, u16 lun, u16 blocksize)
+int
+pvscsi_process_op(struct disk_op_s *op)
 {
+    if (!CONFIG_PVSCSI)
+        return DISK_RET_EBADTRACK;
+    struct pvscsi_lun_s *plun =
+        container_of(op->drive_gf, struct pvscsi_lun_s, drive);
     struct pvscsi_ring_dsc_s *ring_dsc = plun->ring_dsc;
     struct PVSCSIRingsState *s = ring_dsc->ring_state;
     u32 req_entries = s->reqNumEntriesLog2;
@@ -225,17 +228,19 @@ pvscsi_cmd(struct pvscsi_lun_s *plun, struct disk_op_s *op,
     }
 
     req = ring_dsc->ring_reqs + (s->reqProdIdx & MASK(req_entries));
+    int blocksize = scsi_fill_cmd(op, req->cdb, 16);
+    if (blocksize < 0)
+        return default_process_op(op);
     req->bus = 0;
-    req->target = target;
+    req->target = plun->target;
     memset(req->lun, 0, sizeof(req->lun));
-    req->lun[1] = lun;
+    req->lun[1] = plun->lun;
     req->senseLen = 0;
     req->senseAddr = 0;
     req->cdbLen = 16;
     req->vcpuHint = 0;
-    memcpy(req->cdb, cdbcmd, 16);
     req->tag = SIMPLE_QUEUE_TAG;
-    req->flags = cdb_is_read(cdbcmd, blocksize) ?
+    req->flags = cdb_is_read(req->cdb, blocksize) ?
         PVSCSI_FLAG_CMD_DIR_TOHOST : PVSCSI_FLAG_CMD_DIR_TODEVICE;
     req->dataLen = op->count * blocksize;
     req->dataAddr = (u32)op->buf_fl;
@@ -250,18 +255,6 @@ pvscsi_cmd(struct pvscsi_lun_s *plun, struct disk_op_s *op,
     return status == 0 ? DISK_RET_SUCCESS : DISK_RET_EBADTRACK;
 }
 
-int
-pvscsi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize)
-{
-    if (!CONFIG_PVSCSI)
-        return DISK_RET_EBADTRACK;
-
-    struct pvscsi_lun_s *plun =
-        container_of(op->drive_gf, struct pvscsi_lun_s, drive);
-
-    return pvscsi_cmd(plun, op, cdbcmd, plun->target, plun->lun, blocksize);
-}
-
 static int
 pvscsi_add_lun(struct pci_device *pci, void *iobase,
                struct pvscsi_ring_dsc_s *ring_dsc, u8 target, u8 lun)
index fde9f0b989db725e7fb281f1f8b6eab5b9aeb336..5af7dcb0e1dceb6656ec342d7e80c30ec0b9eb6e 100644 (file)
@@ -2,7 +2,7 @@
 #define _PVSCSI_H_
 
 struct disk_op_s;
-int pvscsi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize);
+int pvscsi_process_op(struct disk_op_s *op);
 void pvscsi_setup(void);
 
 #endif /* _PVSCSI_H_ */