diff options
Diffstat (limited to 'package/kernel/mac80211/patches/324-ath9k-add-new-function-ath9k_hw_read_array.patch')
-rw-r--r-- | package/kernel/mac80211/patches/324-ath9k-add-new-function-ath9k_hw_read_array.patch | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/324-ath9k-add-new-function-ath9k_hw_read_array.patch b/package/kernel/mac80211/patches/324-ath9k-add-new-function-ath9k_hw_read_array.patch new file mode 100644 index 0000000..41c6ff5 --- /dev/null +++ b/package/kernel/mac80211/patches/324-ath9k-add-new-function-ath9k_hw_read_array.patch @@ -0,0 +1,69 @@ +From: Oleksij Rempel <linux@rempel-privat.de> +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 <linux@rempel-privat.de> +Signed-off-by: Kalle Valo <kvalo@codeaurora.org> +--- + +--- 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, |