2010-03-30 17:56:21 +04:00
/*
* Copyright ( C ) ST - Ericsson AB 2010
* Author : Sjur Brendeland / sjur . brandeland @ stericsson . com
* License terms : GNU General Public License ( GPL ) version 2
*/
# ifndef CAIF_LAYER_H_
# define CAIF_LAYER_H_
# include <linux/list.h>
struct cflayer ;
struct cfpkt ;
struct cfpktq ;
struct caif_payload_info ;
struct caif_packet_funcs ;
# define CAIF_LAYER_NAME_SZ 16
/**
* caif_assert ( ) - Assert function for CAIF .
* @ assert : expression to evaluate .
*
* This function will print a error message and a do WARN_ON if the
* assertion failes . Normally this will do a stack up at the current location .
*/
# define caif_assert(assert) \
do { \
if ( ! ( assert ) ) { \
pr_err ( " caif:Assert detected:'%s' \n " , # assert ) ; \
WARN_ON ( ! ( assert ) ) ; \
} \
} while ( 0 )
/**
* enum caif_ctrlcmd - CAIF Stack Control Signaling sent in layer . ctrlcmd ( ) .
*
* @ CAIF_CTRLCMD_FLOW_OFF_IND : Flow Control is OFF , transmit function
* should stop sending data
*
* @ CAIF_CTRLCMD_FLOW_ON_IND : Flow Control is ON , transmit function
* can start sending data
*
* @ CAIF_CTRLCMD_REMOTE_SHUTDOWN_IND : Remote end modem has decided to close
* down channel
*
* @ CAIF_CTRLCMD_INIT_RSP : Called initially when the layer below
* has finished initialization
*
* @ CAIF_CTRLCMD_DEINIT_RSP : Called when de - initialization is
* complete
*
* @ CAIF_CTRLCMD_INIT_FAIL_RSP : Called if initialization fails
*
* @ _CAIF_CTRLCMD_PHYIF_FLOW_OFF_IND : CAIF Link layer temporarily cannot
* send more packets .
* @ _CAIF_CTRLCMD_PHYIF_FLOW_ON_IND : Called if CAIF Link layer is able
* to send packets again .
* @ _CAIF_CTRLCMD_PHYIF_DOWN_IND : Called if CAIF Link layer is going
* down .
*
* These commands are sent upwards in the CAIF stack to the CAIF Client .
* They are used for signaling originating from the modem or CAIF Link Layer .
* These are either responses ( * _RSP ) or events ( * _IND ) .
*/
enum caif_ctrlcmd {
CAIF_CTRLCMD_FLOW_OFF_IND ,
CAIF_CTRLCMD_FLOW_ON_IND ,
CAIF_CTRLCMD_REMOTE_SHUTDOWN_IND ,
CAIF_CTRLCMD_INIT_RSP ,
CAIF_CTRLCMD_DEINIT_RSP ,
CAIF_CTRLCMD_INIT_FAIL_RSP ,
_CAIF_CTRLCMD_PHYIF_FLOW_OFF_IND ,
_CAIF_CTRLCMD_PHYIF_FLOW_ON_IND ,
_CAIF_CTRLCMD_PHYIF_DOWN_IND ,
} ;
/**
* enum caif_modemcmd - Modem Control Signaling , sent from CAIF Client
* to the CAIF Link Layer or modem .
*
* @ CAIF_MODEMCMD_FLOW_ON_REQ : Flow Control is ON , transmit function
* can start sending data .
*
* @ CAIF_MODEMCMD_FLOW_OFF_REQ : Flow Control is OFF , transmit function
* should stop sending data .
*
* @ _CAIF_MODEMCMD_PHYIF_USEFULL : Notify physical layer that it is in use
*
* @ _CAIF_MODEMCMD_PHYIF_USELESS : Notify physical layer that it is
* no longer in use .
*
* These are requests sent ' downwards ' in the stack .
* Flow ON , OFF can be indicated to the modem .
*/
enum caif_modemcmd {
CAIF_MODEMCMD_FLOW_ON_REQ = 0 ,
CAIF_MODEMCMD_FLOW_OFF_REQ = 1 ,
_CAIF_MODEMCMD_PHYIF_USEFULL = 3 ,
_CAIF_MODEMCMD_PHYIF_USELESS = 4
} ;
/**
* enum caif_direction - CAIF Packet Direction .
* Indicate if a packet is to be sent out or to be received in .
* @ CAIF_DIR_IN : Incoming packet received .
* @ CAIF_DIR_OUT : Outgoing packet to be transmitted .
*/
enum caif_direction {
CAIF_DIR_IN = 0 ,
CAIF_DIR_OUT = 1
} ;
/**
* struct cflayer - CAIF Stack layer .
* Defines the framework for the CAIF Core Stack .
* @ up : Pointer up to the layer above .
* @ dn : Pointer down to the layer below .
* @ node : List node used when layer participate in a list .
* @ receive : Packet receive function .
* @ transmit : Packet transmit funciton .
* @ ctrlcmd : Used for control signalling upwards in the stack .
* @ modemcmd : Used for control signaling downwards in the stack .
* @ id : The identity of this layer
* @ name : Name of the layer .
*
* This structure defines the layered structure in CAIF .
*
* It defines CAIF layering structure , used by all CAIF Layers and the
* layers interfacing CAIF .
*
* In order to integrate with CAIF an adaptation layer on top of the CAIF stack
* and PHY layer below the CAIF stack
* must be implemented . These layer must follow the design principles below .
*
* Principles for layering of protocol layers :
* - All layers must use this structure . If embedding it , then place this
* structure first in the layer specific structure .
*
2011-05-22 15:18:53 +04:00
* - Each layer should not depend on any others layer ' s private data .
2010-03-30 17:56:21 +04:00
*
* - In order to send data upwards do
* layer - > up - > receive ( layer - > up , packet ) ;
*
* - In order to send data downwards do
* layer - > dn - > transmit ( layer - > dn , info , packet ) ;
*/
struct cflayer {
struct cflayer * up ;
struct cflayer * dn ;
struct list_head node ;
/*
2011-05-22 15:18:53 +04:00
* receive ( ) - Receive Function ( non - blocking ) .
2010-03-30 17:56:21 +04:00
* Contract : Each layer must implement a receive function passing the
* CAIF packets upwards in the stack .
* Packet handling rules :
2011-05-22 15:18:53 +04:00
* - The CAIF packet ( cfpkt ) ownership is passed to the
* called receive function . This means that the the
* packet cannot be accessed after passing it to the
* above layer using up - > receive ( ) .
*
2010-03-30 17:56:21 +04:00
* - If parsing of the packet fails , the packet must be
2011-05-22 15:18:53 +04:00
* destroyed and negative error code returned
* from the function .
* EXCEPTION : If the framing layer ( cffrml ) returns
* - EILSEQ , the packet is not freed .
*
2010-03-30 17:56:21 +04:00
* - If parsing succeeds ( and above layers return OK ) then
2011-05-22 15:18:53 +04:00
* the function must return a value > = 0.
2010-03-30 17:56:21 +04:00
*
* Returns result < 0 indicates an error , 0 or positive value
* indicates success .
*
* @ layr : Pointer to the current layer the receive function is
* implemented for ( this pointer ) .
* @ cfpkt : Pointer to CaifPacket to be handled .
*/
int ( * receive ) ( struct cflayer * layr , struct cfpkt * cfpkt ) ;
/*
2011-05-22 15:18:53 +04:00
* transmit ( ) - Transmit Function ( non - blocking ) .
2010-03-30 17:56:21 +04:00
* Contract : Each layer must implement a transmit function passing the
* CAIF packet downwards in the stack .
* Packet handling rules :
* - The CAIF packet ( cfpkt ) ownership is passed to the
* transmit function . This means that the the packet
* cannot be accessed after passing it to the below
* layer using dn - > transmit ( ) .
*
2011-05-22 15:18:53 +04:00
* - Upon error the packet ownership is still passed on ,
* so the packet shall be freed where error is detected .
* Callers of the transmit function shall not free packets ,
* but errors shall be returned .
2010-03-30 17:56:21 +04:00
*
* - Return value less than zero means error , zero or
* greater than zero means OK .
*
2011-05-22 15:18:53 +04:00
* Returns result < 0 indicates an error , 0 or positive value
* indicates success .
2010-03-30 17:56:21 +04:00
*
* @ layr : Pointer to the current layer the receive function
* isimplemented for ( this pointer ) .
* @ cfpkt : Pointer to CaifPacket to be handled .
*/
int ( * transmit ) ( struct cflayer * layr , struct cfpkt * cfpkt ) ;
/*
2011-05-22 15:18:53 +04:00
* cttrlcmd ( ) - Control Function upwards in CAIF Stack ( non - blocking ) .
2010-03-30 17:56:21 +04:00
* Used for signaling responses ( CAIF_CTRLCMD_ * _RSP )
* and asynchronous events from the modem ( CAIF_CTRLCMD_ * _IND )
*
* @ layr : Pointer to the current layer the receive function
* is implemented for ( this pointer ) .
* @ ctrl : Control Command .
*/
void ( * ctrlcmd ) ( struct cflayer * layr , enum caif_ctrlcmd ctrl ,
int phyid ) ;
/*
* modemctrl ( ) - Control Function used for controlling the modem .
* Used to signal down - wards in the CAIF stack .
* Returns 0 on success , < 0 upon failure .
*
* @ layr : Pointer to the current layer the receive function
* is implemented for ( this pointer ) .
* @ ctrl : Control Command .
*/
int ( * modemcmd ) ( struct cflayer * layr , enum caif_modemcmd ctrl ) ;
unsigned int id ;
char name [ CAIF_LAYER_NAME_SZ ] ;
} ;
/**
* layer_set_up ( ) - Set the up pointer for a specified layer .
* @ layr : Layer where up pointer shall be set .
* @ above : Layer above .
*/
# define layer_set_up(layr, above) ((layr)->up = (struct cflayer *)(above))
/**
* layer_set_dn ( ) - Set the down pointer for a specified layer .
* @ layr : Layer where down pointer shall be set .
* @ below : Layer below .
*/
# define layer_set_dn(layr, below) ((layr)->dn = (struct cflayer *)(below))
/**
* struct dev_info - Physical Device info information about physical layer .
* @ dev : Pointer to native physical device .
* @ id : Physical ID of the physical connection used by the
* logical CAIF connection . Used by service layers to
* identify their physical id to Caif MUX ( CFMUXL ) so
* that the MUX can add the correct physical ID to the
* packet .
*/
struct dev_info {
void * dev ;
unsigned int id ;
} ;
/**
* struct caif_payload_info - Payload information embedded in packet ( sk_buff ) .
*
* @ dev_info : Information about the receiving device .
*
* @ hdr_len : Header length , used to align pay load on 32 bit boundary .
*
* @ channel_id : Channel ID of the logical CAIF connection .
* Used by mux to insert channel id into the caif packet .
*/
struct caif_payload_info {
struct dev_info * dev_info ;
unsigned short hdr_len ;
unsigned short channel_id ;
} ;
# endif /* CAIF_LAYER_H_ */