Module Name: src Committed By: msaitoh Date: Mon Jun 26 04:09:02 UTC 2017
Modified Files: src/sys/dev/pci: if_wm.c if_wmreg.h Log Message: - Fix wm_set_ral(): - Fix a bug that a RAL was written at incorrect address when the index number is more than 16 on 82544 and newer. - The layout of RAL on PCH* are different from others. - Remove wrong comment. To generate a diff of this commit: cvs rdiff -u -r1.513 -r1.514 src/sys/dev/pci/if_wm.c cvs rdiff -u -r1.98 -r1.99 src/sys/dev/pci/if_wmreg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_wm.c diff -u src/sys/dev/pci/if_wm.c:1.513 src/sys/dev/pci/if_wm.c:1.514 --- src/sys/dev/pci/if_wm.c:1.513 Mon Jun 26 04:03:34 2017 +++ src/sys/dev/pci/if_wm.c Mon Jun 26 04:09:02 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.513 2017/06/26 04:03:34 msaitoh Exp $ */ +/* $NetBSD: if_wm.c,v 1.514 2017/06/26 04:09:02 msaitoh Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. @@ -84,7 +84,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.513 2017/06/26 04:03:34 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.514 2017/06/26 04:09:02 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -3206,7 +3206,9 @@ wm_read_mac_addr(struct wm_softc *sc, ui static void wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx) { - uint32_t ral_lo, ral_hi; + uint32_t ral_lo, ral_hi, addrl, addrh; + uint32_t wlock_mac; + int rv; if (enaddr != NULL) { ral_lo = enaddr[0] | (enaddr[1] << 8) | (enaddr[2] << 16) | @@ -3218,14 +3220,54 @@ wm_set_ral(struct wm_softc *sc, const ui ral_hi = 0; } - if (sc->sc_type >= WM_T_82544) { - CSR_WRITE(sc, WMREG_RAL_LO(WMREG_CORDOVA_RAL_BASE, idx), - ral_lo); - CSR_WRITE(sc, WMREG_RAL_HI(WMREG_CORDOVA_RAL_BASE, idx), - ral_hi); - } else { - CSR_WRITE(sc, WMREG_RAL_LO(WMREG_RAL_BASE, idx), ral_lo); - CSR_WRITE(sc, WMREG_RAL_HI(WMREG_RAL_BASE, idx), ral_hi); + switch (sc->sc_type) { + case WM_T_82542_2_0: + case WM_T_82542_2_1: + case WM_T_82543: + CSR_WRITE(sc, WMREG_RAL(idx), ral_lo); + CSR_WRITE_FLUSH(sc); + CSR_WRITE(sc, WMREG_RAH(idx), ral_hi); + CSR_WRITE_FLUSH(sc); + break; + case WM_T_PCH2: + case WM_T_PCH_LPT: + case WM_T_PCH_SPT: + if (idx == 0) { + CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo); + CSR_WRITE_FLUSH(sc); + CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi); + CSR_WRITE_FLUSH(sc); + return; + } + if (sc->sc_type != WM_T_PCH2) { + wlock_mac = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM), + FWSM_WLOCK_MAC); + addrl = WMREG_SHRAL(idx - 1); + addrh = WMREG_SHRAH(idx - 1); + } else { + wlock_mac = 0; + addrl = WMREG_PCH_LPT_SHRAL(idx - 1); + addrh = WMREG_PCH_LPT_SHRAH(idx - 1); + } + + if ((wlock_mac == 0) || (idx <= wlock_mac)) { + rv = wm_get_swflag_ich8lan(sc); + if (rv != 0) + return; + CSR_WRITE(sc, addrl, ral_lo); + CSR_WRITE_FLUSH(sc); + CSR_WRITE(sc, addrh, ral_hi); + CSR_WRITE_FLUSH(sc); + wm_put_swflag_ich8lan(sc); + } + + break; + default: + CSR_WRITE(sc, WMREG_CORDOVA_RAL(idx), ral_lo); + CSR_WRITE_FLUSH(sc); + CSR_WRITE(sc, WMREG_CORDOVA_RAH(idx), ral_hi); + CSR_WRITE_FLUSH(sc); + break; } } Index: src/sys/dev/pci/if_wmreg.h diff -u src/sys/dev/pci/if_wmreg.h:1.98 src/sys/dev/pci/if_wmreg.h:1.99 --- src/sys/dev/pci/if_wmreg.h:1.98 Tue Feb 28 09:55:47 2017 +++ src/sys/dev/pci/if_wmreg.h Mon Jun 26 04:09:02 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wmreg.h,v 1.98 2017/02/28 09:55:47 knakahara Exp $ */ +/* $NetBSD: if_wmreg.h,v 1.99 2017/06/26 04:09:02 msaitoh Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -636,8 +636,15 @@ struct livengood_tcpip_ctxdesc { #define FEXTNVM3_PHY_CFG_COUNTER_MASK __BITS(27, 26) #define FEXTNVM3_PHY_CFG_COUNTER_50MS __BIT(27) -#define WMREG_RAL_BASE 0x0040 /* Receive Address List */ -#define WMREG_CORDOVA_RAL_BASE 0x5400 +#define WMREG_RAL(x) (0x0040 + ((x) * 8)) /* Receive Address List */ +#define WMREG_RAH(x) (WMREG_RAL(x) + 4) +#define WMREG_CORDOVA_RAL(x) (((x) <= 15) ? (0x5400 + ((x) * 8)) : \ + (0x54e0 + (((x) - 16) * 8))) +#define WMREG_CORDOVA_RAH(x) (WMREG_CORDOVA_RAL(x) + 4) +#define WMREG_SHRAL(x) (0x5438 + ((x) * 8)) +#define WMREG_SHRAH(x) (WMREG_PCH_LPT_SHRAL(x) + 4) +#define WMREG_PCH_LPT_SHRAL(x) (0x5408 + ((x) * 8)) +#define WMREG_PCH_LPT_SHRAH(x) (WMREG_PCH_LPT_SHRAL(x) + 4) #define WMREG_RAL_LO(b, x) ((b) + ((x) << 3)) #define WMREG_RAL_HI(b, x) (WMREG_RAL_LO(b, x) + 4) /* @@ -1276,7 +1283,7 @@ struct livengood_tcpip_ctxdesc { #define MNG_ICH_IAMT_MODE 0x2 /* PT mode? */ #define MNG_IAMT_MODE 0x3 #define FWSM_RSPCIPHY __BIT(6) /* Reset PHY on PCI reset */ -#define FWSM_WLOCK_MAC __BITS(7, 9) /* Reset PHY on PCI reset */ +#define FWSM_WLOCK_MAC __BITS(7, 9) #define FWSM_ULP_CFG_DONE __BIT(10) #define FWSM_FW_VALID __BIT(15) /* FW established a valid mode */