Skip to content

Commit 1f5e808

Browse files
committed
Merge tag 'net-6.18-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
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() ...
2 parents a76dce0 + f07f4ea commit 1f5e808

49 files changed

Lines changed: 700 additions & 353 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

MAINTAINERS

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22655,7 +22655,7 @@ F: arch/s390/mm
2265522655

2265622656
S390 NETWORK DRIVERS
2265722657
M: Alexandra Winter <wintera@linux.ibm.com>
22658-
R: Aswin Karuvally <aswin@linux.ibm.com>
22658+
M: Aswin Karuvally <aswin@linux.ibm.com>
2265922659
L: linux-s390@vger.kernel.org
2266022660
L: netdev@vger.kernel.org
2266122661
S: Supported
@@ -27122,7 +27122,7 @@ S: Maintained
2712227122
F: drivers/char/virtio_console.c
2712327123
F: include/uapi/linux/virtio_console.h
2712427124

27125-
VIRTIO CORE AND NET DRIVERS
27125+
VIRTIO CORE
2712627126
M: "Michael S. Tsirkin" <mst@redhat.com>
2712727127
M: Jason Wang <jasowang@redhat.com>
2712827128
R: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
@@ -27135,7 +27135,6 @@ F: Documentation/devicetree/bindings/virtio/
2713527135
F: Documentation/driver-api/virtio/
2713627136
F: drivers/block/virtio_blk.c
2713727137
F: drivers/crypto/virtio/
27138-
F: drivers/net/virtio_net.c
2713927138
F: drivers/vdpa/
2714027139
F: drivers/virtio/
2714127140
F: include/linux/vdpa.h
@@ -27144,7 +27143,6 @@ F: include/linux/vringh.h
2714427143
F: include/uapi/linux/virtio_*.h
2714527144
F: net/vmw_vsock/virtio*
2714627145
F: tools/virtio/
27147-
F: tools/testing/selftests/drivers/net/virtio_net/
2714827146

2714927147
VIRTIO CRYPTO DRIVER
2715027148
M: Gonglei <arei.gonglei@huawei.com>
@@ -27256,6 +27254,19 @@ W: https://virtio-mem.gitlab.io/
2725627254
F: drivers/virtio/virtio_mem.c
2725727255
F: include/uapi/linux/virtio_mem.h
2725827256

27257+
VIRTIO NET DRIVER
27258+
M: "Michael S. Tsirkin" <mst@redhat.com>
27259+
M: Jason Wang <jasowang@redhat.com>
27260+
R: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
27261+
R: Eugenio Pérez <eperezma@redhat.com>
27262+
L: netdev@vger.kernel.org
27263+
L: virtualization@lists.linux.dev
27264+
S: Maintained
27265+
F: drivers/net/virtio_net.c
27266+
F: include/linux/virtio_net.h
27267+
F: include/uapi/linux/virtio_net.h
27268+
F: tools/testing/selftests/drivers/net/virtio_net/
27269+
2725927270
VIRTIO PMEM DRIVER
2726027271
M: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
2726127272
L: virtualization@lists.linux.dev

drivers/atm/fore200e.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,7 +1374,9 @@ fore200e_open(struct atm_vcc *vcc)
13741374

13751375
vcc->dev_data = NULL;
13761376

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

13791381
kfree(fore200e_vcc);
13801382
return -EINVAL;

drivers/bluetooth/btusb.c

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2711,9 +2711,21 @@ static int btusb_recv_event_realtek(struct hci_dev *hdev, struct sk_buff *skb)
27112711

27122712
static void btusb_mtk_claim_iso_intf(struct btusb_data *data)
27132713
{
2714-
struct btmtk_data *btmtk_data = hci_get_priv(data->hdev);
2714+
struct btmtk_data *btmtk_data;
27152715
int err;
27162716

2717+
if (!data->hdev)
2718+
return;
2719+
2720+
btmtk_data = hci_get_priv(data->hdev);
2721+
if (!btmtk_data)
2722+
return;
2723+
2724+
if (!btmtk_data->isopkt_intf) {
2725+
bt_dev_err(data->hdev, "Can't claim NULL iso interface");
2726+
return;
2727+
}
2728+
27172729
/*
27182730
* The function usb_driver_claim_interface() is documented to need
27192731
* 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)
27352747

27362748
static void btusb_mtk_release_iso_intf(struct hci_dev *hdev)
27372749
{
2738-
struct btmtk_data *btmtk_data = hci_get_priv(hdev);
2750+
struct btmtk_data *btmtk_data;
2751+
2752+
if (!hdev)
2753+
return;
2754+
2755+
btmtk_data = hci_get_priv(hdev);
2756+
if (!btmtk_data)
2757+
return;
27392758

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

2744-
dev_kfree_skb_irq(btmtk_data->isopkt_skb);
2745-
btmtk_data->isopkt_skb = NULL;
2746-
usb_set_intfdata(btmtk_data->isopkt_intf, NULL);
2747-
usb_driver_release_interface(&btusb_driver,
2748-
btmtk_data->isopkt_intf);
2763+
if (btmtk_data->isopkt_skb) {
2764+
dev_kfree_skb_irq(btmtk_data->isopkt_skb);
2765+
btmtk_data->isopkt_skb = NULL;
2766+
}
2767+
2768+
if (btmtk_data->isopkt_intf) {
2769+
usb_set_intfdata(btmtk_data->isopkt_intf, NULL);
2770+
usb_driver_release_interface(&btusb_driver,
2771+
btmtk_data->isopkt_intf);
2772+
btmtk_data->isopkt_intf = NULL;
2773+
}
27492774
}
27502775

27512776
clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);

drivers/net/can/rcar/rcar_canfd.c

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,11 @@ static void rcar_canfd_set_bit_reg(void __iomem *addr, u32 val)
709709
rcar_canfd_update(val, val, addr);
710710
}
711711

712+
static void rcar_canfd_clear_bit_reg(void __iomem *addr, u32 val)
713+
{
714+
rcar_canfd_update(val, 0, addr);
715+
}
716+
712717
static void rcar_canfd_update_bit_reg(void __iomem *addr, u32 mask, u32 val)
713718
{
714719
rcar_canfd_update(mask, val, addr);
@@ -755,25 +760,6 @@ static void rcar_canfd_set_rnc(struct rcar_canfd_global *gpriv, unsigned int ch,
755760
rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(w), rnc);
756761
}
757762

758-
static void rcar_canfd_set_mode(struct rcar_canfd_global *gpriv)
759-
{
760-
if (gpriv->info->ch_interface_mode) {
761-
u32 ch, val = gpriv->fdmode ? RCANFD_GEN4_FDCFG_FDOE
762-
: RCANFD_GEN4_FDCFG_CLOE;
763-
764-
for_each_set_bit(ch, &gpriv->channels_mask,
765-
gpriv->info->max_channels)
766-
rcar_canfd_set_bit_reg(&gpriv->fcbase[ch].cfdcfg, val);
767-
} else {
768-
if (gpriv->fdmode)
769-
rcar_canfd_set_bit(gpriv->base, RCANFD_GRMCFG,
770-
RCANFD_GRMCFG_RCMC);
771-
else
772-
rcar_canfd_clear_bit(gpriv->base, RCANFD_GRMCFG,
773-
RCANFD_GRMCFG_RCMC);
774-
}
775-
}
776-
777763
static int rcar_canfd_reset_controller(struct rcar_canfd_global *gpriv)
778764
{
779765
struct device *dev = &gpriv->pdev->dev;
@@ -806,6 +792,16 @@ static int rcar_canfd_reset_controller(struct rcar_canfd_global *gpriv)
806792
/* Reset Global error flags */
807793
rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0x0);
808794

795+
/* Set the controller into appropriate mode */
796+
if (!gpriv->info->ch_interface_mode) {
797+
if (gpriv->fdmode)
798+
rcar_canfd_set_bit(gpriv->base, RCANFD_GRMCFG,
799+
RCANFD_GRMCFG_RCMC);
800+
else
801+
rcar_canfd_clear_bit(gpriv->base, RCANFD_GRMCFG,
802+
RCANFD_GRMCFG_RCMC);
803+
}
804+
809805
/* Transition all Channels to reset mode */
810806
for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) {
811807
rcar_canfd_clear_bit(gpriv->base,
@@ -823,10 +819,23 @@ static int rcar_canfd_reset_controller(struct rcar_canfd_global *gpriv)
823819
dev_dbg(dev, "channel %u reset failed\n", ch);
824820
return err;
825821
}
826-
}
827822

828-
/* Set the controller into appropriate mode */
829-
rcar_canfd_set_mode(gpriv);
823+
/* Set the controller into appropriate mode */
824+
if (gpriv->info->ch_interface_mode) {
825+
/* Do not set CLOE and FDOE simultaneously */
826+
if (!gpriv->fdmode) {
827+
rcar_canfd_clear_bit_reg(&gpriv->fcbase[ch].cfdcfg,
828+
RCANFD_GEN4_FDCFG_FDOE);
829+
rcar_canfd_set_bit_reg(&gpriv->fcbase[ch].cfdcfg,
830+
RCANFD_GEN4_FDCFG_CLOE);
831+
} else {
832+
rcar_canfd_clear_bit_reg(&gpriv->fcbase[ch].cfdcfg,
833+
RCANFD_GEN4_FDCFG_FDOE);
834+
rcar_canfd_clear_bit_reg(&gpriv->fcbase[ch].cfdcfg,
835+
RCANFD_GEN4_FDCFG_CLOE);
836+
}
837+
}
838+
}
830839

831840
return 0;
832841
}

drivers/net/can/sja1000/sja1000.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,8 +548,8 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
548548
if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF)
549549
goto out;
550550

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

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

drivers/net/can/sun4i_can.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -657,8 +657,8 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
657657
u8 isrc, status;
658658
int n = 0;
659659

660-
while ((isrc = readl(priv->base + SUN4I_REG_INT_ADDR)) &&
661-
(n < SUN4I_CAN_MAX_IRQ)) {
660+
while ((n < SUN4I_CAN_MAX_IRQ) &&
661+
(isrc = readl(priv->base + SUN4I_REG_INT_ADDR))) {
662662
n++;
663663
status = readl(priv->base + SUN4I_REG_STA_ADDR);
664664

drivers/net/can/usb/gs_usb.c

Lines changed: 87 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -261,14 +261,21 @@ struct canfd_quirk {
261261
u8 quirk;
262262
} __packed;
263263

264+
/* struct gs_host_frame::echo_id == GS_HOST_FRAME_ECHO_ID_RX indicates
265+
* a regular RX'ed CAN frame
266+
*/
267+
#define GS_HOST_FRAME_ECHO_ID_RX 0xffffffff
268+
264269
struct gs_host_frame {
265-
u32 echo_id;
266-
__le32 can_id;
270+
struct_group(header,
271+
u32 echo_id;
272+
__le32 can_id;
267273

268-
u8 can_dlc;
269-
u8 channel;
270-
u8 flags;
271-
u8 reserved;
274+
u8 can_dlc;
275+
u8 channel;
276+
u8 flags;
277+
u8 reserved;
278+
);
272279

273280
union {
274281
DECLARE_FLEX_ARRAY(struct classic_can, classic_can);
@@ -568,6 +575,37 @@ gs_usb_get_echo_skb(struct gs_can *dev, struct sk_buff *skb,
568575
return len;
569576
}
570577

578+
static unsigned int
579+
gs_usb_get_minimum_rx_length(const struct gs_can *dev, const struct gs_host_frame *hf,
580+
unsigned int *data_length_p)
581+
{
582+
unsigned int minimum_length, data_length = 0;
583+
584+
if (hf->flags & GS_CAN_FLAG_FD) {
585+
if (hf->echo_id == GS_HOST_FRAME_ECHO_ID_RX)
586+
data_length = can_fd_dlc2len(hf->can_dlc);
587+
588+
if (dev->feature & GS_CAN_FEATURE_HW_TIMESTAMP)
589+
/* timestamp follows data field of max size */
590+
minimum_length = struct_size(hf, canfd_ts, 1);
591+
else
592+
minimum_length = sizeof(hf->header) + data_length;
593+
} else {
594+
if (hf->echo_id == GS_HOST_FRAME_ECHO_ID_RX &&
595+
!(hf->can_id & cpu_to_le32(CAN_RTR_FLAG)))
596+
data_length = can_cc_dlc2len(hf->can_dlc);
597+
598+
if (dev->feature & GS_CAN_FEATURE_HW_TIMESTAMP)
599+
/* timestamp follows data field of max size */
600+
minimum_length = struct_size(hf, classic_can_ts, 1);
601+
else
602+
minimum_length = sizeof(hf->header) + data_length;
603+
}
604+
605+
*data_length_p = data_length;
606+
return minimum_length;
607+
}
608+
571609
static void gs_usb_receive_bulk_callback(struct urb *urb)
572610
{
573611
struct gs_usb *parent = urb->context;
@@ -576,6 +614,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
576614
int rc;
577615
struct net_device_stats *stats;
578616
struct gs_host_frame *hf = urb->transfer_buffer;
617+
unsigned int minimum_length, data_length;
579618
struct gs_tx_context *txc;
580619
struct can_frame *cf;
581620
struct canfd_frame *cfd;
@@ -594,6 +633,15 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
594633
return;
595634
}
596635

636+
minimum_length = sizeof(hf->header);
637+
if (urb->actual_length < minimum_length) {
638+
dev_err_ratelimited(&parent->udev->dev,
639+
"short read (actual_length=%u, minimum_length=%u)\n",
640+
urb->actual_length, minimum_length);
641+
642+
goto resubmit_urb;
643+
}
644+
597645
/* device reports out of range channel id */
598646
if (hf->channel >= parent->channel_cnt)
599647
goto device_detach;
@@ -609,20 +657,33 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
609657
if (!netif_running(netdev))
610658
goto resubmit_urb;
611659

612-
if (hf->echo_id == -1) { /* normal rx */
660+
minimum_length = gs_usb_get_minimum_rx_length(dev, hf, &data_length);
661+
if (urb->actual_length < minimum_length) {
662+
stats->rx_errors++;
663+
stats->rx_length_errors++;
664+
665+
if (net_ratelimit())
666+
netdev_err(netdev,
667+
"short read (actual_length=%u, minimum_length=%u)\n",
668+
urb->actual_length, minimum_length);
669+
670+
goto resubmit_urb;
671+
}
672+
673+
if (hf->echo_id == GS_HOST_FRAME_ECHO_ID_RX) { /* normal rx */
613674
if (hf->flags & GS_CAN_FLAG_FD) {
614675
skb = alloc_canfd_skb(netdev, &cfd);
615676
if (!skb)
616677
return;
617678

618679
cfd->can_id = le32_to_cpu(hf->can_id);
619-
cfd->len = can_fd_dlc2len(hf->can_dlc);
680+
cfd->len = data_length;
620681
if (hf->flags & GS_CAN_FLAG_BRS)
621682
cfd->flags |= CANFD_BRS;
622683
if (hf->flags & GS_CAN_FLAG_ESI)
623684
cfd->flags |= CANFD_ESI;
624685

625-
memcpy(cfd->data, hf->canfd->data, cfd->len);
686+
memcpy(cfd->data, hf->canfd->data, data_length);
626687
} else {
627688
skb = alloc_can_skb(netdev, &cf);
628689
if (!skb)
@@ -631,7 +692,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
631692
cf->can_id = le32_to_cpu(hf->can_id);
632693
can_frame_set_cc_len(cf, hf->can_dlc, dev->can.ctrlmode);
633694

634-
memcpy(cf->data, hf->classic_can->data, 8);
695+
memcpy(cf->data, hf->classic_can->data, data_length);
635696

636697
/* ERROR frames tell us information about the controller */
637698
if (le32_to_cpu(hf->can_id) & CAN_ERR_FLAG)
@@ -687,7 +748,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
687748
resubmit_urb:
688749
usb_fill_bulk_urb(urb, parent->udev,
689750
parent->pipe_in,
690-
hf, dev->parent->hf_size_rx,
751+
hf, parent->hf_size_rx,
691752
gs_usb_receive_bulk_callback, parent);
692753

693754
rc = usb_submit_urb(urb, GFP_ATOMIC);
@@ -750,8 +811,21 @@ static void gs_usb_xmit_callback(struct urb *urb)
750811
struct gs_can *dev = txc->dev;
751812
struct net_device *netdev = dev->netdev;
752813

753-
if (urb->status)
754-
netdev_info(netdev, "usb xmit fail %u\n", txc->echo_id);
814+
if (!urb->status)
815+
return;
816+
817+
if (urb->status != -ESHUTDOWN && net_ratelimit())
818+
netdev_info(netdev, "failed to xmit URB %u: %pe\n",
819+
txc->echo_id, ERR_PTR(urb->status));
820+
821+
netdev->stats.tx_dropped++;
822+
netdev->stats.tx_errors++;
823+
824+
can_free_echo_skb(netdev, txc->echo_id, NULL);
825+
gs_free_tx_context(txc);
826+
atomic_dec(&dev->active_tx_urbs);
827+
828+
netif_wake_queue(netdev);
755829
}
756830

757831
static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,

0 commit comments

Comments
 (0)