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

Commit cbcff09e authored by Ashutosh Kumar's avatar Ashutosh Kumar Committed by Ashutosh Kumar
Browse files

ath10k: Wait for peer delete response to synchronize with fw



Peer creation in firmware fails if last peer deletion is still
in progress.
Wait for peer delete response from firmware after deleting peer
from host driver.

CRs-Fixed: 2047126
Change-Id: I9eb01393d9cd3dd82f2084262c250081f2076b46
Signed-off-by: default avatarAshutosh Kumar <askuma@codeaurora.org>
parent f19eadaa
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2375,6 +2375,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
	init_completion(&ar->vdev_setup_done);
	init_completion(&ar->thermal.wmi_sync);
	init_completion(&ar->bss_survey_done);
	init_completion(&ar->peer_delete_done);

	INIT_DELAYED_WORK(&ar->scan.timeout, ath10k_scan_timeout_work);

+1 −0
Original line number Diff line number Diff line
@@ -957,6 +957,7 @@ struct ath10k {

	struct fw_flag *fw_flags;
	/* set for bmi chip sets */
	struct completion peer_delete_done;
	bool is_bmi;
	/* must be last */
	u8 drv_priv[0] __aligned(sizeof(void *));
+11 −0
Original line number Diff line number Diff line
@@ -782,6 +782,7 @@ static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
{
	int ret;
	unsigned long time_left;

	lockdep_assert_held(&ar->conf_mutex);

@@ -793,6 +794,16 @@ static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
	if (ret)
		return ret;

	if (QCA_REV_WCN3990(ar)) {
		time_left = wait_for_completion_timeout(&ar->peer_delete_done,
							5 * HZ);

		if (time_left == 0) {
			ath10k_warn(ar, "Timeout in receiving peer delete response\n");
			return -ETIMEDOUT;
		}
	}

	ar->num_peers--;

	return 0;
+12 −0
Original line number Diff line number Diff line
@@ -412,6 +412,15 @@ static int ath10k_wmi_tlv_event_tx_pause(struct ath10k *ar,
	return 0;
}

static int ath10k_wmi_tlv_event_peer_delete_resp(struct ath10k *ar,
						 struct sk_buff *skb)
{
	ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TLV_PEER_DELETE_RESP_EVENTID\n");
	complete(&ar->peer_delete_done);

	return 0;
}

/***********/
/* TLV ops */
/***********/
@@ -552,6 +561,9 @@ static void ath10k_wmi_tlv_op_rx(struct ath10k *ar, struct sk_buff *skb)
	case WMI_TLV_TX_PAUSE_EVENTID:
		ath10k_wmi_tlv_event_tx_pause(ar, skb);
		break;
	case WMI_TLV_PEER_DELETE_RESP_EVENTID:
		ath10k_wmi_tlv_event_peer_delete_resp(ar, skb);
		break;
	default:
		ath10k_dbg(ar, ATH10K_DBG_WMI, "Unknown eventid: %d\n", id);
		break;
+2 −0
Original line number Diff line number Diff line
@@ -313,6 +313,8 @@ enum wmi_tlv_event_id {
	WMI_TLV_PEER_TX_FAIL_CNT_THR_EVENTID,
	WMI_TLV_PEER_ESTIMATED_LINKSPEED_EVENTID,
	WMI_TLV_PEER_STATE_EVENTID,
	WMI_TLV_PEER_ASSOC_CONF_EVENTID,
	WMI_TLV_PEER_DELETE_RESP_EVENTID,
	WMI_TLV_MGMT_RX_EVENTID = WMI_TLV_EV(WMI_TLV_GRP_MGMT),
	WMI_TLV_HOST_SWBA_EVENTID,
	WMI_TLV_TBTTOFFSET_UPDATE_EVENTID,