[SeaBIOS] [PATCH 10/17] esp-scsi: Handle ESP drives directly via 'struct disk_op_s' requests
Kevin O'Connor
kevin at koconnor.net
Tue Jul 7 21:26:14 CEST 2015
Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
src/block.c | 2 ++
src/hw/blockcmd.c | 3 ---
src/hw/esp-scsi.c | 30 ++++++++++++------------------
src/hw/esp-scsi.h | 2 +-
4 files changed, 15 insertions(+), 22 deletions(-)
diff --git a/src/block.c b/src/block.c
index 99b768c..b76c6e2 100644
--- a/src/block.c
+++ b/src/block.c
@@ -10,6 +10,7 @@
#include "hw/ata.h" // process_ata_op
#include "hw/ahci.h" // process_ahci_op
#include "hw/blockcmd.h" // cdb_*
+#include "hw/esp-scsi.h" // esp_scsi_process_op
#include "hw/lsi-scsi.h" // lsi_scsi_process_op
#include "hw/pci.h" // pci_bdf_to_bus
#include "hw/rtc.h" // rtc_read
@@ -501,6 +502,7 @@ process_op_both(struct disk_op_s *op)
case DTYPE_LSI_SCSI:
return lsi_scsi_process_op(op);
case DTYPE_ESP_SCSI:
+ return esp_scsi_process_op(op);
case DTYPE_MEGASAS:
return scsi_process_op(op);
default:
diff --git a/src/hw/blockcmd.c b/src/hw/blockcmd.c
index 329515c..8b6c122 100644
--- a/src/hw/blockcmd.c
+++ b/src/hw/blockcmd.c
@@ -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 "esp-scsi.h" // esp_scsi_cmd_data
#include "megasas.h" // megasas_cmd_data
#include "pvscsi.h" // pvscsi_cmd_data
#include "output.h" // dprintf
@@ -24,8 +23,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_ESP_SCSI:
- return esp_scsi_cmd_data(op, cdbcmd, blocksize);
case DTYPE_MEGASAS:
return megasas_cmd_data(op, cdbcmd, blocksize);
case DTYPE_VIRTIO_SCSI:
diff --git a/src/hw/esp-scsi.c b/src/hw/esp-scsi.c
index 33cc449..0266492 100644
--- a/src/hw/esp-scsi.c
+++ b/src/hw/esp-scsi.c
@@ -76,10 +76,19 @@ esp_scsi_dma(u32 iobase, u32 buf, u32 len, int read)
outb(read ? 0x83 : 0x03, iobase + ESP_DMA_CMD);
}
-static int
-esp_scsi_cmd(struct esp_lun_s *llun_gf, struct disk_op_s *op,
- u8 *cdbcmd, u16 target, u16 lun, u16 blocksize)
+int
+esp_scsi_process_op(struct disk_op_s *op)
{
+ if (!CONFIG_ESP_SCSI)
+ return DISK_RET_EBADTRACK;
+ struct esp_lun_s *llun_gf =
+ container_of(op->drive_gf, struct esp_lun_s, drive);
+ u16 target = GET_GLOBALFLAT(llun_gf->target);
+ u16 lun = GET_GLOBALFLAT(llun_gf->lun);
+ u8 cdbcmd[16];
+ int blocksize = scsi_fill_cmd(op, cdbcmd, sizeof(cdbcmd));
+ if (blocksize < 0)
+ return default_process_op(op);
u32 iobase = GET_GLOBALFLAT(llun_gf->iobase);
int i, state;
u8 status;
@@ -144,21 +153,6 @@ esp_scsi_cmd(struct esp_lun_s *llun_gf, struct disk_op_s *op,
return DISK_RET_EBADTRACK;
}
-int
-esp_scsi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize)
-{
- if (!CONFIG_ESP_SCSI)
- return DISK_RET_EBADTRACK;
-
- struct esp_lun_s *llun_gf =
- container_of(op->drive_gf, struct esp_lun_s, drive);
-
- return esp_scsi_cmd(llun_gf, op, cdbcmd,
- GET_GLOBALFLAT(llun_gf->target),
- GET_GLOBALFLAT(llun_gf->lun),
- blocksize);
-}
-
static int
esp_scsi_add_lun(struct pci_device *pci, u32 iobase, u8 target, u8 lun)
{
diff --git a/src/hw/esp-scsi.h b/src/hw/esp-scsi.h
index dc555f3..0616d14 100644
--- a/src/hw/esp-scsi.h
+++ b/src/hw/esp-scsi.h
@@ -2,7 +2,7 @@
#define __ESP_SCSI_H
struct disk_op_s;
-int esp_scsi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize);
+int esp_scsi_process_op(struct disk_op_s *op);
void esp_scsi_setup(void);
#endif /* __ESP_SCSI_H */
--
1.9.3
More information about the SeaBIOS
mailing list