Commit 2ed28baa authored by Michał Mirosław's avatar Michał Mirosław Committed by David S. Miller

net: cxgb4{,vf}: convert to hw_features

Signed-off-by: default avatarMichał Mirosław <mirq-linux@rere.qmqm.pl>
Acked-by: default avatarDimitris Michailidis <dm@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c582a950
...@@ -290,7 +290,6 @@ struct port_info { ...@@ -290,7 +290,6 @@ struct port_info {
u8 port_id; u8 port_id;
u8 tx_chan; u8 tx_chan;
u8 lport; /* associated offload logical port */ u8 lport; /* associated offload logical port */
u8 rx_offload; /* CSO, etc */
u8 nqsets; /* # of qsets */ u8 nqsets; /* # of qsets */
u8 first_qset; /* index of first qset */ u8 first_qset; /* index of first qset */
u8 rss_mode; u8 rss_mode;
...@@ -298,11 +297,6 @@ struct port_info { ...@@ -298,11 +297,6 @@ struct port_info {
u16 *rss; u16 *rss;
}; };
/* port_info.rx_offload flags */
enum {
RX_CSO = 1 << 0,
};
struct dentry; struct dentry;
struct work_struct; struct work_struct;
......
...@@ -1531,24 +1531,6 @@ static int set_pauseparam(struct net_device *dev, ...@@ -1531,24 +1531,6 @@ static int set_pauseparam(struct net_device *dev,
return 0; return 0;
} }
static u32 get_rx_csum(struct net_device *dev)
{
struct port_info *p = netdev_priv(dev);
return p->rx_offload & RX_CSO;
}
static int set_rx_csum(struct net_device *dev, u32 data)
{
struct port_info *p = netdev_priv(dev);
if (data)
p->rx_offload |= RX_CSO;
else
p->rx_offload &= ~RX_CSO;
return 0;
}
static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e) static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
{ {
const struct port_info *pi = netdev_priv(dev); const struct port_info *pi = netdev_priv(dev);
...@@ -1870,36 +1852,20 @@ static int set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) ...@@ -1870,36 +1852,20 @@ static int set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
return err; return err;
} }
#define TSO_FLAGS (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN) static int cxgb_set_features(struct net_device *dev, u32 features)
static int set_tso(struct net_device *dev, u32 value)
{
if (value)
dev->features |= TSO_FLAGS;
else
dev->features &= ~TSO_FLAGS;
return 0;
}
static int set_flags(struct net_device *dev, u32 flags)
{ {
const struct port_info *pi = netdev_priv(dev);
u32 changed = dev->features ^ features;
int err; int err;
unsigned long old_feat = dev->features;
err = ethtool_op_set_flags(dev, flags, ETH_FLAG_RXHASH |
ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN);
if (err)
return err;
if ((old_feat ^ dev->features) & NETIF_F_HW_VLAN_RX) { if (!(changed & NETIF_F_HW_VLAN_RX))
const struct port_info *pi = netdev_priv(dev); return 0;
err = t4_set_rxmode(pi->adapter, pi->adapter->fn, pi->viid, -1, err = t4_set_rxmode(pi->adapter, pi->adapter->fn, pi->viid, -1,
-1, -1, -1, !!(flags & ETH_FLAG_RXVLAN), -1, -1, -1,
true); !!(features & NETIF_F_HW_VLAN_RX), true);
if (err) if (unlikely(err))
dev->features = old_feat; dev->features = features ^ NETIF_F_HW_VLAN_RX;
}
return err; return err;
} }
...@@ -2010,10 +1976,6 @@ static struct ethtool_ops cxgb_ethtool_ops = { ...@@ -2010,10 +1976,6 @@ static struct ethtool_ops cxgb_ethtool_ops = {
.set_eeprom = set_eeprom, .set_eeprom = set_eeprom,
.get_pauseparam = get_pauseparam, .get_pauseparam = get_pauseparam,
.set_pauseparam = set_pauseparam, .set_pauseparam = set_pauseparam,
.get_rx_csum = get_rx_csum,
.set_rx_csum = set_rx_csum,
.set_tx_csum = ethtool_op_set_tx_ipv6_csum,
.set_sg = ethtool_op_set_sg,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
.get_strings = get_strings, .get_strings = get_strings,
.set_phys_id = identify_port, .set_phys_id = identify_port,
...@@ -2024,8 +1986,6 @@ static struct ethtool_ops cxgb_ethtool_ops = { ...@@ -2024,8 +1986,6 @@ static struct ethtool_ops cxgb_ethtool_ops = {
.get_regs = get_regs, .get_regs = get_regs,
.get_wol = get_wol, .get_wol = get_wol,
.set_wol = set_wol, .set_wol = set_wol,
.set_tso = set_tso,
.set_flags = set_flags,
.get_rxnfc = get_rxnfc, .get_rxnfc = get_rxnfc,
.get_rxfh_indir = get_rss_table, .get_rxfh_indir = get_rss_table,
.set_rxfh_indir = set_rss_table, .set_rxfh_indir = set_rss_table,
...@@ -2882,6 +2842,7 @@ static const struct net_device_ops cxgb4_netdev_ops = { ...@@ -2882,6 +2842,7 @@ static const struct net_device_ops cxgb4_netdev_ops = {
.ndo_get_stats64 = cxgb_get_stats, .ndo_get_stats64 = cxgb_get_stats,
.ndo_set_rx_mode = cxgb_set_rxmode, .ndo_set_rx_mode = cxgb_set_rxmode,
.ndo_set_mac_address = cxgb_set_mac_addr, .ndo_set_mac_address = cxgb_set_mac_addr,
.ndo_set_features = cxgb_set_features,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = cxgb_ioctl, .ndo_do_ioctl = cxgb_ioctl,
.ndo_change_mtu = cxgb_change_mtu, .ndo_change_mtu = cxgb_change_mtu,
...@@ -3564,6 +3525,7 @@ static void free_some_resources(struct adapter *adapter) ...@@ -3564,6 +3525,7 @@ static void free_some_resources(struct adapter *adapter)
t4_fw_bye(adapter, adapter->fn); t4_fw_bye(adapter, adapter->fn);
} }
#define TSO_FLAGS (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN)
#define VLAN_FEAT (NETIF_F_SG | NETIF_F_IP_CSUM | TSO_FLAGS | \ #define VLAN_FEAT (NETIF_F_SG | NETIF_F_IP_CSUM | TSO_FLAGS | \
NETIF_F_IPV6_CSUM | NETIF_F_HIGHDMA) NETIF_F_IPV6_CSUM | NETIF_F_HIGHDMA)
...@@ -3665,14 +3627,14 @@ static int __devinit init_one(struct pci_dev *pdev, ...@@ -3665,14 +3627,14 @@ static int __devinit init_one(struct pci_dev *pdev,
pi = netdev_priv(netdev); pi = netdev_priv(netdev);
pi->adapter = adapter; pi->adapter = adapter;
pi->xact_addr_filt = -1; pi->xact_addr_filt = -1;
pi->rx_offload = RX_CSO;
pi->port_id = i; pi->port_id = i;
netdev->irq = pdev->irq; netdev->irq = pdev->irq;
netdev->features |= NETIF_F_SG | TSO_FLAGS; netdev->hw_features = NETIF_F_SG | TSO_FLAGS |
netdev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
netdev->features |= NETIF_F_GRO | NETIF_F_RXHASH | highdma; NETIF_F_RXCSUM | NETIF_F_RXHASH |
netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
netdev->features |= netdev->hw_features | highdma;
netdev->vlan_features = netdev->features & VLAN_FEAT; netdev->vlan_features = netdev->features & VLAN_FEAT;
netdev->netdev_ops = &cxgb4_netdev_ops; netdev->netdev_ops = &cxgb4_netdev_ops;
......
...@@ -1556,7 +1556,6 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp, ...@@ -1556,7 +1556,6 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
{ {
bool csum_ok; bool csum_ok;
struct sk_buff *skb; struct sk_buff *skb;
struct port_info *pi;
const struct cpl_rx_pkt *pkt; const struct cpl_rx_pkt *pkt;
struct sge_eth_rxq *rxq = container_of(q, struct sge_eth_rxq, rspq); struct sge_eth_rxq *rxq = container_of(q, struct sge_eth_rxq, rspq);
...@@ -1584,10 +1583,9 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp, ...@@ -1584,10 +1583,9 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
if (skb->dev->features & NETIF_F_RXHASH) if (skb->dev->features & NETIF_F_RXHASH)
skb->rxhash = (__force u32)pkt->rsshdr.hash_val; skb->rxhash = (__force u32)pkt->rsshdr.hash_val;
pi = netdev_priv(skb->dev);
rxq->stats.pkts++; rxq->stats.pkts++;
if (csum_ok && (pi->rx_offload & RX_CSO) && if (csum_ok && (q->netdev->features & NETIF_F_RXCSUM) &&
(pkt->l2info & htonl(RXF_UDP | RXF_TCP))) { (pkt->l2info & htonl(RXF_UDP | RXF_TCP))) {
if (!pkt->ip_frag) { if (!pkt->ip_frag) {
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
......
...@@ -97,17 +97,11 @@ struct port_info { ...@@ -97,17 +97,11 @@ struct port_info {
u16 rss_size; /* size of VI's RSS table slice */ u16 rss_size; /* size of VI's RSS table slice */
u8 pidx; /* index into adapter port[] */ u8 pidx; /* index into adapter port[] */
u8 port_id; /* physical port ID */ u8 port_id; /* physical port ID */
u8 rx_offload; /* CSO, etc. */
u8 nqsets; /* # of "Queue Sets" */ u8 nqsets; /* # of "Queue Sets" */
u8 first_qset; /* index of first "Queue Set" */ u8 first_qset; /* index of first "Queue Set" */
struct link_config link_cfg; /* physical port configuration */ struct link_config link_cfg; /* physical port configuration */
}; };
/* port_info.rx_offload flags */
enum {
RX_CSO = 1 << 0,
};
/* /*
* Scatter Gather Engine resources for the "adapter". Our ingress and egress * Scatter Gather Engine resources for the "adapter". Our ingress and egress
* queues are organized into "Queue Sets" with one ingress and one egress * queues are organized into "Queue Sets" with one ingress and one egress
......
...@@ -1325,30 +1325,6 @@ static void cxgb4vf_get_pauseparam(struct net_device *dev, ...@@ -1325,30 +1325,6 @@ static void cxgb4vf_get_pauseparam(struct net_device *dev,
pauseparam->tx_pause = (pi->link_cfg.fc & PAUSE_TX) != 0; pauseparam->tx_pause = (pi->link_cfg.fc & PAUSE_TX) != 0;
} }
/*
* Return whether RX Checksum Offloading is currently enabled for the device.
*/
static u32 cxgb4vf_get_rx_csum(struct net_device *dev)
{
struct port_info *pi = netdev_priv(dev);
return (pi->rx_offload & RX_CSO) != 0;
}
/*
* Turn RX Checksum Offloading on or off for the device.
*/
static int cxgb4vf_set_rx_csum(struct net_device *dev, u32 csum)
{
struct port_info *pi = netdev_priv(dev);
if (csum)
pi->rx_offload |= RX_CSO;
else
pi->rx_offload &= ~RX_CSO;
return 0;
}
/* /*
* Identify the port by blinking the port's LED. * Identify the port by blinking the port's LED.
*/ */
...@@ -1569,18 +1545,6 @@ static void cxgb4vf_get_wol(struct net_device *dev, ...@@ -1569,18 +1545,6 @@ static void cxgb4vf_get_wol(struct net_device *dev,
*/ */
#define TSO_FLAGS (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN) #define TSO_FLAGS (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN)
/*
* Set TCP Segmentation Offloading feature capabilities.
*/
static int cxgb4vf_set_tso(struct net_device *dev, u32 tso)
{
if (tso)
dev->features |= TSO_FLAGS;
else
dev->features &= ~TSO_FLAGS;
return 0;
}
static struct ethtool_ops cxgb4vf_ethtool_ops = { static struct ethtool_ops cxgb4vf_ethtool_ops = {
.get_settings = cxgb4vf_get_settings, .get_settings = cxgb4vf_get_settings,
.get_drvinfo = cxgb4vf_get_drvinfo, .get_drvinfo = cxgb4vf_get_drvinfo,
...@@ -1591,10 +1555,6 @@ static struct ethtool_ops cxgb4vf_ethtool_ops = { ...@@ -1591,10 +1555,6 @@ static struct ethtool_ops cxgb4vf_ethtool_ops = {
.get_coalesce = cxgb4vf_get_coalesce, .get_coalesce = cxgb4vf_get_coalesce,
.set_coalesce = cxgb4vf_set_coalesce, .set_coalesce = cxgb4vf_set_coalesce,
.get_pauseparam = cxgb4vf_get_pauseparam, .get_pauseparam = cxgb4vf_get_pauseparam,
.get_rx_csum = cxgb4vf_get_rx_csum,
.set_rx_csum = cxgb4vf_set_rx_csum,
.set_tx_csum = ethtool_op_set_tx_ipv6_csum,
.set_sg = ethtool_op_set_sg,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
.get_strings = cxgb4vf_get_strings, .get_strings = cxgb4vf_get_strings,
.set_phys_id = cxgb4vf_phys_id, .set_phys_id = cxgb4vf_phys_id,
...@@ -1603,7 +1563,6 @@ static struct ethtool_ops cxgb4vf_ethtool_ops = { ...@@ -1603,7 +1563,6 @@ static struct ethtool_ops cxgb4vf_ethtool_ops = {
.get_regs_len = cxgb4vf_get_regs_len, .get_regs_len = cxgb4vf_get_regs_len,
.get_regs = cxgb4vf_get_regs, .get_regs = cxgb4vf_get_regs,
.get_wol = cxgb4vf_get_wol, .get_wol = cxgb4vf_get_wol,
.set_tso = cxgb4vf_set_tso,
}; };
/* /*
...@@ -2638,19 +2597,19 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev, ...@@ -2638,19 +2597,19 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev,
* it. * it.
*/ */
pi->xact_addr_filt = -1; pi->xact_addr_filt = -1;
pi->rx_offload = RX_CSO;
netif_carrier_off(netdev); netif_carrier_off(netdev);
netdev->irq = pdev->irq; netdev->irq = pdev->irq;
netdev->features = (NETIF_F_SG | TSO_FLAGS | netdev->hw_features = NETIF_F_SG | TSO_FLAGS |
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX | NETIF_F_RXCSUM;
NETIF_F_GRO); netdev->vlan_features = NETIF_F_SG | TSO_FLAGS |
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
NETIF_F_HIGHDMA;
netdev->features = netdev->hw_features |
NETIF_F_HW_VLAN_RX;
if (pci_using_dac) if (pci_using_dac)
netdev->features |= NETIF_F_HIGHDMA; netdev->features |= NETIF_F_HIGHDMA;
netdev->vlan_features =
(netdev->features &
~(NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX));
#ifdef HAVE_NET_DEVICE_OPS #ifdef HAVE_NET_DEVICE_OPS
netdev->netdev_ops = &cxgb4vf_netdev_ops; netdev->netdev_ops = &cxgb4vf_netdev_ops;
......
...@@ -1555,8 +1555,8 @@ int t4vf_ethrx_handler(struct sge_rspq *rspq, const __be64 *rsp, ...@@ -1555,8 +1555,8 @@ int t4vf_ethrx_handler(struct sge_rspq *rspq, const __be64 *rsp,
pi = netdev_priv(skb->dev); pi = netdev_priv(skb->dev);
rxq->stats.pkts++; rxq->stats.pkts++;
if (csum_ok && (pi->rx_offload & RX_CSO) && !pkt->err_vec && if (csum_ok && (rspq->netdev->features & NETIF_F_RXCSUM) &&
(be32_to_cpu(pkt->l2info) & (RXF_UDP|RXF_TCP))) { !pkt->err_vec && (be32_to_cpu(pkt->l2info) & (RXF_UDP|RXF_TCP))) {
if (!pkt->ip_frag) if (!pkt->ip_frag)
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
else { else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment