1 /* Copyright 2008-2009 Broadcom Corporation
3 * Unless you and Broadcom execute a separate written software license
4 * agreement governing use of this software, this software is licensed to you
5 * under the terms of the GNU General Public License version 2, available
6 * at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html (the "GPL").
8 * Notwithstanding the above, under no circumstances may you combine this
9 * software in any way with any other Broadcom software provided under a
10 * license other than the GPL, without Broadcom's express prior written
13 * Written by Yaniv Rosner
17 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19 #include <linux/kernel.h>
20 #include <linux/errno.h>
21 #include <linux/pci.h>
22 #include <linux/netdevice.h>
23 #include <linux/delay.h>
24 #include <linux/ethtool.h>
25 #include <linux/mutex.h>
29 /********************************************************/
31 #define ETH_OVREHEAD (ETH_HLEN + 8)/* 8 for CRC + VLAN*/
32 #define ETH_MIN_PACKET_SIZE 60
33 #define ETH_MAX_PACKET_SIZE 1500
34 #define ETH_MAX_JUMBO_PACKET_SIZE 9600
35 #define MDIO_ACCESS_TIMEOUT 1000
36 #define BMAC_CONTROL_RX_ENABLE 2
38 /***********************************************************/
39 /* Shortcut definitions */
40 /***********************************************************/
42 #define NIG_LATCH_BC_ENABLE_MI_INT 0
44 #define NIG_STATUS_EMAC0_MI_INT \
45 NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_MI_INT
46 #define NIG_STATUS_XGXS0_LINK10G \
47 NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK10G
48 #define NIG_STATUS_XGXS0_LINK_STATUS \
49 NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK_STATUS
50 #define NIG_STATUS_XGXS0_LINK_STATUS_SIZE \
51 NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK_STATUS_SIZE
52 #define NIG_STATUS_SERDES0_LINK_STATUS \
53 NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_LINK_STATUS
54 #define NIG_MASK_MI_INT \
55 NIG_MASK_INTERRUPT_PORT0_REG_MASK_EMAC0_MISC_MI_INT
56 #define NIG_MASK_XGXS0_LINK10G \
57 NIG_MASK_INTERRUPT_PORT0_REG_MASK_XGXS0_LINK10G
58 #define NIG_MASK_XGXS0_LINK_STATUS \
59 NIG_MASK_INTERRUPT_PORT0_REG_MASK_XGXS0_LINK_STATUS
60 #define NIG_MASK_SERDES0_LINK_STATUS \
61 NIG_MASK_INTERRUPT_PORT0_REG_MASK_SERDES0_LINK_STATUS
63 #define MDIO_AN_CL73_OR_37_COMPLETE \
64 (MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_AUTONEG_COMPLETE | \
65 MDIO_GP_STATUS_TOP_AN_STATUS1_CL37_AUTONEG_COMPLETE)
67 #define XGXS_RESET_BITS \
68 (MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_RSTB_HW | \
69 MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_IDDQ | \
70 MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_PWRDWN | \
71 MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_PWRDWN_SD | \
72 MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_TXD_FIFO_RSTB)
74 #define SERDES_RESET_BITS \
75 (MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_RSTB_HW | \
76 MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_IDDQ | \
77 MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_PWRDWN | \
78 MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_PWRDWN_SD)
80 #define AUTONEG_CL37 SHARED_HW_CFG_AN_ENABLE_CL37
81 #define AUTONEG_CL73 SHARED_HW_CFG_AN_ENABLE_CL73
82 #define AUTONEG_BAM SHARED_HW_CFG_AN_ENABLE_BAM
83 #define AUTONEG_PARALLEL \
84 SHARED_HW_CFG_AN_ENABLE_PARALLEL_DETECTION
85 #define AUTONEG_SGMII_FIBER_AUTODET \
86 SHARED_HW_CFG_AN_EN_SGMII_FIBER_AUTO_DETECT
87 #define AUTONEG_REMOTE_PHY SHARED_HW_CFG_AN_ENABLE_REMOTE_PHY
89 #define GP_STATUS_PAUSE_RSOLUTION_TXSIDE \
90 MDIO_GP_STATUS_TOP_AN_STATUS1_PAUSE_RSOLUTION_TXSIDE
91 #define GP_STATUS_PAUSE_RSOLUTION_RXSIDE \
92 MDIO_GP_STATUS_TOP_AN_STATUS1_PAUSE_RSOLUTION_RXSIDE
93 #define GP_STATUS_SPEED_MASK \
94 MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_MASK
95 #define GP_STATUS_10M MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10M
96 #define GP_STATUS_100M MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_100M
97 #define GP_STATUS_1G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_1G
98 #define GP_STATUS_2_5G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_2_5G
99 #define GP_STATUS_5G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_5G
100 #define GP_STATUS_6G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_6G
101 #define GP_STATUS_10G_HIG \
102 MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_HIG
103 #define GP_STATUS_10G_CX4 \
104 MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_CX4
105 #define GP_STATUS_12G_HIG \
106 MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_12G_HIG
107 #define GP_STATUS_12_5G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_12_5G
108 #define GP_STATUS_13G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_13G
109 #define GP_STATUS_15G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_15G
110 #define GP_STATUS_16G MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_16G
111 #define GP_STATUS_1G_KX MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_1G_KX
112 #define GP_STATUS_10G_KX4 \
113 MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_KX4
115 #define LINK_10THD LINK_STATUS_SPEED_AND_DUPLEX_10THD
116 #define LINK_10TFD LINK_STATUS_SPEED_AND_DUPLEX_10TFD
117 #define LINK_100TXHD LINK_STATUS_SPEED_AND_DUPLEX_100TXHD
118 #define LINK_100T4 LINK_STATUS_SPEED_AND_DUPLEX_100T4
119 #define LINK_100TXFD LINK_STATUS_SPEED_AND_DUPLEX_100TXFD
120 #define LINK_1000THD LINK_STATUS_SPEED_AND_DUPLEX_1000THD
121 #define LINK_1000TFD LINK_STATUS_SPEED_AND_DUPLEX_1000TFD
122 #define LINK_1000XFD LINK_STATUS_SPEED_AND_DUPLEX_1000XFD
123 #define LINK_2500THD LINK_STATUS_SPEED_AND_DUPLEX_2500THD
124 #define LINK_2500TFD LINK_STATUS_SPEED_AND_DUPLEX_2500TFD
125 #define LINK_2500XFD LINK_STATUS_SPEED_AND_DUPLEX_2500XFD
126 #define LINK_10GTFD LINK_STATUS_SPEED_AND_DUPLEX_10GTFD
127 #define LINK_10GXFD LINK_STATUS_SPEED_AND_DUPLEX_10GXFD
128 #define LINK_12GTFD LINK_STATUS_SPEED_AND_DUPLEX_12GTFD
129 #define LINK_12GXFD LINK_STATUS_SPEED_AND_DUPLEX_12GXFD
130 #define LINK_12_5GTFD LINK_STATUS_SPEED_AND_DUPLEX_12_5GTFD
131 #define LINK_12_5GXFD LINK_STATUS_SPEED_AND_DUPLEX_12_5GXFD
132 #define LINK_13GTFD LINK_STATUS_SPEED_AND_DUPLEX_13GTFD
133 #define LINK_13GXFD LINK_STATUS_SPEED_AND_DUPLEX_13GXFD
134 #define LINK_15GTFD LINK_STATUS_SPEED_AND_DUPLEX_15GTFD
135 #define LINK_15GXFD LINK_STATUS_SPEED_AND_DUPLEX_15GXFD
136 #define LINK_16GTFD LINK_STATUS_SPEED_AND_DUPLEX_16GTFD
137 #define LINK_16GXFD LINK_STATUS_SPEED_AND_DUPLEX_16GXFD
139 #define PHY_XGXS_FLAG 0x1
140 #define PHY_SGMII_FLAG 0x2
141 #define PHY_SERDES_FLAG 0x4
144 #define SFP_EEPROM_CON_TYPE_ADDR 0x2
145 #define SFP_EEPROM_CON_TYPE_VAL_LC 0x7
146 #define SFP_EEPROM_CON_TYPE_VAL_COPPER 0x21
149 #define SFP_EEPROM_COMP_CODE_ADDR 0x3
150 #define SFP_EEPROM_COMP_CODE_SR_MASK (1<<4)
151 #define SFP_EEPROM_COMP_CODE_LR_MASK (1<<5)
152 #define SFP_EEPROM_COMP_CODE_LRM_MASK (1<<6)
154 #define SFP_EEPROM_FC_TX_TECH_ADDR 0x8
155 #define SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE 0x4
156 #define SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_ACTIVE 0x8
158 #define SFP_EEPROM_OPTIONS_ADDR 0x40
159 #define SFP_EEPROM_OPTIONS_LINEAR_RX_OUT_MASK 0x1
160 #define SFP_EEPROM_OPTIONS_SIZE 2
162 #define EDC_MODE_LINEAR 0x0022
163 #define EDC_MODE_LIMITING 0x0044
164 #define EDC_MODE_PASSIVE_DAC 0x0055
168 /**********************************************************/
170 /**********************************************************/
172 #define CL45_WR_OVER_CL22(_bp, _phy, _bank, _addr, _val) \
173 bnx2x_cl45_write(_bp, _phy, \
174 (_phy)->def_md_devad, \
175 (_bank + (_addr & 0xf)), \
178 #define CL45_RD_OVER_CL22(_bp, _phy, _bank, _addr, _val) \
179 bnx2x_cl45_read(_bp, _phy, \
180 (_phy)->def_md_devad, \
181 (_bank + (_addr & 0xf)), \
184 static u32 bnx2x_bits_en(struct bnx2x *bp, u32 reg, u32 bits)
186 u32 val = REG_RD(bp, reg);
189 REG_WR(bp, reg, val);
193 static u32 bnx2x_bits_dis(struct bnx2x *bp, u32 reg, u32 bits)
195 u32 val = REG_RD(bp, reg);
198 REG_WR(bp, reg, val);
202 static void bnx2x_emac_init(struct link_params *params,
203 struct link_vars *vars)
205 /* reset and unreset the emac core */
206 struct bnx2x *bp = params->bp;
207 u8 port = params->port;
208 u32 emac_base = port ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
212 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
213 (MISC_REGISTERS_RESET_REG_2_RST_EMAC0_HARD_CORE << port));
215 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
216 (MISC_REGISTERS_RESET_REG_2_RST_EMAC0_HARD_CORE << port));
218 /* init emac - use read-modify-write */
219 /* self clear reset */
220 val = REG_RD(bp, emac_base + EMAC_REG_EMAC_MODE);
221 EMAC_WR(bp, EMAC_REG_EMAC_MODE, (val | EMAC_MODE_RESET));
225 val = REG_RD(bp, emac_base + EMAC_REG_EMAC_MODE);
226 DP(NETIF_MSG_LINK, "EMAC reset reg is %u\n", val);
228 DP(NETIF_MSG_LINK, "EMAC timeout!\n");
232 } while (val & EMAC_MODE_RESET);
234 /* Set mac address */
235 val = ((params->mac_addr[0] << 8) |
236 params->mac_addr[1]);
237 EMAC_WR(bp, EMAC_REG_EMAC_MAC_MATCH, val);
239 val = ((params->mac_addr[2] << 24) |
240 (params->mac_addr[3] << 16) |
241 (params->mac_addr[4] << 8) |
242 params->mac_addr[5]);
243 EMAC_WR(bp, EMAC_REG_EMAC_MAC_MATCH + 4, val);
246 static u8 bnx2x_emac_enable(struct link_params *params,
247 struct link_vars *vars, u8 lb)
249 struct bnx2x *bp = params->bp;
250 u8 port = params->port;
251 u32 emac_base = port ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
254 DP(NETIF_MSG_LINK, "enabling EMAC\n");
256 /* enable emac and not bmac */
257 REG_WR(bp, NIG_REG_EGRESS_EMAC0_PORT + port*4, 1);
260 if (CHIP_REV_IS_EMUL(bp)) {
261 /* Use lane 1 (of lanes 0-3) */
262 REG_WR(bp, NIG_REG_XGXS_LANE_SEL_P0 + port*4, 1);
263 REG_WR(bp, NIG_REG_XGXS_SERDES0_MODE_SEL +
269 if (CHIP_REV_IS_FPGA(bp)) {
270 /* Use lane 1 (of lanes 0-3) */
271 DP(NETIF_MSG_LINK, "bnx2x_emac_enable: Setting FPGA\n");
273 REG_WR(bp, NIG_REG_XGXS_LANE_SEL_P0 + port*4, 1);
274 REG_WR(bp, NIG_REG_XGXS_SERDES0_MODE_SEL + port*4,
278 if (vars->phy_flags & PHY_XGXS_FLAG) {
279 u32 ser_lane = ((params->lane_config &
280 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_MASK) >>
281 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_SHIFT);
283 DP(NETIF_MSG_LINK, "XGXS\n");
284 /* select the master lanes (out of 0-3) */
285 REG_WR(bp, NIG_REG_XGXS_LANE_SEL_P0 +
288 REG_WR(bp, NIG_REG_XGXS_SERDES0_MODE_SEL +
291 } else { /* SerDes */
292 DP(NETIF_MSG_LINK, "SerDes\n");
294 REG_WR(bp, NIG_REG_XGXS_SERDES0_MODE_SEL +
298 bnx2x_bits_en(bp, emac_base + EMAC_REG_EMAC_RX_MODE,
300 bnx2x_bits_en(bp, emac_base + EMAC_REG_EMAC_TX_MODE,
303 if (CHIP_REV_IS_SLOW(bp)) {
304 /* config GMII mode */
305 val = REG_RD(bp, emac_base + EMAC_REG_EMAC_MODE);
306 EMAC_WR(bp, EMAC_REG_EMAC_MODE,
307 (val | EMAC_MODE_PORT_GMII));
309 /* pause enable/disable */
310 bnx2x_bits_dis(bp, emac_base + EMAC_REG_EMAC_RX_MODE,
311 EMAC_RX_MODE_FLOW_EN);
312 if (vars->flow_ctrl & BNX2X_FLOW_CTRL_RX)
313 bnx2x_bits_en(bp, emac_base +
314 EMAC_REG_EMAC_RX_MODE,
315 EMAC_RX_MODE_FLOW_EN);
317 bnx2x_bits_dis(bp, emac_base + EMAC_REG_EMAC_TX_MODE,
318 (EMAC_TX_MODE_EXT_PAUSE_EN |
319 EMAC_TX_MODE_FLOW_EN));
320 if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX)
321 bnx2x_bits_en(bp, emac_base +
322 EMAC_REG_EMAC_TX_MODE,
323 (EMAC_TX_MODE_EXT_PAUSE_EN |
324 EMAC_TX_MODE_FLOW_EN));
327 /* KEEP_VLAN_TAG, promiscuous */
328 val = REG_RD(bp, emac_base + EMAC_REG_EMAC_RX_MODE);
329 val |= EMAC_RX_MODE_KEEP_VLAN_TAG | EMAC_RX_MODE_PROMISCUOUS;
330 EMAC_WR(bp, EMAC_REG_EMAC_RX_MODE, val);
333 val = REG_RD(bp, emac_base + EMAC_REG_EMAC_MODE);
338 EMAC_WR(bp, EMAC_REG_EMAC_MODE, val);
341 REG_WR(bp, NIG_REG_NIG_EMAC0_EN + port*4, 1);
343 /* enable emac for jumbo packets */
344 EMAC_WR(bp, EMAC_REG_EMAC_RX_MTU_SIZE,
345 (EMAC_RX_MTU_SIZE_JUMBO_ENA |
346 (ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD)));
349 REG_WR(bp, NIG_REG_NIG_INGRESS_EMAC0_NO_CRC + port*4, 0x1);
351 /* disable the NIG in/out to the bmac */
352 REG_WR(bp, NIG_REG_BMAC0_IN_EN + port*4, 0x0);
353 REG_WR(bp, NIG_REG_BMAC0_PAUSE_OUT_EN + port*4, 0x0);
354 REG_WR(bp, NIG_REG_BMAC0_OUT_EN + port*4, 0x0);
356 /* enable the NIG in/out to the emac */
357 REG_WR(bp, NIG_REG_EMAC0_IN_EN + port*4, 0x1);
359 if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX)
362 REG_WR(bp, NIG_REG_EMAC0_PAUSE_OUT_EN + port*4, val);
363 REG_WR(bp, NIG_REG_EGRESS_EMAC0_OUT_EN + port*4, 0x1);
365 if (CHIP_REV_IS_EMUL(bp)) {
366 /* take the BigMac out of reset */
368 GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
369 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
371 /* enable access for bmac registers */
372 REG_WR(bp, NIG_REG_BMAC0_REGS_OUT_EN + port*4, 0x1);
374 REG_WR(bp, NIG_REG_BMAC0_REGS_OUT_EN + port*4, 0x0);
376 vars->mac_type = MAC_TYPE_EMAC;
382 static u8 bnx2x_bmac_enable(struct link_params *params, struct link_vars *vars,
385 struct bnx2x *bp = params->bp;
386 u8 port = params->port;
387 u32 bmac_addr = port ? NIG_REG_INGRESS_BMAC1_MEM :
388 NIG_REG_INGRESS_BMAC0_MEM;
392 DP(NETIF_MSG_LINK, "Enabling BigMAC\n");
393 /* reset and unreset the BigMac */
394 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
395 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
398 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
399 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
401 /* enable access for bmac registers */
402 REG_WR(bp, NIG_REG_BMAC0_REGS_OUT_EN + port*4, 0x1);
407 REG_WR_DMAE(bp, bmac_addr +
408 BIGMAC_REGISTER_BMAC_XGXS_CONTROL,
412 wb_data[0] = ((params->mac_addr[2] << 24) |
413 (params->mac_addr[3] << 16) |
414 (params->mac_addr[4] << 8) |
415 params->mac_addr[5]);
416 wb_data[1] = ((params->mac_addr[0] << 8) |
417 params->mac_addr[1]);
418 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_TX_SOURCE_ADDR,
423 if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX)
427 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_TX_CONTROL,
434 DP(NETIF_MSG_LINK, "enable bmac loopback\n");
438 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_BMAC_CONTROL,
442 wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD;
444 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_RX_MAX_SIZE,
447 /* rx control set to don't strip crc */
449 if (vars->flow_ctrl & BNX2X_FLOW_CTRL_RX)
453 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_RX_CONTROL,
457 wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD;
459 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_TX_MAX_SIZE,
462 /* set cnt max size */
463 wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD;
465 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_CNT_MAX_SIZE,
469 wb_data[0] = 0x1000200;
471 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_RX_LLFC_MSG_FLDS,
473 /* fix for emulation */
474 if (CHIP_REV_IS_EMUL(bp)) {
478 bmac_addr + BIGMAC_REGISTER_TX_PAUSE_THRESHOLD,
482 REG_WR(bp, NIG_REG_XGXS_SERDES0_MODE_SEL + port*4, 0x1);
483 REG_WR(bp, NIG_REG_XGXS_LANE_SEL_P0 + port*4, 0x0);
484 REG_WR(bp, NIG_REG_EGRESS_EMAC0_PORT + port*4, 0x0);
486 if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX)
488 REG_WR(bp, NIG_REG_BMAC0_PAUSE_OUT_EN + port*4, val);
489 REG_WR(bp, NIG_REG_EGRESS_EMAC0_OUT_EN + port*4, 0x0);
490 REG_WR(bp, NIG_REG_EMAC0_IN_EN + port*4, 0x0);
491 REG_WR(bp, NIG_REG_EMAC0_PAUSE_OUT_EN + port*4, 0x0);
492 REG_WR(bp, NIG_REG_BMAC0_IN_EN + port*4, 0x1);
493 REG_WR(bp, NIG_REG_BMAC0_OUT_EN + port*4, 0x1);
495 vars->mac_type = MAC_TYPE_BMAC;
500 static void bnx2x_update_mng(struct link_params *params, u32 link_status)
502 struct bnx2x *bp = params->bp;
504 REG_WR(bp, params->shmem_base +
505 offsetof(struct shmem_region,
506 port_mb[params->port].link_status),
510 static void bnx2x_bmac_rx_disable(struct bnx2x *bp, u8 port)
512 u32 bmac_addr = port ? NIG_REG_INGRESS_BMAC1_MEM :
513 NIG_REG_INGRESS_BMAC0_MEM;
515 u32 nig_bmac_enable = REG_RD(bp, NIG_REG_BMAC0_REGS_OUT_EN + port*4);
517 /* Only if the bmac is out of reset */
518 if (REG_RD(bp, MISC_REG_RESET_REG_2) &
519 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port) &&
522 /* Clear Rx Enable bit in BMAC_CONTROL register */
523 REG_RD_DMAE(bp, bmac_addr + BIGMAC_REGISTER_BMAC_CONTROL,
525 wb_data[0] &= ~BMAC_CONTROL_RX_ENABLE;
526 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_BMAC_CONTROL,
533 static u8 bnx2x_pbf_update(struct link_params *params, u32 flow_ctrl,
536 struct bnx2x *bp = params->bp;
537 u8 port = params->port;
542 REG_WR(bp, PBF_REG_DISABLE_NEW_TASK_PROC_P0 + port*4, 0x1);
544 /* wait for init credit */
545 init_crd = REG_RD(bp, PBF_REG_P0_INIT_CRD + port*4);
546 crd = REG_RD(bp, PBF_REG_P0_CREDIT + port*8);
547 DP(NETIF_MSG_LINK, "init_crd 0x%x crd 0x%x\n", init_crd, crd);
549 while ((init_crd != crd) && count) {
552 crd = REG_RD(bp, PBF_REG_P0_CREDIT + port*8);
555 crd = REG_RD(bp, PBF_REG_P0_CREDIT + port*8);
556 if (init_crd != crd) {
557 DP(NETIF_MSG_LINK, "BUG! init_crd 0x%x != crd 0x%x\n",
562 if (flow_ctrl & BNX2X_FLOW_CTRL_RX ||
563 line_speed == SPEED_10 ||
564 line_speed == SPEED_100 ||
565 line_speed == SPEED_1000 ||
566 line_speed == SPEED_2500) {
567 REG_WR(bp, PBF_REG_P0_PAUSE_ENABLE + port*4, 1);
568 /* update threshold */
569 REG_WR(bp, PBF_REG_P0_ARB_THRSH + port*4, 0);
570 /* update init credit */
571 init_crd = 778; /* (800-18-4) */
574 u32 thresh = (ETH_MAX_JUMBO_PACKET_SIZE +
576 REG_WR(bp, PBF_REG_P0_PAUSE_ENABLE + port*4, 0);
577 /* update threshold */
578 REG_WR(bp, PBF_REG_P0_ARB_THRSH + port*4, thresh);
579 /* update init credit */
580 switch (line_speed) {
582 init_crd = thresh + 553 - 22;
586 init_crd = thresh + 664 - 22;
590 init_crd = thresh + 742 - 22;
594 init_crd = thresh + 778 - 22;
597 DP(NETIF_MSG_LINK, "Invalid line_speed 0x%x\n",
602 REG_WR(bp, PBF_REG_P0_INIT_CRD + port*4, init_crd);
603 DP(NETIF_MSG_LINK, "PBF updated to speed %d credit %d\n",
604 line_speed, init_crd);
606 /* probe the credit changes */
607 REG_WR(bp, PBF_REG_INIT_P0 + port*4, 0x1);
609 REG_WR(bp, PBF_REG_INIT_P0 + port*4, 0x0);
612 REG_WR(bp, PBF_REG_DISABLE_NEW_TASK_PROC_P0 + port*4, 0x0);
616 static u32 bnx2x_get_emac_base(struct bnx2x *bp,
617 u32 mdc_mdio_access, u8 port)
620 switch (mdc_mdio_access) {
621 case SHARED_HW_CFG_MDC_MDIO_ACCESS1_PHY_TYPE:
623 case SHARED_HW_CFG_MDC_MDIO_ACCESS1_EMAC0:
624 if (REG_RD(bp, NIG_REG_PORT_SWAP))
625 emac_base = GRCBASE_EMAC1;
627 emac_base = GRCBASE_EMAC0;
629 case SHARED_HW_CFG_MDC_MDIO_ACCESS1_EMAC1:
630 if (REG_RD(bp, NIG_REG_PORT_SWAP))
631 emac_base = GRCBASE_EMAC0;
633 emac_base = GRCBASE_EMAC1;
635 case SHARED_HW_CFG_MDC_MDIO_ACCESS1_BOTH:
636 emac_base = (port) ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
638 case SHARED_HW_CFG_MDC_MDIO_ACCESS1_SWAPPED:
639 emac_base = (port) ? GRCBASE_EMAC0 : GRCBASE_EMAC1;
648 u8 bnx2x_cl45_write(struct bnx2x *bp, struct bnx2x_phy *phy,
649 u8 devad, u16 reg, u16 val)
654 /* set clause 45 mode, slow down the MDIO clock to 2.5MHz
655 * (a value of 49==0x31) and make sure that the AUTO poll is off
658 saved_mode = REG_RD(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE);
659 tmp = saved_mode & ~(EMAC_MDIO_MODE_AUTO_POLL |
660 EMAC_MDIO_MODE_CLOCK_CNT);
661 tmp |= (EMAC_MDIO_MODE_CLAUSE_45 |
662 (49 << EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT));
663 REG_WR(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE, tmp);
664 REG_RD(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE);
669 tmp = ((phy->addr << 21) | (devad << 16) | reg |
670 EMAC_MDIO_COMM_COMMAND_ADDRESS |
671 EMAC_MDIO_COMM_START_BUSY);
672 REG_WR(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM, tmp);
674 for (i = 0; i < 50; i++) {
677 tmp = REG_RD(bp, phy->mdio_ctrl +
678 EMAC_REG_EMAC_MDIO_COMM);
679 if (!(tmp & EMAC_MDIO_COMM_START_BUSY)) {
684 if (tmp & EMAC_MDIO_COMM_START_BUSY) {
685 DP(NETIF_MSG_LINK, "write phy register failed\n");
689 tmp = ((phy->addr << 21) | (devad << 16) | val |
690 EMAC_MDIO_COMM_COMMAND_WRITE_45 |
691 EMAC_MDIO_COMM_START_BUSY);
692 REG_WR(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM, tmp);
694 for (i = 0; i < 50; i++) {
697 tmp = REG_RD(bp, phy->mdio_ctrl +
698 EMAC_REG_EMAC_MDIO_COMM);
699 if (!(tmp & EMAC_MDIO_COMM_START_BUSY)) {
704 if (tmp & EMAC_MDIO_COMM_START_BUSY) {
705 DP(NETIF_MSG_LINK, "write phy register failed\n");
710 /* Restore the saved mode */
711 REG_WR(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE, saved_mode);
716 u8 bnx2x_cl45_read(struct bnx2x *bp, struct bnx2x_phy *phy,
717 u8 devad, u16 reg, u16 *ret_val)
723 /* set clause 45 mode, slow down the MDIO clock to 2.5MHz
724 * (a value of 49==0x31) and make sure that the AUTO poll is off
727 saved_mode = REG_RD(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE);
728 val = saved_mode & ~((EMAC_MDIO_MODE_AUTO_POLL |
729 EMAC_MDIO_MODE_CLOCK_CNT));
730 val |= (EMAC_MDIO_MODE_CLAUSE_45 |
731 (49L << EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT));
732 REG_WR(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE, val);
733 REG_RD(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE);
737 val = ((phy->addr << 21) | (devad << 16) | reg |
738 EMAC_MDIO_COMM_COMMAND_ADDRESS |
739 EMAC_MDIO_COMM_START_BUSY);
740 REG_WR(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM, val);
742 for (i = 0; i < 50; i++) {
745 val = REG_RD(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM);
746 if (!(val & EMAC_MDIO_COMM_START_BUSY)) {
751 if (val & EMAC_MDIO_COMM_START_BUSY) {
752 DP(NETIF_MSG_LINK, "read phy register failed\n");
759 val = ((phy->addr << 21) | (devad << 16) |
760 EMAC_MDIO_COMM_COMMAND_READ_45 |
761 EMAC_MDIO_COMM_START_BUSY);
762 REG_WR(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM, val);
764 for (i = 0; i < 50; i++) {
767 val = REG_RD(bp, phy->mdio_ctrl +
768 EMAC_REG_EMAC_MDIO_COMM);
769 if (!(val & EMAC_MDIO_COMM_START_BUSY)) {
770 *ret_val = (u16)(val & EMAC_MDIO_COMM_DATA);
774 if (val & EMAC_MDIO_COMM_START_BUSY) {
775 DP(NETIF_MSG_LINK, "read phy register failed\n");
782 /* Restore the saved mode */
783 REG_WR(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE, saved_mode);
788 u8 bnx2x_phy_read(struct link_params *params, u8 phy_addr,
789 u8 devad, u16 reg, u16 *ret_val)
793 * Probe for the phy according to the given phy_addr, and execute
794 * the read request on it
796 for (phy_index = 0; phy_index < params->num_phys; phy_index++) {
797 if (params->phy[phy_index].addr == phy_addr) {
798 return bnx2x_cl45_read(params->bp,
799 ¶ms->phy[phy_index], devad,
806 u8 bnx2x_phy_write(struct link_params *params, u8 phy_addr,
807 u8 devad, u16 reg, u16 val)
811 * Probe for the phy according to the given phy_addr, and execute
812 * the write request on it
814 for (phy_index = 0; phy_index < params->num_phys; phy_index++) {
815 if (params->phy[phy_index].addr == phy_addr) {
816 return bnx2x_cl45_write(params->bp,
817 ¶ms->phy[phy_index], devad,
824 static void bnx2x_set_aer_mmd(struct link_params *params,
825 struct bnx2x_phy *phy)
827 struct bnx2x *bp = params->bp;
831 ser_lane = ((params->lane_config &
832 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_MASK) >>
833 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_SHIFT);
835 offset = (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) ?
836 (phy->addr + ser_lane) : 0;
838 CL45_WR_OVER_CL22(bp, phy,
839 MDIO_REG_BANK_AER_BLOCK,
840 MDIO_AER_BLOCK_AER_REG, 0x3800 + offset);
843 /******************************************************************/
844 /* Internal phy section */
845 /******************************************************************/
847 static void bnx2x_set_serdes_access(struct bnx2x *bp, u8 port)
849 u32 emac_base = (port) ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
852 REG_WR(bp, NIG_REG_SERDES0_CTRL_MD_ST + port*0x10, 1);
853 REG_WR(bp, emac_base + EMAC_REG_EMAC_MDIO_COMM, 0x245f8000);
855 REG_WR(bp, emac_base + EMAC_REG_EMAC_MDIO_COMM, 0x245d000f);
858 REG_WR(bp, NIG_REG_SERDES0_CTRL_MD_ST + port*0x10, 0);
861 static void bnx2x_serdes_deassert(struct bnx2x *bp, u8 port)
865 DP(NETIF_MSG_LINK, "bnx2x_serdes_deassert\n");
867 val = SERDES_RESET_BITS << (port*16);
869 /* reset and unreset the SerDes/XGXS */
870 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_CLEAR, val);
872 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_SET, val);
874 bnx2x_set_serdes_access(bp, port);
876 REG_WR(bp, NIG_REG_SERDES0_CTRL_MD_DEVAD +
878 DEFAULT_PHY_DEV_ADDR);
881 static void bnx2x_xgxs_deassert(struct link_params *params)
883 struct bnx2x *bp = params->bp;
886 DP(NETIF_MSG_LINK, "bnx2x_xgxs_deassert\n");
889 val = XGXS_RESET_BITS << (port*16);
891 /* reset and unreset the SerDes/XGXS */
892 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_CLEAR, val);
894 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_SET, val);
896 REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_ST +
898 REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_DEVAD + port*0x18,
899 params->phy[INT_PHY].def_md_devad);
902 void bnx2x_link_status_update(struct link_params *params,
903 struct link_vars *vars)
905 struct bnx2x *bp = params->bp;
907 u8 port = params->port;
909 if (params->switch_cfg == SWITCH_CFG_1G)
910 vars->phy_flags = PHY_SERDES_FLAG;
912 vars->phy_flags = PHY_XGXS_FLAG;
913 vars->link_status = REG_RD(bp, params->shmem_base +
914 offsetof(struct shmem_region,
915 port_mb[port].link_status));
917 vars->link_up = (vars->link_status & LINK_STATUS_LINK_UP);
920 DP(NETIF_MSG_LINK, "phy link up\n");
922 vars->phy_link_up = 1;
923 vars->duplex = DUPLEX_FULL;
924 switch (vars->link_status &
925 LINK_STATUS_SPEED_AND_DUPLEX_MASK) {
927 vars->duplex = DUPLEX_HALF;
930 vars->line_speed = SPEED_10;
934 vars->duplex = DUPLEX_HALF;
938 vars->line_speed = SPEED_100;
942 vars->duplex = DUPLEX_HALF;
945 vars->line_speed = SPEED_1000;
949 vars->duplex = DUPLEX_HALF;
952 vars->line_speed = SPEED_2500;
956 vars->line_speed = SPEED_10000;
960 vars->line_speed = SPEED_12000;
964 vars->line_speed = SPEED_12500;
968 vars->line_speed = SPEED_13000;
972 vars->line_speed = SPEED_15000;
976 vars->line_speed = SPEED_16000;
984 if (vars->link_status & LINK_STATUS_TX_FLOW_CONTROL_ENABLED)
985 vars->flow_ctrl |= BNX2X_FLOW_CTRL_TX;
987 if (vars->link_status & LINK_STATUS_RX_FLOW_CONTROL_ENABLED)
988 vars->flow_ctrl |= BNX2X_FLOW_CTRL_RX;
990 if (!vars->flow_ctrl)
991 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
993 if (vars->line_speed &&
994 ((vars->line_speed == SPEED_10) ||
995 (vars->line_speed == SPEED_100))) {
996 vars->phy_flags |= PHY_SGMII_FLAG;
998 vars->phy_flags &= ~PHY_SGMII_FLAG;
1001 /* anything 10 and over uses the bmac */
1002 link_10g = ((vars->line_speed == SPEED_10000) ||
1003 (vars->line_speed == SPEED_12000) ||
1004 (vars->line_speed == SPEED_12500) ||
1005 (vars->line_speed == SPEED_13000) ||
1006 (vars->line_speed == SPEED_15000) ||
1007 (vars->line_speed == SPEED_16000));
1009 vars->mac_type = MAC_TYPE_BMAC;
1011 vars->mac_type = MAC_TYPE_EMAC;
1013 } else { /* link down */
1014 DP(NETIF_MSG_LINK, "phy link down\n");
1016 vars->phy_link_up = 0;
1018 vars->line_speed = 0;
1019 vars->duplex = DUPLEX_FULL;
1020 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
1022 /* indicate no mac active */
1023 vars->mac_type = MAC_TYPE_NONE;
1026 DP(NETIF_MSG_LINK, "link_status 0x%x phy_link_up %x\n",
1027 vars->link_status, vars->phy_link_up);
1028 DP(NETIF_MSG_LINK, "line_speed %x duplex %x flow_ctrl 0x%x\n",
1029 vars->line_speed, vars->duplex, vars->flow_ctrl);
1033 static void bnx2x_set_master_ln(struct link_params *params,
1034 struct bnx2x_phy *phy)
1036 struct bnx2x *bp = params->bp;
1037 u16 new_master_ln, ser_lane;
1038 ser_lane = ((params->lane_config &
1039 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_MASK) >>
1040 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_SHIFT);
1042 /* set the master_ln for AN */
1043 CL45_RD_OVER_CL22(bp, phy,
1044 MDIO_REG_BANK_XGXS_BLOCK2,
1045 MDIO_XGXS_BLOCK2_TEST_MODE_LANE,
1048 CL45_WR_OVER_CL22(bp, phy,
1049 MDIO_REG_BANK_XGXS_BLOCK2 ,
1050 MDIO_XGXS_BLOCK2_TEST_MODE_LANE,
1051 (new_master_ln | ser_lane));
1054 static u8 bnx2x_reset_unicore(struct link_params *params,
1055 struct bnx2x_phy *phy,
1058 struct bnx2x *bp = params->bp;
1062 CL45_RD_OVER_CL22(bp, phy,
1063 MDIO_REG_BANK_COMBO_IEEE0,
1064 MDIO_COMBO_IEEE0_MII_CONTROL, &mii_control);
1066 /* reset the unicore */
1067 CL45_WR_OVER_CL22(bp, phy,
1068 MDIO_REG_BANK_COMBO_IEEE0,
1069 MDIO_COMBO_IEEE0_MII_CONTROL,
1071 MDIO_COMBO_IEEO_MII_CONTROL_RESET));
1073 bnx2x_set_serdes_access(bp, params->port);
1075 /* wait for the reset to self clear */
1076 for (i = 0; i < MDIO_ACCESS_TIMEOUT; i++) {
1079 /* the reset erased the previous bank value */
1080 CL45_RD_OVER_CL22(bp, phy,
1081 MDIO_REG_BANK_COMBO_IEEE0,
1082 MDIO_COMBO_IEEE0_MII_CONTROL,
1085 if (!(mii_control & MDIO_COMBO_IEEO_MII_CONTROL_RESET)) {
1091 DP(NETIF_MSG_LINK, "BUG! XGXS is still in reset!\n");
1096 static void bnx2x_set_swap_lanes(struct link_params *params,
1097 struct bnx2x_phy *phy)
1099 struct bnx2x *bp = params->bp;
1100 /* Each two bits represents a lane number:
1101 No swap is 0123 => 0x1b no need to enable the swap */
1102 u16 ser_lane, rx_lane_swap, tx_lane_swap;
1104 ser_lane = ((params->lane_config &
1105 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_MASK) >>
1106 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_SHIFT);
1107 rx_lane_swap = ((params->lane_config &
1108 PORT_HW_CFG_LANE_SWAP_CFG_RX_MASK) >>
1109 PORT_HW_CFG_LANE_SWAP_CFG_RX_SHIFT);
1110 tx_lane_swap = ((params->lane_config &
1111 PORT_HW_CFG_LANE_SWAP_CFG_TX_MASK) >>
1112 PORT_HW_CFG_LANE_SWAP_CFG_TX_SHIFT);
1114 if (rx_lane_swap != 0x1b) {
1115 CL45_WR_OVER_CL22(bp, phy,
1116 MDIO_REG_BANK_XGXS_BLOCK2,
1117 MDIO_XGXS_BLOCK2_RX_LN_SWAP,
1119 MDIO_XGXS_BLOCK2_RX_LN_SWAP_ENABLE |
1120 MDIO_XGXS_BLOCK2_RX_LN_SWAP_FORCE_ENABLE));
1122 CL45_WR_OVER_CL22(bp, phy,
1123 MDIO_REG_BANK_XGXS_BLOCK2,
1124 MDIO_XGXS_BLOCK2_RX_LN_SWAP, 0);
1127 if (tx_lane_swap != 0x1b) {
1128 CL45_WR_OVER_CL22(bp, phy,
1129 MDIO_REG_BANK_XGXS_BLOCK2,
1130 MDIO_XGXS_BLOCK2_TX_LN_SWAP,
1132 MDIO_XGXS_BLOCK2_TX_LN_SWAP_ENABLE));
1134 CL45_WR_OVER_CL22(bp, phy,
1135 MDIO_REG_BANK_XGXS_BLOCK2,
1136 MDIO_XGXS_BLOCK2_TX_LN_SWAP, 0);
1140 static void bnx2x_set_parallel_detection(struct bnx2x_phy *phy,
1141 struct link_params *params)
1143 struct bnx2x *bp = params->bp;
1145 CL45_RD_OVER_CL22(bp, phy,
1146 MDIO_REG_BANK_SERDES_DIGITAL,
1147 MDIO_SERDES_DIGITAL_A_1000X_CONTROL2,
1149 if (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)
1150 control2 |= MDIO_SERDES_DIGITAL_A_1000X_CONTROL2_PRL_DT_EN;
1152 control2 &= ~MDIO_SERDES_DIGITAL_A_1000X_CONTROL2_PRL_DT_EN;
1153 DP(NETIF_MSG_LINK, "phy->speed_cap_mask = 0x%x, control2 = 0x%x\n",
1154 phy->speed_cap_mask, control2);
1155 CL45_WR_OVER_CL22(bp, phy,
1156 MDIO_REG_BANK_SERDES_DIGITAL,
1157 MDIO_SERDES_DIGITAL_A_1000X_CONTROL2,
1160 if ((phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) &&
1161 (phy->speed_cap_mask &
1162 PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)) {
1163 DP(NETIF_MSG_LINK, "XGXS\n");
1165 CL45_WR_OVER_CL22(bp, phy,
1166 MDIO_REG_BANK_10G_PARALLEL_DETECT,
1167 MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_LINK,
1168 MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_LINK_CNT);
1170 CL45_RD_OVER_CL22(bp, phy,
1171 MDIO_REG_BANK_10G_PARALLEL_DETECT,
1172 MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_CONTROL,
1177 MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_CONTROL_PARDET10G_EN;
1179 CL45_WR_OVER_CL22(bp, phy,
1180 MDIO_REG_BANK_10G_PARALLEL_DETECT,
1181 MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_CONTROL,
1184 /* Disable parallel detection of HiG */
1185 CL45_WR_OVER_CL22(bp, phy,
1186 MDIO_REG_BANK_XGXS_BLOCK2,
1187 MDIO_XGXS_BLOCK2_UNICORE_MODE_10G,
1188 MDIO_XGXS_BLOCK2_UNICORE_MODE_10G_CX4_XGXS |
1189 MDIO_XGXS_BLOCK2_UNICORE_MODE_10G_HIGIG_XGXS);
1193 static void bnx2x_set_autoneg(struct bnx2x_phy *phy,
1194 struct link_params *params,
1195 struct link_vars *vars,
1198 struct bnx2x *bp = params->bp;
1202 CL45_RD_OVER_CL22(bp, phy,
1203 MDIO_REG_BANK_COMBO_IEEE0,
1204 MDIO_COMBO_IEEE0_MII_CONTROL, ®_val);
1206 /* CL37 Autoneg Enabled */
1207 if (vars->line_speed == SPEED_AUTO_NEG)
1208 reg_val |= MDIO_COMBO_IEEO_MII_CONTROL_AN_EN;
1209 else /* CL37 Autoneg Disabled */
1210 reg_val &= ~(MDIO_COMBO_IEEO_MII_CONTROL_AN_EN |
1211 MDIO_COMBO_IEEO_MII_CONTROL_RESTART_AN);
1213 CL45_WR_OVER_CL22(bp, phy,
1214 MDIO_REG_BANK_COMBO_IEEE0,
1215 MDIO_COMBO_IEEE0_MII_CONTROL, reg_val);
1217 /* Enable/Disable Autodetection */
1219 CL45_RD_OVER_CL22(bp, phy,
1220 MDIO_REG_BANK_SERDES_DIGITAL,
1221 MDIO_SERDES_DIGITAL_A_1000X_CONTROL1, ®_val);
1222 reg_val &= ~(MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_SIGNAL_DETECT_EN |
1223 MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_INVERT_SIGNAL_DETECT);
1224 reg_val |= MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_FIBER_MODE;
1225 if (vars->line_speed == SPEED_AUTO_NEG)
1226 reg_val |= MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_AUTODET;
1228 reg_val &= ~MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_AUTODET;
1230 CL45_WR_OVER_CL22(bp, phy,
1231 MDIO_REG_BANK_SERDES_DIGITAL,
1232 MDIO_SERDES_DIGITAL_A_1000X_CONTROL1, reg_val);
1234 /* Enable TetonII and BAM autoneg */
1235 CL45_RD_OVER_CL22(bp, phy,
1236 MDIO_REG_BANK_BAM_NEXT_PAGE,
1237 MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL,
1239 if (vars->line_speed == SPEED_AUTO_NEG) {
1240 /* Enable BAM aneg Mode and TetonII aneg Mode */
1241 reg_val |= (MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL_BAM_MODE |
1242 MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL_TETON_AN);
1244 /* TetonII and BAM Autoneg Disabled */
1245 reg_val &= ~(MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL_BAM_MODE |
1246 MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL_TETON_AN);
1248 CL45_WR_OVER_CL22(bp, phy,
1249 MDIO_REG_BANK_BAM_NEXT_PAGE,
1250 MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL,
1254 /* Enable Cl73 FSM status bits */
1255 CL45_WR_OVER_CL22(bp, phy,
1256 MDIO_REG_BANK_CL73_USERB0,
1257 MDIO_CL73_USERB0_CL73_UCTRL,
1260 /* Enable BAM Station Manager*/
1261 CL45_WR_OVER_CL22(bp, phy,
1262 MDIO_REG_BANK_CL73_USERB0,
1263 MDIO_CL73_USERB0_CL73_BAM_CTRL1,
1264 MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_EN |
1265 MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_STATION_MNGR_EN |
1266 MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_NP_AFTER_BP_EN);
1268 /* Advertise CL73 link speeds */
1269 CL45_RD_OVER_CL22(bp, phy,
1270 MDIO_REG_BANK_CL73_IEEEB1,
1271 MDIO_CL73_IEEEB1_AN_ADV2,
1273 if (phy->speed_cap_mask &
1274 PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)
1275 reg_val |= MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KX4;
1276 if (phy->speed_cap_mask &
1277 PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)
1278 reg_val |= MDIO_CL73_IEEEB1_AN_ADV2_ADVR_1000M_KX;
1280 CL45_WR_OVER_CL22(bp, phy,
1281 MDIO_REG_BANK_CL73_IEEEB1,
1282 MDIO_CL73_IEEEB1_AN_ADV2,
1285 /* CL73 Autoneg Enabled */
1286 reg_val = MDIO_CL73_IEEEB0_CL73_AN_CONTROL_AN_EN;
1288 } else /* CL73 Autoneg Disabled */
1291 CL45_WR_OVER_CL22(bp, phy,
1292 MDIO_REG_BANK_CL73_IEEEB0,
1293 MDIO_CL73_IEEEB0_CL73_AN_CONTROL, reg_val);
1296 /* program SerDes, forced speed */
1297 static void bnx2x_program_serdes(struct bnx2x_phy *phy,
1298 struct link_params *params,
1299 struct link_vars *vars)
1301 struct bnx2x *bp = params->bp;
1304 /* program duplex, disable autoneg and sgmii*/
1305 CL45_RD_OVER_CL22(bp, phy,
1306 MDIO_REG_BANK_COMBO_IEEE0,
1307 MDIO_COMBO_IEEE0_MII_CONTROL, ®_val);
1308 reg_val &= ~(MDIO_COMBO_IEEO_MII_CONTROL_FULL_DUPLEX |
1309 MDIO_COMBO_IEEO_MII_CONTROL_AN_EN |
1310 MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_MASK);
1311 if (phy->req_duplex == DUPLEX_FULL)
1312 reg_val |= MDIO_COMBO_IEEO_MII_CONTROL_FULL_DUPLEX;
1313 CL45_WR_OVER_CL22(bp, phy,
1314 MDIO_REG_BANK_COMBO_IEEE0,
1315 MDIO_COMBO_IEEE0_MII_CONTROL, reg_val);
1318 - needed only if the speed is greater than 1G (2.5G or 10G) */
1319 CL45_RD_OVER_CL22(bp, phy,
1320 MDIO_REG_BANK_SERDES_DIGITAL,
1321 MDIO_SERDES_DIGITAL_MISC1, ®_val);
1322 /* clearing the speed value before setting the right speed */
1323 DP(NETIF_MSG_LINK, "MDIO_REG_BANK_SERDES_DIGITAL = 0x%x\n", reg_val);
1325 reg_val &= ~(MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_MASK |
1326 MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_SEL);
1328 if (!((vars->line_speed == SPEED_1000) ||
1329 (vars->line_speed == SPEED_100) ||
1330 (vars->line_speed == SPEED_10))) {
1332 reg_val |= (MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_156_25M |
1333 MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_SEL);
1334 if (vars->line_speed == SPEED_10000)
1336 MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_10G_CX4;
1337 if (vars->line_speed == SPEED_13000)
1339 MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_13G;
1342 CL45_WR_OVER_CL22(bp, phy,
1343 MDIO_REG_BANK_SERDES_DIGITAL,
1344 MDIO_SERDES_DIGITAL_MISC1, reg_val);
1348 static void bnx2x_set_brcm_cl37_advertisment(struct bnx2x_phy *phy,
1349 struct link_params *params)
1351 struct bnx2x *bp = params->bp;
1354 /* configure the 48 bits for BAM AN */
1356 /* set extended capabilities */
1357 if (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_2_5G)
1358 val |= MDIO_OVER_1G_UP1_2_5G;
1359 if (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)
1360 val |= MDIO_OVER_1G_UP1_10G;
1361 CL45_WR_OVER_CL22(bp, phy,
1362 MDIO_REG_BANK_OVER_1G,
1363 MDIO_OVER_1G_UP1, val);
1365 CL45_WR_OVER_CL22(bp, phy,
1366 MDIO_REG_BANK_OVER_1G,
1367 MDIO_OVER_1G_UP3, 0x400);
1370 static void bnx2x_calc_ieee_aneg_adv(struct bnx2x_phy *phy,
1371 struct link_params *params, u16 *ieee_fc)
1373 struct bnx2x *bp = params->bp;
1374 *ieee_fc = MDIO_COMBO_IEEE0_AUTO_NEG_ADV_FULL_DUPLEX;
1375 /* resolve pause mode and advertisement
1376 * Please refer to Table 28B-3 of the 802.3ab-1999 spec */
1378 switch (phy->req_flow_ctrl) {
1379 case BNX2X_FLOW_CTRL_AUTO:
1380 if (params->req_fc_auto_adv == BNX2X_FLOW_CTRL_BOTH) {
1382 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH;
1385 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC;
1388 case BNX2X_FLOW_CTRL_TX:
1390 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC;
1393 case BNX2X_FLOW_CTRL_RX:
1394 case BNX2X_FLOW_CTRL_BOTH:
1395 *ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH;
1398 case BNX2X_FLOW_CTRL_NONE:
1400 *ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_NONE;
1403 DP(NETIF_MSG_LINK, "ieee_fc = 0x%x\n", *ieee_fc);
1406 static void bnx2x_set_ieee_aneg_advertisment(struct bnx2x_phy *phy,
1407 struct link_params *params,
1410 struct bnx2x *bp = params->bp;
1412 /* for AN, we are always publishing full duplex */
1414 CL45_WR_OVER_CL22(bp, phy,
1415 MDIO_REG_BANK_COMBO_IEEE0,
1416 MDIO_COMBO_IEEE0_AUTO_NEG_ADV, ieee_fc);
1417 CL45_RD_OVER_CL22(bp, phy,
1418 MDIO_REG_BANK_CL73_IEEEB1,
1419 MDIO_CL73_IEEEB1_AN_ADV1, &val);
1420 val &= ~MDIO_CL73_IEEEB1_AN_ADV1_PAUSE_BOTH;
1421 val |= ((ieee_fc<<3) & MDIO_CL73_IEEEB1_AN_ADV1_PAUSE_MASK);
1422 CL45_WR_OVER_CL22(bp, phy,
1423 MDIO_REG_BANK_CL73_IEEEB1,
1424 MDIO_CL73_IEEEB1_AN_ADV1, val);
1427 static void bnx2x_restart_autoneg(struct bnx2x_phy *phy,
1428 struct link_params *params,
1431 struct bnx2x *bp = params->bp;
1434 DP(NETIF_MSG_LINK, "bnx2x_restart_autoneg\n");
1435 /* Enable and restart BAM/CL37 aneg */
1438 CL45_RD_OVER_CL22(bp, phy,
1439 MDIO_REG_BANK_CL73_IEEEB0,
1440 MDIO_CL73_IEEEB0_CL73_AN_CONTROL,
1443 CL45_WR_OVER_CL22(bp, phy,
1444 MDIO_REG_BANK_CL73_IEEEB0,
1445 MDIO_CL73_IEEEB0_CL73_AN_CONTROL,
1447 MDIO_CL73_IEEEB0_CL73_AN_CONTROL_AN_EN |
1448 MDIO_CL73_IEEEB0_CL73_AN_CONTROL_RESTART_AN));
1451 CL45_RD_OVER_CL22(bp, phy,
1452 MDIO_REG_BANK_COMBO_IEEE0,
1453 MDIO_COMBO_IEEE0_MII_CONTROL,
1456 "bnx2x_restart_autoneg mii_control before = 0x%x\n",
1458 CL45_WR_OVER_CL22(bp, phy,
1459 MDIO_REG_BANK_COMBO_IEEE0,
1460 MDIO_COMBO_IEEE0_MII_CONTROL,
1462 MDIO_COMBO_IEEO_MII_CONTROL_AN_EN |
1463 MDIO_COMBO_IEEO_MII_CONTROL_RESTART_AN));
1467 static void bnx2x_initialize_sgmii_process(struct bnx2x_phy *phy,
1468 struct link_params *params,
1469 struct link_vars *vars)
1471 struct bnx2x *bp = params->bp;
1474 /* in SGMII mode, the unicore is always slave */
1476 CL45_RD_OVER_CL22(bp, phy,
1477 MDIO_REG_BANK_SERDES_DIGITAL,
1478 MDIO_SERDES_DIGITAL_A_1000X_CONTROL1,
1480 control1 |= MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_INVERT_SIGNAL_DETECT;
1481 /* set sgmii mode (and not fiber) */
1482 control1 &= ~(MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_FIBER_MODE |
1483 MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_AUTODET |
1484 MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_MSTR_MODE);
1485 CL45_WR_OVER_CL22(bp, phy,
1486 MDIO_REG_BANK_SERDES_DIGITAL,
1487 MDIO_SERDES_DIGITAL_A_1000X_CONTROL1,
1490 /* if forced speed */
1491 if (!(vars->line_speed == SPEED_AUTO_NEG)) {
1492 /* set speed, disable autoneg */
1495 CL45_RD_OVER_CL22(bp, phy,
1496 MDIO_REG_BANK_COMBO_IEEE0,
1497 MDIO_COMBO_IEEE0_MII_CONTROL,
1499 mii_control &= ~(MDIO_COMBO_IEEO_MII_CONTROL_AN_EN |
1500 MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_MASK|
1501 MDIO_COMBO_IEEO_MII_CONTROL_FULL_DUPLEX);
1503 switch (vars->line_speed) {
1506 MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_100;
1510 MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_1000;
1513 /* there is nothing to set for 10M */
1516 /* invalid speed for SGMII */
1517 DP(NETIF_MSG_LINK, "Invalid line_speed 0x%x\n",
1522 /* setting the full duplex */
1523 if (phy->req_duplex == DUPLEX_FULL)
1525 MDIO_COMBO_IEEO_MII_CONTROL_FULL_DUPLEX;
1526 CL45_WR_OVER_CL22(bp, phy,
1527 MDIO_REG_BANK_COMBO_IEEE0,
1528 MDIO_COMBO_IEEE0_MII_CONTROL,
1531 } else { /* AN mode */
1532 /* enable and restart AN */
1533 bnx2x_restart_autoneg(phy, params, 0);
1542 static void bnx2x_pause_resolve(struct link_vars *vars, u32 pause_result)
1544 switch (pause_result) { /* ASYM P ASYM P */
1545 case 0xb: /* 1 0 1 1 */
1546 vars->flow_ctrl = BNX2X_FLOW_CTRL_TX;
1549 case 0xe: /* 1 1 1 0 */
1550 vars->flow_ctrl = BNX2X_FLOW_CTRL_RX;
1553 case 0x5: /* 0 1 0 1 */
1554 case 0x7: /* 0 1 1 1 */
1555 case 0xd: /* 1 1 0 1 */
1556 case 0xf: /* 1 1 1 1 */
1557 vars->flow_ctrl = BNX2X_FLOW_CTRL_BOTH;
1563 if (pause_result & (1<<0))
1564 vars->link_status |= LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE;
1565 if (pause_result & (1<<1))
1566 vars->link_status |= LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE;
1570 static u8 bnx2x_direct_parallel_detect_used(struct bnx2x_phy *phy,
1571 struct link_params *params)
1573 struct bnx2x *bp = params->bp;
1574 u16 pd_10g, status2_1000x;
1575 if (phy->req_line_speed != SPEED_AUTO_NEG)
1577 CL45_RD_OVER_CL22(bp, phy,
1578 MDIO_REG_BANK_SERDES_DIGITAL,
1579 MDIO_SERDES_DIGITAL_A_1000X_STATUS2,
1581 CL45_RD_OVER_CL22(bp, phy,
1582 MDIO_REG_BANK_SERDES_DIGITAL,
1583 MDIO_SERDES_DIGITAL_A_1000X_STATUS2,
1585 if (status2_1000x & MDIO_SERDES_DIGITAL_A_1000X_STATUS2_AN_DISABLED) {
1586 DP(NETIF_MSG_LINK, "1G parallel detect link on port %d\n",
1591 CL45_RD_OVER_CL22(bp, phy,
1592 MDIO_REG_BANK_10G_PARALLEL_DETECT,
1593 MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_STATUS,
1596 if (pd_10g & MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_STATUS_PD_LINK) {
1597 DP(NETIF_MSG_LINK, "10G parallel detect link on port %d\n",
1604 static void bnx2x_flow_ctrl_resolve(struct bnx2x_phy *phy,
1605 struct link_params *params,
1606 struct link_vars *vars,
1609 struct bnx2x *bp = params->bp;
1610 u16 ld_pause; /* local driver */
1611 u16 lp_pause; /* link partner */
1614 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
1616 /* resolve from gp_status in case of AN complete and not sgmii */
1617 if (phy->req_flow_ctrl != BNX2X_FLOW_CTRL_AUTO)
1618 vars->flow_ctrl = phy->req_flow_ctrl;
1619 else if (phy->req_line_speed != SPEED_AUTO_NEG)
1620 vars->flow_ctrl = params->req_fc_auto_adv;
1621 else if ((gp_status & MDIO_AN_CL73_OR_37_COMPLETE) &&
1622 (!(vars->phy_flags & PHY_SGMII_FLAG))) {
1623 if (bnx2x_direct_parallel_detect_used(phy, params)) {
1624 vars->flow_ctrl = params->req_fc_auto_adv;
1628 (MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_AUTONEG_COMPLETE |
1629 MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_MR_LP_NP_AN_ABLE)) ==
1630 (MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_AUTONEG_COMPLETE |
1631 MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_MR_LP_NP_AN_ABLE)) {
1633 CL45_RD_OVER_CL22(bp, phy,
1634 MDIO_REG_BANK_CL73_IEEEB1,
1635 MDIO_CL73_IEEEB1_AN_ADV1,
1637 CL45_RD_OVER_CL22(bp, phy,
1638 MDIO_REG_BANK_CL73_IEEEB1,
1639 MDIO_CL73_IEEEB1_AN_LP_ADV1,
1641 pause_result = (ld_pause &
1642 MDIO_CL73_IEEEB1_AN_ADV1_PAUSE_MASK)
1644 pause_result |= (lp_pause &
1645 MDIO_CL73_IEEEB1_AN_LP_ADV1_PAUSE_MASK)
1647 DP(NETIF_MSG_LINK, "pause_result CL73 0x%x\n",
1650 CL45_RD_OVER_CL22(bp, phy,
1651 MDIO_REG_BANK_COMBO_IEEE0,
1652 MDIO_COMBO_IEEE0_AUTO_NEG_ADV,
1654 CL45_RD_OVER_CL22(bp, phy,
1655 MDIO_REG_BANK_COMBO_IEEE0,
1656 MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1,
1658 pause_result = (ld_pause &
1659 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_MASK)>>5;
1660 pause_result |= (lp_pause &
1661 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_MASK)>>7;
1662 DP(NETIF_MSG_LINK, "pause_result CL37 0x%x\n",
1665 bnx2x_pause_resolve(vars, pause_result);
1667 DP(NETIF_MSG_LINK, "flow_ctrl 0x%x\n", vars->flow_ctrl);
1670 static void bnx2x_check_fallback_to_cl37(struct bnx2x_phy *phy,
1671 struct link_params *params)
1673 struct bnx2x *bp = params->bp;
1674 u16 rx_status, ustat_val, cl37_fsm_recieved;
1675 DP(NETIF_MSG_LINK, "bnx2x_check_fallback_to_cl37\n");
1676 /* Step 1: Make sure signal is detected */
1677 CL45_RD_OVER_CL22(bp, phy,
1681 if ((rx_status & MDIO_RX0_RX_STATUS_SIGDET) !=
1682 (MDIO_RX0_RX_STATUS_SIGDET)) {
1683 DP(NETIF_MSG_LINK, "Signal is not detected. Restoring CL73."
1684 "rx_status(0x80b0) = 0x%x\n", rx_status);
1685 CL45_WR_OVER_CL22(bp, phy,
1686 MDIO_REG_BANK_CL73_IEEEB0,
1687 MDIO_CL73_IEEEB0_CL73_AN_CONTROL,
1688 MDIO_CL73_IEEEB0_CL73_AN_CONTROL_AN_EN);
1691 /* Step 2: Check CL73 state machine */
1692 CL45_RD_OVER_CL22(bp, phy,
1693 MDIO_REG_BANK_CL73_USERB0,
1694 MDIO_CL73_USERB0_CL73_USTAT1,
1697 (MDIO_CL73_USERB0_CL73_USTAT1_LINK_STATUS_CHECK |
1698 MDIO_CL73_USERB0_CL73_USTAT1_AN_GOOD_CHECK_BAM37)) !=
1699 (MDIO_CL73_USERB0_CL73_USTAT1_LINK_STATUS_CHECK |
1700 MDIO_CL73_USERB0_CL73_USTAT1_AN_GOOD_CHECK_BAM37)) {
1701 DP(NETIF_MSG_LINK, "CL73 state-machine is not stable. "
1702 "ustat_val(0x8371) = 0x%x\n", ustat_val);
1705 /* Step 3: Check CL37 Message Pages received to indicate LP
1706 supports only CL37 */
1707 CL45_RD_OVER_CL22(bp, phy,
1708 MDIO_REG_BANK_REMOTE_PHY,
1709 MDIO_REMOTE_PHY_MISC_RX_STATUS,
1710 &cl37_fsm_recieved);
1711 if ((cl37_fsm_recieved &
1712 (MDIO_REMOTE_PHY_MISC_RX_STATUS_CL37_FSM_RECEIVED_OVER1G_MSG |
1713 MDIO_REMOTE_PHY_MISC_RX_STATUS_CL37_FSM_RECEIVED_BRCM_OUI_MSG)) !=
1714 (MDIO_REMOTE_PHY_MISC_RX_STATUS_CL37_FSM_RECEIVED_OVER1G_MSG |
1715 MDIO_REMOTE_PHY_MISC_RX_STATUS_CL37_FSM_RECEIVED_BRCM_OUI_MSG)) {
1716 DP(NETIF_MSG_LINK, "No CL37 FSM were received. "
1717 "misc_rx_status(0x8330) = 0x%x\n",
1721 /* The combined cl37/cl73 fsm state information indicating that we are
1722 connected to a device which does not support cl73, but does support
1723 cl37 BAM. In this case we disable cl73 and restart cl37 auto-neg */
1725 CL45_WR_OVER_CL22(bp, phy,
1726 MDIO_REG_BANK_CL73_IEEEB0,
1727 MDIO_CL73_IEEEB0_CL73_AN_CONTROL,
1729 /* Restart CL37 autoneg */
1730 bnx2x_restart_autoneg(phy, params, 0);
1731 DP(NETIF_MSG_LINK, "Disabling CL73, and restarting CL37 autoneg\n");
1734 static void bnx2x_xgxs_an_resolve(struct bnx2x_phy *phy,
1735 struct link_params *params,
1736 struct link_vars *vars,
1739 if (gp_status & MDIO_AN_CL73_OR_37_COMPLETE)
1740 vars->link_status |=
1741 LINK_STATUS_AUTO_NEGOTIATE_COMPLETE;
1743 if (bnx2x_direct_parallel_detect_used(phy, params))
1744 vars->link_status |=
1745 LINK_STATUS_PARALLEL_DETECTION_USED;
1748 static u8 bnx2x_link_settings_status(struct bnx2x_phy *phy,
1749 struct link_params *params,
1750 struct link_vars *vars)
1752 struct bnx2x *bp = params->bp;
1753 u16 new_line_speed , gp_status;
1756 /* Read gp_status */
1757 CL45_RD_OVER_CL22(bp, phy,
1758 MDIO_REG_BANK_GP_STATUS,
1759 MDIO_GP_STATUS_TOP_AN_STATUS1,
1761 if (phy->req_line_speed == SPEED_AUTO_NEG)
1762 vars->link_status |= LINK_STATUS_AUTO_NEGOTIATE_ENABLED;
1763 if (gp_status & MDIO_GP_STATUS_TOP_AN_STATUS1_LINK_STATUS) {
1764 DP(NETIF_MSG_LINK, "phy link up gp_status=0x%x\n",
1767 vars->phy_link_up = 1;
1768 vars->link_status |= LINK_STATUS_LINK_UP;
1770 if (gp_status & MDIO_GP_STATUS_TOP_AN_STATUS1_DUPLEX_STATUS)
1771 vars->duplex = DUPLEX_FULL;
1773 vars->duplex = DUPLEX_HALF;
1775 if (SINGLE_MEDIA_DIRECT(params)) {
1776 bnx2x_flow_ctrl_resolve(phy, params, vars, gp_status);
1777 if (phy->req_line_speed == SPEED_AUTO_NEG)
1778 bnx2x_xgxs_an_resolve(phy, params, vars,
1782 switch (gp_status & GP_STATUS_SPEED_MASK) {
1784 new_line_speed = SPEED_10;
1785 if (vars->duplex == DUPLEX_FULL)
1786 vars->link_status |= LINK_10TFD;
1788 vars->link_status |= LINK_10THD;
1791 case GP_STATUS_100M:
1792 new_line_speed = SPEED_100;
1793 if (vars->duplex == DUPLEX_FULL)
1794 vars->link_status |= LINK_100TXFD;
1796 vars->link_status |= LINK_100TXHD;
1800 case GP_STATUS_1G_KX:
1801 new_line_speed = SPEED_1000;
1802 if (vars->duplex == DUPLEX_FULL)
1803 vars->link_status |= LINK_1000TFD;
1805 vars->link_status |= LINK_1000THD;
1808 case GP_STATUS_2_5G:
1809 new_line_speed = SPEED_2500;
1810 if (vars->duplex == DUPLEX_FULL)
1811 vars->link_status |= LINK_2500TFD;
1813 vars->link_status |= LINK_2500THD;
1819 "link speed unsupported gp_status 0x%x\n",
1823 case GP_STATUS_10G_KX4:
1824 case GP_STATUS_10G_HIG:
1825 case GP_STATUS_10G_CX4:
1826 new_line_speed = SPEED_10000;
1827 vars->link_status |= LINK_10GTFD;
1830 case GP_STATUS_12G_HIG:
1831 new_line_speed = SPEED_12000;
1832 vars->link_status |= LINK_12GTFD;
1835 case GP_STATUS_12_5G:
1836 new_line_speed = SPEED_12500;
1837 vars->link_status |= LINK_12_5GTFD;
1841 new_line_speed = SPEED_13000;
1842 vars->link_status |= LINK_13GTFD;
1846 new_line_speed = SPEED_15000;
1847 vars->link_status |= LINK_15GTFD;
1851 new_line_speed = SPEED_16000;
1852 vars->link_status |= LINK_16GTFD;
1857 "link speed unsupported gp_status 0x%x\n",
1862 vars->line_speed = new_line_speed;
1865 } else { /* link_down */
1866 DP(NETIF_MSG_LINK, "phy link down\n");
1868 vars->phy_link_up = 0;
1870 vars->duplex = DUPLEX_FULL;
1871 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
1872 vars->mac_type = MAC_TYPE_NONE;
1874 if ((phy->req_line_speed == SPEED_AUTO_NEG) &&
1875 SINGLE_MEDIA_DIRECT(params)) {
1876 /* Check signal is detected */
1877 bnx2x_check_fallback_to_cl37(phy, params);
1881 DP(NETIF_MSG_LINK, "gp_status 0x%x phy_link_up %x line_speed %x\n",
1882 gp_status, vars->phy_link_up, vars->line_speed);
1883 DP(NETIF_MSG_LINK, "duplex %x flow_ctrl 0x%x"
1886 vars->flow_ctrl, vars->autoneg);
1887 DP(NETIF_MSG_LINK, "link_status 0x%x\n", vars->link_status);
1892 static void bnx2x_set_gmii_tx_driver(struct link_params *params)
1894 struct bnx2x *bp = params->bp;
1895 struct bnx2x_phy *phy = ¶ms->phy[INT_PHY];
1901 CL45_RD_OVER_CL22(bp, phy,
1902 MDIO_REG_BANK_OVER_1G,
1903 MDIO_OVER_1G_LP_UP2, &lp_up2);
1905 /* bits [10:7] at lp_up2, positioned at [15:12] */
1906 lp_up2 = (((lp_up2 & MDIO_OVER_1G_LP_UP2_PREEMPHASIS_MASK) >>
1907 MDIO_OVER_1G_LP_UP2_PREEMPHASIS_SHIFT) <<
1908 MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT);
1913 for (bank = MDIO_REG_BANK_TX0; bank <= MDIO_REG_BANK_TX3;
1914 bank += (MDIO_REG_BANK_TX1 - MDIO_REG_BANK_TX0)) {
1915 CL45_RD_OVER_CL22(bp, phy,
1917 MDIO_TX0_TX_DRIVER, &tx_driver);
1919 /* replace tx_driver bits [15:12] */
1921 (tx_driver & MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK)) {
1922 tx_driver &= ~MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK;
1923 tx_driver |= lp_up2;
1924 CL45_WR_OVER_CL22(bp, phy,
1926 MDIO_TX0_TX_DRIVER, tx_driver);
1931 static u8 bnx2x_emac_program(struct link_params *params,
1932 struct link_vars *vars)
1934 struct bnx2x *bp = params->bp;
1935 u8 port = params->port;
1938 DP(NETIF_MSG_LINK, "setting link speed & duplex\n");
1939 bnx2x_bits_dis(bp, GRCBASE_EMAC0 + port*0x400 +
1941 (EMAC_MODE_25G_MODE |
1942 EMAC_MODE_PORT_MII_10M |
1943 EMAC_MODE_HALF_DUPLEX));
1944 switch (vars->line_speed) {
1946 mode |= EMAC_MODE_PORT_MII_10M;
1950 mode |= EMAC_MODE_PORT_MII;
1954 mode |= EMAC_MODE_PORT_GMII;
1958 mode |= (EMAC_MODE_25G_MODE | EMAC_MODE_PORT_GMII);
1962 /* 10G not valid for EMAC */
1963 DP(NETIF_MSG_LINK, "Invalid line_speed 0x%x\n",
1968 if (vars->duplex == DUPLEX_HALF)
1969 mode |= EMAC_MODE_HALF_DUPLEX;
1971 GRCBASE_EMAC0 + port*0x400 + EMAC_REG_EMAC_MODE,
1974 bnx2x_set_led(params, LED_MODE_OPER, vars->line_speed);
1978 static void bnx2x_set_preemphasis(struct bnx2x_phy *phy,
1979 struct link_params *params)
1983 struct bnx2x *bp = params->bp;
1985 for (bank = MDIO_REG_BANK_RX0, i = 0; bank <= MDIO_REG_BANK_RX3;
1986 bank += (MDIO_REG_BANK_RX1-MDIO_REG_BANK_RX0), i++) {
1987 CL45_WR_OVER_CL22(bp, phy,
1989 MDIO_RX0_RX_EQ_BOOST,
1990 phy->rx_preemphasis[i]);
1993 for (bank = MDIO_REG_BANK_TX0, i = 0; bank <= MDIO_REG_BANK_TX3;
1994 bank += (MDIO_REG_BANK_TX1 - MDIO_REG_BANK_TX0), i++) {
1995 CL45_WR_OVER_CL22(bp, phy,
1998 phy->tx_preemphasis[i]);
2002 static void bnx2x_init_internal_phy(struct bnx2x_phy *phy,
2003 struct link_params *params,
2004 struct link_vars *vars)
2006 struct bnx2x *bp = params->bp;
2007 u8 enable_cl73 = (SINGLE_MEDIA_DIRECT(params) ||
2008 (params->loopback_mode == LOOPBACK_XGXS));
2009 if (!(vars->phy_flags & PHY_SGMII_FLAG)) {
2010 if (SINGLE_MEDIA_DIRECT(params) &&
2011 (params->feature_config_flags &
2012 FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED))
2013 bnx2x_set_preemphasis(phy, params);
2015 /* forced speed requested? */
2016 if (vars->line_speed != SPEED_AUTO_NEG ||
2017 (SINGLE_MEDIA_DIRECT(params) &&
2018 params->loopback_mode == LOOPBACK_EXT)) {
2019 DP(NETIF_MSG_LINK, "not SGMII, no AN\n");
2021 /* disable autoneg */
2022 bnx2x_set_autoneg(phy, params, vars, 0);
2024 /* program speed and duplex */
2025 bnx2x_program_serdes(phy, params, vars);
2027 } else { /* AN_mode */
2028 DP(NETIF_MSG_LINK, "not SGMII, AN\n");
2031 bnx2x_set_brcm_cl37_advertisment(phy, params);
2033 /* program duplex & pause advertisement (for aneg) */
2034 bnx2x_set_ieee_aneg_advertisment(phy, params,
2037 /* enable autoneg */
2038 bnx2x_set_autoneg(phy, params, vars, enable_cl73);
2040 /* enable and restart AN */
2041 bnx2x_restart_autoneg(phy, params, enable_cl73);
2044 } else { /* SGMII mode */
2045 DP(NETIF_MSG_LINK, "SGMII\n");
2047 bnx2x_initialize_sgmii_process(phy, params, vars);
2051 static u8 bnx2x_init_serdes(struct bnx2x_phy *phy,
2052 struct link_params *params,
2053 struct link_vars *vars)
2056 vars->phy_flags |= PHY_SGMII_FLAG;
2057 bnx2x_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc);
2058 bnx2x_set_aer_mmd(params, phy);
2059 rc = bnx2x_reset_unicore(params, phy, 1);
2060 /* reset the SerDes and wait for reset bit return low */
2063 bnx2x_set_aer_mmd(params, phy);
2068 static u8 bnx2x_init_xgxs(struct bnx2x_phy *phy,
2069 struct link_params *params,
2070 struct link_vars *vars)
2073 vars->phy_flags = PHY_XGXS_FLAG;
2074 if ((phy->req_line_speed &&
2075 ((phy->req_line_speed == SPEED_100) ||
2076 (phy->req_line_speed == SPEED_10))) ||
2077 (!phy->req_line_speed &&
2078 (phy->speed_cap_mask >=
2079 PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_FULL) &&
2080 (phy->speed_cap_mask <
2081 PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)
2083 vars->phy_flags |= PHY_SGMII_FLAG;
2085 vars->phy_flags &= ~PHY_SGMII_FLAG;
2087 bnx2x_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc);
2088 bnx2x_set_aer_mmd(params, phy);
2089 bnx2x_set_master_ln(params, phy);
2091 rc = bnx2x_reset_unicore(params, phy, 0);
2092 /* reset the SerDes and wait for reset bit return low */
2096 bnx2x_set_aer_mmd(params, phy);
2098 /* setting the masterLn_def again after the reset */
2099 bnx2x_set_master_ln(params, phy);
2100 bnx2x_set_swap_lanes(params, phy);
2105 static u16 bnx2x_wait_reset_complete(struct bnx2x *bp,
2106 struct bnx2x_phy *phy)
2109 /* Wait for soft reset to get cleared upto 1 sec */
2110 for (cnt = 0; cnt < 1000; cnt++) {
2111 bnx2x_cl45_read(bp, phy,
2112 MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, &ctrl);
2113 if (!(ctrl & (1<<15)))
2117 DP(NETIF_MSG_LINK, "control reg 0x%x (after %d ms)\n", ctrl, cnt);
2121 static void bnx2x_link_int_enable(struct link_params *params)
2123 u8 port = params->port;
2125 struct bnx2x *bp = params->bp;
2127 /* setting the status to report on link up
2128 for either XGXS or SerDes */
2130 if (params->switch_cfg == SWITCH_CFG_10G) {
2131 mask = (NIG_MASK_XGXS0_LINK10G |
2132 NIG_MASK_XGXS0_LINK_STATUS);
2133 DP(NETIF_MSG_LINK, "enabled XGXS interrupt\n");
2134 if (!(SINGLE_MEDIA_DIRECT(params)) &&
2135 params->phy[INT_PHY].type !=
2136 PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE) {
2137 mask |= NIG_MASK_MI_INT;
2138 DP(NETIF_MSG_LINK, "enabled external phy int\n");
2141 } else { /* SerDes */
2142 mask = NIG_MASK_SERDES0_LINK_STATUS;
2143 DP(NETIF_MSG_LINK, "enabled SerDes interrupt\n");
2144 if (!(SINGLE_MEDIA_DIRECT(params)) &&
2145 params->phy[INT_PHY].type !=
2146 PORT_HW_CFG_SERDES_EXT_PHY_TYPE_NOT_CONN) {
2147 mask |= NIG_MASK_MI_INT;
2148 DP(NETIF_MSG_LINK, "enabled external phy int\n");
2152 NIG_REG_MASK_INTERRUPT_PORT0 + port*4,
2155 DP(NETIF_MSG_LINK, "port %x, is_xgxs %x, int_status 0x%x\n", port,
2156 (params->switch_cfg == SWITCH_CFG_10G),
2157 REG_RD(bp, NIG_REG_STATUS_INTERRUPT_PORT0 + port*4));
2158 DP(NETIF_MSG_LINK, " int_mask 0x%x, MI_INT %x, SERDES_LINK %x\n",
2159 REG_RD(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4),
2160 REG_RD(bp, NIG_REG_EMAC0_STATUS_MISC_MI_INT + port*0x18),
2161 REG_RD(bp, NIG_REG_SERDES0_STATUS_LINK_STATUS+port*0x3c));
2162 DP(NETIF_MSG_LINK, " 10G %x, XGXS_LINK %x\n",
2163 REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK10G + port*0x68),
2164 REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK_STATUS + port*0x68));
2167 static void bnx2x_8481_rearm_latch_signal(struct bnx2x *bp, u8 port,
2170 u32 latch_status = 0, is_mi_int_status;
2171 /* Disable the MI INT ( external phy int )
2172 * by writing 1 to the status register. Link down indication
2173 * is high-active-signal, so in this case we need to write the
2174 * status to clear the XOR
2176 /* Read Latched signals */
2177 latch_status = REG_RD(bp,
2178 NIG_REG_LATCH_STATUS_0 + port*8);
2179 is_mi_int_status = REG_RD(bp,
2180 NIG_REG_STATUS_INTERRUPT_PORT0 + port*4);
2181 DP(NETIF_MSG_LINK, "original_signal = 0x%x, nig_status = 0x%x,"
2182 "latch_status = 0x%x\n",
2183 is_mi_int, is_mi_int_status, latch_status);
2184 /* Handle only those with latched-signal=up.*/
2185 if (latch_status & 1) {
2186 /* For all latched-signal=up,Write original_signal to status */
2189 NIG_REG_STATUS_INTERRUPT_PORT0
2191 NIG_STATUS_EMAC0_MI_INT);
2194 NIG_REG_STATUS_INTERRUPT_PORT0
2196 NIG_STATUS_EMAC0_MI_INT);
2197 /* For all latched-signal=up : Re-Arm Latch signals */
2198 REG_WR(bp, NIG_REG_LATCH_STATUS_0 + port*8,
2199 (latch_status & 0xfffe) | (latch_status & 1));
2203 static void bnx2x_link_int_ack(struct link_params *params,
2204 struct link_vars *vars, u8 is_10g,
2207 struct bnx2x *bp = params->bp;
2208 u8 port = params->port;
2210 /* first reset all status
2211 * we assume only one line will be change at a time */
2212 bnx2x_bits_dis(bp, NIG_REG_STATUS_INTERRUPT_PORT0 + port*4,
2213 (NIG_STATUS_XGXS0_LINK10G |
2214 NIG_STATUS_XGXS0_LINK_STATUS |
2215 NIG_STATUS_SERDES0_LINK_STATUS));
2216 if ((params->phy[EXT_PHY1].type
2217 == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481) ||
2218 (params->phy[EXT_PHY1].type
2219 == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823)) {
2220 bnx2x_8481_rearm_latch_signal(bp, port, is_mi_int);
2222 if (vars->phy_link_up) {
2224 /* Disable the 10G link interrupt
2225 * by writing 1 to the status register
2227 DP(NETIF_MSG_LINK, "10G XGXS phy link up\n");
2229 NIG_REG_STATUS_INTERRUPT_PORT0 + port*4,
2230 NIG_STATUS_XGXS0_LINK10G);
2232 } else if (params->switch_cfg == SWITCH_CFG_10G) {
2233 /* Disable the link interrupt
2234 * by writing 1 to the relevant lane
2235 * in the status register
2237 u32 ser_lane = ((params->lane_config &
2238 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_MASK) >>
2239 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_SHIFT);
2241 DP(NETIF_MSG_LINK, "%d speed XGXS phy link up\n",
2244 NIG_REG_STATUS_INTERRUPT_PORT0 + port*4,
2246 NIG_STATUS_XGXS0_LINK_STATUS_SIZE));
2248 } else { /* SerDes */
2249 DP(NETIF_MSG_LINK, "SerDes phy link up\n");
2250 /* Disable the link interrupt
2251 * by writing 1 to the status register
2254 NIG_REG_STATUS_INTERRUPT_PORT0 + port*4,
2255 NIG_STATUS_SERDES0_LINK_STATUS);
2261 static u8 bnx2x_format_ver(u32 num, u8 *str, u16 *len)
2264 u32 mask = 0xf0000000;
2268 /* Need more than 10chars for this format */
2275 digit = ((num & mask) >> shift);
2277 *str_ptr = digit + '0';
2279 *str_ptr = digit - 0xa + 'a';
2291 static u8 bnx2x_null_format_ver(u32 spirom_ver, u8 *str, u16 *len)
2298 u8 bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded,
2299 u8 *version, u16 len)
2304 u8 *ver_p = version;
2305 if (version == NULL || params == NULL)
2309 /* Extract first external phy*/
2311 spirom_ver = REG_RD(bp, params->phy[EXT_PHY1].ver_addr);
2313 if (params->phy[EXT_PHY1].format_fw_ver)
2314 status |= params->phy[EXT_PHY1].format_fw_ver(spirom_ver,
2320 static void bnx2x_set_xgxs_loopback(struct bnx2x_phy *phy,
2321 struct link_params *params)
2323 u8 port = params->port;
2324 struct bnx2x *bp = params->bp;
2326 if (phy->req_line_speed != SPEED_1000) {
2329 DP(NETIF_MSG_LINK, "XGXS 10G loopback enable\n");
2331 /* change the uni_phy_addr in the nig */
2332 md_devad = REG_RD(bp, (NIG_REG_XGXS0_CTRL_MD_DEVAD +
2335 REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_DEVAD + port*0x18, 0x5);
2337 bnx2x_cl45_write(bp, phy,
2339 (MDIO_REG_BANK_AER_BLOCK +
2340 (MDIO_AER_BLOCK_AER_REG & 0xf)),
2343 bnx2x_cl45_write(bp, phy,
2345 (MDIO_REG_BANK_CL73_IEEEB0 +
2346 (MDIO_CL73_IEEEB0_CL73_AN_CONTROL & 0xf)),
2349 /* set aer mmd back */
2350 bnx2x_set_aer_mmd(params, phy);
2353 REG_WR(bp, NIG_REG_XGXS0_CTRL_MD_DEVAD + port*0x18,
2358 DP(NETIF_MSG_LINK, "XGXS 1G loopback enable\n");
2359 bnx2x_cl45_read(bp, phy, 5,
2360 (MDIO_REG_BANK_COMBO_IEEE0 +
2361 (MDIO_COMBO_IEEE0_MII_CONTROL & 0xf)),
2363 bnx2x_cl45_write(bp, phy, 5,
2364 (MDIO_REG_BANK_COMBO_IEEE0 +
2365 (MDIO_COMBO_IEEE0_MII_CONTROL & 0xf)),
2367 MDIO_COMBO_IEEO_MII_CONTROL_LOOPBACK);
2372 *------------------------------------------------------------------------
2373 * bnx2x_override_led_value -
2375 * Override the led value of the requested led
2377 *------------------------------------------------------------------------
2379 u8 bnx2x_override_led_value(struct bnx2x *bp, u8 port,
2380 u32 led_idx, u32 value)
2384 /* If port 0 then use EMAC0, else use EMAC1*/
2385 u32 emac_base = (port) ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
2388 "bnx2x_override_led_value() port %x led_idx %d value %d\n",
2389 port, led_idx, value);
2392 case 0: /* 10MB led */
2393 /* Read the current value of the LED register in
2395 reg_val = REG_RD(bp, emac_base + EMAC_REG_EMAC_LED);
2396 /* Set the OVERRIDE bit to 1 */
2397 reg_val |= EMAC_LED_OVERRIDE;
2398 /* If value is 1, set the 10M_OVERRIDE bit,
2399 otherwise reset it.*/
2400 reg_val = (value == 1) ? (reg_val | EMAC_LED_10MB_OVERRIDE) :
2401 (reg_val & ~EMAC_LED_10MB_OVERRIDE);
2402 REG_WR(bp, emac_base + EMAC_REG_EMAC_LED, reg_val);
2404 case 1: /*100MB led */
2405 /*Read the current value of the LED register in
2407 reg_val = REG_RD(bp, emac_base + EMAC_REG_EMAC_LED);
2408 /* Set the OVERRIDE bit to 1 */
2409 reg_val |= EMAC_LED_OVERRIDE;
2410 /* If value is 1, set the 100M_OVERRIDE bit,
2411 otherwise reset it.*/
2412 reg_val = (value == 1) ? (reg_val | EMAC_LED_100MB_OVERRIDE) :
2413 (reg_val & ~EMAC_LED_100MB_OVERRIDE);
2414 REG_WR(bp, emac_base + EMAC_REG_EMAC_LED, reg_val);
2416 case 2: /* 1000MB led */
2417 /* Read the current value of the LED register in the
2419 reg_val = REG_RD(bp, emac_base + EMAC_REG_EMAC_LED);
2420 /* Set the OVERRIDE bit to 1 */
2421 reg_val |= EMAC_LED_OVERRIDE;
2422 /* If value is 1, set the 1000M_OVERRIDE bit, otherwise
2424 reg_val = (value == 1) ? (reg_val | EMAC_LED_1000MB_OVERRIDE) :
2425 (reg_val & ~EMAC_LED_1000MB_OVERRIDE);
2426 REG_WR(bp, emac_base + EMAC_REG_EMAC_LED, reg_val);
2428 case 3: /* 2500MB led */
2429 /* Read the current value of the LED register in the
2431 reg_val = REG_RD(bp, emac_base + EMAC_REG_EMAC_LED);
2432 /* Set the OVERRIDE bit to 1 */
2433 reg_val |= EMAC_LED_OVERRIDE;
2434 /* If value is 1, set the 2500M_OVERRIDE bit, otherwise
2436 reg_val = (value == 1) ? (reg_val | EMAC_LED_2500MB_OVERRIDE) :
2437 (reg_val & ~EMAC_LED_2500MB_OVERRIDE);
2438 REG_WR(bp, emac_base + EMAC_REG_EMAC_LED, reg_val);
2440 case 4: /*10G led */
2442 REG_WR(bp, NIG_REG_LED_10G_P0,
2445 REG_WR(bp, NIG_REG_LED_10G_P1,
2449 case 5: /* TRAFFIC led */
2450 /* Find if the traffic control is via BMAC or EMAC */
2452 reg_val = REG_RD(bp, NIG_REG_NIG_EMAC0_EN);
2454 reg_val = REG_RD(bp, NIG_REG_NIG_EMAC1_EN);
2456 /* Override the traffic led in the EMAC:*/
2458 /* Read the current value of the LED register in
2460 reg_val = REG_RD(bp, emac_base +
2462 /* Set the TRAFFIC_OVERRIDE bit to 1 */
2463 reg_val |= EMAC_LED_OVERRIDE;
2464 /* If value is 1, set the TRAFFIC bit, otherwise
2466 reg_val = (value == 1) ? (reg_val | EMAC_LED_TRAFFIC) :
2467 (reg_val & ~EMAC_LED_TRAFFIC);
2468 REG_WR(bp, emac_base + EMAC_REG_EMAC_LED, reg_val);
2469 } else { /* Override the traffic led in the BMAC: */
2470 REG_WR(bp, NIG_REG_LED_CONTROL_OVERRIDE_TRAFFIC_P0
2472 REG_WR(bp, NIG_REG_LED_CONTROL_TRAFFIC_P0 + port*4,
2478 "bnx2x_override_led_value() unknown led index %d "
2479 "(should be 0-5)\n", led_idx);
2486 u8 bnx2x_set_led(struct link_params *params, u8 mode, u32 speed)
2488 u8 port = params->port;
2489 u16 hw_led_mode = params->hw_led_mode;
2492 u32 emac_base = port ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
2493 struct bnx2x *bp = params->bp;
2494 DP(NETIF_MSG_LINK, "bnx2x_set_led: port %x, mode %d\n", port, mode);
2495 DP(NETIF_MSG_LINK, "speed 0x%x, hw_led_mode 0x%x\n",
2496 speed, hw_led_mode);
2499 REG_WR(bp, NIG_REG_LED_10G_P0 + port*4, 0);
2500 REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4,
2501 SHARED_HW_CFG_LED_MAC1);
2503 tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED);
2504 EMAC_WR(bp, EMAC_REG_EMAC_LED, (tmp | EMAC_LED_OVERRIDE));
2508 if (SINGLE_MEDIA_DIRECT(params)) {
2509 REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0);
2510 REG_WR(bp, NIG_REG_LED_10G_P0 + port*4, 1);
2512 REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4,
2516 REG_WR(bp, NIG_REG_LED_CONTROL_OVERRIDE_TRAFFIC_P0 +
2518 /* Set blinking rate to ~15.9Hz */
2519 REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_P0 + port*4,
2520 LED_BLINK_RATE_VAL);
2521 REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_ENA_P0 +
2523 tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED);
2524 EMAC_WR(bp, EMAC_REG_EMAC_LED,
2525 (tmp & (~EMAC_LED_OVERRIDE)));
2527 if (CHIP_IS_E1(bp) &&
2528 ((speed == SPEED_2500) ||
2529 (speed == SPEED_1000) ||
2530 (speed == SPEED_100) ||
2531 (speed == SPEED_10))) {
2532 /* On Everest 1 Ax chip versions for speeds less than
2533 10G LED scheme is different */
2534 REG_WR(bp, NIG_REG_LED_CONTROL_OVERRIDE_TRAFFIC_P0
2536 REG_WR(bp, NIG_REG_LED_CONTROL_TRAFFIC_P0 +
2538 REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_TRAFFIC_P0 +
2545 DP(NETIF_MSG_LINK, "bnx2x_set_led: Invalid led mode %d\n",
2553 u8 bnx2x_test_link(struct link_params *params, struct link_vars *vars)
2555 struct bnx2x *bp = params->bp;
2556 u16 gp_status = 0, phy_index = 0;
2558 CL45_RD_OVER_CL22(bp, ¶ms->phy[INT_PHY],
2559 MDIO_REG_BANK_GP_STATUS,
2560 MDIO_GP_STATUS_TOP_AN_STATUS1,
2562 /* link is up only if both local phy and external phy are up */
2563 if (gp_status & MDIO_GP_STATUS_TOP_AN_STATUS1_LINK_STATUS) {
2564 u8 ext_phy_link_up = 1;
2565 struct link_vars temp_vars;
2566 for (phy_index = EXT_PHY1; phy_index < params->num_phys;
2568 if (params->phy[phy_index].read_status)
2570 params->phy[phy_index].read_status(
2571 ¶ms->phy[phy_index],
2572 params, &temp_vars);
2574 if (ext_phy_link_up)
2580 static u8 bnx2x_link_initialize(struct link_params *params,
2581 struct link_vars *vars)
2584 u8 phy_index, non_ext_phy;
2585 struct bnx2x *bp = params->bp;
2587 * In case of external phy existence, the line speed would be the
2588 * line speed linked up by the external phy. In case it is direct
2589 * only, then the line_speed during initialization will be
2590 * equal to the req_line_speed
2592 vars->line_speed = params->phy[INT_PHY].req_line_speed;
2595 * Initialize the internal phy in case this is a direct board
2596 * (no external phys), or this board has external phy which requires
2600 if (params->phy[INT_PHY].config_init)
2601 params->phy[INT_PHY].config_init(
2602 ¶ms->phy[INT_PHY],
2605 /* init ext phy and enable link state int */
2606 non_ext_phy = (SINGLE_MEDIA_DIRECT(params) ||
2607 (params->loopback_mode == LOOPBACK_XGXS));
2610 (params->phy[EXT_PHY1].flags & FLAGS_INIT_XGXS_FIRST) ||
2611 (params->loopback_mode == LOOPBACK_EXT_PHY)) {
2612 struct bnx2x_phy *phy = ¶ms->phy[INT_PHY];
2613 if (vars->line_speed == SPEED_AUTO_NEG)
2614 bnx2x_set_parallel_detection(phy, params);
2615 bnx2x_init_internal_phy(phy, params, vars);
2618 /* Init external phy*/
2620 for (phy_index = EXT_PHY1; phy_index < params->num_phys;
2622 params->phy[phy_index].config_init(
2623 ¶ms->phy[phy_index],
2627 /* Reset the interrupt indication after phy was initialized */
2628 bnx2x_bits_dis(bp, NIG_REG_STATUS_INTERRUPT_PORT0 +
2630 (NIG_STATUS_XGXS0_LINK10G |
2631 NIG_STATUS_XGXS0_LINK_STATUS |
2632 NIG_STATUS_SERDES0_LINK_STATUS |
2637 static void bnx2x_int_link_reset(struct bnx2x_phy *phy,
2638 struct link_params *params)
2640 /* reset the SerDes/XGXS */
2641 REG_WR(params->bp, GRCBASE_MISC +
2642 MISC_REGISTERS_RESET_REG_3_CLEAR,
2643 (0x1ff << (params->port*16)));
2646 static void bnx2x_common_ext_link_reset(struct bnx2x_phy *phy,
2647 struct link_params *params)
2649 struct bnx2x *bp = params->bp;
2652 gpio_port = params->port;
2653 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1,
2654 MISC_REGISTERS_GPIO_OUTPUT_LOW,
2656 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
2657 MISC_REGISTERS_GPIO_OUTPUT_LOW,
2659 DP(NETIF_MSG_LINK, "reset external PHY\n");
2662 static u8 bnx2x_update_link_down(struct link_params *params,
2663 struct link_vars *vars)
2665 struct bnx2x *bp = params->bp;
2666 u8 port = params->port;
2668 DP(NETIF_MSG_LINK, "Port %x: Link is down\n", port);
2669 bnx2x_set_led(params, LED_MODE_OFF, 0);
2671 /* indicate no mac active */
2672 vars->mac_type = MAC_TYPE_NONE;
2674 /* update shared memory */
2675 vars->link_status = 0;
2676 vars->line_speed = 0;
2677 bnx2x_update_mng(params, vars->link_status);
2679 /* activate nig drain */
2680 REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + port*4, 1);
2683 REG_WR(bp, NIG_REG_NIG_EMAC0_EN + port*4, 0);
2688 bnx2x_bmac_rx_disable(bp, params->port);
2689 REG_WR(bp, GRCBASE_MISC +
2690 MISC_REGISTERS_RESET_REG_2_CLEAR,
2691 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
2695 static u8 bnx2x_update_link_up(struct link_params *params,
2696 struct link_vars *vars,
2699 struct bnx2x *bp = params->bp;
2700 u8 port = params->port;
2703 vars->link_status |= LINK_STATUS_LINK_UP;
2704 if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX)
2705 vars->link_status |=
2706 LINK_STATUS_TX_FLOW_CONTROL_ENABLED;
2708 if (vars->flow_ctrl & BNX2X_FLOW_CTRL_RX)
2709 vars->link_status |=
2710 LINK_STATUS_RX_FLOW_CONTROL_ENABLED;
2712 bnx2x_bmac_enable(params, vars, 0);
2713 bnx2x_set_led(params, LED_MODE_OPER, SPEED_10000);
2715 rc = bnx2x_emac_program(params, vars);
2717 bnx2x_emac_enable(params, vars, 0);
2720 if ((vars->link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE)
2721 && (!(vars->phy_flags & PHY_SGMII_FLAG)) &&
2722 SINGLE_MEDIA_DIRECT(params))
2723 bnx2x_set_gmii_tx_driver(params);
2727 rc |= bnx2x_pbf_update(params, vars->flow_ctrl,
2731 REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + port*4, 0);
2733 /* update shared memory */
2734 bnx2x_update_mng(params, vars->link_status);
2739 * The bnx2x_link_update function should be called upon link
2741 * Link is considered up as follows:
2742 * - DIRECT_SINGLE_MEDIA - Only XGXS link (internal link) needs
2744 * - SINGLE_MEDIA - The link between the 577xx and the external
2745 * phy (XGXS) need to up as well as the external link of the
2747 * - DUAL_MEDIA - The link between the 577xx and the first
2748 * external phy needs to be up, and at least one of the 2
2749 * external phy link must be up.
2751 u8 bnx2x_link_update(struct link_params *params, struct link_vars *vars)
2753 struct bnx2x *bp = params->bp;
2754 struct link_vars phy_vars[MAX_PHYS];
2755 u8 port = params->port;
2756 u8 link_10g, phy_index;
2757 u8 ext_phy_link_up = 0, cur_link_up, rc = 0;
2759 u16 ext_phy_line_speed = 0, prev_line_speed = vars->line_speed;
2760 u8 active_external_phy = INT_PHY;
2761 vars->link_status = 0;
2762 for (phy_index = INT_PHY; phy_index < params->num_phys;
2764 phy_vars[phy_index].flow_ctrl = 0;
2765 phy_vars[phy_index].link_status = 0;
2766 phy_vars[phy_index].line_speed = 0;
2767 phy_vars[phy_index].duplex = DUPLEX_FULL;
2768 phy_vars[phy_index].phy_link_up = 0;
2769 phy_vars[phy_index].link_up = 0;
2772 DP(NETIF_MSG_LINK, "port %x, XGXS?%x, int_status 0x%x\n",
2773 port, (vars->phy_flags & PHY_XGXS_FLAG),
2774 REG_RD(bp, NIG_REG_STATUS_INTERRUPT_PORT0 + port*4));
2776 is_mi_int = (u8)(REG_RD(bp, NIG_REG_EMAC0_STATUS_MISC_MI_INT +
2778 DP(NETIF_MSG_LINK, "int_mask 0x%x MI_INT %x, SERDES_LINK %x\n",
2779 REG_RD(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4),
2782 NIG_REG_SERDES0_STATUS_LINK_STATUS + port*0x3c));
2784 DP(NETIF_MSG_LINK, " 10G %x, XGXS_LINK %x\n",
2785 REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK10G + port*0x68),
2786 REG_RD(bp, NIG_REG_XGXS0_STATUS_LINK_STATUS + port*0x68));
2789 REG_WR(bp, NIG_REG_NIG_EMAC0_EN + port*4, 0);
2793 * Check external link change only for external phys, and apply
2794 * priority selection between them in case the link on both phys
2795 * is up. Note that the instead of the common vars, a temporary
2796 * vars argument is used since each phy may have different link/
2797 * speed/duplex result
2799 for (phy_index = EXT_PHY1; phy_index < params->num_phys;
2801 struct bnx2x_phy *phy = ¶ms->phy[phy_index];
2802 if (!phy->read_status)
2804 /* Read link status and params of this ext phy */
2805 cur_link_up = phy->read_status(phy, params,
2806 &phy_vars[phy_index]);
2808 DP(NETIF_MSG_LINK, "phy in index %d link is up\n",
2811 DP(NETIF_MSG_LINK, "phy in index %d link is down\n",
2816 if (!ext_phy_link_up) {
2817 ext_phy_link_up = 1;
2818 active_external_phy = phy_index;
2821 prev_line_speed = vars->line_speed;
2824 * Read the status of the internal phy. In case of
2825 * DIRECT_SINGLE_MEDIA board, this link is the external link,
2826 * otherwise this is the link between the 577xx and the first
2829 if (params->phy[INT_PHY].read_status)
2830 params->phy[INT_PHY].read_status(
2831 ¶ms->phy[INT_PHY],
2834 * The INT_PHY flow control reside in the vars. This include the
2835 * case where the speed or flow control are not set to AUTO.
2836 * Otherwise, the active external phy flow control result is set
2837 * to the vars. The ext_phy_line_speed is needed to check if the
2838 * speed is different between the internal phy and external phy.
2839 * This case may be result of intermediate link speed change.
2841 if (active_external_phy > INT_PHY) {
2842 vars->flow_ctrl = phy_vars[active_external_phy].flow_ctrl;
2844 * Link speed is taken from the XGXS. AN and FC result from
2847 vars->link_status |= phy_vars[active_external_phy].link_status;
2848 ext_phy_line_speed = phy_vars[active_external_phy].line_speed;
2849 vars->duplex = phy_vars[active_external_phy].duplex;
2850 if (params->phy[active_external_phy].supported &
2852 vars->link_status |= LINK_STATUS_SERDES_LINK;
2853 DP(NETIF_MSG_LINK, "Active external phy selected: %x\n",
2854 active_external_phy);
2856 DP(NETIF_MSG_LINK, "vars->flow_ctrl = 0x%x, vars->link_status = 0x%x,"
2857 " ext_phy_line_speed = %d\n", vars->flow_ctrl,
2858 vars->link_status, ext_phy_line_speed);
2860 * Upon link speed change set the NIG into drain mode. Comes to
2861 * deals with possible FIFO glitch due to clk change when speed
2862 * is decreased without link down indicator
2865 if (vars->phy_link_up) {
2866 if (!(SINGLE_MEDIA_DIRECT(params)) && ext_phy_link_up &&
2867 (ext_phy_line_speed != vars->line_speed)) {
2868 DP(NETIF_MSG_LINK, "Internal link speed %d is"
2869 " different than the external"
2870 " link speed %d\n", vars->line_speed,
2871 ext_phy_line_speed);
2872 vars->phy_link_up = 0;
2873 } else if (prev_line_speed != vars->line_speed) {
2874 REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE
2875 + params->port*4, 0);
2880 /* anything 10 and over uses the bmac */
2881 link_10g = ((vars->line_speed == SPEED_10000) ||
2882 (vars->line_speed == SPEED_12000) ||
2883 (vars->line_speed == SPEED_12500) ||
2884 (vars->line_speed == SPEED_13000) ||
2885 (vars->line_speed == SPEED_15000) ||
2886 (vars->line_speed == SPEED_16000));
2888 bnx2x_link_int_ack(params, vars, link_10g, is_mi_int);
2891 * In case external phy link is up, and internal link is down
2892 * (not initialized yet probably after link initialization, it
2893 * needs to be initialized.
2894 * Note that after link down-up as result of cable plug, the xgxs
2895 * link would probably become up again without the need
2898 if (!(SINGLE_MEDIA_DIRECT(params))) {
2899 DP(NETIF_MSG_LINK, "ext_phy_link_up = %d, int_link_up = %d,"
2900 " init_preceding = %d\n", ext_phy_link_up,
2902 params->phy[EXT_PHY1].flags &
2903 FLAGS_INIT_XGXS_FIRST);
2904 if (!(params->phy[EXT_PHY1].flags &
2905 FLAGS_INIT_XGXS_FIRST)
2906 && ext_phy_link_up && !vars->phy_link_up) {
2907 vars->line_speed = ext_phy_line_speed;
2908 if (vars->line_speed < SPEED_1000)
2909 vars->phy_flags |= PHY_SGMII_FLAG;
2911 vars->phy_flags &= ~PHY_SGMII_FLAG;
2912 bnx2x_init_internal_phy(¶ms->phy[INT_PHY],
2918 * Link is up only if both local phy and external phy (in case of
2919 * non-direct board) are up
2921 vars->link_up = (vars->phy_link_up &&
2923 SINGLE_MEDIA_DIRECT(params)));
2926 rc = bnx2x_update_link_up(params, vars, link_10g);
2928 rc = bnx2x_update_link_down(params, vars);
2934 /*****************************************************************************/
2935 /* External Phy section */
2936 /*****************************************************************************/
2937 void bnx2x_ext_phy_hw_reset(struct bnx2x *bp, u8 port)
2939 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1,
2940 MISC_REGISTERS_GPIO_OUTPUT_LOW, port);
2942 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1,
2943 MISC_REGISTERS_GPIO_OUTPUT_HIGH, port);
2946 static void bnx2x_save_spirom_version(struct bnx2x *bp, u8 port,
2947 u32 spirom_ver, u32 ver_addr)
2949 DP(NETIF_MSG_LINK, "FW version 0x%x:0x%x for port %d\n",
2950 (u16)(spirom_ver>>16), (u16)spirom_ver, port);
2953 REG_WR(bp, ver_addr, spirom_ver);
2956 static void bnx2x_save_bcm_spirom_ver(struct bnx2x *bp,
2957 struct bnx2x_phy *phy,
2960 u16 fw_ver1, fw_ver2;
2962 bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD,
2963 MDIO_PMA_REG_ROM_VER1, &fw_ver1);
2964 bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD,
2965 MDIO_PMA_REG_ROM_VER2, &fw_ver2);
2966 bnx2x_save_spirom_version(bp, port, (u32)(fw_ver1<<16 | fw_ver2),
2970 static void bnx2x_ext_phy_set_pause(struct link_params *params,
2971 struct bnx2x_phy *phy,
2972 struct link_vars *vars)
2975 struct bnx2x *bp = params->bp;
2976 /* read modify write pause advertizing */
2977 bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_ADV_PAUSE, &val);
2979 val &= ~MDIO_AN_REG_ADV_PAUSE_BOTH;
2981 /* Please refer to Table 28B-3 of 802.3ab-1999 spec. */
2982 bnx2x_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc);
2983 if ((vars->ieee_fc &
2984 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC) ==
2985 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC) {
2986 val |= MDIO_AN_REG_ADV_PAUSE_ASYMMETRIC;
2988 if ((vars->ieee_fc &
2989 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) ==
2990 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) {
2991 val |= MDIO_AN_REG_ADV_PAUSE_PAUSE;
2993 DP(NETIF_MSG_LINK, "Ext phy AN advertize 0x%x\n", val);
2994 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_ADV_PAUSE, val);
2997 static u8 bnx2x_ext_phy_resolve_fc(struct bnx2x_phy *phy,
2998 struct link_params *params,
2999 struct link_vars *vars)
3001 struct bnx2x *bp = params->bp;
3002 u16 ld_pause; /* local */
3003 u16 lp_pause; /* link partner */
3008 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
3010 if (phy->req_flow_ctrl != BNX2X_FLOW_CTRL_AUTO)
3011 vars->flow_ctrl = phy->req_flow_ctrl;
3012 else if (phy->req_line_speed != SPEED_AUTO_NEG)
3013 vars->flow_ctrl = params->req_fc_auto_adv;
3014 else if (vars->link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE) {
3016 bnx2x_cl45_read(bp, phy,
3018 MDIO_AN_REG_ADV_PAUSE, &ld_pause);
3019 bnx2x_cl45_read(bp, phy,
3021 MDIO_AN_REG_LP_AUTO_NEG, &lp_pause);
3022 pause_result = (ld_pause &
3023 MDIO_AN_REG_ADV_PAUSE_MASK) >> 8;
3024 pause_result |= (lp_pause &
3025 MDIO_AN_REG_ADV_PAUSE_MASK) >> 10;
3026 DP(NETIF_MSG_LINK, "Ext PHY pause result 0x%x\n",
3028 bnx2x_pause_resolve(vars, pause_result);
3033 static void bnx2x_ext_phy_10G_an_resolve(struct bnx2x *bp,
3034 struct bnx2x_phy *phy,
3035 struct link_vars *vars)
3038 bnx2x_cl45_read(bp, phy,
3040 MDIO_AN_REG_STATUS, &val);
3041 bnx2x_cl45_read(bp, phy,
3043 MDIO_AN_REG_STATUS, &val);
3045 vars->link_status |= LINK_STATUS_AUTO_NEGOTIATE_COMPLETE;
3046 if ((val & (1<<0)) == 0)
3047 vars->link_status |= LINK_STATUS_PARALLEL_DETECTION_USED;
3050 /******************************************************************/
3051 /* common BCM8073/BCM8727 PHY SECTION */
3052 /******************************************************************/
3053 static void bnx2x_8073_resolve_fc(struct bnx2x_phy *phy,
3054 struct link_params *params,
3055 struct link_vars *vars)
3057 struct bnx2x *bp = params->bp;
3058 if (phy->req_line_speed == SPEED_10 ||
3059 phy->req_line_speed == SPEED_100) {
3060 vars->flow_ctrl = phy->req_flow_ctrl;
3064 if (bnx2x_ext_phy_resolve_fc(phy, params, vars) &&
3065 (vars->flow_ctrl == BNX2X_FLOW_CTRL_NONE)) {
3067 u16 ld_pause; /* local */
3068 u16 lp_pause; /* link partner */
3069 bnx2x_cl45_read(bp, phy,
3071 MDIO_AN_REG_CL37_FC_LD, &ld_pause);
3073 bnx2x_cl45_read(bp, phy,
3075 MDIO_AN_REG_CL37_FC_LP, &lp_pause);
3076 pause_result = (ld_pause &
3077 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) >> 5;
3078 pause_result |= (lp_pause &
3079 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) >> 7;
3081 bnx2x_pause_resolve(vars, pause_result);
3082 DP(NETIF_MSG_LINK, "Ext PHY CL37 pause result 0x%x\n",
3087 static void bnx2x_8073_8727_external_rom_boot(struct bnx2x *bp,
3088 struct bnx2x_phy *phy,
3091 /* Boot port from external ROM */
3093 bnx2x_cl45_write(bp, phy,
3095 MDIO_PMA_REG_GEN_CTRL,
3098 /* ucode reboot and rst */
3099 bnx2x_cl45_write(bp, phy,
3101 MDIO_PMA_REG_GEN_CTRL,
3104 bnx2x_cl45_write(bp, phy,
3106 MDIO_PMA_REG_MISC_CTRL1, 0x0001);
3108 /* Reset internal microprocessor */
3109 bnx2x_cl45_write(bp, phy,
3111 MDIO_PMA_REG_GEN_CTRL,
3112 MDIO_PMA_REG_GEN_CTRL_ROM_MICRO_RESET);
3114 /* Release srst bit */
3115 bnx2x_cl45_write(bp, phy,
3117 MDIO_PMA_REG_GEN_CTRL,
3118 MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP);
3120 /* wait for 120ms for code download via SPI port */
3123 /* Clear ser_boot_ctl bit */
3124 bnx2x_cl45_write(bp, phy,
3126 MDIO_PMA_REG_MISC_CTRL1, 0x0000);
3127 bnx2x_save_bcm_spirom_ver(bp, phy, port);
3130 static void bnx2x_8073_set_xaui_low_power_mode(struct bnx2x *bp,
3131 struct bnx2x_phy *phy)
3134 bnx2x_cl45_read(bp, phy,
3135 MDIO_PMA_DEVAD, MDIO_PMA_REG_8073_CHIP_REV, &val);
3138 /* Mustn't set low power mode in 8073 A0 */
3142 /* Disable PLL sequencer (use read-modify-write to clear bit 13) */
3143 bnx2x_cl45_read(bp, phy,
3144 MDIO_XS_DEVAD, MDIO_XS_PLL_SEQUENCER, &val);
3146 bnx2x_cl45_write(bp, phy,
3147 MDIO_XS_DEVAD, MDIO_XS_PLL_SEQUENCER, val);
3150 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x805E, 0x1077);
3151 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x805D, 0x0000);
3152 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x805C, 0x030B);
3153 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x805B, 0x1240);
3154 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x805A, 0x2490);
3157 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80A7, 0x0C74);
3158 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80A6, 0x9041);
3159 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80A5, 0x4640);
3162 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80FE, 0x01C4);
3163 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80FD, 0x9249);
3164 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, 0x80FC, 0x2015);
3166 /* Enable PLL sequencer (use read-modify-write to set bit 13) */
3167 bnx2x_cl45_read(bp, phy, MDIO_XS_DEVAD, MDIO_XS_PLL_SEQUENCER, &val);
3169 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, MDIO_XS_PLL_SEQUENCER, val);
3172 /******************************************************************/
3173 /* BCM8073 PHY SECTION */
3174 /******************************************************************/
3175 static u8 bnx2x_8073_is_snr_needed(struct bnx2x *bp, struct bnx2x_phy *phy)
3177 /* This is only required for 8073A1, version 102 only */
3180 /* Read 8073 HW revision*/
3181 bnx2x_cl45_read(bp, phy,
3183 MDIO_PMA_REG_8073_CHIP_REV, &val);
3186 /* No need to workaround in 8073 A1 */
3190 bnx2x_cl45_read(bp, phy,
3192 MDIO_PMA_REG_ROM_VER2, &val);
3194 /* SNR should be applied only for version 0x102 */
3201 static u8 bnx2x_8073_xaui_wa(struct bnx2x *bp, struct bnx2x_phy *phy)
3203 u16 val, cnt, cnt1 ;
3205 bnx2x_cl45_read(bp, phy,
3207 MDIO_PMA_REG_8073_CHIP_REV, &val);
3210 /* No need to workaround in 8073 A1 */
3213 /* XAUI workaround in 8073 A0: */
3215 /* After loading the boot ROM and restarting Autoneg,
3216 poll Dev1, Reg $C820: */
3218 for (cnt = 0; cnt < 1000; cnt++) {
3219 bnx2x_cl45_read(bp, phy,
3221 MDIO_PMA_REG_8073_SPEED_LINK_STATUS,
3223 /* If bit [14] = 0 or bit [13] = 0, continue on with
3224 system initialization (XAUI work-around not required,
3225 as these bits indicate 2.5G or 1G link up). */
3226 if (!(val & (1<<14)) || !(val & (1<<13))) {
3227 DP(NETIF_MSG_LINK, "XAUI work-around not required\n");
3229 } else if (!(val & (1<<15))) {
3230 DP(NETIF_MSG_LINK, "clc bit 15 went off\n");
3231 /* If bit 15 is 0, then poll Dev1, Reg $C841 until
3232 it's MSB (bit 15) goes to 1 (indicating that the
3233 XAUI workaround has completed),
3234 then continue on with system initialization.*/
3235 for (cnt1 = 0; cnt1 < 1000; cnt1++) {
3236 bnx2x_cl45_read(bp, phy,
3238 MDIO_PMA_REG_8073_XAUI_WA, &val);
3239 if (val & (1<<15)) {
3241 "XAUI workaround has completed\n");
3250 DP(NETIF_MSG_LINK, "Warning: XAUI work-around timeout !!!\n");
3254 static void bnx2x_807x_force_10G(struct bnx2x *bp, struct bnx2x_phy *phy)
3256 /* Force KR or KX */
3257 bnx2x_cl45_write(bp, phy,
3258 MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 0x2040);
3259 bnx2x_cl45_write(bp, phy,
3260 MDIO_PMA_DEVAD, MDIO_PMA_REG_10G_CTRL2, 0x000b);
3261 bnx2x_cl45_write(bp, phy,
3262 MDIO_PMA_DEVAD, MDIO_PMA_REG_BCM_CTRL, 0x0000);
3263 bnx2x_cl45_write(bp, phy,
3264 MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, 0x0000);
3267 static void bnx2x_8073_set_pause_cl37(struct link_params *params,
3268 struct bnx2x_phy *phy,
3269 struct link_vars *vars)
3272 struct bnx2x *bp = params->bp;
3273 bnx2x_cl45_read(bp, phy,
3274 MDIO_AN_DEVAD, MDIO_AN_REG_CL37_FC_LD, &cl37_val);
3276 cl37_val &= ~MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH;
3277 /* Please refer to Table 28B-3 of 802.3ab-1999 spec. */
3278 bnx2x_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc);
3279 if ((vars->ieee_fc &
3280 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_SYMMETRIC) ==
3281 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_SYMMETRIC) {
3282 cl37_val |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_SYMMETRIC;
3284 if ((vars->ieee_fc &
3285 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC) ==
3286 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC) {
3287 cl37_val |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC;
3289 if ((vars->ieee_fc &
3290 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) ==
3291 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) {
3292 cl37_val |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH;
3295 "Ext phy AN advertize cl37 0x%x\n", cl37_val);
3297 bnx2x_cl45_write(bp, phy,
3298 MDIO_AN_DEVAD, MDIO_AN_REG_CL37_FC_LD, cl37_val);
3302 static u8 bnx2x_8073_config_init(struct bnx2x_phy *phy,
3303 struct link_params *params,
3304 struct link_vars *vars)
3306 struct bnx2x *bp = params->bp;
3309 DP(NETIF_MSG_LINK, "Init 8073\n");
3311 gpio_port = params->port;
3312 /* Restore normal power mode*/
3313 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
3314 MISC_REGISTERS_GPIO_OUTPUT_HIGH, gpio_port);
3316 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1,
3317 MISC_REGISTERS_GPIO_OUTPUT_HIGH, gpio_port);
3320 bnx2x_cl45_write(bp, phy,
3321 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM_CTRL, (1<<2));
3322 bnx2x_cl45_write(bp, phy,
3323 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_CTRL, 0x0004);
3325 bnx2x_8073_set_pause_cl37(params, phy, vars);
3327 bnx2x_8073_set_xaui_low_power_mode(bp, phy);
3329 bnx2x_cl45_read(bp, phy,
3330 MDIO_PMA_DEVAD, MDIO_PMA_REG_M8051_MSGOUT_REG, &tmp1);
3332 bnx2x_cl45_read(bp, phy,
3333 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM, &tmp1);
3335 DP(NETIF_MSG_LINK, "Before rom RX_ALARM(port1): 0x%x\n", tmp1);
3337 /* Enable CL37 BAM */
3338 bnx2x_cl45_read(bp, phy,
3340 MDIO_AN_REG_8073_BAM, &val);
3341 bnx2x_cl45_write(bp, phy,
3343 MDIO_AN_REG_8073_BAM, val | 1);
3345 if (params->loopback_mode == LOOPBACK_EXT) {
3346 bnx2x_807x_force_10G(bp, phy);
3347 DP(NETIF_MSG_LINK, "Forced speed 10G on 807X\n");
3350 bnx2x_cl45_write(bp, phy,
3351 MDIO_PMA_DEVAD, MDIO_PMA_REG_BCM_CTRL, 0x0002);
3353 if (phy->req_line_speed != SPEED_AUTO_NEG) {
3354 if (phy->req_line_speed == SPEED_10000) {
3356 } else if (phy->req_line_speed == SPEED_2500) {
3358 /* Note that 2.5G works only
3359 when used with 1G advertisment */
3364 if (phy->speed_cap_mask &
3365 PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)
3368 /* Note that 2.5G works only when
3369 used with 1G advertisment */
3370 if (phy->speed_cap_mask &
3371 (PORT_HW_CFG_SPEED_CAPABILITY_D0_1G |
3372 PORT_HW_CFG_SPEED_CAPABILITY_D0_2_5G))
3374 DP(NETIF_MSG_LINK, "807x autoneg val = 0x%x\n", val);
3377 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_ADV, val);
3378 bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_8073_2_5G, &tmp1);
3380 if (((phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_2_5G) &&
3381 (phy->req_line_speed == SPEED_AUTO_NEG)) ||
3382 (phy->req_line_speed == SPEED_2500)) {
3384 /* Allow 2.5G for A1 and above */
3385 bnx2x_cl45_read(bp, phy,
3386 MDIO_PMA_DEVAD, MDIO_PMA_REG_8073_CHIP_REV,
3388 DP(NETIF_MSG_LINK, "Add 2.5G\n");
3394 DP(NETIF_MSG_LINK, "Disable 2.5G\n");
3398 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_8073_2_5G, tmp1);
3399 /* Add support for CL37 (passive mode) II */
3401 bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_CL37_FC_LD, &tmp1);
3402 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_CL37_FC_LD,
3403 (tmp1 | ((phy->req_duplex == DUPLEX_FULL) ?
3406 /* Add support for CL37 (passive mode) III */
3407 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_CL37_AN, 0x1000);
3409 /* The SNR will improve about 2db by changing
3410 BW and FEE main tap. Rest commands are executed
3412 if (bnx2x_8073_is_snr_needed(bp, phy))
3413 bnx2x_cl45_write(bp, phy,
3414 MDIO_PMA_DEVAD, MDIO_PMA_REG_EDC_FFE_MAIN,
3417 /* Enable FEC (Forware Error Correction) Request in the AN */
3418 bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_ADV2, &tmp1);
3420 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_ADV2, tmp1);
3422 bnx2x_ext_phy_set_pause(params, phy, vars);
3424 /* Restart autoneg */
3426 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, 0x1200);
3427 DP(NETIF_MSG_LINK, "807x Autoneg Restart: Advertise 1G=%x, 10G=%x\n",
3428 ((val & (1<<5)) > 0), ((val & (1<<7)) > 0));
3432 static u8 bnx2x_8073_read_status(struct bnx2x_phy *phy,
3433 struct link_params *params,
3434 struct link_vars *vars)
3436 struct bnx2x *bp = params->bp;
3439 u16 link_status = 0;
3440 u16 an1000_status = 0;
3442 bnx2x_cl45_read(bp, phy,
3443 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_STATUS, &val1);
3445 DP(NETIF_MSG_LINK, "8703 LASI status 0x%x\n", val1);
3447 /* clear the interrupt LASI status register */
3448 bnx2x_cl45_read(bp, phy,
3449 MDIO_PCS_DEVAD, MDIO_PCS_REG_STATUS, &val2);
3450 bnx2x_cl45_read(bp, phy,
3451 MDIO_PCS_DEVAD, MDIO_PCS_REG_STATUS, &val1);
3452 DP(NETIF_MSG_LINK, "807x PCS status 0x%x->0x%x\n", val2, val1);
3454 bnx2x_cl45_read(bp, phy,
3455 MDIO_PMA_DEVAD, MDIO_PMA_REG_M8051_MSGOUT_REG, &val1);
3457 /* Check the LASI */
3458 bnx2x_cl45_read(bp, phy,
3459 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM, &val2);
3461 DP(NETIF_MSG_LINK, "KR 0x9003 0x%x\n", val2);
3463 /* Check the link status */
3464 bnx2x_cl45_read(bp, phy,
3465 MDIO_PCS_DEVAD, MDIO_PCS_REG_STATUS, &val2);
3466 DP(NETIF_MSG_LINK, "KR PCS status 0x%x\n", val2);
3468 bnx2x_cl45_read(bp, phy,
3469 MDIO_PMA_DEVAD, MDIO_PMA_REG_STATUS, &val2);
3470 bnx2x_cl45_read(bp, phy,
3471 MDIO_PMA_DEVAD, MDIO_PMA_REG_STATUS, &val1);
3472 link_up = ((val1 & 4) == 4);
3473 DP(NETIF_MSG_LINK, "PMA_REG_STATUS=0x%x\n", val1);
3476 ((phy->req_line_speed != SPEED_10000))) {
3477 if (bnx2x_8073_xaui_wa(bp, phy) != 0)
3480 bnx2x_cl45_read(bp, phy,
3481 MDIO_AN_DEVAD, MDIO_AN_REG_LINK_STATUS, &an1000_status);
3482 bnx2x_cl45_read(bp, phy,
3483 MDIO_AN_DEVAD, MDIO_AN_REG_LINK_STATUS, &an1000_status);
3485 /* Check the link status on 1.1.2 */
3486 bnx2x_cl45_read(bp, phy,
3487 MDIO_PMA_DEVAD, MDIO_PMA_REG_STATUS, &val2);
3488 bnx2x_cl45_read(bp, phy,
3489 MDIO_PMA_DEVAD, MDIO_PMA_REG_STATUS, &val1);
3490 DP(NETIF_MSG_LINK, "KR PMA status 0x%x->0x%x,"
3491 "an_link_status=0x%x\n", val2, val1, an1000_status);
3493 link_up = (((val1 & 4) == 4) || (an1000_status & (1<<1)));
3494 if (link_up && bnx2x_8073_is_snr_needed(bp, phy)) {
3495 /* The SNR will improve about 2dbby
3496 changing the BW and FEE main tap.*/
3497 /* The 1st write to change FFE main
3498 tap is set before restart AN */
3499 /* Change PLL Bandwidth in EDC
3501 bnx2x_cl45_write(bp, phy,
3502 MDIO_PMA_DEVAD, MDIO_PMA_REG_PLL_BANDWIDTH,
3505 /* Change CDR Bandwidth in EDC register */
3506 bnx2x_cl45_write(bp, phy,
3507 MDIO_PMA_DEVAD, MDIO_PMA_REG_CDR_BANDWIDTH,
3510 bnx2x_cl45_read(bp, phy,
3511 MDIO_PMA_DEVAD, MDIO_PMA_REG_8073_SPEED_LINK_STATUS,
3514 /* Bits 0..2 --> speed detected, bits 13..15--> link is down */
3515 if ((link_status & (1<<2)) && (!(link_status & (1<<15)))) {
3517 vars->line_speed = SPEED_10000;
3518 DP(NETIF_MSG_LINK, "port %x: External link up in 10G\n",
3520 } else if ((link_status & (1<<1)) && (!(link_status & (1<<14)))) {
3522 vars->line_speed = SPEED_2500;
3523 DP(NETIF_MSG_LINK, "port %x: External link up in 2.5G\n",
3525 } else if ((link_status & (1<<0)) && (!(link_status & (1<<13)))) {
3527 vars->line_speed = SPEED_1000;
3528 DP(NETIF_MSG_LINK, "port %x: External link up in 1G\n",
3532 DP(NETIF_MSG_LINK, "port %x: External link is down\n",
3537 bnx2x_ext_phy_10G_an_resolve(bp, phy, vars);
3538 bnx2x_8073_resolve_fc(phy, params, vars);
3543 static void bnx2x_8073_link_reset(struct bnx2x_phy *phy,
3544 struct link_params *params)
3546 struct bnx2x *bp = params->bp;
3548 gpio_port = params->port;
3549 DP(NETIF_MSG_LINK, "Setting 8073 port %d into low power mode\n",
3551 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
3552 MISC_REGISTERS_GPIO_OUTPUT_LOW,
3556 /******************************************************************/
3557 /* BCM8705 PHY SECTION */
3558 /******************************************************************/
3559 static u8 bnx2x_8705_config_init(struct bnx2x_phy *phy,
3560 struct link_params *params,
3561 struct link_vars *vars)
3563 struct bnx2x *bp = params->bp;
3564 DP(NETIF_MSG_LINK, "init 8705\n");
3565 /* Restore normal power mode*/
3566 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
3567 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port);
3569 bnx2x_ext_phy_hw_reset(bp, params->port);
3570 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 0xa040);
3571 bnx2x_wait_reset_complete(bp, phy);
3573 bnx2x_cl45_write(bp, phy,
3574 MDIO_PMA_DEVAD, MDIO_PMA_REG_MISC_CTRL, 0x8288);
3575 bnx2x_cl45_write(bp, phy,
3576 MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, 0x7fbf);
3577 bnx2x_cl45_write(bp, phy,
3578 MDIO_PMA_DEVAD, MDIO_PMA_REG_CMU_PLL_BYPASS, 0x0100);
3579 bnx2x_cl45_write(bp, phy,
3580 MDIO_WIS_DEVAD, MDIO_WIS_REG_LASI_CNTL, 0x1);
3581 /* BCM8705 doesn't have microcode, hence the 0 */
3582 bnx2x_save_spirom_version(bp, params->port, params->shmem_base, 0);
3586 static u8 bnx2x_8705_read_status(struct bnx2x_phy *phy,
3587 struct link_params *params,
3588 struct link_vars *vars)
3592 struct bnx2x *bp = params->bp;
3593 DP(NETIF_MSG_LINK, "read status 8705\n");
3594 bnx2x_cl45_read(bp, phy,
3595 MDIO_WIS_DEVAD, MDIO_WIS_REG_LASI_STATUS, &val1);
3596 DP(NETIF_MSG_LINK, "8705 LASI status 0x%x\n", val1);
3598 bnx2x_cl45_read(bp, phy,
3599 MDIO_WIS_DEVAD, MDIO_WIS_REG_LASI_STATUS, &val1);
3600 DP(NETIF_MSG_LINK, "8705 LASI status 0x%x\n", val1);
3602 bnx2x_cl45_read(bp, phy,
3603 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_SD, &rx_sd);
3605 bnx2x_cl45_read(bp, phy,
3606 MDIO_PMA_DEVAD, 0xc809, &val1);
3607 bnx2x_cl45_read(bp, phy,
3608 MDIO_PMA_DEVAD, 0xc809, &val1);
3610 DP(NETIF_MSG_LINK, "8705 1.c809 val=0x%x\n", val1);
3611 link_up = ((rx_sd & 0x1) && (val1 & (1<<9)) && ((val1 & (1<<8)) == 0));
3613 vars->line_speed = SPEED_10000;
3614 bnx2x_ext_phy_resolve_fc(phy, params, vars);
3619 /******************************************************************/
3620 /* SFP+ module Section */
3621 /******************************************************************/
3622 static void bnx2x_sfp_set_transmitter(struct bnx2x *bp,
3623 struct bnx2x_phy *phy,
3629 DP(NETIF_MSG_LINK, "Setting transmitter tx_en=%x for port %x\n",
3631 /* Disable/Enable transmitter ( TX laser of the SFP+ module.)*/
3632 bnx2x_cl45_read(bp, phy,
3634 MDIO_PMA_REG_PHY_IDENTIFIER,
3642 bnx2x_cl45_write(bp, phy,
3644 MDIO_PMA_REG_PHY_IDENTIFIER,
3648 static u8 bnx2x_8726_read_sfp_module_eeprom(struct bnx2x_phy *phy,
3649 struct link_params *params,
3650 u16 addr, u8 byte_cnt, u8 *o_buf)
3652 struct bnx2x *bp = params->bp;
3655 if (byte_cnt > 16) {
3656 DP(NETIF_MSG_LINK, "Reading from eeprom is"
3657 " is limited to 0xf\n");
3660 /* Set the read command byte count */
3661 bnx2x_cl45_write(bp, phy,
3662 MDIO_PMA_DEVAD, MDIO_PMA_REG_SFP_TWO_WIRE_BYTE_CNT,
3663 (byte_cnt | 0xa000));
3665 /* Set the read command address */
3666 bnx2x_cl45_write(bp, phy,
3667 MDIO_PMA_DEVAD, MDIO_PMA_REG_SFP_TWO_WIRE_MEM_ADDR,
3670 /* Activate read command */
3671 bnx2x_cl45_write(bp, phy,
3672 MDIO_PMA_DEVAD, MDIO_PMA_REG_SFP_TWO_WIRE_CTRL,
3675 /* Wait up to 500us for command complete status */
3676 for (i = 0; i < 100; i++) {
3677 bnx2x_cl45_read(bp, phy,
3679 MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, &val);
3680 if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) ==
3681 MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE)
3686 if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) !=
3687 MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE) {
3689 "Got bad status 0x%x when reading from SFP+ EEPROM\n",
3690 (val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK));
3694 /* Read the buffer */
3695 for (i = 0; i < byte_cnt; i++) {
3696 bnx2x_cl45_read(bp, phy,
3698 MDIO_PMA_REG_8726_TWO_WIRE_DATA_BUF + i, &val);
3699 o_buf[i] = (u8)(val & MDIO_PMA_REG_8726_TWO_WIRE_DATA_MASK);
3702 for (i = 0; i < 100; i++) {
3703 bnx2x_cl45_read(bp, phy,
3705 MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, &val);
3706 if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) ==
3707 MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IDLE)
3714 static u8 bnx2x_8727_read_sfp_module_eeprom(struct bnx2x_phy *phy,
3715 struct link_params *params,
3716 u16 addr, u8 byte_cnt, u8 *o_buf)
3718 struct bnx2x *bp = params->bp;
3721 if (byte_cnt > 16) {
3722 DP(NETIF_MSG_LINK, "Reading from eeprom is"
3723 " is limited to 0xf\n");
3727 /* Need to read from 1.8000 to clear it */
3728 bnx2x_cl45_read(bp, phy,
3730 MDIO_PMA_REG_SFP_TWO_WIRE_CTRL,
3733 /* Set the read command byte count */
3734 bnx2x_cl45_write(bp, phy,
3736 MDIO_PMA_REG_SFP_TWO_WIRE_BYTE_CNT,
3737 ((byte_cnt < 2) ? 2 : byte_cnt));
3739 /* Set the read command address */
3740 bnx2x_cl45_write(bp, phy,
3742 MDIO_PMA_REG_SFP_TWO_WIRE_MEM_ADDR,
3744 /* Set the destination address */
3745 bnx2x_cl45_write(bp, phy,
3748 MDIO_PMA_REG_8727_TWO_WIRE_DATA_BUF);
3750 /* Activate read command */
3751 bnx2x_cl45_write(bp, phy,
3753 MDIO_PMA_REG_SFP_TWO_WIRE_CTRL,
3755 /* Wait appropriate time for two-wire command to finish before
3756 polling the status register */
3759 /* Wait up to 500us for command complete status */
3760 for (i = 0; i < 100; i++) {
3761 bnx2x_cl45_read(bp, phy,
3763 MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, &val);
3764 if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) ==
3765 MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE)
3770 if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) !=
3771 MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE) {
3773 "Got bad status 0x%x when reading from SFP+ EEPROM\n",
3774 (val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK));
3778 /* Read the buffer */
3779 for (i = 0; i < byte_cnt; i++) {
3780 bnx2x_cl45_read(bp, phy,
3782 MDIO_PMA_REG_8727_TWO_WIRE_DATA_BUF + i, &val);
3783 o_buf[i] = (u8)(val & MDIO_PMA_REG_8727_TWO_WIRE_DATA_MASK);
3786 for (i = 0; i < 100; i++) {
3787 bnx2x_cl45_read(bp, phy,
3789 MDIO_PMA_REG_SFP_TWO_WIRE_CTRL, &val);
3790 if ((val & MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK) ==
3791 MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IDLE)
3799 u8 bnx2x_read_sfp_module_eeprom(struct bnx2x_phy *phy,
3800 struct link_params *params, u16 addr,
3801 u8 byte_cnt, u8 *o_buf)
3803 if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726)
3804 return bnx2x_8726_read_sfp_module_eeprom(phy, params, addr,
3806 else if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727)
3807 return bnx2x_8727_read_sfp_module_eeprom(phy, params, addr,
3812 static u8 bnx2x_get_edc_mode(struct bnx2x_phy *phy,
3813 struct link_params *params,
3816 struct bnx2x *bp = params->bp;
3817 u8 val, check_limiting_mode = 0;
3818 *edc_mode = EDC_MODE_LIMITING;
3820 /* First check for copper cable */
3821 if (bnx2x_read_sfp_module_eeprom(phy,
3823 SFP_EEPROM_CON_TYPE_ADDR,
3826 DP(NETIF_MSG_LINK, "Failed to read from SFP+ module EEPROM\n");
3831 case SFP_EEPROM_CON_TYPE_VAL_COPPER:
3833 u8 copper_module_type;
3835 /* Check if its active cable( includes SFP+ module)
3837 if (bnx2x_read_sfp_module_eeprom(phy,
3839 SFP_EEPROM_FC_TX_TECH_ADDR,
3841 &copper_module_type) !=
3844 "Failed to read copper-cable-type"
3845 " from SFP+ EEPROM\n");
3849 if (copper_module_type &
3850 SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_ACTIVE) {
3851 DP(NETIF_MSG_LINK, "Active Copper cable detected\n");
3852 check_limiting_mode = 1;
3853 } else if (copper_module_type &
3854 SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE) {
3855 DP(NETIF_MSG_LINK, "Passive Copper"
3856 " cable detected\n");
3858 EDC_MODE_PASSIVE_DAC;
3860 DP(NETIF_MSG_LINK, "Unknown copper-cable-"
3861 "type 0x%x !!!\n", copper_module_type);
3866 case SFP_EEPROM_CON_TYPE_VAL_LC:
3867 DP(NETIF_MSG_LINK, "Optic module detected\n");
3868 check_limiting_mode = 1;
3871 DP(NETIF_MSG_LINK, "Unable to determine module type 0x%x !!!\n",
3876 if (check_limiting_mode) {
3877 u8 options[SFP_EEPROM_OPTIONS_SIZE];
3878 if (bnx2x_read_sfp_module_eeprom(phy,
3880 SFP_EEPROM_OPTIONS_ADDR,
3881 SFP_EEPROM_OPTIONS_SIZE,
3883 DP(NETIF_MSG_LINK, "Failed to read Option"
3884 " field from module EEPROM\n");
3887 if ((options[0] & SFP_EEPROM_OPTIONS_LINEAR_RX_OUT_MASK))
3888 *edc_mode = EDC_MODE_LINEAR;
3890 *edc_mode = EDC_MODE_LIMITING;
3892 DP(NETIF_MSG_LINK, "EDC mode is set to 0x%x\n", *edc_mode);
3895 /* This function read the relevant field from the module ( SFP+ ),
3896 and verify it is compliant with this board */
3897 static u8 bnx2x_verify_sfp_module(struct bnx2x_phy *phy,
3898 struct link_params *params)
3900 struct bnx2x *bp = params->bp;
3903 char vendor_name[SFP_EEPROM_VENDOR_NAME_SIZE+1];
3904 char vendor_pn[SFP_EEPROM_PART_NO_SIZE+1];
3906 val = REG_RD(bp, params->shmem_base +
3907 offsetof(struct shmem_region, dev_info.
3908 port_feature_config[params->port].config));
3909 if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) ==
3910 PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_NO_ENFORCEMENT) {
3911 DP(NETIF_MSG_LINK, "NOT enforcing module verification\n");
3915 /* Ask the FW to validate the module */
3916 if (!(params->feature_config_flags &
3917 FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY)) {
3918 DP(NETIF_MSG_LINK, "FW does not support OPT MDL "
3923 fw_resp = bnx2x_fw_command(bp, DRV_MSG_CODE_VRFY_OPT_MDL);
3924 if (fw_resp == FW_MSG_CODE_VRFY_OPT_MDL_SUCCESS) {
3925 DP(NETIF_MSG_LINK, "Approved module\n");
3929 /* format the warning message */
3930 if (bnx2x_read_sfp_module_eeprom(phy,
3932 SFP_EEPROM_VENDOR_NAME_ADDR,
3933 SFP_EEPROM_VENDOR_NAME_SIZE,
3935 vendor_name[0] = '\0';
3937 vendor_name[SFP_EEPROM_VENDOR_NAME_SIZE] = '\0';
3938 if (bnx2x_read_sfp_module_eeprom(phy,
3940 SFP_EEPROM_PART_NO_ADDR,
3941 SFP_EEPROM_PART_NO_SIZE,
3943 vendor_pn[0] = '\0';
3945 vendor_pn[SFP_EEPROM_PART_NO_SIZE] = '\0';
3947 netdev_info(bp->dev, "Warning: Unqualified SFP+ module detected,"
3948 " Port %d from %s part number %s\n",
3949 params->port, vendor_name, vendor_pn);
3953 static u8 bnx2x_wait_for_sfp_module_initialized(struct bnx2x_phy *phy,
3954 struct link_params *params)
3958 struct bnx2x *bp = params->bp;
3960 /* Initialization time after hot-plug may take up to 300ms for some
3961 phys type ( e.g. JDSU ) */
3962 for (timeout = 0; timeout < 60; timeout++) {
3963 if (bnx2x_read_sfp_module_eeprom(phy, params, 1, 1, &val)
3965 DP(NETIF_MSG_LINK, "SFP+ module initialization "
3966 "took %d ms\n", timeout * 5);
3974 static void bnx2x_8727_power_module(struct bnx2x *bp,
3975 struct bnx2x_phy *phy,
3977 /* Make sure GPIOs are not using for LED mode */
3980 * In the GPIO register, bit 4 is use to detemine if the GPIOs are
3981 * operating as INPUT or as OUTPUT. Bit 1 is for input, and 0 for
3983 * Bits 0-1 determine the gpios value for OUTPUT in case bit 4 val is 0
3984 * Bits 8-9 determine the gpios value for INPUT in case bit 4 val is 1
3985 * where the 1st bit is the over-current(only input), and 2nd bit is
3986 * for power( only output )
3990 * In case of NOC feature is disabled and power is up, set GPIO control
3991 * as input to enable listening of over-current indication
3993 if (phy->flags & FLAGS_NOC)
3996 FLAGS_NOC) && is_power_up)
4000 * Set GPIO control to OUTPUT, and set the power bit
4001 * to according to the is_power_up
4003 val = ((!(is_power_up)) << 1);
4005 bnx2x_cl45_write(bp, phy,
4007 MDIO_PMA_REG_8727_GPIO_CTRL,
4011 static u8 bnx2x_8726_set_limiting_mode(struct bnx2x *bp,
4012 struct bnx2x_phy *phy,
4015 u16 cur_limiting_mode;
4017 bnx2x_cl45_read(bp, phy,
4019 MDIO_PMA_REG_ROM_VER2,
4020 &cur_limiting_mode);
4021 DP(NETIF_MSG_LINK, "Current Limiting mode is 0x%x\n",
4024 if (edc_mode == EDC_MODE_LIMITING) {
4026 "Setting LIMITING MODE\n");
4027 bnx2x_cl45_write(bp, phy,
4029 MDIO_PMA_REG_ROM_VER2,
4031 } else { /* LRM mode ( default )*/
4033 DP(NETIF_MSG_LINK, "Setting LRM MODE\n");
4035 /* Changing to LRM mode takes quite few seconds.
4036 So do it only if current mode is limiting
4037 ( default is LRM )*/
4038 if (cur_limiting_mode != EDC_MODE_LIMITING)
4041 bnx2x_cl45_write(bp, phy,
4043 MDIO_PMA_REG_LRM_MODE,
4045 bnx2x_cl45_write(bp, phy,
4047 MDIO_PMA_REG_ROM_VER2,
4049 bnx2x_cl45_write(bp, phy,
4051 MDIO_PMA_REG_MISC_CTRL0,
4053 bnx2x_cl45_write(bp, phy,
4055 MDIO_PMA_REG_LRM_MODE,
4061 static u8 bnx2x_8727_set_limiting_mode(struct bnx2x *bp,
4062 struct bnx2x_phy *phy,
4067 bnx2x_cl45_read(bp, phy,
4069 MDIO_PMA_REG_PHY_IDENTIFIER,
4072 bnx2x_cl45_write(bp, phy,
4074 MDIO_PMA_REG_PHY_IDENTIFIER,
4075 (phy_identifier & ~(1<<9)));
4077 bnx2x_cl45_read(bp, phy,
4079 MDIO_PMA_REG_ROM_VER2,
4081 /* Keep the MSB 8-bits, and set the LSB 8-bits with the edc_mode */
4082 bnx2x_cl45_write(bp, phy,
4084 MDIO_PMA_REG_ROM_VER2,
4085 (rom_ver2_val & 0xff00) | (edc_mode & 0x00ff));
4087 bnx2x_cl45_write(bp, phy,
4089 MDIO_PMA_REG_PHY_IDENTIFIER,
4090 (phy_identifier | (1<<9)));
4095 static u8 bnx2x_sfp_module_detection(struct bnx2x_phy *phy,
4096 struct link_params *params)
4098 struct bnx2x *bp = params->bp;
4102 u32 val = REG_RD(bp, params->shmem_base +
4103 offsetof(struct shmem_region, dev_info.
4104 port_feature_config[params->port].config));
4106 DP(NETIF_MSG_LINK, "SFP+ module plugged in/out detected on port %d\n",
4109 if (bnx2x_get_edc_mode(phy, params, &edc_mode) != 0) {
4110 DP(NETIF_MSG_LINK, "Failed to get valid module type\n");
4112 } else if (bnx2x_verify_sfp_module(phy, params) !=
4114 /* check SFP+ module compatibility */
4115 DP(NETIF_MSG_LINK, "Module verification failed!!\n");
4117 /* Turn on fault module-detected led */
4118 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0,
4119 MISC_REGISTERS_GPIO_HIGH,
4121 if ((phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727) &&
4122 ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) ==
4123 PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_POWER_DOWN)) {
4124 /* Shutdown SFP+ module */
4125 DP(NETIF_MSG_LINK, "Shutdown SFP+ module!!\n");
4126 bnx2x_8727_power_module(bp, phy, 0);
4130 /* Turn off fault module-detected led */
4131 DP(NETIF_MSG_LINK, "Turn off fault module-detected led\n");
4132 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0,
4133 MISC_REGISTERS_GPIO_LOW,
4137 /* power up the SFP module */
4138 if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727)
4139 bnx2x_8727_power_module(bp, phy, 1);
4141 /* Check and set limiting mode / LRM mode on 8726.
4142 On 8727 it is done automatically */
4143 if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726)
4144 bnx2x_8726_set_limiting_mode(bp, phy, edc_mode);
4146 bnx2x_8727_set_limiting_mode(bp, phy, edc_mode);
4148 * Enable transmit for this module if the module is approved, or
4149 * if unapproved modules should also enable the Tx laser
4152 (val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) !=
4153 PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER)
4154 bnx2x_sfp_set_transmitter(bp, phy, params->port, 1);
4156 bnx2x_sfp_set_transmitter(bp, phy, params->port, 0);
4161 void bnx2x_handle_module_detect_int(struct link_params *params)
4163 struct bnx2x *bp = params->bp;
4164 struct bnx2x_phy *phy = ¶ms->phy[EXT_PHY1];
4166 u8 port = params->port;
4168 /* Set valid module led off */
4169 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0,
4170 MISC_REGISTERS_GPIO_HIGH,
4173 /* Get current gpio val refelecting module plugged in / out*/
4174 gpio_val = bnx2x_get_gpio(bp, MISC_REGISTERS_GPIO_3, port);
4176 /* Call the handling function in case module is detected */
4177 if (gpio_val == 0) {
4179 bnx2x_set_gpio_int(bp, MISC_REGISTERS_GPIO_3,
4180 MISC_REGISTERS_GPIO_INT_OUTPUT_CLR,
4183 if (bnx2x_wait_for_sfp_module_initialized(phy, params) == 0)
4184 bnx2x_sfp_module_detection(phy, params);
4186 DP(NETIF_MSG_LINK, "SFP+ module is not initialized\n");
4188 u32 val = REG_RD(bp, params->shmem_base +
4189 offsetof(struct shmem_region, dev_info.
4190 port_feature_config[params->port].
4193 bnx2x_set_gpio_int(bp, MISC_REGISTERS_GPIO_3,
4194 MISC_REGISTERS_GPIO_INT_OUTPUT_SET,
4196 /* Module was plugged out. */
4197 /* Disable transmit for this module */
4198 if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) ==
4199 PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER)
4200 bnx2x_sfp_set_transmitter(bp, phy, params->port, 0);
4204 /******************************************************************/
4205 /* common BCM8706/BCM8726 PHY SECTION */
4206 /******************************************************************/
4207 static u8 bnx2x_8706_8726_read_status(struct bnx2x_phy *phy,
4208 struct link_params *params,
4209 struct link_vars *vars)
4212 u16 val1, val2, rx_sd, pcs_status;
4213 struct bnx2x *bp = params->bp;
4214 DP(NETIF_MSG_LINK, "XGXS 8706/8726\n");
4216 bnx2x_cl45_read(bp, phy,
4217 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM, &val2);
4218 /* clear LASI indication*/
4219 bnx2x_cl45_read(bp, phy,
4220 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_STATUS, &val1);
4221 bnx2x_cl45_read(bp, phy,
4222 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_STATUS, &val2);
4223 DP(NETIF_MSG_LINK, "8706/8726 LASI status 0x%x--> 0x%x\n", val1, val2);
4225 bnx2x_cl45_read(bp, phy,
4226 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_SD, &rx_sd);
4227 bnx2x_cl45_read(bp, phy,
4228 MDIO_PCS_DEVAD, MDIO_PCS_REG_STATUS, &pcs_status);
4229 bnx2x_cl45_read(bp, phy,
4230 MDIO_AN_DEVAD, MDIO_AN_REG_LINK_STATUS, &val2);
4231 bnx2x_cl45_read(bp, phy,
4232 MDIO_AN_DEVAD, MDIO_AN_REG_LINK_STATUS, &val2);
4234 DP(NETIF_MSG_LINK, "8706/8726 rx_sd 0x%x pcs_status 0x%x 1Gbps"
4235 " link_status 0x%x\n", rx_sd, pcs_status, val2);
4236 /* link is up if both bit 0 of pmd_rx_sd and
4237 * bit 0 of pcs_status are set, or if the autoneg bit
4240 link_up = ((rx_sd & pcs_status & 0x1) || (val2 & (1<<1)));
4243 vars->line_speed = SPEED_1000;
4245 vars->line_speed = SPEED_10000;
4246 bnx2x_ext_phy_resolve_fc(phy, params, vars);
4251 /******************************************************************/
4252 /* BCM8706 PHY SECTION */
4253 /******************************************************************/
4254 static u8 bnx2x_8706_config_init(struct bnx2x_phy *phy,
4255 struct link_params *params,
4256 struct link_vars *vars)
4259 struct bnx2x *bp = params->bp;
4260 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
4261 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port);
4263 bnx2x_ext_phy_hw_reset(bp, params->port);
4264 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 0xa040);
4265 bnx2x_wait_reset_complete(bp, phy);
4267 /* Wait until fw is loaded */
4268 for (cnt = 0; cnt < 100; cnt++) {
4269 bnx2x_cl45_read(bp, phy,
4270 MDIO_PMA_DEVAD, MDIO_PMA_REG_ROM_VER1, &val);
4275 DP(NETIF_MSG_LINK, "XGXS 8706 is initialized after %d ms\n", cnt);
4276 if ((params->feature_config_flags &
4277 FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED)) {
4280 for (i = 0; i < 4; i++) {
4281 reg = MDIO_XS_8706_REG_BANK_RX0 +
4282 i*(MDIO_XS_8706_REG_BANK_RX1 -
4283 MDIO_XS_8706_REG_BANK_RX0);
4284 bnx2x_cl45_read(bp, phy, MDIO_XS_DEVAD, reg, &val);
4285 /* Clear first 3 bits of the control */
4287 /* Set control bits according to configuration */
4288 val |= (phy->rx_preemphasis[i] & 0x7);
4289 DP(NETIF_MSG_LINK, "Setting RX Equalizer to BCM8706"
4290 " reg 0x%x <-- val 0x%x\n", reg, val);
4291 bnx2x_cl45_write(bp, phy, MDIO_XS_DEVAD, reg, val);
4295 if (phy->req_line_speed == SPEED_10000) {
4296 DP(NETIF_MSG_LINK, "XGXS 8706 force 10Gbps\n");
4298 bnx2x_cl45_write(bp, phy,
4300 MDIO_PMA_REG_DIGITAL_CTRL, 0x400);
4301 bnx2x_cl45_write(bp, phy,
4302 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_CTRL, 1);
4304 /* Force 1Gbps using autoneg with 1G advertisment */
4306 /* Allow CL37 through CL73 */
4307 DP(NETIF_MSG_LINK, "XGXS 8706 AutoNeg\n");
4308 bnx2x_cl45_write(bp, phy,
4309 MDIO_AN_DEVAD, MDIO_AN_REG_CL37_CL73, 0x040c);
4311 /* Enable Full-Duplex advertisment on CL37 */
4312 bnx2x_cl45_write(bp, phy,
4313 MDIO_AN_DEVAD, MDIO_AN_REG_CL37_FC_LP, 0x0020);
4314 /* Enable CL37 AN */
4315 bnx2x_cl45_write(bp, phy,
4316 MDIO_AN_DEVAD, MDIO_AN_REG_CL37_AN, 0x1000);
4318 bnx2x_cl45_write(bp, phy,
4319 MDIO_AN_DEVAD, MDIO_AN_REG_ADV, (1<<5));
4321 /* Enable clause 73 AN */
4322 bnx2x_cl45_write(bp, phy,
4323 MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, 0x1200);
4324 bnx2x_cl45_write(bp, phy,
4325 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM_CTRL,
4327 bnx2x_cl45_write(bp, phy,
4328 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_CTRL,
4331 bnx2x_save_bcm_spirom_ver(bp, phy, params->port);
4335 static u8 bnx2x_8706_read_status(struct bnx2x_phy *phy,
4336 struct link_params *params,
4337 struct link_vars *vars)
4339 return bnx2x_8706_8726_read_status(phy, params, vars);
4342 /******************************************************************/
4343 /* BCM8726 PHY SECTION */
4344 /******************************************************************/
4345 static void bnx2x_8726_config_loopback(struct bnx2x_phy *phy,
4346 struct link_params *params)
4348 struct bnx2x *bp = params->bp;
4349 DP(NETIF_MSG_LINK, "PMA/PMD ext_phy_loopback: 8726\n");
4350 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 0x0001);
4353 static void bnx2x_8726_external_rom_boot(struct bnx2x_phy *phy,
4354 struct link_params *params)
4356 struct bnx2x *bp = params->bp;
4357 /* Need to wait 100ms after reset */
4360 /* Micro controller re-boot */
4361 bnx2x_cl45_write(bp, phy,
4362 MDIO_PMA_DEVAD, MDIO_PMA_REG_GEN_CTRL, 0x018B);
4364 /* Set soft reset */
4365 bnx2x_cl45_write(bp, phy,
4367 MDIO_PMA_REG_GEN_CTRL,
4368 MDIO_PMA_REG_GEN_CTRL_ROM_MICRO_RESET);
4370 bnx2x_cl45_write(bp, phy,
4372 MDIO_PMA_REG_MISC_CTRL1, 0x0001);
4374 bnx2x_cl45_write(bp, phy,
4376 MDIO_PMA_REG_GEN_CTRL,
4377 MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP);
4379 /* wait for 150ms for microcode load */
4382 /* Disable serial boot control, tristates pins SS_N, SCK, MOSI, MISO */
4383 bnx2x_cl45_write(bp, phy,
4385 MDIO_PMA_REG_MISC_CTRL1, 0x0000);
4388 bnx2x_save_bcm_spirom_ver(bp, phy, params->port);
4391 static u8 bnx2x_8726_read_status(struct bnx2x_phy *phy,
4392 struct link_params *params,
4393 struct link_vars *vars)
4395 struct bnx2x *bp = params->bp;
4397 u8 link_up = bnx2x_8706_8726_read_status(phy, params, vars);
4399 bnx2x_cl45_read(bp, phy,
4400 MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER,
4402 if (val1 & (1<<15)) {
4403 DP(NETIF_MSG_LINK, "Tx is disabled\n");
4405 vars->line_speed = 0;
4412 static u8 bnx2x_8726_config_init(struct bnx2x_phy *phy,
4413 struct link_params *params,
4414 struct link_vars *vars)
4416 struct bnx2x *bp = params->bp;
4418 u32 swap_val, swap_override, aeu_gpio_mask, offset;
4419 DP(NETIF_MSG_LINK, "Initializing BCM8726\n");
4420 /* Restore normal power mode*/
4421 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
4422 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port);
4424 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1,
4425 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port);
4427 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 1<<15);
4428 bnx2x_wait_reset_complete(bp, phy);
4430 bnx2x_8726_external_rom_boot(phy, params);
4432 /* Need to call module detected on initialization since
4433 the module detection triggered by actual module
4434 insertion might occur before driver is loaded, and when
4435 driver is loaded, it reset all registers, including the
4437 bnx2x_sfp_module_detection(phy, params);
4439 if (phy->req_line_speed == SPEED_1000) {
4440 DP(NETIF_MSG_LINK, "Setting 1G force\n");
4441 bnx2x_cl45_write(bp, phy,
4442 MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 0x40);
4443 bnx2x_cl45_write(bp, phy,
4444 MDIO_PMA_DEVAD, MDIO_PMA_REG_10G_CTRL2, 0xD);
4445 bnx2x_cl45_write(bp, phy,
4446 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_CTRL, 0x5);
4447 bnx2x_cl45_write(bp, phy,
4448 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM_CTRL,
4450 } else if ((phy->req_line_speed == SPEED_AUTO_NEG) &&
4451 (phy->speed_cap_mask &
4452 PORT_HW_CFG_SPEED_CAPABILITY_D0_1G) &&
4453 ((phy->speed_cap_mask &
4454 PORT_HW_CFG_SPEED_CAPABILITY_D0_10G) !=
4455 PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)) {
4456 DP(NETIF_MSG_LINK, "Setting 1G clause37\n");
4457 /* Set Flow control */
4458 bnx2x_ext_phy_set_pause(params, phy, vars);
4459 bnx2x_cl45_write(bp, phy,
4460 MDIO_AN_DEVAD, MDIO_AN_REG_ADV, 0x20);
4461 bnx2x_cl45_write(bp, phy,
4462 MDIO_AN_DEVAD, MDIO_AN_REG_CL37_CL73, 0x040c);
4463 bnx2x_cl45_write(bp, phy,
4464 MDIO_AN_DEVAD, MDIO_AN_REG_CL37_FC_LD, 0x0020);
4465 bnx2x_cl45_write(bp, phy,
4466 MDIO_AN_DEVAD, MDIO_AN_REG_CL37_AN, 0x1000);
4467 bnx2x_cl45_write(bp, phy,
4468 MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, 0x1200);
4469 /* Enable RX-ALARM control to receive
4470 interrupt for 1G speed change */
4471 bnx2x_cl45_write(bp, phy,
4472 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_CTRL, 0x4);
4473 bnx2x_cl45_write(bp, phy,
4474 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM_CTRL,
4477 } else { /* Default 10G. Set only LASI control */
4478 bnx2x_cl45_write(bp, phy,
4479 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_CTRL, 1);
4482 /* Set TX PreEmphasis if needed */
4483 if ((params->feature_config_flags &
4484 FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED)) {
4485 DP(NETIF_MSG_LINK, "Setting TX_CTRL1 0x%x,"
4487 phy->tx_preemphasis[0],
4488 phy->tx_preemphasis[1]);
4489 bnx2x_cl45_write(bp, phy,
4491 MDIO_PMA_REG_8726_TX_CTRL1,
4492 phy->tx_preemphasis[0]);
4494 bnx2x_cl45_write(bp, phy,
4496 MDIO_PMA_REG_8726_TX_CTRL2,
4497 phy->tx_preemphasis[1]);
4500 /* Set GPIO3 to trigger SFP+ module insertion/removal */
4501 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_3,
4502 MISC_REGISTERS_GPIO_INPUT_HI_Z, params->port);
4504 /* The GPIO should be swapped if the swap register is set and active */
4505 swap_val = REG_RD(bp, NIG_REG_PORT_SWAP);
4506 swap_override = REG_RD(bp, NIG_REG_STRAP_OVERRIDE);
4508 /* Select function upon port-swap configuration */
4509 if (params->port == 0) {
4510 offset = MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0;
4511 aeu_gpio_mask = (swap_val && swap_override) ?
4512 AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1 :
4513 AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0;
4515 offset = MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0;
4516 aeu_gpio_mask = (swap_val && swap_override) ?
4517 AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0 :
4518 AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1;
4520 val = REG_RD(bp, offset);
4521 /* add GPIO3 to group */
4522 val |= aeu_gpio_mask;
4523 REG_WR(bp, offset, val);
4528 static void bnx2x_8726_link_reset(struct bnx2x_phy *phy,
4529 struct link_params *params)
4531 struct bnx2x *bp = params->bp;
4532 DP(NETIF_MSG_LINK, "bnx2x_8726_link_reset port %d\n", params->port);
4533 /* Set serial boot control for external load */
4534 bnx2x_cl45_write(bp, phy,
4536 MDIO_PMA_REG_GEN_CTRL, 0x0001);
4539 /******************************************************************/
4540 /* BCM8727 PHY SECTION */
4541 /******************************************************************/
4542 static void bnx2x_8727_hw_reset(struct bnx2x_phy *phy,
4543 struct link_params *params) {
4544 u32 swap_val, swap_override;
4547 * The PHY reset is controlled by GPIO 1. Fake the port number
4548 * to cancel the swap done in set_gpio()
4550 struct bnx2x *bp = params->bp;
4551 swap_val = REG_RD(bp, NIG_REG_PORT_SWAP);
4552 swap_override = REG_RD(bp, NIG_REG_STRAP_OVERRIDE);
4553 port = (swap_val && swap_override) ^ 1;
4554 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1,
4555 MISC_REGISTERS_GPIO_OUTPUT_LOW, port);
4558 static u8 bnx2x_8727_config_init(struct bnx2x_phy *phy,
4559 struct link_params *params,
4560 struct link_vars *vars)
4562 u16 tmp1, val, mod_abs;
4563 u16 rx_alarm_ctrl_val;
4565 struct bnx2x *bp = params->bp;
4566 /* Enable PMD link, MOD_ABS_FLT, and 1G link alarm */
4568 bnx2x_wait_reset_complete(bp, phy);
4569 rx_alarm_ctrl_val = (1<<2) | (1<<5) ;
4570 lasi_ctrl_val = 0x0004;
4572 DP(NETIF_MSG_LINK, "Initializing BCM8727\n");
4574 bnx2x_cl45_write(bp, phy,
4575 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM_CTRL,
4578 bnx2x_cl45_write(bp, phy,
4579 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_CTRL, lasi_ctrl_val);
4581 /* Initially configure MOD_ABS to interrupt when
4582 module is presence( bit 8) */
4583 bnx2x_cl45_read(bp, phy,
4584 MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, &mod_abs);
4585 /* Set EDC off by setting OPTXLOS signal input to low
4587 When the EDC is off it locks onto a reference clock and
4588 avoids becoming 'lost'.*/
4589 mod_abs &= ~((1<<8) | (1<<9));
4590 bnx2x_cl45_write(bp, phy,
4591 MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, mod_abs);
4594 /* Make MOD_ABS give interrupt on change */
4595 bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_PCS_OPT_CTRL,
4598 bnx2x_cl45_write(bp, phy,
4599 MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_PCS_OPT_CTRL, val);
4600 /* Set 8727 GPIOs to input to allow reading from the
4601 8727 GPIO0 status which reflect SFP+ module
4604 bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_PCS_OPT_CTRL,
4606 val &= 0xff8f; /* Reset bits 4-6 */
4607 bnx2x_cl45_write(bp, phy,
4608 MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_PCS_OPT_CTRL, val);
4610 bnx2x_8727_power_module(bp, phy, 1);
4612 bnx2x_cl45_read(bp, phy,
4613 MDIO_PMA_DEVAD, MDIO_PMA_REG_M8051_MSGOUT_REG, &tmp1);
4615 bnx2x_cl45_read(bp, phy,
4616 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM, &tmp1);
4618 /* Set option 1G speed */
4619 if (phy->req_line_speed == SPEED_1000) {
4620 DP(NETIF_MSG_LINK, "Setting 1G force\n");
4621 bnx2x_cl45_write(bp, phy,
4622 MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 0x40);
4623 bnx2x_cl45_write(bp, phy,
4624 MDIO_PMA_DEVAD, MDIO_PMA_REG_10G_CTRL2, 0xD);
4625 bnx2x_cl45_read(bp, phy,
4626 MDIO_PMA_DEVAD, MDIO_PMA_REG_10G_CTRL2, &tmp1);
4627 DP(NETIF_MSG_LINK, "1.7 = 0x%x\n", tmp1);
4628 } else if ((phy->req_line_speed == SPEED_AUTO_NEG) &&
4629 ((phy->speed_cap_mask &
4630 PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) &&
4631 ((phy->speed_cap_mask &
4632 PORT_HW_CFG_SPEED_CAPABILITY_D0_10G) !=
4633 PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)) {
4635 DP(NETIF_MSG_LINK, "Setting 1G clause37\n");
4636 bnx2x_cl45_write(bp, phy,
4637 MDIO_AN_DEVAD, MDIO_AN_REG_8727_MISC_CTRL, 0);
4638 bnx2x_cl45_write(bp, phy,
4639 MDIO_AN_DEVAD, MDIO_AN_REG_CL37_AN, 0x1300);
4642 * Since the 8727 has only single reset pin, need to set the 10G
4643 * registers although it is default
4645 bnx2x_cl45_write(bp, phy,
4646 MDIO_AN_DEVAD, MDIO_AN_REG_8727_MISC_CTRL,
4648 bnx2x_cl45_write(bp, phy,
4649 MDIO_AN_DEVAD, MDIO_AN_REG_CL37_AN, 0x0100);
4650 bnx2x_cl45_write(bp, phy,
4651 MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 0x2040);
4652 bnx2x_cl45_write(bp, phy,
4653 MDIO_PMA_DEVAD, MDIO_PMA_REG_10G_CTRL2,
4657 /* Set 2-wire transfer rate of SFP+ module EEPROM
4658 * to 100Khz since some DACs(direct attached cables) do
4659 * not work at 400Khz.
4661 bnx2x_cl45_write(bp, phy,
4662 MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_TWO_WIRE_SLAVE_ADDR,
4665 /* Set TX PreEmphasis if needed */
4666 if ((params->feature_config_flags &
4667 FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED)) {
4668 DP(NETIF_MSG_LINK, "Setting TX_CTRL1 0x%x, TX_CTRL2 0x%x\n",
4669 phy->tx_preemphasis[0],
4670 phy->tx_preemphasis[1]);
4671 bnx2x_cl45_write(bp, phy,
4672 MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_TX_CTRL1,
4673 phy->tx_preemphasis[0]);
4675 bnx2x_cl45_write(bp, phy,
4676 MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_TX_CTRL2,
4677 phy->tx_preemphasis[1]);
4683 static void bnx2x_8727_handle_mod_abs(struct bnx2x_phy *phy,
4684 struct link_params *params)
4686 struct bnx2x *bp = params->bp;
4687 u16 mod_abs, rx_alarm_status;
4688 u32 val = REG_RD(bp, params->shmem_base +
4689 offsetof(struct shmem_region, dev_info.
4690 port_feature_config[params->port].
4692 bnx2x_cl45_read(bp, phy,
4694 MDIO_PMA_REG_PHY_IDENTIFIER, &mod_abs);
4695 if (mod_abs & (1<<8)) {
4697 /* Module is absent */
4698 DP(NETIF_MSG_LINK, "MOD_ABS indication "
4699 "show module is absent\n");
4701 /* 1. Set mod_abs to detect next module
4703 2. Set EDC off by setting OPTXLOS signal input to low
4705 When the EDC is off it locks onto a reference clock and
4706 avoids becoming 'lost'.*/
4707 mod_abs &= ~((1<<8)|(1<<9));
4708 bnx2x_cl45_write(bp, phy,
4710 MDIO_PMA_REG_PHY_IDENTIFIER, mod_abs);
4712 /* Clear RX alarm since it stays up as long as
4713 the mod_abs wasn't changed */
4714 bnx2x_cl45_read(bp, phy,
4716 MDIO_PMA_REG_RX_ALARM, &rx_alarm_status);
4719 /* Module is present */
4720 DP(NETIF_MSG_LINK, "MOD_ABS indication "
4721 "show module is present\n");
4722 /* First thing, disable transmitter,
4723 and if the module is ok, the
4724 module_detection will enable it*/
4726 /* 1. Set mod_abs to detect next module
4727 absent event ( bit 8)
4728 2. Restore the default polarity of the OPRXLOS signal and
4729 this signal will then correctly indicate the presence or
4730 absence of the Rx signal. (bit 9) */
4731 mod_abs |= ((1<<8)|(1<<9));
4732 bnx2x_cl45_write(bp, phy,
4734 MDIO_PMA_REG_PHY_IDENTIFIER, mod_abs);
4736 /* Clear RX alarm since it stays up as long as
4737 the mod_abs wasn't changed. This is need to be done
4738 before calling the module detection, otherwise it will clear
4739 the link update alarm */
4740 bnx2x_cl45_read(bp, phy,
4742 MDIO_PMA_REG_RX_ALARM, &rx_alarm_status);
4745 if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) ==
4746 PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER)
4747 bnx2x_sfp_set_transmitter(bp, phy, params->port, 0);
4749 if (bnx2x_wait_for_sfp_module_initialized(phy, params) == 0)
4750 bnx2x_sfp_module_detection(phy, params);
4752 DP(NETIF_MSG_LINK, "SFP+ module is not initialized\n");
4755 DP(NETIF_MSG_LINK, "8727 RX_ALARM_STATUS 0x%x\n",
4757 /* No need to check link status in case of
4758 module plugged in/out */
4761 static u8 bnx2x_8727_read_status(struct bnx2x_phy *phy,
4762 struct link_params *params,
4763 struct link_vars *vars)
4766 struct bnx2x *bp = params->bp;
4768 u16 link_status = 0;
4769 u16 rx_alarm_status, val1;
4770 /* Check the LASI */
4771 bnx2x_cl45_read(bp, phy,
4772 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM,
4774 vars->line_speed = 0;
4775 DP(NETIF_MSG_LINK, "8727 RX_ALARM_STATUS 0x%x\n", rx_alarm_status);
4777 bnx2x_cl45_read(bp, phy,
4778 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_STATUS, &val1);
4780 DP(NETIF_MSG_LINK, "8727 LASI status 0x%x\n", val1);
4783 bnx2x_cl45_read(bp, phy,
4784 MDIO_PMA_DEVAD, MDIO_PMA_REG_M8051_MSGOUT_REG, &val1);
4787 * If a module is present and there is need to check
4790 if (!(phy->flags & FLAGS_NOC) && !(rx_alarm_status & (1<<5))) {
4791 /* Check over-current using 8727 GPIO0 input*/
4792 bnx2x_cl45_read(bp, phy,
4793 MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_GPIO_CTRL,
4796 if ((val1 & (1<<8)) == 0) {
4797 DP(NETIF_MSG_LINK, "8727 Power fault has been detected"
4798 " on port %d\n", params->port);
4799 netdev_err(bp->dev, "Error: Power fault on Port %d has"
4800 " been detected and the power to "
4801 "that SFP+ module has been removed"
4802 " to prevent failure of the card."
4803 " Please remove the SFP+ module and"
4804 " restart the system to clear this"
4809 * Disable all RX_ALARMs except for
4812 bnx2x_cl45_write(bp, phy,
4814 MDIO_PMA_REG_RX_ALARM_CTRL, (1<<5));
4816 bnx2x_cl45_read(bp, phy,
4818 MDIO_PMA_REG_PHY_IDENTIFIER, &val1);
4819 /* Wait for module_absent_event */
4821 bnx2x_cl45_write(bp, phy,
4823 MDIO_PMA_REG_PHY_IDENTIFIER, val1);
4824 /* Clear RX alarm */
4825 bnx2x_cl45_read(bp, phy,
4827 MDIO_PMA_REG_RX_ALARM, &rx_alarm_status);
4830 } /* Over current check */
4832 /* When module absent bit is set, check module */
4833 if (rx_alarm_status & (1<<5)) {
4834 bnx2x_8727_handle_mod_abs(phy, params);
4835 /* Enable all mod_abs and link detection bits */
4836 bnx2x_cl45_write(bp, phy,
4837 MDIO_PMA_DEVAD, MDIO_PMA_REG_RX_ALARM_CTRL,
4841 /* If transmitter is disabled, ignore false link up indication */
4842 bnx2x_cl45_read(bp, phy,
4843 MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, &val1);
4844 if (val1 & (1<<15)) {
4845 DP(NETIF_MSG_LINK, "Tx is disabled\n");
4849 bnx2x_cl45_read(bp, phy,
4851 MDIO_PMA_REG_8073_SPEED_LINK_STATUS, &link_status);
4853 /* Bits 0..2 --> speed detected,
4854 bits 13..15--> link is down */
4855 if ((link_status & (1<<2)) && (!(link_status & (1<<15)))) {
4857 vars->line_speed = SPEED_10000;
4858 } else if ((link_status & (1<<0)) && (!(link_status & (1<<13)))) {
4860 vars->line_speed = SPEED_1000;
4861 DP(NETIF_MSG_LINK, "port %x: External link up in 1G\n",
4865 DP(NETIF_MSG_LINK, "port %x: External link is down\n",
4869 bnx2x_ext_phy_resolve_fc(phy, params, vars);
4873 static void bnx2x_8727_link_reset(struct bnx2x_phy *phy,
4874 struct link_params *params)
4876 struct bnx2x *bp = params->bp;
4877 /* Disable Transmitter */
4878 bnx2x_sfp_set_transmitter(bp, phy, params->port, 0);
4881 /******************************************************************/
4882 /* BCM8481/BCM84823/BCM84833 PHY SECTION */
4883 /******************************************************************/
4884 static void bnx2x_save_848xx_spirom_version(struct bnx2x_phy *phy,
4885 struct link_params *params)
4887 u16 val, fw_ver1, fw_ver2, cnt;
4888 struct bnx2x *bp = params->bp;
4890 /* For the 32 bits registers in 848xx, access via MDIO2ARM interface.*/
4891 /* (1) set register 0xc200_0014(SPI_BRIDGE_CTRL_2) to 0x03000000 */
4892 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA819, 0x0014);
4893 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA81A, 0xc200);
4894 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA81B, 0x0000);
4895 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA81C, 0x0300);
4896 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA817, 0x0009);
4898 for (cnt = 0; cnt < 100; cnt++) {
4899 bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD, 0xA818, &val);
4905 DP(NETIF_MSG_LINK, "Unable to read 848xx phy fw version(1)\n");
4906 bnx2x_save_spirom_version(bp, params->port, 0,
4912 /* 2) read register 0xc200_0000 (SPI_FW_STATUS) */
4913 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA819, 0x0000);
4914 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA81A, 0xc200);
4915 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 0xA817, 0x000A);
4916 for (cnt = 0; cnt < 100; cnt++) {
4917 bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD, 0xA818, &val);
4923 DP(NETIF_MSG_LINK, "Unable to read 848xx phy fw version(2)\n");
4924 bnx2x_save_spirom_version(bp, params->port, 0,
4929 /* lower 16 bits of the register SPI_FW_STATUS */
4930 bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD, 0xA81B, &fw_ver1);
4931 /* upper 16 bits of register SPI_FW_STATUS */
4932 bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD, 0xA81C, &fw_ver2);
4934 bnx2x_save_spirom_version(bp, params->port, (fw_ver2<<16) | fw_ver1,
4938 static void bnx2x_848xx_set_led(struct bnx2x *bp,
4939 struct bnx2x_phy *phy)
4943 /* PHYC_CTL_LED_CTL */
4944 bnx2x_cl45_read(bp, phy,
4946 MDIO_PMA_REG_8481_LINK_SIGNAL, &val);
4950 bnx2x_cl45_write(bp, phy,
4952 MDIO_PMA_REG_8481_LINK_SIGNAL, val);
4954 bnx2x_cl45_write(bp, phy,
4956 MDIO_PMA_REG_8481_LED1_MASK,
4959 bnx2x_cl45_write(bp, phy,
4961 MDIO_PMA_REG_8481_LED2_MASK,
4964 bnx2x_cl45_write(bp, phy,
4966 MDIO_PMA_REG_8481_LED3_MASK,
4969 /* 'Interrupt Mask' */
4970 bnx2x_cl45_write(bp, phy,
4975 static u8 bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy,
4976 struct link_params *params,
4977 struct link_vars *vars)
4979 struct bnx2x *bp = params->bp;
4980 u16 autoneg_val, an_1000_val, an_10_100_val;
4982 * This phy uses the NIG latch mechanism since link indication
4983 * arrives through its LED4 and not via its LASI signal, so we
4984 * get steady signal instead of clear on read
4986 bnx2x_wait_reset_complete(bp, phy);
4987 bnx2x_bits_en(bp, NIG_REG_LATCH_BC_0 + params->port*4,
4988 1 << NIG_LATCH_BC_ENABLE_MI_INT);
4990 bnx2x_cl45_write(bp, phy,
4991 MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 0x0000);
4993 bnx2x_848xx_set_led(bp, phy);
4995 /* set 1000 speed advertisement */
4996 bnx2x_cl45_read(bp, phy,
4997 MDIO_AN_DEVAD, MDIO_AN_REG_8481_1000T_CTRL,
5000 bnx2x_ext_phy_set_pause(params, phy, vars);
5001 bnx2x_cl45_read(bp, phy,
5003 MDIO_AN_REG_8481_LEGACY_AN_ADV,
5005 bnx2x_cl45_read(bp, phy,
5006 MDIO_AN_DEVAD, MDIO_AN_REG_8481_LEGACY_MII_CTRL,
5008 /* Disable forced speed */
5009 autoneg_val &= ~((1<<6) | (1<<8) | (1<<9) | (1<<12) | (1<<13));
5010 an_10_100_val &= ~((1<<5) | (1<<6) | (1<<7) | (1<<8));
5012 if (((phy->req_line_speed == SPEED_AUTO_NEG) &&
5013 (phy->speed_cap_mask &
5014 PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) ||
5015 (phy->req_line_speed == SPEED_1000)) {
5016 an_1000_val |= (1<<8);
5017 autoneg_val |= (1<<9 | 1<<12);
5018 if (phy->req_duplex == DUPLEX_FULL)
5019 an_1000_val |= (1<<9);
5020 DP(NETIF_MSG_LINK, "Advertising 1G\n");
5022 an_1000_val &= ~((1<<8) | (1<<9));
5024 bnx2x_cl45_write(bp, phy,
5025 MDIO_AN_DEVAD, MDIO_AN_REG_8481_1000T_CTRL,
5028 /* set 10 speed advertisement */
5029 if (((phy->req_line_speed == SPEED_AUTO_NEG) &&
5030 (phy->speed_cap_mask &
5031 (PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_FULL |
5032 PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_HALF)))) {
5033 an_10_100_val |= (1<<7);
5034 /* Enable autoneg and restart autoneg for legacy speeds */
5035 autoneg_val |= (1<<9 | 1<<12);
5037 if (phy->req_duplex == DUPLEX_FULL)
5038 an_10_100_val |= (1<<8);
5039 DP(NETIF_MSG_LINK, "Advertising 100M\n");
5041 /* set 10 speed advertisement */
5042 if (((phy->req_line_speed == SPEED_AUTO_NEG) &&
5043 (phy->speed_cap_mask &
5044 (PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_FULL |
5045 PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_HALF)))) {
5046 an_10_100_val |= (1<<5);
5047 autoneg_val |= (1<<9 | 1<<12);
5048 if (phy->req_duplex == DUPLEX_FULL)
5049 an_10_100_val |= (1<<6);
5050 DP(NETIF_MSG_LINK, "Advertising 10M\n");
5053 /* Only 10/100 are allowed to work in FORCE mode */
5054 if (phy->req_line_speed == SPEED_100) {
5055 autoneg_val |= (1<<13);
5056 /* Enabled AUTO-MDIX when autoneg is disabled */
5057 bnx2x_cl45_write(bp, phy,
5058 MDIO_AN_DEVAD, MDIO_AN_REG_8481_AUX_CTRL,
5059 (1<<15 | 1<<9 | 7<<0));
5060 DP(NETIF_MSG_LINK, "Setting 100M force\n");
5062 if (phy->req_line_speed == SPEED_10) {
5063 /* Enabled AUTO-MDIX when autoneg is disabled */
5064 bnx2x_cl45_write(bp, phy,
5065 MDIO_AN_DEVAD, MDIO_AN_REG_8481_AUX_CTRL,
5066 (1<<15 | 1<<9 | 7<<0));
5067 DP(NETIF_MSG_LINK, "Setting 10M force\n");
5070 bnx2x_cl45_write(bp, phy,
5071 MDIO_AN_DEVAD, MDIO_AN_REG_8481_LEGACY_AN_ADV,
5074 if (phy->req_duplex == DUPLEX_FULL)
5075 autoneg_val |= (1<<8);
5077 bnx2x_cl45_write(bp, phy,
5079 MDIO_AN_REG_8481_LEGACY_MII_CTRL, autoneg_val);
5081 if (((phy->req_line_speed == SPEED_AUTO_NEG) &&
5082 (phy->speed_cap_mask &
5083 PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)) ||
5084 (phy->req_line_speed == SPEED_10000)) {
5085 DP(NETIF_MSG_LINK, "Advertising 10G\n");
5086 /* Restart autoneg for 10G*/
5088 bnx2x_cl45_write(bp, phy,
5089 MDIO_AN_DEVAD, MDIO_AN_REG_CTRL,
5091 } else if (phy->req_line_speed != SPEED_10 &&
5092 phy->req_line_speed != SPEED_100) {
5093 bnx2x_cl45_write(bp, phy,
5095 MDIO_AN_REG_8481_10GBASE_T_AN_CTRL,
5098 /* Save spirom version */
5099 bnx2x_save_848xx_spirom_version(phy, params);
5104 static u8 bnx2x_8481_config_init(struct bnx2x_phy *phy,
5105 struct link_params *params,
5106 struct link_vars *vars)
5108 struct bnx2x *bp = params->bp;
5109 /* Restore normal power mode*/
5110 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
5111 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port);
5114 bnx2x_ext_phy_hw_reset(bp, params->port);
5116 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 1<<15);
5117 return bnx2x_848xx_cmn_config_init(phy, params, vars);
5120 static u8 bnx2x_848x3_config_init(struct bnx2x_phy *phy,
5121 struct link_params *params,
5122 struct link_vars *vars)
5124 struct bnx2x *bp = params->bp;
5127 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_3,
5128 MISC_REGISTERS_GPIO_OUTPUT_HIGH,
5130 msleep(200); /* 100 is not enough */
5133 * BCM84823 requires that XGXS links up first @ 10G for normal
5136 temp = vars->line_speed;
5137 vars->line_speed = SPEED_10000;
5138 bnx2x_set_autoneg(phy, params, vars, 0);
5139 bnx2x_program_serdes(phy, params, vars);
5140 vars->line_speed = temp;
5141 return bnx2x_848xx_cmn_config_init(phy, params, vars);
5144 static u8 bnx2x_848xx_read_status(struct bnx2x_phy *phy,
5145 struct link_params *params,
5146 struct link_vars *vars)
5148 struct bnx2x *bp = params->bp;
5149 u16 val, val1, val2;
5152 /* Check 10G-BaseT link status */
5153 /* Check PMD signal ok */
5154 bnx2x_cl45_read(bp, phy,
5155 MDIO_AN_DEVAD, 0xFFFA, &val1);
5156 bnx2x_cl45_read(bp, phy,
5157 MDIO_PMA_DEVAD, MDIO_PMA_REG_8481_PMD_SIGNAL,
5159 DP(NETIF_MSG_LINK, "BCM848xx: PMD_SIGNAL 1.a811 = 0x%x\n", val2);
5161 /* Check link 10G */
5162 if (val2 & (1<<11)) {
5163 vars->line_speed = SPEED_10000;
5165 bnx2x_ext_phy_10G_an_resolve(bp, phy, vars);
5166 } else { /* Check Legacy speed link */
5167 u16 legacy_status, legacy_speed;
5169 /* Enable expansion register 0x42 (Operation mode status) */
5170 bnx2x_cl45_write(bp, phy,
5172 MDIO_AN_REG_8481_EXPANSION_REG_ACCESS, 0xf42);
5174 /* Get legacy speed operation status */
5175 bnx2x_cl45_read(bp, phy,
5177 MDIO_AN_REG_8481_EXPANSION_REG_RD_RW,
5180 DP(NETIF_MSG_LINK, "Legacy speed status"
5181 " = 0x%x\n", legacy_status);
5182 link_up = ((legacy_status & (1<<11)) == (1<<11));
5184 legacy_speed = (legacy_status & (3<<9));
5185 if (legacy_speed == (0<<9))
5186 vars->line_speed = SPEED_10;
5187 else if (legacy_speed == (1<<9))
5188 vars->line_speed = SPEED_100;
5189 else if (legacy_speed == (2<<9))
5190 vars->line_speed = SPEED_1000;
5191 else /* Should not happen */
5192 vars->line_speed = 0;
5194 if (legacy_status & (1<<8))
5195 vars->duplex = DUPLEX_FULL;
5197 vars->duplex = DUPLEX_HALF;
5199 DP(NETIF_MSG_LINK, "Link is up in %dMbps,"
5200 " is_duplex_full= %d\n", vars->line_speed,
5201 (vars->duplex == DUPLEX_FULL));
5202 /* Check legacy speed AN resolution */
5203 bnx2x_cl45_read(bp, phy,
5205 MDIO_AN_REG_8481_LEGACY_MII_STATUS,
5208 vars->link_status |=
5209 LINK_STATUS_AUTO_NEGOTIATE_COMPLETE;
5210 bnx2x_cl45_read(bp, phy,
5212 MDIO_AN_REG_8481_LEGACY_AN_EXPANSION,
5214 if ((val & (1<<0)) == 0)
5215 vars->link_status |=
5216 LINK_STATUS_PARALLEL_DETECTION_USED;
5220 DP(NETIF_MSG_LINK, "BCM84823: link speed is %d\n",
5222 bnx2x_ext_phy_resolve_fc(phy, params, vars);
5228 static u8 bnx2x_848xx_format_ver(u32 raw_ver, u8 *str, u16 *len)
5232 spirom_ver = ((raw_ver & 0xF80) >> 7) << 16 | (raw_ver & 0x7F);
5233 status = bnx2x_format_ver(spirom_ver, str, len);
5237 static void bnx2x_8481_hw_reset(struct bnx2x_phy *phy,
5238 struct link_params *params)
5240 bnx2x_set_gpio(params->bp, MISC_REGISTERS_GPIO_1,
5241 MISC_REGISTERS_GPIO_OUTPUT_LOW, 0);
5242 bnx2x_set_gpio(params->bp, MISC_REGISTERS_GPIO_1,
5243 MISC_REGISTERS_GPIO_OUTPUT_LOW, 1);
5246 static void bnx2x_8481_link_reset(struct bnx2x_phy *phy,
5247 struct link_params *params)
5249 bnx2x_cl45_write(params->bp, phy,
5250 MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, 0x0000);
5251 bnx2x_cl45_write(params->bp, phy,
5252 MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 1);
5255 static void bnx2x_848x3_link_reset(struct bnx2x_phy *phy,
5256 struct link_params *params)
5258 struct bnx2x *bp = params->bp;
5259 u8 port = params->port;
5260 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_3,
5261 MISC_REGISTERS_GPIO_OUTPUT_LOW,
5265 /******************************************************************/
5266 /* SFX7101 PHY SECTION */
5267 /******************************************************************/
5268 static void bnx2x_7101_config_loopback(struct bnx2x_phy *phy,
5269 struct link_params *params)
5271 struct bnx2x *bp = params->bp;
5272 /* SFX7101_XGXS_TEST1 */
5273 bnx2x_cl45_write(bp, phy,
5274 MDIO_XS_DEVAD, MDIO_XS_SFX7101_XGXS_TEST1, 0x100);
5277 static u8 bnx2x_7101_config_init(struct bnx2x_phy *phy,
5278 struct link_params *params,
5279 struct link_vars *vars)
5281 u16 fw_ver1, fw_ver2, val;
5282 struct bnx2x *bp = params->bp;
5283 DP(NETIF_MSG_LINK, "Setting the SFX7101 LASI indication\n");
5285 /* Restore normal power mode*/
5286 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
5287 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port);
5289 bnx2x_ext_phy_hw_reset(bp, params->port);
5290 bnx2x_wait_reset_complete(bp, phy);
5292 bnx2x_cl45_write(bp, phy,
5293 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_CTRL, 0x1);
5294 DP(NETIF_MSG_LINK, "Setting the SFX7101 LED to blink on traffic\n");
5295 bnx2x_cl45_write(bp, phy,
5296 MDIO_PMA_DEVAD, MDIO_PMA_REG_7107_LED_CNTL, (1<<3));
5298 bnx2x_ext_phy_set_pause(params, phy, vars);
5299 /* Restart autoneg */
5300 bnx2x_cl45_read(bp, phy,
5301 MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, &val);
5303 bnx2x_cl45_write(bp, phy,
5304 MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, val);
5306 /* Save spirom version */
5307 bnx2x_cl45_read(bp, phy,
5308 MDIO_PMA_DEVAD, MDIO_PMA_REG_7101_VER1, &fw_ver1);
5310 bnx2x_cl45_read(bp, phy,
5311 MDIO_PMA_DEVAD, MDIO_PMA_REG_7101_VER2, &fw_ver2);
5312 bnx2x_save_spirom_version(bp, params->port,
5313 (u32)(fw_ver1<<16 | fw_ver2), phy->ver_addr);
5317 static u8 bnx2x_7101_read_status(struct bnx2x_phy *phy,
5318 struct link_params *params,
5319 struct link_vars *vars)
5321 struct bnx2x *bp = params->bp;
5324 bnx2x_cl45_read(bp, phy,
5325 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_STATUS, &val2);
5326 bnx2x_cl45_read(bp, phy,
5327 MDIO_PMA_DEVAD, MDIO_PMA_REG_LASI_STATUS, &val1);
5328 DP(NETIF_MSG_LINK, "10G-base-T LASI status 0x%x->0x%x\n",
5330 bnx2x_cl45_read(bp, phy,
5331 MDIO_PMA_DEVAD, MDIO_PMA_REG_STATUS, &val2);
5332 bnx2x_cl45_read(bp, phy,
5333 MDIO_PMA_DEVAD, MDIO_PMA_REG_STATUS, &val1);
5334 DP(NETIF_MSG_LINK, "10G-base-T PMA status 0x%x->0x%x\n",
5336 link_up = ((val1 & 4) == 4);
5338 * print the AN outcome of the SFX7101 PHY
5341 bnx2x_cl45_read(bp, phy,
5342 MDIO_AN_DEVAD, MDIO_AN_REG_MASTER_STATUS,
5344 vars->line_speed = SPEED_10000;
5345 DP(NETIF_MSG_LINK, "SFX7101 AN status 0x%x->Master=%x\n",
5346 val2, (val2 & (1<<14)));
5347 bnx2x_ext_phy_10G_an_resolve(bp, phy, vars);
5348 bnx2x_ext_phy_resolve_fc(phy, params, vars);
5354 static u8 bnx2x_7101_format_ver(u32 spirom_ver, u8 *str, u16 *len)
5358 str[0] = (spirom_ver & 0xFF);
5359 str[1] = (spirom_ver & 0xFF00) >> 8;
5360 str[2] = (spirom_ver & 0xFF0000) >> 16;
5361 str[3] = (spirom_ver & 0xFF000000) >> 24;
5367 void bnx2x_sfx7101_sp_sw_reset(struct bnx2x *bp, struct bnx2x_phy *phy)
5371 bnx2x_cl45_read(bp, phy,
5373 MDIO_PMA_REG_7101_RESET, &val);
5375 for (cnt = 0; cnt < 10; cnt++) {
5377 /* Writes a self-clearing reset */
5378 bnx2x_cl45_write(bp, phy,
5380 MDIO_PMA_REG_7101_RESET,
5382 /* Wait for clear */
5383 bnx2x_cl45_read(bp, phy,
5385 MDIO_PMA_REG_7101_RESET, &val);
5387 if ((val & (1<<15)) == 0)
5392 static void bnx2x_7101_hw_reset(struct bnx2x_phy *phy,
5393 struct link_params *params) {
5394 /* Low power mode is controlled by GPIO 2 */
5395 bnx2x_set_gpio(params->bp, MISC_REGISTERS_GPIO_2,
5396 MISC_REGISTERS_GPIO_OUTPUT_LOW, params->port);
5397 /* The PHY reset is controlled by GPIO 1 */
5398 bnx2x_set_gpio(params->bp, MISC_REGISTERS_GPIO_1,
5399 MISC_REGISTERS_GPIO_OUTPUT_LOW, params->port);
5402 /******************************************************************/
5403 /* STATIC PHY DECLARATION */
5404 /******************************************************************/
5406 static struct bnx2x_phy phy_null = {
5407 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN,
5409 .flags = FLAGS_INIT_XGXS_FIRST,
5412 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5413 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5416 .media_type = ETH_PHY_NOT_PRESENT,
5419 .req_line_speed = 0,
5420 .speed_cap_mask = 0,
5423 .config_init = (config_init_t)NULL,
5424 .read_status = (read_status_t)NULL,
5425 .link_reset = (link_reset_t)NULL,
5426 .config_loopback = (config_loopback_t)NULL,
5427 .format_fw_ver = (format_fw_ver_t)NULL,
5428 .hw_reset = (hw_reset_t)NULL,
5429 .set_link_led = (set_link_led_t)NULL
5432 static struct bnx2x_phy phy_serdes = {
5433 .type = PORT_HW_CFG_SERDES_EXT_PHY_TYPE_DIRECT,
5438 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5439 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5441 .supported = (SUPPORTED_10baseT_Half |
5442 SUPPORTED_10baseT_Full |
5443 SUPPORTED_100baseT_Half |
5444 SUPPORTED_100baseT_Full |
5445 SUPPORTED_1000baseT_Full |
5446 SUPPORTED_2500baseX_Full |
5450 SUPPORTED_Asym_Pause),
5451 .media_type = ETH_PHY_UNSPECIFIED,
5454 .req_line_speed = 0,
5455 .speed_cap_mask = 0,
5458 .config_init = (config_init_t)bnx2x_init_serdes,
5459 .read_status = (read_status_t)bnx2x_link_settings_status,
5460 .link_reset = (link_reset_t)bnx2x_int_link_reset,
5461 .config_loopback = (config_loopback_t)NULL,
5462 .format_fw_ver = (format_fw_ver_t)NULL,
5463 .hw_reset = (hw_reset_t)NULL,
5464 .set_link_led = (set_link_led_t)NULL
5467 static struct bnx2x_phy phy_xgxs = {
5468 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT,
5473 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5474 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5476 .supported = (SUPPORTED_10baseT_Half |
5477 SUPPORTED_10baseT_Full |
5478 SUPPORTED_100baseT_Half |
5479 SUPPORTED_100baseT_Full |
5480 SUPPORTED_1000baseT_Full |
5481 SUPPORTED_2500baseX_Full |
5482 SUPPORTED_10000baseT_Full |
5486 SUPPORTED_Asym_Pause),
5487 .media_type = ETH_PHY_UNSPECIFIED,
5490 .req_line_speed = 0,
5491 .speed_cap_mask = 0,
5494 .config_init = (config_init_t)bnx2x_init_xgxs,
5495 .read_status = (read_status_t)bnx2x_link_settings_status,
5496 .link_reset = (link_reset_t)bnx2x_int_link_reset,
5497 .config_loopback = (config_loopback_t)bnx2x_set_xgxs_loopback,
5498 .format_fw_ver = (format_fw_ver_t)NULL,
5499 .hw_reset = (hw_reset_t)NULL,
5500 .set_link_led = (set_link_led_t)NULL
5503 static struct bnx2x_phy phy_7101 = {
5504 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101,
5506 .flags = FLAGS_FAN_FAILURE_DET_REQ,
5509 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5510 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5512 .supported = (SUPPORTED_10000baseT_Full |
5516 SUPPORTED_Asym_Pause),
5517 .media_type = ETH_PHY_BASE_T,
5520 .req_line_speed = 0,
5521 .speed_cap_mask = 0,
5524 .config_init = (config_init_t)bnx2x_7101_config_init,
5525 .read_status = (read_status_t)bnx2x_7101_read_status,
5526 .link_reset = (link_reset_t)bnx2x_common_ext_link_reset,
5527 .config_loopback = (config_loopback_t)bnx2x_7101_config_loopback,
5528 .format_fw_ver = (format_fw_ver_t)bnx2x_7101_format_ver,
5529 .hw_reset = (hw_reset_t)bnx2x_7101_hw_reset,
5530 .set_link_led = (set_link_led_t)NULL
5532 static struct bnx2x_phy phy_8073 = {
5533 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,
5535 .flags = FLAGS_HW_LOCK_REQUIRED,
5538 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5539 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5541 .supported = (SUPPORTED_10000baseT_Full |
5542 SUPPORTED_2500baseX_Full |
5543 SUPPORTED_1000baseT_Full |
5547 SUPPORTED_Asym_Pause),
5548 .media_type = ETH_PHY_UNSPECIFIED,
5551 .req_line_speed = 0,
5552 .speed_cap_mask = 0,
5555 .config_init = (config_init_t)bnx2x_8073_config_init,
5556 .read_status = (read_status_t)bnx2x_8073_read_status,
5557 .link_reset = (link_reset_t)bnx2x_8073_link_reset,
5558 .config_loopback = (config_loopback_t)NULL,
5559 .format_fw_ver = (format_fw_ver_t)bnx2x_format_ver,
5560 .hw_reset = (hw_reset_t)NULL,
5561 .set_link_led = (set_link_led_t)NULL
5563 static struct bnx2x_phy phy_8705 = {
5564 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705,
5566 .flags = FLAGS_INIT_XGXS_FIRST,
5569 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5570 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5572 .supported = (SUPPORTED_10000baseT_Full |
5575 SUPPORTED_Asym_Pause),
5576 .media_type = ETH_PHY_XFP_FIBER,
5579 .req_line_speed = 0,
5580 .speed_cap_mask = 0,
5583 .config_init = (config_init_t)bnx2x_8705_config_init,
5584 .read_status = (read_status_t)bnx2x_8705_read_status,
5585 .link_reset = (link_reset_t)bnx2x_common_ext_link_reset,
5586 .config_loopback = (config_loopback_t)NULL,
5587 .format_fw_ver = (format_fw_ver_t)bnx2x_null_format_ver,
5588 .hw_reset = (hw_reset_t)NULL,
5589 .set_link_led = (set_link_led_t)NULL
5591 static struct bnx2x_phy phy_8706 = {
5592 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706,
5594 .flags = FLAGS_INIT_XGXS_FIRST,
5597 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5598 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5600 .supported = (SUPPORTED_10000baseT_Full |
5601 SUPPORTED_1000baseT_Full |
5604 SUPPORTED_Asym_Pause),
5605 .media_type = ETH_PHY_SFP_FIBER,
5608 .req_line_speed = 0,
5609 .speed_cap_mask = 0,
5612 .config_init = (config_init_t)bnx2x_8706_config_init,
5613 .read_status = (read_status_t)bnx2x_8706_read_status,
5614 .link_reset = (link_reset_t)bnx2x_common_ext_link_reset,
5615 .config_loopback = (config_loopback_t)NULL,
5616 .format_fw_ver = (format_fw_ver_t)bnx2x_format_ver,
5617 .hw_reset = (hw_reset_t)NULL,
5618 .set_link_led = (set_link_led_t)NULL
5621 static struct bnx2x_phy phy_8726 = {
5622 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726,
5624 .flags = (FLAGS_HW_LOCK_REQUIRED |
5625 FLAGS_INIT_XGXS_FIRST),
5628 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5629 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5631 .supported = (SUPPORTED_10000baseT_Full |
5632 SUPPORTED_1000baseT_Full |
5636 SUPPORTED_Asym_Pause),
5637 .media_type = ETH_PHY_SFP_FIBER,
5640 .req_line_speed = 0,
5641 .speed_cap_mask = 0,
5644 .config_init = (config_init_t)bnx2x_8726_config_init,
5645 .read_status = (read_status_t)bnx2x_8726_read_status,
5646 .link_reset = (link_reset_t)bnx2x_8726_link_reset,
5647 .config_loopback = (config_loopback_t)bnx2x_8726_config_loopback,
5648 .format_fw_ver = (format_fw_ver_t)bnx2x_format_ver,
5649 .hw_reset = (hw_reset_t)NULL,
5650 .set_link_led = (set_link_led_t)NULL
5653 static struct bnx2x_phy phy_8727 = {
5654 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727,
5656 .flags = FLAGS_FAN_FAILURE_DET_REQ,
5659 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5660 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5662 .supported = (SUPPORTED_10000baseT_Full |
5663 SUPPORTED_1000baseT_Full |
5666 SUPPORTED_Asym_Pause),
5667 .media_type = ETH_PHY_SFP_FIBER,
5670 .req_line_speed = 0,
5671 .speed_cap_mask = 0,
5674 .config_init = (config_init_t)bnx2x_8727_config_init,
5675 .read_status = (read_status_t)bnx2x_8727_read_status,
5676 .link_reset = (link_reset_t)bnx2x_8727_link_reset,
5677 .config_loopback = (config_loopback_t)NULL,
5678 .format_fw_ver = (format_fw_ver_t)bnx2x_format_ver,
5679 .hw_reset = (hw_reset_t)bnx2x_8727_hw_reset,
5680 .set_link_led = (set_link_led_t)NULL
5682 static struct bnx2x_phy phy_8481 = {
5683 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481,
5685 .flags = FLAGS_FAN_FAILURE_DET_REQ,
5688 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5689 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5691 .supported = (SUPPORTED_10baseT_Half |
5692 SUPPORTED_10baseT_Full |
5693 SUPPORTED_100baseT_Half |
5694 SUPPORTED_100baseT_Full |
5695 SUPPORTED_1000baseT_Full |
5696 SUPPORTED_10000baseT_Full |
5700 SUPPORTED_Asym_Pause),
5701 .media_type = ETH_PHY_BASE_T,
5704 .req_line_speed = 0,
5705 .speed_cap_mask = 0,
5708 .config_init = (config_init_t)bnx2x_8481_config_init,
5709 .read_status = (read_status_t)bnx2x_848xx_read_status,
5710 .link_reset = (link_reset_t)bnx2x_8481_link_reset,
5711 .config_loopback = (config_loopback_t)NULL,
5712 .format_fw_ver = (format_fw_ver_t)bnx2x_848xx_format_ver,
5713 .hw_reset = (hw_reset_t)bnx2x_8481_hw_reset,
5714 .set_link_led = (set_link_led_t)NULL
5717 static struct bnx2x_phy phy_84823 = {
5718 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823,
5720 .flags = FLAGS_FAN_FAILURE_DET_REQ,
5723 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5724 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
5726 .supported = (SUPPORTED_10baseT_Half |
5727 SUPPORTED_10baseT_Full |
5728 SUPPORTED_100baseT_Half |
5729 SUPPORTED_100baseT_Full |
5730 SUPPORTED_1000baseT_Full |
5731 SUPPORTED_10000baseT_Full |
5735 SUPPORTED_Asym_Pause),
5736 .media_type = ETH_PHY_BASE_T,
5739 .req_line_speed = 0,
5740 .speed_cap_mask = 0,
5743 .config_init = (config_init_t)bnx2x_848x3_config_init,
5744 .read_status = (read_status_t)bnx2x_848xx_read_status,
5745 .link_reset = (link_reset_t)bnx2x_848x3_link_reset,
5746 .config_loopback = (config_loopback_t)NULL,
5747 .format_fw_ver = (format_fw_ver_t)bnx2x_848xx_format_ver,
5748 .hw_reset = (hw_reset_t)NULL,
5749 .set_link_led = (set_link_led_t)NULL
5752 /*****************************************************************/
5754 /* Populate the phy according. Main function: bnx2x_populate_phy */
5756 /*****************************************************************/
5758 static void bnx2x_populate_preemphasis(struct bnx2x *bp, u32 shmem_base,
5759 struct bnx2x_phy *phy, u8 port,
5762 /* Get the 4 lanes xgxs config rx and tx */
5763 u32 rx = 0, tx = 0, i;
5764 for (i = 0; i < 2; i++) {
5766 * INT_PHY and EXT_PHY1 share the same value location in the
5767 * shmem. When num_phys is greater than 1, than this value
5768 * applies only to EXT_PHY1
5771 rx = REG_RD(bp, shmem_base +
5772 offsetof(struct shmem_region,
5773 dev_info.port_hw_config[port].xgxs_config_rx[i<<1]));
5775 tx = REG_RD(bp, shmem_base +
5776 offsetof(struct shmem_region,
5777 dev_info.port_hw_config[port].xgxs_config_tx[i<<1]));
5779 phy->rx_preemphasis[i << 1] = ((rx>>16) & 0xffff);
5780 phy->rx_preemphasis[(i << 1) + 1] = (rx & 0xffff);
5782 phy->tx_preemphasis[i << 1] = ((tx>>16) & 0xffff);
5783 phy->tx_preemphasis[(i << 1) + 1] = (tx & 0xffff);
5787 static u32 bnx2x_get_ext_phy_config(struct bnx2x *bp, u32 shmem_base,
5788 u8 phy_index, u8 port)
5790 u32 ext_phy_config = 0;
5791 switch (phy_index) {
5793 ext_phy_config = REG_RD(bp, shmem_base +
5794 offsetof(struct shmem_region,
5795 dev_info.port_hw_config[port].external_phy_config));
5798 DP(NETIF_MSG_LINK, "Invalid phy_index %d\n", phy_index);
5802 return ext_phy_config;
5804 static u8 bnx2x_populate_int_phy(struct bnx2x *bp, u32 shmem_base, u8 port,
5805 struct bnx2x_phy *phy)
5809 u32 switch_cfg = (REG_RD(bp, shmem_base +
5810 offsetof(struct shmem_region,
5811 dev_info.port_feature_config[port].link_config)) &
5812 PORT_FEATURE_CONNECTED_SWITCH_MASK);
5813 chip_id = REG_RD(bp, MISC_REG_CHIP_NUM) << 16;
5814 switch (switch_cfg) {
5816 phy_addr = REG_RD(bp,
5817 NIG_REG_SERDES0_CTRL_PHY_ADDR +
5821 case SWITCH_CFG_10G:
5822 phy_addr = REG_RD(bp,
5823 NIG_REG_XGXS0_CTRL_PHY_ADDR +
5828 DP(NETIF_MSG_LINK, "Invalid switch_cfg\n");
5831 phy->addr = (u8)phy_addr;
5832 phy->mdio_ctrl = bnx2x_get_emac_base(bp,
5833 SHARED_HW_CFG_MDC_MDIO_ACCESS1_BOTH,
5835 phy->def_md_devad = DEFAULT_PHY_DEV_ADDR;
5837 DP(NETIF_MSG_LINK, "Internal phy port=%d, addr=0x%x, mdio_ctl=0x%x\n",
5838 port, phy->addr, phy->mdio_ctrl);
5840 bnx2x_populate_preemphasis(bp, shmem_base, phy, port, INT_PHY);
5844 static u8 bnx2x_populate_ext_phy(struct bnx2x *bp,
5848 struct bnx2x_phy *phy)
5850 u32 ext_phy_config, phy_type, config2;
5851 u32 mdc_mdio_access = SHARED_HW_CFG_MDC_MDIO_ACCESS1_BOTH;
5852 ext_phy_config = bnx2x_get_ext_phy_config(bp, shmem_base,
5854 phy_type = XGXS_EXT_PHY_TYPE(ext_phy_config);
5855 /* Select the phy type */
5857 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073:
5858 mdc_mdio_access = SHARED_HW_CFG_MDC_MDIO_ACCESS1_SWAPPED;
5861 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705:
5864 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706:
5867 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726:
5868 mdc_mdio_access = SHARED_HW_CFG_MDC_MDIO_ACCESS1_EMAC1;
5871 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727_NOC:
5872 /* BCM8727_NOC => BCM8727 no over current */
5873 mdc_mdio_access = SHARED_HW_CFG_MDC_MDIO_ACCESS1_EMAC1;
5875 phy->flags |= FLAGS_NOC;
5877 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727:
5878 mdc_mdio_access = SHARED_HW_CFG_MDC_MDIO_ACCESS1_EMAC1;
5881 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481:
5884 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823:
5887 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101:
5890 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE:
5898 phy->addr = XGXS_EXT_PHY_ADDR(ext_phy_config);
5899 bnx2x_populate_preemphasis(bp, shmem_base, phy, port, phy_index);
5902 * The shmem address of the phy version is located on different
5903 * structures. In case this structure is too old, do not set
5906 config2 = REG_RD(bp, shmem_base + offsetof(struct shmem_region,
5907 dev_info.shared_hw_config.config2));
5909 phy->ver_addr = shmem_base + offsetof(struct shmem_region,
5910 port_mb[port].ext_phy_fw_version);
5912 /* Check specific mdc mdio settings */
5913 if (config2 & SHARED_HW_CFG_MDC_MDIO_ACCESS1_MASK)
5914 mdc_mdio_access = config2 &
5915 SHARED_HW_CFG_MDC_MDIO_ACCESS1_MASK;
5917 phy->mdio_ctrl = bnx2x_get_emac_base(bp, mdc_mdio_access, port);
5920 * In case mdc/mdio_access of the external phy is different than the
5921 * mdc/mdio access of the XGXS, a HW lock must be taken in each access
5922 * to prevent one port interfere with another port's CL45 operations.
5924 if (mdc_mdio_access != SHARED_HW_CFG_MDC_MDIO_ACCESS1_BOTH)
5925 phy->flags |= FLAGS_HW_LOCK_REQUIRED;
5926 DP(NETIF_MSG_LINK, "phy_type 0x%x port %d found in index %d\n",
5927 phy_type, port, phy_index);
5928 DP(NETIF_MSG_LINK, " addr=0x%x, mdio_ctl=0x%x\n",
5929 phy->addr, phy->mdio_ctrl);
5933 static u8 bnx2x_populate_phy(struct bnx2x *bp, u8 phy_index, u32 shmem_base,
5934 u8 port, struct bnx2x_phy *phy)
5937 phy->type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN;
5938 if (phy_index == INT_PHY)
5939 return bnx2x_populate_int_phy(bp, shmem_base, port, phy);
5940 status = bnx2x_populate_ext_phy(bp, phy_index, shmem_base,
5945 static void bnx2x_phy_def_cfg(struct link_params *params,
5946 struct bnx2x_phy *phy,
5949 struct bnx2x *bp = params->bp;
5951 /* Populate the default phy configuration for MF mode */
5952 link_config = REG_RD(bp, params->shmem_base +
5953 offsetof(struct shmem_region, dev_info.
5954 port_feature_config[params->port].link_config));
5955 phy->speed_cap_mask = REG_RD(bp, params->shmem_base +
5956 offsetof(struct shmem_region, dev_info.
5957 port_hw_config[params->port].speed_capability_mask));
5959 phy->req_duplex = DUPLEX_FULL;
5960 switch (link_config & PORT_FEATURE_LINK_SPEED_MASK) {
5961 case PORT_FEATURE_LINK_SPEED_10M_HALF:
5962 phy->req_duplex = DUPLEX_HALF;
5963 case PORT_FEATURE_LINK_SPEED_10M_FULL:
5964 phy->req_line_speed = SPEED_10;
5966 case PORT_FEATURE_LINK_SPEED_100M_HALF:
5967 phy->req_duplex = DUPLEX_HALF;
5968 case PORT_FEATURE_LINK_SPEED_100M_FULL:
5969 phy->req_line_speed = SPEED_100;
5971 case PORT_FEATURE_LINK_SPEED_1G:
5972 phy->req_line_speed = SPEED_1000;
5974 case PORT_FEATURE_LINK_SPEED_2_5G:
5975 phy->req_line_speed = SPEED_2500;
5977 case PORT_FEATURE_LINK_SPEED_10G_CX4:
5978 phy->req_line_speed = SPEED_10000;
5981 phy->req_line_speed = SPEED_AUTO_NEG;
5985 switch (link_config & PORT_FEATURE_FLOW_CONTROL_MASK) {
5986 case PORT_FEATURE_FLOW_CONTROL_AUTO:
5987 phy->req_flow_ctrl = BNX2X_FLOW_CTRL_AUTO;
5989 case PORT_FEATURE_FLOW_CONTROL_TX:
5990 phy->req_flow_ctrl = BNX2X_FLOW_CTRL_TX;
5992 case PORT_FEATURE_FLOW_CONTROL_RX:
5993 phy->req_flow_ctrl = BNX2X_FLOW_CTRL_RX;
5995 case PORT_FEATURE_FLOW_CONTROL_BOTH:
5996 phy->req_flow_ctrl = BNX2X_FLOW_CTRL_BOTH;
5999 phy->req_flow_ctrl = BNX2X_FLOW_CTRL_NONE;
6004 u8 bnx2x_phy_probe(struct link_params *params)
6006 u8 phy_index, actual_phy_idx, link_cfg_idx;
6008 struct bnx2x *bp = params->bp;
6009 struct bnx2x_phy *phy;
6010 params->num_phys = 0;
6011 DP(NETIF_MSG_LINK, "Begin phy probe\n");
6013 for (phy_index = INT_PHY; phy_index < MAX_PHYS;
6015 link_cfg_idx = LINK_CONFIG_IDX(phy_index);
6016 actual_phy_idx = phy_index;
6018 phy = ¶ms->phy[actual_phy_idx];
6019 if (bnx2x_populate_phy(bp, phy_index, params->shmem_base,
6022 params->num_phys = 0;
6023 DP(NETIF_MSG_LINK, "phy probe failed in phy index %d\n",
6025 for (phy_index = INT_PHY;
6026 phy_index < MAX_PHYS;
6031 if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN)
6034 bnx2x_phy_def_cfg(params, phy, actual_phy_idx);
6038 DP(NETIF_MSG_LINK, "End phy probe. #phys found %x\n", params->num_phys);
6042 u32 bnx2x_supported_attr(struct link_params *params, u8 phy_idx)
6044 if (phy_idx < params->num_phys)
6045 return params->phy[phy_idx].supported;
6049 static void set_phy_vars(struct link_params *params)
6051 struct bnx2x *bp = params->bp;
6052 u8 actual_phy_idx, phy_index;
6054 for (phy_index = INT_PHY; phy_index < params->num_phys;
6057 actual_phy_idx = phy_index;
6058 params->phy[actual_phy_idx].req_flow_ctrl =
6059 params->req_flow_ctrl;
6061 params->phy[actual_phy_idx].req_line_speed =
6062 params->req_line_speed;
6064 params->phy[actual_phy_idx].speed_cap_mask =
6065 params->speed_cap_mask;
6067 params->phy[actual_phy_idx].req_duplex =
6070 DP(NETIF_MSG_LINK, "req_flow_ctrl %x, req_line_speed %x,"
6071 " speed_cap_mask %x\n",
6072 params->phy[actual_phy_idx].req_flow_ctrl,
6073 params->phy[actual_phy_idx].req_line_speed,
6074 params->phy[actual_phy_idx].speed_cap_mask);
6078 u8 bnx2x_phy_init(struct link_params *params, struct link_vars *vars)
6080 struct bnx2x *bp = params->bp;
6083 DP(NETIF_MSG_LINK, "Phy Initialization started\n");
6084 DP(NETIF_MSG_LINK, "req_speed %d, req_flowctrl %d\n",
6085 params->req_line_speed, params->req_flow_ctrl);
6086 vars->link_status = 0;
6087 vars->phy_link_up = 0;
6089 vars->line_speed = 0;
6090 vars->duplex = DUPLEX_FULL;
6091 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
6092 vars->mac_type = MAC_TYPE_NONE;
6093 vars->phy_flags = 0;
6095 /* disable attentions */
6096 bnx2x_bits_dis(bp, NIG_REG_MASK_INTERRUPT_PORT0 + params->port*4,
6097 (NIG_MASK_XGXS0_LINK_STATUS |
6098 NIG_MASK_XGXS0_LINK10G |
6099 NIG_MASK_SERDES0_LINK_STATUS |
6102 bnx2x_emac_init(params, vars);
6104 if (params->num_phys == 0) {
6105 DP(NETIF_MSG_LINK, "No phy found for initialization !!\n");
6108 set_phy_vars(params);
6110 DP(NETIF_MSG_LINK, "Num of phys on board: %d\n", params->num_phys);
6111 if (CHIP_REV_IS_FPGA(bp)) {
6114 vars->line_speed = SPEED_10000;
6115 vars->duplex = DUPLEX_FULL;
6116 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
6117 vars->link_status = (LINK_STATUS_LINK_UP | LINK_10GTFD);
6118 /* enable on E1.5 FPGA */
6119 if (CHIP_IS_E1H(bp)) {
6121 (BNX2X_FLOW_CTRL_TX |
6122 BNX2X_FLOW_CTRL_RX);
6123 vars->link_status |=
6124 (LINK_STATUS_TX_FLOW_CONTROL_ENABLED |
6125 LINK_STATUS_RX_FLOW_CONTROL_ENABLED);
6128 bnx2x_emac_enable(params, vars, 0);
6129 bnx2x_pbf_update(params, vars->flow_ctrl, vars->line_speed);
6131 REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);
6133 /* update shared memory */
6134 bnx2x_update_mng(params, vars->link_status);
6139 if (CHIP_REV_IS_EMUL(bp)) {
6142 vars->line_speed = SPEED_10000;
6143 vars->duplex = DUPLEX_FULL;
6144 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
6145 vars->link_status = (LINK_STATUS_LINK_UP | LINK_10GTFD);
6147 bnx2x_bmac_enable(params, vars, 0);
6149 bnx2x_pbf_update(params, vars->flow_ctrl, vars->line_speed);
6151 REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE
6152 + params->port*4, 0);
6154 /* update shared memory */
6155 bnx2x_update_mng(params, vars->link_status);
6160 if (params->loopback_mode == LOOPBACK_BMAC) {
6163 vars->line_speed = SPEED_10000;
6164 vars->duplex = DUPLEX_FULL;
6165 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
6166 vars->mac_type = MAC_TYPE_BMAC;
6168 vars->phy_flags = PHY_XGXS_FLAG;
6170 bnx2x_xgxs_deassert(params);
6172 /* set bmac loopback */
6173 bnx2x_bmac_enable(params, vars, 1);
6175 REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE +
6178 } else if (params->loopback_mode == LOOPBACK_EMAC) {
6181 vars->line_speed = SPEED_1000;
6182 vars->duplex = DUPLEX_FULL;
6183 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
6184 vars->mac_type = MAC_TYPE_EMAC;
6186 vars->phy_flags = PHY_XGXS_FLAG;
6188 bnx2x_xgxs_deassert(params);
6189 /* set bmac loopback */
6190 bnx2x_emac_enable(params, vars, 1);
6191 bnx2x_emac_program(params, vars);
6192 REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE +
6195 } else if ((params->loopback_mode == LOOPBACK_XGXS) ||
6196 (params->loopback_mode == LOOPBACK_EXT_PHY)) {
6199 vars->line_speed = SPEED_10000;
6200 vars->duplex = DUPLEX_FULL;
6201 vars->flow_ctrl = BNX2X_FLOW_CTRL_NONE;
6203 vars->phy_flags = PHY_XGXS_FLAG;
6206 NIG_REG_XGXS0_CTRL_PHY_ADDR+
6209 bnx2x_xgxs_deassert(params);
6210 bnx2x_link_initialize(params, vars);
6212 vars->mac_type = MAC_TYPE_BMAC;
6214 bnx2x_bmac_enable(params, vars, 0);
6216 if (params->loopback_mode == LOOPBACK_XGXS) {
6217 /* set 10G XGXS loopback */
6218 params->phy[INT_PHY].config_loopback(
6219 ¶ms->phy[INT_PHY],
6223 /* set external phy loopback */
6225 for (phy_index = EXT_PHY1;
6226 phy_index < params->num_phys; phy_index++) {
6227 if (params->phy[phy_index].config_loopback)
6228 params->phy[phy_index].config_loopback(
6229 ¶ms->phy[phy_index],
6234 REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE +
6237 bnx2x_set_led(params, LED_MODE_OPER, vars->line_speed);
6241 if (params->switch_cfg == SWITCH_CFG_10G)
6242 bnx2x_xgxs_deassert(params);
6244 bnx2x_serdes_deassert(bp, params->port);
6245 bnx2x_link_initialize(params, vars);
6247 bnx2x_link_int_enable(params);
6251 u8 bnx2x_link_reset(struct link_params *params, struct link_vars *vars,
6254 struct bnx2x *bp = params->bp;
6255 u8 phy_index, port = params->port;
6256 DP(NETIF_MSG_LINK, "Resetting the link of port %d\n", port);
6257 /* disable attentions */
6258 vars->link_status = 0;
6259 bnx2x_update_mng(params, vars->link_status);
6260 bnx2x_bits_dis(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4,
6261 (NIG_MASK_XGXS0_LINK_STATUS |
6262 NIG_MASK_XGXS0_LINK10G |
6263 NIG_MASK_SERDES0_LINK_STATUS |
6266 /* activate nig drain */
6267 REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + port*4, 1);
6269 /* disable nig egress interface */
6270 REG_WR(bp, NIG_REG_BMAC0_OUT_EN + port*4, 0);
6271 REG_WR(bp, NIG_REG_EGRESS_EMAC0_OUT_EN + port*4, 0);
6273 /* Stop BigMac rx */
6274 bnx2x_bmac_rx_disable(bp, port);
6277 REG_WR(bp, NIG_REG_NIG_EMAC0_EN + port*4, 0);
6280 /* The PHY reset is controled by GPIO 1
6281 * Hold it as vars low
6283 /* clear link led */
6284 bnx2x_set_led(params, LED_MODE_OFF, 0);
6285 if (reset_ext_phy) {
6286 for (phy_index = EXT_PHY1; phy_index < params->num_phys;
6288 if (params->phy[phy_index].link_reset)
6289 params->phy[phy_index].link_reset(
6290 ¶ms->phy[phy_index],
6295 if (params->phy[INT_PHY].link_reset)
6296 params->phy[INT_PHY].link_reset(
6297 ¶ms->phy[INT_PHY], params);
6299 REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
6300 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
6302 /* disable nig ingress interface */
6303 REG_WR(bp, NIG_REG_BMAC0_IN_EN + port*4, 0);
6304 REG_WR(bp, NIG_REG_EMAC0_IN_EN + port*4, 0);
6305 REG_WR(bp, NIG_REG_BMAC0_OUT_EN + port*4, 0);
6306 REG_WR(bp, NIG_REG_EGRESS_EMAC0_OUT_EN + port*4, 0);
6311 /****************************************************************************/
6312 /* Common function */
6313 /****************************************************************************/
6314 static u8 bnx2x_8073_common_init_phy(struct bnx2x *bp, u32 shmem_base)
6316 struct bnx2x_phy phy[PORT_MAX];
6317 struct bnx2x_phy *phy_blk[PORT_MAX];
6321 /* PART1 - Reset both phys */
6322 for (port = PORT_MAX - 1; port >= PORT_0; port--) {
6323 /* Extract the ext phy address for the port */
6324 if (bnx2x_populate_phy(bp, EXT_PHY1, shmem_base,
6325 port, &phy[port]) !=
6327 DP(NETIF_MSG_LINK, "populate_phy failed\n");
6330 /* disable attentions */
6331 bnx2x_bits_dis(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4,
6332 (NIG_MASK_XGXS0_LINK_STATUS |
6333 NIG_MASK_XGXS0_LINK10G |
6334 NIG_MASK_SERDES0_LINK_STATUS |
6337 /* Need to take the phy out of low power mode in order
6338 to write to access its registers */
6339 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
6340 MISC_REGISTERS_GPIO_OUTPUT_HIGH, port);
6343 bnx2x_cl45_write(bp, &phy[port],
6349 /* Add delay of 150ms after reset */
6352 if (phy[PORT_0].addr & 0x1) {
6353 phy_blk[PORT_0] = &(phy[PORT_1]);
6354 phy_blk[PORT_1] = &(phy[PORT_0]);
6356 phy_blk[PORT_0] = &(phy[PORT_0]);
6357 phy_blk[PORT_1] = &(phy[PORT_1]);
6360 /* PART2 - Download firmware to both phys */
6361 for (port = PORT_MAX - 1; port >= PORT_0; port--) {
6364 bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port],
6367 bnx2x_cl45_read(bp, phy_blk[port],
6369 MDIO_PMA_REG_ROM_VER1, &fw_ver1);
6370 if (fw_ver1 == 0 || fw_ver1 == 0x4321) {
6372 "bnx2x_8073_common_init_phy port %x:"
6373 "Download failed. fw version = 0x%x\n",
6378 /* Only set bit 10 = 1 (Tx power down) */
6379 bnx2x_cl45_read(bp, phy_blk[port],
6381 MDIO_PMA_REG_TX_POWER_DOWN, &val);
6383 /* Phase1 of TX_POWER_DOWN reset */
6384 bnx2x_cl45_write(bp, phy_blk[port],
6386 MDIO_PMA_REG_TX_POWER_DOWN,
6390 /* Toggle Transmitter: Power down and then up with 600ms
6394 /* PART3 - complete TX_POWER_DOWN process, and set GPIO2 back to low */
6395 for (port = PORT_MAX - 1; port >= PORT_0; port--) {
6396 /* Phase2 of POWER_DOWN_RESET */
6397 /* Release bit 10 (Release Tx power down) */
6398 bnx2x_cl45_read(bp, phy_blk[port],
6400 MDIO_PMA_REG_TX_POWER_DOWN, &val);
6402 bnx2x_cl45_write(bp, phy_blk[port],
6404 MDIO_PMA_REG_TX_POWER_DOWN, (val & (~(1<<10))));
6407 /* Read modify write the SPI-ROM version select register */
6408 bnx2x_cl45_read(bp, phy_blk[port],
6410 MDIO_PMA_REG_EDC_FFE_MAIN, &val);
6411 bnx2x_cl45_write(bp, phy_blk[port],
6413 MDIO_PMA_REG_EDC_FFE_MAIN, (val | (1<<12)));
6415 /* set GPIO2 back to LOW */
6416 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
6417 MISC_REGISTERS_GPIO_OUTPUT_LOW, port);
6422 static u8 bnx2x_8726_common_init_phy(struct bnx2x *bp, u32 shmem_base)
6426 struct bnx2x_phy phy;
6427 /* Use port1 because of the static port-swap */
6428 /* Enable the module detection interrupt */
6429 val = REG_RD(bp, MISC_REG_GPIO_EVENT_EN);
6430 val |= ((1<<MISC_REGISTERS_GPIO_3)|
6431 (1<<(MISC_REGISTERS_GPIO_3 + MISC_REGISTERS_GPIO_PORT_SHIFT)));
6432 REG_WR(bp, MISC_REG_GPIO_EVENT_EN, val);
6434 bnx2x_ext_phy_hw_reset(bp, 1);
6436 for (port = 0; port < PORT_MAX; port++) {
6437 /* Extract the ext phy address for the port */
6438 if (bnx2x_populate_phy(bp, EXT_PHY1, shmem_base,
6441 DP(NETIF_MSG_LINK, "populate phy failed\n");
6446 bnx2x_cl45_write(bp, &phy,
6447 MDIO_PMA_DEVAD, MDIO_PMA_REG_GEN_CTRL, 0x0001);
6450 /* Set fault module detected LED on */
6451 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0,
6452 MISC_REGISTERS_GPIO_HIGH,
6459 static u8 bnx2x_8727_common_init_phy(struct bnx2x *bp, u32 shmem_base)
6461 s8 port, first_port, i;
6462 u32 swap_val, swap_override;
6463 struct bnx2x_phy phy[PORT_MAX];
6464 struct bnx2x_phy *phy_blk[PORT_MAX];
6465 DP(NETIF_MSG_LINK, "Executing BCM8727 common init\n");
6466 swap_val = REG_RD(bp, NIG_REG_PORT_SWAP);
6467 swap_override = REG_RD(bp, NIG_REG_STRAP_OVERRIDE);
6469 bnx2x_ext_phy_hw_reset(bp, 1 ^ (swap_val && swap_override));
6472 if (swap_val && swap_override)
6473 first_port = PORT_0;
6475 first_port = PORT_1;
6477 /* PART1 - Reset both phys */
6478 for (i = 0, port = first_port; i < PORT_MAX; i++, port = !port) {
6479 /* Extract the ext phy address for the port */
6480 if (bnx2x_populate_phy(bp, EXT_PHY1, shmem_base,
6481 port, &phy[port]) !=
6483 DP(NETIF_MSG_LINK, "populate phy failed\n");
6486 /* disable attentions */
6487 bnx2x_bits_dis(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4,
6488 (NIG_MASK_XGXS0_LINK_STATUS |
6489 NIG_MASK_XGXS0_LINK10G |
6490 NIG_MASK_SERDES0_LINK_STATUS |
6495 bnx2x_cl45_write(bp, &phy[port],
6501 /* Add delay of 150ms after reset */
6503 if (phy[PORT_0].addr & 0x1) {
6504 phy_blk[PORT_0] = &(phy[PORT_1]);
6505 phy_blk[PORT_1] = &(phy[PORT_0]);
6507 phy_blk[PORT_0] = &(phy[PORT_0]);
6508 phy_blk[PORT_1] = &(phy[PORT_1]);
6510 /* PART2 - Download firmware to both phys */
6511 for (port = PORT_MAX - 1; port >= PORT_0; port--) {
6514 bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port],
6516 bnx2x_cl45_read(bp, phy_blk[port],
6518 MDIO_PMA_REG_ROM_VER1, &fw_ver1);
6519 if (fw_ver1 == 0 || fw_ver1 == 0x4321) {
6521 "bnx2x_8727_common_init_phy port %x:"
6522 "Download failed. fw version = 0x%x\n",
6531 u8 bnx2x_common_init_phy(struct bnx2x *bp, u32 shmem_base)
6536 DP(NETIF_MSG_LINK, "Begin common phy init\n");
6538 /* Read the ext_phy_type for arbitrary port(0) */
6539 ext_phy_type = XGXS_EXT_PHY_TYPE(
6540 REG_RD(bp, shmem_base +
6541 offsetof(struct shmem_region,
6542 dev_info.port_hw_config[0].external_phy_config)));
6544 switch (ext_phy_type) {
6545 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073:
6547 rc = bnx2x_8073_common_init_phy(bp, shmem_base);
6551 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727:
6552 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727_NOC:
6553 rc = bnx2x_8727_common_init_phy(bp, shmem_base);
6556 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726:
6557 /* GPIO1 affects both ports, so there's need to pull
6558 it for single port alone */
6559 rc = bnx2x_8726_common_init_phy(bp, shmem_base);
6563 "bnx2x_common_init_phy: ext_phy 0x%x not required\n",
6572 u8 bnx2x_hw_lock_required(struct bnx2x *bp, u32 shmem_base)
6575 struct bnx2x_phy phy;
6576 for (phy_index = INT_PHY; phy_index < MAX_PHYS;
6578 if (bnx2x_populate_phy(bp, phy_index, shmem_base,
6580 DP(NETIF_MSG_LINK, "populate phy failed\n");
6584 if (phy.flags & FLAGS_HW_LOCK_REQUIRED)
6590 u8 bnx2x_fan_failure_det_req(struct bnx2x *bp,
6594 u8 phy_index, fan_failure_det_req = 0;
6595 struct bnx2x_phy phy;
6596 for (phy_index = EXT_PHY1; phy_index < MAX_PHYS;
6598 if (bnx2x_populate_phy(bp, phy_index, shmem_base,
6601 DP(NETIF_MSG_LINK, "populate phy failed\n");
6604 fan_failure_det_req |= (phy.flags &
6605 FLAGS_FAN_FAILURE_DET_REQ);
6607 return fan_failure_det_req;
6610 void bnx2x_hw_reset_phy(struct link_params *params)
6613 for (phy_index = EXT_PHY1; phy_index < MAX_PHYS;
6615 if (params->phy[phy_index].hw_reset) {
6616 params->phy[phy_index].hw_reset(
6617 ¶ms->phy[phy_index],
6619 params->phy[phy_index] = phy_null;