Commit 779debdf authored by Felipe F. Tonello's avatar Felipe F. Tonello Committed by Peter Chen

usb: chipidea: udc: improve error handling on _hardware_enqueue

_hardware_enqueue() didn't check for errors when using
add_td_to_list() which can fail if dma_pool_alloc fails, thus
causing a kernel panic when lastnode->ptr is NULL.
Signed-off-by: default avatarFelipe F. Tonello <eu@felipetonello.com>
Signed-off-by: default avatarPeter Chen <peter.chen@freescale.com>
parent e46fed9f
...@@ -434,19 +434,28 @@ static int _hardware_enqueue(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq) ...@@ -434,19 +434,28 @@ static int _hardware_enqueue(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq)
if (hwreq->req.dma % PAGE_SIZE) if (hwreq->req.dma % PAGE_SIZE)
pages--; pages--;
if (rest == 0) if (rest == 0) {
add_td_to_list(hwep, hwreq, 0); ret = add_td_to_list(hwep, hwreq, 0);
if (ret < 0)
goto done;
}
while (rest > 0) { while (rest > 0) {
unsigned count = min(hwreq->req.length - hwreq->req.actual, unsigned count = min(hwreq->req.length - hwreq->req.actual,
(unsigned)(pages * CI_HDRC_PAGE_SIZE)); (unsigned)(pages * CI_HDRC_PAGE_SIZE));
add_td_to_list(hwep, hwreq, count); ret = add_td_to_list(hwep, hwreq, count);
if (ret < 0)
goto done;
rest -= count; rest -= count;
} }
if (hwreq->req.zero && hwreq->req.length && hwep->dir == TX if (hwreq->req.zero && hwreq->req.length && hwep->dir == TX
&& (hwreq->req.length % hwep->ep.maxpacket == 0)) && (hwreq->req.length % hwep->ep.maxpacket == 0)) {
add_td_to_list(hwep, hwreq, 0); ret = add_td_to_list(hwep, hwreq, 0);
if (ret < 0)
goto done;
}
firstnode = list_first_entry(&hwreq->tds, struct td_node, td); firstnode = list_first_entry(&hwreq->tds, struct td_node, td);
......
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