.. | .. |
---|
70 | 70 | #include <net/tcp.h> |
---|
71 | 71 | #include <asm/byteorder.h> |
---|
72 | 72 | #include <asm/processor.h> |
---|
73 | | -#include <net/busy_poll.h> |
---|
74 | 73 | |
---|
75 | 74 | #include "myri10ge_mcp.h" |
---|
76 | 75 | #include "myri10ge_mcp_gen_header.h" |
---|
.. | .. |
---|
1175 | 1174 | mb(); |
---|
1176 | 1175 | } |
---|
1177 | 1176 | |
---|
1178 | | -static inline void myri10ge_vlan_ip_csum(struct sk_buff *skb, __wsum hw_csum) |
---|
1179 | | -{ |
---|
1180 | | - struct vlan_hdr *vh = (struct vlan_hdr *)(skb->data); |
---|
1181 | | - |
---|
1182 | | - if ((skb->protocol == htons(ETH_P_8021Q)) && |
---|
1183 | | - (vh->h_vlan_encapsulated_proto == htons(ETH_P_IP) || |
---|
1184 | | - vh->h_vlan_encapsulated_proto == htons(ETH_P_IPV6))) { |
---|
1185 | | - skb->csum = hw_csum; |
---|
1186 | | - skb->ip_summed = CHECKSUM_COMPLETE; |
---|
1187 | | - } |
---|
1188 | | -} |
---|
1189 | | - |
---|
1190 | 1177 | static void |
---|
1191 | 1178 | myri10ge_alloc_rx_pages(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx, |
---|
1192 | 1179 | int bytes, int watchdog) |
---|
.. | .. |
---|
1287 | 1274 | { |
---|
1288 | 1275 | u8 *va; |
---|
1289 | 1276 | struct vlan_ethhdr *veh; |
---|
1290 | | - struct skb_frag_struct *frag; |
---|
| 1277 | + skb_frag_t *frag; |
---|
1291 | 1278 | __wsum vsum; |
---|
1292 | 1279 | |
---|
1293 | 1280 | va = addr; |
---|
.. | .. |
---|
1307 | 1294 | skb->len -= VLAN_HLEN; |
---|
1308 | 1295 | skb->data_len -= VLAN_HLEN; |
---|
1309 | 1296 | frag = skb_shinfo(skb)->frags; |
---|
1310 | | - frag->page_offset += VLAN_HLEN; |
---|
1311 | | - skb_frag_size_set(frag, skb_frag_size(frag) - VLAN_HLEN); |
---|
| 1297 | + skb_frag_off_add(frag, VLAN_HLEN); |
---|
| 1298 | + skb_frag_size_sub(frag, VLAN_HLEN); |
---|
1312 | 1299 | } |
---|
1313 | 1300 | } |
---|
1314 | 1301 | |
---|
.. | .. |
---|
1319 | 1306 | { |
---|
1320 | 1307 | struct myri10ge_priv *mgp = ss->mgp; |
---|
1321 | 1308 | struct sk_buff *skb; |
---|
1322 | | - struct skb_frag_struct *rx_frags; |
---|
| 1309 | + skb_frag_t *rx_frags; |
---|
1323 | 1310 | struct myri10ge_rx_buf *rx; |
---|
1324 | 1311 | int i, idx, remainder, bytes; |
---|
1325 | 1312 | struct pci_dev *pdev = mgp->pdev; |
---|
.. | .. |
---|
1352 | 1339 | return 0; |
---|
1353 | 1340 | } |
---|
1354 | 1341 | rx_frags = skb_shinfo(skb)->frags; |
---|
1355 | | - /* Fill skb_frag_struct(s) with data from our receive */ |
---|
| 1342 | + /* Fill skb_frag_t(s) with data from our receive */ |
---|
1356 | 1343 | for (i = 0, remainder = len; remainder > 0; i++) { |
---|
1357 | 1344 | myri10ge_unmap_rx_page(pdev, &rx->info[idx], bytes); |
---|
1358 | 1345 | skb_fill_page_desc(skb, i, rx->info[idx].page, |
---|
.. | .. |
---|
1365 | 1352 | } |
---|
1366 | 1353 | |
---|
1367 | 1354 | /* remove padding */ |
---|
1368 | | - rx_frags[0].page_offset += MXGEFW_PAD; |
---|
1369 | | - rx_frags[0].size -= MXGEFW_PAD; |
---|
| 1355 | + skb_frag_off_add(&rx_frags[0], MXGEFW_PAD); |
---|
| 1356 | + skb_frag_size_sub(&rx_frags[0], MXGEFW_PAD); |
---|
1370 | 1357 | len -= MXGEFW_PAD; |
---|
1371 | 1358 | |
---|
1372 | 1359 | skb->len = len; |
---|
.. | .. |
---|
1409 | 1396 | if (skb) { |
---|
1410 | 1397 | ss->stats.tx_bytes += skb->len; |
---|
1411 | 1398 | ss->stats.tx_packets++; |
---|
1412 | | - dev_kfree_skb_irq(skb); |
---|
| 1399 | + dev_consume_skb_irq(skb); |
---|
1413 | 1400 | if (len) |
---|
1414 | 1401 | pci_unmap_single(pdev, |
---|
1415 | 1402 | dma_unmap_addr(&tx->info[idx], |
---|
.. | .. |
---|
1440 | 1427 | tx->queue_active = 0; |
---|
1441 | 1428 | put_be32(htonl(1), tx->send_stop); |
---|
1442 | 1429 | mb(); |
---|
1443 | | - mmiowb(); |
---|
1444 | 1430 | } |
---|
1445 | 1431 | __netif_tx_unlock(dev_queue); |
---|
1446 | 1432 | } |
---|
.. | .. |
---|
1922 | 1908 | } |
---|
1923 | 1909 | |
---|
1924 | 1910 | static const struct ethtool_ops myri10ge_ethtool_ops = { |
---|
| 1911 | + .supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS, |
---|
1925 | 1912 | .get_drvinfo = myri10ge_get_drvinfo, |
---|
1926 | 1913 | .get_coalesce = myri10ge_get_coalesce, |
---|
1927 | 1914 | .set_coalesce = myri10ge_set_coalesce, |
---|
.. | .. |
---|
2630 | 2617 | struct myri10ge_slice_state *ss; |
---|
2631 | 2618 | struct mcp_kreq_ether_send *req; |
---|
2632 | 2619 | struct myri10ge_tx_buf *tx; |
---|
2633 | | - struct skb_frag_struct *frag; |
---|
| 2620 | + skb_frag_t *frag; |
---|
2634 | 2621 | struct netdev_queue *netdev_queue; |
---|
2635 | 2622 | dma_addr_t bus; |
---|
2636 | 2623 | u32 low; |
---|
.. | .. |
---|
2862 | 2849 | tx->queue_active = 1; |
---|
2863 | 2850 | put_be32(htonl(1), tx->send_go); |
---|
2864 | 2851 | mb(); |
---|
2865 | | - mmiowb(); |
---|
2866 | 2852 | } |
---|
2867 | 2853 | tx->pkt_start++; |
---|
2868 | 2854 | if ((avail - count) < MXGEFW_MAX_SEND_DESC) { |
---|
.. | .. |
---|
2895 | 2881 | static netdev_tx_t myri10ge_sw_tso(struct sk_buff *skb, |
---|
2896 | 2882 | struct net_device *dev) |
---|
2897 | 2883 | { |
---|
2898 | | - struct sk_buff *segs, *curr; |
---|
| 2884 | + struct sk_buff *segs, *curr, *next; |
---|
2899 | 2885 | struct myri10ge_priv *mgp = netdev_priv(dev); |
---|
2900 | 2886 | struct myri10ge_slice_state *ss; |
---|
2901 | 2887 | netdev_tx_t status; |
---|
.. | .. |
---|
2904 | 2890 | if (IS_ERR(segs)) |
---|
2905 | 2891 | goto drop; |
---|
2906 | 2892 | |
---|
2907 | | - while (segs) { |
---|
2908 | | - curr = segs; |
---|
2909 | | - segs = segs->next; |
---|
2910 | | - curr->next = NULL; |
---|
| 2893 | + skb_list_walk_safe(segs, curr, next) { |
---|
| 2894 | + skb_mark_not_on_list(curr); |
---|
2911 | 2895 | status = myri10ge_xmit(curr, dev); |
---|
2912 | 2896 | if (status != 0) { |
---|
2913 | 2897 | dev_kfree_skb_any(curr); |
---|
2914 | | - if (segs != NULL) { |
---|
2915 | | - curr = segs; |
---|
2916 | | - segs = segs->next; |
---|
| 2898 | + skb_list_walk_safe(next, curr, next) { |
---|
2917 | 2899 | curr->next = NULL; |
---|
2918 | | - dev_kfree_skb_any(segs); |
---|
| 2900 | + dev_kfree_skb_any(curr); |
---|
2919 | 2901 | } |
---|
2920 | 2902 | goto drop; |
---|
2921 | 2903 | } |
---|
.. | .. |
---|
3040 | 3022 | static int myri10ge_change_mtu(struct net_device *dev, int new_mtu) |
---|
3041 | 3023 | { |
---|
3042 | 3024 | struct myri10ge_priv *mgp = netdev_priv(dev); |
---|
3043 | | - int error = 0; |
---|
3044 | 3025 | |
---|
3045 | 3026 | netdev_info(dev, "changing mtu from %d to %d\n", dev->mtu, new_mtu); |
---|
3046 | 3027 | if (mgp->running) { |
---|
.. | .. |
---|
3052 | 3033 | } else |
---|
3053 | 3034 | dev->mtu = new_mtu; |
---|
3054 | 3035 | |
---|
3055 | | - return error; |
---|
| 3036 | + return 0; |
---|
3056 | 3037 | } |
---|
3057 | 3038 | |
---|
3058 | 3039 | /* |
---|
.. | .. |
---|
3274 | 3255 | } |
---|
3275 | 3256 | } |
---|
3276 | 3257 | |
---|
3277 | | -#ifdef CONFIG_PM |
---|
3278 | | -static int myri10ge_suspend(struct pci_dev *pdev, pm_message_t state) |
---|
| 3258 | +static int __maybe_unused myri10ge_suspend(struct device *dev) |
---|
3279 | 3259 | { |
---|
3280 | 3260 | struct myri10ge_priv *mgp; |
---|
3281 | 3261 | struct net_device *netdev; |
---|
3282 | 3262 | |
---|
3283 | | - mgp = pci_get_drvdata(pdev); |
---|
| 3263 | + mgp = dev_get_drvdata(dev); |
---|
3284 | 3264 | if (mgp == NULL) |
---|
3285 | 3265 | return -EINVAL; |
---|
3286 | 3266 | netdev = mgp->dev; |
---|
.. | .. |
---|
3293 | 3273 | rtnl_unlock(); |
---|
3294 | 3274 | } |
---|
3295 | 3275 | myri10ge_dummy_rdma(mgp, 0); |
---|
3296 | | - pci_save_state(pdev); |
---|
3297 | | - pci_disable_device(pdev); |
---|
3298 | 3276 | |
---|
3299 | | - return pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
---|
| 3277 | + return 0; |
---|
3300 | 3278 | } |
---|
3301 | 3279 | |
---|
3302 | | -static int myri10ge_resume(struct pci_dev *pdev) |
---|
| 3280 | +static int __maybe_unused myri10ge_resume(struct device *dev) |
---|
3303 | 3281 | { |
---|
| 3282 | + struct pci_dev *pdev = to_pci_dev(dev); |
---|
3304 | 3283 | struct myri10ge_priv *mgp; |
---|
3305 | 3284 | struct net_device *netdev; |
---|
3306 | 3285 | int status; |
---|
.. | .. |
---|
3310 | 3289 | if (mgp == NULL) |
---|
3311 | 3290 | return -EINVAL; |
---|
3312 | 3291 | netdev = mgp->dev; |
---|
3313 | | - pci_set_power_state(pdev, PCI_D0); /* zeros conf space as a side effect */ |
---|
3314 | 3292 | msleep(5); /* give card time to respond */ |
---|
3315 | 3293 | pci_read_config_word(mgp->pdev, PCI_VENDOR_ID, &vendor); |
---|
3316 | 3294 | if (vendor == 0xffff) { |
---|
.. | .. |
---|
3318 | 3296 | return -EIO; |
---|
3319 | 3297 | } |
---|
3320 | 3298 | |
---|
3321 | | - pci_restore_state(pdev); |
---|
3322 | | - |
---|
3323 | | - status = pci_enable_device(pdev); |
---|
3324 | | - if (status) { |
---|
3325 | | - dev_err(&pdev->dev, "failed to enable device\n"); |
---|
3326 | | - return status; |
---|
3327 | | - } |
---|
3328 | | - |
---|
3329 | | - pci_set_master(pdev); |
---|
3330 | | - |
---|
3331 | 3299 | myri10ge_reset(mgp); |
---|
3332 | 3300 | myri10ge_dummy_rdma(mgp, 1); |
---|
3333 | | - |
---|
3334 | | - /* Save configuration space to be restored if the |
---|
3335 | | - * nic resets due to a parity error */ |
---|
3336 | | - pci_save_state(pdev); |
---|
3337 | 3301 | |
---|
3338 | 3302 | if (netif_running(netdev)) { |
---|
3339 | 3303 | rtnl_lock(); |
---|
.. | .. |
---|
3348 | 3312 | return 0; |
---|
3349 | 3313 | |
---|
3350 | 3314 | abort_with_enabled: |
---|
3351 | | - pci_disable_device(pdev); |
---|
3352 | 3315 | return -EIO; |
---|
3353 | | - |
---|
3354 | 3316 | } |
---|
3355 | | -#endif /* CONFIG_PM */ |
---|
3356 | 3317 | |
---|
3357 | 3318 | static u32 myri10ge_read_reboot(struct myri10ge_priv *mgp) |
---|
3358 | 3319 | { |
---|
.. | .. |
---|
3580 | 3541 | ss->fw_stats, ss->fw_stats_bus); |
---|
3581 | 3542 | ss->fw_stats = NULL; |
---|
3582 | 3543 | } |
---|
3583 | | - napi_hash_del(&ss->napi); |
---|
3584 | | - netif_napi_del(&ss->napi); |
---|
| 3544 | + __netif_napi_del(&ss->napi); |
---|
3585 | 3545 | } |
---|
3586 | 3546 | /* Wait till napi structs are no longer used, and then free ss. */ |
---|
3587 | | - synchronize_rcu(); |
---|
| 3547 | + synchronize_net(); |
---|
3588 | 3548 | kfree(mgp->ss); |
---|
3589 | 3549 | mgp->ss = NULL; |
---|
3590 | 3550 | } |
---|
.. | .. |
---|
3605 | 3565 | for (i = 0; i < mgp->num_slices; i++) { |
---|
3606 | 3566 | ss = &mgp->ss[i]; |
---|
3607 | 3567 | bytes = mgp->max_intr_slots * sizeof(*ss->rx_done.entry); |
---|
3608 | | - ss->rx_done.entry = dma_zalloc_coherent(&pdev->dev, bytes, |
---|
3609 | | - &ss->rx_done.bus, |
---|
3610 | | - GFP_KERNEL); |
---|
| 3568 | + ss->rx_done.entry = dma_alloc_coherent(&pdev->dev, bytes, |
---|
| 3569 | + &ss->rx_done.bus, |
---|
| 3570 | + GFP_KERNEL); |
---|
3611 | 3571 | if (ss->rx_done.entry == NULL) |
---|
3612 | 3572 | goto abort; |
---|
3613 | 3573 | bytes = sizeof(*ss->fw_stats); |
---|
.. | .. |
---|
3960 | 3920 | myri10ge_free_slices(mgp); |
---|
3961 | 3921 | |
---|
3962 | 3922 | abort_with_firmware: |
---|
| 3923 | + kfree(mgp->msix_vectors); |
---|
3963 | 3924 | myri10ge_dummy_rdma(mgp, 0); |
---|
3964 | 3925 | |
---|
3965 | 3926 | abort_with_ioremap: |
---|
.. | .. |
---|
4035 | 3996 | |
---|
4036 | 3997 | MODULE_DEVICE_TABLE(pci, myri10ge_pci_tbl); |
---|
4037 | 3998 | |
---|
| 3999 | +static SIMPLE_DEV_PM_OPS(myri10ge_pm_ops, myri10ge_suspend, myri10ge_resume); |
---|
| 4000 | + |
---|
4038 | 4001 | static struct pci_driver myri10ge_driver = { |
---|
4039 | 4002 | .name = "myri10ge", |
---|
4040 | 4003 | .probe = myri10ge_probe, |
---|
4041 | 4004 | .remove = myri10ge_remove, |
---|
4042 | 4005 | .id_table = myri10ge_pci_tbl, |
---|
4043 | | -#ifdef CONFIG_PM |
---|
4044 | | - .suspend = myri10ge_suspend, |
---|
4045 | | - .resume = myri10ge_resume, |
---|
4046 | | -#endif |
---|
| 4006 | + .driver.pm = &myri10ge_pm_ops, |
---|
4047 | 4007 | }; |
---|
4048 | 4008 | |
---|
4049 | 4009 | #ifdef CONFIG_MYRI10GE_DCA |
---|