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/net/wireless/b43/phy_common.c | |
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/net/wireless/b43/phy_common.c')
-rw-r--r-- | drivers/net/wireless/b43/phy_common.c | 65 |
1 files changed, 58 insertions, 7 deletions
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 | } |