Deleted Added
full compact
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}