| .. | .. |
|---|
| 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 |
|---|