Deleted Added
full compact
1/* $FreeBSD: stable/9/sys/dev/usb/controller/usb_controller.c 242775 2012-11-08 16:13:51Z hselasky $ */
1/* $FreeBSD: stable/9/sys/dev/usb/controller/usb_controller.c 247090 2013-02-21 07:48:07Z hselasky $ */
2/*-
3 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.

--- 392 unchanged lines hidden (view full) ---

402 * This function is used to suspend the USB contoller.
403 *------------------------------------------------------------------------*/
404static void
405usb_bus_suspend(struct usb_proc_msg *pm)
406{
407 struct usb_bus *bus;
408 struct usb_device *udev;
409 usb_error_t err;
410 uint8_t do_unlock;
411
412 bus = ((struct usb_bus_msg *)pm)->bus;
413 udev = bus->devices[USB_ROOT_HUB_ADDR];
414
415 if (udev == NULL || bus->bdev == NULL)
416 return;
417
418 USB_BUS_UNLOCK(bus);

--- 4 unchanged lines hidden (view full) ---

423 * resume. The USB system suspend is implemented like full
424 * shutdown and all connected USB devices will be disconnected
425 * subsequently. At resume all USB devices will be
426 * re-connected again.
427 */
428
429 bus_generic_shutdown(bus->bdev);
430
430 usbd_enum_lock(udev);
431 do_unlock = usbd_enum_lock(udev);
432
433 err = usbd_set_config_index(udev, USB_UNCONFIG_INDEX);
434 if (err)
435 device_printf(bus->bdev, "Could not unconfigure root HUB\n");
436
437 USB_BUS_LOCK(bus);
438 bus->hw_power_state = 0;
439 bus->no_explore = 1;
440 USB_BUS_UNLOCK(bus);
441
442 if (bus->methods->set_hw_power != NULL)
443 (bus->methods->set_hw_power) (bus);
444
445 if (bus->methods->set_hw_power_sleep != NULL)
446 (bus->methods->set_hw_power_sleep) (bus, USB_HW_POWER_SUSPEND);
447
447 usbd_enum_unlock(udev);
448 if (do_unlock)
449 usbd_enum_unlock(udev);
450
451 USB_BUS_LOCK(bus);
452}
453
454/*------------------------------------------------------------------------*
455 * usb_bus_resume
456 *
457 * This function is used to resume the USB contoller.
458 *------------------------------------------------------------------------*/
459static void
460usb_bus_resume(struct usb_proc_msg *pm)
461{
462 struct usb_bus *bus;
463 struct usb_device *udev;
464 usb_error_t err;
465 uint8_t do_unlock;
466
467 bus = ((struct usb_bus_msg *)pm)->bus;
468 udev = bus->devices[USB_ROOT_HUB_ADDR];
469
470 if (udev == NULL || bus->bdev == NULL)
471 return;
472
473 USB_BUS_UNLOCK(bus);
474
472 usbd_enum_lock(udev);
475 do_unlock = usbd_enum_lock(udev);
476#if 0
477 DEVMETHOD(usb_take_controller, NULL); /* dummy */
478#endif
479 USB_TAKE_CONTROLLER(device_get_parent(bus->bdev));
480
481 USB_BUS_LOCK(bus);
482 bus->hw_power_state =
483 USB_HW_POWER_CONTROL |

--- 17 unchanged lines hidden (view full) ---

501
502 /* probe and attach */
503 err = usb_probe_and_attach(udev, USB_IFACE_INDEX_ANY);
504 if (err) {
505 device_printf(bus->bdev, "Could not probe and "
506 "attach root HUB\n");
507 }
508
506 usbd_enum_unlock(udev);
509 if (do_unlock)
510 usbd_enum_unlock(udev);
511
512 USB_BUS_LOCK(bus);
513}
514
515/*------------------------------------------------------------------------*
516 * usb_bus_shutdown
517 *
518 * This function is used to shutdown the USB contoller.
519 *------------------------------------------------------------------------*/
520static void
521usb_bus_shutdown(struct usb_proc_msg *pm)
522{
523 struct usb_bus *bus;
524 struct usb_device *udev;
525 usb_error_t err;
526 uint8_t do_unlock;
527
528 bus = ((struct usb_bus_msg *)pm)->bus;
529 udev = bus->devices[USB_ROOT_HUB_ADDR];
530
531 if (udev == NULL || bus->bdev == NULL)
532 return;
533
534 USB_BUS_UNLOCK(bus);
535
536 bus_generic_shutdown(bus->bdev);
537
533 usbd_enum_lock(udev);
538 do_unlock = usbd_enum_lock(udev);
539
540 err = usbd_set_config_index(udev, USB_UNCONFIG_INDEX);
541 if (err)
542 device_printf(bus->bdev, "Could not unconfigure root HUB\n");
543
544 USB_BUS_LOCK(bus);
545 bus->hw_power_state = 0;
546 bus->no_explore = 1;
547 USB_BUS_UNLOCK(bus);
548
549 if (bus->methods->set_hw_power != NULL)
550 (bus->methods->set_hw_power) (bus);
551
552 if (bus->methods->set_hw_power_sleep != NULL)
553 (bus->methods->set_hw_power_sleep) (bus, USB_HW_POWER_SHUTDOWN);
554
550 usbd_enum_unlock(udev);
555 if (do_unlock)
556 usbd_enum_unlock(udev);
557
558 USB_BUS_LOCK(bus);
559}
560
561static void
562usb_power_wdog(void *arg)
563{
564 struct usb_bus *bus = arg;

--- 315 unchanged lines hidden ---