Changes in uspace/drv/uhci-hcd/root_hub.c [687efaa:4abc304] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-hcd/root_hub.c
r687efaa r4abc304 34 34 #include <assert.h> 35 35 #include <errno.h> 36 #include <str_error.h> 36 37 #include <stdio.h> 38 #include <ops/hw_res.h> 39 37 40 #include <usb_iface.h> 38 41 #include <usb/debug.h> 39 42 40 43 #include "root_hub.h" 44 #include "uhci.h" 41 45 42 extern device_ops_t child_ops;43 46 /*----------------------------------------------------------------------------*/ 44 int setup_root_hub(device_t **device, device_t *hc) 47 static int usb_iface_get_hc_handle_rh_impl(ddf_fun_t *root_hub_fun, 48 devman_handle_t *handle) 45 49 { 46 assert(device); 47 device_t *hub = create_device(); 50 ddf_fun_t *hc_fun = root_hub_fun->driver_data; 51 assert(hc_fun != NULL); 52 53 *handle = hc_fun->handle; 54 55 return EOK; 56 } 57 /*----------------------------------------------------------------------------*/ 58 static int usb_iface_get_address_rh_impl(ddf_fun_t *fun, devman_handle_t handle, 59 usb_address_t *address) 60 { 61 assert(fun); 62 ddf_fun_t *hc_fun = fun->driver_data; 63 assert(hc_fun); 64 uhci_t *hc = fun_to_uhci(hc_fun); 65 assert(hc); 66 67 usb_address_t addr = device_keeper_find(&hc->device_manager, 68 handle); 69 if (addr < 0) { 70 return addr; 71 } 72 73 if (address != NULL) { 74 *address = addr; 75 } 76 77 return EOK; 78 } 79 /*----------------------------------------------------------------------------*/ 80 usb_iface_t usb_iface_root_hub_fun_impl = { 81 .get_hc_handle = usb_iface_get_hc_handle_rh_impl, 82 .get_address = usb_iface_get_address_rh_impl 83 }; 84 /*----------------------------------------------------------------------------*/ 85 static hw_resource_list_t *get_resource_list(ddf_fun_t *dev) 86 { 87 assert(dev); 88 ddf_fun_t *hc_ddf_instance = dev->driver_data; 89 assert(hc_ddf_instance); 90 uhci_t *hc = hc_ddf_instance->driver_data; 91 assert(hc); 92 93 //TODO: fix memory leak 94 hw_resource_list_t *resource_list = malloc(sizeof(hw_resource_list_t)); 95 assert(resource_list); 96 resource_list->count = 1; 97 resource_list->resources = malloc(sizeof(hw_resource_t)); 98 assert(resource_list->resources); 99 resource_list->resources[0].type = IO_RANGE; 100 resource_list->resources[0].res.io_range.address = 101 ((uintptr_t)hc->registers) + 0x10; // see UHCI design guide 102 resource_list->resources[0].res.io_range.size = 4; 103 resource_list->resources[0].res.io_range.endianness = LITTLE_ENDIAN; 104 105 return resource_list; 106 } 107 /*----------------------------------------------------------------------------*/ 108 static hw_res_ops_t hw_res_iface = { 109 .get_resource_list = get_resource_list, 110 .enable_interrupt = NULL 111 }; 112 /*----------------------------------------------------------------------------*/ 113 static ddf_dev_ops_t root_hub_ops = { 114 .interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl, 115 .interfaces[HW_RES_DEV_IFACE] = &hw_res_iface 116 }; 117 /*----------------------------------------------------------------------------*/ 118 int setup_root_hub(ddf_fun_t **fun, ddf_dev_t *hc) 119 { 120 assert(fun); 121 assert(hc); 122 int ret; 123 124 ddf_fun_t *hub = ddf_fun_create(hc, fun_inner, "root-hub"); 48 125 if (!hub) { 49 126 usb_log_error("Failed to create root hub device structure.\n"); 50 return ENOMEM;51 }52 char *name;53 int ret = asprintf(&name, "UHCI Root Hub");54 if (ret < 0) {55 usb_log_error("Failed to create root hub name.\n");56 free(hub);57 127 return ENOMEM; 58 128 } … … 62 132 if (ret < 0) { 63 133 usb_log_error("Failed to create root hub match string.\n"); 64 free(hub); 65 free(name); 134 ddf_fun_destroy(hub); 66 135 return ENOMEM; 67 136 } 68 137 69 match_id_t *match_id = create_match_id();70 if ( !match_id) {71 usb_log_error("Failed to create root hub match id.\n");72 free(hub);73 free(match_str);74 return ENOMEM;138 ret = ddf_fun_add_match_id(hub, match_str, 100); 139 if (ret != EOK) { 140 usb_log_error("Failed(%d) to add root hub match id: %s\n", 141 ret, str_error(ret)); 142 ddf_fun_destroy(hub); 143 return ret; 75 144 } 76 match_id->id = match_str;77 match_id->score = 90;78 145 79 add_match_id(&hub->match_ids, match_id); 80 hub->name = name; 81 hub->parent = hc; 82 hub->ops = &child_ops; 146 hub->ops = &root_hub_ops; 83 147 84 * device= hub;148 *fun = hub; 85 149 return EOK; 86 150 }
Note:
See TracChangeset
for help on using the changeset viewer.