1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (C) 2007, 2008, 2009 Siemens AG
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Written by:
6*4882a593Smuzhiyun * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #ifndef __NET_CFG802154_H
10*4882a593Smuzhiyun #define __NET_CFG802154_H
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <linux/ieee802154.h>
13*4882a593Smuzhiyun #include <linux/netdevice.h>
14*4882a593Smuzhiyun #include <linux/mutex.h>
15*4882a593Smuzhiyun #include <linux/bug.h>
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #include <net/nl802154.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun struct wpan_phy;
20*4882a593Smuzhiyun struct wpan_phy_cca;
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
23*4882a593Smuzhiyun struct ieee802154_llsec_device_key;
24*4882a593Smuzhiyun struct ieee802154_llsec_seclevel;
25*4882a593Smuzhiyun struct ieee802154_llsec_params;
26*4882a593Smuzhiyun struct ieee802154_llsec_device;
27*4882a593Smuzhiyun struct ieee802154_llsec_table;
28*4882a593Smuzhiyun struct ieee802154_llsec_key_id;
29*4882a593Smuzhiyun struct ieee802154_llsec_key;
30*4882a593Smuzhiyun #endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun struct cfg802154_ops {
33*4882a593Smuzhiyun struct net_device * (*add_virtual_intf_deprecated)(struct wpan_phy *wpan_phy,
34*4882a593Smuzhiyun const char *name,
35*4882a593Smuzhiyun unsigned char name_assign_type,
36*4882a593Smuzhiyun int type);
37*4882a593Smuzhiyun void (*del_virtual_intf_deprecated)(struct wpan_phy *wpan_phy,
38*4882a593Smuzhiyun struct net_device *dev);
39*4882a593Smuzhiyun int (*suspend)(struct wpan_phy *wpan_phy);
40*4882a593Smuzhiyun int (*resume)(struct wpan_phy *wpan_phy);
41*4882a593Smuzhiyun int (*add_virtual_intf)(struct wpan_phy *wpan_phy,
42*4882a593Smuzhiyun const char *name,
43*4882a593Smuzhiyun unsigned char name_assign_type,
44*4882a593Smuzhiyun enum nl802154_iftype type,
45*4882a593Smuzhiyun __le64 extended_addr);
46*4882a593Smuzhiyun int (*del_virtual_intf)(struct wpan_phy *wpan_phy,
47*4882a593Smuzhiyun struct wpan_dev *wpan_dev);
48*4882a593Smuzhiyun int (*set_channel)(struct wpan_phy *wpan_phy, u8 page, u8 channel);
49*4882a593Smuzhiyun int (*set_cca_mode)(struct wpan_phy *wpan_phy,
50*4882a593Smuzhiyun const struct wpan_phy_cca *cca);
51*4882a593Smuzhiyun int (*set_cca_ed_level)(struct wpan_phy *wpan_phy, s32 ed_level);
52*4882a593Smuzhiyun int (*set_tx_power)(struct wpan_phy *wpan_phy, s32 power);
53*4882a593Smuzhiyun int (*set_pan_id)(struct wpan_phy *wpan_phy,
54*4882a593Smuzhiyun struct wpan_dev *wpan_dev, __le16 pan_id);
55*4882a593Smuzhiyun int (*set_short_addr)(struct wpan_phy *wpan_phy,
56*4882a593Smuzhiyun struct wpan_dev *wpan_dev, __le16 short_addr);
57*4882a593Smuzhiyun int (*set_backoff_exponent)(struct wpan_phy *wpan_phy,
58*4882a593Smuzhiyun struct wpan_dev *wpan_dev, u8 min_be,
59*4882a593Smuzhiyun u8 max_be);
60*4882a593Smuzhiyun int (*set_max_csma_backoffs)(struct wpan_phy *wpan_phy,
61*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
62*4882a593Smuzhiyun u8 max_csma_backoffs);
63*4882a593Smuzhiyun int (*set_max_frame_retries)(struct wpan_phy *wpan_phy,
64*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
65*4882a593Smuzhiyun s8 max_frame_retries);
66*4882a593Smuzhiyun int (*set_lbt_mode)(struct wpan_phy *wpan_phy,
67*4882a593Smuzhiyun struct wpan_dev *wpan_dev, bool mode);
68*4882a593Smuzhiyun int (*set_ackreq_default)(struct wpan_phy *wpan_phy,
69*4882a593Smuzhiyun struct wpan_dev *wpan_dev, bool ackreq);
70*4882a593Smuzhiyun #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
71*4882a593Smuzhiyun void (*get_llsec_table)(struct wpan_phy *wpan_phy,
72*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
73*4882a593Smuzhiyun struct ieee802154_llsec_table **table);
74*4882a593Smuzhiyun void (*lock_llsec_table)(struct wpan_phy *wpan_phy,
75*4882a593Smuzhiyun struct wpan_dev *wpan_dev);
76*4882a593Smuzhiyun void (*unlock_llsec_table)(struct wpan_phy *wpan_phy,
77*4882a593Smuzhiyun struct wpan_dev *wpan_dev);
78*4882a593Smuzhiyun /* TODO remove locking/get table callbacks, this is part of the
79*4882a593Smuzhiyun * nl802154 interface and should be accessible from ieee802154 layer.
80*4882a593Smuzhiyun */
81*4882a593Smuzhiyun int (*get_llsec_params)(struct wpan_phy *wpan_phy,
82*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
83*4882a593Smuzhiyun struct ieee802154_llsec_params *params);
84*4882a593Smuzhiyun int (*set_llsec_params)(struct wpan_phy *wpan_phy,
85*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
86*4882a593Smuzhiyun const struct ieee802154_llsec_params *params,
87*4882a593Smuzhiyun int changed);
88*4882a593Smuzhiyun int (*add_llsec_key)(struct wpan_phy *wpan_phy,
89*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
90*4882a593Smuzhiyun const struct ieee802154_llsec_key_id *id,
91*4882a593Smuzhiyun const struct ieee802154_llsec_key *key);
92*4882a593Smuzhiyun int (*del_llsec_key)(struct wpan_phy *wpan_phy,
93*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
94*4882a593Smuzhiyun const struct ieee802154_llsec_key_id *id);
95*4882a593Smuzhiyun int (*add_seclevel)(struct wpan_phy *wpan_phy,
96*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
97*4882a593Smuzhiyun const struct ieee802154_llsec_seclevel *sl);
98*4882a593Smuzhiyun int (*del_seclevel)(struct wpan_phy *wpan_phy,
99*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
100*4882a593Smuzhiyun const struct ieee802154_llsec_seclevel *sl);
101*4882a593Smuzhiyun int (*add_device)(struct wpan_phy *wpan_phy,
102*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
103*4882a593Smuzhiyun const struct ieee802154_llsec_device *dev);
104*4882a593Smuzhiyun int (*del_device)(struct wpan_phy *wpan_phy,
105*4882a593Smuzhiyun struct wpan_dev *wpan_dev, __le64 extended_addr);
106*4882a593Smuzhiyun int (*add_devkey)(struct wpan_phy *wpan_phy,
107*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
108*4882a593Smuzhiyun __le64 extended_addr,
109*4882a593Smuzhiyun const struct ieee802154_llsec_device_key *key);
110*4882a593Smuzhiyun int (*del_devkey)(struct wpan_phy *wpan_phy,
111*4882a593Smuzhiyun struct wpan_dev *wpan_dev,
112*4882a593Smuzhiyun __le64 extended_addr,
113*4882a593Smuzhiyun const struct ieee802154_llsec_device_key *key);
114*4882a593Smuzhiyun #endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun static inline bool
wpan_phy_supported_bool(bool b,enum nl802154_supported_bool_states st)118*4882a593Smuzhiyun wpan_phy_supported_bool(bool b, enum nl802154_supported_bool_states st)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun switch (st) {
121*4882a593Smuzhiyun case NL802154_SUPPORTED_BOOL_TRUE:
122*4882a593Smuzhiyun return b;
123*4882a593Smuzhiyun case NL802154_SUPPORTED_BOOL_FALSE:
124*4882a593Smuzhiyun return !b;
125*4882a593Smuzhiyun case NL802154_SUPPORTED_BOOL_BOTH:
126*4882a593Smuzhiyun return true;
127*4882a593Smuzhiyun default:
128*4882a593Smuzhiyun WARN_ON(1);
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun return false;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun struct wpan_phy_supported {
135*4882a593Smuzhiyun u32 channels[IEEE802154_MAX_PAGE + 1],
136*4882a593Smuzhiyun cca_modes, cca_opts, iftypes;
137*4882a593Smuzhiyun enum nl802154_supported_bool_states lbt;
138*4882a593Smuzhiyun u8 min_minbe, max_minbe, min_maxbe, max_maxbe,
139*4882a593Smuzhiyun min_csma_backoffs, max_csma_backoffs;
140*4882a593Smuzhiyun s8 min_frame_retries, max_frame_retries;
141*4882a593Smuzhiyun size_t tx_powers_size, cca_ed_levels_size;
142*4882a593Smuzhiyun const s32 *tx_powers, *cca_ed_levels;
143*4882a593Smuzhiyun };
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun struct wpan_phy_cca {
146*4882a593Smuzhiyun enum nl802154_cca_modes mode;
147*4882a593Smuzhiyun enum nl802154_cca_opts opt;
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun static inline bool
wpan_phy_cca_cmp(const struct wpan_phy_cca * a,const struct wpan_phy_cca * b)151*4882a593Smuzhiyun wpan_phy_cca_cmp(const struct wpan_phy_cca *a, const struct wpan_phy_cca *b)
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun if (a->mode != b->mode)
154*4882a593Smuzhiyun return false;
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun if (a->mode == NL802154_CCA_ENERGY_CARRIER)
157*4882a593Smuzhiyun return a->opt == b->opt;
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun return true;
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun /**
163*4882a593Smuzhiyun * @WPAN_PHY_FLAG_TRANSMIT_POWER: Indicates that transceiver will support
164*4882a593Smuzhiyun * transmit power setting.
165*4882a593Smuzhiyun * @WPAN_PHY_FLAG_CCA_ED_LEVEL: Indicates that transceiver will support cca ed
166*4882a593Smuzhiyun * level setting.
167*4882a593Smuzhiyun * @WPAN_PHY_FLAG_CCA_MODE: Indicates that transceiver will support cca mode
168*4882a593Smuzhiyun * setting.
169*4882a593Smuzhiyun */
170*4882a593Smuzhiyun enum wpan_phy_flags {
171*4882a593Smuzhiyun WPAN_PHY_FLAG_TXPOWER = BIT(1),
172*4882a593Smuzhiyun WPAN_PHY_FLAG_CCA_ED_LEVEL = BIT(2),
173*4882a593Smuzhiyun WPAN_PHY_FLAG_CCA_MODE = BIT(3),
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun struct wpan_phy {
177*4882a593Smuzhiyun /* If multiple wpan_phys are registered and you're handed e.g.
178*4882a593Smuzhiyun * a regular netdev with assigned ieee802154_ptr, you won't
179*4882a593Smuzhiyun * know whether it points to a wpan_phy your driver has registered
180*4882a593Smuzhiyun * or not. Assign this to something global to your driver to
181*4882a593Smuzhiyun * help determine whether you own this wpan_phy or not.
182*4882a593Smuzhiyun */
183*4882a593Smuzhiyun const void *privid;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun u32 flags;
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun /*
188*4882a593Smuzhiyun * This is a PIB according to 802.15.4-2011.
189*4882a593Smuzhiyun * We do not provide timing-related variables, as they
190*4882a593Smuzhiyun * aren't used outside of driver
191*4882a593Smuzhiyun */
192*4882a593Smuzhiyun u8 current_channel;
193*4882a593Smuzhiyun u8 current_page;
194*4882a593Smuzhiyun struct wpan_phy_supported supported;
195*4882a593Smuzhiyun /* current transmit_power in mBm */
196*4882a593Smuzhiyun s32 transmit_power;
197*4882a593Smuzhiyun struct wpan_phy_cca cca;
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun __le64 perm_extended_addr;
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun /* current cca ed threshold in mBm */
202*4882a593Smuzhiyun s32 cca_ed_level;
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun /* PHY depended MAC PIB values */
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun /* 802.15.4 acronym: Tdsym in usec */
207*4882a593Smuzhiyun u8 symbol_duration;
208*4882a593Smuzhiyun /* lifs and sifs periods timing */
209*4882a593Smuzhiyun u16 lifs_period;
210*4882a593Smuzhiyun u16 sifs_period;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun struct device dev;
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun /* the network namespace this phy lives in currently */
215*4882a593Smuzhiyun possible_net_t _net;
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun char priv[] __aligned(NETDEV_ALIGN);
218*4882a593Smuzhiyun };
219*4882a593Smuzhiyun
wpan_phy_net(struct wpan_phy * wpan_phy)220*4882a593Smuzhiyun static inline struct net *wpan_phy_net(struct wpan_phy *wpan_phy)
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun return read_pnet(&wpan_phy->_net);
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
wpan_phy_net_set(struct wpan_phy * wpan_phy,struct net * net)225*4882a593Smuzhiyun static inline void wpan_phy_net_set(struct wpan_phy *wpan_phy, struct net *net)
226*4882a593Smuzhiyun {
227*4882a593Smuzhiyun write_pnet(&wpan_phy->_net, net);
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun struct ieee802154_addr {
231*4882a593Smuzhiyun u8 mode;
232*4882a593Smuzhiyun __le16 pan_id;
233*4882a593Smuzhiyun union {
234*4882a593Smuzhiyun __le16 short_addr;
235*4882a593Smuzhiyun __le64 extended_addr;
236*4882a593Smuzhiyun };
237*4882a593Smuzhiyun };
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun struct ieee802154_llsec_key_id {
240*4882a593Smuzhiyun u8 mode;
241*4882a593Smuzhiyun u8 id;
242*4882a593Smuzhiyun union {
243*4882a593Smuzhiyun struct ieee802154_addr device_addr;
244*4882a593Smuzhiyun __le32 short_source;
245*4882a593Smuzhiyun __le64 extended_source;
246*4882a593Smuzhiyun };
247*4882a593Smuzhiyun };
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun #define IEEE802154_LLSEC_KEY_SIZE 16
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun struct ieee802154_llsec_key {
252*4882a593Smuzhiyun u8 frame_types;
253*4882a593Smuzhiyun u32 cmd_frame_ids;
254*4882a593Smuzhiyun /* TODO replace with NL802154_KEY_SIZE */
255*4882a593Smuzhiyun u8 key[IEEE802154_LLSEC_KEY_SIZE];
256*4882a593Smuzhiyun };
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun struct ieee802154_llsec_key_entry {
259*4882a593Smuzhiyun struct list_head list;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun struct ieee802154_llsec_key_id id;
262*4882a593Smuzhiyun struct ieee802154_llsec_key *key;
263*4882a593Smuzhiyun };
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun struct ieee802154_llsec_params {
266*4882a593Smuzhiyun bool enabled;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun __be32 frame_counter;
269*4882a593Smuzhiyun u8 out_level;
270*4882a593Smuzhiyun struct ieee802154_llsec_key_id out_key;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun __le64 default_key_source;
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun __le16 pan_id;
275*4882a593Smuzhiyun __le64 hwaddr;
276*4882a593Smuzhiyun __le64 coord_hwaddr;
277*4882a593Smuzhiyun __le16 coord_shortaddr;
278*4882a593Smuzhiyun };
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun struct ieee802154_llsec_table {
281*4882a593Smuzhiyun struct list_head keys;
282*4882a593Smuzhiyun struct list_head devices;
283*4882a593Smuzhiyun struct list_head security_levels;
284*4882a593Smuzhiyun };
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun struct ieee802154_llsec_seclevel {
287*4882a593Smuzhiyun struct list_head list;
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun u8 frame_type;
290*4882a593Smuzhiyun u8 cmd_frame_id;
291*4882a593Smuzhiyun bool device_override;
292*4882a593Smuzhiyun u32 sec_levels;
293*4882a593Smuzhiyun };
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun struct ieee802154_llsec_device {
296*4882a593Smuzhiyun struct list_head list;
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun __le16 pan_id;
299*4882a593Smuzhiyun __le16 short_addr;
300*4882a593Smuzhiyun __le64 hwaddr;
301*4882a593Smuzhiyun u32 frame_counter;
302*4882a593Smuzhiyun bool seclevel_exempt;
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun u8 key_mode;
305*4882a593Smuzhiyun struct list_head keys;
306*4882a593Smuzhiyun };
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun struct ieee802154_llsec_device_key {
309*4882a593Smuzhiyun struct list_head list;
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun struct ieee802154_llsec_key_id key_id;
312*4882a593Smuzhiyun u32 frame_counter;
313*4882a593Smuzhiyun };
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun struct wpan_dev_header_ops {
316*4882a593Smuzhiyun /* TODO create callback currently assumes ieee802154_mac_cb inside
317*4882a593Smuzhiyun * skb->cb. This should be changed to give these information as
318*4882a593Smuzhiyun * parameter.
319*4882a593Smuzhiyun */
320*4882a593Smuzhiyun int (*create)(struct sk_buff *skb, struct net_device *dev,
321*4882a593Smuzhiyun const struct ieee802154_addr *daddr,
322*4882a593Smuzhiyun const struct ieee802154_addr *saddr,
323*4882a593Smuzhiyun unsigned int len);
324*4882a593Smuzhiyun };
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun struct wpan_dev {
327*4882a593Smuzhiyun struct wpan_phy *wpan_phy;
328*4882a593Smuzhiyun int iftype;
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun /* the remainder of this struct should be private to cfg802154 */
331*4882a593Smuzhiyun struct list_head list;
332*4882a593Smuzhiyun struct net_device *netdev;
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun const struct wpan_dev_header_ops *header_ops;
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun /* lowpan interface, set when the wpan_dev belongs to one lowpan_dev */
337*4882a593Smuzhiyun struct net_device *lowpan_dev;
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun u32 identifier;
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun /* MAC PIB */
342*4882a593Smuzhiyun __le16 pan_id;
343*4882a593Smuzhiyun __le16 short_addr;
344*4882a593Smuzhiyun __le64 extended_addr;
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun /* MAC BSN field */
347*4882a593Smuzhiyun atomic_t bsn;
348*4882a593Smuzhiyun /* MAC DSN field */
349*4882a593Smuzhiyun atomic_t dsn;
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun u8 min_be;
352*4882a593Smuzhiyun u8 max_be;
353*4882a593Smuzhiyun u8 csma_retries;
354*4882a593Smuzhiyun s8 frame_retries;
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun bool lbt;
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun bool promiscuous_mode;
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun /* fallback for acknowledgment bit setting */
361*4882a593Smuzhiyun bool ackreq;
362*4882a593Smuzhiyun };
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun #define to_phy(_dev) container_of(_dev, struct wpan_phy, dev)
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun static inline int
wpan_dev_hard_header(struct sk_buff * skb,struct net_device * dev,const struct ieee802154_addr * daddr,const struct ieee802154_addr * saddr,unsigned int len)367*4882a593Smuzhiyun wpan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
368*4882a593Smuzhiyun const struct ieee802154_addr *daddr,
369*4882a593Smuzhiyun const struct ieee802154_addr *saddr,
370*4882a593Smuzhiyun unsigned int len)
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun struct wpan_dev *wpan_dev = dev->ieee802154_ptr;
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun return wpan_dev->header_ops->create(skb, dev, daddr, saddr, len);
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun struct wpan_phy *
378*4882a593Smuzhiyun wpan_phy_new(const struct cfg802154_ops *ops, size_t priv_size);
wpan_phy_set_dev(struct wpan_phy * phy,struct device * dev)379*4882a593Smuzhiyun static inline void wpan_phy_set_dev(struct wpan_phy *phy, struct device *dev)
380*4882a593Smuzhiyun {
381*4882a593Smuzhiyun phy->dev.parent = dev;
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun int wpan_phy_register(struct wpan_phy *phy);
385*4882a593Smuzhiyun void wpan_phy_unregister(struct wpan_phy *phy);
386*4882a593Smuzhiyun void wpan_phy_free(struct wpan_phy *phy);
387*4882a593Smuzhiyun /* Same semantics as for class_for_each_device */
388*4882a593Smuzhiyun int wpan_phy_for_each(int (*fn)(struct wpan_phy *phy, void *data), void *data);
389*4882a593Smuzhiyun
wpan_phy_priv(struct wpan_phy * phy)390*4882a593Smuzhiyun static inline void *wpan_phy_priv(struct wpan_phy *phy)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun BUG_ON(!phy);
393*4882a593Smuzhiyun return &phy->priv;
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun struct wpan_phy *wpan_phy_find(const char *str);
397*4882a593Smuzhiyun
wpan_phy_put(struct wpan_phy * phy)398*4882a593Smuzhiyun static inline void wpan_phy_put(struct wpan_phy *phy)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun put_device(&phy->dev);
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun
wpan_phy_name(struct wpan_phy * phy)403*4882a593Smuzhiyun static inline const char *wpan_phy_name(struct wpan_phy *phy)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun return dev_name(&phy->dev);
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun #endif /* __NET_CFG802154_H */
409