[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20211218235404.3963475-2-davidm@egauge.net>
Date: Sat, 18 Dec 2021 23:54:16 +0000 (UTC)
From: David Mosberger-Tang <davidm@...uge.net>
To: Ajay Singh <ajay.kathat@...rochip.com>
Cc: Claudiu Beznea <claudiu.beznea@...rochip.com>,
Kalle Valo <kvalo@...eaurora.org>,
"David S. Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
linux-wireless@...r.kernel.org, netdev@...r.kernel.org,
linux-kernel@...r.kernel.org,
David Mosberger-Tang <davidm@...uge.net>
Subject: [PATCH 01/23] wilc1000: don't hold txq_spinlock while initializing AC
queue limits
The wilc_tx_queue_status queue is relatively large and there is
absolutely no need to initialize it while holding a spinlock.
Signed-off-by: David Mosberger-Tang <davidm@...uge.net>
---
.../net/wireless/microchip/wilc1000/netdev.h | 1 -
.../net/wireless/microchip/wilc1000/wlan.c | 32 +++++++++++--------
2 files changed, 19 insertions(+), 14 deletions(-)
diff --git a/drivers/net/wireless/microchip/wilc1000/netdev.h b/drivers/net/wireless/microchip/wilc1000/netdev.h
index b9a88b3e322f1..fd0cb01e538a2 100644
--- a/drivers/net/wireless/microchip/wilc1000/netdev.h
+++ b/drivers/net/wireless/microchip/wilc1000/netdev.h
@@ -202,7 +202,6 @@ struct wilc_tx_queue_status {
u16 end_index;
u16 cnt[NQUEUES];
u16 sum;
- bool initialized;
};
struct wilc {
diff --git a/drivers/net/wireless/microchip/wilc1000/wlan.c b/drivers/net/wireless/microchip/wilc1000/wlan.c
index 1aa4236a2fe41..721e6131125e8 100644
--- a/drivers/net/wireless/microchip/wilc1000/wlan.c
+++ b/drivers/net/wireless/microchip/wilc1000/wlan.c
@@ -12,6 +12,8 @@
#define WAKE_UP_TRIAL_RETRY 10000
+static const u8 factors[NQUEUES] = {1, 1, 1, 1};
+
static inline bool is_wilc1000(u32 id)
{
return (id & (~WILC_CHIP_REV_FIELD)) == WILC_1000_BASE_ID;
@@ -283,10 +285,23 @@ static int wilc_wlan_txq_add_cfg_pkt(struct wilc_vif *vif, u8 *buffer,
return 1;
}
+static void init_q_limits(struct wilc *wl)
+{
+ struct wilc_tx_queue_status *q = &wl->tx_q_limit;
+ int i;
+
+ for (i = 0; i < AC_BUFFER_SIZE; i++)
+ q->buffer[i] = i % NQUEUES;
+
+ for (i = 0; i < NQUEUES; i++) {
+ q->cnt[i] = AC_BUFFER_SIZE * factors[i] / NQUEUES;
+ q->sum += q->cnt[i];
+ }
+ q->end_index = AC_BUFFER_SIZE - 1;
+}
+
static bool is_ac_q_limit(struct wilc *wl, u8 q_num)
{
- u8 factors[NQUEUES] = {1, 1, 1, 1};
- u16 i;
unsigned long flags;
struct wilc_tx_queue_status *q = &wl->tx_q_limit;
u8 end_index;
@@ -294,17 +309,6 @@ static bool is_ac_q_limit(struct wilc *wl, u8 q_num)
bool ret = false;
spin_lock_irqsave(&wl->txq_spinlock, flags);
- if (!q->initialized) {
- for (i = 0; i < AC_BUFFER_SIZE; i++)
- q->buffer[i] = i % NQUEUES;
-
- for (i = 0; i < NQUEUES; i++) {
- q->cnt[i] = AC_BUFFER_SIZE * factors[i] / NQUEUES;
- q->sum += q->cnt[i];
- }
- q->end_index = AC_BUFFER_SIZE - 1;
- q->initialized = 1;
- }
end_index = q->end_index;
q->cnt[q->buffer[end_index]] -= factors[q->buffer[end_index]];
@@ -1485,6 +1489,8 @@ int wilc_wlan_init(struct net_device *dev)
goto fail;
}
+ init_q_limits(wilc);
+
if (!wilc->tx_buffer)
wilc->tx_buffer = kmalloc(WILC_TX_BUFF_SIZE, GFP_KERNEL);
--
2.25.1
Powered by blists - more mailing lists