12bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov/* 22bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * Copyright (C) 2007, 2008, 2009 Siemens AG 32bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * 42bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * This program is free software; you can redistribute it and/or modify 52bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * it under the terms of the GNU General Public License version 2 62bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * as published by the Free Software Foundation. 72bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * 82bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * This program is distributed in the hope that it will be useful, 92bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * but WITHOUT ANY WARRANTY; without even the implied warranty of 102bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 112bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * GNU General Public License for more details. 122bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * 132bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * You should have received a copy of the GNU General Public License along 142bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * with this program; if not, write to the Free Software Foundation, Inc., 152bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 162bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * 172bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * Written by: 182bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> 192bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov */ 202bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov 212bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov#ifndef WPAN_PHY_H 222bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov#define WPAN_PHY_H 232bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov 242bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov#include <linux/netdevice.h> 252bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov#include <linux/mutex.h> 26187f1882b5b0748b3c4c22274663fdb372ac0452Paul Gortmaker#include <linux/bug.h> 272bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov 280606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.com/* According to the IEEE 802.15.4 stadard the upper most significant bits of 290606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.com * the 32-bit channel bitmaps shall be used as an integer value to specify 32 300606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.com * possible channel pages. The lower 27 bits of the channel bit map shall be 310606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.com * used as a bit mask to specify channel numbers within a channel page. 320606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.com */ 330606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.com#define WPAN_NUM_CHANNELS 27 340606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.com#define WPAN_NUM_PAGES 32 350606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.com 362bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikovstruct wpan_phy { 372bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov struct mutex pib_lock; 382bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov 392bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov /* 409b2777d6089bcd7fb035847f907280560fe233c8Phoebe Buckheister * This is a PIB according to 802.15.4-2011. 412bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * We do not provide timing-related variables, as they 422bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov * aren't used outside of driver 432bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov */ 442bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov u8 current_channel; 452bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov u8 current_page; 46a0b4a738e0e03f5e0d6ca366560f9a48e5adf83aDmitry Eremin-Solenikov u32 channels_supported[32]; 479b2777d6089bcd7fb035847f907280560fe233c8Phoebe Buckheister s8 transmit_power; 482bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov u8 cca_mode; 494244db1b0b7bc9ab7b67d8c1c38de6cf15bc87a8Phoebe Buckheister u8 min_be; 504244db1b0b7bc9ab7b67d8c1c38de6cf15bc87a8Phoebe Buckheister u8 max_be; 514244db1b0b7bc9ab7b67d8c1c38de6cf15bc87a8Phoebe Buckheister u8 csma_retries; 524244db1b0b7bc9ab7b67d8c1c38de6cf15bc87a8Phoebe Buckheister s8 frame_retries; 532bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov 5484dda3c648fd55898064d76366b14f964cdc9d16Phoebe Buckheister bool lbt; 556ca001978dce0d50ebac01a38d6287f241a520c6Phoebe Buckheister s32 cca_ed_level; 5684dda3c648fd55898064d76366b14f964cdc9d16Phoebe Buckheister 572bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov struct device dev; 582bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov int idx; 592bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov 60bb1cafb8fc414d6dbe933f888df6540c2ef02101Dmitry Eremin-Solenikov struct net_device *(*add_iface)(struct wpan_phy *phy, 6190c049b2c6ae26d1a4d526d660a976620eaa554aalex.bluesman.smirnov@gmail.com const char *name, int type); 62bb1cafb8fc414d6dbe933f888df6540c2ef02101Dmitry Eremin-Solenikov void (*del_iface)(struct wpan_phy *phy, struct net_device *dev); 63bb1cafb8fc414d6dbe933f888df6540c2ef02101Dmitry Eremin-Solenikov 649b2777d6089bcd7fb035847f907280560fe233c8Phoebe Buckheister int (*set_txpower)(struct wpan_phy *phy, int db); 6584dda3c648fd55898064d76366b14f964cdc9d16Phoebe Buckheister int (*set_lbt)(struct wpan_phy *phy, bool on); 66ba08fea53a43e02b590d89224afdad976dece841Phoebe Buckheister int (*set_cca_mode)(struct wpan_phy *phy, u8 cca_mode); 676ca001978dce0d50ebac01a38d6287f241a520c6Phoebe Buckheister int (*set_cca_ed_level)(struct wpan_phy *phy, int level); 684244db1b0b7bc9ab7b67d8c1c38de6cf15bc87a8Phoebe Buckheister int (*set_csma_params)(struct wpan_phy *phy, u8 min_be, u8 max_be, 694244db1b0b7bc9ab7b67d8c1c38de6cf15bc87a8Phoebe Buckheister u8 retries); 704244db1b0b7bc9ab7b67d8c1c38de6cf15bc87a8Phoebe Buckheister int (*set_frame_retries)(struct wpan_phy *phy, s8 retries); 719b2777d6089bcd7fb035847f907280560fe233c8Phoebe Buckheister 722bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov char priv[0] __attribute__((__aligned__(NETDEV_ALIGN))); 732bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov}; 742bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov 7542723448b8bacf60c96812196d7725d8d605d0c4Dmitry Eremin-Solenikov#define to_phy(_dev) container_of(_dev, struct wpan_phy, dev) 7642723448b8bacf60c96812196d7725d8d605d0c4Dmitry Eremin-Solenikov 772bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikovstruct wpan_phy *wpan_phy_alloc(size_t priv_size); 78e9cf356c0c6b975fda84b15a5abdd1db88d74f84Dmitry Eremin-Solenikovstatic inline void wpan_phy_set_dev(struct wpan_phy *phy, struct device *dev) 79e9cf356c0c6b975fda84b15a5abdd1db88d74f84Dmitry Eremin-Solenikov{ 80e9cf356c0c6b975fda84b15a5abdd1db88d74f84Dmitry Eremin-Solenikov phy->dev.parent = dev; 81e9cf356c0c6b975fda84b15a5abdd1db88d74f84Dmitry Eremin-Solenikov} 82e9cf356c0c6b975fda84b15a5abdd1db88d74f84Dmitry Eremin-Solenikovint wpan_phy_register(struct wpan_phy *phy); 832bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikovvoid wpan_phy_unregister(struct wpan_phy *phy); 842bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikovvoid wpan_phy_free(struct wpan_phy *phy); 851c889f4db6b2f8f8429e62011ba622642faba019Dmitry Eremin-Solenikov/* Same semantics as for class_for_each_device */ 861c889f4db6b2f8f8429e62011ba622642faba019Dmitry Eremin-Solenikovint wpan_phy_for_each(int (*fn)(struct wpan_phy *phy, void *data), void *data); 872bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov 882bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikovstatic inline void *wpan_phy_priv(struct wpan_phy *phy) 892bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov{ 902bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov BUG_ON(!phy); 912bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov return &phy->priv; 922bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov} 932bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov 942bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikovstruct wpan_phy *wpan_phy_find(const char *str); 9569d9ab96f983720b7794e91437bd9c5f83bae9f7Dmitry Eremin-Solenikov 9669d9ab96f983720b7794e91437bd9c5f83bae9f7Dmitry Eremin-Solenikovstatic inline void wpan_phy_put(struct wpan_phy *phy) 9769d9ab96f983720b7794e91437bd9c5f83bae9f7Dmitry Eremin-Solenikov{ 9869d9ab96f983720b7794e91437bd9c5f83bae9f7Dmitry Eremin-Solenikov put_device(&phy->dev); 9969d9ab96f983720b7794e91437bd9c5f83bae9f7Dmitry Eremin-Solenikov} 10069d9ab96f983720b7794e91437bd9c5f83bae9f7Dmitry Eremin-Solenikov 1012bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikovstatic inline const char *wpan_phy_name(struct wpan_phy *phy) 1022bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov{ 1032bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov return dev_name(&phy->dev); 1042bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov} 1052bfb1070ba1fdb8cbc2b0b9ff61a3b0701ab40deDmitry Eremin-Solenikov#endif 106