[rt2x00-users] [PATCH 04/12] rt2x00: Fix TX/RX padding for rt2800pci
Ivo van Doorn
ivdoorn at gmail.com
Sun Aug 16 11:46:30 UTC 2009
> diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
> index f018cda..d934f13 100644
> --- a/drivers/net/wireless/rt2x00/rt2800pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
> @@ -2297,6 +2297,7 @@ static void rt2800pci_fill_rxdone(struct queue_entry *entry,
> u32 rxwi1;
> u32 rxwi2;
> u32 rxwi3;
> + struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
>
> rt2x00_desc_read(rxd, 3, &rxd3);
> rt2x00_desc_read(rxwi, 0, &rxwi0);
> @@ -2336,8 +2337,10 @@ static void rt2800pci_fill_rxdone(struct queue_entry *entry,
> if (rt2x00_get_field32(rxd3, RXD_W3_MY_BSS))
> rxdesc->dev_flags |= RXDONE_MY_BSS;
>
> - if (rt2x00_get_field32(rxd3, RXD_W3_L2PAD))
> + if (rt2x00_get_field32(rxd3, RXD_W3_L2PAD)) {
> rxdesc->dev_flags |= RXDONE_L2PAD;
> + skbdesc->flags |= SKBDESC_L2_PADDED;
> + }
I have moved this into rt2x00lib.
> /*
> diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
> index de3f13a..61476ba 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00.h
> @@ -109,7 +109,7 @@
> * amount of bytes needed to move the data.
> */
> #define ALIGN_SIZE(__skb, __header) \
> - ( ((unsigned long)((__skb)->data + (__header))) & 3 )
> + ( ((__header) < 24) ? 0 : ((__header) & 3) )
As said earlier, check the pointer for 4 byte alignment, not the header size.
> /*
> * Standard timing and size defines.
> diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
> index 4fff3a8..d8192b1 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
> @@ -393,9 +393,6 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
> memset(&rxdesc, 0, sizeof(rxdesc));
> rt2x00dev->ops->lib->fill_rxdone(entry, &rxdesc);
>
> - /* Trim buffer to correct size */
> - skb_trim(entry->skb, rxdesc.size);
> -
> /*
> * The data behind the ieee80211 header must be
> * aligned on a 4 byte boundary.
> @@ -403,6 +400,10 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
> header_length = ieee80211_get_hdrlen_from_skb(entry->skb);
> l2pad = !!(rxdesc.dev_flags & RXDONE_L2PAD);
>
> + /* Trim buffer to correct size (it still contains the padding) */
> + skb_trim(entry->skb, rxdesc.size
> + + (l2pad ? ALIGN_SIZE(entry->skb, header_length) : 0));
> +
> /*
> * Hardware might have stripped the IV/EIV/ICV data,
> * in that case it is possible that the data was
So rxdesc.size is incorrect because of the L2 padding?
Isn't it better to fix rxdesc.size in the driver rather then make
workarounds for it in rt2x00lib?
Ivo
More information about the users
mailing list