mirror of
https://github.com/Fishwaldo/build.git
synced 2025-07-23 05:18:55 +00:00
* Change DEV to EDGE * Renaming patches dev folder to edge * Move patches into subdir where they will be archived. * Relink patch directories properly
1573 lines
53 KiB
Diff
1573 lines
53 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index d36b8f4228a47..10314ba3c7bc5 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 4
|
|
PATCHLEVEL = 14
|
|
-SUBLEVEL = 214
|
|
+SUBLEVEL = 215
|
|
EXTRAVERSION =
|
|
NAME = Petit Gorille
|
|
|
|
@@ -382,7 +382,7 @@ OBJDUMP = $(CROSS_COMPILE)objdump
|
|
AWK = awk
|
|
GENKSYMS = scripts/genksyms/genksyms
|
|
INSTALLKERNEL := installkernel
|
|
-DEPMOD = /sbin/depmod
|
|
+DEPMOD = depmod
|
|
PERL = perl
|
|
PYTHON = python
|
|
CHECK = sparse
|
|
diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c
|
|
index e12ee86906c62..9436f34520491 100644
|
|
--- a/arch/x86/kernel/cpu/mtrr/generic.c
|
|
+++ b/arch/x86/kernel/cpu/mtrr/generic.c
|
|
@@ -166,9 +166,6 @@ static u8 mtrr_type_lookup_variable(u64 start, u64 end, u64 *partial_end,
|
|
*repeat = 0;
|
|
*uniform = 1;
|
|
|
|
- /* Make end inclusive instead of exclusive */
|
|
- end--;
|
|
-
|
|
prev_match = MTRR_TYPE_INVALID;
|
|
for (i = 0; i < num_var_ranges; ++i) {
|
|
unsigned short start_state, end_state, inclusive;
|
|
@@ -260,6 +257,9 @@ u8 mtrr_type_lookup(u64 start, u64 end, u8 *uniform)
|
|
int repeat;
|
|
u64 partial_end;
|
|
|
|
+ /* Make end inclusive instead of exclusive */
|
|
+ end--;
|
|
+
|
|
if (!mtrr_state_set)
|
|
return MTRR_TYPE_INVALID;
|
|
|
|
diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h
|
|
index 816a626b62508..e76f5963aa7d0 100644
|
|
--- a/arch/x86/kvm/mmu.h
|
|
+++ b/arch/x86/kvm/mmu.h
|
|
@@ -53,7 +53,7 @@ static inline u64 rsvd_bits(int s, int e)
|
|
if (e < s)
|
|
return 0;
|
|
|
|
- return ((1ULL << (e - s + 1)) - 1) << s;
|
|
+ return ((2ULL << (e - s)) - 1) << s;
|
|
}
|
|
|
|
void kvm_mmu_set_mmio_spte_mask(u64 mmio_mask, u64 mmio_value);
|
|
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
|
|
index 55338b3922210..84e5c5bdaa740 100644
|
|
--- a/arch/x86/mm/pgtable.c
|
|
+++ b/arch/x86/mm/pgtable.c
|
|
@@ -765,6 +765,8 @@ int pud_free_pmd_page(pud_t *pud, unsigned long addr)
|
|
}
|
|
|
|
free_page((unsigned long)pmd_sv);
|
|
+
|
|
+ pgtable_pmd_page_dtor(virt_to_page(pmd));
|
|
free_page((unsigned long)pmd);
|
|
|
|
return 1;
|
|
diff --git a/crypto/ecdh.c b/crypto/ecdh.c
|
|
index 3919b59ada250..ea4c5a864fcd1 100644
|
|
--- a/crypto/ecdh.c
|
|
+++ b/crypto/ecdh.c
|
|
@@ -43,7 +43,8 @@ static int ecdh_set_secret(struct crypto_kpp *tfm, const void *buf,
|
|
struct ecdh params;
|
|
unsigned int ndigits;
|
|
|
|
- if (crypto_ecdh_decode_key(buf, len, ¶ms) < 0)
|
|
+ if (crypto_ecdh_decode_key(buf, len, ¶ms) < 0 ||
|
|
+ params.key_size > sizeof(ctx->private_key))
|
|
return -EINVAL;
|
|
|
|
ndigits = ecdh_supported_curve(params.curve_id);
|
|
diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c
|
|
index 47f3c4ae05947..4998ea5f51d53 100644
|
|
--- a/drivers/atm/idt77252.c
|
|
+++ b/drivers/atm/idt77252.c
|
|
@@ -3608,7 +3608,7 @@ static int idt77252_init_one(struct pci_dev *pcidev,
|
|
|
|
if ((err = dma_set_mask_and_coherent(&pcidev->dev, DMA_BIT_MASK(32)))) {
|
|
printk("idt77252: can't enable DMA for PCI device at %s\n", pci_name(pcidev));
|
|
- return err;
|
|
+ goto err_out_disable_pdev;
|
|
}
|
|
|
|
card = kzalloc(sizeof(struct idt77252_dev), GFP_KERNEL);
|
|
diff --git a/drivers/base/core.c b/drivers/base/core.c
|
|
index 05ecc0de2d590..a11652d77c7f2 100644
|
|
--- a/drivers/base/core.c
|
|
+++ b/drivers/base/core.c
|
|
@@ -3090,7 +3090,7 @@ void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
|
|
if (fwnode_is_primary(fn)) {
|
|
dev->fwnode = fn->secondary;
|
|
if (!(parent && fn == parent->fwnode))
|
|
- fn->secondary = ERR_PTR(-ENODEV);
|
|
+ fn->secondary = NULL;
|
|
} else {
|
|
dev->fwnode = NULL;
|
|
}
|
|
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c
|
|
index 0e6bc631a1caf..215558c947def 100644
|
|
--- a/drivers/ide/ide-atapi.c
|
|
+++ b/drivers/ide/ide-atapi.c
|
|
@@ -213,7 +213,6 @@ void ide_prep_sense(ide_drive_t *drive, struct request *rq)
|
|
sense_rq->rq_disk = rq->rq_disk;
|
|
sense_rq->cmd_flags = REQ_OP_DRV_IN;
|
|
ide_req(sense_rq)->type = ATA_PRIV_SENSE;
|
|
- sense_rq->rq_flags |= RQF_PREEMPT;
|
|
|
|
req->cmd[0] = GPCMD_REQUEST_SENSE;
|
|
req->cmd[4] = cmd_len;
|
|
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
|
|
index 3a234701d92c4..7f34dc49c9b5f 100644
|
|
--- a/drivers/ide/ide-io.c
|
|
+++ b/drivers/ide/ide-io.c
|
|
@@ -531,11 +531,6 @@ repeat:
|
|
* above to return us whatever is in the queue. Since we call
|
|
* ide_do_request() ourselves, we end up taking requests while
|
|
* the queue is blocked...
|
|
- *
|
|
- * We let requests forced at head of queue with ide-preempt
|
|
- * though. I hope that doesn't happen too much, hopefully not
|
|
- * unless the subdriver triggers such a thing in its own PM
|
|
- * state machine.
|
|
*/
|
|
if ((drive->dev_flags & IDE_DFLAG_BLOCKED) &&
|
|
ata_pm_request(rq) == 0 &&
|
|
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
|
|
index 11eb393497a2a..0083e2a52a30f 100644
|
|
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
|
|
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
|
|
@@ -2153,6 +2153,7 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
|
/* HW supported features, none enabled by default */
|
|
dev->hw_features |= NETIF_F_RXCSUM | NETIF_F_HIGHDMA |
|
|
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
|
+ dev->max_mtu = UMAC_MAX_MTU_SIZE;
|
|
|
|
/* Request the WOL interrupt and advertise suspend if available */
|
|
priv->wol_irq_disabled = 1;
|
|
diff --git a/drivers/net/ethernet/ethoc.c b/drivers/net/ethernet/ethoc.c
|
|
index 8bb0db990c8fc..e8fc0c55ab047 100644
|
|
--- a/drivers/net/ethernet/ethoc.c
|
|
+++ b/drivers/net/ethernet/ethoc.c
|
|
@@ -1212,7 +1212,7 @@ static int ethoc_probe(struct platform_device *pdev)
|
|
ret = mdiobus_register(priv->mdio);
|
|
if (ret) {
|
|
dev_err(&netdev->dev, "failed to register MDIO bus\n");
|
|
- goto free2;
|
|
+ goto free3;
|
|
}
|
|
|
|
ret = ethoc_mdio_probe(netdev);
|
|
@@ -1244,6 +1244,7 @@ error2:
|
|
netif_napi_del(&priv->napi);
|
|
error:
|
|
mdiobus_unregister(priv->mdio);
|
|
+free3:
|
|
mdiobus_free(priv->mdio);
|
|
free2:
|
|
if (priv->clk)
|
|
diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c
|
|
index 7c2a9fd4dc1a0..2e79acfbde859 100644
|
|
--- a/drivers/net/ethernet/freescale/ucc_geth.c
|
|
+++ b/drivers/net/ethernet/freescale/ucc_geth.c
|
|
@@ -3894,6 +3894,7 @@ static int ucc_geth_probe(struct platform_device* ofdev)
|
|
INIT_WORK(&ugeth->timeout_work, ucc_geth_timeout_work);
|
|
netif_napi_add(dev, &ugeth->napi, ucc_geth_poll, 64);
|
|
dev->mtu = 1500;
|
|
+ dev->max_mtu = 1518;
|
|
|
|
ugeth->msg_enable = netif_msg_init(debug.msg_enable, UGETH_MSG_DEFAULT);
|
|
ugeth->phy_interface = phy_interface;
|
|
@@ -3939,12 +3940,12 @@ static int ucc_geth_remove(struct platform_device* ofdev)
|
|
struct device_node *np = ofdev->dev.of_node;
|
|
|
|
unregister_netdev(dev);
|
|
- free_netdev(dev);
|
|
ucc_geth_memclean(ugeth);
|
|
if (of_phy_is_fixed_link(np))
|
|
of_phy_deregister_fixed_link(np);
|
|
of_node_put(ugeth->ug_info->tbi_node);
|
|
of_node_put(ugeth->ug_info->phy_node);
|
|
+ free_netdev(dev);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
|
|
index 523d52fbaafec..369176cce1739 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
|
|
@@ -418,6 +418,10 @@ static void __lb_other_process(struct hns_nic_ring_data *ring_data,
|
|
/* for mutl buffer*/
|
|
new_skb = skb_copy(skb, GFP_ATOMIC);
|
|
dev_kfree_skb_any(skb);
|
|
+ if (!new_skb) {
|
|
+ netdev_err(ndev, "skb alloc failed\n");
|
|
+ return;
|
|
+ }
|
|
skb = new_skb;
|
|
|
|
check_ok = 0;
|
|
diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
|
|
index d1eede2625ca5..988869fe0bbf1 100644
|
|
--- a/drivers/net/ethernet/marvell/mvpp2.c
|
|
+++ b/drivers/net/ethernet/marvell/mvpp2.c
|
|
@@ -4349,7 +4349,7 @@ static void mvpp22_gop_init_rgmii(struct mvpp2_port *port)
|
|
|
|
regmap_read(priv->sysctrl_base, GENCONF_CTRL0, &val);
|
|
if (port->gop_id == 2)
|
|
- val |= GENCONF_CTRL0_PORT0_RGMII | GENCONF_CTRL0_PORT1_RGMII;
|
|
+ val |= GENCONF_CTRL0_PORT0_RGMII;
|
|
else if (port->gop_id == 3)
|
|
val |= GENCONF_CTRL0_PORT1_RGMII_MII;
|
|
regmap_write(priv->sysctrl_base, GENCONF_CTRL0, val);
|
|
diff --git a/drivers/net/ethernet/qlogic/qede/qede_fp.c b/drivers/net/ethernet/qlogic/qede/qede_fp.c
|
|
index d50cc26354776..27c0300e72293 100644
|
|
--- a/drivers/net/ethernet/qlogic/qede/qede_fp.c
|
|
+++ b/drivers/net/ethernet/qlogic/qede/qede_fp.c
|
|
@@ -1708,6 +1708,11 @@ netdev_features_t qede_features_check(struct sk_buff *skb,
|
|
ntohs(udp_hdr(skb)->dest) != gnv_port))
|
|
return features & ~(NETIF_F_CSUM_MASK |
|
|
NETIF_F_GSO_MASK);
|
|
+ } else if (l4_proto == IPPROTO_IPIP) {
|
|
+ /* IPIP tunnels are unknown to the device or at least unsupported natively,
|
|
+ * offloads for them can't be done trivially, so disable them for such skb.
|
|
+ */
|
|
+ return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/ti/cpts.c b/drivers/net/ethernet/ti/cpts.c
|
|
index 23c953496a0d1..9e7e7e8a018d1 100644
|
|
--- a/drivers/net/ethernet/ti/cpts.c
|
|
+++ b/drivers/net/ethernet/ti/cpts.c
|
|
@@ -471,6 +471,7 @@ void cpts_unregister(struct cpts *cpts)
|
|
|
|
ptp_clock_unregister(cpts->clock);
|
|
cpts->clock = NULL;
|
|
+ cpts->phc_index = -1;
|
|
|
|
cpts_write32(cpts, 0, int_enable);
|
|
cpts_write32(cpts, 0, control);
|
|
@@ -572,6 +573,7 @@ struct cpts *cpts_create(struct device *dev, void __iomem *regs,
|
|
cpts->cc.read = cpts_systim_read;
|
|
cpts->cc.mask = CLOCKSOURCE_MASK(32);
|
|
cpts->info = cpts_info;
|
|
+ cpts->phc_index = -1;
|
|
|
|
cpts_calc_mult_shift(cpts);
|
|
/* save cc.mult original value as it can be modified
|
|
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
|
|
index cb4c9d419bd39..97c4c301166c5 100644
|
|
--- a/drivers/net/usb/cdc_ncm.c
|
|
+++ b/drivers/net/usb/cdc_ncm.c
|
|
@@ -1630,9 +1630,6 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb)
|
|
* USB_CDC_NOTIFY_NETWORK_CONNECTION notification shall be
|
|
* sent by device after USB_CDC_NOTIFY_SPEED_CHANGE.
|
|
*/
|
|
- netif_info(dev, link, dev->net,
|
|
- "network connection: %sconnected\n",
|
|
- !!event->wValue ? "" : "dis");
|
|
usbnet_link_change(dev, !!event->wValue, 0);
|
|
break;
|
|
|
|
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
|
|
index df84d98aa880d..6fed2fc4565b4 100644
|
|
--- a/drivers/net/usb/qmi_wwan.c
|
|
+++ b/drivers/net/usb/qmi_wwan.c
|
|
@@ -995,6 +995,7 @@ static const struct usb_device_id products[] = {
|
|
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */
|
|
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */
|
|
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */
|
|
+ {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)}, /* Quectel EM160R-GL */
|
|
{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */
|
|
|
|
/* 3. Combined interface devices matching on interface number */
|
|
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
|
|
index 0b457c81c4482..2d2a307c02312 100644
|
|
--- a/drivers/net/virtio_net.c
|
|
+++ b/drivers/net/virtio_net.c
|
|
@@ -1788,14 +1788,16 @@ static int virtnet_set_channels(struct net_device *dev,
|
|
|
|
get_online_cpus();
|
|
err = _virtnet_set_queues(vi, queue_pairs);
|
|
- if (!err) {
|
|
- netif_set_real_num_tx_queues(dev, queue_pairs);
|
|
- netif_set_real_num_rx_queues(dev, queue_pairs);
|
|
-
|
|
- virtnet_set_affinity(vi);
|
|
+ if (err) {
|
|
+ put_online_cpus();
|
|
+ goto err;
|
|
}
|
|
+ virtnet_set_affinity(vi);
|
|
put_online_cpus();
|
|
|
|
+ netif_set_real_num_tx_queues(dev, queue_pairs);
|
|
+ netif_set_real_num_rx_queues(dev, queue_pairs);
|
|
+ err:
|
|
return err;
|
|
}
|
|
|
|
diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c
|
|
index 4381e7310be02..816d6eb89843d 100644
|
|
--- a/drivers/net/wan/hdlc_ppp.c
|
|
+++ b/drivers/net/wan/hdlc_ppp.c
|
|
@@ -572,6 +572,13 @@ static void ppp_timer(unsigned long arg)
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&ppp->lock, flags);
|
|
+ /* mod_timer could be called after we entered this function but
|
|
+ * before we got the lock.
|
|
+ */
|
|
+ if (timer_pending(&proto->timer)) {
|
|
+ spin_unlock_irqrestore(&ppp->lock, flags);
|
|
+ return;
|
|
+ }
|
|
switch (proto->state) {
|
|
case STOPPING:
|
|
case REQ_SENT:
|
|
diff --git a/drivers/scsi/ufs/ufshcd-pci.c b/drivers/scsi/ufs/ufshcd-pci.c
|
|
index 925b0ec7ec54d..5253f089de4ee 100644
|
|
--- a/drivers/scsi/ufs/ufshcd-pci.c
|
|
+++ b/drivers/scsi/ufs/ufshcd-pci.c
|
|
@@ -97,6 +97,30 @@ static int ufshcd_pci_resume(struct device *dev)
|
|
{
|
|
return ufshcd_system_resume(dev_get_drvdata(dev));
|
|
}
|
|
+
|
|
+/**
|
|
+ * ufshcd_pci_poweroff - suspend-to-disk poweroff function
|
|
+ * @dev: pointer to PCI device handle
|
|
+ *
|
|
+ * Returns 0 if successful
|
|
+ * Returns non-zero otherwise
|
|
+ */
|
|
+static int ufshcd_pci_poweroff(struct device *dev)
|
|
+{
|
|
+ struct ufs_hba *hba = dev_get_drvdata(dev);
|
|
+ int spm_lvl = hba->spm_lvl;
|
|
+ int ret;
|
|
+
|
|
+ /*
|
|
+ * For poweroff we need to set the UFS device to PowerDown mode.
|
|
+ * Force spm_lvl to ensure that.
|
|
+ */
|
|
+ hba->spm_lvl = 5;
|
|
+ ret = ufshcd_system_suspend(hba);
|
|
+ hba->spm_lvl = spm_lvl;
|
|
+ return ret;
|
|
+}
|
|
+
|
|
#endif /* !CONFIG_PM_SLEEP */
|
|
|
|
#ifdef CONFIG_PM
|
|
@@ -191,8 +215,14 @@ ufshcd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
}
|
|
|
|
static const struct dev_pm_ops ufshcd_pci_pm_ops = {
|
|
- SET_SYSTEM_SLEEP_PM_OPS(ufshcd_pci_suspend,
|
|
- ufshcd_pci_resume)
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
+ .suspend = ufshcd_pci_suspend,
|
|
+ .resume = ufshcd_pci_resume,
|
|
+ .freeze = ufshcd_pci_suspend,
|
|
+ .thaw = ufshcd_pci_resume,
|
|
+ .poweroff = ufshcd_pci_poweroff,
|
|
+ .restore = ufshcd_pci_resume,
|
|
+#endif
|
|
SET_RUNTIME_PM_OPS(ufshcd_pci_runtime_suspend,
|
|
ufshcd_pci_runtime_resume,
|
|
ufshcd_pci_runtime_idle)
|
|
diff --git a/drivers/target/target_core_xcopy.c b/drivers/target/target_core_xcopy.c
|
|
index 9ee89e00cd776..9142f7acd907b 100644
|
|
--- a/drivers/target/target_core_xcopy.c
|
|
+++ b/drivers/target/target_core_xcopy.c
|
|
@@ -55,60 +55,83 @@ static int target_xcopy_gen_naa_ieee(struct se_device *dev, unsigned char *buf)
|
|
return 0;
|
|
}
|
|
|
|
-struct xcopy_dev_search_info {
|
|
- const unsigned char *dev_wwn;
|
|
- struct se_device *found_dev;
|
|
-};
|
|
-
|
|
+/**
|
|
+ * target_xcopy_locate_se_dev_e4_iter - compare XCOPY NAA device identifiers
|
|
+ *
|
|
+ * @se_dev: device being considered for match
|
|
+ * @dev_wwn: XCOPY requested NAA dev_wwn
|
|
+ * @return: 1 on match, 0 on no-match
|
|
+ */
|
|
static int target_xcopy_locate_se_dev_e4_iter(struct se_device *se_dev,
|
|
- void *data)
|
|
+ const unsigned char *dev_wwn)
|
|
{
|
|
- struct xcopy_dev_search_info *info = data;
|
|
unsigned char tmp_dev_wwn[XCOPY_NAA_IEEE_REGEX_LEN];
|
|
int rc;
|
|
|
|
- if (!se_dev->dev_attrib.emulate_3pc)
|
|
+ if (!se_dev->dev_attrib.emulate_3pc) {
|
|
+ pr_debug("XCOPY: emulate_3pc disabled on se_dev %p\n", se_dev);
|
|
return 0;
|
|
+ }
|
|
|
|
memset(&tmp_dev_wwn[0], 0, XCOPY_NAA_IEEE_REGEX_LEN);
|
|
target_xcopy_gen_naa_ieee(se_dev, &tmp_dev_wwn[0]);
|
|
|
|
- rc = memcmp(&tmp_dev_wwn[0], info->dev_wwn, XCOPY_NAA_IEEE_REGEX_LEN);
|
|
- if (rc != 0)
|
|
- return 0;
|
|
-
|
|
- info->found_dev = se_dev;
|
|
- pr_debug("XCOPY 0xe4: located se_dev: %p\n", se_dev);
|
|
-
|
|
- rc = target_depend_item(&se_dev->dev_group.cg_item);
|
|
+ rc = memcmp(&tmp_dev_wwn[0], dev_wwn, XCOPY_NAA_IEEE_REGEX_LEN);
|
|
if (rc != 0) {
|
|
- pr_err("configfs_depend_item attempt failed: %d for se_dev: %p\n",
|
|
- rc, se_dev);
|
|
- return rc;
|
|
+ pr_debug("XCOPY: skip non-matching: %*ph\n",
|
|
+ XCOPY_NAA_IEEE_REGEX_LEN, tmp_dev_wwn);
|
|
+ return 0;
|
|
}
|
|
+ pr_debug("XCOPY 0xe4: located se_dev: %p\n", se_dev);
|
|
|
|
- pr_debug("Called configfs_depend_item for se_dev: %p se_dev->se_dev_group: %p\n",
|
|
- se_dev, &se_dev->dev_group);
|
|
return 1;
|
|
}
|
|
|
|
-static int target_xcopy_locate_se_dev_e4(const unsigned char *dev_wwn,
|
|
- struct se_device **found_dev)
|
|
+static int target_xcopy_locate_se_dev_e4(struct se_session *sess,
|
|
+ const unsigned char *dev_wwn,
|
|
+ struct se_device **_found_dev,
|
|
+ struct percpu_ref **_found_lun_ref)
|
|
{
|
|
- struct xcopy_dev_search_info info;
|
|
- int ret;
|
|
-
|
|
- memset(&info, 0, sizeof(info));
|
|
- info.dev_wwn = dev_wwn;
|
|
-
|
|
- ret = target_for_each_device(target_xcopy_locate_se_dev_e4_iter, &info);
|
|
- if (ret == 1) {
|
|
- *found_dev = info.found_dev;
|
|
- return 0;
|
|
- } else {
|
|
- pr_debug_ratelimited("Unable to locate 0xe4 descriptor for EXTENDED_COPY\n");
|
|
- return -EINVAL;
|
|
+ struct se_dev_entry *deve;
|
|
+ struct se_node_acl *nacl;
|
|
+ struct se_lun *this_lun = NULL;
|
|
+ struct se_device *found_dev = NULL;
|
|
+
|
|
+ /* cmd with NULL sess indicates no associated $FABRIC_MOD */
|
|
+ if (!sess)
|
|
+ goto err_out;
|
|
+
|
|
+ pr_debug("XCOPY 0xe4: searching for: %*ph\n",
|
|
+ XCOPY_NAA_IEEE_REGEX_LEN, dev_wwn);
|
|
+
|
|
+ nacl = sess->se_node_acl;
|
|
+ rcu_read_lock();
|
|
+ hlist_for_each_entry_rcu(deve, &nacl->lun_entry_hlist, link) {
|
|
+ struct se_device *this_dev;
|
|
+ int rc;
|
|
+
|
|
+ this_lun = rcu_dereference(deve->se_lun);
|
|
+ this_dev = rcu_dereference_raw(this_lun->lun_se_dev);
|
|
+
|
|
+ rc = target_xcopy_locate_se_dev_e4_iter(this_dev, dev_wwn);
|
|
+ if (rc) {
|
|
+ if (percpu_ref_tryget_live(&this_lun->lun_ref))
|
|
+ found_dev = this_dev;
|
|
+ break;
|
|
+ }
|
|
}
|
|
+ rcu_read_unlock();
|
|
+ if (found_dev == NULL)
|
|
+ goto err_out;
|
|
+
|
|
+ pr_debug("lun_ref held for se_dev: %p se_dev->se_dev_group: %p\n",
|
|
+ found_dev, &found_dev->dev_group);
|
|
+ *_found_dev = found_dev;
|
|
+ *_found_lun_ref = &this_lun->lun_ref;
|
|
+ return 0;
|
|
+err_out:
|
|
+ pr_debug_ratelimited("Unable to locate 0xe4 descriptor for EXTENDED_COPY\n");
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
static int target_xcopy_parse_tiddesc_e4(struct se_cmd *se_cmd, struct xcopy_op *xop,
|
|
@@ -255,12 +278,16 @@ static int target_xcopy_parse_target_descriptors(struct se_cmd *se_cmd,
|
|
|
|
switch (xop->op_origin) {
|
|
case XCOL_SOURCE_RECV_OP:
|
|
- rc = target_xcopy_locate_se_dev_e4(xop->dst_tid_wwn,
|
|
- &xop->dst_dev);
|
|
+ rc = target_xcopy_locate_se_dev_e4(se_cmd->se_sess,
|
|
+ xop->dst_tid_wwn,
|
|
+ &xop->dst_dev,
|
|
+ &xop->remote_lun_ref);
|
|
break;
|
|
case XCOL_DEST_RECV_OP:
|
|
- rc = target_xcopy_locate_se_dev_e4(xop->src_tid_wwn,
|
|
- &xop->src_dev);
|
|
+ rc = target_xcopy_locate_se_dev_e4(se_cmd->se_sess,
|
|
+ xop->src_tid_wwn,
|
|
+ &xop->src_dev,
|
|
+ &xop->remote_lun_ref);
|
|
break;
|
|
default:
|
|
pr_err("XCOPY CSCD descriptor IDs not found in CSCD list - "
|
|
@@ -412,18 +439,12 @@ static int xcopy_pt_get_cmd_state(struct se_cmd *se_cmd)
|
|
|
|
static void xcopy_pt_undepend_remotedev(struct xcopy_op *xop)
|
|
{
|
|
- struct se_device *remote_dev;
|
|
-
|
|
if (xop->op_origin == XCOL_SOURCE_RECV_OP)
|
|
- remote_dev = xop->dst_dev;
|
|
+ pr_debug("putting dst lun_ref for %p\n", xop->dst_dev);
|
|
else
|
|
- remote_dev = xop->src_dev;
|
|
-
|
|
- pr_debug("Calling configfs_undepend_item for"
|
|
- " remote_dev: %p remote_dev->dev_group: %p\n",
|
|
- remote_dev, &remote_dev->dev_group.cg_item);
|
|
+ pr_debug("putting src lun_ref for %p\n", xop->src_dev);
|
|
|
|
- target_undepend_item(&remote_dev->dev_group.cg_item);
|
|
+ percpu_ref_put(xop->remote_lun_ref);
|
|
}
|
|
|
|
static void xcopy_pt_release_cmd(struct se_cmd *se_cmd)
|
|
diff --git a/drivers/target/target_core_xcopy.h b/drivers/target/target_core_xcopy.h
|
|
index 26ba4c3c9cffd..974bc1e19ff2b 100644
|
|
--- a/drivers/target/target_core_xcopy.h
|
|
+++ b/drivers/target/target_core_xcopy.h
|
|
@@ -29,6 +29,7 @@ struct xcopy_op {
|
|
struct se_device *dst_dev;
|
|
unsigned char dst_tid_wwn[XCOPY_NAA_IEEE_REGEX_LEN];
|
|
unsigned char local_dev_wwn[XCOPY_NAA_IEEE_REGEX_LEN];
|
|
+ struct percpu_ref *remote_lun_ref;
|
|
|
|
sector_t src_lba;
|
|
sector_t dst_lba;
|
|
diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c
|
|
index 580468c449618..b4f0183f52461 100644
|
|
--- a/drivers/usb/chipidea/ci_hdrc_imx.c
|
|
+++ b/drivers/usb/chipidea/ci_hdrc_imx.c
|
|
@@ -134,9 +134,13 @@ static struct imx_usbmisc_data *usbmisc_get_init_data(struct device *dev)
|
|
misc_pdev = of_find_device_by_node(args.np);
|
|
of_node_put(args.np);
|
|
|
|
- if (!misc_pdev || !platform_get_drvdata(misc_pdev))
|
|
+ if (!misc_pdev)
|
|
return ERR_PTR(-EPROBE_DEFER);
|
|
|
|
+ if (!platform_get_drvdata(misc_pdev)) {
|
|
+ put_device(&misc_pdev->dev);
|
|
+ return ERR_PTR(-EPROBE_DEFER);
|
|
+ }
|
|
data->dev = &misc_pdev->dev;
|
|
|
|
if (of_find_property(np, "disable-over-current", NULL))
|
|
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
|
|
index 38f85b0e32ab6..6bfcffa446507 100644
|
|
--- a/drivers/usb/class/cdc-acm.c
|
|
+++ b/drivers/usb/class/cdc-acm.c
|
|
@@ -1952,6 +1952,10 @@ static const struct usb_device_id acm_ids[] = {
|
|
{ USB_DEVICE(0x04d8, 0x0083), /* Bootloader mode */
|
|
.driver_info = IGNORE_DEVICE,
|
|
},
|
|
+
|
|
+ { USB_DEVICE(0x04d8, 0xf58b),
|
|
+ .driver_info = IGNORE_DEVICE,
|
|
+ },
|
|
#endif
|
|
|
|
/*Samsung phone in firmware update mode */
|
|
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c
|
|
index 9775b5c8a313c..21a51a15893bb 100644
|
|
--- a/drivers/usb/class/usblp.c
|
|
+++ b/drivers/usb/class/usblp.c
|
|
@@ -289,8 +289,25 @@ static int usblp_ctrl_msg(struct usblp *usblp, int request, int type, int dir, i
|
|
#define usblp_reset(usblp)\
|
|
usblp_ctrl_msg(usblp, USBLP_REQ_RESET, USB_TYPE_CLASS, USB_DIR_OUT, USB_RECIP_OTHER, 0, NULL, 0)
|
|
|
|
-#define usblp_hp_channel_change_request(usblp, channel, buffer) \
|
|
- usblp_ctrl_msg(usblp, USBLP_REQ_HP_CHANNEL_CHANGE_REQUEST, USB_TYPE_VENDOR, USB_DIR_IN, USB_RECIP_INTERFACE, channel, buffer, 1)
|
|
+static int usblp_hp_channel_change_request(struct usblp *usblp, int channel, u8 *new_channel)
|
|
+{
|
|
+ u8 *buf;
|
|
+ int ret;
|
|
+
|
|
+ buf = kzalloc(1, GFP_KERNEL);
|
|
+ if (!buf)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ ret = usblp_ctrl_msg(usblp, USBLP_REQ_HP_CHANNEL_CHANGE_REQUEST,
|
|
+ USB_TYPE_VENDOR, USB_DIR_IN, USB_RECIP_INTERFACE,
|
|
+ channel, buf, 1);
|
|
+ if (ret == 0)
|
|
+ *new_channel = buf[0];
|
|
+
|
|
+ kfree(buf);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
|
|
/*
|
|
* See the description for usblp_select_alts() below for the usage
|
|
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
|
|
index 8747f9f02229e..8c59a8aeb9409 100644
|
|
--- a/drivers/usb/dwc3/core.h
|
|
+++ b/drivers/usb/dwc3/core.h
|
|
@@ -227,6 +227,7 @@
|
|
|
|
/* Global USB2 PHY Vendor Control Register */
|
|
#define DWC3_GUSB2PHYACC_NEWREGREQ BIT(25)
|
|
+#define DWC3_GUSB2PHYACC_DONE BIT(24)
|
|
#define DWC3_GUSB2PHYACC_BUSY BIT(23)
|
|
#define DWC3_GUSB2PHYACC_WRITE BIT(22)
|
|
#define DWC3_GUSB2PHYACC_ADDR(n) (n << 16)
|
|
diff --git a/drivers/usb/dwc3/ulpi.c b/drivers/usb/dwc3/ulpi.c
|
|
index e87ce8e9edee9..d3b68e97096e7 100644
|
|
--- a/drivers/usb/dwc3/ulpi.c
|
|
+++ b/drivers/usb/dwc3/ulpi.c
|
|
@@ -27,7 +27,7 @@ static int dwc3_ulpi_busyloop(struct dwc3 *dwc)
|
|
|
|
while (count--) {
|
|
reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYACC(0));
|
|
- if (!(reg & DWC3_GUSB2PHYACC_BUSY))
|
|
+ if (reg & DWC3_GUSB2PHYACC_DONE)
|
|
return 0;
|
|
cpu_relax();
|
|
}
|
|
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
|
|
index 31cce7805eb2e..c6afc42429628 100644
|
|
--- a/drivers/usb/gadget/Kconfig
|
|
+++ b/drivers/usb/gadget/Kconfig
|
|
@@ -264,6 +264,7 @@ config USB_CONFIGFS_NCM
|
|
depends on NET
|
|
select USB_U_ETHER
|
|
select USB_F_NCM
|
|
+ select CRC32
|
|
help
|
|
NCM is an advanced protocol for Ethernet encapsulation, allows
|
|
grouping of several ethernet frames into one USB transfer and
|
|
@@ -313,6 +314,7 @@ config USB_CONFIGFS_EEM
|
|
depends on NET
|
|
select USB_U_ETHER
|
|
select USB_F_EEM
|
|
+ select CRC32
|
|
help
|
|
CDC EEM is a newer USB standard that is somewhat simpler than CDC ECM
|
|
and therefore can be supported by more hardware. Technically ECM and
|
|
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
|
|
index 7d2715e899bb8..c98c80ca3bbcd 100644
|
|
--- a/drivers/usb/gadget/composite.c
|
|
+++ b/drivers/usb/gadget/composite.c
|
|
@@ -395,8 +395,11 @@ int usb_function_deactivate(struct usb_function *function)
|
|
|
|
spin_lock_irqsave(&cdev->lock, flags);
|
|
|
|
- if (cdev->deactivations == 0)
|
|
+ if (cdev->deactivations == 0) {
|
|
+ spin_unlock_irqrestore(&cdev->lock, flags);
|
|
status = usb_gadget_deactivate(cdev->gadget);
|
|
+ spin_lock_irqsave(&cdev->lock, flags);
|
|
+ }
|
|
if (status == 0)
|
|
cdev->deactivations++;
|
|
|
|
@@ -427,8 +430,11 @@ int usb_function_activate(struct usb_function *function)
|
|
status = -EINVAL;
|
|
else {
|
|
cdev->deactivations--;
|
|
- if (cdev->deactivations == 0)
|
|
+ if (cdev->deactivations == 0) {
|
|
+ spin_unlock_irqrestore(&cdev->lock, flags);
|
|
status = usb_gadget_activate(cdev->gadget);
|
|
+ spin_lock_irqsave(&cdev->lock, flags);
|
|
+ }
|
|
}
|
|
|
|
spin_unlock_irqrestore(&cdev->lock, flags);
|
|
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
|
|
index 3dc84e6a904bd..2c70b0bcea6aa 100644
|
|
--- a/drivers/usb/gadget/configfs.c
|
|
+++ b/drivers/usb/gadget/configfs.c
|
|
@@ -232,9 +232,16 @@ static ssize_t gadget_dev_desc_bcdUSB_store(struct config_item *item,
|
|
|
|
static ssize_t gadget_dev_desc_UDC_show(struct config_item *item, char *page)
|
|
{
|
|
- char *udc_name = to_gadget_info(item)->composite.gadget_driver.udc_name;
|
|
+ struct gadget_info *gi = to_gadget_info(item);
|
|
+ char *udc_name;
|
|
+ int ret;
|
|
+
|
|
+ mutex_lock(&gi->lock);
|
|
+ udc_name = gi->composite.gadget_driver.udc_name;
|
|
+ ret = sprintf(page, "%s\n", udc_name ?: "");
|
|
+ mutex_unlock(&gi->lock);
|
|
|
|
- return sprintf(page, "%s\n", udc_name ?: "");
|
|
+ return ret;
|
|
}
|
|
|
|
static int unregister_gadget(struct gadget_info *gi)
|
|
@@ -1216,9 +1223,9 @@ static void purge_configs_funcs(struct gadget_info *gi)
|
|
|
|
cfg = container_of(c, struct config_usb_cfg, c);
|
|
|
|
- list_for_each_entry_safe(f, tmp, &c->functions, list) {
|
|
+ list_for_each_entry_safe_reverse(f, tmp, &c->functions, list) {
|
|
|
|
- list_move_tail(&f->list, &cfg->func_list);
|
|
+ list_move(&f->list, &cfg->func_list);
|
|
if (f->unbind) {
|
|
dev_dbg(&gi->cdev.gadget->dev,
|
|
"unbind function '%s'/%p\n",
|
|
@@ -1504,7 +1511,7 @@ static const struct usb_gadget_driver configfs_driver_template = {
|
|
.suspend = configfs_composite_suspend,
|
|
.resume = configfs_composite_resume,
|
|
|
|
- .max_speed = USB_SPEED_SUPER,
|
|
+ .max_speed = USB_SPEED_SUPER_PLUS,
|
|
.driver = {
|
|
.owner = THIS_MODULE,
|
|
.name = "configfs-gadget",
|
|
@@ -1544,7 +1551,7 @@ static struct config_group *gadgets_make(
|
|
gi->composite.unbind = configfs_do_nothing;
|
|
gi->composite.suspend = NULL;
|
|
gi->composite.resume = NULL;
|
|
- gi->composite.max_speed = USB_SPEED_SUPER;
|
|
+ gi->composite.max_speed = USB_SPEED_SUPER_PLUS;
|
|
|
|
spin_lock_init(&gi->spinlock);
|
|
mutex_init(&gi->lock);
|
|
diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c
|
|
index b2b43a5518786..fd2409d102d0e 100644
|
|
--- a/drivers/usb/gadget/function/f_printer.c
|
|
+++ b/drivers/usb/gadget/function/f_printer.c
|
|
@@ -1130,6 +1130,7 @@ fail_tx_reqs:
|
|
printer_req_free(dev->in_ep, req);
|
|
}
|
|
|
|
+ usb_free_all_descriptors(f);
|
|
return ret;
|
|
|
|
}
|
|
diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
|
|
index d063f0401f847..0f66ba0b79800 100644
|
|
--- a/drivers/usb/gadget/function/f_uac2.c
|
|
+++ b/drivers/usb/gadget/function/f_uac2.c
|
|
@@ -279,7 +279,7 @@ static struct usb_endpoint_descriptor fs_epout_desc = {
|
|
|
|
.bEndpointAddress = USB_DIR_OUT,
|
|
.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
|
|
- .wMaxPacketSize = cpu_to_le16(1023),
|
|
+ /* .wMaxPacketSize = DYNAMIC */
|
|
.bInterval = 1,
|
|
};
|
|
|
|
@@ -288,7 +288,7 @@ static struct usb_endpoint_descriptor hs_epout_desc = {
|
|
.bDescriptorType = USB_DT_ENDPOINT,
|
|
|
|
.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
|
|
- .wMaxPacketSize = cpu_to_le16(1024),
|
|
+ /* .wMaxPacketSize = DYNAMIC */
|
|
.bInterval = 4,
|
|
};
|
|
|
|
@@ -356,7 +356,7 @@ static struct usb_endpoint_descriptor fs_epin_desc = {
|
|
|
|
.bEndpointAddress = USB_DIR_IN,
|
|
.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
|
|
- .wMaxPacketSize = cpu_to_le16(1023),
|
|
+ /* .wMaxPacketSize = DYNAMIC */
|
|
.bInterval = 1,
|
|
};
|
|
|
|
@@ -365,7 +365,7 @@ static struct usb_endpoint_descriptor hs_epin_desc = {
|
|
.bDescriptorType = USB_DT_ENDPOINT,
|
|
|
|
.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
|
|
- .wMaxPacketSize = cpu_to_le16(1024),
|
|
+ /* .wMaxPacketSize = DYNAMIC */
|
|
.bInterval = 4,
|
|
};
|
|
|
|
@@ -452,12 +452,28 @@ struct cntrl_range_lay3 {
|
|
__le32 dRES;
|
|
} __packed;
|
|
|
|
-static void set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts,
|
|
+static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts,
|
|
struct usb_endpoint_descriptor *ep_desc,
|
|
- unsigned int factor, bool is_playback)
|
|
+ enum usb_device_speed speed, bool is_playback)
|
|
{
|
|
int chmask, srate, ssize;
|
|
- u16 max_packet_size;
|
|
+ u16 max_size_bw, max_size_ep;
|
|
+ unsigned int factor;
|
|
+
|
|
+ switch (speed) {
|
|
+ case USB_SPEED_FULL:
|
|
+ max_size_ep = 1023;
|
|
+ factor = 1000;
|
|
+ break;
|
|
+
|
|
+ case USB_SPEED_HIGH:
|
|
+ max_size_ep = 1024;
|
|
+ factor = 8000;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return -EINVAL;
|
|
+ }
|
|
|
|
if (is_playback) {
|
|
chmask = uac2_opts->p_chmask;
|
|
@@ -469,10 +485,12 @@ static void set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts,
|
|
ssize = uac2_opts->c_ssize;
|
|
}
|
|
|
|
- max_packet_size = num_channels(chmask) * ssize *
|
|
+ max_size_bw = num_channels(chmask) * ssize *
|
|
DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1)));
|
|
- ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_packet_size,
|
|
- le16_to_cpu(ep_desc->wMaxPacketSize)));
|
|
+ ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_size_bw,
|
|
+ max_size_ep));
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static int
|
|
@@ -555,10 +573,33 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
|
|
uac2->as_in_alt = 0;
|
|
|
|
/* Calculate wMaxPacketSize according to audio bandwidth */
|
|
- set_ep_max_packet_size(uac2_opts, &fs_epin_desc, 1000, true);
|
|
- set_ep_max_packet_size(uac2_opts, &fs_epout_desc, 1000, false);
|
|
- set_ep_max_packet_size(uac2_opts, &hs_epin_desc, 8000, true);
|
|
- set_ep_max_packet_size(uac2_opts, &hs_epout_desc, 8000, false);
|
|
+ ret = set_ep_max_packet_size(uac2_opts, &fs_epin_desc, USB_SPEED_FULL,
|
|
+ true);
|
|
+ if (ret < 0) {
|
|
+ dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ ret = set_ep_max_packet_size(uac2_opts, &fs_epout_desc, USB_SPEED_FULL,
|
|
+ false);
|
|
+ if (ret < 0) {
|
|
+ dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ ret = set_ep_max_packet_size(uac2_opts, &hs_epin_desc, USB_SPEED_HIGH,
|
|
+ true);
|
|
+ if (ret < 0) {
|
|
+ dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ ret = set_ep_max_packet_size(uac2_opts, &hs_epout_desc, USB_SPEED_HIGH,
|
|
+ false);
|
|
+ if (ret < 0) {
|
|
+ dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
|
|
+ return ret;
|
|
+ }
|
|
|
|
agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
|
|
if (!agdev->out_ep) {
|
|
diff --git a/drivers/usb/gadget/legacy/acm_ms.c b/drivers/usb/gadget/legacy/acm_ms.c
|
|
index c39de65a448ba..270bb88c51cb4 100644
|
|
--- a/drivers/usb/gadget/legacy/acm_ms.c
|
|
+++ b/drivers/usb/gadget/legacy/acm_ms.c
|
|
@@ -207,8 +207,10 @@ static int acm_ms_bind(struct usb_composite_dev *cdev)
|
|
struct usb_descriptor_header *usb_desc;
|
|
|
|
usb_desc = usb_otg_descriptor_alloc(gadget);
|
|
- if (!usb_desc)
|
|
+ if (!usb_desc) {
|
|
+ status = -ENOMEM;
|
|
goto fail_string_ids;
|
|
+ }
|
|
usb_otg_descriptor_init(gadget, usb_desc);
|
|
otg_desc[0] = usb_desc;
|
|
otg_desc[1] = NULL;
|
|
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
|
index cdf1c91554035..5d5741dc6abe5 100644
|
|
--- a/drivers/usb/host/xhci.c
|
|
+++ b/drivers/usb/host/xhci.c
|
|
@@ -4390,19 +4390,19 @@ static u16 xhci_calculate_u1_timeout(struct xhci_hcd *xhci,
|
|
{
|
|
unsigned long long timeout_ns;
|
|
|
|
+ if (xhci->quirks & XHCI_INTEL_HOST)
|
|
+ timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc);
|
|
+ else
|
|
+ timeout_ns = udev->u1_params.sel;
|
|
+
|
|
/* Prevent U1 if service interval is shorter than U1 exit latency */
|
|
if (usb_endpoint_xfer_int(desc) || usb_endpoint_xfer_isoc(desc)) {
|
|
- if (xhci_service_interval_to_ns(desc) <= udev->u1_params.mel) {
|
|
+ if (xhci_service_interval_to_ns(desc) <= timeout_ns) {
|
|
dev_dbg(&udev->dev, "Disable U1, ESIT shorter than exit latency\n");
|
|
return USB3_LPM_DISABLED;
|
|
}
|
|
}
|
|
|
|
- if (xhci->quirks & XHCI_INTEL_HOST)
|
|
- timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc);
|
|
- else
|
|
- timeout_ns = udev->u1_params.sel;
|
|
-
|
|
/* The U1 timeout is encoded in 1us intervals.
|
|
* Don't return a timeout of zero, because that's USB3_LPM_DISABLED.
|
|
*/
|
|
@@ -4454,19 +4454,19 @@ static u16 xhci_calculate_u2_timeout(struct xhci_hcd *xhci,
|
|
{
|
|
unsigned long long timeout_ns;
|
|
|
|
+ if (xhci->quirks & XHCI_INTEL_HOST)
|
|
+ timeout_ns = xhci_calculate_intel_u2_timeout(udev, desc);
|
|
+ else
|
|
+ timeout_ns = udev->u2_params.sel;
|
|
+
|
|
/* Prevent U2 if service interval is shorter than U2 exit latency */
|
|
if (usb_endpoint_xfer_int(desc) || usb_endpoint_xfer_isoc(desc)) {
|
|
- if (xhci_service_interval_to_ns(desc) <= udev->u2_params.mel) {
|
|
+ if (xhci_service_interval_to_ns(desc) <= timeout_ns) {
|
|
dev_dbg(&udev->dev, "Disable U2, ESIT shorter than exit latency\n");
|
|
return USB3_LPM_DISABLED;
|
|
}
|
|
}
|
|
|
|
- if (xhci->quirks & XHCI_INTEL_HOST)
|
|
- timeout_ns = xhci_calculate_intel_u2_timeout(udev, desc);
|
|
- else
|
|
- timeout_ns = udev->u2_params.sel;
|
|
-
|
|
/* The U2 timeout is encoded in 256us intervals */
|
|
timeout_ns = DIV_ROUND_UP_ULL(timeout_ns, 256 * 1000);
|
|
/* If the necessary timeout value is bigger than what we can set in the
|
|
diff --git a/drivers/usb/misc/yurex.c b/drivers/usb/misc/yurex.c
|
|
index cf4a7ef4e663d..f9d5e0c60ef69 100644
|
|
--- a/drivers/usb/misc/yurex.c
|
|
+++ b/drivers/usb/misc/yurex.c
|
|
@@ -501,6 +501,9 @@ static ssize_t yurex_write(struct file *file, const char __user *user_buffer,
|
|
timeout = schedule_timeout(YUREX_WRITE_TIMEOUT);
|
|
finish_wait(&dev->waitq, &wait);
|
|
|
|
+ /* make sure URB is idle after timeout or (spurious) CMD_ACK */
|
|
+ usb_kill_urb(dev->cntl_urb);
|
|
+
|
|
mutex_unlock(&dev->io_mutex);
|
|
|
|
if (retval < 0) {
|
|
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c
|
|
index 0c9e24b217f7d..4681cd2bd8843 100644
|
|
--- a/drivers/usb/serial/iuu_phoenix.c
|
|
+++ b/drivers/usb/serial/iuu_phoenix.c
|
|
@@ -543,23 +543,29 @@ static int iuu_uart_flush(struct usb_serial_port *port)
|
|
struct device *dev = &port->dev;
|
|
int i;
|
|
int status;
|
|
- u8 rxcmd = IUU_UART_RX;
|
|
+ u8 *rxcmd;
|
|
struct iuu_private *priv = usb_get_serial_port_data(port);
|
|
|
|
if (iuu_led(port, 0xF000, 0, 0, 0xFF) < 0)
|
|
return -EIO;
|
|
|
|
+ rxcmd = kmalloc(1, GFP_KERNEL);
|
|
+ if (!rxcmd)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ rxcmd[0] = IUU_UART_RX;
|
|
+
|
|
for (i = 0; i < 2; i++) {
|
|
- status = bulk_immediate(port, &rxcmd, 1);
|
|
+ status = bulk_immediate(port, rxcmd, 1);
|
|
if (status != IUU_OPERATION_OK) {
|
|
dev_dbg(dev, "%s - uart_flush_write error\n", __func__);
|
|
- return status;
|
|
+ goto out_free;
|
|
}
|
|
|
|
status = read_immediate(port, &priv->len, 1);
|
|
if (status != IUU_OPERATION_OK) {
|
|
dev_dbg(dev, "%s - uart_flush_read error\n", __func__);
|
|
- return status;
|
|
+ goto out_free;
|
|
}
|
|
|
|
if (priv->len > 0) {
|
|
@@ -567,12 +573,16 @@ static int iuu_uart_flush(struct usb_serial_port *port)
|
|
status = read_immediate(port, priv->buf, priv->len);
|
|
if (status != IUU_OPERATION_OK) {
|
|
dev_dbg(dev, "%s - uart_flush_read error\n", __func__);
|
|
- return status;
|
|
+ goto out_free;
|
|
}
|
|
}
|
|
}
|
|
dev_dbg(dev, "%s - uart_flush_read OK!\n", __func__);
|
|
iuu_led(port, 0, 0xF000, 0, 0xFF);
|
|
+
|
|
+out_free:
|
|
+ kfree(rxcmd);
|
|
+
|
|
return status;
|
|
}
|
|
|
|
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c
|
|
index 30e5050ee4868..d8fda63cfb209 100644
|
|
--- a/drivers/usb/serial/keyspan_pda.c
|
|
+++ b/drivers/usb/serial/keyspan_pda.c
|
|
@@ -559,10 +559,8 @@ exit:
|
|
static void keyspan_pda_write_bulk_callback(struct urb *urb)
|
|
{
|
|
struct usb_serial_port *port = urb->context;
|
|
- struct keyspan_pda_private *priv;
|
|
|
|
set_bit(0, &port->write_urbs_free);
|
|
- priv = usb_get_serial_port_data(port);
|
|
|
|
/* queue up a wakeup at scheduler time */
|
|
usb_serial_port_softint(port);
|
|
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
|
|
index 9e5fe0d2ae665..27549e80e0b16 100644
|
|
--- a/drivers/usb/serial/option.c
|
|
+++ b/drivers/usb/serial/option.c
|
|
@@ -1120,6 +1120,8 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0xff, 0xff),
|
|
.driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0, 0) },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 0x0620, 0xff, 0xff, 0x30) }, /* EM160R-GL */
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 0x0620, 0xff, 0, 0) },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x30) },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10),
|
|
@@ -2059,6 +2061,7 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0105, 0xff), /* Fibocom NL678 series */
|
|
.driver_info = RSVD(6) },
|
|
{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */
|
|
+ { USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) }, /* LongSung M5710 */
|
|
{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) }, /* GosunCn GM500 RNDIS */
|
|
{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) }, /* GosunCn GM500 MBIM */
|
|
{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) }, /* GosunCn GM500 ECM/NCM */
|
|
diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h
|
|
index 61891c2dc9fcc..5705201e5707c 100644
|
|
--- a/drivers/usb/storage/unusual_uas.h
|
|
+++ b/drivers/usb/storage/unusual_uas.h
|
|
@@ -166,6 +166,13 @@ UNUSUAL_DEV(0x152d, 0x0578, 0x0000, 0x9999,
|
|
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
|
US_FL_BROKEN_FUA),
|
|
|
|
+/* Reported-by: Thinh Nguyen <thinhn@synopsys.com> */
|
|
+UNUSUAL_DEV(0x154b, 0xf00b, 0x0000, 0x9999,
|
|
+ "PNY",
|
|
+ "Pro Elite SSD",
|
|
+ USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
|
+ US_FL_NO_ATA_1X),
|
|
+
|
|
/* Reported-by: Thinh Nguyen <thinhn@synopsys.com> */
|
|
UNUSUAL_DEV(0x154b, 0xf00d, 0x0000, 0x9999,
|
|
"PNY",
|
|
diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c
|
|
index 253e0affd3965..ba1dcd222d7fa 100644
|
|
--- a/drivers/usb/usbip/vhci_hcd.c
|
|
+++ b/drivers/usb/usbip/vhci_hcd.c
|
|
@@ -410,6 +410,8 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|
default:
|
|
usbip_dbg_vhci_rh(" ClearPortFeature: default %x\n",
|
|
wValue);
|
|
+ if (wValue >= 32)
|
|
+ goto error;
|
|
vhci_hcd->port_status[rhport] &= ~(1 << wValue);
|
|
break;
|
|
}
|
|
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
|
|
index 8fe07622ae59e..66212ba07cbc6 100644
|
|
--- a/drivers/vhost/net.c
|
|
+++ b/drivers/vhost/net.c
|
|
@@ -466,6 +466,7 @@ static void handle_tx(struct vhost_net *net)
|
|
size_t hdr_size;
|
|
struct socket *sock;
|
|
struct vhost_net_ubuf_ref *uninitialized_var(ubufs);
|
|
+ struct ubuf_info *ubuf;
|
|
bool zcopy, zcopy_used;
|
|
int sent_pkts = 0;
|
|
|
|
@@ -532,9 +533,7 @@ static void handle_tx(struct vhost_net *net)
|
|
|
|
/* use msg_control to pass vhost zerocopy ubuf info to skb */
|
|
if (zcopy_used) {
|
|
- struct ubuf_info *ubuf;
|
|
ubuf = nvq->ubuf_info + nvq->upend_idx;
|
|
-
|
|
vq->heads[nvq->upend_idx].id = cpu_to_vhost32(vq, head);
|
|
vq->heads[nvq->upend_idx].len = VHOST_DMA_IN_PROGRESS;
|
|
ubuf->callback = vhost_zerocopy_callback;
|
|
@@ -563,7 +562,8 @@ static void handle_tx(struct vhost_net *net)
|
|
err = sock->ops->sendmsg(sock, &msg, len);
|
|
if (unlikely(err < 0)) {
|
|
if (zcopy_used) {
|
|
- vhost_net_ubuf_put(ubufs);
|
|
+ if (vq->heads[ubuf->desc].len == VHOST_DMA_IN_PROGRESS)
|
|
+ vhost_net_ubuf_put(ubufs);
|
|
nvq->upend_idx = ((unsigned)nvq->upend_idx - 1)
|
|
% UIO_MAXIOV;
|
|
}
|
|
diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c
|
|
index f3938c5278832..6e680007cf6b0 100644
|
|
--- a/drivers/video/fbdev/hyperv_fb.c
|
|
+++ b/drivers/video/fbdev/hyperv_fb.c
|
|
@@ -713,11 +713,9 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
|
|
}
|
|
|
|
/*
|
|
- * Map the VRAM cacheable for performance. This is also required for
|
|
- * VM Connect to display properly for ARM64 Linux VM, as the host also
|
|
- * maps the VRAM cacheable.
|
|
+ * Map the VRAM cacheable for performance.
|
|
*/
|
|
- fb_virt = ioremap_cache(par->mem->start, screen_fb_size);
|
|
+ fb_virt = ioremap_wc(par->mem->start, screen_fb_size);
|
|
if (!fb_virt)
|
|
goto err2;
|
|
|
|
diff --git a/include/net/red.h b/include/net/red.h
|
|
index 9665582c4687e..e21e7fd4fe077 100644
|
|
--- a/include/net/red.h
|
|
+++ b/include/net/red.h
|
|
@@ -168,12 +168,14 @@ static inline void red_set_vars(struct red_vars *v)
|
|
v->qcount = -1;
|
|
}
|
|
|
|
-static inline bool red_check_params(u32 qth_min, u32 qth_max, u8 Wlog)
|
|
+static inline bool red_check_params(u32 qth_min, u32 qth_max, u8 Wlog, u8 Scell_log)
|
|
{
|
|
if (fls(qth_min) + Wlog > 32)
|
|
return false;
|
|
if (fls(qth_max) + Wlog > 32)
|
|
return false;
|
|
+ if (Scell_log >= 32)
|
|
+ return false;
|
|
if (qth_max < qth_min)
|
|
return false;
|
|
return true;
|
|
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
|
|
index 18fae55713b0a..79fcec674485f 100644
|
|
--- a/kernel/workqueue.c
|
|
+++ b/kernel/workqueue.c
|
|
@@ -3494,17 +3494,24 @@ static void pwq_adjust_max_active(struct pool_workqueue *pwq)
|
|
* is updated and visible.
|
|
*/
|
|
if (!freezable || !workqueue_freezing) {
|
|
+ bool kick = false;
|
|
+
|
|
pwq->max_active = wq->saved_max_active;
|
|
|
|
while (!list_empty(&pwq->delayed_works) &&
|
|
- pwq->nr_active < pwq->max_active)
|
|
+ pwq->nr_active < pwq->max_active) {
|
|
pwq_activate_first_delayed(pwq);
|
|
+ kick = true;
|
|
+ }
|
|
|
|
/*
|
|
* Need to kick a worker after thawed or an unbound wq's
|
|
- * max_active is bumped. It's a slow path. Do it always.
|
|
+ * max_active is bumped. In realtime scenarios, always kicking a
|
|
+ * worker will cause interference on the isolated cpu cores, so
|
|
+ * let's kick iff work items were activated.
|
|
*/
|
|
- wake_up_worker(pwq->pool);
|
|
+ if (kick)
|
|
+ wake_up_worker(pwq->pool);
|
|
} else {
|
|
pwq->max_active = 0;
|
|
}
|
|
diff --git a/lib/genalloc.c b/lib/genalloc.c
|
|
index 7e85d1e37a6ea..0b8ee173cf3a6 100644
|
|
--- a/lib/genalloc.c
|
|
+++ b/lib/genalloc.c
|
|
@@ -83,14 +83,14 @@ static int clear_bits_ll(unsigned long *addr, unsigned long mask_to_clear)
|
|
* users set the same bit, one user will return remain bits, otherwise
|
|
* return 0.
|
|
*/
|
|
-static int bitmap_set_ll(unsigned long *map, int start, int nr)
|
|
+static int bitmap_set_ll(unsigned long *map, unsigned long start, unsigned long nr)
|
|
{
|
|
unsigned long *p = map + BIT_WORD(start);
|
|
- const int size = start + nr;
|
|
+ const unsigned long size = start + nr;
|
|
int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);
|
|
unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start);
|
|
|
|
- while (nr - bits_to_set >= 0) {
|
|
+ while (nr >= bits_to_set) {
|
|
if (set_bits_ll(p, mask_to_set))
|
|
return nr;
|
|
nr -= bits_to_set;
|
|
@@ -118,14 +118,15 @@ static int bitmap_set_ll(unsigned long *map, int start, int nr)
|
|
* users clear the same bit, one user will return remain bits,
|
|
* otherwise return 0.
|
|
*/
|
|
-static int bitmap_clear_ll(unsigned long *map, int start, int nr)
|
|
+static unsigned long
|
|
+bitmap_clear_ll(unsigned long *map, unsigned long start, unsigned long nr)
|
|
{
|
|
unsigned long *p = map + BIT_WORD(start);
|
|
- const int size = start + nr;
|
|
+ const unsigned long size = start + nr;
|
|
int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG);
|
|
unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start);
|
|
|
|
- while (nr - bits_to_clear >= 0) {
|
|
+ while (nr >= bits_to_clear) {
|
|
if (clear_bits_ll(p, mask_to_clear))
|
|
return nr;
|
|
nr -= bits_to_clear;
|
|
@@ -184,8 +185,8 @@ int gen_pool_add_virt(struct gen_pool *pool, unsigned long virt, phys_addr_t phy
|
|
size_t size, int nid)
|
|
{
|
|
struct gen_pool_chunk *chunk;
|
|
- int nbits = size >> pool->min_alloc_order;
|
|
- int nbytes = sizeof(struct gen_pool_chunk) +
|
|
+ unsigned long nbits = size >> pool->min_alloc_order;
|
|
+ unsigned long nbytes = sizeof(struct gen_pool_chunk) +
|
|
BITS_TO_LONGS(nbits) * sizeof(long);
|
|
|
|
chunk = vzalloc_node(nbytes, nid);
|
|
@@ -242,7 +243,7 @@ void gen_pool_destroy(struct gen_pool *pool)
|
|
struct list_head *_chunk, *_next_chunk;
|
|
struct gen_pool_chunk *chunk;
|
|
int order = pool->min_alloc_order;
|
|
- int bit, end_bit;
|
|
+ unsigned long bit, end_bit;
|
|
|
|
list_for_each_safe(_chunk, _next_chunk, &pool->chunks) {
|
|
chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk);
|
|
@@ -293,7 +294,7 @@ unsigned long gen_pool_alloc_algo(struct gen_pool *pool, size_t size,
|
|
struct gen_pool_chunk *chunk;
|
|
unsigned long addr = 0;
|
|
int order = pool->min_alloc_order;
|
|
- int nbits, start_bit, end_bit, remain;
|
|
+ unsigned long nbits, start_bit, end_bit, remain;
|
|
|
|
#ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG
|
|
BUG_ON(in_nmi());
|
|
@@ -376,7 +377,7 @@ void gen_pool_free(struct gen_pool *pool, unsigned long addr, size_t size)
|
|
{
|
|
struct gen_pool_chunk *chunk;
|
|
int order = pool->min_alloc_order;
|
|
- int start_bit, nbits, remain;
|
|
+ unsigned long start_bit, nbits, remain;
|
|
|
|
#ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG
|
|
BUG_ON(in_nmi());
|
|
@@ -638,7 +639,7 @@ unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
|
|
index = bitmap_find_next_zero_area(map, size, start, nr, 0);
|
|
|
|
while (index < size) {
|
|
- int next_bit = find_next_bit(map, size, index + nr);
|
|
+ unsigned long next_bit = find_next_bit(map, size, index + nr);
|
|
if ((next_bit - index) < len) {
|
|
len = next_bit - index;
|
|
start_bit = index;
|
|
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
|
|
index 9d012255cedc4..7d8c6ba5cbd22 100644
|
|
--- a/net/core/net-sysfs.c
|
|
+++ b/net/core/net-sysfs.c
|
|
@@ -1207,23 +1207,30 @@ static const struct attribute_group dql_group = {
|
|
static ssize_t xps_cpus_show(struct netdev_queue *queue,
|
|
char *buf)
|
|
{
|
|
+ int cpu, len, ret, num_tc = 1, tc = 0;
|
|
struct net_device *dev = queue->dev;
|
|
- int cpu, len, num_tc = 1, tc = 0;
|
|
struct xps_dev_maps *dev_maps;
|
|
cpumask_var_t mask;
|
|
unsigned long index;
|
|
|
|
index = get_netdev_queue_index(queue);
|
|
|
|
+ if (!rtnl_trylock())
|
|
+ return restart_syscall();
|
|
+
|
|
if (dev->num_tc) {
|
|
num_tc = dev->num_tc;
|
|
tc = netdev_txq_to_tc(dev, index);
|
|
- if (tc < 0)
|
|
- return -EINVAL;
|
|
+ if (tc < 0) {
|
|
+ ret = -EINVAL;
|
|
+ goto err_rtnl_unlock;
|
|
+ }
|
|
}
|
|
|
|
- if (!zalloc_cpumask_var(&mask, GFP_KERNEL))
|
|
- return -ENOMEM;
|
|
+ if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) {
|
|
+ ret = -ENOMEM;
|
|
+ goto err_rtnl_unlock;
|
|
+ }
|
|
|
|
rcu_read_lock();
|
|
dev_maps = rcu_dereference(dev->xps_maps);
|
|
@@ -1246,9 +1253,15 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue,
|
|
}
|
|
rcu_read_unlock();
|
|
|
|
+ rtnl_unlock();
|
|
+
|
|
len = snprintf(buf, PAGE_SIZE, "%*pb\n", cpumask_pr_args(mask));
|
|
free_cpumask_var(mask);
|
|
return len < PAGE_SIZE ? len : -EINVAL;
|
|
+
|
|
+err_rtnl_unlock:
|
|
+ rtnl_unlock();
|
|
+ return ret;
|
|
}
|
|
|
|
static ssize_t xps_cpus_store(struct netdev_queue *queue,
|
|
@@ -1273,7 +1286,13 @@ static ssize_t xps_cpus_store(struct netdev_queue *queue,
|
|
return err;
|
|
}
|
|
|
|
+ if (!rtnl_trylock()) {
|
|
+ free_cpumask_var(mask);
|
|
+ return restart_syscall();
|
|
+ }
|
|
+
|
|
err = netif_set_xps_queue(dev, mask, index);
|
|
+ rtnl_unlock();
|
|
|
|
free_cpumask_var(mask);
|
|
|
|
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
|
|
index ff499000f6cdd..ee467d744b07d 100644
|
|
--- a/net/ipv4/fib_frontend.c
|
|
+++ b/net/ipv4/fib_frontend.c
|
|
@@ -292,7 +292,7 @@ __be32 fib_compute_spec_dst(struct sk_buff *skb)
|
|
.flowi4_iif = LOOPBACK_IFINDEX,
|
|
.flowi4_oif = l3mdev_master_ifindex_rcu(dev),
|
|
.daddr = ip_hdr(skb)->saddr,
|
|
- .flowi4_tos = RT_TOS(ip_hdr(skb)->tos),
|
|
+ .flowi4_tos = ip_hdr(skb)->tos & IPTOS_RT_MASK,
|
|
.flowi4_scope = scope,
|
|
.flowi4_mark = vmark ? skb->mark : 0,
|
|
};
|
|
diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c
|
|
index 927dad4759d1c..bbedcf48d71c2 100644
|
|
--- a/net/ncsi/ncsi-rsp.c
|
|
+++ b/net/ncsi/ncsi-rsp.c
|
|
@@ -983,7 +983,7 @@ int ncsi_rcv_rsp(struct sk_buff *skb, struct net_device *dev,
|
|
int payload, i, ret;
|
|
|
|
/* Find the NCSI device */
|
|
- nd = ncsi_find_dev(dev);
|
|
+ nd = ncsi_find_dev(orig_dev);
|
|
ndp = nd ? TO_NCSI_DEV_PRIV(nd) : NULL;
|
|
if (!ndp)
|
|
return -ENODEV;
|
|
diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h
|
|
index 42d9cd22447e8..cd91c30f3e180 100644
|
|
--- a/net/netfilter/ipset/ip_set_hash_gen.h
|
|
+++ b/net/netfilter/ipset/ip_set_hash_gen.h
|
|
@@ -115,20 +115,6 @@ htable_size(u8 hbits)
|
|
return hsize * sizeof(struct hbucket *) + sizeof(struct htable);
|
|
}
|
|
|
|
-/* Compute htable_bits from the user input parameter hashsize */
|
|
-static u8
|
|
-htable_bits(u32 hashsize)
|
|
-{
|
|
- /* Assume that hashsize == 2^htable_bits */
|
|
- u8 bits = fls(hashsize - 1);
|
|
-
|
|
- if (jhash_size(bits) != hashsize)
|
|
- /* Round up to the first 2^n value */
|
|
- bits = fls(hashsize);
|
|
-
|
|
- return bits;
|
|
-}
|
|
-
|
|
#ifdef IP_SET_HASH_WITH_NETS
|
|
#if IPSET_NET_COUNT > 1
|
|
#define __CIDR(cidr, i) (cidr[i])
|
|
@@ -1294,7 +1280,11 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set,
|
|
if (!h)
|
|
return -ENOMEM;
|
|
|
|
- hbits = htable_bits(hashsize);
|
|
+ /* Compute htable_bits from the user input parameter hashsize.
|
|
+ * Assume that hashsize == 2^htable_bits,
|
|
+ * otherwise round up to the first 2^n value.
|
|
+ */
|
|
+ hbits = fls(hashsize - 1);
|
|
hsize = htable_size(hbits);
|
|
if (hsize == 0) {
|
|
kfree(h);
|
|
diff --git a/net/netfilter/xt_RATEEST.c b/net/netfilter/xt_RATEEST.c
|
|
index 141c295191f65..1c6683dfbc5b9 100644
|
|
--- a/net/netfilter/xt_RATEEST.c
|
|
+++ b/net/netfilter/xt_RATEEST.c
|
|
@@ -106,6 +106,9 @@ static int xt_rateest_tg_checkentry(const struct xt_tgchk_param *par)
|
|
} cfg;
|
|
int ret;
|
|
|
|
+ if (strnlen(info->name, sizeof(est->name)) >= sizeof(est->name))
|
|
+ return -ENAMETOOLONG;
|
|
+
|
|
net_get_random_once(&jhash_rnd, sizeof(jhash_rnd));
|
|
|
|
mutex_lock(&xt_rateest_mutex);
|
|
diff --git a/net/sched/sch_choke.c b/net/sched/sch_choke.c
|
|
index 5a98618b47e86..777475f7f29c4 100644
|
|
--- a/net/sched/sch_choke.c
|
|
+++ b/net/sched/sch_choke.c
|
|
@@ -370,7 +370,7 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt)
|
|
|
|
ctl = nla_data(tb[TCA_CHOKE_PARMS]);
|
|
|
|
- if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog))
|
|
+ if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, ctl->Scell_log))
|
|
return -EINVAL;
|
|
|
|
if (ctl->limit > CHOKE_MAX_QUEUE)
|
|
diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c
|
|
index d3105ee8decfb..357dec26f2fdc 100644
|
|
--- a/net/sched/sch_gred.c
|
|
+++ b/net/sched/sch_gred.c
|
|
@@ -356,7 +356,7 @@ static inline int gred_change_vq(struct Qdisc *sch, int dp,
|
|
struct gred_sched *table = qdisc_priv(sch);
|
|
struct gred_sched_data *q = table->tab[dp];
|
|
|
|
- if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog))
|
|
+ if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, ctl->Scell_log))
|
|
return -EINVAL;
|
|
|
|
if (!q) {
|
|
diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c
|
|
index c453b8d81c9e3..6e6397bda49be 100644
|
|
--- a/net/sched/sch_red.c
|
|
+++ b/net/sched/sch_red.c
|
|
@@ -184,7 +184,7 @@ static int red_change(struct Qdisc *sch, struct nlattr *opt)
|
|
max_P = tb[TCA_RED_MAX_P] ? nla_get_u32(tb[TCA_RED_MAX_P]) : 0;
|
|
|
|
ctl = nla_data(tb[TCA_RED_PARMS]);
|
|
- if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog))
|
|
+ if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, ctl->Scell_log))
|
|
return -EINVAL;
|
|
|
|
if (ctl->limit > 0) {
|
|
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
|
|
index 1eae4de319b3d..2104fe7267e15 100644
|
|
--- a/net/sched/sch_sfq.c
|
|
+++ b/net/sched/sch_sfq.c
|
|
@@ -649,7 +649,7 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt)
|
|
}
|
|
|
|
if (ctl_v1 && !red_check_params(ctl_v1->qth_min, ctl_v1->qth_max,
|
|
- ctl_v1->Wlog))
|
|
+ ctl_v1->Wlog, ctl_v1->Scell_log))
|
|
return -EINVAL;
|
|
if (ctl_v1 && ctl_v1->qth_min) {
|
|
p = kmalloc(sizeof(*p), GFP_KERNEL);
|
|
diff --git a/scripts/depmod.sh b/scripts/depmod.sh
|
|
index cf5b2b24b3cf1..c7b8f827c4b09 100755
|
|
--- a/scripts/depmod.sh
|
|
+++ b/scripts/depmod.sh
|
|
@@ -15,6 +15,8 @@ if ! test -r System.map ; then
|
|
exit 0
|
|
fi
|
|
|
|
+# legacy behavior: "depmod" in /sbin, no /sbin in PATH
|
|
+PATH="$PATH:/sbin"
|
|
if [ -z $(command -v $DEPMOD) ]; then
|
|
echo "Warning: 'make modules_install' requires $DEPMOD. Please install it." >&2
|
|
echo "This is probably in the kmod package." >&2
|
|
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
|
|
index 9cc9304ff21a7..079b035b77c77 100644
|
|
--- a/sound/pci/hda/patch_conexant.c
|
|
+++ b/sound/pci/hda/patch_conexant.c
|
|
@@ -1118,6 +1118,7 @@ static int patch_conexant_auto(struct hda_codec *codec)
|
|
static const struct hda_device_id snd_hda_id_conexant[] = {
|
|
HDA_CODEC_ENTRY(0x14f11f86, "CX8070", patch_conexant_auto),
|
|
HDA_CODEC_ENTRY(0x14f12008, "CX8200", patch_conexant_auto),
|
|
+ HDA_CODEC_ENTRY(0x14f120d0, "CX11970", patch_conexant_auto),
|
|
HDA_CODEC_ENTRY(0x14f15045, "CX20549 (Venice)", patch_conexant_auto),
|
|
HDA_CODEC_ENTRY(0x14f15047, "CX20551 (Waikiki)", patch_conexant_auto),
|
|
HDA_CODEC_ENTRY(0x14f15051, "CX20561 (Hermosa)", patch_conexant_auto),
|
|
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
|
index a18be8394715e..a893682554c6e 100644
|
|
--- a/sound/pci/hda/patch_realtek.c
|
|
+++ b/sound/pci/hda/patch_realtek.c
|
|
@@ -5510,6 +5510,7 @@ enum {
|
|
ALC221_FIXUP_HP_FRONT_MIC,
|
|
ALC292_FIXUP_TPT460,
|
|
ALC298_FIXUP_SPK_VOLUME,
|
|
+ ALC298_FIXUP_LENOVO_SPK_VOLUME,
|
|
ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
|
|
ALC269_FIXUP_ATIV_BOOK_8,
|
|
ALC221_FIXUP_HP_MIC_NO_PRESENCE,
|
|
@@ -6261,6 +6262,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
|
.chained = true,
|
|
.chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
|
|
},
|
|
+ [ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
|
|
+ .type = HDA_FIXUP_FUNC,
|
|
+ .v.func = alc298_fixup_speaker_volume,
|
|
+ },
|
|
[ALC295_FIXUP_DISABLE_DAC3] = {
|
|
.type = HDA_FIXUP_FUNC,
|
|
.v.func = alc295_fixup_disable_dac3,
|
|
@@ -6662,6 +6667,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
|
|
SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
|
|
SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
|
|
+ SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME),
|
|
SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
|
|
SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
|
|
SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
|
|
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
|
|
index a3d1c0c1b4a67..74161c13fa158 100644
|
|
--- a/sound/usb/midi.c
|
|
+++ b/sound/usb/midi.c
|
|
@@ -1867,6 +1867,8 @@ static int snd_usbmidi_get_ms_info(struct snd_usb_midi *umidi,
|
|
ms_ep = find_usb_ms_endpoint_descriptor(hostep);
|
|
if (!ms_ep)
|
|
continue;
|
|
+ if (ms_ep->bNumEmbMIDIJack > 0x10)
|
|
+ continue;
|
|
if (usb_endpoint_dir_out(ep)) {
|
|
if (endpoints[epidx].out_ep) {
|
|
if (++epidx >= MIDI_MAX_ENDPOINTS) {
|
|
@@ -2119,6 +2121,8 @@ static int snd_usbmidi_detect_roland(struct snd_usb_midi *umidi,
|
|
cs_desc[1] == USB_DT_CS_INTERFACE &&
|
|
cs_desc[2] == 0xf1 &&
|
|
cs_desc[3] == 0x02) {
|
|
+ if (cs_desc[4] > 0x10 || cs_desc[5] > 0x10)
|
|
+ continue;
|
|
endpoint->in_cables = (1 << cs_desc[4]) - 1;
|
|
endpoint->out_cables = (1 << cs_desc[5]) - 1;
|
|
return snd_usbmidi_detect_endpoints(umidi, endpoint, 1);
|