Changeset a4e18e1 in mainline for uspace/drv
- Timestamp:
- 2011-04-07T15:04:16Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 36cd378
- Parents:
- 9d06563 (diff), a82889e (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. - Location:
- uspace/drv
- Files:
-
- 5 added
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/batch.c
r9d06563 ra4e18e1 73 73 CHECK_NULL_DISPOSE_RETURN(instance, 74 74 "Failed to allocate batch instance.\n"); 75 usb_transfer_batch_init(instance, target, transfer_type, speed, max_packet_size,76 buffer, NULL, buffer_size, NULL, setup_size, func_in,77 func_ out, arg, fun, NULL);75 usb_transfer_batch_init(instance, target, transfer_type, speed, 76 max_packet_size, buffer, NULL, buffer_size, NULL, setup_size, 77 func_in, func_out, arg, fun, NULL, NULL); 78 78 79 79 if (buffer_size > 0) { -
uspace/drv/ohci/hc.c
r9d06563 ra4e18e1 92 92 instance->ddf_instance = fun; 93 93 usb_device_keeper_init(&instance->manager); 94 ret = bandwidth_init(&instance->bandwidth, BANDWIDTH_AVAILABLE_USB11,95 bandwidth_count_usb11);96 CHECK_RET_RETURN(ret, "Failed to initialize bandwidth allocator: %s.\n",94 ret = usb_endpoint_manager_init(&instance->ep_manager, 95 BANDWIDTH_AVAILABLE_USB11); 96 CHECK_RET_RETURN(ret, "Failed to initialize endpoint manager: %s.\n", 97 97 ret, str_error(ret)); 98 98 … … 183 183 * maintain reset for at least the time specified in USB spec (50 ms)*/ 184 184 async_usleep(50000); 185 186 /* turn off legacy emulation */ 187 volatile uint32_t *ohci_emulation_reg = 188 (uint32_t*)((char*)instance->registers + 0x100); 189 usb_log_info("OHCI legacy register status %p: %x.\n", 190 ohci_emulation_reg, *ohci_emulation_reg); 191 *ohci_emulation_reg = 0; 192 185 193 } 186 194 /*----------------------------------------------------------------------------*/ -
uspace/drv/ohci/hc.h
r9d06563 ra4e18e1 42 42 #include <usb/usb.h> 43 43 #include <usb/host/device_keeper.h> 44 #include <usb/host/ bandwidth.h>44 #include <usb/host/usb_endpoint_manager.h> 45 45 #include <usbhc_iface.h> 46 46 … … 48 48 #include "ohci_regs.h" 49 49 #include "root_hub.h" 50 #include "hw_struct/hcca.h" 50 51 51 52 typedef struct hc { … … 55 56 ddf_fun_t *ddf_instance; 56 57 usb_device_keeper_t manager; 57 bandwidth_t bandwidth;58 usb_endpoint_manager_t ep_manager; 58 59 fid_t interrupt_emulator; 59 60 } hc_t; -
uspace/drv/ohci/iface.c
r9d06563 ra4e18e1 162 162 address, endpoint, usb_str_transfer_type(transfer_type), 163 163 usb_str_speed(speed), direction, size, max_packet_size, interval); 164 return bandwidth_reserve(&hc->bandwidth, address, endpoint, direction,165 speed, transfer_type, max_packet_size, size, interval);164 // TODO use real endpoint here! 165 return usb_endpoint_manager_register_ep(&hc->ep_manager,NULL, 0); 166 166 } 167 167 /*----------------------------------------------------------------------------*/ … … 183 183 usb_log_debug("Unregister endpoint %d:%d %d.\n", 184 184 address, endpoint, direction); 185 return bandwidth_release(&hc->bandwidth, address, endpoint, direction); 186 187 return ENOTSUP; 185 return usb_endpoint_manager_unregister_ep(&hc->ep_manager, address, 186 endpoint, direction); 188 187 } 189 188 /*----------------------------------------------------------------------------*/ -
uspace/drv/pciintel/pci.c
r9d06563 ra4e18e1 107 107 } 108 108 109 size_t i; 110 for (i = 0; i < dev_data->hw_resources.count; i++) { 111 if (dev_data->hw_resources.resources[i].type == INTERRUPT) { 112 int irq = dev_data->hw_resources.resources[i].res.interrupt.irq; 113 int rc = async_req_1_0(irc_phone, IRC_ENABLE_INTERRUPT, irq); 109 size_t i = 0; 110 hw_resource_list_t *res = &dev_data->hw_resources; 111 for (; i < res->count; i++) { 112 if (res->resources[i].type == INTERRUPT) { 113 const int irq = res->resources[i].res.interrupt.irq; 114 const int rc = 115 async_req_1_0(irc_phone, IRC_ENABLE_INTERRUPT, irq); 114 116 if (rc != EOK) { 115 117 async_hangup(irc_phone); -
uspace/drv/uhci-hcd/batch.c
r9d06563 ra4e18e1 49 49 td_t *tds; 50 50 size_t transfers; 51 usb_device_keeper_t *manager;52 51 } uhci_batch_t; 53 52 … … 73 72 * @param[in] func_out function to call on outbound transaction completion 74 73 * @param[in] arg additional parameter to func_in or func_out 75 * @param[in] manager Pointer totoggle management structure.74 * @param[in] ep Pointer to endpoint toggle management structure. 76 75 * @return Valid pointer if all substructures were successfully created, 77 76 * NULL otherwise. … … 86 85 char* setup_buffer, size_t setup_size, 87 86 usbhc_iface_transfer_in_callback_t func_in, 88 usbhc_iface_transfer_out_callback_t func_out, void *arg, 89 usb_device_keeper_t *manager 87 usbhc_iface_transfer_out_callback_t func_out, void *arg, endpoint_t *ep 90 88 ) 91 89 { … … 105 103 CHECK_NULL_DISPOSE_RETURN(instance, 106 104 "Failed to allocate batch instance.\n"); 107 usb_transfer_batch_init(instance, target, transfer_type, speed, max_packet_size, 105 usb_transfer_batch_init(instance, target, 106 transfer_type, speed, max_packet_size, 108 107 buffer, NULL, buffer_size, NULL, setup_size, func_in, 109 func_out, arg, fun, NULL);108 func_out, arg, fun, ep, NULL); 110 109 111 110 … … 114 113 "Failed to allocate batch instance.\n"); 115 114 bzero(data, sizeof(uhci_batch_t)); 116 data->manager = manager;117 115 instance->private_data = data; 118 116 … … 180 178 instance, i, data->tds[i].status); 181 179 td_print_status(&data->tds[i]); 182 183 usb_device_keeper_set_toggle(data->manager, 184 instance->target, instance->direction, 185 td_toggle(&data->tds[i])); 180 if (instance->ep != NULL) 181 endpoint_toggle_set(instance->ep, 182 td_toggle(&data->tds[i])); 186 183 if (i > 0) 187 184 goto substract_ret; … … 310 307 311 308 const bool low_speed = instance->speed == USB_SPEED_LOW; 312 int toggle = usb_device_keeper_get_toggle( 313 data->manager, instance->target, instance->direction); 309 int toggle = endpoint_toggle_get(instance->ep); 314 310 assert(toggle == 0 || toggle == 1); 315 311 … … 342 338 } 343 339 td_set_ioc(&data->tds[transfer - 1]); 344 usb_device_keeper_set_toggle(data->manager, instance->target, 345 instance->direction, toggle); 340 endpoint_toggle_set(instance->ep, toggle); 346 341 } 347 342 /*----------------------------------------------------------------------------*/ -
uspace/drv/uhci-hcd/batch.h
r9d06563 ra4e18e1 35 35 #define DRV_UHCI_BATCH_H 36 36 37 #include <adt/list.h>38 39 37 #include <usbhc_iface.h> 40 38 #include <usb/usb.h> 41 39 #include <usb/host/device_keeper.h> 40 #include <usb/host/endpoint.h> 42 41 #include <usb/host/batch.h> 43 42 … … 57 56 usbhc_iface_transfer_out_callback_t func_out, 58 57 void *arg, 59 usb_device_keeper_t *manager58 endpoint_t *ep 60 59 ); 61 60 -
uspace/drv/uhci-hcd/hc.c
r9d06563 ra4e18e1 66 66 static int hc_interrupt_emulator(void *arg); 67 67 static int hc_debug_checker(void *arg); 68 68 #if 0 69 69 static bool usb_is_allowed( 70 70 bool low_speed, usb_transfer_type_t transfer, size_t size); 71 #endif 71 72 /*----------------------------------------------------------------------------*/ 72 73 /** Initialize UHCI hcd driver structure … … 239 240 usb_log_debug("Initialized device manager.\n"); 240 241 241 ret = bandwidth_init(&instance->bandwidth, BANDWIDTH_AVAILABLE_USB11, 242 bandwidth_count_usb11); 242 ret = 243 usb_endpoint_manager_init(&instance->ep_manager, 244 BANDWIDTH_AVAILABLE_USB11); 243 245 assert(ret == EOK); 244 246 … … 326 328 assert(instance); 327 329 assert(batch); 328 const int low_speed = (batch->speed == USB_SPEED_LOW);329 if (!usb_is_allowed(330 low_speed, batch->transfer_type, batch->max_packet_size)) {331 usb_log_error("Invalid USB transfer specified %s %d %zu.\n",332 usb_str_speed(batch->speed), batch->transfer_type,333 batch->max_packet_size);334 return ENOTSUP;335 }336 /* Check available bandwidth */337 if (batch->transfer_type == USB_TRANSFER_INTERRUPT ||338 batch->transfer_type == USB_TRANSFER_ISOCHRONOUS) {339 int ret =340 bandwidth_use(&instance->bandwidth, batch->target.address,341 batch->target.endpoint, batch->direction);342 if (ret != EOK) {343 usb_log_warning("Failed(%d) to use reserved bw: %s.\n",344 ret, str_error(ret));345 }346 }347 330 348 331 transfer_list_t *list = … … 398 381 case USB_TRANSFER_INTERRUPT: 399 382 case USB_TRANSFER_ISOCHRONOUS: { 383 /* 400 384 int ret = bandwidth_free(&instance->bandwidth, 401 385 batch->target.address, … … 406 390 "reserved bw: %s.\n", ret, 407 391 str_error(ret)); 392 */ 408 393 } 409 394 default: … … 529 514 * @return True if transaction is allowed by USB specs, false otherwise 530 515 */ 516 #if 0 531 517 bool usb_is_allowed( 532 518 bool low_speed, usb_transfer_type_t transfer, size_t size) … … 546 532 return false; 547 533 } 534 #endif 548 535 /** 549 536 * @} -
uspace/drv/uhci-hcd/hc.h
r9d06563 ra4e18e1 43 43 #include <usbhc_iface.h> 44 44 #include <usb/host/device_keeper.h> 45 #include <usb/host/ bandwidth.h>45 #include <usb/host/usb_endpoint_manager.h> 46 46 47 47 #include "batch.h" … … 85 85 typedef struct hc { 86 86 usb_device_keeper_t manager; 87 bandwidth_t bandwidth;87 usb_endpoint_manager_t ep_manager; 88 88 89 89 regs_t *registers; -
uspace/drv/uhci-hcd/hw_struct/queue_head.h
r9d06563 ra4e18e1 39 39 40 40 #include "link_pointer.h" 41 #include "utils/malloc32.h"42 41 43 42 typedef struct queue_head { -
uspace/drv/uhci-hcd/iface.c
r9d06563 ra4e18e1 36 36 37 37 #include <usb/debug.h> 38 #include <usb/host/endpoint.h> 38 39 39 40 #include "iface.h" … … 54 55 usb_device_keeper_reserve_default_address(&hc->manager, speed); 55 56 return EOK; 57 #if 0 58 endpoint_t *ep = malloc(sizeof(endpoint_t)); 59 if (ep == NULL) 60 return ENOMEM; 61 const size_t max_packet_size = speed == USB_SPEED_LOW ? 8 : 64; 62 endpoint_init(ep, USB_TRANSFER_CONTROL, speed, max_packet_size); 63 int ret; 64 try_retgister: 65 ret = usb_endpoint_manager_register_ep(&hc->ep_manager, 66 USB_ADDRESS_DEFAULT, 0, USB_DIRECTION_BOTH, ep, endpoint_destroy, 0); 67 if (ret == EEXISTS) { 68 async_usleep(1000); 69 goto try_retgister; 70 } 71 if (ret != EOK) { 72 endpoint_destroy(ep); 73 } 74 return ret; 75 #endif 56 76 } 57 77 /*----------------------------------------------------------------------------*/ … … 67 87 assert(hc); 68 88 usb_log_debug("Default address release.\n"); 89 // return usb_endpoint_manager_unregister_ep(&hc->ep_manager, 90 // USB_ADDRESS_DEFAULT, 0, USB_DIRECTION_BOTH); 69 91 usb_device_keeper_release_default_address(&hc->manager); 70 92 return EOK; … … 137 159 const usb_speed_t speed = 138 160 usb_device_keeper_get_speed(&hc->manager, address); 139 size_t size = max_packet_size; 161 const size_t size = 162 (transfer_type == USB_TRANSFER_INTERRUPT 163 || transfer_type == USB_TRANSFER_ISOCHRONOUS) ? 164 max_packet_size : 0; 165 int ret; 166 167 endpoint_t *ep = malloc(sizeof(endpoint_t)); 168 if (ep == NULL) 169 return ENOMEM; 170 ret = endpoint_init(ep, address, endpoint, direction, 171 transfer_type, speed, max_packet_size); 172 if (ret != EOK) { 173 free(ep); 174 return ret; 175 } 140 176 141 177 usb_log_debug("Register endpoint %d:%d %s %s(%d) %zu(%zu) %u.\n", 142 178 address, endpoint, usb_str_transfer_type(transfer_type), 143 179 usb_str_speed(speed), direction, size, max_packet_size, interval); 144 return bandwidth_reserve(&hc->bandwidth, address, endpoint, direction, 145 speed, transfer_type, max_packet_size, size, interval); 180 181 ret = usb_endpoint_manager_register_ep(&hc->ep_manager, ep, size); 182 if (ret != EOK) { 183 endpoint_destroy(ep); 184 } else { 185 usb_device_keeper_add_ep(&hc->manager, address, ep); 186 } 187 return ret; 146 188 } 147 189 /*----------------------------------------------------------------------------*/ … … 154 196 usb_log_debug("Unregister endpoint %d:%d %d.\n", 155 197 address, endpoint, direction); 156 return bandwidth_release(&hc->bandwidth, address, endpoint, direction); 198 return usb_endpoint_manager_unregister_ep(&hc->ep_manager, address, 199 endpoint, direction); 157 200 } 158 201 /*----------------------------------------------------------------------------*/ … … 175 218 hc_t *hc = fun_to_hc(fun); 176 219 assert(hc); 177 usb_speed_t speed =178 usb_device_keeper_get_speed(&hc->manager, target.address);179 220 180 221 usb_log_debug("Interrupt OUT %d:%d %zu(%zu).\n", 181 222 target.address, target.endpoint, size, max_packet_size); 182 223 224 size_t res_bw; 225 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager, 226 target.address, target.endpoint, USB_DIRECTION_OUT, &res_bw); 227 if (ep == NULL) { 228 usb_log_error("Endpoint(%d:%d) not registered for INT OUT.\n", 229 target.address, target.endpoint); 230 return ENOENT; 231 } 232 const size_t bw = bandwidth_count_usb11(ep->speed, ep->transfer_type, 233 size, ep->max_packet_size); 234 if (res_bw < bw) 235 { 236 usb_log_error("Endpoint(%d:%d) INT IN needs %zu bw " 237 "but only %zu is reserved.\n", 238 target.address, target.endpoint, bw, res_bw); 239 return ENOENT; 240 } 241 assert(ep->speed == 242 usb_device_keeper_get_speed(&hc->manager, target.address)); 243 assert(ep->max_packet_size == max_packet_size); 244 assert(ep->transfer_type == USB_TRANSFER_INTERRUPT); 245 183 246 usb_transfer_batch_t *batch = 184 batch_get(fun, target, USB_TRANSFER_INTERRUPT,max_packet_size,185 speed, data, size, NULL, 0, NULL, callback, arg, &hc->manager);247 batch_get(fun, target, ep->transfer_type, ep->max_packet_size, 248 ep->speed, data, size, NULL, 0, NULL, callback, arg, ep); 186 249 if (!batch) 187 250 return ENOMEM; … … 212 275 hc_t *hc = fun_to_hc(fun); 213 276 assert(hc); 214 usb_speed_t speed = 215 usb_device_keeper_get_speed(&hc->manager, target.address); 277 216 278 usb_log_debug("Interrupt IN %d:%d %zu(%zu).\n", 217 279 target.address, target.endpoint, size, max_packet_size); 218 280 281 size_t res_bw; 282 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager, 283 target.address, target.endpoint, USB_DIRECTION_IN, &res_bw); 284 if (ep == NULL) { 285 usb_log_error("Endpoint(%d:%d) not registered for INT IN.\n", 286 target.address, target.endpoint); 287 return ENOENT; 288 } 289 const size_t bw = bandwidth_count_usb11(ep->speed, ep->transfer_type, 290 size, ep->max_packet_size); 291 if (res_bw < bw) 292 { 293 usb_log_error("Endpoint(%d:%d) INT IN needs %zu bw " 294 "but only %zu bw is reserved.\n", 295 target.address, target.endpoint, bw, res_bw); 296 return ENOENT; 297 } 298 299 assert(ep->speed == 300 usb_device_keeper_get_speed(&hc->manager, target.address)); 301 assert(ep->max_packet_size == max_packet_size); 302 assert(ep->transfer_type == USB_TRANSFER_INTERRUPT); 303 219 304 usb_transfer_batch_t *batch = 220 batch_get(fun, target, USB_TRANSFER_INTERRUPT,max_packet_size,221 speed, data, size, NULL, 0, callback, NULL, arg, &hc->manager);305 batch_get(fun, target, ep->transfer_type, ep->max_packet_size, 306 ep->speed, data, size, NULL, 0, callback, NULL, arg, ep); 222 307 if (!batch) 223 308 return ENOMEM; … … 248 333 hc_t *hc = fun_to_hc(fun); 249 334 assert(hc); 250 usb_speed_t speed =251 usb_device_keeper_get_speed(&hc->manager, target.address);252 335 253 336 usb_log_debug("Bulk OUT %d:%d %zu(%zu).\n", 254 337 target.address, target.endpoint, size, max_packet_size); 255 338 339 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager, 340 target.address, target.endpoint, USB_DIRECTION_OUT, NULL); 341 if (ep == NULL) { 342 usb_log_error("Endpoint(%d:%d) not registered for BULK OUT.\n", 343 target.address, target.endpoint); 344 return ENOENT; 345 } 346 assert(ep->speed == 347 usb_device_keeper_get_speed(&hc->manager, target.address)); 348 assert(ep->max_packet_size == max_packet_size); 349 assert(ep->transfer_type == USB_TRANSFER_BULK); 350 256 351 usb_transfer_batch_t *batch = 257 batch_get(fun, target, USB_TRANSFER_BULK, max_packet_size, speed,258 data, size, NULL, 0, NULL, callback, arg, &hc->manager);352 batch_get(fun, target, ep->transfer_type, ep->max_packet_size, 353 ep->speed, data, size, NULL, 0, NULL, callback, arg, ep); 259 354 if (!batch) 260 355 return ENOMEM; … … 285 380 hc_t *hc = fun_to_hc(fun); 286 381 assert(hc); 287 usb_speed_t speed =288 usb_device_keeper_get_speed(&hc->manager, target.address);289 382 usb_log_debug("Bulk IN %d:%d %zu(%zu).\n", 290 383 target.address, target.endpoint, size, max_packet_size); 291 384 385 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager, 386 target.address, target.endpoint, USB_DIRECTION_IN, NULL); 387 if (ep == NULL) { 388 usb_log_error("Endpoint(%d:%d) not registered for BULK IN.\n", 389 target.address, target.endpoint); 390 return ENOENT; 391 } 392 assert(ep->speed == 393 usb_device_keeper_get_speed(&hc->manager, target.address)); 394 assert(ep->max_packet_size == max_packet_size); 395 assert(ep->transfer_type == USB_TRANSFER_BULK); 396 292 397 usb_transfer_batch_t *batch = 293 batch_get(fun, target, USB_TRANSFER_BULK, max_packet_size, speed,294 data, size, NULL, 0, callback, NULL, arg, &hc->manager);398 batch_get(fun, target, ep->transfer_type, ep->max_packet_size, 399 ep->speed, data, size, NULL, 0, callback, NULL, arg, ep); 295 400 if (!batch) 296 401 return ENOMEM; … … 328 433 usb_log_debug("Control WRITE (%d) %d:%d %zu(%zu).\n", 329 434 speed, target.address, target.endpoint, size, max_packet_size); 435 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager, 436 target.address, target.endpoint, USB_DIRECTION_BOTH, NULL); 437 if (ep == NULL) { 438 usb_log_warning("Endpoint(%d:%d) not registered for CONTROL.\n", 439 target.address, target.endpoint); 440 } 330 441 331 442 if (setup_size != 8) … … 334 445 usb_transfer_batch_t *batch = 335 446 batch_get(fun, target, USB_TRANSFER_CONTROL, max_packet_size, speed, 336 data, size, setup_data, setup_size, NULL, callback, arg, 337 &hc->manager); 447 data, size, setup_data, setup_size, NULL, callback, arg, ep); 338 448 if (!batch) 339 449 return ENOMEM; … … 373 483 usb_log_debug("Control READ(%d) %d:%d %zu(%zu).\n", 374 484 speed, target.address, target.endpoint, size, max_packet_size); 485 endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager, 486 target.address, target.endpoint, USB_DIRECTION_BOTH, NULL); 487 if (ep == NULL) { 488 usb_log_warning("Endpoint(%d:%d) not registered for CONTROL.\n", 489 target.address, target.endpoint); 490 } 375 491 usb_transfer_batch_t *batch = 376 492 batch_get(fun, target, USB_TRANSFER_CONTROL, max_packet_size, speed, 377 data, size, setup_data, setup_size, callback, NULL, arg, 378 &hc->manager); 493 data, size, setup_data, setup_size, callback, NULL, arg, ep); 379 494 if (!batch) 380 495 return ENOMEM; -
uspace/drv/uhci-hcd/transfer_list.h
r9d06563 ra4e18e1 39 39 #include "batch.h" 40 40 #include "hw_struct/queue_head.h" 41 #include "utils/malloc32.h" 41 42 42 43 typedef struct transfer_list -
uspace/drv/uhci-hcd/utils/malloc32.h
r9d06563 ra4e18e1 36 36 37 37 #include <assert.h> 38 #include <errno.h> 38 39 #include <malloc.h> 39 40 #include <mem.h> -
uspace/drv/uhci-rhd/main.c
r9d06563 ra4e18e1 44 44 45 45 #define NAME "uhci-rhd" 46 46 47 static int hc_get_my_registers(ddf_dev_t *dev, 47 48 uintptr_t *io_reg_address, size_t *io_reg_size); 48 #if 049 49 /*----------------------------------------------------------------------------*/ 50 static int usb_iface_get_hc_handle(ddf_fun_t *fun, devman_handle_t *handle) 51 { 52 assert(fun); 53 assert(fun->driver_data); 54 assert(handle); 55 56 *handle = ((uhci_root_hub_t*)fun->driver_data)->hc_handle; 57 58 return EOK; 59 } 60 /*----------------------------------------------------------------------------*/ 61 static usb_iface_t uhci_rh_usb_iface = { 62 .get_hc_handle = usb_iface_get_hc_handle, 63 .get_address = usb_iface_get_address_hub_impl 64 }; 65 /*----------------------------------------------------------------------------*/ 66 static ddf_dev_ops_t uhci_rh_ops = { 67 .interfaces[USB_DEV_IFACE] = &uhci_rh_usb_iface, 68 }; 69 #endif 70 /*----------------------------------------------------------------------------*/ 71 /** Initialize a new ddf driver instance of UHCI root hub. 72 * 73 * @param[in] device DDF instance of the device to initialize. 74 * @return Error code. 75 */ 76 static int uhci_rh_add_device(ddf_dev_t *device) 77 { 78 if (!device) 79 return ENOTSUP; 80 81 usb_log_debug2("%s called device %d\n", __FUNCTION__, device->handle); 82 83 //device->ops = &uhci_rh_ops; 84 uintptr_t io_regs = 0; 85 size_t io_size = 0; 86 87 int ret = hc_get_my_registers(device, &io_regs, &io_size); 88 if (ret != EOK) { 89 usb_log_error("Failed to get registers from parent HC: %s.\n", 90 str_error(ret)); 91 } 92 usb_log_debug("I/O regs at %#X (size %zu).\n", io_regs, io_size); 93 94 uhci_root_hub_t *rh = malloc(sizeof(uhci_root_hub_t)); 95 if (!rh) { 96 usb_log_error("Failed to allocate driver instance.\n"); 97 return ENOMEM; 98 } 99 100 ret = uhci_root_hub_init(rh, (void*)io_regs, io_size, device); 101 if (ret != EOK) { 102 usb_log_error("Failed to initialize driver instance: %s.\n", 103 str_error(ret)); 104 free(rh); 105 return ret; 106 } 107 108 device->driver_data = rh; 109 usb_log_info("Controlling root hub `%s' (%llu).\n", 110 device->name, device->handle); 111 return EOK; 112 } 50 static int uhci_rh_add_device(ddf_dev_t *device); 113 51 /*----------------------------------------------------------------------------*/ 114 52 static driver_ops_t uhci_rh_driver_ops = { … … 132 70 { 133 71 printf(NAME ": HelenOS UHCI root hub driver.\n"); 72 usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME); 73 return ddf_driver_main(&uhci_rh_driver); 74 } 75 /*----------------------------------------------------------------------------*/ 76 /** Initialize a new ddf driver instance of UHCI root hub. 77 * 78 * @param[in] device DDF instance of the device to initialize. 79 * @return Error code. 80 */ 81 static int uhci_rh_add_device(ddf_dev_t *device) 82 { 83 if (!device) 84 return EINVAL; 134 85 135 usb_log_ enable(USB_LOG_LEVEL_DEFAULT, NAME);86 usb_log_debug2("%s called device %d\n", __FUNCTION__, device->handle); 136 87 137 return ddf_driver_main(&uhci_rh_driver); 88 uintptr_t io_regs = 0; 89 size_t io_size = 0; 90 uhci_root_hub_t *rh = NULL; 91 int ret = EOK; 92 93 #define CHECK_RET_FREE_RH_RETURN(ret, message...) \ 94 if (ret != EOK) { \ 95 usb_log_error(message); \ 96 if (rh) \ 97 free(rh); \ 98 return ret; \ 99 } else (void)0 100 101 ret = hc_get_my_registers(device, &io_regs, &io_size); 102 CHECK_RET_FREE_RH_RETURN(ret, 103 "Failed(%d) to get registers from HC: %s.\n", ret, str_error(ret)); 104 usb_log_debug("I/O regs at %#x (size %zu).\n", io_regs, io_size); 105 106 rh = malloc(sizeof(uhci_root_hub_t)); 107 ret = (rh == NULL) ? ENOMEM : EOK; 108 CHECK_RET_FREE_RH_RETURN(ret, 109 "Failed to allocate rh driver instance.\n"); 110 111 ret = uhci_root_hub_init(rh, (void*)io_regs, io_size, device); 112 CHECK_RET_FREE_RH_RETURN(ret, 113 "Failed(%d) to initialize rh driver instance: %s.\n", 114 ret, str_error(ret)); 115 116 device->driver_data = rh; 117 usb_log_info("Controlling root hub '%s' (%llu).\n", 118 device->name, device->handle); 119 return EOK; 138 120 } 139 121 /*----------------------------------------------------------------------------*/ … … 156 138 } 157 139 158 int rc;159 160 140 hw_resource_list_t hw_resources; 161 rc = hw_res_get_resource_list(parent_phone, &hw_resources); 162 if (rc != EOK) { 163 goto leave; 141 int ret = hw_res_get_resource_list(parent_phone, &hw_resources); 142 if (ret != EOK) { 143 async_hangup(parent_phone); 144 return ret; 164 145 } 165 146 … … 168 149 bool io_found = false; 169 150 170 size_t i ;171 for ( i = 0; i < hw_resources.count; i++) {151 size_t i = 0; 152 for (; i < hw_resources.count; i++) { 172 153 hw_resource_t *res = &hw_resources.resources[i]; 173 switch (res->type) 174 { 175 case IO_RANGE: 176 io_address = (uintptr_t) res->res.io_range.address; 154 if (res->type == IO_RANGE) { 155 io_address = res->res.io_range.address; 177 156 io_size = res->res.io_range.size; 178 157 io_found = true; 179 180 default:181 break;182 158 } 183 159 } 160 async_hangup(parent_phone); 184 161 185 162 if (!io_found) { 186 rc = ENOENT; 187 goto leave; 163 return ENOENT; 188 164 } 189 190 165 if (io_reg_address != NULL) { 191 166 *io_reg_address = io_address; … … 194 169 *io_reg_size = io_size; 195 170 } 196 rc = EOK; 197 198 leave: 199 async_hangup(parent_phone); 200 return rc; 171 return EOK; 201 172 } 202 173 /** -
uspace/drv/uhci-rhd/port.c
r9d06563 ra4e18e1 43 43 #include "port.h" 44 44 45 static int uhci_port_check(void *port); 46 static int uhci_port_reset_enable(int portno, void *arg); 45 47 static int uhci_port_new_device(uhci_port_t *port, usb_speed_t speed); 46 48 static int uhci_port_remove_device(uhci_port_t *port); 47 49 static int uhci_port_set_enabled(uhci_port_t *port, bool enabled); 48 static int uhci_port_check(void *port);49 static int uhci_port_reset_enable(int portno, void *arg);50 50 static void uhci_port_print_status( 51 51 uhci_port_t *port, const port_status_t value); … … 74 74 pio_write_16(port->address, value); 75 75 } 76 77 76 /*----------------------------------------------------------------------------*/ 78 77 /** Initialize UHCI root hub port instance. … … 259 258 260 259 usb_address_t dev_addr; 261 int r c= usb_hc_new_device_wrapper(port->rh, &port->hc_connection,260 int ret = usb_hc_new_device_wrapper(port->rh, &port->hc_connection, 262 261 speed, uhci_port_reset_enable, port->number, port, 263 262 &dev_addr, &port->attached_device, NULL, NULL, NULL); 264 263 265 if (r c!= EOK) {264 if (ret != EOK) { 266 265 usb_log_error("%s: Failed(%d) to add device: %s.\n", 267 port->id_string, r c, str_error(rc));266 port->id_string, ret, str_error(ret)); 268 267 uhci_port_set_enabled(port, false); 269 return r c;268 return ret; 270 269 } 271 270 … … 287 286 int uhci_port_remove_device(uhci_port_t *port) 288 287 { 289 usb_log_error("%s: Don't know how to remove device % d.\n",290 port->id_string, (unsigned int)port->attached_device);291 return E OK;288 usb_log_error("%s: Don't know how to remove device %llu.\n", 289 port->id_string, port->attached_device); 290 return ENOTSUP; 292 291 } 293 292 /*----------------------------------------------------------------------------*/ … … 341 340 (value & STATUS_CONNECTED_CHANGED) ? " CONNECTED-CHANGE," : "", 342 341 (value & STATUS_CONNECTED) ? " CONNECTED," : "", 343 (value & STATUS_ALWAYS_ONE) ? " ALWAYS ONE" : " ERR OR: NO ALWAYS ONE"342 (value & STATUS_ALWAYS_ONE) ? " ALWAYS ONE" : " ERR: NO ALWAYS ONE" 344 343 ); 345 344 } -
uspace/drv/uhci-rhd/root_hub.c
r9d06563 ra4e18e1 51 51 assert(instance); 52 52 assert(rh); 53 int ret;54 53 55 54 /* Allow access to root hub port registers */ 56 55 assert(sizeof(port_status_t) * UHCI_ROOT_HUB_PORT_COUNT <= size); 57 56 port_status_t *regs; 58 ret = pio_enable(addr, size, (void**)®s);57 int ret = pio_enable(addr, size, (void**)®s); 59 58 if (ret < 0) { 60 59 usb_log_error( … … 84 83 * 85 84 * @param[in] instance Root hub structure to use. 86 * @return Error code.87 85 */ 88 intuhci_root_hub_fini(uhci_root_hub_t* instance)86 void uhci_root_hub_fini(uhci_root_hub_t* instance) 89 87 { 90 88 assert(instance); … … 93 91 uhci_port_fini(&instance->ports[i]); 94 92 } 95 return EOK;96 93 } 97 94 /*----------------------------------------------------------------------------*/ -
uspace/drv/uhci-rhd/root_hub.h
r9d06563 ra4e18e1 50 50 uhci_root_hub_t *instance, void *addr, size_t size, ddf_dev_t *rh); 51 51 52 intuhci_root_hub_fini(uhci_root_hub_t *instance);52 void uhci_root_hub_fini(uhci_root_hub_t *instance); 53 53 #endif 54 54 /** -
uspace/drv/usbmid/explore.c
r9d06563 ra4e18e1 48 48 }; 49 49 50 /** Find starting indexes of all interface descriptors in a configuration. 51 * 52 * @param config_descriptor Full configuration descriptor. 53 * @param config_descriptor_size Size of @p config_descriptor in bytes. 54 * @param interface_positions Array where to store indexes of interfaces. 55 * @param interface_count Size of @p interface_positions array. 56 * @return Number of found interfaces. 57 * @retval (size_t)-1 Error occured. 58 */ 59 static size_t find_interface_descriptors(uint8_t *config_descriptor, 60 size_t config_descriptor_size, 61 size_t *interface_positions, size_t interface_count) 50 /** Tell whether given interface is already in the list. 51 * 52 * @param list List of usbmid_interface_t members to be searched. 53 * @param interface_no Interface number caller is looking for. 54 * @return Interface @p interface_no is already present in the list. 55 */ 56 static bool interface_in_list(link_t *list, int interface_no) 62 57 { 63 if (interface_count == 0) { 64 return (size_t) -1; 65 } 66 58 link_t *l; 59 for (l = list->next; l != list; l = l->next) { 60 usbmid_interface_t *iface 61 = list_get_instance(l, usbmid_interface_t, link); 62 if (iface->interface_no == interface_no) { 63 return true; 64 } 65 } 66 67 return false; 68 } 69 70 /** Create list of interfaces from configuration descriptor. 71 * 72 * @param config_descriptor Configuration descriptor. 73 * @param config_descriptor_size Size of configuration descriptor in bytes. 74 * @param list List where to add the interfaces. 75 */ 76 static void create_interfaces(uint8_t *config_descriptor, 77 size_t config_descriptor_size, link_t *list) 78 { 67 79 usb_dp_parser_data_t data = { 68 80 .data = config_descriptor, … … 75 87 }; 76 88 77 uint8_t *interface = usb_dp_get_nested_descriptor(&parser, &data,89 uint8_t *interface_ptr = usb_dp_get_nested_descriptor(&parser, &data, 78 90 data.data); 79 if (interface == NULL) { 80 return (size_t) -1; 81 } 82 if (interface[1] != USB_DESCTYPE_INTERFACE) { 83 return (size_t) -1; 84 } 85 86 size_t found_interfaces = 0; 87 interface_positions[found_interfaces] = interface - config_descriptor; 88 found_interfaces++; 89 90 while (interface != NULL) { 91 interface = usb_dp_get_sibling_descriptor(&parser, &data, 92 data.data, interface); 93 if ((interface != NULL) 94 && (found_interfaces < interface_count) 95 && (interface[1] == USB_DESCTYPE_INTERFACE)) { 96 interface_positions[found_interfaces] 97 = interface - config_descriptor; 98 found_interfaces++; 99 } 100 } 101 102 return found_interfaces; 91 if (interface_ptr == NULL) { 92 return; 93 } 94 95 do { 96 if (interface_ptr[1] != USB_DESCTYPE_INTERFACE) { 97 goto next_descriptor; 98 } 99 100 usb_standard_interface_descriptor_t *interface 101 = (usb_standard_interface_descriptor_t *) interface_ptr; 102 103 /* Skip alternate interfaces. */ 104 if (!interface_in_list(list, interface->interface_number)) { 105 usbmid_interface_t *iface 106 = malloc(sizeof(usbmid_interface_t)); 107 if (iface == NULL) { 108 break; 109 } 110 link_initialize(&iface->link); 111 iface->fun = NULL; 112 iface->interface_no = interface->interface_number; 113 iface->interface = interface; 114 115 list_append(&iface->link, list); 116 } 117 118 /* TODO: add the alternatives and create match ids from them 119 * as well. 120 */ 121 122 next_descriptor: 123 interface_ptr = usb_dp_get_sibling_descriptor(&parser, &data, 124 data.data, interface_ptr); 125 126 } while (interface_ptr != NULL); 127 103 128 } 104 129 … … 130 155 (usb_standard_configuration_descriptor_t *) config_descriptor_raw; 131 156 132 size_t *interface_descriptors133 = malloc(sizeof(size_t) * config_descriptor->interface_count);134 if (interface_descriptors == NULL) {135 usb_log_error("Out of memory (wanted %zuB).\n",136 sizeof(size_t) * config_descriptor->interface_count);137 free(config_descriptor_raw);138 return false;139 }140 size_t interface_descriptors_count141 = find_interface_descriptors(142 config_descriptor_raw, config_descriptor_size,143 interface_descriptors, config_descriptor->interface_count);144 145 if (interface_descriptors_count == (size_t) -1) {146 usb_log_error("Problem parsing configuration descriptor.\n");147 free(interface_descriptors);148 return false;149 }150 151 157 /* Select the first configuration */ 152 158 rc = usb_request_set_configuration(&dev->ctrl_pipe, … … 155 161 usb_log_error("Failed to set device configuration: %s.\n", 156 162 str_error(rc)); 157 free(interface_descriptors); 158 return false; 159 } 160 163 return false; 164 } 161 165 162 166 /* Create control function */ … … 164 168 if (ctl_fun == NULL) { 165 169 usb_log_error("Failed to create control function.\n"); 166 free(interface_descriptors);167 170 return false; 168 171 } … … 174 177 usb_log_error("Failed to bind control function: %s.\n", 175 178 str_error(rc)); 176 free(interface_descriptors); 177 return false; 178 } 179 180 /* Spawn interface children */ 181 size_t i; 182 for (i = 0; i < interface_descriptors_count; i++) { 183 usb_standard_interface_descriptor_t *interface 184 = (usb_standard_interface_descriptor_t *) 185 (config_descriptor_raw + interface_descriptors[i]); 186 usb_log_debug2("Interface descriptor at index %zu (type %d).\n", 187 interface_descriptors[i], (int) interface->descriptor_type); 179 return false; 180 } 181 182 /* Create interface children. */ 183 link_t interface_list; 184 list_initialize(&interface_list); 185 create_interfaces(config_descriptor_raw, config_descriptor_size, 186 &interface_list); 187 188 link_t *link; 189 for (link = interface_list.next; link != &interface_list; 190 link = link->next) { 191 usbmid_interface_t *iface = list_get_instance(link, 192 usbmid_interface_t, link); 193 188 194 usb_log_info("Creating child for interface %d (%s).\n", 189 (int) interface->interface_number, 190 usb_str_class(interface->interface_class)); 191 rc = usbmid_spawn_interface_child(dev, &dev->descriptors.device, 192 interface); 195 (int) iface->interface_no, 196 usb_str_class(iface->interface->interface_class)); 197 198 rc = usbmid_spawn_interface_child(dev, iface, 199 &dev->descriptors.device, iface->interface); 193 200 if (rc != EOK) { 194 201 usb_log_error("Failed to create interface child: %s.\n", -
uspace/drv/usbmid/usbmid.c
r9d06563 ra4e18e1 79 79 }; 80 80 81 /** Create new interface for USB MID device.82 *83 * @param fun Backing generic DDF device function (representing interface).84 * @param iface_no Interface number.85 * @return New interface.86 * @retval NULL Error occured.87 */88 usbmid_interface_t *usbmid_interface_create(ddf_fun_t *fun, int iface_no)89 {90 usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t));91 if (iface == NULL) {92 usb_log_error("Out of memory (wanted %zuB).\n",93 sizeof(usbmid_interface_t));94 return NULL;95 }96 97 iface->fun = fun;98 iface->interface_no = iface_no;99 100 return iface;101 }102 103 81 104 82 /** Spawn new child device from one interface. 105 83 * 106 84 * @param parent Parent MID device. 85 * @param iface Interface information. 107 86 * @param device_descriptor Device descriptor. 108 87 * @param interface_descriptor Interface descriptor. … … 110 89 */ 111 90 int usbmid_spawn_interface_child(usb_device_t *parent, 91 usbmid_interface_t *iface, 112 92 const usb_standard_device_descriptor_t *device_descriptor, 113 93 const usb_standard_interface_descriptor_t *interface_descriptor) … … 115 95 ddf_fun_t *child = NULL; 116 96 char *child_name = NULL; 117 usbmid_interface_t *child_as_interface = NULL;118 97 int rc; 119 98 … … 137 116 } 138 117 118 iface->fun = child; 139 119 140 141 child_as_interface = usbmid_interface_create(child, 142 (int) interface_descriptor->interface_number); 143 if (child_as_interface == NULL) { 144 rc = ENOMEM; 145 goto error_leave; 146 } 147 148 child->driver_data = child_as_interface; 120 child->driver_data = iface; 149 121 child->ops = &child_device_ops; 150 122 … … 172 144 free(child_name); 173 145 } 174 if (child_as_interface != NULL) {175 free(child_as_interface);176 }177 146 178 147 return rc; -
uspace/drv/usbmid/usbmid.h
r9d06563 ra4e18e1 37 37 #define USBMID_H_ 38 38 39 #include <adt/list.h> 39 40 #include <ddf/driver.h> 40 41 #include <usb/usb.h> … … 49 50 /** Function container. */ 50 51 ddf_fun_t *fun; 51 52 /** Interface descriptor. */ 53 usb_standard_interface_descriptor_t *interface; 52 54 /** Interface number. */ 53 55 int interface_no; 56 /** List link. */ 57 link_t link; 54 58 } usbmid_interface_t; 55 59 56 usbmid_interface_t *usbmid_interface_create(ddf_fun_t *, int);57 60 bool usbmid_explore_device(usb_device_t *); 58 int usbmid_spawn_interface_child(usb_device_t *, 61 int usbmid_spawn_interface_child(usb_device_t *, usbmid_interface_t *, 59 62 const usb_standard_device_descriptor_t *, 60 63 const usb_standard_interface_descriptor_t *);
Note:
See TracChangeset
for help on using the changeset viewer.