diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2014-05-17 17:24:55 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-05-19 16:42:14 -0400 |
commit | 50c1b59e2f76ab2aba0f2139a48da3ada0de14c5 (patch) | |
tree | bf27caa6997fe2a1fadd1dc74e337857f5144da4 /drivers | |
parent | b60c3c2fdf524e9fb3cbe6b12c2c4c6d8f4febf4 (diff) |
b43: complete PHY reset
Use separated function for taking PHY out of reset and implement reset
for BCMA.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/b43/main.c | 27 | ||||
-rw-r--r-- | drivers/net/wireless/b43/phy_common.c | 65 | ||||
-rw-r--r-- | drivers/net/wireless/b43/phy_common.h | 1 |
3 files changed, 61 insertions, 32 deletions
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 43fbb8848595..46212d4a76a4 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -1175,18 +1175,7 @@ static void b43_bcma_phy_reset(struct b43_wldev *dev) | |||
1175 | bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags); | 1175 | bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags); |
1176 | udelay(2); | 1176 | udelay(2); |
1177 | 1177 | ||
1178 | /* Take PHY out of reset */ | 1178 | b43_phy_take_out_of_reset(dev); |
1179 | flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); | ||
1180 | flags &= ~B43_BCMA_IOCTL_PHY_RESET; | ||
1181 | flags |= BCMA_IOCTL_FGC; | ||
1182 | bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags); | ||
1183 | udelay(1); | ||
1184 | |||
1185 | /* Do not force clock anymore */ | ||
1186 | flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); | ||
1187 | flags &= ~BCMA_IOCTL_FGC; | ||
1188 | bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags); | ||
1189 | udelay(1); | ||
1190 | } | 1179 | } |
1191 | 1180 | ||
1192 | static void b43_bcma_wireless_core_reset(struct b43_wldev *dev, bool gmode) | 1181 | static void b43_bcma_wireless_core_reset(struct b43_wldev *dev, bool gmode) |
@@ -1211,8 +1200,6 @@ static void b43_bcma_wireless_core_reset(struct b43_wldev *dev, bool gmode) | |||
1211 | #ifdef CONFIG_B43_SSB | 1200 | #ifdef CONFIG_B43_SSB |
1212 | static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, bool gmode) | 1201 | static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, bool gmode) |
1213 | { | 1202 | { |
1214 | struct ssb_device *sdev = dev->dev->sdev; | ||
1215 | u32 tmslow; | ||
1216 | u32 flags = 0; | 1203 | u32 flags = 0; |
1217 | 1204 | ||
1218 | if (gmode) | 1205 | if (gmode) |
@@ -1224,17 +1211,7 @@ static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, bool gmode) | |||
1224 | b43_device_enable(dev, flags); | 1211 | b43_device_enable(dev, flags); |
1225 | msleep(2); /* Wait for the PLL to turn on. */ | 1212 | msleep(2); /* Wait for the PLL to turn on. */ |
1226 | 1213 | ||
1227 | /* Now take the PHY out of Reset again */ | 1214 | b43_phy_take_out_of_reset(dev); |
1228 | tmslow = ssb_read32(sdev, SSB_TMSLOW); | ||
1229 | tmslow |= SSB_TMSLOW_FGC; | ||
1230 | tmslow &= ~B43_TMSLOW_PHYRESET; | ||
1231 | ssb_write32(sdev, SSB_TMSLOW, tmslow); | ||
1232 | ssb_read32(sdev, SSB_TMSLOW); /* flush */ | ||
1233 | msleep(1); | ||
1234 | tmslow &= ~SSB_TMSLOW_FGC; | ||
1235 | ssb_write32(sdev, SSB_TMSLOW, tmslow); | ||
1236 | ssb_read32(sdev, SSB_TMSLOW); /* flush */ | ||
1237 | msleep(1); | ||
1238 | } | 1215 | } |
1239 | #endif | 1216 | #endif |
1240 | 1217 | ||
diff --git a/drivers/net/wireless/b43/phy_common.c b/drivers/net/wireless/b43/phy_common.c index 85773a443499..26e390f9e291 100644 --- a/drivers/net/wireless/b43/phy_common.c +++ b/drivers/net/wireless/b43/phy_common.c | |||
@@ -314,15 +314,22 @@ void b43_phy_maskset(struct b43_wldev *dev, u16 offset, u16 mask, u16 set) | |||
314 | 314 | ||
315 | void b43_phy_put_into_reset(struct b43_wldev *dev) | 315 | void b43_phy_put_into_reset(struct b43_wldev *dev) |
316 | { | 316 | { |
317 | #ifdef CONFIG_B43_SSB | ||
318 | u32 tmp; | 317 | u32 tmp; |
319 | #endif | ||
320 | 318 | ||
321 | switch (dev->dev->bus_type) { | 319 | switch (dev->dev->bus_type) { |
322 | #ifdef CONFIG_B43_BCMA | 320 | #ifdef CONFIG_B43_BCMA |
323 | case B43_BUS_BCMA: | 321 | case B43_BUS_BCMA: |
324 | b43err(dev->wl, | 322 | tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); |
325 | "Putting PHY into reset not supported on BCMA\n"); | 323 | tmp &= ~B43_BCMA_IOCTL_GMODE; |
324 | tmp |= B43_BCMA_IOCTL_PHY_RESET; | ||
325 | tmp |= BCMA_IOCTL_FGC; | ||
326 | bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp); | ||
327 | udelay(1); | ||
328 | |||
329 | tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); | ||
330 | tmp &= ~BCMA_IOCTL_FGC; | ||
331 | bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp); | ||
332 | udelay(1); | ||
326 | break; | 333 | break; |
327 | #endif | 334 | #endif |
328 | #ifdef CONFIG_B43_SSB | 335 | #ifdef CONFIG_B43_SSB |
@@ -332,14 +339,58 @@ void b43_phy_put_into_reset(struct b43_wldev *dev) | |||
332 | tmp |= B43_TMSLOW_PHYRESET; | 339 | tmp |= B43_TMSLOW_PHYRESET; |
333 | tmp |= SSB_TMSLOW_FGC; | 340 | tmp |= SSB_TMSLOW_FGC; |
334 | ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp); | 341 | ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp); |
335 | msleep(1); | 342 | usleep_range(1000, 2000); |
336 | 343 | ||
337 | tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW); | 344 | tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW); |
338 | tmp &= ~SSB_TMSLOW_FGC; | 345 | tmp &= ~SSB_TMSLOW_FGC; |
339 | tmp |= B43_TMSLOW_PHYRESET; | ||
340 | ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp); | 346 | ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp); |
341 | msleep(1); | 347 | usleep_range(1000, 2000); |
348 | |||
349 | break; | ||
350 | #endif | ||
351 | } | ||
352 | } | ||
342 | 353 | ||
354 | void b43_phy_take_out_of_reset(struct b43_wldev *dev) | ||
355 | { | ||
356 | u32 tmp; | ||
357 | |||
358 | switch (dev->dev->bus_type) { | ||
359 | #ifdef CONFIG_B43_BCMA | ||
360 | case B43_BUS_BCMA: | ||
361 | /* Unset reset bit (with forcing clock) */ | ||
362 | tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); | ||
363 | tmp &= ~B43_BCMA_IOCTL_PHY_RESET; | ||
364 | tmp &= ~B43_BCMA_IOCTL_PHY_CLKEN; | ||
365 | tmp |= BCMA_IOCTL_FGC; | ||
366 | bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp); | ||
367 | udelay(1); | ||
368 | |||
369 | /* Do not force clock anymore */ | ||
370 | tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL); | ||
371 | tmp &= ~BCMA_IOCTL_FGC; | ||
372 | tmp |= B43_BCMA_IOCTL_PHY_CLKEN; | ||
373 | bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp); | ||
374 | udelay(1); | ||
375 | break; | ||
376 | #endif | ||
377 | #ifdef CONFIG_B43_SSB | ||
378 | case B43_BUS_SSB: | ||
379 | /* Unset reset bit (with forcing clock) */ | ||
380 | tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW); | ||
381 | tmp &= ~B43_TMSLOW_PHYRESET; | ||
382 | tmp &= ~B43_TMSLOW_PHYCLKEN; | ||
383 | tmp |= SSB_TMSLOW_FGC; | ||
384 | ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp); | ||
385 | ssb_read32(dev->dev->sdev, SSB_TMSLOW); /* flush */ | ||
386 | usleep_range(1000, 2000); | ||
387 | |||
388 | tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW); | ||
389 | tmp &= ~SSB_TMSLOW_FGC; | ||
390 | tmp |= B43_TMSLOW_PHYCLKEN; | ||
391 | ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp); | ||
392 | ssb_read32(dev->dev->sdev, SSB_TMSLOW); /* flush */ | ||
393 | usleep_range(1000, 2000); | ||
343 | break; | 394 | break; |
344 | #endif | 395 | #endif |
345 | } | 396 | } |
diff --git a/drivers/net/wireless/b43/phy_common.h b/drivers/net/wireless/b43/phy_common.h index 4f0fcec5b033..4c80b09a858d 100644 --- a/drivers/net/wireless/b43/phy_common.h +++ b/drivers/net/wireless/b43/phy_common.h | |||
@@ -391,6 +391,7 @@ void b43_phy_lock(struct b43_wldev *dev); | |||
391 | void b43_phy_unlock(struct b43_wldev *dev); | 391 | void b43_phy_unlock(struct b43_wldev *dev); |
392 | 392 | ||
393 | void b43_phy_put_into_reset(struct b43_wldev *dev); | 393 | void b43_phy_put_into_reset(struct b43_wldev *dev); |
394 | void b43_phy_take_out_of_reset(struct b43_wldev *dev); | ||
394 | 395 | ||
395 | /** | 396 | /** |
396 | * b43_switch_channel - Switch to another channel | 397 | * b43_switch_channel - Switch to another channel |