qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] scsi-bus: Add support for SCSI scanners


From: Paolo Bonzini
Subject: Re: [Qemu-devel] scsi-bus: Add support for SCSI scanners
Date: Tue, 28 Jun 2016 19:14:55 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1

> +    case INQUIRY:

This is wrong, because INQUIRY's byte 3 is defined to be part of the
length in modern SCSI standards.  Perhaps you can move it to
scsi_req_scanner_length if really necessary?

>      case MODE_SENSE:
> +    case MODE_SELECT:
> +    case REQUEST_SENSE:
> +        cmd->xfer = buf[4];
> +        break;

This is unnecessary, because scsi_cdb_xfer should get it right (the
commands are respectively 15h for MODE SELECT and 03h for REQUEST SENSE;
the existing entry for MODE SENSE is also unnecessary).

> +    case MODE_SENSE_10:
> +    case MODE_SELECT_10:
> +        cmd->xfer = (buf[7] << 8) | buf[8];
>          break;

Same here, scsi_cdb_xfer should handle it.

> 
> diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
> index 045594a..2f8da49 100644
> --- a/hw/scsi/scsi-bus.c
> +++ b/hw/scsi/scsi-bus.c
> @@ -1139,6 +1139,32 @@ static int scsi_req_medium_changer_xfer(SCSICommand 
> *cmd, SCSIDevice *dev, uint8
>      return 0;
>  }
>  
> +static int scsi_req_scanner_length(SCSICommand *cmd, SCSIDevice *dev, 
> uint8_t *buf)
> +{
> +    switch (buf[0]) {
> +    /* Scanner commands */
> +    case OBJECT_POSITION:
> +        cmd->xfer = 0;
> +        break;
> +    case GET_DATA_BUFFER_STATUS:
> +        cmd->xfer = buf[8] | (buf[7] << 8);
> +        break;
> +    case SCAN:
> +        cmd->xfer = buf[4];
> +        break;
> +    case READ_10:
> +    case SEND:
> +    case GET_WINDOW:
> +    case SET_WINDOW:
> +        cmd->xfer = buf[8] | (buf[7] << 8) | (buf[6] << 16);
> +        break;
> +    default:
> +        return scsi_req_xfer(cmd, dev, buf);
> +    }

Looks good.

> +    return 0;
> +}
> +
>  static void scsi_cmd_xfer_mode(SCSICommand *cmd)
>  {
>      if (!cmd->xfer) {
> @@ -1184,6 +1210,8 @@ static void scsi_cmd_xfer_mode(SCSICommand *cmd)
>      case SEND_DVD_STRUCTURE:
>      case PERSISTENT_RESERVE_OUT:
>      case MAINTENANCE_OUT:
> +    case SET_WINDOW:
> +    case SCAN:

SCAN conflicts with START_STOP.  Add a comment please saying that
START_STOP has cmd->xfer set to 0 in scsi_req_xfer for non-scanner devices.

Everything else looks good.

Thanks,

Paolo

>          cmd->mode = SCSI_XFER_TO_DEV;
>          break;
>      case ATA_PASSTHROUGH_12:
> @@ -1264,6 +1292,9 @@ int scsi_req_parse_cdb(SCSIDevice *dev, SCSICommand 
> *cmd, uint8_t *buf)
>      case TYPE_MEDIUM_CHANGER:
>          rc = scsi_req_medium_changer_xfer(cmd, dev, buf);
>          break;
> +    case TYPE_SCANNER:
> +        rc = scsi_req_scanner_length(cmd, dev, buf);
> +        break;
>      default:
>          rc = scsi_req_xfer(cmd, dev, buf);
>          break;
> diff --git a/include/block/scsi.h b/include/block/scsi.h
> index a311341..8b966d7 100644
> --- a/include/block/scsi.h
> +++ b/include/block/scsi.h
> @@ -48,13 +48,17 @@
>  #define ERASE                 0x19
>  #define MODE_SENSE            0x1a
>  #define LOAD_UNLOAD           0x1b
> +#define SCAN                  0x1b
>  #define START_STOP            0x1b
>  #define RECEIVE_DIAGNOSTIC    0x1c
>  #define SEND_DIAGNOSTIC       0x1d
>  #define ALLOW_MEDIUM_REMOVAL  0x1e
> +#define SET_WINDOW            0x24
>  #define READ_CAPACITY_10      0x25
> +#define GET_WINDOW            0x25
>  #define READ_10               0x28
>  #define WRITE_10              0x2a
> +#define SEND                  0x2a
>  #define SEEK_10               0x2b
>  #define LOCATE_10             0x2b
>  #define POSITION_TO_ELEMENT   0x2b
> @@ -62,10 +66,12 @@
>  #define VERIFY_10             0x2f
>  #define SEARCH_HIGH           0x30
>  #define SEARCH_EQUAL          0x31
> +#define OBJECT_POSITION       0x31
>  #define SEARCH_LOW            0x32
>  #define SET_LIMITS            0x33
>  #define PRE_FETCH             0x34
>  #define READ_POSITION         0x34
> +#define GET_DATA_BUFFER_STATUS 0x34
>  #define SYNCHRONIZE_CACHE     0x35
>  #define LOCK_UNLOCK_CACHE     0x36
>  #define INITIALIZE_ELEMENT_STATUS_WITH_RANGE 0x37
> -- 
> 2.1.4
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]