| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (C) 2005 - 2016 Broadcom |
|---|
| 3 | 4 | * All rights reserved. |
|---|
| 4 | | - * |
|---|
| 5 | | - * This program is free software; you can redistribute it and/or |
|---|
| 6 | | - * modify it under the terms of the GNU General Public License version 2 |
|---|
| 7 | | - * as published by the Free Software Foundation. The full GNU General |
|---|
| 8 | | - * Public License is included in this distribution in the file called COPYING. |
|---|
| 9 | 5 | * |
|---|
| 10 | 6 | * Contact Information: |
|---|
| 11 | 7 | * linux-drivers@emulex.com |
|---|
| .. | .. |
|---|
| 25 | 21 | #include <net/busy_poll.h> |
|---|
| 26 | 22 | #include <net/vxlan.h> |
|---|
| 27 | 23 | |
|---|
| 28 | | -MODULE_VERSION(DRV_VER); |
|---|
| 29 | | -MODULE_DESCRIPTION(DRV_DESC " " DRV_VER); |
|---|
| 24 | +MODULE_DESCRIPTION(DRV_DESC); |
|---|
| 30 | 25 | MODULE_AUTHOR("Emulex Corporation"); |
|---|
| 31 | 26 | MODULE_LICENSE("GPL"); |
|---|
| 32 | 27 | |
|---|
| .. | .. |
|---|
| 167 | 162 | q->len = len; |
|---|
| 168 | 163 | q->entry_size = entry_size; |
|---|
| 169 | 164 | mem->size = len * entry_size; |
|---|
| 170 | | - mem->va = dma_zalloc_coherent(&adapter->pdev->dev, mem->size, &mem->dma, |
|---|
| 171 | | - GFP_KERNEL); |
|---|
| 165 | + mem->va = dma_alloc_coherent(&adapter->pdev->dev, mem->size, |
|---|
| 166 | + &mem->dma, GFP_KERNEL); |
|---|
| 172 | 167 | if (!mem->va) |
|---|
| 173 | 168 | return -ENOMEM; |
|---|
| 174 | 169 | return 0; |
|---|
| .. | .. |
|---|
| 796 | 791 | u16 vlan_tag; |
|---|
| 797 | 792 | |
|---|
| 798 | 793 | vlan_tag = skb_vlan_tag_get(skb); |
|---|
| 799 | | - vlan_prio = (vlan_tag & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT; |
|---|
| 794 | + vlan_prio = skb_vlan_tag_get_prio(skb); |
|---|
| 800 | 795 | /* If vlan priority provided by OS is NOT in available bmap */ |
|---|
| 801 | 796 | if (!(adapter->vlan_prio_bmap & (1 << vlan_prio))) |
|---|
| 802 | 797 | vlan_tag = (vlan_tag & ~VLAN_PRIO_MASK) | |
|---|
| .. | .. |
|---|
| 1018 | 1013 | } |
|---|
| 1019 | 1014 | |
|---|
| 1020 | 1015 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
|---|
| 1021 | | - const struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i]; |
|---|
| 1016 | + const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
|---|
| 1022 | 1017 | len = skb_frag_size(frag); |
|---|
| 1023 | 1018 | |
|---|
| 1024 | 1019 | busaddr = skb_frag_dma_map(dev, frag, 0, len, DMA_TO_DEVICE); |
|---|
| .. | .. |
|---|
| 1049 | 1044 | struct be_wrb_params |
|---|
| 1050 | 1045 | *wrb_params) |
|---|
| 1051 | 1046 | { |
|---|
| 1047 | + bool insert_vlan = false; |
|---|
| 1052 | 1048 | u16 vlan_tag = 0; |
|---|
| 1053 | 1049 | |
|---|
| 1054 | 1050 | skb = skb_share_check(skb, GFP_ATOMIC); |
|---|
| 1055 | 1051 | if (unlikely(!skb)) |
|---|
| 1056 | 1052 | return skb; |
|---|
| 1057 | 1053 | |
|---|
| 1058 | | - if (skb_vlan_tag_present(skb)) |
|---|
| 1054 | + if (skb_vlan_tag_present(skb)) { |
|---|
| 1059 | 1055 | vlan_tag = be_get_tx_vlan_tag(adapter, skb); |
|---|
| 1056 | + insert_vlan = true; |
|---|
| 1057 | + } |
|---|
| 1060 | 1058 | |
|---|
| 1061 | 1059 | if (qnq_async_evt_rcvd(adapter) && adapter->pvid) { |
|---|
| 1062 | | - if (!vlan_tag) |
|---|
| 1060 | + if (!insert_vlan) { |
|---|
| 1063 | 1061 | vlan_tag = adapter->pvid; |
|---|
| 1062 | + insert_vlan = true; |
|---|
| 1063 | + } |
|---|
| 1064 | 1064 | /* f/w workaround to set skip_hw_vlan = 1, informs the F/W to |
|---|
| 1065 | 1065 | * skip VLAN insertion |
|---|
| 1066 | 1066 | */ |
|---|
| 1067 | 1067 | BE_WRB_F_SET(wrb_params->features, VLAN_SKIP_HW, 1); |
|---|
| 1068 | 1068 | } |
|---|
| 1069 | 1069 | |
|---|
| 1070 | | - if (vlan_tag) { |
|---|
| 1070 | + if (insert_vlan) { |
|---|
| 1071 | 1071 | skb = vlan_insert_tag_set_proto(skb, htons(ETH_P_8021Q), |
|---|
| 1072 | 1072 | vlan_tag); |
|---|
| 1073 | 1073 | if (unlikely(!skb)) |
|---|
| 1074 | 1074 | return skb; |
|---|
| 1075 | | - skb->vlan_tci = 0; |
|---|
| 1075 | + __vlan_hwaccel_clear_tag(skb); |
|---|
| 1076 | 1076 | } |
|---|
| 1077 | 1077 | |
|---|
| 1078 | 1078 | /* Insert the outer VLAN, if any */ |
|---|
| .. | .. |
|---|
| 1136 | 1136 | eth_hdr_len = ntohs(skb->protocol) == ETH_P_8021Q ? |
|---|
| 1137 | 1137 | VLAN_ETH_HLEN : ETH_HLEN; |
|---|
| 1138 | 1138 | if (skb->len <= 60 && |
|---|
| 1139 | | - (lancer_chip(adapter) || skb_vlan_tag_present(skb)) && |
|---|
| 1140 | | - is_ipv4_pkt(skb)) { |
|---|
| 1139 | + (lancer_chip(adapter) || BE3_chip(adapter) || |
|---|
| 1140 | + skb_vlan_tag_present(skb)) && is_ipv4_pkt(skb)) { |
|---|
| 1141 | 1141 | ip = (struct iphdr *)ip_hdr(skb); |
|---|
| 1142 | | - pskb_trim(skb, eth_hdr_len + ntohs(ip->tot_len)); |
|---|
| 1142 | + if (unlikely(pskb_trim(skb, eth_hdr_len + ntohs(ip->tot_len)))) |
|---|
| 1143 | + goto tx_drop; |
|---|
| 1143 | 1144 | } |
|---|
| 1144 | 1145 | |
|---|
| 1145 | 1146 | /* If vlan tag is already inlined in the packet, skip HW VLAN |
|---|
| .. | .. |
|---|
| 1265 | 1266 | #define is_arp_allowed_on_bmc(adapter, skb) \ |
|---|
| 1266 | 1267 | (is_arp(skb) && is_arp_filt_enabled(adapter)) |
|---|
| 1267 | 1268 | |
|---|
| 1268 | | -#define is_broadcast_packet(eh, adapter) \ |
|---|
| 1269 | | - (is_multicast_ether_addr(eh->h_dest) && \ |
|---|
| 1270 | | - !compare_ether_addr(eh->h_dest, adapter->netdev->broadcast)) |
|---|
| 1271 | | - |
|---|
| 1272 | 1269 | #define is_arp(skb) (skb->protocol == htons(ETH_P_ARP)) |
|---|
| 1273 | 1270 | |
|---|
| 1274 | 1271 | #define is_arp_filt_enabled(adapter) \ |
|---|
| .. | .. |
|---|
| 1375 | 1372 | u16 q_idx = skb_get_queue_mapping(skb); |
|---|
| 1376 | 1373 | struct be_tx_obj *txo = &adapter->tx_obj[q_idx]; |
|---|
| 1377 | 1374 | struct be_wrb_params wrb_params = { 0 }; |
|---|
| 1378 | | - bool flush = !skb->xmit_more; |
|---|
| 1375 | + bool flush = !netdev_xmit_more(); |
|---|
| 1379 | 1376 | u16 wrb_cnt; |
|---|
| 1380 | 1377 | |
|---|
| 1381 | 1378 | skb = be_xmit_workarounds(adapter, skb, &wrb_params); |
|---|
| .. | .. |
|---|
| 1420 | 1417 | return NETDEV_TX_OK; |
|---|
| 1421 | 1418 | } |
|---|
| 1422 | 1419 | |
|---|
| 1423 | | -static void be_tx_timeout(struct net_device *netdev) |
|---|
| 1420 | +static void be_tx_timeout(struct net_device *netdev, unsigned int txqueue) |
|---|
| 1424 | 1421 | { |
|---|
| 1425 | 1422 | struct be_adapter *adapter = netdev_priv(netdev); |
|---|
| 1426 | 1423 | struct device *dev = &adapter->pdev->dev; |
|---|
| .. | .. |
|---|
| 2150 | 2147 | int i; |
|---|
| 2151 | 2148 | |
|---|
| 2152 | 2149 | aic = &adapter->aic_obj[eqo->idx]; |
|---|
| 2153 | | - if (!aic->enable) { |
|---|
| 2150 | + if (!adapter->aic_enabled) { |
|---|
| 2154 | 2151 | if (aic->jiffies) |
|---|
| 2155 | 2152 | aic->jiffies = 0; |
|---|
| 2156 | 2153 | eqd = aic->et_eqd; |
|---|
| .. | .. |
|---|
| 2207 | 2204 | int eqd; |
|---|
| 2208 | 2205 | u32 mult_enc; |
|---|
| 2209 | 2206 | |
|---|
| 2210 | | - if (!aic->enable) |
|---|
| 2207 | + if (!adapter->aic_enabled) |
|---|
| 2211 | 2208 | return 0; |
|---|
| 2212 | 2209 | |
|---|
| 2213 | 2210 | if (jiffies_to_msecs(now - aic->jiffies) < 1) |
|---|
| .. | .. |
|---|
| 2349 | 2346 | memcpy(skb->data, start, hdr_len); |
|---|
| 2350 | 2347 | skb_shinfo(skb)->nr_frags = 1; |
|---|
| 2351 | 2348 | skb_frag_set_page(skb, 0, page_info->page); |
|---|
| 2352 | | - skb_shinfo(skb)->frags[0].page_offset = |
|---|
| 2353 | | - page_info->page_offset + hdr_len; |
|---|
| 2349 | + skb_frag_off_set(&skb_shinfo(skb)->frags[0], |
|---|
| 2350 | + page_info->page_offset + hdr_len); |
|---|
| 2354 | 2351 | skb_frag_size_set(&skb_shinfo(skb)->frags[0], |
|---|
| 2355 | 2352 | curr_frag_len - hdr_len); |
|---|
| 2356 | 2353 | skb->data_len = curr_frag_len - hdr_len; |
|---|
| .. | .. |
|---|
| 2375 | 2372 | /* Fresh page */ |
|---|
| 2376 | 2373 | j++; |
|---|
| 2377 | 2374 | skb_frag_set_page(skb, j, page_info->page); |
|---|
| 2378 | | - skb_shinfo(skb)->frags[j].page_offset = |
|---|
| 2379 | | - page_info->page_offset; |
|---|
| 2375 | + skb_frag_off_set(&skb_shinfo(skb)->frags[j], |
|---|
| 2376 | + page_info->page_offset); |
|---|
| 2380 | 2377 | skb_frag_size_set(&skb_shinfo(skb)->frags[j], 0); |
|---|
| 2381 | 2378 | skb_shinfo(skb)->nr_frags++; |
|---|
| 2382 | 2379 | } else { |
|---|
| .. | .. |
|---|
| 2457 | 2454 | /* First frag or Fresh page */ |
|---|
| 2458 | 2455 | j++; |
|---|
| 2459 | 2456 | skb_frag_set_page(skb, j, page_info->page); |
|---|
| 2460 | | - skb_shinfo(skb)->frags[j].page_offset = |
|---|
| 2461 | | - page_info->page_offset; |
|---|
| 2457 | + skb_frag_off_set(&skb_shinfo(skb)->frags[j], |
|---|
| 2458 | + page_info->page_offset); |
|---|
| 2462 | 2459 | skb_frag_size_set(&skb_shinfo(skb)->frags[j], 0); |
|---|
| 2463 | 2460 | } else { |
|---|
| 2464 | 2461 | put_page(page_info->page); |
|---|
| .. | .. |
|---|
| 2962 | 2959 | max(adapter->cfg_num_rx_irqs, |
|---|
| 2963 | 2960 | adapter->cfg_num_tx_irqs)); |
|---|
| 2964 | 2961 | |
|---|
| 2962 | + adapter->aic_enabled = true; |
|---|
| 2963 | + |
|---|
| 2965 | 2964 | for_all_evt_queues(adapter, eqo, i) { |
|---|
| 2966 | 2965 | int numa_node = dev_to_node(&adapter->pdev->dev); |
|---|
| 2967 | 2966 | |
|---|
| .. | .. |
|---|
| 2969 | 2968 | eqo->adapter = adapter; |
|---|
| 2970 | 2969 | eqo->idx = i; |
|---|
| 2971 | 2970 | aic->max_eqd = BE_MAX_EQD; |
|---|
| 2972 | | - aic->enable = true; |
|---|
| 2973 | 2971 | |
|---|
| 2974 | 2972 | eq = &eqo->q; |
|---|
| 2975 | 2973 | rc = be_queue_alloc(adapter, eq, EVNT_Q_LEN, |
|---|
| .. | .. |
|---|
| 3832 | 3830 | be_link_status_update(adapter, link_status); |
|---|
| 3833 | 3831 | |
|---|
| 3834 | 3832 | netif_tx_start_all_queues(netdev); |
|---|
| 3835 | | - if (skyhawk_chip(adapter)) |
|---|
| 3836 | | - udp_tunnel_get_rx_info(netdev); |
|---|
| 3833 | + |
|---|
| 3834 | + udp_tunnel_nic_reset_ntf(netdev); |
|---|
| 3837 | 3835 | |
|---|
| 3838 | 3836 | return 0; |
|---|
| 3839 | 3837 | err: |
|---|
| .. | .. |
|---|
| 3970 | 3968 | } |
|---|
| 3971 | 3969 | } |
|---|
| 3972 | 3970 | |
|---|
| 3973 | | -static int be_enable_vxlan_offloads(struct be_adapter *adapter) |
|---|
| 3971 | +/* VxLAN offload Notes: |
|---|
| 3972 | + * |
|---|
| 3973 | + * The stack defines tunnel offload flags (hw_enc_features) for IP and doesn't |
|---|
| 3974 | + * distinguish various types of transports (VxLAN, GRE, NVGRE ..). So, offload |
|---|
| 3975 | + * is expected to work across all types of IP tunnels once exported. Skyhawk |
|---|
| 3976 | + * supports offloads for either VxLAN or NVGRE, exclusively. So we export VxLAN |
|---|
| 3977 | + * offloads in hw_enc_features only when a VxLAN port is added. If other (non |
|---|
| 3978 | + * VxLAN) tunnels are configured while VxLAN offloads are enabled, offloads for |
|---|
| 3979 | + * those other tunnels are unexported on the fly through ndo_features_check(). |
|---|
| 3980 | + */ |
|---|
| 3981 | +static int be_vxlan_set_port(struct net_device *netdev, unsigned int table, |
|---|
| 3982 | + unsigned int entry, struct udp_tunnel_info *ti) |
|---|
| 3974 | 3983 | { |
|---|
| 3975 | | - struct net_device *netdev = adapter->netdev; |
|---|
| 3984 | + struct be_adapter *adapter = netdev_priv(netdev); |
|---|
| 3976 | 3985 | struct device *dev = &adapter->pdev->dev; |
|---|
| 3977 | | - struct be_vxlan_port *vxlan_port; |
|---|
| 3978 | | - __be16 port; |
|---|
| 3979 | 3986 | int status; |
|---|
| 3980 | | - |
|---|
| 3981 | | - vxlan_port = list_first_entry(&adapter->vxlan_port_list, |
|---|
| 3982 | | - struct be_vxlan_port, list); |
|---|
| 3983 | | - port = vxlan_port->port; |
|---|
| 3984 | 3987 | |
|---|
| 3985 | 3988 | status = be_cmd_manage_iface(adapter, adapter->if_handle, |
|---|
| 3986 | 3989 | OP_CONVERT_NORMAL_TO_TUNNEL); |
|---|
| .. | .. |
|---|
| 3990 | 3993 | } |
|---|
| 3991 | 3994 | adapter->flags |= BE_FLAGS_VXLAN_OFFLOADS; |
|---|
| 3992 | 3995 | |
|---|
| 3993 | | - status = be_cmd_set_vxlan_port(adapter, port); |
|---|
| 3996 | + status = be_cmd_set_vxlan_port(adapter, ti->port); |
|---|
| 3994 | 3997 | if (status) { |
|---|
| 3995 | 3998 | dev_warn(dev, "Failed to add VxLAN port\n"); |
|---|
| 3996 | 3999 | return status; |
|---|
| 3997 | 4000 | } |
|---|
| 3998 | | - adapter->vxlan_port = port; |
|---|
| 4001 | + adapter->vxlan_port = ti->port; |
|---|
| 3999 | 4002 | |
|---|
| 4000 | 4003 | netdev->hw_enc_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | |
|---|
| 4001 | 4004 | NETIF_F_TSO | NETIF_F_TSO6 | |
|---|
| 4002 | 4005 | NETIF_F_GSO_UDP_TUNNEL; |
|---|
| 4003 | 4006 | |
|---|
| 4004 | 4007 | dev_info(dev, "Enabled VxLAN offloads for UDP port %d\n", |
|---|
| 4005 | | - be16_to_cpu(port)); |
|---|
| 4008 | + be16_to_cpu(ti->port)); |
|---|
| 4006 | 4009 | return 0; |
|---|
| 4007 | 4010 | } |
|---|
| 4008 | 4011 | |
|---|
| 4009 | | -static void be_disable_vxlan_offloads(struct be_adapter *adapter) |
|---|
| 4012 | +static int be_vxlan_unset_port(struct net_device *netdev, unsigned int table, |
|---|
| 4013 | + unsigned int entry, struct udp_tunnel_info *ti) |
|---|
| 4010 | 4014 | { |
|---|
| 4011 | | - struct net_device *netdev = adapter->netdev; |
|---|
| 4015 | + struct be_adapter *adapter = netdev_priv(netdev); |
|---|
| 4012 | 4016 | |
|---|
| 4013 | 4017 | if (adapter->flags & BE_FLAGS_VXLAN_OFFLOADS) |
|---|
| 4014 | 4018 | be_cmd_manage_iface(adapter, adapter->if_handle, |
|---|
| .. | .. |
|---|
| 4021 | 4025 | adapter->vxlan_port = 0; |
|---|
| 4022 | 4026 | |
|---|
| 4023 | 4027 | netdev->hw_enc_features = 0; |
|---|
| 4028 | + return 0; |
|---|
| 4024 | 4029 | } |
|---|
| 4030 | + |
|---|
| 4031 | +static const struct udp_tunnel_nic_info be_udp_tunnels = { |
|---|
| 4032 | + .set_port = be_vxlan_set_port, |
|---|
| 4033 | + .unset_port = be_vxlan_unset_port, |
|---|
| 4034 | + .flags = UDP_TUNNEL_NIC_INFO_MAY_SLEEP | |
|---|
| 4035 | + UDP_TUNNEL_NIC_INFO_OPEN_ONLY, |
|---|
| 4036 | + .tables = { |
|---|
| 4037 | + { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_VXLAN, }, |
|---|
| 4038 | + }, |
|---|
| 4039 | +}; |
|---|
| 4025 | 4040 | |
|---|
| 4026 | 4041 | static void be_calculate_vf_res(struct be_adapter *adapter, u16 num_vfs, |
|---|
| 4027 | 4042 | struct be_resources *vft_res) |
|---|
| .. | .. |
|---|
| 4138 | 4153 | &vft_res); |
|---|
| 4139 | 4154 | } |
|---|
| 4140 | 4155 | |
|---|
| 4141 | | - be_disable_vxlan_offloads(adapter); |
|---|
| 4156 | + be_vxlan_unset_port(adapter->netdev, 0, 0, NULL); |
|---|
| 4142 | 4157 | |
|---|
| 4143 | 4158 | be_if_destroy(adapter); |
|---|
| 4144 | 4159 | |
|---|
| .. | .. |
|---|
| 4701 | 4716 | int status; |
|---|
| 4702 | 4717 | |
|---|
| 4703 | 4718 | if (netif_running(netdev)) { |
|---|
| 4719 | + /* be_tx_timeout() must not run concurrently with this |
|---|
| 4720 | + * function, synchronize with an already-running dev_watchdog |
|---|
| 4721 | + */ |
|---|
| 4722 | + netif_tx_lock_bh(netdev); |
|---|
| 4704 | 4723 | /* device cannot transmit now, avoid dev_watchdog timeouts */ |
|---|
| 4705 | 4724 | netif_carrier_off(netdev); |
|---|
| 4725 | + netif_tx_unlock_bh(netdev); |
|---|
| 4706 | 4726 | |
|---|
| 4707 | 4727 | be_close(netdev); |
|---|
| 4708 | 4728 | } |
|---|
| .. | .. |
|---|
| 4954 | 4974 | } |
|---|
| 4955 | 4975 | |
|---|
| 4956 | 4976 | static int be_ndo_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh, |
|---|
| 4957 | | - u16 flags) |
|---|
| 4977 | + u16 flags, struct netlink_ext_ack *extack) |
|---|
| 4958 | 4978 | { |
|---|
| 4959 | 4979 | struct be_adapter *adapter = netdev_priv(dev); |
|---|
| 4960 | 4980 | struct nlattr *attr, *br_spec; |
|---|
| .. | .. |
|---|
| 5049 | 5069 | INIT_WORK(&work->work, func); |
|---|
| 5050 | 5070 | work->adapter = adapter; |
|---|
| 5051 | 5071 | return work; |
|---|
| 5052 | | -} |
|---|
| 5053 | | - |
|---|
| 5054 | | -/* VxLAN offload Notes: |
|---|
| 5055 | | - * |
|---|
| 5056 | | - * The stack defines tunnel offload flags (hw_enc_features) for IP and doesn't |
|---|
| 5057 | | - * distinguish various types of transports (VxLAN, GRE, NVGRE ..). So, offload |
|---|
| 5058 | | - * is expected to work across all types of IP tunnels once exported. Skyhawk |
|---|
| 5059 | | - * supports offloads for either VxLAN or NVGRE, exclusively. So we export VxLAN |
|---|
| 5060 | | - * offloads in hw_enc_features only when a VxLAN port is added. If other (non |
|---|
| 5061 | | - * VxLAN) tunnels are configured while VxLAN offloads are enabled, offloads for |
|---|
| 5062 | | - * those other tunnels are unexported on the fly through ndo_features_check(). |
|---|
| 5063 | | - * |
|---|
| 5064 | | - * Skyhawk supports VxLAN offloads only for one UDP dport. So, if the stack |
|---|
| 5065 | | - * adds more than one port, disable offloads and re-enable them again when |
|---|
| 5066 | | - * there's only one port left. We maintain a list of ports for this purpose. |
|---|
| 5067 | | - */ |
|---|
| 5068 | | -static void be_work_add_vxlan_port(struct work_struct *work) |
|---|
| 5069 | | -{ |
|---|
| 5070 | | - struct be_cmd_work *cmd_work = |
|---|
| 5071 | | - container_of(work, struct be_cmd_work, work); |
|---|
| 5072 | | - struct be_adapter *adapter = cmd_work->adapter; |
|---|
| 5073 | | - struct device *dev = &adapter->pdev->dev; |
|---|
| 5074 | | - __be16 port = cmd_work->info.vxlan_port; |
|---|
| 5075 | | - struct be_vxlan_port *vxlan_port; |
|---|
| 5076 | | - int status; |
|---|
| 5077 | | - |
|---|
| 5078 | | - /* Bump up the alias count if it is an existing port */ |
|---|
| 5079 | | - list_for_each_entry(vxlan_port, &adapter->vxlan_port_list, list) { |
|---|
| 5080 | | - if (vxlan_port->port == port) { |
|---|
| 5081 | | - vxlan_port->port_aliases++; |
|---|
| 5082 | | - goto done; |
|---|
| 5083 | | - } |
|---|
| 5084 | | - } |
|---|
| 5085 | | - |
|---|
| 5086 | | - /* Add a new port to our list. We don't need a lock here since port |
|---|
| 5087 | | - * add/delete are done only in the context of a single-threaded work |
|---|
| 5088 | | - * queue (be_wq). |
|---|
| 5089 | | - */ |
|---|
| 5090 | | - vxlan_port = kzalloc(sizeof(*vxlan_port), GFP_KERNEL); |
|---|
| 5091 | | - if (!vxlan_port) |
|---|
| 5092 | | - goto done; |
|---|
| 5093 | | - |
|---|
| 5094 | | - vxlan_port->port = port; |
|---|
| 5095 | | - INIT_LIST_HEAD(&vxlan_port->list); |
|---|
| 5096 | | - list_add_tail(&vxlan_port->list, &adapter->vxlan_port_list); |
|---|
| 5097 | | - adapter->vxlan_port_count++; |
|---|
| 5098 | | - |
|---|
| 5099 | | - if (adapter->flags & BE_FLAGS_VXLAN_OFFLOADS) { |
|---|
| 5100 | | - dev_info(dev, |
|---|
| 5101 | | - "Only one UDP port supported for VxLAN offloads\n"); |
|---|
| 5102 | | - dev_info(dev, "Disabling VxLAN offloads\n"); |
|---|
| 5103 | | - goto err; |
|---|
| 5104 | | - } |
|---|
| 5105 | | - |
|---|
| 5106 | | - if (adapter->vxlan_port_count > 1) |
|---|
| 5107 | | - goto done; |
|---|
| 5108 | | - |
|---|
| 5109 | | - status = be_enable_vxlan_offloads(adapter); |
|---|
| 5110 | | - if (!status) |
|---|
| 5111 | | - goto done; |
|---|
| 5112 | | - |
|---|
| 5113 | | -err: |
|---|
| 5114 | | - be_disable_vxlan_offloads(adapter); |
|---|
| 5115 | | -done: |
|---|
| 5116 | | - kfree(cmd_work); |
|---|
| 5117 | | - return; |
|---|
| 5118 | | -} |
|---|
| 5119 | | - |
|---|
| 5120 | | -static void be_work_del_vxlan_port(struct work_struct *work) |
|---|
| 5121 | | -{ |
|---|
| 5122 | | - struct be_cmd_work *cmd_work = |
|---|
| 5123 | | - container_of(work, struct be_cmd_work, work); |
|---|
| 5124 | | - struct be_adapter *adapter = cmd_work->adapter; |
|---|
| 5125 | | - __be16 port = cmd_work->info.vxlan_port; |
|---|
| 5126 | | - struct be_vxlan_port *vxlan_port; |
|---|
| 5127 | | - |
|---|
| 5128 | | - /* Nothing to be done if a port alias is being deleted */ |
|---|
| 5129 | | - list_for_each_entry(vxlan_port, &adapter->vxlan_port_list, list) { |
|---|
| 5130 | | - if (vxlan_port->port == port) { |
|---|
| 5131 | | - if (vxlan_port->port_aliases) { |
|---|
| 5132 | | - vxlan_port->port_aliases--; |
|---|
| 5133 | | - goto done; |
|---|
| 5134 | | - } |
|---|
| 5135 | | - break; |
|---|
| 5136 | | - } |
|---|
| 5137 | | - } |
|---|
| 5138 | | - |
|---|
| 5139 | | - /* No port aliases left; delete the port from the list */ |
|---|
| 5140 | | - list_del(&vxlan_port->list); |
|---|
| 5141 | | - adapter->vxlan_port_count--; |
|---|
| 5142 | | - |
|---|
| 5143 | | - /* Disable VxLAN offload if this is the offloaded port */ |
|---|
| 5144 | | - if (adapter->vxlan_port == vxlan_port->port) { |
|---|
| 5145 | | - WARN_ON(adapter->vxlan_port_count); |
|---|
| 5146 | | - be_disable_vxlan_offloads(adapter); |
|---|
| 5147 | | - dev_info(&adapter->pdev->dev, |
|---|
| 5148 | | - "Disabled VxLAN offloads for UDP port %d\n", |
|---|
| 5149 | | - be16_to_cpu(port)); |
|---|
| 5150 | | - goto out; |
|---|
| 5151 | | - } |
|---|
| 5152 | | - |
|---|
| 5153 | | - /* If only 1 port is left, re-enable VxLAN offload */ |
|---|
| 5154 | | - if (adapter->vxlan_port_count == 1) |
|---|
| 5155 | | - be_enable_vxlan_offloads(adapter); |
|---|
| 5156 | | - |
|---|
| 5157 | | -out: |
|---|
| 5158 | | - kfree(vxlan_port); |
|---|
| 5159 | | -done: |
|---|
| 5160 | | - kfree(cmd_work); |
|---|
| 5161 | | -} |
|---|
| 5162 | | - |
|---|
| 5163 | | -static void be_cfg_vxlan_port(struct net_device *netdev, |
|---|
| 5164 | | - struct udp_tunnel_info *ti, |
|---|
| 5165 | | - void (*func)(struct work_struct *)) |
|---|
| 5166 | | -{ |
|---|
| 5167 | | - struct be_adapter *adapter = netdev_priv(netdev); |
|---|
| 5168 | | - struct be_cmd_work *cmd_work; |
|---|
| 5169 | | - |
|---|
| 5170 | | - if (ti->type != UDP_TUNNEL_TYPE_VXLAN) |
|---|
| 5171 | | - return; |
|---|
| 5172 | | - |
|---|
| 5173 | | - if (lancer_chip(adapter) || BEx_chip(adapter) || be_is_mc(adapter)) |
|---|
| 5174 | | - return; |
|---|
| 5175 | | - |
|---|
| 5176 | | - cmd_work = be_alloc_work(adapter, func); |
|---|
| 5177 | | - if (cmd_work) { |
|---|
| 5178 | | - cmd_work->info.vxlan_port = ti->port; |
|---|
| 5179 | | - queue_work(be_wq, &cmd_work->work); |
|---|
| 5180 | | - } |
|---|
| 5181 | | -} |
|---|
| 5182 | | - |
|---|
| 5183 | | -static void be_del_vxlan_port(struct net_device *netdev, |
|---|
| 5184 | | - struct udp_tunnel_info *ti) |
|---|
| 5185 | | -{ |
|---|
| 5186 | | - be_cfg_vxlan_port(netdev, ti, be_work_del_vxlan_port); |
|---|
| 5187 | | -} |
|---|
| 5188 | | - |
|---|
| 5189 | | -static void be_add_vxlan_port(struct net_device *netdev, |
|---|
| 5190 | | - struct udp_tunnel_info *ti) |
|---|
| 5191 | | -{ |
|---|
| 5192 | | - be_cfg_vxlan_port(netdev, ti, be_work_add_vxlan_port); |
|---|
| 5193 | 5072 | } |
|---|
| 5194 | 5073 | |
|---|
| 5195 | 5074 | static netdev_features_t be_features_check(struct sk_buff *skb, |
|---|
| .. | .. |
|---|
| 5307 | 5186 | #endif |
|---|
| 5308 | 5187 | .ndo_bridge_setlink = be_ndo_bridge_setlink, |
|---|
| 5309 | 5188 | .ndo_bridge_getlink = be_ndo_bridge_getlink, |
|---|
| 5310 | | - .ndo_udp_tunnel_add = be_add_vxlan_port, |
|---|
| 5311 | | - .ndo_udp_tunnel_del = be_del_vxlan_port, |
|---|
| 5189 | + .ndo_udp_tunnel_add = udp_tunnel_nic_add_port, |
|---|
| 5190 | + .ndo_udp_tunnel_del = udp_tunnel_nic_del_port, |
|---|
| 5312 | 5191 | .ndo_features_check = be_features_check, |
|---|
| 5313 | 5192 | .ndo_get_phys_port_id = be_get_phys_port_id, |
|---|
| 5314 | 5193 | }; |
|---|
| .. | .. |
|---|
| 5339 | 5218 | netdev->netdev_ops = &be_netdev_ops; |
|---|
| 5340 | 5219 | |
|---|
| 5341 | 5220 | netdev->ethtool_ops = &be_ethtool_ops; |
|---|
| 5221 | + |
|---|
| 5222 | + if (!lancer_chip(adapter) && !BEx_chip(adapter) && !be_is_mc(adapter)) |
|---|
| 5223 | + netdev->udp_tunnel_nic_info = &be_udp_tunnels; |
|---|
| 5342 | 5224 | |
|---|
| 5343 | 5225 | /* MTU range: 256 - 9000 */ |
|---|
| 5344 | 5226 | netdev->min_mtu = BE_MIN_MTU; |
|---|
| .. | .. |
|---|
| 5765 | 5647 | int status = 0; |
|---|
| 5766 | 5648 | |
|---|
| 5767 | 5649 | mbox_mem_alloc->size = sizeof(struct be_mcc_mailbox) + 16; |
|---|
| 5768 | | - mbox_mem_alloc->va = dma_zalloc_coherent(dev, mbox_mem_alloc->size, |
|---|
| 5769 | | - &mbox_mem_alloc->dma, |
|---|
| 5770 | | - GFP_KERNEL); |
|---|
| 5650 | + mbox_mem_alloc->va = dma_alloc_coherent(dev, mbox_mem_alloc->size, |
|---|
| 5651 | + &mbox_mem_alloc->dma, |
|---|
| 5652 | + GFP_KERNEL); |
|---|
| 5771 | 5653 | if (!mbox_mem_alloc->va) |
|---|
| 5772 | 5654 | return -ENOMEM; |
|---|
| 5773 | 5655 | |
|---|
| .. | .. |
|---|
| 5776 | 5658 | mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16); |
|---|
| 5777 | 5659 | |
|---|
| 5778 | 5660 | rx_filter->size = sizeof(struct be_cmd_req_rx_filter); |
|---|
| 5779 | | - rx_filter->va = dma_zalloc_coherent(dev, rx_filter->size, |
|---|
| 5780 | | - &rx_filter->dma, GFP_KERNEL); |
|---|
| 5661 | + rx_filter->va = dma_alloc_coherent(dev, rx_filter->size, |
|---|
| 5662 | + &rx_filter->dma, GFP_KERNEL); |
|---|
| 5781 | 5663 | if (!rx_filter->va) { |
|---|
| 5782 | 5664 | status = -ENOMEM; |
|---|
| 5783 | 5665 | goto free_mbox; |
|---|
| .. | .. |
|---|
| 5791 | 5673 | stats_cmd->size = sizeof(struct be_cmd_req_get_stats_v1); |
|---|
| 5792 | 5674 | else |
|---|
| 5793 | 5675 | stats_cmd->size = sizeof(struct be_cmd_req_get_stats_v2); |
|---|
| 5794 | | - stats_cmd->va = dma_zalloc_coherent(dev, stats_cmd->size, |
|---|
| 5795 | | - &stats_cmd->dma, GFP_KERNEL); |
|---|
| 5676 | + stats_cmd->va = dma_alloc_coherent(dev, stats_cmd->size, |
|---|
| 5677 | + &stats_cmd->dma, GFP_KERNEL); |
|---|
| 5796 | 5678 | if (!stats_cmd->va) { |
|---|
| 5797 | 5679 | status = -ENOMEM; |
|---|
| 5798 | 5680 | goto free_rx_filter; |
|---|
| .. | .. |
|---|
| 5819 | 5701 | /* Must be a power of 2 or else MODULO will BUG_ON */ |
|---|
| 5820 | 5702 | adapter->be_get_temp_freq = 64; |
|---|
| 5821 | 5703 | |
|---|
| 5822 | | - INIT_LIST_HEAD(&adapter->vxlan_port_list); |
|---|
| 5823 | 5704 | return 0; |
|---|
| 5824 | 5705 | |
|---|
| 5825 | 5706 | free_rx_filter: |
|---|
| .. | .. |
|---|
| 5948 | 5829 | struct net_device *netdev; |
|---|
| 5949 | 5830 | int status = 0; |
|---|
| 5950 | 5831 | |
|---|
| 5951 | | - dev_info(&pdev->dev, "%s version is %s\n", DRV_NAME, DRV_VER); |
|---|
| 5952 | | - |
|---|
| 5953 | 5832 | status = pci_enable_device(pdev); |
|---|
| 5954 | 5833 | if (status) |
|---|
| 5955 | 5834 | goto do_none; |
|---|
| .. | .. |
|---|
| 6040 | 5919 | return status; |
|---|
| 6041 | 5920 | } |
|---|
| 6042 | 5921 | |
|---|
| 6043 | | -static int be_suspend(struct pci_dev *pdev, pm_message_t state) |
|---|
| 5922 | +static int __maybe_unused be_suspend(struct device *dev_d) |
|---|
| 6044 | 5923 | { |
|---|
| 6045 | | - struct be_adapter *adapter = pci_get_drvdata(pdev); |
|---|
| 5924 | + struct be_adapter *adapter = dev_get_drvdata(dev_d); |
|---|
| 6046 | 5925 | |
|---|
| 6047 | 5926 | be_intr_set(adapter, false); |
|---|
| 6048 | 5927 | be_cancel_err_detection(adapter); |
|---|
| 6049 | 5928 | |
|---|
| 6050 | 5929 | be_cleanup(adapter); |
|---|
| 6051 | 5930 | |
|---|
| 6052 | | - pci_save_state(pdev); |
|---|
| 6053 | | - pci_disable_device(pdev); |
|---|
| 6054 | | - pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
|---|
| 6055 | 5931 | return 0; |
|---|
| 6056 | 5932 | } |
|---|
| 6057 | 5933 | |
|---|
| 6058 | | -static int be_pci_resume(struct pci_dev *pdev) |
|---|
| 5934 | +static int __maybe_unused be_pci_resume(struct device *dev_d) |
|---|
| 6059 | 5935 | { |
|---|
| 6060 | | - struct be_adapter *adapter = pci_get_drvdata(pdev); |
|---|
| 5936 | + struct be_adapter *adapter = dev_get_drvdata(dev_d); |
|---|
| 6061 | 5937 | int status = 0; |
|---|
| 6062 | | - |
|---|
| 6063 | | - status = pci_enable_device(pdev); |
|---|
| 6064 | | - if (status) |
|---|
| 6065 | | - return status; |
|---|
| 6066 | | - |
|---|
| 6067 | | - pci_restore_state(pdev); |
|---|
| 6068 | 5938 | |
|---|
| 6069 | 5939 | status = be_resume(adapter); |
|---|
| 6070 | 5940 | if (status) |
|---|
| .. | .. |
|---|
| 6151 | 6021 | if (status) |
|---|
| 6152 | 6022 | return PCI_ERS_RESULT_DISCONNECT; |
|---|
| 6153 | 6023 | |
|---|
| 6154 | | - pci_cleanup_aer_uncorrect_error_status(pdev); |
|---|
| 6155 | 6024 | be_clear_error(adapter, BE_CLEAR_ALL); |
|---|
| 6156 | 6025 | return PCI_ERS_RESULT_RECOVERED; |
|---|
| 6157 | 6026 | } |
|---|
| .. | .. |
|---|
| 6238 | 6107 | .resume = be_eeh_resume, |
|---|
| 6239 | 6108 | }; |
|---|
| 6240 | 6109 | |
|---|
| 6110 | +static SIMPLE_DEV_PM_OPS(be_pci_pm_ops, be_suspend, be_pci_resume); |
|---|
| 6111 | + |
|---|
| 6241 | 6112 | static struct pci_driver be_driver = { |
|---|
| 6242 | 6113 | .name = DRV_NAME, |
|---|
| 6243 | 6114 | .id_table = be_dev_ids, |
|---|
| 6244 | 6115 | .probe = be_probe, |
|---|
| 6245 | 6116 | .remove = be_remove, |
|---|
| 6246 | | - .suspend = be_suspend, |
|---|
| 6247 | | - .resume = be_pci_resume, |
|---|
| 6117 | + .driver.pm = &be_pci_pm_ops, |
|---|
| 6248 | 6118 | .shutdown = be_shutdown, |
|---|
| 6249 | 6119 | .sriov_configure = be_pci_sriov_configure, |
|---|
| 6250 | 6120 | .err_handler = &be_eeh_handlers |
|---|