rsl: Check if the channel is active and then start the channel release

In case we receive ERROR INDICATION and CONNECTION FAILURE we only
want to RF Channel Release the lchan once. This code is more simple
and should work as reliable as the previous commit.
diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c
index de76d0f..748ab7e 100644
--- a/openbsc/src/libbsc/abis_rsl.c
+++ b/openbsc/src/libbsc/abis_rsl.c
@@ -726,6 +726,16 @@
 	return rc;
 }
 
+/*
+ * Special handling for channel releases in the error case.
+ */
+static int rsl_rf_chan_release_err(struct gsm_lchan *lchan)
+{
+	if (lchan->state != LCHAN_S_ACTIVE)
+		return 0;
+	return rsl_rf_chan_release(lchan, 1, SACCH_DEACTIVATE);
+}
+
 static int rsl_rx_rf_chan_rel_ack(struct gsm_lchan *lchan)
 {
 
@@ -1017,12 +1027,6 @@
 	     gsm_lchan_name(msg->lchan),
 	     gsm_lchans_name(msg->lchan->state));
 
-	/* We might have already received an ERROR INDICATION */
-	if (msg->lchan->state != LCHAN_S_ACTIVE) {
-		LOGPC(DRSL, LOGL_NOTICE, "\n");
-		return 0;
-	}
-
 	rsl_tlv_parse(&tp, dh->data, msgb_l2len(msg)-sizeof(*dh));
 
 	if (TLVP_PRESENT(&tp, RSL_IE_CAUSE))
@@ -1031,7 +1035,7 @@
 
 	LOGPC(DRSL, LOGL_NOTICE, "\n");
 	osmo_counter_inc(msg->lchan->ts->trx->bts->network->stats.chan.rf_fail);
-	return rsl_rf_chan_release(msg->lchan, 1, SACCH_DEACTIVATE);
+	return rsl_rf_chan_release_err(msg->lchan);
 }
 
 static void print_meas_rep_uni(struct gsm_meas_rep_unidir *mru,
@@ -1598,19 +1602,11 @@
 		rsl_rlm_cause_name(rlm_cause),
 		gsm_lchans_name(msg->lchan->state));
 
-	/* If the channel is already failing no need to inform anyone. */
-	if (msg->lchan->state != LCHAN_S_ACTIVE)
-		return 0;
-
 	rll_indication(msg->lchan, rllh->link_id, BSC_RLLR_IND_ERR_IND);
 
-	/* The channel might have been released already. */
-	if (msg->lchan->state != LCHAN_S_ACTIVE)
-		return 0;
-
 	if (rlm_cause == RLL_CAUSE_T200_EXPIRED) {
 		osmo_counter_inc(msg->lchan->ts->trx->bts->network->stats.chan.rll_err);
-		return rsl_rf_chan_release(msg->lchan, 1, SACCH_DEACTIVATE);
+		return rsl_rf_chan_release_err(msg->lchan);
 	}
 
 	return 0;