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

Commit d5b08f83 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "wil6210: hold wil->mutex while managing vrings"

parents b3a1450c 6f9e11b6
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -401,20 +401,26 @@ void wil_bcast_fini(struct wil6210_priv *wil)

static void wil_connect_worker(struct work_struct *work)
{
	int rc;
	int rc, cid, ringid;
	struct wil6210_priv *wil = container_of(work, struct wil6210_priv,
						connect_worker);
	struct net_device *ndev = wil_to_ndev(wil);

	int cid = wil->pending_connect_cid;
	int ringid = wil_find_free_vring(wil);
	mutex_lock(&wil->mutex);

	cid = wil->pending_connect_cid;
	if (cid < 0) {
		wil_err(wil, "No connection pending\n");
		return;
		goto out;
	}
	ringid = wil_find_free_vring(wil);
	if (ringid < 0) {
		wil_err(wil, "No free vring found\n");
		goto out;
	}

	wil_dbg_wmi(wil, "Configure for connection CID %d\n", cid);
	wil_dbg_wmi(wil, "Configure for connection CID %d vring %d\n",
		    cid, ringid);

	rc = wil_vring_init_tx(wil, ringid, 1 << tx_ring_order, cid, 0);
	wil->pending_connect_cid = -1;
@@ -424,6 +430,8 @@ static void wil_connect_worker(struct work_struct *work)
	} else {
		wil_disconnect_cid(wil, cid, WLAN_REASON_UNSPECIFIED, true);
	}
out:
	mutex_unlock(&wil->mutex);
}

int wil_priv_init(struct wil6210_priv *wil)
+4 −1
Original line number Diff line number Diff line
@@ -160,6 +160,7 @@ static void wil_vring_free(struct wil6210_priv *wil, struct vring *vring,
	struct device *dev = wil_to_dev(wil);
	size_t sz = vring->size * sizeof(vring->va[0]);

	lockdep_assert_held(&wil->mutex);
	if (tx) {
		int vring_index = vring - wil->vring_tx;

@@ -749,6 +750,7 @@ int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size,

	wil_dbg_misc(wil, "%s() max_mpdu_size %d\n", __func__,
		     cmd.vring_cfg.tx_sw_ring.max_mpdu_size);
	lockdep_assert_held(&wil->mutex);

	if (vring->va) {
		wil_err(wil, "Tx ring [%d] already allocated\n", id);
@@ -821,6 +823,7 @@ int wil_vring_init_bcast(struct wil6210_priv *wil, int id, int size)

	wil_dbg_misc(wil, "%s() max_mpdu_size %d\n", __func__,
		     cmd.vring_cfg.tx_sw_ring.max_mpdu_size);
	lockdep_assert_held(&wil->mutex);

	if (vring->va) {
		wil_err(wil, "Tx ring [%d] already allocated\n", id);
@@ -872,7 +875,7 @@ void wil_vring_fini_tx(struct wil6210_priv *wil, int id)
	struct vring *vring = &wil->vring_tx[id];
	struct vring_tx_data *txdata = &wil->vring_tx_data[id];

	WARN_ON(!mutex_is_locked(&wil->mutex));
	lockdep_assert_held(&wil->mutex);

	if (!vring->va)
		return;