* [PATCH RFC] b43: LP-PHY: Implement reading band SPROM
@ 2009-08-10 22:37 Gábor Stefanik
2009-08-11 12:15 ` Gábor Stefanik
0 siblings, 1 reply; 2+ messages in thread
From: Gábor Stefanik @ 2009-08-10 22:37 UTC (permalink / raw)
To: John Linville, Michael Buesch, Larry Finger
Cc: Broadcom Wireless, linux-wireless
Some of the new variables in b43_phy_lp appear to be dead code in
the vendor driver; they will be removed if they remain unused when
LP-PHY implementation is finished.
Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
---
I've added a few FIXME comments, please review them.
Also please check that I used the correct types (e.g. u16) for the new variables.
Variable name mappings vs. the specification:
cckpo = tmp3
ofdmpo = tmp2
maxpwr = tmp1
The array txpwr_srom_max[3] has been broken up into 3 variables,
each called max_tx_pwr_{low|med|hi}_band. A struct holding 3 named u16s
may also be a good choice, but I am not fond of using an array for this.
drivers/net/wireless/b43/phy_lp.c | 83 ++++++++++++++++++++++++++++++++++++-
drivers/net/wireless/b43/phy_lp.h | 16 +++++++
2 files changed, 98 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
index 43272a8..46fe476 100644
--- a/drivers/net/wireless/b43/phy_lp.c
+++ b/drivers/net/wireless/b43/phy_lp.c
@@ -59,6 +59,87 @@ static void b43_lpphy_op_free(struct b43_wldev *dev)
dev->phy.lp = NULL;
}
+static void lpphy_read_band_sprom(struct b43_wldev *dev)
+{
+ struct b43_phy_lp *lpphy = dev->phy.lp;
+ struct ssb_bus *bus = dev->dev->bus;
+ u16 cckpo, maxpwr;
+ u32 ofdmpo;
+ int i;
+
+ if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
+ lpphy->tx_isolation_med_band = bus->sprom.tri2g;
+ lpphy->bx_arch = bus->sprom.bxa2g;
+ lpphy->rssi_vf = bus->sprom.rssismf2g;
+ lpphy->rssi_vc = bus->sprom.rssismc2g;
+ lpphy->rssi_gs = bus->sprom.rssisav2g;
+ lpphy->txpa[0] = bus->sprom.pa0b0;
+ lpphy->txpa[1] = bus->sprom.pa0b1;
+ lpphy->txpa[2] = bus->sprom.pa0b2;
+ maxpwr = bus->sprom.maxpwr_bg;
+ lpphy->max_tx_pwr_med_band = maxpwr;
+ cckpo = bus->sprom.cck2gpo;
+ ofdmpo = bus->sprom.ofdm2gpo;
+ if (cckpo) {
+ for (i = 0; i < 4; i++) {
+ lpphy->tx_max_rate[i] =
+ maxpwr - (ofdmpo & 0xF) * 2;
+ ofdmpo << 4;
+ }
+ ofdmpo = bus->sprom.ofdm2gpo;
+ for (i = 4; i < 15; i++) {
+ lpphy->tx_max_rate[i] =
+ maxpwr - (ofdmpo & 0xF) * 2;
+ ofdmpo << 4;
+ }
+ } else {
+ ofdmpo &= 0xFF;
+ for (i = 0; i < 4; i++)
+ lpphy->tx_max_rate[i] = maxpwr;
+ for (i = 4; i < 15; i++)
+ lpphy->tx_max_rate[i] = maxpwr - ofdmpo;
+ }
+ } else { /* 5GHz */
+ lpphy->tx_isolation_low_band = bus->sprom.tri5gl;
+ lpphy->tx_isolation_med_band = bus->sprom.tri5g;
+ lpphy->tx_isolation_hi_band = bus->sprom.tri5gh;
+ lpphy->bx_arch = bus->sprom.bxa5g;
+ lpphy->rssi_vf = bus->sprom.rssismf5g;
+ lpphy->rssi_vc = bus->sprom.rssismc5g;
+ lpphy->rssi_gs = bus->sprom.rssisav5g;
+ lpphy->txpa[0] = bus->sprom.pa1b0;
+ lpphy->txpa[1] = bus->sprom.pa1b1;
+ lpphy->txpa[2] = bus->sprom.pa1b2;
+ lpphy->txpal[0] = bus->sprom.pa1lob0;
+ lpphy->txpal[1] = bus->sprom.pa1lob1;
+ lpphy->txpal[2] = bus->sprom.pa1lob2;
+ lpphy->txpah[0] = bus->sprom.pa1hib0;
+ lpphy->txpah[1] = bus->sprom.pa1hib1;
+ lpphy->txpah[2] = bus->sprom.pa1hib2;
+ maxpwr = bus->sprom.maxpwr_al;
+ ofdmpo = bus->sprom.ofdm5glpo;
+ lpphy->max_tx_pwr_low_band = maxpwr;
+ for (i = 4; i < 12; i++) {
+ lpphy->tx_max_ratel[i] = maxpwr - (ofdmpo & 0xF) * 2;
+ ofdmpo << 4;
+ }
+ maxpwr = bus->sprom.maxpwr_a;
+ ofdmpo = bus->sprom.ofdm5gpo;
+ lpphy->max_tx_pwr_med_band = maxpwr;
+ for (i = 4; i < 12; i++) {
+ lpphy->tx_max_rate[i] = maxpwr - (ofdmpo & 0xF) * 2;
+ ofdmpo << 4;
+ }
+ maxpwr = bus->sprom.maxpwr_ah;
+ ofdmpo = bus->sprom.ofdm5ghpo;
+ lpphy->max_tx_pwr_hi_band = maxpwr;
+ for (i = 4; i < 12; i++) {
+ lpphy->tx_max_rateh[i] = maxpwr - (ofdmpo & 0xF) * 2;
+ ofdmpo << 4;
+ }
+ }
+}
+
static void lpphy_adjust_gain_table(struct b43_wldev *dev)
{
struct b43_phy_lp *lpphy = dev->phy.lp;
@@ -694,7 +775,7 @@ static void lpphy_tx_pctl_init(struct b43_wldev *dev)
static int b43_lpphy_op_init(struct b43_wldev *dev)
{
- /* TODO: band SPROM */
+ lpphy_read_band_sprom(dev); //FIXME should this be in prepare_structs?
lpphy_baseband_init(dev);
lpphy_radio_init(dev);
//TODO calibrate RC
diff --git a/drivers/net/wireless/b43/phy_lp.h b/drivers/net/wireless/b43/phy_lp.h
index 13d89ea..9d0443c 100644
--- a/drivers/net/wireless/b43/phy_lp.h
+++ b/drivers/net/wireless/b43/phy_lp.h
@@ -831,6 +831,22 @@ struct b43_phy_lp {
/* Transmit isolation high band */
u8 tx_isolation_hi_band; /* FIXME initial value? */
+ /* Max transmit power medium band */
+ u16 max_tx_pwr_med_band;
+ /* Max transmit power low band */
+ u16 max_tx_pwr_low_band;
+ /* Max transmit power high band */
+ u16 max_tx_pwr_hi_band;
+
+ /* FIXME What are these used for? */
+ /* FIXME Is 15 the correct array size? */
+ u16 tx_sprom_max_rate[15];
+ u16 tx_sprom_max_ratel[15];
+ u16 tx_sprom_max_rateh[15];
+
+ /* Transmit power arrays */
+ s16 txpa[3], txpal[3], txpah[3];
+
/* Receive power offset */
u8 rx_pwr_offset; /* FIXME initial value? */
--
1.6.2.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH RFC] b43: LP-PHY: Implement reading band SPROM
2009-08-10 22:37 [PATCH RFC] b43: LP-PHY: Implement reading band SPROM Gábor Stefanik
@ 2009-08-11 12:15 ` Gábor Stefanik
0 siblings, 0 replies; 2+ messages in thread
From: Gábor Stefanik @ 2009-08-11 12:15 UTC (permalink / raw)
To: John Linville, Michael Buesch, Larry Finger
Cc: Broadcom Wireless, linux-wireless
A few glitches I have noticed have been highlighted below; they will
be fixed in the for-checkin patch.
Nevertheless, the review request still stands.
2009/8/11 Gábor Stefanik <netrolller.3d@gmail.com>:
> Some of the new variables in b43_phy_lp appear to be dead code in
> the vendor driver; they will be removed if they remain unused when
> LP-PHY implementation is finished.
>
> Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
> ---
> I've added a few FIXME comments, please review them.
> Also please check that I used the correct types (e.g. u16) for the new
> variables.
>
> Variable name mappings vs. the specification:
> cckpo = tmp3
> ofdmpo = tmp2
> maxpwr = tmp1
>
> The array txpwr_srom_max[3] has been broken up into 3 variables,
> each called max_tx_pwr_{low|med|hi}_band. A struct holding 3 named u16s
> may also be a good choice, but I am not fond of using an array for this.
>
> drivers/net/wireless/b43/phy_lp.c | 83
> ++++++++++++++++++++++++++++++++++++-
> drivers/net/wireless/b43/phy_lp.h | 16 +++++++
> 2 files changed, 98 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/net/wireless/b43/phy_lp.c
> b/drivers/net/wireless/b43/phy_lp.c
> index 43272a8..46fe476 100644
> --- a/drivers/net/wireless/b43/phy_lp.c
> +++ b/drivers/net/wireless/b43/phy_lp.c
> @@ -59,6 +59,87 @@ static void b43_lpphy_op_free(struct b43_wldev *dev)
> dev->phy.lp = NULL;
> }
>
> +static void lpphy_read_band_sprom(struct b43_wldev *dev)
> +{
> + struct b43_phy_lp *lpphy = dev->phy.lp;
> + struct ssb_bus *bus = dev->dev->bus;
> + u16 cckpo, maxpwr;
> + u32 ofdmpo;
> + int i;
> +
> + if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
> + lpphy->tx_isolation_med_band = bus->sprom.tri2g;
> + lpphy->bx_arch = bus->sprom.bxa2g;
> + lpphy->rssi_vf = bus->sprom.rssismf2g;
> + lpphy->rssi_vc = bus->sprom.rssismc2g;
> + lpphy->rssi_gs = bus->sprom.rssisav2g;
> + lpphy->txpa[0] = bus->sprom.pa0b0;
> + lpphy->txpa[1] = bus->sprom.pa0b1;
> + lpphy->txpa[2] = bus->sprom.pa0b2;
> + maxpwr = bus->sprom.maxpwr_bg;
> + lpphy->max_tx_pwr_med_band = maxpwr;
> + cckpo = bus->sprom.cck2gpo;
> + ofdmpo = bus->sprom.ofdm2gpo;
> + if (cckpo) {
> + for (i = 0; i < 4; i++) {
> + lpphy->tx_max_rate[i] =
> + maxpwr - (ofdmpo & 0xF) * 2;
> + ofdmpo << 4;
This was meant to be ofdmpo <<= 4;
> + }
> + ofdmpo = bus->sprom.ofdm2gpo;
> + for (i = 4; i < 15; i++) {
> + lpphy->tx_max_rate[i] =
> + maxpwr - (ofdmpo & 0xF) * 2;
> + ofdmpo << 4;
Same here.
> + }
> + } else {
> + ofdmpo &= 0xFF;
> + for (i = 0; i < 4; i++)
> + lpphy->tx_max_rate[i] = maxpwr;
> + for (i = 4; i < 15; i++)
> + lpphy->tx_max_rate[i] = maxpwr - ofdmpo;
> + }
> + } else { /* 5GHz */
> + lpphy->tx_isolation_low_band = bus->sprom.tri5gl;
> + lpphy->tx_isolation_med_band = bus->sprom.tri5g;
> + lpphy->tx_isolation_hi_band = bus->sprom.tri5gh;
> + lpphy->bx_arch = bus->sprom.bxa5g;
> + lpphy->rssi_vf = bus->sprom.rssismf5g;
> + lpphy->rssi_vc = bus->sprom.rssismc5g;
> + lpphy->rssi_gs = bus->sprom.rssisav5g;
> + lpphy->txpa[0] = bus->sprom.pa1b0;
> + lpphy->txpa[1] = bus->sprom.pa1b1;
> + lpphy->txpa[2] = bus->sprom.pa1b2;
> + lpphy->txpal[0] = bus->sprom.pa1lob0;
> + lpphy->txpal[1] = bus->sprom.pa1lob1;
> + lpphy->txpal[2] = bus->sprom.pa1lob2;
> + lpphy->txpah[0] = bus->sprom.pa1hib0;
> + lpphy->txpah[1] = bus->sprom.pa1hib1;
> + lpphy->txpah[2] = bus->sprom.pa1hib2;
> + maxpwr = bus->sprom.maxpwr_al;
> + ofdmpo = bus->sprom.ofdm5glpo;
> + lpphy->max_tx_pwr_low_band = maxpwr;
> + for (i = 4; i < 12; i++) {
> + lpphy->tx_max_ratel[i] = maxpwr - (ofdmpo & 0xF) *
> 2;
> + ofdmpo << 4;
Ditto.
> + }
> + maxpwr = bus->sprom.maxpwr_a;
> + ofdmpo = bus->sprom.ofdm5gpo;
> + lpphy->max_tx_pwr_med_band = maxpwr;
> + for (i = 4; i < 12; i++) {
> + lpphy->tx_max_rate[i] = maxpwr - (ofdmpo & 0xF) * 2;
> + ofdmpo << 4;
Ditto.
> + }
> + maxpwr = bus->sprom.maxpwr_ah;
> + ofdmpo = bus->sprom.ofdm5ghpo;
> + lpphy->max_tx_pwr_hi_band = maxpwr;
> + for (i = 4; i < 12; i++) {
> + lpphy->tx_max_rateh[i] = maxpwr - (ofdmpo & 0xF) *
> 2;
> + ofdmpo << 4;
Ditto.
> + }
> + }
> +}
> +
> static void lpphy_adjust_gain_table(struct b43_wldev *dev)
> {
> struct b43_phy_lp *lpphy = dev->phy.lp;
> @@ -694,7 +775,7 @@ static void lpphy_tx_pctl_init(struct b43_wldev *dev)
>
> static int b43_lpphy_op_init(struct b43_wldev *dev)
> {
> - /* TODO: band SPROM */
> + lpphy_read_band_sprom(dev); //FIXME should this be in
> prepare_structs?
> lpphy_baseband_init(dev);
> lpphy_radio_init(dev);
> //TODO calibrate RC
> diff --git a/drivers/net/wireless/b43/phy_lp.h
> b/drivers/net/wireless/b43/phy_lp.h
> index 13d89ea..9d0443c 100644
> --- a/drivers/net/wireless/b43/phy_lp.h
> +++ b/drivers/net/wireless/b43/phy_lp.h
> @@ -831,6 +831,22 @@ struct b43_phy_lp {
> /* Transmit isolation high band */
> u8 tx_isolation_hi_band; /* FIXME initial value? */
>
> + /* Max transmit power medium band */
> + u16 max_tx_pwr_med_band;
> + /* Max transmit power low band */
> + u16 max_tx_pwr_low_band;
> + /* Max transmit power high band */
> + u16 max_tx_pwr_hi_band;
> +
> + /* FIXME What are these used for? */
> + /* FIXME Is 15 the correct array size? */
> + u16 tx_sprom_max_rate[15];
> + u16 tx_sprom_max_ratel[15];
> + u16 tx_sprom_max_rateh[15];
> +
> + /* Transmit power arrays */
> + s16 txpa[3], txpal[3], txpah[3];
> +
> /* Receive power offset */
> u8 rx_pwr_offset; /* FIXME initial value? */
>
> --
> 1.6.2.4
>
>
>
--
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-08-11 12:15 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-08-10 22:37 [PATCH RFC] b43: LP-PHY: Implement reading band SPROM Gábor Stefanik
2009-08-11 12:15 ` Gábor Stefanik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).