diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/host/xhci-mem.c | 14 | ||||
-rw-r--r-- | drivers/usb/host/xhci.c | 15 |
2 files changed, 12 insertions, 17 deletions
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 1c5c9ba141db..c4b8959e01e7 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
@@ -1666,18 +1666,10 @@ struct xhci_command *xhci_alloc_command(struct xhci_hcd *xhci, | |||
1666 | 1666 | ||
1667 | void xhci_urb_free_priv(struct xhci_hcd *xhci, struct urb_priv *urb_priv) | 1667 | void xhci_urb_free_priv(struct xhci_hcd *xhci, struct urb_priv *urb_priv) |
1668 | { | 1668 | { |
1669 | int last; | 1669 | if (urb_priv) { |
1670 | 1670 | kfree(urb_priv->td[0]); | |
1671 | if (!urb_priv) | 1671 | kfree(urb_priv); |
1672 | return; | ||
1673 | |||
1674 | last = urb_priv->length - 1; | ||
1675 | if (last >= 0) { | ||
1676 | int i; | ||
1677 | for (i = 0; i <= last; i++) | ||
1678 | kfree(urb_priv->td[i]); | ||
1679 | } | 1672 | } |
1680 | kfree(urb_priv); | ||
1681 | } | 1673 | } |
1682 | 1674 | ||
1683 | void xhci_free_command(struct xhci_hcd *xhci, | 1675 | void xhci_free_command(struct xhci_hcd *xhci, |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 40b82f7e4297..6440bd210c48 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -1035,6 +1035,7 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id, | |||
1035 | int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) | 1035 | int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) |
1036 | { | 1036 | { |
1037 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 1037 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
1038 | struct xhci_td *buffer; | ||
1038 | unsigned long flags; | 1039 | unsigned long flags; |
1039 | int ret = 0; | 1040 | int ret = 0; |
1040 | unsigned int slot_id, ep_index; | 1041 | unsigned int slot_id, ep_index; |
@@ -1065,13 +1066,15 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) | |||
1065 | if (!urb_priv) | 1066 | if (!urb_priv) |
1066 | return -ENOMEM; | 1067 | return -ENOMEM; |
1067 | 1068 | ||
1069 | buffer = kzalloc(size * sizeof(struct xhci_td), mem_flags); | ||
1070 | if (!buffer) { | ||
1071 | kfree(urb_priv); | ||
1072 | return -ENOMEM; | ||
1073 | } | ||
1074 | |||
1068 | for (i = 0; i < size; i++) { | 1075 | for (i = 0; i < size; i++) { |
1069 | urb_priv->td[i] = kzalloc(sizeof(struct xhci_td), mem_flags); | 1076 | urb_priv->td[i] = buffer; |
1070 | if (!urb_priv->td[i]) { | 1077 | buffer++; |
1071 | urb_priv->length = i; | ||
1072 | xhci_urb_free_priv(xhci, urb_priv); | ||
1073 | return -ENOMEM; | ||
1074 | } | ||
1075 | } | 1078 | } |
1076 | 1079 | ||
1077 | urb_priv->length = size; | 1080 | urb_priv->length = size; |