-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
net-caif: add CAIF core protocol stack header files
Add include files for the CAIF Core protocol stack. caif_layer.h - Defines the structure of the CAIF protocol layers cfcnfg.h - CAIF Configuration Module for services and link layers cfctrl.h - CAIF Control Protocol Layer cffrml.h - CAIF Framing Layer cfmuxl.h - CAIF Muxing Layer cfpkt.h - CAIF Packet layer (skb helper functions) cfserl.h - CAIF Serial Layer cfsrvl.h - CAIF Service Layer Signed-off-by: Sjur Braendeland <sjur.brandeland@stericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Sjur Braendeland
authored and
David S. Miller
committed
Mar 31, 2010
1 parent
f671c54
commit 09009f3
Showing
8 changed files
with
912 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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_ */ |
Oops, something went wrong.