Commit 5e60a161 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

USB: avoid using urb->pipe in usbcore

This patch (as946) eliminates many of the uses of urb->pipe in
usbcore.  Unfortunately there will have to be a significant API
change, affecting all USB drivers, before we can remove it entirely.
This patch contents itself with changing only the interface to
usb_buffer_map_sg() and friends: The pipe argument is replaced with a
direction flag.  That can be done easily because those routines get
used in only one place.
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent fea34091
...@@ -635,9 +635,9 @@ static int rh_queue_status (struct usb_hcd *hcd, struct urb *urb) ...@@ -635,9 +635,9 @@ static int rh_queue_status (struct usb_hcd *hcd, struct urb *urb)
static int rh_urb_enqueue (struct usb_hcd *hcd, struct urb *urb) static int rh_urb_enqueue (struct usb_hcd *hcd, struct urb *urb)
{ {
if (usb_pipeint (urb->pipe)) if (usb_endpoint_xfer_int(&urb->ep->desc))
return rh_queue_status (hcd, urb); return rh_queue_status (hcd, urb);
if (usb_pipecontrol (urb->pipe)) if (usb_endpoint_xfer_control(&urb->ep->desc))
return rh_call_control (hcd, urb); return rh_call_control (hcd, urb);
return -EINVAL; return -EINVAL;
} }
...@@ -651,7 +651,7 @@ static int usb_rh_urb_dequeue (struct usb_hcd *hcd, struct urb *urb) ...@@ -651,7 +651,7 @@ static int usb_rh_urb_dequeue (struct usb_hcd *hcd, struct urb *urb)
{ {
unsigned long flags; unsigned long flags;
if (usb_pipeendpoint(urb->pipe) == 0) { /* Control URB */ if (usb_endpoint_num(&urb->ep->desc) == 0) { /* Control URB */
; /* Do nothing */ ; /* Do nothing */
} else { /* Status URB */ } else { /* Status URB */
...@@ -918,7 +918,7 @@ static void urb_unlink(struct usb_hcd *hcd, struct urb *urb) ...@@ -918,7 +918,7 @@ static void urb_unlink(struct usb_hcd *hcd, struct urb *urb)
spin_unlock_irqrestore(&hcd_urb_list_lock, flags); spin_unlock_irqrestore(&hcd_urb_list_lock, flags);
if (hcd->self.uses_dma && !is_root_hub(urb->dev)) { if (hcd->self.uses_dma && !is_root_hub(urb->dev)) {
if (usb_pipecontrol (urb->pipe) if (usb_endpoint_xfer_control(&urb->ep->desc)
&& !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP)) && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP))
dma_unmap_single (hcd->self.controller, urb->setup_dma, dma_unmap_single (hcd->self.controller, urb->setup_dma,
sizeof (struct usb_ctrlrequest), sizeof (struct usb_ctrlrequest),
...@@ -1001,7 +1001,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags) ...@@ -1001,7 +1001,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
* unless it uses pio or talks to another transport. * unless it uses pio or talks to another transport.
*/ */
if (hcd->self.uses_dma) { if (hcd->self.uses_dma) {
if (usb_pipecontrol (urb->pipe) if (usb_endpoint_xfer_control(&urb->ep->desc)
&& !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP)) && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP))
urb->setup_dma = dma_map_single ( urb->setup_dma = dma_map_single (
hcd->self.controller, hcd->self.controller,
...@@ -1201,11 +1201,13 @@ void usb_hcd_endpoint_disable (struct usb_device *udev, ...@@ -1201,11 +1201,13 @@ void usb_hcd_endpoint_disable (struct usb_device *udev,
spin_lock(&hcd_urb_list_lock); spin_lock(&hcd_urb_list_lock);
list_for_each_entry (urb, &ep->urb_list, urb_list) { list_for_each_entry (urb, &ep->urb_list, urb_list) {
int tmp; int tmp;
int is_in;
/* the urb may already have been unlinked */ /* the urb may already have been unlinked */
if (urb->status != -EINPROGRESS) if (urb->status != -EINPROGRESS)
continue; continue;
usb_get_urb (urb); usb_get_urb (urb);
is_in = usb_urb_dir_in(urb);
spin_unlock(&hcd_urb_list_lock); spin_unlock(&hcd_urb_list_lock);
spin_lock (&urb->lock); spin_lock (&urb->lock);
...@@ -1216,19 +1218,25 @@ void usb_hcd_endpoint_disable (struct usb_device *udev, ...@@ -1216,19 +1218,25 @@ void usb_hcd_endpoint_disable (struct usb_device *udev,
/* kick hcd unless it's already returning this */ /* kick hcd unless it's already returning this */
if (tmp == -EINPROGRESS) { if (tmp == -EINPROGRESS) {
tmp = urb->pipe;
unlink1 (hcd, urb); unlink1 (hcd, urb);
dev_dbg (hcd->self.controller, dev_dbg (hcd->self.controller,
"shutdown urb %p pipe %08x ep%d%s%s\n", "shutdown urb %p ep%d%s%s\n",
urb, tmp, usb_pipeendpoint (tmp), urb, usb_endpoint_num(&ep->desc),
(tmp & USB_DIR_IN) ? "in" : "out", is_in ? "in" : "out",
({ char *s; \ ({ char *s;
switch (usb_pipetype (tmp)) { \
case PIPE_CONTROL: s = ""; break; \ switch (usb_endpoint_type(&ep->desc)) {
case PIPE_BULK: s = "-bulk"; break; \ case USB_ENDPOINT_XFER_CONTROL:
case PIPE_INTERRUPT: s = "-intr"; break; \ s = ""; break;
default: s = "-iso"; break; \ case USB_ENDPOINT_XFER_BULK:
}; s;})); s = "-bulk"; break;
case USB_ENDPOINT_XFER_INT:
s = "-intr"; break;
default:
s = "-iso"; break;
};
s;
}));
} }
usb_put_urb (urb); usb_put_urb (urb);
......
...@@ -59,8 +59,8 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length) ...@@ -59,8 +59,8 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length)
dev_dbg(&urb->dev->dev, dev_dbg(&urb->dev->dev,
"%s timed out on ep%d%s len=%d/%d\n", "%s timed out on ep%d%s len=%d/%d\n",
current->comm, current->comm,
usb_pipeendpoint(urb->pipe), usb_endpoint_num(&urb->ep->desc),
usb_pipein(urb->pipe) ? "in" : "out", usb_urb_dir_in(urb) ? "in" : "out",
urb->actual_length, urb->actual_length,
urb->transfer_buffer_length); urb->transfer_buffer_length);
} else } else
...@@ -250,7 +250,8 @@ static void sg_clean (struct usb_sg_request *io) ...@@ -250,7 +250,8 @@ static void sg_clean (struct usb_sg_request *io)
io->urbs = NULL; io->urbs = NULL;
} }
if (io->dev->dev.dma_mask != NULL) if (io->dev->dev.dma_mask != NULL)
usb_buffer_unmap_sg (io->dev, io->pipe, io->sg, io->nents); usb_buffer_unmap_sg (io->dev, usb_pipein(io->pipe),
io->sg, io->nents);
io->dev = NULL; io->dev = NULL;
} }
...@@ -278,8 +279,8 @@ static void sg_complete (struct urb *urb) ...@@ -278,8 +279,8 @@ static void sg_complete (struct urb *urb)
dev_err (io->dev->bus->controller, dev_err (io->dev->bus->controller,
"dev %s ep%d%s scatterlist error %d/%d\n", "dev %s ep%d%s scatterlist error %d/%d\n",
io->dev->devpath, io->dev->devpath,
usb_pipeendpoint (urb->pipe), usb_endpoint_num(&urb->ep->desc),
usb_pipein (urb->pipe) ? "in" : "out", usb_urb_dir_in(urb) ? "in" : "out",
status, io->status); status, io->status);
// BUG (); // BUG ();
} }
...@@ -379,7 +380,8 @@ int usb_sg_init ( ...@@ -379,7 +380,8 @@ int usb_sg_init (
*/ */
dma = (dev->dev.dma_mask != NULL); dma = (dev->dev.dma_mask != NULL);
if (dma) if (dma)
io->entries = usb_buffer_map_sg (dev, pipe, sg, nents); io->entries = usb_buffer_map_sg(dev, usb_pipein(pipe),
sg, nents);
else else
io->entries = nents; io->entries = nents;
......
...@@ -748,7 +748,7 @@ void usb_buffer_unmap(struct urb *urb) ...@@ -748,7 +748,7 @@ void usb_buffer_unmap(struct urb *urb)
/** /**
* usb_buffer_map_sg - create scatterlist DMA mapping(s) for an endpoint * usb_buffer_map_sg - create scatterlist DMA mapping(s) for an endpoint
* @dev: device to which the scatterlist will be mapped * @dev: device to which the scatterlist will be mapped
* @pipe: endpoint defining the mapping direction * @is_in: mapping transfer direction
* @sg: the scatterlist to map * @sg: the scatterlist to map
* @nents: the number of entries in the scatterlist * @nents: the number of entries in the scatterlist
* *
...@@ -771,14 +771,13 @@ void usb_buffer_unmap(struct urb *urb) ...@@ -771,14 +771,13 @@ void usb_buffer_unmap(struct urb *urb)
* *
* Reverse the effect of this call with usb_buffer_unmap_sg(). * Reverse the effect of this call with usb_buffer_unmap_sg().
*/ */
int usb_buffer_map_sg(const struct usb_device *dev, unsigned pipe, int usb_buffer_map_sg(const struct usb_device *dev, int is_in,
struct scatterlist *sg, int nents) struct scatterlist *sg, int nents)
{ {
struct usb_bus *bus; struct usb_bus *bus;
struct device *controller; struct device *controller;
if (!dev if (!dev
|| usb_pipecontrol(pipe)
|| !(bus = dev->bus) || !(bus = dev->bus)
|| !(controller = bus->controller) || !(controller = bus->controller)
|| !controller->dma_mask) || !controller->dma_mask)
...@@ -786,7 +785,7 @@ int usb_buffer_map_sg(const struct usb_device *dev, unsigned pipe, ...@@ -786,7 +785,7 @@ int usb_buffer_map_sg(const struct usb_device *dev, unsigned pipe,
// FIXME generic api broken like pci, can't report errors // FIXME generic api broken like pci, can't report errors
return dma_map_sg(controller, sg, nents, return dma_map_sg(controller, sg, nents,
usb_pipein(pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE); is_in ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
} }
/* XXX DISABLED, no users currently. If you wish to re-enable this /* XXX DISABLED, no users currently. If you wish to re-enable this
...@@ -799,14 +798,14 @@ int usb_buffer_map_sg(const struct usb_device *dev, unsigned pipe, ...@@ -799,14 +798,14 @@ int usb_buffer_map_sg(const struct usb_device *dev, unsigned pipe,
/** /**
* usb_buffer_dmasync_sg - synchronize DMA and CPU view of scatterlist buffer(s) * usb_buffer_dmasync_sg - synchronize DMA and CPU view of scatterlist buffer(s)
* @dev: device to which the scatterlist will be mapped * @dev: device to which the scatterlist will be mapped
* @pipe: endpoint defining the mapping direction * @is_in: mapping transfer direction
* @sg: the scatterlist to synchronize * @sg: the scatterlist to synchronize
* @n_hw_ents: the positive return value from usb_buffer_map_sg * @n_hw_ents: the positive return value from usb_buffer_map_sg
* *
* Use this when you are re-using a scatterlist's data buffers for * Use this when you are re-using a scatterlist's data buffers for
* another USB request. * another USB request.
*/ */
void usb_buffer_dmasync_sg(const struct usb_device *dev, unsigned pipe, void usb_buffer_dmasync_sg(const struct usb_device *dev, int is_in,
struct scatterlist *sg, int n_hw_ents) struct scatterlist *sg, int n_hw_ents)
{ {
struct usb_bus *bus; struct usb_bus *bus;
...@@ -819,20 +818,20 @@ void usb_buffer_dmasync_sg(const struct usb_device *dev, unsigned pipe, ...@@ -819,20 +818,20 @@ void usb_buffer_dmasync_sg(const struct usb_device *dev, unsigned pipe,
return; return;
dma_sync_sg(controller, sg, n_hw_ents, dma_sync_sg(controller, sg, n_hw_ents,
usb_pipein(pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE); is_in ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
} }
#endif #endif
/** /**
* usb_buffer_unmap_sg - free DMA mapping(s) for a scatterlist * usb_buffer_unmap_sg - free DMA mapping(s) for a scatterlist
* @dev: device to which the scatterlist will be mapped * @dev: device to which the scatterlist will be mapped
* @pipe: endpoint defining the mapping direction * @is_in: mapping transfer direction
* @sg: the scatterlist to unmap * @sg: the scatterlist to unmap
* @n_hw_ents: the positive return value from usb_buffer_map_sg * @n_hw_ents: the positive return value from usb_buffer_map_sg
* *
* Reverses the effect of usb_buffer_map_sg(). * Reverses the effect of usb_buffer_map_sg().
*/ */
void usb_buffer_unmap_sg(const struct usb_device *dev, unsigned pipe, void usb_buffer_unmap_sg(const struct usb_device *dev, int is_in,
struct scatterlist *sg, int n_hw_ents) struct scatterlist *sg, int n_hw_ents)
{ {
struct usb_bus *bus; struct usb_bus *bus;
...@@ -845,7 +844,7 @@ void usb_buffer_unmap_sg(const struct usb_device *dev, unsigned pipe, ...@@ -845,7 +844,7 @@ void usb_buffer_unmap_sg(const struct usb_device *dev, unsigned pipe,
return; return;
dma_unmap_sg(controller, sg, n_hw_ents, dma_unmap_sg(controller, sg, n_hw_ents,
usb_pipein(pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE); is_in ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
} }
/* format to disable USB on kernel command line is: nousb */ /* format to disable USB on kernel command line is: nousb */
......
...@@ -1422,13 +1422,13 @@ void usb_buffer_unmap (struct urb *urb); ...@@ -1422,13 +1422,13 @@ void usb_buffer_unmap (struct urb *urb);
#endif #endif
struct scatterlist; struct scatterlist;
int usb_buffer_map_sg(const struct usb_device *dev, unsigned pipe, int usb_buffer_map_sg(const struct usb_device *dev, int is_in,
struct scatterlist *sg, int nents); struct scatterlist *sg, int nents);
#if 0 #if 0
void usb_buffer_dmasync_sg(const struct usb_device *dev, unsigned pipe, void usb_buffer_dmasync_sg(const struct usb_device *dev, int is_in,
struct scatterlist *sg, int n_hw_ents); struct scatterlist *sg, int n_hw_ents);
#endif #endif
void usb_buffer_unmap_sg(const struct usb_device *dev, unsigned pipe, void usb_buffer_unmap_sg(const struct usb_device *dev, int is_in,
struct scatterlist *sg, int n_hw_ents); struct scatterlist *sg, int n_hw_ents);
/*-------------------------------------------------------------------* /*-------------------------------------------------------------------*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment