Linux 5.12.16
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.12.16 kernel.
All users of the 5.12 kernel series must upgrade.
The updated 5.12.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.12.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/hexagon/Makefile | 6 arch/hexagon/include/asm/futex.h | 4 arch/hexagon/include/asm/timex.h | 3 arch/hexagon/kernel/hexagon_ksyms.c | 8 arch/hexagon/kernel/ptrace.c | 4 arch/hexagon/lib/Makefile | 3 arch/hexagon/lib/divsi3.S | 67 ++++++ arch/hexagon/lib/memcpy_likely_aligned.S | 56 +++++ arch/hexagon/lib/modsi3.S | 46 ++++ arch/hexagon/lib/udivsi3.S | 38 +++ arch/hexagon/lib/umodsi3.S | 36 +++ drivers/net/wireless/mediatek/mt76/dma.c | 47 ++-- drivers/net/wireless/mediatek/mt76/mt76.h | 8 drivers/net/wireless/mediatek/mt76/mt7921/init.c | 3 drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 209 +++++++++++++++------ drivers/net/wireless/mediatek/mt76/mt7921/main.c | 38 ++- drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 36 ++- drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h | 6 drivers/net/wireless/mediatek/mt76/mt7921/regs.h | 4 20 files changed, 507 insertions(+), 117 deletions(-)
Greg Kroah-Hartman (1):
Linux 5.12.16
Lorenzo Bianconi (7):
mt76: mt7921: check mcu returned values in mt7921_start
mt76: mt7921: introduce mt7921_run_firmware utility routine.
mt76: mt7921: introduce __mt7921_start utility routine
mt76: dma: introduce mt76_dma_queue_reset routine
mt76: dma: export mt76_dma_rx_cleanup routine
mt76: mt7921: add wifi reset support
mt76: mt7921: get rid of mcu_reset function pointer
Sean Wang (1):
mt76: mt7921: abort uncompleted scan by wifi reset
Sid Manning (3):
Hexagon: fix build errors
Hexagon: add target builtins to kernel
Hexagon: change jumps to must-extend in futex_atomic_*
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 12 -SUBLEVEL = 15 +SUBLEVEL = 16 EXTRAVERSION = NAME = Frozen Wasteland
arch/hexagon/Makefile +3 -3
@@ -10,6 +10,9 @@ LDFLAGS_vmlinux += -G0 # Do not use single-byte enums; these will overflow. KBUILD_CFLAGS += -fno-short-enums +# We must use long-calls: +KBUILD_CFLAGS += -mlong-calls + # Modules must use either long-calls, or use pic/plt. # Use long-calls for now, it's easier. And faster. # KBUILD_CFLAGS_MODULE += -fPIC
@@ -30,9 +33,6 @@ TIR_NAME := r19 KBUILD_CFLAGS += -ffixed-$(TIR_NAME) -DTHREADINFO_REG=$(TIR_NAME) -D__linux__ KBUILD_AFLAGS += -DTHREADINFO_REG=$(TIR_NAME) -LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name 2>/dev/null) -libs-y += $(LIBGCC) - head-y := arch/hexagon/kernel/head.o core-y += arch/hexagon/kernel/ \
arch/hexagon/include/asm/futex.h +2 -2
@@ -21,7 +21,7 @@"3:\n" \".section .fixup,\"ax\"\n" \"4: %1 = #%5;\n" \ -" jump 3b\n" \ +" jump ##3b\n" \".previous\n" \".section __ex_table,\"a\"\n" \".long 1b,4b,2b,4b\n" \
@@ -90,7 +90,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval,"3:\n" ".section .fixup,\"ax\"\n" "4: %0 = #%6\n" -" jump 3b\n" +" jump ##3b\n" ".previous\n" ".section __ex_table,\"a\"\n" ".long 1b,4b,2b,4b\n"
arch/hexagon/include/asm/timex.h +2 -1
@@ -8,6 +8,7 @@#include <asm-generic/timex.h> #include <asm/timer-regs.h> +#include <asm/hexagon_vm.h> /* Using TCX0 as our clock. CLOCK_TICK_RATE scheduled to be removed. */ #define CLOCK_TICK_RATE TCX0_CLK_RATE
@@ -16,7 +17,7 @@static inline int read_current_timer (unsigned long *timer_val) { - *timer_val = (unsigned long )__vmgettime (); + *timer_val =__vmgettime ();return 0 ; }
arch/hexagon/kernel/hexagon_ksyms.c +4 -4
@@ -35,8 +35,8 @@ EXPORT_SYMBOL(_dflt_cache_att);DECLARE_EXPORT (__hexagon_memcpy_likely_aligned_min32bytes_mult8bytes);/* Additional functions */ -DECLARE_EXPORT (__divsi3); -DECLARE_EXPORT (__modsi3); -DECLARE_EXPORT (__udivsi3); -DECLARE_EXPORT (__umodsi3); +DECLARE_EXPORT (__hexagon_divsi3); +DECLARE_EXPORT (__hexagon_modsi3); +DECLARE_EXPORT (__hexagon_udivsi3); +DECLARE_EXPORT (__hexagon_umodsi3);DECLARE_EXPORT (csum_tcpudp_magic);
arch/hexagon/kernel/ptrace.c +2 -2
@@ -35,7 +35,7 @@ void user_disable_single_step(struct task_struct *child)static int genregs_get (struct task_struct *target,const struct user_regset *regset, - srtuct membuf to) +struct membuf to) {struct pt_regs *regs =task_pt_regs (target);
@@ -54,7 +54,7 @@ static int genregs_get(struct task_struct *target,membuf_store (&to, regs->m0);membuf_store (&to, regs->m1);membuf_store (&to, regs->usr); -membuf_store (&to, regs->p3_0); +membuf_store (&to, regs->preds);membuf_store (&to, regs->gp);membuf_store (&to, regs->ugp);membuf_store (&to,pt_elr (regs));// pc
arch/hexagon/lib/Makefile +2 -1
@@ -2,4 +2,5 @@ # # Makefile for hexagon-specific library files. # -obj-y = checksum.o io.o memcpy.o memset.o +obj-y = checksum.o io.o memcpy.o memset.o memcpy_likely_aligned.o \ + divsi3.o modsi3.o udivsi3.o umodsi3.o
arch/hexagon/lib/divsi3.S new file +67 -0
67 lines not on this page · raw message
arch/hexagon/lib/memcpy_likely_aligned.S new file +56 -0
56 lines not on this page · raw message
arch/hexagon/lib/modsi3.S new file +46 -0
46 lines not on this page · raw message
arch/hexagon/lib/udivsi3.S new file +38 -0
@@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2021, The Linux Foundation. All rights reserved. + */ + +#include <linux/linkage.h> + +SYM_FUNC_START(__hexagon_udivsi3) + { + r2 = cl0(r0) + r3 = cl0(r1) + r5:4 = combine(#1,#0) + p0 = cmp.gtu(r1,r0) + } + { + r6 = sub(r3,r2) + r4 = r1 + r1:0 = combine(r0,r4) + if (p0) jumpr r31 + } + { + r3:2 = vlslw(r5:4,r6) + loop0(1f,r6) + } + .falign +1: + { + p0 = cmp.gtu(r2,r1) + if (!p0.new) r1 = sub(r1,r2) + if (!p0.new) r0 = add(r0,r3) + r3:2 = vlsrw(r3:2,#1) + }:endloop0 + { + p0 = cmp.gtu(r2,r1) + if (!p0.new) r0 = add(r0,r3) + jumpr r31 + } +SYM_FUNC_END(__hexagon_udivsi3)
arch/hexagon/lib/umodsi3.S new file +36 -0
@@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2021, The Linux Foundation. All rights reserved. + */ + +#include <linux/linkage.h> + +SYM_FUNC_START(__hexagon_umodsi3) + { + r2 = cl0(r0) + r3 = cl0(r1) + p0 = cmp.gtu(r1,r0) + } + { + r2 = sub(r3,r2) + if (p0) jumpr r31 + } + { + loop0(1f,r2) + p1 = cmp.eq(r2,#0) + r2 = lsl(r1,r2) + } + .falign +1: + { + p0 = cmp.gtu(r2,r0) + if (!p0.new) r0 = sub(r0,r2) + r2 = lsr(r2,#1) + if (p1) r1 = #0 + }:endloop0 + { + p0 = cmp.gtu(r2,r0) + if (!p0.new) r0 = sub(r0,r1) + jumpr r31 + } +SYM_FUNC_END(__hexagon_umodsi3)
drivers/net/wireless/mediatek/mt76/dma.c +29 -18
80 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt76.h +7 -1
@@ -190,7 +190,11 @@ struct mt76_queue_ops {void (*tx_cleanup)(struct mt76_dev *dev,struct mt76_queue *q,bool flush); +void (*rx_cleanup)(struct mt76_dev *dev,struct mt76_queue *q); +void (*kick)(struct mt76_dev *dev,struct mt76_queue *q); + +void (*reset_q)(struct mt76_dev *dev,struct mt76_queue *q); };enum mt76_wcid_flags {
@@ -784,8 +788,10 @@ static inline u16 mt76_rev(struct mt76_dev *dev)#define mt76_tx_queue_skb_raw (dev, ...) (dev)->mt76.queue_ops->tx_queue_skb_raw(&((dev)->mt76), __VA_ARGS__)#define mt76_tx_queue_skb (dev, ...) (dev)->mt76.queue_ops->tx_queue_skb(&((dev)->mt76), __VA_ARGS__)#define mt76_queue_rx_reset (dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__) -#define mt76_queue_tx_cleanup (dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) +#define mt76_queue_tx_cleanup (dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) +#define mt76_queue_rx_cleanup (dev, ...) (dev)->mt76.queue_ops->rx_cleanup(&((dev)->mt76), __VA_ARGS__)#define mt76_queue_kick (dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__) +#define mt76_queue_reset (dev, ...) (dev)->mt76.queue_ops->reset_q(&((dev)->mt76), __VA_ARGS__)#define mt76_for_each_q_rx (dev, i) \ for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \
drivers/net/wireless/mediatek/mt76/mt7921/init.c +1 -2
@@ -142,7 +142,7 @@ mt7921_mac_init_band(struct mt7921_dev *dev, u8 band)mt76_clear (dev,MT_DMA_DCR0 (band),MT_DMA_DCR0_RXD_G5_EN ); } -static void mt7921_mac_init (struct mt7921_dev *dev) +void mt7921_mac_init (struct mt7921_dev *dev) {int i;
@@ -232,7 +232,6 @@ int mt7921_register_device(struct mt7921_dev *dev)INIT_LIST_HEAD (&dev->sta_poll_list);spin_lock_init (&dev->sta_poll_lock); -init_waitqueue_head (&dev->reset_wait);INIT_WORK (&dev->reset_work, mt7921_mac_reset_work); ret =mt7921_init_hardware (dev);
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +153 -56
271 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7921/main.c +27 -11
@@ -168,28 +168,44 @@ void mt7921_set_stream_he_caps(struct mt7921_phy *phy) } } -static int mt7921_start (struct ieee80211_hw *hw) +int __mt7921_start (struct mt7921_phy *phy) { -struct mt7921_dev *dev =mt7921_hw_dev (hw); -struct mt7921_phy *phy =mt7921_hw_phy (hw); +struct mt76_phy *mphy = phy->mt76; +int err; -mt7921_mutex_acquire (dev); + err =mt76_connac_mcu_set_mac_enable (mphy->dev,0 , true, false); +if (err) +return err; -mt76_connac_mcu_set_mac_enable (&dev->mt76,0 , true, false); -mt76_connac_mcu_set_channel_domain (phy->mt76); + err =mt76_connac_mcu_set_channel_domain (mphy); +if (err) +return err; + + err =mt7921_mcu_set_chan_info (phy,MCU_EXT_CMD_SET_RX_PATH ); +if (err) +return err; -mt7921_mcu_set_chan_info (phy,MCU_EXT_CMD_SET_RX_PATH );mt7921_mac_reset_counters (phy); -set_bit (MT76_STATE_RUNNING , &phy->mt76->state); +set_bit (MT76_STATE_RUNNING , &mphy->state); -ieee80211_queue_delayed_work (hw, &phy->mt76->mac_work, +ieee80211_queue_delayed_work (mphy->hw, &mphy->mac_work,MT7921_WATCHDOG_TIME ); -mt7921_mutex_release (dev); -return 0 ; } +static int mt7921_start (struct ieee80211_hw *hw) +{ +struct mt7921_phy *phy =mt7921_hw_phy (hw); +int err; + +mt7921_mutex_acquire (phy->dev); + err =__mt7921_start (phy); +mt7921_mutex_release (phy->dev); + +return err; +} +static void mt7921_stop (struct ieee80211_hw *hw) {struct mt7921_dev *dev =mt7921_hw_dev (hw);
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c +23 -13
@@ -161,6 +161,8 @@ mt7921_mcu_parse_response(struct mt76_dev *mdev, int cmd,if (!skb) {dev_err (mdev->dev,"Message %d (seq %d) timeout\n" , cmd, seq); +mt7921_reset (mdev); +return -ETIMEDOUT ; }
@@ -927,6 +929,24 @@ int mt7921_mcu_fw_log_2_host(struct mt7921_dev *dev, u8 ctrl) sizeof(data), false); } +int mt7921_run_firmware (struct mt7921_dev *dev) +{ +int err; + + err =mt7921_driver_own (dev); +if (err) +return err; + + err =mt7921_load_firmware (dev); +if (err) +return err; + +set_bit (MT76_STATE_MCU_RUNNING , &dev->mphy.state); +mt7921_mcu_fw_log_2_host (dev,1 ); + +return 0 ; +} +int mt7921_mcu_init (struct mt7921_dev *dev) {static const struct mt76_mcu_ops mt7921_mcu_ops = {
@@ -935,22 +955,10 @@ int mt7921_mcu_init(struct mt7921_dev *dev) .mcu_parse_response = mt7921_mcu_parse_response, .mcu_restart = mt7921_mcu_restart, }; -int ret; dev->mt76.mcu_ops = &mt7921_mcu_ops; - ret =mt7921_driver_own (dev); -if (ret) -return ret; - - ret =mt7921_load_firmware (dev); -if (ret) -return ret; - -set_bit (MT76_STATE_MCU_RUNNING , &dev->mphy.state); -mt7921_mcu_fw_log_2_host (dev,1 ); - -return 0 ; +return mt7921_run_firmware (dev); }void mt7921_mcu_exit (struct mt7921_dev *dev)
@@ -1263,6 +1271,7 @@ int mt7921_mcu_drv_pmctrl(struct mt7921_dev *dev)if (i ==MT7921_DRV_OWN_RETRY_COUNT ) {dev_err (dev->mt76.dev,"driver own failed\n" ); +mt7921_reset (&dev->mt76);return -EIO ; }
@@ -1289,6 +1298,7 @@ int mt7921_mcu_fw_pmctrl(struct mt7921_dev *dev)if (i ==MT7921_DRV_OWN_RETRY_COUNT ) {dev_err (dev->mt76.dev,"firmware own failed\n" ); +mt7921_reset (&dev->mt76);return -EIO ; }
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +4 -2
@@ -151,8 +151,6 @@ struct mt7921_dev {struct work_struct init_work;struct work_struct reset_work; -wait_queue_head_t reset_wait; -u32 reset_state;struct list_head sta_poll_list;spinlock_t sta_poll_lock;
@@ -209,6 +207,7 @@ extern struct pci_driver mt7921_pci_driver;u32 mt7921_reg_map (struct mt7921_dev *dev,u32 addr); +int __mt7921_start (struct mt7921_phy *phy);int mt7921_register_device (struct mt7921_dev *dev);void mt7921_unregister_device (struct mt7921_dev *dev);int mt7921_eeprom_init (struct mt7921_dev *dev);
@@ -220,6 +219,7 @@ void mt7921_eeprom_init_sku(struct mt7921_dev *dev);int mt7921_dma_init (struct mt7921_dev *dev);void mt7921_dma_prefetch (struct mt7921_dev *dev);void mt7921_dma_cleanup (struct mt7921_dev *dev); +int mt7921_run_firmware (struct mt7921_dev *dev);int mt7921_mcu_init (struct mt7921_dev *dev);int mt7921_mcu_add_bss_info (struct mt7921_phy *phy,struct ieee80211_vif *vif,int enable);
@@ -281,6 +281,7 @@ mt7921_l1_rmw(struct mt7921_dev *dev, u32 addr, u32 mask, u32 val)#define mt7921_l1_set (dev, addr, val) mt7921_l1_rmw(dev, addr, 0, val)#define mt7921_l1_clear (dev, addr, val) mt7921_l1_rmw(dev, addr, val, 0) +void mt7921_mac_init (struct mt7921_dev *dev);bool mt7921_mac_wtbl_update (struct mt7921_dev *dev,int idx,u32 mask);void mt7921_mac_reset_counters (struct mt7921_phy *phy); void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi,
@@ -296,6 +297,7 @@ void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, struct ieee80211_sta *sta);void mt7921_mac_work (struct work_struct *work);void mt7921_mac_reset_work (struct work_struct *work); +void mt7921_reset (struct mt76_dev *mdev); int mt7921_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, enum mt76_txq_id qid, struct mt76_wcid *wcid, struct ieee80211_sta *sta,
drivers/net/wireless/mediatek/mt76/mt7921/regs.h +4 -0
@@ -418,6 +418,10 @@#define PCIE_LPCR_HOST_CLR_OWN BIT(1)#define PCIE_LPCR_HOST_SET_OWN BIT(0) +#define MT_WFSYS_SW_RST_B 0x18000140 +#define WFSYS_SW_RST_B BIT(0) +#define WFSYS_SW_INIT_DONE BIT(4) +#define MT_CONN_ON_MISC 0x7c0600f0#define MT_TOP_MISC2_FW_N9_RDY GENMASK(1, 0)