diff options
| author | Luis R. Rodriguez <lrodriguez@atheros.com> | 2010-02-16 18:16:45 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-02-16 18:16:45 -0500 |
| commit | 496c185c9495629ef1c65387cb2594578393cfe0 (patch) | |
| tree | 4bf3e64ffd535328d9b5f05740d411298982cc37 /drivers/net/atl1c | |
| parent | d5aa407f59f5b83d2c50ec88f5bf56d40f1f8978 (diff) | |
atl1c: Add support for Atheros AR8152 and AR8152
AR8151 is a Gigabit Ethernet device. AR8152 devices are
Fast Ethernet devices, there are two revisions, a 1.0
and a 2.0 revision.
This has been tested against these devices:
Driver Model-name vendor:device Type
atl1c AR8131 1969:1063 Gigabit Ethernet
atl1c AR8132 1969:1062 Fast Ethernet
atl1c AR8151(v1.0) 1969:1073 Gigabit Ethernet
atl1c AR8152(v1.1) 1969:2060 Fast Ethernet
This device has no hardware available yet so it goes untested,
but it should work:
atl1c AR8152(v2.0) 1969:2062 Fast Ethernet
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/atl1c')
| -rw-r--r-- | drivers/net/atl1c/atl1c.h | 11 | ||||
| -rw-r--r-- | drivers/net/atl1c/atl1c_ethtool.c | 2 | ||||
| -rw-r--r-- | drivers/net/atl1c/atl1c_hw.c | 83 | ||||
| -rw-r--r-- | drivers/net/atl1c/atl1c_hw.h | 5 | ||||
| -rw-r--r-- | drivers/net/atl1c/atl1c_main.c | 115 |
5 files changed, 191 insertions, 25 deletions
diff --git a/drivers/net/atl1c/atl1c.h b/drivers/net/atl1c/atl1c.h index efe5435bc3d3..84ae905bf732 100644 --- a/drivers/net/atl1c/atl1c.h +++ b/drivers/net/atl1c/atl1c.h | |||
| @@ -313,6 +313,9 @@ enum atl1c_rss_type { | |||
| 313 | enum atl1c_nic_type { | 313 | enum atl1c_nic_type { |
| 314 | athr_l1c = 0, | 314 | athr_l1c = 0, |
| 315 | athr_l2c = 1, | 315 | athr_l2c = 1, |
| 316 | athr_l2c_b, | ||
| 317 | athr_l2c_b2, | ||
| 318 | athr_l1d, | ||
| 316 | }; | 319 | }; |
| 317 | 320 | ||
| 318 | enum atl1c_trans_queue { | 321 | enum atl1c_trans_queue { |
| @@ -426,8 +429,12 @@ struct atl1c_hw { | |||
| 426 | #define ATL1C_ASPM_L1_SUPPORT 0x0100 | 429 | #define ATL1C_ASPM_L1_SUPPORT 0x0100 |
| 427 | #define ATL1C_ASPM_CTRL_MON 0x0200 | 430 | #define ATL1C_ASPM_CTRL_MON 0x0200 |
| 428 | #define ATL1C_HIB_DISABLE 0x0400 | 431 | #define ATL1C_HIB_DISABLE 0x0400 |
| 429 | #define ATL1C_LINK_CAP_1000M 0x0800 | 432 | #define ATL1C_APS_MODE_ENABLE 0x0800 |
| 430 | #define ATL1C_FPGA_VERSION 0x8000 | 433 | #define ATL1C_LINK_EXT_SYNC 0x1000 |
| 434 | #define ATL1C_CLK_GATING_EN 0x2000 | ||
| 435 | #define ATL1C_FPGA_VERSION 0x8000 | ||
| 436 | u16 link_cap_flags; | ||
| 437 | #define ATL1C_LINK_CAP_1000M 0x0001 | ||
| 431 | u16 cmb_tpd; | 438 | u16 cmb_tpd; |
| 432 | u16 cmb_rrd; | 439 | u16 cmb_rrd; |
| 433 | u16 cmb_rx_timer; /* 2us resolution */ | 440 | u16 cmb_rx_timer; /* 2us resolution */ |
diff --git a/drivers/net/atl1c/atl1c_ethtool.c b/drivers/net/atl1c/atl1c_ethtool.c index 9b1e0eaebb5c..61a0f2ff11e9 100644 --- a/drivers/net/atl1c/atl1c_ethtool.c +++ b/drivers/net/atl1c/atl1c_ethtool.c | |||
| @@ -37,7 +37,7 @@ static int atl1c_get_settings(struct net_device *netdev, | |||
| 37 | SUPPORTED_100baseT_Full | | 37 | SUPPORTED_100baseT_Full | |
| 38 | SUPPORTED_Autoneg | | 38 | SUPPORTED_Autoneg | |
| 39 | SUPPORTED_TP); | 39 | SUPPORTED_TP); |
| 40 | if (hw->ctrl_flags & ATL1C_LINK_CAP_1000M) | 40 | if (hw->link_cap_flags & ATL1C_LINK_CAP_1000M) |
| 41 | ecmd->supported |= SUPPORTED_1000baseT_Full; | 41 | ecmd->supported |= SUPPORTED_1000baseT_Full; |
| 42 | 42 | ||
| 43 | ecmd->advertising = ADVERTISED_TP; | 43 | ecmd->advertising = ADVERTISED_TP; |
diff --git a/drivers/net/atl1c/atl1c_hw.c b/drivers/net/atl1c/atl1c_hw.c index 3e69b940b8f7..f1389d664a21 100644 --- a/drivers/net/atl1c/atl1c_hw.c +++ b/drivers/net/atl1c/atl1c_hw.c | |||
| @@ -70,17 +70,39 @@ static int atl1c_get_permanent_address(struct atl1c_hw *hw) | |||
| 70 | u32 otp_ctrl_data; | 70 | u32 otp_ctrl_data; |
| 71 | u32 twsi_ctrl_data; | 71 | u32 twsi_ctrl_data; |
| 72 | u8 eth_addr[ETH_ALEN]; | 72 | u8 eth_addr[ETH_ALEN]; |
| 73 | u16 phy_data; | ||
| 74 | bool raise_vol = false; | ||
| 73 | 75 | ||
| 74 | /* init */ | 76 | /* init */ |
| 75 | addr[0] = addr[1] = 0; | 77 | addr[0] = addr[1] = 0; |
| 76 | AT_READ_REG(hw, REG_OTP_CTRL, &otp_ctrl_data); | 78 | AT_READ_REG(hw, REG_OTP_CTRL, &otp_ctrl_data); |
| 77 | if (atl1c_check_eeprom_exist(hw)) { | 79 | if (atl1c_check_eeprom_exist(hw)) { |
| 78 | /* Enable OTP CLK */ | 80 | if (hw->nic_type == athr_l1c || hw->nic_type == athr_l2c_b) { |
| 79 | if (!(otp_ctrl_data & OTP_CTRL_CLK_EN)) { | 81 | /* Enable OTP CLK */ |
| 80 | otp_ctrl_data |= OTP_CTRL_CLK_EN; | 82 | if (!(otp_ctrl_data & OTP_CTRL_CLK_EN)) { |
| 81 | AT_WRITE_REG(hw, REG_OTP_CTRL, otp_ctrl_data); | 83 | otp_ctrl_data |= OTP_CTRL_CLK_EN; |
| 82 | AT_WRITE_FLUSH(hw); | 84 | AT_WRITE_REG(hw, REG_OTP_CTRL, otp_ctrl_data); |
| 83 | msleep(1); | 85 | AT_WRITE_FLUSH(hw); |
| 86 | msleep(1); | ||
| 87 | } | ||
| 88 | } | ||
| 89 | |||
| 90 | if (hw->nic_type == athr_l2c_b || | ||
| 91 | hw->nic_type == athr_l2c_b2 || | ||
| 92 | hw->nic_type == athr_l1d) { | ||
| 93 | atl1c_write_phy_reg(hw, MII_DBG_ADDR, 0x00); | ||
| 94 | if (atl1c_read_phy_reg(hw, MII_DBG_DATA, &phy_data)) | ||
| 95 | goto out; | ||
| 96 | phy_data &= 0xFF7F; | ||
| 97 | atl1c_write_phy_reg(hw, MII_DBG_DATA, phy_data); | ||
| 98 | |||
| 99 | atl1c_write_phy_reg(hw, MII_DBG_ADDR, 0x3B); | ||
| 100 | if (atl1c_read_phy_reg(hw, MII_DBG_DATA, &phy_data)) | ||
| 101 | goto out; | ||
| 102 | phy_data |= 0x8; | ||
| 103 | atl1c_write_phy_reg(hw, MII_DBG_DATA, phy_data); | ||
| 104 | udelay(20); | ||
| 105 | raise_vol = true; | ||
| 84 | } | 106 | } |
| 85 | 107 | ||
| 86 | AT_READ_REG(hw, REG_TWSI_CTRL, &twsi_ctrl_data); | 108 | AT_READ_REG(hw, REG_TWSI_CTRL, &twsi_ctrl_data); |
| @@ -96,11 +118,31 @@ static int atl1c_get_permanent_address(struct atl1c_hw *hw) | |||
| 96 | return -1; | 118 | return -1; |
| 97 | } | 119 | } |
| 98 | /* Disable OTP_CLK */ | 120 | /* Disable OTP_CLK */ |
| 99 | if (otp_ctrl_data & OTP_CTRL_CLK_EN) { | 121 | if ((hw->nic_type == athr_l1c || hw->nic_type == athr_l2c)) { |
| 100 | otp_ctrl_data &= ~OTP_CTRL_CLK_EN; | 122 | if (otp_ctrl_data & OTP_CTRL_CLK_EN) { |
| 101 | AT_WRITE_REG(hw, REG_OTP_CTRL, otp_ctrl_data); | 123 | otp_ctrl_data &= ~OTP_CTRL_CLK_EN; |
| 102 | AT_WRITE_FLUSH(hw); | 124 | AT_WRITE_REG(hw, REG_OTP_CTRL, otp_ctrl_data); |
| 103 | msleep(1); | 125 | AT_WRITE_FLUSH(hw); |
| 126 | msleep(1); | ||
| 127 | } | ||
| 128 | } | ||
| 129 | if (raise_vol) { | ||
| 130 | if (hw->nic_type == athr_l2c_b || | ||
| 131 | hw->nic_type == athr_l2c_b2 || | ||
| 132 | hw->nic_type == athr_l1d) { | ||
| 133 | atl1c_write_phy_reg(hw, MII_DBG_ADDR, 0x00); | ||
| 134 | if (atl1c_read_phy_reg(hw, MII_DBG_DATA, &phy_data)) | ||
| 135 | goto out; | ||
| 136 | phy_data |= 0x80; | ||
| 137 | atl1c_write_phy_reg(hw, MII_DBG_DATA, phy_data); | ||
| 138 | |||
| 139 | atl1c_write_phy_reg(hw, MII_DBG_ADDR, 0x3B); | ||
| 140 | if (atl1c_read_phy_reg(hw, MII_DBG_DATA, &phy_data)) | ||
| 141 | goto out; | ||
| 142 | phy_data &= 0xFFF7; | ||
| 143 | atl1c_write_phy_reg(hw, MII_DBG_DATA, phy_data); | ||
| 144 | udelay(20); | ||
| 145 | } | ||
| 104 | } | 146 | } |
| 105 | 147 | ||
| 106 | /* maybe MAC-address is from BIOS */ | 148 | /* maybe MAC-address is from BIOS */ |
| @@ -114,6 +156,7 @@ static int atl1c_get_permanent_address(struct atl1c_hw *hw) | |||
| 114 | return 0; | 156 | return 0; |
| 115 | } | 157 | } |
| 116 | 158 | ||
| 159 | out: | ||
| 117 | return -1; | 160 | return -1; |
| 118 | } | 161 | } |
| 119 | 162 | ||
| @@ -307,7 +350,7 @@ static int atl1c_phy_setup_adv(struct atl1c_hw *hw) | |||
| 307 | mii_adv_data |= ADVERTISE_10HALF | ADVERTISE_10FULL | | 350 | mii_adv_data |= ADVERTISE_10HALF | ADVERTISE_10FULL | |
| 308 | ADVERTISE_100HALF | ADVERTISE_100FULL; | 351 | ADVERTISE_100HALF | ADVERTISE_100FULL; |
| 309 | 352 | ||
| 310 | if (hw->ctrl_flags & ATL1C_LINK_CAP_1000M) { | 353 | if (hw->link_cap_flags & ATL1C_LINK_CAP_1000M) { |
| 311 | if (hw->autoneg_advertised & ADVERTISED_1000baseT_Half) | 354 | if (hw->autoneg_advertised & ADVERTISED_1000baseT_Half) |
| 312 | mii_giga_ctrl_data |= ADVERTISE_1000HALF; | 355 | mii_giga_ctrl_data |= ADVERTISE_1000HALF; |
| 313 | if (hw->autoneg_advertised & ADVERTISED_1000baseT_Full) | 356 | if (hw->autoneg_advertised & ADVERTISED_1000baseT_Full) |
| @@ -389,6 +432,7 @@ int atl1c_phy_reset(struct atl1c_hw *hw) | |||
| 389 | { | 432 | { |
| 390 | struct atl1c_adapter *adapter = hw->adapter; | 433 | struct atl1c_adapter *adapter = hw->adapter; |
| 391 | struct pci_dev *pdev = adapter->pdev; | 434 | struct pci_dev *pdev = adapter->pdev; |
| 435 | u16 phy_data; | ||
| 392 | u32 phy_ctrl_data = GPHY_CTRL_DEFAULT; | 436 | u32 phy_ctrl_data = GPHY_CTRL_DEFAULT; |
| 393 | u32 mii_ier_data = IER_LINK_UP | IER_LINK_DOWN; | 437 | u32 mii_ier_data = IER_LINK_UP | IER_LINK_DOWN; |
| 394 | int err; | 438 | int err; |
| @@ -404,6 +448,21 @@ int atl1c_phy_reset(struct atl1c_hw *hw) | |||
| 404 | AT_WRITE_FLUSH(hw); | 448 | AT_WRITE_FLUSH(hw); |
| 405 | msleep(10); | 449 | msleep(10); |
| 406 | 450 | ||
| 451 | if (hw->nic_type == athr_l2c_b) { | ||
| 452 | atl1c_write_phy_reg(hw, MII_DBG_ADDR, 0x0A); | ||
| 453 | atl1c_read_phy_reg(hw, MII_DBG_DATA, &phy_data); | ||
| 454 | atl1c_write_phy_reg(hw, MII_DBG_DATA, phy_data & 0xDFFF); | ||
| 455 | } | ||
| 456 | |||
| 457 | if (hw->nic_type == athr_l2c_b || | ||
| 458 | hw->nic_type == athr_l2c_b2 || | ||
| 459 | hw->nic_type == athr_l1d) { | ||
| 460 | atl1c_write_phy_reg(hw, MII_DBG_ADDR, 0x3B); | ||
| 461 | atl1c_read_phy_reg(hw, MII_DBG_DATA, &phy_data); | ||
| 462 | atl1c_write_phy_reg(hw, MII_DBG_DATA, phy_data & 0xFFF7); | ||
| 463 | msleep(20); | ||
| 464 | } | ||
| 465 | |||
| 407 | /*Enable PHY LinkChange Interrupt */ | 466 | /*Enable PHY LinkChange Interrupt */ |
| 408 | err = atl1c_write_phy_reg(hw, MII_IER, mii_ier_data); | 467 | err = atl1c_write_phy_reg(hw, MII_IER, mii_ier_data); |
| 409 | if (err) { | 468 | if (err) { |
diff --git a/drivers/net/atl1c/atl1c_hw.h b/drivers/net/atl1c/atl1c_hw.h index c2c738df5c63..1eeb3ed9f0cb 100644 --- a/drivers/net/atl1c/atl1c_hw.h +++ b/drivers/net/atl1c/atl1c_hw.h | |||
| @@ -57,6 +57,7 @@ int atl1c_restart_autoneg(struct atl1c_hw *hw); | |||
| 57 | #define REG_LINK_CTRL 0x68 | 57 | #define REG_LINK_CTRL 0x68 |
| 58 | #define LINK_CTRL_L0S_EN 0x01 | 58 | #define LINK_CTRL_L0S_EN 0x01 |
| 59 | #define LINK_CTRL_L1_EN 0x02 | 59 | #define LINK_CTRL_L1_EN 0x02 |
| 60 | #define LINK_CTRL_EXT_SYNC 0x80 | ||
| 60 | 61 | ||
| 61 | #define REG_VPD_CAP 0x6C | 62 | #define REG_VPD_CAP 0x6C |
| 62 | #define VPD_CAP_ID_MASK 0xff | 63 | #define VPD_CAP_ID_MASK 0xff |
| @@ -156,6 +157,8 @@ int atl1c_restart_autoneg(struct atl1c_hw *hw); | |||
| 156 | #define PM_CTRL_PM_REQ_TIMER_SHIFT 20 | 157 | #define PM_CTRL_PM_REQ_TIMER_SHIFT 20 |
| 157 | #define PM_CTRL_LCKDET_TIMER_MASK 0x3F | 158 | #define PM_CTRL_LCKDET_TIMER_MASK 0x3F |
| 158 | #define PM_CTRL_LCKDET_TIMER_SHIFT 24 | 159 | #define PM_CTRL_LCKDET_TIMER_SHIFT 24 |
| 160 | #define PM_CTRL_EN_BUFS_RX_L0S 0x10000000 | ||
| 161 | #define PM_CTRL_SA_DLY_EN 0x20000000 | ||
| 159 | #define PM_CTRL_MAC_ASPM_CHK 0x40000000 | 162 | #define PM_CTRL_MAC_ASPM_CHK 0x40000000 |
| 160 | #define PM_CTRL_HOTRST 0x80000000 | 163 | #define PM_CTRL_HOTRST 0x80000000 |
| 161 | 164 | ||
| @@ -314,6 +317,8 @@ int atl1c_restart_autoneg(struct atl1c_hw *hw); | |||
| 314 | #define MAC_CTRL_BC_EN 0x4000000 | 317 | #define MAC_CTRL_BC_EN 0x4000000 |
| 315 | #define MAC_CTRL_DBG 0x8000000 | 318 | #define MAC_CTRL_DBG 0x8000000 |
| 316 | #define MAC_CTRL_SINGLE_PAUSE_EN 0x10000000 | 319 | #define MAC_CTRL_SINGLE_PAUSE_EN 0x10000000 |
| 320 | #define MAC_CTRL_HASH_ALG_CRC32 0x20000000 | ||
| 321 | #define MAC_CTRL_SPEED_MODE_SW 0x40000000 | ||
| 317 | 322 | ||
| 318 | /* MAC IPG/IFG Control Register */ | 323 | /* MAC IPG/IFG Control Register */ |
| 319 | #define REG_MAC_IPG_IFG 0x1484 | 324 | #define REG_MAC_IPG_IFG 0x1484 |
diff --git a/drivers/net/atl1c/atl1c_main.c b/drivers/net/atl1c/atl1c_main.c index d98095df05be..3d4c0a5a77eb 100644 --- a/drivers/net/atl1c/atl1c_main.c +++ b/drivers/net/atl1c/atl1c_main.c | |||
| @@ -21,11 +21,18 @@ | |||
| 21 | 21 | ||
| 22 | #include "atl1c.h" | 22 | #include "atl1c.h" |
| 23 | 23 | ||
| 24 | #define ATL1C_DRV_VERSION "1.0.0.1-NAPI" | 24 | #define ATL1C_DRV_VERSION "1.0.0.2-NAPI" |
| 25 | char atl1c_driver_name[] = "atl1c"; | 25 | char atl1c_driver_name[] = "atl1c"; |
| 26 | char atl1c_driver_version[] = ATL1C_DRV_VERSION; | 26 | char atl1c_driver_version[] = ATL1C_DRV_VERSION; |
| 27 | #define PCI_DEVICE_ID_ATTANSIC_L2C 0x1062 | 27 | #define PCI_DEVICE_ID_ATTANSIC_L2C 0x1062 |
| 28 | #define PCI_DEVICE_ID_ATTANSIC_L1C 0x1063 | 28 | #define PCI_DEVICE_ID_ATTANSIC_L1C 0x1063 |
| 29 | #define PCI_DEVICE_ID_ATHEROS_L2C_B 0x2060 /* AR8152 v1.1 Fast 10/100 */ | ||
| 30 | #define PCI_DEVICE_ID_ATHEROS_L2C_B2 0x2062 /* AR8152 v2.0 Fast 10/100 */ | ||
| 31 | #define PCI_DEVICE_ID_ATHEROS_L1D 0x1073 /* AR8151 v1.0 Gigabit 1000 */ | ||
| 32 | |||
| 33 | #define L2CB_V10 0xc0 | ||
| 34 | #define L2CB_V11 0xc1 | ||
| 35 | |||
| 29 | /* | 36 | /* |
| 30 | * atl1c_pci_tbl - PCI Device ID Table | 37 | * atl1c_pci_tbl - PCI Device ID Table |
| 31 | * | 38 | * |
| @@ -38,6 +45,9 @@ char atl1c_driver_version[] = ATL1C_DRV_VERSION; | |||
| 38 | static DEFINE_PCI_DEVICE_TABLE(atl1c_pci_tbl) = { | 45 | static DEFINE_PCI_DEVICE_TABLE(atl1c_pci_tbl) = { |
| 39 | {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L1C)}, | 46 | {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L1C)}, |
| 40 | {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L2C)}, | 47 | {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L2C)}, |
| 48 | {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L2C_B)}, | ||
| 49 | {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L2C_B2)}, | ||
| 50 | {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATHEROS_L1D)}, | ||
| 41 | /* required last entry */ | 51 | /* required last entry */ |
| 42 | { 0 } | 52 | { 0 } |
| 43 | }; | 53 | }; |
| @@ -593,11 +603,18 @@ static void atl1c_set_mac_type(struct atl1c_hw *hw) | |||
| 593 | case PCI_DEVICE_ID_ATTANSIC_L2C: | 603 | case PCI_DEVICE_ID_ATTANSIC_L2C: |
| 594 | hw->nic_type = athr_l2c; | 604 | hw->nic_type = athr_l2c; |
| 595 | break; | 605 | break; |
| 596 | |||
| 597 | case PCI_DEVICE_ID_ATTANSIC_L1C: | 606 | case PCI_DEVICE_ID_ATTANSIC_L1C: |
| 598 | hw->nic_type = athr_l1c; | 607 | hw->nic_type = athr_l1c; |
| 599 | break; | 608 | break; |
| 600 | 609 | case PCI_DEVICE_ID_ATHEROS_L2C_B: | |
| 610 | hw->nic_type = athr_l2c_b; | ||
| 611 | break; | ||
| 612 | case PCI_DEVICE_ID_ATHEROS_L2C_B2: | ||
| 613 | hw->nic_type = athr_l2c_b2; | ||
| 614 | break; | ||
| 615 | case PCI_DEVICE_ID_ATHEROS_L1D: | ||
| 616 | hw->nic_type = athr_l1d; | ||
| 617 | break; | ||
| 601 | default: | 618 | default: |
| 602 | break; | 619 | break; |
| 603 | } | 620 | } |
| @@ -620,10 +637,13 @@ static int atl1c_setup_mac_funcs(struct atl1c_hw *hw) | |||
| 620 | hw->ctrl_flags |= ATL1C_ASPM_L0S_SUPPORT; | 637 | hw->ctrl_flags |= ATL1C_ASPM_L0S_SUPPORT; |
| 621 | if (link_ctrl_data & LINK_CTRL_L1_EN) | 638 | if (link_ctrl_data & LINK_CTRL_L1_EN) |
| 622 | hw->ctrl_flags |= ATL1C_ASPM_L1_SUPPORT; | 639 | hw->ctrl_flags |= ATL1C_ASPM_L1_SUPPORT; |
| 640 | if (link_ctrl_data & LINK_CTRL_EXT_SYNC) | ||
| 641 | hw->ctrl_flags |= ATL1C_LINK_EXT_SYNC; | ||
| 623 | 642 | ||
| 624 | if (hw->nic_type == athr_l1c) { | 643 | if (hw->nic_type == athr_l1c || |
| 644 | hw->nic_type == athr_l1d) { | ||
| 625 | hw->ctrl_flags |= ATL1C_ASPM_CTRL_MON; | 645 | hw->ctrl_flags |= ATL1C_ASPM_CTRL_MON; |
| 626 | hw->ctrl_flags |= ATL1C_LINK_CAP_1000M; | 646 | hw->link_cap_flags |= ATL1C_LINK_CAP_1000M; |
| 627 | } | 647 | } |
| 628 | return 0; | 648 | return 0; |
| 629 | } | 649 | } |
| @@ -1234,21 +1254,92 @@ static void atl1c_disable_l0s_l1(struct atl1c_hw *hw) | |||
| 1234 | static void atl1c_set_aspm(struct atl1c_hw *hw, bool linkup) | 1254 | static void atl1c_set_aspm(struct atl1c_hw *hw, bool linkup) |
| 1235 | { | 1255 | { |
| 1236 | u32 pm_ctrl_data; | 1256 | u32 pm_ctrl_data; |
| 1257 | u32 link_ctrl_data; | ||
| 1237 | 1258 | ||
| 1238 | AT_READ_REG(hw, REG_PM_CTRL, &pm_ctrl_data); | 1259 | AT_READ_REG(hw, REG_PM_CTRL, &pm_ctrl_data); |
| 1239 | 1260 | AT_READ_REG(hw, REG_LINK_CTRL, &link_ctrl_data); | |
| 1240 | pm_ctrl_data &= ~PM_CTRL_SERDES_PD_EX_L1; | 1261 | pm_ctrl_data &= ~PM_CTRL_SERDES_PD_EX_L1; |
| 1262 | |||
| 1241 | pm_ctrl_data &= ~(PM_CTRL_L1_ENTRY_TIMER_MASK << | 1263 | pm_ctrl_data &= ~(PM_CTRL_L1_ENTRY_TIMER_MASK << |
| 1242 | PM_CTRL_L1_ENTRY_TIMER_SHIFT); | 1264 | PM_CTRL_L1_ENTRY_TIMER_SHIFT); |
| 1265 | pm_ctrl_data &= ~(PM_CTRL_LCKDET_TIMER_MASK << | ||
| 1266 | PM_CTRL_LCKDET_TIMER_SHIFT); | ||
| 1243 | 1267 | ||
| 1244 | pm_ctrl_data |= PM_CTRL_MAC_ASPM_CHK; | 1268 | pm_ctrl_data |= PM_CTRL_MAC_ASPM_CHK; |
| 1269 | pm_ctrl_data &= ~PM_CTRL_ASPM_L1_EN; | ||
| 1270 | pm_ctrl_data |= PM_CTRL_RBER_EN; | ||
| 1271 | pm_ctrl_data |= PM_CTRL_SDES_EN; | ||
| 1272 | |||
| 1273 | if (hw->nic_type == athr_l2c_b || | ||
| 1274 | hw->nic_type == athr_l1d || | ||
| 1275 | hw->nic_type == athr_l2c_b2) { | ||
| 1276 | link_ctrl_data &= ~LINK_CTRL_EXT_SYNC; | ||
| 1277 | if (!(hw->ctrl_flags & ATL1C_APS_MODE_ENABLE)) { | ||
| 1278 | if (hw->nic_type == athr_l2c_b && | ||
| 1279 | hw->revision_id == L2CB_V10) | ||
| 1280 | link_ctrl_data |= LINK_CTRL_EXT_SYNC; | ||
| 1281 | } | ||
| 1282 | |||
| 1283 | AT_WRITE_REG(hw, REG_LINK_CTRL, link_ctrl_data); | ||
| 1284 | |||
| 1285 | pm_ctrl_data |= PM_CTRL_PCIE_RECV; | ||
| 1286 | pm_ctrl_data |= AT_ASPM_L1_TIMER << PM_CTRL_PM_REQ_TIMER_SHIFT; | ||
| 1287 | pm_ctrl_data &= ~PM_CTRL_EN_BUFS_RX_L0S; | ||
| 1288 | pm_ctrl_data &= ~PM_CTRL_SA_DLY_EN; | ||
| 1289 | pm_ctrl_data &= ~PM_CTRL_HOTRST; | ||
| 1290 | pm_ctrl_data |= 1 << PM_CTRL_L1_ENTRY_TIMER_SHIFT; | ||
| 1291 | pm_ctrl_data |= PM_CTRL_SERDES_PD_EX_L1; | ||
| 1292 | } | ||
| 1245 | 1293 | ||
| 1246 | if (linkup) { | 1294 | if (linkup) { |
| 1247 | pm_ctrl_data |= PM_CTRL_SERDES_PLL_L1_EN; | 1295 | pm_ctrl_data &= ~PM_CTRL_ASPM_L1_EN; |
| 1248 | pm_ctrl_data &= ~PM_CTRL_CLK_SWH_L1; | 1296 | pm_ctrl_data &= ~PM_CTRL_ASPM_L0S_EN; |
| 1297 | if (hw->ctrl_flags & ATL1C_ASPM_L1_SUPPORT) | ||
| 1298 | pm_ctrl_data |= PM_CTRL_ASPM_L1_EN; | ||
| 1299 | if (hw->ctrl_flags & ATL1C_ASPM_L0S_SUPPORT) | ||
| 1300 | pm_ctrl_data |= PM_CTRL_ASPM_L0S_EN; | ||
| 1301 | |||
| 1302 | if (hw->nic_type == athr_l2c_b || | ||
| 1303 | hw->nic_type == athr_l1d || | ||
| 1304 | hw->nic_type == athr_l2c_b2) { | ||
| 1305 | if (hw->nic_type == athr_l2c_b) | ||
| 1306 | if (!(hw->ctrl_flags & ATL1C_APS_MODE_ENABLE)) | ||
| 1307 | pm_ctrl_data &= PM_CTRL_ASPM_L0S_EN; | ||
| 1308 | pm_ctrl_data &= ~PM_CTRL_SERDES_L1_EN; | ||
| 1309 | pm_ctrl_data &= ~PM_CTRL_SERDES_PLL_L1_EN; | ||
| 1310 | pm_ctrl_data &= ~PM_CTRL_SERDES_BUDS_RX_L1_EN; | ||
| 1311 | pm_ctrl_data |= PM_CTRL_CLK_SWH_L1; | ||
| 1312 | if (hw->adapter->link_speed == SPEED_100 || | ||
| 1313 | hw->adapter->link_speed == SPEED_1000) { | ||
| 1314 | pm_ctrl_data &= | ||
| 1315 | ~(PM_CTRL_L1_ENTRY_TIMER_MASK << | ||
| 1316 | PM_CTRL_L1_ENTRY_TIMER_SHIFT); | ||
| 1317 | if (hw->nic_type == athr_l1d) | ||
| 1318 | pm_ctrl_data |= 0xF << | ||
| 1319 | PM_CTRL_L1_ENTRY_TIMER_SHIFT; | ||
| 1320 | else | ||
| 1321 | pm_ctrl_data |= 7 << | ||
| 1322 | PM_CTRL_L1_ENTRY_TIMER_SHIFT; | ||
| 1323 | } | ||
| 1324 | } else { | ||
| 1325 | pm_ctrl_data |= PM_CTRL_SERDES_L1_EN; | ||
| 1326 | pm_ctrl_data |= PM_CTRL_SERDES_PLL_L1_EN; | ||
| 1327 | pm_ctrl_data |= PM_CTRL_SERDES_BUDS_RX_L1_EN; | ||
| 1328 | pm_ctrl_data &= ~PM_CTRL_CLK_SWH_L1; | ||
| 1329 | pm_ctrl_data &= ~PM_CTRL_ASPM_L0S_EN; | ||
| 1330 | pm_ctrl_data &= ~PM_CTRL_ASPM_L1_EN; | ||
| 1331 | } | ||
| 1332 | atl1c_write_phy_reg(hw, MII_DBG_ADDR, 0x29); | ||
| 1333 | if (hw->adapter->link_speed == SPEED_10) | ||
| 1334 | if (hw->nic_type == athr_l1d) | ||
| 1335 | atl1c_write_phy_reg(hw, MII_DBG_ADDR, 0xB69D); | ||
| 1336 | else | ||
| 1337 | atl1c_write_phy_reg(hw, MII_DBG_DATA, 0xB6DD); | ||
| 1338 | else if (hw->adapter->link_speed == SPEED_100) | ||
| 1339 | atl1c_write_phy_reg(hw, MII_DBG_DATA, 0xB2DD); | ||
| 1340 | else | ||
| 1341 | atl1c_write_phy_reg(hw, MII_DBG_DATA, 0x96DD); | ||
| 1249 | 1342 | ||
| 1250 | pm_ctrl_data |= PM_CTRL_SERDES_BUDS_RX_L1_EN; | ||
| 1251 | pm_ctrl_data |= PM_CTRL_SERDES_L1_EN; | ||
| 1252 | } else { | 1343 | } else { |
| 1253 | pm_ctrl_data &= ~PM_CTRL_SERDES_BUDS_RX_L1_EN; | 1344 | pm_ctrl_data &= ~PM_CTRL_SERDES_BUDS_RX_L1_EN; |
| 1254 | pm_ctrl_data &= ~PM_CTRL_SERDES_L1_EN; | 1345 | pm_ctrl_data &= ~PM_CTRL_SERDES_L1_EN; |
| @@ -1302,6 +1393,10 @@ static void atl1c_setup_mac_ctrl(struct atl1c_adapter *adapter) | |||
| 1302 | mac_ctrl_data |= MAC_CTRL_MC_ALL_EN; | 1393 | mac_ctrl_data |= MAC_CTRL_MC_ALL_EN; |
| 1303 | 1394 | ||
| 1304 | mac_ctrl_data |= MAC_CTRL_SINGLE_PAUSE_EN; | 1395 | mac_ctrl_data |= MAC_CTRL_SINGLE_PAUSE_EN; |
| 1396 | if (hw->nic_type == athr_l1d || hw->nic_type == athr_l2c_b2) { | ||
| 1397 | mac_ctrl_data |= MAC_CTRL_SPEED_MODE_SW; | ||
| 1398 | mac_ctrl_data |= MAC_CTRL_HASH_ALG_CRC32; | ||
| 1399 | } | ||
| 1305 | AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data); | 1400 | AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data); |
| 1306 | } | 1401 | } |
| 1307 | 1402 | ||
