MLK-23181-5 usb: cdns3: gadget: need to handle sg case for cdns3_descmiss_copy_data
Add sg request case for cdns3_descmiss_copy_data. Reviewed-by: Jun Li <jun.li@nxp.com> Signed-off-by: Peter Chen <peter.chen@nxp.com>5.4-rM2-2.2.x-imx-squashed
parent
1b363ca8c4
commit
b597790d41
|
@ -373,6 +373,36 @@ static int cdns3_start_all_request(struct cdns3_device *priv_dev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void __cdns3_descmiss_copy_data(struct usb_request *request,
|
||||
struct usb_request *descmiss_req, struct scatterlist *s)
|
||||
{
|
||||
int length = request->actual + descmiss_req->actual;
|
||||
|
||||
if (!s) {
|
||||
if (length <= request->length) {
|
||||
memcpy(&((u8 *)request->buf)[request->actual],
|
||||
descmiss_req->buf,
|
||||
descmiss_req->actual);
|
||||
request->actual = length;
|
||||
} else {
|
||||
/* It should never occures */
|
||||
request->status = -ENOMEM;
|
||||
}
|
||||
} else {
|
||||
if (length <= sg_dma_len(s)) {
|
||||
void *p = phys_to_virt(sg_dma_address(s));
|
||||
|
||||
memcpy(&((u8 *)p)[request->actual],
|
||||
descmiss_req->buf,
|
||||
descmiss_req->actual);
|
||||
request->actual = length;
|
||||
} else {
|
||||
request->status = -ENOMEM;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* cdns3_descmiss_copy_data copy data from internal requests to request queued
|
||||
* by class driver.
|
||||
|
@ -384,10 +414,10 @@ static void cdns3_descmiss_copy_data(struct cdns3_endpoint *priv_ep,
|
|||
{
|
||||
struct usb_request *descmiss_req;
|
||||
struct cdns3_request *descmiss_priv_req;
|
||||
struct scatterlist *s = NULL;
|
||||
|
||||
while (!list_empty(&priv_ep->descmiss_req_list)) {
|
||||
int chunk_end;
|
||||
int length;
|
||||
|
||||
descmiss_priv_req =
|
||||
cdns3_next_priv_request(&priv_ep->descmiss_req_list);
|
||||
|
@ -398,17 +428,10 @@ static void cdns3_descmiss_copy_data(struct cdns3_endpoint *priv_ep,
|
|||
break;
|
||||
|
||||
chunk_end = descmiss_priv_req->flags & REQUEST_INTERNAL_CH;
|
||||
length = request->actual + descmiss_req->actual;
|
||||
if (request->num_sgs)
|
||||
s = request->sg;
|
||||
|
||||
if (length <= request->length) {
|
||||
memcpy(&((u8 *)request->buf)[request->actual],
|
||||
descmiss_req->buf,
|
||||
descmiss_req->actual);
|
||||
request->actual = length;
|
||||
} else {
|
||||
/* It should never occures */
|
||||
request->status = -ENOMEM;
|
||||
}
|
||||
__cdns3_descmiss_copy_data(request, descmiss_req, s);
|
||||
|
||||
list_del_init(&descmiss_priv_req->list);
|
||||
|
||||
|
|
Loading…
Reference in New Issue