diff options
Diffstat (limited to 'drivers/net/e1000/e1000_main.c')
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 340e12d2e4a..4ff88a683f6 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -28,6 +28,12 @@ | |||
28 | 28 | ||
29 | #include "e1000.h" | 29 | #include "e1000.h" |
30 | #include <net/ip6_checksum.h> | 30 | #include <net/ip6_checksum.h> |
31 | #include <linux/io.h> | ||
32 | |||
33 | /* Intel Media SOC GbE MDIO physical base address */ | ||
34 | static unsigned long ce4100_gbe_mdio_base_phy; | ||
35 | /* Intel Media SOC GbE MDIO virtual base address */ | ||
36 | void __iomem *ce4100_gbe_mdio_base_virt; | ||
31 | 37 | ||
32 | char e1000_driver_name[] = "e1000"; | 38 | char e1000_driver_name[] = "e1000"; |
33 | static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; | 39 | static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; |
@@ -79,6 +85,7 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = { | |||
79 | INTEL_E1000_ETHERNET_DEVICE(0x108A), | 85 | INTEL_E1000_ETHERNET_DEVICE(0x108A), |
80 | INTEL_E1000_ETHERNET_DEVICE(0x1099), | 86 | INTEL_E1000_ETHERNET_DEVICE(0x1099), |
81 | INTEL_E1000_ETHERNET_DEVICE(0x10B5), | 87 | INTEL_E1000_ETHERNET_DEVICE(0x10B5), |
88 | INTEL_E1000_ETHERNET_DEVICE(0x2E6E), | ||
82 | /* required last entry */ | 89 | /* required last entry */ |
83 | {0,} | 90 | {0,} |
84 | }; | 91 | }; |
@@ -459,6 +466,7 @@ static void e1000_power_down_phy(struct e1000_adapter *adapter) | |||
459 | case e1000_82545: | 466 | case e1000_82545: |
460 | case e1000_82545_rev_3: | 467 | case e1000_82545_rev_3: |
461 | case e1000_82546: | 468 | case e1000_82546: |
469 | case e1000_ce4100: | ||
462 | case e1000_82546_rev_3: | 470 | case e1000_82546_rev_3: |
463 | case e1000_82541: | 471 | case e1000_82541: |
464 | case e1000_82541_rev_2: | 472 | case e1000_82541_rev_2: |
@@ -573,6 +581,7 @@ void e1000_reset(struct e1000_adapter *adapter) | |||
573 | case e1000_82545: | 581 | case e1000_82545: |
574 | case e1000_82545_rev_3: | 582 | case e1000_82545_rev_3: |
575 | case e1000_82546: | 583 | case e1000_82546: |
584 | case e1000_ce4100: | ||
576 | case e1000_82546_rev_3: | 585 | case e1000_82546_rev_3: |
577 | pba = E1000_PBA_48K; | 586 | pba = E1000_PBA_48K; |
578 | break; | 587 | break; |
@@ -894,6 +903,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
894 | static int global_quad_port_a = 0; /* global ksp3 port a indication */ | 903 | static int global_quad_port_a = 0; /* global ksp3 port a indication */ |
895 | int i, err, pci_using_dac; | 904 | int i, err, pci_using_dac; |
896 | u16 eeprom_data = 0; | 905 | u16 eeprom_data = 0; |
906 | u16 tmp = 0; | ||
897 | u16 eeprom_apme_mask = E1000_EEPROM_APME; | 907 | u16 eeprom_apme_mask = E1000_EEPROM_APME; |
898 | int bars, need_ioport; | 908 | int bars, need_ioport; |
899 | 909 | ||
@@ -996,6 +1006,14 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
996 | goto err_sw_init; | 1006 | goto err_sw_init; |
997 | 1007 | ||
998 | err = -EIO; | 1008 | err = -EIO; |
1009 | if (hw->mac_type == e1000_ce4100) { | ||
1010 | ce4100_gbe_mdio_base_phy = pci_resource_start(pdev, BAR_1); | ||
1011 | ce4100_gbe_mdio_base_virt = ioremap(ce4100_gbe_mdio_base_phy, | ||
1012 | pci_resource_len(pdev, BAR_1)); | ||
1013 | |||
1014 | if (!ce4100_gbe_mdio_base_virt) | ||
1015 | goto err_mdio_ioremap; | ||
1016 | } | ||
999 | 1017 | ||
1000 | if (hw->mac_type >= e1000_82543) { | 1018 | if (hw->mac_type >= e1000_82543) { |
1001 | netdev->features = NETIF_F_SG | | 1019 | netdev->features = NETIF_F_SG | |
@@ -1135,6 +1153,20 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
1135 | adapter->wol = adapter->eeprom_wol; | 1153 | adapter->wol = adapter->eeprom_wol; |
1136 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); | 1154 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); |
1137 | 1155 | ||
1156 | /* Auto detect PHY address */ | ||
1157 | if (hw->mac_type == e1000_ce4100) { | ||
1158 | for (i = 0; i < 32; i++) { | ||
1159 | hw->phy_addr = i; | ||
1160 | e1000_read_phy_reg(hw, PHY_ID2, &tmp); | ||
1161 | if (tmp == 0 || tmp == 0xFF) { | ||
1162 | if (i == 31) | ||
1163 | goto err_eeprom; | ||
1164 | continue; | ||
1165 | } else | ||
1166 | break; | ||
1167 | } | ||
1168 | } | ||
1169 | |||
1138 | /* reset the hardware with the new settings */ | 1170 | /* reset the hardware with the new settings */ |
1139 | e1000_reset(adapter); | 1171 | e1000_reset(adapter); |
1140 | 1172 | ||
@@ -1171,6 +1203,8 @@ err_eeprom: | |||
1171 | kfree(adapter->rx_ring); | 1203 | kfree(adapter->rx_ring); |
1172 | err_dma: | 1204 | err_dma: |
1173 | err_sw_init: | 1205 | err_sw_init: |
1206 | err_mdio_ioremap: | ||
1207 | iounmap(ce4100_gbe_mdio_base_virt); | ||
1174 | iounmap(hw->hw_addr); | 1208 | iounmap(hw->hw_addr); |
1175 | err_ioremap: | 1209 | err_ioremap: |
1176 | free_netdev(netdev); | 1210 | free_netdev(netdev); |
@@ -1409,6 +1443,7 @@ static bool e1000_check_64k_bound(struct e1000_adapter *adapter, void *start, | |||
1409 | /* First rev 82545 and 82546 need to not allow any memory | 1443 | /* First rev 82545 and 82546 need to not allow any memory |
1410 | * write location to cross 64k boundary due to errata 23 */ | 1444 | * write location to cross 64k boundary due to errata 23 */ |
1411 | if (hw->mac_type == e1000_82545 || | 1445 | if (hw->mac_type == e1000_82545 || |
1446 | hw->mac_type == e1000_ce4100 || | ||
1412 | hw->mac_type == e1000_82546) { | 1447 | hw->mac_type == e1000_82546) { |
1413 | return ((begin ^ (end - 1)) >> 16) != 0 ? false : true; | 1448 | return ((begin ^ (end - 1)) >> 16) != 0 ? false : true; |
1414 | } | 1449 | } |