Changeset 45cae6b in mainline for uspace/drv/bus/usb/usbmast/scsi_ms.c


Ignore:
Timestamp:
2011-07-24T16:05:37Z (13 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
582fe388
Parents:
4022513
Message:

Work on USB mass storage:

  • handle pipe stalls when transferring data
  • distinguish between transport failure and failed command (i.e. check condition)
  • when a command fails, read sense data and log sense key, ASC, ASCQ
File:
1 edited

Legend:

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

    r4022513 r45cae6b  
    6161}
    6262
     63static void usbmast_dump_sense(usbmast_fun_t *mfun)
     64{
     65        scsi_sense_data_t sense_buf;
     66        int rc;
     67
     68        rc = usbmast_request_sense(mfun, &sense_buf, sizeof(sense_buf));
     69        if (rc == EOK) {
     70                printf("Got sense data (sense_key=0x%x, asc=0x%02x, "
     71                    "ascq=0x%02x.\n", sense_buf.flags_key & 0x0f,
     72                    sense_buf.additional_code,
     73                    sense_buf.additional_cqual);
     74        } else {
     75                printf("Failed to read sense data.\n");
     76        }
     77}
     78
    6379/** Perform SCSI Inquiry command on USB mass storage device.
    6480 *
     
    7288        size_t response_len;
    7389        scsi_cdb_inquiry_t cdb;
     90        cmd_status_t status;
    7491        int rc;
    7592
     
    7996
    8097        rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb,
    81             sizeof(cdb), &inq_data, sizeof(inq_data), &response_len);
     98            sizeof(cdb), &inq_data, sizeof(inq_data), &response_len, &status);
    8299
    83100        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;
     101                usb_log_error("Inquiry transport failed, device %s: %s.\n",
     102                   mfun->mdev->ddf_dev->name, str_error(rc));
     103                return rc;
     104        }
     105
     106        if (status != CMDS_GOOD) {
     107                usb_log_error("Inquiry command failed, device %s.\n",
     108                   mfun->mdev->ddf_dev->name);
     109                usbmast_dump_sense(mfun);
     110                return EIO;
    87111        }
    88112
     
    129153        scsi_cdb_request_sense_t cdb;
    130154        size_t data_len;
     155        cmd_status_t status;
    131156        int rc;
    132157
     
    136161
    137162        rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb,
    138             sizeof(cdb), buf, size, &data_len);
    139 
    140         if (rc != EOK) {
     163            sizeof(cdb), buf, size, &data_len, &status);
     164
     165        if (rc != EOK || status != CMDS_GOOD) {
    141166                usb_log_error("Request Sense failed, device %s: %s.\n",
    142167                   mfun->mdev->ddf_dev->name, str_error(rc));
     
    167192        scsi_read_capacity_10_data_t data;
    168193        size_t data_len;
     194        cmd_status_t status;
    169195        int rc;
    170196
     
    173199
    174200        rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb,
    175             sizeof(cdb), &data, sizeof(data), &data_len);
     201            sizeof(cdb), &data, sizeof(data), &data_len, &status);
    176202
    177203        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;
     204                usb_log_error("Read Capacity (10) transport failed, device %s: %s.\n",
     205                   mfun->mdev->ddf_dev->name, str_error(rc));
     206                return rc;
     207        }
     208
     209        if (status != CMDS_GOOD) {
     210                usb_log_error("Read Capacity (10) command failed, device %s.\n",
     211                   mfun->mdev->ddf_dev->name);
     212                usbmast_dump_sense(mfun);
     213                return EIO;
    181214        }
    182215
     
    205238        scsi_cdb_read_12_t cdb;
    206239        size_t data_len;
     240        cmd_status_t status;
    207241        int rc;
    208242
     
    221255
    222256        rc = usb_massstor_data_in(mfun, 0xDEADBEEF, (uint8_t *) &cdb,
    223             sizeof(cdb), buf, nblocks * mfun->block_size, &data_len);
     257            sizeof(cdb), buf, nblocks * mfun->block_size, &data_len, &status);
    224258
    225259        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;
     260                usb_log_error("Read (12) transport failed, device %s: %s.\n",
     261                   mfun->mdev->ddf_dev->name, str_error(rc));
     262                return rc;
     263        }
     264
     265        if (status != CMDS_GOOD) {
     266                usb_log_error("Read (12) command failed, device %s.\n",
     267                   mfun->mdev->ddf_dev->name);
     268                usbmast_dump_sense(mfun);
     269                return EIO;
    229270        }
    230271
     
    252293        scsi_cdb_write_12_t cdb;
    253294        size_t sent_len;
     295        cmd_status_t status;
    254296        int rc;
    255297
     
    266308
    267309        rc = usb_massstor_data_out(mfun, 0xDEADBEEF, (uint8_t *) &cdb,
    268             sizeof(cdb), data, nblocks * mfun->block_size, &sent_len);
     310            sizeof(cdb), data, nblocks * mfun->block_size, &sent_len, &status);
    269311
    270312        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;
     313                usb_log_error("Write (12) transport failed, device %s: %s.\n",
     314                   mfun->mdev->ddf_dev->name, str_error(rc));
     315                return rc;
     316        }
     317
     318        if (status != CMDS_GOOD) {
     319                usb_log_error("Write (12) command failed, device %s.\n",
     320                   mfun->mdev->ddf_dev->name);
     321                usbmast_dump_sense(mfun);
     322                return EIO;
    274323        }
    275324
Note: See TracChangeset for help on using the changeset viewer.