Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 70abc798 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'qlcnic-next'



Shahed Shaikh says:

====================
This patch series containes following changes -

* TSO over IPv4 and IPv6, Tx checksum offload for VXLAN
* Rx checksum offload for VXLAN and support for .ndo_{add|del}_vxlan_port
  netdev ops.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents c65d7533 8af7b7f8
Loading
Loading
Loading
Loading
+39 −6
Original line number Original line Diff line number Diff line
@@ -38,8 +38,8 @@


#define _QLCNIC_LINUX_MAJOR 5
#define _QLCNIC_LINUX_MAJOR 5
#define _QLCNIC_LINUX_MINOR 3
#define _QLCNIC_LINUX_MINOR 3
#define _QLCNIC_LINUX_SUBVERSION 56
#define _QLCNIC_LINUX_SUBVERSION 57
#define QLCNIC_LINUX_VERSIONID  "5.3.56"
#define QLCNIC_LINUX_VERSIONID  "5.3.57"
#define QLCNIC_DRV_IDC_VER  0x01
#define QLCNIC_DRV_IDC_VER  0x01
#define QLCNIC_DRIVER_VERSION  ((_QLCNIC_LINUX_MAJOR << 16) |\
#define QLCNIC_DRIVER_VERSION  ((_QLCNIC_LINUX_MAJOR << 16) |\
		 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
		 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
@@ -169,11 +169,20 @@ struct cmd_desc_type0 {


	__le64 addr_buffer2;
	__le64 addr_buffer2;


	__le16 reference_handle;
	__le16 encap_descr;	/* 15:10 offset of outer L3 header,
				 * 9:6 number of 32bit words in outer L3 header,
				 * 5 offload outer L4 checksum,
				 * 4 offload outer L3 checksum,
				 * 3 Inner L4 type, TCP=0, UDP=1,
				 * 2 Inner L3 type, IPv4=0, IPv6=1,
				 * 1 Outer L3 type,IPv4=0, IPv6=1,
				 * 0 type of encapsulation, GRE=0, VXLAN=1
				 */
	__le16 mss;
	__le16 mss;
	u8 port_ctxid;		/* 7:4 ctxid 3:0 port */
	u8 port_ctxid;		/* 7:4 ctxid 3:0 port */
	u8 total_hdr_length;	/* LSO only : MAC+IP+TCP Hdr size */
	u8 hdr_length;		/* LSO only : MAC+IP+TCP Hdr size */
	__le16 conn_id;		/* IPSec offoad only */
	u8 outer_hdr_length;	/* Encapsulation only */
	u8 rsvd1;


	__le64 addr_buffer3;
	__le64 addr_buffer3;
	__le64 addr_buffer1;
	__le64 addr_buffer1;
@@ -183,7 +192,9 @@ struct cmd_desc_type0 {
	__le64 addr_buffer4;
	__le64 addr_buffer4;


	u8 eth_addr[ETH_ALEN];
	u8 eth_addr[ETH_ALEN];
	__le16 vlan_TCI;
	__le16 vlan_TCI;	/* In case of  encapsulation,
				 * this is for outer VLAN
				 */


} __attribute__ ((aligned(64)));
} __attribute__ ((aligned(64)));


@@ -524,6 +535,7 @@ struct qlcnic_hardware_context {
	u8 extend_lb_time;
	u8 extend_lb_time;
	u8 phys_port_id[ETH_ALEN];
	u8 phys_port_id[ETH_ALEN];
	u8 lb_mode;
	u8 lb_mode;
	u16 vxlan_port;
};
};


struct qlcnic_adapter_stats {
struct qlcnic_adapter_stats {
@@ -538,6 +550,9 @@ struct qlcnic_adapter_stats {
	u64  txbytes;
	u64  txbytes;
	u64  lrobytes;
	u64  lrobytes;
	u64  lso_frames;
	u64  lso_frames;
	u64  encap_lso_frames;
	u64  encap_tx_csummed;
	u64  encap_rx_csummed;
	u64  xmit_on;
	u64  xmit_on;
	u64  xmit_off;
	u64  xmit_off;
	u64  skb_alloc_failure;
	u64  skb_alloc_failure;
@@ -899,6 +914,10 @@ struct qlcnic_mac_vlan_list {
#define QLCNIC_FW_CAPABILITY_2_BEACON		BIT_7
#define QLCNIC_FW_CAPABILITY_2_BEACON		BIT_7
#define QLCNIC_FW_CAPABILITY_2_PER_PORT_ESWITCH_CFG	BIT_9
#define QLCNIC_FW_CAPABILITY_2_PER_PORT_ESWITCH_CFG	BIT_9


#define QLCNIC_83XX_FW_CAPAB_ENCAP_RX_OFFLOAD	BIT_0
#define QLCNIC_83XX_FW_CAPAB_ENCAP_TX_OFFLOAD	BIT_1
#define QLCNIC_83XX_FW_CAPAB_ENCAP_CKO_OFFLOAD	BIT_4

/* module types */
/* module types */
#define LINKEVENT_MODULE_NOT_PRESENT			1
#define LINKEVENT_MODULE_NOT_PRESENT			1
#define LINKEVENT_MODULE_OPTICAL_UNKNOWN		2
#define LINKEVENT_MODULE_OPTICAL_UNKNOWN		2
@@ -992,6 +1011,8 @@ struct qlcnic_ipaddr {
#define QLCNIC_APP_CHANGED_FLAGS	0x20000
#define QLCNIC_APP_CHANGED_FLAGS	0x20000
#define QLCNIC_HAS_PHYS_PORT_ID		0x40000
#define QLCNIC_HAS_PHYS_PORT_ID		0x40000
#define QLCNIC_TSS_RSS			0x80000
#define QLCNIC_TSS_RSS			0x80000
#define QLCNIC_ADD_VXLAN_PORT		0x100000
#define QLCNIC_DEL_VXLAN_PORT		0x200000


#define QLCNIC_IS_MSI_FAMILY(adapter) \
#define QLCNIC_IS_MSI_FAMILY(adapter) \
	((adapter)->flags & (QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED))
	((adapter)->flags & (QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED))
@@ -1806,6 +1827,18 @@ struct qlcnic_hardware_ops {


extern struct qlcnic_nic_template qlcnic_vf_ops;
extern struct qlcnic_nic_template qlcnic_vf_ops;


static inline bool qlcnic_encap_tx_offload(struct qlcnic_adapter *adapter)
{
	return adapter->ahw->extra_capability[0] &
	       QLCNIC_83XX_FW_CAPAB_ENCAP_TX_OFFLOAD;
}

static inline bool qlcnic_encap_rx_offload(struct qlcnic_adapter *adapter)
{
	return adapter->ahw->extra_capability[0] &
	       QLCNIC_83XX_FW_CAPAB_ENCAP_RX_OFFLOAD;
}

static inline int qlcnic_start_firmware(struct qlcnic_adapter *adapter)
static inline int qlcnic_start_firmware(struct qlcnic_adapter *adapter)
{
{
	return adapter->nic_ops->start_firmware(adapter);
	return adapter->nic_ops->start_firmware(adapter);
+2 −1
Original line number Original line Diff line number Diff line
@@ -77,7 +77,7 @@ static const struct qlcnic_mailbox_metadata qlcnic_83xx_mbx_tbl[] = {
	{QLCNIC_CMD_GET_PORT_CONFIG, 2, 2},
	{QLCNIC_CMD_GET_PORT_CONFIG, 2, 2},
	{QLCNIC_CMD_GET_LINK_STATUS, 2, 4},
	{QLCNIC_CMD_GET_LINK_STATUS, 2, 4},
	{QLCNIC_CMD_IDC_ACK, 5, 1},
	{QLCNIC_CMD_IDC_ACK, 5, 1},
	{QLCNIC_CMD_INIT_NIC_FUNC, 2, 1},
	{QLCNIC_CMD_INIT_NIC_FUNC, 3, 1},
	{QLCNIC_CMD_STOP_NIC_FUNC, 2, 1},
	{QLCNIC_CMD_STOP_NIC_FUNC, 2, 1},
	{QLCNIC_CMD_SET_LED_CONFIG, 5, 1},
	{QLCNIC_CMD_SET_LED_CONFIG, 5, 1},
	{QLCNIC_CMD_GET_LED_CONFIG, 1, 5},
	{QLCNIC_CMD_GET_LED_CONFIG, 1, 5},
@@ -87,6 +87,7 @@ static const struct qlcnic_mailbox_metadata qlcnic_83xx_mbx_tbl[] = {
	{QLCNIC_CMD_BC_EVENT_SETUP, 2, 1},
	{QLCNIC_CMD_BC_EVENT_SETUP, 2, 1},
	{QLCNIC_CMD_DCB_QUERY_CAP, 1, 2},
	{QLCNIC_CMD_DCB_QUERY_CAP, 1, 2},
	{QLCNIC_CMD_DCB_QUERY_PARAM, 1, 50},
	{QLCNIC_CMD_DCB_QUERY_PARAM, 1, 50},
	{QLCNIC_CMD_SET_INGRESS_ENCAP, 2, 1},
};
};


const u32 qlcnic_83xx_ext_reg_tbl[] = {
const u32 qlcnic_83xx_ext_reg_tbl[] = {
+2 −1
Original line number Original line Diff line number Diff line
@@ -528,8 +528,9 @@ enum qlc_83xx_ext_regs {
};
};


/* Initialize/Stop NIC command bit definitions */
/* Initialize/Stop NIC command bit definitions */
#define QLC_REGISTER_DCB_AEN		BIT_1
#define QLC_REGISTER_LB_IDC		BIT_0
#define QLC_REGISTER_LB_IDC		BIT_0
#define QLC_REGISTER_DCB_AEN		BIT_1
#define QLC_83XX_MULTI_TENANCY_INFO	BIT_29
#define QLC_INIT_FW_RESOURCES		BIT_31
#define QLC_INIT_FW_RESOURCES		BIT_31


/* 83xx funcitons */
/* 83xx funcitons */
+87 −0
Original line number Original line Diff line number Diff line
@@ -1020,10 +1020,97 @@ static int qlcnic_83xx_idc_check_state_validity(struct qlcnic_adapter *adapter,
	return 0;
	return 0;
}
}


#define QLC_83XX_ENCAP_TYPE_VXLAN	BIT_1
#define QLC_83XX_MATCH_ENCAP_ID		BIT_2
#define QLC_83XX_SET_VXLAN_UDP_DPORT	BIT_3
#define QLC_83XX_VXLAN_UDP_DPORT(PORT)	((PORT & 0xffff) << 16)

#define QLCNIC_ENABLE_INGRESS_ENCAP_PARSING 1
#define QLCNIC_DISABLE_INGRESS_ENCAP_PARSING 0

static int qlcnic_set_vxlan_port(struct qlcnic_adapter *adapter)
{
	u16 port = adapter->ahw->vxlan_port;
	struct qlcnic_cmd_args cmd;
	int ret = 0;

	memset(&cmd, 0, sizeof(cmd));

	ret = qlcnic_alloc_mbx_args(&cmd, adapter,
				    QLCNIC_CMD_INIT_NIC_FUNC);
	if (ret)
		return ret;

	cmd.req.arg[1] = QLC_83XX_MULTI_TENANCY_INFO;
	cmd.req.arg[2] = QLC_83XX_ENCAP_TYPE_VXLAN |
			 QLC_83XX_SET_VXLAN_UDP_DPORT |
			 QLC_83XX_VXLAN_UDP_DPORT(port);

	ret = qlcnic_issue_cmd(adapter, &cmd);
	if (ret)
		netdev_err(adapter->netdev,
			   "Failed to set VXLAN port %d in adapter\n",
			   port);

	qlcnic_free_mbx_args(&cmd);

	return ret;
}

static int qlcnic_set_vxlan_parsing(struct qlcnic_adapter *adapter,
				    bool state)
{
	u16 vxlan_port = adapter->ahw->vxlan_port;
	struct qlcnic_cmd_args cmd;
	int ret = 0;

	memset(&cmd, 0, sizeof(cmd));

	ret = qlcnic_alloc_mbx_args(&cmd, adapter,
				    QLCNIC_CMD_SET_INGRESS_ENCAP);
	if (ret)
		return ret;

	cmd.req.arg[1] = state ? QLCNIC_ENABLE_INGRESS_ENCAP_PARSING :
				 QLCNIC_DISABLE_INGRESS_ENCAP_PARSING;

	ret = qlcnic_issue_cmd(adapter, &cmd);
	if (ret)
		netdev_err(adapter->netdev,
			   "Failed to %s VXLAN parsing for port %d\n",
			   state ? "enable" : "disable", vxlan_port);
	else
		netdev_info(adapter->netdev,
			    "%s VXLAN parsing for port %d\n",
			    state ? "Enabled" : "Disabled", vxlan_port);

	qlcnic_free_mbx_args(&cmd);

	return ret;
}

static void qlcnic_83xx_periodic_tasks(struct qlcnic_adapter *adapter)
static void qlcnic_83xx_periodic_tasks(struct qlcnic_adapter *adapter)
{
{
	struct qlcnic_hardware_context *ahw = adapter->ahw;

	if (adapter->fhash.fnum)
	if (adapter->fhash.fnum)
		qlcnic_prune_lb_filters(adapter);
		qlcnic_prune_lb_filters(adapter);

	if (adapter->flags & QLCNIC_ADD_VXLAN_PORT) {
		if (qlcnic_set_vxlan_port(adapter))
			return;

		if (qlcnic_set_vxlan_parsing(adapter, true))
			return;

		adapter->flags &= ~QLCNIC_ADD_VXLAN_PORT;
	} else if (adapter->flags & QLCNIC_DEL_VXLAN_PORT) {
		if (qlcnic_set_vxlan_parsing(adapter, false))
			return;

		ahw->vxlan_port = 0;
		adapter->flags &= ~QLCNIC_DEL_VXLAN_PORT;
	}
}
}


/**
/**
+6 −0
Original line number Original line Diff line number Diff line
@@ -47,6 +47,12 @@ static const struct qlcnic_stats qlcnic_gstrings_stats[] = {
	{"lro_pkts", QLC_SIZEOF(stats.lro_pkts), QLC_OFF(stats.lro_pkts)},
	{"lro_pkts", QLC_SIZEOF(stats.lro_pkts), QLC_OFF(stats.lro_pkts)},
	{"lrobytes", QLC_SIZEOF(stats.lrobytes), QLC_OFF(stats.lrobytes)},
	{"lrobytes", QLC_SIZEOF(stats.lrobytes), QLC_OFF(stats.lrobytes)},
	{"lso_frames", QLC_SIZEOF(stats.lso_frames), QLC_OFF(stats.lso_frames)},
	{"lso_frames", QLC_SIZEOF(stats.lso_frames), QLC_OFF(stats.lso_frames)},
	{"encap_lso_frames", QLC_SIZEOF(stats.encap_lso_frames),
	 QLC_OFF(stats.encap_lso_frames)},
	{"encap_tx_csummed", QLC_SIZEOF(stats.encap_tx_csummed),
	 QLC_OFF(stats.encap_tx_csummed)},
	{"encap_rx_csummed", QLC_SIZEOF(stats.encap_rx_csummed),
	 QLC_OFF(stats.encap_rx_csummed)},
	{"skb_alloc_failure", QLC_SIZEOF(stats.skb_alloc_failure),
	{"skb_alloc_failure", QLC_SIZEOF(stats.skb_alloc_failure),
	 QLC_OFF(stats.skb_alloc_failure)},
	 QLC_OFF(stats.skb_alloc_failure)},
	{"mac_filter_limit_overrun", QLC_SIZEOF(stats.mac_filter_limit_overrun),
	{"mac_filter_limit_overrun", QLC_SIZEOF(stats.mac_filter_limit_overrun),
Loading