Commit bd4217cb authored by Ajay Singh's avatar Ajay Singh Committed by Greg Kroah-Hartman
Browse files

staging: wilc1000: avoid mutex unlock without lock in wilc_wlan_handle_txq()

In wilc_wlan_handle_txq(), mutex unlock was called without acquiring
it. Also error code for full VMM condition was incorrect as discussed in
[1]. Now used a proper code to indicate VMM is full, for which transfer
to VMM is required again. 'wilc_wlan_handle_txq()' should be called
again if the VMM space was full earlier or otherwise based on
'txq_event' signal.

1. https://lore.kernel.org/driverdev-devel/20191113183322.a54mh2w6dulklgsd@kili.mountain/



Signed-off-by: default avatarAjay Singh <ajay.kathat@microchip.com>
Link: https://lore.kernel.org/r/20200123182129.4053-2-ajay.kathat@microchip.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7a80aa23
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -174,7 +174,7 @@ static int wilc_txq_task(void *vp)
				}
				srcu_read_unlock(&wl->srcu, srcu_idx);
			}
		} while (ret == -ENOBUFS && !wl->close);
		} while (ret == WILC_VMM_ENTRY_FULL_RETRY && !wl->close);
	}
	return 0;
}
+10 −5
Original line number Diff line number Diff line
@@ -489,12 +489,12 @@ int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
	struct wilc_vif *vif;

	if (wilc->quit)
		goto out;
		goto out_update_cnt;

	mutex_lock(&wilc->txq_add_to_head_cs);
	tqe = wilc_wlan_txq_get_first(wilc);
	if (!tqe)
		goto out;
		goto out_unlock;
	dev = tqe->vif->ndev;
	wilc_wlan_txq_filter_dup_tcp_ack(dev);
	i = 0;
@@ -526,7 +526,7 @@ int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
	}

	if (i == 0)
		goto out;
		goto out_unlock;
	vmm_table[i] = 0x0;

	acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
@@ -595,7 +595,11 @@ int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
		goto out_release_bus;

	if (entries == 0) {
		ret = -ENOBUFS;
		/*
		 * No VMM space available in firmware so retry to transmit
		 * the packet from tx queue.
		 */
		ret = WILC_VMM_ENTRY_FULL_RETRY;
		goto out_release_bus;
	}

@@ -662,9 +666,10 @@ int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
out_release_bus:
	release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);

out:
out_unlock:
	mutex_unlock(&wilc->txq_add_to_head_cs);

out_update_cnt:
	*txq_count = wilc->txq_entries;
	return ret;
}
+1 −0
Original line number Diff line number Diff line
@@ -198,6 +198,7 @@
#define IS_MGMT_STATUS_SUCCES	0x040

#define WILC_WID_TYPE		GENMASK(15, 12)
#define WILC_VMM_ENTRY_FULL_RETRY	1
/********************************************
 *
 *      Tx/Rx Queue Structure