| .. | .. |
|---|
| 27 | 27 | #include <net/tcp.h> |
|---|
| 28 | 28 | #include <net/ipv6.h> |
|---|
| 29 | 29 | #include <net/ip6_checksum.h> |
|---|
| 30 | | -#include <net/busy_poll.h> |
|---|
| 31 | 30 | #include <linux/prefetch.h> |
|---|
| 32 | 31 | #include "bnx2x_cmn.h" |
|---|
| 33 | 32 | #include "bnx2x_init.h" |
|---|
| .. | .. |
|---|
| 505 | 504 | * @len_on_bd: total length of the first packet for the |
|---|
| 506 | 505 | * aggregation. |
|---|
| 507 | 506 | * @pkt_len: length of all segments |
|---|
| 507 | + * @num_of_coalesced_segs: count of segments |
|---|
| 508 | 508 | * |
|---|
| 509 | 509 | * Approximate value of the MSS for this aggregation calculated using |
|---|
| 510 | 510 | * the first packet of it. |
|---|
| .. | .. |
|---|
| 688 | 688 | if (unlikely(gfpflags_allow_blocking(gfp_mask))) |
|---|
| 689 | 689 | return (void *)__get_free_page(gfp_mask); |
|---|
| 690 | 690 | |
|---|
| 691 | | - return netdev_alloc_frag(fp->rx_frag_size); |
|---|
| 691 | + return napi_alloc_frag(fp->rx_frag_size); |
|---|
| 692 | 692 | } |
|---|
| 693 | 693 | |
|---|
| 694 | 694 | return kmalloc(fp->rx_buf_size + NET_SKB_PAD, gfp_mask); |
|---|
| .. | .. |
|---|
| 788 | 788 | BNX2X_ERR("skb_put is about to fail... pad %d len %d rx_buf_size %d\n", |
|---|
| 789 | 789 | pad, len, fp->rx_buf_size); |
|---|
| 790 | 790 | bnx2x_panic(); |
|---|
| 791 | + bnx2x_frag_free(fp, new_data); |
|---|
| 791 | 792 | return; |
|---|
| 792 | 793 | } |
|---|
| 793 | 794 | #endif |
|---|
| .. | .. |
|---|
| 1913 | 1914 | } |
|---|
| 1914 | 1915 | |
|---|
| 1915 | 1916 | u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb, |
|---|
| 1916 | | - struct net_device *sb_dev, |
|---|
| 1917 | | - select_queue_fallback_t fallback) |
|---|
| 1917 | + struct net_device *sb_dev) |
|---|
| 1918 | 1918 | { |
|---|
| 1919 | 1919 | struct bnx2x *bp = netdev_priv(dev); |
|---|
| 1920 | 1920 | |
|---|
| .. | .. |
|---|
| 1936 | 1936 | } |
|---|
| 1937 | 1937 | |
|---|
| 1938 | 1938 | /* select a non-FCoE queue */ |
|---|
| 1939 | | - return fallback(dev, skb, NULL) % (BNX2X_NUM_ETH_QUEUES(bp)); |
|---|
| 1939 | + return netdev_pick_tx(dev, skb, NULL) % |
|---|
| 1940 | + (BNX2X_NUM_ETH_QUEUES(bp) * bp->max_cos); |
|---|
| 1940 | 1941 | } |
|---|
| 1941 | 1942 | |
|---|
| 1942 | 1943 | void bnx2x_set_num_queues(struct bnx2x *bp) |
|---|
| .. | .. |
|---|
| 1959 | 1960 | * bnx2x_set_real_num_queues - configure netdev->real_num_[tx,rx]_queues |
|---|
| 1960 | 1961 | * |
|---|
| 1961 | 1962 | * @bp: Driver handle |
|---|
| 1963 | + * @include_cnic: handle cnic case |
|---|
| 1962 | 1964 | * |
|---|
| 1963 | 1965 | * We currently support for at most 16 Tx queues for each CoS thus we will |
|---|
| 1964 | 1966 | * allocate a multiple of 16 for ETH L2 rings according to the value of the |
|---|
| .. | .. |
|---|
| 2362 | 2364 | /* is another pf loaded on this engine? */ |
|---|
| 2363 | 2365 | if (load_code != FW_MSG_CODE_DRV_LOAD_COMMON_CHIP && |
|---|
| 2364 | 2366 | load_code != FW_MSG_CODE_DRV_LOAD_COMMON) { |
|---|
| 2365 | | - /* build my FW version dword */ |
|---|
| 2366 | | - u32 my_fw = (BCM_5710_FW_MAJOR_VERSION) + |
|---|
| 2367 | | - (BCM_5710_FW_MINOR_VERSION << 8) + |
|---|
| 2368 | | - (BCM_5710_FW_REVISION_VERSION << 16) + |
|---|
| 2369 | | - (BCM_5710_FW_ENGINEERING_VERSION << 24); |
|---|
| 2367 | + u8 loaded_fw_major, loaded_fw_minor, loaded_fw_rev, loaded_fw_eng; |
|---|
| 2368 | + u32 loaded_fw; |
|---|
| 2370 | 2369 | |
|---|
| 2371 | 2370 | /* read loaded FW from chip */ |
|---|
| 2372 | | - u32 loaded_fw = REG_RD(bp, XSEM_REG_PRAM); |
|---|
| 2371 | + loaded_fw = REG_RD(bp, XSEM_REG_PRAM); |
|---|
| 2373 | 2372 | |
|---|
| 2374 | | - DP(BNX2X_MSG_SP, "loaded fw %x, my fw %x\n", |
|---|
| 2375 | | - loaded_fw, my_fw); |
|---|
| 2373 | + loaded_fw_major = loaded_fw & 0xff; |
|---|
| 2374 | + loaded_fw_minor = (loaded_fw >> 8) & 0xff; |
|---|
| 2375 | + loaded_fw_rev = (loaded_fw >> 16) & 0xff; |
|---|
| 2376 | + loaded_fw_eng = (loaded_fw >> 24) & 0xff; |
|---|
| 2377 | + |
|---|
| 2378 | + DP(BNX2X_MSG_SP, "loaded fw 0x%x major 0x%x minor 0x%x rev 0x%x eng 0x%x\n", |
|---|
| 2379 | + loaded_fw, loaded_fw_major, loaded_fw_minor, loaded_fw_rev, loaded_fw_eng); |
|---|
| 2376 | 2380 | |
|---|
| 2377 | 2381 | /* abort nic load if version mismatch */ |
|---|
| 2378 | | - if (my_fw != loaded_fw) { |
|---|
| 2382 | + if (loaded_fw_major != BCM_5710_FW_MAJOR_VERSION || |
|---|
| 2383 | + loaded_fw_minor != BCM_5710_FW_MINOR_VERSION || |
|---|
| 2384 | + loaded_fw_eng != BCM_5710_FW_ENGINEERING_VERSION || |
|---|
| 2385 | + loaded_fw_rev < BCM_5710_FW_REVISION_VERSION_V15) { |
|---|
| 2379 | 2386 | if (print_err) |
|---|
| 2380 | | - BNX2X_ERR("bnx2x with FW %x was already loaded which mismatches my %x FW. Aborting\n", |
|---|
| 2381 | | - loaded_fw, my_fw); |
|---|
| 2387 | + BNX2X_ERR("loaded FW incompatible. Aborting\n"); |
|---|
| 2382 | 2388 | else |
|---|
| 2383 | | - BNX2X_DEV_INFO("bnx2x with FW %x was already loaded which mismatches my %x FW, possibly due to MF UNDI\n", |
|---|
| 2384 | | - loaded_fw, my_fw); |
|---|
| 2389 | + BNX2X_DEV_INFO("loaded FW incompatible, possibly due to MF UNDI\n"); |
|---|
| 2390 | + |
|---|
| 2385 | 2391 | return -EBUSY; |
|---|
| 2386 | 2392 | } |
|---|
| 2387 | 2393 | } |
|---|
| .. | .. |
|---|
| 2846 | 2852 | bnx2x_set_rx_mode_inner(bp); |
|---|
| 2847 | 2853 | |
|---|
| 2848 | 2854 | if (bp->flags & PTP_SUPPORTED) { |
|---|
| 2855 | + bnx2x_register_phc(bp); |
|---|
| 2849 | 2856 | bnx2x_init_ptp(bp); |
|---|
| 2850 | 2857 | bnx2x_configure_ptp_filters(bp); |
|---|
| 2851 | 2858 | } |
|---|
| .. | .. |
|---|
| 4173 | 4180 | |
|---|
| 4174 | 4181 | DOORBELL_RELAXED(bp, txdata->cid, txdata->tx_db.raw); |
|---|
| 4175 | 4182 | |
|---|
| 4176 | | - mmiowb(); |
|---|
| 4177 | | - |
|---|
| 4178 | 4183 | txdata->tx_bd_prod += nbd; |
|---|
| 4179 | 4184 | |
|---|
| 4180 | 4185 | if (unlikely(bnx2x_tx_avail(bp, txdata) < MAX_DESC_PER_TX_PKT)) { |
|---|
| .. | .. |
|---|
| 4232 | 4237 | /** |
|---|
| 4233 | 4238 | * bnx2x_setup_tc - routine to configure net_device for multi tc |
|---|
| 4234 | 4239 | * |
|---|
| 4235 | | - * @netdev: net device to configure |
|---|
| 4236 | | - * @tc: number of traffic classes to enable |
|---|
| 4240 | + * @dev: net device to configure |
|---|
| 4241 | + * @num_tc: number of traffic classes to enable |
|---|
| 4237 | 4242 | * |
|---|
| 4238 | 4243 | * callback connected to the ndo_setup_tc function pointer |
|---|
| 4239 | 4244 | */ |
|---|
| .. | .. |
|---|
| 4973 | 4978 | return 0; |
|---|
| 4974 | 4979 | } |
|---|
| 4975 | 4980 | |
|---|
| 4976 | | -void bnx2x_tx_timeout(struct net_device *dev) |
|---|
| 4981 | +void bnx2x_tx_timeout(struct net_device *dev, unsigned int txqueue) |
|---|
| 4977 | 4982 | { |
|---|
| 4978 | 4983 | struct bnx2x *bp = netdev_priv(dev); |
|---|
| 4979 | 4984 | |
|---|
| .. | .. |
|---|
| 4991 | 4996 | bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_TX_TIMEOUT, 0); |
|---|
| 4992 | 4997 | } |
|---|
| 4993 | 4998 | |
|---|
| 4994 | | -int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state) |
|---|
| 4999 | +static int __maybe_unused bnx2x_suspend(struct device *dev_d) |
|---|
| 4995 | 5000 | { |
|---|
| 5001 | + struct pci_dev *pdev = to_pci_dev(dev_d); |
|---|
| 4996 | 5002 | struct net_device *dev = pci_get_drvdata(pdev); |
|---|
| 4997 | 5003 | struct bnx2x *bp; |
|---|
| 4998 | 5004 | |
|---|
| .. | .. |
|---|
| 5004 | 5010 | |
|---|
| 5005 | 5011 | rtnl_lock(); |
|---|
| 5006 | 5012 | |
|---|
| 5007 | | - pci_save_state(pdev); |
|---|
| 5008 | | - |
|---|
| 5009 | 5013 | if (!netif_running(dev)) { |
|---|
| 5010 | 5014 | rtnl_unlock(); |
|---|
| 5011 | 5015 | return 0; |
|---|
| .. | .. |
|---|
| 5015 | 5019 | |
|---|
| 5016 | 5020 | bnx2x_nic_unload(bp, UNLOAD_CLOSE, false); |
|---|
| 5017 | 5021 | |
|---|
| 5018 | | - bnx2x_set_power_state(bp, pci_choose_state(pdev, state)); |
|---|
| 5019 | | - |
|---|
| 5020 | 5022 | rtnl_unlock(); |
|---|
| 5021 | 5023 | |
|---|
| 5022 | 5024 | return 0; |
|---|
| 5023 | 5025 | } |
|---|
| 5024 | 5026 | |
|---|
| 5025 | | -int bnx2x_resume(struct pci_dev *pdev) |
|---|
| 5027 | +static int __maybe_unused bnx2x_resume(struct device *dev_d) |
|---|
| 5026 | 5028 | { |
|---|
| 5029 | + struct pci_dev *pdev = to_pci_dev(dev_d); |
|---|
| 5027 | 5030 | struct net_device *dev = pci_get_drvdata(pdev); |
|---|
| 5028 | 5031 | struct bnx2x *bp; |
|---|
| 5029 | 5032 | int rc; |
|---|
| .. | .. |
|---|
| 5041 | 5044 | |
|---|
| 5042 | 5045 | rtnl_lock(); |
|---|
| 5043 | 5046 | |
|---|
| 5044 | | - pci_restore_state(pdev); |
|---|
| 5045 | | - |
|---|
| 5046 | 5047 | if (!netif_running(dev)) { |
|---|
| 5047 | 5048 | rtnl_unlock(); |
|---|
| 5048 | 5049 | return 0; |
|---|
| 5049 | 5050 | } |
|---|
| 5050 | 5051 | |
|---|
| 5051 | | - bnx2x_set_power_state(bp, PCI_D0); |
|---|
| 5052 | 5052 | netif_device_attach(dev); |
|---|
| 5053 | 5053 | |
|---|
| 5054 | 5054 | rc = bnx2x_nic_load(bp, LOAD_OPEN); |
|---|
| .. | .. |
|---|
| 5058 | 5058 | return rc; |
|---|
| 5059 | 5059 | } |
|---|
| 5060 | 5060 | |
|---|
| 5061 | +SIMPLE_DEV_PM_OPS(bnx2x_pm_ops, bnx2x_suspend, bnx2x_resume); |
|---|
| 5062 | + |
|---|
| 5061 | 5063 | void bnx2x_set_ctx_validation(struct bnx2x *bp, struct eth_context *cxt, |
|---|
| 5062 | 5064 | u32 cid) |
|---|
| 5063 | 5065 | { |
|---|