aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000/e1000_hw.c
diff options
context:
space:
mode:
authorJeff Kirsher <jeffrey.t.kirsher@intel.com>2006-03-02 21:21:10 -0500
committerroot <root@jk-desktop.jf.intel.com>2006-03-02 21:21:10 -0500
commit6418ecc68e1d9416451b6f78ebb2c0b077e0abf2 (patch)
tree4fa4a491d559b388e7461192455bd0ebbca5d2b5 /drivers/net/e1000/e1000_hw.c
parent2a1af5d7dfd809b16fb69f3f0fc073d9b6b7c6ac (diff)
e1000: Add support for new hardware (ESB2)
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Signed-off-by: John Ronciak <john.ronciak@intel.com>
Diffstat (limited to 'drivers/net/e1000/e1000_hw.c')
-rw-r--r--drivers/net/e1000/e1000_hw.c685
1 files changed, 669 insertions, 16 deletions
diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c
index 5ee42c75adb1..63e237084a51 100644
--- a/drivers/net/e1000/e1000_hw.c
+++ b/drivers/net/e1000/e1000_hw.c
@@ -100,6 +100,8 @@ static void e1000_write_reg_io(struct e1000_hw *hw, uint32_t offset,
100 100
101#define E1000_WRITE_REG_IO(a, reg, val) \ 101#define E1000_WRITE_REG_IO(a, reg, val) \
102 e1000_write_reg_io((a), E1000_##reg, val) 102 e1000_write_reg_io((a), E1000_##reg, val)
103static int32_t e1000_configure_kmrn_for_10_100(struct e1000_hw *hw);
104static int32_t e1000_configure_kmrn_for_1000(struct e1000_hw *hw);
103 105
104/* IGP cable length table */ 106/* IGP cable length table */
105static const 107static const
@@ -153,6 +155,11 @@ e1000_set_phy_type(struct e1000_hw *hw)
153 hw->phy_type = e1000_phy_igp; 155 hw->phy_type = e1000_phy_igp;
154 break; 156 break;
155 } 157 }
158 case GG82563_E_PHY_ID:
159 if (hw->mac_type == e1000_80003es2lan) {
160 hw->phy_type = e1000_phy_gg82563;
161 break;
162 }
156 /* Fall Through */ 163 /* Fall Through */
157 default: 164 default:
158 /* Should never have loaded on this device */ 165 /* Should never have loaded on this device */
@@ -353,12 +360,19 @@ e1000_set_mac_type(struct e1000_hw *hw)
353 case E1000_DEV_ID_82573L: 360 case E1000_DEV_ID_82573L:
354 hw->mac_type = e1000_82573; 361 hw->mac_type = e1000_82573;
355 break; 362 break;
363 case E1000_DEV_ID_80003ES2LAN_COPPER_DPT:
364 case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
365 hw->mac_type = e1000_80003es2lan;
366 break;
356 default: 367 default:
357 /* Should never have loaded on this device */ 368 /* Should never have loaded on this device */
358 return -E1000_ERR_MAC_TYPE; 369 return -E1000_ERR_MAC_TYPE;
359 } 370 }
360 371
361 switch(hw->mac_type) { 372 switch(hw->mac_type) {
373 case e1000_80003es2lan:
374 hw->swfw_sync_present = TRUE;
375 /* fall through */
362 case e1000_82571: 376 case e1000_82571:
363 case e1000_82572: 377 case e1000_82572:
364 case e1000_82573: 378 case e1000_82573:
@@ -399,6 +413,7 @@ e1000_set_media_type(struct e1000_hw *hw)
399 case E1000_DEV_ID_82546GB_SERDES: 413 case E1000_DEV_ID_82546GB_SERDES:
400 case E1000_DEV_ID_82571EB_SERDES: 414 case E1000_DEV_ID_82571EB_SERDES:
401 case E1000_DEV_ID_82572EI_SERDES: 415 case E1000_DEV_ID_82572EI_SERDES:
416 case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
402 hw->media_type = e1000_media_type_internal_serdes; 417 hw->media_type = e1000_media_type_internal_serdes;
403 break; 418 break;
404 default: 419 default:
@@ -575,6 +590,7 @@ e1000_reset_hw(struct e1000_hw *hw)
575 /* fall through */ 590 /* fall through */
576 case e1000_82571: 591 case e1000_82571:
577 case e1000_82572: 592 case e1000_82572:
593 case e1000_80003es2lan:
578 ret_val = e1000_get_auto_rd_done(hw); 594 ret_val = e1000_get_auto_rd_done(hw);
579 if(ret_val) 595 if(ret_val)
580 /* We don't want to continue accessing MAC registers. */ 596 /* We don't want to continue accessing MAC registers. */
@@ -641,6 +657,7 @@ e1000_init_hw(struct e1000_hw *hw)
641 uint16_t cmd_mmrbc; 657 uint16_t cmd_mmrbc;
642 uint16_t stat_mmrbc; 658 uint16_t stat_mmrbc;
643 uint32_t mta_size; 659 uint32_t mta_size;
660 uint32_t reg_data;
644 uint32_t ctrl_ext; 661 uint32_t ctrl_ext;
645 662
646 DEBUGFUNC("e1000_init_hw"); 663 DEBUGFUNC("e1000_init_hw");
@@ -739,6 +756,7 @@ e1000_init_hw(struct e1000_hw *hw)
739 case e1000_82571: 756 case e1000_82571:
740 case e1000_82572: 757 case e1000_82572:
741 case e1000_82573: 758 case e1000_82573:
759 case e1000_80003es2lan:
742 ctrl |= E1000_TXDCTL_COUNT_DESC; 760 ctrl |= E1000_TXDCTL_COUNT_DESC;
743 break; 761 break;
744 } 762 }
@@ -752,12 +770,34 @@ e1000_init_hw(struct e1000_hw *hw)
752 switch (hw->mac_type) { 770 switch (hw->mac_type) {
753 default: 771 default:
754 break; 772 break;
773 case e1000_80003es2lan:
774 /* Enable retransmit on late collisions */
775 reg_data = E1000_READ_REG(hw, TCTL);
776 reg_data |= E1000_TCTL_RTLC;
777 E1000_WRITE_REG(hw, TCTL, reg_data);
778
779 /* Configure Gigabit Carry Extend Padding */
780 reg_data = E1000_READ_REG(hw, TCTL_EXT);
781 reg_data &= ~E1000_TCTL_EXT_GCEX_MASK;
782 reg_data |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
783 E1000_WRITE_REG(hw, TCTL_EXT, reg_data);
784
785 /* Configure Transmit Inter-Packet Gap */
786 reg_data = E1000_READ_REG(hw, TIPG);
787 reg_data &= ~E1000_TIPG_IPGT_MASK;
788 reg_data |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000;
789 E1000_WRITE_REG(hw, TIPG, reg_data);
790
791 reg_data = E1000_READ_REG_ARRAY(hw, FFLT, 0x0001);
792 reg_data &= ~0x00100000;
793 E1000_WRITE_REG_ARRAY(hw, FFLT, 0x0001, reg_data);
794 /* Fall through */
755 case e1000_82571: 795 case e1000_82571:
756 case e1000_82572: 796 case e1000_82572:
757 ctrl = E1000_READ_REG(hw, TXDCTL1); 797 ctrl = E1000_READ_REG(hw, TXDCTL1);
758 ctrl &= ~E1000_TXDCTL_WTHRESH; 798 ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB;
759 ctrl |= E1000_TXDCTL_COUNT_DESC | E1000_TXDCTL_FULL_TX_DESC_WB; 799 if(hw->mac_type >= e1000_82571)
760 ctrl |= (1 << 22); 800 ctrl |= E1000_TXDCTL_COUNT_DESC;
761 E1000_WRITE_REG(hw, TXDCTL1, ctrl); 801 E1000_WRITE_REG(hw, TXDCTL1, ctrl);
762 break; 802 break;
763 } 803 }
@@ -1314,6 +1354,154 @@ e1000_copper_link_igp_setup(struct e1000_hw *hw)
1314 return E1000_SUCCESS; 1354 return E1000_SUCCESS;
1315} 1355}
1316 1356
1357/********************************************************************
1358* Copper link setup for e1000_phy_gg82563 series.
1359*
1360* hw - Struct containing variables accessed by shared code
1361*********************************************************************/
1362static int32_t
1363e1000_copper_link_ggp_setup(struct e1000_hw *hw)
1364{
1365 int32_t ret_val;
1366 uint16_t phy_data;
1367 uint32_t reg_data;
1368
1369 DEBUGFUNC("e1000_copper_link_ggp_setup");
1370
1371 if(!hw->phy_reset_disable) {
1372
1373 /* Enable CRS on TX for half-duplex operation. */
1374 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
1375 &phy_data);
1376 if(ret_val)
1377 return ret_val;
1378
1379 phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX;
1380 /* Use 25MHz for both link down and 1000BASE-T for Tx clock */
1381 phy_data |= GG82563_MSCR_TX_CLK_1000MBPS_25MHZ;
1382
1383 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
1384 phy_data);
1385 if(ret_val)
1386 return ret_val;
1387
1388 /* Options:
1389 * MDI/MDI-X = 0 (default)
1390 * 0 - Auto for all speeds
1391 * 1 - MDI mode
1392 * 2 - MDI-X mode
1393 * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)
1394 */
1395 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_SPEC_CTRL, &phy_data);
1396 if(ret_val)
1397 return ret_val;
1398
1399 phy_data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK;
1400
1401 switch (hw->mdix) {
1402 case 1:
1403 phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDI;
1404 break;
1405 case 2:
1406 phy_data |= GG82563_PSCR_CROSSOVER_MODE_MDIX;
1407 break;
1408 case 0:
1409 default:
1410 phy_data |= GG82563_PSCR_CROSSOVER_MODE_AUTO;
1411 break;
1412 }
1413
1414 /* Options:
1415 * disable_polarity_correction = 0 (default)
1416 * Automatic Correction for Reversed Cable Polarity
1417 * 0 - Disabled
1418 * 1 - Enabled
1419 */
1420 phy_data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE;
1421 if(hw->disable_polarity_correction == 1)
1422 phy_data |= GG82563_PSCR_POLARITY_REVERSAL_DISABLE;
1423 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_SPEC_CTRL, phy_data);
1424
1425 if(ret_val)
1426 return ret_val;
1427
1428 /* SW Reset the PHY so all changes take effect */
1429 ret_val = e1000_phy_reset(hw);
1430 if (ret_val) {
1431 DEBUGOUT("Error Resetting the PHY\n");
1432 return ret_val;
1433 }
1434 } /* phy_reset_disable */
1435
1436 if (hw->mac_type == e1000_80003es2lan) {
1437 /* Bypass RX and TX FIFO's */
1438 ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_FIFO_CTRL,
1439 E1000_KUMCTRLSTA_FIFO_CTRL_RX_BYPASS |
1440 E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
1441 if (ret_val)
1442 return ret_val;
1443
1444 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_SPEC_CTRL_2, &phy_data);
1445 if (ret_val)
1446 return ret_val;
1447
1448 phy_data &= ~GG82563_PSCR2_REVERSE_AUTO_NEG;
1449 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_SPEC_CTRL_2, phy_data);
1450
1451 if (ret_val)
1452 return ret_val;
1453
1454 reg_data = E1000_READ_REG(hw, CTRL_EXT);
1455 reg_data &= ~(E1000_CTRL_EXT_LINK_MODE_MASK);
1456 E1000_WRITE_REG(hw, CTRL_EXT, reg_data);
1457
1458 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_PWR_MGMT_CTRL,
1459 &phy_data);
1460 if (ret_val)
1461 return ret_val;
1462
1463 /* Do not init these registers when the HW is in IAMT mode, since the
1464 * firmware will have already initialized them. We only initialize
1465 * them if the HW is not in IAMT mode.
1466 */
1467 if (e1000_check_mng_mode(hw) == FALSE) {
1468 /* Enable Electrical Idle on the PHY */
1469 phy_data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE;
1470 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_PWR_MGMT_CTRL,
1471 phy_data);
1472 if (ret_val)
1473 return ret_val;
1474
1475 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
1476 &phy_data);
1477 if (ret_val)
1478 return ret_val;
1479
1480 /* Enable Pass False Carrier on the PHY */
1481 phy_data |= GG82563_KMCR_PASS_FALSE_CARRIER;
1482
1483 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
1484 phy_data);
1485 if (ret_val)
1486 return ret_val;
1487 }
1488
1489 /* Workaround: Disable padding in Kumeran interface in the MAC
1490 * and in the PHY to avoid CRC errors.
1491 */
1492 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_INBAND_CTRL,
1493 &phy_data);
1494 if (ret_val)
1495 return ret_val;
1496 phy_data |= GG82563_ICR_DIS_PADDING;
1497 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_INBAND_CTRL,
1498 phy_data);
1499 if (ret_val)
1500 return ret_val;
1501 }
1502
1503 return E1000_SUCCESS;
1504}
1317 1505
1318/******************************************************************** 1506/********************************************************************
1319* Copper link setup for e1000_phy_m88 series. 1507* Copper link setup for e1000_phy_m88 series.
@@ -1524,6 +1712,7 @@ e1000_setup_copper_link(struct e1000_hw *hw)
1524 int32_t ret_val; 1712 int32_t ret_val;
1525 uint16_t i; 1713 uint16_t i;
1526 uint16_t phy_data; 1714 uint16_t phy_data;
1715 uint16_t reg_data;
1527 1716
1528 DEBUGFUNC("e1000_setup_copper_link"); 1717 DEBUGFUNC("e1000_setup_copper_link");
1529 1718
@@ -1532,6 +1721,22 @@ e1000_setup_copper_link(struct e1000_hw *hw)
1532 if(ret_val) 1721 if(ret_val)
1533 return ret_val; 1722 return ret_val;
1534 1723
1724 switch (hw->mac_type) {
1725 case e1000_80003es2lan:
1726 ret_val = e1000_read_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_INB_CTRL,
1727 &reg_data);
1728 if (ret_val)
1729 return ret_val;
1730 reg_data |= E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING;
1731 ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_INB_CTRL,
1732 reg_data);
1733 if (ret_val)
1734 return ret_val;
1735 break;
1736 default:
1737 break;
1738 }
1739
1535 if (hw->phy_type == e1000_phy_igp || 1740 if (hw->phy_type == e1000_phy_igp ||
1536 hw->phy_type == e1000_phy_igp_2) { 1741 hw->phy_type == e1000_phy_igp_2) {
1537 ret_val = e1000_copper_link_igp_setup(hw); 1742 ret_val = e1000_copper_link_igp_setup(hw);
@@ -1541,6 +1746,10 @@ e1000_setup_copper_link(struct e1000_hw *hw)
1541 ret_val = e1000_copper_link_mgp_setup(hw); 1746 ret_val = e1000_copper_link_mgp_setup(hw);
1542 if(ret_val) 1747 if(ret_val)
1543 return ret_val; 1748 return ret_val;
1749 } else if (hw->phy_type == e1000_phy_gg82563) {
1750 ret_val = e1000_copper_link_ggp_setup(hw);
1751 if(ret_val)
1752 return ret_val;
1544 } 1753 }
1545 1754
1546 if(hw->autoneg) { 1755 if(hw->autoneg) {
@@ -1588,6 +1797,59 @@ e1000_setup_copper_link(struct e1000_hw *hw)
1588} 1797}
1589 1798
1590/****************************************************************************** 1799/******************************************************************************
1800* Configure the MAC-to-PHY interface for 10/100Mbps
1801*
1802* hw - Struct containing variables accessed by shared code
1803******************************************************************************/
1804static int32_t
1805e1000_configure_kmrn_for_10_100(struct e1000_hw *hw)
1806{
1807 int32_t ret_val = E1000_SUCCESS;
1808 uint32_t tipg;
1809 uint16_t reg_data;
1810
1811 DEBUGFUNC("e1000_configure_kmrn_for_10_100");
1812
1813 reg_data = E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT;
1814 ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_HD_CTRL,
1815 reg_data);
1816 if (ret_val)
1817 return ret_val;
1818
1819 /* Configure Transmit Inter-Packet Gap */
1820 tipg = E1000_READ_REG(hw, TIPG);
1821 tipg &= ~E1000_TIPG_IPGT_MASK;
1822 tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_10_100;
1823 E1000_WRITE_REG(hw, TIPG, tipg);
1824
1825 return ret_val;
1826}
1827
1828static int32_t
1829e1000_configure_kmrn_for_1000(struct e1000_hw *hw)
1830{
1831 int32_t ret_val = E1000_SUCCESS;
1832 uint16_t reg_data;
1833 uint32_t tipg;
1834
1835 DEBUGFUNC("e1000_configure_kmrn_for_1000");
1836
1837 reg_data = E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT;
1838 ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_HD_CTRL,
1839 reg_data);
1840 if (ret_val)
1841 return ret_val;
1842
1843 /* Configure Transmit Inter-Packet Gap */
1844 tipg = E1000_READ_REG(hw, TIPG);
1845 tipg &= ~E1000_TIPG_IPGT_MASK;
1846 tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000;
1847 E1000_WRITE_REG(hw, TIPG, tipg);
1848
1849 return ret_val;
1850}
1851
1852/******************************************************************************
1591* Configures PHY autoneg and flow control advertisement settings 1853* Configures PHY autoneg and flow control advertisement settings
1592* 1854*
1593* hw - Struct containing variables accessed by shared code 1855* hw - Struct containing variables accessed by shared code
@@ -1808,7 +2070,8 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw)
1808 /* Write the configured values back to the Device Control Reg. */ 2070 /* Write the configured values back to the Device Control Reg. */
1809 E1000_WRITE_REG(hw, CTRL, ctrl); 2071 E1000_WRITE_REG(hw, CTRL, ctrl);
1810 2072
1811 if (hw->phy_type == e1000_phy_m88) { 2073 if ((hw->phy_type == e1000_phy_m88) ||
2074 (hw->phy_type == e1000_phy_gg82563)) {
1812 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); 2075 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
1813 if(ret_val) 2076 if(ret_val)
1814 return ret_val; 2077 return ret_val;
@@ -1877,7 +2140,8 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw)
1877 msec_delay(100); 2140 msec_delay(100);
1878 } 2141 }
1879 if((i == 0) && 2142 if((i == 0) &&
1880 (hw->phy_type == e1000_phy_m88)) { 2143 ((hw->phy_type == e1000_phy_m88) ||
2144 (hw->phy_type == e1000_phy_gg82563))) {
1881 /* We didn't get link. Reset the DSP and wait again for link. */ 2145 /* We didn't get link. Reset the DSP and wait again for link. */
1882 ret_val = e1000_phy_reset_dsp(hw); 2146 ret_val = e1000_phy_reset_dsp(hw);
1883 if(ret_val) { 2147 if(ret_val) {
@@ -1936,6 +2200,27 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw)
1936 if(ret_val) 2200 if(ret_val)
1937 return ret_val; 2201 return ret_val;
1938 } 2202 }
2203 } else if (hw->phy_type == e1000_phy_gg82563) {
2204 /* The TX_CLK of the Extended PHY Specific Control Register defaults
2205 * to 2.5MHz on a reset. We need to re-force it back to 25MHz, if
2206 * we're not in a forced 10/duplex configuration. */
2207 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, &phy_data);
2208 if (ret_val)
2209 return ret_val;
2210
2211 phy_data &= ~GG82563_MSCR_TX_CLK_MASK;
2212 if ((hw->forced_speed_duplex == e1000_10_full) ||
2213 (hw->forced_speed_duplex == e1000_10_half))
2214 phy_data |= GG82563_MSCR_TX_CLK_10MBPS_2_5MHZ;
2215 else
2216 phy_data |= GG82563_MSCR_TX_CLK_100MBPS_25MHZ;
2217
2218 /* Also due to the reset, we need to enable CRS on Tx. */
2219 phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX;
2220
2221 ret_val = e1000_write_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, phy_data);
2222 if (ret_val)
2223 return ret_val;
1939 } 2224 }
1940 return E1000_SUCCESS; 2225 return E1000_SUCCESS;
1941} 2226}
@@ -2598,6 +2883,16 @@ e1000_get_speed_and_duplex(struct e1000_hw *hw,
2598 } 2883 }
2599 } 2884 }
2600 2885
2886 if ((hw->mac_type == e1000_80003es2lan) &&
2887 (hw->media_type == e1000_media_type_copper)) {
2888 if (*speed == SPEED_1000)
2889 ret_val = e1000_configure_kmrn_for_1000(hw);
2890 else
2891 ret_val = e1000_configure_kmrn_for_10_100(hw);
2892 if (ret_val)
2893 return ret_val;
2894 }
2895
2601 return E1000_SUCCESS; 2896 return E1000_SUCCESS;
2602} 2897}
2603 2898
@@ -2773,6 +3068,72 @@ e1000_shift_in_mdi_bits(struct e1000_hw *hw)
2773 return data; 3068 return data;
2774} 3069}
2775 3070
3071int32_t
3072e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask)
3073{
3074 uint32_t swfw_sync = 0;
3075 uint32_t swmask = mask;
3076 uint32_t fwmask = mask << 16;
3077 int32_t timeout = 200;
3078
3079 DEBUGFUNC("e1000_swfw_sync_acquire");
3080
3081 if (!hw->swfw_sync_present)
3082 return e1000_get_hw_eeprom_semaphore(hw);
3083
3084 while(timeout) {
3085 if (e1000_get_hw_eeprom_semaphore(hw))
3086 return -E1000_ERR_SWFW_SYNC;
3087
3088 swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC);
3089 if (!(swfw_sync & (fwmask | swmask))) {
3090 break;
3091 }
3092
3093 /* firmware currently using resource (fwmask) */
3094 /* or other software thread currently using resource (swmask) */
3095 e1000_put_hw_eeprom_semaphore(hw);
3096 msec_delay_irq(5);
3097 timeout--;
3098 }
3099
3100 if (!timeout) {
3101 DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n");
3102 return -E1000_ERR_SWFW_SYNC;
3103 }
3104
3105 swfw_sync |= swmask;
3106 E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync);
3107
3108 e1000_put_hw_eeprom_semaphore(hw);
3109 return E1000_SUCCESS;
3110}
3111
3112void
3113e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask)
3114{
3115 uint32_t swfw_sync;
3116 uint32_t swmask = mask;
3117
3118 DEBUGFUNC("e1000_swfw_sync_release");
3119
3120 if (!hw->swfw_sync_present) {
3121 e1000_put_hw_eeprom_semaphore(hw);
3122 return;
3123 }
3124
3125 /* if (e1000_get_hw_eeprom_semaphore(hw))
3126 * return -E1000_ERR_SWFW_SYNC; */
3127 while (e1000_get_hw_eeprom_semaphore(hw) != E1000_SUCCESS);
3128 /* empty */
3129
3130 swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC);
3131 swfw_sync &= ~swmask;
3132 E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync);
3133
3134 e1000_put_hw_eeprom_semaphore(hw);
3135}
3136
2776/***************************************************************************** 3137/*****************************************************************************
2777* Reads the value from a PHY register, if the value is on a specific non zero 3138* Reads the value from a PHY register, if the value is on a specific non zero
2778* page, sets the page first. 3139* page, sets the page first.
@@ -2785,22 +3146,55 @@ e1000_read_phy_reg(struct e1000_hw *hw,
2785 uint16_t *phy_data) 3146 uint16_t *phy_data)
2786{ 3147{
2787 uint32_t ret_val; 3148 uint32_t ret_val;
3149 uint16_t swfw;
2788 3150
2789 DEBUGFUNC("e1000_read_phy_reg"); 3151 DEBUGFUNC("e1000_read_phy_reg");
2790 3152
3153 if ((hw->mac_type == e1000_80003es2lan) &&
3154 (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
3155 swfw = E1000_SWFW_PHY1_SM;
3156 } else {
3157 swfw = E1000_SWFW_PHY0_SM;
3158 }
3159 if (e1000_swfw_sync_acquire(hw, swfw))
3160 return -E1000_ERR_SWFW_SYNC;
3161
2791 if((hw->phy_type == e1000_phy_igp || 3162 if((hw->phy_type == e1000_phy_igp ||
2792 hw->phy_type == e1000_phy_igp_2) && 3163 hw->phy_type == e1000_phy_igp_2) &&
2793 (reg_addr > MAX_PHY_MULTI_PAGE_REG)) { 3164 (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
2794 ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT, 3165 ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
2795 (uint16_t)reg_addr); 3166 (uint16_t)reg_addr);
2796 if(ret_val) { 3167 if(ret_val) {
3168 e1000_swfw_sync_release(hw, swfw);
2797 return ret_val; 3169 return ret_val;
2798 } 3170 }
3171 } else if (hw->phy_type == e1000_phy_gg82563) {
3172 if (((reg_addr & MAX_PHY_REG_ADDRESS) > MAX_PHY_MULTI_PAGE_REG) ||
3173 (hw->mac_type == e1000_80003es2lan)) {
3174 /* Select Configuration Page */
3175 if ((reg_addr & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
3176 ret_val = e1000_write_phy_reg_ex(hw, GG82563_PHY_PAGE_SELECT,
3177 (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT));
3178 } else {
3179 /* Use Alternative Page Select register to access
3180 * registers 30 and 31
3181 */
3182 ret_val = e1000_write_phy_reg_ex(hw,
3183 GG82563_PHY_PAGE_SELECT_ALT,
3184 (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT));
3185 }
3186
3187 if (ret_val) {
3188 e1000_swfw_sync_release(hw, swfw);
3189 return ret_val;
3190 }
3191 }
2799 } 3192 }
2800 3193
2801 ret_val = e1000_read_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr, 3194 ret_val = e1000_read_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr,
2802 phy_data); 3195 phy_data);
2803 3196
3197 e1000_swfw_sync_release(hw, swfw);
2804 return ret_val; 3198 return ret_val;
2805} 3199}
2806 3200
@@ -2891,22 +3285,55 @@ e1000_write_phy_reg(struct e1000_hw *hw,
2891 uint16_t phy_data) 3285 uint16_t phy_data)
2892{ 3286{
2893 uint32_t ret_val; 3287 uint32_t ret_val;
3288 uint16_t swfw;
2894 3289
2895 DEBUGFUNC("e1000_write_phy_reg"); 3290 DEBUGFUNC("e1000_write_phy_reg");
2896 3291
3292 if ((hw->mac_type == e1000_80003es2lan) &&
3293 (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
3294 swfw = E1000_SWFW_PHY1_SM;
3295 } else {
3296 swfw = E1000_SWFW_PHY0_SM;
3297 }
3298 if (e1000_swfw_sync_acquire(hw, swfw))
3299 return -E1000_ERR_SWFW_SYNC;
3300
2897 if((hw->phy_type == e1000_phy_igp || 3301 if((hw->phy_type == e1000_phy_igp ||
2898 hw->phy_type == e1000_phy_igp_2) && 3302 hw->phy_type == e1000_phy_igp_2) &&
2899 (reg_addr > MAX_PHY_MULTI_PAGE_REG)) { 3303 (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
2900 ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT, 3304 ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
2901 (uint16_t)reg_addr); 3305 (uint16_t)reg_addr);
2902 if(ret_val) { 3306 if(ret_val) {
3307 e1000_swfw_sync_release(hw, swfw);
2903 return ret_val; 3308 return ret_val;
2904 } 3309 }
3310 } else if (hw->phy_type == e1000_phy_gg82563) {
3311 if (((reg_addr & MAX_PHY_REG_ADDRESS) > MAX_PHY_MULTI_PAGE_REG) ||
3312 (hw->mac_type == e1000_80003es2lan)) {
3313 /* Select Configuration Page */
3314 if ((reg_addr & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
3315 ret_val = e1000_write_phy_reg_ex(hw, GG82563_PHY_PAGE_SELECT,
3316 (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT));
3317 } else {
3318 /* Use Alternative Page Select register to access
3319 * registers 30 and 31
3320 */
3321 ret_val = e1000_write_phy_reg_ex(hw,
3322 GG82563_PHY_PAGE_SELECT_ALT,
3323 (uint16_t)((uint16_t)reg_addr >> GG82563_PAGE_SHIFT));
3324 }
3325
3326 if (ret_val) {
3327 e1000_swfw_sync_release(hw, swfw);
3328 return ret_val;
3329 }
3330 }
2905 } 3331 }
2906 3332
2907 ret_val = e1000_write_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr, 3333 ret_val = e1000_write_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr,
2908 phy_data); 3334 phy_data);
2909 3335
3336 e1000_swfw_sync_release(hw, swfw);
2910 return ret_val; 3337 return ret_val;
2911} 3338}
2912 3339
@@ -2973,6 +3400,65 @@ e1000_write_phy_reg_ex(struct e1000_hw *hw,
2973 return E1000_SUCCESS; 3400 return E1000_SUCCESS;
2974} 3401}
2975 3402
3403int32_t
3404e1000_read_kmrn_reg(struct e1000_hw *hw,
3405 uint32_t reg_addr,
3406 uint16_t *data)
3407{
3408 uint32_t reg_val;
3409 uint16_t swfw;
3410 DEBUGFUNC("e1000_read_kmrn_reg");
3411
3412 if ((hw->mac_type == e1000_80003es2lan) &&
3413 (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
3414 swfw = E1000_SWFW_PHY1_SM;
3415 } else {
3416 swfw = E1000_SWFW_PHY0_SM;
3417 }
3418 if (e1000_swfw_sync_acquire(hw, swfw))
3419 return -E1000_ERR_SWFW_SYNC;
3420
3421 /* Write register address */
3422 reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) &
3423 E1000_KUMCTRLSTA_OFFSET) |
3424 E1000_KUMCTRLSTA_REN;
3425 E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val);
3426 udelay(2);
3427
3428 /* Read the data returned */
3429 reg_val = E1000_READ_REG(hw, KUMCTRLSTA);
3430 *data = (uint16_t)reg_val;
3431
3432 e1000_swfw_sync_release(hw, swfw);
3433 return E1000_SUCCESS;
3434}
3435
3436int32_t
3437e1000_write_kmrn_reg(struct e1000_hw *hw,
3438 uint32_t reg_addr,
3439 uint16_t data)
3440{
3441 uint32_t reg_val;
3442 uint16_t swfw;
3443 DEBUGFUNC("e1000_write_kmrn_reg");
3444
3445 if ((hw->mac_type == e1000_80003es2lan) &&
3446 (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
3447 swfw = E1000_SWFW_PHY1_SM;
3448 } else {
3449 swfw = E1000_SWFW_PHY0_SM;
3450 }
3451 if (e1000_swfw_sync_acquire(hw, swfw))
3452 return -E1000_ERR_SWFW_SYNC;
3453
3454 reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) &
3455 E1000_KUMCTRLSTA_OFFSET) | data;
3456 E1000_WRITE_REG(hw, KUMCTRLSTA, reg_val);
3457 udelay(2);
3458
3459 e1000_swfw_sync_release(hw, swfw);
3460 return E1000_SUCCESS;
3461}
2976 3462
2977/****************************************************************************** 3463/******************************************************************************
2978* Returns the PHY to the power-on reset state 3464* Returns the PHY to the power-on reset state
@@ -2985,6 +3471,7 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
2985 uint32_t ctrl, ctrl_ext; 3471 uint32_t ctrl, ctrl_ext;
2986 uint32_t led_ctrl; 3472 uint32_t led_ctrl;
2987 int32_t ret_val; 3473 int32_t ret_val;
3474 uint16_t swfw;
2988 3475
2989 DEBUGFUNC("e1000_phy_hw_reset"); 3476 DEBUGFUNC("e1000_phy_hw_reset");
2990 3477
@@ -2997,6 +3484,16 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
2997 DEBUGOUT("Resetting Phy...\n"); 3484 DEBUGOUT("Resetting Phy...\n");
2998 3485
2999 if(hw->mac_type > e1000_82543) { 3486 if(hw->mac_type > e1000_82543) {
3487 if ((hw->mac_type == e1000_80003es2lan) &&
3488 (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
3489 swfw = E1000_SWFW_PHY1_SM;
3490 } else {
3491 swfw = E1000_SWFW_PHY0_SM;
3492 }
3493 if (e1000_swfw_sync_acquire(hw, swfw)) {
3494 e1000_release_software_semaphore(hw);
3495 return -E1000_ERR_SWFW_SYNC;
3496 }
3000 /* Read the device control register and assert the E1000_CTRL_PHY_RST 3497 /* Read the device control register and assert the E1000_CTRL_PHY_RST
3001 * bit. Then, take it out of reset. 3498 * bit. Then, take it out of reset.
3002 * For pre-e1000_82571 hardware, we delay for 10ms between the assert 3499 * For pre-e1000_82571 hardware, we delay for 10ms between the assert
@@ -3017,6 +3514,7 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
3017 3514
3018 if (hw->mac_type >= e1000_82571) 3515 if (hw->mac_type >= e1000_82571)
3019 msec_delay(10); 3516 msec_delay(10);
3517 e1000_swfw_sync_release(hw, swfw);
3020 } else { 3518 } else {
3021 /* Read the Extended Device Control Register, assert the PHY_RESET_DIR 3519 /* Read the Extended Device Control Register, assert the PHY_RESET_DIR
3022 * bit to put the PHY into reset. Then, take it out of reset. 3520 * bit to put the PHY into reset. Then, take it out of reset.
@@ -3043,6 +3541,7 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
3043 3541
3044 /* Wait for FW to finish PHY configuration. */ 3542 /* Wait for FW to finish PHY configuration. */
3045 ret_val = e1000_get_phy_cfg_done(hw); 3543 ret_val = e1000_get_phy_cfg_done(hw);
3544 e1000_release_software_semaphore(hw);
3046 3545
3047 return ret_val; 3546 return ret_val;
3048} 3547}
@@ -3120,6 +3619,15 @@ e1000_detect_gig_phy(struct e1000_hw *hw)
3120 return E1000_SUCCESS; 3619 return E1000_SUCCESS;
3121 } 3620 }
3122 3621
3622 /* ESB-2 PHY reads require e1000_phy_gg82563 to be set because of a work-
3623 * around that forces PHY page 0 to be set or the reads fail. The rest of
3624 * the code in this routine uses e1000_read_phy_reg to read the PHY ID.
3625 * So for ESB-2 we need to have this set so our reads won't fail. If the
3626 * attached PHY is not a e1000_phy_gg82563, the routines below will figure
3627 * this out as well. */
3628 if (hw->mac_type == e1000_80003es2lan)
3629 hw->phy_type = e1000_phy_gg82563;
3630
3123 /* Read the PHY ID Registers to identify which PHY is onboard. */ 3631 /* Read the PHY ID Registers to identify which PHY is onboard. */
3124 ret_val = e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high); 3632 ret_val = e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high);
3125 if(ret_val) 3633 if(ret_val)
@@ -3157,6 +3665,9 @@ e1000_detect_gig_phy(struct e1000_hw *hw)
3157 case e1000_82573: 3665 case e1000_82573:
3158 if(hw->phy_id == M88E1111_I_PHY_ID) match = TRUE; 3666 if(hw->phy_id == M88E1111_I_PHY_ID) match = TRUE;
3159 break; 3667 break;
3668 case e1000_80003es2lan:
3669 if (hw->phy_id == GG82563_E_PHY_ID) match = TRUE;
3670 break;
3160 default: 3671 default:
3161 DEBUGOUT1("Invalid MAC type %d\n", hw->mac_type); 3672 DEBUGOUT1("Invalid MAC type %d\n", hw->mac_type);
3162 return -E1000_ERR_CONFIG; 3673 return -E1000_ERR_CONFIG;
@@ -3183,8 +3694,10 @@ e1000_phy_reset_dsp(struct e1000_hw *hw)
3183 DEBUGFUNC("e1000_phy_reset_dsp"); 3694 DEBUGFUNC("e1000_phy_reset_dsp");
3184 3695
3185 do { 3696 do {
3186 ret_val = e1000_write_phy_reg(hw, 29, 0x001d); 3697 if (hw->phy_type != e1000_phy_gg82563) {
3187 if(ret_val) break; 3698 ret_val = e1000_write_phy_reg(hw, 29, 0x001d);
3699 if(ret_val) break;
3700 }
3188 ret_val = e1000_write_phy_reg(hw, 30, 0x00c1); 3701 ret_val = e1000_write_phy_reg(hw, 30, 0x00c1);
3189 if(ret_val) break; 3702 if(ret_val) break;
3190 ret_val = e1000_write_phy_reg(hw, 30, 0x0000); 3703 ret_val = e1000_write_phy_reg(hw, 30, 0x0000);
@@ -3316,8 +3829,17 @@ e1000_phy_m88_get_info(struct e1000_hw *hw,
3316 /* Cable Length Estimation and Local/Remote Receiver Information 3829 /* Cable Length Estimation and Local/Remote Receiver Information
3317 * are only valid at 1000 Mbps. 3830 * are only valid at 1000 Mbps.
3318 */ 3831 */
3319 phy_info->cable_length = ((phy_data & M88E1000_PSSR_CABLE_LENGTH) >> 3832 if (hw->phy_type != e1000_phy_gg82563) {
3320 M88E1000_PSSR_CABLE_LENGTH_SHIFT); 3833 phy_info->cable_length = ((phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
3834 M88E1000_PSSR_CABLE_LENGTH_SHIFT);
3835 } else {
3836 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_DSP_DISTANCE,
3837 &phy_data);
3838 if (ret_val)
3839 return ret_val;
3840
3841 phy_info->cable_length = phy_data & GG82563_DSPD_CABLE_LENGTH;
3842 }
3321 3843
3322 ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data); 3844 ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
3323 if(ret_val) 3845 if(ret_val)
@@ -3511,6 +4033,20 @@ e1000_init_eeprom_params(struct e1000_hw *hw)
3511 E1000_WRITE_REG(hw, EECD, eecd); 4033 E1000_WRITE_REG(hw, EECD, eecd);
3512 } 4034 }
3513 break; 4035 break;
4036 case e1000_80003es2lan:
4037 eeprom->type = e1000_eeprom_spi;
4038 eeprom->opcode_bits = 8;
4039 eeprom->delay_usec = 1;
4040 if (eecd & E1000_EECD_ADDR_BITS) {
4041 eeprom->page_size = 32;
4042 eeprom->address_bits = 16;
4043 } else {
4044 eeprom->page_size = 8;
4045 eeprom->address_bits = 8;
4046 }
4047 eeprom->use_eerd = TRUE;
4048 eeprom->use_eewr = FALSE;
4049 break;
3514 default: 4050 default:
3515 break; 4051 break;
3516 } 4052 }
@@ -3691,9 +4227,8 @@ e1000_acquire_eeprom(struct e1000_hw *hw)
3691 4227
3692 DEBUGFUNC("e1000_acquire_eeprom"); 4228 DEBUGFUNC("e1000_acquire_eeprom");
3693 4229
3694 if(e1000_get_hw_eeprom_semaphore(hw)) 4230 if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM))
3695 return -E1000_ERR_EEPROM; 4231 return -E1000_ERR_SWFW_SYNC;
3696
3697 eecd = E1000_READ_REG(hw, EECD); 4232 eecd = E1000_READ_REG(hw, EECD);
3698 4233
3699 if (hw->mac_type != e1000_82573) { 4234 if (hw->mac_type != e1000_82573) {
@@ -3712,7 +4247,7 @@ e1000_acquire_eeprom(struct e1000_hw *hw)
3712 eecd &= ~E1000_EECD_REQ; 4247 eecd &= ~E1000_EECD_REQ;
3713 E1000_WRITE_REG(hw, EECD, eecd); 4248 E1000_WRITE_REG(hw, EECD, eecd);
3714 DEBUGOUT("Could not acquire EEPROM grant\n"); 4249 DEBUGOUT("Could not acquire EEPROM grant\n");
3715 e1000_put_hw_eeprom_semaphore(hw); 4250 e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
3716 return -E1000_ERR_EEPROM; 4251 return -E1000_ERR_EEPROM;
3717 } 4252 }
3718 } 4253 }
@@ -3835,7 +4370,7 @@ e1000_release_eeprom(struct e1000_hw *hw)
3835 E1000_WRITE_REG(hw, EECD, eecd); 4370 E1000_WRITE_REG(hw, EECD, eecd);
3836 } 4371 }
3837 4372
3838 e1000_put_hw_eeprom_semaphore(hw); 4373 e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
3839} 4374}
3840 4375
3841/****************************************************************************** 4376/******************************************************************************
@@ -3914,6 +4449,8 @@ e1000_read_eeprom(struct e1000_hw *hw,
3914 if (e1000_is_onboard_nvm_eeprom(hw) == TRUE && 4449 if (e1000_is_onboard_nvm_eeprom(hw) == TRUE &&
3915 hw->eeprom.use_eerd == FALSE) { 4450 hw->eeprom.use_eerd == FALSE) {
3916 switch (hw->mac_type) { 4451 switch (hw->mac_type) {
4452 case e1000_80003es2lan:
4453 break;
3917 default: 4454 default:
3918 /* Prepare the EEPROM for reading */ 4455 /* Prepare the EEPROM for reading */
3919 if (e1000_acquire_eeprom(hw) != E1000_SUCCESS) 4456 if (e1000_acquire_eeprom(hw) != E1000_SUCCESS)
@@ -4031,6 +4568,9 @@ e1000_write_eeprom_eewr(struct e1000_hw *hw,
4031 uint32_t i = 0; 4568 uint32_t i = 0;
4032 int32_t error = 0; 4569 int32_t error = 0;
4033 4570
4571 if (e1000_swfw_sync_acquire(hw, E1000_SWFW_EEP_SM))
4572 return -E1000_ERR_SWFW_SYNC;
4573
4034 for (i = 0; i < words; i++) { 4574 for (i = 0; i < words; i++) {
4035 register_value = (data[i] << E1000_EEPROM_RW_REG_DATA) | 4575 register_value = (data[i] << E1000_EEPROM_RW_REG_DATA) |
4036 ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) | 4576 ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) |
@@ -4050,6 +4590,7 @@ e1000_write_eeprom_eewr(struct e1000_hw *hw,
4050 } 4590 }
4051 } 4591 }
4052 4592
4593 e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
4053 return error; 4594 return error;
4054} 4595}
4055 4596
@@ -4091,6 +4632,8 @@ e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)
4091{ 4632{
4092 uint32_t eecd = 0; 4633 uint32_t eecd = 0;
4093 4634
4635 DEBUGFUNC("e1000_is_onboard_nvm_eeprom");
4636
4094 if(hw->mac_type == e1000_82573) { 4637 if(hw->mac_type == e1000_82573) {
4095 eecd = E1000_READ_REG(hw, EECD); 4638 eecd = E1000_READ_REG(hw, EECD);
4096 4639
@@ -4517,6 +5060,7 @@ e1000_read_mac_addr(struct e1000_hw * hw)
4517 case e1000_82546: 5060 case e1000_82546:
4518 case e1000_82546_rev_3: 5061 case e1000_82546_rev_3:
4519 case e1000_82571: 5062 case e1000_82571:
5063 case e1000_80003es2lan:
4520 if(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) 5064 if(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)
4521 hw->perm_mac_addr[5] ^= 0x01; 5065 hw->perm_mac_addr[5] ^= 0x01;
4522 break; 5066 break;
@@ -4778,6 +5322,7 @@ e1000_rar_set(struct e1000_hw *hw,
4778 switch (hw->mac_type) { 5322 switch (hw->mac_type) {
4779 case e1000_82571: 5323 case e1000_82571:
4780 case e1000_82572: 5324 case e1000_82572:
5325 case e1000_80003es2lan:
4781 if (hw->leave_av_bit_off == TRUE) 5326 if (hw->leave_av_bit_off == TRUE)
4782 break; 5327 break;
4783 default: 5328 default:
@@ -5364,6 +5909,7 @@ e1000_get_bus_info(struct e1000_hw *hw)
5364 hw->bus_width = e1000_bus_width_pciex_1; 5909 hw->bus_width = e1000_bus_width_pciex_1;
5365 break; 5910 break;
5366 case e1000_82571: 5911 case e1000_82571:
5912 case e1000_80003es2lan:
5367 hw->bus_type = e1000_bus_type_pci_express; 5913 hw->bus_type = e1000_bus_type_pci_express;
5368 hw->bus_speed = e1000_bus_speed_2500; 5914 hw->bus_speed = e1000_bus_speed_2500;
5369 hw->bus_width = e1000_bus_width_pciex_4; 5915 hw->bus_width = e1000_bus_width_pciex_4;
@@ -5509,6 +6055,34 @@ e1000_get_cable_length(struct e1000_hw *hw,
5509 return -E1000_ERR_PHY; 6055 return -E1000_ERR_PHY;
5510 break; 6056 break;
5511 } 6057 }
6058 } else if (hw->phy_type == e1000_phy_gg82563) {
6059 ret_val = e1000_read_phy_reg(hw, GG82563_PHY_DSP_DISTANCE,
6060 &phy_data);
6061 if (ret_val)
6062 return ret_val;
6063 cable_length = phy_data & GG82563_DSPD_CABLE_LENGTH;
6064
6065 switch (cable_length) {
6066 case e1000_gg_cable_length_60:
6067 *min_length = 0;
6068 *max_length = e1000_igp_cable_length_60;
6069 break;
6070 case e1000_gg_cable_length_60_115:
6071 *min_length = e1000_igp_cable_length_60;
6072 *max_length = e1000_igp_cable_length_115;
6073 break;
6074 case e1000_gg_cable_length_115_150:
6075 *min_length = e1000_igp_cable_length_115;
6076 *max_length = e1000_igp_cable_length_150;
6077 break;
6078 case e1000_gg_cable_length_150:
6079 *min_length = e1000_igp_cable_length_150;
6080 *max_length = e1000_igp_cable_length_180;
6081 break;
6082 default:
6083 return -E1000_ERR_PHY;
6084 break;
6085 }
5512 } else if(hw->phy_type == e1000_phy_igp) { /* For IGP PHY */ 6086 } else if(hw->phy_type == e1000_phy_igp) { /* For IGP PHY */
5513 uint16_t agc_reg_array[IGP01E1000_PHY_CHANNEL_NUM] = 6087 uint16_t agc_reg_array[IGP01E1000_PHY_CHANNEL_NUM] =
5514 {IGP01E1000_PHY_AGC_A, 6088 {IGP01E1000_PHY_AGC_A,
@@ -5618,7 +6192,8 @@ e1000_check_polarity(struct e1000_hw *hw,
5618 6192
5619 DEBUGFUNC("e1000_check_polarity"); 6193 DEBUGFUNC("e1000_check_polarity");
5620 6194
5621 if(hw->phy_type == e1000_phy_m88) { 6195 if ((hw->phy_type == e1000_phy_m88) ||
6196 (hw->phy_type == e1000_phy_gg82563)) {
5622 /* return the Polarity bit in the Status register. */ 6197 /* return the Polarity bit in the Status register. */
5623 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, 6198 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
5624 &phy_data); 6199 &phy_data);
@@ -5687,7 +6262,8 @@ e1000_check_downshift(struct e1000_hw *hw)
5687 return ret_val; 6262 return ret_val;
5688 6263
5689 hw->speed_downgraded = (phy_data & IGP01E1000_PLHR_SS_DOWNGRADE) ? 1 : 0; 6264 hw->speed_downgraded = (phy_data & IGP01E1000_PLHR_SS_DOWNGRADE) ? 1 : 0;
5690 } else if(hw->phy_type == e1000_phy_m88) { 6265 } else if ((hw->phy_type == e1000_phy_m88) ||
6266 (hw->phy_type == e1000_phy_gg82563)) {
5691 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, 6267 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
5692 &phy_data); 6268 &phy_data);
5693 if(ret_val) 6269 if(ret_val)
@@ -6720,6 +7296,7 @@ e1000_get_auto_rd_done(struct e1000_hw *hw)
6720 case e1000_82571: 7296 case e1000_82571:
6721 case e1000_82572: 7297 case e1000_82572:
6722 case e1000_82573: 7298 case e1000_82573:
7299 case e1000_80003es2lan:
6723 while(timeout) { 7300 while(timeout) {
6724 if (E1000_READ_REG(hw, EECD) & E1000_EECD_AUTO_RD) break; 7301 if (E1000_READ_REG(hw, EECD) & E1000_EECD_AUTO_RD) break;
6725 else msec_delay(1); 7302 else msec_delay(1);
@@ -6763,6 +7340,11 @@ e1000_get_phy_cfg_done(struct e1000_hw *hw)
6763 default: 7340 default:
6764 msec_delay(10); 7341 msec_delay(10);
6765 break; 7342 break;
7343 case e1000_80003es2lan:
7344 /* Separate *_CFG_DONE_* bit for each port */
7345 if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)
7346 cfg_mask = E1000_EEPROM_CFG_DONE_PORT_1;
7347 /* Fall Through */
6766 case e1000_82571: 7348 case e1000_82571:
6767 case e1000_82572: 7349 case e1000_82572:
6768 while (timeout) { 7350 while (timeout) {
@@ -6805,6 +7387,11 @@ e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw)
6805 if(!hw->eeprom_semaphore_present) 7387 if(!hw->eeprom_semaphore_present)
6806 return E1000_SUCCESS; 7388 return E1000_SUCCESS;
6807 7389
7390 if (hw->mac_type == e1000_80003es2lan) {
7391 /* Get the SW semaphore. */
7392 if (e1000_get_software_semaphore(hw) != E1000_SUCCESS)
7393 return -E1000_ERR_EEPROM;
7394 }
6808 7395
6809 /* Get the FW semaphore. */ 7396 /* Get the FW semaphore. */
6810 timeout = hw->eeprom.word_size + 1; 7397 timeout = hw->eeprom.word_size + 1;
@@ -6850,10 +7437,75 @@ e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw)
6850 return; 7437 return;
6851 7438
6852 swsm = E1000_READ_REG(hw, SWSM); 7439 swsm = E1000_READ_REG(hw, SWSM);
7440 if (hw->mac_type == e1000_80003es2lan) {
7441 /* Release both semaphores. */
7442 swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);
7443 } else
6853 swsm &= ~(E1000_SWSM_SWESMBI); 7444 swsm &= ~(E1000_SWSM_SWESMBI);
6854 E1000_WRITE_REG(hw, SWSM, swsm); 7445 E1000_WRITE_REG(hw, SWSM, swsm);
6855} 7446}
6856 7447
7448/***************************************************************************
7449 *
7450 * Obtaining software semaphore bit (SMBI) before resetting PHY.
7451 *
7452 * hw: Struct containing variables accessed by shared code
7453 *
7454 * returns: - E1000_ERR_RESET if fail to obtain semaphore.
7455 * E1000_SUCCESS at any other case.
7456 *
7457 ***************************************************************************/
7458int32_t
7459e1000_get_software_semaphore(struct e1000_hw *hw)
7460{
7461 int32_t timeout = hw->eeprom.word_size + 1;
7462 uint32_t swsm;
7463
7464 DEBUGFUNC("e1000_get_software_semaphore");
7465
7466 if (hw->mac_type != e1000_80003es2lan)
7467 return E1000_SUCCESS;
7468
7469 while(timeout) {
7470 swsm = E1000_READ_REG(hw, SWSM);
7471 /* If SMBI bit cleared, it is now set and we hold the semaphore */
7472 if(!(swsm & E1000_SWSM_SMBI))
7473 break;
7474 msec_delay_irq(1);
7475 timeout--;
7476 }
7477
7478 if(!timeout) {
7479 DEBUGOUT("Driver can't access device - SMBI bit is set.\n");
7480 return -E1000_ERR_RESET;
7481 }
7482
7483 return E1000_SUCCESS;
7484}
7485
7486/***************************************************************************
7487 *
7488 * Release semaphore bit (SMBI).
7489 *
7490 * hw: Struct containing variables accessed by shared code
7491 *
7492 ***************************************************************************/
7493void
7494e1000_release_software_semaphore(struct e1000_hw *hw)
7495{
7496 uint32_t swsm;
7497
7498 DEBUGFUNC("e1000_release_software_semaphore");
7499
7500 if (hw->mac_type != e1000_80003es2lan)
7501 return;
7502
7503 swsm = E1000_READ_REG(hw, SWSM);
7504 /* Release the SW semaphores.*/
7505 swsm &= ~E1000_SWSM_SMBI;
7506 E1000_WRITE_REG(hw, SWSM, swsm);
7507}
7508
6857/****************************************************************************** 7509/******************************************************************************
6858 * Checks if PHY reset is blocked due to SOL/IDER session, for example. 7510 * Checks if PHY reset is blocked due to SOL/IDER session, for example.
6859 * Returning E1000_BLK_PHY_RESET isn't necessarily an error. But it's up to 7511 * Returning E1000_BLK_PHY_RESET isn't necessarily an error. But it's up to
@@ -6890,6 +7542,7 @@ e1000_arc_subsystem_valid(struct e1000_hw *hw)
6890 case e1000_82571: 7542 case e1000_82571:
6891 case e1000_82572: 7543 case e1000_82572:
6892 case e1000_82573: 7544 case e1000_82573:
7545 case e1000_80003es2lan:
6893 fwsm = E1000_READ_REG(hw, FWSM); 7546 fwsm = E1000_READ_REG(hw, FWSM);
6894 if((fwsm & E1000_FWSM_MODE_MASK) != 0) 7547 if((fwsm & E1000_FWSM_MODE_MASK) != 0)
6895 return TRUE; 7548 return TRUE;