commit:     6104eea26c521a7aaa63ea1c1f5bec42bfe213fe
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Fri Mar  3 12:27:38 2023 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Fri Mar  3 12:27:38 2023 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=6104eea2

Linux patch 6.2.2

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README            |   4 +
 1001_linux-6.2.2.patch | 560 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 564 insertions(+)

diff --git a/0000_README b/0000_README
index b0db3406..b2b768d6 100644
--- a/0000_README
+++ b/0000_README
@@ -47,6 +47,10 @@ Patch:  1000_linux-6.2.1.patch
 From:   https://www.kernel.org
 Desc:   Linux 6.2.1
 
+Patch:  1001_linux-6.2.2.patch
+From:   https://www.kernel.org
+Desc:   Linux 6.2.2
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1001_linux-6.2.2.patch b/1001_linux-6.2.2.patch
new file mode 100644
index 00000000..d24dc949
--- /dev/null
+++ b/1001_linux-6.2.2.patch
@@ -0,0 +1,560 @@
+diff --git a/Makefile b/Makefile
+index f26824f367a99..1836ddaf2c94c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 6
+ PATCHLEVEL = 2
+-SUBLEVEL = 1
++SUBLEVEL = 2
+ EXTRAVERSION =
+ NAME = Hurr durr I'ma ninja sloth
+ 
+diff --git a/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref-gadget0.dts 
b/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref-gadget0.dts
+index 7069f51bc120e..99136adb1857f 100644
+--- a/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref-gadget0.dts
++++ b/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref-gadget0.dts
+@@ -24,7 +24,7 @@
+       snps,dis_enblslpm_quirk;
+       snps,dis_u2_susphy_quirk;
+       snps,dis_u3_susphy_quirk;
+-      snps,usb2_gadget_lpm_disable;
++      snps,usb2-gadget-lpm-disable;
+       phy-names = "usb2-phy", "usb3-phy";
+       phys = <&usb0_hsphy0>, <&usb0_ssphy0>;
+ };
+diff --git a/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref-gadget1.dts 
b/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref-gadget1.dts
+index a3cfa8113ffb2..4c960f455461c 100644
+--- a/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref-gadget1.dts
++++ b/arch/arm64/boot/dts/socionext/uniphier-pxs3-ref-gadget1.dts
+@@ -24,7 +24,7 @@
+       snps,dis_enblslpm_quirk;
+       snps,dis_u2_susphy_quirk;
+       snps,dis_u3_susphy_quirk;
+-      snps,usb2_gadget_lpm_disable;
++      snps,usb2-gadget-lpm-disable;
+       phy-names = "usb2-phy", "usb3-phy";
+       phys = <&usb1_hsphy0>, <&usb1_ssphy0>;
+ };
+diff --git a/arch/arm64/crypto/sm4-ce-gcm-glue.c 
b/arch/arm64/crypto/sm4-ce-gcm-glue.c
+index c450a2025ca9a..73bfb6972d3a3 100644
+--- a/arch/arm64/crypto/sm4-ce-gcm-glue.c
++++ b/arch/arm64/crypto/sm4-ce-gcm-glue.c
+@@ -135,22 +135,23 @@ static void gcm_calculate_auth_mac(struct aead_request 
*req, u8 ghash[])
+ }
+ 
+ static int gcm_crypt(struct aead_request *req, struct skcipher_walk *walk,
+-                   struct sm4_gcm_ctx *ctx, u8 ghash[],
++                   u8 ghash[], int err,
+                    void (*sm4_ce_pmull_gcm_crypt)(const u32 *rkey_enc,
+                               u8 *dst, const u8 *src, u8 *iv,
+                               unsigned int nbytes, u8 *ghash,
+                               const u8 *ghash_table, const u8 *lengths))
+ {
++      struct crypto_aead *aead = crypto_aead_reqtfm(req);
++      struct sm4_gcm_ctx *ctx = crypto_aead_ctx(aead);
+       u8 __aligned(8) iv[SM4_BLOCK_SIZE];
+       be128 __aligned(8) lengths;
+-      int err;
+ 
+       memset(ghash, 0, SM4_BLOCK_SIZE);
+ 
+       lengths.a = cpu_to_be64(req->assoclen * 8);
+       lengths.b = cpu_to_be64(walk->total * 8);
+ 
+-      memcpy(iv, walk->iv, GCM_IV_SIZE);
++      memcpy(iv, req->iv, GCM_IV_SIZE);
+       put_unaligned_be32(2, iv + GCM_IV_SIZE);
+ 
+       kernel_neon_begin();
+@@ -158,49 +159,51 @@ static int gcm_crypt(struct aead_request *req, struct 
skcipher_walk *walk,
+       if (req->assoclen)
+               gcm_calculate_auth_mac(req, ghash);
+ 
+-      do {
++      while (walk->nbytes) {
+               unsigned int tail = walk->nbytes % SM4_BLOCK_SIZE;
+               const u8 *src = walk->src.virt.addr;
+               u8 *dst = walk->dst.virt.addr;
+ 
+               if (walk->nbytes == walk->total) {
+-                      tail = 0;
+-
+                       sm4_ce_pmull_gcm_crypt(ctx->key.rkey_enc, dst, src, iv,
+                                              walk->nbytes, ghash,
+                                              ctx->ghash_table,
+                                              (const u8 *)&lengths);
+-              } else if (walk->nbytes - tail) {
+-                      sm4_ce_pmull_gcm_crypt(ctx->key.rkey_enc, dst, src, iv,
+-                                             walk->nbytes - tail, ghash,
+-                                             ctx->ghash_table, NULL);
++
++                      kernel_neon_end();
++
++                      return skcipher_walk_done(walk, 0);
+               }
+ 
++              sm4_ce_pmull_gcm_crypt(ctx->key.rkey_enc, dst, src, iv,
++                                     walk->nbytes - tail, ghash,
++                                     ctx->ghash_table, NULL);
++
+               kernel_neon_end();
+ 
+               err = skcipher_walk_done(walk, tail);
+-              if (err)
+-                      return err;
+-              if (walk->nbytes)
+-                      kernel_neon_begin();
+-      } while (walk->nbytes > 0);
+ 
+-      return 0;
++              kernel_neon_begin();
++      }
++
++      sm4_ce_pmull_gcm_crypt(ctx->key.rkey_enc, NULL, NULL, iv,
++                             walk->nbytes, ghash, ctx->ghash_table,
++                             (const u8 *)&lengths);
++
++      kernel_neon_end();
++
++      return err;
+ }
+ 
+ static int gcm_encrypt(struct aead_request *req)
+ {
+       struct crypto_aead *aead = crypto_aead_reqtfm(req);
+-      struct sm4_gcm_ctx *ctx = crypto_aead_ctx(aead);
+       u8 __aligned(8) ghash[SM4_BLOCK_SIZE];
+       struct skcipher_walk walk;
+       int err;
+ 
+       err = skcipher_walk_aead_encrypt(&walk, req, false);
+-      if (err)
+-              return err;
+-
+-      err = gcm_crypt(req, &walk, ctx, ghash, sm4_ce_pmull_gcm_enc);
++      err = gcm_crypt(req, &walk, ghash, err, sm4_ce_pmull_gcm_enc);
+       if (err)
+               return err;
+ 
+@@ -215,17 +218,13 @@ static int gcm_decrypt(struct aead_request *req)
+ {
+       struct crypto_aead *aead = crypto_aead_reqtfm(req);
+       unsigned int authsize = crypto_aead_authsize(aead);
+-      struct sm4_gcm_ctx *ctx = crypto_aead_ctx(aead);
+       u8 __aligned(8) ghash[SM4_BLOCK_SIZE];
+       u8 authtag[SM4_BLOCK_SIZE];
+       struct skcipher_walk walk;
+       int err;
+ 
+       err = skcipher_walk_aead_decrypt(&walk, req, false);
+-      if (err)
+-              return err;
+-
+-      err = gcm_crypt(req, &walk, ctx, ghash, sm4_ce_pmull_gcm_dec);
++      err = gcm_crypt(req, &walk, ghash, err, sm4_ce_pmull_gcm_dec);
+       if (err)
+               return err;
+ 
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+index 9c7b69d377bd3..af16d6bb974b7 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -10359,6 +10359,7 @@ int amdgpu_dm_process_dmub_aux_transfer_sync(
+       ret = p_notify->aux_reply.length;
+       *operation_result = p_notify->result;
+ out:
++      reinit_completion(&adev->dm.dmub_aux_transfer_done);
+       mutex_unlock(&adev->dm.dpia_aux_lock);
+       return ret;
+ }
+@@ -10386,6 +10387,8 @@ int amdgpu_dm_process_dmub_set_config_sync(
+               *operation_result = SET_CONFIG_UNKNOWN_ERROR;
+       }
+ 
++      if (!is_cmd_complete)
++              reinit_completion(&adev->dm.dmub_aux_transfer_done);
+       mutex_unlock(&adev->dm.dpia_aux_lock);
+       return ret;
+ }
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c
+index a0741794db62a..8e824dc81dede 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c
+@@ -391,3 +391,27 @@ void dcn314_set_pixels_per_cycle(struct pipe_ctx 
*pipe_ctx)
+               
pipe_ctx->stream_res.stream_enc->funcs->set_input_mode(pipe_ctx->stream_res.stream_enc,
+                               pix_per_cycle);
+ }
++
++void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, 
bool power_on)
++{
++      struct dc_context *ctx = hws->ctx;
++      union dmub_rb_cmd cmd;
++
++      if (hws->ctx->dc->debug.disable_hubp_power_gate)
++              return;
++
++      PERF_TRACE();
++
++      memset(&cmd, 0, sizeof(cmd));
++      cmd.domain_control.header.type = DMUB_CMD__VBIOS;
++      cmd.domain_control.header.sub_type = DMUB_CMD__VBIOS_DOMAIN_CONTROL;
++      cmd.domain_control.header.payload_bytes = 
sizeof(cmd.domain_control.data);
++      cmd.domain_control.data.inst = hubp_inst;
++      cmd.domain_control.data.power_gate = !power_on;
++
++      dc_dmub_srv_cmd_queue(ctx->dmub_srv, &cmd);
++      dc_dmub_srv_cmd_execute(ctx->dmub_srv);
++      dc_dmub_srv_wait_idle(ctx->dmub_srv);
++
++      PERF_TRACE();
++}
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h 
b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h
+index 244280298212c..c419d3dbdfee6 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h
+@@ -41,4 +41,6 @@ unsigned int dcn314_calculate_dccg_k1_k2_values(struct 
pipe_ctx *pipe_ctx, unsig
+ 
+ void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx);
+ 
++void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, 
bool power_on);
++
+ #endif /* __DC_HWSS_DCN314_H__ */
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c 
b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
+index 31feb4b0edee9..25f345ff6c8f0 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
+@@ -137,7 +137,7 @@ static const struct hwseq_private_funcs 
dcn314_private_funcs = {
+       .plane_atomic_disable = dcn20_plane_atomic_disable,
+       .plane_atomic_power_down = dcn10_plane_atomic_power_down,
+       .enable_power_gating_plane = dcn314_enable_power_gating_plane,
+-      .hubp_pg_control = dcn31_hubp_pg_control,
++      .hubp_pg_control = dcn314_hubp_pg_control,
+       .program_all_writeback_pipes_in_tree = 
dcn30_program_all_writeback_pipes_in_tree,
+       .update_odm = dcn314_update_odm,
+       .dsc_pg_control = dcn314_dsc_pg_control,
+diff --git a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h 
b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
+index 33907feefebbd..8fea8e42cc174 100644
+--- a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
++++ b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
+@@ -457,6 +457,10 @@ enum dmub_cmd_vbios_type {
+        * Query DP alt status on a transmitter.
+        */
+       DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT  = 26,
++      /**
++       * Controls domain power gating
++       */
++      DMUB_CMD__VBIOS_DOMAIN_CONTROL = 28,
+ };
+ 
+ 
//==============================================================================
+@@ -1204,6 +1208,23 @@ struct dmub_rb_cmd_dig1_transmitter_control {
+       union dmub_cmd_dig1_transmitter_control_data transmitter_control; /**< 
payload */
+ };
+ 
++/**
++ * struct dmub_rb_cmd_domain_control_data - Data for DOMAIN power control
++ */
++struct dmub_rb_cmd_domain_control_data {
++      uint8_t inst : 6; /**< DOMAIN instance to control */
++      uint8_t power_gate : 1; /**< 1=power gate, 0=power up */
++      uint8_t reserved[3]; /**< Reserved for future use */
++};
++
++/**
++ * struct dmub_rb_cmd_domain_control - Controls DOMAIN power gating
++ */
++struct dmub_rb_cmd_domain_control {
++      struct dmub_cmd_header header; /**< header */
++      struct dmub_rb_cmd_domain_control_data data; /**< payload */
++};
++
+ /**
+  * DPIA tunnel command parameters.
+  */
+@@ -3231,6 +3252,10 @@ union dmub_rb_cmd {
+        * Definition of a DMUB_CMD__VBIOS_DIG1_TRANSMITTER_CONTROL command.
+        */
+       struct dmub_rb_cmd_dig1_transmitter_control dig1_transmitter_control;
++      /**
++       * Definition of a DMUB_CMD__VBIOS_DOMAIN_CONTROL command.
++       */
++      struct dmub_rb_cmd_domain_control domain_control;
+       /**
+        * Definition of a DMUB_CMD__PSR_SET_VERSION command.
+        */
+diff --git a/drivers/net/wireless/realtek/rtw88/usb.c 
b/drivers/net/wireless/realtek/rtw88/usb.c
+index 4ef38279b64c9..2a8336b1847a5 100644
+--- a/drivers/net/wireless/realtek/rtw88/usb.c
++++ b/drivers/net/wireless/realtek/rtw88/usb.c
+@@ -271,6 +271,7 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 
qsel, struct sk_buff *s
+               return -ENOMEM;
+ 
+       usb_fill_bulk_urb(urb, usbd, pipe, skb->data, skb->len, cb, context);
++      urb->transfer_flags |= URB_ZERO_PACKET;
+       ret = usb_submit_urb(urb, GFP_ATOMIC);
+ 
+       usb_free_urb(urb);
+@@ -413,24 +414,11 @@ static int rtw_usb_write_data_rsvd_page(struct rtw_dev 
*rtwdev, u8 *buf,
+                                       u32 size)
+ {
+       const struct rtw_chip_info *chip = rtwdev->chip;
+-      struct rtw_usb *rtwusb;
+       struct rtw_tx_pkt_info pkt_info = {0};
+-      u32 len, desclen;
+-
+-      rtwusb = rtw_get_usb_priv(rtwdev);
+ 
+       pkt_info.tx_pkt_size = size;
+       pkt_info.qsel = TX_DESC_QSEL_BEACON;
+-
+-      desclen = chip->tx_pkt_desc_sz;
+-      len = desclen + size;
+-      if (len % rtwusb->bulkout_size == 0) {
+-              len += RTW_USB_PACKET_OFFSET_SZ;
+-              pkt_info.offset = desclen + RTW_USB_PACKET_OFFSET_SZ;
+-              pkt_info.pkt_offset = 1;
+-      } else {
+-              pkt_info.offset = desclen;
+-      }
++      pkt_info.offset = chip->tx_pkt_desc_sz;
+ 
+       return rtw_usb_write_data(rtwdev, &pkt_info, buf);
+ }
+@@ -471,9 +459,9 @@ static int rtw_usb_tx_write(struct rtw_dev *rtwdev,
+       u8 *pkt_desc;
+       int ep;
+ 
++      pkt_info->qsel = rtw_usb_tx_queue_mapping_to_qsel(skb);
+       pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
+       memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
+-      pkt_info->qsel = rtw_usb_tx_queue_mapping_to_qsel(skb);
+       ep = qsel_to_ep(rtwusb, pkt_info->qsel);
+       rtw_tx_fill_tx_desc(pkt_info, skb);
+       rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
+diff --git a/drivers/tty/vt/vc_screen.c b/drivers/tty/vt/vc_screen.c
+index f566eb1839dc5..71e091f879f0e 100644
+--- a/drivers/tty/vt/vc_screen.c
++++ b/drivers/tty/vt/vc_screen.c
+@@ -403,10 +403,11 @@ vcs_read(struct file *file, char __user *buf, size_t 
count, loff_t *ppos)
+               unsigned int this_round, skip = 0;
+               int size;
+ 
+-              ret = -ENXIO;
+               vc = vcs_vc(inode, &viewed);
+-              if (!vc)
+-                      goto unlock_out;
++              if (!vc) {
++                      ret = -ENXIO;
++                      break;
++              }
+ 
+               /* Check whether we are above size each round,
+                * as copy_to_user at the end of this loop
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index 9eca403af2a85..97a0f8faea6e5 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -2389,9 +2389,8 @@ static int usb_enumerate_device_otg(struct usb_device 
*udev)
+  * usb_enumerate_device - Read device configs/intfs/otg (usbcore-internal)
+  * @udev: newly addressed device (in ADDRESS state)
+  *
+- * This is only called by usb_new_device() and usb_authorize_device()
+- * and FIXME -- all comments that apply to them apply here wrt to
+- * environment.
++ * This is only called by usb_new_device() -- all comments that apply there
++ * apply here wrt to environment.
+  *
+  * If the device is WUSB and not authorized, we don't attempt to read
+  * the string descriptors, as they will be errored out by the device
+diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c
+index 8217032dfb85f..b63f78e48c74e 100644
+--- a/drivers/usb/core/sysfs.c
++++ b/drivers/usb/core/sysfs.c
+@@ -869,11 +869,7 @@ read_descriptors(struct file *filp, struct kobject *kobj,
+       size_t srclen, n;
+       int cfgno;
+       void *src;
+-      int retval;
+ 
+-      retval = usb_lock_device_interruptible(udev);
+-      if (retval < 0)
+-              return -EINTR;
+       /* The binary attribute begins with the device descriptor.
+        * Following that are the raw descriptor entries for all the
+        * configurations (config plus subsidiary descriptors).
+@@ -898,7 +894,6 @@ read_descriptors(struct file *filp, struct kobject *kobj,
+                       off -= srclen;
+               }
+       }
+-      usb_unlock_device(udev);
+       return count - nleft;
+ }
+ 
+diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
+index 89c9ab2b19f85..a23ddbb819795 100644
+--- a/drivers/usb/dwc3/dwc3-pci.c
++++ b/drivers/usb/dwc3/dwc3-pci.c
+@@ -47,6 +47,7 @@
+ #define PCI_DEVICE_ID_INTEL_ADLS              0x7ae1
+ #define PCI_DEVICE_ID_INTEL_RPL                       0xa70e
+ #define PCI_DEVICE_ID_INTEL_RPLS              0x7a61
++#define PCI_DEVICE_ID_INTEL_MTLM              0x7eb1
+ #define PCI_DEVICE_ID_INTEL_MTLP              0x7ec1
+ #define PCI_DEVICE_ID_INTEL_MTL                       0x7e7e
+ #define PCI_DEVICE_ID_INTEL_TGL                       0x9a15
+@@ -467,6 +468,9 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
+       { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_RPLS),
+         (kernel_ulong_t) &dwc3_pci_intel_swnode, },
+ 
++      { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MTLM),
++        (kernel_ulong_t) &dwc3_pci_intel_swnode, },
++
+       { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MTLP),
+         (kernel_ulong_t) &dwc3_pci_intel_swnode, },
+ 
+diff --git a/drivers/usb/gadget/function/u_serial.c 
b/drivers/usb/gadget/function/u_serial.c
+index 840626e064e13..a0ca47fbff0fc 100644
+--- a/drivers/usb/gadget/function/u_serial.c
++++ b/drivers/usb/gadget/function/u_serial.c
+@@ -82,6 +82,9 @@
+ #define WRITE_BUF_SIZE                8192            /* TX only */
+ #define GS_CONSOLE_BUF_SIZE   8192
+ 
++/* Prevents race conditions while accessing gser->ioport */
++static DEFINE_SPINLOCK(serial_port_lock);
++
+ /* console info */
+ struct gs_console {
+       struct console          console;
+@@ -1375,8 +1378,10 @@ void gserial_disconnect(struct gserial *gser)
+       if (!port)
+               return;
+ 
++      spin_lock_irqsave(&serial_port_lock, flags);
++
+       /* tell the TTY glue not to do I/O here any more */
+-      spin_lock_irqsave(&port->port_lock, flags);
++      spin_lock(&port->port_lock);
+ 
+       gs_console_disconnect(port);
+ 
+@@ -1391,7 +1396,8 @@ void gserial_disconnect(struct gserial *gser)
+                       tty_hangup(port->port.tty);
+       }
+       port->suspended = false;
+-      spin_unlock_irqrestore(&port->port_lock, flags);
++      spin_unlock(&port->port_lock);
++      spin_unlock_irqrestore(&serial_port_lock, flags);
+ 
+       /* disable endpoints, aborting down any active I/O */
+       usb_ep_disable(gser->out);
+@@ -1425,10 +1431,19 @@ EXPORT_SYMBOL_GPL(gserial_suspend);
+ 
+ void gserial_resume(struct gserial *gser)
+ {
+-      struct gs_port *port = gser->ioport;
++      struct gs_port *port;
+       unsigned long   flags;
+ 
+-      spin_lock_irqsave(&port->port_lock, flags);
++      spin_lock_irqsave(&serial_port_lock, flags);
++      port = gser->ioport;
++
++      if (!port) {
++              spin_unlock_irqrestore(&serial_port_lock, flags);
++              return;
++      }
++
++      spin_lock(&port->port_lock);
++      spin_unlock(&serial_port_lock);
+       port->suspended = false;
+       if (!port->start_delayed) {
+               spin_unlock_irqrestore(&port->port_lock, flags);
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index ee5ac4ef7e162..e6d8d9b35ad0e 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -402,6 +402,8 @@ static void option_instat_callback(struct urb *urb);
+ #define LONGCHEER_VENDOR_ID                   0x1c9e
+ 
+ /* 4G Systems products */
++/* This one was sold as the VW and Skoda "Carstick LTE" */
++#define FOUR_G_SYSTEMS_PRODUCT_CARSTICK_LTE   0x7605
+ /* This is the 4G XS Stick W14 a.k.a. Mobilcom Debitel Surf-Stick *
+  * It seems to contain a Qualcomm QSC6240/6290 chipset            */
+ #define FOUR_G_SYSTEMS_PRODUCT_W14            0x9603
+@@ -1976,6 +1978,8 @@ static const struct usb_device_id option_ids[] = {
+         .driver_info = RSVD(2) },
+       { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) },
+       { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) },
++      { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_CARSTICK_LTE),
++        .driver_info = RSVD(0) },
+       { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14),
+         .driver_info = NCTRL(0) | NCTRL(1) },
+       { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W100),
+diff --git a/drivers/usb/typec/pd.c b/drivers/usb/typec/pd.c
+index dc72005d68db9..b5ab26422c349 100644
+--- a/drivers/usb/typec/pd.c
++++ b/drivers/usb/typec/pd.c
+@@ -161,7 +161,6 @@ static struct device_type source_fixed_supply_type = {
+ 
+ static struct attribute *sink_fixed_supply_attrs[] = {
+       &dev_attr_dual_role_power.attr,
+-      &dev_attr_usb_suspend_supported.attr,
+       &dev_attr_unconstrained_power.attr,
+       &dev_attr_usb_communication_capable.attr,
+       &dev_attr_dual_role_data.attr,
+diff --git a/net/core/filter.c b/net/core/filter.c
+index 43cc1fe58a2c6..a00a4b5476d45 100644
+--- a/net/core/filter.c
++++ b/net/core/filter.c
+@@ -5816,7 +5816,7 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct 
bpf_fib_lookup *params,
+               neigh = __ipv6_neigh_lookup_noref_stub(dev, dst);
+       }
+ 
+-      if (!neigh)
++      if (!neigh || !(neigh->nud_state & NUD_VALID))
+               return BPF_FIB_LKUP_RET_NO_NEIGH;
+ 
+       return bpf_fib_set_fwd_params(params, neigh, dev, mtu);
+@@ -5931,7 +5931,7 @@ static int bpf_ipv6_fib_lookup(struct net *net, struct 
bpf_fib_lookup *params,
+        * not needed here.
+        */
+       neigh = __ipv6_neigh_lookup_noref_stub(dev, dst);
+-      if (!neigh)
++      if (!neigh || !(neigh->nud_state & NUD_VALID))
+               return BPF_FIB_LKUP_RET_NO_NEIGH;
+ 
+       return bpf_fib_set_fwd_params(params, neigh, dev, mtu);
+diff --git a/scripts/tags.sh b/scripts/tags.sh
+index e137cf15aae9d..0d045182c08c0 100755
+--- a/scripts/tags.sh
++++ b/scripts/tags.sh
+@@ -91,7 +91,7 @@ all_compiled_sources()
+       {
+               echo include/generated/autoconf.h
+               find $ignore -name "*.cmd" -exec \
+-                      grep -Poh '(?(?=^source_.* \K).*|(?=^  \K\S).*(?= \\))' 
{} \+ |
++                      sed -n -E 's/^source_.* (.*)/\1/p; s/^  (\S.*) \\/\1/p' 
{} \+ |
+               awk '!a[$0]++'
+       } | xargs realpath -esq $([ -z "$KBUILD_ABS_SRCTREE" ] && echo 
--relative-to=.) |
+       sort -u
+diff --git a/sound/pci/hda/hda_cs_dsp_ctl.c b/sound/pci/hda/hda_cs_dsp_ctl.c
+index 5433f6227ac9f..463ca06036bfe 100644
+--- a/sound/pci/hda/hda_cs_dsp_ctl.c
++++ b/sound/pci/hda/hda_cs_dsp_ctl.c
+@@ -218,10 +218,10 @@ int hda_cs_dsp_write_ctl(struct cs_dsp *dsp, const char 
*name, int type,
+       cs_ctl = cs_dsp_get_ctl(dsp, name, type, alg);
+       ret = cs_dsp_coeff_write_ctrl(cs_ctl, 0, buf, len);
+       mutex_unlock(&dsp->pwr_lock);
+-      if (ret)
++      if (ret < 0)
+               return ret;
+ 
+-      if (cs_ctl->flags & WMFW_CTL_FLAG_SYS)
++      if (ret == 0 || (cs_ctl->flags & WMFW_CTL_FLAG_SYS))
+               return 0;
+ 
+       ctl = cs_ctl->priv;

Reply via email to