summaryrefslogtreecommitdiffstats
path: root/sys/dev/ath/if_athvar.h
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2012-06-13 06:57:55 +0000
committeradrian <adrian@FreeBSD.org>2012-06-13 06:57:55 +0000
commit528dfae9f303da46dcc4ebee63d6b187663d51a9 (patch)
tree708859cf2ac963dede56373155b3cc6be23016e5 /sys/dev/ath/if_athvar.h
parentb15cbc2807377cb0ea0721766e07f5f168a2c25c (diff)
downloadFreeBSD-src-528dfae9f303da46dcc4ebee63d6b187663d51a9.zip
FreeBSD-src-528dfae9f303da46dcc4ebee63d6b187663d51a9.tar.gz
Implement a separate, smaller pool of ath_buf entries for use by management
traffic. * Create sc_mgmt_txbuf and sc_mgmt_txdesc, initialise/free them appropriately. * Create an enum to represent buffer types in the API. * Extend ath_getbuf() and _ath_getbuf_locked() to take the above enum. * Right now anything sent via ic_raw_xmit() allocates via ATH_BUFTYPE_MGMT. This may not be very useful. * Add ATH_BUF_MGMT flag (ath_buf.bf_flags) which indicates the current buffer is a mgmt buffer and should go back onto the mgmt free list. * Extend 'txagg' to include debugging output for both normal and mgmt txbufs. * When checking/clearing ATH_BUF_BUSY, do it on both TX pools. Tested: * STA mode, with heavy UDP injection via iperf. This filled the TX queue however BARs were still going out successfully. TODO: * Initialise the mgmt buffers with ATH_BUF_MGMT and then ensure the right type is being allocated and freed on the appropriate list. That'd save a write operation (to bf->bf_flags) on each buffer alloc/free. * Test on AP mode, ensure that BAR TX and probe responses go out nicely when the main TX queue is filled (eg with paused traffic to a TID, awaiting a BAR to complete.) PR: kern/168170
Diffstat (limited to 'sys/dev/ath/if_athvar.h')
-rw-r--r--sys/dev/ath/if_athvar.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h
index 07ed8af..407e997 100644
--- a/sys/dev/ath/if_athvar.h
+++ b/sys/dev/ath/if_athvar.h
@@ -44,6 +44,14 @@
#define ATH_TIMEOUT 1000
/*
+ * There is a separate TX ath_buf pool for management frames.
+ * This ensures that management frames such as probe responses
+ * and BAR frames can be transmitted during periods of high
+ * TX activity.
+ */
+#define ATH_MGMT_TXBUF 32
+
+/*
* 802.11n requires more TX and RX buffers to do AMPDU.
*/
#ifdef ATH_ENABLE_11N
@@ -172,6 +180,11 @@ struct ath_node {
((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul))
#define ATH_RSSI(x) ATH_EP_RND(x, HAL_RSSI_EP_MULTIPLIER)
+typedef enum {
+ ATH_BUFTYPE_NORMAL = 0,
+ ATH_BUFTYPE_MGMT = 1,
+} ath_buf_type_t;
+
struct ath_buf {
TAILQ_ENTRY(ath_buf) bf_list;
struct ath_buf * bf_next; /* next buffer in the aggregate */
@@ -243,6 +256,7 @@ struct ath_buf {
};
typedef TAILQ_HEAD(ath_bufhead_s, ath_buf) ath_bufhead;
+#define ATH_BUF_MGMT 0x00000001 /* (tx) desc is a mgmt desc */
#define ATH_BUF_BUSY 0x00000002 /* (tx) desc owned by h/w */
/*
@@ -487,6 +501,8 @@ struct ath_softc {
struct ath_descdma sc_txdma; /* TX descriptors */
ath_bufhead sc_txbuf; /* transmit buffer */
+ struct ath_descdma sc_txdma_mgmt; /* mgmt TX descriptors */
+ ath_bufhead sc_txbuf_mgmt; /* mgmt transmit buffer */
struct mtx sc_txbuflock; /* txbuf lock */
char sc_txname[12]; /* e.g. "ath0_buf" */
u_int sc_txqsetup; /* h/w queues setup */
OpenPOWER on IntegriCloud