Commit 6e7da286 authored by David S. Miller's avatar David S. Miller

Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue

Jeff Kirsher says:

====================
40GbE Intel Wired LAN Driver Updates 2017-06-01

This series contains updates to i40e, i40evf and the "new" AVF virtchnl.

This is the introduction of the Intel(R) Ethernet Adaptive Virtual
Function driver code and device ID, as presented at the NetDEV 1.2
conference in 2016.
http://netdevconf.org/1.2/session.html?anjali-singhai

The idea is to convert the interface between the i40evf driver
and the parent i40e PF driver to be generic, as the i40evf driver
should in the future be able to run on top of other Intel PF
drivers, and negotiate any features beyond a "base expected" set.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents b2608311 85cfa717
Linux* Base Driver for Intel(R) Network Connection Linux* Base Driver for Intel(R) Network Connection
================================================== ==================================================
Intel XL710 X710 Virtual Function Linux driver. Intel Ethernet Adaptive Virtual Function Linux driver.
Copyright(c) 2013 Intel Corporation. Copyright(c) 2013-2017 Intel Corporation.
Contents Contents
======== ========
...@@ -11,19 +11,26 @@ Contents ...@@ -11,19 +11,26 @@ Contents
- Known Issues/Troubleshooting - Known Issues/Troubleshooting
- Support - Support
This file describes the i40evf Linux* Base Driver for the Intel(R) XL710 This file describes the i40evf Linux* Base Driver.
X710 Virtual Function.
The i40evf driver supports XL710 and X710 virtual function devices that The i40evf driver supports the below mentioned virtual function
can only be activated on kernels with CONFIG_PCI_IOV enabled. devices and can only be activated on kernels running the i40e or
newer Physical Function (PF) driver compiled with CONFIG_PCI_IOV.
The i40evf driver requires CONFIG_PCI_MSI to be enabled.
The guest OS loading the i40evf driver must support MSI-X interrupts. The guest OS loading the i40evf driver must support MSI-X interrupts.
Supported Hardware
==================
Intel XL710 X710 Virtual Function
Intel Ethernet Adaptive Virtual Function
Intel X722 Virtual Function
Identifying Your Adapter Identifying Your Adapter
======================== ========================
For more information on how to identify your adapter, go to the Adapter & For more information on how to identify your adapter, go to the
Driver ID Guide at: Adapter & Driver ID Guide at:
http://support.intel.com/support/go/network/adapter/idguide.htm http://support.intel.com/support/go/network/adapter/idguide.htm
......
...@@ -6738,6 +6738,7 @@ F: Documentation/networking/i40e.txt ...@@ -6738,6 +6738,7 @@ F: Documentation/networking/i40e.txt
F: Documentation/networking/i40evf.txt F: Documentation/networking/i40evf.txt
F: drivers/net/ethernet/intel/ F: drivers/net/ethernet/intel/
F: drivers/net/ethernet/intel/*/ F: drivers/net/ethernet/intel/*/
F: include/linux/avf/virtchnl.h
INTEL RDMA RNIC DRIVER INTEL RDMA RNIC DRIVER
M: Faisal Latif <faisal.latif@intel.com> M: Faisal Latif <faisal.latif@intel.com>
......
...@@ -236,12 +236,14 @@ config I40E_DCB ...@@ -236,12 +236,14 @@ config I40E_DCB
If unsure, say N. If unsure, say N.
config I40EVF config I40EVF
tristate "Intel(R) XL710 X710 Virtual Function Ethernet support" tristate "Intel(R) Ethernet Adaptive Virtual Function support"
depends on PCI_MSI depends on PCI_MSI
---help--- ---help---
This driver supports Intel(R) XL710 and X710 virtual functions. This driver supports virtual functions for Intel XL710,
For more information on how to identify your adapter, go to the X710, X722, and all devices advertising support for Intel
Adapter & Driver ID Guide that can be located at: Ethernet Adaptive Virtual Function devices. For more
information on how to identify your adapter, go to the Adapter
& Driver ID Guide that can be located at:
<http://support.intel.com> <http://support.intel.com>
......
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
#include "i40e_type.h" #include "i40e_type.h"
#include "i40e_prototype.h" #include "i40e_prototype.h"
#include "i40e_client.h" #include "i40e_client.h"
#include "i40e_virtchnl.h" #include <linux/avf/virtchnl.h>
#include "i40e_virtchnl_pf.h" #include "i40e_virtchnl_pf.h"
#include "i40e_txrx.h" #include "i40e_txrx.h"
#include "i40e_dcb.h" #include "i40e_dcb.h"
......
...@@ -565,7 +565,7 @@ static int i40e_client_virtchnl_send(struct i40e_info *ldev, ...@@ -565,7 +565,7 @@ static int i40e_client_virtchnl_send(struct i40e_info *ldev,
struct i40e_hw *hw = &pf->hw; struct i40e_hw *hw = &pf->hw;
i40e_status err; i40e_status err;
err = i40e_aq_send_msg_to_vf(hw, vf_id, I40E_VIRTCHNL_OP_IWARP, err = i40e_aq_send_msg_to_vf(hw, vf_id, VIRTCHNL_OP_IWARP,
0, msg, len, NULL); 0, msg, len, NULL);
if (err) if (err)
dev_err(&pf->pdev->dev, "Unable to send iWarp message to VF, error %d, aq status %d\n", dev_err(&pf->pdev->dev, "Unable to send iWarp message to VF, error %d, aq status %d\n",
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include "i40e_type.h" #include "i40e_type.h"
#include "i40e_adminq.h" #include "i40e_adminq.h"
#include "i40e_prototype.h" #include "i40e_prototype.h"
#include "i40e_virtchnl.h" #include <linux/avf/virtchnl.h>
/** /**
* i40e_set_mac_type - Sets MAC type * i40e_set_mac_type - Sets MAC type
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "i40e_type.h" #include "i40e_type.h"
#include "i40e_alloc.h" #include "i40e_alloc.h"
#include "i40e_virtchnl.h" #include <linux/avf/virtchnl.h>
/* Prototypes for shared code functions that are not in /* Prototypes for shared code functions that are not in
* the standard function pointer structures. These are * the standard function pointer structures. These are
...@@ -333,10 +333,10 @@ static inline struct i40e_rx_ptype_decoded decode_rx_desc_ptype(u8 ptype) ...@@ -333,10 +333,10 @@ static inline struct i40e_rx_ptype_decoded decode_rx_desc_ptype(u8 ptype)
/* i40e_common for VF drivers*/ /* i40e_common for VF drivers*/
void i40e_vf_parse_hw_config(struct i40e_hw *hw, void i40e_vf_parse_hw_config(struct i40e_hw *hw,
struct i40e_virtchnl_vf_resource *msg); struct virtchnl_vf_resource *msg);
i40e_status i40e_vf_reset(struct i40e_hw *hw); i40e_status i40e_vf_reset(struct i40e_hw *hw);
i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw, i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
enum i40e_virtchnl_ops v_opcode, enum virtchnl_ops v_opcode,
i40e_status v_retval, i40e_status v_retval,
u8 *msg, u16 msglen, u8 *msg, u16 msglen,
struct i40e_asq_cmd_details *cmd_details); struct i40e_asq_cmd_details *cmd_details);
......
This diff is collapsed.
...@@ -40,9 +40,6 @@ ...@@ -40,9 +40,6 @@
#define I40E_VLAN_MASK 0xFFF #define I40E_VLAN_MASK 0xFFF
#define I40E_PRIORITY_MASK 0x7000 #define I40E_PRIORITY_MASK 0x7000
#define VF_IS_V10(_v) (((_v)->vf_ver.major == 1) && ((_v)->vf_ver.minor == 0))
#define VF_IS_V11(_v) (((_v)->vf_ver.major == 1) && ((_v)->vf_ver.minor == 1))
/* Various queue ctrls */ /* Various queue ctrls */
enum i40e_queue_ctrl { enum i40e_queue_ctrl {
I40E_QUEUE_CTRL_UNKNOWN = 0, I40E_QUEUE_CTRL_UNKNOWN = 0,
...@@ -81,13 +78,13 @@ struct i40e_vf { ...@@ -81,13 +78,13 @@ struct i40e_vf {
s16 vf_id; s16 vf_id;
/* all VF vsis connect to the same parent */ /* all VF vsis connect to the same parent */
enum i40e_switch_element_types parent_type; enum i40e_switch_element_types parent_type;
struct i40e_virtchnl_version_info vf_ver; struct virtchnl_version_info vf_ver;
u32 driver_caps; /* reported by VF driver */ u32 driver_caps; /* reported by VF driver */
/* VF Port Extender (PE) stag if used */ /* VF Port Extender (PE) stag if used */
u16 stag; u16 stag;
struct i40e_virtchnl_ether_addr default_lan_addr; struct virtchnl_ether_addr default_lan_addr;
u16 port_vlan_id; u16 port_vlan_id;
bool pf_set_mac; /* The VMM admin set the VF MAC address */ bool pf_set_mac; /* The VMM admin set the VF MAC address */
bool trusted; bool trusted;
...@@ -115,7 +112,7 @@ struct i40e_vf { ...@@ -115,7 +112,7 @@ struct i40e_vf {
u16 num_vlan; u16 num_vlan;
/* RDMA Client */ /* RDMA Client */
struct i40e_virtchnl_iwarp_qvlist_info *qvlist_info; struct virtchnl_iwarp_qvlist_info *qvlist_info;
}; };
void i40e_free_vfs(struct i40e_pf *pf); void i40e_free_vfs(struct i40e_pf *pf);
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include "i40e_type.h" #include "i40e_type.h"
#include "i40e_adminq.h" #include "i40e_adminq.h"
#include "i40e_prototype.h" #include "i40e_prototype.h"
#include "i40e_virtchnl.h" #include <linux/avf/virtchnl.h>
/** /**
* i40e_set_mac_type - Sets MAC type * i40e_set_mac_type - Sets MAC type
...@@ -68,6 +68,7 @@ i40e_status i40e_set_mac_type(struct i40e_hw *hw) ...@@ -68,6 +68,7 @@ i40e_status i40e_set_mac_type(struct i40e_hw *hw)
break; break;
case I40E_DEV_ID_VF: case I40E_DEV_ID_VF:
case I40E_DEV_ID_VF_HV: case I40E_DEV_ID_VF_HV:
case I40E_DEV_ID_ADAPTIVE_VF:
hw->mac.type = I40E_MAC_VF; hw->mac.type = I40E_MAC_VF;
break; break;
default: default:
...@@ -1054,7 +1055,7 @@ void i40evf_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val) ...@@ -1054,7 +1055,7 @@ void i40evf_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val)
* completion before returning. * completion before returning.
**/ **/
i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw, i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
enum i40e_virtchnl_ops v_opcode, enum virtchnl_ops v_opcode,
i40e_status v_retval, i40e_status v_retval,
u8 *msg, u16 msglen, u8 *msg, u16 msglen,
struct i40e_asq_cmd_details *cmd_details) struct i40e_asq_cmd_details *cmd_details)
...@@ -1092,9 +1093,9 @@ i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw, ...@@ -1092,9 +1093,9 @@ i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
* with appropriate information. * with appropriate information.
**/ **/
void i40e_vf_parse_hw_config(struct i40e_hw *hw, void i40e_vf_parse_hw_config(struct i40e_hw *hw,
struct i40e_virtchnl_vf_resource *msg) struct virtchnl_vf_resource *msg)
{ {
struct i40e_virtchnl_vsi_resource *vsi_res; struct virtchnl_vsi_resource *vsi_res;
int i; int i;
vsi_res = &msg->vsi_res[0]; vsi_res = &msg->vsi_res[0];
...@@ -1104,10 +1105,10 @@ void i40e_vf_parse_hw_config(struct i40e_hw *hw, ...@@ -1104,10 +1105,10 @@ void i40e_vf_parse_hw_config(struct i40e_hw *hw,
hw->dev_caps.num_tx_qp = msg->num_queue_pairs; hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
hw->dev_caps.num_msix_vectors_vf = msg->max_vectors; hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
hw->dev_caps.dcb = msg->vf_offload_flags & hw->dev_caps.dcb = msg->vf_offload_flags &
I40E_VIRTCHNL_VF_OFFLOAD_L2; VIRTCHNL_VF_OFFLOAD_L2;
hw->dev_caps.fcoe = 0; hw->dev_caps.fcoe = 0;
for (i = 0; i < msg->num_vsis; i++) { for (i = 0; i < msg->num_vsis; i++) {
if (vsi_res->vsi_type == I40E_VSI_SRIOV) { if (vsi_res->vsi_type == VIRTCHNL_VSI_SRIOV) {
ether_addr_copy(hw->mac.perm_addr, ether_addr_copy(hw->mac.perm_addr,
vsi_res->default_mac_addr); vsi_res->default_mac_addr);
ether_addr_copy(hw->mac.addr, ether_addr_copy(hw->mac.addr,
...@@ -1127,7 +1128,7 @@ void i40e_vf_parse_hw_config(struct i40e_hw *hw, ...@@ -1127,7 +1128,7 @@ void i40e_vf_parse_hw_config(struct i40e_hw *hw,
**/ **/
i40e_status i40e_vf_reset(struct i40e_hw *hw) i40e_status i40e_vf_reset(struct i40e_hw *hw)
{ {
return i40e_aq_send_msg_to_pf(hw, I40E_VIRTCHNL_OP_RESET_VF, return i40e_aq_send_msg_to_pf(hw, VIRTCHNL_OP_RESET_VF,
0, NULL, 0, NULL); 0, NULL, 0, NULL);
} }
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#define I40E_DEV_ID_25G_SFP28 0x158B #define I40E_DEV_ID_25G_SFP28 0x158B
#define I40E_DEV_ID_VF 0x154C #define I40E_DEV_ID_VF 0x154C
#define I40E_DEV_ID_VF_HV 0x1571 #define I40E_DEV_ID_VF_HV 0x1571
#define I40E_DEV_ID_ADAPTIVE_VF 0x1889
#define I40E_DEV_ID_SFP_X722 0x37D0 #define I40E_DEV_ID_SFP_X722 0x37D0
#define I40E_DEV_ID_1G_BASE_T_X722 0x37D1 #define I40E_DEV_ID_1G_BASE_T_X722 0x37D1
#define I40E_DEV_ID_10G_BASE_T_X722 0x37D2 #define I40E_DEV_ID_10G_BASE_T_X722 0x37D2
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "i40e_type.h" #include "i40e_type.h"
#include "i40e_alloc.h" #include "i40e_alloc.h"
#include "i40e_virtchnl.h" #include <linux/avf/virtchnl.h>
/* Prototypes for shared code functions that are not in /* Prototypes for shared code functions that are not in
* the standard function pointer structures. These are * the standard function pointer structures. These are
...@@ -87,10 +87,10 @@ static inline struct i40e_rx_ptype_decoded decode_rx_desc_ptype(u8 ptype) ...@@ -87,10 +87,10 @@ static inline struct i40e_rx_ptype_decoded decode_rx_desc_ptype(u8 ptype)
/* i40e_common for VF drivers*/ /* i40e_common for VF drivers*/
void i40e_vf_parse_hw_config(struct i40e_hw *hw, void i40e_vf_parse_hw_config(struct i40e_hw *hw,
struct i40e_virtchnl_vf_resource *msg); struct virtchnl_vf_resource *msg);
i40e_status i40e_vf_reset(struct i40e_hw *hw); i40e_status i40e_vf_reset(struct i40e_hw *hw);
i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw, i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
enum i40e_virtchnl_ops v_opcode, enum virtchnl_ops v_opcode,
i40e_status v_retval, i40e_status v_retval,
u8 *msg, u16 msglen, u8 *msg, u16 msglen,
struct i40e_asq_cmd_details *cmd_details); struct i40e_asq_cmd_details *cmd_details);
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
#include <net/udp.h> #include <net/udp.h>
#include "i40e_type.h" #include "i40e_type.h"
#include "i40e_virtchnl.h" #include <linux/avf/virtchnl.h>
#include "i40e_txrx.h" #include "i40e_txrx.h"
#define DEFAULT_DEBUG_LEVEL_SHIFT 3 #define DEFAULT_DEBUG_LEVEL_SHIFT 3
...@@ -263,26 +263,26 @@ struct i40evf_adapter { ...@@ -263,26 +263,26 @@ struct i40evf_adapter {
struct work_struct watchdog_task; struct work_struct watchdog_task;
bool netdev_registered; bool netdev_registered;
bool link_up; bool link_up;
enum i40e_aq_link_speed link_speed; enum virtchnl_link_speed link_speed;
enum i40e_virtchnl_ops current_op; enum virtchnl_ops current_op;
#define CLIENT_ALLOWED(_a) ((_a)->vf_res ? \ #define CLIENT_ALLOWED(_a) ((_a)->vf_res ? \
(_a)->vf_res->vf_offload_flags & \ (_a)->vf_res->vf_offload_flags & \
I40E_VIRTCHNL_VF_OFFLOAD_IWARP : \ VIRTCHNL_VF_OFFLOAD_IWARP : \
0) 0)
#define CLIENT_ENABLED(_a) ((_a)->cinst) #define CLIENT_ENABLED(_a) ((_a)->cinst)
/* RSS by the PF should be preferred over RSS via other methods. */ /* RSS by the PF should be preferred over RSS via other methods. */
#define RSS_PF(_a) ((_a)->vf_res->vf_offload_flags & \ #define RSS_PF(_a) ((_a)->vf_res->vf_offload_flags & \
I40E_VIRTCHNL_VF_OFFLOAD_RSS_PF) VIRTCHNL_VF_OFFLOAD_RSS_PF)
#define RSS_AQ(_a) ((_a)->vf_res->vf_offload_flags & \ #define RSS_AQ(_a) ((_a)->vf_res->vf_offload_flags & \
I40E_VIRTCHNL_VF_OFFLOAD_RSS_AQ) VIRTCHNL_VF_OFFLOAD_RSS_AQ)
#define RSS_REG(_a) (!((_a)->vf_res->vf_offload_flags & \ #define RSS_REG(_a) (!((_a)->vf_res->vf_offload_flags & \
(I40E_VIRTCHNL_VF_OFFLOAD_RSS_AQ | \ (VIRTCHNL_VF_OFFLOAD_RSS_AQ | \
I40E_VIRTCHNL_VF_OFFLOAD_RSS_PF))) VIRTCHNL_VF_OFFLOAD_RSS_PF)))
#define VLAN_ALLOWED(_a) ((_a)->vf_res->vf_offload_flags & \ #define VLAN_ALLOWED(_a) ((_a)->vf_res->vf_offload_flags & \
I40E_VIRTCHNL_VF_OFFLOAD_VLAN) VIRTCHNL_VF_OFFLOAD_VLAN)
struct i40e_virtchnl_vf_resource *vf_res; /* incl. all VSIs */ struct virtchnl_vf_resource *vf_res; /* incl. all VSIs */
struct i40e_virtchnl_vsi_resource *vsi_res; /* our LAN VSI */ struct virtchnl_vsi_resource *vsi_res; /* our LAN VSI */
struct i40e_virtchnl_version_info pf_version; struct virtchnl_version_info pf_version;
#define PF_IS_V11(_a) (((_a)->pf_version.major == 1) && \ #define PF_IS_V11(_a) (((_a)->pf_version.major == 1) && \
((_a)->pf_version.minor == 1)) ((_a)->pf_version.minor == 1))
u16 msg_enable; u16 msg_enable;
...@@ -348,7 +348,7 @@ void i40evf_set_hena(struct i40evf_adapter *adapter); ...@@ -348,7 +348,7 @@ void i40evf_set_hena(struct i40evf_adapter *adapter);
void i40evf_set_rss_key(struct i40evf_adapter *adapter); void i40evf_set_rss_key(struct i40evf_adapter *adapter);
void i40evf_set_rss_lut(struct i40evf_adapter *adapter); void i40evf_set_rss_lut(struct i40evf_adapter *adapter);
void i40evf_virtchnl_completion(struct i40evf_adapter *adapter, void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
enum i40e_virtchnl_ops v_opcode, enum virtchnl_ops v_opcode,
i40e_status v_retval, u8 *msg, u16 msglen); i40e_status v_retval, u8 *msg, u16 msglen);
int i40evf_config_rss(struct i40evf_adapter *adapter); int i40evf_config_rss(struct i40evf_adapter *adapter);
int i40evf_lan_add_device(struct i40evf_adapter *adapter); int i40evf_lan_add_device(struct i40evf_adapter *adapter);
......
...@@ -120,7 +120,7 @@ static int i40evf_client_release_qvlist(struct i40e_info *ldev) ...@@ -120,7 +120,7 @@ static int i40evf_client_release_qvlist(struct i40e_info *ldev)
return -EAGAIN; return -EAGAIN;
err = i40e_aq_send_msg_to_pf(&adapter->hw, err = i40e_aq_send_msg_to_pf(&adapter->hw,
I40E_VIRTCHNL_OP_RELEASE_IWARP_IRQ_MAP, VIRTCHNL_OP_RELEASE_IWARP_IRQ_MAP,
I40E_SUCCESS, NULL, 0, NULL); I40E_SUCCESS, NULL, 0, NULL);
if (err) if (err)
...@@ -410,7 +410,7 @@ static u32 i40evf_client_virtchnl_send(struct i40e_info *ldev, ...@@ -410,7 +410,7 @@ static u32 i40evf_client_virtchnl_send(struct i40e_info *ldev,
if (adapter->aq_required) if (adapter->aq_required)
return -EAGAIN; return -EAGAIN;
err = i40e_aq_send_msg_to_pf(&adapter->hw, I40E_VIRTCHNL_OP_IWARP, err = i40e_aq_send_msg_to_pf(&adapter->hw, VIRTCHNL_OP_IWARP,
I40E_SUCCESS, msg, len, NULL); I40E_SUCCESS, msg, len, NULL);
if (err) if (err)
dev_err(&adapter->pdev->dev, "Unable to send iWarp message to PF, error %d, aq status %d\n", dev_err(&adapter->pdev->dev, "Unable to send iWarp message to PF, error %d, aq status %d\n",
...@@ -431,7 +431,7 @@ static int i40evf_client_setup_qvlist(struct i40e_info *ldev, ...@@ -431,7 +431,7 @@ static int i40evf_client_setup_qvlist(struct i40e_info *ldev,
struct i40e_client *client, struct i40e_client *client,
struct i40e_qvlist_info *qvlist_info) struct i40e_qvlist_info *qvlist_info)
{ {
struct i40e_virtchnl_iwarp_qvlist_info *v_qvlist_info; struct virtchnl_iwarp_qvlist_info *v_qvlist_info;
struct i40evf_adapter *adapter = ldev->vf; struct i40evf_adapter *adapter = ldev->vf;
struct i40e_qv_info *qv_info; struct i40e_qv_info *qv_info;
i40e_status err; i40e_status err;
...@@ -453,14 +453,14 @@ static int i40evf_client_setup_qvlist(struct i40e_info *ldev, ...@@ -453,14 +453,14 @@ static int i40evf_client_setup_qvlist(struct i40e_info *ldev,
return -EINVAL; return -EINVAL;
} }
v_qvlist_info = (struct i40e_virtchnl_iwarp_qvlist_info *)qvlist_info; v_qvlist_info = (struct virtchnl_iwarp_qvlist_info *)qvlist_info;
msg_size = sizeof(struct i40e_virtchnl_iwarp_qvlist_info) + msg_size = sizeof(struct virtchnl_iwarp_qvlist_info) +
(sizeof(struct i40e_virtchnl_iwarp_qv_info) * (sizeof(struct virtchnl_iwarp_qv_info) *
(v_qvlist_info->num_vectors - 1)); (v_qvlist_info->num_vectors - 1));
adapter->client_pending |= BIT(I40E_VIRTCHNL_OP_CONFIG_IWARP_IRQ_MAP); adapter->client_pending |= BIT(VIRTCHNL_OP_CONFIG_IWARP_IRQ_MAP);
err = i40e_aq_send_msg_to_pf(&adapter->hw, err = i40e_aq_send_msg_to_pf(&adapter->hw,
I40E_VIRTCHNL_OP_CONFIG_IWARP_IRQ_MAP, VIRTCHNL_OP_CONFIG_IWARP_IRQ_MAP,
I40E_SUCCESS, (u8 *)v_qvlist_info, msg_size, NULL); I40E_SUCCESS, (u8 *)v_qvlist_info, msg_size, NULL);
if (err) { if (err) {
...@@ -474,7 +474,7 @@ static int i40evf_client_setup_qvlist(struct i40e_info *ldev, ...@@ -474,7 +474,7 @@ static int i40evf_client_setup_qvlist(struct i40e_info *ldev,
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
msleep(100); msleep(100);
if (!(adapter->client_pending & if (!(adapter->client_pending &
BIT(I40E_VIRTCHNL_OP_CONFIG_IWARP_IRQ_MAP))) { BIT(VIRTCHNL_OP_CONFIG_IWARP_IRQ_MAP))) {
err = 0; err = 0;
break; break;
} }
......
...@@ -44,9 +44,9 @@ static const char i40evf_driver_string[] = ...@@ -44,9 +44,9 @@ static const char i40evf_driver_string[] =
#define DRV_KERN "-k" #define DRV_KERN "-k"
#define DRV_VERSION_MAJOR 2 #define DRV_VERSION_MAJOR 3
#define DRV_VERSION_MINOR 1 #define DRV_VERSION_MINOR 0
#define DRV_VERSION_BUILD 14 #define DRV_VERSION_BUILD 0
#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \ #define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \
__stringify(DRV_VERSION_MINOR) "." \ __stringify(DRV_VERSION_MINOR) "." \
__stringify(DRV_VERSION_BUILD) \ __stringify(DRV_VERSION_BUILD) \
...@@ -67,6 +67,7 @@ static const struct pci_device_id i40evf_pci_tbl[] = { ...@@ -67,6 +67,7 @@ static const struct pci_device_id i40evf_pci_tbl[] = {
{PCI_VDEVICE(INTEL, I40E_DEV_ID_VF), 0}, {PCI_VDEVICE(INTEL, I40E_DEV_ID_VF), 0},
{PCI_VDEVICE(INTEL, I40E_DEV_ID_VF_HV), 0}, {PCI_VDEVICE(INTEL, I40E_DEV_ID_VF_HV), 0},
{PCI_VDEVICE(INTEL, I40E_DEV_ID_X722_VF), 0}, {PCI_VDEVICE(INTEL, I40E_DEV_ID_X722_VF), 0},
{PCI_VDEVICE(INTEL, I40E_DEV_ID_ADAPTIVE_VF), 0},
/* required last entry */ /* required last entry */
{0, } {0, }
}; };
...@@ -1131,7 +1132,7 @@ void i40evf_down(struct i40evf_adapter *adapter) ...@@ -1131,7 +1132,7 @@ void i40evf_down(struct i40evf_adapter *adapter)
if (!(adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED) && if (!(adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED) &&
adapter->state != __I40EVF_RESETTING) { adapter->state != __I40EVF_RESETTING) {
/* cancel any current operation */ /* cancel any current operation */
adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; adapter->current_op = VIRTCHNL_OP_UNKNOWN;
/* Schedule operations to close down the HW. Don't wait /* Schedule operations to close down the HW. Don't wait
* here for this to complete. The watchdog is still running * here for this to complete. The watchdog is still running
* and it will take care of this. * and it will take care of this.
...@@ -1311,7 +1312,7 @@ static int i40evf_config_rss_aq(struct i40evf_adapter *adapter) ...@@ -1311,7 +1312,7 @@ static int i40evf_config_rss_aq(struct i40evf_adapter *adapter)
struct i40e_hw *hw = &adapter->hw; struct i40e_hw *hw = &adapter->hw;
int ret = 0; int ret = 0;
if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { if (adapter->current_op != VIRTCHNL_OP_UNKNOWN) {
/* bail because we already have a command pending */ /* bail because we already have a command pending */
dev_err(&adapter->pdev->dev, "Cannot configure RSS, command %d pending\n", dev_err(&adapter->pdev->dev, "Cannot configure RSS, command %d pending\n",
adapter->current_op); adapter->current_op);
...@@ -1410,7 +1411,7 @@ static int i40evf_init_rss(struct i40evf_adapter *adapter) ...@@ -1410,7 +1411,7 @@ static int i40evf_init_rss(struct i40evf_adapter *adapter)
if (!RSS_PF(adapter)) { if (!RSS_PF(adapter)) {
/* Enable PCTYPES for RSS, TCP/UDP with IPv4/IPv6 */ /* Enable PCTYPES for RSS, TCP/UDP with IPv4/IPv6 */
if (adapter->vf_res->vf_offload_flags & if (adapter->vf_res->vf_offload_flags &
I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2) VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2)
adapter->hena = I40E_DEFAULT_RSS_HENA_EXPANDED; adapter->hena = I40E_DEFAULT_RSS_HENA_EXPANDED;
else else
adapter->hena = I40E_DEFAULT_RSS_HENA; adapter->hena = I40E_DEFAULT_RSS_HENA;
...@@ -1588,8 +1589,8 @@ static void i40evf_watchdog_task(struct work_struct *work) ...@@ -1588,8 +1589,8 @@ static void i40evf_watchdog_task(struct work_struct *work)
if (adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED) { if (adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED) {
reg_val = rd32(hw, I40E_VFGEN_RSTAT) & reg_val = rd32(hw, I40E_VFGEN_RSTAT) &
I40E_VFGEN_RSTAT_VFR_STATE_MASK; I40E_VFGEN_RSTAT_VFR_STATE_MASK;
if ((reg_val == I40E_VFR_VFACTIVE) || if ((reg_val == VIRTCHNL_VFR_VFACTIVE) ||
(reg_val == I40E_VFR_COMPLETED)) { (reg_val == VIRTCHNL_VFR_COMPLETED)) {
/* A chance for redemption! */ /* A chance for redemption! */
dev_err(&adapter->pdev->dev, "Hardware came out of reset. Attempting reinit.\n"); dev_err(&adapter->pdev->dev, "Hardware came out of reset. Attempting reinit.\n");
adapter->state = __I40EVF_STARTUP; adapter->state = __I40EVF_STARTUP;
...@@ -1605,7 +1606,7 @@ static void i40evf_watchdog_task(struct work_struct *work) ...@@ -1605,7 +1606,7 @@ static void i40evf_watchdog_task(struct work_struct *work)
return; return;
} }
adapter->aq_required = 0; adapter->aq_required = 0;
adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; adapter->current_op = VIRTCHNL_OP_UNKNOWN;
goto watchdog_done; goto watchdog_done;
} }
...@@ -1621,7 +1622,7 @@ static void i40evf_watchdog_task(struct work_struct *work) ...@@ -1621,7 +1622,7 @@ static void i40evf_watchdog_task(struct work_struct *work)
dev_err(&adapter->pdev->dev, "Hardware reset detected\n"); dev_err(&adapter->pdev->dev, "Hardware reset detected\n");
schedule_work(&adapter->reset_task); schedule_work(&adapter->reset_task);
adapter->aq_required = 0; adapter->aq_required = 0;
adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; adapter->current_op = VIRTCHNL_OP_UNKNOWN;
goto watchdog_done; goto watchdog_done;
} }
...@@ -1707,13 +1708,13 @@ static void i40evf_watchdog_task(struct work_struct *work) ...@@ -1707,13 +1708,13 @@ static void i40evf_watchdog_task(struct work_struct *work)
} }
if (adapter->aq_required & I40EVF_FLAG_AQ_REQUEST_PROMISC) { if (adapter->aq_required & I40EVF_FLAG_AQ_REQUEST_PROMISC) {
i40evf_set_promiscuous(adapter, I40E_FLAG_VF_UNICAST_PROMISC | i40evf_set_promiscuous(adapter, FLAG_VF_UNICAST_PROMISC |
I40E_FLAG_VF_MULTICAST_PROMISC); FLAG_VF_MULTICAST_PROMISC);
goto watchdog_done; goto watchdog_done;
} }
if (adapter->aq_required & I40EVF_FLAG_AQ_REQUEST_ALLMULTI) { if (adapter->aq_required & I40EVF_FLAG_AQ_REQUEST_ALLMULTI) {
i40evf_set_promiscuous(adapter, I40E_FLAG_VF_MULTICAST_PROMISC); i40evf_set_promiscuous(adapter, FLAG_VF_MULTICAST_PROMISC);
goto watchdog_done; goto watchdog_done;
} }
...@@ -1854,7 +1855,7 @@ static void i40evf_reset_task(struct work_struct *work) ...@@ -1854,7 +1855,7 @@ static void i40evf_reset_task(struct work_struct *work)
reg_val = rd32(hw, I40E_VFGEN_RSTAT) & reg_val = rd32(hw, I40E_VFGEN_RSTAT) &
I40E_VFGEN_RSTAT_VFR_STATE_MASK; I40E_VFGEN_RSTAT_VFR_STATE_MASK;
if (reg_val == I40E_VFR_VFACTIVE) if (reg_val == VIRTCHNL_VFR_VFACTIVE)
break; break;
} }
...@@ -1888,7 +1889,7 @@ static void i40evf_reset_task(struct work_struct *work) ...@@ -1888,7 +1889,7 @@ static void i40evf_reset_task(struct work_struct *work)
/* kill and reinit the admin queue */ /* kill and reinit the admin queue */
i40evf_shutdown_adminq(hw); i40evf_shutdown_adminq(hw);
adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; adapter->current_op = VIRTCHNL_OP_UNKNOWN;
err = i40evf_init_adminq(hw); err = i40evf_init_adminq(hw);
if (err) if (err)
dev_info(&adapter->pdev->dev, "Failed to init adminq: %d\n", dev_info(&adapter->pdev->dev, "Failed to init adminq: %d\n",
...@@ -1949,7 +1950,7 @@ static void i40evf_adminq_task(struct work_struct *work) ...@@ -1949,7 +1950,7 @@ static void i40evf_adminq_task(struct work_struct *work)
container_of(work, struct i40evf_adapter, adminq_task); container_of(work, struct i40evf_adapter, adminq_task);
struct i40e_hw *hw = &adapter->hw; struct i40e_hw *hw = &adapter->hw;
struct i40e_arq_event_info event; struct i40e_arq_event_info event;
struct i40e_virtchnl_msg *v_msg; struct virtchnl_msg *v_msg;
i40e_status ret; i40e_status ret;
u32 val, oldval; u32 val, oldval;
u16 pending; u16 pending;
...@@ -1962,14 +1963,15 @@ static void i40evf_adminq_task(struct work_struct *work) ...@@ -1962,14 +1963,15 @@ static void i40evf_adminq_task(struct work_struct *work)
if (!event.msg_buf) if (!event.msg_buf)
goto out; goto out;
v_msg = (struct i40e_virtchnl_msg *)&event.desc; v_msg = (struct virtchnl_msg *)&event.desc;
do { do {
ret = i40evf_clean_arq_element(hw, &event, &pending); ret = i40evf_clean_arq_element(hw, &event, &pending);
if (ret || !v_msg->v_opcode) if (ret || !v_msg->v_opcode)
break; /* No event to process or error cleaning ARQ */ break; /* No event to process or error cleaning ARQ */
i40evf_virtchnl_completion(adapter, v_msg->v_opcode, i40evf_virtchnl_completion(adapter, v_msg->v_opcode,
v_msg->v_retval, event.msg_buf, (i40e_status)v_msg->v_retval,
event.msg_buf,
event.msg_len); event.msg_len);
if (pending != 0) if (pending != 0)
memset(event.msg_buf, 0, I40EVF_MAX_AQ_BUF_SIZE); memset(event.msg_buf, 0, I40EVF_MAX_AQ_BUF_SIZE);
...@@ -2347,7 +2349,7 @@ static netdev_features_t i40evf_fix_features(struct net_device *netdev, ...@@ -2347,7 +2349,7 @@ static netdev_features_t i40evf_fix_features(struct net_device *netdev,
struct i40evf_adapter *adapter = netdev_priv(netdev); struct i40evf_adapter *adapter = netdev_priv(netdev);
features &= ~I40EVF_VLAN_FEATURES; features &= ~I40EVF_VLAN_FEATURES;
if (adapter->vf_res->vf_offload_flags & I40E_VIRTCHNL_VF_OFFLOAD_VLAN) if (adapter->vf_res->vf_offload_flags & VIRTCHNL_VF_OFFLOAD_VLAN)
features |= I40EVF_VLAN_FEATURES; features |= I40EVF_VLAN_FEATURES;
return features; return features;
} }
...@@ -2384,8 +2386,8 @@ static int i40evf_check_reset_complete(struct i40e_hw *hw) ...@@ -2384,8 +2386,8 @@ static int i40evf_check_reset_complete(struct i40e_hw *hw)
for (i = 0; i < 100; i++) { for (i = 0; i < 100; i++) {
rstat = rd32(hw, I40E_VFGEN_RSTAT) & rstat = rd32(hw, I40E_VFGEN_RSTAT) &
I40E_VFGEN_RSTAT_VFR_STATE_MASK; I40E_VFGEN_RSTAT_VFR_STATE_MASK;
if ((rstat == I40E_VFR_VFACTIVE) || if ((rstat == VIRTCHNL_VFR_VFACTIVE) ||
(rstat == I40E_VFR_COMPLETED)) (rstat == VIRTCHNL_VFR_COMPLETED))
return 0; return 0;
usleep_range(10, 20); usleep_range(10, 20);
} }
...@@ -2401,7 +2403,7 @@ static int i40evf_check_reset_complete(struct i40e_hw *hw) ...@@ -2401,7 +2403,7 @@ static int i40evf_check_reset_complete(struct i40e_hw *hw)
**/ **/
int i40evf_process_config(struct i40evf_adapter *adapter) int i40evf_process_config(struct i40evf_adapter *adapter)
{ {
struct i40e_virtchnl_vf_resource *vfres = adapter->vf_res; struct virtchnl_vf_resource *vfres = adapter->vf_res;
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
struct i40e_vsi *vsi = &adapter->vsi; struct i40e_vsi *vsi = &adapter->vsi;
int i; int i;
...@@ -2410,7 +2412,7 @@ int i40evf_process_config(struct i40evf_adapter *adapter) ...@@ -2410,7 +2412,7 @@ int i40evf_process_config(struct i40evf_adapter *adapter)
/* got VF config message back from PF, now we can parse it */ /* got VF config message back from PF, now we can parse it */
for (i = 0; i < vfres->num_vsis; i++) { for (i = 0; i < vfres->num_vsis; i++) {
if (vfres->vsi_res[i].vsi_type == I40E_VSI_SRIOV) if (vfres->vsi_res[i].vsi_type == VIRTCHNL_VSI_SRIOV)
adapter->vsi_res = &vfres->vsi_res[i]; adapter->vsi_res = &vfres->vsi_res[i];
} }
if (!adapter->vsi_res) { if (!adapter->vsi_res) {
...@@ -2434,7 +2436,7 @@ int i40evf_process_config(struct i40evf_adapter *adapter) ...@@ -2434,7 +2436,7 @@ int i40evf_process_config(struct i40evf_adapter *adapter)
/* advertise to stack only if offloads for encapsulated packets is /* advertise to stack only if offloads for encapsulated packets is
* supported * supported
*/ */
if (vfres->vf_offload_flags & I40E_VIRTCHNL_VF_OFFLOAD_ENCAP) { if (vfres->vf_offload_flags & VIRTCHNL_VF_OFFLOAD_ENCAP) {
hw_enc_features |= NETIF_F_GSO_UDP_TUNNEL | hw_enc_features |= NETIF_F_GSO_UDP_TUNNEL |
NETIF_F_GSO_GRE | NETIF_F_GSO_GRE |
NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_GRE_CSUM |
...@@ -2445,7 +2447,7 @@ int i40evf_process_config(struct i40evf_adapter *adapter) ...@@ -2445,7 +2447,7 @@ int i40evf_process_config(struct i40evf_adapter *adapter)
0; 0;
if (!(vfres->vf_offload_flags & if (!(vfres->vf_offload_flags &
I40E_VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM)) VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM))
netdev->gso_partial_features |= netdev->gso_partial_features |=
NETIF_F_GSO_UDP_TUNNEL_CSUM; NETIF_F_GSO_UDP_TUNNEL_CSUM;
...@@ -2472,7 +2474,7 @@ int i40evf_process_config(struct i40evf_adapter *adapter) ...@@ -2472,7 +2474,7 @@ int i40evf_process_config(struct i40evf_adapter *adapter)
adapter->vsi.work_limit = I40E_DEFAULT_IRQ_WORK; adapter->vsi.work_limit = I40E_DEFAULT_IRQ_WORK;
vsi->netdev = adapter->netdev; vsi->netdev = adapter->netdev;
vsi->qs_handle = adapter->vsi_res->qset_handle; vsi->qs_handle = adapter->vsi_res->qset_handle;
if (vfres->vf_offload_flags & I40E_VIRTCHNL_VF_OFFLOAD_RSS_PF) { if (vfres->vf_offload_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF) {
adapter->rss_key_size = vfres->rss_key_size; adapter->rss_key_size = vfres->rss_key_size;
adapter->rss_lut_size = vfres->rss_lut_size; adapter->rss_lut_size = vfres->rss_lut_size;
} else { } else {
...@@ -2558,8 +2560,8 @@ static void i40evf_init_task(struct work_struct *work) ...@@ -2558,8 +2560,8 @@ static void i40evf_init_task(struct work_struct *work)
dev_err(&pdev->dev, "Unsupported PF API version %d.%d, expected %d.%d\n", dev_err(&pdev->dev, "Unsupported PF API version %d.%d, expected %d.%d\n",
adapter->pf_version.major, adapter->pf_version.major,
adapter->pf_version.minor, adapter->pf_version.minor,
I40E_VIRTCHNL_VERSION_MAJOR, VIRTCHNL_VERSION_MAJOR,
I40E_VIRTCHNL_VERSION_MINOR); VIRTCHNL_VERSION_MINOR);
goto err; goto err;
} }
err = i40evf_send_vf_config_msg(adapter); err = i40evf_send_vf_config_msg(adapter);
...@@ -2573,9 +2575,9 @@ static void i40evf_init_task(struct work_struct *work) ...@@ -2573,9 +2575,9 @@ static void i40evf_init_task(struct work_struct *work)
case __I40EVF_INIT_GET_RESOURCES: case __I40EVF_INIT_GET_RESOURCES:
/* aq msg sent, awaiting reply */ /* aq msg sent, awaiting reply */
if (!adapter->vf_res) { if (!adapter->vf_res) {
bufsz = sizeof(struct i40e_virtchnl_vf_resource) + bufsz = sizeof(struct virtchnl_vf_resource) +
(I40E_MAX_VF_VSI * (I40E_MAX_VF_VSI *
sizeof(struct i40e_virtchnl_vsi_resource)); sizeof(struct virtchnl_vsi_resource));
adapter->vf_res = kzalloc(bufsz, GFP_KERNEL); adapter->vf_res = kzalloc(bufsz, GFP_KERNEL);
if (!adapter->vf_res) if (!adapter->vf_res)
goto err; goto err;
...@@ -2606,7 +2608,7 @@ static void i40evf_init_task(struct work_struct *work) ...@@ -2606,7 +2608,7 @@ static void i40evf_init_task(struct work_struct *work)
if (i40evf_process_config(adapter)) if (i40evf_process_config(adapter))
goto err_alloc; goto err_alloc;
adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; adapter->current_op = VIRTCHNL_OP_UNKNOWN;
adapter->flags |= I40EVF_FLAG_RX_CSUM_ENABLED; adapter->flags |= I40EVF_FLAG_RX_CSUM_ENABLED;
...@@ -2644,7 +2646,7 @@ static void i40evf_init_task(struct work_struct *work) ...@@ -2644,7 +2646,7 @@ static void i40evf_init_task(struct work_struct *work)
goto err_sw_init; goto err_sw_init;
i40evf_map_rings_to_vectors(adapter); i40evf_map_rings_to_vectors(adapter);
if (adapter->vf_res->vf_offload_flags & if (adapter->vf_res->vf_offload_flags &
I40E_VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) VIRTCHNL_VF_OFFLOAD_WB_ON_ITR)
adapter->flags |= I40EVF_FLAG_WB_ON_ITR_CAPABLE; adapter->flags |= I40EVF_FLAG_WB_ON_ITR_CAPABLE;
err = i40evf_request_misc_irq(adapter); err = i40evf_request_misc_irq(adapter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment