aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/chipidea
diff options
context:
space:
mode:
authorFelipe F. Tonello <eu@felipetonello.com>2015-10-27 06:36:32 -0400
committerPeter Chen <peter.chen@freescale.com>2015-12-24 01:15:26 -0500
commit779debdf26d4b49598e61e0c28ac97146a2b96fe (patch)
treef7f8690838478842e3d19203c136ff498cd58883 /drivers/usb/chipidea
parente46fed9fb3a12b1070e2cc5ad03a21b84f94408d (diff)
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: Felipe F. Tonello <eu@felipetonello.com> Signed-off-by: Peter Chen <peter.chen@freescale.com>
Diffstat (limited to 'drivers/usb/chipidea')
-rw-r--r--drivers/usb/chipidea/udc.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index d917b3f27ddb..b1e7b716e8c9 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -434,19 +434,28 @@ static int _hardware_enqueue(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq)
434 if (hwreq->req.dma % PAGE_SIZE) 434 if (hwreq->req.dma % PAGE_SIZE)
435 pages--; 435 pages--;
436 436
437 if (rest == 0) 437 if (rest == 0) {
438 add_td_to_list(hwep, hwreq, 0); 438 ret = add_td_to_list(hwep, hwreq, 0);
439 if (ret < 0)
440 goto done;
441 }
439 442
440 while (rest > 0) { 443 while (rest > 0) {
441 unsigned count = min(hwreq->req.length - hwreq->req.actual, 444 unsigned count = min(hwreq->req.length - hwreq->req.actual,
442 (unsigned)(pages * CI_HDRC_PAGE_SIZE)); 445 (unsigned)(pages * CI_HDRC_PAGE_SIZE));
443 add_td_to_list(hwep, hwreq, count); 446 ret = add_td_to_list(hwep, hwreq, count);
447 if (ret < 0)
448 goto done;
449
444 rest -= count; 450 rest -= count;
445 } 451 }
446 452
447 if (hwreq->req.zero && hwreq->req.length && hwep->dir == TX 453 if (hwreq->req.zero && hwreq->req.length && hwep->dir == TX
448 && (hwreq->req.length % hwep->ep.maxpacket == 0)) 454 && (hwreq->req.length % hwep->ep.maxpacket == 0)) {
449 add_td_to_list(hwep, hwreq, 0); 455 ret = add_td_to_list(hwep, hwreq, 0);
456 if (ret < 0)
457 goto done;
458 }
450 459
451 firstnode = list_first_entry(&hwreq->tds, struct td_node, td); 460 firstnode = list_first_entry(&hwreq->tds, struct td_node, td);
452 461