// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/* Copyright(c) 2024 Realtek Corporation
*/
#include "util.h"
#define RTW89_DBM_QUARTER_FACTOR 2
#define RTW89_MIN_DBM (-41 .25 * (1 << RTW89_DBM_QUARTER_FACTOR))
#define RTW89_MAX_DBM (96 * (1 << RTW89_DBM_QUARTER_FACTOR))
#define RTW89_DB_INVERT_TABLE_OFFSET (-RTW89_MIN_DBM)
static const u64 db_invert_table[] = {
/* in unit of 0.000001 */
75 , 79 , 84 , 89 , 94 , 100 , 106 , 112 , 119 , 126 , 133 , 141 , 150 , 158 , 168 , 178 , 188 ,
200 , 211 , 224 , 237 , 251 , 266 , 282 , 299 , 316 , 335 , 355 , 376 , 398 , 422 , 447 , 473 ,
501 , 531 , 562 , 596 , 631 , 668 , 708 , 750 , 794 , 841 , 891 , 944 , 1000 , 1059 , 1122 , 1189 ,
1259 , 1334 , 1413 , 1496 , 1585 , 1679 , 1778 , 1884 , 1995 , 2113 , 2239 , 2371 , 2512 , 2661 ,
2818 , 2985 , 3162 , 3350 , 3548 , 3758 , 3981 , 4217 , 4467 , 4732 , 5012 , 5309 , 5623 , 5957 ,
6310 , 6683 , 7079 , 7499 , 7943 , 8414 , 8913 , 9441 , 10000 , 10593 , 11220 , 11885 , 12589 ,
13335 , 14125 , 14962 , 15849 , 16788 , 17783 , 18836 , 19953 , 21135 , 22387 , 23714 , 25119 ,
26607 , 28184 , 29854 , 31623 , 33497 , 35481 , 37584 , 39811 , 42170 , 44668 , 47315 , 50119 ,
53088 , 56234 , 59566 , 63096 , 66834 , 70795 , 74989 , 79433 , 84140 , 89125 , 94406 , 100000 ,
105925 , 112202 , 118850 , 125893 , 133352 , 141254 , 149624 , 158489 , 167880 , 177828 ,
188365 , 199526 , 211349 , 223872 , 237137 , 251189 , 266073 , 281838 , 298538 , 316228 ,
334965 , 354813 , 375837 , 398107 , 421697 , 446684 , 473151 , 501187 , 530884 , 562341 ,
595662 , 630957 , 668344 , 707946 , 749894 , 794328 , 841395 , 891251 , 944061 , 1000000 ,
1059254 , 1122018 , 1188502 , 1258925 , 1333521 , 1412538 , 1496236 , 1584893 , 1678804 ,
1778279 , 1883649 , 1995262 , 2113489 , 2238721 , 2371374 , 2511886 , 2660725 , 2818383 ,
2985383 , 3162278 , 3349654 , 3548134 , 3758374 , 3981072 , 4216965 , 4466836 , 4731513 ,
5011872 , 5308844 , 5623413 , 5956621 , 6309573 , 6683439 , 7079458 , 7498942 , 7943282 ,
8413951 , 8912509 , 9440609 , 10000000 , 10592537 , 11220185 , 11885022 , 12589254 ,
13335214 , 14125375 , 14962357 , 15848932 , 16788040 , 17782794 , 18836491 , 19952623 ,
21134890 , 22387211 , 23713737 , 25118864 , 26607251 , 28183829 , 29853826 , 31622777 ,
33496544 , 35481339 , 37583740 , 39810717 , 42169650 , 44668359 , 47315126 , 50118723 ,
53088444 , 56234133 , 59566214 , 63095734 , 66834392 , 70794578 , 74989421 , 79432823 ,
84139514 , 89125094 , 94406088 , 100000000 , 105925373 , 112201845 , 118850223 , 125892541 ,
133352143 , 141253754 , 149623566 , 158489319 , 167880402 , 177827941 , 188364909 , 199526231 ,
211348904 , 223872114 , 237137371 , 251188643 , 266072506 , 281838293 , 298538262 , 316227766 ,
334965439 , 354813389 , 375837404 , 398107171 , 421696503 , 446683592 , 473151259 , 501187234 ,
530884444 , 562341325 , 595662144 , 630957344 , 668343918 , 707945784 , 749894209 , 794328235 ,
841395142 , 891250938 , 944060876 , 1000000000 , 1059253725 , 1122018454 , 1188502227 ,
1258925412 , 1333521432 , 1412537545 , 1496235656 , 1584893192 , 1678804018 , 1778279410 ,
1883649089 , 1995262315 , 2113489040 , 2238721139 , 2371373706 , 2511886432 , 2660725060 ,
2818382931 , 2985382619 , 3162277660 , 3349654392 , 3548133892 , 3758374043 , 3981071706 ,
4216965034 , 4466835922 ULL, 4731512590 ULL, 5011872336 ULL, 5308844442 ULL, 5623413252 ULL,
5956621435 ULL, 6309573445 ULL, 6683439176 ULL, 7079457844 ULL, 7498942093 ULL,
7943282347 ULL, 8413951416 ULL, 8912509381 ULL, 9440608763 ULL, 10000000000 ULL,
10592537252 ULL, 11220184543 ULL, 11885022274 ULL, 12589254118 ULL, 13335214322 ULL,
14125375446 ULL, 14962356561 ULL, 15848931925 ULL, 16788040181 ULL, 17782794100 ULL,
18836490895 ULL, 19952623150 ULL, 21134890398 ULL, 22387211386 ULL, 23713737057 ULL,
25118864315 ULL, 26607250598 ULL, 28183829313 ULL, 29853826189 ULL, 31622776602 ULL,
33496543916 ULL, 35481338923 ULL, 37583740429 ULL, 39810717055 ULL, 42169650343 ULL,
44668359215 ULL, 47315125896 ULL, 50118723363 ULL, 53088444423 ULL, 56234132519 ULL,
59566214353 ULL, 63095734448 ULL, 66834391757 ULL, 70794578438 ULL, 74989420933 ULL,
79432823472 ULL, 84139514165 ULL, 89125093813 ULL, 94406087629 ULL, 100000000000 ULL,
105925372518 ULL, 112201845430 ULL, 118850222744 ULL, 125892541179 ULL, 133352143216 ULL,
141253754462 ULL, 149623565609 ULL, 158489319246 ULL, 167880401812 ULL, 177827941004 ULL,
188364908949 ULL, 199526231497 ULL, 211348903984 ULL, 223872113857 ULL, 237137370566 ULL,
251188643151 ULL, 266072505980 ULL, 281838293126 ULL, 298538261892 ULL, 316227766017 ULL,
334965439158 ULL, 354813389234 ULL, 375837404288 ULL, 398107170553 ULL, 421696503429 ULL,
446683592151 ULL, 473151258961 ULL, 501187233627 ULL, 530884444231 ULL, 562341325190 ULL,
595662143529 ULL, 630957344480 ULL, 668343917569 ULL, 707945784384 ULL, 749894209332 ULL,
794328234724 ULL, 841395141645 ULL, 891250938134 ULL, 944060876286 ULL, 1000000000000 ULL,
1059253725177 ULL, 1122018454302 ULL, 1188502227437 ULL, 1258925411794 ULL,
1333521432163 ULL, 1412537544623 ULL, 1496235656094 ULL, 1584893192461 ULL,
1678804018123 ULL, 1778279410039 ULL, 1883649089490 ULL, 1995262314969 ULL,
2113489039837 ULL, 2238721138568 ULL, 2371373705662 ULL, 2511886431510 ULL,
2660725059799 ULL, 2818382931264 ULL, 2985382618918 ULL, 3162277660168 ULL,
3349654391578 ULL, 3548133892336 ULL, 3758374042884 ULL, 3981071705535 ULL,
4216965034286 ULL, 4466835921510 ULL, 4731512589615 ULL, 5011872336273 ULL,
5308844442310 ULL, 5623413251904 ULL, 5956621435290 ULL, 6309573444802 ULL,
6683439175686 ULL, 7079457843841 ULL, 7498942093325 ULL, 7943282347243 ULL,
8413951416452 ULL, 8912509381337 ULL, 9440608762859 ULL, 10000000000000 ULL,
10592537251773 ULL, 11220184543020 ULL, 11885022274370 ULL, 12589254117942 ULL,
13335214321633 ULL, 14125375446228 ULL, 14962356560944 ULL, 15848931924611 ULL,
16788040181226 ULL, 17782794100389 ULL, 18836490894898 ULL, 19952623149689 ULL,
21134890398367 ULL, 22387211385683 ULL, 23713737056617 ULL, 25118864315096 ULL,
26607250597988 ULL, 28183829312645 ULL, 29853826189180 ULL, 31622776601684 ULL,
33496543915783 ULL, 35481338923358 ULL, 37583740428845 ULL, 39810717055350 ULL,
42169650342858 ULL, 44668359215096 ULL, 47315125896148 ULL, 50118723362727 ULL,
53088444423099 ULL, 56234132519035 ULL, 59566214352901 ULL, 63095734448019 ULL,
66834391756862 ULL, 70794578438414 ULL, 74989420933246 ULL, 79432823472428 ULL,
84139514164520 ULL, 89125093813375 ULL, 94406087628593 ULL, 100000000000000 ULL,
105925372517729 ULL, 112201845430197 ULL, 118850222743702 ULL, 125892541179417 ULL,
133352143216332 ULL, 141253754462276 ULL, 149623565609444 ULL, 158489319246111 ULL,
167880401812256 ULL, 177827941003893 ULL, 188364908948981 ULL, 199526231496888 ULL,
211348903983664 ULL, 223872113856834 ULL, 237137370566166 ULL, 251188643150958 ULL,
266072505979882 ULL, 281838293126446 ULL, 298538261891796 ULL, 316227766016838 ULL,
334965439157829 ULL, 354813389233577 ULL, 375837404288444 ULL, 398107170553497 ULL,
421696503428583 ULL, 446683592150964 ULL, 473151258961482 ULL, 501187233627272 ULL,
530884444230989 ULL, 562341325190350 ULL, 595662143529011 ULL, 630957344480196 ULL,
668343917568615 ULL, 707945784384138 ULL, 749894209332456 ULL, 794328234724284 ULL,
841395141645198 ULL, 891250938133745 ULL, 944060876285923 ULL, 1000000000000000 ULL,
1059253725177290 ULL, 1122018454301970 ULL, 1188502227437020 ULL, 1258925411794170 ULL,
1333521432163330 ULL, 1412537544622760 ULL, 1496235656094440 ULL, 1584893192461110 ULL,
1678804018122560 ULL, 1778279410038920 ULL, 1883649089489810 ULL, 1995262314968890 ULL,
2113489039836650 ULL, 2238721138568340 ULL, 2371373705661660 ULL, 2511886431509590 ULL,
2660725059798820 ULL, 2818382931264460 ULL, 2985382618917960 ULL, 3162277660168380 ULL,
3349654391578280 ULL, 3548133892335770 ULL, 3758374042884440 ULL, 3981071705534970 ULL
};
s32 rtw89_linear_to_db_quarter(u64 val)
{
int r = ARRAY_SIZE(db_invert_table) - 1 ;
int l = 0 ;
int m;
while (l <= r) {
m = l + (r - l) / 2 ;
if (db_invert_table[m] == val)
return m - (s32)RTW89_DB_INVERT_TABLE_OFFSET;
if (db_invert_table[m] > val)
r = m - 1 ;
else
l = m + 1 ;
}
if (l >= ARRAY_SIZE(db_invert_table))
return RTW89_MAX_DBM;
else if (r < 0 )
return RTW89_MIN_DBM;
else if (val - db_invert_table[r] <= db_invert_table[l] - val)
return r - (s32)RTW89_DB_INVERT_TABLE_OFFSET;
else
return l - (s32)RTW89_DB_INVERT_TABLE_OFFSET;
}
EXPORT_SYMBOL(rtw89_linear_to_db_quarter);
s32 rtw89_linear_to_db(u64 val)
{
return rtw89_linear_to_db_quarter(val) >> RTW89_DBM_QUARTER_FACTOR;
}
EXPORT_SYMBOL(rtw89_linear_to_db);
u64 rtw89_db_quarter_to_linear(s32 db)
{
/* supported range -41.25 to 96 dBm, in unit of 0.25 dBm */
db = clamp_t(s32, db, RTW89_MIN_DBM, RTW89_MAX_DBM);
db += (s32)RTW89_DB_INVERT_TABLE_OFFSET;
return db_invert_table[db];
}
EXPORT_SYMBOL(rtw89_db_quarter_to_linear);
u64 rtw89_db_to_linear(s32 db)
{
return rtw89_db_quarter_to_linear(db << RTW89_DBM_QUARTER_FACTOR);
}
EXPORT_SYMBOL(rtw89_db_to_linear);
void rtw89_might_trailing_ellipsis(char *buf, size_t size, ssize_t used)
{
static const char ellipsis[] = "..." ;
/* length of null terminiator isn't included in 'used' */
if (used + 1 < size || size < sizeof (ellipsis))
return ;
memcpy(buf + size - sizeof (ellipsis), ellipsis, sizeof (ellipsis));
}
Messung V0.5 in Prozent C=100 H=95 G=97
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-07)
¤
*© Formatika GbR, Deutschland