Changes in uspace/drv/bus/usb/uhci/main.c [920d0fc:2ef8023] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/uhci/main.c
r920d0fc r2ef8023 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 /** @addtogroup drvusbuhci hc28 /** @addtogroup drvusbuhci 29 29 * @{ 30 30 */ … … 32 32 * @brief UHCI driver initialization 33 33 */ 34 35 #include <assert.h> 34 36 #include <ddf/driver.h> 37 #include <devman.h> 35 38 #include <errno.h> 39 #include <io/log.h> 40 #include <pci_dev_iface.h> 41 #include <stdio.h> 36 42 #include <str_error.h> 43 #include <usb/debug.h> 44 #include <usb/host/ddf_helpers.h> 37 45 38 #include <usb/ddfiface.h> 39 #include <usb/debug.h> 40 41 #include "uhci.h" 46 #include "hc.h" 42 47 43 48 #define NAME "uhci" 44 49 50 // TODO: This should be merged to hc_interrupt 51 static void uhci_interrupt(hcd_t *hcd, uint32_t status) 52 { 53 assert(hcd); 54 if (hcd->driver.data) 55 hc_interrupt(hcd->driver.data, status); 56 } 57 58 static int uhci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res, bool irq) 59 { 60 assert(hcd); 61 assert(hcd->driver.data == NULL); 62 63 hc_t *instance = malloc(sizeof(hc_t)); 64 if (!instance) 65 return ENOMEM; 66 67 const int ret = hc_init(instance, res, irq); 68 if (ret == EOK) 69 hcd_set_implementation(hcd, instance, hc_schedule, NULL, NULL, 70 uhci_interrupt); 71 return ret; 72 } 73 74 static void uhci_driver_fini(hcd_t *hcd) 75 { 76 assert(hcd); 77 if (hcd->driver.data) 78 hc_fini(hcd->driver.data); 79 80 free(hcd->driver.data); 81 hcd_set_implementation(hcd, NULL, NULL, NULL, NULL, NULL); 82 } 83 45 84 static int uhci_dev_add(ddf_dev_t *device); 46 85 47 static driver_ops_t uhci_driver_ops = {86 static const driver_ops_t uhci_driver_ops = { 48 87 .dev_add = uhci_dev_add, 49 88 }; 50 89 51 static driver_t uhci_driver = {90 static const driver_t uhci_driver = { 52 91 .name = NAME, 53 92 .driver_ops = &uhci_driver_ops 54 93 }; 94 95 /** Call the PCI driver with a request to clear legacy support register 96 * 97 * @param[in] device Device asking to disable interrupts 98 * @return Error code. 99 */ 100 static int disable_legacy(ddf_dev_t *device) 101 { 102 assert(device); 103 104 async_sess_t *parent_sess = devman_parent_device_connect( 105 EXCHANGE_SERIALIZE, ddf_dev_get_handle(device), IPC_FLAG_BLOCKING); 106 if (!parent_sess) 107 return ENOMEM; 108 109 /* See UHCI design guide page 45 for these values. 110 * Write all WC bits in USB legacy register */ 111 const int rc = pci_config_space_write_16(parent_sess, 0xc0, 0xaf00); 112 113 async_hangup(parent_sess); 114 return rc; 115 } 55 116 56 117 /** Initialize a new ddf driver instance for uhci hc and hub. … … 64 125 assert(device); 65 126 66 const int ret = device_setup_uhci(device); 127 int ret = disable_legacy(device); 128 if (ret != EOK) { 129 usb_log_error("Failed to disable legacy USB: %s.\n", 130 str_error(ret)); 131 return ret; 132 } 133 134 135 ret = ddf_hcd_device_setup_all(device, USB_SPEED_FULL, 136 BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11, 137 ddf_hcd_gen_irq_handler, hc_gen_irq_code, 138 uhci_driver_init, uhci_driver_fini); 67 139 if (ret != EOK) { 68 140 usb_log_error("Failed to initialize UHCI driver: %s.\n",
Note:
See TracChangeset
for help on using the changeset viewer.