summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '4.3.4/1003_linux-4.3.4.patch')
-rw-r--r--4.3.4/1003_linux-4.3.4.patch1863
1 files changed, 0 insertions, 1863 deletions
diff --git a/4.3.4/1003_linux-4.3.4.patch b/4.3.4/1003_linux-4.3.4.patch
deleted file mode 100644
index 0e103a4..0000000
--- a/4.3.4/1003_linux-4.3.4.patch
+++ /dev/null
@@ -1,1863 +0,0 @@
-diff --git a/Makefile b/Makefile
-index 2070d16..69430ed 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 4
- PATCHLEVEL = 3
--SUBLEVEL = 3
-+SUBLEVEL = 4
- EXTRAVERSION =
- NAME = Blurry Fish Butt
-
-diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
-index 739a4a6..2f6e3c6 100644
---- a/drivers/acpi/osl.c
-+++ b/drivers/acpi/osl.c
-@@ -81,6 +81,7 @@ static struct workqueue_struct *kacpid_wq;
- static struct workqueue_struct *kacpi_notify_wq;
- static struct workqueue_struct *kacpi_hotplug_wq;
- static bool acpi_os_initialized;
-+unsigned int acpi_sci_irq = INVALID_ACPI_IRQ;
-
- /*
- * This list of permanent mappings is for memory that may be accessed from
-@@ -856,17 +857,19 @@ acpi_os_install_interrupt_handler(u32 gsi, acpi_osd_handler handler,
- acpi_irq_handler = NULL;
- return AE_NOT_ACQUIRED;
- }
-+ acpi_sci_irq = irq;
-
- return AE_OK;
- }
-
--acpi_status acpi_os_remove_interrupt_handler(u32 irq, acpi_osd_handler handler)
-+acpi_status acpi_os_remove_interrupt_handler(u32 gsi, acpi_osd_handler handler)
- {
-- if (irq != acpi_gbl_FADT.sci_interrupt)
-+ if (gsi != acpi_gbl_FADT.sci_interrupt || !acpi_sci_irq_valid())
- return AE_BAD_PARAMETER;
-
-- free_irq(irq, acpi_irq);
-+ free_irq(acpi_sci_irq, acpi_irq);
- acpi_irq_handler = NULL;
-+ acpi_sci_irq = INVALID_ACPI_IRQ;
-
- return AE_OK;
- }
-@@ -1180,8 +1183,8 @@ void acpi_os_wait_events_complete(void)
- * Make sure the GPE handler or the fixed event handler is not used
- * on another CPU after removal.
- */
-- if (acpi_irq_handler)
-- synchronize_hardirq(acpi_gbl_FADT.sci_interrupt);
-+ if (acpi_sci_irq_valid())
-+ synchronize_hardirq(acpi_sci_irq);
- flush_workqueue(kacpid_wq);
- flush_workqueue(kacpi_notify_wq);
- }
-diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
-index 2f0d4db..3fe1fbe 100644
---- a/drivers/acpi/sleep.c
-+++ b/drivers/acpi/sleep.c
-@@ -632,14 +632,16 @@ static int acpi_freeze_prepare(void)
- acpi_enable_wakeup_devices(ACPI_STATE_S0);
- acpi_enable_all_wakeup_gpes();
- acpi_os_wait_events_complete();
-- enable_irq_wake(acpi_gbl_FADT.sci_interrupt);
-+ if (acpi_sci_irq_valid())
-+ enable_irq_wake(acpi_sci_irq);
- return 0;
- }
-
- static void acpi_freeze_restore(void)
- {
- acpi_disable_wakeup_devices(ACPI_STATE_S0);
-- disable_irq_wake(acpi_gbl_FADT.sci_interrupt);
-+ if (acpi_sci_irq_valid())
-+ disable_irq_wake(acpi_sci_irq);
- acpi_enable_all_runtime_gpes();
- }
-
-diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
-index f8319a0..39be5ac 100644
---- a/drivers/char/tpm/tpm.h
-+++ b/drivers/char/tpm/tpm.h
-@@ -115,6 +115,13 @@ enum tpm2_startup_types {
- TPM2_SU_STATE = 0x0001,
- };
-
-+enum tpm2_start_method {
-+ TPM2_START_ACPI = 2,
-+ TPM2_START_FIFO = 6,
-+ TPM2_START_CRB = 7,
-+ TPM2_START_CRB_WITH_ACPI = 8,
-+};
-+
- struct tpm_chip;
-
- struct tpm_vendor_specific {
-diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
-index 1267322..2b971b3 100644
---- a/drivers/char/tpm/tpm_crb.c
-+++ b/drivers/char/tpm/tpm_crb.c
-@@ -34,12 +34,6 @@ enum crb_defaults {
- CRB_ACPI_START_INDEX = 1,
- };
-
--enum crb_start_method {
-- CRB_SM_ACPI_START = 2,
-- CRB_SM_CRB = 7,
-- CRB_SM_CRB_WITH_ACPI_START = 8,
--};
--
- struct acpi_tpm2 {
- struct acpi_table_header hdr;
- u16 platform_class;
-@@ -220,12 +214,6 @@ static int crb_acpi_add(struct acpi_device *device)
- u64 pa;
- int rc;
-
-- chip = tpmm_chip_alloc(dev, &tpm_crb);
-- if (IS_ERR(chip))
-- return PTR_ERR(chip);
--
-- chip->flags = TPM_CHIP_FLAG_TPM2;
--
- status = acpi_get_table(ACPI_SIG_TPM2, 1,
- (struct acpi_table_header **) &buf);
- if (ACPI_FAILURE(status)) {
-@@ -233,13 +221,15 @@ static int crb_acpi_add(struct acpi_device *device)
- return -ENODEV;
- }
-
-- /* At least some versions of AMI BIOS have a bug that TPM2 table has
-- * zero address for the control area and therefore we must fail.
-- */
-- if (!buf->control_area_pa) {
-- dev_err(dev, "TPM2 ACPI table has a zero address for the control area\n");
-- return -EINVAL;
-- }
-+ /* Should the FIFO driver handle this? */
-+ if (buf->start_method == TPM2_START_FIFO)
-+ return -ENODEV;
-+
-+ chip = tpmm_chip_alloc(dev, &tpm_crb);
-+ if (IS_ERR(chip))
-+ return PTR_ERR(chip);
-+
-+ chip->flags = TPM_CHIP_FLAG_TPM2;
-
- if (buf->hdr.length < sizeof(struct acpi_tpm2)) {
- dev_err(dev, "TPM2 ACPI table has wrong size");
-@@ -259,11 +249,11 @@ static int crb_acpi_add(struct acpi_device *device)
- * report only ACPI start but in practice seems to require both
- * ACPI start and CRB start.
- */
-- if (sm == CRB_SM_CRB || sm == CRB_SM_CRB_WITH_ACPI_START ||
-+ if (sm == TPM2_START_CRB || sm == TPM2_START_FIFO ||
- !strcmp(acpi_device_hid(device), "MSFT0101"))
- priv->flags |= CRB_FL_CRB_START;
-
-- if (sm == CRB_SM_ACPI_START || sm == CRB_SM_CRB_WITH_ACPI_START)
-+ if (sm == TPM2_START_ACPI || sm == TPM2_START_CRB_WITH_ACPI)
- priv->flags |= CRB_FL_ACPI_START;
-
- priv->cca = (struct crb_control_area __iomem *)
-diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
-index f2dffa7..696ef1d 100644
---- a/drivers/char/tpm/tpm_tis.c
-+++ b/drivers/char/tpm/tpm_tis.c
-@@ -1,6 +1,6 @@
- /*
- * Copyright (C) 2005, 2006 IBM Corporation
-- * Copyright (C) 2014 Intel Corporation
-+ * Copyright (C) 2014, 2015 Intel Corporation
- *
- * Authors:
- * Leendert van Doorn <leendert@watson.ibm.com>
-@@ -28,6 +28,7 @@
- #include <linux/wait.h>
- #include <linux/acpi.h>
- #include <linux/freezer.h>
-+#include <acpi/actbl2.h>
- #include "tpm.h"
-
- enum tis_access {
-@@ -65,6 +66,17 @@ enum tis_defaults {
- TIS_LONG_TIMEOUT = 2000, /* 2 sec */
- };
-
-+struct tpm_info {
-+ unsigned long start;
-+ unsigned long len;
-+ unsigned int irq;
-+};
-+
-+static struct tpm_info tis_default_info = {
-+ .start = TIS_MEM_BASE,
-+ .len = TIS_MEM_LEN,
-+ .irq = 0,
-+};
-
- /* Some timeout values are needed before it is known whether the chip is
- * TPM 1.0 or TPM 2.0.
-@@ -91,26 +103,54 @@ struct priv_data {
- };
-
- #if defined(CONFIG_PNP) && defined(CONFIG_ACPI)
--static int is_itpm(struct pnp_dev *dev)
-+static int has_hid(struct acpi_device *dev, const char *hid)
- {
-- struct acpi_device *acpi = pnp_acpi_device(dev);
- struct acpi_hardware_id *id;
-
-- if (!acpi)
-- return 0;
--
-- list_for_each_entry(id, &acpi->pnp.ids, list) {
-- if (!strcmp("INTC0102", id->id))
-+ list_for_each_entry(id, &dev->pnp.ids, list)
-+ if (!strcmp(hid, id->id))
- return 1;
-- }
-
- return 0;
- }
-+
-+static inline int is_itpm(struct acpi_device *dev)
-+{
-+ return has_hid(dev, "INTC0102");
-+}
-+
-+static inline int is_fifo(struct acpi_device *dev)
-+{
-+ struct acpi_table_tpm2 *tbl;
-+ acpi_status st;
-+
-+ /* TPM 1.2 FIFO */
-+ if (!has_hid(dev, "MSFT0101"))
-+ return 1;
-+
-+ st = acpi_get_table(ACPI_SIG_TPM2, 1,
-+ (struct acpi_table_header **) &tbl);
-+ if (ACPI_FAILURE(st)) {
-+ dev_err(&dev->dev, "failed to get TPM2 ACPI table\n");
-+ return 0;
-+ }
-+
-+ if (le32_to_cpu(tbl->start_method) != TPM2_START_FIFO)
-+ return 0;
-+
-+ /* TPM 2.0 FIFO */
-+ return 1;
-+}
- #else
--static inline int is_itpm(struct pnp_dev *dev)
-+static inline int is_itpm(struct acpi_device *dev)
- {
- return 0;
- }
-+
-+static inline int is_fifo(struct acpi_device *dev)
-+{
-+ return 1;
-+}
- #endif
-
- /* Before we attempt to access the TPM we must see that the valid bit is set.
-@@ -600,9 +640,8 @@ static void tpm_tis_remove(struct tpm_chip *chip)
- release_locality(chip, chip->vendor.locality, 1);
- }
-
--static int tpm_tis_init(struct device *dev, acpi_handle acpi_dev_handle,
-- resource_size_t start, resource_size_t len,
-- unsigned int irq)
-+static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info,
-+ acpi_handle acpi_dev_handle)
- {
- u32 vendor, intfcaps, intmask;
- int rc, i, irq_s, irq_e, probe;
-@@ -622,7 +661,7 @@ static int tpm_tis_init(struct device *dev, acpi_handle acpi_dev_handle,
- chip->acpi_dev_handle = acpi_dev_handle;
- #endif
-
-- chip->vendor.iobase = devm_ioremap(dev, start, len);
-+ chip->vendor.iobase = devm_ioremap(dev, tpm_info->start, tpm_info->len);
- if (!chip->vendor.iobase)
- return -EIO;
-
-@@ -707,7 +746,7 @@ static int tpm_tis_init(struct device *dev, acpi_handle acpi_dev_handle,
- chip->vendor.iobase +
- TPM_INT_ENABLE(chip->vendor.locality));
- if (interrupts)
-- chip->vendor.irq = irq;
-+ chip->vendor.irq = tpm_info->irq;
- if (interrupts && !chip->vendor.irq) {
- irq_s =
- ioread8(chip->vendor.iobase +
-@@ -890,27 +929,27 @@ static SIMPLE_DEV_PM_OPS(tpm_tis_pm, tpm_pm_suspend, tpm_tis_resume);
- static int tpm_tis_pnp_init(struct pnp_dev *pnp_dev,
- const struct pnp_device_id *pnp_id)
- {
-- resource_size_t start, len;
-- unsigned int irq = 0;
-+ struct tpm_info tpm_info = tis_default_info;
- acpi_handle acpi_dev_handle = NULL;
-
-- start = pnp_mem_start(pnp_dev, 0);
-- len = pnp_mem_len(pnp_dev, 0);
-+ tpm_info.start = pnp_mem_start(pnp_dev, 0);
-+ tpm_info.len = pnp_mem_len(pnp_dev, 0);
-
- if (pnp_irq_valid(pnp_dev, 0))
-- irq = pnp_irq(pnp_dev, 0);
-+ tpm_info.irq = pnp_irq(pnp_dev, 0);
- else
- interrupts = false;
-
-- if (is_itpm(pnp_dev))
-- itpm = true;
--
- #ifdef CONFIG_ACPI
-- if (pnp_acpi_device(pnp_dev))
-+ if (pnp_acpi_device(pnp_dev)) {
-+ if (is_itpm(pnp_acpi_device(pnp_dev)))
-+ itpm = true;
-+
- acpi_dev_handle = pnp_acpi_device(pnp_dev)->handle;
-+ }
- #endif
-
-- return tpm_tis_init(&pnp_dev->dev, acpi_dev_handle, start, len, irq);
-+ return tpm_tis_init(&pnp_dev->dev, &tpm_info, acpi_dev_handle);
- }
-
- static struct pnp_device_id tpm_pnp_tbl[] = {
-@@ -930,6 +969,7 @@ MODULE_DEVICE_TABLE(pnp, tpm_pnp_tbl);
- static void tpm_tis_pnp_remove(struct pnp_dev *dev)
- {
- struct tpm_chip *chip = pnp_get_drvdata(dev);
-+
- tpm_chip_unregister(chip);
- tpm_tis_remove(chip);
- }
-@@ -950,6 +990,79 @@ module_param_string(hid, tpm_pnp_tbl[TIS_HID_USR_IDX].id,
- MODULE_PARM_DESC(hid, "Set additional specific HID for this driver to probe");
- #endif
-
-+#ifdef CONFIG_ACPI
-+static int tpm_check_resource(struct acpi_resource *ares, void *data)
-+{
-+ struct tpm_info *tpm_info = (struct tpm_info *) data;
-+ struct resource res;
-+
-+ if (acpi_dev_resource_interrupt(ares, 0, &res)) {
-+ tpm_info->irq = res.start;
-+ } else if (acpi_dev_resource_memory(ares, &res)) {
-+ tpm_info->start = res.start;
-+ tpm_info->len = resource_size(&res);
-+ }
-+
-+ return 1;
-+}
-+
-+static int tpm_tis_acpi_init(struct acpi_device *acpi_dev)
-+{
-+ struct list_head resources;
-+ struct tpm_info tpm_info = tis_default_info;
-+ int ret;
-+
-+ if (!is_fifo(acpi_dev))
-+ return -ENODEV;
-+
-+ INIT_LIST_HEAD(&resources);
-+ ret = acpi_dev_get_resources(acpi_dev, &resources, tpm_check_resource,
-+ &tpm_info);
-+ if (ret < 0)
-+ return ret;
-+
-+ acpi_dev_free_resource_list(&resources);
-+
-+ if (!tpm_info.irq)
-+ interrupts = false;
-+
-+ if (is_itpm(acpi_dev))
-+ itpm = true;
-+
-+ return tpm_tis_init(&acpi_dev->dev, &tpm_info, acpi_dev->handle);
-+}
-+
-+static int tpm_tis_acpi_remove(struct acpi_device *dev)
-+{
-+ struct tpm_chip *chip = dev_get_drvdata(&dev->dev);
-+
-+ tpm_chip_unregister(chip);
-+ tpm_tis_remove(chip);
-+
-+ return 0;
-+}
-+
-+static struct acpi_device_id tpm_acpi_tbl[] = {
-+ {"MSFT0101", 0}, /* TPM 2.0 */
-+ /* Add new here */
-+ {"", 0}, /* User Specified */
-+ {"", 0} /* Terminator */
-+};
-+MODULE_DEVICE_TABLE(acpi, tpm_acpi_tbl);
-+
-+static struct acpi_driver tis_acpi_driver = {
-+ .name = "tpm_tis",
-+ .ids = tpm_acpi_tbl,
-+ .ops = {
-+ .add = tpm_tis_acpi_init,
-+ .remove = tpm_tis_acpi_remove,
-+ },
-+ .drv = {
-+ .pm = &tpm_tis_pm,
-+ },
-+};
-+#endif
-+
- static struct platform_driver tis_drv = {
- .driver = {
- .name = "tpm_tis",
-@@ -966,9 +1079,25 @@ static int __init init_tis(void)
- {
- int rc;
- #ifdef CONFIG_PNP
-- if (!force)
-- return pnp_register_driver(&tis_pnp_driver);
-+ if (!force) {
-+ rc = pnp_register_driver(&tis_pnp_driver);
-+ if (rc)
-+ return rc;
-+ }
-+#endif
-+#ifdef CONFIG_ACPI
-+ if (!force) {
-+ rc = acpi_bus_register_driver(&tis_acpi_driver);
-+ if (rc) {
-+#ifdef CONFIG_PNP
-+ pnp_unregister_driver(&tis_pnp_driver);
- #endif
-+ return rc;
-+ }
-+ }
-+#endif
-+ if (!force)
-+ return 0;
-
- rc = platform_driver_register(&tis_drv);
- if (rc < 0)
-@@ -978,7 +1107,7 @@ static int __init init_tis(void)
- rc = PTR_ERR(pdev);
- goto err_dev;
- }
-- rc = tpm_tis_init(&pdev->dev, NULL, TIS_MEM_BASE, TIS_MEM_LEN, 0);
-+ rc = tpm_tis_init(&pdev->dev, &tis_default_info, NULL);
- if (rc)
- goto err_init;
- return 0;
-@@ -992,9 +1121,14 @@ err_dev:
- static void __exit cleanup_tis(void)
- {
- struct tpm_chip *chip;
--#ifdef CONFIG_PNP
-+#if defined(CONFIG_PNP) || defined(CONFIG_ACPI)
- if (!force) {
-+#ifdef CONFIG_ACPI
-+ acpi_bus_unregister_driver(&tis_acpi_driver);
-+#endif
-+#ifdef CONFIG_PNP
- pnp_unregister_driver(&tis_pnp_driver);
-+#endif
- return;
- }
- #endif
-diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
-index 2795d6d..8b5988e 100644
---- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
-+++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
-@@ -1016,13 +1016,12 @@ static int atl1c_setup_ring_resources(struct atl1c_adapter *adapter)
- sizeof(struct atl1c_recv_ret_status) * rx_desc_count +
- 8 * 4;
-
-- ring_header->desc = pci_alloc_consistent(pdev, ring_header->size,
-- &ring_header->dma);
-+ ring_header->desc = dma_zalloc_coherent(&pdev->dev, ring_header->size,
-+ &ring_header->dma, GFP_KERNEL);
- if (unlikely(!ring_header->desc)) {
-- dev_err(&pdev->dev, "pci_alloc_consistend failed\n");
-+ dev_err(&pdev->dev, "could not get memory for DMA buffer\n");
- goto err_nomem;
- }
-- memset(ring_header->desc, 0, ring_header->size);
- /* init TPD ring */
-
- tpd_ring[0].dma = roundup(ring_header->dma, 8);
-diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
-index ce38d26..bcb933e 100644
---- a/drivers/net/ethernet/freescale/gianfar.c
-+++ b/drivers/net/ethernet/freescale/gianfar.c
-@@ -894,7 +894,8 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
- FSL_GIANFAR_DEV_HAS_VLAN |
- FSL_GIANFAR_DEV_HAS_MAGIC_PACKET |
- FSL_GIANFAR_DEV_HAS_EXTENDED_HASH |
-- FSL_GIANFAR_DEV_HAS_TIMER;
-+ FSL_GIANFAR_DEV_HAS_TIMER |
-+ FSL_GIANFAR_DEV_HAS_RX_FILER;
-
- err = of_property_read_string(np, "phy-connection-type", &ctype);
-
-@@ -1393,8 +1394,9 @@ static int gfar_probe(struct platform_device *ofdev)
- priv->rx_queue[i]->rxic = DEFAULT_RXIC;
- }
-
-- /* always enable rx filer */
-- priv->rx_filer_enable = 1;
-+ /* Always enable rx filer if available */
-+ priv->rx_filer_enable =
-+ (priv->device_flags & FSL_GIANFAR_DEV_HAS_RX_FILER) ? 1 : 0;
- /* Enable most messages by default */
- priv->msg_enable = (NETIF_MSG_IFUP << 1 ) - 1;
- /* use pritority h/w tx queue scheduling for single queue devices */
-diff --git a/drivers/net/ethernet/freescale/gianfar.h b/drivers/net/ethernet/freescale/gianfar.h
-index 8c19948..3755372 100644
---- a/drivers/net/ethernet/freescale/gianfar.h
-+++ b/drivers/net/ethernet/freescale/gianfar.h
-@@ -917,6 +917,7 @@ struct gfar {
- #define FSL_GIANFAR_DEV_HAS_BD_STASHING 0x00000200
- #define FSL_GIANFAR_DEV_HAS_BUF_STASHING 0x00000400
- #define FSL_GIANFAR_DEV_HAS_TIMER 0x00000800
-+#define FSL_GIANFAR_DEV_HAS_RX_FILER 0x00002000
-
- #if (MAXGROUPS == 2)
- #define DEFAULT_MAPPING 0xAA
-diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c
-index 2f87909..60ccc29 100644
---- a/drivers/net/ethernet/qualcomm/qca_spi.c
-+++ b/drivers/net/ethernet/qualcomm/qca_spi.c
-@@ -736,9 +736,8 @@ qcaspi_netdev_tx_timeout(struct net_device *dev)
- netdev_info(qca->net_dev, "Transmit timeout at %ld, latency %ld\n",
- jiffies, jiffies - dev->trans_start);
- qca->net_dev->stats.tx_errors++;
-- /* wake the queue if there is room */
-- if (qcaspi_tx_ring_has_space(&qca->txr))
-- netif_wake_queue(dev);
-+ /* Trigger tx queue flush and QCA7000 reset */
-+ qca->sync = QCASPI_SYNC_UNKNOWN;
- }
-
- static int
-diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
-index a484d8b..f3cbf90c 100644
---- a/drivers/net/ethernet/renesas/sh_eth.c
-+++ b/drivers/net/ethernet/renesas/sh_eth.c
-@@ -1481,6 +1481,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
- if (mdp->cd->shift_rd0)
- desc_status >>= 16;
-
-+ skb = mdp->rx_skbuff[entry];
- if (desc_status & (RD_RFS1 | RD_RFS2 | RD_RFS3 | RD_RFS4 |
- RD_RFS5 | RD_RFS6 | RD_RFS10)) {
- ndev->stats.rx_errors++;
-@@ -1496,12 +1497,11 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
- ndev->stats.rx_missed_errors++;
- if (desc_status & RD_RFS10)
- ndev->stats.rx_over_errors++;
-- } else {
-+ } else if (skb) {
- if (!mdp->cd->hw_swap)
- sh_eth_soft_swap(
- phys_to_virt(ALIGN(rxdesc->addr, 4)),
- pkt_len + 2);
-- skb = mdp->rx_skbuff[entry];
- mdp->rx_skbuff[entry] = NULL;
- if (mdp->cd->rpadir)
- skb_reserve(skb, NET_IP_ALIGN);
-diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c
-index cf6312f..e13ad6c 100644
---- a/drivers/net/phy/micrel.c
-+++ b/drivers/net/phy/micrel.c
-@@ -339,9 +339,18 @@ static int ksz9021_config_init(struct phy_device *phydev)
- {
- const struct device *dev = &phydev->dev;
- const struct device_node *of_node = dev->of_node;
-+ const struct device *dev_walker;
-
-- if (!of_node && dev->parent->of_node)
-- of_node = dev->parent->of_node;
-+ /* The Micrel driver has a deprecated option to place phy OF
-+ * properties in the MAC node. Walk up the tree of devices to
-+ * find a device with an OF node.
-+ */
-+ dev_walker = &phydev->dev;
-+ do {
-+ of_node = dev_walker->of_node;
-+ dev_walker = dev_walker->parent;
-+
-+ } while (!of_node && dev_walker);
-
- if (of_node) {
- ksz9021_load_values_from_of(phydev, of_node,
-diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c
-index 5e0b432..0a37f84 100644
---- a/drivers/net/ppp/pppoe.c
-+++ b/drivers/net/ppp/pppoe.c
-@@ -568,6 +568,9 @@ static int pppoe_create(struct net *net, struct socket *sock, int kern)
- sk->sk_family = PF_PPPOX;
- sk->sk_protocol = PX_PROTO_OE;
-
-+ INIT_WORK(&pppox_sk(sk)->proto.pppoe.padt_work,
-+ pppoe_unbind_sock_work);
-+
- return 0;
- }
-
-@@ -632,8 +635,6 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr,
-
- lock_sock(sk);
-
-- INIT_WORK(&po->proto.pppoe.padt_work, pppoe_unbind_sock_work);
--
- error = -EINVAL;
- if (sp->sa_protocol != PX_PROTO_OE)
- goto end;
-@@ -663,8 +664,13 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr,
- po->pppoe_dev = NULL;
- }
-
-- memset(sk_pppox(po) + 1, 0,
-- sizeof(struct pppox_sock) - sizeof(struct sock));
-+ po->pppoe_ifindex = 0;
-+ memset(&po->pppoe_pa, 0, sizeof(po->pppoe_pa));
-+ memset(&po->pppoe_relay, 0, sizeof(po->pppoe_relay));
-+ memset(&po->chan, 0, sizeof(po->chan));
-+ po->next = NULL;
-+ po->num = 0;
-+
- sk->sk_state = PPPOX_NONE;
- }
-
-diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c
-index 686f37d..b910cae 100644
---- a/drivers/net/ppp/pptp.c
-+++ b/drivers/net/ppp/pptp.c
-@@ -418,6 +418,9 @@ static int pptp_bind(struct socket *sock, struct sockaddr *uservaddr,
- struct pptp_opt *opt = &po->proto.pptp;
- int error = 0;
-
-+ if (sockaddr_len < sizeof(struct sockaddr_pppox))
-+ return -EINVAL;
-+
- lock_sock(sk);
-
- opt->src_addr = sp->sa_addr.pptp;
-@@ -439,6 +442,9 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
- struct flowi4 fl4;
- int error = 0;
-
-+ if (sockaddr_len < sizeof(struct sockaddr_pppox))
-+ return -EINVAL;
-+
- if (sp->sa_protocol != PX_PROTO_PPTP)
- return -EINVAL;
-
-diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c
-index efc18e0..b6ea6ff 100644
---- a/drivers/net/usb/cdc_mbim.c
-+++ b/drivers/net/usb/cdc_mbim.c
-@@ -158,7 +158,7 @@ static int cdc_mbim_bind(struct usbnet *dev, struct usb_interface *intf)
- if (!cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting))
- goto err;
-
-- ret = cdc_ncm_bind_common(dev, intf, data_altsetting, 0);
-+ ret = cdc_ncm_bind_common(dev, intf, data_altsetting, dev->driver_info->data);
- if (ret)
- goto err;
-
-@@ -582,6 +582,26 @@ static const struct driver_info cdc_mbim_info_zlp = {
- .tx_fixup = cdc_mbim_tx_fixup,
- };
-
-+/* The spefication explicitly allows NDPs to be placed anywhere in the
-+ * frame, but some devices fail unless the NDP is placed after the IP
-+ * packets. Using the CDC_NCM_FLAG_NDP_TO_END flags to force this
-+ * behaviour.
-+ *
-+ * Note: The current implementation of this feature restricts each NTB
-+ * to a single NDP, implying that multiplexed sessions cannot share an
-+ * NTB. This might affect performace for multiplexed sessions.
-+ */
-+static const struct driver_info cdc_mbim_info_ndp_to_end = {
-+ .description = "CDC MBIM",
-+ .flags = FLAG_NO_SETINT | FLAG_MULTI_PACKET | FLAG_WWAN,
-+ .bind = cdc_mbim_bind,
-+ .unbind = cdc_mbim_unbind,
-+ .manage_power = cdc_mbim_manage_power,
-+ .rx_fixup = cdc_mbim_rx_fixup,
-+ .tx_fixup = cdc_mbim_tx_fixup,
-+ .data = CDC_NCM_FLAG_NDP_TO_END,
-+};
-+
- static const struct usb_device_id mbim_devs[] = {
- /* This duplicate NCM entry is intentional. MBIM devices can
- * be disguised as NCM by default, and this is necessary to
-@@ -597,6 +617,10 @@ static const struct usb_device_id mbim_devs[] = {
- { USB_VENDOR_AND_INTERFACE_INFO(0x0bdb, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
- .driver_info = (unsigned long)&cdc_mbim_info,
- },
-+ /* Huawei E3372 fails unless NDP comes after the IP packets */
-+ { USB_DEVICE_AND_INTERFACE_INFO(0x12d1, 0x157d, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
-+ .driver_info = (unsigned long)&cdc_mbim_info_ndp_to_end,
-+ },
- /* 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/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
-index db40175..fa41a6d 100644
---- a/drivers/net/usb/cdc_ncm.c
-+++ b/drivers/net/usb/cdc_ncm.c
-@@ -1006,10 +1006,18 @@ static struct usb_cdc_ncm_ndp16 *cdc_ncm_ndp(struct cdc_ncm_ctx *ctx, struct sk_
- * NTH16 header as we would normally do. NDP isn't written to the SKB yet, and
- * the wNdpIndex field in the header is actually not consistent with reality. It will be later.
- */
-- if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END)
-+ if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) {
- if (ctx->delayed_ndp16->dwSignature == sign)
- return ctx->delayed_ndp16;
-
-+ /* We can only push a single NDP to the end. Return
-+ * NULL to send what we've already got and queue this
-+ * skb for later.
-+ */
-+ else if (ctx->delayed_ndp16->dwSignature)
-+ return NULL;
-+ }
-+
- /* follow the chain of NDPs, looking for a match */
- while (ndpoffset) {
- ndp16 = (struct usb_cdc_ncm_ndp16 *)(skb->data + ndpoffset);
-diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
-index d9427ca..2e32c41 100644
---- a/drivers/net/usb/r8152.c
-+++ b/drivers/net/usb/r8152.c
-@@ -3067,17 +3067,6 @@ static int rtl8152_open(struct net_device *netdev)
-
- mutex_lock(&tp->control);
-
-- /* The WORK_ENABLE may be set when autoresume occurs */
-- if (test_bit(WORK_ENABLE, &tp->flags)) {
-- clear_bit(WORK_ENABLE, &tp->flags);
-- usb_kill_urb(tp->intr_urb);
-- cancel_delayed_work_sync(&tp->schedule);
--
-- /* disable the tx/rx, if the workqueue has enabled them. */
-- if (netif_carrier_ok(netdev))
-- tp->rtl_ops.disable(tp);
-- }
--
- tp->rtl_ops.up(tp);
-
- rtl8152_set_speed(tp, AUTONEG_ENABLE,
-@@ -3124,12 +3113,6 @@ static int rtl8152_close(struct net_device *netdev)
- } else {
- mutex_lock(&tp->control);
-
-- /* The autosuspend may have been enabled and wouldn't
-- * be disable when autoresume occurs, because the
-- * netif_running() would be false.
-- */
-- rtl_runtime_suspend_enable(tp, false);
--
- tp->rtl_ops.down(tp);
-
- mutex_unlock(&tp->control);
-@@ -3512,7 +3495,7 @@ static int rtl8152_resume(struct usb_interface *intf)
- netif_device_attach(tp->netdev);
- }
-
-- if (netif_running(tp->netdev)) {
-+ if (netif_running(tp->netdev) && tp->netdev->flags & IFF_UP) {
- if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) {
- rtl_runtime_suspend_enable(tp, false);
- clear_bit(SELECTIVE_SUSPEND, &tp->flags);
-@@ -3532,6 +3515,8 @@ static int rtl8152_resume(struct usb_interface *intf)
- }
- usb_submit_urb(tp->intr_urb, GFP_KERNEL);
- } else if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) {
-+ if (tp->netdev->flags & IFF_UP)
-+ rtl_runtime_suspend_enable(tp, false);
- clear_bit(SELECTIVE_SUSPEND, &tp->flags);
- }
-
-diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
-index c9e309c..374feba 100644
---- a/drivers/net/vrf.c
-+++ b/drivers/net/vrf.c
-@@ -581,6 +581,7 @@ static int vrf_newlink(struct net *src_net, struct net_device *dev,
- {
- struct net_vrf *vrf = netdev_priv(dev);
- struct net_vrf_dev *vrf_ptr;
-+ int err;
-
- if (!data || !data[IFLA_VRF_TABLE])
- return -EINVAL;
-@@ -589,16 +590,25 @@ static int vrf_newlink(struct net *src_net, struct net_device *dev,
-
- dev->priv_flags |= IFF_VRF_MASTER;
-
-+ err = -ENOMEM;
- vrf_ptr = kmalloc(sizeof(*dev->vrf_ptr), GFP_KERNEL);
- if (!vrf_ptr)
-- return -ENOMEM;
-+ goto out_fail;
-
- vrf_ptr->ifindex = dev->ifindex;
- vrf_ptr->tb_id = vrf->tb_id;
-
-+ err = register_netdevice(dev);
-+ if (err < 0)
-+ goto out_fail;
-+
- rcu_assign_pointer(dev->vrf_ptr, vrf_ptr);
-
-- return register_netdev(dev);
-+ return 0;
-+
-+out_fail:
-+ kfree(vrf_ptr);
-+ return err;
- }
-
- static size_t vrf_nl_getsize(const struct net_device *dev)
-diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c
-index f2372f4..d2de91c 100644
---- a/drivers/platform/x86/toshiba_acpi.c
-+++ b/drivers/platform/x86/toshiba_acpi.c
-@@ -2676,6 +2676,7 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev)
- ret = toshiba_function_keys_get(dev, &special_functions);
- dev->kbd_function_keys_supported = !ret;
-
-+ dev->hotkey_event_type = 0;
- if (toshiba_acpi_setup_keyboard(dev))
- pr_info("Unable to activate hotkeys\n");
-
-diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
-index b30e742..26ca4f9 100644
---- a/drivers/usb/class/cdc-acm.c
-+++ b/drivers/usb/class/cdc-acm.c
-@@ -1838,6 +1838,11 @@ static const struct usb_device_id acm_ids[] = {
- },
- #endif
-
-+ /* Exclude Infineon Flash Loader utility */
-+ { USB_DEVICE(0x058b, 0x0041),
-+ .driver_info = IGNORE_DEVICE,
-+ },
-+
- /* control interfaces without any protocol set */
- { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
- USB_CDC_PROTO_NONE) },
-diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
-index b9ddf0c..894894f 100644
---- a/drivers/usb/core/config.c
-+++ b/drivers/usb/core/config.c
-@@ -115,7 +115,8 @@ static void usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno,
- USB_SS_MULT(desc->bmAttributes) > 3) {
- dev_warn(ddev, "Isoc endpoint has Mult of %d in "
- "config %d interface %d altsetting %d ep %d: "
-- "setting to 3\n", desc->bmAttributes + 1,
-+ "setting to 3\n",
-+ USB_SS_MULT(desc->bmAttributes),
- cfgno, inum, asnum, ep->desc.bEndpointAddress);
- ep->ss_ep_comp.bmAttributes = 2;
- }
-diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
-index 431839b..522f766 100644
---- a/drivers/usb/core/hub.c
-+++ b/drivers/usb/core/hub.c
-@@ -124,6 +124,10 @@ struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev)
-
- int usb_device_supports_lpm(struct usb_device *udev)
- {
-+ /* Some devices have trouble with LPM */
-+ if (udev->quirks & USB_QUIRK_NO_LPM)
-+ return 0;
-+
- /* USB 2.1 (and greater) devices indicate LPM support through
- * their USB 2.0 Extended Capabilities BOS descriptor.
- */
-@@ -4503,6 +4507,8 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
- goto fail;
- }
-
-+ usb_detect_quirks(udev);
-+
- if (udev->wusb == 0 && le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0201) {
- retval = usb_get_bos_descriptor(udev);
- if (!retval) {
-@@ -4701,7 +4707,6 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
- if (status < 0)
- goto loop;
-
-- usb_detect_quirks(udev);
- if (udev->quirks & USB_QUIRK_DELAY_INIT)
- msleep(1000);
-
-@@ -5317,9 +5322,6 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
- if (udev->usb2_hw_lpm_enabled == 1)
- usb_set_usb2_hardware_lpm(udev, 0);
-
-- bos = udev->bos;
-- udev->bos = NULL;
--
- /* Disable LPM and LTM while we reset the device and reinstall the alt
- * settings. Device-initiated LPM settings, and system exit latency
- * settings are cleared when the device is reset, so we have to set
-@@ -5328,15 +5330,18 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
- ret = usb_unlocked_disable_lpm(udev);
- if (ret) {
- dev_err(&udev->dev, "%s Failed to disable LPM\n.", __func__);
-- goto re_enumerate;
-+ goto re_enumerate_no_bos;
- }
- ret = usb_disable_ltm(udev);
- if (ret) {
- dev_err(&udev->dev, "%s Failed to disable LTM\n.",
- __func__);
-- goto re_enumerate;
-+ goto re_enumerate_no_bos;
- }
-
-+ bos = udev->bos;
-+ udev->bos = NULL;
-+
- for (i = 0; i < SET_CONFIG_TRIES; ++i) {
-
- /* ep0 maxpacket size may change; let the HCD know about it.
-@@ -5433,10 +5438,11 @@ done:
- return 0;
-
- re_enumerate:
-- /* LPM state doesn't matter when we're about to destroy the device. */
-- hub_port_logical_disconnect(parent_hub, port1);
- usb_release_bos_descriptor(udev);
- udev->bos = bos;
-+re_enumerate_no_bos:
-+ /* LPM state doesn't matter when we're about to destroy the device. */
-+ hub_port_logical_disconnect(parent_hub, port1);
- return -ENODEV;
- }
-
-diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
-index f5a3819..017c1de 100644
---- a/drivers/usb/core/quirks.c
-+++ b/drivers/usb/core/quirks.c
-@@ -199,6 +199,12 @@ static const struct usb_device_id usb_quirk_list[] = {
- { USB_DEVICE(0x1a0a, 0x0200), .driver_info =
- USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
-
-+ /* Blackmagic Design Intensity Shuttle */
-+ { USB_DEVICE(0x1edb, 0xbd3b), .driver_info = USB_QUIRK_NO_LPM },
-+
-+ /* Blackmagic Design UltraStudio SDI */
-+ { USB_DEVICE(0x1edb, 0xbd4f), .driver_info = USB_QUIRK_NO_LPM },
-+
- { } /* terminating entry must be last */
- };
-
-diff --git a/drivers/usb/gadget/udc/pxa27x_udc.c b/drivers/usb/gadget/udc/pxa27x_udc.c
-index 670ac0b..001a3b7 100644
---- a/drivers/usb/gadget/udc/pxa27x_udc.c
-+++ b/drivers/usb/gadget/udc/pxa27x_udc.c
-@@ -2536,6 +2536,9 @@ static int pxa_udc_suspend(struct platform_device *_dev, pm_message_t state)
- udc->pullup_resume = udc->pullup_on;
- dplus_pullup(udc, 0);
-
-+ if (udc->driver)
-+ udc->driver->disconnect(&udc->gadget);
-+
- return 0;
- }
-
-diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
-index 342ffd1..8c6e15b 100644
---- a/drivers/usb/host/ohci-at91.c
-+++ b/drivers/usb/host/ohci-at91.c
-@@ -473,6 +473,8 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev)
- if (!pdata)
- return -ENOMEM;
-
-+ pdev->dev.platform_data = pdata;
-+
- if (!of_property_read_u32(np, "num-ports", &ports))
- pdata->ports = ports;
-
-@@ -483,6 +485,7 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev)
- */
- if (i >= pdata->ports) {
- pdata->vbus_pin[i] = -EINVAL;
-+ pdata->overcurrent_pin[i] = -EINVAL;
- continue;
- }
-
-@@ -513,10 +516,8 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev)
- }
-
- at91_for_each_port(i) {
-- if (i >= pdata->ports) {
-- pdata->overcurrent_pin[i] = -EINVAL;
-- continue;
-- }
-+ if (i >= pdata->ports)
-+ break;
-
- pdata->overcurrent_pin[i] =
- of_get_named_gpio_flags(np, "atmel,oc-gpio", i, &flags);
-@@ -552,8 +553,6 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev)
- }
- }
-
-- pdev->dev.platform_data = pdata;
--
- device_init_wakeup(&pdev->dev, 1);
- return usb_hcd_at91_probe(&ohci_at91_hc_driver, pdev);
- }
-diff --git a/drivers/usb/host/whci/qset.c b/drivers/usb/host/whci/qset.c
-index dc31c42..9f1c053 100644
---- a/drivers/usb/host/whci/qset.c
-+++ b/drivers/usb/host/whci/qset.c
-@@ -377,6 +377,10 @@ static int qset_fill_page_list(struct whc *whc, struct whc_std *std, gfp_t mem_f
- if (std->pl_virt == NULL)
- return -ENOMEM;
- std->dma_addr = dma_map_single(whc->wusbhc.dev, std->pl_virt, pl_len, DMA_TO_DEVICE);
-+ if (dma_mapping_error(whc->wusbhc.dev, std->dma_addr)) {
-+ kfree(std->pl_virt);
-+ return -EFAULT;
-+ }
-
- for (p = 0; p < std->num_pointers; p++) {
- std->pl_virt[p].buf_ptr = cpu_to_le64(dma_addr);
-diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
-index 1f2037b..45c83ba 100644
---- a/drivers/usb/musb/Kconfig
-+++ b/drivers/usb/musb/Kconfig
-@@ -159,7 +159,7 @@ config USB_TI_CPPI_DMA
-
- config USB_TI_CPPI41_DMA
- bool 'TI CPPI 4.1 (AM335x)'
-- depends on ARCH_OMAP
-+ depends on ARCH_OMAP && DMADEVICES
- select TI_CPPI41
-
- config USB_TUSB_OMAP_DMA
-diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
-index eac7cca..7d4f51a 100644
---- a/drivers/usb/serial/cp210x.c
-+++ b/drivers/usb/serial/cp210x.c
-@@ -132,7 +132,6 @@ static const struct usb_device_id id_table[] = {
- { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
- { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
- { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
-- { USB_DEVICE(0x10C4, 0xEA80) }, /* Silicon Labs factory default */
- { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */
- { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */
- { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */
-diff --git a/drivers/usb/serial/usb-serial-simple.c b/drivers/usb/serial/usb-serial-simple.c
-index 3658662..a204782 100644
---- a/drivers/usb/serial/usb-serial-simple.c
-+++ b/drivers/usb/serial/usb-serial-simple.c
-@@ -53,6 +53,7 @@ DEVICE(funsoft, FUNSOFT_IDS);
-
- /* Infineon Flashloader driver */
- #define FLASHLOADER_IDS() \
-+ { USB_DEVICE_INTERFACE_CLASS(0x058b, 0x0041, USB_CLASS_CDC_DATA) }, \
- { USB_DEVICE(0x8087, 0x0716) }
- DEVICE(flashloader, FLASHLOADER_IDS);
-
-diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
-index f689219..43b1caf 100644
---- a/drivers/usb/storage/uas.c
-+++ b/drivers/usb/storage/uas.c
-@@ -796,6 +796,10 @@ static int uas_slave_configure(struct scsi_device *sdev)
- if (devinfo->flags & US_FL_NO_REPORT_OPCODES)
- sdev->no_report_opcodes = 1;
-
-+ /* A few buggy USB-ATA bridges don't understand FUA */
-+ if (devinfo->flags & US_FL_BROKEN_FUA)
-+ sdev->broken_fua = 1;
-+
- scsi_change_queue_depth(sdev, devinfo->qdepth - 2);
- return 0;
- }
-diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
-index 6b24791..7ffe420 100644
---- a/drivers/usb/storage/unusual_devs.h
-+++ b/drivers/usb/storage/unusual_devs.h
-@@ -1987,7 +1987,7 @@ UNUSUAL_DEV( 0x14cd, 0x6600, 0x0201, 0x0201,
- US_FL_IGNORE_RESIDUE ),
-
- /* Reported by Michael Büsch <m@bues.ch> */
--UNUSUAL_DEV( 0x152d, 0x0567, 0x0114, 0x0114,
-+UNUSUAL_DEV( 0x152d, 0x0567, 0x0114, 0x0116,
- "JMicron",
- "USB to ATA/ATAPI Bridge",
- USB_SC_DEVICE, USB_PR_DEVICE, NULL,
-diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h
-index c85ea53..ccc113e 100644
---- a/drivers/usb/storage/unusual_uas.h
-+++ b/drivers/usb/storage/unusual_uas.h
-@@ -132,7 +132,7 @@ UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999,
- "JMicron",
- "JMS567",
- USB_SC_DEVICE, USB_PR_DEVICE, NULL,
-- US_FL_NO_REPORT_OPCODES),
-+ US_FL_BROKEN_FUA | US_FL_NO_REPORT_OPCODES),
-
- /* Reported-by: Hans de Goede <hdegoede@redhat.com> */
- UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999,
-diff --git a/include/linux/acpi.h b/include/linux/acpi.h
-index 43856d1..1ae6ba0 100644
---- a/include/linux/acpi.h
-+++ b/include/linux/acpi.h
-@@ -193,6 +193,12 @@ int acpi_ioapic_registered(acpi_handle handle, u32 gsi_base);
- void acpi_irq_stats_init(void);
- extern u32 acpi_irq_handled;
- extern u32 acpi_irq_not_handled;
-+extern unsigned int acpi_sci_irq;
-+#define INVALID_ACPI_IRQ ((unsigned)-1)
-+static inline bool acpi_sci_irq_valid(void)
-+{
-+ return acpi_sci_irq != INVALID_ACPI_IRQ;
-+}
-
- extern int sbf_port;
- extern unsigned long acpi_realmode_flags;
-diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h
-index 9948c87..1d0043d 100644
---- a/include/linux/usb/quirks.h
-+++ b/include/linux/usb/quirks.h
-@@ -47,4 +47,7 @@
- /* device generates spurious wakeup, ignore remote wakeup capability */
- #define USB_QUIRK_IGNORE_REMOTE_WAKEUP BIT(9)
-
-+/* device can't handle Link Power Management */
-+#define USB_QUIRK_NO_LPM BIT(10)
-+
- #endif /* __LINUX_USB_QUIRKS_H */
-diff --git a/include/net/dst.h b/include/net/dst.h
-index 9261d92..e7fa2e2 100644
---- a/include/net/dst.h
-+++ b/include/net/dst.h
-@@ -322,6 +322,39 @@ static inline void skb_dst_force(struct sk_buff *skb)
- }
- }
-
-+/**
-+ * dst_hold_safe - Take a reference on a dst if possible
-+ * @dst: pointer to dst entry
-+ *
-+ * This helper returns false if it could not safely
-+ * take a reference on a dst.
-+ */
-+static inline bool dst_hold_safe(struct dst_entry *dst)
-+{
-+ if (dst->flags & DST_NOCACHE)
-+ return atomic_inc_not_zero(&dst->__refcnt);
-+ dst_hold(dst);
-+ return true;
-+}
-+
-+/**
-+ * skb_dst_force_safe - makes sure skb dst is refcounted
-+ * @skb: buffer
-+ *
-+ * If dst is not yet refcounted and not destroyed, grab a ref on it.
-+ */
-+static inline void skb_dst_force_safe(struct sk_buff *skb)
-+{
-+ if (skb_dst_is_noref(skb)) {
-+ struct dst_entry *dst = skb_dst(skb);
-+
-+ if (!dst_hold_safe(dst))
-+ dst = NULL;
-+
-+ skb->_skb_refdst = (unsigned long)dst;
-+ }
-+}
-+
-
- /**
- * __skb_tunnel_rx - prepare skb for rx reinsert
-diff --git a/include/net/inetpeer.h b/include/net/inetpeer.h
-index 4a6009d..235c781 100644
---- a/include/net/inetpeer.h
-+++ b/include/net/inetpeer.h
-@@ -78,6 +78,7 @@ void inet_initpeers(void) __init;
- static inline void inetpeer_set_addr_v4(struct inetpeer_addr *iaddr, __be32 ip)
- {
- iaddr->a4.addr = ip;
-+ iaddr->a4.vif = 0;
- iaddr->family = AF_INET;
- }
-
-diff --git a/include/net/sock.h b/include/net/sock.h
-index e237170..bca709a 100644
---- a/include/net/sock.h
-+++ b/include/net/sock.h
-@@ -387,6 +387,7 @@ struct sock {
- sk_no_check_rx : 1,
- sk_userlocks : 4,
- sk_protocol : 8,
-+#define SK_PROTOCOL_MAX U8_MAX
- sk_type : 16;
- kmemcheck_bitfield_end(flags);
- int sk_wmem_queued;
-@@ -724,6 +725,8 @@ enum sock_flags {
- SOCK_SELECT_ERR_QUEUE, /* Wake select on error queue */
- };
-
-+#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
-+
- static inline void sock_copy_flags(struct sock *nsk, struct sock *osk)
- {
- nsk->sk_flags = osk->sk_flags;
-@@ -798,7 +801,7 @@ void sk_stream_write_space(struct sock *sk);
- static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb)
- {
- /* dont let skb dst not refcounted, we are going to leave rcu lock */
-- skb_dst_force(skb);
-+ skb_dst_force_safe(skb);
-
- if (!sk->sk_backlog.tail)
- sk->sk_backlog.head = skb;
-diff --git a/include/net/vxlan.h b/include/net/vxlan.h
-index 480a319..f4a4972 100644
---- a/include/net/vxlan.h
-+++ b/include/net/vxlan.h
-@@ -79,7 +79,7 @@ struct vxlanhdr {
- };
-
- /* VXLAN header flags. */
--#define VXLAN_HF_RCO BIT(24)
-+#define VXLAN_HF_RCO BIT(21)
- #define VXLAN_HF_VNI BIT(27)
- #define VXLAN_HF_GBP BIT(31)
-
-diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild
-index f7b2db4..7fc5733 100644
---- a/include/uapi/linux/Kbuild
-+++ b/include/uapi/linux/Kbuild
-@@ -186,6 +186,7 @@ header-y += if_tunnel.h
- header-y += if_vlan.h
- header-y += if_x25.h
- header-y += igmp.h
-+header-y += ila.h
- header-y += in6.h
- header-y += inet_diag.h
- header-y += in.h
-diff --git a/lib/rhashtable.c b/lib/rhashtable.c
-index a54ff89..aa388a7 100644
---- a/lib/rhashtable.c
-+++ b/lib/rhashtable.c
-@@ -503,10 +503,11 @@ int rhashtable_walk_init(struct rhashtable *ht, struct rhashtable_iter *iter)
- if (!iter->walker)
- return -ENOMEM;
-
-- mutex_lock(&ht->mutex);
-- iter->walker->tbl = rht_dereference(ht->tbl, ht);
-+ spin_lock(&ht->lock);
-+ iter->walker->tbl =
-+ rcu_dereference_protected(ht->tbl, lockdep_is_held(&ht->lock));
- list_add(&iter->walker->list, &iter->walker->tbl->walkers);
-- mutex_unlock(&ht->mutex);
-+ spin_unlock(&ht->lock);
-
- return 0;
- }
-@@ -520,10 +521,10 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_init);
- */
- void rhashtable_walk_exit(struct rhashtable_iter *iter)
- {
-- mutex_lock(&iter->ht->mutex);
-+ spin_lock(&iter->ht->lock);
- if (iter->walker->tbl)
- list_del(&iter->walker->list);
-- mutex_unlock(&iter->ht->mutex);
-+ spin_unlock(&iter->ht->lock);
- kfree(iter->walker);
- }
- EXPORT_SYMBOL_GPL(rhashtable_walk_exit);
-@@ -547,14 +548,12 @@ int rhashtable_walk_start(struct rhashtable_iter *iter)
- {
- struct rhashtable *ht = iter->ht;
-
-- mutex_lock(&ht->mutex);
-+ rcu_read_lock();
-
-+ spin_lock(&ht->lock);
- if (iter->walker->tbl)
- list_del(&iter->walker->list);
--
-- rcu_read_lock();
--
-- mutex_unlock(&ht->mutex);
-+ spin_unlock(&ht->lock);
-
- if (!iter->walker->tbl) {
- iter->walker->tbl = rht_dereference_rcu(ht->tbl, ht);
-@@ -723,9 +722,6 @@ int rhashtable_init(struct rhashtable *ht,
- if (params->nulls_base && params->nulls_base < (1U << RHT_BASE_SHIFT))
- return -EINVAL;
-
-- if (params->nelem_hint)
-- size = rounded_hashtable_size(params);
--
- memset(ht, 0, sizeof(*ht));
- mutex_init(&ht->mutex);
- spin_lock_init(&ht->lock);
-@@ -745,6 +741,9 @@ int rhashtable_init(struct rhashtable *ht,
-
- ht->p.min_size = max(ht->p.min_size, HASH_MIN_SIZE);
-
-+ if (params->nelem_hint)
-+ size = rounded_hashtable_size(&ht->p);
-+
- /* The maximum (not average) chain length grows with the
- * size of the hash table, at a rate of (log N)/(log log N).
- * The value of 16 is selected so that even if the hash
-diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
-index ae3a47f..fbd0acf 100644
---- a/net/ax25/af_ax25.c
-+++ b/net/ax25/af_ax25.c
-@@ -805,6 +805,9 @@ static int ax25_create(struct net *net, struct socket *sock, int protocol,
- struct sock *sk;
- ax25_cb *ax25;
-
-+ if (protocol < 0 || protocol > SK_PROTOCOL_MAX)
-+ return -EINVAL;
-+
- if (!net_eq(net, &init_net))
- return -EAFNOSUPPORT;
-
-diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
-index f315c8d..15cb6c5 100644
---- a/net/bluetooth/sco.c
-+++ b/net/bluetooth/sco.c
-@@ -519,6 +519,9 @@ static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_le
- if (!addr || addr->sa_family != AF_BLUETOOTH)
- return -EINVAL;
-
-+ if (addr_len < sizeof(struct sockaddr_sco))
-+ return -EINVAL;
-+
- lock_sock(sk);
-
- if (sk->sk_state != BT_OPEN) {
-diff --git a/net/core/skbuff.c b/net/core/skbuff.c
-index fab4599..1c1f87c 100644
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -3643,7 +3643,8 @@ static void __skb_complete_tx_timestamp(struct sk_buff *skb,
- serr->ee.ee_info = tstype;
- if (sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID) {
- serr->ee.ee_data = skb_shinfo(skb)->tskey;
-- if (sk->sk_protocol == IPPROTO_TCP)
-+ if (sk->sk_protocol == IPPROTO_TCP &&
-+ sk->sk_type == SOCK_STREAM)
- serr->ee.ee_data -= sk->sk_tskey;
- }
-
-@@ -4268,7 +4269,8 @@ static struct sk_buff *skb_reorder_vlan_header(struct sk_buff *skb)
- return NULL;
- }
-
-- memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 2 * ETH_ALEN);
-+ memmove(skb->data - ETH_HLEN, skb->data - skb->mac_len - VLAN_HLEN,
-+ 2 * ETH_ALEN);
- skb->mac_header += VLAN_HLEN;
- return skb;
- }
-diff --git a/net/core/sock.c b/net/core/sock.c
-index 3307c02..dbbda99 100644
---- a/net/core/sock.c
-+++ b/net/core/sock.c
-@@ -422,8 +422,6 @@ static void sock_warn_obsolete_bsdism(const char *name)
- }
- }
-
--#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
--
- static void sock_disable_timestamp(struct sock *sk, unsigned long flags)
- {
- if (sk->sk_flags & flags) {
-@@ -862,7 +860,8 @@ set_rcvbuf:
-
- if (val & SOF_TIMESTAMPING_OPT_ID &&
- !(sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)) {
-- if (sk->sk_protocol == IPPROTO_TCP) {
-+ if (sk->sk_protocol == IPPROTO_TCP &&
-+ sk->sk_type == SOCK_STREAM) {
- if (sk->sk_state != TCP_ESTABLISHED) {
- ret = -EINVAL;
- break;
-diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
-index 675cf94..6feddca 100644
---- a/net/decnet/af_decnet.c
-+++ b/net/decnet/af_decnet.c
-@@ -678,6 +678,9 @@ static int dn_create(struct net *net, struct socket *sock, int protocol,
- {
- struct sock *sk;
-
-+ if (protocol < 0 || protocol > SK_PROTOCOL_MAX)
-+ return -EINVAL;
-+
- if (!net_eq(net, &init_net))
- return -EAFNOSUPPORT;
-
-diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
-index 1d0c3ad..4b16cf3 100644
---- a/net/ipv4/af_inet.c
-+++ b/net/ipv4/af_inet.c
-@@ -261,6 +261,9 @@ static int inet_create(struct net *net, struct socket *sock, int protocol,
- int try_loading_module = 0;
- int err;
-
-+ if (protocol < 0 || protocol >= IPPROTO_MAX)
-+ return -EINVAL;
-+
- sock->state = SS_UNCONNECTED;
-
- /* Look for the requested type/protocol pair. */
-diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c
-index e0fcbbb..bd903fe 100644
---- a/net/ipv4/fou.c
-+++ b/net/ipv4/fou.c
-@@ -24,6 +24,7 @@ struct fou {
- u16 type;
- struct udp_offload udp_offloads;
- struct list_head list;
-+ struct rcu_head rcu;
- };
-
- #define FOU_F_REMCSUM_NOPARTIAL BIT(0)
-@@ -417,7 +418,7 @@ static void fou_release(struct fou *fou)
- list_del(&fou->list);
- udp_tunnel_sock_release(sock);
-
-- kfree(fou);
-+ kfree_rcu(fou, rcu);
- }
-
- static int fou_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
-diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
-index a7739c8..d77be28 100644
---- a/net/ipv4/tcp_ipv4.c
-+++ b/net/ipv4/tcp_ipv4.c
-@@ -1509,7 +1509,7 @@ bool tcp_prequeue(struct sock *sk, struct sk_buff *skb)
- if (likely(sk->sk_rx_dst))
- skb_dst_drop(skb);
- else
-- skb_dst_force(skb);
-+ skb_dst_force_safe(skb);
-
- __skb_queue_tail(&tp->ucopy.prequeue, skb);
- tp->ucopy.memory += skb->truesize;
-@@ -1710,8 +1710,7 @@ void inet_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)
- {
- struct dst_entry *dst = skb_dst(skb);
-
-- if (dst) {
-- dst_hold(dst);
-+ if (dst && dst_hold_safe(dst)) {
- sk->sk_rx_dst = dst;
- inet_sk(sk)->rx_dst_ifindex = skb->skb_iif;
- }
-diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
-index 3dbee0d..c958596 100644
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -3147,7 +3147,7 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn)
- {
- struct tcp_sock *tp = tcp_sk(sk);
- struct tcp_fastopen_request *fo = tp->fastopen_req;
-- int syn_loss = 0, space, err = 0, copied;
-+ int syn_loss = 0, space, err = 0;
- unsigned long last_syn_loss = 0;
- struct sk_buff *syn_data;
-
-@@ -3185,17 +3185,18 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn)
- goto fallback;
- syn_data->ip_summed = CHECKSUM_PARTIAL;
- memcpy(syn_data->cb, syn->cb, sizeof(syn->cb));
-- copied = copy_from_iter(skb_put(syn_data, space), space,
-- &fo->data->msg_iter);
-- if (unlikely(!copied)) {
-- kfree_skb(syn_data);
-- goto fallback;
-- }
-- if (copied != space) {
-- skb_trim(syn_data, copied);
-- space = copied;
-+ if (space) {
-+ int copied = copy_from_iter(skb_put(syn_data, space), space,
-+ &fo->data->msg_iter);
-+ if (unlikely(!copied)) {
-+ kfree_skb(syn_data);
-+ goto fallback;
-+ }
-+ if (copied != space) {
-+ skb_trim(syn_data, copied);
-+ space = copied;
-+ }
- }
--
- /* No more data pending in inet_wait_for_connect() */
- if (space == fo->size)
- fo->data = NULL;
-diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index 3939dd2..ddd3511 100644
---- a/net/ipv6/addrconf.c
-+++ b/net/ipv6/addrconf.c
-@@ -349,6 +349,12 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
- setup_timer(&ndev->rs_timer, addrconf_rs_timer,
- (unsigned long)ndev);
- memcpy(&ndev->cnf, dev_net(dev)->ipv6.devconf_dflt, sizeof(ndev->cnf));
-+
-+ if (ndev->cnf.stable_secret.initialized)
-+ ndev->addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY;
-+ else
-+ ndev->addr_gen_mode = IN6_ADDR_GEN_MODE_EUI64;
-+
- ndev->cnf.mtu6 = dev->mtu;
- ndev->cnf.sysctl = NULL;
- ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl);
-@@ -2453,7 +2459,7 @@ ok:
- #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
- if (in6_dev->cnf.optimistic_dad &&
- !net->ipv6.devconf_all->forwarding && sllao)
-- addr_flags = IFA_F_OPTIMISTIC;
-+ addr_flags |= IFA_F_OPTIMISTIC;
- #endif
-
- /* Do not allow to create too much of autoconfigured
-diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
-index 38d66dd..df095ee 100644
---- a/net/ipv6/af_inet6.c
-+++ b/net/ipv6/af_inet6.c
-@@ -109,6 +109,9 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol,
- int try_loading_module = 0;
- int err;
-
-+ if (protocol < 0 || protocol >= IPPROTO_MAX)
-+ return -EINVAL;
-+
- /* Look for the requested type/protocol pair. */
- lookup_protocol:
- err = -ESOCKTNOSUPPORT;
-diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
-index 3c7b931..e5ea177 100644
---- a/net/ipv6/ip6_gre.c
-+++ b/net/ipv6/ip6_gre.c
-@@ -1571,13 +1571,11 @@ static int ip6gre_changelink(struct net_device *dev, struct nlattr *tb[],
- return -EEXIST;
- } else {
- t = nt;
--
-- ip6gre_tunnel_unlink(ign, t);
-- ip6gre_tnl_change(t, &p, !tb[IFLA_MTU]);
-- ip6gre_tunnel_link(ign, t);
-- netdev_state_change(dev);
- }
-
-+ ip6gre_tunnel_unlink(ign, t);
-+ ip6gre_tnl_change(t, &p, !tb[IFLA_MTU]);
-+ ip6gre_tunnel_link(ign, t);
- return 0;
- }
-
-diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
-index 9e9b77b..8935dc1 100644
---- a/net/ipv6/tcp_ipv6.c
-+++ b/net/ipv6/tcp_ipv6.c
-@@ -93,10 +93,9 @@ static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)
- {
- struct dst_entry *dst = skb_dst(skb);
-
-- if (dst) {
-+ if (dst && dst_hold_safe(dst)) {
- const struct rt6_info *rt = (const struct rt6_info *)dst;
-
-- dst_hold(dst);
- sk->sk_rx_dst = dst;
- inet_sk(sk)->rx_dst_ifindex = skb->skb_iif;
- inet6_sk(sk)->rx_dst_cookie = rt6_get_cookie(rt);
-diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
-index fae6822..25f63a8 100644
---- a/net/irda/af_irda.c
-+++ b/net/irda/af_irda.c
-@@ -1086,6 +1086,9 @@ static int irda_create(struct net *net, struct socket *sock, int protocol,
- struct sock *sk;
- struct irda_sock *self;
-
-+ if (protocol < 0 || protocol > SK_PROTOCOL_MAX)
-+ return -EINVAL;
-+
- if (net != &init_net)
- return -EAFNOSUPPORT;
-
-diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c
-index 5009582..cad8c4b 100644
---- a/net/openvswitch/conntrack.c
-+++ b/net/openvswitch/conntrack.c
-@@ -53,6 +53,8 @@ struct ovs_conntrack_info {
- struct md_labels labels;
- };
-
-+static void __ovs_ct_free_action(struct ovs_conntrack_info *ct_info);
-+
- static u16 key_to_nfproto(const struct sw_flow_key *key)
- {
- switch (ntohs(key->eth.type)) {
-@@ -141,6 +143,7 @@ static void __ovs_ct_update_key(struct sw_flow_key *key, u8 state,
- * previously sent the packet to conntrack via the ct action.
- */
- static void ovs_ct_update_key(const struct sk_buff *skb,
-+ const struct ovs_conntrack_info *info,
- struct sw_flow_key *key, bool post_ct)
- {
- const struct nf_conntrack_zone *zone = &nf_ct_zone_dflt;
-@@ -158,13 +161,15 @@ static void ovs_ct_update_key(const struct sk_buff *skb,
- zone = nf_ct_zone(ct);
- } else if (post_ct) {
- state = OVS_CS_F_TRACKED | OVS_CS_F_INVALID;
-+ if (info)
-+ zone = &info->zone;
- }
- __ovs_ct_update_key(key, state, zone, ct);
- }
-
- void ovs_ct_fill_key(const struct sk_buff *skb, struct sw_flow_key *key)
- {
-- ovs_ct_update_key(skb, key, false);
-+ ovs_ct_update_key(skb, NULL, key, false);
- }
-
- int ovs_ct_put_key(const struct sw_flow_key *key, struct sk_buff *skb)
-@@ -418,7 +423,7 @@ static int __ovs_ct_lookup(struct net *net, struct sw_flow_key *key,
- }
- }
-
-- ovs_ct_update_key(skb, key, true);
-+ ovs_ct_update_key(skb, info, key, true);
-
- return 0;
- }
-@@ -708,7 +713,7 @@ int ovs_ct_copy_action(struct net *net, const struct nlattr *attr,
- nf_conntrack_get(&ct_info.ct->ct_general);
- return 0;
- err_free_ct:
-- nf_conntrack_free(ct_info.ct);
-+ __ovs_ct_free_action(&ct_info);
- return err;
- }
-
-@@ -750,6 +755,11 @@ void ovs_ct_free_action(const struct nlattr *a)
- {
- struct ovs_conntrack_info *ct_info = nla_data(a);
-
-+ __ovs_ct_free_action(ct_info);
-+}
-+
-+static void __ovs_ct_free_action(struct ovs_conntrack_info *ct_info)
-+{
- if (ct_info->helper)
- module_put(ct_info->helper->me);
- if (ct_info->ct)
-diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
-index 7ec667d..b5c2cf2 100644
---- a/net/sched/sch_api.c
-+++ b/net/sched/sch_api.c
-@@ -950,7 +950,7 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue,
- }
- lockdep_set_class(qdisc_lock(sch), &qdisc_tx_lock);
- if (!netif_is_multiqueue(dev))
-- sch->flags |= TCQ_F_ONETXQUEUE | TCQ_F_NOPARENT;
-+ sch->flags |= TCQ_F_ONETXQUEUE;
- }
-
- sch->handle = handle;
-diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
-index e917d27..40677cf 100644
---- a/net/sctp/ipv6.c
-+++ b/net/sctp/ipv6.c
-@@ -635,6 +635,7 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
- struct sock *newsk;
- struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
- struct sctp6_sock *newsctp6sk;
-+ struct ipv6_txoptions *opt;
-
- newsk = sk_alloc(sock_net(sk), PF_INET6, GFP_KERNEL, sk->sk_prot, 0);
- if (!newsk)
-@@ -654,6 +655,13 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
-
- memcpy(newnp, np, sizeof(struct ipv6_pinfo));
-
-+ rcu_read_lock();
-+ opt = rcu_dereference(np->opt);
-+ if (opt)
-+ opt = ipv6_dup_options(newsk, opt);
-+ RCU_INIT_POINTER(newnp->opt, opt);
-+ rcu_read_unlock();
-+
- /* Initialize sk's sport, dport, rcv_saddr and daddr for getsockname()
- * and getpeername().
- */
-diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
-index 7954c52..8d67d72 100644
---- a/net/sctp/sm_make_chunk.c
-+++ b/net/sctp/sm_make_chunk.c
-@@ -1652,7 +1652,7 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
-
- /* Set an expiration time for the cookie. */
- cookie->c.expiration = ktime_add(asoc->cookie_life,
-- ktime_get());
-+ ktime_get_real());
-
- /* Copy the peer's init packet. */
- memcpy(&cookie->c.peer_init[0], init_chunk->chunk_hdr,
-@@ -1780,7 +1780,7 @@ no_hmac:
- if (sock_flag(ep->base.sk, SOCK_TIMESTAMP))
- kt = skb_get_ktime(skb);
- else
-- kt = ktime_get();
-+ kt = ktime_get_real();
-
- if (!asoc && ktime_before(bear_cookie->expiration, kt)) {
- /*
-diff --git a/net/sctp/socket.c b/net/sctp/socket.c
-index 3ec88be..84b1b50 100644
---- a/net/sctp/socket.c
-+++ b/net/sctp/socket.c
-@@ -7163,6 +7163,7 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk,
- newsk->sk_type = sk->sk_type;
- newsk->sk_bound_dev_if = sk->sk_bound_dev_if;
- newsk->sk_flags = sk->sk_flags;
-+ newsk->sk_tsflags = sk->sk_tsflags;
- newsk->sk_no_check_tx = sk->sk_no_check_tx;
- newsk->sk_no_check_rx = sk->sk_no_check_rx;
- newsk->sk_reuse = sk->sk_reuse;
-@@ -7195,6 +7196,9 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk,
- newinet->mc_ttl = 1;
- newinet->mc_index = 0;
- newinet->mc_list = NULL;
-+
-+ if (newsk->sk_flags & SK_FLAGS_TIMESTAMP)
-+ net_enable_timestamp();
- }
-
- static inline void sctp_copy_descendant(struct sock *sk_to,
-diff --git a/net/socket.c b/net/socket.c
-index 9963a0b..f3fbe17 100644
---- a/net/socket.c
-+++ b/net/socket.c
-@@ -1702,6 +1702,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
- msg.msg_name = addr ? (struct sockaddr *)&address : NULL;
- /* We assume all kernel code knows the size of sockaddr_storage */
- msg.msg_namelen = 0;
-+ msg.msg_iocb = NULL;
- if (sock->file->f_flags & O_NONBLOCK)
- flags |= MSG_DONTWAIT;
- err = sock_recvmsg(sock, &msg, iov_iter_count(&msg.msg_iter), flags);
-diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c
-index 86f2e7c..73bdf1b 100644
---- a/net/tipc/udp_media.c
-+++ b/net/tipc/udp_media.c
-@@ -162,7 +162,7 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
- if (skb_headroom(skb) < UDP_MIN_HEADROOM) {
- err = pskb_expand_head(skb, UDP_MIN_HEADROOM, 0, GFP_ATOMIC);
- if (err)
-- goto tx_error;
-+ return err;
- }
-
- clone = skb_clone(skb, GFP_ATOMIC);
-diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
-index 128b098..0fc6dba 100644
---- a/net/unix/af_unix.c
-+++ b/net/unix/af_unix.c
-@@ -2255,14 +2255,7 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state)
- /* Lock the socket to prevent queue disordering
- * while sleeps in memcpy_tomsg
- */
-- err = mutex_lock_interruptible(&u->readlock);
-- if (unlikely(err)) {
-- /* recvmsg() in non blocking mode is supposed to return -EAGAIN
-- * sk_rcvtimeo is not honored by mutex_lock_interruptible()
-- */
-- err = noblock ? -EAGAIN : -ERESTARTSYS;
-- goto out;
-- }
-+ mutex_lock(&u->readlock);
-
- if (flags & MSG_PEEK)
- skip = sk_peek_offset(sk, flags);
-@@ -2306,12 +2299,12 @@ again:
- timeo = unix_stream_data_wait(sk, timeo, last,
- last_len);
-
-- if (signal_pending(current) ||
-- mutex_lock_interruptible(&u->readlock)) {
-+ if (signal_pending(current)) {
- err = sock_intr_errno(timeo);
- goto out;
- }
-
-+ mutex_lock(&u->readlock);
- continue;
- unlock:
- unix_state_unlock(sk);
-diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
-index 0b9ec78..26f0e0a 100644
---- a/security/keys/keyctl.c
-+++ b/security/keys/keyctl.c
-@@ -757,16 +757,16 @@ long keyctl_read_key(key_serial_t keyid, char __user *buffer, size_t buflen)
-
- /* the key is probably readable - now try to read it */
- can_read_key:
-- ret = key_validate(key);
-- if (ret == 0) {
-- ret = -EOPNOTSUPP;
-- if (key->type->read) {
-- /* read the data with the semaphore held (since we
-- * might sleep) */
-- down_read(&key->sem);
-+ ret = -EOPNOTSUPP;
-+ if (key->type->read) {
-+ /* Read the data with the semaphore held (since we might sleep)
-+ * to protect against the key being updated or revoked.
-+ */
-+ down_read(&key->sem);
-+ ret = key_validate(key);
-+ if (ret == 0)
- ret = key->type->read(key, buffer, buflen);
-- up_read(&key->sem);
-- }
-+ up_read(&key->sem);
- }
-
- error2:
-diff --git a/security/keys/process_keys.c b/security/keys/process_keys.c
-index 43b4cdd..7877e5c 100644
---- a/security/keys/process_keys.c
-+++ b/security/keys/process_keys.c
-@@ -794,6 +794,7 @@ long join_session_keyring(const char *name)
- ret = PTR_ERR(keyring);
- goto error2;
- } else if (keyring == new->session_keyring) {
-+ key_put(keyring);
- ret = 0;
- goto error2;
- }