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);