Skip to content

Commit

Permalink
b43: complete PHY reset
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Rafał Miłecki authored and John W. Linville committed May 19, 2014
1 parent b60c3c2 commit 50c1b59
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 32 deletions.
27 changes: 2 additions & 25 deletions drivers/net/wireless/b43/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1175,18 +1175,7 @@ static void b43_bcma_phy_reset(struct b43_wldev *dev)
bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags);
udelay(2);

/* Take PHY out of reset */
flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
flags &= ~B43_BCMA_IOCTL_PHY_RESET;
flags |= BCMA_IOCTL_FGC;
bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags);
udelay(1);

/* Do not force clock anymore */
flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
flags &= ~BCMA_IOCTL_FGC;
bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags);
udelay(1);
b43_phy_take_out_of_reset(dev);
}

static void b43_bcma_wireless_core_reset(struct b43_wldev *dev, bool gmode)
Expand All @@ -1211,8 +1200,6 @@ static void b43_bcma_wireless_core_reset(struct b43_wldev *dev, bool gmode)
#ifdef CONFIG_B43_SSB
static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, bool gmode)
{
struct ssb_device *sdev = dev->dev->sdev;
u32 tmslow;
u32 flags = 0;

if (gmode)
Expand All @@ -1224,17 +1211,7 @@ static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, bool gmode)
b43_device_enable(dev, flags);
msleep(2); /* Wait for the PLL to turn on. */

/* Now take the PHY out of Reset again */
tmslow = ssb_read32(sdev, SSB_TMSLOW);
tmslow |= SSB_TMSLOW_FGC;
tmslow &= ~B43_TMSLOW_PHYRESET;
ssb_write32(sdev, SSB_TMSLOW, tmslow);
ssb_read32(sdev, SSB_TMSLOW); /* flush */
msleep(1);
tmslow &= ~SSB_TMSLOW_FGC;
ssb_write32(sdev, SSB_TMSLOW, tmslow);
ssb_read32(sdev, SSB_TMSLOW); /* flush */
msleep(1);
b43_phy_take_out_of_reset(dev);
}
#endif

Expand Down
65 changes: 58 additions & 7 deletions drivers/net/wireless/b43/phy_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,15 +314,22 @@ void b43_phy_maskset(struct b43_wldev *dev, u16 offset, u16 mask, u16 set)

void b43_phy_put_into_reset(struct b43_wldev *dev)
{
#ifdef CONFIG_B43_SSB
u32 tmp;
#endif

switch (dev->dev->bus_type) {
#ifdef CONFIG_B43_BCMA
case B43_BUS_BCMA:
b43err(dev->wl,
"Putting PHY into reset not supported on BCMA\n");
tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
tmp &= ~B43_BCMA_IOCTL_GMODE;
tmp |= B43_BCMA_IOCTL_PHY_RESET;
tmp |= BCMA_IOCTL_FGC;
bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp);
udelay(1);

tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
tmp &= ~BCMA_IOCTL_FGC;
bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp);
udelay(1);
break;
#endif
#ifdef CONFIG_B43_SSB
Expand All @@ -332,14 +339,58 @@ void b43_phy_put_into_reset(struct b43_wldev *dev)
tmp |= B43_TMSLOW_PHYRESET;
tmp |= SSB_TMSLOW_FGC;
ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp);
msleep(1);
usleep_range(1000, 2000);

tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW);
tmp &= ~SSB_TMSLOW_FGC;
tmp |= B43_TMSLOW_PHYRESET;
ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp);
msleep(1);
usleep_range(1000, 2000);

break;
#endif
}
}

void b43_phy_take_out_of_reset(struct b43_wldev *dev)
{
u32 tmp;

switch (dev->dev->bus_type) {
#ifdef CONFIG_B43_BCMA
case B43_BUS_BCMA:
/* Unset reset bit (with forcing clock) */
tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
tmp &= ~B43_BCMA_IOCTL_PHY_RESET;
tmp &= ~B43_BCMA_IOCTL_PHY_CLKEN;
tmp |= BCMA_IOCTL_FGC;
bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp);
udelay(1);

/* Do not force clock anymore */
tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
tmp &= ~BCMA_IOCTL_FGC;
tmp |= B43_BCMA_IOCTL_PHY_CLKEN;
bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp);
udelay(1);
break;
#endif
#ifdef CONFIG_B43_SSB
case B43_BUS_SSB:
/* Unset reset bit (with forcing clock) */
tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW);
tmp &= ~B43_TMSLOW_PHYRESET;
tmp &= ~B43_TMSLOW_PHYCLKEN;
tmp |= SSB_TMSLOW_FGC;
ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp);
ssb_read32(dev->dev->sdev, SSB_TMSLOW); /* flush */
usleep_range(1000, 2000);

tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW);
tmp &= ~SSB_TMSLOW_FGC;
tmp |= B43_TMSLOW_PHYCLKEN;
ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp);
ssb_read32(dev->dev->sdev, SSB_TMSLOW); /* flush */
usleep_range(1000, 2000);
break;
#endif
}
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/b43/phy_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,7 @@ void b43_phy_lock(struct b43_wldev *dev);
void b43_phy_unlock(struct b43_wldev *dev);

void b43_phy_put_into_reset(struct b43_wldev *dev);
void b43_phy_take_out_of_reset(struct b43_wldev *dev);

/**
* b43_switch_channel - Switch to another channel
Expand Down

0 comments on commit 50c1b59

Please sign in to comment.