Commit 5e0aa49e authored by Alexander Shishkin's avatar Alexander Shishkin Committed by Greg Kroah-Hartman

usb: chipidea: use generic map/unmap routines

We're one of the remaining drivers to map/unmap requests by hand. Switch
to using generic gadget routines for that instead.
Signed-off-by: default avatarAlexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent bd841986
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
/****************************************************************************** /******************************************************************************
* DEFINE * DEFINE
*****************************************************************************/ *****************************************************************************/
#define DMA_ADDR_INVALID (~(dma_addr_t)0)
#define CI13XXX_PAGE_SIZE 4096ul /* page size for TD's */ #define CI13XXX_PAGE_SIZE 4096ul /* page size for TD's */
#define ENDPT_MAX 32 #define ENDPT_MAX 32
......
...@@ -404,36 +404,23 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq) ...@@ -404,36 +404,23 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq)
return -EALREADY; return -EALREADY;
mReq->req.status = -EALREADY; mReq->req.status = -EALREADY;
if (length && mReq->req.dma == DMA_ADDR_INVALID) {
mReq->req.dma = \
dma_map_single(mEp->device, mReq->req.buf,
length, mEp->dir ? DMA_TO_DEVICE :
DMA_FROM_DEVICE);
if (mReq->req.dma == 0)
return -ENOMEM;
mReq->map = 1;
}
if (mReq->req.zero && length && (length % mEp->ep.maxpacket == 0)) { if (mReq->req.zero && length && (length % mEp->ep.maxpacket == 0)) {
mReq->zptr = dma_pool_alloc(mEp->td_pool, GFP_ATOMIC, mReq->zptr = dma_pool_alloc(mEp->td_pool, GFP_ATOMIC,
&mReq->zdma); &mReq->zdma);
if (mReq->zptr == NULL) { if (mReq->zptr == NULL)
if (mReq->map) {
dma_unmap_single(mEp->device, mReq->req.dma,
length, mEp->dir ? DMA_TO_DEVICE :
DMA_FROM_DEVICE);
mReq->req.dma = DMA_ADDR_INVALID;
mReq->map = 0;
}
return -ENOMEM; return -ENOMEM;
}
memset(mReq->zptr, 0, sizeof(*mReq->zptr)); memset(mReq->zptr, 0, sizeof(*mReq->zptr));
mReq->zptr->next = TD_TERMINATE; mReq->zptr->next = TD_TERMINATE;
mReq->zptr->token = TD_STATUS_ACTIVE; mReq->zptr->token = TD_STATUS_ACTIVE;
if (!mReq->req.no_interrupt) if (!mReq->req.no_interrupt)
mReq->zptr->token |= TD_IOC; mReq->zptr->token |= TD_IOC;
} }
ret = usb_gadget_map_request(&udc->gadget, &mReq->req, mEp->dir);
if (ret)
return ret;
/* /*
* TD configuration * TD configuration
* TODO - handle requests which spawns into several TDs * TODO - handle requests which spawns into several TDs
...@@ -514,12 +501,7 @@ static int _hardware_dequeue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq) ...@@ -514,12 +501,7 @@ static int _hardware_dequeue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq)
mReq->req.status = 0; mReq->req.status = 0;
if (mReq->map) { usb_gadget_unmap_request(&mEp->udc->gadget, &mReq->req, mEp->dir);
dma_unmap_single(mEp->device, mReq->req.dma, mReq->req.length,
mEp->dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
mReq->req.dma = DMA_ADDR_INVALID;
mReq->map = 0;
}
mReq->req.status = mReq->ptr->token & TD_STATUS; mReq->req.status = mReq->ptr->token & TD_STATUS;
if ((TD_STATUS_HALTED & mReq->req.status) != 0) if ((TD_STATUS_HALTED & mReq->req.status) != 0)
...@@ -1121,7 +1103,6 @@ static struct usb_request *ep_alloc_request(struct usb_ep *ep, gfp_t gfp_flags) ...@@ -1121,7 +1103,6 @@ static struct usb_request *ep_alloc_request(struct usb_ep *ep, gfp_t gfp_flags)
mReq = kzalloc(sizeof(struct ci13xxx_req), gfp_flags); mReq = kzalloc(sizeof(struct ci13xxx_req), gfp_flags);
if (mReq != NULL) { if (mReq != NULL) {
INIT_LIST_HEAD(&mReq->queue); INIT_LIST_HEAD(&mReq->queue);
mReq->req.dma = DMA_ADDR_INVALID;
mReq->ptr = dma_pool_alloc(mEp->td_pool, gfp_flags, mReq->ptr = dma_pool_alloc(mEp->td_pool, gfp_flags,
&mReq->dma); &mReq->dma);
...@@ -1253,12 +1234,9 @@ static int ep_dequeue(struct usb_ep *ep, struct usb_request *req) ...@@ -1253,12 +1234,9 @@ static int ep_dequeue(struct usb_ep *ep, struct usb_request *req)
/* pop request */ /* pop request */
list_del_init(&mReq->queue); list_del_init(&mReq->queue);
if (mReq->map) {
dma_unmap_single(mEp->device, mReq->req.dma, mReq->req.length, usb_gadget_unmap_request(&mEp->udc->gadget, req, mEp->dir);
mEp->dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
mReq->req.dma = DMA_ADDR_INVALID;
mReq->map = 0;
}
req->status = -ECONNRESET; req->status = -ECONNRESET;
if (mReq->req.complete != NULL) { if (mReq->req.complete != NULL) {
......
...@@ -62,7 +62,6 @@ struct ci13xxx_qh { ...@@ -62,7 +62,6 @@ struct ci13xxx_qh {
/** /**
* struct ci13xxx_req - usb request representation * struct ci13xxx_req - usb request representation
* @req: request structure for gadget drivers * @req: request structure for gadget drivers
* @map: is the request mapped
* @queue: link to QH list * @queue: link to QH list
* @ptr: transfer descriptor for this request * @ptr: transfer descriptor for this request
* @dma: dma address for the transfer descriptor * @dma: dma address for the transfer descriptor
...@@ -71,7 +70,6 @@ struct ci13xxx_qh { ...@@ -71,7 +70,6 @@ struct ci13xxx_qh {
*/ */
struct ci13xxx_req { struct ci13xxx_req {
struct usb_request req; struct usb_request req;
unsigned map;
struct list_head queue; struct list_head queue;
struct ci13xxx_td *ptr; struct ci13xxx_td *ptr;
dma_addr_t dma; dma_addr_t dma;
......
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