6.18.53-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainerPATCH 269/1250 clk: samsung: exynos990: Fix PERIC0/1 USI clock types
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Denzeel Oliva <[email protected]>
[ Upstream commit e11560b050ce867bd7d3ccea138231db54e2250a ]
Use nMUX() for USI and UART user muxes to allow reparenting between OSC and CMU IP output when changing rates, and use DIV_F() with CLK_SET_RATE_PARENT on their dividers and gates so rate requests propagate upward.
Consolidate identical USI parent arrays into shared mout_peric0_nonbususer_p and mout_peric1_nonbususer_p.
--- drivers/clk/samsung/clk-exynos990.c | 307 +++++++++++++--------------- 1 file changed, 143 insertions(+), 164 deletions(-)
drivers/clk/samsung/clk-exynos990.c +143 -164
@@ -1546,54 +1546,44 @@ static const unsigned long peric0_clk_regs[] __initconst = {/* Parent clock list for CMU_PERIC0 muxes */ PNAME (mout_peric0_bus_user_p) = {"oscclk" ,"dout_cmu_peric0_bus" }; -PNAME (mout_peric0_uart_dbg_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; -PNAME (mout_peric0_usi00_user_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; -PNAME (mout_peric0_usi01_user_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; -PNAME (mout_peric0_usi02_user_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; -PNAME (mout_peric0_usi03_user_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; -PNAME (mout_peric0_usi04_user_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; -PNAME (mout_peric0_usi05_user_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; -PNAME (mout_peric0_usi13_user_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; -PNAME (mout_peric0_usi14_user_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; -PNAME (mout_peric0_usi15_user_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; -PNAME (mout_peric0_usi_i2c_user_p) = {"oscclk" ,"dout_cmu_peric0_ip" }; +PNAME (mout_peric0_nonbususer_p) = {"oscclk" ,"dout_cmu_peric0_ip" };static const struct samsung_mux_clock peric0_mux_clks[]__initconst = {MUX (CLK_MOUT_PERIC0_BUS_USER ,"mout_peric0_bus_user" , mout_peric0_bus_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_BUS_USER ,4 ,1 ), -MUX (CLK_MOUT_PERIC0_UART_DBG ,"mout_peric0_uart_dbg" , - mout_peric0_uart_dbg_p,PLL_CON0_MUX_CLKCMU_PERIC0_UART_DBG , -4 ,1 ), -MUX (CLK_MOUT_PERIC0_USI00_USI_USER ,"mout_peric0_usi00_usi_user" , - mout_peric0_usi00_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI00_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC0_USI01_USI_USER ,"mout_peric0_usi01_usi_user" , - mout_peric0_usi01_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI01_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC0_USI02_USI_USER ,"mout_peric0_usi02_usi_user" , - mout_peric0_usi02_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI02_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC0_USI03_USI_USER ,"mout_peric0_usi03_usi_user" , - mout_peric0_usi03_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI03_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC0_USI04_USI_USER ,"mout_peric0_usi04_usi_user" , - mout_peric0_usi04_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI04_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC0_USI05_USI_USER ,"mout_peric0_usi05_usi_user" , - mout_peric0_usi05_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI05_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC0_USI13_USI_USER ,"mout_peric0_usi13_usi_user" , - mout_peric0_usi13_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI13_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC0_USI14_USI_USER ,"mout_peric0_usi14_usi_user" , - mout_peric0_usi14_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI14_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC0_USI15_USI_USER ,"mout_peric0_usi15_usi_user" , - mout_peric0_usi15_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI15_USI_USER , -4 ,1 ), +nMUX (CLK_MOUT_PERIC0_UART_DBG ,"mout_peric0_uart_dbg" , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_UART_DBG , +4 ,1 ), +nMUX (CLK_MOUT_PERIC0_USI00_USI_USER ,"mout_peric0_usi00_usi_user" , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI00_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC0_USI01_USI_USER ,"mout_peric0_usi01_usi_user" , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI01_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC0_USI02_USI_USER ,"mout_peric0_usi02_usi_user" , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI02_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC0_USI03_USI_USER ,"mout_peric0_usi03_usi_user" , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI03_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC0_USI04_USI_USER ,"mout_peric0_usi04_usi_user" , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI04_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC0_USI05_USI_USER ,"mout_peric0_usi05_usi_user" , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI05_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC0_USI13_USI_USER ,"mout_peric0_usi13_usi_user" , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI13_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC0_USI14_USI_USER ,"mout_peric0_usi14_usi_user" , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI14_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC0_USI15_USI_USER ,"mout_peric0_usi15_usi_user" , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI15_USI_USER , +4 ,1 ),MUX (CLK_MOUT_PERIC0_USI_I2C_USER ,"mout_peric0_usi_i2c_user" , - mout_peric0_usi_i2c_user_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI_I2C_USER , + mout_peric0_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC0_USI_I2C_USER ,4 ,1 ), };
@@ -1602,42 +1592,42 @@ static const struct samsung_div_clock peric0_div_clks[] __initconst = { "mout_peric0_uart_dbg", CLK_CON_DIV_DIV_CLK_PERIC0_UART_DBG, 0, 4), -DIV (CLK_DOUT_PERIC0_USI00_USI ,"dout_peric0_usi00_usi" , -"mout_peric0_usi00_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC0_USI00_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC0_USI01_USI ,"dout_peric0_usi01_usi" , -"mout_peric0_usi01_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC0_USI01_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC0_USI02_USI ,"dout_peric0_usi02_usi" , -"mout_peric0_usi02_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC0_USI02_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC0_USI03_USI ,"dout_peric0_usi03_usi" , -"mout_peric0_usi03_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC0_USI03_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC0_USI04_USI ,"dout_peric0_usi04_usi" , -"mout_peric0_usi04_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC0_USI04_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC0_USI05_USI ,"dout_peric0_usi05_usi" , -"mout_peric0_usi05_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC0_USI05_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC0_USI13_USI ,"dout_peric0_usi13_usi" , -"mout_peric0_usi13_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC0_USI13_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC0_USI14_USI ,"dout_peric0_usi14_usi" , -"mout_peric0_usi14_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC0_USI14_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC0_USI15_USI ,"dout_peric0_usi15_usi" , -"mout_peric0_usi15_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC0_USI15_USI , -0 ,4 ), +DIV_F (CLK_DOUT_PERIC0_USI00_USI ,"dout_peric0_usi00_usi" , +"mout_peric0_usi00_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC0_USI00_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC0_USI01_USI ,"dout_peric0_usi01_usi" , +"mout_peric0_usi01_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC0_USI01_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC0_USI02_USI ,"dout_peric0_usi02_usi" , +"mout_peric0_usi02_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC0_USI02_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC0_USI03_USI ,"dout_peric0_usi03_usi" , +"mout_peric0_usi03_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC0_USI03_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC0_USI04_USI ,"dout_peric0_usi04_usi" , +"mout_peric0_usi04_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC0_USI04_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC0_USI05_USI ,"dout_peric0_usi05_usi" , +"mout_peric0_usi05_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC0_USI05_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC0_USI13_USI ,"dout_peric0_usi13_usi" , +"mout_peric0_usi13_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC0_USI13_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC0_USI14_USI ,"dout_peric0_usi14_usi" , +"mout_peric0_usi14_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC0_USI14_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC0_USI15_USI ,"dout_peric0_usi15_usi" , +"mout_peric0_usi15_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC0_USI15_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), DIV(CLK_DOUT_PERIC0_USI_I2C, "dout_peric0_usi_i2c", "mout_peric0_usi_i2c_user", CLK_CON_DIV_DIV_CLK_PERIC0_USI_I2C,
@@ -2107,58 +2097,47 @@ static const unsigned long peric1_clk_regs[] __initconst = {/* Parent clock list for CMU_PERIC1 muxes */ PNAME (mout_peric1_bus_user_p) = {"oscclk" ,"dout_cmu_peric1_bus" }; -PNAME (mout_peric1_uart_bt_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi06_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi07_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi08_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi09_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi10_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi11_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi12_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi18_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi16_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi17_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; -PNAME (mout_peric1_usi_i2c_user_p) = {"oscclk" ,"dout_cmu_peric1_ip" }; +PNAME (mout_peric1_nonbususer_p) = {"oscclk" ,"dout_cmu_peric1_ip" };static const struct samsung_mux_clock peric1_mux_clks[]__initconst = {MUX (CLK_MOUT_PERIC1_BUS_USER ,"mout_peric1_bus_user" , mout_peric1_bus_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_BUS_USER ,4 ,1 ), -MUX (CLK_MOUT_PERIC1_UART_BT_USER ,"mout_peric1_uart_bt_user" , - mout_peric1_uart_bt_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_UART_BT_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC1_USI06_USI_USER ,"mout_peric1_usi06_usi_user" , - mout_peric1_usi06_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI06_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC1_USI07_USI_USER ,"mout_peric1_usi07_usi_user" , - mout_peric1_usi07_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI07_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC1_USI08_USI_USER ,"mout_peric1_usi08_usi_user" , - mout_peric1_usi08_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI08_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC1_USI09_USI_USER ,"mout_peric1_usi09_usi_user" , - mout_peric1_usi09_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI09_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC1_USI10_USI_USER ,"mout_peric1_usi10_usi_user" , - mout_peric1_usi10_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI10_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC1_USI11_USI_USER ,"mout_peric1_usi11_usi_user" , - mout_peric1_usi11_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI11_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC1_USI12_USI_USER ,"mout_peric1_usi12_usi_user" , - mout_peric1_usi12_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI12_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC1_USI18_USI_USER ,"mout_peric1_usi18_usi_user" , - mout_peric1_usi18_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI18_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC1_USI16_USI_USER ,"mout_peric1_usi16_usi_user" , - mout_peric1_usi16_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI16_USI_USER , -4 ,1 ), -MUX (CLK_MOUT_PERIC1_USI17_USI_USER ,"mout_peric1_usi17_usi_user" , - mout_peric1_usi17_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI17_USI_USER , -4 ,1 ), +nMUX (CLK_MOUT_PERIC1_UART_BT_USER ,"mout_peric1_uart_bt_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_UART_BT_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC1_USI06_USI_USER ,"mout_peric1_usi06_usi_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI06_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC1_USI07_USI_USER ,"mout_peric1_usi07_usi_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI07_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC1_USI08_USI_USER ,"mout_peric1_usi08_usi_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI08_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC1_USI09_USI_USER ,"mout_peric1_usi09_usi_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI09_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC1_USI10_USI_USER ,"mout_peric1_usi10_usi_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI10_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC1_USI11_USI_USER ,"mout_peric1_usi11_usi_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI11_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC1_USI12_USI_USER ,"mout_peric1_usi12_usi_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI12_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC1_USI18_USI_USER ,"mout_peric1_usi18_usi_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI18_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC1_USI16_USI_USER ,"mout_peric1_usi16_usi_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI16_USI_USER , +4 ,1 ), +nMUX (CLK_MOUT_PERIC1_USI17_USI_USER ,"mout_peric1_usi17_usi_user" , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI17_USI_USER , +4 ,1 ),MUX (CLK_MOUT_PERIC1_USI_I2C_USER ,"mout_peric1_usi_i2c_user" , - mout_peric1_usi_i2c_user_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI_I2C_USER , + mout_peric1_nonbususer_p,PLL_CON0_MUX_CLKCMU_PERIC1_USI_I2C_USER ,4 ,1 ), };
@@ -2167,46 +2146,46 @@ static const struct samsung_div_clock peric1_div_clks[] __initconst = { "mout_peric1_uart_bt_user", CLK_CON_DIV_DIV_CLK_PERIC1_UART_BT, 0, 4), -DIV (CLK_DOUT_PERIC1_USI06_USI ,"dout_peric1_usi06_usi" , -"mout_peric1_usi06_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC1_USI06_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC1_USI07_USI ,"dout_peric1_usi07_usi" , -"mout_peric1_usi07_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC1_USI07_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC1_USI08_USI ,"dout_peric1_usi08_usi" , -"mout_peric1_usi08_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC1_USI08_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC1_USI18_USI ,"dout_peric1_usi18_usi" , -"mout_peric1_usi18_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC1_USI18_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC1_USI12_USI ,"dout_peric1_usi12_usi" , -"mout_peric1_usi12_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC1_USI12_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC1_USI09_USI ,"dout_peric1_usi09_usi" , -"mout_peric1_usi09_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC1_USI09_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC1_USI10_USI ,"dout_peric1_usi10_usi" , -"mout_peric1_usi10_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC1_USI10_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC1_USI11_USI ,"dout_peric1_usi11_usi" , -"mout_peric1_usi11_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC1_USI11_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC1_USI16_USI ,"dout_peric1_usi16_usi" , -"mout_peric1_usi16_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC1_USI16_USI , -0 ,4 ), -DIV (CLK_DOUT_PERIC1_USI17_USI ,"dout_peric1_usi17_usi" , -"mout_peric1_usi17_usi_user" , -CLK_CON_DIV_DIV_CLK_PERIC1_USI17_USI , -0 ,4 ), +DIV_F (CLK_DOUT_PERIC1_USI06_USI ,"dout_peric1_usi06_usi" , +"mout_peric1_usi06_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC1_USI06_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC1_USI07_USI ,"dout_peric1_usi07_usi" , +"mout_peric1_usi07_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC1_USI07_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC1_USI08_USI ,"dout_peric1_usi08_usi" , +"mout_peric1_usi08_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC1_USI08_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC1_USI18_USI ,"dout_peric1_usi18_usi" , +"mout_peric1_usi18_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC1_USI18_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC1_USI12_USI ,"dout_peric1_usi12_usi" , +"mout_peric1_usi12_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC1_USI12_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC1_USI09_USI ,"dout_peric1_usi09_usi" , +"mout_peric1_usi09_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC1_USI09_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC1_USI10_USI ,"dout_peric1_usi10_usi" , +"mout_peric1_usi10_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC1_USI10_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC1_USI11_USI ,"dout_peric1_usi11_usi" , +"mout_peric1_usi11_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC1_USI11_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC1_USI16_USI ,"dout_peric1_usi16_usi" , +"mout_peric1_usi16_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC1_USI16_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), +DIV_F (CLK_DOUT_PERIC1_USI17_USI ,"dout_peric1_usi17_usi" , +"mout_peric1_usi17_usi_user" , +CLK_CON_DIV_DIV_CLK_PERIC1_USI17_USI ,0 ,4 , +CLK_SET_RATE_PARENT ,0 ), DIV(CLK_DOUT_PERIC1_USI_I2C, "dout_peric1_usi_i2c", "mout_peric1_usi_i2c_user", CLK_CON_DIV_DIV_CLK_PERIC1_USI_I2C,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 270/1250 media: qcom: camss: vfe-340: Proper client handling
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Loic Poulain <[email protected]>
[ Upstream commit 880a3e40337e5ddf18ab8d8e07fe963de8789cbf ]
We need to properly map camss WM index to our internal WM client instance. Today we only support RDI interfaces with the RDI_WM macro, introduce a __wm_to_client helper to support any interface.
--- .../media/platform/qcom/camss/camss-vfe-340.c | 84 ++++++++++--------- 1 file changed, 43 insertions(+), 41 deletions(-)
drivers/media/platform/qcom/camss/camss-vfe-340.c +43 -41
@@ -69,24 +69,19 @@#define TFE_BUS_FRAMEDROP_CFG_0 (c) BUS_REG(0x238 + (c) * 0x100)#define TFE_BUS_FRAMEDROP_CFG_1 (c) BUS_REG(0x23c + (c) * 0x100) -/* -* TODO: differentiate the port id based on requested type of RDI, BHIST etc -* -* TFE write master IDs (clients) -* -* BAYER 0 -* IDEAL_RAW 1 -* STATS_TINTLESS_BG 2 -* STATS_BHIST 3 -* STATS_AWB_BG 4 -* STATS_AEC_BG 5 -* STATS_BAF 6 -* RDI0 7 -* RDI1 8 -* RDI2 9 -*/ -#define RDI_WM (n) (7 + (n)) -#define TFE_WM_NUM 10 +enum tfe_client { +TFE_CLI_BAYER , +TFE_CLI_IDEAL_RAW , +TFE_CLI_STATS_TINTLESS_BG , +TFE_CLI_STATS_BHIST , +TFE_CLI_STATS_AWB_BG , +TFE_CLI_STATS_AEC_BG , +TFE_CLI_STATS_BAF , +TFE_CLI_RDI0 , +TFE_CLI_RDI1 , +TFE_CLI_RDI2 , +TFE_CLI_NUM +};enum tfe_iface {TFE_IFACE_PIX ,
@@ -108,6 +103,13 @@ enum tfe_subgroups {TFE_SUBGROUP_NUM }; +static enum tfe_client tfe_wm_client_map[VFE_LINE_NUM_MAX ] = { + [VFE_LINE_RDI0 ] =TFE_CLI_RDI0 , + [VFE_LINE_RDI1 ] =TFE_CLI_RDI1 , + [VFE_LINE_RDI2 ] =TFE_CLI_RDI2 , + [VFE_LINE_PIX ] =TFE_CLI_BAYER , +}; +static enum tfe_iface tfe_line_iface_map[VFE_LINE_NUM_MAX ] = { [VFE_LINE_RDI0 ] =TFE_IFACE_RDI0 , [VFE_LINE_RDI1 ] =TFE_IFACE_RDI1 ,
@@ -209,10 +211,10 @@ static irqreturn_t vfe_isr(int irq, void *dev) status =readl_relaxed (vfe->base +TFE_BUS_OVERFLOW_STATUS );if (status) {writel_relaxed (status, vfe->base +TFE_BUS_STATUS_CLEAR ); -for (i =0 ; i <TFE_WM_NUM ; i++) { +for (i =0 ; i <TFE_CLI_NUM ; i++) {if (status &BIT (i))dev_err_ratelimited (vfe->camss->dev, -"VFE%u: bus overflow for wm %u\n" , +"VFE%u: bus overflow for client %u\n" , vfe->id, i); } }
@@ -235,49 +237,49 @@ static void vfe_enable_irq(struct vfe_device *vfe) TFE_BUS_IRQ_MASK_0_IMG_VIOL, vfe->base + TFE_BUS_IRQ_MASK_0); } -static void vfe_wm_update (struct vfe_device *vfe,u8 rdi,u32 addr, +static void vfe_wm_update (struct vfe_device *vfe,u8 wm,u32 addr,struct vfe_line *line) { -u8 wm =RDI_WM (rdi); +u8 client = tfe_wm_client_map[wm]; -writel_relaxed (addr, vfe->base +TFE_BUS_IMAGE_ADDR (wm)); +writel_relaxed (addr, vfe->base +TFE_BUS_IMAGE_ADDR (client)); } -static void vfe_wm_start (struct vfe_device *vfe,u8 rdi,struct vfe_line *line) +static void vfe_wm_start (struct vfe_device *vfe,u8 wm,struct vfe_line *line) {struct v4l2_pix_format_mplane *pix = &line->video_out.active_fmt.fmt.pix_mp;u32 stride = pix->plane_fmt[0 ].bytesperline; -u8 wm =RDI_WM (rdi); +u8 client = tfe_wm_client_map[wm];/* Configuration for plain RDI frames */ -writel_relaxed (TFE_BUS_IMAGE_CFG_0_DEFAULT , vfe->base +TFE_BUS_IMAGE_CFG_0 (wm)); -writel_relaxed (0u , vfe->base +TFE_BUS_IMAGE_CFG_1 (wm)); -writel_relaxed (TFE_BUS_IMAGE_CFG_2_DEFAULT , vfe->base +TFE_BUS_IMAGE_CFG_2 (wm)); -writel_relaxed (stride * pix->height, vfe->base +TFE_BUS_FRAME_INCR (wm)); -writel_relaxed (TFE_BUS_PACKER_CFG_FMT_PLAIN64 , vfe->base +TFE_BUS_PACKER_CFG (wm)); +writel_relaxed (TFE_BUS_IMAGE_CFG_0_DEFAULT , vfe->base +TFE_BUS_IMAGE_CFG_0 (client)); +writel_relaxed (0u , vfe->base +TFE_BUS_IMAGE_CFG_1 (client)); +writel_relaxed (TFE_BUS_IMAGE_CFG_2_DEFAULT , vfe->base +TFE_BUS_IMAGE_CFG_2 (client)); +writel_relaxed (stride * pix->height, vfe->base +TFE_BUS_FRAME_INCR (client)); +writel_relaxed (TFE_BUS_PACKER_CFG_FMT_PLAIN64 , vfe->base +TFE_BUS_PACKER_CFG (client));/* No dropped frames, one irq per frame */ -writel_relaxed (0 , vfe->base +TFE_BUS_FRAMEDROP_CFG_0 (wm)); -writel_relaxed (1 , vfe->base +TFE_BUS_FRAMEDROP_CFG_1 (wm)); -writel_relaxed (0 , vfe->base +TFE_BUS_IRQ_SUBSAMPLE_CFG_0 (wm)); -writel_relaxed (1 , vfe->base +TFE_BUS_IRQ_SUBSAMPLE_CFG_1 (wm)); +writel_relaxed (0 , vfe->base +TFE_BUS_FRAMEDROP_CFG_0 (client)); +writel_relaxed (1 , vfe->base +TFE_BUS_FRAMEDROP_CFG_1 (client)); +writel_relaxed (0 , vfe->base +TFE_BUS_IRQ_SUBSAMPLE_CFG_0 (client)); +writel_relaxed (1 , vfe->base +TFE_BUS_IRQ_SUBSAMPLE_CFG_1 (client));vfe_enable_irq (vfe);writel (TFE_BUS_CLIENT_CFG_EN |TFE_BUS_CLIENT_CFG_MODE_FRAME , - vfe->base +TFE_BUS_CLIENT_CFG (wm)); + vfe->base +TFE_BUS_CLIENT_CFG (client)); -dev_dbg (vfe->camss->dev,"VFE%u: Started RDI%u width %u height %u stride %u\n" , - vfe->id, rdi, pix->width, pix->height, stride); +dev_dbg (vfe->camss->dev,"VFE%u: Started client %u width %u height %u stride %u\n" , + vfe->id, client, pix->width, pix->height, client); } -static void vfe_wm_stop (struct vfe_device *vfe,u8 rdi) +static void vfe_wm_stop (struct vfe_device *vfe,u8 wm) { -u8 wm =RDI_WM (rdi); +u8 client = tfe_wm_client_map[wm]; -writel (0 , vfe->base +TFE_BUS_CLIENT_CFG (wm)); +writel (0 , vfe->base +TFE_BUS_CLIENT_CFG (client)); -dev_dbg (vfe->camss->dev,"VFE%u: Stopped RDI%u\n" , vfe->id, rdi); +dev_dbg (vfe->camss->dev,"VFE%u: Stopped client %u\n" , vfe->id, client); }static const struct camss_video_ops vfe_video_ops_520 = {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 271/1250 iio: light: stk3310: Deal with the ps interrupt issue in PM
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miao Li <[email protected]>
[ Upstream commit 9c1d639e90cf42f5c1401f91f38ffd89af6dd970 ]
On the Inspur HS326 laptop(which integrated with HiSilicon M900 processor), if the STK3311-X chip's PS interrupt is configured in "Recommended interrupt mode", the interrupt cannot be triggered normally after waking from suspend or hibernation.
In this case, neither disabling and re-enabling the interrupt nor resetting the PS threshold register can restore the interrupt to normal operation.
If the interrupt is disabled in suspend() then reset the PS threshold register and enable the interrupt in resume(). This resolves the issue.
--- drivers/iio/light/stk3310.c | 76 +++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 7 deletions(-)
drivers/iio/light/stk3310.c +69 -7
@@ -117,6 +117,9 @@ struct stk3310_data {struct mutex lock;bool als_enabled;bool ps_enabled; +bool ps_int_enabled; +uint32_t ps_thdl; +uint32_t ps_thdh;uint32_t ps_near_level;u64 timestamp;struct regmap *regmap;
@@ -296,10 +299,17 @@ static int stk3310_write_event(struct iio_dev *indio_dev, buf =cpu_to_be16 (val); ret =regmap_bulk_write (data->regmap, reg, &buf,2 ); -if (ret <0 ) +if (ret <0 ) {dev_err (&client->dev,"failed to set PS threshold!\n" ); +return ret; + } -return ret; +if (reg ==STK3310_REG_THDH_PS ) + data->ps_thdh = val; +else + data->ps_thdl = val; + +return 0 ; } static int stk3310_read_event_config(struct iio_dev *indio_dev,
@@ -331,11 +341,17 @@ static int stk3310_write_event_config(struct iio_dev *indio_dev,/* Set INT_PS value */ mutex_lock (&data->lock); ret =regmap_field_write (data->reg_int_ps, state); -if (ret <0 ) +if (ret <0 ) {dev_err (&client->dev,"failed to set interrupt mode\n" ); +mutex_unlock (&data->lock); +return ret; + } + + data->ps_int_enabled = state; +mutex_unlock (&data->lock); -return ret; +return 0 ; } static int stk3310_read_raw(struct iio_dev *indio_dev,
@@ -504,10 +520,15 @@ static int stk3310_init(struct iio_dev *indio_dev)/* Enable PS interrupts */ ret =regmap_field_write (data->reg_int_ps,STK3310_PSINT_EN ); -if (ret <0 ) +if (ret <0 ) {dev_err (&client->dev,"failed to enable interrupts!\n" ); +return ret; + } -return ret; + data->ps_int_enabled = true; + data->ps_thdh =STK3310_PS_MAX_VAL ; + +return 0 ; }static bool stk3310_is_volatile_reg (struct device *dev,unsigned int reg)
@@ -671,9 +692,18 @@ static void stk3310_remove(struct i2c_client *client)static int stk3310_suspend (struct device *dev) {struct stk3310_data *data; +int ret; data =iio_priv (i2c_get_clientdata (to_i2c_client (dev))); +if (data->ps_int_enabled) { + ret =regmap_field_write (data->reg_int_ps,0x0 ); +if (ret <0 ) { +dev_err (dev,"failed to disable ps int at suspend.\n" ); +return ret; + } + } +return stk3310_set_state (data,STK3310_STATE_STANDBY ); }
@@ -681,6 +711,8 @@ static int stk3310_resume(struct device *dev) {u8 state =0 ;struct stk3310_data *data; +__be16 buf; +int ret; data =iio_priv (i2c_get_clientdata (to_i2c_client (dev)));if (data->ps_enabled)
@@ -688,7 +720,37 @@ static int stk3310_resume(struct device *dev)if (data->als_enabled) state |=STK3310_STATE_EN_ALS ; -return stk3310_set_state (data, state); + ret =stk3310_set_state (data, state); +if (ret <0 ) +return ret; + +if (data->ps_thdl !=0x0 ) { + buf =cpu_to_be16 (data->ps_thdl); + ret =regmap_bulk_write (data->regmap,STK3310_REG_THDL_PS , &buf,2 ); +if (ret <0 ) { +dev_err (dev,"failed to set reg THDL_PS at resume.\n" ); +return ret; + } + } + +if (data->ps_thdh !=STK3310_PS_MAX_VAL ) { + buf =cpu_to_be16 (data->ps_thdh); + ret =regmap_bulk_write (data->regmap,STK3310_REG_THDH_PS , &buf,2 ); +if (ret <0 ) { +dev_err (dev,"failed to set reg THDH_PS at resume.\n" ); +return ret; + } + } + +if (data->ps_int_enabled) { + ret =regmap_field_write (data->reg_int_ps,STK3310_PSINT_EN ); +if (ret <0 ) { +dev_err (dev,"failed to enable ps int at resume.\n" ); +return ret; + } + } + +return 0 ; } static DEFINE_SIMPLE_DEV_PM_OPS(stk3310_pm_ops, stk3310_suspend,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 272/1250 perf/ftrace: Fix WARNING in __unregister_ftrace_function
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rik van Riel <[email protected]>
[ Upstream commit 9581123304b23049437324038698af9fb56ee663 ]
perf_ftrace_function_unregister() unconditionally calls unregister_ftrace_function() without checking whether the ftrace_ops was ever successfully registered. This triggers a WARN_ON in __unregister_ftrace_function() when the ops doesn't have FTRACE_OPS_FL_ENABLED set.
This can happen during perf_event_alloc() error cleanup when perf_trace_destroy() is called via __free_event() on an event whose ftrace_ops registration failed or was already torn down by perf_try_init_event()'s err_destroy path.
The call path is:
perf_event_alloc() error cleanup
-> __free_event()
-> event->destroy() [tp_perf_event_destroy]
-> perf_trace_destroy()
-> perf_trace_event_close()
-> TRACE_REG_PERF_CLOSE
-> perf_ftrace_function_unregister()
-> unregister_ftrace_function()
-> __unregister_ftrace_function()
-> WARN_ON(!(ops->flags & FTRACE_OPS_FL_ENABLED))Fix this by checking FTRACE_OPS_FL_ENABLED before attempting to unregister. If the ops is not enabled, just free the filter and return success.
--- kernel/trace/trace_event_perf.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
kernel/trace/trace_event_perf.c +11 -1
@@ -497,7 +497,17 @@ static int perf_ftrace_function_register(struct perf_event *event)static int perf_ftrace_function_unregister (struct perf_event *event) {struct ftrace_ops *ops = &event->ftrace_ops; -int ret =unregister_ftrace_function (ops); +int ret =0 ; + +/* +* Perf will call this unconditionally even if the ops is not +* enabled. The unregister_ftrace_function() will warn if called +* when not enabled. Just bypass the unregistering if ops isn't +* enabled here. +*/ +if (ops->flags &FTRACE_OPS_FL_ENABLED ) + ret =unregister_ftrace_function (ops); +ftrace_free_filter (ops);return ret; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 273/1250 iio: accel: mma8452: switch to non-devm request_threaded_irq()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sanjay Chitroda <[email protected]>
[ Upstream commit 0a6726ec20cd4c0101f2de0ca485a11676224dea ]
Avoid using devm_request_threaded_irq() as the driver requires explicit error-handling path(s). Using devm_* API together with goto-based unwinding breaks the expected LIFO resource release model.
Add explicit IRQ cleanup in the driver teardown paths to follow kernel resource management conventions.
--- drivers/iio/accel/mma8452.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
drivers/iio/accel/mma8452.c +12 -7
@@ -1682,18 +1682,16 @@ static int mma8452_probe(struct i2c_client *client) goto trigger_cleanup;if (client->irq) { - ret =devm_request_threaded_irq (&client->dev, - client->irq, -NULL , mma8452_interrupt, -IRQF_TRIGGER_LOW |IRQF_ONESHOT , - client->name, indio_dev); + ret =request_threaded_irq (client->irq,NULL , mma8452_interrupt, +IRQF_TRIGGER_LOW |IRQF_ONESHOT , + client->name, indio_dev);if (ret) goto buffer_cleanup; } ret =pm_runtime_set_active (&client->dev);if (ret <0 ) - goto buffer_cleanup; + goto free_irq;pm_runtime_enable (&client->dev); pm_runtime_set_autosuspend_delay(&client->dev,
@@ -1702,7 +1700,7 @@ static int mma8452_probe(struct i2c_client *client) ret =iio_device_register (indio_dev);if (ret <0 ) - goto buffer_cleanup; + goto free_irq; ret =mma8452_set_freefall_mode (data, false);if (ret <0 )
@@ -1713,6 +1711,10 @@ static int mma8452_probe(struct i2c_client *client) unregister_device:iio_device_unregister (indio_dev); +free_irq: +if (client->irq) +free_irq (client->irq, indio_dev); + buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev);
@@ -1738,6 +1740,9 @@ static void mma8452_remove(struct i2c_client *client)pm_runtime_disable (&client->dev);pm_runtime_set_suspended (&client->dev); +if (client->irq) +free_irq (client->irq, indio_dev); +iio_triggered_buffer_cleanup (indio_dev);mma8452_trigger_cleanup (indio_dev);mma8452_standby (iio_priv (indio_dev));
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 274/1250 libbpf: Also reset {insn,data}_cur on realloc failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit d2f7bd066ed492aeaf82864fbf1f06770f9d9f9d ]
realloc_insn_buf() as well as realloc_data_buf() free and NULL gen->insn_start / gen->data_start on -ENOMEM but leave gen->insn_cur / gen->data_cur pointing into the old, freed buffer. Just reset the cursors to NULL alongside the base pointers so the freed state is coherent.
--- tools/lib/bpf/gen_loader.c | 2 ++ 1 file changed, 2 insertions(+)
tools/lib/bpf/gen_loader.c +2 -0
@@ -63,6 +63,7 @@ static int realloc_insn_buf(struct bpf_gen *gen, __u32 size) gen->error = -ENOMEM ;free (gen->insn_start); gen->insn_start =NULL ; + gen->insn_cur =NULL ;return -ENOMEM ; } gen->insn_start = insn_start;
@@ -86,6 +87,7 @@ static int realloc_data_buf(struct bpf_gen *gen, __u32 size) gen->error = -ENOMEM ;free (gen->data_start); gen->data_start =NULL ; + gen->data_cur =NULL ;return -ENOMEM ; } gen->data_start = data_start;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 275/1250 spi: tegra210-quad: Allocate DMA memory for DMA engine
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaron Kling <[email protected]>
[ Upstream commit f469138a77ac5ab685dfe15dfed7dccb9d5c33e5 ]
When the SPI controllers are running in DMA mode, it is the DMA engine that performs the memory accesses rather than the SPI controller. Pass the DMA engine's struct device pointer to the DMA API to make sure the correct DMA operations are used.
--- drivers/spi/spi-tegra210-quad.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-)
drivers/spi/spi-tegra210-quad.c +18 -11
@@ -226,11 +226,13 @@ struct tegra_qspi {struct completion xfer_completion;struct spi_transfer *curr_xfer; +struct device *rx_dma_dev;struct dma_chan *rx_dma_chan;u32 *rx_dma_buf;dma_addr_t rx_dma_phys;struct dma_async_tx_descriptor *rx_dma_desc; +struct device *tx_dma_dev;struct dma_chan *tx_dma_chan;u32 *tx_dma_buf;dma_addr_t tx_dma_phys;
@@ -574,15 +576,15 @@ static int tegra_qspi_dma_map_xfer(struct tegra_qspi *tqspi, struct spi_transfer len =DIV_ROUND_UP (tqspi->curr_dma_words * tqspi->bytes_per_word,4 ) *4 ;if (t->tx_buf) { - t->tx_dma =dma_map_single (tqspi->dev, (void *)tx_buf, len,DMA_TO_DEVICE ); -if (dma_mapping_error (tqspi->dev, t->tx_dma)) + t->tx_dma =dma_map_single (tqspi->tx_dma_dev, (void *)tx_buf, len,DMA_TO_DEVICE ); +if (dma_mapping_error (tqspi->tx_dma_dev, t->tx_dma))return -ENOMEM ; }if (t->rx_buf) { - t->rx_dma =dma_map_single (tqspi->dev, (void *)rx_buf, len,DMA_FROM_DEVICE ); -if (dma_mapping_error (tqspi->dev, t->rx_dma)) { -dma_unmap_single (tqspi->dev, t->tx_dma, len,DMA_TO_DEVICE ); + t->rx_dma =dma_map_single (tqspi->rx_dma_dev, (void *)rx_buf, len,DMA_FROM_DEVICE ); +if (dma_mapping_error (tqspi->rx_dma_dev, t->rx_dma)) { +dma_unmap_single (tqspi->tx_dma_dev, t->tx_dma, len,DMA_TO_DEVICE );return -ENOMEM ; } }
@@ -597,9 +599,9 @@ static void tegra_qspi_dma_unmap_xfer(struct tegra_qspi *tqspi, struct spi_trans len =DIV_ROUND_UP (tqspi->curr_dma_words * tqspi->bytes_per_word,4 ) *4 ;if (t->tx_buf) -dma_unmap_single (tqspi->dev, t->tx_dma, len,DMA_TO_DEVICE ); +dma_unmap_single (tqspi->tx_dma_dev, t->tx_dma, len,DMA_TO_DEVICE );if (t->rx_buf) -dma_unmap_single (tqspi->dev, t->rx_dma, len,DMA_FROM_DEVICE ); +dma_unmap_single (tqspi->rx_dma_dev, t->rx_dma, len,DMA_FROM_DEVICE ); }static int tegra_qspi_start_dma_based_transfer (struct tegra_qspi *tqspi,struct spi_transfer *t)
@@ -745,7 +747,7 @@ static int tegra_qspi_start_cpu_based_transfer(struct tegra_qspi *qspi, struct sstatic void tegra_qspi_deinit_dma (struct tegra_qspi *tqspi) {if (tqspi->tx_dma_buf) { -dma_free_coherent (tqspi->dev, tqspi->dma_buf_size, +dma_free_coherent (tqspi->tx_dma_dev, tqspi->dma_buf_size, tqspi->tx_dma_buf, tqspi->tx_dma_phys); tqspi->tx_dma_buf =NULL ; }
@@ -756,7 +758,7 @@ static void tegra_qspi_deinit_dma(struct tegra_qspi *tqspi) }if (tqspi->rx_dma_buf) { -dma_free_coherent (tqspi->dev, tqspi->dma_buf_size, +dma_free_coherent (tqspi->rx_dma_dev, tqspi->dma_buf_size, tqspi->rx_dma_buf, tqspi->rx_dma_phys); tqspi->rx_dma_buf =NULL ; }
@@ -782,6 +784,7 @@ static int tegra_qspi_init_dma(struct tegra_qspi *tqspi) } tqspi->rx_dma_chan = dma_chan; + tqspi->rx_dma_dev =dmaengine_get_dma_device (tqspi->rx_dma_chan); dma_chan =dma_request_chan (tqspi->dev,"tx" );if (IS_ERR (dma_chan)) {
@@ -790,15 +793,19 @@ static int tegra_qspi_init_dma(struct tegra_qspi *tqspi) } tqspi->tx_dma_chan = dma_chan; + tqspi->tx_dma_dev =dmaengine_get_dma_device (tqspi->tx_dma_chan); }else {if (!device_iommu_mapped (tqspi->dev)) {dev_warn (tqspi->dev,"IOMMU not enabled in device-tree, falling back to PIO mode\n" );return 0 ; } + + tqspi->rx_dma_dev = tqspi->dev; + tqspi->tx_dma_dev = tqspi->dev; } - dma_buf =dma_alloc_coherent (tqspi->dev, tqspi->dma_buf_size, &dma_phys,GFP_KERNEL ); + dma_buf =dma_alloc_coherent (tqspi->rx_dma_dev, tqspi->dma_buf_size, &dma_phys,GFP_KERNEL );if (!dma_buf) { err = -ENOMEM ; goto err_out;
@@ -807,7 +814,7 @@ static int tegra_qspi_init_dma(struct tegra_qspi *tqspi) tqspi->rx_dma_buf = dma_buf; tqspi->rx_dma_phys = dma_phys; - dma_buf =dma_alloc_coherent (tqspi->dev, tqspi->dma_buf_size, &dma_phys,GFP_KERNEL ); + dma_buf =dma_alloc_coherent (tqspi->tx_dma_dev, tqspi->dma_buf_size, &dma_phys,GFP_KERNEL );if (!dma_buf) { err = -ENOMEM ; goto err_out;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 276/1250 net: ibm: emac: Reserve VLAN header in MJS limit
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 0906c117f81c2ae6e6dbfa82719f79c75e1c9325 ]
The IBM EMAC programs its Maximum Jumbo Size (MJS) drop threshold from ndev->mtu directly. The hardware sizes the threshold against the L2 frame minus the ethernet header, but does not discount the 802.1Q tag, so a frame carrying a VLAN tag and a full 1500-byte payload exceeds MJS by exactly 4 bytes and is dropped.
This is normally hidden because JPSM (and therefore the MJS check) only engages when the MTU is raised above ETH_DATA_LEN. With the qca8k DSA tagger the conduit MTU is bumped by QCA_HDR_LEN to 1502 during dsa_conduit_setup(), which is enough to enable JPSM and expose the off-by-VLAN-tag in the limit.
Pad MJS by VLAN_HLEN so a VLAN-tagged full-MTU frame passes.
Reported on Meraki MX60 (qca8k switch): tagged VLAN traffic drops at 1500-byte payload, while 1496 bytes works and untagged 1500 bytes works.
--- drivers/net/ethernet/ibm/emac/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/ibm/emac/core.c +2 -1
@@ -30,6 +30,7 @@#include <linux/skbuff.h> #include <linux/crc32.h> #include <linux/ethtool.h> +#include <linux/if_vlan.h> #include <linux/mii.h> #include <linux/bitops.h> #include <linux/of.h>
@@ -457,7 +458,7 @@ static inline u32 emac_iff2rmr(struct net_device *ndev)if (emac_has_feature (dev,EMAC_APM821XX_REQ_JUMBO_FRAME_SIZE )) { r &= ~EMAC4_RMR_MJS_MASK ; - r |=EMAC4_RMR_MJS (ndev->mtu); + r |=EMAC4_RMR_MJS (ndev->mtu +VLAN_HLEN ); }return r;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 277/1250 wifi: ath11k: fix invalid data access in ath11k_dp_rx_h_undecap_nwifi
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miaoqing Pan <[email protected]>
[ Upstream commit 6b471e9aefee9ed73278eb1141e0d8530a56fae9 ]
In certain cases, hardware might provide packets with a length greater than the maximum native Wi-Fi header length. This can lead to accessing and modifying fields in the header within the ath11k_dp_rx_h_undecap_nwifi() function for the DP_RX_DECAP_TYPE_NATIVE_WIFI decap type and potentially result in invalid data access and memory corruption.
Kernel stack is corrupted in: ath11k_dp_rx_h_undecap+0x6b0/0x6b0 [ath11k]
Call trace: ath11k_dp_rx_h_mpdu+0x0/0x2e8 [ath11k] ath11k_dp_rx_h_mpdu+0x1e0/0x2e8 [ath11k] ath11k_dp_rx_wbm_err+0x1e0/0x450 [ath11k] ath11k_dp_rx_process_wbm_err+0x2fc/0x460 [ath11k] ath11k_dp_service_srng+0x2e0/0x348 [ath11k]
Add a sanity check before processing the SKB to prevent invalid data access in the undecap native Wi-Fi function for the DP_RX_DECAP_TYPE_NATIVE_WIFI decap type.
This adapted from the discussion/patch of the ath12k driver [1].
Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-04685-QCAHSPSWPL_V1_V2_SILICONZ_IOE-1
--- drivers/net/wireless/ath/ath11k/dp_rx.c | 50 +++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-)
drivers/net/wireless/ath/ath11k/dp_rx.c +47 -3
@@ -2501,6 +2501,29 @@ static void ath11k_dp_rx_deliver_msdu(struct ath11k *ar, struct napi_struct *napieee80211_rx_napi (ar->hw, pubsta, msdu, napi); } +static bool ath11k_dp_rx_check_nwifi_hdr_len_valid (struct ath11k_base *ab, +struct hal_rx_desc *rx_desc, +struct sk_buff *msdu) +{ +struct ieee80211_hdr *hdr; +u8 decap_type; +u32 hdr_len; + + decap_type =ath11k_dp_rx_h_msdu_start_decap_type (ab, rx_desc); +if (decap_type !=DP_RX_DECAP_TYPE_NATIVE_WIFI ) +return true; + + hdr = (struct ieee80211_hdr *)msdu->data; + hdr_len =ieee80211_hdrlen (hdr->frame_control); + +if (likely (hdr_len <=DP_MAX_NWIFI_HDR_LEN )) +return true; + + ab->soc_stats.invalid_rbm++; +WARN_ON_ONCE (1 ); +return false; +} + static int ath11k_dp_rx_process_msdu(struct ath11k *ar, struct sk_buff *msdu, struct sk_buff_head *msdu_list,
@@ -2571,6 +2594,11 @@ static int ath11k_dp_rx_process_msdu(struct ath11k *ar, } } +if (unlikely (!ath11k_dp_rx_check_nwifi_hdr_len_valid (ab, rx_desc, msdu))) { + ret = -EINVAL ; + goto free_out; + } +ath11k_dp_rx_h_ppdu (ar, rx_desc, rx_status);ath11k_dp_rx_h_mpdu (ar, msdu, rx_desc, rx_status);
@@ -3306,6 +3334,12 @@ static int ath11k_dp_rx_h_verify_tkip_mic(struct ath11k *ar, struct ath11k_peerRX_FLAG_IV_STRIPPED |RX_FLAG_DECRYPTED ;skb_pull (msdu, hal_rx_desc_sz); +if (unlikely (!ath11k_dp_rx_check_nwifi_hdr_len_valid (ar->ab, rx_desc, + msdu))) { +dev_kfree_skb_any (msdu); +return -EINVAL ; + } +ath11k_dp_rx_h_ppdu (ar, rx_desc, rxs);ath11k_dp_rx_h_undecap (ar, msdu, rx_desc,HAL_ENCRYPT_TYPE_TKIP_MIC , rxs, true);
@@ -3998,6 +4032,10 @@ static int ath11k_dp_rx_h_null_q_desc(struct ath11k *ar, struct sk_buff *msdu,skb_put (msdu, hal_rx_desc_sz + l3pad_bytes + msdu_len);skb_pull (msdu, hal_rx_desc_sz + l3pad_bytes); } + +if (unlikely (!ath11k_dp_rx_check_nwifi_hdr_len_valid (ar->ab, desc, msdu))) +return -EINVAL ; +ath11k_dp_rx_h_ppdu (ar, desc, status);ath11k_dp_rx_h_mpdu (ar, msdu, desc, status);
@@ -4042,7 +4080,7 @@ static bool ath11k_dp_rx_h_reo_err(struct ath11k *ar, struct sk_buff *msdu,return drop; } -static void ath11k_dp_rx_h_tkip_mic_err (struct ath11k *ar,struct sk_buff *msdu, +static bool ath11k_dp_rx_h_tkip_mic_err (struct ath11k *ar,struct sk_buff *msdu,struct ieee80211_rx_status *status) {u16 msdu_len;
@@ -4050,6 +4088,7 @@ static void ath11k_dp_rx_h_tkip_mic_err(struct ath11k *ar, struct sk_buff *msdu,u8 l3pad_bytes;struct ath11k_skb_rxcb *rxcb =ATH11K_SKB_RXCB (msdu);u32 hal_rx_desc_sz = ar->ab->hw_params.hal_desc_sz; +struct ath11k_base *ab = ar->ab; rxcb->is_first_msdu =ath11k_dp_rx_h_msdu_end_first_msdu (ar->ab, desc); rxcb->is_last_msdu =ath11k_dp_rx_h_msdu_end_last_msdu (ar->ab, desc);
@@ -4059,6 +4098,9 @@ static void ath11k_dp_rx_h_tkip_mic_err(struct ath11k *ar, struct sk_buff *msdu,skb_put (msdu, hal_rx_desc_sz + l3pad_bytes + msdu_len);skb_pull (msdu, hal_rx_desc_sz + l3pad_bytes); +if (unlikely (!ath11k_dp_rx_check_nwifi_hdr_len_valid (ab, desc, msdu))) +return true; +ath11k_dp_rx_h_ppdu (ar, desc, status); status->flag |= (RX_FLAG_MMIC_STRIPPED | RX_FLAG_MMIC_ERROR |
@@ -4066,19 +4108,21 @@ static void ath11k_dp_rx_h_tkip_mic_err(struct ath11k *ar, struct sk_buff *msdu,ath11k_dp_rx_h_undecap (ar, msdu, desc,HAL_ENCRYPT_TYPE_TKIP_MIC , status, false); + +return false; }static bool ath11k_dp_rx_h_rxdma_err (struct ath11k *ar,struct sk_buff *msdu,struct ieee80211_rx_status *status) {struct ath11k_skb_rxcb *rxcb =ATH11K_SKB_RXCB (msdu); -bool drop = false; +bool drop; ar->ab->soc_stats.rxdma_error[rxcb->err_code]++;switch (rxcb->err_code) {case HAL_REO_ENTR_RING_RXDMA_ECODE_TKIP_MIC_ERR : -ath11k_dp_rx_h_tkip_mic_err (ar, msdu, status); + drop =ath11k_dp_rx_h_tkip_mic_err (ar, msdu, status);break ;default :/* TODO: Review other rxdma error code to check if anything is
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 278/1250 ASoC: codecs: pcm3168a: Prevent regulator double-disable in S4
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cezary Rojewski <[email protected]>
[ Upstream commit bb3c847523f951315f212047ab26363f9928d569 ]
The SLEEP_PM_OPS are unset for the driver. Hibernation (S4) causes no resume (skipped thanks to smart_suspend=true) yet still performs the suspend sequence unconditionally, see device_complete() in drivers/base/power/main.c.
If S4 runs for already suspended pcm3168a device, we end up with "unbalanced disables" warning from the regulators. Assigning the operations fixes the problem.
--- sound/soc/codecs/pcm3168a.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/codecs/pcm3168a.c +1 -0
@@ -907,6 +907,7 @@ static int pcm3168a_rt_suspend(struct device *dev)EXPORT_GPL_DEV_PM_OPS (pcm3168a_pm_ops) = { RUNTIME_PM_OPS(pcm3168a_rt_suspend, pcm3168a_rt_resume, NULL) +SYSTEM_SLEEP_PM_OPS (pm_runtime_force_suspend, pm_runtime_force_resume) };MODULE_DESCRIPTION ("PCM3168A codec driver" );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 279/1250 ASoC: qcom: q6apm: return error code to consumers on failures
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
[ Upstream commit 3075ae5abbc370d2a9a01bd6d554a412d406f5bd ]
Return errors from audioreach_set_media_format() to ensure callers are notified when media format setup fails.
This could hide failures while programming media format parameters for individual modules and allow graph setup to continue with incomplete configuration.
--- sound/soc/qcom/qdsp6/q6apm.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
sound/soc/qcom/qdsp6/q6apm.c +5 -5
@@ -203,10 +203,7 @@ int q6apm_graph_media_format_shmem(struct q6apm_graph *graph,if (!module)return -ENODEV ; -audioreach_set_media_format (graph, module, cfg); - -return 0 ; - +return audioreach_set_media_format (graph, module, cfg); }EXPORT_SYMBOL_GPL (q6apm_graph_media_format_shmem);
@@ -374,6 +371,7 @@ int q6apm_graph_media_format_pcm(struct q6apm_graph *graph, struct audioreach_mostruct audioreach_sub_graph *sgs;struct audioreach_container *container;struct audioreach_module *module; +int ret;list_for_each_entry (sgs, &info->sg_list, node) {list_for_each_entry (container, &sgs->container_list, node) {
@@ -382,7 +380,9 @@ int q6apm_graph_media_format_pcm(struct q6apm_graph *graph, struct audioreach_mo (module->module_id == MODULE_ID_RD_SHARED_MEM_EP)) continue; -audioreach_set_media_format (graph, module, cfg); + ret =audioreach_set_media_format (graph, module, cfg); +if (ret) +return ret; } } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 280/1250 ASoC: codecs: pcm3168a: Drop CONFIG_PM-conditional preproc directive
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cezary Rojewski <[email protected]>
[ Upstream commit eb7107264da8545ba7381a76818bae553e1fd1e4 ]
Revert changes done in commit 489db5d94150 ("ASoC: pcm3168a:
Don't disable pcm3168a when CONFIG_PM defined") and add pm_runtime_status_suspended() check.
The suspended-check addresses regulator's "unbalanced disables" warning during driver removal even when CONFIG_PM is enabled.
--- sound/soc/codecs/pcm3168a.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-)
sound/soc/codecs/pcm3168a.c +7 -13
@@ -822,15 +822,6 @@ int pcm3168a_probe(struct device *dev, struct regmap *regmap) }EXPORT_SYMBOL_GPL (pcm3168a_probe); -static void pcm3168a_disable (struct device *dev) -{ -struct pcm3168a_priv *pcm3168a =dev_get_drvdata (dev); - -regulator_bulk_disable (ARRAY_SIZE (pcm3168a->supplies), - pcm3168a->supplies); -clk_disable_unprepare (pcm3168a->scki); -} -void pcm3168a_remove (struct device *dev) {struct pcm3168a_priv *pcm3168a =dev_get_drvdata (dev);
@@ -842,10 +833,12 @@ void pcm3168a_remove(struct device *dev)* The asserted level of GPIO_ACTIVE_LOW is LOW. */ gpiod_set_value_cansleep (pcm3168a->gpio_rst,1 ); +pm_runtime_disable (dev); -#ifndef CONFIG_PM -pcm3168a_disable (dev); -#endif +if (!pm_runtime_status_suspended (dev)) { +regulator_bulk_disable (ARRAY_SIZE (pcm3168a->supplies), pcm3168a->supplies); +clk_disable_unprepare (pcm3168a->scki); + } }EXPORT_SYMBOL_GPL (pcm3168a_remove);
@@ -900,7 +893,8 @@ static int pcm3168a_rt_suspend(struct device *dev)regcache_cache_only (pcm3168a->regmap, true); -pcm3168a_disable (dev); +regulator_bulk_disable (ARRAY_SIZE (pcm3168a->supplies), pcm3168a->supplies); +clk_disable_unprepare (pcm3168a->scki);return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 281/1250 wifi: ath12k: Prevent incorrect vif chanctx switch when handling multi-radio contexts
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aditya Kumar Singh <[email protected]>
[ Upstream commit 675aa75bfc29fb18c6e4d58904a91c1d37228217 ]
When multiple links switch channel contexts around the same time, mac80211 may complete CSA for several links together and invoke ath12k_mac_op_switch_vif_chanctx() with an array of vifs spanning more than one underlying radio in a single-wiphy configuration.
The driver currently assumes that all entries in the vifs array belong to the same radio and derives the radio context from the first element. On multi-radio hardware, this can lead to incorrect vdev selection/updates and may corrupt driver state when the number of vifs exceeds what a single radio supports.
Fix this by validating each vif's switch request and then processing vifs grouped by their associated radio. For each vif, ensure the band does not change across the switch and that both old/new channel contexts resolve to a valid ath12k device. Reject attempts to move a vif between radios (not supported for now) and return -EOPNOTSUPP to upper layers.
Then, iterate through the input vifs, collect all unprocessed entries that map to the same radio, and invoke ath12k_mac_update_vif_chan() separately for each radio group. This removes any reliance on mac80211 providing the array grouped by radio or sharing old_ctx pointers across vifs.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.5-01651-QCAHKSWPL_SILICONZ-1
--- drivers/net/wireless/ath/ath12k/mac.c | 87 +++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 11 deletions(-)
drivers/net/wireless/ath/ath12k/mac.c +76 -11
@@ -10888,6 +10888,9 @@ ath12k_mac_update_vif_chan(struct ath12k *ar,continue ; } +if (WARN_ON (!arvif)) +continue ; + ath12k_dbg(ab, ATH12K_DBG_MAC, "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n", arvif->vdev_id,
@@ -11628,23 +11631,85 @@ ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw, int n_vifs, enum ieee80211_chanctx_switch_mode mode) { -struct ath12k *ar; +struct ath12k *curr_ar, *new_ar, *group_ar; +struct ieee80211_vif_chanctx_switch *v; +int i, j, count =0 ;lockdep_assert_wiphy (hw->wiphy); - ar =ath12k_get_ar_by_ctx (hw, vifs->old_ctx); -if (!ar) -return -EINVAL ; +if (n_vifs ==0 ) +return 0 ; -/* Switching channels across radio is not allowed */ -if (ar !=ath12k_get_ar_by_ctx (hw, vifs->new_ctx)) -return -EINVAL ; + struct ath12k **ar_map __free(kfree) = kzalloc_objs(*ar_map, n_vifs); -ath12k_dbg (ar->ab,ATH12K_DBG_MAC , -"mac chanctx switch n_vifs %d mode %d\n" , - n_vifs, mode); -ath12k_mac_update_vif_chan (ar, vifs, n_vifs); +if (!ar_map) +return -ENOMEM ; + +for (i =0 ; i < n_vifs; i++) { + v = &vifs[i]; + +if (v->old_ctx->def.chan->band != v->new_ctx->def.chan->band) { +ath12k_generic_dbg (ATH12K_DBG_MAC , +"mac chanctx switch band change not supported\n" ); +return -EOPNOTSUPP ; + } + + curr_ar =ath12k_get_ar_by_ctx (hw, v->old_ctx); + new_ar =ath12k_get_ar_by_ctx (hw, v->new_ctx); + +if (!curr_ar || !new_ar) { +ath12k_generic_dbg (ATH12K_DBG_MAC , +"unable to determine device for the passed channel ctx\n" ); +ath12k_generic_dbg (ATH12K_DBG_MAC , +"Old freq %d MHz (device %s) to new freq %d MHz (device %s)\n" , + v->old_ctx->def.chan->center_freq, + curr_ar ?"valid" :"invalid" , + v->new_ctx->def.chan->center_freq, + new_ar ?"valid" :"invalid" ); +return -EINVAL ; + } +/* Switching a vif between two radios is not allowed */ +if (curr_ar != new_ar) { +ath12k_dbg (curr_ar->ab,ATH12K_DBG_MAC , +"mac chanctx switch to another radio not supported\n" ); +return -EOPNOTSUPP ; + } + + ar_map[i] = curr_ar; + } + +/* Group vifs by radio (ar) and process each group independently. */ + bool *processed __free(kfree) = kzalloc_objs(*processed, n_vifs); + +if (!processed) +return -ENOMEM ; + + struct ieee80211_vif_chanctx_switch *group_vifs __free(kfree) = +kzalloc_objs (*group_vifs, n_vifs); + +if (!group_vifs) +return -ENOMEM ; + +for (i =0 ; i < n_vifs; i++) { +if (processed[i]) +continue ; + + group_ar = ar_map[i]; + + count =0 ; +for (j =0 ; j < n_vifs; j++) { +if (!processed[j] && ar_map[j] == group_ar) { + group_vifs[count++] = vifs[j]; + processed[j] = true; + } + } + +ath12k_dbg (group_ar->ab,ATH12K_DBG_MAC , +"mac chanctx switch n_vifs %d mode %d\n" , + count, mode); +ath12k_mac_update_vif_chan (group_ar, group_vifs, count); + }return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 282/1250 ata: ahci: fail probe if BAR too small for claimed ports
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: liyouhong <[email protected]>
[ Upstream commit c4086c6e1af757e1ff26fa2d2926b3ec0195de79 ]
When an AHCI controller is disabled in BIOS, its HOST_CAP register may contain a bogus value, e.g. 0xFFFFFFFF.
Since CAP.NP (Number of Ports) is a zeroes based 5-bit register field, a value of 0x1f means 32 ports. If CAP.NP claims more ports than can physically fit within the mapped BAR region, accessing port registers beyond the BAR boundary causes a kernel panic.
Add validation in ahci_init_one() to check that the BAR size is sufficient for the number of ports claimed in CAP.NP. The check calculates the required MMIO size as:
required_size = 0x100 (global registers) + max_ports * 0x80
If required_size exceeds the actual BAR size, the probe fails with -ENODEV, preventing the panic and providing a clear error message.
--- drivers/ata/ahci.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/ata/ahci.c +22 -0
@@ -1933,6 +1933,24 @@ static ssize_t remapped_nvme_show(struct device *dev,static DEVICE_ATTR_RO (remapped_nvme); +static int ahci_validate_bar_size (struct pci_dev *pdev,int bar, +struct ahci_host_priv *hpriv) +{ +u32 cap =readl (hpriv->mmio +HOST_CAP ); +unsigned int max_ports =ahci_nr_ports (cap); +u32 last_port_end =0x100 + (max_ports *0x80 ); +resource_size_t bar_size =pci_resource_len (pdev, bar); + +if (last_port_end > bar_size) { +dev_warn (&pdev->dev, +"BAR%d too small for %u ports (last port ends at %#x, BAR %pa)\n" , + bar, max_ports, last_port_end, &bar_size); +return -ENODEV ; + } + +return 0 ; +} +static int ahci_init_one (struct pci_dev *pdev,const struct pci_device_id *ent) {unsigned int board_id = ent->driver_data;
@@ -2037,6 +2055,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)if (!hpriv->mmio)return -ENOMEM ; + rc =ahci_validate_bar_size (pdev, ahci_pci_bar, hpriv); +if (rc) +return rc; +/* detect remapped nvme devices */ ahci_remap_check (pdev, ahci_pci_bar, hpriv);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 283/1250 ACPI: scan: Honor _DEP for ACPI0016 PCI/CXL host bridge
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Pei <[email protected]>
[ Upstream commit bf5418a5fe63f35da35941ae896d5df121d95ffc ]
CXL root devices (ACPI0017) declare _DEP on their parent ACPI0016 PCI/CXL host bridge so that cxl_acpi probes only after acpi_pci_root has attached the PCI root and registered it for acpi_pci_find_root(). However, acpi_dev_ready_for_enumeration() only consults dep_unmet when the supplier's HID is on acpi_honor_dep_ids[]; otherwise the dependency is silently ignored.
Without honoring the dependency, cxl_acpi can probe before the PCI root is ready. The resulting CXL topology is broken: decoder targets read as 0 and no port/endpoint devices appear under /sys/bus/cxl/devices/.
Add ACPI0016 to acpi_honor_dep_ids[] so the _DEP declared by ACPI0017 is enforced. This relies on the preceding patch ("ACPI: PCI: clear _DEP dependencies after PCI root bridge attach"), which releases the dependency once the PCI root is fully enumerated; the two patches must be applied together.
--- drivers/acpi/scan.c | 1 + 1 file changed, 1 insertion(+)
drivers/acpi/scan.c +1 -0
@@ -870,6 +870,7 @@ static const char * const acpi_honor_dep_ids[] = {"RSCV0005" ,/* RISC-V SBI MPXY MBOX */ "RSCV0006" ,/* RISC-V RPMI SYSMSI */ "PNP0C0F" ,/* PCI Link Device */ +"ACPI0016" ,/* CXL/PCIe host bridge: CXL root (ACPI0017) depends on PCI root attach */ NULL };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 284/1250 ACPI: PCI: Clear _DEP dependencies after PCI root bridge attach
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Pei <[email protected]>
[ Upstream commit 3a59c3b772e5dc0cedecce8e7fbf7c2d6245b643 ]
PCI root bridges enumerated by acpi_pci_root_add() can be the _DEP supplier for other ACPI consumers, most notably ACPI0017 CXL root devices whose probe path depends on acpi_pci_find_root() succeeding. Once the root bus has been added, those consumers can safely be enumerated, so notify them by clearing the dependency.
Call acpi_dev_clear_dependencies() at the end of acpi_pci_root_add(), after pci_bus_add_devices(), following the same pattern used by other ACPI suppliers such as the EC (drivers/acpi/ec.c) and the ACPI PCI Link device (drivers/acpi/pci_link.c). The clear is intentionally done only on the success path; on the error paths the supplier did not attach and consumers must keep dep_unmet set.
This is a prerequisite for honoring _DEP on ACPI0016 host bridges, which matters on architectures where the probe order of acpi_pci_root relative to cxl_acpi is not guaranteed (e.g. RISC-V).
--- drivers/acpi/pci_root.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/acpi/pci_root.c +4 -0
@@ -759,6 +759,10 @@ static int acpi_pci_root_add(struct acpi_device *device,pci_lock_rescan_remove ();pci_bus_add_devices (root->bus);pci_unlock_rescan_remove (); + +/* Clear _DEP dependencies to allow consumers to enumerate */ +acpi_dev_clear_dependencies (device); +return 1 ; remove_dmar:
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 285/1250 ppc/fadump: invoke kmsg_dump in fadump panic path
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shivang Upadhyay <[email protected]>
[ Upstream commit 6ed8332639853b77329594a241eb99fc36d591a2 ]
fadump is registered in panic_notifier_list and gets triggered before kmsg_dump_desc() in the panic path. As a result, kmsg_dumpers such as pstore are not executed during fadump crashes.
This is problematic because pstore provides a critical fallback mechanism for crash analysis. When fadump fails to successfully reboot the system or capture a dump, pstore logs may be the only available information from the crashed kernel. Without invoking kmsg_dump_desc() in the fadump path, we lose this valuable diagnostic data.
Invoke kmsg_dump_desc() from the fadump panic handler, but only when fadump is actually registered (checked via should_fadump_crash()). This ensures kmsg_dumpers are called without duplicating the call that occurs later in panic() when fadump is not active.
The call is placed before crash_fadump() to ensure logs are captured before the system attempts to trigger the firmware-assisted dump.
--- arch/powerpc/kernel/setup-common.c | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/powerpc/kernel/setup-common.c +8 -0
@@ -68,6 +68,7 @@#include <asm/kasan.h> #include <asm/mce.h> #include <asm/systemcfg.h> +#include <linux/kmsg_dump.h> #include "setup.h"
@@ -744,6 +745,13 @@ static int ppc_panic_fadump_handler(struct notifier_block *this,*/ hard_irq_disable (); +/* +* Invoke kmsg_dump (e.g., pstore) before crash_fadump() as fadump +* runs before panic()'s kmsg_dump_desc() call. +*/ +if (should_fadump_crash ()) +kmsg_dump_desc (KMSG_DUMP_PANIC , (char *)ptr); +/* * If firmware-assisted dump has been registered then trigger * its callback and let the firmware handles everything else.
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 286/1250 net: qrtr: fix node refcount leak on ctrl packet alloc failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wentao Liang <[email protected]>
[ Upstream commit 3b09ff54114566864eea59020f6b69c5bb325b9d ]
qrtr_send_resume_tx() calls qrtr_node_lookup() which takes a reference on the returned node. If the subsequent call to qrtr_alloc_ctrl_packet() fails due to memory allocation failure, the function returns -ENOMEM without calling qrtr_node_release() to release the node reference.
Add qrtr_node_release(node) before returning on the allocation failure path to properly release the reference.
--- net/qrtr/af_qrtr.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/qrtr/af_qrtr.c +3 -1
@@ -1009,8 +1009,10 @@ static int qrtr_send_resume_tx(struct qrtr_cb *cb)return -EINVAL ; skb =qrtr_alloc_ctrl_packet (&pkt,GFP_KERNEL ); -if (!skb) +if (!skb) { +qrtr_node_release (node);return -ENOMEM ; + } pkt->cmd =cpu_to_le32 (QRTR_TYPE_RESUME_TX ); pkt->client.node =cpu_to_le32 (cb->dst_node);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 287/1250 net: wwan: t7xx: Add delay between MD and SAP suspend
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jose Ignacio Tornos Martinez <[email protected]>
[ Upstream commit ae733795e593272f67d607c09d2a00637ac13ed0 ]
SAP (Service Access Point) suspend occasionally times out with error -110 (ETIMEDOUT), followed by modem port errors and complete modem failure requiring a system reboot to recover.
Error symptoms:
mtk_t7xx 0000:72:00.0: [PM] SAP suspend error: -110 mtk_t7xx 0000:72:00.0: can't suspend (...returned -110) mtk_t7xx 0000:07:00.0: Failed to send skb: -22 mtk_t7xx 0000:07:00.0: Write error on MBIM port, -22
The modem firmware needs time after receiving the MD (modem) suspend request to complete internal operations before it is ready to accept the SAP suspend request. Without this delay, if runtime PM attempts to suspend while the firmware is busy, the SAP suspend command times out, leaving the modem in an unrecoverable state.
Root cause and userspace interaction:
ModemManager 1.24+ includes changes that reduce the likelihood of this issue by ensuring the modem is in a low-power state before the kernel attempts runtime suspend. However, the kernel driver should not depend on specific userspace behavior or ModemManager versions. Older versions (1.20-1.22) are still widely deployed, and the kernel should be robust regardless of userspace implementation details.
There appears to be no hardware status register or other mechanism available to query whether the firmware is ready for SAP suspend. A delay between the two suspend requests is the most reliable solution found through testing.
Add a 50ms delay between MD suspend and SAP suspend. This gives the firmware adequate time to complete internal operations without adding significant latency to the suspend path. This makes the driver robust across all ModemManager versions and system conditions.
Testing: 96+ hours of continuous operation with ModemManager 1.20.2 and Fibocom FM350-GL modem. Zero SAP suspend timeouts observed across 2000+ successful suspend/resume cycles. Previously failed within 24 hours with 100% reproducibility.
--- drivers/net/wwan/t7xx/t7xx_pci.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wwan/t7xx/t7xx_pci.c +3 -0
@@ -447,6 +447,9 @@ static int __t7xx_pci_pm_suspend(struct pci_dev *pdev) goto abort_suspend; } +/* Delay to prevent SAP suspend timeout */ +msleep (50 ); + ret =t7xx_send_pm_request (t7xx_dev,H2D_CH_SUSPEND_REQ_AP );if (ret) {t7xx_send_pm_request (t7xx_dev,H2D_CH_RESUME_REQ );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 288/1250 net: txgbe: fix phylink leak on AML init failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chenguang Zhao <[email protected]>
[ Upstream commit 9c89f975e66922f346d92d60c9d51d07274a7f3b ]
Destroy the phylink instance when fixed-link setup fails.
--- drivers/net/ethernet/wangxun/txgbe/txgbe_aml.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/wangxun/txgbe/txgbe_aml.c +1 -0
@@ -381,6 +381,7 @@ int txgbe_phylink_init_aml(struct txgbe *txgbe) err =phylink_set_fixed_link (phylink, &state);if (err) {wx_err (wx,"Failed to set fixed link\n" ); +phylink_destroy (phylink);return err; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 289/1250 iommu/rockchip: disable fetch dte time limit
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Xue <[email protected]>
[ Upstream commit 8d4346ecd4950ae08cc76a6de327c264e846758c ]
Disable the Bit 31 of the AUTO_GATING iommu register, as it causes hangups with the RGA3 (Raster Graphics Acceleration 3) peripheral. The RGA3 register description of the TRM already states that the bit must be set to 1. The vendor kernel sets the bit unconditionally to 1 to fix VOP (Video Output Processor) screen black issues. This patch squashes the 2 vendor kernel commits with the following commit messages:
Master fetch data and cpu update page table may work in parallel, may have the following procedure:
master cpu
fetch dte update page tabl
| |
(make dte invalid) <- zap iotlb entry
| |
fetch dte again
(make dte invalid) <- zap iotlb entry
| |
fetch dte again
(make dte invalid) <- zap iotlb entry
| |
fetch dte again
(make iommu block) <- zap iotlb entry
New iommu version has the above bug, if fetch dte consecutively four times, then it will be blocked. Fortunately, we can set bit 31 of register MMU_AUTO_GATING to 1 to make it work as old version which does not have this issue.
This issue only appears on RV1126 so far, so make a workaround dedicated to "rockchip,rv1126" machine type.
iommu/rockchip: fix vop blocked and screen black on RK356X and RK3588
RK3568 and RK3588 has the same issue as RV1126/RV1109 that caused by dte fetch time limit, So we can set BIT(31) of register 0x24 default to 1 as a workaround.
--- drivers/iommu/rockchip-iommu.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/iommu/rockchip-iommu.c +8 -0
@@ -76,6 +76,8 @@#define SPAGE_ORDER 12#define SPAGE_SIZE (1 << SPAGE_ORDER) +#define DISABLE_FETCH_DTE_TIME_LIMIT BIT(31) +/* * Support mapping any size that fits in one page table: * 4 KiB to 4 MiB
@@ -930,6 +932,7 @@ static int rk_iommu_enable(struct rk_iommu *iommu)struct iommu_domain *domain = iommu->domain;struct rk_iommu_domain *rk_domain =to_rk_domain (domain);int ret, i; +u32 auto_gate; ret =clk_bulk_enable (iommu->num_clocks, iommu->clocks);if (ret)
@@ -948,6 +951,11 @@ static int rk_iommu_enable(struct rk_iommu *iommu) rk_ops->mk_dtentries(rk_domain->dt_dma));rk_iommu_base_command (iommu->bases[i],RK_MMU_CMD_ZAP_CACHE );rk_iommu_write (iommu->bases[i],RK_MMU_INT_MASK ,RK_MMU_IRQ_MASK ); + +/* Workaround for iommu blocked, BIT(31) default to 1 */ + auto_gate =rk_iommu_read (iommu->bases[i],RK_MMU_AUTO_GATING ); + auto_gate |=DISABLE_FETCH_DTE_TIME_LIMIT ; +rk_iommu_write (iommu->bases[i],RK_MMU_AUTO_GATING , auto_gate); } ret =rk_iommu_enable_paging (iommu);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 290/1250 powerpc/fadump: Add timeout to RTAS busy-wait loops
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adriano Vero <[email protected]>
[ Upstream commit b3580dd1c68cec23d44a39c439e18b4686c13480 ]
The ibm,configure-kernel-dump RTAS call sites in rtas_fadump_register(), rtas_fadump_unregister(), and rtas_fadump_invalidate() polled indefinitely while firmware returned a busy status. A misbehaving or hung firmware could stall these paths forever, blocking fadump registration at boot or preventing clean teardown.
Introduce rtas_fadump_call(), a helper that wraps the common busy-wait pattern shared by all three sites. The helper accumulates the total delay and returns -ETIMEDOUT if firmware keeps returning a busy status beyond RTAS_FADUMP_MAX_WAIT_MS (60 seconds). A pr_debug() message is emitted on each busy iteration to aid diagnosis when the timeout is hit.
--- arch/powerpc/platforms/pseries/rtas-fadump.c | 80 ++++++++++++-------- arch/powerpc/platforms/pseries/rtas-fadump.h | 6 ++ 2 files changed, 53 insertions(+), 33 deletions(-)
arch/powerpc/platforms/pseries/rtas-fadump.c +47 -33
@@ -179,9 +179,42 @@ static u64 rtas_fadump_get_bootmem_min(void)return RTAS_FADUMP_MIN_BOOT_MEM ; } +/* +* Helper to make an ibm,configure-kernel-dump RTAS call with a bounded +* busy-wait loop. Returns the RTAS return code on completion, or +* -ETIMEDOUT if firmware keeps returning a busy status beyond +* RTAS_FADUMP_MAX_WAIT_MS milliseconds. +*/ +static int rtas_fadump_call (struct fw_dump *fadump_conf,int operation, +void *fdm_ptr,unsigned int fdm_size, +const char *op_name) +{ +unsigned int wait_time, total_wait =0 ; +int rc; + +do { + rc =rtas_call (fadump_conf->ibm_configure_kernel_dump,3 ,1 , +NULL , operation, fdm_ptr, fdm_size); + wait_time =rtas_busy_delay_time (rc); +if (wait_time) { +pr_debug ("Firmware busy during fadump %s, waiting %ums (total %ums)\n" , + op_name, wait_time, total_wait); +if (total_wait >=RTAS_FADUMP_MAX_WAIT_MS ) { +pr_err ("Timed out waiting for firmware to complete fadump %s\n" , + op_name); +return -ETIMEDOUT ; + } + total_wait += wait_time; +mdelay (wait_time); + } + }while (wait_time); + +return rc; +} +static int rtas_fadump_register (struct fw_dump *fadump_conf) { -unsigned int wait_time, fdm_size; +unsigned int fdm_size;int rc, err = -EIO ;/*
@@ -192,16 +225,10 @@ static int rtas_fadump_register(struct fw_dump *fadump_conf) fdm_size =sizeof (struct rtas_fadump_section_header ); fdm_size +=be16_to_cpu (fdm.header.dump_num_sections) *sizeof (struct rtas_fadump_section ); -/* TODO: Add upper time limit for the delay */ -do { - rc =rtas_call (fadump_conf->ibm_configure_kernel_dump,3 ,1 , -NULL ,FADUMP_REGISTER , &fdm, fdm_size); - - wait_time =rtas_busy_delay_time (rc); -if (wait_time) -mdelay (wait_time); - - }while (wait_time); + rc =rtas_fadump_call (fadump_conf,FADUMP_REGISTER , &fdm, fdm_size, +"register" ); +if (rc == -ETIMEDOUT ) +return -ETIMEDOUT ;switch (rc) {case 0 :
@@ -234,19 +261,12 @@ static int rtas_fadump_register(struct fw_dump *fadump_conf)static int rtas_fadump_unregister (struct fw_dump *fadump_conf) { -unsigned int wait_time;int rc; -/* TODO: Add upper time limit for the delay */ -do { - rc =rtas_call (fadump_conf->ibm_configure_kernel_dump,3 ,1 , -NULL ,FADUMP_UNREGISTER , &fdm, -sizeof (struct rtas_fadump_mem_struct )); - - wait_time =rtas_busy_delay_time (rc); -if (wait_time) -mdelay (wait_time); - }while (wait_time); + rc =rtas_fadump_call (fadump_conf,FADUMP_UNREGISTER , &fdm, +sizeof (struct rtas_fadump_mem_struct ),"unregister" ); +if (rc == -ETIMEDOUT ) +return -ETIMEDOUT ;if (rc) {pr_err ("Failed to un-register - unexpected error(%d).\n" , rc);
@@ -259,19 +279,13 @@ static int rtas_fadump_unregister(struct fw_dump *fadump_conf)static int rtas_fadump_invalidate (struct fw_dump *fadump_conf) { -unsigned int wait_time;int rc; -/* TODO: Add upper time limit for the delay */ -do { - rc =rtas_call (fadump_conf->ibm_configure_kernel_dump,3 ,1 , -NULL ,FADUMP_INVALIDATE , fdm_active, -sizeof (struct rtas_fadump_mem_struct )); - - wait_time =rtas_busy_delay_time (rc); -if (wait_time) -mdelay (wait_time); - }while (wait_time); + rc =rtas_fadump_call (fadump_conf,FADUMP_INVALIDATE , + (void *)fdm_active, +sizeof (struct rtas_fadump_mem_struct ),"invalidate" ); +if (rc == -ETIMEDOUT ) +return -ETIMEDOUT ;if (rc) {pr_err ("Failed to invalidate - unexpected error (%d).\n" , rc);
arch/powerpc/platforms/pseries/rtas-fadump.h +6 -0
@@ -41,6 +41,12 @@#define MAX_SECTIONS 10#define RTAS_FADUMP_MAX_BOOT_MEM_REGS 7 +/* +* Maximum time to wait for firmware to respond to an +* ibm,configure-kernel-dump RTAS call before giving up. +*/ +#define RTAS_FADUMP_MAX_WAIT_MS 60000U +/* Kernel Dump section info */ struct rtas_fadump_section {__be32 request_flag;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 291/1250 fs/ntfs3: preserve non-DOS attribute bits in system.dos_attrib
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: ZhengYuan Huang <[email protected]>
[ Upstream commit b1c1101067d9536bcb0fe023b96ee2dde5535959 ]
[BUG]
A corrupted ntfs3 image can hit a NULL function pointer call in generic_perform_write() after toggling system.ntfs_attrib and then overwriting system.dos_attrib on the same file.
BUG: kernel NULL pointer dereference, address: 0000000000000000 \#PF: supervisor instruction fetch in kernel mode \#PF: error_code(0x0010) - not-present page PGD bed5067 P4D bed5067 PUD 0 Oops: Oops: 0010 [#1] SMP KASAN NOPTI RIP: 0010:0x0 Code: Unable to access opcode bytes at 0xffffffffffffffd6. RSP: 0018:ffff88801025f988 EFLAGS: 00010246 Call Trace: generic_perform_write+0x409/0x8c0 mm/filemap.c:4255 __generic_file_write_iter+0x1bb/0x200 mm/filemap.c:4372 ntfs_file_write_iter+0xcd9/0x1c20 fs/ntfs3/file.c:1253 new_sync_write fs/read_write.c:593 [inline] vfs_write+0x63b/0xf70 fs/read_write.c:686 ksys_write+0x133/0x250 fs/read_write.c:738 __do_sys_write fs/read_write.c:749 [inline] __se_sys_write fs/read_write.c:746 [inline] __x64_sys_write+0x77/0xc0 fs/read_write.c:746 ...
[CAUSE]
system.ntfs_attrib updates ATTR_DATA flags via ni_new_attr_flags() and switches i_mapping->a_ops to ntfs_aops_cmpr when FILE_ATTRIBUTE_COMPRESSED is set. system.dos_attrib then overwrites ni->std_fa from a one-byte DOS attribute value, clearing the compression bit without updating ATTR_DATA or the mapping operations.
Old buffered writes use is_compressed(ni) to choose __generic_file_write_iter(). That leaves generic_perform_write() calling a NULL write_begin callback from ntfs_aops_cmpr.
[FIX]
Treat system.dos_attrib as a low-byte DOS attribute update and preserve the existing non-DOS attribute bits in ni->std_fa. This keeps compressed and sparse state consistent with ATTR_DATA and the mapping operations while keeping the existing DOS attribute semantics intact.
--- fs/ntfs3/xattr.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/ntfs3/xattr.c +3 -1
@@ -870,7 +870,9 @@ static noinline int ntfs_setxattr(const struct xattr_handler *handler,if (!strcmp (name,SYSTEM_DOS_ATTRIB )) {if (sizeof (u8) != size) goto out; - new_fa =cpu_to_le32 (*(u8 *)value); +/* system.dos_attrib only covers the low DOS attribute byte. */ + new_fa = (ni->std_fa & ~cpu_to_le32 (0xff )) | +cpu_to_le32 (*(u8 *)value); goto set_new_fa; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 292/1250 nvme: refresh multipath head zoned limits from path limits
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yao Sang <[email protected]>
[ Upstream commit 59c0517123f2757c41d7795f841bc4c836577d17 ]
queue_limits_stack_bdev() updates the multipath head limits from the path queue, but it does not propagate max_open_zones or max_active_zones. As a result, a zoned multipath namespace head can keep stale 0/0 values even after a ready path reports finite zoned resource limits.
When refreshing the head limits in nvme_update_ns_info(), stack the zoned resource limits directly after stacking the path queue limits. Use min_not_zero() so the block layer's 0 value keeps its "no limit" meaning while finite limits are combined conservatively.
This avoids advertising "no limit" on the multipath head while keeping the zoned-limit handling local to the NVMe multipath update path.
--- drivers/nvme/host/core.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/nvme/host/core.c +10 -0
@@ -2465,6 +2465,14 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns,return ret; } +static void nvme_stack_zone_resources (struct queue_limits *t, +const struct queue_limits *b) +{ + t->max_open_zones =min_not_zero (t->max_open_zones, b->max_open_zones); + t->max_active_zones = +min_not_zero (t->max_active_zones, b->max_active_zones); +} +static int nvme_update_ns_info (struct nvme_ns *ns,struct nvme_ns_info *info) {bool unsupported = false;
@@ -2531,6 +2539,8 @@ static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_ns_info *info) lim.io_opt = ns_lim->io_opt;queue_limits_stack_bdev (&lim, ns->disk->part0,0 , ns->head->disk->disk_name); +if (lim.features &BLK_FEAT_ZONED ) +nvme_stack_zone_resources (&lim, ns_lim);if (unsupported) ns->head->disk->flags |=GENHD_FL_HIDDEN ;else
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 293/1250 fs/ntfs3: validate index entry key bounds
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: ZhengYuan Huang <[email protected]>
[ Upstream commit 98d6e5d9dc1d34dcffc61549617581a5fe1ef807 ]
[BUG]
A malformed NTFS directory index entry can advertise a key_size larger than the bytes actually present in its NTFS_DE payload. Directory lookup then passes that malformed key to cmp_fnames(), which can read past the end of the kmalloc'ed index buffer.
BUG: KASAN: slab-out-of-bounds in fname_full_size fs/ntfs3/ntfs.h:590 [inline] BUG: KASAN: slab-out-of-bounds in cmp_fnames+0x1ea/0x230 fs/ntfs3/index.c:46 Read of size 1 at addr ffff88801c313018 by task syz.6.3365/9279 Call Trace: __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0xbe/0x130 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:378 [inline] print_report+0xd1/0x650 mm/kasan/report.c:482 kasan_report+0xfb/0x140 mm/kasan/report.c:595 __asan_report_load1_noabort+0x14/0x30 mm/kasan/report_generic.c:378 fname_full_size fs/ntfs3/ntfs.h:590 [inline] cmp_fnames+0x1ea/0x230 fs/ntfs3/index.c:46 hdr_find_e.isra.0+0x3ed/0x670 fs/ntfs3/index.c:762 indx_find+0x4b5/0x900 fs/ntfs3/index.c:1186 dir_search_u+0x2c0/0x460 fs/ntfs3/dir.c:254 ntfs_lookup+0x1cc/0x2a0 fs/ntfs3/namei.c:85 __lookup_slow+0x241/0x450 fs/namei.c:1816 lookup_slow fs/namei.c:1833 [inline] walk_component+0x31c/0x570 fs/namei.c:2151 link_path_walk+0x592/0xd60 fs/namei.c:2519 path_lookupat+0x138/0x660 fs/namei.c:2675 filename_lookup+0x1f3/0x560 fs/namei.c:2705 filename_setxattr+0xad/0x1c0 fs/xattr.c:660 path_setxattrat+0x1d8/0x280 fs/xattr.c:713 __do_sys_lsetxattr fs/xattr.c:754 [inline] __se_sys_lsetxattr fs/xattr.c:750 [inline] __x64_sys_lsetxattr+0xd0/0x150 fs/xattr.c:750 ... Allocated by task 9279: kasan_save_stack+0x39/0x70 mm/kasan/common.c:56 kasan_save_track+0x14/0x40 mm/kasan/common.c:77 kasan_save_alloc_info+0x37/0x60 mm/kasan/generic.c:573 poison_kmalloc_redzone mm/kasan/common.c:400 [inline] __kasan_kmalloc+0xc3/0xd0 mm/kasan/common.c:417 kasan_kmalloc include/linux/kasan.h:262 [inline] __do_kmalloc_node mm/slub.c:5650 [inline] __kmalloc_noprof+0x2bd/0x900 mm/slub.c:5662 kmalloc_noprof include/linux/slab.h:961 [inline] indx_read+0x41d/0xad0 fs/ntfs3/index.c:1059 indx_find+0x447/0x900 fs/ntfs3/index.c:1179 dir_search_u+0x2c0/0x460 fs/ntfs3/dir.c:254 ntfs_lookup+0x1cc/0x2a0 fs/ntfs3/namei.c:85 __lookup_slow+0x241/0x450 fs/namei.c:1816 lookup_slow fs/namei.c:1833 [inline] walk_component+0x31c/0x570 fs/namei.c:2151 link_path_walk+0x592/0xd60 fs/namei.c:2519 path_lookupat+0x138/0x660 fs/namei.c:2675 filename_lookup+0x1f3/0x560 fs/namei.c:2705 filename_setxattr+0xad/0x1c0 fs/xattr.c:660 path_setxattrat+0x1d8/0x280 fs/xattr.c:713 __do_sys_lsetxattr fs/xattr.c:754 [inline] __se_sys_lsetxattr fs/xattr.c:750 [inline] __x64_sys_lsetxattr+0xd0/0x150 fs/xattr.c:750 ...
[CAUSE]
The index-header validators only validated INDEX_HDR-level geometry. They did not walk each NTFS_DE to verify entry alignment, subnode layout, or that key_size fit inside the entry payload. They also allowed a last sentinel entry to carry a non-zero key_size.
[FIX]
Walk every NTFS_DE in ntfs3's index-header validators and reject entries with invalid layout, mismatched subnode state, oversized key_size, or non-zero sentinel keys before lookup or log replay can consume them.
--- fs/ntfs3/fslog.c | 26 ++++++++++++++++++++------ fs/ntfs3/index.c | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 7 deletions(-)
fs/ntfs3/fslog.c +20 -6
@@ -2641,11 +2641,12 @@ static int read_next_log_rec(struct ntfs_log *log, struct lcb *lcb, u64 *lsn)bool check_index_header (const struct INDEX_HDR *hdr,size_t bytes) { +const bool has_subnode =hdr_has_subnode (hdr);__le16 mask;u32 min_de, de_off, used, total;const struct NTFS_DE *e; -if (hdr_has_subnode (hdr)) { +if (has_subnode) { min_de =sizeof (struct NTFS_DE ) +sizeof (u64); mask =NTFS_IE_HAS_SUBNODES ; }else {
@@ -2662,20 +2663,33 @@ bool check_index_header(const struct INDEX_HDR *hdr, size_t bytes)return false; } - e =Add2Ptr (hdr, de_off); + e = (const struct NTFS_DE *)((const u8 *)hdr + de_off);for (;;) {u16 esize =le16_to_cpu (e->size); -struct NTFS_DE *next =Add2Ptr (e, esize); +u16 key_size =le16_to_cpu (e->key_size); +u16 data_size; -if (esize < min_de ||PtrOffset (hdr, next) > used || +if (!IS_ALIGNED (esize,8 ) || esize < min_de || (e->flags &NTFS_IE_HAS_SUBNODES ) != mask) {return false; } -if (de_is_last (e)) +if (size_add (de_off, esize) > used) +return false; + +if (de_is_last (e)) { +if (key_size) +return false; +break ; + } + + data_size = esize - min_de; +if (key_size > data_size) +return false; - e = next; + de_off += esize; + e = (const struct NTFS_DE *)((const u8 *)hdr + de_off); }return true;
fs/ntfs3/index.c +36 -1
@@ -613,16 +613,51 @@ static const struct NTFS_DE *hdr_insert_head(struct INDEX_HDR *hdr,*/ static bool index_hdr_check (const struct INDEX_HDR *hdr,u32 bytes) { +const bool has_subnode =hdr_has_subnode (hdr); +const u16 min_size =sizeof (struct NTFS_DE ) + + (has_subnode ?sizeof (u64) :0 );u32 end =le32_to_cpu (hdr->used);u32 tot =le32_to_cpu (hdr->total);u32 off =le32_to_cpu (hdr->de_off); +const struct NTFS_DE *e;if (!IS_ALIGNED (off,8 ) || tot > bytes || end > tot || -size_add (off,sizeof (struct NTFS_DE )) > end) { +size_add (off, min_size) > end) {/* incorrect index buffer. */ return false; } +/* Ensure every key stays inside its entry before lookup walks it. */ + e = (const struct NTFS_DE *)((const u8 *)hdr + off); +for (;;) { +u16 e_size =le16_to_cpu (e->size); +u16 key_size =le16_to_cpu (e->key_size); +u16 data_size; + +if (!IS_ALIGNED (e_size,8 ) || e_size < min_size || +de_has_vcn (e) != has_subnode) { +/* incorrect index entry. */ +return false; + } + +if (size_add (off, e_size) > end) +return false; + +if (de_is_last (e)) { +if (key_size) +return false; + +break ; + } + + data_size = e_size - min_size; +if (key_size > data_size) +return false; + + off += e_size; + e = (const struct NTFS_DE *)((const u8 *)hdr + off); + } +return true; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 294/1250 ntfs3: fix out-of-bounds read in ntfs_dir_emit() and hdr_find_e()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alessandro Schino <[email protected]>
[ Upstream commit aa1bdbb39f49c5bc9779316891c40005517842a5 ]
The bounds check in ntfs_dir_emit() compares fname->name_len (a character count) against e->size (a byte count) without accounting for the 2-byte-per-character UTF-16LE encoding or the ATTR_FILE_NAME header size:
if (fname->name_len + sizeof(struct NTFS_DE) > le16_to_cpu(e->size))
This computes: name_len + 16 > e_size
The correct check must account for the ATTR_FILE_NAME header (66 bytes before the name) and the UTF-16LE character size (2 bytes each):
sizeof(NTFS_DE) + offsetof(ATTR_FILE_NAME, name) + name_len * sizeof(short) > e_size
Which computes: 16 + 66 + name_len * 2 > e_size
The correct calculation already exists as fname_full_size() in ntfs.h and is used in cmp_fnames(), namei.c, and fslog.c, but was not used in the readdir path.
A crafted NTFS image with an index entry containing a small e->size but large fname->name_len bypasses the current check, causing ntfs_utf16_to_nls() to read past the entry boundary.
Additionally, add a key_size validation in hdr_find_e() to ensure the declared key_size does not exceed the available entry data, preventing comparison functions from reading past entry boundaries on the lookup path.
--- fs/ntfs3/dir.c | 4 +++- fs/ntfs3/index.c | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-)
fs/ntfs3/dir.c +3 -1
@@ -304,7 +304,9 @@ static inline bool ntfs_dir_emit(struct ntfs_sb_info *sbi,if (sbi->options->nohidden && (fname->dup.fa &FILE_ATTRIBUTE_HIDDEN ))return true; -if (fname->name_len +sizeof (struct NTFS_DE ) >le16_to_cpu (e->size)) +if (sizeof (struct NTFS_DE ) + + offsetof(struct ATTR_FILE_NAME , name) + + fname->name_len *sizeof (short ) >le16_to_cpu (e->size))return true; name_len = ntfs_utf16_to_nls(sbi, fname->name, fname->name_len, name,
fs/ntfs3/index.c +4 -0
@@ -794,6 +794,10 @@ static struct NTFS_DE *hdr_find_e(const struct ntfs_index *indx, binary_search: e_key_len =le16_to_cpu (e->key_size); +/* Validate key_size fits within the entry data area. */ +if (e_key_len >le16_to_cpu (e->size) -sizeof (struct NTFS_DE )) +return NULL ; + diff2 = (*cmp)(key, key_len, e +1 , e_key_len, ctx);if (diff2 >0 ) {if (found) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 295/1250 ASoC: codecs: rk3328: Use managed GPIO and clock helpers
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cássio Gabriel <[email protected]>
[ Upstream commit 0cf3489bba9ad13aae052232e223e19a620fe7a7 ]
rk3328_platform_probe() acquires the mute GPIO with gpiod_get_optional() but never releases it. It also enables mclk and pclk manually while relying on probe error labels for unwind, and the driver has no platform remove callback to disable those clocks after a successful unbind.
This path has already needed fixes for missing clock unwinds on probe errors. Use devm_gpiod_get_optional() and devm_clk_get_enabled() so the GPIO and enabled clock lifetimes are tied to the device. This removes the manual error labels and makes both probe failure and driver unbind follow the normal devres cleanup path.
--- sound/soc/codecs/rk3328_codec.c | 54 ++++++++------------------------- 1 file changed, 13 insertions(+), 41 deletions(-)
sound/soc/codecs/rk3328_codec.c +13 -41
@@ -425,7 +425,6 @@ static int rk3328_platform_probe(struct platform_device *pdev)struct rk3328_codec_priv *rk3328;struct regmap *grf;void __iomem *base; -int ret =0 ; rk3328 =devm_kzalloc (&pdev->dev,sizeof (*rk3328),GFP_KERNEL );if (!rk3328)
@@ -441,14 +440,13 @@ static int rk3328_platform_probe(struct platform_device *pdev)regmap_write (grf,RK3328_GRF_SOC_CON2 , (BIT (14 ) <<16 |BIT (14 ))); - ret =of_property_read_u32 (rk3328_np,"spk-depop-time-ms" , - &rk3328->spk_depop_time); -if (ret <0 ) { +if (of_property_read_u32 (rk3328_np,"spk-depop-time-ms" , + &rk3328->spk_depop_time)) {dev_info (&pdev->dev,"spk_depop_time use default value.\n" ); rk3328->spk_depop_time =200 ; } - rk3328->mute =gpiod_get_optional (&pdev->dev,"mute" ,GPIOD_OUT_HIGH ); + rk3328->mute =devm_gpiod_get_optional (&pdev->dev,"mute" ,GPIOD_OUT_HIGH );if (IS_ERR (rk3328->mute))return PTR_ERR (rk3328->mute);/*
@@ -461,57 +459,31 @@ static int rk3328_platform_probe(struct platform_device *pdev)regmap_write (grf,RK3328_GRF_SOC_CON10 ,BIT (17 ) |BIT (1 )); } - rk3328->mclk =devm_clk_get (&pdev->dev,"mclk" ); + rk3328->mclk =devm_clk_get_enabled (&pdev->dev,"mclk" );if (IS_ERR (rk3328->mclk))return PTR_ERR (rk3328->mclk); - ret =clk_prepare_enable (rk3328->mclk); -if (ret) -return ret;clk_set_rate (rk3328->mclk,INITIAL_FREQ ); - rk3328->pclk =devm_clk_get (&pdev->dev,"pclk" ); -if (IS_ERR (rk3328->pclk)) { -dev_err (&pdev->dev,"can't get acodec pclk\n" ); - ret =PTR_ERR (rk3328->pclk); - goto err_unprepare_mclk; - } - - ret =clk_prepare_enable (rk3328->pclk); -if (ret <0 ) { -dev_err (&pdev->dev,"failed to enable acodec pclk\n" ); - goto err_unprepare_mclk; - } + rk3328->pclk =devm_clk_get_enabled (&pdev->dev,"pclk" ); +if (IS_ERR (rk3328->pclk)) +return dev_err_probe (&pdev->dev,PTR_ERR (rk3328->pclk), +"failed to get or enable acodec pclk\n" ); base =devm_platform_ioremap_resource (pdev,0 ); -if (IS_ERR (base)) { - ret =PTR_ERR (base); - goto err_unprepare_pclk; - } +if (IS_ERR (base)) +return PTR_ERR (base); rk3328->regmap =devm_regmap_init_mmio (&pdev->dev, base, &rk3328_codec_regmap_config); -if (IS_ERR (rk3328->regmap)) { - ret =PTR_ERR (rk3328->regmap); - goto err_unprepare_pclk; - } +if (IS_ERR (rk3328->regmap)) +return PTR_ERR (rk3328->regmap);platform_set_drvdata (pdev, rk3328); - ret =devm_snd_soc_register_component (&pdev->dev, &soc_codec_rk3328, +return devm_snd_soc_register_component (&pdev->dev, &soc_codec_rk3328, rk3328_dai,ARRAY_SIZE (rk3328_dai)); -if (ret) - goto err_unprepare_pclk; - -return 0 ; - -err_unprepare_pclk: -clk_disable_unprepare (rk3328->pclk); - -err_unprepare_mclk: -clk_disable_unprepare (rk3328->mclk); -return ret; }static const struct of_device_id rk3328_codec_of_match[]__maybe_unused = {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 296/1250 ALSA: seq: oss: Reject reads that cannot fit the next event
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cássio Gabriel <[email protected]>
[ Upstream commit 611f538253d970f4d152003841544e875828d015 ]
snd_seq_oss_read() checks whether the next queued OSS sequencer event fits in the remaining userspace buffer before removing it from the read queue.
The check is inverted. It currently stops when the event is smaller than the remaining buffer, so a normal 4-byte event is not copied for an 8-byte read buffer. Conversely, an 8-byte event can be copied for a smaller read count.
Break only when the remaining userspace buffer is smaller than the next event, and report -EINVAL if no complete event has been copied. This prevents an undersized read from looking like end-of-file while leaving the event queued for a later read with a large enough buffer.
--- sound/core/seq/oss/seq_oss_rw.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/core/seq/oss/seq_oss_rw.c +2 -1
@@ -57,7 +57,8 @@ snd_seq_oss_read(struct seq_oss_devinfo *dp, char __user *buf, int count)break ; } ev_len =ev_length (&rec); -if (ev_len < count) { +if (count < ev_len) { + err = -EINVAL ;snd_seq_oss_readq_unlock (readq, flags);break ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 297/1250 dpaa2-switch: rework FDB management on the bridge leave path
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ioana Ciornei <[email protected]>
[ Upstream commit efc1d92eacf03afa6f4d53bf7120e059b6f961f2 ]
On bridge leave, the dpaa2_switch_port_set_fdb() function always allocates a new FDB for the port which is becoming standalone. In case no FDB is found, then the port leaving a bridge will continue to use the current one.
The above logic does not cover the case in which there are multiple bridges which have ports from the same DPSW instance. In this case, when the last port leaves bridge #1, it finds an unused FDB to switch to, but the old FDB is not marked as unused. Since the number of FDBs is equal to the number of DPSW interfaces, this will eventually lead to multiple ports sharing the same FDB.
Fix this by changing how we are managing the FDBs on the leave path. Instead of directly allocating a new FDB, first verify if the current port is the last one to leave a bridge. If this is the case, then continue to use the current FDB and only allocate another FDB if there are other ports remaining in the bridge.
--- .../ethernet/freescale/dpaa2/dpaa2-switch.c | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-)
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +24 -7
@@ -54,27 +54,44 @@ dpaa2_switch_filter_block_get_unused(struct ethsw_core *ethsw)static u16 dpaa2_switch_port_set_fdb (struct ethsw_port_priv *port_priv,struct net_device *bridge_dev) { +struct ethsw_core *ethsw = port_priv->ethsw_data;struct ethsw_port_priv *other_port_priv =NULL ;struct dpaa2_switch_fdb *fdb;struct net_device *other_dev; +bool last_fdb_user = true;struct list_head *iter; +int i;/* If we leave a bridge (bridge_dev is NULL), find an unused * FDB and use that. */ if (!bridge_dev) { - fdb =dpaa2_switch_fdb_get_unused (port_priv->ethsw_data); - -/* If there is no unused FDB, we must be the last port that -* leaves the last bridge, all the others are standalone. We -* can just keep the FDB that we already have. -*/ +/* First verify if this is the last port to leave this bridge */ +for (i =0 ; i < ethsw->sw_attr.num_ifs; i++) { +if (!ethsw->ports[i] || ethsw->ports[i] == port_priv) +continue ; +if (ethsw->ports[i]->fdb == port_priv->fdb) { + last_fdb_user = false; +break ; + } + } -if (!fdb) { +/* If this is the last user of the FDB, just keep using it. */ +if (last_fdb_user) { port_priv->fdb->bridge_dev =NULL ;return 0 ; } +/* Since we are not the last port which leaves a bridge, +* acquire a new FDB and use it. The number of FDBs is sized to +* accommodate all switch ports as standalone, each with its +* private FDB, which means that dpaa2_switch_fdb_get_unused() +* must succeed here. WARN if not. +*/ + fdb =dpaa2_switch_fdb_get_unused (port_priv->ethsw_data); +if (WARN_ON (!fdb)) +return 0 ; + port_priv->fdb = fdb; port_priv->fdb->in_use = true; port_priv->fdb->bridge_dev =NULL ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 298/1250 dpaa2-switch: fix the error path in dpaa2_switch_rx()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ioana Ciornei <[email protected]>
[ Upstream commit 74c1c9f5c0c30bbd0c2cf87b6e3507e7ea46c13d ]
In case of an error in dpaa2_switch_rx(), the dpaa2_switch_free_fd() function is called in order to free the FD. This is incorrect since the dpaa2_switch_free_fd() is intended to be used on Tx frame descriptors, meaning that it expects in the software annotation area of the FD data to find a valid skb pointer on which to call dev_kfree_skb().
Fix this by extracting the dma_unmap_page() from dpaa2_switch_build_linear_skb() directly into the dpaa2_switch_rx() function. This allows us to directly use free_pages() in case of an error before an SKB was created and kfree_skb() afterwards.
--- .../ethernet/freescale/dpaa2/dpaa2-switch.c | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-)
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +12 -11
@@ -2438,18 +2438,13 @@ static int dpaa2_switch_port_blocking_event(struct notifier_block *nb,/* Build a linear skb based on a single-buffer frame descriptor */ static struct sk_buff *dpaa2_switch_build_linear_skb (struct ethsw_core *ethsw, -const struct dpaa2_fd *fd) +const struct dpaa2_fd *fd, +void *fd_vaddr) {u16 fd_offset =dpaa2_fd_get_offset (fd); -dma_addr_t addr =dpaa2_fd_get_addr (fd);u32 fd_length =dpaa2_fd_get_len (fd);struct device *dev = ethsw->dev;struct sk_buff *skb =NULL ; -void *fd_vaddr; - - fd_vaddr =dpaa2_iova_to_virt (ethsw->iommu_domain, addr); -dma_unmap_page (dev, addr,DPAA2_SWITCH_RX_BUF_SIZE , -DMA_FROM_DEVICE ); skb =build_skb (fd_vaddr,DPAA2_SWITCH_RX_BUF_SIZE +SKB_DATA_ALIGN (sizeof (struct skb_shared_info )));
@@ -2475,6 +2470,7 @@ static void dpaa2_switch_tx_conf(struct dpaa2_switch_fq *fq,static void dpaa2_switch_rx (struct dpaa2_switch_fq *fq,const struct dpaa2_fd *fd) { +dma_addr_t addr =dpaa2_fd_get_addr (fd);struct ethsw_core *ethsw = fq->ethsw;struct ethsw_port_priv *port_priv;struct net_device *netdev;
@@ -2482,10 +2478,14 @@ static void dpaa2_switch_rx(struct dpaa2_switch_fq *fq,struct sk_buff *skb;u16 vlan_tci, vid;int if_id, err; +void *vaddr; + + vaddr =dpaa2_iova_to_virt (ethsw->iommu_domain, addr); +dma_unmap_page (ethsw->dev, addr,DPAA2_SWITCH_RX_BUF_SIZE , +DMA_FROM_DEVICE );/* get switch ingress interface ID */ if_id =upper_32_bits (dpaa2_fd_get_flc (fd)) &0x0000FFFF ; -if (if_id >= ethsw->sw_attr.num_ifs) {dev_err (ethsw->dev,"Frame received from unknown interface!\n" ); goto err_free_fd;
@@ -2501,7 +2501,7 @@ static void dpaa2_switch_rx(struct dpaa2_switch_fq *fq, } } - skb =dpaa2_switch_build_linear_skb (ethsw, fd); + skb =dpaa2_switch_build_linear_skb (ethsw, fd, vaddr);if (unlikely (!skb)) goto err_free_fd;
@@ -2519,7 +2519,8 @@ static void dpaa2_switch_rx(struct dpaa2_switch_fq *fq, err =__skb_vlan_pop (skb, &vlan_tci);if (err) {dev_info (ethsw->dev,"__skb_vlan_pop() returned %d" , err); - goto err_free_fd; +kfree_skb (skb); +return ; } }
@@ -2534,7 +2535,7 @@ static void dpaa2_switch_rx(struct dpaa2_switch_fq *fq,return ; err_free_fd: -dpaa2_switch_free_fd (ethsw, fd); +free_pages ((unsigned long )vaddr,0 ); }static void dpaa2_switch_detect_features (struct ethsw_core *ethsw)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 299/1250 net: dsa: sja1105: flower: reject cross-chip redirect
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Yang <[email protected]>
[ Upstream commit cfa5274a5dc2a23b957da5dc806d2ac0c7a66af0 ]
dsa_port_from_netdev() may return a valid port from a different switch chip. Programming another chip's port index into the local hardware causes redirection to the wrong port, or an out-of-bounds access if the index exceeds the local chip's port count.
Apply a minimal fix that adds a check to catch this case and adjusts the extack message. When cls->common.skip_sw is not set, the operation could instead redirect to the upstream port and let the software or upstream switch(es) handle the forward, but that is not addressed here.
--- drivers/net/dsa/sja1105/sja1105_flower.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/dsa/sja1105/sja1105_flower.c +2 -2
@@ -391,9 +391,9 @@ int sja1105_cls_flower_add(struct dsa_switch *ds, int port,struct dsa_port *to_dp; to_dp =dsa_port_from_netdev (act->dev); -if (IS_ERR (to_dp)) { +if (IS_ERR (to_dp) || to_dp->ds != ds) {NL_SET_ERR_MSG_MOD (extack, -"Destination not a switch port" ); +"Destination not a local switch port" );return -EOPNOTSUPP ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 300/1250 dpaa2-switch: fix handling of NAPI on the remove path
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ioana Ciornei <[email protected]>
[ Upstream commit e23d7c8c1d4ba435c457d7ffb2669175ec819b07 ]
All the NAPI instances for a DPSW device are attached to the first switch port's net_device but shared by all ports. The NAPI instances get disabled only once the last port goes down.
This causes an issue on the .remove() path where each port is unregistered and freed one at a time, causing the NAPI instances to be deleted even though they are not disabled.
In order to avoid this, split up the unregister_netdev() calls from the free_netdev() so that we make sure all ports go down before we attempt a deletion of NAPI instances. Also, make the netif_napi_del() explicit as it is on the .probe() path.
--- .../net/ethernet/freescale/dpaa2/dpaa2-switch.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +10 -5
@@ -3307,7 +3307,6 @@ static void dpaa2_switch_teardown(struct fsl_mc_device *sw_dev)static void dpaa2_switch_remove (struct fsl_mc_device *sw_dev) { -struct ethsw_port_priv *port_priv;struct ethsw_core *ethsw;struct device *dev;int i;
@@ -3319,11 +3318,17 @@ static void dpaa2_switch_remove(struct fsl_mc_device *sw_dev)dpsw_disable (ethsw->mc_io,0 , ethsw->dpsw_handle); -for (i =0 ; i < ethsw->sw_attr.num_ifs; i++) { - port_priv = ethsw->ports[i]; -unregister_netdev (port_priv->netdev); +/* Unregister all the netdevs so that they are brought down and the +* shared NAPI instances gets disabled. +*/ +for (i =0 ; i < ethsw->sw_attr.num_ifs; i++) +unregister_netdev (ethsw->ports[i]->netdev); + +for (i =0 ; i <DPAA2_SWITCH_RX_NUM_FQS ; i++) +netif_napi_del (ðsw->fq[i].napi); + +for (i =0 ; i < ethsw->sw_attr.num_ifs; i++)dpaa2_switch_remove_port (ethsw, i); - }kfree (ethsw->fdbs);kfree (ethsw->filter_blocks);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 301/1250 wifi: rtw89: 8851bu: add Mercusys MA60XNB (2c4e:0128)
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ping-Ke Shih <[email protected]>
[ Upstream commit 575e6a72bd68008b6795345113d3e94f3dccbf5d ]
Add the specific USB device ID which adapter tested fully functional on Fedora 44 with kernel 7.0.8-200.fc44.x86_64 and linux-firmware 20260410-1.fc44.
--- drivers/net/wireless/realtek/rtw89/rtw8851bu.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/realtek/rtw89/rtw8851bu.c +3 -0
@@ -19,6 +19,9 @@ static const struct usb_device_id rtw_8851bu_id_table[] = {/* D-Link AX9U rev. A1 */ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x332a, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t)&rtw89_8851bu_info }, +/* Mercusys MA60XNB */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2C4E, 0x0128, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&rtw89_8851bu_info },/* TP-Link Archer TX10UB Nano */ { USB_DEVICE_AND_INTERFACE_INFO(0x3625, 0x010b, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t)&rtw89_8851bu_info },
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 302/1250 thermal/drivers/qcom/tsens: Atomic temperature read with hardware-guided retries
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Priyansh Jain <[email protected]>
[ Upstream commit e28ef2f3ccea276436bd0f30c93f99e764ba492b ]
The existing TSENS temperature read logic polls the valid bit and then reads the temperature register. When temperature reads are triggered at very short intervals, this can race with hardware updates and allow the temperature field to be read while it is still being updated.
In this case, the valid bit may already be asserted even though the temperature value is transitioning, resulting in an incorrect reading.
Hardware programming guidelines require the temperature value and the valid bit to be sampled atomically in the same read transaction. A reading is considered valid only if the valid bit is observed set in that same sample.
The guidelines further specify that software should attempt the temperature read up to three times to account for transient update windows. If none of the attempts yields a valid sample, a stable fallback value must be returned: if the first and second samples match, the second value is returned;otherwise, if the second and third samples match, the third value is returned;if neither pair matches, -EAGAIN is returned.
Update the TSENS sensor read logic to implement atomic sampling along with the recommended retry-and-compare fallback behavior. This removes the race window and ensures deterministic temperature values in accordance with hardware requirements.
--- drivers/thermal/qcom/tsens.c | 111 ++++++++++++++++++++++++----------- drivers/thermal/qcom/tsens.h | 1 + 2 files changed, 78 insertions(+), 34 deletions(-)
drivers/thermal/qcom/tsens.c +77 -34
@@ -316,9 +316,66 @@ static inline int code_to_degc(u32 adc_code, const struct tsens_sensor *s) }/** -* tsens_hw_to_mC - Return sign-extended temperature in mCelsius. +* tsens_read_temp - Retrieve temperature readings from the hardware. * @s: Pointer to sensor struct * @field: Index into regmap_field array pointing to temperature data +* @temp: temperature in deciCelsius to be read from hardware +* +* This function handles temperature returned in ADC code or deciCelsius +* depending on IP version. +* +* Return: 0 on success, a negative errno will be returned in error cases +*/ +static int tsens_read_temp (const struct tsens_sensor *s,int field,int *temp) +{ +struct tsens_priv *priv = s->priv; +int temp_val[MAX_READ_RETRY ] = {0 }; +u32 status; +int ret; +u32 last_temp_mask =GENMASK (priv->fields[LAST_TEMP_0 ].msb, + priv->fields[LAST_TEMP_0 ].lsb); +u32 valid_bit = priv->rf[VALID_0 ] ?BIT (priv->fields[VALID_0 ].lsb) :0 ; + +for (int i =0 ; i <MAX_READ_RETRY ; i++) { + ret =regmap_read (priv->tm_map, priv->fields[field].reg, &status); +if (ret) +return ret; + +/* VER_0 doesn't have a VALID bit */ +if (!valid_bit) { + *temp = status & last_temp_mask; +return 0 ; + } + + temp_val[i] = status & last_temp_mask; + +if (status & valid_bit) { + *temp = temp_val[i]; +return 0 ; + } + } + +/* +* As per the HW guidelines, if none of the attempts observe a +* valid sample, a stable fallback value must be returned. If the +* first and second samples match, the second value is returned; +* otherwise, if the second and third samples match, the third +* value is returned. +*/ +if (temp_val[0 ] == temp_val[1 ]) + *temp = temp_val[1 ]; +else if (temp_val[1 ] == temp_val[2 ]) + *temp = temp_val[2 ]; +else +return -EAGAIN ; + +return 0 ; +} + +/** +* tsens_hw_to_mC - Return sign-extended temperature in mCelsius. +* @s: Pointer to sensor struct +* @temp: temperature in milliCelsius to be read from hardware * * This function handles temperature returned in ADC code or deciCelsius * depending on IP version.
@@ -326,20 +383,14 @@ static inline int code_to_degc(u32 adc_code, const struct tsens_sensor *s)* Return: Temperature in milliCelsius on success, a negative errno will * be returned in error cases */ -static int tsens_hw_to_mC (const struct tsens_sensor *s,int field) +static int tsens_hw_to_mC (const struct tsens_sensor *s,int temp) {struct tsens_priv *priv = s->priv;u32 resolution; -u32 temp =0 ; -int ret; resolution = priv->fields[LAST_TEMP_0 ].msb - priv->fields[LAST_TEMP_0 ].lsb; - ret =regmap_field_read (priv->rf[field], &temp); -if (ret) -return ret; -/* Convert temperature from ADC code to milliCelsius */ if (priv->feat->adc)return code_to_degc (temp, s) *1000 ;
@@ -514,8 +565,10 @@ static int tsens_read_irq_state(struct tsens_priv *priv, u32 hw_id, &d->crit_irq_mask);if (ret)return ret; - - d->crit_thresh =tsens_hw_to_mC (s,CRIT_THRESH_0 + hw_id); + ret =regmap_field_read (priv->rf[CRIT_THRESH_0 + hw_id], &d->crit_thresh); +if (ret) +return ret; + d->crit_thresh =tsens_hw_to_mC (s, d->crit_thresh); }else {/* No mask register on older TSENS */ d->up_irq_mask =0 ;
@@ -525,8 +578,16 @@ static int tsens_read_irq_state(struct tsens_priv *priv, u32 hw_id, d->crit_thresh =0 ; } - d->up_thresh =tsens_hw_to_mC (s,UP_THRESH_0 + hw_id); - d->low_thresh =tsens_hw_to_mC (s,LOW_THRESH_0 + hw_id); + ret =regmap_field_read (priv->rf[UP_THRESH_0 + hw_id], &d->up_thresh); +if (ret) +return ret; + + d->up_thresh =tsens_hw_to_mC (s, d->up_thresh); + ret =regmap_field_read (priv->rf[LOW_THRESH_0 + hw_id], &d->low_thresh); +if (ret) +return ret; + + d->low_thresh =tsens_hw_to_mC (s, d->low_thresh); dev_dbg(priv->dev, "[%u] %s%s: status(%u|%u|%u) | clr(%u|%u|%u) | mask(%u|%u|%u)\n", hw_id, __func__,
@@ -750,33 +811,15 @@ static void tsens_disable_irq(struct tsens_priv *priv)int get_temp_tsens_valid (const struct tsens_sensor *s,int *temp) { -struct tsens_priv *priv = s->priv;int hw_id = s->hw_id;u32 temp_idx =LAST_TEMP_0 + hw_id; -u32 valid_idx =VALID_0 + hw_id; -u32 valid;int ret; -/* VER_0 doesn't have VALID bit */ -if (tsens_version (priv) ==VER_0 ) - goto get_temp; - -/* Valid bit is 0 for 6 AHB clock cycles. -* At 19.2MHz, 1 AHB clock is ~60ns. -* We should enter this loop very, very rarely. -* Wait 1 us since it's the min of poll_timeout macro. -* Old value was 400 ns. -*/ - ret =regmap_field_read_poll_timeout (priv->rf[valid_idx], valid, - valid,1 ,20 *USEC_PER_MSEC ); -if (ret) -return ret; - -get_temp: -/* Valid bit is set, OK to read the temperature */ - *temp =tsens_hw_to_mC (s, temp_idx); + ret =tsens_read_temp (s, temp_idx, temp); +if (!ret) + *temp =tsens_hw_to_mC (s, *temp); -return 0 ; +return ret; }int get_temp_common (const struct tsens_sensor *s,int *temp)
drivers/thermal/qcom/tsens.h +1 -0
@@ -21,6 +21,7 @@#define THRESHOLD_MIN_ADC_CODE 0x0#define MAX_SENSORS 16 +#define MAX_READ_RETRY 3#include <linux/interrupt.h> #include <linux/thermal.h>
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 303/1250 nvme: validate FDP configuration descriptor sizes
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: liuxixin <[email protected]>
[ Upstream commit 0ef4daa6534a510d61ea67c8ad9bb5097b0dd5f8 ]
Validate descriptor sizes while walking the FDP configurations log so dsze == 0 or a descriptor past the log end cannot cause unbounded iteration or reads past the buffer.
--- drivers/nvme/host/core.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/nvme/host/core.c +6 -4
@@ -2240,14 +2240,16 @@ static int nvme_query_fdp_granularity(struct nvme_ctrl *ctrl, desc = log; end = log + size -sizeof (*h);for (i =0 ; i < fdp_idx; i++) { - log +=le16_to_cpu (desc->dsze); - desc = log; -if (log >= end) { +u16 dsze =le16_to_cpu (desc->dsze); + +if (!dsze || log + dsze > end) {dev_warn (ctrl->device, -"FDP invalid config descriptor list\n" ); +"FDP invalid config descriptor at index %d\n" , i); ret =0 ; goto out; } + log += dsze; + desc = log; }if (le32_to_cpu (desc->nrg) >1 ) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 304/1250 wifi: mac80211: clarify beacon parsing with MBSSID/EMA
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 32e223198539bd8be5a84764df869f88bc56f25b ]
When connected to a non-transmitting BSS of multiple BSSID set with EMA, the correct profile for the connection isn't always present in the beacon. Indicate this in the parser and use the information to not check everything in beacon processing, since the information might not be correct if taken only from the transmitted BSS.
--- net/mac80211/ieee80211_i.h | 9 +++++ net/mac80211/mlme.c | 83 ++++++++++++++++++++++++++++---------- net/mac80211/parse.c | 4 ++ 3 files changed, 75 insertions(+), 21 deletions(-)
net/mac80211/ieee80211_i.h +9 -0
@@ -1864,6 +1864,15 @@ struct ieee802_11_elems {struct ieee80211_mle_per_sta_profile *prof;size_t sta_prof_len; +/* +* When parsing the beacon with MBSSID (from a transmitted BSS), this +* indicates that the profile the parser was instructed to look for +* (via the bss value in &struct ieee80211_elems_parse_params) couldn't +* be found (due to EMA, or perhaps broken AP) and the result cannot be +* considered complete. +*/ +bool mbssid_nontx_profile_missing; +/* whether/which parse error occurred while retrieving these elements */ u8 parse_error; };
net/mac80211/mlme.c +62 -21
128 lines not on this page · raw message
net/mac80211/parse.c +4 -0
@@ -1032,6 +1032,10 @@ ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params) sub.action = params->action; sub.link_id = params->link_id; +/* indicate to consumer whether or not profile was found */ +if (params->bss->transmitted_bss && !nontx_len) + elems->mbssid_nontx_profile_missing = true; +/* consume the space used for non-transmitted profile */ elems_parse->scratch_pos += nontx_len;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 305/1250 wifi: mac80211: unify link STA removal in vif link removal
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 79fb99e16f60a77cbd2824695d98aa34ebbb9d69 ]
There are multiple cases where interface links are removed and the station links need to be removed with them, e.g. in mlme.c we have both received and transmitted multi-link reconfiguration, doing the two things in different order, the former deleting STA links when the vif link change may still fail.
It's also not clear that userspace (hostapd) couldn't, at least in theory, remove a link from an interface without removing the station links first, or even leave stations that aren't MLO-capable, using that link.
Unify this code into ieee80211_vif_update_links() so that it always happens, always happens in the right order and is transactional (i.e. failures are handled correctly.)
--- net/mac80211/link.c | 30 ++++++++++++++++++++++++++++++ net/mac80211/mlme.c | 8 -------- 2 files changed, 30 insertions(+), 8 deletions(-)
net/mac80211/link.c +30 -0
@@ -280,6 +280,7 @@ static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata,u16 old_active = sdata->vif.active_links;unsigned long add = new_links & ~old_links;unsigned long rem = old_links & ~new_links; +unsigned long sta_rem = rem;unsigned int link_id;int ret;struct link_container *links[IEEE80211_MLD_MAX_NUM_LINKS ] = {}, *link;
@@ -287,6 +288,7 @@ static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata,struct ieee80211_link_data *old_data[IEEE80211_MLD_MAX_NUM_LINKS ];bool use_deflink = old_links ==0 ;/* set for error case */ bool non_sta = sdata->vif.type !=NL80211_IFTYPE_STATION ; +struct sta_info *sta;lockdep_assert_wiphy (sdata->local->hw.wiphy);
@@ -392,6 +394,34 @@ static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata, goto free; } +/* try to remove links that are now invalid from (MLO) stations */ +list_for_each_entry (sta, &sdata->local->sta_list, list) { +unsigned long rem_links = sta->sta.valid_links & sta_rem; + +if (sta->sdata != sdata) +continue ; + +/* +* skip stations that would have no links left, +* those will be removed completely later +*/ +if (sta->sta.valid_links == rem_links) +continue ; + +for_each_set_bit (link_id, &rem_links, +IEEE80211_MLD_MAX_NUM_LINKS ) +ieee80211_sta_remove_link (sta, link_id); + } + +/* +* Remove stations using any removed links. Note that due +* to the above station link removal, this only removes +* stations that were skipped above because they'd have no +* links left after link removal. +*/ +for_each_set_bit (link_id, &sta_rem,IEEE80211_MLD_MAX_NUM_LINKS ) +sta_info_flush (sdata, link_id); +/* use deflink/bss_conf again if and only if there are no more links */ use_deflink = new_links ==0 ;
net/mac80211/mlme.c +0 -8
@@ -10906,14 +10906,6 @@ int ieee80211_mgd_assoc_ml_reconf(struct ieee80211_sub_if_data *sdata, goto err_free; } -for (link_id =0 ; link_id <IEEE80211_MLD_MAX_NUM_LINKS ; - link_id++) { -if (!(req->rem_links &BIT (link_id))) -continue ; - -ieee80211_sta_remove_link (sta, link_id); - } -/* notify the driver and upper layers */ ieee80211_vif_cfg_change_notify (sdata,BSS_CHANGED_MLD_VALID_LINKS );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 306/1250 wifi: cfg80211: harden cfg80211_defragment_element()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit e48223525a54d3a3182d2d9a497dca022b942b4d ]
A previous commit changed mac80211 to no longer make wrong calls to cfg80211_defragment_element() with the element pointing outside of the buffer. Additionally, harden this function itself against that and always return -EINVAL in case the element isn't inside the source buffer.
--- net/wireless/scan.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/wireless/scan.c +4 -2
@@ -5,7 +5,7 @@* Copyright 2008 Johannes Berg <[email protected]> * Copyright 2013-2014 Intel Mobile Communications GmbH * Copyright 2016 Intel Deutschland GmbH -* Copyright (C) 2018-2025 Intel Corporation +* Copyright (C) 2018-2026 Intel Corporation */ #include <linux/kernel.h> #include <linux/slab.h>
@@ -2626,7 +2626,9 @@ ssize_t cfg80211_defragment_element(const struct element *elem, const u8 *ies,ssize_t copied;u8 elem_datalen; -if (!elem) +if (!elem || (const u8 *)elem < ies || + (const u8 *)elem +sizeof (*elem) > ies + ieslen || + (const u8 *)elem +sizeof (*elem) + elem->datalen > ies + ieslen)return -EINVAL ;/* elem might be invalid after the memmove */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 307/1250 wifi: iwlwifi: mld: dont WARN on WoWLAN suspend w/o netdetect
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 301b0dfa9db3f1e204de95e803bbd88fbd878c7c ]
Clearly, from a user perspective, it must be valid to configure WoWLAN and then suspend while not connected to a network. Since mac80211 doesn't distinguish these cases and simply calls the driver to suspend whenever WoWLAN is configured, the driver has to cleanly handle the case where it's called for WoWLAN, it's not connected but there's also no netdetect configured.
Remove the WARN_ON() and keep returning 1 to disconnect and then suspend.
--- drivers/net/wireless/intel/iwlwifi/mld/d3.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/wireless/intel/iwlwifi/mld/d3.c +5 -2
@@ -1943,8 +1943,11 @@ int iwl_mld_wowlan_suspend(struct iwl_mld *mld, struct cfg80211_wowlan *wowlan)if (!bss_vif->cfg.assoc) {int ret; -/* If we're not associated, this must be netdetect */ -if (WARN_ON (!wowlan->nd_config)) +/* +* If not associated we can only do netdetect, if +* that's not enabled then just suspend normally. +*/ +if (!wowlan->nd_config)return 1 ; ret =iwl_mld_netdetect_config (mld, bss_vif, wowlan);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 308/1250 wifi: iwlwifi: mvm: fix P2P-Device binding handling
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit b74e377cad9271950c57472867c469e4b5b2ff0c ]
Our binding handling for P2P-Device can run into the following scenario, as observed by our testing:
- a station interface is connected on some channel
- the P2P-Device does a remain-on-channel (ROC) on that channel
- the ROC ends, and the P2P-Device is removed from the binding, but the phy_ctxt pointer is left around as a PHY cache so we don't need to recalibrate to the channel again and again in case it's not shared
- a binding update by the station interface, even a removal, will re-add the P2P-Device to the binding
- the P2P-Device is removed, which removes the PHY context, but it's still in the binding so the firmware crashes
Since the P2P device is removed from the binding and only re- added by unrelated code, but we want to keep the phy_ctxt around as a cache for future ROC usage, fix it by adding a boolean that indicates whether or not the P2P-Device should be added to the binding, and handle that in the binding iterator. That way, the station interface cannot re-add the P2P-Device to the binding when that isn't active.
--- drivers/net/wireless/intel/iwlwifi/mvm/binding.c | 5 ++++- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 12 +++++++++++- drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 3 +++ drivers/net/wireless/intel/iwlwifi/mvm/time-event.c | 3 ++- 4 files changed, 20 insertions(+), 3 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/binding.c +4 -1
@@ -2,7 +2,7 @@/* * Copyright (C) 2012-2014, 2020 Intel Corporation * Copyright (C) 2016 Intel Deutschland GmbH -* Copyright (C) 2022, 2024 Intel Corporation +* Copyright (C) 2022, 2024, 2026 Intel Corporation */ #include <net/mac80211.h> #include "fw-api.h"
@@ -76,6 +76,9 @@ static void iwl_mvm_iface_iterator(void *_data, u8 *mac,if (vif == data->ignore_vif)return ; +if (vif->type ==NL80211_IFTYPE_P2P_DEVICE && !mvmvif->p2p_in_binding) +return ; +if (mvmvif->deflink.phy_ctxt != data->phyctxt)return ;
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +11 -1
@@ -1104,6 +1104,7 @@ static void iwl_mvm_cleanup_iterator(void *data, u8 *mac,spin_unlock_bh (&mvm->time_event_lock); mvmvif->roc_activity =ROC_NUM_ACTIVITIES ; + mvmvif->p2p_in_binding = false; mvmvif->bf_enabled = false; mvmvif->ba_enabled = false;
@@ -4681,6 +4682,7 @@ static int iwl_mvm_add_aux_sta_for_hs20(struct iwl_mvm *mvm, u32 lmac_id)static int iwl_mvm_roc_link (struct iwl_mvm *mvm,struct ieee80211_vif *vif) { +struct iwl_mvm_vif *mvmvif =iwl_mvm_vif_from_mac80211 (vif);int ret;lockdep_assert_held (&mvm->mutex);
@@ -4689,10 +4691,18 @@ static int iwl_mvm_roc_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif)if (WARN (ret,"Failed binding P2P_DEVICE\n" ))return ret; + mvmvif->p2p_in_binding = true; +/* The station and queue allocation must be done only after the binding * is done, as otherwise the FW might incorrectly configure its state. */ -return iwl_mvm_add_p2p_bcast_sta (mvm, vif); + ret =iwl_mvm_add_p2p_bcast_sta (mvm, vif); +if (ret) { +iwl_mvm_binding_remove_vif (mvm, vif); + mvmvif->p2p_in_binding = false; + } + +return ret; } static int iwl_mvm_roc(struct ieee80211_hw *hw,
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +3 -0
@@ -390,6 +390,8 @@ struct iwl_mvm_vif_link_info {* and in eSR mode. Valid only for a STA. * @roc_activity: currently running ROC activity for this vif (or * ROC_NUM_ACTIVITIES if no activity is running). +* @p2p_in_binding: indicates that this P2P-Device interface should be +* added to the binding, i.e. is running ROC right now * @session_prot_connection_loss: the connection was lost due to session * protection ending without receiving a beacon, so we need to now * protect the deauth separately
@@ -500,6 +502,7 @@ struct iwl_mvm_vif {struct iwl_mvm_time_event_data time_event_data;struct iwl_mvm_time_event_data hs_time_event_data;enum iwl_roc_activity roc_activity; +bool p2p_in_binding;/* TCP Checksum Offload */ netdev_features_t features;
drivers/net/wireless/intel/iwlwifi/mvm/time-event.c +2 -1
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* -* Copyright (C) 2012-2014, 2018-2025 Intel Corporation +* Copyright (C) 2012-2014, 2018-2026 Intel Corporation * Copyright (C) 2013-2015 Intel Mobile Communications GmbH * Copyright (C) 2017 Intel Deutschland GmbH */
@@ -89,6 +89,7 @@ static void iwl_mvm_cleanup_roc(struct iwl_mvm *mvm) }else {iwl_mvm_rm_p2p_bcast_sta (mvm, vif);iwl_mvm_binding_remove_vif (mvm, vif); + mvmvif->p2p_in_binding = false; }/* Do not remove the PHY context as removing and adding
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 309/1250 wifi: iwlwifi: add support for AX231
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
[ Upstream commit 1821c068aa5ea852970b5c9ca05b21681f5d8e83 ]
AX231 is a device that is based on AX211 that doesn't support 6E and its bandwidth is limited to 80 MHz.
Just reuse the radio config from AX203 which has the exact same characteristics.
It has a specific subdevice ID to allow the driver to differentiate between AX211 and AX231.
--- drivers/net/wireless/intel/iwlwifi/cfg/rf-gf.c | 3 ++- drivers/net/wireless/intel/iwlwifi/iwl-config.h | 4 +++- drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-)
drivers/net/wireless/intel/iwlwifi/cfg/rf-gf.c +2 -1
@@ -1,7 +1,7 @@// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* * Copyright (C) 2015-2017 Intel Deutschland GmbH -* Copyright (C) 2018-2025 Intel Corporation +* Copyright (C) 2018-2026 Intel Corporation */ #include "iwl-config.h"
@@ -71,6 +71,7 @@ const char iwl_ax411_killer_1690i_name[] =const char iwl_ax210_name[] ="Intel(R) Wi-Fi 6E AX210 160MHz" ;const char iwl_ax211_name[] ="Intel(R) Wi-Fi 6E AX211 160MHz" ; +const char iwl_ax231_name[] ="Intel(R) Wi-Fi 6 AX231" ;const char iwl_ax411_name[] ="Intel(R) Wi-Fi 6E AX411 160MHz" ;IWL_FW_AND_PNVM (IWL_SO_A_GF_A_FW_PRE ,IWL_GF_UCODE_API_MAX );
drivers/net/wireless/intel/iwlwifi/iwl-config.h +3 -1
@@ -2,7 +2,7 @@/* * Copyright (C) 2005-2014, 2018-2021 Intel Corporation * Copyright (C) 2016-2017 Intel Deutschland GmbH -* Copyright (C) 2018-2025 Intel Corporation +* Copyright (C) 2018-2026 Intel Corporation */ #ifndef __IWL_CONFIG_H__#define __IWL_CONFIG_H__
@@ -670,6 +670,7 @@ extern const char iwl_ax411_killer_1690s_name[];extern const char iwl_ax411_killer_1690i_name[];extern const char iwl_ax210_name[];extern const char iwl_ax211_name[]; +extern const char iwl_ax231_name[];extern const char iwl_ax411_name[];extern const char iwl_killer_be1750s_name[];extern const char iwl_killer_be1750i_name[];
@@ -739,6 +740,7 @@ extern const struct iwl_rf_cfg iwl_rf_hr;extern const struct iwl_rf_cfg iwl_rf_hr_80mhz;extern const struct iwl_rf_cfg iwl_rf_gf; +#define iwl_rf_ot iwl_rf_hr_80mhz#endif /* CONFIG_IWLMVM */ #if IS_ENABLED (CONFIG_IWLMLD )
drivers/net/wireless/intel/iwlwifi/pcie/drv.c +2 -1
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* -* Copyright (C) 2005-2014, 2018-2025 Intel Corporation +* Copyright (C) 2005-2014, 2018-2026 Intel Corporation * Copyright (C) 2013-2015 Intel Mobile Communications GmbH * Copyright (C) 2016-2017 Intel Deutschland GmbH */
@@ -1016,6 +1016,7 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {/* GF RF */ IWL_DEV_INFO (iwl_rf_gf, iwl_ax211_name,RF_TYPE (GF )), +IWL_DEV_INFO (iwl_rf_ot, iwl_ax231_name,RF_TYPE (GF ),SUBDEV (0x0294 )),IWL_DEV_INFO (iwl_rf_gf, iwl_ax411_name,RF_TYPE (GF ),CDB ), IWL_DEV_INFO(iwl_rf_gf, iwl_ax210_name, DEVICE(0x2725)),
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 310/1250 usb: xhci: Improve Soft Retries after short transfers
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Pecio <[email protected]>
[ Upstream commit e765ab012f73717238c95ab9c34bfc3c767fa48c ]
A short transfer is a successful one, so reset the error count. Otherwise, endpoints which always complete short are limited to three retries per endpoint life rather than per URB.
--- drivers/usb/host/xhci-ring.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/host/xhci-ring.c +1 -0
@@ -2584,6 +2584,7 @@ static void process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_virt_ep *ep, td->status =0 ;break ;case COMP_SHORT_PACKET : + ep->err_count =0 ; td->status =0 ;break ;case COMP_STOPPED_SHORT_PACKET :
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 311/1250 usb: xhci: remove legacy num_trbs_free tracking
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Neronin <[email protected]>
[ Upstream commit 7ee645963075651d72f8d85bee428a9b7f1f148c ]
Keeping track of free TRBs in a ring by adding and subtracting each time a enqueue or dequeue pointer is modified has proven to be buggy and complicated, especially over long periods of time.
The xhci driver has already moved to calculating free TRBs dynamically based on ring size and the enqueue/dequeue positions.
The DbC path is the last user of 'num_trbs_free'. Rather than maintaining two separate accounting mechanisms, remove the field entirely and switch DbC to use xhci_num_trbs_free(). Since 'num_trbs_free' undercounts by one, and xhci_num_trbs_free() does not, the check for sufficient free TRBs is adjusted.
--- drivers/usb/host/xhci-dbgcap.c | 5 +---- drivers/usb/host/xhci-mem.c | 6 ------ drivers/usb/host/xhci-ring.c | 2 +- drivers/usb/host/xhci.h | 2 +- 4 files changed, 3 insertions(+), 12 deletions(-)
drivers/usb/host/xhci-dbgcap.c +1 -4
@@ -260,7 +260,6 @@ xhci_dbc_queue_trb(struct xhci_ring *ring, u32 field1,trace_xhci_dbc_gadget_ep_queue (ring, &trb->generic,xhci_trb_virt_to_dma (ring->enq_seg, ring->enqueue)); - ring->num_trbs_free--; next = ++(ring->enqueue);if (TRB_TYPE_LINK_LE32 (next->link.control)) { next->link.control ^=cpu_to_le32 (TRB_CYCLE );
@@ -281,7 +280,7 @@ static int xhci_dbc_queue_bulk_tx(struct dbc_ep *dep, num_trbs =count_trbs (req->dma, req->length);WARN_ON (num_trbs !=1 ); -if (ring->num_trbs_free < num_trbs) +if (xhci_num_trbs_free (ring) <= num_trbs)return -EBUSY ; addr = req->dma;
@@ -782,7 +781,6 @@ static void dbc_handle_xfer_event(struct xhci_dbc *dbc, union xhci_trb *event) }if (r->status == -COMP_STALL_ERROR ) {dev_warn (dbc->dev,"Give back stale stalled req\n" ); - ring->num_trbs_free++;xhci_dbc_giveback (r,0 ); } }
@@ -847,7 +845,6 @@ static void dbc_handle_xfer_event(struct xhci_dbc *dbc, union xhci_trb *event)break ; } - ring->num_trbs_free++; req->actual = req->length - remain_length;xhci_dbc_giveback (req, status); }
drivers/usb/host/xhci-mem.c +0 -6
@@ -317,12 +317,6 @@ void xhci_initialize_ring_info(struct xhci_ring *ring)* handling ring expansion, set the cycle state equal to the old ring. */ ring->cycle_state =1 ; - -/* -* Each segment has a link TRB, and leave an extra TRB for SW -* accounting purpose -*/ - ring->num_trbs_free = ring->num_segs * (TRBS_PER_SEGMENT -1 ) -1 ; }EXPORT_SYMBOL_GPL (xhci_initialize_ring_info);
drivers/usb/host/xhci-ring.c +1 -1
@@ -339,7 +339,7 @@ static struct xhci_segment *trb_in_td(struct xhci_td *td, dma_addr_t suspect_dma* Only for transfer and command rings where driver is the producer, not for * event rings. */ -static unsigned int xhci_num_trbs_free (struct xhci_ring *ring) +unsigned int xhci_num_trbs_free (struct xhci_ring *ring) {struct xhci_segment *enq_seg = ring->enq_seg;union xhci_trb *enq = ring->enqueue;
drivers/usb/host/xhci.h +1 -1
@@ -1368,7 +1368,6 @@ struct xhci_ring {u32 cycle_state;unsigned int stream_id;unsigned int num_segs; -unsigned int num_trbs_free;/* used only by xhci DbC */ unsigned int bounce_buf_len;enum xhci_ring_type type;u32 old_trb_comp_code;
@@ -1945,6 +1944,7 @@ void xhci_ring_doorbell_for_active_rings(struct xhci_hcd *xhci,void xhci_cleanup_command_queue (struct xhci_hcd *xhci);void inc_deq (struct xhci_hcd *xhci,struct xhci_ring *ring);unsigned int count_trbs (u64 addr,u64 len); +unsigned int xhci_num_trbs_free (struct xhci_ring *ring);int xhci_stop_endpoint_sync (struct xhci_hcd *xhci,struct xhci_virt_ep *ep,int suspend,gfp_t gfp_flags);void xhci_process_cancelled_tds (struct xhci_virt_ep *ep);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 312/1250 drm/amd/display: Avoid DPMS-on for phantom stream
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilya Bakoulin <[email protected]>
[ Upstream commit 10f5f9c0ef32d08b228bfee3684b62f36f395852 ]
[Why & How]
Calling dc_update_planes_and_stream separately for stream and its phantom stream causes a NULL pointer dereference, since the phantom is destroyed on the first call.
Skip the call for phantom streams.
--- drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.c +2 -0
@@ -143,6 +143,8 @@ static void dp_retrain_link_dp_test(struct dc_link *link,// Set DPMS on with stream update // Cache all streams on current link since dc_update_planes_and_stream might kill current_state for (i =0 ; i <MAX_PIPES ; i++) { +if (state->streams[i] && state->streams[i]->is_phantom) +continue ;if (state->streams[i] && state->streams[i]->link && state->streams[i]->link == link) streams_on_link[num_streams_on_link++] = state->streams[i]; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 313/1250 xhci: Prevent queuing new commands if xhci is inaccessible
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
[ Upstream commit 82b70c799281cc24506085be978b829149ba0ca4 ]
Refuse to queue a new command on the command ring if xHC is marked inaccessible with the HCD_FLAG_HW_ACCESSIBLE.
HCD_FLAG_HW_ACCESSIBLE is set and cleared in suspend and resume.
Also print a warning if xhci is being suspended with commands still pending on the command ring.
--- drivers/usb/host/xhci-ring.c | 6 ++++++ drivers/usb/host/xhci.c | 4 ++++ 2 files changed, 10 insertions(+)
drivers/usb/host/xhci-ring.c +6 -0
@@ -4414,6 +4414,7 @@ static int queue_command(struct xhci_hcd *xhci, struct xhci_command *cmd, u32 field3, u32 field4, bool command_must_succeed) { int reserved_trbs = xhci->cmd_ring_reserved_trbs; +struct usb_hcd *hcd =xhci_to_hcd (xhci);int ret; if ((xhci->xhc_state & XHCI_STATE_DYING) ||
@@ -4423,6 +4424,11 @@ static int queue_command(struct xhci_hcd *xhci, struct xhci_command *cmd,return -ESHUTDOWN ; } +if (!HCD_HW_ACCESSIBLE (hcd)) { +xhci_warn (xhci,"Can't queue command, xHC not accessible\n" ); +return -ESHUTDOWN ; + } +if (!command_must_succeed) reserved_trbs++;
drivers/usb/host/xhci.c +4 -0
@@ -1012,6 +1012,10 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup)/* step 1: stop endpoint */ /* skipped assuming that port suspend has done */ +/* Check if command ring is empty */ +if (!list_empty (&xhci->cmd_list)) +xhci_warn (xhci,"Suspending and stopping xHC with pending command!\n" ); +/* step 2: clear Run/Stop bit */ command =readl (&xhci->op_regs->command); command &= ~CMD_RUN ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 314/1250 drm/amd/display: Check for sharpening case when calculating max vtaps for scaler
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Samson Tam <[email protected]>
[ Upstream commit 4d8cfd570386eb0b6cb8aa0ca9e9db60a0404337 ]
[Why & How]
- calc_lb_num_partitions has check when scaler is not enabled to use larger LB in calculations for max vtaps based on viewport being 1:1
- however, scaler is forced on when sharpening is enabled, so need to consider this in check
- taps is predetermined in spl_get_optimal_number_of_taps prior to calc_lb_num_partitions. Add check for taps not 1 to handle sharpening case
--- drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp.c +6 -2
@@ -389,9 +389,11 @@ void dscl401_spl_calc_lb_num_partitions( lb_memory_size_a =1290 ; }else if (lb_config ==LB_MEMORY_CONFIG_3 ) {if (scl_data->viewport.width == scl_data->h_active && - scl_data->viewport.height == scl_data->v_active) { + scl_data->viewport.height == scl_data->v_active && + scl_data->taps.h_taps ==1 && scl_data->taps.v_taps ==1 ) {/* 420 mode: luma using all 3 mem from Y, plus 3rd mem from Cr and Cb */ /* use increased LB size for calculation only if Scaler not enabled */ +/* Scaler is forced on when sharpening is on. Add check for taps = 1 */ lb_memory_size =970 +1290 +1170 +1170 +1170 ; lb_memory_size_c =970 +1290 ; lb_memory_size_a =970 +1290 +1170 ;
@@ -403,8 +405,10 @@ void dscl401_spl_calc_lb_num_partitions( } }else {if (scl_data->viewport.width == scl_data->h_active && - scl_data->viewport.height == scl_data->v_active) { + scl_data->viewport.height == scl_data->v_active && + scl_data->taps.h_taps ==1 && scl_data->taps.v_taps ==1 ) {/* use increased LB size for calculation only if Scaler not enabled */ +/* Scaler is forced on when sharpening is on. Add check for taps = 1 */ lb_memory_size =970 +1290 +1170 ; lb_memory_size_c =970 +1290 +1170 ; lb_memory_size_a =970 +1290 +1170 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 315/1250 drm/amdkfd: fix UAF race in destroy_queue_cpsch
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alysa Liu <[email protected]>
[ Upstream commit ac081deaf16a639ea7dff2f285fe421a33c1ade0 ]
wait_on_destroy_queue() drops locks to wait for queue resume, allowing a concurrent destroy to free the queue. Use is_being_destroyed flag to serialize destruction.
--- drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +7 -1
@@ -2517,6 +2517,9 @@ static int wait_on_destroy_queue(struct device_queue_manager *dqm,if (pdd->qpd.is_debug)return ret; +if (q->properties.is_being_destroyed) +return -EBUSY ; + q->properties.is_being_destroyed = true;if (pdd->process->debug_trap_enabled && q->properties.is_suspended) {
@@ -2529,6 +2532,9 @@ static int wait_on_destroy_queue(struct device_queue_manager *dqm,dqm_lock (dqm); } +if (ret) + q->properties.is_being_destroyed = false; +return ret; }
@@ -2622,7 +2628,7 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm,return retval; failed_try_destroy_debugged_queue: - + q->properties.is_being_destroyed = false;dqm_unlock (dqm);return retval; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 316/1250 drm/amdgpu: harden FRU PIA parsing with bounded helpers
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stanley.Yang <[email protected]>
[ Upstream commit c990c05eb6c74c98d1ff3acf67a19015312820b7 ]
Replace the open-coded TLV walk with fru_pia_advance() and fru_pia_copy_field() helpers that bound every read by the actual EEPROM data length, preventing out-of-bounds reads on truncated or malformed FRU data.
--- .../gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c | 95 ++++++++++++------- 1 file changed, 63 insertions(+), 32 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c +63 -32
@@ -114,6 +114,43 @@ static bool is_fru_eeprom_supported(struct amdgpu_device *adev, u32 *fru_addr) } } +/* +* IPMI FRU Product Info Area fields are TLV: one type/length byte +* (low 6 bits = data length) followed by that many data bytes. These +* helpers walk the cursor and copy a single field while bounding all +* accesses to the actual buffer length read from the EEPROM. +*/ +#define FRU_FIELD_LEN (p, a) ((p)[a] & 0x3F) + +/* Advance cursor past the current TLV. Returns false if no more data. */ +static bool fru_pia_advance (u32 *addr,const unsigned char *pia,int len) +{ +if (*addr >= (u32 )len) +return false; + *addr +=1 +FRU_FIELD_LEN (pia, *addr); +return true; +} + +/* +* Copy the current TLV's data into dst (NUL-terminated). Returns false if +* the TLV header or data would read past the end of pia. +*/ +static bool fru_pia_copy_field (char *dst,size_t dst_size, +const unsigned char *pia,u32 addr,int len) +{ +size_t fl; + +if (addr +1 >= (u32 )len) +return false; + + fl =min3 ((size_t )FRU_FIELD_LEN (pia, addr), + dst_size -1 , + (size_t )(len - addr -1 )); +memcpy (dst, pia + addr +1 , fl); + dst[fl] ='\0' ; +return true; +} +int amdgpu_fru_get_product_info (struct amdgpu_device *adev) {struct amdgpu_fru_info *fru_info;
@@ -222,52 +259,46 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)* Read Manufacturer Name field whose length is [3]. */ addr =3 ; -if (addr +1 >= len) +if (!fru_pia_copy_field (fru_info->manufacturer_name, +sizeof (fru_info->manufacturer_name), + pia, addr, len)) goto Out; -memcpy (fru_info->manufacturer_name, pia + addr +1 , -min_t (size_t,sizeof (fru_info->manufacturer_name), - pia[addr] &0x3F )); - fru_info->manufacturer_name[sizeof (fru_info->manufacturer_name) -1 ] = -'\0' ;/* Read Product Name field. */ - addr +=1 + (pia[addr] &0x3F ); -if (addr +1 >= len) +if (!fru_pia_advance (&addr, pia, len) || + !fru_pia_copy_field (fru_info->product_name, +sizeof (fru_info->product_name), + pia, addr, len)) goto Out; -memcpy (fru_info->product_name, pia + addr +1 , -min_t (size_t,sizeof (fru_info->product_name), pia[addr] &0x3F )); - fru_info->product_name[sizeof (fru_info->product_name) -1 ] ='\0' ;/* Go to the Product Part/Model Number field. */ - addr +=1 + (pia[addr] &0x3F ); -if (addr +1 >= len) +if (!fru_pia_advance (&addr, pia, len) || + !fru_pia_copy_field (fru_info->product_number, +sizeof (fru_info->product_number), + pia, addr, len)) goto Out; -memcpy (fru_info->product_number, pia + addr +1 , -min_t (size_t,sizeof (fru_info->product_number), - pia[addr] &0x3F )); - fru_info->product_number[sizeof (fru_info->product_number) -1 ] ='\0' ; -/* Go to the Product Version field. */ - addr +=1 + (pia[addr] &0x3F ); +/* Skip the Product Version field. */ +if (!fru_pia_advance (&addr, pia, len)) + goto Out; -/* Go to the Product Serial Number field. */ - addr +=1 + (pia[addr] &0x3F ); -if (addr +1 >= len) +/* Read the Product Serial Number field. */ +if (!fru_pia_advance (&addr, pia, len) || + !fru_pia_copy_field (fru_info->serial, +sizeof (fru_info->serial), + pia, addr, len)) goto Out; -memcpy (fru_info->serial, pia + addr +1 , -min_t (size_t,sizeof (fru_info->serial), pia[addr] &0x3F )); - fru_info->serial[sizeof (fru_info->serial) -1 ] ='\0' ; -/* Asset Tag field */ - addr +=1 + (pia[addr] &0x3F ); +/* Skip the Asset Tag field. */ +if (!fru_pia_advance (&addr, pia, len)) + goto Out;/* FRU File Id field. This could be 'null'. */ - addr +=1 + (pia[addr] &0x3F ); -if ((addr +1 >= len) || !(pia[addr] &0x3F )) +if (!fru_pia_advance (&addr, pia, len) || + !fru_pia_copy_field (fru_info->fru_id, +sizeof (fru_info->fru_id), + pia, addr, len)) goto Out; -memcpy (fru_info->fru_id, pia + addr +1 , -min_t (size_t,sizeof (fru_info->fru_id), pia[addr] &0x3F )); - fru_info->fru_id[sizeof (fru_info->fru_id) -1 ] ='\0' ; Out:kfree (pia);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 317/1250 drm/amd/pm: bound pp_dpm_set_pp_table() memcpy
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Asad Kamal <[email protected]>
[ Upstream commit f193e71fa9fab2e68ef85201b106e8f580d3a25b ]
The powerplay path allocates hardcode_pp_table once with kmemdup(..., soft_pp_table_size). memcpy(..., size) used the sysfs store count (up to PAGE_SIZE) with no upper bound, causing heap overflow. Reject writes where size exceeds soft_pp_table_size.
--- drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c +3 -0
@@ -668,6 +668,9 @@ static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size)if (!hwmgr || !hwmgr->pm_en)return -EINVAL ; +if (size > hwmgr->soft_pp_table_size) +return -EINVAL ; +if (!hwmgr->hardcode_pp_table) { hwmgr->hardcode_pp_table = kmemdup(hwmgr->soft_pp_table, hwmgr->soft_pp_table_size,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 318/1250 drm/amdgpu/pm: fix SmartShift bias sysfs store PM refcount on parse error
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Candice Li <[email protected]>
[ Upstream commit a4b0c3f5d2287997876d8f711a40d3c0418458d8 ]
Return the parse error before acquiring PM access.
--- drivers/gpu/drm/amd/pm/amdgpu_pm.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/pm/amdgpu_pm.c +3 -5
@@ -1853,12 +1853,12 @@ static ssize_t amdgpu_set_smartshift_bias(struct device *dev, {struct drm_device *ddev =dev_get_drvdata (dev);struct amdgpu_device *adev =drm_to_adev (ddev); -int r =0 ; +int r;int bias =0 ; r =kstrtoint (buf,10 , &bias);if (r) - goto out; +return r; r =amdgpu_pm_get_access (adev);if (r <0 )
@@ -1870,14 +1870,12 @@ static ssize_t amdgpu_set_smartshift_bias(struct device *dev, bias =AMDGPU_SMARTSHIFT_MIN_BIAS ; amdgpu_smartshift_bias = bias; - r = count;/* TODO: update bias level with SMU message */ -out:amdgpu_pm_put_access (adev); -return r; +return count; } static int ss_power_attr_update(struct amdgpu_device *adev, struct amdgpu_device_attr *attr,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 319/1250 drm/amdgpu: fix buffer overflow during vBIOS update
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shiwu Zhang <[email protected]>
[ Upstream commit 6229898d46c0cbc238a6fe9f11c1ea12cf8bb9c5 ]
Clamp the buffer postion to write by setting the bin attribute to the maximum buffer size so that VFS layer will block the out-of-bounds accessing.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +1 -1
@@ -4296,7 +4296,7 @@ static ssize_t amdgpu_psp_vbflash_read(struct file *filp, struct kobject *kobj,*/ static const struct bin_attribute psp_vbflash_bin_attr = { .attr = {.name ="psp_vbflash" , .mode =0660 }, - .size =0 , + .size =AMD_VBIOS_FILE_MAX_SIZE_B , .write = amdgpu_psp_vbflash_write, .read = amdgpu_psp_vbflash_read, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 320/1250 drm/amdgpu: validate RAS EEPROM tbl_size before record count
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Candice Li <[email protected]>
[ Upstream commit c83e4a45ff9a0b7aa1c48246102009a99ccef11b ]
Corrupt EEPROM data can set tbl_size below the table header size. Guard the RAS_NUM_RECS macros against undersized tbl_size and reset the table during init when tbl_size is below the minimum for the table version instead of trusting the header.
--- .../gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c +21 -5
@@ -142,12 +142,15 @@#define RAS_RI_TO_AI (_C, _I) (((_I) + (_C)->ras_fri) % \ (_C)->ras_max_record_count) -#define RAS_NUM_RECS (_tbl_hdr) (((_tbl_hdr)->tbl_size - \ - RAS_TABLE_HEADER_SIZE) / RAS_TABLE_RECORD_SIZE) +#define RAS_NUM_RECS (_tbl_hdr) \ + (((_tbl_hdr)->tbl_size < RAS_TABLE_HEADER_SIZE) ? 0u : \ + (((_tbl_hdr)->tbl_size - RAS_TABLE_HEADER_SIZE) / RAS_TABLE_RECORD_SIZE)) -#define RAS_NUM_RECS_V2_1 (_tbl_hdr) (((_tbl_hdr)->tbl_size - \ - RAS_TABLE_HEADER_SIZE - \ - RAS_TABLE_V2_1_INFO_SIZE) / RAS_TABLE_RECORD_SIZE) +#define RAS_NUM_RECS_V2_1 (_tbl_hdr) \ + (((_tbl_hdr)->tbl_size < RAS_TABLE_HEADER_SIZE + \ + RAS_TABLE_V2_1_INFO_SIZE) ? 0u : \ + (((_tbl_hdr)->tbl_size - RAS_TABLE_HEADER_SIZE - \ + RAS_TABLE_V2_1_INFO_SIZE) / RAS_TABLE_RECORD_SIZE))#define to_amdgpu_device (x) ((container_of(x, struct amdgpu_ras, eeprom_control))->adev)
@@ -1415,11 +1418,24 @@ int amdgpu_ras_eeprom_init(struct amdgpu_ras_eeprom_control *control)switch (hdr->version) {case RAS_TABLE_VER_V2_1 :case RAS_TABLE_VER_V3 : +if (hdr->tbl_size <RAS_TABLE_HEADER_SIZE +RAS_TABLE_V2_1_INFO_SIZE ) { +dev_err (adev->dev, +"RAS header invalid, tbl_size %u smaller than minimum %u, resetting table\n" , + hdr->tbl_size, +RAS_TABLE_HEADER_SIZE +RAS_TABLE_V2_1_INFO_SIZE ); +return amdgpu_ras_eeprom_reset_table (control); + } control->ras_num_recs =RAS_NUM_RECS_V2_1 (hdr); control->ras_record_offset =RAS_RECORD_START_V2_1 ; control->ras_max_record_count =RAS_MAX_RECORD_COUNT_V2_1 ;break ;case RAS_TABLE_VER_V1 : +if (hdr->tbl_size <RAS_TABLE_HEADER_SIZE ) { +dev_err (adev->dev, +"RAS header invalid, tbl_size %u smaller than minimum %u, resetting table\n" , + hdr->tbl_size,RAS_TABLE_HEADER_SIZE ); +return amdgpu_ras_eeprom_reset_table (control); + } control->ras_num_recs =RAS_NUM_RECS (hdr); control->ras_record_offset =RAS_RECORD_START ; control->ras_max_record_count =RAS_MAX_RECORD_COUNT ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 321/1250 net/mlx5e: Verify unique vhca_id count instead of range
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shay Drory <[email protected]>
[ Upstream commit 0b1c4495aa007932e9cbd7b45a8037e7b4fe34b0 ]
Change verify_num_vhca_ids() to count the number of unique vhca_ids and verify this count doesn't exceed max_num_vhca_id, rather than validating individual vhca_id values are within a specific range.
The previous implementation checked if each vhca_id was in the range [0, max_num_vhca_id - 1], which is overly restrictive. The hardware capability max_rqt_vhca_id represents the maximum number of unique vhca_ids that can be used, not a range constraint on individual IDs.
--- .../net/ethernet/mellanox/mlx5/core/en/rqt.c | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/rqt.c +21 -6
@@ -8,13 +8,28 @@ static bool verify_num_vhca_ids(struct mlx5_core_dev *mdev, u32 *vhca_ids, unsigned int size) {unsigned int max_num_vhca_id =MLX5_CAP_GEN_2 (mdev, max_rqt_vhca_id); -int i; +unsigned int unique_count =0 ; +int i, j; + +/* Count unique vhca_ids */ +for (i =0 ; i < size; i++) { +bool is_unique = true; + +/* Check if vhca_ids[i] was already seen */ +for (j =0 ; j < i; j++) { +if (vhca_ids[j] == vhca_ids[i]) { + is_unique = false; +break ; + } + } +if (is_unique) + unique_count++; + } -/* Verify that all vhca_ids are in range [0, max_num_vhca_ids - 1] */ -for (i =0 ; i < size; i++) -if (vhca_ids[i] >= max_num_vhca_id) -return false; -return true; +/* Verify that number of unique vhca_ids doesn't exceed +* max_num_vhca_id +*/ +return unique_count <= max_num_vhca_id; } static bool rqt_verify_vhca_ids(struct mlx5_core_dev *mdev, u32 *vhca_ids,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 322/1250 RDMA/irdma: Fix typo in SQ completions generation
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cyrill Gorcunov <[email protected]>
[ Upstream commit b548a6c4eee5c428663f3944e173e6c92e2e8d6f ]
When we generate completion for SQ the opcode while being properly read from ring buffer is ignored when written back to completion. Seems to be a simple typo.
--- drivers/infiniband/hw/irdma/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/irdma/utils.c +1 -1
@@ -2467,7 +2467,7 @@ void irdma_generate_flush_completions(struct irdma_qp *iwqp) cmpl->cpi.wr_id = qp->sq_wrtrk_array[wqe_idx].wrid; sw_wqe = qp->sq_base[wqe_idx].elem;get_64bit_val (sw_wqe,24 , &wqe_qword); - cmpl->cpi.op_type = (u8 )FIELD_GET (IRDMAQPSQ_OPCODE ,IRDMAQPSQ_OPCODE ); + cmpl->cpi.op_type = (u8 )FIELD_GET (IRDMAQPSQ_OPCODE , wqe_qword); cmpl->cpi.q_type =IRDMA_CQE_QTYPE_SQ ;/* remove the SQ WR by moving SQ tail*/ IRDMA_RING_SET_TAIL(*sq_ring,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 323/1250 drm/amdgpu/ras: add ras_suspend callback and use it for cp_ecc_error_irq
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunxiang Li <[email protected]>
[ Upstream commit e3829992dd9fa0a82511af4f01733fc854cd15a5 ]
cp_ecc_error_irq is acquired in amdgpu_gfx_ras_late_init() but released in gfx_v9_0_hw_fini(), so the put site has to query amdgpu_irq_enabled() because the get is skipped on SR-IOV VF.
ras_late_init / ras_fini have no suspend counterpart, so move the put to amdgpu_gfx_ras_suspend() / amdgpu_gfx_ras_fini() and add a matching ras_suspend callback that is invoked from amdgpu_ras_suspend() before disable_all_features(). The get and put now sit in the same place and check the same condition (not VF, funcs registered), no refcount querying needed.
An active flag gates ras_fini so the suspend-then-unload-without-resume path falls into amdgpu_ras_block_late_fini_default() instead of double-releasing what ras_suspend already cleaned up.
Drop the cp_ecc_error_irq put from gfx_v9_0_hw_fini(). gfx_v8_0 manages cp_ecc_error_irq locally and is unaffected; no other GFX generation has this IRQ.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 26 ++++++++++++++++---- drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h | 3 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 32 +++++++++++++++++++++---- drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | 1 + drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 2 -- 5 files changed, 53 insertions(+), 11 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +22 -4
@@ -934,10 +934,7 @@ int amdgpu_gfx_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *rif (r)return r; -if (amdgpu_sriov_vf (adev)) -return r; - -if (adev->gfx.cp_ecc_error_irq.funcs) { +if (!amdgpu_sriov_vf (adev) && adev->gfx.cp_ecc_error_irq.funcs) { r =amdgpu_irq_get (adev, &adev->gfx.cp_ecc_error_irq,0 );if (r) goto late_fini;
@@ -952,6 +949,21 @@ int amdgpu_gfx_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *rreturn r; } +void amdgpu_gfx_ras_suspend (struct amdgpu_device *adev, +struct ras_common_if *ras_block) +{ +if (!amdgpu_sriov_vf (adev) && adev->gfx.cp_ecc_error_irq.funcs) +amdgpu_irq_put (adev, &adev->gfx.cp_ecc_error_irq,0 ); +} + +void amdgpu_gfx_ras_fini (struct amdgpu_device *adev, +struct ras_common_if *ras_block) +{ +if (!amdgpu_sriov_vf (adev) && adev->gfx.cp_ecc_error_irq.funcs) +amdgpu_irq_put (adev, &adev->gfx.cp_ecc_error_irq,0 ); +amdgpu_ras_block_late_fini (adev, ras_block); +} +int amdgpu_gfx_ras_sw_init (struct amdgpu_device *adev) {int err =0 ;
@@ -980,6 +992,12 @@ int amdgpu_gfx_ras_sw_init(struct amdgpu_device *adev)if (!ras->ras_block.ras_late_init) ras->ras_block.ras_late_init = amdgpu_gfx_ras_late_init; +if (!ras->ras_block.ras_suspend) + ras->ras_block.ras_suspend = amdgpu_gfx_ras_suspend; + +if (!ras->ras_block.ras_fini) + ras->ras_block.ras_fini = amdgpu_gfx_ras_fini; +/* If not defined special ras_cb function, use default ras_cb */ if (!ras->ras_block.ras_cb) ras->ras_block.ras_cb = amdgpu_gfx_process_ras_data_cb;
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h +2 -1
@@ -603,7 +603,8 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable);void amdgpu_gfx_off_ctrl_immediate (struct amdgpu_device *adev,bool enable);int amdgpu_get_gfx_off_status (struct amdgpu_device *adev,uint32_t *value);int amdgpu_gfx_ras_late_init (struct amdgpu_device *adev,struct ras_common_if *ras_block); -void amdgpu_gfx_ras_fini (struct amdgpu_device *adev); +void amdgpu_gfx_ras_suspend (struct amdgpu_device *adev,struct ras_common_if *ras_block); +void amdgpu_gfx_ras_fini (struct amdgpu_device *adev,struct ras_common_if *ras_block);int amdgpu_get_gfx_off_entrycount (struct amdgpu_device *adev,u64 *value);int amdgpu_get_gfx_off_residency (struct amdgpu_device *adev,u32 *residency);int amdgpu_set_gfx_off_residency (struct amdgpu_device *adev,bool value);
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +28 -4
@@ -92,6 +92,9 @@ struct amdgpu_ras_block_list {struct list_head node;struct amdgpu_ras_block_object *ras_obj; + +/* set by ras_late_init, cleared by ras_suspend/ras_fini */ +bool active; };const char *get_ras_block_str (struct ras_common_if *ras_block)
@@ -4392,10 +4395,23 @@ void amdgpu_ras_resume(struct amdgpu_device *adev)void amdgpu_ras_suspend (struct amdgpu_device *adev) {struct amdgpu_ras *con =amdgpu_ras_get_context (adev); +struct amdgpu_ras_block_list *node; +struct amdgpu_ras_block_object *obj;if (!adev->ras_enabled || !con)return ; +/* run per-block ras_suspend before tearing down the RAS context */ +list_for_each_entry (node, &adev->ras_list, node) { +if (!node->active) +continue ; + + obj = node->ras_obj; +if (obj && obj->ras_suspend) + obj->ras_suspend (adev, &obj->ras_comm); + node->active = false; + } +amdgpu_ras_disable_all_features (adev,0 );/* Make sure all ras objects are disabled. */ if (AMDGPU_RAS_GET_FEATURES (con->features))
@@ -4449,8 +4465,15 @@ int amdgpu_ras_late_init(struct amdgpu_device *adev) obj->ras_comm.name, r);return r; } - }else -amdgpu_ras_block_late_init_default (adev, &obj->ras_comm); + }else { + r =amdgpu_ras_block_late_init_default (adev, &obj->ras_comm); +if (r) { +dev_err (adev->dev,"%s failed to execute ras_block_late_init_default! ret:%d\n" , + obj->ras_comm.name, r); +return r; + } + } + node->active = true; }return 0 ;
@@ -4487,11 +4510,12 @@ int amdgpu_ras_fini(struct amdgpu_device *adev)list_for_each_entry_safe (ras_node, tmp, &adev->ras_list, node) {if (ras_node->ras_obj) { obj = ras_node->ras_obj; -if (amdgpu_ras_is_supported (adev, obj->ras_comm.block) && - obj->ras_fini) +/* fall back to default cleanup if ras_suspend already ran */ +if (ras_node->active && obj->ras_fini) obj->ras_fini (adev, &obj->ras_comm);else amdgpu_ras_block_late_fini_default (adev, &obj->ras_comm); + ras_node->active = false; }/* Clear ras blocks from ras_list and free ras block list node */
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +1 -0
@@ -731,6 +731,7 @@ struct amdgpu_ras_block_object {int (*ras_block_match)(struct amdgpu_ras_block_object *block_obj,enum amdgpu_ras_block block,uint32_t sub_block_index);int (*ras_late_init)(struct amdgpu_device *adev,struct ras_common_if *ras_block); +void (*ras_suspend)(struct amdgpu_device *adev,struct ras_common_if *ras_block);void (*ras_fini)(struct amdgpu_device *adev,struct ras_common_if *ras_block);ras_ih_cb ras_cb;const struct amdgpu_ras_block_hw_ops *hw_ops;
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +0 -2
@@ -4084,8 +4084,6 @@ static int gfx_v9_0_hw_fini(struct amdgpu_ip_block *ip_block) {struct amdgpu_device *adev = ip_block->adev; -if (amdgpu_ras_is_supported (adev,AMDGPU_RAS_BLOCK__GFX )) -amdgpu_irq_put (adev, &adev->gfx.cp_ecc_error_irq,0 );amdgpu_irq_put (adev, &adev->gfx.priv_reg_irq,0 );amdgpu_irq_put (adev, &adev->gfx.priv_inst_irq,0 );amdgpu_irq_put (adev, &adev->gfx.bad_op_irq,0 );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 324/1250 net/mlx5: E-Switch, align disable sequence with switchdev-to-legacy transition
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shay Drory <[email protected]>
[ Upstream commit b48b6308dfaeae49fcda61b4066773cb5e8a9ce8 ]
This patch align the eswitch disable sequence with the switchdev-to-legacy mode transition, where eswitch must be disabled before device detachment. The consistent ordering is required for proper SD LAG cleanup which depends on eswitch state during teardown.
--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/main.c +2 -1
@@ -1427,7 +1427,6 @@ static int mlx5_load(struct mlx5_core_dev *dev)static void mlx5_unload (struct mlx5_core_dev *dev) { -mlx5_eswitch_disable (dev->priv.eswitch);mlx5_devlink_traps_unregister (priv_to_devlink (dev));mlx5_sf_dev_table_destroy (dev);mlx5_sriov_detach (dev);
@@ -1536,6 +1535,7 @@ void mlx5_uninit_one(struct mlx5_core_dev *dev)mlx5_hwmon_dev_unregister (dev);mlx5_crdump_disable (dev); +mlx5_eswitch_disable (dev->priv.eswitch);mlx5_unregister_device (dev);if (!test_bit (MLX5_INTERFACE_STATE_UP , &dev->intf_state)) {
@@ -1620,6 +1620,7 @@ void mlx5_unload_one_devl_locked(struct mlx5_core_dev *dev, bool suspend)devl_assert_locked (priv_to_devlink (dev));mutex_lock (&dev->intf_state_mutex); +mlx5_eswitch_disable (dev->priv.eswitch);mlx5_detach_device (dev, suspend);if (!test_bit (MLX5_INTERFACE_STATE_UP , &dev->intf_state)) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 325/1250 net: ibm: emac: fix unchecked platform_get_irq return value
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 1681cb1bde051c3b9ebbd337c0bfdd3e74167b2f ]
platform_get_irq() returns a negative errno on failure. Commit a598f66d9169 replaced irq_of_parse_and_map() (which returns 0 on failure) with platform_get_irq() but dropped the error check. Without it, a negative IRQ number is passed to devm_request_irq(), which fails with -EINVAL instead of propagating the real error from platform_get_irq().
Add the missing error check and goto err_gone.
--- drivers/net/ethernet/ibm/emac/core.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/ibm/emac/core.c +5 -0
@@ -3044,6 +3044,11 @@ static int emac_probe(struct platform_device *ofdev)/* Setup error IRQ handler */ dev->emac_irq =platform_get_irq (ofdev,0 ); +if (dev->emac_irq <0 ) { + err = dev->emac_irq; + goto err_gone; + } + err =devm_request_irq (&ofdev->dev, dev->emac_irq, emac_irq,0 ,"EMAC" , dev);if (err) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 326/1250 clk: keystone: dont cache clock rate
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Walle <[email protected]>
[ Upstream commit a80b32a140c8612bbaed27009c383d43304db6d5 ]
The TISCI firmware will return 0 if the clock or consumer is not enabled although there is a stored value in the firmware. IOW a call to set rate will work but at get rate will always return 0 if the clock is disabled.
The clk framework will try to cache the clock rate when it's requested by a consumer. If the clock or consumer is not enabled at that point, the cached value is 0, which is wrong. Thus, disable the cache altogether.
--- drivers/clk/keystone/sci-clk.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/clk/keystone/sci-clk.c +8 -0
@@ -333,6 +333,14 @@ static int _sci_clk_build(struct sci_clk_provider *provider, init.ops = &sci_clk_ops; init.num_parents = sci_clk->num_parents; + +/* +* A clock rate query to the SCI firmware will return 0 if either the +* clock itself is disabled or the attached device/consumer is disabled. +* This makes it inherently unsuitable for the caching of the clk +* framework. +*/ + init.flags =CLK_GET_RATE_NOCACHE ; sci_clk->hw.init = &init; ret =devm_clk_hw_register (provider->dev, &sci_clk->hw);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 327/1250 ALSA: hda/realtek: ALC882: Fixup for Clevo P775TM1
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Evelyn Ali <[email protected]>
[ Upstream commit def5e78a4e003c83adc9a8b4b72534def3a49641 ]
Clevo P775TM1 laptops come with an ESS Sabre HiFi DAC. Setting 0x1b pin VREF to 80% enables said DAC output.
--- sound/hda/codecs/realtek/alc882.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
sound/hda/codecs/realtek/alc882.c +22 -0
@@ -61,6 +61,7 @@ enum {ALC887_FIXUP_ASUS_HMIC ,ALCS1200A_FIXUP_MIC_VREF ,ALC888VD_FIXUP_MIC_100VREF , + ALC898_FIXUP_CLEVO_P775TM1, }; static void alc889_fixup_coef(struct hda_codec *codec,
@@ -236,6 +237,19 @@ static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,alc_fixup_headset_mode_no_hp_mic (codec, fix, action); } +/* On Clevo P775TM1, VREF of pin 0x1b enables the external headphone amp */ +static void alc898_fixup_clevo_p775tm1 (struct hda_codec *codec, +const struct hda_fixup *fix,int action) +{ +struct alc_spec *spec = codec->spec; + +if (action !=HDA_FIXUP_ACT_PRE_PROBE ) +return ; + +snd_hda_set_pin_ctl_cache (codec,0x1b ,PIN_VREF80 ); + spec->gen.keep_vref_in_automute =1 ; +} +static void alc887_asus_hp_automute_hook (struct hda_codec *codec,struct hda_jack_callback *jack) {
@@ -560,6 +574,12 @@ static const struct hda_fixup alc882_fixups[] = { {} } }, + [ALC898_FIXUP_CLEVO_P775TM1 ] = { + .type =HDA_FIXUP_FUNC , + .v.func = alc898_fixup_clevo_p775tm1, + .chained = true, + .chain_id =ALC882_FIXUP_EAPD , + }, };static const struct hda_quirk alc882_fixup_tbl[] = {
@@ -664,6 +684,7 @@ static const struct hda_quirk alc882_fixup_tbl[] = {SND_PCI_QUIRK (0x1558 ,0x67f1 ,"Clevo PC70H[PRS]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ),SND_PCI_QUIRK (0x1558 ,0x67f5 ,"Clevo PD70PN[NRT]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ),SND_PCI_QUIRK (0x1558 ,0x70d1 ,"Clevo PC70[ER][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x7709 ,"Clevo P775TM1" ,ALC898_FIXUP_CLEVO_P775TM1 ),SND_PCI_QUIRK (0x1558 ,0x7714 ,"Clevo X170SM" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ),SND_PCI_QUIRK (0x1558 ,0x7715 ,"Clevo X170KM-G" ,ALC1220_FIXUP_CLEVO_PB51ED ), SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
@@ -719,6 +740,7 @@ static const struct hda_model_fixup alc882_fixup_models[] = { {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"}, {.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"}, {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"}, + {.id = ALC898_FIXUP_CLEVO_P775TM1, .name = "clevo-p775tm1"}, {} };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 328/1250 ALSA: hda/realtek: Add quirk for ASUS VivoBook X509DAP
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrei Faleichyk <[email protected]>
[ Upstream commit 3580bc53520ce4efc94ece5886ad3670b93667ba ]
The internal microphone on ASUS VivoBook X509DAP (subsystem ID 0x1043:0x197e) is not detected without a quirk entry. Add ALC256_FIXUP_ASUS_MIC_NO_PRESENCE to fix the issue.
--- sound/hda/codecs/realtek/alc269.c | 1 + 1 file changed, 1 insertion(+)
sound/hda/codecs/realtek/alc269.c +1 -0
@@ -7118,6 +7118,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1043 ,0x18f1 ,"Asus FX505DT" ,ALC256_FIXUP_ASUS_HEADSET_MIC ),SND_PCI_QUIRK (0x1043 ,0x194e ,"ASUS UX563FD" ,ALC294_FIXUP_ASUS_HPE ),SND_PCI_QUIRK (0x1043 ,0x1970 ,"ASUS UX550VE" ,ALC289_FIXUP_ASUS_GA401 ), +SND_PCI_QUIRK (0x1043 ,0x197e ,"ASUS VivoBook X509DAP" ,ALC256_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1982 ,"ASUS B1400CEPE" ,ALC256_FIXUP_ASUS_HPE ),SND_PCI_QUIRK (0x1043 ,0x19ce ,"ASUS B9450FA" ,ALC294_FIXUP_ASUS_HPE ), SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 329/1250 perf/x86/intel/uncore: Guard against invalid box control address
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zide Chen <[email protected]>
[ Upstream commit 3c19ea24f02658c4b8ad364458fae4d77fdb3fae ]
Theoretically, intel_uncore_find_discovery_unit() could return NULL, e.g., when a CPU die is offline during uncore enumeration and its PMU units are not added to the discovery RB-tree.
Guard against a NULL return value and the resulting invalid box control address (0) before accessing hardware.
--- arch/x86/events/intel/uncore_discovery.c | 33 +++++++++++++++++------- 1 file changed, 24 insertions(+), 9 deletions(-)
arch/x86/events/intel/uncore_discovery.c +24 -9
@@ -489,17 +489,28 @@ static u64 intel_generic_uncore_box_ctl(struct intel_uncore_box *box)void intel_generic_uncore_msr_init_box (struct intel_uncore_box *box) { -wrmsrq (intel_generic_uncore_box_ctl (box),GENERIC_PMON_BOX_CTL_INT ); +u64 box_ctl =intel_generic_uncore_box_ctl (box); + +if (!box_ctl) +return ; + +wrmsrq (box_ctl,GENERIC_PMON_BOX_CTL_INT ); }void intel_generic_uncore_msr_disable_box (struct intel_uncore_box *box) { -wrmsrq (intel_generic_uncore_box_ctl (box),GENERIC_PMON_BOX_CTL_FRZ ); +u64 box_ctl =intel_generic_uncore_box_ctl (box); + +if (box_ctl) +wrmsrq (box_ctl,GENERIC_PMON_BOX_CTL_FRZ ); }void intel_generic_uncore_msr_enable_box (struct intel_uncore_box *box) { -wrmsrq (intel_generic_uncore_box_ctl (box),0 ); +u64 box_ctl =intel_generic_uncore_box_ctl (box); + +if (box_ctl) +wrmsrq (box_ctl,0 ); } static void intel_generic_uncore_msr_enable_event(struct intel_uncore_box *box,
@@ -548,6 +559,7 @@ bool intel_generic_uncore_assign_hw_event(struct perf_event *event,if (box->pci_dev) { box_ctl =UNCORE_DISCOVERY_PCI_BOX_CTRL (box_ctl); + hwc->config_base = box_ctl +uncore_pci_event_ctl (box, hwc->idx); hwc->event_base = box_ctl +uncore_pci_perf_ctr (box, hwc->idx);return true;
@@ -566,27 +578,30 @@ static inline int intel_pci_uncore_box_ctl(struct intel_uncore_box *box)void intel_generic_uncore_pci_init_box (struct intel_uncore_box *box) { -struct pci_dev *pdev = box->pci_dev;int box_ctl =intel_pci_uncore_box_ctl (box); +if (!box_ctl) +return ; +__set_bit (UNCORE_BOX_FLAG_CTL_OFFS8 , &box->flags); -pci_write_config_dword (pdev, box_ctl,GENERIC_PMON_BOX_CTL_INT ); +pci_write_config_dword (box->pci_dev, box_ctl,GENERIC_PMON_BOX_CTL_INT ); }void intel_generic_uncore_pci_disable_box (struct intel_uncore_box *box) { -struct pci_dev *pdev = box->pci_dev;int box_ctl =intel_pci_uncore_box_ctl (box); -pci_write_config_dword (pdev, box_ctl,GENERIC_PMON_BOX_CTL_FRZ ); +if (box_ctl) +pci_write_config_dword (box->pci_dev, box_ctl, +GENERIC_PMON_BOX_CTL_FRZ ); }void intel_generic_uncore_pci_enable_box (struct intel_uncore_box *box) { -struct pci_dev *pdev = box->pci_dev;int box_ctl =intel_pci_uncore_box_ctl (box); -pci_write_config_dword (pdev, box_ctl,0 ); +if (box_ctl) +pci_write_config_dword (box->pci_dev, box_ctl,0 ); } static void intel_generic_uncore_pci_enable_event(struct intel_uncore_box *box,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 330/1250 ipmi: si: Use platform_get_irq_optional() to retrieve interrupt
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 39851b7e580a65bee732e5364f0efb974b242370 ]
Use platform_get_irq_optional() to retrieve the interrupt resource instead of directly parsing and mapping the OF node via irq_of_parse_and_map(). This is the standard pattern for platform devices. irq_of_parse_and_map() requires ire_dispose_mapping(), which is missing.
Message-ID: <[email protected]> [Handle a negative return from platform_get_irq_optional() to mean
no interrupt is assigned.]
--- drivers/char/ipmi/ipmi_si_platform.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/char/ipmi/ipmi_si_platform.c +4 -1
@@ -276,7 +276,10 @@ static int of_ipmi_probe(struct platform_device *pdev) io.regspacing = regspacing ?be32_to_cpup (regspacing) :DEFAULT_REGSPACING ; io.regshift = regshift ?be32_to_cpup (regshift) :0 ; - io.irq =irq_of_parse_and_map (pdev->dev.of_node,0 ); + io.irq =platform_get_irq_optional (pdev,0 ); +if (io.irq <0 ) + io.irq =0 ; + io.dev = &pdev->dev; dev_dbg(&pdev->dev, "addr 0x%lx regsize %d spacing %d irq %d\n",
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 331/1250 cxl/region: Validate partition index before array access
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Koba Ko <[email protected]>
[ Upstream commit 16329b510f76e5b824e05bf8add8b29850f1f16f ]
construct_region() reads cxled->part and uses it to index cxlds->part[] without checking for a negative value. If the partition was never resolved, part remains at its initial value of -1, causing an out-of-bounds array access.
Add a guard to return -EBUSY when part is negative.
The check was dropped during a merge.
--- drivers/cxl/core/region.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/cxl/core/region.c +3 -0
@@ -3521,6 +3521,9 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd,int rc, part =READ_ONCE (cxled->part);struct cxl_region *cxlr; +if (part <0 ) +return ERR_PTR (-EBUSY ); + do { cxlr = __create_region(cxlrd, cxlds->part[part].mode, atomic_read(&cxlrd->region_id));
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 332/1250 x86/microcode/AMD: Move the no-revision fixup to get_patch_level()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Borislav Petkov (AMD) <[email protected]>
[ Upstream commit 098bcea71b8d257d80b0037b97b66070806600a5 ]
On machines which don't have microcode applied yet, the revision is 0. However, this doesn't work with the Zen family/model/stepping patch arithmetic. So move the fixup to the patch level getter function and this way make sure the patch level is always proper and thus the arithmetic always works.
And now that it can be called on any family, make this Zen-only.
--- arch/x86/kernel/cpu/microcode/amd.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
arch/x86/kernel/cpu/microcode/amd.c +7 -5
@@ -233,11 +233,6 @@ static bool need_sha_check(u32 cur_rev) {u32 cutoff; -if (!cur_rev) { - cur_rev =cpuid_to_ucode_rev (bsp_cpuid_1_eax); -pr_info_once ("No current revision, generating the lowest one: 0x%x\n" , cur_rev); - } - cutoff =get_cutoff_revision (cur_rev);if (cutoff)return cur_rev <= cutoff;
@@ -338,6 +333,13 @@ static u32 get_patch_level(void) }native_rdmsr (MSR_AMD64_PATCH_LEVEL , rev, dummy); +if (!rev) { +if (x86_family (bsp_cpuid_1_eax) <0x17 ) +return rev; + + rev =cpuid_to_ucode_rev (bsp_cpuid_1_eax); +pr_info_once ("No current revision, generating the lowest one: 0x%x\n" , rev); + }return rev; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 333/1250 net: ethtool: cmis_cdb: hold instance lock for ops locked devices
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 1d3964e29e53b02a7c61ed6d6e4aeccba3275ebc ]
FW module flashing was written so that the flashing happens without holding rtnl_lock. This allows flashing multiple modules at once. Current drivers can handle that well, but we should let drivers depend on the netdev instance lock. Instance lock is per netdev, and so is the module so we won't break parallel updates.
--- include/net/netdev_lock.h | 6 ++++++ net/ethtool/cmis_cdb.c | 3 +++ net/ethtool/cmis_fw_update.c | 8 ++------ net/ethtool/module.c | 2 ++ 4 files changed, 13 insertions(+), 6 deletions(-)
include/net/netdev_lock.h +6 -0
@@ -80,6 +80,12 @@ netdev_ops_assert_locked_or_invisible(const struct net_device *dev)netdev_ops_assert_locked (dev); } +static inline void netdev_assert_locked_ops (const struct net_device *dev) +{ +if (netdev_need_ops_lock (dev)) +netdev_assert_locked (dev); +} +static inline void netdev_lock_ops_compat (struct net_device *dev) {if (netdev_need_ops_lock (dev))
net/ethtool/cmis_cdb.c +3 -0
@@ -2,6 +2,7 @@#include <linux/ethtool.h> #include <linux/jiffies.h> +#include <net/netdev_lock.h> #include "common.h" #include "module_fw.h"
@@ -179,6 +180,7 @@ cmis_cdb_validate_password(struct ethtool_cmis_cdb *cdb, pe_pl = *((struct cmis_password_entry_pl *)page_data.data); pe_pl.password = params->password; +netdev_assert_locked_ops (dev); err = ops->set_module_eeprom_by_page (dev, &page_data, &extack);if (err <0 ) {if (extack._msg)
@@ -546,6 +548,7 @@ __ethtool_cmis_cdb_execute_cmd(struct net_device *dev,if (!page_data->data)return -ENOMEM ; +netdev_assert_locked_ops (dev); err = ops->set_module_eeprom_by_page (dev, page_data, &extack);if (err <0 ) {if (extack._msg)
net/ethtool/cmis_fw_update.c +2 -6
@@ -435,13 +435,9 @@ cmis_fw_update_commit_image(struct ethtool_cmis_cdb *cdb,static int cmis_fw_update_reset (struct net_device *dev) {__u32 reset_data =ETH_RESET_PHY ; -int ret; -netdev_lock_ops (dev); - ret = dev->ethtool_ops->reset (dev, &reset_data); -netdev_unlock_ops (dev); - -return ret; +netdev_assert_locked_ops (dev); +return dev->ethtool_ops->reset (dev, &reset_data); }void
net/ethtool/module.c +2 -0
@@ -226,7 +226,9 @@ static void module_flash_fw_work(struct work_struct *work) module_fw = container_of(work, struct ethtool_module_fw_flash, work); dev = module_fw->fw_update.dev; +netdev_lock_ops (dev);ethtool_cmis_fw_update (&module_fw->fw_update); +netdev_unlock_ops (dev);module_flash_fw_work_list_del (&module_fw->list);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 334/1250 drm/amdkfd: fix SMI event cross-process information leak
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yongqiang Sun <[email protected]>
[ Upstream commit 92a8dba246d371fe268280e5fd74b0955688e6df ]
kfd_smi_ev_enabled() skips the suser privilege check when pid=0. PROCESS_START, PROCESS_END, and VMFAULT events are emitted with pid=0 while carrying another process's PID and command name, so any /dev/kfd user in the render group can monitor all GPU workloads.
Pass the target process PID into kfd_smi_event_add() for these events so the existing per-client filter restricts delivery to the owning process or CAP_SYS_ADMIN subscribers.
--- drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c +5 -3
@@ -254,8 +254,10 @@ void kfd_smi_event_update_vmfault(struct kfd_node *dev, uint16_t pasid)if (task_info) {/* Report VM faults from user applications, not retry from kernel */ if (task_info->task.pid) -kfd_smi_event_add (0 , dev,KFD_SMI_EVENT_VMFAULT ,KFD_EVENT_FMT_VMFAULT ( - task_info->task.pid, task_info->task.comm)); +kfd_smi_event_add (task_info->tgid, dev, +KFD_SMI_EVENT_VMFAULT , +KFD_EVENT_FMT_VMFAULT (task_info->task.pid, + task_info->task.comm));amdgpu_vm_put_task_info (task_info); } }
@@ -356,7 +358,7 @@ void kfd_smi_event_process(struct kfd_process_device *pdd, bool start) task_info =amdgpu_vm_get_task_info_vm (avm);if (task_info) { - kfd_smi_event_add(0, pdd->dev, + kfd_smi_event_add(task_info->tgid, pdd->dev, start ? KFD_SMI_EVENT_PROCESS_START : KFD_SMI_EVENT_PROCESS_END, KFD_EVENT_FMT_PROCESS(task_info->task.pid,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 335/1250 drm/amdkfd: Unwind debug trap enable on copy_to_user failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yongqiang Sun <[email protected]>
[ Upstream commit 01112e241e37f9ac98b6f418d93ce2e0b87b7ee0 ]
If kfd_dbg_trap_enable() fails while copying runtime_info to userspace, it had already activated the trap, set debug_trap_enabled, taken an extra process reference, and opened the debug event file. Return -EFAULT without unwinding that state, leaving inconsistent trap state and a refcount imbalance that could break later DISABLE/ENABLE.
On copy_to_user failure, deactivate the trap and undo the rest of the enable setup before returning.
--- drivers/gpu/drm/amd/amdkfd/kfd_debug.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/amd/amdkfd/kfd_debug.c +6 -0
@@ -816,6 +816,12 @@ int kfd_dbg_trap_enable(struct kfd_process *target, uint32_t fd,if (copy_to_user (runtime_info, (void *)&target->runtime_info, copy_size)) {kfd_dbg_trap_deactivate (target, false,0 ); +fput (target->dbg_ev_file); + target->dbg_ev_file =NULL ; +if (target->debugger_process) +atomic_dec (&target->debugger_process->debugged_process_count); + target->debug_trap_enabled = false; +kfd_unref_process (target); r = -EFAULT ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 336/1250 ipv6: use READ_ONCE() for bindv6only default in inet6_create()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Runyu Xiao <[email protected]>
[ Upstream commit 7a20eb54224ab7481c1f5a1619a6a5677be93eed ]
inet6_create() reads net->ipv6.sysctl.bindv6only locklessly.
Use READ_ONCE() for this sysctl access.
--- net/ipv6/af_inet6.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/af_inet6.c +1 -1
@@ -226,7 +226,7 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol, np->pmtudisc =IPV6_PMTUDISC_WANT ;inet6_assign_bit (REPFLOW , sk,READ_ONCE (net->ipv6.sysctl.flowlabel_reflect) &FLOWLABEL_REFLECT_ESTABLISHED ); - sk->sk_ipv6only = net->ipv6.sysctl.bindv6only; + sk->sk_ipv6only =READ_ONCE (net->ipv6.sysctl.bindv6only); sk->sk_txrehash =READ_ONCE (net->core.sysctl_txrehash);/* Init the ipv4 part of the socket since we can have sockets
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 337/1250 wifi: nl80211: Increase ie_len size to prevent truncated IEs in new peer notifications
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thiyagarajan Pandiyan <[email protected]>
[ Upstream commit dfb67ae569bf0726187725b1ef8d89377778861e ]
Currently, ie_len in cfg80211_notify_new_peer_candidate is defined as 1-byte field, capping the maximum IE list size at 255 bytes. When a large beacon is received, the IE list is truncated, passing incomplete data to wpa_supplicant. This causes supplicant to fail parsing the IEs.
Increasing the size of ie_len to allow the full length of the IE list to be forwarded properly.
--- include/net/cfg80211.h | 2 +- net/wireless/nl80211.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
include/net/cfg80211.h +1 -1
@@ -8255,7 +8255,7 @@ void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,* cfg80211 then sends a notification to userspace. */ void cfg80211_notify_new_peer_candidate (struct net_device *dev, -const u8 *macaddr,const u8 *ie,u8 ie_len, +const u8 *macaddr,const u8 *ie,size_t ie_len,int sig_dbm,gfp_t gfp);/**
net/wireless/nl80211.c +1 -1
@@ -20379,7 +20379,7 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, }void cfg80211_notify_new_peer_candidate (struct net_device *dev,const u8 *addr, -const u8 *ie,u8 ie_len, +const u8 *ie,size_t ie_len,int sig_dbm,gfp_t gfp) {struct wireless_dev *wdev = dev->ieee80211_ptr;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 338/1250 RDMA/umem: Be careful about boundary conditions in ib_umem_find_best_pgsz()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
[ Upstream commit 09ea6837a0434fb4db99528a5055b6d822135dcf ]
Several corner cases, especially important on 32 bits:
- umem->iova is u64, the function argument should pass in u64 or iova will be truncated
- Check that the length is not too large for the iova
- Check that lengths > 4G don't overflow the GENMASK
--- drivers/infiniband/core/umem.c | 18 ++++++++++++------ include/rdma/ib_umem.h | 4 ++-- 2 files changed, 14 insertions(+), 8 deletions(-)
drivers/infiniband/core/umem.c +12 -6
@@ -78,14 +78,17 @@ static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int d*/ unsigned long ib_umem_find_best_pgsz (struct ib_umem *umem,unsigned long pgsz_bitmap, -unsigned long virt) +u64 virt) {unsigned long curr_len =0 ;dma_addr_t curr_base = ~0 ; -unsigned long va, pgoff; +unsigned long pgoff;struct scatterlist *sg; -dma_addr_t mask; +unsigned long mask =0 ; +unsigned int bits;dma_addr_t end; +u64 last_va; +u64 va;int i; umem->iova = va = virt;
@@ -103,9 +106,12 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem,* number of required pages. Compute the largest page size that could * work based on VA address bits that don't change. */ - mask = pgsz_bitmap & -GENMASK (BITS_PER_LONG -1 , -bits_per ((umem->length -1 + virt) ^ virt)); +if (check_add_overflow (umem->length -1 , virt, &last_va)) +return 0 ; + bits =bits_per (virt ^ last_va); +if (bits <BITS_PER_LONG ) + mask = pgsz_bitmap &GENMASK (BITS_PER_LONG -1 , bits); +/* offset into first SGL */ pgoff = umem->address & ~PAGE_MASK ;
include/rdma/ib_umem.h +2 -2
@@ -85,7 +85,7 @@ int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offset, size_t length);unsigned long ib_umem_find_best_pgsz (struct ib_umem *umem,unsigned long pgsz_bitmap, -unsigned long virt); +u64 virt);/** * ib_umem_find_best_pgoff - Find best HW page size
@@ -178,7 +178,7 @@ static inline int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offs }static inline unsigned long ib_umem_find_best_pgsz (struct ib_umem *umem,unsigned long pgsz_bitmap, -unsigned long virt) +u64 virt) {return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 339/1250 RDMA/umem: Make ib_umem_is_contiguous() safe on 32 bit
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
[ Upstream commit 55d984dae65262fbb0a673cff7cc9824a5e19bdb ]
Sashiko points out the roundup_pow_of_two() only uses unsigned long but dma_addr_t can be u64.
Change this algorithm to be simpler, compute the page size, if any page size is found and it results in a single block then it is contiguous.
--- include/rdma/ib_umem.h | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
include/rdma/ib_umem.h +3 -8
@@ -121,16 +121,11 @@ static inline unsigned long ib_umem_find_best_pgoff(struct ib_umem *umem,static inline bool ib_umem_is_contiguous (struct ib_umem *umem) { -dma_addr_t dma_addr;unsigned long pgsz; -/* -* Select the smallest aligned page that can contain the whole umem if -* it was contiguous. -*/ - dma_addr =ib_umem_start_dma_addr (umem); - pgsz =roundup_pow_of_two ((dma_addr ^ (umem->length -1 + dma_addr)) +1 ); -return !!ib_umem_find_best_pgoff (umem, pgsz,U64_MAX ); + pgsz =ib_umem_find_best_pgsz (umem,ULONG_MAX , +ib_umem_start_dma_addr (umem)); +return pgsz &&ib_umem_num_dma_blocks (umem, pgsz) ==1 ; } struct ib_umem_dmabuf *ib_umem_dmabuf_get(struct ib_device *device,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 340/1250 firmware: stratix10-svc: fix FCS SMC call kernel-doc
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Genevieve Chan <[email protected]>
[ Upstream commit 9b9a6e31bdd1ff20c3ffdab87431672d8bfc2a07 ]
Correct kernel-doc errors for two FCS SMC calls:
INTEL_SIP_SMC_FCS_SEND_CERTIFICATE:
- Describe as async to match STD_CALL_VAL usage
- Replace INTEL_SIP_SMC_FCS_REJECTED with INTEL_SIP_SMC_REJECTED
INTEL_SIP_SMC_FCS_GET_PROVISION_DATA:
- Replace FCS-specific status macros with standard status macros (INTEL_SIP_SMC_STATUS_ERROR and INTEL_SIP_SMC_STATUS_REJECTED)
- Restore return register documentation for a1 (mailbox error), a2 (physical address), and a3 (structure size)
--- include/linux/firmware/intel/stratix10-smc.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
include/linux/firmware/intel/stratix10-smc.h +7 -5
@@ -582,7 +582,7 @@ INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE)/** * Request INTEL_SIP_SMC_FUNCID_FCS_SEND_CERTIFICATE -* Sync call to send a signed certificate +* Async call to send a signed certificate * * Call register usage: * a0 INTEL_SIP_SMC_FCS_SEND_CERTIFICATE
@@ -591,7 +591,7 @@ INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE)* a3-a7 not used * * Return status: -* a0 INTEL_SIP_SMC_STATUS_OK or INTEL_SIP_SMC_FCS_REJECTED +* a0 INTEL_SIP_SMC_STATUS_OK or INTEL_SIP_SMC_REJECTED * a1-a3 not used */ #define INTEL_SIP_SMC_FUNCID_FCS_SEND_CERTIFICATE 93
@@ -607,9 +607,11 @@ INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE)* a1-a7 not used * * Return status: -* a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_FCS_ERROR or -* INTEL_SIP_SMC_FCS_REJECTED -* a1-a3 not used +* a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_ERROR or +* INTEL_SIP_SMC_STATUS_REJECTED +* a1 mailbox error if a0 is INTEL_SIP_SMC_STATUS_ERROR +* a2 physical address for the structure of fuse and key hashes +* a3 the size of structure * */ #define INTEL_SIP_SMC_FUNCID_FCS_GET_PROVISION_DATA 94
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 341/1250 RDMA/mlx5: Fix state and counter desync on loopback enable failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li RongQing <[email protected]>
[ Upstream commit 0d32eabccbe4b2f8d45be3192c5f3c76c8af703d ]
In mlx5_ib_enable_lb(), dev->lb.enabled was unconditionally set to true even if mlx5_nic_vport_update_local_lb() failed.
Fix this by only setting dev->lb.enabled on success. On failure, roll back the reference counters and return the error.
--- drivers/infiniband/hw/mlx5/main.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/infiniband/hw/mlx5/main.c +11 -0
@@ -2019,6 +2019,9 @@ int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp) dev->lb.qps == 1) {if (!dev->lb.enabled) { err =mlx5_nic_vport_update_local_lb (dev->mdev, true); +if (err) + goto err_rollback; + dev->lb.enabled = true; } }
@@ -2026,6 +2029,14 @@ int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp)mutex_unlock (&dev->lb.mutex);return err; + +err_rollback: +if (td) + dev->lb.user_td--; +if (qp) + dev->lb.qps--; +mutex_unlock (&dev->lb.mutex); +return err; }void mlx5_ib_disable_lb (struct mlx5_ib_dev *dev,bool td,bool qp)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 342/1250 bpf: NUL-terminate replaced sysctl value
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dawei Feng <[email protected]>
[ Upstream commit a66e3b5bacf38d6ab29fa05a9754f7a114485605 ]
When writing to sysctls, proc_sys_call_handler() guarantees that the buffer passed to proc handlers is NUL-terminated. If bpf_sysctl_set_new_value() replaces the pending sysctl value, it can hand a replacement buffer directly to proc handlers. However, the helper currently copies only buf_len bytes into that buffer without appending a NUL terminator, leaving downstream parsers vulnerable to out-of-bounds access.
Fix this by appending a '\0' after the replaced value to restore the expected sysctl semantics. Since the helper already rejects buf_len greater than PAGE_SIZE - 1, there is always room for the extra byte.
Reproduced in a QEMU x86_64 guest booted with KASAN while exercising the sysctl replacement path with a cgroup/sysctl BPF program. The reproducer targets /proc/sys/net/core/flow_limit_cpu_bitmap, fills the original user write buffer with non-zero bytes, and overrides the sysctl value so the replacement buffer lacks a terminating NUL. Under that setup, the pre-fix kernel reported:
BUG: KASAN: slab-out-of-bounds in strnchrnul+0x72/0x90 Read of size 1 at addr ffff88800de57000 by task repro_patch3/66 CPU: 0 UID: 0 PID: 66 Comm: repro_patch3 Not tainted 7.1.0-rc3-00269-g8370ca1f87cc #6 PREEMPT(lazy) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0x68/0xa0 print_report+0xcb/0x5e0 ? __virt_addr_valid+0x21d/0x3f0 ? strnchrnul+0x72/0x90 ? strnchrnul+0x72/0x90 kasan_report+0xca/0x100 ? strnchrnul+0x72/0x90 strnchrnul+0x72/0x90 bitmap_parse+0x37/0x2e0 flow_limit_cpu_sysctl+0xc6/0x840 ? __pfx_flow_limit_cpu_sysctl+0x10/0x10 ? __kvmalloc_node_noprof+0x5ba/0x870 proc_sys_call_handler+0x31d/0x480 ? __pfx_proc_sys_call_handler+0x10/0x10 ? selinux_file_permission+0x39f/0x500 ? lock_is_held_type+0x9e/0x120 vfs_write+0x98e/0x1000 ... </TASK> The buggy address is located 0 bytes to the right of allocated 4096-byte region [ffff88800de56000, ffff88800de57000)
With this fix applied, rerunning the same sysctl-targeted path yields no corresponding KASAN reports.
--- kernel/bpf/cgroup.c | 1 + 1 file changed, 1 insertion(+)
kernel/bpf/cgroup.c +1 -0
@@ -2409,6 +2409,7 @@ BPF_CALL_3(bpf_sysctl_set_new_value, struct bpf_sysctl_kern *, ctx,return -E2BIG ;memcpy (ctx->new_val, buf, buf_len); + ((char *)ctx->new_val)[buf_len] ='\0' ; ctx->new_len = buf_len; ctx->new_updated =1 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 343/1250 net: cpsw_new: unregister devlink on port registration failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guangshuo Li <[email protected]>
[ Upstream commit b64f763b607426ac97e44b114f0b8844ac3b86dd ]
cpsw_probe() registers devlink before registering the CPSW ports.
If cpsw_register_ports() fails, the error path only unregisters the notifiers and then releases the lower level resources. It does not undo the successful cpsw_register_devlink() call, leaving the devlink instance and its parameters registered after probe has failed.
Add a devlink cleanup label for the path where devlink registration has already succeeded, and use it when port registration fails.
--- drivers/net/ethernet/ti/cpsw_new.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/ti/cpsw_new.c +3 -1
@@ -2048,7 +2048,7 @@ static int cpsw_probe(struct platform_device *pdev) ret =cpsw_register_ports (cpsw);if (ret) - goto clean_unregister_notifiers; + goto clean_unregister_devlink; dev_notice(dev, "initialized (regs %pa, pool size %d) hw_ver:%08X %d.%d (%d)\n", &ss_res->start, descs_pool_size,
@@ -2060,6 +2060,8 @@ static int cpsw_probe(struct platform_device *pdev)return 0 ; +clean_unregister_devlink: +cpsw_unregister_devlink (cpsw); clean_unregister_notifiers:cpsw_unregister_notifiers (cpsw); clean_cpts:
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 344/1250 hsr: broadcast netlink notifications in the devices net namespace
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maoyi Xie <[email protected]>
[ Upstream commit a762fabd7ef9a6cc07258684138f9c3f078d0326 ]
The HSR generic netlink family sets .netnsok = true. HSR devices can live in network namespaces other than init_net.
Two async notifiers broadcast events with genlmsg_multicast(). They are hsr_nl_ringerror() and hsr_nl_nodedown(). That helper delivers only on the default genl socket in init_net. So the events always land in init_net. The network namespace of the device does not matter.
This has two effects. A listener in the device's own namespace never sees its own ring error and node down events. A privileged listener in init_net receives events from HSR devices in other namespaces. The payload carries the peer node MAC (HSR_A_NODE_ADDR) and the slave port ifindex (HSR_A_IFINDEX).
Switch both callers to genlmsg_multicast_netns(). Other families with .netnsok = true already do this. Examples are gtp, ovpn, team, batman-adv, netdev-genl, ethtool and handshake.
hsr_nl_ringerror() already has the slave port. It uses dev_net(port->dev). hsr_nl_nodedown() takes the namespace from the master port via hsr_port_get_hsr().
--- net/hsr/hsr_netlink.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
net/hsr/hsr_netlink.c +7 -2
@@ -239,7 +239,8 @@ void hsr_nl_ringerror(struct hsr_priv *hsr, unsigned char addr[ETH_ALEN], goto nla_put_failure;genlmsg_end (skb, msg_head); -genlmsg_multicast (&hsr_genl_family, skb,0 ,0 ,GFP_ATOMIC ); +genlmsg_multicast_netns (&hsr_genl_family,dev_net (port->dev), + skb,0 ,0 ,GFP_ATOMIC );return ;
@@ -275,8 +276,12 @@ void hsr_nl_nodedown(struct hsr_priv *hsr, unsigned char addr[ETH_ALEN])if (res <0 ) goto nla_put_failure; +rcu_read_lock (); + master =hsr_port_get_hsr (hsr,HSR_PT_MASTER );genlmsg_end (skb, msg_head); -genlmsg_multicast (&hsr_genl_family, skb,0 ,0 ,GFP_ATOMIC ); +genlmsg_multicast_netns (&hsr_genl_family,dev_net (master->dev), + skb,0 ,0 ,GFP_ATOMIC ); +rcu_read_unlock ();return ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 345/1250 net: microchip: sparx5: clean up PSFP resources on flower setup failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haoxiang Li <[email protected]>
[ Upstream commit 46e50367338702abe3df661df7795bdada40fef7 ]
sparx5_tc_flower_psfp_setup() allocates PSFP stream gate, flow meter and stream filter resources before adding VCAP actions. If a later step fails, the resources allocated earlier in the function are not unwound.
Add error paths to release the stream filter, flow meter and stream gate when setup fails after they have been acquired.
Also make sparx5_psfp_fm_add() return the acquired flow-meter id before the existing-flow-meter early return. When an existing flow meter is reused, sparx5_psfp_fm_get() increments its pool reference count, but the caller previously kept psfp_fmid as 0. If a later setup step failed, the error path could try to delete flow-meter id 0 instead of the reused flow meter, leaving the incremented reference behind.
--- .../ethernet/microchip/sparx5/sparx5_psfp.c | 5 +++-- .../microchip/sparx5/sparx5_tc_flower.c | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-)
drivers/net/ethernet/microchip/sparx5/sparx5_psfp.c +3 -2
@@ -277,6 +277,9 @@ int sparx5_psfp_fm_add(struct sparx5 *sparx5, u32 uidx, ret =sparx5_psfp_fm_get (sparx5, uidx, &fm->pol.idx);if (ret <0 )return ret; + + *id = fm->pol.idx; +/* Was already in use, no need to reconfigure */ if (ret >1 )return 0 ;
@@ -291,8 +294,6 @@ int sparx5_psfp_fm_add(struct sparx5 *sparx5, u32 uidx,if (ret <0 )return ret; - *id = fm->pol.idx; -return 0 ; }
drivers/net/ethernet/microchip/sparx5/sparx5_tc_flower.c +14 -4
@@ -807,7 +807,7 @@ static int sparx5_tc_flower_psfp_setup(struct sparx5 *sparx5,/* Add new flow-meter */ ret =sparx5_psfp_fm_add (sparx5, pol_idx, fm, &psfp_fmid);if (ret <0 ) -return ret; + goto err_sg_del; }/* Map stream filter to stream gate */
@@ -816,7 +816,7 @@ static int sparx5_tc_flower_psfp_setup(struct sparx5 *sparx5,/* Add new stream-filter and map it to a steam gate */ ret =sparx5_psfp_sf_add (sparx5, sf, &psfp_sfid);if (ret <0 ) -return ret; + goto err_fm_del;/* Streams are classified by ISDX - map ISDX 1:1 to sfid for now. */ sparx5_isdx_conf_set (sparx5, psfp_sfid, psfp_sfid, psfp_fmid);
@@ -824,13 +824,23 @@ static int sparx5_tc_flower_psfp_setup(struct sparx5 *sparx5, ret =vcap_rule_add_action_bit (vrule,VCAP_AF_ISDX_ADD_REPLACE_SEL ,VCAP_BIT_1 );if (ret) -return ret; + goto err_sf_del; ret =vcap_rule_add_action_u32 (vrule,VCAP_AF_ISDX_VAL , psfp_sfid);if (ret) -return ret; + goto err_sf_del;return 0 ; + +err_sf_del: +sparx5_isdx_conf_set (sparx5, psfp_sfid,0 ,0 ); +sparx5_psfp_sf_del (sparx5, psfp_sfid); +err_fm_del: +if (pol_idx >=0 ) +sparx5_psfp_fm_del (sparx5, psfp_fmid); +err_sg_del: +sparx5_psfp_sg_del (sparx5, psfp_sgid); +return ret; }/* Handle the action trap for a VCAP rule */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 346/1250 ALSA: es18xx: check control allocation before private data setup
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ruoyu Wang <[email protected]>
[ Upstream commit 422e42b7c2b882ba1d16d4afc8891bcea7c4de93 ]
snd_es18xx_mixer() creates controls with snd_ctl_new1() and then stores bookkeeping pointers or sets private_free before calling snd_ctl_add(). snd_ctl_new1() can return NULL on allocation failure, so those writes can dereference a NULL control pointer.
Check the returned control pointers before using them and return -ENOMEM on allocation failure.
--- sound/isa/es18xx.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/isa/es18xx.c +4 -0
@@ -1762,6 +1762,8 @@ static int snd_es18xx_mixer(struct snd_card *card)for (idx =0 ; idx <ARRAY_SIZE (snd_es18xx_base_controls); idx++) {struct snd_kcontrol *kctl; kctl =snd_ctl_new1 (&snd_es18xx_base_controls[idx], chip); +if (!kctl) +return -ENOMEM ;if (chip->caps &ES18XX_HWV ) {switch (idx) {case 0 :
@@ -1823,6 +1825,8 @@ static int snd_es18xx_mixer(struct snd_card *card)for (idx =0 ; idx <ARRAY_SIZE (snd_es18xx_hw_volume_controls); idx++) {struct snd_kcontrol *kctl; kctl =snd_ctl_new1 (&snd_es18xx_hw_volume_controls[idx], chip); +if (!kctl) +return -ENOMEM ;if (idx ==0 ) chip->hw_volume = kctl;else
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 347/1250 netfilter: nf_conntrack: use get_unaligned_be32() in tcp_sack()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit d3bf9eae486490832bd08fd62ab0ac601f346bd4 ]
The timestamp-only fast path dereferences the option stream as *(__be32 *)ptr, which assumes 4-byte alignment that the TCP option stream does not guarantee. Use get_unaligned_be32() instead, which reads the value safely and already returns host byte order, so the htonl() on the comparison constant can be dropped.
This matches the existing get_unaligned_be32() use later in the same function.
--- net/netfilter/nf_conntrack_proto_tcp.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
net/netfilter/nf_conntrack_proto_tcp.c +5 -5
@@ -405,11 +405,11 @@ static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff,return ;/* Fast path for timestamp-only option */ -if (length ==TCPOLEN_TSTAMP_ALIGNED - && *(__be32 *)ptr ==htonl ((TCPOPT_NOP <<24 ) - | (TCPOPT_NOP <<16 ) - | (TCPOPT_TIMESTAMP <<8 ) - |TCPOLEN_TIMESTAMP )) +if (length ==TCPOLEN_TSTAMP_ALIGNED && +get_unaligned_be32 (ptr) == ((TCPOPT_NOP <<24 ) | + (TCPOPT_NOP <<16 ) | + (TCPOPT_TIMESTAMP <<8 ) | +TCPOLEN_TIMESTAMP ))return ;while (length >0 ) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 348/1250 riscv: panic if IRQ handler stacks cannot be allocated
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Osama Abdelkader <[email protected]>
[ Upstream commit 2abd0dba562551d5c27f97ce560684f534c0cf3a ]
init_irq_stacks() and init_irq_scs() may fail when arch_alloc_vmap_stack or scs_alloc return NULL, call panic() in this case.
--- arch/riscv/kernel/irq.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-)
arch/riscv/kernel/irq.c +14 -8
@@ -75,28 +75,34 @@ DECLARE_PER_CPU(ulong *, irq_shadow_call_stack_ptr); DEFINE_PER_CPU(ulong *, irq_shadow_call_stack_ptr);#endif -static void init_irq_scs (void ) +static void __init init_irq_scs (void ) {int cpu; +void *s;if (!scs_is_enabled ())return ; -for_each_possible_cpu (cpu) -per_cpu (irq_shadow_call_stack_ptr, cpu) = -scs_alloc (cpu_to_node (cpu)); +for_each_possible_cpu (cpu) { + s =scs_alloc (cpu_to_node (cpu)); +if (!s) +panic ("Failed to allocate IRQ shadow call stack resources\n" ); +per_cpu (irq_shadow_call_stack_ptr, cpu) = s; + } } DEFINE_PER_CPU(ulong *, irq_stack_ptr);#ifdef CONFIG_VMAP_STACK -static void init_irq_stacks (void ) +static void __init init_irq_stacks (void ) {int cpu;ulong *p;for_each_possible_cpu (cpu) { p =arch_alloc_vmap_stack (IRQ_STACK_SIZE ,cpu_to_node (cpu)); +if (!p) +panic ("Failed to allocate IRQ stack resources\n" );per_cpu (irq_stack_ptr, cpu) = p; } }
@@ -104,7 +110,7 @@ static void init_irq_stacks(void)/* irq stack only needs to be 16 byte aligned - not IRQ_STACK_SIZE aligned. */ DEFINE_PER_CPU_ALIGNED (ulong [IRQ_STACK_SIZE /sizeof (ulong)], irq_stack); -static void init_irq_stacks (void ) +static void __init init_irq_stacks (void ) {int cpu;
@@ -129,8 +135,8 @@ void do_softirq_own_stack(void)#endif /* CONFIG_SOFTIRQ_ON_OWN_STACK */ #else -static void init_irq_scs (void ) {} -static void init_irq_stacks (void ) {} +static void __init init_irq_scs (void ) {} +static void __init init_irq_stacks (void ) {}#endif /* CONFIG_IRQ_STACKS */ int arch_show_interrupts (struct seq_file *p,int prec)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 349/1250 btrfs: balance: fix potential bg lookup failure in btrfs_may_alloc_data_chunk()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: ZhengYuan Huang <[email protected]>
[ Upstream commit 18d32b0013efba19f7ad3e5b08d7aee813d604a6 ]
[BUG]
Running btrfs balance can trigger a null-ptr-deref before relocating a data chunk when metadata corruption leaves a chunk in the chunk tree without a corresponding block group in the in-memory cache:
KASAN: null-ptr-deref in range [0x0000000000000088-0x000000000000008f]
RIP: 0010:btrfs_may_alloc_data_chunk+0x40/0x1c0 fs/btrfs/volumes.c:3601
Call Trace:
__btrfs_balance fs/btrfs/volumes.c:4217 [inline]
btrfs_balance+0x2516/0x42b0 fs/btrfs/volumes.c:4604
btrfs_ioctl_balance fs/btrfs/ioctl.c:3577 [inline]
btrfs_ioctl+0x25cf/0x5b90 fs/btrfs/ioctl.c:5313
...[CAUSE]__btrfs_balance() iterates the on-disk chunk tree and passes the chunk logical bytenr to btrfs_may_alloc_data_chunk() before relocating a data chunk. That helper then queries the in-memory block group cache:
cache = btrfs_lookup_block_group(fs_info, chunk_offset); chunk_type = cache->flags; /* cache may be NULL */
A corrupt image can contain a chunk item whose matching block group item is missing, so no block group is ever inserted into the cache. In that case btrfs_lookup_block_group() returns NULL.
The code only guards this with ASSERT(cache), which becomes a no-op when CONFIG_BTRFS_ASSERT is disabled. The subsequent dereference of cache->flags therefore crashes the kernel.
[FIX]
Add a NULL check after btrfs_lookup_block_group() in btrfs_may_alloc_data_chunk() and print and error message for clarity.
--- fs/btrfs/volumes.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/btrfs/volumes.c +5 -1
@@ -3719,7 +3719,11 @@ static int btrfs_may_alloc_data_chunk(struct btrfs_fs_info *fs_info,u64 chunk_type; cache =btrfs_lookup_block_group (fs_info, chunk_offset); -ASSERT (cache); +if (unlikely (!cache)) { +btrfs_err (fs_info,"balance: chunk at bytenr %llu has no corresponding block group" , + chunk_offset); +return -EUCLEAN ; + } chunk_type = cache->flags;btrfs_put_block_group (cache);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 350/1250 btrfs: tree-checker: validate names in ROOT_REF and ROOT_BACKREF
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Cen <[email protected]>
[ Upstream commit 0af37c217edf15fa21dac1c40822086df356c6bb ]
ROOT_REF and ROOT_BACKREF items contain a struct btrfs_root_ref followed by the subvolume name. Several readers assume that this layout is already valid and then use the on-disk name length directly. A corrupted item can therefore make those readers address bytes outside the item, and BTRFS_IOC_GET_SUBVOL_INFO can copy too many bytes into its fixed-size UAPI name buffer.
Validate ROOT_REF and ROOT_BACKREF items in tree-checker before any reader uses them. Reject records that do not contain a non-empty name, whose name_len does not exactly describe the remaining item payload, or whose name exceeds BTRFS_NAME_LEN.
For BTRFS_IOC_GET_SUBVOL_INFO, copy only the validated on-disk name_len instead of deriving the copy length from the item size. The ioctl result is zeroed when allocated. That leaves the existing trailing zero byte untouched.
--- fs/btrfs/ioctl.c | 11 +++++------ fs/btrfs/tree-checker.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-)
fs/btrfs/ioctl.c +5 -6
@@ -2053,7 +2053,6 @@ static int btrfs_ioctl_get_subvol_info(struct inode *inode, void __user *argp)struct btrfs_root_ref *rref;struct extent_buffer *leaf;unsigned long item_off; -unsigned long item_len;int slot;int ret =0 ;
@@ -2128,17 +2127,17 @@ static int btrfs_ioctl_get_subvol_info(struct inode *inode, void __user *argp)btrfs_item_key_to_cpu (leaf, &key, slot);if (key.objectid == subvol_info->treeid && key.type ==BTRFS_ROOT_BACKREF_KEY ) { +u16 name_len; + subvol_info->parent_id = key.offset; rref = btrfs_item_ptr(leaf, slot, struct btrfs_root_ref); + name_len =btrfs_root_ref_name_len (leaf, rref); subvol_info->dirid =btrfs_root_ref_dirid (leaf, rref); - item_off =btrfs_item_ptr_offset (leaf, slot) - +sizeof (struct btrfs_root_ref ); - item_len =btrfs_item_size (leaf, slot) - -sizeof (struct btrfs_root_ref ); + item_off =btrfs_item_ptr_offset (leaf, slot) +sizeof (*rref);read_extent_buffer (leaf, subvol_info->name, - item_off, item_len); + item_off, name_len); }else { ret = -ENOENT ; goto out;
fs/btrfs/tree-checker.c +35 -0
@@ -1288,6 +1288,37 @@ static int check_root_item(struct extent_buffer *leaf, struct btrfs_key *key,return 0 ; } +static int check_root_ref (struct extent_buffer *leaf,struct btrfs_key *key,int slot) +{ +struct btrfs_root_ref *rref; +u32 item_size =btrfs_item_size (leaf, slot); +u32 name_len; + +if (unlikely (item_size <=sizeof (*rref))) { +generic_err (leaf, slot, +"invalid root ref item size for key type %u, have %u expect > %zu" , + key->type, item_size,sizeof (*rref)); +return -EUCLEAN ; + } + + rref = btrfs_item_ptr(leaf, slot, struct btrfs_root_ref); + name_len =btrfs_root_ref_name_len (leaf, rref); +if (unlikely (name_len >BTRFS_NAME_LEN )) { +generic_err (leaf, slot, +"root ref name too long for key type %u, have %u max %u" , + key->type, name_len,BTRFS_NAME_LEN ); +return -EUCLEAN ; + } +if (unlikely (item_size !=sizeof (*rref) + name_len)) { +generic_err (leaf, slot, +"invalid root ref item size for key type %u, have %u expect %zu" , + key->type, item_size,sizeof (*rref) + name_len); +return -EUCLEAN ; + } + +return 0 ; +} + __printf(3,4)__cold static void extent_err(const struct extent_buffer *eb, int slot,
@@ -1965,6 +1996,10 @@ static enum btrfs_tree_block_status check_leaf_item(struct extent_buffer *leaf,case BTRFS_ROOT_ITEM_KEY : ret =check_root_item (leaf, key, slot);break ; +case BTRFS_ROOT_REF_KEY : +case BTRFS_ROOT_BACKREF_KEY : + ret =check_root_ref (leaf, key, slot); +break ;case BTRFS_EXTENT_ITEM_KEY :case BTRFS_METADATA_ITEM_KEY : ret =check_extent_item (leaf, key, slot, prev_key);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 351/1250 NFS: fix eof updates after NFSv4.2 fallocate/zero-range
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dai Ngo <[email protected]>
[ Upstream commit 35168eb947f230aaa35fd8416a30563ef89f5421 ]
Generic/075 reliably exposes a regression when the client holds an NFSv4 write delegation: ZERO_RANGE/ALLOCATE extends the file on the server, but the local inode keeps the old i_size. The test then fails with 'Size error' because the post-op attribute refresh refuses to touch i_size while a delegation is outstanding, and the cached EOF was never marked stale.
Update _nfs42_proc_fallocate() so that on success it:
- bumps i_size when the operation extends the file, and
- marks NFS_INO_INVALID_BLOCKS since the block count can also change
Tested with xfstests generic/075 over NFSv4.2.
--- fs/nfs/nfs42proc.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
fs/nfs/nfs42proc.c +10 -5
@@ -81,12 +81,17 @@ static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep, status =nfs4_call_sync (server->client, server, msg, &args.seq_args, &res.seq_res,0 );if (status ==0 ) { -if (nfs_should_remove_suid (inode)) { -spin_lock (&inode->i_lock); +loff_t newsize = offset + len; + +spin_lock (&inode->i_lock); +if (newsize >i_size_read (inode)) +i_size_write (inode, newsize); +nfs_set_cache_invalid (inode,NFS_INO_INVALID_BLOCKS ); +if (nfs_should_remove_suid (inode))nfs_set_cache_invalid (inode, -NFS_INO_REVAL_FORCED |NFS_INO_INVALID_MODE ); -spin_unlock (&inode->i_lock); - } +NFS_INO_REVAL_FORCED | +NFS_INO_INVALID_MODE ); +spin_unlock (&inode->i_lock); status =nfs_post_op_update_inode_force_wcc (inode, res.falloc_fattr); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 352/1250 ASoC: mediatek: mt8365-afe-pcm: fix possible NULL-pointer dereferences in mt8365_afe_suspend()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tuo Li <[email protected]>
[ Upstream commit b8948ac26efc395264a47f9a743889065adb5cff ]
mt8365_afe_suspend() allocates the register backup buffer with devm_kcalloc(), but does not check for allocation failure before using the returned pointer. This may lead to a NULL pointer dereference when accessing afe->reg_back_up[i].
Add the missing NULL check and return -ENOMEM on allocation failure after disabling the main clock.
Also propagate the return value of mt8365_afe_suspend() in mt8365_afe_dev_runtime_suspend() so that the suspended state is not updated when suspend fails.
--- sound/soc/mediatek/mt8365/mt8365-afe-pcm.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
sound/soc/mediatek/mt8365/mt8365-afe-pcm.c +11 -2
@@ -1975,10 +1975,15 @@ static int mt8365_afe_suspend(struct device *dev)mt8365_afe_enable_main_clk (afe); -if (!afe->reg_back_up) +if (!afe->reg_back_up) { afe->reg_back_up =devm_kcalloc (dev, afe->reg_back_up_list_num,sizeof (unsigned int ),GFP_KERNEL ); +if (!afe->reg_back_up) { +mt8365_afe_disable_main_clk (afe); +return -ENOMEM ; + } + }for (i =0 ; i < afe->reg_back_up_list_num; i++) regmap_read(regmap, afe->reg_back_up_list[i],
@@ -2012,11 +2017,15 @@ static int mt8365_afe_resume(struct device *dev)static int mt8365_afe_dev_runtime_suspend (struct device *dev) {struct mtk_base_afe *afe =dev_get_drvdata (dev); +int ret;if (pm_runtime_status_suspended (dev) || afe->suspended)return 0 ; -mt8365_afe_suspend (dev); + ret =mt8365_afe_suspend (dev); +if (ret) +return ret; + afe->suspended = true;return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 353/1250 RDMA/rtrs-srv: Fix integer underflow in process_read and process_write
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aurelien DESBRIERES <[email protected]>
[ Upstream commit 54bf38b27afc08a0eb6b732f9c14eb8a4bcb66b5 ]
usr_len is read from a network-supplied message field (le16_to_cpu) and used to compute data_len = off - usr_len without validating that usr_len <= off. A malicious RDMA client can send usr_len > off causing an integer underflow, resulting in data_len wrapping to a huge size_t value which is then passed to the rdma_ev callback as a memory length, leading to out-of-bounds memory access.
Fix by reading and validating usr_len <= off before rtrs_srv_get_ops_ids() in both process_read() and process_write(), ensuring the early return path acquires no reference and has no resource leak.
--- drivers/infiniband/ulp/rtrs/rtrs-srv.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/infiniband/ulp/rtrs/rtrs-srv.c +10 -2
@@ -1049,6 +1049,11 @@ static void process_read(struct rtrs_srv_con *con, "Processing read request failed, invalid message\n");return ; } + usr_len =le16_to_cpu (msg->usr_len); +if (usr_len > off) { +pr_debug ("rtrs-srv: Invalid usr_len %zu > off %u\n" , usr_len, off); +return ; + }rtrs_srv_get_ops_ids (srv_path);rtrs_srv_update_rdma_stats (srv_path->stats, off,READ ); id = srv_path->ops_ids[buf_id];
@@ -1056,7 +1061,6 @@ static void process_read(struct rtrs_srv_con *con, id->dir =READ ; id->msg_id = buf_id; id->rd_msg = msg; - usr_len =le16_to_cpu (msg->usr_len); data_len = off - usr_len; data =page_address (srv->chunks[buf_id]); ret = ctx->ops.rdma_ev(srv->priv, id, data, data_len,
@@ -1102,6 +1106,11 @@ static void process_write(struct rtrs_srv_con *con, rtrs_srv_state_str(srv_path->state));return ; } + usr_len =le16_to_cpu (req->usr_len); +if (usr_len > off) { +pr_debug ("rtrs-srv: Invalid usr_len %zu > off %u\n" , usr_len, off); +return ; + }rtrs_srv_get_ops_ids (srv_path);rtrs_srv_update_rdma_stats (srv_path->stats, off,WRITE ); id = srv_path->ops_ids[buf_id];
@@ -1109,7 +1118,6 @@ static void process_write(struct rtrs_srv_con *con, id->dir =WRITE ; id->msg_id = buf_id; - usr_len =le16_to_cpu (req->usr_len); data_len = off - usr_len; data =page_address (srv->chunks[buf_id]); ret = ctx->ops.rdma_ev(srv->priv, id, data, data_len,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 354/1250 xprtrdma: Add request-pool slack for delayed recycling
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit 64bf6892057b746c55bcc045b9492741b72d8d27 ]
After the previous patch gates req recycling on Send completion, a completed RPC's rpcrdma_req can remain pinned by the sendctx ring until the next signaled Send completion releases it. The transmitted-RPC ceiling is unchanged: xprt_request_get_cong() gates Sends against xprt->cwnd, the RPC/RDMA credit window fed by server-granted credits and capped at re_max_requests. The req pool, however, must exceed max_reqs by enough that this recycle delay does not stall a slot allocation that the credit window would admit.
The headroom is bounded. frwr_open() sets re_send_batch to re_max_requests >> 3 -- one in every eight Sends is signaled -- so at most re_send_batch unsignaled Sends can be outstanding before the next signaled completion releases them. That equals max_reqs / 8 reqs in the worst case, with a one-slot floor for small max_reqs values where the right-shift rounds to zero.
The sendctx ring and the hardware Send Queue are not enlarged to match. Both are sized in rpcrdma_sendctxs_create() and frwr_query_device() for re_max_requests in-flight Sends, which is the ceiling the credit window enforces. The pool slack does not raise that ceiling -- it only lets allocation keep pace with the credit window during the brief interval in which earlier reqs are pinned waiting for the next signaled completion. At any moment, at most re_send_batch sendctxes are held by unswept unsignaled Sends, leaving the rest of the ring available for newly admitted Sends.
Allocate max_reqs + DIV_ROUND_UP(max_reqs, 8) request objects and name the slack calculation at the allocation site so the 1/8 bound stays tied to the Send-signaling batch size.
--- net/sunrpc/xprtrdma/verbs.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)
net/sunrpc/xprtrdma/verbs.c +20 -1
@@ -1123,6 +1123,22 @@ static void rpcrdma_reps_destroy(struct rpcrdma_buffer *buf)spin_unlock (&buf->rb_lock); } +static unsigned int rpcrdma_req_pool_slack (unsigned int max_reqs) +{ +/* The sendctx ring can hold up to one Send-signaling batch +* (re_send_batch, set by frwr_open() to re_max_requests >> 3) +* of unfinished Sends. Each pins its req until a signaled Send +* completion releases the sendctx. Size the pool above max_reqs +* by that batch so the recycle delay does not stall a slot +* allocation that the RPC/RDMA credit window would admit. +* +* Round up: re_max_requests >> 3 is zero when max_reqs < 8, but +* a single unsignaled Send is still enough to pin one req. One +* slack slot covers that case. +*/ +return DIV_ROUND_UP (max_reqs,8 ); +} +/** * rpcrdma_buffer_create - Create initial set of req/rep objects * @r_xprt: transport instance to (re)initialize
@@ -1132,6 +1148,7 @@ static void rpcrdma_reps_destroy(struct rpcrdma_buffer *buf)int rpcrdma_buffer_create (struct rpcrdma_xprt *r_xprt) {struct rpcrdma_buffer *buf = &r_xprt->rx_buf; +unsigned int max_reqs;int i, rc; buf->rb_bc_srv_max_requests =0 ;
@@ -1145,7 +1162,9 @@ int rpcrdma_buffer_create(struct rpcrdma_xprt *r_xprt)INIT_LIST_HEAD (&buf->rb_all_reps); rc = -ENOMEM ; -for (i =0 ; i < r_xprt->rx_xprt.max_reqs; i++) { + max_reqs = r_xprt->rx_xprt.max_reqs; + max_reqs +=rpcrdma_req_pool_slack (max_reqs); +for (i =0 ; i < max_reqs; i++) {struct rpcrdma_req *req; req = rpcrdma_req_create(r_xprt,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 355/1250 RDMA/mlx5: Create ODP EQ for non-pinned dmabuf MRs
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
[ Upstream commit 93e64c7a33ff6679d4d1c0a03021a2ff0e2b6c98 ]
DMABUF generally relies on the ODP EQ mechanism to safely implement the move semantics. ODP requires a device-global one time startup of the ODP machinery when the first MR is created, and this was missed on the DMABUF path.
Call mlx5r_odp_create_eq() when creating a ODP'able DMABUF.
The core code prevents using IB_ACCESS_ON_DEMAND unless the driver advertises IB_ODP_SUPPORT, so until now, mlx5r_odp_create_eq() cannot be called unless the device has ODP support.
However, DMABUF has no such protection and a second bug was allowing DMABUFs to be created on non-ODP capable HW. Add a guard at the start of mlx5r_odp_create_eq(). This is necessary here anyhow as the dev->odp_eq_mutex is not initialized without IB_ODP_SUPPORT.
--- drivers/infiniband/hw/mlx5/mr.c | 4 ++++ drivers/infiniband/hw/mlx5/odp.c | 3 +++ 2 files changed, 7 insertions(+)
drivers/infiniband/hw/mlx5/mr.c +4 -0
@@ -1679,6 +1679,10 @@ reg_user_mr_dmabuf(struct ib_pd *pd, struct device *dma_device,atomic_add (ib_umem_num_pages (mr->umem), &dev->mdev->priv.reg_pages); umem_dmabuf->private = mr;if (!pinned_mode) { + err =mlx5r_odp_create_eq (dev, &dev->odp_pf_eq); +if (err) + goto err_dereg_mr; + err =mlx5r_store_odp_mkey (dev, &mr->mmkey);if (err) goto err_dereg_mr;
drivers/infiniband/hw/mlx5/odp.c +3 -0
@@ -1816,6 +1816,9 @@ int mlx5r_odp_create_eq(struct mlx5_ib_dev *dev, struct mlx5_ib_pf_eq *eq)struct mlx5_eq_param param = {};int err =0 ; +if (!(dev->odp_caps.general_caps &IB_ODP_SUPPORT )) +return -EOPNOTSUPP ; +mutex_lock (&dev->odp_eq_mutex);if (eq->core) goto unlock;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 356/1250 configfs_depend_prep(): pass configfs_dirent instead of dentry
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
[ Upstream commit 764682e0118432260191d194edbdaff208260483 ]
Again, the only thing it uses dentry for is dentry->d_fsdata; for the recursive call the situation is the same as with configfs_detach_prep() and the same observation about ->s_dentry->d_fsdata applies.
--- fs/configfs/dir.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
fs/configfs/dir.c +4 -8
@@ -1088,15 +1088,12 @@ static int configfs_dump(struct configfs_dirent *sd, int level)* much on the stack, though, so folks that need this function - be careful * about your stack! Patches will be accepted to make it iterative. */ -static int configfs_depend_prep (struct dentry *origin, +static int configfs_depend_prep (struct configfs_dirent *sd,struct config_item *target) { -struct configfs_dirent *child_sd, *sd; +struct configfs_dirent *child_sd;int ret =0 ; -BUG_ON (!origin || !origin->d_fsdata); - sd = origin->d_fsdata; -if (sd->s_element == target)/* Boo-yah */ goto out;
@@ -1104,8 +1101,7 @@ static int configfs_depend_prep(struct dentry *origin,if ((child_sd->s_type &CONFIGFS_DIR ) && !(child_sd->s_type &CONFIGFS_USET_DROPPING ) && !(child_sd->s_type &CONFIGFS_USET_CREATING )) { - ret =configfs_depend_prep (child_sd->s_dentry, - target); + ret =configfs_depend_prep (child_sd, target);if (!ret) goto out;/* Child path boo-yah */ }
@@ -1126,7 +1122,7 @@ static int configfs_do_depend_item(struct dentry *subsys_dentry,spin_lock (&configfs_dirent_lock);/* Scan the tree, return 0 if found */ - ret =configfs_depend_prep (subsys_dentry, target); + ret =configfs_depend_prep (subsys_dentry->d_fsdata, target);if (ret) goto out_unlock_dirent_lock;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 357/1250 pds_core: quiesce DMA before freeing resources
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikhil P. Rao <[email protected]>
[ Upstream commit 6443f4f20bdae726fe01cf5946fba9742a0ffda6 ]
pdsc_teardown() frees DMA buffers but does not disable bus mastering, leaving the device able to perform DMA after the buffers are freed. This can lead to use-after-free if the device writes to freed memory.
Add pci_clear_master() to pdsc_teardown() to disable bus mastering before freeing resources, ensuring all DMA is quiesced.
Add pci_set_master() to pdsc_setup() to re-enable bus mastering, which is needed for the firmware recovery path since pdsc_teardown() now disables it.
--- drivers/net/ethernet/amd/pds_core/core.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/amd/pds_core/core.c +4 -0
@@ -455,6 +455,8 @@ int pdsc_setup(struct pdsc *pdsc, bool init) {int err; +pci_set_master (pdsc->pdev); + err =pdsc_dev_init (pdsc);if (err)return err;
@@ -487,6 +489,8 @@ void pdsc_teardown(struct pdsc *pdsc, bool removing)if (!pdsc->pdev->is_virtfn)pdsc_devcmd_reset (pdsc); +pci_clear_master (pdsc->pdev); +pdsc_core_uninit (pdsc);if (removing) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 358/1250 net: ibm: emac: mal: fix potential system hang in mal_remove()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 7c5d41f87f079990bf241359e3c1332d8d10fe87 ]
napi_disable() is not idempotent and calling it on an already-disabled or unenabled NAPI context will cause the kernel to spin indefinitely waiting for the NAPI_STATE_SCHED bit to clear.
In mal_remove(), napi_disable() is called unconditionally. If no MACs were registered, NAPI was never enabled. Also, if they were registered but subsequently unregistered, NAPI was already disabled in mal_unregister_commac(). In either case, calling napi_disable() causes the kernel to hang upon module removal.
Fix this by only calling napi_disable() in mal_remove() if the commac list is not empty (which implies NAPI is enabled).
--- drivers/net/ethernet/ibm/emac/mal.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/ibm/emac/mal.c +3 -3
@@ -710,13 +710,13 @@ static void mal_remove(struct platform_device *ofdev)MAL_DBG (mal,"remove" NL );/* Synchronize with scheduled polling */ -napi_disable (&mal->napi); - -if (!list_empty (&mal->list)) +if (!list_empty (&mal->list)) { +napi_disable (&mal->napi);/* This is *very* bad */ WARN (1 ,KERN_EMERG "mal%d: commac list is not empty on remove!\n" , mal->index); + }mal_reset (mal);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 359/1250 tls: Flush backlog before waiting for a new record
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit edcf32b8a48f5882b5b7a91b21c89d233d4aecf2 ]
While lock_sock is held, incoming TCP segments land on sk->sk_backlog rather than sk->sk_receive_queue. tls_rx_rec_wait() inspects only sk_receive_queue, so backlog data remains invisible. For non-blocking callers (read_sock, and recvmsg or splice_read with MSG_DONTWAIT) this causes a spurious -EAGAIN. For blocking callers it forces an unnecessary sleep/wakeup cycle.
Flush the backlog inside tls_rx_rec_wait() before checking sk_receive_queue so the strparser can parse newly-arrived segments immediately. On the next loop iteration tls_read_flush_backlog() may redundantly flush, but this path is cold and the cost is negligible.
Backlog processing can run tcp_reset(), which calls tcp_done_with_error() to set sk->sk_err = ECONNRESET and then tcp_done() to set sk->sk_shutdown = SHUTDOWN_MASK. The pre-existing top-of-loop sk_err check already ran before the flush, so the freshly-set error would be masked by the next-line sk_shutdown test returning 0 (EOF). Re-check sk_err immediately before the sk_shutdown test so a connection abort surfaces as -ECONNRESET rather than a clean EOF.
Commit f508262ae9f2 ("tls: Preserve sk_err across recvmsg() when data has been copied") gave the top-of-loop sk_err check a has_copied split. The recheck applies the same handling: when the caller has already copied bytes, sk_err is reported but preserved so the error surfaces on the next call; otherwise sock_error() consumes it so the error is reported exactly once.
--- net/tls/tls_sw.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
net/tls/tls_sw.c +12 -0
@@ -1418,12 +1418,24 @@ tls_rx_rec_wait(struct sock *sk, struct sk_psock *psock, bool nonblock,if (ret <0 )return ret; +if (sk_flush_backlog (sk)) + released = true;if (!skb_queue_empty (&sk->sk_receive_queue)) {tls_strp_check_rcv (&ctx->strp);if (tls_strp_msg_ready (ctx))break ; } +/* sk_flush_backlog() can run tcp_reset(), which sets +* sk_err and then sk_shutdown via tcp_done(). Recheck +* sk_err here so a connection abort surfaces as the +* actual error rather than a clean EOF. +*/ +if (sk->sk_err) { +if (has_copied) +return -READ_ONCE (sk->sk_err); +return sock_error (sk); + }if (sk->sk_shutdown &RCV_SHUTDOWN )return 0 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 360/1250 platform/x86: dell-laptop: add Inspiron N5110 to touchpad LED quirk table
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gleb Sonichev <[email protected]>
[ Upstream commit bfe91a80b13f8068f6fa07aa8c468d284150d4ad ]
The Inspiron N5110 needs the touchpad LED quirk (Vostro V130 quirk) to properly control the touchpad LED. Add its DMI identifier to the existing quirk table, next to the similar Inspiron M5110 entry.
Tested on Dell Inspiron N5110.
The touchpad LED works correctly with this quirk enabled.
--- drivers/platform/x86/dell/dell-laptop.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/platform/x86/dell/dell-laptop.c +9 -0
@@ -222,6 +222,15 @@ static const struct dmi_system_id dell_quirks[] __initconst = { }, .driver_data = &quirk_dell_vostro_v130, }, + { + .callback = dmi_matched, + .ident = "Dell Inspiron N5110", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron N5110"), + }, + .driver_data = &quirk_dell_vostro_v130, + }, { .callback = dmi_matched, .ident = "Dell Vostro 3360",
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 361/1250 wifi: mt76: mt7925: handle 320MHz bandwidth in RXV and TXS
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javier Tia <[email protected]>
[ Upstream commit 2237b7b332990f135c1f1550b45ac77b29bcbf7b ]
The RX vector (RXV) and TX status (TXS) parsing in mac.c lack handling for 320MHz channel width. When the hardware reports 320MHz in the bandwidth field, mt7925_mac_fill_rx_rate() returns -EINVAL and mt7925_mac_add_txs_skb() records no bandwidth stats.
Add IEEE80211_STA_RX_BW_320 cases to both functions. The RXV parser also handles BW_320+1 since the hardware can report 320MHz in two adjacent encoding positions.
--- drivers/net/wireless/mediatek/mt76/mt7925/mac.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7925/mac.c +9 -0
@@ -338,6 +338,11 @@ mt7925_mac_fill_rx_rate(struct mt792x_dev *dev,case IEEE80211_STA_RX_BW_160 : status->bw =RATE_INFO_BW_160 ;break ; +/* RXV can report 320 in two positions */ +case IEEE80211_STA_RX_BW_320 : +case IEEE80211_STA_RX_BW_320 +1 : + status->bw =RATE_INFO_BW_320 ; +break ;default :return -EINVAL ; }
@@ -995,6 +1000,10 @@ mt7925_mac_add_txs_skb(struct mt792x_dev *dev, struct mt76_wcid *wcid, stats->tx_mode[mode]++;switch (FIELD_GET (MT_TXS0_BW , txs)) { +case IEEE80211_STA_RX_BW_320 : + rate.bw =RATE_INFO_BW_320 ; + stats->tx_bw[4 ]++; +break ;case IEEE80211_STA_RX_BW_160 : rate.bw =RATE_INFO_BW_160 ; stats->tx_bw[3 ]++;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 362/1250 platform/x86: msi-ec: Add support for MSI Pulse GL66 12th Gen
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luis de Carlos <[email protected]>
[ Upstream commit ab7be7ed913086e076bfd8aba79f614f415cd6dc ]
Add the firmware string '1583EMS1.109' to the ALLOWED_FW_10 array. This enables Embedded Controller support, including battery charge thresholds, for the MSI Pulse GL66 12UEK (MS-1583) laptop.
--- drivers/platform/x86/msi-ec.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/x86/msi-ec.c +1 -0
@@ -823,6 +823,7 @@ static struct msi_ec_conf CONF9 __initdata = {static const char *const ALLOWED_FW_10 []__initconst = {"1582EMS1.107" ,// GF66 11UC +"1583EMS1.109" ,// Pulse GL66 12UEK NULL };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 363/1250 wifi: mt76: mt7925: add Netgear A8500 USB device ID
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Devin Wittmayer <[email protected]>
[ Upstream commit 291b067a02b9c1fd272057ebf47c365260955fd2 ]
Add USB device ID for the Netgear A8500 (0846:9050) which uses the mt7925 chipset.
--- drivers/net/wireless/mediatek/mt76/mt7925/usb.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7925/usb.c +3 -0
@@ -12,6 +12,9 @@static const struct usb_device_id mt7925u_device_table[] = { {USB_DEVICE_AND_INTERFACE_INFO (0x0e8d ,0x7925 ,0xff ,0xff ,0xff ), .driver_info = (kernel_ulong_t )MT7925_FIRMWARE_WM }, +/* Netgear, Inc. A8500 */ + {USB_DEVICE_AND_INTERFACE_INFO (0x0846 ,0x9050 ,0xff ,0xff ,0xff ), + .driver_info = (kernel_ulong_t )MT7925_FIRMWARE_WM },/* Netgear, Inc. A9000 */ {USB_DEVICE_AND_INTERFACE_INFO (0x0846 ,0x9072 ,0xff ,0xff ,0xff ), .driver_info = (kernel_ulong_t )MT7925_FIRMWARE_WM },
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 364/1250 wifi: mt76: mt7925: populate EHT 320MHz MCS map in sta_rec
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javier Tia <[email protected]>
[ Upstream commit e7bbd3d8b4f01473676da3aa8be17099e1604459 ]
The sta_rec_eht structure has a mcs_map_bw320 field, and the channel width mapping includes NL80211_CHAN_WIDTH_320, but the 320MHz MCS/NSS map was never copied from the station's EHT capabilities to the MCU TLV. This prevents negotiation of 320MHz channel width even when both the hardware and firmware advertise support for it.
Add the missing memcpy for the 320MHz MCS map, matching the existing pattern for BW20, BW80, and BW160.
--- drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +1 -0
@@ -1690,6 +1690,7 @@ mt7925_mcu_sta_eht_tlv(struct sk_buff *skb, struct ieee80211_link_sta *link_sta)memcpy (eht->mcs_map_bw20, &mcs_map->only_20mhz,sizeof (eht->mcs_map_bw20));memcpy (eht->mcs_map_bw80, &mcs_map->bw._80,sizeof (eht->mcs_map_bw80));memcpy (eht->mcs_map_bw160, &mcs_map->bw._160,sizeof (eht->mcs_map_bw160)); +memcpy (eht->mcs_map_bw320, &mcs_map->bw._320,sizeof (eht->mcs_map_bw320)); } static void
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 365/1250 wifi: mt76: mt7925: add 320MHz bandwidth to bss_rlm_tlv
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javier Tia <[email protected]>
[ Upstream commit efc9a10d1de1763baecd2031c1c6dfe6aac9ac38 ]
bss_rlm_tlv() in mt7925_mcu_bss_rlm_tlv() has no case for NL80211_CHAN_WIDTH_320. When associated to a 320MHz BSS, the switch falls through to default and sends bw=0 (CMD_CBW_20MHZ) to firmware via BSS_RLM TLV. Firmware then configures the RX radio for 20MHz and cannot decode the AP's 320MHz frames, resulting in complete data path failure at 320MHz.
Add the missing NL80211_CHAN_WIDTH_320 case with CMD_CBW_320MHZ and center_chan2.
Tested on ASUS RT-BE92U: 320MHz throughput goes from 0 Mbps to 841 Mbps (iperf3 -t30 -P8), PHY 4803 Mbps EHT-MCS11.
--- drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +4 -0
@@ -2339,6 +2339,10 @@ void mt7925_mcu_bss_rlm_tlv(struct sk_buff *skb, struct mt76_phy *phy,case NL80211_CHAN_WIDTH_160 : req->bw =CMD_CBW_160MHZ ;break ; +case NL80211_CHAN_WIDTH_320 : + req->bw =CMD_CBW_320MHZ ; + req->center_chan2 =ieee80211_frequency_to_channel (freq2); +break ;case NL80211_CHAN_WIDTH_5 : req->bw =CMD_CBW_5MHZ ;break ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 366/1250 wifi: mt76: transform aspm_conf for pci_disable_link_state
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiajia Liu <[email protected]>
[ Upstream commit 2dd78856223484895306351df1f903a4b75d213f ]
commit b478e162f227 ("PCI/ASPM: Consolidate link state defines") changed PCIE_LINK_STATE_L0S (1) to (BIT(0) | BIT(1)). PCI_EXP_LNKCTL_ASPM_L0S (1) and PCI_EXP_LNKCTL_ASPM_L1 (2) are no longer matched with PCIE_LINK_STATE_L0S (3) and PCIE_LINK_STATE_L1 (4).
On the platform enabling ASPM L0s and L1, mt76_pci_disable_aspm is not able to disable L1. Fix this by transforming aspm_conf to pcie link state.
--- drivers/net/wireless/mediatek/mt76/pci.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/pci.c +7 -1
@@ -30,8 +30,14 @@ void mt76_pci_disable_aspm(struct pci_dev *pdev)if (IS_ENABLED (CONFIG_PCIEASPM )) {int err; +int state =0 ; - err =pci_disable_link_state (pdev, aspm_conf); +if (aspm_conf &PCI_EXP_LNKCTL_ASPM_L0S ) + state |=PCIE_LINK_STATE_L0S ; +if (aspm_conf &PCI_EXP_LNKCTL_ASPM_L1 ) + state |=PCIE_LINK_STATE_L1 ; + + err =pci_disable_link_state (pdev, state);if (!err)return ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 367/1250 netconsole: take target_cleanup_list_lock in drop_netconsole_target()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit 91aeb87f052367a5a2743cc93777dfb4386f2f14 ]
drop_netconsole_target() unlinks the target while only holding target_list_lock. However, when the underlying interface has been unregistered, netconsole_netdev_event() moves the target from target_list to target_cleanup_list, and netconsole_process_cleanups_core() walks that list under target_cleanup_list_lock only.
If a user removes the configfs target at the same time the cleanup worker is iterating target_cleanup_list, list_del() can corrupt the list because the two paths take disjoint locks while operating on the same list node.
Acquire target_cleanup_list_lock around the list_del() so the unlink is serialised against netconsole_process_cleanups_core() regardless of which list the target currently belongs to. The state transition that downgrades STATE_DEACTIVATED to STATE_DISABLED is left intact and is performed under the same combined locking, preserving the existing ordering with resume_target().
--- drivers/net/netconsole.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/netconsole.c +2 -0
@@ -1326,9 +1326,11 @@ static void drop_netconsole_target(struct config_group *group,unsigned long flags;struct netconsole_target *nt =to_target (item); +mutex_lock (&target_cleanup_list_lock);spin_lock_irqsave (&target_list_lock, flags);list_del (&nt->list);spin_unlock_irqrestore (&target_list_lock, flags); +mutex_unlock (&target_cleanup_list_lock);/* * The target may have never been enabled, or was manually disabled
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 368/1250 btrfs: protect sb_write_pointer() with invalidate lock
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: KangNing Liao <[email protected]>
[ Upstream commit 123b9a545f4d0348e81f558a032bf2a93ee5722f ]
sb_write_pointer() reads the super block from the block device page cache using read_cache_page_gfp(). This has the same race with BLKBSZSET as the one fixed by commit 3f29d661e568 ("btrfs: sync read disk super and set block size").
Take the mapping invalidate lock around read_cache_page_gfp() to serialize the read against block size changes.
--- fs/btrfs/zoned.c | 2 ++ 1 file changed, 2 insertions(+)
fs/btrfs/zoned.c +2 -0
@@ -130,8 +130,10 @@ static int sb_write_pointer(struct block_device *bdev, struct blk_zone *zones,u64 bytenr =ALIGN_DOWN (zone_end,BTRFS_SUPER_INFO_SIZE ) -BTRFS_SUPER_INFO_SIZE ; +filemap_invalidate_lock (mapping); page[i] =read_cache_page_gfp (mapping, bytenr >>PAGE_SHIFT ,GFP_NOFS ); +filemap_invalidate_unlock (mapping);if (IS_ERR (page[i])) {if (i ==1 )btrfs_release_disk_super (super[0 ]);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 369/1250 fbcon: dont suspend/resume when vc is graphics mode
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lu Yao <[email protected]>
[ Upstream commit 70d9d5f5fcd940f627bd403aaa6f65de724eef6b ]
Don't need to do suspend/resume for fbcon in graphic mode.
Doing this may cause error, eg:
At the beginning, starting the Xorg with single screen and then an external screen was plugged in. After logging out in Xorg, fbdev info may using screen which is connected later on for info always using first connected connector in list in func 'drm_setup_crtcs_fb'. Then, S3 executed, fbcon found that the information did not match and do atomic to switch fb. However, Xorg will not re-bind the crtc fb but continues doing ioctl. At this time, the fb is incorrect.
With some modifications by Helge Deller.
--- drivers/video/fbdev/core/fbcon.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/video/fbdev/core/fbcon.c +6 -3
@@ -2657,8 +2657,9 @@ void fbcon_suspended(struct fb_info *info)return ; vc = vc_cons[par->currcon].d; -/* Clear cursor, restore saved data */ -fbcon_cursor (vc, false); +/* Clear cursor, restore saved data when in text mode */ +if ((vc->vc_mode ==KD_TEXT ) &&con_is_visible (vc)) +fbcon_cursor (vc, false); }void fbcon_resumed (struct fb_info *info)
@@ -2670,7 +2671,9 @@ void fbcon_resumed(struct fb_info *info)return ; vc = vc_cons[par->currcon].d; -update_screen (vc); +/* Update screen when in text mode only */ +if ((vc->vc_mode ==KD_TEXT ) &&con_is_visible (vc)) +update_screen (vc); }static void fbcon_modechanged (struct fb_info *info)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 370/1250 PCI: Avoid FLR for MediaTek MT7925 WiFi
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jose Ignacio Tornos Martinez <[email protected]>
[ Upstream commit 9f22b92259bb5ac43e2b9007103787d4418fec56 ]
The MediaTek MT7925 WiFi device advertises FLR capability, but it does not work correctly. This manifests in VFIO passthrough scenarios. Normal VM operation works fine, including clean shutdown/reboot. However, when the VM terminates uncleanly (crash, force-off), VFIO attempts to reset the device before it can be assigned to another VM. Because FLR is broken, the reset fails, preventing reuse.
This is similar to its predecessor MT7922 (see 81f64e925c29 ("PCI: Avoid FLR for Mediatek MT7922 WiFi")), but with different symptoms. The MT7922 issue manifests as config read failures (returning ~0) after FLR. The MT7925 shows different behavior: config reads work correctly after FLR, but firmware communication fails.
First VM start with MT7925 works fine:
mt7925e 0000:08:00.0: ASIC revision: 79250000
mt7925e 0000:08:00.0: WM Firmware Version: ____000000, Build Time: 20260106153120
After force reset or VM crash, when VFIO attempts FLR to reset the device for reassignment, firmware initialization fails:
mt7925e 0000:08:00.0: ASIC revision: 79250000 mt7925e 0000:08:00.0: Message 00000010 (seq 1) timeout mt7925e 0000:08:00.0: Failed to get patch semaphore [Repeats with increasing sequence numbers 2-10] mt7925e 0000:08:00.0: hardware init failed
The driver cannot acquire the patch semaphore needed for firmware initialization, indicating that FLR does not properly reset the firmware state. The device remains in this broken state until physical power cycle.
Disable FLR for MT7925 so the PCI core falls back to other reset methods, e.g., Secondary Bus Reset, which successfully resets the device and allows reinitialization for VFIO passthrough reuse.
--- drivers/pci/quirks.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pci/quirks.c +2 -0
@@ -5567,6 +5567,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x443, quirk_intel_qat_vf_cap);* Intel 82579LM Gigabit Ethernet Controller 0x1502 * Intel 82579V Gigabit Ethernet Controller 0x1503 * Mediatek MT7922 802.11ax PCI Express Wireless Network Adapter +* Mediatek MT7925 802.11be PCI Express Wireless Network Adapter */ static void quirk_no_flr (struct pci_dev *dev) {
@@ -5579,6 +5580,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AMD, 0x7901, quirk_no_flr);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0x1502 , quirk_no_flr);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_INTEL ,0x1503 , quirk_no_flr);DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_MEDIATEK ,0x0616 , quirk_no_flr); +DECLARE_PCI_FIXUP_EARLY (PCI_VENDOR_ID_MEDIATEK ,0x7925 , quirk_no_flr);/* FLR may cause the SolidRun SNET DPU (rev 0x1) to hang */ static void quirk_no_flr_snet (struct pci_dev *dev)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 371/1250 hwmon: (raspberrypi) Fix delayed-work teardown race
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shubham Chakraborty <[email protected]>
[ Upstream commit eb0d491e2787aa359f0d930151ff6e5e5df70fb9 ]
The delayed polling work rearms itself from the work function, so use explicit delayed-work setup and cleanup instead of devm_delayed_work_autocancel().
Initialize the delayed work with INIT_DELAYED_WORK() and register a devres cleanup action that calls disable_delayed_work_sync() during teardown.
This addresses the concern raised during review about the polling work being able to requeue itself while the driver is being removed.
--- drivers/hwmon/raspberrypi-hwmon.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/hwmon/raspberrypi-hwmon.c +9 -3
@@ -7,7 +7,6 @@* Copyright (C) 2018 Stefan Wahren <[email protected]> */ #include <linux/device.h> -#include <linux/devm-helpers.h> #include <linux/err.h> #include <linux/hwmon.h> #include <linux/module.h>
@@ -72,6 +71,13 @@ static void get_values_poll(struct work_struct *work)schedule_delayed_work (&data->get_values_poll_work,2 *HZ ); } +static void rpi_hwmon_cancel_poll_work (void *res) +{ +struct rpi_hwmon_data *data = res; + +disable_delayed_work_sync (&data->get_values_poll_work); +} +static int rpi_read (struct device *dev,enum hwmon_sensor_types type,u32 attr,int channel,long *val) {
@@ -117,8 +123,8 @@ static int rpi_hwmon_probe(struct platform_device *pdev)if (IS_ERR (data->hwmon_dev))return PTR_ERR (data->hwmon_dev); - ret =devm_delayed_work_autocancel (dev, &data->get_values_poll_work, - get_values_poll); +INIT_DELAYED_WORK (&data->get_values_poll_work, get_values_poll); + ret =devm_add_action_or_reset (dev, rpi_hwmon_cancel_poll_work, data);if (ret)return ret;platform_set_drvdata (pdev, data);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 372/1250 hwmon: (adt7462) Add of_match_table to support devicetree
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kory Maincent <[email protected]>
[ Upstream commit cd1b42617aafe01810ab7d3b9948d2f5fa9fb8af ]
Add of_match_table to add support of devicetree probing.
--- drivers/hwmon/adt7462.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/hwmon/adt7462.c +8 -0
@@ -12,6 +12,7 @@#include <linux/hwmon.h> #include <linux/hwmon-sysfs.h> #include <linux/err.h> +#include <linux/mod_devicetable.h> #include <linux/mutex.h> #include <linux/log2.h> #include <linux/slab.h>
@@ -1814,10 +1815,17 @@ static const struct i2c_device_id adt7462_id[] = { };MODULE_DEVICE_TABLE (i2c, adt7462_id); +static const struct of_device_id adt7462_of_match[] = { + { .compatible ="onnn,adt7462" }, + { }, +}; +MODULE_DEVICE_TABLE (of, adt7462_of_match); +static struct i2c_driver adt7462_driver = { .class =I2C_CLASS_HWMON , .driver = { .name ="adt7462" , + .of_match_table = adt7462_of_match, }, .probe = adt7462_probe, .id_table = adt7462_id,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 373/1250 btrfs: use on-disk uuid for s_uuid in temp_fsid mounts
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anand Jain <[email protected]>
[ Upstream commit df84f6c773771fa7b78fe06931709df1aca5907f ]
When mounting a cloned filesystem with a temporary fsuuid (temp_fsid), layered modules like overlayfs require a persistent identifier.
While internal in-memory fs_devices->fsid must remain unique to the kernel module, let s_uuid carry the original on-disk UUID.
--- fs/btrfs/disk-io.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
fs/btrfs/disk-io.c +10 -1
@@ -3430,7 +3430,16 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device/* Update the values for the current filesystem. */ sb->s_blocksize = sectorsize; sb->s_blocksize_bits =blksize_bits (sectorsize); -memcpy (&sb->s_uuid, fs_info->fs_devices->fsid,BTRFS_FSID_SIZE ); +/* +* When temp_fsid is active, fs_devices->fsid is assigned a random UUID +* at mount. This inconsistent UUID causes issues for layered filesystems +* like OverlayFS. Since metadata_uuid may or may not be set, provide the +* on-disk UUID directly from the super_copy. +*/ +if (fs_info->fs_devices->temp_fsid) +memcpy (&sb->s_uuid, fs_info->super_copy->fsid,BTRFS_FSID_SIZE ); +else +memcpy (&sb->s_uuid, fs_info->fs_devices->fsid,BTRFS_FSID_SIZE );mutex_lock (&fs_info->chunk_mutex); ret =btrfs_read_sys_array (fs_info);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 374/1250 btrfs: use lockless read in nr_cached_objects shrinker callback
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Maurer <[email protected]>
[ Upstream commit 1ba72d847c7aa3c0887f749115af5232fd61b598 ]
Under heavy memcg-driven slab reclaim with many memcgs and CPUs, shrink_slab_memcg() invokes the per-superblock count callback once per (memcg, NUMA node) tuple. For btrfs that callback reaches percpu_counter_sum_positive() on fs_info->evictable_extent_maps, which takes the percpu_counter's raw spinlock with IRQs disabled and walks every online CPU. With hundreds of memcgs driving reclaim on a host with dozens of CPUs, this counter lock becomes a global serialization point:
profiles show CPU pinned in the spin_lock_irqsave acquire under __percpu_counter_sum, with cross-CPU IPIs hitting csd_lock_wait_toolong while waiting for spinning vCPUs.
The shrinker count is advisory -- super_cache_count() already notes "counts can change between super_cache_count and super_cache_scan, so we really don't need locks here." Use percpu_counter_read_positive(), which is lockless. Worst-case skew is bounded by batch * num_online_cpus (a few thousand), negligible compared to the millions of extent maps a busy filesystem accumulates and well within the noise that the shrinker already tolerates.
--- fs/btrfs/super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/super.c +1 -1
@@ -2410,7 +2410,7 @@ static int btrfs_show_devname(struct seq_file *m, struct dentry *root)static long btrfs_nr_cached_objects (struct super_block *sb,struct shrink_control *sc) {struct btrfs_fs_info *fs_info =btrfs_sb (sb); -const s64 nr =percpu_counter_sum_positive (&fs_info->evictable_extent_maps); +const s64 nr =percpu_counter_read_positive (&fs_info->evictable_extent_maps);trace_btrfs_extent_map_shrinker_count (fs_info, nr);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 375/1250 net: dsa: qca8k: Add support for force mode for fixed link topology
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: George Moussalem <[email protected]>
[ Upstream commit e0a77b1ed9001bdd0c73b99c67abb90f4bd7d7f5 ]
A fixed link topology is commonly used to connect this switch (on port 0 or 6) to a SoC's MAC over SGMII. When inband negotiation is not used, the switch needs to be configured to operate in force mode. As such, enable support for force mode.
--- drivers/net/dsa/qca/qca8k-8xxx.c | 22 ++++++++++++++++------ drivers/net/dsa/qca/qca8k.h | 1 + 2 files changed, 17 insertions(+), 6 deletions(-)
drivers/net/dsa/qca/qca8k-8xxx.c +16 -6
@@ -1538,7 +1538,7 @@ static int qca8k_pcs_config(struct phylink_pcs *pcs, unsigned int neg_mode, {struct qca8k_priv *priv =pcs_to_qca8k_pcs (pcs)->priv;int cpu_port_index, ret, port; -u32 reg, val; +u32 mask, reg, val; port =pcs_to_qca8k_pcs (pcs)->port;switch (port) {
@@ -1611,11 +1611,21 @@ static int qca8k_pcs_config(struct phylink_pcs *pcs, unsigned int neg_mode,if (priv->ports_config.sgmii_tx_clk_falling_edge) val |=QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE ; -if (val) - ret =qca8k_rmw (priv, reg, -QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE | -QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE , - val); + mask = (val) ? (QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE | +QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE ) :0 ; + +/* +* (Un)set force mode on QCA8337 only, don't include it in the mask for +* others. It is written to the PORT0 PAD register for both port 0 and 6. +*/ +if (priv->switch_id ==QCA8K_ID_QCA8337 ) { +if (neg_mode ==PHYLINK_PCS_NEG_OUTBAND ) + val |=QCA8K_PORT_PAD_SGMII_FORCE_MODE ; + mask |=QCA8K_PORT_PAD_SGMII_FORCE_MODE ; + } + +if (mask) + ret =qca8k_rmw (priv, reg, mask, val);return 0 ; }
drivers/net/dsa/qca/qca8k.h +1 -0
@@ -58,6 +58,7 @@#define QCA8K_PORT_PAD_RGMII_TX_DELAY_EN BIT(25)#define QCA8K_PORT_PAD_RGMII_RX_DELAY_EN BIT(24)#define QCA8K_PORT_PAD_SGMII_EN BIT(7) +#define QCA8K_PORT_PAD_SGMII_FORCE_MODE BIT(3)#define QCA8K_REG_PWS 0x010#define QCA8K_PWS_POWER_ON_SEL BIT(31)/* This reg is only valid for QCA832x and toggle the package
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 376/1250 net: lan966x: restore RX state on reload failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guangshuo Li <[email protected]>
[ Upstream commit aa97f11a76e545ed73cc455bcdd1ece4b480b507 ]
lan966x_fdma_reload() backs up rx->page_pool and rx->fdma before reallocating the RX resources for the new MTU. If the allocation fails, the restore path puts these fields back before restarting RX.
However, the reload path also updates rx->page_order and rx->max_mtu before calling lan966x_fdma_rx_alloc(). These fields are not restored on failure, so RX can be restarted with the old pages, old FDMA state and old page pool, but with the page geometry from the failed new MTU.
This can make the XDP path advertise a frame size derived from the new page_order while the actual RX pages still come from the old allocation. For example, after a failed reload to a jumbo MTU, xdp_init_buff() may be called with a frame size larger than the restored RX pages.
lan966x_fdma_rx_alloc_page_pool() also registers the newly allocated page pool with each port's XDP RXQ before fdma_alloc_coherent() is called. If fdma_alloc_coherent() fails, the new page pool is destroyed, but the rollback path does not restore the per-port XDP RXQ mem model registration either.
Save and restore rx->page_order and rx->max_mtu, and restore the old page pool registration for each port's XDP RXQ before RX is started again. This keeps the restored RX state consistent after a failed reload.
--- .../ethernet/microchip/lan966x/lan966x_fdma.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+)
drivers/net/ethernet/microchip/lan966x/lan966x_fdma.c +20 -0
@@ -816,6 +816,7 @@ static int lan966x_fdma_reload(struct lan966x *lan966x, int new_mtu)struct page *(*old_pages)[FDMA_RX_DCB_MAX_DBS ];struct page_pool *page_pool;struct fdma fdma_rx_old; +int page_order, max_mtu;int err, i, j; old_pages = kmemdup(lan966x->rx.page, sizeof(lan966x->rx.page),
@@ -826,6 +827,8 @@ static int lan966x_fdma_reload(struct lan966x *lan966x, int new_mtu)/* Store these for later to free them */ memcpy (&fdma_rx_old, &lan966x->rx.fdma,sizeof (struct fdma )); page_pool = lan966x->rx.page_pool; + page_order = lan966x->rx.page_order; + max_mtu = lan966x->rx.max_mtu;napi_synchronize (&lan966x->napi);napi_disable (&lan966x->napi);
@@ -855,7 +858,24 @@ static int lan966x_fdma_reload(struct lan966x *lan966x, int new_mtu)return 0 ; restore: lan966x->rx.page_pool = page_pool; + lan966x->rx.page_order = page_order; + lan966x->rx.max_mtu = max_mtu;memcpy (&lan966x->rx.fdma, &fdma_rx_old,sizeof (struct fdma )); +/* +* lan966x_fdma_rx_alloc_page_pool() registered the new pool with +* each port's XDP RXQ before the allocation failed. The new pool is +* destroyed by lan966x_fdma_rx_alloc(), so restore the old pool's +* registration before restarting RX. +*/ +for (i =0 ; i < lan966x->num_phys_ports; i++) { +if (!lan966x->ports[i]) +continue ; + +xdp_rxq_info_unreg_mem_model (&lan966x->ports[i]->xdp_rxq); +xdp_rxq_info_reg_mem_model (&lan966x->ports[i]->xdp_rxq, +MEM_TYPE_PAGE_POOL , page_pool); + } +lan966x_fdma_rx_start (&lan966x->rx);lan966x_fdma_wakeup_netdev (lan966x);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 377/1250 vdpa/ifcvf: handle dev_set_name() failure in ifcvf_vdpa_dev_add()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Evgenii Burenchev <[email protected]>
[ Upstream commit 4c653e85857b41a7148917f2628fae1d04a9c251 ]
dev_set_name() may fail and return an error, but its return value is currently ignored and overwritten by _vdpa_register_device().
Abort device creation if dev_set_name() fails and release the device reference to avoid continuing with an improperly initialized struct device.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
Message-ID: <[email protected]>
--- drivers/vdpa/ifcvf/ifcvf_main.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/vdpa/ifcvf/ifcvf_main.c +9 -2
@@ -734,15 +734,22 @@ static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name, ret =dev_set_name (&vdpa_dev->dev,"%s" , name); else ret =dev_set_name (&vdpa_dev->dev,"vdpa%u" , vdpa_dev->index); +if (ret) { +IFCVF_ERR (pdev,"Failed to set device name" ); + goto err; + } ret =_vdpa_register_device (&adapter->vdpa, vf->nr_vring);if (ret) { -put_device (&adapter->vdpa.dev);IFCVF_ERR (pdev,"Failed to register to vDPA bus" ); -return ret; + goto err; }return 0 ; + +err: +put_device (&adapter->vdpa.dev); +return ret; }static void ifcvf_vdpa_dev_del (struct vdpa_mgmt_dev *mdev,struct vdpa_device *dev)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 378/1250 vdpa/octeon_ep: Use 4 bytes for mailbox signature
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vamsi Attunuru <[email protected]>
[ Upstream commit d42eadf7969e2217fceb84317d3fd28a7bdbd96e ]
The upper 4 bytes are reserved by the firmware for storing meta data. Use only lower 4 bytes to update the signature details.
Message-ID: <[email protected]>
--- drivers/vdpa/octeon_ep/octep_vdpa_main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/vdpa/octeon_ep/octep_vdpa_main.c +3 -3
@@ -582,10 +582,10 @@ static const struct vdpa_mgmtdev_ops octep_vdpa_mgmt_dev_ops = {static bool get_device_ready_status (u8 __iomem *addr) { -u64 signature =readq (addr +OCTEP_VF_MBOX_DATA (0 )); +u32 signature =readl (addr +OCTEP_VF_MBOX_DATA (0 ));if (signature ==OCTEP_DEV_READY_SIGNATURE ) { -writeq (0 , addr +OCTEP_VF_MBOX_DATA (0 )); +writel (0 , addr +OCTEP_VF_MBOX_DATA (0 ));return true; }
@@ -757,7 +757,7 @@ static int octep_sriov_enable(struct pci_dev *pdev, int num_vfs) rpvf =FIELD_GET (GENMASK_ULL (35 ,32 ), val);if (done) {for (i =0 ; i < pf->enabled_vfs; i++) -writeq (OCTEP_DEV_READY_SIGNATURE , addr +OCTEP_PF_MBOX_DATA (i * rpvf)); +writel (OCTEP_DEV_READY_SIGNATURE , addr +OCTEP_PF_MBOX_DATA (i * rpvf)); }return num_vfs;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 379/1250 ALSA: hda/realtek: Add quirk for HP 255 15.6 inch G9 Notebook PC
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Furst Blumier <[email protected]>
[ Upstream commit 98e157916f83c26a41448267180944048d2f1460 ]
The HP 255 15.6 inch G9 Notebook PC (PCI SSID 103c:8a1b) uses the ALC236 codec but lacks an entry in the quirk table, causing the kernel to fall back to a null SSID match (103c:0000) and skip the necessary fixup. Add a quirk entry using ALC236_FIXUP_HP_MUTE_LED_COEFBIT2, matching the HP 255 G8 which uses the same codec and fixup. This fixes the mute-button LED and fixes an issue with unplugging and replugging a headset jack not being recognized as an audio sink.
--- sound/hda/codecs/realtek/alc269.c | 1 + 1 file changed, 1 insertion(+)
sound/hda/codecs/realtek/alc269.c +1 -0
@@ -6842,6 +6842,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x103c ,0x8a05 ,"HP Dragonfly Folio G3 2-in-1" ,ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8a06 ,"HP Dragonfly Folio G3 2-in-1" ,ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8a0f ,"HP Pavilion 14-ec1xxx" ,ALC287_FIXUP_HP_GPIO_LED ), +SND_PCI_QUIRK (0x103c ,0x8a1b ,"HP 255 15.6 inch G9 Notebook PC" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ),SND_PCI_QUIRK (0x103c ,0x8a1f ,"HP Laptop 14s-dr5xxx" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ),SND_PCI_QUIRK (0x103c ,0x8a20 ,"HP Laptop 15s-fq5xxx" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ), SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 380/1250 ALSA: hda/realtek: Add quirk for Lenovo Yoga Pro 7 14IRH8
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Moritz Baron <[email protected]>
[ Upstream commit 853e10ec445984e99b3c7f6375f4e185614b842a ]
The Lenovo Yoga Pro 7 14IRH8 (ALC287 codec, subsystem ID 0x17aa:0x38b1) has bass speakers on pin 0x17 that are not routed through a DAC with volume control. This causes the bass speakers to play at full volume regardless of the volume slider position.
Apply ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN which corrects the DAC routing for pin 0x17, enabling proper volume control. This is the same fix used for other Yoga Pro 7 models with identical audio topology (14APH8, 14AHP9, 14ASP10, 14IAH10).
--- sound/hda/codecs/realtek/alc269.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/hda/codecs/realtek/alc269.c +4 -0
@@ -7439,6 +7439,10 @@ static const struct hda_quirk alc269_fixup_tbl[] = {HDA_CODEC_QUIRK (0x17aa ,0x38cf ,"Lenovo Yoga Pro 7 14IMH9" ,ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN ),SND_PCI_QUIRK (0x17aa ,0x3847 ,"Legion 7 16ACHG6" ,ALC287_FIXUP_LEGION_16ACHG6 ),SND_PCI_QUIRK (0x17aa ,0x384a ,"Lenovo Yoga 7 15ITL5" ,ALC287_FIXUP_YOGA7_14ITL_SPEAKERS ), +/* Yoga Pro 7 14IRH8 shares PCI SSID 17aa:3852 with Yoga 7 14ITL5; +* use codec SSID to distinguish them +*/ +HDA_CODEC_QUIRK (0x17aa ,0x38b1 ,"Lenovo Yoga Pro 7 14IRH8" ,ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN ),SND_PCI_QUIRK (0x17aa ,0x3852 ,"Lenovo Yoga 7 14ITL5" ,ALC287_FIXUP_YOGA7_14ITL_SPEAKERS ),SND_PCI_QUIRK (0x17aa ,0x3853 ,"Lenovo Yoga 7 15ITL5" ,ALC287_FIXUP_YOGA7_14ITL_SPEAKERS ), SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 381/1250 ata: libata-pmp: add JMicron JMS562 quirk
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Rao <[email protected]>
[ Upstream commit c62aff1174cf88e10716c7513702443c47551fc6 ]
JMicron JMS562, as used in QNAP QDA-A2AR RAID1 adapters, may keep the exported ATA device not ready while the array is rebuilding.
In this state, libata may repeatedly try to softreset and classify the fan-out link. On the affected adapter, this can time out, make PMP/SCR access fail, and eventually disable the fan-out link before the RAID volume is exported.
A failing boot shows the fan-out link failing SRST, PMP access timing out, SCR read failing, and the link being disabled:
ata4.00: softreset failed (device not ready) ata4.15: qc timeout after 3000 msecs (cmd 0xe4) ata4.00: failed to read SCR 0 (Emask=0x4) ata4.00: failed to recover link after 3 tries, disabling
After that, the root filesystem on the exported RAID volume cannot be found.
Add JMS562 to the existing JMicron PMP quirk that disables LPM, avoids softreset on fan-out links, and assumes an ATA device. This prevents libata from dropping the exported RAID volume during rebuild recovery.
--- drivers/ata/libata-pmp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/ata/libata-pmp.c +6 -1
@@ -457,8 +457,13 @@ static void sata_pmp_quirks(struct ata_port *ap)* otherwise. Don't try hard to recover it. */ ap->pmp_link[ap->nr_pmp_links -1 ].flags |=ATA_LFLAG_NO_RETRY ; - }else if (vendor ==0x197b && (devid ==0x2352 || devid ==0x0325 )) { + }else if (vendor ==0x197b && + (devid ==0x0562 || devid ==0x2352 || devid ==0x0325 )) {/* +* 0x0562: JMicron JMS562, as used in QNAP QDA-A2AR RAID1 +* adapters. The exported device may stay not ready +* while the array is rebuilding, and SRST/classify can +* time out before the RAID volume is exported. * 0x2352: found in Thermaltake BlackX Duet, jmicron JMB350? * 0x0325: jmicron JMB394. */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 382/1250 platform/x86: intel-hid: Add HP ProBook x360 440 G1 to button_array_table
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikolay Metchev <[email protected]>
[ Upstream commit c39023ca9a447f09c072080efc84d6874c2275c9 ]
The volume rocker buttons on the HP ProBook x360 440 G1 convertible emit events 0xc4-0xc7 via the intel-hid ACPI device (INT33D5). These codes are only present in intel_array_keymap, which is used when the "5 button array" input device exists. On this machine button_array_present() returns false because the firmware does not advertise the array through the HEBC method, so notify_handler() routes the events to a NULL priv->array and they are dropped as "unknown event 0xc4". As a result the side volume keys do nothing.
Add the machine to button_array_table so the array device is created and the volume rocker emits KEY_VOLUMEUP / KEY_VOLUMEDOWN. This is equivalent to booting with the enable_5_button_array=1 module parameter, which was used to confirm the fix on the affected hardware.
--- drivers/platform/x86/intel/hid.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/platform/x86/intel/hid.c +7 -0
@@ -158,6 +158,13 @@ static const struct dmi_system_id button_array_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "Surface Go 4"), }, }, + { + .ident = "HP ProBook x360 440 G1", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "HP"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook x360 440 G1"), + }, + }, { } };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 383/1250 nvme-fc: Do not cancel requests in io target before it is initialized
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mohamed Khalfella <[email protected]>
[ Upstream commit ee38469f88492df99e1d97f03aa40ecfd218934f ]
A new nvme-fc controller in CONNECTING state sees admin request timeout schedules ctrl->ioerr_work to abort inflight requests. This ends up calling __nvme_fc_abort_outstanding_ios() which aborts requests in both admin and io tagsets. In case fc_ctrl->tag_set was not initialized we see the warning below. This is because ctrl.queue_count is initialized early in nvme_fc_alloc_ctrl().
nvme nvme0: NVME-FC{0}: starting error recovery Connectivity Loss
INFO: trying to register non-static key.
The code is fine but needs lockdep annotation, or maybe lpfc 0000:ab:00.0: queue 0 connect admin queue failed (-6). you didn't initialize this object before use?
turning off the locking correctness validator.
Workqueue: nvme-reset-wq nvme_fc_ctrl_ioerr_work [nvme_fc] Call Trace: <TASK> dump_stack_lvl+0x57/0x80 register_lock_class+0x567/0x580 __lock_acquire+0x330/0xb90 lock_acquire.part.0+0xad/0x210 blk_mq_tagset_busy_iter+0xf9/0xc00 __nvme_fc_abort_outstanding_ios+0x23f/0x320 [nvme_fc] nvme_fc_ctrl_ioerr_work+0x172/0x210 [nvme_fc] process_one_work+0x82c/0x1450 worker_thread+0x5ee/0xfd0 kthread+0x3a0/0x750 ret_from_fork+0x439/0x670 ret_from_fork_asm+0x1a/0x30 </TASK>
Update the check in __nvme_fc_abort_outstanding_ios() confirm that io tagset was created before iterating over busy requests. Also make sure to cancel ctrl->ioerr_work before removing io tagset.
--- drivers/nvme/host/fc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/nvme/host/fc.c +6 -1
@@ -2471,7 +2471,7 @@ __nvme_fc_abort_outstanding_ios(struct nvme_fc_ctrl *ctrl, bool start_queues)* io requests back to the block layer as part of normal completions * (but with error status). */ -if (ctrl->ctrl.queue_count >1 ) { +if (ctrl->ctrl.queue_count >1 && ctrl->ctrl.tagset) {nvme_quiesce_io_queues (&ctrl->ctrl);nvme_sync_io_queues (&ctrl->ctrl); blk_mq_tagset_busy_iter(&ctrl->tag_set,
@@ -2910,6 +2910,11 @@ nvme_fc_create_io_queues(struct nvme_fc_ctrl *ctrl) out_delete_hw_queues:nvme_fc_delete_hw_io_queues (ctrl); out_cleanup_tagset: +/* +* In CONNECTING state ctrl->ioerr_work will abort both admin +* and io tagsets. Cancel it first before removing io tagset. +*/ +cancel_work_sync (&ctrl->ioerr_work);nvme_remove_io_tag_set (&ctrl->ctrl);nvme_fc_free_io_queues (ctrl);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 384/1250 sctp: Unwind address notifier registration on failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuho Choi <[email protected]>
[ Upstream commit c8459ee2fef502d6ef6c063751c33d9ac7943eab ]
sctp_v4_add_protocol() and sctp_v6_add_protocol() register their address notifiers before registering the SCTP protocol handlers. If protocol registration fails, the functions return without unregistering the notifiers.
Unregister the notifiers on the protocol registration failure paths. Also propagate notifier registration failures instead of ignoring them.
--- net/sctp/ipv6.c | 10 ++++++++-- net/sctp/protocol.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-)
net/sctp/ipv6.c +8 -2
@@ -1225,11 +1225,17 @@ void sctp_v6_protosw_exit(void)/* Register with inet6 layer. */ int sctp_v6_add_protocol (void ) { +int ret; +/* Register notifier for inet6 address additions/deletions. */ -register_inet6addr_notifier (&sctp_inet6addr_notifier); + ret =register_inet6addr_notifier (&sctp_inet6addr_notifier); +if (ret) +return ret; -if (inet6_add_protocol (&sctpv6_protocol,IPPROTO_SCTP ) <0 ) +if (inet6_add_protocol (&sctpv6_protocol,IPPROTO_SCTP ) <0 ) { +unregister_inet6addr_notifier (&sctp_inet6addr_notifier);return -EAGAIN ; + }return 0 ; }
net/sctp/protocol.c +8 -2
@@ -1297,12 +1297,18 @@ static void sctp_v4_protosw_exit(void)static int sctp_v4_add_protocol (void ) { +int ret; +/* Register notifier for inet address additions/deletions. */ -register_inetaddr_notifier (&sctp_inetaddr_notifier); + ret =register_inetaddr_notifier (&sctp_inetaddr_notifier); +if (ret) +return ret;/* Register SCTP with inet layer. */ -if (inet_add_protocol (&sctp_protocol,IPPROTO_SCTP ) <0 ) +if (inet_add_protocol (&sctp_protocol,IPPROTO_SCTP ) <0 ) { +unregister_inetaddr_notifier (&sctp_inetaddr_notifier);return -EAGAIN ; + }return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 385/1250 HID: multitouch: Honor ContactCount for Yoga Book 9 to suppress ghost contacts
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Carey <[email protected]>
[ Upstream commit ef257b8be9776915ca468bae6c91e31757e69734 ]
The INGENIC 17EF:6161 firmware on the Lenovo Yoga Book 9 14IAH10 does not clear stale contact slots when fingers are lifted. Each HID report contains up to 10 finger slots, but only the first ContactCount slots represent valid contacts; the remaining slots retain TipSwitch=1 with positions from previous touches.
Raw HID capture confirms this: across a 60-second capture with repeated multi-finger gestures, 90% of frames had more TipSwitch=1 slots than the reported ContactCount. The ContactCount field itself is always accurate.
Add MT_QUIRK_CONTACT_CNT_ACCURATE to the MT_CLS_YOGABOOK9I class so the driver stops processing slots once ContactCount valid contacts have been consumed, discarding the stale ghost entries per HID specification section 17. MT_QUIRK_NOT_SEEN_MEANS_UP (already in the class) ensures that any slot skipped by this guard is released via INPUT_MT_DROP_UNUSED at frame sync.
--- drivers/hid/hid-multitouch.c | 1 + 1 file changed, 1 insertion(+)
drivers/hid/hid-multitouch.c +1 -0
@@ -442,6 +442,7 @@ static const struct mt_class mt_classes[] = { { .name = MT_CLS_YOGABOOK9I, .quirks =MT_QUIRK_NOT_SEEN_MEANS_UP |MT_QUIRK_ALWAYS_VALID | +MT_QUIRK_CONTACT_CNT_ACCURATE |MT_QUIRK_FORCE_MULTI_INPUT |MT_QUIRK_SEPARATE_APP_REPORT | MT_QUIRK_HOVERING |
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 386/1250 hwmon: (dell-smm) Add Dell Latitude 7530 to fan control whitelist
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit 5a1aba28f6c79f4bbb7a5361063225030ecd36f3 ]
A user reported that the Dell Latitude 7530 needs to be whitelisted for the special SMM calls necessary for globally enabling/disabling BIOS fan control.
--- drivers/hwmon/dell-smm-hwmon.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/hwmon/dell-smm-hwmon.c +8 -0
@@ -1565,6 +1565,14 @@ static const struct dmi_system_id i8k_whitelist_fan_control[] __initconst = { }, .driver_data = (void *)&i8k_fan_control_data[I8K_FAN_30A3_31A3], }, + { + .ident = "Dell Latitude 7530", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Latitude 7530"), + }, + .driver_data = (void *)&i8k_fan_control_data[I8K_FAN_30A3_31A3], + }, { .ident ="Dell Latitude E6440" , .matches = {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 387/1250 PCI: Avoid SBR for Qualcomm WCN6855/WCN7850 WiFi, SDX62/SDX65 modems
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jose Ignacio Tornos Martinez <[email protected]>
[ Upstream commit 6a4f64c3a3ada43e71ef1e06da89beb36bdaeefa ]
Some Qualcomm PCIe devices (WCN6855/WCN7850 WiFi cards, SDX62/SDX65 modems) do not properly support Secondary Bus Reset (SBR).
Testing confirms this is device-specific, not deployment-specific:
MediaTek MT7925e successfully uses bus reset through the same passive M.2-to-PCIe adapters where Qualcomm devices fail, proving PERST# is properly wired through the adapters.
Prevent use of Secondary Bus Reset for these devices.
--- drivers/pci/quirks.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/pci/quirks.c +3 -0
@@ -3779,6 +3779,9 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset);DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_ATHEROS ,0x0033 , quirk_no_bus_reset);DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_ATHEROS ,0x0034 , quirk_no_bus_reset);DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_ATHEROS ,0x003e , quirk_no_bus_reset); +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_QCOM ,0x1103 , quirk_no_bus_reset);/* WCN6855 */ +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_QCOM ,0x1107 , quirk_no_bus_reset);/* WCN7850 */ +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_QCOM ,0x0308 , quirk_no_bus_reset);/* SDX62/SDX65 */ /* * Root port on some Cavium CN8xxx chips do not successfully complete a bus
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 388/1250 dmaengine: altera-msgdma: Use memcpy_toio for descriptor FIFO writes
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Ng Ho Yin <[email protected]>
[ Upstream commit 94963138cce29f85605d76c94fa1d43a0335ead9 ]
The descriptor FIFO requires that all words of a descriptor are written in order, with the control word written last to flush it into the DMA engine. Using memcpy() with __force to __iomem is not the correct API and does not guarantee appropriate MMIO access on all architectures.
Replace the descriptor body copy with memcpy_toio(), using offsetof(struct msgdma_extended_desc, control) to exclude the control word. This matches the previous sizeof(desc->hw_desc) - sizeof(u32) length only when control is the last struct member; add a static_assert to enforce that layout so a future field after control cannot silently break FIFO ordering.
Keep writing the control word separately with write barriers, so it remains the final word pushed into the FIFO.
--- drivers/dma/altera-msgdma.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-)
drivers/dma/altera-msgdma.c +15 -9
@@ -498,6 +498,11 @@ static void msgdma_copy_one(struct msgdma_device *mdev, {void __iomem *hw_desc = mdev->desc; +/* Ensure control is the last field — required for correct FIFO flush ordering */ +static_assert (offsetof(struct msgdma_extended_desc , control) == +sizeof (struct msgdma_extended_desc ) -sizeof (u32), +"control must be the last field in msgdma_extended_desc" ); +/* * Check if the DESC FIFO it not full. If its full, we need to wait * for at least one entry to become free again
@@ -506,17 +511,18 @@ static void msgdma_copy_one(struct msgdma_device *mdev, MSGDMA_CSR_STAT_DESC_BUF_FULL) mdelay(1); +/* Ensure control is the last field — required for correct FIFO flush ordering */ +static_assert (offsetof(struct msgdma_extended_desc , control) == +sizeof (struct msgdma_extended_desc ) -sizeof (u32), +"control must be the last field in msgdma_extended_desc" ); +/* -* The descriptor needs to get copied into the descriptor FIFO -* of the DMA controller. The descriptor will get flushed to the -* FIFO, once the last word (control word) is written. Since we -* are not 100% sure that memcpy() writes all word in the "correct" -* order (address from low to high) on all architectures, we make -* sure this control word is written last by single coding it and -* adding some write-barriers here. +* Copy the descriptor into the descriptor FIFO of the DMA controller, +* excluding the control word. The FIFO is flushed and the descriptor +* becomes valid once the control word is written last. */ -memcpy ((void __force *)hw_desc, &desc->hw_desc, -sizeof (desc->hw_desc) -sizeof (u32)); +memcpy_toio (hw_desc, &desc->hw_desc, + offsetof(struct msgdma_extended_desc , control));/* Write control word last to flush this descriptor into the FIFO */ mdev->idle = false;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 389/1250 dmaengine: dw-axi-dmac: fix PM for system sleep and channel alloc
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tze Yee Ng <[email protected]>
[ Upstream commit df0c2dc68770cf43f15df40b184df030b850ea05 ]
The driver only had runtime PM callbacks. If a channel stayed allocated across system suspend/resume, the runtime usage count could remain non-zero while hardware state (DMAC_CFG, clocks) was lost, and axi_dma_runtime_resume() would not run to restore it.
Add system-sleep PM ops that use pm_runtime_force_suspend() and pm_runtime_force_resume() so suspend/resume reuses the existing axi_dma_suspend() and axi_dma_resume() paths.
Replace pm_runtime_get() with pm_runtime_resume_and_get() in dma_chan_alloc_chan_resources() so clocks are enabled before a client can immediately submit a transfer and touch MMIO.
--- drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c +9 -2
@@ -516,11 +516,17 @@ static void dw_axi_dma_synchronize(struct dma_chan *dchan)static int dma_chan_alloc_chan_resources (struct dma_chan *dchan) {struct axi_dma_chan *chan =dchan_to_axi_dma_chan (dchan); +int ret; + + ret =pm_runtime_resume_and_get (chan->chip->dev); +if (ret <0 ) +return ret;/* ASSERT: channel is idle */ if (axi_chan_is_hw_enable (chan)) {dev_err (chan2dev (chan),"%s is non-idle!\n" ,axi_chan_name (chan)); +pm_runtime_put (chan->chip->dev);return -EBUSY ; }
@@ -531,12 +537,11 @@ static int dma_chan_alloc_chan_resources(struct dma_chan *dchan) 64, 0);if (!chan->desc_pool) {dev_err (chan2dev (chan),"No memory for descriptors\n" ); +pm_runtime_put (chan->chip->dev);return -ENOMEM ; }dev_vdbg (dchan2dev (dchan),"%s: allocating\n" ,axi_chan_name (chan)); -pm_runtime_get (chan->chip->dev); -return 0 ; }
@@ -1652,6 +1657,8 @@ static void dw_remove(struct platform_device *pdev) }static const struct dev_pm_ops dw_axi_dma_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume)SET_RUNTIME_PM_OPS (axi_dma_runtime_suspend, axi_dma_runtime_resume,NULL ) };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 390/1250 hwmon: (pmbus/lm25066) Fix PMBus coefficients for LM5064/5066/5066i
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Potin Lai <[email protected]>
[ Upstream commit 83dda7ed185501ba1f8165aeca83ff4a8ef7c263 ]
Swap the high setting and low setting coefficients in the lm25066_coeff table for LM5064, LM5066, and LM5066i. The coefficients were previously mapped incorrectly, resulting in inverted current and power scaling.
Additionally, dynamically assign the exponent (R) registers inside the probe's LM25066_DEV_SETUP_CL check. This ensures that the proper exponent is applied (e.g., for LM25056, high setting power exponent is -4, but low setting power exponent is -3).
--- drivers/hwmon/pmbus/lm25066.c | 54 ++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 26 deletions(-)
drivers/hwmon/pmbus/lm25066.c +28 -26
@@ -133,23 +133,23 @@ static const struct __coeff lm25066_coeff[][PSC_NUM_CLASSES + 2] = { .R = -2, }, [PSC_CURRENT_IN] = { - .m = 10742, - .b = 1552, + .m = 5456, + .b = 2118, .R = -2, }, [PSC_CURRENT_IN_L] = { - .m = 5456, - .b = 2118, + .m = 10742, + .b = 1552, .R = -2, }, [PSC_POWER] = { - .m = 1204, - .b = 8524, + .m = 612, + .b = 11202, .R = -3, }, [PSC_POWER_L] = { - .m = 612, - .b = 11202, + .m = 1204, + .b = 8524, .R = -3, }, [PSC_TEMPERATURE] = {
@@ -168,23 +168,23 @@ static const struct __coeff lm25066_coeff[][PSC_NUM_CLASSES + 2] = { .R = -2, }, [PSC_CURRENT_IN] = { - .m = 10753, - .b = -1200, + .m = 5405, + .b = -600, .R = -2, }, [PSC_CURRENT_IN_L] = { - .m = 5405, - .b = -600, + .m = 10753, + .b = -1200, .R = -2, }, [PSC_POWER] = { - .m = 1204, - .b = -6000, + .m = 605, + .b = -8000, .R = -3, }, [PSC_POWER_L] = { - .m = 605, - .b = -8000, + .m = 1204, + .b = -6000, .R = -3, }, [PSC_TEMPERATURE] = {
@@ -203,23 +203,23 @@ static const struct __coeff lm25066_coeff[][PSC_NUM_CLASSES + 2] = { .R = -2, }, [PSC_CURRENT_IN] = { - .m = 15076, - .b = -504, + .m = 7645, + .b = 100, .R = -2, }, [PSC_CURRENT_IN_L] = { - .m = 7645, - .b = 100, + .m = 15076, + .b = -504, .R = -2, }, [PSC_POWER] = { - .m = 1701, - .b = -4000, + .m = 861, + .b = -965, .R = -3, }, [PSC_POWER_L] = { - .m = 861, - .b = -965, + .m = 1701, + .b = -4000, .R = -3, }, [PSC_TEMPERATURE] = {
@@ -520,18 +520,20 @@ static int lm25066_probe(struct i2c_client *client) info->m[PSC_VOLTAGE_OUT ] = coeff[PSC_VOLTAGE_OUT ].m; info->b[PSC_VOLTAGE_OUT ] = coeff[PSC_VOLTAGE_OUT ].b; info->R[PSC_VOLTAGE_OUT ] = coeff[PSC_VOLTAGE_OUT ].R; - info->R[PSC_CURRENT_IN ] = coeff[PSC_CURRENT_IN ].R; - info->R[PSC_POWER ] = coeff[PSC_POWER ].R;if (config &LM25066_DEV_SETUP_CL ) { info->m[PSC_CURRENT_IN ] = coeff[PSC_CURRENT_IN_L ].m; info->b[PSC_CURRENT_IN ] = coeff[PSC_CURRENT_IN_L ].b; + info->R[PSC_CURRENT_IN ] = coeff[PSC_CURRENT_IN_L ].R; info->m[PSC_POWER ] = coeff[PSC_POWER_L ].m; info->b[PSC_POWER ] = coeff[PSC_POWER_L ].b; + info->R[PSC_POWER ] = coeff[PSC_POWER_L ].R; }else { info->m[PSC_CURRENT_IN ] = coeff[PSC_CURRENT_IN ].m; info->b[PSC_CURRENT_IN ] = coeff[PSC_CURRENT_IN ].b; + info->R[PSC_CURRENT_IN ] = coeff[PSC_CURRENT_IN ].R; info->m[PSC_POWER ] = coeff[PSC_POWER ].m; info->b[PSC_POWER ] = coeff[PSC_POWER ].b; + info->R[PSC_POWER ] = coeff[PSC_POWER ].R; }/*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 391/1250 spi: xilinx: let transfers timeout in case of no IRQ
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vadim Fedorenko <[email protected]>
[ Upstream commit 0f95264f49ace739d411fd9149e2b3545d741d06 ]
In case of failed HW the driver may not see an interrupt and will stuck in waiting forever. We can avoid such situation by timing out of transfers if the interrupt is not seen in a reasonable time.
This problem can be found on unload of ptp_ocp driver for TimeCard which uses Xilinx SPI AXI and SPI-NOR flash memory. During tear-down process spi-nor drivers send soft reset command which is not triggering an interrupt stalling the unload process completely.
--- drivers/spi/spi-xilinx.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/spi/spi-xilinx.c +5 -1
@@ -285,7 +285,11 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)if (use_irq) { xspi->write_fn (cr, xspi->regs +XSPI_CR_OFFSET ); -wait_for_completion (&xspi->done); +if (!wait_for_completion_timeout (&xspi->done,secs_to_jiffies (1 ))) { +dev_err (&spi->dev,"SPI transfer timed out\n" ); +xspi_init_hw (xspi); +return -ETIMEDOUT ; + }/* A transmit has just completed. Process received data * and check for more data to transmit. Always inhibit * the transmitter while the Isr refills the transmit
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 392/1250 Bluetooth: btusb: MT7922: Add VID/PID 0e8d/223c
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Lu <[email protected]>
[ Upstream commit fd5dc066b43eb8ae63f713aef704385c686b16e3 ]
Add VID 0e8d & PID 223c for MediaTek MT7922 USB Bluetooth chip.
The information in /sys/kernel/debug/usb/devices about the Bluetooth device is listed as the below.
T: Bus=07 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0e8d ProdID=223c Rev= 1.00 S: Manufacturer=MediaTek Inc. S: Product=Wireless_Device S: SerialNumber=000000000 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms I: If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us I:* If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -712,6 +712,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x04ca, 0x38e4), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x0e8d, 0x223c), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3568), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3584), .driver_info = BTUSB_MEDIATEK |
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 393/1250 Bluetooth: btusb: Add support for Intel Lizard Peak 2 (0x8087:0x0040)
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ravindra <[email protected]>
[ Upstream commit 5269f7231c2b78774c39ae3a27ce2c497cd5aff4 ]
Device from /sys/kernel/debug/usb/devices:
T: Bus=09 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0 D: Ver= 2.00 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=8087 ProdID=0040 Rev= 0.00 C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 64 Ivl=1ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms
--- drivers/bluetooth/btusb.c | 1 + 1 file changed, 1 insertion(+)
drivers/bluetooth/btusb.c +1 -0
@@ -485,6 +485,7 @@ static const struct usb_device_id quirks_table[] = { { USB_DEVICE(0x8087, 0x0037), .driver_info = BTUSB_INTEL_COMBINED }, { USB_DEVICE(0x8087, 0x0038), .driver_info = BTUSB_INTEL_COMBINED }, { USB_DEVICE(0x8087, 0x0039), .driver_info = BTUSB_INTEL_COMBINED }, + { USB_DEVICE(0x8087, 0x0040), .driver_info = BTUSB_INTEL_COMBINED }, /* Lizard Peak 2 */ { USB_DEVICE(0x8087, 0x07da), .driver_info = BTUSB_CSR }, { USB_DEVICE(0x8087, 0x07dc), .driver_info = BTUSB_INTEL_COMBINED | BTUSB_INTEL_NO_WBS_SUPPORT |
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 394/1250 Bluetooth: btusb: Add Realtek RTL8922AE VID/PID 0bda/d922
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Zhang <[email protected]>
[ Upstream commit 480dcc68f2826a9768e6fc9e81f02078c1ed0e01 ]
Add the vendor/product ID (0x0bda, 0xd922) to usb_device_id table for Realtek RTL8922AE.
The device info from /sys/kernel/debug/usb/devices as below.
T: Bus=10 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0 D: Ver= 1.00 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0bda ProdID=d922 Rev= 0.00 S: Manufacturer=Realtek S: Product=Bluetooth Radio S: SerialNumber=00E04C885A01 C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=500mA I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -603,6 +603,8 @@ static const struct usb_device_id quirks_table[] = {/* Realtek 8922AE Bluetooth devices */ { USB_DEVICE(0x0bda, 0x8922), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x0bda, 0xd922), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3617), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3616), .driver_info = BTUSB_REALTEK |
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 395/1250 Bluetooth: btusb: Add Mercusys MA530 for Realtek RTL8761BUV
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hrvoje Nuic <[email protected]>
[ Upstream commit ce21a5cf3d1fd92b84ea9ad2b7c7240aff2162d2 ]
Add the USB ID for the Mercusys MA530 Bluetooth adapter. The device uses a Realtek RTL8761BUV controller and works with the existing Realtek setup path.
The device reports vendor ID 0x2c4e and product ID 0x0115, and loads the rtl_bt/rtl8761bu_fw.bin firmware successfully with this quirk.
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -796,6 +796,8 @@ static const struct usb_device_id quirks_table[] = { { USB_DEVICE(0x2ff8, 0xb011), .driver_info = BTUSB_REALTEK }, /* Additional Realtek 8761BUV Bluetooth devices */ + { USB_DEVICE(0x2c4e, 0x0115), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x2357, 0x0604), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0b05, 0x190e), .driver_info = BTUSB_REALTEK |
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 396/1250 Bluetooth: btmtk: Disable remote wakeup for MT7922/MT7925
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rong Zhang <[email protected]>
[ Upstream commit e31d761628ad7e96490fc78105ed0a064ec1c1d9 ]
These NICs are often reported to lose their Bluetooth interfaces, i.e, their USB interfaces suddenly become completely unresponsive, causing the USB core to reset them, only to find that they are no longer accessible. A power cycle is required to make the Bluetooth interfaces recover.
After some investigations, I found that their USB autosuspend remote wakeup capabilities are so broken that they are precisely the culprit behind the issue:
[27452.608056] hub 3-0:1.0: state 7 ports 5 chg 0000 evt 0020
[27452.702018] usb 3-5: usb wakeup-resume
[27452.716038] usb 3-5: Waited 0ms for CONNECT
[27452.716642] usb 3-5: finish resume
/* usbmon showed that the device was completely unresponsive to any
URBs after the remote wakeup */
[27457.836030] usb 3-5: retry with reset-resume
[27457.956046] usb 3-5: reset high-speed USB device number 4 using xhci_hcd
[27463.332047] usb 3-5: device descriptor read/64, error -110
[27478.948117] usb 3-5: device descriptor read/64, error -110
[27479.172430] usb 3-5: reset high-speed USB device number 4 using xhci_hcd
[27484.332035] usb 3-5: device descriptor read/64, error -110
[27499.940039] usb 3-5: device descriptor read/64, error -110
[27500.164060] usb 3-5: reset high-speed USB device number 4 using xhci_hcd
[27505.196142] xhci_hcd 0000:67:00.0: Timeout while waiting for setup device command
[27510.576045] xhci_hcd 0000:67:00.0: Timeout while waiting for setup device command
[27510.784038] usb 3-5: device not accepting address 4, error -62
[27510.912215] usb 3-5: reset high-speed USB device number 4 using xhci_hcd
[27515.948307] xhci_hcd 0000:67:00.0: Timeout while waiting for setup device command
[27521.324380] xhci_hcd 0000:67:00.0: Timeout while waiting for setup device command
[27521.525107] usb 3-5: device not accepting address 4, error -62
[27521.525928] usb usb3-port5: logical disconnect
[27521.525996] usb 3-5: gone after usb resume? status -19
[27521.526230] usb 3-5: can't resume, status -19
[27521.526434] usb usb3-port5: logical disconnect
[27521.526469] usb usb3-port5: resume, status -19
[27521.526493] usb usb3-port5: status 0503, change 0004, 480 Mb/s
[27521.526528] usb 3-5: USB disconnect, device number 4
[27521.526736] usb 3-5: unregistering device
[27521.804029] usb 3-5: new high-speed USB device number 5 using xhci_hcd
[27527.076067] usb 3-5: device descriptor read/64, error -110
[27542.692027] usb 3-5: device descriptor read/64, error -110
[27542.916047] usb 3-5: new high-speed USB device number 6 using xhci_hcd
[27548.068043] usb 3-5: device descriptor read/64, error -110
[27563.684073] usb 3-5: device descriptor read/64, error -110
[27563.792133] usb usb3-port5: attempt power cycle
[27563.924381] hub 3-0:1.0: port_wait_reset: err = -11
[27563.925213] usb usb3-port5: not enabled, trying reset again...
[27564.184398] usb 3-5: new high-speed USB device number 7 using xhci_hcd
[27569.196322] xhci_hcd 0000:67:00.0: Timeout while waiting for setup device command
[27574.572040] xhci_hcd 0000:67:00.0: Timeout while waiting for setup device command
[27574.776053] usb 3-5: device not accepting address 7, error -62
[27574.900165] usb 3-5: new high-speed USB device number 8 using xhci_hcd
[27579.948039] xhci_hcd 0000:67:00.0: Timeout while waiting for setup device command
[27585.324331] xhci_hcd 0000:67:00.0: Timeout while waiting for setup device command
[27585.528040] usb 3-5: device not accepting address 8, error -62
[27585.528389] usb usb3-port5: unable to enumerate USB device
[27585.528424] hub 3-0:1.0: state 7 ports 5 chg 0000 evt 0020To reproduce the issue, these conditions must be met:
- a noisy radio environment (cafe or office) to cause frequent remote wakeup events
- no Bluetooth device is connected, so autosuspend is not prohibited
- the Bluetooth interface is opened, so remote wakeup is enabled when the device runs into autosuspend
Then I can reproduce the issue within sereval hours each time.
Increasing TRSMRCY or setting USB_QUIRK_RESET doesn't help at all.
Since the remote wakeup capability is super broken, just disable it to get rid of the troubles. The device can still be autosuspended when the bluetooth interface is closed, which won't break the device as remote wakeup is unneeded in this case.
--- drivers/bluetooth/btmtk.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/bluetooth/btmtk.c +10 -0
@@ -1380,6 +1380,16 @@ int btmtk_usb_setup(struct hci_dev *hdev)break ;case 0x7922 :case 0x7925 : +/* +* A remote wakeup could cause the device completely unresponsive, and +* recovering from such a state needs a power cycle. +* +* Since the remote wakeup capability is super broken, just disable it +* to get rid of the troubles. The device can still be autosuspended +* when the bluetooth interface is closed. +*/ +device_set_wakeup_capable (&btmtk_data->udev->dev, false); + fallthrough;case 0x7961 :case 0x7902 :case 0x6639 :
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 397/1250 Bluetooth: btusb: MT7925: Add VID/PID 0e8d/8c38
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Lu <[email protected]>
[ Upstream commit 69b2f05df3ee63e1273608cdb81a7d664e9de2b8 ]
Add VID 0e8d & PID 8c38 for MediaTek MT7925 USB Bluetooth chip.
The information in /sys/kernel/debug/usb/devices about the Bluetooth device is listed as the below.
T: Bus=06 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0e8d ProdID=8c38 Rev= 1.00 S: Manufacturer=MediaTek Inc. S: Product=Wireless_Device S: SerialNumber=000000000 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms I: If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us I:* If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -755,6 +755,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0489, 0xe151), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x0e8d, 0x8c38), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3602), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3603), .driver_info = BTUSB_MEDIATEK |
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 398/1250 Bluetooth: btusb: Add support for TP-Link TL-UB250
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cris <[email protected]>
[ Upstream commit ea77debfe443f505a4edbb7f21340a583a8a143f ]
Add USB ID 2357:0607 for TP-Link TL-UB250.
This is a Realtek RTL8761BUV based Bluetooth adapter.
Without this entry the device is picked up by the generic Bluetooth USB class match and exposes hci0, but the Realtek setup path is not used and rtl8761bu firmware/config are not loaded.
The controller reports Realtek Semiconductor Corporation as the manufacturer and LMP subversion 0x8761. With this entry added, btusb loads rtl_bt/rtl8761bu_fw.bin and rtl_bt/rtl8761bu_config.bin successfully.
Relevant part of /sys/kernel/debug/usb/devices:
T: Bus=01 Lev=02 Prnt=06 Port=00 Cnt=01 Dev#= 9 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=2357 ProdID=0607 Rev= 2.00 S: Product=TP-Link TL-UB250 Adapter
C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
Use the same flags as the existing TP-Link 2357:0604 entry.
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -802,6 +802,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x2357, 0x0604), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x2357, 0x0607), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0b05, 0x190e), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x2550, 0x8761), .driver_info = BTUSB_REALTEK |
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 399/1250 Bluetooth: L2CAP: validate connectionless PSM length
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Samuel Moelius <[email protected]>
[ Upstream commit a40a5f922546b3bd7c094d882b29177db4f2abe0 ]
Connectionless L2CAP frames carry a two-byte PSM at the start of the payload. l2cap_recv_frame() currently reads that PSM unconditionally after validating only the outer L2CAP length.
A malformed connectionless frame with a zero- or one-byte payload can therefore make the parser read beyond the advertised skb payload and use tailroom bytes as part of the PSM. A VHCI-backed QEMU reproducer injected a one-byte connectionless payload and reached the unchecked read.
Reject connectionless frames that cannot contain the PSM before reading or pulling it. This preserves all valid connectionless frames while dropping only structurally incomplete packets.
--- net/bluetooth/l2cap_core.c | 5 +++++ 1 file changed, 5 insertions(+)
net/bluetooth/l2cap_core.c +5 -0
@@ -7117,6 +7117,11 @@ static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)break ;case L2CAP_CID_CONN_LESS : +if (skb->len <L2CAP_PSMLEN_SIZE ) { +kfree_skb (skb); +break ; + } + psm =get_unaligned ((__le16 *) skb->data);skb_pull (skb,L2CAP_PSMLEN_SIZE );l2cap_conless_channel (conn, psm, skb);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 400/1250 Bluetooth: btintel_pcie: Add 50 ms delay before MAC init on BlazarIW
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kiran K <[email protected]>
[ Upstream commit 4d62d88e7ae6dcecd9a8c70a045a6c6c64bf3b52 ]
On BlazarIW, fast restart cycles fail because the D0 entry to MAC init does not complete in time. As a result, MAC initialization does not proceed and the controller fails to transition past the ROM boot stage.
Add a 50 ms delay (worst case as per HW analysis) before doing MAC init in btintel_pcie_enable_bt() so the shared hardware reset flow has time to complete. The delay is gated on the BlazarIW PCI device id 0x4D76 so other Intel BT PCIe controllers are unaffected.
--- drivers/bluetooth/btintel_pcie.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/bluetooth/btintel_pcie.c +13 -0
@@ -740,6 +740,11 @@ static void btintel_pcie_dump_traces(struct hci_dev *hdev)bt_dev_err (hdev,"Failed to dump traces: (%d)" , ret); } +static bool btintel_pcie_is_blazariw (struct pci_dev *pdev) +{ +return pdev->device ==0x4D76 ; +} +/* This function enables BT function by setting BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_INIT bit in * BTINTEL_PCIE_CSR_FUNC_CTRL_REG register and wait for MSI-X with * BTINTEL_PCIE_MSIX_HW_INT_CAUSES_GP0.
@@ -759,6 +764,14 @@ static int btintel_pcie_enable_bt(struct btintel_pcie_data *data)btintel_pcie_wr_reg32 (data,BTINTEL_PCIE_CSR_CI_ADDR_MSB_REG , (u64 )data->ci_p_addr >>32 ); +/* On BlazarIW, the D0 entry to MAC init does not complete in +* time. Wait 50 ms (worst case as per HW analysis) for the +* shared hardware reset flow to complete before proceeding with +* MAC init. +*/ +if (btintel_pcie_is_blazariw (data->pdev)) +msleep (50 ); +/* Reset the cached value of boot stage. it is updated by the MSI-X * gp0 interrupt handler. */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 401/1250 ASoC: rockchip: rockchip_pdm: Handle runtime PM resume failures in set_fmt
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: bui duc phuc <[email protected]>
[ Upstream commit ee7b5f7b39332febf917f9ebf212842cc9379815 ]
rockchip_pdm_set_fmt() calls pm_runtime_get_sync() before accessing hardware registers, but ignores its return value.
If the runtime resume fails, the function continues to perform register accesses while the device state is undefined.
Replace pm_runtime_get_sync() with pm_runtime_resume_and_get() and return early on failure to avoid unpowered register accesses.
--- sound/soc/rockchip/rockchip_pdm.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
sound/soc/rockchip/rockchip_pdm.c +5 -1
@@ -321,6 +321,7 @@ static int rockchip_pdm_set_fmt(struct snd_soc_dai *cpu_dai, {struct rk_pdm_dev *pdm =to_info (cpu_dai);unsigned int mask =0 , val =0 ; +int ret; mask =PDM_CKP_MSK ;switch (fmt &SND_SOC_DAIFMT_INV_MASK ) {
@@ -334,7 +335,10 @@ static int rockchip_pdm_set_fmt(struct snd_soc_dai *cpu_dai,return -EINVAL ; } -pm_runtime_get_sync (cpu_dai->dev); + ret =pm_runtime_resume_and_get (cpu_dai->dev); +if (ret) +return ret; +regmap_update_bits (pdm->regmap,PDM_CLK_CTRL , mask, val);pm_runtime_put (cpu_dai->dev);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 402/1250 ASoC: rockchip: rockchip_pdm: Reorder clock enable sequence
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: bui duc phuc <[email protected]>
[ Upstream commit 3168721d6ec3b610edf6a3c22ad190722a27d276 ]
Enable the 'hclk' bus clock before the 'clk' controller clock during runtime resume.
The bus clock provides the register access interface, so enable it before the controller clock. This also makes the resume sequence the reverse of the suspend sequence, which keeps the clock ordering consistent.
--- sound/soc/rockchip/rockchip_pdm.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
sound/soc/rockchip/rockchip_pdm.c +5 -5
@@ -426,16 +426,16 @@ static int rockchip_pdm_runtime_resume(struct device *dev)struct rk_pdm_dev *pdm =dev_get_drvdata (dev);int ret; - ret =clk_prepare_enable (pdm->clk); + ret =clk_prepare_enable (pdm->hclk);if (ret) { -dev_err (pdm->dev,"clock enable failed %d\n" , ret); +dev_err (pdm->dev,"hclock enable failed %d\n" , ret);return ret; } - ret =clk_prepare_enable (pdm->hclk); + ret =clk_prepare_enable (pdm->clk);if (ret) { -clk_disable_unprepare (pdm->clk); -dev_err (pdm->dev,"hclock enable failed %d\n" , ret); +clk_disable_unprepare (pdm->hclk); +dev_err (pdm->dev,"clock enable failed %d\n" , ret);return ret; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 403/1250 ASoC: rockchip: spdif: Restore regcache cache-only mode on sync failure
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: bui duc phuc <[email protected]>
[ Upstream commit 3546e9aa691ac981e4734fedd1646d0180784893 ]
If regcache_sync() fails during runtime resume, the driver disables the clocks and returns an error. However, the regmap cache-only mode is left disabled.
Restore cache-only mode in the error path so subsequent register accesses continue to use the cache while the device is inactive.
--- sound/soc/rockchip/rockchip_spdif.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/rockchip/rockchip_spdif.c +1 -0
@@ -97,6 +97,7 @@ static int rk_spdif_runtime_resume(struct device *dev) ret =regcache_sync (spdif->regmap);if (ret) { +regcache_cache_only (spdif->regmap, true);clk_disable_unprepare (spdif->mclk);clk_disable_unprepare (spdif->hclk); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 404/1250 Bluetooth: btusb: Add Realtek RTL8922AE VID/PID 0bda/d923
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Zhang <[email protected]>
[ Upstream commit 5612ee230a33c450976c3bcaea174f1d816a2697 ]
Add the vendor/product ID (0x0bda, 0xd923) to usb_device_id table for Realtek RTL8922AE.
The device info from /sys/kernel/debug/usb/devices as below.
T: Bus=10 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0 D: Ver= 1.00 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0bda ProdID=d923 Rev= 0.00 S: Manufacturer=Realtek S: Product=Bluetooth Radio S: SerialNumber=00E04C885A01 C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=500mA I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -605,6 +605,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0bda, 0xd922), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x0bda, 0xd923), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3617), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3616), .driver_info = BTUSB_REALTEK |
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 405/1250 sparc64: uprobes: add missing break
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 5b0eee4cd812bd6547eea393cb9b5c0322f26c88 ]
Missing fallthrough causes failure with newer compilers:
arch/sparc/kernel/uprobes.c:284:2: error: unannotated fall-through between switch labels [-Werror,-Wimplicit-fallthrough]
284 | default:
| ^
arch/sparc/kernel/uprobes.c:284:2: note: insert 'break;' to avoid fall-through
284 | default:
| ^
| break;--- arch/sparc/kernel/uprobes.c | 1 + 1 file changed, 1 insertion(+)
arch/sparc/kernel/uprobes.c +1 -0
@@ -280,6 +280,7 @@ int arch_uprobe_exception_notify(struct notifier_block *self,case DIE_SSTEP :if (uprobe_post_sstep_notifier (args->regs)) ret =NOTIFY_STOP ; +break ;default :break ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 406/1250 net: stmmac: xgmac2: disable RBUE in default RX interrupt mask
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nazim Amirul <[email protected]>
[ Upstream commit d3265c19b35d036bba327b36b5366bee76b0157c ]
Enabling the RX Buffer Unavailable (RBUE) interrupt is counterproductive and can trigger a MAC interrupt storm under heavy RX pressure. When the DMA runs out of RX descriptors it fires RBUE continuously until software refills the ring.
However, RBUE is redundant: the normal RX completion interrupt (RIE) already triggers NAPI, which processes completed descriptors and refills the ring, causing the DMA to resume. The RBUE handler itself only sets handle_rx - the same outcome as RIE.
On Agilex5 under heavy RX pressure, the MAC interrupt (which includes RBUE) was observed firing 1,821,811,555 times against only 2,618,627 actual RX completions - a ~695x ratio - confirming the severity of the storm.
RBUE does not provide OOM recovery. If page_pool is exhausted, stmmac_rx_refill() cannot advance the DMA tail pointer, the DMA stays suspended, and RBUE fires again on the next NAPI completion - a storm with no forward progress. This patch trades that storm for a clean stall with the same RX outcome. Proper OOM recovery is a pre-existing gap outside the scope of this fix.
Note: as a consequence of disabling RBUE, the rx_buf_unav_irq ethtool counter will always read 0 on XGMAC2 devices. This behaviour is already inconsistent across DWMAC core versions.
Remove RBUE from XGMAC_DMA_INT_DEFAULT_EN and XGMAC_DMA_INT_DEFAULT_RX to prevent the interrupt storm while keeping normal RX handling intact.
--- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +2 -2
@@ -385,9 +385,9 @@#define XGMAC_RIE BIT(6)#define XGMAC_TBUE BIT(2)#define XGMAC_TIE BIT(0) -#define XGMAC_DMA_INT_DEFAULT_EN (XGMAC_NIE | XGMAC_AIE | XGMAC_RBUE | \ +#define XGMAC_DMA_INT_DEFAULT_EN (XGMAC_NIE | XGMAC_AIE | \ XGMAC_RIE | XGMAC_TIE) -#define XGMAC_DMA_INT_DEFAULT_RX (XGMAC_RBUE | XGMAC_RIE) +#define XGMAC_DMA_INT_DEFAULT_RX (XGMAC_RIE)#define XGMAC_DMA_INT_DEFAULT_TX (XGMAC_TIE)#define XGMAC_DMA_CH_Rx_WATCHDOG (x) (0x0000313c + (0x80 * (x)))#define XGMAC_RWT GENMASK(7, 0)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 407/1250 ptp: ocp: add shutdown callback
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vadim Fedorenko <[email protected]>
[ Upstream commit f6f955cbf9d4e02deebe54ca91c118b53be9ffe6 ]
The shutdown callback was never implemented for this driver, but it's needed because .remove() callback is never called during kexec/reboot process. That leaves HW with some interrupts enabled and may cause spurious interrupt while booting into a new kernel during with kexec. If it happens that I2C interrupt fires during kexec, the whole I2C bus is disabled leaving TimeCard with no devlink communication. The same happens if timestampers were enabled, leaving the card without timestamper interrupts until full reboot cycle.
Implement .shutdown() callback with the same function as remove callback.
--- drivers/ptp/ptp_ocp.c | 1 + 1 file changed, 1 insertion(+)
drivers/ptp/ptp_ocp.c +1 -0
@@ -4868,6 +4868,7 @@ static struct pci_driver ptp_ocp_driver = { .id_table = ptp_ocp_pcidev_id, .probe = ptp_ocp_probe, .remove = ptp_ocp_remove, + .shutdown = ptp_ocp_remove, }; static int
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 408/1250 ipv6: Honor oif when choosing nexthop for locally generated traffic
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit d25e7e9d8a6c1e2afb854613e417c6aa1a28ce6f ]
Commit 741a11d9e410 ("net: ipv6: Add RT6_LOOKUP_F_IFACE flag if oif is set") made the kernel honor the oif parameter when specified as part of output route lookup:
# ip route add 2001:db8:1::/64 dev dummy1 # ip route add ::/0 dev dummy2 # ip route get 2001:db8:1::1 oif dummy2 fibmatch default dev dummy2 metric 1024 pref medium
Due to regression reports, the behavior was partially reverted in commit d46a9d678e4c ("net: ipv6: Dont add RT6_LOOKUP_F_IFACE flag if saddr set") to only honor the oif if source address is not specified:
# ip route get 2001:db8:1::1 from 2001:db8:2::1 oif dummy2 fibmatch 2001:db8:1::/64 dev dummy1 metric 1024 pref medium
That is, when source address is specified, the kernel will choose the most specific route even if its nexthop device does not match the specified oif.
This creates a problem for multipath routes. After looking up a route, when source address is not specified, the kernel will choose a nexthop whose nexthop device matches the specified oif:
# sysctl -wq net.ipv6.conf.all.forwarding=1
# ip route add 2001:db8:10::/64 nexthop via fe80::1 dev dummy1 nexthop via fe80::2 dev dummy2
# for i in {1..100}; do ip route get 2001:db8:10::${i} oif dummy2; done | grep -o dummy[0-9] | sort | uniq -c
100 dummy2But will disregard the oif when source address is specified despite the fact that a matching nexthop exists:
# for i in {1..100}; do ip route get 2001:db8:10::${i} from 2001:db8:2::1 oif dummy2; done | grep -o dummy[0-9] | sort | uniq -c
53 dummy1
47 dummy2This behavior differs from IPv4:
# ip address add 192.0.2.1/32 dev lo
# ip route add 198.51.100.0/24 nexthop via inet6 fe80::1 dev dummy1 nexthop via inet6 fe80::2 dev dummy2
# for i in {1..100}; do ip route get 198.51.100.${i} from 192.0.2.1 oif dummy2; done | grep -o dummy[0-9] | sort | uniq -c
100 dummy2What happens is that fib6_table_lookup() returns a route with a matching nexthop device (assuming it exists):
# perf record -e fib6:fib6_table_lookup -- bash -c "for i in {1..100}; do ip route get 2001:db8:10::${i} from 2001:db8:2::1 oif dummy2; done > /dev/null"
# perf script | grep -o dummy[0-9] | sort | uniq -c
100 dummy2But it is later overwritten during path selection in fib6_select_path() which instead chooses a nexthop according to the calculated hash.
Solve this by telling fib6_select_path() to skip path selection if we have an oif match during output route lookup (iif being LOOPBACK_IFINDEX).
Behavior after the change:
# sysctl -wq net.ipv6.conf.all.forwarding=1
# ip route add 2001:db8:10::/64 nexthop via fe80::1 dev dummy1 nexthop via fe80::2 dev dummy2
# for i in {1..100}; do ip route get 2001:db8:10::${i} from 2001:db8:2::1 oif dummy2; done | grep -o dummy[0-9] | sort | uniq -c
100 dummy2Note that enabling forwarding is only needed because we did not add neighbor entries for the gateway addresses. When forwarding is disabled and CONFIG_IPV6_ROUTER_PREF is not enabled in kernel config, the kernel will treat non-existing neighbor entries as errors and perform round-robin between the nexthops:
# sysctl -wq net.ipv6.conf.all.forwarding=0
# for i in {1..100}; do ip route get 2001:db8:10::${i} from 2001:db8:2::1 oif dummy2; done | grep -o dummy[0-9] | sort | uniq -c
50 dummy1
50 dummy2--- net/ipv6/route.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/ipv6/route.c +4 -1
@@ -2271,6 +2271,7 @@ struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, {struct fib6_result res = {};struct rt6_info *rt =NULL ; +bool have_oif_match;int strict =0 ; WARN_ON_ONCE((flags & RT6_LOOKUP_F_DST_NOREF) &&
@@ -2287,7 +2288,9 @@ struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table,if (res.f6i == net->ipv6.fib6_null_entry) goto out; -fib6_select_path (net, &res, fl6, oif, false, skb, strict); + have_oif_match = fl6->flowi6_iif ==LOOPBACK_IFINDEX && + oif == res.nh->fib_nh_dev->ifindex; +fib6_select_path (net, &res, fl6, oif, have_oif_match, skb, strict);/*Search through exception table */ rt =rt6_find_cached_rt (&res, &fl6->daddr, &fl6->saddr);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 409/1250 vsock: use sk_acceptq_is_full() helper in all transports
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Raf Dickson <[email protected]>
[ Upstream commit 4ff2e84ff1b33d79fa0e3ae355ce4a334908ef9a ]
Replace the open-coded backlog check with sk_acceptq_is_full(). The helper uses > instead of >=, which is the correct comparison per commit 64a146513f8f ("[NET]: Revert incorrect accept queue backlog changes."), and adds READ_ONCE() for proper memory ordering.
--- net/vmw_vsock/hyperv_transport.c | 2 +- net/vmw_vsock/vmci_transport.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/vmw_vsock/hyperv_transport.c +1 -1
@@ -323,7 +323,7 @@ static void hvs_open_connection(struct vmbus_channel *chan) goto out;if (conn_from_host) { -if (sk->sk_ack_backlog >= sk->sk_max_ack_backlog) +if (sk_acceptq_is_full (sk)) goto out; new =vsock_create_connected (sk);
net/vmw_vsock/vmci_transport.c +1 -1
@@ -1002,7 +1002,7 @@ static int vmci_transport_recv_listen(struct sock *sk,* reset. Otherwise we create and initialize a child socket and reply * with a connection negotiation. */ -if (sk->sk_ack_backlog >= sk->sk_max_ack_backlog) { +if (sk_acceptq_is_full (sk)) {vmci_transport_reply_reset (pkt);return -ECONNREFUSED ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 410/1250 e1000e: limit endianness conversion to boundary words
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Agalakov Daniil <[email protected]>
[ Upstream commit a5ecafcfb27baf2dba766c4fd99dbb947f4e85d8 ]
[Why]
In e1000_set_eeprom(), the eeprom_buff is allocated to hold a range of words. However, only the boundary words (the first and the last) are populated from the EEPROM if the write request is not word-aligned. The words in the middle of the buffer remain uninitialized because they are intended to be completely overwritten by the new data via memcpy().
The previous implementation had a loop that performed le16_to_cpus() on the entire buffer. This resulted in endianness conversion being performed on uninitialized memory for all interior words.
Fix this by converting the endianness only for the boundary words immediately after they are successfully read from the EEPROM.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/net/ethernet/intel/e1000e/ethtool.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
drivers/net/ethernet/intel/e1000e/ethtool.c +12 -7
@@ -585,20 +585,25 @@ static int e1000_set_eeprom(struct net_device *netdev,/* need read/modify/write of first changed EEPROM word */ /* only the second byte of the word is being modified */ ret_val =e1000_read_nvm (hw, first_word,1 , &eeprom_buff[0 ]); +if (ret_val) + goto out; + +/* Device's eeprom is always little-endian, word addressable */ +le16_to_cpus (&eeprom_buff[0 ]); + ptr++; } -if (((eeprom->offset + eeprom->len) &1 ) && (!ret_val)) +if ((eeprom->offset + eeprom->len) &1 ) {/* need read/modify/write of last changed EEPROM word */ /* only the first byte of the word is being modified */ ret_val =e1000_read_nvm (hw, last_word,1 , &eeprom_buff[last_word - first_word]); +if (ret_val) + goto out; -if (ret_val) - goto out; - -/* Device's eeprom is always little-endian, word addressable */ -for (i =0 ; i < last_word - first_word +1 ; i++) -le16_to_cpus (&eeprom_buff[i]); +/* Device's eeprom is always little-endian, word addressable */ +le16_to_cpus (&eeprom_buff[last_word - first_word]); + }memcpy (ptr, bytes, eeprom->len);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 411/1250 net: hns3: improve the unused_tuple parameter setting
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jijie Shao <[email protected]>
[ Upstream commit 1ad6f1ff3e96c7ee888475740c8acdaf822e0813 ]
Currently, when the tc tool is used to set flow table rules, the IP address and MAC address can be configured separately, for example, src_xx or dst_xx can be configured separately.
Therefore, the driver needs to check whether the mask is all zero in keys, such as FLOW_DISSECTOR_KEY_IPV4_ADDRS, FLOW_DISSECTOR_KEY_IPV6_ADDRS, and FLOW_DISSECTOR_KEY_ETH_ADDRS.
If the mask is all zero, the tuple is not configured.
In this case, the driver adds the tuple to unused_tuple.
--- .../net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +12 -0
@@ -7261,6 +7261,10 @@ static void hclge_get_cls_key_mac(const struct flow_rule *flow,ether_addr_copy (rule->tuples_mask.dst_mac, match.mask->dst);ether_addr_copy (rule->tuples.src_mac, match.key->src);ether_addr_copy (rule->tuples_mask.src_mac, match.mask->src); +if (is_zero_ether_addr (match.mask->dst)) + rule->unused_tuple |=BIT (INNER_DST_MAC ); +if (is_zero_ether_addr (match.mask->src)) + rule->unused_tuple |=BIT (INNER_SRC_MAC ); }else { rule->unused_tuple |=BIT (INNER_DST_MAC ); rule->unused_tuple |=BIT (INNER_SRC_MAC );
@@ -7309,6 +7313,10 @@ static int hclge_get_cls_key_ip(const struct flow_rule *flow, rule->tuples.dst_ip[IPV4_INDEX ] =be32_to_cpu (match.key->dst); rule->tuples_mask.dst_ip[IPV4_INDEX ] =be32_to_cpu (match.mask->dst); +if (!match.mask->src) + rule->unused_tuple |=BIT (INNER_SRC_IP ); +if (!match.mask->dst) + rule->unused_tuple |=BIT (INNER_DST_IP ); }else if (addr_type ==FLOW_DISSECTOR_KEY_IPV6_ADDRS ) {struct flow_match_ipv6_addrs match;
@@ -7321,6 +7329,10 @@ static int hclge_get_cls_key_ip(const struct flow_rule *flow, match.key->dst.s6_addr32);ipv6_addr_be32_to_cpu (rule->tuples_mask.dst_ip, match.mask->dst.s6_addr32); +if (ipv6_addr_any (&match.mask->src)) + rule->unused_tuple |=BIT (INNER_SRC_IP ); +if (ipv6_addr_any (&match.mask->dst)) + rule->unused_tuple |=BIT (INNER_DST_IP ); }else { rule->unused_tuple |=BIT (INNER_SRC_IP ); rule->unused_tuple |=BIT (INNER_DST_IP );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 412/1250 apparmor: propagate -ENOMEM correctly in unpack_table
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Bélair <[email protected]>
[ Upstream commit 1c8a839442823ce5c627d645730d8c61d828aafa ]
Currently, if the kvzalloc in unpack_table fails, it returns NULL. This is masked by aa_dfa_unpack which interprets NULL as a -EPROTO, leading to confusing error messages in apparmor_parser [1].
The fixed behavior correctly propagates -ENOMEM on allocation failure.
--- security/apparmor/match.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
security/apparmor/match.c +13 -9
@@ -27,13 +27,13 @@* @blob: data to unpack (NOT NULL) * @bsize: size of blob * -* Returns: pointer to table else NULL on failure +* Returns: pointer to table else ERR_PTR on failure * * NOTE: must be freed by kvfree (not kfree) */ static struct table_header *unpack_table (char *blob,size_t bsize) { -struct table_header *table =NULL ; +struct table_header *table =ERR_PTR (-EPROTO );struct table_header th;size_t tsize;
@@ -74,20 +74,21 @@ static struct table_header *unpack_table(char *blob, size_t bsize)else if (th.td_flags ==YYTD_DATA32 )UNPACK_ARRAY (table->td_data, blob, th.td_lolen, u32, __be32, get_unaligned_be32); -else - goto fail; +else { +kvfree (table); + table =ERR_PTR (-EPROTO ); + goto out; + }/* if table was vmalloced make sure the page tables are synced * before it is used, as it goes live to all cpus. */ if (is_vmalloc_addr (table))vm_unmap_aliases (); - } + }else + table =ERR_PTR (-ENOMEM ); out:return table; -fail: -kvfree (table); -return NULL ; }/**
@@ -359,8 +360,11 @@ struct aa_dfa *aa_dfa_unpack(void *blob, size_t size, int flags)while (size >0 ) { table =unpack_table (data, size); -if (!table) +if (IS_ERR (table)) { + error =PTR_ERR (table); + table =NULL ; goto fail; + }switch (table->td_id) {case YYTD_ID_ACCEPT :
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 413/1250 net/sched: act_csum: dont mangle UDP tunnel GSO packets
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alice Mikityanska <[email protected]>
[ Upstream commit 9bcb30b389ec5888590cb6ec58c7a3b80fe49a11 ]
Similar to commit add641e7dee3 ("sched: act_csum: don't mangle TCP and UDP GSO packets"), UDP tunnel GSO packets going through act_csum shouldn't have their checksum calculated at this point, because it will be done after segmentation. Setting the checksum in act_csum modifies skb->ip_summed and prevents inner IP csum offload from kicking in, resulting in a packet with a bad checksum.
Add UDP tunnel GSO packets to the exceptions, and also add UDP GSO (SKB_GSO_UDP_L4), as the same logic as in the commit mentioned above applies to UDP GSO too.
--- net/sched/act_csum.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/sched/act_csum.c +6 -2
@@ -259,7 +259,9 @@ static int tcf_csum_ipv4_udp(struct sk_buff *skb, unsigned int ihl,const struct iphdr *iph;u16 ul; -if (skb_is_gso (skb) &&skb_shinfo (skb)->gso_type &SKB_GSO_UDP ) +if (skb_is_gso (skb) &&skb_shinfo (skb)->gso_type & + (SKB_GSO_UDP |SKB_GSO_UDP_L4 | +SKB_GSO_UDP_TUNNEL |SKB_GSO_UDP_TUNNEL_CSUM ))return 1 ;/*
@@ -315,7 +317,9 @@ static int tcf_csum_ipv6_udp(struct sk_buff *skb, unsigned int ihl,const struct ipv6hdr *ip6h;u16 ul; -if (skb_is_gso (skb) &&skb_shinfo (skb)->gso_type &SKB_GSO_UDP ) +if (skb_is_gso (skb) &&skb_shinfo (skb)->gso_type & + (SKB_GSO_UDP |SKB_GSO_UDP_L4 | +SKB_GSO_UDP_TUNNEL |SKB_GSO_UDP_TUNNEL_CSUM ))return 1 ;/*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 414/1250 smb: client: fix races in cifsd thread creation
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fredric Cover <[email protected]>
[ Upstream commit e8a5cf2ff5a13fefb228f2069e29dd7d8e37185d ]
The cifsd demultiplex thread can run and access tcp_ses before the parent thread has finished populating tcp_ses, which the worker thread accesses locklessly.
Also, the kthread_run macro may start the thread before returning the thread pointer. Because the pointer is part of the structure that the thread can access, if the kernel is preempted after the thread is spawned, but before the thread pointer is populated and the thread attempts to exit, it will sleep, waiting for a SIGKILL signal.
Fix this by moving creation of the thread to after all of tcp_ses'es fields are populated, and spawning the thread last, using a split kthread_create/wake_up_process logic.
--- fs/smb/client/connect.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-)
fs/smb/client/connect.c +16 -11
@@ -1871,14 +1871,6 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,* this will succeed. No need for try_module_get(). */ __module_get (THIS_MODULE ); - tcp_ses->tsk =kthread_run (cifs_demultiplex_thread, - tcp_ses,"cifsd" ); -if (IS_ERR (tcp_ses->tsk)) { - rc =PTR_ERR (tcp_ses->tsk); -cifs_dbg (VFS ,"error %d create cifsd thread\n" , rc); -module_put (THIS_MODULE ); - goto out_err_crypto_release; - } tcp_ses->min_offload = ctx->min_offload; tcp_ses->retrans = ctx->retrans;/*
@@ -1886,9 +1878,7 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,* to the struct since the kernel thread not created yet * no need to spinlock this update of tcpStatus */ -spin_lock (&tcp_ses->srv_lock); tcp_ses->tcpStatus = CifsNeedNegotiate; -spin_unlock (&tcp_ses->srv_lock);if ((ctx->max_credits <20 ) || (ctx->max_credits >60000 )) tcp_ses->max_credits =SMB2_MAX_CREDITS_AVAILABLE ;
@@ -1897,7 +1887,16 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx, tcp_ses->nr_targets =1 ; tcp_ses->ignore_signature = ctx->ignore_signature; -/* thread spawned, put it on the list */ + + tcp_ses->tsk =kthread_create (cifs_demultiplex_thread, + tcp_ses,"cifsd" ); +if (IS_ERR (tcp_ses->tsk)) { + rc =PTR_ERR (tcp_ses->tsk); +cifs_dbg (VFS ,"error %d create cifsd thread\n" , rc); +module_put (THIS_MODULE ); + goto out_err_crypto_release; + } +/* thread created, put it on the list */ spin_lock (&cifs_tcp_ses_lock);list_add (&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);spin_unlock (&cifs_tcp_ses_lock);
@@ -1905,6 +1904,12 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,/* queue echo request delayed work */ queue_delayed_work (cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval); +/* +* Use split create/wake logic to ensure that tcp_ses is fully populated +* and tcp_ses->tsk is valid +*/ +wake_up_process (tcp_ses->tsk); +return tcp_ses; out_err_crypto_release:
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 415/1250 i3c: mipi-i3c-hci: Tolerate i3c_master_add_i3c_dev_locked() failures in DAA
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
[ Upstream commit c236563c8a84239d31a1e6ec4444887a7b5ed98f ]
i3c_master_add_i3c_dev_locked() no longer leaves the address marked as free on failure, so aborting the DAA sequence on its error is unnecessary.
Failure to register a discovered device does not invalidate the entire Dynamic Address Assignment (DAA) procedure. Align with the behavior of other I3C master drivers by ignoring errors from i3c_master_add_i3c_dev_locked() and continuing enumeration.
--- drivers/i3c/master/mipi-i3c-hci/cmd_v1.c | 4 +--- drivers/i3c/master/mipi-i3c-hci/cmd_v2.c | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-)
drivers/i3c/master/mipi-i3c-hci/cmd_v1.c +1 -3
@@ -362,9 +362,7 @@ static int hci_cmd_v1_daa(struct i3c_hci *hci)* TODO: Extend the subsystem layer to allow for registering * new device and provide BCR/DCR/PID at the same time. */ - ret =i3c_master_add_i3c_dev_locked (&hci->master, next_addr); -if (ret) -break ; +i3c_master_add_i3c_dev_locked (&hci->master, next_addr); }if (dat_idx >=0 )
drivers/i3c/master/mipi-i3c-hci/cmd_v2.c +1 -3
@@ -300,9 +300,7 @@ static int hci_cmd_v2_daa(struct i3c_hci *hci)* TODO: Extend the subsystem layer to allow for registering * new device and provide BCR/DCR/PID at the same time. */ - ret =i3c_master_add_i3c_dev_locked (&hci->master, next_addr); -if (ret) -break ; +i3c_master_add_i3c_dev_locked (&hci->master, next_addr); }hci_free_xfer (xfer,2 );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 416/1250 bpftool: Pass host flags to bootstrap libbpf
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leo Yan <[email protected]>
[ Upstream commit 9080b97689dbf8d2c338a9af97cd2b4a714f25bf ]
bpftool builds a bootstrap libbpf with HOSTCC, but the libbpf submake can still inherit target build flags through CFLAGS. This can break cross builds when host objects are compiled with target-only options.
Since HOST_CFLAGS contains warning options that are not suitable for building libbpf, use LIBBPF_BOOTSTRAP_CFLAGS with the warning options removed to build the bootstrap libbpf. Clear EXTRA_CFLAGS so target extra flags are not mixed into the host bootstrap libbpf build.
--- tools/bpf/bpftool/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
tools/bpf/bpftool/Makefile +5 -1
@@ -47,7 +47,8 @@ $(LIBBPF_INTERNAL_HDRS): $(LIBBPF_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_HDRS_ $(LIBBPF_BOOTSTRAP): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_BOOTSTRAP_OUTPUT) $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) \ DESTDIR=$(LIBBPF_BOOTSTRAP_DESTDIR:/=) prefix= \ - ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)" $@ install_headers + ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)" \ + CFLAGS="$(LIBBPF_BOOTSTRAP_CFLAGS)" EXTRA_CFLAGS= $@ install_headers $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS): $(LIBBPF_BOOTSTRAP_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_BOOTSTRAP_HDRS_DIR) $(call QUIET_INSTALL, $@)
@@ -92,6 +93,9 @@ HOST_CFLAGS := $(subst -I$(LIBBPF_INCLUDE),-I$(LIBBPF_BOOTSTRAP_INCLUDE),\ $(subst $(CLANG_CROSS_FLAGS),,$(CFLAGS))) HOST_LDFLAGS := $(LDFLAGS) +# Remove warnings for libbpf bootstrap build +LIBBPF_BOOTSTRAP_CFLAGS := $(filter-out -W -Wall -Wextra -Wformat -Wformat-signedness,$(HOST_CFLAGS)) + INSTALL ?= install RM ?= rm -f
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 417/1250 sparc: Disable compat support with LLD
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 852fed2e8bfe195351fb0078ba7245d41154e7a5 ]
An LLVM=1 sparc64 allmodconfig enables COMPAT and then tries to build the 32-bit vDSO. That path cannot be linked with ld.lld:
ld.lld: error: unknown emulation: elf32_sparc
ld.lld does not support the 32-bit SPARC ELF emulation used for the compat vDSO, so keep COMPAT disabled when LLD is the linker. This avoids selecting an unsupported build path while leaving the existing GNU ld configuration unchanged.
--- arch/sparc/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/sparc/Kconfig +1 -0
@@ -470,6 +470,7 @@ endmenu config COMPAT bool depends on SPARC64 + depends on !LD_IS_LLD default y select HAVE_UID16 select ARCH_WANT_OLD_COMPAT_IPC
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 418/1250 exfat: fix handling of damaged volume in exfat_create_upcase_table()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Timber <[email protected]>
[ Upstream commit 20dd3185d13865214ff25b0bf7b931e8d73be1ac ]
When the size of the upcase table is set to zero in the dentry for any reason(e.g. corrupted media or misbehaving device), an integer overflow causes the module to loop indefinitely.
If the size of the upcase table is read zero, do not attempt to load the table. Instead, fallback to loading the default upcase table. If the size of the upcase table is zero or no upcase table is found, raise exfat_fs_error() to mark the volume read-only.
--- fs/exfat/nls.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
fs/exfat/nls.c +13 -6
@@ -769,13 +769,18 @@ int exfat_create_upcase_table(struct super_block *sb) tbl_clu =le32_to_cpu (ep->dentry.upcase.start_clu); tbl_size =le64_to_cpu (ep->dentry.upcase.size); - - sector =exfat_cluster_to_sector (sbi, tbl_clu); - num_sectors = ((tbl_size -1 ) >> blksize_bits) +1 ; - ret =exfat_load_upcase_table (sb, sector, num_sectors, -le32_to_cpu (ep->dentry.upcase.checksum)); - +if (tbl_size) { + sector =exfat_cluster_to_sector (sbi, tbl_clu); + num_sectors = ((tbl_size -1 ) >> blksize_bits) +1 ; + ret =exfat_load_upcase_table (sb, sector, num_sectors, +le32_to_cpu (ep->dentry.upcase.checksum)); + }else { +exfat_fs_error (sb, +"bad upcase table size (0 bytes). Please run fsck" ); + ret = -EINVAL ; + }brelse (bh); +if (ret && ret != -EIO ) {/* free memory from exfat_load_upcase_table call */ exfat_free_upcase_table (sbi);
@@ -790,6 +795,8 @@ int exfat_create_upcase_table(struct super_block *sb)return -EIO ; } +exfat_fs_error (sb,"no upcase table entry. Please run fsck" ); + load_default:/* load default upcase table */ return exfat_load_default_upcase_table (sb);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 419/1250 ALSA: hda/realtek: Add quirk for Lenovo Xiaoxin 14 GT
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viktor Menshin <[email protected]>
[ Upstream commit 3a3e810e91080a5121170ee11554a55ed89a1c8b ]
The Lenovo Xiaoxin 14 GT (Chinese market model, AMD Ryzen AI 9 365) produces constant electrical hissing and crackling noise from both internal speakers and 3.5mm headphone jack during audio playback. Audio works correctly on Windows.
The PCI SSID 17aa:3912 is not present in the quirk list. The device shares the same AMD platform and ALC287 codec as neighboring Lenovo 14" AMD models (17aa:3911, 17aa:390d), so apply the same fixup.
Note: the fixup selection is based on similarity with neighboring models and has not been verified by testing a compiled kernel. Guidance from maintainers on the correct fixup is welcome.
--- sound/hda/codecs/realtek/alc269.c | 1 + 1 file changed, 1 insertion(+)
sound/hda/codecs/realtek/alc269.c +1 -0
@@ -7508,6 +7508,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x17aa ,0x3902 ,"Lenovo E50-80" ,ALC269_FIXUP_DMIC_THINKPAD_ACPI ),SND_PCI_QUIRK (0x17aa ,0x390d ,"Lenovo Yoga Pro 7 14ASP10" ,ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN ),SND_PCI_QUIRK (0x17aa ,0x3911 ,"Lenovo Yoga Pro 7 14IAH10" ,ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN ), +SND_PCI_QUIRK (0x17aa ,0x3912 ,"Lenovo Xiaoxin 14 GT" ,ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN ),SND_PCI_QUIRK (0x17aa ,0x3913 ,"Lenovo 145" ,ALC236_FIXUP_LENOVO_INV_DMIC ),SND_PCI_QUIRK (0x17aa ,0x391f ,"Yoga S990-16 pro Quad YC Quad" ,ALC287_FIXUP_TXNW2781_I2C ), SND_PCI_QUIRK(0x17aa, 0x3920, "Yoga S990-16 pro Quad VECO Quad", ALC287_FIXUP_TXNW2781_I2C),
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 420/1250 virtio-fs: avoid double-free on failed queue setup
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yung-Tse Cheng <[email protected]>
[ Upstream commit 6af3330ec5d5fb8c06c04eb520a71cf73ea5a765 ]
virtio_fs_setup_vqs() allocates fs->vqs and fs->mq_map before calling virtio_find_vqs(). If virtio_find_vqs() fails, the error path frees both pointers and returns an error to virtio_fs_probe().
virtio_fs_probe() then drops the last kobject reference, and virtio_fs_ktype_release() frees fs->vqs and fs->mq_map again. This leaves dangling pointers in struct virtio_fs and can trigger a double-free during probe failure cleanup.
Set fs->vqs and fs->mq_map to NULL immediately after kfree() in the virtio_fs_setup_vqs() error path so that the later kobject release sees an uninitialized state and kfree(NULL) becomes harmless.
This can be reproduced when a broken virtio-fs device advertises more request queues than the transport actually provides. In that case virtio_find_vqs() fails while setting up the extra queue, and the probe path reaches the double-free cleanup sequence.
--- fs/fuse/virtio_fs.c | 2 ++ 1 file changed, 2 insertions(+)
fs/fuse/virtio_fs.c +2 -0
@@ -988,7 +988,9 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,kfree (vqs);if (ret) {kfree (fs->vqs); + fs->vqs =NULL ;kfree (fs->mq_map); + fs->mq_map =NULL ; }return ret; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 421/1250 HID: hidpp: fix potential UAF in hidpp_connect_event()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Kosina <[email protected]>
[ Upstream commit 6df6b1f2c49678211f65647c300bc51dda02893b ]
If input_register_device() fails, we call input_free_device(), but keep stale pointer to the old device in hidpp->input, which could potentially lead to UAF. Fix that by resetting it to NULL before returning from hidpp_connect_event().
--- drivers/hid/hid-logitech-hidpp.c | 1 + 1 file changed, 1 insertion(+)
drivers/hid/hid-logitech-hidpp.c +1 -0
@@ -4280,6 +4280,7 @@ static void hidpp_connect_event(struct work_struct *work) ret =input_register_device (input);if (ret) { + hidpp->input =NULL ;input_free_device (input);return ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 422/1250 fuse: set ff->flock only on success
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Tianci <[email protected]>
[ Upstream commit 71947173cef279be5eed209ec28f8c11f9d73159 ]
If FUSE_SETLK fails (e.g., due to EWOULDBLOCK), we shall not set FUSE_RELEASE_FLOCK_UNLOCK in fuse_file_release().
--- fs/fuse/file.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/fuse/file.c +2 -1
@@ -2524,8 +2524,9 @@ static int fuse_file_flock(struct file *file, int cmd, struct file_lock *fl)struct fuse_file *ff = file->private_data;/* emulate flock with POSIX locks */ - ff->flock = true; err =fuse_setlk (file, fl,1 ); +if (!err) + ff->flock = true; }return err;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 423/1250 scsi: bfa: Reduce kernel stack usage in bfa_fcs_lport_fdmi_build_portattr_block()
In reply to Greg Kroah-Hartman6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 57a6ed0b41677ccc5e28cc0976e495c1dfa33747 ]
bfa_fcs_fdmi_get_portattr() gets inlined into multiple places and has two fairly large variables on the stack, to the point of causing a warning in some randconfig builds:
drivers/scsi/bfa/bfa_fcs_lport.c:2198:1: error: stack frame size (1560) exceeds limit (1280) in 'bfa_fcs_lport_fdmi_build_portattr_block' [-Werror,-Wframe-larger-than]
2198 | bfa_fcs_lport_fdmi_build_portattr_block(struct bfa_fcs_lport_fdmi_s *fdmi,
| ^
drivers/scsi/bfa/bfa_fcs_lport.c:1856:1: error: stack frame size (1600) exceeds limit (1280) in 'bfa_fcs_lport_fdmi_build_rhba_pyld' [-Werror,-Wframe-larger-than]
1856 | bfa_fcs_lport_fdmi_build_rhba_pyld(struct bfa_fcs_lport_fdmi_s *fdmi, u8 *pyld)
| ^Mark the inner function as noinline_for_stack to keep it separate from the other variables and prevent multiple copies of the same variable to get inlined here.
--- drivers/scsi/bfa/bfa_fcs_lport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/bfa/bfa_fcs_lport.c +1 -1
@@ -2627,7 +2627,7 @@ bfa_fcs_fdmi_get_hbaattr(struct bfa_fcs_lport_fdmi_s *fdmi, } -static void +static noinline_for_stack voidbfa_fcs_fdmi_get_portattr (struct bfa_fcs_lport_fdmi_s *fdmi,struct bfa_fcs_fdmi_port_attr_s *port_attr) {
Signature · 1 line
2.53.0