add support for ack timeout estimation in ath9k driver
v2 cover add support for ack timeout estimation in ath9k driver
This patchset adds support for estimation of the ack timeout (dynack) in ath9k driver. Ath9k dynack computes the ack timeout based on ack frame RX timestamp, TX frame timestamp and frame duration.
Ath9k dynack has been tested in indoor environment using AR9223/AR9280 chipset (running 3.16.0-rc4 kernel) and on 9Km PtoP link using AR9280 chipset (running OpenWRT trunk, compat-wireless-2014-05-22)
Changes since RFCv1:
- use ISC license instead of GPLv2 one
- use an inline method instead of a macro for EWMA calculation
- use powers of two weights in EWMA calculation
- fix typos
- add ath_dynack_node_init/ath_dynack_node_deinit methods
- use different logic to enable/disable dynack processing
Lorenzo Bianconi (10):
ath9k: export methods related to ack timeout estimation
ath9k: add duration field to ath_tx_status
ath9k: add dynamic ack timeout estimation
ath9k: add config for (en|dis)abling ack timeout estimation
ath9k: do not overwrite ack timeout estimation
ath9k: add sampling methods for (tx|rx) timestamp
ath9k: enable control frame reception
ath9k: add debugfs support for dynack
ath9k: disable dynack algorithm when coverage class is set
ath9k: initialize ath_node linked list
drivers/net/wireless/ath/ath.h | 2 + drivers/net/wireless/ath/ath9k/Kconfig | 7 + drivers/net/wireless/ath/ath9k/Makefile | 3 + drivers/net/wireless/ath/ath9k/ar9002_mac.c | 7 + drivers/net/wireless/ath/ath9k/ar9003_mac.c | 9 + drivers/net/wireless/ath/ath9k/ath9k.h | 3 + drivers/net/wireless/ath/ath9k/debug.c | 82 +++++++ drivers/net/wireless/ath/ath9k/dynack.c | 348 ++++++++++++++++++++++++++++ drivers/net/wireless/ath/ath9k/dynack.h | 96 ++++++++ drivers/net/wireless/ath/ath9k/hw.c | 16 +- drivers/net/wireless/ath/ath9k/hw.h | 7 + drivers/net/wireless/ath/ath9k/mac.h | 1 + drivers/net/wireless/ath/ath9k/main.c | 5 + drivers/net/wireless/ath/ath9k/recv.c | 7 +- drivers/net/wireless/ath/ath9k/xmit.c | 5 + 15 files changed, 594 insertions(+), 4 deletions(-) create mode 100644 drivers/net/wireless/ath/ath9k/dynack.c create mode 100644 drivers/net/wireless/ath/ath9k/dynack.h
Signature · 1 line
1.9.1
RFC v2 1/10 ath9k: export methods related to ack timeout estimation
Remove static keyword and export ath9k_hw_setslottime(), ath9k_hw_set_ack_timeout() and ath9k_hw_set_cts_timeout() in hw.h. These methods will be used in dynamic ack timeout estimation
--- drivers/net/wireless/ath/ath9k/hw.c | 6 +++--- drivers/net/wireless/ath/ath9k/hw.h | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-)
drivers/net/wireless/ath/ath9k/hw.c +3 -3
@@ -935,21 +935,21 @@ static void ath9k_hw_set_sifs_time(struct ath_hw *ah, u32 us)REG_WRITE (ah,AR_D_GBL_IFS_SIFS , val); } -static void ath9k_hw_setslottime (struct ath_hw *ah,u32 us) +void ath9k_hw_setslottime (struct ath_hw *ah,u32 us) {u32 val =ath9k_hw_mac_to_clks (ah, us); val =min (val, (u32 )0xFFFF );REG_WRITE (ah,AR_D_GBL_IFS_SLOT , val); } -static void ath9k_hw_set_ack_timeout (struct ath_hw *ah,u32 us) +void ath9k_hw_set_ack_timeout (struct ath_hw *ah,u32 us) {u32 val =ath9k_hw_mac_to_clks (ah, us); val =min (val, (u32 )MS (0xFFFFFFFF ,AR_TIME_OUT_ACK ));REG_RMW_FIELD (ah,AR_TIME_OUT ,AR_TIME_OUT_ACK , val); } -static void ath9k_hw_set_cts_timeout (struct ath_hw *ah,u32 us) +void ath9k_hw_set_cts_timeout (struct ath_hw *ah,u32 us) {u32 val =ath9k_hw_mac_to_clks (ah, us); val =min (val, (u32 )MS (0xFFFFFFFF ,AR_TIME_OUT_CTS ));
drivers/net/wireless/ath/ath9k/hw.h +4 -0
@@ -1080,6 +1080,10 @@ void ar9002_hw_load_ani_reg(struct ath_hw *ah, struct ath9k_channel *chan);void ath9k_ani_reset (struct ath_hw *ah,bool is_scanning);void ath9k_hw_ani_monitor (struct ath_hw *ah,struct ath9k_channel *chan); +void ath9k_hw_set_ack_timeout (struct ath_hw *ah,u32 us); +void ath9k_hw_set_cts_timeout (struct ath_hw *ah,u32 us); +void ath9k_hw_setslottime (struct ath_hw *ah,u32 us); +#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT static inline bool ath9k_hw_btcoex_is_enabled (struct ath_hw *ah) {
Signature · 1 line
1.9.1
RFC v2 2/10 ath9k: add duration field to ath_tx_status
In reply to Lorenzo BianconiAdd duration field to ath_tx_status in order to report frame duration for each entry in multi-retry chain. These fields will be used in dynamic ack timeout processing
--- drivers/net/wireless/ath/ath9k/ar9002_mac.c | 7 +++++++ drivers/net/wireless/ath/ath9k/ar9003_mac.c | 9 +++++++++ drivers/net/wireless/ath/ath9k/mac.h | 1 + 3 files changed, 17 insertions(+)
drivers/net/wireless/ath/ath9k/ar9002_mac.c +7 -0
@@ -377,6 +377,13 @@ static int ar9002_hw_proc_txdesc(struct ath_hw *ah, void *ds, ts->evm1 = ads->AR_TxEVM1; ts->evm2 = ads->AR_TxEVM2; + status =ACCESS_ONCE (ads->ds_ctl4); + ts->duration[0 ] =MS (status, AR_PacketDur0); + ts->duration[1 ] =MS (status, AR_PacketDur1); + status =ACCESS_ONCE (ads->ds_ctl5); + ts->duration[2 ] =MS (status, AR_PacketDur2); + ts->duration[3 ] =MS (status, AR_PacketDur3); +return 0 ; }
drivers/net/wireless/ath/ath9k/ar9003_mac.c +9 -0
@@ -351,9 +351,11 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_status *ts) {struct ar9003_txs *ads; +struct ar9003_txc *adc;u32 status; ads = &ah->ts_ring[ah->ts_tail]; + adc = (struct ar9003_txc *)ads; status =ACCESS_ONCE (ads->status8);if ((status & AR_TxDone) ==0 )
@@ -422,6 +424,13 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds, ts->ts_rssi_ext1 =MS (status, AR_TxRSSIAnt11); ts->ts_rssi_ext2 =MS (status, AR_TxRSSIAnt12); + status =ACCESS_ONCE (adc->ctl15); + ts->duration[0 ] =MS (status, AR_PacketDur0); + ts->duration[1 ] =MS (status, AR_PacketDur1); + status =ACCESS_ONCE (adc->ctl16); + ts->duration[2 ] =MS (status, AR_PacketDur2); + ts->duration[3 ] =MS (status, AR_PacketDur3); +memset (ads,0 ,sizeof (*ads));return 0 ;
drivers/net/wireless/ath/ath9k/mac.h +1 -0
@@ -121,6 +121,7 @@ struct ath_tx_status {u32 evm0;u32 evm1;u32 evm2; +u32 duration[4 ]; };struct ath_rx_status {
Signature · 1 line
1.9.1
RFC v2 3/10 ath9k: add dynamic ack timeout estimation
In reply to Lorenzo BianconiAdd dynamic ack timeout estimation algorithm based on ack frame RX timestamp, TX frame timestamp and frame duration.
--- drivers/net/wireless/ath/ath.h | 2 + drivers/net/wireless/ath/ath9k/ath9k.h | 3 + drivers/net/wireless/ath/ath9k/dynack.c | 348 ++++++++++++++++++++++++++++++++ drivers/net/wireless/ath/ath9k/dynack.h | 96 +++++++++ drivers/net/wireless/ath/ath9k/hw.c | 2 + drivers/net/wireless/ath/ath9k/hw.h | 3 + 6 files changed, 454 insertions(+) create mode 100644 drivers/net/wireless/ath/ath9k/dynack.c create mode 100644 drivers/net/wireless/ath/ath9k/dynack.h
drivers/net/wireless/ath/ath.h +2 -0
@@ -234,6 +234,7 @@ void ath_printk(const char *level, const struct ath_common *common,* AR9462. * @ATH_DBG_DFS: radar datection * @ATH_DBG_WOW: Wake on Wireless +* @ATH_DBG_DYNACK: dynack handling * @ATH_DBG_ANY: enable all debugging * * The debug level is used to control the amount and type of debugging output
@@ -261,6 +262,7 @@ enum ATH_DEBUG {ATH_DBG_MCI =0x00008000 ,ATH_DBG_DFS =0x00010000 ,ATH_DBG_WOW =0x00020000 , +ATH_DBG_DYNACK =0x00040000 , ATH_DBG_ANY = 0xffffffff };
drivers/net/wireless/ath/ath9k/ath9k.h +3 -0
@@ -272,6 +272,9 @@ struct ath_node {struct ath_rx_rate_stats rx_rate_stats;#endif u8 key_idx[4 ]; + +u32 ackto; +struct list_head list; };struct ath_tx_control {
drivers/net/wireless/ath/ath9k/dynack.c new file +348 -0
348 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/dynack.h new file +96 -0
96 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/hw.c +2 -0
@@ -647,6 +647,8 @@ int ath9k_hw_init(struct ath_hw *ah)return ret; } +ath_dynack_init (ah); +return 0 ; }EXPORT_SYMBOL (ath9k_hw_init);
drivers/net/wireless/ath/ath9k/hw.h +3 -0
@@ -29,6 +29,7 @@#include "reg.h" #include "phy.h" #include "btcoex.h" +#include "dynack.h" #include "../regd.h"
@@ -924,6 +925,8 @@ struct ath_hw {int (*external_reset)(void );const struct firmware *eeprom_blob; + +struct ath_dynack dynack; };struct ath_bus_ops {
Signature · 1 line
1.9.1
RFC v2 4/10 ath9k: add config for (en|dis)abling ack timeout estimation
In reply to Lorenzo BianconiAdd ack timeout estimation to ath9k Makefile
--- drivers/net/wireless/ath/ath9k/Kconfig | 7 +++++++ drivers/net/wireless/ath/ath9k/Makefile | 3 +++ 2 files changed, 10 insertions(+)
drivers/net/wireless/ath/ath9k/Kconfig +7 -0
@@ -151,3 +151,10 @@ config ATH9K_HTC_DEBUGFS depends on ATH9K_HTC && DEBUG_FS ---help--- Say Y, if you need access to ath9k_htc's statistics. + +config ATH9K_DYNACK + bool "Atheros ath9k ack timeout estimation algorithm (EXPERIMENTAL)" + depends on ATH9K + default n + ---help--- + This option enables ath9k dynamic ack timeout estimation algorithm
drivers/net/wireless/ath/ath9k/Makefile +3 -0
@@ -49,6 +49,9 @@ ath9k_hw-$(CONFIG_ATH9K_WOW) += ar9003_wow.o ath9k_hw-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += btcoex.o \ ar9003_mci.o + +ath9k_hw-$(CONFIG_ATH9K_DYNACK) += dynack.o + obj-$(CONFIG_ATH9K_HW) += ath9k_hw.o obj-$(CONFIG_ATH9K_COMMON) += ath9k_common.o
Signature · 1 line
1.9.1
RFC v2 5/10 ath9k: do not overwrite ack timeout estimation
In reply to Lorenzo BianconiDo not overwrite ack timeout estimation in ath9k_hw_init_global_settings() if dynack processing is enabled
--- drivers/net/wireless/ath/ath9k/hw.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/wireless/ath/ath9k/hw.c +8 -0
@@ -1055,6 +1055,14 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah) ctstimeout +=48 - sifstime - ah->slottime; } +if (ah->dynack.enabled) { + acktimeout = ah->dynack.ackto; + ctstimeout = acktimeout; + slottime = (acktimeout -3 ) /2 ; + }else { + ah->dynack.ackto = acktimeout; + } +ath9k_hw_set_sifs_time (ah, sifstime);ath9k_hw_setslottime (ah, slottime);ath9k_hw_set_ack_timeout (ah, acktimeout);
Signature · 1 line
1.9.1
RFC v2 6/10 ath9k: add sampling methods for (tx|rx) timestamp
In reply to Lorenzo BianconiAdd sampling methods for ack RX timestamp in ath_rx_tasklet() and for TX frame timestamp in ath_tx_complete_aggr() and in ath_tx_process_buffer()
--- drivers/net/wireless/ath/ath9k/recv.c | 5 +++++ drivers/net/wireless/ath/ath9k/xmit.c | 5 +++++ 2 files changed, 10 insertions(+)
drivers/net/wireless/ath/ath9k/recv.c +5 -0
@@ -991,6 +991,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)unsigned long flags;dma_addr_t new_buf_addr;unsigned int budget =512 ; +struct ieee80211_hdr *hdr;if (edma) dma_type =DMA_BIDIRECTIONAL ;
@@ -1120,6 +1121,10 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)ath9k_apply_ampdu_details (sc, &rs, rxs);ath_debug_rate_stats (sc, &rs, skb); + hdr = (struct ieee80211_hdr *)skb->data; +if (ieee80211_is_ack (hdr->frame_control)) +ath_dynack_sample_ack_ts (sc->sc_ah, skb, rs.rs_tstamp); +ieee80211_rx (hw, skb); requeue_drop_frag:
drivers/net/wireless/ath/ath9k/xmit.c +5 -0
@@ -588,6 +588,10 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,memcpy (tx_info->control.rates, rates,sizeof (rates));ath_tx_rc_status (sc, bf, ts, nframes, nbad, txok); rc_update = false; +if (bf == bf->bf_lastbf) +ath_dynack_sample_tx_ts (sc->sc_ah, + bf->bf_mpdu, + ts); } ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
@@ -688,6 +692,7 @@ static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,memcpy (info->control.rates, bf->rates,sizeof (info->control.rates));ath_tx_rc_status (sc, bf, ts,1 , txok ?0 :1 , txok); +ath_dynack_sample_tx_ts (sc->sc_ah, bf->bf_mpdu, ts); }ath_tx_complete_buf (sc, bf, txq, bf_head, ts, txok); }else
Signature · 1 line
1.9.1
RFC v2 7/10 ath9k: enable control frame reception
In reply to Lorenzo BianconiEnable control frame reception if dynamic ack processing is enabled
--- drivers/net/wireless/ath/ath9k/recv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath9k/recv.c +1 -1
@@ -398,7 +398,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc)if (sc->sc_ah->is_monitoring) rfilt |=ATH9K_RX_FILTER_PROM ; -if (sc->rx.rxfilter &FIF_CONTROL ) +if ((sc->rx.rxfilter &FIF_CONTROL ) || sc->sc_ah->dynack.enabled) rfilt |=ATH9K_RX_FILTER_CONTROL ; if ((sc->sc_ah->opmode == NL80211_IFTYPE_STATION) &&
Signature · 1 line
1.9.1
Re: [RFCv2 07/10] ath9k: enable control frame reception
Review
Quoted 9 lines · Lorenzo Bianconi
Enable control frame reception if dynamic ack processing is enabled
Signed-off-by Lorenzo Bianconi <lorenzo.bianconi83@...>--- drivers/net/wireless/ath/ath9k/recv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/net/wireless/ath/ath9k/recv.c
drivers/net/wireless/ath/ath9k/recv.c
Quoted 4 lines
index ad317a4..cc5ba4a 100644
drivers/net/wireless/ath/ath9k/recv.c +0
-0<at> <at> -398,7 +398,7 <at> <at> u32 ath_calcrxfilter(struct ath_softc
*sc)
drivers/net/wireless/ath/ath9k/recv.c u32 ath_calcrxfilter(struct ath_softc *sc) · line 404
Quoted 8 lines
drivers/net/wireless/ath/ath9k/recv.c +1
-1if (sc->sc_ah->is_monitoring) rfilt |=ATH9K_RX_FILTER_PROM ; -if (sc->rx.rxfilter &FIF_CONTROL ) +if ((sc->rx.rxfilter &FIF_CONTROL ) || sc->sc_ah->dynack.enabled) rfilt |=ATH9K_RX_FILTER_CONTROL ; if ((sc->sc_ah->opmode == NL80211_IFTYPE_STATION) &&
Dear Lorenzo:
Thank you your patch!But I want to know where can I get the RTS/CTS and ACK in MAC80211 or ATH9K after adopting this change,using the function ieee80211_rx_h_ctrl(/net/mac80211/rx.c)?
Any reply will be much appreciated!!
RFC v2 8/10 ath9k: add debugfs support for dynack
In reply to Lorenzo BianconiAdd ack_to entry to debugfs in order to dump current ack timeout value. Add dynack entry to enable/disable ack timeout estimation algorithm:
echo (1|0) > /sys/kernel/debug/ieee80211/phy0/ath9k/dynack
--- drivers/net/wireless/ath/ath9k/debug.c | 82 ++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+)
drivers/net/wireless/ath/ath9k/debug.c +82 -0
@@ -1169,6 +1169,81 @@ static const struct file_operations fops_btcoex = { };#endif +#ifdef CONFIG_ATH9K_DYNACK +/* enable/disable dynack processing */ +static ssize_t read_file_dynack (struct file *file,char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath_softc *sc = file->private_data; +struct ath_hw *ah = sc->sc_ah; +char buf[32 ]; +unsigned int len; + + len =sprintf (buf,"%u\n" , ah->dynack.enabled); +return simple_read_from_buffer (user_buf, count, ppos, buf, len); +} + +static ssize_t write_file_dynack (struct file *file,const char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath_softc *sc = file->private_data; +struct ath_hw *ah = sc->sc_ah; +char buf[32 ]; +unsigned long dynack; +ssize_t len; +u32 rfilt; + + len =min (count,sizeof (buf) -1 ); +if (copy_from_user (buf, user_buf, len)) +return -EFAULT ; + + buf[len] ='\0' ; +if (kstrtoul (buf,0 , &dynack)) +return -EINVAL ; + + ah->dynack.enabled = dynack; + + rfilt =ath_calcrxfilter (sc); +ath9k_hw_setrxfilter (ah, rfilt); + +if (ah->dynack.enabled) +ath_dynack_reset (ah); +else +ath9k_hw_init_global_settings (ah); + +return count; +} + +static const struct file_operations fops_dynack = { + .read = read_file_dynack, + .write = write_file_dynack, + .open = simple_open, + .owner =THIS_MODULE , + .llseek = default_llseek, +}; + +static ssize_t read_file_ackto (struct file *file,char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath_softc *sc = file->private_data; +struct ath_hw *ah = sc->sc_ah; +char buf[32 ]; +unsigned int len; + + len =sprintf (buf,"%u %c\n" , ah->dynack.ackto, + (ah->dynack.enabled) ?'A' :'S' ); + +return simple_read_from_buffer (user_buf, count, ppos, buf, len); +} + +static const struct file_operations fops_ackto = { + .read = read_file_ackto, + .open = simple_open, + .owner =THIS_MODULE , + .llseek = default_llseek, +}; +#endif +/* Ethtool support for get-stats */ #define AMKSTR (nm) #nm "_BE", #nm "_BK", #nm "_VI", #nm "_VO"
@@ -1374,5 +1449,12 @@ int ath9k_init_debug(struct ath_hw *ah) &fops_btcoex);#endif +#ifdef CONFIG_ATH9K_DYNACK +debugfs_create_file ("dynack" ,S_IRUSR |S_IWUSR , + sc->debug.debugfs_phy, sc, &fops_dynack); +debugfs_create_file ("ack_to" ,S_IRUSR |S_IWUSR , sc->debug.debugfs_phy, + sc, &fops_ackto); +#endif +return 0 ; }
Signature · 1 line
1.9.1
RFC v2 9/10 ath9k: disable dynack algorithm when coverage class is set
In reply to Lorenzo BianconiDisable ack timeout estimation algorithm if the coverage class has been configured
--- drivers/net/wireless/ath/ath9k/main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/ath/ath9k/main.c +1 -0
@@ -1969,6 +1969,7 @@ static void ath9k_set_coverage_class(struct ieee80211_hw *hw, u8 coverage_class)mutex_lock (&sc->mutex); ah->coverage_class = coverage_class; + ah->dynack.enabled = false;ath9k_ps_wakeup (sc);ath9k_hw_init_global_settings (ah);
Signature · 1 line
1.9.1
RFC v2 9/10 ath9k: disable dynack algorithm when coverage class is set
Quoted 4 lines · Lorenzo Bianconi
Disable ack timeout estimation algorithm if the coverage class has been configured
Signed-off-by Lorenzo Bianconi <[email protected]>
I think this is broken, since it doesn't allow you to re-enable dynack through the same way as it was disabled.
I would recommend adding an 'auto' value for coverage class.
- Felix
RFC v2 9/10 ath9k: disable dynack algorithm when coverage class is set
I don?t know why I?m a part of this
Getting so many emails!
Regards,
Eng. Hosam Hittini
Quoted 9 lines · Felix Fietkau
Quoted 4 lines · Lorenzo Bianconi
Disable ack timeout estimation algorithm if the coverage class has been configured
Signed-off-by Lorenzo Bianconi <[email protected]>I think this is broken, since it doesn't allow you to re-enable dynack through the same way as it was disabled.
I would recommend adding an 'auto' value for coverage class.
Quoted 5 lines
- Felix
_______________________________________________
ath9k-devel mailing list
ath9k-devel at lists.ath9k.org
https://lists.ath9k.org/mailman/listinfo/ath9k-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ath9k.org/pipermail/ath9k-devel/attachments/20140713/2f8a8ee3/attachment-0001.htm
RFC v2 9/10 ath9k: disable dynack algorithm when coverage class is set
In reply to Felix FietkauQuoted 8 lines · Lorenzo Bianconi
Quoted 4 lines
Disable ack timeout estimation algorithm if the coverage class has been configured
Signed-off-by Lorenzo Bianconi <[email protected]>I think this is broken, since it doesn't allow you to re-enable dynack through the same way as it was disabled.
I would recommend adding an 'auto' value for coverage class.
Ok. Could we use 255 as 'auto' value? Did you mean something else? According to the standard maximum value for coverage class is 31, isn't it?
Quoted 2 lines
- Felix
Best regards,
Lorenzo
Signature · 3 lines
UNIX is Sexy: who | grep -i blonde | talk; cd ~; wine; talk; touch; unzip; touch; strip; gasp; finger; gasp; mount; fsck; more; yes; gasp; umount; make clean; sleep
RFC v2 10/10 ath9k: initialize ath_node linked list
In reply to Lorenzo BianconiInitialize neighbor linked list used by estimation algorithm to compute maximum sta ack timeout
--- drivers/net/wireless/ath/ath9k/main.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/ath/ath9k/main.c +4 -0
@@ -358,12 +358,16 @@ static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta,memset (&an->key_idx,0 ,sizeof (an->key_idx));ath_tx_node_init (sc, an); + +ath_dynack_node_init (sc->sc_ah, an); }static void ath_node_detach (struct ath_softc *sc,struct ieee80211_sta *sta) {struct ath_node *an = (struct ath_node *)sta->drv_priv;ath_tx_node_cleanup (sc, an); + +ath_dynack_node_deinit (sc->sc_ah, an); }void ath9k_tasklet (unsigned long data)
Signature · 1 line
1.9.1