&usbhid->inbuf_dma);
        usbhid->outbuf = usb_buffer_alloc(dev, usbhid->bufsize, GFP_KERNEL,
                        &usbhid->outbuf_dma);
-       usbhid->cr = usb_buffer_alloc(dev, sizeof(*usbhid->cr), GFP_KERNEL,
-                       &usbhid->cr_dma);
+       usbhid->cr = kmalloc(sizeof(*usbhid->cr), GFP_KERNEL);
        usbhid->ctrlbuf = usb_buffer_alloc(dev, usbhid->bufsize, GFP_KERNEL,
                        &usbhid->ctrlbuf_dma);
        if (!usbhid->inbuf || !usbhid->outbuf || !usbhid->cr ||
 
        usb_buffer_free(dev, usbhid->bufsize, usbhid->inbuf, usbhid->inbuf_dma);
        usb_buffer_free(dev, usbhid->bufsize, usbhid->outbuf, usbhid->outbuf_dma);
-       usb_buffer_free(dev, sizeof(*(usbhid->cr)), usbhid->cr, usbhid->cr_dma);
+       kfree(usbhid->cr);
        usb_buffer_free(dev, usbhid->bufsize, usbhid->ctrlbuf, usbhid->ctrlbuf_dma);
 }
 
 
        usb_fill_control_urb(usbhid->urbctrl, dev, 0, (void *) usbhid->cr,
                             usbhid->ctrlbuf, 1, hid_ctrl, hid);
-       usbhid->urbctrl->setup_dma = usbhid->cr_dma;
        usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma;
-       usbhid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
+       usbhid->urbctrl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
        if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS))
                usbhid_init_reports(hid);
 
 
        struct urb *urbctrl;                                            /* Control URB */
        struct usb_ctrlrequest *cr;                                     /* Control request struct */
-       dma_addr_t cr_dma;                                              /* Control request struct dma */
        struct hid_control_fifo ctrl[HID_CONTROL_FIFO_SIZE];            /* Control fifo */
        unsigned char ctrlhead, ctrltail;                               /* Control fifo head & tail */
        char *ctrlbuf;                                                  /* Control buffer */
 
        unsigned char *new;
        struct usb_ctrlrequest *cr;
        unsigned char *leds;
-       dma_addr_t cr_dma;
        dma_addr_t new_dma;
        dma_addr_t leds_dma;
 };
                return -1;
        if (!(kbd->new = usb_buffer_alloc(dev, 8, GFP_ATOMIC, &kbd->new_dma)))
                return -1;
-       if (!(kbd->cr = usb_buffer_alloc(dev, sizeof(struct usb_ctrlrequest), GFP_ATOMIC, &kbd->cr_dma)))
+       if (!(kbd->cr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL)))
                return -1;
        if (!(kbd->leds = usb_buffer_alloc(dev, 1, GFP_ATOMIC, &kbd->leds_dma)))
                return -1;
        usb_free_urb(kbd->irq);
        usb_free_urb(kbd->led);
        usb_buffer_free(dev, 8, kbd->new, kbd->new_dma);
-       usb_buffer_free(dev, sizeof(struct usb_ctrlrequest), kbd->cr, kbd->cr_dma);
+       kfree(kbd->cr);
        usb_buffer_free(dev, 1, kbd->leds, kbd->leds_dma);
 }
 
        usb_fill_control_urb(kbd->led, dev, usb_sndctrlpipe(dev, 0),
                             (void *) kbd->cr, kbd->leds, 1,
                             usb_kbd_led, kbd);
-       kbd->led->setup_dma = kbd->cr_dma;
        kbd->led->transfer_dma = kbd->leds_dma;
-       kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
+       kbd->led->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
        error = input_register_device(kbd->dev);
        if (error)
 
        struct cm109_ctl_packet *ctl_data;
        dma_addr_t ctl_dma;
        struct usb_ctrlrequest *ctl_req;
-       dma_addr_t ctl_req_dma;
        struct urb *urb_ctl;
        /*
         * The 3 bitfields below are protected by ctl_submit_lock.
 
 static void cm109_usb_cleanup(struct cm109_dev *dev)
 {
-       if (dev->ctl_req)
-               usb_buffer_free(dev->udev, sizeof(*(dev->ctl_req)),
-                               dev->ctl_req, dev->ctl_req_dma);
+       kfree(dev->ctl_req);
        if (dev->ctl_data)
                usb_buffer_free(dev->udev, USB_PKT_LEN,
                                dev->ctl_data, dev->ctl_dma);
        if (!dev->ctl_data)
                goto err_out;
 
-       dev->ctl_req = usb_buffer_alloc(udev, sizeof(*(dev->ctl_req)),
-                                       GFP_KERNEL, &dev->ctl_req_dma);
+       dev->ctl_req = kmalloc(sizeof(*(dev->ctl_req)), GFP_KERNEL);
        if (!dev->ctl_req)
                goto err_out;
 
        usb_fill_control_urb(dev->urb_ctl, udev, usb_sndctrlpipe(udev, 0),
                             (void *)dev->ctl_req, dev->ctl_data, USB_PKT_LEN,
                             cm109_urb_ctl_callback, dev);
-       dev->urb_ctl->setup_dma = dev->ctl_req_dma;
        dev->urb_ctl->transfer_dma = dev->ctl_dma;
-       dev->urb_ctl->transfer_flags |= URB_NO_SETUP_DMA_MAP |
-                                       URB_NO_TRANSFER_DMA_MAP;
+       dev->urb_ctl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
        dev->urb_ctl->dev = udev;
 
        /* find out the physical bus location */
 
        dma_addr_t data_dma;
        struct urb *irq, *config;
        struct usb_ctrlrequest *configcr;
-       dma_addr_t configcr_dma;
        struct usb_device *udev;
        struct input_dev *input;
        spinlock_t lock;
        usb_fill_control_urb(pm->config, pm->udev, usb_sndctrlpipe(pm->udev, 0),
                             (void *) pm->configcr, NULL, 0,
                             powermate_config_complete, pm);
-       pm->config->setup_dma = pm->configcr_dma;
-       pm->config->transfer_flags |= URB_NO_SETUP_DMA_MAP;
 
        if (usb_submit_urb(pm->config, GFP_ATOMIC))
                printk(KERN_ERR "powermate: usb_submit_urb(config) failed");
        if (!pm->data)
                return -1;
 
-       pm->configcr = usb_buffer_alloc(udev, sizeof(*(pm->configcr)),
-                                       GFP_ATOMIC, &pm->configcr_dma);
+       pm->configcr = kmalloc(sizeof(*(pm->configcr)), GFP_KERNEL);
        if (!pm->configcr)
                return -1;
 
 {
        usb_buffer_free(udev, POWERMATE_PAYLOAD_SIZE_MAX,
                        pm->data, pm->data_dma);
-       usb_buffer_free(udev, sizeof(*(pm->configcr)),
-                       pm->configcr, pm->configcr_dma);
+       kfree(pm->configcr);
 }
 
 /* Called whenever a USB device matching one in our supported devices table is connected */
 
        struct yld_ctl_packet   *ctl_data;
        dma_addr_t              ctl_dma;
        struct usb_ctrlrequest  *ctl_req;
-       dma_addr_t              ctl_req_dma;
        struct urb              *urb_ctl;
 
        char phys[64];                  /* physical device path */
        usb_free_urb(yld->urb_irq);
        usb_free_urb(yld->urb_ctl);
 
-       usb_buffer_free(yld->udev, sizeof(*(yld->ctl_req)),
-                       yld->ctl_req, yld->ctl_req_dma);
+       kfree(yld->ctl_req);
        usb_buffer_free(yld->udev, USB_PKT_LEN,
                        yld->ctl_data, yld->ctl_dma);
        usb_buffer_free(yld->udev, USB_PKT_LEN,
        if (!yld->ctl_data)
                return usb_cleanup(yld, -ENOMEM);
 
-       yld->ctl_req = usb_buffer_alloc(udev, sizeof(*(yld->ctl_req)),
-                                       GFP_ATOMIC, &yld->ctl_req_dma);
+       yld->ctl_req = kmalloc(sizeof(*(yld->ctl_req)), GFP_KERNEL);
        if (yld->ctl_req == NULL)
                return usb_cleanup(yld, -ENOMEM);
 
        usb_fill_control_urb(yld->urb_ctl, udev, usb_sndctrlpipe(udev, 0),
                        (void *)yld->ctl_req, yld->ctl_data, USB_PKT_LEN,
                        urb_ctl_callback, yld);
-       yld->urb_ctl->setup_dma = yld->ctl_req_dma;
        yld->urb_ctl->transfer_dma      = yld->ctl_dma;
-       yld->urb_ctl->transfer_flags    |= URB_NO_SETUP_DMA_MAP |
-                                       URB_NO_TRANSFER_DMA_MAP;
+       yld->urb_ctl->transfer_flags    |= URB_NO_TRANSFER_DMA_MAP;
        yld->urb_ctl->dev = udev;
 
        /* find out the physical bus location */
 
                return -EPIPE;          /* The most suitable error code :-) */
 
        /* enforce simple/standard policy */
-       allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP |
-                       URB_NO_INTERRUPT | URB_DIR_MASK | URB_FREE_BUFFER);
+       allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT | URB_DIR_MASK |
+                       URB_FREE_BUFFER);
        switch (xfertype) {
        case USB_ENDPOINT_XFER_BULK:
                if (is_out)
 
  * @urb: urb whose transfer_buffer/setup_packet will be mapped
  *
  * Return value is either null (indicating no buffer could be mapped), or
- * the parameter.  URB_NO_TRANSFER_DMA_MAP and URB_NO_SETUP_DMA_MAP are
+ * the parameter.  URB_NO_TRANSFER_DMA_MAP is
  * added to urb->transfer_flags if the operation succeeds.  If the device
  * is connected to this system through a non-DMA controller, this operation
  * always succeeds.
                        urb->transfer_buffer, urb->transfer_buffer_length,
                        usb_pipein(urb->pipe)
                                ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
-               if (usb_pipecontrol(urb->pipe))
-                       urb->setup_dma = dma_map_single(controller,
-                                       urb->setup_packet,
-                                       sizeof(struct usb_ctrlrequest),
-                                       DMA_TO_DEVICE);
        /* FIXME generic api broken like pci, can't report errors */
        /* if (urb->transfer_dma == DMA_ADDR_INVALID) return 0; */
        } else
                urb->transfer_dma = ~0;
-       urb->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP
-                               | URB_NO_SETUP_DMA_MAP);
+       urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
        return urb;
 }
 EXPORT_SYMBOL_GPL(usb_buffer_map);
                        urb->transfer_dma, urb->transfer_buffer_length,
                        usb_pipein(urb->pipe)
                                ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
-               if (usb_pipecontrol(urb->pipe))
-                       dma_unmap_single(controller,
-                                       urb->setup_dma,
-                                       sizeof(struct usb_ctrlrequest),
-                                       DMA_TO_DEVICE);
        }
-       urb->transfer_flags &= ~(URB_NO_TRANSFER_DMA_MAP
-                               | URB_NO_SETUP_DMA_MAP);
+       urb->transfer_flags &= ~URB_NO_TRANSFER_DMA_MAP;
 }
 EXPORT_SYMBOL_GPL(usb_buffer_unmap);
 #endif  /*  0  */
 
                if (!u)
                        goto cleanup;
 
-               reqp = usb_buffer_alloc (udev, sizeof *reqp, GFP_KERNEL,
-                               &u->setup_dma);
+               reqp = kmalloc(sizeof *reqp, GFP_KERNEL);
                if (!reqp)
                        goto cleanup;
                reqp->setup = req;
                reqp->number = i % NUM_SUBCASES;
                reqp->expected = expected;
                u->setup_packet = (char *) &reqp->setup;
-               u->transfer_flags |= URB_NO_SETUP_DMA_MAP;
 
                u->context = &context;
                u->complete = ctrl_complete;
                if (!urb [i])
                        continue;
                urb [i]->dev = udev;
-               if (urb [i]->setup_packet)
-                       usb_buffer_free (udev, sizeof (struct usb_ctrlrequest),
-                                       urb [i]->setup_packet,
-                                       urb [i]->setup_dma);
+               kfree(urb[i]->setup_packet);
                simple_free_urb (urb [i]);
        }
        kfree (urb);
 
         * hasn't been mapped for DMA.  Yes, this is clunky, but it's
         * easier than always having the caller tell us whether the
         * transfer buffer has already been mapped. */
-       us->current_urb->transfer_flags = URB_NO_SETUP_DMA_MAP;
        if (us->current_urb->transfer_buffer == us->iobuf)
                us->current_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
        us->current_urb->transfer_dma = us->iobuf_dma;
-       us->current_urb->setup_dma = us->cr_dma;
 
        /* submit the URB */
        status = usb_submit_urb(us->current_urb, GFP_NOIO);
 
        /* Store our private data in the interface */
        usb_set_intfdata(intf, us);
 
-       /* Allocate the device-related DMA-mapped buffers */
-       us->cr = usb_buffer_alloc(us->pusb_dev, sizeof(*us->cr),
-                       GFP_KERNEL, &us->cr_dma);
+       /* Allocate the control/setup and DMA-mapped buffers */
+       us->cr = kmalloc(sizeof(*us->cr), GFP_KERNEL);
        if (!us->cr) {
                US_DEBUGP("usb_ctrlrequest allocation failed\n");
                return -ENOMEM;
 {
        US_DEBUGP("-- %s\n", __func__);
 
-       /* Free the device-related DMA-mapped buffers */
-       if (us->cr)
-               usb_buffer_free(us->pusb_dev, sizeof(*us->cr), us->cr,
-                               us->cr_dma);
-       if (us->iobuf)
-               usb_buffer_free(us->pusb_dev, US_IOBUF_SIZE, us->iobuf,
-                               us->iobuf_dma);
+       /* Free the buffers */
+       kfree(us->cr);
+       usb_buffer_free(us->pusb_dev, US_IOBUF_SIZE, us->iobuf, us->iobuf_dma);
 
        /* Remove our private data from the interface */
        usb_set_intfdata(us->pusb_intf, NULL);
 
        struct usb_ctrlrequest  *cr;             /* control requests     */
        struct usb_sg_request   current_sg;      /* scatter-gather req.  */
        unsigned char           *iobuf;          /* I/O buffer           */
-       dma_addr_t              cr_dma;          /* buffer DMA addresses */
-       dma_addr_t              iobuf_dma;
+       dma_addr_t              iobuf_dma;       /* buffer DMA addresses */
        struct task_struct      *ctl_thread;     /* the control thread   */
 
        /* mutual exclusion and synchronization structures */
 
                struct wa_xfer_ctl *xfer_ctl =
                        container_of(xfer_hdr0, struct wa_xfer_ctl, hdr);
                xfer_ctl->bmAttribute = xfer->is_inbound ? 1 : 0;
-               BUG_ON(xfer->urb->transfer_flags & URB_NO_SETUP_DMA_MAP
-                      && xfer->urb->setup_packet == NULL);
                memcpy(&xfer_ctl->baSetupData, xfer->urb->setup_packet,
                       sizeof(xfer_ctl->baSetupData));
                break;