diff options
-rw-r--r-- | drivers/net/tg3.c | 72 | ||||
-rw-r--r-- | drivers/net/tg3.h | 6 |
2 files changed, 64 insertions, 14 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 488b8c65252d..3df5b78d2693 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -2507,7 +2507,7 @@ static int tg3_setup_phy(struct tg3 *tp, int force_reset) | |||
2507 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { | 2507 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { |
2508 | if (netif_carrier_ok(tp->dev)) { | 2508 | if (netif_carrier_ok(tp->dev)) { |
2509 | tw32(HOSTCC_STAT_COAL_TICKS, | 2509 | tw32(HOSTCC_STAT_COAL_TICKS, |
2510 | DEFAULT_STAT_COAL_TICKS); | 2510 | tp->coal.stats_block_coalesce_usecs); |
2511 | } else { | 2511 | } else { |
2512 | tw32(HOSTCC_STAT_COAL_TICKS, 0); | 2512 | tw32(HOSTCC_STAT_COAL_TICKS, 0); |
2513 | } | 2513 | } |
@@ -5094,6 +5094,27 @@ static void tg3_set_bdinfo(struct tg3 *tp, u32 bdinfo_addr, | |||
5094 | } | 5094 | } |
5095 | 5095 | ||
5096 | static void __tg3_set_rx_mode(struct net_device *); | 5096 | static void __tg3_set_rx_mode(struct net_device *); |
5097 | static void tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec) | ||
5098 | { | ||
5099 | tw32(HOSTCC_RXCOL_TICKS, ec->rx_coalesce_usecs); | ||
5100 | tw32(HOSTCC_TXCOL_TICKS, ec->tx_coalesce_usecs); | ||
5101 | tw32(HOSTCC_RXMAX_FRAMES, ec->rx_max_coalesced_frames); | ||
5102 | tw32(HOSTCC_TXMAX_FRAMES, ec->tx_max_coalesced_frames); | ||
5103 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { | ||
5104 | tw32(HOSTCC_RXCOAL_TICK_INT, ec->rx_coalesce_usecs_irq); | ||
5105 | tw32(HOSTCC_TXCOAL_TICK_INT, ec->tx_coalesce_usecs_irq); | ||
5106 | } | ||
5107 | tw32(HOSTCC_RXCOAL_MAXF_INT, ec->rx_max_coalesced_frames_irq); | ||
5108 | tw32(HOSTCC_TXCOAL_MAXF_INT, ec->tx_max_coalesced_frames_irq); | ||
5109 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { | ||
5110 | u32 val = ec->stats_block_coalesce_usecs; | ||
5111 | |||
5112 | if (!netif_carrier_ok(tp->dev)) | ||
5113 | val = 0; | ||
5114 | |||
5115 | tw32(HOSTCC_STAT_COAL_TICKS, val); | ||
5116 | } | ||
5117 | } | ||
5097 | 5118 | ||
5098 | /* tp->lock is held. */ | 5119 | /* tp->lock is held. */ |
5099 | static int tg3_reset_hw(struct tg3 *tp) | 5120 | static int tg3_reset_hw(struct tg3 *tp) |
@@ -5416,16 +5437,7 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
5416 | udelay(10); | 5437 | udelay(10); |
5417 | } | 5438 | } |
5418 | 5439 | ||
5419 | tw32(HOSTCC_RXCOL_TICKS, 0); | 5440 | tg3_set_coalesce(tp, &tp->coal); |
5420 | tw32(HOSTCC_TXCOL_TICKS, LOW_TXCOL_TICKS); | ||
5421 | tw32(HOSTCC_RXMAX_FRAMES, 1); | ||
5422 | tw32(HOSTCC_TXMAX_FRAMES, LOW_RXMAX_FRAMES); | ||
5423 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { | ||
5424 | tw32(HOSTCC_RXCOAL_TICK_INT, 0); | ||
5425 | tw32(HOSTCC_TXCOAL_TICK_INT, 0); | ||
5426 | } | ||
5427 | tw32(HOSTCC_RXCOAL_MAXF_INT, 1); | ||
5428 | tw32(HOSTCC_TXCOAL_MAXF_INT, 0); | ||
5429 | 5441 | ||
5430 | /* set status block DMA address */ | 5442 | /* set status block DMA address */ |
5431 | tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, | 5443 | tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, |
@@ -5438,8 +5450,6 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
5438 | * the tg3_periodic_fetch_stats call there, and | 5450 | * the tg3_periodic_fetch_stats call there, and |
5439 | * tg3_get_stats to see how this works for 5705/5750 chips. | 5451 | * tg3_get_stats to see how this works for 5705/5750 chips. |
5440 | */ | 5452 | */ |
5441 | tw32(HOSTCC_STAT_COAL_TICKS, | ||
5442 | DEFAULT_STAT_COAL_TICKS); | ||
5443 | tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, | 5453 | tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, |
5444 | ((u64) tp->stats_mapping >> 32)); | 5454 | ((u64) tp->stats_mapping >> 32)); |
5445 | tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW, | 5455 | tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW, |
@@ -7284,6 +7294,14 @@ static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
7284 | } | 7294 | } |
7285 | #endif | 7295 | #endif |
7286 | 7296 | ||
7297 | static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec) | ||
7298 | { | ||
7299 | struct tg3 *tp = netdev_priv(dev); | ||
7300 | |||
7301 | memcpy(ec, &tp->coal, sizeof(*ec)); | ||
7302 | return 0; | ||
7303 | } | ||
7304 | |||
7287 | static struct ethtool_ops tg3_ethtool_ops = { | 7305 | static struct ethtool_ops tg3_ethtool_ops = { |
7288 | .get_settings = tg3_get_settings, | 7306 | .get_settings = tg3_get_settings, |
7289 | .set_settings = tg3_set_settings, | 7307 | .set_settings = tg3_set_settings, |
@@ -7316,6 +7334,7 @@ static struct ethtool_ops tg3_ethtool_ops = { | |||
7316 | .get_strings = tg3_get_strings, | 7334 | .get_strings = tg3_get_strings, |
7317 | .get_stats_count = tg3_get_stats_count, | 7335 | .get_stats_count = tg3_get_stats_count, |
7318 | .get_ethtool_stats = tg3_get_ethtool_stats, | 7336 | .get_ethtool_stats = tg3_get_ethtool_stats, |
7337 | .get_coalesce = tg3_get_coalesce, | ||
7319 | }; | 7338 | }; |
7320 | 7339 | ||
7321 | static void __devinit tg3_get_eeprom_size(struct tg3 *tp) | 7340 | static void __devinit tg3_get_eeprom_size(struct tg3 *tp) |
@@ -9096,6 +9115,31 @@ static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp) | |||
9096 | return peer; | 9115 | return peer; |
9097 | } | 9116 | } |
9098 | 9117 | ||
9118 | static void __devinit tg3_init_coal(struct tg3 *tp) | ||
9119 | { | ||
9120 | struct ethtool_coalesce *ec = &tp->coal; | ||
9121 | |||
9122 | memset(ec, 0, sizeof(*ec)); | ||
9123 | ec->cmd = ETHTOOL_GCOALESCE; | ||
9124 | ec->rx_coalesce_usecs = LOW_RXCOL_TICKS; | ||
9125 | ec->tx_coalesce_usecs = LOW_TXCOL_TICKS; | ||
9126 | ec->rx_max_coalesced_frames = LOW_RXMAX_FRAMES; | ||
9127 | ec->tx_max_coalesced_frames = LOW_TXMAX_FRAMES; | ||
9128 | ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT; | ||
9129 | ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT; | ||
9130 | ec->rx_max_coalesced_frames_irq = DEFAULT_RXCOAL_MAXF_INT; | ||
9131 | ec->tx_max_coalesced_frames_irq = DEFAULT_TXCOAL_MAXF_INT; | ||
9132 | ec->stats_block_coalesce_usecs = DEFAULT_STAT_COAL_TICKS; | ||
9133 | |||
9134 | if (tp->coalesce_mode & (HOSTCC_MODE_CLRTICK_RXBD | | ||
9135 | HOSTCC_MODE_CLRTICK_TXBD)) { | ||
9136 | ec->rx_coalesce_usecs = LOW_RXCOL_TICKS_CLRTCKS; | ||
9137 | ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT_CLRTCKS; | ||
9138 | ec->tx_coalesce_usecs = LOW_TXCOL_TICKS_CLRTCKS; | ||
9139 | ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT_CLRTCKS; | ||
9140 | } | ||
9141 | } | ||
9142 | |||
9099 | static int __devinit tg3_init_one(struct pci_dev *pdev, | 9143 | static int __devinit tg3_init_one(struct pci_dev *pdev, |
9100 | const struct pci_device_id *ent) | 9144 | const struct pci_device_id *ent) |
9101 | { | 9145 | { |
@@ -9341,6 +9385,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
9341 | /* flow control autonegotiation is default behavior */ | 9385 | /* flow control autonegotiation is default behavior */ |
9342 | tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG; | 9386 | tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG; |
9343 | 9387 | ||
9388 | tg3_init_coal(tp); | ||
9389 | |||
9344 | err = register_netdev(dev); | 9390 | err = register_netdev(dev); |
9345 | if (err) { | 9391 | if (err) { |
9346 | printk(KERN_ERR PFX "Cannot register net device, " | 9392 | printk(KERN_ERR PFX "Cannot register net device, " |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index 44c65160a20f..993f84c93dc4 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
@@ -876,10 +876,12 @@ | |||
876 | #define HOSTCC_STATUS_ERROR_ATTN 0x00000004 | 876 | #define HOSTCC_STATUS_ERROR_ATTN 0x00000004 |
877 | #define HOSTCC_RXCOL_TICKS 0x00003c08 | 877 | #define HOSTCC_RXCOL_TICKS 0x00003c08 |
878 | #define LOW_RXCOL_TICKS 0x00000032 | 878 | #define LOW_RXCOL_TICKS 0x00000032 |
879 | #define LOW_RXCOL_TICKS_CLRTCKS 0x00000014 | ||
879 | #define DEFAULT_RXCOL_TICKS 0x00000048 | 880 | #define DEFAULT_RXCOL_TICKS 0x00000048 |
880 | #define HIGH_RXCOL_TICKS 0x00000096 | 881 | #define HIGH_RXCOL_TICKS 0x00000096 |
881 | #define HOSTCC_TXCOL_TICKS 0x00003c0c | 882 | #define HOSTCC_TXCOL_TICKS 0x00003c0c |
882 | #define LOW_TXCOL_TICKS 0x00000096 | 883 | #define LOW_TXCOL_TICKS 0x00000096 |
884 | #define LOW_TXCOL_TICKS_CLRTCKS 0x00000048 | ||
883 | #define DEFAULT_TXCOL_TICKS 0x0000012c | 885 | #define DEFAULT_TXCOL_TICKS 0x0000012c |
884 | #define HIGH_TXCOL_TICKS 0x00000145 | 886 | #define HIGH_TXCOL_TICKS 0x00000145 |
885 | #define HOSTCC_RXMAX_FRAMES 0x00003c10 | 887 | #define HOSTCC_RXMAX_FRAMES 0x00003c10 |
@@ -892,8 +894,10 @@ | |||
892 | #define HIGH_TXMAX_FRAMES 0x00000052 | 894 | #define HIGH_TXMAX_FRAMES 0x00000052 |
893 | #define HOSTCC_RXCOAL_TICK_INT 0x00003c18 | 895 | #define HOSTCC_RXCOAL_TICK_INT 0x00003c18 |
894 | #define DEFAULT_RXCOAL_TICK_INT 0x00000019 | 896 | #define DEFAULT_RXCOAL_TICK_INT 0x00000019 |
897 | #define DEFAULT_RXCOAL_TICK_INT_CLRTCKS 0x00000014 | ||
895 | #define HOSTCC_TXCOAL_TICK_INT 0x00003c1c | 898 | #define HOSTCC_TXCOAL_TICK_INT 0x00003c1c |
896 | #define DEFAULT_TXCOAL_TICK_INT 0x00000019 | 899 | #define DEFAULT_TXCOAL_TICK_INT 0x00000019 |
900 | #define DEFAULT_TXCOAL_TICK_INT_CLRTCKS 0x00000014 | ||
897 | #define HOSTCC_RXCOAL_MAXF_INT 0x00003c20 | 901 | #define HOSTCC_RXCOAL_MAXF_INT 0x00003c20 |
898 | #define DEFAULT_RXCOAL_MAXF_INT 0x00000005 | 902 | #define DEFAULT_RXCOAL_MAXF_INT 0x00000005 |
899 | #define HOSTCC_TXCOAL_MAXF_INT 0x00003c24 | 903 | #define HOSTCC_TXCOAL_MAXF_INT 0x00003c24 |
@@ -2227,7 +2231,7 @@ struct tg3 { | |||
2227 | 2231 | ||
2228 | #define SST_25VF0X0_PAGE_SIZE 4098 | 2232 | #define SST_25VF0X0_PAGE_SIZE 4098 |
2229 | 2233 | ||
2230 | 2234 | struct ethtool_coalesce coal; | |
2231 | }; | 2235 | }; |
2232 | 2236 | ||
2233 | #endif /* !(_T3_H) */ | 2237 | #endif /* !(_T3_H) */ |