]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: wilc1000: Clean up usage of wilc_get_chipid()
authorMarek Vasut <marex@denx.de>
Fri, 4 Oct 2024 11:44:11 +0000 (13:44 +0200)
committerKalle Valo <kvalo@kernel.org>
Thu, 17 Oct 2024 16:47:41 +0000 (19:47 +0300)
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
drivers/net/wireless/microchip/wilc1000/netdev.c
drivers/net/wireless/microchip/wilc1000/sdio.c
drivers/net/wireless/microchip/wilc1000/spi.c
drivers/net/wireless/microchip/wilc1000/wlan.c
drivers/net/wireless/microchip/wilc1000/wlan.h

index 9ecf3fb29b558f611e3858d07771cb8fb9b7d64d..086e70d833e064adc3ce9152d4fc18fda17d27c4 100644 (file)
@@ -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),
index d67662b6b2a1aec7758bd6b8d8151bd1dc4d6b45..7bc6d788f33a7d1f4946831d12d62ecae9fba208 100644 (file)
@@ -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;
 }
index 05b577b1068ea33bfc78f629277e2327823f0fac..81cf82c9175efe10cb5d81e9736877bf70444f1c 100644 (file)
@@ -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;
 
index 533939e71534a026a18abd5eb88b371a7f5bebde..28212ff28c1123b657d4d76a475c56dce1e8e123 100644 (file)
@@ -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 @@ release:
        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)
index dd2fb3c2f06a238cfedc4b4e954e453ae6c56563..44dce53d24916666f3c18636bf42745f0d1cd103 100644 (file)
@@ -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