Skip to content

Commit

Permalink
usb: musb: gadget: do *unmap_dma_buffer* only for valid DMA addr
Browse files Browse the repository at this point in the history
musb does not use DMA buffer for ep0 but it uses the same giveback
function *musb_g_giveback* for all endpoints (*musb_g_ep0_giveback* calls
*musb_g_giveback*). So for ep0 case request.dma will be '0'
and will result in kernel OOPS if tried to *unmap_dma_buffer* for requests in
ep0. Fixed it by doing *unmap_dma_buffer* only for valid DMA addr and
checking that musb_ep->dma is valid when unmapping.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
  • Loading branch information
Kishon Vijay Abraham I authored and Felipe Balbi committed Mar 18, 2013
1 parent 273daf2 commit 06d9db7
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions drivers/usb/musb/musb_gadget.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,9 @@ static inline void map_dma_buffer(struct musb_request *request,
static inline void unmap_dma_buffer(struct musb_request *request,
struct musb *musb)
{
if (!is_buffer_mapped(request))
struct musb_ep *musb_ep = request->ep;

if (!is_buffer_mapped(request) || !musb_ep->dma)
return;

if (request->request.dma == DMA_ADDR_INVALID) {
Expand Down Expand Up @@ -195,7 +197,10 @@ __acquires(ep->musb->lock)

ep->busy = 1;
spin_unlock(&musb->lock);
unmap_dma_buffer(req, musb);

if (!dma_mapping_error(&musb->g.dev, request->dma))
unmap_dma_buffer(req, musb);

if (request->status == 0)
dev_dbg(musb->controller, "%s done request %p, %d/%d\n",
ep->end_point.name, request,
Expand Down

0 comments on commit 06d9db7

Please sign in to comment.