xref: /openbmc/linux/include/net/cfg802154.h (revision a5dd1d72d868ec9c8f44d60ca29900b6a38321b4)
1 /*
2  * Copyright (C) 2007, 2008, 2009 Siemens AG
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * Written by:
14  * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
15  */
16 
17 #ifndef __NET_CFG802154_H
18 #define __NET_CFG802154_H
19 
20 #include <linux/netdevice.h>
21 #include <linux/mutex.h>
22 #include <linux/bug.h>
23 
24 /* According to the IEEE 802.15.4 stadard the upper most significant bits of
25  * the 32-bit channel bitmaps shall be used as an integer value to specify 32
26  * possible channel pages. The lower 27 bits of the channel bit map shall be
27  * used as a bit mask to specify channel numbers within a channel page.
28  */
29 #define WPAN_NUM_CHANNELS	27
30 #define WPAN_NUM_PAGES		32
31 
32 struct wpan_phy;
33 
34 struct cfg802154_ops {
35 };
36 
37 struct wpan_phy {
38 	struct mutex pib_lock;
39 
40 	/*
41 	 * This is a PIB according to 802.15.4-2011.
42 	 * We do not provide timing-related variables, as they
43 	 * aren't used outside of driver
44 	 */
45 	u8 current_channel;
46 	u8 current_page;
47 	u32 channels_supported[32];
48 	s8 transmit_power;
49 	u8 cca_mode;
50 	u8 min_be;
51 	u8 max_be;
52 	u8 csma_retries;
53 	s8 frame_retries;
54 
55 	bool lbt;
56 	s32 cca_ed_level;
57 
58 	struct device dev;
59 	int idx;
60 
61 	struct net_device *(*add_iface)(struct wpan_phy *phy,
62 					const char *name, int type);
63 	void (*del_iface)(struct wpan_phy *phy, struct net_device *dev);
64 
65 	char priv[0] __aligned(NETDEV_ALIGN);
66 };
67 
68 #define to_phy(_dev)	container_of(_dev, struct wpan_phy, dev)
69 
70 struct wpan_phy *
71 wpan_phy_alloc(const struct cfg802154_ops *ops, size_t priv_size);
72 static inline void wpan_phy_set_dev(struct wpan_phy *phy, struct device *dev)
73 {
74 	phy->dev.parent = dev;
75 }
76 
77 int wpan_phy_register(struct wpan_phy *phy);
78 void wpan_phy_unregister(struct wpan_phy *phy);
79 void wpan_phy_free(struct wpan_phy *phy);
80 /* Same semantics as for class_for_each_device */
81 int wpan_phy_for_each(int (*fn)(struct wpan_phy *phy, void *data), void *data);
82 
83 static inline void *wpan_phy_priv(struct wpan_phy *phy)
84 {
85 	BUG_ON(!phy);
86 	return &phy->priv;
87 }
88 
89 struct wpan_phy *wpan_phy_find(const char *str);
90 
91 static inline void wpan_phy_put(struct wpan_phy *phy)
92 {
93 	put_device(&phy->dev);
94 }
95 
96 static inline const char *wpan_phy_name(struct wpan_phy *phy)
97 {
98 	return dev_name(&phy->dev);
99 }
100 
101 #endif /* __NET_CFG802154_H */
102