diff options
| author | knakahara <knakahara@NetBSD.org> | 2017-10-23 23:29:38 +0000 |
|---|---|---|
| committer | knakahara <knakahara@NetBSD.org> | 2017-10-23 23:29:38 +0000 |
| commit | c541d0fafe7c3e83b5a6711aa79ed133537db055 (patch) | |
| tree | a7f652debbeb511156d173766298f5fb939beb15 /sys/dev | |
| parent | 387a24e78420edd7e36c9e58f061d34062926eb6 (diff) | |
fix wm(4) vlan panic. Reported and tested by Tom Ivar Helbekkmo, thanks.
wm(4) used PRI bits and CFI bit as vlantag by mistake. It is found out
by if_ether.h:r1.67.
XXX need pullup-8
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/pci/if_wm.c | 10 | ||||
| -rw-r--r-- | sys/dev/pci/if_wmreg.h | 14 |
2 files changed, 18 insertions, 6 deletions
diff --git a/sys/dev/pci/if_wm.c b/sys/dev/pci/if_wm.c index 45461f8f8cd..8bd163bc73e 100644 --- a/sys/dev/pci/if_wm.c +++ b/sys/dev/pci/if_wm.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.541 2017/10/23 09:27:21 msaitoh Exp $ */ +/* $NetBSD: if_wm.c,v 1.542 2017/10/23 23:29:38 knakahara Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. @@ -83,7 +83,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.541 2017/10/23 09:27:21 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.542 2017/10/23 23:29:38 knakahara Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -8108,11 +8108,11 @@ wm_rxdesc_get_vlantag(struct wm_rxqueue *rxq, int idx) struct wm_softc *sc = rxq->rxq_sc; if (sc->sc_type == WM_T_82574) - return rxq->rxq_ext_descs[idx].erx_ctx.erxc_vlan; + return EXTRXC_VLAN_ID(rxq->rxq_ext_descs[idx].erx_ctx.erxc_vlan); else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) - return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_vlan; + return NQRXC_VLAN_ID(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_vlan); else - return rxq->rxq_descs[idx].wrx_special; + return WRX_VLAN_ID(rxq->rxq_descs[idx].wrx_special); } static inline int diff --git a/sys/dev/pci/if_wmreg.h b/sys/dev/pci/if_wmreg.h index c005414764c..1eb2e05390b 100644 --- a/sys/dev/pci/if_wmreg.h +++ b/sys/dev/pci/if_wmreg.h @@ -1,4 +1,4 @@ -/* $NetBSD: if_wmreg.h,v 1.103 2017/07/26 06:48:49 msaitoh Exp $ */ +/* $NetBSD: if_wmreg.h,v 1.104 2017/10/23 23:29:38 knakahara Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -208,6 +208,12 @@ typedef union ext_rxdesc { #define EXTRXC_STATUS_PKTTYPE_MASK __BITS(19,16) #define EXTRXC_STATUS_PKTTYPE(status) __SHIFTOUT(status,EXTRXC_STATUS_PKTTYPE_MASK) +#define EXTRXC_VLAN_ID_MASK __BITS(11,0) /* VLAN identifier mask */ +#define EXTRXC_VLAN_ID(x) ((x) & EXTRXC_VLAN_ID_MASK) /* VLAN identifier */ +#define EXTRXC_VLAN_CFI __BIT(12) /* Canonical Form Indicator */ +#define EXTRXC_VLAN_PRI_MASK __BITS(15,13) /* VLAN priority mask */ +#define EXTRXC_VLAN_PRI(x) __SHIFTOUT((x),EXTRXC_VLAN_PRI_MASK) /* VLAN priority */ + /* advanced RX descriptor for 82575 and newer */ typedef union nq_rxdesc { struct { @@ -330,6 +336,12 @@ typedef union nq_rxdesc { #define NQRXC_STATUS_MC __BIT(19) /* Packet received from Manageability Controller */ /* "MBC" in i350 spec */ +#define NQRXC_VLAN_ID_MASK __BITS(11,0) /* VLAN identifier mask */ +#define NQRXC_VLAN_ID(x) ((x) & NQRXC_VLAN_ID_MASK) /* VLAN identifier */ +#define NQRXC_VLAN_CFI __BIT(12) /* Canonical Form Indicator */ +#define NQRXC_VLAN_PRI_MASK __BITS(15,13) /* VLAN priority mask */ +#define NQRXC_VLAN_PRI(x) __SHIFTOUT((x),NQRXC_VLAN_PRI_MASK) /* VLAN priority */ + /* * The Wiseman transmit descriptor. * |
