Alexander Smirnov wrote:
> > +       synchronize_irq(lp->spi->irq);
> > +       flush_work(&lp->irqwork);
> >
> 
> Could you please explain why we need these flush and sync?

synchronize_irq is for the case that an RX interrupt occurred before
leaving RX_ON, and the interrupt handler has not reached schedule_work
by the time we flush_work. If that interrupt was allowed to run after
flush_work (or somewhere in the middle of it), it would lead to the
work to be scheduled, thus invalidating the assertion that no work is
pending after flush_work.

This is admittedly an unlikely scenario on "normal" hardware. Not sure
how things like SMT can affect the relative speed of concurrent
execution, though.

flush_work is for the case that we got an RX interrupt before leaving
RX_ON, scheduling the work, but the worker hasn't executed yet. This
could now happen on a number of occasions. If it happens before the
transmission completes, it could cause us to try to enter RX_ON while
still in BUSY_TX, with an uncertain outcome.

> As I understand, now we are unprotected from RX interrupts, but lp->is_tx is
> still '1'. What will happen?

Oh, sorry. I forgot to move the is_tx. I'll send a patch in my next
mail.

I found another bug in my patch: we also need to go through the whole
synchronize_irq and flush_work ritual if
wait_for_completion_interruptible is interrupted, to prevent a pending
TRX_END from being interpreted as signaling an incoming frame.

Atmel could have made all this a lot easier by giving TX and RX
separate interrupt bits :)

> 
> 
> > +       if (!rc)
> > +               rc = rc2;
> >  err:
> > -       pr_err("%s error: %d\n", __func__, rc);
> > -       spin_lock_irqsave(&lp->lock, flags);
> > +       if (rc)
> > +               pr_err("%s error: %d\n", __func__, rc);
> >
> 
> For me such an error handling isn't too clear, we received an error status,
> then we do something, then print message...
> May be it will be better to keep current logic: if something fails - goto
> error_label and finish function instead of continue execution.

The intent here is not to continue as if nothing was wrong, but to
return to a valid state and report the first error that happened.

But before going into details, I have a more fundamental question:
under what circumstances is the wait_for_completion_interruptible
supposed to be interrupted ?

I'm a bit uncertain about the general error model in the driver.
E.g., at86rf230_state will bemoan a failed transition but doesn't
do anything to rectify the problem. Should it ? If not, who does ?

Also, what is the assumption of the nature of errors ? Driver bugs ?
Intermittent SPI problems ? Someone removing the transceiver during
operation ?

- Werner

------------------------------------------------------------------------------
Simplify data backup and recovery for your virtual environment with vRanger.
Installation's a snap, and flexible recovery options mean your data is safe,
secure and there when you need it. Data protection magic?
Nope - It's vRanger. Get your free trial download today.
http://p.sf.net/sfu/quest-sfdev2dev
_______________________________________________
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel

Reply via email to