Commit 719e469e authored by Marek Vasut's avatar Marek Vasut Committed by Kalle Valo
Browse files

wifi: wilc1000: Clean up usage of wilc_get_chipid()



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: default avatarAlexis Lothoré <alexis.lothore@bootlin.com>
Signed-off-by: default avatarMarek Vasut <marex@denx.de>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://patch.msgid.link/20241004114551.40236-2-marex@denx.de
parent 1b292a16
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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),
+4 −13
Original line number Diff line number Diff line
@@ -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");
@@ -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
@@ -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;
}
+1 −1
Original line number Diff line number Diff line
@@ -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;

+44 −31
Original line number Diff line number Diff line
@@ -1402,9 +1402,38 @@ 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);
@@ -1412,9 +1441,11 @@ static int init_chip(struct net_device *dev)

	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);
@@ -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;
@@ -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)
+1 −1
Original line number Diff line number Diff line
@@ -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