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

Commit 1be05eb5 authored by Prameela Rani Garnepudi's avatar Prameela Rani Garnepudi Committed by Kalle Valo
Browse files

rsi: move descriptor preparation to core



Descriptors preparation is moved to core instead of HAL to
avoid synchronization issues in sending TX frames

Signed-off-by: default avatarPrameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: default avatarAmitkumar Karwar <amit.karwar@redpinesignals.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 5dc36387
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -413,6 +413,11 @@ void rsi_core_xmit(struct rsi_common *common, struct sk_buff *skb)
	    (ieee80211_is_qos_nullfunc(wh->frame_control))) {
	    (ieee80211_is_qos_nullfunc(wh->frame_control))) {
		q_num = MGMT_SOFT_Q;
		q_num = MGMT_SOFT_Q;
		skb->priority = q_num;
		skb->priority = q_num;

		if (rsi_prepare_mgmt_desc(common, skb)) {
			rsi_dbg(ERR_ZONE, "Failed to prepare desc\n");
			goto xmit_fail;
		}
	} else {
	} else {
		if (ieee80211_is_data_qos(wh->frame_control)) {
		if (ieee80211_is_data_qos(wh->frame_control)) {
			tid = (skb->data[24] & IEEE80211_QOS_TID);
			tid = (skb->data[24] & IEEE80211_QOS_TID);
@@ -433,6 +438,8 @@ void rsi_core_xmit(struct rsi_common *common, struct sk_buff *skb)
			if (!rsta)
			if (!rsta)
				goto xmit_fail;
				goto xmit_fail;
			tx_params->sta_id = rsta->sta_id;
			tx_params->sta_id = rsta->sta_id;
		} else {
			tx_params->sta_id = 0;
		}
		}


		if (rsta) {
		if (rsta) {
@@ -443,6 +450,10 @@ void rsi_core_xmit(struct rsi_common *common, struct sk_buff *skb)
							      tid, 0);
							      tid, 0);
			}
			}
		}
		}
		if (rsi_prepare_data_desc(common, skb)) {
			rsi_dbg(ERR_ZONE, "Failed to prepare data desc\n");
			goto xmit_fail;
		}
	}
	}


	if ((q_num < MGMT_SOFT_Q) &&
	if ((q_num < MGMT_SOFT_Q) &&
+22 −21
Original line number Original line Diff line number Diff line
@@ -45,7 +45,7 @@ int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb)
	return status;
	return status;
}
}


static int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff *skb)
int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff *skb)
{
{
	struct rsi_hw *adapter = common->priv;
	struct rsi_hw *adapter = common->priv;
	struct ieee80211_hdr *wh = NULL;
	struct ieee80211_hdr *wh = NULL;
@@ -113,17 +113,6 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff *skb)
	if (conf_is_ht40(conf))
	if (conf_is_ht40(conf))
		mgmt_desc->bbp_info = cpu_to_le16(FULL40M_ENABLE);
		mgmt_desc->bbp_info = cpu_to_le16(FULL40M_ENABLE);


	if (ieee80211_is_probe_req(wh->frame_control)) {
		if (!bss->assoc) {
			rsi_dbg(INFO_ZONE,
				"%s: blocking mgmt queue\n", __func__);
			mgmt_desc->misc_flags = RSI_DESC_REQUIRE_CFM_TO_HOST;
			xtend_desc->confirm_frame_type = PROBEREQ_CONFIRM;
			common->mgmt_q_block = true;
			rsi_dbg(INFO_ZONE, "Mgmt queue blocked\n");
		}
	}

	if (ieee80211_is_probe_resp(wh->frame_control)) {
	if (ieee80211_is_probe_resp(wh->frame_control)) {
		mgmt_desc->misc_flags |= (RSI_ADD_DELTA_TSF_VAP_ID |
		mgmt_desc->misc_flags |= (RSI_ADD_DELTA_TSF_VAP_ID |
					  RSI_FETCH_RETRY_CNT_FRM_HST);
					  RSI_FETCH_RETRY_CNT_FRM_HST);
@@ -149,7 +138,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff *skb)
}
}


/* This function prepares descriptor for given data packet */
/* This function prepares descriptor for given data packet */
static int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
{
{
	struct rsi_hw *adapter = common->priv;
	struct rsi_hw *adapter = common->priv;
	struct ieee80211_vif *vif;
	struct ieee80211_vif *vif;
@@ -301,10 +290,6 @@ int rsi_send_data_pkt(struct rsi_common *common, struct sk_buff *skb)
	    (!bss->assoc))
	    (!bss->assoc))
		goto err;
		goto err;


	status = rsi_prepare_data_desc(common, skb);
	if (status)
		goto err;

	status = rsi_send_pkt_to_bus(common, skb);
	status = rsi_send_pkt_to_bus(common, skb);
	if (status)
	if (status)
		rsi_dbg(ERR_ZONE, "%s: Failed to write pkt\n", __func__);
		rsi_dbg(ERR_ZONE, "%s: Failed to write pkt\n", __func__);
@@ -327,12 +312,18 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
		      struct sk_buff *skb)
		      struct sk_buff *skb)
{
{
	struct rsi_hw *adapter = common->priv;
	struct rsi_hw *adapter = common->priv;
	struct ieee80211_bss_conf *bss;
	struct ieee80211_hdr *wh;
	struct ieee80211_tx_info *info;
	struct ieee80211_tx_info *info;
	struct skb_info *tx_params;
	struct skb_info *tx_params;
	struct rsi_mgmt_desc *mgmt_desc;
	struct rsi_xtended_desc *xtend_desc;
	int status = -E2BIG;
	int status = -E2BIG;
	u8 header_size;


	info = IEEE80211_SKB_CB(skb);
	info = IEEE80211_SKB_CB(skb);
	tx_params = (struct skb_info *)info->driver_data;
	tx_params = (struct skb_info *)info->driver_data;
	header_size = tx_params->internal_hdr_size;


	if (tx_params->flags & INTERNAL_MGMT_PKT) {
	if (tx_params->flags & INTERNAL_MGMT_PKT) {
		status = adapter->host_intf_ops->write_pkt(common->priv,
		status = adapter->host_intf_ops->write_pkt(common->priv,
@@ -346,15 +337,25 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
		return status;
		return status;
	}
	}


	if (FRAME_DESC_SZ > skb_headroom(skb))
	bss = &info->control.vif->bss_conf;
		goto err;
	wh = (struct ieee80211_hdr *)&skb->data[header_size];
	mgmt_desc = (struct rsi_mgmt_desc *)skb->data;
	xtend_desc = (struct rsi_xtended_desc *)&skb->data[FRAME_DESC_SZ];

	/* Indicate to firmware to give cfm for probe */
	if (ieee80211_is_probe_req(wh->frame_control) && !bss->assoc) {
		rsi_dbg(INFO_ZONE,
			"%s: blocking mgmt queue\n", __func__);
		mgmt_desc->misc_flags = RSI_DESC_REQUIRE_CFM_TO_HOST;
		xtend_desc->confirm_frame_type = PROBEREQ_CONFIRM;
		common->mgmt_q_block = true;
		rsi_dbg(INFO_ZONE, "Mgmt queue blocked\n");
	}


	rsi_prepare_mgmt_desc(common, skb);
	status = rsi_send_pkt_to_bus(common, skb);
	status = rsi_send_pkt_to_bus(common, skb);
	if (status)
	if (status)
		rsi_dbg(ERR_ZONE, "%s: Failed to write the packet\n", __func__);
		rsi_dbg(ERR_ZONE, "%s: Failed to write the packet\n", __func__);


err:
	rsi_indicate_tx_status(common->priv, skb, status);
	rsi_indicate_tx_status(common->priv, skb, status);
	return status;
	return status;
}
}
+2 −0
Original line number Original line Diff line number Diff line
@@ -167,6 +167,8 @@ struct rsi_bt_desc {
} __packed;
} __packed;


int rsi_hal_device_init(struct rsi_hw *adapter);
int rsi_hal_device_init(struct rsi_hw *adapter);
int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff *skb);
int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb);
int rsi_prepare_beacon(struct rsi_common *common, struct sk_buff *skb);
int rsi_prepare_beacon(struct rsi_common *common, struct sk_buff *skb);
int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb);
int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb);
int rsi_send_bt_pkt(struct rsi_common *common, struct sk_buff *skb);
int rsi_send_bt_pkt(struct rsi_common *common, struct sk_buff *skb);