diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-10-05 11:50:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-10-05 11:50:15 -0400 |
commit | 9819a30c11ea439e5e3c81f5539c4d42d6c76314 (patch) | |
tree | eee29b4735a2ddb944260ad3d281efd4a56788cc | |
parent | 6fe137cbe3e85e832a169006e8ccc04cec69c653 (diff) | |
parent | ef129d34149ea23d0d442844fc25ae26a85589fc (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from David Miller:
1) Fix ieeeu02154 atusb driver use-after-free, from Johan Hovold.
2) Need to validate TCA_CBQ_WRROPT netlink attributes, from Eric
Dumazet.
3) txq null deref in mac80211, from Miaoqing Pan.
4) ionic driver needs to select NET_DEVLINK, from Arnd Bergmann.
5) Need to disable bh during nft_connlimit GC, from Pablo Neira Ayuso.
6) Avoid division by zero in taprio scheduler, from Vladimir Oltean.
7) Various xgmac fixes in stmmac driver from Jose Abreu.
8) Avoid 64-bit division in mlx5 leading to link errors on 32-bit from
Michal Kubecek.
9) Fix bad VLAN check in rtl8366 DSA driver, from Linus Walleij.
10) Fix sleep while atomic in sja1105, from Vladimir Oltean.
11) Suspend/resume deadlock in stmmac, from Thierry Reding.
12) Various UDP GSO fixes from Josh Hunt.
13) Fix slab out of bounds access in tcp_zerocopy_receive(), from Eric
Dumazet.
14) Fix OOPS in __ipv6_ifa_notify(), from David Ahern.
15) Memory leak in NFC's llcp_sock_bind, from Eric Dumazet.
* git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (72 commits)
selftests/net: add nettest to .gitignore
net: qlogic: Fix memory leak in ql_alloc_large_buffers
nfc: fix memory leak in llcp_sock_bind()
sch_dsmark: fix potential NULL deref in dsmark_init()
net: phy: at803x: use operating parameters from PHY-specific status
net: phy: extract pause mode
net: phy: extract link partner advertisement reading
net: phy: fix write to mii-ctrl1000 register
ipv6: Handle missing host route in __ipv6_ifa_notify
net: phy: allow for reset line to be tied to a sleepy GPIO controller
net: ipv4: avoid mixed n_redirects and rate_tokens usage
r8152: Set macpassthru in reset_resume callback
cxgb4:Fix out-of-bounds MSI-X info array access
Revert "ipv6: Handle race in addrconf_dad_work"
net: make sock_prot_memory_pressure() return "const char *"
rxrpc: Fix rxrpc_recvmsg tracepoint
qmi_wwan: add support for Cinterion CLS8 devices
tcp: fix slab-out-of-bounds in tcp_zerocopy_receive()
lib: textsearch: fix escapes in example code
udp: only do GSO if # of segs > 1
...
99 files changed, 539 insertions, 281 deletions
diff --git a/Documentation/networking/device_drivers/index.rst b/Documentation/networking/device_drivers/index.rst index f51f92571e39..c1f7f75e5fd9 100644 --- a/Documentation/networking/device_drivers/index.rst +++ b/Documentation/networking/device_drivers/index.rst | |||
@@ -23,6 +23,7 @@ Contents: | |||
23 | intel/ice | 23 | intel/ice |
24 | google/gve | 24 | google/gve |
25 | mellanox/mlx5 | 25 | mellanox/mlx5 |
26 | netronome/nfp | ||
26 | pensando/ionic | 27 | pensando/ionic |
27 | 28 | ||
28 | .. only:: subproject and html | 29 | .. only:: subproject and html |
diff --git a/Documentation/networking/j1939.rst b/Documentation/networking/j1939.rst index ce7e7a044e08..dc60b13fcd09 100644 --- a/Documentation/networking/j1939.rst +++ b/Documentation/networking/j1939.rst | |||
@@ -272,7 +272,7 @@ supported flags are: | |||
272 | * MSG_DONTWAIT, i.e. non-blocking operation. | 272 | * MSG_DONTWAIT, i.e. non-blocking operation. |
273 | 273 | ||
274 | recvmsg(2) | 274 | recvmsg(2) |
275 | ^^^^^^^^^ | 275 | ^^^^^^^^^^ |
276 | 276 | ||
277 | In most cases recvmsg(2) is needed if you want to extract more information than | 277 | In most cases recvmsg(2) is needed if you want to extract more information than |
278 | recvfrom(2) can provide. For example package priority and timestamp. The | 278 | recvfrom(2) can provide. For example package priority and timestamp. The |
diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c index 684aa51684db..b00274caae4f 100644 --- a/drivers/net/dsa/qca8k.c +++ b/drivers/net/dsa/qca8k.c | |||
@@ -705,7 +705,7 @@ qca8k_setup(struct dsa_switch *ds) | |||
705 | BIT(0) << QCA8K_GLOBAL_FW_CTRL1_UC_DP_S); | 705 | BIT(0) << QCA8K_GLOBAL_FW_CTRL1_UC_DP_S); |
706 | 706 | ||
707 | /* Setup connection between CPU port & user ports */ | 707 | /* Setup connection between CPU port & user ports */ |
708 | for (i = 0; i < DSA_MAX_PORTS; i++) { | 708 | for (i = 0; i < QCA8K_NUM_PORTS; i++) { |
709 | /* CPU port gets connected to all user ports of the switch */ | 709 | /* CPU port gets connected to all user ports of the switch */ |
710 | if (dsa_is_cpu_port(ds, i)) { | 710 | if (dsa_is_cpu_port(ds, i)) { |
711 | qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(QCA8K_CPU_PORT), | 711 | qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(QCA8K_CPU_PORT), |
@@ -1077,7 +1077,7 @@ qca8k_sw_probe(struct mdio_device *mdiodev) | |||
1077 | if (id != QCA8K_ID_QCA8337) | 1077 | if (id != QCA8K_ID_QCA8337) |
1078 | return -ENODEV; | 1078 | return -ENODEV; |
1079 | 1079 | ||
1080 | priv->ds = dsa_switch_alloc(&mdiodev->dev, DSA_MAX_PORTS); | 1080 | priv->ds = dsa_switch_alloc(&mdiodev->dev, QCA8K_NUM_PORTS); |
1081 | if (!priv->ds) | 1081 | if (!priv->ds) |
1082 | return -ENOMEM; | 1082 | return -ENOMEM; |
1083 | 1083 | ||
diff --git a/drivers/net/dsa/rtl8366.c b/drivers/net/dsa/rtl8366.c index ca3d17e43ed8..ac88caca5ad4 100644 --- a/drivers/net/dsa/rtl8366.c +++ b/drivers/net/dsa/rtl8366.c | |||
@@ -339,10 +339,12 @@ int rtl8366_vlan_prepare(struct dsa_switch *ds, int port, | |||
339 | const struct switchdev_obj_port_vlan *vlan) | 339 | const struct switchdev_obj_port_vlan *vlan) |
340 | { | 340 | { |
341 | struct realtek_smi *smi = ds->priv; | 341 | struct realtek_smi *smi = ds->priv; |
342 | u16 vid; | ||
342 | int ret; | 343 | int ret; |
343 | 344 | ||
344 | if (!smi->ops->is_vlan_valid(smi, port)) | 345 | for (vid = vlan->vid_begin; vid < vlan->vid_end; vid++) |
345 | return -EINVAL; | 346 | if (!smi->ops->is_vlan_valid(smi, vid)) |
347 | return -EINVAL; | ||
346 | 348 | ||
347 | dev_info(smi->dev, "prepare VLANs %04x..%04x\n", | 349 | dev_info(smi->dev, "prepare VLANs %04x..%04x\n", |
348 | vlan->vid_begin, vlan->vid_end); | 350 | vlan->vid_begin, vlan->vid_end); |
@@ -370,8 +372,9 @@ void rtl8366_vlan_add(struct dsa_switch *ds, int port, | |||
370 | u16 vid; | 372 | u16 vid; |
371 | int ret; | 373 | int ret; |
372 | 374 | ||
373 | if (!smi->ops->is_vlan_valid(smi, port)) | 375 | for (vid = vlan->vid_begin; vid < vlan->vid_end; vid++) |
374 | return; | 376 | if (!smi->ops->is_vlan_valid(smi, vid)) |
377 | return; | ||
375 | 378 | ||
376 | dev_info(smi->dev, "add VLAN on port %d, %s, %s\n", | 379 | dev_info(smi->dev, "add VLAN on port %d, %s, %s\n", |
377 | port, | 380 | port, |
diff --git a/drivers/net/dsa/rtl8366rb.c b/drivers/net/dsa/rtl8366rb.c index a268085ffad2..f5cc8b0a7c74 100644 --- a/drivers/net/dsa/rtl8366rb.c +++ b/drivers/net/dsa/rtl8366rb.c | |||
@@ -507,7 +507,8 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi) | |||
507 | irq = of_irq_get(intc, 0); | 507 | irq = of_irq_get(intc, 0); |
508 | if (irq <= 0) { | 508 | if (irq <= 0) { |
509 | dev_err(smi->dev, "failed to get parent IRQ\n"); | 509 | dev_err(smi->dev, "failed to get parent IRQ\n"); |
510 | return irq ? irq : -EINVAL; | 510 | ret = irq ? irq : -EINVAL; |
511 | goto out_put_node; | ||
511 | } | 512 | } |
512 | 513 | ||
513 | /* This clears the IRQ status register */ | 514 | /* This clears the IRQ status register */ |
@@ -515,7 +516,7 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi) | |||
515 | &val); | 516 | &val); |
516 | if (ret) { | 517 | if (ret) { |
517 | dev_err(smi->dev, "can't read interrupt status\n"); | 518 | dev_err(smi->dev, "can't read interrupt status\n"); |
518 | return ret; | 519 | goto out_put_node; |
519 | } | 520 | } |
520 | 521 | ||
521 | /* Fetch IRQ edge information from the descriptor */ | 522 | /* Fetch IRQ edge information from the descriptor */ |
@@ -537,7 +538,7 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi) | |||
537 | val); | 538 | val); |
538 | if (ret) { | 539 | if (ret) { |
539 | dev_err(smi->dev, "could not configure IRQ polarity\n"); | 540 | dev_err(smi->dev, "could not configure IRQ polarity\n"); |
540 | return ret; | 541 | goto out_put_node; |
541 | } | 542 | } |
542 | 543 | ||
543 | ret = devm_request_threaded_irq(smi->dev, irq, NULL, | 544 | ret = devm_request_threaded_irq(smi->dev, irq, NULL, |
@@ -545,7 +546,7 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi) | |||
545 | "RTL8366RB", smi); | 546 | "RTL8366RB", smi); |
546 | if (ret) { | 547 | if (ret) { |
547 | dev_err(smi->dev, "unable to request irq: %d\n", ret); | 548 | dev_err(smi->dev, "unable to request irq: %d\n", ret); |
548 | return ret; | 549 | goto out_put_node; |
549 | } | 550 | } |
550 | smi->irqdomain = irq_domain_add_linear(intc, | 551 | smi->irqdomain = irq_domain_add_linear(intc, |
551 | RTL8366RB_NUM_INTERRUPT, | 552 | RTL8366RB_NUM_INTERRUPT, |
@@ -553,12 +554,15 @@ static int rtl8366rb_setup_cascaded_irq(struct realtek_smi *smi) | |||
553 | smi); | 554 | smi); |
554 | if (!smi->irqdomain) { | 555 | if (!smi->irqdomain) { |
555 | dev_err(smi->dev, "failed to create IRQ domain\n"); | 556 | dev_err(smi->dev, "failed to create IRQ domain\n"); |
556 | return -EINVAL; | 557 | ret = -EINVAL; |
558 | goto out_put_node; | ||
557 | } | 559 | } |
558 | for (i = 0; i < smi->num_ports; i++) | 560 | for (i = 0; i < smi->num_ports; i++) |
559 | irq_set_parent(irq_create_mapping(smi->irqdomain, i), irq); | 561 | irq_set_parent(irq_create_mapping(smi->irqdomain, i), irq); |
560 | 562 | ||
561 | return 0; | 563 | out_put_node: |
564 | of_node_put(intc); | ||
565 | return ret; | ||
562 | } | 566 | } |
563 | 567 | ||
564 | static int rtl8366rb_set_addr(struct realtek_smi *smi) | 568 | static int rtl8366rb_set_addr(struct realtek_smi *smi) |
diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c index b9def744bcb3..7687ddcae159 100644 --- a/drivers/net/dsa/sja1105/sja1105_main.c +++ b/drivers/net/dsa/sja1105/sja1105_main.c | |||
@@ -1897,7 +1897,9 @@ static int sja1105_set_ageing_time(struct dsa_switch *ds, | |||
1897 | return sja1105_static_config_reload(priv); | 1897 | return sja1105_static_config_reload(priv); |
1898 | } | 1898 | } |
1899 | 1899 | ||
1900 | /* Caller must hold priv->tagger_data.meta_lock */ | 1900 | /* Must be called only with priv->tagger_data.state bit |
1901 | * SJA1105_HWTS_RX_EN cleared | ||
1902 | */ | ||
1901 | static int sja1105_change_rxtstamping(struct sja1105_private *priv, | 1903 | static int sja1105_change_rxtstamping(struct sja1105_private *priv, |
1902 | bool on) | 1904 | bool on) |
1903 | { | 1905 | { |
@@ -1954,16 +1956,17 @@ static int sja1105_hwtstamp_set(struct dsa_switch *ds, int port, | |||
1954 | break; | 1956 | break; |
1955 | } | 1957 | } |
1956 | 1958 | ||
1957 | if (rx_on != priv->tagger_data.hwts_rx_en) { | 1959 | if (rx_on != test_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state)) { |
1958 | spin_lock(&priv->tagger_data.meta_lock); | 1960 | clear_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state); |
1961 | |||
1959 | rc = sja1105_change_rxtstamping(priv, rx_on); | 1962 | rc = sja1105_change_rxtstamping(priv, rx_on); |
1960 | spin_unlock(&priv->tagger_data.meta_lock); | ||
1961 | if (rc < 0) { | 1963 | if (rc < 0) { |
1962 | dev_err(ds->dev, | 1964 | dev_err(ds->dev, |
1963 | "Failed to change RX timestamping: %d\n", rc); | 1965 | "Failed to change RX timestamping: %d\n", rc); |
1964 | return -EFAULT; | 1966 | return rc; |
1965 | } | 1967 | } |
1966 | priv->tagger_data.hwts_rx_en = rx_on; | 1968 | if (rx_on) |
1969 | set_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state); | ||
1967 | } | 1970 | } |
1968 | 1971 | ||
1969 | if (copy_to_user(ifr->ifr_data, &config, sizeof(config))) | 1972 | if (copy_to_user(ifr->ifr_data, &config, sizeof(config))) |
@@ -1982,7 +1985,7 @@ static int sja1105_hwtstamp_get(struct dsa_switch *ds, int port, | |||
1982 | config.tx_type = HWTSTAMP_TX_ON; | 1985 | config.tx_type = HWTSTAMP_TX_ON; |
1983 | else | 1986 | else |
1984 | config.tx_type = HWTSTAMP_TX_OFF; | 1987 | config.tx_type = HWTSTAMP_TX_OFF; |
1985 | if (priv->tagger_data.hwts_rx_en) | 1988 | if (test_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state)) |
1986 | config.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT; | 1989 | config.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT; |
1987 | else | 1990 | else |
1988 | config.rx_filter = HWTSTAMP_FILTER_NONE; | 1991 | config.rx_filter = HWTSTAMP_FILTER_NONE; |
@@ -2005,12 +2008,12 @@ static void sja1105_rxtstamp_work(struct work_struct *work) | |||
2005 | 2008 | ||
2006 | mutex_lock(&priv->ptp_lock); | 2009 | mutex_lock(&priv->ptp_lock); |
2007 | 2010 | ||
2008 | now = priv->tstamp_cc.read(&priv->tstamp_cc); | ||
2009 | |||
2010 | while ((skb = skb_dequeue(&data->skb_rxtstamp_queue)) != NULL) { | 2011 | while ((skb = skb_dequeue(&data->skb_rxtstamp_queue)) != NULL) { |
2011 | struct skb_shared_hwtstamps *shwt = skb_hwtstamps(skb); | 2012 | struct skb_shared_hwtstamps *shwt = skb_hwtstamps(skb); |
2012 | u64 ts; | 2013 | u64 ts; |
2013 | 2014 | ||
2015 | now = priv->tstamp_cc.read(&priv->tstamp_cc); | ||
2016 | |||
2014 | *shwt = (struct skb_shared_hwtstamps) {0}; | 2017 | *shwt = (struct skb_shared_hwtstamps) {0}; |
2015 | 2018 | ||
2016 | ts = SJA1105_SKB_CB(skb)->meta_tstamp; | 2019 | ts = SJA1105_SKB_CB(skb)->meta_tstamp; |
@@ -2031,7 +2034,7 @@ static bool sja1105_port_rxtstamp(struct dsa_switch *ds, int port, | |||
2031 | struct sja1105_private *priv = ds->priv; | 2034 | struct sja1105_private *priv = ds->priv; |
2032 | struct sja1105_tagger_data *data = &priv->tagger_data; | 2035 | struct sja1105_tagger_data *data = &priv->tagger_data; |
2033 | 2036 | ||
2034 | if (!data->hwts_rx_en) | 2037 | if (!test_bit(SJA1105_HWTS_RX_EN, &data->state)) |
2035 | return false; | 2038 | return false; |
2036 | 2039 | ||
2037 | /* We need to read the full PTP clock to reconstruct the Rx | 2040 | /* We need to read the full PTP clock to reconstruct the Rx |
@@ -2201,6 +2204,7 @@ static int sja1105_probe(struct spi_device *spi) | |||
2201 | tagger_data = &priv->tagger_data; | 2204 | tagger_data = &priv->tagger_data; |
2202 | skb_queue_head_init(&tagger_data->skb_rxtstamp_queue); | 2205 | skb_queue_head_init(&tagger_data->skb_rxtstamp_queue); |
2203 | INIT_WORK(&tagger_data->rxtstamp_work, sja1105_rxtstamp_work); | 2206 | INIT_WORK(&tagger_data->rxtstamp_work, sja1105_rxtstamp_work); |
2207 | spin_lock_init(&tagger_data->meta_lock); | ||
2204 | 2208 | ||
2205 | /* Connections between dsa_port and sja1105_port */ | 2209 | /* Connections between dsa_port and sja1105_port */ |
2206 | for (i = 0; i < SJA1105_NUM_PORTS; i++) { | 2210 | for (i = 0; i < SJA1105_NUM_PORTS; i++) { |
diff --git a/drivers/net/dsa/sja1105/sja1105_spi.c b/drivers/net/dsa/sja1105/sja1105_spi.c index 84dc603138cf..58dd37ecde17 100644 --- a/drivers/net/dsa/sja1105/sja1105_spi.c +++ b/drivers/net/dsa/sja1105/sja1105_spi.c | |||
@@ -409,7 +409,8 @@ int sja1105_static_config_upload(struct sja1105_private *priv) | |||
409 | rc = static_config_buf_prepare_for_upload(priv, config_buf, buf_len); | 409 | rc = static_config_buf_prepare_for_upload(priv, config_buf, buf_len); |
410 | if (rc < 0) { | 410 | if (rc < 0) { |
411 | dev_err(dev, "Invalid config, cannot upload\n"); | 411 | dev_err(dev, "Invalid config, cannot upload\n"); |
412 | return -EINVAL; | 412 | rc = -EINVAL; |
413 | goto out; | ||
413 | } | 414 | } |
414 | /* Prevent PHY jabbering during switch reset by inhibiting | 415 | /* Prevent PHY jabbering during switch reset by inhibiting |
415 | * Tx on all ports and waiting for current packet to drain. | 416 | * Tx on all ports and waiting for current packet to drain. |
@@ -418,7 +419,8 @@ int sja1105_static_config_upload(struct sja1105_private *priv) | |||
418 | rc = sja1105_inhibit_tx(priv, port_bitmap, true); | 419 | rc = sja1105_inhibit_tx(priv, port_bitmap, true); |
419 | if (rc < 0) { | 420 | if (rc < 0) { |
420 | dev_err(dev, "Failed to inhibit Tx on ports\n"); | 421 | dev_err(dev, "Failed to inhibit Tx on ports\n"); |
421 | return -ENXIO; | 422 | rc = -ENXIO; |
423 | goto out; | ||
422 | } | 424 | } |
423 | /* Wait for an eventual egress packet to finish transmission | 425 | /* Wait for an eventual egress packet to finish transmission |
424 | * (reach IFG). It is guaranteed that a second one will not | 426 | * (reach IFG). It is guaranteed that a second one will not |
diff --git a/drivers/net/ethernet/atheros/ag71xx.c b/drivers/net/ethernet/atheros/ag71xx.c index 7548247455d7..1b1a09095c0d 100644 --- a/drivers/net/ethernet/atheros/ag71xx.c +++ b/drivers/net/ethernet/atheros/ag71xx.c | |||
@@ -526,7 +526,7 @@ static int ag71xx_mdio_probe(struct ag71xx *ag) | |||
526 | struct device *dev = &ag->pdev->dev; | 526 | struct device *dev = &ag->pdev->dev; |
527 | struct net_device *ndev = ag->ndev; | 527 | struct net_device *ndev = ag->ndev; |
528 | static struct mii_bus *mii_bus; | 528 | static struct mii_bus *mii_bus; |
529 | struct device_node *np; | 529 | struct device_node *np, *mnp; |
530 | int err; | 530 | int err; |
531 | 531 | ||
532 | np = dev->of_node; | 532 | np = dev->of_node; |
@@ -571,7 +571,9 @@ static int ag71xx_mdio_probe(struct ag71xx *ag) | |||
571 | msleep(200); | 571 | msleep(200); |
572 | } | 572 | } |
573 | 573 | ||
574 | err = of_mdiobus_register(mii_bus, np); | 574 | mnp = of_get_child_by_name(np, "mdio"); |
575 | err = of_mdiobus_register(mii_bus, mnp); | ||
576 | of_node_put(mnp); | ||
575 | if (err) | 577 | if (err) |
576 | goto mdio_err_put_clk; | 578 | goto mdio_err_put_clk; |
577 | 579 | ||
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c index 5b602243d573..a4dead4ab0ed 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c | |||
@@ -137,13 +137,12 @@ static int uldrx_handler(struct sge_rspq *q, const __be64 *rsp, | |||
137 | static int alloc_uld_rxqs(struct adapter *adap, | 137 | static int alloc_uld_rxqs(struct adapter *adap, |
138 | struct sge_uld_rxq_info *rxq_info, bool lro) | 138 | struct sge_uld_rxq_info *rxq_info, bool lro) |
139 | { | 139 | { |
140 | struct sge *s = &adap->sge; | ||
141 | unsigned int nq = rxq_info->nrxq + rxq_info->nciq; | 140 | unsigned int nq = rxq_info->nrxq + rxq_info->nciq; |
141 | int i, err, msi_idx, que_idx = 0, bmap_idx = 0; | ||
142 | struct sge_ofld_rxq *q = rxq_info->uldrxq; | 142 | struct sge_ofld_rxq *q = rxq_info->uldrxq; |
143 | unsigned short *ids = rxq_info->rspq_id; | 143 | unsigned short *ids = rxq_info->rspq_id; |
144 | unsigned int bmap_idx = 0; | 144 | struct sge *s = &adap->sge; |
145 | unsigned int per_chan; | 145 | unsigned int per_chan; |
146 | int i, err, msi_idx, que_idx = 0; | ||
147 | 146 | ||
148 | per_chan = rxq_info->nrxq / adap->params.nports; | 147 | per_chan = rxq_info->nrxq / adap->params.nports; |
149 | 148 | ||
@@ -161,6 +160,10 @@ static int alloc_uld_rxqs(struct adapter *adap, | |||
161 | 160 | ||
162 | if (msi_idx >= 0) { | 161 | if (msi_idx >= 0) { |
163 | bmap_idx = get_msix_idx_from_bmap(adap); | 162 | bmap_idx = get_msix_idx_from_bmap(adap); |
163 | if (bmap_idx < 0) { | ||
164 | err = -ENOSPC; | ||
165 | goto freeout; | ||
166 | } | ||
164 | msi_idx = adap->msix_info_ulds[bmap_idx].idx; | 167 | msi_idx = adap->msix_info_ulds[bmap_idx].idx; |
165 | } | 168 | } |
166 | err = t4_sge_alloc_rxq(adap, &q->rspq, false, | 169 | err = t4_sge_alloc_rxq(adap, &q->rspq, false, |
diff --git a/drivers/net/ethernet/hisilicon/hns_mdio.c b/drivers/net/ethernet/hisilicon/hns_mdio.c index 3e863a71c513..7df5d7d211d4 100644 --- a/drivers/net/ethernet/hisilicon/hns_mdio.c +++ b/drivers/net/ethernet/hisilicon/hns_mdio.c | |||
@@ -148,11 +148,15 @@ static int mdio_sc_cfg_reg_write(struct hns_mdio_device *mdio_dev, | |||
148 | { | 148 | { |
149 | u32 time_cnt; | 149 | u32 time_cnt; |
150 | u32 reg_value; | 150 | u32 reg_value; |
151 | int ret; | ||
151 | 152 | ||
152 | regmap_write(mdio_dev->subctrl_vbase, cfg_reg, set_val); | 153 | regmap_write(mdio_dev->subctrl_vbase, cfg_reg, set_val); |
153 | 154 | ||
154 | for (time_cnt = MDIO_TIMEOUT; time_cnt; time_cnt--) { | 155 | for (time_cnt = MDIO_TIMEOUT; time_cnt; time_cnt--) { |
155 | regmap_read(mdio_dev->subctrl_vbase, st_reg, ®_value); | 156 | ret = regmap_read(mdio_dev->subctrl_vbase, st_reg, ®_value); |
157 | if (ret) | ||
158 | return ret; | ||
159 | |||
156 | reg_value &= st_msk; | 160 | reg_value &= st_msk; |
157 | if ((!!check_st) == (!!reg_value)) | 161 | if ((!!check_st) == (!!reg_value)) |
158 | break; | 162 | break; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c index 913f1e5aaaf2..d7c7467e2d53 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c | |||
@@ -137,7 +137,8 @@ dr_icm_pool_mr_create(struct mlx5dr_icm_pool *pool, | |||
137 | 137 | ||
138 | icm_mr->icm_start_addr = icm_mr->dm.addr; | 138 | icm_mr->icm_start_addr = icm_mr->dm.addr; |
139 | 139 | ||
140 | align_diff = icm_mr->icm_start_addr % align_base; | 140 | /* align_base is always a power of 2 */ |
141 | align_diff = icm_mr->icm_start_addr & (align_base - 1); | ||
141 | if (align_diff) | 142 | if (align_diff) |
142 | icm_mr->used_length = align_base - align_diff; | 143 | icm_mr->used_length = align_base - align_diff; |
143 | 144 | ||
diff --git a/drivers/net/ethernet/mscc/ocelot_board.c b/drivers/net/ethernet/mscc/ocelot_board.c index b063eb78fa0c..aac115136720 100644 --- a/drivers/net/ethernet/mscc/ocelot_board.c +++ b/drivers/net/ethernet/mscc/ocelot_board.c | |||
@@ -388,13 +388,14 @@ static int mscc_ocelot_probe(struct platform_device *pdev) | |||
388 | continue; | 388 | continue; |
389 | 389 | ||
390 | phy = of_phy_find_device(phy_node); | 390 | phy = of_phy_find_device(phy_node); |
391 | of_node_put(phy_node); | ||
391 | if (!phy) | 392 | if (!phy) |
392 | continue; | 393 | continue; |
393 | 394 | ||
394 | err = ocelot_probe_port(ocelot, port, regs, phy); | 395 | err = ocelot_probe_port(ocelot, port, regs, phy); |
395 | if (err) { | 396 | if (err) { |
396 | of_node_put(portnp); | 397 | of_node_put(portnp); |
397 | return err; | 398 | goto out_put_ports; |
398 | } | 399 | } |
399 | 400 | ||
400 | phy_mode = of_get_phy_mode(portnp); | 401 | phy_mode = of_get_phy_mode(portnp); |
@@ -422,7 +423,8 @@ static int mscc_ocelot_probe(struct platform_device *pdev) | |||
422 | "invalid phy mode for port%d, (Q)SGMII only\n", | 423 | "invalid phy mode for port%d, (Q)SGMII only\n", |
423 | port); | 424 | port); |
424 | of_node_put(portnp); | 425 | of_node_put(portnp); |
425 | return -EINVAL; | 426 | err = -EINVAL; |
427 | goto out_put_ports; | ||
426 | } | 428 | } |
427 | 429 | ||
428 | serdes = devm_of_phy_get(ocelot->dev, portnp, NULL); | 430 | serdes = devm_of_phy_get(ocelot->dev, portnp, NULL); |
@@ -435,7 +437,8 @@ static int mscc_ocelot_probe(struct platform_device *pdev) | |||
435 | "missing SerDes phys for port%d\n", | 437 | "missing SerDes phys for port%d\n", |
436 | port); | 438 | port); |
437 | 439 | ||
438 | goto err_probe_ports; | 440 | of_node_put(portnp); |
441 | goto out_put_ports; | ||
439 | } | 442 | } |
440 | 443 | ||
441 | ocelot->ports[port]->serdes = serdes; | 444 | ocelot->ports[port]->serdes = serdes; |
@@ -447,9 +450,8 @@ static int mscc_ocelot_probe(struct platform_device *pdev) | |||
447 | 450 | ||
448 | dev_info(&pdev->dev, "Ocelot switch probed\n"); | 451 | dev_info(&pdev->dev, "Ocelot switch probed\n"); |
449 | 452 | ||
450 | return 0; | 453 | out_put_ports: |
451 | 454 | of_node_put(ports); | |
452 | err_probe_ports: | ||
453 | return err; | 455 | return err; |
454 | } | 456 | } |
455 | 457 | ||
diff --git a/drivers/net/ethernet/pensando/Kconfig b/drivers/net/ethernet/pensando/Kconfig index bd0583e409df..d25b88f53de4 100644 --- a/drivers/net/ethernet/pensando/Kconfig +++ b/drivers/net/ethernet/pensando/Kconfig | |||
@@ -20,6 +20,7 @@ if NET_VENDOR_PENSANDO | |||
20 | config IONIC | 20 | config IONIC |
21 | tristate "Pensando Ethernet IONIC Support" | 21 | tristate "Pensando Ethernet IONIC Support" |
22 | depends on 64BIT && PCI | 22 | depends on 64BIT && PCI |
23 | select NET_DEVLINK | ||
23 | help | 24 | help |
24 | This enables the support for the Pensando family of Ethernet | 25 | This enables the support for the Pensando family of Ethernet |
25 | adapters. More specific information on this driver can be | 26 | adapters. More specific information on this driver can be |
diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c index 457444894d80..b4b8ba00ee01 100644 --- a/drivers/net/ethernet/qlogic/qla3xxx.c +++ b/drivers/net/ethernet/qlogic/qla3xxx.c | |||
@@ -2787,6 +2787,7 @@ static int ql_alloc_large_buffers(struct ql3_adapter *qdev) | |||
2787 | netdev_err(qdev->ndev, | 2787 | netdev_err(qdev->ndev, |
2788 | "PCI mapping failed with error: %d\n", | 2788 | "PCI mapping failed with error: %d\n", |
2789 | err); | 2789 | err); |
2790 | dev_kfree_skb_irq(skb); | ||
2790 | ql_free_large_buffers(qdev); | 2791 | ql_free_large_buffers(qdev); |
2791 | return -ENOMEM; | 2792 | return -ENOMEM; |
2792 | } | 2793 | } |
diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c index 55db7fbd43cc..f9e6744d8fd6 100644 --- a/drivers/net/ethernet/socionext/netsec.c +++ b/drivers/net/ethernet/socionext/netsec.c | |||
@@ -282,7 +282,6 @@ struct netsec_desc_ring { | |||
282 | void *vaddr; | 282 | void *vaddr; |
283 | u16 head, tail; | 283 | u16 head, tail; |
284 | u16 xdp_xmit; /* netsec_xdp_xmit packets */ | 284 | u16 xdp_xmit; /* netsec_xdp_xmit packets */ |
285 | bool is_xdp; | ||
286 | struct page_pool *page_pool; | 285 | struct page_pool *page_pool; |
287 | struct xdp_rxq_info xdp_rxq; | 286 | struct xdp_rxq_info xdp_rxq; |
288 | spinlock_t lock; /* XDP tx queue locking */ | 287 | spinlock_t lock; /* XDP tx queue locking */ |
@@ -634,8 +633,7 @@ static bool netsec_clean_tx_dring(struct netsec_priv *priv) | |||
634 | unsigned int bytes; | 633 | unsigned int bytes; |
635 | int cnt = 0; | 634 | int cnt = 0; |
636 | 635 | ||
637 | if (dring->is_xdp) | 636 | spin_lock(&dring->lock); |
638 | spin_lock(&dring->lock); | ||
639 | 637 | ||
640 | bytes = 0; | 638 | bytes = 0; |
641 | entry = dring->vaddr + DESC_SZ * tail; | 639 | entry = dring->vaddr + DESC_SZ * tail; |
@@ -682,8 +680,8 @@ next: | |||
682 | entry = dring->vaddr + DESC_SZ * tail; | 680 | entry = dring->vaddr + DESC_SZ * tail; |
683 | cnt++; | 681 | cnt++; |
684 | } | 682 | } |
685 | if (dring->is_xdp) | 683 | |
686 | spin_unlock(&dring->lock); | 684 | spin_unlock(&dring->lock); |
687 | 685 | ||
688 | if (!cnt) | 686 | if (!cnt) |
689 | return false; | 687 | return false; |
@@ -799,9 +797,6 @@ static void netsec_set_tx_de(struct netsec_priv *priv, | |||
799 | de->data_buf_addr_lw = lower_32_bits(desc->dma_addr); | 797 | de->data_buf_addr_lw = lower_32_bits(desc->dma_addr); |
800 | de->buf_len_info = (tx_ctrl->tcp_seg_len << 16) | desc->len; | 798 | de->buf_len_info = (tx_ctrl->tcp_seg_len << 16) | desc->len; |
801 | de->attr = attr; | 799 | de->attr = attr; |
802 | /* under spin_lock if using XDP */ | ||
803 | if (!dring->is_xdp) | ||
804 | dma_wmb(); | ||
805 | 800 | ||
806 | dring->desc[idx] = *desc; | 801 | dring->desc[idx] = *desc; |
807 | if (desc->buf_type == TYPE_NETSEC_SKB) | 802 | if (desc->buf_type == TYPE_NETSEC_SKB) |
@@ -1123,12 +1118,10 @@ static netdev_tx_t netsec_netdev_start_xmit(struct sk_buff *skb, | |||
1123 | u16 tso_seg_len = 0; | 1118 | u16 tso_seg_len = 0; |
1124 | int filled; | 1119 | int filled; |
1125 | 1120 | ||
1126 | if (dring->is_xdp) | 1121 | spin_lock_bh(&dring->lock); |
1127 | spin_lock_bh(&dring->lock); | ||
1128 | filled = netsec_desc_used(dring); | 1122 | filled = netsec_desc_used(dring); |
1129 | if (netsec_check_stop_tx(priv, filled)) { | 1123 | if (netsec_check_stop_tx(priv, filled)) { |
1130 | if (dring->is_xdp) | 1124 | spin_unlock_bh(&dring->lock); |
1131 | spin_unlock_bh(&dring->lock); | ||
1132 | net_warn_ratelimited("%s %s Tx queue full\n", | 1125 | net_warn_ratelimited("%s %s Tx queue full\n", |
1133 | dev_name(priv->dev), ndev->name); | 1126 | dev_name(priv->dev), ndev->name); |
1134 | return NETDEV_TX_BUSY; | 1127 | return NETDEV_TX_BUSY; |
@@ -1161,8 +1154,7 @@ static netdev_tx_t netsec_netdev_start_xmit(struct sk_buff *skb, | |||
1161 | tx_desc.dma_addr = dma_map_single(priv->dev, skb->data, | 1154 | tx_desc.dma_addr = dma_map_single(priv->dev, skb->data, |
1162 | skb_headlen(skb), DMA_TO_DEVICE); | 1155 | skb_headlen(skb), DMA_TO_DEVICE); |
1163 | if (dma_mapping_error(priv->dev, tx_desc.dma_addr)) { | 1156 | if (dma_mapping_error(priv->dev, tx_desc.dma_addr)) { |
1164 | if (dring->is_xdp) | 1157 | spin_unlock_bh(&dring->lock); |
1165 | spin_unlock_bh(&dring->lock); | ||
1166 | netif_err(priv, drv, priv->ndev, | 1158 | netif_err(priv, drv, priv->ndev, |
1167 | "%s: DMA mapping failed\n", __func__); | 1159 | "%s: DMA mapping failed\n", __func__); |
1168 | ndev->stats.tx_dropped++; | 1160 | ndev->stats.tx_dropped++; |
@@ -1177,8 +1169,7 @@ static netdev_tx_t netsec_netdev_start_xmit(struct sk_buff *skb, | |||
1177 | netdev_sent_queue(priv->ndev, skb->len); | 1169 | netdev_sent_queue(priv->ndev, skb->len); |
1178 | 1170 | ||
1179 | netsec_set_tx_de(priv, dring, &tx_ctrl, &tx_desc, skb); | 1171 | netsec_set_tx_de(priv, dring, &tx_ctrl, &tx_desc, skb); |
1180 | if (dring->is_xdp) | 1172 | spin_unlock_bh(&dring->lock); |
1181 | spin_unlock_bh(&dring->lock); | ||
1182 | netsec_write(priv, NETSEC_REG_NRM_TX_PKTCNT, 1); /* submit another tx */ | 1173 | netsec_write(priv, NETSEC_REG_NRM_TX_PKTCNT, 1); /* submit another tx */ |
1183 | 1174 | ||
1184 | return NETDEV_TX_OK; | 1175 | return NETDEV_TX_OK; |
@@ -1262,7 +1253,6 @@ err: | |||
1262 | static void netsec_setup_tx_dring(struct netsec_priv *priv) | 1253 | static void netsec_setup_tx_dring(struct netsec_priv *priv) |
1263 | { | 1254 | { |
1264 | struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_TX]; | 1255 | struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_TX]; |
1265 | struct bpf_prog *xdp_prog = READ_ONCE(priv->xdp_prog); | ||
1266 | int i; | 1256 | int i; |
1267 | 1257 | ||
1268 | for (i = 0; i < DESC_NUM; i++) { | 1258 | for (i = 0; i < DESC_NUM; i++) { |
@@ -1275,12 +1265,6 @@ static void netsec_setup_tx_dring(struct netsec_priv *priv) | |||
1275 | */ | 1265 | */ |
1276 | de->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD; | 1266 | de->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD; |
1277 | } | 1267 | } |
1278 | |||
1279 | if (xdp_prog) | ||
1280 | dring->is_xdp = true; | ||
1281 | else | ||
1282 | dring->is_xdp = false; | ||
1283 | |||
1284 | } | 1268 | } |
1285 | 1269 | ||
1286 | static int netsec_setup_rx_dring(struct netsec_priv *priv) | 1270 | static int netsec_setup_rx_dring(struct netsec_priv *priv) |
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c index 9b4b5f69fc02..2cb9c53f93b8 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | |||
@@ -401,8 +401,11 @@ static void dwmac4_set_filter(struct mac_device_info *hw, | |||
401 | int numhashregs = (hw->multicast_filter_bins >> 5); | 401 | int numhashregs = (hw->multicast_filter_bins >> 5); |
402 | int mcbitslog2 = hw->mcast_bits_log2; | 402 | int mcbitslog2 = hw->mcast_bits_log2; |
403 | unsigned int value; | 403 | unsigned int value; |
404 | u32 mc_filter[8]; | ||
404 | int i; | 405 | int i; |
405 | 406 | ||
407 | memset(mc_filter, 0, sizeof(mc_filter)); | ||
408 | |||
406 | value = readl(ioaddr + GMAC_PACKET_FILTER); | 409 | value = readl(ioaddr + GMAC_PACKET_FILTER); |
407 | value &= ~GMAC_PACKET_FILTER_HMC; | 410 | value &= ~GMAC_PACKET_FILTER_HMC; |
408 | value &= ~GMAC_PACKET_FILTER_HPF; | 411 | value &= ~GMAC_PACKET_FILTER_HPF; |
@@ -416,16 +419,13 @@ static void dwmac4_set_filter(struct mac_device_info *hw, | |||
416 | /* Pass all multi */ | 419 | /* Pass all multi */ |
417 | value |= GMAC_PACKET_FILTER_PM; | 420 | value |= GMAC_PACKET_FILTER_PM; |
418 | /* Set all the bits of the HASH tab */ | 421 | /* Set all the bits of the HASH tab */ |
419 | for (i = 0; i < numhashregs; i++) | 422 | memset(mc_filter, 0xff, sizeof(mc_filter)); |
420 | writel(0xffffffff, ioaddr + GMAC_HASH_TAB(i)); | ||
421 | } else if (!netdev_mc_empty(dev)) { | 423 | } else if (!netdev_mc_empty(dev)) { |
422 | struct netdev_hw_addr *ha; | 424 | struct netdev_hw_addr *ha; |
423 | u32 mc_filter[8]; | ||
424 | 425 | ||
425 | /* Hash filter for multicast */ | 426 | /* Hash filter for multicast */ |
426 | value |= GMAC_PACKET_FILTER_HMC; | 427 | value |= GMAC_PACKET_FILTER_HMC; |
427 | 428 | ||
428 | memset(mc_filter, 0, sizeof(mc_filter)); | ||
429 | netdev_for_each_mc_addr(ha, dev) { | 429 | netdev_for_each_mc_addr(ha, dev) { |
430 | /* The upper n bits of the calculated CRC are used to | 430 | /* The upper n bits of the calculated CRC are used to |
431 | * index the contents of the hash table. The number of | 431 | * index the contents of the hash table. The number of |
@@ -440,10 +440,11 @@ static void dwmac4_set_filter(struct mac_device_info *hw, | |||
440 | */ | 440 | */ |
441 | mc_filter[bit_nr >> 5] |= (1 << (bit_nr & 0x1f)); | 441 | mc_filter[bit_nr >> 5] |= (1 << (bit_nr & 0x1f)); |
442 | } | 442 | } |
443 | for (i = 0; i < numhashregs; i++) | ||
444 | writel(mc_filter[i], ioaddr + GMAC_HASH_TAB(i)); | ||
445 | } | 443 | } |
446 | 444 | ||
445 | for (i = 0; i < numhashregs; i++) | ||
446 | writel(mc_filter[i], ioaddr + GMAC_HASH_TAB(i)); | ||
447 | |||
447 | value |= GMAC_PACKET_FILTER_HPF; | 448 | value |= GMAC_PACKET_FILTER_HPF; |
448 | 449 | ||
449 | /* Handle multiple unicast addresses */ | 450 | /* Handle multiple unicast addresses */ |
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h index 5923ca62d793..99037386080a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | |||
@@ -84,7 +84,7 @@ | |||
84 | #define XGMAC_TSIE BIT(12) | 84 | #define XGMAC_TSIE BIT(12) |
85 | #define XGMAC_LPIIE BIT(5) | 85 | #define XGMAC_LPIIE BIT(5) |
86 | #define XGMAC_PMTIE BIT(4) | 86 | #define XGMAC_PMTIE BIT(4) |
87 | #define XGMAC_INT_DEFAULT_EN (XGMAC_LPIIE | XGMAC_PMTIE | XGMAC_TSIE) | 87 | #define XGMAC_INT_DEFAULT_EN (XGMAC_LPIIE | XGMAC_PMTIE) |
88 | #define XGMAC_Qx_TX_FLOW_CTRL(x) (0x00000070 + (x) * 4) | 88 | #define XGMAC_Qx_TX_FLOW_CTRL(x) (0x00000070 + (x) * 4) |
89 | #define XGMAC_PT GENMASK(31, 16) | 89 | #define XGMAC_PT GENMASK(31, 16) |
90 | #define XGMAC_PT_SHIFT 16 | 90 | #define XGMAC_PT_SHIFT 16 |
@@ -122,6 +122,7 @@ | |||
122 | #define XGMAC_HWFEAT_GMIISEL BIT(1) | 122 | #define XGMAC_HWFEAT_GMIISEL BIT(1) |
123 | #define XGMAC_HW_FEATURE1 0x00000120 | 123 | #define XGMAC_HW_FEATURE1 0x00000120 |
124 | #define XGMAC_HWFEAT_L3L4FNUM GENMASK(30, 27) | 124 | #define XGMAC_HWFEAT_L3L4FNUM GENMASK(30, 27) |
125 | #define XGMAC_HWFEAT_HASHTBLSZ GENMASK(25, 24) | ||
125 | #define XGMAC_HWFEAT_RSSEN BIT(20) | 126 | #define XGMAC_HWFEAT_RSSEN BIT(20) |
126 | #define XGMAC_HWFEAT_TSOEN BIT(18) | 127 | #define XGMAC_HWFEAT_TSOEN BIT(18) |
127 | #define XGMAC_HWFEAT_SPHEN BIT(17) | 128 | #define XGMAC_HWFEAT_SPHEN BIT(17) |
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c index 2b277b2c586b..5031398e612c 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c | |||
@@ -472,7 +472,7 @@ static void dwxgmac2_set_filter(struct mac_device_info *hw, | |||
472 | dwxgmac2_set_mchash(ioaddr, mc_filter, mcbitslog2); | 472 | dwxgmac2_set_mchash(ioaddr, mc_filter, mcbitslog2); |
473 | 473 | ||
474 | /* Handle multiple unicast addresses */ | 474 | /* Handle multiple unicast addresses */ |
475 | if (netdev_uc_count(dev) > XGMAC_ADDR_MAX) { | 475 | if (netdev_uc_count(dev) > hw->unicast_filter_entries) { |
476 | value |= XGMAC_FILTER_PR; | 476 | value |= XGMAC_FILTER_PR; |
477 | } else { | 477 | } else { |
478 | struct netdev_hw_addr *ha; | 478 | struct netdev_hw_addr *ha; |
@@ -523,8 +523,8 @@ static int dwxgmac2_rss_configure(struct mac_device_info *hw, | |||
523 | struct stmmac_rss *cfg, u32 num_rxq) | 523 | struct stmmac_rss *cfg, u32 num_rxq) |
524 | { | 524 | { |
525 | void __iomem *ioaddr = hw->pcsr; | 525 | void __iomem *ioaddr = hw->pcsr; |
526 | u32 value, *key; | ||
526 | int i, ret; | 527 | int i, ret; |
527 | u32 value; | ||
528 | 528 | ||
529 | value = readl(ioaddr + XGMAC_RSS_CTRL); | 529 | value = readl(ioaddr + XGMAC_RSS_CTRL); |
530 | if (!cfg || !cfg->enable) { | 530 | if (!cfg || !cfg->enable) { |
@@ -533,8 +533,9 @@ static int dwxgmac2_rss_configure(struct mac_device_info *hw, | |||
533 | return 0; | 533 | return 0; |
534 | } | 534 | } |
535 | 535 | ||
536 | for (i = 0; i < (sizeof(cfg->key) / sizeof(u32)); i++) { | 536 | key = (u32 *)cfg->key; |
537 | ret = dwxgmac2_rss_write_reg(ioaddr, true, i, cfg->key[i]); | 537 | for (i = 0; i < (ARRAY_SIZE(cfg->key) / sizeof(u32)); i++) { |
538 | ret = dwxgmac2_rss_write_reg(ioaddr, true, i, key[i]); | ||
538 | if (ret) | 539 | if (ret) |
539 | return ret; | 540 | return ret; |
540 | } | 541 | } |
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c index 53c4a40d8386..965cbe3e6f51 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | |||
@@ -380,6 +380,7 @@ static void dwxgmac2_get_hw_feature(void __iomem *ioaddr, | |||
380 | /* MAC HW feature 1 */ | 380 | /* MAC HW feature 1 */ |
381 | hw_cap = readl(ioaddr + XGMAC_HW_FEATURE1); | 381 | hw_cap = readl(ioaddr + XGMAC_HW_FEATURE1); |
382 | dma_cap->l3l4fnum = (hw_cap & XGMAC_HWFEAT_L3L4FNUM) >> 27; | 382 | dma_cap->l3l4fnum = (hw_cap & XGMAC_HWFEAT_L3L4FNUM) >> 27; |
383 | dma_cap->hash_tb_sz = (hw_cap & XGMAC_HWFEAT_HASHTBLSZ) >> 24; | ||
383 | dma_cap->rssen = (hw_cap & XGMAC_HWFEAT_RSSEN) >> 20; | 384 | dma_cap->rssen = (hw_cap & XGMAC_HWFEAT_RSSEN) >> 20; |
384 | dma_cap->tsoen = (hw_cap & XGMAC_HWFEAT_TSOEN) >> 18; | 385 | dma_cap->tsoen = (hw_cap & XGMAC_HWFEAT_TSOEN) >> 18; |
385 | dma_cap->sphen = (hw_cap & XGMAC_HWFEAT_SPHEN) >> 17; | 386 | dma_cap->sphen = (hw_cap & XGMAC_HWFEAT_SPHEN) >> 17; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index d3232738fb25..c76a1336a451 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
@@ -629,6 +629,7 @@ static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr) | |||
629 | config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; | 629 | config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; |
630 | ptp_v2 = PTP_TCR_TSVER2ENA; | 630 | ptp_v2 = PTP_TCR_TSVER2ENA; |
631 | snap_type_sel = PTP_TCR_SNAPTYPSEL_1; | 631 | snap_type_sel = PTP_TCR_SNAPTYPSEL_1; |
632 | ts_event_en = PTP_TCR_TSEVNTENA; | ||
632 | ptp_over_ipv4_udp = PTP_TCR_TSIPV4ENA; | 633 | ptp_over_ipv4_udp = PTP_TCR_TSIPV4ENA; |
633 | ptp_over_ipv6_udp = PTP_TCR_TSIPV6ENA; | 634 | ptp_over_ipv6_udp = PTP_TCR_TSIPV6ENA; |
634 | ptp_over_ethernet = PTP_TCR_TSIPENA; | 635 | ptp_over_ethernet = PTP_TCR_TSIPENA; |
@@ -4715,11 +4716,9 @@ int stmmac_suspend(struct device *dev) | |||
4715 | if (!ndev || !netif_running(ndev)) | 4716 | if (!ndev || !netif_running(ndev)) |
4716 | return 0; | 4717 | return 0; |
4717 | 4718 | ||
4718 | mutex_lock(&priv->lock); | 4719 | phylink_mac_change(priv->phylink, false); |
4719 | 4720 | ||
4720 | rtnl_lock(); | 4721 | mutex_lock(&priv->lock); |
4721 | phylink_stop(priv->phylink); | ||
4722 | rtnl_unlock(); | ||
4723 | 4722 | ||
4724 | netif_device_detach(ndev); | 4723 | netif_device_detach(ndev); |
4725 | stmmac_stop_all_queues(priv); | 4724 | stmmac_stop_all_queues(priv); |
@@ -4734,6 +4733,12 @@ int stmmac_suspend(struct device *dev) | |||
4734 | stmmac_pmt(priv, priv->hw, priv->wolopts); | 4733 | stmmac_pmt(priv, priv->hw, priv->wolopts); |
4735 | priv->irq_wake = 1; | 4734 | priv->irq_wake = 1; |
4736 | } else { | 4735 | } else { |
4736 | mutex_unlock(&priv->lock); | ||
4737 | rtnl_lock(); | ||
4738 | phylink_stop(priv->phylink); | ||
4739 | rtnl_unlock(); | ||
4740 | mutex_lock(&priv->lock); | ||
4741 | |||
4737 | stmmac_mac_set(priv, priv->ioaddr, false); | 4742 | stmmac_mac_set(priv, priv->ioaddr, false); |
4738 | pinctrl_pm_select_sleep_state(priv->device); | 4743 | pinctrl_pm_select_sleep_state(priv->device); |
4739 | /* Disable clock in case of PWM is off */ | 4744 | /* Disable clock in case of PWM is off */ |
@@ -4824,12 +4829,16 @@ int stmmac_resume(struct device *dev) | |||
4824 | 4829 | ||
4825 | stmmac_start_all_queues(priv); | 4830 | stmmac_start_all_queues(priv); |
4826 | 4831 | ||
4827 | rtnl_lock(); | ||
4828 | phylink_start(priv->phylink); | ||
4829 | rtnl_unlock(); | ||
4830 | |||
4831 | mutex_unlock(&priv->lock); | 4832 | mutex_unlock(&priv->lock); |
4832 | 4833 | ||
4834 | if (!device_may_wakeup(priv->device)) { | ||
4835 | rtnl_lock(); | ||
4836 | phylink_start(priv->phylink); | ||
4837 | rtnl_unlock(); | ||
4838 | } | ||
4839 | |||
4840 | phylink_mac_change(priv->phylink, true); | ||
4841 | |||
4833 | return 0; | 4842 | return 0; |
4834 | } | 4843 | } |
4835 | EXPORT_SYMBOL_GPL(stmmac_resume); | 4844 | EXPORT_SYMBOL_GPL(stmmac_resume); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c index 5f66f6161629..cc76a42c7466 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c | |||
@@ -1564,10 +1564,6 @@ static int __stmmac_test_jumbo(struct stmmac_priv *priv, u16 queue) | |||
1564 | struct stmmac_packet_attrs attr = { }; | 1564 | struct stmmac_packet_attrs attr = { }; |
1565 | int size = priv->dma_buf_sz; | 1565 | int size = priv->dma_buf_sz; |
1566 | 1566 | ||
1567 | /* Only XGMAC has SW support for multiple RX descs in same packet */ | ||
1568 | if (priv->plat->has_xgmac) | ||
1569 | size = priv->dev->max_mtu; | ||
1570 | |||
1571 | attr.dst = priv->dev->dev_addr; | 1567 | attr.dst = priv->dev->dev_addr; |
1572 | attr.max_size = size - ETH_FCS_LEN; | 1568 | attr.max_size = size - ETH_FCS_LEN; |
1573 | attr.queue_mapping = queue; | 1569 | attr.queue_mapping = queue; |
diff --git a/drivers/net/ieee802154/atusb.c b/drivers/net/ieee802154/atusb.c index ceddb424f887..0dd0ba915ab9 100644 --- a/drivers/net/ieee802154/atusb.c +++ b/drivers/net/ieee802154/atusb.c | |||
@@ -1137,10 +1137,11 @@ static void atusb_disconnect(struct usb_interface *interface) | |||
1137 | 1137 | ||
1138 | ieee802154_unregister_hw(atusb->hw); | 1138 | ieee802154_unregister_hw(atusb->hw); |
1139 | 1139 | ||
1140 | usb_put_dev(atusb->usb_dev); | ||
1141 | |||
1140 | ieee802154_free_hw(atusb->hw); | 1142 | ieee802154_free_hw(atusb->hw); |
1141 | 1143 | ||
1142 | usb_set_intfdata(interface, NULL); | 1144 | usb_set_intfdata(interface, NULL); |
1143 | usb_put_dev(atusb->usb_dev); | ||
1144 | 1145 | ||
1145 | pr_debug("%s done\n", __func__); | 1146 | pr_debug("%s done\n", __func__); |
1146 | } | 1147 | } |
diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c index 11402dc347db..430c93786153 100644 --- a/drivers/net/ieee802154/ca8210.c +++ b/drivers/net/ieee802154/ca8210.c | |||
@@ -3145,12 +3145,12 @@ static int ca8210_probe(struct spi_device *spi_device) | |||
3145 | goto error; | 3145 | goto error; |
3146 | } | 3146 | } |
3147 | 3147 | ||
3148 | priv->spi->dev.platform_data = pdata; | ||
3148 | ret = ca8210_get_platform_data(priv->spi, pdata); | 3149 | ret = ca8210_get_platform_data(priv->spi, pdata); |
3149 | if (ret) { | 3150 | if (ret) { |
3150 | dev_crit(&spi_device->dev, "ca8210_get_platform_data failed\n"); | 3151 | dev_crit(&spi_device->dev, "ca8210_get_platform_data failed\n"); |
3151 | goto error; | 3152 | goto error; |
3152 | } | 3153 | } |
3153 | priv->spi->dev.platform_data = pdata; | ||
3154 | 3154 | ||
3155 | ret = ca8210_dev_com_init(priv); | 3155 | ret = ca8210_dev_com_init(priv); |
3156 | if (ret) { | 3156 | if (ret) { |
diff --git a/drivers/net/ieee802154/mcr20a.c b/drivers/net/ieee802154/mcr20a.c index 17f2300e63ee..8dc04e2590b1 100644 --- a/drivers/net/ieee802154/mcr20a.c +++ b/drivers/net/ieee802154/mcr20a.c | |||
@@ -800,7 +800,7 @@ mcr20a_handle_rx_read_buf_complete(void *context) | |||
800 | if (!skb) | 800 | if (!skb) |
801 | return; | 801 | return; |
802 | 802 | ||
803 | memcpy(skb_put(skb, len), lp->rx_buf, len); | 803 | __skb_put_data(skb, lp->rx_buf, len); |
804 | ieee802154_rx_irqsafe(lp->hw, skb, lp->rx_lqi[0]); | 804 | ieee802154_rx_irqsafe(lp->hw, skb, lp->rx_lqi[0]); |
805 | 805 | ||
806 | print_hex_dump_debug("mcr20a rx: ", DUMP_PREFIX_OFFSET, 16, 1, | 806 | print_hex_dump_debug("mcr20a rx: ", DUMP_PREFIX_OFFSET, 16, 1, |
diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c index 2aa7b2e60046..1eb5d4fb8925 100644 --- a/drivers/net/phy/at803x.c +++ b/drivers/net/phy/at803x.c | |||
@@ -15,6 +15,15 @@ | |||
15 | #include <linux/of_gpio.h> | 15 | #include <linux/of_gpio.h> |
16 | #include <linux/gpio/consumer.h> | 16 | #include <linux/gpio/consumer.h> |
17 | 17 | ||
18 | #define AT803X_SPECIFIC_STATUS 0x11 | ||
19 | #define AT803X_SS_SPEED_MASK (3 << 14) | ||
20 | #define AT803X_SS_SPEED_1000 (2 << 14) | ||
21 | #define AT803X_SS_SPEED_100 (1 << 14) | ||
22 | #define AT803X_SS_SPEED_10 (0 << 14) | ||
23 | #define AT803X_SS_DUPLEX BIT(13) | ||
24 | #define AT803X_SS_SPEED_DUPLEX_RESOLVED BIT(11) | ||
25 | #define AT803X_SS_MDIX BIT(6) | ||
26 | |||
18 | #define AT803X_INTR_ENABLE 0x12 | 27 | #define AT803X_INTR_ENABLE 0x12 |
19 | #define AT803X_INTR_ENABLE_AUTONEG_ERR BIT(15) | 28 | #define AT803X_INTR_ENABLE_AUTONEG_ERR BIT(15) |
20 | #define AT803X_INTR_ENABLE_SPEED_CHANGED BIT(14) | 29 | #define AT803X_INTR_ENABLE_SPEED_CHANGED BIT(14) |
@@ -357,6 +366,64 @@ static int at803x_aneg_done(struct phy_device *phydev) | |||
357 | return aneg_done; | 366 | return aneg_done; |
358 | } | 367 | } |
359 | 368 | ||
369 | static int at803x_read_status(struct phy_device *phydev) | ||
370 | { | ||
371 | int ss, err, old_link = phydev->link; | ||
372 | |||
373 | /* Update the link, but return if there was an error */ | ||
374 | err = genphy_update_link(phydev); | ||
375 | if (err) | ||
376 | return err; | ||
377 | |||
378 | /* why bother the PHY if nothing can have changed */ | ||
379 | if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) | ||
380 | return 0; | ||
381 | |||
382 | phydev->speed = SPEED_UNKNOWN; | ||
383 | phydev->duplex = DUPLEX_UNKNOWN; | ||
384 | phydev->pause = 0; | ||
385 | phydev->asym_pause = 0; | ||
386 | |||
387 | err = genphy_read_lpa(phydev); | ||
388 | if (err < 0) | ||
389 | return err; | ||
390 | |||
391 | /* Read the AT8035 PHY-Specific Status register, which indicates the | ||
392 | * speed and duplex that the PHY is actually using, irrespective of | ||
393 | * whether we are in autoneg mode or not. | ||
394 | */ | ||
395 | ss = phy_read(phydev, AT803X_SPECIFIC_STATUS); | ||
396 | if (ss < 0) | ||
397 | return ss; | ||
398 | |||
399 | if (ss & AT803X_SS_SPEED_DUPLEX_RESOLVED) { | ||
400 | switch (ss & AT803X_SS_SPEED_MASK) { | ||
401 | case AT803X_SS_SPEED_10: | ||
402 | phydev->speed = SPEED_10; | ||
403 | break; | ||
404 | case AT803X_SS_SPEED_100: | ||
405 | phydev->speed = SPEED_100; | ||
406 | break; | ||
407 | case AT803X_SS_SPEED_1000: | ||
408 | phydev->speed = SPEED_1000; | ||
409 | break; | ||
410 | } | ||
411 | if (ss & AT803X_SS_DUPLEX) | ||
412 | phydev->duplex = DUPLEX_FULL; | ||
413 | else | ||
414 | phydev->duplex = DUPLEX_HALF; | ||
415 | if (ss & AT803X_SS_MDIX) | ||
416 | phydev->mdix = ETH_TP_MDI_X; | ||
417 | else | ||
418 | phydev->mdix = ETH_TP_MDI; | ||
419 | } | ||
420 | |||
421 | if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) | ||
422 | phy_resolve_aneg_pause(phydev); | ||
423 | |||
424 | return 0; | ||
425 | } | ||
426 | |||
360 | static struct phy_driver at803x_driver[] = { | 427 | static struct phy_driver at803x_driver[] = { |
361 | { | 428 | { |
362 | /* ATHEROS 8035 */ | 429 | /* ATHEROS 8035 */ |
@@ -370,6 +437,7 @@ static struct phy_driver at803x_driver[] = { | |||
370 | .suspend = at803x_suspend, | 437 | .suspend = at803x_suspend, |
371 | .resume = at803x_resume, | 438 | .resume = at803x_resume, |
372 | /* PHY_GBIT_FEATURES */ | 439 | /* PHY_GBIT_FEATURES */ |
440 | .read_status = at803x_read_status, | ||
373 | .ack_interrupt = at803x_ack_interrupt, | 441 | .ack_interrupt = at803x_ack_interrupt, |
374 | .config_intr = at803x_config_intr, | 442 | .config_intr = at803x_config_intr, |
375 | }, { | 443 | }, { |
@@ -399,6 +467,7 @@ static struct phy_driver at803x_driver[] = { | |||
399 | .suspend = at803x_suspend, | 467 | .suspend = at803x_suspend, |
400 | .resume = at803x_resume, | 468 | .resume = at803x_resume, |
401 | /* PHY_GBIT_FEATURES */ | 469 | /* PHY_GBIT_FEATURES */ |
470 | .read_status = at803x_read_status, | ||
402 | .aneg_done = at803x_aneg_done, | 471 | .aneg_done = at803x_aneg_done, |
403 | .ack_interrupt = &at803x_ack_interrupt, | 472 | .ack_interrupt = &at803x_ack_interrupt, |
404 | .config_intr = &at803x_config_intr, | 473 | .config_intr = &at803x_config_intr, |
diff --git a/drivers/net/phy/mdio_device.c b/drivers/net/phy/mdio_device.c index e282600bd83e..c1d345c3cab3 100644 --- a/drivers/net/phy/mdio_device.c +++ b/drivers/net/phy/mdio_device.c | |||
@@ -121,7 +121,7 @@ void mdio_device_reset(struct mdio_device *mdiodev, int value) | |||
121 | return; | 121 | return; |
122 | 122 | ||
123 | if (mdiodev->reset_gpio) | 123 | if (mdiodev->reset_gpio) |
124 | gpiod_set_value(mdiodev->reset_gpio, value); | 124 | gpiod_set_value_cansleep(mdiodev->reset_gpio, value); |
125 | 125 | ||
126 | if (mdiodev->reset_ctrl) { | 126 | if (mdiodev->reset_ctrl) { |
127 | if (value) | 127 | if (value) |
diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c index 369903d9b6ec..9412669b579c 100644 --- a/drivers/net/phy/phy-core.c +++ b/drivers/net/phy/phy-core.c | |||
@@ -283,6 +283,18 @@ void of_set_phy_eee_broken(struct phy_device *phydev) | |||
283 | phydev->eee_broken_modes = broken; | 283 | phydev->eee_broken_modes = broken; |
284 | } | 284 | } |
285 | 285 | ||
286 | void phy_resolve_aneg_pause(struct phy_device *phydev) | ||
287 | { | ||
288 | if (phydev->duplex == DUPLEX_FULL) { | ||
289 | phydev->pause = linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, | ||
290 | phydev->lp_advertising); | ||
291 | phydev->asym_pause = linkmode_test_bit( | ||
292 | ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
293 | phydev->lp_advertising); | ||
294 | } | ||
295 | } | ||
296 | EXPORT_SYMBOL_GPL(phy_resolve_aneg_pause); | ||
297 | |||
286 | /** | 298 | /** |
287 | * phy_resolve_aneg_linkmode - resolve the advertisements into phy settings | 299 | * phy_resolve_aneg_linkmode - resolve the advertisements into phy settings |
288 | * @phydev: The phy_device struct | 300 | * @phydev: The phy_device struct |
@@ -305,13 +317,7 @@ void phy_resolve_aneg_linkmode(struct phy_device *phydev) | |||
305 | break; | 317 | break; |
306 | } | 318 | } |
307 | 319 | ||
308 | if (phydev->duplex == DUPLEX_FULL) { | 320 | phy_resolve_aneg_pause(phydev); |
309 | phydev->pause = linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, | ||
310 | phydev->lp_advertising); | ||
311 | phydev->asym_pause = linkmode_test_bit( | ||
312 | ETHTOOL_LINK_MODE_Asym_Pause_BIT, | ||
313 | phydev->lp_advertising); | ||
314 | } | ||
315 | } | 321 | } |
316 | EXPORT_SYMBOL_GPL(phy_resolve_aneg_linkmode); | 322 | EXPORT_SYMBOL_GPL(phy_resolve_aneg_linkmode); |
317 | 323 | ||
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 7c92afd36bbe..119e6f466056 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
@@ -457,6 +457,11 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) | |||
457 | val); | 457 | val); |
458 | change_autoneg = true; | 458 | change_autoneg = true; |
459 | break; | 459 | break; |
460 | case MII_CTRL1000: | ||
461 | mii_ctrl1000_mod_linkmode_adv_t(phydev->advertising, | ||
462 | val); | ||
463 | change_autoneg = true; | ||
464 | break; | ||
460 | default: | 465 | default: |
461 | /* do nothing */ | 466 | /* do nothing */ |
462 | break; | 467 | break; |
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index d347ddcac45b..9d2bbb13293e 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
@@ -1783,32 +1783,9 @@ done: | |||
1783 | } | 1783 | } |
1784 | EXPORT_SYMBOL(genphy_update_link); | 1784 | EXPORT_SYMBOL(genphy_update_link); |
1785 | 1785 | ||
1786 | /** | 1786 | int genphy_read_lpa(struct phy_device *phydev) |
1787 | * genphy_read_status - check the link status and update current link state | ||
1788 | * @phydev: target phy_device struct | ||
1789 | * | ||
1790 | * Description: Check the link, then figure out the current state | ||
1791 | * by comparing what we advertise with what the link partner | ||
1792 | * advertises. Start by checking the gigabit possibilities, | ||
1793 | * then move on to 10/100. | ||
1794 | */ | ||
1795 | int genphy_read_status(struct phy_device *phydev) | ||
1796 | { | 1787 | { |
1797 | int lpa, lpagb, err, old_link = phydev->link; | 1788 | int lpa, lpagb; |
1798 | |||
1799 | /* Update the link, but return if there was an error */ | ||
1800 | err = genphy_update_link(phydev); | ||
1801 | if (err) | ||
1802 | return err; | ||
1803 | |||
1804 | /* why bother the PHY if nothing can have changed */ | ||
1805 | if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) | ||
1806 | return 0; | ||
1807 | |||
1808 | phydev->speed = SPEED_UNKNOWN; | ||
1809 | phydev->duplex = DUPLEX_UNKNOWN; | ||
1810 | phydev->pause = 0; | ||
1811 | phydev->asym_pause = 0; | ||
1812 | 1789 | ||
1813 | if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { | 1790 | if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { |
1814 | if (phydev->is_gigabit_capable) { | 1791 | if (phydev->is_gigabit_capable) { |
@@ -1838,6 +1815,44 @@ int genphy_read_status(struct phy_device *phydev) | |||
1838 | return lpa; | 1815 | return lpa; |
1839 | 1816 | ||
1840 | mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); | 1817 | mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); |
1818 | } | ||
1819 | |||
1820 | return 0; | ||
1821 | } | ||
1822 | EXPORT_SYMBOL(genphy_read_lpa); | ||
1823 | |||
1824 | /** | ||
1825 | * genphy_read_status - check the link status and update current link state | ||
1826 | * @phydev: target phy_device struct | ||
1827 | * | ||
1828 | * Description: Check the link, then figure out the current state | ||
1829 | * by comparing what we advertise with what the link partner | ||
1830 | * advertises. Start by checking the gigabit possibilities, | ||
1831 | * then move on to 10/100. | ||
1832 | */ | ||
1833 | int genphy_read_status(struct phy_device *phydev) | ||
1834 | { | ||
1835 | int err, old_link = phydev->link; | ||
1836 | |||
1837 | /* Update the link, but return if there was an error */ | ||
1838 | err = genphy_update_link(phydev); | ||
1839 | if (err) | ||
1840 | return err; | ||
1841 | |||
1842 | /* why bother the PHY if nothing can have changed */ | ||
1843 | if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) | ||
1844 | return 0; | ||
1845 | |||
1846 | phydev->speed = SPEED_UNKNOWN; | ||
1847 | phydev->duplex = DUPLEX_UNKNOWN; | ||
1848 | phydev->pause = 0; | ||
1849 | phydev->asym_pause = 0; | ||
1850 | |||
1851 | err = genphy_read_lpa(phydev); | ||
1852 | if (err < 0) | ||
1853 | return err; | ||
1854 | |||
1855 | if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { | ||
1841 | phy_resolve_aneg_linkmode(phydev); | 1856 | phy_resolve_aneg_linkmode(phydev); |
1842 | } else if (phydev->autoneg == AUTONEG_DISABLE) { | 1857 | } else if (phydev->autoneg == AUTONEG_DISABLE) { |
1843 | int bmcr = phy_read(phydev, MII_BMCR); | 1858 | int bmcr = phy_read(phydev, MII_BMCR); |
diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c index 734de7de03f7..e1fabb3e3246 100644 --- a/drivers/net/ppp/pptp.c +++ b/drivers/net/ppp/pptp.c | |||
@@ -238,7 +238,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
238 | skb_dst_drop(skb); | 238 | skb_dst_drop(skb); |
239 | skb_dst_set(skb, &rt->dst); | 239 | skb_dst_set(skb, &rt->dst); |
240 | 240 | ||
241 | nf_reset(skb); | 241 | nf_reset_ct(skb); |
242 | 242 | ||
243 | skb->ip_summed = CHECKSUM_NONE; | 243 | skb->ip_summed = CHECKSUM_NONE; |
244 | ip_select_ident(net, skb, NULL); | 244 | ip_select_ident(net, skb, NULL); |
@@ -358,7 +358,7 @@ static int pptp_rcv(struct sk_buff *skb) | |||
358 | po = lookup_chan(htons(header->call_id), iph->saddr); | 358 | po = lookup_chan(htons(header->call_id), iph->saddr); |
359 | if (po) { | 359 | if (po) { |
360 | skb_dst_drop(skb); | 360 | skb_dst_drop(skb); |
361 | nf_reset(skb); | 361 | nf_reset_ct(skb); |
362 | return sk_receive_skb(sk_pppox(po), skb, 0); | 362 | return sk_receive_skb(sk_pppox(po), skb, 0); |
363 | } | 363 | } |
364 | drop: | 364 | drop: |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index aab0be40d443..812dc3a65efb 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -1104,7 +1104,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1104 | */ | 1104 | */ |
1105 | skb_orphan(skb); | 1105 | skb_orphan(skb); |
1106 | 1106 | ||
1107 | nf_reset(skb); | 1107 | nf_reset_ct(skb); |
1108 | 1108 | ||
1109 | if (ptr_ring_produce(&tfile->tx_ring, skb)) | 1109 | if (ptr_ring_produce(&tfile->tx_ring, skb)) |
1110 | goto drop; | 1110 | goto drop; |
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index ce78714f536f..a505b2ab88b8 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
@@ -2620,14 +2620,18 @@ static struct hso_device *hso_create_bulk_serial_device( | |||
2620 | */ | 2620 | */ |
2621 | if (serial->tiocmget) { | 2621 | if (serial->tiocmget) { |
2622 | tiocmget = serial->tiocmget; | 2622 | tiocmget = serial->tiocmget; |
2623 | tiocmget->endp = hso_get_ep(interface, | ||
2624 | USB_ENDPOINT_XFER_INT, | ||
2625 | USB_DIR_IN); | ||
2626 | if (!tiocmget->endp) { | ||
2627 | dev_err(&interface->dev, "Failed to find INT IN ep\n"); | ||
2628 | goto exit; | ||
2629 | } | ||
2630 | |||
2623 | tiocmget->urb = usb_alloc_urb(0, GFP_KERNEL); | 2631 | tiocmget->urb = usb_alloc_urb(0, GFP_KERNEL); |
2624 | if (tiocmget->urb) { | 2632 | if (tiocmget->urb) { |
2625 | mutex_init(&tiocmget->mutex); | 2633 | mutex_init(&tiocmget->mutex); |
2626 | init_waitqueue_head(&tiocmget->waitq); | 2634 | init_waitqueue_head(&tiocmget->waitq); |
2627 | tiocmget->endp = hso_get_ep( | ||
2628 | interface, | ||
2629 | USB_ENDPOINT_XFER_INT, | ||
2630 | USB_DIR_IN); | ||
2631 | } else | 2635 | } else |
2632 | hso_free_tiomget(serial); | 2636 | hso_free_tiomget(serial); |
2633 | } | 2637 | } |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index b6dc5d714b5e..3d77cd402ba9 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
@@ -1350,6 +1350,7 @@ static const struct usb_device_id products[] = { | |||
1350 | {QMI_FIXED_INTF(0x1e2d, 0x0082, 4)}, /* Cinterion PHxx,PXxx (2 RmNet) */ | 1350 | {QMI_FIXED_INTF(0x1e2d, 0x0082, 4)}, /* Cinterion PHxx,PXxx (2 RmNet) */ |
1351 | {QMI_FIXED_INTF(0x1e2d, 0x0082, 5)}, /* Cinterion PHxx,PXxx (2 RmNet) */ | 1351 | {QMI_FIXED_INTF(0x1e2d, 0x0082, 5)}, /* Cinterion PHxx,PXxx (2 RmNet) */ |
1352 | {QMI_FIXED_INTF(0x1e2d, 0x0083, 4)}, /* Cinterion PHxx,PXxx (1 RmNet + USB Audio)*/ | 1352 | {QMI_FIXED_INTF(0x1e2d, 0x0083, 4)}, /* Cinterion PHxx,PXxx (1 RmNet + USB Audio)*/ |
1353 | {QMI_QUIRK_SET_DTR(0x1e2d, 0x00b0, 4)}, /* Cinterion CLS8 */ | ||
1353 | {QMI_FIXED_INTF(0x413c, 0x81a2, 8)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */ | 1354 | {QMI_FIXED_INTF(0x413c, 0x81a2, 8)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */ |
1354 | {QMI_FIXED_INTF(0x413c, 0x81a3, 8)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card */ | 1355 | {QMI_FIXED_INTF(0x413c, 0x81a3, 8)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card */ |
1355 | {QMI_FIXED_INTF(0x413c, 0x81a4, 8)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ | 1356 | {QMI_FIXED_INTF(0x413c, 0x81a4, 8)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ |
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 08726090570e..cee9fef925cd 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
@@ -4799,10 +4799,9 @@ static int rtl8152_reset_resume(struct usb_interface *intf) | |||
4799 | struct r8152 *tp = usb_get_intfdata(intf); | 4799 | struct r8152 *tp = usb_get_intfdata(intf); |
4800 | 4800 | ||
4801 | clear_bit(SELECTIVE_SUSPEND, &tp->flags); | 4801 | clear_bit(SELECTIVE_SUSPEND, &tp->flags); |
4802 | mutex_lock(&tp->control); | ||
4803 | tp->rtl_ops.init(tp); | 4802 | tp->rtl_ops.init(tp); |
4804 | queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0); | 4803 | queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0); |
4805 | mutex_unlock(&tp->control); | 4804 | set_ethernet_addr(tp); |
4806 | return rtl8152_resume(intf); | 4805 | return rtl8152_resume(intf); |
4807 | } | 4806 | } |
4808 | 4807 | ||
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index ba98e0971b84..5a635f028bdc 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -1585,7 +1585,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1585 | /* Don't wait up for transmitted skbs to be freed. */ | 1585 | /* Don't wait up for transmitted skbs to be freed. */ |
1586 | if (!use_napi) { | 1586 | if (!use_napi) { |
1587 | skb_orphan(skb); | 1587 | skb_orphan(skb); |
1588 | nf_reset(skb); | 1588 | nf_reset_ct(skb); |
1589 | } | 1589 | } |
1590 | 1590 | ||
1591 | /* If running out of space, stop queue to avoid getting packets that we | 1591 | /* If running out of space, stop queue to avoid getting packets that we |
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index a4b38a980c3c..ee52bde058df 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c | |||
@@ -366,7 +366,7 @@ static int vrf_finish_output6(struct net *net, struct sock *sk, | |||
366 | struct neighbour *neigh; | 366 | struct neighbour *neigh; |
367 | int ret; | 367 | int ret; |
368 | 368 | ||
369 | nf_reset(skb); | 369 | nf_reset_ct(skb); |
370 | 370 | ||
371 | skb->protocol = htons(ETH_P_IPV6); | 371 | skb->protocol = htons(ETH_P_IPV6); |
372 | skb->dev = dev; | 372 | skb->dev = dev; |
@@ -459,7 +459,7 @@ static struct sk_buff *vrf_ip6_out_direct(struct net_device *vrf_dev, | |||
459 | 459 | ||
460 | /* reset skb device */ | 460 | /* reset skb device */ |
461 | if (likely(err == 1)) | 461 | if (likely(err == 1)) |
462 | nf_reset(skb); | 462 | nf_reset_ct(skb); |
463 | else | 463 | else |
464 | skb = NULL; | 464 | skb = NULL; |
465 | 465 | ||
@@ -560,7 +560,7 @@ static int vrf_finish_output(struct net *net, struct sock *sk, struct sk_buff *s | |||
560 | bool is_v6gw = false; | 560 | bool is_v6gw = false; |
561 | int ret = -EINVAL; | 561 | int ret = -EINVAL; |
562 | 562 | ||
563 | nf_reset(skb); | 563 | nf_reset_ct(skb); |
564 | 564 | ||
565 | /* Be paranoid, rather than too clever. */ | 565 | /* Be paranoid, rather than too clever. */ |
566 | if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops)) { | 566 | if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops)) { |
@@ -670,7 +670,7 @@ static struct sk_buff *vrf_ip_out_direct(struct net_device *vrf_dev, | |||
670 | 670 | ||
671 | /* reset skb device */ | 671 | /* reset skb device */ |
672 | if (likely(err == 1)) | 672 | if (likely(err == 1)) |
673 | nf_reset(skb); | 673 | nf_reset_ct(skb); |
674 | else | 674 | else |
675 | skb = NULL; | 675 | skb = NULL; |
676 | 676 | ||
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index 635956024e88..45c73a6f09a1 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c | |||
@@ -1261,8 +1261,8 @@ static bool mac80211_hwsim_tx_frame_no_nl(struct ieee80211_hw *hw, | |||
1261 | skb_orphan(skb); | 1261 | skb_orphan(skb); |
1262 | skb_dst_drop(skb); | 1262 | skb_dst_drop(skb); |
1263 | skb->mark = 0; | 1263 | skb->mark = 0; |
1264 | secpath_reset(skb); | 1264 | skb_ext_reset(skb); |
1265 | nf_reset(skb); | 1265 | nf_reset_ct(skb); |
1266 | 1266 | ||
1267 | /* | 1267 | /* |
1268 | * Get absolute mactime here so all HWs RX at the "same time", and | 1268 | * Get absolute mactime here so all HWs RX at the "same time", and |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index e14ec75b61d6..482c6c8b0fb7 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
@@ -887,9 +887,9 @@ static int xennet_set_skb_gso(struct sk_buff *skb, | |||
887 | return 0; | 887 | return 0; |
888 | } | 888 | } |
889 | 889 | ||
890 | static RING_IDX xennet_fill_frags(struct netfront_queue *queue, | 890 | static int xennet_fill_frags(struct netfront_queue *queue, |
891 | struct sk_buff *skb, | 891 | struct sk_buff *skb, |
892 | struct sk_buff_head *list) | 892 | struct sk_buff_head *list) |
893 | { | 893 | { |
894 | RING_IDX cons = queue->rx.rsp_cons; | 894 | RING_IDX cons = queue->rx.rsp_cons; |
895 | struct sk_buff *nskb; | 895 | struct sk_buff *nskb; |
@@ -908,7 +908,7 @@ static RING_IDX xennet_fill_frags(struct netfront_queue *queue, | |||
908 | if (unlikely(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS)) { | 908 | if (unlikely(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS)) { |
909 | queue->rx.rsp_cons = ++cons + skb_queue_len(list); | 909 | queue->rx.rsp_cons = ++cons + skb_queue_len(list); |
910 | kfree_skb(nskb); | 910 | kfree_skb(nskb); |
911 | return ~0U; | 911 | return -ENOENT; |
912 | } | 912 | } |
913 | 913 | ||
914 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, | 914 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, |
@@ -919,7 +919,9 @@ static RING_IDX xennet_fill_frags(struct netfront_queue *queue, | |||
919 | kfree_skb(nskb); | 919 | kfree_skb(nskb); |
920 | } | 920 | } |
921 | 921 | ||
922 | return cons; | 922 | queue->rx.rsp_cons = cons; |
923 | |||
924 | return 0; | ||
923 | } | 925 | } |
924 | 926 | ||
925 | static int checksum_setup(struct net_device *dev, struct sk_buff *skb) | 927 | static int checksum_setup(struct net_device *dev, struct sk_buff *skb) |
@@ -1045,8 +1047,7 @@ err: | |||
1045 | skb->data_len = rx->status; | 1047 | skb->data_len = rx->status; |
1046 | skb->len += rx->status; | 1048 | skb->len += rx->status; |
1047 | 1049 | ||
1048 | i = xennet_fill_frags(queue, skb, &tmpq); | 1050 | if (unlikely(xennet_fill_frags(queue, skb, &tmpq))) |
1049 | if (unlikely(i == ~0U)) | ||
1050 | goto err; | 1051 | goto err; |
1051 | 1052 | ||
1052 | if (rx->flags & XEN_NETRXF_csum_blank) | 1053 | if (rx->flags & XEN_NETRXF_csum_blank) |
@@ -1056,7 +1057,7 @@ err: | |||
1056 | 1057 | ||
1057 | __skb_queue_tail(&rxq, skb); | 1058 | __skb_queue_tail(&rxq, skb); |
1058 | 1059 | ||
1059 | queue->rx.rsp_cons = ++i; | 1060 | i = ++queue->rx.rsp_cons; |
1060 | work_done++; | 1061 | work_done++; |
1061 | } | 1062 | } |
1062 | 1063 | ||
diff --git a/drivers/ptp/ptp_qoriq.c b/drivers/ptp/ptp_qoriq.c index c61f00b72e15..a577218d1ab7 100644 --- a/drivers/ptp/ptp_qoriq.c +++ b/drivers/ptp/ptp_qoriq.c | |||
@@ -507,6 +507,8 @@ int ptp_qoriq_init(struct ptp_qoriq *ptp_qoriq, void __iomem *base, | |||
507 | ptp_qoriq->regs.etts_regs = base + ETTS_REGS_OFFSET; | 507 | ptp_qoriq->regs.etts_regs = base + ETTS_REGS_OFFSET; |
508 | } | 508 | } |
509 | 509 | ||
510 | spin_lock_init(&ptp_qoriq->lock); | ||
511 | |||
510 | ktime_get_real_ts64(&now); | 512 | ktime_get_real_ts64(&now); |
511 | ptp_qoriq_settime(&ptp_qoriq->caps, &now); | 513 | ptp_qoriq_settime(&ptp_qoriq->caps, &now); |
512 | 514 | ||
@@ -514,7 +516,6 @@ int ptp_qoriq_init(struct ptp_qoriq *ptp_qoriq, void __iomem *base, | |||
514 | (ptp_qoriq->tclk_period & TCLK_PERIOD_MASK) << TCLK_PERIOD_SHIFT | | 516 | (ptp_qoriq->tclk_period & TCLK_PERIOD_MASK) << TCLK_PERIOD_SHIFT | |
515 | (ptp_qoriq->cksel & CKSEL_MASK) << CKSEL_SHIFT; | 517 | (ptp_qoriq->cksel & CKSEL_MASK) << CKSEL_SHIFT; |
516 | 518 | ||
517 | spin_lock_init(&ptp_qoriq->lock); | ||
518 | spin_lock_irqsave(&ptp_qoriq->lock, flags); | 519 | spin_lock_irqsave(&ptp_qoriq->lock, flags); |
519 | 520 | ||
520 | regs = &ptp_qoriq->regs; | 521 | regs = &ptp_qoriq->regs; |
diff --git a/drivers/staging/octeon/ethernet-tx.c b/drivers/staging/octeon/ethernet-tx.c index c64728fc21f2..a62057555d1b 100644 --- a/drivers/staging/octeon/ethernet-tx.c +++ b/drivers/staging/octeon/ethernet-tx.c | |||
@@ -349,10 +349,8 @@ int cvm_oct_xmit(struct sk_buff *skb, struct net_device *dev) | |||
349 | */ | 349 | */ |
350 | dst_release(skb_dst(skb)); | 350 | dst_release(skb_dst(skb)); |
351 | skb_dst_set(skb, NULL); | 351 | skb_dst_set(skb, NULL); |
352 | #ifdef CONFIG_XFRM | 352 | skb_ext_reset(skb); |
353 | secpath_reset(skb); | 353 | nf_reset_ct(skb); |
354 | #endif | ||
355 | nf_reset(skb); | ||
356 | 354 | ||
357 | #ifdef CONFIG_NET_SCHED | 355 | #ifdef CONFIG_NET_SCHED |
358 | skb->tc_index = 0; | 356 | skb->tc_index = 0; |
diff --git a/include/linux/dsa/sja1105.h b/include/linux/dsa/sja1105.h index 79435cfc20eb..897e799dbcb9 100644 --- a/include/linux/dsa/sja1105.h +++ b/include/linux/dsa/sja1105.h | |||
@@ -31,6 +31,8 @@ | |||
31 | #define SJA1105_META_SMAC 0x222222222222ull | 31 | #define SJA1105_META_SMAC 0x222222222222ull |
32 | #define SJA1105_META_DMAC 0x0180C200000Eull | 32 | #define SJA1105_META_DMAC 0x0180C200000Eull |
33 | 33 | ||
34 | #define SJA1105_HWTS_RX_EN 0 | ||
35 | |||
34 | /* Global tagger data: each struct sja1105_port has a reference to | 36 | /* Global tagger data: each struct sja1105_port has a reference to |
35 | * the structure defined in struct sja1105_private. | 37 | * the structure defined in struct sja1105_private. |
36 | */ | 38 | */ |
@@ -42,7 +44,7 @@ struct sja1105_tagger_data { | |||
42 | * from taggers running on multiple ports on SMP systems | 44 | * from taggers running on multiple ports on SMP systems |
43 | */ | 45 | */ |
44 | spinlock_t meta_lock; | 46 | spinlock_t meta_lock; |
45 | bool hwts_rx_en; | 47 | unsigned long state; |
46 | }; | 48 | }; |
47 | 49 | ||
48 | struct sja1105_skb_cb { | 50 | struct sja1105_skb_cb { |
diff --git a/include/linux/mii.h b/include/linux/mii.h index 5cd824c1c0ca..4ce8901a1af6 100644 --- a/include/linux/mii.h +++ b/include/linux/mii.h | |||
@@ -455,6 +455,15 @@ static inline void mii_lpa_mod_linkmode_lpa_t(unsigned long *lp_advertising, | |||
455 | lp_advertising, lpa & LPA_LPACK); | 455 | lp_advertising, lpa & LPA_LPACK); |
456 | } | 456 | } |
457 | 457 | ||
458 | static inline void mii_ctrl1000_mod_linkmode_adv_t(unsigned long *advertising, | ||
459 | u32 ctrl1000) | ||
460 | { | ||
461 | linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, advertising, | ||
462 | ctrl1000 & ADVERTISE_1000HALF); | ||
463 | linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, advertising, | ||
464 | ctrl1000 & ADVERTISE_1000FULL); | ||
465 | } | ||
466 | |||
458 | /** | 467 | /** |
459 | * linkmode_adv_to_lcl_adv_t | 468 | * linkmode_adv_to_lcl_adv_t |
460 | * @advertising:pointer to linkmode advertising | 469 | * @advertising:pointer to linkmode advertising |
diff --git a/include/linux/phy.h b/include/linux/phy.h index a7ecbe0e55aa..9a0e981df502 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h | |||
@@ -678,6 +678,7 @@ static inline bool phy_is_started(struct phy_device *phydev) | |||
678 | return phydev->state >= PHY_UP; | 678 | return phydev->state >= PHY_UP; |
679 | } | 679 | } |
680 | 680 | ||
681 | void phy_resolve_aneg_pause(struct phy_device *phydev); | ||
681 | void phy_resolve_aneg_linkmode(struct phy_device *phydev); | 682 | void phy_resolve_aneg_linkmode(struct phy_device *phydev); |
682 | 683 | ||
683 | /** | 684 | /** |
@@ -1076,6 +1077,7 @@ int genphy_config_eee_advert(struct phy_device *phydev); | |||
1076 | int __genphy_config_aneg(struct phy_device *phydev, bool changed); | 1077 | int __genphy_config_aneg(struct phy_device *phydev, bool changed); |
1077 | int genphy_aneg_done(struct phy_device *phydev); | 1078 | int genphy_aneg_done(struct phy_device *phydev); |
1078 | int genphy_update_link(struct phy_device *phydev); | 1079 | int genphy_update_link(struct phy_device *phydev); |
1080 | int genphy_read_lpa(struct phy_device *phydev); | ||
1079 | int genphy_read_status(struct phy_device *phydev); | 1081 | int genphy_read_status(struct phy_device *phydev); |
1080 | int genphy_suspend(struct phy_device *phydev); | 1082 | int genphy_suspend(struct phy_device *phydev); |
1081 | int genphy_resume(struct phy_device *phydev); | 1083 | int genphy_resume(struct phy_device *phydev); |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index e7d3b1a513ef..4351577b14d7 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -4160,15 +4160,12 @@ static inline void __skb_ext_copy(struct sk_buff *d, const struct sk_buff *s) {} | |||
4160 | static inline void skb_ext_copy(struct sk_buff *dst, const struct sk_buff *s) {} | 4160 | static inline void skb_ext_copy(struct sk_buff *dst, const struct sk_buff *s) {} |
4161 | #endif /* CONFIG_SKB_EXTENSIONS */ | 4161 | #endif /* CONFIG_SKB_EXTENSIONS */ |
4162 | 4162 | ||
4163 | static inline void nf_reset(struct sk_buff *skb) | 4163 | static inline void nf_reset_ct(struct sk_buff *skb) |
4164 | { | 4164 | { |
4165 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 4165 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
4166 | nf_conntrack_put(skb_nfct(skb)); | 4166 | nf_conntrack_put(skb_nfct(skb)); |
4167 | skb->_nfct = 0; | 4167 | skb->_nfct = 0; |
4168 | #endif | 4168 | #endif |
4169 | #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) | ||
4170 | skb_ext_del(skb, SKB_EXT_BRIDGE_NF); | ||
4171 | #endif | ||
4172 | } | 4169 | } |
4173 | 4170 | ||
4174 | static inline void nf_reset_trace(struct sk_buff *skb) | 4171 | static inline void nf_reset_trace(struct sk_buff *skb) |
diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index a13a62db3565..edc5c887a44c 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h | |||
@@ -1068,7 +1068,7 @@ TRACE_EVENT(rxrpc_recvmsg, | |||
1068 | ), | 1068 | ), |
1069 | 1069 | ||
1070 | TP_fast_assign( | 1070 | TP_fast_assign( |
1071 | __entry->call = call->debug_id; | 1071 | __entry->call = call ? call->debug_id : 0; |
1072 | __entry->why = why; | 1072 | __entry->why = why; |
1073 | __entry->seq = seq; | 1073 | __entry->seq = seq; |
1074 | __entry->offset = offset; | 1074 | __entry->offset = offset; |
diff --git a/lib/textsearch.c b/lib/textsearch.c index 4f16eec5d554..f68dea8806be 100644 --- a/lib/textsearch.c +++ b/lib/textsearch.c | |||
@@ -89,9 +89,9 @@ | |||
89 | * goto errout; | 89 | * goto errout; |
90 | * } | 90 | * } |
91 | * | 91 | * |
92 | * pos = textsearch_find_continuous(conf, \&state, example, strlen(example)); | 92 | * pos = textsearch_find_continuous(conf, &state, example, strlen(example)); |
93 | * if (pos != UINT_MAX) | 93 | * if (pos != UINT_MAX) |
94 | * panic("Oh my god, dancing chickens at \%d\n", pos); | 94 | * panic("Oh my god, dancing chickens at %d\n", pos); |
95 | * | 95 | * |
96 | * textsearch_destroy(conf); | 96 | * textsearch_destroy(conf); |
97 | */ | 97 | */ |
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index a1146cb10919..9cbed6f5a85a 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c | |||
@@ -436,7 +436,7 @@ void batadv_interface_rx(struct net_device *soft_iface, | |||
436 | /* clean the netfilter state now that the batman-adv header has been | 436 | /* clean the netfilter state now that the batman-adv header has been |
437 | * removed | 437 | * removed |
438 | */ | 438 | */ |
439 | nf_reset(skb); | 439 | nf_reset_ct(skb); |
440 | 440 | ||
441 | if (unlikely(!pskb_may_pull(skb, ETH_HLEN))) | 441 | if (unlikely(!pskb_may_pull(skb, ETH_HLEN))) |
442 | goto dropped; | 442 | goto dropped; |
diff --git a/net/core/devlink.c b/net/core/devlink.c index e48680efe54a..f80151eeaf51 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c | |||
@@ -3172,7 +3172,7 @@ static int devlink_nl_cmd_param_get_dumpit(struct sk_buff *msg, | |||
3172 | NETLINK_CB(cb->skb).portid, | 3172 | NETLINK_CB(cb->skb).portid, |
3173 | cb->nlh->nlmsg_seq, | 3173 | cb->nlh->nlmsg_seq, |
3174 | NLM_F_MULTI); | 3174 | NLM_F_MULTI); |
3175 | if (err) { | 3175 | if (err && err != -EOPNOTSUPP) { |
3176 | mutex_unlock(&devlink->lock); | 3176 | mutex_unlock(&devlink->lock); |
3177 | goto out; | 3177 | goto out; |
3178 | } | 3178 | } |
@@ -3432,7 +3432,7 @@ static int devlink_nl_cmd_port_param_get_dumpit(struct sk_buff *msg, | |||
3432 | NETLINK_CB(cb->skb).portid, | 3432 | NETLINK_CB(cb->skb).portid, |
3433 | cb->nlh->nlmsg_seq, | 3433 | cb->nlh->nlmsg_seq, |
3434 | NLM_F_MULTI); | 3434 | NLM_F_MULTI); |
3435 | if (err) { | 3435 | if (err && err != -EOPNOTSUPP) { |
3436 | mutex_unlock(&devlink->lock); | 3436 | mutex_unlock(&devlink->lock); |
3437 | goto out; | 3437 | goto out; |
3438 | } | 3438 | } |
@@ -4088,7 +4088,7 @@ static int devlink_nl_cmd_info_get_dumpit(struct sk_buff *msg, | |||
4088 | cb->nlh->nlmsg_seq, NLM_F_MULTI, | 4088 | cb->nlh->nlmsg_seq, NLM_F_MULTI, |
4089 | cb->extack); | 4089 | cb->extack); |
4090 | mutex_unlock(&devlink->lock); | 4090 | mutex_unlock(&devlink->lock); |
4091 | if (err) | 4091 | if (err && err != -EOPNOTSUPP) |
4092 | break; | 4092 | break; |
4093 | idx++; | 4093 | idx++; |
4094 | } | 4094 | } |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 01d65206f4fb..529133611ea2 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -5120,7 +5120,7 @@ void skb_scrub_packet(struct sk_buff *skb, bool xnet) | |||
5120 | skb->ignore_df = 0; | 5120 | skb->ignore_df = 0; |
5121 | skb_dst_drop(skb); | 5121 | skb_dst_drop(skb); |
5122 | skb_ext_reset(skb); | 5122 | skb_ext_reset(skb); |
5123 | nf_reset(skb); | 5123 | nf_reset_ct(skb); |
5124 | nf_reset_trace(skb); | 5124 | nf_reset_trace(skb); |
5125 | 5125 | ||
5126 | #ifdef CONFIG_NET_SWITCHDEV | 5126 | #ifdef CONFIG_NET_SWITCHDEV |
diff --git a/net/core/sock.c b/net/core/sock.c index 07863edbe6fc..fac2b4d80de5 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1700,8 +1700,6 @@ static void __sk_destruct(struct rcu_head *head) | |||
1700 | sk_filter_uncharge(sk, filter); | 1700 | sk_filter_uncharge(sk, filter); |
1701 | RCU_INIT_POINTER(sk->sk_filter, NULL); | 1701 | RCU_INIT_POINTER(sk->sk_filter, NULL); |
1702 | } | 1702 | } |
1703 | if (rcu_access_pointer(sk->sk_reuseport_cb)) | ||
1704 | reuseport_detach_sock(sk); | ||
1705 | 1703 | ||
1706 | sock_disable_timestamp(sk, SK_FLAGS_TIMESTAMP); | 1704 | sock_disable_timestamp(sk, SK_FLAGS_TIMESTAMP); |
1707 | 1705 | ||
@@ -1728,7 +1726,14 @@ static void __sk_destruct(struct rcu_head *head) | |||
1728 | 1726 | ||
1729 | void sk_destruct(struct sock *sk) | 1727 | void sk_destruct(struct sock *sk) |
1730 | { | 1728 | { |
1731 | if (sock_flag(sk, SOCK_RCU_FREE)) | 1729 | bool use_call_rcu = sock_flag(sk, SOCK_RCU_FREE); |
1730 | |||
1731 | if (rcu_access_pointer(sk->sk_reuseport_cb)) { | ||
1732 | reuseport_detach_sock(sk); | ||
1733 | use_call_rcu = true; | ||
1734 | } | ||
1735 | |||
1736 | if (use_call_rcu) | ||
1732 | call_rcu(&sk->sk_rcu, __sk_destruct); | 1737 | call_rcu(&sk->sk_rcu, __sk_destruct); |
1733 | else | 1738 | else |
1734 | __sk_destruct(&sk->sk_rcu); | 1739 | __sk_destruct(&sk->sk_rcu); |
@@ -3492,7 +3497,7 @@ static long sock_prot_memory_allocated(struct proto *proto) | |||
3492 | return proto->memory_allocated != NULL ? proto_memory_allocated(proto) : -1L; | 3497 | return proto->memory_allocated != NULL ? proto_memory_allocated(proto) : -1L; |
3493 | } | 3498 | } |
3494 | 3499 | ||
3495 | static char *sock_prot_memory_pressure(struct proto *proto) | 3500 | static const char *sock_prot_memory_pressure(struct proto *proto) |
3496 | { | 3501 | { |
3497 | return proto->memory_pressure != NULL ? | 3502 | return proto->memory_pressure != NULL ? |
3498 | proto_memory_pressure(proto) ? "yes" : "no" : "NI"; | 3503 | proto_memory_pressure(proto) ? "yes" : "no" : "NI"; |
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index b685bc82f8d0..d9b4200ed12d 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
@@ -871,7 +871,7 @@ lookup: | |||
871 | 871 | ||
872 | if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) | 872 | if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) |
873 | goto discard_and_relse; | 873 | goto discard_and_relse; |
874 | nf_reset(skb); | 874 | nf_reset_ct(skb); |
875 | 875 | ||
876 | return __sk_receive_skb(sk, skb, 1, dh->dccph_doff * 4, refcounted); | 876 | return __sk_receive_skb(sk, skb, 1, dh->dccph_doff * 4, refcounted); |
877 | 877 | ||
diff --git a/net/dsa/tag_sja1105.c b/net/dsa/tag_sja1105.c index 9c9aff3e52cf..63ef2a14c934 100644 --- a/net/dsa/tag_sja1105.c +++ b/net/dsa/tag_sja1105.c | |||
@@ -156,7 +156,11 @@ static struct sk_buff | |||
156 | /* Step 1: A timestampable frame was received. | 156 | /* Step 1: A timestampable frame was received. |
157 | * Buffer it until we get its meta frame. | 157 | * Buffer it until we get its meta frame. |
158 | */ | 158 | */ |
159 | if (is_link_local && sp->data->hwts_rx_en) { | 159 | if (is_link_local) { |
160 | if (!test_bit(SJA1105_HWTS_RX_EN, &sp->data->state)) | ||
161 | /* Do normal processing. */ | ||
162 | return skb; | ||
163 | |||
160 | spin_lock(&sp->data->meta_lock); | 164 | spin_lock(&sp->data->meta_lock); |
161 | /* Was this a link-local frame instead of the meta | 165 | /* Was this a link-local frame instead of the meta |
162 | * that we were expecting? | 166 | * that we were expecting? |
@@ -187,6 +191,12 @@ static struct sk_buff | |||
187 | } else if (is_meta) { | 191 | } else if (is_meta) { |
188 | struct sk_buff *stampable_skb; | 192 | struct sk_buff *stampable_skb; |
189 | 193 | ||
194 | /* Drop the meta frame if we're not in the right state | ||
195 | * to process it. | ||
196 | */ | ||
197 | if (!test_bit(SJA1105_HWTS_RX_EN, &sp->data->state)) | ||
198 | return NULL; | ||
199 | |||
190 | spin_lock(&sp->data->meta_lock); | 200 | spin_lock(&sp->data->meta_lock); |
191 | 201 | ||
192 | stampable_skb = sp->data->stampable_skb; | 202 | stampable_skb = sp->data->stampable_skb; |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index a53a543fe055..52690bb3e40f 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -1446,6 +1446,7 @@ static void erspan_setup(struct net_device *dev) | |||
1446 | struct ip_tunnel *t = netdev_priv(dev); | 1446 | struct ip_tunnel *t = netdev_priv(dev); |
1447 | 1447 | ||
1448 | ether_setup(dev); | 1448 | ether_setup(dev); |
1449 | dev->max_mtu = 0; | ||
1449 | dev->netdev_ops = &erspan_netdev_ops; | 1450 | dev->netdev_ops = &erspan_netdev_ops; |
1450 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; | 1451 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; |
1451 | dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; | 1452 | dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; |
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index 1e2392b7c64e..c59a78a267c3 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c | |||
@@ -199,7 +199,7 @@ resubmit: | |||
199 | kfree_skb(skb); | 199 | kfree_skb(skb); |
200 | return; | 200 | return; |
201 | } | 201 | } |
202 | nf_reset(skb); | 202 | nf_reset_ct(skb); |
203 | } | 203 | } |
204 | ret = INDIRECT_CALL_2(ipprot->handler, tcp_v4_rcv, udp_rcv, | 204 | ret = INDIRECT_CALL_2(ipprot->handler, tcp_v4_rcv, udp_rcv, |
205 | skb); | 205 | skb); |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 313470f6bb14..716d5472c022 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -1794,7 +1794,7 @@ static void ip_encap(struct net *net, struct sk_buff *skb, | |||
1794 | ip_send_check(iph); | 1794 | ip_send_check(iph); |
1795 | 1795 | ||
1796 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 1796 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
1797 | nf_reset(skb); | 1797 | nf_reset_ct(skb); |
1798 | } | 1798 | } |
1799 | 1799 | ||
1800 | static inline int ipmr_forward_finish(struct net *net, struct sock *sk, | 1800 | static inline int ipmr_forward_finish(struct net *net, struct sock *sk, |
@@ -2140,7 +2140,7 @@ int ip_mr_input(struct sk_buff *skb) | |||
2140 | 2140 | ||
2141 | mroute_sk = rcu_dereference(mrt->mroute_sk); | 2141 | mroute_sk = rcu_dereference(mrt->mroute_sk); |
2142 | if (mroute_sk) { | 2142 | if (mroute_sk) { |
2143 | nf_reset(skb); | 2143 | nf_reset_ct(skb); |
2144 | raw_rcv(mroute_sk, skb); | 2144 | raw_rcv(mroute_sk, skb); |
2145 | return 0; | 2145 | return 0; |
2146 | } | 2146 | } |
diff --git a/net/ipv4/netfilter/nf_dup_ipv4.c b/net/ipv4/netfilter/nf_dup_ipv4.c index af3fbf76dbd3..6cc5743c553a 100644 --- a/net/ipv4/netfilter/nf_dup_ipv4.c +++ b/net/ipv4/netfilter/nf_dup_ipv4.c | |||
@@ -65,7 +65,7 @@ void nf_dup_ipv4(struct net *net, struct sk_buff *skb, unsigned int hooknum, | |||
65 | 65 | ||
66 | #if IS_ENABLED(CONFIG_NF_CONNTRACK) | 66 | #if IS_ENABLED(CONFIG_NF_CONNTRACK) |
67 | /* Avoid counting cloned packets towards the original connection. */ | 67 | /* Avoid counting cloned packets towards the original connection. */ |
68 | nf_reset(skb); | 68 | nf_reset_ct(skb); |
69 | nf_ct_set(skb, NULL, IP_CT_UNTRACKED); | 69 | nf_ct_set(skb, NULL, IP_CT_UNTRACKED); |
70 | #endif | 70 | #endif |
71 | /* | 71 | /* |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 80da5a66d5d7..3183413ebc6c 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -332,7 +332,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb) | |||
332 | kfree_skb(skb); | 332 | kfree_skb(skb); |
333 | return NET_RX_DROP; | 333 | return NET_RX_DROP; |
334 | } | 334 | } |
335 | nf_reset(skb); | 335 | nf_reset_ct(skb); |
336 | 336 | ||
337 | skb_push(skb, skb->data - skb_network_header(skb)); | 337 | skb_push(skb, skb->data - skb_network_header(skb)); |
338 | 338 | ||
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 7dcce724c78b..14654876127e 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -916,16 +916,15 @@ void ip_rt_send_redirect(struct sk_buff *skb) | |||
916 | if (peer->rate_tokens == 0 || | 916 | if (peer->rate_tokens == 0 || |
917 | time_after(jiffies, | 917 | time_after(jiffies, |
918 | (peer->rate_last + | 918 | (peer->rate_last + |
919 | (ip_rt_redirect_load << peer->rate_tokens)))) { | 919 | (ip_rt_redirect_load << peer->n_redirects)))) { |
920 | __be32 gw = rt_nexthop(rt, ip_hdr(skb)->daddr); | 920 | __be32 gw = rt_nexthop(rt, ip_hdr(skb)->daddr); |
921 | 921 | ||
922 | icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, gw); | 922 | icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, gw); |
923 | peer->rate_last = jiffies; | 923 | peer->rate_last = jiffies; |
924 | ++peer->rate_tokens; | ||
925 | ++peer->n_redirects; | 924 | ++peer->n_redirects; |
926 | #ifdef CONFIG_IP_ROUTE_VERBOSE | 925 | #ifdef CONFIG_IP_ROUTE_VERBOSE |
927 | if (log_martians && | 926 | if (log_martians && |
928 | peer->rate_tokens == ip_rt_redirect_number) | 927 | peer->n_redirects == ip_rt_redirect_number) |
929 | net_warn_ratelimited("host %pI4/if%d ignores redirects for %pI4 to %pI4\n", | 928 | net_warn_ratelimited("host %pI4/if%d ignores redirects for %pI4 to %pI4\n", |
930 | &ip_hdr(skb)->saddr, inet_iif(skb), | 929 | &ip_hdr(skb)->saddr, inet_iif(skb), |
931 | &ip_hdr(skb)->daddr, &gw); | 930 | &ip_hdr(skb)->daddr, &gw); |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 79c325a07ba5..f98a1882e537 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -1798,13 +1798,11 @@ static int tcp_zerocopy_receive(struct sock *sk, | |||
1798 | } | 1798 | } |
1799 | if (skb_frag_size(frags) != PAGE_SIZE || skb_frag_off(frags)) { | 1799 | if (skb_frag_size(frags) != PAGE_SIZE || skb_frag_off(frags)) { |
1800 | int remaining = zc->recv_skip_hint; | 1800 | int remaining = zc->recv_skip_hint; |
1801 | int size = skb_frag_size(frags); | ||
1802 | 1801 | ||
1803 | while (remaining && (size != PAGE_SIZE || | 1802 | while (remaining && (skb_frag_size(frags) != PAGE_SIZE || |
1804 | skb_frag_off(frags))) { | 1803 | skb_frag_off(frags))) { |
1805 | remaining -= size; | 1804 | remaining -= skb_frag_size(frags); |
1806 | frags++; | 1805 | frags++; |
1807 | size = skb_frag_size(frags); | ||
1808 | } | 1806 | } |
1809 | zc->recv_skip_hint -= remaining; | 1807 | zc->recv_skip_hint -= remaining; |
1810 | break; | 1808 | break; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 2ee45e3755e9..bf124b1742df 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -1916,7 +1916,7 @@ process: | |||
1916 | if (tcp_v4_inbound_md5_hash(sk, skb)) | 1916 | if (tcp_v4_inbound_md5_hash(sk, skb)) |
1917 | goto discard_and_relse; | 1917 | goto discard_and_relse; |
1918 | 1918 | ||
1919 | nf_reset(skb); | 1919 | nf_reset_ct(skb); |
1920 | 1920 | ||
1921 | if (tcp_filter(sk, skb)) | 1921 | if (tcp_filter(sk, skb)) |
1922 | goto discard_and_relse; | 1922 | goto discard_and_relse; |
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index 40de2d2364a1..05be564414e9 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c | |||
@@ -198,8 +198,13 @@ static bool retransmits_timed_out(struct sock *sk, | |||
198 | return false; | 198 | return false; |
199 | 199 | ||
200 | start_ts = tcp_sk(sk)->retrans_stamp; | 200 | start_ts = tcp_sk(sk)->retrans_stamp; |
201 | if (likely(timeout == 0)) | 201 | if (likely(timeout == 0)) { |
202 | timeout = tcp_model_timeout(sk, boundary, TCP_RTO_MIN); | 202 | unsigned int rto_base = TCP_RTO_MIN; |
203 | |||
204 | if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) | ||
205 | rto_base = tcp_timeout_init(sk); | ||
206 | timeout = tcp_model_timeout(sk, boundary, rto_base); | ||
207 | } | ||
203 | 208 | ||
204 | return (s32)(tcp_time_stamp(tcp_sk(sk)) - start_ts - timeout) >= 0; | 209 | return (s32)(tcp_time_stamp(tcp_sk(sk)) - start_ts - timeout) >= 0; |
205 | } | 210 | } |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index cf755156a684..14bc654b6842 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -821,6 +821,7 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4, | |||
821 | int is_udplite = IS_UDPLITE(sk); | 821 | int is_udplite = IS_UDPLITE(sk); |
822 | int offset = skb_transport_offset(skb); | 822 | int offset = skb_transport_offset(skb); |
823 | int len = skb->len - offset; | 823 | int len = skb->len - offset; |
824 | int datalen = len - sizeof(*uh); | ||
824 | __wsum csum = 0; | 825 | __wsum csum = 0; |
825 | 826 | ||
826 | /* | 827 | /* |
@@ -854,10 +855,12 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4, | |||
854 | return -EIO; | 855 | return -EIO; |
855 | } | 856 | } |
856 | 857 | ||
857 | skb_shinfo(skb)->gso_size = cork->gso_size; | 858 | if (datalen > cork->gso_size) { |
858 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; | 859 | skb_shinfo(skb)->gso_size = cork->gso_size; |
859 | skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(len - sizeof(uh), | 860 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; |
860 | cork->gso_size); | 861 | skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(datalen, |
862 | cork->gso_size); | ||
863 | } | ||
861 | goto csum_partial; | 864 | goto csum_partial; |
862 | } | 865 | } |
863 | 866 | ||
@@ -1969,7 +1972,7 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb) | |||
1969 | */ | 1972 | */ |
1970 | if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) | 1973 | if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) |
1971 | goto drop; | 1974 | goto drop; |
1972 | nf_reset(skb); | 1975 | nf_reset_ct(skb); |
1973 | 1976 | ||
1974 | if (static_branch_unlikely(&udp_encap_needed_key) && up->encap_type) { | 1977 | if (static_branch_unlikely(&udp_encap_needed_key) && up->encap_type) { |
1975 | int (*encap_rcv)(struct sock *sk, struct sk_buff *skb); | 1978 | int (*encap_rcv)(struct sock *sk, struct sk_buff *skb); |
@@ -2298,7 +2301,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
2298 | 2301 | ||
2299 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) | 2302 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) |
2300 | goto drop; | 2303 | goto drop; |
2301 | nf_reset(skb); | 2304 | nf_reset_ct(skb); |
2302 | 2305 | ||
2303 | /* No socket. Drop packet silently, if checksum is wrong */ | 2306 | /* No socket. Drop packet silently, if checksum is wrong */ |
2304 | if (udp_lib_checksum_complete(skb)) | 2307 | if (udp_lib_checksum_complete(skb)) |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 6a576ff92c39..34ccef18b40e 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -5964,13 +5964,20 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) | |||
5964 | switch (event) { | 5964 | switch (event) { |
5965 | case RTM_NEWADDR: | 5965 | case RTM_NEWADDR: |
5966 | /* | 5966 | /* |
5967 | * If the address was optimistic | 5967 | * If the address was optimistic we inserted the route at the |
5968 | * we inserted the route at the start of | 5968 | * start of our DAD process, so we don't need to do it again. |
5969 | * our DAD process, so we don't need | 5969 | * If the device was taken down in the middle of the DAD |
5970 | * to do it again | 5970 | * cycle there is a race where we could get here without a |
5971 | * host route, so nothing to insert. That will be fixed when | ||
5972 | * the device is brought up. | ||
5971 | */ | 5973 | */ |
5972 | if (!rcu_access_pointer(ifp->rt->fib6_node)) | 5974 | if (ifp->rt && !rcu_access_pointer(ifp->rt->fib6_node)) { |
5973 | ip6_ins_rt(net, ifp->rt); | 5975 | ip6_ins_rt(net, ifp->rt); |
5976 | } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) { | ||
5977 | pr_warn("BUG: Address %pI6c on device %s is missing its host route.\n", | ||
5978 | &ifp->addr, ifp->idev->dev->name); | ||
5979 | } | ||
5980 | |||
5974 | if (ifp->idev->cnf.forwarding) | 5981 | if (ifp->idev->cnf.forwarding) |
5975 | addrconf_join_anycast(ifp); | 5982 | addrconf_join_anycast(ifp); |
5976 | if (!ipv6_addr_any(&ifp->peer_addr)) | 5983 | if (!ipv6_addr_any(&ifp->peer_addr)) |
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index d432d0011c16..3d71c7d6102c 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c | |||
@@ -223,6 +223,16 @@ static struct sk_buff *ip6_rcv_core(struct sk_buff *skb, struct net_device *dev, | |||
223 | if (ipv6_addr_is_multicast(&hdr->saddr)) | 223 | if (ipv6_addr_is_multicast(&hdr->saddr)) |
224 | goto err; | 224 | goto err; |
225 | 225 | ||
226 | /* While RFC4291 is not explicit about v4mapped addresses | ||
227 | * in IPv6 headers, it seems clear linux dual-stack | ||
228 | * model can not deal properly with these. | ||
229 | * Security models could be fooled by ::ffff:127.0.0.1 for example. | ||
230 | * | ||
231 | * https://tools.ietf.org/html/draft-itojun-v6ops-v4mapped-harmful-02 | ||
232 | */ | ||
233 | if (ipv6_addr_v4mapped(&hdr->saddr)) | ||
234 | goto err; | ||
235 | |||
226 | skb->transport_header = skb->network_header + sizeof(*hdr); | 236 | skb->transport_header = skb->network_header + sizeof(*hdr); |
227 | IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr); | 237 | IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr); |
228 | 238 | ||
@@ -371,7 +381,7 @@ resubmit_final: | |||
371 | /* Free reference early: we don't need it any more, | 381 | /* Free reference early: we don't need it any more, |
372 | and it may hold ip_conntrack module loaded | 382 | and it may hold ip_conntrack module loaded |
373 | indefinitely. */ | 383 | indefinitely. */ |
374 | nf_reset(skb); | 384 | nf_reset_ct(skb); |
375 | 385 | ||
376 | skb_postpull_rcsum(skb, skb_network_header(skb), | 386 | skb_postpull_rcsum(skb, skb_network_header(skb), |
377 | skb_network_header_len(skb)); | 387 | skb_network_header_len(skb)); |
diff --git a/net/ipv6/netfilter/nf_dup_ipv6.c b/net/ipv6/netfilter/nf_dup_ipv6.c index e6c9da9866b1..a0a2de30be3e 100644 --- a/net/ipv6/netfilter/nf_dup_ipv6.c +++ b/net/ipv6/netfilter/nf_dup_ipv6.c | |||
@@ -54,7 +54,7 @@ void nf_dup_ipv6(struct net *net, struct sk_buff *skb, unsigned int hooknum, | |||
54 | return; | 54 | return; |
55 | 55 | ||
56 | #if IS_ENABLED(CONFIG_NF_CONNTRACK) | 56 | #if IS_ENABLED(CONFIG_NF_CONNTRACK) |
57 | nf_reset(skb); | 57 | nf_reset_ct(skb); |
58 | nf_ct_set(skb, NULL, IP_CT_UNTRACKED); | 58 | nf_ct_set(skb, NULL, IP_CT_UNTRACKED); |
59 | #endif | 59 | #endif |
60 | if (hooknum == NF_INET_PRE_ROUTING || | 60 | if (hooknum == NF_INET_PRE_ROUTING || |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 6e1888ee4036..a77f6b7d3a7c 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -215,7 +215,7 @@ static bool ipv6_raw_deliver(struct sk_buff *skb, int nexthdr) | |||
215 | 215 | ||
216 | /* Not releasing hash table! */ | 216 | /* Not releasing hash table! */ |
217 | if (clone) { | 217 | if (clone) { |
218 | nf_reset(clone); | 218 | nf_reset_ct(clone); |
219 | rawv6_rcv(sk, clone); | 219 | rawv6_rcv(sk, clone); |
220 | } | 220 | } |
221 | } | 221 | } |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index aae4938f3dea..6324d3a8cb53 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -1109,6 +1109,7 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6, | |||
1109 | __wsum csum = 0; | 1109 | __wsum csum = 0; |
1110 | int offset = skb_transport_offset(skb); | 1110 | int offset = skb_transport_offset(skb); |
1111 | int len = skb->len - offset; | 1111 | int len = skb->len - offset; |
1112 | int datalen = len - sizeof(*uh); | ||
1112 | 1113 | ||
1113 | /* | 1114 | /* |
1114 | * Create a UDP header | 1115 | * Create a UDP header |
@@ -1141,8 +1142,12 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6, | |||
1141 | return -EIO; | 1142 | return -EIO; |
1142 | } | 1143 | } |
1143 | 1144 | ||
1144 | skb_shinfo(skb)->gso_size = cork->gso_size; | 1145 | if (datalen > cork->gso_size) { |
1145 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; | 1146 | skb_shinfo(skb)->gso_size = cork->gso_size; |
1147 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; | ||
1148 | skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(datalen, | ||
1149 | cork->gso_size); | ||
1150 | } | ||
1146 | goto csum_partial; | 1151 | goto csum_partial; |
1147 | } | 1152 | } |
1148 | 1153 | ||
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c index 105e5a7092e7..f82ea12bac37 100644 --- a/net/l2tp/l2tp_core.c +++ b/net/l2tp/l2tp_core.c | |||
@@ -1078,7 +1078,7 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len | |||
1078 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 1078 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
1079 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | | 1079 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | |
1080 | IPSKB_REROUTED); | 1080 | IPSKB_REROUTED); |
1081 | nf_reset(skb); | 1081 | nf_reset_ct(skb); |
1082 | 1082 | ||
1083 | bh_lock_sock(sk); | 1083 | bh_lock_sock(sk); |
1084 | if (sock_owned_by_user(sk)) { | 1084 | if (sock_owned_by_user(sk)) { |
diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c index bd3f39349d40..fd5ac2788e45 100644 --- a/net/l2tp/l2tp_eth.c +++ b/net/l2tp/l2tp_eth.c | |||
@@ -151,7 +151,7 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb, | |||
151 | skb->ip_summed = CHECKSUM_NONE; | 151 | skb->ip_summed = CHECKSUM_NONE; |
152 | 152 | ||
153 | skb_dst_drop(skb); | 153 | skb_dst_drop(skb); |
154 | nf_reset(skb); | 154 | nf_reset_ct(skb); |
155 | 155 | ||
156 | rcu_read_lock(); | 156 | rcu_read_lock(); |
157 | dev = rcu_dereference(spriv->dev); | 157 | dev = rcu_dereference(spriv->dev); |
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index 622833317dcb..0d7c887a2b75 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c | |||
@@ -193,7 +193,7 @@ pass_up: | |||
193 | if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) | 193 | if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) |
194 | goto discard_put; | 194 | goto discard_put; |
195 | 195 | ||
196 | nf_reset(skb); | 196 | nf_reset_ct(skb); |
197 | 197 | ||
198 | return sk_receive_skb(sk, skb, 1); | 198 | return sk_receive_skb(sk, skb, 1); |
199 | 199 | ||
diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c index 687e23a8b326..802f19aba7e3 100644 --- a/net/l2tp/l2tp_ip6.c +++ b/net/l2tp/l2tp_ip6.c | |||
@@ -206,7 +206,7 @@ pass_up: | |||
206 | if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) | 206 | if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) |
207 | goto discard_put; | 207 | goto discard_put; |
208 | 208 | ||
209 | nf_reset(skb); | 209 | nf_reset_ct(skb); |
210 | 210 | ||
211 | return sk_receive_skb(sk, skb, 1); | 211 | return sk_receive_skb(sk, skb, 1); |
212 | 212 | ||
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c index b1438fd4d876..64b544ae9966 100644 --- a/net/mac80211/debugfs_netdev.c +++ b/net/mac80211/debugfs_netdev.c | |||
@@ -487,9 +487,14 @@ static ssize_t ieee80211_if_fmt_aqm( | |||
487 | const struct ieee80211_sub_if_data *sdata, char *buf, int buflen) | 487 | const struct ieee80211_sub_if_data *sdata, char *buf, int buflen) |
488 | { | 488 | { |
489 | struct ieee80211_local *local = sdata->local; | 489 | struct ieee80211_local *local = sdata->local; |
490 | struct txq_info *txqi = to_txq_info(sdata->vif.txq); | 490 | struct txq_info *txqi; |
491 | int len; | 491 | int len; |
492 | 492 | ||
493 | if (!sdata->vif.txq) | ||
494 | return 0; | ||
495 | |||
496 | txqi = to_txq_info(sdata->vif.txq); | ||
497 | |||
493 | spin_lock_bh(&local->fq.lock); | 498 | spin_lock_bh(&local->fq.lock); |
494 | rcu_read_lock(); | 499 | rcu_read_lock(); |
495 | 500 | ||
@@ -658,7 +663,9 @@ static void add_common_files(struct ieee80211_sub_if_data *sdata) | |||
658 | DEBUGFS_ADD(rc_rateidx_vht_mcs_mask_5ghz); | 663 | DEBUGFS_ADD(rc_rateidx_vht_mcs_mask_5ghz); |
659 | DEBUGFS_ADD(hw_queues); | 664 | DEBUGFS_ADD(hw_queues); |
660 | 665 | ||
661 | if (sdata->local->ops->wake_tx_queue) | 666 | if (sdata->local->ops->wake_tx_queue && |
667 | sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && | ||
668 | sdata->vif.type != NL80211_IFTYPE_NAN) | ||
662 | DEBUGFS_ADD(aqm); | 669 | DEBUGFS_ADD(aqm); |
663 | } | 670 | } |
664 | 671 | ||
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 051a02ddcb85..32a7a53833c0 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -247,7 +247,8 @@ static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data *sdata, int ac) | |||
247 | struct sta_info *sta; | 247 | struct sta_info *sta; |
248 | int i; | 248 | int i; |
249 | 249 | ||
250 | spin_lock_bh(&fq->lock); | 250 | local_bh_disable(); |
251 | spin_lock(&fq->lock); | ||
251 | 252 | ||
252 | if (sdata->vif.type == NL80211_IFTYPE_AP) | 253 | if (sdata->vif.type == NL80211_IFTYPE_AP) |
253 | ps = &sdata->bss->ps; | 254 | ps = &sdata->bss->ps; |
@@ -273,9 +274,9 @@ static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data *sdata, int ac) | |||
273 | &txqi->flags)) | 274 | &txqi->flags)) |
274 | continue; | 275 | continue; |
275 | 276 | ||
276 | spin_unlock_bh(&fq->lock); | 277 | spin_unlock(&fq->lock); |
277 | drv_wake_tx_queue(local, txqi); | 278 | drv_wake_tx_queue(local, txqi); |
278 | spin_lock_bh(&fq->lock); | 279 | spin_lock(&fq->lock); |
279 | } | 280 | } |
280 | } | 281 | } |
281 | 282 | ||
@@ -288,12 +289,14 @@ static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data *sdata, int ac) | |||
288 | (ps && atomic_read(&ps->num_sta_ps)) || ac != vif->txq->ac) | 289 | (ps && atomic_read(&ps->num_sta_ps)) || ac != vif->txq->ac) |
289 | goto out; | 290 | goto out; |
290 | 291 | ||
291 | spin_unlock_bh(&fq->lock); | 292 | spin_unlock(&fq->lock); |
292 | 293 | ||
293 | drv_wake_tx_queue(local, txqi); | 294 | drv_wake_tx_queue(local, txqi); |
295 | local_bh_enable(); | ||
294 | return; | 296 | return; |
295 | out: | 297 | out: |
296 | spin_unlock_bh(&fq->lock); | 298 | spin_unlock(&fq->lock); |
299 | local_bh_enable(); | ||
297 | } | 300 | } |
298 | 301 | ||
299 | static void | 302 | static void |
diff --git a/net/netfilter/ipvs/ip_vs_xmit.c b/net/netfilter/ipvs/ip_vs_xmit.c index 9c464d24beec..888d3068a492 100644 --- a/net/netfilter/ipvs/ip_vs_xmit.c +++ b/net/netfilter/ipvs/ip_vs_xmit.c | |||
@@ -613,7 +613,7 @@ static inline int ip_vs_tunnel_xmit_prepare(struct sk_buff *skb, | |||
613 | if (unlikely(cp->flags & IP_VS_CONN_F_NFCT)) | 613 | if (unlikely(cp->flags & IP_VS_CONN_F_NFCT)) |
614 | ret = ip_vs_confirm_conntrack(skb); | 614 | ret = ip_vs_confirm_conntrack(skb); |
615 | if (ret == NF_ACCEPT) { | 615 | if (ret == NF_ACCEPT) { |
616 | nf_reset(skb); | 616 | nf_reset_ct(skb); |
617 | skb_forward_csum(skb); | 617 | skb_forward_csum(skb); |
618 | } | 618 | } |
619 | return ret; | 619 | return ret; |
diff --git a/net/netfilter/nft_connlimit.c b/net/netfilter/nft_connlimit.c index af1497ab9464..69d6173f91e2 100644 --- a/net/netfilter/nft_connlimit.c +++ b/net/netfilter/nft_connlimit.c | |||
@@ -218,8 +218,13 @@ static void nft_connlimit_destroy_clone(const struct nft_ctx *ctx, | |||
218 | static bool nft_connlimit_gc(struct net *net, const struct nft_expr *expr) | 218 | static bool nft_connlimit_gc(struct net *net, const struct nft_expr *expr) |
219 | { | 219 | { |
220 | struct nft_connlimit *priv = nft_expr_priv(expr); | 220 | struct nft_connlimit *priv = nft_expr_priv(expr); |
221 | bool ret; | ||
221 | 222 | ||
222 | return nf_conncount_gc_list(net, &priv->list); | 223 | local_bh_disable(); |
224 | ret = nf_conncount_gc_list(net, &priv->list); | ||
225 | local_bh_enable(); | ||
226 | |||
227 | return ret; | ||
223 | } | 228 | } |
224 | 229 | ||
225 | static struct nft_expr_type nft_connlimit_type; | 230 | static struct nft_expr_type nft_connlimit_type; |
diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index 8dfea26536c9..ccdd790e163a 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c | |||
@@ -107,9 +107,14 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) | |||
107 | llcp_sock->service_name = kmemdup(llcp_addr.service_name, | 107 | llcp_sock->service_name = kmemdup(llcp_addr.service_name, |
108 | llcp_sock->service_name_len, | 108 | llcp_sock->service_name_len, |
109 | GFP_KERNEL); | 109 | GFP_KERNEL); |
110 | 110 | if (!llcp_sock->service_name) { | |
111 | ret = -ENOMEM; | ||
112 | goto put_dev; | ||
113 | } | ||
111 | llcp_sock->ssap = nfc_llcp_get_sdp_ssap(local, llcp_sock); | 114 | llcp_sock->ssap = nfc_llcp_get_sdp_ssap(local, llcp_sock); |
112 | if (llcp_sock->ssap == LLCP_SAP_MAX) { | 115 | if (llcp_sock->ssap == LLCP_SAP_MAX) { |
116 | kfree(llcp_sock->service_name); | ||
117 | llcp_sock->service_name = NULL; | ||
113 | ret = -EADDRINUSE; | 118 | ret = -EADDRINUSE; |
114 | goto put_dev; | 119 | goto put_dev; |
115 | } | 120 | } |
diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c index d2437b5b2f6a..21c90d3a7ebf 100644 --- a/net/openvswitch/vport-internal_dev.c +++ b/net/openvswitch/vport-internal_dev.c | |||
@@ -237,7 +237,7 @@ static netdev_tx_t internal_dev_recv(struct sk_buff *skb) | |||
237 | } | 237 | } |
238 | 238 | ||
239 | skb_dst_drop(skb); | 239 | skb_dst_drop(skb); |
240 | nf_reset(skb); | 240 | nf_reset_ct(skb); |
241 | secpath_reset(skb); | 241 | secpath_reset(skb); |
242 | 242 | ||
243 | skb->pkt_type = PACKET_HOST; | 243 | skb->pkt_type = PACKET_HOST; |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index e2742b006d25..82a50e850245 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -1821,7 +1821,7 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev, | |||
1821 | skb_dst_drop(skb); | 1821 | skb_dst_drop(skb); |
1822 | 1822 | ||
1823 | /* drop conntrack reference */ | 1823 | /* drop conntrack reference */ |
1824 | nf_reset(skb); | 1824 | nf_reset_ct(skb); |
1825 | 1825 | ||
1826 | spkt = &PACKET_SKB_CB(skb)->sa.pkt; | 1826 | spkt = &PACKET_SKB_CB(skb)->sa.pkt; |
1827 | 1827 | ||
@@ -2121,7 +2121,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, | |||
2121 | skb_dst_drop(skb); | 2121 | skb_dst_drop(skb); |
2122 | 2122 | ||
2123 | /* drop conntrack reference */ | 2123 | /* drop conntrack reference */ |
2124 | nf_reset(skb); | 2124 | nf_reset_ct(skb); |
2125 | 2125 | ||
2126 | spin_lock(&sk->sk_receive_queue.lock); | 2126 | spin_lock(&sk->sk_receive_queue.lock); |
2127 | po->stats.stats1.tp_packets++; | 2127 | po->stats.stats1.tp_packets++; |
diff --git a/net/rds/ib.c b/net/rds/ib.c index 45acab2de0cf..9de2ae22d583 100644 --- a/net/rds/ib.c +++ b/net/rds/ib.c | |||
@@ -143,6 +143,9 @@ static void rds_ib_add_one(struct ib_device *device) | |||
143 | refcount_set(&rds_ibdev->refcount, 1); | 143 | refcount_set(&rds_ibdev->refcount, 1); |
144 | INIT_WORK(&rds_ibdev->free_work, rds_ib_dev_free); | 144 | INIT_WORK(&rds_ibdev->free_work, rds_ib_dev_free); |
145 | 145 | ||
146 | INIT_LIST_HEAD(&rds_ibdev->ipaddr_list); | ||
147 | INIT_LIST_HEAD(&rds_ibdev->conn_list); | ||
148 | |||
146 | rds_ibdev->max_wrs = device->attrs.max_qp_wr; | 149 | rds_ibdev->max_wrs = device->attrs.max_qp_wr; |
147 | rds_ibdev->max_sge = min(device->attrs.max_send_sge, RDS_IB_MAX_SGE); | 150 | rds_ibdev->max_sge = min(device->attrs.max_send_sge, RDS_IB_MAX_SGE); |
148 | 151 | ||
@@ -203,9 +206,6 @@ static void rds_ib_add_one(struct ib_device *device) | |||
203 | device->name, | 206 | device->name, |
204 | rds_ibdev->use_fastreg ? "FRMR" : "FMR"); | 207 | rds_ibdev->use_fastreg ? "FRMR" : "FMR"); |
205 | 208 | ||
206 | INIT_LIST_HEAD(&rds_ibdev->ipaddr_list); | ||
207 | INIT_LIST_HEAD(&rds_ibdev->conn_list); | ||
208 | |||
209 | down_write(&rds_ib_devices_lock); | 209 | down_write(&rds_ib_devices_lock); |
210 | list_add_tail_rcu(&rds_ibdev->list, &rds_ib_devices); | 210 | list_add_tail_rcu(&rds_ibdev->list, &rds_ib_devices); |
211 | up_write(&rds_ib_devices_lock); | 211 | up_write(&rds_ib_devices_lock); |
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 06c7a2da21bc..39b427dc7512 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
@@ -1127,6 +1127,33 @@ static const struct nla_policy cbq_policy[TCA_CBQ_MAX + 1] = { | |||
1127 | [TCA_CBQ_POLICE] = { .len = sizeof(struct tc_cbq_police) }, | 1127 | [TCA_CBQ_POLICE] = { .len = sizeof(struct tc_cbq_police) }, |
1128 | }; | 1128 | }; |
1129 | 1129 | ||
1130 | static int cbq_opt_parse(struct nlattr *tb[TCA_CBQ_MAX + 1], | ||
1131 | struct nlattr *opt, | ||
1132 | struct netlink_ext_ack *extack) | ||
1133 | { | ||
1134 | int err; | ||
1135 | |||
1136 | if (!opt) { | ||
1137 | NL_SET_ERR_MSG(extack, "CBQ options are required for this operation"); | ||
1138 | return -EINVAL; | ||
1139 | } | ||
1140 | |||
1141 | err = nla_parse_nested_deprecated(tb, TCA_CBQ_MAX, opt, | ||
1142 | cbq_policy, extack); | ||
1143 | if (err < 0) | ||
1144 | return err; | ||
1145 | |||
1146 | if (tb[TCA_CBQ_WRROPT]) { | ||
1147 | const struct tc_cbq_wrropt *wrr = nla_data(tb[TCA_CBQ_WRROPT]); | ||
1148 | |||
1149 | if (wrr->priority > TC_CBQ_MAXPRIO) { | ||
1150 | NL_SET_ERR_MSG(extack, "priority is bigger than TC_CBQ_MAXPRIO"); | ||
1151 | err = -EINVAL; | ||
1152 | } | ||
1153 | } | ||
1154 | return err; | ||
1155 | } | ||
1156 | |||
1130 | static int cbq_init(struct Qdisc *sch, struct nlattr *opt, | 1157 | static int cbq_init(struct Qdisc *sch, struct nlattr *opt, |
1131 | struct netlink_ext_ack *extack) | 1158 | struct netlink_ext_ack *extack) |
1132 | { | 1159 | { |
@@ -1139,13 +1166,7 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt, | |||
1139 | hrtimer_init(&q->delay_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); | 1166 | hrtimer_init(&q->delay_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); |
1140 | q->delay_timer.function = cbq_undelay; | 1167 | q->delay_timer.function = cbq_undelay; |
1141 | 1168 | ||
1142 | if (!opt) { | 1169 | err = cbq_opt_parse(tb, opt, extack); |
1143 | NL_SET_ERR_MSG(extack, "CBQ options are required for this operation"); | ||
1144 | return -EINVAL; | ||
1145 | } | ||
1146 | |||
1147 | err = nla_parse_nested_deprecated(tb, TCA_CBQ_MAX, opt, cbq_policy, | ||
1148 | extack); | ||
1149 | if (err < 0) | 1170 | if (err < 0) |
1150 | return err; | 1171 | return err; |
1151 | 1172 | ||
@@ -1464,13 +1485,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t | |||
1464 | struct cbq_class *parent; | 1485 | struct cbq_class *parent; |
1465 | struct qdisc_rate_table *rtab = NULL; | 1486 | struct qdisc_rate_table *rtab = NULL; |
1466 | 1487 | ||
1467 | if (!opt) { | 1488 | err = cbq_opt_parse(tb, opt, extack); |
1468 | NL_SET_ERR_MSG(extack, "Mandatory qdisc options missing"); | ||
1469 | return -EINVAL; | ||
1470 | } | ||
1471 | |||
1472 | err = nla_parse_nested_deprecated(tb, TCA_CBQ_MAX, opt, cbq_policy, | ||
1473 | extack); | ||
1474 | if (err < 0) | 1489 | if (err < 0) |
1475 | return err; | 1490 | return err; |
1476 | 1491 | ||
diff --git a/net/sched/sch_cbs.c b/net/sched/sch_cbs.c index 1bef152c5721..b2905b03a432 100644 --- a/net/sched/sch_cbs.c +++ b/net/sched/sch_cbs.c | |||
@@ -306,7 +306,7 @@ static void cbs_set_port_rate(struct net_device *dev, struct cbs_sched_data *q) | |||
306 | if (err < 0) | 306 | if (err < 0) |
307 | goto skip; | 307 | goto skip; |
308 | 308 | ||
309 | if (ecmd.base.speed != SPEED_UNKNOWN) | 309 | if (ecmd.base.speed && ecmd.base.speed != SPEED_UNKNOWN) |
310 | speed = ecmd.base.speed; | 310 | speed = ecmd.base.speed; |
311 | 311 | ||
312 | skip: | 312 | skip: |
diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index bad1cbe59a56..05605b30bef3 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c | |||
@@ -361,6 +361,8 @@ static int dsmark_init(struct Qdisc *sch, struct nlattr *opt, | |||
361 | goto errout; | 361 | goto errout; |
362 | 362 | ||
363 | err = -EINVAL; | 363 | err = -EINVAL; |
364 | if (!tb[TCA_DSMARK_INDICES]) | ||
365 | goto errout; | ||
364 | indices = nla_get_u16(tb[TCA_DSMARK_INDICES]); | 366 | indices = nla_get_u16(tb[TCA_DSMARK_INDICES]); |
365 | 367 | ||
366 | if (hweight32(indices) != 1) | 368 | if (hweight32(indices) != 1) |
diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c index 2f7b34205c82..68b543f85a96 100644 --- a/net/sched/sch_taprio.c +++ b/net/sched/sch_taprio.c | |||
@@ -1044,12 +1044,11 @@ static void taprio_set_picos_per_byte(struct net_device *dev, | |||
1044 | if (err < 0) | 1044 | if (err < 0) |
1045 | goto skip; | 1045 | goto skip; |
1046 | 1046 | ||
1047 | if (ecmd.base.speed != SPEED_UNKNOWN) | 1047 | if (ecmd.base.speed && ecmd.base.speed != SPEED_UNKNOWN) |
1048 | speed = ecmd.base.speed; | 1048 | speed = ecmd.base.speed; |
1049 | 1049 | ||
1050 | skip: | 1050 | skip: |
1051 | picos_per_byte = div64_s64(NSEC_PER_SEC * 1000LL * 8, | 1051 | picos_per_byte = (USEC_PER_SEC * 8) / speed; |
1052 | speed * 1000 * 1000); | ||
1053 | 1052 | ||
1054 | atomic64_set(&q->picos_per_byte, picos_per_byte); | 1053 | atomic64_set(&q->picos_per_byte, picos_per_byte); |
1055 | netdev_dbg(dev, "taprio: set %s's picos_per_byte to: %lld, linkspeed: %d\n", | 1054 | netdev_dbg(dev, "taprio: set %s's picos_per_byte to: %lld, linkspeed: %d\n", |
diff --git a/net/sctp/input.c b/net/sctp/input.c index 1008cdc44dd6..5a070fb5b278 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c | |||
@@ -201,7 +201,7 @@ int sctp_rcv(struct sk_buff *skb) | |||
201 | 201 | ||
202 | if (!xfrm_policy_check(sk, XFRM_POLICY_IN, skb, family)) | 202 | if (!xfrm_policy_check(sk, XFRM_POLICY_IN, skb, family)) |
203 | goto discard_release; | 203 | goto discard_release; |
204 | nf_reset(skb); | 204 | nf_reset_ct(skb); |
205 | 205 | ||
206 | if (sk_filter(sk, skb)) | 206 | if (sk_filter(sk, skb)) |
207 | goto discard_release; | 207 | goto discard_release; |
diff --git a/net/tipc/link.c b/net/tipc/link.c index 6cc75ffd9e2c..999eab592de8 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -160,6 +160,7 @@ struct tipc_link { | |||
160 | struct { | 160 | struct { |
161 | u16 len; | 161 | u16 len; |
162 | u16 limit; | 162 | u16 limit; |
163 | struct sk_buff *target_bskb; | ||
163 | } backlog[5]; | 164 | } backlog[5]; |
164 | u16 snd_nxt; | 165 | u16 snd_nxt; |
165 | u16 window; | 166 | u16 window; |
@@ -880,6 +881,7 @@ static void link_prepare_wakeup(struct tipc_link *l) | |||
880 | void tipc_link_reset(struct tipc_link *l) | 881 | void tipc_link_reset(struct tipc_link *l) |
881 | { | 882 | { |
882 | struct sk_buff_head list; | 883 | struct sk_buff_head list; |
884 | u32 imp; | ||
883 | 885 | ||
884 | __skb_queue_head_init(&list); | 886 | __skb_queue_head_init(&list); |
885 | 887 | ||
@@ -901,11 +903,10 @@ void tipc_link_reset(struct tipc_link *l) | |||
901 | __skb_queue_purge(&l->deferdq); | 903 | __skb_queue_purge(&l->deferdq); |
902 | __skb_queue_purge(&l->backlogq); | 904 | __skb_queue_purge(&l->backlogq); |
903 | __skb_queue_purge(&l->failover_deferdq); | 905 | __skb_queue_purge(&l->failover_deferdq); |
904 | l->backlog[TIPC_LOW_IMPORTANCE].len = 0; | 906 | for (imp = 0; imp <= TIPC_SYSTEM_IMPORTANCE; imp++) { |
905 | l->backlog[TIPC_MEDIUM_IMPORTANCE].len = 0; | 907 | l->backlog[imp].len = 0; |
906 | l->backlog[TIPC_HIGH_IMPORTANCE].len = 0; | 908 | l->backlog[imp].target_bskb = NULL; |
907 | l->backlog[TIPC_CRITICAL_IMPORTANCE].len = 0; | 909 | } |
908 | l->backlog[TIPC_SYSTEM_IMPORTANCE].len = 0; | ||
909 | kfree_skb(l->reasm_buf); | 910 | kfree_skb(l->reasm_buf); |
910 | kfree_skb(l->reasm_tnlmsg); | 911 | kfree_skb(l->reasm_tnlmsg); |
911 | kfree_skb(l->failover_reasm_skb); | 912 | kfree_skb(l->failover_reasm_skb); |
@@ -947,7 +948,7 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, | |||
947 | u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; | 948 | u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; |
948 | struct sk_buff_head *transmq = &l->transmq; | 949 | struct sk_buff_head *transmq = &l->transmq; |
949 | struct sk_buff_head *backlogq = &l->backlogq; | 950 | struct sk_buff_head *backlogq = &l->backlogq; |
950 | struct sk_buff *skb, *_skb, *bskb; | 951 | struct sk_buff *skb, *_skb, **tskb; |
951 | int pkt_cnt = skb_queue_len(list); | 952 | int pkt_cnt = skb_queue_len(list); |
952 | int rc = 0; | 953 | int rc = 0; |
953 | 954 | ||
@@ -999,19 +1000,21 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, | |||
999 | seqno++; | 1000 | seqno++; |
1000 | continue; | 1001 | continue; |
1001 | } | 1002 | } |
1002 | if (tipc_msg_bundle(skb_peek_tail(backlogq), hdr, mtu)) { | 1003 | tskb = &l->backlog[imp].target_bskb; |
1004 | if (tipc_msg_bundle(*tskb, hdr, mtu)) { | ||
1003 | kfree_skb(__skb_dequeue(list)); | 1005 | kfree_skb(__skb_dequeue(list)); |
1004 | l->stats.sent_bundled++; | 1006 | l->stats.sent_bundled++; |
1005 | continue; | 1007 | continue; |
1006 | } | 1008 | } |
1007 | if (tipc_msg_make_bundle(&bskb, hdr, mtu, l->addr)) { | 1009 | if (tipc_msg_make_bundle(tskb, hdr, mtu, l->addr)) { |
1008 | kfree_skb(__skb_dequeue(list)); | 1010 | kfree_skb(__skb_dequeue(list)); |
1009 | __skb_queue_tail(backlogq, bskb); | 1011 | __skb_queue_tail(backlogq, *tskb); |
1010 | l->backlog[msg_importance(buf_msg(bskb))].len++; | 1012 | l->backlog[imp].len++; |
1011 | l->stats.sent_bundled++; | 1013 | l->stats.sent_bundled++; |
1012 | l->stats.sent_bundles++; | 1014 | l->stats.sent_bundles++; |
1013 | continue; | 1015 | continue; |
1014 | } | 1016 | } |
1017 | l->backlog[imp].target_bskb = NULL; | ||
1015 | l->backlog[imp].len += skb_queue_len(list); | 1018 | l->backlog[imp].len += skb_queue_len(list); |
1016 | skb_queue_splice_tail_init(list, backlogq); | 1019 | skb_queue_splice_tail_init(list, backlogq); |
1017 | } | 1020 | } |
@@ -1027,6 +1030,7 @@ static void tipc_link_advance_backlog(struct tipc_link *l, | |||
1027 | u16 seqno = l->snd_nxt; | 1030 | u16 seqno = l->snd_nxt; |
1028 | u16 ack = l->rcv_nxt - 1; | 1031 | u16 ack = l->rcv_nxt - 1; |
1029 | u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; | 1032 | u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; |
1033 | u32 imp; | ||
1030 | 1034 | ||
1031 | while (skb_queue_len(&l->transmq) < l->window) { | 1035 | while (skb_queue_len(&l->transmq) < l->window) { |
1032 | skb = skb_peek(&l->backlogq); | 1036 | skb = skb_peek(&l->backlogq); |
@@ -1037,7 +1041,10 @@ static void tipc_link_advance_backlog(struct tipc_link *l, | |||
1037 | break; | 1041 | break; |
1038 | __skb_dequeue(&l->backlogq); | 1042 | __skb_dequeue(&l->backlogq); |
1039 | hdr = buf_msg(skb); | 1043 | hdr = buf_msg(skb); |
1040 | l->backlog[msg_importance(hdr)].len--; | 1044 | imp = msg_importance(hdr); |
1045 | l->backlog[imp].len--; | ||
1046 | if (unlikely(skb == l->backlog[imp].target_bskb)) | ||
1047 | l->backlog[imp].target_bskb = NULL; | ||
1041 | __skb_queue_tail(&l->transmq, skb); | 1048 | __skb_queue_tail(&l->transmq, skb); |
1042 | /* next retransmit attempt */ | 1049 | /* next retransmit attempt */ |
1043 | if (link_is_bc_sndlink(l)) | 1050 | if (link_is_bc_sndlink(l)) |
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index e6d49cdc61b4..922d262e153f 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -543,10 +543,7 @@ bool tipc_msg_make_bundle(struct sk_buff **skb, struct tipc_msg *msg, | |||
543 | bmsg = buf_msg(_skb); | 543 | bmsg = buf_msg(_skb); |
544 | tipc_msg_init(msg_prevnode(msg), bmsg, MSG_BUNDLER, 0, | 544 | tipc_msg_init(msg_prevnode(msg), bmsg, MSG_BUNDLER, 0, |
545 | INT_H_SIZE, dnode); | 545 | INT_H_SIZE, dnode); |
546 | if (msg_isdata(msg)) | 546 | msg_set_importance(bmsg, msg_importance(msg)); |
547 | msg_set_importance(bmsg, TIPC_CRITICAL_IMPORTANCE); | ||
548 | else | ||
549 | msg_set_importance(bmsg, TIPC_SYSTEM_IMPORTANCE); | ||
550 | msg_set_seqno(bmsg, msg_seqno(msg)); | 547 | msg_set_seqno(bmsg, msg_seqno(msg)); |
551 | msg_set_ack(bmsg, msg_ack(msg)); | 548 | msg_set_ack(bmsg, msg_ack(msg)); |
552 | msg_set_bcast_ack(bmsg, msg_bcast_ack(msg)); | 549 | msg_set_bcast_ack(bmsg, msg_bcast_ack(msg)); |
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index ab47bf3ab66e..2ab43b2bba31 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c | |||
@@ -638,7 +638,7 @@ struct sock *__vsock_create(struct net *net, | |||
638 | } | 638 | } |
639 | EXPORT_SYMBOL_GPL(__vsock_create); | 639 | EXPORT_SYMBOL_GPL(__vsock_create); |
640 | 640 | ||
641 | static void __vsock_release(struct sock *sk) | 641 | static void __vsock_release(struct sock *sk, int level) |
642 | { | 642 | { |
643 | if (sk) { | 643 | if (sk) { |
644 | struct sk_buff *skb; | 644 | struct sk_buff *skb; |
@@ -648,9 +648,17 @@ static void __vsock_release(struct sock *sk) | |||
648 | vsk = vsock_sk(sk); | 648 | vsk = vsock_sk(sk); |
649 | pending = NULL; /* Compiler warning. */ | 649 | pending = NULL; /* Compiler warning. */ |
650 | 650 | ||
651 | /* The release call is supposed to use lock_sock_nested() | ||
652 | * rather than lock_sock(), if a sock lock should be acquired. | ||
653 | */ | ||
651 | transport->release(vsk); | 654 | transport->release(vsk); |
652 | 655 | ||
653 | lock_sock(sk); | 656 | /* When "level" is SINGLE_DEPTH_NESTING, use the nested |
657 | * version to avoid the warning "possible recursive locking | ||
658 | * detected". When "level" is 0, lock_sock_nested(sk, level) | ||
659 | * is the same as lock_sock(sk). | ||
660 | */ | ||
661 | lock_sock_nested(sk, level); | ||
654 | sock_orphan(sk); | 662 | sock_orphan(sk); |
655 | sk->sk_shutdown = SHUTDOWN_MASK; | 663 | sk->sk_shutdown = SHUTDOWN_MASK; |
656 | 664 | ||
@@ -659,7 +667,7 @@ static void __vsock_release(struct sock *sk) | |||
659 | 667 | ||
660 | /* Clean up any sockets that never were accepted. */ | 668 | /* Clean up any sockets that never were accepted. */ |
661 | while ((pending = vsock_dequeue_accept(sk)) != NULL) { | 669 | while ((pending = vsock_dequeue_accept(sk)) != NULL) { |
662 | __vsock_release(pending); | 670 | __vsock_release(pending, SINGLE_DEPTH_NESTING); |
663 | sock_put(pending); | 671 | sock_put(pending); |
664 | } | 672 | } |
665 | 673 | ||
@@ -708,7 +716,7 @@ EXPORT_SYMBOL_GPL(vsock_stream_has_space); | |||
708 | 716 | ||
709 | static int vsock_release(struct socket *sock) | 717 | static int vsock_release(struct socket *sock) |
710 | { | 718 | { |
711 | __vsock_release(sock->sk); | 719 | __vsock_release(sock->sk, 0); |
712 | sock->sk = NULL; | 720 | sock->sk = NULL; |
713 | sock->state = SS_FREE; | 721 | sock->state = SS_FREE; |
714 | 722 | ||
diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c index 261521d286d6..c443db7af8d4 100644 --- a/net/vmw_vsock/hyperv_transport.c +++ b/net/vmw_vsock/hyperv_transport.c | |||
@@ -559,7 +559,7 @@ static void hvs_release(struct vsock_sock *vsk) | |||
559 | struct sock *sk = sk_vsock(vsk); | 559 | struct sock *sk = sk_vsock(vsk); |
560 | bool remove_sock; | 560 | bool remove_sock; |
561 | 561 | ||
562 | lock_sock(sk); | 562 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
563 | remove_sock = hvs_close_lock_held(vsk); | 563 | remove_sock = hvs_close_lock_held(vsk); |
564 | release_sock(sk); | 564 | release_sock(sk); |
565 | if (remove_sock) | 565 | if (remove_sock) |
diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index 5bb70c692b1e..a666ef8fc54e 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c | |||
@@ -820,7 +820,7 @@ void virtio_transport_release(struct vsock_sock *vsk) | |||
820 | struct sock *sk = &vsk->sk; | 820 | struct sock *sk = &vsk->sk; |
821 | bool remove_sock = true; | 821 | bool remove_sock = true; |
822 | 822 | ||
823 | lock_sock(sk); | 823 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
824 | if (sk->sk_type == SOCK_STREAM) | 824 | if (sk->sk_type == SOCK_STREAM) |
825 | remove_sock = virtio_transport_close(vsk); | 825 | remove_sock = virtio_transport_close(vsk); |
826 | 826 | ||
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index d21b1581a665..141cdb171665 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -201,6 +201,38 @@ cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info) | |||
201 | return __cfg80211_rdev_from_attrs(netns, info->attrs); | 201 | return __cfg80211_rdev_from_attrs(netns, info->attrs); |
202 | } | 202 | } |
203 | 203 | ||
204 | static int validate_beacon_head(const struct nlattr *attr, | ||
205 | struct netlink_ext_ack *extack) | ||
206 | { | ||
207 | const u8 *data = nla_data(attr); | ||
208 | unsigned int len = nla_len(attr); | ||
209 | const struct element *elem; | ||
210 | const struct ieee80211_mgmt *mgmt = (void *)data; | ||
211 | unsigned int fixedlen = offsetof(struct ieee80211_mgmt, | ||
212 | u.beacon.variable); | ||
213 | |||
214 | if (len < fixedlen) | ||
215 | goto err; | ||
216 | |||
217 | if (ieee80211_hdrlen(mgmt->frame_control) != | ||
218 | offsetof(struct ieee80211_mgmt, u.beacon)) | ||
219 | goto err; | ||
220 | |||
221 | data += fixedlen; | ||
222 | len -= fixedlen; | ||
223 | |||
224 | for_each_element(elem, data, len) { | ||
225 | /* nothing */ | ||
226 | } | ||
227 | |||
228 | if (for_each_element_completed(elem, data, len)) | ||
229 | return 0; | ||
230 | |||
231 | err: | ||
232 | NL_SET_ERR_MSG_ATTR(extack, attr, "malformed beacon head"); | ||
233 | return -EINVAL; | ||
234 | } | ||
235 | |||
204 | static int validate_ie_attr(const struct nlattr *attr, | 236 | static int validate_ie_attr(const struct nlattr *attr, |
205 | struct netlink_ext_ack *extack) | 237 | struct netlink_ext_ack *extack) |
206 | { | 238 | { |
@@ -338,8 +370,9 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { | |||
338 | 370 | ||
339 | [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 }, | 371 | [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 }, |
340 | [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 }, | 372 | [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 }, |
341 | [NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY, | 373 | [NL80211_ATTR_BEACON_HEAD] = |
342 | .len = IEEE80211_MAX_DATA_LEN }, | 374 | NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head, |
375 | IEEE80211_MAX_DATA_LEN), | ||
343 | [NL80211_ATTR_BEACON_TAIL] = | 376 | [NL80211_ATTR_BEACON_TAIL] = |
344 | NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, | 377 | NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, |
345 | IEEE80211_MAX_DATA_LEN), | 378 | IEEE80211_MAX_DATA_LEN), |
@@ -2636,6 +2669,8 @@ int nl80211_parse_chandef(struct cfg80211_registered_device *rdev, | |||
2636 | 2669 | ||
2637 | control_freq = nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ]); | 2670 | control_freq = nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ]); |
2638 | 2671 | ||
2672 | memset(chandef, 0, sizeof(*chandef)); | ||
2673 | |||
2639 | chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq); | 2674 | chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq); |
2640 | chandef->width = NL80211_CHAN_WIDTH_20_NOHT; | 2675 | chandef->width = NL80211_CHAN_WIDTH_20_NOHT; |
2641 | chandef->center_freq1 = control_freq; | 2676 | chandef->center_freq1 = control_freq; |
@@ -3176,7 +3211,7 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag | |||
3176 | 3211 | ||
3177 | if (rdev->ops->get_channel) { | 3212 | if (rdev->ops->get_channel) { |
3178 | int ret; | 3213 | int ret; |
3179 | struct cfg80211_chan_def chandef; | 3214 | struct cfg80211_chan_def chandef = {}; |
3180 | 3215 | ||
3181 | ret = rdev_get_channel(rdev, wdev, &chandef); | 3216 | ret = rdev_get_channel(rdev, wdev, &chandef); |
3182 | if (ret == 0) { | 3217 | if (ret == 0) { |
@@ -6270,6 +6305,9 @@ static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) | |||
6270 | if (!rdev->ops->del_mpath) | 6305 | if (!rdev->ops->del_mpath) |
6271 | return -EOPNOTSUPP; | 6306 | return -EOPNOTSUPP; |
6272 | 6307 | ||
6308 | if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) | ||
6309 | return -EOPNOTSUPP; | ||
6310 | |||
6273 | return rdev_del_mpath(rdev, dev, dst); | 6311 | return rdev_del_mpath(rdev, dev, dst); |
6274 | } | 6312 | } |
6275 | 6313 | ||
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 5311d0ae2454..420c4207ab59 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -2108,7 +2108,7 @@ static void reg_call_notifier(struct wiphy *wiphy, | |||
2108 | 2108 | ||
2109 | static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) | 2109 | static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) |
2110 | { | 2110 | { |
2111 | struct cfg80211_chan_def chandef; | 2111 | struct cfg80211_chan_def chandef = {}; |
2112 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); | 2112 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); |
2113 | enum nl80211_iftype iftype; | 2113 | enum nl80211_iftype iftype; |
2114 | 2114 | ||
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index d313c9befa23..ff1016607f0b 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c | |||
@@ -1723,7 +1723,12 @@ cfg80211_update_notlisted_nontrans(struct wiphy *wiphy, | |||
1723 | return; | 1723 | return; |
1724 | new_ie_len -= trans_ssid[1]; | 1724 | new_ie_len -= trans_ssid[1]; |
1725 | mbssid = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ie, ielen); | 1725 | mbssid = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ie, ielen); |
1726 | if (!mbssid) | 1726 | /* |
1727 | * It's not valid to have the MBSSID element before SSID | ||
1728 | * ignore if that happens - the code below assumes it is | ||
1729 | * after (while copying things inbetween). | ||
1730 | */ | ||
1731 | if (!mbssid || mbssid < trans_ssid) | ||
1727 | return; | 1732 | return; |
1728 | new_ie_len -= mbssid[1]; | 1733 | new_ie_len -= mbssid[1]; |
1729 | rcu_read_lock(); | 1734 | rcu_read_lock(); |
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index 7b6529d81c61..cac9e28d852b 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c | |||
@@ -798,7 +798,7 @@ static int cfg80211_wext_giwfreq(struct net_device *dev, | |||
798 | { | 798 | { |
799 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 799 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
800 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); | 800 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); |
801 | struct cfg80211_chan_def chandef; | 801 | struct cfg80211_chan_def chandef = {}; |
802 | int ret; | 802 | int ret; |
803 | 803 | ||
804 | switch (wdev->iftype) { | 804 | switch (wdev->iftype) { |
diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c index 6088bc2dc11e..9b599ed66d97 100644 --- a/net/xfrm/xfrm_input.c +++ b/net/xfrm/xfrm_input.c | |||
@@ -706,7 +706,7 @@ resume: | |||
706 | if (err) | 706 | if (err) |
707 | goto drop; | 707 | goto drop; |
708 | 708 | ||
709 | nf_reset(skb); | 709 | nf_reset_ct(skb); |
710 | 710 | ||
711 | if (decaps) { | 711 | if (decaps) { |
712 | sp = skb_sec_path(skb); | 712 | sp = skb_sec_path(skb); |
diff --git a/net/xfrm/xfrm_interface.c b/net/xfrm/xfrm_interface.c index 2ab4859df55a..0f5131bc3342 100644 --- a/net/xfrm/xfrm_interface.c +++ b/net/xfrm/xfrm_interface.c | |||
@@ -185,7 +185,7 @@ static void xfrmi_scrub_packet(struct sk_buff *skb, bool xnet) | |||
185 | skb->skb_iif = 0; | 185 | skb->skb_iif = 0; |
186 | skb->ignore_df = 0; | 186 | skb->ignore_df = 0; |
187 | skb_dst_drop(skb); | 187 | skb_dst_drop(skb); |
188 | nf_reset(skb); | 188 | nf_reset_ct(skb); |
189 | nf_reset_trace(skb); | 189 | nf_reset_trace(skb); |
190 | 190 | ||
191 | if (!xnet) | 191 | if (!xnet) |
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index 9499b35feb92..b1db55b50ba1 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c | |||
@@ -502,7 +502,7 @@ int xfrm_output_resume(struct sk_buff *skb, int err) | |||
502 | struct net *net = xs_net(skb_dst(skb)->xfrm); | 502 | struct net *net = xs_net(skb_dst(skb)->xfrm); |
503 | 503 | ||
504 | while (likely((err = xfrm_output_one(skb, err)) == 0)) { | 504 | while (likely((err = xfrm_output_one(skb, err)) == 0)) { |
505 | nf_reset(skb); | 505 | nf_reset_ct(skb); |
506 | 506 | ||
507 | err = skb_dst(skb)->ops->local_out(net, skb->sk, skb); | 507 | err = skb_dst(skb)->ops->local_out(net, skb->sk, skb); |
508 | if (unlikely(err != 1)) | 508 | if (unlikely(err != 1)) |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 21e939235b39..f2d1e573ea55 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -2808,7 +2808,7 @@ static void xfrm_policy_queue_process(struct timer_list *t) | |||
2808 | continue; | 2808 | continue; |
2809 | } | 2809 | } |
2810 | 2810 | ||
2811 | nf_reset(skb); | 2811 | nf_reset_ct(skb); |
2812 | skb_dst_drop(skb); | 2812 | skb_dst_drop(skb); |
2813 | skb_dst_set(skb, dst); | 2813 | skb_dst_set(skb, dst); |
2814 | 2814 | ||
diff --git a/tools/testing/selftests/net/.gitignore b/tools/testing/selftests/net/.gitignore index c7cced739c34..8aefd81fbc86 100644 --- a/tools/testing/selftests/net/.gitignore +++ b/tools/testing/selftests/net/.gitignore | |||
@@ -21,3 +21,4 @@ ipv6_flowlabel | |||
21 | ipv6_flowlabel_mgr | 21 | ipv6_flowlabel_mgr |
22 | so_txtime | 22 | so_txtime |
23 | tcp_fastopen_backup_key | 23 | tcp_fastopen_backup_key |
24 | nettest | ||
diff --git a/tools/testing/selftests/net/udpgso.c b/tools/testing/selftests/net/udpgso.c index b8265ee9923f..614b31aad168 100644 --- a/tools/testing/selftests/net/udpgso.c +++ b/tools/testing/selftests/net/udpgso.c | |||
@@ -89,12 +89,9 @@ struct testcase testcases_v4[] = { | |||
89 | .tfail = true, | 89 | .tfail = true, |
90 | }, | 90 | }, |
91 | { | 91 | { |
92 | /* send a single MSS: will fail with GSO, because the segment | 92 | /* send a single MSS: will fall back to no GSO */ |
93 | * logic in udp4_ufo_fragment demands a gso skb to be > MTU | ||
94 | */ | ||
95 | .tlen = CONST_MSS_V4, | 93 | .tlen = CONST_MSS_V4, |
96 | .gso_len = CONST_MSS_V4, | 94 | .gso_len = CONST_MSS_V4, |
97 | .tfail = true, | ||
98 | .r_num_mss = 1, | 95 | .r_num_mss = 1, |
99 | }, | 96 | }, |
100 | { | 97 | { |
@@ -139,10 +136,9 @@ struct testcase testcases_v4[] = { | |||
139 | .tfail = true, | 136 | .tfail = true, |
140 | }, | 137 | }, |
141 | { | 138 | { |
142 | /* send a single 1B MSS: will fail, see single MSS above */ | 139 | /* send a single 1B MSS: will fall back to no GSO */ |
143 | .tlen = 1, | 140 | .tlen = 1, |
144 | .gso_len = 1, | 141 | .gso_len = 1, |
145 | .tfail = true, | ||
146 | .r_num_mss = 1, | 142 | .r_num_mss = 1, |
147 | }, | 143 | }, |
148 | { | 144 | { |
@@ -196,12 +192,9 @@ struct testcase testcases_v6[] = { | |||
196 | .tfail = true, | 192 | .tfail = true, |
197 | }, | 193 | }, |
198 | { | 194 | { |
199 | /* send a single MSS: will fail with GSO, because the segment | 195 | /* send a single MSS: will fall back to no GSO */ |
200 | * logic in udp4_ufo_fragment demands a gso skb to be > MTU | ||
201 | */ | ||
202 | .tlen = CONST_MSS_V6, | 196 | .tlen = CONST_MSS_V6, |
203 | .gso_len = CONST_MSS_V6, | 197 | .gso_len = CONST_MSS_V6, |
204 | .tfail = true, | ||
205 | .r_num_mss = 1, | 198 | .r_num_mss = 1, |
206 | }, | 199 | }, |
207 | { | 200 | { |
@@ -246,10 +239,9 @@ struct testcase testcases_v6[] = { | |||
246 | .tfail = true, | 239 | .tfail = true, |
247 | }, | 240 | }, |
248 | { | 241 | { |
249 | /* send a single 1B MSS: will fail, see single MSS above */ | 242 | /* send a single 1B MSS: will fall back to no GSO */ |
250 | .tlen = 1, | 243 | .tlen = 1, |
251 | .gso_len = 1, | 244 | .gso_len = 1, |
252 | .tfail = true, | ||
253 | .r_num_mss = 1, | 245 | .r_num_mss = 1, |
254 | }, | 246 | }, |
255 | { | 247 | { |