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

Commit 88f07e70 authored by Maxim Altshul's avatar Maxim Altshul Committed by Kalle Valo
Browse files

wlcore/wl18xx: Add functionality to accept TX rate per link



FW will provide a TX rate per link for each FW status,
and wlcore will be able to store the information for
the use of the mesh hwmp module.

This is used mainly in mesh.
Rates are reported when a mesh interface is up.

Signed-off-by: default avatarMaxim Altshul <maxim.altshul@ti.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent c940de10
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1214,6 +1214,10 @@ static void wl18xx_convert_fw_status(struct wl1271 *wl, void *raw_fw_status,
			int_fw_status->counters.tx_voice_released_blks;
	fw_status->counters.tx_last_rate =
			int_fw_status->counters.tx_last_rate;
	fw_status->counters.tx_last_rate_mbps =
			int_fw_status->counters.tx_last_rate_mbps;
	fw_status->counters.hlid =
			int_fw_status->counters.hlid;

	fw_status->log_start_addr = le32_to_cpu(int_fw_status->log_start_addr);

+18 −4
Original line number Diff line number Diff line
@@ -30,9 +30,9 @@

static
void wl18xx_get_last_tx_rate(struct wl1271 *wl, struct ieee80211_vif *vif,
			     u8 band, struct ieee80211_tx_rate *rate)
			     u8 band, struct ieee80211_tx_rate *rate, u8 hlid)
{
	u8 fw_rate = wl->fw_status->counters.tx_last_rate;
	u8 fw_rate = wl->links[hlid].fw_rate_idx;

	if (fw_rate > CONF_HW_RATE_INDEX_MAX) {
		wl1271_error("last Tx rate invalid: %d", fw_rate);
@@ -79,6 +79,7 @@ static void wl18xx_tx_complete_packet(struct wl1271 *wl, u8 tx_stat_byte)
	struct sk_buff *skb;
	int id = tx_stat_byte & WL18XX_TX_STATUS_DESC_ID_MASK;
	bool tx_success;
	struct wl1271_tx_hw_descr *tx_desc;

	/* check for id legality */
	if (unlikely(id >= wl->num_tx_desc || wl->tx_frames[id] == NULL)) {
@@ -91,6 +92,7 @@ static void wl18xx_tx_complete_packet(struct wl1271 *wl, u8 tx_stat_byte)

	skb = wl->tx_frames[id];
	info = IEEE80211_SKB_CB(skb);
	tx_desc = (struct wl1271_tx_hw_descr *)skb->data;

	if (wl12xx_is_dummy_packet(wl, skb)) {
		wl1271_free_tx_id(wl, id);
@@ -105,7 +107,9 @@ static void wl18xx_tx_complete_packet(struct wl1271 *wl, u8 tx_stat_byte)
	 * the info->status structures
	 */
	wl18xx_get_last_tx_rate(wl, info->control.vif,
				info->band, &info->status.rates[0]);
				info->band,
				&info->status.rates[0],
				tx_desc->hlid);

	info->status.rates[0].count = 1; /* no data about retries */
	info->status.ack_signal = -1;
@@ -144,12 +148,22 @@ void wl18xx_tx_immediate_complete(struct wl1271 *wl)
	struct wl18xx_fw_status_priv *status_priv =
		(struct wl18xx_fw_status_priv *)wl->fw_status->priv;
	struct wl18xx_priv *priv = wl->priv;
	u8 i;
	u8 i, hlid;

	/* nothing to do here */
	if (priv->last_fw_rls_idx == status_priv->fw_release_idx)
		return;

	/* update rates per link */
	hlid = wl->fw_status->counters.hlid;

	if (hlid < WLCORE_MAX_LINKS) {
		wl->links[hlid].fw_rate_idx =
				wl->fw_status->counters.tx_last_rate;
		wl->links[hlid].fw_rate_mbps =
				wl->fw_status->counters.tx_last_rate_mbps;
	}

	/* freed Tx descriptors */
	wl1271_debug(DEBUG_TX, "last released desc = %d, current idx = %d",
		     priv->last_fw_rls_idx, status_priv->fw_release_idx);
+5 −1
Original line number Diff line number Diff line
@@ -125,7 +125,11 @@ struct wl18xx_fw_packet_counters {
	/* Tx rate of the last transmitted packet */
	u8 tx_last_rate;

	u8 padding[2];
	/* Tx rate or Tx rate estimate pre-calculated by fw in mbps units */
	u8 tx_last_rate_mbps;

	/* hlid for which the rates were reported */
	u8 hlid;
} __packed;

/* FW status registers */
+1 −0
Original line number Diff line number Diff line
@@ -4986,6 +4986,7 @@ static int wl12xx_sta_add(struct wl1271 *wl,
		return ret;

	wl_sta = (struct wl1271_station *)sta->drv_priv;
	wl_sta->wl = wl;
	hlid = wl_sta->hlid;

	ret = wl12xx_cmd_add_peer(wl, wlvif, sta, hlid);
+7 −0
Original line number Diff line number Diff line
@@ -222,6 +222,13 @@ int wlcore_rx(struct wl1271 *wl, struct wl_fw_status *status)
	enum wl_rx_buf_align rx_align;
	int ret = 0;

	/* update rates per link */
	hlid = status->counters.hlid;

	if (hlid < WLCORE_MAX_LINKS)
		wl->links[hlid].fw_rate_mbps =
				status->counters.tx_last_rate_mbps;

	while (drv_rx_counter != fw_rx_counter) {
		buf_size = 0;
		rx_counter = drv_rx_counter;
Loading