162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci.. include:: <isonum.txt>
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci==========
562306a36Sopenharmony_ciLinux CAIF
662306a36Sopenharmony_ci==========
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciCopyright |copy| ST-Ericsson AB 2010
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci:Author: Sjur Brendeland/ sjur.brandeland@stericsson.com
1162306a36Sopenharmony_ci:License terms: GNU General Public License (GPL) version 2
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ciIntroduction
1562306a36Sopenharmony_ci============
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciCAIF is a MUX protocol used by ST-Ericsson cellular modems for
1862306a36Sopenharmony_cicommunication between Modem and host. The host processes can open virtual AT
1962306a36Sopenharmony_cichannels, initiate GPRS Data connections, Video channels and Utility Channels.
2062306a36Sopenharmony_ciThe Utility Channels are general purpose pipes between modem and host.
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciST-Ericsson modems support a number of transports between modem
2362306a36Sopenharmony_ciand host. Currently, UART and Loopback are available for Linux.
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ciArchitecture
2762306a36Sopenharmony_ci============
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciThe implementation of CAIF is divided into:
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci* CAIF Socket Layer and GPRS IP Interface.
3262306a36Sopenharmony_ci* CAIF Core Protocol Implementation
3362306a36Sopenharmony_ci* CAIF Link Layer, implemented as NET devices.
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci::
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci  RTNL
3862306a36Sopenharmony_ci   !
3962306a36Sopenharmony_ci   !	      +------+	 +------+
4062306a36Sopenharmony_ci   !	     +------+!	+------+!
4162306a36Sopenharmony_ci   !	     !	IP  !!	!Socket!!
4262306a36Sopenharmony_ci   +-------> !interf!+	! API  !+	<- CAIF Client APIs
4362306a36Sopenharmony_ci   !	     +------+	+------!
4462306a36Sopenharmony_ci   !		!	    !
4562306a36Sopenharmony_ci   !		+-----------+
4662306a36Sopenharmony_ci   !		      !
4762306a36Sopenharmony_ci   !		   +------+		<- CAIF Core Protocol
4862306a36Sopenharmony_ci   !		   ! CAIF !
4962306a36Sopenharmony_ci   !		   ! Core !
5062306a36Sopenharmony_ci   !		   +------+
5162306a36Sopenharmony_ci   !	   +----------!---------+
5262306a36Sopenharmony_ci   !	   !	      !		!
5362306a36Sopenharmony_ci   !	+------+   +-----+   +------+
5462306a36Sopenharmony_ci   +--> ! HSI  !   ! TTY !   ! USB  !	<- Link Layer (Net Devices)
5562306a36Sopenharmony_ci	+------+   +-----+   +------+
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ciImplementation
6062306a36Sopenharmony_ci==============
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciCAIF Core Protocol Layer
6462306a36Sopenharmony_ci------------------------
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ciCAIF Core layer implements the CAIF protocol as defined by ST-Ericsson.
6762306a36Sopenharmony_ciIt implements the CAIF protocol stack in a layered approach, where
6862306a36Sopenharmony_cieach layer described in the specification is implemented as a separate layer.
6962306a36Sopenharmony_ciThe architecture is inspired by the design patterns "Protocol Layer" and
7062306a36Sopenharmony_ci"Protocol Packet".
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciCAIF structure
7362306a36Sopenharmony_ci^^^^^^^^^^^^^^
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ciThe Core CAIF implementation contains:
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci      -	Simple implementation of CAIF.
7862306a36Sopenharmony_ci      -	Layered architecture (a la Streams), each layer in the CAIF
7962306a36Sopenharmony_ci	specification is implemented in a separate c-file.
8062306a36Sopenharmony_ci      -	Clients must call configuration function to add PHY layer.
8162306a36Sopenharmony_ci      -	Clients must implement CAIF layer to consume/produce
8262306a36Sopenharmony_ci	CAIF payload with receive and transmit functions.
8362306a36Sopenharmony_ci      -	Clients must call configuration function to add and connect the
8462306a36Sopenharmony_ci	Client layer.
8562306a36Sopenharmony_ci      - When receiving / transmitting CAIF Packets (cfpkt), ownership is passed
8662306a36Sopenharmony_ci	to the called function (except for framing layers' receive function)
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ciLayered Architecture
8962306a36Sopenharmony_ci====================
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ciThe CAIF protocol can be divided into two parts: Support functions and Protocol
9262306a36Sopenharmony_ciImplementation. The support functions include:
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci      - CFPKT CAIF Packet. Implementation of CAIF Protocol Packet. The
9562306a36Sopenharmony_ci	CAIF Packet has functions for creating, destroying and adding content
9662306a36Sopenharmony_ci	and for adding/extracting header and trailers to protocol packets.
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ciThe CAIF Protocol implementation contains:
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci      - CFCNFG CAIF Configuration layer. Configures the CAIF Protocol
10162306a36Sopenharmony_ci	Stack and provides a Client interface for adding Link-Layer and
10262306a36Sopenharmony_ci	Driver interfaces on top of the CAIF Stack.
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci      - CFCTRL CAIF Control layer. Encodes and Decodes control messages
10562306a36Sopenharmony_ci	such as enumeration and channel setup. Also matches request and
10662306a36Sopenharmony_ci	response messages.
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci      - CFSERVL General CAIF Service Layer functionality; handles flow
10962306a36Sopenharmony_ci	control and remote shutdown requests.
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci      - CFVEI CAIF VEI layer. Handles CAIF AT Channels on VEI (Virtual
11262306a36Sopenharmony_ci	External Interface). This layer encodes/decodes VEI frames.
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci      - CFDGML CAIF Datagram layer. Handles CAIF Datagram layer (IP
11562306a36Sopenharmony_ci	traffic), encodes/decodes Datagram frames.
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci      - CFMUX CAIF Mux layer. Handles multiplexing between multiple
11862306a36Sopenharmony_ci	physical bearers and multiple channels such as VEI, Datagram, etc.
11962306a36Sopenharmony_ci	The MUX keeps track of the existing CAIF Channels and
12062306a36Sopenharmony_ci	Physical Instances and selects the appropriate instance based
12162306a36Sopenharmony_ci	on Channel-Id and Physical-ID.
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci      - CFFRML CAIF Framing layer. Handles Framing i.e. Frame length
12462306a36Sopenharmony_ci	and frame checksum.
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci      - CFSERL CAIF Serial layer. Handles concatenation/split of frames
12762306a36Sopenharmony_ci	into CAIF Frames with correct length.
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci::
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci		    +---------+
13262306a36Sopenharmony_ci		    | Config  |
13362306a36Sopenharmony_ci		    | CFCNFG  |
13462306a36Sopenharmony_ci		    +---------+
13562306a36Sopenharmony_ci			 !
13662306a36Sopenharmony_ci    +---------+	    +---------+	    +---------+
13762306a36Sopenharmony_ci    |	AT    |	    | Control |	    | Datagram|
13862306a36Sopenharmony_ci    | CFVEIL  |	    | CFCTRL  |	    | CFDGML  |
13962306a36Sopenharmony_ci    +---------+	    +---------+	    +---------+
14062306a36Sopenharmony_ci	   \_____________!______________/
14162306a36Sopenharmony_ci			 !
14262306a36Sopenharmony_ci		    +---------+
14362306a36Sopenharmony_ci		    |	MUX   |
14462306a36Sopenharmony_ci		    |	      |
14562306a36Sopenharmony_ci		    +---------+
14662306a36Sopenharmony_ci		    _____!_____
14762306a36Sopenharmony_ci		   /	       \
14862306a36Sopenharmony_ci	    +---------+	    +---------+
14962306a36Sopenharmony_ci	    | CFFRML  |	    | CFFRML  |
15062306a36Sopenharmony_ci	    | Framing |	    | Framing |
15162306a36Sopenharmony_ci	    +---------+	    +---------+
15262306a36Sopenharmony_ci		 !		!
15362306a36Sopenharmony_ci	    +---------+	    +---------+
15462306a36Sopenharmony_ci	    |	      |	    | Serial  |
15562306a36Sopenharmony_ci	    |	      |	    | CFSERL  |
15662306a36Sopenharmony_ci	    +---------+	    +---------+
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ciIn this layered approach the following "rules" apply.
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci      - All layers embed the same structure "struct cflayer"
16262306a36Sopenharmony_ci      - A layer does not depend on any other layer's private data.
16362306a36Sopenharmony_ci      - Layers are stacked by setting the pointers::
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci		  layer->up , layer->dn
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci      -	In order to send data upwards, each layer should do::
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci		 layer->up->receive(layer->up, packet);
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci      - In order to send data downwards, each layer should do::
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci		 layer->dn->transmit(layer->dn, packet);
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ciCAIF Socket and IP interface
17762306a36Sopenharmony_ci============================
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ciThe IP interface and CAIF socket API are implemented on top of the
18062306a36Sopenharmony_ciCAIF Core protocol. The IP Interface and CAIF socket have an instance of
18162306a36Sopenharmony_ci'struct cflayer', just like the CAIF Core protocol stack.
18262306a36Sopenharmony_ciNet device and Socket implement the 'receive()' function defined by
18362306a36Sopenharmony_ci'struct cflayer', just like the rest of the CAIF stack. In this way, transmit and
18462306a36Sopenharmony_cireceive of packets is handled as by the rest of the layers: the 'dn->transmit()'
18562306a36Sopenharmony_cifunction is called in order to transmit data.
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ciConfiguration of Link Layer
18862306a36Sopenharmony_ci---------------------------
18962306a36Sopenharmony_ciThe Link Layer is implemented as Linux network devices (struct net_device).
19062306a36Sopenharmony_ciPayload handling and registration is done using standard Linux mechanisms.
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ciThe CAIF Protocol relies on a loss-less link layer without implementing
19362306a36Sopenharmony_ciretransmission. This implies that packet drops must not happen.
19462306a36Sopenharmony_ciTherefore a flow-control mechanism is implemented where the physical
19562306a36Sopenharmony_ciinterface can initiate flow stop for all CAIF Channels.
196