On 11/6/2018 4:50 AM, Chi-Hsien Lin wrote:
CYW43012 is a 1x1 802.11a/b/g/n Dual-Band HT20, 256-QAM/Turbo QAM. It
is an Ultra Low Power WLAN+BT combo chip.

comments below....

Reviewed-by: Arend van Spriel <[email protected]>
Signed-off-by: Chi-Hsien Lin <[email protected]>
---
 .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  |  1 +
 .../wireless/broadcom/brcm80211/brcmfmac/chip.c    |  9 ++++-
 .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 40 ++++++++++++++++++----
 .../broadcom/brcm80211/include/brcm_hw_ids.h       |  1 +
 include/linux/mmc/sdio_ids.h                       |  1 +
 5 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 34a838fcc319..299f59f58d8c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -677,6 +679,15 @@ brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on)
        /* 1st KSO write goes to AOS wake up core if device is asleep  */
        brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err);

+       /* In case of 43012 chip, the chip could go down immediately after
+        * KSO bit is cleared. So the further reads of KSO register could
+        * fail. Thereby just bailing out immediately after clearing KSO
+        * bit, to avoid polling of KSO bit.
+        */
+       if (!on && bus->ci->chip == CY_CC_43012_CHIP_ID) {
+               return err;
+       }

kernel coding style does not require curly braces here.

        if (on) {
                /* device WAKEUP through KSO:
                 * write bit 0 & read back until
@@ -2436,9 +2447,20 @@ static void brcmf_sdio_bus_stop(struct device *dev)
                /* Force backplane clocks to assure F2 interrupt propagates */
                saveclk = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
                                            &err);
-               if (!err)
-                       brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
-                                          (saveclk | SBSDIO_FORCE_HT), &err);
+               if (!err) {
+                       if (bus->ci->chip == CY_CC_43012_CHIP_ID) {
+                               brcmf_sdiod_writeb(sdiodev,
+                                                  SBSDIO_FUNC1_CHIPCLKCSR,
+                                                  (saveclk |
+                                                   SBSDIO_HT_AVAIL_REQ),
+                                                  &err);
+                       } else {
+                               brcmf_sdiod_writeb(sdiodev,
+                                                  SBSDIO_FUNC1_CHIPCLKCSR,
+                                                  (saveclk | SBSDIO_FORCE_HT),
+                                                  &err);
+                       }
+               }

I prefer we avoid checks for chip id as much as possible. Maybe have chip module provide helper function, ie.

                if (!err) {
                        bpreq = saveclk;
                        bpreq |= brcmf_chip_is_ulp(bus->ci) ?
                                 SBSDIO_HT_AVAIL_REQ : SBSDIO_FORCE_HT;
                        brcmf_sdio_writeb(sdiodev,
                                          SBSDIO_FUNC1_CHIPCLKCSR,
                                          bpreq, &err);
                }

Reply via email to