diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2014-07-15 10:54:47 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-07-18 13:45:24 -0400 |
commit | d8aef3239e7d6a1bd550014ac766e5ec11c63ea9 (patch) | |
tree | d379652b0da2e2936c3c91a8c5ec32e3d1bc567f /drivers/bcma | |
parent | 6ad59343ecd72dd3f83c4db3bcddbb0beabb4c4c (diff) |
bcma: extract antenna gains from SPROM correctly
Just like in case of SSB SPROMs they are encoded in a bit tricky way.
SPROM struct already uses s8 type and it's supposed to store decoded
values.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/bcma')
-rw-r--r-- | drivers/bcma/sprom.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/drivers/bcma/sprom.c b/drivers/bcma/sprom.c index 72bf4540f565..a9dfb1ac138d 100644 --- a/drivers/bcma/sprom.c +++ b/drivers/bcma/sprom.c | |||
@@ -201,6 +201,23 @@ static int bcma_sprom_valid(struct bcma_bus *bus, const u16 *sprom, | |||
201 | SPEX(_field[7], _offset + 14, _mask, _shift); \ | 201 | SPEX(_field[7], _offset + 14, _mask, _shift); \ |
202 | } while (0) | 202 | } while (0) |
203 | 203 | ||
204 | static s8 sprom_extract_antgain(const u16 *in, u16 offset, u16 mask, u16 shift) | ||
205 | { | ||
206 | u16 v; | ||
207 | u8 gain; | ||
208 | |||
209 | v = in[SPOFF(offset)]; | ||
210 | gain = (v & mask) >> shift; | ||
211 | if (gain == 0xFF) { | ||
212 | gain = 8; /* If unset use 2dBm */ | ||
213 | } else { | ||
214 | /* Q5.2 Fractional part is stored in 0xC0 */ | ||
215 | gain = ((gain & 0xC0) >> 6) | ((gain & 0x3F) << 2); | ||
216 | } | ||
217 | |||
218 | return (s8)gain; | ||
219 | } | ||
220 | |||
204 | static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom) | 221 | static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom) |
205 | { | 222 | { |
206 | u16 v, o; | 223 | u16 v, o; |
@@ -381,14 +398,22 @@ static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom) | |||
381 | SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, ~0, 0); | 398 | SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, ~0, 0); |
382 | 399 | ||
383 | /* Extract the antenna gain values. */ | 400 | /* Extract the antenna gain values. */ |
384 | SPEX(antenna_gain.a0, SSB_SPROM8_AGAIN01, | 401 | bus->sprom.antenna_gain.a0 = sprom_extract_antgain(sprom, |
385 | SSB_SPROM8_AGAIN0, SSB_SPROM8_AGAIN0_SHIFT); | 402 | SSB_SPROM8_AGAIN01, |
386 | SPEX(antenna_gain.a1, SSB_SPROM8_AGAIN01, | 403 | SSB_SPROM8_AGAIN0, |
387 | SSB_SPROM8_AGAIN1, SSB_SPROM8_AGAIN1_SHIFT); | 404 | SSB_SPROM8_AGAIN0_SHIFT); |
388 | SPEX(antenna_gain.a2, SSB_SPROM8_AGAIN23, | 405 | bus->sprom.antenna_gain.a1 = sprom_extract_antgain(sprom, |
389 | SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT); | 406 | SSB_SPROM8_AGAIN01, |
390 | SPEX(antenna_gain.a3, SSB_SPROM8_AGAIN23, | 407 | SSB_SPROM8_AGAIN1, |
391 | SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT); | 408 | SSB_SPROM8_AGAIN1_SHIFT); |
409 | bus->sprom.antenna_gain.a2 = sprom_extract_antgain(sprom, | ||
410 | SSB_SPROM8_AGAIN23, | ||
411 | SSB_SPROM8_AGAIN2, | ||
412 | SSB_SPROM8_AGAIN2_SHIFT); | ||
413 | bus->sprom.antenna_gain.a3 = sprom_extract_antgain(sprom, | ||
414 | SSB_SPROM8_AGAIN23, | ||
415 | SSB_SPROM8_AGAIN3, | ||
416 | SSB_SPROM8_AGAIN3_SHIFT); | ||
392 | 417 | ||
393 | SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON, | 418 | SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON, |
394 | SSB_SPROM8_LEDDC_ON_SHIFT); | 419 | SSB_SPROM8_LEDDC_ON_SHIFT); |