aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2014-05-17 17:24:55 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-05-19 16:42:14 -0400
commit50c1b59e2f76ab2aba0f2139a48da3ada0de14c5 (patch)
treebf27caa6997fe2a1fadd1dc74e337857f5144da4 /drivers
parentb60c3c2fdf524e9fb3cbe6b12c2c4c6d8f4febf4 (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.c27
-rw-r--r--drivers/net/wireless/b43/phy_common.c65
-rw-r--r--drivers/net/wireless/b43/phy_common.h1
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
1192static void b43_bcma_wireless_core_reset(struct b43_wldev *dev, bool gmode) 1181static 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
1212static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, bool gmode) 1201static 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
315void b43_phy_put_into_reset(struct b43_wldev *dev) 315void 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
354void 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);
391void b43_phy_unlock(struct b43_wldev *dev); 391void b43_phy_unlock(struct b43_wldev *dev);
392 392
393void b43_phy_put_into_reset(struct b43_wldev *dev); 393void b43_phy_put_into_reset(struct b43_wldev *dev);
394void 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