Merge branch 'master' of git://git.infradead.org/~dedekind/ubi-2.6
[linux-2.6] / drivers / net / wireless / b43 / lo.h
1 #ifndef B43_LO_H_
2 #define B43_LO_H_
3
4 #include "phy.h"
5
6 struct b43_wldev;
7
8 /* Local Oscillator control value-pair. */
9 struct b43_loctl {
10         /* Control values. */
11         s8 i;
12         s8 q;
13         /* "Used by hardware" flag. */
14         bool used;
15 #ifdef CONFIG_B43_DEBUG
16         /* Is this lo-control-array entry calibrated? */
17         bool calibrated;
18 #endif
19 };
20
21 /* Debugging: Poison value for i and q values. */
22 #define B43_LOCTL_POISON        111
23
24 /* loctl->calibrated debugging mechanism */
25 #ifdef CONFIG_B43_DEBUG
26 static inline void b43_loctl_set_calibrated(struct b43_loctl *loctl,
27                                             bool calibrated)
28 {
29         loctl->calibrated = calibrated;
30 }
31 static inline bool b43_loctl_is_calibrated(struct b43_loctl *loctl)
32 {
33         return loctl->calibrated;
34 }
35 #else
36 static inline void b43_loctl_set_calibrated(struct b43_loctl *loctl,
37                                             bool calibrated)
38 {
39 }
40 static inline bool b43_loctl_is_calibrated(struct b43_loctl *loctl)
41 {
42         return 1;
43 }
44 #endif
45
46 /* TX Power LO Control Array.
47  * Value-pairs to adjust the LocalOscillator are stored
48  * in this structure.
49  * There are two different set of values. One for "Flag is Set"
50  * and one for "Flag is Unset".
51  * By "Flag" the flag in struct b43_rfatt is meant.
52  * The Value arrays are two-dimensional. The first index
53  * is the baseband attenuation and the second index
54  * is the radio attenuation.
55  * Use b43_get_lo_g_ctl() to retrieve a value from the lists.
56  */
57 struct b43_txpower_lo_control {
58 #define B43_NR_BB       12
59 #define B43_NR_RF       16
60         /* LO Control values, with PAD Mixer */
61         struct b43_loctl with_padmix[B43_NR_BB][B43_NR_RF];
62         /* LO Control values, without PAD Mixer */
63         struct b43_loctl no_padmix[B43_NR_BB][B43_NR_RF];
64
65         /* Flag to indicate a complete rebuild of the two tables above
66          * to the LO measuring code. */
67         bool rebuild;
68
69         /* Lists of valid RF and BB attenuation values for this device. */
70         struct b43_rfatt_list rfatt_list;
71         struct b43_bbatt_list bbatt_list;
72
73         /* Current TX Bias value */
74         u8 tx_bias;
75         /* Current TX Magnification Value (if used by the device) */
76         u8 tx_magn;
77
78         /* GPHY LO is measured. */
79         bool lo_measured;
80
81         /* Saved device PowerVector */
82         u64 power_vector;
83 };
84
85 /* Measure the BPHY Local Oscillator. */
86 void b43_lo_b_measure(struct b43_wldev *dev);
87 /* Measure the BPHY/GPHY Local Oscillator. */
88 void b43_lo_g_measure(struct b43_wldev *dev);
89
90 /* Adjust the Local Oscillator to the saved attenuation
91  * and txctl values.
92  */
93 void b43_lo_g_adjust(struct b43_wldev *dev);
94 /* Adjust to specific values. */
95 void b43_lo_g_adjust_to(struct b43_wldev *dev,
96                         u16 rfatt, u16 bbatt, u16 tx_control);
97
98 /* Mark all possible b43_lo_g_ctl as "unused" */
99 void b43_lo_g_ctl_mark_all_unused(struct b43_wldev *dev);
100 /* Mark the b43_lo_g_ctl corresponding to the current
101  * attenuation values as used.
102  */
103 void b43_lo_g_ctl_mark_cur_used(struct b43_wldev *dev);
104
105 /* Get a reference to a LO Control value pair in the
106  * TX Power LO Control Array.
107  */
108 struct b43_loctl *b43_get_lo_g_ctl(struct b43_wldev *dev,
109                                    const struct b43_rfatt *rfatt,
110                                    const struct b43_bbatt *bbatt);
111
112 #endif /* B43_LO_H_ */