* b43: Always calibrate all LO control values
@ 2007-08-25 0:01 Michael Buesch
0 siblings, 0 replies; only message in thread
From: Michael Buesch @ 2007-08-25 0:01 UTC (permalink / raw)
To: John Linville; +Cc: bcm43xx-dev, linux-wireless
This is a workaround that (optionally) removes the broken
optimization to only calibrate "needed" control values.
With this applied, all possible control values are always
calibrated and some runtime warnings vanish.
Signed-off-by: Michael Buesch <mb@bu3sch.de>
Index: wireless-dev-new/drivers/net/wireless/b43/lo.h
===================================================================
--- wireless-dev-new.orig/drivers/net/wireless/b43/lo.h 2007-08-24 13:21:54.000000000 +0200
+++ wireless-dev-new/drivers/net/wireless/b43/lo.h 2007-08-25 01:01:32.000000000 +0200
@@ -55,7 +55,7 @@ static inline bool b43_loctl_is_calibrat
* Use b43_get_lo_g_ctl() to retrieve a value from the lists.
*/
struct b43_txpower_lo_control {
-#define B43_NR_BB 9
+#define B43_NR_BB 12
#define B43_NR_RF 16
/* LO Control values, with PAD Mixer */
struct b43_loctl with_padmix[B43_NR_BB][B43_NR_RF];
Index: wireless-dev-new/drivers/net/wireless/b43/lo.c
===================================================================
--- wireless-dev-new.orig/drivers/net/wireless/b43/lo.c 2007-08-24 13:21:54.000000000 +0200
+++ wireless-dev-new/drivers/net/wireless/b43/lo.c 2007-08-25 01:42:55.000000000 +0200
@@ -35,6 +35,12 @@
#include <linux/delay.h>
#include <linux/sched.h>
+
+/* Define to 1 to always calibrate all possible LO control pairs.
+ * This is a workaround until we fix the partial LO calibration optimization. */
+#define B43_CALIB_ALL_LOCTLS 1
+
+
/* Write the LocalOscillator Control (adjust) value-pair. */
static void b43_lo_write(struct b43_wldev *dev, struct b43_loctl *control)
{
@@ -77,6 +83,7 @@ static int assert_rfatt_and_bbatt(const
return err;
}
+#if !B43_CALIB_ALL_LOCTLS
static
struct b43_loctl *b43_get_lo_g_ctl_nopadmix(struct b43_wldev *dev,
const struct b43_rfatt *rfatt,
@@ -89,6 +96,7 @@ struct b43_loctl *b43_get_lo_g_ctl_nopad
return &(lo->no_padmix[0][0]); /* Just prevent a crash */
return &(lo->no_padmix[bbatt->att][rfatt->att]);
}
+#endif /* !B43_CALIB_ALL_LOCTLS */
struct b43_loctl *b43_get_lo_g_ctl(struct b43_wldev *dev,
const struct b43_rfatt *rfatt,
@@ -936,6 +944,66 @@ static void lo_probe_loctls_statemachine
} while (++repeat_cnt < max_repeat);
}
+#if B43_CALIB_ALL_LOCTLS
+static const struct b43_rfatt b43_full_rfatt_list_items[] = {
+ { .att = 0, .with_padmix = 0, },
+ { .att = 1, .with_padmix = 0, },
+ { .att = 2, .with_padmix = 0, },
+ { .att = 3, .with_padmix = 0, },
+ { .att = 4, .with_padmix = 0, },
+ { .att = 5, .with_padmix = 0, },
+ { .att = 6, .with_padmix = 0, },
+ { .att = 7, .with_padmix = 0, },
+ { .att = 8, .with_padmix = 0, },
+ { .att = 9, .with_padmix = 0, },
+ { .att = 10, .with_padmix = 0, },
+ { .att = 11, .with_padmix = 0, },
+ { .att = 12, .with_padmix = 0, },
+ { .att = 13, .with_padmix = 0, },
+ { .att = 14, .with_padmix = 0, },
+ { .att = 15, .with_padmix = 0, },
+ { .att = 0, .with_padmix = 1, },
+ { .att = 1, .with_padmix = 1, },
+ { .att = 2, .with_padmix = 1, },
+ { .att = 3, .with_padmix = 1, },
+ { .att = 4, .with_padmix = 1, },
+ { .att = 5, .with_padmix = 1, },
+ { .att = 6, .with_padmix = 1, },
+ { .att = 7, .with_padmix = 1, },
+ { .att = 8, .with_padmix = 1, },
+ { .att = 9, .with_padmix = 1, },
+ { .att = 10, .with_padmix = 1, },
+ { .att = 11, .with_padmix = 1, },
+ { .att = 12, .with_padmix = 1, },
+ { .att = 13, .with_padmix = 1, },
+ { .att = 14, .with_padmix = 1, },
+ { .att = 15, .with_padmix = 1, },
+};
+static const struct b43_rfatt_list b43_full_rfatt_list = {
+ .list = b43_full_rfatt_list_items,
+ .len = ARRAY_SIZE(b43_full_rfatt_list_items),
+};
+
+static const struct b43_bbatt b43_full_bbatt_list_items[] = {
+ { .att = 0, },
+ { .att = 1, },
+ { .att = 2, },
+ { .att = 3, },
+ { .att = 4, },
+ { .att = 5, },
+ { .att = 6, },
+ { .att = 7, },
+ { .att = 8, },
+ { .att = 9, },
+ { .att = 10, },
+ { .att = 11, },
+};
+static const struct b43_bbatt_list b43_full_bbatt_list = {
+ .list = b43_full_bbatt_list_items,
+ .len = ARRAY_SIZE(b43_full_bbatt_list_items),
+};
+#endif /* B43_CALIB_ALL_LOCTLS */
+
static void lo_measure(struct b43_wldev *dev)
{
struct b43_phy *phy = &dev->phy;
@@ -947,41 +1015,51 @@ static void lo_measure(struct b43_wldev
struct b43_loctl *ploctl;
int max_rx_gain;
int rfidx, bbidx;
+ const struct b43_bbatt_list *bbatt_list;
+ const struct b43_rfatt_list *rfatt_list;
/* Values from the "TXCTL Register and Value Table" */
u16 txctl_reg;
u16 txctl_value;
u16 pad_mix_gain;
+ bbatt_list = &lo->bbatt_list;
+ rfatt_list = &lo->rfatt_list;
+#if B43_CALIB_ALL_LOCTLS
+ bbatt_list = &b43_full_bbatt_list;
+ rfatt_list = &b43_full_rfatt_list;
+#endif
+
txctl_reg = lo_txctl_register_table(dev, &txctl_value, &pad_mix_gain);
- for (rfidx = 0; rfidx < lo->rfatt_list.len; rfidx++) {
+ for (rfidx = 0; rfidx < rfatt_list->len; rfidx++) {
b43_radio_write16(dev, 0x43, (b43_radio_read16(dev, 0x43)
- & 0xFFF0) | lo->rfatt_list.
- list[rfidx].att);
+ & 0xFFF0) |
+ rfatt_list->list[rfidx].att);
b43_radio_write16(dev, txctl_reg,
(b43_radio_read16(dev, txctl_reg)
& ~txctl_value)
- | (lo->rfatt_list.list[rfidx].
- with_padmix ? txctl_value : 0));
+ | (rfatt_list->list[rfidx].with_padmix ?
+ txctl_value : 0));
- for (bbidx = 0; bbidx < lo->bbatt_list.len; bbidx++) {
+ for (bbidx = 0; bbidx < bbatt_list->len; bbidx++) {
if (lo->rebuild) {
+#if B43_CALIB_ALL_LOCTLS
+ ploctl = b43_get_lo_g_ctl(dev,
+ &rfatt_list->list[rfidx],
+ &bbatt_list->list[bbidx]);
+#else
ploctl = b43_get_lo_g_ctl_nopadmix(dev,
- &lo->
- rfatt_list.
+ &rfatt_list->
list[rfidx],
- &lo->
- bbatt_list.
+ &bbatt_list->
list[bbidx]);
+#endif
} else {
- ploctl =
- b43_get_lo_g_ctl(dev,
- &lo->rfatt_list.
- list[rfidx],
- &lo->bbatt_list.
- list[bbidx]);
+ ploctl = b43_get_lo_g_ctl(dev,
+ &rfatt_list->list[rfidx],
+ &bbatt_list->list[bbidx]);
if (!ploctl->used)
continue;
}
@@ -989,9 +1067,9 @@ static void lo_measure(struct b43_wldev
loctl.i = 0;
loctl.q = 0;
- max_rx_gain = lo->rfatt_list.list[rfidx].att * 2;
- max_rx_gain += lo->bbatt_list.list[bbidx].att / 2;
- if (lo->rfatt_list.list[rfidx].with_padmix)
+ max_rx_gain = rfatt_list->list[rfidx].att * 2;
+ max_rx_gain += bbatt_list->list[bbidx].att / 2;
+ if (rfatt_list->list[rfidx].with_padmix)
max_rx_gain -= pad_mix_gain;
if (has_loopback_gain(phy))
max_rx_gain += phy->max_lb_gain;
@@ -999,8 +1077,7 @@ static void lo_measure(struct b43_wldev
has_loopback_gain(phy));
b43_phy_set_baseband_attenuation(dev,
- lo->bbatt_list.
- list[bbidx].att);
+ bbatt_list->list[bbidx].att);
lo_probe_loctls_statemachine(dev, &loctl, &max_rx_gain);
if (phy->type == B43_PHYTYPE_B) {
loctl.i++;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-08-25 0:02 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-25 0:01 b43: Always calibrate all LO control values Michael Buesch
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).