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