rsi: Properly initialize data in rsi_sdio_ta_reset

When building with -Wuninitialized, Clang warns:

drivers/net/wireless/rsi/rsi_91x_sdio.c:940:43: warning: variable 'data'
is uninitialized when used here [-Wuninitialized]
        put_unaligned_le32(TA_HOLD_THREAD_VALUE, data);
                                                 ^~~~
drivers/net/wireless/rsi/rsi_91x_sdio.c:930:10: note: initialize the
variable 'data' to silence this warning
        u8 *data;
                ^
                 = NULL
1 warning generated.

Using Clang's suggestion of initializing data to NULL wouldn't work out
because data will be dereferenced by put_unaligned_le32. Use kzalloc to
properly initialize data, which matches a couple of other places in this
driver.

Fixes: e5a1ecc97e ("rsi: add firmware loading for 9116 device")
Link: https://github.com/ClangBuiltLinux/linux/issues/464
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
Nathan Chancellor 2019-05-23 08:30:08 -07:00 committed by Kalle Valo
parent a24bad7473
commit f57b5d85ed
1 changed files with 14 additions and 7 deletions

View File

@ -929,11 +929,15 @@ static int rsi_sdio_ta_reset(struct rsi_hw *adapter)
u32 addr; u32 addr;
u8 *data; u8 *data;
data = kzalloc(RSI_9116_REG_SIZE, GFP_KERNEL);
if (!data)
return -ENOMEM;
status = rsi_sdio_master_access_msword(adapter, TA_BASE_ADDR); status = rsi_sdio_master_access_msword(adapter, TA_BASE_ADDR);
if (status < 0) { if (status < 0) {
rsi_dbg(ERR_ZONE, rsi_dbg(ERR_ZONE,
"Unable to set ms word to common reg\n"); "Unable to set ms word to common reg\n");
return status; goto err;
} }
rsi_dbg(INIT_ZONE, "%s: Bring TA out of reset\n", __func__); rsi_dbg(INIT_ZONE, "%s: Bring TA out of reset\n", __func__);
@ -944,7 +948,7 @@ static int rsi_sdio_ta_reset(struct rsi_hw *adapter)
RSI_9116_REG_SIZE); RSI_9116_REG_SIZE);
if (status < 0) { if (status < 0) {
rsi_dbg(ERR_ZONE, "Unable to hold TA threads\n"); rsi_dbg(ERR_ZONE, "Unable to hold TA threads\n");
return status; goto err;
} }
put_unaligned_le32(TA_SOFT_RST_CLR, data); put_unaligned_le32(TA_SOFT_RST_CLR, data);
@ -954,7 +958,7 @@ static int rsi_sdio_ta_reset(struct rsi_hw *adapter)
RSI_9116_REG_SIZE); RSI_9116_REG_SIZE);
if (status < 0) { if (status < 0) {
rsi_dbg(ERR_ZONE, "Unable to get TA out of reset\n"); rsi_dbg(ERR_ZONE, "Unable to get TA out of reset\n");
return status; goto err;
} }
put_unaligned_le32(TA_PC_ZERO, data); put_unaligned_le32(TA_PC_ZERO, data);
@ -964,7 +968,8 @@ static int rsi_sdio_ta_reset(struct rsi_hw *adapter)
RSI_9116_REG_SIZE); RSI_9116_REG_SIZE);
if (status < 0) { if (status < 0) {
rsi_dbg(ERR_ZONE, "Unable to Reset TA PC value\n"); rsi_dbg(ERR_ZONE, "Unable to Reset TA PC value\n");
return -EINVAL; status = -EINVAL;
goto err;
} }
put_unaligned_le32(TA_RELEASE_THREAD_VALUE, data); put_unaligned_le32(TA_RELEASE_THREAD_VALUE, data);
@ -974,17 +979,19 @@ static int rsi_sdio_ta_reset(struct rsi_hw *adapter)
RSI_9116_REG_SIZE); RSI_9116_REG_SIZE);
if (status < 0) { if (status < 0) {
rsi_dbg(ERR_ZONE, "Unable to release TA threads\n"); rsi_dbg(ERR_ZONE, "Unable to release TA threads\n");
return status; goto err;
} }
status = rsi_sdio_master_access_msword(adapter, MISC_CFG_BASE_ADDR); status = rsi_sdio_master_access_msword(adapter, MISC_CFG_BASE_ADDR);
if (status < 0) { if (status < 0) {
rsi_dbg(ERR_ZONE, "Unable to set ms word to common reg\n"); rsi_dbg(ERR_ZONE, "Unable to set ms word to common reg\n");
return status; goto err;
} }
rsi_dbg(INIT_ZONE, "***** TA Reset done *****\n"); rsi_dbg(INIT_ZONE, "***** TA Reset done *****\n");
return 0; err:
kfree(data);
return status;
} }
static struct rsi_host_intf_ops sdio_host_intf_ops = { static struct rsi_host_intf_ops sdio_host_intf_ops = {