Changeset c83a55c in mainline for uspace/lib/usbhost/src/iface.c
- Timestamp:
- 2011-10-31T06:52:54Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c25e39b
- Parents:
- e8ab32f (diff), 3ce78580 (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/src/iface.c
re8ab32f rc83a55c 49 49 assert(hcd); 50 50 51 int ret; 52 53 size_t res_bw; 54 endpoint_t *ep = usb_endpoint_manager_get_ep(&hcd->ep_manager, 55 target.address, target.endpoint, direction, &res_bw); 51 endpoint_t *ep = usb_endpoint_manager_find_ep(&hcd->ep_manager, 52 target.address, target.endpoint, direction); 56 53 if (ep == NULL) { 57 54 usb_log_error("Endpoint(%d:%d) not registered for %s.\n", … … 65 62 const size_t bw = bandwidth_count_usb11( 66 63 ep->speed, ep->transfer_type, size, ep->max_packet_size); 67 if (res_bw < bw) { 64 /* Check if we have enough bandwidth reserved */ 65 if (ep->bandwidth < bw) { 68 66 usb_log_error("Endpoint(%d:%d) %s needs %zu bw " 69 67 "but only %zu is reserved.\n", 70 target.address, target.endpoint, name, bw, res_bw);68 ep->address, ep->endpoint, name, bw, ep->bandwidth); 71 69 return ENOSPC; 72 70 } … … 78 76 /* No private data and no private data dtor */ 79 77 usb_transfer_batch_t *batch = 80 usb_transfer_batch_ get(ep, data, size, setup_data,78 usb_transfer_batch_create(ep, data, size, setup_data, 81 79 in, out, arg, fun, NULL, NULL); 82 80 if (!batch) { … … 84 82 } 85 83 86 ret = hcd->schedule(hcd, batch);84 const int ret = hcd->schedule(hcd, batch); 87 85 if (ret != EOK) 88 usb_transfer_batch_d ispose(batch);86 usb_transfer_batch_destroy(batch); 89 87 90 88 return ret; … … 130 128 131 129 usb_log_debug("Address bind %d-%" PRIun ".\n", address, handle); 132 usb_device_manager_bind(&hcd->dev_manager, address, handle); 133 return EOK; 130 return usb_device_manager_bind(&hcd->dev_manager, address, handle); 134 131 } 135 132 /*----------------------------------------------------------------------------*/ … … 147 144 hcd_t *hcd = fun_to_hcd(fun); 148 145 assert(hcd); 149 const bool found = 150 usb_device_manager_find_by_address(&hcd->dev_manager, address, handle); 151 return found ? EOK : ENOENT; 146 return usb_device_manager_get_info_by_address( 147 &hcd->dev_manager, address, handle, NULL); 152 148 } 153 149 /*----------------------------------------------------------------------------*/ … … 166 162 usb_device_manager_release(&hcd->dev_manager, address); 167 163 return EOK; 164 } 165 /*----------------------------------------------------------------------------*/ 166 static int register_helper(endpoint_t *ep, void *arg) 167 { 168 hcd_t *hcd = arg; 169 assert(ep); 170 assert(hcd); 171 if (hcd->ep_add_hook) 172 return hcd->ep_add_hook(hcd, ep); 173 return EOK; 174 } 175 /*----------------------------------------------------------------------------*/ 176 static void unregister_helper(endpoint_t *ep, void *arg) 177 { 178 hcd_t *hcd = arg; 179 assert(ep); 180 assert(hcd); 181 if (hcd->ep_remove_hook) 182 hcd->ep_remove_hook(hcd, ep); 168 183 } 169 184 /*----------------------------------------------------------------------------*/ … … 180 195 /* Default address is not bound or registered, 181 196 * thus it does not provide speed info. */ 182 const usb_speed_t speed = (address == 0) ? ep_speed : 183 usb_device_manager_get_speed(&hcd->dev_manager, address); 197 usb_speed_t speed = ep_speed; 198 /* NOTE The function will return EINVAL and won't 199 * touch speed variable for default address */ 200 usb_device_manager_get_info_by_address( 201 &hcd->dev_manager, address, NULL, &speed); 184 202 185 203 usb_log_debug("Register endpoint %d:%d %s-%s %s %zuB %ums.\n", … … 188 206 max_packet_size, interval); 189 207 190 endpoint_t *ep = endpoint_get( 191 address, endpoint, direction, transfer_type, speed, max_packet_size); 192 if (!ep) 193 return ENOMEM; 194 int ret = EOK; 195 196 if (hcd->ep_add_hook) { 197 ret = hcd->ep_add_hook(hcd, ep); 198 } 199 if (ret != EOK) { 200 endpoint_destroy(ep); 201 return ret; 202 } 203 204 ret = usb_endpoint_manager_register_ep(&hcd->ep_manager, ep, size); 205 if (ret != EOK) { 206 endpoint_destroy(ep); 207 } 208 return ret; 208 return usb_endpoint_manager_add_ep(&hcd->ep_manager, address, endpoint, 209 direction, transfer_type, speed, max_packet_size, size, 210 register_helper, hcd); 209 211 } 210 212 /*----------------------------------------------------------------------------*/ … … 218 220 usb_log_debug("Unregister endpoint %d:%d %s.\n", 219 221 address, endpoint, usb_str_direction(direction)); 220 return usb_endpoint_manager_ unregister_ep(&hcd->ep_manager, address,221 endpoint, direction );222 return usb_endpoint_manager_remove_ep(&hcd->ep_manager, address, 223 endpoint, direction, unregister_helper, hcd); 222 224 } 223 225 /*----------------------------------------------------------------------------*/
Note:
See TracChangeset
for help on using the changeset viewer.