diff options
author | Michał Mirosław <mirq-linux@rere.qmqm.pl> | 2011-04-16 20:15:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-04-17 20:40:25 -0400 |
commit | d2fe2755342b30bc1ee7797b9975f8626d65e485 (patch) | |
tree | 7ca1dc1ef596d1f379371abccc4a2f135f6c3a23 | |
parent | 391876466670988196786150fc9d9da2f3c7cecb (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.h | 7 | ||||
-rw-r--r-- | drivers/net/cxgb3/common.h | 1 | ||||
-rw-r--r-- | drivers/net/cxgb3/cxgb3_main.c | 78 | ||||
-rw-r--r-- | drivers/net/cxgb3/sge.c | 7 |
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; | |||
50 | struct sge_qset; | 50 | struct sge_qset; |
51 | struct port_info; | 51 | struct port_info; |
52 | 52 | ||
53 | enum { /* rx_offload flags */ | ||
54 | T3_RX_CSUM = 1 << 0, | ||
55 | T3_LRO = 1 << 1, | ||
56 | }; | ||
57 | |||
58 | enum mac_idx_types { | 53 | enum 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 | ||
318 | struct qset_params { /* SGE queue set parameters */ | 318 | struct 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 | */ | ||
657 | static 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 | ||
1913 | static 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 | |||
1920 | static 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 | |||
1936 | static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e) | 1892 | static 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 | ||
2123 | static int in_range(int val, int lo, int hi) | 2074 | 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 | 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; |