Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /******************************************************************************
0003  *
0004  * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
0005  *
0006  * Contact Information:
0007  *  Intel Linux Wireless <ilw@linux.intel.com>
0008  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
0009  *
0010  *****************************************************************************/
0011 #include <linux/kernel.h>
0012 #include <linux/skbuff.h>
0013 #include <linux/slab.h>
0014 #include <net/mac80211.h>
0015 
0016 #include <linux/netdevice.h>
0017 #include <linux/etherdevice.h>
0018 #include <linux/delay.h>
0019 
0020 #include <linux/workqueue.h>
0021 
0022 #include "common.h"
0023 #include "4965.h"
0024 
0025 #define IL4965_RS_NAME "iwl-4965-rs"
0026 
0027 #define NUM_TRY_BEFORE_ANT_TOGGLE 1
0028 #define IL_NUMBER_TRY      1
0029 #define IL_HT_NUMBER_TRY   3
0030 
0031 #define RATE_MAX_WINDOW     62  /* # tx in history win */
0032 #define RATE_MIN_FAILURE_TH     6   /* min failures to calc tpt */
0033 #define RATE_MIN_SUCCESS_TH     8   /* min successes to calc tpt */
0034 
0035 /* max allowed rate miss before sync LQ cmd */
0036 #define IL_MISSED_RATE_MAX      15
0037 /* max time to accum history 2 seconds */
0038 #define RATE_SCALE_FLUSH_INTVL   (3*HZ)
0039 
0040 static u8 rs_ht_to_legacy[] = {
0041     RATE_6M_IDX, RATE_6M_IDX,
0042     RATE_6M_IDX, RATE_6M_IDX,
0043     RATE_6M_IDX,
0044     RATE_6M_IDX, RATE_9M_IDX,
0045     RATE_12M_IDX, RATE_18M_IDX,
0046     RATE_24M_IDX, RATE_36M_IDX,
0047     RATE_48M_IDX, RATE_54M_IDX
0048 };
0049 
0050 static const u8 ant_toggle_lookup[] = {
0051     /*ANT_NONE -> */ ANT_NONE,
0052     /*ANT_A    -> */ ANT_B,
0053     /*ANT_B    -> */ ANT_C,
0054     /*ANT_AB   -> */ ANT_BC,
0055     /*ANT_C    -> */ ANT_A,
0056     /*ANT_AC   -> */ ANT_AB,
0057     /*ANT_BC   -> */ ANT_AC,
0058     /*ANT_ABC  -> */ ANT_ABC,
0059 };
0060 
0061 #define IL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np)    \
0062     [RATE_##r##M_IDX] = { RATE_##r##M_PLCP,      \
0063                     RATE_SISO_##s##M_PLCP, \
0064                     RATE_MIMO2_##s##M_PLCP,\
0065                     RATE_##r##M_IEEE,      \
0066                     RATE_##ip##M_IDX,    \
0067                     RATE_##in##M_IDX,    \
0068                     RATE_##rp##M_IDX,    \
0069                     RATE_##rn##M_IDX,    \
0070                     RATE_##pp##M_IDX,    \
0071                     RATE_##np##M_IDX }
0072 
0073 /*
0074  * Parameter order:
0075  *   rate, ht rate, prev rate, next rate, prev tgg rate, next tgg rate
0076  *
0077  * If there isn't a valid next or previous rate then INV is used which
0078  * maps to RATE_INVALID
0079  *
0080  */
0081 const struct il_rate_info il_rates[RATE_COUNT] = {
0082     IL_DECLARE_RATE_INFO(1, INV, INV, 2, INV, 2, INV, 2),   /*  1mbps */
0083     IL_DECLARE_RATE_INFO(2, INV, 1, 5, 1, 5, 1, 5),     /*  2mbps */
0084     IL_DECLARE_RATE_INFO(5, INV, 2, 6, 2, 11, 2, 11),   /*5.5mbps */
0085     IL_DECLARE_RATE_INFO(11, INV, 9, 12, 9, 12, 5, 18), /* 11mbps */
0086     IL_DECLARE_RATE_INFO(6, 6, 5, 9, 5, 11, 5, 11),     /*  6mbps */
0087     IL_DECLARE_RATE_INFO(9, 6, 6, 11, 6, 11, 5, 11),    /*  9mbps */
0088     IL_DECLARE_RATE_INFO(12, 12, 11, 18, 11, 18, 11, 18),   /* 12mbps */
0089     IL_DECLARE_RATE_INFO(18, 18, 12, 24, 12, 24, 11, 24),   /* 18mbps */
0090     IL_DECLARE_RATE_INFO(24, 24, 18, 36, 18, 36, 18, 36),   /* 24mbps */
0091     IL_DECLARE_RATE_INFO(36, 36, 24, 48, 24, 48, 24, 48),   /* 36mbps */
0092     IL_DECLARE_RATE_INFO(48, 48, 36, 54, 36, 54, 36, 54),   /* 48mbps */
0093     IL_DECLARE_RATE_INFO(54, 54, 48, INV, 48, INV, 48, INV),/* 54mbps */
0094     IL_DECLARE_RATE_INFO(60, 60, 48, INV, 48, INV, 48, INV),/* 60mbps */
0095 };
0096 
0097 static int
0098 il4965_hwrate_to_plcp_idx(u32 rate_n_flags)
0099 {
0100     int idx = 0;
0101 
0102     /* HT rate format */
0103     if (rate_n_flags & RATE_MCS_HT_MSK) {
0104         idx = (rate_n_flags & 0xff);
0105 
0106         if (idx >= RATE_MIMO2_6M_PLCP)
0107             idx = idx - RATE_MIMO2_6M_PLCP;
0108 
0109         idx += IL_FIRST_OFDM_RATE;
0110         /* skip 9M not supported in ht */
0111         if (idx >= RATE_9M_IDX)
0112             idx += 1;
0113         if (idx >= IL_FIRST_OFDM_RATE && idx <= IL_LAST_OFDM_RATE)
0114             return idx;
0115 
0116         /* legacy rate format, search for match in table */
0117     } else {
0118         for (idx = 0; idx < ARRAY_SIZE(il_rates); idx++)
0119             if (il_rates[idx].plcp == (rate_n_flags & 0xFF))
0120                 return idx;
0121     }
0122 
0123     return -1;
0124 }
0125 
0126 static void il4965_rs_rate_scale_perform(struct il_priv *il,
0127                      struct sk_buff *skb,
0128                      struct ieee80211_sta *sta,
0129                      struct il_lq_sta *lq_sta);
0130 static void il4965_rs_fill_link_cmd(struct il_priv *il,
0131                     struct il_lq_sta *lq_sta, u32 rate_n_flags);
0132 static void il4965_rs_stay_in_table(struct il_lq_sta *lq_sta,
0133                     bool force_search);
0134 
0135 #ifdef CONFIG_MAC80211_DEBUGFS
0136 static void il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta,
0137                     u32 *rate_n_flags, int idx);
0138 #else
0139 static void
0140 il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta, u32 * rate_n_flags, int idx)
0141 {
0142 }
0143 #endif
0144 
0145 /*
0146  * The following tables contain the expected throughput metrics for all rates
0147  *
0148  *  1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54, 60 MBits
0149  *
0150  * where invalid entries are zeros.
0151  *
0152  * CCK rates are only valid in legacy table and will only be used in G
0153  * (2.4 GHz) band.
0154  */
0155 
0156 static s32 expected_tpt_legacy[RATE_COUNT] = {
0157     7, 13, 35, 58, 40, 57, 72, 98, 121, 154, 177, 186, 0
0158 };
0159 
0160 static s32 expected_tpt_siso20MHz[4][RATE_COUNT] = {
0161     {0, 0, 0, 0, 42, 0, 76, 102, 124, 158, 183, 193, 202},  /* Norm */
0162     {0, 0, 0, 0, 46, 0, 82, 110, 132, 167, 192, 202, 210},  /* SGI */
0163     {0, 0, 0, 0, 48, 0, 93, 135, 176, 251, 319, 351, 381},  /* AGG */
0164     {0, 0, 0, 0, 53, 0, 102, 149, 193, 275, 348, 381, 413}, /* AGG+SGI */
0165 };
0166 
0167 static s32 expected_tpt_siso40MHz[4][RATE_COUNT] = {
0168     {0, 0, 0, 0, 77, 0, 127, 160, 184, 220, 242, 250, 257}, /* Norm */
0169     {0, 0, 0, 0, 83, 0, 135, 169, 193, 229, 250, 257, 264}, /* SGI */
0170     {0, 0, 0, 0, 96, 0, 182, 259, 328, 451, 553, 598, 640}, /* AGG */
0171     {0, 0, 0, 0, 106, 0, 199, 282, 357, 487, 593, 640, 683},    /* AGG+SGI */
0172 };
0173 
0174 static s32 expected_tpt_mimo2_20MHz[4][RATE_COUNT] = {
0175     {0, 0, 0, 0, 74, 0, 123, 155, 179, 213, 235, 243, 250}, /* Norm */
0176     {0, 0, 0, 0, 81, 0, 131, 164, 187, 221, 242, 250, 256}, /* SGI */
0177     {0, 0, 0, 0, 92, 0, 175, 250, 317, 436, 534, 578, 619}, /* AGG */
0178     {0, 0, 0, 0, 102, 0, 192, 273, 344, 470, 573, 619, 660},    /* AGG+SGI */
0179 };
0180 
0181 static s32 expected_tpt_mimo2_40MHz[4][RATE_COUNT] = {
0182     {0, 0, 0, 0, 123, 0, 182, 214, 235, 264, 279, 285, 289},    /* Norm */
0183     {0, 0, 0, 0, 131, 0, 191, 222, 242, 270, 284, 289, 293},    /* SGI */
0184     {0, 0, 0, 0, 180, 0, 327, 446, 545, 708, 828, 878, 922},    /* AGG */
0185     {0, 0, 0, 0, 197, 0, 355, 481, 584, 752, 872, 922, 966},    /* AGG+SGI */
0186 };
0187 
0188 /* mbps, mcs */
0189 static const struct il_rate_mcs_info il_rate_mcs[RATE_COUNT] = {
0190     {"1", "BPSK DSSS"},
0191     {"2", "QPSK DSSS"},
0192     {"5.5", "BPSK CCK"},
0193     {"11", "QPSK CCK"},
0194     {"6", "BPSK 1/2"},
0195     {"9", "BPSK 1/2"},
0196     {"12", "QPSK 1/2"},
0197     {"18", "QPSK 3/4"},
0198     {"24", "16QAM 1/2"},
0199     {"36", "16QAM 3/4"},
0200     {"48", "64QAM 2/3"},
0201     {"54", "64QAM 3/4"},
0202     {"60", "64QAM 5/6"},
0203 };
0204 
0205 #define MCS_IDX_PER_STREAM  (8)
0206 
0207 static inline u8
0208 il4965_rs_extract_rate(u32 rate_n_flags)
0209 {
0210     return (u8) (rate_n_flags & 0xFF);
0211 }
0212 
0213 static void
0214 il4965_rs_rate_scale_clear_win(struct il_rate_scale_data *win)
0215 {
0216     win->data = 0;
0217     win->success_counter = 0;
0218     win->success_ratio = IL_INVALID_VALUE;
0219     win->counter = 0;
0220     win->average_tpt = IL_INVALID_VALUE;
0221     win->stamp = 0;
0222 }
0223 
0224 static inline u8
0225 il4965_rs_is_valid_ant(u8 valid_antenna, u8 ant_type)
0226 {
0227     return (ant_type & valid_antenna) == ant_type;
0228 }
0229 
0230 /*
0231  *  removes the old data from the stats. All data that is older than
0232  *  TID_MAX_TIME_DIFF, will be deleted.
0233  */
0234 static void
0235 il4965_rs_tl_rm_old_stats(struct il_traffic_load *tl, u32 curr_time)
0236 {
0237     /* The oldest age we want to keep */
0238     u32 oldest_time = curr_time - TID_MAX_TIME_DIFF;
0239 
0240     while (tl->queue_count && tl->time_stamp < oldest_time) {
0241         tl->total -= tl->packet_count[tl->head];
0242         tl->packet_count[tl->head] = 0;
0243         tl->time_stamp += TID_QUEUE_CELL_SPACING;
0244         tl->queue_count--;
0245         tl->head++;
0246         if (tl->head >= TID_QUEUE_MAX_SIZE)
0247             tl->head = 0;
0248     }
0249 }
0250 
0251 /*
0252  *  increment traffic load value for tid and also remove
0253  *  any old values if passed the certain time period
0254  */
0255 static u8
0256 il4965_rs_tl_add_packet(struct il_lq_sta *lq_data, struct ieee80211_hdr *hdr)
0257 {
0258     u32 curr_time = jiffies_to_msecs(jiffies);
0259     u32 time_diff;
0260     s32 idx;
0261     struct il_traffic_load *tl = NULL;
0262     u8 tid;
0263 
0264     if (ieee80211_is_data_qos(hdr->frame_control)) {
0265         u8 *qc = ieee80211_get_qos_ctl(hdr);
0266         tid = qc[0] & 0xf;
0267     } else
0268         return MAX_TID_COUNT;
0269 
0270     if (unlikely(tid >= TID_MAX_LOAD_COUNT))
0271         return MAX_TID_COUNT;
0272 
0273     tl = &lq_data->load[tid];
0274 
0275     curr_time -= curr_time % TID_ROUND_VALUE;
0276 
0277     /* Happens only for the first packet. Initialize the data */
0278     if (!(tl->queue_count)) {
0279         tl->total = 1;
0280         tl->time_stamp = curr_time;
0281         tl->queue_count = 1;
0282         tl->head = 0;
0283         tl->packet_count[0] = 1;
0284         return MAX_TID_COUNT;
0285     }
0286 
0287     time_diff = TIME_WRAP_AROUND(tl->time_stamp, curr_time);
0288     idx = time_diff / TID_QUEUE_CELL_SPACING;
0289 
0290     /* The history is too long: remove data that is older than */
0291     /* TID_MAX_TIME_DIFF */
0292     if (idx >= TID_QUEUE_MAX_SIZE)
0293         il4965_rs_tl_rm_old_stats(tl, curr_time);
0294 
0295     idx = (tl->head + idx) % TID_QUEUE_MAX_SIZE;
0296     tl->packet_count[idx] = tl->packet_count[idx] + 1;
0297     tl->total = tl->total + 1;
0298 
0299     if ((idx + 1) > tl->queue_count)
0300         tl->queue_count = idx + 1;
0301 
0302     return tid;
0303 }
0304 
0305 /*
0306     get the traffic load value for tid
0307 */
0308 static u32
0309 il4965_rs_tl_get_load(struct il_lq_sta *lq_data, u8 tid)
0310 {
0311     u32 curr_time = jiffies_to_msecs(jiffies);
0312     u32 time_diff;
0313     s32 idx;
0314     struct il_traffic_load *tl = NULL;
0315 
0316     if (tid >= TID_MAX_LOAD_COUNT)
0317         return 0;
0318 
0319     tl = &(lq_data->load[tid]);
0320 
0321     curr_time -= curr_time % TID_ROUND_VALUE;
0322 
0323     if (!(tl->queue_count))
0324         return 0;
0325 
0326     time_diff = TIME_WRAP_AROUND(tl->time_stamp, curr_time);
0327     idx = time_diff / TID_QUEUE_CELL_SPACING;
0328 
0329     /* The history is too long: remove data that is older than */
0330     /* TID_MAX_TIME_DIFF */
0331     if (idx >= TID_QUEUE_MAX_SIZE)
0332         il4965_rs_tl_rm_old_stats(tl, curr_time);
0333 
0334     return tl->total;
0335 }
0336 
0337 static int
0338 il4965_rs_tl_turn_on_agg_for_tid(struct il_priv *il, struct il_lq_sta *lq_data,
0339                  u8 tid, struct ieee80211_sta *sta)
0340 {
0341     int ret = -EAGAIN;
0342     u32 load;
0343 
0344     load = il4965_rs_tl_get_load(lq_data, tid);
0345 
0346     if (load > IL_AGG_LOAD_THRESHOLD) {
0347         D_HT("Starting Tx agg: STA: %pM tid: %d\n", sta->addr, tid);
0348         ret = ieee80211_start_tx_ba_session(sta, tid, 5000);
0349         if (ret == -EAGAIN) {
0350             /*
0351              * driver and mac80211 is out of sync
0352              * this might be cause by reloading firmware
0353              * stop the tx ba session here
0354              */
0355             IL_ERR("Fail start Tx agg on tid: %d\n", tid);
0356             ieee80211_stop_tx_ba_session(sta, tid);
0357         }
0358     } else
0359         D_HT("Aggregation not enabled for tid %d because load = %u\n",
0360              tid, load);
0361 
0362     return ret;
0363 }
0364 
0365 static void
0366 il4965_rs_tl_turn_on_agg(struct il_priv *il, u8 tid, struct il_lq_sta *lq_data,
0367              struct ieee80211_sta *sta)
0368 {
0369     if (tid < TID_MAX_LOAD_COUNT)
0370         il4965_rs_tl_turn_on_agg_for_tid(il, lq_data, tid, sta);
0371     else
0372         IL_ERR("tid exceeds max load count: %d/%d\n", tid,
0373                TID_MAX_LOAD_COUNT);
0374 }
0375 
0376 static inline int
0377 il4965_get_il4965_num_of_ant_from_rate(u32 rate_n_flags)
0378 {
0379     return !!(rate_n_flags & RATE_MCS_ANT_A_MSK) +
0380         !!(rate_n_flags & RATE_MCS_ANT_B_MSK) +
0381         !!(rate_n_flags & RATE_MCS_ANT_C_MSK);
0382 }
0383 
0384 /*
0385  * Static function to get the expected throughput from an il_scale_tbl_info
0386  * that wraps a NULL pointer check
0387  */
0388 static s32
0389 il4965_get_expected_tpt(struct il_scale_tbl_info *tbl, int rs_idx)
0390 {
0391     if (tbl->expected_tpt)
0392         return tbl->expected_tpt[rs_idx];
0393     return 0;
0394 }
0395 
0396 /*
0397  * il4965_rs_collect_tx_data - Update the success/failure sliding win
0398  *
0399  * We keep a sliding win of the last 62 packets transmitted
0400  * at this rate.  win->data contains the bitmask of successful
0401  * packets.
0402  */
0403 static int
0404 il4965_rs_collect_tx_data(struct il_scale_tbl_info *tbl, int scale_idx,
0405               int attempts, int successes)
0406 {
0407     struct il_rate_scale_data *win = NULL;
0408     static const u64 mask = (((u64) 1) << (RATE_MAX_WINDOW - 1));
0409     s32 fail_count, tpt;
0410 
0411     if (scale_idx < 0 || scale_idx >= RATE_COUNT)
0412         return -EINVAL;
0413 
0414     /* Select win for current tx bit rate */
0415     win = &(tbl->win[scale_idx]);
0416 
0417     /* Get expected throughput */
0418     tpt = il4965_get_expected_tpt(tbl, scale_idx);
0419 
0420     /*
0421      * Keep track of only the latest 62 tx frame attempts in this rate's
0422      * history win; anything older isn't really relevant any more.
0423      * If we have filled up the sliding win, drop the oldest attempt;
0424      * if the oldest attempt (highest bit in bitmap) shows "success",
0425      * subtract "1" from the success counter (this is the main reason
0426      * we keep these bitmaps!).
0427      */
0428     while (attempts > 0) {
0429         if (win->counter >= RATE_MAX_WINDOW) {
0430 
0431             /* remove earliest */
0432             win->counter = RATE_MAX_WINDOW - 1;
0433 
0434             if (win->data & mask) {
0435                 win->data &= ~mask;
0436                 win->success_counter--;
0437             }
0438         }
0439 
0440         /* Increment frames-attempted counter */
0441         win->counter++;
0442 
0443         /* Shift bitmap by one frame to throw away oldest history */
0444         win->data <<= 1;
0445 
0446         /* Mark the most recent #successes attempts as successful */
0447         if (successes > 0) {
0448             win->success_counter++;
0449             win->data |= 0x1;
0450             successes--;
0451         }
0452 
0453         attempts--;
0454     }
0455 
0456     /* Calculate current success ratio, avoid divide-by-0! */
0457     if (win->counter > 0)
0458         win->success_ratio =
0459             128 * (100 * win->success_counter) / win->counter;
0460     else
0461         win->success_ratio = IL_INVALID_VALUE;
0462 
0463     fail_count = win->counter - win->success_counter;
0464 
0465     /* Calculate average throughput, if we have enough history. */
0466     if (fail_count >= RATE_MIN_FAILURE_TH ||
0467         win->success_counter >= RATE_MIN_SUCCESS_TH)
0468         win->average_tpt = (win->success_ratio * tpt + 64) / 128;
0469     else
0470         win->average_tpt = IL_INVALID_VALUE;
0471 
0472     /* Tag this win as having been updated */
0473     win->stamp = jiffies;
0474 
0475     return 0;
0476 }
0477 
0478 /*
0479  * Fill uCode API rate_n_flags field, based on "search" or "active" table.
0480  */
0481 static u32
0482 il4965_rate_n_flags_from_tbl(struct il_priv *il, struct il_scale_tbl_info *tbl,
0483                  int idx, u8 use_green)
0484 {
0485     u32 rate_n_flags = 0;
0486 
0487     if (is_legacy(tbl->lq_type)) {
0488         rate_n_flags = il_rates[idx].plcp;
0489         if (idx >= IL_FIRST_CCK_RATE && idx <= IL_LAST_CCK_RATE)
0490             rate_n_flags |= RATE_MCS_CCK_MSK;
0491 
0492     } else if (is_Ht(tbl->lq_type)) {
0493         if (idx > IL_LAST_OFDM_RATE) {
0494             IL_ERR("Invalid HT rate idx %d\n", idx);
0495             idx = IL_LAST_OFDM_RATE;
0496         }
0497         rate_n_flags = RATE_MCS_HT_MSK;
0498 
0499         if (is_siso(tbl->lq_type))
0500             rate_n_flags |= il_rates[idx].plcp_siso;
0501         else
0502             rate_n_flags |= il_rates[idx].plcp_mimo2;
0503     } else {
0504         IL_ERR("Invalid tbl->lq_type %d\n", tbl->lq_type);
0505     }
0506 
0507     rate_n_flags |=
0508         ((tbl->ant_type << RATE_MCS_ANT_POS) & RATE_MCS_ANT_ABC_MSK);
0509 
0510     if (is_Ht(tbl->lq_type)) {
0511         if (tbl->is_ht40) {
0512             if (tbl->is_dup)
0513                 rate_n_flags |= RATE_MCS_DUP_MSK;
0514             else
0515                 rate_n_flags |= RATE_MCS_HT40_MSK;
0516         }
0517         if (tbl->is_SGI)
0518             rate_n_flags |= RATE_MCS_SGI_MSK;
0519 
0520         if (use_green) {
0521             rate_n_flags |= RATE_MCS_GF_MSK;
0522             if (is_siso(tbl->lq_type) && tbl->is_SGI) {
0523                 rate_n_flags &= ~RATE_MCS_SGI_MSK;
0524                 IL_ERR("GF was set with SGI:SISO\n");
0525             }
0526         }
0527     }
0528     return rate_n_flags;
0529 }
0530 
0531 /*
0532  * Interpret uCode API's rate_n_flags format,
0533  * fill "search" or "active" tx mode table.
0534  */
0535 static int
0536 il4965_rs_get_tbl_info_from_mcs(const u32 rate_n_flags,
0537                 enum nl80211_band band,
0538                 struct il_scale_tbl_info *tbl, int *rate_idx)
0539 {
0540     u32 ant_msk = (rate_n_flags & RATE_MCS_ANT_ABC_MSK);
0541     u8 il4965_num_of_ant =
0542         il4965_get_il4965_num_of_ant_from_rate(rate_n_flags);
0543     u8 mcs;
0544 
0545     memset(tbl, 0, sizeof(struct il_scale_tbl_info));
0546     *rate_idx = il4965_hwrate_to_plcp_idx(rate_n_flags);
0547 
0548     if (*rate_idx == RATE_INVALID) {
0549         *rate_idx = -1;
0550         return -EINVAL;
0551     }
0552     tbl->is_SGI = 0;    /* default legacy setup */
0553     tbl->is_ht40 = 0;
0554     tbl->is_dup = 0;
0555     tbl->ant_type = (ant_msk >> RATE_MCS_ANT_POS);
0556     tbl->lq_type = LQ_NONE;
0557     tbl->max_search = IL_MAX_SEARCH;
0558 
0559     /* legacy rate format */
0560     if (!(rate_n_flags & RATE_MCS_HT_MSK)) {
0561         if (il4965_num_of_ant == 1) {
0562             if (band == NL80211_BAND_5GHZ)
0563                 tbl->lq_type = LQ_A;
0564             else
0565                 tbl->lq_type = LQ_G;
0566         }
0567         /* HT rate format */
0568     } else {
0569         if (rate_n_flags & RATE_MCS_SGI_MSK)
0570             tbl->is_SGI = 1;
0571 
0572         if ((rate_n_flags & RATE_MCS_HT40_MSK) ||
0573             (rate_n_flags & RATE_MCS_DUP_MSK))
0574             tbl->is_ht40 = 1;
0575 
0576         if (rate_n_flags & RATE_MCS_DUP_MSK)
0577             tbl->is_dup = 1;
0578 
0579         mcs = il4965_rs_extract_rate(rate_n_flags);
0580 
0581         /* SISO */
0582         if (mcs <= RATE_SISO_60M_PLCP) {
0583             if (il4965_num_of_ant == 1)
0584                 tbl->lq_type = LQ_SISO; /*else NONE */
0585             /* MIMO2 */
0586         } else {
0587             if (il4965_num_of_ant == 2)
0588                 tbl->lq_type = LQ_MIMO2;
0589         }
0590     }
0591     return 0;
0592 }
0593 
0594 /* switch to another antenna/antennas and return 1 */
0595 /* if no other valid antenna found, return 0 */
0596 static int
0597 il4965_rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags,
0598              struct il_scale_tbl_info *tbl)
0599 {
0600     u8 new_ant_type;
0601 
0602     if (!tbl->ant_type || tbl->ant_type > ANT_ABC)
0603         return 0;
0604 
0605     if (!il4965_rs_is_valid_ant(valid_ant, tbl->ant_type))
0606         return 0;
0607 
0608     new_ant_type = ant_toggle_lookup[tbl->ant_type];
0609 
0610     while (new_ant_type != tbl->ant_type &&
0611            !il4965_rs_is_valid_ant(valid_ant, new_ant_type))
0612         new_ant_type = ant_toggle_lookup[new_ant_type];
0613 
0614     if (new_ant_type == tbl->ant_type)
0615         return 0;
0616 
0617     tbl->ant_type = new_ant_type;
0618     *rate_n_flags &= ~RATE_MCS_ANT_ABC_MSK;
0619     *rate_n_flags |= new_ant_type << RATE_MCS_ANT_POS;
0620     return 1;
0621 }
0622 
0623 /*
0624  * Green-field mode is valid if the station supports it and
0625  * there are no non-GF stations present in the BSS.
0626  */
0627 static bool
0628 il4965_rs_use_green(struct il_priv *il, struct ieee80211_sta *sta)
0629 {
0630     return (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) &&
0631            !il->ht.non_gf_sta_present;
0632 }
0633 
0634 /*
0635  * il4965_rs_get_supported_rates - get the available rates
0636  *
0637  * if management frame or broadcast frame only return
0638  * basic available rates.
0639  *
0640  */
0641 static u16
0642 il4965_rs_get_supported_rates(struct il_lq_sta *lq_sta,
0643                   struct ieee80211_hdr *hdr,
0644                   enum il_table_type rate_type)
0645 {
0646     if (is_legacy(rate_type)) {
0647         return lq_sta->active_legacy_rate;
0648     } else {
0649         if (is_siso(rate_type))
0650             return lq_sta->active_siso_rate;
0651         else
0652             return lq_sta->active_mimo2_rate;
0653     }
0654 }
0655 
0656 static u16
0657 il4965_rs_get_adjacent_rate(struct il_priv *il, u8 idx, u16 rate_mask,
0658                 int rate_type)
0659 {
0660     u8 high = RATE_INVALID;
0661     u8 low = RATE_INVALID;
0662 
0663     /* 802.11A or ht walks to the next literal adjacent rate in
0664      * the rate table */
0665     if (is_a_band(rate_type) || !is_legacy(rate_type)) {
0666         int i;
0667         u32 mask;
0668 
0669         /* Find the previous rate that is in the rate mask */
0670         i = idx - 1;
0671         for (mask = (1 << i); i >= 0; i--, mask >>= 1) {
0672             if (rate_mask & mask) {
0673                 low = i;
0674                 break;
0675             }
0676         }
0677 
0678         /* Find the next rate that is in the rate mask */
0679         i = idx + 1;
0680         for (mask = (1 << i); i < RATE_COUNT; i++, mask <<= 1) {
0681             if (rate_mask & mask) {
0682                 high = i;
0683                 break;
0684             }
0685         }
0686 
0687         return (high << 8) | low;
0688     }
0689 
0690     low = idx;
0691     while (low != RATE_INVALID) {
0692         low = il_rates[low].prev_rs;
0693         if (low == RATE_INVALID)
0694             break;
0695         if (rate_mask & (1 << low))
0696             break;
0697         D_RATE("Skipping masked lower rate: %d\n", low);
0698     }
0699 
0700     high = idx;
0701     while (high != RATE_INVALID) {
0702         high = il_rates[high].next_rs;
0703         if (high == RATE_INVALID)
0704             break;
0705         if (rate_mask & (1 << high))
0706             break;
0707         D_RATE("Skipping masked higher rate: %d\n", high);
0708     }
0709 
0710     return (high << 8) | low;
0711 }
0712 
0713 static u32
0714 il4965_rs_get_lower_rate(struct il_lq_sta *lq_sta,
0715              struct il_scale_tbl_info *tbl, u8 scale_idx,
0716              u8 ht_possible)
0717 {
0718     s32 low;
0719     u16 rate_mask;
0720     u16 high_low;
0721     u8 switch_to_legacy = 0;
0722     u8 is_green = lq_sta->is_green;
0723     struct il_priv *il = lq_sta->drv;
0724 
0725     /* check if we need to switch from HT to legacy rates.
0726      * assumption is that mandatory rates (1Mbps or 6Mbps)
0727      * are always supported (spec demand) */
0728     if (!is_legacy(tbl->lq_type) && (!ht_possible || !scale_idx)) {
0729         switch_to_legacy = 1;
0730         scale_idx = rs_ht_to_legacy[scale_idx];
0731         if (lq_sta->band == NL80211_BAND_5GHZ)
0732             tbl->lq_type = LQ_A;
0733         else
0734             tbl->lq_type = LQ_G;
0735 
0736         if (il4965_num_of_ant(tbl->ant_type) > 1)
0737             tbl->ant_type =
0738                 il4965_first_antenna(il->hw_params.valid_tx_ant);
0739 
0740         tbl->is_ht40 = 0;
0741         tbl->is_SGI = 0;
0742         tbl->max_search = IL_MAX_SEARCH;
0743     }
0744 
0745     rate_mask = il4965_rs_get_supported_rates(lq_sta, NULL, tbl->lq_type);
0746 
0747     /* Mask with station rate restriction */
0748     if (is_legacy(tbl->lq_type)) {
0749         /* supp_rates has no CCK bits in A mode */
0750         if (lq_sta->band == NL80211_BAND_5GHZ)
0751             rate_mask =
0752                 (u16) (rate_mask &
0753                    (lq_sta->supp_rates << IL_FIRST_OFDM_RATE));
0754         else
0755             rate_mask = (u16) (rate_mask & lq_sta->supp_rates);
0756     }
0757 
0758     /* If we switched from HT to legacy, check current rate */
0759     if (switch_to_legacy && (rate_mask & (1 << scale_idx))) {
0760         low = scale_idx;
0761         goto out;
0762     }
0763 
0764     high_low =
0765         il4965_rs_get_adjacent_rate(lq_sta->drv, scale_idx, rate_mask,
0766                     tbl->lq_type);
0767     low = high_low & 0xff;
0768 
0769     if (low == RATE_INVALID)
0770         low = scale_idx;
0771 
0772 out:
0773     return il4965_rate_n_flags_from_tbl(lq_sta->drv, tbl, low, is_green);
0774 }
0775 
0776 /*
0777  * Simple function to compare two rate scale table types
0778  */
0779 static bool
0780 il4965_table_type_matches(struct il_scale_tbl_info *a,
0781               struct il_scale_tbl_info *b)
0782 {
0783     return (a->lq_type == b->lq_type && a->ant_type == b->ant_type &&
0784         a->is_SGI == b->is_SGI);
0785 }
0786 
0787 /*
0788  * mac80211 sends us Tx status
0789  */
0790 static void
0791 il4965_rs_tx_status(void *il_r, struct ieee80211_supported_band *sband,
0792             struct ieee80211_sta *sta, void *il_sta,
0793             struct sk_buff *skb)
0794 {
0795     int legacy_success;
0796     int retries;
0797     int rs_idx, mac_idx, i;
0798     struct il_lq_sta *lq_sta = il_sta;
0799     struct il_link_quality_cmd *table;
0800     struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
0801     struct il_priv *il = (struct il_priv *)il_r;
0802     struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
0803     enum mac80211_rate_control_flags mac_flags;
0804     u32 tx_rate;
0805     struct il_scale_tbl_info tbl_type;
0806     struct il_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl;
0807 
0808     D_RATE("get frame ack response, update rate scale win\n");
0809 
0810     /* Treat uninitialized rate scaling data same as non-existing. */
0811     if (!lq_sta) {
0812         D_RATE("Station rate scaling not created yet.\n");
0813         return;
0814     } else if (!lq_sta->drv) {
0815         D_RATE("Rate scaling not initialized yet.\n");
0816         return;
0817     }
0818 
0819     if (!ieee80211_is_data(hdr->frame_control) ||
0820         (info->flags & IEEE80211_TX_CTL_NO_ACK))
0821         return;
0822 
0823     /* This packet was aggregated but doesn't carry status info */
0824     if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
0825         !(info->flags & IEEE80211_TX_STAT_AMPDU))
0826         return;
0827 
0828     /*
0829      * Ignore this Tx frame response if its initial rate doesn't match
0830      * that of latest Link Quality command.  There may be stragglers
0831      * from a previous Link Quality command, but we're no longer interested
0832      * in those; they're either from the "active" mode while we're trying
0833      * to check "search" mode, or a prior "search" mode after we've moved
0834      * to a new "search" mode (which might become the new "active" mode).
0835      */
0836     table = &lq_sta->lq;
0837     tx_rate = le32_to_cpu(table->rs_table[0].rate_n_flags);
0838     il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band, &tbl_type, &rs_idx);
0839     if (il->band == NL80211_BAND_5GHZ)
0840         rs_idx -= IL_FIRST_OFDM_RATE;
0841     mac_flags = info->status.rates[0].flags;
0842     mac_idx = info->status.rates[0].idx;
0843     /* For HT packets, map MCS to PLCP */
0844     if (mac_flags & IEEE80211_TX_RC_MCS) {
0845         mac_idx &= RATE_MCS_CODE_MSK;   /* Remove # of streams */
0846         if (mac_idx >= (RATE_9M_IDX - IL_FIRST_OFDM_RATE))
0847             mac_idx++;
0848         /*
0849          * mac80211 HT idx is always zero-idxed; we need to move
0850          * HT OFDM rates after CCK rates in 2.4 GHz band
0851          */
0852         if (il->band == NL80211_BAND_2GHZ)
0853             mac_idx += IL_FIRST_OFDM_RATE;
0854     }
0855     /* Here we actually compare this rate to the latest LQ command */
0856     if (mac_idx < 0 ||
0857         tbl_type.is_SGI != !!(mac_flags & IEEE80211_TX_RC_SHORT_GI) ||
0858         tbl_type.is_ht40 != !!(mac_flags & IEEE80211_TX_RC_40_MHZ_WIDTH) ||
0859         tbl_type.is_dup != !!(mac_flags & IEEE80211_TX_RC_DUP_DATA) ||
0860         tbl_type.ant_type != info->status.antenna ||
0861         !!(tx_rate & RATE_MCS_HT_MSK) != !!(mac_flags & IEEE80211_TX_RC_MCS)
0862         || !!(tx_rate & RATE_MCS_GF_MSK) !=
0863         !!(mac_flags & IEEE80211_TX_RC_GREEN_FIELD) || rs_idx != mac_idx) {
0864         D_RATE("initial rate %d does not match %d (0x%x)\n", mac_idx,
0865                rs_idx, tx_rate);
0866         /*
0867          * Since rates mis-match, the last LQ command may have failed.
0868          * After IL_MISSED_RATE_MAX mis-matches, resync the uCode with
0869          * ... driver.
0870          */
0871         lq_sta->missed_rate_counter++;
0872         if (lq_sta->missed_rate_counter > IL_MISSED_RATE_MAX) {
0873             lq_sta->missed_rate_counter = 0;
0874             il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false);
0875         }
0876         /* Regardless, ignore this status info for outdated rate */
0877         return;
0878     } else
0879         /* Rate did match, so reset the missed_rate_counter */
0880         lq_sta->missed_rate_counter = 0;
0881 
0882     /* Figure out if rate scale algorithm is in active or search table */
0883     if (il4965_table_type_matches
0884         (&tbl_type, &(lq_sta->lq_info[lq_sta->active_tbl]))) {
0885         curr_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
0886         other_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
0887     } else
0888         if (il4965_table_type_matches
0889         (&tbl_type, &lq_sta->lq_info[1 - lq_sta->active_tbl])) {
0890         curr_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
0891         other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
0892     } else {
0893         D_RATE("Neither active nor search matches tx rate\n");
0894         tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
0895         D_RATE("active- lq:%x, ant:%x, SGI:%d\n", tmp_tbl->lq_type,
0896                tmp_tbl->ant_type, tmp_tbl->is_SGI);
0897         tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
0898         D_RATE("search- lq:%x, ant:%x, SGI:%d\n", tmp_tbl->lq_type,
0899                tmp_tbl->ant_type, tmp_tbl->is_SGI);
0900         D_RATE("actual- lq:%x, ant:%x, SGI:%d\n", tbl_type.lq_type,
0901                tbl_type.ant_type, tbl_type.is_SGI);
0902         /*
0903          * no matching table found, let's by-pass the data collection
0904          * and continue to perform rate scale to find the rate table
0905          */
0906         il4965_rs_stay_in_table(lq_sta, true);
0907         goto done;
0908     }
0909 
0910     /*
0911      * Updating the frame history depends on whether packets were
0912      * aggregated.
0913      *
0914      * For aggregation, all packets were transmitted at the same rate, the
0915      * first idx into rate scale table.
0916      */
0917     if (info->flags & IEEE80211_TX_STAT_AMPDU) {
0918         tx_rate = le32_to_cpu(table->rs_table[0].rate_n_flags);
0919         il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band, &tbl_type,
0920                         &rs_idx);
0921         il4965_rs_collect_tx_data(curr_tbl, rs_idx,
0922                       info->status.ampdu_len,
0923                       info->status.ampdu_ack_len);
0924 
0925         /* Update success/fail counts if not searching for new mode */
0926         if (lq_sta->stay_in_tbl) {
0927             lq_sta->total_success += info->status.ampdu_ack_len;
0928             lq_sta->total_failed +=
0929                 (info->status.ampdu_len -
0930                  info->status.ampdu_ack_len);
0931         }
0932     } else {
0933         /*
0934          * For legacy, update frame history with for each Tx retry.
0935          */
0936         retries = info->status.rates[0].count - 1;
0937         /* HW doesn't send more than 15 retries */
0938         retries = min(retries, 15);
0939 
0940         /* The last transmission may have been successful */
0941         legacy_success = !!(info->flags & IEEE80211_TX_STAT_ACK);
0942         /* Collect data for each rate used during failed TX attempts */
0943         for (i = 0; i <= retries; ++i) {
0944             tx_rate = le32_to_cpu(table->rs_table[i].rate_n_flags);
0945             il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band,
0946                             &tbl_type, &rs_idx);
0947             /*
0948              * Only collect stats if retried rate is in the same RS
0949              * table as active/search.
0950              */
0951             if (il4965_table_type_matches(&tbl_type, curr_tbl))
0952                 tmp_tbl = curr_tbl;
0953             else if (il4965_table_type_matches
0954                  (&tbl_type, other_tbl))
0955                 tmp_tbl = other_tbl;
0956             else
0957                 continue;
0958             il4965_rs_collect_tx_data(tmp_tbl, rs_idx, 1,
0959                           i <
0960                           retries ? 0 : legacy_success);
0961         }
0962 
0963         /* Update success/fail counts if not searching for new mode */
0964         if (lq_sta->stay_in_tbl) {
0965             lq_sta->total_success += legacy_success;
0966             lq_sta->total_failed += retries + (1 - legacy_success);
0967         }
0968     }
0969     /* The last TX rate is cached in lq_sta; it's set in if/else above */
0970     lq_sta->last_rate_n_flags = tx_rate;
0971 done:
0972     /* See if there's a better rate or modulation mode to try. */
0973     if (sta->deflink.supp_rates[sband->band])
0974         il4965_rs_rate_scale_perform(il, skb, sta, lq_sta);
0975 }
0976 
0977 /*
0978  * Begin a period of staying with a selected modulation mode.
0979  * Set "stay_in_tbl" flag to prevent any mode switches.
0980  * Set frame tx success limits according to legacy vs. high-throughput,
0981  * and reset overall (spanning all rates) tx success history stats.
0982  * These control how long we stay using same modulation mode before
0983  * searching for a new mode.
0984  */
0985 static void
0986 il4965_rs_set_stay_in_table(struct il_priv *il, u8 is_legacy,
0987                 struct il_lq_sta *lq_sta)
0988 {
0989     D_RATE("we are staying in the same table\n");
0990     lq_sta->stay_in_tbl = 1;    /* only place this gets set */
0991     if (is_legacy) {
0992         lq_sta->table_count_limit = IL_LEGACY_TBL_COUNT;
0993         lq_sta->max_failure_limit = IL_LEGACY_FAILURE_LIMIT;
0994         lq_sta->max_success_limit = IL_LEGACY_SUCCESS_LIMIT;
0995     } else {
0996         lq_sta->table_count_limit = IL_NONE_LEGACY_TBL_COUNT;
0997         lq_sta->max_failure_limit = IL_NONE_LEGACY_FAILURE_LIMIT;
0998         lq_sta->max_success_limit = IL_NONE_LEGACY_SUCCESS_LIMIT;
0999     }
1000     lq_sta->table_count = 0;
1001     lq_sta->total_failed = 0;
1002     lq_sta->total_success = 0;
1003     lq_sta->flush_timer = jiffies;
1004     lq_sta->action_counter = 0;
1005 }
1006 
1007 /*
1008  * Find correct throughput table for given mode of modulation
1009  */
1010 static void
1011 il4965_rs_set_expected_tpt_table(struct il_lq_sta *lq_sta,
1012                  struct il_scale_tbl_info *tbl)
1013 {
1014     /* Used to choose among HT tables */
1015     s32(*ht_tbl_pointer)[RATE_COUNT];
1016 
1017     /* Check for invalid LQ type */
1018     if (WARN_ON_ONCE(!is_legacy(tbl->lq_type) && !is_Ht(tbl->lq_type))) {
1019         tbl->expected_tpt = expected_tpt_legacy;
1020         return;
1021     }
1022 
1023     /* Legacy rates have only one table */
1024     if (is_legacy(tbl->lq_type)) {
1025         tbl->expected_tpt = expected_tpt_legacy;
1026         return;
1027     }
1028 
1029     /* Choose among many HT tables depending on number of streams
1030      * (SISO/MIMO2), channel width (20/40), SGI, and aggregation
1031      * status */
1032     if (is_siso(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup))
1033         ht_tbl_pointer = expected_tpt_siso20MHz;
1034     else if (is_siso(tbl->lq_type))
1035         ht_tbl_pointer = expected_tpt_siso40MHz;
1036     else if (is_mimo2(tbl->lq_type) && (!tbl->is_ht40 || lq_sta->is_dup))
1037         ht_tbl_pointer = expected_tpt_mimo2_20MHz;
1038     else            /* if (is_mimo2(tbl->lq_type)) <-- must be true */
1039         ht_tbl_pointer = expected_tpt_mimo2_40MHz;
1040 
1041     if (!tbl->is_SGI && !lq_sta->is_agg)    /* Normal */
1042         tbl->expected_tpt = ht_tbl_pointer[0];
1043     else if (tbl->is_SGI && !lq_sta->is_agg)    /* SGI */
1044         tbl->expected_tpt = ht_tbl_pointer[1];
1045     else if (!tbl->is_SGI && lq_sta->is_agg)    /* AGG */
1046         tbl->expected_tpt = ht_tbl_pointer[2];
1047     else            /* AGG+SGI */
1048         tbl->expected_tpt = ht_tbl_pointer[3];
1049 }
1050 
1051 /*
1052  * Find starting rate for new "search" high-throughput mode of modulation.
1053  * Goal is to find lowest expected rate (under perfect conditions) that is
1054  * above the current measured throughput of "active" mode, to give new mode
1055  * a fair chance to prove itself without too many challenges.
1056  *
1057  * This gets called when transitioning to more aggressive modulation
1058  * (i.e. legacy to SISO or MIMO, or SISO to MIMO), as well as less aggressive
1059  * (i.e. MIMO to SISO).  When moving to MIMO, bit rate will typically need
1060  * to decrease to match "active" throughput.  When moving from MIMO to SISO,
1061  * bit rate will typically need to increase, but not if performance was bad.
1062  */
1063 static s32
1064 il4965_rs_get_best_rate(struct il_priv *il, struct il_lq_sta *lq_sta,
1065             struct il_scale_tbl_info *tbl,  /* "search" */
1066             u16 rate_mask, s8 idx)
1067 {
1068     /* "active" values */
1069     struct il_scale_tbl_info *active_tbl =
1070         &(lq_sta->lq_info[lq_sta->active_tbl]);
1071     s32 active_sr = active_tbl->win[idx].success_ratio;
1072     s32 active_tpt = active_tbl->expected_tpt[idx];
1073 
1074     /* expected "search" throughput */
1075     s32 *tpt_tbl = tbl->expected_tpt;
1076 
1077     s32 new_rate, high, low, start_hi;
1078     u16 high_low;
1079     s8 rate = idx;
1080 
1081     new_rate = high = low = start_hi = RATE_INVALID;
1082 
1083     for (;;) {
1084         high_low =
1085             il4965_rs_get_adjacent_rate(il, rate, rate_mask,
1086                         tbl->lq_type);
1087 
1088         low = high_low & 0xff;
1089         high = (high_low >> 8) & 0xff;
1090 
1091         /*
1092          * Lower the "search" bit rate, to give new "search" mode
1093          * approximately the same throughput as "active" if:
1094          *
1095          * 1) "Active" mode has been working modestly well (but not
1096          *    great), and expected "search" throughput (under perfect
1097          *    conditions) at candidate rate is above the actual
1098          *    measured "active" throughput (but less than expected
1099          *    "active" throughput under perfect conditions).
1100          * OR
1101          * 2) "Active" mode has been working perfectly or very well
1102          *    and expected "search" throughput (under perfect
1103          *    conditions) at candidate rate is above expected
1104          *    "active" throughput (under perfect conditions).
1105          */
1106         if ((100 * tpt_tbl[rate] > lq_sta->last_tpt &&
1107              (active_sr > RATE_DECREASE_TH && active_sr <= RATE_HIGH_TH
1108               && tpt_tbl[rate] <= active_tpt)) ||
1109             (active_sr >= RATE_SCALE_SWITCH &&
1110              tpt_tbl[rate] > active_tpt)) {
1111 
1112             /* (2nd or later pass)
1113              * If we've already tried to raise the rate, and are
1114              * now trying to lower it, use the higher rate. */
1115             if (start_hi != RATE_INVALID) {
1116                 new_rate = start_hi;
1117                 break;
1118             }
1119 
1120             new_rate = rate;
1121 
1122             /* Loop again with lower rate */
1123             if (low != RATE_INVALID)
1124                 rate = low;
1125 
1126             /* Lower rate not available, use the original */
1127             else
1128                 break;
1129 
1130             /* Else try to raise the "search" rate to match "active" */
1131         } else {
1132             /* (2nd or later pass)
1133              * If we've already tried to lower the rate, and are
1134              * now trying to raise it, use the lower rate. */
1135             if (new_rate != RATE_INVALID)
1136                 break;
1137 
1138             /* Loop again with higher rate */
1139             else if (high != RATE_INVALID) {
1140                 start_hi = high;
1141                 rate = high;
1142 
1143                 /* Higher rate not available, use the original */
1144             } else {
1145                 new_rate = rate;
1146                 break;
1147             }
1148         }
1149     }
1150 
1151     return new_rate;
1152 }
1153 
1154 /*
1155  * Set up search table for MIMO2
1156  */
1157 static int
1158 il4965_rs_switch_to_mimo2(struct il_priv *il, struct il_lq_sta *lq_sta,
1159               struct ieee80211_conf *conf,
1160               struct ieee80211_sta *sta,
1161               struct il_scale_tbl_info *tbl, int idx)
1162 {
1163     u16 rate_mask;
1164     s32 rate;
1165     s8 is_green = lq_sta->is_green;
1166 
1167     if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
1168         return -1;
1169 
1170     if (sta->smps_mode == IEEE80211_SMPS_STATIC)
1171         return -1;
1172 
1173     /* Need both Tx chains/antennas to support MIMO */
1174     if (il->hw_params.tx_chains_num < 2)
1175         return -1;
1176 
1177     D_RATE("LQ: try to switch to MIMO2\n");
1178 
1179     tbl->lq_type = LQ_MIMO2;
1180     tbl->is_dup = lq_sta->is_dup;
1181     tbl->action = 0;
1182     tbl->max_search = IL_MAX_SEARCH;
1183     rate_mask = lq_sta->active_mimo2_rate;
1184 
1185     if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap))
1186         tbl->is_ht40 = 1;
1187     else
1188         tbl->is_ht40 = 0;
1189 
1190     il4965_rs_set_expected_tpt_table(lq_sta, tbl);
1191 
1192     rate = il4965_rs_get_best_rate(il, lq_sta, tbl, rate_mask, idx);
1193 
1194     D_RATE("LQ: MIMO2 best rate %d mask %X\n", rate, rate_mask);
1195     if (rate == RATE_INVALID || !((1 << rate) & rate_mask)) {
1196         D_RATE("Can't switch with idx %d rate mask %x\n", rate,
1197                rate_mask);
1198         return -1;
1199     }
1200     tbl->current_rate =
1201         il4965_rate_n_flags_from_tbl(il, tbl, rate, is_green);
1202 
1203     D_RATE("LQ: Switch to new mcs %X idx is green %X\n", tbl->current_rate,
1204            is_green);
1205     return 0;
1206 }
1207 
1208 /*
1209  * Set up search table for SISO
1210  */
1211 static int
1212 il4965_rs_switch_to_siso(struct il_priv *il, struct il_lq_sta *lq_sta,
1213              struct ieee80211_conf *conf, struct ieee80211_sta *sta,
1214              struct il_scale_tbl_info *tbl, int idx)
1215 {
1216     u16 rate_mask;
1217     u8 is_green = lq_sta->is_green;
1218     s32 rate;
1219 
1220     if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
1221         return -1;
1222 
1223     D_RATE("LQ: try to switch to SISO\n");
1224 
1225     tbl->is_dup = lq_sta->is_dup;
1226     tbl->lq_type = LQ_SISO;
1227     tbl->action = 0;
1228     tbl->max_search = IL_MAX_SEARCH;
1229     rate_mask = lq_sta->active_siso_rate;
1230 
1231     if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap))
1232         tbl->is_ht40 = 1;
1233     else
1234         tbl->is_ht40 = 0;
1235 
1236     if (is_green)
1237         tbl->is_SGI = 0;    /*11n spec: no SGI in SISO+Greenfield */
1238 
1239     il4965_rs_set_expected_tpt_table(lq_sta, tbl);
1240     rate = il4965_rs_get_best_rate(il, lq_sta, tbl, rate_mask, idx);
1241 
1242     D_RATE("LQ: get best rate %d mask %X\n", rate, rate_mask);
1243     if (rate == RATE_INVALID || !((1 << rate) & rate_mask)) {
1244         D_RATE("can not switch with idx %d rate mask %x\n", rate,
1245                rate_mask);
1246         return -1;
1247     }
1248     tbl->current_rate =
1249         il4965_rate_n_flags_from_tbl(il, tbl, rate, is_green);
1250     D_RATE("LQ: Switch to new mcs %X idx is green %X\n", tbl->current_rate,
1251            is_green);
1252     return 0;
1253 }
1254 
1255 /*
1256  * Try to switch to new modulation mode from legacy
1257  */
1258 static int
1259 il4965_rs_move_legacy_other(struct il_priv *il, struct il_lq_sta *lq_sta,
1260                 struct ieee80211_conf *conf,
1261                 struct ieee80211_sta *sta, int idx)
1262 {
1263     struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1264     struct il_scale_tbl_info *search_tbl =
1265         &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
1266     struct il_rate_scale_data *win = &(tbl->win[idx]);
1267     u32 sz =
1268         (sizeof(struct il_scale_tbl_info) -
1269          (sizeof(struct il_rate_scale_data) * RATE_COUNT));
1270     u8 start_action;
1271     u8 valid_tx_ant = il->hw_params.valid_tx_ant;
1272     u8 tx_chains_num = il->hw_params.tx_chains_num;
1273     int ret = 0;
1274     u8 update_search_tbl_counter = 0;
1275 
1276     tbl->action = IL_LEGACY_SWITCH_SISO;
1277 
1278     start_action = tbl->action;
1279     for (;;) {
1280         lq_sta->action_counter++;
1281         switch (tbl->action) {
1282         case IL_LEGACY_SWITCH_ANTENNA1:
1283         case IL_LEGACY_SWITCH_ANTENNA2:
1284             D_RATE("LQ: Legacy toggle Antenna\n");
1285 
1286             if ((tbl->action == IL_LEGACY_SWITCH_ANTENNA1 &&
1287                  tx_chains_num <= 1) ||
1288                 (tbl->action == IL_LEGACY_SWITCH_ANTENNA2 &&
1289                  tx_chains_num <= 2))
1290                 break;
1291 
1292             /* Don't change antenna if success has been great */
1293             if (win->success_ratio >= IL_RS_GOOD_RATIO)
1294                 break;
1295 
1296             /* Set up search table to try other antenna */
1297             memcpy(search_tbl, tbl, sz);
1298 
1299             if (il4965_rs_toggle_antenna
1300                 (valid_tx_ant, &search_tbl->current_rate,
1301                  search_tbl)) {
1302                 update_search_tbl_counter = 1;
1303                 il4965_rs_set_expected_tpt_table(lq_sta,
1304                                  search_tbl);
1305                 goto out;
1306             }
1307             break;
1308         case IL_LEGACY_SWITCH_SISO:
1309             D_RATE("LQ: Legacy switch to SISO\n");
1310 
1311             /* Set up search table to try SISO */
1312             memcpy(search_tbl, tbl, sz);
1313             search_tbl->is_SGI = 0;
1314             ret =
1315                 il4965_rs_switch_to_siso(il, lq_sta, conf, sta,
1316                              search_tbl, idx);
1317             if (!ret) {
1318                 lq_sta->action_counter = 0;
1319                 goto out;
1320             }
1321 
1322             break;
1323         case IL_LEGACY_SWITCH_MIMO2_AB:
1324         case IL_LEGACY_SWITCH_MIMO2_AC:
1325         case IL_LEGACY_SWITCH_MIMO2_BC:
1326             D_RATE("LQ: Legacy switch to MIMO2\n");
1327 
1328             /* Set up search table to try MIMO */
1329             memcpy(search_tbl, tbl, sz);
1330             search_tbl->is_SGI = 0;
1331 
1332             if (tbl->action == IL_LEGACY_SWITCH_MIMO2_AB)
1333                 search_tbl->ant_type = ANT_AB;
1334             else if (tbl->action == IL_LEGACY_SWITCH_MIMO2_AC)
1335                 search_tbl->ant_type = ANT_AC;
1336             else
1337                 search_tbl->ant_type = ANT_BC;
1338 
1339             if (!il4965_rs_is_valid_ant
1340                 (valid_tx_ant, search_tbl->ant_type))
1341                 break;
1342 
1343             ret =
1344                 il4965_rs_switch_to_mimo2(il, lq_sta, conf, sta,
1345                               search_tbl, idx);
1346             if (!ret) {
1347                 lq_sta->action_counter = 0;
1348                 goto out;
1349             }
1350             break;
1351         }
1352         tbl->action++;
1353         if (tbl->action > IL_LEGACY_SWITCH_MIMO2_BC)
1354             tbl->action = IL_LEGACY_SWITCH_ANTENNA1;
1355 
1356         if (tbl->action == start_action)
1357             break;
1358 
1359     }
1360     search_tbl->lq_type = LQ_NONE;
1361     return 0;
1362 
1363 out:
1364     lq_sta->search_better_tbl = 1;
1365     tbl->action++;
1366     if (tbl->action > IL_LEGACY_SWITCH_MIMO2_BC)
1367         tbl->action = IL_LEGACY_SWITCH_ANTENNA1;
1368     if (update_search_tbl_counter)
1369         search_tbl->action = tbl->action;
1370     return 0;
1371 
1372 }
1373 
1374 /*
1375  * Try to switch to new modulation mode from SISO
1376  */
1377 static int
1378 il4965_rs_move_siso_to_other(struct il_priv *il, struct il_lq_sta *lq_sta,
1379                  struct ieee80211_conf *conf,
1380                  struct ieee80211_sta *sta, int idx)
1381 {
1382     u8 is_green = lq_sta->is_green;
1383     struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1384     struct il_scale_tbl_info *search_tbl =
1385         &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
1386     struct il_rate_scale_data *win = &(tbl->win[idx]);
1387     struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1388     u32 sz =
1389         (sizeof(struct il_scale_tbl_info) -
1390          (sizeof(struct il_rate_scale_data) * RATE_COUNT));
1391     u8 start_action;
1392     u8 valid_tx_ant = il->hw_params.valid_tx_ant;
1393     u8 tx_chains_num = il->hw_params.tx_chains_num;
1394     u8 update_search_tbl_counter = 0;
1395     int ret;
1396 
1397     start_action = tbl->action;
1398 
1399     for (;;) {
1400         lq_sta->action_counter++;
1401         switch (tbl->action) {
1402         case IL_SISO_SWITCH_ANTENNA1:
1403         case IL_SISO_SWITCH_ANTENNA2:
1404             D_RATE("LQ: SISO toggle Antenna\n");
1405             if ((tbl->action == IL_SISO_SWITCH_ANTENNA1 &&
1406                  tx_chains_num <= 1) ||
1407                 (tbl->action == IL_SISO_SWITCH_ANTENNA2 &&
1408                  tx_chains_num <= 2))
1409                 break;
1410 
1411             if (win->success_ratio >= IL_RS_GOOD_RATIO)
1412                 break;
1413 
1414             memcpy(search_tbl, tbl, sz);
1415             if (il4965_rs_toggle_antenna
1416                 (valid_tx_ant, &search_tbl->current_rate,
1417                  search_tbl)) {
1418                 update_search_tbl_counter = 1;
1419                 goto out;
1420             }
1421             break;
1422         case IL_SISO_SWITCH_MIMO2_AB:
1423         case IL_SISO_SWITCH_MIMO2_AC:
1424         case IL_SISO_SWITCH_MIMO2_BC:
1425             D_RATE("LQ: SISO switch to MIMO2\n");
1426             memcpy(search_tbl, tbl, sz);
1427             search_tbl->is_SGI = 0;
1428 
1429             if (tbl->action == IL_SISO_SWITCH_MIMO2_AB)
1430                 search_tbl->ant_type = ANT_AB;
1431             else if (tbl->action == IL_SISO_SWITCH_MIMO2_AC)
1432                 search_tbl->ant_type = ANT_AC;
1433             else
1434                 search_tbl->ant_type = ANT_BC;
1435 
1436             if (!il4965_rs_is_valid_ant
1437                 (valid_tx_ant, search_tbl->ant_type))
1438                 break;
1439 
1440             ret =
1441                 il4965_rs_switch_to_mimo2(il, lq_sta, conf, sta,
1442                               search_tbl, idx);
1443             if (!ret)
1444                 goto out;
1445             break;
1446         case IL_SISO_SWITCH_GI:
1447             if (!tbl->is_ht40 &&
1448                 !(ht_cap->cap & IEEE80211_HT_CAP_SGI_20))
1449                 break;
1450             if (tbl->is_ht40 &&
1451                 !(ht_cap->cap & IEEE80211_HT_CAP_SGI_40))
1452                 break;
1453 
1454             D_RATE("LQ: SISO toggle SGI/NGI\n");
1455 
1456             memcpy(search_tbl, tbl, sz);
1457             if (is_green) {
1458                 if (!tbl->is_SGI)
1459                     break;
1460                 else
1461                     IL_ERR("SGI was set in GF+SISO\n");
1462             }
1463             search_tbl->is_SGI = !tbl->is_SGI;
1464             il4965_rs_set_expected_tpt_table(lq_sta, search_tbl);
1465             if (tbl->is_SGI) {
1466                 s32 tpt = lq_sta->last_tpt / 100;
1467                 if (tpt >= search_tbl->expected_tpt[idx])
1468                     break;
1469             }
1470             search_tbl->current_rate =
1471                 il4965_rate_n_flags_from_tbl(il, search_tbl, idx,
1472                              is_green);
1473             update_search_tbl_counter = 1;
1474             goto out;
1475         }
1476         tbl->action++;
1477         if (tbl->action > IL_SISO_SWITCH_GI)
1478             tbl->action = IL_SISO_SWITCH_ANTENNA1;
1479 
1480         if (tbl->action == start_action)
1481             break;
1482     }
1483     search_tbl->lq_type = LQ_NONE;
1484     return 0;
1485 
1486 out:
1487     lq_sta->search_better_tbl = 1;
1488     tbl->action++;
1489     if (tbl->action > IL_SISO_SWITCH_GI)
1490         tbl->action = IL_SISO_SWITCH_ANTENNA1;
1491     if (update_search_tbl_counter)
1492         search_tbl->action = tbl->action;
1493 
1494     return 0;
1495 }
1496 
1497 /*
1498  * Try to switch to new modulation mode from MIMO2
1499  */
1500 static int
1501 il4965_rs_move_mimo2_to_other(struct il_priv *il, struct il_lq_sta *lq_sta,
1502                   struct ieee80211_conf *conf,
1503                   struct ieee80211_sta *sta, int idx)
1504 {
1505     s8 is_green = lq_sta->is_green;
1506     struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1507     struct il_scale_tbl_info *search_tbl =
1508         &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
1509     struct il_rate_scale_data *win = &(tbl->win[idx]);
1510     struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1511     u32 sz =
1512         (sizeof(struct il_scale_tbl_info) -
1513          (sizeof(struct il_rate_scale_data) * RATE_COUNT));
1514     u8 start_action;
1515     u8 valid_tx_ant = il->hw_params.valid_tx_ant;
1516     u8 tx_chains_num = il->hw_params.tx_chains_num;
1517     u8 update_search_tbl_counter = 0;
1518     int ret;
1519 
1520     start_action = tbl->action;
1521     for (;;) {
1522         lq_sta->action_counter++;
1523         switch (tbl->action) {
1524         case IL_MIMO2_SWITCH_ANTENNA1:
1525         case IL_MIMO2_SWITCH_ANTENNA2:
1526             D_RATE("LQ: MIMO2 toggle Antennas\n");
1527 
1528             if (tx_chains_num <= 2)
1529                 break;
1530 
1531             if (win->success_ratio >= IL_RS_GOOD_RATIO)
1532                 break;
1533 
1534             memcpy(search_tbl, tbl, sz);
1535             if (il4965_rs_toggle_antenna
1536                 (valid_tx_ant, &search_tbl->current_rate,
1537                  search_tbl)) {
1538                 update_search_tbl_counter = 1;
1539                 goto out;
1540             }
1541             break;
1542         case IL_MIMO2_SWITCH_SISO_A:
1543         case IL_MIMO2_SWITCH_SISO_B:
1544         case IL_MIMO2_SWITCH_SISO_C:
1545             D_RATE("LQ: MIMO2 switch to SISO\n");
1546 
1547             /* Set up new search table for SISO */
1548             memcpy(search_tbl, tbl, sz);
1549 
1550             if (tbl->action == IL_MIMO2_SWITCH_SISO_A)
1551                 search_tbl->ant_type = ANT_A;
1552             else if (tbl->action == IL_MIMO2_SWITCH_SISO_B)
1553                 search_tbl->ant_type = ANT_B;
1554             else
1555                 search_tbl->ant_type = ANT_C;
1556 
1557             if (!il4965_rs_is_valid_ant
1558                 (valid_tx_ant, search_tbl->ant_type))
1559                 break;
1560 
1561             ret =
1562                 il4965_rs_switch_to_siso(il, lq_sta, conf, sta,
1563                              search_tbl, idx);
1564             if (!ret)
1565                 goto out;
1566 
1567             break;
1568 
1569         case IL_MIMO2_SWITCH_GI:
1570             if (!tbl->is_ht40 &&
1571                 !(ht_cap->cap & IEEE80211_HT_CAP_SGI_20))
1572                 break;
1573             if (tbl->is_ht40 &&
1574                 !(ht_cap->cap & IEEE80211_HT_CAP_SGI_40))
1575                 break;
1576 
1577             D_RATE("LQ: MIMO2 toggle SGI/NGI\n");
1578 
1579             /* Set up new search table for MIMO2 */
1580             memcpy(search_tbl, tbl, sz);
1581             search_tbl->is_SGI = !tbl->is_SGI;
1582             il4965_rs_set_expected_tpt_table(lq_sta, search_tbl);
1583             /*
1584              * If active table already uses the fastest possible
1585              * modulation (dual stream with short guard interval),
1586              * and it's working well, there's no need to look
1587              * for a better type of modulation!
1588              */
1589             if (tbl->is_SGI) {
1590                 s32 tpt = lq_sta->last_tpt / 100;
1591                 if (tpt >= search_tbl->expected_tpt[idx])
1592                     break;
1593             }
1594             search_tbl->current_rate =
1595                 il4965_rate_n_flags_from_tbl(il, search_tbl, idx,
1596                              is_green);
1597             update_search_tbl_counter = 1;
1598             goto out;
1599 
1600         }
1601         tbl->action++;
1602         if (tbl->action > IL_MIMO2_SWITCH_GI)
1603             tbl->action = IL_MIMO2_SWITCH_ANTENNA1;
1604 
1605         if (tbl->action == start_action)
1606             break;
1607     }
1608     search_tbl->lq_type = LQ_NONE;
1609     return 0;
1610 out:
1611     lq_sta->search_better_tbl = 1;
1612     tbl->action++;
1613     if (tbl->action > IL_MIMO2_SWITCH_GI)
1614         tbl->action = IL_MIMO2_SWITCH_ANTENNA1;
1615     if (update_search_tbl_counter)
1616         search_tbl->action = tbl->action;
1617 
1618     return 0;
1619 
1620 }
1621 
1622 /*
1623  * Check whether we should continue using same modulation mode, or
1624  * begin search for a new mode, based on:
1625  * 1) # tx successes or failures while using this mode
1626  * 2) # times calling this function
1627  * 3) elapsed time in this mode (not used, for now)
1628  */
1629 static void
1630 il4965_rs_stay_in_table(struct il_lq_sta *lq_sta, bool force_search)
1631 {
1632     struct il_scale_tbl_info *tbl;
1633     int i;
1634     int active_tbl;
1635     int flush_interval_passed = 0;
1636     struct il_priv *il;
1637 
1638     il = lq_sta->drv;
1639     active_tbl = lq_sta->active_tbl;
1640 
1641     tbl = &(lq_sta->lq_info[active_tbl]);
1642 
1643     /* If we've been disallowing search, see if we should now allow it */
1644     if (lq_sta->stay_in_tbl) {
1645 
1646         /* Elapsed time using current modulation mode */
1647         if (lq_sta->flush_timer)
1648             flush_interval_passed =
1649                 time_after(jiffies,
1650                        (unsigned long)(lq_sta->flush_timer +
1651                                RATE_SCALE_FLUSH_INTVL));
1652 
1653         /*
1654          * Check if we should allow search for new modulation mode.
1655          * If many frames have failed or succeeded, or we've used
1656          * this same modulation for a long time, allow search, and
1657          * reset history stats that keep track of whether we should
1658          * allow a new search.  Also (below) reset all bitmaps and
1659          * stats in active history.
1660          */
1661         if (force_search ||
1662             lq_sta->total_failed > lq_sta->max_failure_limit ||
1663             lq_sta->total_success > lq_sta->max_success_limit ||
1664             (!lq_sta->search_better_tbl && lq_sta->flush_timer &&
1665              flush_interval_passed)) {
1666             D_RATE("LQ: stay is expired %d %d %d\n",
1667                    lq_sta->total_failed, lq_sta->total_success,
1668                    flush_interval_passed);
1669 
1670             /* Allow search for new mode */
1671             lq_sta->stay_in_tbl = 0;    /* only place reset */
1672             lq_sta->total_failed = 0;
1673             lq_sta->total_success = 0;
1674             lq_sta->flush_timer = 0;
1675 
1676             /*
1677              * Else if we've used this modulation mode enough repetitions
1678              * (regardless of elapsed time or success/failure), reset
1679              * history bitmaps and rate-specific stats for all rates in
1680              * active table.
1681              */
1682         } else {
1683             lq_sta->table_count++;
1684             if (lq_sta->table_count >= lq_sta->table_count_limit) {
1685                 lq_sta->table_count = 0;
1686 
1687                 D_RATE("LQ: stay in table clear win\n");
1688                 for (i = 0; i < RATE_COUNT; i++)
1689                     il4965_rs_rate_scale_clear_win(&
1690                                        (tbl->
1691                                     win
1692                                     [i]));
1693             }
1694         }
1695 
1696         /* If transitioning to allow "search", reset all history
1697          * bitmaps and stats in active table (this will become the new
1698          * "search" table). */
1699         if (!lq_sta->stay_in_tbl) {
1700             for (i = 0; i < RATE_COUNT; i++)
1701                 il4965_rs_rate_scale_clear_win(&(tbl->win[i]));
1702         }
1703     }
1704 }
1705 
1706 /*
1707  * setup rate table in uCode
1708  */
1709 static void
1710 il4965_rs_update_rate_tbl(struct il_priv *il, struct il_lq_sta *lq_sta,
1711               struct il_scale_tbl_info *tbl, int idx, u8 is_green)
1712 {
1713     u32 rate;
1714 
1715     /* Update uCode's rate table. */
1716     rate = il4965_rate_n_flags_from_tbl(il, tbl, idx, is_green);
1717     il4965_rs_fill_link_cmd(il, lq_sta, rate);
1718     il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false);
1719 }
1720 
1721 /*
1722  * Do rate scaling and search for new modulation mode.
1723  */
1724 static void
1725 il4965_rs_rate_scale_perform(struct il_priv *il, struct sk_buff *skb,
1726                  struct ieee80211_sta *sta,
1727                  struct il_lq_sta *lq_sta)
1728 {
1729     struct ieee80211_hw *hw = il->hw;
1730     struct ieee80211_conf *conf = &hw->conf;
1731     struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1732     struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1733     int low = RATE_INVALID;
1734     int high = RATE_INVALID;
1735     int idx;
1736     int i;
1737     struct il_rate_scale_data *win = NULL;
1738     int current_tpt = IL_INVALID_VALUE;
1739     int low_tpt = IL_INVALID_VALUE;
1740     int high_tpt = IL_INVALID_VALUE;
1741     u32 fail_count;
1742     s8 scale_action = 0;
1743     u16 rate_mask;
1744     u8 update_lq = 0;
1745     struct il_scale_tbl_info *tbl, *tbl1;
1746     u16 rate_scale_idx_msk = 0;
1747     u8 is_green = 0;
1748     u8 active_tbl = 0;
1749     u8 done_search = 0;
1750     u16 high_low;
1751     s32 sr;
1752     u8 tid;
1753     struct il_tid_data *tid_data;
1754 
1755     D_RATE("rate scale calculate new rate for skb\n");
1756 
1757     /* Send management frames and NO_ACK data using lowest rate. */
1758     /* TODO: this could probably be improved.. */
1759     if (!ieee80211_is_data(hdr->frame_control) ||
1760         (info->flags & IEEE80211_TX_CTL_NO_ACK))
1761         return;
1762 
1763     lq_sta->supp_rates = sta->deflink.supp_rates[lq_sta->band];
1764 
1765     tid = il4965_rs_tl_add_packet(lq_sta, hdr);
1766     if (tid != MAX_TID_COUNT && (lq_sta->tx_agg_tid_en & (1 << tid))) {
1767         tid_data = &il->stations[lq_sta->lq.sta_id].tid[tid];
1768         if (tid_data->agg.state == IL_AGG_OFF)
1769             lq_sta->is_agg = 0;
1770         else
1771             lq_sta->is_agg = 1;
1772     } else
1773         lq_sta->is_agg = 0;
1774 
1775     /*
1776      * Select rate-scale / modulation-mode table to work with in
1777      * the rest of this function:  "search" if searching for better
1778      * modulation mode, or "active" if doing rate scaling within a mode.
1779      */
1780     if (!lq_sta->search_better_tbl)
1781         active_tbl = lq_sta->active_tbl;
1782     else
1783         active_tbl = 1 - lq_sta->active_tbl;
1784 
1785     tbl = &(lq_sta->lq_info[active_tbl]);
1786     if (is_legacy(tbl->lq_type))
1787         lq_sta->is_green = 0;
1788     else
1789         lq_sta->is_green = il4965_rs_use_green(il, sta);
1790     is_green = lq_sta->is_green;
1791 
1792     /* current tx rate */
1793     idx = lq_sta->last_txrate_idx;
1794 
1795     D_RATE("Rate scale idx %d for type %d\n", idx, tbl->lq_type);
1796 
1797     /* rates available for this association, and for modulation mode */
1798     rate_mask = il4965_rs_get_supported_rates(lq_sta, hdr, tbl->lq_type);
1799 
1800     D_RATE("mask 0x%04X\n", rate_mask);
1801 
1802     /* mask with station rate restriction */
1803     if (is_legacy(tbl->lq_type)) {
1804         if (lq_sta->band == NL80211_BAND_5GHZ)
1805             /* supp_rates has no CCK bits in A mode */
1806             rate_scale_idx_msk =
1807                 (u16) (rate_mask &
1808                    (lq_sta->supp_rates << IL_FIRST_OFDM_RATE));
1809         else
1810             rate_scale_idx_msk =
1811                 (u16) (rate_mask & lq_sta->supp_rates);
1812 
1813     } else
1814         rate_scale_idx_msk = rate_mask;
1815 
1816     if (!rate_scale_idx_msk)
1817         rate_scale_idx_msk = rate_mask;
1818 
1819     if (!((1 << idx) & rate_scale_idx_msk)) {
1820         IL_ERR("Current Rate is not valid\n");
1821         if (lq_sta->search_better_tbl) {
1822             /* revert to active table if search table is not valid */
1823             tbl->lq_type = LQ_NONE;
1824             lq_sta->search_better_tbl = 0;
1825             tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1826             /* get "active" rate info */
1827             idx = il4965_hwrate_to_plcp_idx(tbl->current_rate);
1828             il4965_rs_update_rate_tbl(il, lq_sta, tbl, idx,
1829                               is_green);
1830         }
1831         return;
1832     }
1833 
1834     /* Get expected throughput table and history win for current rate */
1835     if (!tbl->expected_tpt) {
1836         IL_ERR("tbl->expected_tpt is NULL\n");
1837         return;
1838     }
1839 
1840     /* force user max rate if set by user */
1841     if (lq_sta->max_rate_idx != -1 && lq_sta->max_rate_idx < idx) {
1842         idx = lq_sta->max_rate_idx;
1843         update_lq = 1;
1844         win = &(tbl->win[idx]);
1845         goto lq_update;
1846     }
1847 
1848     win = &(tbl->win[idx]);
1849 
1850     /*
1851      * If there is not enough history to calculate actual average
1852      * throughput, keep analyzing results of more tx frames, without
1853      * changing rate or mode (bypass most of the rest of this function).
1854      * Set up new rate table in uCode only if old rate is not supported
1855      * in current association (use new rate found above).
1856      */
1857     fail_count = win->counter - win->success_counter;
1858     if (fail_count < RATE_MIN_FAILURE_TH &&
1859         win->success_counter < RATE_MIN_SUCCESS_TH) {
1860         D_RATE("LQ: still below TH. succ=%d total=%d " "for idx %d\n",
1861                win->success_counter, win->counter, idx);
1862 
1863         /* Can't calculate this yet; not enough history */
1864         win->average_tpt = IL_INVALID_VALUE;
1865 
1866         /* Should we stay with this modulation mode,
1867          * or search for a new one? */
1868         il4965_rs_stay_in_table(lq_sta, false);
1869 
1870         goto out;
1871     }
1872     /* Else we have enough samples; calculate estimate of
1873      * actual average throughput */
1874     if (win->average_tpt !=
1875         ((win->success_ratio * tbl->expected_tpt[idx] + 64) / 128)) {
1876         IL_ERR("expected_tpt should have been calculated by now\n");
1877         win->average_tpt =
1878             ((win->success_ratio * tbl->expected_tpt[idx] + 64) / 128);
1879     }
1880 
1881     /* If we are searching for better modulation mode, check success. */
1882     if (lq_sta->search_better_tbl) {
1883         /* If good success, continue using the "search" mode;
1884          * no need to send new link quality command, since we're
1885          * continuing to use the setup that we've been trying. */
1886         if (win->average_tpt > lq_sta->last_tpt) {
1887 
1888             D_RATE("LQ: SWITCHING TO NEW TBL "
1889                    "suc=%d cur-tpt=%d old-tpt=%d\n",
1890                    win->success_ratio, win->average_tpt,
1891                    lq_sta->last_tpt);
1892 
1893             if (!is_legacy(tbl->lq_type))
1894                 lq_sta->enable_counter = 1;
1895 
1896             /* Swap tables; "search" becomes "active" */
1897             lq_sta->active_tbl = active_tbl;
1898             current_tpt = win->average_tpt;
1899 
1900             /* Else poor success; go back to mode in "active" table */
1901         } else {
1902 
1903             D_RATE("LQ: GOING BACK TO THE OLD TBL "
1904                    "suc=%d cur-tpt=%d old-tpt=%d\n",
1905                    win->success_ratio, win->average_tpt,
1906                    lq_sta->last_tpt);
1907 
1908             /* Nullify "search" table */
1909             tbl->lq_type = LQ_NONE;
1910 
1911             /* Revert to "active" table */
1912             active_tbl = lq_sta->active_tbl;
1913             tbl = &(lq_sta->lq_info[active_tbl]);
1914 
1915             /* Revert to "active" rate and throughput info */
1916             idx = il4965_hwrate_to_plcp_idx(tbl->current_rate);
1917             current_tpt = lq_sta->last_tpt;
1918 
1919             /* Need to set up a new rate table in uCode */
1920             update_lq = 1;
1921         }
1922 
1923         /* Either way, we've made a decision; modulation mode
1924          * search is done, allow rate adjustment next time. */
1925         lq_sta->search_better_tbl = 0;
1926         done_search = 1;    /* Don't switch modes below! */
1927         goto lq_update;
1928     }
1929 
1930     /* (Else) not in search of better modulation mode, try for better
1931      * starting rate, while staying in this mode. */
1932     high_low =
1933         il4965_rs_get_adjacent_rate(il, idx, rate_scale_idx_msk,
1934                     tbl->lq_type);
1935     low = high_low & 0xff;
1936     high = (high_low >> 8) & 0xff;
1937 
1938     /* If user set max rate, dont allow higher than user constrain */
1939     if (lq_sta->max_rate_idx != -1 && lq_sta->max_rate_idx < high)
1940         high = RATE_INVALID;
1941 
1942     sr = win->success_ratio;
1943 
1944     /* Collect measured throughputs for current and adjacent rates */
1945     current_tpt = win->average_tpt;
1946     if (low != RATE_INVALID)
1947         low_tpt = tbl->win[low].average_tpt;
1948     if (high != RATE_INVALID)
1949         high_tpt = tbl->win[high].average_tpt;
1950 
1951     scale_action = 0;
1952 
1953     /* Too many failures, decrease rate */
1954     if (sr <= RATE_DECREASE_TH || current_tpt == 0) {
1955         D_RATE("decrease rate because of low success_ratio\n");
1956         scale_action = -1;
1957 
1958         /* No throughput measured yet for adjacent rates; try increase. */
1959     } else if (low_tpt == IL_INVALID_VALUE && high_tpt == IL_INVALID_VALUE) {
1960 
1961         if (high != RATE_INVALID && sr >= RATE_INCREASE_TH)
1962             scale_action = 1;
1963         else if (low != RATE_INVALID)
1964             scale_action = 0;
1965     }
1966 
1967     /* Both adjacent throughputs are measured, but neither one has better
1968      * throughput; we're using the best rate, don't change it! */
1969     else if (low_tpt != IL_INVALID_VALUE && high_tpt != IL_INVALID_VALUE &&
1970          low_tpt < current_tpt && high_tpt < current_tpt)
1971         scale_action = 0;
1972 
1973     /* At least one adjacent rate's throughput is measured,
1974      * and may have better performance. */
1975     else {
1976         /* Higher adjacent rate's throughput is measured */
1977         if (high_tpt != IL_INVALID_VALUE) {
1978             /* Higher rate has better throughput */
1979             if (high_tpt > current_tpt && sr >= RATE_INCREASE_TH)
1980                 scale_action = 1;
1981             else
1982                 scale_action = 0;
1983 
1984             /* Lower adjacent rate's throughput is measured */
1985         } else if (low_tpt != IL_INVALID_VALUE) {
1986             /* Lower rate has better throughput */
1987             if (low_tpt > current_tpt) {
1988                 D_RATE("decrease rate because of low tpt\n");
1989                 scale_action = -1;
1990             } else if (sr >= RATE_INCREASE_TH) {
1991                 scale_action = 1;
1992             }
1993         }
1994     }
1995 
1996     /* Sanity check; asked for decrease, but success rate or throughput
1997      * has been good at old rate.  Don't change it. */
1998     if (scale_action == -1 && low != RATE_INVALID &&
1999         (sr > RATE_HIGH_TH || current_tpt > 100 * tbl->expected_tpt[low]))
2000         scale_action = 0;
2001 
2002     switch (scale_action) {
2003     case -1:
2004         /* Decrease starting rate, update uCode's rate table */
2005         if (low != RATE_INVALID) {
2006             update_lq = 1;
2007             idx = low;
2008         }
2009 
2010         break;
2011     case 1:
2012         /* Increase starting rate, update uCode's rate table */
2013         if (high != RATE_INVALID) {
2014             update_lq = 1;
2015             idx = high;
2016         }
2017 
2018         break;
2019     case 0:
2020         /* No change */
2021     default:
2022         break;
2023     }
2024 
2025     D_RATE("choose rate scale idx %d action %d low %d " "high %d type %d\n",
2026            idx, scale_action, low, high, tbl->lq_type);
2027 
2028 lq_update:
2029     /* Replace uCode's rate table for the destination station. */
2030     if (update_lq)
2031         il4965_rs_update_rate_tbl(il, lq_sta, tbl, idx, is_green);
2032 
2033     /* Should we stay with this modulation mode,
2034      * or search for a new one? */
2035     il4965_rs_stay_in_table(lq_sta, false);
2036 
2037     /*
2038      * Search for new modulation mode if we're:
2039      * 1)  Not changing rates right now
2040      * 2)  Not just finishing up a search
2041      * 3)  Allowing a new search
2042      */
2043     if (!update_lq && !done_search && !lq_sta->stay_in_tbl && win->counter) {
2044         /* Save current throughput to compare with "search" throughput */
2045         lq_sta->last_tpt = current_tpt;
2046 
2047         /* Select a new "search" modulation mode to try.
2048          * If one is found, set up the new "search" table. */
2049         if (is_legacy(tbl->lq_type))
2050             il4965_rs_move_legacy_other(il, lq_sta, conf, sta, idx);
2051         else if (is_siso(tbl->lq_type))
2052             il4965_rs_move_siso_to_other(il, lq_sta, conf, sta,
2053                              idx);
2054         else        /* (is_mimo2(tbl->lq_type)) */
2055             il4965_rs_move_mimo2_to_other(il, lq_sta, conf, sta,
2056                               idx);
2057 
2058         /* If new "search" mode was selected, set up in uCode table */
2059         if (lq_sta->search_better_tbl) {
2060             /* Access the "search" table, clear its history. */
2061             tbl = &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
2062             for (i = 0; i < RATE_COUNT; i++)
2063                 il4965_rs_rate_scale_clear_win(&(tbl->win[i]));
2064 
2065             /* Use new "search" start rate */
2066             idx = il4965_hwrate_to_plcp_idx(tbl->current_rate);
2067 
2068             D_RATE("Switch current  mcs: %X idx: %d\n",
2069                    tbl->current_rate, idx);
2070             il4965_rs_fill_link_cmd(il, lq_sta, tbl->current_rate);
2071             il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false);
2072         } else
2073             done_search = 1;
2074     }
2075 
2076     if (done_search && !lq_sta->stay_in_tbl) {
2077         /* If the "active" (non-search) mode was legacy,
2078          * and we've tried switching antennas,
2079          * but we haven't been able to try HT modes (not available),
2080          * stay with best antenna legacy modulation for a while
2081          * before next round of mode comparisons. */
2082         tbl1 = &(lq_sta->lq_info[lq_sta->active_tbl]);
2083         if (is_legacy(tbl1->lq_type) && !conf_is_ht(conf) &&
2084             lq_sta->action_counter > tbl1->max_search) {
2085             D_RATE("LQ: STAY in legacy table\n");
2086             il4965_rs_set_stay_in_table(il, 1, lq_sta);
2087         }
2088 
2089         /* If we're in an HT mode, and all 3 mode switch actions
2090          * have been tried and compared, stay in this best modulation
2091          * mode for a while before next round of mode comparisons. */
2092         if (lq_sta->enable_counter &&
2093             lq_sta->action_counter >= tbl1->max_search) {
2094             if (lq_sta->last_tpt > IL_AGG_TPT_THREHOLD &&
2095                 (lq_sta->tx_agg_tid_en & (1 << tid)) &&
2096                 tid != MAX_TID_COUNT) {
2097                 tid_data =
2098                     &il->stations[lq_sta->lq.sta_id].tid[tid];
2099                 if (tid_data->agg.state == IL_AGG_OFF) {
2100                     D_RATE("try to aggregate tid %d\n",
2101                            tid);
2102                     il4965_rs_tl_turn_on_agg(il, tid,
2103                                  lq_sta, sta);
2104                 }
2105             }
2106             il4965_rs_set_stay_in_table(il, 0, lq_sta);
2107         }
2108     }
2109 
2110 out:
2111     tbl->current_rate =
2112         il4965_rate_n_flags_from_tbl(il, tbl, idx, is_green);
2113     i = idx;
2114     lq_sta->last_txrate_idx = i;
2115 }
2116 
2117 /*
2118  * il4965_rs_initialize_lq - Initialize a station's hardware rate table
2119  *
2120  * The uCode's station table contains a table of fallback rates
2121  * for automatic fallback during transmission.
2122  *
2123  * NOTE: This sets up a default set of values.  These will be replaced later
2124  *       if the driver's iwl-4965-rs rate scaling algorithm is used, instead of
2125  *       rc80211_simple.
2126  *
2127  * NOTE: Run C_ADD_STA command to set up station table entry, before
2128  *       calling this function (which runs C_TX_LINK_QUALITY_CMD,
2129  *       which requires station table entry to exist).
2130  */
2131 static void
2132 il4965_rs_initialize_lq(struct il_priv *il, struct ieee80211_conf *conf,
2133             struct ieee80211_sta *sta, struct il_lq_sta *lq_sta)
2134 {
2135     struct il_scale_tbl_info *tbl;
2136     int rate_idx;
2137     int i;
2138     u32 rate;
2139     u8 use_green;
2140     u8 active_tbl = 0;
2141     u8 valid_tx_ant;
2142 
2143     if (!sta || !lq_sta)
2144         return;
2145 
2146     use_green = il4965_rs_use_green(il, sta);
2147 
2148     i = lq_sta->last_txrate_idx;
2149 
2150     valid_tx_ant = il->hw_params.valid_tx_ant;
2151 
2152     if (!lq_sta->search_better_tbl)
2153         active_tbl = lq_sta->active_tbl;
2154     else
2155         active_tbl = 1 - lq_sta->active_tbl;
2156 
2157     tbl = &(lq_sta->lq_info[active_tbl]);
2158 
2159     if (i < 0 || i >= RATE_COUNT)
2160         i = 0;
2161 
2162     rate = il_rates[i].plcp;
2163     tbl->ant_type = il4965_first_antenna(valid_tx_ant);
2164     rate |= tbl->ant_type << RATE_MCS_ANT_POS;
2165 
2166     if (i >= IL_FIRST_CCK_RATE && i <= IL_LAST_CCK_RATE)
2167         rate |= RATE_MCS_CCK_MSK;
2168 
2169     il4965_rs_get_tbl_info_from_mcs(rate, il->band, tbl, &rate_idx);
2170     if (!il4965_rs_is_valid_ant(valid_tx_ant, tbl->ant_type))
2171         il4965_rs_toggle_antenna(valid_tx_ant, &rate, tbl);
2172 
2173     rate = il4965_rate_n_flags_from_tbl(il, tbl, rate_idx, use_green);
2174     tbl->current_rate = rate;
2175     il4965_rs_set_expected_tpt_table(lq_sta, tbl);
2176     il4965_rs_fill_link_cmd(NULL, lq_sta, rate);
2177     il->stations[lq_sta->lq.sta_id].lq = &lq_sta->lq;
2178     il_send_lq_cmd(il, &lq_sta->lq, CMD_SYNC, true);
2179 }
2180 
2181 static void
2182 il4965_rs_get_rate(void *il_r, struct ieee80211_sta *sta, void *il_sta,
2183            struct ieee80211_tx_rate_control *txrc)
2184 {
2185 
2186     struct sk_buff *skb = txrc->skb;
2187     struct ieee80211_supported_band *sband = txrc->sband;
2188     struct il_priv *il __maybe_unused = (struct il_priv *)il_r;
2189     struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2190     struct il_lq_sta *lq_sta = il_sta;
2191     int rate_idx;
2192 
2193     D_RATE("rate scale calculate new rate for skb\n");
2194 
2195     /* Get max rate if user set max rate */
2196     if (lq_sta) {
2197         lq_sta->max_rate_idx = fls(txrc->rate_idx_mask) - 1;
2198         if (sband->band == NL80211_BAND_5GHZ &&
2199             lq_sta->max_rate_idx != -1)
2200             lq_sta->max_rate_idx += IL_FIRST_OFDM_RATE;
2201         if (lq_sta->max_rate_idx < 0 ||
2202             lq_sta->max_rate_idx >= RATE_COUNT)
2203             lq_sta->max_rate_idx = -1;
2204     }
2205 
2206     /* Treat uninitialized rate scaling data same as non-existing. */
2207     if (lq_sta && !lq_sta->drv) {
2208         D_RATE("Rate scaling not initialized yet.\n");
2209         il_sta = NULL;
2210     }
2211 
2212     if (!lq_sta)
2213         return;
2214 
2215     rate_idx = lq_sta->last_txrate_idx;
2216 
2217     if (lq_sta->last_rate_n_flags & RATE_MCS_HT_MSK) {
2218         rate_idx -= IL_FIRST_OFDM_RATE;
2219         /* 6M and 9M shared same MCS idx */
2220         rate_idx = (rate_idx > 0) ? (rate_idx - 1) : 0;
2221         if (il4965_rs_extract_rate(lq_sta->last_rate_n_flags) >=
2222             RATE_MIMO2_6M_PLCP)
2223             rate_idx = rate_idx + MCS_IDX_PER_STREAM;
2224         info->control.rates[0].flags = IEEE80211_TX_RC_MCS;
2225         if (lq_sta->last_rate_n_flags & RATE_MCS_SGI_MSK)
2226             info->control.rates[0].flags |=
2227                 IEEE80211_TX_RC_SHORT_GI;
2228         if (lq_sta->last_rate_n_flags & RATE_MCS_DUP_MSK)
2229             info->control.rates[0].flags |=
2230                 IEEE80211_TX_RC_DUP_DATA;
2231         if (lq_sta->last_rate_n_flags & RATE_MCS_HT40_MSK)
2232             info->control.rates[0].flags |=
2233                 IEEE80211_TX_RC_40_MHZ_WIDTH;
2234         if (lq_sta->last_rate_n_flags & RATE_MCS_GF_MSK)
2235             info->control.rates[0].flags |=
2236                 IEEE80211_TX_RC_GREEN_FIELD;
2237     } else {
2238         /* Check for invalid rates */
2239         if (rate_idx < 0 || rate_idx >= RATE_COUNT_LEGACY ||
2240             (sband->band == NL80211_BAND_5GHZ &&
2241              rate_idx < IL_FIRST_OFDM_RATE))
2242             rate_idx = rate_lowest_index(sband, sta);
2243         /* On valid 5 GHz rate, adjust idx */
2244         else if (sband->band == NL80211_BAND_5GHZ)
2245             rate_idx -= IL_FIRST_OFDM_RATE;
2246         info->control.rates[0].flags = 0;
2247     }
2248     info->control.rates[0].idx = rate_idx;
2249     info->control.rates[0].count = 1;
2250 }
2251 
2252 static void *
2253 il4965_rs_alloc_sta(void *il_rate, struct ieee80211_sta *sta, gfp_t gfp)
2254 {
2255     struct il_station_priv *sta_priv =
2256         (struct il_station_priv *)sta->drv_priv;
2257     struct il_priv *il;
2258 
2259     il = (struct il_priv *)il_rate;
2260     D_RATE("create station rate scale win\n");
2261 
2262     return &sta_priv->lq_sta;
2263 }
2264 
2265 /*
2266  * Called after adding a new station to initialize rate scaling
2267  */
2268 void
2269 il4965_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
2270 {
2271     int i, j;
2272     struct ieee80211_hw *hw = il->hw;
2273     struct ieee80211_conf *conf = &il->hw->conf;
2274     struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
2275     struct il_station_priv *sta_priv;
2276     struct il_lq_sta *lq_sta;
2277     struct ieee80211_supported_band *sband;
2278 
2279     sta_priv = (struct il_station_priv *)sta->drv_priv;
2280     lq_sta = &sta_priv->lq_sta;
2281     sband = hw->wiphy->bands[conf->chandef.chan->band];
2282 
2283     lq_sta->lq.sta_id = sta_id;
2284 
2285     for (j = 0; j < LQ_SIZE; j++)
2286         for (i = 0; i < RATE_COUNT; i++)
2287             il4965_rs_rate_scale_clear_win(&lq_sta->lq_info[j].
2288                                win[i]);
2289 
2290     lq_sta->flush_timer = 0;
2291     lq_sta->supp_rates = sta->deflink.supp_rates[sband->band];
2292     for (j = 0; j < LQ_SIZE; j++)
2293         for (i = 0; i < RATE_COUNT; i++)
2294             il4965_rs_rate_scale_clear_win(&lq_sta->lq_info[j].
2295                                win[i]);
2296 
2297     D_RATE("LQ:" "*** rate scale station global init for station %d ***\n",
2298            sta_id);
2299     /* TODO: what is a good starting rate for STA? About middle? Maybe not
2300      * the lowest or the highest rate.. Could consider using RSSI from
2301      * previous packets? Need to have IEEE 802.1X auth succeed immediately
2302      * after assoc.. */
2303 
2304     lq_sta->is_dup = 0;
2305     lq_sta->max_rate_idx = -1;
2306     lq_sta->missed_rate_counter = IL_MISSED_RATE_MAX;
2307     lq_sta->is_green = il4965_rs_use_green(il, sta);
2308     lq_sta->active_legacy_rate = il->active_rate & ~(0x1000);
2309     lq_sta->band = il->band;
2310     /*
2311      * active_siso_rate mask includes 9 MBits (bit 5), and CCK (bits 0-3),
2312      * supp_rates[] does not; shift to convert format, force 9 MBits off.
2313      */
2314     lq_sta->active_siso_rate = ht_cap->mcs.rx_mask[0] << 1;
2315     lq_sta->active_siso_rate |= ht_cap->mcs.rx_mask[0] & 0x1;
2316     lq_sta->active_siso_rate &= ~((u16) 0x2);
2317     lq_sta->active_siso_rate <<= IL_FIRST_OFDM_RATE;
2318 
2319     /* Same here */
2320     lq_sta->active_mimo2_rate = ht_cap->mcs.rx_mask[1] << 1;
2321     lq_sta->active_mimo2_rate |= ht_cap->mcs.rx_mask[1] & 0x1;
2322     lq_sta->active_mimo2_rate &= ~((u16) 0x2);
2323     lq_sta->active_mimo2_rate <<= IL_FIRST_OFDM_RATE;
2324 
2325     /* These values will be overridden later */
2326     lq_sta->lq.general_params.single_stream_ant_msk =
2327         il4965_first_antenna(il->hw_params.valid_tx_ant);
2328     lq_sta->lq.general_params.dual_stream_ant_msk =
2329         il->hw_params.valid_tx_ant & ~il4965_first_antenna(il->hw_params.
2330                                    valid_tx_ant);
2331     if (!lq_sta->lq.general_params.dual_stream_ant_msk) {
2332         lq_sta->lq.general_params.dual_stream_ant_msk = ANT_AB;
2333     } else if (il4965_num_of_ant(il->hw_params.valid_tx_ant) == 2) {
2334         lq_sta->lq.general_params.dual_stream_ant_msk =
2335             il->hw_params.valid_tx_ant;
2336     }
2337 
2338     /* as default allow aggregation for all tids */
2339     lq_sta->tx_agg_tid_en = IL_AGG_ALL_TID;
2340     lq_sta->drv = il;
2341 
2342     /* Set last_txrate_idx to lowest rate */
2343     lq_sta->last_txrate_idx = rate_lowest_index(sband, sta);
2344     if (sband->band == NL80211_BAND_5GHZ)
2345         lq_sta->last_txrate_idx += IL_FIRST_OFDM_RATE;
2346     lq_sta->is_agg = 0;
2347 
2348 #ifdef CONFIG_MAC80211_DEBUGFS
2349     lq_sta->dbg_fixed_rate = 0;
2350 #endif
2351 
2352     il4965_rs_initialize_lq(il, conf, sta, lq_sta);
2353 }
2354 
2355 static void
2356 il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta,
2357             u32 new_rate)
2358 {
2359     struct il_scale_tbl_info tbl_type;
2360     int idx = 0;
2361     int rate_idx;
2362     int repeat_rate = 0;
2363     u8 ant_toggle_cnt = 0;
2364     u8 use_ht_possible = 1;
2365     u8 valid_tx_ant = 0;
2366     struct il_link_quality_cmd *lq_cmd = &lq_sta->lq;
2367 
2368     /* Override starting rate (idx 0) if needed for debug purposes */
2369     il4965_rs_dbgfs_set_mcs(lq_sta, &new_rate, idx);
2370 
2371     /* Interpret new_rate (rate_n_flags) */
2372     il4965_rs_get_tbl_info_from_mcs(new_rate, lq_sta->band, &tbl_type,
2373                     &rate_idx);
2374 
2375     /* How many times should we repeat the initial rate? */
2376     if (is_legacy(tbl_type.lq_type)) {
2377         ant_toggle_cnt = 1;
2378         repeat_rate = IL_NUMBER_TRY;
2379     } else {
2380         repeat_rate = IL_HT_NUMBER_TRY;
2381     }
2382 
2383     lq_cmd->general_params.mimo_delimiter =
2384         is_mimo(tbl_type.lq_type) ? 1 : 0;
2385 
2386     /* Fill 1st table entry (idx 0) */
2387     lq_cmd->rs_table[idx].rate_n_flags = cpu_to_le32(new_rate);
2388 
2389     if (il4965_num_of_ant(tbl_type.ant_type) == 1) {
2390         lq_cmd->general_params.single_stream_ant_msk =
2391             tbl_type.ant_type;
2392     } else if (il4965_num_of_ant(tbl_type.ant_type) == 2) {
2393         lq_cmd->general_params.dual_stream_ant_msk = tbl_type.ant_type;
2394     }
2395     /* otherwise we don't modify the existing value */
2396     idx++;
2397     repeat_rate--;
2398     if (il)
2399         valid_tx_ant = il->hw_params.valid_tx_ant;
2400 
2401     /* Fill rest of rate table */
2402     while (idx < LINK_QUAL_MAX_RETRY_NUM) {
2403         /* Repeat initial/next rate.
2404          * For legacy IL_NUMBER_TRY == 1, this loop will not execute.
2405          * For HT IL_HT_NUMBER_TRY == 3, this executes twice. */
2406         while (repeat_rate > 0 && idx < (LINK_QUAL_MAX_RETRY_NUM - 1)) {
2407             if (is_legacy(tbl_type.lq_type)) {
2408                 if (ant_toggle_cnt < NUM_TRY_BEFORE_ANT_TOGGLE)
2409                     ant_toggle_cnt++;
2410                 else if (il &&
2411                      il4965_rs_toggle_antenna(valid_tx_ant,
2412                                   &new_rate,
2413                                   &tbl_type))
2414                     ant_toggle_cnt = 1;
2415             }
2416 
2417             /* Override next rate if needed for debug purposes */
2418             il4965_rs_dbgfs_set_mcs(lq_sta, &new_rate, idx);
2419 
2420             /* Fill next table entry */
2421             lq_cmd->rs_table[idx].rate_n_flags =
2422                 cpu_to_le32(new_rate);
2423             repeat_rate--;
2424             idx++;
2425         }
2426 
2427         il4965_rs_get_tbl_info_from_mcs(new_rate, lq_sta->band,
2428                         &tbl_type, &rate_idx);
2429 
2430         /* Indicate to uCode which entries might be MIMO.
2431          * If initial rate was MIMO, this will finally end up
2432          * as (IL_HT_NUMBER_TRY * 2), after 2nd pass, otherwise 0. */
2433         if (is_mimo(tbl_type.lq_type))
2434             lq_cmd->general_params.mimo_delimiter = idx;
2435 
2436         /* Get next rate */
2437         new_rate =
2438             il4965_rs_get_lower_rate(lq_sta, &tbl_type, rate_idx,
2439                          use_ht_possible);
2440 
2441         /* How many times should we repeat the next rate? */
2442         if (is_legacy(tbl_type.lq_type)) {
2443             if (ant_toggle_cnt < NUM_TRY_BEFORE_ANT_TOGGLE)
2444                 ant_toggle_cnt++;
2445             else if (il &&
2446                  il4965_rs_toggle_antenna(valid_tx_ant,
2447                               &new_rate, &tbl_type))
2448                 ant_toggle_cnt = 1;
2449 
2450             repeat_rate = IL_NUMBER_TRY;
2451         } else {
2452             repeat_rate = IL_HT_NUMBER_TRY;
2453         }
2454 
2455         /* Don't allow HT rates after next pass.
2456          * il4965_rs_get_lower_rate() will change type to LQ_A or LQ_G. */
2457         use_ht_possible = 0;
2458 
2459         /* Override next rate if needed for debug purposes */
2460         il4965_rs_dbgfs_set_mcs(lq_sta, &new_rate, idx);
2461 
2462         /* Fill next table entry */
2463         lq_cmd->rs_table[idx].rate_n_flags = cpu_to_le32(new_rate);
2464 
2465         idx++;
2466         repeat_rate--;
2467     }
2468 
2469     lq_cmd->agg_params.agg_frame_cnt_limit = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
2470     lq_cmd->agg_params.agg_dis_start_th = LINK_QUAL_AGG_DISABLE_START_DEF;
2471 
2472     lq_cmd->agg_params.agg_time_limit =
2473         cpu_to_le16(LINK_QUAL_AGG_TIME_LIMIT_DEF);
2474 }
2475 
2476 static void *
2477 il4965_rs_alloc(struct ieee80211_hw *hw)
2478 {
2479     return hw->priv;
2480 }
2481 
2482 /* rate scale requires free function to be implemented */
2483 static void
2484 il4965_rs_free(void *il_rate)
2485 {
2486     return;
2487 }
2488 
2489 static void
2490 il4965_rs_free_sta(void *il_r, struct ieee80211_sta *sta, void *il_sta)
2491 {
2492     struct il_priv *il __maybe_unused = il_r;
2493 
2494     D_RATE("enter\n");
2495     D_RATE("leave\n");
2496 }
2497 
2498 #ifdef CONFIG_MAC80211_DEBUGFS
2499 
2500 static void
2501 il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta, u32 * rate_n_flags, int idx)
2502 {
2503     struct il_priv *il;
2504     u8 valid_tx_ant;
2505     u8 ant_sel_tx;
2506 
2507     il = lq_sta->drv;
2508     valid_tx_ant = il->hw_params.valid_tx_ant;
2509     if (lq_sta->dbg_fixed_rate) {
2510         ant_sel_tx =
2511             ((lq_sta->
2512               dbg_fixed_rate & RATE_MCS_ANT_ABC_MSK) >>
2513              RATE_MCS_ANT_POS);
2514         if ((valid_tx_ant & ant_sel_tx) == ant_sel_tx) {
2515             *rate_n_flags = lq_sta->dbg_fixed_rate;
2516             D_RATE("Fixed rate ON\n");
2517         } else {
2518             lq_sta->dbg_fixed_rate = 0;
2519             IL_ERR
2520                 ("Invalid antenna selection 0x%X, Valid is 0x%X\n",
2521                  ant_sel_tx, valid_tx_ant);
2522             D_RATE("Fixed rate OFF\n");
2523         }
2524     } else {
2525         D_RATE("Fixed rate OFF\n");
2526     }
2527 }
2528 
2529 static ssize_t
2530 il4965_rs_sta_dbgfs_scale_table_write(struct file *file,
2531                       const char __user *user_buf,
2532                       size_t count, loff_t *ppos)
2533 {
2534     struct il_lq_sta *lq_sta = file->private_data;
2535     struct il_priv *il;
2536     char buf[64];
2537     size_t buf_size;
2538     u32 parsed_rate;
2539 
2540     il = lq_sta->drv;
2541     memset(buf, 0, sizeof(buf));
2542     buf_size = min(count, sizeof(buf) - 1);
2543     if (copy_from_user(buf, user_buf, buf_size))
2544         return -EFAULT;
2545 
2546     if (sscanf(buf, "%x", &parsed_rate) == 1)
2547         lq_sta->dbg_fixed_rate = parsed_rate;
2548     else
2549         lq_sta->dbg_fixed_rate = 0;
2550 
2551     lq_sta->active_legacy_rate = 0x0FFF;    /* 1 - 54 MBits, includes CCK */
2552     lq_sta->active_siso_rate = 0x1FD0;  /* 6 - 60 MBits, no 9, no CCK */
2553     lq_sta->active_mimo2_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */
2554 
2555     D_RATE("sta_id %d rate 0x%X\n", lq_sta->lq.sta_id,
2556            lq_sta->dbg_fixed_rate);
2557 
2558     if (lq_sta->dbg_fixed_rate) {
2559         il4965_rs_fill_link_cmd(NULL, lq_sta, lq_sta->dbg_fixed_rate);
2560         il_send_lq_cmd(lq_sta->drv, &lq_sta->lq, CMD_ASYNC, false);
2561     }
2562 
2563     return count;
2564 }
2565 
2566 static ssize_t
2567 il4965_rs_sta_dbgfs_scale_table_read(struct file *file, char __user *user_buf,
2568                      size_t count, loff_t *ppos)
2569 {
2570     char *buff;
2571     int desc = 0;
2572     int i = 0;
2573     int idx = 0;
2574     ssize_t ret;
2575 
2576     struct il_lq_sta *lq_sta = file->private_data;
2577     struct il_priv *il;
2578     struct il_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
2579 
2580     il = lq_sta->drv;
2581     buff = kmalloc(1024, GFP_KERNEL);
2582     if (!buff)
2583         return -ENOMEM;
2584 
2585     desc += sprintf(buff + desc, "sta_id %d\n", lq_sta->lq.sta_id);
2586     desc +=
2587         sprintf(buff + desc, "failed=%d success=%d rate=0%X\n",
2588             lq_sta->total_failed, lq_sta->total_success,
2589             lq_sta->active_legacy_rate);
2590     desc +=
2591         sprintf(buff + desc, "fixed rate 0x%X\n", lq_sta->dbg_fixed_rate);
2592     desc +=
2593         sprintf(buff + desc, "valid_tx_ant %s%s%s\n",
2594             (il->hw_params.valid_tx_ant & ANT_A) ? "ANT_A," : "",
2595             (il->hw_params.valid_tx_ant & ANT_B) ? "ANT_B," : "",
2596             (il->hw_params.valid_tx_ant & ANT_C) ? "ANT_C" : "");
2597     desc +=
2598         sprintf(buff + desc, "lq type %s\n",
2599             (is_legacy(tbl->lq_type)) ? "legacy" : "HT");
2600     if (is_Ht(tbl->lq_type)) {
2601         desc +=
2602             sprintf(buff + desc, " %s",
2603                 (is_siso(tbl->lq_type)) ? "SISO" : "MIMO2");
2604         desc +=
2605             sprintf(buff + desc, " %s",
2606                 (tbl->is_ht40) ? "40MHz" : "20MHz");
2607         desc +=
2608             sprintf(buff + desc, " %s %s %s\n",
2609                 (tbl->is_SGI) ? "SGI" : "",
2610                 (lq_sta->is_green) ? "GF enabled" : "",
2611                 (lq_sta->is_agg) ? "AGG on" : "");
2612     }
2613     desc +=
2614         sprintf(buff + desc, "last tx rate=0x%X\n",
2615             lq_sta->last_rate_n_flags);
2616     desc +=
2617         sprintf(buff + desc,
2618             "general:" "flags=0x%X mimo-d=%d s-ant0x%x d-ant=0x%x\n",
2619             lq_sta->lq.general_params.flags,
2620             lq_sta->lq.general_params.mimo_delimiter,
2621             lq_sta->lq.general_params.single_stream_ant_msk,
2622             lq_sta->lq.general_params.dual_stream_ant_msk);
2623 
2624     desc +=
2625         sprintf(buff + desc,
2626             "agg:"
2627             "time_limit=%d dist_start_th=%d frame_cnt_limit=%d\n",
2628             le16_to_cpu(lq_sta->lq.agg_params.agg_time_limit),
2629             lq_sta->lq.agg_params.agg_dis_start_th,
2630             lq_sta->lq.agg_params.agg_frame_cnt_limit);
2631 
2632     desc +=
2633         sprintf(buff + desc,
2634             "Start idx [0]=0x%x [1]=0x%x [2]=0x%x [3]=0x%x\n",
2635             lq_sta->lq.general_params.start_rate_idx[0],
2636             lq_sta->lq.general_params.start_rate_idx[1],
2637             lq_sta->lq.general_params.start_rate_idx[2],
2638             lq_sta->lq.general_params.start_rate_idx[3]);
2639 
2640     for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
2641         idx =
2642             il4965_hwrate_to_plcp_idx(le32_to_cpu
2643                           (lq_sta->lq.rs_table[i].
2644                            rate_n_flags));
2645         if (is_legacy(tbl->lq_type)) {
2646             desc +=
2647                 sprintf(buff + desc, " rate[%d] 0x%X %smbps\n", i,
2648                     le32_to_cpu(lq_sta->lq.rs_table[i].
2649                         rate_n_flags),
2650                     il_rate_mcs[idx].mbps);
2651         } else {
2652             desc +=
2653                 sprintf(buff + desc, " rate[%d] 0x%X %smbps (%s)\n",
2654                     i,
2655                     le32_to_cpu(lq_sta->lq.rs_table[i].
2656                         rate_n_flags),
2657                     il_rate_mcs[idx].mbps,
2658                     il_rate_mcs[idx].mcs);
2659         }
2660     }
2661 
2662     ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
2663     kfree(buff);
2664     return ret;
2665 }
2666 
2667 static const struct file_operations rs_sta_dbgfs_scale_table_ops = {
2668     .write = il4965_rs_sta_dbgfs_scale_table_write,
2669     .read = il4965_rs_sta_dbgfs_scale_table_read,
2670     .open = simple_open,
2671     .llseek = default_llseek,
2672 };
2673 
2674 static ssize_t
2675 il4965_rs_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf,
2676                      size_t count, loff_t *ppos)
2677 {
2678     char *buff;
2679     int desc = 0;
2680     int i, j;
2681     ssize_t ret;
2682 
2683     struct il_lq_sta *lq_sta = file->private_data;
2684 
2685     buff = kmalloc(1024, GFP_KERNEL);
2686     if (!buff)
2687         return -ENOMEM;
2688 
2689     for (i = 0; i < LQ_SIZE; i++) {
2690         desc +=
2691             sprintf(buff + desc,
2692                 "%s type=%d SGI=%d HT40=%d DUP=%d GF=%d\n"
2693                 "rate=0x%X\n", lq_sta->active_tbl == i ? "*" : "x",
2694                 lq_sta->lq_info[i].lq_type,
2695                 lq_sta->lq_info[i].is_SGI,
2696                 lq_sta->lq_info[i].is_ht40,
2697                 lq_sta->lq_info[i].is_dup, lq_sta->is_green,
2698                 lq_sta->lq_info[i].current_rate);
2699         for (j = 0; j < RATE_COUNT; j++) {
2700             desc +=
2701                 sprintf(buff + desc,
2702                     "counter=%d success=%d %%=%d\n",
2703                     lq_sta->lq_info[i].win[j].counter,
2704                     lq_sta->lq_info[i].win[j].success_counter,
2705                     lq_sta->lq_info[i].win[j].success_ratio);
2706         }
2707     }
2708     ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
2709     kfree(buff);
2710     return ret;
2711 }
2712 
2713 static const struct file_operations rs_sta_dbgfs_stats_table_ops = {
2714     .read = il4965_rs_sta_dbgfs_stats_table_read,
2715     .open = simple_open,
2716     .llseek = default_llseek,
2717 };
2718 
2719 static ssize_t
2720 il4965_rs_sta_dbgfs_rate_scale_data_read(struct file *file,
2721                      char __user *user_buf, size_t count,
2722                      loff_t *ppos)
2723 {
2724     char buff[120];
2725     int desc = 0;
2726     struct il_lq_sta *lq_sta = file->private_data;
2727     struct il_scale_tbl_info *tbl = &lq_sta->lq_info[lq_sta->active_tbl];
2728 
2729     if (is_Ht(tbl->lq_type))
2730         desc +=
2731             sprintf(buff + desc, "Bit Rate= %d Mb/s\n",
2732                 tbl->expected_tpt[lq_sta->last_txrate_idx]);
2733     else
2734         desc +=
2735             sprintf(buff + desc, "Bit Rate= %d Mb/s\n",
2736                 il_rates[lq_sta->last_txrate_idx].ieee >> 1);
2737 
2738     return simple_read_from_buffer(user_buf, count, ppos, buff, desc);
2739 }
2740 
2741 static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = {
2742     .read = il4965_rs_sta_dbgfs_rate_scale_data_read,
2743     .open = simple_open,
2744     .llseek = default_llseek,
2745 };
2746 
2747 static void
2748 il4965_rs_add_debugfs(void *il, void *il_sta, struct dentry *dir)
2749 {
2750     struct il_lq_sta *lq_sta = il_sta;
2751 
2752     debugfs_create_file("rate_scale_table", 0600, dir, lq_sta,
2753                 &rs_sta_dbgfs_scale_table_ops);
2754     debugfs_create_file("rate_stats_table", 0400, dir, lq_sta,
2755                 &rs_sta_dbgfs_stats_table_ops);
2756     debugfs_create_file("rate_scale_data", 0400, dir, lq_sta,
2757                 &rs_sta_dbgfs_rate_scale_data_ops);
2758     debugfs_create_u8("tx_agg_tid_enable", 0600, dir,
2759               &lq_sta->tx_agg_tid_en);
2760 }
2761 #endif
2762 
2763 /*
2764  * Initialization of rate scaling information is done by driver after
2765  * the station is added. Since mac80211 calls this function before a
2766  * station is added we ignore it.
2767  */
2768 static void
2769 il4965_rs_rate_init_stub(void *il_r, struct ieee80211_supported_band *sband,
2770              struct cfg80211_chan_def *chandef,
2771              struct ieee80211_sta *sta, void *il_sta)
2772 {
2773 }
2774 
2775 static const struct rate_control_ops rs_4965_ops = {
2776     .name = IL4965_RS_NAME,
2777     .tx_status = il4965_rs_tx_status,
2778     .get_rate = il4965_rs_get_rate,
2779     .rate_init = il4965_rs_rate_init_stub,
2780     .alloc = il4965_rs_alloc,
2781     .free = il4965_rs_free,
2782     .alloc_sta = il4965_rs_alloc_sta,
2783     .free_sta = il4965_rs_free_sta,
2784 #ifdef CONFIG_MAC80211_DEBUGFS
2785     .add_sta_debugfs = il4965_rs_add_debugfs,
2786 #endif
2787 };
2788 
2789 int
2790 il4965_rate_control_register(void)
2791 {
2792     return ieee80211_rate_control_register(&rs_4965_ops);
2793 }
2794 
2795 void
2796 il4965_rate_control_unregister(void)
2797 {
2798     ieee80211_rate_control_unregister(&rs_4965_ops);
2799 }