Skip to content

Commit 3a791ad

Browse files
grygoriySsmb49
authored andcommitted
net: ethernet: ti: cpsw: fix min eth packet size for non-switch use-cases
BugLink: https://bugs.launchpad.net/bugs/1943756 commit acc68b8 upstream. The CPSW switchdev driver inherited fix from commit 9421c90 ("net: ethernet: ti: cpsw: fix min eth packet size") which changes min TX packet size to 64bytes (VLAN_ETH_ZLEN, excluding ETH_FCS). It was done to fix HW packed drop issue when packets are sent from Host to the port with PVID and un-tagging enabled. Unfortunately this breaks some other non-switch specific use-cases, like: - [1] CPSW port as DSA CPU port with DSA-tag applied at the end of the packet - [2] Some industrial protocols, which expects min TX packet size 60Bytes (excluding FCS). Fix it by configuring min TX packet size depending on driver mode - 60Bytes (ETH_ZLEN) for multi mac (dual-mac) mode - 64Bytes (VLAN_ETH_ZLEN) for switch mode and update it during driver mode change and annotate with READ_ONCE()/WRITE_ONCE() as it can be read by napi while writing. [1] https://lore.kernel.org/netdev/20210531124051.GA15218@cephalopod/ [2] https://e2e.ti.com/support/arm/sitara_arm/f/791/t/701669 Cc: stable@vger.kernel.org Fixes: ed3525e ("net: ethernet: ti: introduce cpsw switchdev based driver part 1 - dual-emac") Reported-by: Ben Hutchings <ben.hutchings@essensium.com> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Kamal Mostafa <kamal@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
1 parent fefd537 commit 3a791ad

File tree

2 files changed

+8
-3
lines changed

2 files changed

+8
-3
lines changed

drivers/net/ethernet/ti/cpsw_new.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,7 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb,
928928
struct cpdma_chan *txch;
929929
int ret, q_idx;
930930

931-
if (skb_padto(skb, CPSW_MIN_PACKET_SIZE)) {
931+
if (skb_put_padto(skb, READ_ONCE(priv->tx_packet_min))) {
932932
cpsw_err(priv, tx_err, "packet pad failed\n");
933933
ndev->stats.tx_dropped++;
934934
return NET_XMIT_DROP;
@@ -1108,7 +1108,7 @@ static int cpsw_ndo_xdp_xmit(struct net_device *ndev, int n,
11081108

11091109
for (i = 0; i < n; i++) {
11101110
xdpf = frames[i];
1111-
if (xdpf->len < CPSW_MIN_PACKET_SIZE) {
1111+
if (xdpf->len < READ_ONCE(priv->tx_packet_min)) {
11121112
xdp_return_frame_rx_napi(xdpf);
11131113
drops++;
11141114
continue;
@@ -1402,6 +1402,7 @@ static int cpsw_create_ports(struct cpsw_common *cpsw)
14021402
priv->dev = dev;
14031403
priv->msg_enable = netif_msg_init(debug_level, CPSW_DEBUG);
14041404
priv->emac_port = i + 1;
1405+
priv->tx_packet_min = CPSW_MIN_PACKET_SIZE;
14051406

14061407
if (is_valid_ether_addr(slave_data->mac_addr)) {
14071408
ether_addr_copy(priv->mac_addr, slave_data->mac_addr);
@@ -1699,6 +1700,7 @@ static int cpsw_dl_switch_mode_set(struct devlink *dl, u32 id,
16991700

17001701
priv = netdev_priv(sl_ndev);
17011702
slave->port_vlan = vlan;
1703+
WRITE_ONCE(priv->tx_packet_min, CPSW_MIN_PACKET_SIZE_VLAN);
17021704
if (netif_running(sl_ndev))
17031705
cpsw_port_add_switch_def_ale_entries(priv,
17041706
slave);
@@ -1727,6 +1729,7 @@ static int cpsw_dl_switch_mode_set(struct devlink *dl, u32 id,
17271729

17281730
priv = netdev_priv(slave->ndev);
17291731
slave->port_vlan = slave->data->dual_emac_res_vlan;
1732+
WRITE_ONCE(priv->tx_packet_min, CPSW_MIN_PACKET_SIZE);
17301733
cpsw_port_add_dual_emac_def_ale_entries(priv, slave);
17311734
}
17321735

drivers/net/ethernet/ti/cpsw_priv.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ do { \
8989

9090
#define CPSW_POLL_WEIGHT 64
9191
#define CPSW_RX_VLAN_ENCAP_HDR_SIZE 4
92-
#define CPSW_MIN_PACKET_SIZE (VLAN_ETH_ZLEN)
92+
#define CPSW_MIN_PACKET_SIZE_VLAN (VLAN_ETH_ZLEN)
93+
#define CPSW_MIN_PACKET_SIZE (ETH_ZLEN)
9394
#define CPSW_MAX_PACKET_SIZE (VLAN_ETH_FRAME_LEN +\
9495
ETH_FCS_LEN +\
9596
CPSW_RX_VLAN_ENCAP_HDR_SIZE)
@@ -380,6 +381,7 @@ struct cpsw_priv {
380381
u32 emac_port;
381382
struct cpsw_common *cpsw;
382383
int offload_fwd_mark;
384+
u32 tx_packet_min;
383385
};
384386

385387
#define ndev_to_cpsw(ndev) (((struct cpsw_priv *)netdev_priv(ndev))->cpsw)

0 commit comments

Comments
 (0)