diff options
Diffstat (limited to 'drivers/net/bnx2x_link.c')
-rw-r--r-- | drivers/net/bnx2x_link.c | 78 |
1 files changed, 43 insertions, 35 deletions
diff --git a/drivers/net/bnx2x_link.c b/drivers/net/bnx2x_link.c index 36fa356c74fa..c9cffa6d47b6 100644 --- a/drivers/net/bnx2x_link.c +++ b/drivers/net/bnx2x_link.c | |||
@@ -1842,15 +1842,15 @@ static u8 bnx2x_emac_program(struct link_params *params, | |||
1842 | } | 1842 | } |
1843 | 1843 | ||
1844 | /*****************************************************************************/ | 1844 | /*****************************************************************************/ |
1845 | /* External Phy section */ | 1845 | /* External Phy section */ |
1846 | /*****************************************************************************/ | 1846 | /*****************************************************************************/ |
1847 | static void bnx2x_hw_reset(struct bnx2x *bp) | 1847 | static void bnx2x_hw_reset(struct bnx2x *bp, u8 port) |
1848 | { | 1848 | { |
1849 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, | 1849 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, |
1850 | MISC_REGISTERS_GPIO_OUTPUT_LOW); | 1850 | MISC_REGISTERS_GPIO_OUTPUT_LOW, port); |
1851 | msleep(1); | 1851 | msleep(1); |
1852 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, | 1852 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, |
1853 | MISC_REGISTERS_GPIO_OUTPUT_HIGH); | 1853 | MISC_REGISTERS_GPIO_OUTPUT_HIGH, port); |
1854 | } | 1854 | } |
1855 | 1855 | ||
1856 | static void bnx2x_ext_phy_reset(struct link_params *params, | 1856 | static void bnx2x_ext_phy_reset(struct link_params *params, |
@@ -1879,10 +1879,11 @@ static void bnx2x_ext_phy_reset(struct link_params *params, | |||
1879 | 1879 | ||
1880 | /* Restore normal power mode*/ | 1880 | /* Restore normal power mode*/ |
1881 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, | 1881 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, |
1882 | MISC_REGISTERS_GPIO_OUTPUT_HIGH); | 1882 | MISC_REGISTERS_GPIO_OUTPUT_HIGH, |
1883 | params->port); | ||
1883 | 1884 | ||
1884 | /* HW reset */ | 1885 | /* HW reset */ |
1885 | bnx2x_hw_reset(bp); | 1886 | bnx2x_hw_reset(bp, params->port); |
1886 | 1887 | ||
1887 | bnx2x_cl45_write(bp, params->port, | 1888 | bnx2x_cl45_write(bp, params->port, |
1888 | ext_phy_type, | 1889 | ext_phy_type, |
@@ -1894,7 +1895,8 @@ static void bnx2x_ext_phy_reset(struct link_params *params, | |||
1894 | /* Unset Low Power Mode and SW reset */ | 1895 | /* Unset Low Power Mode and SW reset */ |
1895 | /* Restore normal power mode*/ | 1896 | /* Restore normal power mode*/ |
1896 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, | 1897 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, |
1897 | MISC_REGISTERS_GPIO_OUTPUT_HIGH); | 1898 | MISC_REGISTERS_GPIO_OUTPUT_HIGH, |
1899 | params->port); | ||
1898 | 1900 | ||
1899 | DP(NETIF_MSG_LINK, "XGXS 8072\n"); | 1901 | DP(NETIF_MSG_LINK, "XGXS 8072\n"); |
1900 | bnx2x_cl45_write(bp, params->port, | 1902 | bnx2x_cl45_write(bp, params->port, |
@@ -1912,19 +1914,14 @@ static void bnx2x_ext_phy_reset(struct link_params *params, | |||
1912 | 1914 | ||
1913 | /* Restore normal power mode*/ | 1915 | /* Restore normal power mode*/ |
1914 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, | 1916 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, |
1915 | MISC_REGISTERS_GPIO_OUTPUT_HIGH); | 1917 | MISC_REGISTERS_GPIO_OUTPUT_HIGH, |
1918 | params->port); | ||
1916 | 1919 | ||
1917 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, | 1920 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, |
1918 | MISC_REGISTERS_GPIO_OUTPUT_HIGH); | 1921 | MISC_REGISTERS_GPIO_OUTPUT_HIGH, |
1922 | params->port); | ||
1919 | 1923 | ||
1920 | DP(NETIF_MSG_LINK, "XGXS 8073\n"); | 1924 | DP(NETIF_MSG_LINK, "XGXS 8073\n"); |
1921 | bnx2x_cl45_write(bp, | ||
1922 | params->port, | ||
1923 | ext_phy_type, | ||
1924 | ext_phy_addr, | ||
1925 | MDIO_PMA_DEVAD, | ||
1926 | MDIO_PMA_REG_CTRL, | ||
1927 | 1<<15); | ||
1928 | } | 1925 | } |
1929 | break; | 1926 | break; |
1930 | 1927 | ||
@@ -1933,10 +1930,11 @@ static void bnx2x_ext_phy_reset(struct link_params *params, | |||
1933 | 1930 | ||
1934 | /* Restore normal power mode*/ | 1931 | /* Restore normal power mode*/ |
1935 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, | 1932 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, |
1936 | MISC_REGISTERS_GPIO_OUTPUT_HIGH); | 1933 | MISC_REGISTERS_GPIO_OUTPUT_HIGH, |
1934 | params->port); | ||
1937 | 1935 | ||
1938 | /* HW reset */ | 1936 | /* HW reset */ |
1939 | bnx2x_hw_reset(bp); | 1937 | bnx2x_hw_reset(bp, params->port); |
1940 | 1938 | ||
1941 | break; | 1939 | break; |
1942 | 1940 | ||
@@ -1959,7 +1957,7 @@ static void bnx2x_ext_phy_reset(struct link_params *params, | |||
1959 | 1957 | ||
1960 | case PORT_HW_CFG_SERDES_EXT_PHY_TYPE_BCM5482: | 1958 | case PORT_HW_CFG_SERDES_EXT_PHY_TYPE_BCM5482: |
1961 | DP(NETIF_MSG_LINK, "SerDes 5482\n"); | 1959 | DP(NETIF_MSG_LINK, "SerDes 5482\n"); |
1962 | bnx2x_hw_reset(bp); | 1960 | bnx2x_hw_reset(bp, params->port); |
1963 | break; | 1961 | break; |
1964 | 1962 | ||
1965 | default: | 1963 | default: |
@@ -3286,12 +3284,14 @@ static void bnx2x_turn_on_ef(struct bnx2x *bp, u8 port, u8 ext_phy_addr, | |||
3286 | 3284 | ||
3287 | /* take ext phy out of reset */ | 3285 | /* take ext phy out of reset */ |
3288 | bnx2x_set_gpio(bp, | 3286 | bnx2x_set_gpio(bp, |
3289 | MISC_REGISTERS_GPIO_2, | 3287 | MISC_REGISTERS_GPIO_2, |
3290 | MISC_REGISTERS_GPIO_HIGH); | 3288 | MISC_REGISTERS_GPIO_HIGH, |
3289 | port); | ||
3291 | 3290 | ||
3292 | bnx2x_set_gpio(bp, | 3291 | bnx2x_set_gpio(bp, |
3293 | MISC_REGISTERS_GPIO_1, | 3292 | MISC_REGISTERS_GPIO_1, |
3294 | MISC_REGISTERS_GPIO_HIGH); | 3293 | MISC_REGISTERS_GPIO_HIGH, |
3294 | port); | ||
3295 | 3295 | ||
3296 | /* wait for 5ms */ | 3296 | /* wait for 5ms */ |
3297 | msleep(5); | 3297 | msleep(5); |
@@ -3311,13 +3311,17 @@ static void bnx2x_turn_on_ef(struct bnx2x *bp, u8 port, u8 ext_phy_addr, | |||
3311 | } | 3311 | } |
3312 | } | 3312 | } |
3313 | 3313 | ||
3314 | static void bnx2x_turn_off_sf(struct bnx2x *bp) | 3314 | static void bnx2x_turn_off_sf(struct bnx2x *bp, u8 port) |
3315 | { | 3315 | { |
3316 | /* put sf to reset */ | 3316 | /* put sf to reset */ |
3317 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, MISC_REGISTERS_GPIO_LOW); | ||
3318 | bnx2x_set_gpio(bp, | 3317 | bnx2x_set_gpio(bp, |
3319 | MISC_REGISTERS_GPIO_2, | 3318 | MISC_REGISTERS_GPIO_1, |
3320 | MISC_REGISTERS_GPIO_LOW); | 3319 | MISC_REGISTERS_GPIO_LOW, |
3320 | port); | ||
3321 | bnx2x_set_gpio(bp, | ||
3322 | MISC_REGISTERS_GPIO_2, | ||
3323 | MISC_REGISTERS_GPIO_LOW, | ||
3324 | port); | ||
3321 | } | 3325 | } |
3322 | 3326 | ||
3323 | u8 bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded, | 3327 | u8 bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded, |
@@ -3371,7 +3375,7 @@ u8 bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded, | |||
3371 | version[4] = '\0'; | 3375 | version[4] = '\0'; |
3372 | 3376 | ||
3373 | if (!driver_loaded) | 3377 | if (!driver_loaded) |
3374 | bnx2x_turn_off_sf(bp); | 3378 | bnx2x_turn_off_sf(bp, params->port); |
3375 | break; | 3379 | break; |
3376 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: | 3380 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072: |
3377 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: | 3381 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073: |
@@ -4013,10 +4017,12 @@ u8 bnx2x_link_reset(struct link_params *params, struct link_vars *vars) | |||
4013 | /* HW reset */ | 4017 | /* HW reset */ |
4014 | 4018 | ||
4015 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, | 4019 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1, |
4016 | MISC_REGISTERS_GPIO_OUTPUT_LOW); | 4020 | MISC_REGISTERS_GPIO_OUTPUT_LOW, |
4021 | port); | ||
4017 | 4022 | ||
4018 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, | 4023 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, |
4019 | MISC_REGISTERS_GPIO_OUTPUT_LOW); | 4024 | MISC_REGISTERS_GPIO_OUTPUT_LOW, |
4025 | port); | ||
4020 | 4026 | ||
4021 | DP(NETIF_MSG_LINK, "reset external PHY\n"); | 4027 | DP(NETIF_MSG_LINK, "reset external PHY\n"); |
4022 | } else if (ext_phy_type == | 4028 | } else if (ext_phy_type == |
@@ -4025,7 +4031,8 @@ u8 bnx2x_link_reset(struct link_params *params, struct link_vars *vars) | |||
4025 | "low power mode\n", | 4031 | "low power mode\n", |
4026 | port); | 4032 | port); |
4027 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, | 4033 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, |
4028 | MISC_REGISTERS_GPIO_OUTPUT_LOW); | 4034 | MISC_REGISTERS_GPIO_OUTPUT_LOW, |
4035 | port); | ||
4029 | } | 4036 | } |
4030 | } | 4037 | } |
4031 | /* reset the SerDes/XGXS */ | 4038 | /* reset the SerDes/XGXS */ |
@@ -4271,7 +4278,7 @@ static u8 bnx2x_sfx7101_flash_download(struct bnx2x *bp, u8 port, | |||
4271 | and issuing a reset.*/ | 4278 | and issuing a reset.*/ |
4272 | 4279 | ||
4273 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0, | 4280 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0, |
4274 | MISC_REGISTERS_GPIO_HIGH); | 4281 | MISC_REGISTERS_GPIO_HIGH, port); |
4275 | 4282 | ||
4276 | bnx2x_sfx7101_sp_sw_reset(bp, port, ext_phy_addr); | 4283 | bnx2x_sfx7101_sp_sw_reset(bp, port, ext_phy_addr); |
4277 | 4284 | ||
@@ -4503,7 +4510,8 @@ static u8 bnx2x_sfx7101_flash_download(struct bnx2x *bp, u8 port, | |||
4503 | } | 4510 | } |
4504 | 4511 | ||
4505 | /* DSP Remove Download Mode */ | 4512 | /* DSP Remove Download Mode */ |
4506 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0, MISC_REGISTERS_GPIO_LOW); | 4513 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_0, |
4514 | MISC_REGISTERS_GPIO_LOW, port); | ||
4507 | 4515 | ||
4508 | bnx2x_sfx7101_sp_sw_reset(bp, port, ext_phy_addr); | 4516 | bnx2x_sfx7101_sp_sw_reset(bp, port, ext_phy_addr); |
4509 | 4517 | ||
@@ -4511,7 +4519,7 @@ static u8 bnx2x_sfx7101_flash_download(struct bnx2x *bp, u8 port, | |||
4511 | for (cnt = 0; cnt < 100; cnt++) | 4519 | for (cnt = 0; cnt < 100; cnt++) |
4512 | msleep(5); | 4520 | msleep(5); |
4513 | 4521 | ||
4514 | bnx2x_hw_reset(bp); | 4522 | bnx2x_hw_reset(bp, port); |
4515 | 4523 | ||
4516 | for (cnt = 0; cnt < 100; cnt++) | 4524 | for (cnt = 0; cnt < 100; cnt++) |
4517 | msleep(5); | 4525 | msleep(5); |
@@ -4586,7 +4594,7 @@ u8 bnx2x_flash_download(struct bnx2x *bp, u8 port, u32 ext_phy_config, | |||
4586 | rc = bnx2x_sfx7101_flash_download(bp, port, ext_phy_addr, | 4594 | rc = bnx2x_sfx7101_flash_download(bp, port, ext_phy_addr, |
4587 | data, size); | 4595 | data, size); |
4588 | if (!driver_loaded) | 4596 | if (!driver_loaded) |
4589 | bnx2x_turn_off_sf(bp); | 4597 | bnx2x_turn_off_sf(bp, port); |
4590 | break; | 4598 | break; |
4591 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: | 4599 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT: |
4592 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE: | 4600 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE: |