Ignore:
Timestamp:
2011-10-28T21:52:15Z (14 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
57e06ef
Parents:
7265558
Message:

libusbhost: Make interfaces more symmetric.

Make usb_endpoint_manager interface easier to use and understand.
Move ep removal hook pointer from endpoint_t to hcd_t.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhost/src/usb_endpoint_manager.c

    r7265558 r48ae3ef  
    120120}
    121121/*----------------------------------------------------------------------------*/
    122 int usb_endpoint_manager_register_ep(usb_endpoint_manager_t *instance,
    123     endpoint_t *ep, size_t data_size)
    124 {
    125         assert(instance);
    126         assert(instance->bw_count);
    127         assert(ep);
    128         ep->bandwidth = instance->bw_count(ep->speed, ep->transfer_type,
    129             data_size, ep->max_packet_size);
    130 
    131         fibril_mutex_lock(&instance->guard);
    132 
    133         if (ep->bandwidth > instance->free_bw) {
    134                 fibril_mutex_unlock(&instance->guard);
    135                 return ENOSPC;
    136         }
    137 
    138         /* Check for existence */
    139         const endpoint_t *endpoint =
    140             find_locked(instance, ep->address, ep->endpoint, ep->direction);
    141         if (endpoint != NULL) {
    142                 fibril_mutex_unlock(&instance->guard);
    143                 return EEXISTS;
    144         }
    145         list_t *list = get_list(instance, ep->address);
    146         list_append(&ep->link, list);
    147 
    148         instance->free_bw -= ep->bandwidth;
    149         fibril_mutex_unlock(&instance->guard);
    150         return EOK;
    151 }
    152 /*----------------------------------------------------------------------------*/
    153 int usb_endpoint_manager_unregister_ep(usb_endpoint_manager_t *instance,
    154     usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction)
    155 {
    156         assert(instance);
    157 
    158         fibril_mutex_lock(&instance->guard);
    159         endpoint_t *ep = find_locked(instance, address, endpoint, direction);
    160         if (ep != NULL) {
    161                 list_remove(&ep->link);
    162                 instance->free_bw += ep->bandwidth;
    163         }
    164 
    165         fibril_mutex_unlock(&instance->guard);
    166         endpoint_destroy(ep);
    167         return (ep != NULL) ? EOK : EINVAL;
    168 }
    169 /*----------------------------------------------------------------------------*/
    170 endpoint_t * usb_endpoint_manager_get_ep(usb_endpoint_manager_t *instance,
    171     usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction)
    172 {
    173         assert(instance);
    174 
    175         fibril_mutex_lock(&instance->guard);
    176         endpoint_t *ep = find_locked(instance, address, endpoint, direction);
    177         fibril_mutex_unlock(&instance->guard);
    178 
    179         return ep;
    180 }
    181 /*----------------------------------------------------------------------------*/
    182122/** Check setup packet data for signs of toggle reset.
    183123 *
     
    188128 * Really ugly one.
    189129 */
    190 void usb_endpoint_manager_reset_if_need(
     130void usb_endpoint_manager_reset_eps_if_need(
    191131    usb_endpoint_manager_t *instance, usb_target_t target, const uint8_t *data)
    192132{
     
    234174        }
    235175}
     176/*----------------------------------------------------------------------------*/
     177int usb_endpoint_manager_register_ep(usb_endpoint_manager_t *instance,
     178    endpoint_t *ep, size_t data_size)
     179{
     180        assert(instance);
     181        assert(instance->bw_count);
     182        assert(ep);
     183        fibril_mutex_lock(&instance->guard);
     184
     185        if (ep->bandwidth > instance->free_bw) {
     186                fibril_mutex_unlock(&instance->guard);
     187                return ENOSPC;
     188        }
     189
     190        /* Check for existence */
     191        const endpoint_t *endpoint =
     192            find_locked(instance, ep->address, ep->endpoint, ep->direction);
     193        if (endpoint != NULL) {
     194                fibril_mutex_unlock(&instance->guard);
     195                return EEXISTS;
     196        }
     197        list_t *list = get_list(instance, ep->address);
     198        list_append(&ep->link, list);
     199
     200        instance->free_bw -= ep->bandwidth;
     201        fibril_mutex_unlock(&instance->guard);
     202        return EOK;
     203}
     204/*----------------------------------------------------------------------------*/
     205int usb_endpoint_manager_unregister_ep(
     206    usb_endpoint_manager_t *instance, endpoint_t *ep)
     207{
     208        assert(instance);
     209        if (ep == NULL)
     210                return ENOENT;
     211        fibril_mutex_lock(&instance->guard);
     212        list_remove(&ep->link);
     213        fibril_mutex_unlock(&instance->guard);
     214        return EOK;
     215}
     216/*----------------------------------------------------------------------------*/
     217endpoint_t * usb_endpoint_manager_find_ep(usb_endpoint_manager_t *instance,
     218    usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction)
     219{
     220        assert(instance);
     221
     222        fibril_mutex_lock(&instance->guard);
     223        endpoint_t *ep = find_locked(instance, address, endpoint, direction);
     224        fibril_mutex_unlock(&instance->guard);
     225
     226        return ep;
     227}
     228/*----------------------------------------------------------------------------*/
     229int usb_endpoint_manager_add_ep(usb_endpoint_manager_t *instance,
     230    usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,
     231    usb_transfer_type_t type, usb_speed_t speed, size_t max_packet_size,
     232    size_t data_size, int (*callback)(endpoint_t *, void *), void *arg)
     233{
     234        assert(instance);
     235        const size_t bw =
     236            instance->bw_count(speed, type, data_size, max_packet_size);
     237
     238        endpoint_t *ep = endpoint_create(
     239            address, endpoint, direction, type, speed, max_packet_size, bw);
     240        if (!ep)
     241                return ENOMEM;
     242
     243        if (callback) {
     244                const int ret = callback(ep, arg);
     245                if (ret != EOK) {
     246                        endpoint_destroy(ep);
     247                        return ret;
     248                }
     249        }
     250
     251        const int ret =
     252            usb_endpoint_manager_register_ep(instance, ep, data_size);
     253        if (ret != EOK) {
     254                endpoint_destroy(ep);
     255        }
     256        return ret;
     257}
     258/*----------------------------------------------------------------------------*/
     259int usb_endpoint_manager_remove_ep(usb_endpoint_manager_t *instance,
     260    usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,
     261    void (*callback)(endpoint_t *, void *), void *arg)
     262{
     263        assert(instance);
     264        fibril_mutex_lock(&instance->guard);
     265        endpoint_t *ep = find_locked(instance, address, endpoint, direction);
     266        if (ep != NULL) {
     267                list_remove(&ep->link);
     268                instance->free_bw += ep->bandwidth;
     269        }
     270        fibril_mutex_unlock(&instance->guard);
     271        if (ep == NULL)
     272                return ENOENT;
     273
     274        if (callback) {
     275                callback(ep, arg);
     276        }
     277        endpoint_destroy(ep);
     278        return EOK;
     279}
Note: See TracChangeset for help on using the changeset viewer.