2019-05-28 09:57:21 -07:00
/* SPDX-License-Identifier: GPL-2.0-only */
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
*/
# 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 ) ;
2010-04-28 08:54:37 +00:00
void ( * linkdestroy_rsp ) ( struct cflayer * layer , u8 linkid ) ;
2010-03-30 13:56:21 +00:00
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 ,
2010-11-14 17:04:58 +00:00
struct cflayer * client_layer ) ;
2010-03-30 13:56:21 +00:00
} ;
/* 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 ;
2010-05-21 02:16:08 +00:00
struct list_head list ;
2010-03-30 13:56:21 +00:00
} ;
struct cfctrl {
struct cfsrvl serv ;
struct cfctrl_rsp res ;
atomic_t req_seq_no ;
atomic_t rsp_seq_no ;
2010-05-21 02:16:08 +00:00
struct list_head list ;
2010-03-30 13:56:21 +00:00
/* 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 ) ;
2010-04-28 08:54:37 +00:00
int cfctrl_linkup_request ( struct cflayer * cfctrl ,
2010-03-30 13:56:21 +00:00
struct cfctrl_link_param * param ,
struct cflayer * user_layer ) ;
int cfctrl_linkdown_req ( struct cflayer * cfctrl , u8 linkid ,
struct cflayer * client ) ;
2011-04-11 10:43:50 +00:00
2010-03-30 13:56:21 +00:00
struct cflayer * cfctrl_create ( void ) ;
struct cfctrl_rsp * cfctrl_get_respfuncs ( struct cflayer * layer ) ;
2011-05-13 02:44:06 +00:00
int cfctrl_cancel_req ( struct cflayer * layr , struct cflayer * adap_layer ) ;
void cfctrl_remove ( struct cflayer * layr ) ;
2010-04-28 08:54:37 +00:00
2010-03-30 13:56:21 +00:00
# endif /* CFCTRL_H_ */