diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-01-25 16:33:17 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-01-25 16:33:17 -0500 |
commit | a28dde6181f235c876d70a5e76aaaa3229286c38 (patch) | |
tree | 83b7e237120c960f0b3505500a27cb3ec4e748d5 | |
parent | 949db153b6466c6f7cad5a427ecea94985927311 (diff) | |
parent | 54a3ac0c9e5b7213daa358ce74d154352657353a (diff) |
Merge tag 'for-usb-linus-2012-01-24' of git://git.kernel.org/pub/scm/linux/kernel/git/sarah/xhci into usb-linus
Sarah writes:
USB/xhci: Misc fixes for 3.8.
Hi Greg,
Here's six patches for xHCI and the USB core. There's a couple of
patches to fix xHCI 1.0 field formats, some memory leaks, dead ports,
and USB 3.0 remote wakeup disabling.
All of these are marked for stable.
I know I owe you some re-works of failed stable patches from my last
patchset round, but I don't think I'm going to get to them before I head
off to Linux Conf Australia tomorrow.
Sarah Sharp
-rw-r--r-- | drivers/usb/core/hub.c | 70 | ||||
-rw-r--r-- | drivers/usb/host/pci-quirks.c | 1 | ||||
-rw-r--r-- | drivers/usb/host/xhci-ring.c | 13 | ||||
-rw-r--r-- | include/uapi/linux/usb/ch9.h | 6 |
4 files changed, 68 insertions, 22 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 957ed2c41482..cbf7168e3ce7 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -2838,6 +2838,23 @@ void usb_enable_ltm(struct usb_device *udev) | |||
2838 | EXPORT_SYMBOL_GPL(usb_enable_ltm); | 2838 | EXPORT_SYMBOL_GPL(usb_enable_ltm); |
2839 | 2839 | ||
2840 | #ifdef CONFIG_USB_SUSPEND | 2840 | #ifdef CONFIG_USB_SUSPEND |
2841 | /* | ||
2842 | * usb_disable_function_remotewakeup - disable usb3.0 | ||
2843 | * device's function remote wakeup | ||
2844 | * @udev: target device | ||
2845 | * | ||
2846 | * Assume there's only one function on the USB 3.0 | ||
2847 | * device and disable remote wake for the first | ||
2848 | * interface. FIXME if the interface association | ||
2849 | * descriptor shows there's more than one function. | ||
2850 | */ | ||
2851 | static int usb_disable_function_remotewakeup(struct usb_device *udev) | ||
2852 | { | ||
2853 | return usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2854 | USB_REQ_CLEAR_FEATURE, USB_RECIP_INTERFACE, | ||
2855 | USB_INTRF_FUNC_SUSPEND, 0, NULL, 0, | ||
2856 | USB_CTRL_SET_TIMEOUT); | ||
2857 | } | ||
2841 | 2858 | ||
2842 | /* | 2859 | /* |
2843 | * usb_port_suspend - suspend a usb device's upstream port | 2860 | * usb_port_suspend - suspend a usb device's upstream port |
@@ -2955,12 +2972,19 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
2955 | dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", | 2972 | dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", |
2956 | port1, status); | 2973 | port1, status); |
2957 | /* paranoia: "should not happen" */ | 2974 | /* paranoia: "should not happen" */ |
2958 | if (udev->do_remote_wakeup) | 2975 | if (udev->do_remote_wakeup) { |
2959 | (void) usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 2976 | if (!hub_is_superspeed(hub->hdev)) { |
2960 | USB_REQ_CLEAR_FEATURE, USB_RECIP_DEVICE, | 2977 | (void) usb_control_msg(udev, |
2961 | USB_DEVICE_REMOTE_WAKEUP, 0, | 2978 | usb_sndctrlpipe(udev, 0), |
2962 | NULL, 0, | 2979 | USB_REQ_CLEAR_FEATURE, |
2963 | USB_CTRL_SET_TIMEOUT); | 2980 | USB_RECIP_DEVICE, |
2981 | USB_DEVICE_REMOTE_WAKEUP, 0, | ||
2982 | NULL, 0, | ||
2983 | USB_CTRL_SET_TIMEOUT); | ||
2984 | } else | ||
2985 | (void) usb_disable_function_remotewakeup(udev); | ||
2986 | |||
2987 | } | ||
2964 | 2988 | ||
2965 | /* Try to enable USB2 hardware LPM again */ | 2989 | /* Try to enable USB2 hardware LPM again */ |
2966 | if (udev->usb2_hw_lpm_capable == 1) | 2990 | if (udev->usb2_hw_lpm_capable == 1) |
@@ -3052,20 +3076,30 @@ static int finish_port_resume(struct usb_device *udev) | |||
3052 | * udev->reset_resume | 3076 | * udev->reset_resume |
3053 | */ | 3077 | */ |
3054 | } else if (udev->actconfig && !udev->reset_resume) { | 3078 | } else if (udev->actconfig && !udev->reset_resume) { |
3055 | le16_to_cpus(&devstatus); | 3079 | if (!hub_is_superspeed(udev->parent)) { |
3056 | if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) { | 3080 | le16_to_cpus(&devstatus); |
3057 | status = usb_control_msg(udev, | 3081 | if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) |
3058 | usb_sndctrlpipe(udev, 0), | 3082 | status = usb_control_msg(udev, |
3059 | USB_REQ_CLEAR_FEATURE, | 3083 | usb_sndctrlpipe(udev, 0), |
3084 | USB_REQ_CLEAR_FEATURE, | ||
3060 | USB_RECIP_DEVICE, | 3085 | USB_RECIP_DEVICE, |
3061 | USB_DEVICE_REMOTE_WAKEUP, 0, | 3086 | USB_DEVICE_REMOTE_WAKEUP, 0, |
3062 | NULL, 0, | 3087 | NULL, 0, |
3063 | USB_CTRL_SET_TIMEOUT); | 3088 | USB_CTRL_SET_TIMEOUT); |
3064 | if (status) | 3089 | } else { |
3065 | dev_dbg(&udev->dev, | 3090 | status = usb_get_status(udev, USB_RECIP_INTERFACE, 0, |
3066 | "disable remote wakeup, status %d\n", | 3091 | &devstatus); |
3067 | status); | 3092 | le16_to_cpus(&devstatus); |
3093 | if (!status && devstatus & (USB_INTRF_STAT_FUNC_RW_CAP | ||
3094 | | USB_INTRF_STAT_FUNC_RW)) | ||
3095 | status = | ||
3096 | usb_disable_function_remotewakeup(udev); | ||
3068 | } | 3097 | } |
3098 | |||
3099 | if (status) | ||
3100 | dev_dbg(&udev->dev, | ||
3101 | "disable remote wakeup, status %d\n", | ||
3102 | status); | ||
3069 | status = 0; | 3103 | status = 0; |
3070 | } | 3104 | } |
3071 | return status; | 3105 | return status; |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index a3b6d7104ae2..4c338ec03a07 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
@@ -780,6 +780,7 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev) | |||
780 | "defaulting to EHCI.\n"); | 780 | "defaulting to EHCI.\n"); |
781 | dev_warn(&xhci_pdev->dev, | 781 | dev_warn(&xhci_pdev->dev, |
782 | "USB 3.0 devices will work at USB 2.0 speeds.\n"); | 782 | "USB 3.0 devices will work at USB 2.0 speeds.\n"); |
783 | usb_disable_xhci_ports(xhci_pdev); | ||
783 | return; | 784 | return; |
784 | } | 785 | } |
785 | 786 | ||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 59fb5c677dbe..7f76a49e90d3 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -1698,7 +1698,7 @@ static void handle_port_status(struct xhci_hcd *xhci, | |||
1698 | faked_port_index + 1); | 1698 | faked_port_index + 1); |
1699 | if (slot_id && xhci->devs[slot_id]) | 1699 | if (slot_id && xhci->devs[slot_id]) |
1700 | xhci_ring_device(xhci, slot_id); | 1700 | xhci_ring_device(xhci, slot_id); |
1701 | if (bus_state->port_remote_wakeup && (1 << faked_port_index)) { | 1701 | if (bus_state->port_remote_wakeup & (1 << faked_port_index)) { |
1702 | bus_state->port_remote_wakeup &= | 1702 | bus_state->port_remote_wakeup &= |
1703 | ~(1 << faked_port_index); | 1703 | ~(1 << faked_port_index); |
1704 | xhci_test_and_clear_bit(xhci, port_array, | 1704 | xhci_test_and_clear_bit(xhci, port_array, |
@@ -2589,6 +2589,8 @@ cleanup: | |||
2589 | (trb_comp_code != COMP_STALL && | 2589 | (trb_comp_code != COMP_STALL && |
2590 | trb_comp_code != COMP_BABBLE)) | 2590 | trb_comp_code != COMP_BABBLE)) |
2591 | xhci_urb_free_priv(xhci, urb_priv); | 2591 | xhci_urb_free_priv(xhci, urb_priv); |
2592 | else | ||
2593 | kfree(urb_priv); | ||
2592 | 2594 | ||
2593 | usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb); | 2595 | usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb); |
2594 | if ((urb->actual_length != urb->transfer_buffer_length && | 2596 | if ((urb->actual_length != urb->transfer_buffer_length && |
@@ -3108,7 +3110,7 @@ static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len, | |||
3108 | * running_total. | 3110 | * running_total. |
3109 | */ | 3111 | */ |
3110 | packets_transferred = (running_total + trb_buff_len) / | 3112 | packets_transferred = (running_total + trb_buff_len) / |
3111 | usb_endpoint_maxp(&urb->ep->desc); | 3113 | GET_MAX_PACKET(usb_endpoint_maxp(&urb->ep->desc)); |
3112 | 3114 | ||
3113 | if ((total_packet_count - packets_transferred) > 31) | 3115 | if ((total_packet_count - packets_transferred) > 31) |
3114 | return 31 << 17; | 3116 | return 31 << 17; |
@@ -3642,7 +3644,8 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3642 | td_len = urb->iso_frame_desc[i].length; | 3644 | td_len = urb->iso_frame_desc[i].length; |
3643 | td_remain_len = td_len; | 3645 | td_remain_len = td_len; |
3644 | total_packet_count = DIV_ROUND_UP(td_len, | 3646 | total_packet_count = DIV_ROUND_UP(td_len, |
3645 | usb_endpoint_maxp(&urb->ep->desc)); | 3647 | GET_MAX_PACKET( |
3648 | usb_endpoint_maxp(&urb->ep->desc))); | ||
3646 | /* A zero-length transfer still involves at least one packet. */ | 3649 | /* A zero-length transfer still involves at least one packet. */ |
3647 | if (total_packet_count == 0) | 3650 | if (total_packet_count == 0) |
3648 | total_packet_count++; | 3651 | total_packet_count++; |
@@ -3664,9 +3667,11 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3664 | td = urb_priv->td[i]; | 3667 | td = urb_priv->td[i]; |
3665 | for (j = 0; j < trbs_per_td; j++) { | 3668 | for (j = 0; j < trbs_per_td; j++) { |
3666 | u32 remainder = 0; | 3669 | u32 remainder = 0; |
3667 | field = TRB_TBC(burst_count) | TRB_TLBPC(residue); | 3670 | field = 0; |
3668 | 3671 | ||
3669 | if (first_trb) { | 3672 | if (first_trb) { |
3673 | field = TRB_TBC(burst_count) | | ||
3674 | TRB_TLBPC(residue); | ||
3670 | /* Queue the isoc TRB */ | 3675 | /* Queue the isoc TRB */ |
3671 | field |= TRB_TYPE(TRB_ISOC); | 3676 | field |= TRB_TYPE(TRB_ISOC); |
3672 | /* Assume URB_ISO_ASAP is set */ | 3677 | /* Assume URB_ISO_ASAP is set */ |
diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h index 50598472dc41..f738e25377ff 100644 --- a/include/uapi/linux/usb/ch9.h +++ b/include/uapi/linux/usb/ch9.h | |||
@@ -152,6 +152,12 @@ | |||
152 | #define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0)) | 152 | #define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0)) |
153 | #define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1)) | 153 | #define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1)) |
154 | 154 | ||
155 | /* | ||
156 | * Interface status, Figure 9-5 USB 3.0 spec | ||
157 | */ | ||
158 | #define USB_INTRF_STAT_FUNC_RW_CAP 1 | ||
159 | #define USB_INTRF_STAT_FUNC_RW 2 | ||
160 | |||
155 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ | 161 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ |
156 | 162 | ||
157 | /* Bit array elements as returned by the USB_REQ_GET_STATUS request. */ | 163 | /* Bit array elements as returned by the USB_REQ_GET_STATUS request. */ |