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);
        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)) {
 
        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);
         * 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;
        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);
 
 
                /* Tx rate of the last transmitted packet */
                u8 tx_last_rate;
+
+               /* Tx rate or Tx rate estimate pre calculated by fw in mbps */
+               u8 tx_last_rate_mbps;
+
+               /* hlid for which the rates were reported */
+               u8 hlid;
        } counters;
 
        u32 log_start_addr;
        /* bitmap of TIDs where RX BA sessions are active for this link */
        u8 ba_bitmap;
 
+       /* the last fw rate index we used for this link */
+       u8 fw_rate_idx;
+
+       /* the last fw rate [Mbps] we used for this link */
+       u8 fw_rate_mbps;
+
        /* The wlvif this link belongs to. Might be null for global links */
        struct wl12xx_vif *wlvif;
 
         * Used in both AP and STA mode.
         */
        u64 total_freed_pkts;
+       struct wl1271 *wl;
 };
 
 struct wl12xx_vif {