Implement the filter function to update short address, pan id and ieee
address on change. Allowing for hardware address filtering needed for
auto ACK.

Signed-off-by: Stefan Schmidt <ste...@datenfreihafen.org>
---
 drivers/net/ieee802154/at86rf230.c |   45 ++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/drivers/net/ieee802154/at86rf230.c 
b/drivers/net/ieee802154/at86rf230.c
index fc1687e..10e79a4 100644
--- a/drivers/net/ieee802154/at86rf230.c
+++ b/drivers/net/ieee802154/at86rf230.c
@@ -619,6 +619,50 @@ err:
        return -EINVAL;
 }
 
+static int
+at86rf230_set_hw_addr_filt(struct ieee802154_dev *dev,
+                                               struct ieee802154_hw_addr_filt 
*filt,
+                                               unsigned long changed)
+{
+       struct at86rf230_local *lp = dev->priv;
+
+       might_sleep();
+
+       if (changed & IEEE802515_AFILT_SADDR_CHANGED) {
+               dev_info(&lp->spi->dev, "at86rf230_set_hw_addr_filt called for 
saddr\n");
+               __at86rf230_write(lp, RG_SHORT_ADDR_0, filt->short_addr & 
0xff); /* LSB */
+               __at86rf230_write(lp, RG_SHORT_ADDR_1, (filt->short_addr >> 8) 
& 0xff); /* MSB */
+       }
+
+       if (changed & IEEE802515_AFILT_PANID_CHANGED) {
+               dev_info(&lp->spi->dev, "at86rf230_set_hw_addr_filt called for 
pan id\n");
+               __at86rf230_write(lp, RG_PAN_ID_0, filt->pan_id & 0xff); /* LSB 
*/
+               __at86rf230_write(lp, RG_PAN_ID_1, (filt->pan_id >> 8) & 0xff); 
/* MSB */
+       }
+
+       if (changed & IEEE802515_AFILT_IEEEADDR_CHANGED) {
+               dev_info(&lp->spi->dev, "at86rf230_set_hw_addr_filt called ieee 
addr\n");
+               at86rf230_write_subreg(lp, SR_IEEE_ADDR_0, filt->ieee_addr[7]);
+               at86rf230_write_subreg(lp, SR_IEEE_ADDR_1, filt->ieee_addr[6]);
+               at86rf230_write_subreg(lp, SR_IEEE_ADDR_2, filt->ieee_addr[5]);
+               at86rf230_write_subreg(lp, SR_IEEE_ADDR_3, filt->ieee_addr[4]);
+               at86rf230_write_subreg(lp, SR_IEEE_ADDR_4, filt->ieee_addr[3]);
+               at86rf230_write_subreg(lp, SR_IEEE_ADDR_5, filt->ieee_addr[2]);
+               at86rf230_write_subreg(lp, SR_IEEE_ADDR_6, filt->ieee_addr[1]);
+               at86rf230_write_subreg(lp, SR_IEEE_ADDR_7, filt->ieee_addr[0]);
+       }
+
+       if (changed & IEEE802515_AFILT_PANC_CHANGED) {
+               dev_info(&lp->spi->dev, "at86rf230_set_hw_addr_filt called panc 
change\n");
+               if (filt->pan_coord)
+                       at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 1);
+               else
+                       at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 0);
+       }
+
+       return 0;
+}
+
 static struct ieee802154_ops at86rf230_ops = {
        .owner = THIS_MODULE,
        .xmit = at86rf230_xmit,
@@ -626,6 +670,7 @@ static struct ieee802154_ops at86rf230_ops = {
        .set_channel = at86rf230_channel,
        .start = at86rf230_start,
        .stop = at86rf230_stop,
+       .set_hw_addr_filt = at86rf230_set_hw_addr_filt,
 };
 
 static void at86rf230_irqwork(struct work_struct *work)
-- 
1.7.10.4


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_mar
_______________________________________________
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel

Reply via email to