109009f30SSjur Braendeland /* 209009f30SSjur Braendeland * Copyright (C) ST-Ericsson AB 2010 309009f30SSjur Braendeland * Author: Sjur Brendeland/sjur.brandeland@stericsson.com 409009f30SSjur Braendeland * License terms: GNU General Public License (GPL) version 2 509009f30SSjur Braendeland */ 609009f30SSjur Braendeland 709009f30SSjur Braendeland #ifndef CFCNFG_H_ 809009f30SSjur Braendeland #define CFCNFG_H_ 909009f30SSjur Braendeland #include <linux/spinlock.h> 102aa40aefSSjur Braendeland #include <linux/netdevice.h> 1109009f30SSjur Braendeland #include <net/caif/caif_layer.h> 1209009f30SSjur Braendeland #include <net/caif/cfctrl.h> 1309009f30SSjur Braendeland 1409009f30SSjur Braendeland struct cfcnfg; 1509009f30SSjur Braendeland 1609009f30SSjur Braendeland /** 1709009f30SSjur Braendeland * enum cfcnfg_phy_type - Types of physical layers defined in CAIF Stack 1809009f30SSjur Braendeland * 1909009f30SSjur Braendeland * @CFPHYTYPE_FRAG: Fragmented frames physical interface. 2009009f30SSjur Braendeland * @CFPHYTYPE_CAIF: Generic CAIF physical interface 2109009f30SSjur Braendeland */ 2209009f30SSjur Braendeland enum cfcnfg_phy_type { 2309009f30SSjur Braendeland CFPHYTYPE_FRAG = 1, 2409009f30SSjur Braendeland CFPHYTYPE_CAIF, 2509009f30SSjur Braendeland CFPHYTYPE_MAX 2609009f30SSjur Braendeland }; 2709009f30SSjur Braendeland 2809009f30SSjur Braendeland /** 2909009f30SSjur Braendeland * enum cfcnfg_phy_preference - Physical preference HW Abstraction 3009009f30SSjur Braendeland * 3109009f30SSjur Braendeland * @CFPHYPREF_UNSPECIFIED: Default physical interface 3209009f30SSjur Braendeland * 3309009f30SSjur Braendeland * @CFPHYPREF_LOW_LAT: Default physical interface for low-latency 3409009f30SSjur Braendeland * traffic 3509009f30SSjur Braendeland * @CFPHYPREF_HIGH_BW: Default physical interface for high-bandwidth 3609009f30SSjur Braendeland * traffic 3709009f30SSjur Braendeland * @CFPHYPREF_LOOP: TEST only Loopback interface simulating modem 3809009f30SSjur Braendeland * responses. 3909009f30SSjur Braendeland * 4009009f30SSjur Braendeland */ 4109009f30SSjur Braendeland enum cfcnfg_phy_preference { 4209009f30SSjur Braendeland CFPHYPREF_UNSPECIFIED, 4309009f30SSjur Braendeland CFPHYPREF_LOW_LAT, 4409009f30SSjur Braendeland CFPHYPREF_HIGH_BW, 4509009f30SSjur Braendeland CFPHYPREF_LOOP 4609009f30SSjur Braendeland }; 4709009f30SSjur Braendeland 4809009f30SSjur Braendeland /** 4909009f30SSjur Braendeland * cfcnfg_create() - Create the CAIF configuration object. 5009009f30SSjur Braendeland */ 5109009f30SSjur Braendeland struct cfcnfg *cfcnfg_create(void); 5209009f30SSjur Braendeland 5309009f30SSjur Braendeland /** 5409009f30SSjur Braendeland * cfcnfg_remove() - Remove the CFCNFG object 5509009f30SSjur Braendeland * @cfg: config object 5609009f30SSjur Braendeland */ 5709009f30SSjur Braendeland void cfcnfg_remove(struct cfcnfg *cfg); 5809009f30SSjur Braendeland 5909009f30SSjur Braendeland /** 6009009f30SSjur Braendeland * cfcnfg_add_phy_layer() - Adds a physical layer to the CAIF stack. 6109009f30SSjur Braendeland * @cnfg: Pointer to a CAIF configuration object, created by 6209009f30SSjur Braendeland * cfcnfg_create(). 6309009f30SSjur Braendeland * @phy_type: Specifies the type of physical interface, e.g. 6409009f30SSjur Braendeland * CFPHYTYPE_FRAG. 6509009f30SSjur Braendeland * @dev: Pointer to link layer device 6609009f30SSjur Braendeland * @phy_layer: Specify the physical layer. The transmit function 6709009f30SSjur Braendeland * MUST be set in the structure. 6809009f30SSjur Braendeland * @phyid: The assigned physical ID for this layer, used in 6909009f30SSjur Braendeland * cfcnfg_add_adapt_layer to specify PHY for the link. 7009009f30SSjur Braendeland * @pref: The phy (link layer) preference. 7109009f30SSjur Braendeland * @fcs: Specify if checksum is used in CAIF Framing Layer. 7209009f30SSjur Braendeland * @stx: Specify if Start Of Frame eXtention is used. 7309009f30SSjur Braendeland */ 7409009f30SSjur Braendeland 7509009f30SSjur Braendeland void 7609009f30SSjur Braendeland cfcnfg_add_phy_layer(struct cfcnfg *cnfg, enum cfcnfg_phy_type phy_type, 772aa40aefSSjur Braendeland struct net_device *dev, struct cflayer *phy_layer, 782aa40aefSSjur Braendeland u16 *phyid, enum cfcnfg_phy_preference pref, 7909009f30SSjur Braendeland bool fcs, bool stx); 8009009f30SSjur Braendeland 8109009f30SSjur Braendeland /** 8209009f30SSjur Braendeland * cfcnfg_del_phy_layer - Deletes an phy layer from the CAIF stack. 8309009f30SSjur Braendeland * 8409009f30SSjur Braendeland * @cnfg: Pointer to a CAIF configuration object, created by 8509009f30SSjur Braendeland * cfcnfg_create(). 8609009f30SSjur Braendeland * @phy_layer: Adaptation layer to be removed. 8709009f30SSjur Braendeland */ 8809009f30SSjur Braendeland int cfcnfg_del_phy_layer(struct cfcnfg *cnfg, struct cflayer *phy_layer); 8909009f30SSjur Braendeland 9009009f30SSjur Braendeland /** 91e539d83cSSjur Braendeland * cfcnfg_disconn_adapt_layer - Disconnects an adaptation layer. 9209009f30SSjur Braendeland * 9309009f30SSjur Braendeland * @cnfg: Pointer to a CAIF configuration object, created by 9409009f30SSjur Braendeland * cfcnfg_create(). 9509009f30SSjur Braendeland * @adap_layer: Adaptation layer to be removed. 9609009f30SSjur Braendeland */ 97e539d83cSSjur Braendeland int cfcnfg_disconn_adapt_layer(struct cfcnfg *cnfg, 98e539d83cSSjur Braendeland struct cflayer *adap_layer); 9909009f30SSjur Braendeland 10009009f30SSjur Braendeland /** 1015b208656SSjur Braendeland * cfcnfg_release_adap_layer - Used by client to release the adaptation layer. 1025b208656SSjur Braendeland * 1035b208656SSjur Braendeland * @adap_layer: Adaptation layer. 1045b208656SSjur Braendeland */ 1055b208656SSjur Braendeland void cfcnfg_release_adap_layer(struct cflayer *adap_layer); 1065b208656SSjur Braendeland 1075b208656SSjur Braendeland /** 10809009f30SSjur Braendeland * cfcnfg_add_adaptation_layer - Add an adaptation layer to the CAIF stack. 10909009f30SSjur Braendeland * 11009009f30SSjur Braendeland * The adaptation Layer is where the interface to application or higher-level 11109009f30SSjur Braendeland * driver functionality is implemented. 11209009f30SSjur Braendeland * 11309009f30SSjur Braendeland * @cnfg: Pointer to a CAIF configuration object, created by 11409009f30SSjur Braendeland * cfcnfg_create(). 11509009f30SSjur Braendeland * @param: Link setup parameters. 11609009f30SSjur Braendeland * @adap_layer: Specify the adaptation layer; the receive and 11709009f30SSjur Braendeland * flow-control functions MUST be set in the structure. 1182aa40aefSSjur Braendeland * @ifindex: Link layer interface index used for this connection. 1192aa40aefSSjur Braendeland * @proto_head: Protocol head-space needed by CAIF protocol, 1202aa40aefSSjur Braendeland * excluding link layer. 1212aa40aefSSjur Braendeland * @proto_tail: Protocol tail-space needed by CAIF protocol, 1222aa40aefSSjur Braendeland * excluding link layer. 12309009f30SSjur Braendeland */ 124e539d83cSSjur Braendeland int cfcnfg_add_adaptation_layer(struct cfcnfg *cnfg, 12509009f30SSjur Braendeland struct cfctrl_link_param *param, 1262aa40aefSSjur Braendeland struct cflayer *adap_layer, 1272aa40aefSSjur Braendeland int *ifindex, 1282aa40aefSSjur Braendeland int *proto_head, 1292aa40aefSSjur Braendeland int *proto_tail); 13009009f30SSjur Braendeland 13109009f30SSjur Braendeland /** 13209009f30SSjur Braendeland * cfcnfg_get_phyid() - Get physical ID, given type. 13309009f30SSjur Braendeland * Returns one of the physical interfaces matching the given type. 13409009f30SSjur Braendeland * Zero if no match is found. 13509009f30SSjur Braendeland * @cnfg: Configuration object 13609009f30SSjur Braendeland * @phy_pref: Caif Link Layer preference 13709009f30SSjur Braendeland */ 13809009f30SSjur Braendeland struct dev_info *cfcnfg_get_phyid(struct cfcnfg *cnfg, 13909009f30SSjur Braendeland enum cfcnfg_phy_preference phy_pref); 14009009f30SSjur Braendeland 14109009f30SSjur Braendeland /** 14209009f30SSjur Braendeland * cfcnfg_get_named() - Get the Physical Identifier of CAIF Link Layer 14309009f30SSjur Braendeland * @cnfg: Configuration object 14409009f30SSjur Braendeland * @name: Name of the Physical Layer (Caif Link Layer) 14509009f30SSjur Braendeland */ 14609009f30SSjur Braendeland int cfcnfg_get_named(struct cfcnfg *cnfg, char *name); 14709009f30SSjur Braendeland 14809009f30SSjur Braendeland #endif /* CFCNFG_H_ */ 149