aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/s2io.c50
1 files changed, 45 insertions, 5 deletions
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c
index 668327ccd8d..a032d726d64 100644
--- a/drivers/net/s2io.c
+++ b/drivers/net/s2io.c
@@ -38,7 +38,7 @@
38 * Tx descriptors that can be associated with each corresponding FIFO. 38 * Tx descriptors that can be associated with each corresponding FIFO.
39 * intr_type: This defines the type of interrupt. The values can be 0(INTA), 39 * intr_type: This defines the type of interrupt. The values can be 0(INTA),
40 * 2(MSI_X). Default value is '2(MSI_X)' 40 * 2(MSI_X). Default value is '2(MSI_X)'
41 * lro_enable: Specifies whether to enable Large Receive Offload (LRO) or not. 41 * lro: Specifies whether to enable Large Receive Offload (LRO) or not.
42 * Possible values '1' for enable '0' for disable. Default is '0' 42 * Possible values '1' for enable '0' for disable. Default is '0'
43 * lro_max_pkts: This parameter defines maximum number of packets can be 43 * lro_max_pkts: This parameter defines maximum number of packets can be
44 * aggregated as a single large packet 44 * aggregated as a single large packet
@@ -90,7 +90,7 @@
90#include "s2io.h" 90#include "s2io.h"
91#include "s2io-regs.h" 91#include "s2io-regs.h"
92 92
93#define DRV_VERSION "2.0.26.25" 93#define DRV_VERSION "2.0.26.26"
94 94
95/* S2io Driver name & version. */ 95/* S2io Driver name & version. */
96static char s2io_driver_name[] = "Neterion"; 96static char s2io_driver_name[] = "Neterion";
@@ -496,7 +496,7 @@ S2IO_PARM_INT(rxsync_frequency, 3);
496/* Interrupt type. Values can be 0(INTA), 2(MSI_X) */ 496/* Interrupt type. Values can be 0(INTA), 2(MSI_X) */
497S2IO_PARM_INT(intr_type, 2); 497S2IO_PARM_INT(intr_type, 2);
498/* Large receive offload feature */ 498/* Large receive offload feature */
499static unsigned int lro_enable; 499static unsigned int lro_enable = 1;
500module_param_named(lro, lro_enable, uint, 0); 500module_param_named(lro, lro_enable, uint, 0);
501 501
502/* Max pkts to be aggregated by LRO at one time. If not specified, 502/* Max pkts to be aggregated by LRO at one time. If not specified,
@@ -795,7 +795,6 @@ static int init_shared_mem(struct s2io_nic *nic)
795 ring->rx_curr_put_info.ring_len = rx_cfg->num_rxd - 1; 795 ring->rx_curr_put_info.ring_len = rx_cfg->num_rxd - 1;
796 ring->nic = nic; 796 ring->nic = nic;
797 ring->ring_no = i; 797 ring->ring_no = i;
798 ring->lro = lro_enable;
799 798
800 blk_cnt = rx_cfg->num_rxd / (rxd_count[nic->rxd_mode] + 1); 799 blk_cnt = rx_cfg->num_rxd / (rxd_count[nic->rxd_mode] + 1);
801 /* Allocating all the Rx blocks */ 800 /* Allocating all the Rx blocks */
@@ -6675,6 +6674,7 @@ static u32 s2io_ethtool_op_get_tso(struct net_device *dev)
6675{ 6674{
6676 return (dev->features & NETIF_F_TSO) != 0; 6675 return (dev->features & NETIF_F_TSO) != 0;
6677} 6676}
6677
6678static int s2io_ethtool_op_set_tso(struct net_device *dev, u32 data) 6678static int s2io_ethtool_op_set_tso(struct net_device *dev, u32 data)
6679{ 6679{
6680 if (data) 6680 if (data)
@@ -6685,6 +6685,42 @@ static int s2io_ethtool_op_set_tso(struct net_device *dev, u32 data)
6685 return 0; 6685 return 0;
6686} 6686}
6687 6687
6688static int s2io_ethtool_set_flags(struct net_device *dev, u32 data)
6689{
6690 struct s2io_nic *sp = netdev_priv(dev);
6691 int rc = 0;
6692 int changed = 0;
6693
6694 if (data & ~ETH_FLAG_LRO)
6695 return -EOPNOTSUPP;
6696
6697 if (data & ETH_FLAG_LRO) {
6698 if (lro_enable) {
6699 if (!(dev->features & NETIF_F_LRO)) {
6700 dev->features |= NETIF_F_LRO;
6701 changed = 1;
6702 }
6703 } else
6704 rc = -EINVAL;
6705 } else if (dev->features & NETIF_F_LRO) {
6706 dev->features &= ~NETIF_F_LRO;
6707 changed = 1;
6708 }
6709
6710 if (changed && netif_running(dev)) {
6711 s2io_stop_all_tx_queue(sp);
6712 s2io_card_down(sp);
6713 sp->lro = !!(dev->features & NETIF_F_LRO);
6714 rc = s2io_card_up(sp);
6715 if (rc)
6716 s2io_reset(sp);
6717 else
6718 s2io_start_all_tx_queue(sp);
6719 }
6720
6721 return rc;
6722}
6723
6688static const struct ethtool_ops netdev_ethtool_ops = { 6724static const struct ethtool_ops netdev_ethtool_ops = {
6689 .get_settings = s2io_ethtool_gset, 6725 .get_settings = s2io_ethtool_gset,
6690 .set_settings = s2io_ethtool_sset, 6726 .set_settings = s2io_ethtool_sset,
@@ -6701,6 +6737,8 @@ static const struct ethtool_ops netdev_ethtool_ops = {
6701 .get_rx_csum = s2io_ethtool_get_rx_csum, 6737 .get_rx_csum = s2io_ethtool_get_rx_csum,
6702 .set_rx_csum = s2io_ethtool_set_rx_csum, 6738 .set_rx_csum = s2io_ethtool_set_rx_csum,
6703 .set_tx_csum = s2io_ethtool_op_set_tx_csum, 6739 .set_tx_csum = s2io_ethtool_op_set_tx_csum,
6740 .set_flags = s2io_ethtool_set_flags,
6741 .get_flags = ethtool_op_get_flags,
6704 .set_sg = ethtool_op_set_sg, 6742 .set_sg = ethtool_op_set_sg,
6705 .get_tso = s2io_ethtool_op_get_tso, 6743 .get_tso = s2io_ethtool_op_get_tso,
6706 .set_tso = s2io_ethtool_op_set_tso, 6744 .set_tso = s2io_ethtool_op_set_tso,
@@ -7229,6 +7267,7 @@ static int s2io_card_up(struct s2io_nic *sp)
7229 struct ring_info *ring = &mac_control->rings[i]; 7267 struct ring_info *ring = &mac_control->rings[i];
7230 7268
7231 ring->mtu = dev->mtu; 7269 ring->mtu = dev->mtu;
7270 ring->lro = sp->lro;
7232 ret = fill_rx_buffers(sp, ring, 1); 7271 ret = fill_rx_buffers(sp, ring, 1);
7233 if (ret) { 7272 if (ret) {
7234 DBG_PRINT(ERR_DBG, "%s: Out of memory in Open\n", 7273 DBG_PRINT(ERR_DBG, "%s: Out of memory in Open\n",
@@ -7974,7 +8013,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
7974 dev->netdev_ops = &s2io_netdev_ops; 8013 dev->netdev_ops = &s2io_netdev_ops;
7975 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); 8014 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
7976 dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; 8015 dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
7977 8016 if (lro_enable)
8017 dev->features |= NETIF_F_LRO;
7978 dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; 8018 dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
7979 if (sp->high_dma_flag == true) 8019 if (sp->high_dma_flag == true)
7980 dev->features |= NETIF_F_HIGHDMA; 8020 dev->features |= NETIF_F_HIGHDMA;