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