mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
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: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
fea3409112
commit
5e60a16139
4 changed files with 44 additions and 35 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
* 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 @@ rescan:
|
||||||
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 @@ rescan:
|
||||||
|
|
||||||
/* 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)
|
||||||
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)
|
||||||
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)
|
||||||
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 (
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
/**
|
/**
|
||||||
* 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)
|
||||||
*
|
*
|
||||||
* 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,
|
||||||
|
|
||||||
// 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,
|
||||||
/**
|
/**
|
||||||
* 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,
|
||||||
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,
|
||||||
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);
|
||||||
#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);
|
||||||
|
|
||||||
/*-------------------------------------------------------------------*
|
/*-------------------------------------------------------------------*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue