diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-03-08 15:21:04 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-03-08 15:21:04 -0500 |
commit | 988addf82e4c03739375279de73929580a2d4a6a (patch) | |
tree | 989ae1cd4e264bbad80c65f04480486246e7b9f3 /drivers/net/e1000 | |
parent | 004c1c7096659d352b83047a7593e91d8a30e3c5 (diff) | |
parent | 25cf84cf377c0aae5dbcf937ea89bc7893db5176 (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.h | 1 | ||||
-rw-r--r-- | drivers/net/e1000/e1000_ethtool.c | 19 | ||||
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 65 |
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); | |||
349 | extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter); | 349 | extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter); |
350 | extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter); | 350 | extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter); |
351 | extern void e1000_update_stats(struct e1000_adapter *adapter); | 351 | extern void e1000_update_stats(struct e1000_adapter *adapter); |
352 | extern bool e1000_has_link(struct e1000_adapter *adapter); | ||
352 | extern void e1000_power_up_phy(struct e1000_adapter *); | 353 | extern void e1000_power_up_phy(struct e1000_adapter *); |
353 | extern void e1000_set_ethtool_ops(struct net_device *netdev); | 354 | extern void e1000_set_ethtool_ops(struct net_device *netdev); |
354 | extern void e1000_check_options(struct e1000_adapter *adapter); | 355 | extern 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 | ||
218 | static 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 | |||
218 | static void e1000_get_pauseparam(struct net_device *netdev, | 235 | static 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 | */ |
45 | static struct pci_device_id e1000_pci_tbl[] = { | 45 | static 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 | ||
2249 | static bool e1000_has_link(struct e1000_adapter *adapter) | 2248 | bool 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); |