blob: 5a5f883066b465428d7b50dda3e1d480e71b4072 [file] [log] [blame]
Harald Welte39315c42010-01-10 18:01:52 +01001/* Siemens BS-11 specific code */
2
3/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
4 *
5 * All Rights Reserved
6 *
7 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-01-01 15:25:50 +01008 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
Harald Welte39315c42010-01-10 18:01:52 +010010 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte9af6ddf2011-01-01 15:25:50 +010015 * GNU Affero General Public License for more details.
Harald Welte39315c42010-01-10 18:01:52 +010016 *
Harald Welte9af6ddf2011-01-01 15:25:50 +010017 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Harald Welte39315c42010-01-10 18:01:52 +010019 *
20 */
21
22#include <sys/types.h>
23
Harald Weltedfe6c7d2010-02-20 16:24:02 +010024#include <osmocore/tlv.h>
Harald Weltef338a032011-01-14 15:55:42 +010025
26#include <openbsc/debug.h>
27#include <openbsc/gsm_data.h>
Harald Welte39315c42010-01-10 18:01:52 +010028#include <openbsc/abis_nm.h>
Harald Weltef338a032011-01-14 15:55:42 +010029#include <openbsc/e1_input.h>
30#include <openbsc/signal.h>
Harald Welte39315c42010-01-10 18:01:52 +010031
32static struct gsm_bts_model model_bs11 = {
33 .type = GSM_BTS_TYPE_BS11,
Harald Welte09cefee2011-02-12 12:29:21 +010034 .name = "bs11",
35 .oml_rcvmsg = &abis_nm_rcvmsg,
Harald Welte39315c42010-01-10 18:01:52 +010036 .nm_att_tlvdef = {
37 .def = {
38 [NM_ATT_AVAIL_STATUS] = { TLV_TYPE_TLV },
39 /* BS11 specifics */
40 [NM_ATT_BS11_ESN_FW_CODE_NO] = { TLV_TYPE_TLV },
41 [NM_ATT_BS11_ESN_HW_CODE_NO] = { TLV_TYPE_TLV },
42 [NM_ATT_BS11_ESN_PCB_SERIAL] = { TLV_TYPE_TLV },
43 [NM_ATT_BS11_BOOT_SW_VERS] = { TLV_TYPE_TLV },
44 [0xd5] = { TLV_TYPE_TLV },
45 [0xa8] = { TLV_TYPE_TLV },
46 [NM_ATT_BS11_PASSWORD] = { TLV_TYPE_TLV },
47 [NM_ATT_BS11_TXPWR] = { TLV_TYPE_TLV },
48 [NM_ATT_BS11_RSSI_OFFS] = { TLV_TYPE_TLV },
49 [NM_ATT_BS11_LINE_CFG] = { TLV_TYPE_TV },
50 [NM_ATT_BS11_L1_PROT_TYPE] = { TLV_TYPE_TV },
51 [NM_ATT_BS11_BIT_ERR_THESH] = { TLV_TYPE_FIXED, 2 },
52 [NM_ATT_BS11_DIVERSITY] = { TLV_TYPE_TLV },
53 [NM_ATT_BS11_LMT_LOGON_SESSION]={ TLV_TYPE_TLV },
54 [NM_ATT_BS11_LMT_LOGIN_TIME] = { TLV_TYPE_TLV },
55 [NM_ATT_BS11_LMT_USER_ACC_LEV] ={ TLV_TYPE_TLV },
56 [NM_ATT_BS11_LMT_USER_NAME] = { TLV_TYPE_TLV },
57 [NM_ATT_BS11_BTS_STATE] = { TLV_TYPE_TLV },
58 [NM_ATT_BS11_E1_STATE] = { TLV_TYPE_TLV },
59 [NM_ATT_BS11_PLL_MODE] = { TLV_TYPE_TLV },
60 [NM_ATT_BS11_PLL] = { TLV_TYPE_TLV },
61 [NM_ATT_BS11_CCLK_ACCURACY] = { TLV_TYPE_TV },
62 [NM_ATT_BS11_CCLK_TYPE] = { TLV_TYPE_TV },
63 [0x95] = { TLV_TYPE_FIXED, 2 },
64 },
65 },
66};
67
Harald Weltef338a032011-01-14 15:55:42 +010068/* The following definitions are for OM and NM packets that we cannot yet
69 * generate by code but we just pass on */
70
71// BTS Site Manager, SET ATTRIBUTES
72
73/*
74 Object Class: BTS Site Manager
75 Instance 1: FF
76 Instance 2: FF
77 Instance 3: FF
78SET ATTRIBUTES
79 sAbisExternalTime: 2007/09/08 14:36:11
80 omLAPDRelTimer: 30sec
81 shortLAPDIntTimer: 5sec
82 emergencyTimer1: 10 minutes
83 emergencyTimer2: 0 minutes
84*/
85
86unsigned char msg_1[] =
87{
88 NM_MT_BS11_SET_ATTR, NM_OC_SITE_MANAGER, 0xFF, 0xFF, 0xFF,
89 NM_ATT_BS11_ABIS_EXT_TIME, 0x07,
90 0xD7, 0x09, 0x08, 0x0E, 0x24, 0x0B, 0xCE,
91 0x02,
92 0x00, 0x1E,
93 NM_ATT_BS11_SH_LAPD_INT_TIMER,
94 0x01, 0x05,
95 0x42, 0x02, 0x00, 0x0A,
96 0x44, 0x02, 0x00, 0x00
97};
98
99// BTS, SET BTS ATTRIBUTES
100
101/*
102 Object Class: BTS
103 BTS relat. Number: 0
104 Instance 2: FF
105 Instance 3: FF
106SET BTS ATTRIBUTES
107 bsIdentityCode / BSIC:
108 PLMN_colour_code: 7h
109 BS_colour_code: 7h
110 BTS Air Timer T3105: 4 ,unit 10 ms
111 btsIsHopping: FALSE
112 periodCCCHLoadIndication: 1sec
113 thresholdCCCHLoadIndication: 0%
114 cellAllocationNumber: 00h = GSM 900
115 enableInterferenceClass: 00h = Disabled
116 fACCHQual: 6 (FACCH stealing flags minus 1)
117 intaveParameter: 31 SACCH multiframes
118 interferenceLevelBoundaries:
119 Interference Boundary 1: 0Ah
120 Interference Boundary 2: 0Fh
121 Interference Boundary 3: 14h
122 Interference Boundary 4: 19h
123 Interference Boundary 5: 1Eh
124 mSTxPwrMax: 11
125 GSM range: 2=39dBm, 15=13dBm, stepsize 2 dBm
126 DCS1800 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
127 PCS1900 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
128 30=33dBm, 31=32dBm
129 ny1:
130 Maximum number of repetitions for PHYSICAL INFORMATION message (GSM 04.08): 20
131 powerOutputThresholds:
132 Out Power Fault Threshold: -10 dB
133 Red Out Power Threshold: - 6 dB
134 Excessive Out Power Threshold: 5 dB
135 rACHBusyThreshold: -127 dBm
136 rACHLoadAveragingSlots: 250 ,number of RACH burst periods
137 rfResourceIndicationPeriod: 125 SACCH multiframes
138 T200:
139 SDCCH: 044 in 5 ms
140 FACCH/Full rate: 031 in 5 ms
141 FACCH/Half rate: 041 in 5 ms
142 SACCH with TCH SAPI0: 090 in 10 ms
143 SACCH with SDCCH: 090 in 10 ms
144 SDCCH with SAPI3: 090 in 5 ms
145 SACCH with TCH SAPI3: 135 in 10 ms
146 tSync: 9000 units of 10 msec
147 tTrau: 9000 units of 10 msec
148 enableUmLoopTest: 00h = disabled
149 enableExcessiveDistance: 00h = Disabled
150 excessiveDistance: 64km
151 hoppingMode: 00h = baseband hopping
152 cellType: 00h = Standard Cell
153 BCCH ARFCN / bCCHFrequency: 1
154*/
155
156static unsigned char bs11_attr_bts[] =
157{
158 NM_ATT_BSIC, HARDCODED_BSIC,
159 NM_ATT_BTS_AIR_TIMER, 0x04,
160 NM_ATT_BS11_BTSLS_HOPPING, 0x00,
161 NM_ATT_CCCH_L_I_P, 0x01,
162 NM_ATT_CCCH_L_T, 0x00,
163 NM_ATT_BS11_CELL_ALLOC_NR, NM_BS11_CANR_GSM,
164 NM_ATT_BS11_ENA_INTERF_CLASS, 0x01,
165 NM_ATT_BS11_FACCH_QUAL, 0x06,
166 /* interference avg. period in numbers of SACCH multifr */
167 NM_ATT_INTAVE_PARAM, 0x1F,
168 NM_ATT_INTERF_BOUND, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x7B,
169 NM_ATT_CCCH_L_T, 0x23,
170 NM_ATT_GSM_TIME, 0x28, 0x00,
171 NM_ATT_ADM_STATE, 0x03,
172 NM_ATT_RACH_B_THRESH, 0x7F,
173 NM_ATT_LDAVG_SLOTS, 0x00, 0xFA,
174 NM_ATT_BS11_RF_RES_IND_PER, 0x7D,
175 NM_ATT_T200, 0x2C, 0x1F, 0x29, 0x5A, 0x5A, 0x5A, 0x87,
176 NM_ATT_BS11_TSYNC, 0x23, 0x28,
177 NM_ATT_BS11_TTRAU, 0x23, 0x28,
178 NM_ATT_TEST_DUR, 0x01, 0x00,
179 NM_ATT_OUTST_ALARM, 0x01, 0x00,
180 NM_ATT_BS11_EXCESSIVE_DISTANCE, 0x01, 0x40,
181 NM_ATT_BS11_HOPPING_MODE, 0x01, 0x00,
182 NM_ATT_BS11_PLL, 0x01, 0x00,
183 NM_ATT_BCCH_ARFCN, 0x00, HARDCODED_ARFCN/*0x01*/,
184};
185
186// Handover Recognition, SET ATTRIBUTES
187
188/*
189Illegal Contents GSM Formatted O&M Msg
190 Object Class: Handover Recognition
191 BTS relat. Number: 0
192 Instance 2: FF
193 Instance 3: FF
194SET ATTRIBUTES
195 enableDelayPowerBudgetHO: 00h = Disabled
196 enableDistanceHO: 00h = Disabled
197 enableInternalInterCellHandover: 00h = Disabled
198 enableInternalIntraCellHandover: 00h = Disabled
199 enablePowerBudgetHO: 00h = Disabled
200 enableRXLEVHO: 00h = Disabled
201 enableRXQUALHO: 00h = Disabled
202 hoAveragingDistance: 8 SACCH multiframes
203 hoAveragingLev:
204 A_LEV_HO: 8 SACCH multiframes
205 W_LEV_HO: 1 SACCH multiframes
206 hoAveragingPowerBudget: 16 SACCH multiframes
207 hoAveragingQual:
208 A_QUAL_HO: 8 SACCH multiframes
209 W_QUAL_HO: 2 SACCH multiframes
210 hoLowerThresholdLevDL: (10 - 110) dBm
211 hoLowerThresholdLevUL: (5 - 110) dBm
212 hoLowerThresholdQualDL: 06h = 6.4% < BER < 12.8%
213 hoLowerThresholdQualUL: 06h = 6.4% < BER < 12.8%
214 hoThresholdLevDLintra : (20 - 110) dBm
215 hoThresholdLevULintra: (20 - 110) dBm
216 hoThresholdMsRangeMax: 20 km
217 nCell: 06h
218 timerHORequest: 3 ,unit 2 SACCH multiframes
219*/
220
221unsigned char msg_3[] =
222{
223 NM_MT_BS11_SET_ATTR, NM_OC_BS11_HANDOVER, 0x00, 0xFF, 0xFF,
224 0xD0, 0x00, /* enableDelayPowerBudgetHO */
225 0x64, 0x00, /* enableDistanceHO */
226 0x67, 0x00, /* enableInternalInterCellHandover */
227 0x68, 0x00, /* enableInternalInterCellHandover */
228 0x6A, 0x00, /* enablePowerBudgetHO */
229 0x6C, 0x00, /* enableRXLEVHO */
230 0x6D, 0x00, /* enableRXQUALHO */
231 0x6F, 0x08, /* hoAveragingDistance */
232 0x70, 0x08, 0x01, /* hoAveragingLev */
233 0x71, 0x10, 0x10, 0x10,
234 0x72, 0x08, 0x02, /* hoAveragingQual */
235 0x73, 0x0A, /* hoLowerThresholdLevDL */
236 0x74, 0x05, /* hoLowerThresholdLevUL */
237 0x75, 0x06, /* hoLowerThresholdQualDL */
238 0x76, 0x06, /* hoLowerThresholdQualUL */
239 0x78, 0x14, /* hoThresholdLevDLintra */
240 0x79, 0x14, /* hoThresholdLevULintra */
241 0x7A, 0x14, /* hoThresholdMsRangeMax */
242 0x7D, 0x06, /* nCell */
243 NM_ATT_BS11_TIMER_HO_REQUEST, 0x03,
244 0x20, 0x01, 0x00,
245 0x45, 0x01, 0x00,
246 0x48, 0x01, 0x00,
247 0x5A, 0x01, 0x00,
248 0x5B, 0x01, 0x05,
249 0x5E, 0x01, 0x1A,
250 0x5F, 0x01, 0x20,
251 0x9D, 0x01, 0x00,
252 0x47, 0x01, 0x00,
253 0x5C, 0x01, 0x64,
254 0x5D, 0x01, 0x1E,
255 0x97, 0x01, 0x20,
256 0xF7, 0x01, 0x3C,
257};
258
259// Power Control, SET ATTRIBUTES
260
261/*
262 Object Class: Power Control
263 BTS relat. Number: 0
264 Instance 2: FF
265 Instance 3: FF
266SET ATTRIBUTES
267 enableMsPowerControl: 00h = Disabled
268 enablePowerControlRLFW: 00h = Disabled
269 pcAveragingLev:
270 A_LEV_PC: 4 SACCH multiframes
271 W_LEV_PC: 1 SACCH multiframes
272 pcAveragingQual:
273 A_QUAL_PC: 4 SACCH multiframes
274 W_QUAL_PC: 2 SACCH multiframes
275 pcLowerThresholdLevDL: 0Fh
276 pcLowerThresholdLevUL: 0Ah
277 pcLowerThresholdQualDL: 05h = 3.2% < BER < 6.4%
278 pcLowerThresholdQualUL: 05h = 3.2% < BER < 6.4%
279 pcRLFThreshold: 0Ch
280 pcUpperThresholdLevDL: 14h
281 pcUpperThresholdLevUL: 0Fh
282 pcUpperThresholdQualDL: 04h = 1.6% < BER < 3.2%
283 pcUpperThresholdQualUL: 04h = 1.6% < BER < 3.2%
284 powerConfirm: 2 ,unit 2 SACCH multiframes
285 powerControlInterval: 2 ,unit 2 SACCH multiframes
286 powerIncrStepSize: 02h = 4 dB
287 powerRedStepSize: 01h = 2 dB
288 radioLinkTimeoutBs: 64 SACCH multiframes
289 enableBSPowerControl: 00h = disabled
290*/
291
292unsigned char msg_4[] =
293{
294 NM_MT_BS11_SET_ATTR, NM_OC_BS11_PWR_CTRL, 0x00, 0xFF, 0xFF,
295 NM_ATT_BS11_ENA_MS_PWR_CTRL, 0x00,
296 NM_ATT_BS11_ENA_PWR_CTRL_RLFW, 0x00,
297 0x7E, 0x04, 0x01, /* pcAveragingLev */
298 0x7F, 0x04, 0x02, /* pcAveragingQual */
299 0x80, 0x0F, /* pcLowerThresholdLevDL */
300 0x81, 0x0A, /* pcLowerThresholdLevUL */
301 0x82, 0x05, /* pcLowerThresholdQualDL */
302 0x83, 0x05, /* pcLowerThresholdQualUL */
303 0x84, 0x0C, /* pcRLFThreshold */
304 0x85, 0x14, /* pcUpperThresholdLevDL */
305 0x86, 0x0F, /* pcUpperThresholdLevUL */
306 0x87, 0x04, /* pcUpperThresholdQualDL */
307 0x88, 0x04, /* pcUpperThresholdQualUL */
308 0x89, 0x02, /* powerConfirm */
309 0x8A, 0x02, /* powerConfirmInterval */
310 0x8B, 0x02, /* powerIncrStepSize */
311 0x8C, 0x01, /* powerRedStepSize */
312 0x8D, 0x40, /* radioLinkTimeoutBs */
313 0x65, 0x01, 0x00 // set to 0x01 to enable BSPowerControl
314};
315
316
317// Transceiver, SET TRX ATTRIBUTES (TRX 0)
318
319/*
320 Object Class: Transceiver
321 BTS relat. Number: 0
322 Tranceiver number: 0
323 Instance 3: FF
324SET TRX ATTRIBUTES
325 aRFCNList (HEX): 0001
326 txPwrMaxReduction: 00h = 30dB
327 radioMeasGran: 254 SACCH multiframes
328 radioMeasRep: 01h = enabled
329 memberOfEmergencyConfig: 01h = TRUE
330 trxArea: 00h = TRX doesn't belong to a concentric cell
331*/
332
333static unsigned char bs11_attr_radio[] =
334{
335 NM_ATT_ARFCN_LIST, 0x01, 0x00, HARDCODED_ARFCN /*0x01*/,
336 NM_ATT_RF_MAXPOWR_R, 0x00,
337 NM_ATT_BS11_RADIO_MEAS_GRAN, 0x01, 0x05,
338 NM_ATT_BS11_RADIO_MEAS_REP, 0x01, 0x01,
339 NM_ATT_BS11_EMRG_CFG_MEMBER, 0x01, 0x01,
340 NM_ATT_BS11_TRX_AREA, 0x01, 0x00,
341};
342
343/*
344 * Patch the various SYSTEM INFORMATION tables to update
345 * the LAI
346 */
347static void patch_nm_tables(struct gsm_bts *bts)
348{
349 u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
350 u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
351
352 /* patch ARFCN into BTS Attributes */
353 bs11_attr_bts[69] &= 0xf0;
354 bs11_attr_bts[69] |= arfcn_high;
355 bs11_attr_bts[70] = arfcn_low;
356
357 /* patch ARFCN into TRX Attributes */
358 bs11_attr_radio[2] &= 0xf0;
359 bs11_attr_radio[2] |= arfcn_high;
360 bs11_attr_radio[3] = arfcn_low;
361
362 /* patch the RACH attributes */
363 if (bts->rach_b_thresh != -1)
364 bs11_attr_bts[33] = bts->rach_b_thresh & 0xff;
365
366 if (bts->rach_ldavg_slots != -1) {
367 u_int8_t avg_high = bts->rach_ldavg_slots & 0xff;
368 u_int8_t avg_low = (bts->rach_ldavg_slots >> 8) & 0x0f;
369
370 bs11_attr_bts[35] = avg_high;
371 bs11_attr_bts[36] = avg_low;
372 }
373
374 /* patch BSIC */
375 bs11_attr_bts[1] = bts->bsic;
376
377 /* patch the power reduction */
378 bs11_attr_radio[5] = bts->c0->max_power_red / 2;
379}
380
381
382static void nm_reconfig_ts(struct gsm_bts_trx_ts *ts)
383{
384 enum abis_nm_chan_comb ccomb = abis_nm_chcomb4pchan(ts->pchan);
385 struct gsm_e1_subslot *e1l = &ts->e1_link;
386
387 abis_nm_set_channel_attr(ts, ccomb);
388
389 if (is_ipaccess_bts(ts->trx->bts))
390 return;
391
392 switch (ts->pchan) {
393 case GSM_PCHAN_TCH_F:
394 case GSM_PCHAN_TCH_H:
395 abis_nm_conn_terr_traf(ts, e1l->e1_nr, e1l->e1_ts,
396 e1l->e1_ts_ss);
397 break;
398 default:
399 break;
400 }
401}
402
403static void nm_reconfig_trx(struct gsm_bts_trx *trx)
404{
405 struct gsm_e1_subslot *e1l = &trx->rsl_e1_link;
406 int i;
407
408 patch_nm_tables(trx->bts);
409
410 switch (trx->bts->type) {
411 case GSM_BTS_TYPE_BS11:
412 /* FIXME: discover this by fetching an attribute */
413#if 0
414 trx->nominal_power = 15; /* 15dBm == 30mW PA configuration */
415#else
416 trx->nominal_power = 24; /* 24dBm == 250mW PA configuration */
417#endif
418 abis_nm_conn_terr_sign(trx, e1l->e1_nr, e1l->e1_ts,
419 e1l->e1_ts_ss);
420 abis_nm_establish_tei(trx->bts, trx->nr, e1l->e1_nr,
421 e1l->e1_ts, e1l->e1_ts_ss, trx->rsl_tei);
422
423 /* Set Radio Attributes */
424 if (trx == trx->bts->c0)
425 abis_nm_set_radio_attr(trx, bs11_attr_radio,
426 sizeof(bs11_attr_radio));
427 else {
428 u_int8_t trx1_attr_radio[sizeof(bs11_attr_radio)];
429 u_int8_t arfcn_low = trx->arfcn & 0xff;
430 u_int8_t arfcn_high = (trx->arfcn >> 8) & 0x0f;
431 memcpy(trx1_attr_radio, bs11_attr_radio,
432 sizeof(trx1_attr_radio));
433
434 /* patch ARFCN into TRX Attributes */
435 trx1_attr_radio[2] &= 0xf0;
436 trx1_attr_radio[2] |= arfcn_high;
437 trx1_attr_radio[3] = arfcn_low;
438
439 abis_nm_set_radio_attr(trx, trx1_attr_radio,
440 sizeof(trx1_attr_radio));
441 }
442 break;
443 case GSM_BTS_TYPE_NANOBTS:
444 switch (trx->bts->band) {
445 case GSM_BAND_850:
446 case GSM_BAND_900:
447 trx->nominal_power = 20;
448 break;
449 case GSM_BAND_1800:
450 case GSM_BAND_1900:
451 trx->nominal_power = 23;
452 break;
453 default:
454 LOGP(DNM, LOGL_ERROR, "Unsupported nanoBTS GSM band %s\n",
455 gsm_band_name(trx->bts->band));
456 break;
457 }
458 break;
459 default:
460 break;
461 }
462
463 for (i = 0; i < TRX_NR_TS; i++)
464 nm_reconfig_ts(&trx->ts[i]);
465}
466
467static void nm_reconfig_bts(struct gsm_bts *bts)
468{
469 struct gsm_bts_trx *trx;
470
471 switch (bts->type) {
472 case GSM_BTS_TYPE_BS11:
473 patch_nm_tables(bts);
474 abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
475 abis_nm_set_bts_attr(bts, bs11_attr_bts, sizeof(bs11_attr_bts));
476 abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
477 abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
478 break;
479 default:
480 break;
481 }
482
483 llist_for_each_entry(trx, &bts->trx_list, list)
484 nm_reconfig_trx(trx);
485}
486
487
488static void bootstrap_om_bs11(struct gsm_bts *bts)
489{
490 LOGP(DNM, LOGL_NOTICE, "bootstrapping OML for BTS %u\n", bts->nr);
491
492 /* stop sending event reports */
493 abis_nm_event_reports(bts, 0);
494
495 /* begin DB transmission */
496 abis_nm_bs11_db_transmission(bts, 1);
497
498 /* end DB transmission */
499 abis_nm_bs11_db_transmission(bts, 0);
500
501 /* Reset BTS Site manager resource */
502 abis_nm_bs11_reset_resource(bts);
503
504 /* begin DB transmission */
505 abis_nm_bs11_db_transmission(bts, 1);
506
507 /* reconfigure BTS with all TRX and all TS */
508 nm_reconfig_bts(bts);
509
510 /* end DB transmission */
511 abis_nm_bs11_db_transmission(bts, 0);
512
513 /* Reset BTS Site manager resource */
514 abis_nm_bs11_reset_resource(bts);
515
516 /* restart sending event reports */
517 abis_nm_event_reports(bts, 1);
518}
519
520static int shutdown_om(struct gsm_bts *bts)
521{
522 /* stop sending event reports */
523 abis_nm_event_reports(bts, 0);
524
525 /* begin DB transmission */
526 abis_nm_bs11_db_transmission(bts, 1);
527
528 /* end DB transmission */
529 abis_nm_bs11_db_transmission(bts, 0);
530
531 /* Reset BTS Site manager resource */
532 abis_nm_bs11_reset_resource(bts);
533
534 return 0;
535}
536
537/* Callback function to be called every time we receive a signal from INPUT */
538static int gbl_sig_cb(unsigned int subsys, unsigned int signal,
539 void *handler_data, void *signal_data)
540{
541 struct gsm_bts *bts;
542
543 if (subsys != SS_GLOBAL)
544 return 0;
545
546 switch (signal) {
547 case S_GLOBAL_BTS_CLOSE_OM:
548 bts = signal_data;
549 if (bts->type == GSM_BTS_TYPE_BS11)
550 shutdown_om(signal_data);
551 break;
552 }
553
554 return 0;
555}
556
557/* Callback function to be called every time we receive a signal from INPUT */
558static int inp_sig_cb(unsigned int subsys, unsigned int signal,
559 void *handler_data, void *signal_data)
560{
561 struct input_signal_data *isd = signal_data;
562
563 if (subsys != SS_INPUT)
564 return 0;
565
566 switch (signal) {
567 case S_INP_TEI_UP:
568 switch (isd->link_type) {
569 case E1INP_SIGN_OML:
570 if (isd->trx->bts->type == GSM_BTS_TYPE_BS11)
571 bootstrap_om_bs11(isd->trx->bts);
572 break;
573 }
574 }
575
576 return 0;
577}
578
Harald Welte39315c42010-01-10 18:01:52 +0100579int bts_model_bs11_init(void)
580{
Holger Hans Peter Freytherc8bf3c12010-06-21 18:11:37 +0800581 model_bs11.features.data = &model_bs11._features_data[0];
Harald Weltef3d8e922010-06-14 22:44:42 +0200582 model_bs11.features.data_len = sizeof(model_bs11._features_data);
583
584 gsm_btsmodel_set_feature(&model_bs11, BTS_FEAT_HOPPING);
585 gsm_btsmodel_set_feature(&model_bs11, BTS_FEAT_HSCSD);
586
Harald Weltef338a032011-01-14 15:55:42 +0100587 register_signal_handler(SS_INPUT, inp_sig_cb, NULL);
588 register_signal_handler(SS_GLOBAL, gbl_sig_cb, NULL);
589
Harald Welte39315c42010-01-10 18:01:52 +0100590 return gsm_bts_model_register(&model_bs11);
591}