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