ath9k: Use helpers

Break down huge functions, use helper functions or
macros instead.

Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
diff --git a/drivers/net/wireless/ath9k/rc.c b/drivers/net/wireless/ath9k/rc.c
index 51f51af..e118824 100644
--- a/drivers/net/wireless/ath9k/rc.c
+++ b/drivers/net/wireless/ath9k/rc.c
@@ -153,11 +153,6 @@
 	WLAN_RC_HT_FLAG,  /* Phy rates allowed initially */
 };
 
-/* VALID_ALL - valid for 20/40/Legacy,
- * VALID - Legacy only,
- * VALID_20 - HT 20 only,
- * VALID_40 - HT 40 only */
-
 /* 4ms frame limit not used for NG mode.  The values filled
  * for HT are the 64K max aggregate limit */
 
@@ -471,11 +466,10 @@
 	return ath_rc_priv->valid_rate_index[index];
 }
 
-static inline int
-ath_rc_get_nextvalid_txrate(struct ath_rate_table *rate_table,
-			    struct ath_rate_priv *ath_rc_priv,
-			    u8 cur_valid_txrate,
-			    u8 *next_idx)
+static inline int ath_rc_get_nextvalid_txrate(struct ath_rate_table *rate_table,
+					      struct ath_rate_priv *ath_rc_priv,
+					      u8 cur_valid_txrate,
+					      u8 *next_idx)
 {
 	u8 i;
 
@@ -488,6 +482,7 @@
 
 	/* No more valid rates */
 	*next_idx = 0;
+
 	return 0;
 }
 
@@ -522,13 +517,13 @@
 			return 1;
 		}
 	}
+
 	return 0;
 }
 
-static u8
-ath_rc_sib_init_validrates(struct ath_rate_priv *ath_rc_priv,
-			   struct ath_rate_table *rate_table,
-			   u32 capflag)
+static u8 ath_rc_init_validrates(struct ath_rate_priv *ath_rc_priv,
+				 struct ath_rate_table *rate_table,
+				 u32 capflag)
 {
 	u8 i, hi = 0;
 	u32 valid;
@@ -552,14 +547,14 @@
 			hi = A_MAX(hi, i);
 		}
 	}
+
 	return hi;
 }
 
-static u8
-ath_rc_sib_setvalid_rates(struct ath_rate_priv *ath_rc_priv,
-			  struct ath_rate_table *rate_table,
-			  struct ath_rateset *rateset,
-			  u32 capflag)
+static u8 ath_rc_setvalid_rates(struct ath_rate_priv *ath_rc_priv,
+				struct ath_rate_table *rate_table,
+				struct ath_rateset *rateset,
+				u32 capflag)
 {
 	u8 i, j, hi = 0;
 
@@ -570,17 +565,17 @@
 			u32 valid = (ath_rc_priv->single_stream ?
 				rate_table->info[j].valid_single_stream :
 				rate_table->info[j].valid);
+			u8 rate = rateset->rs_rates[i];
+			u8 dot11rate = rate_table->info[j].dot11rate;
 
 			/* We allow a rate only if its valid and the
 			 * capflag matches one of the validity
 			 * (VALID/VALID_20/VALID_40) flags */
 
-			if (((rateset->rs_rates[i] & 0x7F) ==
-				(rate_table->info[j].dot11rate & 0x7F)) &&
-				((valid & WLAN_RC_CAP_MODE(capflag)) ==
-				WLAN_RC_CAP_MODE(capflag)) &&
-				!WLAN_RC_PHY_HT(phy)) {
-
+			if (((rate & 0x7F) == (dot11rate & 0x7F)) &&
+			    ((valid & WLAN_RC_CAP_MODE(capflag)) ==
+			     WLAN_RC_CAP_MODE(capflag)) &&
+			    !WLAN_RC_PHY_HT(phy)) {
 				u8 valid_rate_count = 0;
 
 				if (!ath_rc_valid_phyrate(phy, capflag, 0))
@@ -597,27 +592,29 @@
 			}
 		}
 	}
+
 	return hi;
 }
 
-static u8
-ath_rc_sib_setvalid_htrates(struct ath_rate_priv *ath_rc_priv,
-			    struct ath_rate_table *rate_table,
-			    u8 *mcs_set, u32 capflag)
+static u8 ath_rc_setvalid_htrates(struct ath_rate_priv *ath_rc_priv,
+				  struct ath_rate_table *rate_table,
+				  u8 *mcs_set, u32 capflag)
 {
+	struct ath_rateset *rateset = (struct ath_rateset *)mcs_set;
+
 	u8 i, j, hi = 0;
 
 	/* Use intersection of working rates and valid rates */
-	for (i = 0; i <  ((struct ath_rateset *)mcs_set)->rs_nrates; i++) {
+	for (i = 0; i < rateset->rs_nrates; i++) {
 		for (j = 0; j < rate_table->rate_cnt; j++) {
 			u32 phy = rate_table->info[j].phy;
 			u32 valid = (ath_rc_priv->single_stream ?
 				     rate_table->info[j].valid_single_stream :
 				     rate_table->info[j].valid);
+			u8 rate = rateset->rs_rates[i];
+			u8 dot11rate = rate_table->info[j].dot11rate;
 
-			if (((((struct ath_rateset *)
-			       mcs_set)->rs_rates[i] & 0x7F) !=
-			     (rate_table->info[j].dot11rate & 0x7F)) ||
+			if (((rate & 0x7F) != (dot11rate & 0x7F)) ||
 			    !WLAN_RC_PHY_HT(phy) ||
 			    !WLAN_RC_PHY_HT_VALID(valid, capflag))
 				continue;
@@ -632,28 +629,10 @@
 			hi = A_MAX(hi, j);
 		}
 	}
+
 	return hi;
 }
 
-u8 ath_rate_findrateix(struct ath_softc *sc,
-		       u8 dot11rate)
-{
-	struct ath_rate_table *ratetable;
-	int i;
-
-	ratetable = sc->hw_rate_table[sc->sc_curmode];
-
-	if (WARN_ON(!ratetable))
-		return 0;
-
-	for (i = 0; i < ratetable->rate_cnt; i++) {
-		if ((ratetable->info[i].dot11rate & 0x7f) == (dot11rate & 0x7f))
-			return i;
-	}
-
-	return 0;
-}
-
 static u8 ath_rc_ratefind_ht(struct ath_softc *sc,
 			     struct ath_rate_priv *ath_rc_priv,
 			     struct ath_rate_table *rate_table,
@@ -784,9 +763,7 @@
 
 static void ath_rc_rate_set_series(struct ath_rate_table *rate_table ,
 				   struct ieee80211_tx_rate *rate,
-				   u8 tries,
-				   u8 rix,
-				   int rtsctsenable)
+				   u8 tries, u8 rix, int rtsctsenable)
 {
 	rate->count = tries;
 	rate->idx = rix;
@@ -911,15 +888,16 @@
 	}
 }
 
-static void ath_rc_update_ht(struct ath_softc *sc,
-			     struct ath_rate_priv *ath_rc_priv,
-			     struct ath_tx_info_priv *tx_info_priv,
-			     int tx_rate, int xretries, int retries)
+static bool ath_rc_update_per(struct ath_softc *sc,
+			      struct ath_rate_table *rate_table,
+			      struct ath_rate_priv *ath_rc_priv,
+			      struct ath_tx_info_priv *tx_info_priv,
+			      int tx_rate, int xretries, int retries,
+			      u32 now_msec)
 {
-	u32 now_msec = jiffies_to_msecs(jiffies);
-	int state_change = 0, rate, count;
+	bool state_change = false;
+	int count;
 	u8 last_per;
-	struct ath_rate_table *rate_table = sc->hw_rate_table[sc->sc_curmode];
 	static u32 nretry_to_per_lookup[10] = {
 		100 * 0 / 1,
 		100 * 1 / 4,
@@ -933,24 +911,9 @@
 		100 * 9 / 10
 	};
 
-	if (!ath_rc_priv)
-		return;
-
-	ASSERT(tx_rate >= 0);
-	if (tx_rate < 0)
-		return;
-
-	/* To compensate for some imbalance between ctrl and ext. channel */
-
-	if (WLAN_RC_PHY_40(rate_table->info[tx_rate].phy))
-		tx_info_priv->tx.ts_rssi =
-			tx_info_priv->tx.ts_rssi < 3 ? 0 :
-			tx_info_priv->tx.ts_rssi - 3;
-
 	last_per = ath_rc_priv->state[tx_rate].per;
 
 	if (xretries) {
-		/* Update the PER. */
 		if (xretries == 1) {
 			ath_rc_priv->state[tx_rate].per += 30;
 			if (ath_rc_priv->state[tx_rate].per > 100)
@@ -960,11 +923,10 @@
 			count = ARRAY_SIZE(nretry_to_per_lookup);
 			if (retries >= count)
 				retries = count - 1;
+
 			/* new_PER = 7/8*old_PER + 1/8*(currentPER) */
 			ath_rc_priv->state[tx_rate].per =
-				(u8)(ath_rc_priv->state[tx_rate].per -
-				     (ath_rc_priv->state[tx_rate].per >> 3) +
-				     ((100) >> 3));
+				(u8)(last_per - (last_per >> 3) + (100 >> 3));
 		}
 
 		/* xretries == 1 or 2 */
@@ -972,12 +934,11 @@
 		if (ath_rc_priv->probe_rate == tx_rate)
 			ath_rc_priv->probe_rate = 0;
 
-	} else {	/* xretries == 0 */
-		/* Update the PER. */
-		/* Make sure it doesn't index out of array's bounds. */
+	} else { /* xretries == 0 */
 		count = ARRAY_SIZE(nretry_to_per_lookup);
 		if (retries >= count)
 			retries = count - 1;
+
 		if (tx_info_priv->n_bad_frames) {
 			/* new_PER = 7/8*old_PER + 1/8*(currentPER)
 			 * Assuming that n_frames is not 0.  The current PER
@@ -991,22 +952,21 @@
 			 * the above PER.  The expression below is a
 			 * simplified version of the sum of these two terms.
 			 */
-			if (tx_info_priv->n_frames > 0)
-				ath_rc_priv->state[tx_rate].per
-				      = (u8)
-					(ath_rc_priv->state[tx_rate].per -
-					(ath_rc_priv->state[tx_rate].per >> 3) +
-					((100*(retries*tx_info_priv->n_frames +
-					tx_info_priv->n_bad_frames) /
-					(tx_info_priv->n_frames *
-						(retries+1))) >> 3));
-		} else {
-			/* new_PER = 7/8*old_PER + 1/8*(currentPER) */
+			if (tx_info_priv->n_frames > 0) {
+				int n_frames, n_bad_frames;
+				u8 cur_per, new_per;
 
-			ath_rc_priv->state[tx_rate].per = (u8)
-				(ath_rc_priv->state[tx_rate].per -
-				(ath_rc_priv->state[tx_rate].per >> 3) +
-				(nretry_to_per_lookup[retries] >> 3));
+				n_bad_frames = retries * tx_info_priv->n_frames +
+					tx_info_priv->n_bad_frames;
+				n_frames = tx_info_priv->n_frames * (retries + 1);
+				cur_per = (100 * n_bad_frames / n_frames) >> 3;
+				new_per = (u8)(last_per - (last_per >> 3) + cur_per);
+				ath_rc_priv->state[tx_rate].per = new_per;
+			}
+		} else {
+			ath_rc_priv->state[tx_rate].per =
+				(u8)(last_per - (last_per >> 3) +
+				     (nretry_to_per_lookup[retries] >> 3));
 		}
 
 		ath_rc_priv->rssi_last_prev2 = ath_rc_priv->rssi_last_prev;
@@ -1018,7 +978,6 @@
 		 * If we got at most one retry then increase the max rate if
 		 * this was a probe.  Otherwise, ignore the probe.
 		 */
-
 		if (ath_rc_priv->probe_rate && ath_rc_priv->probe_rate == tx_rate) {
 			if (retries > 0 || 2 * tx_info_priv->n_bad_frames >
 				tx_info_priv->n_frames) {
@@ -1033,7 +992,8 @@
 			} else {
 				u8 probe_rate = 0;
 
-				ath_rc_priv->rate_max_phy = ath_rc_priv->probe_rate;
+				ath_rc_priv->rate_max_phy =
+					ath_rc_priv->probe_rate;
 				probe_rate = ath_rc_priv->probe_rate;
 
 				if (ath_rc_priv->state[probe_rate].per > 30)
@@ -1047,8 +1007,8 @@
 				 * to move up faster if the probes are
 				 * succesful.
 				 */
-				ath_rc_priv->probe_time = now_msec -
-					rate_table->probe_interval / 2;
+				ath_rc_priv->probe_time =
+					now_msec - rate_table->probe_interval / 2;
 			}
 		}
 
@@ -1064,6 +1024,10 @@
 			 */
 			ath_rc_priv->hw_maxretry_pktcnt = 0;
 		} else {
+			int32_t rssi_ackAvg;
+			int8_t rssi_thres;
+			int8_t rssi_ack_vmin;
+
 			/*
 			 * It worked with no retries. First ignore bogus (small)
 			 * rssi_ack values.
@@ -1073,46 +1037,82 @@
 				ath_rc_priv->hw_maxretry_pktcnt++;
 			}
 
-			if (tx_info_priv->tx.ts_rssi >=
-				rate_table->info[tx_rate].rssi_ack_validmin) {
-				/* Average the rssi */
-				if (tx_rate != ath_rc_priv->rssi_sum_rate) {
-					ath_rc_priv->rssi_sum_rate = tx_rate;
-					ath_rc_priv->rssi_sum =
-						ath_rc_priv->rssi_sum_cnt = 0;
-				}
+			if (tx_info_priv->tx.ts_rssi <
+			    rate_table->info[tx_rate].rssi_ack_validmin)
+				goto exit;
 
-				ath_rc_priv->rssi_sum += tx_info_priv->tx.ts_rssi;
-				ath_rc_priv->rssi_sum_cnt++;
-
-				if (ath_rc_priv->rssi_sum_cnt > 4) {
-					int32_t rssi_ackAvg =
-						(ath_rc_priv->rssi_sum + 2) / 4;
-					int8_t rssi_thres =
-						ath_rc_priv->state[tx_rate].
-						rssi_thres;
-					int8_t rssi_ack_vmin =
-						rate_table->info[tx_rate].
-						rssi_ack_validmin;
-
-					ath_rc_priv->rssi_sum =
-						ath_rc_priv->rssi_sum_cnt = 0;
-
-					/* Now reduce the current
-					 * rssi threshold. */
-					if ((rssi_ackAvg < rssi_thres + 2) &&
-					    (rssi_thres > rssi_ack_vmin)) {
-						ath_rc_priv->state[tx_rate].
-							rssi_thres--;
-					}
-
-					state_change = 1;
-				}
+			/* Average the rssi */
+			if (tx_rate != ath_rc_priv->rssi_sum_rate) {
+				ath_rc_priv->rssi_sum_rate = tx_rate;
+				ath_rc_priv->rssi_sum =
+					ath_rc_priv->rssi_sum_cnt = 0;
 			}
+
+			ath_rc_priv->rssi_sum += tx_info_priv->tx.ts_rssi;
+			ath_rc_priv->rssi_sum_cnt++;
+
+			if (ath_rc_priv->rssi_sum_cnt < 4)
+				goto exit;
+
+			rssi_ackAvg =
+				(ath_rc_priv->rssi_sum + 2) / 4;
+			rssi_thres =
+				ath_rc_priv->state[tx_rate].rssi_thres;
+			rssi_ack_vmin =
+				rate_table->info[tx_rate].rssi_ack_validmin;
+
+			ath_rc_priv->rssi_sum =
+				ath_rc_priv->rssi_sum_cnt = 0;
+
+			/* Now reduce the current rssi threshold */
+			if ((rssi_ackAvg < rssi_thres + 2) &&
+			    (rssi_thres > rssi_ack_vmin)) {
+				ath_rc_priv->state[tx_rate].rssi_thres--;
+			}
+
+			state_change = true;
 		}
 	}
+exit:
+	return state_change;
+}
 
-	/* For all cases */
+/* Update PER, RSSI and whatever else that the code thinks it is doing.
+   If you can make sense of all this, you really need to go out more. */
+
+static void ath_rc_update_ht(struct ath_softc *sc,
+			     struct ath_rate_priv *ath_rc_priv,
+			     struct ath_tx_info_priv *tx_info_priv,
+			     int tx_rate, int xretries, int retries)
+{
+#define CHK_RSSI(rate)					\
+	((ath_rc_priv->state[(rate)].rssi_thres +	\
+	  rate_table->info[(rate)].rssi_ack_deltamin) > \
+	 ath_rc_priv->state[(rate)+1].rssi_thres)
+
+	u32 now_msec = jiffies_to_msecs(jiffies);
+	int rate;
+	u8 last_per;
+	bool state_change = false;
+	struct ath_rate_table *rate_table = sc->hw_rate_table[sc->sc_curmode];
+	int size = ath_rc_priv->rate_table_size;
+
+	if ((tx_rate < 0) || (tx_rate > rate_table->rate_cnt))
+		return;
+
+	/* To compensate for some imbalance between ctrl and ext. channel */
+
+	if (WLAN_RC_PHY_40(rate_table->info[tx_rate].phy))
+		tx_info_priv->tx.ts_rssi =
+			tx_info_priv->tx.ts_rssi < 3 ? 0 :
+			tx_info_priv->tx.ts_rssi - 3;
+
+	last_per = ath_rc_priv->state[tx_rate].per;
+
+	/* Update PER first */
+	state_change = ath_rc_update_per(sc, rate_table, ath_rc_priv,
+					 tx_info_priv, tx_rate, xretries,
+					 retries, now_msec);
 
 	/*
 	 * If this rate looks bad (high PER) then stop using it for
@@ -1122,7 +1122,7 @@
 	    rate_table->info[tx_rate].ratekbps <=
 	    rate_table->info[ath_rc_priv->rate_max_phy].ratekbps) {
 		ath_rc_get_nextlowervalid_txrate(rate_table, ath_rc_priv,
-				 (u8) tx_rate, &ath_rc_priv->rate_max_phy);
+				 (u8)tx_rate, &ath_rc_priv->rate_max_phy);
 
 		/* Don't probe for a little while. */
 		ath_rc_priv->probe_time = now_msec;
@@ -1136,20 +1136,15 @@
 		 *         made to keep the rssi thresholds monotonically
 		 *         increasing between the CCK and OFDM rates.)
 		 */
-		for (rate = tx_rate; rate <
-				ath_rc_priv->rate_table_size - 1; rate++) {
+		for (rate = tx_rate; rate < size - 1; rate++) {
 			if (rate_table->info[rate+1].phy !=
-				rate_table->info[tx_rate].phy)
+			    rate_table->info[tx_rate].phy)
 				break;
 
-			if (ath_rc_priv->state[rate].rssi_thres +
-			    rate_table->info[rate].rssi_ack_deltamin >
-			    ath_rc_priv->state[rate+1].rssi_thres) {
+			if (CHK_RSSI(rate)) {
 				ath_rc_priv->state[rate+1].rssi_thres =
-					ath_rc_priv->state[rate].
-					rssi_thres +
-					rate_table->info[rate].
-					rssi_ack_deltamin;
+					ath_rc_priv->state[rate].rssi_thres +
+					rate_table->info[rate].rssi_ack_deltamin;
 			}
 		}
 
@@ -1159,27 +1154,20 @@
 			    rate_table->info[tx_rate].phy)
 				break;
 
-			if (ath_rc_priv->state[rate].rssi_thres +
-			    rate_table->info[rate].rssi_ack_deltamin >
-			    ath_rc_priv->state[rate+1].rssi_thres) {
+			if (CHK_RSSI(rate)) {
 				if (ath_rc_priv->state[rate+1].rssi_thres <
-				    rate_table->info[rate].
-				    rssi_ack_deltamin)
+				    rate_table->info[rate].rssi_ack_deltamin)
 					ath_rc_priv->state[rate].rssi_thres = 0;
 				else {
 					ath_rc_priv->state[rate].rssi_thres =
-						ath_rc_priv->state[rate+1].
-						rssi_thres -
-						rate_table->info[rate].
-						rssi_ack_deltamin;
+					ath_rc_priv->state[rate+1].rssi_thres -
+					rate_table->info[rate].rssi_ack_deltamin;
 				}
 
 				if (ath_rc_priv->state[rate].rssi_thres <
-				    rate_table->info[rate].
-				    rssi_ack_validmin) {
+				    rate_table->info[rate].rssi_ack_validmin) {
 					ath_rc_priv->state[rate].rssi_thres =
-						rate_table->info[rate].
-						rssi_ack_validmin;
+					rate_table->info[rate].rssi_ack_validmin;
 				}
 			}
 		}
@@ -1202,8 +1190,9 @@
 	}
 
 	/* Maintain monotonicity for rates above the current rate */
-	for (rate = tx_rate; rate < ath_rc_priv->rate_table_size - 1; rate++) {
-		if (ath_rc_priv->state[rate+1].per < ath_rc_priv->state[rate].per)
+	for (rate = tx_rate; rate < size - 1; rate++) {
+		if (ath_rc_priv->state[rate+1].per <
+		    ath_rc_priv->state[rate].per)
 			ath_rc_priv->state[rate+1].per =
 				ath_rc_priv->state[rate].per;
 	}
@@ -1213,7 +1202,7 @@
 	if (now_msec - ath_rc_priv->rssi_down_time >=
 	    rate_table->rssi_reduce_interval) {
 
-		for (rate = 0; rate < ath_rc_priv->rate_table_size; rate++) {
+		for (rate = 0; rate < size; rate++) {
 			if (ath_rc_priv->state[rate].rssi_thres >
 			    rate_table->info[rate].rssi_ack_validmin)
 				ath_rc_priv->state[rate].rssi_thres -= 1;
@@ -1225,13 +1214,33 @@
 	 * and PER (different for CCK and OFDM). */
 	if (now_msec - ath_rc_priv->per_down_time >=
 	    rate_table->rssi_reduce_interval) {
-		for (rate = 0; rate < ath_rc_priv->rate_table_size; rate++) {
+		for (rate = 0; rate < size; rate++) {
 			ath_rc_priv->state[rate].per =
 				7 * ath_rc_priv->state[rate].per / 8;
 		}
 
 		ath_rc_priv->per_down_time = now_msec;
 	}
+
+#undef CHK_RSSI
+}
+
+static int ath_rc_get_rateindex(struct ath_rate_table *rate_table,
+				struct ieee80211_tx_rate *rate)
+{
+	int rix;
+
+	if ((rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH) &&
+	    (rate->flags & IEEE80211_TX_RC_SHORT_GI))
+		rix = rate_table->info[rate->idx].ht_index;
+	else if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
+		rix = rate_table->info[rate->idx].sgi_index;
+	else if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
+		rix = rate_table->info[rate->idx].cw40index;
+	else
+		rix = rate_table->info[rate->idx].base_index;
+
+	return rix;
 }
 
 static void ath_rc_tx_status(struct ath_softc *sc,
@@ -1243,7 +1252,7 @@
 	struct ath_rate_table *rate_table;
 	struct ieee80211_tx_rate *rates = tx_info->status.rates;
 	u8 flags;
-	u32 series = 0, rix;
+	u32 i = 0, rix;
 
 	rate_table = sc->hw_rate_table[sc->sc_curmode];
 
@@ -1253,32 +1262,22 @@
 	 */
 	if (final_ts_idx != 0) {
 		/* Process intermediate rates that failed.*/
-		for (series = 0; series < final_ts_idx ; series++) {
-			if (rates[series].count != 0 && (rates[series].idx >= 0)) {
-				flags = rates[series].flags;
+		for (i = 0; i < final_ts_idx ; i++) {
+			if (rates[i].count != 0 && (rates[i].idx >= 0)) {
+				flags = rates[i].flags;
+
 				/* If HT40 and we have switched mode from
 				 * 40 to 20 => don't update */
+
 				if ((flags & IEEE80211_TX_RC_40_MHZ_WIDTH) &&
 				    (ath_rc_priv->rc_phy_mode != WLAN_RC_40_FLAG))
 					return;
 
-				if ((flags & IEEE80211_TX_RC_40_MHZ_WIDTH) &&
-					(flags & IEEE80211_TX_RC_SHORT_GI))
-					rix = rate_table->info[
-						rates[series].idx].ht_index;
-				else if (flags & IEEE80211_TX_RC_SHORT_GI)
-					rix = rate_table->info[
-						rates[series].idx].sgi_index;
-				else if (flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
-					rix = rate_table->info[
-						rates[series].idx].cw40index;
-				else
-					rix = rate_table->info[
-						rates[series].idx].base_index;
+				rix = ath_rc_get_rateindex(rate_table, &rates[i]);
 				ath_rc_update_ht(sc, ath_rc_priv,
 						tx_info_priv, rix,
 						xretries ? 1 : 2,
-						rates[series].count);
+						rates[i].count);
 			}
 		}
 	} else {
@@ -1292,24 +1291,17 @@
 			xretries = 2;
 	}
 
-	flags = rates[series].flags;
+	flags = rates[i].flags;
+
 	/* If HT40 and we have switched mode from 40 to 20 => don't update */
 	if ((flags & IEEE80211_TX_RC_40_MHZ_WIDTH) &&
 	    (ath_rc_priv->rc_phy_mode != WLAN_RC_40_FLAG)) {
 		return;
 	}
 
-	if ((flags & IEEE80211_TX_RC_40_MHZ_WIDTH) && (flags & IEEE80211_TX_RC_SHORT_GI))
-		rix = rate_table->info[rates[series].idx].ht_index;
-	else if (flags & IEEE80211_TX_RC_SHORT_GI)
-		rix = rate_table->info[rates[series].idx].sgi_index;
-	else if (flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
-		rix = rate_table->info[rates[series].idx].cw40index;
-	else
-		rix = rate_table->info[rates[series].idx].base_index;
-
+	rix = ath_rc_get_rateindex(rate_table, &rates[i]);
 	ath_rc_update_ht(sc, ath_rc_priv, tx_info_priv, rix,
-		xretries, long_retry);
+			 xretries, long_retry);
 }
 
 static void ath_rc_init(struct ath_softc *sc,
@@ -1362,14 +1354,14 @@
 
 	if (!rateset->rs_nrates) {
 		/* No working rate, just initialize valid rates */
-		hi = ath_rc_sib_init_validrates(ath_rc_priv, rate_table,
+		hi = ath_rc_init_validrates(ath_rc_priv, rate_table,
 						ath_rc_priv->ht_cap);
 	} else {
 		/* Use intersection of working rates and valid rates */
-		hi = ath_rc_sib_setvalid_rates(ath_rc_priv, rate_table,
+		hi = ath_rc_setvalid_rates(ath_rc_priv, rate_table,
 					       rateset, ath_rc_priv->ht_cap);
 		if (ath_rc_priv->ht_cap & WLAN_RC_HT_FLAG) {
-			hthi = ath_rc_sib_setvalid_htrates(ath_rc_priv,
+			hthi = ath_rc_setvalid_htrates(ath_rc_priv,
 							   rate_table,
 							   ht_mcs,
 							   ath_rc_priv->ht_cap);
diff --git a/drivers/net/wireless/ath9k/rc.h b/drivers/net/wireless/ath9k/rc.h
index dff4b7a..297dff9 100644
--- a/drivers/net/wireless/ath9k/rc.h
+++ b/drivers/net/wireless/ath9k/rc.h
@@ -27,6 +27,11 @@
 #define RATE_TABLE_SIZE  64
 #define MAX_TX_RATE_PHY  48
 
+/* VALID_ALL - valid for 20/40/Legacy,
+ * VALID - Legacy only,
+ * VALID_20 - HT 20 only,
+ * VALID_40 - HT 40 only */
+
 #define INVALID    0x0
 #define VALID      0x1
 #define VALID_20   0x2