aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFranky Lin <frankyl@broadcom.com>2013-09-25 07:05:42 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-10-03 16:24:24 -0400
commit7434785652457482a4b22c280a83776c3873940d (patch)
tree31d662d1677790d22c3114cbd24de04156c24fb1
parentfe0401582ed4f4ba385b191a7aa1d5984fed81ed (diff)
brcmfmac: add valid core index check in related functions
Perform a valid check for core index to avoid illegal address access. Reviewed-by: Hante Meuleman <meuleman@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: Franky Lin <frankyl@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
index 023ddcb885de..2096a14ef1fb 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
@@ -137,6 +137,8 @@ brcmf_sdio_sb_iscoreup(struct brcmf_sdio_dev *sdiodev,
137 u8 idx; 137 u8 idx;
138 138
139 idx = brcmf_sdio_chip_getinfidx(ci, coreid); 139 idx = brcmf_sdio_chip_getinfidx(ci, coreid);
140 if (idx == BRCMF_MAX_CORENUM)
141 return false;
140 142
141 regdata = brcmf_sdio_regrl(sdiodev, 143 regdata = brcmf_sdio_regrl(sdiodev,
142 CORE_SB(ci->c_inf[idx].base, sbtmstatelow), 144 CORE_SB(ci->c_inf[idx].base, sbtmstatelow),
@@ -155,6 +157,8 @@ brcmf_sdio_ai_iscoreup(struct brcmf_sdio_dev *sdiodev,
155 bool ret; 157 bool ret;
156 158
157 idx = brcmf_sdio_chip_getinfidx(ci, coreid); 159 idx = brcmf_sdio_chip_getinfidx(ci, coreid);
160 if (idx == BRCMF_MAX_CORENUM)
161 return false;
158 162
159 regdata = brcmf_sdio_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, 163 regdata = brcmf_sdio_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL,
160 NULL); 164 NULL);
@@ -262,6 +266,8 @@ brcmf_sdio_ai_coredisable(struct brcmf_sdio_dev *sdiodev,
262 u32 regdata; 266 u32 regdata;
263 267
264 idx = brcmf_sdio_chip_getinfidx(ci, coreid); 268 idx = brcmf_sdio_chip_getinfidx(ci, coreid);
269 if (idx == BRCMF_MAX_CORENUM)
270 return;
265 271
266 /* if core is already in reset, just return */ 272 /* if core is already in reset, just return */
267 regdata = brcmf_sdio_regrl(sdiodev, 273 regdata = brcmf_sdio_regrl(sdiodev,
@@ -305,6 +311,8 @@ brcmf_sdio_sb_resetcore(struct brcmf_sdio_dev *sdiodev,
305 u8 idx; 311 u8 idx;
306 312
307 idx = brcmf_sdio_chip_getinfidx(ci, coreid); 313 idx = brcmf_sdio_chip_getinfidx(ci, coreid);
314 if (idx == BRCMF_MAX_CORENUM)
315 return;
308 316
309 /* 317 /*
310 * Must do the disable sequence first to work for 318 * Must do the disable sequence first to work for
@@ -369,6 +377,8 @@ brcmf_sdio_ai_resetcore(struct brcmf_sdio_dev *sdiodev,
369 u32 regdata; 377 u32 regdata;
370 378
371 idx = brcmf_sdio_chip_getinfidx(ci, coreid); 379 idx = brcmf_sdio_chip_getinfidx(ci, coreid);
380 if (idx == BRCMF_MAX_CORENUM)
381 return;
372 382
373 /* must disable first to work for arbitrary current core state */ 383 /* must disable first to work for arbitrary current core state */
374 brcmf_sdio_ai_coredisable(sdiodev, ci, coreid, core_bits); 384 brcmf_sdio_ai_coredisable(sdiodev, ci, coreid, core_bits);