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

net: cxgb3: convert to hw_features

This removes some of the remnants of LRO -> GRO conversion.
Signed-off-by: default avatarMichał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 39187646
...@@ -50,11 +50,6 @@ struct adapter; ...@@ -50,11 +50,6 @@ struct adapter;
struct sge_qset; struct sge_qset;
struct port_info; struct port_info;
enum { /* rx_offload flags */
T3_RX_CSUM = 1 << 0,
T3_LRO = 1 << 1,
};
enum mac_idx_types { enum mac_idx_types {
LAN_MAC_IDX = 0, LAN_MAC_IDX = 0,
SAN_MAC_IDX, SAN_MAC_IDX,
...@@ -74,7 +69,6 @@ struct port_info { ...@@ -74,7 +69,6 @@ struct port_info {
struct vlan_group *vlan_grp; struct vlan_group *vlan_grp;
struct sge_qset *qs; struct sge_qset *qs;
u8 port_id; u8 port_id;
u8 rx_offload;
u8 nqsets; u8 nqsets;
u8 first_qset; u8 first_qset;
struct cphy phy; struct cphy phy;
...@@ -212,7 +206,6 @@ struct sge_qset { /* an SGE queue set */ ...@@ -212,7 +206,6 @@ struct sge_qset { /* an SGE queue set */
struct sge_fl fl[SGE_RXQ_PER_SET]; struct sge_fl fl[SGE_RXQ_PER_SET];
struct sge_txq txq[SGE_TXQ_PER_SET]; struct sge_txq txq[SGE_TXQ_PER_SET];
int nomem; int nomem;
int lro_enabled;
void *lro_va; void *lro_va;
struct net_device *netdev; struct net_device *netdev;
struct netdev_queue *tx_q; /* associated netdev TX queue */ struct netdev_queue *tx_q; /* associated netdev TX queue */
......
...@@ -317,7 +317,6 @@ struct tp_params { ...@@ -317,7 +317,6 @@ struct tp_params {
struct qset_params { /* SGE queue set parameters */ struct qset_params { /* SGE queue set parameters */
unsigned int polling; /* polling/interrupt service for rspq */ unsigned int polling; /* polling/interrupt service for rspq */
unsigned int lro; /* large receive offload */
unsigned int coalesce_usecs; /* irq coalescing timer */ unsigned int coalesce_usecs; /* irq coalescing timer */
unsigned int rspq_size; /* # of entries in response queue */ unsigned int rspq_size; /* # of entries in response queue */
unsigned int fl_size; /* # of entries in regular free list */ unsigned int fl_size; /* # of entries in regular free list */
......
...@@ -643,26 +643,6 @@ static void enable_all_napi(struct adapter *adap) ...@@ -643,26 +643,6 @@ static void enable_all_napi(struct adapter *adap)
napi_enable(&adap->sge.qs[i].napi); napi_enable(&adap->sge.qs[i].napi);
} }
/**
* set_qset_lro - Turn a queue set's LRO capability on and off
* @dev: the device the qset is attached to
* @qset_idx: the queue set index
* @val: the LRO switch
*
* Sets LRO on or off for a particular queue set.
* the device's features flag is updated to reflect the LRO
* capability when all queues belonging to the device are
* in the same state.
*/
static void set_qset_lro(struct net_device *dev, int qset_idx, int val)
{
struct port_info *pi = netdev_priv(dev);
struct adapter *adapter = pi->adapter;
adapter->params.sge.qset[qset_idx].lro = !!val;
adapter->sge.qs[qset_idx].lro_enabled = !!val;
}
/** /**
* setup_sge_qsets - configure SGE Tx/Rx/response queues * setup_sge_qsets - configure SGE Tx/Rx/response queues
* @adap: the adapter * @adap: the adapter
...@@ -685,7 +665,6 @@ static int setup_sge_qsets(struct adapter *adap) ...@@ -685,7 +665,6 @@ static int setup_sge_qsets(struct adapter *adap)
pi->qs = &adap->sge.qs[pi->first_qset]; pi->qs = &adap->sge.qs[pi->first_qset];
for (j = 0; j < pi->nqsets; ++j, ++qset_idx) { for (j = 0; j < pi->nqsets; ++j, ++qset_idx) {
set_qset_lro(dev, qset_idx, pi->rx_offload & T3_LRO);
err = t3_sge_alloc_qset(adap, qset_idx, 1, err = t3_sge_alloc_qset(adap, qset_idx, 1,
(adap->flags & USING_MSIX) ? qset_idx + 1 : (adap->flags & USING_MSIX) ? qset_idx + 1 :
irq_idx, irq_idx,
...@@ -1910,29 +1889,6 @@ static int set_pauseparam(struct net_device *dev, ...@@ -1910,29 +1889,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 & T3_RX_CSUM;
}
static int set_rx_csum(struct net_device *dev, u32 data)
{
struct port_info *p = netdev_priv(dev);
if (data) {
p->rx_offload |= T3_RX_CSUM;
} else {
int i;
p->rx_offload &= ~(T3_RX_CSUM | T3_LRO);
for (i = p->first_qset; i < p->first_qset + p->nqsets; i++)
set_qset_lro(dev, i, 0);
}
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)
{ {
struct port_info *pi = netdev_priv(dev); struct port_info *pi = netdev_priv(dev);
...@@ -2104,10 +2060,6 @@ static const struct ethtool_ops cxgb_ethtool_ops = { ...@@ -2104,10 +2060,6 @@ static const 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_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 = set_phys_id, .set_phys_id = set_phys_id,
...@@ -2117,7 +2069,6 @@ static const struct ethtool_ops cxgb_ethtool_ops = { ...@@ -2117,7 +2069,6 @@ static const struct ethtool_ops cxgb_ethtool_ops = {
.get_regs_len = get_regs_len, .get_regs_len = get_regs_len,
.get_regs = get_regs, .get_regs = get_regs,
.get_wol = get_wol, .get_wol = get_wol,
.set_tso = ethtool_op_set_tso,
}; };
static int in_range(int val, int lo, int hi) static int in_range(int val, int lo, int hi)
...@@ -2165,15 +2116,6 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) ...@@ -2165,15 +2116,6 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
MAX_RSPQ_ENTRIES)) MAX_RSPQ_ENTRIES))
return -EINVAL; return -EINVAL;
if ((adapter->flags & FULL_INIT_DONE) && t.lro > 0)
for_each_port(adapter, i) {
pi = adap2pinfo(adapter, i);
if (t.qset_idx >= pi->first_qset &&
t.qset_idx < pi->first_qset + pi->nqsets &&
!(pi->rx_offload & T3_RX_CSUM))
return -EINVAL;
}
if ((adapter->flags & FULL_INIT_DONE) && if ((adapter->flags & FULL_INIT_DONE) &&
(t.rspq_size >= 0 || t.fl_size[0] >= 0 || (t.rspq_size >= 0 || t.fl_size[0] >= 0 ||
t.fl_size[1] >= 0 || t.txq_size[0] >= 0 || t.fl_size[1] >= 0 || t.txq_size[0] >= 0 ||
...@@ -2234,8 +2176,14 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) ...@@ -2234,8 +2176,14 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
} }
} }
} }
if (t.lro >= 0)
set_qset_lro(dev, t.qset_idx, t.lro); if (t.lro >= 0) {
if (t.lro)
dev->wanted_features |= NETIF_F_GRO;
else
dev->wanted_features &= ~NETIF_F_GRO;
netdev_update_features(dev);
}
break; break;
} }
...@@ -2269,7 +2217,7 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) ...@@ -2269,7 +2217,7 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
t.fl_size[0] = q->fl_size; t.fl_size[0] = q->fl_size;
t.fl_size[1] = q->jumbo_size; t.fl_size[1] = q->jumbo_size;
t.polling = q->polling; t.polling = q->polling;
t.lro = q->lro; t.lro = !!(dev->features & NETIF_F_GRO);
t.intr_lat = q->coalesce_usecs; t.intr_lat = q->coalesce_usecs;
t.cong_thres = q->cong_thres; t.cong_thres = q->cong_thres;
t.qnum = q1; t.qnum = q1;
...@@ -3307,18 +3255,18 @@ static int __devinit init_one(struct pci_dev *pdev, ...@@ -3307,18 +3255,18 @@ static int __devinit init_one(struct pci_dev *pdev,
adapter->port[i] = netdev; adapter->port[i] = netdev;
pi = netdev_priv(netdev); pi = netdev_priv(netdev);
pi->adapter = adapter; pi->adapter = adapter;
pi->rx_offload = T3_RX_CSUM | T3_LRO;
pi->port_id = i; pi->port_id = i;
netif_carrier_off(netdev); netif_carrier_off(netdev);
netdev->irq = pdev->irq; netdev->irq = pdev->irq;
netdev->mem_start = mmio_start; netdev->mem_start = mmio_start;
netdev->mem_end = mmio_start + mmio_len - 1; netdev->mem_end = mmio_start + mmio_len - 1;
netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
netdev->features |= NETIF_F_GRO; NETIF_F_TSO | NETIF_F_RXCSUM;
netdev->features |= netdev->hw_features |
NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
if (pci_using_dac) if (pci_using_dac)
netdev->features |= NETIF_F_HIGHDMA; netdev->features |= NETIF_F_HIGHDMA;
netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
netdev->netdev_ops = &cxgb_netdev_ops; netdev->netdev_ops = &cxgb_netdev_ops;
SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops); SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops);
} }
......
...@@ -2019,7 +2019,7 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq, ...@@ -2019,7 +2019,7 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
skb_pull(skb, sizeof(*p) + pad); skb_pull(skb, sizeof(*p) + pad);
skb->protocol = eth_type_trans(skb, adap->port[p->iff]); skb->protocol = eth_type_trans(skb, adap->port[p->iff]);
pi = netdev_priv(skb->dev); pi = netdev_priv(skb->dev);
if ((pi->rx_offload & T3_RX_CSUM) && p->csum_valid && if ((skb->dev->features & NETIF_F_RXCSUM) && p->csum_valid &&
p->csum == htons(0xffff) && !p->fragment) { p->csum == htons(0xffff) && !p->fragment) {
qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++; qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++;
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
...@@ -2120,7 +2120,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs, ...@@ -2120,7 +2120,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
offset = 2 + sizeof(struct cpl_rx_pkt); offset = 2 + sizeof(struct cpl_rx_pkt);
cpl = qs->lro_va = sd->pg_chunk.va + 2; cpl = qs->lro_va = sd->pg_chunk.va + 2;
if ((pi->rx_offload & T3_RX_CSUM) && if ((qs->netdev->features & NETIF_F_RXCSUM) &&
cpl->csum_valid && cpl->csum == htons(0xffff)) { cpl->csum_valid && cpl->csum == htons(0xffff)) {
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++; qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++;
...@@ -2285,7 +2285,8 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs, ...@@ -2285,7 +2285,8 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs,
q->next_holdoff = q->holdoff_tmr; q->next_holdoff = q->holdoff_tmr;
while (likely(budget_left && is_new_response(r, q))) { while (likely(budget_left && is_new_response(r, q))) {
int packet_complete, eth, ethpad = 2, lro = qs->lro_enabled; int packet_complete, eth, ethpad = 2;
int lro = !!(qs->netdev->features & NETIF_F_GRO);
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
u32 len, flags; u32 len, flags;
__be32 rss_hi, rss_lo; __be32 rss_hi, rss_lo;
......
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