The ieee802154 long address was written into ram in the wrong order. The result
was that only frame with a given short address did pass the hardware address
recognition. This will already fail in the initial case when a node requests a
short address from the pan coordinator.

Also telling the stack that we are doing hardware acks to avoid warnings about
ack requested but not send frames.

Signed-off-by: Stefan Schmidt <ste...@datenfreihafen.org>
---
 drivers/ieee802154/cc2420.c |   22 ++++++++++++++++++----
 1 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/drivers/ieee802154/cc2420.c b/drivers/ieee802154/cc2420.c
index 8f4b177..b2fdd57 100644
--- a/drivers/ieee802154/cc2420.c
+++ b/drivers/ieee802154/cc2420.c
@@ -449,10 +449,20 @@ cc2420_set_hw_addr_filt(struct ieee802154_dev *dev,
 
        might_sleep();
 
-       if (changed & IEEE802515_IEEEADDR_CHANGED)
+       if (changed & IEEE802515_IEEEADDR_CHANGED) {
+               u8 ieee_addr[8];
+               ieee_addr[0] = filt->ieee_addr[7];
+               ieee_addr[1] = filt->ieee_addr[6];
+               ieee_addr[2] = filt->ieee_addr[5];
+               ieee_addr[3] = filt->ieee_addr[4];
+               ieee_addr[4] = filt->ieee_addr[3];
+               ieee_addr[5] = filt->ieee_addr[2];
+               ieee_addr[6] = filt->ieee_addr[1];
+               ieee_addr[7] = filt->ieee_addr[0];
                cc2420_write_ram(lp, CC2420_RAM_IEEEADR,
                                                 IEEE802154_ALEN,
-                                                filt->ieee_addr);
+                                                ieee_addr);
+       }
 
        if (changed & IEEE802515_SADDR_CHANGED) {
                u8 short_addr[2];
@@ -479,7 +489,7 @@ cc2420_set_hw_addr_filt(struct ieee802154_dev *dev,
                else
                        reg &= ~(1 << CC2420_MDMCTRL0_PANCRD);
                cc2420_write_16_bit_reg_partial(lp, CC2420_MDMCTRL0,
-                                                                               
reg, 1 << CC2420_MDMCTRL0_PANCRD);
+                                               reg, 1 << 
CC2420_MDMCTRL0_PANCRD);
        }
 
        return 0;
@@ -538,7 +548,7 @@ static int cc2420_register(struct cc2420_local *lp)
 
        /* We do support only 2.4 Ghz */
        lp->dev->phy->channels_supported[0] = 0x7FFF800;
-       lp->dev->flags = IEEE802154_HW_OMIT_CKSUM;
+       lp->dev->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AACK;
 
        dev_dbg(&lp->spi->dev, "registered cc2420\n");
        ret = ieee802154_register_device(lp->dev);
@@ -791,6 +801,10 @@ static int __devinit cc2420_probe(struct spi_device *spi)
                goto err_free_sfd_irq;
        }
 
+       dev_dbg(&lp->spi->dev, "Enable hardware AUTO ACK\n");
+        cc2420_write_16_bit_reg_partial(lp, CC2420_MDMCTRL0, 1 <<
+                                       CC2420_MDMCTRL0_AUTOACK, 1 << 
CC2420_MDMCTRL0_AUTOACK);
+
        dev_info(&lp->spi->dev, "Set fifo threshold to 127\n");
        cc2420_write_16_bit_reg_partial(lp, CC2420_IOCFG0, 127, 
CC2420_FIFOP_THR_MASK);
        ret = cc2420_register(lp);
-- 
1.7.5.4


------------------------------------------------------------------------------
EditLive Enterprise is the world's most technically advanced content
authoring tool. Experience the power of Track Changes, Inline Image
Editing and ensure content is compliant with Accessibility Checking.
http://p.sf.net/sfu/ephox-dev2dev
_______________________________________________
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel

Reply via email to