Changeset 41924f30 in mainline
- Timestamp:
- 2017-10-12T14:07:27Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a5976973
- Parents:
- 7e74911
- Location:
- uspace
- Files:
-
- 6 added
- 2 deleted
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbhub/status.h
r7e74911 r41924f30 112 112 if ((status & USB_HUB_PORT_STATUS_HIGH_SPEED) != 0) 113 113 return USB_SPEED_HIGH; 114 /* TODO: add super speed */ 114 115 return USB_SPEED_FULL; 115 116 } -
uspace/drv/bus/usb/xhci/Makefile
r7e74911 r41924f30 45 45 46 46 SOURCES = \ 47 bus.c \ 48 commands.c \ 49 debug.c \ 50 endpoint.c \ 47 51 hc.c \ 48 endpoint.c \ 49 debug.c \ 50 trb_ring.c \ 52 main.c \ 53 rh.c \ 51 54 scratchpad.c \ 52 commands.c \53 55 transfers.c \ 54 rh.c \ 55 main.c 56 trb_ring.c 56 57 57 58 TEST_SOURCES = \ -
uspace/drv/bus/usb/xhci/endpoint.c
r7e74911 r41924f30 34 34 */ 35 35 36 #include <usb/host/endpoint.h> 37 36 38 #include <errno.h> 37 39 40 #include "bus.h" 38 41 #include "endpoint.h" 39 42 40 int endpoint_init(hcd_t *hcd, endpoint_t *ep)43 int xhci_endpoint_init(xhci_endpoint_t *xhci_ep, xhci_bus_t *xhci_bus) 41 44 { 42 assert(ep); 43 xhci_endpoint_t *xhci_ep = malloc(sizeof(xhci_endpoint_t)); 44 if (xhci_ep == NULL) 45 return ENOMEM; 45 assert(xhci_ep); 46 assert(xhci_bus); 47 48 bus_t *bus = &xhci_bus->base; 49 endpoint_t *ep = &xhci_ep->base; 50 51 endpoint_init(ep, bus); 46 52 47 53 /* FIXME: Set xhci_ep->slot_id */ 48 54 49 fibril_mutex_lock(&ep->guard); 50 ep->hc_data.data = xhci_ep; 51 /* FIXME: The two handlers below should be implemented. */ 52 ep->hc_data.toggle_get = NULL; 53 ep->hc_data.toggle_set = NULL; 54 fibril_mutex_unlock(&ep->guard); 55 56 usb_log_debug("Endpoint %d:%d initialized.", ep->address, ep->endpoint); 55 usb_log_debug("XHCI Endpoint %d:%d initialized.", ep->target.address, ep->target.endpoint); 57 56 58 57 return EOK; 59 58 } 60 59 61 void endpoint_fini(hcd_t *hcd, endpoint_t *ep)60 void xhci_endpoint_fini(xhci_endpoint_t *xhci_ep) 62 61 { 63 assert(hcd); 64 assert(ep); 65 xhci_endpoint_t *xhci_ep = endpoint_get(ep); 62 assert(xhci_ep); 63 66 64 /* FIXME: Tear down TR's? */ 67 if (xhci_ep) {68 free(xhci_ep);69 }70 65 71 fibril_mutex_lock(&ep->guard); 72 ep->hc_data.data = NULL; 73 ep->hc_data.toggle_get = NULL; 74 ep->hc_data.toggle_set = NULL; 75 fibril_mutex_unlock(&ep->guard); 66 endpoint_t *ep = &xhci_ep->base; 76 67 77 usb_log_debug(" Endpoint %d:%d destroyed.", ep->address, ep->endpoint);68 usb_log_debug("XHCI Endpoint %d:%d destroyed.", ep->target.address, ep->target.endpoint); 78 69 } 79 70 -
uspace/drv/bus/usb/xhci/endpoint.h
r7e74911 r41924f30 43 43 #include <usb/host/hcd.h> 44 44 45 typedef struct xhci_endpoint xhci_endpoint_t; 46 typedef struct xhci_bus xhci_bus_t; 47 45 48 enum { 46 49 EP_TYPE_INVALID = 0, … … 56 59 /** Connector structure linking endpoint context to the endpoint. */ 57 60 typedef struct xhci_endpoint { 61 endpoint_t base; /**< Inheritance. Keep this first. */ 62 58 63 uint32_t slot_id; 59 64 } xhci_endpoint_t; 60 65 61 int endpoint_init(hcd_t *hcd, endpoint_t *ep);62 void endpoint_fini(hcd_t *hcd, endpoint_t *ep);66 int xhci_endpoint_init(xhci_endpoint_t *, xhci_bus_t *); 67 void xhci_endpoint_fini(xhci_endpoint_t *); 63 68 64 static inline xhci_endpoint_t * endpoint_get(constendpoint_t *ep)69 static inline xhci_endpoint_t * xhci_endpoint_get(endpoint_t *ep) 65 70 { 66 71 assert(ep); 67 return ep->hc_data.data;72 return (xhci_endpoint_t *) ep; 68 73 } 69 74 -
uspace/drv/bus/usb/xhci/hc.c
r7e74911 r41924f30 447 447 448 448 /* Check for root hub communication */ 449 if (batch->ep-> address == xhci_rh_get_address(&hc->rh)) {449 if (batch->ep->target.address == xhci_rh_get_address(&hc->rh)) { 450 450 usb_log_debug("XHCI root hub request.\n"); 451 451 return xhci_rh_schedule(&hc->rh, batch); … … 453 453 454 454 usb_log_debug2("EP(%d:%d) started %s transfer of size %lu.", 455 batch->ep-> address, batch->ep->endpoint,455 batch->ep->target.address, batch->ep->target.endpoint, 456 456 usb_str_transfer_type(batch->ep->transfer_type), 457 457 batch->buffer_size); 458 458 459 if (!batch->ep-> address) {459 if (!batch->ep->target.address) { 460 460 usb_log_error("Attempted to schedule transfer to address 0."); 461 461 return EINVAL; -
uspace/drv/bus/usb/xhci/hc.h
r7e74911 r41924f30 43 43 #include "trb_ring.h" 44 44 #include "rh.h" 45 #include "bus.h" 45 46 46 47 typedef struct xhci_virt_device_ctx { … … 72 73 xhci_rh_t rh; 73 74 75 /* Bus bookkeeping */ 76 xhci_bus_t bus; 77 74 78 /* Cached capabilities */ 75 79 unsigned max_slots; -
uspace/drv/bus/usb/xhci/main.c
r7e74911 r41924f30 66 66 .schedule = hcd_schedule, 67 67 .irq_hook = hcd_interrupt, 68 .ep_add_hook = endpoint_init,69 .ep_remove_hook = endpoint_fini,70 68 .status_hook = hcd_status, 71 69 } … … 83 81 goto err; 84 82 83 if ((err = xhci_bus_init(&hc->bus, hcd))) 84 goto err; 85 85 86 if ((err = hc_init_memory(hc))) 86 87 goto err; 87 88 88 hcd_set_implementation(hcd, hc, &xhci_ddf_hc_driver.ops );89 hcd_set_implementation(hcd, hc, &xhci_ddf_hc_driver.ops, &hc->bus.base); 89 90 90 91 return EOK; -
uspace/drv/bus/usb/xhci/rh.c
r7e74911 r41924f30 266 266 assert(rh); 267 267 assert(batch); 268 const usb_target_t target = {{ 269 .address = batch->ep->address, 270 .endpoint = batch->ep->endpoint, 271 }}; 268 const usb_target_t target = batch->ep->target; 272 269 batch->error = virthub_base_request(&rh->base, target, 273 270 usb_transfer_batch_direction(batch), (void*)batch->setup_buffer, … … 294 291 rh->unfinished_interrupt_transfer = NULL; 295 292 if (batch) { 296 const usb_target_t target = {{ 297 .address = batch->ep->address, 298 .endpoint = batch->ep->endpoint, 299 }}; 293 const usb_target_t target = batch->ep->target; 300 294 batch->error = virthub_base_request(&rh->base, target, 301 295 usb_transfer_batch_direction(batch), -
uspace/drv/bus/usb/xhci/transfers.c
r7e74911 r41924f30 36 36 #include <usb/host/utils/malloc32.h> 37 37 #include <usb/debug.h> 38 #include "endpoint.h" 38 39 #include "hc.h" 39 40 #include "hw_struct/trb.h" … … 141 142 return EINVAL; 142 143 } 143 if (batch->ep-> endpoint != 0 || batch->ep->transfer_type != USB_TRANSFER_CONTROL) {144 if (batch->ep->target.endpoint != 0 || batch->ep->transfer_type != USB_TRANSFER_CONTROL) { 144 145 /* This method only works for control transfers. */ 145 146 usb_log_error("Attempted to schedule control transfer to non 0 endpoint."); … … 147 148 } 148 149 149 uint8_t slot_id = batch->ep->hc_data.slot_id; 150 xhci_endpoint_t *xhci_ep = xhci_endpoint_get(batch->ep); 151 152 uint8_t slot_id = xhci_ep->slot_id; 150 153 xhci_trb_ring_t* ring = hc->dcbaa_virt[slot_id].trs[0]; 151 154 … … 230 233 } 231 234 232 uint8_t slot_id = batch->ep->hc_data.slot_id; 233 xhci_trb_ring_t* ring = hc->dcbaa_virt[slot_id].trs[batch->ep->endpoint]; 235 xhci_endpoint_t *xhci_ep = xhci_endpoint_get(batch->ep); 236 uint8_t slot_id = xhci_ep->slot_id; 237 xhci_trb_ring_t* ring = hc->dcbaa_virt[slot_id].trs[batch->ep->target.endpoint]; 234 238 235 239 xhci_transfer_t *transfer = xhci_transfer_alloc(batch); -
uspace/lib/usbhost/Makefile
r7e74911 r41924f30 39 39 src/endpoint.c \ 40 40 src/hcd.c \ 41 src/usb_bus.c \ 41 src/bus.c \ 42 src/usb2_bus.c \ 43 src/bandwidth.c \ 42 44 src/usb_transfer_batch.c 43 45 -
uspace/lib/usbhost/include/usb/host/ddf_helpers.h
r7e74911 r41924f30 38 38 39 39 #include <usb/host/hcd.h> 40 #include <usb/host/ usb_bus.h>40 #include <usb/host/bus.h> 41 41 #include <usb/usb.h> 42 42 … … 76 76 int hcd_ddf_add_hc(ddf_dev_t *device, const ddf_hc_driver_t *driver); 77 77 78 int hcd_ddf_setup_hc(ddf_dev_t *device, usb_speed_t max_speed, 79 size_t bw, bw_count_func_t bw_count); 78 int hcd_ddf_setup_hc(ddf_dev_t *device); 80 79 void hcd_ddf_clean_hc(ddf_dev_t *device); 81 80 int hcd_ddf_setup_root_hub(ddf_dev_t *device); -
uspace/lib/usbhost/include/usb/host/endpoint.h
r7e74911 r41924f30 32 32 /** @file 33 33 * 34 * Endpoint structure is tightly coupled to the bus. The bus controls the 35 * life-cycle of endpoint. In order to keep endpoints lightweight, operations 36 * on endpoints are part of the bus structure. 37 * 34 38 */ 35 39 #ifndef LIBUSBHOST_HOST_ENDPOINT_H … … 42 46 #include <atomic.h> 43 47 48 typedef struct bus bus_t; 49 44 50 /** Host controller side endpoint structure. */ 45 51 typedef struct endpoint { 52 /** Managing bus */ 53 bus_t *bus; 46 54 /** Reference count. */ 47 55 atomic_t refcnt; … … 49 57 link_t link; 50 58 /** USB address. */ 51 usb_address_t address; 52 /** USB endpoint number. */ 53 usb_endpoint_t endpoint; 59 usb_target_t target; 54 60 /** Communication direction. */ 55 61 usb_direction_t direction; … … 62 68 /** Additional opportunities per uframe */ 63 69 unsigned packets; 64 /** Necessarybandwidth. */70 /** Reserved bandwidth. */ 65 71 size_t bandwidth; 66 72 /** Value of the toggle bit. */ 67 73 unsigned toggle:1; 68 74 /** True if there is a batch using this scheduled for this endpoint. */ 69 volatilebool active;75 bool active; 70 76 /** Protects resources and active status changes. */ 71 77 fibril_mutex_t guard; … … 77 83 unsigned port; 78 84 } tt; 79 /** Optional device specific data. */ 80 struct { 81 /** Device specific data. */ 82 void *data; 83 /** Callback to get the value of toggle bit. */ 84 int (*toggle_get)(void *); 85 /** Callback to set the value of toggle bit. */ 86 void (*toggle_set)(void *, int); 87 /** Device slot id. */ 88 uint8_t slot_id; 89 } hc_data; 85 86 /* This structure is meant to be extended by overriding. */ 90 87 } endpoint_t; 91 88 92 extern endpoint_t *endpoint_create(usb_address_t, usb_endpoint_t, 93 usb_direction_t, usb_transfer_type_t, usb_speed_t, size_t, unsigned int, 94 size_t, usb_address_t, unsigned int); 95 extern void endpoint_destroy(endpoint_t *); 89 extern void endpoint_init(endpoint_t *, bus_t *); 96 90 97 91 extern void endpoint_add_ref(endpoint_t *); 98 92 extern void endpoint_del_ref(endpoint_t *); 99 100 extern void endpoint_set_hc_data(endpoint_t *, void *, int (*)(void *),101 void (*)(void *, int));102 extern void endpoint_clear_hc_data(endpoint_t *);103 93 104 94 extern void endpoint_use(endpoint_t *); … … 106 96 107 97 extern int endpoint_toggle_get(endpoint_t *); 108 extern void endpoint_toggle_set(endpoint_t *, int);98 extern void endpoint_toggle_set(endpoint_t *, unsigned); 109 99 110 100 /** list_get_instance wrapper. -
uspace/lib/usbhost/include/usb/host/hcd.h
r7e74911 r41924f30 38 38 39 39 #include <usb/host/endpoint.h> 40 #include <usb/host/ usb_bus.h>40 #include <usb/host/bus.h> 41 41 #include <usb/host/usb_transfer_batch.h> 42 42 #include <usb/usb.h> … … 71 71 struct hcd { 72 72 /** Endpoint manager. */ 73 usb_bus_tbus;73 bus_t *bus; 74 74 75 75 /** Interrupt replacement fibril */ … … 78 78 /** Driver implementation */ 79 79 hcd_ops_t ops; 80 80 81 /** Device specific driver data. */ 81 82 void * driver_data; 82 83 }; 83 84 84 extern void hcd_init(hcd_t * , usb_speed_t, size_t, bw_count_func_t);85 extern void hcd_init(hcd_t *); 85 86 86 87 static inline void hcd_set_implementation(hcd_t *hcd, void *data, 87 const hcd_ops_t *ops )88 const hcd_ops_t *ops, bus_t *bus) 88 89 { 89 90 assert(hcd); … … 91 92 hcd->driver_data = data; 92 93 hcd->ops = *ops; 94 hcd->bus = bus; 93 95 } else { 94 96 memset(&hcd->ops, 0, sizeof(hcd->ops)); -
uspace/lib/usbhost/include/usb/host/usb_transfer_batch.h
r7e74911 r41924f30 90 90 */ 91 91 #define USB_TRANSFER_BATCH_ARGS(batch) \ 92 (batch).ep-> address, (batch).ep->endpoint, \92 (batch).ep->target.address, (batch).ep->target.endpoint, \ 93 93 usb_str_speed((batch).ep->speed), \ 94 94 usb_str_transfer_type_short((batch).ep->transfer_type), \ -
uspace/lib/usbhost/src/ddf_helpers.c
r7e74911 r41924f30 469 469 470 470 /* This checks whether the default address is reserved and gets speed */ 471 int ret = usb_bus_get_speed(&hcd->bus, USB_ADDRESS_DEFAULT, &speed);471 int ret = bus_get_speed(hcd->bus, USB_ADDRESS_DEFAULT, &speed); 472 472 if (ret != EOK) { 473 473 usb_log_error("Failed to verify speed: %s.", str_error(ret)); … … 623 623 assert(hcd); 624 624 625 hcd_reserve_default_address(hcd, hcd->bus.max_speed);625 hcd_reserve_default_address(hcd, USB_SPEED_MAX); 626 626 const int ret = hcd_ddf_new_device(device, NULL, 0); 627 627 hcd_release_default_address(hcd); … … 639 639 * This function does all the ddf work for hc driver. 640 640 */ 641 int hcd_ddf_setup_hc(ddf_dev_t *device, usb_speed_t max_speed, 642 size_t bw, bw_count_func_t bw_count) 641 int hcd_ddf_setup_hc(ddf_dev_t *device) 643 642 { 644 643 assert(device); … … 650 649 } 651 650 instance->root_hub = NULL; 652 hcd_init(&instance->hcd , max_speed, bw, bw_count);651 hcd_init(&instance->hcd); 653 652 654 653 int ret = ENOMEM; … … 851 850 { 852 851 assert(driver); 853 static const struct { size_t bw; bw_count_func_t bw_count; }bw[] = {854 [USB_SPEED_FULL] = { .bw = BANDWIDTH_AVAILABLE_USB11,855 .bw_count = bandwidth_count_usb11 },856 [USB_SPEED_HIGH] = { .bw = BANDWIDTH_AVAILABLE_USB11,857 .bw_count = bandwidth_count_usb11 },858 [USB_SPEED_SUPER] = { .bw = BANDWIDTH_AVAILABLE_USB11,859 .bw_count = bandwidth_count_usb11 },860 };861 852 862 853 int ret = EOK; 863 const usb_speed_t speed = driver->hc_speed;864 if (speed >= ARRAY_SIZE(bw) || bw[speed].bw == 0) {865 usb_log_error("Driver `%s' reported unsupported speed: %s",866 driver->name, usb_str_speed(speed));867 return ENOTSUP;868 }869 854 870 855 hw_res_list_parsed_t hw_res; … … 877 862 } 878 863 879 ret = hcd_ddf_setup_hc(device , speed, bw[speed].bw, bw[speed].bw_count);864 ret = hcd_ddf_setup_hc(device); 880 865 if (ret != EOK) { 881 866 usb_log_error("Failed to setup generic HCD.\n"); -
uspace/lib/usbhost/src/endpoint.c
r7e74911 r41924f30 1 1 /* 2 2 * Copyright (c) 2011 Jan Vesely 3 * Copyright (c) 2017 Ondrej Hlavaty <aearsis@eideo.cz> 3 4 * All rights reserved. 4 5 * … … 35 36 36 37 #include <usb/host/endpoint.h> 38 #include <usb/host/bus.h> 37 39 38 40 #include <assert.h> 41 #include <atomic.h> 42 #include <mem.h> 39 43 #include <stdlib.h> 40 #include <atomic.h>41 44 42 /** Allocate ad initialize endpoint_t structure. 43 * @param address USB address. 44 * @param endpoint USB endpoint number. 45 * @param direction Communication direction. 46 * @param type USB transfer type. 47 * @param speed Communication speed. 48 * @param max_packet_size Maximum size of data packets. 49 * @param bw Required bandwidth. 50 * @return Pointer to initialized endpoint_t structure, NULL on failure. 45 /** Initialize provided endpoint structure. 51 46 */ 52 endpoint_t * endpoint_create(usb_address_t address, usb_endpoint_t endpoint, 53 usb_direction_t direction, usb_transfer_type_t type, usb_speed_t speed, 54 size_t max_packet_size, unsigned packets, size_t bw, 55 usb_address_t tt_address, unsigned tt_p) 47 void endpoint_init(endpoint_t *ep, bus_t *bus) 56 48 { 57 endpoint_t *instance = malloc(sizeof(endpoint_t)); 58 if (instance) { 59 atomic_set(&instance->refcnt, 0); 60 instance->address = address; 61 instance->endpoint = endpoint; 62 instance->direction = direction; 63 instance->transfer_type = type; 64 instance->speed = speed; 65 instance->max_packet_size = max_packet_size; 66 instance->packets = packets; 67 instance->bandwidth = bw; 68 instance->toggle = 0; 69 instance->active = false; 70 instance->tt.address = tt_address; 71 instance->tt.port = tt_p; 72 instance->hc_data.data = NULL; 73 instance->hc_data.toggle_get = NULL; 74 instance->hc_data.toggle_set = NULL; 75 link_initialize(&instance->link); 76 fibril_mutex_initialize(&instance->guard); 77 fibril_condvar_initialize(&instance->avail); 78 } 79 return instance; 49 memset(ep, 0, sizeof(endpoint_t)); 50 51 ep->bus = bus; 52 atomic_set(&ep->refcnt, 0); 53 link_initialize(&ep->link); 54 fibril_mutex_initialize(&ep->guard); 55 fibril_condvar_initialize(&ep->avail); 80 56 } 81 57 82 /** Properly dispose of endpoint_t structure. 83 * @param instance endpoint_t structure. 84 */ 85 void endpoint_destroy(endpoint_t *instance) 58 void endpoint_add_ref(endpoint_t *ep) 86 59 { 87 assert(instance); 88 assert(!instance->active); 89 assert(instance->hc_data.data == NULL); 90 free(instance); 60 atomic_inc(&ep->refcnt); 91 61 } 92 62 93 void endpoint_ add_ref(endpoint_t *instance)63 void endpoint_del_ref(endpoint_t *ep) 94 64 { 95 atomic_inc(&instance->refcnt); 96 } 65 if (atomic_predec(&ep->refcnt) == 0) { 66 if (ep->bus->ops.destroy_endpoint) { 67 ep->bus->ops.destroy_endpoint(ep); 68 } 69 else { 70 assert(!ep->active); 97 71 98 void endpoint_del_ref(endpoint_t *instance) 99 { 100 if (atomic_predec(&instance->refcnt) == 0) 101 endpoint_destroy(instance); 102 } 103 104 /** Set device specific data and hooks. 105 * @param instance endpoint_t structure. 106 * @param data device specific data. 107 * @param toggle_get Hook to call when retrieving value of toggle bit. 108 * @param toggle_set Hook to call when setting the value of toggle bit. 109 */ 110 void endpoint_set_hc_data(endpoint_t *instance, 111 void *data, int (*toggle_get)(void *), void (*toggle_set)(void *, int)) 112 { 113 assert(instance); 114 fibril_mutex_lock(&instance->guard); 115 instance->hc_data.data = data; 116 instance->hc_data.toggle_get = toggle_get; 117 instance->hc_data.toggle_set = toggle_set; 118 fibril_mutex_unlock(&instance->guard); 119 } 120 121 /** Clear device specific data and hooks. 122 * @param instance endpoint_t structure. 123 * @note This function does not free memory pointed to by data pointer. 124 */ 125 void endpoint_clear_hc_data(endpoint_t *instance) 126 { 127 assert(instance); 128 endpoint_set_hc_data(instance, NULL, NULL, NULL); 72 /* Assume mostly the eps will be allocated by malloc. */ 73 free(ep); 74 } 75 } 129 76 } 130 77 131 78 /** Mark the endpoint as active and block access for further fibrils. 132 * @param instanceendpoint_t structure.79 * @param ep endpoint_t structure. 133 80 */ 134 void endpoint_use(endpoint_t * instance)81 void endpoint_use(endpoint_t *ep) 135 82 { 136 assert( instance);83 assert(ep); 137 84 /* Add reference for active endpoint. */ 138 endpoint_add_ref( instance);139 fibril_mutex_lock(& instance->guard);140 while ( instance->active)141 fibril_condvar_wait(& instance->avail, &instance->guard);142 instance->active = true;143 fibril_mutex_unlock(& instance->guard);85 endpoint_add_ref(ep); 86 fibril_mutex_lock(&ep->guard); 87 while (ep->active) 88 fibril_condvar_wait(&ep->avail, &ep->guard); 89 ep->active = true; 90 fibril_mutex_unlock(&ep->guard); 144 91 } 145 92 146 93 /** Mark the endpoint as inactive and allow access for further fibrils. 147 * @param instanceendpoint_t structure.94 * @param ep endpoint_t structure. 148 95 */ 149 void endpoint_release(endpoint_t * instance)96 void endpoint_release(endpoint_t *ep) 150 97 { 151 assert( instance);152 fibril_mutex_lock(& instance->guard);153 instance->active = false;154 fibril_mutex_unlock(& instance->guard);155 fibril_condvar_signal(& instance->avail);98 assert(ep); 99 fibril_mutex_lock(&ep->guard); 100 ep->active = false; 101 fibril_mutex_unlock(&ep->guard); 102 fibril_condvar_signal(&ep->avail); 156 103 /* Drop reference for active endpoint. */ 157 endpoint_del_ref( instance);104 endpoint_del_ref(ep); 158 105 } 159 106 160 /** Get the value of toggle bit. 161 * @param instance endpoint_t structure.162 * @ note Will use provided hook.107 /** Get the value of toggle bit. Either uses the toggle_get op, or just returns 108 * the value of the toggle. 109 * @param ep endpoint_t structure. 163 110 */ 164 int endpoint_toggle_get(endpoint_t * instance)111 int endpoint_toggle_get(endpoint_t *ep) 165 112 { 166 assert(instance); 167 fibril_mutex_lock(&instance->guard); 168 if (instance->hc_data.toggle_get) 169 instance->toggle = 170 instance->hc_data.toggle_get(instance->hc_data.data); 171 const int ret = instance->toggle; 172 fibril_mutex_unlock(&instance->guard); 113 assert(ep); 114 fibril_mutex_lock(&ep->guard); 115 const int ret = ep->bus->ops.endpoint_get_toggle 116 ? ep->bus->ops.endpoint_get_toggle(ep) 117 : ep->toggle; 118 fibril_mutex_unlock(&ep->guard); 173 119 return ret; 174 120 } 175 121 176 /** Set the value of toggle bit. 177 * @param instance endpoint_t structure.178 * @ note Will use provided hook.122 /** Set the value of toggle bit. Either uses the toggle_set op, or just sets 123 * the toggle inside. 124 * @param ep endpoint_t structure. 179 125 */ 180 void endpoint_toggle_set(endpoint_t * instance, inttoggle)126 void endpoint_toggle_set(endpoint_t *ep, unsigned toggle) 181 127 { 182 assert( instance);128 assert(ep); 183 129 assert(toggle == 0 || toggle == 1); 184 fibril_mutex_lock(&instance->guard); 185 instance->toggle = toggle; 186 if (instance->hc_data.toggle_set) 187 instance->hc_data.toggle_set(instance->hc_data.data, toggle); 188 fibril_mutex_unlock(&instance->guard); 130 fibril_mutex_lock(&ep->guard); 131 if (ep->bus->ops.endpoint_set_toggle) { 132 ep->bus->ops.endpoint_set_toggle(ep, toggle); 133 } 134 else { 135 ep->toggle = toggle; 136 } 137 fibril_mutex_unlock(&ep->guard); 189 138 } 139 190 140 191 141 /** -
uspace/lib/usbhost/src/hcd.c
r7e74911 r41924f30 44 44 #include "hcd.h" 45 45 46 /** Calls ep_add_hook upon endpoint registration. 46 47 /*[>* Calls ep_add_hook upon endpoint registration. 47 48 * @param ep Endpoint to be registered. 48 49 * @param arg hcd_t in disguise. 49 50 * @return Error code. 50 */ 51 * OH TODO: remove 52 <] 51 53 static int register_helper(endpoint_t *ep, void *arg) 52 54 { … … 59 61 } 60 62 61 /** Calls ep_remove_hook upon endpoint removal.63 [>* Calls ep_remove_hook upon endpoint removal. 62 64 * @param ep Endpoint to be unregistered. 63 65 * @param arg hcd_t in disguise. 64 */ 66 * OH TODO: remove 67 <] 65 68 static void unregister_helper(endpoint_t *ep, void *arg) 66 69 { … … 72 75 } 73 76 74 /** Calls ep_remove_hook upon endpoint removal. Prints warning.77 [>* Calls ep_remove_hook upon endpoint removal. Prints warning. 75 78 * * @param ep Endpoint to be unregistered. 76 79 * * @param arg hcd_t in disguise. 77 * */ 80 * OH TODO: remove 81 * <] 78 82 static void unregister_helper_warn(endpoint_t *ep, void *arg) 79 83 { 80 84 assert(ep); 81 85 usb_log_warning("Endpoint %d:%d %s was left behind, removing.\n", 82 ep-> address, ep->endpoint, usb_str_direction(ep->direction));86 ep->target.address, ep->target.endpoint, usb_str_direction(ep->direction)); 83 87 unregister_helper(ep, arg); 84 88 } 85 89 */ 86 90 87 91 /** Initialize hcd_t structure. … … 93 97 * @param bw_count Bandwidth compute function, passed to endpoint manager. 94 98 */ 95 void hcd_init(hcd_t *hcd, usb_speed_t max_speed, size_t bandwidth, 96 bw_count_func_t bw_count) 97 { 98 assert(hcd); 99 usb_bus_init(&hcd->bus, bandwidth, bw_count, max_speed); 100 101 hcd_set_implementation(hcd, NULL, NULL); 99 void hcd_init(hcd_t *hcd) { 100 assert(hcd); 101 102 hcd_set_implementation(hcd, NULL, NULL, NULL); 102 103 } 103 104 … … 106 107 assert(hcd); 107 108 usb_address_t address = 0; 108 const int ret = usb_bus_request_address( 109 &hcd->bus, &address, false, speed); 109 const int ret = bus_request_address(hcd->bus, &address, false, speed); 110 110 if (ret != EOK) 111 111 return ret; … … 116 116 { 117 117 assert(hcd); 118 return usb_bus_remove_address(&hcd->bus, address,119 unregister_helper_warn, hcd);118 return bus_release_address(hcd->bus, address); 119 // OH TODO removed helper 120 120 } 121 121 … … 124 124 assert(hcd); 125 125 usb_address_t address = 0; 126 return usb_bus_request_address(&hcd->bus, &address, true, speed);126 return bus_request_address(hcd->bus, &address, true, speed); 127 127 } 128 128 … … 132 132 { 133 133 assert(hcd); 134 return usb_bus_add_ep(&hcd->bus, target.address, 135 target.endpoint, dir, type, max_packet_size, packets, size, 136 register_helper, hcd, tt_address, tt_port); 134 135 /* Temporary reference */ 136 endpoint_t *ep = bus_create_endpoint(hcd->bus); 137 if (!ep) 138 return ENOMEM; 139 140 ep->target = target; 141 ep->direction = dir; 142 ep->transfer_type = type; 143 ep->max_packet_size = max_packet_size; 144 ep->packets = packets; 145 146 ep->tt.address = tt_address; 147 ep->tt.port = tt_port; 148 149 const int err = bus_register_endpoint(hcd->bus, ep); 150 151 /* drop Temporary reference */ 152 endpoint_del_ref(ep); 153 154 return err; 137 155 } 138 156 … … 140 158 { 141 159 assert(hcd); 142 return usb_bus_remove_ep(&hcd->bus, target.address, 143 target.endpoint, dir, unregister_helper, hcd); 160 endpoint_t *ep = bus_find_endpoint(hcd->bus, target, dir); 161 if (!ep) 162 return ENOENT; 163 164 return bus_release_endpoint(hcd->bus, ep); 165 // OH TODO removed helper 144 166 } 145 167 … … 159 181 usb_log_debug2("Reseting toggle on %d:%d.\n", 160 182 toggle->target.address, toggle->target.endpoint); 161 usb_bus_reset_toggle(&toggle->hcd->bus,183 bus_reset_toggle(toggle->hcd->bus, 162 184 toggle->target, toggle->target.endpoint == 0); 163 185 } … … 185 207 assert(hcd); 186 208 187 endpoint_t *ep = usb_bus_find_ep(&hcd->bus, 188 target.address, target.endpoint, direction); 209 endpoint_t *ep = bus_find_endpoint(hcd->bus, target, direction); 189 210 if (ep == NULL) { 190 211 usb_log_error("Endpoint(%d:%d) not registered for %s.\n", … … 196 217 name, target.address, target.endpoint, size, ep->max_packet_size); 197 218 198 const size_t bw = bandwidth_count_usb11( 199 ep->speed, ep->transfer_type, size, ep->max_packet_size); 219 const size_t bw = bus_count_bw(ep, size); 200 220 /* Check if we have enough bandwidth reserved */ 201 221 if (ep->bandwidth < bw) { 202 222 usb_log_error("Endpoint(%d:%d) %s needs %zu bw " 203 223 "but only %zu is reserved.\n", 204 ep-> address, ep->endpoint, name, bw, ep->bandwidth);224 ep->target.address, ep->target.endpoint, name, bw, ep->bandwidth); 205 225 return ENOSPC; 206 226 }
Note:
See TracChangeset
for help on using the changeset viewer.