Changeset ddab093 in mainline
- Timestamp:
- 2012-12-16T19:00:03Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5994cc3
- Parents:
- 4bfe063
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/ohci/ohci.c
r4bfe063 rddab093 159 159 * - registers interrupt handler 160 160 */ 161 int device_setup_ohci(ddf_dev_t *device)161 static int device_setup_hcd(ddf_dev_t *device) 162 162 { 163 163 if (device == NULL) … … 174 174 if (instance->hc_fun) { \ 175 175 ddf_fun_destroy(instance->hc_fun); \ 176 } \177 if (instance->rh_fun) { \178 ddf_fun_destroy(instance->rh_fun); \179 176 } \ 180 177 usb_log_error(message); \ … … 199 196 "Failed to bind OHCI device function: %s.\n", str_error(ret)); 200 197 198 #define CHECK_RET_UNBIND_FREE_RETURN(ret, message...) \ 199 if (ret != EOK) { \ 200 ddf_fun_unbind(instance->hc_fun); \ 201 CHECK_RET_DEST_FREE_RETURN(ret, \ 202 "Failed to add OHCI to HC class: %s.\n", str_error(ret)); \ 203 } else (void)0 201 204 ret = ddf_fun_add_to_category(instance->hc_fun, USB_HC_CATEGORY); 202 CHECK_RET_ DEST_FREE_RETURN(ret,203 "Failed to add OHCI to HC class: %s.\n", str_error(ret));205 CHECK_RET_UNBIND_FREE_RETURN(ret, 206 "Failed to add hc to category: %s\n", str_error(ret)); 204 207 205 208 /* HC should be ok at this point (except it can't do anything) */ 206 209 207 instance->rh_fun = ddf_fun_create(device, fun_inner, "ohci_rh"); 208 ret = instance->rh_fun ? EOK : ENOMEM; 209 CHECK_RET_DEST_FREE_RETURN(ret, 210 "Failed to create OHCI RH function: %s.\n", str_error(ret)); 211 ddf_fun_set_ops(instance->rh_fun, &rh_ops); 210 return EOK; 211 } 212 213 int device_setup_ohci(ddf_dev_t *device) 214 { 215 #define CHECK_RET_RETURN(ret, message...) \ 216 if (ret != EOK) { \ 217 usb_log_error(message); \ 218 return ret; \ 219 } 212 220 213 221 uintptr_t reg_base = 0; … … 215 223 int irq = 0; 216 224 217 ret = get_my_registers(device, ®_base, ®_size, &irq);218 CHECK_RET_ DEST_FREE_RETURN(ret,219 "Failed to get register memory addresses for %" PRIun ": %s.\n",220 ddf_dev_get_handle(device), str_error(ret)); 225 int ret = get_my_registers(device, ®_base, ®_size, &irq); 226 CHECK_RET_RETURN(ret, "Failed to get register memory addresses for %" 227 PRIun ": %s.\n", ddf_dev_get_handle(device), str_error(ret)); 228 221 229 usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n", 222 230 (void *) reg_base, reg_size, irq); … … 235 243 ret = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds, 236 244 sizeof(irq_cmds), reg_base, reg_size); 237 CHECK_RET_DEST_FREE_RETURN(ret, 238 "Failed to generate IRQ code: %s.\n", str_error(ret)); 245 CHECK_RET_RETURN(ret, "Failed to gen IRQ code: %s.\n", str_error(ret)); 239 246 240 247 /* Register handler to avoid interrupt lockup */ 241 248 ret = register_interrupt_handler(device, irq, irq_handler, &irq_code); 242 CHECK_RET_DEST_FREE_RETURN(ret, 243 "Failed to register interrupt handler: %s.\n", str_error(ret)); 249 CHECK_RET_RETURN(ret, 250 "Failed to register irq handler: %s.\n", str_error(ret)); 251 244 252 245 253 /* Try to enable interrupts */ … … 256 264 } 257 265 266 ret = device_setup_hcd(device); 267 if (ret != EOK) { 268 unregister_interrupt_handler(device, irq); 269 return ret; 270 } 271 272 273 // TODO: Undo device_setup_hcd 274 #define CHECK_RET_CLEAN_RETURN(ret, message...) \ 275 if (ret != EOK) { \ 276 unregister_interrupt_handler(device, irq); \ 277 CHECK_RET_RETURN(ret, message); \ 278 } else (void)0 279 258 280 hc_t *hc_impl = malloc(sizeof(hc_t)); 259 assert(hc_impl); 281 ret = hc_impl ? EOK : ENOMEM; 282 CHECK_RET_CLEAN_RETURN(ret, "Failed to aloocate driver structure.\n"); 260 283 261 284 ret = hc_init(hc_impl, reg_base, reg_size, interrupts); 262 CHECK_RET_DEST_FREE_RETURN(ret, 263 "Failed to init ohci_hcd: %s.\n", str_error(ret)); 264 265 hcd_set_implementation(hcd, hc_impl, hc_schedule, 266 ohci_endpoint_init, ohci_endpoint_fini); 285 CHECK_RET_CLEAN_RETURN(ret, "Failed to init hc: %s.\n", str_error(ret)); 286 287 ohci_t *ohci = dev_to_ohci(device); 288 289 hcd_set_implementation(dev_to_hcd(device), hc_impl, 290 hc_schedule, ohci_endpoint_init, ohci_endpoint_fini); 267 291 268 292 #define CHECK_RET_FINI_RETURN(ret, message...) \ 269 293 if (ret != EOK) { \ 270 294 hc_fini(hc_impl); \ 271 unregister_interrupt_handler(device, irq); \ 272 CHECK_RET_DEST_FREE_RETURN(ret, message); \ 295 CHECK_RET_CLEAN_RETURN(ret, message); \ 273 296 } else (void)0 274 275 ret = hcd_register_hub(hcd, &hc_impl->rh.address, instance->rh_fun); 297 ohci->rh_fun = ddf_fun_create(device, fun_inner, "ohci_rh"); 298 ret = ohci->rh_fun ? EOK : ENOMEM; 299 CHECK_RET_FINI_RETURN(ret, 300 "Failed to create OHCI RH function: %s.\n", str_error(ret)); 301 ddf_fun_set_ops(ohci->rh_fun, &rh_ops); 302 303 ret = hcd_register_hub(dev_to_hcd(device), &hc_impl->rh.address, ohci->rh_fun); 276 304 CHECK_RET_FINI_RETURN(ret, 277 305 "Failed to register OHCI root hub: %s.\n", str_error(ret)); 278 306 return ret; 279 280 #undef CHECK_RET_FINI_RETURN281 307 } 282 308 /**
Note:
See TracChangeset
for help on using the changeset viewer.