From 66b6a8dde061e16fb2f102eb2de9b884a1941481 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 9 Aug 2009 14:45:18 +0200 Subject: [PATCH] move ms_pwr utility function to gsm_utils.c also, they should both take the gsm_band parameter, not a BTS --- openbsc/include/openbsc/gsm_utils.h | 2 + openbsc/src/abis_rsl.c | 77 ++--------------------------- openbsc/src/bsc_hack.c | 3 +- openbsc/src/gsm_utils.c | 76 ++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 75 deletions(-) diff --git a/openbsc/include/openbsc/gsm_utils.h b/openbsc/include/openbsc/gsm_utils.h index c46837185..7cd0578ad 100644 --- a/openbsc/include/openbsc/gsm_utils.h +++ b/openbsc/include/openbsc/gsm_utils.h @@ -30,4 +30,6 @@ int gsm_7bit_decode(char *decoded, const u_int8_t *user_data, u_int8_t length); int gsm_7bit_encode(u_int8_t *result, const char *data); +int ms_pwr_ctl_lvl(enum gsm_band band, unsigned int dbm); +int ms_pwr_dbm(enum gsm_band band, u_int8_t lvl); #endif diff --git a/openbsc/src/abis_rsl.c b/openbsc/src/abis_rsl.c index f5a0f6dcb..9080a6b87 100644 --- a/openbsc/src/abis_rsl.c +++ b/openbsc/src/abis_rsl.c @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -431,78 +432,6 @@ int rsl_chan_bs_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int db) return abis_rsl_sendmsg(msg); } -/* determine power control level for given dBm value, as indicated - * by the tables in chapter 4.1.1 of GSM TS 05.05 */ -static int ms_pwr_ctl_lvl(struct gsm_bts *bts, unsigned int dbm) -{ - switch (bts->band) { - case GSM_BAND_400: - case GSM_BAND_900: - case GSM_BAND_850: - if (dbm >= 39) - return 0; - else if (dbm < 5) - return 19; - else - return 2 + ((39 - dbm) / 2); - break; - case GSM_BAND_1800: - if (dbm >= 36) - return 29; - else if (dbm >= 34) - return 30; - else if (dbm >= 32) - return 31; - else - return (30 - dbm) / 2; - break; - case GSM_BAND_1900: - if (dbm >= 33) - return 30; - else if (dbm >= 32) - return 31; - else - return (30 - dbm) / 2; - break; - } - return -EINVAL; -} - -static int ms_pwr_dbm(enum gsm_band band, u_int8_t lvl) -{ - lvl &= 0x1f; - - switch (band) { - case GSM_BAND_400: - case GSM_BAND_900: - case GSM_BAND_850: - if (lvl < 2) - return 39; - else if (lvl < 20) - return 39 - ((lvl - 2) * 2) ; - else - return 5; - break; - case GSM_BAND_1800: - if (lvl < 16) - return 30 - (lvl * 2); - else if (lvl < 29) - return 0; - else - return 36 - ((lvl - 29) * 2); - break; - case GSM_BAND_1900: - if (lvl < 16) - return 30 - (lvl * 2); - else if (lvl < 30) - return -EINVAL; - else - return 33 - (lvl - 30); - break; - } - return -EINVAL; -} - int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int dbm) { struct abis_rsl_dchan_hdr *dh; @@ -510,7 +439,7 @@ int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int dbm) u_int8_t chan_nr = lchan2chan_nr(lchan); int ctl_lvl; - ctl_lvl = ms_pwr_ctl_lvl(lchan->ts->trx->bts, dbm); + ctl_lvl = ms_pwr_ctl_lvl(lchan->ts->trx->bts->band, dbm); if (ctl_lvl < 0) return ctl_lvl; @@ -1130,7 +1059,7 @@ static int rsl_rx_chan_rqd(struct msgb *msg) arfcn = lchan->ts->trx->arfcn; subch = lchan->nr; - lchan->ms_power = ms_pwr_ctl_lvl(bts, 20 /* dBm == 100mW */); + lchan->ms_power = ms_pwr_ctl_lvl(bts->band, 20 /* dBm == 100mW */); lchan->bs_power = 0x0f; /* 30dB reduction */ lchan->rsl_cmode = RSL_CMOD_SPD_SIGN; rsl_chan_activate_lchan(lchan, 0x00, rqd_ta); diff --git a/openbsc/src/bsc_hack.c b/openbsc/src/bsc_hack.c index 02ec1abed..0f0f4c8c7 100644 --- a/openbsc/src/bsc_hack.c +++ b/openbsc/src/bsc_hack.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -982,7 +983,7 @@ static void patch_tables(struct gsm_bts *bts) /* patch MS max power for CCH */ type_4->cell_sel_par.ms_txpwr_max_ccch = - ms_pwr_ctl_lvl(bts, 20 /* dBm == 100mW */); + ms_pwr_ctl_lvl(bts->band, 20 /* dBm == 100mW */); } diff --git a/openbsc/src/gsm_utils.c b/openbsc/src/gsm_utils.c index 0c25b28c6..185918ef9 100644 --- a/openbsc/src/gsm_utils.c +++ b/openbsc/src/gsm_utils.c @@ -21,9 +21,11 @@ * */ +#include #include #include #include +#include /* GSM 03.38 6.2.1 Charachter packing */ int gsm_7bit_decode(char *text, const u_int8_t *user_data, u_int8_t length) @@ -71,3 +73,77 @@ int gsm_7bit_encode(u_int8_t *result, const char *data) return out_length; } + +/* determine power control level for given dBm value, as indicated + * by the tables in chapter 4.1.1 of GSM TS 05.05 */ +int ms_pwr_ctl_lvl(enum gsm_band band, unsigned int dbm) +{ + switch (band) { + case GSM_BAND_400: + case GSM_BAND_900: + case GSM_BAND_850: + if (dbm >= 39) + return 0; + else if (dbm < 5) + return 19; + else + return 2 + ((39 - dbm) / 2); + break; + case GSM_BAND_1800: + if (dbm >= 36) + return 29; + else if (dbm >= 34) + return 30; + else if (dbm >= 32) + return 31; + else + return (30 - dbm) / 2; + break; + case GSM_BAND_1900: + if (dbm >= 33) + return 30; + else if (dbm >= 32) + return 31; + else + return (30 - dbm) / 2; + break; + } + return -EINVAL; +} + +int ms_pwr_dbm(enum gsm_band band, u_int8_t lvl) +{ + lvl &= 0x1f; + + switch (band) { + case GSM_BAND_400: + case GSM_BAND_900: + case GSM_BAND_850: + if (lvl < 2) + return 39; + else if (lvl < 20) + return 39 - ((lvl - 2) * 2) ; + else + return 5; + break; + case GSM_BAND_1800: + if (lvl < 16) + return 30 - (lvl * 2); + else if (lvl < 29) + return 0; + else + return 36 - ((lvl - 29) * 2); + break; + case GSM_BAND_1900: + if (lvl < 16) + return 30 - (lvl * 2); + else if (lvl < 30) + return -EINVAL; + else + return 33 - (lvl - 30); + break; + } + return -EINVAL; +} + +