diff options
Diffstat (limited to 'drivers/net/e1000e/ethtool.c')
| -rw-r--r-- | drivers/net/e1000e/ethtool.c | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index 6d1b257bbda6..ce045acce63e 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
| @@ -46,8 +46,8 @@ struct e1000_stats { | |||
| 46 | static const struct e1000_stats e1000_gstrings_stats[] = { | 46 | static const struct e1000_stats e1000_gstrings_stats[] = { |
| 47 | { "rx_packets", E1000_STAT(stats.gprc) }, | 47 | { "rx_packets", E1000_STAT(stats.gprc) }, |
| 48 | { "tx_packets", E1000_STAT(stats.gptc) }, | 48 | { "tx_packets", E1000_STAT(stats.gptc) }, |
| 49 | { "rx_bytes", E1000_STAT(stats.gorcl) }, | 49 | { "rx_bytes", E1000_STAT(stats.gorc) }, |
| 50 | { "tx_bytes", E1000_STAT(stats.gotcl) }, | 50 | { "tx_bytes", E1000_STAT(stats.gotc) }, |
| 51 | { "rx_broadcast", E1000_STAT(stats.bprc) }, | 51 | { "rx_broadcast", E1000_STAT(stats.bprc) }, |
| 52 | { "tx_broadcast", E1000_STAT(stats.bptc) }, | 52 | { "tx_broadcast", E1000_STAT(stats.bptc) }, |
| 53 | { "rx_multicast", E1000_STAT(stats.mprc) }, | 53 | { "rx_multicast", E1000_STAT(stats.mprc) }, |
| @@ -83,7 +83,7 @@ static const struct e1000_stats e1000_gstrings_stats[] = { | |||
| 83 | { "rx_flow_control_xoff", E1000_STAT(stats.xoffrxc) }, | 83 | { "rx_flow_control_xoff", E1000_STAT(stats.xoffrxc) }, |
| 84 | { "tx_flow_control_xon", E1000_STAT(stats.xontxc) }, | 84 | { "tx_flow_control_xon", E1000_STAT(stats.xontxc) }, |
| 85 | { "tx_flow_control_xoff", E1000_STAT(stats.xofftxc) }, | 85 | { "tx_flow_control_xoff", E1000_STAT(stats.xofftxc) }, |
| 86 | { "rx_long_byte_count", E1000_STAT(stats.gorcl) }, | 86 | { "rx_long_byte_count", E1000_STAT(stats.gorc) }, |
| 87 | { "rx_csum_offload_good", E1000_STAT(hw_csum_good) }, | 87 | { "rx_csum_offload_good", E1000_STAT(hw_csum_good) }, |
| 88 | { "rx_csum_offload_errors", E1000_STAT(hw_csum_err) }, | 88 | { "rx_csum_offload_errors", E1000_STAT(hw_csum_err) }, |
| 89 | { "rx_header_split", E1000_STAT(rx_hdr_split) }, | 89 | { "rx_header_split", E1000_STAT(rx_hdr_split) }, |
| @@ -1770,6 +1770,47 @@ static int e1000_phys_id(struct net_device *netdev, u32 data) | |||
| 1770 | return 0; | 1770 | return 0; |
| 1771 | } | 1771 | } |
| 1772 | 1772 | ||
| 1773 | static int e1000_get_coalesce(struct net_device *netdev, | ||
| 1774 | struct ethtool_coalesce *ec) | ||
| 1775 | { | ||
| 1776 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
| 1777 | |||
| 1778 | if (adapter->itr_setting <= 3) | ||
| 1779 | ec->rx_coalesce_usecs = adapter->itr_setting; | ||
| 1780 | else | ||
| 1781 | ec->rx_coalesce_usecs = 1000000 / adapter->itr_setting; | ||
| 1782 | |||
| 1783 | return 0; | ||
| 1784 | } | ||
| 1785 | |||
| 1786 | static int e1000_set_coalesce(struct net_device *netdev, | ||
| 1787 | struct ethtool_coalesce *ec) | ||
| 1788 | { | ||
| 1789 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
| 1790 | struct e1000_hw *hw = &adapter->hw; | ||
| 1791 | |||
| 1792 | if ((ec->rx_coalesce_usecs > E1000_MAX_ITR_USECS) || | ||
| 1793 | ((ec->rx_coalesce_usecs > 3) && | ||
| 1794 | (ec->rx_coalesce_usecs < E1000_MIN_ITR_USECS)) || | ||
| 1795 | (ec->rx_coalesce_usecs == 2)) | ||
| 1796 | return -EINVAL; | ||
| 1797 | |||
| 1798 | if (ec->rx_coalesce_usecs <= 3) { | ||
| 1799 | adapter->itr = 20000; | ||
| 1800 | adapter->itr_setting = ec->rx_coalesce_usecs; | ||
| 1801 | } else { | ||
| 1802 | adapter->itr = (1000000 / ec->rx_coalesce_usecs); | ||
| 1803 | adapter->itr_setting = adapter->itr & ~3; | ||
| 1804 | } | ||
| 1805 | |||
| 1806 | if (adapter->itr_setting != 0) | ||
| 1807 | ew32(ITR, 1000000000 / (adapter->itr * 256)); | ||
| 1808 | else | ||
| 1809 | ew32(ITR, 0); | ||
| 1810 | |||
| 1811 | return 0; | ||
| 1812 | } | ||
| 1813 | |||
| 1773 | static int e1000_nway_reset(struct net_device *netdev) | 1814 | static int e1000_nway_reset(struct net_device *netdev) |
| 1774 | { | 1815 | { |
| 1775 | struct e1000_adapter *adapter = netdev_priv(netdev); | 1816 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| @@ -1845,6 +1886,8 @@ static const struct ethtool_ops e1000_ethtool_ops = { | |||
| 1845 | .phys_id = e1000_phys_id, | 1886 | .phys_id = e1000_phys_id, |
| 1846 | .get_ethtool_stats = e1000_get_ethtool_stats, | 1887 | .get_ethtool_stats = e1000_get_ethtool_stats, |
| 1847 | .get_sset_count = e1000e_get_sset_count, | 1888 | .get_sset_count = e1000e_get_sset_count, |
| 1889 | .get_coalesce = e1000_get_coalesce, | ||
| 1890 | .set_coalesce = e1000_set_coalesce, | ||
| 1848 | }; | 1891 | }; |
| 1849 | 1892 | ||
| 1850 | void e1000e_set_ethtool_ops(struct net_device *netdev) | 1893 | void e1000e_set_ethtool_ops(struct net_device *netdev) |
