Changeset 6edc69a in mainline for uspace/drv
- Timestamp:
- 2011-02-19T20:02:18Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b9d910f
- Parents:
- 7e7f0f5 (diff), 374552ef (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/drv
- Files:
-
- 5 edited
-
uhci-hcd/iface.c (modified) (4 diffs)
-
uhci-rhd/port.c (modified) (2 diffs)
-
uhci-rhd/root_hub.c (modified) (1 diff)
-
usbhub/usbhub.c (modified) (1 diff)
-
vhc/connhost.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-hcd/iface.c
r7e7f0f5 r6edc69a 54 54 } 55 55 /*----------------------------------------------------------------------------*/ 56 static int reserve_default_address(device_t *dev )56 static int reserve_default_address(device_t *dev, usb_speed_t speed) 57 57 { 58 58 assert(dev); … … 72 72 } 73 73 /*----------------------------------------------------------------------------*/ 74 static int request_address(device_t *dev, usb_address_t *address) 74 static int request_address(device_t *dev, usb_speed_t speed, 75 usb_address_t *address) 75 76 { 76 77 assert(dev); … … 163 164 return EOK; 164 165 } 165 /*----------------------------------------------------------------------------*/166 static int control_write_setup(device_t *dev, usb_target_t target,167 size_t max_packet_size,168 void *data, size_t size,169 usbhc_iface_transfer_out_callback_t callback, void *arg)170 {171 dev_speed_t speed = FULL_SPEED;172 166 173 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);174 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,175 max_packet_size, speed, NULL, 0, data, size, NULL, callback, arg);176 if (!batch)177 return ENOMEM;178 batch_control_setup_old(batch);179 return EOK;180 }181 /*----------------------------------------------------------------------------*/182 static int control_write_data(device_t *dev, usb_target_t target,183 size_t max_packet_size,184 void *data, size_t size,185 usbhc_iface_transfer_out_callback_t callback, void *arg)186 {187 dev_speed_t speed = FULL_SPEED;188 167 189 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);190 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,191 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg);192 if (!batch)193 return ENOMEM;194 batch_control_write_data_old(batch);195 return EOK;196 }197 /*----------------------------------------------------------------------------*/198 static int control_write_status(device_t *dev, usb_target_t target,199 usbhc_iface_transfer_in_callback_t callback, void *arg)200 {201 size_t max_packet_size = 8;202 dev_speed_t speed = FULL_SPEED;203 204 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);205 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,206 max_packet_size, speed, NULL, 0, NULL, 0, callback, NULL, arg);207 if (!batch)208 return ENOMEM;209 batch_control_write_status_old(batch);210 return EOK;211 }212 /*----------------------------------------------------------------------------*/213 static int control_read_setup(device_t *dev, usb_target_t target,214 size_t max_packet_size,215 void *data, size_t size,216 usbhc_iface_transfer_out_callback_t callback, void *arg)217 {218 dev_speed_t speed = FULL_SPEED;219 220 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);221 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,222 max_packet_size, speed, NULL, 0, data, size, NULL, callback, arg);223 if (!batch)224 return ENOMEM;225 batch_control_setup_old(batch);226 return EOK;227 }228 /*----------------------------------------------------------------------------*/229 static int control_read_data(device_t *dev, usb_target_t target,230 size_t max_packet_size,231 void *data, size_t size,232 usbhc_iface_transfer_in_callback_t callback, void *arg)233 {234 dev_speed_t speed = FULL_SPEED;235 236 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);237 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,238 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg);239 if (!batch)240 return ENOMEM;241 batch_control_read_data_old(batch);242 return EOK;243 }244 /*----------------------------------------------------------------------------*/245 static int control_read_status(device_t *dev, usb_target_t target,246 usbhc_iface_transfer_out_callback_t callback, void *arg)247 {248 size_t max_packet_size = 8;249 dev_speed_t speed = FULL_SPEED;250 251 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);252 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,253 max_packet_size, speed, NULL, 0, NULL, 0, NULL, callback, arg);254 if (!batch)255 return ENOMEM;256 batch_control_read_status_old(batch);257 return EOK;258 }259 168 /*----------------------------------------------------------------------------*/ 260 169 usbhc_iface_t uhci_iface = { … … 272 181 .control_read = control_read, 273 182 .control_write = control_write, 274 275 .control_write_setup = control_write_setup,276 .control_write_data = control_write_data,277 .control_write_status = control_write_status,278 279 .control_read_setup = control_read_setup,280 .control_read_data = control_read_data,281 .control_read_status = control_read_status282 183 }; 283 184 /** -
uspace/drv/uhci-rhd/port.c
r7e7f0f5 r6edc69a 131 131 return EOK; 132 132 } 133 /*----------------------------------------------------------------------------*/ 134 static int uhci_port_new_device(uhci_port_t *port) 135 { 136 assert(port); 137 assert(usb_hc_connection_is_opened(&port->hc_connection)); 138 139 usb_log_info("Adding new device on port %d.\n", port->number); 140 141 /* get address of the future device */ 142 const usb_address_t usb_address = usb_hc_request_address(&port->hc_connection); 143 144 if (usb_address <= 0) { 145 usb_log_error("Recieved invalid address(%d).\n", usb_address); 146 return usb_address; 147 } 148 usb_log_debug("Sucessfully obtained address %d for port %d.\n", 149 usb_address, port->number); 150 151 /* get default address */ 152 int ret = usb_hc_reserve_default_address(&port->hc_connection); 153 if (ret != EOK) { 154 usb_log_error("Failed to reserve default address on port %d.\n", 155 port->number); 156 int ret2 = usb_hc_unregister_device(&port->hc_connection, 157 usb_address); 158 if (ret2 != EOK) { 159 usb_log_fatal("Failed to return requested address on port %d.\n", 160 port->number); 161 return ret2; 162 } 163 usb_log_debug("Successfully returned reserved address on port %d.\n", 164 port->number); 165 return ret; 166 } 167 usb_log_debug("Sucessfully obtained default address for port %d.\n", 168 port->number); 133 134 /** Callback for enabling port during adding a new device. 135 * 136 * @param portno Port number (unused). 137 * @param arg Pointer to uhci_port_t of port with the new device. 138 * @return Error code. 139 */ 140 static int new_device_enable_port(int portno, void *arg) 141 { 142 uhci_port_t *port = (uhci_port_t *) arg; 143 144 usb_log_debug("new_device_enable_port(%d)\n", port->number); 169 145 170 146 /* 171 * the host then waits for at least 100 ms to allow completion of147 * The host then waits for at least 100 ms to allow completion of 172 148 * an insertion process and for power at the device to become stable. 173 149 */ 174 150 async_usleep(100000); 175 151 176 /* enable port*/152 /* Enable the port. */ 177 153 uhci_port_set_enabled(port, true); 178 154 … … 196 172 } 197 173 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); 217 218 if (ret != EOK) { /* address assigning went wrong */ 219 usb_log_error("Failed(%d) to assign address to the device.\n", ret); 174 return EOK; 175 } 176 177 /*----------------------------------------------------------------------------*/ 178 static int uhci_port_new_device(uhci_port_t *port) 179 { 180 assert(port); 181 assert(usb_hc_connection_is_opened(&port->hc_connection)); 182 183 usb_log_info("Detected new device on port %u.\n", port->number); 184 185 usb_address_t dev_addr; 186 int rc = usb_hc_new_device_wrapper(port->rh, &port->hc_connection, 187 USB_SPEED_FULL, 188 new_device_enable_port, port->number, port, 189 &dev_addr, &port->attached_device); 190 if (rc != EOK) { 191 usb_log_error("Failed adding new device on port %u: %s.\n", 192 port->number, str_error(rc)); 220 193 uhci_port_set_enabled(port, false); 221 int release = usb_hc_release_default_address(&port->hc_connection); 222 if (release != EOK) { 223 usb_log_error("Failed to release default address on port %d.\n", 224 port->number); 225 return release; 226 } 227 usb_log_debug("Sucessfully released default address on port %d.\n", 228 port->number); 229 return ret; 230 } 231 usb_log_debug("Sucessfully assigned address %d for port %d.\n", 232 usb_address, port->number); 233 234 /* release default address */ 235 ret = usb_hc_release_default_address(&port->hc_connection); 236 if (ret != EOK) { 237 usb_log_error("Failed to release default address on port %d.\n", 238 port->number); 239 return ret; 240 } 241 usb_log_debug("Sucessfully released default address on port %d.\n", 242 port->number); 243 244 /* communicate and possibly report to devman */ 245 assert(port->attached_device == 0); 246 247 ret = usb_device_register_child_in_devman(new_dev_connection.address, 248 new_dev_connection.hc_handle, port->rh, &port->attached_device); 249 250 if (ret != EOK) { /* something went wrong */ 251 usb_log_error("Failed(%d) in usb_drv_register_child.\n", ret); 252 uhci_port_set_enabled(port, false); 253 return ENOMEM; 254 } 255 usb_log_info("Sucessfully added device on port(%d) address(%d) handle %d.\n", 256 port->number, usb_address, port->attached_device); 257 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); 267 // TODO: proper error check here 268 assert(ret == EOK); 269 270 return EOK; 271 } 194 return rc; 195 } 196 197 usb_log_info("New device on port %u has address %d (handle %zu).\n", 198 port->number, dev_addr, port->attached_device); 199 200 return EOK; 201 } 202 272 203 /*----------------------------------------------------------------------------*/ 273 204 static int uhci_port_remove_device(uhci_port_t *port) -
uspace/drv/uhci-rhd/root_hub.c
r7e7f0f5 r6edc69a 47 47 assert(rh); 48 48 int ret; 49 ret = usb_ drv_find_hc(rh, &instance->hc_handle);49 ret = usb_hc_find(rh->handle, &instance->hc_handle); 50 50 usb_log_info("rh found(%d) hc handle: %d.\n", ret, instance->hc_handle); 51 51 if (ret != EOK) { -
uspace/drv/usbhub/usbhub.c
r7e7f0f5 r6edc69a 50 50 #include "usb/usb.h" 51 51 52 static int iface_get_hc_handle(device_t *device, devman_handle_t *handle) 53 { 54 return usb_hc_find(device->handle, handle); 55 } 56 52 57 static usb_iface_t hub_usb_iface = { 53 .get_hc_handle = usb_drv_find_hc58 .get_hc_handle = iface_get_hc_handle 54 59 }; 55 60 -
uspace/drv/vhc/connhost.c
r7e7f0f5 r6edc69a 234 234 } 235 235 236 static int enqueue_transfer_setup(device_t *dev,237 usb_target_t target, usb_transfer_type_t transfer_type,238 void *buffer, size_t size,239 usbhc_iface_transfer_out_callback_t callback, void *arg)240 {241 usb_log_debug2("Transfer SETUP [%d.%d (%s); %zu].\n",242 target.address, target.endpoint,243 usb_str_transfer_type(transfer_type),244 size);245 246 transfer_info_t *transfer247 = create_transfer_info(dev, USB_DIRECTION_OUT, arg);248 transfer->out_callback = callback;249 250 hc_add_transaction_to_device(true, target, transfer_type, buffer, size,251 universal_callback, transfer);252 253 return EOK;254 }255 256 236 static int enqueue_transfer_in(device_t *dev, 257 237 usb_target_t target, usb_transfer_type_t transfer_type, … … 292 272 return enqueue_transfer_in(dev, target, USB_TRANSFER_INTERRUPT, 293 273 data, size, 294 callback, arg);295 }296 297 static int control_write_setup(device_t *dev, usb_target_t target,298 size_t max_packet_size,299 void *data, size_t size,300 usbhc_iface_transfer_out_callback_t callback, void *arg)301 {302 return enqueue_transfer_setup(dev, target, USB_TRANSFER_CONTROL,303 data, size,304 callback, arg);305 }306 307 static int control_write_data(device_t *dev, usb_target_t target,308 size_t max_packet_size,309 void *data, size_t size,310 usbhc_iface_transfer_out_callback_t callback, void *arg)311 {312 return enqueue_transfer_out(dev, target, USB_TRANSFER_CONTROL,313 data, size,314 callback, arg);315 }316 317 static int control_write_status(device_t *dev, usb_target_t target,318 usbhc_iface_transfer_in_callback_t callback, void *arg)319 {320 return enqueue_transfer_in(dev, target, USB_TRANSFER_CONTROL,321 NULL, 0,322 274 callback, arg); 323 275 } … … 341 293 } 342 294 343 static int control_read_setup(device_t *dev, usb_target_t target,344 size_t max_packet_size,345 void *data, size_t size,346 usbhc_iface_transfer_out_callback_t callback, void *arg)347 {348 return enqueue_transfer_setup(dev, target, USB_TRANSFER_CONTROL,349 data, size,350 callback, arg);351 }352 353 static int control_read_data(device_t *dev, usb_target_t target,354 size_t max_packet_size,355 void *data, size_t size,356 usbhc_iface_transfer_in_callback_t callback, void *arg)357 {358 return enqueue_transfer_in(dev, target, USB_TRANSFER_CONTROL,359 data, size,360 callback, arg);361 }362 363 static int control_read_status(device_t *dev, usb_target_t target,364 usbhc_iface_transfer_out_callback_t callback, void *arg)365 {366 return enqueue_transfer_out(dev, target, USB_TRANSFER_CONTROL,367 NULL, 0,368 callback, arg);369 }370 371 295 static int control_read(device_t *dev, usb_target_t target, 372 296 size_t max_packet_size, … … 390 314 391 315 392 static int reserve_default_address(device_t *dev )316 static int reserve_default_address(device_t *dev, usb_speed_t ignored) 393 317 { 394 318 usb_address_keeping_reserve_default(&addresses); … … 402 326 } 403 327 404 static int request_address(device_t *dev, usb_address_t *address) 328 static int request_address(device_t *dev, usb_speed_t ignored, 329 usb_address_t *address) 405 330 { 406 331 usb_address_t addr = usb_address_keeping_request(&addresses); … … 454 379 .interrupt_in = interrupt_in, 455 380 456 .control_write_setup = control_write_setup,457 .control_write_data = control_write_data,458 .control_write_status = control_write_status,459 460 381 .control_write = control_write, 461 462 .control_read_setup = control_read_setup,463 .control_read_data = control_read_data,464 .control_read_status = control_read_status,465 466 382 .control_read = control_read 467 383 };
Note:
See TracChangeset
for help on using the changeset viewer.
