Skip to content

Commit

Permalink
b43: LP-PHY: Refactor TX gain table I/O
Browse files Browse the repository at this point in the history
Make it possible to write individual gain table entries.
Allow gain table entries to be written outside gain table init.
Add version-agnostic helpers for writing gain tables.
Use the new TX gain table helpers during table init.

Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Gábor Stefanik authored and John W. Linville committed Aug 14, 2009
1 parent 7834ddb commit 4758315
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 39 deletions.
85 changes: 46 additions & 39 deletions drivers/net/wireless/b43/tables_lpphy.c
Original file line number Diff line number Diff line change
Expand Up @@ -1058,10 +1058,6 @@ static const u32 lpphy_papd_mult_table[] = {
0x00036963, 0x000339f2, 0x00030a89, 0x0002db28,
};

struct lpphy_tx_gain_table_entry {
u8 gm, pga, pad, dac, bb_mult;
};

static struct lpphy_tx_gain_table_entry lpphy_rev0_nopa_tx_gain_table[] = {
{ .gm = 7, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 152, },
{ .gm = 7, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 147, },
Expand Down Expand Up @@ -2345,44 +2341,55 @@ void lpphy_rev2plus_table_init(struct b43_wldev *dev)
}
}


static void lpphy_rev0_1_write_gain_table(struct b43_wldev *dev,
struct lpphy_tx_gain_table_entry *table)
static void lpphy_rev0_1_write_gain_table(struct b43_wldev *dev, int offset,
struct lpphy_tx_gain_table_entry data)
{
int i;
u32 tmp;

B43_WARN_ON(dev->phy.rev >= 2);

for (i = 0; i < 128; i++) {
tmp = table[i].pad << 11;
tmp |= table[i].pga << 7;
tmp |= table[i].gm << 4;
tmp |= table[i].dac;
b43_lptab_write(dev, B43_LPTAB32(10, 0xC0 + i), tmp);
tmp = table[i].bb_mult << 20;
b43_lptab_write(dev, B43_LPTAB32(10, 0x140 + i), tmp);
}
tmp = data.pad << 11;
tmp |= data.pga << 7;
tmp |= data.gm << 4;
tmp |= data.dac;
b43_lptab_write(dev, B43_LPTAB32(10, 0xC0 + offset), tmp);
tmp = data.bb_mult << 20;
b43_lptab_write(dev, B43_LPTAB32(10, 0x140 + offset), tmp);
}

static void lpphy_rev2plus_write_gain_table(struct b43_wldev *dev,
struct lpphy_tx_gain_table_entry *table)
static void lpphy_rev2plus_write_gain_table(struct b43_wldev *dev, int offset,
struct lpphy_tx_gain_table_entry data)
{
int i;
u32 tmp;

B43_WARN_ON(dev->phy.rev < 2);

for (i = 0; i < 128; i++) {
tmp = table[i].pad << 16;
tmp |= table[i].pga << 8;
tmp |= table[i].gm;
tmp |= 0x7f000000;
b43_lptab_write(dev, B43_LPTAB32(7, 0xC0 + i), tmp);
tmp = table[i].bb_mult << 20;
tmp |= table[i].dac << 28;
b43_lptab_write(dev, B43_LPTAB32(7, 0x140 + i), tmp);
}
tmp = data.pad << 16;
tmp |= data.pga << 8;
tmp |= data.gm;
tmp |= 0x7f000000;
b43_lptab_write(dev, B43_LPTAB32(7, 0xC0 + offset), tmp);
tmp = data.bb_mult << 20;
tmp |= data.dac << 28;
b43_lptab_write(dev, B43_LPTAB32(7, 0x140 + offset), tmp);
}

void lpphy_write_gain_table(struct b43_wldev *dev, int offset,
struct lpphy_tx_gain_table_entry data)
{
if (dev->phy.rev >= 2)
lpphy_rev2plus_write_gain_table(dev, offset, data);
else
lpphy_rev0_1_write_gain_table(dev, offset, data);
}

void lpphy_write_gain_table_bulk(struct b43_wldev *dev, int offset, int count,
struct lpphy_tx_gain_table_entry *table)
{
int i;

for (i = offset; i < count; i++)
lpphy_write_gain_table(dev, i, table[i]);
}

void lpphy_init_tx_gain_table(struct b43_wldev *dev)
Expand All @@ -2393,36 +2400,36 @@ void lpphy_init_tx_gain_table(struct b43_wldev *dev)
case 0:
if ((bus->sprom.boardflags_hi & B43_BFH_NOPA) ||
(bus->sprom.boardflags_lo & B43_BFL_HGPA))
lpphy_rev0_1_write_gain_table(dev,
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev0_nopa_tx_gain_table);
else if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
lpphy_rev0_1_write_gain_table(dev,
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev0_2ghz_tx_gain_table);
else
lpphy_rev0_1_write_gain_table(dev,
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev0_5ghz_tx_gain_table);
break;
case 1:
if ((bus->sprom.boardflags_hi & B43_BFH_NOPA) ||
(bus->sprom.boardflags_lo & B43_BFL_HGPA))
lpphy_rev0_1_write_gain_table(dev,
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev1_nopa_tx_gain_table);
else if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
lpphy_rev0_1_write_gain_table(dev,
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev1_2ghz_tx_gain_table);
else
lpphy_rev0_1_write_gain_table(dev,
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev1_5ghz_tx_gain_table);
break;
default:
if (bus->sprom.boardflags_hi & B43_BFH_NOPA)
lpphy_rev2plus_write_gain_table(dev,
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev2_nopa_tx_gain_table);
else if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
lpphy_rev2plus_write_gain_table(dev,
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev2_2ghz_tx_gain_table);
else
lpphy_rev2plus_write_gain_table(dev,
lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev2_5ghz_tx_gain_table);
}
}
9 changes: 9 additions & 0 deletions drivers/net/wireless/b43/tables_lpphy.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,15 @@ void b43_lptab_write_bulk(struct b43_wldev *dev, u32 offset,
void b2062_upload_init_table(struct b43_wldev *dev);
void b2063_upload_init_table(struct b43_wldev *dev);

struct lpphy_tx_gain_table_entry {
u8 gm, pga, pad, dac, bb_mult;
};

void lpphy_write_gain_table(struct b43_wldev *dev, int offset,
struct lpphy_tx_gain_table_entry data);
void lpphy_write_gain_table_bulk(struct b43_wldev *dev, int offset, int count,
struct lpphy_tx_gain_table_entry *table);

void lpphy_rev0_1_table_init(struct b43_wldev *dev);
void lpphy_rev2plus_table_init(struct b43_wldev *dev);
void lpphy_init_tx_gain_table(struct b43_wldev *dev);
Expand Down

0 comments on commit 4758315

Please sign in to comment.