Ignore:
File:
1 edited

Legend:

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

    rd6c953e9 rd176b1d  
    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 = ddf_dev_data_alloc(dev->ddf_dev, 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");
     
    103139        mdev->usb_dev = dev;
    104140
    105         usb_log_info("Initializing mass storage `%s'.\n",
    106             dev->ddf_dev->name);
    107         usb_log_debug(" Bulk in endpoint: %d [%zuB].\n",
    108             dev->pipes[BULK_IN_EP].pipe->endpoint_no,
    109             (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);
    110145        usb_log_debug("Bulk out endpoint: %d [%zuB].\n",
    111             dev->pipes[BULK_OUT_EP].pipe->endpoint_no,
    112             (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);
    113148
    114149        usb_log_debug("Get LUN count...\n");
    115         mdev->luns = usb_masstor_get_lun_count(mdev);
    116 
    117         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++) {
    118159                rc = usbmast_fun_create(mdev, i);
    119160                if (rc != EOK)
     
    123164        return EOK;
    124165error:
    125         /* XXX Destroy functions */
     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);
    126178        return rc;
    127179}
     
    163215        }
    164216
     217        mfun->ddf_fun = fun;
    165218        mfun->mdev = mdev;
    166219        mfun->lun = lun;
     
    213266
    214267        free(fun_name);
     268        mdev->luns[lun] = fun;
    215269
    216270        return EOK;
     
    294348
    295349/** USB mass storage driver ops. */
    296 static usb_driver_ops_t usbmast_driver_ops = {
    297         .add_device = usbmast_add_device,
     350static const usb_driver_ops_t usbmast_driver_ops = {
     351        .device_add = usbmast_device_add,
     352        .device_rem = usbmast_device_remove,
     353        .device_gone = usbmast_device_gone,
    298354};
    299355
    300356/** USB mass storage driver. */
    301 static usb_driver_t usbmast_driver = {
     357static const usb_driver_t usbmast_driver = {
    302358        .name = NAME,
    303359        .ops = &usbmast_driver_ops,
Note: See TracChangeset for help on using the changeset viewer.