diff options
| author | 2019-06-05 04:45:42 +0000 | |
|---|---|---|
| committer | 2019-06-05 04:45:42 +0000 | |
| commit | 1eb024464112177fd0a6c02f23691997e5f959ba (patch) | |
| tree | a319b3e7d66f921fbfb6622f59d6d4136a97fcc1 | |
| parent | this can support 64BIT DVA for io (diff) | |
| download | wireguard-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.c | 24 |
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); |
