Ignore:
File:
1 edited

Legend:

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

    r5f6e25e rfbcdeb8  
    5555#define GET_BULK_OUT(dev) ((dev)->pipes[BULK_OUT_EP].pipe)
    5656
    57 static usb_endpoint_description_t bulk_in_ep = {
     57static const usb_endpoint_description_t bulk_in_ep = {
    5858        .transfer_type = USB_TRANSFER_BULK,
    5959        .direction = USB_DIRECTION_IN,
     
    6363        .flags = 0
    6464};
    65 static usb_endpoint_description_t bulk_out_ep = {
     65static const usb_endpoint_description_t bulk_out_ep = {
    6666        .transfer_type = USB_TRANSFER_BULK,
    6767        .direction = USB_DIRECTION_OUT,
     
    7272};
    7373
    74 usb_endpoint_description_t *mast_endpoints[] = {
     74static const usb_endpoint_description_t *mast_endpoints[] = {
    7575        &bulk_in_ep,
    7676        &bulk_out_ep,
     
    8282    void *arg);
    8383
     84/** Callback when a device is removed from the system.
     85 *
     86 * @param dev Representation of USB device.
     87 * @return Error code.
     88 */
     89static int usbmast_device_gone(usb_device_t *dev)
     90{
     91        usbmast_dev_t *mdev = dev->driver_data;
     92        assert(mdev);
     93
     94        for (size_t i = 0; i < mdev->lun_count; ++i) {
     95                const int rc = ddf_fun_unbind(mdev->luns[i]);
     96                if (rc != EOK) {
     97                        usb_log_error("Failed to unbind LUN function %zu: "
     98                            "%s\n", i, str_error(rc));
     99                        return rc;
     100                }
     101                ddf_fun_destroy(mdev->luns[i]);
     102                mdev->luns[i] = NULL;
     103        }
     104        free(mdev->luns);
     105        return EOK;
     106}
     107
     108/** Callback when a device is about to be removed.
     109 *
     110 * @param dev Representation of USB device.
     111 * @return Error code.
     112 */
     113static int usbmast_device_remove(usb_device_t *dev)
     114{
     115        //TODO: flush buffers, or whatever.
     116        //TODO: remove device
     117        return ENOTSUP;
     118}
     119
    84120/** Callback when new device is attached and recognized as a mass storage.
    85121 *
    86  * @param dev Representation of a the USB device.
     122 * @param dev Representation of USB device.
    87123 * @return Error code.
    88124 */
    89 static int usbmast_add_device(usb_device_t *dev)
     125static int usbmast_device_add(usb_device_t *dev)
    90126{
    91127        int rc;
     
    94130
    95131        /* Allocate softstate */
    96         mdev = calloc(1, sizeof(usbmast_dev_t));
     132        mdev = usb_device_data_alloc(dev, sizeof(usbmast_dev_t));
    97133        if (mdev == NULL) {
    98134                usb_log_error("Failed allocating softstate.\n");
    99                 rc = ENOMEM;
    100                 goto error;
     135                return ENOMEM;
    101136        }
    102137
     
    104139        mdev->usb_dev = dev;
    105140
    106         usb_log_info("Initializing mass storage `%s'.\n",
    107             dev->ddf_dev->name);
    108         usb_log_debug(" Bulk in endpoint: %d [%zuB].\n",
    109             dev->pipes[BULK_IN_EP].pipe->endpoint_no,
    110             (size_t) dev->pipes[BULK_IN_EP].descriptor->max_packet_size);
     141        usb_log_info("Initializing mass storage `%s'.\n", dev->ddf_dev->name);
     142        usb_log_debug("Bulk in endpoint: %d [%zuB].\n",
     143            dev->pipes[BULK_IN_EP].pipe.endpoint_no,
     144            dev->pipes[BULK_IN_EP].pipe.max_packet_size);
    111145        usb_log_debug("Bulk out endpoint: %d [%zuB].\n",
    112             dev->pipes[BULK_OUT_EP].pipe->endpoint_no,
    113             (size_t) dev->pipes[BULK_OUT_EP].descriptor->max_packet_size);
     146            dev->pipes[BULK_OUT_EP].pipe.endpoint_no,
     147            dev->pipes[BULK_OUT_EP].pipe.max_packet_size);
    114148
    115149        usb_log_debug("Get LUN count...\n");
    116         mdev->luns = usb_masstor_get_lun_count(mdev);
    117 
    118         for (i = 0; i < mdev->luns; i++) {
     150        mdev->lun_count = usb_masstor_get_lun_count(mdev);
     151        mdev->luns = calloc(mdev->lun_count, sizeof(ddf_fun_t*));
     152        if (mdev->luns == NULL) {
     153                rc = ENOMEM;
     154                usb_log_error("Failed allocating luns table.\n");
     155                goto error;
     156        }
     157
     158        for (i = 0; i < mdev->lun_count; i++) {
    119159                rc = usbmast_fun_create(mdev, i);
    120160                if (rc != EOK)
     
    124164        return EOK;
    125165error:
    126         /* XXX Destroy functions */
    127         if (mdev != NULL)
    128                 free(mdev);
     166        /* Destroy functions */
     167        for (size_t i = 0; i < mdev->lun_count; ++i) {
     168                if (mdev->luns[i] == NULL)
     169                        continue;
     170                const int rc = ddf_fun_unbind(mdev->luns[i]);
     171                if (rc != EOK) {
     172                        usb_log_warning("Failed to unbind LUN function %zu: "
     173                            "%s.\n", i, str_error(rc));
     174                }
     175                ddf_fun_destroy(mdev->luns[i]);
     176        }
     177        free(mdev->luns);
    129178        return rc;
    130179}
     
    158207        }
    159208
    160         free(fun_name);
    161 
    162209        /* Allocate soft state */
    163         mfun = ddf_dev_data_alloc(mdev->ddf_dev, sizeof(usbmast_fun_t));
     210        mfun = ddf_fun_data_alloc(fun, sizeof(usbmast_fun_t));
    164211        if (mfun == NULL) {
    165212                usb_log_error("Failed allocating softstate.\n");
     
    168215        }
    169216
     217        mfun->ddf_fun = fun;
    170218        mfun->mdev = mdev;
    171219        mfun->lun = lun;
    172220
    173         fun_name = NULL;
    174 
    175221        /* Set up a connection handler. */
    176222        fun->conn_handler = usbmast_bd_connection;
    177         fun->driver_data = mfun;
    178223
    179224        usb_log_debug("Inquire...\n");
     
    219264                goto error;
    220265        }
     266
     267        free(fun_name);
     268        mdev->luns[lun] = fun;
    221269
    222270        return EOK;
     
    252300                return;
    253301        }
    254 
    255         comm_buf = as_get_mappable_page(comm_size);
    256         if (comm_buf == NULL) {
     302       
     303        (void) async_share_out_finalize(callid, &comm_buf);
     304        if (comm_buf == (void *) -1) {
    257305                async_answer_0(callid, EHANGUP);
    258306                return;
    259307        }
    260 
    261         (void) async_share_out_finalize(callid, comm_buf);
    262 
     308       
    263309        mfun = (usbmast_fun_t *) ((ddf_fun_t *)arg)->driver_data;
    264310
     
    300346
    301347/** USB mass storage driver ops. */
    302 static usb_driver_ops_t usbmast_driver_ops = {
    303         .add_device = usbmast_add_device,
     348static const usb_driver_ops_t usbmast_driver_ops = {
     349        .device_add = usbmast_device_add,
     350        .device_rem = usbmast_device_remove,
     351        .device_gone = usbmast_device_gone,
    304352};
    305353
    306354/** USB mass storage driver. */
    307 static usb_driver_t usbmast_driver = {
     355static const usb_driver_t usbmast_driver = {
    308356        .name = NAME,
    309357        .ops = &usbmast_driver_ops,
Note: See TracChangeset for help on using the changeset viewer.