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