|
@@ -852,6 +852,7 @@ static void _rtl_usb_tx_preprocess(struct ieee80211_hw *hw, struct sk_buff *skb,
|
|
|
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
|
|
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
|
struct rtl_tx_desc *pdesc = NULL;
|
|
|
+ struct rtl_tcb_desc tcb_desc;
|
|
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
|
|
|
__le16 fc = hdr->frame_control;
|
|
|
u8 *pda_addr = hdr->addr1;
|
|
@@ -860,6 +861,17 @@ static void _rtl_usb_tx_preprocess(struct ieee80211_hw *hw, struct sk_buff *skb,
|
|
|
u8 tid = 0;
|
|
|
u16 seq_number = 0;
|
|
|
|
|
|
+ if (ieee80211_is_auth(fc)) {
|
|
|
+ RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, ("MAC80211_LINKING\n"));
|
|
|
+ rtl_ips_nic_on(hw);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rtlpriv->psc.sw_ps_enabled) {
|
|
|
+ if (ieee80211_is_data(fc) && !ieee80211_is_nullfunc(fc) &&
|
|
|
+ !ieee80211_has_pm(fc))
|
|
|
+ hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
|
|
|
+ }
|
|
|
+
|
|
|
rtl_action_proc(hw, skb, true);
|
|
|
if (is_multicast_ether_addr(pda_addr))
|
|
|
rtlpriv->stats.txbytesmulticast += skb->len;
|
|
@@ -876,7 +888,7 @@ static void _rtl_usb_tx_preprocess(struct ieee80211_hw *hw, struct sk_buff *skb,
|
|
|
seq_number <<= 4;
|
|
|
}
|
|
|
rtlpriv->cfg->ops->fill_tx_desc(hw, hdr, (u8 *)pdesc, info, skb,
|
|
|
- hw_queue);
|
|
|
+ hw_queue, &tcb_desc);
|
|
|
if (!ieee80211_has_morefrags(hdr->frame_control)) {
|
|
|
if (qc)
|
|
|
mac->tids[tid].seq_number = seq_number;
|