Module Name: src Committed By: msaitoh Date: Fri Apr 5 07:15:26 UTC 2019
Modified Files: src/sys/dev/pci: if_bnx.c if_bnxreg.h if_bnxvar.h Log Message: - Allow time for the management firmware to enter the running state. - Enable/Disable management frames (NC-SI) to flow to the MCP if MFW exists. - Print the boot code version, management firmware version and some flags. - Gbps -> GT/s for PCIe speed. - Use aprint_*() in bnx_print_adapter_info(). - Use braces for some macors' argument. - Remove unused macros. - KNF. To generate a diff of this commit: cvs rdiff -u -r1.77 -r1.78 src/sys/dev/pci/if_bnx.c cvs rdiff -u -r1.23 -r1.24 src/sys/dev/pci/if_bnxreg.h cvs rdiff -u -r1.9 -r1.10 src/sys/dev/pci/if_bnxvar.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_bnx.c diff -u src/sys/dev/pci/if_bnx.c:1.77 src/sys/dev/pci/if_bnx.c:1.78 --- src/sys/dev/pci/if_bnx.c:1.77 Fri Apr 5 07:04:51 2019 +++ src/sys/dev/pci/if_bnx.c Fri Apr 5 07:15:26 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bnx.c,v 1.77 2019/04/05 07:04:51 msaitoh Exp $ */ +/* $NetBSD: if_bnx.c,v 1.78 2019/04/05 07:15:26 msaitoh Exp $ */ /* $OpenBSD: if_bnx.c,v 1.101 2013/03/28 17:21:44 brad Exp $ */ /*- @@ -35,7 +35,7 @@ #if 0 __FBSDID("$FreeBSD: src/sys/dev/bce/if_bce.c,v 1.3 2006/04/13 14:12:26 ru Exp $"); #endif -__KERNEL_RCSID(0, "$NetBSD: if_bnx.c,v 1.77 2019/04/05 07:04:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bnx.c,v 1.78 2019/04/05 07:15:26 msaitoh Exp $"); /* * The following controllers are supported by this driver: @@ -462,30 +462,46 @@ bnx_probe(device_t parent, cfdata_t matc static void bnx_print_adapter_info(struct bnx_softc *sc) { + device_t dev = sc->bnx_dev; + int i = 0; - aprint_normal_dev(sc->bnx_dev, "ASIC BCM%x %c%d %s(0x%08x)\n", + aprint_normal_dev(dev, "ASIC BCM%x %c%d %s(0x%08x)\n", BNXNUM(sc), 'A' + BNXREV(sc), BNXMETAL(sc), (BNX_CHIP_BOND_ID(sc) == BNX_CHIP_BOND_ID_SERDES_BIT) ? "Serdes " : "", sc->bnx_chipid); /* Bus info. */ if (sc->bnx_flags & BNX_PCIE_FLAG) { - aprint_normal_dev(sc->bnx_dev, "PCIe x%d ", - sc->link_width); + aprint_normal_dev(dev, "PCIe x%d ", sc->link_width); switch (sc->link_speed) { - case 1: aprint_normal("2.5Gbps\n"); break; - case 2: aprint_normal("5Gbps\n"); break; + case 1: aprint_normal("2.5GT/s\n"); break; + case 2: aprint_normal("5GT/s\n"); break; default: aprint_normal("Unknown link speed\n"); } } else { - aprint_normal_dev(sc->bnx_dev, "PCI%s %dbit %dMHz\n", + aprint_normal_dev(dev, "PCI%s %dbit %dMHz\n", ((sc->bnx_flags & BNX_PCIX_FLAG) ? "-X" : ""), (sc->bnx_flags & BNX_PCI_32BIT_FLAG) ? 32 : 64, sc->bus_speed_mhz); } - aprint_normal_dev(sc->bnx_dev, - "Coal (RX:%d,%d,%d,%d; TX:%d,%d,%d,%d)\n", + /* Firmware version and device features. */ + aprint_normal_dev(dev, "B/C (%s); Bufs (RX:%d;TX:%d); Flags (", + sc->bnx_bc_ver, RX_PAGES, TX_PAGES); + + if (sc->bnx_phy_flags & BNX_PHY_2_5G_CAPABLE_FLAG) { + if (i > 0) aprint_normal("|"); + aprint_normal("2.5G"); i++; + } + + if (sc->bnx_flags & BNX_MFW_ENABLE_FLAG) { + if (i > 0) aprint_normal("|"); + aprint_normal("MFW); MFW (%s)\n", sc->bnx_mfw_ver); + } else { + aprint_normal(")\n"); + } + + aprint_normal_dev(dev, "Coal (RX:%d,%d,%d,%d; TX:%d,%d,%d,%d)\n", sc->bnx_rx_quick_cons_trip_int, sc->bnx_rx_quick_cons_trip, sc->bnx_rx_ticks_int, @@ -569,6 +585,7 @@ bnx_attach(device_t parent, device_t sel int mii_flags = MIIF_FORCEANEG; pcireg_t memtype; char intrbuf[PCI_INTRSTR_LEN]; + int i, j; if (bnx_tx_pool == NULL) { bnx_tx_pool = malloc(sizeof(*bnx_tx_pool), M_DEVBUF, M_NOWAIT); @@ -650,6 +667,64 @@ bnx_attach(device_t parent, device_t sel sc->bnx_flags = 0; sc->bnx_phy_flags = 0; + /* Fetch the bootcode revision. */ + val = REG_RD_IND(sc, sc->bnx_shmem_base + BNX_DEV_INFO_BC_REV); + for (i = 0, j = 0; i < 3; i++) { + uint8_t num; + int k, skip0; + + num = (uint8_t)(val >> (24 - (i * 8))); + for (k = 100, skip0 = 1; k >= 1; num %= k, k /= 10) { + if (num >= k || !skip0 || k == 1) { + sc->bnx_bc_ver[j++] = (num / k) + '0'; + skip0 = 0; + } + } + if (i != 2) + sc->bnx_bc_ver[j++] = '.'; + } + + /* Check if any management firmware is enabled. */ + val = REG_RD_IND(sc, sc->bnx_shmem_base + BNX_PORT_FEATURE); + if (val & BNX_PORT_FEATURE_ASF_ENABLED) { + DBPRINT(sc, BNX_INFO, "Management F/W Enabled.\n"); + sc->bnx_flags |= BNX_MFW_ENABLE_FLAG; + + /* Allow time for firmware to enter the running state. */ + for (i = 0; i < 30; i++) { + val = REG_RD_IND(sc, sc->bnx_shmem_base + + BNX_BC_STATE_CONDITION); + if (val & BNX_CONDITION_MFW_RUN_MASK) + break; + DELAY(10000); + } + + /* Check if management firmware is running. */ + val = REG_RD_IND(sc, sc->bnx_shmem_base + + BNX_BC_STATE_CONDITION); + val &= BNX_CONDITION_MFW_RUN_MASK; + if ((val != BNX_CONDITION_MFW_RUN_UNKNOWN) && + (val != BNX_CONDITION_MFW_RUN_NONE)) { + uint32_t addr = REG_RD_IND(sc, sc->bnx_shmem_base + + BNX_MFW_VER_PTR); + + /* Read the management firmware version string. */ + for (j = 0; j < 3; j++) { + val = bnx_reg_rd_ind(sc, addr + j * 4); + val = bswap32(val); + memcpy(&sc->bnx_mfw_ver[i], &val, 4); + i += 4; + } + } else { + /* May cause firmware synchronization timeouts. */ + BNX_PRINTF(sc, "%s(%d): Management firmware enabled " + "but not running!\n", __FILE__, __LINE__); + strcpy(sc->bnx_mfw_ver, "NOT RUNNING!"); + + /* ToDo: Any action the driver should take? */ + } + } + bnx_probe_pci_caps(sc); /* Get PCI bus information (speed and type). */ @@ -1548,7 +1623,7 @@ bnx_nvram_read_dword(struct bnx_softc *s if (val & BNX_NVM_COMMAND_DONE) { val = REG_RD(sc, BNX_NVM_READ); - val = bnx_be32toh(val); + val = be32toh(val); memcpy(ret_val, &val, 4); break; } @@ -2059,7 +2134,7 @@ bnx_nvram_test(struct bnx_softc *sc) if ((rc = bnx_nvram_read(sc, 0, data, 4)) != 0) goto bnx_nvram_test_done; - magic = bnx_be32toh(buf[0]); + magic = be32toh(buf[0]); if (magic != BNX_NVRAM_MAGIC) { rc = ENODEV; BNX_PRINTF(sc, "%s(%d): Invalid NVRAM magic value! " @@ -2841,7 +2916,7 @@ bnx_init_cpus(struct bnx_softc *sc) struct cpu_reg cpu_reg; struct fw_info fw; - switch(BNX_CHIP_NUM(sc)) { + switch (BNX_CHIP_NUM(sc)) { case BNX_CHIP_NUM_5709: /* Initialize the RV2P processor. */ if (BNX_CHIP_REV(sc) == BNX_CHIP_REV_Ax) { @@ -3600,6 +3675,13 @@ bnx_chipinit(struct bnx_softc *sc) /* Initialize the on-boards CPUs */ bnx_init_cpus(sc); + /* Enable management frames (NC-SI) to flow to the MCP. */ + if (sc->bnx_flags & BNX_MFW_ENABLE_FLAG) { + val = REG_RD(sc, BNX_RPM_MGMT_PKT_CTRL) | + BNX_RPM_MGMT_PKT_CTRL_MGMT_EN; + REG_WR(sc, BNX_RPM_MGMT_PKT_CTRL, val); + } + /* Prepare NVRAM for access. */ if (bnx_init_nvram(sc)) { rc = ENODEV; @@ -3725,19 +3807,6 @@ bnx_blockinit(struct bnx_softc *sc) goto bnx_blockinit_exit; } - /* Check if any management firmware is running. */ - reg = REG_RD_IND(sc, sc->bnx_shmem_base + BNX_PORT_FEATURE); - if (reg & (BNX_PORT_FEATURE_ASF_ENABLED | - BNX_PORT_FEATURE_IMD_ENABLED)) { - DBPRINT(sc, BNX_INFO, "Management F/W Enabled.\n"); - sc->bnx_flags |= BNX_MFW_ENABLE_FLAG; - } - - sc->bnx_fw_ver = REG_RD_IND(sc, sc->bnx_shmem_base + - BNX_DEV_INFO_BC_REV); - - DBPRINT(sc, BNX_INFO, "bootcode rev = 0x%08X\n", sc->bnx_fw_ver); - /* Enable DMA */ if (BNX_CHIP_NUM(sc) == BNX_CHIP_NUM_5709) { val = REG_RD(sc, BNX_MISC_NEW_CORE_CTL); @@ -3748,6 +3817,13 @@ bnx_blockinit(struct bnx_softc *sc) /* Allow bootcode to apply any additional fixes before enabling MAC. */ rc = bnx_fw_sync(sc, BNX_DRV_MSG_DATA_WAIT2 | BNX_DRV_MSG_CODE_RESET); + /* Disable management frames (NC-SI) from flowing to the MCP. */ + if (sc->bnx_flags & BNX_MFW_ENABLE_FLAG) { + val = REG_RD(sc, BNX_RPM_MGMT_PKT_CTRL) & + ~BNX_RPM_MGMT_PKT_CTRL_MGMT_EN; + REG_WR(sc, BNX_RPM_MGMT_PKT_CTRL, val); + } + /* Enable all remaining blocks in the MAC. */ if (BNX_CHIP_NUM(sc) == BNX_CHIP_NUM_5709) { REG_WR(sc, BNX_MISC_ENABLE_SET_BITS, Index: src/sys/dev/pci/if_bnxreg.h diff -u src/sys/dev/pci/if_bnxreg.h:1.23 src/sys/dev/pci/if_bnxreg.h:1.24 --- src/sys/dev/pci/if_bnxreg.h:1.23 Thu Apr 4 12:38:27 2019 +++ src/sys/dev/pci/if_bnxreg.h Fri Apr 5 07:15:26 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bnxreg.h,v 1.23 2019/04/04 12:38:27 msaitoh Exp $ */ +/* $NetBSD: if_bnxreg.h,v 1.24 2019/04/05 07:15:26 msaitoh Exp $ */ /* $OpenBSD: if_bnxreg.h,v 1.33 2009/09/05 16:02:28 claudio Exp $ */ /*- @@ -118,17 +118,17 @@ #define BNX_VERBOSE (BNX_CP_ALL | BNX_LEVEL_VERBOSE) #define BNX_EXCESSIVE (BNX_CP_ALL | BNX_LEVEL_EXCESSIVE) -#define BNX_CODE_PATH(cp) ((cp & BNX_CP_MASK) & bnx_debug) +#define BNX_CODE_PATH(cp) (((cp) & BNX_CP_MASK) & bnx_debug) #define BNX_MSG_LEVEL(lv) \ - ((lv & BNX_LEVEL_MASK) <= (bnx_debug & BNX_LEVEL_MASK)) + (((lv) & BNX_LEVEL_MASK) <= (bnx_debug & BNX_LEVEL_MASK)) #define BNX_LOG_MSG(m) (BNX_CODE_PATH(m) && BNX_MSG_LEVEL(m)) #ifdef BNX_DEBUG /* Print a message based on the logging level and code path. */ -#define DBPRINT(sc, level, format, args...) \ - if (BNX_LOG_MSG(level)) { \ - aprint_debug_dev(sc->bnx_dev, format, ## args); \ +#define DBPRINT(sc, level, format, args...) \ + if (BNX_LOG_MSG(level)) { \ + aprint_debug_dev((sc)->bnx_dev, format, ## args); \ } /* Runs a particular command based on the logging level and code path. */ @@ -160,14 +160,14 @@ #endif /* Returns FALSE in "defects" per 2^31 - 1 calls, otherwise returns TRUE. */ -#define DB_RANDOMFALSE(defects) (random() > defects) -#define DB_OR_RANDOMFALSE(defects) || (random() > defects) -#define DB_AND_RANDOMFALSE(defects) && (random() > defects) +#define DB_RANDOMFALSE(defects) (random() > (defects)) +#define DB_OR_RANDOMFALSE(defects) || (random() > (defects)) +#define DB_AND_RANDOMFALSE(defects) && (random() > (defects)) /* Returns TRUE in "defects" per 2^31 - 1 calls, otherwise returns FALSE. */ -#define DB_RANDOMTRUE(defects) (random() < defects) -#define DB_OR_RANDOMTRUE(defects) || (random() < defects) -#define DB_AND_RANDOMTRUE(defects) && (random() < defects) +#define DB_RANDOMTRUE(defects) (random() < (defects)) +#define DB_OR_RANDOMTRUE(defects) || (random() < (defects)) +#define DB_AND_RANDOMTRUE(defects) && (random() < (defects)) #else @@ -256,25 +256,6 @@ struct bnx_type { }; /****************************************************************************/ -/* Byte order conversions. */ -/****************************************************************************/ -#define betoh32(x) be32toh(x) -#define bnx_htobe16(x) htobe16(x) -#define bnx_htobe32(x) htobe32(x) -#define bnx_htobe64(x) htobe64(x) -#define bnx_htole16(x) htole16(x) -#define bnx_htole32(x) htole32(x) -#define bnx_htole64(x) htole64(x) - -#define bnx_be16toh(x) betoh16(x) -#define bnx_be32toh(x) betoh32(x) -#define bnx_be64toh(x) betoh64(x) -#define bnx_le16toh(x) letoh16(x) -#define bnx_le32toh(x) letoh32(x) -#define bnx_le64toh(x) letoh64(x) - - -/****************************************************************************/ /* NVRAM Access */ /****************************************************************************/ @@ -592,6 +573,8 @@ struct flash_spec { #define BNX_PORT_FEATURE_MBA_VLAN_TAG_MASK 0xffff #define BNX_PORT_FEATURE_MBA_VLAN_ENABLE 0x10000 +#define BNX_MFW_VER_PTR 0x00000014c + #define BNX_BC_STATE_RESET_TYPE 0x000001c0 #define BNX_BC_STATE_RESET_TYPE_SIG 0x00005254 #define BNX_BC_STATE_RESET_TYPE_SIG_MASK 0x0000ffff @@ -645,6 +628,39 @@ struct flash_spec { #define BNX_BC_STATE_ERR_NO_RXP (BNX_BC_STATE_SIGN | 0x0600) #define BNX_BC_STATE_ERR_TOO_MANY_RBUF (BNX_BC_STATE_SIGN | 0x0700) +#define BNX_BC_STATE_CONDITION 0x000001c8 +#define BNX_CONDITION_INIT_POR 0x00000001 +#define BNX_CONDITION_INIT_VAUX_AVAIL 0x00000002 +#define BNX_CONDITION_INIT_PCI_AVAIL 0x00000004 +#define BNX_CONDITION_INIT_PCI_RESET 0x00000008 +#define BNX_CONDITION_INIT_HD_RESET 0x00000010 /* 5709/16 only */ +#define BNX_CONDITION_DRV_PRESENT 0x00000100 +#define BNX_CONDITION_LOW_POWER_LINK 0x00000200 +#define BNX_CONDITION_CORE_RST_OCCURRED 0x00000400 /* 5709/16 only */ +#define BNX_CONDITION_UNUSED 0x00000800 +#define BNX_CONDITION_BUSY_EXPROM 0x00001000 /* 5706/08 only */ + +#define BNX_CONDITION_MFW_RUN_UNKNOWN 0x00000000 +#define BNX_CONDITION_MFW_RUN_IPMI 0x00002000 +#define BNX_CONDITION_MFW_RUN_UMP 0x00004000 +#define BNX_CONDITION_MFW_RUN_NCSI 0x00006000 +#define BNX_CONDITION_MFW_RUN_NONE 0x0000e000 +#define BNX_CONDITION_MFW_RUN_MASK 0x0000e000 + +/* 5709/16 only */ +#define BNX_CONDITION_PM_STATE_MASK 0x00030000 +#define BNX_CONDITION_PM_STATE_FULL 0x00030000 +#define BNX_CONDITION_PM_STATE_PREP 0x00020000 +#define BNX_CONDITION_PM_STATE_UNPREP 0x00010000 +#define BNX_CONDITION_PM_RESERVED 0x00000000 + +/* 5709/16 only */ +#define BNX_CONDITION_RXMODE_KEEP_VLAN 0x00040000 +#define BNX_CONDITION_DRV_WOL_ENABLED 0x00080000 +#define BNX_CONDITION_PORT_DISABLED 0x00100000 +#define BNX_CONDITION_DRV_MAYBE_OUT 0x00200000 +#define BNX_CONDITION_DPFW_DEAD 0x00400000 + #define BNX_BC_STATE_DEBUG_CMD 0x1dc #define BNX_BC_STATE_BC_DBG_CMD_SIGNATURE 0x42440000 #define BNX_BC_STATE_BC_DBG_CMD_SIGNATURE_MASK 0xffff0000 @@ -656,7 +672,8 @@ struct flash_spec { /****************************************************************************/ /* Convenience definitions. */ /****************************************************************************/ -#define BNX_PRINTF(sc, fmt, ...) aprint_error_dev(sc->bnx_dev, fmt, __VA_ARGS__) +#define BNX_PRINTF(sc, fmt, ...) \ + aprint_error_dev((sc)->bnx_dev, fmt, __VA_ARGS__) #define BNX_STATS(x) (u_long) stats->stat_ ## x ## _lo /* @@ -1727,6 +1744,8 @@ struct l2_fhdr { #define BNX_MISC_FINAL_CLK_CTL_VAL 0x000008b8 #define BNX_MISC_FINAL_CLK_CTL_VAL_MISC_FINAL_CLK_CTL_VAL (0x3ffffffL<<6) +#define BNX_MISC_UNUSED0 0x000008bc + #define BNX_MISC_NEW_CORE_CTL 0x000008c8 #define BNX_MISC_NEW_CORE_CTL_LINK_HOLDOFF_SUCCESS (1L<<0) #define BNX_MISC_NEW_CORE_CTL_LINK_HOLDOFF_REQ (1L<<1) @@ -1759,8 +1778,6 @@ struct l2_fhdr { #define BNX_MISC_DUAL_MEDIA_CTRL_PHY_SERDES_IDDQ_PHY1_IDDQ (4L<<26) #define BNX_MISC_DUAL_MEDIA_CTRL_PHY_SERDES_IDDQ_PHY0_IDDQ (8L<<26) -#define BNX_MISC_UNUSED0 0x000008bc - /* * nvm_reg definition @@ -2701,6 +2718,10 @@ struct l2_fhdr { #define BNX_RPM_CONFIG_SORT_VECT_VAL (0xfL<<4) #define BNX_RPM_CONFIG_IGNORE_VLAN (1L<<31) +#define BNX_RPM_MGMT_PKT_CTRL 0x0000180c +#define BNX_RPM_MGMT_PKT_CTRL_MGMT_DISCARD_EN (1L<<30) +#define BNX_RPM_MGMT_PKT_CTRL_MGMT_EN (1L<<31) + #define BNX_RPM_VLAN_MATCH0 0x00001810 #define BNX_RPM_VLAN_MATCH0_RPM_VLAN_MTCH0_VALUE (0xfffL<<0) @@ -4699,8 +4720,8 @@ struct bnx_rv2p_header { #define RV2P_PROC1 0 #define RV2P_PROC2 1 -#define BNX_MIREG(x) ((x & 0x1F) << 16) -#define BNX_MIPHY(x) ((x & 0x1F) << 21) +#define BNX_MIREG(x) (((x) & 0x1F) << 16) +#define BNX_MIPHY(x) (((x) & 0x1F) << 21) #define BNX_PHY_TIMEOUT 50 #define BNX_NVRAM_SIZE 0x200 Index: src/sys/dev/pci/if_bnxvar.h diff -u src/sys/dev/pci/if_bnxvar.h:1.9 src/sys/dev/pci/if_bnxvar.h:1.10 --- src/sys/dev/pci/if_bnxvar.h:1.9 Fri Mar 29 06:31:54 2019 +++ src/sys/dev/pci/if_bnxvar.h Fri Apr 5 07:15:26 2019 @@ -160,7 +160,10 @@ struct bnx_softc char * bnx_name; /* Name string */ /* Tracks the version of bootcode firmware. */ - uint32_t bnx_fw_ver; + char bnx_bc_ver[32]; + + /* Tracks the version of management firmware. */ + char bnx_mfw_ver[32]; /* Tracks the state of the firmware. 0 = Running while any */ /* other value indicates that the firmware is not responding. */