aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/host/xhci-mem.c14
-rw-r--r--drivers/usb/host/xhci.c15
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
1667void xhci_urb_free_priv(struct xhci_hcd *xhci, struct urb_priv *urb_priv) 1667void 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
1683void xhci_free_command(struct xhci_hcd *xhci, 1675void 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,
1035int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) 1035int 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;