ahci: Handle AHCI ATAPI drives directly via 'struct disk_op_s' requests

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
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 @@
     }
 }
 
-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 @@
     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..726fe25 100644
--- a/src/hw/ahci.c
+++ b/src/hw/ahci.c
@@ -213,7 +213,7 @@
 
 #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,14 @@
     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 @@
 
 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 @@
     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;
     }