Signed-off-by: Kevin O'Connor kevin@koconnor.net --- src/block.c | 14 +------------- src/hw/ahci.c | 16 ++++++++-------- src/hw/ahci.h | 2 +- src/hw/blockcmd.c | 4 ---- 4 files changed, 10 insertions(+), 26 deletions(-)
diff --git a/src/block.c b/src/block.c index 8bd9398..5f238c7 100644 --- a/src/block.c +++ b/src/block.c @@ -484,18 +484,6 @@ default_process_op(struct disk_op_s *op) } }
-static int -process_atapi_op(struct disk_op_s *op) -{ - switch (op->command) { - case CMD_WRITE: - case CMD_FORMAT: - return DISK_RET_EWRITEPROTECT; - default: - return scsi_process_op(op); - } -} - // Command dispatch for disk drivers that run in both 16bit and 32bit mode static int process_op_both(struct disk_op_s *op) @@ -530,7 +518,7 @@ process_op_32(struct disk_op_s *op) case DTYPE_AHCI: return process_ahci_op(op); case DTYPE_AHCI_ATAPI: - return process_atapi_op(op); + return ahci_atapi_process_op(op); case DTYPE_SDCARD: return process_sdcard_op(op); case DTYPE_USB_32: diff --git a/src/hw/ahci.c b/src/hw/ahci.c index ad813ce..72ba230 100644 --- a/src/hw/ahci.c +++ b/src/hw/ahci.c @@ -213,7 +213,7 @@ static int ahci_command(struct ahci_port_s *port_gf, int iswrite, int isatapi,
#define CDROM_CDB_SIZE 12
-int ahci_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) +int ahci_atapi_process_op(struct disk_op_s *op) { if (! CONFIG_AHCI) return 0; @@ -221,15 +221,15 @@ int ahci_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) struct ahci_port_s *port_gf = container_of( op->drive_gf, struct ahci_port_s, drive); struct ahci_cmd_s *cmd = port_gf->cmd; - u8 *atapi = cdbcmd; - int i, rc;
+ if (op->command == CMD_WRITE || op->command == CMD_FORMAT) + return DISK_RET_EWRITEPROTECT; + int blocksize = scsi_fill_cmd(op, cmd->atapi, CDROM_CDB_SIZE); + if (blocksize < 0) + return default_process_op(op); sata_prep_atapi(&cmd->fis, blocksize); - for (i = 0; i < CDROM_CDB_SIZE; i++) { - cmd->atapi[i] = atapi[i]; - } - rc = ahci_command(port_gf, 0, 1, op->buf_fl, - op->count * blocksize); + int rc = ahci_command(port_gf, 0, 1, op->buf_fl, + op->count * blocksize); if (rc < 0) return DISK_RET_EBADTRACK; return DISK_RET_SUCCESS; diff --git a/src/hw/ahci.h b/src/hw/ahci.h index c8c755a..16ad6a9 100644 --- a/src/hw/ahci.h +++ b/src/hw/ahci.h @@ -84,7 +84,7 @@ struct ahci_port_s {
void ahci_setup(void); int process_ahci_op(struct disk_op_s *op); -int ahci_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize); +int ahci_atapi_process_op(struct disk_op_s *op);
#define AHCI_IRQ_ON_SG (1 << 31) #define AHCI_CMD_ATAPI (1 << 5) diff --git a/src/hw/blockcmd.c b/src/hw/blockcmd.c index d227d17..20bd59e 100644 --- a/src/hw/blockcmd.c +++ b/src/hw/blockcmd.c @@ -5,7 +5,6 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "ahci.h" // atapi_cmd_data #include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // struct disk_op_s #include "blockcmd.h" // struct cdb_request_sense @@ -50,9 +49,6 @@ cdb_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) case DTYPE_PVSCSI: if (!MODESEGMENT) return pvscsi_cmd_data(op, cdbcmd, blocksize); - case DTYPE_AHCI_ATAPI: - if (!MODESEGMENT) - return ahci_cmd_data(op, cdbcmd, blocksize); default: return DISK_RET_EPARAM; }