diff options
author | Yaniv Rosner <yanivr@broadcom.com> | 2011-05-31 17:28:43 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-06-01 16:10:57 -0400 |
commit | 020c7e3f3cd38d41104c7f55d3d5732c5ac939be (patch) | |
tree | 1d9cbc811c8310fe2a909df3ba6740334afceadc /drivers | |
parent | 9045f6b44a01737a84c5bb79f580dccce6806d80 (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.h | 5 | ||||
-rw-r--r-- | drivers/net/bnx2x/bnx2x_link.c | 100 | ||||
-rw-r--r-- | drivers/net/bnx2x/bnx2x_link.h | 4 | ||||
-rw-r--r-- | drivers/net/bnx2x/bnx2x_main.c | 4 | ||||
-rw-r--r-- | drivers/net/bnx2x/bnx2x_reg.h | 1 |
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 | |||
8506 | void 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); | |||
401 | void bnx2x_pfc_statistic(struct link_params *params, struct link_vars *vars, | 402 | void 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]); |
405 | void 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) |