1 // SPDX-License-Identifier: GPL-2.0-only 2 /****************************************************************************** 3 * 4 * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved. 5 * 6 * Contact Information: 7 * Intel Linux Wireless <ilw@linux.intel.com> 8 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 9 * 10 *****************************************************************************/ 11 #include <linux/kernel.h> 12 #include <linux/skbuff.h> 13 #include <linux/slab.h> 14 #include <net/mac80211.h> 15 16 #include <linux/netdevice.h> 17 #include <linux/etherdevice.h> 18 #include <linux/delay.h> 19 20 #include <linux/workqueue.h> 21 22 #include "common.h" 23 #include "4965.h" 24 25 #define IL4965_RS_NAME "iwl-4965-rs" 26 27 #define NUM_TRY_BEFORE_ANT_TOGGLE 1 28 #define IL_NUMBER_TRY 1 29 #define IL_HT_NUMBER_TRY 3 30 31 #define RATE_MAX_WINDOW 62 /* # tx in history win */ 32 #define RATE_MIN_FAILURE_TH 6 /* min failures to calc tpt */ 33 #define RATE_MIN_SUCCESS_TH 8 /* min successes to calc tpt */ 34 35 /* max allowed rate miss before sync LQ cmd */ 36 #define IL_MISSED_RATE_MAX 15 37 /* max time to accum history 2 seconds */ 38 #define RATE_SCALE_FLUSH_INTVL (3*HZ) 39 40 static u8 rs_ht_to_legacy[] = { 41 RATE_6M_IDX, RATE_6M_IDX, 42 RATE_6M_IDX, RATE_6M_IDX, 43 RATE_6M_IDX, 44 RATE_6M_IDX, RATE_9M_IDX, 45 RATE_12M_IDX, RATE_18M_IDX, 46 RATE_24M_IDX, RATE_36M_IDX, 47 RATE_48M_IDX, RATE_54M_IDX 48 }; 49 50 static const u8 ant_toggle_lookup[] = { 51 /*ANT_NONE -> */ ANT_NONE, 52 /*ANT_A -> */ ANT_B, 53 /*ANT_B -> */ ANT_C, 54 /*ANT_AB -> */ ANT_BC, 55 /*ANT_C -> */ ANT_A, 56 /*ANT_AC -> */ ANT_AB, 57 /*ANT_BC -> */ ANT_AC, 58 /*ANT_ABC -> */ ANT_ABC, 59 }; 60 61 #define IL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np) \ 62 [RATE_##r##M_IDX] = { RATE_##r##M_PLCP, \ 63 RATE_SISO_##s##M_PLCP, \ 64 RATE_MIMO2_##s##M_PLCP,\ 65 RATE_##r##M_IEEE, \ 66 RATE_##ip##M_IDX, \ 67 RATE_##in##M_IDX, \ 68 RATE_##rp##M_IDX, \ 69 RATE_##rn##M_IDX, \ 70 RATE_##pp##M_IDX, \ 71 RATE_##np##M_IDX } 72 73 /* 74 * Parameter order: 75 * rate, ht rate, prev rate, next rate, prev tgg rate, next tgg rate 76 * 77 * If there isn't a valid next or previous rate then INV is used which 78 * maps to RATE_INVALID 79 * 80 */ 81 const struct il_rate_info il_rates[RATE_COUNT] = { 82 IL_DECLARE_RATE_INFO(1, INV, INV, 2, INV, 2, INV, 2), /* 1mbps */ 83 IL_DECLARE_RATE_INFO(2, INV, 1, 5, 1, 5, 1, 5), /* 2mbps */ 84 IL_DECLARE_RATE_INFO(5, INV, 2, 6, 2, 11, 2, 11), /*5.5mbps */ 85 IL_DECLARE_RATE_INFO(11, INV, 9, 12, 9, 12, 5, 18), /* 11mbps */ 86 IL_DECLARE_RATE_INFO(6, 6, 5, 9, 5, 11, 5, 11), /* 6mbps */ 87 IL_DECLARE_RATE_INFO(9, 6, 6, 11, 6, 11, 5, 11), /* 9mbps */ 88 IL_DECLARE_RATE_INFO(12, 12, 11, 18, 11, 18, 11, 18), /* 12mbps */ 89 IL_DECLARE_RATE_INFO(18, 18, 12, 24, 12, 24, 11, 24), /* 18mbps */ 90 IL_DECLARE_RATE_INFO(24, 24, 18, 36, 18, 36, 18, 36), /* 24mbps */ 91 IL_DECLARE_RATE_INFO(36, 36, 24, 48, 24, 48, 24, 48), /* 36mbps */ 92 IL_DECLARE_RATE_INFO(48, 48, 36, 54, 36, 54, 36, 54), /* 48mbps */ 93 IL_DECLARE_RATE_INFO(54, 54, 48, INV, 48, INV, 48, INV),/* 54mbps */ 94 IL_DECLARE_RATE_INFO(60, 60, 48, INV, 48, INV, 48, INV),/* 60mbps */ 95 }; 96 97 static int 98 il4965_hwrate_to_plcp_idx(u32 rate_n_flags) 99 { 100 int idx = 0; 101 102 /* HT rate format */ 103 if (rate_n_flags & RATE_MCS_HT_MSK) { 104 idx = (rate_n_flags & 0xff); 105 106 if (idx >= RATE_MIMO2_6M_PLCP) 107 idx = idx - RATE_MIMO2_6M_PLCP; 108 109 idx += IL_FIRST_OFDM_RATE; 110 /* skip 9M not supported in ht */ 111 if (idx >= RATE_9M_IDX) 112 idx += 1; 113 if (idx >= IL_FIRST_OFDM_RATE && idx <= IL_LAST_OFDM_RATE) 114 return idx; 115 116 /* legacy rate format, search for match in table */ 117 } else { 118 for (idx = 0; idx < ARRAY_SIZE(il_rates); idx++) 119 if (il_rates[idx].plcp == (rate_n_flags & 0xFF)) 120 return idx; 121 } 122 123 return -1; 124 } 125 126 static void il4965_rs_rate_scale_perform(struct il_priv *il, 127 struct sk_buff *skb, 128 struct ieee80211_sta *sta, 129 struct il_lq_sta *lq_sta); 130 static void il4965_rs_fill_link_cmd(struct il_priv *il, 131 struct il_lq_sta *lq_sta, u32 rate_n_flags); 132 static void il4965_rs_stay_in_table(struct il_lq_sta *lq_sta, 133 bool force_search); 134 135 #ifdef CONFIG_MAC80211_DEBUGFS 136 static void il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta, 137 u32 *rate_n_flags, int idx); 138 #else 139 static void 140 il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta, u32 * rate_n_flags, int idx) 141 { 142 } 143 #endif 144 145 /* 146 * The following tables contain the expected throughput metrics for all rates 147 * 148 * 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54, 60 MBits 149 * 150 * where invalid entries are zeros. 151 * 152 * CCK rates are only valid in legacy table and will only be used in G 153 * (2.4 GHz) band. 154 */ 155 156 static s32 expected_tpt_legacy[RATE_COUNT] = { 157 7, 13, 35, 58, 40, 57, 72, 98, 121, 154, 177, 186, 0 158 }; 159 160 static s32 expected_tpt_siso20MHz[4][RATE_COUNT] = { 161 {0, 0, 0, 0, 42, 0, 76, 102, 124, 158, 183, 193, 202}, /* Norm */ 162 {0, 0, 0, 0, 46, 0, 82, 110, 132, 167, 192, 202, 210}, /* SGI */ 163 {0, 0, 0, 0, 48, 0, 93, 135, 176, 251, 319, 351, 381}, /* AGG */ 164 {0, 0, 0, 0, 53, 0, 102, 149, 193, 275, 348, 381, 413}, /* AGG+SGI */ 165 }; 166 167 static s32 expected_tpt_siso40MHz[4][RATE_COUNT] = { 168 {0, 0, 0, 0, 77, 0, 127, 160, 184, 220, 242, 250, 257}, /* Norm */ 169 {0, 0, 0, 0, 83, 0, 135, 169, 193, 229, 250, 257, 264}, /* SGI */ 170 {0, 0, 0, 0, 96, 0, 182, 259, 328, 451, 553, 598, 640}, /* AGG */ 171 {0, 0, 0, 0, 106, 0, 199, 282, 357, 487, 593, 640, 683}, /* AGG+SGI */ 172 }; 173 174 static s32 expected_tpt_mimo2_20MHz[4][RATE_COUNT] = { 175 {0, 0, 0, 0, 74, 0, 123, 155, 179, 213, 235, 243, 250}, /* Norm */ 176 {0, 0, 0, 0, 81, 0, 131, 164, 187, 221, 242, 250, 256}, /* SGI */ 177 {0, 0, 0, 0, 92, 0, 175, 250, 317, 436, 534, 578, 619}, /* AGG */ 178 {0, 0, 0, 0, 102, 0, 192, 273, 344, 470, 573, 619, 660}, /* AGG+SGI */ 179 }; 180 181 static s32 expected_tpt_mimo2_40MHz[4][RATE_COUNT] = { 182 {0, 0, 0, 0, 123, 0, 182, 214, 235, 264, 279, 285, 289}, /* Norm */ 183 {0, 0, 0, 0, 131, 0, 191, 222, 242, 270, 284, 289, 293}, /* SGI */ 184 {0, 0, 0, 0, 180, 0, 327, 446, 545, 708, 828, 878, 922}, /* AGG */ 185 {0, 0, 0, 0, 197, 0, 355, 481, 584, 752, 872, 922, 966}, /* AGG+SGI */ 186 }; 187 188 /* mbps, mcs */ 189 static const struct il_rate_mcs_info il_rate_mcs[RATE_COUNT] = { 190 {"1", "BPSK DSSS"}, 191 {"2", "QPSK DSSS"}, 192 {"5.5", "BPSK CCK"}, 193 {"11", "QPSK CCK"}, 194 {"6", "BPSK 1/2"}, 195 {"9", "BPSK 1/2"}, 196 {"12", "QPSK 1/2"}, 197 {"18", "QPSK 3/4"}, 198 {"24", "16QAM 1/2"}, 199 {"36", "16QAM 3/4"}, 200 {"48", "64QAM 2/3"}, 201 {"54", "64QAM 3/4"}, 202 {"60", "64QAM 5/6"}, 203 }; 204 205 #define MCS_IDX_PER_STREAM (8) 206 207 static inline u8 208 il4965_rs_extract_rate(u32 rate_n_flags) 209 { 210 return (u8) (rate_n_flags & 0xFF); 211 } 212 213 static void 214 il4965_rs_rate_scale_clear_win(struct il_rate_scale_data *win) 215 { 216 win->data = 0; 217 win->success_counter = 0; 218 win->success_ratio = IL_INVALID_VALUE; 219 win->counter = 0; 220 win->average_tpt = IL_INVALID_VALUE; 221 win->stamp = 0; 222 } 223 224 static inline u8 225 il4965_rs_is_valid_ant(u8 valid_antenna, u8 ant_type) 226 { 227 return (ant_type & valid_antenna) == ant_type; 228 } 229 230 /* 231 * removes the old data from the stats. All data that is older than 232 * TID_MAX_TIME_DIFF, will be deleted. 233 */ 234 static void 235 il4965_rs_tl_rm_old_stats(struct il_traffic_load *tl, u32 curr_time) 236 { 237 /* The oldest age we want to keep */ 238 u32 oldest_time = curr_time - TID_MAX_TIME_DIFF; 239 240 while (tl->queue_count && tl->time_stamp < oldest_time) { 241 tl->total -= tl->packet_count[tl->head]; 242 tl->packet_count[tl->head] = 0; 243 tl->time_stamp += TID_QUEUE_CELL_SPACING; 244 tl->queue_count--; 245 tl->head++; 246 if (tl->head >= TID_QUEUE_MAX_SIZE) 247 tl->head = 0; 248 } 249 } 250 251 /* 252 * increment traffic load value for tid and also remove 253 * any old values if passed the certain time period 254 */ 255 static u8 256 il4965_rs_tl_add_packet(struct il_lq_sta *lq_data, struct ieee80211_hdr *hdr) 257 { 258 u32 curr_time = jiffies_to_msecs(jiffies); 259 u32 time_diff; 260 s32 idx; 261 struct il_traffic_load *tl = NULL; 262 u8 tid; 263 264 if (ieee80211_is_data_qos(hdr->frame_control)) { 265 u8 *qc = ieee80211_get_qos_ctl(hdr); 266 tid = qc[0] & 0xf; 267 } else 268 return MAX_TID_COUNT; 269 270 if (unlikely(tid >= TID_MAX_LOAD_COUNT)) 271 return MAX_TID_COUNT; 272 273 tl = &lq_data->load[tid]; 274 275 curr_time -= curr_time % TID_ROUND_VALUE; 276 277 /* Happens only for the first packet. Initialize the data */ 278 if (!(tl->queue_count)) { 279 tl->total = 1; 280 tl->time_stamp = curr_time; 281 tl->queue_count = 1; 282 tl->head = 0; 283 tl->packet_count[0] = 1; 284 return MAX_TID_COUNT; 285 } 286 287 time_diff = TIME_WRAP_AROUND(tl->time_stamp, curr_time); 288 idx = time_diff / TID_QUEUE_CELL_SPACING; 289 290 /* The history is too long: remove data that is older than */ 291 /* TID_MAX_TIME_DIFF */ 292 if (idx >= TID_QUEUE_MAX_SIZE) 293 il4965_rs_tl_rm_old_stats(tl, curr_time); 294 295 idx = (tl->head + idx) % TID_QUEUE_MAX_SIZE; 296 tl->packet_count[idx] = tl->packet_count[idx] + 1; 297 tl->total = tl->total + 1; 298 299 if ((idx + 1) > tl->queue_count) 300 tl->queue_count = idx + 1; 301 302 return tid; 303 } 304 305 /* 306 get the traffic load value for tid 307 */ 308 static u32 309 il4965_rs_tl_get_load(struct il_lq_sta *lq_data, u8 tid) 310 { 311 u32 curr_time = jiffies_to_msecs(jiffies); 312 u32 time_diff; 313 s32 idx; 314 struct il_traffic_load *tl = NULL; 315 316 if (tid >= TID_MAX_LOAD_COUNT) 317 return 0; 318 319 tl = &(lq_data->load[tid]); 320 321 curr_time -= curr_time % TID_ROUND_VALUE; 322 323 if (!(tl->queue_count)) 324 return 0; 325 326 time_diff = TIME_WRAP_AROUND(tl->time_stamp, curr_time); 327 idx = time_diff / TID_QUEUE_CELL_SPACING; 328 329 /* The history is too long: remove data that is older than */ 330 /* TID_MAX_TIME_DIFF */ 331 if (idx >= TID_QUEUE_MAX_SIZE) 332 il4965_rs_tl_rm_old_stats(tl, curr_time); 333 334 return tl->total; 335 } 336 337 static int 338 il4965_rs_tl_turn_on_agg_for_tid(struct il_priv *il, struct il_lq_sta *lq_data, 339 u8 tid, struct ieee80211_sta *sta) 340 { 341 int ret = -EAGAIN; 342 u32 load; 343 344 load = il4965_rs_tl_get_load(lq_data, tid); 345 346 if (load > IL_AGG_LOAD_THRESHOLD) { 347 D_HT("Starting Tx agg: STA: %pM tid: %d\n", sta->addr, tid); 348 ret = ieee80211_start_tx_ba_session(sta, tid, 5000); 349 if (ret == -EAGAIN) { 350 /* 351 * driver and mac80211 is out of sync 352 * this might be cause by reloading firmware 353 * stop the tx ba session here 354 */ 355 IL_ERR("Fail start Tx agg on tid: %d\n", tid); 356 ieee80211_stop_tx_ba_session(sta, tid); 357 } 358 } else 359 D_HT("Aggregation not enabled for tid %d because load = %u\n", 360 tid, load); 361 362 return ret; 363 } 364 365 static void 366 il4965_rs_tl_turn_on_agg(struct il_priv *il, u8 tid, struct il_lq_sta *lq_data, 367 struct ieee80211_sta *sta) 368 { 369 if (tid < TID_MAX_LOAD_COUNT) 370 il4965_rs_tl_turn_on_agg_for_tid(il, lq_data, tid, sta); 371 else 372 IL_ERR("tid exceeds max load count: %d/%d\n", tid, 373 TID_MAX_LOAD_COUNT); 374 } 375 376 static inline int 377 il4965_get_il4965_num_of_ant_from_rate(u32 rate_n_flags) 378 { 379 return !!(rate_n_flags & RATE_MCS_ANT_A_MSK) + 380 !!(rate_n_flags & RATE_MCS_ANT_B_MSK) + 381 !!(rate_n_flags & RATE_MCS_ANT_C_MSK); 382 } 383 384 /* 385 * Static function to get the expected throughput from an il_scale_tbl_info 386 * that wraps a NULL pointer check 387 */ 388 static s32 389 il4965_get_expected_tpt(struct il_scale_tbl_info *tbl, int rs_idx) 390 { 391 if (tbl->expected_tpt) 392 return tbl->expected_tpt[rs_idx]; 393 return 0; 394 } 395 396 /* 397 * il4965_rs_collect_tx_data - Update the success/failure sliding win 398 * 399 * We keep a sliding win of the last 62 packets transmitted 400 * at this rate. win->data contains the bitmask of successful 401 * packets. 402 */ 403 static int 404 il4965_rs_collect_tx_data(struct il_scale_tbl_info *tbl, int scale_idx, 405 int attempts, int successes) 406 { 407 struct il_rate_scale_data *win = NULL; 408 static const u64 mask = (((u64) 1) << (RATE_MAX_WINDOW - 1)); 409 s32 fail_count, tpt; 410 411 if (scale_idx < 0 || scale_idx >= RATE_COUNT) 412 return -EINVAL; 413 414 /* Select win for current tx bit rate */ 415 win = &(tbl->win[scale_idx]); 416 417 /* Get expected throughput */ 418 tpt = il4965_get_expected_tpt(tbl, scale_idx); 419 420 /* 421 * Keep track of only the latest 62 tx frame attempts in this rate's 422 * history win; anything older isn't really relevant any more. 423 * If we have filled up the sliding win, drop the oldest attempt; 424 * if the oldest attempt (highest bit in bitmap) shows "success", 425 * subtract "1" from the success counter (this is the main reason 426 * we keep these bitmaps!). 427 */ 428 while (attempts > 0) { 429 if (win->counter >= RATE_MAX_WINDOW) { 430 431 /* remove earliest */ 432 win->counter = RATE_MAX_WINDOW - 1; 433 434 if (win->data & mask) { 435 win->data &= ~mask; 436 win->success_counter--; 437 } 438 } 439 440 /* Increment frames-attempted counter */ 441 win->counter++; 442 443 /* Shift bitmap by one frame to throw away oldest history */ 444 win->data <<= 1; 445 446 /* Mark the most recent #successes attempts as successful */ 447 if (successes > 0) { 448 win->success_counter++; 449 win->data |= 0x1; 450 successes--; 451 } 452 453 attempts--; 454 } 455 456 /* Calculate current success ratio, avoid divide-by-0! */ 457 if (win->counter > 0) 458 win->success_ratio = 459 128 * (100 * win->success_counter) / win->counter; 460 else 461 win->success_ratio = IL_INVALID_VALUE; 462 463 fail_count = win->counter - win->success_counter; 464 465 /* Calculate average throughput, if we have enough history. */ 466 if (fail_count >= RATE_MIN_FAILURE_TH || 467 win->success_counter >= RATE_MIN_SUCCESS_TH) 468 win->average_tpt = (win->success_ratio * tpt + 64) / 128; 469 else 470 win->average_tpt = IL_INVALID_VALUE; 471 472 /* Tag this win as having been updated */ 473 win->stamp = jiffies; 474 475 return 0; 476 } 477 478 /* 479 * Fill uCode API rate_n_flags field, based on "search" or "active" table. 480 */ 481 static u32 482 il4965_rate_n_flags_from_tbl(struct il_priv *il, struct il_scale_tbl_info *tbl, 483 int idx, u8 use_green) 484 { 485 u32 rate_n_flags = 0; 486 487 if (is_legacy(tbl->lq_type)) { 488 rate_n_flags = il_rates[idx].plcp; 489 if (idx >= IL_FIRST_CCK_RATE && idx <= IL_LAST_CCK_RATE) 490 rate_n_flags |= RATE_MCS_CCK_MSK; 491 492 } else if (is_Ht(tbl->lq_type)) { 493 if (idx > IL_LAST_OFDM_RATE) { 494 IL_ERR("Invalid HT rate idx %d\n", idx); 495 idx = IL_LAST_OFDM_RATE; 496 } 497 rate_n_flags = RATE_MCS_HT_MSK; 498 499 if (is_siso(tbl->lq_type)) 500 rate_n_flags |= il_rates[idx].plcp_siso; 501 else 502 rate_n_flags |= il_rates[idx].plcp_mimo2; 503 } else { 504 IL_ERR("Invalid tbl->lq_type %d\n", tbl->lq_type); 505 } 506 507 rate_n_flags |= 508 ((tbl->ant_type << RATE_MCS_ANT_POS) & RATE_MCS_ANT_ABC_MSK); 509 510 if (is_Ht(tbl->lq_type)) { 511 if (tbl->is_ht40) { 512 if (tbl->is_dup) 513 rate_n_flags |= RATE_MCS_DUP_MSK; 514 else 515 rate_n_flags |= RATE_MCS_HT40_MSK; 516 } 517 if (tbl->is_SGI) 518 rate_n_flags |= RATE_MCS_SGI_MSK; 519 520 if (use_green) { 521 rate_n_flags |= RATE_MCS_GF_MSK; 522 if (is_siso(tbl->lq_type) && tbl->is_SGI) { 523 rate_n_flags &= ~RATE_MCS_SGI_MSK; 524 IL_ERR("GF was set with SGI:SISO\n"); 525 } 526 } 527 } 528 return rate_n_flags; 529 } 530 531 /* 532 * Interpret uCode API's rate_n_flags format, 533 * fill "search" or "active" tx mode table. 534 */ 535 static int 536 il4965_rs_get_tbl_info_from_mcs(const u32 rate_n_flags, 537 enum nl80211_band band, 538 struct il_scale_tbl_info *tbl, int *rate_idx) 539 { 540 u32 ant_msk = (rate_n_flags & RATE_MCS_ANT_ABC_MSK); 541 u8 il4965_num_of_ant = 542 il4965_get_il4965_num_of_ant_from_rate(rate_n_flags); 543 u8 mcs; 544 545 memset(tbl, 0, sizeof(struct il_scale_tbl_info)); 546 *rate_idx = il4965_hwrate_to_plcp_idx(rate_n_flags); 547 548 if (*rate_idx == RATE_INVALID) { 549 *rate_idx = -1; 550 return -EINVAL; 551 } 552 tbl->is_SGI = 0; /* default legacy setup */ 553 tbl->is_ht40 = 0; 554 tbl->is_dup = 0; 555 tbl->ant_type = (ant_msk >> RATE_MCS_ANT_POS); 556 tbl->lq_type = LQ_NONE; 557 tbl->max_search = IL_MAX_SEARCH; 558 559 /* legacy rate format */ 560 if (!(rate_n_flags & RATE_MCS_HT_MSK)) { 561 if (il4965_num_of_ant == 1) { 562 if (band == NL80211_BAND_5GHZ) 563 tbl->lq_type = LQ_A; 564 else 565 tbl->lq_type = LQ_G; 566 } 567 /* HT rate format */ 568 } else { 569 if (rate_n_flags & RATE_MCS_SGI_MSK) 570 tbl->is_SGI = 1; 571 572 if ((rate_n_flags & RATE_MCS_HT40_MSK) || 573 (rate_n_flags & RATE_MCS_DUP_MSK)) 574 tbl->is_ht40 = 1; 575 576 if (rate_n_flags & RATE_MCS_DUP_MSK) 577 tbl->is_dup = 1; 578 579 mcs = il4965_rs_extract_rate(rate_n_flags); 580 581 /* SISO */ 582 if (mcs <= RATE_SISO_60M_PLCP) { 583 if (il4965_num_of_ant == 1) 584 tbl->lq_type = LQ_SISO; /*else NONE */ 585 /* MIMO2 */ 586 } else { 587 if (il4965_num_of_ant == 2) 588 tbl->lq_type = LQ_MIMO2; 589 } 590 } 591 return 0; 592 } 593 594 /* switch to another antenna/antennas and return 1 */ 595 /* if no other valid antenna found, return 0 */ 596 static int 597 il4965_rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags, 598 struct il_scale_tbl_info *tbl) 599 { 600 u8 new_ant_type; 601 602 if (!tbl->ant_type || tbl->ant_type > ANT_ABC) 603 return 0; 604 605 if (!il4965_rs_is_valid_ant(valid_ant, tbl->ant_type)) 606 return 0; 607 608 new_ant_type = ant_toggle_lookup[tbl->ant_type]; 609 610 while (new_ant_type != tbl->ant_type && 611 !il4965_rs_is_valid_ant(valid_ant, new_ant_type)) 612 new_ant_type = ant_toggle_lookup[new_ant_type]; 613 614 if (new_ant_type == tbl->ant_type) 615 return 0; 616 617 tbl->ant_type = new_ant_type; 618 *rate_n_flags &= ~RATE_MCS_ANT_ABC_MSK; 619 *rate_n_flags |= new_ant_type << RATE_MCS_ANT_POS; 620 return 1; 621 } 622 623 /* 624 * Green-field mode is valid if the station supports it and 625 * there are no non-GF stations present in the BSS. 626 */ 627 static bool 628 il4965_rs_use_green(struct il_priv *il, struct ieee80211_sta *sta) 629 { 630 return (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) && 631 !il->ht.non_gf_sta_present; 632 } 633 634 /* 635 * il4965_rs_get_supported_rates - get the available rates 636 * 637 * if management frame or broadcast frame only return 638 * basic available rates. 639 * 640 */ 641 static u16 642 il4965_rs_get_supported_rates(struct il_lq_sta *lq_sta, 643 struct ieee80211_hdr *hdr, 644 enum il_table_type rate_type) 645 { 646 if (is_legacy(rate_type)) { 647 return lq_sta->active_legacy_rate; 648 } else { 649 if (is_siso(rate_type)) 650 return lq_sta->active_siso_rate; 651 else 652 return lq_sta->active_mimo2_rate; 653 } 654 } 655 656 static u16 657 il4965_rs_get_adjacent_rate(struct il_priv *il, u8 idx, u16 rate_mask, 658 int rate_type) 659 { 660 u8 high = RATE_INVALID; 661 u8 low = RATE_INVALID; 662 663 /* 802.11A or ht walks to the next literal adjacent rate in 664 * the rate table */ 665 if (is_a_band(rate_type) || !is_legacy(rate_type)) { 666 int i; 667 u32 mask; 668 669 /* Find the previous rate that is in the rate mask */ 670 i = idx - 1; 671 for (mask = (1 << i); i >= 0; i--, mask >>= 1) { 672 if (rate_mask & mask) { 673 low = i; 674 break; 675 } 676 } 677 678 /* Find the next rate that is in the rate mask */ 679 i = idx + 1; 680 for (mask = (1 << i); i < RATE_COUNT; i++, mask <<= 1) { 681 if (rate_mask & mask) { 682 high = i; 683 break; 684 } 685 } 686 687 return (high << 8) | low; 688 } 689 690 low = idx; 691 while (low != RATE_INVALID) { 692 low = il_rates[low].prev_rs; 693 if (low == RATE_INVALID) 694 break; 695 if (rate_mask & (1 << low)) 696 break; 697 D_RATE("Skipping masked lower rate: %d\n", low); 698 } 699 700 high = idx; 701 while (high != RATE_INVALID) { 702 high = il_rates[high].next_rs; 703 if (high == RATE_INVALID) 704 break; 705 if (rate_mask & (1 << high)) 706 break; 707 D_RATE("Skipping masked higher rate: %d\n", high); 708 } 709 710 return (high << 8) | low; 711 } 712 713 static u32 714 il4965_rs_get_lower_rate(struct il_lq_sta *lq_sta, 715 struct il_scale_tbl_info *tbl, u8 scale_idx, 716 u8 ht_possible) 717 { 718 s32 low; 719 u16 rate_mask; 720 u16 high_low; 721 u8 switch_to_legacy = 0; 722 u8 is_green = lq_sta->is_green; 723 struct il_priv *il = lq_sta->drv; 724 725 /* check if we need to switch from HT to legacy rates. 726 * assumption is that mandatory rates (1Mbps or 6Mbps) 727 * are always supported (spec demand) */ 728 if (!is_legacy(tbl->lq_type) && (!ht_possible || !scale_idx)) { 729 switch_to_legacy = 1; 730 scale_idx = rs_ht_to_legacy[scale_idx]; 731 if (lq_sta->band == NL80211_BAND_5GHZ) 732 tbl->lq_type = LQ_A; 733 else 734 tbl->lq_type = LQ_G; 735 736 if (il4965_num_of_ant(tbl->ant_type) > 1) 737 tbl->ant_type = 738 il4965_first_antenna(il->hw_params.valid_tx_ant); 739 740 tbl->is_ht40 = 0; 741 tbl->is_SGI = 0; 742 tbl->max_search = IL_MAX_SEARCH; 743 } 744 745 rate_mask = il4965_rs_get_supported_rates(lq_sta, NULL, tbl->lq_type); 746 747 /* Mask with station rate restriction */ 748 if (is_legacy(tbl->lq_type)) { 749 /* supp_rates has no CCK bits in A mode */ 750 if (lq_sta->band == NL80211_BAND_5GHZ) 751 rate_mask = 752 (u16) (rate_mask & 753 (lq_sta->supp_rates << IL_FIRST_OFDM_RATE)); 754 else 755 rate_mask = (u16) (rate_mask & lq_sta->supp_rates); 756 } 757 758 /* If we switched from HT to legacy, check current rate */ 759 if (switch_to_legacy && (rate_mask & (1 << scale_idx))) { 760 low = scale_idx; 761 goto out; 762 } 763 764 high_low = 765 il4965_rs_get_adjacent_rate(lq_sta->drv, scale_idx, rate_mask, 766 tbl->lq_type); 767 low = high_low & 0xff; 768 769 if (low == RATE_INVALID) 770 low = scale_idx; 771 772 out: 773 return il4965_rate_n_flags_from_tbl(lq_sta->drv, tbl, low, is_green); 774 } 775 776 /* 777 * Simple function to compare two rate scale table types 778 */ 779 static bool 780 il4965_table_type_matches(struct il_scale_tbl_info *a, 781 struct il_scale_tbl_info *b) 782 { 783 return (a->lq_type == b->lq_type && a->ant_type == b->ant_type && 784 a->is_SGI == b->is_SGI); 785 } 786 787 /* 788 * mac80211 sends us Tx status 789 */ 790 static void 791 il4965_rs_tx_status(void *il_r, struct ieee80211_supported_band *sband, 792 struct ieee80211_sta *sta, void *il_sta, 793 struct sk_buff *skb) 794 { 795 int legacy_success; 796 int retries; 797 int rs_idx, mac_idx, i; 798 struct il_lq_sta *lq_sta = il_sta; 799 struct il_link_quality_cmd *table; 800 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 801 struct il_priv *il = (struct il_priv *)il_r; 802 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 803 enum mac80211_rate_control_flags mac_flags; 804 u32 tx_rate; 805 struct il_scale_tbl_info tbl_type; 806 struct il_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl; 807 808 D_RATE("get frame ack response, update rate scale win\n"); 809 810 /* Treat uninitialized rate scaling data same as non-existing. */ 811 if (!lq_sta) { 812 D_RATE("Station rate scaling not created yet.\n"); 813 return; 814 } else if (!lq_sta->drv) { 815 D_RATE("Rate scaling not initialized yet.\n"); 816 return; 817 } 818 819 if (!ieee80211_is_data(hdr->frame_control) || 820 (info->flags & IEEE80211_TX_CTL_NO_ACK)) 821 return; 822 823 /* This packet was aggregated but doesn't carry status info */ 824 if ((info->flags & IEEE80211_TX_CTL_AMPDU) && 825 !(info->flags & IEEE80211_TX_STAT_AMPDU)) 826 return; 827 828 /* 829 * Ignore this Tx frame response if its initial rate doesn't match 830 * that of latest Link Quality command. There may be stragglers 831 * from a previous Link Quality command, but we're no longer interested 832 * in those; they're either from the "active" mode while we're trying 833 * to check "search" mode, or a prior "search" mode after we've moved 834 * to a new "search" mode (which might become the new "active" mode). 835 */ 836 table = &lq_sta->lq; 837 tx_rate = le32_to_cpu(table->rs_table[0].rate_n_flags); 838 il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band, &tbl_type, &rs_idx); 839 if (il->band == NL80211_BAND_5GHZ) 840 rs_idx -= IL_FIRST_OFDM_RATE; 841 mac_flags = info->status.rates[0].flags; 842 mac_idx = info->status.rates[0].idx; 843 /* For HT packets, map MCS to PLCP */ 844 if (mac_flags & IEEE80211_TX_RC_MCS) { 845 mac_idx &= RATE_MCS_CODE_MSK; /* Remove # of streams */ 846 if (mac_idx >= (RATE_9M_IDX - IL_FIRST_OFDM_RATE)) 847 mac_idx++; 848 /* 849 * mac80211 HT idx is always zero-idxed; we need to move 850 * HT OFDM rates after CCK rates in 2.4 GHz band 851 */ 852 if (il->band == NL80211_BAND_2GHZ) 853 mac_idx += IL_FIRST_OFDM_RATE; 854 } 855 /* Here we actually compare this rate to the latest LQ command */ 856 if (mac_idx < 0 || 857 tbl_type.is_SGI != !!(mac_flags & IEEE80211_TX_RC_SHORT_GI) || 858 tbl_type.is_ht40 != !!(mac_flags & IEEE80211_TX_RC_40_MHZ_WIDTH) || 859 tbl_type.is_dup != !!(mac_flags & IEEE80211_TX_RC_DUP_DATA) || 860 tbl_type.ant_type != info->status.antenna || 861 !!(tx_rate & RATE_MCS_HT_MSK) != !!(mac_flags & IEEE80211_TX_RC_MCS) 862 || !!(tx_rate & RATE_MCS_GF_MSK) != 863 !!(mac_flags & IEEE80211_TX_RC_GREEN_FIELD) || rs_idx != mac_idx) { 864 D_RATE("initial rate %d does not match %d (0x%x)\n", mac_idx, 865 rs_idx, tx_rate); 866 /* 867 * Since rates mis-match, the last LQ command may have failed. 868 * After IL_MISSED_RATE_MAX mis-matches, resync the uCode with 869 * ... driver. 870 */ 871 lq_sta->missed_rate_counter++; 872 if (lq_sta->missed_rate_counter > IL_MISSED_RATE_MAX) { 873 lq_sta->missed_rate_counter = 0; 874 il_send_lq_cmd(il, &lq_sta->lq, CMD_ASYNC, false); 875 } 876 /* Regardless, ignore this status info for outdated rate */ 877 return; 878 } else 879 /* Rate did match, so reset the missed_rate_counter */ 880 lq_sta->missed_rate_counter = 0; 881 882 /* Figure out if rate scale algorithm is in active or search table */ 883 if (il4965_table_type_matches 884 (&tbl_type, &(lq_sta->lq_info[lq_sta->active_tbl]))) { 885 curr_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); 886 other_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); 887 } else 888 if (il4965_table_type_matches 889 (&tbl_type, &lq_sta->lq_info[1 - lq_sta->active_tbl])) { 890 curr_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); 891 other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); 892 } else { 893 D_RATE("Neither active nor search matches tx rate\n"); 894 tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); 895 D_RATE("active- lq:%x, ant:%x, SGI:%d\n", tmp_tbl->lq_type, 896 tmp_tbl->ant_type, tmp_tbl->is_SGI); 897 tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); 898 D_RATE("search- lq:%x, ant:%x, SGI:%d\n", tmp_tbl->lq_type, 899 tmp_tbl->ant_type, tmp_tbl->is_SGI); 900 D_RATE("actual- lq:%x, ant:%x, SGI:%d\n", tbl_type.lq_type, 901 tbl_type.ant_type, tbl_type.is_SGI); 902 /* 903 * no matching table found, let's by-pass the data collection 904 * and continue to perform rate scale to find the rate table 905 */ 906 il4965_rs_stay_in_table(lq_sta, true); 907 goto done; 908 } 909 910 /* 911 * Updating the frame history depends on whether packets were 912 * aggregated. 913 * 914 * For aggregation, all packets were transmitted at the same rate, the 915 * first idx into rate scale table. 916 */ 917 if (info->flags & IEEE80211_TX_STAT_AMPDU) { 918 tx_rate = le32_to_cpu(table->rs_table[0].rate_n_flags); 919 il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band, &tbl_type, 920 &rs_idx); 921 il4965_rs_collect_tx_data(curr_tbl, rs_idx, 922 info->status.ampdu_len, 923 info->status.ampdu_ack_len); 924 925 /* Update success/fail counts if not searching for new mode */ 926 if (lq_sta->stay_in_tbl) { 927 lq_sta->total_success += info->status.ampdu_ack_len; 928 lq_sta->total_failed += 929 (info->status.ampdu_len - 930 info->status.ampdu_ack_len); 931 } 932 } else { 933 /* 934 * For legacy, update frame history with for each Tx retry. 935 */ 936 retries = info->status.rates[0].count - 1; 937 /* HW doesn't send more than 15 retries */ 938 retries = min(retries, 15); 939 940 /* The last transmission may have been successful */ 941 legacy_success = !!(info->flags & IEEE80211_TX_STAT_ACK); 942 /* Collect data for each rate used during failed TX attempts */ 943 for (i = 0; i <= retries; ++i) { 944 tx_rate = le32_to_cpu(table->rs_table[i].rate_n_flags); 945 il4965_rs_get_tbl_info_from_mcs(tx_rate, il->band, 946 &tbl_type, &rs_idx); 947 /* 948 * Only collect stats if retried rate is in the same RS 949 * table as active/search. 950 */ 951 if (il4965_table_type_matches(&tbl_type, curr_tbl)) 952 tmp_tbl = curr_tbl; 953 else if (il4965_table_type_matches 954 (&tbl_type, other_tbl)) 955 tmp_tbl = other_tbl; 956 else 957 continue; 958 il4965_rs_collect_tx_data(tmp_tbl, rs_idx, 1, 959 i < 960 retries ? 0 : legacy_success); 961 } 962 963 /* Update success/fail counts if not searching for new mode */ 964 if (lq_sta->stay_in_tbl) { 965 lq_sta->total_success += legacy_success; 966 lq_sta->total_failed += retries + (1 - legacy_success); 967 } 968 } 969 /* The last TX rate is cached in lq_sta; it's set in if/else above */ 970 lq_sta->last_rate_n_flags = tx_rate; 971 done: 972 /* See if there's a better rate or modulation mode to try. */ 973 if (sta->deflink.supp_rates[sband->band]) 974 il4965_rs_rate_scale_perform(il, skb, sta, lq_sta); 975 } 976 977 /* 978 * Begin a period of staying with a selected modulation mode. 979 * Set "stay_in_tbl" flag to prevent any mode switches. 980 * Set frame tx success limits according to legacy vs. high-throughput, 981 * and reset overall (spanning all rates) tx success history stats. 982 * These control how long we stay using same modulation mode before 983 * searching for a new mode. 984 */ 985 static void 986 il4965_rs_set_stay_in_table(struct il_priv *il, u8 is_legacy, 987 struct il_lq_sta *lq_sta) 988 { 989 D_RATE("we are staying in the same table\n"); 990 lq_sta->stay_in_tbl = 1; /* only place this gets set */ 991 if (is_legacy) { 992 lq_sta->table_count_limit = IL_LEGACY_TBL_COUNT; 993 lq_sta->max_failure_limit = IL_LEGACY_FAILURE_LIMIT; 994 lq_sta->max_success_limit = IL_LEGACY_SUCCESS_LIMIT; 995 } else { 996 lq_sta->table_count_limit = IL_NONE_LEGACY_TBL_COUNT; 997 lq_sta->max_failure_limit = IL_NONE_LEGACY_FAILURE_LIMIT; 998 lq_sta->max_success_limit = IL_NONE_LEGACY_SUCCESS_LIMIT; 999 } 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->deflink.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 } 2800