| 
									
										
										
										
											2010-03-30 13:56:21 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (C) ST-Ericsson AB 2010 | 
					
						
							| 
									
										
										
										
											2013-04-22 23:57:01 +00:00
										 |  |  |  * Author:	Sjur Brendeland | 
					
						
							| 
									
										
										
										
											2010-03-30 13:56:21 +00:00
										 |  |  |  * 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 11:18:53 +00:00
										 |  |  |  *    - Each layer should not depend on any others layer's private data. | 
					
						
							| 
									
										
										
										
											2010-03-30 13:56:21 +00: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 11:18:53 +00:00
										 |  |  | 	 *  receive() - Receive Function (non-blocking). | 
					
						
							| 
									
										
										
										
											2010-03-30 13:56:21 +00:00
										 |  |  | 	 *  Contract: Each layer must implement a receive function passing the | 
					
						
							|  |  |  | 	 *  CAIF packets upwards in the stack. | 
					
						
							|  |  |  | 	 *	Packet handling rules: | 
					
						
							| 
									
										
										
										
											2011-05-22 11:18:53 +00: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 13:56:21 +00:00
										 |  |  | 	 *	      - If parsing of the packet fails, the packet must be | 
					
						
							| 
									
										
										
										
											2011-05-22 11:18:53 +00: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 13:56:21 +00:00
										 |  |  | 	 *	      - If parsing succeeds (and above layers return OK) then | 
					
						
							| 
									
										
										
										
											2011-05-22 11:18:53 +00:00
										 |  |  | 	 *		      the function must return a value >= 0. | 
					
						
							| 
									
										
										
										
											2010-03-30 13:56:21 +00: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 11:18:53 +00:00
										 |  |  | 	 *  transmit() - Transmit Function (non-blocking). | 
					
						
							| 
									
										
										
										
											2010-03-30 13:56:21 +00: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 11:18:53 +00: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 13:56:21 +00:00
										 |  |  | 	 * | 
					
						
							|  |  |  | 	 *	      - Return value less than zero means error, zero or | 
					
						
							|  |  |  | 	 *		greater than zero means OK. | 
					
						
							|  |  |  | 	 * | 
					
						
							| 
									
										
										
										
											2011-05-22 11:18:53 +00:00
										 |  |  | 	 *  Returns result < 0 indicates an error, 0 or positive value | 
					
						
							|  |  |  | 	 *		indicates success. | 
					
						
							| 
									
										
										
										
											2010-03-30 13:56:21 +00: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 11:18:53 +00:00
										 |  |  | 	 *  cttrlcmd() - Control Function upwards in CAIF Stack  (non-blocking). | 
					
						
							| 
									
										
										
										
											2010-03-30 13:56:21 +00: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 32bit 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_ */
 |