Changes in uspace/drv/bus/usb/ehci/main.c [7de1988c:55346870] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/ehci/main.c
r7de1988c r55346870 33 33 * Main routines of EHCI driver. 34 34 */ 35 36 35 #include <ddf/driver.h> 37 36 #include <ddf/interrupt.h> 38 37 #include <device/hw_res.h> 39 38 #include <errno.h> 40 #include <stdbool.h>41 39 #include <str_error.h> 40 #include <io/logctl.h> 42 41 43 42 #include <usb_iface.h> 44 #include <usb/ddfiface.h>45 43 #include <usb/debug.h> 46 #include <usb/host/ hcd.h>44 #include <usb/host/ddf_helpers.h> 47 45 48 46 #include "res.h" 47 #include "hc.h" 48 #include "ehci_endpoint.h" 49 49 50 50 #define NAME "ehci" 51 51 52 static int ehci_dev_add(ddf_dev_t *device); 52 static int ehci_driver_init(hcd_t *, const hw_res_list_parsed_t *, bool); 53 static void ehci_driver_fini(hcd_t *); 53 54 54 static driver_ops_t ehci_driver_ops = { 55 .dev_add = ehci_dev_add, 55 static const ddf_hc_driver_t ehci_hc_driver = { 56 .claim = disable_legacy, 57 .hc_speed = USB_SPEED_HIGH, 58 .irq_code_gen = ehci_hc_gen_irq_code, 59 .init = ehci_driver_init, 60 .fini = ehci_driver_fini, 61 .name = "EHCI-PCI", 62 .ops = { 63 .schedule = ehci_hc_schedule, 64 .ep_add_hook = ehci_endpoint_init, 65 .ep_remove_hook = ehci_endpoint_fini, 66 .irq_hook = ehci_hc_interrupt, 67 .status_hook = ehci_hc_status, 68 } 56 69 }; 57 70 58 static driver_t ehci_driver = {59 .name = NAME,60 .driver_ops = &ehci_driver_ops61 };62 static ddf_dev_ops_t hc_ops = {63 .interfaces[USBHC_DEV_IFACE] = &hcd_iface,64 };65 71 72 static int ehci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res, bool irq) 73 { 74 assert(hcd); 75 assert(hcd_get_driver_data(hcd) == NULL); 76 77 hc_t *instance = malloc(sizeof(hc_t)); 78 if (!instance) 79 return ENOMEM; 80 81 const int ret = hc_init(instance, res, irq); 82 if (ret == EOK) { 83 hcd_set_implementation(hcd, instance, &ehci_hc_driver.ops); 84 } else { 85 free(instance); 86 } 87 return ret; 88 } 89 90 static void ehci_driver_fini(hcd_t *hcd) 91 { 92 assert(hcd); 93 hc_t *hc = hcd_get_driver_data(hcd); 94 if (hc) 95 hc_fini(hc); 96 97 free(hc); 98 hcd_set_implementation(hcd, NULL, NULL); 99 } 66 100 67 101 /** Initializes a new ddf driver instance of EHCI hcd. … … 72 106 static int ehci_dev_add(ddf_dev_t *device) 73 107 { 74 ddf_fun_t *hc_fun = NULL; 75 bool fun_bound = false; 76 108 usb_log_debug("ehci_dev_add() called\n"); 77 109 assert(device); 78 110 79 addr_range_t reg_range; 80 int irq = 0; 111 return hcd_ddf_add_hc(device, &ehci_hc_driver); 81 112 82 int rc = get_my_registers(device, ®_range, &irq); 83 if (rc != EOK) { 84 usb_log_error("Failed to get memory addresses for %" PRIun 85 ": %s.\n", ddf_dev_get_handle(device), str_error(rc)); 86 goto error; 87 } 113 } 88 114 89 usb_log_info("Memory mapped regs at %p (size %zu), IRQ %d.\n",90 RNGABSPTR(reg_range), RNGSZ(reg_range), irq);91 115 92 rc = disable_legacy(device, ®_range); 93 if (rc != EOK) { 94 usb_log_error("Failed to disable legacy USB: %s.\n", 95 str_error(rc)); 96 goto error; 97 } 116 static const driver_ops_t ehci_driver_ops = { 117 .dev_add = ehci_dev_add, 118 }; 98 119 99 hc_fun = ddf_fun_create(device, fun_exposed, "ehci_hc"); 100 if (hc_fun == NULL) { 101 usb_log_error("Failed to create EHCI function.\n"); 102 rc = ENOMEM; 103 goto error; 104 } 120 static const driver_t ehci_driver = { 121 .name = NAME, 122 .driver_ops = &ehci_driver_ops 123 }; 105 124 106 hcd_t *ehci_hc = ddf_fun_data_alloc(hc_fun, sizeof(hcd_t));107 if (ehci_hc == NULL) {108 usb_log_error("Failed to alloc generic HC driver.\n");109 rc = ENOMEM;110 goto error;111 }112 113 /* High Speed, no bandwidth */114 hcd_init(ehci_hc, USB_SPEED_HIGH, 0, NULL);115 ddf_fun_set_ops(hc_fun, &hc_ops);116 117 rc = ddf_fun_bind(hc_fun);118 if (rc != EOK) {119 usb_log_error("Failed to bind EHCI function: %s.\n",120 str_error(rc));121 goto error;122 }123 124 fun_bound = true;125 126 rc = ddf_fun_add_to_category(hc_fun, USB_HC_CATEGORY);127 if (rc != EOK) {128 usb_log_error("Failed to add EHCI to HC class: %s.\n",129 str_error(rc));130 goto error;131 }132 133 usb_log_info("Controlling new EHCI device `%s' (handle %" PRIun ").\n",134 ddf_dev_get_name(device), ddf_dev_get_handle(device));135 136 return EOK;137 error:138 if (fun_bound)139 ddf_fun_unbind(hc_fun);140 if (hc_fun != NULL)141 ddf_fun_destroy(hc_fun);142 return rc;143 }144 125 145 126 /** Initializes global driver structures (NONE). … … 154 135 { 155 136 log_init(NAME); 137 logctl_set_log_level(NAME, LVL_NOTE); 156 138 return ddf_driver_main(&ehci_driver); 157 139 }
Note:
See TracChangeset
for help on using the changeset viewer.