On Mon, 19 Dec 2011, Felipe Balbi wrote: > such utilities are currently duplicated on all UDC > drivers basically with the same structure. Let's group > all implementations into one generic implementation > and get rid of that duplication. > > Signed-off-by: Felipe Balbi <balbi@xxxxxx> > --- > drivers/usb/gadget/udc-core.c | 53 +++++++++++++++++++++++++++++++++++++++++ > include/linux/usb/gadget.h | 10 +++++++ > 2 files changed, 63 insertions(+), 0 deletions(-) > > diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c > index 0b0d12c..2031c11 100644 > --- a/drivers/usb/gadget/udc-core.c > +++ b/drivers/usb/gadget/udc-core.c > @@ -22,6 +22,7 @@ > #include <linux/device.h> > #include <linux/list.h> > #include <linux/err.h> > +#include <linux/dma-mapping.h> > > #include <linux/usb/ch9.h> > #include <linux/usb/gadget.h> > @@ -49,6 +50,58 @@ static DEFINE_MUTEX(udc_lock); > > /* ------------------------------------------------------------------------- */ > > +int usb_gadget_map_request(struct usb_gadget *gadget, > + struct usb_request *req, int direction) > +{ > + if (req->length == 0) > + return 0; > + > + if (req->num_sgs) { > + int mapped; > + > + mapped = dma_map_sg(&gadget->dev, req->sg, req->num_sgs, > + direction ? DMA_TO_DEVICE > + : DMA_FROM_DEVICE); > + if (mapped == 0) { > + dev_err(&gadget->dev, "failed to map SGs\n"); > + return -EFAULT; > + } > + > + req->num_mapped_sgs = mapped; > + } else { > + req->dma = dma_map_single(&gadget->dev, req->buf, req->length, > + direction ? DMA_TO_DEVICE : DMA_FROM_DEVICE); > + > + if (dma_mapping_error(&gadget->dev, req->dma)) { > + dev_err(&gadget->dev, "failed to map buffer\n"); > + return -EFAULT; > + } > + } > + > + return 0; You forgot to set req->mapped. > +} > +EXPORT_SYMBOL_GPL(usb_gadget_map_request); > + > +void usb_gadget_unmap_request(struct usb_gadget *gadget, > + struct usb_request *req, int direction) > +{ > + if (req->length == 0) > + return; > + > + if (req->num_mapped_sgs) { > + dma_unmap_sg(&gadget->dev, req->sg, req->num_sgs, > + direction ? DMA_TO_DEVICE : DMA_FROM_DEVICE); > + > + req->num_mapped_sgs = 0; > + } else { > + dma_unmap_single(&gadget->dev, req->dma, req->length, > + direction ? DMA_TO_DEVICE : DMA_FROM_DEVICE); > + } You forgot to clear req->mapped. Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html