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 | |
| 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>
| -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 |
