6.17.8-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainerPATCH 270/849 drm/sharp-memory: Do not access GEM-DMA vaddr directly
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
[ Upstream commit 136c374d8c80378d2982a46b2adabfc007299641 ]
Use DRM's shadow-plane helper to map and access the GEM object's buffer within kernel address space. Encapsulates the vmap logic in the GEM-DMA helpers.
The sharp-memory driver currently reads the vaddr field from the GME buffer object directly. This only works because GEM code 'automagically' sets vaddr.
Shadow-plane helpers perform the same steps, but with correct abstraction behind drm_gem_vmap(). The shadow-plane state provides the buffer address in kernel address space and the format-conversion state.
v2:
- fix typo in commit description
--- drivers/gpu/drm/tiny/sharp-memory.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-)
drivers/gpu/drm/tiny/sharp-memory.c +13 -14
@@ -126,28 +126,28 @@ static inline void sharp_memory_set_tx_buffer_addresses(u8 *buffer,static void sharp_memory_set_tx_buffer_data (u8 *buffer,struct drm_framebuffer *fb, +const struct iosys_map *vmap,struct drm_rect clip,u32 pitch,struct drm_format_conv_state *fmtcnv_state) {int ret; -struct iosys_map dst, vmap; -struct drm_gem_dma_object *dma_obj =drm_fb_dma_get_gem_obj (fb,0 ); +struct iosys_map dst; ret =drm_gem_fb_begin_cpu_access (fb,DMA_FROM_DEVICE );if (ret)return ;iosys_map_set_vaddr (&dst, buffer); -iosys_map_set_vaddr (&vmap, dma_obj->vaddr); -drm_fb_xrgb8888_to_mono (&dst, &pitch, &vmap, fb, &clip, fmtcnv_state); +drm_fb_xrgb8888_to_mono (&dst, &pitch, vmap, fb, &clip, fmtcnv_state);drm_gem_fb_end_cpu_access (fb,DMA_FROM_DEVICE ); }static int sharp_memory_update_display (struct sharp_memory_device *smd,struct drm_framebuffer *fb, +const struct iosys_map *vmap,struct drm_rect clip,struct drm_format_conv_state *fmtcnv_state) {
@@ -163,7 +163,7 @@ static int sharp_memory_update_display(struct sharp_memory_device *smd,sharp_memory_set_tx_buffer_mode (&tx_buffer[0 ],SHARP_MEMORY_DISPLAY_UPDATE_MODE , vcom);sharp_memory_set_tx_buffer_addresses (&tx_buffer[1 ], clip, pitch); -sharp_memory_set_tx_buffer_data (&tx_buffer[2 ], fb, clip, pitch, fmtcnv_state); +sharp_memory_set_tx_buffer_data (&tx_buffer[2 ], fb, vmap, clip, pitch, fmtcnv_state); ret =sharp_memory_spi_write (smd->spi, tx_buffer, tx_buffer_size);
@@ -206,7 +206,8 @@ static int sharp_memory_clear_display(struct sharp_memory_device *smd)return ret; } -static void sharp_memory_fb_dirty (struct drm_framebuffer *fb,struct drm_rect *rect, +static void sharp_memory_fb_dirty (struct drm_framebuffer *fb,const struct iosys_map *vmap, +struct drm_rect *rect,struct drm_format_conv_state *fmtconv_state) {struct drm_rect clip;
@@ -218,7 +219,7 @@ static void sharp_memory_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *r clip.y1 = rect->y1; clip.y2 = rect->y2; -sharp_memory_update_display (smd, fb, clip, fmtconv_state); +sharp_memory_update_display (smd, fb, vmap, clip, fmtconv_state); } static int sharp_memory_plane_atomic_check(struct drm_plane *plane,
@@ -242,7 +243,7 @@ static void sharp_memory_plane_atomic_update(struct drm_plane *plane, {struct drm_plane_state *old_state =drm_atomic_get_old_plane_state (state, plane);struct drm_plane_state *plane_state = plane->state; -struct drm_format_conv_state fmtcnv_state =DRM_FORMAT_CONV_STATE_INIT ; +struct drm_shadow_plane_state *shadow_plane_state =to_drm_shadow_plane_state (plane_state);struct sharp_memory_device *smd;struct drm_rect rect;
@@ -251,15 +252,15 @@ static void sharp_memory_plane_atomic_update(struct drm_plane *plane,return ;if (drm_atomic_helper_damage_merged (old_state, plane_state, &rect)) -sharp_memory_fb_dirty (plane_state->fb, &rect, &fmtcnv_state); - -drm_format_conv_state_release (&fmtcnv_state); +sharp_memory_fb_dirty (plane_state->fb, shadow_plane_state->data, + &rect, &shadow_plane_state->fmtcnv_state); }static const struct drm_plane_helper_funcs sharp_memory_plane_helper_funcs = { .prepare_fb = drm_gem_plane_helper_prepare_fb, .atomic_check = sharp_memory_plane_atomic_check, .atomic_update = sharp_memory_plane_atomic_update, +DRM_GEM_SHADOW_PLANE_HELPER_FUNCS , }; static bool sharp_memory_format_mod_supported(struct drm_plane *plane,
@@ -273,9 +274,7 @@ static const struct drm_plane_funcs sharp_memory_plane_funcs = { .update_plane = drm_atomic_helper_update_plane, .disable_plane = drm_atomic_helper_disable_plane, .destroy = drm_plane_cleanup, - .reset = drm_atomic_helper_plane_reset, - .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, - .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, +DRM_GEM_SHADOW_PLANE_FUNCS , .format_mod_supported = sharp_memory_format_mod_supported, };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 271/849 PCI: Disable MSI on RDC PCI to PCIe bridges
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcos Del Sol Vives <[email protected]>
[ Upstream commit ebc7086b39e5e4f3d3ca82caaea20538c9b62d42 ]
RDC PCI to PCIe bridges, present on Vortex86DX3 and Vortex86EX2 SoCs, do not support MSIs. If enabled, interrupts generated by PCIe devices never reach the processor.
I have contacted the manufacturer (DM&P) and they confirmed that PCI MSIs need to be disabled for them.
--- drivers/pci/quirks.c | 1 + 1 file changed, 1 insertion(+)
drivers/pci/quirks.c +1 -0
@@ -2717,6 +2717,7 @@ static void quirk_disable_msi(struct pci_dev *dev)DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_AMD ,PCI_DEVICE_ID_AMD_8131_BRIDGE , quirk_disable_msi);DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_VIA ,0xa238 , quirk_disable_msi);DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_ATI ,0x5a3f , quirk_disable_msi); +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_RDC ,0x1031 , quirk_disable_msi);/* * The APC bridge device in AMD 780 family northbridges has some random
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 272/849 drm/nouveau: always set RMDevidCheckIgnore for GSP-RM
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Tabi <[email protected]>
[ Upstream commit 27738c3003bf3b124527c9ed75e1e0d0c013c101 ]
Always set the RMDevidCheckIgnore registry key for GSP-RM so that it will continue support newer variants of already supported GPUs.
GSP-RM maintains an internal list of PCI IDs of GPUs that it supports, and checks if the current GPU is on this list. While the actual GPU architecture (as specified in the BOOT_0/BOOT_42 registers) determines how to enable the GPU, the PCI ID is used for the product name, e.g. "NVIDIA GeForce RTX 5090".
Unfortunately, if there is no match, GSP-RM will refuse to initialize, even if the device is fully supported. Nouveau will get an error return code, but by then it's too late. This behavior may be corrected in a future version of GSP-RM, but that does not help Nouveau today.
Fortunately, GSP-RM supports an undocumented registry key that tells it to ignore the mismatch. In such cases, the product name returned will be a blank string, but otherwise GSP-RM will continue.
Unlike Nvidia's proprietary driver, Nouveau cannot update to newer firmware versions to keep up with every new hardware release. Instead, we can permanently set this registry key, and GSP-RM will continue to function the same with known hardware.
--- drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c +3 -0
@@ -582,10 +582,13 @@ struct nv_gsp_registry_entries {* RMSecBusResetEnable - enables PCI secondary bus reset * RMForcePcieConfigSave - forces GSP-RM to preserve PCI configuration * registers on any PCI reset. +* RMDevidCheckIgnore - allows GSP-RM to boot even if the PCI dev ID +* is not found in the internal product name database. */ static const struct nv_gsp_registry_entries r535_registry_entries[] = { {"RMSecBusResetEnable" ,1 }, {"RMForcePcieConfigSave" ,1 }, + {"RMDevidCheckIgnore" ,1 }, };#define NV_GSP_REG_NUM_ENTRIES ARRAY_SIZE(r535_registry_entries)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 273/849 drm/panel-edp: Add SHP LQ134Z1 panel for Dell XPS 9345
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christopher Orr <[email protected]>
[ Upstream commit 754dbf164acd4d22dd7a5241b1880f54546d68f2 ]
Introduce high-res OLED panel for the Dell XPS 9345
These timings were selected based on Alex Vinarkskis' commit, (6b3815c6815f07acc7eeffa8ae734d1a1c0ee817) for the LQ134N1 and seem to work fine for the high-res OLED panel on the 9345.
The raw edid for this SHP panel is:
00 ff ff ff ff ff ff 00 4d 10 8f 15 00 00 00 00 2e 21 01 04 b5 1d 12 78 03 0f 95 ae 52 43 b0 26 0f 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 fd d7 00 a0 a0 40 fc 66 30 20 36 00 20 b4 10 00 00 18 00 00 00 fd 00 1e 78 cc cc 38 01 0a 20 20 20 20 20 20 00 00 00 fe 00 43 37 31 4d 31 81 4c 51 31 33 34 5a 31 00 00 00 00 00 02 41 0c 32 01 01 00 00 0b 41 0a 20 20 01 ea
70 20 79 02 00 20 00 13 8c 52 19 8f 15 00 00 00 00 2e 17 07 4c 51 31 33 34 5a 31 21 00 1d 40 0b 08 07 00 0a 40 06 88 e1 fa 51 3d a4 b0 66 62 0f 02 45 54 d0 5f d0 5f 00 34 13 78 26 00 09 06 00 00 00 00 00 41 00 00 22 00 14 d9 6f 08 05 ff 09 9f 00 2f 00 1f 00 3f 06 5d 00 02 00 05 00 25 01 09 d9 6f 08 d9 6f 08 1e 78 80 81 00 0b e3 05 80 00 e6 06 05 01 6a 6a 39 00 00 00 00 00 00 58 90
--- drivers/gpu/drm/panel/panel-edp.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/panel/panel-edp.c +1 -0
@@ -2035,6 +2035,7 @@ static const struct edp_panel_entry edp_panels[] = {EDP_PANEL_ENTRY ('S' ,'H' ,'P' ,0x1523 , &delay_80_500_e50,"LQ140M1JW46" ),EDP_PANEL_ENTRY ('S' ,'H' ,'P' ,0x153a , &delay_200_500_e50,"LQ140T1JH01" ),EDP_PANEL_ENTRY ('S' ,'H' ,'P' ,0x154c , &delay_200_500_p2e100,"LQ116M1JW10" ), +EDP_PANEL_ENTRY ('S' ,'H' ,'P' ,0x158f , &delay_200_500_p2e100,"LQ134Z1" ),EDP_PANEL_ENTRY ('S' ,'H' ,'P' ,0x1593 , &delay_200_500_p2e100,"LQ134N1" ), EDP_PANEL_ENTRY('S', 'T', 'A', 0x0004, &delay_200_500_e200, "116KHD024006"),
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 274/849 selftests/net: Replace non-standard __WORDSIZE with sizeof(long) * 8
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wake Liu <[email protected]>
[ Upstream commit c36748e8733ef9c5f4cd1d7c4327994e5b88b8df ]
The __WORDSIZE macro, defined in the non-standard <bits/wordsize.h> header, is a GNU extension and not universally available with all toolchains, such as Clang when used with musl libc.
This can lead to build failures in environments where this header is missing.
The intention of the code is to determine the bit width of a C long. Replace the non-portable __WORDSIZE with the standard and portable sizeof(long) * 8 expression to achieve the same result.
This change also removes the inclusion of the now-unused <bits/wordsize.h> header.
--- tools/testing/selftests/net/psock_tpacket.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
tools/testing/selftests/net/psock_tpacket.c +1 -2
@@ -33,7 +33,6 @@#include <ctype.h> #include <fcntl.h> #include <unistd.h> -#include <bits/wordsize.h> #include <net/ethernet.h> #include <netinet/ip.h> #include <arpa/inet.h>
@@ -785,7 +784,7 @@ static int test_kernel_bit_width(void)static int test_user_bit_width (void ) { -return __WORDSIZE; +return sizeof (long ) *8 ; }static const char *tpacket_str[] = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 275/849 selftests/net: Ensure assert() triggers in psock_tpacket.c
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wake Liu <[email protected]>
[ Upstream commit bc4c0a48bdad7f225740b8e750fdc1da6d85e1eb ]
The get_next_frame() function in psock_tpacket.c was missing a return statement in its default switch case, leading to a compiler warning.
This was caused by a bug_on(1) call, which is defined as an assert(), being compiled out because NDEBUG is defined during the build.
Instead of adding a return NULL; which would silently hide the error and could lead to crashes later, this change restores the original author's intent. By adding #undef NDEBUG before including <assert.h>, we ensure the assertion is active and will cause the test to abort if this unreachable code is ever executed.
--- tools/testing/selftests/net/psock_tpacket.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/net/psock_tpacket.c +1 -0
@@ -22,6 +22,7 @@* - TPACKET_V3: RX_RING */ +#undef NDEBUG#include <stdio.h> #include <stdlib.h> #include <sys/types.h>
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 276/849 wifi: rtw89: print just once for unknown C2H events
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ping-Ke Shih <[email protected]>
[ Upstream commit 7e1c44fe4c2e1e01fa47d9490893d95309a99687 ]
When driver receives new or unknown C2H events, it print out messages repeatedly once events are received, like
rtw89_8922ae 0000:81:00.0: PHY c2h class 2 not support
To avoid the thousands of messages, use rtw89_info_once() instead. Also, print out class/func for unknown (undefined) class.
--- drivers/net/wireless/realtek/rtw89/debug.h | 1 + drivers/net/wireless/realtek/rtw89/mac.c | 7 +++---- drivers/net/wireless/realtek/rtw89/phy.c | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-)
drivers/net/wireless/realtek/rtw89/debug.h +1 -0
@@ -56,6 +56,7 @@ static inline void rtw89_debugfs_deinit(struct rtw89_dev *rtwdev) {}#endif #define rtw89_info(rtwdev, a...) dev_info((rtwdev)->dev, ##a) +#define rtw89_info_once(rtwdev, a...) dev_info_once((rtwdev)->dev, ##a) #define rtw89_warn(rtwdev, a...) dev_warn((rtwdev)->dev, ##a) #define rtw89_err(rtwdev, a...) dev_err((rtwdev)->dev, ##a)
drivers/net/wireless/realtek/rtw89/mac.c +3 -4
@@ -5813,12 +5813,11 @@ void rtw89_mac_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,case RTW89_MAC_C2H_CLASS_ROLE :return ;default : -rtw89_info (rtwdev,"MAC c2h class %d not support\n" , class); -return ; +break ; }if (!handler) { -rtw89_info (rtwdev,"MAC c2h class %d func %d not support\n" , class, - func); +rtw89_info_once (rtwdev,"MAC c2h class %d func %d not support\n" , + class, func);return ; }handler (rtwdev, skb, len);
drivers/net/wireless/realtek/rtw89/phy.c +3 -4
@@ -3626,12 +3626,11 @@ void rtw89_phy_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, handler = rtw89_phy_c2h_dm_handler[func];break ;default : -rtw89_info (rtwdev,"PHY c2h class %d not support\n" , class); -return ; +break ; }if (!handler) { -rtw89_info (rtwdev,"PHY c2h class %d func %d not support\n" , class, - func); +rtw89_info_once (rtwdev,"PHY c2h class %d func %d not support\n" , + class, func);return ; }handler (rtwdev, skb, len);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 277/849 wifi: rtw88: sdio: use indirect IO for device registers before power-on
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ping-Ke Shih <[email protected]>
[ Upstream commit 58de1f91e033b1fface8d8948984583125f93736 ]
The register REG_SYS_CFG1 is used to determine chip basic information as arguments of following flows, such as download firmware and load PHY parameters, so driver read the value early (before power-on).
However, the direct IO is disallowed before power-on, or it causes wrong values, which driver recognizes a chip as a wrong type RF_1T1R, but actually RF_2T2R, causing driver warns:
rtw88_8822cs mmc1:0001:1: unsupported rf path (1)
Fix it by using indirect IO before power-on.
--- drivers/net/wireless/realtek/rtw88/sdio.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/realtek/rtw88/sdio.c +4 -0
@@ -144,6 +144,10 @@ static u32 rtw_sdio_to_io_address(struct rtw_dev *rtwdev, u32 addr,static bool rtw_sdio_use_direct_io (struct rtw_dev *rtwdev,u32 addr) { +if (!test_bit (RTW_FLAG_POWERON , rtwdev->flags) && + !rtw_sdio_is_bus_addr (addr)) +return false; +return !rtw_sdio_is_sdio30_supported (rtwdev) ||rtw_sdio_is_bus_addr (addr); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 278/849 wifi: rtw89: add dummy C2H handlers for BCN resend and update done
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ping-Ke Shih <[email protected]>
[ Upstream commit 04a2de8cfc95076d6c65d4d6d06d0f9d964a2105 ]
Two C2H events are not listed, and driver throws
MAC c2h class 0 func 6 not support
MAC c2h class 1 func 3 not support
Since the implementation in vendor driver does nothing, add two dummy functions for them.
--- drivers/net/wireless/realtek/rtw89/mac.c | 13 ++++++++++++- drivers/net/wireless/realtek/rtw89/mac.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/mac.c +12 -1
@@ -5235,6 +5235,11 @@ rtw89_mac_c2h_bcn_cnt(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len) { } +static void +rtw89_mac_c2h_bcn_upd_done (struct rtw89_dev *rtwdev,struct sk_buff *c2h,u32 len) +{ +} +static void rtw89_mac_c2h_pkt_ofld_rsp (struct rtw89_dev *rtwdev,struct sk_buff *skb_c2h,u32 len)
@@ -5257,6 +5262,11 @@ rtw89_mac_c2h_pkt_ofld_rsp(struct rtw89_dev *rtwdev, struct sk_buff *skb_c2h,rtw89_complete_cond (wait, cond, &data); } +static void +rtw89_mac_c2h_bcn_resend (struct rtw89_dev *rtwdev,struct sk_buff *c2h,u32 len) +{ +} +static void rtw89_mac_c2h_tx_duty_rpt (struct rtw89_dev *rtwdev,struct sk_buff *skb_c2h,u32 len) {
@@ -5646,7 +5656,7 @@ void (* const rtw89_mac_c2h_ofld_handler[])(struct rtw89_dev *rtwdev, [RTW89_MAC_C2H_FUNC_EFUSE_DUMP] = NULL, [RTW89_MAC_C2H_FUNC_READ_RSP] = NULL, [RTW89_MAC_C2H_FUNC_PKT_OFLD_RSP] = rtw89_mac_c2h_pkt_ofld_rsp, - [RTW89_MAC_C2H_FUNC_BCN_RESEND] = NULL, + [RTW89_MAC_C2H_FUNC_BCN_RESEND] = rtw89_mac_c2h_bcn_resend, [RTW89_MAC_C2H_FUNC_MACID_PAUSE] = rtw89_mac_c2h_macid_pause, [RTW89_MAC_C2H_FUNC_SCANOFLD_RSP] = rtw89_mac_c2h_scanofld_rsp, [RTW89_MAC_C2H_FUNC_TX_DUTY_RPT] = rtw89_mac_c2h_tx_duty_rpt,
@@ -5661,6 +5671,7 @@ void (* const rtw89_mac_c2h_info_handler[])(struct rtw89_dev *rtwdev, [RTW89_MAC_C2H_FUNC_DONE_ACK] = rtw89_mac_c2h_done_ack, [RTW89_MAC_C2H_FUNC_C2H_LOG] = rtw89_mac_c2h_log, [RTW89_MAC_C2H_FUNC_BCN_CNT] = rtw89_mac_c2h_bcn_cnt, + [RTW89_MAC_C2H_FUNC_BCN_UPD_DONE] = rtw89_mac_c2h_bcn_upd_done, }; static
drivers/net/wireless/realtek/rtw89/mac.h +1 -0
@@ -419,6 +419,7 @@ enum rtw89_mac_c2h_info_func {RTW89_MAC_C2H_FUNC_DONE_ACK ,RTW89_MAC_C2H_FUNC_C2H_LOG ,RTW89_MAC_C2H_FUNC_BCN_CNT , +RTW89_MAC_C2H_FUNC_BCN_UPD_DONE =0x06 , RTW89_MAC_C2H_FUNC_INFO_MAX, };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 279/849 drm/amdkfd: return -ENOTTY for unsupported IOCTLs
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey McRae <[email protected]>
[ Upstream commit 57af162bfc8c05332a28c4d458d246cc46d2746d ]
Some kfd ioctls may not be available depending on the kernel version the user is running, as such we need to report -ENOTTY so userland can determine the cause of the ioctl failure.
--- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +6 -2
@@ -3252,8 +3252,10 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)int retcode = -EINVAL ;bool ptrace_attached = false; -if (nr >=AMDKFD_CORE_IOCTL_COUNT ) +if (nr >=AMDKFD_CORE_IOCTL_COUNT ) { + retcode = -ENOTTY ; goto err_i1; + }if ((nr >=AMDKFD_COMMAND_START ) && (nr <AMDKFD_COMMAND_END )) {u32 amdkfd_size;
@@ -3266,8 +3268,10 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) asize = amdkfd_size; cmd = ioctl->cmd; - }else + }else { + retcode = -ENOTTY ; goto err_i1; + }dev_dbg (kfd_device,"ioctl cmd 0x%x (#0x%x), arg 0x%lx\n" , cmd, nr, arg);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 280/849 selftests: drv-net: devmem: add / correct the IPv6 support
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 424e96de30230aac2061f941961be645cf0070d5 ]
We need to use bracketed IPv6 addresses for socat.
--- tools/testing/selftests/drivers/net/hw/devmem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/drivers/net/hw/devmem.py +1 -1
@@ -24,7 +24,7 @@ def check_rx(cfg) -> None: require_devmem(cfg) port = rand_port() - socat = f"socat -u - TCP{cfg.addr_ipver}:{cfg.addr}:{port},bind={cfg.remote_addr}:{port}" + socat = f"socat -u - TCP{cfg.addr_ipver}:{cfg.baddr}:{port},bind={cfg.remote_baddr}:{port}" listen_cmd = f"{cfg.bin_local} -l -f {cfg.ifname} -s {cfg.addr} -p {port} -c {cfg.remote_addr} -v 7" with bkg(listen_cmd, exit_wait=True) as ncdevmem:
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 281/849 selftests: drv-net: devmem: flip the direction of Tx tests
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit c378c497f3fe8dc8f08b487fce49c3d96e4cada8 ]
The Device Under Test should always be the local system. While the Rx test gets this right the Tx test is sending from remote to local. So Tx of DMABUF memory happens on remote.
These tests never run in NIPA since we don't have a compatible device so we haven't caught this.
--- tools/testing/selftests/drivers/net/hw/devmem.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
tools/testing/selftests/drivers/net/hw/devmem.py +6 -6
@@ -42,9 +42,9 @@ def check_tx(cfg) -> None: port = rand_port() listen_cmd = f"socat -U - TCP{cfg.addr_ipver}-LISTEN:{port}" - with bkg(listen_cmd) as socat: - wait_port_listen(port) - cmd(f"echo -e \"hello\\nworld\"| {cfg.bin_remote} -f {cfg.ifname} -s {cfg.addr} -p {port}", host=cfg.remote, shell=True) + with bkg(listen_cmd, host=cfg.remote, exit_wait=True) as socat: + wait_port_listen(port, host=cfg.remote) + cmd(f"echo -e \"hello\\nworld\"| {cfg.bin_local} -f {cfg.ifname} -s {cfg.remote_addr} -p {port}", shell=True) ksft_eq(socat.stdout.strip(), "hello\nworld")
@@ -56,9 +56,9 @@ def check_tx_chunks(cfg) -> None: port = rand_port() listen_cmd = f"socat -U - TCP{cfg.addr_ipver}-LISTEN:{port}" - with bkg(listen_cmd, exit_wait=True) as socat: - wait_port_listen(port) - cmd(f"echo -e \"hello\\nworld\"| {cfg.bin_remote} -f {cfg.ifname} -s {cfg.addr} -p {port} -z 3", host=cfg.remote, shell=True) + with bkg(listen_cmd, host=cfg.remote, exit_wait=True) as socat: + wait_port_listen(port, host=cfg.remote) + cmd(f"echo -e \"hello\\nworld\"| {cfg.bin_local} -f {cfg.ifname} -s {cfg.remote_addr} -p {port} -z 3", shell=True) ksft_eq(socat.stdout.strip(), "hello\nworld")
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 282/849 media: pci: ivtv: Dont create fake v4l2_fh
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laurent Pinchart <[email protected]>
[ Upstream commit cc6e8d1ccea792d8550428e0831e3a35b0ccfddc ]
The ivtv driver has a structure named ivtv_open_id that models an open file handle for the device. It embeds a v4l2_fh instance for file handles that correspond to a V4L2 video device, and stores a pointer to that v4l2_fh in struct ivtv_stream to identify which open file handle owns a particular stream.
In addition to video devices, streams can be owned by ALSA PCM devices. Those devices do not make use of the v4l2_fh instance for obvious reasons, but the snd_ivtv_pcm_capture_open() function still initializes a "fake" v4l2_fh for the sole purpose of using it as an open file handle identifier. The v4l2_fh is not properly destroyed when the ALSA PCM device is closed, leading to possible resource leaks.
Fortunately, the v4l2_fh instance pointed to by ivtv_stream is not accessed, only the pointer value is used for comparison. Replace it with a pointer to the ivtv_open_id structure that embeds the v4l2_fh, and don't initialize the v4l2_fh for ALSA PCM devices.
--- drivers/media/pci/ivtv/ivtv-alsa-pcm.c | 2 -- drivers/media/pci/ivtv/ivtv-driver.h | 3 ++- drivers/media/pci/ivtv/ivtv-fileops.c | 18 +++++++++--------- drivers/media/pci/ivtv/ivtv-irq.c | 4 ++-- 4 files changed, 13 insertions(+), 14 deletions(-)
drivers/media/pci/ivtv/ivtv-alsa-pcm.c +0 -2
@@ -148,14 +148,12 @@ static int snd_ivtv_pcm_capture_open(struct snd_pcm_substream *substream) s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM ]; -v4l2_fh_init (&item.fh, &s->vdev); item.itv = itv; item.type = s->type;/* See if the stream is available */ if (ivtv_claim_stream (&item, item.type)) {/* No, it's already in use */ -v4l2_fh_exit (&item.fh);snd_ivtv_unlock (itvsc);return -EBUSY ; }
drivers/media/pci/ivtv/ivtv-driver.h +2 -1
@@ -322,6 +322,7 @@ struct ivtv_queue { };struct ivtv ;/* forward reference */ +struct ivtv_open_id ;struct ivtv_stream {/* These first four fields are always set, even if the stream
@@ -331,7 +332,7 @@ struct ivtv_stream {const char *name;/* name of the stream */ int type;/* stream type */ -struct v4l2_fh *fh;/* pointer to the streaming filehandle */ +struct ivtv_open_id *id;/* pointer to the streaming ivtv_open_id */ spinlock_t qlock;/* locks access to the queues */ unsigned long s_flags;/* status flags, see above */ int dma;/* can be PCI_DMA_TODEVICE, PCI_DMA_FROMDEVICE or PCI_DMA_NONE */
drivers/media/pci/ivtv/ivtv-fileops.c +9 -9
@@ -39,16 +39,16 @@ int ivtv_claim_stream(struct ivtv_open_id *id, int type)if (test_and_set_bit (IVTV_F_S_CLAIMED , &s->s_flags)) {/* someone already claimed this stream */ -if (s->fh == &id->fh) { +if (s->id == id) {/* yes, this file descriptor did. So that's OK. */ return 0 ; } -if (s->fh ==NULL && (type ==IVTV_DEC_STREAM_TYPE_VBI || +if (s->id ==NULL && (type ==IVTV_DEC_STREAM_TYPE_VBI || type ==IVTV_ENC_STREAM_TYPE_VBI )) {/* VBI is handled already internally, now also assign the file descriptor to this stream for external reading of the stream. */ - s->fh = &id->fh; + s->id = id;IVTV_DEBUG_INFO ("Start Read VBI\n" );return 0 ; }
@@ -56,7 +56,7 @@ int ivtv_claim_stream(struct ivtv_open_id *id, int type)IVTV_DEBUG_INFO ("Stream %d is busy\n" , type);return -EBUSY ; } - s->fh = &id->fh; + s->id = id;if (type ==IVTV_DEC_STREAM_TYPE_VBI ) {/* Enable reinsertion interrupt */ ivtv_clear_irq_mask (itv,IVTV_IRQ_DEC_VBI_RE_INSERT );
@@ -94,7 +94,7 @@ void ivtv_release_stream(struct ivtv_stream *s)struct ivtv *itv = s->itv;struct ivtv_stream *s_vbi; - s->fh =NULL ; + s->id =NULL ;if ((s->type ==IVTV_DEC_STREAM_TYPE_VBI || s->type ==IVTV_ENC_STREAM_TYPE_VBI ) &&test_bit (IVTV_F_S_INTERNAL_USE , &s->s_flags)) {/* this stream is still in use internally */
@@ -126,7 +126,7 @@ void ivtv_release_stream(struct ivtv_stream *s)/* was already cleared */ return ; } -if (s_vbi->fh) { +if (s_vbi->id) {/* VBI stream still claimed by a file descriptor */ return ; }
@@ -359,7 +359,7 @@ static ssize_t ivtv_read(struct ivtv_stream *s, char __user *ubuf, size_t tot_cosize_t tot_written =0 ;int single_frame =0 ; -if (atomic_read (&itv->capturing) ==0 && s->fh ==NULL ) { +if (atomic_read (&itv->capturing) ==0 && s->id ==NULL ) {/* shouldn't happen */ IVTV_DEBUG_WARN ("Stream %s not initialized before read\n" , s->name);return -EIO ;
@@ -831,7 +831,7 @@ void ivtv_stop_capture(struct ivtv_open_id *id, int gop_end) id->type == IVTV_ENC_STREAM_TYPE_VBI) && test_bit(IVTV_F_S_INTERNAL_USE, &s->s_flags)) { /* Also used internally, don't stop capturing */ - s->fh = NULL; + s->id = NULL; } else {ivtv_stop_v4l2_encode_stream (s, gop_end);
@@ -915,7 +915,7 @@ int ivtv_v4l2_close(struct file *filp)v4l2_fh_exit (fh);/* Easy case first: this stream was never claimed by us */ -if (s->fh != &id->fh) +if (s->id != id) goto close_done;/* 'Unclaim' this stream */
drivers/media/pci/ivtv/ivtv-irq.c +2 -2
@@ -305,7 +305,7 @@ static void dma_post(struct ivtv_stream *s)ivtv_process_vbi_data (itv, buf,0 , s->type); s->q_dma.bytesused += buf->bytesused; } -if (s->fh ==NULL ) { +if (s->id ==NULL ) {ivtv_queue_move (s, &s->q_dma,NULL , &s->q_free,0 );return ; }
@@ -330,7 +330,7 @@ static void dma_post(struct ivtv_stream *s)set_bit (IVTV_F_I_HAVE_WORK , &itv->i_flags); } -if (s->fh) +if (s->id)wake_up (&s->waitq); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 283/849 media: amphion: Delete v4l2_fh synchronously in .release()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laurent Pinchart <[email protected]>
[ Upstream commit 19fb9c5b815f70eb90d5b545f65b83bc9c490ecd ]
The v4l2_fh initialized and added in vpu_v4l2_open() is delete and cleaned up when the last reference to the vpu_inst is released. This may happen later than at vpu_v4l2_close() time.
Not deleting and cleaning up the v4l2_fh when closing the file handle to the video device is not ideal, as the v4l2_fh will still be present in the video device's fh_list, and will store a copy of events queued to the video device. There may also be other side effects of keeping alive an object that represents an open file handle after the file handle is closed.
The v4l2_fh instance is embedded in the vpu_inst structure, and is accessed in two different ways:
- in vpu_notify_eos() and vpu_notify_source_change(), to queue V4L2 events to the file handle ; and
- through the driver to access the v4l2_fh.m2m_ctx pointer.
The v4l2_fh.m2m_ctx pointer is not touched by v4l2_fh_del() and v4l2_fh_exit(). It is set to NULL by the driver when closing the file handle, in vpu_v4l2_close().
The vpu_notify_eos() and vpu_notify_source_change() functions are called in vpu_set_last_buffer_dequeued() and vdec_handle_resolution_change() respectively, only if the v4l2_fh.m2m_ctx pointer is not NULL. There is therefore a guarantee that no new event will be queued to the v4l2_fh after vpu_v4l2_close() destroys the m2m_ctx.
The vpu_notify_eos() function is also called from vpu_vb2_buf_finish(), which is guaranteed to be called for all queued buffers when vpu_v4l2_close() calls v4l2_m2m_ctx_release(), and will not be called later.
It is therefore safe to assume that the driver will not touch the v4l2_fh, except to check the m2m_ctx pointer, after vpu_v4l2_close() destroys the m2m_ctx. We can safely delete and cleanup the v4l2_fh synchronously in vpu_v4l2_close().
--- drivers/media/platform/amphion/vpu_v4l2.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/media/platform/amphion/vpu_v4l2.c +5 -2
@@ -718,8 +718,6 @@ static int vpu_v4l2_release(struct vpu_inst *inst)v4l2_ctrl_handler_free (&inst->ctrl_handler);mutex_destroy (&inst->lock); -v4l2_fh_del (&inst->fh); -v4l2_fh_exit (&inst->fh);call_void_vop (inst, cleanup);
@@ -788,6 +786,8 @@ int vpu_v4l2_open(struct file *file, struct vpu_inst *inst)return 0 ; error: +v4l2_fh_del (&inst->fh); +v4l2_fh_exit (&inst->fh);vpu_inst_put (inst);return ret; }
@@ -807,6 +807,9 @@ int vpu_v4l2_close(struct file *file)call_void_vop (inst, release);vpu_inst_unlock (inst); +v4l2_fh_del (&inst->fh); +v4l2_fh_exit (&inst->fh); +vpu_inst_unregister (inst);vpu_inst_put (inst);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 284/849 drm/tidss: Use the crtc_* timings when programming the HW
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 478306edc23eec4f0ec24a46222485910c66212d ]
Use the crtc_* fields from drm_display_mode, instead of the "logical" fields. This shouldn't change anything in practice, but afaiu the crtc_* fields are the correct ones to use here.
--- drivers/gpu/drm/tidss/tidss_crtc.c | 2 +- drivers/gpu/drm/tidss/tidss_dispc.c | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-)
drivers/gpu/drm/tidss/tidss_crtc.c +1 -1
@@ -225,7 +225,7 @@ static void tidss_crtc_atomic_enable(struct drm_crtc *crtc,tidss_runtime_get (tidss); r =dispc_vp_set_clk_rate (tidss->dispc, tcrtc->hw_videoport, - mode->clock *1000 ); + mode->crtc_clock *1000 );if (r !=0 )return ;
drivers/gpu/drm/tidss/tidss_dispc.c +8 -8
@@ -1215,13 +1215,13 @@ void dispc_vp_enable(struct dispc_device *dispc, u32 hw_videoport,dispc_set_num_datalines (dispc, hw_videoport, fmt->data_width); - hfp = mode->hsync_start - mode->hdisplay; - hsw = mode->hsync_end - mode->hsync_start; - hbp = mode->htotal - mode->hsync_end; + hfp = mode->crtc_hsync_start - mode->crtc_hdisplay; + hsw = mode->crtc_hsync_end - mode->crtc_hsync_start; + hbp = mode->crtc_htotal - mode->crtc_hsync_end; - vfp = mode->vsync_start - mode->vdisplay; - vsw = mode->vsync_end - mode->vsync_start; - vbp = mode->vtotal - mode->vsync_end; + vfp = mode->crtc_vsync_start - mode->crtc_vdisplay; + vsw = mode->crtc_vsync_end - mode->crtc_vsync_start; + vbp = mode->crtc_vtotal - mode->crtc_vsync_end; dispc_vp_write(dispc, hw_videoport, DISPC_VP_TIMING_H, FLD_VAL(hsw - 1, 7, 0) |
@@ -1263,8 +1263,8 @@ void dispc_vp_enable(struct dispc_device *dispc, u32 hw_videoport, FLD_VAL(ivs, 12, 12));dispc_vp_write (dispc, hw_videoport,DISPC_VP_SIZE_SCREEN , -FLD_VAL (mode->hdisplay -1 ,11 ,0 ) | -FLD_VAL (mode->vdisplay -1 ,27 ,16 )); +FLD_VAL (mode->crtc_hdisplay -1 ,11 ,0 ) | +FLD_VAL (mode->crtc_vdisplay -1 ,27 ,16 ));VP_REG_FLD_MOD (dispc, hw_videoport,DISPC_VP_CONTROL ,1 ,0 ,0 ); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 285/849 drm/bridge: cdns-dsi: Fix REG_WAKEUP_TIME value
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit eea4f89b6461294ed6bea1d3285bb3f79c09a041 ]
The driver tries to calculate the value for REG_WAKEUP_TIME. However, the calculation itself is not correct, and to add on it, the resulting value is almost always larger than the field's size, so the actual result is more or less random.
According to the docs, figuring out the value for REG_WAKEUP_TIME requires HW characterization and there's no way to have a generic algorithm to come up with the value. That doesn't help at all...
However, we know that the value must be smaller than the line time, and, at least in my understanding, the proper value for it is quite small. Testing shows that setting it to 1/10 of the line time seems to work well. All video modes from my HDMI monitor work with this algorithm.
Hopefully we'll get more information on how to calculate the value, and we can then update this.
--- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +7 -1
@@ -882,7 +882,13 @@ static void cdns_dsi_bridge_atomic_pre_enable(struct drm_bridge *bridge, tx_byte_period =DIV_ROUND_DOWN_ULL ((u64 )NSEC_PER_SEC *8 , phy_cfg->hs_clk_rate); - reg_wakeup = (phy_cfg->hs_prepare + phy_cfg->hs_zero) / tx_byte_period; + +/* +* Estimated time [in clock cycles] to perform LP->HS on D-PHY. +* It is not clear how to calculate this, so for now, +* set it to 1/10 of the total number of clocks in a line. +*/ + reg_wakeup = dsi_cfg.htotal / nlanes /10 ;writel (REG_WAKEUP_TIME (reg_wakeup) |REG_LINE_DURATION (tmp), dsi->regs +VID_DPHY_TIME );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 286/849 drm/bridge: cdns-dsi: Dont fail on MIPI_DSI_MODE_VIDEO_BURST
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 7070f55f294745c5a3c033623b76309f3512be67 ]
While the cdns-dsi does not support DSI burst mode, the burst mode is essentially DSI event mode with more versatile clocking and timings. Thus cdns-dsi doesn't need to fail if the DSI peripheral driver requests MIPI_DSI_MODE_VIDEO_BURST.
In my particular use case, this allows the use of ti-sn65dsi83 driver.
--- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +0 -4
@@ -1088,10 +1088,6 @@ static int cdns_dsi_attach(struct mipi_dsi_host *host,if (output->dev)return -EBUSY ; -/* We do not support burst mode yet. */ -if (dev->mode_flags &MIPI_DSI_MODE_VIDEO_BURST ) -return -ENOTSUPP ; -/* * The host <-> device link might be described using an OF-graph * representation, in this case we extract the device of_node from
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 287/849 drm/tidss: Set crtc modesetting parameters with adjusted mode
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jayesh Choudhary <[email protected]>
[ Upstream commit cfb29225db20c56432a8525366321c0c09edfb2e ]
TIDSS uses crtc_* fields to propagate its registers and set the clock rates. So set the CRTC modesetting timing parameters with the adjusted mode when needed, to set correct values.
--- drivers/gpu/drm/tidss/tidss_crtc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/tidss/tidss_crtc.c +4 -1
@@ -91,7 +91,7 @@ static int tidss_crtc_atomic_check(struct drm_crtc *crtc,struct dispc_device *dispc = tidss->dispc;struct tidss_crtc *tcrtc =to_tidss_crtc (crtc);u32 hw_videoport = tcrtc->hw_videoport; -const struct drm_display_mode *mode; +struct drm_display_mode *mode;enum drm_mode_status ok;dev_dbg (ddev->dev,"%s\n" , __func__);
@@ -108,6 +108,9 @@ static int tidss_crtc_atomic_check(struct drm_crtc *crtc,return -EINVAL ; } +if (drm_atomic_crtc_needs_modeset (crtc_state)) +drm_mode_set_crtcinfo (mode,0 ); +return dispc_vp_bus_check (dispc, hw_videoport, crtc_state); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 288/849 drm/tidss: Remove early fb
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 942e54a372b44da3ffb0191b4d289d476256c861 ]
Add a call to drm_aperture_remove_framebuffers() to drop the possible early fb (simplefb).
--- drivers/gpu/drm/tidss/tidss_drv.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/gpu/drm/tidss/tidss_drv.c +9 -0
@@ -8,6 +8,7 @@#include <linux/of.h> #include <linux/module.h> #include <linux/pm_runtime.h> +#include <linux/aperture.h> #include <drm/clients/drm_client_setup.h> #include <drm/drm_atomic.h>
@@ -192,12 +193,20 @@ static int tidss_probe(struct platform_device *pdev) goto err_irq_uninstall; } +/* Remove possible early fb before setting up the fbdev */ + ret =aperture_remove_all_conflicting_devices (tidss_driver.name); +if (ret) + goto err_drm_dev_unreg; +drm_client_setup (ddev,NULL );dev_dbg (dev,"%s done\n" , __func__);return 0 ; +err_drm_dev_unreg: +drm_dev_unregister (ddev); + err_irq_uninstall:tidss_irq_uninstall (ddev);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 289/849 RDMA/mana_ib: Drain send wrs of GSI QP
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Taranov <[email protected]>
[ Upstream commit 44d69d3cf2e8047c279cbb9708f05e2c43e33234 ]
Drain send WRs of the GSI QP on device removal.
In rare servicing scenarios, the hardware may delete the state of the GSI QP, preventing it from generating CQEs for pending send WRs. Since WRs submitted to the GSI QP hold CM resources, the device cannot be removed until those WRs are completed. This patch marks all pending send WRs as failed, allowing the GSI QP to release the CM resources and enabling safe device removal.
--- drivers/infiniband/hw/mana/cq.c | 26 ++++++++++++++++++++++++++ drivers/infiniband/hw/mana/device.c | 3 +++ drivers/infiniband/hw/mana/mana_ib.h | 3 +++ 3 files changed, 32 insertions(+)
drivers/infiniband/hw/mana/cq.c +26 -0
@@ -291,6 +291,32 @@ static int mana_process_completions(struct mana_ib_cq *cq, int nwc, struct ib_wcreturn wc_index; } +void mana_drain_gsi_sqs (struct mana_ib_dev *mdev) +{ +struct mana_ib_qp *qp =mana_get_qp_ref (mdev,MANA_GSI_QPN , false); +struct ud_sq_shadow_wqe *shadow_wqe; +struct mana_ib_cq *cq; +unsigned long flags; + +if (!qp) +return ; + + cq = container_of(qp->ibqp.send_cq, struct mana_ib_cq, ibcq); + +spin_lock_irqsave (&cq->cq_lock, flags); +while ((shadow_wqe =shadow_queue_get_next_to_complete (&qp->shadow_sq)) + !=NULL ) { + shadow_wqe->header.error_code =IB_WC_GENERAL_ERR ; +shadow_queue_advance_next_to_complete (&qp->shadow_sq); + } +spin_unlock_irqrestore (&cq->cq_lock, flags); + +if (cq->ibcq.comp_handler) + cq->ibcq.comp_handler (&cq->ibcq, cq->ibcq.cq_context); + +mana_put_qp_ref (qp); +} +int mana_ib_poll_cq (struct ib_cq *ibcq,int num_entries,struct ib_wc *wc) { struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq);
drivers/infiniband/hw/mana/device.c +3 -0
@@ -230,6 +230,9 @@ static void mana_ib_remove(struct auxiliary_device *adev) {struct mana_ib_dev *dev =dev_get_drvdata (&adev->dev); +if (mana_ib_is_rnic (dev)) +mana_drain_gsi_sqs (dev); +ib_unregister_device (&dev->ib_dev);dma_pool_destroy (dev->av_pool);if (mana_ib_is_rnic (dev)) {
drivers/infiniband/hw/mana/mana_ib.h +3 -0
@@ -43,6 +43,8 @@*/ #define MANA_AV_BUFFER_SIZE 64 +#define MANA_GSI_QPN (1) +struct mana_ib_adapter_caps {u32 max_sq_id;u32 max_rq_id;
@@ -718,6 +720,7 @@ int mana_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,int mana_ib_post_send (struct ib_qp *ibqp,const struct ib_send_wr *wr,const struct ib_send_wr **bad_wr); +void mana_drain_gsi_sqs (struct mana_ib_dev *mdev);int mana_ib_poll_cq (struct ib_cq *ibcq,int num_entries,struct ib_wc *wc);int mana_ib_arm_cq (struct ib_cq *ibcq,enum ib_cq_notify_flags flags);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 290/849 media: i2c: Kconfig: Ensure a dependency on HAVE_CLK for VIDEO_CAMERA_SENSOR
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mehdi Djait <[email protected]>
[ Upstream commit 2d240b124cc9df62ccccee6054bc3d1d19018758 ]
Both ACPI and DT-based systems are required to obtain the external camera sensor clock using the new devm_v4l2_sensor_clk_get() helper function.
Ensure a dependency on HAVE_CLK when config VIDEO_CAMERA_SENSOR is enabled.
--- drivers/media/i2c/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/i2c/Kconfig +1 -1
@@ -27,7 +27,7 @@ config VIDEO_IR_I2C menuconfig VIDEO_CAMERA_SENSOR bool "Camera sensor devices" - depends on MEDIA_CAMERA_SUPPORT && I2C + depends on MEDIA_CAMERA_SUPPORT && I2C && HAVE_CLK select MEDIA_CONTROLLER select V4L2_FWNODE select VIDEO_V4L2_SUBDEV_API
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 291/849 PCI/ERR: Update device error_state already after reset
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
[ Upstream commit 45bc82563d5505327d97963bc54d3709939fa8f8 ]
After a Fatal Error has been reported by a device and has been recovered through a Secondary Bus Reset, AER updates the device's error_state to pci_channel_io_normal before invoking its driver's ->resume() callback.
By contrast, EEH updates the error_state earlier, namely after resetting the device and before invoking its driver's ->slot_reset() callback. Commit c58dc575f3c8 ("powerpc/pseries: Set error_state to pci_channel_io_normal in eeh_report_reset()") explains in great detail that the earlier invocation is necessitated by various drivers checking accessibility of the device with pci_channel_offline() and avoiding accesses if it returns true. It returns true for any other error_state than pci_channel_io_normal.
The device should be accessible already after reset, hence the reasoning is that it's safe to update the error_state immediately afterwards.
This deviation between AER and EEH seems problematic because drivers behave differently depending on which error recovery mechanism the platform uses. Three drivers have gone so far as to update the error_state themselves, presumably to work around AER's behavior.
For consistency, amend AER to update the error_state at the same recovery steps as EEH. Drop the now unnecessary workaround from the three drivers.
Keep updating the error_state before ->resume() in case ->error_detected() or ->mmio_enabled() return PCI_ERS_RESULT_RECOVERED, which causes ->slot_reset() to be skipped. There are drivers doing this even for Fatal Errors, e.g. mhi_pci_error_detected().
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 1 - drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 2 -- drivers/pci/pcie/err.c | 3 ++- drivers/scsi/qla2xxx/qla_os.c | 5 ----- 4 files changed, 2 insertions(+), 9 deletions(-)
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +0 -1
@@ -4215,7 +4215,6 @@ static pci_ers_result_t qlcnic_83xx_io_slot_reset(struct pci_dev *pdev)struct qlcnic_adapter *adapter =pci_get_drvdata (pdev);int err =0 ; - pdev->error_state = pci_channel_io_normal; err =pci_enable_device (pdev);if (err) goto disconnect;
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +0 -2
@@ -3766,8 +3766,6 @@ static int qlcnic_attach_func(struct pci_dev *pdev)struct qlcnic_adapter *adapter =pci_get_drvdata (pdev);struct net_device *netdev = adapter->netdev; - pdev->error_state = pci_channel_io_normal; - err =pci_enable_device (pdev);if (err)return err;
drivers/pci/pcie/err.c +2 -1
@@ -141,7 +141,8 @@ static int report_slot_reset(struct pci_dev *dev, void *data)device_lock (&dev->dev); pdrv = dev->driver; -if (!pdrv || !pdrv->err_handler || !pdrv->err_handler->slot_reset) +if (!pci_dev_set_io_state (dev, pci_channel_io_normal) || + !pdrv || !pdrv->err_handler || !pdrv->err_handler->slot_reset) goto out; err_handler = pdrv->err_handler;
drivers/scsi/qla2xxx/qla_os.c +0 -5
@@ -7883,11 +7883,6 @@ qla2xxx_pci_slot_reset(struct pci_dev *pdev) "Slot Reset.\n"); ha->pci_error_state =QLA_PCI_SLOT_RESET ; -/* Workaround: qla2xxx driver which access hardware earlier -* needs error state to be pci_channel_io_online. -* Otherwise mailbox command timesout. -*/ - pdev->error_state = pci_channel_io_normal;pci_restore_state (pdev);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 292/849 x86/vsyscall: Do not require X86_PF_INSTR to emulate vsyscall
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill A. Shutemov <[email protected]>
[ Upstream commit 8ba38a7a9a699905b84fa97578a8291010dec273 ]
emulate_vsyscall() expects to see X86_PF_INSTR in PFEC on a vsyscall page fault, but the CPU does not report X86_PF_INSTR if neither X86_FEATURE_NX nor X86_FEATURE_SMEP are enabled.
X86_FEATURE_NX should be enabled on nearly all 64-bit CPUs, except for early P4 processors that did not support this feature.
Instead of explicitly checking for X86_PF_INSTR, compare the fault address to RIP.
On machines with X86_FEATURE_NX enabled, issue a warning if RIP is equal to fault address but X86_PF_INSTR is absent.
[ dhansen: flesh out code comments ]
--- arch/x86/entry/vsyscall/vsyscall_64.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
arch/x86/entry/vsyscall/vsyscall_64.c +14 -3
@@ -124,7 +124,12 @@ bool emulate_vsyscall(unsigned long error_code,if ((error_code & (X86_PF_WRITE |X86_PF_USER )) !=X86_PF_USER )return false; -if (!(error_code &X86_PF_INSTR )) { +/* +* Assume that faults at regs->ip are because of an +* instruction fetch. Return early and avoid +* emulation for faults during data accesses: +*/ +if (address != regs->ip) {/* Failed vsyscall read */ if (vsyscall_mode ==EMULATE )return false;
@@ -136,13 +141,19 @@ bool emulate_vsyscall(unsigned long error_code,return false; } +/* +* X86_PF_INSTR is only set when NX is supported. When +* available, use it to double-check that the emulation code +* is only being used for instruction fetches: +*/ +if (cpu_feature_enabled (X86_FEATURE_NX )) +WARN_ON_ONCE (!(error_code &X86_PF_INSTR )); +/* * No point in checking CS -- the only way to get here is a user mode * trap to a high address, which means that we're in 64-bit user code. */ -WARN_ON_ONCE (address != regs->ip); -if (vsyscall_mode ==NONE ) {warn_bad_vsyscall (KERN_INFO , regs,"vsyscall attempted with vsyscall=none" );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 293/849 net: stmmac: Check stmmac_hw_setup() in stmmac_resume()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tiezhu Yang <[email protected]>
[ Upstream commit 6896c2449a1858acb643014894d01b3a1223d4e5 ]
stmmac_hw_setup() may return 0 on success and an appropriate negative integer as defined in errno.h file on failure, just check it and then return early if failed in stmmac_resume().
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +8 -1
@@ -7977,7 +7977,14 @@ int stmmac_resume(struct device *dev)stmmac_free_tx_skbufs (priv);stmmac_clear_descriptors (priv, &priv->dma_conf); -stmmac_hw_setup (ndev, false); + ret =stmmac_hw_setup (ndev, false); +if (ret <0 ) { +netdev_err (priv->dev,"%s: Hw setup failed\n" , __func__); +mutex_unlock (&priv->lock); +rtnl_unlock (); +return ret; + } +stmmac_init_coalesce (priv);phylink_rx_clk_stop_block (priv->phylink);stmmac_set_rx_mode (ndev);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 294/849 ice: Dont use %pK through printk or tracepoints
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit 66ceb45b7d7e9673254116eefe5b6d3a44eba267 ]
In the past %pK was preferable to %p as it would not leak raw pointer values into the kernel log.
Since commit ad67b74d2469 ("printk: hash addresses printed with %p") the regular %p has been improved to avoid this issue. Furthermore, restricted pointers ("%pK") were never meant to be used through printk(). They can still unintentionally leak raw pointers or acquire sleeping locks in atomic contexts.
Switch to the regular pointer formatting which is safer and easier to reason about.
There are still a few users of %pK left, but these use it through seq_file, for which its usage is safe.
--- drivers/net/ethernet/intel/ice/ice_main.c | 2 +- drivers/net/ethernet/intel/ice/ice_trace.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/ice/ice_main.c +1 -1
@@ -9125,7 +9125,7 @@ static int ice_create_q_channels(struct ice_vsi *vsi)list_add_tail (&ch->list, &vsi->ch_list); vsi->tc_map_vsi[i] = ch->ch_vsi;dev_dbg (ice_pf_to_dev (pf), -"successfully created channel: VSI %pK\n" , ch->ch_vsi); +"successfully created channel: VSI %p\n" , ch->ch_vsi); }return 0 ;
drivers/net/ethernet/intel/ice/ice_trace.h +5 -5
@@ -130,7 +130,7 @@ DECLARE_EVENT_CLASS(ice_tx_template, __entry->buf = buf; __assign_str(devname);), -TP_printk ("netdev: %s ring: %pK desc: %pK buf %pK" ,__get_str (devname), +TP_printk ("netdev: %s ring: %p desc: %p buf %p" ,__get_str (devname), __entry->ring, __entry->desc, __entry->buf) );
@@ -158,7 +158,7 @@ DECLARE_EVENT_CLASS(ice_rx_template, __entry->desc = desc; __assign_str(devname);), -TP_printk ("netdev: %s ring: %pK desc: %pK" ,__get_str (devname), +TP_printk ("netdev: %s ring: %p desc: %p" ,__get_str (devname), __entry->ring, __entry->desc) ); DEFINE_EVENT(ice_rx_template, ice_clean_rx_irq,
@@ -182,7 +182,7 @@ DECLARE_EVENT_CLASS(ice_rx_indicate_template, __entry->skb = skb; __assign_str(devname);), -TP_printk ("netdev: %s ring: %pK desc: %pK skb %pK" ,__get_str (devname), +TP_printk ("netdev: %s ring: %p desc: %p skb %p" ,__get_str (devname), __entry->ring, __entry->desc, __entry->skb) );
@@ -205,7 +205,7 @@ DECLARE_EVENT_CLASS(ice_xmit_template, __entry->skb = skb; __assign_str(devname);), -TP_printk ("netdev: %s skb: %pK ring: %pK" ,__get_str (devname), +TP_printk ("netdev: %s skb: %p ring: %p" ,__get_str (devname), __entry->skb, __entry->ring) );
@@ -228,7 +228,7 @@ DECLARE_EVENT_CLASS(ice_tx_tstamp_template, TP_fast_assign(__entry->skb = skb; __entry->idx = idx;), -TP_printk ("skb %pK idx %d" , +TP_printk ("skb %p idx %d" , __entry->skb, __entry->idx) );#define DEFINE_TX_TSTAMP_OP_EVENT (name) \
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 295/849 thunderbolt: Use is_pciehp instead of is_hotplug_bridge
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
[ Upstream commit 5d03847175e81e86d4865456c15638faaf7c0634 ]
The thunderbolt driver sets up device link dependencies from hotplug ports to the Host Router (aka Native Host Interface, NHI). When resuming from system sleep, this allows the Host Router to re-establish tunnels to attached Thunderbolt devices before the hotplug ports resume.
To identify the hotplug ports, the driver utilizes the is_hotplug_bridge flag which also encompasses ACPI slots handled by the ACPI hotplug driver.
Thunderbolt hotplug ports are always Hot-Plug Capable PCIe ports, so it is more apt to identify them with the is_pciehp flag.
Similarly, hotplug ports on older Thunderbolt controllers have broken MSI support and are quirked to use legacy INTx interrupts instead. The quirk identifies them with is_hotplug_bridge, even though all affected ports are also matched by is_pciehp. So use is_pciehp here as well.
--- drivers/pci/quirks.c | 2 +- drivers/thunderbolt/tb.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/pci/quirks.c +1 -1
@@ -3830,7 +3830,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MELLANOX, 0xcf80, quirk_no_pm_reset);*/ static void quirk_thunderbolt_hotplug_msi (struct pci_dev *pdev) { -if (pdev->is_hotplug_bridge && +if (pdev->is_pciehp && (pdev->device !=PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C || pdev->revision <=1 )) pdev->no_msi =1 ;
drivers/thunderbolt/tb.c +1 -1
@@ -3336,7 +3336,7 @@ static bool tb_apple_add_links(struct tb_nhi *nhi)if (!pci_is_pcie (pdev))continue ;if (pci_pcie_type (pdev) !=PCI_EXP_TYPE_DOWNSTREAM || - !pdev->is_hotplug_bridge) + !pdev->is_pciehp)continue ; link = device_link_add(&pdev->dev, &nhi->pdev->dev,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 296/849 tty: serial: ip22zilog: Use platform device for probing
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Bogendoerfer <[email protected]>
[ Upstream commit 3fc36ae6abd263a5cbf93b2f5539eccc1fc753f7 ]
After commit 84a9582fd203 ("serial: core: Start managing serial controllers to enable runtime PM") serial drivers need to provide a device in struct uart_port.dev otherwise an oops happens. To fix this issue for ip22zilog driver switch driver to a platform driver and setup the serial device in sgi-ip22 code.
--- arch/mips/sgi-ip22/ip22-platform.c | 32 +++ drivers/tty/serial/ip22zilog.c | 352 ++++++++++++----------------- 2 files changed, 175 insertions(+), 209 deletions(-)
arch/mips/sgi-ip22/ip22-platform.c +32 -0
@@ -221,3 +221,35 @@ static int __init sgi_ds1286_devinit(void) }device_initcall (sgi_ds1286_devinit); + +#define SGI_ZILOG_BASE (HPC3_CHIP0_BASE + \ + offsetof(struct hpc3_regs, pbus_extregs[6]) + \ + offsetof(struct sgioc_regs, uart)) + +static struct resource sgi_zilog_resources[] = { + { + .start =SGI_ZILOG_BASE , + .end =SGI_ZILOG_BASE +15 , + .flags =IORESOURCE_MEM + }, + { + .start =SGI_SERIAL_IRQ , + .end =SGI_SERIAL_IRQ , + .flags =IORESOURCE_IRQ + } +}; + +static struct platform_device zilog_device = { + .name ="ip22zilog" , + .id =0 , + .num_resources =ARRAY_SIZE (sgi_zilog_resources), + .resource = sgi_zilog_resources, +}; + + +static int __init sgi_zilog_devinit (void ) +{ +return platform_device_register (&zilog_device); +} + +device_initcall (sgi_zilog_devinit);
drivers/tty/serial/ip22zilog.c +143 -209
453 lines not on this page · raw message
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 297/849 ASoC: es8323: enable DAPM power widgets for playback DAC and output
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shimrra Shai <[email protected]>
[ Upstream commit 258384d8ce365dddd6c5c15204de8ccd53a7ab0a ]
Enable DAPM widgets for power and volume control of playback.
--- sound/soc/codecs/es8323.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
sound/soc/codecs/es8323.c +6 -6
@@ -211,8 +211,8 @@ static const struct snd_soc_dapm_widget es8323_dapm_widgets[] = {SND_SOC_DAPM_ADC ("Right ADC" ,"Right Capture" ,SND_SOC_NOPM ,4 ,1 ),SND_SOC_DAPM_ADC ("Left ADC" ,"Left Capture" ,SND_SOC_NOPM ,5 ,1 ), -SND_SOC_DAPM_DAC ("Right DAC" ,"Right Playback" ,SND_SOC_NOPM ,6 ,1 ), -SND_SOC_DAPM_DAC ("Left DAC" ,"Left Playback" ,SND_SOC_NOPM ,7 ,1 ), +SND_SOC_DAPM_DAC ("Right DAC" ,"Right Playback" ,ES8323_DACPOWER ,6 ,1 ), +SND_SOC_DAPM_DAC ("Left DAC" ,"Left Playback" ,ES8323_DACPOWER ,7 ,1 ), SND_SOC_DAPM_MIXER("Left Mixer", SND_SOC_NOPM, 0, 0, &es8323_left_mixer_controls[0],
@@ -223,10 +223,10 @@ static const struct snd_soc_dapm_widget es8323_dapm_widgets[] = {SND_SOC_DAPM_PGA ("Right ADC Power" ,SND_SOC_NOPM ,6 ,1 ,NULL ,0 ),SND_SOC_DAPM_PGA ("Left ADC Power" ,SND_SOC_NOPM ,7 ,1 ,NULL ,0 ), -SND_SOC_DAPM_PGA ("Right Out 2" ,SND_SOC_NOPM ,2 ,0 ,NULL ,0 ), -SND_SOC_DAPM_PGA ("Left Out 2" ,SND_SOC_NOPM ,3 ,0 ,NULL ,0 ), -SND_SOC_DAPM_PGA ("Right Out 1" ,SND_SOC_NOPM ,4 ,0 ,NULL ,0 ), -SND_SOC_DAPM_PGA ("Left Out 1" ,SND_SOC_NOPM ,5 ,0 ,NULL ,0 ), +SND_SOC_DAPM_PGA ("Right Out 2" ,ES8323_DACPOWER ,2 ,0 ,NULL ,0 ), +SND_SOC_DAPM_PGA ("Left Out 2" ,ES8323_DACPOWER ,3 ,0 ,NULL ,0 ), +SND_SOC_DAPM_PGA ("Right Out 1" ,ES8323_DACPOWER ,4 ,0 ,NULL ,0 ), +SND_SOC_DAPM_PGA ("Left Out 1" ,ES8323_DACPOWER ,5 ,0 ,NULL ,0 ),SND_SOC_DAPM_PGA ("LAMP" ,ES8323_ADCCONTROL1 ,4 ,0 ,NULL ,0 ), SND_SOC_DAPM_PGA("RAMP", ES8323_ADCCONTROL1, 0, 0, NULL, 0),
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 298/849 powerpc/eeh: Use result of error_detected() in uevent
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit 704e5dd1c02371dfc7d22e1520102b197a3b628b ]
Ever since uevent support was added for AER and EEH with commit 856e1eb9bdd4 ("PCI/AER: Add uevents in AER and EEH error/resume"), it reported PCI_ERS_RESULT_NONE as uevent when recovery begins.
Commit 7b42d97e99d3 ("PCI/ERR: Always report current recovery status for udev") subsequently amended AER to report the actual return value of error_detected().
Make the same change to EEH to align it with AER and s390.
--- arch/powerpc/kernel/eeh_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kernel/eeh_driver.c +1 -1
@@ -334,7 +334,7 @@ static enum pci_ers_result eeh_report_error(struct eeh_dev *edev, rc = driver->err_handler->error_detected (pdev, pci_channel_io_frozen); edev->in_error = true; -pci_uevent_ers (pdev,PCI_ERS_RESULT_NONE ); +pci_uevent_ers (pdev, rc);return rc; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 299/849 s390/pci: Use pci_uevent_ers() in PCI recovery
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit dab32f2576a39d5f54f3dbbbc718d92fa5109ce9 ]
Issue uevents on s390 during PCI recovery using pci_uevent_ers() as done by EEH and AER PCIe recovery routines.
--- arch/s390/pci/pci_event.c | 3 +++ drivers/pci/pci-driver.c | 2 +- include/linux/pci.h | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-)
arch/s390/pci/pci_event.c +3 -0
@@ -88,6 +88,7 @@ static pci_ers_result_t zpci_event_notify_error_detected(struct pci_dev *pdev,pci_ers_result_t ers_res =PCI_ERS_RESULT_DISCONNECT ; ers_res = driver->err_handler->error_detected (pdev, pdev->error_state); +pci_uevent_ers (pdev, ers_res);if (ers_result_indicates_abort (ers_res))pr_info ("%s: Automatic recovery failed after initial reporting\n" ,pci_name (pdev));else if (ers_res ==PCI_ERS_RESULT_NEED_RESET )
@@ -244,6 +245,7 @@ static pci_ers_result_t zpci_event_attempt_error_recovery(struct pci_dev *pdev) ers_res =PCI_ERS_RESULT_RECOVERED ;if (ers_res !=PCI_ERS_RESULT_RECOVERED ) { +pci_uevent_ers (pdev,PCI_ERS_RESULT_DISCONNECT );pr_err ("%s: Automatic recovery failed; operator intervention is required\n" ,pci_name (pdev)); status_str ="failed (driver can't recover)" ;
@@ -253,6 +255,7 @@ static pci_ers_result_t zpci_event_attempt_error_recovery(struct pci_dev *pdev)pr_info ("%s: The device is ready to resume operations\n" ,pci_name (pdev));if (driver->err_handler->resume) driver->err_handler->resume (pdev); +pci_uevent_ers (pdev,PCI_ERS_RESULT_RECOVERED ); out_unlock:device_unlock (&pdev->dev);zpci_report_status (zdev,"recovery" , status_str);
drivers/pci/pci-driver.c +1 -1
@@ -1582,7 +1582,7 @@ static int pci_uevent(const struct device *dev, struct kobj_uevent_env *env)return 0 ; } -#if defined(CONFIG_PCIEAER ) || defined(CONFIG_EEH ) +#if defined(CONFIG_PCIEAER ) || defined(CONFIG_EEH ) || defined(CONFIG_S390 )/** * pci_uevent_ers - emit a uevent during recovery path of PCI device * @pdev: PCI device undergoing error recovery
include/linux/pci.h +1 -1
@@ -2764,7 +2764,7 @@ static inline bool pci_is_thunderbolt_attached(struct pci_dev *pdev)return false; } -#if defined(CONFIG_PCIEPORTBUS ) || defined(CONFIG_EEH ) +#if defined(CONFIG_PCIEPORTBUS ) || defined(CONFIG_EEH ) || defined(CONFIG_S390 )void pci_uevent_ers (struct pci_dev *pdev,enum pci_ers_result err_type);#endif
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 300/849 bridge: Redirect to backup port when port is administratively down
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 3d05b24429e1de7a17c8fdccb04a04dbc8ad297b ]
If a backup port is configured for a bridge port, the bridge will redirect known unicast traffic towards the backup port when the primary port is administratively up but without a carrier. This is useful, for example, in MLAG configurations where a system is connected to two switches and there is a peer link between both switches. The peer link serves as the backup port in case one of the switches loses its connection to the multi-homed system.
In order to avoid flooding when the primary port loses its carrier, the bridge does not flush dynamic FDB entries pointing to the port upon STP disablement, if the port has a backup port.
The above means that known unicast traffic destined to the primary port will be blackholed when the port is put administratively down, until the FDB entries pointing to it are aged-out.
Given that the current behavior is quite weird and unlikely to be depended on by anyone, amend the bridge to redirect to the backup port also when the primary port is administratively down and not only when it does not have a carrier.
The change is motivated by a report from a user who expected traffic to be redirected to the backup port when the primary port was put administratively down while debugging a network issue.
--- net/bridge/br_forward.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/bridge/br_forward.c +2 -1
@@ -148,7 +148,8 @@ void br_forward(const struct net_bridge_port *to, goto out;/* redirect to backup link if the destination port is down */ -if (rcu_access_pointer (to->backup_port) && !netif_carrier_ok (to->dev)) { +if (rcu_access_pointer (to->backup_port) && + (!netif_carrier_ok (to->dev) || !netif_running (to->dev))) {struct net_bridge_port *backup_port; backup_port =rcu_dereference (to->backup_port);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 301/849 selftests: drv-net: wait for carrier
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit f09fc24dd9a5ec989dfdde7090624924ede6ddc7 ]
On fast machines the tests run in quick succession so even when tests clean up after themselves the carrier may need some time to come back.
Specifically in NIPA when ping.py runs right after netpoll_basic.py the first ping command fails.
Since the context manager callbacks are now common NetDrvEpEnv gets an ip link up call as well.
--- .../selftests/drivers/net/lib/py/__init__.py | 2 +- .../selftests/drivers/net/lib/py/env.py | 41 +++++++++---------- tools/testing/selftests/net/lib/py/utils.py | 18 ++++++++ 3 files changed, 39 insertions(+), 22 deletions(-)
tools/testing/selftests/drivers/net/lib/py/__init__.py +1 -1
@@ -15,7 +15,7 @@ try: NlError, RtnlFamily, DevlinkFamily from net.lib.py import CmdExitFailure from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \ - fd_read_timeout, ip, rand_port, tool, wait_port_listen + fd_read_timeout, ip, rand_port, tool, wait_port_listen, wait_file from net.lib.py import fd_read_timeout from net.lib.py import KsftSkipEx, KsftFailEx, KsftXfailEx from net.lib.py import ksft_disruptive, ksft_exit, ksft_pr, ksft_run, \
tools/testing/selftests/drivers/net/lib/py/env.py +20 -21
71 lines not on this page · raw message
tools/testing/selftests/net/lib/py/utils.py +18 -0
@@ -249,3 +249,21 @@ def wait_port_listen(port, proto="tcp", ns=None, host=None, sleep=0.005, deadlin if time.monotonic() > end: raise Exception("Waiting for port listen timed out") time.sleep(sleep) + + +def wait_file(fname, test_fn, sleep=0.005, deadline=5, encoding='utf-8'): + """ + Wait for file contents on the local system to satisfy a condition. + test_fn() should take one argument (file contents) and return whether + condition is met. + """ + end = time.monotonic() + deadline + + with open(fname, "r", encoding=encoding) as fp: + while True: + if test_fn(fp.read()): + break + fp.seek(0) + if time.monotonic() > end: + raise TimeoutError("Wait for file contents failed", fname) + time.sleep(sleep)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 302/849 net: phy: mscc: report and configure in-band auto-negotiation for SGMII/QSGMII
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Oltean <[email protected]>
[ Upstream commit df979273bd716a93ca9ffa8f84aeb205c9bf2ab6 ]
The following Vitesse/Microsemi/Microchip PHYs, among those supported by this driver, have the host interface configurable as SGMII or QSGMII:
- VSC8504
- VSC8514
- VSC8552
- VSC8562
- VSC8572
- VSC8574
- VSC8575
- VSC8582
- VSC8584
All these PHYs are documented to have bit 7 of "MAC SerDes PCS Control" as "MAC SerDes ANEG enable".
Out of these, I could test the VSC8514 quad PHY in QSGMII. This works both with the in-band autoneg on and off, on the NXP LS1028A-RDB and T1040-RDB boards.
Notably, the bit is sticky (survives soft resets), so giving Linux the tools to read and modify this settings makes it robust to changes made to it by previous boot layers (U-Boot).
--- drivers/net/phy/mscc/mscc.h | 3 +++ drivers/net/phy/mscc/mscc_main.c | 40 ++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+)
drivers/net/phy/mscc/mscc.h +3 -0
@@ -196,6 +196,9 @@ enum rgmii_clock_delay {#define MSCC_PHY_EXTENDED_INT_MS_EGR BIT(9)/* Extended Page 3 Registers */ +#define MSCC_PHY_SERDES_PCS_CTRL 16 +#define MSCC_PHY_SERDES_ANEG BIT(7) +#define MSCC_PHY_SERDES_TX_VALID_CNT 21#define MSCC_PHY_SERDES_TX_CRC_ERR_CNT 22#define MSCC_PHY_SERDES_RX_VALID_CNT 28
drivers/net/phy/mscc/mscc_main.c +40 -0
@@ -2202,6 +2202,28 @@ static int vsc85xx_read_status(struct phy_device *phydev)return genphy_read_status (phydev); } +static unsigned int vsc85xx_inband_caps (struct phy_device *phydev, +phy_interface_t interface) +{ +if (interface !=PHY_INTERFACE_MODE_SGMII && + interface !=PHY_INTERFACE_MODE_QSGMII ) +return 0 ; + +return LINK_INBAND_DISABLE |LINK_INBAND_ENABLE ; +} + +static int vsc85xx_config_inband (struct phy_device *phydev,unsigned int modes) +{ +u16 reg_val =0 ; + +if (modes ==LINK_INBAND_ENABLE ) + reg_val =MSCC_PHY_SERDES_ANEG ; + +return phy_modify_paged (phydev,MSCC_PHY_PAGE_EXTENDED_3 , +MSCC_PHY_SERDES_PCS_CTRL ,MSCC_PHY_SERDES_ANEG , + reg_val); +} +static int vsc8514_probe (struct phy_device *phydev) {struct vsc8531_private *vsc8531;
@@ -2414,6 +2436,8 @@ static struct phy_driver vsc85xx_driver[] = { .get_sset_count = &vsc85xx_get_sset_count, .get_strings = &vsc85xx_get_strings, .get_stats = &vsc85xx_get_stats, + .inband_caps = vsc85xx_inband_caps, + .config_inband = vsc85xx_config_inband, }, { .phy_id = PHY_ID_VSC8514,
@@ -2437,6 +2461,8 @@ static struct phy_driver vsc85xx_driver[] = { .get_sset_count = &vsc85xx_get_sset_count, .get_strings = &vsc85xx_get_strings, .get_stats = &vsc85xx_get_stats, + .inband_caps = vsc85xx_inband_caps, + .config_inband = vsc85xx_config_inband, }, { .phy_id = PHY_ID_VSC8530,
@@ -2557,6 +2583,8 @@ static struct phy_driver vsc85xx_driver[] = { .get_sset_count = &vsc85xx_get_sset_count, .get_strings = &vsc85xx_get_strings, .get_stats = &vsc85xx_get_stats, + .inband_caps = vsc85xx_inband_caps, + .config_inband = vsc85xx_config_inband, }, { .phy_id = PHY_ID_VSC856X,
@@ -2579,6 +2607,8 @@ static struct phy_driver vsc85xx_driver[] = { .get_sset_count = &vsc85xx_get_sset_count, .get_strings = &vsc85xx_get_strings, .get_stats = &vsc85xx_get_stats, + .inband_caps = vsc85xx_inband_caps, + .config_inband = vsc85xx_config_inband, }, { .phy_id = PHY_ID_VSC8572,
@@ -2605,6 +2635,8 @@ static struct phy_driver vsc85xx_driver[] = { .get_sset_count = &vsc85xx_get_sset_count, .get_strings = &vsc85xx_get_strings, .get_stats = &vsc85xx_get_stats, + .inband_caps = vsc85xx_inband_caps, + .config_inband = vsc85xx_config_inband, }, { .phy_id = PHY_ID_VSC8574,
@@ -2631,6 +2663,8 @@ static struct phy_driver vsc85xx_driver[] = { .get_sset_count = &vsc85xx_get_sset_count, .get_strings = &vsc85xx_get_strings, .get_stats = &vsc85xx_get_stats, + .inband_caps = vsc85xx_inband_caps, + .config_inband = vsc85xx_config_inband, }, { .phy_id = PHY_ID_VSC8575,
@@ -2655,6 +2689,8 @@ static struct phy_driver vsc85xx_driver[] = { .get_sset_count = &vsc85xx_get_sset_count, .get_strings = &vsc85xx_get_strings, .get_stats = &vsc85xx_get_stats, + .inband_caps = vsc85xx_inband_caps, + .config_inband = vsc85xx_config_inband, }, { .phy_id = PHY_ID_VSC8582,
@@ -2679,6 +2715,8 @@ static struct phy_driver vsc85xx_driver[] = { .get_sset_count = &vsc85xx_get_sset_count, .get_strings = &vsc85xx_get_strings, .get_stats = &vsc85xx_get_stats, + .inband_caps = vsc85xx_inband_caps, + .config_inband = vsc85xx_config_inband, }, { .phy_id = PHY_ID_VSC8584,
@@ -2704,6 +2742,8 @@ static struct phy_driver vsc85xx_driver[] = { .get_strings = &vsc85xx_get_strings, .get_stats = &vsc85xx_get_stats, .link_change_notify = &vsc85xx_link_change_notify, + .inband_caps = vsc85xx_inband_caps, + .config_inband = vsc85xx_config_inband, } };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 303/849 scsi: ufs: host: mediatek: Fix auto-hibern8 timer configuration
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit aa86602a483ba48f51044fbaefa1ebbf6da194a4 ]
Move the configuration of the Auto-Hibern8 (AHIT) timer from the post-link stage to the 'fixup_dev_quirks' function. This change allows setting the AHIT based on the vendor requirements:
(a) Samsung: 3.5 ms
(b) Micron: 2 ms
(c) Others: 1 ms
Additionally, the clock gating timer is adjusted based on the AHIT scale, with a maximum setting of 10 ms. This ensures that the clock gating delay is appropriately configured to match the AHIT settings.
--- drivers/ufs/host/ufs-mediatek.c | 86 ++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 22 deletions(-)
drivers/ufs/host/ufs-mediatek.c +64 -22
@@ -1075,6 +1075,69 @@ static void ufs_mtk_vreg_fix_vccqx(struct ufs_hba *hba) } } +static void ufs_mtk_setup_clk_gating (struct ufs_hba *hba) +{ +unsigned long flags; +u32 ah_ms =10 ; +u32 ah_scale, ah_timer; +u32 scale_us[] = {1 ,10 ,100 ,1000 ,10000 ,100000 }; + +if (ufshcd_is_clkgating_allowed (hba)) { +if (ufshcd_is_auto_hibern8_supported (hba) && hba->ahit) { + ah_scale =FIELD_GET (UFSHCI_AHIBERN8_SCALE_MASK , + hba->ahit); + ah_timer =FIELD_GET (UFSHCI_AHIBERN8_TIMER_MASK , + hba->ahit); +if (ah_scale <=5 ) + ah_ms = ah_timer * scale_us[ah_scale] /1000 ; + } + +spin_lock_irqsave (hba->host->host_lock, flags); + hba->clk_gating.delay_ms =max (ah_ms,10U ); +spin_unlock_irqrestore (hba->host->host_lock, flags); + } +} + +/* Convert microseconds to Auto-Hibernate Idle Timer register value */ +static u32 ufs_mtk_us_to_ahit (unsigned int timer) +{ +unsigned int scale; + +for (scale =0 ; timer >UFSHCI_AHIBERN8_TIMER_MASK ; ++scale) + timer /=UFSHCI_AHIBERN8_SCALE_FACTOR ; + +return FIELD_PREP (UFSHCI_AHIBERN8_TIMER_MASK , timer) | +FIELD_PREP (UFSHCI_AHIBERN8_SCALE_MASK , scale); +} + +static void ufs_mtk_fix_ahit (struct ufs_hba *hba) +{ +unsigned int us; + +if (ufshcd_is_auto_hibern8_supported (hba)) { +switch (hba->dev_info.wmanufacturerid) { +case UFS_VENDOR_SAMSUNG : +/* configure auto-hibern8 timer to 3.5 ms */ + us =3500 ; +break ; + +case UFS_VENDOR_MICRON : +/* configure auto-hibern8 timer to 2 ms */ + us =2000 ; +break ; + +default : +/* configure auto-hibern8 timer to 1 ms */ + us =1000 ; +break ; + } + + hba->ahit =ufs_mtk_us_to_ahit (us); + } + +ufs_mtk_setup_clk_gating (hba); +} +static void ufs_mtk_init_mcq_irq (struct ufs_hba *hba) {struct ufs_mtk_host *host =ufshcd_get_variant (hba);
@@ -1369,32 +1432,10 @@ static int ufs_mtk_pre_link(struct ufs_hba *hba)return ret; } - -static void ufs_mtk_setup_clk_gating (struct ufs_hba *hba) -{ -u32 ah_ms; - -if (ufshcd_is_clkgating_allowed (hba)) { -if (ufshcd_is_auto_hibern8_supported (hba) && hba->ahit) - ah_ms =FIELD_GET (UFSHCI_AHIBERN8_TIMER_MASK , - hba->ahit); -else - ah_ms =10 ; -ufshcd_clkgate_delay_set (hba->dev, ah_ms +5 ); - } -} -static void ufs_mtk_post_link (struct ufs_hba *hba) {/* enable unipro clock gating feature */ ufs_mtk_cfg_unipro_cg (hba, true); - -/* will be configured during probe hba */ -if (ufshcd_is_auto_hibern8_supported (hba)) - hba->ahit =FIELD_PREP (UFSHCI_AHIBERN8_TIMER_MASK ,10 ) | -FIELD_PREP (UFSHCI_AHIBERN8_SCALE_MASK ,3 ); - -ufs_mtk_setup_clk_gating (hba); } static int ufs_mtk_link_startup_notify(struct ufs_hba *hba,
@@ -1726,6 +1767,7 @@ static void ufs_mtk_fixup_dev_quirks(struct ufs_hba *hba)ufs_mtk_vreg_fix_vcc (hba);ufs_mtk_vreg_fix_vccqx (hba); +ufs_mtk_fix_ahit (hba); } static void ufs_mtk_event_notify(struct ufs_hba *hba,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 304/849 scsi: ufs: host: mediatek: Fix PWM mode switch issue
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit 7212d624f8638f8ea8ad1ecbb80622c7987bc7a1 ]
Address a failure in switching to PWM mode by ensuring proper configuration of power modes and adaptation settings. The changes include checks for SLOW_MODE and adjustments to the desired working mode and adaptation configuration based on the device's power mode and hardware version.
--- drivers/ufs/host/ufs-mediatek.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)
drivers/ufs/host/ufs-mediatek.c +22 -3
@@ -1303,6 +1303,10 @@ static bool ufs_mtk_pmc_via_fastauto(struct ufs_hba *hba, dev_req_params->gear_rx < UFS_HS_G4)return false; +if (dev_req_params->pwr_tx ==SLOW_MODE || + dev_req_params->pwr_rx ==SLOW_MODE ) +return false; +return true; }
@@ -1318,6 +1322,10 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba, host_params.hs_rx_gear =UFS_HS_G5 ; host_params.hs_tx_gear =UFS_HS_G5 ; +if (dev_max_params->pwr_rx ==SLOW_MODE || + dev_max_params->pwr_tx ==SLOW_MODE ) + host_params.desired_working_mode =UFS_PWM_MODE ; + ret =ufshcd_negotiate_pwr_params (&host_params, dev_max_params, dev_req_params);if (ret) { pr_info("%s: failed to determine capabilities\n",
@@ -1350,10 +1358,21 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba, } } -if (host->hw_ver.major >=3 ) { +if (dev_req_params->pwr_rx ==FAST_MODE || + dev_req_params->pwr_rx ==FASTAUTO_MODE ) { +if (host->hw_ver.major >=3 ) { + ret =ufshcd_dme_configure_adapt (hba, + dev_req_params->gear_tx, +PA_INITIAL_ADAPT ); + }else { + ret =ufshcd_dme_configure_adapt (hba, + dev_req_params->gear_tx, +PA_NO_ADAPT ); + } + }else { ret =ufshcd_dme_configure_adapt (hba, - dev_req_params->gear_tx, -PA_INITIAL_ADAPT ); + dev_req_params->gear_tx, +PA_NO_ADAPT ); }return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 305/849 scsi: ufs: host: mediatek: Assign power mode userdata before FASTAUTO mode change
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alice Chao <[email protected]>
[ Upstream commit 979feee0cf43b32d288931649d7c6d9a5524ea55 ]
Assign power mode userdata settings before transitioning to FASTAUTO power mode. This ensures that default timeout values are set for various parameters, enhancing the reliability and performance of the power mode change process.
--- drivers/ufs/host/ufs-mediatek.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/ufs/host/ufs-mediatek.c +22 -0
@@ -1349,6 +1349,28 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba,ufshcd_dme_set (hba,UIC_ARG_MIB (PA_TXHSADAPTTYPE ),PA_NO_ADAPT ); +if (!(hba->quirks &UFSHCD_QUIRK_SKIP_DEF_UNIPRO_TIMEOUT_SETTING )) { +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA0 ), + DL_FC0ProtectionTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA1 ), + DL_TC0ReplayTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA2 ), + DL_AFC0ReqTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA3 ), + DL_FC1ProtectionTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA4 ), + DL_TC1ReplayTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (PA_PWRMODEUSERDATA5 ), + DL_AFC1ReqTimeOutVal_Default); + +ufshcd_dme_set (hba,UIC_ARG_MIB (DME_LocalFC0ProtectionTimeOutVal), + DL_FC0ProtectionTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (DME_LocalTC0ReplayTimeOutVal), + DL_TC0ReplayTimeOutVal_Default); +ufshcd_dme_set (hba,UIC_ARG_MIB (DME_LocalAFC0ReqTimeOutVal), + DL_AFC0ReqTimeOutVal_Default); + } + ret =ufshcd_uic_change_pwr_mode (hba,FASTAUTO_MODE <<4 |FASTAUTO_MODE );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 306/849 scsi: ufs: host: mediatek: Change reset sequence for improved stability
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit 878ed88c50bfb14d972dd3b86a1c8188c58de4e5 ]
Modify the reset sequence to ensure that the device reset pin is set low before the host is disabled. This change enhances the stability of the reset process by ensuring the correct order of operations.
--- drivers/ufs/host/ufs-mediatek.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/ufs/host/ufs-mediatek.c +3 -3
@@ -1503,11 +1503,11 @@ static int ufs_mtk_device_reset(struct ufs_hba *hba) {struct arm_smccc_res res; -/* disable hba before device reset */ -ufshcd_hba_stop (hba); -ufs_mtk_device_reset_ctrl (0 , res); +/* disable hba in middle of device reset */ +ufshcd_hba_stop (hba); +/* * The reset signal is active low. UFS devices shall detect * more than or equal to 1us of positive or negative RST_n
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 307/849 scsi: ufs: host: mediatek: Fix invalid access in vccqx handling
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alice Chao <[email protected]>
[ Upstream commit 5863638598f5e4f64d2f85b03f376383ca1f2ab7 ]
Add a NULL check before accessing the 'vccqx' pointer to prevent invalid memory access. This ensures that the function safely handles cases where 'vccq' and 'vccq2' are not initialized, improving the robustness of the power management code.
--- drivers/ufs/host/ufs-mediatek.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/ufs/host/ufs-mediatek.c +3 -0
@@ -1589,6 +1589,9 @@ static void ufs_mtk_vccqx_set_lpm(struct ufs_hba *hba, bool lpm) {struct ufs_vreg *vccqx =NULL ; +if (!hba->vreg_info.vccq && !hba->vreg_info.vccq2) +return ; +if (hba->vreg_info.vccq) vccqx = hba->vreg_info.vccq;else
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 308/849 gpu: nova-core: register: allow fields named `offset`
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandre Courbot <[email protected]>
[ Upstream commit c5aeb264b6b27c52fc6c9ef3b50eaaebff5d9b60 ]
offset is a common field name, yet using it triggers a build error due to the conflict between the uppercased field constant (which becomes OFFSET in this case) containing the bitrange of the field, and the OFFSET constant constaining the offset of the register.
Fix this by adding _RANGE the field's range constant to avoid the name collision.
[[email protected]: fix merge conflict due to switch from as u32 to u32::from.]
--- drivers/gpu/nova-core/regs.rs | 5 +++-- drivers/gpu/nova-core/regs/macros.rs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-)
drivers/gpu/nova-core/regs.rs +3 -2
@@ -28,7 +28,7 @@ impl NV_PMC_BOOT_0 {/// Combines `architecture_0` and `architecture_1` to obtain the architecture of the chip. pub (crate )fn architecture (self) ->Result <Architecture > {Architecture ::try_from ( - self.architecture_0 () | (self.architecture_1 () <<Self ::ARCHITECTURE_0 .len ()), + self.architecture_0 () | (self.architecture_1 () <<Self ::ARCHITECTURE_0_RANGE .len ()), ) }
@@ -36,7 +36,8 @@ impl NV_PMC_BOOT_0 {pub (crate )fn chipset (self) ->Result <Chipset > { self.architecture () .map (|arch| { - ((archas u32 ) <<Self ::IMPLEMENTATION .len ()) | u32::from (self.implementation ()) + ((archas u32 ) <<Self ::IMPLEMENTATION_RANGE .len ()) + | u32::from (self.implementation ()) }) .and_then (Chipset ::try_from) }
drivers/gpu/nova-core/regs/macros.rs +1 -1
@@ -278,7 +278,7 @@ macro_rules! register { { $process:expr } $to_type:ty => $res_type:ty $(, $comment:literal)?; ) => { ::kernel::macros::paste!( -const [<$field:upper>]: ::core::ops::RangeInclusive <u8 > = $lo..=$hi; +const [<$field:upper_RANGE >]: ::core::ops::RangeInclusive <u8 > = $lo..=$hi;const [<$field:upper _MASK>]:u32 = ((((1 << $hi) -1 ) <<1 ) +1 ) - ((1 << $lo) -1 );const [<$field:upper_SHIFT >]:u32 =Self ::[<$field:upper _MASK>].trailing_zeros (); );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 309/849 net: ipv6: fix field-spanning memcpy warning in AH output
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charalampos Mitrodimas <[email protected]>
[ Upstream commit 2327a3d6f65ce2fe2634546dde4a25ef52296fec ]
Fix field-spanning memcpy warnings in ah6_output() and ah6_output_done() where extension headers are copied to/from IPv6 address fields, triggering fortify-string warnings about writes beyond the 16-byte address fields.
memcpy: detected field-spanning write (size 40) of single field "&top_iph->saddr" at net/ipv6/ah6.c:439 (size 16)
WARNING: CPU: 0 PID: 8838 at net/ipv6/ah6.c:439 ah6_output+0xe7e/0x14e0 net/ipv6/ah6.c:439
The warnings are false positives as the extension headers are intentionally placed after the IPv6 header in memory. Fix by properly copying addresses and extension headers separately, and introduce helper functions to avoid code duplication.
--- net/ipv6/ah6.c | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-)
net/ipv6/ah6.c +31 -19
@@ -46,6 +46,34 @@ struct ah_skb_cb {#define AH_SKB_CB (__skb) ((struct ah_skb_cb *)&((__skb)->cb[0])) +/* Helper to save IPv6 addresses and extension headers to temporary storage */ +static inline void ah6_save_hdrs (struct tmp_ext *iph_ext, +struct ipv6hdr *top_iph,int extlen) +{ +if (!extlen) +return ; + +#if IS_ENABLED (CONFIG_IPV6_MIP6 ) + iph_ext->saddr = top_iph->saddr; +#endif + iph_ext->daddr = top_iph->daddr; +memcpy (&iph_ext->hdrs, top_iph +1 , extlen -sizeof (*iph_ext)); +} + +/* Helper to restore IPv6 addresses and extension headers from temporary storage */ +static inline void ah6_restore_hdrs (struct ipv6hdr *top_iph, +struct tmp_ext *iph_ext,int extlen) +{ +if (!extlen) +return ; + +#if IS_ENABLED (CONFIG_IPV6_MIP6 ) + top_iph->saddr = iph_ext->saddr; +#endif + top_iph->daddr = iph_ext->daddr; +memcpy (top_iph +1 , &iph_ext->hdrs, extlen -sizeof (*iph_ext)); +} +static void *ah_alloc_tmp (struct crypto_ahash *ahash,int nfrags,unsigned int size) {
@@ -301,13 +329,7 @@ static void ah6_output_done(void *data, int err)memcpy (ah->auth_data, icv, ahp->icv_trunc_len);memcpy (top_iph, iph_base,IPV6HDR_BASELEN ); -if (extlen) { -#if IS_ENABLED (CONFIG_IPV6_MIP6 ) -memcpy (&top_iph->saddr, iph_ext, extlen); -#else -memcpy (&top_iph->daddr, iph_ext, extlen); -#endif - } +ah6_restore_hdrs (top_iph, iph_ext, extlen);kfree (AH_SKB_CB (skb)->tmp);xfrm_output_resume (skb->sk, skb, err);
@@ -378,12 +400,8 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb)*/ memcpy (iph_base, top_iph,IPV6HDR_BASELEN ); +ah6_save_hdrs (iph_ext, top_iph, extlen);if (extlen) { -#if IS_ENABLED (CONFIG_IPV6_MIP6 ) -memcpy (iph_ext, &top_iph->saddr, extlen); -#else -memcpy (iph_ext, &top_iph->daddr, extlen); -#endif err = ipv6_clear_mutable_options(top_iph, extlen - sizeof(*iph_ext) + sizeof(*top_iph),
@@ -434,13 +452,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb)memcpy (ah->auth_data, icv, ahp->icv_trunc_len);memcpy (top_iph, iph_base,IPV6HDR_BASELEN ); -if (extlen) { -#if IS_ENABLED (CONFIG_IPV6_MIP6 ) -memcpy (&top_iph->saddr, iph_ext, extlen); -#else -memcpy (&top_iph->daddr, iph_ext, extlen); -#endif - } +ah6_restore_hdrs (top_iph, iph_ext, extlen); out_free:kfree (iph_base);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 310/849 media: imon: make send_packet() more robust
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
[ Upstream commit eecd203ada43a4693ce6fdd3a58ae10c7819252c ]
syzbot is reporting that imon has three problems which result in hung tasks due to forever holding device lock [1].
First problem is that when usb_rx_callback_intf0() once got -EPROTO error after ictx->dev_present_intf0 became true, usb_rx_callback_intf0() resubmits urb after printk(), and resubmitted urb causes usb_rx_callback_intf0() to again get -EPROTO error. This results in printk() flooding (RCU stalls).
Alan Stern commented [2] that
In theory it's okay to resubmit _if_ the driver has a robust error-recovery scheme (such as giving up after some fixed limit on the number of errors or after some fixed time has elapsed, perhaps with a time delay to prevent a flood of errors). Most drivers don't bother to do this; they simply give up right away. This makes them more vulnerable to short-term noise interference during USB transfers, but in reality such interference is quite rare. There's nothing really wrong with giving up right away.
but imon has a poor error-recovery scheme which just retries forever; this behavior should be fixed.
Since I'm not sure whether it is safe for imon users to give up upon any error code, this patch takes care of only union of error codes chosen from modules in drivers/media/rc/ directory which handle -EPROTO error (i.e. ir_toy, mceusb and igorplugusb).
Second problem is that when usb_rx_callback_intf0() once got -EPROTO error before ictx->dev_present_intf0 becomes true, usb_rx_callback_intf0() always resubmits urb due to commit 8791d63af0cf ("[media] imon: don't wedge hardware after early callbacks"). Move the ictx->dev_present_intf0 test introduced by commit 6f6b90c9231a ("[media] imon: don't parse scancodes until intf configured") to immediately before imon_incoming_packet(), or the first problem explained above happens without printk() flooding (i.e. hung task).
Third problem is that when usb_rx_callback_intf0() is not called for some reason (e.g. flaky hardware; the reproducer for this problem sometimes prevents usb_rx_callback_intf0() from being called), wait_for_completion_interruptible() in send_packet() never returns (i.e. hung task). As a workaround for such situation, change send_packet() to wait for completion with timeout of 10 seconds.
--- drivers/media/rc/imon.c | 61 +++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 24 deletions(-)
drivers/media/rc/imon.c +37 -24
@@ -650,12 +650,15 @@ static int send_packet(struct imon_context *ictx)smp_rmb ();/* ensure later readers know we're not busy */ pr_err_ratelimited ("error submitting urb(%d)\n" , retval); }else { -/* Wait for transmission to complete (or abort) */ - retval =wait_for_completion_interruptible ( - &ictx->tx.finished); -if (retval) { +/* Wait for transmission to complete (or abort or timeout) */ + retval =wait_for_completion_interruptible_timeout (&ictx->tx.finished,10 *HZ ); +if (retval <=0 ) {usb_kill_urb (ictx->tx_urb);pr_err_ratelimited ("task interrupted\n" ); +if (retval <0 ) + ictx->tx.status = retval; +else + ictx->tx.status = -ETIMEDOUT ; } ictx->tx.busy = false;
@@ -1754,14 +1757,6 @@ static void usb_rx_callback_intf0(struct urb *urb)if (!ictx)return ; -/* -* if we get a callback before we're done configuring the hardware, we -* can't yet process the data, as there's nowhere to send it, but we -* still need to submit a new rx URB to avoid wedging the hardware -*/ -if (!ictx->dev_present_intf0) - goto out; -switch (urb->status) {case -ENOENT :/* usbcore unlink successful! */ return ;
@@ -1770,16 +1765,29 @@ static void usb_rx_callback_intf0(struct urb *urb)break ;case 0 : -imon_incoming_packet (ictx, urb, intfnum); +/* +* if we get a callback before we're done configuring the hardware, we +* can't yet process the data, as there's nowhere to send it, but we +* still need to submit a new rx URB to avoid wedging the hardware +*/ +if (ictx->dev_present_intf0) +imon_incoming_packet (ictx, urb, intfnum);break ; +case -ECONNRESET : +case -EILSEQ : +case -EPROTO : +case -EPIPE : +dev_warn (ictx->dev,"imon %s: status(%d)\n" , + __func__, urb->status); +return ; +default :dev_warn (ictx->dev,"imon %s: status(%d): ignored\n" , __func__, urb->status);break ; } -out:usb_submit_urb (ictx->rx_urb_intf0,GFP_ATOMIC ); }
@@ -1795,14 +1803,6 @@ static void usb_rx_callback_intf1(struct urb *urb)if (!ictx)return ; -/* -* if we get a callback before we're done configuring the hardware, we -* can't yet process the data, as there's nowhere to send it, but we -* still need to submit a new rx URB to avoid wedging the hardware -*/ -if (!ictx->dev_present_intf1) - goto out; -switch (urb->status) {case -ENOENT :/* usbcore unlink successful! */ return ;
@@ -1811,16 +1811,29 @@ static void usb_rx_callback_intf1(struct urb *urb)break ;case 0 : -imon_incoming_packet (ictx, urb, intfnum); +/* +* if we get a callback before we're done configuring the hardware, we +* can't yet process the data, as there's nowhere to send it, but we +* still need to submit a new rx URB to avoid wedging the hardware +*/ +if (ictx->dev_present_intf1) +imon_incoming_packet (ictx, urb, intfnum);break ; +case -ECONNRESET : +case -EILSEQ : +case -EPROTO : +case -EPIPE : +dev_warn (ictx->dev,"imon %s: status(%d)\n" , + __func__, urb->status); +return ; +default :dev_warn (ictx->dev,"imon %s: status(%d): ignored\n" , __func__, urb->status);break ; } -out:usb_submit_urb (ictx->rx_urb_intf1,GFP_ATOMIC ); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 311/849 drm/panthor: Serialize GPU cache flush operations
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karunika Choo <[email protected]>
[ Upstream commit e322a4844811b54477b7072eb40dc9e402a1725d ]
In certain scenarios, it is possible for multiple cache flushes to be requested before the previous one completes. This patch introduces the cache_flush_lock mutex to serialize these operations and ensure that any requested cache flushes are completed instead of dropped.
--- drivers/gpu/drm/panthor/panthor_gpu.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/panthor/panthor_gpu.c +7 -0
@@ -35,6 +35,9 @@ struct panthor_gpu {/** @reqs_acked: GPU request wait queue. */ wait_queue_head_t reqs_acked; + +/** @cache_flush_lock: Lock to serialize cache flushes */ +struct mutex cache_flush_lock; };/**
@@ -204,6 +207,7 @@ int panthor_gpu_init(struct panthor_device *ptdev)spin_lock_init (&gpu->reqs_lock);init_waitqueue_head (&gpu->reqs_acked); +mutex_init (&gpu->cache_flush_lock); ptdev->gpu = gpu;panthor_gpu_init_info (ptdev);
@@ -353,6 +357,9 @@ int panthor_gpu_flush_caches(struct panthor_device *ptdev,bool timedout = false;unsigned long flags; +/* Serialize cache flush operations. */ +guard (mutex)(&ptdev->gpu->cache_flush_lock); +spin_lock_irqsave (&ptdev->gpu->reqs_lock, flags);if (!drm_WARN_ON (&ptdev->base, ptdev->gpu->pending_reqs &GPU_IRQ_CLEAN_CACHES_COMPLETED )) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 312/849 HID: pidff: Use direction fix only for conditional effects
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomasz Pakuła <[email protected]>
[ Upstream commit f345a4798dab800159b09d088e7bdae0f16076c3 ]
The already fixed bug in SDL only affected conditional effects. This should fix FFB in Forza Horizion 4/5 on Moza Devices as Forza Horizon flips the constant force direction instead of using negative magnitude values.
Changing the direction in the effect directly in pidff_upload_effect() would affect it's value in further operations like comparing to the old effect and/or just reading the effect values in the user application.
This, in turn, would lead to constant PID_SET_EFFECT spam as the effect direction would constantly not match the value that's set by the application.
This way, it's still transparent to any software/API.
Only affects conditional effects now so it's better for it to explicitly state that in the name. If any HW ever needs fixed direction for other effects, we'll add more quirks.
--- drivers/hid/hid-universal-pidff.c | 20 ++++++++++---------- drivers/hid/usbhid/hid-pidff.c | 28 +++++++++++++++++++++++----- drivers/hid/usbhid/hid-pidff.h | 2 +- 3 files changed, 34 insertions(+), 16 deletions(-)
drivers/hid/hid-universal-pidff.c +10 -10
@@ -144,25 +144,25 @@ static int universal_pidff_input_configured(struct hid_device *hdev,static const struct hid_device_id universal_pidff_devices[] = { {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R3 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R3_2 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R5 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R5_2 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R9 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R9_2 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R12 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R12_2 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R16_R21 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_MOZA ,USB_DEVICE_ID_MOZA_R16_R21_2 ), - .driver_data =HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + .driver_data =HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION }, {HID_USB_DEVICE (USB_VENDOR_ID_CAMMUS ,USB_DEVICE_ID_CAMMUS_C5 ) }, {HID_USB_DEVICE (USB_VENDOR_ID_CAMMUS ,USB_DEVICE_ID_CAMMUS_C12 ) }, {HID_USB_DEVICE (USB_VENDOR_ID_VRS ,USB_DEVICE_ID_VRS_DFP ),
drivers/hid/usbhid/hid-pidff.c +23 -5
@@ -205,6 +205,14 @@ struct pidff_device {u8 effect_count; }; +static int pidff_is_effect_conditional (struct ff_effect *effect) +{ +return effect->type ==FF_SPRING || + effect->type ==FF_DAMPER || + effect->type ==FF_INERTIA || + effect->type ==FF_FRICTION ; +} +/* * Clamp value for a given field */
@@ -294,6 +302,20 @@ static void pidff_set_duration(struct pidff_usage *usage, u16 duration)pidff_set_time (usage, duration); } +static void pidff_set_effect_direction (struct pidff_device *pidff, +struct ff_effect *effect) +{ +u16 direction = effect->direction; + +/* Use fixed direction if needed */ +if (pidff->quirks &HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION && +pidff_is_effect_conditional (effect)) + direction =PIDFF_FIXED_WHEEL_DIRECTION ; + + pidff->effect_direction->value[0 ] = +pidff_rescale (direction,U16_MAX , pidff->effect_direction); +} +/* * Send envelope report to the device */
@@ -395,11 +417,7 @@ static void pidff_set_effect_report(struct pidff_device *pidff, pidff->set_effect[PID_GAIN ].field->logical_maximum; pidff->set_effect[PID_DIRECTION_ENABLE ].value[0 ] =1 ; -/* Use fixed direction if needed */ - pidff->effect_direction->value[0 ] =pidff_rescale ( - pidff->quirks &HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION ? -PIDFF_FIXED_WHEEL_DIRECTION : effect->direction, -U16_MAX , pidff->effect_direction); +pidff_set_effect_direction (pidff, effect);/* Omit setting delay field if it's missing */ if (!(pidff->quirks &HID_PIDFF_QUIRK_MISSING_DELAY ))
drivers/hid/usbhid/hid-pidff.h +1 -1
@@ -16,7 +16,7 @@#define HID_PIDFF_QUIRK_PERMISSIVE_CONTROL BIT(2)/* Use fixed 0x4000 direction during SET_EFFECT report upload */ -#define HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(3) +#define HID_PIDFF_QUIRK_FIX_CONDITIONAL_DIRECTION BIT(3)/* Force all periodic effects to be uploaded as SINE */ #define HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY BIT(4)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 313/849 HID: pidff: PERMISSIVE_CONTROL quirk autodetection
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomasz Pakuła <[email protected]>
[ Upstream commit c2dc9f0b368c08c34674311cf78407718d5715a7 ]
Fixes force feedback for devices built with MMOS firmware and many more not yet detected devices.
Update quirks mask debug message to always contain all 32 bits of data.
--- drivers/hid/usbhid/hid-pidff.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/hid/usbhid/hid-pidff.c +11 -3
@@ -1151,8 +1151,16 @@ static int pidff_find_special_fields(struct pidff_device *pidff) PID_DIRECTION, 0); pidff->device_control =pidff_find_special_field (pidff->reports[PID_DEVICE_CONTROL ], -PID_DEVICE_CONTROL_ARRAY , - !(pidff->quirks &HID_PIDFF_QUIRK_PERMISSIVE_CONTROL )); +PID_DEVICE_CONTROL_ARRAY ,1 ); + +/* Detect and set permissive control quirk */ +if (!pidff->device_control) { +pr_debug ("Setting PERMISSIVE_CONTROL quirk\n" ); + pidff->quirks |=HID_PIDFF_QUIRK_PERMISSIVE_CONTROL ; + pidff->device_control =pidff_find_special_field ( + pidff->reports[PID_DEVICE_CONTROL ], +PID_DEVICE_CONTROL_ARRAY ,0 ); + } pidff->block_load_status = pidff_find_special_field(pidff->reports[PID_BLOCK_LOAD],
@@ -1492,7 +1500,7 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, u32 initial_quirks) ff->playback = pidff_playback;hid_info (dev,"Force feedback for USB HID PID devices by Anssi Hannula <[email protected]>\n" ); -hid_dbg (dev,"Active quirks mask: 0x%x\n" , pidff->quirks); +hid_dbg (dev,"Active quirks mask: 0x%08x\n" , pidff->quirks);hid_device_io_stop (hid);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 314/849 drm/bridge: display-connector: dont set OP_DETECT for DisplayPorts
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit cb640b2ca54617f4a9d4d6efd5ff2afd6be11f19 ]
Detecting the monitor for DisplayPort targets is more complicated than just reading the HPD pin level: it requires reading the DPCD in order to check what kind of device is attached to the port and whether there is an actual display attached.
In order to let DRM framework handle such configurations, disable DRM_BRIDGE_OP_DETECT for dp-connector devices, letting the actual DP driver perform detection. This still keeps DRM_BRIDGE_OP_HPD enabled, so it is valid for the bridge to report HPD events.
Currently inside the kernel there are only two targets which list hpd-gpios for dp-connector devices: arm64/qcom/qcs6490-rb3gen2 and arm64/qcom/sa8295p-adp. Both should be fine with this change.
--- drivers/gpu/drm/bridge/display-connector.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/bridge/display-connector.c +2 -1
@@ -373,7 +373,8 @@ static int display_connector_probe(struct platform_device *pdev)if (conn->bridge.ddc) conn->bridge.ops |=DRM_BRIDGE_OP_EDID |DRM_BRIDGE_OP_DETECT ; -if (conn->hpd_gpio) +/* Detecting the monitor requires reading DPCD */ +if (conn->hpd_gpio && type != DRM_MODE_CONNECTOR_DisplayPort) conn->bridge.ops |=DRM_BRIDGE_OP_DETECT ;if (conn->hpd_irq >=0 ) conn->bridge.ops |=DRM_BRIDGE_OP_HPD ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 315/849 drm/amdgpu: fix nullptr err of vm_handle_moved
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heng Zhou <[email protected]>
[ Upstream commit 859958a7faefe5b7742b7b8cdbc170713d4bf158 ]
If a amdgpu_bo_va is fpriv->prt_va, the bo of this one is always NULL. So, such kind of amdgpu_bo_va should be updated separately before amdgpu_vm_handle_moved.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +14 -1
@@ -2993,9 +2993,22 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info, struct dma_fence __rcu *struct amdgpu_device *adev =amdgpu_ttm_adev ( peer_vm->root.bo->tbo.bdev); +struct amdgpu_fpriv *fpriv = + container_of(peer_vm, struct amdgpu_fpriv, vm); + + ret =amdgpu_vm_bo_update (adev, fpriv->prt_va, false); +if (ret) { +dev_dbg (adev->dev, +"Memory eviction: handle PRT moved failed, pid %8d. Try again.\n" , +pid_nr (process_info->pid)); + goto validate_map_fail; + } + ret =amdgpu_vm_handle_moved (adev, peer_vm, &exec.ticket);if (ret) { -pr_debug ("Memory eviction: handle moved failed. Try again\n" ); +dev_dbg (adev->dev, +"Memory eviction: handle moved failed, pid %8d. Try again.\n" , +pid_nr (process_info->pid)); goto validate_map_fail; } }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 316/849 drm/amdkfd: Handle lack of READ permissions in SVM mapping
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kent Russell <[email protected]>
[ Upstream commit 0ed704d058cec7643a716a21888d58c7d03f2c3e ]
HMM assumes that pages have READ permissions by default. Inside svm_range_validate_and_map, we add READ permissions then add WRITE permissions if the VMA isn't read-only. This will conflict with regions that only have PROT_WRITE or have PROT_NONE. When that happens, svm_range_restore_work will continue to retry, silently, giving the impression of a hang if pr_debug isn't enabled to show the retries..
If pages don't have READ permissions, simply unmap them and continue. If they weren't mapped in the first place, this would be a no-op. Since x86 doesn't support write-only, and PROT_NONE doesn't allow reads or writes anyways, this will allow the svm range validation to continue without getting stuck in a loop forever on mappings we can't use with HMM.
--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +23 -0
@@ -1714,6 +1714,29 @@ static int svm_range_validate_and_map(struct mm_struct *mm, next =min (vma->vm_end, end); npages = (next - addr) >>PAGE_SHIFT ; +/* HMM requires at least READ permissions. If provided with PROT_NONE, +* unmap the memory. If it's not already mapped, this is a no-op +* If PROT_WRITE is provided without READ, warn first then unmap +*/ +if (!(vma->vm_flags &VM_READ )) { +unsigned long e, s; + +svm_range_lock (prange); +if (vma->vm_flags &VM_WRITE ) +pr_debug ("VM_WRITE without VM_READ is not supported" ); + s =max (start, prange->start); + e =min (end, prange->last); +if (e >= s) + r =svm_range_unmap_from_gpus (prange, s, e, +KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU ); +svm_range_unlock (prange); +/* If unmap returns non-zero, we'll bail on the next for loop +* iteration, so just leave r and continue +*/ + addr = next; +continue ; + } +WRITE_ONCE (p->svms.faulting_task, current); r = amdgpu_hmm_range_get_pages(&prange->notifier, addr, npages, readonly, owner, NULL,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 317/849 drm/amdgpu: refactor bad_page_work for corner case handling
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chenglei Xie <[email protected]>
[ Upstream commit d2fa0ec6e0aea6ffbd41939d0c7671db16991ca4 ]
When a poison is consumed on the guest before the guest receives the host's poison creation msg, a corner case may occur to have poison_handler complete processing earlier than it should to cause the guest to hang waiting for the req_bad_pages reply during a VF FLR, resulting in the VM becoming inaccessible in stress tests.
To fix this issue, this patch refactored the mailbox sequence by seperating the bad_page_work into two parts req_bad_pages_work and handle_bad_pages_work. Old sequence:
1.Stop data exchange work
2.Guest sends MB_REQ_RAS_BAD_PAGES to host and keep polling for IDH_RAS_BAD_PAGES_READY
3.If the IDH_RAS_BAD_PAGES_READY arrives within timeout limit, re-init the data exchange region for updated bad page info
else timeout with error message
New sequence:req_bad_pages_work:
1.Stop data exhange work
2.Guest sends MB_REQ_RAS_BAD_PAGES to host
Once Guest receives IDH_RAS_BAD_PAGES_READY eventhandle_bad_pages_work:
3.re-init the data exchange region for updated bad page info
--- drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 3 +- drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | 32 +++++++++++++++++++--- drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c | 35 +++++++++++++++++++----- drivers/gpu/drm/amd/amdgpu/soc15.c | 1 - 4 files changed, 58 insertions(+), 13 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h +2 -1
@@ -267,7 +267,8 @@ struct amdgpu_virt {struct amdgpu_irq_src rcv_irq;struct work_struct flr_work; -struct work_struct bad_pages_work; +struct work_struct req_bad_pages_work; +struct work_struct handle_bad_pages_work;struct amdgpu_mm_table mm_table;const struct amdgpu_virt_ops *ops;
drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c +28 -4
@@ -292,14 +292,32 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work) } } -static void xgpu_ai_mailbox_bad_pages_work (struct work_struct *work) +static void xgpu_ai_mailbox_req_bad_pages_work (struct work_struct *work) { - struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, bad_pages_work); + struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, req_bad_pages_work); struct amdgpu_device *adev = container_of(virt, struct amdgpu_device, virt);if (down_read_trylock (&adev->reset_domain->sem)) {amdgpu_virt_fini_data_exchange (adev);amdgpu_virt_request_bad_pages (adev); +up_read (&adev->reset_domain->sem); + } +} + +/** +* xgpu_ai_mailbox_handle_bad_pages_work - Reinitialize the data exchange region to get fresh bad page information +* @work: pointer to the work_struct +* +* This work handler is triggered when bad pages are ready, and it reinitializes +* the data exchange region to retrieve updated bad page information from the host. +*/ +static void xgpu_ai_mailbox_handle_bad_pages_work (struct work_struct *work) +{ + struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, handle_bad_pages_work); + struct amdgpu_device *adev = container_of(virt, struct amdgpu_device, virt); + +if (down_read_trylock (&adev->reset_domain->sem)) { +amdgpu_virt_fini_data_exchange (adev);amdgpu_virt_init_data_exchange (adev);up_read (&adev->reset_domain->sem); }
@@ -327,10 +345,15 @@ static int xgpu_ai_mailbox_rcv_irq(struct amdgpu_device *adev,struct amdgpu_ras *ras =amdgpu_ras_get_context (adev);switch (event) { +case IDH_RAS_BAD_PAGES_READY : +xgpu_ai_mailbox_send_ack (adev); +if (amdgpu_sriov_runtime (adev)) +schedule_work (&adev->virt.handle_bad_pages_work); +break ;case IDH_RAS_BAD_PAGES_NOTIFICATION :xgpu_ai_mailbox_send_ack (adev);if (amdgpu_sriov_runtime (adev)) -schedule_work (&adev->virt.bad_pages_work); +schedule_work (&adev->virt.req_bad_pages_work);break ;case IDH_UNRECOV_ERR_NOTIFICATION :xgpu_ai_mailbox_send_ack (adev);
@@ -415,7 +438,8 @@ int xgpu_ai_mailbox_get_irq(struct amdgpu_device *adev) }INIT_WORK (&adev->virt.flr_work, xgpu_ai_mailbox_flr_work); -INIT_WORK (&adev->virt.bad_pages_work, xgpu_ai_mailbox_bad_pages_work); +INIT_WORK (&adev->virt.req_bad_pages_work, xgpu_ai_mailbox_req_bad_pages_work); +INIT_WORK (&adev->virt.handle_bad_pages_work, xgpu_ai_mailbox_handle_bad_pages_work);return 0 ; }
drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c +28 -7
@@ -202,9 +202,6 @@ static int xgpu_nv_send_access_requests_with_param(struct amdgpu_device *adev,case IDH_REQ_RAS_CPER_DUMP : event =IDH_RAS_CPER_DUMP_READY ;break ; -case IDH_REQ_RAS_BAD_PAGES : - event =IDH_RAS_BAD_PAGES_READY ; -break ;default :break ; }
@@ -359,14 +356,32 @@ static void xgpu_nv_mailbox_flr_work(struct work_struct *work) } } -static void xgpu_nv_mailbox_bad_pages_work (struct work_struct *work) +static void xgpu_nv_mailbox_req_bad_pages_work (struct work_struct *work) { - struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, bad_pages_work); + struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, req_bad_pages_work); struct amdgpu_device *adev = container_of(virt, struct amdgpu_device, virt);if (down_read_trylock (&adev->reset_domain->sem)) {amdgpu_virt_fini_data_exchange (adev);amdgpu_virt_request_bad_pages (adev); +up_read (&adev->reset_domain->sem); + } +} + +/** +* xgpu_nv_mailbox_handle_bad_pages_work - Reinitialize the data exchange region to get fresh bad page information +* @work: pointer to the work_struct +* +* This work handler is triggered when bad pages are ready, and it reinitializes +* the data exchange region to retrieve updated bad page information from the host. +*/ +static void xgpu_nv_mailbox_handle_bad_pages_work (struct work_struct *work) +{ + struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, handle_bad_pages_work); + struct amdgpu_device *adev = container_of(virt, struct amdgpu_device, virt); + +if (down_read_trylock (&adev->reset_domain->sem)) { +amdgpu_virt_fini_data_exchange (adev);amdgpu_virt_init_data_exchange (adev);up_read (&adev->reset_domain->sem); }
@@ -397,10 +412,15 @@ static int xgpu_nv_mailbox_rcv_irq(struct amdgpu_device *adev,struct amdgpu_ras *ras =amdgpu_ras_get_context (adev);switch (event) { +case IDH_RAS_BAD_PAGES_READY : +xgpu_nv_mailbox_send_ack (adev); +if (amdgpu_sriov_runtime (adev)) +schedule_work (&adev->virt.handle_bad_pages_work); +break ;case IDH_RAS_BAD_PAGES_NOTIFICATION :xgpu_nv_mailbox_send_ack (adev);if (amdgpu_sriov_runtime (adev)) -schedule_work (&adev->virt.bad_pages_work); +schedule_work (&adev->virt.req_bad_pages_work);break ;case IDH_UNRECOV_ERR_NOTIFICATION :xgpu_nv_mailbox_send_ack (adev);
@@ -485,7 +505,8 @@ int xgpu_nv_mailbox_get_irq(struct amdgpu_device *adev) }INIT_WORK (&adev->virt.flr_work, xgpu_nv_mailbox_flr_work); -INIT_WORK (&adev->virt.bad_pages_work, xgpu_nv_mailbox_bad_pages_work); +INIT_WORK (&adev->virt.req_bad_pages_work, xgpu_nv_mailbox_req_bad_pages_work); +INIT_WORK (&adev->virt.handle_bad_pages_work, xgpu_nv_mailbox_handle_bad_pages_work);return 0 ; }
drivers/gpu/drm/amd/amdgpu/soc15.c +0 -1
@@ -741,7 +741,6 @@ static void soc15_reg_base_init(struct amdgpu_device *adev)void soc15_set_virt_ops (struct amdgpu_device *adev) { adev->virt.ops = &xgpu_ai_virt_ops; -/* init soc15 reg base early enough so we can * request request full access for sriov before * set_ip_blocks. */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 318/849 hwrng: timeriomem - Use us_to_ktime() where appropriate
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xichao Zhao <[email protected]>
[ Upstream commit 817fcdbd4ca29834014a5dadbe8e11efeb12800c ]
It is better to replace ns_to_ktime() with us_to_ktime(), which can make the code clearer.
--- drivers/char/hw_random/timeriomem-rng.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/char/hw_random/timeriomem-rng.c +1 -1
@@ -150,7 +150,7 @@ static int timeriomem_rng_probe(struct platform_device *pdev) priv->rng_ops.quality = pdata->quality; } - priv->period =ns_to_ktime (period *NSEC_PER_USEC ); + priv->period =us_to_ktime (period);init_completion (&priv->completion);hrtimer_setup (&priv->timer, timeriomem_rng_trigger,CLOCK_MONOTONIC ,HRTIMER_MODE_ABS );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 319/849 iio: adc: spear_adc: mask SPEAR_ADC_STATUS channel and avg sample before setting register
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rodrigo Gobbi <[email protected]>
[ Upstream commit d75c7021c08e8ae3f311ef2464dca0eaf75fab9f ]
avg sample info is a bit field coded inside the following
bits: 5,6,7 and 8 of a device status register.
Channel num info the same, but over bits: 1, 2 and 3.
Mask both values in order to avoid touching other register bits, since the first info (avg sample), came from DT.
--- drivers/iio/adc/spear_adc.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/iio/adc/spear_adc.c +5 -4
@@ -14,6 +14,7 @@#include <linux/kernel.h> #include <linux/slab.h> #include <linux/io.h> +#include <linux/bitfield.h> #include <linux/clk.h> #include <linux/err.h> #include <linux/completion.h>
@@ -29,9 +30,9 @@/* Bit definitions for SPEAR_ADC_STATUS */ #define SPEAR_ADC_STATUS_START_CONVERSION BIT(0) -#define SPEAR_ADC_STATUS_CHANNEL_NUM (x) ((x) << 1) +#define SPEAR_ADC_STATUS_CHANNEL_NUM_MASK GENMASK(3, 1)#define SPEAR_ADC_STATUS_ADC_ENABLE BIT(4) -#define SPEAR_ADC_STATUS_AVG_SAMPLE (x) ((x) << 5) +#define SPEAR_ADC_STATUS_AVG_SAMPLE_MASK GENMASK(8, 5)#define SPEAR_ADC_STATUS_VREF_INTERNAL BIT(9)#define SPEAR_ADC_DATA_MASK 0x03ff
@@ -157,8 +158,8 @@ static int spear_adc_read_raw(struct iio_dev *indio_dev,case IIO_CHAN_INFO_RAW :mutex_lock (&st->lock); - status =SPEAR_ADC_STATUS_CHANNEL_NUM (chan->channel) | -SPEAR_ADC_STATUS_AVG_SAMPLE (st->avg_samples) | + status =FIELD_PREP (SPEAR_ADC_STATUS_CHANNEL_NUM_MASK , chan->channel) | +FIELD_PREP (SPEAR_ADC_STATUS_AVG_SAMPLE_MASK , st->avg_samples) |SPEAR_ADC_STATUS_START_CONVERSION |SPEAR_ADC_STATUS_ADC_ENABLE ;if (st->vref_external ==0 )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 320/849 iio: adc: imx93_adc: load calibrated values even calibration failed
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haibo Chen <[email protected]>
[ Upstream commit 12c9b09e981ab14ebec8e4eefa946cbd26dd306b ]
ADC calibration might fail because of the noise on reference voltage. To avoid calibration fail, need to meet the following requirement:
ADC reference voltage Noise < 1.8V * 1/2^ENOB
For the case which the ADC reference voltage on board do not meet the requirement, still load the calibrated values, so ADC can also work but maybe not that accurate.
--- drivers/iio/adc/imx93_adc.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
drivers/iio/adc/imx93_adc.c +15 -3
@@ -38,6 +38,7 @@#define IMX93_ADC_PCDR6 0x118#define IMX93_ADC_PCDR7 0x11c#define IMX93_ADC_CALSTAT 0x39C +#define IMX93_ADC_CALCFG0 0x3A0/* ADC bit shift */ #define IMX93_ADC_MCR_MODE_MASK BIT(29)
@@ -58,6 +59,8 @@#define IMX93_ADC_IMR_ECH_MASK BIT(0)#define IMX93_ADC_PCDR_CDATA_MASK GENMASK(11, 0) +#define IMX93_ADC_CALCFG0_LDFAIL_MASK BIT(4) +/* ADC status */ #define IMX93_ADC_MSR_ADCSTATUS_IDLE 0#define IMX93_ADC_MSR_ADCSTATUS_POWER_DOWN 1
@@ -145,7 +148,7 @@ static void imx93_adc_config_ad_clk(struct imx93_adc *adc)static int imx93_adc_calibration (struct imx93_adc *adc) { -u32 mcr, msr; +u32 mcr, msr, calcfg;int ret;/* make sure ADC in power down mode */
@@ -158,6 +161,11 @@ static int imx93_adc_calibration(struct imx93_adc *adc)imx93_adc_power_up (adc); +/* Enable loading of calibrated values even in fail condition */ + calcfg =readl (adc->regs +IMX93_ADC_CALCFG0 ); + calcfg |=IMX93_ADC_CALCFG0_LDFAIL_MASK ; +writel (calcfg, adc->regs +IMX93_ADC_CALCFG0 ); +/* * TODO: we use the default TSAMP/NRSMPL/AVGEN in MCR, * can add the setting of these bit if need in future.
@@ -180,9 +188,13 @@ static int imx93_adc_calibration(struct imx93_adc *adc)/* check whether calbration is success or not */ msr =readl (adc->regs +IMX93_ADC_MSR );if (msr &IMX93_ADC_MSR_CALFAIL_MASK ) { +/* +* Only give warning here, this means the noise of the +* reference voltage do not meet the requirement: +* ADC reference voltage Noise < 1.8V * 1/2^ENOB +* And the resault of ADC is not that accurate. +*/ dev_warn (adc->dev,"ADC calibration failed!\n" ); -imx93_adc_power_down (adc); -return -EAGAIN ; }return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 321/849 usb: gadget: f_ncm: Fix MAC assignment NCM ethernet
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: raub camaioni <[email protected]>
[ Upstream commit 956606bafb5fc6e5968aadcda86fc0037e1d7548 ]
This fix is already present in f_ecm.c and was never propagated to f_ncm.c
When creating multiple NCM ethernet devices
on a composite usb gadget device
each MAC address on the HOST side will be identical. Having the same MAC on different network interfaces is bad.
This fix updates the MAC address inside the ncm_strings_defs global during the ncm_bind call. This ensures each device has a unique MAC.
In f_ecm.c ecm_string_defs is updated in the same way.
The defunct MAC assignment in ncm_alloc has been removed.
--- drivers/usb/gadget/function/f_ncm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/gadget/function/f_ncm.c +2 -1
@@ -1465,6 +1465,8 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) ncm_opts->bound = true; + ncm_string_defs[1 ].s = ncm->ethaddr; + us =usb_gstrings_attach (cdev, ncm_strings,ARRAY_SIZE (ncm_string_defs));if (IS_ERR (us))
@@ -1759,7 +1761,6 @@ static struct usb_function *ncm_alloc(struct usb_function_instance *fi)mutex_unlock (&opts->lock);return ERR_PTR (-EINVAL ); } - ncm_string_defs[STRING_MAC_IDX ].s = ncm->ethaddr;spin_lock_init (&ncm->lock);ncm_reset_values (ncm);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 322/849 ASoC: es8323: remove DAC enablement write from es8323_probe
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shimrra Shai <[email protected]>
[ Upstream commit 33bc29123d26f7caa7d11f139e153e39104afc6c ]
Remove initialization of the DAC and mixer enablement bits from the es8323_probe routine. This really should be handled by the DAPM subsystem.
--- sound/soc/codecs/es8323.c | 1 - 1 file changed, 1 deletion(-)
sound/soc/codecs/es8323.c +0 -1
@@ -632,7 +632,6 @@ static int es8323_probe(struct snd_soc_component *component)snd_soc_component_write (component,ES8323_CONTROL2 ,0x60 );snd_soc_component_write (component,ES8323_CHIPPOWER ,0x00 ); -snd_soc_component_write (component,ES8323_DACCONTROL17 ,0xB8 );return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 323/849 ASoC: es8323: add proper left/right mixer controls via DAPM
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shimrra Shai <[email protected]>
[ Upstream commit 7e39ca4056d11fef6b90aedd9eeeb3e070d3ce9f ]
Add proper DAC and mixer controls to DAPM; no initialization in es8323_probe.
--- sound/soc/codecs/es8323.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/codecs/es8323.c +2 -2
@@ -182,13 +182,13 @@ static const struct snd_kcontrol_new es8323_mono_adc_mux_controls =/* Left Mixer */ static const struct snd_kcontrol_new es8323_left_mixer_controls[] = { -SOC_DAPM_SINGLE ("Left Playback Switch" ,SND_SOC_NOPM ,7 ,1 ,1 ), +SOC_DAPM_SINGLE ("Left Playback Switch" ,ES8323_DACCONTROL17 ,7 ,1 ,0 ),SOC_DAPM_SINGLE ("Left Bypass Switch" ,ES8323_DACCONTROL17 ,6 ,1 ,0 ), };/* Right Mixer */ static const struct snd_kcontrol_new es8323_right_mixer_controls[] = { -SOC_DAPM_SINGLE ("Right Playback Switch" ,SND_SOC_NOPM ,6 ,1 ,1 ), +SOC_DAPM_SINGLE ("Right Playback Switch" ,ES8323_DACCONTROL20 ,7 ,1 ,0 ),SOC_DAPM_SINGLE ("Right Bypass Switch" ,ES8323_DACCONTROL20 ,6 ,1 ,0 ), };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 324/849 ASoC: Intel: avs: Do not share the name pointer between components
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cezary Rojewski <[email protected]>
[ Upstream commit 4dee5c1cc439b0d5ef87f741518268ad6a95b23d ]
By sharing 'name' directly, tearing down components may lead to use-after-free errors. Duplicate the name to avoid that.
At the same time, update the order of operations - since commit cee28113db17 ("ASoC: dmaengine_pcm: Allow passing component name via config") the framework does not override component->name if set before invoking the initializer.
--- sound/soc/intel/avs/pcm.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
sound/soc/intel/avs/pcm.c +7 -5
@@ -1393,16 +1393,18 @@ int avs_soc_component_register(struct device *dev, const char *name,if (!acomp)return -ENOMEM ; - ret =snd_soc_component_initialize (&acomp->base, drv, dev); -if (ret <0 ) -return ret; + acomp->base.name =devm_kstrdup (dev, name,GFP_KERNEL ); +if (!acomp->base.name) +return -ENOMEM ; -/* force name change after ASoC is done with its init */ - acomp->base.name = name;INIT_LIST_HEAD (&acomp->node); drv->use_dai_pcm_id = !obsolete_card_names; + ret =snd_soc_component_initialize (&acomp->base, drv, dev); +if (ret <0 ) +return ret; +return snd_soc_add_component (&acomp->base, cpu_dais, num_cpu_dais); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 325/849 ASoC: codecs: wsa883x: Handle shared reset GPIO for WSA883x speakers
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mohammad Rafi Shaik <[email protected]>
[ Upstream commit cf65182247761f7993737b710afe8c781699356b ]
On some Qualcomm platforms such as QCS6490-RB3Gen2, the multiple WSA8830/WSA8835 speaker amplifiers share a common reset (shutdown) GPIO.
To handle such scenario, use the reset controller framework and its "reset-gpio" driver to handle such case. This allows proper handling of all WSA883x speaker amplifiers on QCS6490-RB3Gen2 board.
--- sound/soc/codecs/wsa883x.c | 57 ++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 8 deletions(-)
sound/soc/codecs/wsa883x.c +49 -8
@@ -14,6 +14,7 @@#include <linux/printk.h> #include <linux/regmap.h> #include <linux/regulator/consumer.h> +#include <linux/reset.h> #include <linux/slab.h> #include <linux/soundwire/sdw.h> #include <linux/soundwire/sdw_registers.h>
@@ -468,6 +469,7 @@ struct wsa883x_priv {struct sdw_stream_runtime *sruntime;struct sdw_port_config port_config[WSA883X_MAX_SWR_PORTS ];struct gpio_desc *sd_n; +struct reset_control *sd_reset;bool port_prepared[WSA883X_MAX_SWR_PORTS ];bool port_enable[WSA883X_MAX_SWR_PORTS ];int active_ports;
@@ -1546,6 +1548,46 @@ static const struct hwmon_chip_info wsa883x_hwmon_chip_info = { .info = wsa883x_hwmon_info, }; +static void wsa883x_reset_assert (void *data) +{ +struct wsa883x_priv *wsa883x = data; + +if (wsa883x->sd_reset) +reset_control_assert (wsa883x->sd_reset); +else +gpiod_direction_output (wsa883x->sd_n,1 ); +} + +static void wsa883x_reset_deassert (struct wsa883x_priv *wsa883x) +{ +if (wsa883x->sd_reset) +reset_control_deassert (wsa883x->sd_reset); +else +gpiod_direction_output (wsa883x->sd_n,0 ); +} + +static int wsa883x_get_reset (struct device *dev,struct wsa883x_priv *wsa883x) +{ + wsa883x->sd_reset =devm_reset_control_get_optional_shared (dev,NULL ); +if (IS_ERR (wsa883x->sd_reset)) +return dev_err_probe (dev,PTR_ERR (wsa883x->sd_reset), +"Failed to get reset\n" ); +/* +* if sd_reset: NULL, so use the backwards compatible way for powerdown-gpios, +* which does not handle sharing GPIO properly. +*/ +if (!wsa883x->sd_reset) { + wsa883x->sd_n =devm_gpiod_get_optional (dev,"powerdown" , +GPIOD_FLAGS_BIT_NONEXCLUSIVE | +GPIOD_OUT_HIGH ); +if (IS_ERR (wsa883x->sd_n)) +return dev_err_probe (dev,PTR_ERR (wsa883x->sd_n), +"Shutdown Control GPIO not found\n" ); + } + +return 0 ; +} +static int wsa883x_probe (struct sdw_slave *pdev,const struct sdw_device_id *id) {
@@ -1566,13 +1608,9 @@ static int wsa883x_probe(struct sdw_slave *pdev,if (ret)return dev_err_probe (dev, ret,"Failed to enable vdd regulator\n" ); - wsa883x->sd_n =devm_gpiod_get_optional (dev,"powerdown" , -GPIOD_FLAGS_BIT_NONEXCLUSIVE |GPIOD_OUT_HIGH ); -if (IS_ERR (wsa883x->sd_n)) { - ret =dev_err_probe (dev,PTR_ERR (wsa883x->sd_n), -"Shutdown Control GPIO not found\n" ); + ret =wsa883x_get_reset (dev, wsa883x); +if (ret) goto err; - }dev_set_drvdata (dev, wsa883x); wsa883x->slave = pdev;
@@ -1595,11 +1633,14 @@ static int wsa883x_probe(struct sdw_slave *pdev, pdev->prop.simple_clk_stop_capable = true; pdev->prop.sink_dpn_prop = wsa_sink_dpn_prop; pdev->prop.scp_int1_mask =SDW_SCP_INT1_BUS_CLASH |SDW_SCP_INT1_PARITY ; -gpiod_direction_output (wsa883x->sd_n,0 ); + +wsa883x_reset_deassert (wsa883x); + ret =devm_add_action_or_reset (dev, wsa883x_reset_assert, wsa883x); +if (ret) +return ret; wsa883x->regmap =devm_regmap_init_sdw (pdev, &wsa883x_regmap_config);if (IS_ERR (wsa883x->regmap)) { -gpiod_direction_output (wsa883x->sd_n,1 ); ret =dev_err_probe (dev,PTR_ERR (wsa883x->regmap),"regmap_init failed\n" ); goto err;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 326/849 drm/xe: Make page size consistent in loop
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Richter <[email protected]>
[ Upstream commit b85bb2d677153d990924d31be9416166d22382eb ]
If PAGE_SIZE != XE_PAGE_SIZE (which is currently locked behind CONFIG_BROKEN), this would generate the wrong number of PDEs.
Since these PDEs are consumed by the GPU, the GPU page size needs to be used.
--- drivers/gpu/drm/xe/xe_migrate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_migrate.c +1 -1
@@ -291,7 +291,7 @@ static int xe_migrate_prepare_vm(struct xe_tile *tile, struct xe_migrate *m, }/* Write PDE's that point to our BO. */ -for (i =0 ; i < map_ofs /PAGE_SIZE ; i++) { +for (i =0 ; i < map_ofs /XE_PAGE_SIZE ; i++) { entry = vm->pt_ops->pde_encode_bo (bo, (u64 )i *XE_PAGE_SIZE ); xe_map_wr(xe, &bo->vmap, map_ofs + XE_PAGE_SIZE +
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 327/849 wifi: rtw89: wow: remove notify during WoWLAN net-detect
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuan-Chung Chen <[email protected]>
[ Upstream commit 38846585f9df9af1f7261d85134a5510fc079458 ]
In WoWLAN net-detect mode, the firmware periodically performs scans and sends scan reports via C2H, which driver does not need. These unnecessary C2H events cause firmware watchdog timeout, leading to unexpected wakeups and SER 0x2599 on 8922AE.
--- drivers/net/wireless/realtek/rtw89/fw.c | 2 -- 1 file changed, 2 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.c +0 -2
@@ -7123,7 +7123,6 @@ static void rtw89_pno_scan_add_chan_ax(struct rtw89_dev *rtwdev,struct rtw89_pktofld_info *info;u8 probe_count =0 ; - ch_info->notify_action =RTW89_SCANOFLD_DEBUG_MASK ; ch_info->dfs_ch = chan_type ==RTW89_CHAN_DFS ; ch_info->bw =RTW89_SCAN_WIDTH ; ch_info->tx_pkt = true;
@@ -7264,7 +7263,6 @@ static void rtw89_pno_scan_add_chan_be(struct rtw89_dev *rtwdev, int chan_type,struct rtw89_pktofld_info *info;u8 probe_count =0 , i; - ch_info->notify_action =RTW89_SCANOFLD_DEBUG_MASK ; ch_info->dfs_ch = chan_type ==RTW89_CHAN_DFS ; ch_info->bw =RTW89_SCAN_WIDTH ; ch_info->tx_null = false;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 328/849 wifi: rtw89: fix BSSID comparison for non-transmitted BSSID
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuan-Chung Chen <[email protected]>
[ Upstream commit c4c16c88e78417424b4e3f33177e84baf0bc9a99 ]
For non-transmitted connections, beacons are received from the transmitted BSSID. Fix this to avoid missing beacon statistics.
--- drivers/net/wireless/realtek/rtw89/core.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/core.c +5 -1
@@ -2246,6 +2246,7 @@ static void rtw89_vif_rx_stats_iter(void *data, u8 *mac,struct ieee80211_bss_conf *bss_conf;struct rtw89_vif_link *rtwvif_link;const u8 *bssid = iter_data->bssid; +const u8 *target_bssid; if (rtwdev->scanning && (ieee80211_is_beacon(hdr->frame_control) ||
@@ -2267,7 +2268,10 @@ static void rtw89_vif_rx_stats_iter(void *data, u8 *mac, goto out; } -if (!ether_addr_equal (bss_conf->bssid, bssid)) + target_bssid =ieee80211_is_beacon (hdr->frame_control) && + bss_conf->nontransmitted ? + bss_conf->transmitter_bssid : bss_conf->bssid; +if (!ether_addr_equal (target_bssid, bssid)) goto out;if (is_mld) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 329/849 wifi: rtw89: 8851b: rfk: update IQK TIA setting
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuan-Chung Chen <[email protected]>
[ Upstream commit b521685da35ebf091e51f9ea9ad2896a4ddb6e98 ]
With the new TIA setting of RX IQK, unstable RX throughput can be avoided, especially in medium-high attenuation environments.
--- .../net/wireless/realtek/rtw89/rtw8851b_rfk.c | 85 ++++++++++++------- 1 file changed, 54 insertions(+), 31 deletions(-)
drivers/net/wireless/realtek/rtw89/rtw8851b_rfk.c +54 -31
@@ -17,7 +17,7 @@#define DPK_RF_REG_NUM_8851B 4#define DPK_KSET_NUM 4#define RTW8851B_RXK_GROUP_NR 4 -#define RTW8851B_RXK_GROUP_IDX_NR 2 +#define RTW8851B_RXK_GROUP_IDX_NR 4#define RTW8851B_TXK_GROUP_NR 1#define RTW8851B_IQK_VER 0x14#define RTW8851B_IQK_SS 1
@@ -114,9 +114,9 @@ static const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8851B] = {0x5830};static const u32 g_idxrxgain[RTW8851B_RXK_GROUP_NR ] = {0x10e ,0x116 ,0x28e ,0x296 };static const u32 g_idxattc2[RTW8851B_RXK_GROUP_NR ] = {0x0 ,0xf ,0x0 ,0xf };static const u32 g_idxrxagc[RTW8851B_RXK_GROUP_NR ] = {0x0 ,0x1 ,0x2 ,0x3 }; -static const u32 a_idxrxgain[RTW8851B_RXK_GROUP_IDX_NR ] = {0x10C ,0x28c }; -static const u32 a_idxattc2[RTW8851B_RXK_GROUP_IDX_NR ] = {0xf ,0xf }; -static const u32 a_idxrxagc[RTW8851B_RXK_GROUP_IDX_NR ] = {0x4 ,0x6 }; +static const u32 a_idxrxgain[RTW8851B_RXK_GROUP_IDX_NR ] = {0x10C ,0x112 ,0x28c ,0x292 }; +static const u32 a_idxattc2[RTW8851B_RXK_GROUP_IDX_NR ] = {0xf ,0xf ,0xf ,0xf }; +static const u32 a_idxrxagc[RTW8851B_RXK_GROUP_IDX_NR ] = {0x4 ,0x5 ,0x6 ,0x7 };static const u32 a_power_range[RTW8851B_TXK_GROUP_NR ] = {0x0 };static const u32 a_track_range[RTW8851B_TXK_GROUP_NR ] = {0x6 };static const u32 a_gain_bb[RTW8851B_TXK_GROUP_NR ] = {0x0a };
@@ -139,17 +139,6 @@ static const u32 dpk_rf_reg[DPK_RF_REG_NUM_8851B] = {0xde, 0x8f, 0x5, 0x10005};static void _set_ch (struct rtw89_dev *rtwdev,u32 val); -static u8 _rxk_5ghz_group_from_idx (u8 idx) -{ -/* There are four RXK groups (RTW8851B_RXK_GROUP_NR), but only group 0 -* and 2 are used in 5 GHz band, so reduce elements to 2. -*/ -if (idx <RTW8851B_RXK_GROUP_IDX_NR ) -return idx *2 ; - -return 0 ; -} -static u8 _kpath (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx) {return RF_A ;
@@ -196,7 +185,7 @@ static void _txck_force(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,static void _rxck_force (struct rtw89_dev *rtwdev,enum rtw89_rf_path path,bool force,enum adc_ck ck) { -static const u32 ck960_8851b[] = {0x8 ,0x2 ,0x2 ,0x4 ,0xf ,0xa ,0x93 }; +static const u32 ck960_8851b[] = {0x8 ,0x2 ,0x2 ,0x4 ,0xf ,0xa ,0x92 };static const u32 ck1920_8851b[] = {0x9 ,0x0 ,0x0 ,0x3 ,0xf ,0xa ,0x49 };const u32 *data;
@@ -905,18 +894,27 @@ static bool _rxk_5g_group_sel(struct rtw89_dev *rtwdev,bool kfail = false;bool notready;u32 rf_0; -u8 idx; +u32 val;u8 gp;rtw89_debug (rtwdev,RTW89_DBG_RFK ,"[IQK]===>%s\n" , __func__); -for (idx =0 ; idx <RTW8851B_RXK_GROUP_IDX_NR ; idx++) { - gp =_rxk_5ghz_group_from_idx (idx); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWE ,RFREG_MASK ,0x1000 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWA ,RFREG_MASK ,0x4 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWD0 ,RFREG_MASK ,0x17 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWA ,RFREG_MASK ,0x5 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWD0 ,RFREG_MASK ,0x27 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWE ,RFREG_MASK ,0x0 ); + val =rtw89_read_rf (rtwdev,RF_PATH_A ,RR_RXA2 ,0x20 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_MOD ,RR_MOD_MASK ,0xc ); + +for (gp =0 ; gp <RTW8851B_RXK_GROUP_IDX_NR ; gp++) {rtw89_debug (rtwdev,RTW89_DBG_RFK ,"[IQK]S%x, gp = %x\n" , path, gp); -rtw89_write_rf (rtwdev,RF_PATH_A ,RR_MOD ,RR_MOD_RGM , a_idxrxgain[idx]); -rtw89_write_rf (rtwdev,RF_PATH_A ,RR_RXA2 ,RR_RXA2_ATT , a_idxattc2[idx]); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_MOD ,RR_MOD_RGM , a_idxrxgain[gp]); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_RXA2 ,RR_RXA2_ATT , a_idxattc2[gp]); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_RXA2 ,0x20 ,0x1 );rtw89_phy_write32_mask (rtwdev,R_CFIR_LUT ,B_CFIR_LUT_SEL ,0x1 );rtw89_phy_write32_mask (rtwdev,R_CFIR_LUT ,B_CFIR_LUT_G3 ,0x0 );
@@ -926,7 +924,7 @@ static bool _rxk_5g_group_sel(struct rtw89_dev *rtwdev,fsleep (100 ); rf_0 =rtw89_read_rf (rtwdev, path,RR_MOD ,RFREG_MASK );rtw89_phy_write32_mask (rtwdev,R_IQK_DIF2 ,B_IQK_DIF2_RXPI , rf_0); -rtw89_phy_write32_mask (rtwdev,R_IQK_RXA ,B_IQK_RXAGC , a_idxrxagc[idx]); +rtw89_phy_write32_mask (rtwdev,R_IQK_RXA ,B_IQK_RXAGC , a_idxrxagc[gp]);rtw89_phy_write32_mask (rtwdev,R_IQK_DIF4 ,B_IQK_DIF4_RXT ,0x11 ); notready =_iqk_one_shot (rtwdev, phy_idx, path,ID_RXAGC );
@@ -959,6 +957,7 @@ static bool _rxk_5g_group_sel(struct rtw89_dev *rtwdev,_iqk_sram (rtwdev, path);if (kfail) { +rtw89_phy_write32_mask (rtwdev,R_IQK_RES ,B_IQK_RES_RXCFIR ,0x0 );rtw89_phy_write32_mask (rtwdev,R_RXIQC + (path <<8 ),MASKDWORD , iqk_info->nb_rxcfir[path] |0x2 ); iqk_info->is_wb_txiqk[path] = false;
@@ -968,6 +967,14 @@ static bool _rxk_5g_group_sel(struct rtw89_dev *rtwdev, iqk_info->is_wb_txiqk[path] = true; } +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_RXA2 ,0x20 , val); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWE ,RFREG_MASK ,0x1000 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWA ,RFREG_MASK ,0x4 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWD0 ,RFREG_MASK ,0x37 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWA ,RFREG_MASK ,0x5 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWD0 ,RFREG_MASK ,0x27 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWE ,RFREG_MASK ,0x0 ); +rtw89_debug (rtwdev,RTW89_DBG_RFK ,"[IQK]S%x, kfail = 0x%x, 0x8%x3c = 0x%x\n" , path, kfail,1 << path, iqk_info->nb_rxcfir[path]);
@@ -980,17 +987,26 @@ static bool _iqk_5g_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;bool kfail = false;bool notready; -u8 idx =0x1 ; +u8 gp =2 ;u32 rf_0; -u8 gp; - - gp =_rxk_5ghz_group_from_idx (idx); +u32 val;rtw89_debug (rtwdev,RTW89_DBG_RFK ,"[IQK]===>%s\n" , __func__);rtw89_debug (rtwdev,RTW89_DBG_RFK ,"[IQK]S%x, gp = %x\n" , path, gp); -rtw89_write_rf (rtwdev,RF_PATH_A ,RR_MOD ,RR_MOD_RGM , a_idxrxgain[idx]); -rtw89_write_rf (rtwdev,RF_PATH_A ,RR_RXA2 ,RR_RXA2_ATT , a_idxattc2[idx]); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWE ,RFREG_MASK ,0x1000 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWA ,RFREG_MASK ,0x4 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWD0 ,RFREG_MASK ,0x17 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWA ,RFREG_MASK ,0x5 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWD0 ,RFREG_MASK ,0x27 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWE ,RFREG_MASK ,0x0 ); + + val =rtw89_read_rf (rtwdev,RF_PATH_A ,RR_RXA2 ,0x20 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_MOD ,RR_MOD_MASK ,0xc ); + +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_MOD ,RR_MOD_RGM , a_idxrxgain[gp]); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_RXA2 ,RR_RXA2_ATT , a_idxattc2[gp]); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_RXA2 ,0x20 ,0x1 );rtw89_phy_write32_mask (rtwdev,R_CFIR_LUT ,B_CFIR_LUT_SEL ,0x1 );rtw89_phy_write32_mask (rtwdev,R_CFIR_LUT ,B_CFIR_LUT_G3 ,0x0 );
@@ -1000,7 +1016,7 @@ static bool _iqk_5g_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,fsleep (100 ); rf_0 =rtw89_read_rf (rtwdev, path,RR_MOD ,RFREG_MASK );rtw89_phy_write32_mask (rtwdev,R_IQK_DIF2 ,B_IQK_DIF2_RXPI , rf_0); -rtw89_phy_write32_mask (rtwdev,R_IQK_RXA ,B_IQK_RXAGC , a_idxrxagc[idx]); +rtw89_phy_write32_mask (rtwdev,R_IQK_RXA ,B_IQK_RXAGC , a_idxrxagc[gp]);rtw89_phy_write32_mask (rtwdev,R_IQK_DIF4 ,B_IQK_DIF4_RXT ,0x11 ); notready =_iqk_one_shot (rtwdev, phy_idx, path,ID_RXAGC );
@@ -1026,6 +1042,7 @@ static bool _iqk_5g_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, kfail = !!rtw89_phy_read32_mask (rtwdev,R_NCTL_RPT ,B_NCTL_RPT_FLG );if (kfail) { +rtw89_phy_write32_mask (rtwdev,R_IQK_RES + (path <<8 ),0xf ,0x0 );rtw89_phy_write32_mask (rtwdev,R_RXIQC + (path <<8 ),MASKDWORD ,0x40000002 ); iqk_info->is_wb_rxiqk[path] = false;
@@ -1033,6 +1050,14 @@ static bool _iqk_5g_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, iqk_info->is_wb_rxiqk[path] = false; } +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_RXA2 ,0x20 , val); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWE ,RFREG_MASK ,0x1000 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWA ,RFREG_MASK ,0x4 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWD0 ,RFREG_MASK ,0x37 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWA ,RFREG_MASK ,0x5 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWD0 ,RFREG_MASK ,0x27 ); +rtw89_write_rf (rtwdev,RF_PATH_A ,RR_LUTWE ,RFREG_MASK ,0x0 ); +rtw89_debug (rtwdev,RTW89_DBG_RFK ,"[IQK]S%x, kfail = 0x%x, 0x8%x3c = 0x%x\n" , path, kfail,1 << path, iqk_info->nb_rxcfir[path]);
@@ -1664,8 +1689,6 @@ static void _iqk_init(struct rtw89_dev *rtwdev)struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;u8 idx, path; -rtw89_phy_write32_mask (rtwdev,R_IQKINF ,MASKDWORD ,0x0 ); -if (iqk_info->is_iqk_init)return ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 330/849 dm error: mark as DM_TARGET_PASSES_INTEGRITY
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
[ Upstream commit 499cbe0f2fb0641cf07a1a8ac9f7317674295fea ]
Mark dm error as DM_TARGET_PASSES_INTEGRITY so that it can be stacked on top of PI capable devices. The claim is strictly speaking as lie as dm error fails all I/O and doesn't pass anything on, but doing the same for integrity I/O work just fine :)
This helps to make about two dozen xfstests test cases pass on PI capable devices.
--- drivers/md/dm-target.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/md/dm-target.c +2 -1
@@ -263,7 +263,8 @@ static long io_err_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,static struct target_type error_target = { .name ="error" , .version = {1 ,7 ,0 }, - .features =DM_TARGET_WILDCARD |DM_TARGET_ZONED_HM , + .features =DM_TARGET_WILDCARD |DM_TARGET_ZONED_HM | +DM_TARGET_PASSES_INTEGRITY , .ctr = io_err_ctr, .dtr = io_err_dtr, .map = io_err_map,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 331/849 char: misc: Make misc_register() reentry for miscdevice who wants dynamic minor
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijun Hu <[email protected]>
[ Upstream commit 52e2bb5ff089d65e2c7d982fe2826dc88e473d50 ]
For miscdevice who wants dynamic minor, it may fail to be registered again without reinitialization after being de-registered, which is illustrated by kunit test case miscdev_test_dynamic_reentry() newly added.
There is a real case found by cascardo when a part of minor range were contained by range [0, 255):
1) wmi/dell-smbios registered minor 122, and acpi_thermal_rel registered minor 123
2) unbind "int3400 thermal" driver from its device, this will de-register acpi_thermal_rel
3) rmmod then insmod dell_smbios again, now wmi/dell-smbios is using minor 123
4) bind the device to "int3400 thermal" driver again, acpi_thermal_rel fails to register.
Some drivers may reuse the miscdevice structure after they are deregistered If the intention is to allocate a dynamic minor, if the minor number is not reset to MISC_DYNAMIC_MINOR before calling misc_register(), it will try to register a previously dynamically allocated minor number, which may have been registered by a different driver.
One such case is the acpi_thermal_rel misc device, registered by the int3400 thermal driver. If the device is unbound from the driver and later bound, if there was another dynamic misc device registered in between, it would fail to register the acpi_thermal_rel misc device. Other drivers behave similarly.
Actually, this kind of issue is prone to happen if APIs misc_register()/misc_deregister() are invoked by driver's probe()/remove() separately.
Instead of fixing all the drivers, just reset the minor member to MISC_DYNAMIC_MINOR in misc_deregister() in case it was a dynamically allocated minor number, as error handling of misc_register() does.
--- drivers/char/misc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/char/misc.c +2 -0
@@ -282,6 +282,8 @@ void misc_deregister(struct miscdevice *misc)list_del (&misc->list);device_destroy (&misc_class,MKDEV (MISC_MAJOR , misc->minor));misc_minor_free (misc->minor); +if (misc->minor >MISC_DYNAMIC_MINOR ) + misc->minor =MISC_DYNAMIC_MINOR ;mutex_unlock (&misc_mtx); }EXPORT_SYMBOL (misc_deregister);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 332/849 char: misc: Does not request module for miscdevice with dynamic minor
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijun Hu <[email protected]>
[ Upstream commit 1ba0fb42aa6a5f072b1b8c0b0520b32ad4ef4b45 ]
misc_open() may request module for miscdevice with dynamic minor, which is meaningless since:
- The dynamic minor allocated is unknown in advance without registering miscdevice firstly.
- Macro MODULE_ALIAS_MISCDEV() is not applicable for dynamic minor.
Fix by only requesting module for miscdevice with fixed minor.
--- drivers/char/misc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/char/misc.c +5 -3
@@ -132,7 +132,8 @@ static int misc_open(struct inode *inode, struct file *file)break ; } -if (!new_fops) { +/* Only request module for fixed minor code */ +if (!new_fops && minor <MISC_DYNAMIC_MINOR ) {mutex_unlock (&misc_mtx);request_module ("char-major-%d-%d" ,MISC_MAJOR , minor);mutex_lock (&misc_mtx);
@@ -144,10 +145,11 @@ static int misc_open(struct inode *inode, struct file *file) new_fops =fops_get (iter->fops);break ; } -if (!new_fops) - goto fail; } +if (!new_fops) + goto fail; +/* * Place the miscdevice in the file's * private_data so it can be used by the
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 333/849 net: When removing nexthops, dont call synchronize_net if it is not necessary
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Paasch <[email protected]>
[ Upstream commit b0ac6d3b56a2384db151696cfda2836a8a961b6d ]
When removing a nexthop, commit90f33bffa382 ("nexthops: don't modify published nexthop groups") added a call to synchronize_rcu() (later changed to _net()) to make sure everyone sees the new nexthop-group before the rtnl-lock is released.
When one wants to delete a large number of groups and nexthops, it is fastest to first flush the groups (ip nexthop flush groups) and then flush the nexthops themselves (ip -6 nexthop flush). As that way the groups don't need to be rebalanced.
However, ip -6 nexthop flush will still take a long time if there is a very large number of nexthops because of the call to synchronize_net(). Now, if there are no more groups, there is no point in calling synchronize_net(). So, let's skip that entirely by checking if nh->grp_list is empty.
This gives us a nice speedup:
BEFORE:
=======
$ time sudo ip -6 nexthop flush Dump was interrupted and may be inconsistent. Flushed 2097152 nexthops
real 1m45.345s
user 0m0.001s
sys 0m0.005s
$ time sudo ip -6 nexthop flush Dump was interrupted and may be inconsistent. Flushed 4194304 nexthops
real 3m10.430s
user 0m0.002s
sys 0m0.004s
AFTER:
======
$ time sudo ip -6 nexthop flush Dump was interrupted and may be inconsistent. Flushed 2097152 nexthops
real 0m17.545s
user 0m0.003s
sys 0m0.003s
$ time sudo ip -6 nexthop flush Dump was interrupted and may be inconsistent. Flushed 4194304 nexthops
real 0m35.823s
user 0m0.002s
sys 0m0.004s
--- net/ipv4/nexthop.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/ipv4/nexthop.c +6 -0
@@ -2087,6 +2087,12 @@ static void remove_nexthop_from_groups(struct net *net, struct nexthop *nh, {struct nh_grp_entry *nhge, *tmp; +/* If there is nothing to do, let's avoid the costly call to +* synchronize_net() +*/ +if (list_empty (&nh->grp_list)) +return ; +list_for_each_entry_safe (nhge, tmp, &nh->grp_list, nh_list)remove_nh_grp_entry (net, nhge, nlinfo);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 334/849 net: stmmac: Correctly handle Rx checksum offload errors
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
[ Upstream commit ee0aace5f844ef59335148875d05bec8764e71e8 ]
The stmmac_rx function would previously set skb->ip_summed to CHECKSUM_UNNECESSARY if hardware checksum offload (CoE) was enabled and the packet was of a known IP ethertype.
However, this logic failed to check if the hardware had actually reported a checksum error. The hardware status, indicating a header or payload checksum failure, was being ignored at this stage. This could cause corrupt packets to be passed up the network stack as valid.
This patch corrects the logic by checking the csum_none status flag, which is set when the hardware reports a checksum error. If this flag is set, skb->ip_summed is now correctly set to CHECKSUM_NONE, ensuring the kernel's network stack will perform its own validation and properly handle the corrupt packet.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +2 -1
@@ -5735,7 +5735,8 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) skb->protocol =eth_type_trans (skb, priv->dev); -if (unlikely (!coe) || !stmmac_has_ip_ethertype (skb)) +if (unlikely (!coe) || !stmmac_has_ip_ethertype (skb) || + (status & csum_none))skb_checksum_none_assert (skb);else skb->ip_summed =CHECKSUM_UNNECESSARY ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 335/849 net: Call trace_sock_exceed_buf_limit() for memcg failure with SK_MEM_RECV.
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 9d85c565a7b7c78b732393c02bcaa4d5c275fe58 ]
Initially, trace_sock_exceed_buf_limit() was invoked when __sk_mem_raise_allocated() failed due to the memcg limit or the global limit.
However, commit d6f19938eb031 ("net: expose sk wmem in sock_exceed_buf_limit tracepoint") somehow suppressed the event only when memcg failed to charge for SK_MEM_RECV, although the memcg failure for SK_MEM_SEND still triggers the event.
Let's restore the event for SK_MEM_RECV.
--- net/core/sock.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
net/core/sock.c +1 -2
@@ -3336,8 +3336,7 @@ int __sk_mem_raise_allocated(struct sock *sk, int size, int amt, int kind) } } -if (kind ==SK_MEM_SEND || (kind ==SK_MEM_RECV && charged)) -trace_sock_exceed_buf_limit (sk, prot, allocated, kind); +trace_sock_exceed_buf_limit (sk, prot, allocated, kind);sk_memory_allocated_sub (sk, amt);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 336/849 dmaengine: idxd: Add a new IAA device ID for Wildcat Lake family platforms
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anil S Keshavamurthy <[email protected]>
[ Upstream commit c937969a503ebf45e0bebafee4122db22b0091bd ]
A new IAA device ID, 0xfd2d, is introduced across all Wildcat Lake family platforms. Add the device ID to the IDXD driver.
--- drivers/dma/idxd/init.c | 2 ++ drivers/dma/idxd/registers.h | 1 + 2 files changed, 3 insertions(+)
drivers/dma/idxd/init.c +2 -0
@@ -80,6 +80,8 @@ static struct pci_device_id idxd_pci_tbl[] = { { PCI_DEVICE_DATA(INTEL, IAA_DMR, &idxd_driver_data[IDXD_TYPE_IAX]) },/* IAA PTL platforms */ { PCI_DEVICE_DATA(INTEL, IAA_PTL, &idxd_driver_data[IDXD_TYPE_IAX]) }, +/* IAA WCL platforms */ + { PCI_DEVICE_DATA(INTEL, IAA_WCL, &idxd_driver_data[IDXD_TYPE_IAX]) }, { 0, } };MODULE_DEVICE_TABLE (pci, idxd_pci_tbl);
drivers/dma/idxd/registers.h +1 -0
@@ -10,6 +10,7 @@#define PCI_DEVICE_ID_INTEL_DSA_DMR 0x1212#define PCI_DEVICE_ID_INTEL_IAA_DMR 0x1216#define PCI_DEVICE_ID_INTEL_IAA_PTL 0xb02d +#define PCI_DEVICE_ID_INTEL_IAA_WCL 0xfd2d#define DEVICE_VERSION_1 0x100#define DEVICE_VERSION_2 0x200
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 337/849 f2fs: fix to detect potential corrupted nid in free_nid_list
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 8fc6056dcf79937c46c97fa4996cda65956437a9 ]
As reported, on-disk footer.ino and footer.nid is the same and out-of-range, let's add sanity check on f2fs_alloc_nid() to detect any potential corruption in free_nid_list.
--- fs/f2fs/node.c | 17 ++++++++++++++++- include/linux/f2fs_fs.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-)
fs/f2fs/node.c +16 -1
@@ -27,12 +27,17 @@ static struct kmem_cache *free_nid_slab;static struct kmem_cache *nat_entry_set_slab;static struct kmem_cache *fsync_node_entry_slab; +static inline bool is_invalid_nid (struct f2fs_sb_info *sbi,nid_t nid) +{ +return nid <F2FS_ROOT_INO (sbi) || nid >=NM_I (sbi)->max_nid; +} +/* * Check whether the given nid is within node id range. */ int f2fs_check_nid_range (struct f2fs_sb_info *sbi,nid_t nid) { -if (unlikely (nid <F2FS_ROOT_INO (sbi) || nid >=NM_I (sbi)->max_nid)) { +if (unlikely (is_invalid_nid (sbi, nid))) {set_sbi_flag (sbi,SBI_NEED_FSCK );f2fs_warn (sbi,"%s: out-of-range nid=%x, run fsck to fix." , __func__, nid);
@@ -2654,6 +2659,16 @@ bool f2fs_alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid)f2fs_bug_on (sbi,list_empty (&nm_i->free_nid_list)); i =list_first_entry (&nm_i->free_nid_list, struct free_nid, list); + +if (unlikely (is_invalid_nid (sbi, i->nid))) { +spin_unlock (&nm_i->nid_list_lock); +f2fs_err (sbi,"Corrupted nid %u in free_nid_list" , + i->nid); +f2fs_stop_checkpoint (sbi, false, +STOP_CP_REASON_CORRUPTED_NID ); +return false; + } + *nid = i->nid;__move_free_nid (sbi, i,FREE_NID ,PREALLOC_NID );
include/linux/f2fs_fs.h +1 -0
@@ -79,6 +79,7 @@ enum stop_cp_reason {STOP_CP_REASON_FLUSH_FAIL ,STOP_CP_REASON_NO_SEGMENT ,STOP_CP_REASON_CORRUPTED_FREE_BITMAP , +STOP_CP_REASON_CORRUPTED_NID , STOP_CP_REASON_MAX, };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 338/849 PCI/P2PDMA: Fix incorrect pointer usage in devm_kfree() call
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sungho Kim <[email protected]>
[ Upstream commit 6238784e502b6a9fbeb3a6b77284b29baa4135cc ]
The error handling path in pci_p2pdma_add_resource() contains a bug in its pgmap_free label.
Memory is allocated for the p2p_pgmap struct, and the pointer is stored in p2p_pgmap. However, the error path calls devm_kfree() with pgmap, which is a pointer to a member field within the p2p_pgmap struct, not the base pointer of the allocation.
Correct the bug by passing the correct base pointer, p2p_pgmap, to devm_kfree().
--- drivers/pci/p2pdma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/p2pdma.c +1 -1
@@ -360,7 +360,7 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, pages_free:devm_memunmap_pages (&pdev->dev, pgmap); pgmap_free: -devm_kfree (&pdev->dev, pgmap); +devm_kfree (&pdev->dev, p2p_pgmap);return error; }EXPORT_SYMBOL_GPL (pci_p2pdma_add_resource);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 339/849 bnxt_en: Add Hyper-V VF ID
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pavan Chebbi <[email protected]>
[ Upstream commit 5be7cb805bd9a6680b863a1477dbc6e7986cc223 ]
VFs of the P7 chip family created by Hyper-V will have the device ID of 0x181b.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 ++++- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +4 -1
@@ -142,6 +142,7 @@ static const struct { [NETXTREME_E_P5_VF] = { "Broadcom BCM5750X NetXtreme-E Ethernet Virtual Function" }, [NETXTREME_E_P5_VF_HV] = { "Broadcom BCM5750X NetXtreme-E Virtual Function for Hyper-V" }, [NETXTREME_E_P7_VF] = { "Broadcom BCM5760X Virtual Function" }, + [NETXTREME_E_P7_VF_HV] = { "Broadcom BCM5760X Virtual Function for Hyper-V" }, };static const struct pci_device_id bnxt_pci_tbl[] = {
@@ -217,6 +218,7 @@ static const struct pci_device_id bnxt_pci_tbl[] = { { PCI_VDEVICE(BROADCOM, 0x1808), .driver_data = NETXTREME_E_P5_VF_HV }, { PCI_VDEVICE(BROADCOM, 0x1809), .driver_data = NETXTREME_E_P5_VF_HV }, { PCI_VDEVICE(BROADCOM, 0x1819), .driver_data = NETXTREME_E_P7_VF }, + { PCI_VDEVICE(BROADCOM, 0x181b), .driver_data = NETXTREME_E_P7_VF_HV }, { PCI_VDEVICE(BROADCOM, 0xd800), .driver_data = NETXTREME_S_VF }, #endif { 0 }
@@ -315,7 +317,8 @@ static bool bnxt_vf_pciid(enum board_idx idx)return (idx ==NETXTREME_C_VF || idx ==NETXTREME_E_VF || idx ==NETXTREME_S_VF || idx ==NETXTREME_C_VF_HV || idx ==NETXTREME_E_VF_HV || idx ==NETXTREME_E_P5_VF || - idx ==NETXTREME_E_P5_VF_HV || idx ==NETXTREME_E_P7_VF ); + idx ==NETXTREME_E_P5_VF_HV || idx ==NETXTREME_E_P7_VF || + idx ==NETXTREME_E_P7_VF_HV ); }#define DB_CP_REARM_FLAGS (DB_KEY_CP | DB_IDX_VALID)
drivers/net/ethernet/broadcom/bnxt/bnxt.h +1 -0
@@ -2130,6 +2130,7 @@ enum board_idx {NETXTREME_E_P5_VF ,NETXTREME_E_P5_VF_HV ,NETXTREME_E_P7_VF , + NETXTREME_E_P7_VF_HV, };#define BNXT_TRACE_BUF_MAGIC_BYTE ((u8)0xbc)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 340/849 tty: serial: Modify the use of dev_err_probe()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xichao Zhao <[email protected]>
[ Upstream commit 706c3c02eecd41dc675e9102b3719661cd3e30e2 ]
The dev_err_probe() doesn't do anything when error is '-ENOMEM'. Make the following two changes:
(1) Replace -ENOMEM with -ENOSPC in max3100_probe().
(2) Just return -ENOMEM instead in max310x_probe().
--- drivers/tty/serial/max3100.c | 2 +- drivers/tty/serial/max310x.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-)
drivers/tty/serial/max3100.c +1 -1
@@ -705,7 +705,7 @@ static int max3100_probe(struct spi_device *spi)break ;if (i ==MAX_MAX3100 ) {mutex_unlock (&max3100s_lock); -return dev_err_probe (dev, -ENOMEM ,"too many MAX3100 chips\n" ); +return dev_err_probe (dev, -ENOSPC ,"too many MAX3100 chips\n" ); } max3100s[i] =kzalloc (sizeof (struct max3100_port ),GFP_KERNEL );
drivers/tty/serial/max310x.c +1 -2
@@ -1269,8 +1269,7 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty/* Alloc port structure */ s =devm_kzalloc (dev,struct_size (s, p, devtype->nr),GFP_KERNEL );if (!s) -return dev_err_probe (dev, -ENOMEM , -"Error allocating port structure\n" ); +return -ENOMEM ;/* Always ask for fixed clock rate from a property. */ device_property_read_u32 (dev,"clock-frequency" , &uartclk);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 341/849 ALSA: usb-audio: Add validation of UAC2/UAC3 effect units
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 2aec0b6a6b5395bca7d6fde9c7e9dc391d329698 ]
Just add fixed struct size validations for UAC2 and UAC3 effect units. The descriptor has a variable-length array, so it should be validated with a proper function later once when the unit is really parsed and used by the driver (currently only referred partially for the input terminal parsing).
--- sound/usb/validate.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
sound/usb/validate.c +7 -2
@@ -266,7 +266,11 @@ static const struct usb_desc_validator audio_validators[] = {FUNC (UAC_VERSION_2 ,UAC_MIXER_UNIT , validate_mixer_unit),FUNC (UAC_VERSION_2 ,UAC_SELECTOR_UNIT , validate_selector_unit),FUNC (UAC_VERSION_2 ,UAC_FEATURE_UNIT , validate_uac2_feature_unit), -/* UAC_VERSION_2, UAC2_EFFECT_UNIT: not implemented yet */ +/* just a stop-gap, it should be a proper function for the array +* once if the unit is really parsed/used +*/ +FIXED (UAC_VERSION_2 ,UAC2_EFFECT_UNIT , + struct uac2_effect_unit_descriptor),FUNC (UAC_VERSION_2 ,UAC2_PROCESSING_UNIT_V2 , validate_processing_unit),FUNC (UAC_VERSION_2 ,UAC2_EXTENSION_UNIT_V2 , validate_processing_unit), FIXED(UAC_VERSION_2, UAC2_CLOCK_SOURCE,
@@ -286,7 +290,8 @@ static const struct usb_desc_validator audio_validators[] = {FUNC (UAC_VERSION_3 ,UAC3_MIXER_UNIT , validate_mixer_unit),FUNC (UAC_VERSION_3 ,UAC3_SELECTOR_UNIT , validate_selector_unit),FUNC (UAC_VERSION_3 ,UAC3_FEATURE_UNIT , validate_uac3_feature_unit), -/* UAC_VERSION_3, UAC3_EFFECT_UNIT: not implemented yet */ +FIXED (UAC_VERSION_3 ,UAC3_EFFECT_UNIT , + struct uac2_effect_unit_descriptor), /* sharing the same struct */FUNC (UAC_VERSION_3 ,UAC3_PROCESSING_UNIT , validate_processing_unit),FUNC (UAC_VERSION_3 ,UAC3_EXTENSION_UNIT , validate_processing_unit), FIXED(UAC_VERSION_3, UAC3_CLOCK_SOURCE,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 342/849 Octeontx2-af: Broadcast XON on all channels
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hariprasad Kelam <[email protected]>
[ Upstream commit a7bd72158063740212344fad5d99dcef45bc70d6 ]
The NIX block receives traffic from multiple channels, including:
MAC block (RPM)
Loopback module (LBK)
CPT block
RPM
|
-----------------
LBK --| NIX |
-----------------
|
CPTDue to a hardware errata, CN10k and earlier Octeon silicon series, the hardware may incorrectly assert XOFF on certain channels during reset. As a workaround, a write operation to the NIX_AF_RX_CHANX_CFG register can be performed to broadcast XON signals on the affected channels
--- drivers/net/ethernet/marvell/octeontx2/af/rvu.c | 3 +++ drivers/net/ethernet/marvell/octeontx2/af/rvu.h | 1 + .../net/ethernet/marvell/octeontx2/af/rvu_nix.c | 16 ++++++++++++++++ 3 files changed, 20 insertions(+)
drivers/net/ethernet/marvell/octeontx2/af/rvu.c +3 -0
@@ -1164,6 +1164,9 @@ static int rvu_setup_hw_resources(struct rvu *rvu)rvu_program_channels (rvu);cgx_start_linkup (rvu); +rvu_block_bcast_xon (rvu,BLKADDR_NIX0 ); +rvu_block_bcast_xon (rvu,BLKADDR_NIX1 ); + err =rvu_mcs_init (rvu);if (err) {dev_err (rvu->dev,"%s: Failed to initialize mcs\n" , __func__);
drivers/net/ethernet/marvell/octeontx2/af/rvu.h +1 -0
@@ -1031,6 +1031,7 @@ int rvu_nix_mcast_update_mcam_entry(struct rvu *rvu, u16 pcifunc,void rvu_nix_flr_free_bpids (struct rvu *rvu,u16 pcifunc);int rvu_alloc_cint_qint_mem (struct rvu *rvu,struct rvu_pfvf *pfvf,int blkaddr,int nixlf); +void rvu_block_bcast_xon (struct rvu *rvu,int blkaddr);/* NPC APIs */ void rvu_npc_freemem (struct rvu *rvu);int rvu_npc_get_pkind (struct rvu *rvu,u16 pf);
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c +16 -0
@@ -6616,3 +6616,19 @@ int rvu_mbox_handler_nix_mcast_grp_update(struct rvu *rvu,return ret; } + +/* On CN10k and older series of silicons, hardware may incorrectly +* assert XOFF on certain channels. Issue a write on NIX_AF_RX_CHANX_CFG +* to broadcacst XON on the same. +*/ +void rvu_block_bcast_xon (struct rvu *rvu,int blkaddr) +{ +struct rvu_block *block = &rvu->hw->block[blkaddr]; +u64 cfg; + +if (!block->implemented ||is_cn20k (rvu->pdev)) +return ; + + cfg =rvu_read64 (rvu, blkaddr,NIX_AF_RX_CHANX_CFG (0 )); +rvu_write64 (rvu, blkaddr,NIX_AF_RX_CHANX_CFG (0 ), cfg); +}
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 343/849 idpf: do not linearize big TSO packets
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 02614eee26fbdfd73b944769001cefeff6ed008c ]
idpf has a limit on number of scatter-gather frags that can be used per segment.
Currently, idpf_tx_start() checks if the limit is hit and forces a linearization of the whole packet.
This requires high order allocations that can fail under memory pressure. A full size BIG-TCP packet would require order-7 alocation on x86_64 :/
We can move the check earlier from idpf_features_check() for TSO packets, to force GSO in this case, removing the cost of a big copy.
This means that a linearization will eventually happen with sizes smaller than one MSS.
__idpf_chk_linearize() is renamed to idpf_chk_tso_segment() and moved to idpf_lib.c
--- drivers/net/ethernet/intel/idpf/idpf.h | 2 + drivers/net/ethernet/intel/idpf/idpf_lib.c | 102 +++++++++++++++- drivers/net/ethernet/intel/idpf/idpf_txrx.c | 129 ++++---------------- 3 files changed, 120 insertions(+), 113 deletions(-)
drivers/net/ethernet/intel/idpf/idpf.h +2 -0
@@ -148,6 +148,7 @@ enum idpf_vport_state {* @link_speed_mbps: Link speed in mbps * @vport_idx: Relative vport index * @max_tx_hdr_size: Max header length hardware can support +* @tx_max_bufs: Max buffers that can be transmitted with scatter-gather * @state: See enum idpf_vport_state * @netstats: Packet and byte stats * @stats_lock: Lock to protect stats update
@@ -159,6 +160,7 @@ struct idpf_netdev_priv {u32 link_speed_mbps;u16 vport_idx;u16 max_tx_hdr_size; +u16 tx_max_bufs;enum idpf_vport_state state;struct rtnl_link_stats64 netstats;spinlock_t stats_lock;
drivers/net/ethernet/intel/idpf/idpf_lib.c +96 -6
120 lines not on this page · raw message
drivers/net/ethernet/intel/idpf/idpf_txrx.c +22 -107
141 lines not on this page · raw message
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 344/849 drm/xe/pcode: Initialize data0 for pcode read routine
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stuart Summers <[email protected]>
[ Upstream commit 2515d2b9ab4108c11a0b23935e68de27abb8b2a7 ]
There are two registers filled in when reading data from pcode besides the mailbox itself. Currently, we allow a NULL value for the second of these two (data1) and assume the first is defined. However, many of the routines that are calling this function assume that pcode will ignore the value being passed in and so leave that first value (data0) defined but uninitialized. To be safe, make sure this value is always initialized to something (0 generally) in the event pcode behavior changes and starts using this value.
v2: Fix sob/author
--- drivers/gpu/drm/xe/xe_device_sysfs.c | 8 ++++---- drivers/gpu/drm/xe/xe_hwmon.c | 8 ++++---- drivers/gpu/drm/xe/xe_vram_freq.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-)
drivers/gpu/drm/xe/xe_device_sysfs.c +4 -4
@@ -76,7 +76,7 @@ lb_fan_control_version_show(struct device *dev, struct device_attribute *attr, c {struct xe_device *xe =pdev_to_xe_device (to_pci_dev (dev));struct xe_tile *root =xe_device_get_root_tile (xe); -u32 cap, ver_low =FAN_TABLE , ver_high =FAN_TABLE ; +u32 cap =0 , ver_low =FAN_TABLE , ver_high =FAN_TABLE ;u16 major =0 , minor =0 , hotfix =0 , build =0 ;int ret;
@@ -115,7 +115,7 @@ lb_voltage_regulator_version_show(struct device *dev, struct device_attribute *a {struct xe_device *xe =pdev_to_xe_device (to_pci_dev (dev));struct xe_tile *root =xe_device_get_root_tile (xe); -u32 cap, ver_low =VR_CONFIG , ver_high =VR_CONFIG ; +u32 cap =0 , ver_low =VR_CONFIG , ver_high =VR_CONFIG ;u16 major =0 , minor =0 , hotfix =0 , build =0 ;int ret;
@@ -153,7 +153,7 @@ static int late_bind_create_files(struct device *dev) {struct xe_device *xe =pdev_to_xe_device (to_pci_dev (dev));struct xe_tile *root =xe_device_get_root_tile (xe); -u32 cap; +u32 cap =0 ;int ret;xe_pm_runtime_get (xe);
@@ -186,7 +186,7 @@ static void late_bind_remove_files(struct device *dev) {struct xe_device *xe =pdev_to_xe_device (to_pci_dev (dev));struct xe_tile *root =xe_device_get_root_tile (xe); -u32 cap; +u32 cap =0 ;int ret;xe_pm_runtime_get (xe);
drivers/gpu/drm/xe/xe_hwmon.c +4 -4
@@ -179,7 +179,7 @@ static int xe_hwmon_pcode_rmw_power_limit(const struct xe_hwmon *hwmon, u32 attr u32 clr, u32 set) {struct xe_tile *root_tile =xe_device_get_root_tile (hwmon->xe); -u32 val0, val1; +u32 val0 =0 , val1 =0 ;int ret =0 ; ret = xe_pcode_read(root_tile, PCODE_MBOX(PCODE_POWER_SETUP,
@@ -737,7 +737,7 @@ static int xe_hwmon_power_curr_crit_read(struct xe_hwmon *hwmon, int channel, long *value, u32 scale_factor) {int ret; -u32 uval; +u32 uval =0 ;mutex_lock (&hwmon->hwmon_lock);
@@ -921,7 +921,7 @@ xe_hwmon_power_write(struct xe_hwmon *hwmon, u32 attr, int channel, long val)static umode_t xe_hwmon_curr_is_visible (const struct xe_hwmon *hwmon,u32 attr,int channel) { -u32 uval; +u32 uval =0 ;/* hwmon sysfs attribute of current available only for package */ if (channel !=CHANNEL_PKG )
@@ -1023,7 +1023,7 @@ xe_hwmon_energy_read(struct xe_hwmon *hwmon, u32 attr, int channel, long *val)static umode_t xe_hwmon_fan_is_visible (struct xe_hwmon *hwmon,u32 attr,int channel) { -u32 uval; +u32 uval =0 ;if (!hwmon->xe->info.has_fan_control)return 0 ;
drivers/gpu/drm/xe/xe_vram_freq.c +2 -2
@@ -34,7 +34,7 @@ static ssize_t max_freq_show(struct device *dev, struct device_attribute *attr, char *buf) {struct xe_tile *tile =dev_to_tile (dev); -u32 val, mbox; +u32 val =0 , mbox;int err; mbox =REG_FIELD_PREP (PCODE_MB_COMMAND ,PCODE_FREQUENCY_CONFIG )
@@ -56,7 +56,7 @@ static ssize_t min_freq_show(struct device *dev, struct device_attribute *attr, char *buf) {struct xe_tile *tile =dev_to_tile (dev); -u32 val, mbox; +u32 val =0 , mbox;int err; mbox =REG_FIELD_PREP (PCODE_MB_COMMAND ,PCODE_FREQUENCY_CONFIG )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 345/849 drm/panel: ilitek-ili9881c: turn off power-supply when init fails
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Stuebner <[email protected]>
[ Upstream commit 6c66eba502709a78281333187c1add7b71f7201f ]
The prepare function turns on the power-supply regulator first, when preparing the display. But in an error case, just returns the error code, but does not power off the regulator again, fix that.
--- drivers/gpu/drm/panel/panel-ilitek-ili9881c.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/gpu/drm/panel/panel-ilitek-ili9881c.c +8 -4
@@ -1486,7 +1486,7 @@ static int ili9881c_prepare(struct drm_panel *panel) instr->arg.cmd.data);if (ret) -return ret; + goto disable_power; } ret =ili9881c_switch_page (ctx,0 );
@@ -1498,18 +1498,22 @@ static int ili9881c_prepare(struct drm_panel *panel) &ctx->address_mode, sizeof(ctx->address_mode));if (ret <0 ) -return ret; + goto disable_power; } ret =mipi_dsi_dcs_set_tear_on (ctx->dsi,MIPI_DSI_DCS_TEAR_MODE_VBLANK );if (ret) -return ret; + goto disable_power; ret =mipi_dsi_dcs_exit_sleep_mode (ctx->dsi);if (ret) -return ret; + goto disable_power;return 0 ; + +disable_power: +regulator_disable (ctx->power); +return ret; }static int ili9881c_enable (struct drm_panel *panel)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 346/849 drm/panel: ilitek-ili9881c: move display_on/_off dcs calls to (un-)prepare
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Stuebner <[email protected]>
[ Upstream commit 5efa82492066fcb32308210fb3f0b752af74334f ]
At least for panel-bridges, the atomic_enable call is defined as being called right after the preceding element in the display pipe is enabled.
It is also stated that "The bridge can assume that the display pipe (i.e. clocks and timing signals) feeding it is running when this callback is called"
This means the DSI controller driving this display would have already switched over to video-mode from command mode and thus dcs functions should not be called anymore at this point.
This caused a non-working display for me, when trying to enable the rk3576 dsi controller using a display using this controller.
Therefore move the display_on/off calls the more appropriate prepare/unprepare callbacks.
--- drivers/gpu/drm/panel/panel-ilitek-ili9881c.c | 27 +++++-------------- 1 file changed, 7 insertions(+), 20 deletions(-)
drivers/gpu/drm/panel/panel-ilitek-ili9881c.c +7 -20
@@ -1509,35 +1509,24 @@ static int ili9881c_prepare(struct drm_panel *panel)if (ret) goto disable_power; -return 0 ; - -disable_power: -regulator_disable (ctx->power); -return ret; -} - -static int ili9881c_enable (struct drm_panel *panel) -{ -struct ili9881c *ctx =panel_to_ili9881c (panel); -msleep (120 ); -mipi_dsi_dcs_set_display_on (ctx->dsi); + ret =mipi_dsi_dcs_set_display_on (ctx->dsi); +if (ret) + goto disable_power;return 0 ; -} -static int ili9881c_disable (struct drm_panel *panel) -{ -struct ili9881c *ctx =panel_to_ili9881c (panel); - -return mipi_dsi_dcs_set_display_off (ctx->dsi); +disable_power: +regulator_disable (ctx->power); +return ret; }static int ili9881c_unprepare (struct drm_panel *panel) {struct ili9881c *ctx =panel_to_ili9881c (panel); +mipi_dsi_dcs_set_display_off (ctx->dsi);mipi_dsi_dcs_enter_sleep_mode (ctx->dsi);regulator_disable (ctx->power);gpiod_set_value_cansleep (ctx->reset,1 );
@@ -1710,8 +1699,6 @@ static enum drm_panel_orientation ili9881c_get_orientation(struct drm_panel *panstatic const struct drm_panel_funcs ili9881c_funcs = { .prepare = ili9881c_prepare, .unprepare = ili9881c_unprepare, - .enable = ili9881c_enable, - .disable = ili9881c_disable, .get_modes = ili9881c_get_modes, .get_orientation = ili9881c_get_orientation, };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 347/849 rds: Fix endianness annotation for RDS_MPATH_HASH
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ujwal Kundur <[email protected]>
[ Upstream commit 77907a068717fbefb25faf01fecca553aca6ccaa ]
jhash_1word accepts host endian inputs while rs_bound_port is a be16 value (sockaddr_in6.sin6_port). Use ntohs() for consistency.
Flagged by Sparse.
--- net/rds/rds.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/rds/rds.h +1 -1
@@ -93,7 +93,7 @@ enum {/* Max number of multipaths per RDS connection. Must be a power of 2 */ #define RDS_MPATH_WORKERS 8 -#define RDS_MPATH_HASH (rs, n) (jhash_1word((rs)->rs_bound_port, \ +#define RDS_MPATH_HASH (rs, n) (jhash_1word(ntohs((rs)->rs_bound_port), \ (rs)->rs_hash_initval) & ((n) - 1))#define IS_CANONICAL (laddr, faddr) (htonl(laddr) < htonl(faddr))
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 348/849 net: wangxun: limit tx_max_coalesced_frames_irq
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiawen Wu <[email protected]>
[ Upstream commit fd4aa243f154a80bbeb3dd311d2114eeb538f479 ]
Add limitation on tx_max_coalesced_frames_irq as 0 ~ 65535, because 'wx->tx_work_limit' is declared as a member of type u16.
--- drivers/net/ethernet/wangxun/libwx/wx_ethtool.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/wangxun/libwx/wx_ethtool.c +5 -2
@@ -334,8 +334,11 @@ int wx_set_coalesce(struct net_device *netdev,return -EOPNOTSUPP ; } -if (ec->tx_max_coalesced_frames_irq) - wx->tx_work_limit = ec->tx_max_coalesced_frames_irq; +if (ec->tx_max_coalesced_frames_irq >U16_MAX || + !ec->tx_max_coalesced_frames_irq) +return -EINVAL ; + + wx->tx_work_limit = ec->tx_max_coalesced_frames_irq;switch (wx->mac.type) {case wx_mac_sp:
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 349/849 iio: imu: bmi270: Match PNP ID found on newer GPD firmware
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cryolitia PukNgae <[email protected]>
[ Upstream commit dc757dc1572d579c2634c05d0a03c5676227c571 ]
GPD devices originally used BMI160 sensors with the "BMI0160" PNP ID. When they switched to BMI260 sensors in newer hardware, they reused the existing Windows driver which accepts both "BMI0160" and "BMI0260" IDs. Consequently, they kept "BMI0160" in DSDT tables for new BMI260 devices, causing driver mismatches in Linux.
1. GPD updated BIOS v0.40+[1] for newer devices to report "BMI0260" for BMI260 sensors to avoid loading the bmi160 driver on Linux. While this isn't Bosch's VID;
2. Bosch's official Windows driver uses "BMI0260" as a compatible ID
3. We're seeing real devices shipping with "BMI0260" in DSDT
The DSDT excerpt of GPD G1619-04 with BIOS v0.40:
Scope (_SB.I2CC)
{
Device (BMA2)
{
Name (_ADR, Zero) // _ADR: Address
Name (_HID, "BMI0260") // _HID: Hardware ID
Name (_CID, "BMI0260") // _CID: Compatible ID
Name (_DDN, "Accelerometer") // _DDN: DOS Device Name
Name (_UID, One) // _UID: Unique ID
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
Name (RBUF, ResourceTemplate ()
{
I2cSerialBusV2 (0x0069, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.I2CC",
0x00, ResourceConsumer, , Exclusive,
)
})
Return (RBUF) /* \_SB_.I2CC.BMA2._CRS.RBUF */
}
# omit some noise
}
}--- drivers/iio/imu/bmi270/bmi270_i2c.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iio/imu/bmi270/bmi270_i2c.c +2 -0
@@ -41,6 +41,8 @@ static const struct i2c_device_id bmi270_i2c_id[] = {static const struct acpi_device_id bmi270_acpi_match[] = {/* GPD Win Mini, Aya Neo AIR Pro, OXP Mini Pro, etc. */ {"BMI0160" , (kernel_ulong_t)&bmi260_chip_info }, +/* GPD Win Max 2 2023(sincice BIOS v0.40), etc. */ + {"BMI0260" , (kernel_ulong_t)&bmi260_chip_info }, { } };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 350/849 media: ipu6: isys: Set embedded data type correctly for metadata formats
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sakari Ailus <[email protected]>
[ Upstream commit f5a2826cd50c6fd1af803812d1d910a64ae8e0a1 ]
The IPU6 ISYS driver supported metadata formats but was missing correct embedded data type in the receiver configuration. Add it now.
--- drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c +6 -0
@@ -81,6 +81,12 @@ unsigned int ipu6_isys_mbus_code_to_mipi(u32 code)case MEDIA_BUS_FMT_SGRBG8_1X8 :case MEDIA_BUS_FMT_SRGGB8_1X8 :return MIPI_CSI2_DT_RAW8 ; +case MEDIA_BUS_FMT_META_8 : +case MEDIA_BUS_FMT_META_10 : +case MEDIA_BUS_FMT_META_12 : +case MEDIA_BUS_FMT_META_16 : +case MEDIA_BUS_FMT_META_24 : +return MIPI_CSI2_DT_EMBEDDED_8B ;default :/* return unavailable MIPI data type - 0x3f */ WARN_ON (1 );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 351/849 rpmsg: char: Export alias for RPMSG ID rpmsg-raw from table
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Davis <[email protected]>
[ Upstream commit 6e29c30d8ddea6109ea7e0b9f17e7841df0794ea ]
Module aliases are used by userspace to identify the correct module to load for a detected hardware. The currently supported RPMSG device IDs for this module include "rpmsg-raw", but the module alias is "rpmsg_chrdev".
Use the helper macro MODULE_DEVICE_TABLE(rpmsg) to export the correct supported IDs. And while here, to keep backwards compatibility we also add the other ID "rpmsg_chrdev" so that it is also still exported as an alias.
This has the side benefit of adding support for some legacy firmware which still uses the original "rpmsg_chrdev" ID. This was the ID used for this driver before it was upstreamed (as reflected by the module alias).
--- drivers/rpmsg/rpmsg_char.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/rpmsg/rpmsg_char.c +2 -1
@@ -522,8 +522,10 @@ static void rpmsg_chrdev_remove(struct rpmsg_device *rpdev)static struct rpmsg_device_id rpmsg_chrdev_id_table[] = { { .name ="rpmsg-raw" }, + { .name ="rpmsg_chrdev" }, { }, }; +MODULE_DEVICE_TABLE (rpmsg, rpmsg_chrdev_id_table);static struct rpmsg_driver rpmsg_chrdev_driver = { .probe = rpmsg_chrdev_probe,
@@ -565,6 +567,5 @@ static void rpmsg_chrdev_exit(void) }module_exit (rpmsg_chrdev_exit); -MODULE_ALIAS ("rpmsg:rpmsg_chrdev" );MODULE_DESCRIPTION ("RPMSG device interface" );MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 352/849 net: ipv4: allow directed broadcast routes to use dst hint
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oscar Maes <[email protected]>
[ Upstream commit 1b8c5fa0cb35efd08f07f700e6d78a541ebabe26 ]
Currently, ip_extract_route_hint uses RTN_BROADCAST to decide whether to use the route dst hint mechanism.
This check is too strict, as it prevents directed broadcast routes from using the hint, resulting in poor performance during bursts of directed broadcast traffic.
Fix this in ip_extract_route_hint and modify ip_route_use_hint to preserve the intended behaviour.
--- net/ipv4/ip_input.c | 11 +++++++---- net/ipv4/route.c | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-)
net/ipv4/ip_input.c +7 -4
@@ -587,9 +587,13 @@ static void ip_sublist_rcv_finish(struct list_head *head) }static struct sk_buff *ip_extract_route_hint (const struct net *net, -struct sk_buff *skb,int rt_type) +struct sk_buff *skb) { -if (fib4_has_custom_rules (net) || rt_type ==RTN_BROADCAST || +const struct iphdr *iph =ip_hdr (skb); + +if (fib4_has_custom_rules (net) || +ipv4_is_lbcast (iph->daddr) || +ipv4_is_zeronet (iph->daddr) ||IPCB (skb)->flags &IPSKB_MULTIPATH )return NULL ;
@@ -618,8 +622,7 @@ static void ip_list_rcv_finish(struct net *net, struct list_head *head) dst =skb_dst (skb);if (curr_dst != dst) { - hint =ip_extract_route_hint (net, skb, -dst_rtable (dst)->rt_type); + hint =ip_extract_route_hint (net, skb);/* dispatch old sublist */ if (!list_empty (&sublist))
net/ipv4/route.c +1 -1
@@ -2210,7 +2210,7 @@ ip_route_use_hint(struct sk_buff *skb, __be32 daddr, __be32 saddr, goto martian_source; } -if (rt->rt_type !=RTN_LOCAL ) +if (!(rt->rt_flags &RTCF_LOCAL )) goto skip_validate_source; reason = fib_validate_source_reason(skb, saddr, daddr, dscp, 0, dev,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 353/849 scsi: mpi3mr: Fix device loss during enclosure reboot due to zero link speed
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chandrakanth Patil <[email protected]>
[ Upstream commit d6c8e8b7c98c3cb326515ef4bc5c57e16ac5ae4e ]
During enclosure reboot or expander reset, firmware may report a link speed of 0 in "Device Add" events while the link is still coming up. The driver drops such devices, leaving them missing even after the link recovers.
Fix this by treating link speed 0 as 1.5 Gbps during device addition so the device is exposed to the OS. The actual link speed will be updated later when link-up events arrive.
--- drivers/scsi/mpi3mr/mpi3mr_os.c | 8 ++++---- drivers/scsi/mpi3mr/mpi3mr_transport.c | 11 +++++++++-- 2 files changed, 13 insertions(+), 6 deletions(-)
drivers/scsi/mpi3mr/mpi3mr_os.c +4 -4
@@ -2049,8 +2049,8 @@ static void mpi3mr_fwevt_bh(struct mpi3mr_ioc *mrioc,if (!fwevt->process_evt) goto evt_ack; -dprint_event_bh (mrioc,"processing event(0x%02x) in the bottom half handler\n" , - fwevt->event_id); +dprint_event_bh (mrioc,"processing event(0x%02x) -(0x%08x) in the bottom half handler\n" , + fwevt->event_id, fwevt->evt_ctx);switch (fwevt->event_id) {case MPI3_EVENT_DEVICE_ADDED :
@@ -3076,8 +3076,8 @@ void mpi3mr_os_handle_events(struct mpi3mr_ioc *mrioc, }if (process_evt_bh || ack_req) {dprint_event_th (mrioc, -"scheduling bottom half handler for event(0x%02x),ack_required=%d\n" , - evt_type, ack_req); +"scheduling bottom half handler for event(0x%02x) - (0x%08x), ack_required=%d\n" , + evt_type,le32_to_cpu (event_reply->event_context), ack_req); sz = event_reply->event_data_length *4 ; fwevt =mpi3mr_alloc_fwevt (sz);if (!fwevt) {
drivers/scsi/mpi3mr/mpi3mr_transport.c +9 -2
@@ -413,9 +413,11 @@ static void mpi3mr_remove_device_by_sas_address(struct mpi3mr_ioc *mrioc, sas_address, hba_port);if (tgtdev) {if (!list_empty (&tgtdev->list)) { -list_del_init (&tgtdev->list); was_on_tgtdev_list =1 ; -mpi3mr_tgtdev_put (tgtdev); +if (tgtdev->state ==MPI3MR_DEV_REMOVE_HS_STARTED ) { +list_del_init (&tgtdev->list); +mpi3mr_tgtdev_put (tgtdev); + } } }spin_unlock_irqrestore (&mrioc->tgtdev_lock, flags);
@@ -2079,6 +2081,8 @@ int mpi3mr_expander_add(struct mpi3mr_ioc *mrioc, u16 handle) link_rate = (expander_pg1.negotiated_link_rate &MPI3_SAS_NEG_LINK_RATE_LOGICAL_MASK ) >>MPI3_SAS_NEG_LINK_RATE_LOGICAL_SHIFT ; +if (link_rate <MPI3_SAS_NEG_LINK_RATE_1_5 ) + link_rate =MPI3_SAS_NEG_LINK_RATE_1_5 ;mpi3mr_update_links (mrioc, sas_address_parent, handle, i, link_rate, hba_port); }
@@ -2388,6 +2392,9 @@ int mpi3mr_report_tgtdev_to_sas_transport(struct mpi3mr_ioc *mrioc, link_rate =mpi3mr_get_sas_negotiated_logical_linkrate (mrioc, tgtdev); +if (link_rate <MPI3_SAS_NEG_LINK_RATE_1_5 ) + link_rate =MPI3_SAS_NEG_LINK_RATE_1_5 ; +mpi3mr_update_links (mrioc, sas_address_parent, tgtdev->dev_handle, parent_phy_number, link_rate, hba_port);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 354/849 wifi: rtw89: coex: Limit Wi-Fi scan slot cost to avoid A2DP glitch
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ching-Te Ku <[email protected]>
[ Upstream commit ebea22c7f1b2f06f4ff0719d76bd19830cf25c9f ]
When Wi-Fi is scanning at 2.4GHz, PTA will abort almost all the BT request. Once the Wi-Fi slot stay too long, BT audio device can not get enough data, audio glitch will happened. This patch limit 2.4Ghz Wi-Fi slot to 80ms while Wi-Fi is scanning to avoid audio glitch.
--- drivers/net/wireless/realtek/rtw89/coex.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/coex.c +4 -1
@@ -93,7 +93,7 @@ static const struct rtw89_btc_fbtc_slot s_def[] = { [CXST_E2G] = __DEF_FBTC_SLOT(5, 0xea5a5a5a, SLOT_MIX), [CXST_E5G] = __DEF_FBTC_SLOT(5, 0xffffffff, SLOT_ISO), [CXST_EBT] = __DEF_FBTC_SLOT(5, 0xe5555555, SLOT_MIX), - [CXST_ENULL] = __DEF_FBTC_SLOT(5, 0xaaaaaaaa, SLOT_ISO), + [CXST_ENULL] = __DEF_FBTC_SLOT(5, 0x55555555, SLOT_MIX), [CXST_WLK] = __DEF_FBTC_SLOT(250, 0xea5a5a5a, SLOT_MIX), [CXST_W1FDD] = __DEF_FBTC_SLOT(50, 0xffffffff, SLOT_ISO), [CXST_B1FDD] = __DEF_FBTC_SLOT(50, 0xffffdfff, SLOT_ISO),
@@ -4153,6 +4153,7 @@ void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type) s_def[CXST_EBT].cxtbl, s_def[CXST_EBT].cxtype);_slot_set_le (btc,CXST_ENULL , s_def[CXST_ENULL ].dur, s_def[CXST_ENULL ].cxtbl, s_def[CXST_ENULL ].cxtype); +_slot_set_dur (btc,CXST_EBT , dur_2);break ;case BTC_CXP_OFFE_DEF2 :_slot_set (btc,CXST_E2G ,20 , cxtbl[1 ],SLOT_ISO );
@@ -4162,6 +4163,7 @@ void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type) s_def[CXST_EBT].cxtbl, s_def[CXST_EBT].cxtype);_slot_set_le (btc,CXST_ENULL , s_def[CXST_ENULL ].dur, s_def[CXST_ENULL ].cxtbl, s_def[CXST_ENULL ].cxtype); +_slot_set_dur (btc,CXST_EBT , dur_2);break ;case BTC_CXP_OFFE_2GBWMIXB :if (a2dp->exist)
@@ -4170,6 +4172,7 @@ void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type)_slot_set (btc,CXST_E2G ,5 , tbl_w1,SLOT_MIX );_slot_set_le (btc,CXST_EBT ,cpu_to_le16 (40 ), s_def[CXST_EBT ].cxtbl, s_def[CXST_EBT ].cxtype); +_slot_set_dur (btc,CXST_EBT , dur_2);break ;case BTC_CXP_OFFE_WL :/* for 4-way */ _slot_set (btc,CXST_E2G ,5 , cxtbl[1 ],SLOT_MIX );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 355/849 scsi: mpi3mr: Fix I/O failures during controller reset
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chandrakanth Patil <[email protected]>
[ Upstream commit b7b2176e30fc8e57664e5a8a23387af66eb7f72b ]
I/Os can race with controller reset and fail.
Block requests at the mid layer when reset starts using scsi_host_block(), and resume with scsi_host_unblock() after reset completes.
--- drivers/scsi/mpi3mr/mpi3mr_fw.c | 3 +++ drivers/scsi/mpi3mr/mpi3mr_os.c | 2 ++ 2 files changed, 5 insertions(+)
drivers/scsi/mpi3mr/mpi3mr_fw.c +3 -0
@@ -5420,6 +5420,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc, mpi3mr_reset_rc_name(reset_reason)); mrioc->device_refresh_on =0 ; +scsi_block_requests (mrioc->shost); mrioc->reset_in_progress =1 ; mrioc->stop_bsgs =1 ; mrioc->prev_reset_result =-1 ;
@@ -5528,6 +5529,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,if (!retval) { mrioc->diagsave_timeout =0 ; mrioc->reset_in_progress =0 ; +scsi_unblock_requests (mrioc->shost); mrioc->pel_abort_requested =0 ;if (mrioc->pel_enabled) { mrioc->pel_cmds.retry_count =0 ;
@@ -5552,6 +5554,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc, mrioc->device_refresh_on =0 ; mrioc->unrecoverable =1 ; mrioc->reset_in_progress =0 ; +scsi_unblock_requests (mrioc->shost); mrioc->stop_bsgs =0 ; retval =-1 ;mpi3mr_flush_cmds_for_unrecovered_controller (mrioc);
drivers/scsi/mpi3mr/mpi3mr_os.c +2 -0
@@ -2866,12 +2866,14 @@ static void mpi3mr_preparereset_evt_th(struct mpi3mr_ioc *mrioc, "prepare for reset event top half with rc=start\n");if (mrioc->prepare_for_reset)return ; +scsi_block_requests (mrioc->shost); mrioc->prepare_for_reset =1 ; mrioc->prepare_for_reset_timeout_counter =0 ; }else if (evtdata->reason_code ==MPI3_EVENT_PREPARE_RESET_RC_ABORT ) {dprint_event_th (mrioc,"prepare for reset top half with rc=abort\n" ); mrioc->prepare_for_reset =0 ; +scsi_unblock_requests (mrioc->shost); mrioc->prepare_for_reset_timeout_counter =0 ; } if ((event_reply->msg_flags & MPI3_EVENT_NOTIFY_MSGFLAGS_ACK_MASK)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 356/849 scsi: mpi3mr: Fix controller init failure on fault during queue creation
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chandrakanth Patil <[email protected]>
[ Upstream commit 829fa1582b6ff607b0e2fe41ba1c45c77f686618 ]
Firmware can enter a transient fault while creating operational queues. The driver fails the load immediately.
Add a retry loop that checks controller status and history bit after queue creation. If either indicates a fault, retry init up to a set limit before failing.
--- drivers/scsi/mpi3mr/mpi3mr_fw.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/scsi/mpi3mr/mpi3mr_fw.c +10 -0
@@ -2353,6 +2353,8 @@ static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc) {int retval =0 ;u16 num_queues =0 , i =0 , msix_count_op_q =1 ; +u32 ioc_status; +enum mpi3mr_iocstate ioc_state; num_queues =min_t (int, mrioc->facts.max_op_reply_q, mrioc->facts.max_op_req_q);
@@ -2408,6 +2410,14 @@ static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc) retval =-1 ; goto out_failed; } + ioc_status =readl (&mrioc->sysif_regs->ioc_status); + ioc_state =mpi3mr_get_iocstate (mrioc); +if ((ioc_status &MPI3_SYSIF_IOC_STATUS_RESET_HISTORY ) || + ioc_state !=MRIOC_STATE_READY ) { +mpi3mr_print_fault_info (mrioc); + retval =-1 ; + goto out_failed; + } mrioc->num_op_reply_q = mrioc->num_op_req_q = i; ioc_info(mrioc, "successfully created %d operational queue pairs(default/polled) queue = (%d/%d)\n",
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 357/849 scsi: pm80xx: Fix race condition caused by static variables
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Francisco Gutierrez <[email protected]>
[ Upstream commit d6477ee38ccfbeaed885733c13f41d9076e2f94a ]
Eliminate the use of static variables within the log pull implementation to resolve a race condition and prevent data gaps when pulling logs from multiple controllers in parallel, ensuring each operation is properly isolated.
--- drivers/scsi/pm8001/pm8001_ctl.c | 22 ++++++++++++---------- drivers/scsi/pm8001/pm8001_init.c | 1 + drivers/scsi/pm8001/pm8001_sas.h | 4 ++++ 3 files changed, 17 insertions(+), 10 deletions(-)
drivers/scsi/pm8001/pm8001_ctl.c +12 -10
@@ -534,23 +534,25 @@ static ssize_t pm8001_ctl_iop_log_show(struct device *cdev,char *str = buf;u32 read_size = pm8001_ha->main_cfg_tbl.pm80xx_tbl.event_log_size /1024 ; -static u32 start, end, count;u32 max_read_times =32 ;u32 max_count = (read_size *1024 ) / (max_read_times *4 );u32 *temp = (u32 *)pm8001_ha->memoryMap.region[IOP ].virt_ptr; -if ((count % max_count) ==0 ) { - start =0 ; - end = max_read_times; - count =0 ; +mutex_lock (&pm8001_ha->iop_log_lock); + +if ((pm8001_ha->iop_log_count % max_count) ==0 ) { + pm8001_ha->iop_log_start =0 ; + pm8001_ha->iop_log_end = max_read_times; + pm8001_ha->iop_log_count =0 ; }else { - start = end; - end = end + max_read_times; + pm8001_ha->iop_log_start = pm8001_ha->iop_log_end; + pm8001_ha->iop_log_end = pm8001_ha->iop_log_end + max_read_times; } -for (; start < end; start++) - str +=sprintf (str,"%08x " , *(temp+start)); - count++; +for (; pm8001_ha->iop_log_start < pm8001_ha->iop_log_end; pm8001_ha->iop_log_start++) + str +=sprintf (str,"%08x " , *(temp+pm8001_ha->iop_log_start)); + pm8001_ha->iop_log_count++; +mutex_unlock (&pm8001_ha->iop_log_lock);return str - buf; } static DEVICE_ATTR(iop_log, S_IRUGO, pm8001_ctl_iop_log_show, NULL);
drivers/scsi/pm8001/pm8001_init.c +1 -0
@@ -552,6 +552,7 @@ static struct pm8001_hba_info *pm8001_pci_alloc(struct pci_dev *pdev, pm8001_ha->id = pm8001_id++; pm8001_ha->logging_level = logging_level; pm8001_ha->non_fatal_count =0 ; +mutex_init (&pm8001_ha->iop_log_lock);if (link_rate >=1 && link_rate <=15 ) pm8001_ha->link_rate = (link_rate <<8 );else {
drivers/scsi/pm8001/pm8001_sas.h +4 -0
@@ -547,6 +547,10 @@ struct pm8001_hba_info {u32 ci_offset;u32 pi_offset;u32 max_memcnt; +u32 iop_log_start; +u32 iop_log_end; +u32 iop_log_count; +struct mutex iop_log_lock; };struct pm8001_work {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 358/849 extcon: adc-jack: Fix wakeup source leaks on device unbind
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 78b6a991eb6c6f19ed7d0ac91cda3b3b117fda8f ]
Device can be unbound, so driver must also release memory for the wakeup source. Do not use devm interface, because it would change the order of cleanup.
--- drivers/extcon/extcon-adc-jack.c | 1 + 1 file changed, 1 insertion(+)
drivers/extcon/extcon-adc-jack.c +1 -0
@@ -164,6 +164,7 @@ static void adc_jack_remove(struct platform_device *pdev) {struct adc_jack_data *data =platform_get_drvdata (pdev); +device_init_wakeup (&pdev->dev, false);free_irq (data->irq, data);cancel_work_sync (&data->handler.work); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 359/849 extcon: fsa9480: Fix wakeup source leaks on device unbind
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 6f982d55f8c5d1e9189906a2a352dba8de421f5f ]
Device can be unbound, so driver must also release memory for the wakeup source.
--- drivers/extcon/extcon-fsa9480.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/extcon/extcon-fsa9480.c +1 -1
@@ -317,7 +317,7 @@ static int fsa9480_probe(struct i2c_client *client)return ret; } -device_init_wakeup (info->dev, true); +devm_device_init_wakeup (info->dev);fsa9480_detect_dev (info);return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 360/849 extcon: axp288: Fix wakeup source leaks on device unbind
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 93ccf3f2f22ceaa975b462156f98527febee4fe5 ]
Device can be unbound, so driver must also release memory for the wakeup source.
--- drivers/extcon/extcon-axp288.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/extcon/extcon-axp288.c +1 -1
@@ -470,7 +470,7 @@ static int axp288_extcon_probe(struct platform_device *pdev)if (ret <0 )return ret; -device_init_wakeup (dev, true); +devm_device_init_wakeup (dev);platform_set_drvdata (pdev, info);return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 361/849 drm/xe: Set GT as wedged before sending wedged uevent
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Riana Tauro <[email protected]>
[ Upstream commit 90fdcf5f89e9288c153923f16a60e6f7da18ba76 ]
Userspace should be notified after setting the device as wedged. Re-order function calls to set gt wedged before sending uevent.
--- drivers/gpu/drm/xe/xe_device.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/gpu/drm/xe/xe_device.c +8 -4
@@ -1157,8 +1157,10 @@ static void xe_device_wedged_fini(struct drm_device *drm, void *arg)* xe_device_declare_wedged - Declare device wedged * @xe: xe device instance * -* This is a final state that can only be cleared with a module +* This is a final state that can only be cleared with the recovery method +* specified in the drm wedged uevent. The default recovery method is * re-probe (unbind + bind). +* * In this state every IOCTL will be blocked so the GT cannot be used. * In general it will be called upon any critical error such as gt reset * failure or guc loading failure. Userspace will be notified of this state
@@ -1192,13 +1194,15 @@ void xe_device_declare_wedged(struct xe_device *xe)"IOCTLs and executions are blocked. Only a rebind may clear the failure\n" "Please file a _new_ bug report at https://gitlab.freedesktop.org/drm/xe/kernel/issues/new\n" , dev_name(xe->drm.dev)); + } + +for_each_gt (gt, xe, id) +xe_gt_declare_wedged (gt); +if (xe_device_wedged (xe)) {/* Notify userspace of wedged device */ drm_dev_wedged_event (&xe->drm,DRM_WEDGE_RECOVERY_REBIND |DRM_WEDGE_RECOVERY_BUS_RESET ,NULL ); } - -for_each_gt (gt, xe, id) -xe_gt_declare_wedged (gt); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 362/849 remoteproc: wkup_m3: Use devm_pm_runtime_enable() helper
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Davis <[email protected]>
[ Upstream commit 461edcf73eec57bc0006fbb5209f5012c514c58b ]
Use device life-cycle managed runtime enable function to simplify probe and exit paths.
--- drivers/remoteproc/wkup_m3_rproc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/remoteproc/wkup_m3_rproc.c +3 -3
@@ -148,7 +148,9 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev)return -ENODEV ; } -pm_runtime_enable (&pdev->dev); + ret =devm_pm_runtime_enable (dev); +if (ret <0 ) +return dev_err_probe (dev, ret,"Failed to enable runtime PM\n" ); ret =pm_runtime_get_sync (&pdev->dev);if (ret <0 ) {dev_err (&pdev->dev,"pm_runtime_get_sync() failed\n" );
@@ -219,7 +221,6 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev)rproc_free (rproc); err:pm_runtime_put_noidle (dev); -pm_runtime_disable (dev);return ret; }
@@ -230,7 +231,6 @@ static void wkup_m3_rproc_remove(struct platform_device *pdev)rproc_del (rproc);rproc_free (rproc);pm_runtime_put_sync (&pdev->dev); -pm_runtime_disable (&pdev->dev); }#ifdef CONFIG_PM
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 363/849 drm/xe/wcl: Extend L3bank mask workaround
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chaitanya Kumar Borah <[email protected]>
[ Upstream commit d738e1be2b2b4364403babc43ae7343d45e99d41 ]
The commit 9ab440a9d042 ("drm/xe/ptl: L3bank mask is not available on the media GT") added a workaround to ignore the fuse register that L3 bank availability as it did not contain valid values. Same is true for WCL therefore extend the workaround to cover it.
--- drivers/gpu/drm/xe/xe_wa_oob.rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_wa_oob.rules +1 -1
@@ -47,7 +47,7 @@ 16023588340 GRAPHICS_VERSION(2001), FUNC(xe_rtp_match_not_sriov_vf) 14019789679 GRAPHICS_VERSION(1255) GRAPHICS_VERSION_RANGE(1270, 2004) -no_media_l3 MEDIA_VERSION(3000) +no_media_l3 MEDIA_VERSION_RANGE(3000, 3002) 14022866841 GRAPHICS_VERSION(3000), GRAPHICS_STEP(A0, B0) MEDIA_VERSION(3000), MEDIA_STEP(A0, B0) 16021333562 GRAPHICS_VERSION_RANGE(1200, 1274)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 364/849 net: phy: fixed_phy: let fixed_phy_unregister free the phy_device
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit a0f849c1cc6df0db9083b4c81c05a5456b1ed0fb ]
fixed_phy_register() creates and registers the phy_device. To be symmetric, we should not only unregister, but also free the phy_device in fixed_phy_unregister(). This allows to simplify code in users.
Note wrt of_phy_deregister_fixed_link():put_device(&phydev->mdio.dev) and phy_device_free(phydev) are identical.
--- drivers/net/dsa/dsa_loop.c | 9 +++------ drivers/net/mdio/of_mdio.c | 1 - drivers/net/phy/fixed_phy.c | 1 + 3 files changed, 4 insertions(+), 7 deletions(-)
drivers/net/dsa/dsa_loop.c +3 -6
@@ -386,13 +386,10 @@ static struct mdio_driver dsa_loop_drv = {static void dsa_loop_phydevs_unregister (void ) { -unsigned int i; - -for (i =0 ; i <NUM_FIXED_PHYS ; i++) -if (!IS_ERR (phydevs[i])) { +for (int i =0 ; i <NUM_FIXED_PHYS ; i++) { +if (!IS_ERR (phydevs[i]))fixed_phy_unregister (phydevs[i]); -phy_device_free (phydevs[i]); - } + } }static int __init dsa_loop_init (void )
drivers/net/mdio/of_mdio.c +0 -1
@@ -473,6 +473,5 @@ void of_phy_deregister_fixed_link(struct device_node *np)fixed_phy_unregister (phydev);put_device (&phydev->mdio.dev);/* of_phy_find_device() */ -phy_device_free (phydev);/* fixed_phy_register() */ }EXPORT_SYMBOL (of_phy_deregister_fixed_link);
drivers/net/phy/fixed_phy.c +1 -0
@@ -309,6 +309,7 @@ void fixed_phy_unregister(struct phy_device *phy)phy_device_remove (phy);of_node_put (phy->mdio.dev.of_node);fixed_phy_del (phy->mdio.addr); +phy_device_free (phy); }EXPORT_SYMBOL_GPL (fixed_phy_unregister);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 365/849 selftests: drv-net: hds: restore hds settings
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit ee3ae27721fb994ac0b4705b5806ce68a5a74c73 ]
The test currently modifies the HDS settings and doesn't restore them. This may cause subsequent tests to fail (or pass when they should not). Add defer()ed reset handling.
--- tools/testing/selftests/drivers/net/hds.py | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+)
tools/testing/selftests/drivers/net/hds.py +39 -0
@@ -3,6 +3,7 @@ import errno import os +from typing import Union from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_raises, KsftSkipEx from lib.py import CmdExitFailure, EthtoolFamily, NlError from lib.py import NetDrvEnv
@@ -58,7 +59,39 @@ def get_hds_thresh(cfg, netnl) -> None: if 'hds-thresh' not in rings: raise KsftSkipEx('hds-thresh not supported by device') + +def _hds_reset(cfg, netnl, rings) -> None: + cur = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) + + arg = {'header': {'dev-index': cfg.ifindex}} + if cur.get('tcp-data-split') != rings.get('tcp-data-split'): + # Try to reset to "unknown" first, we don't know if the setting + # was the default or user chose it. Default seems more likely. + arg['tcp-data-split'] = "unknown" + netnl.rings_set(arg) + cur = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) + if cur['tcp-data-split'] == rings['tcp-data-split']: + del arg['tcp-data-split'] + else: + # Try the explicit setting + arg['tcp-data-split'] = rings['tcp-data-split'] + if cur.get('hds-thresh') != rings.get('hds-thresh'): + arg['hds-thresh'] = rings['hds-thresh'] + if len(arg) > 1: + netnl.rings_set(arg) + + +def _defer_reset_hds(cfg, netnl) -> Union[dict, None]: + try: + rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) + if 'hds-thresh' in rings or 'tcp-data-split' in rings: + defer(_hds_reset, cfg, netnl, rings) + except NlError as e: + pass + + def set_hds_enable(cfg, netnl) -> None: + _defer_reset_hds(cfg, netnl) try: netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'tcp-data-split': 'enabled'}) except NlError as e:
@@ -76,6 +109,7 @@ def set_hds_enable(cfg, netnl) -> None: ksft_eq('enabled', rings['tcp-data-split']) def set_hds_disable(cfg, netnl) -> None: + _defer_reset_hds(cfg, netnl) try: netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'tcp-data-split': 'disabled'}) except NlError as e:
@@ -93,6 +127,7 @@ def set_hds_disable(cfg, netnl) -> None: ksft_eq('disabled', rings['tcp-data-split']) def set_hds_thresh_zero(cfg, netnl) -> None: + _defer_reset_hds(cfg, netnl) try: netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'hds-thresh': 0}) except NlError as e:
@@ -110,6 +145,7 @@ def set_hds_thresh_zero(cfg, netnl) -> None: ksft_eq(0, rings['hds-thresh']) def set_hds_thresh_random(cfg, netnl) -> None: + _defer_reset_hds(cfg, netnl) try: rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) except NlError as e:
@@ -140,6 +176,7 @@ def set_hds_thresh_random(cfg, netnl) -> None: ksft_eq(hds_thresh, rings['hds-thresh']) def set_hds_thresh_max(cfg, netnl) -> None: + _defer_reset_hds(cfg, netnl) try: rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) except NlError as e:
@@ -157,6 +194,7 @@ def set_hds_thresh_max(cfg, netnl) -> None: ksft_eq(rings['hds-thresh'], rings['hds-thresh-max']) def set_hds_thresh_gt(cfg, netnl) -> None: + _defer_reset_hds(cfg, netnl) try: rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) except NlError as e:
@@ -178,6 +216,7 @@ def set_xdp(cfg, netnl) -> None: """ mode = _get_hds_mode(cfg, netnl) if mode == 'enabled': + _defer_reset_hds(cfg, netnl) netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'tcp-data-split': 'unknown'})
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 366/849 fuse: zero initialize inode private data
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
[ Upstream commit 3ca1b311181072415b6432a169de765ac2034e5a ]
This is slightly tricky, since the VFS uses non-zeroing allocation to preserve some fields that are left in a consistent state.
--- fs/fuse/inode.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
fs/fuse/inode.c +4 -7
@@ -101,14 +101,11 @@ static struct inode *fuse_alloc_inode(struct super_block *sb)if (!fi)return NULL ; - fi->i_time =0 ; +/* Initialize private data (i.e. everything except fi->inode) */ +BUILD_BUG_ON (offsetof(struct fuse_inode , inode) !=0 ); +memset ((void *) fi +sizeof (fi->inode),0 ,sizeof (*fi) -sizeof (fi->inode)); + fi->inval_mask = ~0 ; - fi->nodeid =0 ; - fi->nlookup =0 ; - fi->attr_version =0 ; - fi->orig_ino =0 ; - fi->state =0 ; - fi->submount_lookup =NULL ;mutex_init (&fi->mutex);spin_lock_init (&fi->lock); fi->forget =fuse_alloc_forget ();
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 367/849 virtio_fs: fix the hash table using in virtio_fs_enqueue_req()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li RongQing <[email protected]>
[ Upstream commit 7dbe6442487743ad492d9143f1f404c1f4a05e0e ]
The original commit be2ff42c5d6e ("fuse: Use hash table to link processing request") converted fuse_pqueue->processing to a hash table, but virtio_fs_enqueue_req() was not updated to use it correctly. So use fuse_pqueue->processing as a hash table, this make the code more coherent
--- fs/fuse/dev.c | 1 + fs/fuse/virtio_fs.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-)
fs/fuse/dev.c +1 -0
@@ -322,6 +322,7 @@ unsigned int fuse_req_hash(u64 unique) {return hash_long (unique & ~FUSE_INT_REQ_BIT ,FUSE_PQ_HASH_BITS ); } +EXPORT_SYMBOL_GPL (fuse_req_hash);/* * A new request is available, wake fiq->waitq
fs/fuse/virtio_fs.c +4 -2
@@ -20,6 +20,7 @@#include <linux/cleanup.h> #include <linux/uio.h> #include "fuse_i.h" +#include "fuse_dev_i.h" /* Used to help calculate the FUSE connection's max_pages limit for a request's * size. Parts of the struct fuse_req are sliced into scattergather lists in
@@ -1384,7 +1385,7 @@ static int virtio_fs_enqueue_req(struct virtio_fs_vq *fsvq,unsigned int out_sgs =0 ;unsigned int in_sgs =0 ;unsigned int total_sgs; -unsigned int i; +unsigned int i, hash;int ret;bool notify;struct fuse_pqueue *fpq;
@@ -1444,8 +1445,9 @@ static int virtio_fs_enqueue_req(struct virtio_fs_vq *fsvq,/* Request successfully sent. */ fpq = &fsvq->fud->pq; + hash =fuse_req_hash (req->in.h.unique);spin_lock (&fpq->lock); -list_add_tail (&req->list, fpq->processing); +list_add_tail (&req->list, &fpq->processing[hash]);spin_unlock (&fpq->lock);set_bit (FR_SENT , &req->flags);/* matches barrier in request_wait_answer() */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 368/849 selftests: pci_endpoint: Skip IRQ test if IRQ is out of range.
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Bruel <[email protected]>
[ Upstream commit 106fc08b30a2ece49a251b053165a83d41d50fd0 ]
The pci_endpoint_test tests the entire MSI/MSI-X range, which generates false errors on platforms that do not support the whole range.
Skip the test in such cases and report accordingly.
--- tools/testing/selftests/pci_endpoint/pci_endpoint_test.c | 4 ++++ 1 file changed, 4 insertions(+)
tools/testing/selftests/pci_endpoint/pci_endpoint_test.c +4 -0
@@ -121,6 +121,8 @@ TEST_F(pci_ep_basic, MSI_TEST)for (i =1 ; i <=32 ; i++) {pci_ep_ioctl (PCITEST_MSI , i); +if (ret == -EINVAL ) +SKIP (return,"MSI%d is disabled" , i); EXPECT_FALSE(ret) TH_LOG("Test failed for MSI%d", i); } }
@@ -137,6 +139,8 @@ TEST_F(pci_ep_basic, MSIX_TEST)for (i =1 ; i <=2048 ; i++) {pci_ep_ioctl (PCITEST_MSIX , i); +if (ret == -EINVAL ) +SKIP (return,"MSI-X%d is disabled" , i); EXPECT_FALSE(ret) TH_LOG("Test failed for MSI-X%d", i); } }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 369/849 drm/xe: Ensure GT is in C0 during resumes
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Wang <[email protected]>
[ Upstream commit 95d0883ac8105717f59c2dcdc0d8b9150f13aa12 ]
This patch ensures the gt will be awake for the entire duration of the resume sequences until GuCRC takes over and GT-C6 gets re-enabled.
Before suspending GT-C6 is kept enabled, but upon resume, GuCRC is not yet alive to properly control the exits and some cases of instability and corruption related to GT-C6 can be observed.
--- drivers/gpu/drm/xe/xe_pm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_pm.c +7 -1
@@ -18,7 +18,7 @@#include "xe_device.h" #include "xe_ggtt.h" #include "xe_gt.h" -#include "xe_guc.h" +#include "xe_gt_idle.h" #include "xe_i2c.h" #include "xe_irq.h" #include "xe_pcode.h"
@@ -177,6 +177,9 @@ int xe_pm_resume(struct xe_device *xe)drm_dbg (&xe->drm,"Resuming device\n" );trace_xe_pm_resume (xe,__builtin_return_address (0 )); +for_each_gt (gt, xe, id) +xe_gt_idle_disable_c6 (gt); +for_each_tile (tile, xe, id)xe_wa_apply_tile_workarounds (tile);
@@ -547,6 +550,9 @@ int xe_pm_runtime_resume(struct xe_device *xe)xe_rpm_lockmap_acquire (xe); +for_each_gt (gt, xe, id) +xe_gt_idle_disable_c6 (gt); +if (xe->d3cold.allowed) { err =xe_pcode_ready (xe, true);if (err)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 370/849 misc: pci_endpoint_test: Skip IRQ tests if irq is out of range
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Bruel <[email protected]>
[ Upstream commit cc8e391067164f45f89b6132a5aaa18c33a0e32b ]
The pci_endpoint_test tests the 32-bit MSI range. However, the device might not have all vectors configured. For example, if msi_interrupts is 8 in the ep function space or if the MSI Multiple Message Capable value is configured as 4 (maximum 16 vectors).
In this case, do not attempt to run the test to avoid timeouts and directly return the error value.
--- drivers/misc/pci_endpoint_test.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/misc/pci_endpoint_test.c +6 -6
@@ -436,7 +436,11 @@ static int pci_endpoint_test_msi_irq(struct pci_endpoint_test *test, {struct pci_dev *pdev = test->pdev;u32 val; -int ret; +int irq; + + irq =pci_irq_vector (pdev, msi_num -1 ); +if (irq <0 ) +return irq; pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, msix ? PCITEST_IRQ_TYPE_MSIX :
@@ -450,11 +454,7 @@ static int pci_endpoint_test_msi_irq(struct pci_endpoint_test *test,if (!val)return -ETIMEDOUT ; - ret =pci_irq_vector (pdev, msi_num -1 ); -if (ret <0 ) -return ret; - -if (ret != test->last_irq) +if (irq != test->last_irq)return -EIO ;return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 371/849 drm/amdgpu: Correct the loss of aca bank reg info
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ce Sun <[email protected]>
[ Upstream commit d8442bcad0764c5613e9f8b2356f3e0a48327e20 ]
By polling, poll ACA bank count to ensure that valid ACA bank reg info can be obtained
v2: add corresponding delay before send msg to SMU to query mca bank info (Stanley)
v3: the loop cannot exit. (Thomas)
v4: remove amdgpu_aca_clear_bank_count. (Kevin)
v5: continuously inject ce. If a creation interruption occurs at this time, bank reg info will be lost. (Thomas)
v5: each cycle is delayed by 100ms. (Tao)
--- drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 50 +++++++++++-------------- drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | 5 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c | 1 + drivers/gpu/drm/amd/amdgpu/umc_v12_0.c | 5 ++- 4 files changed, 29 insertions(+), 32 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +21 -29
@@ -122,7 +122,7 @@ const char *get_ras_block_str(struct ras_common_if *ras_block)/* typical ECC bad page rate is 1 bad page per 100MB VRAM */ #define RAS_BAD_PAGE_COVER (100 * 1024 * 1024ULL) -#define MAX_UMC_POISON_POLLING_TIME_ASYNC 300 //ms +#define MAX_UMC_POISON_POLLING_TIME_ASYNC 10#define AMDGPU_RAS_RETIRE_PAGE_INTERVAL 100 //ms
@@ -3239,7 +3239,7 @@ static void amdgpu_ras_ecc_log_init(struct ras_ecc_log_info *ecc_log)INIT_RADIX_TREE (&ecc_log->de_page_tree,GFP_KERNEL ); ecc_log->de_queried_count =0 ; - ecc_log->prev_de_queried_count =0 ; + ecc_log->consumption_q_count =0 ; }static void amdgpu_ras_ecc_log_fini (struct ras_ecc_log_info *ecc_log)
@@ -3259,7 +3259,7 @@ static void amdgpu_ras_ecc_log_fini(struct ras_ecc_log_info *ecc_log)mutex_destroy (&ecc_log->lock); ecc_log->de_queried_count =0 ; - ecc_log->prev_de_queried_count =0 ; + ecc_log->consumption_q_count =0 ; } static bool amdgpu_ras_schedule_retirement_dwork(struct amdgpu_ras *con,
@@ -3309,47 +3309,34 @@ static int amdgpu_ras_poison_creation_handler(struct amdgpu_device *adev,int ret =0 ;struct ras_ecc_log_info *ecc_log;struct ras_query_if info; -uint32_t timeout =0 ; +u32 timeout =MAX_UMC_POISON_POLLING_TIME_ASYNC ;struct amdgpu_ras *ras =amdgpu_ras_get_context (adev); -uint64_t de_queried_count; -uint32_t new_detect_count, total_detect_count; -uint32_t need_query_count = poison_creation_count; +u64 de_queried_count; +u64 consumption_q_count;enum ras_event_type type =RAS_EVENT_TYPE_POISON_CREATION ;memset (&info,0 ,sizeof (info)); info.head.block =AMDGPU_RAS_BLOCK__UMC ; ecc_log = &ras->umc_ecc_log; - total_detect_count =0 ; + ecc_log->de_queried_count =0 ; + ecc_log->consumption_q_count =0 ; +do { ret =amdgpu_ras_query_error_status_with_event (adev, &info, type);if (ret)return ret; de_queried_count = ecc_log->de_queried_count; -if (de_queried_count > ecc_log->prev_de_queried_count) { - new_detect_count = de_queried_count - ecc_log->prev_de_queried_count; - ecc_log->prev_de_queried_count = de_queried_count; - timeout =0 ; - }else { - new_detect_count =0 ; - } + consumption_q_count = ecc_log->consumption_q_count; -if (new_detect_count) { - total_detect_count += new_detect_count; - }else { -if (!timeout && need_query_count) - timeout =MAX_UMC_POISON_POLLING_TIME_ASYNC ; +if (de_queried_count && consumption_q_count) +break ; -if (timeout) { -if (!--timeout) -break ; -msleep (1 ); - } - } - }while (total_detect_count < need_query_count); +msleep (100 ); + }while (--timeout); -if (total_detect_count) +if (de_queried_count)schedule_delayed_work (&ras->page_retirement_dwork,0 );if (amdgpu_ras_is_rma (adev) &&atomic_cmpxchg (&ras->rma_in_recovery,0 ,1 ) ==0 )
@@ -3446,7 +3433,8 @@ static int amdgpu_ras_page_retirement_thread(void *param)atomic_sub (poison_creation_count, &con->poison_creation_count);atomic_sub (poison_creation_count, &con->page_retirement_req_cnt); } - }while (atomic_read (&con->poison_creation_count)); + }while (atomic_read (&con->poison_creation_count) && + !atomic_read (&con->poison_consumption_count));if (ret != -EIO ) { msg_count =kfifo_len (&con->poison_fifo);
@@ -3463,6 +3451,7 @@ static int amdgpu_ras_page_retirement_thread(void *param)/* gpu mode-1 reset is ongoing or just completed ras mode-1 reset */ /* Clear poison creation request */ atomic_set (&con->poison_creation_count,0 ); +atomic_set (&con->poison_consumption_count,0 );/* Clear poison fifo */ amdgpu_ras_clear_poison_fifo (adev);
@@ -3487,6 +3476,8 @@ static int amdgpu_ras_page_retirement_thread(void *param)atomic_sub (msg_count, &con->page_retirement_req_cnt); } +atomic_set (&con->poison_consumption_count,0 ); +/* Wake up work to save bad pages to eeprom */ schedule_delayed_work (&con->page_retirement_dwork,0 ); }
@@ -3590,6 +3581,7 @@ int amdgpu_ras_recovery_init(struct amdgpu_device *adev, bool init_bp_info)init_waitqueue_head (&con->page_retirement_wq);atomic_set (&con->page_retirement_req_cnt,0 );atomic_set (&con->poison_creation_count,0 ); +atomic_set (&con->poison_consumption_count,0 ); con->page_retirement_thread =kthread_run (amdgpu_ras_page_retirement_thread, adev,"umc_page_retirement" );if (IS_ERR (con->page_retirement_thread)) {
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +3 -2
@@ -492,8 +492,8 @@ struct ras_ecc_err {struct ras_ecc_log_info {struct mutex lock;struct radix_tree_root de_page_tree; -uint64_t de_queried_count; -uint64_t prev_de_queried_count; +uint64_t de_queried_count; +uint64_t consumption_q_count; };struct amdgpu_ras {
@@ -558,6 +558,7 @@ struct amdgpu_ras {struct mutex page_retirement_lock;atomic_t page_retirement_req_cnt;atomic_t poison_creation_count; +atomic_t poison_consumption_count;struct mutex page_rsv_lock; DECLARE_KFIFO(poison_fifo, struct ras_poison_msg, 128);struct ras_ecc_log_info umc_ecc_log;
drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c +1 -0
@@ -252,6 +252,7 @@ int amdgpu_umc_pasid_poison_handler(struct amdgpu_device *adev, block, pasid, pasid_fn, data, reset);if (!ret) {atomic_inc (&con->page_retirement_req_cnt); +atomic_inc (&con->poison_consumption_count);wake_up (&con->page_retirement_wq); } }
drivers/gpu/drm/amd/amdgpu/umc_v12_0.c +4 -1
@@ -536,8 +536,11 @@ static int umc_v12_0_update_ecc_status(struct amdgpu_device *adev, hwid =REG_GET_FIELD (ipid,MCMP1_IPIDT0 , HardwareID); mcatype =REG_GET_FIELD (ipid,MCMP1_IPIDT0 , McaType); -if ((hwid !=MCA_UMC_HWID_V12_0 ) || (mcatype !=MCA_UMC_MCATYPE_V12_0 )) +/* The IP block decode of consumption is SMU */ +if (hwid !=MCA_UMC_HWID_V12_0 || mcatype !=MCA_UMC_MCATYPE_V12_0 ) { + con->umc_ecc_log.consumption_q_count++;return 0 ; + }if (!status)return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 372/849 drm/amdgpu: Correct the counts of nr_banks and nr_errors
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ce Sun <[email protected]>
[ Upstream commit 907813e5d7cadfeafab12467d748705a5309efb0 ]
Correct the counts of nr_banks and nr_errors
--- drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c +2 -0
@@ -76,6 +76,7 @@ static void aca_banks_release(struct aca_banks *banks)list_for_each_entry_safe (node, tmp, &banks->list, node) {list_del (&node->node);kvfree (node); + banks->nr_banks--; } }
@@ -238,6 +239,7 @@ static struct aca_bank_error *new_bank_error(struct aca_error *aerr, struct aca_mutex_lock (&aerr->lock);list_add_tail (&bank_error->node, &aerr->list); + aerr->nr_errors++;mutex_unlock (&aerr->lock);return bank_error;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 373/849 drm/amdkfd: fix vram allocation failure for a special case
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Huang <[email protected]>
[ Upstream commit 93aa919ca05bec544b17ee9a1bfe394ce6c94bd8 ]
When it only allocates vram without va, which is 0, and a SVM range allocated stays in this range, the vram allocation returns failure. It should be skipped for this case from SVM usage check.
--- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +6 -1
@@ -1070,7 +1070,12 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,svm_range_list_lock_and_flush_work (&p->svms, current->mm);mutex_lock (&p->svms.lock);mmap_write_unlock (current->mm); -if (interval_tree_iter_first (&p->svms.objects, + +/* Skip a special case that allocates VRAM without VA, +* VA will be invalid of 0. +*/ +if (!(!args->va_addr && (flags &KFD_IOC_ALLOC_MEM_FLAGS_VRAM )) && +interval_tree_iter_first (&p->svms.objects, args->va_addr >>PAGE_SHIFT , (args->va_addr + args->size -1 ) >>PAGE_SHIFT )) { pr_err("Address: 0x%llx already allocated by SVM\n",
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 374/849 drm/amd/display: Support HW cursor 180 rot for any number of pipe splits
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Lipski <[email protected]>
[ Upstream commit 8a359f0f138d5ac7ceffd21b73279be50e516c0a ]
[Why]
For the HW cursor, its current position in the pipe_ctx->stream struct is not affected by the 180 rotation, i. e. the top left corner is still at 0,0. However, the DPP & HUBP set_cursor_position functions require rotated position.
The current approach is hard-coded for ODM 2:1, thus it's failing for ODM 4:1, resulting in a double cursor.
[How]
Instead of calculating the new cursor position relatively to the viewports, we calculate it using a viewavable clip_rect of each plane.
The clip_rects are first offset and scaled to the same space as the src_rect, i. e. Stream space -> Plane space.
In case of a pipe split, which divides the plane into 2 or more viewports, the clip_rect is the union of all the viewports of the given plane.
With the assumption that the viewports in HUBP's set_cursor_position are in the Plane space as well, it should produce a correct cursor position for any number of pipe splits.
--- .../amd/display/dc/hwss/dcn10/dcn10_hwseq.c | 73 +++++++------------ 1 file changed, 27 insertions(+), 46 deletions(-)
drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c +27 -46
@@ -3628,6 +3628,8 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)int y_plane = pipe_ctx->plane_state->dst_rect.y;int x_pos = pos_cpy.x;int y_pos = pos_cpy.y; +int clip_x = pipe_ctx->plane_state->clip_rect.x; +int clip_width = pipe_ctx->plane_state->clip_rect.width;if ((pipe_ctx->top_pipe !=NULL ) || (pipe_ctx->bottom_pipe !=NULL )) { if ((pipe_ctx->plane_state->src_rect.width != pipe_ctx->plane_res.scl_data.viewport.width) ||
@@ -3646,7 +3648,7 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)*/ /** -* Translate cursor from stream space to plane space. +* Translate cursor and clip offset from stream space to plane space. * * If the cursor is scaled then we need to scale the position * to be in the approximately correct place. We can't do anything
@@ -3663,6 +3665,10 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) pipe_ctx->plane_state->dst_rect.width; y_pos = (y_pos - y_plane) * pipe_ctx->plane_state->src_rect.height / pipe_ctx->plane_state->dst_rect.height; + clip_x = (clip_x - x_plane) * pipe_ctx->plane_state->src_rect.width / + pipe_ctx->plane_state->dst_rect.width; + clip_width = clip_width * pipe_ctx->plane_state->src_rect.width / + pipe_ctx->plane_state->dst_rect.width; }/**
@@ -3709,30 +3715,18 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)if (param.rotation ==ROTATION_ANGLE_0 ) { -int viewport_width = - pipe_ctx->plane_res.scl_data.viewport.width; -int viewport_x = - pipe_ctx->plane_res.scl_data.viewport.x;if (param.mirror) { -if (pipe_split_on || odm_combine_on) { -if (pos_cpy.x >= viewport_width + viewport_x) { - pos_cpy.x =2 * viewport_width - - pos_cpy.x +2 * viewport_x; - }else { -uint32_t temp_x = pos_cpy.x; - - pos_cpy.x =2 * viewport_x - pos_cpy.x; -if (temp_x >= viewport_x + - (int )hubp->curs_attr.width || pos_cpy.x - <= (int )hubp->curs_attr.width + - pipe_ctx->plane_state->src_rect.x) { - pos_cpy.x =2 * viewport_width - temp_x; - } - } - }else { - pos_cpy.x = viewport_width - pos_cpy.x +2 * viewport_x; - } +/* +* The plane is split into multiple viewports. +* The combination of all viewports span the +* entirety of the clip rect. +* +* For no pipe_split, viewport_width is represents +* the full width of the clip_rect, so we can just +* mirror it. +*/ + pos_cpy.x = clip_width - pos_cpy.x +2 * clip_x; } }// Swap axis and mirror horizontally
@@ -3802,30 +3796,17 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) }// Mirror horizontally and vertically else if (param.rotation ==ROTATION_ANGLE_180 ) { -int viewport_width = - pipe_ctx->plane_res.scl_data.viewport.width; -int viewport_x = - pipe_ctx->plane_res.scl_data.viewport.x; -if (!param.mirror) { -if (pipe_split_on || odm_combine_on) { -if (pos_cpy.x >= viewport_width + viewport_x) { - pos_cpy.x =2 * viewport_width - - pos_cpy.x +2 * viewport_x; - }else { -uint32_t temp_x = pos_cpy.x; - - pos_cpy.x =2 * viewport_x - pos_cpy.x; -if (temp_x >= viewport_x + - (int )hubp->curs_attr.width || pos_cpy.x - <= (int )hubp->curs_attr.width + - pipe_ctx->plane_state->src_rect.x) { - pos_cpy.x = temp_x + viewport_width; - } - } - }else { - pos_cpy.x = viewport_width - pos_cpy.x +2 * viewport_x; - } +/* +* The plane is split into multiple viewports. +* The combination of all viewports span the +* entirety of the clip rect. +* +* For no pipe_split, viewport_width is represents +* the full width of the clip_rect, so we can just +* mirror it. +*/ + pos_cpy.x = clip_width - pos_cpy.x +2 * clip_x; }/**
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 375/849 drm/amdkfd: Tie UNMAP_LATENCY to queue_preemption
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amber Lin <[email protected]>
[ Upstream commit f3820e9d356132e18405cd7606e22dc87ccfa6d1 ]
When KFD asks CP to preempt queues, other than preempt CP queues, CP also requests SDMA to preempt SDMA queues with UNMAP_LATENCY timeout. Currently queue_preemption_timeout_ms is 9000 ms by default but can be configured via module parameter. KFD_UNMAP_LATENCY_MS is hard coded as 4000 ms though. This patch ties KFD_UNMAP_LATENCY_MS to queue_preemption_timeout_ms so in a slow system such as emulator, both CP and SDMA slowness are taken into account.
--- drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdkfd/kfd_priv.h +8 -1
@@ -111,7 +111,14 @@#define KFD_KERNEL_QUEUE_SIZE 2048 -#define KFD_UNMAP_LATENCY_MS (4000) +/* KFD_UNMAP_LATENCY_MS is the timeout CP waiting for SDMA preemption. One XCC +* can be associated to 2 SDMA engines. queue_preemption_timeout_ms is the time +* driver waiting for CP returning the UNMAP_QUEUE fence. Thus the math is +* queue_preemption_timeout_ms = sdma_preemption_time * 2 + cp workload +* The format here makes CP workload 10% of total timeout +*/ +#define KFD_UNMAP_LATENCY_MS \ + ((queue_preemption_timeout_ms - queue_preemption_timeout_ms / 10) >> 1)#define KFD_MAX_SDMA_QUEUES 128
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 376/849 drm/amd/display: wait for otg update pending latch before clock optimization
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yihan Zhu <[email protected]>
[ Upstream commit f382e2d0faad0e0d73f626dbd71f2a4fce03975b ]
[WHY & HOW]
OTG pending update unlatched will cause system fail, wait OTG fully disabled to avoid this error.
--- .../drm/amd/display/dc/core/dc_hw_sequencer.c | 2 ++ .../amd/display/dc/inc/hw/timing_generator.h | 1 + .../drm/amd/display/dc/optc/dcn32/dcn32_optc.h | 1 + .../drm/amd/display/dc/optc/dcn35/dcn35_optc.c | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+)
drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c +2 -0
@@ -1177,6 +1177,8 @@ void hwss_wait_for_odm_update_pending_complete(struct dc *dc, struct dc_state *c tg = otg_master->stream_res.tg;if (tg->funcs->wait_odm_doublebuffer_pending_clear) tg->funcs->wait_odm_doublebuffer_pending_clear (tg); +if (tg->funcs->wait_otg_disable) + tg->funcs->wait_otg_disable (tg); }/* ODM update may require to reprogram blank pattern for each OPP */
drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h +1 -0
@@ -374,6 +374,7 @@ struct timing_generator_funcs {void (*wait_drr_doublebuffer_pending_clear)(struct timing_generator *tg);void (*set_long_vtotal)(struct timing_generator *optc,const struct long_vtotal_params *params);void (*wait_odm_doublebuffer_pending_clear)(struct timing_generator *tg); +void (*wait_otg_disable)(struct timing_generator *optc);bool (*get_optc_double_buffer_pending)(struct timing_generator *tg);bool (*get_otg_double_buffer_pending)(struct timing_generator *tg);bool (*get_pipe_update_pending)(struct timing_generator *tg);
drivers/gpu/drm/amd/display/dc/optc/dcn32/dcn32_optc.h +1 -0
@@ -62,6 +62,7 @@SF (OTG0_OTG_CONTROL ,OTG_DISABLE_POINT_CNTL , mask_sh),\SF (OTG0_OTG_CONTROL ,OTG_FIELD_NUMBER_CNTL , mask_sh),\SF (OTG0_OTG_CONTROL ,OTG_OUT_MUX , mask_sh),\ +SF (OTG0_OTG_CONTROL ,OTG_CURRENT_MASTER_EN_STATE , mask_sh),\SF (OTG0_OTG_STEREO_CONTROL ,OTG_STEREO_EN , mask_sh),\SF (OTG0_OTG_STEREO_CONTROL ,OTG_STEREO_SYNC_OUTPUT_LINE_NUM , mask_sh),\ SF(OTG0_OTG_STEREO_CONTROL, OTG_STEREO_SYNC_OUTPUT_POLARITY, mask_sh),\
drivers/gpu/drm/amd/display/dc/optc/dcn35/dcn35_optc.c +18 -0
@@ -162,6 +162,8 @@ static bool optc35_disable_crtc(struct timing_generator *optc)REG_WAIT (OTG_CLOCK_CONTROL ,OTG_BUSY ,0 ,1 ,100000 ); +REG_WAIT (OTG_CONTROL ,OTG_CURRENT_MASTER_EN_STATE ,0 ,1 ,100000 ); +optc1_clear_optc_underflow (optc);return true;
@@ -428,6 +430,21 @@ static void optc35_set_long_vtotal( } } +static void optc35_wait_otg_disable (struct timing_generator *optc) +{ +struct optc *optc1; +uint32_t is_master_en; + +if (!optc || !optc->ctx) +return ; + + optc1 =DCN10TG_FROM_TG (optc); + +REG_GET (OTG_CONTROL ,OTG_MASTER_EN , &is_master_en); +if (!is_master_en) +REG_WAIT (OTG_CLOCK_CONTROL ,OTG_CURRENT_MASTER_EN_STATE ,0 ,1 ,100000 ); +} +static const struct timing_generator_funcs dcn35_tg_funcs = { .validate_timing = optc1_validate_timing, .program_timing = optc1_program_timing,
@@ -479,6 +496,7 @@ static const struct timing_generator_funcs dcn35_tg_funcs = { .set_odm_bypass = optc32_set_odm_bypass, .set_odm_combine = optc35_set_odm_combine, .get_optc_source = optc2_get_optc_source, + .wait_otg_disable = optc35_wait_otg_disable, .set_h_timing_div_manual_mode = optc32_set_h_timing_div_manual_mode, .set_out_mux = optc3_set_out_mux, .set_drr_trigger_window = optc3_set_drr_trigger_window,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 377/849 drm/amd/display: Consider sink max slice width limitation for dsc
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dillon Varone <[email protected]>
[ Upstream commit 6b34e7ed4ba583ee77032a4c850ff97ba16ad870 ]
[WHY&HOW]
The sink max slice width limitation should be considered for DSC, but was removed in "refactor DSC cap calculations".
This patch adds it back and takes the valid minimum between the sink and source.
--- drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c +5 -0
@@ -1157,6 +1157,11 @@ static bool setup_dsc_config(if (!is_dsc_possible) goto done; +/* increase miniumum slice count to meet sink slice width limitations */ + min_slices_h =dc_fixpt_ceil (dc_fixpt_max ( +dc_fixpt_div_int (dc_fixpt_from_int (pic_width), dsc_common_caps.max_slice_width),// sink min +dc_fixpt_from_int (min_slices_h)));// source min + min_slices_h =fit_num_slices_up (dsc_common_caps.slice_caps, min_slices_h);/* increase minimum slice count to meet sink throughput limitations */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 378/849 drm/amdgpu/vpe: cancel delayed work in hw_fini
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit ec813f384b1a9df332e86ff46c422e5d2d00217f ]
We need to cancel any outstanding work at both suspend and driver teardown. Move the cancel to hw_fini which gets called in both cases.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c +2 -4
@@ -461,6 +461,8 @@ static int vpe_hw_fini(struct amdgpu_ip_block *ip_block)struct amdgpu_device *adev = ip_block->adev;struct amdgpu_vpe *vpe = &adev->vpe; +cancel_delayed_work_sync (&adev->vpe.idle_work); +vpe_ring_stop (vpe);/* Power off VPE */
@@ -471,10 +473,6 @@ static int vpe_hw_fini(struct amdgpu_ip_block *ip_block)static int vpe_suspend (struct amdgpu_ip_block *ip_block) { -struct amdgpu_device *adev = ip_block->adev; - -cancel_delayed_work_sync (&adev->vpe.idle_work); -return vpe_hw_fini (ip_block); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 379/849 drm/xe: Cancel pending TLB inval workers on teardown
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stuart Summers <[email protected]>
[ Upstream commit 76186a253a4b9eb41c5a83224c14efdf30960a71 ]
Add a new _fini() routine on the GT TLB invalidation side to handle this worker cleanup on driver teardown.
v2: Move the TLB teardown to the gt fini() routine called during
gt_init rather than in gt_alloc. This way the GT structure stays alive for while we reset the TLB state.
--- drivers/gpu/drm/xe/xe_gt.c | 2 ++ drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c | 12 ++++++++++++ drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h | 1 + 3 files changed, 15 insertions(+)
drivers/gpu/drm/xe/xe_gt.c +2 -0
@@ -605,6 +605,8 @@ static void xe_gt_fini(void *arg)struct xe_gt *gt = arg;int i; +xe_gt_tlb_invalidation_fini (gt); +for (i =0 ; i <XE_ENGINE_CLASS_MAX ; ++i)xe_hw_fence_irq_finish (>->fence_irq[i]);
drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c +12 -0
@@ -173,6 +173,18 @@ void xe_gt_tlb_invalidation_reset(struct xe_gt *gt)mutex_unlock (>->uc.guc.ct.lock); } +/** +* +* xe_gt_tlb_invalidation_fini - Clean up GT TLB invalidation state +* +* Cancel pending fence workers and clean up any additional +* GT TLB invalidation state. +*/ +void xe_gt_tlb_invalidation_fini (struct xe_gt *gt) +{ +xe_gt_tlb_invalidation_reset (gt); +} +static bool tlb_invalidation_seqno_past (struct xe_gt *gt,int seqno) {int seqno_recv =READ_ONCE (gt->tlb_invalidation.seqno_recv);
drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h +1 -0
@@ -16,6 +16,7 @@ struct xe_vm;struct xe_vma ;int xe_gt_tlb_invalidation_init_early (struct xe_gt *gt); +void xe_gt_tlb_invalidation_fini (struct xe_gt *gt);void xe_gt_tlb_invalidation_reset (struct xe_gt *gt);int xe_gt_tlb_invalidation_ggtt (struct xe_gt *gt);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 380/849 net: Prevent RPS table overwrite of active flows
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krishna Kumar <[email protected]>
[ Upstream commit 97bcc5b6f45425ac56fb04b0893cdaa607ec7e45 ]
This patch fixes an issue where two different flows on the same RXq produce the same hash resulting in continuous flow overwrites.
Flow #1: A packet for Flow #1 comes in, kernel calls the steering
function. The driver gives back a filter id. The kernel saves this filter id in the selected slot. Later, the driver's service task checks if any filters have expired and then installs the rule for Flow #1.
Flow #2: A packet for Flow #2 comes in. It goes through the same steps.
But this time, the chosen slot is being used by Flow #1. The driver gives a new filter id and the kernel saves it in the same slot. When the driver's service task runs, it runs through all the flows, checks if Flow #1 should be expired, the kernel returns True as the slot has a different filter id, and then the driver installs the rule for Flow #2.
Flow #1: Another packet for Flow #1 comes in. The same thing repeats.
The slot is overwritten with a new filter id for Flow #1.
This causes a repeated cycle of flow programming for missed packets, wasting CPU cycles while not improving performance. This problem happens at higher rates when the RPS table is small, but tests show it still happens even with 12,000 connections and an RPS size of 16K per queue (global table size = 144x16K = 64K).
This patch prevents overwriting an rps_dev_flow entry if it is active. The intention is that it is better to do aRFS for the first flow instead of hurting all flows on the same hash. Without this, two (or more) flows on one RX queue with the same hash can keep overwriting each other. This causes the driver to reprogram the flow repeatedly.
Changes:
1. Add a new 'hash' field to struct rps_dev_flow.
2. Add rps_flow_is_active(): a helper function to check if a flow is active or not, extracted from rps_may_expire_flow(). It is further simplified as per reviewer feedback.
3. In set_rps_cpu():
- Avoid overwriting by programming a new filter if:
- The slot is not in use, or
- The slot is in use but the flow is not active, or
- The slot has an active flow with the same hash, but target CPU differs.
- Save the hash in the rps_dev_flow entry.
4. rps_may_expire_flow(): Use earlier extracted rps_flow_is_active().
Testing & results:
- Driver: ice (E810 NIC), Kernel: net-next
- #CPUs = #RXq = 144 (1:1)
- Number of flows: 12K
- Eight RPS settings from 256 to 32768. Though RPS=256 is not ideal, it is still sufficient to cover 12K flows (256*144 rx-queues = 64K global table slots)
- Global Table Size = 144 * RPS (effectively equal to 256 * RPS)
- Each RPS test duration = 8 mins (org code) + 8 mins (new code).
- Metrics captured on client
Legend for following tables:
Steer-C: #times ndo_rx_flow_steer() was Called by set_rps_cpu() Steer-L: #times ice_arfs_flow_steer() Looped over aRFS entries Add: #times driver actually programmed aRFS (ice_arfs_build_entry()) Del: #times driver deleted the flow (ice_arfs_del_flow_rules()) Units: K = 1,000 times, M = 1 million times
|-------|---------|------| Org Code |---------|---------| | RPS | Latency | CPU | Add | Del | Steer-C | Steer-L | |-------|---------|------|--------|--------|---------|---------| | 256 | 227.0 | 93.2 | 1.6M | 1.6M | 121.7M | 267.6M | | 512 | 225.9 | 94.1 | 11.5M | 11.2M | 65.7M | 199.6M | | 1024 | 223.5 | 95.6 | 16.5M | 16.5M | 27.1M | 187.3M | | 2048 | 222.2 | 96.3 | 10.5M | 10.5M | 12.5M | 115.2M | | 4096 | 223.9 | 94.1 | 5.5M | 5.5M | 7.2M | 65.9M | | 8192 | 224.7 | 92.5 | 2.7M | 2.7M | 3.0M | 29.9M | | 16384 | 223.5 | 92.5 | 1.3M | 1.3M | 1.4M | 13.9M | | 32768 | 219.6 | 93.2 | 838.1K | 838.1K | 965.1K | 8.9M | |-------|---------|------| New Code |---------|---------| | 256 | 201.5 | 99.1 | 13.4K | 5.0K | 13.7K | 75.2K | | 512 | 202.5 | 98.2 | 11.2K | 5.9K | 11.2K | 55.5K | | 1024 | 207.3 | 93.9 | 11.5K | 9.7K | 11.5K | 59.6K | | 2048 | 207.5 | 96.7 | 11.8K | 11.1K | 15.5K | 79.3K | | 4096 | 206.9 | 96.6 | 11.8K | 11.7K | 11.8K | 63.2K | | 8192 | 205.8 | 96.7 | 11.9K | 11.8K | 11.9K | 63.9K | | 16384 | 200.9 | 98.2 | 11.9K | 11.9K | 11.9K | 64.2K | | 32768 | 202.5 | 98.0 | 11.9K | 11.9K | 11.9K | 64.2K | |-------|---------|------|--------|--------|---------|---------|
Some observations:
1. Overall Latency improved: (1790.19-1634.94)/1790.19*100 = 8.67%
2. Overall CPU increased: (777.32-751.49)/751.45*100 = 3.44%
3. Flow Management (add/delete) remained almost constant at ~11K compared to values in millions.
--- include/net/rps.h | 7 +++-- net/core/dev.c | 64 +++++++++++++++++++++++++++++++++++++++----- net/core/net-sysfs.c | 4 ++- 3 files changed, 65 insertions(+), 10 deletions(-)
include/net/rps.h +5 -2
@@ -25,13 +25,16 @@ struct rps_map {/* * The rps_dev_flow structure contains the mapping of a flow to a CPU, the -* tail pointer for that CPU's input queue at the time of last enqueue, and -* a hardware filter index. +* tail pointer for that CPU's input queue at the time of last enqueue, a +* hardware filter index, and the hash of the flow if aRFS is enabled. */ struct rps_dev_flow {u16 cpu;u16 filter;unsigned int last_qtail; +#ifdef CONFIG_RFS_ACCEL +u32 hash; +#endif };#define RPS_NO_FILTER 0xffff
net/core/dev.c +57 -7
102 lines not on this page · raw message
net/core/net-sysfs.c +3 -1
@@ -1120,8 +1120,10 @@ static ssize_t store_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,return -ENOMEM ; table->log =ilog2 (mask) +1 ; -for (count =0 ; count <= mask; count++) +for (count =0 ; count <= mask; count++) { table->flows[count].cpu =RPS_NO_CPU ; + table->flows[count].filter =RPS_NO_FILTER ; + } }else { table =NULL ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 381/849 eth: fbnic: Reset hw stats upon PCI error
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mohsin Bashir <[email protected]>
[ Upstream commit b1161b1863c5f3d592adba5accd6e5c79741720f ]
Upon experiencing a PCI error, fbnic reset the device to recover from the failure. Reset the hardware stats as part of the device reset to ensure accurate stats reporting.
Note that the reset is not really resetting the aggregate value to 0, which may result in a spike for a system collecting deltas in stats. Rather, the reset re-latches the current value as previous, in case HW got reset.
--- drivers/net/ethernet/meta/fbnic/fbnic_pci.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/meta/fbnic/fbnic_pci.c +2 -0
@@ -489,6 +489,8 @@ static void __fbnic_pm_attach(struct device *dev)struct net_device *netdev = fbd->netdev;struct fbnic_net *fbn; +fbnic_reset_hw_stats (fbd); +if (fbnic_init_failure (fbd))return ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 382/849 wifi: iwlwifi: mld: trigger mlo scan only when not in EMLSR
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Somashekhar Puttagangaiah <[email protected]>
[ Upstream commit 14a4aca568f6e78af7564c6fc5f1ecc1a5a32c33 ]
When beacon loss happens or the RSSI drops, trigger MLO scan only if not in EMLSR. The link switch was meant to be done when we are not in EMLSR and we can try to switch to a better link. If in EMLSR, we exit first and then trigger MLO scan.
--- drivers/net/wireless/intel/iwlwifi/mld/link.c | 7 +++++-- drivers/net/wireless/intel/iwlwifi/mld/stats.c | 11 +++++++---- 2 files changed, 12 insertions(+), 6 deletions(-)
drivers/net/wireless/intel/iwlwifi/mld/link.c +5 -2
@@ -573,8 +573,11 @@ void iwl_mld_handle_missed_beacon_notif(struct iwl_mld *mld,if (missed_bcon_since_rx >IWL_MLD_MISSED_BEACONS_THRESHOLD ) {ieee80211_cqm_beacon_loss_notify (vif,GFP_ATOMIC ); -/* try to switch links, no-op if we don't have MLO */ -iwl_mld_int_mlo_scan (mld, vif); +/* Not in EMLSR and we can't hear the link. +* Try to switch to a better link. EMLSR case is handled below. +*/ +if (!iwl_mld_emlsr_active (vif)) +iwl_mld_int_mlo_scan (mld, vif); }/* no more logic if we're not in EMLSR */
drivers/net/wireless/intel/iwlwifi/mld/stats.c +7 -4
@@ -379,11 +379,14 @@ static void iwl_mld_update_link_sig(struct ieee80211_vif *vif, int sig,/* TODO: task=statistics handle CQM notifications */ -if (sig <IWL_MLD_LOW_RSSI_MLO_SCAN_THRESH ) -iwl_mld_int_mlo_scan (mld, vif); - -if (!iwl_mld_emlsr_active (vif)) +if (!iwl_mld_emlsr_active (vif)) { +/* We're not in EMLSR and our signal is bad, +* try to switch link maybe. EMLSR will be handled below. +*/ +if (sig <IWL_MLD_LOW_RSSI_MLO_SCAN_THRESH ) +iwl_mld_int_mlo_scan (mld, vif);return ; + }/* We are in EMLSR, check if we need to exit */ exit_emlsr_thresh =
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 383/849 platform/x86/intel-uncore-freq: Fix warning in partitioned system
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Pandruvada <[email protected]>
[ Upstream commit 6d47b4f08436cb682fb2644e6265a3897fd42a77 ]
A partitioned system configured with only one package and one compute die, warning will be generated for duplicate sysfs entry. This typically occurs during the platform bring-up phase.
Partitioned systems expose dies, equivalent to TPMI compute domains, through the CPUID. Each partitioned system must contains at least one compute die per partition, resulting in a minimum of two dies per package. Hence the function topology_max_dies_per_package() returns at least two, and the condition "topology_max_dies_per_package() > 1" prevents the creation of a root domain.
In this case topology_max_dies_per_package() will return 1 and root domain will be created for partition 0 and a duplicate sysfs warning for partition 1 as both partitions have same package ID.
To address this also check for non zero partition in addition to topology_max_dies_per_package() > 1.
--- .../platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c +1 -1
@@ -638,7 +638,7 @@ static int uncore_probe(struct auxiliary_device *auxdev, const struct auxiliary_auxiliary_set_drvdata (auxdev, tpmi_uncore); -if (topology_max_dies_per_package () >1 ) +if (topology_max_dies_per_package () >1 || plat_info->partition)return 0 ; tpmi_uncore->root_cluster.root_domain = true;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 384/849 drm/msm/dpu: Filter modes based on adjusted mode clock
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jessica Zhang <[email protected]>
[ Upstream commit 62b7d68352881609e237b303fa391410ebc583a5 ]
Filter out modes that have a clock rate greater than the max core clock rate when adjusted for the perf clock factor
This is especially important for chipsets such as QCS615 that have lower limits for the MDP max core clock.
Since the core CRTC clock is at least the mode clock (adjusted for the perf clock factor) [1], the modes supported by the driver should be less than the max core clock rate.
[1] https://elixir.bootlin.com/linux/v6.12.4/source/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c#L83
Patchwork: https://patchwork.freedesktop.org/patch/652041/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 35 +++++++++++++------ drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h | 3 ++ drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 12 +++++++ 3 files changed, 39 insertions(+), 11 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c +24 -11
@@ -31,6 +31,26 @@ enum dpu_perf_mode { DPU_PERF_MODE_MAX }; +/** +* dpu_core_perf_adjusted_mode_clk - Adjust given mode clock rate according to +* the perf clock factor. +* @crtc_clk_rate - Unadjusted mode clock rate +* @perf_cfg: performance configuration +*/ +u64 dpu_core_perf_adjusted_mode_clk (u64 mode_clk_rate, +const struct dpu_perf_cfg *perf_cfg) +{ +u32 clk_factor; + + clk_factor = perf_cfg->clk_inefficiency_factor; +if (clk_factor) { + mode_clk_rate *= clk_factor; +do_div (mode_clk_rate,100 ); + } + +return mode_clk_rate; +} +/** * _dpu_core_perf_calc_bw() - to calculate BW per crtc * @perf_cfg: performance configuration
@@ -75,28 +95,21 @@ static u64 _dpu_core_perf_calc_clk(const struct dpu_perf_cfg *perf_cfg,struct drm_plane *plane;struct dpu_plane_state *pstate;struct drm_display_mode *mode; -u64 crtc_clk; -u32 clk_factor; +u64 mode_clk; mode = &state->adjusted_mode; - crtc_clk = (u64 )mode->vtotal * mode->hdisplay *drm_mode_vrefresh (mode); + mode_clk = (u64 )mode->vtotal * mode->hdisplay *drm_mode_vrefresh (mode);drm_atomic_crtc_for_each_plane (plane, crtc) { pstate =to_dpu_plane_state (plane->state);if (!pstate)continue ; - crtc_clk =max (pstate->plane_clk, crtc_clk); - } - - clk_factor = perf_cfg->clk_inefficiency_factor; -if (clk_factor) { - crtc_clk *= clk_factor; -do_div (crtc_clk,100 ); + mode_clk =max (pstate->plane_clk, mode_clk); } -return crtc_clk; +return dpu_core_perf_adjusted_mode_clk (mode_clk, perf_cfg); }static struct dpu_kms *_dpu_crtc_get_kms (struct drm_crtc *crtc)
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h +3 -0
@@ -54,6 +54,9 @@ struct dpu_core_perf {u32 fix_core_ab_vote; }; +u64 dpu_core_perf_adjusted_mode_clk (u64 clk_rate, +const struct dpu_perf_cfg *perf_cfg); +int dpu_core_perf_crtc_check (struct drm_crtc *crtc,struct drm_crtc_state *state);
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +12 -0
@@ -1534,6 +1534,7 @@ static enum drm_mode_status dpu_crtc_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode *mode) {struct dpu_kms *dpu_kms =_dpu_crtc_get_kms (crtc); +u64 adjusted_mode_clk;/* if there is no 3d_mux block we cannot merge LMs so we cannot * split the large layer into 2 LMs, filter out such modes
@@ -1541,6 +1542,17 @@ static enum drm_mode_status dpu_crtc_mode_valid(struct drm_crtc *crtc,if (!dpu_kms->catalog->caps->has_3d_merge && mode->hdisplay > dpu_kms->catalog->caps->max_mixer_width)return MODE_BAD_HVALUE ; + + adjusted_mode_clk =dpu_core_perf_adjusted_mode_clk (mode->clock, + dpu_kms->perf.perf_cfg); + +/* +* The given mode, adjusted for the perf clock factor, should not exceed +* the max core clock rate +*/ +if (dpu_kms->perf.max_core_clk_rate < adjusted_mode_clk *1000 ) +return MODE_CLOCK_HIGH ; +/* * max crtc width is equal to the max mixer width * 2 and max height is 4K */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 385/849 drm/msm: Use of_reserved_mem_region_to_resource() for "memory-region"
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Herring (Arm) <[email protected]>
[ Upstream commit fb53e8f09fc1e1a343fd08ea4f353f81613975d7 ]
Use the newly added of_reserved_mem_region_to_resource() function to handle "memory-region" properties.
The original code did not set 'zap_available' to false if of_address_to_resource() failed which seems like an oversight.
Patchwork: https://patchwork.freedesktop.org/patch/662275/
--- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-)
drivers/gpu/drm/msm/adreno/adreno_gpu.c +5 -12
@@ -10,7 +10,7 @@#include <linux/interconnect.h> #include <linux/firmware/qcom/qcom_scm.h> #include <linux/kernel.h> -#include <linux/of_address.h> +#include <linux/of_reserved_mem.h> #include <linux/pm_opp.h> #include <linux/slab.h> #include <linux/soc/qcom/mdt_loader.h>
@@ -33,7 +33,7 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname,struct device *dev = &gpu->pdev->dev;const struct firmware *fw;const char *signed_fwname =NULL ; -struct device_node *np, *mem_np; +struct device_node *np;struct resource r;phys_addr_t mem_phys;ssize_t mem_size;
@@ -51,18 +51,11 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname,return -ENODEV ; } - mem_np =of_parse_phandle (np,"memory-region" ,0 ); -of_node_put (np); -if (!mem_np) { + ret =of_reserved_mem_region_to_resource (np,0 , &r); +if (ret) { zap_available = false; -return -EINVAL ; - } - - ret =of_address_to_resource (mem_np,0 , &r); -of_node_put (mem_np); -if (ret)return ret; - + } mem_phys = r.start;/*
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 386/849 selftests: drv-net: rss_ctx: fix the queue count check
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit c158b5a570a188b990ef10ded172b8b93e737826 ]
Commit 0d6ccfe6b319 ("selftests: drv-net: rss_ctx: check for all-zero keys") added a skip exception if NIC has fewer than 3 queues enabled, but it's just constructing the object, it's not actually rising this exception.
Before:
# Exception| net.lib.py.utils.CmdExitFailure: Command failed: ethtool -X enp1s0 equal 3 hkey d1:cc:77:47:9d:ea:15:f2:b9:6c:ef:68:62:c0:45:d5:b0:99:7d:cf:29:53:40:06:3d:8e:b9:bc:d4:70:89:b8:8d:59:04:ea:a9:c2:21:b3:55:b8:ab:6b:d9:48:b4:bd:4c:ff:a5:f0:a8:c2 not ok 1 rss_ctx.test_rss_key_indir
After:
ok 1 rss_ctx.test_rss_key_indir # SKIP Device has fewer than 3 queues (or doesn't support queue stats)
--- tools/testing/selftests/drivers/net/hw/rss_ctx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/drivers/net/hw/rss_ctx.py +1 -1
@@ -118,7 +118,7 @@ def test_rss_key_indir(cfg): qcnt = len(_get_rx_cnts(cfg)) if qcnt < 3: - KsftSkipEx("Device has fewer than 3 queues (or doesn't support queue stats)") + raise KsftSkipEx("Device has fewer than 3 queues (or doesn't support queue stats)") data = get_rss(cfg) want_keys = ['rss-hash-key', 'rss-hash-function', 'rss-indirection-table']
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 387/849 media: fix uninitialized symbol warnings
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chelsy Ratnawat <[email protected]>
[ Upstream commit b4c441310c3baaa7c39a5457e305ca93c7a0400d ]
Initialize variables to fix these smatch warnings drivers/media/i2c/ir-kbd-i2c.c:339 ir_key_poll() error: uninitialized symbol 'protocol'.drivers/media/i2c/ir-kbd-i2c.c:339 ir_key_poll() error: uninitialized symbol 'scancode'.drivers/media/i2c/ir-kbd-i2c.c:339 ir_key_poll() error: uninitialized symbol 'toggle'.drivers/media/tuners/xc4000.c:1102 xc_debug_dump() error: uninitialized symbol 'adc_envelope'.drivers/media/tuners/xc4000.c:1108 xc_debug_dump() error: uninitialized symbol 'lock_status'.drivers/media/tuners/xc4000.c:1123 xc_debug_dump() error: uninitialized symbol 'frame_lines'.drivers/media/tuners/xc4000.c:1127 xc_debug_dump() error: uninitialized symbol 'quality'.drivers/media/tuners/xc5000.c:645 xc_debug_dump() error: uninitialized symbol 'adc_envelope'.drivers/media/tuners/xc5000.c:651 xc_debug_dump() error: uninitialized symbol 'lock_status'.drivers/media/tuners/xc5000.c:665 xc_debug_dump() error: uninitialized symbol 'frame_lines'.drivers/media/tuners/xc5000.c:668 xc_debug_dump() error: uninitialized symbol 'quality'.drivers/media/tuners/xc5000.c:671 xc_debug_dump() error: uninitialized symbol 'snr'.drivers/media/tuners/xc5000.c:674 xc_debug_dump() error: uninitialized symbol 'totalgain'.
--- drivers/media/i2c/ir-kbd-i2c.c | 6 +++--- drivers/media/tuners/xc4000.c | 8 ++++---- drivers/media/tuners/xc5000.c | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-)
drivers/media/i2c/ir-kbd-i2c.c +3 -3
@@ -321,9 +321,9 @@ static int get_key_avermedia_cardbus(struct IR_i2c *ir, enum rc_proto *protocol,static int ir_key_poll (struct IR_i2c *ir) { -enum rc_proto protocol; -u32 scancode; -u8 toggle; +enum rc_proto protocol =0 ; +u32 scancode =0 ; +u8 toggle =0 ;int rc;dev_dbg (&ir->rc->dev,"%s\n" , __func__);
drivers/media/tuners/xc4000.c +4 -4
@@ -1087,12 +1087,12 @@ static int check_firmware(struct dvb_frontend *fe, unsigned int type,static void xc_debug_dump (struct xc4000_priv *priv) { -u16 adc_envelope; +u16 adc_envelope =0 ;u32 freq_error_hz =0 ; -u16 lock_status; +u16 lock_status =0 ;u32 hsync_freq_hz =0 ; -u16 frame_lines; -u16 quality; +u16 frame_lines =0 ; +u16 quality =0 ;u16 signal =0 ;u16 noise =0 ;u8 hw_majorversion =0 , hw_minorversion =0 ;
drivers/media/tuners/xc5000.c +6 -6
@@ -622,14 +622,14 @@ static int xc5000_fwupload(struct dvb_frontend *fe,static void xc_debug_dump (struct xc5000_priv *priv) { -u16 adc_envelope; +u16 adc_envelope =0 ;u32 freq_error_hz =0 ; -u16 lock_status; +u16 lock_status =0 ;u32 hsync_freq_hz =0 ; -u16 frame_lines; -u16 quality; -u16 snr; -u16 totalgain; +u16 frame_lines =0 ; +u16 quality =0 ; +u16 snr =0 ; +u16 totalgain =0 ;u8 hw_majorversion =0 , hw_minorversion =0 ;u8 fw_majorversion =0 , fw_minorversion =0 ;u16 fw_buildversion =0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 388/849 media: pci: mgb4: Fix timings comparison in VIDIOC_S_DV_TIMINGS
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Tůma <[email protected]>
[ Upstream commit 0750649b528ff18d1d68aecb45b34ec22d5ab778 ]
Compare the whole v4l2_bt_timings struct, not just the width/height when setting new timings. Timings with the same resolution and different pixelclock can now be properly set.
--- drivers/media/pci/mgb4/mgb4_vin.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/media/pci/mgb4/mgb4_vin.c +1 -2
@@ -610,8 +610,7 @@ static int vidioc_s_dv_timings(struct file *file, void *fh, timings->bt.height < video_timings_cap.bt.min_height || timings->bt.height > video_timings_cap.bt.max_height) return -EINVAL; -if (timings->bt.width == vindev->timings.bt.width && - timings->bt.height == vindev->timings.bt.height) +if (v4l2_match_dv_timings (timings, &vindev->timings,0 , false))return 0 ;if (vb2_is_busy (&vindev->queue))return -EBUSY ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 389/849 ASoC: SOF: ipc4-pcm: Add fixup for channels
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Ujfalusi <[email protected]>
[ Upstream commit 6ad299a9b968e1c63988e2a327295e522cf6bbf5 ]
We can have modules in path which can change the number of channels and in this case the BE params needs to be adjusted to configure the DAI according to the copier configuration.
Message-ID: <[email protected]>
--- sound/soc/sof/ipc4-pcm.c | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+)
sound/soc/sof/ipc4-pcm.c +56 -0
@@ -738,6 +738,58 @@ static int sof_ipc4_pcm_dai_link_fixup_rate(struct snd_sof_dev *sdev,return 0 ; } +static int sof_ipc4_pcm_dai_link_fixup_channels (struct snd_sof_dev *sdev, +struct snd_pcm_hw_params *params, +struct sof_ipc4_copier *ipc4_copier) +{ +struct sof_ipc4_pin_format *pin_fmts = ipc4_copier->available_fmt.input_pin_fmts; +struct snd_interval *channels =hw_param_interval (params,SNDRV_PCM_HW_PARAM_CHANNELS ); +int num_input_formats = ipc4_copier->available_fmt.num_input_formats; +unsigned int fe_channels =params_channels (params); +bool fe_be_match = false; +bool single_be_channels = true; +unsigned int be_channels, val; +int i; + +if (WARN_ON_ONCE (!num_input_formats)) +return -EINVAL ; + +/* +* Copier does not change channels, so we +* need to only consider the input pin information. +*/ + be_channels =SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT (pin_fmts[0 ].audio_fmt.fmt_cfg); +for (i =0 ; i < num_input_formats; i++) { + val =SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT (pin_fmts[i].audio_fmt.fmt_cfg); + +if (val != be_channels) + single_be_channels = false; + +if (val == fe_channels) { + fe_be_match = true; +break ; + } + } + +/* +* If channels is different than FE channels, topology must contain a +* module which can change the number of channels. But we do require +* topology to define a single channels in the DAI copier config in +* this case (FE channels may be variable). +*/ +if (!fe_be_match) { +if (!single_be_channels) { +dev_err (sdev->dev,"Unable to select channels for DAI link\n" ); +return -EINVAL ; + } + + channels->min = be_channels; + channels->max = be_channels; + } + +return 0 ; +} +static int sof_ipc4_pcm_dai_link_fixup (struct snd_soc_pcm_runtime *rtd,struct snd_pcm_hw_params *params) {
@@ -801,6 +853,10 @@ static int sof_ipc4_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,if (ret)return ret; + ret =sof_ipc4_pcm_dai_link_fixup_channels (sdev, params, ipc4_copier); +if (ret) +return ret; +if (single_bitdepth) {snd_mask_none (fmt); valid_bits =SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH (ipc4_fmt->fmt_cfg);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 390/849 drm/amdgpu: Notify pmfw bad page threshold exceeded
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Liu <[email protected]>
[ Upstream commit c8d6e90abe50377110f92702fbebc6efdd22391d ]
Notify pmfw when bad page threshold is exceeded, no matter the module parameter 'bad_page_threshold' is set or not.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c +3 -2
@@ -774,9 +774,10 @@ amdgpu_ras_eeprom_update_header(struct amdgpu_ras_eeprom_control *control) control->tbl_rai.health_percent =0 ; } ras->is_rma = true; -/* ignore the -ENOTSUPP return value */ -amdgpu_dpm_send_rma_reason (adev); } + +/* ignore the -ENOTSUPP return value */ +amdgpu_dpm_send_rma_reason (adev); }if (control->tbl_hdr.version >=RAS_TABLE_VER_V2_1 )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 391/849 drm/amd/display: Increase minimum clock for TMDS 420 with pipe splitting
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Relja Vojvodic <[email protected]>
[ Upstream commit 002a612023c8b105bd3829d81862dee04368d6de ]
[Why]
-Pipe splitting allows for clocks to be reduced, but when using TMDS 420, reduced clocks lead to missed clocks cycles on clock resyncing
[How]
-Impose a minimum clock when using TMDS 420
--- .../src/dml2_core/dml2_core_dcn4_calcs.c | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-)
drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c +19 -9
@@ -1238,18 +1238,27 @@ static void CalculateDETBufferSize(static double CalculateRequiredDispclk (enum dml2_odm_mode ODMMode, -double PixelClock) +double PixelClock, +bool isTMDS420) { +double DispClk;if (ODMMode == dml2_odm_mode_combine_4to1) { -return PixelClock /4.0 ; + DispClk = PixelClock /4.0 ; }else if (ODMMode == dml2_odm_mode_combine_3to1) { -return PixelClock /3.0 ; + DispClk = PixelClock /3.0 ; }else if (ODMMode == dml2_odm_mode_combine_2to1) { -return PixelClock /2.0 ; + DispClk = PixelClock /2.0 ; }else { -return PixelClock; + DispClk = PixelClock; + } + +if (isTMDS420) { +double TMDS420MinPixClock = PixelClock /2.0 ; + DispClk =math_max2 (DispClk, TMDS420MinPixClock); } + +return DispClk; } static double TruncToValidBPP(
@@ -4122,11 +4131,12 @@ static noinline_for_stack void CalculateODMMode(bool success;bool UseDSC = DSCEnable && (NumberOfDSCSlices >0 );enum dml2_odm_mode DecidedODMMode; +bool isTMDS420 = (OutFormat == dml2_420 && Output == dml2_hdmi); - SurfaceRequiredDISPCLKWithoutODMCombine =CalculateRequiredDispclk (dml2_odm_mode_bypass, PixelClock); - SurfaceRequiredDISPCLKWithODMCombineTwoToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_2to1, PixelClock); - SurfaceRequiredDISPCLKWithODMCombineThreeToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_3to1, PixelClock); - SurfaceRequiredDISPCLKWithODMCombineFourToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_4to1, PixelClock); + SurfaceRequiredDISPCLKWithoutODMCombine =CalculateRequiredDispclk (dml2_odm_mode_bypass, PixelClock, isTMDS420); + SurfaceRequiredDISPCLKWithODMCombineTwoToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_2to1, PixelClock, isTMDS420); + SurfaceRequiredDISPCLKWithODMCombineThreeToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_3to1, PixelClock, isTMDS420); + SurfaceRequiredDISPCLKWithODMCombineFourToOne =CalculateRequiredDispclk (dml2_odm_mode_combine_4to1, PixelClock, isTMDS420);#ifdef __DML_VBA_DEBUG__DML_LOG_VERBOSE ("DML::%s: ODMUse = %d\n" , __func__, ODMUse);DML_LOG_VERBOSE ("DML::%s: Output = %d\n" , __func__, Output);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 392/849 drm/amdgpu: Avoid jpeg v5.0.1 poison irq call trace on sriov guest
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mangesh Gadre <[email protected]>
[ Upstream commit 01152c30eef972c5ca3b3eeb14f2984fa48d18c2 ]
Sriov guest side doesn't init ras feature hence the poison irq shouldn't be put during hw fini
--- drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c +1 -1
@@ -315,7 +315,7 @@ static int jpeg_v5_0_1_hw_fini(struct amdgpu_ip_block *ip_block) ret =jpeg_v5_0_1_set_powergating_state (ip_block,AMD_PG_STATE_GATE ); } -if (amdgpu_ras_is_supported (adev,AMDGPU_RAS_BLOCK__JPEG )) +if (amdgpu_ras_is_supported (adev,AMDGPU_RAS_BLOCK__JPEG ) && !amdgpu_sriov_vf (adev))amdgpu_irq_put (adev, &adev->jpeg.inst->ras_poison_irq,0 );return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 393/849 drm/amd/display: incorrect conditions for failing dto calculations
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Clay King <[email protected]>
[ Upstream commit 306cbcc6f687d791ab3cc8fbbe30f5286fd0d1e5 ]
[Why & How]
Previously, when calculating dto phase, we would incorrectly fail when phase <=0 without additionally checking for the integer value. This meant that calculations would incorrectly fail when the desired pixel clock was an exact multiple of the reference clock.
--- drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c +1 -1
@@ -619,7 +619,7 @@ void dccg401_set_dp_dto( dto_integer =div_u64 (params->pixclk_hz, dto_modulo_hz); dto_phase_hz = params->pixclk_hz - dto_integer * dto_modulo_hz; -if (dto_phase_hz <=0 ) { +if (dto_phase_hz <=0 && dto_integer <=0 ) {/* negative pixel rate should never happen */ BREAK_TO_DEBUGGER ();return ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 394/849 drm/amdgpu: Avoid vcn v5.0.1 poison irq call trace on sriov guest
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mangesh Gadre <[email protected]>
[ Upstream commit 37551277dfed796b6749e4fa52bdb62403cfdb42 ]
Sriov guest side doesn't init ras feature hence the poison irq shouldn't be put during hw fini
--- drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c +1 -1
@@ -284,7 +284,7 @@ static int vcn_v5_0_1_hw_fini(struct amdgpu_ip_block *ip_block) vinst->set_pg_state (vinst,AMD_PG_STATE_GATE ); } -if (amdgpu_ras_is_supported (adev,AMDGPU_RAS_BLOCK__VCN )) +if (amdgpu_ras_is_supported (adev,AMDGPU_RAS_BLOCK__VCN ) && !amdgpu_sriov_vf (adev))amdgpu_irq_put (adev, &adev->vcn.inst->ras_poison_irq,0 );return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 395/849 drm/amdgpu: Respect max pixel clock for HDMI and DVI-D (v2)
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit 585b2f685c56c5095cc22c7202bf74d8e9a73cdd ]
Update the legacy (non-DC) display code to respect the maximum pixel clock for HDMI and DVI-D. Reject modes that would require a higher pixel clock than can be supported.
Also update the maximum supported HDMI clock value depending on the ASIC type.
For reference, see the DC code:
check max_hdmi_pixel_clock in dce*_resource.c
v2:
Fix maximum clocks for DVI-D and DVI/HDMI adapters.
--- .../gpu/drm/amd/amdgpu/amdgpu_connectors.c | 57 ++++++++++++++----- 1 file changed, 44 insertions(+), 13 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +44 -13
@@ -1195,29 +1195,60 @@ static void amdgpu_connector_dvi_force(struct drm_connector *connector) amdgpu_connector->use_digital = true; } +/** +* Returns the maximum supported HDMI (TMDS) pixel clock in KHz. +*/ +static int amdgpu_max_hdmi_pixel_clock (const struct amdgpu_device *adev) +{ +if (adev->asic_type >=CHIP_POLARIS10 ) +return 600000 ; +else if (adev->asic_type >=CHIP_TONGA ) +return 300000 ; +else +return 297000 ; +} + +/** +* Validates the given display mode on DVI and HDMI connectors, +* including analog signals on DVI-I. +*/ static enum drm_mode_status amdgpu_connector_dvi_mode_valid (struct drm_connector *connector,const struct drm_display_mode *mode) {struct drm_device *dev = connector->dev;struct amdgpu_device *adev =drm_to_adev (dev);struct amdgpu_connector *amdgpu_connector =to_amdgpu_connector (connector); +const int max_hdmi_pixel_clock =amdgpu_max_hdmi_pixel_clock (adev); +const int max_dvi_single_link_pixel_clock =165000 ; +int max_digital_pixel_clock_khz;/* XXX check mode bandwidth */ -if (amdgpu_connector->use_digital && (mode->clock >165000 )) { -if ((amdgpu_connector->connector_object_id ==CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I ) || - (amdgpu_connector->connector_object_id ==CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D ) || - (amdgpu_connector->connector_object_id ==CONNECTOR_OBJECT_ID_HDMI_TYPE_B )) { -return MODE_OK ; - }else if (connector->display_info.is_hdmi) { -/* HDMI 1.3+ supports max clock of 340 Mhz */ -if (mode->clock >340000 ) -return MODE_CLOCK_HIGH ; -else -return MODE_OK ; - }else { -return MODE_CLOCK_HIGH ; +if (amdgpu_connector->use_digital) { +switch (amdgpu_connector->connector_object_id) { +case CONNECTOR_OBJECT_ID_HDMI_TYPE_A : + max_digital_pixel_clock_khz = max_hdmi_pixel_clock; +break ; +case CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I : +case CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D : + max_digital_pixel_clock_khz = max_dvi_single_link_pixel_clock; +break ; +case CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I : +case CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D : +case CONNECTOR_OBJECT_ID_HDMI_TYPE_B : + max_digital_pixel_clock_khz = max_dvi_single_link_pixel_clock *2 ; +break ; } + +/* When the display EDID claims that it's an HDMI display, +* we use the HDMI encoder mode of the display HW, +* so we should verify against the max HDMI clock here. +*/ +if (connector->display_info.is_hdmi) + max_digital_pixel_clock_khz = max_hdmi_pixel_clock; + +if (mode->clock > max_digital_pixel_clock_khz) +return MODE_CLOCK_HIGH ; }/* check against the max pixel clock */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 396/849 mips: lantiq: danube: add missing properties to cpu node
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit e8dee66c37085dc9858eb8608bc783c2900e50e7 ]
This fixes the following warnings:arch/mips/boot/dts/lantiq/danube_easy50712.dtb: cpus: '#address-cells' is a required property
from schema $id: http://devicetree.org/schemas/cpus.yaml#arch/mips/boot/dts/lantiq/danube_easy50712.dtb: cpus: '#size-cells' is a required property
from schema $id: http://devicetree.org/schemas/cpus.yaml#arch/mips/boot/dts/lantiq/danube_easy50712.dtb: cpu@0 (mips,mips24Kc): 'reg' is a required property
from schema $id: http://devicetree.org/schemas/mips/cpus.yaml#
--- arch/mips/boot/dts/lantiq/danube.dtsi | 4 ++++ 1 file changed, 4 insertions(+)
arch/mips/boot/dts/lantiq/danube.dtsi +4 -0
@@ -5,8 +5,12 @@ compatible = "lantiq,xway", "lantiq,danube"; cpus { + #address-cells = <1>; + #size-cells = <0>; + cpu@0 { compatible = "mips,mips24Kc"; + reg = <0>; }; };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 397/849 mips: lantiq: danube: add model to EASY50712 dts
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit cb96fd880ef78500b34d10fa76ddd3fa070287d6 ]
This fixes the following warning:arch/mips/boot/dts/lantiq/danube_easy50712.dtb: / (lantiq,xway): 'model' is a required property
from schema $id: http://devicetree.org/schemas/root-node.yaml#
--- arch/mips/boot/dts/lantiq/danube_easy50712.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/mips/boot/dts/lantiq/danube_easy50712.dts +2 -0
@@ -4,6 +4,8 @@ /include/ "danube.dtsi" / { + model = "Intel EASY50712"; + chosen { bootargs = "console=ttyLTQ0,115200 init=/etc/preinit"; };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 398/849 mips: lantiq: danube: add missing device_type in pci node
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit d66949a1875352d2ddd52b144333288952a9e36f ]
This fixes the following warning:arch/mips/boot/dts/lantiq/danube_easy50712.dtb: pci@e105400 (lantiq,pci-xway): 'device_type' is a required property
from schema $id: http://devicetree.org/schemas/pci/pci-bus-common.yaml#
--- arch/mips/boot/dts/lantiq/danube.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/mips/boot/dts/lantiq/danube.dtsi +2 -0
@@ -104,6 +104,8 @@ 0x1000000 0 0x00000000 0xae00000 0 0x200000>; /* io space */ reg = <0x7000000 0x8000 /* config space */ 0xe105400 0x400>; /* pci bridge */ + + device_type = "pci"; }; }; };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 399/849 mips: lantiq: xway: sysctrl: rename stp clock
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit b0d04fe6a633ada2c7bc1b5ddd011cbd85961868 ]
Bindig requires a node name matching ‘^gpio@[0-9a-f]+$’. This patch changes the clock name from “stp” to “gpio”.
--- arch/mips/lantiq/xway/sysctrl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/lantiq/xway/sysctrl.c +1 -1
@@ -485,7 +485,7 @@ void __init ltq_soc_init(void)/* add our generic xway clocks */ clkdev_add_pmu ("10000000.fpi" ,NULL ,0 ,0 ,PMU_FPI );clkdev_add_pmu ("1e100a00.gptu" ,NULL ,1 ,0 ,PMU_GPT ); -clkdev_add_pmu ("1e100bb0.stp" ,NULL ,1 ,0 ,PMU_STP ); +clkdev_add_pmu ("1e100bb0.gpio" ,NULL ,1 ,0 ,PMU_STP );clkdev_add_pmu ("1e100c00.serial" ,NULL ,0 ,0 ,PMU_ASC1 );clkdev_add_pmu ("1e104100.dma" ,NULL ,1 ,0 ,PMU_DMA );clkdev_add_pmu ("1e100800.spi" ,NULL ,1 ,0 ,PMU_SPI );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 400/849 mips: lantiq: danube: rename stp node on EASY50712 reference board
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit 2b9706ce84be9cb26be03e1ad2e43ec8bc3986be ]
This fixes the following warning:arch/mips/boot/dts/lantiq/danube_easy50712.dtb: stp@e100bb0 (lantiq,gpio-stp-xway): $nodename:0: 'stp@e100bb0' does not match '^gpio@[0-9a-f]+$'
from schema $id: http://devicetree.org/schemas/gpio/gpio-stp-xway.yaml#
--- arch/mips/boot/dts/lantiq/danube_easy50712.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/boot/dts/lantiq/danube_easy50712.dts +1 -1
@@ -96,7 +96,7 @@ lantiq,tx-burst-length = <4>; }; - stp0: stp@e100bb0 { + stp0: gpio@e100bb0 { #gpio-cells = <2>; compatible = "lantiq,gpio-stp-xway"; gpio-controller;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 401/849 inet_diag: annotate data-races in inet_diag_bc_sk()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 4fd84a0aaf2ba125b441aa09d415022385e66bf2 ]
inet_diag_bc_sk() runs with an unlocked socket, annotate potential races with READ_ONCE().
--- net/ipv4/inet_diag.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
net/ipv4/inet_diag.c +7 -7
@@ -785,7 +785,7 @@ static void entry_fill_addrs(struct inet_diag_entry *entry, const struct sock *sk) {#if IS_ENABLED (CONFIG_IPV6 ) -if (sk->sk_family ==AF_INET6 ) { +if (entry->family ==AF_INET6 ) { entry->saddr = sk->sk_v6_rcv_saddr.s6_addr32; entry->daddr = sk->sk_v6_daddr.s6_addr32; }else
@@ -798,18 +798,18 @@ static void entry_fill_addrs(struct inet_diag_entry *entry,int inet_diag_bc_sk (const struct nlattr *bc,struct sock *sk) { -struct inet_sock *inet =inet_sk (sk); +const struct inet_sock *inet =inet_sk (sk);struct inet_diag_entry entry;if (!bc)return 1 ; - entry.family = sk->sk_family; + entry.family =READ_ONCE (sk->sk_family);entry_fill_addrs (&entry, sk); - entry.sport = inet->inet_num; - entry.dport =ntohs (inet->inet_dport); - entry.ifindex = sk->sk_bound_dev_if; - entry.userlocks =sk_fullsock (sk) ? sk->sk_userlocks :0 ; + entry.sport =READ_ONCE (inet->inet_num); + entry.dport =ntohs (READ_ONCE (inet->inet_dport)); + entry.ifindex =READ_ONCE (sk->sk_bound_dev_if); + entry.userlocks =sk_fullsock (sk) ?READ_ONCE (sk->sk_userlocks) :0 ;if (sk_fullsock (sk)) entry.mark =READ_ONCE (sk->sk_mark);else if (sk->sk_state ==TCP_NEW_SYN_RECV )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 402/849 microchip: lan865x: add ndo_eth_ioctl handler to enable PHY ioctl support
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Parthiban Veerasooran <[email protected]>
[ Upstream commit 34c21e91192aa1ff66f9d6cef8132717840d04e6 ]
Introduce support for standard MII ioctl operations in the LAN865x Ethernet driver by implementing the .ndo_eth_ioctl callback. This allows PHY-related ioctl commands to be handled via phy_do_ioctl_running() and enables support for ethtool and other user-space tools that rely on ioctl interface to perform PHY register access using commands like SIOCGMIIREG and SIOCSMIIREG.
This feature enables improved diagnostics and PHY configuration capabilities from userspace.
--- drivers/net/ethernet/microchip/lan865x/lan865x.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/microchip/lan865x/lan865x.c +1 -0
@@ -326,6 +326,7 @@ static const struct net_device_ops lan865x_netdev_ops = { .ndo_start_xmit = lan865x_send_packet, .ndo_set_rx_mode = lan865x_set_multicast_list, .ndo_set_mac_address = lan865x_set_mac_address, + .ndo_eth_ioctl = phy_do_ioctl_running, };static int lan865x_probe (struct spi_device *spi)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 403/849 tcp: use dst_dev_rcu() in tcp_fastopen_active_disable_ofo_check()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit b62a59c18b692f892dcb8109c1c2e653b2abc95c ]
Use RCU to avoid a pair of atomic operations and a potential UAF on dst_dev()->flags.
--- net/ipv4/tcp_fastopen.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/ipv4/tcp_fastopen.c +4 -3
@@ -576,11 +576,12 @@ void tcp_fastopen_active_disable_ofo_check(struct sock *sk) } }else if (tp->syn_fastopen_ch &&atomic_read (&sock_net (sk)->ipv4.tfo_active_disable_times)) { - dst =sk_dst_get (sk); - dev = dst ?dst_dev (dst) :NULL ; +rcu_read_lock (); + dst =__sk_dst_get (sk); + dev = dst ?dst_dev_rcu (dst) :NULL ;if (!(dev && (dev->flags &IFF_LOOPBACK )))atomic_set (&sock_net (sk)->ipv4.tfo_active_disable_times,0 ); -dst_release (dst); +rcu_read_unlock (); } }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 404/849 crypto: qat - use kcalloc() in qat_uclo_map_objs_from_mof()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qianfeng Rong <[email protected]>
[ Upstream commit 4c634b6b3c77bba237ee64bca172e73f9cee0cb2 ]
As noted in the kernel documentation [1], open-coded multiplication in allocator arguments is discouraged because it can lead to integer overflow.
Use kcalloc() to gain built-in overflow protection, making memory allocation safer when calculating allocation size compared to explicit multiplication. Similarly, use size_add() instead of explicit addition for 'uobj_chunk_num + sobj_chunk_num'.
--- drivers/crypto/intel/qat/qat_common/qat_uclo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/intel/qat/qat_common/qat_uclo.c +1 -1
@@ -1900,7 +1900,7 @@ static int qat_uclo_map_objs_from_mof(struct icp_qat_mof_handle *mobj_handle)if (sobj_hdr) sobj_chunk_num = sobj_hdr->num_chunks; - mobj_hdr =kzalloc ((uobj_chunk_num + sobj_chunk_num) * + mobj_hdr =kcalloc (size_add (uobj_chunk_num, sobj_chunk_num),sizeof (*mobj_hdr),GFP_KERNEL );if (!mobj_hdr)return -ENOMEM ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 405/849 scsi: pm8001: Use int instead of u32 to store error codes
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qianfeng Rong <[email protected]>
[ Upstream commit bee3554d1a4efbce91d6eca732f41b97272213a5 ]
Use int instead of u32 for 'ret' variable to store negative error codes returned by PM8001_CHIP_DISP->set_nvmd_req().
--- drivers/scsi/pm8001/pm8001_ctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/pm8001/pm8001_ctl.c +1 -1
@@ -682,7 +682,7 @@ static int pm8001_set_nvmd(struct pm8001_hba_info *pm8001_ha)struct pm8001_ioctl_payload *payload;DECLARE_COMPLETION_ONSTACK (completion);u8 *ioctlbuffer; -u32 ret; +int ret;u32 length =1024 *5 +sizeof (*payload) -1 ;if (pm8001_ha->fw_image->size >4096 ) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 406/849 iio: adc: ad7124: do not require mclk
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Lechner <[email protected]>
[ Upstream commit aead8e4cc04612f74c7277de137cc995df280829 ]
Make the "mclk" clock optional in the ad7124 driver. The MCLK is an internal counter on the ADC, so it is not something that should be coming from the devicetree. However, existing users may be using this to essentially select the power mode of the ADC from the devicetree. In order to not break those users, we have to keep the existing "mclk" handling, but now it is optional.
Now, when the "mclk" clock is omitted from the devicetree, the driver will default to the full power mode. Support for an external clock and dynamic power mode switching can be added later if needed.
--- drivers/iio/adc/ad7124.c | 62 ++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 18 deletions(-)
drivers/iio/adc/ad7124.c +44 -18
@@ -174,7 +174,6 @@ struct ad7124_state {struct ad_sigma_delta sd;struct ad7124_channel *channels;struct regulator *vref[4 ]; -struct clk *mclk;unsigned int adc_control;unsigned int num_channels;struct mutex cfgs_lock;/* lock for configs access */
@@ -254,7 +253,9 @@ static void ad7124_set_channel_odr(struct ad7124_state *st, unsigned int channel {unsigned int fclk, odr_sel_bits; - fclk =clk_get_rate (st->mclk); + fclk = ad7124_master_clk_freq_hz[FIELD_GET (AD7124_ADC_CONTROL_POWER_MODE , + st->adc_control)]; +/* * FS[10:0] = fCLK / (fADC x 32) where: * fADC is the output data rate
@@ -1111,21 +1112,50 @@ static int ad7124_parse_channel_config(struct iio_dev *indio_dev,static int ad7124_setup (struct ad7124_state *st) {struct device *dev = &st->sd.spi->dev; -unsigned int fclk, power_mode; +unsigned int power_mode; +struct clk *mclk;int i, ret; - fclk =clk_get_rate (st->mclk); -if (!fclk) -return dev_err_probe (dev, -EINVAL ,"Failed to get mclk rate\n" ); +/* +* Always use full power mode for max performance. If needed, the driver +* could be adapted to use a dynamic power mode based on the requested +* output data rate. +*/ + power_mode =AD7124_ADC_CONTROL_POWER_MODE_FULL ; -/* The power mode changes the master clock frequency */ - power_mode =ad7124_find_closest_match (ad7124_master_clk_freq_hz, -ARRAY_SIZE (ad7124_master_clk_freq_hz), - fclk); -if (fclk != ad7124_master_clk_freq_hz[power_mode]) { - ret =clk_set_rate (st->mclk, fclk); -if (ret) -return dev_err_probe (dev, ret,"Failed to set mclk rate\n" ); +/* +* This "mclk" business is needed for backwards compatibility with old +* devicetrees that specified a fake clock named "mclk" to select the +* power mode. +*/ + mclk =devm_clk_get_optional_enabled (dev,"mclk" ); +if (IS_ERR (mclk)) +return dev_err_probe (dev,PTR_ERR (mclk),"Failed to get mclk\n" ); + +if (mclk) { +unsigned long mclk_hz; + + mclk_hz =clk_get_rate (mclk); +if (!mclk_hz) +return dev_err_probe (dev, -EINVAL , +"Failed to get mclk rate\n" ); + +/* +* This logic is a bit backwards, which is why it is only here +* for backwards compatibility. The driver should be able to set +* the power mode as it sees fit and the f_clk/mclk rate should +* be dynamic accordingly. But here, we are selecting a fixed +* power mode based on the given "mclk" rate. +*/ + power_mode =ad7124_find_closest_match (ad7124_master_clk_freq_hz, +ARRAY_SIZE (ad7124_master_clk_freq_hz), mclk_hz); + +if (mclk_hz != ad7124_master_clk_freq_hz[power_mode]) { + ret =clk_set_rate (mclk, mclk_hz); +if (ret) +return dev_err_probe (dev, ret, +"Failed to set mclk rate\n" ); + } }/* Set the power mode */
@@ -1303,10 +1333,6 @@ static int ad7124_probe(struct spi_device *spi)return dev_err_probe (dev, ret,"Failed to register disable handler for regulator #%d\n" , i); } - st->mclk =devm_clk_get_enabled (&spi->dev,"mclk" ); -if (IS_ERR (st->mclk)) -return dev_err_probe (dev,PTR_ERR (st->mclk),"Failed to get mclk\n" ); - ret =ad7124_soft_reset (st);if (ret <0 )return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 407/849 scsi: ufs: exynos: fsd: Gate ref_clk and put UFS device in reset on suspend
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bharat Uppal <[email protected]>
[ Upstream commit 6d55af0f0740bf3d77943425fdafb77dc0fa6bb9 ]
On FSD platform, gating the reference clock (ref_clk) and putting the UFS device in reset by asserting the reset signal during UFS suspend, improves the power savings and ensures the PHY is fully turned off.
These operations are added as FSD specific suspend hook to avoid unintended side effects on other SoCs supported by this driver.
--- drivers/ufs/host/ufs-exynos.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/ufs/host/ufs-exynos.c +8 -0
@@ -1896,6 +1896,13 @@ static int fsd_ufs_pre_pwr_change(struct exynos_ufs *ufs,return 0 ; } +static int fsd_ufs_suspend (struct exynos_ufs *ufs) +{ +exynos_ufs_gate_clks (ufs); +hci_writel (ufs,0 ,HCI_GPIO_OUT ); +return 0 ; +} +static inline u32 get_mclk_period_unipro_18 (struct exynos_ufs *ufs) {return (16 *1000 *1000000UL / ufs->mclk_rate);
@@ -2162,6 +2169,7 @@ static const struct exynos_ufs_drv_data fsd_ufs_drvs = { .pre_link = fsd_ufs_pre_link, .post_link = fsd_ufs_post_link, .pre_pwr_change = fsd_ufs_pre_pwr_change, + .suspend = fsd_ufs_suspend, };static const struct exynos_ufs_drv_data gs101_ufs_drvs = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 408/849 media: imx-mipi-csis: Only set clock rate when specified in DT
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laurent Pinchart <[email protected]>
[ Upstream commit 65673c6e33cf46f220cc5774166b373b3c087739 ]
The imx-mipi-csis driver sets the rate of the wrap clock to the value specified in the device tree's "clock-frequency" property, and defaults to 166 MHz otherwise. This is a historical mistake, as clock rate selection should have been left to the assigned-clock-rates property.
Honouring the clock-frequency property can't be removed without breaking backwards compatibility, and the corresponding code isn't very intrusive. The 166 MHz default, on the other hand, prevents configuration of the clock rate through assigned-clock-rates, as the driver immediately overwrites the rate. This behaviour is confusing and has cost debugging time.
There is little value in a 166 MHz default. All mainline device tree sources that enable the CSIS specify a clock-frequency explicitly, and the default wrap clock configuration on supported platforms is at least as high as 166 MHz. Drop the default, and only set the clock rate manually when the clock-frequency property is specified.
--- drivers/media/platform/nxp/imx-mipi-csis.c | 23 +++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
drivers/media/platform/nxp/imx-mipi-csis.c +12 -11
@@ -228,8 +228,6 @@#define MIPI_CSIS_PKTDATA_EVEN 0x3000#define MIPI_CSIS_PKTDATA_SIZE SZ_4K -#define DEFAULT_SCLK_CSIS_FREQ 166000000UL -struct mipi_csis_event {bool debug;u32 mask;
@@ -704,12 +702,17 @@ static int mipi_csis_clk_get(struct mipi_csis_device *csis)if (ret <0 )return ret; -/* Set clock rate */ - ret =clk_set_rate (csis->clks[MIPI_CSIS_CLK_WRAP ].clk, - csis->clk_frequency); -if (ret <0 ) -dev_err (csis->dev,"set rate=%d failed: %d\n" , - csis->clk_frequency, ret); +if (csis->clk_frequency) { +/* +* Set the clock rate. This is deprecated, for backward +* compatibility with old device trees. +*/ + ret =clk_set_rate (csis->clks[MIPI_CSIS_CLK_WRAP ].clk, + csis->clk_frequency); +if (ret <0 ) +dev_err (csis->dev,"set rate=%d failed: %d\n" , + csis->clk_frequency, ret); + }return ret; }
@@ -1413,9 +1416,7 @@ static int mipi_csis_parse_dt(struct mipi_csis_device *csis) {struct device_node *node = csis->dev->of_node; -if (of_property_read_u32 (node,"clock-frequency" , - &csis->clk_frequency)) - csis->clk_frequency =DEFAULT_SCLK_CSIS_FREQ ; +of_property_read_u32 (node,"clock-frequency" , &csis->clk_frequency);return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 409/849 media: nxp: imx8-isi: Fix streaming cleanup on release
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Leitner <[email protected]>
[ Upstream commit 47773031a148ad7973b809cc7723cba77eda2b42 ]
The current implementation unconditionally calls mxc_isi_video_cleanup_streaming() in mxc_isi_video_release(). This can lead to situations where any release call (like from a simple "v4l2-ctl -l") may release a currently streaming queue when called on such a device.
This is reproducible on an i.MX8MP board by streaming from an ISI capture device using gstreamer:
gst-launch-1.0 -v v4l2src device=/dev/videoX ! \ video/x-raw,format=GRAY8,width=1280,height=800,framerate=1/120 ! \ fakesink
While this stream is running, querying the caps of the same device provokes the error state:
v4l2-ctl -l -d /dev/videoX
This results in the following trace:
[ 155.452152] ------------[ cut here ]------------ [ 155.452163] WARNING: CPU: 0 PID: 1708 at drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c:713 mxc_isi_pipe_irq_handler+0x19c/0x1b0 [imx8_isi] [ 157.004248] Modules linked in: cfg80211 rpmsg_ctrl rpmsg_char rpmsg_tty virtio_rpmsg_bus rpmsg_ns rpmsg_core rfkill nft_ct nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables mcp251x6 [ 157.053499] CPU: 0 UID: 0 PID: 1708 Comm: python3 Not tainted 6.15.4-00114-g1f61ca5cad76 #1 PREEMPT [ 157.064369] Hardware name: imx8mp_board_01 (DT) [ 157.068205] pstate: 400000c5 (nZcv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 157.075169] pc : mxc_isi_pipe_irq_handler+0x19c/0x1b0 [imx8_isi] [ 157.081195] lr : mxc_isi_pipe_irq_handler+0x38/0x1b0 [imx8_isi] [ 157.087126] sp : ffff800080003ee0 [ 157.090438] x29: ffff800080003ee0 x28: ffff0000c3688000 x27: 0000000000000000 [ 157.097580] x26: 0000000000000000 x25: ffff0000c1e7ac00 x24: ffff800081b5ad50 [ 157.104723] x23: 00000000000000d1 x22: 0000000000000000 x21: ffff0000c25e4000 [ 157.111866] x20: 0000000060000200 x19: ffff80007a0608d0 x18: 0000000000000000 [ 157.119008] x17: ffff80006a4e3000 x16: ffff800080000000 x15: 0000000000000000 [ 157.126146] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 [ 157.133287] x11: 0000000000000040 x10: ffff0000c01445f0 x9 : ffff80007a053a38 [ 157.140425] x8 : ffff0000c04004b8 x7 : 0000000000000000 x6 : 0000000000000000 [ 157.147567] x5 : ffff0000c0400490 x4 : ffff80006a4e3000 x3 : ffff0000c25e4000 [ 157.154706] x2 : 0000000000000000 x1 : ffff8000825c0014 x0 : 0000000060000200 [ 157.161850] Call trace: [ 157.164296] mxc_isi_pipe_irq_handler+0x19c/0x1b0 [imx8_isi] (P) [ 157.170319] __handle_irq_event_percpu+0x58/0x218 [ 157.175029] handle_irq_event+0x54/0xb8 [ 157.178867] handle_fasteoi_irq+0xac/0x248 [ 157.182968] handle_irq_desc+0x48/0x68 [ 157.186723] generic_handle_domain_irq+0x24/0x38 [ 157.191346] gic_handle_irq+0x54/0x120 [ 157.195098] call_on_irq_stack+0x24/0x30 [ 157.199027] do_interrupt_handler+0x88/0x98 [ 157.203212] el0_interrupt+0x44/0xc0 [ 157.206792] __el0_irq_handler_common+0x18/0x28 [ 157.211328] el0t_64_irq_handler+0x10/0x20 [ 157.215429] el0t_64_irq+0x198/0x1a0 [ 157.219009] ---[ end trace 0000000000000000 ]---
Address this issue by moving the streaming preparation and cleanup to the vb2 .prepare_streaming() and .unprepare_streaming() operations. This also simplifies the driver by allowing direct usage of the vb2_ioctl_streamon() and vb2_ioctl_streamoff() helpers, and removal of the manual cleanup from mxc_isi_video_release().
--- .../platform/nxp/imx8-isi/imx8-isi-video.c | 156 +++++++----------- 1 file changed, 58 insertions(+), 98 deletions(-)
drivers/media/platform/nxp/imx8-isi/imx8-isi-video.c +58 -98
@@ -937,6 +937,49 @@ static void mxc_isi_video_init_channel(struct mxc_isi_video *video)mxc_isi_channel_set_output_format (pipe, video->fmtinfo, &video->pix); } +static int mxc_isi_vb2_prepare_streaming (struct vb2_queue *q) +{ +struct mxc_isi_video *video =vb2_get_drv_priv (q); +struct media_device *mdev = &video->pipe->isi->media_dev; +struct media_pipeline *pipe; +int ret; + +/* Get a pipeline for the video node and start it. */ + scoped_guard(mutex, &mdev->graph_mutex) { + ret =mxc_isi_pipe_acquire (video->pipe, + &mxc_isi_video_frame_write_done); +if (ret) +return ret; + + pipe =media_entity_pipeline (&video->vdev.entity) + ? : &video->pipe->pipe; + + ret =__video_device_pipeline_start (&video->vdev, pipe); +if (ret) + goto err_release; + } + +/* Verify that the video format matches the output of the subdev. */ + ret =mxc_isi_video_validate_format (video); +if (ret) + goto err_stop; + +/* Allocate buffers for discard operation. */ + ret =mxc_isi_video_alloc_discard_buffers (video); +if (ret) + goto err_stop; + + video->is_streaming = true; + +return 0 ; + +err_stop: +video_device_pipeline_stop (&video->vdev); +err_release: +mxc_isi_pipe_release (video->pipe); +return ret; +} +static int mxc_isi_vb2_start_streaming (struct vb2_queue *q,unsigned int count) {struct mxc_isi_video *video =vb2_get_drv_priv (q);
@@ -985,13 +1028,26 @@ static void mxc_isi_vb2_stop_streaming(struct vb2_queue *q)mxc_isi_video_return_buffers (video,VB2_BUF_STATE_ERROR ); } +static void mxc_isi_vb2_unprepare_streaming (struct vb2_queue *q) +{ +struct mxc_isi_video *video =vb2_get_drv_priv (q); + +mxc_isi_video_free_discard_buffers (video); +video_device_pipeline_stop (&video->vdev); +mxc_isi_pipe_release (video->pipe); + + video->is_streaming = false; +} +static const struct vb2_ops mxc_isi_vb2_qops = { .queue_setup = mxc_isi_vb2_queue_setup, .buf_init = mxc_isi_vb2_buffer_init, .buf_prepare = mxc_isi_vb2_buffer_prepare, .buf_queue = mxc_isi_vb2_buffer_queue, + .prepare_streaming = mxc_isi_vb2_prepare_streaming, .start_streaming = mxc_isi_vb2_start_streaming, .stop_streaming = mxc_isi_vb2_stop_streaming, + .unprepare_streaming = mxc_isi_vb2_unprepare_streaming, };/* -----------------------------------------------------------------------------
@@ -1145,97 +1201,6 @@ static int mxc_isi_video_s_fmt(struct file *file, void *priv,return 0 ; } -static int mxc_isi_video_streamon (struct file *file,void *priv, -enum v4l2_buf_type type) -{ -struct mxc_isi_video *video =video_drvdata (file); -struct media_device *mdev = &video->pipe->isi->media_dev; -struct media_pipeline *pipe; -int ret; - -if (vb2_queue_is_busy (&video->vb2_q, file)) -return -EBUSY ; - -/* -* Get a pipeline for the video node and start it. This must be done -* here and not in the queue .start_streaming() handler, so that -* pipeline start errors can be reported from VIDIOC_STREAMON and not -* delayed until subsequent VIDIOC_QBUF calls. -*/ -mutex_lock (&mdev->graph_mutex); - - ret =mxc_isi_pipe_acquire (video->pipe, &mxc_isi_video_frame_write_done); -if (ret) { -mutex_unlock (&mdev->graph_mutex); -return ret; - } - - pipe =media_entity_pipeline (&video->vdev.entity) ? : &video->pipe->pipe; - - ret =__video_device_pipeline_start (&video->vdev, pipe); -if (ret) { -mutex_unlock (&mdev->graph_mutex); - goto err_release; - } - -mutex_unlock (&mdev->graph_mutex); - -/* Verify that the video format matches the output of the subdev. */ - ret =mxc_isi_video_validate_format (video); -if (ret) - goto err_stop; - -/* Allocate buffers for discard operation. */ - ret =mxc_isi_video_alloc_discard_buffers (video); -if (ret) - goto err_stop; - - ret =vb2_streamon (&video->vb2_q, type); -if (ret) - goto err_free; - - video->is_streaming = true; - -return 0 ; - -err_free: -mxc_isi_video_free_discard_buffers (video); -err_stop: -video_device_pipeline_stop (&video->vdev); -err_release: -mxc_isi_pipe_release (video->pipe); -return ret; -} - -static void mxc_isi_video_cleanup_streaming (struct mxc_isi_video *video) -{ -lockdep_assert_held (&video->lock); - -if (!video->is_streaming) -return ; - -mxc_isi_video_free_discard_buffers (video); -video_device_pipeline_stop (&video->vdev); -mxc_isi_pipe_release (video->pipe); - - video->is_streaming = false; -} - -static int mxc_isi_video_streamoff (struct file *file,void *priv, -enum v4l2_buf_type type) -{ -struct mxc_isi_video *video =video_drvdata (file); -int ret; - - ret =vb2_ioctl_streamoff (file, priv, type); -if (ret) -return ret; - -mxc_isi_video_cleanup_streaming (video); - -return 0 ; -} -static int mxc_isi_video_enum_framesizes (struct file *file,void *priv,struct v4l2_frmsizeenum *fsize) {
@@ -1291,9 +1256,8 @@ static const struct v4l2_ioctl_ops mxc_isi_video_ioctl_ops = { .vidioc_expbuf = vb2_ioctl_expbuf, .vidioc_prepare_buf = vb2_ioctl_prepare_buf, .vidioc_create_bufs = vb2_ioctl_create_bufs, - - .vidioc_streamon = mxc_isi_video_streamon, - .vidioc_streamoff = mxc_isi_video_streamoff, + .vidioc_streamon = vb2_ioctl_streamon, + .vidioc_streamoff = vb2_ioctl_streamoff, .vidioc_enum_framesizes = mxc_isi_video_enum_framesizes,
@@ -1332,10 +1296,6 @@ static int mxc_isi_video_release(struct file *file)if (ret)dev_err (video->pipe->isi->dev,"%s fail\n" , __func__); -mutex_lock (&video->lock); -mxc_isi_video_cleanup_streaming (video); -mutex_unlock (&video->lock); -pm_runtime_put (video->pipe->isi->dev);return ret; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 410/849 wifi: iwlwifi: pcie: remember when interrupts are disabled
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miri Korenblit <[email protected]>
[ Upstream commit 1a33efe4fc64b8135fe94e22299761cc69333404 ]
trans_pcie::fh_mask and hw_mask indicates what are the interrupts are currently enabled (unmasked).
When we disable all interrupts, those should be set to 0, so if, for some reason, we get an interrupt even though it was disabled, we will know to ignore.
--- drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/internal.h | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/internal.h +3 -0
@@ -818,6 +818,8 @@ static inline void _iwl_disable_interrupts(struct iwl_trans *trans) trans_pcie->fh_init_mask);iwl_write32 (trans,CSR_MSIX_HW_INT_MASK_AD , trans_pcie->hw_init_mask); + trans_pcie->fh_mask =0 ; + trans_pcie->hw_mask =0 ; }IWL_DEBUG_ISR (trans,"Disabled interrupts\n" ); }
@@ -1000,6 +1002,7 @@ static inline void iwl_enable_rfkill_int(struct iwl_trans *trans) }else {iwl_write32 (trans,CSR_MSIX_FH_INT_MASK_AD , trans_pcie->fh_init_mask); + trans_pcie->fh_mask =0 ;iwl_enable_hw_int_msk_msix (trans,MSIX_HW_INT_CAUSES_REG_RF_KILL ); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 411/849 drm/st7571-i2c: add support for inverted pixel format
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcus Folkesson <[email protected]>
[ Upstream commit e61c35157d32b4b422f0a4cbc3c40d04d883a9c9 ]
Depending on which display that is connected to the controller, an "1" means either a black or a white pixel.
The supported formats (R1/R2/XRGB8888) expects the pixels to map against (4bit):
00 => Black
01 => Dark Gray
10 => Light Gray
11 => WhiteIf this is not what the display map against, make it possible to invert the pixels.
--- drivers/gpu/drm/sitronix/st7571-i2c.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/gpu/drm/sitronix/st7571-i2c.c +5 -2
@@ -151,6 +151,7 @@ struct st7571_device {bool ignore_nak;bool grayscale; +bool inverted;u32 height_mm;u32 width_mm;u32 startline;
@@ -792,6 +793,7 @@ static int st7567_parse_dt(struct st7571_device *st7567)of_property_read_u32 (np,"width-mm" , &st7567->width_mm);of_property_read_u32 (np,"height-mm" , &st7567->height_mm); + st7567->inverted =of_property_read_bool (np,"sitronix,inverted" ); st7567->pformat = &st7571_monochrome; st7567->bpp =1 ;
@@ -819,6 +821,7 @@ static int st7571_parse_dt(struct st7571_device *st7571)of_property_read_u32 (np,"width-mm" , &st7571->width_mm);of_property_read_u32 (np,"height-mm" , &st7571->height_mm); st7571->grayscale =of_property_read_bool (np,"sitronix,grayscale" ); + st7571->inverted =of_property_read_bool (np,"sitronix,inverted" );if (st7571->grayscale) { st7571->pformat = &st7571_grayscale;
@@ -873,7 +876,7 @@ static int st7567_lcd_init(struct st7571_device *st7567)ST7571_SET_POWER (0x6 ),/* Power Control, VC: ON, VR: ON, VF: OFF */ ST7571_SET_POWER (0x7 ),/* Power Control, VC: ON, VR: ON, VF: ON */ -ST7571_SET_REVERSE (0 ), +ST7571_SET_REVERSE (st7567->inverted ?1 :0 ), ST7571_SET_ENTIRE_DISPLAY_ON(0), };
@@ -917,7 +920,7 @@ static int st7571_lcd_init(struct st7571_device *st7571)ST7571_SET_COLOR_MODE (st7571->pformat->mode),ST7571_COMMAND_SET_NORMAL , -ST7571_SET_REVERSE (0 ), +ST7571_SET_REVERSE (st7571->inverted ?1 :0 ), ST7571_SET_ENTIRE_DISPLAY_ON(0), };
Signature · 1 line
2.51.0