Commit 1f5e808a authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull networking fixes from Paolo Abeni:
 "Including fixes from bluetooth and CAN. No known outstanding
  regressions.

  Current release - regressions:

   - mptcp: initialize rcv_mss before calling tcp_send_active_reset()

   - eth: mlx5e: fix validation logic in rate limiting

  Previous releases - regressions:

   - xsk: avoid data corruption on cq descriptor number

   - bluetooth:
       - prevent race in socket write iter and sock bind
       - fix not generating mackey and ltk when repairing

   - can:
       - kvaser_usb: fix potential infinite loop in command parsers
       - rcar_canfd: fix CAN-FD mode as default

   - eth:
       - veth: reduce XDP no_direct return section to fix race
       - virtio-net: avoid unnecessary checksum calculation on guest RX

  Previous releases - always broken:

   - sched: fix TCF_LAYER_TRANSPORT handling in tcf_get_base_ptr()

   - bluetooth: mediatek: fix kernel crash when releasing iso interface

   - vhost: rewind next_avail_head while discarding descriptors

   - eth:
       - r8169: fix RTL8127 hang on suspend/shutdown
       - aquantia: add missing descriptor cache invalidation on ATL2

   - dsa: microchip: fix resource releases in error path"

* tag 'net-6.18-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (47 commits)
  mptcp: Initialise rcv_mss before calling tcp_send_active_reset() in mptcp_do_fastclose().
  net: fec: do not register PPS event for PEROUT
  net: fec: do not allow enabling PPS and PEROUT simultaneously
  net: fec: do not update PEROUT if it is enabled
  net: fec: cancel perout_timer when PEROUT is disabled
  net: mctp: unconditionally set skb->dev on dst output
  net: atlantic: fix fragment overflow handling in RX path
  MAINTAINERS: separate VIRTIO NET DRIVER and add netdev
  virtio-net: avoid unnecessary checksum calculation on guest RX
  eth: fbnic: Fix counter roll-over issue
  mptcp: clear scheduled subflows on retransmit
  net: dsa: sja1105: fix SGMII linking at 10M or 100M but not passing traffic
  s390/net: list Aswin Karuvally as maintainer
  net: wwan: mhi: Keep modem name match with Foxconn T99W640
  vhost: rewind next_avail_head while discarding descriptors
  net/sched: em_canid: fix uninit-value in em_canid_match
  can: rcar_canfd: Fix CAN-FD mode as default
  xsk: avoid data corruption on cq descriptor number
  r8169: fix RTL8127 hang on suspend/shutdown
  net: sxgbe: fix potential NULL dereference in sxgbe_rx()
  ...
parents a76dce0e f07f4ea5
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -22655,7 +22655,7 @@ F: arch/s390/mm
S390 NETWORK DRIVERS
M:	Alexandra Winter <wintera@linux.ibm.com>
R:	Aswin Karuvally <aswin@linux.ibm.com>
M:	Aswin Karuvally <aswin@linux.ibm.com>
L:	linux-s390@vger.kernel.org
L:	netdev@vger.kernel.org
S:	Supported
@@ -27122,7 +27122,7 @@ S: Maintained
F:	drivers/char/virtio_console.c
F:	include/uapi/linux/virtio_console.h
VIRTIO CORE AND NET DRIVERS
VIRTIO CORE
M:	"Michael S. Tsirkin" <mst@redhat.com>
M:	Jason Wang <jasowang@redhat.com>
R:	Xuan Zhuo <xuanzhuo@linux.alibaba.com>
@@ -27135,7 +27135,6 @@ F: Documentation/devicetree/bindings/virtio/
F:	Documentation/driver-api/virtio/
F:	drivers/block/virtio_blk.c
F:	drivers/crypto/virtio/
F:	drivers/net/virtio_net.c
F:	drivers/vdpa/
F:	drivers/virtio/
F:	include/linux/vdpa.h
@@ -27144,7 +27143,6 @@ F: include/linux/vringh.h
F:	include/uapi/linux/virtio_*.h
F:	net/vmw_vsock/virtio*
F:	tools/virtio/
F:	tools/testing/selftests/drivers/net/virtio_net/
VIRTIO CRYPTO DRIVER
M:	Gonglei <arei.gonglei@huawei.com>
@@ -27256,6 +27254,19 @@ W: https://virtio-mem.gitlab.io/
F:	drivers/virtio/virtio_mem.c
F:	include/uapi/linux/virtio_mem.h
VIRTIO NET DRIVER
M:	"Michael S. Tsirkin" <mst@redhat.com>
M:	Jason Wang <jasowang@redhat.com>
R:	Xuan Zhuo <xuanzhuo@linux.alibaba.com>
R:	Eugenio Pérez <eperezma@redhat.com>
L:	netdev@vger.kernel.org
L:	virtualization@lists.linux.dev
S:	Maintained
F:	drivers/net/virtio_net.c
F:	include/linux/virtio_net.h
F:	include/uapi/linux/virtio_net.h
F:	tools/testing/selftests/drivers/net/virtio_net/
VIRTIO PMEM DRIVER
M:	Pankaj Gupta <pankaj.gupta.linux@gmail.com>
L:	virtualization@lists.linux.dev
+2 −0
Original line number Diff line number Diff line
@@ -1374,7 +1374,9 @@ fore200e_open(struct atm_vcc *vcc)

	vcc->dev_data = NULL;

	mutex_lock(&fore200e->rate_mtx);
	fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
	mutex_unlock(&fore200e->rate_mtx);

	kfree(fore200e_vcc);
	return -EINVAL;
+32 −7
Original line number Diff line number Diff line
@@ -2711,9 +2711,21 @@ static int btusb_recv_event_realtek(struct hci_dev *hdev, struct sk_buff *skb)

static void btusb_mtk_claim_iso_intf(struct btusb_data *data)
{
	struct btmtk_data *btmtk_data = hci_get_priv(data->hdev);
	struct btmtk_data *btmtk_data;
	int err;

	if (!data->hdev)
		return;

	btmtk_data = hci_get_priv(data->hdev);
	if (!btmtk_data)
		return;

	if (!btmtk_data->isopkt_intf) {
		bt_dev_err(data->hdev, "Can't claim NULL iso interface");
		return;
	}

	/*
	 * The function usb_driver_claim_interface() is documented to need
	 * locks held if it's not called from a probe routine. The code here
@@ -2735,17 +2747,30 @@ static void btusb_mtk_claim_iso_intf(struct btusb_data *data)

static void btusb_mtk_release_iso_intf(struct hci_dev *hdev)
{
	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
	struct btmtk_data *btmtk_data;

	if (!hdev)
		return;

	btmtk_data = hci_get_priv(hdev);
	if (!btmtk_data)
		return;

	if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) {
		usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
		clear_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags);

		if (btmtk_data->isopkt_skb) {
			dev_kfree_skb_irq(btmtk_data->isopkt_skb);
			btmtk_data->isopkt_skb = NULL;
		}

		if (btmtk_data->isopkt_intf) {
			usb_set_intfdata(btmtk_data->isopkt_intf, NULL);
			usb_driver_release_interface(&btusb_driver,
						     btmtk_data->isopkt_intf);
			btmtk_data->isopkt_intf = NULL;
		}
	}

	clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
+31 −22
Original line number Diff line number Diff line
@@ -709,6 +709,11 @@ static void rcar_canfd_set_bit_reg(void __iomem *addr, u32 val)
	rcar_canfd_update(val, val, addr);
}

static void rcar_canfd_clear_bit_reg(void __iomem *addr, u32 val)
{
	rcar_canfd_update(val, 0, addr);
}

static void rcar_canfd_update_bit_reg(void __iomem *addr, u32 mask, u32 val)
{
	rcar_canfd_update(mask, val, addr);
@@ -755,25 +760,6 @@ static void rcar_canfd_set_rnc(struct rcar_canfd_global *gpriv, unsigned int ch,
	rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(w), rnc);
}

static void rcar_canfd_set_mode(struct rcar_canfd_global *gpriv)
{
	if (gpriv->info->ch_interface_mode) {
		u32 ch, val = gpriv->fdmode ? RCANFD_GEN4_FDCFG_FDOE
					    : RCANFD_GEN4_FDCFG_CLOE;

		for_each_set_bit(ch, &gpriv->channels_mask,
				 gpriv->info->max_channels)
			rcar_canfd_set_bit_reg(&gpriv->fcbase[ch].cfdcfg, val);
	} else {
		if (gpriv->fdmode)
			rcar_canfd_set_bit(gpriv->base, RCANFD_GRMCFG,
					   RCANFD_GRMCFG_RCMC);
		else
			rcar_canfd_clear_bit(gpriv->base, RCANFD_GRMCFG,
					     RCANFD_GRMCFG_RCMC);
	}
}

static int rcar_canfd_reset_controller(struct rcar_canfd_global *gpriv)
{
	struct device *dev = &gpriv->pdev->dev;
@@ -806,6 +792,16 @@ static int rcar_canfd_reset_controller(struct rcar_canfd_global *gpriv)
	/* Reset Global error flags */
	rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0x0);

	/* Set the controller into appropriate mode */
	if (!gpriv->info->ch_interface_mode) {
		if (gpriv->fdmode)
			rcar_canfd_set_bit(gpriv->base, RCANFD_GRMCFG,
					   RCANFD_GRMCFG_RCMC);
		else
			rcar_canfd_clear_bit(gpriv->base, RCANFD_GRMCFG,
					     RCANFD_GRMCFG_RCMC);
	}

	/* Transition all Channels to reset mode */
	for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) {
		rcar_canfd_clear_bit(gpriv->base,
@@ -823,10 +819,23 @@ static int rcar_canfd_reset_controller(struct rcar_canfd_global *gpriv)
			dev_dbg(dev, "channel %u reset failed\n", ch);
			return err;
		}
	}

		/* Set the controller into appropriate mode */
	rcar_canfd_set_mode(gpriv);
		if (gpriv->info->ch_interface_mode) {
			/* Do not set CLOE and FDOE simultaneously */
			if (!gpriv->fdmode) {
				rcar_canfd_clear_bit_reg(&gpriv->fcbase[ch].cfdcfg,
							 RCANFD_GEN4_FDCFG_FDOE);
				rcar_canfd_set_bit_reg(&gpriv->fcbase[ch].cfdcfg,
						       RCANFD_GEN4_FDCFG_CLOE);
			} else {
				rcar_canfd_clear_bit_reg(&gpriv->fcbase[ch].cfdcfg,
							 RCANFD_GEN4_FDCFG_FDOE);
				rcar_canfd_clear_bit_reg(&gpriv->fcbase[ch].cfdcfg,
							 RCANFD_GEN4_FDCFG_CLOE);
			}
		}
	}

	return 0;
}
+2 −2
Original line number Diff line number Diff line
@@ -548,8 +548,8 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
	if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF)
		goto out;

	while ((isrc = priv->read_reg(priv, SJA1000_IR)) &&
	       (n < SJA1000_MAX_IRQ)) {
	while ((n < SJA1000_MAX_IRQ) &&
	       (isrc = priv->read_reg(priv, SJA1000_IR))) {

		status = priv->read_reg(priv, SJA1000_SR);
		/* check for absent controller due to hw unplug */
Loading