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