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