aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2014-02-07 19:25:50 -0500
committerJohn W. Linville <linville@tuxdriver.com>2014-02-12 15:36:14 -0500
commitdbccc92b5d543d1ead727f1416af9e113a3ccc4a (patch)
treede19768520319278f26081b60dc0cdac24338608 /drivers/net
parent21f58d200388480547df909b5464b5aafebf299d (diff)
mwifiex: balance dma map/unmap sizes
Depending on the underlying DMA implementation its not possible to partially unmap DMA buffers. Moreover its not possible to understand the intent of passing 0 as the size to dma unmap. The intent of this driver is unmap the entire skb buffer. The only way to ensure that the size matches on unmap is to store both the dma address and the size in the skb ca field. Introduce a mwifiex_dma_mapping structure which tracks the dma address and the size. Additionally, provide a mwifiex_unmap_pci_memory() that utilizes the new structure. This also provide symmetry within the internal API. Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Paul Stewart <pstew@chromium.org> Reviewed-by: Avinash Patil <patila@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/mwifiex/pcie.c126
-rw-r--r--drivers/net/wireless/mwifiex/util.h20
2 files changed, 72 insertions, 74 deletions
diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c
index 03688aa14e8a..4e1c6b268f99 100644
--- a/drivers/net/wireless/mwifiex/pcie.c
+++ b/drivers/net/wireless/mwifiex/pcie.c
@@ -39,20 +39,31 @@ static struct semaphore add_remove_card_sem;
39 39
40static int 40static int
41mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb, 41mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
42 int size, int flags) 42 size_t size, int flags)
43{ 43{
44 struct pcie_service_card *card = adapter->card; 44 struct pcie_service_card *card = adapter->card;
45 dma_addr_t buf_pa; 45 struct mwifiex_dma_mapping mapping;
46 46
47 buf_pa = pci_map_single(card->dev, skb->data, size, flags); 47 mapping.addr = pci_map_single(card->dev, skb->data, size, flags);
48 if (pci_dma_mapping_error(card->dev, buf_pa)) { 48 if (pci_dma_mapping_error(card->dev, mapping.addr)) {
49 dev_err(adapter->dev, "failed to map pci memory!\n"); 49 dev_err(adapter->dev, "failed to map pci memory!\n");
50 return -1; 50 return -1;
51 } 51 }
52 memcpy(skb->cb, &buf_pa, sizeof(dma_addr_t)); 52 mapping.len = size;
53 memcpy(skb->cb, &mapping, sizeof(mapping));
53 return 0; 54 return 0;
54} 55}
55 56
57static void mwifiex_unmap_pci_memory(struct mwifiex_adapter *adapter,
58 struct sk_buff *skb, int flags)
59{
60 struct pcie_service_card *card = adapter->card;
61 struct mwifiex_dma_mapping mapping;
62
63 MWIFIEX_SKB_PACB(skb, &mapping);
64 pci_unmap_single(card->dev, mapping.addr, mapping.len, flags);
65}
66
56/* 67/*
57 * This function reads sleep cookie and checks if FW is ready 68 * This function reads sleep cookie and checks if FW is ready
58 */ 69 */
@@ -456,7 +467,7 @@ static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
456 PCI_DMA_FROMDEVICE)) 467 PCI_DMA_FROMDEVICE))
457 return -1; 468 return -1;
458 469
459 MWIFIEX_SKB_PACB(skb, &buf_pa); 470 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
460 471
461 dev_dbg(adapter->dev, 472 dev_dbg(adapter->dev,
462 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n", 473 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
@@ -513,7 +524,7 @@ static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
513 PCI_DMA_FROMDEVICE)) 524 PCI_DMA_FROMDEVICE))
514 return -1; 525 return -1;
515 526
516 MWIFIEX_SKB_PACB(skb, &buf_pa); 527 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
517 528
518 dev_dbg(adapter->dev, 529 dev_dbg(adapter->dev,
519 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n", 530 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
@@ -549,8 +560,8 @@ static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
549 desc2 = card->txbd_ring[i]; 560 desc2 = card->txbd_ring[i];
550 if (card->tx_buf_list[i]) { 561 if (card->tx_buf_list[i]) {
551 skb = card->tx_buf_list[i]; 562 skb = card->tx_buf_list[i];
552 pci_unmap_single(card->dev, desc2->paddr, 563 mwifiex_unmap_pci_memory(adapter, skb,
553 skb->len, PCI_DMA_TODEVICE); 564 PCI_DMA_TODEVICE);
554 dev_kfree_skb_any(skb); 565 dev_kfree_skb_any(skb);
555 } 566 }
556 memset(desc2, 0, sizeof(*desc2)); 567 memset(desc2, 0, sizeof(*desc2));
@@ -558,8 +569,8 @@ static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
558 desc = card->txbd_ring[i]; 569 desc = card->txbd_ring[i];
559 if (card->tx_buf_list[i]) { 570 if (card->tx_buf_list[i]) {
560 skb = card->tx_buf_list[i]; 571 skb = card->tx_buf_list[i];
561 pci_unmap_single(card->dev, desc->paddr, 572 mwifiex_unmap_pci_memory(adapter, skb,
562 skb->len, PCI_DMA_TODEVICE); 573 PCI_DMA_TODEVICE);
563 dev_kfree_skb_any(skb); 574 dev_kfree_skb_any(skb);
564 } 575 }
565 memset(desc, 0, sizeof(*desc)); 576 memset(desc, 0, sizeof(*desc));
@@ -587,8 +598,8 @@ static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
587 desc2 = card->rxbd_ring[i]; 598 desc2 = card->rxbd_ring[i];
588 if (card->rx_buf_list[i]) { 599 if (card->rx_buf_list[i]) {
589 skb = card->rx_buf_list[i]; 600 skb = card->rx_buf_list[i];
590 pci_unmap_single(card->dev, desc2->paddr, 601 mwifiex_unmap_pci_memory(adapter, skb,
591 skb->len, PCI_DMA_FROMDEVICE); 602 PCI_DMA_FROMDEVICE);
592 dev_kfree_skb_any(skb); 603 dev_kfree_skb_any(skb);
593 } 604 }
594 memset(desc2, 0, sizeof(*desc2)); 605 memset(desc2, 0, sizeof(*desc2));
@@ -596,8 +607,8 @@ static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
596 desc = card->rxbd_ring[i]; 607 desc = card->rxbd_ring[i];
597 if (card->rx_buf_list[i]) { 608 if (card->rx_buf_list[i]) {
598 skb = card->rx_buf_list[i]; 609 skb = card->rx_buf_list[i];
599 pci_unmap_single(card->dev, desc->paddr, 610 mwifiex_unmap_pci_memory(adapter, skb,
600 skb->len, PCI_DMA_FROMDEVICE); 611 PCI_DMA_FROMDEVICE);
601 dev_kfree_skb_any(skb); 612 dev_kfree_skb_any(skb);
602 } 613 }
603 memset(desc, 0, sizeof(*desc)); 614 memset(desc, 0, sizeof(*desc));
@@ -622,8 +633,8 @@ static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
622 desc = card->evtbd_ring[i]; 633 desc = card->evtbd_ring[i];
623 if (card->evt_buf_list[i]) { 634 if (card->evt_buf_list[i]) {
624 skb = card->evt_buf_list[i]; 635 skb = card->evt_buf_list[i];
625 pci_unmap_single(card->dev, desc->paddr, MAX_EVENT_SIZE, 636 mwifiex_unmap_pci_memory(adapter, skb,
626 PCI_DMA_FROMDEVICE); 637 PCI_DMA_FROMDEVICE);
627 dev_kfree_skb_any(skb); 638 dev_kfree_skb_any(skb);
628 } 639 }
629 card->evt_buf_list[i] = NULL; 640 card->evt_buf_list[i] = NULL;
@@ -861,7 +872,6 @@ static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
861static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter) 872static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
862{ 873{
863 struct pcie_service_card *card; 874 struct pcie_service_card *card;
864 dma_addr_t buf_pa;
865 875
866 if (!adapter) 876 if (!adapter)
867 return 0; 877 return 0;
@@ -869,16 +879,14 @@ static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
869 card = adapter->card; 879 card = adapter->card;
870 880
871 if (card && card->cmdrsp_buf) { 881 if (card && card->cmdrsp_buf) {
872 MWIFIEX_SKB_PACB(card->cmdrsp_buf, &buf_pa); 882 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
873 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE, 883 PCI_DMA_FROMDEVICE);
874 PCI_DMA_FROMDEVICE);
875 dev_kfree_skb_any(card->cmdrsp_buf); 884 dev_kfree_skb_any(card->cmdrsp_buf);
876 } 885 }
877 886
878 if (card && card->cmd_buf) { 887 if (card && card->cmd_buf) {
879 MWIFIEX_SKB_PACB(card->cmd_buf, &buf_pa); 888 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
880 pci_unmap_single(card->dev, buf_pa, card->cmd_buf->len, 889 PCI_DMA_TODEVICE);
881 PCI_DMA_TODEVICE);
882 } 890 }
883 return 0; 891 return 0;
884} 892}
@@ -956,7 +964,6 @@ static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
956static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter) 964static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
957{ 965{
958 struct sk_buff *skb; 966 struct sk_buff *skb;
959 dma_addr_t buf_pa;
960 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0; 967 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
961 struct mwifiex_pcie_buf_desc *desc; 968 struct mwifiex_pcie_buf_desc *desc;
962 struct mwifiex_pfu_buf_desc *desc2; 969 struct mwifiex_pfu_buf_desc *desc2;
@@ -986,13 +993,13 @@ static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
986 reg->tx_start_ptr; 993 reg->tx_start_ptr;
987 994
988 skb = card->tx_buf_list[wrdoneidx]; 995 skb = card->tx_buf_list[wrdoneidx];
996
989 if (skb) { 997 if (skb) {
990 dev_dbg(adapter->dev, 998 dev_dbg(adapter->dev,
991 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n", 999 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
992 skb, wrdoneidx); 1000 skb, wrdoneidx);
993 MWIFIEX_SKB_PACB(skb, &buf_pa); 1001 mwifiex_unmap_pci_memory(adapter, skb,
994 pci_unmap_single(card->dev, buf_pa, skb->len, 1002 PCI_DMA_TODEVICE);
995 PCI_DMA_TODEVICE);
996 1003
997 unmap_count++; 1004 unmap_count++;
998 1005
@@ -1082,12 +1089,12 @@ mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1082 tmp = (__le16 *)&payload[2]; 1089 tmp = (__le16 *)&payload[2];
1083 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA); 1090 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
1084 1091
1085 if (mwifiex_map_pci_memory(adapter, skb, skb->len , 1092 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1086 PCI_DMA_TODEVICE)) 1093 PCI_DMA_TODEVICE))
1087 return -1; 1094 return -1;
1088 1095
1089 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr; 1096 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1090 MWIFIEX_SKB_PACB(skb, &buf_pa); 1097 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1091 card->tx_buf_list[wrindx] = skb; 1098 card->tx_buf_list[wrindx] = skb;
1092 1099
1093 if (reg->pfu_enabled) { 1100 if (reg->pfu_enabled) {
@@ -1162,8 +1169,7 @@ mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1162 1169
1163 return -EINPROGRESS; 1170 return -EINPROGRESS;
1164done_unmap: 1171done_unmap:
1165 MWIFIEX_SKB_PACB(skb, &buf_pa); 1172 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1166 pci_unmap_single(card->dev, buf_pa, skb->len, PCI_DMA_TODEVICE);
1167 card->tx_buf_list[wrindx] = NULL; 1173 card->tx_buf_list[wrindx] = NULL;
1168 if (reg->pfu_enabled) 1174 if (reg->pfu_enabled)
1169 memset(desc2, 0, sizeof(*desc2)); 1175 memset(desc2, 0, sizeof(*desc2));
@@ -1211,9 +1217,7 @@ static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1211 rd_index = card->rxbd_rdptr & reg->rx_mask; 1217 rd_index = card->rxbd_rdptr & reg->rx_mask;
1212 skb_data = card->rx_buf_list[rd_index]; 1218 skb_data = card->rx_buf_list[rd_index];
1213 1219
1214 MWIFIEX_SKB_PACB(skb_data, &buf_pa); 1220 mwifiex_unmap_pci_memory(adapter, skb_data, PCI_DMA_FROMDEVICE);
1215 pci_unmap_single(card->dev, buf_pa, MWIFIEX_RX_DATA_BUF_SIZE,
1216 PCI_DMA_FROMDEVICE);
1217 card->rx_buf_list[rd_index] = NULL; 1221 card->rx_buf_list[rd_index] = NULL;
1218 1222
1219 /* Get data length from interface header - 1223 /* Get data length from interface header -
@@ -1240,7 +1244,7 @@ static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1240 PCI_DMA_FROMDEVICE)) 1244 PCI_DMA_FROMDEVICE))
1241 return -1; 1245 return -1;
1242 1246
1243 MWIFIEX_SKB_PACB(skb_tmp, &buf_pa); 1247 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1244 1248
1245 dev_dbg(adapter->dev, 1249 dev_dbg(adapter->dev,
1246 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n", 1250 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
@@ -1316,7 +1320,7 @@ mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1316 if (mwifiex_map_pci_memory(adapter, skb, skb->len , PCI_DMA_TODEVICE)) 1320 if (mwifiex_map_pci_memory(adapter, skb, skb->len , PCI_DMA_TODEVICE))
1317 return -1; 1321 return -1;
1318 1322
1319 MWIFIEX_SKB_PACB(skb, &buf_pa); 1323 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1320 1324
1321 /* Write the lower 32bits of the physical address to low command 1325 /* Write the lower 32bits of the physical address to low command
1322 * address scratch register 1326 * address scratch register
@@ -1325,8 +1329,7 @@ mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1325 dev_err(adapter->dev, 1329 dev_err(adapter->dev,
1326 "%s: failed to write download command to boot code.\n", 1330 "%s: failed to write download command to boot code.\n",
1327 __func__); 1331 __func__);
1328 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE, 1332 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1329 PCI_DMA_TODEVICE);
1330 return -1; 1333 return -1;
1331 } 1334 }
1332 1335
@@ -1338,8 +1341,7 @@ mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1338 dev_err(adapter->dev, 1341 dev_err(adapter->dev,
1339 "%s: failed to write download command to boot code.\n", 1342 "%s: failed to write download command to boot code.\n",
1340 __func__); 1343 __func__);
1341 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE, 1344 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1342 PCI_DMA_TODEVICE);
1343 return -1; 1345 return -1;
1344 } 1346 }
1345 1347
@@ -1348,8 +1350,7 @@ mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1348 dev_err(adapter->dev, 1350 dev_err(adapter->dev,
1349 "%s: failed to write command len to cmd_size scratch reg\n", 1351 "%s: failed to write command len to cmd_size scratch reg\n",
1350 __func__); 1352 __func__);
1351 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE, 1353 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1352 PCI_DMA_TODEVICE);
1353 return -1; 1354 return -1;
1354 } 1355 }
1355 1356
@@ -1358,8 +1359,7 @@ mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1358 CPU_INTR_DOOR_BELL)) { 1359 CPU_INTR_DOOR_BELL)) {
1359 dev_err(adapter->dev, 1360 dev_err(adapter->dev,
1360 "%s: failed to assert door-bell intr\n", __func__); 1361 "%s: failed to assert door-bell intr\n", __func__);
1361 pci_unmap_single(card->dev, buf_pa, 1362 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1362 MWIFIEX_UPLD_SIZE, PCI_DMA_TODEVICE);
1363 return -1; 1363 return -1;
1364 } 1364 }
1365 1365
@@ -1433,7 +1433,7 @@ mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1433 */ 1433 */
1434 1434
1435 if (card->cmdrsp_buf) { 1435 if (card->cmdrsp_buf) {
1436 MWIFIEX_SKB_PACB(card->cmdrsp_buf, &cmdrsp_buf_pa); 1436 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1437 /* Write the lower 32bits of the cmdrsp buffer physical 1437 /* Write the lower 32bits of the cmdrsp buffer physical
1438 address */ 1438 address */
1439 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 1439 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
@@ -1454,7 +1454,7 @@ mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1454 } 1454 }
1455 } 1455 }
1456 1456
1457 MWIFIEX_SKB_PACB(card->cmd_buf, &cmd_buf_pa); 1457 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1458 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */ 1458 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1459 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, 1459 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1460 (u32)cmd_buf_pa)) { 1460 (u32)cmd_buf_pa)) {
@@ -1508,13 +1508,10 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1508 int count = 0; 1508 int count = 0;
1509 u16 rx_len; 1509 u16 rx_len;
1510 __le16 pkt_len; 1510 __le16 pkt_len;
1511 dma_addr_t buf_pa;
1512 1511
1513 dev_dbg(adapter->dev, "info: Rx CMD Response\n"); 1512 dev_dbg(adapter->dev, "info: Rx CMD Response\n");
1514 1513
1515 MWIFIEX_SKB_PACB(skb, &buf_pa); 1514 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
1516 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1517 PCI_DMA_FROMDEVICE);
1518 1515
1519 pkt_len = *((__le16 *)skb->data); 1516 pkt_len = *((__le16 *)skb->data);
1520 rx_len = le16_to_cpu(pkt_len); 1517 rx_len = le16_to_cpu(pkt_len);
@@ -1538,8 +1535,6 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1538 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE, 1535 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1539 PCI_DMA_FROMDEVICE)) 1536 PCI_DMA_FROMDEVICE))
1540 return -1; 1537 return -1;
1541
1542 MWIFIEX_SKB_PACB(skb, &buf_pa);
1543 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) { 1538 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1544 adapter->curr_cmd->resp_skb = skb; 1539 adapter->curr_cmd->resp_skb = skb;
1545 adapter->cmd_resp_received = true; 1540 adapter->cmd_resp_received = true;
@@ -1574,7 +1569,6 @@ static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1574 struct sk_buff *skb) 1569 struct sk_buff *skb)
1575{ 1570{
1576 struct pcie_service_card *card = adapter->card; 1571 struct pcie_service_card *card = adapter->card;
1577 dma_addr_t buf_pa;
1578 struct sk_buff *skb_tmp; 1572 struct sk_buff *skb_tmp;
1579 1573
1580 if (skb) { 1574 if (skb) {
@@ -1587,9 +1581,7 @@ static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1587 1581
1588 skb_tmp = card->cmd_buf; 1582 skb_tmp = card->cmd_buf;
1589 if (skb_tmp) { 1583 if (skb_tmp) {
1590 MWIFIEX_SKB_PACB(skb_tmp, &buf_pa); 1584 mwifiex_unmap_pci_memory(adapter, skb_tmp, PCI_DMA_FROMDEVICE);
1591 pci_unmap_single(card->dev, buf_pa, skb_tmp->len,
1592 PCI_DMA_FROMDEVICE);
1593 card->cmd_buf = NULL; 1585 card->cmd_buf = NULL;
1594 } 1586 }
1595 1587
@@ -1605,7 +1597,6 @@ static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1605 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1597 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1606 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK; 1598 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1607 u32 wrptr, event; 1599 u32 wrptr, event;
1608 dma_addr_t buf_pa;
1609 struct mwifiex_evt_buf_desc *desc; 1600 struct mwifiex_evt_buf_desc *desc;
1610 1601
1611 if (!mwifiex_pcie_ok_to_access_hw(adapter)) 1602 if (!mwifiex_pcie_ok_to_access_hw(adapter))
@@ -1641,9 +1632,7 @@ static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1641 1632
1642 dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr); 1633 dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr);
1643 skb_cmd = card->evt_buf_list[rdptr]; 1634 skb_cmd = card->evt_buf_list[rdptr];
1644 MWIFIEX_SKB_PACB(skb_cmd, &buf_pa); 1635 mwifiex_unmap_pci_memory(adapter, skb_cmd, PCI_DMA_FROMDEVICE);
1645 pci_unmap_single(card->dev, buf_pa, MAX_EVENT_SIZE,
1646 PCI_DMA_FROMDEVICE);
1647 1636
1648 /* Take the pointer and set it to event pointer in adapter 1637 /* Take the pointer and set it to event pointer in adapter
1649 and will return back after event handling callback */ 1638 and will return back after event handling callback */
@@ -1689,7 +1678,6 @@ static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1689 int ret = 0; 1678 int ret = 0;
1690 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK; 1679 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1691 u32 wrptr; 1680 u32 wrptr;
1692 dma_addr_t buf_pa;
1693 struct mwifiex_evt_buf_desc *desc; 1681 struct mwifiex_evt_buf_desc *desc;
1694 1682
1695 if (!skb) 1683 if (!skb)
@@ -1714,11 +1702,9 @@ static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1714 MAX_EVENT_SIZE, 1702 MAX_EVENT_SIZE,
1715 PCI_DMA_FROMDEVICE)) 1703 PCI_DMA_FROMDEVICE))
1716 return -1; 1704 return -1;
1717 MWIFIEX_SKB_PACB(skb, &buf_pa);
1718 card->evt_buf_list[rdptr] = skb; 1705 card->evt_buf_list[rdptr] = skb;
1719 MWIFIEX_SKB_PACB(skb, &buf_pa);
1720 desc = card->evtbd_ring[rdptr]; 1706 desc = card->evtbd_ring[rdptr];
1721 desc->paddr = buf_pa; 1707 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
1722 desc->len = (u16)skb->len; 1708 desc->len = (u16)skb->len;
1723 desc->flags = 0; 1709 desc->flags = 0;
1724 skb = NULL; 1710 skb = NULL;
@@ -1768,7 +1754,6 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1768 struct sk_buff *skb; 1754 struct sk_buff *skb;
1769 u32 txlen, tx_blocks = 0, tries, len; 1755 u32 txlen, tx_blocks = 0, tries, len;
1770 u32 block_retry_cnt = 0; 1756 u32 block_retry_cnt = 0;
1771 dma_addr_t buf_pa;
1772 struct pcie_service_card *card = adapter->card; 1757 struct pcie_service_card *card = adapter->card;
1773 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; 1758 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1774 1759
@@ -1866,8 +1851,6 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1866 goto done; 1851 goto done;
1867 } 1852 }
1868 1853
1869 MWIFIEX_SKB_PACB(skb, &buf_pa);
1870
1871 /* Wait for the command done interrupt */ 1854 /* Wait for the command done interrupt */
1872 do { 1855 do {
1873 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS, 1856 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
@@ -1875,16 +1858,15 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1875 dev_err(adapter->dev, "%s: Failed to read " 1858 dev_err(adapter->dev, "%s: Failed to read "
1876 "interrupt status during fw dnld.\n", 1859 "interrupt status during fw dnld.\n",
1877 __func__); 1860 __func__);
1878 pci_unmap_single(card->dev, buf_pa, skb->len, 1861 mwifiex_unmap_pci_memory(adapter, skb,
1879 PCI_DMA_TODEVICE); 1862 PCI_DMA_TODEVICE);
1880 ret = -1; 1863 ret = -1;
1881 goto done; 1864 goto done;
1882 } 1865 }
1883 } while ((ireg_intr & CPU_INTR_DOOR_BELL) == 1866 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
1884 CPU_INTR_DOOR_BELL); 1867 CPU_INTR_DOOR_BELL);
1885 1868
1886 pci_unmap_single(card->dev, buf_pa, skb->len, 1869 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1887 PCI_DMA_TODEVICE);
1888 1870
1889 offset += txlen; 1871 offset += txlen;
1890 } while (true); 1872 } while (true);
diff --git a/drivers/net/wireless/mwifiex/util.h b/drivers/net/wireless/mwifiex/util.h
index cb2d0582bd36..ddae57021397 100644
--- a/drivers/net/wireless/mwifiex/util.h
+++ b/drivers/net/wireless/mwifiex/util.h
@@ -30,8 +30,24 @@ static inline struct mwifiex_txinfo *MWIFIEX_SKB_TXCB(struct sk_buff *skb)
30 return (struct mwifiex_txinfo *)(skb->cb + sizeof(dma_addr_t)); 30 return (struct mwifiex_txinfo *)(skb->cb + sizeof(dma_addr_t));
31} 31}
32 32
33static inline void MWIFIEX_SKB_PACB(struct sk_buff *skb, dma_addr_t *buf_pa) 33struct mwifiex_dma_mapping {
34 dma_addr_t addr;
35 size_t len;
36};
37
38static inline void MWIFIEX_SKB_PACB(struct sk_buff *skb,
39 struct mwifiex_dma_mapping *mapping)
34{ 40{
35 memcpy(buf_pa, skb->cb, sizeof(dma_addr_t)); 41 memcpy(mapping, skb->cb, sizeof(*mapping));
36} 42}
43
44static inline dma_addr_t MWIFIEX_SKB_DMA_ADDR(struct sk_buff *skb)
45{
46 struct mwifiex_dma_mapping mapping;
47
48 MWIFIEX_SKB_PACB(skb, &mapping);
49
50 return mapping.addr;
51}
52
37#endif /* !_MWIFIEX_UTIL_H_ */ 53#endif /* !_MWIFIEX_UTIL_H_ */