On Tue, Mar 12, 2013 at 06:24:48PM -0400, Alan Ott wrote:
> On 03/12/2013 06:14 PM, Alexander Aring wrote:
> > Hi,
> >
> > On Tue, Mar 12, 2013 at 05:19:31PM -0400, Alan Ott wrote:
> >> On 02/23/2013 11:12 AM, Sascha Herrmann wrote:
> >>> If interrupt is configured to edge type, do not disable irq in the isr.
> >>> The at86rf230 resets the irq line only after the irq status register is
> >>> read. Disabling the irq can lock the driver in situations where a irq is
> >>> set by the radio while the driver is still reading the frame buffer.
> >>> Additional the irq filter register is set to filter out all unused
> >>> interrupts and the irq status register is read in the probe function to
> >>> clear the irq line.
> >>>
> >>> Signed-off-by: Sascha Herrmann <sas...@ps.nvbi.de>
> >>> ---
> >>>  drivers/net/ieee802154/at86rf230.c |   29 ++++++++++++++++-------------
> >>>  1 file changed, 16 insertions(+), 13 deletions(-)
> >>>
> >>> diff --git a/drivers/net/ieee802154/at86rf230.c 
> >>> b/drivers/net/ieee802154/at86rf230.c
> >>> index e892ec3..2abc8c7 100644
> >>> --- a/drivers/net/ieee802154/at86rf230.c
> >>> +++ b/drivers/net/ieee802154/at86rf230.c
> >>> @@ -31,6 +31,7 @@
> >>>  #include <linux/spi/spi.h>
> >>>  #include <linux/spi/at86rf230.h>
> >>>  #include <linux/skbuff.h>
> >>> +#include <linux/irq.h>
> >>>   #include <net/mac802154.h>
> >>>  #include <net/wpan-phy.h>
> >>> @@ -51,7 +52,7 @@ struct at86rf230_local {
> >>>   struct ieee802154_dev *dev;
> >>>           spinlock_t lock;
> >>> - bool irq_disabled;
> >>> + bool irq_busy;
> >>>   bool is_tx;
> >>>  };
> >>>  @@ -544,7 +545,7 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct 
> >>> sk_buff *skb)
> >>>   unsigned long flags;
> >>>           spin_lock(&lp->lock);
> >>> - if  (lp->irq_disabled) {
> >>> + if  (lp->irq_busy) {
> >>>           spin_unlock(&lp->lock);
> >>>           return -EBUSY;
> >>>   }
> >>> @@ -658,20 +659,22 @@ static void at86rf230_irqwork(struct work_struct 
> >>> *work)
> >>>   }
> >>>           spin_lock_irqsave(&lp->lock, flags);
> >>> - lp->irq_disabled = 0;
> >>> + lp->irq_busy = 0;
> >>>   spin_unlock_irqrestore(&lp->lock, flags);
> >>>  -        enable_irq(lp->spi->irq);
> >>> + if (!(lp->irq_type & IRQ_TYPE_EDGE_BOTH))
> >>> +         enable_irq(lp->spi->irq);
> >>>  }
> >>>   static irqreturn_t at86rf230_isr(int irq, void *data)
> >>>  {
> >>>   struct at86rf230_local *lp = data;
> >>>  -        disable_irq_nosync(irq);
> >>> + if (!(lp->irq_type & IRQ_TYPE_EDGE_BOTH))
> >>> +         disable_irq_nosync(irq);
> >>>           spin_lock(&lp->lock);
> >>> - lp->irq_disabled = 1;
> >>> + lp->irq_busy = 1;
> >>>   spin_unlock(&lp->lock);
> >>>           schedule_work(&lp->irqwork);
> >>> @@ -701,12 +704,7 @@ static int at86rf230_hw_init(struct at86rf230_local 
> >>> *lp)
> >>>           dev_info(&lp->spi->dev, "Status: %02x\n", status);
> >>>   }
> >>>  -        rc = at86rf230_write_subreg(lp, SR_IRQ_MASK, 0xff); /* 
> >>> IRQ_TRX_UR |
> >>> -                                                      * IRQ_CCA_ED |
> >>> -                                                      * IRQ_TRX_END |
> >>> -                                                      * IRQ_PLL_UNL |
> >>> -                                                      * IRQ_PLL_LOCK
> >>> -                                                      */
> >>> + rc = at86rf230_write_subreg(lp, SR_IRQ_MASK, IRQ_TRX_END);
> >>>   if (rc)
> >>>           return rc;
> >>>  @@ -773,7 +771,7 @@ static int at86rf230_probe(struct spi_device *spi)
> >>>  {
> >>>   struct ieee802154_dev *dev;
> >>>   struct at86rf230_local *lp;
> >>> - u8 man_id_0, man_id_1;
> >>> + u8 man_id_0, man_id_1, status;
> >>>   int rc;
> >>>   const char *chip;
> >>>   int supported = 0;
> >>> @@ -893,6 +891,11 @@ static int at86rf230_probe(struct spi_device *spi)
> >>>   if (rc)
> >>>           goto err_gpio_dir;
> >>>  +        /* Read irq status register to reset irq line */
> >>> + rc = at86rf230_read_subreg(lp, RG_IRQ_STATUS, 0xff, 0, &status);
> >>> + if (rc)
> >>> +         goto err_irq;
> >>> +
> >>>   rc = ieee802154_register_device(lp->dev);
> >>>   if (rc)
> >>>           goto err_irq;
> >> There are quite a few + and - lines which lead with a stray space.
> >>
> >> Can anyone else here test this? Any other at86rf230 users? Alex, do you
> >> have any time to give this a go?
> >>
> > That will be some difficult... I use a at86rf230 which is controlled by
> > a microcontoller which has a spi<=>usb bridge. I modified this driver
> > myself to get this working with spi<=>usb bridge(not ready for
> > mainline yet).
> 
> What I mean is that it would be nice if someone else could test to make
> sure that your new code doesn't break their setup. Really, it's just a
> nice-to-have, since not many people are using this stuff anyway.
> 
> > I have a spi at86rf230 on a beaglebone at spi connected, but I can only
> > test if breaks hardware or not. I have no equipment to debug it completely.
> > I can check if I can communicate from beaglebone(with spi at86rf230
> > connected) to one of my (spi<=>usb bridge) at86rf230.
> > Let me know if that is okay for you.
> 
> It's not up to me really, but that's also a good test, since it's not
> using any usb-spi funny-business. Are you using 3.8 on BeagleBone?
>

No, I using 3.7 on beaglebone with no usb-spi funny-business. :-)

Alex

------------------------------------------------------------------------------
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