mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-27 17:18:53 +00:00
d0f084d449
This commit backports the Linux upstream commit (d4a6106) [*] that introduces a check to prevent the sglist from being used unconditionally. [*] 'xhci: fix bounce buffer usage for non-sg list case' Fixes #4116.
549 lines
18 KiB
Diff
549 lines
18 KiB
Diff
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
|
|
index c821b4b..5accd4d 100644
|
|
--- a/drivers/usb/core/config.c
|
|
+++ b/drivers/usb/core/config.c
|
|
@@ -706,7 +706,7 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx,
|
|
}
|
|
|
|
len = sizeof(*intfc) + sizeof(struct usb_host_interface) * j;
|
|
- config->intf_cache[i] = intfc = kzalloc(len, GFP_KERNEL);
|
|
+ config->intf_cache[i] = intfc = kzalloc(len, GFP_LX_DMA);
|
|
if (!intfc)
|
|
return -ENOMEM;
|
|
kref_init(&intfc->ref);
|
|
@@ -817,16 +817,16 @@ int usb_get_configuration(struct usb_device *dev)
|
|
}
|
|
|
|
length = ncfg * sizeof(struct usb_host_config);
|
|
- dev->config = kzalloc(length, GFP_KERNEL);
|
|
+ dev->config = kzalloc(length, GFP_LX_DMA);
|
|
if (!dev->config)
|
|
goto err2;
|
|
|
|
length = ncfg * sizeof(char *);
|
|
- dev->rawdescriptors = kzalloc(length, GFP_KERNEL);
|
|
+ dev->rawdescriptors = kzalloc(length, GFP_LX_DMA);
|
|
if (!dev->rawdescriptors)
|
|
goto err2;
|
|
|
|
- desc = kmalloc(USB_DT_CONFIG_SIZE, GFP_KERNEL);
|
|
+ desc = kmalloc(USB_DT_CONFIG_SIZE, GFP_LX_DMA);
|
|
if (!desc)
|
|
goto err2;
|
|
|
|
@@ -855,7 +855,7 @@ int usb_get_configuration(struct usb_device *dev)
|
|
USB_DT_CONFIG_SIZE);
|
|
|
|
/* Now that we know the length, get the whole thing */
|
|
- bigbuffer = kmalloc(length, GFP_KERNEL);
|
|
+ bigbuffer = kmalloc(length, GFP_LX_DMA);
|
|
if (!bigbuffer) {
|
|
result = -ENOMEM;
|
|
goto err;
|
|
@@ -928,7 +928,7 @@ int usb_get_bos_descriptor(struct usb_device *dev)
|
|
__u8 cap_type;
|
|
int ret;
|
|
|
|
- bos = kzalloc(sizeof(struct usb_bos_descriptor), GFP_KERNEL);
|
|
+ bos = kzalloc(sizeof(struct usb_bos_descriptor), GFP_LX_DMA);
|
|
if (!bos)
|
|
return -ENOMEM;
|
|
|
|
@@ -949,12 +949,12 @@ int usb_get_bos_descriptor(struct usb_device *dev)
|
|
if (total_len < length)
|
|
return -EINVAL;
|
|
|
|
- dev->bos = kzalloc(sizeof(struct usb_host_bos), GFP_KERNEL);
|
|
+ dev->bos = kzalloc(sizeof(struct usb_host_bos), GFP_LX_DMA);
|
|
if (!dev->bos)
|
|
return -ENOMEM;
|
|
|
|
/* Now let's get the whole BOS descriptor set */
|
|
- buffer = kzalloc(total_len, GFP_KERNEL);
|
|
+ buffer = kzalloc(total_len, GFP_LX_DMA);
|
|
if (!buffer) {
|
|
ret = -ENOMEM;
|
|
goto err;
|
|
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
|
|
index fc32391..919c9e9 100644
|
|
--- a/drivers/usb/core/hcd.c
|
|
+++ b/drivers/usb/core/hcd.c
|
|
@@ -507,7 +507,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
|
|
* USB hub descriptor.
|
|
*/
|
|
tbuf_size = max_t(u16, sizeof(struct usb_hub_descriptor), wLength);
|
|
- tbuf = kzalloc(tbuf_size, GFP_KERNEL);
|
|
+ tbuf = kzalloc(tbuf_size, GFP_LX_DMA);
|
|
if (!tbuf) {
|
|
status = -ENOMEM;
|
|
goto err_alloc;
|
|
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
index c5c1f6c..5bd400f 100644
|
|
--- a/drivers/usb/core/hub.c
|
|
+++ b/drivers/usb/core/hub.c
|
|
@@ -706,7 +706,7 @@ resubmit:
|
|
if (hub->quiescing)
|
|
return;
|
|
|
|
- status = usb_submit_urb(hub->urb, GFP_ATOMIC);
|
|
+ status = usb_submit_urb(hub->urb, GFP_LX_DMA);
|
|
if (status != 0 && status != -ENODEV && status != -EPERM)
|
|
dev_err(hub->intfdev, "resubmit --> %d\n", status);
|
|
}
|
|
@@ -1310,20 +1310,20 @@ static int hub_configure(struct usb_hub *hub,
|
|
unsigned full_load;
|
|
unsigned maxchild;
|
|
|
|
- hub->buffer = kmalloc(sizeof(*hub->buffer), GFP_KERNEL);
|
|
+ hub->buffer = kmalloc(sizeof(*hub->buffer), GFP_LX_DMA);
|
|
if (!hub->buffer) {
|
|
ret = -ENOMEM;
|
|
goto fail;
|
|
}
|
|
|
|
- hub->status = kmalloc(sizeof(*hub->status), GFP_KERNEL);
|
|
+ hub->status = kmalloc(sizeof(*hub->status), GFP_LX_DMA);
|
|
if (!hub->status) {
|
|
ret = -ENOMEM;
|
|
goto fail;
|
|
}
|
|
mutex_init(&hub->status_mutex);
|
|
|
|
- hub->descriptor = kzalloc(sizeof(*hub->descriptor), GFP_KERNEL);
|
|
+ hub->descriptor = kzalloc(sizeof(*hub->descriptor), GFP_LX_DMA);
|
|
if (!hub->descriptor) {
|
|
ret = -ENOMEM;
|
|
goto fail;
|
|
@@ -1565,7 +1565,7 @@ static int hub_configure(struct usb_hub *hub,
|
|
if (maxp > sizeof(*hub->buffer))
|
|
maxp = sizeof(*hub->buffer);
|
|
|
|
- hub->urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
+ hub->urb = usb_alloc_urb(0, GFP_LX_DMA);
|
|
if (!hub->urb) {
|
|
ret = -ENOMEM;
|
|
goto fail;
|
|
@@ -4713,7 +4713,7 @@ check_highspeed(struct usb_hub *hub, struct usb_device *udev, int port1)
|
|
if (udev->quirks & USB_QUIRK_DEVICE_QUALIFIER)
|
|
return;
|
|
|
|
- qual = kmalloc(sizeof *qual, GFP_KERNEL);
|
|
+ qual = kmalloc(sizeof *qual, GFP_LX_DMA);
|
|
if (qual == NULL)
|
|
return;
|
|
|
|
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
|
|
index b3f98e0..3442858 100644
|
|
--- a/drivers/usb/core/message.c
|
|
+++ b/drivers/usb/core/message.c
|
|
@@ -237,7 +237,7 @@ int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,
|
|
if (!ep || len < 0)
|
|
return -EINVAL;
|
|
|
|
- urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
+ urb = usb_alloc_urb(0, GFP_LX_DMA);
|
|
if (!urb)
|
|
return -ENOMEM;
|
|
|
|
@@ -990,7 +989,7 @@ int usb_get_status(struct usb_device *dev, int recip, int type, int target,
|
|
return -EINVAL;
|
|
}
|
|
|
|
- status = kmalloc(length, GFP_KERNEL);
|
|
+ status = kmalloc(length, GFP_LX_DMA);
|
|
if (!status)
|
|
return -ENOMEM;
|
|
|
|
@@ -2084,7 +2083,7 @@ int usb_driver_set_configuration(struct usb_device *udev, int config)
|
|
{
|
|
struct set_config_request *req;
|
|
|
|
- req = kmalloc(sizeof(*req), GFP_KERNEL);
|
|
+ req = kmalloc(sizeof(*req), GFP_LX_DMA);
|
|
if (!req)
|
|
return -ENOMEM;
|
|
req->udev = udev;
|
|
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
|
|
index 0a84661..f427b75 100644
|
|
--- a/drivers/usb/host/ehci-hub.c
|
|
+++ b/drivers/usb/host/ehci-hub.c
|
|
@@ -749,7 +749,7 @@ static struct urb *request_single_step_set_feature_urb(
|
|
struct usb_hcd *hcd = bus_to_hcd(udev->bus);
|
|
struct usb_host_endpoint *ep;
|
|
|
|
- urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
+ urb = usb_alloc_urb(0, GFP_LX_DMA);
|
|
if (!urb)
|
|
return NULL;
|
|
|
|
@@ -804,11 +803,11 @@ static int ehset_single_step_set_feature(struct usb_hcd *hcd, int port)
|
|
ehci_err(ehci, "No device attached to the RootHub\n");
|
|
return -ENODEV;
|
|
}
|
|
- buf = kmalloc(USB_DT_DEVICE_SIZE, GFP_KERNEL);
|
|
+ buf = kmalloc(USB_DT_DEVICE_SIZE, GFP_LX_DMA);
|
|
if (!buf)
|
|
return -ENOMEM;
|
|
|
|
- dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
|
|
+ dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_LX_DMA);
|
|
if (!dr) {
|
|
kfree(buf);
|
|
return -ENOMEM;
|
|
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
|
|
index 3276304..8b9e337 100644
|
|
--- a/drivers/usb/host/ehci-q.c
|
|
+++ b/drivers/usb/host/ehci-q.c
|
|
@@ -1020,7 +1020,7 @@ static struct ehci_qh *qh_append_tds (
|
|
qh = (struct ehci_qh *) *ptr;
|
|
if (unlikely (qh == NULL)) {
|
|
/* can't sleep here, we have ehci->lock... */
|
|
- qh = qh_make (ehci, urb, GFP_ATOMIC);
|
|
+ qh = qh_make (ehci, urb, GFP_LX_DMA);
|
|
*ptr = qh;
|
|
}
|
|
if (likely (qh != NULL)) {
|
|
@@ -1172,7 +1172,7 @@ static int submit_single_step_set_feature(
|
|
head = &qtd_list;
|
|
|
|
/* URBs map to sequences of QTDs: one logical transaction */
|
|
- qtd = ehci_qtd_alloc(ehci, GFP_KERNEL);
|
|
+ qtd = ehci_qtd_alloc(ehci, GFP_LX_DMA);
|
|
if (unlikely(!qtd))
|
|
return -1;
|
|
list_add_tail(&qtd->qtd_list, head);
|
|
@@ -1193,7 +1193,7 @@ static int submit_single_step_set_feature(
|
|
sizeof(struct usb_ctrlrequest),
|
|
QTD_IOC | token | (2 /* "setup" */ << 8), 8);
|
|
|
|
- submit_async(ehci, urb, &qtd_list, GFP_ATOMIC);
|
|
+ submit_async(ehci, urb, &qtd_list, GFP_LX_DMA);
|
|
return 0; /*Return now; we shall come back after 15 seconds*/
|
|
}
|
|
|
|
@@ -1221,7 +1221,7 @@ static int submit_single_step_set_feature(
|
|
token |= QTD_TOGGLE; /* force DATA1 */
|
|
|
|
qtd_prev = qtd;
|
|
- qtd = ehci_qtd_alloc(ehci, GFP_ATOMIC);
|
|
+ qtd = ehci_qtd_alloc(ehci, GFP_LX_DMA);
|
|
if (unlikely(!qtd))
|
|
goto cleanup;
|
|
qtd->urb = urb;
|
|
@@ -1231,7 +1231,7 @@ static int submit_single_step_set_feature(
|
|
/* Interrupt after STATUS completion */
|
|
qtd_fill(ehci, qtd, 0, 0, token | QTD_IOC, 0);
|
|
|
|
- submit_async(ehci, urb, &qtd_list, GFP_KERNEL);
|
|
+ submit_async(ehci, urb, &qtd_list, GFP_LX_DMA);
|
|
|
|
return 0;
|
|
|
|
diff --git a/drivers/usb/host/ohci-dbg.c b/drivers/usb/host/ohci-dbg.c
|
|
index ac7d4ac..1eb1fc7 100644
|
|
--- a/drivers/usb/host/ohci-dbg.c
|
|
+++ b/drivers/usb/host/ohci-dbg.c
|
|
@@ -683,7 +683,7 @@ static int fill_buffer(struct debug_buffer *buf)
|
|
int ret = 0;
|
|
|
|
if (!buf->page)
|
|
- buf->page = (char *)get_zeroed_page(GFP_KERNEL);
|
|
+ buf->page = (char *)get_zeroed_page(GFP_LX_DMA);
|
|
|
|
if (!buf->page) {
|
|
ret = -ENOMEM;
|
|
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
|
|
index d088c34..2211b20 100644
|
|
--- a/drivers/usb/host/ohci-hcd.c
|
|
+++ b/drivers/usb/host/ohci-hcd.c
|
|
@@ -506,7 +506,7 @@ static int ohci_init (struct ohci_hcd *ohci)
|
|
ohci->prev_frame_no = IO_WATCHDOG_OFF;
|
|
|
|
ohci->hcca = dma_alloc_coherent (hcd->self.controller,
|
|
- sizeof(*ohci->hcca), &ohci->hcca_dma, GFP_KERNEL);
|
|
+ sizeof(*ohci->hcca), &ohci->hcca_dma, GFP_LX_DMA);
|
|
if (!ohci->hcca)
|
|
return -ENOMEM;
|
|
|
|
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c
|
|
index f9c3947..99a1696 100644
|
|
--- a/drivers/usb/host/uhci-hcd.c
|
|
+++ b/drivers/usb/host/uhci-hcd.c
|
|
@@ -602,7 +602,7 @@ static int uhci_start(struct usb_hcd *hcd)
|
|
|
|
uhci->frame = dma_zalloc_coherent(uhci_dev(uhci),
|
|
UHCI_NUMFRAMES * sizeof(*uhci->frame),
|
|
- &uhci->frame_dma_handle, GFP_KERNEL);
|
|
+ &uhci->frame_dma_handle, GFP_LX_DMA);
|
|
if (!uhci->frame) {
|
|
dev_err(uhci_dev(uhci),
|
|
"unable to allocate consistent memory for frame list\n");
|
|
@@ -610,7 +610,7 @@ static int uhci_start(struct usb_hcd *hcd)
|
|
}
|
|
|
|
uhci->frame_cpu = kcalloc(UHCI_NUMFRAMES, sizeof(*uhci->frame_cpu),
|
|
- GFP_KERNEL);
|
|
+ GFP_LX_DMA);
|
|
if (!uhci->frame_cpu)
|
|
goto err_alloc_frame_cpu;
|
|
|
|
diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c
|
|
index 35fcb82..3a0cff5 100644
|
|
--- a/drivers/usb/host/uhci-q.c
|
|
+++ b/drivers/usb/host/uhci-q.c
|
|
@@ -108,7 +108,7 @@ static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci)
|
|
dma_addr_t dma_handle;
|
|
struct uhci_td *td;
|
|
|
|
- td = dma_pool_alloc(uhci->td_pool, GFP_ATOMIC, &dma_handle);
|
|
+ td = dma_pool_alloc(uhci->td_pool, GFP_LX_DMA, &dma_handle);
|
|
if (!td)
|
|
return NULL;
|
|
|
|
@@ -248,7 +248,7 @@ static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci,
|
|
dma_addr_t dma_handle;
|
|
struct uhci_qh *qh;
|
|
|
|
- qh = dma_pool_zalloc(uhci->qh_pool, GFP_ATOMIC, &dma_handle);
|
|
+ qh = dma_pool_zalloc(uhci->qh_pool, GFP_LX_DMA, &dma_handle);
|
|
if (!qh)
|
|
return NULL;
|
|
|
|
@@ -724,7 +724,7 @@ static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci,
|
|
{
|
|
struct urb_priv *urbp;
|
|
|
|
- urbp = kmem_cache_zalloc(uhci_up_cachep, GFP_ATOMIC);
|
|
+ urbp = kmem_cache_zalloc(uhci_up_cachep, GFP_LX_DMA);
|
|
if (!urbp)
|
|
return NULL;
|
|
|
|
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
|
|
index 72ebbc9..0e815a8 100644
|
|
--- a/drivers/usb/host/xhci-hub.c
|
|
+++ b/drivers/usb/host/xhci-hub.c
|
|
@@ -404,7 +404,7 @@ static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend)
|
|
if (GET_EP_CTX_STATE(ep_ctx) != EP_STATE_RUNNING)
|
|
continue;
|
|
|
|
- command = xhci_alloc_command(xhci, false, GFP_NOWAIT);
|
|
+ command = xhci_alloc_command(xhci, false, GFP_LX_DMA);
|
|
if (!command) {
|
|
spin_unlock_irqrestore(&xhci->lock, flags);
|
|
ret = -ENOMEM;
|
|
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
|
|
index 332420d..e037aaf 100644
|
|
--- a/drivers/usb/host/xhci-mem.c
|
|
+++ b/drivers/usb/host/xhci-mem.c
|
|
@@ -2135,7 +2135,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
|
|
rhub->psi_count = XHCI_EXT_PORT_PSIC(temp);
|
|
if (rhub->psi_count) {
|
|
rhub->psi = kcalloc(rhub->psi_count, sizeof(*rhub->psi),
|
|
- GFP_KERNEL);
|
|
+ GFP_LX_DMA);
|
|
if (!rhub->psi)
|
|
rhub->psi_count = 0;
|
|
|
|
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
|
|
index daa94c3..028891a 100644
|
|
--- a/drivers/usb/host/xhci-ring.c
|
|
+++ b/drivers/usb/host/xhci-ring.c
|
|
@@ -656,6 +656,7 @@
|
|
struct device *dev = xhci_to_hcd(xhci)->self.controller;
|
|
struct xhci_segment *seg = td->bounce_seg;
|
|
struct urb *urb = td->urb;
|
|
+ size_t len;
|
|
|
|
if (!ring || !seg || !urb)
|
|
return;
|
|
@@ -667,8 +668,16 @@
|
|
}
|
|
|
|
/* for in tranfers we need to copy the data from bounce to sg */
|
|
- sg_pcopy_from_buffer(urb->sg, urb->num_mapped_sgs, seg->bounce_buf,
|
|
- seg->bounce_len, seg->bounce_offs);
|
|
+ if (urb->num_sgs) {
|
|
+ len = sg_pcopy_from_buffer(urb->sg, urb->num_mapped_sgs, seg->bounce_buf,
|
|
+ seg->bounce_len, seg->bounce_offs);
|
|
+ if (len != seg->bounce_len)
|
|
+ xhci_warn(xhci, "WARN Wrong bounce buffer read length: %zu != %d\n",
|
|
+ len, seg->bounce_len);
|
|
+ } else {
|
|
+ memcpy(urb->transfer_buffer + seg->bounce_offs, seg->bounce_buf,
|
|
+ seg->bounce_len);
|
|
+ }
|
|
dma_unmap_single(dev, seg->bounce_dma, ring->bounce_buf_len,
|
|
DMA_FROM_DEVICE);
|
|
seg->bounce_len = 0;
|
|
@@ -1141,7 +1150,7 @@
|
|
if (xhci->quirks & XHCI_RESET_EP_QUIRK) {
|
|
struct xhci_command *command;
|
|
|
|
- command = xhci_alloc_command(xhci, false, GFP_ATOMIC);
|
|
+ command = xhci_alloc_command(xhci, false, GFP_LX_DMA);
|
|
if (!command)
|
|
return;
|
|
|
|
@@ -1821,7 +1830,7 @@
|
|
{
|
|
struct xhci_virt_ep *ep = &xhci->devs[slot_id]->eps[ep_index];
|
|
struct xhci_command *command;
|
|
- command = xhci_alloc_command(xhci, false, GFP_ATOMIC);
|
|
+ command = xhci_alloc_command(xhci, false, GFP_LX_DMA);
|
|
if (!command)
|
|
return;
|
|
|
|
@@ -3136,6 +3145,7 @@
|
|
unsigned int unalign;
|
|
unsigned int max_pkt;
|
|
u32 new_buff_len;
|
|
+ size_t len;
|
|
|
|
max_pkt = usb_endpoint_maxp(&urb->ep->desc);
|
|
unalign = (enqd_len + *trb_buff_len) % max_pkt;
|
|
@@ -3166,8 +3176,17 @@
|
|
|
|
/* create a max max_pkt sized bounce buffer pointed to by last trb */
|
|
if (usb_urb_dir_out(urb)) {
|
|
- sg_pcopy_to_buffer(urb->sg, urb->num_mapped_sgs,
|
|
- seg->bounce_buf, new_buff_len, enqd_len);
|
|
+ if (urb->num_sgs) {
|
|
+ len = sg_pcopy_to_buffer(urb->sg, urb->num_mapped_sgs,
|
|
+ seg->bounce_buf, new_buff_len, enqd_len);
|
|
+ if (len != new_buff_len) {
|
|
+ xhci_warn(xhci, "WARN Wrong bounce buffer write length: %zu != %d\n",
|
|
+ len, new_buff_len);
|
|
+ }
|
|
+ } else {
|
|
+ memcpy(seg->bounce_buf, urb->transfer_buffer + enqd_len,
|
|
+ new_buff_len);
|
|
+ }
|
|
seg->bounce_dma = dma_map_single(dev, seg->bounce_buf,
|
|
max_pkt, DMA_TO_DEVICE);
|
|
} else {
|
|
@@ -3906,7 +3925,7 @@
|
|
reserved_trbs++;
|
|
|
|
ret = prepare_ring(xhci, xhci->cmd_ring, EP_STATE_RUNNING,
|
|
- reserved_trbs, GFP_ATOMIC);
|
|
+ reserved_trbs, GFP_LX_DMA);
|
|
if (ret < 0) {
|
|
xhci_err(xhci, "ERR: No room for command on command ring\n");
|
|
if (command_must_succeed)
|
|
@@ -4040,7 +4059,7 @@
|
|
}
|
|
|
|
/* This function gets called from contexts where it cannot sleep */
|
|
- cmd = xhci_alloc_command(xhci, false, GFP_ATOMIC);
|
|
+ cmd = xhci_alloc_command(xhci, false, GFP_LX_DMA);
|
|
if (!cmd)
|
|
return;
|
|
|
|
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
|
index 5d37700..1945abb 100644
|
|
--- a/drivers/usb/host/xhci.c
|
|
+++ b/drivers/usb/host/xhci.c
|
|
@@ -602,7 +604,7 @@ int xhci_run(struct usb_hcd *hcd)
|
|
if (xhci->quirks & XHCI_NEC_HOST) {
|
|
struct xhci_command *command;
|
|
|
|
- command = xhci_alloc_command(xhci, false, GFP_KERNEL);
|
|
+ command = xhci_alloc_command(xhci, false, GFP_LX_DMA);
|
|
if (!command)
|
|
return -ENOMEM;
|
|
|
|
@@ -1244,7 +1246,7 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id,
|
|
* changes max packet sizes.
|
|
*/
|
|
|
|
- command = xhci_alloc_command(xhci, true, GFP_KERNEL);
|
|
+ command = xhci_alloc_command(xhci, true, GFP_LX_DMA);
|
|
if (!command)
|
|
return -ENOMEM;
|
|
|
|
@@ -1355,7 +1357,7 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
|
|
switch (usb_endpoint_type(&urb->ep->desc)) {
|
|
|
|
case USB_ENDPOINT_XFER_CONTROL:
|
|
- ret = xhci_queue_ctrl_tx(xhci, GFP_ATOMIC, urb,
|
|
+ ret = xhci_queue_ctrl_tx(xhci, GFP_LX_DMA, urb,
|
|
slot_id, ep_index);
|
|
break;
|
|
case USB_ENDPOINT_XFER_BULK:
|
|
@@ -1366,18 +1368,18 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
|
|
ret = -EINVAL;
|
|
break;
|
|
}
|
|
- ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb,
|
|
+ ret = xhci_queue_bulk_tx(xhci, GFP_LX_DMA, urb,
|
|
slot_id, ep_index);
|
|
break;
|
|
|
|
|
|
case USB_ENDPOINT_XFER_INT:
|
|
- ret = xhci_queue_intr_tx(xhci, GFP_ATOMIC, urb,
|
|
+ ret = xhci_queue_intr_tx(xhci, GFP_LX_DMA, urb,
|
|
slot_id, ep_index);
|
|
break;
|
|
|
|
case USB_ENDPOINT_XFER_ISOC:
|
|
- ret = xhci_queue_isoc_tx_prepare(xhci, GFP_ATOMIC, urb,
|
|
+ ret = xhci_queue_isoc_tx_prepare(xhci, GFP_LX_DMA, urb,
|
|
slot_id, ep_index);
|
|
}
|
|
|
|
@@ -1499,7 +1501,7 @@ static int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
|
|
* the first cancellation to be handled.
|
|
*/
|
|
if (!(ep->ep_state & EP_STOP_CMD_PENDING)) {
|
|
- command = xhci_alloc_command(xhci, false, GFP_ATOMIC);
|
|
+ command = xhci_alloc_command(xhci, false, GFP_LX_DMA);
|
|
if (!command) {
|
|
ret = -ENOMEM;
|
|
goto done;
|
|
@@ -2684,7 +2686,7 @@ static int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev)
|
|
xhci_dbg(xhci, "%s called for udev %p\n", __func__, udev);
|
|
virt_dev = xhci->devs[udev->slot_id];
|
|
|
|
- command = xhci_alloc_command(xhci, true, GFP_KERNEL);
|
|
+ command = xhci_alloc_command(xhci, true, GFP_LX_DMA);
|
|
if (!command)
|
|
return -ENOMEM;
|
|
|
|
@@ -3560,7 +3562,7 @@ int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id)
|
|
u32 state;
|
|
int ret = 0;
|
|
|
|
- command = xhci_alloc_command(xhci, false, GFP_KERNEL);
|
|
+ command = xhci_alloc_command(xhci, false, GFP_LX_DMA);
|
|
if (!command)
|
|
return -ENOMEM;
|
|
|
|
@@ -3622,7 +3624,7 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
|
|
int ret, slot_id;
|
|
struct xhci_command *command;
|
|
|
|
- command = xhci_alloc_command(xhci, true, GFP_KERNEL);
|
|
+ command = xhci_alloc_command(xhci, true, GFP_LX_DMA);
|
|
if (!command)
|
|
return 0;
|
|
|
|
@@ -3755,7 +3757,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
|
}
|
|
}
|
|
|
|
- command = xhci_alloc_command(xhci, true, GFP_KERNEL);
|
|
+ command = xhci_alloc_command(xhci, true, GFP_LX_DMA);
|
|
if (!command) {
|
|
ret = -ENOMEM;
|
|
goto out;
|
|
@@ -4688,7 +4690,7 @@ static int xhci_update_hub_device(struct usb_hcd *hcd, struct usb_device *hdev,
|
|
|
|
spin_lock_irqsave(&xhci->lock, flags);
|
|
if (hdev->speed == USB_SPEED_HIGH &&
|
|
- xhci_alloc_tt_info(xhci, vdev, hdev, tt, GFP_ATOMIC)) {
|
|
+ xhci_alloc_tt_info(xhci, vdev, hdev, tt, GFP_LX_DMA)) {
|
|
xhci_dbg(xhci, "Could not allocate xHCI TT structure.\n");
|
|
xhci_free_command(xhci, config_cmd);
|
|
spin_unlock_irqrestore(&xhci->lock, flags);
|