Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7d326ac authored by Tomas Winkler's avatar Tomas Winkler Committed by John W. Linville
Browse files

iwlwifi: move rate helpers to iwlcore



This patch moves rate helpers to iwlcore.

Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 2a421b91
Loading
Loading
Loading
Loading
+0 −13
Original line number Original line Diff line number Diff line
@@ -793,19 +793,6 @@ enum {


/********************* END TXPOWER *****************************************/
/********************* END TXPOWER *****************************************/


static inline u8 iwl4965_hw_get_rate(__le32 rate_n_flags)
{
	return le32_to_cpu(rate_n_flags) & 0xFF;
}
static inline u32 iwl4965_hw_get_rate_n_flags(__le32 rate_n_flags)
{
	return le32_to_cpu(rate_n_flags) & 0x1FFFF;
}
static inline __le32 iwl4965_hw_set_rate_n_flags(u8 rate, u16 flags)
{
	return cpu_to_le32(flags|(u16)rate);
}



/**
/**
 * Tx/Rx Queues
 * Tx/Rx Queues
+3 −5
Original line number Original line Diff line number Diff line
@@ -536,7 +536,7 @@ static int rs_get_tbl_info_from_mcs(const u32 rate_n_flags,
	u8 num_of_ant = get_num_of_ant_from_rate(rate_n_flags);
	u8 num_of_ant = get_num_of_ant_from_rate(rate_n_flags);
	u8 mcs;
	u8 mcs;


	*rate_idx = iwl4965_hwrate_to_plcp_idx(rate_n_flags);
	*rate_idx = iwl_hwrate_to_plcp_idx(rate_n_flags);


	if (*rate_idx  == IWL_RATE_INVALID) {
	if (*rate_idx  == IWL_RATE_INVALID) {
		*rate_idx = -1;
		*rate_idx = -1;
@@ -1811,8 +1811,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
			tbl = &(lq_sta->lq_info[active_tbl]);
			tbl = &(lq_sta->lq_info[active_tbl]);


			/* Revert to "active" rate and throughput info */
			/* Revert to "active" rate and throughput info */
			index = iwl4965_hwrate_to_plcp_idx(
			index = iwl_hwrate_to_plcp_idx(tbl->current_rate);
							tbl->current_rate);
			current_tpt = lq_sta->last_tpt;
			current_tpt = lq_sta->last_tpt;


			/* Need to set up a new rate table in uCode */
			/* Need to set up a new rate table in uCode */
@@ -1966,8 +1965,7 @@ lq_update:
				rs_rate_scale_clear_window(&(tbl->win[i]));
				rs_rate_scale_clear_window(&(tbl->win[i]));


			/* Use new "search" start rate */
			/* Use new "search" start rate */
			index = iwl4965_hwrate_to_plcp_idx(
			index = iwl_hwrate_to_plcp_idx(tbl->current_rate);
							tbl->current_rate);


			IWL_DEBUG_RATE("Switch current  mcs: %X index: %d\n",
			IWL_DEBUG_RATE("Switch current  mcs: %X index: %d\n",
				     tbl->current_rate, index);
				     tbl->current_rate, index);
+0 −2
Original line number Original line Diff line number Diff line
@@ -286,8 +286,6 @@ static inline u8 iwl4965_get_prev_ieee_rate(u8 rate_index)
	return rate;
	return rate;
}
}


extern int iwl4965_hwrate_to_plcp_idx(u32 rate_n_flags);

/**
/**
 * iwl4965_fill_rs_info - Fill an output text buffer with the rate representation
 * iwl4965_fill_rs_info - Fill an output text buffer with the rate representation
 *
 *
+11 −68
Original line number Original line Diff line number Diff line
@@ -307,60 +307,6 @@ static int is_fat_channel(__le32 rxon_flags)
		(rxon_flags & RXON_FLG_CHANNEL_MODE_MIXED_MSK);
		(rxon_flags & RXON_FLG_CHANNEL_MODE_MIXED_MSK);
}
}


int iwl4965_hwrate_to_plcp_idx(u32 rate_n_flags)
{
	int idx = 0;

	/* 4965 HT rate format */
	if (rate_n_flags & RATE_MCS_HT_MSK) {
		idx = (rate_n_flags & 0xff);

		if (idx >= IWL_RATE_MIMO2_6M_PLCP)
			idx = idx - IWL_RATE_MIMO2_6M_PLCP;

		idx += IWL_FIRST_OFDM_RATE;
		/* skip 9M not supported in ht*/
		if (idx >= IWL_RATE_9M_INDEX)
			idx += 1;
		if ((idx >= IWL_FIRST_OFDM_RATE) && (idx <= IWL_LAST_OFDM_RATE))
			return idx;

	/* 4965 legacy rate format, search for match in table */
	} else {
		for (idx = 0; idx < ARRAY_SIZE(iwl_rates); idx++)
			if (iwl_rates[idx].plcp == (rate_n_flags & 0xFF))
				return idx;
	}

	return -1;
}

/**
 * translate ucode response to mac80211 tx status control values
 */
void iwl4965_hwrate_to_tx_control(struct iwl_priv *priv, u32 rate_n_flags,
				  struct ieee80211_tx_info *control)
{
	int rate_index;

	control->antenna_sel_tx =
		((rate_n_flags & RATE_MCS_ANT_ABC_MSK) >> RATE_MCS_ANT_POS);
	if (rate_n_flags & RATE_MCS_HT_MSK)
		control->flags |= IEEE80211_TX_CTL_OFDM_HT;
	if (rate_n_flags & RATE_MCS_GF_MSK)
		control->flags |= IEEE80211_TX_CTL_GREEN_FIELD;
	if (rate_n_flags & RATE_MCS_FAT_MSK)
		control->flags |= IEEE80211_TX_CTL_40_MHZ_WIDTH;
	if (rate_n_flags & RATE_MCS_DUP_MSK)
		control->flags |= IEEE80211_TX_CTL_DUP_DATA;
	if (rate_n_flags & RATE_MCS_SGI_MSK)
		control->flags |= IEEE80211_TX_CTL_SHORT_GI;
	rate_index = iwl4965_hwrate_to_plcp_idx(rate_n_flags);
	if (control->band == IEEE80211_BAND_5GHZ)
		rate_index -= IWL_FIRST_OFDM_RATE;
	control->tx_rate_idx = rate_index;
}

/*
/*
 * EEPROM handlers
 * EEPROM handlers
 */
 */
@@ -1796,10 +1742,10 @@ unsigned int iwl4965_hw_get_beacon_cmd(struct iwl_priv *priv,


	if ((rate == IWL_RATE_1M_PLCP) || (rate >= IWL_RATE_2M_PLCP))
	if ((rate == IWL_RATE_1M_PLCP) || (rate >= IWL_RATE_2M_PLCP))
		tx_beacon_cmd->tx.rate_n_flags =
		tx_beacon_cmd->tx.rate_n_flags =
			iwl4965_hw_set_rate_n_flags(rate, RATE_MCS_CCK_MSK);
			iwl_hw_set_rate_n_flags(rate, RATE_MCS_CCK_MSK);
	else
	else
		tx_beacon_cmd->tx.rate_n_flags =
		tx_beacon_cmd->tx.rate_n_flags =
			iwl4965_hw_set_rate_n_flags(rate, 0);
			iwl_hw_set_rate_n_flags(rate, 0);


	tx_beacon_cmd->tx.tx_flags = (TX_CMD_FLG_SEQ_CTL_MSK |
	tx_beacon_cmd->tx.tx_flags = (TX_CMD_FLG_SEQ_CTL_MSK |
				TX_CMD_FLG_TSF_MSK | TX_CMD_FLG_STA_RATE_MSK);
				TX_CMD_FLG_TSF_MSK | TX_CMD_FLG_STA_RATE_MSK);
@@ -2568,7 +2514,7 @@ static void iwl4965_dbg_report_frame(struct iwl_priv *priv,
		else
		else
			title = "Frame";
			title = "Frame";


		rate_idx = iwl4965_hwrate_to_plcp_idx(rate_sym);
		rate_idx = iwl_hwrate_to_plcp_idx(rate_sym);
		if (unlikely(rate_idx == -1))
		if (unlikely(rate_idx == -1))
			bitrate = 0;
			bitrate = 0;
		else
		else
@@ -2633,7 +2579,7 @@ void iwl4965_rx_reply_rx(struct iwl_priv *priv,
	rx_status.band = (rx_start->phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ?
	rx_status.band = (rx_start->phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ?
				IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ;
				IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ;
	rx_status.rate_idx =
	rx_status.rate_idx =
		iwl4965_hwrate_to_plcp_idx(le32_to_cpu(rx_start->rate_n_flags));
		iwl_hwrate_to_plcp_idx(le32_to_cpu(rx_start->rate_n_flags));
	if (rx_status.band == IEEE80211_BAND_5GHZ)
	if (rx_status.band == IEEE80211_BAND_5GHZ)
		rx_status.rate_idx -= IWL_FIRST_OFDM_RATE;
		rx_status.rate_idx -= IWL_FIRST_OFDM_RATE;


@@ -2842,7 +2788,7 @@ static int iwl4965_tx_status_reply_compressed_ba(struct iwl_priv *priv,
	info->flags |= IEEE80211_TX_STAT_AMPDU;
	info->flags |= IEEE80211_TX_STAT_AMPDU;
	info->status.ampdu_ack_map = successes;
	info->status.ampdu_ack_map = successes;
	info->status.ampdu_ack_len = agg->frame_count;
	info->status.ampdu_ack_len = agg->frame_count;
	iwl4965_hwrate_to_tx_control(priv, agg->rate_n_flags, info);
	iwl_hwrate_to_tx_control(priv, agg->rate_n_flags, info);


	IWL_DEBUG_TX_REPLY("Bitmap %llx\n", (unsigned long long)bitmap);
	IWL_DEBUG_TX_REPLY("Bitmap %llx\n", (unsigned long long)bitmap);


@@ -3189,15 +3135,15 @@ static int iwl4965_tx_status_reply_tx(struct iwl_priv *priv,
	struct agg_tx_status *frame_status = tx_resp->u.agg_status;
	struct agg_tx_status *frame_status = tx_resp->u.agg_status;
	struct ieee80211_tx_info *info = NULL;
	struct ieee80211_tx_info *info = NULL;
	struct ieee80211_hdr *hdr = NULL;
	struct ieee80211_hdr *hdr = NULL;
	u32 rate_n_flags = le32_to_cpu(tx_resp->rate_n_flags);
	int i, sh, idx;
	int i, sh, idx;
	u16 seq;
	u16 seq;

	if (agg->wait_for_ba)
	if (agg->wait_for_ba)
		IWL_DEBUG_TX_REPLY("got tx response w/o block-ack\n");
		IWL_DEBUG_TX_REPLY("got tx response w/o block-ack\n");


	agg->frame_count = tx_resp->frame_count;
	agg->frame_count = tx_resp->frame_count;
	agg->start_idx = start_idx;
	agg->start_idx = start_idx;
	agg->rate_n_flags = le32_to_cpu(tx_resp->rate_n_flags);
	agg->rate_n_flags = rate_n_flags;
	agg->bitmap = 0;
	agg->bitmap = 0;


	/* # frames attempted by Tx command */
	/* # frames attempted by Tx command */
@@ -3215,15 +3161,12 @@ static int iwl4965_tx_status_reply_tx(struct iwl_priv *priv,
		info->flags &= ~IEEE80211_TX_CTL_AMPDU;
		info->flags &= ~IEEE80211_TX_CTL_AMPDU;
		info->flags |= iwl_is_tx_success(status)?
		info->flags |= iwl_is_tx_success(status)?
			IEEE80211_TX_STAT_ACK : 0;
			IEEE80211_TX_STAT_ACK : 0;
		iwl4965_hwrate_to_tx_control(priv,
		iwl_hwrate_to_tx_control(priv, rate_n_flags, info);
					     le32_to_cpu(tx_resp->rate_n_flags),
					     info);
		/* FIXME: code repetition end */
		/* FIXME: code repetition end */


		IWL_DEBUG_TX_REPLY("1 Frame 0x%x failure :%d\n",
		IWL_DEBUG_TX_REPLY("1 Frame 0x%x failure :%d\n",
				    status & 0xff, tx_resp->failure_frame);
				    status & 0xff, tx_resp->failure_frame);
		IWL_DEBUG_TX_REPLY("Rate Info rate_n_flags=%x\n",
		IWL_DEBUG_TX_REPLY("Rate Info rate_n_flags=%x\n", rate_n_flags);
			iwl4965_hw_get_rate_n_flags(tx_resp->rate_n_flags));


		agg->wait_for_ba = 0;
		agg->wait_for_ba = 0;
	} else {
	} else {
@@ -3281,7 +3224,6 @@ static int iwl4965_tx_status_reply_tx(struct iwl_priv *priv,


		agg->bitmap = bitmap;
		agg->bitmap = bitmap;
		agg->start_idx = start;
		agg->start_idx = start;
		agg->rate_n_flags = le32_to_cpu(tx_resp->rate_n_flags);
		IWL_DEBUG_TX_REPLY("Frames %d start_idx=%d bitmap=0x%llx\n",
		IWL_DEBUG_TX_REPLY("Frames %d start_idx=%d bitmap=0x%llx\n",
				   agg->frame_count, agg->start_idx,
				   agg->frame_count, agg->start_idx,
				   (unsigned long long)agg->bitmap);
				   (unsigned long long)agg->bitmap);
@@ -3375,7 +3317,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
		info->status.retry_count = tx_resp->failure_frame;
		info->status.retry_count = tx_resp->failure_frame;
		info->flags |=
		info->flags |=
			iwl_is_tx_success(status) ? IEEE80211_TX_STAT_ACK : 0;
			iwl_is_tx_success(status) ? IEEE80211_TX_STAT_ACK : 0;
		iwl4965_hwrate_to_tx_control(priv,
		iwl_hwrate_to_tx_control(priv,
					le32_to_cpu(tx_resp->rate_n_flags),
					le32_to_cpu(tx_resp->rate_n_flags),
					info);
					info);


@@ -3386,6 +3328,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
				tx_resp->failure_frame);
				tx_resp->failure_frame);


		IWL_DEBUG_TX_REPLY("Tx queue reclaim %d\n", index);
		IWL_DEBUG_TX_REPLY("Tx queue reclaim %d\n", index);

		if (index != -1) {
		if (index != -1) {
		    int freed = iwl_tx_queue_reclaim(priv, txq_id, index);
		    int freed = iwl_tx_queue_reclaim(priv, txq_id, index);
		    if (tid != MAX_TID_COUNT)
		    if (tid != MAX_TID_COUNT)
+6 −8
Original line number Original line Diff line number Diff line
@@ -1139,6 +1139,7 @@ static int iwl5000_tx_status_reply_tx(struct iwl_priv *priv,
	struct agg_tx_status *frame_status = &tx_resp->status;
	struct agg_tx_status *frame_status = &tx_resp->status;
	struct ieee80211_tx_info *info = NULL;
	struct ieee80211_tx_info *info = NULL;
	struct ieee80211_hdr *hdr = NULL;
	struct ieee80211_hdr *hdr = NULL;
	u32 rate_n_flags = le32_to_cpu(tx_resp->rate_n_flags);
	int i, sh, idx;
	int i, sh, idx;
	u16 seq;
	u16 seq;


@@ -1147,7 +1148,7 @@ static int iwl5000_tx_status_reply_tx(struct iwl_priv *priv,


	agg->frame_count = tx_resp->frame_count;
	agg->frame_count = tx_resp->frame_count;
	agg->start_idx = start_idx;
	agg->start_idx = start_idx;
	agg->rate_n_flags = le32_to_cpu(tx_resp->rate_n_flags);
	agg->rate_n_flags = rate_n_flags;
	agg->bitmap = 0;
	agg->bitmap = 0;


	/* # frames attempted by Tx command */
	/* # frames attempted by Tx command */
@@ -1165,15 +1166,13 @@ static int iwl5000_tx_status_reply_tx(struct iwl_priv *priv,
		info->flags &= ~IEEE80211_TX_CTL_AMPDU;
		info->flags &= ~IEEE80211_TX_CTL_AMPDU;
		info->flags |= iwl_is_tx_success(status)?
		info->flags |= iwl_is_tx_success(status)?
			IEEE80211_TX_STAT_ACK : 0;
			IEEE80211_TX_STAT_ACK : 0;
		iwl4965_hwrate_to_tx_control(priv,
		iwl_hwrate_to_tx_control(priv, rate_n_flags, info);
					     le32_to_cpu(tx_resp->rate_n_flags),

					     info);
		/* FIXME: code repetition end */
		/* FIXME: code repetition end */


		IWL_DEBUG_TX_REPLY("1 Frame 0x%x failure :%d\n",
		IWL_DEBUG_TX_REPLY("1 Frame 0x%x failure :%d\n",
				    status & 0xff, tx_resp->failure_frame);
				    status & 0xff, tx_resp->failure_frame);
		IWL_DEBUG_TX_REPLY("Rate Info rate_n_flags=%x\n",
		IWL_DEBUG_TX_REPLY("Rate Info rate_n_flags=%x\n", rate_n_flags);
			iwl4965_hw_get_rate_n_flags(tx_resp->rate_n_flags));


		agg->wait_for_ba = 0;
		agg->wait_for_ba = 0;
	} else {
	} else {
@@ -1231,7 +1230,6 @@ static int iwl5000_tx_status_reply_tx(struct iwl_priv *priv,


		agg->bitmap = bitmap;
		agg->bitmap = bitmap;
		agg->start_idx = start;
		agg->start_idx = start;
		agg->rate_n_flags = le32_to_cpu(tx_resp->rate_n_flags);
		IWL_DEBUG_TX_REPLY("Frames %d start_idx=%d bitmap=0x%llx\n",
		IWL_DEBUG_TX_REPLY("Frames %d start_idx=%d bitmap=0x%llx\n",
				   agg->frame_count, agg->start_idx,
				   agg->frame_count, agg->start_idx,
				   (unsigned long long)agg->bitmap);
				   (unsigned long long)agg->bitmap);
@@ -1322,7 +1320,7 @@ static void iwl5000_rx_reply_tx(struct iwl_priv *priv,
		info->status.retry_count = tx_resp->failure_frame;
		info->status.retry_count = tx_resp->failure_frame;
		info->flags =
		info->flags =
			iwl_is_tx_success(status) ? IEEE80211_TX_STAT_ACK : 0;
			iwl_is_tx_success(status) ? IEEE80211_TX_STAT_ACK : 0;
		iwl4965_hwrate_to_tx_control(priv,
		iwl_hwrate_to_tx_control(priv,
					le32_to_cpu(tx_resp->rate_n_flags),
					le32_to_cpu(tx_resp->rate_n_flags),
					info);
					info);


Loading