ieee802154: introduce wpan_phy_supported
authorAlexander Aring <alex.aring@gmail.com>
Sun, 17 May 2015 19:44:42 +0000 (21:44 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 19 May 2015 09:44:42 +0000 (11:44 +0200)
This patch introduce the wpan_phy_supported struct for wpan_phy. There
is currently no way to check if a transceiver can handle IEEE 802.15.4
complaint values. With this struct we can check before if the
transceiver supports these values before sending to driver layer.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Suggested-by: Phoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de>
Acked-by: Varka Bhadram <varkabhadram@gmail.com>
Cc: Alan Ott <alan@signal11.us>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/net/ieee802154/at86rf230.c
drivers/net/ieee802154/cc2520.c
drivers/net/ieee802154/fakelb.c
drivers/net/ieee802154/mrf24j40.c
include/net/cfg802154.h
net/ieee802154/nl-phy.c
net/ieee802154/nl802154.c

index e68d45ed622e952a3bae9937c57fa33de774ff72..151d57f4320ddf136027a4f795d2e02c0e785466 100644 (file)
@@ -1579,7 +1579,7 @@ at86rf230_detect_device(struct at86rf230_local *lp)
        case 3:
                chip = "at86rf231";
                lp->data = &at86rf231_data;
-               lp->hw->phy->channels_supported[0] = 0x7FFF800;
+               lp->hw->phy->supported.channels[0] = 0x7FFF800;
                lp->hw->phy->current_channel = 11;
                lp->hw->phy->symbol_duration = 16;
                break;
@@ -1587,15 +1587,15 @@ at86rf230_detect_device(struct at86rf230_local *lp)
                chip = "at86rf212";
                lp->data = &at86rf212_data;
                lp->hw->flags |= IEEE802154_HW_LBT;
-               lp->hw->phy->channels_supported[0] = 0x00007FF;
-               lp->hw->phy->channels_supported[2] = 0x00007FF;
+               lp->hw->phy->supported.channels[0] = 0x00007FF;
+               lp->hw->phy->supported.channels[2] = 0x00007FF;
                lp->hw->phy->current_channel = 5;
                lp->hw->phy->symbol_duration = 25;
                break;
        case 11:
                chip = "at86rf233";
                lp->data = &at86rf233_data;
-               lp->hw->phy->channels_supported[0] = 0x7FFF800;
+               lp->hw->phy->supported.channels[0] = 0x7FFF800;
                lp->hw->phy->current_channel = 13;
                lp->hw->phy->symbol_duration = 16;
                break;
index f833b8bb66634ed0e6057235785c67e7c072f4b7..84b28a05c5a14a289c489d0064c70a637d450b57 100644 (file)
@@ -653,7 +653,7 @@ static int cc2520_register(struct cc2520_private *priv)
        ieee802154_random_extended_addr(&priv->hw->phy->perm_extended_addr);
 
        /* We do support only 2.4 Ghz */
-       priv->hw->phy->channels_supported[0] = 0x7FFF800;
+       priv->hw->phy->supported.channels[0] = 0x7FFF800;
        priv->hw->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AACK |
                          IEEE802154_HW_AFILT;
 
index dc2bfb600b4bd491a8bc2a41e12e84a87e1bff77..91bbf030a443d95b263ee80f2417245088102096 100644 (file)
@@ -149,35 +149,35 @@ static int fakelb_add_one(struct device *dev, struct fakelb_priv *fake)
        priv->hw = hw;
 
        /* 868 MHz BPSK 802.15.4-2003 */
-       hw->phy->channels_supported[0] |= 1;
+       hw->phy->supported.channels[0] |= 1;
        /* 915 MHz BPSK 802.15.4-2003 */
-       hw->phy->channels_supported[0] |= 0x7fe;
+       hw->phy->supported.channels[0] |= 0x7fe;
        /* 2.4 GHz O-QPSK 802.15.4-2003 */
-       hw->phy->channels_supported[0] |= 0x7FFF800;
+       hw->phy->supported.channels[0] |= 0x7FFF800;
        /* 868 MHz ASK 802.15.4-2006 */
-       hw->phy->channels_supported[1] |= 1;
+       hw->phy->supported.channels[1] |= 1;
        /* 915 MHz ASK 802.15.4-2006 */
-       hw->phy->channels_supported[1] |= 0x7fe;
+       hw->phy->supported.channels[1] |= 0x7fe;
        /* 868 MHz O-QPSK 802.15.4-2006 */
-       hw->phy->channels_supported[2] |= 1;
+       hw->phy->supported.channels[2] |= 1;
        /* 915 MHz O-QPSK 802.15.4-2006 */
-       hw->phy->channels_supported[2] |= 0x7fe;
+       hw->phy->supported.channels[2] |= 0x7fe;
        /* 2.4 GHz CSS 802.15.4a-2007 */
-       hw->phy->channels_supported[3] |= 0x3fff;
+       hw->phy->supported.channels[3] |= 0x3fff;
        /* UWB Sub-gigahertz 802.15.4a-2007 */
-       hw->phy->channels_supported[4] |= 1;
+       hw->phy->supported.channels[4] |= 1;
        /* UWB Low band 802.15.4a-2007 */
-       hw->phy->channels_supported[4] |= 0x1e;
+       hw->phy->supported.channels[4] |= 0x1e;
        /* UWB High band 802.15.4a-2007 */
-       hw->phy->channels_supported[4] |= 0xffe0;
+       hw->phy->supported.channels[4] |= 0xffe0;
        /* 750 MHz O-QPSK 802.15.4c-2009 */
-       hw->phy->channels_supported[5] |= 0xf;
+       hw->phy->supported.channels[5] |= 0xf;
        /* 750 MHz MPSK 802.15.4c-2009 */
-       hw->phy->channels_supported[5] |= 0xf0;
+       hw->phy->supported.channels[5] |= 0xf0;
        /* 950 MHz BPSK 802.15.4d-2009 */
-       hw->phy->channels_supported[6] |= 0x3ff;
+       hw->phy->supported.channels[6] |= 0x3ff;
        /* 950 MHz GFSK 802.15.4d-2009 */
-       hw->phy->channels_supported[6] |= 0x3ffc00;
+       hw->phy->supported.channels[6] |= 0x3ffc00;
 
        INIT_LIST_HEAD(&priv->list);
        priv->fake = fake;
index fba2dfd910f7372b2aedc355039cc71e2433c008..f2a1bd122a74b4032e7feb997a36652c9683905c 100644 (file)
@@ -750,7 +750,7 @@ static int mrf24j40_probe(struct spi_device *spi)
 
        devrec->hw->priv = devrec;
        devrec->hw->parent = &devrec->spi->dev;
-       devrec->hw->phy->channels_supported[0] = CHANNEL_MASK;
+       devrec->hw->phy->supported.channels[0] = CHANNEL_MASK;
        devrec->hw->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AACK |
                            IEEE802154_HW_AFILT;
 
index 9ced2c9fdbfc8fed7bd95ee619b54af4ce45cdc0..1941d7a79219e8cc99d6d54c7ebdcf3a329819fa 100644 (file)
@@ -61,6 +61,10 @@ struct cfg802154_ops {
                                struct wpan_dev *wpan_dev, bool mode);
 };
 
+struct wpan_phy_supported {
+       u32 channels[IEEE802154_MAX_PAGE + 1];
+};
+
 struct wpan_phy_cca {
        enum nl802154_cca_modes mode;
        enum nl802154_cca_opts opt;
@@ -84,7 +88,7 @@ struct wpan_phy {
         */
        u8 current_channel;
        u8 current_page;
-       u32 channels_supported[IEEE802154_MAX_PAGE + 1];
+       struct wpan_phy_supported supported;
        /* current transmit_power in mBm */
        s32 transmit_power;
        struct wpan_phy_cca cca;
index 346c6665d25e59bf372bacedc5a2ae6df30d227c..cbc0d09351e09c030e458079bc1b6316e3dac7ac 100644 (file)
@@ -56,8 +56,8 @@ static int ieee802154_nl_fill_phy(struct sk_buff *msg, u32 portid,
            nla_put_u8(msg, IEEE802154_ATTR_CHANNEL, phy->current_channel))
                goto nla_put_failure;
        for (i = 0; i < 32; i++) {
-               if (phy->channels_supported[i])
-                       buf[pages++] = phy->channels_supported[i] | (i << 27);
+               if (phy->supported.channels[i])
+                       buf[pages++] = phy->supported.channels[i] | (i << 27);
        }
        if (pages &&
            nla_put(msg, IEEE802154_ATTR_CHANNEL_PAGE_LIST,
index f3185c71af10c263a57c4d9730ff4f4899bf777d..d271879a21741384fcf32985c5232642556ed873 100644 (file)
@@ -248,7 +248,7 @@ nl802154_send_wpan_phy_channels(struct cfg802154_registered_device *rdev,
 
        for (page = 0; page <= IEEE802154_MAX_PAGE; page++) {
                if (nla_put_u32(msg, NL802154_ATTR_SUPPORTED_CHANNEL,
-                               rdev->wpan_phy.channels_supported[page]))
+                               rdev->wpan_phy.supported.channels[page]))
                        return -ENOBUFS;
        }
        nla_nest_end(msg, nl_page);
@@ -626,7 +626,7 @@ static int nl802154_set_channel(struct sk_buff *skb, struct genl_info *info)
 
        /* check 802.15.4 constraints */
        if (page > IEEE802154_MAX_PAGE || channel > IEEE802154_MAX_CHANNEL ||
-           !(rdev->wpan_phy.channels_supported[page] & BIT(channel)))
+           !(rdev->wpan_phy.supported.channels[page] & BIT(channel)))
                return -EINVAL;
 
        return rdev_set_channel(rdev, page, channel);