diff options
-rw-r--r-- | drivers/net/wireless/ath9k/beacon.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/recv.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/xmit.c | 23 |
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 | ||
1645 | static void ath_tx_setup_buffer(struct ath_softc *sc, struct ath_buf *bf, | 1645 | static 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 */ | ||
1778 | int ath_tx_start(struct ath_softc *sc, struct sk_buff *skb, | 1788 | int 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; |