SCSI: Respond to unit serial number inquiry

This commit is contained in:
Kimmo Lindholm 2017-10-12 00:04:41 +03:00
parent f392dfa223
commit 39487df4de
4 changed files with 44 additions and 3 deletions

View File

@ -172,7 +172,8 @@ extern "C" {
void msdObjectInit(USBMassStorageDriver *msdp); void msdObjectInit(USBMassStorageDriver *msdp);
void msdStart(USBMassStorageDriver *msdp, USBDriver *usbp, void msdStart(USBMassStorageDriver *msdp, USBDriver *usbp,
BaseBlockDevice *blkdev, uint8_t *blkbuf, BaseBlockDevice *blkdev, uint8_t *blkbuf,
const scsi_inquiry_response_t *scsi_inquiry_response); const scsi_inquiry_response_t *scsi_inquiry_response,
const scsi_unit_serial_number_inquiry_response_t *serialInquiry);
void msdStop(USBMassStorageDriver *msdp); void msdStop(USBMassStorageDriver *msdp);
bool msd_request_hook(USBDriver *usbp); bool msd_request_hook(USBDriver *usbp);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -84,6 +84,19 @@ static const scsi_inquiry_response_t default_scsi_inquiry_response = {
{'v',CH_KERNEL_MAJOR+'0','.',CH_KERNEL_MINOR+'0'} {'v',CH_KERNEL_MAJOR+'0','.',CH_KERNEL_MINOR+'0'}
}; };
/**
* @brief Hardcoded default SCSI unit serial number inquiry response structure.
*/
static const scsi_unit_serial_number_inquiry_response_t default_scsi_unit_serial_number_inquiry_response =
{
0x00,
0x80,
0x00,
0x08,
"00000000"
};
/*===========================================================================*/ /*===========================================================================*/
/* Driver local functions. */ /* Driver local functions. */
/*===========================================================================*/ /*===========================================================================*/
@ -373,7 +386,8 @@ void msdStop(USBMassStorageDriver *msdp) {
*/ */
void msdStart(USBMassStorageDriver *msdp, USBDriver *usbp, void msdStart(USBMassStorageDriver *msdp, USBDriver *usbp,
BaseBlockDevice *blkdev, uint8_t *blkbuf, BaseBlockDevice *blkdev, uint8_t *blkbuf,
const scsi_inquiry_response_t *inquiry) { const scsi_inquiry_response_t *inquiry,
const scsi_unit_serial_number_inquiry_response_t *serialInquiry) {
osalDbgCheck((msdp != NULL) && (usbp != NULL) osalDbgCheck((msdp != NULL) && (usbp != NULL)
&& (blkdev != NULL) && (blkbuf != NULL)); && (blkdev != NULL) && (blkbuf != NULL));
@ -393,6 +407,12 @@ void msdStart(USBMassStorageDriver *msdp, USBDriver *usbp,
else { else {
msdp->scsi_config.inquiry_response = inquiry; msdp->scsi_config.inquiry_response = inquiry;
} }
if (NULL == serialInquiry) {
msdp->scsi_config.unit_serial_number_inquiry_response = &default_scsi_unit_serial_number_inquiry_response;
}
else {
msdp->scsi_config.unit_serial_number_inquiry_response = serialInquiry;
}
msdp->scsi_config.blkbuf = blkbuf; msdp->scsi_config.blkbuf = blkbuf;
msdp->scsi_config.blkdev = blkdev; msdp->scsi_config.blkdev = blkdev;
msdp->scsi_config.transport = &msdp->scsi_transport; msdp->scsi_config.transport = &msdp->scsi_transport;

View File

@ -175,7 +175,12 @@ static bool cmd_ignored(SCSITarget *scsip, const uint8_t *cmd) {
*/ */
static bool inquiry(SCSITarget *scsip, const uint8_t *cmd) { static bool inquiry(SCSITarget *scsip, const uint8_t *cmd) {
if ((cmd[1] & 0b11) || cmd[2] != 0) { if ((cmd[1] & 0b1) && cmd[2] == 0x80) {
/* Unit serial number page */
return transmit_data(scsip, (const uint8_t *)scsip->config->unit_serial_number_inquiry_response,
sizeof(scsi_unit_serial_number_inquiry_response_t));
}
else if ((cmd[1] & 0b11) || cmd[2] != 0) {
set_sense(scsip, SCSI_SENSE_KEY_ILLEGAL_REQUEST, set_sense(scsip, SCSI_SENSE_KEY_ILLEGAL_REQUEST,
SCSI_ASENSE_INVALID_FIELD_IN_CDB, SCSI_ASENSE_INVALID_FIELD_IN_CDB,
SCSI_ASENSEQ_NO_QUALIFIER); SCSI_ASENSEQ_NO_QUALIFIER);

View File

@ -132,6 +132,17 @@ typedef struct PACKED_VAR {
uint8_t productRev[4]; uint8_t productRev[4];
} scsi_inquiry_response_t; } scsi_inquiry_response_t;
/**
* @brief Represents SCSI unit serial number inquiry response structure.
* @details See SCSI specification.
*/
typedef struct PACKED_VAR {
uint8_t peripheral;
uint8_t page_code;
uint8_t reserved;
uint8_t page_length;
uint8_t serianNumber[8];
} scsi_unit_serial_number_inquiry_response_t;
/** /**
* @brief Represents SCSI mode sense (6) request structure. * @brief Represents SCSI mode sense (6) request structure.
* @details See SCSI specification. * @details See SCSI specification.
@ -225,6 +236,10 @@ typedef struct {
* @brief Pointer to SCSI inquiry response object. * @brief Pointer to SCSI inquiry response object.
*/ */
const scsi_inquiry_response_t *inquiry_response; const scsi_inquiry_response_t *inquiry_response;
/**
* @brief Pointer to SCSI unit serial number inquiry response object.
*/
const scsi_unit_serial_number_inquiry_response_t *unit_serial_number_inquiry_response;
} SCSITargetConfig; } SCSITargetConfig;
/** /**