msc {
	hscale=2;
	ms [label="MS"], bts [label="BTS"], bsc[label="BSC"], bsc_lchan[label="BSC lchan FSM"];

	ms note bsc_lchan [label="lchan allocation sequence for RSL Channel Request"];

	ms => bts [label="RR Channel Request"];
	bts => bsc [label="RSL Channel Request"];
	bsc box bsc [label="rsl_rx_chan_rqd()"];
	bsc note bsc [label="Obtain RACH data from Request: - Reference - Access Delay (TA)
		- Request Reason - Channel Type"];
	bsc note bsc [label="If the reason is PDCH, the RACH Request is forwarded to PCU and BSC is no
		longer concerned (rsl_rx_pchan_rqd())."];
	bsc note bsc [label="Always try to allocate an SDCCH regardless of the requested type, only if no
		SDCCH is available, look for the actually requested channel type."];
	bsc box bsc [label="lchan_select_by_type(SDCCH)"];

	--- [label="IF no lchan is available (neither SDCCH nor requested type)"];
	bsc note bsc [label="Figure out T3122 value from bts->T3122, network->T3122 or
		GSM_T3122_DEFAULT"];
	bsc box bsc [label="rsl_send_imm_ass_rej(wait_ind=T3122)"];
	bsc note bsc [label="..."];
	bts <= bsc [label="RR Immediate Assign Reject"];
	ms <= bts [label="RR Immediate Assign Reject (possibly grouped with up to 4 others)"];
	bsc note bsc [label="rsl_rx_pchan_rqd() exits, no channel is allocated."];
	--- [label="END: no lchan is available"];

	bsc box bsc [label="Store RACH data in lchan->rqd_ref, rqd_ta"];
	bsc -> bsc_lchan [label="lchan_allocate(FOR_MS_CHANNEL_REQUEST)"];
	bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_ACTIV_ACK\nT3103"];
	bsc_lchan note bsc_lchan [label="The lchan FSM knows that FOR_MS_CHANNEL_REQUEST is about
		Immediate Assignment."];
	bts <= bsc_lchan [label="RSL Chan Activ (Immediate Assignment)"];
	...;
	--- [label="on any error"];
	bts <= bsc_lchan [label="RR Immediate Assign Reject"];
	ms <= bts [label="RR Immediate Assign Reject (possibly grouped with up to 4 others)"];
	---;
	...;
	bts => bsc_lchan [label="RSL Chan Activ ACK"];
	bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nRLL_ESTABLISH\ncontinue T3103"];
	...;
	--- [label="on timeout"];
	bsc_lchan box bsc_lchan [label="lchan_error_release(deact_sacch=true)"];
	bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_RF_RELEASE_ACK"];
	bts <= bsc_lchan [label="RLL Release Request (Local End)..."];
	bts <= bsc_lchan [label="...for all SAPIs including [0]"];
	bts <= bsc_lchan [label="RSL Deactivate SACCH"];
	bts <= bsc_lchan [label="RSL RF Channel Release"];
	...;
	bts => bsc_lchan [label="RSL RF Channel Release ACK"];
	bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_AFTER_ERROR"];
	...;
	bsc_lchan abox bsc_lchan [label="LCHAN_ST_UNUSED"];
	---;
	ms => bsc_lchan [label="RLL Establish Ind"];
	bsc_lchan box bsc_lchan [label="associate lchan FSM with new conn FSM"];
	bsc_lchan abox bsc_lchan [label="LCHAN_ST_ACTIVE"];
}
