aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>2011-04-16 20:15:46 -0400
committerDavid S. Miller <davem@davemloft.net>2011-04-17 20:40:25 -0400
commitd2fe2755342b30bc1ee7797b9975f8626d65e485 (patch)
tree7ca1dc1ef596d1f379371abccc4a2f135f6c3a23
parent391876466670988196786150fc9d9da2f3c7cecb (diff)
net: cxgb3: convert to hw_features
This removes some of the remnants of LRO -> GRO conversion. Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/cxgb3/adapter.h7
-rw-r--r--drivers/net/cxgb3/common.h1
-rw-r--r--drivers/net/cxgb3/cxgb3_main.c78
-rw-r--r--drivers/net/cxgb3/sge.c7
4 files changed, 17 insertions, 76 deletions
diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h
index ef67be59680f..7300de5a1426 100644
--- a/drivers/net/cxgb3/adapter.h
+++ b/drivers/net/cxgb3/adapter.h
@@ -50,11 +50,6 @@ struct adapter;
50struct sge_qset; 50struct sge_qset;
51struct port_info; 51struct port_info;
52 52
53enum { /* rx_offload flags */
54 T3_RX_CSUM = 1 << 0,
55 T3_LRO = 1 << 1,
56};
57
58enum mac_idx_types { 53enum mac_idx_types {
59 LAN_MAC_IDX = 0, 54 LAN_MAC_IDX = 0,
60 SAN_MAC_IDX, 55 SAN_MAC_IDX,
@@ -74,7 +69,6 @@ struct port_info {
74 struct vlan_group *vlan_grp; 69 struct vlan_group *vlan_grp;
75 struct sge_qset *qs; 70 struct sge_qset *qs;
76 u8 port_id; 71 u8 port_id;
77 u8 rx_offload;
78 u8 nqsets; 72 u8 nqsets;
79 u8 first_qset; 73 u8 first_qset;
80 struct cphy phy; 74 struct cphy phy;
@@ -212,7 +206,6 @@ struct sge_qset { /* an SGE queue set */
212 struct sge_fl fl[SGE_RXQ_PER_SET]; 206 struct sge_fl fl[SGE_RXQ_PER_SET];
213 struct sge_txq txq[SGE_TXQ_PER_SET]; 207 struct sge_txq txq[SGE_TXQ_PER_SET];
214 int nomem; 208 int nomem;
215 int lro_enabled;
216 void *lro_va; 209 void *lro_va;
217 struct net_device *netdev; 210 struct net_device *netdev;
218 struct netdev_queue *tx_q; /* associated netdev TX queue */ 211 struct netdev_queue *tx_q; /* associated netdev TX queue */
diff --git a/drivers/net/cxgb3/common.h b/drivers/net/cxgb3/common.h
index 5ccb77d078aa..056ee8c831f1 100644
--- a/drivers/net/cxgb3/common.h
+++ b/drivers/net/cxgb3/common.h
@@ -317,7 +317,6 @@ struct tp_params {
317 317
318struct qset_params { /* SGE queue set parameters */ 318struct qset_params { /* SGE queue set parameters */
319 unsigned int polling; /* polling/interrupt service for rspq */ 319 unsigned int polling; /* polling/interrupt service for rspq */
320 unsigned int lro; /* large receive offload */
321 unsigned int coalesce_usecs; /* irq coalescing timer */ 320 unsigned int coalesce_usecs; /* irq coalescing timer */
322 unsigned int rspq_size; /* # of entries in response queue */ 321 unsigned int rspq_size; /* # of entries in response queue */
323 unsigned int fl_size; /* # of entries in regular free list */ 322 unsigned int fl_size; /* # of entries in regular free list */
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c
index a087e0691dce..040491804efb 100644
--- a/drivers/net/cxgb3/cxgb3_main.c
+++ b/drivers/net/cxgb3/cxgb3_main.c
@@ -644,26 +644,6 @@ static void enable_all_napi(struct adapter *adap)
644} 644}
645 645
646/** 646/**
647 * set_qset_lro - Turn a queue set's LRO capability on and off
648 * @dev: the device the qset is attached to
649 * @qset_idx: the queue set index
650 * @val: the LRO switch
651 *
652 * Sets LRO on or off for a particular queue set.
653 * the device's features flag is updated to reflect the LRO
654 * capability when all queues belonging to the device are
655 * in the same state.
656 */
657static void set_qset_lro(struct net_device *dev, int qset_idx, int val)
658{
659 struct port_info *pi = netdev_priv(dev);
660 struct adapter *adapter = pi->adapter;
661
662 adapter->params.sge.qset[qset_idx].lro = !!val;
663 adapter->sge.qs[qset_idx].lro_enabled = !!val;
664}
665
666/**
667 * setup_sge_qsets - configure SGE Tx/Rx/response queues 647 * setup_sge_qsets - configure SGE Tx/Rx/response queues
668 * @adap: the adapter 648 * @adap: the adapter
669 * 649 *
@@ -685,7 +665,6 @@ static int setup_sge_qsets(struct adapter *adap)
685 665
686 pi->qs = &adap->sge.qs[pi->first_qset]; 666 pi->qs = &adap->sge.qs[pi->first_qset];
687 for (j = 0; j < pi->nqsets; ++j, ++qset_idx) { 667 for (j = 0; j < pi->nqsets; ++j, ++qset_idx) {
688 set_qset_lro(dev, qset_idx, pi->rx_offload & T3_LRO);
689 err = t3_sge_alloc_qset(adap, qset_idx, 1, 668 err = t3_sge_alloc_qset(adap, qset_idx, 1,
690 (adap->flags & USING_MSIX) ? qset_idx + 1 : 669 (adap->flags & USING_MSIX) ? qset_idx + 1 :
691 irq_idx, 670 irq_idx,
@@ -1910,29 +1889,6 @@ static int set_pauseparam(struct net_device *dev,
1910 return 0; 1889 return 0;
1911} 1890}
1912 1891
1913static u32 get_rx_csum(struct net_device *dev)
1914{
1915 struct port_info *p = netdev_priv(dev);
1916
1917 return p->rx_offload & T3_RX_CSUM;
1918}
1919
1920static int set_rx_csum(struct net_device *dev, u32 data)
1921{
1922 struct port_info *p = netdev_priv(dev);
1923
1924 if (data) {
1925 p->rx_offload |= T3_RX_CSUM;
1926 } else {
1927 int i;
1928
1929 p->rx_offload &= ~(T3_RX_CSUM | T3_LRO);
1930 for (i = p->first_qset; i < p->first_qset + p->nqsets; i++)
1931 set_qset_lro(dev, i, 0);
1932 }
1933 return 0;
1934}
1935
1936static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e) 1892static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
1937{ 1893{
1938 struct port_info *pi = netdev_priv(dev); 1894 struct port_info *pi = netdev_priv(dev);
@@ -2104,10 +2060,6 @@ static const struct ethtool_ops cxgb_ethtool_ops = {
2104 .set_eeprom = set_eeprom, 2060 .set_eeprom = set_eeprom,
2105 .get_pauseparam = get_pauseparam, 2061 .get_pauseparam = get_pauseparam,
2106 .set_pauseparam = set_pauseparam, 2062 .set_pauseparam = set_pauseparam,
2107 .get_rx_csum = get_rx_csum,
2108 .set_rx_csum = set_rx_csum,
2109 .set_tx_csum = ethtool_op_set_tx_csum,
2110 .set_sg = ethtool_op_set_sg,
2111 .get_link = ethtool_op_get_link, 2063 .get_link = ethtool_op_get_link,
2112 .get_strings = get_strings, 2064 .get_strings = get_strings,
2113 .set_phys_id = set_phys_id, 2065 .set_phys_id = set_phys_id,
@@ -2117,7 +2069,6 @@ static const struct ethtool_ops cxgb_ethtool_ops = {
2117 .get_regs_len = get_regs_len, 2069 .get_regs_len = get_regs_len,
2118 .get_regs = get_regs, 2070 .get_regs = get_regs,
2119 .get_wol = get_wol, 2071 .get_wol = get_wol,
2120 .set_tso = ethtool_op_set_tso,
2121}; 2072};
2122 2073
2123static int in_range(int val, int lo, int hi) 2074static 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 MAX_RSPQ_ENTRIES)) 2116 MAX_RSPQ_ENTRIES))
2166 return -EINVAL; 2117 return -EINVAL;
2167 2118
2168 if ((adapter->flags & FULL_INIT_DONE) && t.lro > 0)
2169 for_each_port(adapter, i) {
2170 pi = adap2pinfo(adapter, i);
2171 if (t.qset_idx >= pi->first_qset &&
2172 t.qset_idx < pi->first_qset + pi->nqsets &&
2173 !(pi->rx_offload & T3_RX_CSUM))
2174 return -EINVAL;
2175 }
2176
2177 if ((adapter->flags & FULL_INIT_DONE) && 2119 if ((adapter->flags & FULL_INIT_DONE) &&
2178 (t.rspq_size >= 0 || t.fl_size[0] >= 0 || 2120 (t.rspq_size >= 0 || t.fl_size[0] >= 0 ||
2179 t.fl_size[1] >= 0 || t.txq_size[0] >= 0 || 2121 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 } 2176 }
2235 } 2177 }
2236 } 2178 }
2237 if (t.lro >= 0) 2179
2238 set_qset_lro(dev, t.qset_idx, t.lro); 2180 if (t.lro >= 0) {
2181 if (t.lro)
2182 dev->wanted_features |= NETIF_F_GRO;
2183 else
2184 dev->wanted_features &= ~NETIF_F_GRO;
2185 netdev_update_features(dev);
2186 }
2239 2187
2240 break; 2188 break;
2241 } 2189 }
@@ -2269,7 +2217,7 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
2269 t.fl_size[0] = q->fl_size; 2217 t.fl_size[0] = q->fl_size;
2270 t.fl_size[1] = q->jumbo_size; 2218 t.fl_size[1] = q->jumbo_size;
2271 t.polling = q->polling; 2219 t.polling = q->polling;
2272 t.lro = q->lro; 2220 t.lro = !!(dev->features & NETIF_F_GRO);
2273 t.intr_lat = q->coalesce_usecs; 2221 t.intr_lat = q->coalesce_usecs;
2274 t.cong_thres = q->cong_thres; 2222 t.cong_thres = q->cong_thres;
2275 t.qnum = q1; 2223 t.qnum = q1;
@@ -3307,18 +3255,18 @@ static int __devinit init_one(struct pci_dev *pdev,
3307 adapter->port[i] = netdev; 3255 adapter->port[i] = netdev;
3308 pi = netdev_priv(netdev); 3256 pi = netdev_priv(netdev);
3309 pi->adapter = adapter; 3257 pi->adapter = adapter;
3310 pi->rx_offload = T3_RX_CSUM | T3_LRO;
3311 pi->port_id = i; 3258 pi->port_id = i;
3312 netif_carrier_off(netdev); 3259 netif_carrier_off(netdev);
3313 netdev->irq = pdev->irq; 3260 netdev->irq = pdev->irq;
3314 netdev->mem_start = mmio_start; 3261 netdev->mem_start = mmio_start;
3315 netdev->mem_end = mmio_start + mmio_len - 1; 3262 netdev->mem_end = mmio_start + mmio_len - 1;
3316 netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; 3263 netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
3317 netdev->features |= NETIF_F_GRO; 3264 NETIF_F_TSO | NETIF_F_RXCSUM;
3265 netdev->features |= netdev->hw_features |
3266 NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
3318 if (pci_using_dac) 3267 if (pci_using_dac)
3319 netdev->features |= NETIF_F_HIGHDMA; 3268 netdev->features |= NETIF_F_HIGHDMA;
3320 3269
3321 netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
3322 netdev->netdev_ops = &cxgb_netdev_ops; 3270 netdev->netdev_ops = &cxgb_netdev_ops;
3323 SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops); 3271 SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops);
3324 } 3272 }
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c
index bfa2d56af1ee..cba1401377ab 100644
--- a/drivers/net/cxgb3/sge.c
+++ b/drivers/net/cxgb3/sge.c
@@ -2019,7 +2019,7 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
2019 skb_pull(skb, sizeof(*p) + pad); 2019 skb_pull(skb, sizeof(*p) + pad);
2020 skb->protocol = eth_type_trans(skb, adap->port[p->iff]); 2020 skb->protocol = eth_type_trans(skb, adap->port[p->iff]);
2021 pi = netdev_priv(skb->dev); 2021 pi = netdev_priv(skb->dev);
2022 if ((pi->rx_offload & T3_RX_CSUM) && p->csum_valid && 2022 if ((skb->dev->features & NETIF_F_RXCSUM) && p->csum_valid &&
2023 p->csum == htons(0xffff) && !p->fragment) { 2023 p->csum == htons(0xffff) && !p->fragment) {
2024 qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++; 2024 qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++;
2025 skb->ip_summed = CHECKSUM_UNNECESSARY; 2025 skb->ip_summed = CHECKSUM_UNNECESSARY;
@@ -2120,7 +2120,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
2120 offset = 2 + sizeof(struct cpl_rx_pkt); 2120 offset = 2 + sizeof(struct cpl_rx_pkt);
2121 cpl = qs->lro_va = sd->pg_chunk.va + 2; 2121 cpl = qs->lro_va = sd->pg_chunk.va + 2;
2122 2122
2123 if ((pi->rx_offload & T3_RX_CSUM) && 2123 if ((qs->netdev->features & NETIF_F_RXCSUM) &&
2124 cpl->csum_valid && cpl->csum == htons(0xffff)) { 2124 cpl->csum_valid && cpl->csum == htons(0xffff)) {
2125 skb->ip_summed = CHECKSUM_UNNECESSARY; 2125 skb->ip_summed = CHECKSUM_UNNECESSARY;
2126 qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++; 2126 qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++;
@@ -2285,7 +2285,8 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs,
2285 q->next_holdoff = q->holdoff_tmr; 2285 q->next_holdoff = q->holdoff_tmr;
2286 2286
2287 while (likely(budget_left && is_new_response(r, q))) { 2287 while (likely(budget_left && is_new_response(r, q))) {
2288 int packet_complete, eth, ethpad = 2, lro = qs->lro_enabled; 2288 int packet_complete, eth, ethpad = 2;
2289 int lro = !!(qs->netdev->features & NETIF_F_GRO);
2289 struct sk_buff *skb = NULL; 2290 struct sk_buff *skb = NULL;
2290 u32 len, flags; 2291 u32 len, flags;
2291 __be32 rss_hi, rss_lo; 2292 __be32 rss_hi, rss_lo;