Merge tag 'fs.move_mount.move_mount_set_group.v5.15' of git://git.kernel.org/pub...
[linux-2.6-microblaze.git] / include / linux / wwan.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Copyright (c) 2021, Linaro Ltd <loic.poulain@linaro.org> */
3
4 #ifndef __WWAN_H
5 #define __WWAN_H
6
7 #include <linux/device.h>
8 #include <linux/kernel.h>
9 #include <linux/poll.h>
10 #include <linux/skbuff.h>
11 #include <linux/netlink.h>
12 #include <linux/netdevice.h>
13
14 /**
15  * enum wwan_port_type - WWAN port types
16  * @WWAN_PORT_AT: AT commands
17  * @WWAN_PORT_MBIM: Mobile Broadband Interface Model control
18  * @WWAN_PORT_QMI: Qcom modem/MSM interface for modem control
19  * @WWAN_PORT_QCDM: Qcom Modem diagnostic interface
20  * @WWAN_PORT_FIREHOSE: XML based command protocol
21  *
22  * @WWAN_PORT_MAX: Highest supported port types
23  * @WWAN_PORT_UNKNOWN: Special value to indicate an unknown port type
24  * @__WWAN_PORT_MAX: Internal use
25  */
26 enum wwan_port_type {
27         WWAN_PORT_AT,
28         WWAN_PORT_MBIM,
29         WWAN_PORT_QMI,
30         WWAN_PORT_QCDM,
31         WWAN_PORT_FIREHOSE,
32
33         /* Add new port types above this line */
34
35         __WWAN_PORT_MAX,
36         WWAN_PORT_MAX = __WWAN_PORT_MAX - 1,
37         WWAN_PORT_UNKNOWN,
38 };
39
40 struct wwan_port;
41
42 /** struct wwan_port_ops - The WWAN port operations
43  * @start: The routine for starting the WWAN port device.
44  * @stop: The routine for stopping the WWAN port device.
45  * @tx: Non-blocking routine that sends WWAN port protocol data to the device.
46  * @tx_blocking: Optional blocking routine that sends WWAN port protocol data
47  *               to the device.
48  * @tx_poll: Optional routine that sets additional TX poll flags.
49  *
50  * The wwan_port_ops structure contains a list of low-level operations
51  * that control a WWAN port device. All functions are mandatory unless specified.
52  */
53 struct wwan_port_ops {
54         int (*start)(struct wwan_port *port);
55         void (*stop)(struct wwan_port *port);
56         int (*tx)(struct wwan_port *port, struct sk_buff *skb);
57
58         /* Optional operations */
59         int (*tx_blocking)(struct wwan_port *port, struct sk_buff *skb);
60         __poll_t (*tx_poll)(struct wwan_port *port, struct file *filp,
61                             poll_table *wait);
62 };
63
64 /**
65  * wwan_create_port - Add a new WWAN port
66  * @parent: Device to use as parent and shared by all WWAN ports
67  * @type: WWAN port type
68  * @ops: WWAN port operations
69  * @drvdata: Pointer to caller driver data
70  *
71  * Allocate and register a new WWAN port. The port will be automatically exposed
72  * to user as a character device and attached to the right virtual WWAN device,
73  * based on the parent pointer. The parent pointer is the device shared by all
74  * components of a same WWAN modem (e.g. USB dev, PCI dev, MHI controller...).
75  *
76  * drvdata will be placed in the WWAN port device driver data and can be
77  * retrieved with wwan_port_get_drvdata().
78  *
79  * This function must be balanced with a call to wwan_remove_port().
80  *
81  * Returns a valid pointer to wwan_port on success or PTR_ERR on failure
82  */
83 struct wwan_port *wwan_create_port(struct device *parent,
84                                    enum wwan_port_type type,
85                                    const struct wwan_port_ops *ops,
86                                    void *drvdata);
87
88 /**
89  * wwan_remove_port - Remove a WWAN port
90  * @port: WWAN port to remove
91  *
92  * Remove a previously created port.
93  */
94 void wwan_remove_port(struct wwan_port *port);
95
96 /**
97  * wwan_port_rx - Receive data from the WWAN port
98  * @port: WWAN port for which data is received
99  * @skb: Pointer to the rx buffer
100  *
101  * A port driver calls this function upon data reception (MBIM, AT...).
102  */
103 void wwan_port_rx(struct wwan_port *port, struct sk_buff *skb);
104
105 /**
106  * wwan_port_txoff - Stop TX on WWAN port
107  * @port: WWAN port for which TX must be stopped
108  *
109  * Used for TX flow control, a port driver calls this function to indicate TX
110  * is temporary unavailable (e.g. due to ring buffer fullness).
111  */
112 void wwan_port_txoff(struct wwan_port *port);
113
114
115 /**
116  * wwan_port_txon - Restart TX on WWAN port
117  * @port: WWAN port for which TX must be restarted
118  *
119  * Used for TX flow control, a port driver calls this function to indicate TX
120  * is available again.
121  */
122 void wwan_port_txon(struct wwan_port *port);
123
124 /**
125  * wwan_port_get_drvdata - Retrieve driver data from a WWAN port
126  * @port: Related WWAN port
127  */
128 void *wwan_port_get_drvdata(struct wwan_port *port);
129
130 /**
131  * struct wwan_netdev_priv - WWAN core network device private data
132  * @link_id: WWAN device data link id
133  * @drv_priv: driver private data area, size is determined in &wwan_ops
134  */
135 struct wwan_netdev_priv {
136         u32 link_id;
137
138         /* must be last */
139         u8 drv_priv[] __aligned(sizeof(void *));
140 };
141
142 static inline void *wwan_netdev_drvpriv(struct net_device *dev)
143 {
144         return ((struct wwan_netdev_priv *)netdev_priv(dev))->drv_priv;
145 }
146
147 /*
148  * Used to indicate that the WWAN core should not create a default network
149  * link.
150  */
151 #define WWAN_NO_DEFAULT_LINK            U32_MAX
152
153 /**
154  * struct wwan_ops - WWAN device ops
155  * @priv_size: size of private netdev data area
156  * @setup: set up a new netdev
157  * @newlink: register the new netdev
158  * @dellink: remove the given netdev
159  */
160 struct wwan_ops {
161         unsigned int priv_size;
162         void (*setup)(struct net_device *dev);
163         int (*newlink)(void *ctxt, struct net_device *dev,
164                        u32 if_id, struct netlink_ext_ack *extack);
165         void (*dellink)(void *ctxt, struct net_device *dev,
166                         struct list_head *head);
167 };
168
169 int wwan_register_ops(struct device *parent, const struct wwan_ops *ops,
170                       void *ctxt, u32 def_link_id);
171
172 void wwan_unregister_ops(struct device *parent);
173
174 #endif /* __WWAN_H */