forked from Minki/linux
ath9k: correct expected max RX buffer size
We should only tell the hardware its capable of DMA'ing to us only what we asked dev_alloc_skb(). Prior to this it is possible a large RX'd frame could have corrupted DMA data but for us but we were saved only because we were previously also pci_map_single()'ing the same large value. The issue prior to this though was we were unmapping a smaller amount which the prior DMA patch fixed. Signed-off-by: Bennyam Malavazi <Bennyam.Malavazi@atheros.com> Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
ca0c7e5101
commit
b4b6cda229
@ -49,10 +49,12 @@ static void ath_rx_buf_link(struct ath_softc *sc, struct ath_buf *bf)
|
|||||||
ASSERT(skb != NULL);
|
ASSERT(skb != NULL);
|
||||||
ds->ds_vdata = skb->data;
|
ds->ds_vdata = skb->data;
|
||||||
|
|
||||||
/* setup rx descriptors */
|
/* setup rx descriptors. The sc_rxbufsize here tells the harware
|
||||||
|
* how much data it can DMA to us and that we are prepared
|
||||||
|
* to process */
|
||||||
ath9k_hw_setuprxdesc(ah,
|
ath9k_hw_setuprxdesc(ah,
|
||||||
ds,
|
ds,
|
||||||
skb_tailroom(skb), /* buffer size */
|
sc->sc_rxbufsize,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
if (sc->sc_rxlink == NULL)
|
if (sc->sc_rxlink == NULL)
|
||||||
@ -398,6 +400,13 @@ static struct sk_buff *ath_rxbuf_alloc(struct ath_softc *sc,
|
|||||||
* in rx'd frames.
|
* in rx'd frames.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Note: the kernel can allocate a value greater than
|
||||||
|
* what we ask it to give us. We really only need 4 KB as that
|
||||||
|
* is this hardware supports and in fact we need at least 3849
|
||||||
|
* as that is the MAX AMSDU size this hardware supports.
|
||||||
|
* Unfortunately this means we may get 8 KB here from the
|
||||||
|
* kernel... and that is actually what is observed on some
|
||||||
|
* systems :( */
|
||||||
skb = dev_alloc_skb(len + sc->sc_cachelsz - 1);
|
skb = dev_alloc_skb(len + sc->sc_cachelsz - 1);
|
||||||
if (skb != NULL) {
|
if (skb != NULL) {
|
||||||
off = ((unsigned long) skb->data) % sc->sc_cachelsz;
|
off = ((unsigned long) skb->data) % sc->sc_cachelsz;
|
||||||
|
Loading…
Reference in New Issue
Block a user