ath5k: correct packet length in tx descriptors
authorBob Copeland <me@bobcopeland.com>
Fri, 19 Dec 2008 04:23:05 +0000 (23:23 -0500)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 19 Dec 2008 20:24:02 +0000 (15:24 -0500)
Packet length calculation (which includes frame check sequence)
should take into account whether we add a pad field or not.
Extract the calculation into a helper and use it in both places.

Changes to desc.c
Changes-licensed-under: ISC

Changes to ath5k.h, base.c
Changes-licensed-under: 3-Clause-BSD

Signed-off-by: Bob Copeland <me@bobcopeland.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath5k/ath5k.h
drivers/net/wireless/ath5k/base.c
drivers/net/wireless/ath5k/desc.c

index 13df1191b070095a763cbf3abf420483e1cfae0e..183ffc8e62cadc4b6b78c339d7a8ec0c4febf481 100644 (file)
@@ -1350,4 +1350,9 @@ static inline u32 ath5k_hw_bitswap(u32 val, unsigned int bits)
        return retval;
 }
 
+static inline int ath5k_pad_size(int hdrlen)
+{
+       return (hdrlen < 24) ? 0 : hdrlen & 3;
+}
+
 #endif
index 9b5f31aab574130198e8143d68cb8cdcce42c25a..4af2607deec09ad9582e2aa488723b461daf8416 100644 (file)
@@ -1762,8 +1762,8 @@ accept:
                 * not try to remove padding from short control frames that do
                 * not have payload. */
                hdrlen = ieee80211_get_hdrlen_from_skb(skb);
-               padsize = hdrlen & 3;
-               if (padsize && hdrlen >= 24) {
+               padsize = ath5k_pad_size(hdrlen);
+               if (padsize) {
                        memmove(skb->data + padsize, skb->data, hdrlen);
                        skb_pull(skb, padsize);
                }
@@ -2638,8 +2638,8 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
         * if this is not the case we add the padding after the header
         */
        hdrlen = ieee80211_get_hdrlen_from_skb(skb);
-       padsize = hdrlen & 3;
-       if (padsize && hdrlen >= 24) {
+       padsize = ath5k_pad_size(hdrlen);
+       if (padsize) {
 
                if (skb_headroom(skb) < padsize) {
                        ATH5K_ERR(sc, "tx hdrlen not %%4: %d not enough"
index 5e362a7a362007aec0c8bf6800de1d97a587166d..b40a9287a39a8a3be2fd8888c2f5dd8fde484511 100644 (file)
@@ -71,7 +71,7 @@ ath5k_hw_setup_2word_tx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
        /* Verify and set frame length */
 
        /* remove padding we might have added before */
-       frame_len = pkt_len - (hdr_len & 3) + FCS_LEN;
+       frame_len = pkt_len - ath5k_pad_size(hdr_len) + FCS_LEN;
 
        if (frame_len & ~AR5K_2W_TX_DESC_CTL0_FRAME_LEN)
                return -EINVAL;
@@ -202,7 +202,7 @@ static int ath5k_hw_setup_4word_tx_desc(struct ath5k_hw *ah,
        /* Verify and set frame length */
 
        /* remove padding we might have added before */
-       frame_len = pkt_len - (hdr_len & 3) + FCS_LEN;
+       frame_len = pkt_len - ath5k_pad_size(hdr_len) + FCS_LEN;
 
        if (frame_len & ~AR5K_4W_TX_DESC_CTL0_FRAME_LEN)
                return -EINVAL;