From 5a491904f7fecb64d05050d62af7a4dfcf0a35c5 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Sun, 16 Jul 2023 21:01:20 -0400 Subject: [PATCH] Fixes for 5.4 Signed-off-by: Sasha Levin --- ...xtack-support-for-src-and-dst-port-r.patch | 78 ++ ...el-add-and-fill-drm_panel-type-field.patch | 854 ++++++++++++++++++ ...lise-panel-dev-and-funcs-through-drm.patch | 724 +++++++++++++++ ...-add-connector_type-for-innolux_at04.patch | 39 + ...nite-loop-in-z_erofs_do_read_page-wh.patch | 54 ++ ...tr-deref-of-ip6_null_entry-rt6i_idev.patch | 145 +++ ...e-delay-during-tx-ring-configuration.patch | 46 + ...n-supported-and-advertising-fields-o.patch | 39 + ...c-clean-irq-affinity-on-queue-deinit.patch | 38 + .../ionic-improve-irq-numa-locality.patch | 42 + ...nic-ionic_intr_free-parameter-change.patch | 68 ++ .../ionic-move-irq-request-to-qcq-alloc.patch | 140 +++ ...ove-warn_on-to-prevent-panic_on_warn.patch | 42 + ...x-a-potential-refcount-underflow-for.patch | 53 ++ ...-fix-txq_map-in-case-of-txq_number-1.patch | 48 + ...-fix-improper-refcount-update-leads-.patch | 62 ++ ...-ensure-both-minimum-and-maximum-por.patch | 82 ++ ...sched-make-psched_mtu-rtnl-less-safe.patch | 49 + ...r-handling-in-amd_ntb_pci_driver_ini.patch | 64 ++ ...rror-handling-in-idt_pci_driver_init.patch | 66 ++ ...ror-handling-in-intel_ntb_pci_driver.patch | 65 ++ ...-ntb_tool-add-check-for-devm_kcalloc.patch | 39 + ...t-fix-possible-memory-leak-while-dev.patch | 42 + ...-break-possible-infinite-loop-when-p.patch | 84 ++ ...86-wmi-fix-indentation-in-some-cases.patch | 48 + .../platform-x86-wmi-move-variables.patch | 80 ++ ...-x86-wmi-remove-unnecessary-argument.patch | 75 ++ ...-replace-uuid-redefinitions-by-their.patch | 100 ++ ...rm-x86-wmi-use-guid_t-and-guid_equal.patch | 177 ++++ ...x-fix-error-code-in-qla2x00_start_sp.patch | 38 + queue-5.4/series | 32 + queue-5.4/udp6-fix-udp6_ehashfn-typo.patch | 40 + ...uninitialized-warning-in-airo_get_ra.patch | 47 + 33 files changed, 3600 insertions(+) create mode 100644 queue-5.4/cls_flower-add-extack-support-for-src-and-dst-port-r.patch create mode 100644 queue-5.4/drm-panel-add-and-fill-drm_panel-type-field.patch create mode 100644 queue-5.4/drm-panel-initialise-panel-dev-and-funcs-through-drm.patch create mode 100644 queue-5.4/drm-panel-simple-add-connector_type-for-innolux_at04.patch create mode 100644 queue-5.4/erofs-avoid-infinite-loop-in-z_erofs_do_read_page-wh.patch create mode 100644 queue-5.4/icmp6-fix-null-ptr-deref-of-ip6_null_entry-rt6i_idev.patch create mode 100644 queue-5.4/igc-remove-delay-during-tx-ring-configuration.patch create mode 100644 queue-5.4/igc-set-tp-bit-in-supported-and-advertising-fields-o.patch create mode 100644 queue-5.4/ionic-clean-irq-affinity-on-queue-deinit.patch create mode 100644 queue-5.4/ionic-improve-irq-numa-locality.patch create mode 100644 queue-5.4/ionic-ionic_intr_free-parameter-change.patch create mode 100644 queue-5.4/ionic-move-irq-request-to-qcq-alloc.patch create mode 100644 queue-5.4/ionic-remove-warn_on-to-prevent-panic_on_warn.patch create mode 100644 queue-5.4/ipv6-addrconf-fix-a-potential-refcount-underflow-for.patch create mode 100644 queue-5.4/net-mvneta-fix-txq_map-in-case-of-txq_number-1.patch create mode 100644 queue-5.4/net-sched-cls_fw-fix-improper-refcount-update-leads-.patch create mode 100644 queue-5.4/net-sched-flower-ensure-both-minimum-and-maximum-por.patch create mode 100644 queue-5.4/net-sched-make-psched_mtu-rtnl-less-safe.patch create mode 100644 queue-5.4/ntb-amd-fix-error-handling-in-amd_ntb_pci_driver_ini.patch create mode 100644 queue-5.4/ntb-idt-fix-error-handling-in-idt_pci_driver_init.patch create mode 100644 queue-5.4/ntb-intel-fix-error-handling-in-intel_ntb_pci_driver.patch create mode 100644 queue-5.4/ntb-ntb_tool-add-check-for-devm_kcalloc.patch create mode 100644 queue-5.4/ntb-ntb_transport-fix-possible-memory-leak-while-dev.patch create mode 100644 queue-5.4/platform-x86-wmi-break-possible-infinite-loop-when-p.patch create mode 100644 queue-5.4/platform-x86-wmi-fix-indentation-in-some-cases.patch create mode 100644 queue-5.4/platform-x86-wmi-move-variables.patch create mode 100644 queue-5.4/platform-x86-wmi-remove-unnecessary-argument.patch create mode 100644 queue-5.4/platform-x86-wmi-replace-uuid-redefinitions-by-their.patch create mode 100644 queue-5.4/platform-x86-wmi-use-guid_t-and-guid_equal.patch create mode 100644 queue-5.4/scsi-qla2xxx-fix-error-code-in-qla2x00_start_sp.patch create mode 100644 queue-5.4/udp6-fix-udp6_ehashfn-typo.patch create mode 100644 queue-5.4/wifi-airo-avoid-uninitialized-warning-in-airo_get_ra.patch diff --git a/queue-5.4/cls_flower-add-extack-support-for-src-and-dst-port-r.patch b/queue-5.4/cls_flower-add-extack-support-for-src-and-dst-port-r.patch new file mode 100644 index 00000000000..a55d61f927b --- /dev/null +++ b/queue-5.4/cls_flower-add-extack-support-for-src-and-dst-port-r.patch @@ -0,0 +1,78 @@ +From baa5899647027ec01ba907ae23c434d7daca9cb8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 23 Mar 2020 21:48:51 +0100 +Subject: cls_flower: Add extack support for src and dst port range options + +From: Guillaume Nault + +[ Upstream commit bd7d4c12819b60b161939bc2f43053955d24d0df ] + +Pass extack down to fl_set_key_port_range() and set message on error. + +Both the min and max ports would qualify as invalid attributes here. +Report the min one as invalid, as it's probably what makes the most +sense from a user point of view. + +Signed-off-by: Guillaume Nault +Signed-off-by: David S. Miller +Stable-dep-of: d3f87278bcb8 ("net/sched: flower: Ensure both minimum and maximum ports are specified") +Signed-off-by: Sasha Levin +--- + net/sched/cls_flower.c | 26 ++++++++++++++++++-------- + 1 file changed, 18 insertions(+), 8 deletions(-) + +diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c +index f21c97f02d361..f0010e4850eb6 100644 +--- a/net/sched/cls_flower.c ++++ b/net/sched/cls_flower.c +@@ -719,7 +719,8 @@ static void fl_set_key_val(struct nlattr **tb, + } + + static int fl_set_key_port_range(struct nlattr **tb, struct fl_flow_key *key, +- struct fl_flow_key *mask) ++ struct fl_flow_key *mask, ++ struct netlink_ext_ack *extack) + { + fl_set_key_val(tb, &key->tp_range.tp_min.dst, + TCA_FLOWER_KEY_PORT_DST_MIN, &mask->tp_range.tp_min.dst, +@@ -734,13 +735,22 @@ static int fl_set_key_port_range(struct nlattr **tb, struct fl_flow_key *key, + TCA_FLOWER_KEY_PORT_SRC_MAX, &mask->tp_range.tp_max.src, + TCA_FLOWER_UNSPEC, sizeof(key->tp_range.tp_max.src)); + +- if ((mask->tp_range.tp_min.dst && mask->tp_range.tp_max.dst && +- htons(key->tp_range.tp_max.dst) <= +- htons(key->tp_range.tp_min.dst)) || +- (mask->tp_range.tp_min.src && mask->tp_range.tp_max.src && +- htons(key->tp_range.tp_max.src) <= +- htons(key->tp_range.tp_min.src))) ++ if (mask->tp_range.tp_min.dst && mask->tp_range.tp_max.dst && ++ htons(key->tp_range.tp_max.dst) <= ++ htons(key->tp_range.tp_min.dst)) { ++ NL_SET_ERR_MSG_ATTR(extack, ++ tb[TCA_FLOWER_KEY_PORT_DST_MIN], ++ "Invalid destination port range (min must be strictly smaller than max)"); + return -EINVAL; ++ } ++ if (mask->tp_range.tp_min.src && mask->tp_range.tp_max.src && ++ htons(key->tp_range.tp_max.src) <= ++ htons(key->tp_range.tp_min.src)) { ++ NL_SET_ERR_MSG_ATTR(extack, ++ tb[TCA_FLOWER_KEY_PORT_SRC_MIN], ++ "Invalid source port range (min must be strictly smaller than max)"); ++ return -EINVAL; ++ } + + return 0; + } +@@ -1211,7 +1221,7 @@ static int fl_set_key(struct net *net, struct nlattr **tb, + if (key->basic.ip_proto == IPPROTO_TCP || + key->basic.ip_proto == IPPROTO_UDP || + key->basic.ip_proto == IPPROTO_SCTP) { +- ret = fl_set_key_port_range(tb, key, mask); ++ ret = fl_set_key_port_range(tb, key, mask, extack); + if (ret) + return ret; + } +-- +2.39.2 + diff --git a/queue-5.4/drm-panel-add-and-fill-drm_panel-type-field.patch b/queue-5.4/drm-panel-add-and-fill-drm_panel-type-field.patch new file mode 100644 index 00000000000..09cac7cd32f --- /dev/null +++ b/queue-5.4/drm-panel-add-and-fill-drm_panel-type-field.patch @@ -0,0 +1,854 @@ +From d0adebec16ee01a75fe118ee44ae27ed4ee7d584 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 4 Sep 2019 16:28:03 +0300 +Subject: drm/panel: Add and fill drm_panel type field + +From: Laurent Pinchart + +[ Upstream commit 9a2654c0f62a1704f36acb6329f9ccbd539f75ad ] + +Add a type field to the drm_panel structure to report the panel type, +using DRM_MODE_CONNECTOR_* macros (the values that make sense are LVDS, +eDP, DSI and DPI). This will be used to initialise the corresponding +connector type. + +Update all panel drivers accordingly. The panel-simple driver only +specifies the type for the known to be LVDS panels, while all other +panels are left as unknown and will be converted on a case-by-case +basis as they all need to be carefully reviewed. + +Signed-off-by: Laurent Pinchart +Reviewed-by: Boris Brezillon +Reviewed-by: Linus Walleij +Signed-off-by: Sam Ravnborg +Link: https://patchwork.freedesktop.org/patch/msgid/20190904132804.29680-2-laurent.pinchart@ideasonboard.com +Stable-dep-of: 2c56a751845d ("drm/panel: simple: Add connector_type for innolux_at043tn24") +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/drm_panel.c | 5 +++- + drivers/gpu/drm/panel/panel-arm-versatile.c | 3 ++- + .../drm/panel/panel-feiyang-fy07024di26a30d.c | 3 ++- + drivers/gpu/drm/panel/panel-ilitek-ili9322.c | 3 ++- + drivers/gpu/drm/panel/panel-ilitek-ili9881c.c | 3 ++- + drivers/gpu/drm/panel/panel-innolux-p079zca.c | 3 ++- + .../gpu/drm/panel/panel-jdi-lt070me05000.c | 3 ++- + .../drm/panel/panel-kingdisplay-kd097d04.c | 2 +- + drivers/gpu/drm/panel/panel-lg-lb035q02.c | 3 ++- + drivers/gpu/drm/panel/panel-lg-lg4573.c | 3 ++- + drivers/gpu/drm/panel/panel-lvds.c | 3 ++- + drivers/gpu/drm/panel/panel-nec-nl8048hl11.c | 3 ++- + drivers/gpu/drm/panel/panel-novatek-nt39016.c | 3 ++- + .../drm/panel/panel-olimex-lcd-olinuxino.c | 3 ++- + .../gpu/drm/panel/panel-orisetech-otm8009a.c | 3 ++- + .../drm/panel/panel-osd-osd101t2587-53ts.c | 2 +- + .../drm/panel/panel-panasonic-vvx10f034n00.c | 2 +- + .../drm/panel/panel-raspberrypi-touchscreen.c | 3 ++- + drivers/gpu/drm/panel/panel-raydium-rm67191.c | 3 ++- + drivers/gpu/drm/panel/panel-raydium-rm68200.c | 3 ++- + .../drm/panel/panel-rocktech-jh057n00900.c | 3 ++- + drivers/gpu/drm/panel/panel-ronbo-rb070d30.c | 3 ++- + drivers/gpu/drm/panel/panel-samsung-ld9040.c | 3 ++- + drivers/gpu/drm/panel/panel-samsung-s6d16d0.c | 3 ++- + drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c | 3 ++- + .../gpu/drm/panel/panel-samsung-s6e63j0x03.c | 3 ++- + drivers/gpu/drm/panel/panel-samsung-s6e63m0.c | 3 ++- + drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c | 3 ++- + drivers/gpu/drm/panel/panel-seiko-43wvf1g.c | 3 ++- + .../gpu/drm/panel/panel-sharp-lq101r1sx01.c | 3 ++- + .../gpu/drm/panel/panel-sharp-ls037v7dw01.c | 3 ++- + .../gpu/drm/panel/panel-sharp-ls043t1le01.c | 2 +- + drivers/gpu/drm/panel/panel-simple.c | 26 ++++++++++++++++++- + drivers/gpu/drm/panel/panel-sitronix-st7701.c | 3 ++- + .../gpu/drm/panel/panel-sitronix-st7789v.c | 3 ++- + drivers/gpu/drm/panel/panel-sony-acx565akm.c | 3 ++- + drivers/gpu/drm/panel/panel-tpo-td028ttec1.c | 3 ++- + drivers/gpu/drm/panel/panel-tpo-td043mtea1.c | 3 ++- + drivers/gpu/drm/panel/panel-tpo-tpg110.c | 3 ++- + drivers/gpu/drm/panel/panel-truly-nt35597.c | 3 ++- + include/drm/drm_panel.h | 12 ++++++++- + 41 files changed, 112 insertions(+), 41 deletions(-) + +diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c +index ba2fad4c96489..ed7985c0535a2 100644 +--- a/drivers/gpu/drm/drm_panel.c ++++ b/drivers/gpu/drm/drm_panel.c +@@ -46,16 +46,19 @@ static LIST_HEAD(panel_list); + * @panel: DRM panel + * @dev: parent device of the panel + * @funcs: panel operations ++ * @connector_type: the connector type (DRM_MODE_CONNECTOR_*) corresponding to ++ * the panel interface + * + * Initialize the panel structure for subsequent registration with + * drm_panel_add(). + */ + void drm_panel_init(struct drm_panel *panel, struct device *dev, +- const struct drm_panel_funcs *funcs) ++ const struct drm_panel_funcs *funcs, int connector_type) + { + INIT_LIST_HEAD(&panel->list); + panel->dev = dev; + panel->funcs = funcs; ++ panel->connector_type = connector_type; + } + EXPORT_SYMBOL(drm_panel_init); + +diff --git a/drivers/gpu/drm/panel/panel-arm-versatile.c b/drivers/gpu/drm/panel/panel-arm-versatile.c +index a4333ed0f20ca..a0574dc03e16f 100644 +--- a/drivers/gpu/drm/panel/panel-arm-versatile.c ++++ b/drivers/gpu/drm/panel/panel-arm-versatile.c +@@ -350,7 +350,8 @@ static int versatile_panel_probe(struct platform_device *pdev) + dev_info(dev, "panel mounted on IB2 daughterboard\n"); + } + +- drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs); ++ drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + return drm_panel_add(&vpanel->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c +index 7d5d7455bc01f..98f184b811873 100644 +--- a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c ++++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c +@@ -204,7 +204,8 @@ static int feiyang_dsi_probe(struct mipi_dsi_device *dsi) + mipi_dsi_set_drvdata(dsi, ctx); + ctx->dsi = dsi; + +- drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs); ++ drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd"); + if (IS_ERR(ctx->dvdd)) { +diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c +index ad2405baa0ac5..24955bec1958b 100644 +--- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c ++++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c +@@ -895,7 +895,8 @@ static int ili9322_probe(struct spi_device *spi) + ili->input = ili->conf->input; + } + +- drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs); ++ drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + return drm_panel_add(&ili->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c +index 1d714f961c009..e8789e460a169 100644 +--- a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c ++++ b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c +@@ -433,7 +433,8 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi) + mipi_dsi_set_drvdata(dsi, ctx); + ctx->dsi = dsi; + +- drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs); ++ drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + ctx->power = devm_regulator_get(&dsi->dev, "power"); + if (IS_ERR(ctx->power)) { +diff --git a/drivers/gpu/drm/panel/panel-innolux-p079zca.c b/drivers/gpu/drm/panel/panel-innolux-p079zca.c +index 8f3647804a1e4..327fca97977ee 100644 +--- a/drivers/gpu/drm/panel/panel-innolux-p079zca.c ++++ b/drivers/gpu/drm/panel/panel-innolux-p079zca.c +@@ -487,7 +487,8 @@ static int innolux_panel_add(struct mipi_dsi_device *dsi, + if (IS_ERR(innolux->backlight)) + return PTR_ERR(innolux->backlight); + +- drm_panel_init(&innolux->base, dev, &innolux_panel_funcs); ++ drm_panel_init(&innolux->base, dev, &innolux_panel_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + err = drm_panel_add(&innolux->base); + if (err < 0) +diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c +index 7bfdbfbc868ed..56364a93f0b81 100644 +--- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c ++++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c +@@ -437,7 +437,8 @@ static int jdi_panel_add(struct jdi_panel *jdi) + return ret; + } + +- drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs); ++ drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + ret = drm_panel_add(&jdi->base); + +diff --git a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c +index bb131749a0b92..2c576e7eee72f 100644 +--- a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c ++++ b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c +@@ -392,7 +392,7 @@ static int kingdisplay_panel_add(struct kingdisplay_panel *kingdisplay) + return PTR_ERR(kingdisplay->backlight); + + drm_panel_init(&kingdisplay->base, &kingdisplay->link->dev, +- &kingdisplay_panel_funcs); ++ &kingdisplay_panel_funcs, DRM_MODE_CONNECTOR_DSI); + + return drm_panel_add(&kingdisplay->base); + } +diff --git a/drivers/gpu/drm/panel/panel-lg-lb035q02.c b/drivers/gpu/drm/panel/panel-lg-lb035q02.c +index c7b9b47849bb8..7a1385e834f0e 100644 +--- a/drivers/gpu/drm/panel/panel-lg-lb035q02.c ++++ b/drivers/gpu/drm/panel/panel-lg-lb035q02.c +@@ -196,7 +196,8 @@ static int lb035q02_probe(struct spi_device *spi) + if (ret < 0) + return ret; + +- drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs); ++ drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + return drm_panel_add(&lcd->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-lg-lg4573.c b/drivers/gpu/drm/panel/panel-lg-lg4573.c +index 608f2de91662d..db4865a4c2b98 100644 +--- a/drivers/gpu/drm/panel/panel-lg-lg4573.c ++++ b/drivers/gpu/drm/panel/panel-lg-lg4573.c +@@ -259,7 +259,8 @@ static int lg4573_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs); ++ drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + return drm_panel_add(&ctx->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c +index ff1e305d56a02..2405f26e5d31f 100644 +--- a/drivers/gpu/drm/panel/panel-lvds.c ++++ b/drivers/gpu/drm/panel/panel-lvds.c +@@ -254,7 +254,8 @@ static int panel_lvds_probe(struct platform_device *pdev) + */ + + /* Register the panel. */ +- drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs); ++ drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs, ++ DRM_MODE_CONNECTOR_LVDS); + + ret = drm_panel_add(&lvds->panel); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c +index 272a1434e1558..fd593532ab23c 100644 +--- a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c ++++ b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c +@@ -205,7 +205,8 @@ static int nl8048_probe(struct spi_device *spi) + if (ret < 0) + return ret; + +- drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs); ++ drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + return drm_panel_add(&lcd->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-novatek-nt39016.c b/drivers/gpu/drm/panel/panel-novatek-nt39016.c +index 64cfe111aaadb..60ccedce530c2 100644 +--- a/drivers/gpu/drm/panel/panel-novatek-nt39016.c ++++ b/drivers/gpu/drm/panel/panel-novatek-nt39016.c +@@ -292,7 +292,8 @@ static int nt39016_probe(struct spi_device *spi) + return err; + } + +- drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs); ++ drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + err = drm_panel_add(&panel->drm_panel); + if (err < 0) { +diff --git a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c +index f2d6a4ec00467..f2a72ee6ee07d 100644 +--- a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c ++++ b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c +@@ -288,7 +288,8 @@ static int lcd_olinuxino_probe(struct i2c_client *client, + if (IS_ERR(lcd->backlight)) + return PTR_ERR(lcd->backlight); + +- drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs); ++ drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + return drm_panel_add(&lcd->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c +index 5aacd632c6f69..938826f326658 100644 +--- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c ++++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c +@@ -455,7 +455,8 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi) + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_LPM; + +- drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs); ++ drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + ctx->bl_dev = devm_backlight_device_register(dev, dev_name(dev), + dev, ctx, +diff --git a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c +index 38f114b03b897..2b40913899d88 100644 +--- a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c ++++ b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c +@@ -167,7 +167,7 @@ static int osd101t2587_panel_add(struct osd101t2587_panel *osd101t2587) + return PTR_ERR(osd101t2587->backlight); + + drm_panel_init(&osd101t2587->base, &osd101t2587->dsi->dev, +- &osd101t2587_panel_funcs); ++ &osd101t2587_panel_funcs, DRM_MODE_CONNECTOR_DSI); + + return drm_panel_add(&osd101t2587->base); + } +diff --git a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c +index 6035bf4580744..664605071d342 100644 +--- a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c ++++ b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c +@@ -224,7 +224,7 @@ static int wuxga_nt_panel_add(struct wuxga_nt_panel *wuxga_nt) + } + + drm_panel_init(&wuxga_nt->base, &wuxga_nt->dsi->dev, +- &wuxga_nt_panel_funcs); ++ &wuxga_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI); + + ret = drm_panel_add(&wuxga_nt->base); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +index cded730f29ad2..2ccb74debc8ab 100644 +--- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c ++++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +@@ -433,7 +433,8 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c, + return PTR_ERR(ts->dsi); + } + +- drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs); ++ drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + /* This appears last, as it's what will unblock the DSI host + * driver's component bind function. +diff --git a/drivers/gpu/drm/panel/panel-raydium-rm67191.c b/drivers/gpu/drm/panel/panel-raydium-rm67191.c +index f82a1f69f13ba..fd67fc6185c4f 100644 +--- a/drivers/gpu/drm/panel/panel-raydium-rm67191.c ++++ b/drivers/gpu/drm/panel/panel-raydium-rm67191.c +@@ -606,7 +606,8 @@ static int rad_panel_probe(struct mipi_dsi_device *dsi) + if (ret) + return ret; + +- drm_panel_init(&panel->panel, dev, &rad_panel_funcs); ++ drm_panel_init(&panel->panel, dev, &rad_panel_funcs, ++ DRM_MODE_CONNECTOR_DSI); + dev_set_drvdata(dev, panel); + + ret = drm_panel_add(&panel->panel); +diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c +index f004b78fb8bc9..994e855721f4b 100644 +--- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c ++++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c +@@ -404,7 +404,8 @@ static int rm68200_probe(struct mipi_dsi_device *dsi) + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_LPM; + +- drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs); ++ drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + drm_panel_add(&ctx->panel); + +diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c +index d7f56374f2f17..31234b79d3b1a 100644 +--- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c ++++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c +@@ -343,7 +343,8 @@ static int jh057n_probe(struct mipi_dsi_device *dsi) + return ret; + } + +- drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs); ++ drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + drm_panel_add(&ctx->panel); + +diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c +index 8708fbbe76376..170a5cda21b93 100644 +--- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c ++++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c +@@ -173,7 +173,8 @@ static int rb070d30_panel_dsi_probe(struct mipi_dsi_device *dsi) + mipi_dsi_set_drvdata(dsi, ctx); + ctx->dsi = dsi; + +- drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs); ++ drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + ctx->gpios.reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(ctx->gpios.reset)) { +diff --git a/drivers/gpu/drm/panel/panel-samsung-ld9040.c b/drivers/gpu/drm/panel/panel-samsung-ld9040.c +index 71a292dbec478..250809ba37c7e 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-ld9040.c ++++ b/drivers/gpu/drm/panel/panel-samsung-ld9040.c +@@ -351,7 +351,8 @@ static int ld9040_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs); ++ drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + return drm_panel_add(&ctx->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c +index 4d25c96e842cf..e3a0397e953ee 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c ++++ b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c +@@ -215,7 +215,8 @@ static int s6d16d0_probe(struct mipi_dsi_device *dsi) + return ret; + } + +- drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs); ++ drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + ret = drm_panel_add(&s6->panel); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c +index 42a3aaab49eb4..938ab72c55404 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c ++++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c +@@ -732,7 +732,8 @@ static int s6e3ha2_probe(struct mipi_dsi_device *dsi) + ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS; + ctx->bl_dev->props.power = FB_BLANK_POWERDOWN; + +- drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs); ++ drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + ret = drm_panel_add(&ctx->panel); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c +index b4d879bf4d03d..a60635e9226da 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c ++++ b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c +@@ -466,7 +466,8 @@ static int s6e63j0x03_probe(struct mipi_dsi_device *dsi) + return PTR_ERR(ctx->reset_gpio); + } + +- drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs); ++ drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + ctx->bl_dev = backlight_device_register("s6e63j0x03", dev, ctx, + &s6e63j0x03_bl_ops, NULL); +diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c +index 61259c2833ab8..ba01af0b14fd3 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c ++++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c +@@ -473,7 +473,8 @@ static int s6e63m0_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs); ++ drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + ret = s6e63m0_backlight_register(ctx); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c +index 35dbffabd5267..dbced65012045 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c ++++ b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c +@@ -1017,7 +1017,8 @@ static int s6e8aa0_probe(struct mipi_dsi_device *dsi) + + ctx->brightness = GAMMA_LEVEL_NUM - 1; + +- drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs); ++ drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + ret = drm_panel_add(&ctx->panel); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c +index 0833d0c03adc9..b3619ba443bd2 100644 +--- a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c ++++ b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c +@@ -274,7 +274,8 @@ static int seiko_panel_probe(struct device *dev, + return -EPROBE_DEFER; + } + +- drm_panel_init(&panel->base, dev, &seiko_panel_funcs); ++ drm_panel_init(&panel->base, dev, &seiko_panel_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + err = drm_panel_add(&panel->base); + if (err < 0) +diff --git a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c +index 87a58cb4d9455..5e136c3ba1850 100644 +--- a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c ++++ b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c +@@ -329,7 +329,8 @@ static int sharp_panel_add(struct sharp_panel *sharp) + if (IS_ERR(sharp->backlight)) + return PTR_ERR(sharp->backlight); + +- drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs); ++ drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + return drm_panel_add(&sharp->base); + } +diff --git a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c +index 96e3deb0e305c..eeab7998c7de4 100644 +--- a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c ++++ b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c +@@ -185,7 +185,8 @@ static int ls037v7dw01_probe(struct platform_device *pdev) + return PTR_ERR(lcd->ud_gpio); + } + +- drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs); ++ drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + return drm_panel_add(&lcd->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c +index ffa844ee82ad4..b963ba4ab5898 100644 +--- a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c ++++ b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c +@@ -265,7 +265,7 @@ static int sharp_nt_panel_add(struct sharp_nt_panel *sharp_nt) + return PTR_ERR(sharp_nt->backlight); + + drm_panel_init(&sharp_nt->base, &sharp_nt->dsi->dev, +- &sharp_nt_panel_funcs); ++ &sharp_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI); + + return drm_panel_add(&sharp_nt->base); + } +diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c +index 156bd4d551dc3..af71365fb99b3 100644 +--- a/drivers/gpu/drm/panel/panel-simple.c ++++ b/drivers/gpu/drm/panel/panel-simple.c +@@ -94,6 +94,7 @@ struct panel_desc { + + u32 bus_format; + u32 bus_flags; ++ int connector_type; + }; + + struct panel_simple { +@@ -464,7 +465,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc) + if (!of_get_display_timing(dev->of_node, "panel-timing", &dt)) + panel_simple_parse_panel_timing_node(dev, panel, &dt); + +- drm_panel_init(&panel->base, dev, &panel_simple_funcs); ++ drm_panel_init(&panel->base, dev, &panel_simple_funcs, ++ desc->connector_type); + + err = drm_panel_add(&panel->base); + if (err < 0) +@@ -831,6 +833,7 @@ static const struct panel_desc auo_g133han01 = { + .unprepare = 1000, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct display_timing auo_g185han01_timings = { +@@ -860,6 +863,7 @@ static const struct panel_desc auo_g185han01 = { + .unprepare = 1000, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct display_timing auo_p320hvn03_timings = { +@@ -888,6 +892,7 @@ static const struct panel_desc auo_p320hvn03 = { + .unprepare = 500, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct drm_display_mode auo_t215hvn01_mode = { +@@ -1203,6 +1208,7 @@ static const struct panel_desc dlc_dlc0700yzg_1 = { + .disable = 200, + }, + .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct display_timing dlc_dlc1010gig_timing = { +@@ -1233,6 +1239,7 @@ static const struct panel_desc dlc_dlc1010gig = { + .unprepare = 60, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct drm_display_mode edt_et035012dm6_mode = { +@@ -1499,6 +1506,7 @@ static const struct panel_desc hannstar_hsd070pww1 = { + .height = 94, + }, + .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct display_timing hannstar_hsd100pxn1_timing = { +@@ -1523,6 +1531,7 @@ static const struct panel_desc hannstar_hsd100pxn1 = { + .height = 152, + }, + .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct drm_display_mode hitachi_tx23d38vm0caa_mode = { +@@ -1629,6 +1638,7 @@ static const struct panel_desc innolux_g070y2_l01 = { + .unprepare = 800, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct display_timing innolux_g101ice_l01_timing = { +@@ -1657,6 +1667,7 @@ static const struct panel_desc innolux_g101ice_l01 = { + .disable = 200, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct display_timing innolux_g121i1_l01_timing = { +@@ -1684,6 +1695,7 @@ static const struct panel_desc innolux_g121i1_l01 = { + .disable = 20, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct drm_display_mode innolux_g121x1_l03_mode = { +@@ -1867,6 +1879,7 @@ static const struct panel_desc koe_tx31d200vm0baa = { + .height = 109, + }, + .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct display_timing kyo_tcg121xglp_timing = { +@@ -1891,6 +1904,7 @@ static const struct panel_desc kyo_tcg121xglp = { + .height = 184, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct drm_display_mode lemaker_bl035_rgb_002_mode = { +@@ -1939,6 +1953,7 @@ static const struct panel_desc lg_lb070wv8 = { + .height = 91, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct drm_display_mode lg_lp079qx1_sp0v_mode = { +@@ -2095,6 +2110,7 @@ static const struct panel_desc mitsubishi_aa070mc01 = { + .disable = 400, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + .bus_flags = DRM_BUS_FLAG_DE_HIGH, + }; + +@@ -2123,6 +2139,7 @@ static const struct panel_desc nec_nl12880bc20_05 = { + .disable = 50, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct drm_display_mode nec_nl4827hc19_05b_mode = { +@@ -2225,6 +2242,7 @@ static const struct panel_desc nlt_nl192108ac18_02d = { + .unprepare = 500, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct drm_display_mode nvd_9128_mode = { +@@ -2248,6 +2266,7 @@ static const struct panel_desc nvd_9128 = { + .height = 88, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct display_timing okaya_rs800480t_7x0gp_timing = { +@@ -2660,6 +2679,7 @@ static const struct panel_desc sharp_lq101k1ly04 = { + .height = 136, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct display_timing sharp_lq123p1jx31_timing = { +@@ -2839,6 +2859,7 @@ static const struct panel_desc tianma_tm070jdhg30 = { + .height = 95, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct display_timing tianma_tm070rvhg71_timing = { +@@ -2863,6 +2884,7 @@ static const struct panel_desc tianma_tm070rvhg71 = { + .height = 86, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct drm_display_mode ti_nspire_cx_lcd_mode[] = { +@@ -2945,6 +2967,7 @@ static const struct panel_desc toshiba_lt089ac29000 = { + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X24, + .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct drm_display_mode tpk_f07a_0102_mode = { +@@ -3015,6 +3038,7 @@ static const struct panel_desc urt_umsh_8596md_lvds = { + .height = 91, + }, + .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG, ++ .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + + static const struct panel_desc urt_umsh_8596md_parallel = { +diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c +index 77a3f6b9aec1d..1d2fd6cc66740 100644 +--- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c ++++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c +@@ -369,7 +369,8 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi) + if (IS_ERR(st7701->backlight)) + return PTR_ERR(st7701->backlight); + +- drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs); ++ drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs, ++ DRM_MODE_CONNECTOR_DSI); + + /** + * Once sleep out has been issued, ST7701 IC required to wait 120ms +diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c +index 2eeaeee0dd7f3..108a85bb66672 100644 +--- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c ++++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c +@@ -381,7 +381,8 @@ static int st7789v_probe(struct spi_device *spi) + spi_set_drvdata(spi, ctx); + ctx->spi = spi; + +- drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs); ++ drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + ctx->power = devm_regulator_get(&spi->dev, "power"); + if (IS_ERR(ctx->power)) +diff --git a/drivers/gpu/drm/panel/panel-sony-acx565akm.c b/drivers/gpu/drm/panel/panel-sony-acx565akm.c +index 1e39067387a61..d6387d8f88a3f 100644 +--- a/drivers/gpu/drm/panel/panel-sony-acx565akm.c ++++ b/drivers/gpu/drm/panel/panel-sony-acx565akm.c +@@ -648,7 +648,8 @@ static int acx565akm_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs); ++ drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + ret = drm_panel_add(&lcd->panel); + if (ret < 0) { +diff --git a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c +index 76cfca89c3c78..c44d6a65c0aa2 100644 +--- a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c ++++ b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c +@@ -347,7 +347,8 @@ static int td028ttec1_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs); ++ drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + return drm_panel_add(&lcd->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c +index afd7c5ed53c45..621b65feec070 100644 +--- a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c ++++ b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c +@@ -458,7 +458,8 @@ static int td043mtea1_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs); ++ drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs, ++ DRM_MODE_CONNECTOR_DPI); + + ret = drm_panel_add(&lcd->panel); + if (ret < 0) { +diff --git a/drivers/gpu/drm/panel/panel-tpo-tpg110.c b/drivers/gpu/drm/panel/panel-tpo-tpg110.c +index 25524c26b241b..1a5418ae2ccf3 100644 +--- a/drivers/gpu/drm/panel/panel-tpo-tpg110.c ++++ b/drivers/gpu/drm/panel/panel-tpo-tpg110.c +@@ -457,7 +457,8 @@ static int tpg110_probe(struct spi_device *spi) + if (ret) + return ret; + +- drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs); ++ drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs, ++ DRM_MODE_CONNECTOR_DPI); + spi_set_drvdata(spi, tpg); + + return drm_panel_add(&tpg->panel); +diff --git a/drivers/gpu/drm/panel/panel-truly-nt35597.c b/drivers/gpu/drm/panel/panel-truly-nt35597.c +index c3714be788375..0feea2456e14b 100644 +--- a/drivers/gpu/drm/panel/panel-truly-nt35597.c ++++ b/drivers/gpu/drm/panel/panel-truly-nt35597.c +@@ -518,7 +518,8 @@ static int truly_nt35597_panel_add(struct truly_nt35597 *ctx) + /* dual port */ + gpiod_set_value(ctx->mode_gpio, 0); + +- drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs); ++ drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs, ++ DRM_MODE_CONNECTOR_DSI); + drm_panel_add(&ctx->panel); + + return 0; +diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h +index 4b9c656dc15e3..ce8da64022b43 100644 +--- a/include/drm/drm_panel.h ++++ b/include/drm/drm_panel.h +@@ -139,6 +139,15 @@ struct drm_panel { + */ + const struct drm_panel_funcs *funcs; + ++ /** ++ * @connector_type: ++ * ++ * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to ++ * initialise the drm_connector corresponding to the panel with the ++ * correct connector type. ++ */ ++ int connector_type; ++ + /** + * @list: + * +@@ -148,7 +157,8 @@ struct drm_panel { + }; + + void drm_panel_init(struct drm_panel *panel, struct device *dev, +- const struct drm_panel_funcs *funcs); ++ const struct drm_panel_funcs *funcs, ++ int connector_type); + + int drm_panel_add(struct drm_panel *panel); + void drm_panel_remove(struct drm_panel *panel); +-- +2.39.2 + diff --git a/queue-5.4/drm-panel-initialise-panel-dev-and-funcs-through-drm.patch b/queue-5.4/drm-panel-initialise-panel-dev-and-funcs-through-drm.patch new file mode 100644 index 00000000000..09ae6751e89 --- /dev/null +++ b/queue-5.4/drm-panel-initialise-panel-dev-and-funcs-through-drm.patch @@ -0,0 +1,724 @@ +From f849202961ea5bcb40ab2762d74ce17555110c64 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 23 Aug 2019 22:32:43 +0300 +Subject: drm/panel: Initialise panel dev and funcs through drm_panel_init() + +From: Laurent Pinchart + +[ Upstream commit 6dbe0c4b0fc0646442b2b1580d022404e582fd7b ] + +Instead of requiring all drivers to set the dev and funcs fields of +drm_panel manually after calling drm_panel_init(), pass the data as +arguments to the function. This simplifies the panel drivers, and will +help future refactoring when adding new arguments to drm_panel_init(). + +The panel drivers have been updated with the following Coccinelle +semantic patch, with manual inspection to verify that no call to +drm_panel_init() with a single argument still exists. + +@@ +expression panel; +expression device; +identifier ops; +@@ + drm_panel_init(&panel ++ , device, &ops + ); + ... +( +-panel.dev = device; +-panel.funcs = &ops; +| +-panel.funcs = &ops; +-panel.dev = device; +) + +Suggested-by: Sam Ravnborg +Signed-off-by: Laurent Pinchart +Signed-off-by: Sam Ravnborg +Link: https://patchwork.freedesktop.org/patch/msgid/20190823193245.23876-3-laurent.pinchart@ideasonboard.com +Stable-dep-of: 2c56a751845d ("drm/panel: simple: Add connector_type for innolux_at043tn24") +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/drm_panel.c | 11 ++++++++--- + drivers/gpu/drm/panel/panel-arm-versatile.c | 4 +--- + drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c | 4 +--- + drivers/gpu/drm/panel/panel-ilitek-ili9322.c | 4 +--- + drivers/gpu/drm/panel/panel-ilitek-ili9881c.c | 4 +--- + drivers/gpu/drm/panel/panel-innolux-p079zca.c | 4 +--- + drivers/gpu/drm/panel/panel-jdi-lt070me05000.c | 4 +--- + drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c | 5 ++--- + drivers/gpu/drm/panel/panel-lg-lb035q02.c | 4 +--- + drivers/gpu/drm/panel/panel-lg-lg4573.c | 4 +--- + drivers/gpu/drm/panel/panel-lvds.c | 4 +--- + drivers/gpu/drm/panel/panel-nec-nl8048hl11.c | 4 +--- + drivers/gpu/drm/panel/panel-novatek-nt39016.c | 4 +--- + drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c | 4 +--- + drivers/gpu/drm/panel/panel-orisetech-otm8009a.c | 4 +--- + drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c | 5 ++--- + drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c | 5 ++--- + drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | 4 +--- + drivers/gpu/drm/panel/panel-raydium-rm67191.c | 4 +--- + drivers/gpu/drm/panel/panel-raydium-rm68200.c | 4 +--- + drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c | 4 +--- + drivers/gpu/drm/panel/panel-ronbo-rb070d30.c | 4 +--- + drivers/gpu/drm/panel/panel-samsung-ld9040.c | 4 +--- + drivers/gpu/drm/panel/panel-samsung-s6d16d0.c | 4 +--- + drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c | 4 +--- + drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c | 4 +--- + drivers/gpu/drm/panel/panel-samsung-s6e63m0.c | 4 +--- + drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c | 4 +--- + drivers/gpu/drm/panel/panel-seiko-43wvf1g.c | 4 +--- + drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c | 4 +--- + drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c | 4 +--- + drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c | 5 ++--- + drivers/gpu/drm/panel/panel-simple.c | 4 +--- + drivers/gpu/drm/panel/panel-sitronix-st7701.c | 4 +--- + drivers/gpu/drm/panel/panel-sitronix-st7789v.c | 4 +--- + drivers/gpu/drm/panel/panel-sony-acx565akm.c | 4 +--- + drivers/gpu/drm/panel/panel-tpo-td028ttec1.c | 4 +--- + drivers/gpu/drm/panel/panel-tpo-td043mtea1.c | 4 +--- + drivers/gpu/drm/panel/panel-tpo-tpg110.c | 4 +--- + drivers/gpu/drm/panel/panel-truly-nt35597.c | 4 +--- + include/drm/drm_panel.h | 3 ++- + 41 files changed, 53 insertions(+), 121 deletions(-) + +diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c +index 6b0bf42039cfa..ba2fad4c96489 100644 +--- a/drivers/gpu/drm/drm_panel.c ++++ b/drivers/gpu/drm/drm_panel.c +@@ -44,13 +44,18 @@ static LIST_HEAD(panel_list); + /** + * drm_panel_init - initialize a panel + * @panel: DRM panel ++ * @dev: parent device of the panel ++ * @funcs: panel operations + * +- * Sets up internal fields of the panel so that it can subsequently be added +- * to the registry. ++ * Initialize the panel structure for subsequent registration with ++ * drm_panel_add(). + */ +-void drm_panel_init(struct drm_panel *panel) ++void drm_panel_init(struct drm_panel *panel, struct device *dev, ++ const struct drm_panel_funcs *funcs) + { + INIT_LIST_HEAD(&panel->list); ++ panel->dev = dev; ++ panel->funcs = funcs; + } + EXPORT_SYMBOL(drm_panel_init); + +diff --git a/drivers/gpu/drm/panel/panel-arm-versatile.c b/drivers/gpu/drm/panel/panel-arm-versatile.c +index 5f72c922a04b1..a4333ed0f20ca 100644 +--- a/drivers/gpu/drm/panel/panel-arm-versatile.c ++++ b/drivers/gpu/drm/panel/panel-arm-versatile.c +@@ -350,9 +350,7 @@ static int versatile_panel_probe(struct platform_device *pdev) + dev_info(dev, "panel mounted on IB2 daughterboard\n"); + } + +- drm_panel_init(&vpanel->panel); +- vpanel->panel.dev = dev; +- vpanel->panel.funcs = &versatile_panel_drm_funcs; ++ drm_panel_init(&vpanel->panel, dev, &versatile_panel_drm_funcs); + + return drm_panel_add(&vpanel->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c +index dabf59e0f56fa..7d5d7455bc01f 100644 +--- a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c ++++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c +@@ -204,9 +204,7 @@ static int feiyang_dsi_probe(struct mipi_dsi_device *dsi) + mipi_dsi_set_drvdata(dsi, ctx); + ctx->dsi = dsi; + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = &dsi->dev; +- ctx->panel.funcs = &feiyang_funcs; ++ drm_panel_init(&ctx->panel, &dsi->dev, &feiyang_funcs); + + ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd"); + if (IS_ERR(ctx->dvdd)) { +diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c +index 3c58f63adbf7e..ad2405baa0ac5 100644 +--- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c ++++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c +@@ -895,9 +895,7 @@ static int ili9322_probe(struct spi_device *spi) + ili->input = ili->conf->input; + } + +- drm_panel_init(&ili->panel); +- ili->panel.dev = dev; +- ili->panel.funcs = &ili9322_drm_funcs; ++ drm_panel_init(&ili->panel, dev, &ili9322_drm_funcs); + + return drm_panel_add(&ili->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c +index 3ad4a46c4e945..1d714f961c009 100644 +--- a/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c ++++ b/drivers/gpu/drm/panel/panel-ilitek-ili9881c.c +@@ -433,9 +433,7 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi) + mipi_dsi_set_drvdata(dsi, ctx); + ctx->dsi = dsi; + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = &dsi->dev; +- ctx->panel.funcs = &ili9881c_funcs; ++ drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs); + + ctx->power = devm_regulator_get(&dsi->dev, "power"); + if (IS_ERR(ctx->power)) { +diff --git a/drivers/gpu/drm/panel/panel-innolux-p079zca.c b/drivers/gpu/drm/panel/panel-innolux-p079zca.c +index df90b66079816..8f3647804a1e4 100644 +--- a/drivers/gpu/drm/panel/panel-innolux-p079zca.c ++++ b/drivers/gpu/drm/panel/panel-innolux-p079zca.c +@@ -487,9 +487,7 @@ static int innolux_panel_add(struct mipi_dsi_device *dsi, + if (IS_ERR(innolux->backlight)) + return PTR_ERR(innolux->backlight); + +- drm_panel_init(&innolux->base); +- innolux->base.funcs = &innolux_panel_funcs; +- innolux->base.dev = dev; ++ drm_panel_init(&innolux->base, dev, &innolux_panel_funcs); + + err = drm_panel_add(&innolux->base); + if (err < 0) +diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c +index ff3e89e61e3fc..7bfdbfbc868ed 100644 +--- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c ++++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c +@@ -437,9 +437,7 @@ static int jdi_panel_add(struct jdi_panel *jdi) + return ret; + } + +- drm_panel_init(&jdi->base); +- jdi->base.funcs = &jdi_panel_funcs; +- jdi->base.dev = &jdi->dsi->dev; ++ drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs); + + ret = drm_panel_add(&jdi->base); + +diff --git a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c +index 1e7fecab72a9f..bb131749a0b92 100644 +--- a/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c ++++ b/drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c +@@ -391,9 +391,8 @@ static int kingdisplay_panel_add(struct kingdisplay_panel *kingdisplay) + if (IS_ERR(kingdisplay->backlight)) + return PTR_ERR(kingdisplay->backlight); + +- drm_panel_init(&kingdisplay->base); +- kingdisplay->base.funcs = &kingdisplay_panel_funcs; +- kingdisplay->base.dev = &kingdisplay->link->dev; ++ drm_panel_init(&kingdisplay->base, &kingdisplay->link->dev, ++ &kingdisplay_panel_funcs); + + return drm_panel_add(&kingdisplay->base); + } +diff --git a/drivers/gpu/drm/panel/panel-lg-lb035q02.c b/drivers/gpu/drm/panel/panel-lg-lb035q02.c +index ee4379729a5b8..c7b9b47849bb8 100644 +--- a/drivers/gpu/drm/panel/panel-lg-lb035q02.c ++++ b/drivers/gpu/drm/panel/panel-lg-lb035q02.c +@@ -196,9 +196,7 @@ static int lb035q02_probe(struct spi_device *spi) + if (ret < 0) + return ret; + +- drm_panel_init(&lcd->panel); +- lcd->panel.dev = &lcd->spi->dev; +- lcd->panel.funcs = &lb035q02_funcs; ++ drm_panel_init(&lcd->panel, &lcd->spi->dev, &lb035q02_funcs); + + return drm_panel_add(&lcd->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-lg-lg4573.c b/drivers/gpu/drm/panel/panel-lg-lg4573.c +index 41bf02d122a1f..608f2de91662d 100644 +--- a/drivers/gpu/drm/panel/panel-lg-lg4573.c ++++ b/drivers/gpu/drm/panel/panel-lg-lg4573.c +@@ -259,9 +259,7 @@ static int lg4573_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = &spi->dev; +- ctx->panel.funcs = &lg4573_drm_funcs; ++ drm_panel_init(&ctx->panel, &spi->dev, &lg4573_drm_funcs); + + return drm_panel_add(&ctx->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c +index bf5fcc3e53791..ff1e305d56a02 100644 +--- a/drivers/gpu/drm/panel/panel-lvds.c ++++ b/drivers/gpu/drm/panel/panel-lvds.c +@@ -254,9 +254,7 @@ static int panel_lvds_probe(struct platform_device *pdev) + */ + + /* Register the panel. */ +- drm_panel_init(&lvds->panel); +- lvds->panel.dev = lvds->dev; +- lvds->panel.funcs = &panel_lvds_funcs; ++ drm_panel_init(&lvds->panel, lvds->dev, &panel_lvds_funcs); + + ret = drm_panel_add(&lvds->panel); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c +index 20f17e46e65da..272a1434e1558 100644 +--- a/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c ++++ b/drivers/gpu/drm/panel/panel-nec-nl8048hl11.c +@@ -205,9 +205,7 @@ static int nl8048_probe(struct spi_device *spi) + if (ret < 0) + return ret; + +- drm_panel_init(&lcd->panel); +- lcd->panel.dev = &lcd->spi->dev; +- lcd->panel.funcs = &nl8048_funcs; ++ drm_panel_init(&lcd->panel, &lcd->spi->dev, &nl8048_funcs); + + return drm_panel_add(&lcd->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-novatek-nt39016.c b/drivers/gpu/drm/panel/panel-novatek-nt39016.c +index 2ad1063b068d5..64cfe111aaadb 100644 +--- a/drivers/gpu/drm/panel/panel-novatek-nt39016.c ++++ b/drivers/gpu/drm/panel/panel-novatek-nt39016.c +@@ -292,9 +292,7 @@ static int nt39016_probe(struct spi_device *spi) + return err; + } + +- drm_panel_init(&panel->drm_panel); +- panel->drm_panel.dev = dev; +- panel->drm_panel.funcs = &nt39016_funcs; ++ drm_panel_init(&panel->drm_panel, dev, &nt39016_funcs); + + err = drm_panel_add(&panel->drm_panel); + if (err < 0) { +diff --git a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c +index 2bae1db3ff344..f2d6a4ec00467 100644 +--- a/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c ++++ b/drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c +@@ -288,9 +288,7 @@ static int lcd_olinuxino_probe(struct i2c_client *client, + if (IS_ERR(lcd->backlight)) + return PTR_ERR(lcd->backlight); + +- drm_panel_init(&lcd->panel); +- lcd->panel.dev = dev; +- lcd->panel.funcs = &lcd_olinuxino_funcs; ++ drm_panel_init(&lcd->panel, dev, &lcd_olinuxino_funcs); + + return drm_panel_add(&lcd->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c +index 3ee265f1755f4..5aacd632c6f69 100644 +--- a/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c ++++ b/drivers/gpu/drm/panel/panel-orisetech-otm8009a.c +@@ -455,9 +455,7 @@ static int otm8009a_probe(struct mipi_dsi_device *dsi) + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_LPM; + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = dev; +- ctx->panel.funcs = &otm8009a_drm_funcs; ++ drm_panel_init(&ctx->panel, dev, &otm8009a_drm_funcs); + + ctx->bl_dev = devm_backlight_device_register(dev, dev_name(dev), + dev, ctx, +diff --git a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c +index e0e20ecff916d..38f114b03b897 100644 +--- a/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c ++++ b/drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c +@@ -166,9 +166,8 @@ static int osd101t2587_panel_add(struct osd101t2587_panel *osd101t2587) + if (IS_ERR(osd101t2587->backlight)) + return PTR_ERR(osd101t2587->backlight); + +- drm_panel_init(&osd101t2587->base); +- osd101t2587->base.funcs = &osd101t2587_panel_funcs; +- osd101t2587->base.dev = &osd101t2587->dsi->dev; ++ drm_panel_init(&osd101t2587->base, &osd101t2587->dsi->dev, ++ &osd101t2587_panel_funcs); + + return drm_panel_add(&osd101t2587->base); + } +diff --git a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c +index 3dff0b3f73c23..6035bf4580744 100644 +--- a/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c ++++ b/drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c +@@ -223,9 +223,8 @@ static int wuxga_nt_panel_add(struct wuxga_nt_panel *wuxga_nt) + return -EPROBE_DEFER; + } + +- drm_panel_init(&wuxga_nt->base); +- wuxga_nt->base.funcs = &wuxga_nt_panel_funcs; +- wuxga_nt->base.dev = &wuxga_nt->dsi->dev; ++ drm_panel_init(&wuxga_nt->base, &wuxga_nt->dsi->dev, ++ &wuxga_nt_panel_funcs); + + ret = drm_panel_add(&wuxga_nt->base); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +index a621dd28ff70d..cded730f29ad2 100644 +--- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c ++++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +@@ -433,9 +433,7 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c, + return PTR_ERR(ts->dsi); + } + +- drm_panel_init(&ts->base); +- ts->base.dev = dev; +- ts->base.funcs = &rpi_touchscreen_funcs; ++ drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs); + + /* This appears last, as it's what will unblock the DSI host + * driver's component bind function. +diff --git a/drivers/gpu/drm/panel/panel-raydium-rm67191.c b/drivers/gpu/drm/panel/panel-raydium-rm67191.c +index 6a5d37006103e..f82a1f69f13ba 100644 +--- a/drivers/gpu/drm/panel/panel-raydium-rm67191.c ++++ b/drivers/gpu/drm/panel/panel-raydium-rm67191.c +@@ -606,9 +606,7 @@ static int rad_panel_probe(struct mipi_dsi_device *dsi) + if (ret) + return ret; + +- drm_panel_init(&panel->panel); +- panel->panel.funcs = &rad_panel_funcs; +- panel->panel.dev = dev; ++ drm_panel_init(&panel->panel, dev, &rad_panel_funcs); + dev_set_drvdata(dev, panel); + + ret = drm_panel_add(&panel->panel); +diff --git a/drivers/gpu/drm/panel/panel-raydium-rm68200.c b/drivers/gpu/drm/panel/panel-raydium-rm68200.c +index ba889625ad435..f004b78fb8bc9 100644 +--- a/drivers/gpu/drm/panel/panel-raydium-rm68200.c ++++ b/drivers/gpu/drm/panel/panel-raydium-rm68200.c +@@ -404,9 +404,7 @@ static int rm68200_probe(struct mipi_dsi_device *dsi) + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_LPM; + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = dev; +- ctx->panel.funcs = &rm68200_drm_funcs; ++ drm_panel_init(&ctx->panel, dev, &rm68200_drm_funcs); + + drm_panel_add(&ctx->panel); + +diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c +index b9109922397ff..d7f56374f2f17 100644 +--- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c ++++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c +@@ -343,9 +343,7 @@ static int jh057n_probe(struct mipi_dsi_device *dsi) + return ret; + } + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = dev; +- ctx->panel.funcs = &jh057n_drm_funcs; ++ drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs); + + drm_panel_add(&ctx->panel); + +diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c +index 3c15764f0c039..8708fbbe76376 100644 +--- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c ++++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c +@@ -173,9 +173,7 @@ static int rb070d30_panel_dsi_probe(struct mipi_dsi_device *dsi) + mipi_dsi_set_drvdata(dsi, ctx); + ctx->dsi = dsi; + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = &dsi->dev; +- ctx->panel.funcs = &rb070d30_panel_funcs; ++ drm_panel_init(&ctx->panel, &dsi->dev, &rb070d30_panel_funcs); + + ctx->gpios.reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(ctx->gpios.reset)) { +diff --git a/drivers/gpu/drm/panel/panel-samsung-ld9040.c b/drivers/gpu/drm/panel/panel-samsung-ld9040.c +index 3be902dcedc02..71a292dbec478 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-ld9040.c ++++ b/drivers/gpu/drm/panel/panel-samsung-ld9040.c +@@ -351,9 +351,7 @@ static int ld9040_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = dev; +- ctx->panel.funcs = &ld9040_drm_funcs; ++ drm_panel_init(&ctx->panel, dev, &ld9040_drm_funcs); + + return drm_panel_add(&ctx->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c +index f75bef24e0504..4d25c96e842cf 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c ++++ b/drivers/gpu/drm/panel/panel-samsung-s6d16d0.c +@@ -215,9 +215,7 @@ static int s6d16d0_probe(struct mipi_dsi_device *dsi) + return ret; + } + +- drm_panel_init(&s6->panel); +- s6->panel.dev = dev; +- s6->panel.funcs = &s6d16d0_drm_funcs; ++ drm_panel_init(&s6->panel, dev, &s6d16d0_drm_funcs); + + ret = drm_panel_add(&s6->panel); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c +index b923de23ed654..42a3aaab49eb4 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c ++++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c +@@ -732,9 +732,7 @@ static int s6e3ha2_probe(struct mipi_dsi_device *dsi) + ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS; + ctx->bl_dev->props.power = FB_BLANK_POWERDOWN; + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = dev; +- ctx->panel.funcs = &s6e3ha2_drm_funcs; ++ drm_panel_init(&ctx->panel, dev, &s6e3ha2_drm_funcs); + + ret = drm_panel_add(&ctx->panel); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c +index cd90fa700c493..b4d879bf4d03d 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c ++++ b/drivers/gpu/drm/panel/panel-samsung-s6e63j0x03.c +@@ -466,9 +466,7 @@ static int s6e63j0x03_probe(struct mipi_dsi_device *dsi) + return PTR_ERR(ctx->reset_gpio); + } + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = dev; +- ctx->panel.funcs = &s6e63j0x03_funcs; ++ drm_panel_init(&ctx->panel, dev, &s6e63j0x03_funcs); + + ctx->bl_dev = backlight_device_register("s6e63j0x03", dev, ctx, + &s6e63j0x03_bl_ops, NULL); +diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c +index 142d395ea5129..61259c2833ab8 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c ++++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0.c +@@ -473,9 +473,7 @@ static int s6e63m0_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = dev; +- ctx->panel.funcs = &s6e63m0_drm_funcs; ++ drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs); + + ret = s6e63m0_backlight_register(ctx); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c +index 81858267723ad..35dbffabd5267 100644 +--- a/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c ++++ b/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c +@@ -1017,9 +1017,7 @@ static int s6e8aa0_probe(struct mipi_dsi_device *dsi) + + ctx->brightness = GAMMA_LEVEL_NUM - 1; + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = dev; +- ctx->panel.funcs = &s6e8aa0_drm_funcs; ++ drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs); + + ret = drm_panel_add(&ctx->panel); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c +index 18b22b1294fbc..0833d0c03adc9 100644 +--- a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c ++++ b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c +@@ -274,9 +274,7 @@ static int seiko_panel_probe(struct device *dev, + return -EPROBE_DEFER; + } + +- drm_panel_init(&panel->base); +- panel->base.dev = dev; +- panel->base.funcs = &seiko_panel_funcs; ++ drm_panel_init(&panel->base, dev, &seiko_panel_funcs); + + err = drm_panel_add(&panel->base); + if (err < 0) +diff --git a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c +index e910b4ad13104..87a58cb4d9455 100644 +--- a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c ++++ b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c +@@ -329,9 +329,7 @@ static int sharp_panel_add(struct sharp_panel *sharp) + if (IS_ERR(sharp->backlight)) + return PTR_ERR(sharp->backlight); + +- drm_panel_init(&sharp->base); +- sharp->base.funcs = &sharp_panel_funcs; +- sharp->base.dev = &sharp->link1->dev; ++ drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs); + + return drm_panel_add(&sharp->base); + } +diff --git a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c +index 46cd9a2501298..96e3deb0e305c 100644 +--- a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c ++++ b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c +@@ -185,9 +185,7 @@ static int ls037v7dw01_probe(struct platform_device *pdev) + return PTR_ERR(lcd->ud_gpio); + } + +- drm_panel_init(&lcd->panel); +- lcd->panel.dev = &pdev->dev; +- lcd->panel.funcs = &ls037v7dw01_funcs; ++ drm_panel_init(&lcd->panel, &pdev->dev, &ls037v7dw01_funcs); + + return drm_panel_add(&lcd->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c +index c39abde9f9f10..ffa844ee82ad4 100644 +--- a/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c ++++ b/drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c +@@ -264,9 +264,8 @@ static int sharp_nt_panel_add(struct sharp_nt_panel *sharp_nt) + if (IS_ERR(sharp_nt->backlight)) + return PTR_ERR(sharp_nt->backlight); + +- drm_panel_init(&sharp_nt->base); +- sharp_nt->base.funcs = &sharp_nt_panel_funcs; +- sharp_nt->base.dev = &sharp_nt->dsi->dev; ++ drm_panel_init(&sharp_nt->base, &sharp_nt->dsi->dev, ++ &sharp_nt_panel_funcs); + + return drm_panel_add(&sharp_nt->base); + } +diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c +index ec0085e664365..156bd4d551dc3 100644 +--- a/drivers/gpu/drm/panel/panel-simple.c ++++ b/drivers/gpu/drm/panel/panel-simple.c +@@ -464,9 +464,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc) + if (!of_get_display_timing(dev->of_node, "panel-timing", &dt)) + panel_simple_parse_panel_timing_node(dev, panel, &dt); + +- drm_panel_init(&panel->base); +- panel->base.dev = dev; +- panel->base.funcs = &panel_simple_funcs; ++ drm_panel_init(&panel->base, dev, &panel_simple_funcs); + + err = drm_panel_add(&panel->base); + if (err < 0) +diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c +index 638f605acb2db..77a3f6b9aec1d 100644 +--- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c ++++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c +@@ -369,7 +369,7 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi) + if (IS_ERR(st7701->backlight)) + return PTR_ERR(st7701->backlight); + +- drm_panel_init(&st7701->panel); ++ drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs); + + /** + * Once sleep out has been issued, ST7701 IC required to wait 120ms +@@ -381,8 +381,6 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi) + * ts8550b and there is no valid documentation for that. + */ + st7701->sleep_delay = 120 + desc->panel_sleep_delay; +- st7701->panel.funcs = &st7701_funcs; +- st7701->panel.dev = &dsi->dev; + + ret = drm_panel_add(&st7701->panel); + if (ret < 0) +diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c +index 3b2612ae931e8..2eeaeee0dd7f3 100644 +--- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c ++++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c +@@ -381,9 +381,7 @@ static int st7789v_probe(struct spi_device *spi) + spi_set_drvdata(spi, ctx); + ctx->spi = spi; + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = &spi->dev; +- ctx->panel.funcs = &st7789v_drm_funcs; ++ drm_panel_init(&ctx->panel, &spi->dev, &st7789v_drm_funcs); + + ctx->power = devm_regulator_get(&spi->dev, "power"); + if (IS_ERR(ctx->power)) +diff --git a/drivers/gpu/drm/panel/panel-sony-acx565akm.c b/drivers/gpu/drm/panel/panel-sony-acx565akm.c +index 3d5b9c4f68d98..1e39067387a61 100644 +--- a/drivers/gpu/drm/panel/panel-sony-acx565akm.c ++++ b/drivers/gpu/drm/panel/panel-sony-acx565akm.c +@@ -648,9 +648,7 @@ static int acx565akm_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&lcd->panel); +- lcd->panel.dev = &lcd->spi->dev; +- lcd->panel.funcs = &acx565akm_funcs; ++ drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs); + + ret = drm_panel_add(&lcd->panel); + if (ret < 0) { +diff --git a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c +index f2baff827f507..76cfca89c3c78 100644 +--- a/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c ++++ b/drivers/gpu/drm/panel/panel-tpo-td028ttec1.c +@@ -347,9 +347,7 @@ static int td028ttec1_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&lcd->panel); +- lcd->panel.dev = &lcd->spi->dev; +- lcd->panel.funcs = &td028ttec1_funcs; ++ drm_panel_init(&lcd->panel, &lcd->spi->dev, &td028ttec1_funcs); + + return drm_panel_add(&lcd->panel); + } +diff --git a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c +index ba163c779084c..afd7c5ed53c45 100644 +--- a/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c ++++ b/drivers/gpu/drm/panel/panel-tpo-td043mtea1.c +@@ -458,9 +458,7 @@ static int td043mtea1_probe(struct spi_device *spi) + return ret; + } + +- drm_panel_init(&lcd->panel); +- lcd->panel.dev = &lcd->spi->dev; +- lcd->panel.funcs = &td043mtea1_funcs; ++ drm_panel_init(&lcd->panel, &lcd->spi->dev, &td043mtea1_funcs); + + ret = drm_panel_add(&lcd->panel); + if (ret < 0) { +diff --git a/drivers/gpu/drm/panel/panel-tpo-tpg110.c b/drivers/gpu/drm/panel/panel-tpo-tpg110.c +index 71591e5f59383..25524c26b241b 100644 +--- a/drivers/gpu/drm/panel/panel-tpo-tpg110.c ++++ b/drivers/gpu/drm/panel/panel-tpo-tpg110.c +@@ -457,9 +457,7 @@ static int tpg110_probe(struct spi_device *spi) + if (ret) + return ret; + +- drm_panel_init(&tpg->panel); +- tpg->panel.dev = dev; +- tpg->panel.funcs = &tpg110_drm_funcs; ++ drm_panel_init(&tpg->panel, dev, &tpg110_drm_funcs); + spi_set_drvdata(spi, tpg); + + return drm_panel_add(&tpg->panel); +diff --git a/drivers/gpu/drm/panel/panel-truly-nt35597.c b/drivers/gpu/drm/panel/panel-truly-nt35597.c +index 77e1311b7c692..c3714be788375 100644 +--- a/drivers/gpu/drm/panel/panel-truly-nt35597.c ++++ b/drivers/gpu/drm/panel/panel-truly-nt35597.c +@@ -518,9 +518,7 @@ static int truly_nt35597_panel_add(struct truly_nt35597 *ctx) + /* dual port */ + gpiod_set_value(ctx->mode_gpio, 0); + +- drm_panel_init(&ctx->panel); +- ctx->panel.dev = dev; +- ctx->panel.funcs = &truly_nt35597_drm_funcs; ++ drm_panel_init(&ctx->panel, dev, &truly_nt35597_drm_funcs); + drm_panel_add(&ctx->panel); + + return 0; +diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h +index 624bd15ecfab6..4b9c656dc15e3 100644 +--- a/include/drm/drm_panel.h ++++ b/include/drm/drm_panel.h +@@ -147,7 +147,8 @@ struct drm_panel { + struct list_head list; + }; + +-void drm_panel_init(struct drm_panel *panel); ++void drm_panel_init(struct drm_panel *panel, struct device *dev, ++ const struct drm_panel_funcs *funcs); + + int drm_panel_add(struct drm_panel *panel); + void drm_panel_remove(struct drm_panel *panel); +-- +2.39.2 + diff --git a/queue-5.4/drm-panel-simple-add-connector_type-for-innolux_at04.patch b/queue-5.4/drm-panel-simple-add-connector_type-for-innolux_at04.patch new file mode 100644 index 00000000000..0288c2cc55f --- /dev/null +++ b/queue-5.4/drm-panel-simple-add-connector_type-for-innolux_at04.patch @@ -0,0 +1,39 @@ +From 15a2f19a825813ff4508488feb70893b2903eee2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 20 Jun 2023 08:22:02 -0300 +Subject: drm/panel: simple: Add connector_type for innolux_at043tn24 + +From: Fabio Estevam + +[ Upstream commit 2c56a751845ddfd3078ebe79981aaaa182629163 ] + +The innolux at043tn24 display is a parallel LCD. Pass the 'connector_type' +information to avoid the following warning: + +panel-simple panel: Specify missing connector_type + +Signed-off-by: Fabio Estevam +Fixes: 41bcceb4de9c ("drm/panel: simple: Add support for Innolux AT043TN24") +Reviewed-by: Sam Ravnborg +Signed-off-by: Neil Armstrong +Link: https://patchwork.freedesktop.org/patch/msgid/20230620112202.654981-1-festevam@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/panel/panel-simple.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c +index af71365fb99b3..a87b79c8d76f7 100644 +--- a/drivers/gpu/drm/panel/panel-simple.c ++++ b/drivers/gpu/drm/panel/panel-simple.c +@@ -1584,6 +1584,7 @@ static const struct panel_desc innolux_at043tn24 = { + .height = 54, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X24, ++ .connector_type = DRM_MODE_CONNECTOR_DPI, + .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE, + }; + +-- +2.39.2 + diff --git a/queue-5.4/erofs-avoid-infinite-loop-in-z_erofs_do_read_page-wh.patch b/queue-5.4/erofs-avoid-infinite-loop-in-z_erofs_do_read_page-wh.patch new file mode 100644 index 00000000000..b4af1f14cdb --- /dev/null +++ b/queue-5.4/erofs-avoid-infinite-loop-in-z_erofs_do_read_page-wh.patch @@ -0,0 +1,54 @@ +From 3099608e5a6ce78608c3eada9fdad4a1193a66f6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 10 Jul 2023 17:34:10 +0800 +Subject: erofs: avoid infinite loop in z_erofs_do_read_page() when reading + beyond EOF + +From: Chunhai Guo + +[ Upstream commit 8191213a5835b0317c5e4d0d337ae1ae00c75253 ] + +z_erofs_do_read_page() may loop infinitely due to the inappropriate +truncation in the below statement. Since the offset is 64 bits and min_t() +truncates the result to 32 bits. The solution is to replace unsigned int +with a 64-bit type, such as erofs_off_t. + cur = end - min_t(unsigned int, offset + end - map->m_la, end); + + - For example: + - offset = 0x400160000 + - end = 0x370 + - map->m_la = 0x160370 + - offset + end - map->m_la = 0x400000000 + - offset + end - map->m_la = 0x00000000 (truncated as unsigned int) + - Expected result: + - cur = 0 + - Actual result: + - cur = 0x370 + +Signed-off-by: Chunhai Guo +Fixes: 3883a79abd02 ("staging: erofs: introduce VLE decompression support") +Reviewed-by: Gao Xiang +Reviewed-by: Chao Yu +Link: https://lore.kernel.org/r/20230710093410.44071-1-guochunhai@vivo.com +Signed-off-by: Gao Xiang +Signed-off-by: Sasha Levin +--- + fs/erofs/zdata.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c +index fdd18c2508115..dcc377094f90b 100644 +--- a/fs/erofs/zdata.c ++++ b/fs/erofs/zdata.c +@@ -636,7 +636,7 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe, + tight &= (clt->mode >= COLLECT_PRIMARY_HOOKED && + clt->mode != COLLECT_PRIMARY_FOLLOWED_NOINPLACE); + +- cur = end - min_t(unsigned int, offset + end - map->m_la, end); ++ cur = end - min_t(erofs_off_t, offset + end - map->m_la, end); + if (!(map->m_flags & EROFS_MAP_MAPPED)) { + zero_user_segment(page, cur, end); + goto next_part; +-- +2.39.2 + diff --git a/queue-5.4/icmp6-fix-null-ptr-deref-of-ip6_null_entry-rt6i_idev.patch b/queue-5.4/icmp6-fix-null-ptr-deref-of-ip6_null_entry-rt6i_idev.patch new file mode 100644 index 00000000000..d9c91e65a55 --- /dev/null +++ b/queue-5.4/icmp6-fix-null-ptr-deref-of-ip6_null_entry-rt6i_idev.patch @@ -0,0 +1,145 @@ +From dfabf3cb2a6e619faed5ac9bc76d21417cb33a66 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 7 Jul 2023 18:43:27 -0700 +Subject: icmp6: Fix null-ptr-deref of ip6_null_entry->rt6i_idev in + icmp6_dev(). + +From: Kuniyuki Iwashima + +[ Upstream commit 2aaa8a15de73874847d62eb595c6683bface80fd ] + +With some IPv6 Ext Hdr (RPL, SRv6, etc.), we can send a packet that +has the link-local address as src and dst IP and will be forwarded to +an external IP in the IPv6 Ext Hdr. + +For example, the script below generates a packet whose src IP is the +link-local address and dst is updated to 11::. + + # for f in $(find /proc/sys/net/ -name *seg6_enabled*); do echo 1 > $f; done + # python3 + >>> from socket import * + >>> from scapy.all import * + >>> + >>> SRC_ADDR = DST_ADDR = "fe80::5054:ff:fe12:3456" + >>> + >>> pkt = IPv6(src=SRC_ADDR, dst=DST_ADDR) + >>> pkt /= IPv6ExtHdrSegmentRouting(type=4, addresses=["11::", "22::"], segleft=1) + >>> + >>> sk = socket(AF_INET6, SOCK_RAW, IPPROTO_RAW) + >>> sk.sendto(bytes(pkt), (DST_ADDR, 0)) + +For such a packet, we call ip6_route_input() to look up a route for the +next destination in these three functions depending on the header type. + + * ipv6_rthdr_rcv() + * ipv6_rpl_srh_rcv() + * ipv6_srh_rcv() + +If no route is found, ip6_null_entry is set to skb, and the following +dst_input(skb) calls ip6_pkt_drop(). + +Finally, in icmp6_dev(), we dereference skb_rt6_info(skb)->rt6i_idev->dev +as the input device is the loopback interface. Then, we have to check if +skb_rt6_info(skb)->rt6i_idev is NULL or not to avoid NULL pointer deref +for ip6_null_entry. + +BUG: kernel NULL pointer dereference, address: 0000000000000000 + PF: supervisor read access in kernel mode + PF: error_code(0x0000) - not-present page +PGD 0 P4D 0 +Oops: 0000 [#1] PREEMPT SMP PTI +CPU: 0 PID: 157 Comm: python3 Not tainted 6.4.0-11996-gb121d614371c #35 +Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014 +RIP: 0010:icmp6_send (net/ipv6/icmp.c:436 net/ipv6/icmp.c:503) +Code: fe ff ff 48 c7 40 30 c0 86 5d 83 e8 c6 44 1c 00 e9 c8 fc ff ff 49 8b 46 58 48 83 e0 fe 0f 84 4a fb ff ff 48 8b 80 d0 00 00 00 <48> 8b 00 44 8b 88 e0 00 00 00 e9 34 fb ff ff 4d 85 ed 0f 85 69 01 +RSP: 0018:ffffc90000003c70 EFLAGS: 00000286 +RAX: 0000000000000000 RBX: 0000000000000001 RCX: 00000000000000e0 +RDX: 0000000000000021 RSI: 0000000000000000 RDI: ffff888006d72a18 +RBP: ffffc90000003d80 R08: 0000000000000000 R09: 0000000000000001 +R10: ffffc90000003d98 R11: 0000000000000040 R12: ffff888006d72a10 +R13: 0000000000000000 R14: ffff8880057fb800 R15: ffffffff835d86c0 +FS: 00007f9dc72ee740(0000) GS:ffff88807dc00000(0000) knlGS:0000000000000000 +CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +CR2: 0000000000000000 CR3: 00000000057b2000 CR4: 00000000007506f0 +PKRU: 55555554 +Call Trace: + + ip6_pkt_drop (net/ipv6/route.c:4513) + ipv6_rthdr_rcv (net/ipv6/exthdrs.c:640 net/ipv6/exthdrs.c:686) + ip6_protocol_deliver_rcu (net/ipv6/ip6_input.c:437 (discriminator 5)) + ip6_input_finish (./include/linux/rcupdate.h:781 net/ipv6/ip6_input.c:483) + __netif_receive_skb_one_core (net/core/dev.c:5455) + process_backlog (./include/linux/rcupdate.h:781 net/core/dev.c:5895) + __napi_poll (net/core/dev.c:6460) + net_rx_action (net/core/dev.c:6529 net/core/dev.c:6660) + __do_softirq (./arch/x86/include/asm/jump_label.h:27 ./include/linux/jump_label.h:207 ./include/trace/events/irq.h:142 kernel/softirq.c:554) + do_softirq (kernel/softirq.c:454 kernel/softirq.c:441) + + + __local_bh_enable_ip (kernel/softirq.c:381) + __dev_queue_xmit (net/core/dev.c:4231) + ip6_finish_output2 (./include/net/neighbour.h:544 net/ipv6/ip6_output.c:135) + rawv6_sendmsg (./include/net/dst.h:458 ./include/linux/netfilter.h:303 net/ipv6/raw.c:656 net/ipv6/raw.c:914) + sock_sendmsg (net/socket.c:725 net/socket.c:748) + __sys_sendto (net/socket.c:2134) + __x64_sys_sendto (net/socket.c:2146 net/socket.c:2142 net/socket.c:2142) + do_syscall_64 (arch/x86/entry/common.c:50 arch/x86/entry/common.c:80) + entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:120) +RIP: 0033:0x7f9dc751baea +Code: d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 f3 0f 1e fa 41 89 ca 64 8b 04 25 18 00 00 00 85 c0 75 15 b8 2c 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 7e c3 0f 1f 44 00 00 41 54 48 83 ec 30 44 89 +RSP: 002b:00007ffe98712c38 EFLAGS: 00000246 ORIG_RAX: 000000000000002c +RAX: ffffffffffffffda RBX: 00007ffe98712cf8 RCX: 00007f9dc751baea +RDX: 0000000000000060 RSI: 00007f9dc6460b90 RDI: 0000000000000003 +RBP: 00007f9dc56e8be0 R08: 00007ffe98712d70 R09: 000000000000001c +R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 +R13: ffffffffc4653600 R14: 0000000000000001 R15: 00007f9dc6af5d1b + +Modules linked in: +CR2: 0000000000000000 + ---[ end trace 0000000000000000 ]--- +RIP: 0010:icmp6_send (net/ipv6/icmp.c:436 net/ipv6/icmp.c:503) +Code: fe ff ff 48 c7 40 30 c0 86 5d 83 e8 c6 44 1c 00 e9 c8 fc ff ff 49 8b 46 58 48 83 e0 fe 0f 84 4a fb ff ff 48 8b 80 d0 00 00 00 <48> 8b 00 44 8b 88 e0 00 00 00 e9 34 fb ff ff 4d 85 ed 0f 85 69 01 +RSP: 0018:ffffc90000003c70 EFLAGS: 00000286 +RAX: 0000000000000000 RBX: 0000000000000001 RCX: 00000000000000e0 +RDX: 0000000000000021 RSI: 0000000000000000 RDI: ffff888006d72a18 +RBP: ffffc90000003d80 R08: 0000000000000000 R09: 0000000000000001 +R10: ffffc90000003d98 R11: 0000000000000040 R12: ffff888006d72a10 +R13: 0000000000000000 R14: ffff8880057fb800 R15: ffffffff835d86c0 +FS: 00007f9dc72ee740(0000) GS:ffff88807dc00000(0000) knlGS:0000000000000000 +CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +CR2: 0000000000000000 CR3: 00000000057b2000 CR4: 00000000007506f0 +PKRU: 55555554 +Kernel panic - not syncing: Fatal exception in interrupt +Kernel Offset: disabled + +Fixes: 4832c30d5458 ("net: ipv6: put host and anycast routes on device with address") +Reported-by: Wang Yufen +Closes: https://lore.kernel.org/netdev/c41403a9-c2f6-3b7e-0c96-e1901e605cd0@huawei.com/ +Signed-off-by: Kuniyuki Iwashima +Reviewed-by: David Ahern +Reviewed-by: Eric Dumazet +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv6/icmp.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c +index 3db10cae7b178..169467b5c98a6 100644 +--- a/net/ipv6/icmp.c ++++ b/net/ipv6/icmp.c +@@ -410,7 +410,10 @@ static struct net_device *icmp6_dev(const struct sk_buff *skb) + if (unlikely(dev->ifindex == LOOPBACK_IFINDEX || netif_is_l3_master(skb->dev))) { + const struct rt6_info *rt6 = skb_rt6_info(skb); + +- if (rt6) ++ /* The destination could be an external IP in Ext Hdr (SRv6, RPL, etc.), ++ * and ip6_null_entry could be set to skb if no route is found. ++ */ ++ if (rt6 && rt6->rt6i_idev) + dev = rt6->rt6i_idev->dev; + } + +-- +2.39.2 + diff --git a/queue-5.4/igc-remove-delay-during-tx-ring-configuration.patch b/queue-5.4/igc-remove-delay-during-tx-ring-configuration.patch new file mode 100644 index 00000000000..e997d50d333 --- /dev/null +++ b/queue-5.4/igc-remove-delay-during-tx-ring-configuration.patch @@ -0,0 +1,46 @@ +From 18266409139cf087182a9f927249e2718306dbe8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 May 2023 08:18:12 +0800 +Subject: igc: Remove delay during TX ring configuration + +From: Muhammad Husaini Zulkifli + +[ Upstream commit cca28ceac7c7857bc2d313777017585aef00bcc4 ] + +Remove unnecessary delay during the TX ring configuration. +This will cause delay, especially during link down and +link up activity. + +Furthermore, old SKUs like as I225 will call the reset_adapter +to reset the controller during TSN mode Gate Control List (GCL) +setting. This will add more time to the configuration of the +real-time use case. + +It doesn't mentioned about this delay in the Software User Manual. +It might have been ported from legacy code I210 in the past. + +Fixes: 13b5b7fd6a4a ("igc: Add support for Tx/Rx rings") +Signed-off-by: Muhammad Husaini Zulkifli +Acked-by: Sasha Neftin +Tested-by: Naama Meir +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/igc/igc_main.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c +index b8297a63a7fd2..3839ca8bdf6dd 100644 +--- a/drivers/net/ethernet/intel/igc/igc_main.c ++++ b/drivers/net/ethernet/intel/igc/igc_main.c +@@ -610,7 +610,6 @@ static void igc_configure_tx_ring(struct igc_adapter *adapter, + /* disable the queue */ + wr32(IGC_TXDCTL(reg_idx), 0); + wrfl(); +- mdelay(10); + + wr32(IGC_TDLEN(reg_idx), + ring->count * sizeof(union igc_adv_tx_desc)); +-- +2.39.2 + diff --git a/queue-5.4/igc-set-tp-bit-in-supported-and-advertising-fields-o.patch b/queue-5.4/igc-set-tp-bit-in-supported-and-advertising-fields-o.patch new file mode 100644 index 00000000000..11c9f783998 --- /dev/null +++ b/queue-5.4/igc-set-tp-bit-in-supported-and-advertising-fields-o.patch @@ -0,0 +1,39 @@ +From bc13bf08dc0fa6def9892f176aeb46da47ff6c44 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 5 Jun 2023 11:09:01 -0700 +Subject: igc: set TP bit in 'supported' and 'advertising' fields of + ethtool_link_ksettings + +From: Prasad Koya + +[ Upstream commit 9ac3fc2f42e5ffa1e927dcbffb71b15fa81459e2 ] + +set TP bit in the 'supported' and 'advertising' fields. i225/226 parts +only support twisted pair copper. + +Fixes: 8c5ad0dae93c ("igc: Add ethtool support") +Signed-off-by: Prasad Koya +Acked-by: Sasha Neftin +Tested-by: Naama Meir +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/igc/igc_ethtool.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/ethernet/intel/igc/igc_ethtool.c +index cbcb8611ab50d..0a4e7f5f292ac 100644 +--- a/drivers/net/ethernet/intel/igc/igc_ethtool.c ++++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c +@@ -1668,6 +1668,8 @@ static int igc_get_link_ksettings(struct net_device *netdev, + /* twisted pair */ + cmd->base.port = PORT_TP; + cmd->base.phy_address = hw->phy.addr; ++ ethtool_link_ksettings_add_link_mode(cmd, supported, TP); ++ ethtool_link_ksettings_add_link_mode(cmd, advertising, TP); + + /* advertising link modes */ + if (hw->phy.autoneg_advertised & ADVERTISE_10_HALF) +-- +2.39.2 + diff --git a/queue-5.4/ionic-clean-irq-affinity-on-queue-deinit.patch b/queue-5.4/ionic-clean-irq-affinity-on-queue-deinit.patch new file mode 100644 index 00000000000..bc23ac84923 --- /dev/null +++ b/queue-5.4/ionic-clean-irq-affinity-on-queue-deinit.patch @@ -0,0 +1,38 @@ +From 4841f8e63e8937054dbda88c0209bc33b0996695 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 19 Mar 2020 19:31:52 -0700 +Subject: ionic: clean irq affinity on queue deinit + +From: Shannon Nelson + +[ Upstream commit b9c17d39d5d19b321414a1737c754a819878424a ] + +Add a little more cleanup when tearing down the queues. + +Fixes: 1d062b7b6f64 ("ionic: Add basic adminq support") +Signed-off-by: Shannon Nelson +Signed-off-by: David S. Miller +Stable-dep-of: abfb2a58a537 ("ionic: remove WARN_ON to prevent panic_on_warn") +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/pensando/ionic/ionic_lif.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +index 975cda9377ec4..fa57a526b60f6 100644 +--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c ++++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +@@ -269,8 +269,10 @@ static void ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq) + if (qcq->flags & IONIC_QCQ_F_INTR) { + ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, + IONIC_INTR_MASK_SET); ++ irq_set_affinity_hint(qcq->intr.vector, NULL); + devm_free_irq(dev, qcq->intr.vector, &qcq->napi); + netif_napi_del(&qcq->napi); ++ qcq->intr.vector = 0; + } + + qcq->flags &= ~IONIC_QCQ_F_INITED; +-- +2.39.2 + diff --git a/queue-5.4/ionic-improve-irq-numa-locality.patch b/queue-5.4/ionic-improve-irq-numa-locality.patch new file mode 100644 index 00000000000..bc02dfcf7a5 --- /dev/null +++ b/queue-5.4/ionic-improve-irq-numa-locality.patch @@ -0,0 +1,42 @@ +From 5d239f70262c25e06b3fb08385d492bedc01d318 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 6 Mar 2020 17:04:03 -0800 +Subject: ionic: improve irq numa locality + +From: Shannon Nelson + +[ Upstream commit b7f55b81f2ac40e52c5a56e22c80488eac531c91 ] + +Spreading the interrupts across the CPU cores is good for load +balancing, but not necessarily as good when using a CPU/core +that is not part of the NUMA local CPU. If it can be localized, +the kernel's cpumask_local_spread() service will pick a core +that is on the node close to the PCI device. + +Signed-off-by: Shannon Nelson +Signed-off-by: David S. Miller +Stable-dep-of: abfb2a58a537 ("ionic: remove WARN_ON to prevent panic_on_warn") +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/pensando/ionic/ionic_lif.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +index d0841836cf705..975cda9377ec4 100644 +--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c ++++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +@@ -418,8 +418,9 @@ static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type, + ionic_intr_mask_assert(idev->intr_ctrl, new->intr.index, + IONIC_INTR_MASK_SET); + +- new->intr.cpu = new->intr.index % num_online_cpus(); +- if (cpu_online(new->intr.cpu)) ++ new->intr.cpu = cpumask_local_spread(new->intr.index, ++ dev_to_node(dev)); ++ if (new->intr.cpu != -1) + cpumask_set_cpu(new->intr.cpu, + &new->intr.affinity_mask); + } else { +-- +2.39.2 + diff --git a/queue-5.4/ionic-ionic_intr_free-parameter-change.patch b/queue-5.4/ionic-ionic_intr_free-parameter-change.patch new file mode 100644 index 00000000000..2a2cf1ebcf3 --- /dev/null +++ b/queue-5.4/ionic-ionic_intr_free-parameter-change.patch @@ -0,0 +1,68 @@ +From 7c93ad29af052cdebe41ee38afa14873e8ac76a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 May 2020 17:59:33 -0700 +Subject: ionic: ionic_intr_free parameter change + +From: Shannon Nelson + +[ Upstream commit 36ac2c50924892a28e17ff463e354fec7650ee19 ] + +Change the ionic_intr_free parameter from struct ionic_lif to +struct ionic since that's what it actually cares about. + +Signed-off-by: Shannon Nelson +Signed-off-by: David S. Miller +Stable-dep-of: abfb2a58a537 ("ionic: remove WARN_ON to prevent panic_on_warn") +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/pensando/ionic/ionic_lif.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +index 3fc9ac1e8b7b7..52d291383c233 100644 +--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c ++++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +@@ -167,10 +167,10 @@ static int ionic_intr_alloc(struct ionic_lif *lif, struct ionic_intr_info *intr) + return 0; + } + +-static void ionic_intr_free(struct ionic_lif *lif, int index) ++static void ionic_intr_free(struct ionic *ionic, int index) + { +- if (index != INTR_INDEX_NOT_ASSIGNED && index < lif->ionic->nintrs) +- clear_bit(index, lif->ionic->intrs); ++ if (index != INTR_INDEX_NOT_ASSIGNED && index < ionic->nintrs) ++ clear_bit(index, ionic->intrs); + } + + static int ionic_qcq_enable(struct ionic_qcq *qcq) +@@ -289,7 +289,7 @@ static void ionic_qcq_free(struct ionic_lif *lif, struct ionic_qcq *qcq) + irq_set_affinity_hint(qcq->intr.vector, NULL); + devm_free_irq(dev, qcq->intr.vector, &qcq->napi); + qcq->intr.vector = 0; +- ionic_intr_free(lif, qcq->intr.index); ++ ionic_intr_free(lif->ionic, qcq->intr.index); + } + + devm_kfree(dev, qcq->cq.info); +@@ -333,7 +333,7 @@ static void ionic_link_qcq_interrupts(struct ionic_qcq *src_qcq, + struct ionic_qcq *n_qcq) + { + if (WARN_ON(n_qcq->flags & IONIC_QCQ_F_INTR)) { +- ionic_intr_free(n_qcq->cq.lif, n_qcq->intr.index); ++ ionic_intr_free(n_qcq->cq.lif->ionic, n_qcq->intr.index); + n_qcq->flags &= ~IONIC_QCQ_F_INTR; + } + +@@ -485,7 +485,7 @@ static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type, + devm_free_irq(dev, new->intr.vector, &new->napi); + err_out_free_intr: + if (flags & IONIC_QCQ_F_INTR) +- ionic_intr_free(lif, new->intr.index); ++ ionic_intr_free(lif->ionic, new->intr.index); + err_out: + dev_err(dev, "qcq alloc of %s%d failed %d\n", name, index, err); + return err; +-- +2.39.2 + diff --git a/queue-5.4/ionic-move-irq-request-to-qcq-alloc.patch b/queue-5.4/ionic-move-irq-request-to-qcq-alloc.patch new file mode 100644 index 00000000000..956ec94b82a --- /dev/null +++ b/queue-5.4/ionic-move-irq-request-to-qcq-alloc.patch @@ -0,0 +1,140 @@ +From 157c71022d07073d2f4d4e279fb05962e68e784c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 27 Mar 2020 20:14:44 -0700 +Subject: ionic: move irq request to qcq alloc + +From: Shannon Nelson + +[ Upstream commit 0b0641009b8918c8d5f6e7ed300d569c9d811de5 ] + +Move the irq request and free out of the qcq_init and deinit +and into the alloc and free routines where they belong for +better resource management. + +Signed-off-by: Shannon Nelson +Signed-off-by: David S. Miller +Stable-dep-of: abfb2a58a537 ("ionic: remove WARN_ON to prevent panic_on_warn") +Signed-off-by: Sasha Levin +--- + .../net/ethernet/pensando/ionic/ionic_lif.c | 41 +++++++++---------- + 1 file changed, 19 insertions(+), 22 deletions(-) + +diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +index fa57a526b60f6..3fc9ac1e8b7b7 100644 +--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c ++++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +@@ -256,7 +256,6 @@ static int ionic_qcq_disable(struct ionic_qcq *qcq) + static void ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq) + { + struct ionic_dev *idev = &lif->ionic->idev; +- struct device *dev = lif->ionic->dev; + + if (!qcq) + return; +@@ -269,10 +268,7 @@ static void ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq) + if (qcq->flags & IONIC_QCQ_F_INTR) { + ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, + IONIC_INTR_MASK_SET); +- irq_set_affinity_hint(qcq->intr.vector, NULL); +- devm_free_irq(dev, qcq->intr.vector, &qcq->napi); + netif_napi_del(&qcq->napi); +- qcq->intr.vector = 0; + } + + qcq->flags &= ~IONIC_QCQ_F_INITED; +@@ -289,8 +285,12 @@ static void ionic_qcq_free(struct ionic_lif *lif, struct ionic_qcq *qcq) + qcq->base = NULL; + qcq->base_pa = 0; + +- if (qcq->flags & IONIC_QCQ_F_INTR) ++ if (qcq->flags & IONIC_QCQ_F_INTR) { ++ irq_set_affinity_hint(qcq->intr.vector, NULL); ++ devm_free_irq(dev, qcq->intr.vector, &qcq->napi); ++ qcq->intr.vector = 0; + ionic_intr_free(lif, qcq->intr.index); ++ } + + devm_kfree(dev, qcq->cq.info); + qcq->cq.info = NULL; +@@ -420,6 +420,12 @@ static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type, + ionic_intr_mask_assert(idev->intr_ctrl, new->intr.index, + IONIC_INTR_MASK_SET); + ++ err = ionic_request_irq(lif, new); ++ if (err) { ++ netdev_warn(lif->netdev, "irq request failed %d\n", err); ++ goto err_out_free_intr; ++ } ++ + new->intr.cpu = cpumask_local_spread(new->intr.index, + dev_to_node(dev)); + if (new->intr.cpu != -1) +@@ -434,13 +440,13 @@ static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type, + if (!new->cq.info) { + netdev_err(lif->netdev, "Cannot allocate completion queue info\n"); + err = -ENOMEM; +- goto err_out_free_intr; ++ goto err_out_free_irq; + } + + err = ionic_cq_init(lif, &new->cq, &new->intr, num_descs, cq_desc_size); + if (err) { + netdev_err(lif->netdev, "Cannot initialize completion queue\n"); +- goto err_out_free_intr; ++ goto err_out_free_irq; + } + + new->base = dma_alloc_coherent(dev, total_size, &new->base_pa, +@@ -448,7 +454,7 @@ static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type, + if (!new->base) { + netdev_err(lif->netdev, "Cannot allocate queue DMA memory\n"); + err = -ENOMEM; +- goto err_out_free_intr; ++ goto err_out_free_irq; + } + + new->total_size = total_size; +@@ -474,8 +480,12 @@ static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type, + + return 0; + ++err_out_free_irq: ++ if (flags & IONIC_QCQ_F_INTR) ++ devm_free_irq(dev, new->intr.vector, &new->napi); + err_out_free_intr: +- ionic_intr_free(lif, new->intr.index); ++ if (flags & IONIC_QCQ_F_INTR) ++ ionic_intr_free(lif, new->intr.index); + err_out: + dev_err(dev, "qcq alloc of %s%d failed %d\n", name, index, err); + return err; +@@ -650,12 +660,6 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq) + netif_napi_add(lif->netdev, &qcq->napi, ionic_rx_napi, + NAPI_POLL_WEIGHT); + +- err = ionic_request_irq(lif, qcq); +- if (err) { +- netif_napi_del(&qcq->napi); +- return err; +- } +- + qcq->flags |= IONIC_QCQ_F_INITED; + + ionic_debugfs_add_qcq(lif, qcq); +@@ -1873,13 +1877,6 @@ static int ionic_lif_adminq_init(struct ionic_lif *lif) + netif_napi_add(lif->netdev, &qcq->napi, ionic_adminq_napi, + NAPI_POLL_WEIGHT); + +- err = ionic_request_irq(lif, qcq); +- if (err) { +- netdev_warn(lif->netdev, "adminq irq request failed %d\n", err); +- netif_napi_del(&qcq->napi); +- return err; +- } +- + napi_enable(&qcq->napi); + + if (qcq->flags & IONIC_QCQ_F_INTR) +-- +2.39.2 + diff --git a/queue-5.4/ionic-remove-warn_on-to-prevent-panic_on_warn.patch b/queue-5.4/ionic-remove-warn_on-to-prevent-panic_on_warn.patch new file mode 100644 index 00000000000..af5f8466274 --- /dev/null +++ b/queue-5.4/ionic-remove-warn_on-to-prevent-panic_on_warn.patch @@ -0,0 +1,42 @@ +From 113c4ac1bad18d282992e71eb7f76fa46d2d8a9e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jul 2023 11:20:06 -0700 +Subject: ionic: remove WARN_ON to prevent panic_on_warn + +From: Nitya Sunkad + +[ Upstream commit abfb2a58a5377ebab717d4362d6180f901b6e5c1 ] + +Remove unnecessary early code development check and the WARN_ON +that it uses. The irq alloc and free paths have long been +cleaned up and this check shouldn't have stuck around so long. + +Fixes: 77ceb68e29cc ("ionic: Add notifyq support") +Signed-off-by: Nitya Sunkad +Signed-off-by: Shannon Nelson +Reviewed-by: Jacob Keller +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/pensando/ionic/ionic_lif.c | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +index 52d291383c233..d718c1a6d5fc7 100644 +--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c ++++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c +@@ -332,11 +332,6 @@ static void ionic_qcqs_free(struct ionic_lif *lif) + static void ionic_link_qcq_interrupts(struct ionic_qcq *src_qcq, + struct ionic_qcq *n_qcq) + { +- if (WARN_ON(n_qcq->flags & IONIC_QCQ_F_INTR)) { +- ionic_intr_free(n_qcq->cq.lif->ionic, n_qcq->intr.index); +- n_qcq->flags &= ~IONIC_QCQ_F_INTR; +- } +- + n_qcq->intr.vector = src_qcq->intr.vector; + n_qcq->intr.index = src_qcq->intr.index; + } +-- +2.39.2 + diff --git a/queue-5.4/ipv6-addrconf-fix-a-potential-refcount-underflow-for.patch b/queue-5.4/ipv6-addrconf-fix-a-potential-refcount-underflow-for.patch new file mode 100644 index 00000000000..37e74ea8a7b --- /dev/null +++ b/queue-5.4/ipv6-addrconf-fix-a-potential-refcount-underflow-for.patch @@ -0,0 +1,53 @@ +From a5cdf1f335af33aa38bbf67ce4622dc786cb1828 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 8 Jul 2023 14:59:10 +0800 +Subject: ipv6/addrconf: fix a potential refcount underflow for idev + +From: Ziyang Xuan + +[ Upstream commit 06a0716949c22e2aefb648526580671197151acc ] + +Now in addrconf_mod_rs_timer(), reference idev depends on whether +rs_timer is not pending. Then modify rs_timer timeout. + +There is a time gap in [1], during which if the pending rs_timer +becomes not pending. It will miss to hold idev, but the rs_timer +is activated. Thus rs_timer callback function addrconf_rs_timer() +will be executed and put idev later without holding idev. A refcount +underflow issue for idev can be caused by this. + + if (!timer_pending(&idev->rs_timer)) + in6_dev_hold(idev); + <--------------[1] + mod_timer(&idev->rs_timer, jiffies + when); + +To fix the issue, hold idev if mod_timer() return 0. + +Fixes: b7b1bfce0bb6 ("ipv6: split duplicate address detection and router solicitation timer") +Suggested-by: Eric Dumazet +Signed-off-by: Ziyang Xuan +Reviewed-by: Eric Dumazet +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv6/addrconf.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c +index a0123760fb2c7..46e3c939958bb 100644 +--- a/net/ipv6/addrconf.c ++++ b/net/ipv6/addrconf.c +@@ -313,9 +313,8 @@ static void addrconf_del_dad_work(struct inet6_ifaddr *ifp) + static void addrconf_mod_rs_timer(struct inet6_dev *idev, + unsigned long when) + { +- if (!timer_pending(&idev->rs_timer)) ++ if (!mod_timer(&idev->rs_timer, jiffies + when)) + in6_dev_hold(idev); +- mod_timer(&idev->rs_timer, jiffies + when); + } + + static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp, +-- +2.39.2 + diff --git a/queue-5.4/net-mvneta-fix-txq_map-in-case-of-txq_number-1.patch b/queue-5.4/net-mvneta-fix-txq_map-in-case-of-txq_number-1.patch new file mode 100644 index 00000000000..2d485172992 --- /dev/null +++ b/queue-5.4/net-mvneta-fix-txq_map-in-case-of-txq_number-1.patch @@ -0,0 +1,48 @@ +From b16067bdb0ebf87601933839b3764c64ddc0bbdc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 5 Jul 2023 07:37:12 +0200 +Subject: net: mvneta: fix txq_map in case of txq_number==1 + +From: Klaus Kudielka + +[ Upstream commit 21327f81db6337c8843ce755b01523c7d3df715b ] + +If we boot with mvneta.txq_number=1, the txq_map is set incorrectly: +MVNETA_CPU_TXQ_ACCESS(1) refers to TX queue 1, but only TX queue 0 is +initialized. Fix this. + +Fixes: 50bf8cb6fc9c ("net: mvneta: Configure XPS support") +Signed-off-by: Klaus Kudielka +Reviewed-by: Michal Kubiak +Link: https://lore.kernel.org/r/20230705053712.3914-1-klaus.kudielka@gmail.com +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/marvell/mvneta.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c +index 977c2961aa2c2..110221a16bf6d 100644 +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -1422,7 +1422,7 @@ static void mvneta_defaults_set(struct mvneta_port *pp) + */ + if (txq_number == 1) + txq_map = (cpu == pp->rxq_def) ? +- MVNETA_CPU_TXQ_ACCESS(1) : 0; ++ MVNETA_CPU_TXQ_ACCESS(0) : 0; + + } else { + txq_map = MVNETA_CPU_TXQ_ACCESS_ALL_MASK; +@@ -3762,7 +3762,7 @@ static void mvneta_percpu_elect(struct mvneta_port *pp) + */ + if (txq_number == 1) + txq_map = (cpu == elected_cpu) ? +- MVNETA_CPU_TXQ_ACCESS(1) : 0; ++ MVNETA_CPU_TXQ_ACCESS(0) : 0; + else + txq_map = mvreg_read(pp, MVNETA_CPU_MAP(cpu)) & + MVNETA_CPU_TXQ_ACCESS_ALL_MASK; +-- +2.39.2 + diff --git a/queue-5.4/net-sched-cls_fw-fix-improper-refcount-update-leads-.patch b/queue-5.4/net-sched-cls_fw-fix-improper-refcount-update-leads-.patch new file mode 100644 index 00000000000..61825887c73 --- /dev/null +++ b/queue-5.4/net-sched-cls_fw-fix-improper-refcount-update-leads-.patch @@ -0,0 +1,62 @@ +From 1f32ffb150708bd9e10a0e84679ec8d6c3e7c3d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 5 Jul 2023 12:15:30 -0400 +Subject: net/sched: cls_fw: Fix improper refcount update leads to + use-after-free + +From: M A Ramdhan + +[ Upstream commit 0323bce598eea038714f941ce2b22541c46d488f ] + +In the event of a failure in tcf_change_indev(), fw_set_parms() will +immediately return an error after incrementing or decrementing +reference counter in tcf_bind_filter(). If attacker can control +reference counter to zero and make reference freed, leading to +use after free. + +In order to prevent this, move the point of possible failure above the +point where the TC_FW_CLASSID is handled. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Reported-by: M A Ramdhan +Signed-off-by: M A Ramdhan +Acked-by: Jamal Hadi Salim +Reviewed-by: Pedro Tammela +Message-ID: <20230705161530.52003-1-ramdhan@starlabs.sg> +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/sched/cls_fw.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c +index ec945294626a8..41f0898a5a565 100644 +--- a/net/sched/cls_fw.c ++++ b/net/sched/cls_fw.c +@@ -210,11 +210,6 @@ static int fw_set_parms(struct net *net, struct tcf_proto *tp, + if (err < 0) + return err; + +- if (tb[TCA_FW_CLASSID]) { +- f->res.classid = nla_get_u32(tb[TCA_FW_CLASSID]); +- tcf_bind_filter(tp, &f->res, base); +- } +- + if (tb[TCA_FW_INDEV]) { + int ret; + ret = tcf_change_indev(net, tb[TCA_FW_INDEV], extack); +@@ -231,6 +226,11 @@ static int fw_set_parms(struct net *net, struct tcf_proto *tp, + } else if (head->mask != 0xFFFFFFFF) + return err; + ++ if (tb[TCA_FW_CLASSID]) { ++ f->res.classid = nla_get_u32(tb[TCA_FW_CLASSID]); ++ tcf_bind_filter(tp, &f->res, base); ++ } ++ + return 0; + } + +-- +2.39.2 + diff --git a/queue-5.4/net-sched-flower-ensure-both-minimum-and-maximum-por.patch b/queue-5.4/net-sched-flower-ensure-both-minimum-and-maximum-por.patch new file mode 100644 index 00000000000..845219a596c --- /dev/null +++ b/queue-5.4/net-sched-flower-ensure-both-minimum-and-maximum-por.patch @@ -0,0 +1,82 @@ +From f0e4752295b946e7bf100b3dd10d2626968e66f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 11 Jul 2023 10:08:09 +0300 +Subject: net/sched: flower: Ensure both minimum and maximum ports are + specified + +From: Ido Schimmel + +[ Upstream commit d3f87278bcb80bd7f9519669d928b43320363d4f ] + +The kernel does not currently validate that both the minimum and maximum +ports of a port range are specified. This can lead user space to think +that a filter matching on a port range was successfully added, when in +fact it was not. For example, with a patched (buggy) iproute2 that only +sends the minimum port, the following commands do not return an error: + + # tc filter add dev swp1 ingress pref 1 proto ip flower ip_proto udp src_port 100-200 action pass + + # tc filter add dev swp1 ingress pref 1 proto ip flower ip_proto udp dst_port 100-200 action pass + + # tc filter show dev swp1 ingress + filter protocol ip pref 1 flower chain 0 + filter protocol ip pref 1 flower chain 0 handle 0x1 + eth_type ipv4 + ip_proto udp + not_in_hw + action order 1: gact action pass + random type none pass val 0 + index 1 ref 1 bind 1 + + filter protocol ip pref 1 flower chain 0 handle 0x2 + eth_type ipv4 + ip_proto udp + not_in_hw + action order 1: gact action pass + random type none pass val 0 + index 2 ref 1 bind 1 + +Fix by returning an error unless both ports are specified: + + # tc filter add dev swp1 ingress pref 1 proto ip flower ip_proto udp src_port 100-200 action pass + Error: Both min and max source ports must be specified. + We have an error talking to the kernel + + # tc filter add dev swp1 ingress pref 1 proto ip flower ip_proto udp dst_port 100-200 action pass + Error: Both min and max destination ports must be specified. + We have an error talking to the kernel + +Fixes: 5c72299fba9d ("net: sched: cls_flower: Classify packets using port ranges") +Signed-off-by: Ido Schimmel +Reviewed-by: Petr Machata +Acked-by: Jamal Hadi Salim +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/sched/cls_flower.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c +index f0010e4850eb6..c92318f68f92d 100644 +--- a/net/sched/cls_flower.c ++++ b/net/sched/cls_flower.c +@@ -735,6 +735,16 @@ static int fl_set_key_port_range(struct nlattr **tb, struct fl_flow_key *key, + TCA_FLOWER_KEY_PORT_SRC_MAX, &mask->tp_range.tp_max.src, + TCA_FLOWER_UNSPEC, sizeof(key->tp_range.tp_max.src)); + ++ if (mask->tp_range.tp_min.dst != mask->tp_range.tp_max.dst) { ++ NL_SET_ERR_MSG(extack, ++ "Both min and max destination ports must be specified"); ++ return -EINVAL; ++ } ++ if (mask->tp_range.tp_min.src != mask->tp_range.tp_max.src) { ++ NL_SET_ERR_MSG(extack, ++ "Both min and max source ports must be specified"); ++ return -EINVAL; ++ } + if (mask->tp_range.tp_min.dst && mask->tp_range.tp_max.dst && + htons(key->tp_range.tp_max.dst) <= + htons(key->tp_range.tp_min.dst)) { +-- +2.39.2 + diff --git a/queue-5.4/net-sched-make-psched_mtu-rtnl-less-safe.patch b/queue-5.4/net-sched-make-psched_mtu-rtnl-less-safe.patch new file mode 100644 index 00000000000..eb049a499cb --- /dev/null +++ b/queue-5.4/net-sched-make-psched_mtu-rtnl-less-safe.patch @@ -0,0 +1,49 @@ +From 9b66de5361a5a5387ec152b9d37fceb56fee8dca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 10 Jul 2023 23:16:34 -0300 +Subject: net/sched: make psched_mtu() RTNL-less safe + +From: Pedro Tammela + +[ Upstream commit 150e33e62c1fa4af5aaab02776b6c3812711d478 ] + +Eric Dumazet says[1]: +------- +Speaking of psched_mtu(), I see that net/sched/sch_pie.c is using it +without holding RTNL, so dev->mtu can be changed underneath. +KCSAN could issue a warning. +------- + +Annotate dev->mtu with READ_ONCE() so KCSAN don't issue a warning. + +[1] https://lore.kernel.org/all/CANn89iJoJO5VtaJ-2=_d2aOQhb0Xw8iBT_Cxqp2HyuS-zj6azw@mail.gmail.com/ + +v1 -> v2: Fix commit message + +Fixes: d4b36210c2e6 ("net: pkt_sched: PIE AQM scheme") +Suggested-by: Eric Dumazet +Signed-off-by: Pedro Tammela +Reviewed-by: Simon Horman +Link: https://lore.kernel.org/r/20230711021634.561598-1-pctammela@mojatatu.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + include/net/pkt_sched.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h +index 2d932834ed5bf..fd99650a2e229 100644 +--- a/include/net/pkt_sched.h ++++ b/include/net/pkt_sched.h +@@ -131,7 +131,7 @@ extern const struct nla_policy rtm_tca_policy[TCA_MAX + 1]; + */ + static inline unsigned int psched_mtu(const struct net_device *dev) + { +- return dev->mtu + dev->hard_header_len; ++ return READ_ONCE(dev->mtu) + dev->hard_header_len; + } + + static inline struct net *qdisc_net(struct Qdisc *q) +-- +2.39.2 + diff --git a/queue-5.4/ntb-amd-fix-error-handling-in-amd_ntb_pci_driver_ini.patch b/queue-5.4/ntb-amd-fix-error-handling-in-amd_ntb_pci_driver_ini.patch new file mode 100644 index 00000000000..0c8cc6a576c --- /dev/null +++ b/queue-5.4/ntb-amd-fix-error-handling-in-amd_ntb_pci_driver_ini.patch @@ -0,0 +1,64 @@ +From 2e98e6c87f04443127e5606b13ea075b6ef49577 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 5 Nov 2022 09:43:09 +0000 +Subject: NTB: amd: Fix error handling in amd_ntb_pci_driver_init() + +From: Yuan Can + +[ Upstream commit 98af0a33c1101c29b3ce4f0cf4715fd927c717f9 ] + +A problem about ntb_hw_amd create debugfs failed is triggered with the +following log given: + + [ 618.431232] AMD(R) PCI-E Non-Transparent Bridge Driver 1.0 + [ 618.433284] debugfs: Directory 'ntb_hw_amd' with parent '/' already present! + +The reason is that amd_ntb_pci_driver_init() returns pci_register_driver() +directly without checking its return value, if pci_register_driver() +failed, it returns without destroy the newly created debugfs, resulting +the debugfs of ntb_hw_amd can never be created later. + + amd_ntb_pci_driver_init() + debugfs_create_dir() # create debugfs directory + pci_register_driver() + driver_register() + bus_add_driver() + priv = kzalloc(...) # OOM happened + # return without destroy debugfs directory + +Fix by removing debugfs when pci_register_driver() returns error. + +Fixes: a1b3695820aa ("NTB: Add support for AMD PCI-Express Non-Transparent Bridge") +Signed-off-by: Yuan Can +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + drivers/ntb/hw/amd/ntb_hw_amd.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.c b/drivers/ntb/hw/amd/ntb_hw_amd.c +index abb37659de343..50983d77329ea 100644 +--- a/drivers/ntb/hw/amd/ntb_hw_amd.c ++++ b/drivers/ntb/hw/amd/ntb_hw_amd.c +@@ -1153,12 +1153,17 @@ static struct pci_driver amd_ntb_pci_driver = { + + static int __init amd_ntb_pci_driver_init(void) + { ++ int ret; + pr_info("%s %s\n", NTB_DESC, NTB_VER); + + if (debugfs_initialized()) + debugfs_dir = debugfs_create_dir(KBUILD_MODNAME, NULL); + +- return pci_register_driver(&amd_ntb_pci_driver); ++ ret = pci_register_driver(&amd_ntb_pci_driver); ++ if (ret) ++ debugfs_remove_recursive(debugfs_dir); ++ ++ return ret; + } + module_init(amd_ntb_pci_driver_init); + +-- +2.39.2 + diff --git a/queue-5.4/ntb-idt-fix-error-handling-in-idt_pci_driver_init.patch b/queue-5.4/ntb-idt-fix-error-handling-in-idt_pci_driver_init.patch new file mode 100644 index 00000000000..6090eed3c9c --- /dev/null +++ b/queue-5.4/ntb-idt-fix-error-handling-in-idt_pci_driver_init.patch @@ -0,0 +1,66 @@ +From 52c09ad833ec6fa1e44be33a1551a422a3678e2d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 5 Nov 2022 09:43:01 +0000 +Subject: ntb: idt: Fix error handling in idt_pci_driver_init() + +From: Yuan Can + +[ Upstream commit c012968259b451dc4db407f2310fe131eaefd800 ] + +A problem about ntb_hw_idt create debugfs failed is triggered with the +following log given: + + [ 1236.637636] IDT PCI-E Non-Transparent Bridge Driver 2.0 + [ 1236.639292] debugfs: Directory 'ntb_hw_idt' with parent '/' already present! + +The reason is that idt_pci_driver_init() returns pci_register_driver() +directly without checking its return value, if pci_register_driver() +failed, it returns without destroy the newly created debugfs, resulting +the debugfs of ntb_hw_idt can never be created later. + + idt_pci_driver_init() + debugfs_create_dir() # create debugfs directory + pci_register_driver() + driver_register() + bus_add_driver() + priv = kzalloc(...) # OOM happened + # return without destroy debugfs directory + +Fix by removing debugfs when pci_register_driver() returns error. + +Fixes: bf2a952d31d2 ("NTB: Add IDT 89HPESxNTx PCIe-switches support") +Signed-off-by: Yuan Can +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + drivers/ntb/hw/idt/ntb_hw_idt.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/ntb/hw/idt/ntb_hw_idt.c b/drivers/ntb/hw/idt/ntb_hw_idt.c +index dcf2346805350..a0091900b0cfb 100644 +--- a/drivers/ntb/hw/idt/ntb_hw_idt.c ++++ b/drivers/ntb/hw/idt/ntb_hw_idt.c +@@ -2908,6 +2908,7 @@ static struct pci_driver idt_pci_driver = { + + static int __init idt_pci_driver_init(void) + { ++ int ret; + pr_info("%s %s\n", NTB_DESC, NTB_VER); + + /* Create the top DebugFS directory if the FS is initialized */ +@@ -2915,7 +2916,11 @@ static int __init idt_pci_driver_init(void) + dbgfs_topdir = debugfs_create_dir(KBUILD_MODNAME, NULL); + + /* Register the NTB hardware driver to handle the PCI device */ +- return pci_register_driver(&idt_pci_driver); ++ ret = pci_register_driver(&idt_pci_driver); ++ if (ret) ++ debugfs_remove_recursive(dbgfs_topdir); ++ ++ return ret; + } + module_init(idt_pci_driver_init); + +-- +2.39.2 + diff --git a/queue-5.4/ntb-intel-fix-error-handling-in-intel_ntb_pci_driver.patch b/queue-5.4/ntb-intel-fix-error-handling-in-intel_ntb_pci_driver.patch new file mode 100644 index 00000000000..2e7486e1545 --- /dev/null +++ b/queue-5.4/ntb-intel-fix-error-handling-in-intel_ntb_pci_driver.patch @@ -0,0 +1,65 @@ +From 6a6c978dd2cf3ce1b4ca8012454c522d2142c785 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 5 Nov 2022 09:43:22 +0000 +Subject: ntb: intel: Fix error handling in intel_ntb_pci_driver_init() + +From: Yuan Can + +[ Upstream commit 4c3c796aca02883ad35bb117468938cc4022ca41 ] + +A problem about ntb_hw_intel create debugfs failed is triggered with the +following log given: + + [ 273.112733] Intel(R) PCI-E Non-Transparent Bridge Driver 2.0 + [ 273.115342] debugfs: Directory 'ntb_hw_intel' with parent '/' already present! + +The reason is that intel_ntb_pci_driver_init() returns +pci_register_driver() directly without checking its return value, if +pci_register_driver() failed, it returns without destroy the newly created +debugfs, resulting the debugfs of ntb_hw_intel can never be created later. + + intel_ntb_pci_driver_init() + debugfs_create_dir() # create debugfs directory + pci_register_driver() + driver_register() + bus_add_driver() + priv = kzalloc(...) # OOM happened + # return without destroy debugfs directory + +Fix by removing debugfs when pci_register_driver() returns error. + +Fixes: e26a5843f7f5 ("NTB: Split ntb_hw_intel and ntb_transport drivers") +Signed-off-by: Yuan Can +Acked-by: Dave Jiang +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + drivers/ntb/hw/intel/ntb_hw_gen1.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/ntb/hw/intel/ntb_hw_gen1.c b/drivers/ntb/hw/intel/ntb_hw_gen1.c +index bb57ec2390299..8d8739bff9f3c 100644 +--- a/drivers/ntb/hw/intel/ntb_hw_gen1.c ++++ b/drivers/ntb/hw/intel/ntb_hw_gen1.c +@@ -2065,12 +2065,17 @@ static struct pci_driver intel_ntb_pci_driver = { + + static int __init intel_ntb_pci_driver_init(void) + { ++ int ret; + pr_info("%s %s\n", NTB_DESC, NTB_VER); + + if (debugfs_initialized()) + debugfs_dir = debugfs_create_dir(KBUILD_MODNAME, NULL); + +- return pci_register_driver(&intel_ntb_pci_driver); ++ ret = pci_register_driver(&intel_ntb_pci_driver); ++ if (ret) ++ debugfs_remove_recursive(debugfs_dir); ++ ++ return ret; + } + module_init(intel_ntb_pci_driver_init); + +-- +2.39.2 + diff --git a/queue-5.4/ntb-ntb_tool-add-check-for-devm_kcalloc.patch b/queue-5.4/ntb-ntb_tool-add-check-for-devm_kcalloc.patch new file mode 100644 index 00000000000..84059f98e54 --- /dev/null +++ b/queue-5.4/ntb-ntb_tool-add-check-for-devm_kcalloc.patch @@ -0,0 +1,39 @@ +From cd15fb43ec3eaa15b043cecae779f693ef7e9ee7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 22 Nov 2022 11:32:44 +0800 +Subject: NTB: ntb_tool: Add check for devm_kcalloc + +From: Jiasheng Jiang + +[ Upstream commit 2790143f09938776a3b4f69685b380bae8fd06c7 ] + +As the devm_kcalloc may return NULL pointer, +it should be better to add check for the return +value, as same as the others. + +Fixes: 7f46c8b3a552 ("NTB: ntb_tool: Add full multi-port NTB API support") +Signed-off-by: Jiasheng Jiang +Reviewed-by: Serge Semin +Reviewed-by: Dave Jiang +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + drivers/ntb/test/ntb_tool.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/ntb/test/ntb_tool.c b/drivers/ntb/test/ntb_tool.c +index 6301aa413c3b8..1f64146546221 100644 +--- a/drivers/ntb/test/ntb_tool.c ++++ b/drivers/ntb/test/ntb_tool.c +@@ -998,6 +998,8 @@ static int tool_init_mws(struct tool_ctx *tc) + tc->peers[pidx].outmws = + devm_kcalloc(&tc->ntb->dev, tc->peers[pidx].outmw_cnt, + sizeof(*tc->peers[pidx].outmws), GFP_KERNEL); ++ if (tc->peers[pidx].outmws == NULL) ++ return -ENOMEM; + + for (widx = 0; widx < tc->peers[pidx].outmw_cnt; widx++) { + tc->peers[pidx].outmws[widx].pidx = pidx; +-- +2.39.2 + diff --git a/queue-5.4/ntb-ntb_transport-fix-possible-memory-leak-while-dev.patch b/queue-5.4/ntb-ntb_transport-fix-possible-memory-leak-while-dev.patch new file mode 100644 index 00000000000..e9bd3ce8837 --- /dev/null +++ b/queue-5.4/ntb-ntb_transport-fix-possible-memory-leak-while-dev.patch @@ -0,0 +1,42 @@ +From afbb71de53d84a6a5469fd81b15266391e189cec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Nov 2022 23:19:17 +0800 +Subject: NTB: ntb_transport: fix possible memory leak while device_register() + fails + +From: Yang Yingliang + +[ Upstream commit 8623ccbfc55d962e19a3537652803676ad7acb90 ] + +If device_register() returns error, the name allocated by +dev_set_name() need be freed. As comment of device_register() +says, it should use put_device() to give up the reference in +the error path. So fix this by calling put_device(), then the +name can be freed in kobject_cleanup(), and client_dev is freed +in ntb_transport_client_release(). + +Fixes: fce8a7bb5b4b ("PCI-Express Non-Transparent Bridge Support") +Signed-off-by: Yang Yingliang +Reviewed-by: Dave Jiang +Signed-off-by: Jon Mason +Signed-off-by: Sasha Levin +--- + drivers/ntb/ntb_transport.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c +index 00a5d5764993c..3cc0e8ebcdd5c 100644 +--- a/drivers/ntb/ntb_transport.c ++++ b/drivers/ntb/ntb_transport.c +@@ -412,7 +412,7 @@ int ntb_transport_register_client_dev(char *device_name) + + rc = device_register(dev); + if (rc) { +- kfree(client_dev); ++ put_device(dev); + goto err; + } + +-- +2.39.2 + diff --git a/queue-5.4/platform-x86-wmi-break-possible-infinite-loop-when-p.patch b/queue-5.4/platform-x86-wmi-break-possible-infinite-loop-when-p.patch new file mode 100644 index 00000000000..4a894ceda6d --- /dev/null +++ b/queue-5.4/platform-x86-wmi-break-possible-infinite-loop-when-p.patch @@ -0,0 +1,84 @@ +From 202d5f392162a5bbd1d8ed12a371cfc74ebc500f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 21 Jun 2023 18:11:54 +0300 +Subject: platform/x86: wmi: Break possible infinite loop when parsing GUID + +From: Andy Shevchenko + +[ Upstream commit 028e6e204ace1f080cfeacd72c50397eb8ae8883 ] + +The while-loop may break on one of the two conditions, either ID string +is empty or GUID matches. The second one, may never be reached if the +parsed string is not correct GUID. In such a case the loop will never +advance to check the next ID. + +Break possible infinite loop by factoring out guid_parse_and_compare() +helper which may be moved to the generic header for everyone later on +and preventing from similar mistake in the future. + +Interestingly that firstly it appeared when WMI was turned into a bus +driver, but later when duplicated GUIDs were checked, the while-loop +has been replaced by for-loop and hence no mistake made again. + +Fixes: a48e23385fcf ("platform/x86: wmi: add context pointer field to struct wmi_device_id") +Fixes: 844af950da94 ("platform/x86: wmi: Turn WMI into a bus driver") +Signed-off-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20230621151155.78279-1-andriy.shevchenko@linux.intel.com +Tested-by: Armin Wolf +Reviewed-by: Hans de Goede +Signed-off-by: Hans de Goede +Signed-off-by: Sasha Levin +--- + drivers/platform/x86/wmi.c | 22 ++++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c +index 8d1a7923c03b6..67c4ec554ada8 100644 +--- a/drivers/platform/x86/wmi.c ++++ b/drivers/platform/x86/wmi.c +@@ -129,6 +129,16 @@ static bool find_guid(const char *guid_string, struct wmi_block **out) + return false; + } + ++static bool guid_parse_and_compare(const char *string, const guid_t *guid) ++{ ++ guid_t guid_input; ++ ++ if (guid_parse(string, &guid_input)) ++ return false; ++ ++ return guid_equal(&guid_input, guid); ++} ++ + static const void *find_guid_context(struct wmi_block *wblock, + struct wmi_driver *wdriver) + { +@@ -141,11 +151,7 @@ static const void *find_guid_context(struct wmi_block *wblock, + + id = wdriver->id_table; + while (*id->guid_string) { +- guid_t guid_input; +- +- if (guid_parse(id->guid_string, &guid_input)) +- continue; +- if (guid_equal(&wblock->gblock.guid, &guid_input)) ++ if (guid_parse_and_compare(id->guid_string, &wblock->gblock.guid)) + return id->context; + id++; + } +@@ -801,11 +807,7 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver) + return 0; + + while (*id->guid_string) { +- guid_t driver_guid; +- +- if (WARN_ON(guid_parse(id->guid_string, &driver_guid))) +- continue; +- if (guid_equal(&driver_guid, &wblock->gblock.guid)) ++ if (guid_parse_and_compare(id->guid_string, &wblock->gblock.guid)) + return 1; + + id++; +-- +2.39.2 + diff --git a/queue-5.4/platform-x86-wmi-fix-indentation-in-some-cases.patch b/queue-5.4/platform-x86-wmi-fix-indentation-in-some-cases.patch new file mode 100644 index 00000000000..2102a647561 --- /dev/null +++ b/queue-5.4/platform-x86-wmi-fix-indentation-in-some-cases.patch @@ -0,0 +1,48 @@ +From e879a7db78a688c30bc440337341769a13faf12e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 23 Apr 2020 15:30:15 +0300 +Subject: platform/x86: wmi: Fix indentation in some cases + +From: Andy Shevchenko + +[ Upstream commit 6701cc8f70710826a4de69cbb1f66c52db2c36ac ] + +There is no need to split lines as they perfectly fit 80 character limit. + +Signed-off-by: Andy Shevchenko +Stable-dep-of: 028e6e204ace ("platform/x86: wmi: Break possible infinite loop when parsing GUID") +Signed-off-by: Sasha Levin +--- + drivers/platform/x86/wmi.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c +index 62b146af35679..1aa29d594b7ab 100644 +--- a/drivers/platform/x86/wmi.c ++++ b/drivers/platform/x86/wmi.c +@@ -1122,8 +1122,7 @@ static void wmi_free_devices(struct acpi_device *device) + } + } + +-static bool guid_already_parsed(struct acpi_device *device, +- const u8 *guid) ++static bool guid_already_parsed(struct acpi_device *device, const u8 *guid) + { + struct wmi_block *wblock; + +@@ -1333,10 +1332,8 @@ static void acpi_wmi_notify_handler(acpi_handle handle, u32 event, + wblock->handler(event, wblock->handler_data); + } + +- if (debug_event) { +- pr_info("DEBUG Event GUID: %pUL\n", +- wblock->gblock.guid); +- } ++ if (debug_event) ++ pr_info("DEBUG Event GUID: %pUL\n", wblock->gblock.guid); + + acpi_bus_generate_netlink_event( + wblock->acpi_device->pnp.device_class, +-- +2.39.2 + diff --git a/queue-5.4/platform-x86-wmi-move-variables.patch b/queue-5.4/platform-x86-wmi-move-variables.patch new file mode 100644 index 00000000000..c1b574dcd64 --- /dev/null +++ b/queue-5.4/platform-x86-wmi-move-variables.patch @@ -0,0 +1,80 @@ +From 8fd2c43c42e8b4baaba5d9cdcd83836460096406 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 4 Sep 2021 17:56:10 +0000 +Subject: platform/x86: wmi: move variables +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Barnabás Pőcze + +[ Upstream commit f5431bf1e6781e876bdc8ae10fb1e7da6f1aa9b5 ] + +Move some variables in order to keep them +in the narrowest possible scope. + +Signed-off-by: Barnabás Pőcze +Link: https://lore.kernel.org/r/20210904175450.156801-22-pobrn@protonmail.com +Reviewed-by: Hans de Goede +Signed-off-by: Hans de Goede +Stable-dep-of: 028e6e204ace ("platform/x86: wmi: Break possible infinite loop when parsing GUID") +Signed-off-by: Sasha Levin +--- + drivers/platform/x86/wmi.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c +index 41a680b39f9d1..8d1a7923c03b6 100644 +--- a/drivers/platform/x86/wmi.c ++++ b/drivers/platform/x86/wmi.c +@@ -133,7 +133,6 @@ static const void *find_guid_context(struct wmi_block *wblock, + struct wmi_driver *wdriver) + { + const struct wmi_device_id *id; +- guid_t guid_input; + + if (wblock == NULL || wdriver == NULL) + return NULL; +@@ -142,6 +141,8 @@ static const void *find_guid_context(struct wmi_block *wblock, + + id = wdriver->id_table; + while (*id->guid_string) { ++ guid_t guid_input; ++ + if (guid_parse(id->guid_string, &guid_input)) + continue; + if (guid_equal(&wblock->gblock.guid, &guid_input)) +@@ -612,7 +613,6 @@ acpi_status wmi_get_event_data(u32 event, struct acpi_buffer *out) + { + struct acpi_object_list input; + union acpi_object params[1]; +- struct guid_block *gblock; + struct wmi_block *wblock; + + input.count = 1; +@@ -621,7 +621,7 @@ acpi_status wmi_get_event_data(u32 event, struct acpi_buffer *out) + params[0].integer.value = event; + + list_for_each_entry(wblock, &wmi_block_list, list) { +- gblock = &wblock->gblock; ++ struct guid_block *gblock = &wblock->gblock; + + if ((gblock->flags & ACPI_WMI_EVENT) && + (gblock->notify_id == event)) +@@ -1278,12 +1278,11 @@ acpi_wmi_ec_space_handler(u32 function, acpi_physical_address address, + static void acpi_wmi_notify_handler(acpi_handle handle, u32 event, + void *context) + { +- struct guid_block *block; + struct wmi_block *wblock; + bool found_it = false; + + list_for_each_entry(wblock, &wmi_block_list, list) { +- block = &wblock->gblock; ++ struct guid_block *block = &wblock->gblock; + + if (wblock->acpi_device->handle == handle && + (block->flags & ACPI_WMI_EVENT) && +-- +2.39.2 + diff --git a/queue-5.4/platform-x86-wmi-remove-unnecessary-argument.patch b/queue-5.4/platform-x86-wmi-remove-unnecessary-argument.patch new file mode 100644 index 00000000000..368421c969e --- /dev/null +++ b/queue-5.4/platform-x86-wmi-remove-unnecessary-argument.patch @@ -0,0 +1,75 @@ +From ff057dce1ee797ad683ec89dfb6397527cbd1c70 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 4 Sep 2021 17:55:16 +0000 +Subject: platform/x86: wmi: remove unnecessary argument +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Barnabás Pőcze + +[ Upstream commit 84eacf7e6413d5e2d2f4f9dddf9216c18a3631cf ] + +The GUID block is available for `wmi_create_device()` +through `wblock->gblock`. Use that consistently in +the function instead of using a mix of `gblock` and +`wblock->gblock`. + +Signed-off-by: Barnabás Pőcze +Link: https://lore.kernel.org/r/20210904175450.156801-8-pobrn@protonmail.com +Reviewed-by: Hans de Goede +Signed-off-by: Hans de Goede +Stable-dep-of: 028e6e204ace ("platform/x86: wmi: Break possible infinite loop when parsing GUID") +Signed-off-by: Sasha Levin +--- + drivers/platform/x86/wmi.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c +index 1aa29d594b7ab..7de866ca30e51 100644 +--- a/drivers/platform/x86/wmi.c ++++ b/drivers/platform/x86/wmi.c +@@ -1039,7 +1039,6 @@ static const struct device_type wmi_type_data = { + }; + + static int wmi_create_device(struct device *wmi_bus_dev, +- const struct guid_block *gblock, + struct wmi_block *wblock, + struct acpi_device *device) + { +@@ -1047,12 +1046,12 @@ static int wmi_create_device(struct device *wmi_bus_dev, + char method[5]; + int result; + +- if (gblock->flags & ACPI_WMI_EVENT) { ++ if (wblock->gblock.flags & ACPI_WMI_EVENT) { + wblock->dev.dev.type = &wmi_type_event; + goto out_init; + } + +- if (gblock->flags & ACPI_WMI_METHOD) { ++ if (wblock->gblock.flags & ACPI_WMI_METHOD) { + wblock->dev.dev.type = &wmi_type_method; + mutex_init(&wblock->char_mutex); + goto out_init; +@@ -1102,7 +1101,7 @@ static int wmi_create_device(struct device *wmi_bus_dev, + wblock->dev.dev.bus = &wmi_bus_type; + wblock->dev.dev.parent = wmi_bus_dev; + +- dev_set_name(&wblock->dev.dev, "%pUL", gblock->guid); ++ dev_set_name(&wblock->dev.dev, "%pUL", wblock->gblock.guid); + + device_initialize(&wblock->dev.dev); + +@@ -1194,7 +1193,7 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device) + wblock->acpi_device = device; + wblock->gblock = gblock[i]; + +- retval = wmi_create_device(wmi_bus_dev, &gblock[i], wblock, device); ++ retval = wmi_create_device(wmi_bus_dev, wblock, device); + if (retval) { + kfree(wblock); + continue; +-- +2.39.2 + diff --git a/queue-5.4/platform-x86-wmi-replace-uuid-redefinitions-by-their.patch b/queue-5.4/platform-x86-wmi-replace-uuid-redefinitions-by-their.patch new file mode 100644 index 00000000000..88ab04faa04 --- /dev/null +++ b/queue-5.4/platform-x86-wmi-replace-uuid-redefinitions-by-their.patch @@ -0,0 +1,100 @@ +From c9a6ff7affc212a596d7671d1c265748941228d5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 21 Apr 2017 16:36:06 +0300 +Subject: platform/x86: wmi: Replace UUID redefinitions by their originals + +From: Andy Shevchenko + +[ Upstream commit f9dffc1417130a2d465e2edaf6663d99738792a3 ] + +There are types and helpers that are redefined with old names. +Convert the WMI library to use those types and helpers directly. + +Signed-off-by: Andy Shevchenko +Stable-dep-of: 028e6e204ace ("platform/x86: wmi: Break possible infinite loop when parsing GUID") +Signed-off-by: Sasha Levin +--- + drivers/platform/x86/wmi.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c +index cb029126a68c6..62b146af35679 100644 +--- a/drivers/platform/x86/wmi.c ++++ b/drivers/platform/x86/wmi.c +@@ -110,11 +110,11 @@ static struct platform_driver acpi_wmi_driver = { + + static bool find_guid(const char *guid_string, struct wmi_block **out) + { +- uuid_le guid_input; ++ guid_t guid_input; + struct wmi_block *wblock; + struct guid_block *block; + +- if (uuid_le_to_bin(guid_string, &guid_input)) ++ if (guid_parse(guid_string, &guid_input)) + return false; + + list_for_each_entry(wblock, &wmi_block_list, list) { +@@ -133,7 +133,7 @@ static const void *find_guid_context(struct wmi_block *wblock, + struct wmi_driver *wdriver) + { + const struct wmi_device_id *id; +- uuid_le guid_input; ++ guid_t guid_input; + + if (wblock == NULL || wdriver == NULL) + return NULL; +@@ -142,7 +142,7 @@ static const void *find_guid_context(struct wmi_block *wblock, + + id = wdriver->id_table; + while (*id->guid_string) { +- if (uuid_le_to_bin(id->guid_string, &guid_input)) ++ if (guid_parse(id->guid_string, &guid_input)) + continue; + if (!memcmp(wblock->gblock.guid, &guid_input, 16)) + return id->context; +@@ -526,12 +526,12 @@ wmi_notify_handler handler, void *data) + { + struct wmi_block *block; + acpi_status status = AE_NOT_EXIST; +- uuid_le guid_input; ++ guid_t guid_input; + + if (!guid || !handler) + return AE_BAD_PARAMETER; + +- if (uuid_le_to_bin(guid, &guid_input)) ++ if (guid_parse(guid, &guid_input)) + return AE_BAD_PARAMETER; + + list_for_each_entry(block, &wmi_block_list, list) { +@@ -565,12 +565,12 @@ acpi_status wmi_remove_notify_handler(const char *guid) + { + struct wmi_block *block; + acpi_status status = AE_NOT_EXIST; +- uuid_le guid_input; ++ guid_t guid_input; + + if (!guid) + return AE_BAD_PARAMETER; + +- if (uuid_le_to_bin(guid, &guid_input)) ++ if (guid_parse(guid, &guid_input)) + return AE_BAD_PARAMETER; + + list_for_each_entry(block, &wmi_block_list, list) { +@@ -801,9 +801,9 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver) + return 0; + + while (*id->guid_string) { +- uuid_le driver_guid; ++ guid_t driver_guid; + +- if (WARN_ON(uuid_le_to_bin(id->guid_string, &driver_guid))) ++ if (WARN_ON(guid_parse(id->guid_string, &driver_guid))) + continue; + if (!memcmp(&driver_guid, wblock->gblock.guid, 16)) + return 1; +-- +2.39.2 + diff --git a/queue-5.4/platform-x86-wmi-use-guid_t-and-guid_equal.patch b/queue-5.4/platform-x86-wmi-use-guid_t-and-guid_equal.patch new file mode 100644 index 00000000000..907dbc5f3cf --- /dev/null +++ b/queue-5.4/platform-x86-wmi-use-guid_t-and-guid_equal.patch @@ -0,0 +1,177 @@ +From 709e8d534f129b213be59fd0bee783bd48565bb1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 4 Sep 2021 17:55:39 +0000 +Subject: platform/x86: wmi: use guid_t and guid_equal() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Barnabás Pőcze + +[ Upstream commit 67f472fdacf4a691b1c3c20c27800b23ce31e2de ] + +Instead of hard-coding a 16 long byte array, +use the available `guid_t` type and related methods. + +Signed-off-by: Barnabás Pőcze +Link: https://lore.kernel.org/r/20210904175450.156801-15-pobrn@protonmail.com +Reviewed-by: Hans de Goede +Signed-off-by: Hans de Goede +Stable-dep-of: 028e6e204ace ("platform/x86: wmi: Break possible infinite loop when parsing GUID") +Signed-off-by: Sasha Levin +--- + drivers/platform/x86/wmi.c | 34 +++++++++++++++++----------------- + 1 file changed, 17 insertions(+), 17 deletions(-) + +diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c +index 7de866ca30e51..41a680b39f9d1 100644 +--- a/drivers/platform/x86/wmi.c ++++ b/drivers/platform/x86/wmi.c +@@ -39,7 +39,7 @@ MODULE_LICENSE("GPL"); + static LIST_HEAD(wmi_block_list); + + struct guid_block { +- char guid[16]; ++ guid_t guid; + union { + char object_id[2]; + struct { +@@ -120,7 +120,7 @@ static bool find_guid(const char *guid_string, struct wmi_block **out) + list_for_each_entry(wblock, &wmi_block_list, list) { + block = &wblock->gblock; + +- if (memcmp(block->guid, &guid_input, 16) == 0) { ++ if (guid_equal(&block->guid, &guid_input)) { + if (out) + *out = wblock; + return true; +@@ -144,7 +144,7 @@ static const void *find_guid_context(struct wmi_block *wblock, + while (*id->guid_string) { + if (guid_parse(id->guid_string, &guid_input)) + continue; +- if (!memcmp(wblock->gblock.guid, &guid_input, 16)) ++ if (guid_equal(&wblock->gblock.guid, &guid_input)) + return id->context; + id++; + } +@@ -456,7 +456,7 @@ EXPORT_SYMBOL_GPL(wmi_set_block); + + static void wmi_dump_wdg(const struct guid_block *g) + { +- pr_info("%pUL:\n", g->guid); ++ pr_info("%pUL:\n", &g->guid); + if (g->flags & ACPI_WMI_EVENT) + pr_info("\tnotify_id: 0x%02X\n", g->notify_id); + else +@@ -537,7 +537,7 @@ wmi_notify_handler handler, void *data) + list_for_each_entry(block, &wmi_block_list, list) { + acpi_status wmi_status; + +- if (memcmp(block->gblock.guid, &guid_input, 16) == 0) { ++ if (guid_equal(&block->gblock.guid, &guid_input)) { + if (block->handler && + block->handler != wmi_notify_debug) + return AE_ALREADY_ACQUIRED; +@@ -576,7 +576,7 @@ acpi_status wmi_remove_notify_handler(const char *guid) + list_for_each_entry(block, &wmi_block_list, list) { + acpi_status wmi_status; + +- if (memcmp(block->gblock.guid, &guid_input, 16) == 0) { ++ if (guid_equal(&block->gblock.guid, &guid_input)) { + if (!block->handler || + block->handler == wmi_notify_debug) + return AE_NULL_ENTRY; +@@ -682,7 +682,7 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, + { + struct wmi_block *wblock = dev_to_wblock(dev); + +- return sprintf(buf, "wmi:%pUL\n", wblock->gblock.guid); ++ return sprintf(buf, "wmi:%pUL\n", &wblock->gblock.guid); + } + static DEVICE_ATTR_RO(modalias); + +@@ -691,7 +691,7 @@ static ssize_t guid_show(struct device *dev, struct device_attribute *attr, + { + struct wmi_block *wblock = dev_to_wblock(dev); + +- return sprintf(buf, "%pUL\n", wblock->gblock.guid); ++ return sprintf(buf, "%pUL\n", &wblock->gblock.guid); + } + static DEVICE_ATTR_RO(guid); + +@@ -774,10 +774,10 @@ static int wmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env) + { + struct wmi_block *wblock = dev_to_wblock(dev); + +- if (add_uevent_var(env, "MODALIAS=wmi:%pUL", wblock->gblock.guid)) ++ if (add_uevent_var(env, "MODALIAS=wmi:%pUL", &wblock->gblock.guid)) + return -ENOMEM; + +- if (add_uevent_var(env, "WMI_GUID=%pUL", wblock->gblock.guid)) ++ if (add_uevent_var(env, "WMI_GUID=%pUL", &wblock->gblock.guid)) + return -ENOMEM; + + return 0; +@@ -805,7 +805,7 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver) + + if (WARN_ON(guid_parse(id->guid_string, &driver_guid))) + continue; +- if (!memcmp(&driver_guid, wblock->gblock.guid, 16)) ++ if (guid_equal(&driver_guid, &wblock->gblock.guid)) + return 1; + + id++; +@@ -1101,7 +1101,7 @@ static int wmi_create_device(struct device *wmi_bus_dev, + wblock->dev.dev.bus = &wmi_bus_type; + wblock->dev.dev.parent = wmi_bus_dev; + +- dev_set_name(&wblock->dev.dev, "%pUL", wblock->gblock.guid); ++ dev_set_name(&wblock->dev.dev, "%pUL", &wblock->gblock.guid); + + device_initialize(&wblock->dev.dev); + +@@ -1121,12 +1121,12 @@ static void wmi_free_devices(struct acpi_device *device) + } + } + +-static bool guid_already_parsed(struct acpi_device *device, const u8 *guid) ++static bool guid_already_parsed(struct acpi_device *device, const guid_t *guid) + { + struct wmi_block *wblock; + + list_for_each_entry(wblock, &wmi_block_list, list) { +- if (memcmp(wblock->gblock.guid, guid, 16) == 0) { ++ if (guid_equal(&wblock->gblock.guid, guid)) { + /* + * Because we historically didn't track the relationship + * between GUIDs and ACPI nodes, we don't know whether +@@ -1181,7 +1181,7 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device) + * case yet, so for now, we'll just ignore the duplicate + * for device creation. + */ +- if (guid_already_parsed(device, gblock[i].guid)) ++ if (guid_already_parsed(device, &gblock[i].guid)) + continue; + + wblock = kzalloc(sizeof(struct wmi_block), GFP_KERNEL); +@@ -1218,7 +1218,7 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device) + retval = device_add(&wblock->dev.dev); + if (retval) { + dev_err(wmi_bus_dev, "failed to register %pUL\n", +- wblock->gblock.guid); ++ &wblock->gblock.guid); + if (debug_event) + wmi_method_enable(wblock, 0); + list_del(&wblock->list); +@@ -1332,7 +1332,7 @@ static void acpi_wmi_notify_handler(acpi_handle handle, u32 event, + } + + if (debug_event) +- pr_info("DEBUG Event GUID: %pUL\n", wblock->gblock.guid); ++ pr_info("DEBUG Event GUID: %pUL\n", &wblock->gblock.guid); + + acpi_bus_generate_netlink_event( + wblock->acpi_device->pnp.device_class, +-- +2.39.2 + diff --git a/queue-5.4/scsi-qla2xxx-fix-error-code-in-qla2x00_start_sp.patch b/queue-5.4/scsi-qla2xxx-fix-error-code-in-qla2x00_start_sp.patch new file mode 100644 index 00000000000..5cef55a89e9 --- /dev/null +++ b/queue-5.4/scsi-qla2xxx-fix-error-code-in-qla2x00_start_sp.patch @@ -0,0 +1,38 @@ +From 49654d52e468856ea4004f6d3ac2178d67f99cfd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 Jun 2023 13:58:47 +0300 +Subject: scsi: qla2xxx: Fix error code in qla2x00_start_sp() + +From: Dan Carpenter + +[ Upstream commit e579b007eff3ff8d29d59d16214cd85fb9e573f7 ] + +This should be negative -EAGAIN instead of positive. The callers treat +non-zero error codes the same so it doesn't really impact runtime beyond +some trivial differences to debug output. + +Fixes: 80676d054e5a ("scsi: qla2xxx: Fix session cleanup hang") +Signed-off-by: Dan Carpenter +Link: https://lore.kernel.org/r/49866d28-4cfe-47b0-842b-78f110e61aab@moroto.mountain +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/qla2xxx/qla_iocb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c +index 103288b0377e0..cbdc84fdc52c1 100644 +--- a/drivers/scsi/qla2xxx/qla_iocb.c ++++ b/drivers/scsi/qla2xxx/qla_iocb.c +@@ -3665,7 +3665,7 @@ qla2x00_start_sp(srb_t *sp) + spin_lock_irqsave(qp->qp_lock_ptr, flags); + pkt = __qla2x00_alloc_iocbs(sp->qpair, sp); + if (!pkt) { +- rval = EAGAIN; ++ rval = -EAGAIN; + ql_log(ql_log_warn, vha, 0x700c, + "qla2x00_alloc_iocbs failed.\n"); + goto done; +-- +2.39.2 + diff --git a/queue-5.4/series b/queue-5.4/series index 221b039e194..8e3d4b51fee 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -191,3 +191,35 @@ netfilter-nf_tables-fix-scheduling-while-atomic-splat.patch netfilter-conntrack-avoid-nf_ct_helper_hash-uses-after-free.patch netfilter-nf_tables-prevent-oob-access-in-nft_byteorder_eval.patch tty-serial-fsl_lpuart-add-earlycon-for-imx8ulp-platform.patch +drm-panel-initialise-panel-dev-and-funcs-through-drm.patch +drm-panel-add-and-fill-drm_panel-type-field.patch +drm-panel-simple-add-connector_type-for-innolux_at04.patch +igc-remove-delay-during-tx-ring-configuration.patch +igc-set-tp-bit-in-supported-and-advertising-fields-o.patch +scsi-qla2xxx-fix-error-code-in-qla2x00_start_sp.patch +net-mvneta-fix-txq_map-in-case-of-txq_number-1.patch +net-sched-cls_fw-fix-improper-refcount-update-leads-.patch +ionic-improve-irq-numa-locality.patch +ionic-clean-irq-affinity-on-queue-deinit.patch +ionic-move-irq-request-to-qcq-alloc.patch +ionic-ionic_intr_free-parameter-change.patch +ionic-remove-warn_on-to-prevent-panic_on_warn.patch +icmp6-fix-null-ptr-deref-of-ip6_null_entry-rt6i_idev.patch +udp6-fix-udp6_ehashfn-typo.patch +ntb-idt-fix-error-handling-in-idt_pci_driver_init.patch +ntb-amd-fix-error-handling-in-amd_ntb_pci_driver_ini.patch +ntb-intel-fix-error-handling-in-intel_ntb_pci_driver.patch +ntb-ntb_transport-fix-possible-memory-leak-while-dev.patch +ntb-ntb_tool-add-check-for-devm_kcalloc.patch +ipv6-addrconf-fix-a-potential-refcount-underflow-for.patch +platform-x86-wmi-replace-uuid-redefinitions-by-their.patch +platform-x86-wmi-fix-indentation-in-some-cases.patch +platform-x86-wmi-remove-unnecessary-argument.patch +platform-x86-wmi-use-guid_t-and-guid_equal.patch +platform-x86-wmi-move-variables.patch +platform-x86-wmi-break-possible-infinite-loop-when-p.patch +erofs-avoid-infinite-loop-in-z_erofs_do_read_page-wh.patch +wifi-airo-avoid-uninitialized-warning-in-airo_get_ra.patch +cls_flower-add-extack-support-for-src-and-dst-port-r.patch +net-sched-flower-ensure-both-minimum-and-maximum-por.patch +net-sched-make-psched_mtu-rtnl-less-safe.patch diff --git a/queue-5.4/udp6-fix-udp6_ehashfn-typo.patch b/queue-5.4/udp6-fix-udp6_ehashfn-typo.patch new file mode 100644 index 00000000000..ce9107975b6 --- /dev/null +++ b/queue-5.4/udp6-fix-udp6_ehashfn-typo.patch @@ -0,0 +1,40 @@ +From a7d9235386176f89cbf5c25a4186b73b60a03f66 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 8 Jul 2023 08:29:58 +0000 +Subject: udp6: fix udp6_ehashfn() typo + +From: Eric Dumazet + +[ Upstream commit 51d03e2f2203e76ed02d33fb5ffbb5fc85ffaf54 ] + +Amit Klein reported that udp6_ehash_secret was initialized but never used. + +Fixes: 1bbdceef1e53 ("inet: convert inet_ehash_secret and ipv6_hash_secret to net_get_random_once") +Reported-by: Amit Klein +Signed-off-by: Eric Dumazet +Cc: Willy Tarreau +Cc: Willem de Bruijn +Cc: David Ahern +Cc: Hannes Frederic Sowa +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv6/udp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c +index 797d45ceb2c74..93eb622219756 100644 +--- a/net/ipv6/udp.c ++++ b/net/ipv6/udp.c +@@ -87,7 +87,7 @@ static u32 udp6_ehashfn(const struct net *net, + fhash = __ipv6_addr_jhash(faddr, udp_ipv6_hash_secret); + + return __inet6_ehashfn(lhash, lport, fhash, fport, +- udp_ipv6_hash_secret + net_hash_mix(net)); ++ udp6_ehash_secret + net_hash_mix(net)); + } + + int udp_v6_get_port(struct sock *sk, unsigned short snum) +-- +2.39.2 + diff --git a/queue-5.4/wifi-airo-avoid-uninitialized-warning-in-airo_get_ra.patch b/queue-5.4/wifi-airo-avoid-uninitialized-warning-in-airo_get_ra.patch new file mode 100644 index 00000000000..dbdf1d55d51 --- /dev/null +++ b/queue-5.4/wifi-airo-avoid-uninitialized-warning-in-airo_get_ra.patch @@ -0,0 +1,47 @@ +From 30e1defc749aedf9906d96856cf4526fbbfe2d5b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 9 Jul 2023 06:31:54 -0700 +Subject: wifi: airo: avoid uninitialized warning in airo_get_rate() + +From: Randy Dunlap + +[ Upstream commit 9373771aaed17f5c2c38485f785568abe3a9f8c1 ] + +Quieten a gcc (11.3.0) build error or warning by checking the function +call status and returning -EBUSY if the function call failed. +This is similar to what several other wireless drivers do for the +SIOCGIWRATE ioctl call when there is a locking problem. + +drivers/net/wireless/cisco/airo.c: error: 'status_rid.currentXmitRate' is used uninitialized [-Werror=uninitialized] + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Signed-off-by: Randy Dunlap +Reported-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/39abf2c7-24a-f167-91da-ed4c5435d1c4@linux-m68k.org +Link: https://lore.kernel.org/r/20230709133154.26206-1-rdunlap@infradead.org +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/cisco/airo.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/cisco/airo.c b/drivers/net/wireless/cisco/airo.c +index da0d3834b5f01..ebf0d3072290e 100644 +--- a/drivers/net/wireless/cisco/airo.c ++++ b/drivers/net/wireless/cisco/airo.c +@@ -6104,8 +6104,11 @@ static int airo_get_rate(struct net_device *dev, + { + struct airo_info *local = dev->ml_priv; + StatusRid status_rid; /* Card status info */ ++ int ret; + +- readStatusRid(local, &status_rid, 1); ++ ret = readStatusRid(local, &status_rid, 1); ++ if (ret) ++ return -EBUSY; + + vwrq->value = le16_to_cpu(status_rid.currentXmitRate) * 500000; + /* If more than one rate, set auto */ +-- +2.39.2 + -- 2.47.3