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