Changeset 0918382f in mainline
- Timestamp:
- 2013-08-07T15:00:36Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 14dd4c9
- Parents:
- 2757247
- Location:
- uspace
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbhub/port.c
r2757247 r0918382f 64 64 { 65 65 assert(port); 66 if (port-> attached_handle != USB_DEVICE_HANDLE_INVALID)66 if (port->device_attached) 67 67 return usb_hub_port_device_gone(port, hub); 68 68 return EOK; … … 139 139 assert(port); 140 140 assert(hub); 141 usb_log_debug("Interrupt at port % zu\n", port->port_number);141 usb_log_debug("Interrupt at port %u\n", port->port_number); 142 142 143 143 usb_port_status_t status = 0; 144 144 const int opResult = get_port_status(port, &status); 145 145 if (opResult != EOK) { 146 usb_log_error("Failed to get port % zu status: %s.\n",146 usb_log_error("Failed to get port %u status: %s.\n", 147 147 port->port_number, str_error(opResult)); 148 148 return; … … 153 153 const bool connected = 154 154 (status & USB_HUB_PORT_STATUS_CONNECTION) != 0; 155 usb_log_debug("Connection change on port % zu: device %s.\n",155 usb_log_debug("Connection change on port %u: device %s.\n", 156 156 port->port_number, connected ? "attached" : "removed"); 157 157 … … 169 169 if (opResult != EOK) { 170 170 usb_log_error( 171 "Cannot handle change on port % zu: %s.\n",171 "Cannot handle change on port %u: %s.\n", 172 172 port->port_number, str_error(opResult)); 173 173 } … … 183 183 /* Enable change, ports are automatically disabled on errors. */ 184 184 if (status & USB_HUB_PORT_C_STATUS_ENABLED) { 185 usb_log_info("Port % zu, disabled because of errors.\n",185 usb_log_info("Port %u, disabled because of errors.\n", 186 186 port->port_number); 187 187 usb_hub_port_device_gone(port, hub); … … 190 190 if (rc != EOK) { 191 191 usb_log_error( 192 "Failed to clear port % zu enable change feature: "192 "Failed to clear port %u enable change feature: " 193 193 "%s.\n", port->port_number, str_error(rc)); 194 194 } … … 198 198 /* Suspend change */ 199 199 if (status & USB_HUB_PORT_C_STATUS_SUSPEND) { 200 usb_log_error("Port % zu went to suspend state, this should"200 usb_log_error("Port %u went to suspend state, this should" 201 201 "NOT happen as we do not support suspend state!", 202 202 port->port_number); … … 205 205 if (rc != EOK) { 206 206 usb_log_error( 207 "Failed to clear port % zu suspend change feature: "207 "Failed to clear port %u suspend change feature: " 208 208 "%s.\n", port->port_number, str_error(rc)); 209 209 } … … 221 221 if (rc != EOK) { 222 222 usb_log_error( 223 "Failed to clear port % zu OC change feature: %s.\n",223 "Failed to clear port %u OC change feature: %s.\n", 224 224 port->port_number, str_error(rc)); 225 225 } … … 229 229 if (rc != EOK) { 230 230 usb_log_error( 231 "Failed to set port % zu power after OC:"231 "Failed to set port %u power after OC:" 232 232 " %s.\n", port->port_number, str_error(rc)); 233 233 } … … 240 240 } 241 241 242 usb_log_debug("Port % zu status 0x%08" PRIx32 "\n",242 usb_log_debug("Port %u status %#08" PRIx32 "\n", 243 243 port->port_number, status); 244 244 } … … 260 260 if (!exch) 261 261 return ENOMEM; 262 const int rc = usb_device_remove(exch, port-> attached_handle);262 const int rc = usb_device_remove(exch, port->port_number); 263 263 usb_device_bus_exchange_end(exch); 264 264 if (rc == EOK) 265 port-> attached_handle = -1;265 port->device_attached = false; 266 266 return rc; 267 267 … … 286 286 287 287 if (port->reset_okay) { 288 usb_log_debug("Port % zu reset complete.\n", port->port_number);288 usb_log_debug("Port %u reset complete.\n", port->port_number); 289 289 } else { 290 290 usb_log_warning( 291 "Port % zu reset complete but port not enabled.\n",291 "Port %u reset complete but port not enabled.\n", 292 292 port->port_number); 293 293 } … … 299 299 if (rc != EOK) { 300 300 usb_log_error( 301 "Failed to clear port % zu reset change feature: %s.\n",301 "Failed to clear port %u reset change feature: %s.\n", 302 302 port->port_number, str_error(rc)); 303 303 } … … 407 407 port_enable(port, true); 408 408 if (!port->reset_completed || !port->reset_okay) { 409 usb_log_error("Failed to reset port % zu\n", port->port_number);409 usb_log_error("Failed to reset port %u\n", port->port_number); 410 410 if (usb_release_default_address(exch) != EOK) 411 411 usb_log_warning("Failed to release default address\n"); … … 414 414 } 415 415 416 ret = usb_device_enumerate(exch, &port->attached_handle);416 ret = usb_device_enumerate(exch, port->port_number); 417 417 if (ret != EOK) { 418 usb_log_error("Failed to reset port %zu\n", port->port_number); 418 usb_log_error("Failed to enumerate device on port %u\n", 419 port->port_number); 419 420 if (port_enable(port, false) != EOK) { 420 usb_log_warning("Failed to disable port % zu, NOT "421 usb_log_warning("Failed to disable port %u, NOT " 421 422 "releasing default address.\n", port->port_number); 422 423 } else { … … 426 427 } 427 428 } else { 429 port->device_attached = true; 428 430 if (usb_release_default_address(exch) != EOK) 429 431 usb_log_warning("Failed to release default address\n"); -
uspace/drv/bus/usb/usbhub/port.h
r2757247 r0918382f 44 44 /** Information about single port on a hub. */ 45 45 typedef struct { 46 /* Port number as reported in descriptors. */47 size_tport_number;46 /** Port number as reported in descriptors. */ 47 unsigned port_number; 48 48 /** Device communication pipe. */ 49 49 usb_pipe_t *control_pipe; … … 58 58 /** Whether to announce the port reset as successful. */ 59 59 bool reset_okay; 60 61 usb_device_handle_t attached_handle; 62 60 /** Device reported to USB bus driver */ 61 bool device_attached; 63 62 } usb_hub_port_t; 64 63 … … 67 66 * @param port Port to be initialized. 68 67 */ 69 static inline void usb_hub_port_init(usb_hub_port_t *port, size_tport_number,68 static inline void usb_hub_port_init(usb_hub_port_t *port, unsigned port_number, 70 69 usb_pipe_t *control_pipe) 71 70 { … … 73 72 port->port_number = port_number; 74 73 port->control_pipe = control_pipe; 75 port->attached_handle = USB_DEVICE_HANDLE_INVALID; 74 port->reset_completed = false; 75 port->reset_okay = false; 76 port->device_attached = false; 76 77 fibril_mutex_initialize(&port->mutex); 77 78 fibril_condvar_initialize(&port->reset_cv); -
uspace/drv/bus/usb/usbhub/usbhub.c
r2757247 r0918382f 317 317 318 318 if (ret != EOK) { 319 usb_log_error("Cannot power on port % zu: %s.\n",319 usb_log_error("Cannot power on port %u: %s.\n", 320 320 hub_dev->ports[port].port_number, str_error(ret)); 321 321 } else { … … 406 406 if (ret != EOK) { 407 407 usb_log_warning("HUB OVER-CURRENT GONE: Cannot power on" 408 " port % zu: %s\n", hub_dev->ports[port].port_number,408 " port %u: %s\n", hub_dev->ports[port].port_number, 409 409 str_error(ret)); 410 410 } else { -
uspace/lib/drv/generic/remote_usb.c
r2757247 r0918382f 139 139 * @return Error code. 140 140 */ 141 int usb_device_enumerate(async_exch_t *exch, usb_device_handle_t *handle) 142 { 143 if (!exch || !handle) 144 return EBADMEM; 145 sysarg_t h; 146 const int ret = async_req_1_1(exch, DEV_IFACE_ID(USB_DEV_IFACE), 147 IPC_M_USB_DEVICE_ENUMERATE, &h); 148 if (ret == EOK) 149 *handle = (usb_device_handle_t)h; 141 int usb_device_enumerate(async_exch_t *exch, unsigned port) 142 { 143 if (!exch) 144 return EBADMEM; 145 const int ret = async_req_2_0(exch, DEV_IFACE_ID(USB_DEV_IFACE), 146 IPC_M_USB_DEVICE_ENUMERATE, port); 150 147 return ret; 151 148 } … … 156 153 * @return Error code. 157 154 */ 158 int usb_device_remove(async_exch_t *exch, u sb_device_handle_t handle)155 int usb_device_remove(async_exch_t *exch, unsigned port) 159 156 { 160 157 if (!exch) 161 158 return EBADMEM; 162 159 return async_req_2_0(exch, DEV_IFACE_ID(USB_DEV_IFACE), 163 IPC_M_USB_DEVICE_REMOVE, handle);160 IPC_M_USB_DEVICE_REMOVE, port); 164 161 } 165 162 … … 381 378 } 382 379 383 usb_device_handle_t handle = 0; 384 const int ret = usb_iface->device_enumerate(fun, &handle); 385 if (ret != EOK) { 386 async_answer_0(callid, ret); 387 } 388 389 async_answer_1(callid, EOK, (sysarg_t) handle); 380 const unsigned port = DEV_IPC_GET_ARG1(*call); 381 const int ret = usb_iface->device_enumerate(fun, port); 382 async_answer_0(callid, ret); 390 383 } 391 384 … … 400 393 } 401 394 402 usb_device_handle_t handle= DEV_IPC_GET_ARG1(*call);403 const int ret = usb_iface->device_remove(fun, handle);395 const unsigned port = DEV_IPC_GET_ARG1(*call); 396 const int ret = usb_iface->device_remove(fun, port); 404 397 async_answer_0(callid, ret); 405 398 } -
uspace/lib/drv/include/usb_iface.h
r2757247 r0918382f 42 42 #include <usb/usb.h> 43 43 44 typedef intptr_t usb_device_handle_t;45 enum {46 USB_DEVICE_HANDLE_INVALID = -147 };48 44 typedef async_sess_t usb_dev_session_t; 49 45 … … 58 54 int usb_release_default_address(async_exch_t *); 59 55 60 int usb_device_enumerate(async_exch_t *, u sb_device_handle_t *);61 int usb_device_remove(async_exch_t *, u sb_device_handle_t);56 int usb_device_enumerate(async_exch_t *, unsigned port); 57 int usb_device_remove(async_exch_t *, unsigned port); 62 58 63 59 int usb_register_endpoint(async_exch_t *, usb_endpoint_t, usb_transfer_type_t, … … 81 77 int (*release_default_address)(ddf_fun_t *); 82 78 83 int (*device_enumerate)(ddf_fun_t *, u sb_device_handle_t *);84 int (*device_remove)(ddf_fun_t *, u sb_device_handle_t);79 int (*device_enumerate)(ddf_fun_t *, unsigned); 80 int (*device_remove)(ddf_fun_t *, unsigned); 85 81 86 82 int (*register_endpoint)(ddf_fun_t *, usb_endpoint_t, -
uspace/lib/usbhost/src/ddf_helpers.c
r2757247 r0918382f 77 77 } usb_dev_t; 78 78 79 static int hcd_ddf_new_device(ddf_dev_t *device, usb_dev_t *hub, unsigned port, 80 usb_address_t *id); 81 static int hcd_ddf_remove_device(ddf_dev_t *device, usb_dev_t *hub, 82 usb_address_t id); 79 static int hcd_ddf_new_device(ddf_dev_t *device, usb_dev_t *hub, unsigned port); 80 static int hcd_ddf_remove_device(ddf_dev_t *device, usb_dev_t *hub, unsigned port); 83 81 84 82 … … 164 162 } 165 163 166 static int device_enumerate(ddf_fun_t *fun, u sb_device_handle_t *handle)164 static int device_enumerate(ddf_fun_t *fun, unsigned port) 167 165 { 168 166 assert(fun); … … 171 169 assert(ddf_dev); 172 170 assert(dev); 173 usb_address_t address = 0; 174 unsigned port = 0; //TODO provide real value here 175 usb_log_debug("Device %d reported a new USB device\n", dev->address); 176 const int ret = hcd_ddf_new_device(ddf_dev, dev, port, &address); 177 if (ret == EOK && handle) 178 *handle = address; 179 return ret; 180 } 181 182 static int device_remove(ddf_fun_t *fun, usb_device_handle_t handle) 171 usb_log_debug("Hub %d reported a new USB device on port: %u\n", 172 dev->address, port); 173 return hcd_ddf_new_device(ddf_dev, dev, port); 174 } 175 176 static int device_remove(ddf_fun_t *fun, unsigned port) 183 177 { 184 178 assert(fun); … … 187 181 assert(ddf_dev); 188 182 assert(dev); 189 usb_log_debug("Hub `%s' reported removal of device %d\n",190 ddf_fun_get_name(fun), (int)handle);191 return hcd_ddf_remove_device(ddf_dev, dev, (usb_address_t)handle);183 usb_log_debug("Hub `%s' reported removal of device on port %u\n", 184 ddf_fun_get_name(fun), port); 185 return hcd_ddf_remove_device(ddf_dev, dev, port); 192 186 } 193 187 … … 405 399 406 400 static int hcd_ddf_remove_device(ddf_dev_t *device, usb_dev_t *hub, 407 u sb_address_t id)401 unsigned port) 408 402 { 409 403 assert(device); … … 421 415 list_foreach(hub->devices, it) { 422 416 victim = list_get_instance(it, usb_dev_t, link); 423 if (victim-> address == id)417 if (victim->port == port) 424 418 break; 425 419 } 426 if (victim && victim-> address == id) {420 if (victim && victim->port == port) { 427 421 list_remove(&victim->link); 428 422 fibril_mutex_unlock(&hc_dev->guard); … … 432 426 hcd_release_address(hcd, victim->address); 433 427 } else { 434 usb_log_warning("Failed to unbind device %d: %s\n",435 id, str_error(ret));428 usb_log_warning("Failed to unbind device `%s': %s\n", 429 ddf_fun_get_name(victim->fun), str_error(ret)); 436 430 } 437 431 return EOK; … … 440 434 } 441 435 442 static int hcd_ddf_new_device(ddf_dev_t *device, usb_dev_t *hub, unsigned port, 443 usb_address_t *id) 436 static int hcd_ddf_new_device(ddf_dev_t *device, usb_dev_t *hub, unsigned port) 444 437 { 445 438 assert(device); … … 552 545 hcd_remove_ep(hcd, target, USB_DIRECTION_BOTH); 553 546 hcd_release_address(hcd, target.address); 554 return ret; 555 } 556 if (ret == EOK && id) 557 *id = target.address; 547 } 558 548 559 549 return ret; … … 574 564 575 565 hcd_reserve_default_address(hcd, speed); 576 const int ret = hcd_ddf_new_device(device, NULL, 0 , NULL);566 const int ret = hcd_ddf_new_device(device, NULL, 0); 577 567 hcd_release_default_address(hcd); 578 568 return ret;
Note:
See TracChangeset
for help on using the changeset viewer.