aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath9k/beacon.c16
-rw-r--r--drivers/net/wireless/ath9k/recv.c17
-rw-r--r--drivers/net/wireless/ath9k/xmit.c23
3 files changed, 53 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath9k/beacon.c b/drivers/net/wireless/ath9k/beacon.c
index fe6929dc2937..507299bf0136 100644
--- a/drivers/net/wireless/ath9k/beacon.c
+++ b/drivers/net/wireless/ath9k/beacon.c
@@ -190,6 +190,13 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id)
190 pci_map_single(sc->pdev, skb->data, 190 pci_map_single(sc->pdev, skb->data,
191 skb->len, 191 skb->len,
192 PCI_DMA_TODEVICE); 192 PCI_DMA_TODEVICE);
193 if (unlikely(pci_dma_mapping_error(sc->pdev, bf->bf_buf_addr))) {
194 dev_kfree_skb_any(skb);
195 bf->bf_mpdu = NULL;
196 DPRINTF(sc, ATH_DBG_CONFIG,
197 "pci_dma_mapping_error() on beaconing\n");
198 return NULL;
199 }
193 200
194 skb = ieee80211_get_buffered_bc(sc->hw, vif); 201 skb = ieee80211_get_buffered_bc(sc->hw, vif);
195 202
@@ -392,11 +399,18 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id)
392 memcpy(&hdr[1], &val, sizeof(val)); 399 memcpy(&hdr[1], &val, sizeof(val));
393 } 400 }
394 401
402 bf->bf_mpdu = skb;
395 bf->bf_buf_addr = bf->bf_dmacontext = 403 bf->bf_buf_addr = bf->bf_dmacontext =
396 pci_map_single(sc->pdev, skb->data, 404 pci_map_single(sc->pdev, skb->data,
397 skb->len, 405 skb->len,
398 PCI_DMA_TODEVICE); 406 PCI_DMA_TODEVICE);
399 bf->bf_mpdu = skb; 407 if (unlikely(pci_dma_mapping_error(sc->pdev, bf->bf_buf_addr))) {
408 dev_kfree_skb_any(skb);
409 bf->bf_mpdu = NULL;
410 DPRINTF(sc, ATH_DBG_CONFIG,
411 "pci_dma_mapping_error() on beacon alloc\n");
412 return -ENOMEM;
413 }
400 414
401 return 0; 415 return 0;
402} 416}
diff --git a/drivers/net/wireless/ath9k/recv.c b/drivers/net/wireless/ath9k/recv.c
index 51e058710d17..7a455468823b 100644
--- a/drivers/net/wireless/ath9k/recv.c
+++ b/drivers/net/wireless/ath9k/recv.c
@@ -304,6 +304,15 @@ int ath_rx_init(struct ath_softc *sc, int nbufs)
304 bf->bf_buf_addr = pci_map_single(sc->pdev, skb->data, 304 bf->bf_buf_addr = pci_map_single(sc->pdev, skb->data,
305 sc->sc_rxbufsize, 305 sc->sc_rxbufsize,
306 PCI_DMA_FROMDEVICE); 306 PCI_DMA_FROMDEVICE);
307 if (unlikely(pci_dma_mapping_error(sc->pdev,
308 bf->bf_buf_addr))) {
309 dev_kfree_skb_any(skb);
310 bf->bf_mpdu = NULL;
311 DPRINTF(sc, ATH_DBG_CONFIG,
312 "pci_dma_mapping_error() on RX init\n");
313 error = -ENOMEM;
314 break;
315 }
307 bf->bf_dmacontext = bf->bf_buf_addr; 316 bf->bf_dmacontext = bf->bf_buf_addr;
308 } 317 }
309 sc->sc_rxlink = NULL; 318 sc->sc_rxlink = NULL;
@@ -589,6 +598,14 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
589 bf->bf_buf_addr = pci_map_single(sc->pdev, requeue_skb->data, 598 bf->bf_buf_addr = pci_map_single(sc->pdev, requeue_skb->data,
590 sc->sc_rxbufsize, 599 sc->sc_rxbufsize,
591 PCI_DMA_FROMDEVICE); 600 PCI_DMA_FROMDEVICE);
601 if (unlikely(pci_dma_mapping_error(sc->pdev,
602 bf->bf_buf_addr))) {
603 dev_kfree_skb_any(requeue_skb);
604 bf->bf_mpdu = NULL;
605 DPRINTF(sc, ATH_DBG_CONFIG,
606 "pci_dma_mapping_error() on RX\n");
607 break;
608 }
592 bf->bf_dmacontext = bf->bf_buf_addr; 609 bf->bf_dmacontext = bf->bf_buf_addr;
593 610
594 /* 611 /*
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c
index 5cf83111e1a7..17fd05e2f247 100644
--- a/drivers/net/wireless/ath9k/xmit.c
+++ b/drivers/net/wireless/ath9k/xmit.c
@@ -1642,7 +1642,7 @@ static void ath_txq_drain_pending_buffers(struct ath_softc *sc,
1642 } 1642 }
1643} 1643}
1644 1644
1645static void ath_tx_setup_buffer(struct ath_softc *sc, struct ath_buf *bf, 1645static int ath_tx_setup_buffer(struct ath_softc *sc, struct ath_buf *bf,
1646 struct sk_buff *skb, 1646 struct sk_buff *skb,
1647 struct ath_tx_control *txctl) 1647 struct ath_tx_control *txctl)
1648{ 1648{
@@ -1701,9 +1701,18 @@ static void ath_tx_setup_buffer(struct ath_softc *sc, struct ath_buf *bf,
1701 /* DMA setup */ 1701 /* DMA setup */
1702 1702
1703 bf->bf_mpdu = skb; 1703 bf->bf_mpdu = skb;
1704
1704 bf->bf_dmacontext = pci_map_single(sc->pdev, skb->data, 1705 bf->bf_dmacontext = pci_map_single(sc->pdev, skb->data,
1705 skb->len, PCI_DMA_TODEVICE); 1706 skb->len, PCI_DMA_TODEVICE);
1707 if (unlikely(pci_dma_mapping_error(sc->pdev, bf->bf_dmacontext))) {
1708 bf->bf_mpdu = NULL;
1709 DPRINTF(sc, ATH_DBG_CONFIG,
1710 "pci_dma_mapping_error() on TX\n");
1711 return -ENOMEM;
1712 }
1713
1706 bf->bf_buf_addr = bf->bf_dmacontext; 1714 bf->bf_buf_addr = bf->bf_dmacontext;
1715 return 0;
1707} 1716}
1708 1717
1709/* FIXME: tx power */ 1718/* FIXME: tx power */
@@ -1775,10 +1784,12 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf,
1775 spin_unlock_bh(&txctl->txq->axq_lock); 1784 spin_unlock_bh(&txctl->txq->axq_lock);
1776} 1785}
1777 1786
1787/* Upon failure caller should free skb */
1778int ath_tx_start(struct ath_softc *sc, struct sk_buff *skb, 1788int ath_tx_start(struct ath_softc *sc, struct sk_buff *skb,
1779 struct ath_tx_control *txctl) 1789 struct ath_tx_control *txctl)
1780{ 1790{
1781 struct ath_buf *bf; 1791 struct ath_buf *bf;
1792 int r;
1782 1793
1783 /* Check if a tx buffer is available */ 1794 /* Check if a tx buffer is available */
1784 1795
@@ -1788,7 +1799,15 @@ int ath_tx_start(struct ath_softc *sc, struct sk_buff *skb,
1788 return -1; 1799 return -1;
1789 } 1800 }
1790 1801
1791 ath_tx_setup_buffer(sc, bf, skb, txctl); 1802 r = ath_tx_setup_buffer(sc, bf, skb, txctl);
1803 if (unlikely(r)) {
1804 spin_lock_bh(&sc->sc_txbuflock);
1805 DPRINTF(sc, ATH_DBG_FATAL, "TX mem alloc failure\n");
1806 list_add_tail(&bf->list, &sc->sc_txbuf);
1807 spin_unlock_bh(&sc->sc_txbuflock);
1808 return r;
1809 }
1810
1792 ath_tx_start_dma(sc, bf, txctl); 1811 ath_tx_start_dma(sc, bf, txctl);
1793 1812
1794 return 0; 1813 return 0;