summaryrefslogtreecommitdiffstats
path: root/drivers/bcma
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2014-07-15 10:54:47 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-07-18 13:45:24 -0400
commitd8aef3239e7d6a1bd550014ac766e5ec11c63ea9 (patch)
treed379652b0da2e2936c3c91a8c5ec32e3d1bc567f /drivers/bcma
parent6ad59343ecd72dd3f83c4db3bcddbb0beabb4c4c (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.c41
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
204static 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
204static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom) 221static 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);