Commit 36323f81 authored by Thomas Huehn's avatar Thomas Huehn Committed by Johannes Berg
Browse files

mac80211: move TX station pointer and restructure TX



Remove the control.sta pointer from ieee80211_tx_info to free up
sufficient space in the TX skb control buffer for the upcoming
Transmit Power Control (TPC).
Instead, the pointer is now on the stack in a new control struct
that is passed as a function parameter to the drivers' tx method.
Signed-off-by: default avatarThomas Huehn <thomas@net.t-labs.tu-berlin.de>
Signed-off-by: default avatarAlina Friedrichsen <x-alina@gmx.net>
Signed-off-by: default avatarFelix Fietkau <nbd@openwrt.org>
[reworded commit message]
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent ab095877
...@@ -1661,7 +1661,9 @@ static void adm8211_tx_raw(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -1661,7 +1661,9 @@ static void adm8211_tx_raw(struct ieee80211_hw *dev, struct sk_buff *skb,
} }
/* Put adm8211_tx_hdr on skb and transmit */ /* Put adm8211_tx_hdr on skb and transmit */
static void adm8211_tx(struct ieee80211_hw *dev, struct sk_buff *skb) static void adm8211_tx(struct ieee80211_hw *dev,
struct ieee80211_tx_control *control,
struct sk_buff *skb)
{ {
struct adm8211_tx_hdr *txhdr; struct adm8211_tx_hdr *txhdr;
size_t payload_len, hdrlen; size_t payload_len, hdrlen;
......
...@@ -1726,7 +1726,9 @@ static void at76_mac80211_tx_callback(struct urb *urb) ...@@ -1726,7 +1726,9 @@ static void at76_mac80211_tx_callback(struct urb *urb)
ieee80211_wake_queues(priv->hw); ieee80211_wake_queues(priv->hw);
} }
static void at76_mac80211_tx(struct ieee80211_hw *hw, struct sk_buff *skb) static void at76_mac80211_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb)
{ {
struct at76_priv *priv = hw->priv; struct at76_priv *priv = hw->priv;
struct at76_tx_buffer *tx_buffer = priv->bulk_out_buffer; struct at76_tx_buffer *tx_buffer = priv->bulk_out_buffer;
......
...@@ -55,7 +55,8 @@ ...@@ -55,7 +55,8 @@
\********************/ \********************/
static void static void
ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb) ath5k_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
struct sk_buff *skb)
{ {
struct ath5k_hw *ah = hw->priv; struct ath5k_hw *ah = hw->priv;
u16 qnum = skb_get_queue_mapping(skb); u16 qnum = skb_get_queue_mapping(skb);
......
...@@ -280,6 +280,7 @@ struct ath_tx_control { ...@@ -280,6 +280,7 @@ struct ath_tx_control {
struct ath_txq *txq; struct ath_txq *txq;
struct ath_node *an; struct ath_node *an;
u8 paprd; u8 paprd;
struct ieee80211_sta *sta;
}; };
#define ATH_TX_ERROR 0x01 #define ATH_TX_ERROR 0x01
......
...@@ -542,6 +542,7 @@ void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv); ...@@ -542,6 +542,7 @@ void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv);
int ath9k_tx_init(struct ath9k_htc_priv *priv); int ath9k_tx_init(struct ath9k_htc_priv *priv);
int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, int ath9k_htc_tx_start(struct ath9k_htc_priv *priv,
struct ieee80211_sta *sta,
struct sk_buff *skb, u8 slot, bool is_cab); struct sk_buff *skb, u8 slot, bool is_cab);
void ath9k_tx_cleanup(struct ath9k_htc_priv *priv); void ath9k_tx_cleanup(struct ath9k_htc_priv *priv);
bool ath9k_htc_txq_setup(struct ath9k_htc_priv *priv, int subtype); bool ath9k_htc_txq_setup(struct ath9k_htc_priv *priv, int subtype);
......
...@@ -326,7 +326,7 @@ static void ath9k_htc_send_buffered(struct ath9k_htc_priv *priv, ...@@ -326,7 +326,7 @@ static void ath9k_htc_send_buffered(struct ath9k_htc_priv *priv,
goto next; goto next;
} }
ret = ath9k_htc_tx_start(priv, skb, tx_slot, true); ret = ath9k_htc_tx_start(priv, NULL, skb, tx_slot, true);
if (ret != 0) { if (ret != 0) {
ath9k_htc_tx_clear_slot(priv, tx_slot); ath9k_htc_tx_clear_slot(priv, tx_slot);
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
......
...@@ -856,7 +856,9 @@ set_timer: ...@@ -856,7 +856,9 @@ set_timer:
/* mac80211 Callbacks */ /* mac80211 Callbacks */
/**********************/ /**********************/
static void ath9k_htc_tx(struct ieee80211_hw *hw, struct sk_buff *skb) static void ath9k_htc_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb)
{ {
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
struct ath9k_htc_priv *priv = hw->priv; struct ath9k_htc_priv *priv = hw->priv;
...@@ -883,7 +885,7 @@ static void ath9k_htc_tx(struct ieee80211_hw *hw, struct sk_buff *skb) ...@@ -883,7 +885,7 @@ static void ath9k_htc_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
goto fail_tx; goto fail_tx;
} }
ret = ath9k_htc_tx_start(priv, skb, slot, false); ret = ath9k_htc_tx_start(priv, control->sta, skb, slot, false);
if (ret != 0) { if (ret != 0) {
ath_dbg(common, XMIT, "Tx failed\n"); ath_dbg(common, XMIT, "Tx failed\n");
goto clear_slot; goto clear_slot;
......
...@@ -333,12 +333,12 @@ static void ath9k_htc_tx_data(struct ath9k_htc_priv *priv, ...@@ -333,12 +333,12 @@ static void ath9k_htc_tx_data(struct ath9k_htc_priv *priv,
} }
int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, int ath9k_htc_tx_start(struct ath9k_htc_priv *priv,
struct ieee80211_sta *sta,
struct sk_buff *skb, struct sk_buff *skb,
u8 slot, bool is_cab) u8 slot, bool is_cab)
{ {
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
struct ieee80211_sta *sta = tx_info->control.sta;
struct ieee80211_vif *vif = tx_info->control.vif; struct ieee80211_vif *vif = tx_info->control.vif;
struct ath9k_htc_sta *ista; struct ath9k_htc_sta *ista;
struct ath9k_htc_vif *avp = NULL; struct ath9k_htc_vif *avp = NULL;
......
...@@ -694,7 +694,9 @@ mutex_unlock: ...@@ -694,7 +694,9 @@ mutex_unlock:
return r; return r;
} }
static void ath9k_tx(struct ieee80211_hw *hw, struct sk_buff *skb) static void ath9k_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb)
{ {
struct ath_softc *sc = hw->priv; struct ath_softc *sc = hw->priv;
struct ath_common *common = ath9k_hw_common(sc->sc_ah); struct ath_common *common = ath9k_hw_common(sc->sc_ah);
...@@ -754,6 +756,7 @@ static void ath9k_tx(struct ieee80211_hw *hw, struct sk_buff *skb) ...@@ -754,6 +756,7 @@ static void ath9k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
memset(&txctl, 0, sizeof(struct ath_tx_control)); memset(&txctl, 0, sizeof(struct ath_tx_control));
txctl.txq = sc->tx.txq_map[skb_get_queue_mapping(skb)]; txctl.txq = sc->tx.txq_map[skb_get_queue_mapping(skb)];
txctl.sta = control->sta;
ath_dbg(common, XMIT, "transmitting packet, skb: %p\n", skb); ath_dbg(common, XMIT, "transmitting packet, skb: %p\n", skb);
......
...@@ -1773,11 +1773,12 @@ static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq, ...@@ -1773,11 +1773,12 @@ static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,
TX_STAT_INC(txq->axq_qnum, queued); TX_STAT_INC(txq->axq_qnum, queued);
} }
static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb, static void setup_frame_info(struct ieee80211_hw *hw,
struct ieee80211_sta *sta,
struct sk_buff *skb,
int framelen) int framelen)
{ {
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
struct ieee80211_sta *sta = tx_info->control.sta;
struct ieee80211_key_conf *hw_key = tx_info->control.hw_key; struct ieee80211_key_conf *hw_key = tx_info->control.hw_key;
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
const struct ieee80211_rate *rate; const struct ieee80211_rate *rate;
...@@ -1935,7 +1936,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -1935,7 +1936,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
{ {
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_sta *sta = info->control.sta; struct ieee80211_sta *sta = txctl->sta;
struct ieee80211_vif *vif = info->control.vif; struct ieee80211_vif *vif = info->control.vif;
struct ath_softc *sc = hw->priv; struct ath_softc *sc = hw->priv;
struct ath_txq *txq = txctl->txq; struct ath_txq *txq = txctl->txq;
...@@ -1979,7 +1980,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -1979,7 +1980,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
!ieee80211_is_data(hdr->frame_control)) !ieee80211_is_data(hdr->frame_control))
info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT;
setup_frame_info(hw, skb, frmlen); setup_frame_info(hw, sta, skb, frmlen);
/* /*
* At this point, the vif, hw_key and sta pointers in the tx control * At this point, the vif, hw_key and sta pointers in the tx control
......
...@@ -577,7 +577,9 @@ void carl9170_rx(struct ar9170 *ar, void *buf, unsigned int len); ...@@ -577,7 +577,9 @@ void carl9170_rx(struct ar9170 *ar, void *buf, unsigned int len);
void carl9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len); void carl9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len);
/* TX */ /* TX */
void carl9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb); void carl9170_op_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb);
void carl9170_tx_janitor(struct work_struct *work); void carl9170_tx_janitor(struct work_struct *work);
void carl9170_tx_process_status(struct ar9170 *ar, void carl9170_tx_process_status(struct ar9170 *ar,
const struct carl9170_rsp *cmd); const struct carl9170_rsp *cmd);
......
...@@ -867,14 +867,15 @@ static bool carl9170_tx_cts_check(struct ar9170 *ar, ...@@ -867,14 +867,15 @@ static bool carl9170_tx_cts_check(struct ar9170 *ar,
return false; return false;
} }
static int carl9170_tx_prepare(struct ar9170 *ar, struct sk_buff *skb) static int carl9170_tx_prepare(struct ar9170 *ar,
struct ieee80211_sta *sta,
struct sk_buff *skb)
{ {
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
struct _carl9170_tx_superframe *txc; struct _carl9170_tx_superframe *txc;
struct carl9170_vif_info *cvif; struct carl9170_vif_info *cvif;
struct ieee80211_tx_info *info; struct ieee80211_tx_info *info;
struct ieee80211_tx_rate *txrate; struct ieee80211_tx_rate *txrate;
struct ieee80211_sta *sta;
struct carl9170_tx_info *arinfo; struct carl9170_tx_info *arinfo;
unsigned int hw_queue; unsigned int hw_queue;
int i; int i;
...@@ -910,8 +911,6 @@ static int carl9170_tx_prepare(struct ar9170 *ar, struct sk_buff *skb) ...@@ -910,8 +911,6 @@ static int carl9170_tx_prepare(struct ar9170 *ar, struct sk_buff *skb)
else else
cvif = NULL; cvif = NULL;
sta = info->control.sta;
txc = (void *)skb_push(skb, sizeof(*txc)); txc = (void *)skb_push(skb, sizeof(*txc));
memset(txc, 0, sizeof(*txc)); memset(txc, 0, sizeof(*txc));
...@@ -1457,20 +1456,21 @@ err_unlock_rcu: ...@@ -1457,20 +1456,21 @@ err_unlock_rcu:
return false; return false;
} }
void carl9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb) void carl9170_op_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb)
{ {
struct ar9170 *ar = hw->priv; struct ar9170 *ar = hw->priv;
struct ieee80211_tx_info *info; struct ieee80211_tx_info *info;
struct ieee80211_sta *sta; struct ieee80211_sta *sta = control->sta;
bool run; bool run;
if (unlikely(!IS_STARTED(ar))) if (unlikely(!IS_STARTED(ar)))
goto err_free; goto err_free;
info = IEEE80211_SKB_CB(skb); info = IEEE80211_SKB_CB(skb);
sta = info->control.sta;
if (unlikely(carl9170_tx_prepare(ar, skb))) if (unlikely(carl9170_tx_prepare(ar, sta, skb)))
goto err_free; goto err_free;
carl9170_tx_accounting(ar, skb); carl9170_tx_accounting(ar, skb);
......
...@@ -3407,7 +3407,8 @@ static void b43_tx_work(struct work_struct *work) ...@@ -3407,7 +3407,8 @@ static void b43_tx_work(struct work_struct *work)
} }
static void b43_op_tx(struct ieee80211_hw *hw, static void b43_op_tx(struct ieee80211_hw *hw,
struct sk_buff *skb) struct ieee80211_tx_control *control,
struct sk_buff *skb)
{ {
struct b43_wl *wl = hw_to_b43_wl(hw); struct b43_wl *wl = hw_to_b43_wl(hw);
......
...@@ -2492,6 +2492,7 @@ static void b43legacy_tx_work(struct work_struct *work) ...@@ -2492,6 +2492,7 @@ static void b43legacy_tx_work(struct work_struct *work)
} }
static void b43legacy_op_tx(struct ieee80211_hw *hw, static void b43legacy_op_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw); struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw);
......
...@@ -264,7 +264,9 @@ static void brcms_set_basic_rate(struct brcm_rateset *rs, u16 rate, bool is_br) ...@@ -264,7 +264,9 @@ static void brcms_set_basic_rate(struct brcm_rateset *rs, u16 rate, bool is_br)
} }
} }
static void brcms_ops_tx(struct ieee80211_hw *hw, struct sk_buff *skb) static void brcms_ops_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb)
{ {
struct brcms_info *wl = hw->priv; struct brcms_info *wl = hw->priv;
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
...@@ -276,7 +278,7 @@ static void brcms_ops_tx(struct ieee80211_hw *hw, struct sk_buff *skb) ...@@ -276,7 +278,7 @@ static void brcms_ops_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
goto done; goto done;
} }
brcms_c_sendpkt_mac80211(wl->wlc, skb, hw); brcms_c_sendpkt_mac80211(wl->wlc, skb, hw);
tx_info->rate_driver_data[0] = tx_info->control.sta; tx_info->rate_driver_data[0] = control->sta;
done: done:
spin_unlock_bh(&wl->lock); spin_unlock_bh(&wl->lock);
} }
......
...@@ -460,7 +460,9 @@ il3945_build_tx_cmd_basic(struct il_priv *il, struct il_device_cmd *cmd, ...@@ -460,7 +460,9 @@ il3945_build_tx_cmd_basic(struct il_priv *il, struct il_device_cmd *cmd,
* start C_TX command process * start C_TX command process
*/ */
static int static int
il3945_tx_skb(struct il_priv *il, struct sk_buff *skb) il3945_tx_skb(struct il_priv *il,
struct ieee80211_sta *sta,
struct sk_buff *skb)
{ {
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
...@@ -512,7 +514,7 @@ il3945_tx_skb(struct il_priv *il, struct sk_buff *skb) ...@@ -512,7 +514,7 @@ il3945_tx_skb(struct il_priv *il, struct sk_buff *skb)
hdr_len = ieee80211_hdrlen(fc); hdr_len = ieee80211_hdrlen(fc);
/* Find idx into station table for destination station */ /* Find idx into station table for destination station */
sta_id = il_sta_id_or_broadcast(il, info->control.sta); sta_id = il_sta_id_or_broadcast(il, sta);
if (sta_id == IL_INVALID_STATION) { if (sta_id == IL_INVALID_STATION) {
D_DROP("Dropping - INVALID STATION: %pM\n", hdr->addr1); D_DROP("Dropping - INVALID STATION: %pM\n", hdr->addr1);
goto drop; goto drop;
...@@ -2859,7 +2861,9 @@ il3945_mac_stop(struct ieee80211_hw *hw) ...@@ -2859,7 +2861,9 @@ il3945_mac_stop(struct ieee80211_hw *hw)
} }
static void static void
il3945_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) il3945_mac_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb)
{ {
struct il_priv *il = hw->priv; struct il_priv *il = hw->priv;
...@@ -2868,7 +2872,7 @@ il3945_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) ...@@ -2868,7 +2872,7 @@ il3945_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
D_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, D_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len,
ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate);
if (il3945_tx_skb(il, skb)) if (il3945_tx_skb(il, control->sta, skb))
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
D_MAC80211("leave\n"); D_MAC80211("leave\n");
......
...@@ -1526,8 +1526,11 @@ il4965_tx_cmd_build_basic(struct il_priv *il, struct sk_buff *skb, ...@@ -1526,8 +1526,11 @@ il4965_tx_cmd_build_basic(struct il_priv *il, struct sk_buff *skb,
} }
static void static void
il4965_tx_cmd_build_rate(struct il_priv *il, struct il_tx_cmd *tx_cmd, il4965_tx_cmd_build_rate(struct il_priv *il,
struct ieee80211_tx_info *info, __le16 fc) struct il_tx_cmd *tx_cmd,
struct ieee80211_tx_info *info,
struct ieee80211_sta *sta,
__le16 fc)
{ {
const u8 rts_retry_limit = 60; const u8 rts_retry_limit = 60;
u32 rate_flags; u32 rate_flags;
...@@ -1561,9 +1564,7 @@ il4965_tx_cmd_build_rate(struct il_priv *il, struct il_tx_cmd *tx_cmd, ...@@ -1561,9 +1564,7 @@ il4965_tx_cmd_build_rate(struct il_priv *il, struct il_tx_cmd *tx_cmd,
rate_idx = info->control.rates[0].idx; rate_idx = info->control.rates[0].idx;
if ((info->control.rates[0].flags & IEEE80211_TX_RC_MCS) || rate_idx < 0 if ((info->control.rates[0].flags & IEEE80211_TX_RC_MCS) || rate_idx < 0
|| rate_idx > RATE_COUNT_LEGACY) || rate_idx > RATE_COUNT_LEGACY)
rate_idx = rate_idx = rate_lowest_index(&il->bands[info->band], sta);
rate_lowest_index(&il->bands[info->band],
info->control.sta);
/* For 5 GHZ band, remap mac80211 rate indices into driver indices */ /* For 5 GHZ band, remap mac80211 rate indices into driver indices */
if (info->band == IEEE80211_BAND_5GHZ) if (info->band == IEEE80211_BAND_5GHZ)
rate_idx += IL_FIRST_OFDM_RATE; rate_idx += IL_FIRST_OFDM_RATE;
...@@ -1630,11 +1631,12 @@ il4965_tx_cmd_build_hwcrypto(struct il_priv *il, struct ieee80211_tx_info *info, ...@@ -1630,11 +1631,12 @@ il4965_tx_cmd_build_hwcrypto(struct il_priv *il, struct ieee80211_tx_info *info,
* start C_TX command process * start C_TX command process
*/ */
int int
il4965_tx_skb(struct il_priv *il, struct sk_buff *skb) il4965_tx_skb(struct il_priv *il,
struct ieee80211_sta *sta,
struct sk_buff *skb)
{ {
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_sta *sta = info->control.sta;
struct il_station_priv *sta_priv = NULL; struct il_station_priv *sta_priv = NULL;
struct il_tx_queue *txq; struct il_tx_queue *txq;
struct il_queue *q; struct il_queue *q;
...@@ -1680,7 +1682,7 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb) ...@@ -1680,7 +1682,7 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
sta_id = il->hw_params.bcast_id; sta_id = il->hw_params.bcast_id;
else { else {
/* Find idx into station table for destination station */ /* Find idx into station table for destination station */
sta_id = il_sta_id_or_broadcast(il, info->control.sta); sta_id = il_sta_id_or_broadcast(il, sta);
if (sta_id == IL_INVALID_STATION) { if (sta_id == IL_INVALID_STATION) {
D_DROP("Dropping - INVALID STATION: %pM\n", hdr->addr1); D_DROP("Dropping - INVALID STATION: %pM\n", hdr->addr1);
...@@ -1786,7 +1788,7 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb) ...@@ -1786,7 +1788,7 @@ il4965_tx_skb(struct il_priv *il, struct sk_buff *skb)
/* TODO need this for burst mode later on */ /* TODO need this for burst mode later on */
il4965_tx_cmd_build_basic(il, skb, tx_cmd, info, hdr, sta_id); il4965_tx_cmd_build_basic(il, skb, tx_cmd, info, hdr, sta_id);
il4965_tx_cmd_build_rate(il, tx_cmd, info, fc); il4965_tx_cmd_build_rate(il, tx_cmd, info, sta, fc);
il_update_stats(il, true, fc, len); il_update_stats(il, true, fc, len);
/* /*
...@@ -5828,7 +5830,9 @@ il4965_mac_stop(struct ieee80211_hw *hw) ...@@ -5828,7 +5830,9 @@ il4965_mac_stop(struct ieee80211_hw *hw)
} }
void void
il4965_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) il4965_mac_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb)
{ {
struct il_priv *il = hw->priv; struct il_priv *il = hw->priv;
...@@ -5837,7 +5841,7 @@ il4965_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) ...@@ -5837,7 +5841,7 @@ il4965_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
D_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, D_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len,
ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate);
if (il4965_tx_skb(il, skb)) if (il4965_tx_skb(il, control->sta, skb))
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
D_MACDUMP("leave\n"); D_MACDUMP("leave\n");
......
...@@ -78,7 +78,9 @@ int il4965_hw_txq_attach_buf_to_tfd(struct il_priv *il, struct il_tx_queue *txq, ...@@ -78,7 +78,9 @@ int il4965_hw_txq_attach_buf_to_tfd(struct il_priv *il, struct il_tx_queue *txq,
int il4965_hw_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq); int il4965_hw_tx_queue_init(struct il_priv *il, struct il_tx_queue *txq);
void il4965_hwrate_to_tx_control(struct il_priv *il, u32 rate_n_flags, void il4965_hwrate_to_tx_control(struct il_priv *il, u32 rate_n_flags,
struct ieee80211_tx_info *info); struct ieee80211_tx_info *info);
int il4965_tx_skb(struct il_priv *il, struct sk_buff *skb); int il4965_tx_skb(struct il_priv *il,
struct ieee80211_sta *sta,
struct sk_buff *skb);
int il4965_tx_agg_start(struct il_priv *il, struct ieee80211_vif *vif, int il4965_tx_agg_start(struct il_priv *il, struct ieee80211_vif *vif,
struct ieee80211_sta *sta, u16 tid, u16 * ssn); struct ieee80211_sta *sta, u16 tid, u16 * ssn);
int il4965_tx_agg_stop(struct il_priv *il, struct ieee80211_vif *vif, int il4965_tx_agg_stop(struct il_priv *il, struct ieee80211_vif *vif,
...@@ -163,7 +165,9 @@ void il4965_eeprom_release_semaphore(struct il_priv *il); ...@@ -163,7 +165,9 @@ void il4965_eeprom_release_semaphore(struct il_priv *il);
int il4965_eeprom_check_version(struct il_priv *il); int il4965_eeprom_check_version(struct il_priv *il);
/* mac80211 handlers (for 4965) */ /* mac80211 handlers (for 4965) */
void il4965_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb); void il4965_mac_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb);
int il4965_mac_start(struct ieee80211_hw *hw); int il4965_mac_start(struct ieee80211_hw *hw);
void il4965_mac_stop(struct ieee80211_hw *hw); void il4965_mac_stop(struct ieee80211_hw *hw);
void il4965_configure_filter(struct ieee80211_hw *hw, void il4965_configure_filter(struct ieee80211_hw *hw,
......
...@@ -201,7 +201,9 @@ void iwl_chswitch_done(struct iwl_priv *priv, bool is_success); ...@@ -201,7 +201,9 @@ void iwl_chswitch_done(struct iwl_priv *priv, bool is_success);