Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

at86rf230: change trac status check behaviour

When transmit is done, indicated by trx_end irq, we do first a force
state change to TX_ON and then checking the trac status, if the trac
status is unequal zero we do a state change to TRX_OFF.

This patch changes to the following behaviour, we first check on trac
status after trx_end occurs and then doing a normal change to TX_ON
without do the state change to TRX_OFF when trac status is unequal zero.

The reasons are that the datasheet doesn't described when the trac
status register is cleared, we should doing to evaluate the trac status
at first. The reason to remove the TRX_OFF change if the trac status is
unequal to zero and it was force is the following paragraph inside The
at86rf2xx datasheets:

"Using FORCE_PLL_ON to interrupt an TX_ARET transaction, it is
recommended to check register bits [7:5] of register address 0x32 for
value 0. If this value is different, TRX_CMD sequence FORCE_TRX_OFF shall
be used immediately followed by TRX_CMD sequence PLL_ON. This performs a
state transition to PLL_ON."

The meaning is here "to interrupt an TX_ARET transaction" in case of
trx_end interrupt the "TX_ARET transaction" is already done and we don't
interrupt the "TX_ARET transaction" by doing the change to TX_ON (PLL_ON)
here. Additional I changed the force change to normal TX_ON which seems to
work here.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

authored by

Alexander Aring and committed by
Marcel Holtmann
346ce4bb a1d8d9a5

+4 -25
+4 -25
drivers/net/ieee802154/at86rf230.c
··· 667 667 { 668 668 struct at86rf230_state_change *ctx = context; 669 669 struct at86rf230_local *lp = ctx->lp; 670 - const u8 *buf = ctx->buf; 671 - const u8 trac = (buf[1] & 0xe0) >> 5; 672 670 673 - /* If trac status is different than zero we need to do a state change 674 - * to STATE_FORCE_TRX_OFF then STATE_RX_AACK_ON to recover the 675 - * transceiver. 676 - */ 677 - if (trac) 678 - at86rf230_async_state_change(lp, ctx, STATE_FORCE_TRX_OFF, 679 - at86rf230_tx_on, true); 680 - else 681 - at86rf230_tx_on(context); 682 - } 683 - 684 - static void 685 - at86rf230_tx_trac_status(void *context) 686 - { 687 - struct at86rf230_state_change *ctx = context; 688 - struct at86rf230_local *lp = ctx->lp; 689 - 690 - at86rf230_async_read_reg(lp, RG_TRX_STATE, ctx, 691 - at86rf230_tx_trac_check, true); 671 + at86rf230_async_state_change(lp, &lp->irq, STATE_TX_ON, 672 + at86rf230_tx_on, true); 692 673 } 693 674 694 675 static void ··· 739 758 { 740 759 if (lp->is_tx) { 741 760 lp->is_tx = 0; 742 - at86rf230_async_state_change(lp, &lp->irq, 743 - STATE_FORCE_TX_ON, 744 - at86rf230_tx_trac_status, 745 - true); 761 + at86rf230_async_read_reg(lp, RG_TRX_STATE, &lp->irq, 762 + at86rf230_tx_trac_check, true); 746 763 } else { 747 764 at86rf230_async_read_reg(lp, RG_TRX_STATE, &lp->irq, 748 765 at86rf230_rx_trac_check, true);