Ignore:
Timestamp:
2016-07-22T08:24:47Z (8 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f76d2c2
Parents:
5b18137 (diff), 8351f9a4 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge from lp:~jan.vesely/helenos/usb

File:
1 edited

Legend:

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

    r5b18137 rb4b534ac  
    4444#include "usbmast.h"
    4545
    46 bool usb_mast_verbose = false;
    4746
    4847#define MASTLOG(format, ...) \
    49         do { \
    50                 if (usb_mast_verbose) { \
    51                         usb_log_debug2("USB cl08: " format, ##__VA_ARGS__); \
    52                 } \
    53         } while (false)
     48        usb_log_debug2("USB cl08: " format, ##__VA_ARGS__)
    5449
    5550/** Send command via bulk-only transport.
     
    6560{
    6661        int rc;
    67         int retval = EOK;
    68         size_t act_size;
    69         usb_pipe_t *bulk_in_pipe = &mfun->mdev->usb_dev->pipes[BULK_IN_EP].pipe;
    70         usb_pipe_t *bulk_out_pipe = &mfun->mdev->usb_dev->pipes[BULK_OUT_EP].pipe;
    71         usb_direction_t ddir;
    72         void *dbuf;
    73         size_t dbuf_size;
    74 
    75         if (cmd->data_out != NULL && cmd->data_in == NULL) {
    76                 ddir = USB_DIRECTION_OUT;
    77                 dbuf = (void *)cmd->data_out;
    78                 dbuf_size = cmd->data_out_size;
    79         } else if (cmd->data_out == NULL && cmd->data_in != NULL) {
     62
     63        if (cmd->data_in && cmd->data_out)
     64                return EINVAL;
     65
     66        usb_pipe_t *bulk_in_pipe = mfun->mdev->bulk_in_pipe;
     67        usb_pipe_t *bulk_out_pipe = mfun->mdev->bulk_out_pipe;
     68
     69        usb_pipe_t *dpipe = bulk_out_pipe;
     70        usb_direction_t ddir = USB_DIRECTION_OUT;
     71        size_t dbuf_size = cmd->data_out_size;
     72
     73        if (cmd->data_in) {
    8074                ddir = USB_DIRECTION_IN;
    81                 dbuf = cmd->data_in;
    8275                dbuf_size = cmd->data_in_size;
    83         } else {
    84                 assert(false);
     76                dpipe = bulk_in_pipe;
    8577        }
    8678
     
    9688            usb_debug_str_buffer((uint8_t *) &cbw, sizeof(cbw), 0),
    9789            str_error(rc));
    98         if (rc != EOK)
    99                 return EIO;
     90        if (rc != EOK) {
     91                usb_log_error("Bulk out write failed: %s\n", str_error(rc));
     92                return EIO;
     93        }
    10094
    10195        MASTLOG("Transferring data.\n");
    102         if (ddir == USB_DIRECTION_IN) {
     96        if (cmd->data_in) {
     97                size_t act_size;
    10398                /* Recieve data from the device. */
    104                 rc = usb_pipe_read(bulk_in_pipe, dbuf, dbuf_size, &act_size);
     99                rc = usb_pipe_read(dpipe, cmd->data_in, cmd->data_in_size,
     100                    &act_size);
    105101                MASTLOG("Received %zu bytes (%s): %s.\n", act_size,
    106                     usb_debug_str_buffer((uint8_t *) dbuf, act_size, 0),
     102                    usb_debug_str_buffer(cmd->data_in, act_size, 0),
    107103                    str_error(rc));
    108         } else {
     104        }
     105        if (cmd->data_out) {
    109106                /* Send data to the device. */
    110                 rc = usb_pipe_write(bulk_out_pipe, dbuf, dbuf_size);
    111                 MASTLOG("Sent %zu bytes (%s): %s.\n", act_size,
    112                     usb_debug_str_buffer((uint8_t *) dbuf, act_size, 0),
     107                rc = usb_pipe_write(dpipe, cmd->data_out, cmd->data_out_size);
     108                MASTLOG("Sent %zu bytes (%s): %s.\n", cmd->data_out_size,
     109                    usb_debug_str_buffer(cmd->data_out, cmd->data_out_size, 0),
    113110                    str_error(rc));
    114111        }
     
    116113        if (rc == ESTALL) {
    117114                /* Clear stall condition and continue below to read CSW. */
    118                 if (ddir == USB_DIRECTION_IN) {
    119                         usb_pipe_clear_halt(&mfun->mdev->usb_dev->ctrl_pipe,
    120                             &mfun->mdev->usb_dev->pipes[BULK_IN_EP].pipe);
    121                 } else {
    122                         usb_pipe_clear_halt(&mfun->mdev->usb_dev->ctrl_pipe,
    123                             &mfun->mdev->usb_dev->pipes[BULK_OUT_EP].pipe);
    124                 }
     115                usb_pipe_clear_halt(
     116                    usb_device_get_default_pipe(mfun->mdev->usb_dev), dpipe);
    125117        } else if (rc != EOK) {
     118                usb_log_error("Failed to transfer data: %s", str_error(rc));
    126119                return EIO;
    127120        }
     
    136129            str_error(rc));
    137130        if (rc != EOK) {
    138                 MASTLOG("rc != EOK\n");
     131                usb_log_error("Failed to read CSW: %s", str_error(rc));
    139132                return EIO;
    140133        }
    141134
    142135        if (csw_size != sizeof(csw)) {
    143                 MASTLOG("csw_size != sizeof(csw)\n");
     136                usb_log_error("Received CSW of incorrect size.");
    144137                return EIO;
    145138        }
    146139
    147140        if (csw.dCSWTag != tag) {
    148                 MASTLOG("csw.dCSWTag != tag\n");
     141                usb_log_error("Received CSW with incorrect tag. (expected: %"
     142                    PRIX32" received: %"PRIx32, tag, csw.dCSWTag);
    149143                return EIO;
    150144        }
     
    158152                break;
    159153        case cbs_failed:
    160                 MASTLOG("Command failed\n");
    161154                cmd->status = CMDS_FAILED;
     155                usb_log_error("CBS Failed.\n");
    162156                break;
    163157        case cbs_phase_error:
    164                 MASTLOG("Phase error\n");
    165                 retval = EIO;
     158                usb_log_error("CBS phase error.\n");
     159                rc = EIO;
    166160                break;
    167161        default:
    168                 retval = EIO;
    169                 break;
    170         }
    171 
    172         size_t residue = (size_t) uint32_usb2host(csw.dCSWDataResidue);
     162                usb_log_error("CBS other error.\n");
     163                rc = EIO;
     164                break;
     165        }
     166
     167        const size_t residue = uint32_usb2host(csw.dCSWDataResidue);
    173168        if (residue > dbuf_size) {
    174                 MASTLOG("residue > dbuf_size\n");
     169                usb_log_error("Residue > buffer size (%zu > %zu).\n",
     170                    residue, dbuf_size);
    175171                return EIO;
    176172        }
     
    184180         */
    185181
    186         if (ddir == USB_DIRECTION_IN)
     182        if (cmd->data_in)
    187183                cmd->rcvd_size = dbuf_size - residue;
    188184
    189         return retval;
     185        return rc;
    190186}
    191187
     
    197193int usb_massstor_reset(usbmast_dev_t *mdev)
    198194{
    199         return usb_control_request_set(&mdev->usb_dev->ctrl_pipe,
     195        return usb_control_request_set(
     196            usb_device_get_default_pipe(mdev->usb_dev),
    200197            USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
    201             0xFF, 0, mdev->usb_dev->interface_no, NULL, 0);
     198            0xFF, 0, usb_device_get_iface_number(mdev->usb_dev), NULL, 0);
    202199}
    203200
     
    215212         */
    216213        usb_massstor_reset(mdev);
    217         usb_pipe_clear_halt(&mdev->usb_dev->ctrl_pipe,
    218             &mdev->usb_dev->pipes[BULK_IN_EP].pipe);
    219         usb_pipe_clear_halt(&mdev->usb_dev->ctrl_pipe,
    220             &mdev->usb_dev->pipes[BULK_OUT_EP].pipe);
     214        usb_pipe_clear_halt(usb_device_get_default_pipe(mdev->usb_dev),
     215            mdev->bulk_in_pipe);
     216        usb_pipe_clear_halt(usb_device_get_default_pipe(mdev->usb_dev),
     217            mdev->bulk_out_pipe);
    221218}
    222219
     
    236233        uint8_t max_lun;
    237234        size_t data_recv_len;
    238         int rc = usb_control_request_get(&mdev->usb_dev->ctrl_pipe,
     235        int rc = usb_control_request_get(
     236            usb_device_get_default_pipe(mdev->usb_dev),
    239237            USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
    240             0xFE, 0, mdev->usb_dev->interface_no, &max_lun, 1, &data_recv_len);
     238            0xFE, 0, usb_device_get_iface_number(mdev->usb_dev), &max_lun, 1,
     239            &data_recv_len);
    241240        if (rc != EOK) {
    242241                return rc;
Note: See TracChangeset for help on using the changeset viewer.