diff options
author | Alwin Beukers <alwin@broadcom.com> | 2011-10-12 14:51:26 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-10-14 14:48:19 -0400 |
commit | ef6ac17a20a424fdfb049ae475d62b92c192d1bc (patch) | |
tree | 72d66b705f1b16d8a8af65638b88e14200342ded /drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | |
parent | f53b170f465d52546c33faa962c3d2609a6bf5b3 (diff) |
brcm80211: moved power conversion functions
Moved brcmu_mw_to_qdbm and brcmu_qdbm_to_mw functions into the only
file using them. Names were adjusted accordingly.
Reported-by: Johannes Berg <johannes@sipsolutions.net>
Reviewed-by: Roland Vossen <rvossen@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 88 |
1 files changed, 86 insertions, 2 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index 27a748e5503..db9176d2d86 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | |||
@@ -247,6 +247,90 @@ static const u32 __wl_cipher_suites[] = { | |||
247 | WLAN_CIPHER_SUITE_AES_CMAC, | 247 | WLAN_CIPHER_SUITE_AES_CMAC, |
248 | }; | 248 | }; |
249 | 249 | ||
250 | /* Quarter dBm units to mW | ||
251 | * Table starts at QDBM_OFFSET, so the first entry is mW for qdBm=153 | ||
252 | * Table is offset so the last entry is largest mW value that fits in | ||
253 | * a u16. | ||
254 | */ | ||
255 | |||
256 | #define QDBM_OFFSET 153 /* Offset for first entry */ | ||
257 | #define QDBM_TABLE_LEN 40 /* Table size */ | ||
258 | |||
259 | /* Smallest mW value that will round up to the first table entry, QDBM_OFFSET. | ||
260 | * Value is ( mW(QDBM_OFFSET - 1) + mW(QDBM_OFFSET) ) / 2 | ||
261 | */ | ||
262 | #define QDBM_TABLE_LOW_BOUND 6493 /* Low bound */ | ||
263 | |||
264 | /* Largest mW value that will round down to the last table entry, | ||
265 | * QDBM_OFFSET + QDBM_TABLE_LEN-1. | ||
266 | * Value is ( mW(QDBM_OFFSET + QDBM_TABLE_LEN - 1) + | ||
267 | * mW(QDBM_OFFSET + QDBM_TABLE_LEN) ) / 2. | ||
268 | */ | ||
269 | #define QDBM_TABLE_HIGH_BOUND 64938 /* High bound */ | ||
270 | |||
271 | static const u16 nqdBm_to_mW_map[QDBM_TABLE_LEN] = { | ||
272 | /* qdBm: +0 +1 +2 +3 +4 +5 +6 +7 */ | ||
273 | /* 153: */ 6683, 7079, 7499, 7943, 8414, 8913, 9441, 10000, | ||
274 | /* 161: */ 10593, 11220, 11885, 12589, 13335, 14125, 14962, 15849, | ||
275 | /* 169: */ 16788, 17783, 18836, 19953, 21135, 22387, 23714, 25119, | ||
276 | /* 177: */ 26607, 28184, 29854, 31623, 33497, 35481, 37584, 39811, | ||
277 | /* 185: */ 42170, 44668, 47315, 50119, 53088, 56234, 59566, 63096 | ||
278 | }; | ||
279 | |||
280 | static u16 brcmf_qdbm_to_mw(u8 qdbm) | ||
281 | { | ||
282 | uint factor = 1; | ||
283 | int idx = qdbm - QDBM_OFFSET; | ||
284 | |||
285 | if (idx >= QDBM_TABLE_LEN) | ||
286 | /* clamp to max u16 mW value */ | ||
287 | return 0xFFFF; | ||
288 | |||
289 | /* scale the qdBm index up to the range of the table 0-40 | ||
290 | * where an offset of 40 qdBm equals a factor of 10 mW. | ||
291 | */ | ||
292 | while (idx < 0) { | ||
293 | idx += 40; | ||
294 | factor *= 10; | ||
295 | } | ||
296 | |||
297 | /* return the mW value scaled down to the correct factor of 10, | ||
298 | * adding in factor/2 to get proper rounding. | ||
299 | */ | ||
300 | return (nqdBm_to_mW_map[idx] + factor / 2) / factor; | ||
301 | } | ||
302 | |||
303 | static u8 brcmf_mw_to_qdbm(u16 mw) | ||
304 | { | ||
305 | u8 qdbm; | ||
306 | int offset; | ||
307 | uint mw_uint = mw; | ||
308 | uint boundary; | ||
309 | |||
310 | /* handle boundary case */ | ||
311 | if (mw_uint <= 1) | ||
312 | return 0; | ||
313 | |||
314 | offset = QDBM_OFFSET; | ||
315 | |||
316 | /* move mw into the range of the table */ | ||
317 | while (mw_uint < QDBM_TABLE_LOW_BOUND) { | ||
318 | mw_uint *= 10; | ||
319 | offset -= 40; | ||
320 | } | ||
321 | |||
322 | for (qdbm = 0; qdbm < QDBM_TABLE_LEN - 1; qdbm++) { | ||
323 | boundary = nqdBm_to_mW_map[qdbm] + (nqdBm_to_mW_map[qdbm + 1] - | ||
324 | nqdBm_to_mW_map[qdbm]) / 2; | ||
325 | if (mw_uint < boundary) | ||
326 | break; | ||
327 | } | ||
328 | |||
329 | qdbm += (u8) offset; | ||
330 | |||
331 | return qdbm; | ||
332 | } | ||
333 | |||
250 | /* function for reading/writing a single u32 from/to the dongle */ | 334 | /* function for reading/writing a single u32 from/to the dongle */ |
251 | static int | 335 | static int |
252 | brcmf_exec_dcmd_u32(struct net_device *ndev, u32 cmd, u32 *par) | 336 | brcmf_exec_dcmd_u32(struct net_device *ndev, u32 cmd, u32 *par) |
@@ -1380,7 +1464,7 @@ brcmf_cfg80211_set_tx_power(struct wiphy *wiphy, | |||
1380 | else | 1464 | else |
1381 | txpwrmw = (u16) dbm; | 1465 | txpwrmw = (u16) dbm; |
1382 | err = brcmf_dev_intvar_set(ndev, "qtxpower", | 1466 | err = brcmf_dev_intvar_set(ndev, "qtxpower", |
1383 | (s32) (brcmu_mw_to_qdbm(txpwrmw))); | 1467 | (s32) (brcmf_mw_to_qdbm(txpwrmw))); |
1384 | if (err) | 1468 | if (err) |
1385 | WL_ERR("qtxpower error (%d)\n", err); | 1469 | WL_ERR("qtxpower error (%d)\n", err); |
1386 | cfg_priv->conf->tx_power = dbm; | 1470 | cfg_priv->conf->tx_power = dbm; |
@@ -1409,7 +1493,7 @@ static s32 brcmf_cfg80211_get_tx_power(struct wiphy *wiphy, s32 *dbm) | |||
1409 | } | 1493 | } |
1410 | 1494 | ||
1411 | result = (u8) (txpwrdbm & ~WL_TXPWR_OVERRIDE); | 1495 | result = (u8) (txpwrdbm & ~WL_TXPWR_OVERRIDE); |
1412 | *dbm = (s32) brcmu_qdbm_to_mw(result); | 1496 | *dbm = (s32) brcmf_qdbm_to_mw(result); |
1413 | 1497 | ||
1414 | done: | 1498 | done: |
1415 | WL_TRACE("Exit\n"); | 1499 | WL_TRACE("Exit\n"); |