Changes in uspace/drv/bus/usb/uhci/uhci.c [1dc4a5e:d57122c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/uhci/uhci.c
r1dc4a5e rd57122c 41 41 42 42 #include "uhci.h" 43 #include "iface.h"44 43 #include "pci.h" 45 44 … … 87 86 /** Operations supported by the HC driver */ 88 87 static ddf_dev_ops_t hc_ops = { 89 .interfaces[USBHC_DEV_IFACE] = &hc_iface, /* see iface.h/c */ 90 }; 91 /*----------------------------------------------------------------------------*/ 92 /** Get address of the device identified by handle. 93 * 94 * @param[in] fun DDF instance of the function to use. 95 * @param[in] handle DDF handle of the driver seeking its USB address. 96 * @param[out] address Found address. 97 */ 98 static int usb_iface_get_address( 99 ddf_fun_t *fun, devman_handle_t handle, usb_address_t *address) 100 { 101 assert(fun); 102 usb_device_keeper_t *manager = &dev_to_uhci(fun->dev)->hc.manager; 103 usb_address_t addr = usb_device_keeper_find(manager, handle); 104 105 if (addr < 0) { 106 return addr; 107 } 108 109 if (address != NULL) { 110 *address = addr; 111 } 112 113 return EOK; 114 } 88 .interfaces[USBHC_DEV_IFACE] = &hcd_iface, /* see iface.h/c */ 89 }; 115 90 /*----------------------------------------------------------------------------*/ 116 91 /** Gets handle of the respective hc. … … 134 109 static usb_iface_t usb_iface = { 135 110 .get_hc_handle = usb_iface_get_hc_handle, 136 .get_address = usb_iface_get_address137 111 }; 138 112 /*----------------------------------------------------------------------------*/ … … 174 148 int device_setup_uhci(ddf_dev_t *device) 175 149 { 176 assert(device); 177 uhci_t *instance = malloc(sizeof(uhci_t)); 150 if (!device) 151 return EBADMEM; 152 153 uhci_t *instance = ddf_dev_data_alloc(device, sizeof(uhci_t)); 178 154 if (instance == NULL) { 179 155 usb_log_error("Failed to allocate OHCI driver.\n"); … … 184 160 if (ret != EOK) { \ 185 161 if (instance->hc_fun) \ 186 instance->hc_fun->ops = NULL; \187 162 instance->hc_fun->driver_data = NULL; \ 188 163 ddf_fun_destroy(instance->hc_fun); \ 189 164 if (instance->rh_fun) {\ 190 instance->rh_fun->ops = NULL; \191 165 instance->rh_fun->driver_data = NULL; \ 192 166 ddf_fun_destroy(instance->rh_fun); \ 193 167 } \ 194 free(instance); \195 device->driver_data = NULL; \196 168 usb_log_error(message); \ 197 169 return ret; \ … … 203 175 CHECK_RET_DEST_FREE_RETURN(ret, "Failed to create UHCI HC function.\n"); 204 176 instance->hc_fun->ops = &hc_ops; 205 instance->hc_fun->driver_data = &instance->hc ;177 instance->hc_fun->driver_data = &instance->hc.generic; 206 178 207 179 instance->rh_fun = ddf_fun_create(device, fun_inner, "uhci_rh"); … … 226 198 "Failed to disable legacy USB: %s.\n", str_error(ret)); 227 199 228 const size_t cmd_count = hc_irq_cmd_count(); 229 irq_cmd_t irq_cmds[cmd_count]; 230 ret = 231 hc_get_irq_commands(irq_cmds, sizeof(irq_cmds), reg_base, reg_size); 200 const size_t ranges_count = hc_irq_pio_range_count(); 201 const size_t cmds_count = hc_irq_cmd_count(); 202 irq_pio_range_t irq_ranges[ranges_count]; 203 irq_cmd_t irq_cmds[cmds_count]; 204 ret = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds, 205 sizeof(irq_cmds), reg_base, reg_size); 232 206 CHECK_RET_DEST_FREE_RETURN(ret, 233 207 "Failed to generate IRQ commands: %s.\n", str_error(ret)); 234 208 235 irq_code_t irq_code = { .cmdcount = cmd_count, .cmds = irq_cmds }; 209 irq_code_t irq_code = { 210 .rangecount = ranges_count, 211 .ranges = irq_ranges, 212 .cmdcount = cmds_count, 213 .cmds = irq_cmds 214 }; 236 215 237 216 /* Register handler to avoid interrupt lockup */ … … 254 233 "Failed to init uhci_hcd: %s.\n", str_error(ret)); 255 234 256 device->driver_data = instance;257 258 235 #define CHECK_RET_FINI_RETURN(ret, message...) \ 259 236 if (ret != EOK) { \
Note:
See TracChangeset
for help on using the changeset viewer.