aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2010-03-08 15:21:04 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-03-08 15:21:04 -0500
commit988addf82e4c03739375279de73929580a2d4a6a (patch)
tree989ae1cd4e264bbad80c65f04480486246e7b9f3 /drivers/net/e1000
parent004c1c7096659d352b83047a7593e91d8a30e3c5 (diff)
parent25cf84cf377c0aae5dbcf937ea89bc7893db5176 (diff)
Merge branch 'origin' into devel-stable
Conflicts: arch/arm/mach-mx2/devices.c arch/arm/mach-mx2/devices.h sound/soc/pxa/pxa-ssp.c
Diffstat (limited to 'drivers/net/e1000')
-rw-r--r--drivers/net/e1000/e1000.h1
-rw-r--r--drivers/net/e1000/e1000_ethtool.c19
-rw-r--r--drivers/net/e1000/e1000_main.c65
3 files changed, 60 insertions, 25 deletions
diff --git a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h
index e8932db7ee77..9902b33b7160 100644
--- a/drivers/net/e1000/e1000.h
+++ b/drivers/net/e1000/e1000.h
@@ -349,6 +349,7 @@ extern int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
349extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter); 349extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
350extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter); 350extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
351extern void e1000_update_stats(struct e1000_adapter *adapter); 351extern void e1000_update_stats(struct e1000_adapter *adapter);
352extern bool e1000_has_link(struct e1000_adapter *adapter);
352extern void e1000_power_up_phy(struct e1000_adapter *); 353extern void e1000_power_up_phy(struct e1000_adapter *);
353extern void e1000_set_ethtool_ops(struct net_device *netdev); 354extern void e1000_set_ethtool_ops(struct net_device *netdev);
354extern void e1000_check_options(struct e1000_adapter *adapter); 355extern void e1000_check_options(struct e1000_adapter *adapter);
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c
index 13e9ece16889..c67e93117271 100644
--- a/drivers/net/e1000/e1000_ethtool.c
+++ b/drivers/net/e1000/e1000_ethtool.c
@@ -215,6 +215,23 @@ static int e1000_set_settings(struct net_device *netdev,
215 return 0; 215 return 0;
216} 216}
217 217
218static u32 e1000_get_link(struct net_device *netdev)
219{
220 struct e1000_adapter *adapter = netdev_priv(netdev);
221
222 /*
223 * If the link is not reported up to netdev, interrupts are disabled,
224 * and so the physical link state may have changed since we last
225 * looked. Set get_link_status to make sure that the true link
226 * state is interrogated, rather than pulling a cached and possibly
227 * stale link state from the driver.
228 */
229 if (!netif_carrier_ok(netdev))
230 adapter->hw.get_link_status = 1;
231
232 return e1000_has_link(adapter);
233}
234
218static void e1000_get_pauseparam(struct net_device *netdev, 235static void e1000_get_pauseparam(struct net_device *netdev,
219 struct ethtool_pauseparam *pause) 236 struct ethtool_pauseparam *pause)
220{ 237{
@@ -1892,7 +1909,7 @@ static const struct ethtool_ops e1000_ethtool_ops = {
1892 .get_msglevel = e1000_get_msglevel, 1909 .get_msglevel = e1000_get_msglevel,
1893 .set_msglevel = e1000_set_msglevel, 1910 .set_msglevel = e1000_set_msglevel,
1894 .nway_reset = e1000_nway_reset, 1911 .nway_reset = e1000_nway_reset,
1895 .get_link = ethtool_op_get_link, 1912 .get_link = e1000_get_link,
1896 .get_eeprom_len = e1000_get_eeprom_len, 1913 .get_eeprom_len = e1000_get_eeprom_len,
1897 .get_eeprom = e1000_get_eeprom, 1914 .get_eeprom = e1000_get_eeprom,
1898 .set_eeprom = e1000_set_eeprom, 1915 .set_eeprom = e1000_set_eeprom,
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index d29bb532eccf..8be6faee43e6 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -42,7 +42,7 @@ static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation
42 * Macro expands to... 42 * Macro expands to...
43 * {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)} 43 * {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
44 */ 44 */
45static struct pci_device_id e1000_pci_tbl[] = { 45static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
46 INTEL_E1000_ETHERNET_DEVICE(0x1000), 46 INTEL_E1000_ETHERNET_DEVICE(0x1000),
47 INTEL_E1000_ETHERNET_DEVICE(0x1001), 47 INTEL_E1000_ETHERNET_DEVICE(0x1001),
48 INTEL_E1000_ETHERNET_DEVICE(0x1004), 48 INTEL_E1000_ETHERNET_DEVICE(0x1004),
@@ -847,6 +847,9 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
847 goto err_pci_reg; 847 goto err_pci_reg;
848 848
849 pci_set_master(pdev); 849 pci_set_master(pdev);
850 err = pci_save_state(pdev);
851 if (err)
852 goto err_alloc_etherdev;
850 853
851 err = -ENOMEM; 854 err = -ENOMEM;
852 netdev = alloc_etherdev(sizeof(struct e1000_adapter)); 855 netdev = alloc_etherdev(sizeof(struct e1000_adapter));
@@ -2127,7 +2130,7 @@ static void e1000_set_rx_mode(struct net_device *netdev)
2127 rctl |= E1000_RCTL_VFE; 2130 rctl |= E1000_RCTL_VFE;
2128 } 2131 }
2129 2132
2130 if (netdev->uc.count > rar_entries - 1) { 2133 if (netdev_uc_count(netdev) > rar_entries - 1) {
2131 rctl |= E1000_RCTL_UPE; 2134 rctl |= E1000_RCTL_UPE;
2132 } else if (!(netdev->flags & IFF_PROMISC)) { 2135 } else if (!(netdev->flags & IFF_PROMISC)) {
2133 rctl &= ~E1000_RCTL_UPE; 2136 rctl &= ~E1000_RCTL_UPE;
@@ -2150,7 +2153,7 @@ static void e1000_set_rx_mode(struct net_device *netdev)
2150 */ 2153 */
2151 i = 1; 2154 i = 1;
2152 if (use_uc) 2155 if (use_uc)
2153 list_for_each_entry(ha, &netdev->uc.list, list) { 2156 netdev_for_each_uc_addr(ha, netdev) {
2154 if (i == rar_entries) 2157 if (i == rar_entries)
2155 break; 2158 break;
2156 e1000_rar_set(hw, ha->addr, i++); 2159 e1000_rar_set(hw, ha->addr, i++);
@@ -2158,29 +2161,25 @@ static void e1000_set_rx_mode(struct net_device *netdev)
2158 2161
2159 WARN_ON(i == rar_entries); 2162 WARN_ON(i == rar_entries);
2160 2163
2161 mc_ptr = netdev->mc_list; 2164 netdev_for_each_mc_addr(mc_ptr, netdev) {
2162 2165 if (i == rar_entries) {
2163 for (; i < rar_entries; i++) { 2166 /* load any remaining addresses into the hash table */
2164 if (mc_ptr) { 2167 u32 hash_reg, hash_bit, mta;
2165 e1000_rar_set(hw, mc_ptr->da_addr, i); 2168 hash_value = e1000_hash_mc_addr(hw, mc_ptr->da_addr);
2166 mc_ptr = mc_ptr->next; 2169 hash_reg = (hash_value >> 5) & 0x7F;
2170 hash_bit = hash_value & 0x1F;
2171 mta = (1 << hash_bit);
2172 mcarray[hash_reg] |= mta;
2167 } else { 2173 } else {
2168 E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0); 2174 e1000_rar_set(hw, mc_ptr->da_addr, i++);
2169 E1000_WRITE_FLUSH();
2170 E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0);
2171 E1000_WRITE_FLUSH();
2172 } 2175 }
2173 } 2176 }
2174 2177
2175 /* load any remaining addresses into the hash table */ 2178 for (; i < rar_entries; i++) {
2176 2179 E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0);
2177 for (; mc_ptr; mc_ptr = mc_ptr->next) { 2180 E1000_WRITE_FLUSH();
2178 u32 hash_reg, hash_bit, mta; 2181 E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0);
2179 hash_value = e1000_hash_mc_addr(hw, mc_ptr->da_addr); 2182 E1000_WRITE_FLUSH();
2180 hash_reg = (hash_value >> 5) & 0x7F;
2181 hash_bit = hash_value & 0x1F;
2182 mta = (1 << hash_bit);
2183 mcarray[hash_reg] |= mta;
2184 } 2183 }
2185 2184
2186 /* write the hash table completely, write from bottom to avoid 2185 /* write the hash table completely, write from bottom to avoid
@@ -2246,7 +2245,7 @@ static void e1000_82547_tx_fifo_stall(unsigned long data)
2246 } 2245 }
2247} 2246}
2248 2247
2249static bool e1000_has_link(struct e1000_adapter *adapter) 2248bool e1000_has_link(struct e1000_adapter *adapter)
2250{ 2249{
2251 struct e1000_hw *hw = &adapter->hw; 2250 struct e1000_hw *hw = &adapter->hw;
2252 bool link_active = false; 2251 bool link_active = false;
@@ -4006,11 +4005,21 @@ check_page:
4006 } 4005 }
4007 } 4006 }
4008 4007
4009 if (!buffer_info->dma) 4008 if (!buffer_info->dma) {
4010 buffer_info->dma = pci_map_page(pdev, 4009 buffer_info->dma = pci_map_page(pdev,
4011 buffer_info->page, 0, 4010 buffer_info->page, 0,
4012 buffer_info->length, 4011 buffer_info->length,
4013 PCI_DMA_FROMDEVICE); 4012 PCI_DMA_FROMDEVICE);
4013 if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
4014 put_page(buffer_info->page);
4015 dev_kfree_skb(skb);
4016 buffer_info->page = NULL;
4017 buffer_info->skb = NULL;
4018 buffer_info->dma = 0;
4019 adapter->alloc_rx_buff_failed++;
4020 break; /* while !buffer_info->skb */
4021 }
4022 }
4014 4023
4015 rx_desc = E1000_RX_DESC(*rx_ring, i); 4024 rx_desc = E1000_RX_DESC(*rx_ring, i);
4016 rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma); 4025 rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
@@ -4101,6 +4110,13 @@ map_skb:
4101 skb->data, 4110 skb->data,
4102 buffer_info->length, 4111 buffer_info->length,
4103 PCI_DMA_FROMDEVICE); 4112 PCI_DMA_FROMDEVICE);
4113 if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
4114 dev_kfree_skb(skb);
4115 buffer_info->skb = NULL;
4116 buffer_info->dma = 0;
4117 adapter->alloc_rx_buff_failed++;
4118 break; /* while !buffer_info->skb */
4119 }
4104 4120
4105 /* 4121 /*
4106 * XXX if it was allocated cleanly it will never map to a 4122 * XXX if it was allocated cleanly it will never map to a
@@ -4596,6 +4612,7 @@ static int e1000_resume(struct pci_dev *pdev)
4596 4612
4597 pci_set_power_state(pdev, PCI_D0); 4613 pci_set_power_state(pdev, PCI_D0);
4598 pci_restore_state(pdev); 4614 pci_restore_state(pdev);
4615 pci_save_state(pdev);
4599 4616
4600 if (adapter->need_ioport) 4617 if (adapter->need_ioport)
4601 err = pci_enable_device(pdev); 4618 err = pci_enable_device(pdev);