瀏覽代碼

mac80211: merge a number of upstream driver fixes/improvements

Signed-off-by: Felix Fietkau <[email protected]>

SVN-Revision: 45432
Felix Fietkau 10 年之前
父節點
當前提交
b5073ca2c8
共有 29 個文件被更改,包括 1114 次插入25 次删除
  1. 35 0
      package/kernel/mac80211/patches/317-brcmfmac-Fix-race-condition-in-msgbuf-ioctl-processi.patch
  2. 30 0
      package/kernel/mac80211/patches/318-brcmfmac-Update-msgbuf-commonring-size-for-improved-.patch
  3. 307 0
      package/kernel/mac80211/patches/319-ath9k_htc-add-new-WMI_REG_RMW_CMDID-command.patch
  4. 89 0
      package/kernel/mac80211/patches/320-ath9k-ar9271_hw_pa_cal-use-defs-instead-of-magin-num.patch
  5. 79 0
      package/kernel/mac80211/patches/321-ath9k-ar9271_hw_pa_cal-use-proper-makroses.patch
  6. 48 0
      package/kernel/mac80211/patches/322-ath9k-ar9271_hw_pa_cal-use-RMW-buffer.patch
  7. 35 0
      package/kernel/mac80211/patches/323-ath9k-add-multi_read-to-be-compatible-with-ath9k_htc.patch
  8. 69 0
      package/kernel/mac80211/patches/324-ath9k-add-new-function-ath9k_hw_read_array.patch
  9. 24 0
      package/kernel/mac80211/patches/325-ath9k-ar9271_hw_pa_cal-use-REG_READ_ARRAY.patch
  10. 39 0
      package/kernel/mac80211/patches/326-ath9k-use-one-shot-read-in-ath9k_hw_update_mibstats.patch
  11. 71 0
      package/kernel/mac80211/patches/327-ath9k-ath9k_hw_loadnf-use-REG_RMW.patch
  12. 27 0
      package/kernel/mac80211/patches/328-ath9k-write-buffer-related-optimisation-in-ar5008_hw.patch
  13. 26 0
      package/kernel/mac80211/patches/329-ath9k-ath9k_hw_set_4k_power_cal_tabl-use-rmw-buffer.patch
  14. 43 0
      package/kernel/mac80211/patches/330-ath9k-use-rmw-buffer-in-ath9k_hw_set_operating_mode-.patch
  15. 26 0
      package/kernel/mac80211/patches/331-ath9k-ath9k_hw_4k_set_board_values-use-rmw-buffer.patch
  16. 27 0
      package/kernel/mac80211/patches/332-ath9k-ath9k_hw_analog_shift_rmw-use-REG_RMW.patch
  17. 47 0
      package/kernel/mac80211/patches/333-ath9k-use-REG_RMW-and-rmw-buffer-in-ath9k_hw_4k_set_.patch
  18. 67 0
      package/kernel/mac80211/patches/334-ath9k-use-REG_RMW-and-rmw-buffer-in-ath9k_hw_def_set.patch
  19. 1 1
      package/kernel/mac80211/patches/400-ath_move_debug_code.patch
  20. 1 1
      package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
  21. 1 1
      package/kernel/mac80211/patches/501-ath9k_ahb_init.patch
  22. 1 1
      package/kernel/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
  23. 1 1
      package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch
  24. 1 1
      package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch
  25. 1 1
      package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
  26. 5 5
      package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch
  27. 7 7
      package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch
  28. 5 5
      package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch
  29. 1 1
      package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch

+ 35 - 0
package/kernel/mac80211/patches/317-brcmfmac-Fix-race-condition-in-msgbuf-ioctl-processi.patch

@@ -0,0 +1,35 @@
+From: Hante Meuleman <[email protected]>
+Date: Fri, 6 Mar 2015 18:40:41 +0100
+Subject: [PATCH] brcmfmac: Fix race condition in msgbuf ioctl processing.
+
+Msgbuf is using a wait_event_timeout to wait for the response on
+an ioctl. The wakeup routine uses waitqueue_active to see if
+wait_event_timeout has been called. There is a chance that the
+response arrives before wait_event_timeout is called, this
+will result in situation that wait_event_timeout never gets
+woken again and assumed result will be a timeout. This patch
+removes that errornous situation by always setting the
+ctl_completed var before checking for queue active.
+
+Reviewed-by: Arend Van Spriel <[email protected]>
+Reviewed-by: Pieter-Paul Giesberts <[email protected]>
+Signed-off-by: Hante Meuleman <[email protected]>
+Signed-off-by: Arend van Spriel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
++++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
+@@ -481,10 +481,9 @@ static int brcmf_msgbuf_ioctl_resp_wait(
+ 
+ static void brcmf_msgbuf_ioctl_resp_wake(struct brcmf_msgbuf *msgbuf)
+ {
+-	if (waitqueue_active(&msgbuf->ioctl_resp_wait)) {
+-		msgbuf->ctl_completed = true;
++	msgbuf->ctl_completed = true;
++	if (waitqueue_active(&msgbuf->ioctl_resp_wait))
+ 		wake_up(&msgbuf->ioctl_resp_wait);
+-	}
+ }
+ 
+ 

+ 30 - 0
package/kernel/mac80211/patches/318-brcmfmac-Update-msgbuf-commonring-size-for-improved-.patch

@@ -0,0 +1,30 @@
+From: Hante Meuleman <[email protected]>
+Date: Wed, 18 Mar 2015 13:25:23 +0100
+Subject: [PATCH] brcmfmac: Update msgbuf commonring size for improved
+ throughput.
+
+Reviewed-by: Arend Van Spriel <[email protected]>
+Reviewed-by: Pieter-Paul Giesberts <[email protected]>
+Signed-off-by: Hante Meuleman <[email protected]>
+Signed-off-by: Arend van Spriel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h
++++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h
+@@ -17,11 +17,11 @@
+ 
+ #ifdef CPTCFG_BRCMFMAC_PROTO_MSGBUF
+ 
+-#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM	20
+-#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_MAX_ITEM	256
+-#define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_MAX_ITEM	20
++#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM	64
++#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_MAX_ITEM	512
++#define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_MAX_ITEM	64
+ #define BRCMF_D2H_MSGRING_TX_COMPLETE_MAX_ITEM		1024
+-#define BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM		256
++#define BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM		512
+ #define BRCMF_H2D_TXFLOWRING_MAX_ITEM			512
+ 
+ #define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE	40

+ 307 - 0
package/kernel/mac80211/patches/319-ath9k_htc-add-new-WMI_REG_RMW_CMDID-command.patch

@@ -0,0 +1,307 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:46 +0100
+Subject: [PATCH] ath9k_htc: add new WMI_REG_RMW_CMDID command
+
+Since usb bus add extra delay on each request, a command
+with read + write requests is too expensive. We can dramtically
+reduce usb load by moving this command to firmware.
+
+In my tests, this patch will reduce channel scan time
+for about 5-10 seconds.
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath.h
++++ b/drivers/net/wireless/ath/ath.h
+@@ -131,6 +131,9 @@ struct ath_ops {
+ 	void (*enable_write_buffer)(void *);
+ 	void (*write_flush) (void *);
+ 	u32 (*rmw)(void *, u32 reg_offset, u32 set, u32 clr);
++	void (*enable_rmw_buffer)(void *);
++	void (*rmw_flush) (void *);
++
+ };
+ 
+ struct ath_common;
+--- a/drivers/net/wireless/ath/ath9k/htc.h
++++ b/drivers/net/wireless/ath/ath9k/htc.h
+@@ -444,6 +444,10 @@ static inline void ath9k_htc_stop_btcoex
+ #define OP_BT_SCAN                 BIT(4)
+ #define OP_TSF_RESET               BIT(6)
+ 
++enum htc_op_flags {
++	HTC_FWFLAG_NO_RMW,
++};
++
+ struct ath9k_htc_priv {
+ 	struct device *dev;
+ 	struct ieee80211_hw *hw;
+@@ -482,6 +486,7 @@ struct ath9k_htc_priv {
+ 	bool reconfig_beacon;
+ 	unsigned int rxfilter;
+ 	unsigned long op_flags;
++	unsigned long fw_flags;
+ 
+ 	struct ath9k_hw_cal_data caldata;
+ 	struct ath_spec_scan_priv spec_priv;
+--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
++++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+@@ -376,17 +376,139 @@ static void ath9k_regwrite_flush(void *h
+ 	mutex_unlock(&priv->wmi->multi_write_mutex);
+ }
+ 
+-static u32 ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
++static void ath9k_reg_rmw_buffer(void *hw_priv,
++				 u32 reg_offset, u32 set, u32 clr)
++{
++	struct ath_hw *ah = (struct ath_hw *) hw_priv;
++	struct ath_common *common = ath9k_hw_common(ah);
++	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
++	u32 rsp_status;
++	int r;
++
++	mutex_lock(&priv->wmi->multi_rmw_mutex);
++
++	/* Store the register/value */
++	priv->wmi->multi_rmw[priv->wmi->multi_rmw_idx].reg =
++		cpu_to_be32(reg_offset);
++	priv->wmi->multi_rmw[priv->wmi->multi_rmw_idx].set =
++		cpu_to_be32(set);
++	priv->wmi->multi_rmw[priv->wmi->multi_rmw_idx].clr =
++		cpu_to_be32(clr);
++
++	priv->wmi->multi_rmw_idx++;
++
++	/* If the buffer is full, send it out. */
++	if (priv->wmi->multi_rmw_idx == MAX_RMW_CMD_NUMBER) {
++		r = ath9k_wmi_cmd(priv->wmi, WMI_REG_RMW_CMDID,
++			  (u8 *) &priv->wmi->multi_rmw,
++			  sizeof(struct register_write) * priv->wmi->multi_rmw_idx,
++			  (u8 *) &rsp_status, sizeof(rsp_status),
++			  100);
++		if (unlikely(r)) {
++			ath_dbg(common, WMI,
++				"REGISTER RMW FAILED, multi len: %d\n",
++				priv->wmi->multi_rmw_idx);
++		}
++		priv->wmi->multi_rmw_idx = 0;
++	}
++
++	mutex_unlock(&priv->wmi->multi_rmw_mutex);
++}
++
++static void ath9k_reg_rmw_flush(void *hw_priv)
+ {
+-	u32 val;
++	struct ath_hw *ah = (struct ath_hw *) hw_priv;
++	struct ath_common *common = ath9k_hw_common(ah);
++	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
++	u32 rsp_status;
++	int r;
++
++	if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags))
++		return;
++
++	atomic_dec(&priv->wmi->m_rmw_cnt);
++
++	mutex_lock(&priv->wmi->multi_rmw_mutex);
++
++	if (priv->wmi->multi_rmw_idx) {
++		r = ath9k_wmi_cmd(priv->wmi, WMI_REG_RMW_CMDID,
++			  (u8 *) &priv->wmi->multi_rmw,
++			  sizeof(struct register_rmw) * priv->wmi->multi_rmw_idx,
++			  (u8 *) &rsp_status, sizeof(rsp_status),
++			  100);
++		if (unlikely(r)) {
++			ath_dbg(common, WMI,
++				"REGISTER RMW FAILED, multi len: %d\n",
++				priv->wmi->multi_rmw_idx);
++		}
++		priv->wmi->multi_rmw_idx = 0;
++	}
++
++	mutex_unlock(&priv->wmi->multi_rmw_mutex);
++}
++
++static void ath9k_enable_rmw_buffer(void *hw_priv)
++{
++	struct ath_hw *ah = (struct ath_hw *) hw_priv;
++	struct ath_common *common = ath9k_hw_common(ah);
++	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
++
++	if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags))
++		return;
+ 
+-	val = ath9k_regread(hw_priv, reg_offset);
+-	val &= ~clr;
+-	val |= set;
+-	ath9k_regwrite(hw_priv, val, reg_offset);
++	atomic_inc(&priv->wmi->m_rmw_cnt);
++}
++
++static u32 ath9k_reg_rmw_single(void *hw_priv,
++				 u32 reg_offset, u32 set, u32 clr)
++{
++	struct ath_hw *ah = (struct ath_hw *) hw_priv;
++	struct ath_common *common = ath9k_hw_common(ah);
++	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
++	struct register_rmw buf, buf_ret;
++	int ret;
++	u32 val = 0;
++
++	buf.reg = cpu_to_be32(reg_offset);
++	buf.set = cpu_to_be32(set);
++	buf.clr = cpu_to_be32(clr);
++
++	ret = ath9k_wmi_cmd(priv->wmi, WMI_REG_RMW_CMDID,
++			  (u8 *) &buf, sizeof(buf),
++			  (u8 *) &buf_ret, sizeof(buf_ret),
++			  100);
++	if (unlikely(ret)) {
++		ath_dbg(common, WMI, "REGISTER RMW FAILED:(0x%04x, %d)\n",
++			reg_offset, ret);
++	}
+ 	return val;
+ }
+ 
++static u32 ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
++{
++	struct ath_hw *ah = (struct ath_hw *) hw_priv;
++	struct ath_common *common = ath9k_hw_common(ah);
++	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
++
++	if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags)) {
++		u32 val;
++
++		val = REG_READ(ah, reg_offset);
++		val &= ~clr;
++		val |= set;
++		REG_WRITE(ah, reg_offset, val);
++
++		return 0;
++	}
++
++	if (atomic_read(&priv->wmi->m_rmw_cnt))
++		ath9k_reg_rmw_buffer(hw_priv, reg_offset, set, clr);
++	else
++		ath9k_reg_rmw_single(hw_priv, reg_offset, set, clr);
++
++	return 0;
++}
++
+ static void ath_usb_read_cachesize(struct ath_common *common, int *csz)
+ {
+ 	*csz = L1_CACHE_BYTES >> 2;
+@@ -501,6 +623,8 @@ static int ath9k_init_priv(struct ath9k_
+ 	ah->reg_ops.write = ath9k_regwrite;
+ 	ah->reg_ops.enable_write_buffer = ath9k_enable_regwrite_buffer;
+ 	ah->reg_ops.write_flush = ath9k_regwrite_flush;
++	ah->reg_ops.enable_rmw_buffer = ath9k_enable_rmw_buffer;
++	ah->reg_ops.rmw_flush = ath9k_reg_rmw_flush;
+ 	ah->reg_ops.rmw = ath9k_reg_rmw;
+ 	priv->ah = ah;
+ 
+@@ -686,6 +810,12 @@ static int ath9k_init_firmware_version(s
+ 		return -EINVAL;
+ 	}
+ 
++	if (priv->fw_version_major == 1 && priv->fw_version_minor < 4)
++		set_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags);
++
++	dev_info(priv->dev, "FW RMW support: %s\n",
++		test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags) ? "Off" : "On");
++
+ 	return 0;
+ }
+ 
+--- a/drivers/net/wireless/ath/ath9k/hw.h
++++ b/drivers/net/wireless/ath/ath9k/hw.h
+@@ -100,6 +100,18 @@
+ 			(_ah)->reg_ops.write_flush((_ah));	\
+ 	} while (0)
+ 
++#define ENABLE_REG_RMW_BUFFER(_ah)					\
++	do {								\
++		if ((_ah)->reg_ops.enable_rmw_buffer)	\
++			(_ah)->reg_ops.enable_rmw_buffer((_ah)); \
++	} while (0)
++
++#define REG_RMW_BUFFER_FLUSH(_ah)					\
++	do {								\
++		if ((_ah)->reg_ops.rmw_flush)		\
++			(_ah)->reg_ops.rmw_flush((_ah));	\
++	} while (0)
++
+ #define PR_EEP(_s, _val)						\
+ 	do {								\
+ 		len += scnprintf(buf + len, size - len, "%20s : %10d\n",\
+--- a/drivers/net/wireless/ath/ath9k/wmi.c
++++ b/drivers/net/wireless/ath/ath9k/wmi.c
+@@ -61,6 +61,8 @@ static const char *wmi_cmd_to_name(enum 
+ 		return "WMI_REG_READ_CMDID";
+ 	case WMI_REG_WRITE_CMDID:
+ 		return "WMI_REG_WRITE_CMDID";
++	case WMI_REG_RMW_CMDID:
++		return "WMI_REG_RMW_CMDID";
+ 	case WMI_RC_STATE_CHANGE_CMDID:
+ 		return "WMI_RC_STATE_CHANGE_CMDID";
+ 	case WMI_RC_RATE_UPDATE_CMDID:
+@@ -101,6 +103,7 @@ struct wmi *ath9k_init_wmi(struct ath9k_
+ 	spin_lock_init(&wmi->event_lock);
+ 	mutex_init(&wmi->op_mutex);
+ 	mutex_init(&wmi->multi_write_mutex);
++	mutex_init(&wmi->multi_rmw_mutex);
+ 	init_completion(&wmi->cmd_wait);
+ 	INIT_LIST_HEAD(&wmi->pending_tx_events);
+ 	tasklet_init(&wmi->wmi_event_tasklet, ath9k_wmi_event_tasklet,
+--- a/drivers/net/wireless/ath/ath9k/wmi.h
++++ b/drivers/net/wireless/ath/ath9k/wmi.h
+@@ -112,6 +112,7 @@ enum wmi_cmd_id {
+ 	WMI_TX_STATS_CMDID,
+ 	WMI_RX_STATS_CMDID,
+ 	WMI_BITRATE_MASK_CMDID,
++	WMI_REG_RMW_CMDID,
+ };
+ 
+ enum wmi_event_id {
+@@ -125,12 +126,19 @@ enum wmi_event_id {
+ };
+ 
+ #define MAX_CMD_NUMBER 62
++#define MAX_RMW_CMD_NUMBER 15
+ 
+ struct register_write {
+ 	__be32 reg;
+ 	__be32 val;
+ };
+ 
++struct register_rmw {
++	__be32 reg;
++	__be32 set;
++	__be32 clr;
++} __packed;
++
+ struct ath9k_htc_tx_event {
+ 	int count;
+ 	struct __wmi_event_txstatus txs;
+@@ -156,10 +164,18 @@ struct wmi {
+ 
+ 	spinlock_t wmi_lock;
+ 
++	/* multi write section */
+ 	atomic_t mwrite_cnt;
+ 	struct register_write multi_write[MAX_CMD_NUMBER];
+ 	u32 multi_write_idx;
+ 	struct mutex multi_write_mutex;
++
++	/* multi rmw section */
++	atomic_t m_rmw_cnt;
++	struct register_rmw multi_rmw[MAX_RMW_CMD_NUMBER];
++	u32 multi_rmw_idx;
++	struct mutex multi_rmw_mutex;
++
+ };
+ 
+ struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv);

+ 89 - 0
package/kernel/mac80211/patches/320-ath9k-ar9271_hw_pa_cal-use-defs-instead-of-magin-num.patch

@@ -0,0 +1,89 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:47 +0100
+Subject: [PATCH] ath9k: ar9271_hw_pa_cal - use defs instead of magin
+ numbers
+
+This function uses mixed styles for register names/numbers which
+is make harder reading and optimisation.
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
++++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+@@ -430,22 +430,22 @@ static void ar9271_hw_pa_cal(struct ath_
+ 	u32 regVal;
+ 	unsigned int i;
+ 	u32 regList[][2] = {
+-		{ 0x786c, 0 },
+-		{ 0x7854, 0 },
+-		{ 0x7820, 0 },
+-		{ 0x7824, 0 },
+-		{ 0x7868, 0 },
+-		{ 0x783c, 0 },
+-		{ 0x7838, 0 } ,
+-		{ 0x7828, 0 } ,
++		{ AR9285_AN_TOP3, 0 },
++		{ AR9285_AN_RXTXBB1, 0 },
++		{ AR9285_AN_RF2G1, 0 },
++		{ AR9285_AN_RF2G2, 0 },
++		{ AR9285_AN_TOP2, 0 },
++		{ AR9285_AN_RF2G8, 0 },
++		{ AR9285_AN_RF2G7, 0 } ,
++		{ AR9285_AN_RF2G3, 0 } ,
+ 	};
+ 
+ 	for (i = 0; i < ARRAY_SIZE(regList); i++)
+ 		regList[i][1] = REG_READ(ah, regList[i][0]);
+ 
+-	regVal = REG_READ(ah, 0x7834);
++	regVal = REG_READ(ah, AR9285_AN_RF2G6);
+ 	regVal &= (~(0x1));
+-	REG_WRITE(ah, 0x7834, regVal);
++	REG_WRITE(ah, AR9285_AN_RF2G6, regVal);
+ 	regVal = REG_READ(ah, 0x9808);
+ 	regVal |= (0x1 << 27);
+ 	REG_WRITE(ah, 0x9808, regVal);
+@@ -477,7 +477,7 @@ static void ar9271_hw_pa_cal(struct ath_
+ 	 * does not matter since we turn it off
+ 	 */
+ 	REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0);
+-
++	/* 7828, b0-11, ccom=fff */
+ 	REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9271_AN_RF2G3_CCOMP, 0xfff);
+ 
+ 	/* Set:
+@@ -490,15 +490,16 @@ static void ar9271_hw_pa_cal(struct ath_
+ 
+ 	/* find off_6_1; */
+ 	for (i = 6; i > 0; i--) {
+-		regVal = REG_READ(ah, 0x7834);
++		regVal = REG_READ(ah, AR9285_AN_RF2G6);
+ 		regVal |= (1 << (20 + i));
+-		REG_WRITE(ah, 0x7834, regVal);
++		REG_WRITE(ah, AR9285_AN_RF2G6, regVal);
+ 		udelay(1);
+ 		/* regVal = REG_READ(ah, 0x7834); */
+ 		regVal &= (~(0x1 << (20 + i)));
+-		regVal |= (MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9)
++		regVal |= (MS(REG_READ(ah, AR9285_AN_RF2G9),
++			      AR9285_AN_RXTXBB1_SPARE9)
+ 			    << (20 + i));
+-		REG_WRITE(ah, 0x7834, regVal);
++		REG_WRITE(ah, AR9285_AN_RF2G6, regVal);
+ 	}
+ 
+ 	regVal = (regVal >> 20) & 0x7f;
+@@ -517,9 +518,9 @@ static void ar9271_hw_pa_cal(struct ath_
+ 
+ 	ENABLE_REGWRITE_BUFFER(ah);
+ 
+-	regVal = REG_READ(ah, 0x7834);
++	regVal = REG_READ(ah, AR_AN_RF2G1_CH1);
+ 	regVal |= 0x1;
+-	REG_WRITE(ah, 0x7834, regVal);
++	REG_WRITE(ah, AR_AN_RF2G1_CH1, regVal);
+ 	regVal = REG_READ(ah, 0x9808);
+ 	regVal &= (~(0x1 << 27));
+ 	REG_WRITE(ah, 0x9808, regVal);

+ 79 - 0
package/kernel/mac80211/patches/321-ath9k-ar9271_hw_pa_cal-use-proper-makroses.patch

@@ -0,0 +1,79 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:48 +0100
+Subject: [PATCH] ath9k: ar9271_hw_pa_cal: use proper makroses.
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
++++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+@@ -443,33 +443,30 @@ static void ar9271_hw_pa_cal(struct ath_
+ 	for (i = 0; i < ARRAY_SIZE(regList); i++)
+ 		regList[i][1] = REG_READ(ah, regList[i][0]);
+ 
+-	regVal = REG_READ(ah, AR9285_AN_RF2G6);
+-	regVal &= (~(0x1));
+-	REG_WRITE(ah, AR9285_AN_RF2G6, regVal);
+-	regVal = REG_READ(ah, 0x9808);
+-	regVal |= (0x1 << 27);
+-	REG_WRITE(ah, 0x9808, regVal);
+-
++	/* 7834, b1=0 */
++	REG_CLR_BIT(ah, AR9285_AN_RF2G6, 1 << 0);
++	/* 9808, b27=1 */
++	REG_SET_BIT(ah, 0x9808, 1 << 27);
+ 	/* 786c,b23,1, pwddac=1 */
+-	REG_RMW_FIELD(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC, 1);
++	REG_SET_BIT(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC);
+ 	/* 7854, b5,1, pdrxtxbb=1 */
+-	REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1, 1);
++	REG_SET_BIT(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1);
+ 	/* 7854, b7,1, pdv2i=1 */
+-	REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I, 1);
++	REG_SET_BIT(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I);
+ 	/* 7854, b8,1, pddacinterface=1 */
+-	REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF, 1);
++	REG_SET_BIT(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF);
+ 	/* 7824,b12,0, offcal=0 */
+-	REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0);
++	REG_CLR_BIT(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL);
+ 	/* 7838, b1,0, pwddb=0 */
+-	REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0);
++	REG_CLR_BIT(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB);
+ 	/* 7820,b11,0, enpacal=0 */
+-	REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0);
++	REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL);
+ 	/* 7820,b25,1, pdpadrv1=0 */
+-	REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 0);
++	REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1);
+ 	/* 7820,b24,0, pdpadrv2=0 */
+-	REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2, 0);
++	REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2);
+ 	/* 7820,b23,0, pdpaout=0 */
+-	REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0);
++	REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT);
+ 	/* 783c,b14-16,7, padrvgn2tab_0=7 */
+ 	REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7);
+ 	/*
+@@ -516,15 +513,13 @@ static void ar9271_hw_pa_cal(struct ath_
+ 		ah->pacal_info.prev_offset = regVal;
+ 	}
+ 
+-	ENABLE_REGWRITE_BUFFER(ah);
+ 
+-	regVal = REG_READ(ah, AR_AN_RF2G1_CH1);
+-	regVal |= 0x1;
+-	REG_WRITE(ah, AR_AN_RF2G1_CH1, regVal);
+-	regVal = REG_READ(ah, 0x9808);
+-	regVal &= (~(0x1 << 27));
+-	REG_WRITE(ah, 0x9808, regVal);
++	/* 7834, b1=1 */
++	REG_SET_BIT(ah, AR9285_AN_RF2G6, 1 << 0);
++	/* 9808, b27=0 */
++	REG_CLR_BIT(ah, 0x9808, 1 << 27);
+ 
++	ENABLE_REGWRITE_BUFFER(ah);
+ 	for (i = 0; i < ARRAY_SIZE(regList); i++)
+ 		REG_WRITE(ah, regList[i][0], regList[i][1]);
+ 

+ 48 - 0
package/kernel/mac80211/patches/322-ath9k-ar9271_hw_pa_cal-use-RMW-buffer.patch

@@ -0,0 +1,48 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:49 +0100
+Subject: [PATCH] ath9k: ar9271_hw_pa_cal: use RMW buffer
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
++++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+@@ -436,13 +436,14 @@ static void ar9271_hw_pa_cal(struct ath_
+ 		{ AR9285_AN_RF2G2, 0 },
+ 		{ AR9285_AN_TOP2, 0 },
+ 		{ AR9285_AN_RF2G8, 0 },
+-		{ AR9285_AN_RF2G7, 0 } ,
+-		{ AR9285_AN_RF2G3, 0 } ,
++		{ AR9285_AN_RF2G7, 0 },
++		{ AR9285_AN_RF2G3, 0 },
+ 	};
+ 
+ 	for (i = 0; i < ARRAY_SIZE(regList); i++)
+ 		regList[i][1] = REG_READ(ah, regList[i][0]);
+ 
++	ENABLE_REG_RMW_BUFFER(ah);
+ 	/* 7834, b1=0 */
+ 	REG_CLR_BIT(ah, AR9285_AN_RF2G6, 1 << 0);
+ 	/* 9808, b27=1 */
+@@ -476,6 +477,7 @@ static void ar9271_hw_pa_cal(struct ath_
+ 	REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0);
+ 	/* 7828, b0-11, ccom=fff */
+ 	REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9271_AN_RF2G3_CCOMP, 0xfff);
++	REG_RMW_BUFFER_FLUSH(ah);
+ 
+ 	/* Set:
+ 	 * localmode=1,bmode=1,bmoderxtx=1,synthon=1,
+@@ -514,10 +516,12 @@ static void ar9271_hw_pa_cal(struct ath_
+ 	}
+ 
+ 
++	ENABLE_REG_RMW_BUFFER(ah);
+ 	/* 7834, b1=1 */
+ 	REG_SET_BIT(ah, AR9285_AN_RF2G6, 1 << 0);
+ 	/* 9808, b27=0 */
+ 	REG_CLR_BIT(ah, 0x9808, 1 << 27);
++	REG_RMW_BUFFER_FLUSH(ah);
+ 
+ 	ENABLE_REGWRITE_BUFFER(ah);
+ 	for (i = 0; i < ARRAY_SIZE(regList); i++)

+ 35 - 0
package/kernel/mac80211/patches/323-ath9k-add-multi_read-to-be-compatible-with-ath9k_htc.patch

@@ -0,0 +1,35 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:50 +0100
+Subject: [PATCH] ath9k: add multi_read to be compatible with ath9k_htc
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/init.c
++++ b/drivers/net/wireless/ath/ath9k/init.c
+@@ -141,6 +141,16 @@ static unsigned int ath9k_ioread32(void 
+ 	return val;
+ }
+ 
++static void ath9k_multi_ioread32(void *hw_priv, u32 *addr,
++                                u32 *val, u16 count)
++{
++	int i;
++
++	for (i = 0; i < count; i++)
++		val[i] = ath9k_ioread32(hw_priv, addr[i]);
++}
++
++
+ static unsigned int __ath9k_reg_rmw(struct ath_softc *sc, u32 reg_offset,
+ 				    u32 set, u32 clr)
+ {
+@@ -530,6 +540,7 @@ static int ath9k_init_softc(u16 devid, s
+ 	ah->hw = sc->hw;
+ 	ah->hw_version.devid = devid;
+ 	ah->reg_ops.read = ath9k_ioread32;
++	ah->reg_ops.multi_read = ath9k_multi_ioread32;
+ 	ah->reg_ops.write = ath9k_iowrite32;
+ 	ah->reg_ops.rmw = ath9k_reg_rmw;
+ 	pCap = &ah->caps;

+ 69 - 0
package/kernel/mac80211/patches/324-ath9k-add-new-function-ath9k_hw_read_array.patch

@@ -0,0 +1,69 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:51 +0100
+Subject: [PATCH] ath9k: add new function ath9k_hw_read_array
+
+REG_READ generate most overhead on usb bus. It send and read micro packages
+and reduce usb bandwidth. To reduce this overhead we should read in batches.
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -121,6 +121,36 @@ void ath9k_hw_write_array(struct ath_hw 
+ 	REGWRITE_BUFFER_FLUSH(ah);
+ }
+ 
++void ath9k_hw_read_array(struct ath_hw *ah, u32 array[][2], int size)
++{
++	u32 *tmp_reg_list, *tmp_data;
++	int i;
++
++	tmp_reg_list = kmalloc(size * sizeof(u32), GFP_KERNEL);
++	if (!tmp_reg_list) {
++		dev_err(ah->dev, "%s: tmp_reg_list: alloc filed\n", __func__);
++		return;
++	}
++
++	tmp_data = kmalloc(size * sizeof(u32), GFP_KERNEL);
++	if (!tmp_data) {
++		dev_err(ah->dev, "%s tmp_data: alloc filed\n", __func__);
++		goto error_tmp_data;
++	}
++
++	for (i = 0; i < size; i++)
++		tmp_reg_list[i] = array[i][0];
++
++	REG_READ_MULTI(ah, tmp_reg_list, tmp_data, size);
++
++	for (i = 0; i < size; i++)
++		array[i][1] = tmp_data[i];
++
++	kfree(tmp_data);
++error_tmp_data:
++	kfree(tmp_reg_list);
++}
++
+ u32 ath9k_hw_reverse_bits(u32 val, u32 n)
+ {
+ 	u32 retval;
+--- a/drivers/net/wireless/ath/ath9k/hw.h
++++ b/drivers/net/wireless/ath/ath9k/hw.h
+@@ -138,6 +138,8 @@
+ 
+ #define REG_WRITE_ARRAY(iniarray, column, regWr) \
+ 	ath9k_hw_write_array(ah, iniarray, column, &(regWr))
++#define REG_READ_ARRAY(ah, array, size) \
++	ath9k_hw_read_array(ah, array, size)
+ 
+ #define AR_GPIO_OUTPUT_MUX_AS_OUTPUT             0
+ #define AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED 1
+@@ -1020,6 +1022,7 @@ void ath9k_hw_synth_delay(struct ath_hw 
+ bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout);
+ void ath9k_hw_write_array(struct ath_hw *ah, const struct ar5416IniArray *array,
+ 			  int column, unsigned int *writecnt);
++void ath9k_hw_read_array(struct ath_hw *ah, u32 array[][2], int size);
+ u32 ath9k_hw_reverse_bits(u32 val, u32 n);
+ u16 ath9k_hw_computetxtime(struct ath_hw *ah,
+ 			   u8 phy, int kbps,

+ 24 - 0
package/kernel/mac80211/patches/325-ath9k-ar9271_hw_pa_cal-use-REG_READ_ARRAY.patch

@@ -0,0 +1,24 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:52 +0100
+Subject: [PATCH] ath9k: ar9271_hw_pa_cal: use REG_READ_ARRAY
+
+insted of reading each register separatly
+and waste 4ms on each operation, we can
+use one shot read.
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
++++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+@@ -440,8 +440,7 @@ static void ar9271_hw_pa_cal(struct ath_
+ 		{ AR9285_AN_RF2G3, 0 },
+ 	};
+ 
+-	for (i = 0; i < ARRAY_SIZE(regList); i++)
+-		regList[i][1] = REG_READ(ah, regList[i][0]);
++	REG_READ_ARRAY(ah, regList, ARRAY_SIZE(regList));
+ 
+ 	ENABLE_REG_RMW_BUFFER(ah);
+ 	/* 7834, b1=0 */

+ 39 - 0
package/kernel/mac80211/patches/326-ath9k-use-one-shot-read-in-ath9k_hw_update_mibstats.patch

@@ -0,0 +1,39 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:53 +0100
+Subject: [PATCH] ath9k: use one shot read in ath9k_hw_update_mibstats
+
+this will reduce some overhead on usb bus.
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ani.c
++++ b/drivers/net/wireless/ath/ath9k/ani.c
+@@ -107,11 +107,21 @@ static const struct ani_cck_level_entry 
+ static void ath9k_hw_update_mibstats(struct ath_hw *ah,
+ 				     struct ath9k_mib_stats *stats)
+ {
+-	stats->ackrcv_bad += REG_READ(ah, AR_ACK_FAIL);
+-	stats->rts_bad += REG_READ(ah, AR_RTS_FAIL);
+-	stats->fcs_bad += REG_READ(ah, AR_FCS_FAIL);
+-	stats->rts_good += REG_READ(ah, AR_RTS_OK);
+-	stats->beacons += REG_READ(ah, AR_BEACON_CNT);
++	u32 addr[5] = {AR_RTS_OK, AR_RTS_FAIL, AR_ACK_FAIL,
++		       AR_FCS_FAIL, AR_BEACON_CNT};
++	u32 data[5];
++
++	REG_READ_MULTI(ah, &addr[0], &data[0], 5);
++	/* AR_RTS_OK */
++	stats->rts_good += data[0];
++	/* AR_RTS_FAIL */
++	stats->rts_bad += data[1];
++	/* AR_ACK_FAIL */
++	stats->ackrcv_bad += data[2];
++	/* AR_FCS_FAIL */
++	stats->fcs_bad += data[3];
++	/* AR_BEACON_CNT */
++	stats->beacons += data[4];
+ }
+ 
+ static void ath9k_ani_restart(struct ath_hw *ah)

+ 71 - 0
package/kernel/mac80211/patches/327-ath9k-ath9k_hw_loadnf-use-REG_RMW.patch

@@ -0,0 +1,71 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:54 +0100
+Subject: [PATCH] ath9k: ath9k_hw_loadnf: use REG_RMW
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/calib.c
++++ b/drivers/net/wireless/ath/ath9k/calib.c
+@@ -238,7 +238,6 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
+ {
+ 	struct ath9k_nfcal_hist *h = NULL;
+ 	unsigned i, j;
+-	int32_t val;
+ 	u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask;
+ 	struct ath_common *common = ath9k_hw_common(ah);
+ 	s16 default_nf = ath9k_hw_get_default_nf(ah, chan);
+@@ -246,6 +245,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
+ 	if (ah->caldata)
+ 		h = ah->caldata->nfCalHist;
+ 
++	ENABLE_REG_RMW_BUFFER(ah);
+ 	for (i = 0; i < NUM_NF_READINGS; i++) {
+ 		if (chainmask & (1 << i)) {
+ 			s16 nfval;
+@@ -258,10 +258,8 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
+ 			else
+ 				nfval = default_nf;
+ 
+-			val = REG_READ(ah, ah->nf_regs[i]);
+-			val &= 0xFFFFFE00;
+-			val |= (((u32) nfval << 1) & 0x1ff);
+-			REG_WRITE(ah, ah->nf_regs[i], val);
++			REG_RMW(ah, ah->nf_regs[i],
++				(((u32) nfval << 1) & 0x1ff), 0x1ff);
+ 		}
+ 	}
+ 
+@@ -274,6 +272,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
+ 	REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL,
+ 		    AR_PHY_AGC_CONTROL_NO_UPDATE_NF);
+ 	REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF);
++	REG_RMW_BUFFER_FLUSH(ah);
+ 
+ 	/*
+ 	 * Wait for load to complete, should be fast, a few 10s of us.
+@@ -309,19 +308,17 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
+ 	 * by the median we just loaded.  This will be initial (and max) value
+ 	 * of next noise floor calibration the baseband does.
+ 	 */
+-	ENABLE_REGWRITE_BUFFER(ah);
++	ENABLE_REG_RMW_BUFFER(ah);
+ 	for (i = 0; i < NUM_NF_READINGS; i++) {
+ 		if (chainmask & (1 << i)) {
+ 			if ((i >= AR5416_MAX_CHAINS) && !IS_CHAN_HT40(chan))
+ 				continue;
+ 
+-			val = REG_READ(ah, ah->nf_regs[i]);
+-			val &= 0xFFFFFE00;
+-			val |= (((u32) (-50) << 1) & 0x1ff);
+-			REG_WRITE(ah, ah->nf_regs[i], val);
++			REG_RMW(ah, ah->nf_regs[i],
++					(((u32) (-50) << 1) & 0x1ff), 0x1ff);
+ 		}
+ 	}
+-	REGWRITE_BUFFER_FLUSH(ah);
++	REG_RMW_BUFFER_FLUSH(ah);
+ 
+ 	return 0;
+ }

+ 27 - 0
package/kernel/mac80211/patches/328-ath9k-write-buffer-related-optimisation-in-ar5008_hw.patch

@@ -0,0 +1,27 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:55 +0100
+Subject: [PATCH] ath9k: write buffer related optimisation in
+ ar5008_hw_set_channel_regs
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
++++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
+@@ -681,12 +681,13 @@ static void ar5008_hw_set_channel_regs(s
+ 			phymode |= AR_PHY_FC_DYN2040_PRI_CH;
+ 
+ 	}
++	ENABLE_REGWRITE_BUFFER(ah);
+ 	REG_WRITE(ah, AR_PHY_TURBO, phymode);
+ 
++	/* This function do only REG_WRITE, so
++	 * we can include it to REGWRITE_BUFFER. */
+ 	ath9k_hw_set11nmac2040(ah, chan);
+ 
+-	ENABLE_REGWRITE_BUFFER(ah);
+-
+ 	REG_WRITE(ah, AR_GTXTO, 25 << AR_GTXTO_TIMEOUT_LIMIT_S);
+ 	REG_WRITE(ah, AR_CST, 0xF << AR_CST_TIMEOUT_LIMIT_S);
+ 

+ 26 - 0
package/kernel/mac80211/patches/329-ath9k-ath9k_hw_set_4k_power_cal_tabl-use-rmw-buffer.patch

@@ -0,0 +1,26 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:56 +0100
+Subject: [PATCH] ath9k: ath9k_hw_set_4k_power_cal_tabl: use rmw buffer
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
++++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
+@@ -389,6 +389,7 @@ static void ath9k_hw_set_4k_power_cal_ta
+ 		}
+ 	}
+ 
++	ENABLE_REG_RMW_BUFFER(ah);
+ 	REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_NUM_PD_GAIN,
+ 		      (numXpdGain - 1) & 0x3);
+ 	REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_1,
+@@ -396,6 +397,7 @@ static void ath9k_hw_set_4k_power_cal_ta
+ 	REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_2,
+ 		      xpdGainValues[1]);
+ 	REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_3, 0);
++	REG_RMW_BUFFER_FLUSH(ah);
+ 
+ 	for (i = 0; i < AR5416_EEP4K_MAX_CHAINS; i++) {
+ 		regChainOffset = i * 0x1000;

+ 43 - 0
package/kernel/mac80211/patches/330-ath9k-use-rmw-buffer-in-ath9k_hw_set_operating_mode-.patch

@@ -0,0 +1,43 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:57 +0100
+Subject: [PATCH] ath9k: use rmw buffer in ath9k_hw_set_operating_mode
+ and ath9k_hw_reset
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -1227,6 +1227,7 @@ static void ath9k_hw_set_operating_mode(
+ 	u32 mask = AR_STA_ID1_STA_AP | AR_STA_ID1_ADHOC;
+ 	u32 set = AR_STA_ID1_KSRCH_MODE;
+ 
++	ENABLE_REG_RMW_BUFFER(ah);
+ 	switch (opmode) {
+ 	case NL80211_IFTYPE_ADHOC:
+ 		if (!AR_SREV_9340_13(ah)) {
+@@ -1248,6 +1249,7 @@ static void ath9k_hw_set_operating_mode(
+ 		break;
+ 	}
+ 	REG_RMW(ah, AR_STA_ID1, set, mask);
++	REG_RMW_BUFFER_FLUSH(ah);
+ }
+ 
+ void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,
+@@ -1960,6 +1962,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+ 	if (!ath9k_hw_mci_is_enabled(ah))
+ 		REG_WRITE(ah, AR_OBS, 8);
+ 
++	ENABLE_REG_RMW_BUFFER(ah);
+ 	if (ah->config.rx_intr_mitigation) {
+ 		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, ah->config.rimt_last);
+ 		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, ah->config.rimt_first);
+@@ -1969,6 +1972,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+ 		REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_LAST, 300);
+ 		REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_FIRST, 750);
+ 	}
++	REG_RMW_BUFFER_FLUSH(ah);
+ 
+ 	ath9k_hw_init_bb(ah, chan);
+ 

+ 26 - 0
package/kernel/mac80211/patches/331-ath9k-ath9k_hw_4k_set_board_values-use-rmw-buffer.patch

@@ -0,0 +1,26 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:58 +0100
+Subject: [PATCH] ath9k: ath9k_hw_4k_set_board_values: use rmw buffer
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
++++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
+@@ -1082,6 +1082,7 @@ static void ath9k_hw_4k_set_board_values
+ 		mask = BIT(0)|BIT(5)|BIT(10)|BIT(15)|BIT(20)|BIT(25);
+ 		pwrctrl = mask * bb_desired_scale;
+ 		clr = mask * 0x1f;
++		ENABLE_REG_RMW_BUFFER(ah);
+ 		REG_RMW(ah, AR_PHY_TX_PWRCTRL8, pwrctrl, clr);
+ 		REG_RMW(ah, AR_PHY_TX_PWRCTRL10, pwrctrl, clr);
+ 		REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL12, pwrctrl, clr);
+@@ -1096,6 +1097,7 @@ static void ath9k_hw_4k_set_board_values
+ 		clr = mask * 0x1f;
+ 		REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL11, pwrctrl, clr);
+ 		REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL13, pwrctrl, clr);
++		REG_RMW_BUFFER_FLUSH(ah);
+ 	}
+ }
+ 

+ 27 - 0
package/kernel/mac80211/patches/332-ath9k-ath9k_hw_analog_shift_rmw-use-REG_RMW.patch

@@ -0,0 +1,27 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:29:59 +0100
+Subject: [PATCH] ath9k: ath9k_hw_analog_shift_rmw: use REG_RMW
+
+use REG_RMW in ath9k_hw_analog_shift_rmw.
+It will double execution speed on usb bus.
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/eeprom.c
++++ b/drivers/net/wireless/ath/ath9k/eeprom.c
+@@ -27,12 +27,7 @@ void ath9k_hw_analog_shift_regwrite(stru
+ void ath9k_hw_analog_shift_rmw(struct ath_hw *ah, u32 reg, u32 mask,
+ 			       u32 shift, u32 val)
+ {
+-	u32 regVal;
+-
+-	regVal = REG_READ(ah, reg) & ~mask;
+-	regVal |= (val << shift) & mask;
+-
+-	REG_WRITE(ah, reg, regVal);
++	REG_RMW(ah, reg, ((val << shift) & mask), mask);
+ 
+ 	if (ah->config.analog_shiftreg)
+ 		udelay(100);

+ 47 - 0
package/kernel/mac80211/patches/333-ath9k-use-REG_RMW-and-rmw-buffer-in-ath9k_hw_4k_set_.patch

@@ -0,0 +1,47 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:30:01 +0100
+Subject: [PATCH] ath9k: use REG_RMW and rmw buffer in
+ ath9k_hw_4k_set_gain
+
+it is possible to reduce time needed for this function
+by rplacing REG_WRITE with REG_RMW (plus dummy 0) and putt all commands
+in same buffer.
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
++++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
+@@ -772,15 +772,14 @@ static void ath9k_hw_4k_set_gain(struct 
+ 				 struct ar5416_eeprom_4k *eep,
+ 				 u8 txRxAttenLocal)
+ {
+-	REG_WRITE(ah, AR_PHY_SWITCH_CHAIN_0,
+-		  pModal->antCtrlChain[0]);
+-
+-	REG_WRITE(ah, AR_PHY_TIMING_CTRL4(0),
+-		  (REG_READ(ah, AR_PHY_TIMING_CTRL4(0)) &
+-		   ~(AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF |
+-		     AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF)) |
+-		  SM(pModal->iqCalICh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF) |
+-		  SM(pModal->iqCalQCh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF));
++	ENABLE_REG_RMW_BUFFER(ah);
++	REG_RMW(ah, AR_PHY_SWITCH_CHAIN_0,
++		pModal->antCtrlChain[0], 0);
++
++	REG_RMW(ah, AR_PHY_TIMING_CTRL4(0),
++		SM(pModal->iqCalICh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF) |
++		SM(pModal->iqCalQCh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF),
++		AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF | AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF);
+ 
+ 	if ((eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >=
+ 	    AR5416_EEP_MINOR_VER_3) {
+@@ -819,6 +818,7 @@ static void ath9k_hw_4k_set_gain(struct 
+ 		      AR9280_PHY_RXGAIN_TXRX_ATTEN, txRxAttenLocal);
+ 	REG_RMW_FIELD(ah, AR_PHY_RXGAIN + 0x1000,
+ 		      AR9280_PHY_RXGAIN_TXRX_MARGIN, pModal->rxTxMarginCh[0]);
++	REG_RMW_BUFFER_FLUSH(ah);
+ }
+ 
+ /*

+ 67 - 0
package/kernel/mac80211/patches/334-ath9k-use-REG_RMW-and-rmw-buffer-in-ath9k_hw_def_set.patch

@@ -0,0 +1,67 @@
+From: Oleksij Rempel <[email protected]>
+Date: Sun, 22 Mar 2015 19:30:03 +0100
+Subject: [PATCH] ath9k: use REG_RMW and rmw buffer in
+ ath9k_hw_def_set_gain
+
+Signed-off-by: Oleksij Rempel <[email protected]>
+Signed-off-by: Kalle Valo <[email protected]>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
++++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
+@@ -466,6 +466,7 @@ static void ath9k_hw_def_set_gain(struct
+ 				  struct ar5416_eeprom_def *eep,
+ 				  u8 txRxAttenLocal, int regChainOffset, int i)
+ {
++	ENABLE_REG_RMW_BUFFER(ah);
+ 	if (AR5416_VER_MASK >= AR5416_EEP_MINOR_VER_3) {
+ 		txRxAttenLocal = pModal->txRxAttenCh[i];
+ 
+@@ -483,16 +484,12 @@ static void ath9k_hw_def_set_gain(struct
+ 			      AR_PHY_GAIN_2GHZ_XATTEN2_DB,
+ 			      pModal->xatten2Db[i]);
+ 		} else {
+-			REG_WRITE(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
+-			  (REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) &
+-			   ~AR_PHY_GAIN_2GHZ_BSW_MARGIN)
+-			  | SM(pModal-> bswMargin[i],
+-			       AR_PHY_GAIN_2GHZ_BSW_MARGIN));
+-			REG_WRITE(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
+-			  (REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) &
+-			   ~AR_PHY_GAIN_2GHZ_BSW_ATTEN)
+-			  | SM(pModal->bswAtten[i],
+-			       AR_PHY_GAIN_2GHZ_BSW_ATTEN));
++			REG_RMW(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
++				SM(pModal-> bswMargin[i], AR_PHY_GAIN_2GHZ_BSW_MARGIN),
++				AR_PHY_GAIN_2GHZ_BSW_MARGIN);
++			REG_RMW(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
++				SM(pModal->bswAtten[i], AR_PHY_GAIN_2GHZ_BSW_ATTEN),
++				AR_PHY_GAIN_2GHZ_BSW_ATTEN);
+ 		}
+ 	}
+ 
+@@ -504,17 +501,14 @@ static void ath9k_hw_def_set_gain(struct
+ 		      AR_PHY_RXGAIN + regChainOffset,
+ 		      AR9280_PHY_RXGAIN_TXRX_MARGIN, pModal->rxTxMarginCh[i]);
+ 	} else {
+-		REG_WRITE(ah,
+-			  AR_PHY_RXGAIN + regChainOffset,
+-			  (REG_READ(ah, AR_PHY_RXGAIN + regChainOffset) &
+-			   ~AR_PHY_RXGAIN_TXRX_ATTEN)
+-			  | SM(txRxAttenLocal, AR_PHY_RXGAIN_TXRX_ATTEN));
+-		REG_WRITE(ah,
+-			  AR_PHY_GAIN_2GHZ + regChainOffset,
+-			  (REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) &
+-			   ~AR_PHY_GAIN_2GHZ_RXTX_MARGIN) |
+-			  SM(pModal->rxTxMarginCh[i], AR_PHY_GAIN_2GHZ_RXTX_MARGIN));
++		REG_RMW(ah, AR_PHY_RXGAIN + regChainOffset,
++			SM(txRxAttenLocal, AR_PHY_RXGAIN_TXRX_ATTEN),
++			AR_PHY_RXGAIN_TXRX_ATTEN);
++		REG_RMW(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
++			SM(pModal->rxTxMarginCh[i], AR_PHY_GAIN_2GHZ_RXTX_MARGIN),
++			AR_PHY_GAIN_2GHZ_RXTX_MARGIN);
+ 	}
++	REG_RMW_BUFFER_FLUSH(ah);
+ }
+ 
+ static void ath9k_hw_def_set_board_values(struct ath_hw *ah,

+ 1 - 1
package/kernel/mac80211/patches/400-ath_move_debug_code.patch

@@ -14,7 +14,7 @@
  ccflags-y += -D__CHECK_ENDIAN__
 --- a/drivers/net/wireless/ath/ath.h
 +++ b/drivers/net/wireless/ath/ath.h
-@@ -313,13 +313,6 @@ void _ath_dbg(struct ath_common *common,
+@@ -316,13 +316,6 @@ void _ath_dbg(struct ath_common *common,
  #endif /* CPTCFG_ATH_DEBUG */
  
  /** Returns string describing opmode, or NULL if unknown mode. */

+ 1 - 1
package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -704,6 +704,7 @@ static const struct ieee80211_iface_limi
+@@ -715,6 +715,7 @@ static const struct ieee80211_iface_limi
  				 BIT(NL80211_IFTYPE_AP) },
  	{ .max = 1,	.types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
  				 BIT(NL80211_IFTYPE_P2P_GO) },

+ 1 - 1
package/kernel/mac80211/patches/501-ath9k_ahb_init.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -1012,23 +1012,23 @@ static int __init ath9k_init(void)
+@@ -1023,23 +1023,23 @@ static int __init ath9k_init(void)
  {
  	int error;
  

+ 1 - 1
package/kernel/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -358,13 +358,8 @@ static void ath9k_hw_init_config(struct 
+@@ -388,13 +388,8 @@ static void ath9k_hw_init_config(struct 
  
  	ah->config.rx_intr_mitigation = true;
  

+ 1 - 1
package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch

@@ -64,7 +64,7 @@
  	debugfs_create_devm_seqfile(sc->dev, "interrupt", sc->debug.debugfs_phy,
 --- a/drivers/net/wireless/ath/ath.h
 +++ b/drivers/net/wireless/ath/ath.h
-@@ -148,6 +148,7 @@ struct ath_common {
+@@ -151,6 +151,7 @@ struct ath_common {
  	int debug_mask;
  	enum ath_device_state state;
  	unsigned long op_flags;

+ 1 - 1
package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -616,6 +616,7 @@ int ath9k_hw_init(struct ath_hw *ah)
+@@ -646,6 +646,7 @@ int ath9k_hw_init(struct ath_hw *ah)
  
  	/* These are all the AR5008/AR9001/AR9002/AR9003 hardware family of chipsets */
  	switch (ah->hw_version.devid) {

+ 1 - 1
package/kernel/mac80211/patches/530-ath9k_extra_leds.patch

@@ -165,7 +165,7 @@
  void ath_fill_led_pin(struct ath_softc *sc)
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -924,7 +924,7 @@ int ath9k_init_device(u16 devid, struct 
+@@ -935,7 +935,7 @@ int ath9k_init_device(u16 devid, struct 
  
  #ifdef CPTCFG_MAC80211_LEDS
  	/* must be initialized before ieee80211_register_hw */

+ 5 - 5
package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch

@@ -62,7 +62,7 @@
  	debugfs_create_devm_seqfile(sc->dev, "interrupt", sc->debug.debugfs_phy,
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -499,6 +499,12 @@ enum {
+@@ -513,6 +513,12 @@ enum {
  	ATH9K_RESET_COLD,
  };
  
@@ -75,7 +75,7 @@
  struct ath9k_hw_version {
  	u32 magic;
  	u16 devid;
-@@ -780,6 +786,8 @@ struct ath_hw {
+@@ -794,6 +800,8 @@ struct ath_hw {
  	u32 rfkill_polarity;
  	u32 ah_flags;
  
@@ -84,7 +84,7 @@
  	bool reset_power_on;
  	bool htc_reset_init;
  
-@@ -1040,6 +1048,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
+@@ -1055,6 +1063,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
  bool ath9k_hw_check_alive(struct ath_hw *ah);
  
  bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
@@ -94,7 +94,7 @@
  struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1771,6 +1771,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
+@@ -1803,6 +1803,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
  }
  EXPORT_SYMBOL(ath9k_hw_get_tsf_offset);
  
@@ -115,7 +115,7 @@
  int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
  		   struct ath9k_hw_cal_data *caldata, bool fastcc)
  {
-@@ -1977,6 +1991,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2011,6 +2025,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  		ar9003_hw_disable_phy_restart(ah);
  
  	ath9k_hw_apply_gpio_override(ah);

+ 7 - 7
package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -696,6 +696,7 @@ struct ath_spec_scan {
+@@ -710,6 +710,7 @@ struct ath_spec_scan {
   * @config_pci_powersave:
   * @calibrate: periodic calibration for NF, ANI, IQ, ADC gain, ADC-DC
   *
@@ -8,7 +8,7 @@
   * @spectral_scan_config: set parameters for spectral scan and enable/disable it
   * @spectral_scan_trigger: trigger a spectral scan run
   * @spectral_scan_wait: wait for a spectral scan run to finish
-@@ -718,6 +719,7 @@ struct ath_hw_ops {
+@@ -732,6 +733,7 @@ struct ath_hw_ops {
  			struct ath_hw_antcomb_conf *antconf);
  	void (*antdiv_comb_conf_set)(struct ath_hw *ah,
  			struct ath_hw_antcomb_conf *antconf);
@@ -55,7 +55,7 @@
  	ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -692,7 +692,8 @@ static void ath9k_init_txpower_limits(st
+@@ -703,7 +703,8 @@ static void ath9k_init_txpower_limits(st
  	if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
  		ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ);
  
@@ -65,7 +65,7 @@
  }
  
  static const struct ieee80211_iface_limit if_limits[] = {
-@@ -884,6 +885,18 @@ static void ath9k_set_hw_capab(struct at
+@@ -895,6 +896,18 @@ static void ath9k_set_hw_capab(struct at
  	SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
  }
  
@@ -84,7 +84,7 @@
  int ath9k_init_device(u16 devid, struct ath_softc *sc,
  		    const struct ath_bus_ops *bus_ops)
  {
-@@ -929,6 +942,8 @@ int ath9k_init_device(u16 devid, struct 
+@@ -940,6 +953,8 @@ int ath9k_init_device(u16 devid, struct 
  		ARRAY_SIZE(ath9k_tpt_blink));
  #endif
  
@@ -110,7 +110,7 @@
  static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
 +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -1315,9 +1315,30 @@ void ar5008_hw_init_rate_txpower(struct 
+@@ -1316,9 +1316,30 @@ void ar5008_hw_init_rate_txpower(struct 
  	}
  }
  
@@ -141,7 +141,7 @@
  	static const u32 ar5416_cca_regs[6] = {
  		AR_PHY_CCA,
  		AR_PHY_CH1_CCA,
-@@ -1332,6 +1353,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
+@@ -1333,6 +1354,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
  	if (ret)
  	    return ret;
  

+ 5 - 5
package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -215,6 +215,19 @@ void ath9k_hw_get_channel_centers(struct
+@@ -245,6 +245,19 @@ void ath9k_hw_get_channel_centers(struct
  		centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
  }
  
@@ -20,7 +20,7 @@
  /******************/
  /* Chip Revisions */
  /******************/
-@@ -1349,6 +1362,9 @@ static bool ath9k_hw_set_reset(struct at
+@@ -1381,6 +1394,9 @@ static bool ath9k_hw_set_reset(struct at
  	if (AR_SREV_9100(ah))
  		udelay(50);
  
@@ -30,7 +30,7 @@
  	return true;
  }
  
-@@ -1448,6 +1464,9 @@ static bool ath9k_hw_chip_reset(struct a
+@@ -1480,6 +1496,9 @@ static bool ath9k_hw_chip_reset(struct a
  		ar9003_hw_internal_regulator_apply(ah);
  	ath9k_hw_init_pll(ah, chan);
  
@@ -40,7 +40,7 @@
  	return true;
  }
  
-@@ -1749,8 +1768,14 @@ static int ath9k_hw_do_fastcc(struct ath
+@@ -1781,8 +1800,14 @@ static int ath9k_hw_do_fastcc(struct ath
  	if (AR_SREV_9271(ah))
  		ar9002_hw_load_ani_reg(ah, chan);
  
@@ -55,7 +55,7 @@
  	return -EINVAL;
  }
  
-@@ -2002,6 +2027,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2036,6 +2061,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  		ath9k_hw_set_radar_params(ah);
  	}
  

+ 1 - 1
package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
 +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -944,55 +944,6 @@ static bool ar5008_hw_ani_control_new(st
+@@ -945,55 +945,6 @@ static bool ar5008_hw_ani_control_new(st
  		 * on == 0 means more noise imm
  		 */
  		u32 on = param ? 1 : 0;