Skip to content

Commit efa8c81

Browse files
committed
Merge branch 'mlxsw-fixes'
Ido Schimmel says: ==================== mlxsw: Various fixes This patchset contains small fixes in mlxsw and one fix in the bridge driver. Patches #1-#4 perform small adjustments in PCI and FID code following recent tests that were performed on the Spectrum-2 ASIC. Patch #5 fixes the bridge driver to mark FDB entries that were added by user as such. Otherwise, these entries will be ignored by underlying switch drivers. Patch torvalds#6 fixes a long standing issue in mlxsw where the driver incorrectly programmed static FDB entries as both static and sticky. Patches torvalds#7-torvalds#8 add test cases for above mentioned bugs. Please consider patches #1, #2 and #4 for stable. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 20f5248 + 479a2b7 commit efa8c81

File tree

7 files changed

+77
-17
lines changed

7 files changed

+77
-17
lines changed

drivers/net/ethernet/mellanox/mlxsw/pci.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -604,29 +604,31 @@ static void mlxsw_pci_cq_tasklet(unsigned long data)
604604
u16 wqe_counter = mlxsw_pci_cqe_wqe_counter_get(cqe);
605605
u8 sendq = mlxsw_pci_cqe_sr_get(q->u.cq.v, cqe);
606606
u8 dqn = mlxsw_pci_cqe_dqn_get(q->u.cq.v, cqe);
607+
char ncqe[MLXSW_PCI_CQE_SIZE_MAX];
608+
609+
memcpy(ncqe, cqe, q->elem_size);
610+
mlxsw_pci_queue_doorbell_consumer_ring(mlxsw_pci, q);
607611

608612
if (sendq) {
609613
struct mlxsw_pci_queue *sdq;
610614

611615
sdq = mlxsw_pci_sdq_get(mlxsw_pci, dqn);
612616
mlxsw_pci_cqe_sdq_handle(mlxsw_pci, sdq,
613-
wqe_counter, cqe);
617+
wqe_counter, ncqe);
614618
q->u.cq.comp_sdq_count++;
615619
} else {
616620
struct mlxsw_pci_queue *rdq;
617621

618622
rdq = mlxsw_pci_rdq_get(mlxsw_pci, dqn);
619623
mlxsw_pci_cqe_rdq_handle(mlxsw_pci, rdq,
620-
wqe_counter, q->u.cq.v, cqe);
624+
wqe_counter, q->u.cq.v, ncqe);
621625
q->u.cq.comp_rdq_count++;
622626
}
623627
if (++items == credits)
624628
break;
625629
}
626-
if (items) {
627-
mlxsw_pci_queue_doorbell_consumer_ring(mlxsw_pci, q);
630+
if (items)
628631
mlxsw_pci_queue_doorbell_arm_consumer_ring(mlxsw_pci, q);
629-
}
630632
}
631633

632634
static u16 mlxsw_pci_cq_elem_count(const struct mlxsw_pci_queue *q)
@@ -1365,10 +1367,10 @@ static int mlxsw_pci_sw_reset(struct mlxsw_pci *mlxsw_pci,
13651367
u32 val = mlxsw_pci_read32(mlxsw_pci, FW_READY);
13661368

13671369
if ((val & MLXSW_PCI_FW_READY_MASK) == MLXSW_PCI_FW_READY_MAGIC)
1368-
break;
1370+
return 0;
13691371
cond_resched();
13701372
} while (time_before(jiffies, end));
1371-
return 0;
1373+
return -EBUSY;
13721374
}
13731375

13741376
static int mlxsw_pci_alloc_irq_vectors(struct mlxsw_pci *mlxsw_pci)

drivers/net/ethernet/mellanox/mlxsw/pci_hw.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
#define MLXSW_PCI_SW_RESET 0xF0010
2929
#define MLXSW_PCI_SW_RESET_RST_BIT BIT(0)
30-
#define MLXSW_PCI_SW_RESET_TIMEOUT_MSECS 5000
30+
#define MLXSW_PCI_SW_RESET_TIMEOUT_MSECS 13000
3131
#define MLXSW_PCI_SW_RESET_WAIT_MSECS 100
3232
#define MLXSW_PCI_FW_READY 0xA1844
3333
#define MLXSW_PCI_FW_READY_MASK 0xFFFF
@@ -53,6 +53,7 @@
5353
#define MLXSW_PCI_WQE_SIZE 32 /* 32 bytes per element */
5454
#define MLXSW_PCI_CQE01_SIZE 16 /* 16 bytes per element */
5555
#define MLXSW_PCI_CQE2_SIZE 32 /* 32 bytes per element */
56+
#define MLXSW_PCI_CQE_SIZE_MAX MLXSW_PCI_CQE2_SIZE
5657
#define MLXSW_PCI_EQE_SIZE 16 /* 16 bytes per element */
5758
#define MLXSW_PCI_WQE_COUNT (MLXSW_PCI_AQ_SIZE / MLXSW_PCI_WQE_SIZE)
5859
#define MLXSW_PCI_CQE01_COUNT (MLXSW_PCI_AQ_SIZE / MLXSW_PCI_CQE01_SIZE)

drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -997,8 +997,8 @@ static const struct mlxsw_sp_fid_ops mlxsw_sp_fid_dummy_ops = {
997997
static const struct mlxsw_sp_fid_family mlxsw_sp_fid_dummy_family = {
998998
.type = MLXSW_SP_FID_TYPE_DUMMY,
999999
.fid_size = sizeof(struct mlxsw_sp_fid),
1000-
.start_index = MLXSW_SP_RFID_BASE - 1,
1001-
.end_index = MLXSW_SP_RFID_BASE - 1,
1000+
.start_index = VLAN_N_VID - 1,
1001+
.end_index = VLAN_N_VID - 1,
10021002
.ops = &mlxsw_sp_fid_dummy_ops,
10031003
};
10041004

drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,7 +1233,7 @@ mlxsw_sp_bridge_port_fdb_flush(struct mlxsw_sp *mlxsw_sp,
12331233
static enum mlxsw_reg_sfd_rec_policy mlxsw_sp_sfd_rec_policy(bool dynamic)
12341234
{
12351235
return dynamic ? MLXSW_REG_SFD_REC_POLICY_DYNAMIC_ENTRY_INGRESS :
1236-
MLXSW_REG_SFD_REC_POLICY_STATIC_ENTRY;
1236+
MLXSW_REG_SFD_REC_POLICY_DYNAMIC_ENTRY_MLAG;
12371237
}
12381238

12391239
static enum mlxsw_reg_sfd_op mlxsw_sp_sfd_op(bool adding)
@@ -1290,7 +1290,7 @@ static int mlxsw_sp_port_fdb_tunnel_uc_op(struct mlxsw_sp *mlxsw_sp,
12901290
static int __mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
12911291
const char *mac, u16 fid, bool adding,
12921292
enum mlxsw_reg_sfd_rec_action action,
1293-
bool dynamic)
1293+
enum mlxsw_reg_sfd_rec_policy policy)
12941294
{
12951295
char *sfd_pl;
12961296
u8 num_rec;
@@ -1301,8 +1301,7 @@ static int __mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
13011301
return -ENOMEM;
13021302

13031303
mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1304-
mlxsw_reg_sfd_uc_pack(sfd_pl, 0, mlxsw_sp_sfd_rec_policy(dynamic),
1305-
mac, fid, action, local_port);
1304+
mlxsw_reg_sfd_uc_pack(sfd_pl, 0, policy, mac, fid, action, local_port);
13061305
num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
13071306
err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
13081307
if (err)
@@ -1321,15 +1320,16 @@ static int mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
13211320
bool dynamic)
13221321
{
13231322
return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, local_port, mac, fid, adding,
1324-
MLXSW_REG_SFD_REC_ACTION_NOP, dynamic);
1323+
MLXSW_REG_SFD_REC_ACTION_NOP,
1324+
mlxsw_sp_sfd_rec_policy(dynamic));
13251325
}
13261326

13271327
int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
13281328
bool adding)
13291329
{
13301330
return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, 0, mac, fid, adding,
13311331
MLXSW_REG_SFD_REC_ACTION_FORWARD_IP_ROUTER,
1332-
false);
1332+
MLXSW_REG_SFD_REC_POLICY_STATIC_ENTRY);
13331333
}
13341334

13351335
static int mlxsw_sp_port_fdb_uc_lag_op(struct mlxsw_sp *mlxsw_sp, u16 lag_id,

net/bridge/br_fdb.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,8 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
11281128
err = -ENOMEM;
11291129
goto err_unlock;
11301130
}
1131+
if (swdev_notify)
1132+
fdb->added_by_user = 1;
11311133
fdb->added_by_external_learn = 1;
11321134
fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
11331135
} else {
@@ -1147,6 +1149,9 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
11471149
modified = true;
11481150
}
11491151

1152+
if (swdev_notify)
1153+
fdb->added_by_user = 1;
1154+
11501155
if (modified)
11511156
fdb_notify(br, fdb, RTM_NEWNEIGH, swdev_notify);
11521157
}

tools/testing/selftests/drivers/net/mlxsw/rtnetlink.sh

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ ALL_TESTS="
2525
lag_unlink_slaves_test
2626
lag_dev_deletion_test
2727
vlan_interface_uppers_test
28+
bridge_extern_learn_test
2829
devlink_reload_test
2930
"
3031
NUM_NETIFS=2
@@ -541,6 +542,25 @@ vlan_interface_uppers_test()
541542
ip link del dev br0
542543
}
543544

545+
bridge_extern_learn_test()
546+
{
547+
# Test that externally learned entries added from user space are
548+
# marked as offloaded
549+
RET=0
550+
551+
ip link add name br0 type bridge
552+
ip link set dev $swp1 master br0
553+
554+
bridge fdb add de:ad:be:ef:13:37 dev $swp1 master extern_learn
555+
556+
bridge fdb show brport $swp1 | grep de:ad:be:ef:13:37 | grep -q offload
557+
check_err $? "fdb entry not marked as offloaded when should"
558+
559+
log_test "externally learned fdb entry"
560+
561+
ip link del dev br0
562+
}
563+
544564
devlink_reload_test()
545565
{
546566
# Test that after executing all the above configuration tests, a

tools/testing/selftests/net/forwarding/bridge_vlan_aware.sh

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/bash
22
# SPDX-License-Identifier: GPL-2.0
33

4-
ALL_TESTS="ping_ipv4 ping_ipv6 learning flooding vlan_deletion"
4+
ALL_TESTS="ping_ipv4 ping_ipv6 learning flooding vlan_deletion extern_learn"
55
NUM_NETIFS=4
66
CHECK_TC="yes"
77
source lib.sh
@@ -109,6 +109,38 @@ vlan_deletion()
109109
ping_ipv6
110110
}
111111

112+
extern_learn()
113+
{
114+
local mac=de:ad:be:ef:13:37
115+
local ageing_time
116+
117+
# Test that externally learned FDB entries can roam, but not age out
118+
RET=0
119+
120+
bridge fdb add de:ad:be:ef:13:37 dev $swp1 master extern_learn vlan 1
121+
122+
bridge fdb show brport $swp1 | grep -q de:ad:be:ef:13:37
123+
check_err $? "Did not find FDB entry when should"
124+
125+
# Wait for 10 seconds after the ageing time to make sure the FDB entry
126+
# was not aged out
127+
ageing_time=$(bridge_ageing_time_get br0)
128+
sleep $((ageing_time + 10))
129+
130+
bridge fdb show brport $swp1 | grep -q de:ad:be:ef:13:37
131+
check_err $? "FDB entry was aged out when should not"
132+
133+
$MZ $h2 -c 1 -p 64 -a $mac -t ip -q
134+
135+
bridge fdb show brport $swp2 | grep -q de:ad:be:ef:13:37
136+
check_err $? "FDB entry did not roam when should"
137+
138+
log_test "Externally learned FDB entry - ageing & roaming"
139+
140+
bridge fdb del de:ad:be:ef:13:37 dev $swp2 master vlan 1 &> /dev/null
141+
bridge fdb del de:ad:be:ef:13:37 dev $swp1 master vlan 1 &> /dev/null
142+
}
143+
112144
trap cleanup EXIT
113145

114146
setup_prepare

0 commit comments

Comments
 (0)