forked from Minki/linux
cfg802154: convert deprecated iface add and del
This patch removes the wpan_phy callbacks for add and del an interface on a phy. Instead we introduce deprecated cfg802154 callbacks for this. Furthermore we introduce a new netlink interface nl802154 which use different callbacks. The deprecated function is to have a backwards compatibility with the current netlink interface. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
ea4dcd32a4
commit
4a9a816a4f
@ -32,6 +32,11 @@
|
|||||||
struct wpan_phy;
|
struct wpan_phy;
|
||||||
|
|
||||||
struct cfg802154_ops {
|
struct cfg802154_ops {
|
||||||
|
struct net_device * (*add_virtual_intf_deprecated)(struct wpan_phy *wpan_phy,
|
||||||
|
const char *name,
|
||||||
|
int type);
|
||||||
|
void (*del_virtual_intf_deprecated)(struct wpan_phy *wpan_phy,
|
||||||
|
struct net_device *dev);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wpan_phy {
|
struct wpan_phy {
|
||||||
@ -58,10 +63,6 @@ struct wpan_phy {
|
|||||||
struct device dev;
|
struct device dev;
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
struct net_device *(*add_iface)(struct wpan_phy *phy,
|
|
||||||
const char *name, int type);
|
|
||||||
void (*del_iface)(struct wpan_phy *phy, struct net_device *dev);
|
|
||||||
|
|
||||||
char priv[0] __aligned(NETDEV_ALIGN);
|
char priv[0] __aligned(NETDEV_ALIGN);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
#include <linux/nl802154.h>
|
#include <linux/nl802154.h>
|
||||||
|
|
||||||
#include "ieee802154.h"
|
#include "ieee802154.h"
|
||||||
|
#include "rdev-ops.h"
|
||||||
|
#include "core.h"
|
||||||
|
|
||||||
static int ieee802154_nl_fill_phy(struct sk_buff *msg, u32 portid,
|
static int ieee802154_nl_fill_phy(struct sk_buff *msg, u32 portid,
|
||||||
u32 seq, int flags, struct wpan_phy *phy)
|
u32 seq, int flags, struct wpan_phy *phy)
|
||||||
@ -203,11 +205,6 @@ int ieee802154_add_iface(struct sk_buff *skb, struct genl_info *info)
|
|||||||
if (!msg)
|
if (!msg)
|
||||||
goto out_dev;
|
goto out_dev;
|
||||||
|
|
||||||
if (!phy->add_iface) {
|
|
||||||
rc = -EINVAL;
|
|
||||||
goto nla_put_failure;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->attrs[IEEE802154_ATTR_HW_ADDR] &&
|
if (info->attrs[IEEE802154_ATTR_HW_ADDR] &&
|
||||||
nla_len(info->attrs[IEEE802154_ATTR_HW_ADDR]) !=
|
nla_len(info->attrs[IEEE802154_ATTR_HW_ADDR]) !=
|
||||||
IEEE802154_ADDR_LEN) {
|
IEEE802154_ADDR_LEN) {
|
||||||
@ -223,7 +220,8 @@ int ieee802154_add_iface(struct sk_buff *skb, struct genl_info *info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dev = phy->add_iface(phy, devname, type);
|
dev = rdev_add_virtual_intf_deprecated(wpan_phy_to_rdev(phy), devname,
|
||||||
|
type);
|
||||||
if (IS_ERR(dev)) {
|
if (IS_ERR(dev)) {
|
||||||
rc = PTR_ERR(dev);
|
rc = PTR_ERR(dev);
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
@ -257,7 +255,7 @@ int ieee802154_add_iface(struct sk_buff *skb, struct genl_info *info)
|
|||||||
|
|
||||||
dev_unregister:
|
dev_unregister:
|
||||||
rtnl_lock(); /* del_iface must be called with RTNL lock */
|
rtnl_lock(); /* del_iface must be called with RTNL lock */
|
||||||
phy->del_iface(phy, dev);
|
rdev_del_virtual_intf_deprecated(wpan_phy_to_rdev(phy), dev);
|
||||||
dev_put(dev);
|
dev_put(dev);
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
nla_put_failure:
|
nla_put_failure:
|
||||||
@ -319,13 +317,8 @@ int ieee802154_del_iface(struct sk_buff *skb, struct genl_info *info)
|
|||||||
if (!msg)
|
if (!msg)
|
||||||
goto out_dev;
|
goto out_dev;
|
||||||
|
|
||||||
if (!phy->del_iface) {
|
|
||||||
rc = -EINVAL;
|
|
||||||
goto nla_put_failure;
|
|
||||||
}
|
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
phy->del_iface(phy, dev);
|
rdev_del_virtual_intf_deprecated(wpan_phy_to_rdev(phy), dev);
|
||||||
|
|
||||||
/* We don't have device anymore */
|
/* We don't have device anymore */
|
||||||
dev_put(dev);
|
dev_put(dev);
|
||||||
|
23
net/ieee802154/rdev-ops.h
Normal file
23
net/ieee802154/rdev-ops.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifndef __CFG802154_RDEV_OPS
|
||||||
|
#define __CFG802154_RDEV_OPS
|
||||||
|
|
||||||
|
#include <net/cfg802154.h>
|
||||||
|
|
||||||
|
#include "core.h"
|
||||||
|
|
||||||
|
static inline struct net_device *
|
||||||
|
rdev_add_virtual_intf_deprecated(struct cfg802154_registered_device *rdev,
|
||||||
|
const char *name, int type)
|
||||||
|
{
|
||||||
|
return rdev->ops->add_virtual_intf_deprecated(&rdev->wpan_phy, name,
|
||||||
|
type);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
rdev_del_virtual_intf_deprecated(struct cfg802154_registered_device *rdev,
|
||||||
|
struct net_device *dev)
|
||||||
|
{
|
||||||
|
rdev->ops->del_virtual_intf_deprecated(&rdev->wpan_phy, dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __CFG802154_RDEV_OPS */
|
@ -15,5 +15,22 @@
|
|||||||
|
|
||||||
#include <net/cfg802154.h>
|
#include <net/cfg802154.h>
|
||||||
|
|
||||||
|
#include "ieee802154_i.h"
|
||||||
|
|
||||||
|
static struct net_device *
|
||||||
|
ieee802154_add_iface_deprecated(struct wpan_phy *wpan_phy,
|
||||||
|
const char *name, int type)
|
||||||
|
{
|
||||||
|
return mac802154_add_iface(wpan_phy, name, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ieee802154_del_iface_deprecated(struct wpan_phy *wpan_phy,
|
||||||
|
struct net_device *dev)
|
||||||
|
{
|
||||||
|
mac802154_del_iface(wpan_phy, dev);
|
||||||
|
}
|
||||||
|
|
||||||
const struct cfg802154_ops mac802154_config_ops = {
|
const struct cfg802154_ops mac802154_config_ops = {
|
||||||
|
.add_virtual_intf_deprecated = ieee802154_add_iface_deprecated,
|
||||||
|
.del_virtual_intf_deprecated = ieee802154_del_iface_deprecated,
|
||||||
};
|
};
|
||||||
|
@ -174,4 +174,8 @@ void mac802154_get_table(struct net_device *dev,
|
|||||||
struct ieee802154_llsec_table **t);
|
struct ieee802154_llsec_table **t);
|
||||||
void mac802154_unlock_table(struct net_device *dev);
|
void mac802154_unlock_table(struct net_device *dev);
|
||||||
|
|
||||||
|
struct net_device *
|
||||||
|
mac802154_add_iface(struct wpan_phy *phy, const char *name, int type);
|
||||||
|
void mac802154_del_iface(struct wpan_phy *phy, struct net_device *dev);
|
||||||
|
|
||||||
#endif /* __IEEE802154_I_H */
|
#endif /* __IEEE802154_I_H */
|
||||||
|
@ -59,8 +59,7 @@ mac802154_netdev_register(struct wpan_phy *phy, struct net_device *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void mac802154_del_iface(struct wpan_phy *phy, struct net_device *dev)
|
||||||
mac802154_del_iface(struct wpan_phy *phy, struct net_device *dev)
|
|
||||||
{
|
{
|
||||||
struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
|
struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
|
||||||
|
|
||||||
@ -76,7 +75,7 @@ mac802154_del_iface(struct wpan_phy *phy, struct net_device *dev)
|
|||||||
unregister_netdevice(sdata->dev);
|
unregister_netdevice(sdata->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct net_device *
|
struct net_device *
|
||||||
mac802154_add_iface(struct wpan_phy *phy, const char *name, int type)
|
mac802154_add_iface(struct wpan_phy *phy, const char *name, int type)
|
||||||
{
|
{
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
@ -221,9 +220,6 @@ int ieee802154_register_hw(struct ieee802154_hw *hw)
|
|||||||
|
|
||||||
wpan_phy_set_dev(local->phy, local->hw.parent);
|
wpan_phy_set_dev(local->phy, local->hw.parent);
|
||||||
|
|
||||||
local->phy->add_iface = mac802154_add_iface;
|
|
||||||
local->phy->del_iface = mac802154_del_iface;
|
|
||||||
|
|
||||||
rc = wpan_phy_register(local->phy);
|
rc = wpan_phy_register(local->phy);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto out_wq;
|
goto out_wq;
|
||||||
|
Loading…
Reference in New Issue
Block a user