usb_hub.c (358874) | usb_hub.c (359317) |
---|---|
1/* $FreeBSD: stable/11/sys/dev/usb/usb_hub.c 358874 2020-03-11 08:21:04Z hselasky $ */ | 1/* $FreeBSD: stable/11/sys/dev/usb/usb_hub.c 359317 2020-03-26 05:37:50Z 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: --- 2591 unchanged lines hidden (view full) --- 2601 if (bus->methods->set_hw_power != NULL) { 2602 /* always update hardware power! */ 2603 (bus->methods->set_hw_power) (bus); 2604 } 2605 return; 2606} 2607#endif 2608 | 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: --- 2591 unchanged lines hidden (view full) --- 2601 if (bus->methods->set_hw_power != NULL) { 2602 /* always update hardware power! */ 2603 (bus->methods->set_hw_power) (bus); 2604 } 2605 return; 2606} 2607#endif 2608 |
2609static usb_error_t 2610usbd_device_30_remote_wakeup(struct usb_device *udev, uint8_t bRequest) 2611{ 2612 struct usb_device_request req = {}; 2613 2614 req.bmRequestType = UT_WRITE_INTERFACE; 2615 req.bRequest = bRequest; 2616 USETW(req.wValue, USB_INTERFACE_FUNC_SUSPEND); 2617 USETW(req.wIndex, USB_INTERFACE_FUNC_SUSPEND_LP | 2618 USB_INTERFACE_FUNC_SUSPEND_RW); 2619 2620 return (usbd_do_request(udev, NULL, &req, 0)); 2621} 2622 2623static usb_error_t 2624usbd_clear_dev_wakeup(struct usb_device *udev) 2625{ 2626 usb_error_t err; 2627 2628 if (usb_device_20_compatible(udev)) { 2629 err = usbd_req_clear_device_feature(udev, 2630 NULL, UF_DEVICE_REMOTE_WAKEUP); 2631 } else { 2632 err = usbd_device_30_remote_wakeup(udev, 2633 UR_CLEAR_FEATURE); 2634 } 2635 return (err); 2636} 2637 2638static usb_error_t 2639usbd_set_dev_wakeup(struct usb_device *udev) 2640{ 2641 usb_error_t err; 2642 2643 if (usb_device_20_compatible(udev)) { 2644 err = usbd_req_set_device_feature(udev, 2645 NULL, UF_DEVICE_REMOTE_WAKEUP); 2646 } else { 2647 err = usbd_device_30_remote_wakeup(udev, 2648 UR_SET_FEATURE); 2649 } 2650 return (err); 2651} 2652 |
|
2609/*------------------------------------------------------------------------* 2610 * usb_dev_resume_peer 2611 * 2612 * This function will resume an USB peer and do the required USB 2613 * signalling to get an USB device out of the suspended state. 2614 *------------------------------------------------------------------------*/ 2615static void 2616usb_dev_resume_peer(struct usb_device *udev) --- 87 unchanged lines hidden (view full) --- 2704 /* notify all sub-devices about resume */ 2705 err = usb_suspend_resume(udev, 0); 2706 2707 usbd_sr_unlock(udev); 2708 2709 /* check if peer has wakeup capability */ 2710 if (usb_peer_can_wakeup(udev)) { 2711 /* clear remote wakeup */ | 2653/*------------------------------------------------------------------------* 2654 * usb_dev_resume_peer 2655 * 2656 * This function will resume an USB peer and do the required USB 2657 * signalling to get an USB device out of the suspended state. 2658 *------------------------------------------------------------------------*/ 2659static void 2660usb_dev_resume_peer(struct usb_device *udev) --- 87 unchanged lines hidden (view full) --- 2748 /* notify all sub-devices about resume */ 2749 err = usb_suspend_resume(udev, 0); 2750 2751 usbd_sr_unlock(udev); 2752 2753 /* check if peer has wakeup capability */ 2754 if (usb_peer_can_wakeup(udev)) { 2755 /* clear remote wakeup */ |
2712 err = usbd_req_clear_device_feature(udev, 2713 NULL, UF_DEVICE_REMOTE_WAKEUP); | 2756 err = usbd_clear_dev_wakeup(udev); |
2714 if (err) { 2715 DPRINTFN(0, "Clearing device " 2716 "remote wakeup failed: %s\n", 2717 usbd_errstr(err)); 2718 } 2719 } 2720} 2721 --- 48 unchanged lines hidden (view full) --- 2770 2771 if (usb_peer_can_wakeup(udev)) { 2772 /* 2773 * This request needs to be done before we set 2774 * "udev->flags.self_suspended": 2775 */ 2776 2777 /* allow device to do remote wakeup */ | 2757 if (err) { 2758 DPRINTFN(0, "Clearing device " 2759 "remote wakeup failed: %s\n", 2760 usbd_errstr(err)); 2761 } 2762 } 2763} 2764 --- 48 unchanged lines hidden (view full) --- 2813 2814 if (usb_peer_can_wakeup(udev)) { 2815 /* 2816 * This request needs to be done before we set 2817 * "udev->flags.self_suspended": 2818 */ 2819 2820 /* allow device to do remote wakeup */ |
2778 err = usbd_req_set_device_feature(udev, 2779 NULL, UF_DEVICE_REMOTE_WAKEUP); | 2821 err = usbd_set_dev_wakeup(udev); |
2780 if (err) { 2781 DPRINTFN(0, "Setting device " 2782 "remote wakeup failed\n"); 2783 } 2784 } 2785 2786 USB_BUS_LOCK(udev->bus); 2787 /* --- 9 unchanged lines hidden (view full) --- 2797 */ 2798 udev->flags.self_suspended = 1; 2799 } 2800 USB_BUS_UNLOCK(udev->bus); 2801 2802 if (err != 0) { 2803 if (usb_peer_can_wakeup(udev)) { 2804 /* allow device to do remote wakeup */ | 2822 if (err) { 2823 DPRINTFN(0, "Setting device " 2824 "remote wakeup failed\n"); 2825 } 2826 } 2827 2828 USB_BUS_LOCK(udev->bus); 2829 /* --- 9 unchanged lines hidden (view full) --- 2839 */ 2840 udev->flags.self_suspended = 1; 2841 } 2842 USB_BUS_UNLOCK(udev->bus); 2843 2844 if (err != 0) { 2845 if (usb_peer_can_wakeup(udev)) { 2846 /* allow device to do remote wakeup */ |
2805 err = usbd_req_clear_device_feature(udev, 2806 NULL, UF_DEVICE_REMOTE_WAKEUP); | 2847 err = usbd_clear_dev_wakeup(udev); |
2807 if (err) { 2808 DPRINTFN(0, "Setting device " 2809 "remote wakeup failed\n"); 2810 } 2811 } 2812 2813 if (udev->flags.usb_mode == USB_MODE_DEVICE) { 2814 /* resume parent HUB first */ --- 151 unchanged lines hidden --- | 2848 if (err) { 2849 DPRINTFN(0, "Setting device " 2850 "remote wakeup failed\n"); 2851 } 2852 } 2853 2854 if (udev->flags.usb_mode == USB_MODE_DEVICE) { 2855 /* resume parent HUB first */ --- 151 unchanged lines hidden --- |