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@xxxxxxxxxx> --- .../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