at86rf230_state expects the number of the final state to be equal to
the number of the state change command. This is not true for commands
that force a state change, such as STATE_FORCE_TRX_OFF and
STATE_FORCE_TX_ON.

at86rf230_state would thus erroneously return an error, which caused
at86rf230_xmit to exit before sending the frame.

This patch separates the state change command passed to at86rf230_state
from the final state.

- at86rf230.c (at86rf230_state): separate state change command and final
  state, since not all commands lead to a state with the same number
- at86rf230.c (at86rf230_start, at86rf230_stop, at86rf230_xmit): updated
  for new use of at86rf230_state

Signed-off-by: Werner Almesberger <wer...@almesberger.net>

---
 drivers/ieee802154/at86rf230.c |   16 ++++++++--------
 1 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/ieee802154/at86rf230.c b/drivers/ieee802154/at86rf230.c
index 5c01561..ad7e432 100644
--- a/drivers/ieee802154/at86rf230.c
+++ b/drivers/ieee802154/at86rf230.c
@@ -440,7 +440,7 @@ at86rf230_ed(struct ieee802154_dev *dev, u8 *level)
 }
 
 static int
-at86rf230_state(struct ieee802154_dev *dev, int state)
+at86rf230_state(struct ieee802154_dev *dev, int cmd, int state)
 {
        struct at86rf230_local *lp = dev->priv;
        int rc;
@@ -459,8 +459,8 @@ at86rf230_state(struct ieee802154_dev *dev, int state)
        if (val == state)
                return 0;
 
-       /* state is equal to phy states */
-       rc = at86rf230_write_subreg(lp, SR_TRX_CMD, state);
+       /* state is equal to phy states, except for "forced" transitions  */
+       rc = at86rf230_write_subreg(lp, SR_TRX_CMD, cmd);
        if (rc)
                goto err;
 
@@ -484,13 +484,13 @@ err:
 static int
 at86rf230_start(struct ieee802154_dev *dev)
 {
-       return at86rf230_state(dev, STATE_RX_ON);
+       return at86rf230_state(dev, STATE_RX_ON, STATE_RX_ON);
 }
 
 static void
 at86rf230_stop(struct ieee802154_dev *dev)
 {
-       at86rf230_state(dev, STATE_FORCE_TRX_OFF);
+       at86rf230_state(dev, STATE_FORCE_TRX_OFF, STATE_TRX_OFF);
 }
 
 static int
@@ -530,7 +530,7 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff 
*skb)
        INIT_COMPLETION(lp->tx_complete);
        spin_unlock_irqrestore(&lp->lock, flags);
 
-       rc = at86rf230_state(dev, STATE_FORCE_TX_ON);
+       rc = at86rf230_state(dev, STATE_FORCE_TX_ON, STATE_TX_ON);
        if (rc)
                goto err;
 
@@ -552,12 +552,12 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff 
*skb)
        if (rc < 0)
                goto err_rx;
 
-       rc = at86rf230_state(dev, STATE_RX_ON);
+       rc = at86rf230_state(dev, STATE_RX_ON, STATE_RX_ON);
 
        return rc;
 
 err_rx:
-       at86rf230_state(dev, STATE_RX_ON);
+       at86rf230_state(dev, STATE_RX_ON, STATE_RX_ON);
 err:
        spin_lock_irqsave(&lp->lock, flags);
        lp->is_tx = 0;
-- 
1.7.0.4


------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software 
be a part of the solution? Download the Intel(R) Manageability Checker 
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel

Reply via email to