staging: wilc1000: remove use of infinite loop conditions

Avoid the use of 'while (1)' infinite loop conditions. It's not
recommended to have infinite loop in kernel code because a small bug can
cause never ending loops so use terminator condition as suggested in
full driver review [1].

[1]. https://lore.kernel.org/linux-wireless/20191023100313.52B3F606CF@smtp.codeaurora.org/

Signed-off-by: Ajay Singh <ajay.kathat@microchip.com>
Link: https://lore.kernel.org/r/20200117160157.8706-2-ajay.kathat@microchip.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Ajay Singh 2020-01-17 10:31:23 +00:00 committed by Greg Kroah-Hartman
parent b5909c6d16
commit 9d442d2b9a
3 changed files with 89 additions and 151 deletions

View File

@ -837,7 +837,7 @@ static const struct net_device_ops wilc_netdev_ops = {
void wilc_netdev_cleanup(struct wilc *wilc)
{
struct wilc_vif *vif;
int srcu_idx;
int srcu_idx, ifc_cnt = 0;
if (!wilc)
return;
@ -858,7 +858,7 @@ void wilc_netdev_cleanup(struct wilc *wilc)
flush_workqueue(wilc->hif_workqueue);
destroy_workqueue(wilc->hif_workqueue);
do {
while (ifc_cnt < WILC_NUM_CONCURRENT_IFC) {
mutex_lock(&wilc->vif_mutex);
if (wilc->vif_num <= 0) {
mutex_unlock(&wilc->vif_mutex);
@ -871,7 +871,8 @@ void wilc_netdev_cleanup(struct wilc *wilc)
wilc->vif_num--;
mutex_unlock(&wilc->vif_mutex);
synchronize_srcu(&wilc->srcu);
} while (1);
ifc_cnt++;
}
wilc_wlan_cfg_deinit(wilc);
wlan_deinit_locks(wilc);

View File

@ -499,37 +499,31 @@ int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
wilc_wlan_txq_filter_dup_tcp_ack(dev);
i = 0;
sum = 0;
do {
if (tqe && (i < (WILC_VMM_TBL_SIZE - 1))) {
if (tqe->type == WILC_CFG_PKT)
vmm_sz = ETH_CONFIG_PKT_HDR_OFFSET;
while (tqe && (i < (WILC_VMM_TBL_SIZE - 1))) {
if (tqe->type == WILC_CFG_PKT)
vmm_sz = ETH_CONFIG_PKT_HDR_OFFSET;
else if (tqe->type == WILC_NET_PKT)
vmm_sz = ETH_ETHERNET_HDR_OFFSET;
else
vmm_sz = HOST_HDR_OFFSET;
else if (tqe->type == WILC_NET_PKT)
vmm_sz = ETH_ETHERNET_HDR_OFFSET;
vmm_sz += tqe->buffer_size;
else
vmm_sz = HOST_HDR_OFFSET;
if (vmm_sz & 0x3)
vmm_sz = (vmm_sz + 4) & ~0x3;
vmm_sz += tqe->buffer_size;
if (vmm_sz & 0x3)
vmm_sz = (vmm_sz + 4) & ~0x3;
if ((sum + vmm_sz) > WILC_TX_BUFF_SIZE)
break;
vmm_table[i] = vmm_sz / 4;
if (tqe->type == WILC_CFG_PKT)
vmm_table[i] |= BIT(10);
cpu_to_le32s(&vmm_table[i]);
i++;
sum += vmm_sz;
tqe = wilc_wlan_txq_get_next(wilc, tqe);
} else {
if ((sum + vmm_sz) > WILC_TX_BUFF_SIZE)
break;
}
} while (1);
vmm_table[i] = vmm_sz / 4;
if (tqe->type == WILC_CFG_PKT)
vmm_table[i] |= BIT(10);
cpu_to_le32s(&vmm_table[i]);
i++;
sum += vmm_sz;
tqe = wilc_wlan_txq_get_next(wilc, tqe);
}
if (i == 0)
goto out;
@ -594,12 +588,8 @@ int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
break;
reg &= ~BIT(0);
ret = func->hif_write_reg(wilc, WILC_HOST_TX_CTRL, reg);
if (!ret)
break;
break;
}
break;
} while (1);
} while (0);
if (!ret)
goto out_release_bus;
@ -725,9 +715,7 @@ static void wilc_wlan_handle_rx_buff(struct wilc *wilc, u8 *buffer, int size)
}
}
offset += tp_len;
if (offset >= size)
break;
} while (1);
} while (offset < size);
}
static void wilc_wlan_handle_rxq(struct wilc *wilc)
@ -736,11 +724,7 @@ static void wilc_wlan_handle_rxq(struct wilc *wilc)
u8 *buffer;
struct rxq_entry_t *rqe;
do {
if (wilc->quit) {
complete(&wilc->cfg_event);
break;
}
while (!wilc->quit) {
rqe = wilc_wlan_rxq_remove(wilc);
if (!rqe)
break;
@ -750,7 +734,9 @@ static void wilc_wlan_handle_rxq(struct wilc *wilc)
wilc_wlan_handle_rx_buff(wilc, buffer, size);
kfree(rqe);
} while (1);
}
if (wilc->quit)
complete(&wilc->cfg_event);
}
static void wilc_unknown_isr_ext(struct wilc *wilc)
@ -969,21 +955,14 @@ void wilc_wlan_cleanup(struct net_device *dev)
struct wilc *wilc = vif->wilc;
wilc->quit = 1;
do {
tqe = wilc_wlan_txq_remove_from_head(dev);
if (!tqe)
break;
while ((tqe = wilc_wlan_txq_remove_from_head(dev))) {
if (tqe->tx_complete_func)
tqe->tx_complete_func(tqe->priv, 0);
kfree(tqe);
} while (1);
}
do {
rqe = wilc_wlan_rxq_remove(wilc);
if (!rqe)
break;
while ((rqe = wilc_wlan_rxq_remove(wilc)))
kfree(rqe);
} while (1);
kfree(wilc->rx_buffer);
wilc->rx_buffer = NULL;

View File

@ -137,6 +137,7 @@ static void wilc_wlan_parse_response_frame(struct wilc *wl, u8 *info, int size)
{
u16 wid;
u32 len = 0, i = 0;
struct wilc_cfg *cfg = &wl->cfg;
while (size > 0) {
i = 0;
@ -144,63 +145,42 @@ static void wilc_wlan_parse_response_frame(struct wilc *wl, u8 *info, int size)
switch (FIELD_GET(WILC_WID_TYPE, wid)) {
case WID_CHAR:
do {
if (wl->cfg.b[i].id == WID_NIL)
break;
if (wl->cfg.b[i].id == wid) {
wl->cfg.b[i].val = info[4];
break;
}
while (cfg->b[i].id != WID_NIL && cfg->b[i].id != wid)
i++;
} while (1);
if (cfg->b[i].id == wid)
cfg->b[i].val = info[4];
len = 3;
break;
case WID_SHORT:
do {
struct wilc_cfg_hword *hw = &wl->cfg.hw[i];
if (hw->id == WID_NIL)
break;
if (hw->id == wid) {
hw->val = get_unaligned_le16(&info[4]);
break;
}
while (cfg->hw[i].id != WID_NIL && cfg->hw[i].id != wid)
i++;
} while (1);
if (cfg->hw[i].id == wid)
cfg->hw[i].val = get_unaligned_le16(&info[4]);
len = 4;
break;
case WID_INT:
do {
struct wilc_cfg_word *w = &wl->cfg.w[i];
if (w->id == WID_NIL)
break;
if (w->id == wid) {
w->val = get_unaligned_le32(&info[4]);
break;
}
while (cfg->w[i].id != WID_NIL && cfg->w[i].id != wid)
i++;
} while (1);
if (cfg->w[i].id == wid)
cfg->w[i].val = get_unaligned_le32(&info[4]);
len = 6;
break;
case WID_STR:
do {
if (wl->cfg.s[i].id == WID_NIL)
break;
if (wl->cfg.s[i].id == wid) {
memcpy(wl->cfg.s[i].str, &info[2],
(info[2] + 2));
break;
}
while (cfg->s[i].id != WID_NIL && cfg->s[i].id != wid)
i++;
} while (1);
if (cfg->s[i].id == wid)
memcpy(cfg->s[i].str, &info[2], info[2] + 2);
len = 2 + info[2];
break;
@ -223,16 +203,12 @@ static void wilc_wlan_parse_info_frame(struct wilc *wl, u8 *info)
if (len == 1 && wid == WID_STATUS) {
int i = 0;
do {
if (wl->cfg.b[i].id == WID_NIL)
break;
if (wl->cfg.b[i].id == wid) {
wl->cfg.b[i].val = info[3];
break;
}
while (wl->cfg.b[i].id != WID_NIL &&
wl->cfg.b[i].id != wid)
i++;
} while (1);
if (wl->cfg.b[i].id == wid)
wl->cfg.b[i].val = info[3];
}
}
@ -292,63 +268,45 @@ int wilc_wlan_cfg_get_val(struct wilc *wl, u16 wid, u8 *buffer,
{
u8 type = FIELD_GET(WILC_WID_TYPE, wid);
int i, ret = 0;
struct wilc_cfg *cfg = &wl->cfg;
i = 0;
if (type == CFG_BYTE_CMD) {
do {
if (wl->cfg.b[i].id == WID_NIL)
break;
if (wl->cfg.b[i].id == wid) {
memcpy(buffer, &wl->cfg.b[i].val, 1);
ret = 1;
break;
}
while (cfg->b[i].id != WID_NIL && cfg->b[i].id != wid)
i++;
} while (1);
if (cfg->b[i].id == wid) {
memcpy(buffer, &cfg->b[i].val, 1);
ret = 1;
}
} else if (type == CFG_HWORD_CMD) {
do {
if (wl->cfg.hw[i].id == WID_NIL)
break;
if (wl->cfg.hw[i].id == wid) {
memcpy(buffer, &wl->cfg.hw[i].val, 2);
ret = 2;
break;
}
while (cfg->hw[i].id != WID_NIL && cfg->hw[i].id != wid)
i++;
} while (1);
if (cfg->hw[i].id == wid) {
memcpy(buffer, &cfg->hw[i].val, 2);
ret = 2;
}
} else if (type == CFG_WORD_CMD) {
do {
if (wl->cfg.w[i].id == WID_NIL)
break;
if (wl->cfg.w[i].id == wid) {
memcpy(buffer, &wl->cfg.w[i].val, 4);
ret = 4;
break;
}
while (cfg->w[i].id != WID_NIL && cfg->w[i].id != wid)
i++;
} while (1);
if (cfg->w[i].id == wid) {
memcpy(buffer, &cfg->w[i].val, 4);
ret = 4;
}
} else if (type == CFG_STR_CMD) {
do {
u32 id = wl->cfg.s[i].id;
if (id == WID_NIL)
break;
if (id == wid) {
u16 size = get_unaligned_le16(wl->cfg.s[i].str);
if (buffer_size >= size) {
memcpy(buffer, &wl->cfg.s[i].str[2],
size);
ret = size;
}
break;
}
while (cfg->s[i].id != WID_NIL && cfg->s[i].id != wid)
i++;
} while (1);
if (cfg->s[i].id == wid) {
u16 size = get_unaligned_le16(cfg->s[i].str);
if (buffer_size >= size) {
memcpy(buffer, &cfg->s[i].str[2], size);
ret = size;
}
}
}
return ret;
}