|
@@ -1246,6 +1246,29 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static enum ath5k_pkt_type get_hw_packet_type(struct sk_buff *skb)
|
|
|
+{
|
|
|
+ struct ieee80211_hdr *hdr;
|
|
|
+ enum ath5k_pkt_type htype;
|
|
|
+ __le16 fc;
|
|
|
+
|
|
|
+ hdr = (struct ieee80211_hdr *)skb->data;
|
|
|
+ fc = hdr->frame_control;
|
|
|
+
|
|
|
+ if (ieee80211_is_beacon(fc))
|
|
|
+ htype = AR5K_PKT_TYPE_BEACON;
|
|
|
+ else if (ieee80211_is_probe_resp(fc))
|
|
|
+ htype = AR5K_PKT_TYPE_PROBE_RESP;
|
|
|
+ else if (ieee80211_is_atim(fc))
|
|
|
+ htype = AR5K_PKT_TYPE_ATIM;
|
|
|
+ else if (ieee80211_is_pspoll(fc))
|
|
|
+ htype = AR5K_PKT_TYPE_PSPOLL;
|
|
|
+ else
|
|
|
+ htype = AR5K_PKT_TYPE_NORMAL;
|
|
|
+
|
|
|
+ return htype;
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf,
|
|
|
struct ath5k_txq *txq)
|
|
@@ -1300,7 +1323,8 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf,
|
|
|
sc->vif, pktlen, info));
|
|
|
}
|
|
|
ret = ah->ah_setup_tx_desc(ah, ds, pktlen,
|
|
|
- ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL,
|
|
|
+ ieee80211_get_hdrlen_from_skb(skb),
|
|
|
+ get_hw_packet_type(skb),
|
|
|
(sc->power_level * 2),
|
|
|
hw_rate,
|
|
|
info->control.rates[0].count, keyidx, ah->ah_tx_ant, flags,
|