aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ieee802154
diff options
context:
space:
mode:
authorstefan@datenfreihafen.org <stefan@datenfreihafen.org>2013-03-26 08:41:30 -0400
committerDavid S. Miller <davem@davemloft.net>2013-03-27 00:52:07 -0400
commit1486774d69f6e58da16cdae8f17c77ec6569f711 (patch)
treebf638b091591f03853c1b0e8e37e2ef5f8c0f520 /drivers/net/ieee802154
parent6364e6ee788ae60f1c2de5c59e39adb157327e6c (diff)
ieee802154/at86rf230: Implement hardware address filter callback.
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 <stefan@datenfreihafen.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ieee802154')
-rw-r--r--drivers/net/ieee802154/at86rf230.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c
index fc1687ea4a42..2ff1f204af8d 100644
--- a/drivers/net/ieee802154/at86rf230.c
+++ b/drivers/net/ieee802154/at86rf230.c
@@ -619,6 +619,52 @@ err:
619 return -EINVAL; 619 return -EINVAL;
620} 620}
621 621
622static int
623at86rf230_set_hw_addr_filt(struct ieee802154_dev *dev,
624 struct ieee802154_hw_addr_filt *filt,
625 unsigned long changed)
626{
627 struct at86rf230_local *lp = dev->priv;
628
629 if (changed & IEEE802515_AFILT_SADDR_CHANGED) {
630 dev_vdbg(&lp->spi->dev,
631 "at86rf230_set_hw_addr_filt called for saddr\n");
632 __at86rf230_write(lp, RG_SHORT_ADDR_0, filt->short_addr);
633 __at86rf230_write(lp, RG_SHORT_ADDR_1, filt->short_addr >> 8);
634 }
635
636 if (changed & IEEE802515_AFILT_PANID_CHANGED) {
637 dev_vdbg(&lp->spi->dev,
638 "at86rf230_set_hw_addr_filt called for pan id\n");
639 __at86rf230_write(lp, RG_PAN_ID_0, filt->pan_id);
640 __at86rf230_write(lp, RG_PAN_ID_1, filt->pan_id >> 8);
641 }
642
643 if (changed & IEEE802515_AFILT_IEEEADDR_CHANGED) {
644 dev_vdbg(&lp->spi->dev,
645 "at86rf230_set_hw_addr_filt called for IEEE addr\n");
646 at86rf230_write_subreg(lp, SR_IEEE_ADDR_0, filt->ieee_addr[7]);
647 at86rf230_write_subreg(lp, SR_IEEE_ADDR_1, filt->ieee_addr[6]);
648 at86rf230_write_subreg(lp, SR_IEEE_ADDR_2, filt->ieee_addr[5]);
649 at86rf230_write_subreg(lp, SR_IEEE_ADDR_3, filt->ieee_addr[4]);
650 at86rf230_write_subreg(lp, SR_IEEE_ADDR_4, filt->ieee_addr[3]);
651 at86rf230_write_subreg(lp, SR_IEEE_ADDR_5, filt->ieee_addr[2]);
652 at86rf230_write_subreg(lp, SR_IEEE_ADDR_6, filt->ieee_addr[1]);
653 at86rf230_write_subreg(lp, SR_IEEE_ADDR_7, filt->ieee_addr[0]);
654 }
655
656 if (changed & IEEE802515_AFILT_PANC_CHANGED) {
657 dev_vdbg(&lp->spi->dev,
658 "at86rf230_set_hw_addr_filt called for panc change\n");
659 if (filt->pan_coord)
660 at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 1);
661 else
662 at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 0);
663 }
664
665 return 0;
666}
667
622static struct ieee802154_ops at86rf230_ops = { 668static struct ieee802154_ops at86rf230_ops = {
623 .owner = THIS_MODULE, 669 .owner = THIS_MODULE,
624 .xmit = at86rf230_xmit, 670 .xmit = at86rf230_xmit,
@@ -626,6 +672,7 @@ static struct ieee802154_ops at86rf230_ops = {
626 .set_channel = at86rf230_channel, 672 .set_channel = at86rf230_channel,
627 .start = at86rf230_start, 673 .start = at86rf230_start,
628 .stop = at86rf230_stop, 674 .stop = at86rf230_stop,
675 .set_hw_addr_filt = at86rf230_set_hw_addr_filt,
629}; 676};
630 677
631static void at86rf230_irqwork(struct work_struct *work) 678static void at86rf230_irqwork(struct work_struct *work)