From: Felix Fietkau Date: Fri, 7 Nov 2014 11:12:51 +0000 (+0000) Subject: mac80211: merge a few pending upstream fixes X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=82e2aeb59952899bd0dbcf728d2e2788570a2561;p=librecmc%2Flibrecmc.git mac80211: merge a few pending upstream fixes Signed-off-by: Felix Fietkau SVN-Revision: 43208 --- diff --git a/package/kernel/mac80211/patches/348-ath9k-Fix-RTC_DERIVED_CLK-usage.patch b/package/kernel/mac80211/patches/348-ath9k-Fix-RTC_DERIVED_CLK-usage.patch new file mode 100644 index 0000000000..a9205c0536 --- /dev/null +++ b/package/kernel/mac80211/patches/348-ath9k-Fix-RTC_DERIVED_CLK-usage.patch @@ -0,0 +1,61 @@ +From: Miaoqing Pan +Date: Thu, 6 Nov 2014 10:52:23 +0530 +Subject: [PATCH] ath9k: Fix RTC_DERIVED_CLK usage + +Based on the reference clock, which could be 25MHz or 40MHz, +AR_RTC_DERIVED_CLK is programmed differently for AR9340 and AR9550. +But, when a chip reset is done, processing the initvals +sets the register back to the default value. + +Fix this by moving the code in ath9k_hw_init_pll() to +ar9003_hw_override_ini(). Also, do this override for AR9531. + +Cc: stable@vger.kernel.org +Signed-off-by: Miaoqing Pan +Signed-off-by: Sujith Manoharan +--- + +--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c +@@ -664,6 +664,19 @@ static void ar9003_hw_override_ini(struc + ah->enabled_cals |= TX_CL_CAL; + else + ah->enabled_cals &= ~TX_CL_CAL; ++ ++ if (AR_SREV_9340(ah) || AR_SREV_9531(ah) || AR_SREV_9550(ah)) { ++ if (ah->is_clk_25mhz) { ++ REG_WRITE(ah, AR_RTC_DERIVED_CLK, 0x17c << 1); ++ REG_WRITE(ah, AR_SLP32_MODE, 0x0010f3d7); ++ REG_WRITE(ah, AR_SLP32_INC, 0x0001e7ae); ++ } else { ++ REG_WRITE(ah, AR_RTC_DERIVED_CLK, 0x261 << 1); ++ REG_WRITE(ah, AR_SLP32_MODE, 0x0010f400); ++ REG_WRITE(ah, AR_SLP32_INC, 0x0001e800); ++ } ++ udelay(100); ++ } + } + + static void ar9003_hw_prog_ini(struct ath_hw *ah, +--- a/drivers/net/wireless/ath/ath9k/hw.c ++++ b/drivers/net/wireless/ath/ath9k/hw.c +@@ -870,19 +870,6 @@ static void ath9k_hw_init_pll(struct ath + udelay(RTC_PLL_SETTLE_DELAY); + + REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK); +- +- if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) { +- if (ah->is_clk_25mhz) { +- REG_WRITE(ah, AR_RTC_DERIVED_CLK, 0x17c << 1); +- REG_WRITE(ah, AR_SLP32_MODE, 0x0010f3d7); +- REG_WRITE(ah, AR_SLP32_INC, 0x0001e7ae); +- } else { +- REG_WRITE(ah, AR_RTC_DERIVED_CLK, 0x261 << 1); +- REG_WRITE(ah, AR_SLP32_MODE, 0x0010f400); +- REG_WRITE(ah, AR_SLP32_INC, 0x0001e800); +- } +- udelay(100); +- } + } + + static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah, diff --git a/package/kernel/mac80211/patches/349-b43-fix-NULL-pointer-dereference-in-b43_phy_copy.patch b/package/kernel/mac80211/patches/349-b43-fix-NULL-pointer-dereference-in-b43_phy_copy.patch new file mode 100644 index 0000000000..649ed6bd55 --- /dev/null +++ b/package/kernel/mac80211/patches/349-b43-fix-NULL-pointer-dereference-in-b43_phy_copy.patch @@ -0,0 +1,38 @@ +From: Hauke Mehrtens +Date: Wed, 5 Nov 2014 23:31:07 +0100 +Subject: [PATCH] b43: fix NULL pointer dereference in b43_phy_copy() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +phy_read and phy_write are not set for every phy any more sine this: +commit d342b95dd735014a590f9051b1ba227eb54ca8f6 +Author: Rafał Miłecki +Date: Thu Jul 31 21:59:43 2014 +0200 + + b43: don't duplicate common PHY read/write ops + +b43_phy_copy() accesses phy_read and phy_write directly and will fail +with some phys. This patch fixes the regression by using the +b43_phy_read() and b43_phy_write() functions which should be used for +read and write access. + +This should fix this bug report: +https://bugzilla.kernel.org/show_bug.cgi?id=87731 + +Reported-by: Volker Kempter +Signed-off-by: Hauke Mehrtens +--- + +--- a/drivers/net/wireless/b43/phy_common.c ++++ b/drivers/net/wireless/b43/phy_common.c +@@ -301,8 +301,7 @@ void b43_phy_write(struct b43_wldev *dev + void b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg) + { + assert_mac_suspended(dev); +- dev->phy.ops->phy_write(dev, destreg, +- dev->phy.ops->phy_read(dev, srcreg)); ++ b43_phy_write(dev, destreg, b43_phy_read(dev, srcreg)); + } + + void b43_phy_mask(struct b43_wldev *dev, u16 offset, u16 mask) diff --git a/package/kernel/mac80211/patches/350-ath9k-fix-misc-debugfs-when-not-using-chan-context.patch b/package/kernel/mac80211/patches/350-ath9k-fix-misc-debugfs-when-not-using-chan-context.patch new file mode 100644 index 0000000000..30b3dcffad --- /dev/null +++ b/package/kernel/mac80211/patches/350-ath9k-fix-misc-debugfs-when-not-using-chan-context.patch @@ -0,0 +1,33 @@ +From: Ben Greear +Date: Tue, 4 Nov 2014 15:22:49 -0800 +Subject: [PATCH] ath9k: fix misc debugfs when not using chan context + +When channel-context is not enabled, all vifs belong to +the first context, but it is not configured as 'assigned'. + +Fix misc debugfs file to print out info for non-assigned +contexts, and also print whether ctx is assigned or not. + +Signed-off-by: Ben Greear +--- + +--- a/drivers/net/wireless/ath/ath9k/debug.c ++++ b/drivers/net/wireless/ath/ath9k/debug.c +@@ -828,13 +828,14 @@ static ssize_t read_file_misc(struct fil + + i = 0; + ath_for_each_chanctx(sc, ctx) { +- if (!ctx->assigned || list_empty(&ctx->vifs)) ++ if (list_empty(&ctx->vifs)) + continue; + ath9k_calculate_iter_data(sc, ctx, &iter_data); + + len += scnprintf(buf + len, sizeof(buf) - len, +- "VIF-COUNTS: CTX %i AP: %i STA: %i MESH: %i WDS: %i", +- i++, iter_data.naps, iter_data.nstations, ++ "VIFS: CTX %i(%i) AP: %i STA: %i MESH: %i WDS: %i", ++ i++, (int)(ctx->assigned), iter_data.naps, ++ iter_data.nstations, + iter_data.nmeshes, iter_data.nwds); + len += scnprintf(buf + len, sizeof(buf) - len, + " ADHOC: %i TOTAL: %hi BEACON-VIF: %hi\n", diff --git a/package/kernel/mac80211/patches/351-ath9k-fix-regression-in-bssidmask-calculation.patch b/package/kernel/mac80211/patches/351-ath9k-fix-regression-in-bssidmask-calculation.patch new file mode 100644 index 0000000000..d5963925dc --- /dev/null +++ b/package/kernel/mac80211/patches/351-ath9k-fix-regression-in-bssidmask-calculation.patch @@ -0,0 +1,70 @@ +From: Ben Greear +Date: Tue, 4 Nov 2014 15:22:50 -0800 +Subject: [PATCH] ath9k: fix regression in bssidmask calculation + +The commit that went into 3.17: + + ath9k: Summarize hw state per channel context + + Group and set hw state (opmode, primary_sta, beacon conf) per + channel context instead of whole list of vifs. This would allow + each channel context to run in different mode (STA/AP). + + Signed-off-by: Felix Fietkau + Signed-off-by: Rajkumar Manoharan + Signed-off-by: John W. Linville + +broke multi-vif configuration due to not properly calculating +the bssid mask. + +The test case that caught this was: + + create wlan0 and sta0-4 (6 total), not sure how much that matters. + associate all 6 (works fine) + disconnect 5 of them, leaving sta0 up + Start trying to bring up the other 5 one at a time. It will + fail, with iw events looking like this (in these logs, several + sta are trying to come up, but symptom is the same with just one) + +The patch causing the regression made quite a few changes, but +the part I think caused this particular problem was not +recalculating the bssid mask when adding and removing interfaces. + +Re-adding those calls fixes my test case. Fix bad comment +as well. + +Signed-off-by: Ben Greear +--- + +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -994,9 +994,8 @@ void ath9k_calculate_iter_data(struct at + struct ath_vif *avp; + + /* +- * Pick the MAC address of the first interface as the new hardware +- * MAC address. The hardware will use it together with the BSSID mask +- * when matching addresses. ++ * The hardware will use primary station addr together with the ++ * BSSID mask when matching addresses. + */ + memset(iter_data, 0, sizeof(*iter_data)); + memset(&iter_data->mask, 0xff, ETH_ALEN); +@@ -1225,6 +1224,8 @@ static int ath9k_add_interface(struct ie + list_add_tail(&avp->list, &avp->chanctx->vifs); + } + ++ ath9k_calculate_summary_state(sc, avp->chanctx); ++ + ath9k_assign_hw_queues(hw, vif); + + an->sc = sc; +@@ -1294,6 +1295,8 @@ static void ath9k_remove_interface(struc + + ath_tx_node_cleanup(sc, &avp->mcast_node); + ++ ath9k_calculate_summary_state(sc, avp->chanctx); ++ + mutex_unlock(&sc->mutex); + } + diff --git a/package/kernel/mac80211/patches/352-mac80211-fix-use-after-free-in-defragmentation.patch b/package/kernel/mac80211/patches/352-mac80211-fix-use-after-free-in-defragmentation.patch new file mode 100644 index 0000000000..f7472e0a4e --- /dev/null +++ b/package/kernel/mac80211/patches/352-mac80211-fix-use-after-free-in-defragmentation.patch @@ -0,0 +1,50 @@ +From: Johannes Berg +Date: Mon, 3 Nov 2014 14:29:09 +0100 +Subject: [PATCH] mac80211: fix use-after-free in defragmentation + +Upon receiving the last fragment, all but the first fragment +are freed, but the multicast check for statistics at the end +of the function refers to the current skb (the last fragment) +causing a use-after-free bug. + +Since multicast frames cannot be fragmented and we check for +this early in the function, just modify that check to also +do the accounting to fix the issue. + +Cc: stable@vger.kernel.org +Reported-by: Yosef Khyal +Signed-off-by: Johannes Berg +--- + +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -1678,11 +1678,14 @@ ieee80211_rx_h_defragment(struct ieee802 + sc = le16_to_cpu(hdr->seq_ctrl); + frag = sc & IEEE80211_SCTL_FRAG; + +- if (likely((!ieee80211_has_morefrags(fc) && frag == 0) || +- is_multicast_ether_addr(hdr->addr1))) { +- /* not fragmented */ ++ if (likely(!ieee80211_has_morefrags(fc) && frag == 0)) ++ goto out; ++ ++ if (is_multicast_ether_addr(hdr->addr1)) { ++ rx->local->dot11MulticastReceivedFrameCount++; + goto out; + } ++ + I802_DEBUG_INC(rx->local->rx_handlers_fragments); + + if (skb_linearize(rx->skb)) +@@ -1775,10 +1778,7 @@ ieee80211_rx_h_defragment(struct ieee802 + out: + if (rx->sta) + rx->sta->rx_packets++; +- if (is_multicast_ether_addr(hdr->addr1)) +- rx->local->dot11MulticastReceivedFrameCount++; +- else +- ieee80211_led_rx(rx->local); ++ ieee80211_led_rx(rx->local); + return RX_CONTINUE; + } + diff --git a/package/kernel/mac80211/patches/353-rt2x00-do-not-align-payload-on-modern-H-W.patch b/package/kernel/mac80211/patches/353-rt2x00-do-not-align-payload-on-modern-H-W.patch new file mode 100644 index 0000000000..384a0be808 --- /dev/null +++ b/package/kernel/mac80211/patches/353-rt2x00-do-not-align-payload-on-modern-H-W.patch @@ -0,0 +1,95 @@ +From: Stanislaw Gruszka +Date: Sun, 2 Nov 2014 13:38:47 +0100 +Subject: [PATCH] rt2x00: do not align payload on modern H/W + +RT2800 and newer hardware require padding between header and payload if +header length is not multiple of 4. + +For historical reasons we also align payload to to 4 bytes boundary, but +such alignment is not needed on modern H/W. + +Patch improve performance on embedded CPUs and _possibly_ fixes +skb_under_panic problems reported from time to time: + +https://bugzilla.kernel.org/show_bug.cgi?id=84911 +https://bugzilla.kernel.org/show_bug.cgi?id=72471 +http://marc.info/?l=linux-wireless&m=139108549530402&w=2 +https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1087591 + +But we can not explain or otherwise confirm the patch fixes this panic +issue for sure. + +Originally-From: Helmut Schaa +Signed-off-by: Stanislaw Gruszka +--- + +--- a/drivers/net/wireless/rt2x00/rt2x00queue.c ++++ b/drivers/net/wireless/rt2x00/rt2x00queue.c +@@ -158,55 +158,29 @@ void rt2x00queue_align_frame(struct sk_b + skb_trim(skb, frame_length); + } + +-void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length) ++/* ++ * H/W needs L2 padding between the header and the paylod if header size ++ * is not 4 bytes aligned. ++ */ ++void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int hdr_len) + { +- unsigned int payload_length = skb->len - header_length; +- unsigned int header_align = ALIGN_SIZE(skb, 0); +- unsigned int payload_align = ALIGN_SIZE(skb, header_length); +- unsigned int l2pad = payload_length ? L2PAD_SIZE(header_length) : 0; ++ unsigned int l2pad = (skb->len > hdr_len) ? L2PAD_SIZE(hdr_len) : 0; + +- /* +- * Adjust the header alignment if the payload needs to be moved more +- * than the header. +- */ +- if (payload_align > header_align) +- header_align += 4; +- +- /* There is nothing to do if no alignment is needed */ +- if (!header_align) ++ if (!l2pad) + return; + +- /* Reserve the amount of space needed in front of the frame */ +- skb_push(skb, header_align); +- +- /* +- * Move the header. +- */ +- memmove(skb->data, skb->data + header_align, header_length); +- +- /* Move the payload, if present and if required */ +- if (payload_length && payload_align) +- memmove(skb->data + header_length + l2pad, +- skb->data + header_length + l2pad + payload_align, +- payload_length); +- +- /* Trim the skb to the correct size */ +- skb_trim(skb, header_length + l2pad + payload_length); ++ skb_push(skb, l2pad); ++ memmove(skb->data, skb->data + l2pad, hdr_len); + } + +-void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length) ++void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int hdr_len) + { +- /* +- * L2 padding is only present if the skb contains more than just the +- * IEEE 802.11 header. +- */ +- unsigned int l2pad = (skb->len > header_length) ? +- L2PAD_SIZE(header_length) : 0; ++ unsigned int l2pad = (skb->len > hdr_len) ? L2PAD_SIZE(hdr_len) : 0; + + if (!l2pad) + return; + +- memmove(skb->data + l2pad, skb->data, header_length); ++ memmove(skb->data + l2pad, skb->data, hdr_len); + skb_pull(skb, l2pad); + } + diff --git a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch index 63e1b4523b..dfcbe5693f 100644 --- a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch +++ b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1313,6 +1313,53 @@ void ath9k_deinit_debug(struct ath_softc +@@ -1314,6 +1314,53 @@ void ath9k_deinit_debug(struct ath_softc ath9k_spectral_deinit_debug(sc); } @@ -54,7 +54,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1332,6 +1379,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1333,6 +1380,8 @@ int ath9k_init_debug(struct ath_hw *ah) ath9k_tx99_init_debug(sc); ath9k_spectral_init_debug(sc); diff --git a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch index fae3102206..e8a92c483e 100644 --- a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch +++ b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1360,6 +1360,52 @@ static const struct file_operations fops +@@ -1361,6 +1361,52 @@ static const struct file_operations fops .owner = THIS_MODULE }; @@ -53,7 +53,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1381,6 +1427,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1382,6 +1428,8 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, &fops_eeprom); diff --git a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch index b383fd3a9a..d7dd4314fd 100644 --- a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch +++ b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch @@ -173,7 +173,7 @@ #endif --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1405,6 +1405,61 @@ static const struct file_operations fops +@@ -1406,6 +1406,61 @@ static const struct file_operations fops .llseek = default_llseek, }; @@ -235,7 +235,7 @@ int ath9k_init_debug(struct ath_hw *ah) { -@@ -1429,6 +1484,10 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1430,6 +1485,10 @@ int ath9k_init_debug(struct ath_hw *ah) &fops_eeprom); debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_chanbw); diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch index c8f9243d18..38c0c63529 100644 --- a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch +++ b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1461,6 +1461,50 @@ static const struct file_operations fops +@@ -1462,6 +1462,50 @@ static const struct file_operations fops #endif @@ -51,7 +51,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1488,6 +1532,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1489,6 +1533,8 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_file("gpio_led", S_IWUSR, sc->debug.debugfs_phy, sc, &fops_gpio_led); #endif @@ -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 -@@ -1766,6 +1766,20 @@ u32 ath9k_hw_get_tsf_offset(struct times +@@ -1753,6 +1753,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) { -@@ -1970,6 +1984,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st +@@ -1957,6 +1971,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st ar9003_hw_disable_phy_restart(ah); ath9k_hw_apply_gpio_override(ah); diff --git a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch index e536e1e9ed..304eb7dc8a 100644 --- a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch +++ b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch @@ -18,7 +18,7 @@ void (*spectral_scan_trigger)(struct ath_hw *ah); --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c -@@ -1783,6 +1783,26 @@ static void ar9003_hw_tx99_set_txpower(s +@@ -1796,6 +1796,26 @@ static void ar9003_hw_tx99_set_txpower(s ATH9K_POW_SM(p_pwr_array[ALL_TARGET_HT40_14], 0)); } @@ -45,7 +45,7 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah) { struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); -@@ -1818,6 +1838,7 @@ void ar9003_hw_attach_phy_ops(struct ath +@@ -1831,6 +1851,7 @@ void ar9003_hw_attach_phy_ops(struct ath priv_ops->set_radar_params = ar9003_hw_set_radar_params; priv_ops->fast_chan_change = ar9003_hw_fast_chan_change; diff --git a/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch b/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch index b6e7b73903..68d121a4d1 100644 --- a/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch +++ b/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch @@ -20,7 +20,7 @@ /******************/ /* Chip Revisions */ /******************/ -@@ -1351,6 +1364,9 @@ static bool ath9k_hw_set_reset(struct at +@@ -1338,6 +1351,9 @@ static bool ath9k_hw_set_reset(struct at if (AR_SREV_9100(ah)) udelay(50); @@ -30,7 +30,7 @@ return true; } -@@ -1450,6 +1466,9 @@ static bool ath9k_hw_chip_reset(struct a +@@ -1437,6 +1453,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; } -@@ -1744,8 +1763,14 @@ static int ath9k_hw_do_fastcc(struct ath +@@ -1731,8 +1750,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; } -@@ -1995,6 +2020,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st +@@ -1982,6 +2007,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st ath9k_hw_set_radar_params(ah); } diff --git a/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch b/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch index d18a1ff530..5db8c4a510 100644 --- a/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch +++ b/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch @@ -79,7 +79,7 @@ /** * ar9003_hw_set_channel - set channel on single-chip device * @ah: atheros hardware structure -@@ -971,11 +957,6 @@ static bool ar9003_hw_ani_control(struct +@@ -984,11 +970,6 @@ static bool ar9003_hw_ani_control(struct struct ath_common *common = ath9k_hw_common(ah); struct ath9k_channel *chan = ah->curchan; struct ar5416AniState *aniState = &ah->ani; @@ -91,7 +91,7 @@ s32 value, value2; switch (cmd & ah->ani_function) { -@@ -989,61 +970,6 @@ static bool ar9003_hw_ani_control(struct +@@ -1002,61 +983,6 @@ static bool ar9003_hw_ani_control(struct */ u32 on = param ? 1 : 0; diff --git a/package/kernel/mac80211/patches/606-rt2x00_no_realign.patch b/package/kernel/mac80211/patches/606-rt2x00_no_realign.patch deleted file mode 100644 index 7e321922f1..0000000000 --- a/package/kernel/mac80211/patches/606-rt2x00_no_realign.patch +++ /dev/null @@ -1,67 +0,0 @@ -[RFC] rt2x00: For drivers that only need L2 padding don't realign frames - -Signed-off-by: Helmut Schaa ---- - -Ivo, Gertjan, do you remeber by any chance why this alignment stuff was added -in the first place? Was it because of DMA restrictions? - -While doing some profiling on the rt3052 SoC I noticed that 30-40% time was -spent in memmove calls. And the culprit is the memmove aligning the payload -to a 4byte boundary since that has to move a whole bunch of data. - -Interesstingly the legacy drivers insert an l2pad between the header and the -payload but doesn't realign the payload itself to a 4-byte boundary. Hence, -I came up with this patch and indeed CPU usage improves impressively. - -Only tested on rt2800pci! - -Thanks, -Helmut - - drivers/net/wireless/rt2x00/rt2x00queue.c | 30 +++------------------------- - 1 files changed, 4 insertions(+), 26 deletions(-) - ---- a/drivers/net/wireless/rt2x00/rt2x00queue.c -+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c -@@ -161,36 +161,14 @@ void rt2x00queue_align_frame(struct sk_b - void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length) - { - unsigned int payload_length = skb->len - header_length; -- unsigned int header_align = ALIGN_SIZE(skb, 0); -- unsigned int payload_align = ALIGN_SIZE(skb, header_length); - unsigned int l2pad = payload_length ? L2PAD_SIZE(header_length) : 0; - -- /* -- * Adjust the header alignment if the payload needs to be moved more -- * than the header. -- */ -- if (payload_align > header_align) -- header_align += 4; -- -- /* There is nothing to do if no alignment is needed */ -- if (!header_align) -+ if (!l2pad) - return; - -- /* Reserve the amount of space needed in front of the frame */ -- skb_push(skb, header_align); -- -- /* -- * Move the header. -- */ -- memmove(skb->data, skb->data + header_align, header_length); -- -- /* Move the payload, if present and if required */ -- if (payload_length && payload_align) -- memmove(skb->data + header_length + l2pad, -- skb->data + header_length + l2pad + payload_align, -- payload_length); -- -- /* Trim the skb to the correct size */ -+ /* insert l2pad -> Move header */ -+ skb_push(skb, l2pad); -+ memmove(skb->data, skb->data + l2pad, header_length); - skb_trim(skb, header_length + l2pad + payload_length); - } -