Skip to content

Commit

Permalink
wifi: wilc1000: Clean up usage of wilc_get_chipid()
Browse files Browse the repository at this point in the history
Reduce the use of wilc_get_chipid(), use cached chip ID wherever
possible. Remove duplicated partial chip ID read implementations
from the driver. Update wilc_get_chipid() to always read the chip
ID out of the hardware and update the cached chip ID, and make it
return a proper return value instead of a chipid. Call wilc_get_chipid()
early to make the cached chip ID available to various sites using
is_wilc1000() to access the cached chip ID.

Reviewed-by: Alexis Lothoré <alexis.lothore@bootlin.com>
Signed-off-by: Marek Vasut <marex@denx.de>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://patch.msgid.link/20241004114551.40236-2-marex@denx.de
  • Loading branch information
Marek Vasut authored and Kalle Valo committed Oct 17, 2024
1 parent 1b292a1 commit 719e469
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 49 deletions.
6 changes: 3 additions & 3 deletions drivers/net/wireless/microchip/wilc1000/netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -195,13 +195,13 @@ static int wilc_wlan_get_firmware(struct net_device *dev)
{
struct wilc_vif *vif = netdev_priv(dev);
struct wilc *wilc = vif->wilc;
int chip_id;
const struct firmware *wilc_fw;
int ret;

chip_id = wilc_get_chipid(wilc, false);
if (!is_wilc1000(wilc->chipid))
return -EINVAL;

netdev_info(dev, "ChipID [%x] loading firmware [%s]\n", chip_id,
netdev_info(dev, "WILC1000 loading firmware [%s]\n",
WILC1000_FW(WILC1000_API_VER));

ret = request_firmware(&wilc_fw, WILC1000_FW(WILC1000_API_VER),
Expand Down
17 changes: 4 additions & 13 deletions drivers/net/wireless/microchip/wilc1000/sdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,10 @@ static int wilc_sdio_probe(struct sdio_func *func,

wilc_sdio_init(wilc, false);

ret = wilc_get_chipid(wilc);
if (ret)
goto dispose_irq;

ret = wilc_load_mac_from_nv(wilc);
if (ret) {
pr_err("Can not retrieve MAC address from chip\n");
Expand Down Expand Up @@ -667,7 +671,6 @@ static int wilc_sdio_init(struct wilc *wilc, bool resume)
struct wilc_sdio *sdio_priv = wilc->bus_data;
struct sdio_cmd52 cmd;
int loop, ret;
u32 chipid;

/**
* function 0 csa enable
Expand Down Expand Up @@ -756,18 +759,6 @@ static int wilc_sdio_init(struct wilc *wilc, bool resume)
return ret;
}

/**
* make sure can read back chip id correctly
**/
if (!resume) {
ret = wilc_sdio_read_reg(wilc, WILC_CHIPID, &chipid);
if (ret) {
dev_err(&func->dev, "Fail cmd read chip id...\n");
return ret;
}
dev_err(&func->dev, "chipid (%08x)\n", chipid);
}

sdio_priv->isinit = true;
return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/microchip/wilc1000/spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ static int wilc_bus_probe(struct spi_device *spi)
if (ret)
goto power_down;

ret = wilc_validate_chipid(wilc);
ret = wilc_get_chipid(wilc);
if (ret)
goto power_down;

Expand Down
75 changes: 44 additions & 31 deletions drivers/net/wireless/microchip/wilc1000/wlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -1402,19 +1402,50 @@ int wilc_send_config_pkt(struct wilc_vif *vif, u8 mode, struct wid *wids,
return ret;
}

int wilc_get_chipid(struct wilc *wilc)
{
u32 chipid = 0;
u32 rfrevid = 0;

if (wilc->chipid == 0) {
wilc->hif_func->hif_read_reg(wilc, WILC_CHIPID, &chipid);
wilc->hif_func->hif_read_reg(wilc, WILC_RF_REVISION_ID,
&rfrevid);
if (!is_wilc1000(chipid)) {
wilc->chipid = 0;
return -EINVAL;
}
if (chipid == WILC_1000_BASE_ID_2A) { /* 0x1002A0 */
if (rfrevid != 0x1)
chipid = WILC_1000_BASE_ID_2A_REV1;
} else if (chipid == WILC_1000_BASE_ID_2B) { /* 0x1002B0 */
if (rfrevid == 0x4)
chipid = WILC_1000_BASE_ID_2B_REV1;
else if (rfrevid != 0x3)
chipid = WILC_1000_BASE_ID_2B_REV2;
}

wilc->chipid = chipid;
}

return 0;
}
EXPORT_SYMBOL_GPL(wilc_get_chipid);

static int init_chip(struct net_device *dev)
{
u32 chipid;
u32 reg;
int ret = 0;
struct wilc_vif *vif = netdev_priv(dev);
struct wilc *wilc = vif->wilc;

acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);

chipid = wilc_get_chipid(wilc, true);
ret = wilc_get_chipid(wilc);
if (ret)
goto release;

if ((chipid & 0xfff) != 0xa0) {
if ((wilc->chipid & 0xfff) != 0xa0) {
ret = wilc->hif_func->hif_read_reg(wilc,
WILC_CORTUS_RESET_MUX_SEL,
&reg);
Expand Down Expand Up @@ -1445,34 +1476,6 @@ static int init_chip(struct net_device *dev)
return ret;
}

u32 wilc_get_chipid(struct wilc *wilc, bool update)
{
u32 chipid = 0;
u32 rfrevid = 0;

if (wilc->chipid == 0 || update) {
wilc->hif_func->hif_read_reg(wilc, WILC_CHIPID, &chipid);
wilc->hif_func->hif_read_reg(wilc, WILC_RF_REVISION_ID,
&rfrevid);
if (!is_wilc1000(chipid)) {
wilc->chipid = 0;
return wilc->chipid;
}
if (chipid == WILC_1000_BASE_ID_2A) { /* 0x1002A0 */
if (rfrevid != 0x1)
chipid = WILC_1000_BASE_ID_2A_REV1;
} else if (chipid == WILC_1000_BASE_ID_2B) { /* 0x1002B0 */
if (rfrevid == 0x4)
chipid = WILC_1000_BASE_ID_2B_REV1;
else if (rfrevid != 0x3)
chipid = WILC_1000_BASE_ID_2B_REV2;
}

wilc->chipid = chipid;
}
return wilc->chipid;
}

int wilc_load_mac_from_nv(struct wilc *wl)
{
int ret = -EINVAL;
Expand Down Expand Up @@ -1535,9 +1538,19 @@ int wilc_wlan_init(struct net_device *dev)
if (!wilc->hif_func->hif_is_init(wilc)) {
acquire_bus(wilc, WILC_BUS_ACQUIRE_ONLY);
ret = wilc->hif_func->hif_init(wilc, false);
if (!ret)
ret = wilc_get_chipid(wilc);
release_bus(wilc, WILC_BUS_RELEASE_ONLY);
if (ret)
goto fail;

if (!is_wilc1000(wilc->chipid)) {
netdev_err(dev, "Unsupported chipid: %x\n", wilc->chipid);
ret = -EINVAL;
goto fail;
}

netdev_dbg(dev, "chipid (%08x)\n", wilc->chipid);
}

if (!wilc->vmm_table)
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/microchip/wilc1000/wlan.h
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,6 @@ void chip_wakeup(struct wilc *wilc);
int wilc_send_config_pkt(struct wilc_vif *vif, u8 mode, struct wid *wids,
u32 count);
int wilc_wlan_init(struct net_device *dev);
u32 wilc_get_chipid(struct wilc *wilc, bool update);
int wilc_get_chipid(struct wilc *wilc);
int wilc_load_mac_from_nv(struct wilc *wilc);
#endif

0 comments on commit 719e469

Please sign in to comment.