diff options
author | stefan@datenfreihafen.org <stefan@datenfreihafen.org> | 2013-03-26 08:41:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-03-27 00:52:07 -0400 |
commit | 1486774d69f6e58da16cdae8f17c77ec6569f711 (patch) | |
tree | bf638b091591f03853c1b0e8e37e2ef5f8c0f520 /drivers/net/ieee802154 | |
parent | 6364e6ee788ae60f1c2de5c59e39adb157327e6c (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.c | 47 |
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 | ||
622 | static int | ||
623 | at86rf230_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 | |||
622 | static struct ieee802154_ops at86rf230_ops = { | 668 | static 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 | ||
631 | static void at86rf230_irqwork(struct work_struct *work) | 678 | static void at86rf230_irqwork(struct work_struct *work) |