Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/usbmast/scsi_ms.c

    r2aceec5 rde3432b  
    6161}
    6262
     63static void usbmast_dump_sense(usbmast_fun_t *mfun)
     64{
     65        scsi_sense_data_t sense_buf;
     66        unsigned sense_key;
     67        int rc;
     68
     69        rc = usbmast_request_sense(mfun, &sense_buf, sizeof(sense_buf));
     70        if (rc == EOK) {
     71                sense_key = sense_buf.flags_key & 0x0f;
     72                printf("Got sense data. Sense key: 0x%x (%s), ASC 0x%02x, "
     73                    "ASCQ 0x%02x.\n", sense_key,
     74                    scsi_get_sense_key_str(sense_key),
     75                    sense_buf.additional_code,
     76                    sense_buf.additional_cqual);
     77        } else {
     78                printf("Failed to read sense data.\n");
     79        }
     80}
     81
    6382/** Perform SCSI Inquiry command on USB mass storage device.
    6483 *
     
    7089{
    7190        scsi_std_inquiry_data_t inq_data;
    72         size_t response_len;
     91        scsi_cmd_t cmd;
    7392        scsi_cdb_inquiry_t cdb;
    7493        int rc;
     
    7897        cdb.alloc_len = host2uint16_t_be(sizeof(inq_data));
    7998
    80         rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb,
    81             sizeof(cdb), &inq_data, sizeof(inq_data), &response_len);
     99        memset(&cmd, 0, sizeof(cmd));
     100        cmd.cdb = &cdb;
     101        cmd.cdb_size = sizeof(cdb);
     102        cmd.data_in = &inq_data;
     103        cmd.data_in_size = sizeof(inq_data);
     104
     105        rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd);
    82106
    83107        if (rc != EOK) {
    84                 usb_log_error("Inquiry failed, device %s: %s.\n",
    85                    mfun->mdev->ddf_dev->name, str_error(rc));
    86                 return rc;
    87         }
    88 
    89         if (response_len < SCSI_STD_INQUIRY_DATA_MIN_SIZE) {
     108                usb_log_error("Inquiry transport failed, device %s: %s.\n",
     109                   mfun->mdev->ddf_dev->name, str_error(rc));
     110                return rc;
     111        }
     112
     113        if (cmd.status != CMDS_GOOD) {
     114                usb_log_error("Inquiry command failed, device %s.\n",
     115                   mfun->mdev->ddf_dev->name);
     116                usbmast_dump_sense(mfun);
     117                return EIO;
     118        }
     119
     120        if (cmd.rcvd_size < SCSI_STD_INQUIRY_DATA_MIN_SIZE) {
    90121                usb_log_error("SCSI Inquiry response too short (%zu).\n",
    91                     response_len);
     122                    cmd.rcvd_size);
    92123                return EIO;
    93124        }
     
    127158int usbmast_request_sense(usbmast_fun_t *mfun, void *buf, size_t size)
    128159{
     160        scsi_cmd_t cmd;
    129161        scsi_cdb_request_sense_t cdb;
    130         size_t data_len;
    131162        int rc;
    132163
     
    135166        cdb.alloc_len = min(size, SCSI_SENSE_DATA_MAX_SIZE);
    136167
    137         rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb,
    138             sizeof(cdb), buf, size, &data_len);
    139 
    140         if (rc != EOK) {
     168        memset(&cmd, 0, sizeof(cmd));
     169        cmd.cdb = &cdb;
     170        cmd.cdb_size = sizeof(cdb);
     171        cmd.data_in = buf;
     172        cmd.data_in_size = size;
     173
     174        rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd);
     175
     176        if (rc != EOK || cmd.status != CMDS_GOOD) {
    141177                usb_log_error("Request Sense failed, device %s: %s.\n",
    142178                   mfun->mdev->ddf_dev->name, str_error(rc));
     
    144180        }
    145181
    146         if (data_len < SCSI_SENSE_DATA_MIN_SIZE) {
     182        if (cmd.rcvd_size < SCSI_SENSE_DATA_MIN_SIZE) {
    147183                /* The missing bytes should be considered to be zeroes. */
    148                 memset((uint8_t *)buf + data_len, 0,
    149                     SCSI_SENSE_DATA_MIN_SIZE - data_len);
     184                memset((uint8_t *)buf + cmd.rcvd_size, 0,
     185                    SCSI_SENSE_DATA_MIN_SIZE - cmd.rcvd_size);
    150186        }
    151187
     
    164200    uint32_t *block_size)
    165201{
     202        scsi_cmd_t cmd;
    166203        scsi_cdb_read_capacity_10_t cdb;
    167204        scsi_read_capacity_10_data_t data;
    168         size_t data_len;
    169205        int rc;
    170206
     
    172208        cdb.op_code = SCSI_CMD_READ_CAPACITY_10;
    173209
    174         rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb,
    175             sizeof(cdb), &data, sizeof(data), &data_len);
     210        memset(&cmd, 0, sizeof(cmd));
     211        cmd.cdb = &cdb;
     212        cmd.cdb_size = sizeof(cdb);
     213        cmd.data_in = &data;
     214        cmd.data_in_size = sizeof(data);
     215
     216        rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd);
    176217
    177218        if (rc != EOK) {
    178                 usb_log_error("Read Capacity (10) failed, device %s: %s.\n",
    179                    mfun->mdev->ddf_dev->name, str_error(rc));
    180                 return rc;
    181         }
    182 
    183         if (data_len < sizeof(data)) {
     219                usb_log_error("Read Capacity (10) transport failed, device %s: %s.\n",
     220                   mfun->mdev->ddf_dev->name, str_error(rc));
     221                return rc;
     222        }
     223
     224        if (cmd.status != CMDS_GOOD) {
     225                usb_log_error("Read Capacity (10) command failed, device %s.\n",
     226                   mfun->mdev->ddf_dev->name);
     227                usbmast_dump_sense(mfun);
     228                return EIO;
     229        }
     230
     231        if (cmd.rcvd_size < sizeof(data)) {
    184232                usb_log_error("SCSI Read Capacity response too short (%zu).\n",
    185                     data_len);
     233                    cmd.rcvd_size);
    186234                return EIO;
    187235        }
     
    203251int usbmast_read(usbmast_fun_t *mfun, uint64_t ba, size_t nblocks, void *buf)
    204252{
     253        scsi_cmd_t cmd;
    205254        scsi_cdb_read_12_t cdb;
    206         size_t data_len;
    207         int rc;
    208 
    209         /* XXX Need softstate to store block size. */
     255        int rc;
    210256
    211257        if (ba > UINT32_MAX)
     
    220266        cdb.xfer_len = host2uint32_t_be(nblocks);
    221267
    222         rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb,
    223             sizeof(cdb), buf, nblocks * mfun->block_size, &data_len);
     268        memset(&cmd, 0, sizeof(cmd));
     269        cmd.cdb = &cdb;
     270        cmd.cdb_size = sizeof(cdb);
     271        cmd.data_in = buf;
     272        cmd.data_in_size = nblocks * mfun->block_size;
     273
     274        rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd);
    224275
    225276        if (rc != EOK) {
    226                 usb_log_error("Read (12) failed, device %s: %s.\n",
    227                    mfun->mdev->ddf_dev->name, str_error(rc));
    228                 return rc;
    229         }
    230 
    231         if (data_len < nblocks * mfun->block_size) {
     277                usb_log_error("Read (12) transport failed, device %s: %s.\n",
     278                   mfun->mdev->ddf_dev->name, str_error(rc));
     279                return rc;
     280        }
     281
     282        if (cmd.status != CMDS_GOOD) {
     283                usb_log_error("Read (12) command failed, device %s.\n",
     284                   mfun->mdev->ddf_dev->name);
     285                usbmast_dump_sense(mfun);
     286                return EIO;
     287        }
     288
     289        if (cmd.rcvd_size < nblocks * mfun->block_size) {
    232290                usb_log_error("SCSI Read response too short (%zu).\n",
    233                     data_len);
     291                    cmd.rcvd_size);
    234292                return EIO;
    235293        }
     
    250308    const void *data)
    251309{
     310        scsi_cmd_t cmd;
    252311        scsi_cdb_write_12_t cdb;
    253         size_t sent_len;
    254312        int rc;
    255313
     
    265323        cdb.xfer_len = host2uint32_t_be(nblocks);
    266324
    267         rc = usb_massstor_data_out(mfun, 0xDEADBEEF, (uint8_t *) &cdb,
    268             sizeof(cdb), data, nblocks * mfun->block_size, &sent_len);
     325        memset(&cmd, 0, sizeof(cmd));
     326        cmd.cdb = &cdb;
     327        cmd.cdb_size = sizeof(cdb);
     328        cmd.data_out = data;
     329        cmd.data_out_size = nblocks * mfun->block_size;
     330
     331        rc = usb_massstor_cmd(mfun, 0xDEADBEEF, &cmd);
    269332
    270333        if (rc != EOK) {
    271                 usb_log_error("Write (12) failed, device %s: %s.\n",
    272                    mfun->mdev->ddf_dev->name, str_error(rc));
    273                 return rc;
    274         }
    275 
    276         if (sent_len < nblocks * mfun->block_size) {
    277                 usb_log_error("SCSI Write not all bytes transferred (%zu).\n",
    278                     sent_len);
     334                usb_log_error("Write (12) transport failed, device %s: %s.\n",
     335                   mfun->mdev->ddf_dev->name, str_error(rc));
     336                return rc;
     337        }
     338
     339        if (cmd.status != CMDS_GOOD) {
     340                usb_log_error("Write (12) command failed, device %s.\n",
     341                   mfun->mdev->ddf_dev->name);
     342                usbmast_dump_sense(mfun);
    279343                return EIO;
    280344        }
Note: See TracChangeset for help on using the changeset viewer.