Commit b2a6c326 authored by David S. Miller's avatar David S. Miller

Merge branch 'be2net'

Sathya Perla says:

====================
be2net: patch-set

The following patch-set has two new feature additions, and a few
minor fixes and cleanups.
Pls consider applying to the net-next tree. Thanks.

v2 changes:
        a) dropped the "don't enable pause by default" patch
        b) described how the "spoof check" works in patch 1's commit log
	c) I had to update our email addresses from "@emulex" to
	   "@avagotech". I'll send a separate patch updating the
	   maintainers

Patch 1 adds support for the "spoofchk" knob for VFs.
When it is enabled, "spoof checking" is done for both MAC-address
and VLAN. For each VF, the HW ensures that the source MAC address
(or vlan) of every outgoing packet of the VF exists in the MAC-list
(or vlan-list) configured for RX filtering for that VF.
If not, the packet is dropped and an error is reported to the driver
in the TX completion.

Patch 2 improves interrupt moderation on Skyhawk-R chip by using
the EQ-DB mechanism to set a "re-arm to interrupt" delay. Currently
interrupt moderation is adjusted by calculating and configuring an
EQ-delay every second. This is done via a FW-cmd. This patch uses
the EQ_DB facility to calculate and set the interrupt delay every 1ms.
This helps moderating interrupts better when the traffic is bursty.

Patch 3 adds L3/L4 error accounting to BE3 VFs, by passing L3/4 error
packets to the network stack.

Patch 4 adds an extra FW-cmd error value check in the driver to identify
an "out of vlan filters" scenario.

Patch 5 stops enabling pause by default as this setting fails in
some HW-configs where priority pause is enabled in FW. If the user
tries to do the same, an appropriate error is returned via ethtool.

Patch 5 posts the full RXQ in be_open() to prevent packet drops due to
bursty traffic when the interface is enabled.

Patch 6 refactors the be_check_ufi_compatibility() routine, that checks
to see if a UFI file meant for a lower rev of a chip is being flashed
on a higher rev, to make it simpler.

Patch 7 replaces the usage of !be_physfn() macro with be_virtfn()
that is already avialble in the driver.

Patch 8 updates the year in the copyright text to 2015.

Path 9 bumps up the driver version to 10.6.02.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 1a676d2b 029e9330
/* /*
* Copyright (C) 2005 - 2014 Emulex * Copyright (C) 2005 - 2015 Emulex
* All rights reserved. * All rights reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#include "be_hw.h" #include "be_hw.h"
#include "be_roce.h" #include "be_roce.h"
#define DRV_VER "10.6.0.1" #define DRV_VER "10.6.0.2"
#define DRV_NAME "be2net" #define DRV_NAME "be2net"
#define BE_NAME "Emulex BladeEngine2" #define BE_NAME "Emulex BladeEngine2"
#define BE3_NAME "Emulex BladeEngine3" #define BE3_NAME "Emulex BladeEngine3"
...@@ -366,6 +366,7 @@ struct be_vf_cfg { ...@@ -366,6 +366,7 @@ struct be_vf_cfg {
u32 tx_rate; u32 tx_rate;
u32 plink_tracking; u32 plink_tracking;
u32 privileges; u32 privileges;
bool spoofchk;
}; };
enum vf_state { enum vf_state {
...@@ -804,6 +805,7 @@ bool be_pause_supported(struct be_adapter *adapter); ...@@ -804,6 +805,7 @@ bool be_pause_supported(struct be_adapter *adapter);
u32 be_get_fw_log_level(struct be_adapter *adapter); u32 be_get_fw_log_level(struct be_adapter *adapter);
int be_update_queues(struct be_adapter *adapter); int be_update_queues(struct be_adapter *adapter);
int be_poll(struct napi_struct *napi, int budget); int be_poll(struct napi_struct *napi, int budget);
void be_eqd_update(struct be_adapter *adapter, bool force_update);
/* /*
* internal function to initialize-cleanup roce device. * internal function to initialize-cleanup roce device.
......
/* /*
* Copyright (C) 2005 - 2014 Emulex * Copyright (C) 2005 - 2015 Emulex
* All rights reserved. * All rights reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
...@@ -140,6 +140,7 @@ static bool be_skip_err_log(u8 opcode, u16 base_status, u16 addl_status) ...@@ -140,6 +140,7 @@ static bool be_skip_err_log(u8 opcode, u16 base_status, u16 addl_status)
if (base_status == MCC_STATUS_NOT_SUPPORTED || if (base_status == MCC_STATUS_NOT_SUPPORTED ||
base_status == MCC_STATUS_ILLEGAL_REQUEST || base_status == MCC_STATUS_ILLEGAL_REQUEST ||
addl_status == MCC_ADDL_STATUS_TOO_MANY_INTERFACES || addl_status == MCC_ADDL_STATUS_TOO_MANY_INTERFACES ||
addl_status == MCC_ADDL_STATUS_INSUFFICIENT_VLANS ||
(opcode == OPCODE_COMMON_WRITE_FLASHROM && (opcode == OPCODE_COMMON_WRITE_FLASHROM &&
(base_status == MCC_STATUS_ILLEGAL_FIELD || (base_status == MCC_STATUS_ILLEGAL_FIELD ||
addl_status == MCC_ADDL_STATUS_FLASH_IMAGE_CRC_MISMATCH))) addl_status == MCC_ADDL_STATUS_FLASH_IMAGE_CRC_MISMATCH)))
...@@ -1457,7 +1458,7 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, u32 en_flags, ...@@ -1457,7 +1458,7 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, u32 en_flags,
*if_handle = le32_to_cpu(resp->interface_id); *if_handle = le32_to_cpu(resp->interface_id);
/* Hack to retrieve VF's pmac-id on BE3 */ /* Hack to retrieve VF's pmac-id on BE3 */
if (BE3_chip(adapter) && !be_physfn(adapter)) if (BE3_chip(adapter) && be_virtfn(adapter))
adapter->pmac_id[0] = le32_to_cpu(resp->pmac_id); adapter->pmac_id[0] = le32_to_cpu(resp->pmac_id);
} }
return status; return status;
...@@ -3153,7 +3154,7 @@ int be_cmd_set_mac(struct be_adapter *adapter, u8 *mac, int if_id, u32 dom) ...@@ -3153,7 +3154,7 @@ int be_cmd_set_mac(struct be_adapter *adapter, u8 *mac, int if_id, u32 dom)
} }
int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid, int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
u32 domain, u16 intf_id, u16 hsw_mode) u32 domain, u16 intf_id, u16 hsw_mode, u8 spoofchk)
{ {
struct be_mcc_wrb *wrb; struct be_mcc_wrb *wrb;
struct be_cmd_req_set_hsw_config *req; struct be_cmd_req_set_hsw_config *req;
...@@ -3189,6 +3190,14 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid, ...@@ -3189,6 +3190,14 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
ctxt, hsw_mode); ctxt, hsw_mode);
} }
/* Enable/disable both mac and vlan spoof checking */
if (!BEx_chip(adapter) && spoofchk) {
AMAP_SET_BITS(struct amap_set_hsw_context, mac_spoofchk,
ctxt, spoofchk);
AMAP_SET_BITS(struct amap_set_hsw_context, vlan_spoofchk,
ctxt, spoofchk);
}
be_dws_cpu_to_le(req->context, sizeof(req->context)); be_dws_cpu_to_le(req->context, sizeof(req->context));
status = be_mcc_notify_wait(adapter); status = be_mcc_notify_wait(adapter);
...@@ -3199,7 +3208,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid, ...@@ -3199,7 +3208,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
/* Get Hyper switch config */ /* Get Hyper switch config */
int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
u32 domain, u16 intf_id, u8 *mode) u32 domain, u16 intf_id, u8 *mode, bool *spoofchk)
{ {
struct be_mcc_wrb *wrb; struct be_mcc_wrb *wrb;
struct be_cmd_req_get_hsw_config *req; struct be_cmd_req_get_hsw_config *req;
...@@ -3247,6 +3256,10 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, ...@@ -3247,6 +3256,10 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
if (mode) if (mode)
*mode = AMAP_GET_BITS(struct amap_get_hsw_resp_context, *mode = AMAP_GET_BITS(struct amap_get_hsw_resp_context,
port_fwd_type, &resp->context); port_fwd_type, &resp->context);
if (spoofchk)
*spoofchk =
AMAP_GET_BITS(struct amap_get_hsw_resp_context,
spoofchk, &resp->context);
} }
err: err:
...@@ -3258,7 +3271,7 @@ static bool be_is_wol_excluded(struct be_adapter *adapter) ...@@ -3258,7 +3271,7 @@ static bool be_is_wol_excluded(struct be_adapter *adapter)
{ {
struct pci_dev *pdev = adapter->pdev; struct pci_dev *pdev = adapter->pdev;
if (!be_physfn(adapter)) if (be_virtfn(adapter))
return true; return true;
switch (pdev->subsystem_device) { switch (pdev->subsystem_device) {
......
/* /*
* Copyright (C) 2005 - 2014 Emulex * Copyright (C) 2005 - 2015 Emulex
* All rights reserved. * All rights reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
...@@ -65,7 +65,8 @@ enum mcc_base_status { ...@@ -65,7 +65,8 @@ enum mcc_base_status {
enum mcc_addl_status { enum mcc_addl_status {
MCC_ADDL_STATUS_INSUFFICIENT_RESOURCES = 0x16, MCC_ADDL_STATUS_INSUFFICIENT_RESOURCES = 0x16,
MCC_ADDL_STATUS_FLASH_IMAGE_CRC_MISMATCH = 0x4d, MCC_ADDL_STATUS_FLASH_IMAGE_CRC_MISMATCH = 0x4d,
MCC_ADDL_STATUS_TOO_MANY_INTERFACES = 0x4a MCC_ADDL_STATUS_TOO_MANY_INTERFACES = 0x4a,
MCC_ADDL_STATUS_INSUFFICIENT_VLANS = 0xab
}; };
#define CQE_BASE_STATUS_MASK 0xFFFF #define CQE_BASE_STATUS_MASK 0xFFFF
...@@ -1109,10 +1110,6 @@ struct be_cmd_req_query_fw_cfg { ...@@ -1109,10 +1110,6 @@ struct be_cmd_req_query_fw_cfg {
u32 rsvd[31]; u32 rsvd[31];
}; };
/* ASIC revisions */
#define ASIC_REV_B0 0x10
#define ASIC_REV_P2 0x11
struct be_cmd_resp_query_fw_cfg { struct be_cmd_resp_query_fw_cfg {
struct be_cmd_resp_hdr hdr; struct be_cmd_resp_hdr hdr;
u32 be_config_number; u32 be_config_number;
...@@ -1745,18 +1742,24 @@ struct be_cmd_req_set_mac_list { ...@@ -1745,18 +1742,24 @@ struct be_cmd_req_set_mac_list {
#define PORT_FWD_TYPE_VEPA 0x3 #define PORT_FWD_TYPE_VEPA 0x3
#define PORT_FWD_TYPE_VEB 0x2 #define PORT_FWD_TYPE_VEB 0x2
#define ENABLE_MAC_SPOOFCHK 0x2
#define DISABLE_MAC_SPOOFCHK 0x3
struct amap_set_hsw_context { struct amap_set_hsw_context {
u8 interface_id[16]; u8 interface_id[16];
u8 rsvd0[14]; u8 rsvd0[8];
u8 mac_spoofchk[2];
u8 rsvd1[4];
u8 pvid_valid; u8 pvid_valid;
u8 pport; u8 pport;
u8 rsvd1[6]; u8 rsvd2[6];
u8 port_fwd_type[3]; u8 port_fwd_type[3];
u8 rsvd2[7]; u8 rsvd3[5];
u8 vlan_spoofchk[2];
u8 pvid[16]; u8 pvid[16];
u8 rsvd3[32];
u8 rsvd4[32]; u8 rsvd4[32];
u8 rsvd5[32]; u8 rsvd5[32];
u8 rsvd6[32];
} __packed; } __packed;
struct be_cmd_req_set_hsw_config { struct be_cmd_req_set_hsw_config {
...@@ -1774,11 +1777,13 @@ struct amap_get_hsw_req_context { ...@@ -1774,11 +1777,13 @@ struct amap_get_hsw_req_context {
struct amap_get_hsw_resp_context { struct amap_get_hsw_resp_context {
u8 rsvd0[6]; u8 rsvd0[6];
u8 port_fwd_type[3]; u8 port_fwd_type[3];
u8 rsvd1[7]; u8 rsvd1[5];
u8 spoofchk;
u8 rsvd2;
u8 pvid[16]; u8 pvid[16];
u8 rsvd2[32];
u8 rsvd3[32]; u8 rsvd3[32];
u8 rsvd4[32]; u8 rsvd4[32];
u8 rsvd5[32];
} __packed; } __packed;
struct be_cmd_req_get_hsw_config { struct be_cmd_req_get_hsw_config {
...@@ -2334,9 +2339,9 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, u8 mac_count, ...@@ -2334,9 +2339,9 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, u8 mac_count,
u32 domain); u32 domain);
int be_cmd_set_mac(struct be_adapter *adapter, u8 *mac, int if_id, u32 dom); int be_cmd_set_mac(struct be_adapter *adapter, u8 *mac, int if_id, u32 dom);
int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid, u32 domain, int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid, u32 domain,
u16 intf_id, u16 hsw_mode); u16 intf_id, u16 hsw_mode, u8 spoofchk);
int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, u32 domain, int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, u32 domain,
u16 intf_id, u8 *mode); u16 intf_id, u8 *mode, bool *spoofchk);
int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter); int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter);
int be_cmd_set_fw_log_level(struct be_adapter *adapter, u32 level); int be_cmd_set_fw_log_level(struct be_adapter *adapter, u32 level);
int be_cmd_get_fw_log_level(struct be_adapter *adapter); int be_cmd_get_fw_log_level(struct be_adapter *adapter);
......
/* /*
* Copyright (C) 2005 - 2014 Emulex * Copyright (C) 2005 - 2015 Emulex
* All rights reserved. * All rights reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
...@@ -368,6 +368,14 @@ static int be_set_coalesce(struct net_device *netdev, ...@@ -368,6 +368,14 @@ static int be_set_coalesce(struct net_device *netdev,
aic++; aic++;
} }
/* For Skyhawk, the EQD setting happens via EQ_DB when AIC is enabled.
* When AIC is disabled, persistently force set EQD value via the
* FW cmd, so that we don't have to calculate the delay multiplier
* encode value each time EQ_DB is rung
*/
if (!et->use_adaptive_rx_coalesce && skyhawk_chip(adapter))
be_eqd_update(adapter, true);
return 0; return 0;
} }
......
/* /*
* Copyright (C) 2005 - 2014 Emulex * Copyright (C) 2005 - 2015 Emulex
* All rights reserved. * All rights reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
...@@ -132,6 +132,18 @@ ...@@ -132,6 +132,18 @@
#define DB_EQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */ #define DB_EQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */
/* Rearm bit */ /* Rearm bit */
#define DB_EQ_REARM_SHIFT (29) /* bit 29 */ #define DB_EQ_REARM_SHIFT (29) /* bit 29 */
/* Rearm to interrupt delay encoding */
#define DB_EQ_R2I_DLY_SHIFT (30) /* bits 30 - 31 */
/* Rearm to interrupt (R2I) delay multiplier encoding represents 3 different
* values configured in CEV_REARM2IRPT_DLY_MULT_CSR register. This value is
* programmed by host driver while ringing an EQ doorbell(EQ_DB) if a delay
* between rearming the EQ and next interrupt on this EQ is desired.
*/
#define R2I_DLY_ENC_0 0 /* No delay */
#define R2I_DLY_ENC_1 1 /* maps to 160us EQ delay */
#define R2I_DLY_ENC_2 2 /* maps to 96us EQ delay */
#define R2I_DLY_ENC_3 3 /* maps to 48us EQ delay */
/********* Compl Q door bell *************/ /********* Compl Q door bell *************/
#define DB_CQ_OFFSET 0x120 #define DB_CQ_OFFSET 0x120
......
This diff is collapsed.
/* /*
* Copyright (C) 2005 - 2014 Emulex * Copyright (C) 2005 - 2015 Emulex
* All rights reserved. * All rights reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
......
/* /*
* Copyright (C) 2005 - 2014 Emulex * Copyright (C) 2005 - 2015 Emulex
* All rights reserved. * All rights reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
......
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