xref: /openbmc/linux/include/net/caif/caif_dev.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1af873fceSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
22721c5b9SSjur Braendeland /*
32721c5b9SSjur Braendeland  * Copyright (C) ST-Ericsson AB 2010
426ee65e6Ssjur.brandeland@stericsson.com  * Author:	Sjur Brendeland
52721c5b9SSjur Braendeland  */
62721c5b9SSjur Braendeland 
72721c5b9SSjur Braendeland #ifndef CAIF_DEV_H_
82721c5b9SSjur Braendeland #define CAIF_DEV_H_
92721c5b9SSjur Braendeland 
102721c5b9SSjur Braendeland #include <net/caif/caif_layer.h>
112721c5b9SSjur Braendeland #include <net/caif/cfcnfg.h>
127c18d220Ssjur.brandeland@stericsson.com #include <net/caif/caif_device.h>
132721c5b9SSjur Braendeland #include <linux/caif/caif_socket.h>
142721c5b9SSjur Braendeland #include <linux/if.h>
15bee925dbSsjur.brandeland@stericsson.com #include <linux/net.h>
162721c5b9SSjur Braendeland 
172721c5b9SSjur Braendeland /**
182721c5b9SSjur Braendeland  * struct caif_param - CAIF parameters.
192721c5b9SSjur Braendeland  * @size:	Length of data
202721c5b9SSjur Braendeland  * @data:	Binary Data Blob
212721c5b9SSjur Braendeland  */
222721c5b9SSjur Braendeland struct caif_param {
232721c5b9SSjur Braendeland 	u16  size;
242721c5b9SSjur Braendeland 	u8   data[256];
252721c5b9SSjur Braendeland };
262721c5b9SSjur Braendeland 
272721c5b9SSjur Braendeland /**
28e539d83cSSjur Braendeland  * struct caif_connect_request - Request data for CAIF channel setup.
29e539d83cSSjur Braendeland  * @protocol:		Type of CAIF protocol to use (at, datagram etc)
302721c5b9SSjur Braendeland  * @sockaddr:		Socket address to connect.
312721c5b9SSjur Braendeland  * @priority:		Priority of the connection.
322721c5b9SSjur Braendeland  * @link_selector:	Link selector (high bandwidth or low latency)
33f2527ec4SAndré Carvalho de Matos  * @ifindex:		kernel index of the interface.
34e539d83cSSjur Braendeland  * @param:		Connect Request parameters (CAIF_SO_REQ_PARAM).
352721c5b9SSjur Braendeland  *
362721c5b9SSjur Braendeland  * This struct is used when connecting a CAIF channel.
372721c5b9SSjur Braendeland  * It contains all CAIF channel configuration options.
382721c5b9SSjur Braendeland  */
392721c5b9SSjur Braendeland struct caif_connect_request {
40e539d83cSSjur Braendeland 	enum caif_protocol_type protocol;
412721c5b9SSjur Braendeland 	struct sockaddr_caif sockaddr;
422721c5b9SSjur Braendeland 	enum caif_channel_priority priority;
432721c5b9SSjur Braendeland 	enum caif_link_selector link_selector;
44f2527ec4SAndré Carvalho de Matos 	int ifindex;
452721c5b9SSjur Braendeland 	struct caif_param param;
462721c5b9SSjur Braendeland };
472721c5b9SSjur Braendeland 
482721c5b9SSjur Braendeland /**
492721c5b9SSjur Braendeland  * caif_connect_client - Connect a client to CAIF Core Stack.
502721c5b9SSjur Braendeland  * @config:		Channel setup parameters, specifying what address
512721c5b9SSjur Braendeland  *			to connect on the Modem.
522721c5b9SSjur Braendeland  * @client_layer:	User implementation of client layer. This layer
532721c5b9SSjur Braendeland  *			MUST have receive and control callback functions
542721c5b9SSjur Braendeland  *			implemented.
552aa40aefSSjur Braendeland  * @ifindex:		Link layer interface index used for this connection.
562aa40aefSSjur Braendeland  * @headroom:		Head room needed by CAIF protocol.
572aa40aefSSjur Braendeland  * @tailroom:		Tail room needed by CAIF protocol.
582721c5b9SSjur Braendeland  *
592721c5b9SSjur Braendeland  * This function connects a CAIF channel. The Client must implement
602721c5b9SSjur Braendeland  * the struct cflayer. This layer represents the Client layer and holds
612721c5b9SSjur Braendeland  * receive functions and control callback functions. Control callback
622721c5b9SSjur Braendeland  * function will receive information about connect/disconnect responses,
632721c5b9SSjur Braendeland  * flow control etc (see enum caif_control).
642721c5b9SSjur Braendeland  * E.g. CAIF Socket will call this function for each socket it connects
652721c5b9SSjur Braendeland  * and have one client_layer instance for each socket.
662721c5b9SSjur Braendeland  */
67bee925dbSsjur.brandeland@stericsson.com int caif_connect_client(struct net *net,
68bee925dbSsjur.brandeland@stericsson.com 			struct caif_connect_request *conn_req,
692aa40aefSSjur Braendeland 			struct cflayer *client_layer, int *ifindex,
702aa40aefSSjur Braendeland 			int *headroom, int *tailroom);
712721c5b9SSjur Braendeland 
722721c5b9SSjur Braendeland /**
732721c5b9SSjur Braendeland  * caif_disconnect_client - Disconnects a client from the CAIF stack.
742721c5b9SSjur Braendeland  *
75bee925dbSsjur.brandeland@stericsson.com  * @client_layer: Client layer to be disconnected.
762721c5b9SSjur Braendeland  */
77bee925dbSsjur.brandeland@stericsson.com int caif_disconnect_client(struct net *net, struct cflayer *client_layer);
78bee925dbSsjur.brandeland@stericsson.com 
792721c5b9SSjur Braendeland 
802721c5b9SSjur Braendeland /**
81b3ccfbe4Ssjur.brandeland@stericsson.com  * caif_client_register_refcnt - register ref-count functions provided by client.
82b3ccfbe4Ssjur.brandeland@stericsson.com  *
83b3ccfbe4Ssjur.brandeland@stericsson.com  * @adapt_layer: Client layer using CAIF Stack.
84b3ccfbe4Ssjur.brandeland@stericsson.com  * @hold:	Function provided by client layer increasing ref-count
85b3ccfbe4Ssjur.brandeland@stericsson.com  * @put:	Function provided by client layer decreasing ref-count
86b3ccfbe4Ssjur.brandeland@stericsson.com  *
87b3ccfbe4Ssjur.brandeland@stericsson.com  * Client of the CAIF Stack must register functions for reference counting.
88b3ccfbe4Ssjur.brandeland@stericsson.com  * These functions are called by the CAIF Stack for every upstream packet,
89b3ccfbe4Ssjur.brandeland@stericsson.com  * and must therefore be implemented efficiently.
90b3ccfbe4Ssjur.brandeland@stericsson.com  *
91b3ccfbe4Ssjur.brandeland@stericsson.com  * Client should call caif_free_client when reference count degrease to zero.
92b3ccfbe4Ssjur.brandeland@stericsson.com  */
93b3ccfbe4Ssjur.brandeland@stericsson.com 
94b3ccfbe4Ssjur.brandeland@stericsson.com void caif_client_register_refcnt(struct cflayer *adapt_layer,
95b3ccfbe4Ssjur.brandeland@stericsson.com 					void (*hold)(struct cflayer *lyr),
96b3ccfbe4Ssjur.brandeland@stericsson.com 					void (*put)(struct cflayer *lyr));
97b3ccfbe4Ssjur.brandeland@stericsson.com /**
98b3ccfbe4Ssjur.brandeland@stericsson.com  * caif_free_client - Free memory used to manage the client in the CAIF Stack.
99b3ccfbe4Ssjur.brandeland@stericsson.com  *
100b3ccfbe4Ssjur.brandeland@stericsson.com  * @client_layer: Client layer to be removed.
101b3ccfbe4Ssjur.brandeland@stericsson.com  *
102b3ccfbe4Ssjur.brandeland@stericsson.com  * This function must be called from client layer in order to free memory.
103b3ccfbe4Ssjur.brandeland@stericsson.com  * Caller must guarantee that no packets are in flight upstream when calling
104b3ccfbe4Ssjur.brandeland@stericsson.com  * this function.
105b3ccfbe4Ssjur.brandeland@stericsson.com  */
106b3ccfbe4Ssjur.brandeland@stericsson.com void caif_free_client(struct cflayer *adap_layer);
107b3ccfbe4Ssjur.brandeland@stericsson.com 
1087c18d220Ssjur.brandeland@stericsson.com /**
1097c18d220Ssjur.brandeland@stericsson.com  * struct caif_enroll_dev - Enroll a net-device as a CAIF Link layer
1107c18d220Ssjur.brandeland@stericsson.com  * @dev:		Network device to enroll.
1117c18d220Ssjur.brandeland@stericsson.com  * @caifdev:		Configuration information from CAIF Link Layer
1127c18d220Ssjur.brandeland@stericsson.com  * @link_support:	Link layer support layer
1137c18d220Ssjur.brandeland@stericsson.com  * @head_room:		Head room needed by link support layer
1147c18d220Ssjur.brandeland@stericsson.com  * @layer:		Lowest layer in CAIF stack
1157c18d220Ssjur.brandeland@stericsson.com  * @rcv_fun:		Receive function for CAIF stack.
1167c18d220Ssjur.brandeland@stericsson.com  *
1177c18d220Ssjur.brandeland@stericsson.com  * This function enroll a CAIF link layer into CAIF Stack and
1187c18d220Ssjur.brandeland@stericsson.com  * expects the interface to be able to handle CAIF payload.
1197c18d220Ssjur.brandeland@stericsson.com  * The link_support layer is used to add any Link Layer specific
1207c18d220Ssjur.brandeland@stericsson.com  * framing.
1217c18d220Ssjur.brandeland@stericsson.com  */
122*a2805dcaSPavel Skripkin int caif_enroll_dev(struct net_device *dev, struct caif_dev_common *caifdev,
1237c18d220Ssjur.brandeland@stericsson.com 			struct cflayer *link_support, int head_room,
1247c18d220Ssjur.brandeland@stericsson.com 			struct cflayer **layer, int (**rcv_func)(
1257c18d220Ssjur.brandeland@stericsson.com 				struct sk_buff *, struct net_device *,
1267c18d220Ssjur.brandeland@stericsson.com 				struct packet_type *, struct net_device *));
1277c18d220Ssjur.brandeland@stericsson.com 
1282721c5b9SSjur Braendeland #endif /* CAIF_DEV_H_ */
129