From: Xiangfu <[email protected]> --- target/linux/generic/patches-3.3/760-WPAN.patch | 473 +++++++++++++++++++++++ 1 file changed, 473 insertions(+) create mode 100644 target/linux/generic/patches-3.3/760-WPAN.patch
diff --git a/target/linux/generic/patches-3.3/760-WPAN.patch b/target/linux/generic/patches-3.3/760-WPAN.patch new file mode 100644 index 0000000..4bcc5c8 --- /dev/null +++ b/target/linux/generic/patches-3.3/760-WPAN.patch @@ -0,0 +1,473 @@ +From ca7f714fc8c9981eda5d85594333f955f75510f7 Mon Sep 17 00:00:00 2001 +From: Xiangfu <[email protected]> +Date: Tue, 5 Jun 2012 11:32:43 +0800 +Subject: [PATCH 1/3] 002 + +--- + drivers/ieee802154/Kconfig | 55 +++++++++++++++++++++++++++++++++++++-- + drivers/ieee802154/Makefile | 11 ++++++++ + drivers/ieee802154/fakehard.c | 12 ++++++++- + include/linux/if.h | 2 ++ + include/linux/if_arp.h | 2 ++ + include/linux/nl802154.h | 10 +++++-- + include/net/ieee802154_netdev.h | 17 +++++++++--- + include/net/wpan-phy.h | 8 +++--- + net/Kconfig | 2 ++ + net/Makefile | 1 + + net/ieee802154/Kconfig | 8 ++++++ + net/ieee802154/Makefile | 3 +++ + net/ieee802154/dgram.c | 3 +-- + net/ieee802154/ieee802154.h | 4 +++ + net/ieee802154/nl-mac.c | 2 +- + net/ieee802154/nl-phy.c | 20 +++++++++++--- + net/ieee802154/nl_policy.c | 1 + + net/ieee802154/wpan-class.c | 2 +- + 18 files changed, 145 insertions(+), 18 deletions(-) + +diff --git a/drivers/ieee802154/Kconfig b/drivers/ieee802154/Kconfig +index 9b9f43a..5345e40 100644 +--- a/drivers/ieee802154/Kconfig ++++ b/drivers/ieee802154/Kconfig +@@ -10,13 +10,64 @@ menuconfig IEEE802154_DRIVERS + If you say N, all options in this submenu will be skipped and + disabled. + ++config IEEE802154_DRIVER_DEBUG ++ bool "Driver debugging messages" ++ depends on IEEE802154_DRIVERS ++ default y ++ help ++ Say Y here to make the IEEE 802.15.4 drivers generate extensive ++ debugging messages. ++ + config IEEE802154_FAKEHARD + tristate "Fake LR-WPAN driver with several interconnected devices" + depends on IEEE802154_DRIVERS + ---help--- + Say Y here to enable the fake driver that serves as an example +- of HardMAC device driver. ++ of HardMAC device driver. + +- This driver can also be built as a module. To do so say M here. ++ 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'. ++ ++config IEEE802154_SERIAL ++ depends on IEEE802154_DRIVERS && MAC802154 ++ tristate "Simple LR-WPAN UART driver" ++ ++config IEEE802154_AT86RF230 ++ depends on IEEE802154_DRIVERS && MAC802154 ++ tristate "AT86RF230 transceiver driver" ++ depends on SPI ++ ++config SPI_ATBEN ++ tristate "ATBEN 8:10 SPI interface" ++ depends on JZ4740_QI_LB60 && IEEE802154_AT86RF230 ++ help ++ Bit-banging SPI driver for the 8:10 interface of the Ben NanoNote ++ when equipped with an ATBEN board. ++ ++config SPI_ATUSB ++ tristate "ATUSB SPI interface" ++ depends on USB && IEEE802154_AT86RF230 ++ help ++ SPI-over-USB driver for the ATUSB IEEE 802.15.4 board. ++ ++config IEEE802154_CC2420 ++ tristate "CC2420 driver" ++ depends on SPI ++ depends on IEEE802154_DRIVERS ++ ++config IEEE802154_ADF7242 ++ tristate "ADF7242 transceiver driver" ++ depends on IEEE802154_DRIVERS && MAC802154 ++ depends on SPI ++ +diff --git a/drivers/ieee802154/Makefile b/drivers/ieee802154/Makefile +index 800a389..4f669bc 100644 +--- a/drivers/ieee802154/Makefile ++++ b/drivers/ieee802154/Makefile +@@ -1 +1,12 @@ + obj-$(CONFIG_IEEE802154_FAKEHARD) += fakehard.o ++obj-$(CONFIG_IEEE802154_FAKELB) += fakelb.o ++obj-$(CONFIG_IEEE802154_SERIAL) += serial.o ++obj-$(CONFIG_IEEE802154_AT86RF230) += at86rf230.o ++obj-$(CONFIG_IEEE802154_CC2420) += cc2420.o ++obj-$(CONFIG_IEEE802154_ADF7242) += adf7242.o ++obj-$(CONFIG_SPI_ATBEN) += spi_atben.o ++obj-$(CONFIG_SPI_ATUSB) += spi_atusb.o ++ ++ccflags-y := -DDEBUG -DCONFIG_FFD ++ccflags-$(CONFIG_IEEE802154_DRIVER_DEBUG) += -DDEBUG ++ccflags-y += -DCONFIG_FFD +diff --git a/drivers/ieee802154/fakehard.c b/drivers/ieee802154/fakehard.c +index 73d4531..996e1db 100644 +--- a/drivers/ieee802154/fakehard.c ++++ b/drivers/ieee802154/fakehard.c +@@ -259,7 +259,7 @@ static struct ieee802154_mlme_ops fake_mlme = { + .start_req = fake_start_req, + .scan_req = fake_scan_req, + +- .get_phy = fake_get_phy, ++ .wpan_ops.get_phy = fake_get_phy, + + .get_pan_id = fake_get_pan_id, + .get_short_addr = fake_get_short_addr, +@@ -391,6 +391,16 @@ static int __devinit ieee802154fake_probe(struct platform_device *pdev) + priv = netdev_priv(dev); + priv->phy = phy; + ++ /* ++ * If the name is a format string the caller wants us to do a ++ * name allocation. ++ */ ++ if (strchr(dev->name, '%')) { ++ err = dev_alloc_name(dev, dev->name); ++ if (err < 0) ++ goto out; ++ } ++ + wpan_phy_set_dev(phy, &pdev->dev); + SET_NETDEV_DEV(dev, &phy->dev); + +diff --git a/include/linux/if.h b/include/linux/if.h +index cffa754..9f402a1 100644 +--- a/include/linux/if.h ++++ b/include/linux/if.h +@@ -82,6 +82,8 @@ + #define IFF_TEAM_PORT 0x40000 /* device used as team port */ + #define IFF_NO_IP_ALIGN 0x80000 /* do not ip-align allocated rx pkts */ + ++#define IFF_IEEE802154_COORD 0x400 /* IEEE802.15.4 PAN coordinator */ ++ + #define IF_GET_IFACE 0x0001 /* for querying only */ + #define IF_GET_PROTO 0x0002 + +diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h +index 6d722f4..47a57d8 100644 +--- a/include/linux/if_arp.h ++++ b/include/linux/if_arp.h +@@ -87,6 +87,8 @@ + #define ARPHRD_IEEE80211_PRISM 802 /* IEEE 802.11 + Prism2 header */ + #define ARPHRD_IEEE80211_RADIOTAP 803 /* IEEE 802.11 + radiotap header */ + #define ARPHRD_IEEE802154 804 ++#define ARPHRD_IEEE802154_MONITOR 805 ++#define ARPHRD_SMAC 806 /* Freescale Simple MAC */ + + #define ARPHRD_PHONET 820 /* PhoNet media type */ + #define ARPHRD_PHONET_PIPE 821 /* PhoNet pipe header */ +diff --git a/include/linux/nl802154.h b/include/linux/nl802154.h +index 33d9f51..a379fc7 100644 +--- a/include/linux/nl802154.h ++++ b/include/linux/nl802154.h +@@ -68,14 +68,13 @@ enum { + IEEE802154_ATTR_CHANNEL_PAGE_LIST, + + IEEE802154_ATTR_PHY_NAME, ++ IEEE802154_ATTR_DEV_TYPE, + + __IEEE802154_ATTR_MAX, + }; + + #define IEEE802154_ATTR_MAX (__IEEE802154_ATTR_MAX - 1) + +-extern const struct nla_policy ieee802154_policy[]; +- + /* commands */ + /* REQ should be responded with CONF + * and INDIC with RESP +@@ -126,4 +125,11 @@ enum { + + #define IEEE802154_CMD_MAX (__IEEE802154_CMD_MAX - 1) + ++enum { ++ IEEE802154_DEV_WPAN, ++ IEEE802154_DEV_MONITOR, ++ IEEE802154_DEV_SMAC, ++ __IEEE802154_DEV_MAX, ++}; ++ + #endif +diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h +index 5743055..e12ce9a 100644 +--- a/include/net/ieee802154_netdev.h ++++ b/include/net/ieee802154_netdev.h +@@ -26,6 +26,8 @@ + #ifndef IEEE802154_NETDEVICE_H + #define IEEE802154_NETDEVICE_H + ++#include <net/af_ieee802154.h> ++ + /* + * A control block of skb passed between the ARPHRD_IEEE802154 device + * and other stack parts. +@@ -81,7 +83,12 @@ struct wpan_phy; + * get_phy should increment the reference counting on returned phy. + * Use wpan_wpy_put to put that reference. + */ ++struct simple_mlme_ops { ++ struct wpan_phy *(*get_phy)(const struct net_device *dev); ++}; + struct ieee802154_mlme_ops { ++ struct simple_mlme_ops wpan_ops; ++ + int (*assoc_req)(struct net_device *dev, + struct ieee802154_addr *addr, + u8 channel, u8 page, u8 cap); +@@ -98,8 +105,6 @@ struct ieee802154_mlme_ops { + int (*scan_req)(struct net_device *dev, + u8 type, u32 channels, u8 page, u8 duration); + +- struct wpan_phy *(*get_phy)(const struct net_device *dev); +- + /* + * FIXME: these should become the part of PIB/MIB interface. + * However we still don't have IB interface of any kind +@@ -110,12 +115,18 @@ struct ieee802154_mlme_ops { + u8 (*get_bsn)(const struct net_device *dev); + }; + +-static inline struct ieee802154_mlme_ops *ieee802154_mlme_ops( ++static inline struct simple_mlme_ops *simple_mlme_ops( + const struct net_device *dev) + { + return dev->ml_priv; + } + ++static inline struct ieee802154_mlme_ops *ieee802154_mlme_ops( ++ const struct net_device *dev) ++{ ++ return container_of(dev->ml_priv, struct ieee802154_mlme_ops, wpan_ops); ++} ++ + #endif + + +diff --git a/include/net/wpan-phy.h b/include/net/wpan-phy.h +index d86fffd..9e119c5 100644 +--- a/include/net/wpan-phy.h ++++ b/include/net/wpan-phy.h +@@ -24,17 +24,19 @@ + #include <linux/netdevice.h> + #include <linux/mutex.h> + ++#define WPAN_NUM_PAGES 32 ++ + struct wpan_phy { + struct mutex pib_lock; + + /* +- * This is a PIB according to 802.15.4-2006. ++ * This is a PIB acording to 802.15.4-2006. + * We do not provide timing-related variables, as they + * aren't used outside of driver + */ + u8 current_channel; + u8 current_page; +- u32 channels_supported[32]; ++ u32 channels_supported[WPAN_NUM_PAGES]; + u8 transmit_power; + u8 cca_mode; + +@@ -42,7 +44,7 @@ struct wpan_phy { + int idx; + + struct net_device *(*add_iface)(struct wpan_phy *phy, +- const char *name); ++ const char *name, int type); + void (*del_iface)(struct wpan_phy *phy, struct net_device *dev); + + char priv[0] __attribute__((__aligned__(NETDEV_ALIGN))); +diff --git a/net/Kconfig b/net/Kconfig +index b3904e8..578eb11 100644 +--- a/net/Kconfig ++++ b/net/Kconfig +@@ -217,6 +217,8 @@ source "net/econet/Kconfig" + source "net/wanrouter/Kconfig" + source "net/phonet/Kconfig" + source "net/ieee802154/Kconfig" ++source "net/mac802154/Kconfig" ++source "net/zigbee/Kconfig" + source "net/sched/Kconfig" + source "net/dcb/Kconfig" + source "net/dns_resolver/Kconfig" +diff --git a/net/Makefile b/net/Makefile +index ad432fa..2a97cde 100644 +--- a/net/Makefile ++++ b/net/Makefile +@@ -60,6 +60,7 @@ ifneq ($(CONFIG_DCB),) + obj-y += dcb/ + endif + obj-$(CONFIG_IEEE802154) += ieee802154/ ++obj-$(CONFIG_MAC802154) += mac802154/ + + ifeq ($(CONFIG_NET),y) + obj-$(CONFIG_SYSCTL) += sysctl_net.o +diff --git a/net/ieee802154/Kconfig b/net/ieee802154/Kconfig +index 7dee650..3dea3c1 100644 +--- a/net/ieee802154/Kconfig ++++ b/net/ieee802154/Kconfig +@@ -16,3 +16,11 @@ config IEEE802154_6LOWPAN + depends on IEEE802154 && IPV6 + ---help--- + IPv6 compression over IEEE 802.15.4. ++ ++config IEEE802154_PROTO_DEBUG ++ bool "IEEE 802.15.4 protocol stack debugging messages" ++ depends on IEEE802154 ++ default y ++ help ++ Say Y here to make the IEEE 802.15.4 protocol stack generate ++ extensive debugging messages. +diff --git a/net/ieee802154/Makefile b/net/ieee802154/Makefile +index d7716d6..e2b6735 100644 +--- a/net/ieee802154/Makefile ++++ b/net/ieee802154/Makefile +@@ -3,3 +3,6 @@ obj-$(CONFIG_IEEE802154_6LOWPAN) += 6lowpan.o + + ieee802154-y := netlink.o nl-mac.o nl-phy.o nl_policy.o wpan-class.o + af_802154-y := af_ieee802154.o raw.o dgram.o ++ ++ccflags-$(CONFIG_IEEE802154_PROTO_DEBUG) += -DDEBUG ++ccflags-y += -Wall +diff --git a/net/ieee802154/dgram.c b/net/ieee802154/dgram.c +index 1b09eaa..7883fa6 100644 +--- a/net/ieee802154/dgram.c ++++ b/net/ieee802154/dgram.c +@@ -130,8 +130,7 @@ static int dgram_ioctl(struct sock *sk, int cmd, unsigned long arg) + switch (cmd) { + case SIOCOUTQ: + { +- int amount = sk_wmem_alloc_get(sk); +- ++ int amount = atomic_read(&sk->sk_wmem_alloc); + return put_user(amount, (int __user *)arg); + } + +diff --git a/net/ieee802154/ieee802154.h b/net/ieee802154/ieee802154.h +index aadec42..e78d6c6 100644 +--- a/net/ieee802154/ieee802154.h ++++ b/net/ieee802154/ieee802154.h +@@ -21,6 +21,10 @@ + int __init ieee802154_nl_init(void); + void __exit ieee802154_nl_exit(void); + ++#include <net/netlink.h> ++ ++extern const struct nla_policy ieee802154_policy[]; ++ + #define IEEE802154_OP(_cmd, _func) \ + { \ + .cmd = _cmd, \ +diff --git a/net/ieee802154/nl-mac.c b/net/ieee802154/nl-mac.c +index adaf462..1d23aa6 100644 +--- a/net/ieee802154/nl-mac.c ++++ b/net/ieee802154/nl-mac.c +@@ -263,7 +263,7 @@ static int ieee802154_nl_fill_iface(struct sk_buff *msg, u32 pid, + if (!hdr) + goto out; + +- phy = ieee802154_mlme_ops(dev)->get_phy(dev); ++ phy = simple_mlme_ops(dev)->get_phy(dev); + BUG_ON(!phy); + + NLA_PUT_STRING(msg, IEEE802154_ATTR_DEV_NAME, dev->name); +diff --git a/net/ieee802154/nl-phy.c b/net/ieee802154/nl-phy.c +index c64a38d..76ef7a3 100644 +--- a/net/ieee802154/nl-phy.c ++++ b/net/ieee802154/nl-phy.c +@@ -57,7 +57,7 @@ static int ieee802154_nl_fill_phy(struct sk_buff *msg, u32 pid, + + NLA_PUT_U8(msg, IEEE802154_ATTR_PAGE, phy->current_page); + NLA_PUT_U8(msg, IEEE802154_ATTR_CHANNEL, phy->current_channel); +- for (i = 0; i < 32; i++) { ++ for (i = 0; i < WPAN_NUM_PAGES; i++) { + if (phy->channels_supported[i]) + buf[pages++] = phy->channels_supported[i] | (i << 27); + } +@@ -179,6 +179,7 @@ static int ieee802154_add_iface(struct sk_buff *skb, + const char *devname; + int rc = -ENOBUFS; + struct net_device *dev; ++ int type = IEEE802154_DEV_WPAN; + + pr_debug("%s\n", __func__); + +@@ -201,6 +202,19 @@ static int ieee802154_add_iface(struct sk_buff *skb, + if (strlen(devname) >= IFNAMSIZ) + return -ENAMETOOLONG; + ++ if (info->attrs[IEEE802154_ATTR_HW_ADDR] && ++ nla_len(info->attrs[IEEE802154_ATTR_HW_ADDR]) != ++ IEEE802154_ADDR_LEN) { ++ return -EINVAL; ++ } ++ ++ if (info->attrs[IEEE802154_ATTR_DEV_TYPE]) { ++ type = nla_get_u8(info->attrs[IEEE802154_ATTR_DEV_TYPE]); ++ if (type > __IEEE802154_DEV_MAX) { ++ return -EINVAL; ++ } ++ } ++ + phy = wpan_phy_find(name); + if (!phy) + return -ENODEV; +@@ -221,7 +235,7 @@ static int ieee802154_add_iface(struct sk_buff *skb, + goto nla_put_failure; + } + +- dev = phy->add_iface(phy, devname); ++ dev = phy->add_iface(phy, devname, type); + if (IS_ERR(dev)) { + rc = PTR_ERR(dev); + goto nla_put_failure; +@@ -288,7 +302,7 @@ static int ieee802154_del_iface(struct sk_buff *skb, + if (!dev) + return -ENODEV; + +- phy = ieee802154_mlme_ops(dev)->get_phy(dev); ++ phy = simple_mlme_ops(dev)->get_phy(dev); + BUG_ON(!phy); + + rc = -EINVAL; +diff --git a/net/ieee802154/nl_policy.c b/net/ieee802154/nl_policy.c +index 6adda4d..235cd65 100644 +--- a/net/ieee802154/nl_policy.c ++++ b/net/ieee802154/nl_policy.c +@@ -28,6 +28,7 @@ const struct nla_policy ieee802154_policy[IEEE802154_ATTR_MAX + 1] = { + [IEEE802154_ATTR_DEV_NAME] = { .type = NLA_STRING, }, + [IEEE802154_ATTR_DEV_INDEX] = { .type = NLA_U32, }, + [IEEE802154_ATTR_PHY_NAME] = { .type = NLA_STRING, }, ++ [IEEE802154_ATTR_DEV_TYPE] = { .type = NLA_U8, }, + + [IEEE802154_ATTR_STATUS] = { .type = NLA_U8, }, + [IEEE802154_ATTR_SHORT_ADDR] = { .type = NLA_U16, }, +diff --git a/net/ieee802154/wpan-class.c b/net/ieee802154/wpan-class.c +index 1627ef2..380fe1a 100644 +--- a/net/ieee802154/wpan-class.c ++++ b/net/ieee802154/wpan-class.c +@@ -56,7 +56,7 @@ static ssize_t channels_supported_show(struct device *dev, + int i, len = 0; + + mutex_lock(&phy->pib_lock); +- for (i = 0; i < 32; i++) { ++ for (i = 0; i < WPAN_NUM_PAGES; i++) { + ret = snprintf(buf + len, PAGE_SIZE - len, + "%#09x\n", phy->channels_supported[i]); + if (ret < 0) +-- +1.7.9.5 + -- 1.7.9.5 _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/mailman/listinfo/openwrt-devel
