aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/igb/igb_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c40
1 files changed, 11 insertions, 29 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index a0a9b1fcb5e8..2f70a9b152bd 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -58,7 +58,7 @@
58 58
59#define MAJ 5 59#define MAJ 5
60#define MIN 2 60#define MIN 2
61#define BUILD 15 61#define BUILD 18
62#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \ 62#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \
63__stringify(BUILD) "-k" 63__stringify(BUILD) "-k"
64char igb_driver_name[] = "igb"; 64char igb_driver_name[] = "igb";
@@ -1836,31 +1836,19 @@ void igb_reinit_locked(struct igb_adapter *adapter)
1836 * 1836 *
1837 * @adapter: adapter struct 1837 * @adapter: adapter struct
1838 **/ 1838 **/
1839static s32 igb_enable_mas(struct igb_adapter *adapter) 1839static void igb_enable_mas(struct igb_adapter *adapter)
1840{ 1840{
1841 struct e1000_hw *hw = &adapter->hw; 1841 struct e1000_hw *hw = &adapter->hw;
1842 u32 connsw; 1842 u32 connsw = rd32(E1000_CONNSW);
1843 s32 ret_val = 0;
1844
1845 connsw = rd32(E1000_CONNSW);
1846 if (!(hw->phy.media_type == e1000_media_type_copper))
1847 return ret_val;
1848 1843
1849 /* configure for SerDes media detect */ 1844 /* configure for SerDes media detect */
1850 if (!(connsw & E1000_CONNSW_SERDESD)) { 1845 if ((hw->phy.media_type == e1000_media_type_copper) &&
1846 (!(connsw & E1000_CONNSW_SERDESD))) {
1851 connsw |= E1000_CONNSW_ENRGSRC; 1847 connsw |= E1000_CONNSW_ENRGSRC;
1852 connsw |= E1000_CONNSW_AUTOSENSE_EN; 1848 connsw |= E1000_CONNSW_AUTOSENSE_EN;
1853 wr32(E1000_CONNSW, connsw); 1849 wr32(E1000_CONNSW, connsw);
1854 wrfl(); 1850 wrfl();
1855 } else if (connsw & E1000_CONNSW_SERDESD) {
1856 /* already SerDes, no need to enable anything */
1857 return ret_val;
1858 } else {
1859 netdev_info(adapter->netdev,
1860 "MAS: Unable to configure feature, disabling..\n");
1861 adapter->flags &= ~IGB_FLAG_MAS_ENABLE;
1862 } 1851 }
1863 return ret_val;
1864} 1852}
1865 1853
1866void igb_reset(struct igb_adapter *adapter) 1854void igb_reset(struct igb_adapter *adapter)
@@ -1980,10 +1968,9 @@ void igb_reset(struct igb_adapter *adapter)
1980 adapter->ei.get_invariants(hw); 1968 adapter->ei.get_invariants(hw);
1981 adapter->flags &= ~IGB_FLAG_MEDIA_RESET; 1969 adapter->flags &= ~IGB_FLAG_MEDIA_RESET;
1982 } 1970 }
1983 if (adapter->flags & IGB_FLAG_MAS_ENABLE) { 1971 if ((mac->type == e1000_82575) &&
1984 if (igb_enable_mas(adapter)) 1972 (adapter->flags & IGB_FLAG_MAS_ENABLE)) {
1985 dev_err(&pdev->dev, 1973 igb_enable_mas(adapter);
1986 "Error enabling Media Auto Sense\n");
1987 } 1974 }
1988 if (hw->mac.ops.init_hw(hw)) 1975 if (hw->mac.ops.init_hw(hw))
1989 dev_err(&pdev->dev, "Hardware Error\n"); 1976 dev_err(&pdev->dev, "Hardware Error\n");
@@ -4989,6 +4976,7 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
4989 struct igb_tx_buffer *first; 4976 struct igb_tx_buffer *first;
4990 int tso; 4977 int tso;
4991 u32 tx_flags = 0; 4978 u32 tx_flags = 0;
4979 unsigned short f;
4992 u16 count = TXD_USE_COUNT(skb_headlen(skb)); 4980 u16 count = TXD_USE_COUNT(skb_headlen(skb));
4993 __be16 protocol = vlan_get_protocol(skb); 4981 __be16 protocol = vlan_get_protocol(skb);
4994 u8 hdr_len = 0; 4982 u8 hdr_len = 0;
@@ -4999,14 +4987,8 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
4999 * + 1 desc for context descriptor, 4987 * + 1 desc for context descriptor,
5000 * otherwise try next time 4988 * otherwise try next time
5001 */ 4989 */
5002 if (NETDEV_FRAG_PAGE_MAX_SIZE > IGB_MAX_DATA_PER_TXD) { 4990 for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
5003 unsigned short f; 4991 count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size);
5004
5005 for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
5006 count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size);
5007 } else {
5008 count += skb_shinfo(skb)->nr_frags;
5009 }
5010 4992
5011 if (igb_maybe_stop_tx(tx_ring, count + 3)) { 4993 if (igb_maybe_stop_tx(tx_ring, count + 3)) {
5012 /* this is a hard error */ 4994 /* this is a hard error */