AHCI: Begin adding SCSI VPD query support.

This commit is contained in:
Alexander von Gluck IV
2015-09-01 17:13:04 -05:00
parent 38e3fbe389
commit 0cd624b89c
@@ -31,6 +31,8 @@
#else #else
# define TRACE(a...) # define TRACE(a...)
#endif #endif
#define ERROR(a...) dprintf("ahci: " a)
//#define FLOW(a...) dprintf("ahci: " a) //#define FLOW(a...) dprintf("ahci: " a)
//#define RWTRACE(a...) dprintf("ahci: " a) //#define RWTRACE(a...) dprintf("ahci: " a)
#define FLOW(a...) #define FLOW(a...)
@@ -566,9 +568,18 @@ AHCIPort::ScsiInquiry(scsi_ccb* request)
ASSERT(sizeof(ataData) == 512); ASSERT(sizeof(ataData) == 512);
if (cmd->evpd || cmd->page_code if (cmd->evpd)
|| request->data_length < sizeof(scsiData)) { TRACE("VPD inquiry page %d\n", cmd->page_code);
TRACE("invalid request\n"); else if (cmd->page_code) {
// page_code without evpd is invalid per SCSI spec
ERROR("page code %d on non-VPD request\n", cmd->page_code);
request->subsys_status = SCSI_REQ_ABORTED;
request->device_status = SCSI_STATUS_CHECK_CONDITION;
// TODO: Sense ILLEGAL REQUEST + INVALID FIELD IN CDB?
gSCSI->finished(request, 1);
return;
} else if (request->data_length < sizeof(scsiData)) {
ERROR("invalid request\n");
request->subsys_status = SCSI_REQ_ABORTED; request->subsys_status = SCSI_REQ_ABORTED;
gSCSI->finished(request, 1); gSCSI->finished(request, 1);
return; return;
@@ -582,7 +593,7 @@ AHCIPort::ScsiInquiry(scsi_ccb* request)
sreq.WaitForCompletion(); sreq.WaitForCompletion();
if ((sreq.CompletionStatus() & ATA_ERR) != 0) { if ((sreq.CompletionStatus() & ATA_ERR) != 0) {
TRACE("identify device failed\n"); ERROR("identify device failed\n");
request->subsys_status = SCSI_REQ_CMP_ERR; request->subsys_status = SCSI_REQ_CMP_ERR;
gSCSI->finished(request, 1); gSCSI->finished(request, 1);
return; return;
@@ -639,6 +650,31 @@ AHCIPort::ScsiInquiry(scsi_ccb* request)
} }
} }
if (cmd->evpd) {
switch (cmd->page_code) {
case SCSI_PAGE_SUPPORTED_VPD:
case SCSI_PAGE_USN:
case SCSI_PAGE_BLOCK_LIMITS:
//max_unmap_lba_count
// = ataData.max_data_set_management_lba_range_blocks;
//max_unmap_blk_count =
// = ataData.max_data_set_management_lba_range_blocks;
case SCSI_PAGE_BLOCK_DEVICE_CHARS:
case SCSI_PAGE_LB_PROVISIONING:
case SCSI_PAGE_REFERRALS:
ERROR("VPD AHCI page %d not yet implemented!\n",
cmd->page_code);
//request->subsys_status = SCSI_REQ_CMP;
request->subsys_status = SCSI_REQ_ABORTED;
gSCSI->finished(request, 1);
return;
}
ERROR("unknown VPD page code!\n");
request->subsys_status = SCSI_REQ_ABORTED;
gSCSI->finished(request, 1);
return;
}
#if 0 #if 0
if (fSectorCount < 0x0fffffff) { if (fSectorCount < 0x0fffffff) {
TRACE("disabling 48 bit commands\n"); TRACE("disabling 48 bit commands\n");