|
@@ -30,9 +30,9 @@
|
|
|
|
|
|
static
|
|
|
void wl18xx_get_last_tx_rate(struct wl1271 *wl, struct ieee80211_vif *vif,
|
|
|
- u8 band, struct ieee80211_tx_rate *rate)
|
|
|
+ u8 band, struct ieee80211_tx_rate *rate, u8 hlid)
|
|
|
{
|
|
|
- u8 fw_rate = wl->fw_status->counters.tx_last_rate;
|
|
|
+ u8 fw_rate = wl->links[hlid].fw_rate_idx;
|
|
|
|
|
|
if (fw_rate > CONF_HW_RATE_INDEX_MAX) {
|
|
|
wl1271_error("last Tx rate invalid: %d", fw_rate);
|
|
@@ -79,6 +79,7 @@ static void wl18xx_tx_complete_packet(struct wl1271 *wl, u8 tx_stat_byte)
|
|
|
struct sk_buff *skb;
|
|
|
int id = tx_stat_byte & WL18XX_TX_STATUS_DESC_ID_MASK;
|
|
|
bool tx_success;
|
|
|
+ struct wl1271_tx_hw_descr *tx_desc;
|
|
|
|
|
|
/* check for id legality */
|
|
|
if (unlikely(id >= wl->num_tx_desc || wl->tx_frames[id] == NULL)) {
|
|
@@ -91,6 +92,7 @@ static void wl18xx_tx_complete_packet(struct wl1271 *wl, u8 tx_stat_byte)
|
|
|
|
|
|
skb = wl->tx_frames[id];
|
|
|
info = IEEE80211_SKB_CB(skb);
|
|
|
+ tx_desc = (struct wl1271_tx_hw_descr *)skb->data;
|
|
|
|
|
|
if (wl12xx_is_dummy_packet(wl, skb)) {
|
|
|
wl1271_free_tx_id(wl, id);
|
|
@@ -105,7 +107,9 @@ static void wl18xx_tx_complete_packet(struct wl1271 *wl, u8 tx_stat_byte)
|
|
|
* the info->status structures
|
|
|
*/
|
|
|
wl18xx_get_last_tx_rate(wl, info->control.vif,
|
|
|
- info->band, &info->status.rates[0]);
|
|
|
+ info->band,
|
|
|
+ &info->status.rates[0],
|
|
|
+ tx_desc->hlid);
|
|
|
|
|
|
info->status.rates[0].count = 1; /* no data about retries */
|
|
|
info->status.ack_signal = -1;
|
|
@@ -144,12 +148,22 @@ void wl18xx_tx_immediate_complete(struct wl1271 *wl)
|
|
|
struct wl18xx_fw_status_priv *status_priv =
|
|
|
(struct wl18xx_fw_status_priv *)wl->fw_status->priv;
|
|
|
struct wl18xx_priv *priv = wl->priv;
|
|
|
- u8 i;
|
|
|
+ u8 i, hlid;
|
|
|
|
|
|
/* nothing to do here */
|
|
|
if (priv->last_fw_rls_idx == status_priv->fw_release_idx)
|
|
|
return;
|
|
|
|
|
|
+ /* update rates per link */
|
|
|
+ hlid = wl->fw_status->counters.hlid;
|
|
|
+
|
|
|
+ if (hlid < WLCORE_MAX_LINKS) {
|
|
|
+ wl->links[hlid].fw_rate_idx =
|
|
|
+ wl->fw_status->counters.tx_last_rate;
|
|
|
+ wl->links[hlid].fw_rate_mbps =
|
|
|
+ wl->fw_status->counters.tx_last_rate_mbps;
|
|
|
+ }
|
|
|
+
|
|
|
/* freed Tx descriptors */
|
|
|
wl1271_debug(DEBUG_TX, "last released desc = %d, current idx = %d",
|
|
|
priv->last_fw_rls_idx, status_priv->fw_release_idx);
|