Hi, On Mon, Dec 19, 2011 at 10:19:46AM -0500, Alan Stern wrote: > 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 > > --- > > 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 > > #include > > #include > > +#include > > > > #include > > #include > > @@ -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. actually there's no 'mapped' field on struct usb_request. That's a nonsense added to all struct my_controller_request just because of that DMA_ADDR_INVALID hackery. I'm dropping that completely. There were no gadget drivers allocating memory from coherent or mapping requests themselves, so req->mapped becomes useless. -- balbi