Changes in uspace/drv/bus/usb/uhci/main.c [920d0fc:a25d893] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/uhci/main.c
r920d0fc ra25d893 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 static int uhci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res, bool irq) 51 { 52 assert(hcd); 53 assert(hcd->driver.data == NULL); 54 55 hc_t *instance = malloc(sizeof(hc_t)); 56 if (!instance) 57 return ENOMEM; 58 59 const int ret = hc_init(instance, res, irq); 60 if (ret == EOK) 61 hcd_set_implementation(hcd, instance, uhci_hc_schedule, NULL, 62 NULL, uhci_hc_interrupt, uhci_hc_status); 63 return ret; 64 } 65 66 static void uhci_driver_fini(hcd_t *hcd) 67 { 68 assert(hcd); 69 if (hcd->driver.data) 70 hc_fini(hcd->driver.data); 71 72 free(hcd->driver.data); 73 hcd_set_implementation(hcd, NULL, NULL, NULL, NULL, NULL, NULL); 74 } 75 45 76 static int uhci_dev_add(ddf_dev_t *device); 46 77 47 static driver_ops_t uhci_driver_ops = {78 static const driver_ops_t uhci_driver_ops = { 48 79 .dev_add = uhci_dev_add, 49 80 }; 50 81 51 static driver_t uhci_driver = {82 static const driver_t uhci_driver = { 52 83 .name = NAME, 53 84 .driver_ops = &uhci_driver_ops 54 85 }; 86 87 /** Call the PCI driver with a request to clear legacy support register 88 * 89 * @param[in] device Device asking to disable interrupts 90 * @return Error code. 91 */ 92 static int disable_legacy(ddf_dev_t *device) 93 { 94 assert(device); 95 96 async_sess_t *parent_sess = devman_parent_device_connect( 97 EXCHANGE_SERIALIZE, ddf_dev_get_handle(device), IPC_FLAG_BLOCKING); 98 if (!parent_sess) 99 return ENOMEM; 100 101 /* See UHCI design guide page 45 for these values. 102 * Write all WC bits in USB legacy register */ 103 const int rc = pci_config_space_write_16(parent_sess, 0xc0, 0xaf00); 104 105 async_hangup(parent_sess); 106 return rc; 107 } 55 108 56 109 /** Initialize a new ddf driver instance for uhci hc and hub. … … 64 117 assert(device); 65 118 66 const int ret = device_setup_uhci(device); 119 int ret = disable_legacy(device); 120 if (ret != EOK) { 121 usb_log_error("Failed to disable legacy USB: %s.\n", 122 str_error(ret)); 123 return ret; 124 } 125 126 127 ret = ddf_hcd_device_setup_all(device, USB_SPEED_FULL, 128 BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11, 129 ddf_hcd_gen_irq_handler, uhci_hc_gen_irq_code, 130 uhci_driver_init, uhci_driver_fini); 67 131 if (ret != EOK) { 68 132 usb_log_error("Failed to initialize UHCI driver: %s.\n",
Note:
See TracChangeset
for help on using the changeset viewer.