-LINUX_VERSION-6.6 = .86
-LINUX_KERNEL_HASH-6.6.86 = 49e3ad7423e40735faada0cd39665c071d47efd84ec3548acf119c9704f13e68
+LINUX_VERSION-6.6 = .87
+LINUX_KERNEL_HASH-6.6.87 = 8957e5c2dacdbc47a16dbf1f6303ca7088409be6197a3881f752313275357ac6
writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
return 0;
-@@ -1536,6 +1551,7 @@ static int brcm_pcie_probe(struct platfo
+@@ -1537,6 +1552,7 @@ static int brcm_pcie_probe(struct platfo
pcie->gen = (ret < 0) ? 0 : ret;
pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
return 0;
}
-@@ -1207,6 +1534,7 @@ static void brcm_pcie_enter_l23(struct b
+@@ -1208,6 +1535,7 @@ static void brcm_pcie_enter_l23(struct b
static int brcm_phy_cntl(struct brcm_pcie *pcie, const int start)
{
static const u32 shifts[PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_NFLDS] = {
PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_PWRDN_SHIFT,
PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_RESET_SHIFT,
-@@ -1239,6 +1567,9 @@ static int brcm_phy_cntl(struct brcm_pci
+@@ -1240,6 +1568,9 @@ static int brcm_phy_cntl(struct brcm_pci
dev_err(pcie->dev, "failed to %s phy\n", (start ? "start" : "stop"));
return ret;
}
static inline int brcm_phy_start(struct brcm_pcie *pcie)
-@@ -1271,6 +1602,12 @@ static void brcm_pcie_turn_off(struct br
+@@ -1272,6 +1603,12 @@ static void brcm_pcie_turn_off(struct br
u32p_replace_bits(&tmp, 1, PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK);
writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
/* Shutdown PCIe bridge */
pcie->bridge_sw_init_set(pcie, 1);
}
-@@ -1301,9 +1638,9 @@ static int brcm_pcie_suspend_noirq(struc
+@@ -1302,9 +1639,9 @@ static int brcm_pcie_suspend_noirq(struc
if (brcm_phy_stop(pcie))
dev_err(dev, "Could not stop phy for suspend\n");
return ret;
}
-@@ -1398,7 +1735,7 @@ err_regulator:
+@@ -1399,7 +1736,7 @@ err_regulator:
if (pcie->sr)
regulator_bulk_disable(pcie->sr->num_supplies, pcie->sr->supplies);
err_reset:
err_disable_clk:
clk_disable_unprepare(pcie->clk);
return ret;
-@@ -1410,8 +1747,8 @@ static void __brcm_pcie_remove(struct br
+@@ -1411,8 +1748,8 @@ static void __brcm_pcie_remove(struct br
brcm_pcie_turn_off(pcie);
if (brcm_phy_stop(pcie))
dev_err(pcie->dev, "Could not stop phy\n");
clk_disable_unprepare(pcie->clk);
}
-@@ -1429,12 +1766,16 @@ static const int pcie_offsets[] = {
+@@ -1430,12 +1767,16 @@ static const int pcie_offsets[] = {
[RGR1_SW_INIT_1] = 0x9210,
[EXT_CFG_INDEX] = 0x9000,
[EXT_CFG_DATA] = 0x9004,
};
static const struct pcie_cfg_data generic_cfg = {
-@@ -1442,6 +1783,7 @@ static const struct pcie_cfg_data generi
+@@ -1443,6 +1784,7 @@ static const struct pcie_cfg_data generi
.type = GENERIC,
.perst_set = brcm_pcie_perst_set_generic,
.bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
};
static const struct pcie_cfg_data bcm7425_cfg = {
-@@ -1449,6 +1791,7 @@ static const struct pcie_cfg_data bcm742
+@@ -1450,6 +1792,7 @@ static const struct pcie_cfg_data bcm742
.type = BCM7425,
.perst_set = brcm_pcie_perst_set_generic,
.bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
};
static const struct pcie_cfg_data bcm7435_cfg = {
-@@ -1463,12 +1806,15 @@ static const struct pcie_cfg_data bcm490
+@@ -1464,12 +1807,15 @@ static const struct pcie_cfg_data bcm490
.type = BCM4908,
.perst_set = brcm_pcie_perst_set_4908,
.bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
};
static const struct pcie_cfg_data bcm7278_cfg = {
-@@ -1476,6 +1822,7 @@ static const struct pcie_cfg_data bcm727
+@@ -1477,6 +1823,7 @@ static const struct pcie_cfg_data bcm727
.type = BCM7278,
.perst_set = brcm_pcie_perst_set_7278,
.bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_7278,
};
static const struct pcie_cfg_data bcm2711_cfg = {
-@@ -1483,10 +1830,27 @@ static const struct pcie_cfg_data bcm271
+@@ -1484,10 +1831,27 @@ static const struct pcie_cfg_data bcm271
.type = BCM2711,
.perst_set = brcm_pcie_perst_set_generic,
.bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
{ .compatible = "brcm,bcm4908-pcie", .data = &bcm4908_cfg },
{ .compatible = "brcm,bcm7211-pcie", .data = &generic_cfg },
{ .compatible = "brcm,bcm7278-pcie", .data = &bcm7278_cfg },
-@@ -1527,7 +1891,7 @@ static int brcm_pcie_probe(struct platfo
+@@ -1528,7 +1892,7 @@ static int brcm_pcie_probe(struct platfo
data = of_device_get_match_data(&pdev->dev);
if (!data) {
return -EINVAL;
}
-@@ -1538,6 +1902,7 @@ static int brcm_pcie_probe(struct platfo
+@@ -1539,6 +1903,7 @@ static int brcm_pcie_probe(struct platfo
pcie->type = data->type;
pcie->perst_set = data->perst_set;
pcie->bridge_sw_init_set = data->bridge_sw_init_set;
pcie->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(pcie->base))
-@@ -1568,14 +1933,20 @@ static int brcm_pcie_probe(struct platfo
+@@ -1569,14 +1934,20 @@ static int brcm_pcie_probe(struct platfo
clk_disable_unprepare(pcie->clk);
return PTR_ERR(pcie->perst_reset);
}
clk_disable_unprepare(pcie->clk);
return ret;
}
-@@ -1598,6 +1969,33 @@ static int brcm_pcie_probe(struct platfo
+@@ -1599,6 +1970,33 @@ static int brcm_pcie_probe(struct platfo
dev_err(pcie->dev, "probe of internal MSI failed");
goto fail;
}
}
bridge->ops = pcie->type == BCM7425 ? &brcm7425_pcie_ops : &brcm_pcie_ops;
-@@ -1614,6 +2012,8 @@ static int brcm_pcie_probe(struct platfo
+@@ -1615,6 +2013,8 @@ static int brcm_pcie_probe(struct platfo
return ret;
}
writel(tmp, base + PCIE_MISC_MISC_CTRL);
brcm_pcie_set_tc_qos(pcie);
-@@ -1917,6 +1918,7 @@ static int brcm_pcie_probe(struct platfo
+@@ -1918,6 +1919,7 @@ static int brcm_pcie_probe(struct platfo
pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
pcie->l1ss = of_property_read_bool(np, "brcm,enable-l1ss");
/*
* Wait for 100ms after PERST# deassertion; see PCIe CEM specification
-@@ -1919,6 +1940,7 @@ static int brcm_pcie_probe(struct platfo
+@@ -1920,6 +1941,7 @@ static int brcm_pcie_probe(struct platfo
pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
pcie->l1ss = of_property_read_bool(np, "brcm,enable-l1ss");
pcie->rcb_mps_mode = of_property_read_bool(np, "brcm,enable-mps-rcb");
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
-@@ -1932,6 +1932,7 @@ static void nvme_free_host_mem(struct nv
+@@ -1948,6 +1948,7 @@ static void nvme_free_host_mem(struct nv
dev->nr_host_mem_descs = 0;
}
static int __nvme_alloc_host_mem(struct nvme_dev *dev, u64 preferred,
u32 chunk_size)
{
-@@ -2000,9 +2001,11 @@ out:
+@@ -2016,9 +2017,11 @@ out:
dev->host_mem_descs = NULL;
return -ENOMEM;
}
u64 min_chunk = min_t(u64, preferred, PAGE_SIZE * MAX_ORDER_NR_PAGES);
u64 hmminds = max_t(u32, dev->ctrl.hmminds * 4096, PAGE_SIZE * 2);
u64 chunk_size;
-@@ -2015,6 +2018,7 @@ static int nvme_alloc_host_mem(struct nv
+@@ -2031,6 +2034,7 @@ static int nvme_alloc_host_mem(struct nv
nvme_free_host_mem(dev);
}
}
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
-@@ -968,9 +968,6 @@ static int pci_register_host_bridge(stru
+@@ -967,9 +967,6 @@ static int pci_register_host_bridge(stru
else
pr_info("PCI host bridge to bus %s\n", name);
--- a/drivers/net/usb/rndis_host.c
+++ b/drivers/net/usb/rndis_host.c
-@@ -630,6 +630,16 @@ static const struct driver_info zte_rndi
+@@ -640,6 +640,16 @@ static const struct driver_info wwan_rnd
.tx_fixup = rndis_tx_fixup,
};
/*-------------------------------------------------------------------------*/
static const struct usb_device_id products [] = {
-@@ -666,6 +676,36 @@ static const struct usb_device_id produc
+@@ -676,6 +686,36 @@ static const struct usb_device_id produc
USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
.driver_info = (unsigned long) &rndis_info,
}, {
+ USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
+ .driver_info = (unsigned long) &asr_rndis_info,
+}, {
- /* Novatel Verizon USB730L */
- USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1),
- .driver_info = (unsigned long) &rndis_info,
+ /* Mobile Broadband Modem, seen in Novatel Verizon USB730L and
+ * Telit FN990A (RNDIS)
+ */
static const struct rt6_info ip6_blk_hole_entry_template = {
.dst = {
.__rcuref = RCUREF_INIT(1),
-@@ -1043,6 +1057,7 @@ static const int fib6_prop[RTN_MAX + 1]
+@@ -1077,6 +1091,7 @@ static const int fib6_prop[RTN_MAX + 1]
[RTN_BLACKHOLE] = -EINVAL,
[RTN_UNREACHABLE] = -EHOSTUNREACH,
[RTN_PROHIBIT] = -EACCES,
[RTN_THROW] = -EAGAIN,
[RTN_NAT] = -EINVAL,
[RTN_XRESOLVE] = -EINVAL,
-@@ -1078,6 +1093,10 @@ static void ip6_rt_init_dst_reject(struc
+@@ -1112,6 +1127,10 @@ static void ip6_rt_init_dst_reject(struc
rt->dst.output = ip6_pkt_prohibit_out;
rt->dst.input = ip6_pkt_prohibit;
break;
case RTN_THROW:
case RTN_UNREACHABLE:
default:
-@@ -4554,6 +4573,17 @@ static int ip6_pkt_prohibit_out(struct n
+@@ -4588,6 +4607,17 @@ static int ip6_pkt_prohibit_out(struct n
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
}
/*
* Allocate a dst for local (unicast / anycast) address.
*/
-@@ -5045,7 +5075,8 @@ static int rtm_to_fib6_config(struct sk_
+@@ -5079,7 +5109,8 @@ static int rtm_to_fib6_config(struct sk_
if (rtm->rtm_type == RTN_UNREACHABLE ||
rtm->rtm_type == RTN_BLACKHOLE ||
rtm->rtm_type == RTN_PROHIBIT ||
cfg->fc_flags |= RTF_REJECT;
if (rtm->rtm_type == RTN_LOCAL)
-@@ -6307,6 +6338,8 @@ static int ip6_route_dev_notify(struct n
+@@ -6341,6 +6372,8 @@ static int ip6_route_dev_notify(struct n
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
net->ipv6.ip6_prohibit_entry->dst.dev = dev;
net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
#endif
-@@ -6318,6 +6351,7 @@ static int ip6_route_dev_notify(struct n
+@@ -6352,6 +6385,7 @@ static int ip6_route_dev_notify(struct n
in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);
#endif
}
-@@ -6518,6 +6552,8 @@ static int __net_init ip6_route_net_init
+@@ -6552,6 +6586,8 @@ static int __net_init ip6_route_net_init
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
net->ipv6.fib6_has_custom_rules = false;
net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
sizeof(*net->ipv6.ip6_prohibit_entry),
GFP_KERNEL);
-@@ -6528,11 +6564,21 @@ static int __net_init ip6_route_net_init
+@@ -6562,11 +6598,21 @@ static int __net_init ip6_route_net_init
ip6_template_metrics, true);
INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->dst.rt_uncached);
net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
ip6_template_metrics, true);
-@@ -6559,6 +6605,8 @@ out:
+@@ -6593,6 +6639,8 @@ out:
return ret;
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
out_ip6_prohibit_entry:
kfree(net->ipv6.ip6_prohibit_entry);
out_ip6_null_entry:
-@@ -6578,6 +6626,7 @@ static void __net_exit ip6_route_net_exi
+@@ -6612,6 +6660,7 @@ static void __net_exit ip6_route_net_exi
kfree(net->ipv6.ip6_null_entry);
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
kfree(net->ipv6.ip6_prohibit_entry);
kfree(net->ipv6.ip6_blk_hole_entry);
#endif
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
-@@ -6661,6 +6710,9 @@ void __init ip6_route_init_special_entri
+@@ -6695,6 +6744,9 @@ void __init ip6_route_init_special_entri
init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
struct rtnl_link {
rtnl_doit_func doit;
-@@ -4978,7 +4978,9 @@ int ndo_dflt_bridge_getlink(struct sk_bu
+@@ -4981,7 +4981,9 @@ int ndo_dflt_bridge_getlink(struct sk_bu
brport_nla_put_flag(skb, flags, mask,
IFLA_BRPORT_MCAST_FLOOD, BR_MCAST_FLOOD) ||
brport_nla_put_flag(skb, flags, mask,
+ };
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
-@@ -609,6 +609,8 @@ patternProperties:
+@@ -611,6 +611,8 @@ patternProperties:
description: IC Plus Corp.
"^idt,.*":
description: Integrated Device Technologies, Inc.