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

Commit acbadf01 authored by Christian Lamparter's avatar Christian Lamparter Committed by John W. Linville
Browse files

ar9170: implement transmit aggregation



This patch roughly implements xmit aggregation for ar9170-like device.
Not all AP are compatible with the driver(and firmware) yet, so YMMV.

A more refined code will definitely need the final HT specification
to be available for the public, lots of firmware modification and
possibly a redesigned driver just for good measure.
Sadly, these conditions won't come true anytime soon...

Signed-off-by: default avatarChristian Lamparter <chunkeey@web.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 1a9b6679
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
@@ -109,11 +109,52 @@ struct ar9170_rxstream_mpdu_merge {
	bool has_plcp;
};

#define AR9170_NUM_MAX_BA_RETRY	5
#define AR9170_NUM_TID	16
#define WME_BA_BMP_SIZE         64
#define AR9170_NUM_MAX_AGG_LEN	(2 * WME_BA_BMP_SIZE)

#define WME_AC_BE   2
#define WME_AC_BK   3
#define WME_AC_VI   1
#define WME_AC_VO   0

#define TID_TO_WME_AC(_tid)				\
	((((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE :	\
	 (((_tid) == 1) || ((_tid) == 2)) ? WME_AC_BK :	\
	 (((_tid) == 4) || ((_tid) == 5)) ? WME_AC_VI :	\
	 WME_AC_VO)

#define BAW_WITHIN(_start, _bawsz, _seqno) \
	((((_seqno) - (_start)) & 0xfff) < (_bawsz))

enum ar9170_tid_state {
	AR9170_TID_STATE_INVALID,
	AR9170_TID_STATE_SHUTDOWN,
	AR9170_TID_STATE_PROGRESS,
	AR9170_TID_STATE_COMPLETE,
};

struct ar9170_sta_tid {
	struct list_head list;
	struct sk_buff_head queue;
	u8 addr[ETH_ALEN];
	u16 ssn;
	u16 tid;
	enum ar9170_tid_state state;
	bool active;
	u8 retry;
};

#define AR9170_QUEUE_TIMEOUT		64
#define AR9170_TX_TIMEOUT		8
#define AR9170_BA_TIMEOUT		4
#define AR9170_JANITOR_DELAY		128
#define AR9170_TX_INVALID_RATE		0xffffffff

#define AR9170_NUM_TX_STATUS		128
#define AR9170_NUM_TX_AGG_MAX		30

struct ar9170 {
	struct ieee80211_hw *hw;
	struct mutex mutex;
@@ -187,14 +228,25 @@ struct ar9170 {
	struct sk_buff_head tx_pending[__AR9170_NUM_TXQ];
	struct sk_buff_head tx_status[__AR9170_NUM_TXQ];
	struct delayed_work tx_janitor;
	/* tx ampdu */
	struct sk_buff_head tx_status_ampdu;
	spinlock_t tx_ampdu_list_lock;
	struct list_head tx_ampdu_list;
	unsigned int tx_ampdu_pending;

	/* rxstream mpdu merge */
	struct ar9170_rxstream_mpdu_merge rx_mpdu;
	struct sk_buff *rx_failover;
	int rx_failover_missing;

	/* (cached) HW A-MPDU settings */
	u8 global_ampdu_density;
	u8 global_ampdu_factor;
};

struct ar9170_sta_info {
	struct ar9170_sta_tid agg[AR9170_NUM_TID];
	unsigned int ampdu_max_len;
};

#define AR9170_TX_FLAG_WAIT_FOR_ACK	BIT(0)
+582 −26

File changed.

Preview size limit exceeded, changes collapsed.