Changes in uspace/drv/bus/usb/uhci/main.c [2ef8023:920d0fc] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/uhci/main.c
r2ef8023 r920d0fc 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 /** @addtogroup drvusbuhci 28 /** @addtogroup drvusbuhcihc 29 29 * @{ 30 30 */ … … 32 32 * @brief UHCI driver initialization 33 33 */ 34 #include <ddf/driver.h> 35 #include <errno.h> 36 #include <str_error.h> 34 37 35 #include <assert.h> 36 #include <ddf/driver.h> 37 #include <devman.h> 38 #include <errno.h> 39 #include <io/log.h> 40 #include <pci_dev_iface.h> 41 #include <stdio.h> 42 #include <str_error.h> 38 #include <usb/ddfiface.h> 43 39 #include <usb/debug.h> 44 #include <usb/host/ddf_helpers.h>45 40 46 #include " hc.h"41 #include "uhci.h" 47 42 48 43 #define NAME "uhci" 49 44 50 // TODO: This should be merged to hc_interrupt51 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 84 45 static int uhci_dev_add(ddf_dev_t *device); 85 46 86 static constdriver_ops_t uhci_driver_ops = {47 static driver_ops_t uhci_driver_ops = { 87 48 .dev_add = uhci_dev_add, 88 49 }; 89 50 90 static constdriver_t uhci_driver = {51 static driver_t uhci_driver = { 91 52 .name = NAME, 92 53 .driver_ops = &uhci_driver_ops 93 54 }; 94 95 /** Call the PCI driver with a request to clear legacy support register96 *97 * @param[in] device Device asking to disable interrupts98 * @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 }116 55 117 56 /** Initialize a new ddf driver instance for uhci hc and hub. … … 125 64 assert(device); 126 65 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); 66 const int ret = device_setup_uhci(device); 139 67 if (ret != EOK) { 140 68 usb_log_error("Failed to initialize UHCI driver: %s.\n",
Note:
See TracChangeset
for help on using the changeset viewer.