aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ahci.c61
-rw-r--r--src/ata.c58
-rw-r--r--src/ata.h1
-rw-r--r--src/block.c19
-rw-r--r--src/blockcmd.c7
-rw-r--r--src/cdrom.c2
-rw-r--r--src/disk.c6
-rw-r--r--src/disk.h13
8 files changed, 60 insertions, 107 deletions
diff --git a/src/ahci.c b/src/ahci.c
index 1d7dbf8d..4a8eafbc 100644
--- a/src/ahci.c
+++ b/src/ahci.c
@@ -301,49 +301,23 @@ ahci_disk_readwrite(struct disk_op_s *op, int iswrite)
// command demuxer
int process_ahci_op(struct disk_op_s *op)
{
- struct ahci_port_s *port;
- u32 atapi;
-
if (!CONFIG_AHCI)
return 0;
-
- port = container_of(op->drive_g, struct ahci_port_s, drive);
- atapi = GET_GLOBAL(port->atapi);
-
- if (atapi) {
- switch (op->command) {
- case CMD_READ:
- return cdb_read(op);
- case CMD_WRITE:
- case CMD_FORMAT:
- return DISK_RET_EWRITEPROTECT;
- case CMD_RESET:
- /* FIXME: what should we do here? */
- case CMD_VERIFY:
- case CMD_SEEK:
- return DISK_RET_SUCCESS;
- default:
- dprintf(1, "AHCI: unknown cdrom command %d\n", op->command);
- op->count = 0;
- return DISK_RET_EPARAM;
- }
- } else {
- switch (op->command) {
- case CMD_READ:
- return ahci_disk_readwrite(op, 0);
- case CMD_WRITE:
- return ahci_disk_readwrite(op, 1);
- case CMD_RESET:
- /* FIXME: what should we do here? */
- case CMD_FORMAT:
- case CMD_VERIFY:
- case CMD_SEEK:
- return DISK_RET_SUCCESS;
- default:
- dprintf(1, "AHCI: unknown disk command %d\n", op->command);
- op->count = 0;
- return DISK_RET_EPARAM;
- }
+ switch (op->command) {
+ case CMD_READ:
+ return ahci_disk_readwrite(op, 0);
+ case CMD_WRITE:
+ return ahci_disk_readwrite(op, 1);
+ case CMD_FORMAT:
+ case CMD_RESET:
+ case CMD_ISREADY:
+ case CMD_VERIFY:
+ case CMD_SEEK:
+ return DISK_RET_SUCCESS;
+ default:
+ dprintf(1, "AHCI: unknown disk command %d\n", op->command);
+ op->count = 0;
+ return DISK_RET_EPARAM;
}
}
@@ -516,12 +490,12 @@ static int ahci_port_init(struct ahci_port_s *port)
return -1;
}
- port->drive.type = DTYPE_AHCI;
port->drive.cntl_id = pnr;
port->drive.removable = (buffer[0] & 0x80) ? 1 : 0;
if (!port->atapi) {
// found disk (ata)
+ port->drive.type = DTYPE_AHCI;
port->drive.blksize = DISK_SECTOR_SIZE;
port->drive.pchs.cylinders = buffer[1];
port->drive.pchs.heads = buffer[3];
@@ -548,11 +522,12 @@ static int ahci_port_init(struct ahci_port_s *port)
port->prio = bootprio_find_ata_device(ctrl->pci_tmp, pnr, 0);
} else {
// found cdrom (atapi)
+ port->drive.type = DTYPE_AHCI_ATAPI;
port->drive.blksize = CDROM_SECTOR_SIZE;
port->drive.sectors = (u64)-1;
u8 iscd = ((buffer[0] >> 8) & 0x1f) == 0x05;
if (!iscd) {
- dprintf(1, "AHCI/%d: atapi device is'nt a cdrom\n", port->pnr);
+ dprintf(1, "AHCI/%d: atapi device isn't a cdrom\n", port->pnr);
return -1;
}
port->desc = znprintf(MAXDESCSIZE
diff --git a/src/ata.c b/src/ata.c
index 3246acbc..7ff5f86c 100644
--- a/src/ata.c
+++ b/src/ata.c
@@ -141,31 +141,6 @@ isready(struct atadrive_s *adrive_g)
return DISK_RET_ENOTREADY;
}
-// Default 16bit command demuxer for ATA and ATAPI devices.
-static int
-process_ata_misc_op(struct disk_op_s *op)
-{
- if (!CONFIG_ATA)
- return 0;
-
- struct atadrive_s *adrive_g = container_of(
- op->drive_g, struct atadrive_s, drive);
- switch (op->command) {
- case CMD_RESET:
- ata_reset(adrive_g);
- return DISK_RET_SUCCESS;
- case CMD_ISREADY:
- return isready(adrive_g);
- case CMD_FORMAT:
- case CMD_VERIFY:
- case CMD_SEEK:
- return DISK_RET_SUCCESS;
- default:
- op->count = 0;
- return DISK_RET_EPARAM;
- }
-}
-
/****************************************************************
* ATA send command
@@ -580,13 +555,25 @@ process_ata_op(struct disk_op_s *op)
if (!CONFIG_ATA)
return 0;
+ struct atadrive_s *adrive_g = container_of(
+ op->drive_g, struct atadrive_s, drive);
switch (op->command) {
case CMD_READ:
return ata_readwrite(op, 0);
case CMD_WRITE:
return ata_readwrite(op, 1);
+ case CMD_RESET:
+ ata_reset(adrive_g);
+ return DISK_RET_SUCCESS;
+ case CMD_ISREADY:
+ return isready(adrive_g);
+ case CMD_FORMAT:
+ case CMD_VERIFY:
+ case CMD_SEEK:
+ return DISK_RET_SUCCESS;
default:
- return process_ata_misc_op(op);
+ op->count = 0;
+ return DISK_RET_EPARAM;
}
}
@@ -662,23 +649,6 @@ fail:
return DISK_RET_SUCCESS;
}
-// 16bit command demuxer for ATAPI cdroms.
-int
-process_atapi_op(struct disk_op_s *op)
-{
- if (!CONFIG_ATA)
- return 0;
- switch (op->command) {
- case CMD_READ:
- return cdb_read(op);
- case CMD_FORMAT:
- case CMD_WRITE:
- return DISK_RET_EWRITEPROTECT;
- default:
- return process_ata_misc_op(op);
- }
-}
-
/****************************************************************
* ATA detect and init
@@ -762,7 +732,7 @@ init_drive_atapi(struct atadrive_s *dummy, u16 *buffer)
struct atadrive_s *adrive_g = init_atadrive(dummy, buffer);
if (!adrive_g)
return NULL;
- adrive_g->drive.type = DTYPE_ATAPI;
+ adrive_g->drive.type = DTYPE_ATA_ATAPI;
adrive_g->drive.blksize = CDROM_SECTOR_SIZE;
adrive_g->drive.sectors = (u64)-1;
u8 iscd = ((buffer[0] >> 8) & 0x1f) == 0x05;
diff --git a/src/ata.h b/src/ata.h
index cfc61088..1f412335 100644
--- a/src/ata.h
+++ b/src/ata.h
@@ -28,7 +28,6 @@ int cdrom_read(struct disk_op_s *op);
int atapi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize);
void ata_setup(void);
int process_ata_op(struct disk_op_s *op);
-int process_atapi_op(struct disk_op_s *op);
// Global defines -- ATA register and register bits.
// command block & control block regs
diff --git a/src/block.c b/src/block.c
index 2de9c5da..1c200cca 100644
--- a/src/block.c
+++ b/src/block.c
@@ -280,8 +280,6 @@ map_floppy_drive(struct drive_s *drive_g)
static int
process_scsi_op(struct disk_op_s *op)
{
- if (!CONFIG_VIRTIO_SCSI && !CONFIG_USB_MSC && !CONFIG_USB_UAS && !CONFIG_LSI_SCSI)
- return 0;
switch (op->command) {
case CMD_READ:
return cdb_read(op);
@@ -299,6 +297,18 @@ process_scsi_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 process_scsi_op(op);
+ }
+}
+
// Execute a disk_op request.
int
process_op(struct disk_op_s *op)
@@ -310,8 +320,6 @@ process_op(struct disk_op_s *op)
return process_floppy_op(op);
case DTYPE_ATA:
return process_ata_op(op);
- case DTYPE_ATAPI:
- return process_atapi_op(op);
case DTYPE_RAMDISK:
return process_ramdisk_op(op);
case DTYPE_CDEMU:
@@ -320,6 +328,9 @@ process_op(struct disk_op_s *op)
return process_virtio_blk_op(op);
case DTYPE_AHCI:
return process_ahci_op(op);
+ case DTYPE_ATA_ATAPI:
+ case DTYPE_AHCI_ATAPI:
+ return process_atapi_op(op);
case DTYPE_USB:
case DTYPE_UAS:
case DTYPE_VIRTIO_SCSI:
diff --git a/src/blockcmd.c b/src/blockcmd.c
index 0d0acfd6..95406c65 100644
--- a/src/blockcmd.c
+++ b/src/blockcmd.c
@@ -23,13 +23,13 @@ cdb_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize)
{
u8 type = GET_GLOBAL(op->drive_g->type);
switch (type) {
- case DTYPE_ATAPI:
+ case DTYPE_ATA_ATAPI:
return atapi_cmd_data(op, cdbcmd, blocksize);
case DTYPE_USB:
return usb_cmd_data(op, cdbcmd, blocksize);
case DTYPE_UAS:
return uas_cmd_data(op, cdbcmd, blocksize);
- case DTYPE_AHCI:
+ case DTYPE_AHCI_ATAPI:
return ahci_cmd_data(op, cdbcmd, blocksize);
case DTYPE_VIRTIO_SCSI:
return virtio_scsi_cmd_data(op, cdbcmd, blocksize);
@@ -96,9 +96,6 @@ scsi_is_ready(struct disk_op_s *op)
int
scsi_init_drive(struct drive_s *drive, const char *s, int prio)
{
- if (!CONFIG_USB_UAS && !CONFIG_USB_MSC && !CONFIG_VIRTIO_SCSI && !CONFIG_LSI_SCSI)
- return 0;
-
struct disk_op_s dop;
memset(&dop, 0, sizeof(dop));
dop.drive_g = drive;
diff --git a/src/cdrom.c b/src/cdrom.c
index 6e0055dd..42d8e081 100644
--- a/src/cdrom.c
+++ b/src/cdrom.c
@@ -201,7 +201,7 @@ cdrom_boot(struct drive_s *drive_g)
dprintf(1, "scsi_is_ready returned %d\n", ret);
// Read the Boot Record Volume Descriptor
- u8 buffer[2048];
+ u8 buffer[CDROM_SECTOR_SIZE];
dop.lba = 0x11;
dop.count = 1;
dop.buf_fl = buffer;
diff --git a/src/disk.c b/src/disk.c
index 8eff4647..8e1d3ec5 100644
--- a/src/disk.c
+++ b/src/disk.c
@@ -530,7 +530,7 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g)
, size, type, npc, nph, npspt, (u32)lba, blksize);
SET_FARVAR(seg, param_far->size, 26);
- if (type == DTYPE_ATAPI) {
+ if (type == DTYPE_ATA_ATAPI) {
// 0x74 = removable, media change, lockable, max values
SET_FARVAR(seg, param_far->infos, 0x74);
SET_FARVAR(seg, param_far->cylinders, 0xffffffff);
@@ -552,7 +552,7 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g)
SET_FARVAR(seg, param_far->blksize, blksize);
if (size < 30 ||
- (type != DTYPE_ATA && type != DTYPE_ATAPI &&
+ (type != DTYPE_ATA && type != DTYPE_ATA_ATAPI &&
type != DTYPE_VIRTIO_BLK && type != DTYPE_VIRTIO_SCSI)) {
disk_ret(regs, DISK_RET_SUCCESS);
return;
@@ -565,7 +565,7 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g)
u64 device_path = 0;
u8 channel = 0;
SET_FARVAR(seg, param_far->size, 30);
- if (type == DTYPE_ATA || type == DTYPE_ATAPI) {
+ if (type == DTYPE_ATA || type == DTYPE_ATA_ATAPI) {
SET_FARVAR(seg, param_far->dpte, SEGOFF(SEG_LOW, (u32)&DefaultDPTE));
// Fill in dpte
diff --git a/src/disk.h b/src/disk.h
index 6810cd7e..2b2511f9 100644
--- a/src/disk.h
+++ b/src/disk.h
@@ -224,15 +224,16 @@ struct drive_s {
#define DTYPE_NONE 0x00
#define DTYPE_FLOPPY 0x01
#define DTYPE_ATA 0x02
-#define DTYPE_ATAPI 0x03
+#define DTYPE_ATA_ATAPI 0x03
#define DTYPE_RAMDISK 0x04
#define DTYPE_CDEMU 0x05
#define DTYPE_AHCI 0x06
-#define DTYPE_VIRTIO_SCSI 0x07
-#define DTYPE_VIRTIO_BLK 0x08
-#define DTYPE_USB 0x09
-#define DTYPE_UAS 0x0a
-#define DTYPE_LSI_SCSI 0x0b
+#define DTYPE_AHCI_ATAPI 0x07
+#define DTYPE_VIRTIO_SCSI 0x08
+#define DTYPE_VIRTIO_BLK 0x09
+#define DTYPE_USB 0x0a
+#define DTYPE_UAS 0x0b
+#define DTYPE_LSI_SCSI 0x0c
#define MAXDESCSIZE 80