diff options
Diffstat (limited to 'include/net/caif/caif_layer.h')
| -rw-r--r-- | include/net/caif/caif_layer.h | 283 | 
1 files changed, 283 insertions, 0 deletions
diff --git a/include/net/caif/caif_layer.h b/include/net/caif/caif_layer.h new file mode 100644 index 00000000000..25c472f0e5b --- /dev/null +++ b/include/net/caif/caif_layer.h @@ -0,0 +1,283 @@ +/* + * 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_MAX_FRAMESIZE 4096 +#define CAIF_MAX_PAYLOAD_SIZE (4096 - 64) +#define CAIF_NEEDED_HEADROOM (10) +#define CAIF_NEEDED_TAILROOM (2) + +#define CAIF_LAYER_NAME_SZ 16 +#define CAIF_SUCCESS	1 +#define CAIF_FAILURE	0 + +/** + * 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. + * @prio:	Priority of this layer. + * @id:		The identity of this layer + * @type:	The type 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. + * + *    - Each layer should not depend on any others layer private data. + * + *    - 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; + +	/* +	 *  receive() - Receive Function. +	 *  Contract: Each layer must implement a receive function passing the +	 *  CAIF packets upwards in the stack. +	 *	Packet handling rules: +	 *	      - The CAIF packet (cfpkt) cannot be accessed after +	 *		     passing it to the next layer using up->receive(). +	 *	      - If parsing of the packet fails, the packet must be +	 *		     destroyed and -1 returned from the function. +	 *	      - If parsing succeeds (and above layers return OK) then +	 *		      the function must return a value > 0. +	 * +	 *  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); + +	/* +	 *  transmit() - Transmit Function. +	 *  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(). +	 * +	 *	      - If transmit fails, however, the ownership is returned +	 *		to thecaller. The caller of "dn->transmit()" must +	 *		destroy or resend packet. +	 * +	 *	      - Return value less than zero means error, zero or +	 *		greater than zero means OK. +	 * +	 *	 result < 0 indicates an error, 0 or positive value +	 *	 indicate success. +	 * +	 *  @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); + +	/* +	 *  cttrlcmd() - Control Function upwards in CAIF Stack. +	 *  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 short prio; +	unsigned int id; +	unsigned int type; +	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_ */  |