aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmitkumar Karwar <akarwar@marvell.com>2011-12-08 23:41:03 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-12-13 15:33:20 -0500
commit8c53e42dea5905aee2a97e6af5874432f27b5c03 (patch)
tree443f3dbec3cda5786e122ad495b0facda0badb0b
parentb0327ffa8cfe69ce2d380200c2097b86c6b3efd9 (diff)
mwifiex: failure case handling for PCIe events
Event buffers for PCIe interface are allocated during driver initialisation, and respective physical addresses are sent to FW in *_PCIE_DESC_DETAILS command so that FW can do DMA. These buffers will be freed while unloading the driver. Therefore we should not free them in event handling error path. Also we should skip next pending events in failure case. Also fixed 'returning -1 instead of -ENOMEM is sloppy' warnings. Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/mwifiex/pcie.c20
1 files changed, 6 insertions, 14 deletions
diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c
index a2f32008f9a8..405350940a45 100644
--- a/drivers/net/wireless/mwifiex/pcie.c
+++ b/drivers/net/wireless/mwifiex/pcie.c
@@ -386,7 +386,7 @@ static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
386 card->txbd_ring_vbase = kzalloc(card->txbd_ring_size, GFP_KERNEL); 386 card->txbd_ring_vbase = kzalloc(card->txbd_ring_size, GFP_KERNEL);
387 if (!card->txbd_ring_vbase) { 387 if (!card->txbd_ring_vbase) {
388 dev_err(adapter->dev, "Unable to allocate buffer for txbd ring.\n"); 388 dev_err(adapter->dev, "Unable to allocate buffer for txbd ring.\n");
389 return -1; 389 return -ENOMEM;
390 } 390 }
391 card->txbd_ring_pbase = virt_to_phys(card->txbd_ring_vbase); 391 card->txbd_ring_pbase = virt_to_phys(card->txbd_ring_vbase);
392 392
@@ -476,7 +476,7 @@ static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
476 if (!card->rxbd_ring_vbase) { 476 if (!card->rxbd_ring_vbase) {
477 dev_err(adapter->dev, "Unable to allocate buffer for " 477 dev_err(adapter->dev, "Unable to allocate buffer for "
478 "rxbd_ring.\n"); 478 "rxbd_ring.\n");
479 return -1; 479 return -ENOMEM;
480 } 480 }
481 card->rxbd_ring_pbase = virt_to_phys(card->rxbd_ring_vbase); 481 card->rxbd_ring_pbase = virt_to_phys(card->rxbd_ring_vbase);
482 482
@@ -569,7 +569,7 @@ static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
569 if (!card->evtbd_ring_vbase) { 569 if (!card->evtbd_ring_vbase) {
570 dev_err(adapter->dev, "Unable to allocate buffer. " 570 dev_err(adapter->dev, "Unable to allocate buffer. "
571 "Terminating download\n"); 571 "Terminating download\n");
572 return -1; 572 return -ENOMEM;
573 } 573 }
574 card->evtbd_ring_pbase = virt_to_phys(card->evtbd_ring_vbase); 574 card->evtbd_ring_pbase = virt_to_phys(card->evtbd_ring_vbase);
575 575
@@ -1231,15 +1231,13 @@ static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1231 if (rdptr >= MWIFIEX_MAX_EVT_BD) { 1231 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1232 dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n", 1232 dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n",
1233 rdptr); 1233 rdptr);
1234 ret = -EINVAL; 1234 return -EINVAL;
1235 goto done;
1236 } 1235 }
1237 1236
1238 /* Read the event ring write pointer set by firmware */ 1237 /* Read the event ring write pointer set by firmware */
1239 if (mwifiex_read_reg(adapter, REG_EVTBD_WRPTR, &wrptr)) { 1238 if (mwifiex_read_reg(adapter, REG_EVTBD_WRPTR, &wrptr)) {
1240 dev_err(adapter->dev, "event_complete: failed to read REG_EVTBD_WRPTR\n"); 1239 dev_err(adapter->dev, "event_complete: failed to read REG_EVTBD_WRPTR\n");
1241 ret = -1; 1240 return -1;
1242 goto done;
1243 } 1241 }
1244 1242
1245 if (!card->evt_buf_list[rdptr]) { 1243 if (!card->evt_buf_list[rdptr]) {
@@ -1268,15 +1266,9 @@ static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1268 /* Write the event ring read pointer in to REG_EVTBD_RDPTR */ 1266 /* Write the event ring read pointer in to REG_EVTBD_RDPTR */
1269 if (mwifiex_write_reg(adapter, REG_EVTBD_RDPTR, card->evtbd_rdptr)) { 1267 if (mwifiex_write_reg(adapter, REG_EVTBD_RDPTR, card->evtbd_rdptr)) {
1270 dev_err(adapter->dev, "event_complete: failed to read REG_EVTBD_RDPTR\n"); 1268 dev_err(adapter->dev, "event_complete: failed to read REG_EVTBD_RDPTR\n");
1271 ret = -1; 1269 return -1;
1272 goto done;
1273 } 1270 }
1274 1271
1275done:
1276 /* Free the buffer for failure case */
1277 if (ret && skb)
1278 dev_kfree_skb_any(skb);
1279
1280 dev_dbg(adapter->dev, "info: Check Events Again\n"); 1272 dev_dbg(adapter->dev, "info: Check Events Again\n");
1281 ret = mwifiex_pcie_process_event_ready(adapter); 1273 ret = mwifiex_pcie_process_event_ready(adapter);
1282 1274