WIP: OM2000: Full state machine implementation using osmo_fsm

Our existing OM2000 code for initializing all Managed Objects of a BTS
at startup was never complete.  Rather than trying to fix the old-style
code, introudce a hierarchy of osmo_fsm's reflecting the full protocol
hand-shake and sequence of bringing up the individual MO's.

If this works out well, it mihgt make sense to convert the TS 12.21 OML
code for other BTS models, too.

Change-Id: I3e11b28ba22b8c227e0401e6207fdda5381dda8c
diff --git a/openbsc/include/openbsc/abis_om2000.h b/openbsc/include/openbsc/abis_om2000.h
index 2ff7270..5a7344f 100644
--- a/openbsc/include/openbsc/abis_om2000.h
+++ b/openbsc/include/openbsc/abis_om2000.h
@@ -41,13 +41,6 @@
 	OM2K_MO_S_DISABLED,
 };
 
-struct abis_om2k_mo {
-	uint8_t class;
-	uint8_t bts;
-	uint8_t assoc_so;
-	uint8_t inst;
-} __attribute__ ((packed));
-
 /* on-wire format for IS conn group */
 struct om2k_is_conn_grp {
 	uint16_t icp1;
@@ -90,6 +83,10 @@
 int abis_om2k_tx_tx_conf_req(struct gsm_bts_trx *trx);
 int abis_om2k_tx_ts_conf_req(struct gsm_bts_trx_ts *ts);
 
+struct osmo_fsm_inst *om2k_bts_fsm_start(struct gsm_bts *bts);
+void abis_om2k_bts_init(struct gsm_bts *bts);
+void abis_om2k_trx_init(struct gsm_bts_trx *trx);
+
 int abis_om2k_vty_init(void);
 
 struct vty;
diff --git a/openbsc/include/openbsc/gsm_data_shared.h b/openbsc/include/openbsc/gsm_data_shared.h
index 4472310..97fde83 100644
--- a/openbsc/include/openbsc/gsm_data_shared.h
+++ b/openbsc/include/openbsc/gsm_data_shared.h
@@ -104,6 +104,19 @@
 	struct gsm_bts *bts;
 };
 
+/* Ericsson OM2000 Managed Object */
+struct abis_om2k_mo {
+	uint8_t class;
+	uint8_t bts;
+	uint8_t assoc_so;
+	uint8_t inst;
+} __attribute__ ((packed));
+
+struct om2k_mo {
+	struct abis_om2k_mo addr;
+	struct osmo_fsm_inst *fsm;
+};
+
 #define MAX_A5_KEY_LEN	(128/8)
 #define A38_XOR_MIN_KEY_LEN	12
 #define A38_XOR_MAX_KEY_LEN	16
@@ -387,6 +400,12 @@
 	/* To which E1 subslot are we connected */
 	struct gsm_e1_subslot e1_link;
 
+	union {
+		struct {
+			struct om2k_mo om2k_mo;
+		} rbs2000;
+	};
+
 	struct gsm_lchan lchan[TS_MAX_LCHAN];
 };
 
@@ -441,6 +460,17 @@
 			uint8_t test_nr;
 			struct rxlev_stats rxlev_stat;
 		} ipaccess;
+		struct {
+			struct {
+				struct om2k_mo om2k_mo;
+			} trxc;
+			struct {
+				struct om2k_mo om2k_mo;
+			} rx;
+			struct {
+				struct om2k_mo om2k_mo;
+			} tx;
+		} rbs2000;
 	};
 	struct gsm_bts_trx_ts ts[TRX_NR_TS];
 };
@@ -679,17 +709,26 @@
 		} bs11;
 		struct {
 			struct {
+				struct om2k_mo om2k_mo;
+				struct gsm_abis_mo mo;
+				struct llist_head conn_groups;
+			} cf;
+			struct {
+				struct om2k_mo om2k_mo;
 				struct gsm_abis_mo mo;
 				struct llist_head conn_groups;
 			} is;
 			struct {
+				struct om2k_mo om2k_mo;
 				struct gsm_abis_mo mo;
 				struct llist_head conn_groups;
 			} con;
 			struct {
+				struct om2k_mo om2k_mo;
 				struct gsm_abis_mo mo;
 			} dp;
 			struct {
+				struct om2k_mo om2k_mo;
 				struct gsm_abis_mo mo;
 			} tf;
 		} rbs2000;