mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-09-10 01:12:45 -04:00
Fixed MTP to work with TWRP
This commit is contained in:
commit
f6dfaef42e
50820 changed files with 20846062 additions and 0 deletions
128
include/net/caif/caif_dev.h
Normal file
128
include/net/caif/caif_dev.h
Normal file
|
@ -0,0 +1,128 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Sjur Brendeland
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CAIF_DEV_H_
|
||||
#define CAIF_DEV_H_
|
||||
|
||||
#include <net/caif/caif_layer.h>
|
||||
#include <net/caif/cfcnfg.h>
|
||||
#include <net/caif/caif_device.h>
|
||||
#include <linux/caif/caif_socket.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/net.h>
|
||||
|
||||
/**
|
||||
* struct caif_param - CAIF parameters.
|
||||
* @size: Length of data
|
||||
* @data: Binary Data Blob
|
||||
*/
|
||||
struct caif_param {
|
||||
u16 size;
|
||||
u8 data[256];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct caif_connect_request - Request data for CAIF channel setup.
|
||||
* @protocol: Type of CAIF protocol to use (at, datagram etc)
|
||||
* @sockaddr: Socket address to connect.
|
||||
* @priority: Priority of the connection.
|
||||
* @link_selector: Link selector (high bandwidth or low latency)
|
||||
* @ifindex: kernel index of the interface.
|
||||
* @param: Connect Request parameters (CAIF_SO_REQ_PARAM).
|
||||
*
|
||||
* This struct is used when connecting a CAIF channel.
|
||||
* It contains all CAIF channel configuration options.
|
||||
*/
|
||||
struct caif_connect_request {
|
||||
enum caif_protocol_type protocol;
|
||||
struct sockaddr_caif sockaddr;
|
||||
enum caif_channel_priority priority;
|
||||
enum caif_link_selector link_selector;
|
||||
int ifindex;
|
||||
struct caif_param param;
|
||||
};
|
||||
|
||||
/**
|
||||
* caif_connect_client - Connect a client to CAIF Core Stack.
|
||||
* @config: Channel setup parameters, specifying what address
|
||||
* to connect on the Modem.
|
||||
* @client_layer: User implementation of client layer. This layer
|
||||
* MUST have receive and control callback functions
|
||||
* implemented.
|
||||
* @ifindex: Link layer interface index used for this connection.
|
||||
* @headroom: Head room needed by CAIF protocol.
|
||||
* @tailroom: Tail room needed by CAIF protocol.
|
||||
*
|
||||
* This function connects a CAIF channel. The Client must implement
|
||||
* the struct cflayer. This layer represents the Client layer and holds
|
||||
* receive functions and control callback functions. Control callback
|
||||
* function will receive information about connect/disconnect responses,
|
||||
* flow control etc (see enum caif_control).
|
||||
* E.g. CAIF Socket will call this function for each socket it connects
|
||||
* and have one client_layer instance for each socket.
|
||||
*/
|
||||
int caif_connect_client(struct net *net,
|
||||
struct caif_connect_request *conn_req,
|
||||
struct cflayer *client_layer, int *ifindex,
|
||||
int *headroom, int *tailroom);
|
||||
|
||||
/**
|
||||
* caif_disconnect_client - Disconnects a client from the CAIF stack.
|
||||
*
|
||||
* @client_layer: Client layer to be disconnected.
|
||||
*/
|
||||
int caif_disconnect_client(struct net *net, struct cflayer *client_layer);
|
||||
|
||||
|
||||
/**
|
||||
* caif_client_register_refcnt - register ref-count functions provided by client.
|
||||
*
|
||||
* @adapt_layer: Client layer using CAIF Stack.
|
||||
* @hold: Function provided by client layer increasing ref-count
|
||||
* @put: Function provided by client layer decreasing ref-count
|
||||
*
|
||||
* Client of the CAIF Stack must register functions for reference counting.
|
||||
* These functions are called by the CAIF Stack for every upstream packet,
|
||||
* and must therefore be implemented efficiently.
|
||||
*
|
||||
* Client should call caif_free_client when reference count degrease to zero.
|
||||
*/
|
||||
|
||||
void caif_client_register_refcnt(struct cflayer *adapt_layer,
|
||||
void (*hold)(struct cflayer *lyr),
|
||||
void (*put)(struct cflayer *lyr));
|
||||
/**
|
||||
* caif_free_client - Free memory used to manage the client in the CAIF Stack.
|
||||
*
|
||||
* @client_layer: Client layer to be removed.
|
||||
*
|
||||
* This function must be called from client layer in order to free memory.
|
||||
* Caller must guarantee that no packets are in flight upstream when calling
|
||||
* this function.
|
||||
*/
|
||||
void caif_free_client(struct cflayer *adap_layer);
|
||||
|
||||
/**
|
||||
* struct caif_enroll_dev - Enroll a net-device as a CAIF Link layer
|
||||
* @dev: Network device to enroll.
|
||||
* @caifdev: Configuration information from CAIF Link Layer
|
||||
* @link_support: Link layer support layer
|
||||
* @head_room: Head room needed by link support layer
|
||||
* @layer: Lowest layer in CAIF stack
|
||||
* @rcv_fun: Receive function for CAIF stack.
|
||||
*
|
||||
* This function enroll a CAIF link layer into CAIF Stack and
|
||||
* expects the interface to be able to handle CAIF payload.
|
||||
* The link_support layer is used to add any Link Layer specific
|
||||
* framing.
|
||||
*/
|
||||
void caif_enroll_dev(struct net_device *dev, struct caif_dev_common *caifdev,
|
||||
struct cflayer *link_support, int head_room,
|
||||
struct cflayer **layer, int (**rcv_func)(
|
||||
struct sk_buff *, struct net_device *,
|
||||
struct packet_type *, struct net_device *));
|
||||
|
||||
#endif /* CAIF_DEV_H_ */
|
55
include/net/caif/caif_device.h
Normal file
55
include/net/caif/caif_device.h
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Sjur Brendeland
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CAIF_DEVICE_H_
|
||||
#define CAIF_DEVICE_H_
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/caif/caif_socket.h>
|
||||
#include <net/caif/caif_device.h>
|
||||
|
||||
/**
|
||||
* struct caif_dev_common - data shared between CAIF drivers and stack.
|
||||
* @flowctrl: Flow Control callback function. This function is
|
||||
* supplied by CAIF Core Stack and is used by CAIF
|
||||
* Link Layer to send flow-stop to CAIF Core.
|
||||
* The flow information will be distributed to all
|
||||
* clients of CAIF.
|
||||
*
|
||||
* @link_select: Profile of device, either high-bandwidth or
|
||||
* low-latency. This member is set by CAIF Link
|
||||
* Layer Device in order to indicate if this device
|
||||
* is a high bandwidth or low latency device.
|
||||
*
|
||||
* @use_frag: CAIF Frames may be fragmented.
|
||||
* Is set by CAIF Link Layer in order to indicate if the
|
||||
* interface receives fragmented frames that must be
|
||||
* assembled by CAIF Core Layer.
|
||||
*
|
||||
* @use_fcs: Indicate if Frame CheckSum (fcs) is used.
|
||||
* Is set if the physical interface is
|
||||
* using Frame Checksum on the CAIF Frames.
|
||||
*
|
||||
* @use_stx: Indicate STart of frame eXtension (stx) in use.
|
||||
* Is set if the CAIF Link Layer expects
|
||||
* CAIF Frames to start with the STX byte.
|
||||
*
|
||||
* This structure is shared between the CAIF drivers and the CAIF stack.
|
||||
* It is used by the device to register its behavior.
|
||||
* CAIF Core layer must set the member flowctrl in order to supply
|
||||
* CAIF Link Layer with the flow control function.
|
||||
*
|
||||
*/
|
||||
struct caif_dev_common {
|
||||
void (*flowctrl)(struct net_device *net, int on);
|
||||
enum caif_link_selector link_select;
|
||||
int use_frag;
|
||||
int use_fcs;
|
||||
int use_stx;
|
||||
};
|
||||
|
||||
#endif /* CAIF_DEVICE_H_ */
|
200
include/net/caif/caif_hsi.h
Normal file
200
include/net/caif/caif_hsi.h
Normal file
|
@ -0,0 +1,200 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Daniel Martensson / daniel.martensson@stericsson.com
|
||||
* Dmitry.Tarnyagin / dmitry.tarnyagin@stericsson.com
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CAIF_HSI_H_
|
||||
#define CAIF_HSI_H_
|
||||
|
||||
#include <net/caif/caif_layer.h>
|
||||
#include <net/caif/caif_device.h>
|
||||
#include <linux/atomic.h>
|
||||
|
||||
/*
|
||||
* Maximum number of CAIF frames that can reside in the same HSI frame.
|
||||
*/
|
||||
#define CFHSI_MAX_PKTS 15
|
||||
|
||||
/*
|
||||
* Maximum number of bytes used for the frame that can be embedded in the
|
||||
* HSI descriptor.
|
||||
*/
|
||||
#define CFHSI_MAX_EMB_FRM_SZ 96
|
||||
|
||||
/*
|
||||
* Decides if HSI buffers should be prefilled with 0xFF pattern for easier
|
||||
* debugging. Both TX and RX buffers will be filled before the transfer.
|
||||
*/
|
||||
#define CFHSI_DBG_PREFILL 0
|
||||
|
||||
/* Structure describing a HSI packet descriptor. */
|
||||
#pragma pack(1) /* Byte alignment. */
|
||||
struct cfhsi_desc {
|
||||
u8 header;
|
||||
u8 offset;
|
||||
u16 cffrm_len[CFHSI_MAX_PKTS];
|
||||
u8 emb_frm[CFHSI_MAX_EMB_FRM_SZ];
|
||||
};
|
||||
#pragma pack() /* Default alignment. */
|
||||
|
||||
/* Size of the complete HSI packet descriptor. */
|
||||
#define CFHSI_DESC_SZ (sizeof(struct cfhsi_desc))
|
||||
|
||||
/*
|
||||
* Size of the complete HSI packet descriptor excluding the optional embedded
|
||||
* CAIF frame.
|
||||
*/
|
||||
#define CFHSI_DESC_SHORT_SZ (CFHSI_DESC_SZ - CFHSI_MAX_EMB_FRM_SZ)
|
||||
|
||||
/*
|
||||
* Maximum bytes transferred in one transfer.
|
||||
*/
|
||||
#define CFHSI_MAX_CAIF_FRAME_SZ 4096
|
||||
|
||||
#define CFHSI_MAX_PAYLOAD_SZ (CFHSI_MAX_PKTS * CFHSI_MAX_CAIF_FRAME_SZ)
|
||||
|
||||
/* Size of the complete HSI TX buffer. */
|
||||
#define CFHSI_BUF_SZ_TX (CFHSI_DESC_SZ + CFHSI_MAX_PAYLOAD_SZ)
|
||||
|
||||
/* Size of the complete HSI RX buffer. */
|
||||
#define CFHSI_BUF_SZ_RX ((2 * CFHSI_DESC_SZ) + CFHSI_MAX_PAYLOAD_SZ)
|
||||
|
||||
/* Bitmasks for the HSI descriptor. */
|
||||
#define CFHSI_PIGGY_DESC (0x01 << 7)
|
||||
|
||||
#define CFHSI_TX_STATE_IDLE 0
|
||||
#define CFHSI_TX_STATE_XFER 1
|
||||
|
||||
#define CFHSI_RX_STATE_DESC 0
|
||||
#define CFHSI_RX_STATE_PAYLOAD 1
|
||||
|
||||
/* Bitmasks for power management. */
|
||||
#define CFHSI_WAKE_UP 0
|
||||
#define CFHSI_WAKE_UP_ACK 1
|
||||
#define CFHSI_WAKE_DOWN_ACK 2
|
||||
#define CFHSI_AWAKE 3
|
||||
#define CFHSI_WAKELOCK_HELD 4
|
||||
#define CFHSI_SHUTDOWN 5
|
||||
#define CFHSI_FLUSH_FIFO 6
|
||||
|
||||
#ifndef CFHSI_INACTIVITY_TOUT
|
||||
#define CFHSI_INACTIVITY_TOUT (1 * HZ)
|
||||
#endif /* CFHSI_INACTIVITY_TOUT */
|
||||
|
||||
#ifndef CFHSI_WAKE_TOUT
|
||||
#define CFHSI_WAKE_TOUT (3 * HZ)
|
||||
#endif /* CFHSI_WAKE_TOUT */
|
||||
|
||||
#ifndef CFHSI_MAX_RX_RETRIES
|
||||
#define CFHSI_MAX_RX_RETRIES (10 * HZ)
|
||||
#endif
|
||||
|
||||
/* Structure implemented by the CAIF HSI driver. */
|
||||
struct cfhsi_cb_ops {
|
||||
void (*tx_done_cb) (struct cfhsi_cb_ops *drv);
|
||||
void (*rx_done_cb) (struct cfhsi_cb_ops *drv);
|
||||
void (*wake_up_cb) (struct cfhsi_cb_ops *drv);
|
||||
void (*wake_down_cb) (struct cfhsi_cb_ops *drv);
|
||||
};
|
||||
|
||||
/* Structure implemented by HSI device. */
|
||||
struct cfhsi_ops {
|
||||
int (*cfhsi_up) (struct cfhsi_ops *dev);
|
||||
int (*cfhsi_down) (struct cfhsi_ops *dev);
|
||||
int (*cfhsi_tx) (u8 *ptr, int len, struct cfhsi_ops *dev);
|
||||
int (*cfhsi_rx) (u8 *ptr, int len, struct cfhsi_ops *dev);
|
||||
int (*cfhsi_wake_up) (struct cfhsi_ops *dev);
|
||||
int (*cfhsi_wake_down) (struct cfhsi_ops *dev);
|
||||
int (*cfhsi_get_peer_wake) (struct cfhsi_ops *dev, bool *status);
|
||||
int (*cfhsi_fifo_occupancy) (struct cfhsi_ops *dev, size_t *occupancy);
|
||||
int (*cfhsi_rx_cancel)(struct cfhsi_ops *dev);
|
||||
struct cfhsi_cb_ops *cb_ops;
|
||||
};
|
||||
|
||||
/* Structure holds status of received CAIF frames processing */
|
||||
struct cfhsi_rx_state {
|
||||
int state;
|
||||
int nfrms;
|
||||
int pld_len;
|
||||
int retries;
|
||||
bool piggy_desc;
|
||||
};
|
||||
|
||||
/* Priority mapping */
|
||||
enum {
|
||||
CFHSI_PRIO_CTL = 0,
|
||||
CFHSI_PRIO_VI,
|
||||
CFHSI_PRIO_VO,
|
||||
CFHSI_PRIO_BEBK,
|
||||
CFHSI_PRIO_LAST,
|
||||
};
|
||||
|
||||
struct cfhsi_config {
|
||||
u32 inactivity_timeout;
|
||||
u32 aggregation_timeout;
|
||||
u32 head_align;
|
||||
u32 tail_align;
|
||||
u32 q_high_mark;
|
||||
u32 q_low_mark;
|
||||
};
|
||||
|
||||
/* Structure implemented by CAIF HSI drivers. */
|
||||
struct cfhsi {
|
||||
struct caif_dev_common cfdev;
|
||||
struct net_device *ndev;
|
||||
struct platform_device *pdev;
|
||||
struct sk_buff_head qhead[CFHSI_PRIO_LAST];
|
||||
struct cfhsi_cb_ops cb_ops;
|
||||
struct cfhsi_ops *ops;
|
||||
int tx_state;
|
||||
struct cfhsi_rx_state rx_state;
|
||||
struct cfhsi_config cfg;
|
||||
int rx_len;
|
||||
u8 *rx_ptr;
|
||||
u8 *tx_buf;
|
||||
u8 *rx_buf;
|
||||
u8 *rx_flip_buf;
|
||||
spinlock_t lock;
|
||||
int flow_off_sent;
|
||||
struct list_head list;
|
||||
struct work_struct wake_up_work;
|
||||
struct work_struct wake_down_work;
|
||||
struct work_struct out_of_sync_work;
|
||||
struct workqueue_struct *wq;
|
||||
wait_queue_head_t wake_up_wait;
|
||||
wait_queue_head_t wake_down_wait;
|
||||
wait_queue_head_t flush_fifo_wait;
|
||||
struct timer_list inactivity_timer;
|
||||
struct timer_list rx_slowpath_timer;
|
||||
|
||||
/* TX aggregation */
|
||||
int aggregation_len;
|
||||
struct timer_list aggregation_timer;
|
||||
|
||||
unsigned long bits;
|
||||
};
|
||||
extern struct platform_driver cfhsi_driver;
|
||||
|
||||
/**
|
||||
* enum ifla_caif_hsi - CAIF HSI NetlinkRT parameters.
|
||||
* @IFLA_CAIF_HSI_INACTIVITY_TOUT: Inactivity timeout before
|
||||
* taking the HSI wakeline down, in milliseconds.
|
||||
* When using RT Netlink to create, destroy or configure a CAIF HSI interface,
|
||||
* enum ifla_caif_hsi is used to specify the configuration attributes.
|
||||
*/
|
||||
enum ifla_caif_hsi {
|
||||
__IFLA_CAIF_HSI_UNSPEC,
|
||||
__IFLA_CAIF_HSI_INACTIVITY_TOUT,
|
||||
__IFLA_CAIF_HSI_AGGREGATION_TOUT,
|
||||
__IFLA_CAIF_HSI_HEAD_ALIGN,
|
||||
__IFLA_CAIF_HSI_TAIL_ALIGN,
|
||||
__IFLA_CAIF_HSI_QHIGH_WATERMARK,
|
||||
__IFLA_CAIF_HSI_QLOW_WATERMARK,
|
||||
__IFLA_CAIF_HSI_MAX
|
||||
};
|
||||
|
||||
struct cfhsi_ops *cfhsi_get_ops(void);
|
||||
|
||||
#endif /* CAIF_HSI_H_ */
|
279
include/net/caif/caif_layer.h
Normal file
279
include/net/caif/caif_layer.h
Normal file
|
@ -0,0 +1,279 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Sjur Brendeland
|
||||
* 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.
|
||||
*
|
||||
* - Each layer should not depend on any others layer's 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 (non-blocking).
|
||||
* Contract: Each layer must implement a receive function passing the
|
||||
* CAIF packets upwards in the stack.
|
||||
* Packet handling rules:
|
||||
* - 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().
|
||||
*
|
||||
* - If parsing of the packet fails, the packet must be
|
||||
* destroyed and negative error code returned
|
||||
* from the function.
|
||||
* EXCEPTION: If the framing layer (cffrml) returns
|
||||
* -EILSEQ, the packet is not freed.
|
||||
*
|
||||
* - 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 (non-blocking).
|
||||
* 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().
|
||||
*
|
||||
* - 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.
|
||||
*
|
||||
* - Return value less than zero means error, zero or
|
||||
* greater than zero means OK.
|
||||
*
|
||||
* Returns result < 0 indicates an error, 0 or positive value
|
||||
* indicates 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 (non-blocking).
|
||||
* 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_ */
|
155
include/net/caif/caif_spi.h
Normal file
155
include/net/caif/caif_spi.h
Normal file
|
@ -0,0 +1,155 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Daniel Martensson / Daniel.Martensson@stericsson.com
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CAIF_SPI_H_
|
||||
#define CAIF_SPI_H_
|
||||
|
||||
#include <net/caif/caif_device.h>
|
||||
|
||||
#define SPI_CMD_WR 0x00
|
||||
#define SPI_CMD_RD 0x01
|
||||
#define SPI_CMD_EOT 0x02
|
||||
#define SPI_CMD_IND 0x04
|
||||
|
||||
#define SPI_DMA_BUF_LEN 8192
|
||||
|
||||
#define WL_SZ 2 /* 16 bits. */
|
||||
#define SPI_CMD_SZ 4 /* 32 bits. */
|
||||
#define SPI_IND_SZ 4 /* 32 bits. */
|
||||
|
||||
#define SPI_XFER 0
|
||||
#define SPI_SS_ON 1
|
||||
#define SPI_SS_OFF 2
|
||||
#define SPI_TERMINATE 3
|
||||
|
||||
/* Minimum time between different levels is 50 microseconds. */
|
||||
#define MIN_TRANSITION_TIME_USEC 50
|
||||
|
||||
/* Defines for calculating duration of SPI transfers for a particular
|
||||
* number of bytes.
|
||||
*/
|
||||
#define SPI_MASTER_CLK_MHZ 13
|
||||
#define SPI_XFER_TIME_USEC(bytes, clk) (((bytes) * 8) / clk)
|
||||
|
||||
/* Normally this should be aligned on the modem in order to benefit from full
|
||||
* duplex transfers. However a size of 8188 provokes errors when running with
|
||||
* the modem. These errors occur when packet sizes approaches 4 kB of data.
|
||||
*/
|
||||
#define CAIF_MAX_SPI_FRAME 4092
|
||||
|
||||
/* Maximum number of uplink CAIF frames that can reside in the same SPI frame.
|
||||
* This number should correspond with the modem setting. The application side
|
||||
* CAIF accepts any number of embedded downlink CAIF frames.
|
||||
*/
|
||||
#define CAIF_MAX_SPI_PKTS 9
|
||||
|
||||
/* Decides if SPI buffers should be prefilled with 0xFF pattern for easier
|
||||
* debugging. Both TX and RX buffers will be filled before the transfer.
|
||||
*/
|
||||
#define CFSPI_DBG_PREFILL 0
|
||||
|
||||
/* Structure describing a SPI transfer. */
|
||||
struct cfspi_xfer {
|
||||
u16 tx_dma_len;
|
||||
u16 rx_dma_len;
|
||||
void *va_tx[2];
|
||||
dma_addr_t pa_tx[2];
|
||||
void *va_rx;
|
||||
dma_addr_t pa_rx;
|
||||
};
|
||||
|
||||
/* Structure implemented by the SPI interface. */
|
||||
struct cfspi_ifc {
|
||||
void (*ss_cb) (bool assert, struct cfspi_ifc *ifc);
|
||||
void (*xfer_done_cb) (struct cfspi_ifc *ifc);
|
||||
void *priv;
|
||||
};
|
||||
|
||||
/* Structure implemented by SPI clients. */
|
||||
struct cfspi_dev {
|
||||
int (*init_xfer) (struct cfspi_xfer *xfer, struct cfspi_dev *dev);
|
||||
void (*sig_xfer) (bool xfer, struct cfspi_dev *dev);
|
||||
struct cfspi_ifc *ifc;
|
||||
char *name;
|
||||
u32 clk_mhz;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
/* Enumeration describing the CAIF SPI state. */
|
||||
enum cfspi_state {
|
||||
CFSPI_STATE_WAITING = 0,
|
||||
CFSPI_STATE_AWAKE,
|
||||
CFSPI_STATE_FETCH_PKT,
|
||||
CFSPI_STATE_GET_NEXT,
|
||||
CFSPI_STATE_INIT_XFER,
|
||||
CFSPI_STATE_WAIT_ACTIVE,
|
||||
CFSPI_STATE_SIG_ACTIVE,
|
||||
CFSPI_STATE_WAIT_XFER_DONE,
|
||||
CFSPI_STATE_XFER_DONE,
|
||||
CFSPI_STATE_WAIT_INACTIVE,
|
||||
CFSPI_STATE_SIG_INACTIVE,
|
||||
CFSPI_STATE_DELIVER_PKT,
|
||||
CFSPI_STATE_MAX,
|
||||
};
|
||||
|
||||
/* Structure implemented by SPI physical interfaces. */
|
||||
struct cfspi {
|
||||
struct caif_dev_common cfdev;
|
||||
struct net_device *ndev;
|
||||
struct platform_device *pdev;
|
||||
struct sk_buff_head qhead;
|
||||
struct sk_buff_head chead;
|
||||
u16 cmd;
|
||||
u16 tx_cpck_len;
|
||||
u16 tx_npck_len;
|
||||
u16 rx_cpck_len;
|
||||
u16 rx_npck_len;
|
||||
struct cfspi_ifc ifc;
|
||||
struct cfspi_xfer xfer;
|
||||
struct cfspi_dev *dev;
|
||||
unsigned long state;
|
||||
struct work_struct work;
|
||||
struct workqueue_struct *wq;
|
||||
struct list_head list;
|
||||
int flow_off_sent;
|
||||
u32 qd_low_mark;
|
||||
u32 qd_high_mark;
|
||||
struct completion comp;
|
||||
wait_queue_head_t wait;
|
||||
spinlock_t lock;
|
||||
bool flow_stop;
|
||||
bool slave;
|
||||
bool slave_talked;
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
enum cfspi_state dbg_state;
|
||||
u16 pcmd;
|
||||
u16 tx_ppck_len;
|
||||
u16 rx_ppck_len;
|
||||
struct dentry *dbgfs_dir;
|
||||
struct dentry *dbgfs_state;
|
||||
struct dentry *dbgfs_frame;
|
||||
#endif /* CONFIG_DEBUG_FS */
|
||||
};
|
||||
|
||||
extern int spi_frm_align;
|
||||
extern int spi_up_head_align;
|
||||
extern int spi_up_tail_align;
|
||||
extern int spi_down_head_align;
|
||||
extern int spi_down_tail_align;
|
||||
extern struct platform_driver cfspi_spi_driver;
|
||||
|
||||
void cfspi_dbg_state(struct cfspi *cfspi, int state);
|
||||
int cfspi_xmitfrm(struct cfspi *cfspi, u8 *buf, size_t len);
|
||||
int cfspi_xmitlen(struct cfspi *cfspi);
|
||||
int cfspi_rxfrm(struct cfspi *cfspi, u8 *buf, size_t len);
|
||||
int cfspi_spi_remove(struct platform_device *pdev);
|
||||
int cfspi_spi_probe(struct platform_device *pdev);
|
||||
int cfspi_xmitfrm(struct cfspi *cfspi, u8 *buf, size_t len);
|
||||
int cfspi_xmitlen(struct cfspi *cfspi);
|
||||
int cfspi_rxfrm(struct cfspi *cfspi, u8 *buf, size_t len);
|
||||
void cfspi_xfer(struct work_struct *work);
|
||||
|
||||
#endif /* CAIF_SPI_H_ */
|
90
include/net/caif/cfcnfg.h
Normal file
90
include/net/caif/cfcnfg.h
Normal file
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Sjur Brendeland
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CFCNFG_H_
|
||||
#define CFCNFG_H_
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <net/caif/caif_layer.h>
|
||||
#include <net/caif/cfctrl.h>
|
||||
|
||||
struct cfcnfg;
|
||||
|
||||
/**
|
||||
* enum cfcnfg_phy_preference - Physical preference HW Abstraction
|
||||
*
|
||||
* @CFPHYPREF_UNSPECIFIED: Default physical interface
|
||||
*
|
||||
* @CFPHYPREF_LOW_LAT: Default physical interface for low-latency
|
||||
* traffic
|
||||
* @CFPHYPREF_HIGH_BW: Default physical interface for high-bandwidth
|
||||
* traffic
|
||||
* @CFPHYPREF_LOOP: TEST only Loopback interface simulating modem
|
||||
* responses.
|
||||
*
|
||||
*/
|
||||
enum cfcnfg_phy_preference {
|
||||
CFPHYPREF_UNSPECIFIED,
|
||||
CFPHYPREF_LOW_LAT,
|
||||
CFPHYPREF_HIGH_BW,
|
||||
CFPHYPREF_LOOP
|
||||
};
|
||||
|
||||
/**
|
||||
* cfcnfg_create() - Get the CAIF configuration object given network.
|
||||
* @net: Network for the CAIF configuration object.
|
||||
*/
|
||||
struct cfcnfg *get_cfcnfg(struct net *net);
|
||||
|
||||
/**
|
||||
* cfcnfg_create() - Create the CAIF configuration object.
|
||||
*/
|
||||
struct cfcnfg *cfcnfg_create(void);
|
||||
|
||||
/**
|
||||
* cfcnfg_remove() - Remove the CFCNFG object
|
||||
* @cfg: config object
|
||||
*/
|
||||
void cfcnfg_remove(struct cfcnfg *cfg);
|
||||
|
||||
/**
|
||||
* cfcnfg_add_phy_layer() - Adds a physical layer to the CAIF stack.
|
||||
* @cnfg: Pointer to a CAIF configuration object, created by
|
||||
* cfcnfg_create().
|
||||
* @dev: Pointer to link layer device
|
||||
* @phy_layer: Specify the physical layer. The transmit function
|
||||
* MUST be set in the structure.
|
||||
* @pref: The phy (link layer) preference.
|
||||
* @link_support: Protocol implementation for link layer specific protocol.
|
||||
* @fcs: Specify if checksum is used in CAIF Framing Layer.
|
||||
* @head_room: Head space needed by link specific protocol.
|
||||
*/
|
||||
void
|
||||
cfcnfg_add_phy_layer(struct cfcnfg *cnfg,
|
||||
struct net_device *dev, struct cflayer *phy_layer,
|
||||
enum cfcnfg_phy_preference pref,
|
||||
struct cflayer *link_support,
|
||||
bool fcs, int head_room);
|
||||
|
||||
/**
|
||||
* cfcnfg_del_phy_layer - Deletes an phy layer from the CAIF stack.
|
||||
*
|
||||
* @cnfg: Pointer to a CAIF configuration object, created by
|
||||
* cfcnfg_create().
|
||||
* @phy_layer: Adaptation layer to be removed.
|
||||
*/
|
||||
int cfcnfg_del_phy_layer(struct cfcnfg *cnfg, struct cflayer *phy_layer);
|
||||
|
||||
/**
|
||||
* cfcnfg_set_phy_state() - Set the state of the physical interface device.
|
||||
* @cnfg: Configuration object
|
||||
* @phy_layer: Physical Layer representation
|
||||
* @up: State of device
|
||||
*/
|
||||
int cfcnfg_set_phy_state(struct cfcnfg *cnfg, struct cflayer *phy_layer,
|
||||
bool up);
|
||||
|
||||
#endif /* CFCNFG_H_ */
|
130
include/net/caif/cfctrl.h
Normal file
130
include/net/caif/cfctrl.h
Normal file
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Sjur Brendeland
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CFCTRL_H_
|
||||
#define CFCTRL_H_
|
||||
#include <net/caif/caif_layer.h>
|
||||
#include <net/caif/cfsrvl.h>
|
||||
|
||||
/* CAIF Control packet commands */
|
||||
enum cfctrl_cmd {
|
||||
CFCTRL_CMD_LINK_SETUP = 0,
|
||||
CFCTRL_CMD_LINK_DESTROY = 1,
|
||||
CFCTRL_CMD_LINK_ERR = 2,
|
||||
CFCTRL_CMD_ENUM = 3,
|
||||
CFCTRL_CMD_SLEEP = 4,
|
||||
CFCTRL_CMD_WAKE = 5,
|
||||
CFCTRL_CMD_LINK_RECONF = 6,
|
||||
CFCTRL_CMD_START_REASON = 7,
|
||||
CFCTRL_CMD_RADIO_SET = 8,
|
||||
CFCTRL_CMD_MODEM_SET = 9,
|
||||
CFCTRL_CMD_MASK = 0xf
|
||||
};
|
||||
|
||||
/* Channel types */
|
||||
enum cfctrl_srv {
|
||||
CFCTRL_SRV_DECM = 0,
|
||||
CFCTRL_SRV_VEI = 1,
|
||||
CFCTRL_SRV_VIDEO = 2,
|
||||
CFCTRL_SRV_DBG = 3,
|
||||
CFCTRL_SRV_DATAGRAM = 4,
|
||||
CFCTRL_SRV_RFM = 5,
|
||||
CFCTRL_SRV_UTIL = 6,
|
||||
CFCTRL_SRV_MASK = 0xf
|
||||
};
|
||||
|
||||
#define CFCTRL_RSP_BIT 0x20
|
||||
#define CFCTRL_ERR_BIT 0x10
|
||||
|
||||
struct cfctrl_rsp {
|
||||
void (*linksetup_rsp)(struct cflayer *layer, u8 linkid,
|
||||
enum cfctrl_srv serv, u8 phyid,
|
||||
struct cflayer *adapt_layer);
|
||||
void (*linkdestroy_rsp)(struct cflayer *layer, u8 linkid);
|
||||
void (*linkerror_ind)(void);
|
||||
void (*enum_rsp)(void);
|
||||
void (*sleep_rsp)(void);
|
||||
void (*wake_rsp)(void);
|
||||
void (*restart_rsp)(void);
|
||||
void (*radioset_rsp)(void);
|
||||
void (*reject_rsp)(struct cflayer *layer, u8 linkid,
|
||||
struct cflayer *client_layer);
|
||||
};
|
||||
|
||||
/* Link Setup Parameters for CAIF-Links. */
|
||||
struct cfctrl_link_param {
|
||||
enum cfctrl_srv linktype;/* (T3,T0) Type of Channel */
|
||||
u8 priority; /* (P4,P0) Priority of the channel */
|
||||
u8 phyid; /* (U2-U0) Physical interface to connect */
|
||||
u8 endpoint; /* (E1,E0) Endpoint for data channels */
|
||||
u8 chtype; /* (H1,H0) Channel-Type, applies to
|
||||
* VEI, DEBUG */
|
||||
union {
|
||||
struct {
|
||||
u8 connid; /* (D7,D0) Video LinkId */
|
||||
} video;
|
||||
|
||||
struct {
|
||||
u32 connid; /* (N31,Ngit0) Connection ID used
|
||||
* for Datagram */
|
||||
} datagram;
|
||||
|
||||
struct {
|
||||
u32 connid; /* Connection ID used for RFM */
|
||||
char volume[20]; /* Volume to mount for RFM */
|
||||
} rfm; /* Configuration for RFM */
|
||||
|
||||
struct {
|
||||
u16 fifosize_kb; /* Psock FIFO size in KB */
|
||||
u16 fifosize_bufs; /* Psock # signal buffers */
|
||||
char name[16]; /* Name of the PSOCK service */
|
||||
u8 params[255]; /* Link setup Parameters> */
|
||||
u16 paramlen; /* Length of Link Setup
|
||||
* Parameters */
|
||||
} utility; /* Configuration for Utility Links (Psock) */
|
||||
} u;
|
||||
};
|
||||
|
||||
/* This structure is used internally in CFCTRL */
|
||||
struct cfctrl_request_info {
|
||||
int sequence_no;
|
||||
enum cfctrl_cmd cmd;
|
||||
u8 channel_id;
|
||||
struct cfctrl_link_param param;
|
||||
struct cflayer *client_layer;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
struct cfctrl {
|
||||
struct cfsrvl serv;
|
||||
struct cfctrl_rsp res;
|
||||
atomic_t req_seq_no;
|
||||
atomic_t rsp_seq_no;
|
||||
struct list_head list;
|
||||
/* Protects from simultaneous access to first_req list */
|
||||
spinlock_t info_list_lock;
|
||||
#ifndef CAIF_NO_LOOP
|
||||
u8 loop_linkid;
|
||||
int loop_linkused[256];
|
||||
/* Protects simultaneous access to loop_linkid and loop_linkused */
|
||||
spinlock_t loop_linkid_lock;
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
void cfctrl_enum_req(struct cflayer *cfctrl, u8 physlinkid);
|
||||
int cfctrl_linkup_request(struct cflayer *cfctrl,
|
||||
struct cfctrl_link_param *param,
|
||||
struct cflayer *user_layer);
|
||||
int cfctrl_linkdown_req(struct cflayer *cfctrl, u8 linkid,
|
||||
struct cflayer *client);
|
||||
|
||||
struct cflayer *cfctrl_create(void);
|
||||
struct cfctrl_rsp *cfctrl_get_respfuncs(struct cflayer *layer);
|
||||
int cfctrl_cancel_req(struct cflayer *layr, struct cflayer *adap_layer);
|
||||
void cfctrl_remove(struct cflayer *layr);
|
||||
|
||||
#endif /* CFCTRL_H_ */
|
21
include/net/caif/cffrml.h
Normal file
21
include/net/caif/cffrml.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Sjur Brendeland
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CFFRML_H_
|
||||
#define CFFRML_H_
|
||||
#include <net/caif/caif_layer.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
struct cffrml;
|
||||
struct cflayer *cffrml_create(u16 phyid, bool use_fcs);
|
||||
void cffrml_free(struct cflayer *layr);
|
||||
void cffrml_set_uplayer(struct cflayer *this, struct cflayer *up);
|
||||
void cffrml_set_dnlayer(struct cflayer *this, struct cflayer *dn);
|
||||
void cffrml_put(struct cflayer *layr);
|
||||
void cffrml_hold(struct cflayer *layr);
|
||||
int cffrml_refcnt_read(struct cflayer *layr);
|
||||
|
||||
#endif /* CFFRML_H_ */
|
20
include/net/caif/cfmuxl.h
Normal file
20
include/net/caif/cfmuxl.h
Normal file
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Sjur Brendeland
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CFMUXL_H_
|
||||
#define CFMUXL_H_
|
||||
#include <net/caif/caif_layer.h>
|
||||
|
||||
struct cfsrvl;
|
||||
struct cffrml;
|
||||
|
||||
struct cflayer *cfmuxl_create(void);
|
||||
int cfmuxl_set_uplayer(struct cflayer *layr, struct cflayer *up, u8 linkid);
|
||||
struct cflayer *cfmuxl_remove_dnlayer(struct cflayer *layr, u8 phyid);
|
||||
int cfmuxl_set_dnlayer(struct cflayer *layr, struct cflayer *up, u8 phyid);
|
||||
struct cflayer *cfmuxl_remove_uplayer(struct cflayer *layr, u8 linkid);
|
||||
|
||||
#endif /* CFMUXL_H_ */
|
205
include/net/caif/cfpkt.h
Normal file
205
include/net/caif/cfpkt.h
Normal file
|
@ -0,0 +1,205 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Sjur Brendeland
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CFPKT_H_
|
||||
#define CFPKT_H_
|
||||
#include <net/caif/caif_layer.h>
|
||||
#include <linux/types.h>
|
||||
struct cfpkt;
|
||||
|
||||
/* Create a CAIF packet.
|
||||
* len: Length of packet to be created
|
||||
* @return New packet.
|
||||
*/
|
||||
struct cfpkt *cfpkt_create(u16 len);
|
||||
|
||||
/*
|
||||
* Destroy a CAIF Packet.
|
||||
* pkt Packet to be destoyed.
|
||||
*/
|
||||
void cfpkt_destroy(struct cfpkt *pkt);
|
||||
|
||||
/*
|
||||
* Extract header from packet.
|
||||
*
|
||||
* pkt Packet to extract header data from.
|
||||
* data Pointer to copy the header data into.
|
||||
* len Length of head data to copy.
|
||||
* @return zero on success and error code upon failure
|
||||
*/
|
||||
int cfpkt_extr_head(struct cfpkt *pkt, void *data, u16 len);
|
||||
|
||||
/*
|
||||
* Peek header from packet.
|
||||
* Reads data from packet without changing packet.
|
||||
*
|
||||
* pkt Packet to extract header data from.
|
||||
* data Pointer to copy the header data into.
|
||||
* len Length of head data to copy.
|
||||
* @return zero on success and error code upon failure
|
||||
*/
|
||||
int cfpkt_peek_head(struct cfpkt *pkt, void *data, u16 len);
|
||||
|
||||
/*
|
||||
* Extract header from trailer (end of packet).
|
||||
*
|
||||
* pkt Packet to extract header data from.
|
||||
* data Pointer to copy the trailer data into.
|
||||
* len Length of header data to copy.
|
||||
* @return zero on success and error code upon failure
|
||||
*/
|
||||
int cfpkt_extr_trail(struct cfpkt *pkt, void *data, u16 len);
|
||||
|
||||
/*
|
||||
* Add header to packet.
|
||||
*
|
||||
*
|
||||
* pkt Packet to add header data to.
|
||||
* data Pointer to data to copy into the header.
|
||||
* len Length of header data to copy.
|
||||
* @return zero on success and error code upon failure
|
||||
*/
|
||||
int cfpkt_add_head(struct cfpkt *pkt, const void *data, u16 len);
|
||||
|
||||
/*
|
||||
* Add trailer to packet.
|
||||
*
|
||||
*
|
||||
* pkt Packet to add trailer data to.
|
||||
* data Pointer to data to copy into the trailer.
|
||||
* len Length of trailer data to copy.
|
||||
* @return zero on success and error code upon failure
|
||||
*/
|
||||
int cfpkt_add_trail(struct cfpkt *pkt, const void *data, u16 len);
|
||||
|
||||
/*
|
||||
* Pad trailer on packet.
|
||||
* Moves data pointer in packet, no content copied.
|
||||
*
|
||||
* pkt Packet in which to pad trailer.
|
||||
* len Length of padding to add.
|
||||
* @return zero on success and error code upon failure
|
||||
*/
|
||||
int cfpkt_pad_trail(struct cfpkt *pkt, u16 len);
|
||||
|
||||
/*
|
||||
* Add a single byte to packet body (tail).
|
||||
*
|
||||
* pkt Packet in which to add byte.
|
||||
* data Byte to add.
|
||||
* @return zero on success and error code upon failure
|
||||
*/
|
||||
int cfpkt_addbdy(struct cfpkt *pkt, const u8 data);
|
||||
|
||||
/*
|
||||
* Add a data to packet body (tail).
|
||||
*
|
||||
* pkt Packet in which to add data.
|
||||
* data Pointer to data to copy into the packet body.
|
||||
* len Length of data to add.
|
||||
* @return zero on success and error code upon failure
|
||||
*/
|
||||
int cfpkt_add_body(struct cfpkt *pkt, const void *data, u16 len);
|
||||
|
||||
/*
|
||||
* Checks whether there are more data to process in packet.
|
||||
* pkt Packet to check.
|
||||
* @return true if more data are available in packet false otherwise
|
||||
*/
|
||||
bool cfpkt_more(struct cfpkt *pkt);
|
||||
|
||||
/*
|
||||
* Checks whether the packet is erroneous,
|
||||
* i.e. if it has been attempted to extract more data than available in packet
|
||||
* or writing more data than has been allocated in cfpkt_create().
|
||||
* pkt Packet to check.
|
||||
* @return true on error false otherwise
|
||||
*/
|
||||
bool cfpkt_erroneous(struct cfpkt *pkt);
|
||||
|
||||
/*
|
||||
* Get the packet length.
|
||||
* pkt Packet to get length from.
|
||||
* @return Number of bytes in packet.
|
||||
*/
|
||||
u16 cfpkt_getlen(struct cfpkt *pkt);
|
||||
|
||||
/*
|
||||
* Set the packet length, by adjusting the trailer pointer according to length.
|
||||
* pkt Packet to set length.
|
||||
* len Packet length.
|
||||
* @return Number of bytes in packet.
|
||||
*/
|
||||
int cfpkt_setlen(struct cfpkt *pkt, u16 len);
|
||||
|
||||
/*
|
||||
* cfpkt_append - Appends a packet's data to another packet.
|
||||
* dstpkt: Packet to append data into, WILL BE FREED BY THIS FUNCTION
|
||||
* addpkt: Packet to be appended and automatically released,
|
||||
* WILL BE FREED BY THIS FUNCTION.
|
||||
* expectlen: Packet's expected total length. This should be considered
|
||||
* as a hint.
|
||||
* NB: Input packets will be destroyed after appending and cannot be used
|
||||
* after calling this function.
|
||||
* @return The new appended packet.
|
||||
*/
|
||||
struct cfpkt *cfpkt_append(struct cfpkt *dstpkt, struct cfpkt *addpkt,
|
||||
u16 expectlen);
|
||||
|
||||
/*
|
||||
* cfpkt_split - Split a packet into two packets at the specified split point.
|
||||
* pkt: Packet to be split (will contain the first part of the data on exit)
|
||||
* pos: Position to split packet in two parts.
|
||||
* @return The new packet, containing the second part of the data.
|
||||
*/
|
||||
struct cfpkt *cfpkt_split(struct cfpkt *pkt, u16 pos);
|
||||
|
||||
/*
|
||||
* Iteration function, iterates the packet buffers from start to end.
|
||||
*
|
||||
* Checksum iteration function used to iterate buffers
|
||||
* (we may have packets consisting of a chain of buffers)
|
||||
* pkt: Packet to calculate checksum for
|
||||
* iter_func: Function pointer to iteration function
|
||||
* chks: Checksum calculated so far.
|
||||
* buf: Pointer to the buffer to checksum
|
||||
* len: Length of buf.
|
||||
* data: Initial checksum value.
|
||||
* @return Checksum of buffer.
|
||||
*/
|
||||
|
||||
u16 cfpkt_iterate(struct cfpkt *pkt,
|
||||
u16 (*iter_func)(u16 chks, void *buf, u16 len),
|
||||
u16 data);
|
||||
|
||||
/* Map from a "native" packet (e.g. Linux Socket Buffer) to a CAIF packet.
|
||||
* dir - Direction indicating whether this packet is to be sent or received.
|
||||
* nativepkt - The native packet to be transformed to a CAIF packet
|
||||
* @return The mapped CAIF Packet CFPKT.
|
||||
*/
|
||||
struct cfpkt *cfpkt_fromnative(enum caif_direction dir, void *nativepkt);
|
||||
|
||||
/* Map from a CAIF packet to a "native" packet (e.g. Linux Socket Buffer).
|
||||
* pkt - The CAIF packet to be transformed into a "native" packet.
|
||||
* @return The native packet transformed from a CAIF packet.
|
||||
*/
|
||||
void *cfpkt_tonative(struct cfpkt *pkt);
|
||||
|
||||
/*
|
||||
* Returns packet information for a packet.
|
||||
* pkt Packet to get info from;
|
||||
* @return Packet information
|
||||
*/
|
||||
struct caif_payload_info *cfpkt_info(struct cfpkt *pkt);
|
||||
|
||||
/** cfpkt_set_prio - set priority for a CAIF packet.
|
||||
*
|
||||
* @pkt: The CAIF packet to be adjusted.
|
||||
* @prio: one of TC_PRIO_ constants.
|
||||
*/
|
||||
void cfpkt_set_prio(struct cfpkt *pkt, int prio);
|
||||
|
||||
#endif /* CFPKT_H_ */
|
12
include/net/caif/cfserl.h
Normal file
12
include/net/caif/cfserl.h
Normal file
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Sjur Brendeland
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CFSERL_H_
|
||||
#define CFSERL_H_
|
||||
#include <net/caif/caif_layer.h>
|
||||
|
||||
struct cflayer *cfserl_create(int instance, bool use_stx);
|
||||
#endif
|
65
include/net/caif/cfsrvl.h
Normal file
65
include/net/caif/cfsrvl.h
Normal file
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* Copyright (C) ST-Ericsson AB 2010
|
||||
* Author: Sjur Brendeland
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#ifndef CFSRVL_H_
|
||||
#define CFSRVL_H_
|
||||
#include <linux/list.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/rculist.h>
|
||||
|
||||
struct cfsrvl {
|
||||
struct cflayer layer;
|
||||
bool open;
|
||||
bool phy_flow_on;
|
||||
bool modem_flow_on;
|
||||
bool supports_flowctrl;
|
||||
void (*release)(struct cflayer *layer);
|
||||
struct dev_info dev_info;
|
||||
void (*hold)(struct cflayer *lyr);
|
||||
void (*put)(struct cflayer *lyr);
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
struct cflayer *cfvei_create(u8 linkid, struct dev_info *dev_info);
|
||||
struct cflayer *cfdgml_create(u8 linkid, struct dev_info *dev_info);
|
||||
struct cflayer *cfutill_create(u8 linkid, struct dev_info *dev_info);
|
||||
struct cflayer *cfvidl_create(u8 linkid, struct dev_info *dev_info);
|
||||
struct cflayer *cfrfml_create(u8 linkid, struct dev_info *dev_info,
|
||||
int mtu_size);
|
||||
struct cflayer *cfdbgl_create(u8 linkid, struct dev_info *dev_info);
|
||||
|
||||
void cfsrvl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
|
||||
int phyid);
|
||||
|
||||
bool cfsrvl_phyid_match(struct cflayer *layer, int phyid);
|
||||
|
||||
void cfsrvl_init(struct cfsrvl *service,
|
||||
u8 channel_id,
|
||||
struct dev_info *dev_info,
|
||||
bool supports_flowctrl);
|
||||
bool cfsrvl_ready(struct cfsrvl *service, int *err);
|
||||
u8 cfsrvl_getphyid(struct cflayer *layer);
|
||||
|
||||
static inline void cfsrvl_get(struct cflayer *layr)
|
||||
{
|
||||
struct cfsrvl *s = container_of(layr, struct cfsrvl, layer);
|
||||
if (layr == NULL || layr->up == NULL || s->hold == NULL)
|
||||
return;
|
||||
|
||||
s->hold(layr->up);
|
||||
}
|
||||
|
||||
static inline void cfsrvl_put(struct cflayer *layr)
|
||||
{
|
||||
struct cfsrvl *s = container_of(layr, struct cfsrvl, layer);
|
||||
if (layr == NULL || layr->up == NULL || s->hold == NULL)
|
||||
return;
|
||||
|
||||
s->put(layr->up);
|
||||
}
|
||||
#endif /* CFSRVL_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue