at86rf230: restore trx len when needed
authorAlexander Aring <alex.aring@gmail.com>
Sun, 1 Mar 2015 20:55:33 +0000 (21:55 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 3 Mar 2015 01:15:25 +0000 (02:15 +0100)
In the most cases the spi messages has a length of two. Currently we
always set the the len field to two before transmit a spi message. In
cases for read out/write in the frame buffer we need another len. This
patch use trx len two as default. For the frame buffer cases we restore
the trx len to two on success and failure. This will reduce the len
setting of two when it's already two.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/net/ieee802154/at86rf230.c

index 216c80c3532ccd8774e0b58e5a891479fb1b03e4..088fa68f5098322dc465244575025736e922f9af 100644 (file)
@@ -478,7 +478,6 @@ at86rf230_async_read_reg(struct at86rf230_local *lp, const u8 reg,
        u8 *tx_buf = ctx->buf;
 
        tx_buf[0] = (reg & CMD_REG_MASK) | CMD_REG;
-       ctx->trx.len = 2;
        ctx->msg.complete = complete;
        ctx->irq_enable = irq_enable;
        rc = spi_async(lp->spi, &ctx->msg);
@@ -663,7 +662,6 @@ at86rf230_async_state_change_start(void *context)
         */
        buf[0] = (RG_TRX_STATE & CMD_REG_MASK) | CMD_REG | CMD_WRITE;
        buf[1] = ctx->to_state;
-       ctx->trx.len = 2;
        ctx->msg.complete = at86rf230_async_state_delay;
        rc = spi_async(lp->spi, &ctx->msg);
        if (rc) {
@@ -799,6 +797,7 @@ at86rf230_rx_read_frame_complete(void *context)
        lqi = buf[2 + len];
 
        memcpy(rx_local_buf, buf + 2, len);
+       ctx->trx.len = 2;
        enable_irq(ctx->irq);
 
        skb = dev_alloc_skb(IEEE802154_MTU);
@@ -824,6 +823,7 @@ at86rf230_rx_read_frame(void *context)
        ctx->msg.complete = at86rf230_rx_read_frame_complete;
        rc = spi_async(lp->spi, &ctx->msg);
        if (rc) {
+               ctx->trx.len = 2;
                enable_irq(ctx->irq);
                at86rf230_async_error(lp, ctx, rc);
        }
@@ -893,7 +893,6 @@ static irqreturn_t at86rf230_isr(int irq, void *data)
        disable_irq_nosync(irq);
 
        buf[0] = (RG_IRQ_STATUS & CMD_REG_MASK) | CMD_REG;
-       ctx->trx.len = 2;
        ctx->msg.complete = at86rf230_irq_status;
        rc = spi_async(lp->spi, &ctx->msg);
        if (rc) {
@@ -941,8 +940,10 @@ at86rf230_write_frame(void *context)
        ctx->trx.len = skb->len + 2;
        ctx->msg.complete = at86rf230_write_frame_complete;
        rc = spi_async(lp->spi, &ctx->msg);
-       if (rc)
+       if (rc) {
+               ctx->trx.len = 2;
                at86rf230_async_error(lp, ctx, rc);
+       }
 }
 
 static void
@@ -1541,6 +1542,7 @@ at86rf230_setup_spi_messages(struct at86rf230_local *lp)
        lp->state.irq = lp->spi->irq;
        spi_message_init(&lp->state.msg);
        lp->state.msg.context = &lp->state;
+       lp->state.trx.len = 2;
        lp->state.trx.tx_buf = lp->state.buf;
        lp->state.trx.rx_buf = lp->state.buf;
        spi_message_add_tail(&lp->state.trx, &lp->state.msg);
@@ -1549,6 +1551,7 @@ at86rf230_setup_spi_messages(struct at86rf230_local *lp)
        lp->irq.irq = lp->spi->irq;
        spi_message_init(&lp->irq.msg);
        lp->irq.msg.context = &lp->irq;
+       lp->irq.trx.len = 2;
        lp->irq.trx.tx_buf = lp->irq.buf;
        lp->irq.trx.rx_buf = lp->irq.buf;
        spi_message_add_tail(&lp->irq.trx, &lp->irq.msg);
@@ -1557,6 +1560,7 @@ at86rf230_setup_spi_messages(struct at86rf230_local *lp)
        lp->tx.irq = lp->spi->irq;
        spi_message_init(&lp->tx.msg);
        lp->tx.msg.context = &lp->tx;
+       lp->tx.trx.len = 2;
        lp->tx.trx.tx_buf = lp->tx.buf;
        lp->tx.trx.rx_buf = lp->tx.buf;
        spi_message_add_tail(&lp->tx.trx, &lp->tx.msg);