Changeset f673f60 in mainline for uspace/drv/uhci-rhd/port.c
- Timestamp:
- 2011-02-15T19:57:12Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6427cf67, f294926
- Parents:
- e40b9f00
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-rhd/port.c
re40b9f00 rf673f60 36 36 37 37 #include <usb/usb.h> /* usb_address_t */ 38 #include <usb/usbdrv.h> /* usb_drv_* */ 38 #include <usb/usbdevice.h> 39 #include <usb/hub.h> 40 #include <usb/request.h> 39 41 #include <usb/debug.h> 40 42 #include <usb/recognise.h> … … 58 60 port->attached_device = 0; 59 61 port->rh = rh; 60 port->hc_phone = parent_phone; 62 int rc = usb_hc_connection_initialize_from_device( 63 &port->hc_connection, rh); 64 if (rc != EOK) { 65 usb_log_error("Failed to initialize connection to HC."); 66 return rc; 67 } 61 68 62 69 port->checker = fibril_create(uhci_port_check, port); … … 98 105 99 106 if (port_status & STATUS_CONNECTED_CHANGED) { 107 int rc = usb_hc_connection_open( 108 &port_instance->hc_connection); 109 if (rc != EOK) { 110 usb_log_error("Failed to connect to HC."); 111 goto next; 112 } 113 100 114 if (port_status & STATUS_CONNECTED) { 101 115 /* new device */ … … 104 118 uhci_port_remove_device(port_instance); 105 119 } 120 121 rc = usb_hc_connection_close( 122 &port_instance->hc_connection); 123 if (rc != EOK) { 124 usb_log_error("Failed to disconnect from HC."); 125 goto next; 126 } 106 127 } 128 next: 107 129 async_usleep(port_instance->wait_period_usec); 108 130 } … … 113 135 { 114 136 assert(port); 115 assert( port->hc_phone);137 assert(usb_hc_connection_is_opened(&port->hc_connection)); 116 138 117 139 usb_log_info("Adding new device on port %d.\n", port->number); 118 140 119 141 /* get address of the future device */ 120 const usb_address_t usb_address = usb_ drv_request_address(port->hc_phone);142 const usb_address_t usb_address = usb_hc_request_address(&port->hc_connection); 121 143 122 144 if (usb_address <= 0) { … … 128 150 129 151 /* get default address */ 130 int ret = usb_ drv_reserve_default_address(port->hc_phone);152 int ret = usb_hc_reserve_default_address(&port->hc_connection); 131 153 if (ret != EOK) { 132 154 usb_log_error("Failed to reserve default address on port %d.\n", 133 155 port->number); 134 int ret2 = 135 usb_drv_release_address(port->hc_phone,usb_address);156 int ret2 = usb_hc_unregister_device(&port->hc_connection, 157 usb_address); 136 158 if (ret2 != EOK) { 137 159 usb_log_fatal("Failed to return requested address on port %d.\n", … … 174 196 } 175 197 176 /* assign address to device */ 177 ret = usb_drv_req_set_address(port->hc_phone, 0, usb_address); 198 /* 199 * Initialize connection to the device. 200 */ 201 /* FIXME: check for errors. */ 202 usb_device_connection_t new_dev_connection; 203 usb_endpoint_pipe_t new_dev_ctrl_pipe; 204 usb_device_connection_initialize_on_default_address( 205 &new_dev_connection, &port->hc_connection); 206 usb_endpoint_pipe_initialize_default_control(&new_dev_ctrl_pipe, 207 &new_dev_connection); 208 209 /* 210 * Assign new address to the device. This function updates 211 * the backing connection to still point to the same device. 212 */ 213 /* FIXME: check for errors. */ 214 usb_endpoint_pipe_start_session(&new_dev_ctrl_pipe); 215 ret = usb_request_set_address(&new_dev_ctrl_pipe, usb_address); 216 usb_endpoint_pipe_end_session(&new_dev_ctrl_pipe); 178 217 179 218 if (ret != EOK) { /* address assigning went wrong */ 180 219 usb_log_error("Failed(%d) to assign address to the device.\n", ret); 181 220 uhci_port_set_enabled(port, false); 182 int release = usb_ drv_release_default_address(port->hc_phone);221 int release = usb_hc_release_default_address(&port->hc_connection); 183 222 if (release != EOK) { 184 223 usb_log_error("Failed to release default address on port %d.\n", … … 194 233 195 234 /* release default address */ 196 ret = usb_ drv_release_default_address(port->hc_phone);235 ret = usb_hc_release_default_address(&port->hc_connection); 197 236 if (ret != EOK) { 198 237 usb_log_error("Failed to release default address on port %d.\n", … … 206 245 assert(port->attached_device == 0); 207 246 208 devman_handle_t hc_handle; 209 ret = usb_drv_find_hc(port->rh, &hc_handle); 210 if (ret != EOK) { 211 usb_log_error("Failed to get handle of host controller: %s.\n", 212 str_error(ret)); 213 uhci_port_set_enabled(port, false); 214 return ENOMEM; 215 } 216 217 ret = usb_device_register_child_in_devman(usb_address, hc_handle, 218 port->rh, &port->attached_device); 247 ret = usb_device_register_child_in_devman(new_dev_connection.address, 248 new_dev_connection.hc_handle, port->rh, &port->attached_device); 249 219 250 if (ret != EOK) { /* something went wrong */ 220 251 usb_log_error("Failed(%d) in usb_drv_register_child.\n", ret); … … 225 256 port->number, usb_address, port->attached_device); 226 257 227 ret = 228 usb_drv_bind_address(port->hc_phone, usb_address, port->attached_device); 258 /* 259 * Register the device in the host controller. 260 */ 261 usb_hc_attached_device_t new_device = { 262 .address = new_dev_connection.address, 263 .handle = port->attached_device 264 }; 265 266 ret = usb_hc_register_device(&port->hc_connection, &new_device); 229 267 // TODO: proper error check here 230 268 assert(ret == EOK);
Note:
See TracChangeset
for help on using the changeset viewer.