Changeset 56db65d in mainline for uspace/lib/usbhost/src/usb2_bus.c
- Timestamp:
- 2017-10-24T11:06:32Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0206d35
- Parents:
- 894f58c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/src/usb2_bus.c
r894f58c r56db65d 91 91 } 92 92 93 static const usb_endpoint_desc_t usb2_default_control_ep = { 94 .endpoint_no = 0, 95 .transfer_type = USB_TRANSFER_CONTROL, 96 .direction = USB_DIRECTION_BOTH, 97 .max_packet_size = CTRL_PIPE_MIN_PACKET_SIZE, 98 .packets = 1, 99 }; 100 101 102 static const usb_target_t usb2_default_target = {{ 103 .address = USB_ADDRESS_DEFAULT, 104 .endpoint = 0, 105 }}; 106 93 107 static int usb2_bus_address_device(bus_t *bus, hcd_t *hcd, device_t *dev) 94 108 { 95 109 int err; 96 97 static const usb_target_t default_target = {{98 .address = USB_ADDRESS_DEFAULT,99 .endpoint = 0,100 }};101 110 102 111 /** Reserve address early, we want pretty log messages */ … … 111 120 /* Add default pipe on default address */ 112 121 usb_log_debug("Device(%d): Adding default target (0:0)", address); 113 err = bus_add_ep(bus, dev, 0, USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL, 114 CTRL_PIPE_MIN_PACKET_SIZE, CTRL_PIPE_MIN_PACKET_SIZE, 1); 122 err = bus_add_ep(bus, dev, &usb2_default_control_ep); 115 123 if (err != EOK) { 116 124 usb_log_error("Device(%d): Failed to add default target: %s.", … … 126 134 usb_log_debug("Device(%d): Requesting first 8B of device descriptor.", 127 135 address); 128 ssize_t got = hcd_send_batch_sync(hcd, dev, default_target, USB_DIRECTION_IN,136 ssize_t got = hcd_send_batch_sync(hcd, dev, usb2_default_target, USB_DIRECTION_IN, 129 137 (char *) &desc, CTRL_PIPE_MIN_PACKET_SIZE, *(uint64_t *)&get_device_desc_8, 130 138 "read first 8 bytes of dev descriptor"); … … 134 142 usb_log_error("Device(%d): Failed to get 8B of dev descr: %s.", 135 143 address, str_error(err)); 136 goto err_default_ target;144 goto err_default_control_ep; 137 145 } 138 146 … … 141 149 142 150 usb_log_debug("Device(%d): Setting USB address.", address); 143 err = hcd_send_batch_sync(hcd, dev, default_target, USB_DIRECTION_OUT,151 err = hcd_send_batch_sync(hcd, dev, usb2_default_target, USB_DIRECTION_OUT, 144 152 NULL, 0, *(uint64_t *)&set_address, "set address"); 145 153 if (err != 0) { 146 154 usb_log_error("Device(%d): Failed to set new address: %s.", 147 155 address, str_error(got)); 148 goto err_default_ target;156 goto err_default_control_ep; 149 157 } 150 158 151 159 dev->address = address; 160 161 const usb_endpoint_desc_t control_ep = { 162 .endpoint_no = 0, 163 .transfer_type = USB_TRANSFER_CONTROL, 164 .direction = USB_DIRECTION_BOTH, 165 .max_packet_size = ED_MPS_PACKET_SIZE_GET(uint16_usb2host(desc.max_packet_size)), 166 .packets = ED_MPS_TRANS_OPPORTUNITIES_GET(uint16_usb2host(desc.max_packet_size)), 167 }; 152 168 153 169 /* Register EP on the new address */ 154 170 usb_log_debug("Device(%d): Registering control EP.", address); 155 err = bus_add_ep(bus, dev, 0, USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL, 156 ED_MPS_PACKET_SIZE_GET(uint16_usb2host(desc.max_packet_size)), 157 ED_MPS_TRANS_OPPORTUNITIES_GET(uint16_usb2host(desc.max_packet_size)), 158 ED_MPS_PACKET_SIZE_GET(uint16_usb2host(desc.max_packet_size))); 171 err = bus_add_ep(bus, dev, &control_ep); 159 172 if (err != EOK) { 160 173 usb_log_error("Device(%d): Failed to register EP0: %s", 161 174 address, str_error(err)); 162 goto err_default_ target;163 } 164 165 bus_remove_ep(bus, dev, default_target, USB_DIRECTION_BOTH);166 return EOK; 167 168 err_default_ target:169 bus_remove_ep(bus, dev, default_target, USB_DIRECTION_BOTH);175 goto err_default_control_ep; 176 } 177 178 bus_remove_ep(bus, dev, usb2_default_target, USB_DIRECTION_BOTH); 179 return EOK; 180 181 err_default_control_ep: 182 bus_remove_ep(bus, dev, usb2_default_target, USB_DIRECTION_BOTH); 170 183 err_address: 171 184 bus_release_address(bus, address); … … 278 291 * @param endpoint USB endpoint number. 279 292 */ 280 static int usb2_bus_register_ep(bus_t *bus_base, endpoint_t *ep )293 static int usb2_bus_register_ep(bus_t *bus_base, endpoint_t *ep, const usb_endpoint_desc_t *desc) 281 294 { 282 295 usb2_bus_t *bus = bus_to_usb2_bus(bus_base); 283 296 assert(ep); 284 297 285 usb_address_t address = ep->target.address; 286 287 if (!usb_address_is_valid(address)) 288 return EINVAL; 289 290 /* Check for speed and address */ 291 if (!bus->devices[address].occupied) 292 return ENOENT; 298 assert(ep->device); 299 300 /* Extract USB2-related information from endpoint_desc */ 301 ep->target = (usb_target_t) {{ 302 .address = ep->device->address, 303 .endpoint = desc->endpoint_no, 304 }}; 305 ep->direction = desc->direction; 306 ep->transfer_type = desc->transfer_type; 307 ep->max_packet_size = desc->max_packet_size; 308 ep->packets = desc->packets; 309 310 ep->bandwidth = bus_base->ops.count_bw(ep, desc->max_packet_size); 293 311 294 312 /* Check for existence */ … … 300 318 return ENOSPC; 301 319 302 list_append(&ep->link, get_list(bus, ep-> target.address));320 list_append(&ep->link, get_list(bus, ep->device->address)); 303 321 bus->free_bw -= ep->bandwidth; 304 322
Note:
See TracChangeset
for help on using the changeset viewer.