commit:     a4feff9bb7628253139bf880dfd4c8c4a5cf92cb
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Mar  8 18:28:38 2022 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Mar  8 18:28:38 2022 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=a4feff9b

Linux patch 4.14.270

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

 0000_README               |    4 +
 1269_linux-4.14.270.patch | 1065 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1069 insertions(+)

diff --git a/0000_README b/0000_README
index a89f7164..643221d2 100644
--- a/0000_README
+++ b/0000_README
@@ -1123,6 +1123,10 @@ Patch:  1268_linux-4.14.269.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.14.269
 
+Patch:  1269_linux-4.14.270.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.14.270
+
 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/1269_linux-4.14.270.patch b/1269_linux-4.14.270.patch
new file mode 100644
index 00000000..beeca58b
--- /dev/null
+++ b/1269_linux-4.14.270.patch
@@ -0,0 +1,1065 @@
+diff --git a/Makefile b/Makefile
+index 560ecede8070b..6b4a4650a507f 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 14
+-SUBLEVEL = 269
++SUBLEVEL = 270
+ EXTRAVERSION =
+ NAME = Petit Gorille
+ 
+diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
+index 4c417f3cbfd52..8073e7823c252 100644
+--- a/arch/arm/mm/mmu.c
++++ b/arch/arm/mm/mmu.c
+@@ -230,12 +230,14 @@ early_param("ecc", early_ecc);
+ static int __init early_cachepolicy(char *p)
+ {
+       pr_warn("cachepolicy kernel parameter not supported without cp15\n");
++      return 0;
+ }
+ early_param("cachepolicy", early_cachepolicy);
+ 
+ static int __init noalign_setup(char *__unused)
+ {
+       pr_warn("noalign kernel parameter not supported without cp15\n");
++      return 1;
+ }
+ __setup("noalign", noalign_setup);
+ 
+diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c
+index 821fc1f2324c8..44cc02afaa8bd 100644
+--- a/drivers/ata/pata_hpt37x.c
++++ b/drivers/ata/pata_hpt37x.c
+@@ -964,14 +964,14 @@ static int hpt37x_init_one(struct pci_dev *dev, const 
struct pci_device_id *id)
+ 
+       if ((freq >> 12) != 0xABCDE) {
+               int i;
+-              u8 sr;
++              u16 sr;
+               u32 total = 0;
+ 
+               pr_warn("BIOS has not set timing clocks\n");
+ 
+               /* This is the process the HPT371 BIOS is reported to use */
+               for (i = 0; i < 128; i++) {
+-                      pci_read_config_byte(dev, 0x78, &sr);
++                      pci_read_config_word(dev, 0x78, &sr);
+                       total += sr & 0x1FF;
+                       udelay(15);
+               }
+diff --git a/drivers/dma/sh/shdma-base.c b/drivers/dma/sh/shdma-base.c
+index 12fa48e380cf5..4f8dfe77da3c5 100644
+--- a/drivers/dma/sh/shdma-base.c
++++ b/drivers/dma/sh/shdma-base.c
+@@ -118,8 +118,10 @@ static dma_cookie_t shdma_tx_submit(struct 
dma_async_tx_descriptor *tx)
+               ret = pm_runtime_get(schan->dev);
+ 
+               spin_unlock_irq(&schan->chan_lock);
+-              if (ret < 0)
++              if (ret < 0) {
+                       dev_err(schan->dev, "%s(): GET = %d\n", __func__, ret);
++                      pm_runtime_put(schan->dev);
++              }
+ 
+               pm_runtime_barrier(schan->dev);
+ 
+diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
+index fceaafd67ec61..e619ced030d52 100644
+--- a/drivers/firmware/efi/vars.c
++++ b/drivers/firmware/efi/vars.c
+@@ -763,6 +763,7 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t 
vendor, u32 attributes,
+ {
+       const struct efivar_operations *ops;
+       efi_status_t status;
++      unsigned long varsize;
+ 
+       if (!__efivars)
+               return -EINVAL;
+@@ -785,15 +786,17 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t 
vendor, u32 attributes,
+               return efivar_entry_set_nonblocking(name, vendor, attributes,
+                                                   size, data);
+ 
++      varsize = size + ucs2_strsize(name, 1024);
+       if (!block) {
+               if (down_trylock(&efivars_lock))
+                       return -EBUSY;
++              status = check_var_size_nonblocking(attributes, varsize);
+       } else {
+               if (down_interruptible(&efivars_lock))
+                       return -EINTR;
++              status = check_var_size(attributes, varsize);
+       }
+ 
+-      status = check_var_size(attributes, size + ucs2_strsize(name, 1024));
+       if (status != EFI_SUCCESS) {
+               up(&efivars_lock);
+               return -ENOSPC;
+diff --git a/drivers/firmware/qemu_fw_cfg.c b/drivers/firmware/qemu_fw_cfg.c
+index 586dedadb2f00..047d3fd084743 100644
+--- a/drivers/firmware/qemu_fw_cfg.c
++++ b/drivers/firmware/qemu_fw_cfg.c
+@@ -462,12 +462,12 @@ static int fw_cfg_register_file(const struct fw_cfg_file 
*f)
+       err = kobject_init_and_add(&entry->kobj, &fw_cfg_sysfs_entry_ktype,
+                                  fw_cfg_sel_ko, "%d", entry->f.select);
+       if (err)
+-              goto err_register;
++              goto err_put_entry;
+ 
+       /* add raw binary content access */
+       err = sysfs_create_bin_file(&entry->kobj, &fw_cfg_sysfs_attr_raw);
+       if (err)
+-              goto err_add_raw;
++              goto err_del_entry;
+ 
+       /* try adding "/sys/firmware/qemu_fw_cfg/by_name/" symlink */
+       fw_cfg_build_symlink(fw_cfg_fname_kset, &entry->kobj, entry->f.name);
+@@ -476,10 +476,10 @@ static int fw_cfg_register_file(const struct fw_cfg_file 
*f)
+       fw_cfg_sysfs_cache_enlist(entry);
+       return 0;
+ 
+-err_add_raw:
++err_del_entry:
+       kobject_del(&entry->kobj);
+-err_register:
+-      kfree(entry);
++err_put_entry:
++      kobject_put(&entry->kobj);
+       return err;
+ }
+ 
+diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c
+index a0bcbb633b670..5d0e150c21ff8 100644
+--- a/drivers/hid/hid-debug.c
++++ b/drivers/hid/hid-debug.c
+@@ -835,7 +835,9 @@ static const char *keys[KEY_MAX + 1] = {
+       [KEY_F22] = "F22",                      [KEY_F23] = "F23",
+       [KEY_F24] = "F24",                      [KEY_PLAYCD] = "PlayCD",
+       [KEY_PAUSECD] = "PauseCD",              [KEY_PROG3] = "Prog3",
+-      [KEY_PROG4] = "Prog4",                  [KEY_SUSPEND] = "Suspend",
++      [KEY_PROG4] = "Prog4",
++      [KEY_ALL_APPLICATIONS] = "AllApplications",
++      [KEY_SUSPEND] = "Suspend",
+       [KEY_CLOSE] = "Close",                  [KEY_PLAY] = "Play",
+       [KEY_FASTFORWARD] = "FastForward",      [KEY_BASSBOOST] = "BassBoost",
+       [KEY_PRINT] = "Print",                  [KEY_HP] = "HP",
+diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
+index 96bf221ba572e..97782ceb407ec 100644
+--- a/drivers/hid/hid-input.c
++++ b/drivers/hid/hid-input.c
+@@ -1026,6 +1026,8 @@ static void hidinput_configure_usage(struct hid_input 
*hidinput, struct hid_fiel
+               case 0x28b: map_key_clear(KEY_FORWARDMAIL);     break;
+               case 0x28c: map_key_clear(KEY_SEND);            break;
+ 
++              case 0x2a2: map_key_clear(KEY_ALL_APPLICATIONS);        break;
++
+               case 0x2c7: map_key_clear(KEY_KBDINPUTASSIST_PREV);             
break;
+               case 0x2c8: map_key_clear(KEY_KBDINPUTASSIST_NEXT);             
break;
+               case 0x2c9: map_key_clear(KEY_KBDINPUTASSIST_PREVGROUP);        
        break;
+diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
+index c457f65136f83..2619f1dc095aa 100644
+--- a/drivers/i2c/busses/Kconfig
++++ b/drivers/i2c/busses/Kconfig
+@@ -459,7 +459,7 @@ config I2C_BLACKFIN_TWI_CLK_KHZ
+ 
+ config I2C_CADENCE
+       tristate "Cadence I2C Controller"
+-      depends on ARCH_ZYNQ || ARM64 || XTENSA
++      depends on ARCH_ZYNQ || ARM64 || XTENSA || COMPILE_TEST
+       help
+         Say yes here to select Cadence I2C Host Controller. This controller is
+         e.g. used by Xilinx Zynq.
+@@ -836,7 +836,7 @@ config I2C_PXA_SLAVE
+ 
+ config I2C_QUP
+       tristate "Qualcomm QUP based I2C controller"
+-      depends on ARCH_QCOM
++      depends on ARCH_QCOM || COMPILE_TEST
+       help
+         If you say yes to this option, support will be included for the
+         built-in I2C interface on the Qualcomm SoCs.
+diff --git a/drivers/i2c/busses/i2c-bcm2835.c 
b/drivers/i2c/busses/i2c-bcm2835.c
+index 4d19254f78c8a..db1ab9ccc30e7 100644
+--- a/drivers/i2c/busses/i2c-bcm2835.c
++++ b/drivers/i2c/busses/i2c-bcm2835.c
+@@ -28,6 +28,11 @@
+ #define BCM2835_I2C_FIFO      0x10
+ #define BCM2835_I2C_DIV               0x14
+ #define BCM2835_I2C_DEL               0x18
++/*
++ * 16-bit field for the number of SCL cycles to wait after rising SCL
++ * before deciding the slave is not responding. 0 disables the
++ * timeout detection.
++ */
+ #define BCM2835_I2C_CLKT      0x1c
+ 
+ #define BCM2835_I2C_C_READ    BIT(0)
+@@ -398,6 +403,12 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
+       adap->dev.of_node = pdev->dev.of_node;
+       adap->quirks = &bcm2835_i2c_quirks;
+ 
++      /*
++       * Disable the hardware clock stretching timeout. SMBUS
++       * specifies a limit for how long the device can stretch the
++       * clock, but core I2C doesn't.
++       */
++      bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_CLKT, 0);
+       bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0);
+ 
+       ret = i2c_add_adapter(adap);
+diff --git a/drivers/input/input.c b/drivers/input/input.c
+index cadb368be8eff..cb8ff919ba82b 100644
+--- a/drivers/input/input.c
++++ b/drivers/input/input.c
+@@ -2120,6 +2120,12 @@ int input_register_device(struct input_dev *dev)
+       /* KEY_RESERVED is not supposed to be transmitted to userspace. */
+       __clear_bit(KEY_RESERVED, dev->keybit);
+ 
++      /* Buttonpads should not map BTN_RIGHT and/or BTN_MIDDLE. */
++      if (test_bit(INPUT_PROP_BUTTONPAD, dev->propbit)) {
++              __clear_bit(BTN_RIGHT, dev->keybit);
++              __clear_bit(BTN_MIDDLE, dev->keybit);
++      }
++
+       /* Make sure that bitmasks not mentioned in dev->evbit are clean. */
+       input_cleanse_bitmasks(dev);
+ 
+diff --git a/drivers/input/mouse/elan_i2c_core.c 
b/drivers/input/mouse/elan_i2c_core.c
+index 73e5d485d849c..3c72812484322 100644
+--- a/drivers/input/mouse/elan_i2c_core.c
++++ b/drivers/input/mouse/elan_i2c_core.c
+@@ -137,55 +137,21 @@ static int elan_get_fwinfo(u16 ic_type, u16 
*validpage_count,
+       return 0;
+ }
+ 
+-static int elan_enable_power(struct elan_tp_data *data)
++static int elan_set_power(struct elan_tp_data *data, bool on)
+ {
+       int repeat = ETP_RETRY_COUNT;
+       int error;
+ 
+-      error = regulator_enable(data->vcc);
+-      if (error) {
+-              dev_err(&data->client->dev,
+-                      "failed to enable regulator: %d\n", error);
+-              return error;
+-      }
+-
+       do {
+-              error = data->ops->power_control(data->client, true);
++              error = data->ops->power_control(data->client, on);
+               if (error >= 0)
+                       return 0;
+ 
+               msleep(30);
+       } while (--repeat > 0);
+ 
+-      dev_err(&data->client->dev, "failed to enable power: %d\n", error);
+-      return error;
+-}
+-
+-static int elan_disable_power(struct elan_tp_data *data)
+-{
+-      int repeat = ETP_RETRY_COUNT;
+-      int error;
+-
+-      do {
+-              error = data->ops->power_control(data->client, false);
+-              if (!error) {
+-                      error = regulator_disable(data->vcc);
+-                      if (error) {
+-                              dev_err(&data->client->dev,
+-                                      "failed to disable regulator: %d\n",
+-                                      error);
+-                              /* Attempt to power the chip back up */
+-                              data->ops->power_control(data->client, true);
+-                              break;
+-                      }
+-
+-                      return 0;
+-              }
+-
+-              msleep(30);
+-      } while (--repeat > 0);
+-
+-      dev_err(&data->client->dev, "failed to disable power: %d\n", error);
++      dev_err(&data->client->dev, "failed to set power %s: %d\n",
++              on ? "on" : "off", error);
+       return error;
+ }
+ 
+@@ -1206,9 +1172,19 @@ static int __maybe_unused elan_suspend(struct device 
*dev)
+               /* Enable wake from IRQ */
+               data->irq_wake = (enable_irq_wake(client->irq) == 0);
+       } else {
+-              ret = elan_disable_power(data);
++              ret = elan_set_power(data, false);
++              if (ret)
++                      goto err;
++
++              ret = regulator_disable(data->vcc);
++              if (ret) {
++                      dev_err(dev, "error %d disabling regulator\n", ret);
++                      /* Attempt to power the chip back up */
++                      elan_set_power(data, true);
++              }
+       }
+ 
++err:
+       mutex_unlock(&data->sysfs_mutex);
+       return ret;
+ }
+@@ -1219,12 +1195,18 @@ static int __maybe_unused elan_resume(struct device 
*dev)
+       struct elan_tp_data *data = i2c_get_clientdata(client);
+       int error;
+ 
+-      if (device_may_wakeup(dev) && data->irq_wake) {
++      if (!device_may_wakeup(dev)) {
++              error = regulator_enable(data->vcc);
++              if (error) {
++                      dev_err(dev, "error %d enabling regulator\n", error);
++                      goto err;
++              }
++      } else if (data->irq_wake) {
+               disable_irq_wake(client->irq);
+               data->irq_wake = false;
+       }
+ 
+-      error = elan_enable_power(data);
++      error = elan_set_power(data, true);
+       if (error) {
+               dev_err(dev, "power up when resuming failed: %d\n", error);
+               goto err;
+diff --git a/drivers/net/arcnet/com20020-pci.c 
b/drivers/net/arcnet/com20020-pci.c
+index eb7f76753c9c0..9f44e2e458df1 100644
+--- a/drivers/net/arcnet/com20020-pci.c
++++ b/drivers/net/arcnet/com20020-pci.c
+@@ -136,6 +136,9 @@ static int com20020pci_probe(struct pci_dev *pdev,
+               return -ENOMEM;
+ 
+       ci = (struct com20020_pci_card_info *)id->driver_data;
++      if (!ci)
++              return -EINVAL;
++
+       priv->ci = ci;
+       mm = &ci->misc_map;
+ 
+diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c
+index 6b6fe0fba74ff..ab2e019c841f3 100644
+--- a/drivers/net/can/usb/gs_usb.c
++++ b/drivers/net/can/usb/gs_usb.c
+@@ -198,8 +198,8 @@ struct gs_can {
+ struct gs_usb {
+       struct gs_can *canch[GS_MAX_INTF];
+       struct usb_anchor rx_submitted;
+-      atomic_t active_channels;
+       struct usb_device *udev;
++      u8 active_channels;
+ };
+ 
+ /* 'allocate' a tx context.
+@@ -596,7 +596,7 @@ static int gs_can_open(struct net_device *netdev)
+       if (rc)
+               return rc;
+ 
+-      if (atomic_add_return(1, &parent->active_channels) == 1) {
++      if (!parent->active_channels) {
+               for (i = 0; i < GS_MAX_RX_URBS; i++) {
+                       struct urb *urb;
+                       u8 *buf;
+@@ -697,6 +697,7 @@ static int gs_can_open(struct net_device *netdev)
+ 
+       dev->can.state = CAN_STATE_ERROR_ACTIVE;
+ 
++      parent->active_channels++;
+       if (!(dev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY))
+               netif_start_queue(netdev);
+ 
+@@ -712,7 +713,8 @@ static int gs_can_close(struct net_device *netdev)
+       netif_stop_queue(netdev);
+ 
+       /* Stop polling */
+-      if (atomic_dec_and_test(&parent->active_channels))
++      parent->active_channels--;
++      if (!parent->active_channels)
+               usb_kill_anchored_urbs(&parent->rx_submitted);
+ 
+       /* Stop sending URBs */
+@@ -991,8 +993,6 @@ static int gs_usb_probe(struct usb_interface *intf,
+ 
+       init_usb_anchor(&dev->rx_submitted);
+ 
+-      atomic_set(&dev->active_channels, 0);
+-
+       usb_set_intfdata(intf, dev);
+       dev->udev = interface_to_usbdev(intf);
+ 
+diff --git a/drivers/net/ethernet/chelsio/cxgb3/t3_hw.c 
b/drivers/net/ethernet/chelsio/cxgb3/t3_hw.c
+index a89721fad633e..29220141e4e46 100644
+--- a/drivers/net/ethernet/chelsio/cxgb3/t3_hw.c
++++ b/drivers/net/ethernet/chelsio/cxgb3/t3_hw.c
+@@ -3677,6 +3677,8 @@ int t3_prep_adapter(struct adapter *adapter, const 
struct adapter_info *ai,
+           MAC_STATS_ACCUM_SECS : (MAC_STATS_ACCUM_SECS * 10);
+       adapter->params.pci.vpd_cap_addr =
+           pci_find_capability(adapter->pdev, PCI_CAP_ID_VPD);
++      if (!adapter->params.pci.vpd_cap_addr)
++              return -ENODEV;
+       ret = get_vpd_params(adapter, &adapter->params.vpd);
+       if (ret < 0)
+               return ret;
+diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 
b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+index 6d27eec85fcef..4f2ec4ee349e1 100644
+--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
++++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+@@ -2282,18 +2282,18 @@ static int __init sxgbe_cmdline_opt(char *str)
+       char *opt;
+ 
+       if (!str || !*str)
+-              return -EINVAL;
++              return 1;
+       while ((opt = strsep(&str, ",")) != NULL) {
+               if (!strncmp(opt, "eee_timer:", 10)) {
+                       if (kstrtoint(opt + 10, 0, &eee_timer))
+                               goto err;
+               }
+       }
+-      return 0;
++      return 1;
+ 
+ err:
+       pr_err("%s: ERROR broken module parameter conversion\n", __func__);
+-      return -EINVAL;
++      return 1;
+ }
+ 
+ __setup("sxgbeeth=", sxgbe_cmdline_opt);
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 
b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+index 2be2b30559041..a2b45f6ac43e7 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+@@ -4550,7 +4550,7 @@ static int __init stmmac_cmdline_opt(char *str)
+       char *opt;
+ 
+       if (!str || !*str)
+-              return -EINVAL;
++              return 1;
+       while ((opt = strsep(&str, ",")) != NULL) {
+               if (!strncmp(opt, "debug:", 6)) {
+                       if (kstrtoint(opt + 6, 0, &debug))
+@@ -4581,11 +4581,11 @@ static int __init stmmac_cmdline_opt(char *str)
+                               goto err;
+               }
+       }
+-      return 0;
++      return 1;
+ 
+ err:
+       pr_err("%s: ERROR broken module parameter conversion", __func__);
+-      return -EINVAL;
++      return 1;
+ }
+ 
+ __setup("stmmaceth=", stmmac_cmdline_opt);
+diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c
+index cbd637a3257bb..f0bd65942054e 100644
+--- a/drivers/net/hamradio/mkiss.c
++++ b/drivers/net/hamradio/mkiss.c
+@@ -41,6 +41,8 @@
+ 
+ #define AX_MTU                236
+ 
++/* some arch define END as assembly function ending, just undef it */
++#undef        END
+ /* SLIP/KISS protocol characters. */
+ #define END             0300          /* indicates end of frame       */
+ #define ESC             0333          /* indicates byte stuffing      */
+diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c
+index cdd1b193fd4fe..41bac861ca99d 100644
+--- a/drivers/net/usb/cdc_mbim.c
++++ b/drivers/net/usb/cdc_mbim.c
+@@ -660,6 +660,11 @@ static const struct usb_device_id mbim_devs[] = {
+         .driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
+       },
+ 
++      /* Telit FN990 */
++      { USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x1071, USB_CLASS_COMM, 
USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
++        .driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
++      },
++
+       /* default entry */
+       { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, 
USB_CDC_PROTO_NONE),
+         .driver_info = (unsigned long)&cdc_mbim_info_zlp,
+diff --git a/drivers/net/wireless/mac80211_hwsim.c 
b/drivers/net/wireless/mac80211_hwsim.c
+index a8ec5b2c5abb3..ee1eb14ae8fc9 100644
+--- a/drivers/net/wireless/mac80211_hwsim.c
++++ b/drivers/net/wireless/mac80211_hwsim.c
+@@ -2025,6 +2025,15 @@ static void hw_scan_work(struct work_struct *work)
+                       if (req->ie_len)
+                               skb_put_data(probe, req->ie, req->ie_len);
+ 
++                      if (!ieee80211_tx_prepare_skb(hwsim->hw,
++                                                    hwsim->hw_scan_vif,
++                                                    probe,
++                                                    hwsim->tmp_chan->band,
++                                                    NULL)) {
++                              kfree_skb(probe);
++                              continue;
++                      }
++
+                       local_bh_disable();
+                       mac80211_hwsim_tx_frame(hwsim->hw, probe,
+                                               hwsim->tmp_chan);
+@@ -2983,6 +2992,10 @@ static int hwsim_tx_info_frame_received_nl(struct 
sk_buff *skb_2,
+               }
+               txi->flags |= IEEE80211_TX_STAT_ACK;
+       }
++
++      if (hwsim_flags & HWSIM_TX_CTL_NO_ACK)
++              txi->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
++
+       ieee80211_tx_status_irqsafe(data2->hw, skb);
+       return 0;
+ out:
+diff --git a/drivers/soc/fsl/qe/qe_io.c b/drivers/soc/fsl/qe/qe_io.c
+index 7ae59abc78637..127a4a836e675 100644
+--- a/drivers/soc/fsl/qe/qe_io.c
++++ b/drivers/soc/fsl/qe/qe_io.c
+@@ -41,6 +41,8 @@ int par_io_init(struct device_node *np)
+       if (ret)
+               return ret;
+       par_io = ioremap(res.start, resource_size(&res));
++      if (!par_io)
++              return -ENOMEM;
+ 
+       num_ports = of_get_property(np, "num-ports", NULL);
+       if (num_ports)
+diff --git a/drivers/usb/gadget/legacy/inode.c 
b/drivers/usb/gadget/legacy/inode.c
+index c67d53beed85e..53d17e1bb65a8 100644
+--- a/drivers/usb/gadget/legacy/inode.c
++++ b/drivers/usb/gadget/legacy/inode.c
+@@ -1833,8 +1833,9 @@ dev_config (struct file *fd, const char __user *buf, 
size_t len, loff_t *ptr)
+       spin_lock_irq (&dev->lock);
+       value = -EINVAL;
+       if (dev->buf) {
++              spin_unlock_irq(&dev->lock);
+               kfree(kbuf);
+-              goto fail;
++              return value;
+       }
+       dev->buf = kbuf;
+ 
+@@ -1881,8 +1882,8 @@ dev_config (struct file *fd, const char __user *buf, 
size_t len, loff_t *ptr)
+ 
+       value = usb_gadget_probe_driver(&gadgetfs_driver);
+       if (value != 0) {
+-              kfree (dev->buf);
+-              dev->buf = NULL;
++              spin_lock_irq(&dev->lock);
++              goto fail;
+       } else {
+               /* at this point "good" hardware has for the first time
+                * let the USB the host see us.  alternatively, if users
+@@ -1899,6 +1900,9 @@ dev_config (struct file *fd, const char __user *buf, 
size_t len, loff_t *ptr)
+       return value;
+ 
+ fail:
++      dev->config = NULL;
++      dev->hs_config = NULL;
++      dev->dev = NULL;
+       spin_unlock_irq (&dev->lock);
+       pr_debug ("%s: %s fail %zd, %p\n", shortname, __func__, value, dev);
+       kfree (dev->buf);
+diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
+index 74f405a05efc3..dba0d12c3db19 100644
+--- a/fs/cifs/cifsfs.c
++++ b/fs/cifs/cifsfs.c
+@@ -753,6 +753,7 @@ cifs_do_mount(struct file_system_type *fs_type,
+ 
+ out_super:
+       deactivate_locked_super(sb);
++      return root;
+ out:
+       cifs_cleanup_volume_info(volume_info);
+       return root;
+diff --git a/include/net/netfilter/nf_queue.h 
b/include/net/netfilter/nf_queue.h
+index 814058d0f1672..f38cc6092c5a5 100644
+--- a/include/net/netfilter/nf_queue.h
++++ b/include/net/netfilter/nf_queue.h
+@@ -32,7 +32,7 @@ void nf_register_queue_handler(struct net *net, const struct 
nf_queue_handler *q
+ void nf_unregister_queue_handler(struct net *net);
+ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict);
+ 
+-void nf_queue_entry_get_refs(struct nf_queue_entry *entry);
++bool nf_queue_entry_get_refs(struct nf_queue_entry *entry);
+ void nf_queue_entry_release_refs(struct nf_queue_entry *entry);
+ 
+ static inline void init_hashrandom(u32 *jhash_initval)
+diff --git a/include/uapi/linux/input-event-codes.h 
b/include/uapi/linux/input-event-codes.h
+index bce76e55a3c82..7711447c02b4f 100644
+--- a/include/uapi/linux/input-event-codes.h
++++ b/include/uapi/linux/input-event-codes.h
+@@ -278,7 +278,8 @@
+ #define KEY_PAUSECD           201
+ #define KEY_PROG3             202
+ #define KEY_PROG4             203
+-#define KEY_DASHBOARD         204     /* AL Dashboard */
++#define KEY_ALL_APPLICATIONS  204     /* AC Desktop Show All Applications */
++#define KEY_DASHBOARD         KEY_ALL_APPLICATIONS
+ #define KEY_SUSPEND           205
+ #define KEY_CLOSE             206     /* AC Close */
+ #define KEY_PLAY              207
+diff --git a/include/uapi/linux/xfrm.h b/include/uapi/linux/xfrm.h
+index 0b636432cdf3b..748e22a92a815 100644
+--- a/include/uapi/linux/xfrm.h
++++ b/include/uapi/linux/xfrm.h
+@@ -501,6 +501,12 @@ struct xfrm_user_offload {
+       int                             ifindex;
+       __u8                            flags;
+ };
++/* This flag was exposed without any kernel code that supporting it.
++ * Unfortunately, strongswan has the code that uses sets this flag,
++ * which makes impossible to reuse this bit.
++ *
++ * So leave it here to make sure that it won't be reused by mistake.
++ */
+ #define XFRM_OFFLOAD_IPV6     1
+ #define XFRM_OFFLOAD_INBOUND  2
+ 
+diff --git a/mm/shmem.c b/mm/shmem.c
+index 5a7b182f78456..e639188f9da43 100644
+--- a/mm/shmem.c
++++ b/mm/shmem.c
+@@ -2689,7 +2689,8 @@ static void shmem_tag_pins(struct address_space *mapping)
+                               slot = radix_tree_iter_retry(&iter);
+                               continue;
+                       }
+-              } else if (page_count(page) - page_mapcount(page) > 1) {
++              } else if (!PageTail(page) && page_count(page) !=
++                         hpage_nr_pages(page) + total_mapcount(page)) {
+                       radix_tree_tag_set(&mapping->page_tree, iter.index,
+                                          SHMEM_TAG_PINNED);
+               }
+@@ -2749,8 +2750,8 @@ static int shmem_wait_for_pins(struct address_space 
*mapping)
+                               page = NULL;
+                       }
+ 
+-                      if (page &&
+-                          page_count(page) - page_mapcount(page) != 1) {
++                      if (page && page_count(page) !=
++                          hpage_nr_pages(page) + total_mapcount(page)) {
+                               if (scan < LAST_SCAN)
+                                       goto continue_resched;
+ 
+diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
+index 7bdc5f26442ef..5fe2e63370ad7 100644
+--- a/net/batman-adv/hard-interface.c
++++ b/net/batman-adv/hard-interface.c
+@@ -155,22 +155,25 @@ static bool batadv_is_on_batman_iface(const struct 
net_device *net_dev)
+       struct net *net = dev_net(net_dev);
+       struct net_device *parent_dev;
+       struct net *parent_net;
++      int iflink;
+       bool ret;
+ 
+       /* check if this is a batman-adv mesh interface */
+       if (batadv_softif_is_valid(net_dev))
+               return true;
+ 
+-      /* no more parents..stop recursion */
+-      if (dev_get_iflink(net_dev) == 0 ||
+-          dev_get_iflink(net_dev) == net_dev->ifindex)
++      iflink = dev_get_iflink(net_dev);
++      if (iflink == 0)
+               return false;
+ 
+       parent_net = batadv_getlink_net(net_dev, net);
+ 
++      /* iflink to itself, most likely physical device */
++      if (net == parent_net && iflink == net_dev->ifindex)
++              return false;
++
+       /* recurse over the parent device */
+-      parent_dev = __dev_get_by_index((struct net *)parent_net,
+-                                      dev_get_iflink(net_dev));
++      parent_dev = __dev_get_by_index((struct net *)parent_net, iflink);
+       /* if we got a NULL parent_dev there is something broken.. */
+       if (!parent_dev) {
+               pr_err("Cannot find parent device\n");
+@@ -220,14 +223,15 @@ static struct net_device 
*batadv_get_real_netdevice(struct net_device *netdev)
+       struct net_device *real_netdev = NULL;
+       struct net *real_net;
+       struct net *net;
+-      int ifindex;
++      int iflink;
+ 
+       ASSERT_RTNL();
+ 
+       if (!netdev)
+               return NULL;
+ 
+-      if (netdev->ifindex == dev_get_iflink(netdev)) {
++      iflink = dev_get_iflink(netdev);
++      if (iflink == 0) {
+               dev_hold(netdev);
+               return netdev;
+       }
+@@ -237,9 +241,16 @@ static struct net_device 
*batadv_get_real_netdevice(struct net_device *netdev)
+               goto out;
+ 
+       net = dev_net(hard_iface->soft_iface);
+-      ifindex = dev_get_iflink(netdev);
+       real_net = batadv_getlink_net(netdev, net);
+-      real_netdev = dev_get_by_index(real_net, ifindex);
++
++      /* iflink to itself, most likely physical device */
++      if (net == real_net && netdev->ifindex == iflink) {
++              real_netdev = netdev;
++              dev_hold(real_netdev);
++              goto out;
++      }
++
++      real_netdev = dev_get_by_index(real_net, iflink);
+ 
+ out:
+       if (hard_iface)
+diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
+index 58a1ab2f37d38..ef7029ec23ad4 100644
+--- a/net/dcb/dcbnl.c
++++ b/net/dcb/dcbnl.c
+@@ -1939,10 +1939,54 @@ int dcb_ieee_delapp(struct net_device *dev, struct 
dcb_app *del)
+ }
+ EXPORT_SYMBOL(dcb_ieee_delapp);
+ 
++static void dcbnl_flush_dev(struct net_device *dev)
++{
++      struct dcb_app_type *itr, *tmp;
++
++      spin_lock_bh(&dcb_lock);
++
++      list_for_each_entry_safe(itr, tmp, &dcb_app_list, list) {
++              if (itr->ifindex == dev->ifindex) {
++                      list_del(&itr->list);
++                      kfree(itr);
++              }
++      }
++
++      spin_unlock_bh(&dcb_lock);
++}
++
++static int dcbnl_netdevice_event(struct notifier_block *nb,
++                               unsigned long event, void *ptr)
++{
++      struct net_device *dev = netdev_notifier_info_to_dev(ptr);
++
++      switch (event) {
++      case NETDEV_UNREGISTER:
++              if (!dev->dcbnl_ops)
++                      return NOTIFY_DONE;
++
++              dcbnl_flush_dev(dev);
++
++              return NOTIFY_OK;
++      default:
++              return NOTIFY_DONE;
++      }
++}
++
++static struct notifier_block dcbnl_nb __read_mostly = {
++      .notifier_call  = dcbnl_netdevice_event,
++};
++
+ static int __init dcbnl_init(void)
+ {
++      int err;
++
+       INIT_LIST_HEAD(&dcb_app_list);
+ 
++      err = register_netdevice_notifier(&dcbnl_nb);
++      if (err)
++              return err;
++
+       rtnl_register(PF_UNSPEC, RTM_GETDCB, dcb_doit, NULL, 0);
+       rtnl_register(PF_UNSPEC, RTM_SETDCB, dcb_doit, NULL, 0);
+ 
+diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
+index f906fe2acedd3..c474e4b4c4bbf 100644
+--- a/net/ipv6/ip6_output.c
++++ b/net/ipv6/ip6_output.c
+@@ -1266,8 +1266,6 @@ static int ip6_setup_cork(struct sock *sk, struct 
inet_cork_full *cork,
+               if (np->frag_size)
+                       mtu = np->frag_size;
+       }
+-      if (mtu < IPV6_MIN_MTU)
+-              return -EINVAL;
+       cork->base.fragsize = mtu;
+       if (dst_allfrag(rt->dst.path))
+               cork->base.flags |= IPCORK_ALLFRAG;
+@@ -1316,8 +1314,6 @@ static int __ip6_append_data(struct sock *sk,
+ 
+       fragheaderlen = sizeof(struct ipv6hdr) + rt->rt6i_nfheader_len +
+                       (opt ? opt->opt_nflen : 0);
+-      maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen -
+-                   sizeof(struct frag_hdr);
+ 
+       headersize = sizeof(struct ipv6hdr) +
+                    (opt ? opt->opt_flen + opt->opt_nflen : 0) +
+@@ -1325,6 +1321,13 @@ static int __ip6_append_data(struct sock *sk,
+                     sizeof(struct frag_hdr) : 0) +
+                    rt->rt6i_nfheader_len;
+ 
++      if (mtu < fragheaderlen ||
++          ((mtu - fragheaderlen) & ~7) + fragheaderlen < sizeof(struct 
frag_hdr))
++              goto emsgsize;
++
++      maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen -
++                   sizeof(struct frag_hdr);
++
+       /* as per RFC 7112 section 5, the entire IPv6 Header Chain must fit
+        * the first fragment
+        */
+diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
+index 13cae95a34662..5a38be9145ff1 100644
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -2631,13 +2631,13 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data 
*rx)
+           ether_addr_equal(sdata->vif.addr, hdr->addr3))
+               return RX_CONTINUE;
+ 
+-      ac = ieee80211_select_queue_80211(sdata, skb, hdr);
++      ac = ieee802_1d_to_ac[skb->priority];
+       q = sdata->vif.hw_queue[ac];
+       if (ieee80211_queue_stopped(&local->hw, q)) {
+               IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_congestion);
+               return RX_DROP_MONITOR;
+       }
+-      skb_set_queue_mapping(skb, q);
++      skb_set_queue_mapping(skb, ac);
+ 
+       if (!--mesh_hdr->ttl) {
+               if (!is_multicast_ether_addr(hdr->addr1))
+diff --git a/net/netfilter/core.c b/net/netfilter/core.c
+index 52cd2901a097b..aff54f5c65e9c 100644
+--- a/net/netfilter/core.c
++++ b/net/netfilter/core.c
+@@ -276,14 +276,15 @@ int nf_register_net_hook(struct net *net, const struct 
nf_hook_ops *reg)
+       p = nf_entry_dereference(*pp);
+       new_hooks = nf_hook_entries_grow(p, reg);
+ 
+-      if (!IS_ERR(new_hooks))
++      if (!IS_ERR(new_hooks)) {
++              hooks_validate(new_hooks);
+               rcu_assign_pointer(*pp, new_hooks);
++      }
+ 
+       mutex_unlock(&nf_hook_mutex);
+       if (IS_ERR(new_hooks))
+               return PTR_ERR(new_hooks);
+ 
+-      hooks_validate(new_hooks);
+ #ifdef CONFIG_NETFILTER_INGRESS
+       if (reg->pf == NFPROTO_NETDEV && reg->hooknum == NF_NETDEV_INGRESS)
+               net_inc_ingress_queue();
+diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c
+index b06ef4c62522b..dbc45165c5332 100644
+--- a/net/netfilter/nf_queue.c
++++ b/net/netfilter/nf_queue.c
+@@ -44,6 +44,15 @@ void nf_unregister_queue_handler(struct net *net)
+ }
+ EXPORT_SYMBOL(nf_unregister_queue_handler);
+ 
++static void nf_queue_sock_put(struct sock *sk)
++{
++#ifdef CONFIG_INET
++      sock_gen_put(sk);
++#else
++      sock_put(sk);
++#endif
++}
++
+ void nf_queue_entry_release_refs(struct nf_queue_entry *entry)
+ {
+       struct nf_hook_state *state = &entry->state;
+@@ -54,7 +63,7 @@ void nf_queue_entry_release_refs(struct nf_queue_entry 
*entry)
+       if (state->out)
+               dev_put(state->out);
+       if (state->sk)
+-              sock_put(state->sk);
++              nf_queue_sock_put(state->sk);
+ #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
+       if (entry->skb->nf_bridge) {
+               struct net_device *physdev;
+@@ -71,10 +80,13 @@ void nf_queue_entry_release_refs(struct nf_queue_entry 
*entry)
+ EXPORT_SYMBOL_GPL(nf_queue_entry_release_refs);
+ 
+ /* Bump dev refs so they don't vanish while packet is out */
+-void nf_queue_entry_get_refs(struct nf_queue_entry *entry)
++bool nf_queue_entry_get_refs(struct nf_queue_entry *entry)
+ {
+       struct nf_hook_state *state = &entry->state;
+ 
++      if (state->sk && !refcount_inc_not_zero(&state->sk->sk_refcnt))
++              return false;
++
+       if (state->in)
+               dev_hold(state->in);
+       if (state->out)
+@@ -93,6 +105,7 @@ void nf_queue_entry_get_refs(struct nf_queue_entry *entry)
+                       dev_hold(physdev);
+       }
+ #endif
++      return true;
+ }
+ EXPORT_SYMBOL_GPL(nf_queue_entry_get_refs);
+ 
+@@ -150,7 +163,11 @@ static int __nf_queue(struct sk_buff *skb, const struct 
nf_hook_state *state,
+               .size   = sizeof(*entry) + afinfo->route_key_size,
+       };
+ 
+-      nf_queue_entry_get_refs(entry);
++      if (!nf_queue_entry_get_refs(entry)) {
++              kfree(entry);
++              return -ENOTCONN;
++      }
++
+       afinfo->saveroute(skb, entry);
+       status = qh->outfn(entry, queuenum);
+ 
+diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c
+index 26f563bbb58de..ba74bb2d63418 100644
+--- a/net/netfilter/nfnetlink_queue.c
++++ b/net/netfilter/nfnetlink_queue.c
+@@ -693,9 +693,15 @@ static struct nf_queue_entry *
+ nf_queue_entry_dup(struct nf_queue_entry *e)
+ {
+       struct nf_queue_entry *entry = kmemdup(e, e->size, GFP_ATOMIC);
+-      if (entry)
+-              nf_queue_entry_get_refs(entry);
+-      return entry;
++
++      if (!entry)
++              return NULL;
++
++      if (nf_queue_entry_get_refs(entry))
++              return entry;
++
++      kfree(entry);
++      return NULL;
+ }
+ 
+ #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
+diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c
+index 0de788fa43e95..7dc907a45c683 100644
+--- a/net/smc/smc_core.c
++++ b/net/smc/smc_core.c
+@@ -239,8 +239,8 @@ void smc_conn_free(struct smc_connection *conn)
+       if (!lgr)
+               return;
+       smc_cdc_tx_dismiss_slots(conn);
+-      smc_lgr_unregister_conn(conn);
+       smc_buf_unuse(conn);
++      smc_lgr_unregister_conn(conn);
+ }
+ 
+ static void smc_link_clear(struct smc_link *lnk)
+@@ -428,7 +428,8 @@ int smc_conn_create(struct smc_sock *smc, __be32 
peer_in_addr,
+                   (lgr->role == role) &&
+                   (lgr->vlan_id == vlan_id) &&
+                   ((role == SMC_CLNT) ||
+-                   (lgr->conns_num < SMC_RMBS_PER_LGR_MAX))) {
++                   (lgr->conns_num < SMC_RMBS_PER_LGR_MAX &&
++                    !bitmap_full(lgr->rtokens_used_mask, 
SMC_RMBS_PER_LGR_MAX)))) {
+                       /* link group found */
+                       local_contact = SMC_REUSE_CONTACT;
+                       conn->lgr = lgr;
+diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
+index f630fa2e31647..bbc3c876a5d82 100644
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -11257,6 +11257,9 @@ static int handle_nan_filter(struct nlattr 
*attr_filter,
+       i = 0;
+       nla_for_each_nested(attr, attr_filter, rem) {
+               filter[i].filter = nla_memdup(attr, GFP_KERNEL);
++              if (!filter[i].filter)
++                      goto err;
++
+               filter[i].len = nla_len(attr);
+               i++;
+       }
+@@ -11269,6 +11272,15 @@ static int handle_nan_filter(struct nlattr 
*attr_filter,
+       }
+ 
+       return 0;
++
++err:
++      i = 0;
++      nla_for_each_nested(attr, attr_filter, rem) {
++              kfree(filter[i].filter);
++              i++;
++      }
++      kfree(filter);
++      return -ENOMEM;
+ }
+ 
+ static int nl80211_nan_add_func(struct sk_buff *skb,
+diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c
+index c585571935275..338928ac9219f 100644
+--- a/net/xfrm/xfrm_device.c
++++ b/net/xfrm/xfrm_device.c
+@@ -69,6 +69,9 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,
+       if (x->encap || x->tfcpad || (x->props.flags & XFRM_STATE_ESN))
+               return 0;
+ 
++      if (xuo->flags & ~(XFRM_OFFLOAD_IPV6 | XFRM_OFFLOAD_INBOUND))
++              return -EINVAL;
++
+       dev = dev_get_by_index(net, xuo->ifindex);
+       if (!dev) {
+               if (!(xuo->flags & XFRM_OFFLOAD_INBOUND)) {
+@@ -98,7 +101,8 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state 
*x,
+ 
+       xso->dev = dev;
+       xso->num_exthdrs = 1;
+-      xso->flags = xuo->flags;
++      /* Don't forward bit that is not implemented */
++      xso->flags = xuo->flags & ~XFRM_OFFLOAD_IPV6;
+ 
+       err = dev->xfrmdev_ops->xdo_dev_state_add(x);
+       if (err) {
+diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c
+index 76bd264ee88dd..d6d72595fbd0d 100644
+--- a/sound/soc/soc-ops.c
++++ b/sound/soc/soc-ops.c
+@@ -328,7 +328,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
+               mask = BIT(sign_bit + 1) - 1;
+ 
+       val = ucontrol->value.integer.value[0];
+-      if (mc->platform_max && val > mc->platform_max)
++      if (mc->platform_max && ((int)val + min) > mc->platform_max)
+               return -EINVAL;
+       if (val > max - min)
+               return -EINVAL;
+@@ -341,7 +341,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
+       val = val << shift;
+       if (snd_soc_volsw_is_stereo(mc)) {
+               val2 = ucontrol->value.integer.value[1];
+-              if (mc->platform_max && val2 > mc->platform_max)
++              if (mc->platform_max && ((int)val2 + min) > mc->platform_max)
+                       return -EINVAL;
+               if (val2 > max - min)
+                       return -EINVAL;
+diff --git a/sound/x86/intel_hdmi_audio.c b/sound/x86/intel_hdmi_audio.c
+index 88fe5eb4516f4..bf894087e5fa4 100644
+--- a/sound/x86/intel_hdmi_audio.c
++++ b/sound/x86/intel_hdmi_audio.c
+@@ -1308,7 +1308,7 @@ static int had_pcm_mmap(struct snd_pcm_substream 
*substream,
+ {
+       vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+       return remap_pfn_range(vma, vma->vm_start,
+-                      substream->dma_buffer.addr >> PAGE_SHIFT,
++                      substream->runtime->dma_addr >> PAGE_SHIFT,
+                       vma->vm_end - vma->vm_start, vma->vm_page_prot);
+ }
+ 

Reply via email to