1 /*
2  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: qdf_net_if
22  * QCA driver framework (QDF) network interface management APIs
23  */
24 
25 #if !defined(__I_QDF_NET_IF_H)
26 #define __I_QDF_NET_IF_H
27 
28 /* Include Files */
29 #include <qdf_types.h>
30 #include <qdf_util.h>
31 #include <linux/netdevice.h>
32 
33 struct qdf_net_if;
34 
35 /**
36  * __qdf_net_if_create_dummy_if() - create dummy interface
37  * @nif: interface handle
38  *
39  * This function will create a dummy network interface
40  *
41  * Return: QDF_STATUS_SUCCESS on success
42  */
43 static inline QDF_STATUS
__qdf_net_if_create_dummy_if(struct qdf_net_if * nif)44 __qdf_net_if_create_dummy_if(struct qdf_net_if *nif)
45 {
46 	int ret;
47 
48 	ret = init_dummy_netdev((struct net_device *)nif);
49 
50 	return qdf_status_from_os_return(ret);
51 }
52 
53 /**
54  * __qdf_net_if_get_dev_by_name() - Find a network device by its name
55  * @nif_name: network device name
56  *
57  * This function retrieves the network device by its name
58  *
59  * Return: qdf network device
60  */
61 static inline struct qdf_net_if *
__qdf_net_if_get_dev_by_name(char * nif_name)62 __qdf_net_if_get_dev_by_name(char *nif_name)
63 {
64 	if (!nif_name)
65 		return NULL;
66 
67 	return ((struct qdf_net_if *)dev_get_by_name(&init_net, nif_name));
68 }
69 
70 /**
71  * __qdf_net_if_release_dev() - Release reference to network device
72  * @nif: network device
73  *
74  * This function releases reference to the network device
75  *
76  * Return: QDF_STATUS_SUCCESS on success
77  */
78 static inline QDF_STATUS
__qdf_net_if_release_dev(struct qdf_net_if * nif)79 __qdf_net_if_release_dev(struct qdf_net_if  *nif)
80 {
81 	if (!nif)
82 		return QDF_STATUS_E_INVAL;
83 
84 	dev_put((struct net_device *)nif);
85 
86 	return QDF_STATUS_SUCCESS;
87 }
88 
89 /**
90  * __qdf_net_if_hold_dev() - hold reference to network device
91  * @nif: network device
92  *
93  * This function holds reference to the network device
94  *
95  * Return: QDF_STATUS_SUCCESS on success
96  */
97 static inline QDF_STATUS
__qdf_net_if_hold_dev(struct qdf_net_if * nif)98 __qdf_net_if_hold_dev(struct qdf_net_if  *nif)
99 {
100 	if (!nif)
101 		return QDF_STATUS_E_INVAL;
102 
103 	dev_hold((struct net_device *)nif);
104 
105 	return QDF_STATUS_SUCCESS;
106 }
107 
108 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0))
109 /**
110  * __qdf_net_update_net_device_dev_addr() - update net_device dev_addr
111  * @ndev: net_device
112  * @src_addr: source mac address
113  * @len: length
114  *
115  * kernel version 5.17 onwards made net_device->dev_addr as const unsigned char*
116  * so to update dev_addr, this function calls kernel api dev_addr_mod.
117  *
118  * Return: void
119  */
120 static inline void
__qdf_net_update_net_device_dev_addr(struct net_device * ndev,const void * src_addr,size_t len)121 __qdf_net_update_net_device_dev_addr(struct net_device *ndev,
122 				     const void *src_addr,
123 				     size_t len)
124 {
125 	dev_addr_mod(ndev, 0, src_addr, len);
126 }
127 #else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)) */
128 /**
129  * __qdf_net_update_net_device_dev_addr() - update net_device dev_addr
130  * @ndev: net_device
131  * @src_addr: source mac address
132  * @len: length
133  *
134  * This function updates dev_addr in net_device using mem copy.
135  *
136  * Return: void
137  */
138 static inline void
__qdf_net_update_net_device_dev_addr(struct net_device * ndev,const void * src_addr,size_t len)139 __qdf_net_update_net_device_dev_addr(struct net_device *ndev,
140 				     const void *src_addr,
141 				     size_t len)
142 {
143 	memcpy(ndev->dev_addr, src_addr, len);
144 }
145 #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)) */
146 
147 /**
148  * __qdf_napi_enable() - Enable the napi schedule
149  * @napi: NAPI context
150  *
151  * This function resume NAPI from being scheduled on this context
152  *
153  * Return: NONE
154  */
155 static inline void
__qdf_napi_enable(struct napi_struct * napi)156 __qdf_napi_enable(struct napi_struct *napi)
157 {
158 	napi_enable(napi);
159 }
160 
161 /**
162  * __qdf_napi_disable() - Disable the napi schedule
163  * @napi: NAPI context
164  *
165  * This function suspends NAPI from being scheduled on this context
166  *
167  * Return: NONE
168  */
169 static inline void
__qdf_napi_disable(struct napi_struct * napi)170 __qdf_napi_disable(struct napi_struct *napi)
171 {
172 	napi_disable(napi);
173 }
174 
175 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0))
176 /**
177  * __qdf_netif_napi_add - initialize a NAPI context
178  * @netdev:  network device
179  * @napi: NAPI context
180  * @poll: polling function
181  * @weight: default weight
182  *
183  * Upstream commit b48b89f9c189 ("net: drop the weight argument from
184  * netif_napi_add") was introduced in Linux 6.1.  As described by the
185  * subject, this removes the weight argument from netif_napi_add().
186  *
187  * This was preceded by commit 58caed3dacb4 ("netdev: reshuffle
188  * netif_napi_add() APIs to allow dropping weight") in Linux 5.19
189  * which added new APIs to call when a non-default weight wishes to be
190  * sent.
191  *
192  * Return: NONE
193  */
194 static inline void
__qdf_netif_napi_add(struct net_device * netdev,struct napi_struct * napi,int (* poll)(struct napi_struct *,int),int weight)195 __qdf_netif_napi_add(struct net_device *netdev, struct napi_struct *napi,
196 		     int (*poll)(struct napi_struct *, int), int weight)
197 {
198 	netif_napi_add_weight(netdev, napi, poll, weight);
199 }
200 #else
201 static inline void
__qdf_netif_napi_add(struct net_device * netdev,struct napi_struct * napi,int (* poll)(struct napi_struct *,int),int weight)202 __qdf_netif_napi_add(struct net_device *netdev, struct napi_struct *napi,
203 		     int (*poll)(struct napi_struct *, int), int weight)
204 {
205 	netif_napi_add(netdev, napi, poll, weight);
206 }
207 #endif
208 
209 /**
210  * __qdf_netif_napi_del: remove a NAPI context
211  * @napi: NAPI context
212  *
213  * Return: NONE
214  */
215 static inline void
__qdf_netif_napi_del(struct napi_struct * napi)216 __qdf_netif_napi_del(struct napi_struct *napi)
217 {
218 	netif_napi_del(napi);
219 }
220 
221 #endif /*__I_QDF_NET_IF_H */
222