summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjmatthew <jmatthew@openbsd.org>2019-06-05 04:45:42 +0000
committerjmatthew <jmatthew@openbsd.org>2019-06-05 04:45:42 +0000
commit1eb024464112177fd0a6c02f23691997e5f959ba (patch)
treea319b3e7d66f921fbfb6622f59d6d4136a97fcc1
parentthis can support 64BIT DVA for io (diff)
downloadwireguard-openbsd-1eb024464112177fd0a6c02f23691997e5f959ba.tar.xz
wireguard-openbsd-1eb024464112177fd0a6c02f23691997e5f959ba.zip
We know which flow table entries are actually in use, so we can just
delete those rather than blindly deleting everything, which also means we don't need to check against a specific syndrome code to ignore errors we get deleting entries that aren't there.
-rw-r--r--sys/dev/pci/if_mcx.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/sys/dev/pci/if_mcx.c b/sys/dev/pci/if_mcx.c
index d87754c31f7..a13eebf3981 100644
--- a/sys/dev/pci/if_mcx.c
+++ b/sys/dev/pci/if_mcx.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_mcx.c,v 1.16 2019/06/04 05:29:30 dlg Exp $ */
+/* $OpenBSD: if_mcx.c,v 1.17 2019/06/05 04:45:42 jmatthew Exp $ */
/*
* Copyright (c) 2017 David Gwynne <dlg@openbsd.org>
@@ -101,10 +101,6 @@
#define MCX_UAR_EQ_DOORBELL 0x48
#define MCX_UAR_BF 0x800
-/* syndromes */
-#define MCX_SYNDROME_ENTRY_NOT_FOUND \
- 0x4EFC3D
-
#define MCX_CMDQ_ADDR_HI 0x0010
#define MCX_CMDQ_ADDR_LO 0x0014
#define MCX_CMDQ_ADDR_NMASK 0xfff
@@ -4933,9 +4929,7 @@ mcx_delete_flow_table_entry(struct mcx_softc *sc, int group, int index)
}
out = mcx_cmdq_out(cqe);
- /* don't complain if the entry didn't exist */
- if (out->cmd_status != MCX_CQ_STATUS_OK &&
- (betoh32(out->cmd_syndrome) != MCX_SYNDROME_ENTRY_NOT_FOUND)) {
+ if (out->cmd_status != MCX_CQ_STATUS_OK) {
printf("%s: delete flow table entry %d failed (%x, %x)\n",
DEVNAME(sc), index, out->cmd_status,
betoh32(out->cmd_syndrome));
@@ -5914,9 +5908,17 @@ mcx_down(struct mcx_softc *sc)
* delete flow table entries first, so no packets can arrive
* after the barriers
*/
- for (group = 0; group < MCX_NUM_FLOW_GROUPS; group++) {
- for (i = 0; i < sc->sc_flow_group_size[group]; i++)
- mcx_delete_flow_table_entry(sc, group, i);
+ if (sc->sc_promisc_flow_enabled)
+ mcx_delete_flow_table_entry(sc, MCX_FLOW_GROUP_PROMISC, 0);
+ if (sc->sc_allmulti_flow_enabled)
+ mcx_delete_flow_table_entry(sc, MCX_FLOW_GROUP_ALLMULTI, 0);
+ mcx_delete_flow_table_entry(sc, MCX_FLOW_GROUP_MAC, 0);
+ mcx_delete_flow_table_entry(sc, MCX_FLOW_GROUP_MAC, 1);
+ for (i = 0; i < MCX_NUM_MCAST_FLOWS; i++) {
+ if (sc->sc_mcast_flows[i][0] != 0) {
+ mcx_delete_flow_table_entry(sc, MCX_FLOW_GROUP_MAC,
+ sc->sc_first_mcast_flow_entry + i);
+ }
}
intr_barrier(&sc->sc_ih);