On Fri, Dec 16, 2011 at 7:23 PM, Alexander Smirnov
<alex.bluesman.smir...@gmail.com> wrote:
> Hi,
>
> am I right that you suggest to leave platform device interface and
> just drop sysfs interface?

Yes

>
> Alex
>
> 2011/12/16 Dmitry Eremin-Solenikov <dbarysh...@gmail.com>:
>> Hello,
>>
>> On Fri, Dec 16, 2011 at 7:08 PM, Alexander Smirnov
>> <alex.bluesman.smir...@gmail.com> wrote:
>>> Hi Dima,
>>>
>>> I have some doubts regarding this code.
>>>
>>> I found comment from upstream when you tried to push this code 2 years
>>> ago. It was about using netlink interface. If I understand correctly,
>>> netlink requires presence of registered network device. But in this
>>> case we need no netdev, indeed ieee802154 device should be registered.
>>>
>>> In following code I register netdev which is used just for rtnetlink
>>> registration and I/O. "newlink" callback is used to add new phy. But
>>> this looks a little bit ugly.
>>>
>>> Do you have any suggestions regarding implementation of the best
>>> driver interface?
>>
>> My suggestion would be to drop (for now) dynamic allocation of radios 
>> completely
>> and to use module parameter to specify number of phys to allocate in init.
>>
>>>
>>> With best regards,
>>> Alexander
>>>
>>> 2011/12/14  <alex.bluesman.smir...@gmail.com>:
>>>> From: Alexander Smirnov <alexander@Lenovo.(none)>
>>>>
>>>> Add support for loopback driver. It's very useful tool for testing
>>>> and development upper IEEE 802.15.4 layer.
>>>>
>>>> Signed-off-by: Alexander Smirnov <alex.bluesman.smir...@gmail.com>
>>>> ---
>>>>  drivers/ieee802154/Kconfig  |    8 +
>>>>  drivers/ieee802154/Makefile |    1 +
>>>>  drivers/ieee802154/fakelb.c |  296 
>>>> +++++++++++++++++++++++++++++++++++++++++++
>>>>  include/net/mac802154.h     |    4 +
>>>>  4 files changed, 309 insertions(+), 0 deletions(-)
>>>>  create mode 100644 drivers/ieee802154/fakelb.c
>>>>
>>>> diff --git a/drivers/ieee802154/Kconfig b/drivers/ieee802154/Kconfig
>>>> index 9b9f43a..0e61489 100644
>>>> --- a/drivers/ieee802154/Kconfig
>>>> +++ b/drivers/ieee802154/Kconfig
>>>> @@ -19,4 +19,12 @@ config IEEE802154_FAKEHARD
>>>>
>>>>           This driver can also be built as a module. To do so say M here.
>>>>          The module will be called 'fakehard'.
>>>> +config IEEE802154_FAKELB
>>>> +       depends on IEEE802154_DRIVERS && MAC802154
>>>> +       tristate "Fake LR-WPAN driver with several interconnected devices"
>>>> +       ---help---
>>>> +         Say Y here to enable the fake driver that can emulate a net
>>>> +         of several interconnected radio devices.
>>>>
>>>> +         This driver can also be built as a module. To do so say M here.
>>>> +         The module will be called 'fakelb'.
>>>> diff --git a/drivers/ieee802154/Makefile b/drivers/ieee802154/Makefile
>>>> index 800a389..ea784ea 100644
>>>> --- a/drivers/ieee802154/Makefile
>>>> +++ b/drivers/ieee802154/Makefile
>>>> @@ -1 +1,2 @@
>>>>  obj-$(CONFIG_IEEE802154_FAKEHARD) += fakehard.o
>>>> +obj-$(CONFIG_IEEE802154_FAKELB) += fakelb.o
>>>> diff --git a/drivers/ieee802154/fakelb.c b/drivers/ieee802154/fakelb.c
>>>> new file mode 100644
>>>> index 0000000..f481318
>>>> --- /dev/null
>>>> +++ b/drivers/ieee802154/fakelb.c
>>>> @@ -0,0 +1,296 @@
>>>> +/*
>>>> + * Loopback IEEE 802.15.4 interface
>>>> + *
>>>> + * Copyright 2007-2011 Siemens AG
>>>> + *
>>>> + * This program is free software; you can redistribute it and/or modify
>>>> + * it under the terms of the GNU General Public License version 2
>>>> + * as published by the Free Software Foundation.
>>>> + *
>>>> + * This program is distributed in the hope that it will be useful,
>>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>>> + * GNU General Public License for more details.
>>>> + *
>>>> + * You should have received a copy of the GNU General Public License along
>>>> + * with this program; if not, write to the Free Software Foundation, Inc.,
>>>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>>>> + *
>>>> + * Written by:
>>>> + * Sergey Lapin <sla...@ossfans.org>
>>>> + * Dmitry Eremin-Solenikov <dbarysh...@gmail.com>
>>>> + * Alexander Smirnov <alex.bluesman.smir...@gmail.com>
>>>> + */
>>>> +
>>>> +#include <linux/module.h>
>>>> +#include <linux/timer.h>
>>>> +#include <linux/platform_device.h>
>>>> +#include <linux/netdevice.h>
>>>> +#include <linux/spinlock.h>
>>>> +#include <net/mac802154.h>
>>>> +#include <net/wpan-phy.h>
>>>> +
>>>> +#include <linux/rtnetlink.h>
>>>> +#include <net/rtnetlink.h>
>>>> +
>>>> +struct fakelb_link_priv {
>>>> +       struct ieee802154_dev *dev;
>>>> +       struct list_head list;
>>>> +       struct fakelb_priv *fakelb;
>>>> +       unsigned int working:1;
>>>> +};
>>>> +
>>>> +struct fakelb_priv {
>>>> +       struct list_head list;
>>>> +       rwlock_t lock;
>>>> +};
>>>> +
>>>> +static inline struct fakelb_priv *fakelb_priv(struct net_device *dev)
>>>> +{
>>>> +       return netdev_priv(dev);
>>>> +}
>>>> +
>>>> +static int
>>>> +fakelb_hw_ed(struct ieee802154_dev *dev, u8 *level)
>>>> +{
>>>> +       pr_debug("(%s)\n", __func__);
>>>> +
>>>> +       might_sleep();
>>>> +       BUG_ON(!level);
>>>> +       *level = 0xbe;
>>>> +
>>>> +       return 0;
>>>> +}
>>>> +
>>>> +static int
>>>> +fakelb_hw_channel(struct ieee802154_dev *dev, int page, int channel)
>>>> +{
>>>> +       pr_debug("(%s): setting channel to %d\n", __func__, channel);
>>>> +
>>>> +       might_sleep();
>>>> +       dev->phy->current_page = page;
>>>> +       dev->phy->current_channel = channel;
>>>> +
>>>> +       return 0;
>>>> +}
>>>> +
>>>> +static void
>>>> +fakelb_hw_deliver(struct fakelb_link_priv *priv, struct sk_buff *skb)
>>>> +{
>>>> +       struct sk_buff *newskb;
>>>> +
>>>> +       if (!priv->working)
>>>> +               return;
>>>> +
>>>> +       newskb = pskb_copy(skb, GFP_ATOMIC);
>>>> +
>>>> +       ieee802154_rx_irqsafe(priv->dev, newskb, 0xcc);
>>>> +}
>>>> +
>>>> +static int
>>>> +fakelb_hw_xmit(struct ieee802154_dev *dev, struct sk_buff *skb)
>>>> +{
>>>> +       struct fakelb_link_priv *priv = dev->priv;
>>>> +       struct fakelb_priv *fake = priv->fakelb;
>>>> +
>>>> +       might_sleep();
>>>> +
>>>> +       read_lock_bh(&fake->lock);
>>>> +       if (priv->list.next == priv->list.prev) {
>>>> +               /* we are the only one device */
>>>> +               fakelb_hw_deliver(priv, skb);
>>>> +       } else {
>>>> +               struct fakelb_link_priv *dp;
>>>> +               list_for_each_entry(dp, &priv->fakelb->list, list)
>>>> +                       if (dp != priv &&
>>>> +                           dp->dev->phy->current_channel ==
>>>> +                                       priv->dev->phy->current_channel)
>>>> +                               fakelb_hw_deliver(dp, skb);
>>>> +       }
>>>> +       read_unlock_bh(&fake->lock);
>>>> +
>>>> +       return 0;
>>>> +}
>>>> +
>>>> +static int
>>>> +fakelb_hw_start(struct ieee802154_dev *dev) {
>>>> +       struct fakelb_link_priv *priv = dev->priv;
>>>> +
>>>> +       if (priv->working)
>>>> +               return -EBUSY;
>>>> +
>>>> +       priv->working = 1;
>>>> +
>>>> +       return 0;
>>>> +}
>>>> +
>>>> +static void
>>>> +fakelb_hw_stop(struct ieee802154_dev *dev) {
>>>> +       struct fakelb_link_priv *priv = dev->priv;
>>>> +
>>>> +       priv->working = 0;
>>>> +}
>>>> +
>>>> +static struct ieee802154_ops fakelb_ops = {
>>>> +       .owner = THIS_MODULE,
>>>> +       .xmit = fakelb_hw_xmit,
>>>> +       .ed = fakelb_hw_ed,
>>>> +       .set_channel = fakelb_hw_channel,
>>>> +       .start = fakelb_hw_start,
>>>> +       .stop = fakelb_hw_stop,
>>>> +};
>>>> +
>>>> +static int
>>>> +fakelb_newlink(struct net *src_net, struct net_device *dev,
>>>> +                               struct nlattr *tb[], struct nlattr *data[])
>>>> +{
>>>> +       struct fakelb_link_priv *priv;
>>>> +       struct fakelb_priv *info = fakelb_priv(dev);
>>>> +       struct ieee802154_dev *ieee;
>>>> +       int err;
>>>> +
>>>> +       ieee = ieee802154_alloc_device(sizeof(*priv), &fakelb_ops);
>>>> +       if (!ieee)
>>>> +               return -ENOMEM;
>>>> +
>>>> +       priv = ieee->priv;
>>>> +       priv->dev = ieee;
>>>> +
>>>> +       /* 868 MHz BPSK 802.15.4-2003 */
>>>> +       ieee->phy->channels_supported[0] |= 1;
>>>> +       /* 915 MHz BPSK 802.15.4-2003 */
>>>> +       ieee->phy->channels_supported[0] |= 0x7fe;
>>>> +       /* 2.4 GHz O-QPSK 802.15.4-2003 */
>>>> +       ieee->phy->channels_supported[0] |= 0x7FFF800;
>>>> +       /* 868 MHz ASK 802.15.4-2006 */
>>>> +       ieee->phy->channels_supported[1] |= 1;
>>>> +       /* 915 MHz ASK 802.15.4-2006 */
>>>> +       ieee->phy->channels_supported[1] |= 0x7fe;
>>>> +       /* 868 MHz O-QPSK 802.15.4-2006 */
>>>> +       ieee->phy->channels_supported[2] |= 1;
>>>> +       /* 915 MHz O-QPSK 802.15.4-2006 */
>>>> +       ieee->phy->channels_supported[2] |= 0x7fe;
>>>> +       /* 2.4 GHz CSS 802.15.4a-2007 */
>>>> +       ieee->phy->channels_supported[3] |= 0x3fff;
>>>> +       /* UWB Sub-gigahertz 802.15.4a-2007 */
>>>> +       ieee->phy->channels_supported[4] |= 1;
>>>> +       /* UWB Low band 802.15.4a-2007 */
>>>> +       ieee->phy->channels_supported[4] |= 0x1e;
>>>> +       /* UWB High band 802.15.4a-2007 */
>>>> +       ieee->phy->channels_supported[4] |= 0xffe0;
>>>> +       /* 750 MHz O-QPSK 802.15.4c-2009 */
>>>> +       ieee->phy->channels_supported[5] |= 0xf;
>>>> +       /* 750 MHz MPSK 802.15.4c-2009 */
>>>> +       ieee->phy->channels_supported[5] |= 0xf0;
>>>> +       /* 950 MHz BPSK 802.15.4d-2009 */
>>>> +       ieee->phy->channels_supported[6] |= 0x3ff;
>>>> +       /* 950 MHz GFSK 802.15.4d-2009 */
>>>> +       ieee->phy->channels_supported[6] |= 0x3ffc00;
>>>> +
>>>> +       INIT_LIST_HEAD(&priv->list);
>>>> +       priv->fakelb = info;
>>>> +
>>>> +       err = ieee802154_register_device(ieee);
>>>> +       if (err)
>>>> +               goto err_reg;
>>>> +
>>>> +       write_lock_bh(&info->lock);
>>>> +       list_add_tail(&priv->list, &info->list);
>>>> +       write_unlock_bh(&info->lock);
>>>> +
>>>> +       return 0;
>>>> +
>>>> +err_reg:
>>>> +       ieee802154_free_device(priv->dev);
>>>> +       return err;
>>>> +}
>>>> +
>>>> +static void
>>>> +fakelb_dellink(struct net_device *dev, struct list_head *head)
>>>> +{
>>>> +       struct fakelb_priv *priv = fakelb_priv(dev);
>>>> +       struct fakelb_link_priv *entry, *temp;
>>>> +
>>>> +       write_lock_bh(&priv->lock);
>>>> +       list_for_each_entry_safe(entry, temp, &priv->list, list) {
>>>> +               list_del(&entry->list);
>>>> +               ieee802154_unregister_device(entry->dev);
>>>> +               ieee802154_free_device(entry->dev);
>>>> +               kfree(entry);
>>>> +       }
>>>> +       write_unlock_bh(&priv->lock);
>>>> +}
>>>> +
>>>> +static void
>>>> +fakelb_dev_free(struct net_device *dev)
>>>> +{
>>>> +       free_netdev(dev);
>>>> +}
>>>> +
>>>> +static void
>>>> +fakelb_setup(struct net_device *dev)
>>>> +{
>>>> +       dev->destructor = fakelb_dev_free;
>>>> +}
>>>> +
>>>> +static struct rtnl_link_ops fakelb_link_ops = {
>>>> +       .kind           = "fakelb",
>>>> +       .setup          = fakelb_setup,
>>>> +       .priv_size      = sizeof(struct fakelb_link_priv),
>>>> +       .newlink        = fakelb_newlink,
>>>> +       .dellink        = fakelb_dellink,
>>>> +};
>>>> +
>>>> +static int __init fakelb_init_one(void)
>>>> +{
>>>> +       struct net_device *fakelb_dev;
>>>> +       struct fakelb_priv *priv;
>>>> +       int err;
>>>> +
>>>> +       fakelb_dev = alloc_netdev(sizeof(struct fakelb_priv), "fakelb%d",
>>>> +                                                       fakelb_setup);
>>>> +       if (!fakelb_dev)
>>>> +               return -ENOMEM;
>>>> +
>>>> +       fakelb_dev->rtnl_link_ops = &fakelb_link_ops;
>>>> +
>>>> +       err = register_netdevice(fakelb_dev);
>>>> +       if (err < 0)
>>>> +               goto err;
>>>> +
>>>> +       priv = fakelb_priv(fakelb_dev);
>>>> +       INIT_LIST_HEAD(&priv->list);
>>>> +       rwlock_init(&priv->lock);
>>>> +
>>>> +       netdev_info(fakelb_dev, "added ieee802154 hardware\n");
>>>> +
>>>> +       return 0;
>>>> +err:
>>>> +       free_netdev(fakelb_dev);
>>>> +       return err;
>>>> +}
>>>> +
>>>> +static int __init fakelb_init_module(void)
>>>> +{
>>>> +       int err;
>>>> +
>>>> +       rtnl_lock();
>>>> +
>>>> +       __rtnl_link_register(&fakelb_link_ops);
>>>> +       err = fakelb_init_one();
>>>> +       if (err)
>>>> +               __rtnl_link_unregister(&fakelb_link_ops);
>>>> +
>>>> +       rtnl_unlock();
>>>> +
>>>> +       return err;
>>>> +}
>>>> +
>>>> +static void __exit fakelb_cleanup_module(void)
>>>> +{
>>>> +       rtnl_link_unregister(&fakelb_link_ops);
>>>> +}
>>>> +
>>>> +module_init(fakelb_init_module);
>>>> +module_exit(fakelb_cleanup_module);
>>>> +MODULE_LICENSE("GPL");
>>>> diff --git a/include/net/mac802154.h b/include/net/mac802154.h
>>>> index 4e9f042..4854885 100644
>>>> --- a/include/net/mac802154.h
>>>> +++ b/include/net/mac802154.h
>>>> @@ -139,6 +139,10 @@ struct ieee802154_ops {
>>>>                                        u8 addr[IEEE802154_ADDR_LEN]);
>>>>  };
>>>>
>>>> +struct ieee802154_dev *ieee802154_alloc_device(size_t priv_size,
>>>> +                                       struct ieee802154_ops *ops);
>>>> +void ieee802154_free_device(struct ieee802154_dev *dev);
>>>> +
>>>>  int ieee802154_register_device(struct ieee802154_dev *dev);
>>>>  void ieee802154_unregister_device(struct ieee802154_dev *dev);
>>>>
>>>> --
>>>> 1.7.0.4
>>>>
>>
>>
>>
>> --
>> With best wishes
>> Dmitry



-- 
With best wishes
Dmitry

------------------------------------------------------------------------------
Learn Windows Azure Live!  Tuesday, Dec 13, 2011
Microsoft is holding a special Learn Windows Azure training event for 
developers. It will provide a great way to learn Windows Azure and what it 
provides. You can attend the event by watching it streamed LIVE online.  
Learn more at http://p.sf.net/sfu/ms-windowsazure
_______________________________________________
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel

Reply via email to