Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba6d2239 authored by Alexander Aring's avatar Alexander Aring Committed by Marcel Holtmann
Browse files

at86rf230: add transmit retry support



This patch introduce a transmit retry handling into at86rf230 transmit
path. Current behaviour is to wait the normal receive time if we want
to go into STATE_TX_ON when the transceiver is in STATE_BUSY_RX_AACK
which indicates that a frame is currently receiving. A non force state
change will not interrupt the the receiving state.

The current behaviour is that after the normal receive time we will
start a force change into STATE_TX_ON. With this patch we do seven
retries to go into STATE_TX_ON without forcing. After we hit the
AT86RF2XX_MAX_TX_RETRIES we will start the force state change.
This is a polling like method to go into STATE_TX_ON in times of maximum
receiving time.

Signed-off-by: default avatarAlexander Aring <alex.aring@gmail.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 3267c884
Loading
Loading
Loading
Loading
+21 −3
Original line number Original line Diff line number Diff line
@@ -53,6 +53,12 @@ struct at86rf2xx_chip_data {
};
};


#define AT86RF2XX_MAX_BUF		(127 + 3)
#define AT86RF2XX_MAX_BUF		(127 + 3)
/* tx retries to access the TX_ON state
 * if it's above then force change will be started.
 *
 * We assume the max_frame_retries (7) value of 802.15.4 here.
 */
#define AT86RF2XX_MAX_TX_RETRIES	7


struct at86rf230_state_change {
struct at86rf230_state_change {
	struct at86rf230_local *lp;
	struct at86rf230_local *lp;
@@ -85,6 +91,7 @@ struct at86rf230_local {
	bool is_tx;
	bool is_tx;
	/* spinlock for is_tx protection */
	/* spinlock for is_tx protection */
	spinlock_t lock;
	spinlock_t lock;
	u8 tx_retry;
	struct sk_buff *tx_skb;
	struct sk_buff *tx_skb;
	struct at86rf230_state_change tx;
	struct at86rf230_state_change tx;
};
};
@@ -512,10 +519,20 @@ at86rf230_async_state_assert(void *context)
			 * in STATE_BUSY_RX_AACK, we run a force state change
			 * in STATE_BUSY_RX_AACK, we run a force state change
			 * to STATE_TX_ON. This is a timeout handling, if the
			 * to STATE_TX_ON. This is a timeout handling, if the
			 * transceiver stucks in STATE_BUSY_RX_AACK.
			 * transceiver stucks in STATE_BUSY_RX_AACK.
			 *
			 * Additional we do several retries to try to get into
			 * TX_ON state without forcing. If the retries are
			 * higher or equal than AT86RF2XX_MAX_TX_RETRIES we
			 * will do a force change.
			 */
			 */
			if (ctx->to_state == STATE_TX_ON) {
			if (ctx->to_state == STATE_TX_ON) {
				at86rf230_async_state_change(lp, ctx,
				u8 state = STATE_TX_ON;
							     STATE_FORCE_TX_ON,

				if (lp->tx_retry >= AT86RF2XX_MAX_TX_RETRIES)
					state = STATE_FORCE_TX_ON;
				lp->tx_retry++;

				at86rf230_async_state_change(lp, ctx, state,
							     ctx->complete,
							     ctx->complete,
							     ctx->irq_enable);
							     ctx->irq_enable);
				return;
				return;
@@ -963,6 +980,7 @@ at86rf230_xmit(struct ieee802154_hw *hw, struct sk_buff *skb)
	if (lp->tx_aret)
	if (lp->tx_aret)
		tx_complete = at86rf230_xmit_tx_on;
		tx_complete = at86rf230_xmit_tx_on;


	lp->tx_retry = 0;
	at86rf230_async_state_change(lp, ctx, STATE_TX_ON, tx_complete, false);
	at86rf230_async_state_change(lp, ctx, STATE_TX_ON, tx_complete, false);


	return 0;
	return 0;