\doxysection{Seriall Communications (HDLC)}
\label{group__sercomm}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}


Serial communications layer, based on HDLC.  


\doxysubsection*{Files}
\begin{DoxyCompactItemize}
\item 
file \textbf{ sercomm.\+h}
\begin{DoxyCompactList}\small\item\em Osmocom Sercomm HDLC (de)multiplex. \end{DoxyCompactList}\item 
file \textbf{ sercomm.\+c}
\end{DoxyCompactItemize}
\doxysubsection*{Data Structures}
\begin{DoxyCompactItemize}
\item 
struct \textbf{ osmo\+\_\+sercomm\+\_\+inst}
\begin{DoxyCompactList}\small\item\em one instance of a sercomm multiplex/demultiplex \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Macros}
\begin{DoxyCompactItemize}
\item 
\#define \textbf{ DEFAULT\+\_\+\+RX\+\_\+\+MSG\+\_\+\+SIZE}~2048
\item 
\#define \textbf{ HDLC\+\_\+\+FLAG}~0x7E
\item 
\#define \textbf{ HDLC\+\_\+\+ESCAPE}~0x7D
\item 
\#define \textbf{ HDLC\+\_\+\+C\+\_\+\+UI}~0x03
\item 
\#define \textbf{ HDLC\+\_\+\+C\+\_\+\+P\+\_\+\+BIT}~(1 $<$$<$ 4)
\item 
\#define \textbf{ HDLC\+\_\+\+C\+\_\+\+F\+\_\+\+BIT}~(1 $<$$<$ 4)
\end{DoxyCompactItemize}
\doxysubsection*{Typedefs}
\begin{DoxyCompactItemize}
\item 
typedef void($\ast$ \textbf{ dlci\+\_\+cb\+\_\+t}) (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm, uint8\+\_\+t dlci, struct \textbf{ msgb} $\ast$\textbf{ msg})
\begin{DoxyCompactList}\small\item\em call-\/back function for per-\/\+DLC receive handler \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Enumerations}
\begin{DoxyCompactItemize}
\item 
enum \textbf{ sercomm\+\_\+dlci} \{ \newline
\textbf{ SC\+\_\+\+DLCI\+\_\+\+HIGHEST} = 0
, \newline
\textbf{ SC\+\_\+\+DLCI\+\_\+\+DEBUG} = 4
, \newline
\textbf{ SC\+\_\+\+DLCI\+\_\+\+L1\+A\+\_\+\+L23} = 5
, \newline
\textbf{ SC\+\_\+\+DLCI\+\_\+\+LOADER} = 9
, \newline
\textbf{ SC\+\_\+\+DLCI\+\_\+\+CONSOLE} = 10
, \newline
\textbf{ SC\+\_\+\+DLCI\+\_\+\+ECHO} = 128
, \newline
\textbf{ \+\_\+\+SC\+\_\+\+DLCI\+\_\+\+MAX}
 \}
\begin{DoxyCompactList}\small\item\em A low sercomm\+\_\+dlci means high priority. \end{DoxyCompactList}\item 
enum \textbf{ rx\+\_\+state} \{ \newline
\textbf{ RX\+\_\+\+ST\+\_\+\+WAIT\+\_\+\+START}
, \newline
\textbf{ RX\+\_\+\+ST\+\_\+\+ADDR}
, \newline
\textbf{ RX\+\_\+\+ST\+\_\+\+CTRL}
, \newline
\textbf{ RX\+\_\+\+ST\+\_\+\+DATA}
, \newline
\textbf{ RX\+\_\+\+ST\+\_\+\+ESCAPE}
 \}
\end{DoxyCompactItemize}
\doxysubsection*{Functions}
\begin{DoxyCompactItemize}
\item 
void \textbf{ osmo\+\_\+sercomm\+\_\+init} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm)
\begin{DoxyCompactList}\small\item\em Initialize an Osmocom sercomm instance. \end{DoxyCompactList}\item 
int \textbf{ osmo\+\_\+sercomm\+\_\+initialized} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm)
\begin{DoxyCompactList}\small\item\em Determine if a given Osmocom sercomm instance has been initialized. \end{DoxyCompactList}\item 
void \textbf{ osmo\+\_\+sercomm\+\_\+sendmsg} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm, uint8\+\_\+t dlci, struct \textbf{ msgb} $\ast$\textbf{ msg})
\begin{DoxyCompactList}\small\item\em User interface for transmitting messages for a given DLCI. \end{DoxyCompactList}\item 
unsigned int \textbf{ osmo\+\_\+sercomm\+\_\+tx\+\_\+queue\+\_\+depth} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm, uint8\+\_\+t dlci)
\begin{DoxyCompactList}\small\item\em How deep is the Tx queue for a given DLCI? \end{DoxyCompactList}\item 
int \textbf{ osmo\+\_\+sercomm\+\_\+register\+\_\+rx\+\_\+cb} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm, uint8\+\_\+t dlci, \textbf{ dlci\+\_\+cb\+\_\+t} cb)
\begin{DoxyCompactList}\small\item\em Register a handler for a given DLCI. \end{DoxyCompactList}\item 
int \textbf{ osmo\+\_\+sercomm\+\_\+change\+\_\+speed} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm, uint32\+\_\+t bdrt)
\begin{DoxyCompactList}\small\item\em wait until everything has been transmitted, then grab the lock and change the baud rate as requested \end{DoxyCompactList}\item 
int \textbf{ osmo\+\_\+sercomm\+\_\+drv\+\_\+pull} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm, uint8\+\_\+t $\ast$ch)
\begin{DoxyCompactList}\small\item\em fetch one octet of to-\/be-\/transmitted serial data \end{DoxyCompactList}\item 
int \textbf{ osmo\+\_\+sercomm\+\_\+drv\+\_\+rx\+\_\+char} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm, uint8\+\_\+t ch)
\begin{DoxyCompactList}\small\item\em the driver has received one byte, pass it into sercomm layer \end{DoxyCompactList}\item 
void \textbf{ sercomm\+\_\+drv\+\_\+lock} (unsigned long $\ast$\textbf{ flags})
\item 
void \textbf{ sercomm\+\_\+drv\+\_\+unlock} (unsigned long $\ast$\textbf{ flags})
\item 
void \textbf{ sercomm\+\_\+drv\+\_\+start\+\_\+tx} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm)
\begin{DoxyCompactList}\small\item\em low-\/level driver routine to request start of transmission The Sercomm code calls this function to inform the low-\/level driver that some data is pending for transmission, and the low-\/level driver should (if not active already) start enabling tx\+\_\+empty interrupts and pull drivers out of sercomm using \doxyref{osmo\+\_\+sercomm\+\_\+drv\+\_\+pull()}{p.}{group__sercomm_ga0b371b3a27149b137f7589b194ee26c6} until the latter returns 0. \end{DoxyCompactList}\item 
int \textbf{ sercomm\+\_\+drv\+\_\+baudrate\+\_\+chg} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm, uint32\+\_\+t bdrt)
\begin{DoxyCompactList}\small\item\em low-\/level driver routine to execute baud-\/rate change \end{DoxyCompactList}\item 
static struct \textbf{ msgb} $\ast$ \textbf{ osmo\+\_\+sercomm\+\_\+alloc\+\_\+msgb} (unsigned int \textbf{ len})
\begin{DoxyCompactList}\small\item\em Sercomm msgb allocator function. \end{DoxyCompactList}\item 
void \textbf{ sercomm\+\_\+drv\+\_\+lock} (unsigned long \textbf{ \+\_\+\+\_\+attribute\+\_\+\+\_\+}((unused)) $\ast$\textbf{ flags})
\begin{DoxyCompactList}\small\item\em Protect against IRQ context. \end{DoxyCompactList}\item 
void \textbf{ sercomm\+\_\+drv\+\_\+unlock} (unsigned long \textbf{ \+\_\+\+\_\+attribute\+\_\+\+\_\+}((unused)) $\ast$\textbf{ flags})
\begin{DoxyCompactList}\small\item\em Release protection against IRQ context. \end{DoxyCompactList}\item 
\textbf{ \+\_\+\+\_\+attribute\+\_\+\+\_\+} ((weak))
\item 
static void \textbf{ dispatch\+\_\+rx\+\_\+msg} (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm, uint8\+\_\+t dlci, struct \textbf{ msgb} $\ast$\textbf{ msg})
\end{DoxyCompactItemize}
\doxysubsection*{Variables}
\begin{DoxyCompactItemize}
\item 
enum \textbf{ gsm0808\+\_\+assignment\+\_\+requirement} \textbf{ \+\_\+\+\_\+attribute\+\_\+\+\_\+}
\begin{DoxyCompactList}\small\item\em fls64 -\/ find last set bit in a 64-\/bit word @x\+: the word to search \end{DoxyCompactList}\end{DoxyCompactItemize}


\doxysubsection{Detailed Description}
Serial communications layer, based on HDLC. 



\doxysubsection{Macro Definition Documentation}
\mbox{\label{group__sercomm_gae5506ebbc189cc252a48c4a119af43f0}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!DEFAULT\_RX\_MSG\_SIZE@{DEFAULT\_RX\_MSG\_SIZE}}
\index{DEFAULT\_RX\_MSG\_SIZE@{DEFAULT\_RX\_MSG\_SIZE}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{DEFAULT\_RX\_MSG\_SIZE}
{\footnotesize\ttfamily \#define DEFAULT\+\_\+\+RX\+\_\+\+MSG\+\_\+\+SIZE~2048}

\mbox{\label{group__sercomm_gad61ef90767cc6621972c406c94c69a39}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!HDLC\_C\_F\_BIT@{HDLC\_C\_F\_BIT}}
\index{HDLC\_C\_F\_BIT@{HDLC\_C\_F\_BIT}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{HDLC\_C\_F\_BIT}
{\footnotesize\ttfamily \#define HDLC\+\_\+\+C\+\_\+\+F\+\_\+\+BIT~(1 $<$$<$ 4)}

\mbox{\label{group__sercomm_ga150cf3cff25fd010a65a9da00d957654}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!HDLC\_C\_P\_BIT@{HDLC\_C\_P\_BIT}}
\index{HDLC\_C\_P\_BIT@{HDLC\_C\_P\_BIT}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{HDLC\_C\_P\_BIT}
{\footnotesize\ttfamily \#define HDLC\+\_\+\+C\+\_\+\+P\+\_\+\+BIT~(1 $<$$<$ 4)}

\mbox{\label{group__sercomm_ga036f010e0e55c0523d70f3b5a8493a36}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!HDLC\_C\_UI@{HDLC\_C\_UI}}
\index{HDLC\_C\_UI@{HDLC\_C\_UI}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{HDLC\_C\_UI}
{\footnotesize\ttfamily \#define HDLC\+\_\+\+C\+\_\+\+UI~0x03}

\mbox{\label{group__sercomm_ga8a4ca60e37719a6f32b08305b1fd8db0}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!HDLC\_ESCAPE@{HDLC\_ESCAPE}}
\index{HDLC\_ESCAPE@{HDLC\_ESCAPE}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{HDLC\_ESCAPE}
{\footnotesize\ttfamily \#define HDLC\+\_\+\+ESCAPE~0x7D}

\mbox{\label{group__sercomm_ga7dfaac00ac4dc67fd47f2cbdf51d5c72}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!HDLC\_FLAG@{HDLC\_FLAG}}
\index{HDLC\_FLAG@{HDLC\_FLAG}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{HDLC\_FLAG}
{\footnotesize\ttfamily \#define HDLC\+\_\+\+FLAG~0x7E}



\doxysubsection{Typedef Documentation}
\mbox{\label{group__sercomm_ga81cd2fc05eee74b91a246d2a0628c224}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!dlci\_cb\_t@{dlci\_cb\_t}}
\index{dlci\_cb\_t@{dlci\_cb\_t}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{dlci\_cb\_t}
{\footnotesize\ttfamily typedef void($\ast$ dlci\+\_\+cb\+\_\+t) (struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$sercomm, uint8\+\_\+t dlci, struct \textbf{ msgb} $\ast$\textbf{ msg})}



call-\/back function for per-\/\+DLC receive handler 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em sercomm} & instance on which msg was received \\
\hline
\mbox{\texttt{ in}}  & {\em dlci} & DLC Identifier of received msg \\
\hline
\mbox{\texttt{ in}}  & {\em msg} & received message that needs to be processed \\
\hline
\end{DoxyParams}


\doxysubsection{Enumeration Type Documentation}
\mbox{\label{group__sercomm_ga20874253e23bc4c1d20f69479175ce6f}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!rx\_state@{rx\_state}}
\index{rx\_state@{rx\_state}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{rx\_state}
{\footnotesize\ttfamily enum \textbf{ rx\+\_\+state}}

\begin{DoxyEnumFields}{Enumerator}
\raisebox{\heightof{T}}[0pt][0pt]{\index{RX\_ST\_WAIT\_START@{RX\_ST\_WAIT\_START}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!RX\_ST\_WAIT\_START@{RX\_ST\_WAIT\_START}}}\mbox{\label{group__sercomm_gga20874253e23bc4c1d20f69479175ce6fa5df225b93defbcb282b88f4769bda5d2}} 
RX\+\_\+\+ST\+\_\+\+WAIT\+\_\+\+START&\\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{RX\_ST\_ADDR@{RX\_ST\_ADDR}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!RX\_ST\_ADDR@{RX\_ST\_ADDR}}}\mbox{\label{group__sercomm_gga20874253e23bc4c1d20f69479175ce6fa8b7b4b41ae65d9aa7f086293ef9fbd65}} 
RX\+\_\+\+ST\+\_\+\+ADDR&\\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{RX\_ST\_CTRL@{RX\_ST\_CTRL}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!RX\_ST\_CTRL@{RX\_ST\_CTRL}}}\mbox{\label{group__sercomm_gga20874253e23bc4c1d20f69479175ce6fad423f5424c105e9c6e76cbe87bd4584f}} 
RX\+\_\+\+ST\+\_\+\+CTRL&\\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{RX\_ST\_DATA@{RX\_ST\_DATA}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!RX\_ST\_DATA@{RX\_ST\_DATA}}}\mbox{\label{group__sercomm_gga20874253e23bc4c1d20f69479175ce6fa9219e818fd4bf7c793a0d80c2c373aa8}} 
RX\+\_\+\+ST\+\_\+\+DATA&\\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{RX\_ST\_ESCAPE@{RX\_ST\_ESCAPE}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!RX\_ST\_ESCAPE@{RX\_ST\_ESCAPE}}}\mbox{\label{group__sercomm_gga20874253e23bc4c1d20f69479175ce6fad67efb3066cd5c633885ab0f4d9fbe16}} 
RX\+\_\+\+ST\+\_\+\+ESCAPE&\\
\hline

\end{DoxyEnumFields}
\mbox{\label{group__sercomm_ga62ff1a9e948ed30514cebd9efccab0e6}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!sercomm\_dlci@{sercomm\_dlci}}
\index{sercomm\_dlci@{sercomm\_dlci}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{sercomm\_dlci}
{\footnotesize\ttfamily enum \textbf{ sercomm\+\_\+dlci}}



A low sercomm\+\_\+dlci means high priority. 

A high DLCI means low priority \begin{DoxyEnumFields}{Enumerator}
\raisebox{\heightof{T}}[0pt][0pt]{\index{SC\_DLCI\_HIGHEST@{SC\_DLCI\_HIGHEST}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!SC\_DLCI\_HIGHEST@{SC\_DLCI\_HIGHEST}}}\mbox{\label{group__sercomm_gga62ff1a9e948ed30514cebd9efccab0e6a68f6d4acc5da7baa67418fdbc089ff74}} 
SC\+\_\+\+DLCI\+\_\+\+HIGHEST&\\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{SC\_DLCI\_DEBUG@{SC\_DLCI\_DEBUG}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!SC\_DLCI\_DEBUG@{SC\_DLCI\_DEBUG}}}\mbox{\label{group__sercomm_gga62ff1a9e948ed30514cebd9efccab0e6ae0c072c1915aee9c412de3ddf665389a}} 
SC\+\_\+\+DLCI\+\_\+\+DEBUG&\\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{SC\_DLCI\_L1A\_L23@{SC\_DLCI\_L1A\_L23}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!SC\_DLCI\_L1A\_L23@{SC\_DLCI\_L1A\_L23}}}\mbox{\label{group__sercomm_gga62ff1a9e948ed30514cebd9efccab0e6a8bc355b526b80f8cd2f9df8f63ccb3e2}} 
SC\+\_\+\+DLCI\+\_\+\+L1\+A\+\_\+\+L23&\\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{SC\_DLCI\_LOADER@{SC\_DLCI\_LOADER}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!SC\_DLCI\_LOADER@{SC\_DLCI\_LOADER}}}\mbox{\label{group__sercomm_gga62ff1a9e948ed30514cebd9efccab0e6afdf26330965d85d5ded38e30f58e2342}} 
SC\+\_\+\+DLCI\+\_\+\+LOADER&\\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{SC\_DLCI\_CONSOLE@{SC\_DLCI\_CONSOLE}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!SC\_DLCI\_CONSOLE@{SC\_DLCI\_CONSOLE}}}\mbox{\label{group__sercomm_gga62ff1a9e948ed30514cebd9efccab0e6ad8a377d4e7af4bb5362aae85192e9082}} 
SC\+\_\+\+DLCI\+\_\+\+CONSOLE&\\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{SC\_DLCI\_ECHO@{SC\_DLCI\_ECHO}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!SC\_DLCI\_ECHO@{SC\_DLCI\_ECHO}}}\mbox{\label{group__sercomm_gga62ff1a9e948ed30514cebd9efccab0e6abd4f3db5ac3962150791d6b26681d758}} 
SC\+\_\+\+DLCI\+\_\+\+ECHO&\\
\hline

\raisebox{\heightof{T}}[0pt][0pt]{\index{\_SC\_DLCI\_MAX@{\_SC\_DLCI\_MAX}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!\_SC\_DLCI\_MAX@{\_SC\_DLCI\_MAX}}}\mbox{\label{group__sercomm_gga62ff1a9e948ed30514cebd9efccab0e6afd8db6ec8c0af822dd9758f317827ad5}} 
\+\_\+\+SC\+\_\+\+DLCI\+\_\+\+MAX&\\
\hline

\end{DoxyEnumFields}


\doxysubsection{Function Documentation}
\mbox{\label{group__sercomm_gaf9aace1b44b73111e15aa39f06f43456}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!\_\_attribute\_\_@{\_\_attribute\_\_}}
\index{\_\_attribute\_\_@{\_\_attribute\_\_}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{\_\_attribute\_\_()}
{\footnotesize\ttfamily \+\_\+\+\_\+attribute\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{(weak)}]{ }\end{DoxyParamCaption})}

\mbox{\label{group__sercomm_ga2fdb62de1860c2806279ce9d60403956}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!dispatch\_rx\_msg@{dispatch\_rx\_msg}}
\index{dispatch\_rx\_msg@{dispatch\_rx\_msg}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{dispatch\_rx\_msg()}
{\footnotesize\ttfamily static void dispatch\+\_\+rx\+\_\+msg (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm,  }\item[{uint8\+\_\+t}]{dlci,  }\item[{struct \textbf{ msgb} $\ast$}]{msg }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}}



References \textbf{ ARRAY\+\_\+\+SIZE}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::dlci\+\_\+handler}, \textbf{ msg}, \textbf{ msgb\+\_\+free()}, and \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::rx}.



Referenced by \textbf{ osmo\+\_\+sercomm\+\_\+drv\+\_\+rx\+\_\+char()}.

\mbox{\label{group__sercomm_ga4350807326534376d38dec25e9551ccb}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!osmo\_sercomm\_alloc\_msgb@{osmo\_sercomm\_alloc\_msgb}}
\index{osmo\_sercomm\_alloc\_msgb@{osmo\_sercomm\_alloc\_msgb}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{osmo\_sercomm\_alloc\_msgb()}
{\footnotesize\ttfamily static struct \textbf{ msgb} $\ast$ osmo\+\_\+sercomm\+\_\+alloc\+\_\+msgb (\begin{DoxyParamCaption}\item[{unsigned int}]{len }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [static]}}



Sercomm msgb allocator function. 



References \textbf{ len()}, and \textbf{ msgb\+\_\+alloc\+\_\+headroom()}.



Referenced by \textbf{ osmo\+\_\+sercomm\+\_\+drv\+\_\+rx\+\_\+char()}.

\mbox{\label{group__sercomm_ga8f6f058187c96d9fded862e2f6d8841e}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!osmo\_sercomm\_change\_speed@{osmo\_sercomm\_change\_speed}}
\index{osmo\_sercomm\_change\_speed@{osmo\_sercomm\_change\_speed}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{osmo\_sercomm\_change\_speed()}
{\footnotesize\ttfamily int osmo\+\_\+sercomm\+\_\+change\+\_\+speed (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm,  }\item[{uint32\+\_\+t}]{bdrt }\end{DoxyParamCaption})}



wait until everything has been transmitted, then grab the lock and change the baud rate as requested 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em sercomm} & Osmocom sercomm instance \\
\hline
\mbox{\texttt{ in}}  & {\em bdrt} & New UART Baud Rate \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
result of the operation as provided by \doxyref{sercomm\+\_\+drv\+\_\+baudrate\+\_\+chg()}{p.}{group__sercomm_gabb67e6d20a7b7002ce8093cc6ab99102} 
\end{DoxyReturn}


References \textbf{ ARRAY\+\_\+\+SIZE}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::dlci\+\_\+queues}, \textbf{ flags}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::msg}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::next\+\_\+char}, \textbf{ osmo\+\_\+sercomm\+\_\+tx\+\_\+queue\+\_\+depth()}, \textbf{ sercomm\+\_\+drv\+\_\+baudrate\+\_\+chg()}, \textbf{ sercomm\+\_\+drv\+\_\+lock()}, \textbf{ sercomm\+\_\+drv\+\_\+unlock()}, and \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::tx}.

\mbox{\label{group__sercomm_ga0b371b3a27149b137f7589b194ee26c6}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!osmo\_sercomm\_drv\_pull@{osmo\_sercomm\_drv\_pull}}
\index{osmo\_sercomm\_drv\_pull@{osmo\_sercomm\_drv\_pull}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{osmo\_sercomm\_drv\_pull()}
{\footnotesize\ttfamily int osmo\+\_\+sercomm\+\_\+drv\+\_\+pull (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm,  }\item[{uint8\+\_\+t $\ast$}]{ch }\end{DoxyParamCaption})}



fetch one octet of to-\/be-\/transmitted serial data 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em sercomm} & Sercomm Instance from which to fetch pending data \\
\hline
\mbox{\texttt{ out}}  & {\em ch} & pointer to caller-\/allocaed output memory \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
1 in case of succss; 0 if no data available; negative on error 
\end{DoxyReturn}


References \textbf{ ARRAY\+\_\+\+SIZE}, \textbf{ msgb\+::data}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::dlci\+\_\+queues}, \textbf{ flags}, \textbf{ HDLC\+\_\+\+ESCAPE}, \textbf{ HDLC\+\_\+\+FLAG}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::msg}, \textbf{ msgb\+\_\+dequeue()}, \textbf{ msgb\+\_\+free()}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::next\+\_\+char}, \textbf{ RX\+\_\+\+ST\+\_\+\+DATA}, \textbf{ RX\+\_\+\+ST\+\_\+\+ESCAPE}, \textbf{ sercomm\+\_\+drv\+\_\+lock()}, \textbf{ sercomm\+\_\+drv\+\_\+unlock()}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::state}, \textbf{ msgb\+::tail}, and \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::tx}.

\mbox{\label{group__sercomm_ga10cbc58f23aafa1381074457c70c2b34}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!osmo\_sercomm\_drv\_rx\_char@{osmo\_sercomm\_drv\_rx\_char}}
\index{osmo\_sercomm\_drv\_rx\_char@{osmo\_sercomm\_drv\_rx\_char}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{osmo\_sercomm\_drv\_rx\_char()}
{\footnotesize\ttfamily int osmo\+\_\+sercomm\+\_\+drv\+\_\+rx\+\_\+char (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm,  }\item[{uint8\+\_\+t}]{ch }\end{DoxyParamCaption})}



the driver has received one byte, pass it into sercomm layer 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em sercomm} & Sercomm Instance for which a byte was received \\
\hline
\mbox{\texttt{ in}}  & {\em ch} & byte that was received from line for said instance \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
1 on success; 0 on unrecognized char; negative on error 
\end{DoxyReturn}


References \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::ctrl}, \textbf{ dispatch\+\_\+rx\+\_\+msg()}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::dlci}, \textbf{ HDLC\+\_\+\+ESCAPE}, \textbf{ HDLC\+\_\+\+FLAG}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::msg}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::msg\+\_\+size}, \textbf{ msgb\+\_\+free()}, \textbf{ msgb\+\_\+put()}, \textbf{ msgb\+\_\+tailroom()}, \textbf{ osmo\+\_\+sercomm\+\_\+alloc\+\_\+msgb()}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::rx}, \textbf{ RX\+\_\+\+ST\+\_\+\+ADDR}, \textbf{ RX\+\_\+\+ST\+\_\+\+CTRL}, \textbf{ RX\+\_\+\+ST\+\_\+\+DATA}, \textbf{ RX\+\_\+\+ST\+\_\+\+ESCAPE}, \textbf{ RX\+\_\+\+ST\+\_\+\+WAIT\+\_\+\+START}, and \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::state}.

\mbox{\label{group__sercomm_gab2d8eec4732f508236647b94a525f93b}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!osmo\_sercomm\_init@{osmo\_sercomm\_init}}
\index{osmo\_sercomm\_init@{osmo\_sercomm\_init}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{osmo\_sercomm\_init()}
{\footnotesize\ttfamily void osmo\+\_\+sercomm\+\_\+init (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm }\end{DoxyParamCaption})}



Initialize an Osmocom sercomm instance. 


\begin{DoxyParams}{Parameters}
{\em sercomm} & Caller-\/allocated sercomm instance to be initialized\\
\hline
\end{DoxyParams}
This function initializes the sercomm instance, including the registration of the ECHO service at the ECHO DLCI 

References \textbf{ ARRAY\+\_\+\+SIZE}, \textbf{ DEFAULT\+\_\+\+RX\+\_\+\+MSG\+\_\+\+SIZE}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::dlci\+\_\+queues}, \textbf{ INIT\+\_\+\+LLIST\+\_\+\+HEAD}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::initialized}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::msg}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::msg\+\_\+size}, \textbf{ osmo\+\_\+sercomm\+\_\+register\+\_\+rx\+\_\+cb()}, \textbf{ osmo\+\_\+sercomm\+\_\+sendmsg()}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::rx}, \textbf{ SC\+\_\+\+DLCI\+\_\+\+ECHO}, and \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::tx}.

\mbox{\label{group__sercomm_ga5ef6c458cc669168c62cd82a277f3dd6}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!osmo\_sercomm\_initialized@{osmo\_sercomm\_initialized}}
\index{osmo\_sercomm\_initialized@{osmo\_sercomm\_initialized}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{osmo\_sercomm\_initialized()}
{\footnotesize\ttfamily int osmo\+\_\+sercomm\+\_\+initialized (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm }\end{DoxyParamCaption})}



Determine if a given Osmocom sercomm instance has been initialized. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em sercomm} & Osmocom sercomm instance to be checked \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
1 in case {\itshape sercomm} was previously initialized; 0 otherwise 
\end{DoxyReturn}


References \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::initialized}.

\mbox{\label{group__sercomm_ga08ec337e1f51fafb07d18d7b6c717a78}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!osmo\_sercomm\_register\_rx\_cb@{osmo\_sercomm\_register\_rx\_cb}}
\index{osmo\_sercomm\_register\_rx\_cb@{osmo\_sercomm\_register\_rx\_cb}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{osmo\_sercomm\_register\_rx\_cb()}
{\footnotesize\ttfamily int osmo\+\_\+sercomm\+\_\+register\+\_\+rx\+\_\+cb (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm,  }\item[{uint8\+\_\+t}]{dlci,  }\item[{\textbf{ dlci\+\_\+cb\+\_\+t}}]{cb }\end{DoxyParamCaption})}



Register a handler for a given DLCI. 


\begin{DoxyParams}[1]{Parameters}
 & {\em sercomm} & Sercomm Instance in which caller wishes to register \\
\hline
\mbox{\texttt{ in}}  & {\em dlci} & Data Ling Connection Identifier to register \\
\hline
\mbox{\texttt{ in}}  & {\em cb} & Callback function for {\itshape dlci} \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
0 on success; negative on error 
\end{DoxyReturn}


References \textbf{ ARRAY\+\_\+\+SIZE}, \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::dlci\+\_\+handler}, and \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::rx}.



Referenced by \textbf{ osmo\+\_\+sercomm\+\_\+init()}.

\mbox{\label{group__sercomm_gaa5c1979d9a54e7be35d58f5c696a6900}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!osmo\_sercomm\_sendmsg@{osmo\_sercomm\_sendmsg}}
\index{osmo\_sercomm\_sendmsg@{osmo\_sercomm\_sendmsg}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{osmo\_sercomm\_sendmsg()}
{\footnotesize\ttfamily void osmo\+\_\+sercomm\+\_\+sendmsg (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm,  }\item[{uint8\+\_\+t}]{dlci,  }\item[{struct \textbf{ msgb} $\ast$}]{msg }\end{DoxyParamCaption})}



User interface for transmitting messages for a given DLCI. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em sercomm} & Osmocom sercomm instance through which to transmit \\
\hline
\mbox{\texttt{ in}}  & {\em dlci} & DLCI through whcih to transmit {\itshape msg} \\
\hline
\mbox{\texttt{ in}}  & {\em msg} & Message buffer to be transmitted via {\itshape dlci} on {\itshape $\ast$} sercomm \\
\hline
\end{DoxyParams}


References \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::dlci\+\_\+queues}, \textbf{ flags}, \textbf{ HDLC\+\_\+\+C\+\_\+\+UI}, \textbf{ hdr}, \textbf{ msg}, \textbf{ msgb\+\_\+enqueue()}, \textbf{ msgb\+\_\+push()}, \textbf{ sercomm\+\_\+drv\+\_\+lock()}, \textbf{ sercomm\+\_\+drv\+\_\+start\+\_\+tx()}, \textbf{ sercomm\+\_\+drv\+\_\+unlock()}, and \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::tx}.



Referenced by \textbf{ osmo\+\_\+sercomm\+\_\+init()}.

\mbox{\label{group__sercomm_ga17b7f2be907d071088e806b513c67aa2}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!osmo\_sercomm\_tx\_queue\_depth@{osmo\_sercomm\_tx\_queue\_depth}}
\index{osmo\_sercomm\_tx\_queue\_depth@{osmo\_sercomm\_tx\_queue\_depth}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{osmo\_sercomm\_tx\_queue\_depth()}
{\footnotesize\ttfamily unsigned int osmo\+\_\+sercomm\+\_\+tx\+\_\+queue\+\_\+depth (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm,  }\item[{uint8\+\_\+t}]{dlci }\end{DoxyParamCaption})}



How deep is the Tx queue for a given DLCI? 


\begin{DoxyParams}[1]{Parameters}
 & {\em \mbox{[}n\mbox{]}} & sercomm Osmocom sercomm instance on which to operate \\
\hline
\mbox{\texttt{ in}}  & {\em dlci} & DLCI whose queue depthy is to be determined \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
number of elements in the per-\/\+DLCI transmit queue 
\end{DoxyReturn}


References \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::dlci\+\_\+queues}, \textbf{ llist\+\_\+for\+\_\+each}, and \textbf{ osmo\+\_\+sercomm\+\_\+inst\+::tx}.



Referenced by \textbf{ osmo\+\_\+sercomm\+\_\+change\+\_\+speed()}.

\mbox{\label{group__sercomm_gabb67e6d20a7b7002ce8093cc6ab99102}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!sercomm\_drv\_baudrate\_chg@{sercomm\_drv\_baudrate\_chg}}
\index{sercomm\_drv\_baudrate\_chg@{sercomm\_drv\_baudrate\_chg}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{sercomm\_drv\_baudrate\_chg()}
{\footnotesize\ttfamily int sercomm\+\_\+drv\+\_\+baudrate\+\_\+chg (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm,  }\item[{uint32\+\_\+t}]{bdrt }\end{DoxyParamCaption})}



low-\/level driver routine to execute baud-\/rate change 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em sercomm} & Osmocom sercomm instance for which to change \\
\hline
\mbox{\texttt{ in}}  & {\em bdrt} & New Baud-\/\+Rate (integer) \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
0 on success; negative in case of error 
\end{DoxyReturn}


Referenced by \textbf{ osmo\+\_\+sercomm\+\_\+change\+\_\+speed()}.

\mbox{\label{group__sercomm_gab9383d9e35e3255b4066b9f5ee4cbefd}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!sercomm\_drv\_lock@{sercomm\_drv\_lock}}
\index{sercomm\_drv\_lock@{sercomm\_drv\_lock}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{sercomm\_drv\_lock()\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily void sercomm\+\_\+drv\+\_\+lock (\begin{DoxyParamCaption}\item[{unsigned long $\ast$}]{flags }\end{DoxyParamCaption})}

\mbox{\label{group__sercomm_ga5b19bd280856d611048f7bc3c20c740d}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!sercomm\_drv\_lock@{sercomm\_drv\_lock}}
\index{sercomm\_drv\_lock@{sercomm\_drv\_lock}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{sercomm\_drv\_lock()\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily void sercomm\+\_\+drv\+\_\+lock (\begin{DoxyParamCaption}\item[{unsigned long \textbf{ \+\_\+\+\_\+attribute\+\_\+\+\_\+}((unused)) $\ast$}]{flags }\end{DoxyParamCaption})}



Protect against IRQ context. 



Referenced by \textbf{ osmo\+\_\+sercomm\+\_\+change\+\_\+speed()}, \textbf{ osmo\+\_\+sercomm\+\_\+drv\+\_\+pull()}, and \textbf{ osmo\+\_\+sercomm\+\_\+sendmsg()}.

\mbox{\label{group__sercomm_ga3d78d1d6fb0f92c23d93555085ab1353}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!sercomm\_drv\_start\_tx@{sercomm\_drv\_start\_tx}}
\index{sercomm\_drv\_start\_tx@{sercomm\_drv\_start\_tx}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{sercomm\_drv\_start\_tx()}
{\footnotesize\ttfamily void sercomm\+\_\+drv\+\_\+start\+\_\+tx (\begin{DoxyParamCaption}\item[{struct \textbf{ osmo\+\_\+sercomm\+\_\+inst} $\ast$}]{sercomm }\end{DoxyParamCaption})}



low-\/level driver routine to request start of transmission The Sercomm code calls this function to inform the low-\/level driver that some data is pending for transmission, and the low-\/level driver should (if not active already) start enabling tx\+\_\+empty interrupts and pull drivers out of sercomm using \doxyref{osmo\+\_\+sercomm\+\_\+drv\+\_\+pull()}{p.}{group__sercomm_ga0b371b3a27149b137f7589b194ee26c6} until the latter returns 0. 


\begin{DoxyParams}[1]{Parameters}
\mbox{\texttt{ in}}  & {\em sercomm} & Osmocom sercomm instance for which to change \\
\hline
\end{DoxyParams}


Referenced by \textbf{ osmo\+\_\+sercomm\+\_\+sendmsg()}.

\mbox{\label{group__sercomm_ga614e4d8b5c68c96a87424ceccf7973cc}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!sercomm\_drv\_unlock@{sercomm\_drv\_unlock}}
\index{sercomm\_drv\_unlock@{sercomm\_drv\_unlock}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{sercomm\_drv\_unlock()\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily void sercomm\+\_\+drv\+\_\+unlock (\begin{DoxyParamCaption}\item[{unsigned long $\ast$}]{flags }\end{DoxyParamCaption})}

\mbox{\label{group__sercomm_ga6e6ee76e77fe4c2151ba2ded4b845c16}} 
\index{Seriall Communications (HDLC)@{Seriall Communications (HDLC)}!sercomm\_drv\_unlock@{sercomm\_drv\_unlock}}
\index{sercomm\_drv\_unlock@{sercomm\_drv\_unlock}!Seriall Communications (HDLC)@{Seriall Communications (HDLC)}}
\doxysubsubsection{sercomm\_drv\_unlock()\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily void sercomm\+\_\+drv\+\_\+unlock (\begin{DoxyParamCaption}\item[{unsigned long \textbf{ \+\_\+\+\_\+attribute\+\_\+\+\_\+}((unused)) $\ast$}]{flags }\end{DoxyParamCaption})}



Release protection against IRQ context. 



Referenced by \textbf{ osmo\+\_\+sercomm\+\_\+change\+\_\+speed()}, \textbf{ osmo\+\_\+sercomm\+\_\+drv\+\_\+pull()}, and \textbf{ osmo\+\_\+sercomm\+\_\+sendmsg()}.

