usb_hub.c (255488) | usb_hub.c (257206) |
---|---|
1/* $FreeBSD: head/sys/dev/usb/usb_hub.c 255488 2013-09-12 10:39:38Z hselasky $ */ | 1/* $FreeBSD: head/sys/dev/usb/usb_hub.c 257206 2013-10-27 10:09:53Z hselasky $ */ |
2/*- 3 * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved. 4 * Copyright (c) 1998 Lennart Augustsson. All rights reserved. 5 * Copyright (c) 2008-2010 Hans Petter Selasky. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: --- 233 unchanged lines hidden (view full) --- 243 } 244 245 /* check if device should be re-enumerated */ 246 247 if (child->flags.usb_mode == USB_MODE_HOST) { 248 uint8_t do_unlock; 249 250 do_unlock = usbd_enum_lock(child); | 2/*- 3 * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved. 4 * Copyright (c) 1998 Lennart Augustsson. All rights reserved. 5 * Copyright (c) 2008-2010 Hans Petter Selasky. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: --- 233 unchanged lines hidden (view full) --- 243 } 244 245 /* check if device should be re-enumerated */ 246 247 if (child->flags.usb_mode == USB_MODE_HOST) { 248 uint8_t do_unlock; 249 250 do_unlock = usbd_enum_lock(child); |
251 if (child->re_enumerate_wait) { | 251 switch (child->re_enumerate_wait) { 252 case USB_RE_ENUM_START: |
252 err = usbd_set_config_index(child, 253 USB_UNCONFIG_INDEX); 254 if (err != 0) { 255 DPRINTF("Unconfigure failed: " 256 "%s: Ignored.\n", 257 usbd_errstr(err)); 258 } 259 err = usbd_req_re_enumerate(child, NULL); 260 if (err == 0) 261 err = usbd_set_config_index(child, 0); 262 if (err == 0) { 263 err = usb_probe_and_attach(child, 264 USB_IFACE_INDEX_ANY); 265 } | 253 err = usbd_set_config_index(child, 254 USB_UNCONFIG_INDEX); 255 if (err != 0) { 256 DPRINTF("Unconfigure failed: " 257 "%s: Ignored.\n", 258 usbd_errstr(err)); 259 } 260 err = usbd_req_re_enumerate(child, NULL); 261 if (err == 0) 262 err = usbd_set_config_index(child, 0); 263 if (err == 0) { 264 err = usb_probe_and_attach(child, 265 USB_IFACE_INDEX_ANY); 266 } |
266 child->re_enumerate_wait = 0; | 267 child->re_enumerate_wait = USB_RE_ENUM_DONE; |
267 err = 0; | 268 err = 0; |
269 break; 270 271 case USB_RE_ENUM_PWR_OFF: 272 /* get the device unconfigured */ 273 err = usbd_set_config_index(child, 274 USB_UNCONFIG_INDEX); 275 if (err) { 276 DPRINTFN(0, "Could not unconfigure " 277 "device (ignored)\n"); 278 } 279 280 /* clear port enable */ 281 err = usbd_req_clear_port_feature(child->parent_hub, 282 NULL, child->port_no, UHF_PORT_ENABLE); 283 if (err) { 284 DPRINTFN(0, "Could not disable port " 285 "(ignored)\n"); 286 } 287 child->re_enumerate_wait = USB_RE_ENUM_DONE; 288 err = 0; 289 break; 290 291 default: 292 child->re_enumerate_wait = USB_RE_ENUM_DONE; 293 break; |
|
268 } 269 if (do_unlock) 270 usbd_enum_unlock(child); 271 } 272 273 /* check if probe and attach should be done */ 274 275 if (child->driver_added_refcount != refcount) { --- 1805 unchanged lines hidden (view full) --- 2081 * This function returns non-zero if the current device should wake up. 2082 *------------------------------------------------------------------------*/ 2083static uint8_t 2084usb_peer_should_wakeup(struct usb_device *udev) 2085{ 2086 return (((udev->power_mode == USB_POWER_MODE_ON) && 2087 (udev->flags.usb_mode == USB_MODE_HOST)) || 2088 (udev->driver_added_refcount != udev->bus->driver_added_refcount) || | 294 } 295 if (do_unlock) 296 usbd_enum_unlock(child); 297 } 298 299 /* check if probe and attach should be done */ 300 301 if (child->driver_added_refcount != refcount) { --- 1805 unchanged lines hidden (view full) --- 2107 * This function returns non-zero if the current device should wake up. 2108 *------------------------------------------------------------------------*/ 2109static uint8_t 2110usb_peer_should_wakeup(struct usb_device *udev) 2111{ 2112 return (((udev->power_mode == USB_POWER_MODE_ON) && 2113 (udev->flags.usb_mode == USB_MODE_HOST)) || 2114 (udev->driver_added_refcount != udev->bus->driver_added_refcount) || |
2089 (udev->re_enumerate_wait != 0) || | 2115 (udev->re_enumerate_wait != USB_RE_ENUM_DONE) || |
2090 (udev->pwr_save.type_refs[UE_ISOCHRONOUS] != 0) || 2091 (udev->pwr_save.write_refs != 0) || 2092 ((udev->pwr_save.read_refs != 0) && 2093 (udev->flags.usb_mode == USB_MODE_HOST) && 2094 (usb_peer_can_wakeup(udev) == 0))); 2095} 2096 2097/*------------------------------------------------------------------------* --- 399 unchanged lines hidden (view full) --- 2497 power_mode = USB_POWER_MODE_SAVE; 2498 2499 power_mode = usbd_filter_power_mode(udev, power_mode); 2500 2501 udev->power_mode = power_mode; /* update copy of power mode */ 2502 2503#if USB_HAVE_POWERD 2504 usb_bus_power_update(udev->bus); | 2116 (udev->pwr_save.type_refs[UE_ISOCHRONOUS] != 0) || 2117 (udev->pwr_save.write_refs != 0) || 2118 ((udev->pwr_save.read_refs != 0) && 2119 (udev->flags.usb_mode == USB_MODE_HOST) && 2120 (usb_peer_can_wakeup(udev) == 0))); 2121} 2122 2123/*------------------------------------------------------------------------* --- 399 unchanged lines hidden (view full) --- 2523 power_mode = USB_POWER_MODE_SAVE; 2524 2525 power_mode = usbd_filter_power_mode(udev, power_mode); 2526 2527 udev->power_mode = power_mode; /* update copy of power mode */ 2528 2529#if USB_HAVE_POWERD 2530 usb_bus_power_update(udev->bus); |
2531#else 2532 usb_needs_explore(udev->bus, 0 /* no probe */ ); |
|
2505#endif 2506} 2507 2508/*------------------------------------------------------------------------* 2509 * usbd_filter_power_mode 2510 * 2511 * This function filters the power mode based on hardware requirements. 2512 *------------------------------------------------------------------------*/ --- 22 unchanged lines hidden (view full) --- 2535 * 2536 * This function starts re-enumeration of the given USB device. This 2537 * function does not need to be called BUS-locked. This function does 2538 * not wait until the re-enumeration is completed. 2539 *------------------------------------------------------------------------*/ 2540void 2541usbd_start_re_enumerate(struct usb_device *udev) 2542{ | 2533#endif 2534} 2535 2536/*------------------------------------------------------------------------* 2537 * usbd_filter_power_mode 2538 * 2539 * This function filters the power mode based on hardware requirements. 2540 *------------------------------------------------------------------------*/ --- 22 unchanged lines hidden (view full) --- 2563 * 2564 * This function starts re-enumeration of the given USB device. This 2565 * function does not need to be called BUS-locked. This function does 2566 * not wait until the re-enumeration is completed. 2567 *------------------------------------------------------------------------*/ 2568void 2569usbd_start_re_enumerate(struct usb_device *udev) 2570{ |
2543 if (udev->re_enumerate_wait == 0) { 2544 udev->re_enumerate_wait = 1; | 2571 if (udev->re_enumerate_wait == USB_RE_ENUM_DONE) { 2572 udev->re_enumerate_wait = USB_RE_ENUM_START; |
2545 usb_needs_explore(udev->bus, 0); 2546 } 2547} | 2573 usb_needs_explore(udev->bus, 0); 2574 } 2575} |