1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /*
3   * Copyright (C) ST-Ericsson AB 2010
4   * Author:	Sjur Brendeland
5   */
6  
7  #ifndef CFSRVL_H_
8  #define CFSRVL_H_
9  #include <linux/list.h>
10  #include <linux/stddef.h>
11  #include <linux/types.h>
12  #include <linux/kref.h>
13  #include <linux/rculist.h>
14  
15  struct cfsrvl {
16  	struct cflayer layer;
17  	bool open;
18  	bool phy_flow_on;
19  	bool modem_flow_on;
20  	bool supports_flowctrl;
21  	void (*release)(struct cflayer *layer);
22  	struct dev_info dev_info;
23  	void (*hold)(struct cflayer *lyr);
24  	void (*put)(struct cflayer *lyr);
25  	struct rcu_head rcu;
26  };
27  
28  struct cflayer *cfvei_create(u8 linkid, struct dev_info *dev_info);
29  struct cflayer *cfdgml_create(u8 linkid, struct dev_info *dev_info);
30  struct cflayer *cfutill_create(u8 linkid, struct dev_info *dev_info);
31  struct cflayer *cfvidl_create(u8 linkid, struct dev_info *dev_info);
32  struct cflayer *cfrfml_create(u8 linkid, struct dev_info *dev_info,
33  				int mtu_size);
34  struct cflayer *cfdbgl_create(u8 linkid, struct dev_info *dev_info);
35  
36  bool cfsrvl_phyid_match(struct cflayer *layer, int phyid);
37  
38  void cfsrvl_init(struct cfsrvl *service,
39  			u8 channel_id,
40  			struct dev_info *dev_info,
41  			bool supports_flowctrl);
42  bool cfsrvl_ready(struct cfsrvl *service, int *err);
43  u8 cfsrvl_getphyid(struct cflayer *layer);
44  
cfsrvl_get(struct cflayer * layr)45  static inline void cfsrvl_get(struct cflayer *layr)
46  {
47  	struct cfsrvl *s = container_of(layr, struct cfsrvl, layer);
48  	if (layr == NULL || layr->up == NULL || s->hold == NULL)
49  		return;
50  
51  	s->hold(layr->up);
52  }
53  
cfsrvl_put(struct cflayer * layr)54  static inline void cfsrvl_put(struct cflayer *layr)
55  {
56  	struct cfsrvl *s = container_of(layr, struct cfsrvl, layer);
57  	if (layr == NULL || layr->up == NULL || s->hold == NULL)
58  		return;
59  
60  	s->put(layr->up);
61  }
62  #endif				/* CFSRVL_H_ */
63