On 03/24/2013 09:40 AM, Stefan Schmidt wrote:
> 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 <[email protected]>
> ---
> 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();
There's nothing in this function that _explicitly_ sleeps. The SPI
functions will sleep, but those functions will themselves call
might_sleep(), so I don't think it's appropriate to do here.
> +
> + 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;
> +}
Some of those lines break the 80 column rule. You might get away with
it. It's up to you if you want to try.
> +
> 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)
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel