aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorYaniv Rosner <yanivr@broadcom.com>2011-05-31 17:28:43 -0400
committerDavid S. Miller <davem@davemloft.net>2011-06-01 16:10:57 -0400
commit020c7e3f3cd38d41104c7f55d3d5732c5ac939be (patch)
tree1d9cbc811c8310fe2a909df3ba6740334afceadc /drivers
parent9045f6b44a01737a84c5bb79f580dccce6806d80 (diff)
bnx2x: Adjust BCM8726 module detection settings
Move BCM8726 module detection code into a separate function to be called only once during initialization. Signed-off-by: Yaniv Rosner <yanivr@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/bnx2x/bnx2x_hsi.h5
-rw-r--r--drivers/net/bnx2x/bnx2x_link.c100
-rw-r--r--drivers/net/bnx2x/bnx2x_link.h4
-rw-r--r--drivers/net/bnx2x/bnx2x_main.c4
-rw-r--r--drivers/net/bnx2x/bnx2x_reg.h1
5 files changed, 85 insertions, 29 deletions
diff --git a/drivers/net/bnx2x/bnx2x_hsi.h b/drivers/net/bnx2x/bnx2x_hsi.h
index 5bfdbcc94a7c..c308a48c8f4b 100644
--- a/drivers/net/bnx2x/bnx2x_hsi.h
+++ b/drivers/net/bnx2x/bnx2x_hsi.h
@@ -263,7 +263,10 @@ struct port_hw_cfg { /* port 0: 0x12c port 1: 0x2bc */
263#define PORT_HW_CFG_FAULT_MODULE_LED_GPIO2 0x00000200 263#define PORT_HW_CFG_FAULT_MODULE_LED_GPIO2 0x00000200
264#define PORT_HW_CFG_FAULT_MODULE_LED_GPIO3 0x00000300 264#define PORT_HW_CFG_FAULT_MODULE_LED_GPIO3 0x00000300
265#define PORT_HW_CFG_FAULT_MODULE_LED_DISABLED 0x00000400 265#define PORT_HW_CFG_FAULT_MODULE_LED_DISABLED 0x00000400
266 u32 Reserved01[11]; /* 0x158 */ 266
267 u32 Reserved01[10]; /* 0x158 */
268
269 u32 aeu_int_mask; /* 0x190 */
267 270
268 u32 media_type; /* 0x194 */ 271 u32 media_type; /* 0x194 */
269#define PORT_HW_CFG_MEDIA_TYPE_PHY0_MASK 0x000000FF 272#define PORT_HW_CFG_MEDIA_TYPE_PHY0_MASK 0x000000FF
diff --git a/drivers/net/bnx2x/bnx2x_link.c b/drivers/net/bnx2x/bnx2x_link.c
index 81bcd6141065..e44c19d86c39 100644
--- a/drivers/net/bnx2x/bnx2x_link.c
+++ b/drivers/net/bnx2x/bnx2x_link.c
@@ -1915,8 +1915,15 @@ void bnx2x_link_status_update(struct link_params *params,
1915 PORT_HW_CFG_MEDIA_TYPE_PHY2_SHIFT; 1915 PORT_HW_CFG_MEDIA_TYPE_PHY2_SHIFT;
1916 DP(NETIF_MSG_LINK, "media_types = 0x%x\n", media_types); 1916 DP(NETIF_MSG_LINK, "media_types = 0x%x\n", media_types);
1917 1917
1918 DP(NETIF_MSG_LINK, "link_status 0x%x phy_link_up %x\n", 1918 /* Sync AEU offset */
1919 vars->link_status, vars->phy_link_up); 1919 sync_offset = params->shmem_base +
1920 offsetof(struct shmem_region,
1921 dev_info.port_hw_config[port].aeu_int_mask);
1922
1923 vars->aeu_int_mask = REG_RD(bp, sync_offset);
1924
1925 DP(NETIF_MSG_LINK, "link_status 0x%x phy_link_up %x int_mask 0x%x\n",
1926 vars->link_status, vars->phy_link_up, vars->aeu_int_mask);
1920 DP(NETIF_MSG_LINK, "line_speed %x duplex %x flow_ctrl 0x%x\n", 1927 DP(NETIF_MSG_LINK, "line_speed %x duplex %x flow_ctrl 0x%x\n",
1921 vars->line_speed, vars->duplex, vars->flow_ctrl); 1928 vars->line_speed, vars->duplex, vars->flow_ctrl);
1922} 1929}
@@ -5522,8 +5529,6 @@ static int bnx2x_8726_config_init(struct bnx2x_phy *phy,
5522 struct link_vars *vars) 5529 struct link_vars *vars)
5523{ 5530{
5524 struct bnx2x *bp = params->bp; 5531 struct bnx2x *bp = params->bp;
5525 u32 val;
5526 u32 swap_val, swap_override, aeu_gpio_mask, offset;
5527 DP(NETIF_MSG_LINK, "Initializing BCM8726\n"); 5532 DP(NETIF_MSG_LINK, "Initializing BCM8726\n");
5528 5533
5529 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 1<<15); 5534 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 1<<15);
@@ -5602,30 +5607,6 @@ static int bnx2x_8726_config_init(struct bnx2x_phy *phy,
5602 phy->tx_preemphasis[1]); 5607 phy->tx_preemphasis[1]);
5603 } 5608 }
5604 5609
5605 /* Set GPIO3 to trigger SFP+ module insertion/removal */
5606 bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_3,
5607 MISC_REGISTERS_GPIO_INPUT_HI_Z, params->port);
5608
5609 /* The GPIO should be swapped if the swap register is set and active */
5610 swap_val = REG_RD(bp, NIG_REG_PORT_SWAP);
5611 swap_override = REG_RD(bp, NIG_REG_STRAP_OVERRIDE);
5612
5613 /* Select function upon port-swap configuration */
5614 if (params->port == 0) {
5615 offset = MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0;
5616 aeu_gpio_mask = (swap_val && swap_override) ?
5617 AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1 :
5618 AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0;
5619 } else {
5620 offset = MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0;
5621 aeu_gpio_mask = (swap_val && swap_override) ?
5622 AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0 :
5623 AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1;
5624 }
5625 val = REG_RD(bp, offset);
5626 /* add GPIO3 to group */
5627 val |= aeu_gpio_mask;
5628 REG_WR(bp, offset, val);
5629 return 0; 5610 return 0;
5630 5611
5631} 5612}
@@ -8521,3 +8502,66 @@ void bnx2x_hw_reset_phy(struct link_params *params)
8521 } 8502 }
8522 } 8503 }
8523} 8504}
8505
8506void bnx2x_init_mod_abs_int(struct bnx2x *bp, struct link_vars *vars,
8507 u32 chip_id, u32 shmem_base, u32 shmem2_base,
8508 u8 port)
8509{
8510 u8 gpio_num = 0xff, gpio_port = 0xff, phy_index;
8511 u32 val;
8512 u32 offset, aeu_mask, swap_val, swap_override, sync_offset;
8513
8514 {
8515 struct bnx2x_phy phy;
8516 for (phy_index = EXT_PHY1; phy_index < MAX_PHYS;
8517 phy_index++) {
8518 if (bnx2x_populate_phy(bp, phy_index, shmem_base,
8519 shmem2_base, port, &phy)
8520 != 0) {
8521 DP(NETIF_MSG_LINK, "populate phy failed\n");
8522 return;
8523 }
8524 if (phy.type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726) {
8525 gpio_num = MISC_REGISTERS_GPIO_3;
8526 gpio_port = port;
8527 break;
8528 }
8529 }
8530 }
8531
8532 if (gpio_num == 0xff)
8533 return;
8534
8535 /* Set GPIO3 to trigger SFP+ module insertion/removal */
8536 bnx2x_set_gpio(bp, gpio_num, MISC_REGISTERS_GPIO_INPUT_HI_Z, gpio_port);
8537
8538 swap_val = REG_RD(bp, NIG_REG_PORT_SWAP);
8539 swap_override = REG_RD(bp, NIG_REG_STRAP_OVERRIDE);
8540 gpio_port ^= (swap_val && swap_override);
8541
8542 vars->aeu_int_mask = AEU_INPUTS_ATTN_BITS_GPIO0_FUNCTION_0 <<
8543 (gpio_num + (gpio_port << 2));
8544
8545 sync_offset = shmem_base +
8546 offsetof(struct shmem_region,
8547 dev_info.port_hw_config[port].aeu_int_mask);
8548 REG_WR(bp, sync_offset, vars->aeu_int_mask);
8549
8550 DP(NETIF_MSG_LINK, "Setting MOD_ABS (GPIO%d_P%d) AEU to 0x%x\n",
8551 gpio_num, gpio_port, vars->aeu_int_mask);
8552
8553 if (port == 0)
8554 offset = MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0;
8555 else
8556 offset = MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0;
8557
8558 /* Open appropriate AEU for interrupts */
8559 aeu_mask = REG_RD(bp, offset);
8560 aeu_mask |= vars->aeu_int_mask;
8561 REG_WR(bp, offset, aeu_mask);
8562
8563 /* Enable the GPIO to trigger interrupt */
8564 val = REG_RD(bp, MISC_REG_GPIO_EVENT_EN);
8565 val |= 1 << (gpio_num + (gpio_port << 2));
8566 REG_WR(bp, MISC_REG_GPIO_EVENT_EN, val);
8567}
diff --git a/drivers/net/bnx2x/bnx2x_link.h b/drivers/net/bnx2x/bnx2x_link.h
index 906b5117083d..a106d8cbd69f 100644
--- a/drivers/net/bnx2x/bnx2x_link.h
+++ b/drivers/net/bnx2x/bnx2x_link.h
@@ -277,6 +277,7 @@ struct link_vars {
277 u8 fault_detected; 277 u8 fault_detected;
278 u8 rsrv1; 278 u8 rsrv1;
279 u16 rsrv2; 279 u16 rsrv2;
280 u32 aeu_int_mask;
280}; 281};
281 282
282/***********************************************************/ 283/***********************************************************/
@@ -401,4 +402,7 @@ int bnx2x_ets_strict(const struct link_params *params, const u8 strict_cos);
401void bnx2x_pfc_statistic(struct link_params *params, struct link_vars *vars, 402void bnx2x_pfc_statistic(struct link_params *params, struct link_vars *vars,
402 u32 pfc_frames_sent[2], 403 u32 pfc_frames_sent[2],
403 u32 pfc_frames_received[2]); 404 u32 pfc_frames_received[2]);
405void bnx2x_init_mod_abs_int(struct bnx2x *bp, struct link_vars *vars,
406 u32 chip_id, u32 shmem_base, u32 shmem2_base,
407 u8 port);
404#endif /* BNX2X_LINK_H */ 408#endif /* BNX2X_LINK_H */
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c
index c6591c46ebdf..2e89b6cf37ae 100644
--- a/drivers/net/bnx2x/bnx2x_main.c
+++ b/drivers/net/bnx2x/bnx2x_main.c
@@ -4452,6 +4452,10 @@ void bnx2x_nic_init(struct bnx2x *bp, u32 load_code)
4452 4452
4453#endif 4453#endif
4454 4454
4455 /* Initialize MOD_ABS interrupts */
4456 bnx2x_init_mod_abs_int(bp, &bp->link_vars, bp->common.chip_id,
4457 bp->common.shmem_base, bp->common.shmem2_base,
4458 BP_PORT(bp));
4455 /* ensure status block indices were read */ 4459 /* ensure status block indices were read */
4456 rmb(); 4460 rmb();
4457 4461
diff --git a/drivers/net/bnx2x/bnx2x_reg.h b/drivers/net/bnx2x/bnx2x_reg.h
index 11d35250b092..949e8bd73188 100644
--- a/drivers/net/bnx2x/bnx2x_reg.h
+++ b/drivers/net/bnx2x/bnx2x_reg.h
@@ -5184,6 +5184,7 @@
5184#define AEU_INPUTS_ATTN_BITS_DMAE_HW_INTERRUPT (1<<11) 5184#define AEU_INPUTS_ATTN_BITS_DMAE_HW_INTERRUPT (1<<11)
5185#define AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT (1<<13) 5185#define AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT (1<<13)
5186#define AEU_INPUTS_ATTN_BITS_DOORBELLQ_PARITY_ERROR (1<<12) 5186#define AEU_INPUTS_ATTN_BITS_DOORBELLQ_PARITY_ERROR (1<<12)
5187#define AEU_INPUTS_ATTN_BITS_GPIO0_FUNCTION_0 (1<<2)
5187#define AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0 (1<<5) 5188#define AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0 (1<<5)
5188#define AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1 (1<<9) 5189#define AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1 (1<<9)
5189#define AEU_INPUTS_ATTN_BITS_IGU_PARITY_ERROR (1<<12) 5190#define AEU_INPUTS_ATTN_BITS_IGU_PARITY_ERROR (1<<12)