|
@@ -466,7 +466,6 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|
|
struct ieee80211_sta *sta, u8 sta_id)
|
|
|
{
|
|
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
|
|
- struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb);
|
|
|
struct iwl_device_cmd *dev_cmd;
|
|
|
struct iwl_tx_cmd *tx_cmd;
|
|
|
|
|
@@ -486,12 +485,18 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|
|
|
|
|
iwl_mvm_set_tx_cmd_rate(mvm, tx_cmd, info, sta, hdr->frame_control);
|
|
|
|
|
|
+ return dev_cmd;
|
|
|
+}
|
|
|
+
|
|
|
+static void iwl_mvm_skb_prepare_status(struct sk_buff *skb,
|
|
|
+ struct iwl_device_cmd *cmd)
|
|
|
+{
|
|
|
+ struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb);
|
|
|
+
|
|
|
memset(&skb_info->status, 0, sizeof(skb_info->status));
|
|
|
memset(skb_info->driver_data, 0, sizeof(skb_info->driver_data));
|
|
|
|
|
|
- skb_info->driver_data[1] = dev_cmd;
|
|
|
-
|
|
|
- return dev_cmd;
|
|
|
+ skb_info->driver_data[1] = cmd;
|
|
|
}
|
|
|
|
|
|
static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm,
|
|
@@ -607,6 +612,9 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
|
|
|
if (!dev_cmd)
|
|
|
return -1;
|
|
|
|
|
|
+ /* From now on, we cannot access info->control */
|
|
|
+ iwl_mvm_skb_prepare_status(skb, dev_cmd);
|
|
|
+
|
|
|
tx_cmd = (struct iwl_tx_cmd *)dev_cmd->payload;
|
|
|
|
|
|
/* Copy MAC header from skb into command buffer */
|
|
@@ -917,7 +925,6 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|
|
goto drop;
|
|
|
|
|
|
tx_cmd = (struct iwl_tx_cmd *)dev_cmd->payload;
|
|
|
- /* From now on, we cannot access info->control */
|
|
|
|
|
|
/*
|
|
|
* we handle that entirely ourselves -- for uAPSD the firmware
|
|
@@ -1024,6 +1031,9 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|
|
IWL_DEBUG_TX(mvm, "TX to [%d|%d] Q:%d - seq: 0x%x\n", mvmsta->sta_id,
|
|
|
tid, txq_id, IEEE80211_SEQ_TO_SN(seq_number));
|
|
|
|
|
|
+ /* From now on, we cannot access info->control */
|
|
|
+ iwl_mvm_skb_prepare_status(skb, dev_cmd);
|
|
|
+
|
|
|
if (iwl_trans_tx(mvm->trans, skb, dev_cmd, txq_id))
|
|
|
goto drop_unlock_sta;
|
|
|
|