Changeset 48ae3ef in mainline for uspace/lib/usbhost/src/usb_endpoint_manager.c
- Timestamp:
- 2011-10-28T21:52:15Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 57e06ef
- Parents:
- 7265558
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/src/usb_endpoint_manager.c
r7265558 r48ae3ef 120 120 } 121 121 /*----------------------------------------------------------------------------*/ 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 /*----------------------------------------------------------------------------*/182 122 /** Check setup packet data for signs of toggle reset. 183 123 * … … 188 128 * Really ugly one. 189 129 */ 190 void usb_endpoint_manager_reset_ if_need(130 void usb_endpoint_manager_reset_eps_if_need( 191 131 usb_endpoint_manager_t *instance, usb_target_t target, const uint8_t *data) 192 132 { … … 234 174 } 235 175 } 176 /*----------------------------------------------------------------------------*/ 177 int 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 /*----------------------------------------------------------------------------*/ 205 int 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 /*----------------------------------------------------------------------------*/ 217 endpoint_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 /*----------------------------------------------------------------------------*/ 229 int 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 /*----------------------------------------------------------------------------*/ 259 int 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.