aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-01-15 18:52:07 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-15 18:52:07 -0500
commite96a41ebde3b66dbb59d3ffa0a38dff6e5ca25a9 (patch)
tree61d39e14420b228f89e7dd60b1c7983a6a80a491
parent286ab723d4b83d37deb4017008ef1444a95cfb0d (diff)
parent5e5110183bcea260c70e1b04c0c04c1223f4763b (diff)
Merge branch 'be2net'
Sathya Perla says: ==================== be2net: patch set The following patch set is best suited for net-next as it contains code-cleanup, support for newer versions of FW cmds and a few minor fixes. Please apply. Thanks! ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/emulex/benet/be.h7
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c178
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.h33
-rw-r--r--drivers/net/ethernet/emulex/benet/be_ethtool.c73
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c137
5 files changed, 227 insertions, 201 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index 4ccaf9af6fc9..8d09615da585 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -34,7 +34,7 @@
34#include "be_hw.h" 34#include "be_hw.h"
35#include "be_roce.h" 35#include "be_roce.h"
36 36
37#define DRV_VER "4.9.224.0u" 37#define DRV_VER "10.0.600.0u"
38#define DRV_NAME "be2net" 38#define DRV_NAME "be2net"
39#define BE_NAME "Emulex BladeEngine2" 39#define BE_NAME "Emulex BladeEngine2"
40#define BE3_NAME "Emulex BladeEngine3" 40#define BE3_NAME "Emulex BladeEngine3"
@@ -42,7 +42,7 @@
42#define OC_NAME_BE OC_NAME "(be3)" 42#define OC_NAME_BE OC_NAME "(be3)"
43#define OC_NAME_LANCER OC_NAME "(Lancer)" 43#define OC_NAME_LANCER OC_NAME "(Lancer)"
44#define OC_NAME_SH OC_NAME "(Skyhawk)" 44#define OC_NAME_SH OC_NAME "(Skyhawk)"
45#define DRV_DESC "Emulex OneConnect 10Gbps NIC Driver" 45#define DRV_DESC "Emulex OneConnect NIC Driver"
46 46
47#define BE_VENDOR_ID 0x19a2 47#define BE_VENDOR_ID 0x19a2
48#define EMULEX_VENDOR_ID 0x10df 48#define EMULEX_VENDOR_ID 0x10df
@@ -283,7 +283,6 @@ struct be_rx_compl_info {
283 u32 rss_hash; 283 u32 rss_hash;
284 u16 vlan_tag; 284 u16 vlan_tag;
285 u16 pkt_size; 285 u16 pkt_size;
286 u16 rxq_idx;
287 u16 port; 286 u16 port;
288 u8 vlanf; 287 u8 vlanf;
289 u8 num_rcvd; 288 u8 num_rcvd;
@@ -493,7 +492,7 @@ struct be_adapter {
493 u16 pvid; 492 u16 pvid;
494 struct phy_info phy; 493 struct phy_info phy;
495 u8 wol_cap; 494 u8 wol_cap;
496 bool wol; 495 bool wol_en;
497 u32 uc_macs; /* Count of secondary UC MAC programmed */ 496 u32 uc_macs; /* Count of secondary UC MAC programmed */
498 u16 asic_rev; 497 u16 asic_rev;
499 u16 qnq_vid; 498 u16 qnq_vid;
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 94c35c8d799d..48076a6370c3 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -1101,23 +1101,22 @@ static int be_cmd_mccq_ext_create(struct be_adapter *adapter,
1101 OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req), wrb, NULL); 1101 OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req), wrb, NULL);
1102 1102
1103 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); 1103 req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
1104 if (lancer_chip(adapter)) { 1104 if (BEx_chip(adapter)) {
1105 req->hdr.version = 1;
1106 req->cq_id = cpu_to_le16(cq->id);
1107
1108 AMAP_SET_BITS(struct amap_mcc_context_lancer, ring_size, ctxt,
1109 be_encoded_q_len(mccq->len));
1110 AMAP_SET_BITS(struct amap_mcc_context_lancer, valid, ctxt, 1);
1111 AMAP_SET_BITS(struct amap_mcc_context_lancer, async_cq_id,
1112 ctxt, cq->id);
1113 AMAP_SET_BITS(struct amap_mcc_context_lancer, async_cq_valid,
1114 ctxt, 1);
1115
1116 } else {
1117 AMAP_SET_BITS(struct amap_mcc_context_be, valid, ctxt, 1); 1105 AMAP_SET_BITS(struct amap_mcc_context_be, valid, ctxt, 1);
1118 AMAP_SET_BITS(struct amap_mcc_context_be, ring_size, ctxt, 1106 AMAP_SET_BITS(struct amap_mcc_context_be, ring_size, ctxt,
1119 be_encoded_q_len(mccq->len)); 1107 be_encoded_q_len(mccq->len));
1120 AMAP_SET_BITS(struct amap_mcc_context_be, cq_id, ctxt, cq->id); 1108 AMAP_SET_BITS(struct amap_mcc_context_be, cq_id, ctxt, cq->id);
1109 } else {
1110 req->hdr.version = 1;
1111 req->cq_id = cpu_to_le16(cq->id);
1112
1113 AMAP_SET_BITS(struct amap_mcc_context_v1, ring_size, ctxt,
1114 be_encoded_q_len(mccq->len));
1115 AMAP_SET_BITS(struct amap_mcc_context_v1, valid, ctxt, 1);
1116 AMAP_SET_BITS(struct amap_mcc_context_v1, async_cq_id,
1117 ctxt, cq->id);
1118 AMAP_SET_BITS(struct amap_mcc_context_v1, async_cq_valid,
1119 ctxt, 1);
1121 } 1120 }
1122 1121
1123 /* Subscribe to Link State and Group 5 Events(bits 1 and 5 set) */ 1122 /* Subscribe to Link State and Group 5 Events(bits 1 and 5 set) */
@@ -1187,7 +1186,7 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
1187 int status; 1186 int status;
1188 1187
1189 status = be_cmd_mccq_ext_create(adapter, mccq, cq); 1188 status = be_cmd_mccq_ext_create(adapter, mccq, cq);
1190 if (status && !lancer_chip(adapter)) { 1189 if (status && BEx_chip(adapter)) {
1191 dev_warn(&adapter->pdev->dev, "Upgrade to F/W ver 2.102.235.0 " 1190 dev_warn(&adapter->pdev->dev, "Upgrade to F/W ver 2.102.235.0 "
1192 "or newer to avoid conflicting priorities between NIC " 1191 "or newer to avoid conflicting priorities between NIC "
1193 "and FCoE traffic"); 1192 "and FCoE traffic");
@@ -2692,6 +2691,13 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
2692 struct be_cmd_resp_get_fn_privileges *resp = 2691 struct be_cmd_resp_get_fn_privileges *resp =
2693 embedded_payload(wrb); 2692 embedded_payload(wrb);
2694 *privilege = le32_to_cpu(resp->privilege_mask); 2693 *privilege = le32_to_cpu(resp->privilege_mask);
2694
2695 /* In UMC mode FW does not return right privileges.
2696 * Override with correct privilege equivalent to PF.
2697 */
2698 if (BEx_chip(adapter) && be_is_mc(adapter) &&
2699 be_physfn(adapter))
2700 *privilege = MAX_PRIVILEGES;
2695 } 2701 }
2696 2702
2697err: 2703err:
@@ -2736,7 +2742,8 @@ err:
2736 * If pmac_id is returned, pmac_id_valid is returned as true 2742 * If pmac_id is returned, pmac_id_valid is returned as true
2737 */ 2743 */
2738int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac, 2744int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
2739 bool *pmac_id_valid, u32 *pmac_id, u8 domain) 2745 bool *pmac_id_valid, u32 *pmac_id, u32 if_handle,
2746 u8 domain)
2740{ 2747{
2741 struct be_mcc_wrb *wrb; 2748 struct be_mcc_wrb *wrb;
2742 struct be_cmd_req_get_mac_list *req; 2749 struct be_cmd_req_get_mac_list *req;
@@ -2774,7 +2781,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
2774 req->mac_type = MAC_ADDRESS_TYPE_NETWORK; 2781 req->mac_type = MAC_ADDRESS_TYPE_NETWORK;
2775 if (*pmac_id_valid) { 2782 if (*pmac_id_valid) {
2776 req->mac_id = cpu_to_le32(*pmac_id); 2783 req->mac_id = cpu_to_le32(*pmac_id);
2777 req->iface_id = cpu_to_le16(adapter->if_handle); 2784 req->iface_id = cpu_to_le16(if_handle);
2778 req->perm_override = 0; 2785 req->perm_override = 0;
2779 } else { 2786 } else {
2780 req->perm_override = 1; 2787 req->perm_override = 1;
@@ -2827,17 +2834,21 @@ out:
2827 return status; 2834 return status;
2828} 2835}
2829 2836
2830int be_cmd_get_active_mac(struct be_adapter *adapter, u32 curr_pmac_id, u8 *mac) 2837int be_cmd_get_active_mac(struct be_adapter *adapter, u32 curr_pmac_id, u8 *mac,
2838 u32 if_handle, bool active, u32 domain)
2831{ 2839{
2832 bool active = true;
2833 2840
2841 if (!active)
2842 be_cmd_get_mac_from_list(adapter, mac, &active, &curr_pmac_id,
2843 if_handle, domain);
2834 if (BEx_chip(adapter)) 2844 if (BEx_chip(adapter))
2835 return be_cmd_mac_addr_query(adapter, mac, false, 2845 return be_cmd_mac_addr_query(adapter, mac, false,
2836 adapter->if_handle, curr_pmac_id); 2846 if_handle, curr_pmac_id);
2837 else 2847 else
2838 /* Fetch the MAC address using pmac_id */ 2848 /* Fetch the MAC address using pmac_id */
2839 return be_cmd_get_mac_from_list(adapter, mac, &active, 2849 return be_cmd_get_mac_from_list(adapter, mac, &active,
2840 &curr_pmac_id, 0); 2850 &curr_pmac_id,
2851 if_handle, domain);
2841} 2852}
2842 2853
2843int be_cmd_get_perm_mac(struct be_adapter *adapter, u8 *mac) 2854int be_cmd_get_perm_mac(struct be_adapter *adapter, u8 *mac)
@@ -2856,7 +2867,7 @@ int be_cmd_get_perm_mac(struct be_adapter *adapter, u8 *mac)
2856 adapter->if_handle, 0); 2867 adapter->if_handle, 0);
2857 } else { 2868 } else {
2858 status = be_cmd_get_mac_from_list(adapter, mac, &pmac_valid, 2869 status = be_cmd_get_mac_from_list(adapter, mac, &pmac_valid,
2859 NULL, 0); 2870 NULL, adapter->if_handle, 0);
2860 } 2871 }
2861 2872
2862 return status; 2873 return status;
@@ -2917,7 +2928,8 @@ int be_cmd_set_mac(struct be_adapter *adapter, u8 *mac, int if_id, u32 dom)
2917 int status; 2928 int status;
2918 2929
2919 status = be_cmd_get_mac_from_list(adapter, old_mac, &active_mac, 2930 status = be_cmd_get_mac_from_list(adapter, old_mac, &active_mac,
2920 &pmac_id, dom); 2931 &pmac_id, if_id, dom);
2932
2921 if (!status && active_mac) 2933 if (!status && active_mac)
2922 be_cmd_pmac_del(adapter, if_id, pmac_id, dom); 2934 be_cmd_pmac_del(adapter, if_id, pmac_id, dom);
2923 2935
@@ -2997,7 +3009,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
2997 ctxt, intf_id); 3009 ctxt, intf_id);
2998 AMAP_SET_BITS(struct amap_get_hsw_req_context, pvid_valid, ctxt, 1); 3010 AMAP_SET_BITS(struct amap_get_hsw_req_context, pvid_valid, ctxt, 1);
2999 3011
3000 if (!BEx_chip(adapter)) { 3012 if (!BEx_chip(adapter) && mode) {
3001 AMAP_SET_BITS(struct amap_get_hsw_req_context, interface_id, 3013 AMAP_SET_BITS(struct amap_get_hsw_req_context, interface_id,
3002 ctxt, adapter->hba_port_num); 3014 ctxt, adapter->hba_port_num);
3003 AMAP_SET_BITS(struct amap_get_hsw_req_context, pport, ctxt, 1); 3015 AMAP_SET_BITS(struct amap_get_hsw_req_context, pport, ctxt, 1);
@@ -3028,14 +3040,16 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
3028{ 3040{
3029 struct be_mcc_wrb *wrb; 3041 struct be_mcc_wrb *wrb;
3030 struct be_cmd_req_acpi_wol_magic_config_v1 *req; 3042 struct be_cmd_req_acpi_wol_magic_config_v1 *req;
3031 int status; 3043 int status = 0;
3032 int payload_len = sizeof(*req);
3033 struct be_dma_mem cmd; 3044 struct be_dma_mem cmd;
3034 3045
3035 if (!be_cmd_allowed(adapter, OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, 3046 if (!be_cmd_allowed(adapter, OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
3036 CMD_SUBSYSTEM_ETH)) 3047 CMD_SUBSYSTEM_ETH))
3037 return -EPERM; 3048 return -EPERM;
3038 3049
3050 if (be_is_wol_excluded(adapter))
3051 return status;
3052
3039 if (mutex_lock_interruptible(&adapter->mbox_lock)) 3053 if (mutex_lock_interruptible(&adapter->mbox_lock))
3040 return -1; 3054 return -1;
3041 3055
@@ -3060,7 +3074,7 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
3060 3074
3061 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, 3075 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
3062 OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, 3076 OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
3063 payload_len, wrb, &cmd); 3077 sizeof(*req), wrb, &cmd);
3064 3078
3065 req->hdr.version = 1; 3079 req->hdr.version = 1;
3066 req->query_options = BE_GET_WOL_CAP; 3080 req->query_options = BE_GET_WOL_CAP;
@@ -3070,13 +3084,9 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
3070 struct be_cmd_resp_acpi_wol_magic_config_v1 *resp; 3084 struct be_cmd_resp_acpi_wol_magic_config_v1 *resp;
3071 resp = (struct be_cmd_resp_acpi_wol_magic_config_v1 *) cmd.va; 3085 resp = (struct be_cmd_resp_acpi_wol_magic_config_v1 *) cmd.va;
3072 3086
3073 /* the command could succeed misleadingly on old f/w
3074 * which is not aware of the V1 version. fake an error. */
3075 if (resp->hdr.response_length < payload_len) {
3076 status = -1;
3077 goto err;
3078 }
3079 adapter->wol_cap = resp->wol_settings; 3087 adapter->wol_cap = resp->wol_settings;
3088 if (adapter->wol_cap & BE_WOL_CAP)
3089 adapter->wol_en = true;
3080 } 3090 }
3081err: 3091err:
3082 mutex_unlock(&adapter->mbox_lock); 3092 mutex_unlock(&adapter->mbox_lock);
@@ -3085,6 +3095,76 @@ err:
3085 return status; 3095 return status;
3086 3096
3087} 3097}
3098
3099int be_cmd_set_fw_log_level(struct be_adapter *adapter, u32 level)
3100{
3101 struct be_dma_mem extfat_cmd;
3102 struct be_fat_conf_params *cfgs;
3103 int status;
3104 int i, j;
3105
3106 memset(&extfat_cmd, 0, sizeof(struct be_dma_mem));
3107 extfat_cmd.size = sizeof(struct be_cmd_resp_get_ext_fat_caps);
3108 extfat_cmd.va = pci_alloc_consistent(adapter->pdev, extfat_cmd.size,
3109 &extfat_cmd.dma);
3110 if (!extfat_cmd.va)
3111 return -ENOMEM;
3112
3113 status = be_cmd_get_ext_fat_capabilites(adapter, &extfat_cmd);
3114 if (status)
3115 goto err;
3116
3117 cfgs = (struct be_fat_conf_params *)
3118 (extfat_cmd.va + sizeof(struct be_cmd_resp_hdr));
3119 for (i = 0; i < le32_to_cpu(cfgs->num_modules); i++) {
3120 u32 num_modes = le32_to_cpu(cfgs->module[i].num_modes);
3121 for (j = 0; j < num_modes; j++) {
3122 if (cfgs->module[i].trace_lvl[j].mode == MODE_UART)
3123 cfgs->module[i].trace_lvl[j].dbg_lvl =
3124 cpu_to_le32(level);
3125 }
3126 }
3127
3128 status = be_cmd_set_ext_fat_capabilites(adapter, &extfat_cmd, cfgs);
3129err:
3130 pci_free_consistent(adapter->pdev, extfat_cmd.size, extfat_cmd.va,
3131 extfat_cmd.dma);
3132 return status;
3133}
3134
3135int be_cmd_get_fw_log_level(struct be_adapter *adapter)
3136{
3137 struct be_dma_mem extfat_cmd;
3138 struct be_fat_conf_params *cfgs;
3139 int status, j;
3140 int level = 0;
3141
3142 memset(&extfat_cmd, 0, sizeof(struct be_dma_mem));
3143 extfat_cmd.size = sizeof(struct be_cmd_resp_get_ext_fat_caps);
3144 extfat_cmd.va = pci_alloc_consistent(adapter->pdev, extfat_cmd.size,
3145 &extfat_cmd.dma);
3146
3147 if (!extfat_cmd.va) {
3148 dev_err(&adapter->pdev->dev, "%s: Memory allocation failure\n",
3149 __func__);
3150 goto err;
3151 }
3152
3153 status = be_cmd_get_ext_fat_capabilites(adapter, &extfat_cmd);
3154 if (!status) {
3155 cfgs = (struct be_fat_conf_params *)(extfat_cmd.va +
3156 sizeof(struct be_cmd_resp_hdr));
3157 for (j = 0; j < le32_to_cpu(cfgs->module[0].num_modes); j++) {
3158 if (cfgs->module[0].trace_lvl[j].mode == MODE_UART)
3159 level = cfgs->module[0].trace_lvl[j].dbg_lvl;
3160 }
3161 }
3162 pci_free_consistent(adapter->pdev, extfat_cmd.size, extfat_cmd.va,
3163 extfat_cmd.dma);
3164err:
3165 return level;
3166}
3167
3088int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter, 3168int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter,
3089 struct be_dma_mem *cmd) 3169 struct be_dma_mem *cmd)
3090{ 3170{
@@ -3609,6 +3689,40 @@ int be_cmd_intr_set(struct be_adapter *adapter, bool intr_enable)
3609 return status; 3689 return status;
3610} 3690}
3611 3691
3692/* Uses MBOX */
3693int be_cmd_get_active_profile(struct be_adapter *adapter, u16 *profile_id)
3694{
3695 struct be_cmd_req_get_active_profile *req;
3696 struct be_mcc_wrb *wrb;
3697 int status;
3698
3699 if (mutex_lock_interruptible(&adapter->mbox_lock))
3700 return -1;
3701
3702 wrb = wrb_from_mbox(adapter);
3703 if (!wrb) {
3704 status = -EBUSY;
3705 goto err;
3706 }
3707
3708 req = embedded_payload(wrb);
3709
3710 be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3711 OPCODE_COMMON_GET_ACTIVE_PROFILE, sizeof(*req),
3712 wrb, NULL);
3713
3714 status = be_mbox_notify_wait(adapter);
3715 if (!status) {
3716 struct be_cmd_resp_get_active_profile *resp =
3717 embedded_payload(wrb);
3718 *profile_id = le16_to_cpu(resp->active_profile_id);
3719 }
3720
3721err:
3722 mutex_unlock(&adapter->mbox_lock);
3723 return status;
3724}
3725
3612int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload, 3726int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
3613 int wrb_payload_size, u16 *cmd_status, u16 *ext_status) 3727 int wrb_payload_size, u16 *cmd_status, u16 *ext_status)
3614{ 3728{
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index 0075686276aa..fc4e076dc202 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -216,6 +216,7 @@ struct be_mcc_mailbox {
216#define OPCODE_COMMON_GET_FUNC_CONFIG 160 216#define OPCODE_COMMON_GET_FUNC_CONFIG 160
217#define OPCODE_COMMON_GET_PROFILE_CONFIG 164 217#define OPCODE_COMMON_GET_PROFILE_CONFIG 164
218#define OPCODE_COMMON_SET_PROFILE_CONFIG 165 218#define OPCODE_COMMON_SET_PROFILE_CONFIG 165
219#define OPCODE_COMMON_GET_ACTIVE_PROFILE 167
219#define OPCODE_COMMON_SET_HSW_CONFIG 153 220#define OPCODE_COMMON_SET_HSW_CONFIG 153
220#define OPCODE_COMMON_GET_FN_PRIVILEGES 170 221#define OPCODE_COMMON_GET_FN_PRIVILEGES 170
221#define OPCODE_COMMON_READ_OBJECT 171 222#define OPCODE_COMMON_READ_OBJECT 171
@@ -452,7 +453,7 @@ struct amap_mcc_context_be {
452 u8 rsvd2[32]; 453 u8 rsvd2[32];
453} __packed; 454} __packed;
454 455
455struct amap_mcc_context_lancer { 456struct amap_mcc_context_v1 {
456 u8 async_cq_id[16]; 457 u8 async_cq_id[16];
457 u8 ring_size[4]; 458 u8 ring_size[4];
458 u8 rsvd0[12]; 459 u8 rsvd0[12];
@@ -476,7 +477,7 @@ struct be_cmd_req_mcc_ext_create {
476 u16 num_pages; 477 u16 num_pages;
477 u16 cq_id; 478 u16 cq_id;
478 u32 async_event_bitmap[1]; 479 u32 async_event_bitmap[1];
479 u8 context[sizeof(struct amap_mcc_context_be) / 8]; 480 u8 context[sizeof(struct amap_mcc_context_v1) / 8];
480 struct phys_addr pages[8]; 481 struct phys_addr pages[8];
481} __packed; 482} __packed;
482 483
@@ -1097,6 +1098,14 @@ struct be_cmd_resp_query_fw_cfg {
1097 u32 function_caps; 1098 u32 function_caps;
1098}; 1099};
1099 1100
1101/* Is BE in a multi-channel mode */
1102static inline bool be_is_mc(struct be_adapter *adapter)
1103{
1104 return adapter->function_mode & FLEX10_MODE ||
1105 adapter->function_mode & VNIC_MODE ||
1106 adapter->function_mode & UMC_ENABLED;
1107}
1108
1100/******************** RSS Config ****************************************/ 1109/******************** RSS Config ****************************************/
1101/* RSS type Input parameters used to compute RX hash 1110/* RSS type Input parameters used to compute RX hash
1102 * RSS_ENABLE_IPV4 SRC IPv4, DST IPv4 1111 * RSS_ENABLE_IPV4 SRC IPv4, DST IPv4
@@ -1917,6 +1926,17 @@ struct be_cmd_resp_set_profile_config {
1917 struct be_cmd_resp_hdr hdr; 1926 struct be_cmd_resp_hdr hdr;
1918}; 1927};
1919 1928
1929struct be_cmd_req_get_active_profile {
1930 struct be_cmd_req_hdr hdr;
1931 u32 rsvd;
1932} __packed;
1933
1934struct be_cmd_resp_get_active_profile {
1935 struct be_cmd_resp_hdr hdr;
1936 u16 active_profile_id;
1937 u16 next_profile_id;
1938} __packed;
1939
1920struct be_cmd_enable_disable_vf { 1940struct be_cmd_enable_disable_vf {
1921 struct be_cmd_req_hdr hdr; 1941 struct be_cmd_req_hdr hdr;
1922 u8 enable; 1942 u8 enable;
@@ -2037,8 +2057,10 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
2037int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges, 2057int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
2038 u32 vf_num); 2058 u32 vf_num);
2039int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac, 2059int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
2040 bool *pmac_id_active, u32 *pmac_id, u8 domain); 2060 bool *pmac_id_active, u32 *pmac_id,
2041int be_cmd_get_active_mac(struct be_adapter *adapter, u32 pmac_id, u8 *mac); 2061 u32 if_handle, u8 domain);
2062int be_cmd_get_active_mac(struct be_adapter *adapter, u32 pmac_id, u8 *mac,
2063 u32 if_handle, bool active, u32 domain);
2042int be_cmd_get_perm_mac(struct be_adapter *adapter, u8 *mac); 2064int be_cmd_get_perm_mac(struct be_adapter *adapter, u8 *mac);
2043int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, u8 mac_count, 2065int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, u8 mac_count,
2044 u32 domain); 2066 u32 domain);
@@ -2048,6 +2070,8 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid, u32 domain,
2048int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, u32 domain, 2070int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, u32 domain,
2049 u16 intf_id, u8 *mode); 2071 u16 intf_id, u8 *mode);
2050int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter); 2072int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter);
2073int be_cmd_set_fw_log_level(struct be_adapter *adapter, u32 level);
2074int be_cmd_get_fw_log_level(struct be_adapter *adapter);
2051int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter, 2075int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter,
2052 struct be_dma_mem *cmd); 2076 struct be_dma_mem *cmd);
2053int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter, 2077int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
@@ -2063,6 +2087,7 @@ int be_cmd_get_func_config(struct be_adapter *adapter,
2063int be_cmd_get_profile_config(struct be_adapter *adapter, 2087int be_cmd_get_profile_config(struct be_adapter *adapter,
2064 struct be_resources *res, u8 domain); 2088 struct be_resources *res, u8 domain);
2065int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps, u8 domain); 2089int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps, u8 domain);
2090int be_cmd_get_active_profile(struct be_adapter *adapter, u16 *profile);
2066int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg, 2091int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg,
2067 int vf_num); 2092 int vf_num);
2068int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain); 2093int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain);
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c
index 08330034d9ef..05be0070f55f 100644
--- a/drivers/net/ethernet/emulex/benet/be_ethtool.c
+++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c
@@ -713,12 +713,13 @@ be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
713{ 713{
714 struct be_adapter *adapter = netdev_priv(netdev); 714 struct be_adapter *adapter = netdev_priv(netdev);
715 715
716 if (be_is_wol_supported(adapter)) { 716 if (adapter->wol_cap & BE_WOL_CAP) {
717 wol->supported |= WAKE_MAGIC; 717 wol->supported |= WAKE_MAGIC;
718 if (adapter->wol) 718 if (adapter->wol_en)
719 wol->wolopts |= WAKE_MAGIC; 719 wol->wolopts |= WAKE_MAGIC;
720 } else 720 } else {
721 wol->wolopts = 0; 721 wol->wolopts = 0;
722 }
722 memset(&wol->sopass, 0, sizeof(wol->sopass)); 723 memset(&wol->sopass, 0, sizeof(wol->sopass));
723} 724}
724 725
@@ -730,15 +731,15 @@ be_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
730 if (wol->wolopts & ~WAKE_MAGIC) 731 if (wol->wolopts & ~WAKE_MAGIC)
731 return -EOPNOTSUPP; 732 return -EOPNOTSUPP;
732 733
733 if (!be_is_wol_supported(adapter)) { 734 if (!(adapter->wol_cap & BE_WOL_CAP)) {
734 dev_warn(&adapter->pdev->dev, "WOL not supported\n"); 735 dev_warn(&adapter->pdev->dev, "WOL not supported\n");
735 return -EOPNOTSUPP; 736 return -EOPNOTSUPP;
736 } 737 }
737 738
738 if (wol->wolopts & WAKE_MAGIC) 739 if (wol->wolopts & WAKE_MAGIC)
739 adapter->wol = true; 740 adapter->wol_en = true;
740 else 741 else
741 adapter->wol = false; 742 adapter->wol_en = false;
742 743
743 return 0; 744 return 0;
744} 745}
@@ -904,73 +905,21 @@ static u32 be_get_msg_level(struct net_device *netdev)
904{ 905{
905 struct be_adapter *adapter = netdev_priv(netdev); 906 struct be_adapter *adapter = netdev_priv(netdev);
906 907
907 if (lancer_chip(adapter)) {
908 dev_err(&adapter->pdev->dev, "Operation not supported\n");
909 return -EOPNOTSUPP;
910 }
911
912 return adapter->msg_enable; 908 return adapter->msg_enable;
913} 909}
914 910
915static void be_set_fw_log_level(struct be_adapter *adapter, u32 level)
916{
917 struct be_dma_mem extfat_cmd;
918 struct be_fat_conf_params *cfgs;
919 int status;
920 int i, j;
921
922 memset(&extfat_cmd, 0, sizeof(struct be_dma_mem));
923 extfat_cmd.size = sizeof(struct be_cmd_resp_get_ext_fat_caps);
924 extfat_cmd.va = pci_alloc_consistent(adapter->pdev, extfat_cmd.size,
925 &extfat_cmd.dma);
926 if (!extfat_cmd.va) {
927 dev_err(&adapter->pdev->dev, "%s: Memory allocation failure\n",
928 __func__);
929 goto err;
930 }
931 status = be_cmd_get_ext_fat_capabilites(adapter, &extfat_cmd);
932 if (!status) {
933 cfgs = (struct be_fat_conf_params *)(extfat_cmd.va +
934 sizeof(struct be_cmd_resp_hdr));
935 for (i = 0; i < le32_to_cpu(cfgs->num_modules); i++) {
936 u32 num_modes = le32_to_cpu(cfgs->module[i].num_modes);
937 for (j = 0; j < num_modes; j++) {
938 if (cfgs->module[i].trace_lvl[j].mode ==
939 MODE_UART)
940 cfgs->module[i].trace_lvl[j].dbg_lvl =
941 cpu_to_le32(level);
942 }
943 }
944 status = be_cmd_set_ext_fat_capabilites(adapter, &extfat_cmd,
945 cfgs);
946 if (status)
947 dev_err(&adapter->pdev->dev,
948 "Message level set failed\n");
949 } else {
950 dev_err(&adapter->pdev->dev, "Message level get failed\n");
951 }
952
953 pci_free_consistent(adapter->pdev, extfat_cmd.size, extfat_cmd.va,
954 extfat_cmd.dma);
955err:
956 return;
957}
958
959static void be_set_msg_level(struct net_device *netdev, u32 level) 911static void be_set_msg_level(struct net_device *netdev, u32 level)
960{ 912{
961 struct be_adapter *adapter = netdev_priv(netdev); 913 struct be_adapter *adapter = netdev_priv(netdev);
962 914
963 if (lancer_chip(adapter)) {
964 dev_err(&adapter->pdev->dev, "Operation not supported\n");
965 return;
966 }
967
968 if (adapter->msg_enable == level) 915 if (adapter->msg_enable == level)
969 return; 916 return;
970 917
971 if ((level & NETIF_MSG_HW) != (adapter->msg_enable & NETIF_MSG_HW)) 918 if ((level & NETIF_MSG_HW) != (adapter->msg_enable & NETIF_MSG_HW))
972 be_set_fw_log_level(adapter, level & NETIF_MSG_HW ? 919 if (BEx_chip(adapter))
973 FW_LOG_LEVEL_DEFAULT : FW_LOG_LEVEL_FATAL); 920 be_cmd_set_fw_log_level(adapter, level & NETIF_MSG_HW ?
921 FW_LOG_LEVEL_DEFAULT :
922 FW_LOG_LEVEL_FATAL);
974 adapter->msg_enable = level; 923 adapter->msg_enable = level;
975 924
976 return; 925 return;
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 3acf137b5784..6d22d6f439e3 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -121,12 +121,6 @@ static const char * const ue_status_hi_desc[] = {
121 "Unknown" 121 "Unknown"
122}; 122};
123 123
124/* Is BE in a multi-channel mode */
125static inline bool be_is_mc(struct be_adapter *adapter) {
126 return (adapter->function_mode & FLEX10_MODE ||
127 adapter->function_mode & VNIC_MODE ||
128 adapter->function_mode & UMC_ENABLED);
129}
130 124
131static void be_queue_free(struct be_adapter *adapter, struct be_queue_info *q) 125static void be_queue_free(struct be_adapter *adapter, struct be_queue_info *q)
132{ 126{
@@ -258,6 +252,12 @@ static int be_mac_addr_set(struct net_device *netdev, void *p)
258 if (!is_valid_ether_addr(addr->sa_data)) 252 if (!is_valid_ether_addr(addr->sa_data))
259 return -EADDRNOTAVAIL; 253 return -EADDRNOTAVAIL;
260 254
255 /* Proceed further only if, User provided MAC is different
256 * from active MAC
257 */
258 if (ether_addr_equal(addr->sa_data, netdev->dev_addr))
259 return 0;
260
261 /* The PMAC_ADD cmd may fail if the VF doesn't have FILTMGMT 261 /* The PMAC_ADD cmd may fail if the VF doesn't have FILTMGMT
262 * privilege or if PF did not provision the new MAC address. 262 * privilege or if PF did not provision the new MAC address.
263 * On BE3, this cmd will always fail if the VF doesn't have the 263 * On BE3, this cmd will always fail if the VF doesn't have the
@@ -280,7 +280,8 @@ static int be_mac_addr_set(struct net_device *netdev, void *p)
280 /* Decide if the new MAC is successfully activated only after 280 /* Decide if the new MAC is successfully activated only after
281 * querying the FW 281 * querying the FW
282 */ 282 */
283 status = be_cmd_get_active_mac(adapter, curr_pmac_id, mac); 283 status = be_cmd_get_active_mac(adapter, curr_pmac_id, mac,
284 adapter->if_handle, true, 0);
284 if (status) 285 if (status)
285 goto err; 286 goto err;
286 287
@@ -1442,12 +1443,12 @@ static inline bool csum_passed(struct be_rx_compl_info *rxcp)
1442 (rxcp->ip_csum || rxcp->ipv6); 1443 (rxcp->ip_csum || rxcp->ipv6);
1443} 1444}
1444 1445
1445static struct be_rx_page_info *get_rx_page_info(struct be_rx_obj *rxo, 1446static struct be_rx_page_info *get_rx_page_info(struct be_rx_obj *rxo)
1446 u16 frag_idx)
1447{ 1447{
1448 struct be_adapter *adapter = rxo->adapter; 1448 struct be_adapter *adapter = rxo->adapter;
1449 struct be_rx_page_info *rx_page_info; 1449 struct be_rx_page_info *rx_page_info;
1450 struct be_queue_info *rxq = &rxo->q; 1450 struct be_queue_info *rxq = &rxo->q;
1451 u16 frag_idx = rxq->tail;
1451 1452
1452 rx_page_info = &rxo->page_info_tbl[frag_idx]; 1453 rx_page_info = &rxo->page_info_tbl[frag_idx];
1453 BUG_ON(!rx_page_info->page); 1454 BUG_ON(!rx_page_info->page);
@@ -1459,6 +1460,7 @@ static struct be_rx_page_info *get_rx_page_info(struct be_rx_obj *rxo,
1459 rx_page_info->last_page_user = false; 1460 rx_page_info->last_page_user = false;
1460 } 1461 }
1461 1462
1463 queue_tail_inc(rxq);
1462 atomic_dec(&rxq->used); 1464 atomic_dec(&rxq->used);
1463 return rx_page_info; 1465 return rx_page_info;
1464} 1466}
@@ -1467,15 +1469,13 @@ static struct be_rx_page_info *get_rx_page_info(struct be_rx_obj *rxo,
1467static void be_rx_compl_discard(struct be_rx_obj *rxo, 1469static void be_rx_compl_discard(struct be_rx_obj *rxo,
1468 struct be_rx_compl_info *rxcp) 1470 struct be_rx_compl_info *rxcp)
1469{ 1471{
1470 struct be_queue_info *rxq = &rxo->q;
1471 struct be_rx_page_info *page_info; 1472 struct be_rx_page_info *page_info;
1472 u16 i, num_rcvd = rxcp->num_rcvd; 1473 u16 i, num_rcvd = rxcp->num_rcvd;
1473 1474
1474 for (i = 0; i < num_rcvd; i++) { 1475 for (i = 0; i < num_rcvd; i++) {
1475 page_info = get_rx_page_info(rxo, rxcp->rxq_idx); 1476 page_info = get_rx_page_info(rxo);
1476 put_page(page_info->page); 1477 put_page(page_info->page);
1477 memset(page_info, 0, sizeof(*page_info)); 1478 memset(page_info, 0, sizeof(*page_info));
1478 index_inc(&rxcp->rxq_idx, rxq->len);
1479 } 1479 }
1480} 1480}
1481 1481
@@ -1486,13 +1486,12 @@ static void be_rx_compl_discard(struct be_rx_obj *rxo,
1486static void skb_fill_rx_data(struct be_rx_obj *rxo, struct sk_buff *skb, 1486static void skb_fill_rx_data(struct be_rx_obj *rxo, struct sk_buff *skb,
1487 struct be_rx_compl_info *rxcp) 1487 struct be_rx_compl_info *rxcp)
1488{ 1488{
1489 struct be_queue_info *rxq = &rxo->q;
1490 struct be_rx_page_info *page_info; 1489 struct be_rx_page_info *page_info;
1491 u16 i, j; 1490 u16 i, j;
1492 u16 hdr_len, curr_frag_len, remaining; 1491 u16 hdr_len, curr_frag_len, remaining;
1493 u8 *start; 1492 u8 *start;
1494 1493
1495 page_info = get_rx_page_info(rxo, rxcp->rxq_idx); 1494 page_info = get_rx_page_info(rxo);
1496 start = page_address(page_info->page) + page_info->page_offset; 1495 start = page_address(page_info->page) + page_info->page_offset;
1497 prefetch(start); 1496 prefetch(start);
1498 1497
@@ -1526,10 +1525,9 @@ static void skb_fill_rx_data(struct be_rx_obj *rxo, struct sk_buff *skb,
1526 } 1525 }
1527 1526
1528 /* More frags present for this completion */ 1527 /* More frags present for this completion */
1529 index_inc(&rxcp->rxq_idx, rxq->len);
1530 remaining = rxcp->pkt_size - curr_frag_len; 1528 remaining = rxcp->pkt_size - curr_frag_len;
1531 for (i = 1, j = 0; i < rxcp->num_rcvd; i++) { 1529 for (i = 1, j = 0; i < rxcp->num_rcvd; i++) {
1532 page_info = get_rx_page_info(rxo, rxcp->rxq_idx); 1530 page_info = get_rx_page_info(rxo);
1533 curr_frag_len = min(remaining, rx_frag_size); 1531 curr_frag_len = min(remaining, rx_frag_size);
1534 1532
1535 /* Coalesce all frags from the same physical page in one slot */ 1533 /* Coalesce all frags from the same physical page in one slot */
@@ -1550,7 +1548,6 @@ static void skb_fill_rx_data(struct be_rx_obj *rxo, struct sk_buff *skb,
1550 skb->data_len += curr_frag_len; 1548 skb->data_len += curr_frag_len;
1551 skb->truesize += rx_frag_size; 1549 skb->truesize += rx_frag_size;
1552 remaining -= curr_frag_len; 1550 remaining -= curr_frag_len;
1553 index_inc(&rxcp->rxq_idx, rxq->len);
1554 page_info->page = NULL; 1551 page_info->page = NULL;
1555 } 1552 }
1556 BUG_ON(j > MAX_SKB_FRAGS); 1553 BUG_ON(j > MAX_SKB_FRAGS);
@@ -1598,7 +1595,6 @@ static void be_rx_compl_process_gro(struct be_rx_obj *rxo,
1598 struct be_adapter *adapter = rxo->adapter; 1595 struct be_adapter *adapter = rxo->adapter;
1599 struct be_rx_page_info *page_info; 1596 struct be_rx_page_info *page_info;
1600 struct sk_buff *skb = NULL; 1597 struct sk_buff *skb = NULL;
1601 struct be_queue_info *rxq = &rxo->q;
1602 u16 remaining, curr_frag_len; 1598 u16 remaining, curr_frag_len;
1603 u16 i, j; 1599 u16 i, j;
1604 1600
@@ -1610,7 +1606,7 @@ static void be_rx_compl_process_gro(struct be_rx_obj *rxo,
1610 1606
1611 remaining = rxcp->pkt_size; 1607 remaining = rxcp->pkt_size;
1612 for (i = 0, j = -1; i < rxcp->num_rcvd; i++) { 1608 for (i = 0, j = -1; i < rxcp->num_rcvd; i++) {
1613 page_info = get_rx_page_info(rxo, rxcp->rxq_idx); 1609 page_info = get_rx_page_info(rxo);
1614 1610
1615 curr_frag_len = min(remaining, rx_frag_size); 1611 curr_frag_len = min(remaining, rx_frag_size);
1616 1612
@@ -1628,7 +1624,6 @@ static void be_rx_compl_process_gro(struct be_rx_obj *rxo,
1628 skb_frag_size_add(&skb_shinfo(skb)->frags[j], curr_frag_len); 1624 skb_frag_size_add(&skb_shinfo(skb)->frags[j], curr_frag_len);
1629 skb->truesize += rx_frag_size; 1625 skb->truesize += rx_frag_size;
1630 remaining -= curr_frag_len; 1626 remaining -= curr_frag_len;
1631 index_inc(&rxcp->rxq_idx, rxq->len);
1632 memset(page_info, 0, sizeof(*page_info)); 1627 memset(page_info, 0, sizeof(*page_info));
1633 } 1628 }
1634 BUG_ON(j > MAX_SKB_FRAGS); 1629 BUG_ON(j > MAX_SKB_FRAGS);
@@ -1663,8 +1658,6 @@ static void be_parse_rx_compl_v1(struct be_eth_rx_compl *compl,
1663 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, l4_cksm, compl); 1658 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, l4_cksm, compl);
1664 rxcp->ipv6 = 1659 rxcp->ipv6 =
1665 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, ip_version, compl); 1660 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, ip_version, compl);
1666 rxcp->rxq_idx =
1667 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, fragndx, compl);
1668 rxcp->num_rcvd = 1661 rxcp->num_rcvd =
1669 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, numfrags, compl); 1662 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, numfrags, compl);
1670 rxcp->pkt_type = 1663 rxcp->pkt_type =
@@ -1695,8 +1688,6 @@ static void be_parse_rx_compl_v0(struct be_eth_rx_compl *compl,
1695 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, l4_cksm, compl); 1688 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, l4_cksm, compl);
1696 rxcp->ipv6 = 1689 rxcp->ipv6 =
1697 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, ip_version, compl); 1690 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, ip_version, compl);
1698 rxcp->rxq_idx =
1699 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, fragndx, compl);
1700 rxcp->num_rcvd = 1691 rxcp->num_rcvd =
1701 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, numfrags, compl); 1692 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, numfrags, compl);
1702 rxcp->pkt_type = 1693 rxcp->pkt_type =
@@ -1914,7 +1905,6 @@ static void be_rx_cq_clean(struct be_rx_obj *rxo)
1914 struct be_rx_compl_info *rxcp; 1905 struct be_rx_compl_info *rxcp;
1915 struct be_adapter *adapter = rxo->adapter; 1906 struct be_adapter *adapter = rxo->adapter;
1916 int flush_wait = 0; 1907 int flush_wait = 0;
1917 u16 tail;
1918 1908
1919 /* Consume pending rx completions. 1909 /* Consume pending rx completions.
1920 * Wait for the flush completion (identified by zero num_rcvd) 1910 * Wait for the flush completion (identified by zero num_rcvd)
@@ -1947,9 +1937,8 @@ static void be_rx_cq_clean(struct be_rx_obj *rxo)
1947 be_cq_notify(adapter, rx_cq->id, false, 0); 1937 be_cq_notify(adapter, rx_cq->id, false, 0);
1948 1938
1949 /* Then free posted rx buffers that were not used */ 1939 /* Then free posted rx buffers that were not used */
1950 tail = (rxq->head + rxq->len - atomic_read(&rxq->used)) % rxq->len; 1940 while (atomic_read(&rxq->used) > 0) {
1951 for (; atomic_read(&rxq->used) > 0; index_inc(&tail, rxq->len)) { 1941 page_info = get_rx_page_info(rxo);
1952 page_info = get_rx_page_info(rxo, tail);
1953 put_page(page_info->page); 1942 put_page(page_info->page);
1954 memset(page_info, 0, sizeof(*page_info)); 1943 memset(page_info, 0, sizeof(*page_info));
1955 } 1944 }
@@ -2884,14 +2873,11 @@ static int be_vfs_mac_query(struct be_adapter *adapter)
2884 int status, vf; 2873 int status, vf;
2885 u8 mac[ETH_ALEN]; 2874 u8 mac[ETH_ALEN];
2886 struct be_vf_cfg *vf_cfg; 2875 struct be_vf_cfg *vf_cfg;
2887 bool active = false;
2888 2876
2889 for_all_vfs(adapter, vf_cfg, vf) { 2877 for_all_vfs(adapter, vf_cfg, vf) {
2890 be_cmd_get_mac_from_list(adapter, mac, &active, 2878 status = be_cmd_get_active_mac(adapter, vf_cfg->pmac_id,
2891 &vf_cfg->pmac_id, 0); 2879 mac, vf_cfg->if_handle,
2892 2880 false, vf+1);
2893 status = be_cmd_mac_addr_query(adapter, mac, false,
2894 vf_cfg->if_handle, 0);
2895 if (status) 2881 if (status)
2896 return status; 2882 return status;
2897 memcpy(vf_cfg->mac_addr, mac, ETH_ALEN); 2883 memcpy(vf_cfg->mac_addr, mac, ETH_ALEN);
@@ -3233,6 +3219,7 @@ static int be_get_resources(struct be_adapter *adapter)
3233/* Routine to query per function resource limits */ 3219/* Routine to query per function resource limits */
3234static int be_get_config(struct be_adapter *adapter) 3220static int be_get_config(struct be_adapter *adapter)
3235{ 3221{
3222 u16 profile_id;
3236 int status; 3223 int status;
3237 3224
3238 status = be_cmd_query_fw_cfg(adapter, &adapter->port_num, 3225 status = be_cmd_query_fw_cfg(adapter, &adapter->port_num,
@@ -3242,6 +3229,13 @@ static int be_get_config(struct be_adapter *adapter)
3242 if (status) 3229 if (status)
3243 return status; 3230 return status;
3244 3231
3232 if (be_physfn(adapter)) {
3233 status = be_cmd_get_active_profile(adapter, &profile_id);
3234 if (!status)
3235 dev_info(&adapter->pdev->dev,
3236 "Using profile 0x%x\n", profile_id);
3237 }
3238
3245 status = be_get_resources(adapter); 3239 status = be_get_resources(adapter);
3246 if (status) 3240 if (status)
3247 return status; 3241 return status;
@@ -3396,11 +3390,6 @@ static int be_setup(struct be_adapter *adapter)
3396 goto err; 3390 goto err;
3397 3391
3398 be_cmd_get_fn_privileges(adapter, &adapter->cmd_privileges, 0); 3392 be_cmd_get_fn_privileges(adapter, &adapter->cmd_privileges, 0);
3399 /* In UMC mode FW does not return right privileges.
3400 * Override with correct privilege equivalent to PF.
3401 */
3402 if (be_is_mc(adapter))
3403 adapter->cmd_privileges = MAX_PRIVILEGES;
3404 3393
3405 status = be_mac_setup(adapter); 3394 status = be_mac_setup(adapter);
3406 if (status) 3395 if (status)
@@ -3419,6 +3408,8 @@ static int be_setup(struct be_adapter *adapter)
3419 3408
3420 be_set_rx_mode(adapter->netdev); 3409 be_set_rx_mode(adapter->netdev);
3421 3410
3411 be_cmd_get_acpi_wol_cap(adapter);
3412
3422 be_cmd_get_flow_control(adapter, &tx_fc, &rx_fc); 3413 be_cmd_get_flow_control(adapter, &tx_fc, &rx_fc);
3423 3414
3424 if (rx_fc != adapter->rx_fc || tx_fc != adapter->tx_fc) 3415 if (rx_fc != adapter->rx_fc || tx_fc != adapter->tx_fc)
@@ -4288,74 +4279,22 @@ static void be_remove(struct pci_dev *pdev)
4288 free_netdev(adapter->netdev); 4279 free_netdev(adapter->netdev);
4289} 4280}
4290 4281
4291bool be_is_wol_supported(struct be_adapter *adapter)
4292{
4293 return ((adapter->wol_cap & BE_WOL_CAP) &&
4294 !be_is_wol_excluded(adapter)) ? true : false;
4295}
4296
4297u32 be_get_fw_log_level(struct be_adapter *adapter)
4298{
4299 struct be_dma_mem extfat_cmd;
4300 struct be_fat_conf_params *cfgs;
4301 int status;
4302 u32 level = 0;
4303 int j;
4304
4305 if (lancer_chip(adapter))
4306 return 0;
4307
4308 memset(&extfat_cmd, 0, sizeof(struct be_dma_mem));
4309 extfat_cmd.size = sizeof(struct be_cmd_resp_get_ext_fat_caps);
4310 extfat_cmd.va = pci_alloc_consistent(adapter->pdev, extfat_cmd.size,
4311 &extfat_cmd.dma);
4312
4313 if (!extfat_cmd.va) {
4314 dev_err(&adapter->pdev->dev, "%s: Memory allocation failure\n",
4315 __func__);
4316 goto err;
4317 }
4318
4319 status = be_cmd_get_ext_fat_capabilites(adapter, &extfat_cmd);
4320 if (!status) {
4321 cfgs = (struct be_fat_conf_params *)(extfat_cmd.va +
4322 sizeof(struct be_cmd_resp_hdr));
4323 for (j = 0; j < le32_to_cpu(cfgs->module[0].num_modes); j++) {
4324 if (cfgs->module[0].trace_lvl[j].mode == MODE_UART)
4325 level = cfgs->module[0].trace_lvl[j].dbg_lvl;
4326 }
4327 }
4328 pci_free_consistent(adapter->pdev, extfat_cmd.size, extfat_cmd.va,
4329 extfat_cmd.dma);
4330err:
4331 return level;
4332}
4333
4334static int be_get_initial_config(struct be_adapter *adapter) 4282static int be_get_initial_config(struct be_adapter *adapter)
4335{ 4283{
4336 int status; 4284 int status, level;
4337 u32 level;
4338 4285
4339 status = be_cmd_get_cntl_attributes(adapter); 4286 status = be_cmd_get_cntl_attributes(adapter);
4340 if (status) 4287 if (status)
4341 return status; 4288 return status;
4342 4289
4343 status = be_cmd_get_acpi_wol_cap(adapter);
4344 if (status) {
4345 /* in case of a failure to get wol capabillities
4346 * check the exclusion list to determine WOL capability */
4347 if (!be_is_wol_excluded(adapter))
4348 adapter->wol_cap |= BE_WOL_CAP;
4349 }
4350
4351 if (be_is_wol_supported(adapter))
4352 adapter->wol = true;
4353
4354 /* Must be a power of 2 or else MODULO will BUG_ON */ 4290 /* Must be a power of 2 or else MODULO will BUG_ON */
4355 adapter->be_get_temp_freq = 64; 4291 adapter->be_get_temp_freq = 64;
4356 4292
4357 level = be_get_fw_log_level(adapter); 4293 if (BEx_chip(adapter)) {
4358 adapter->msg_enable = level <= FW_LOG_LEVEL_DEFAULT ? NETIF_MSG_HW : 0; 4294 level = be_cmd_get_fw_log_level(adapter);
4295 adapter->msg_enable =
4296 level <= FW_LOG_LEVEL_DEFAULT ? NETIF_MSG_HW : 0;
4297 }
4359 4298
4360 adapter->cfg_num_qs = netif_get_num_default_rss_queues(); 4299 adapter->cfg_num_qs = netif_get_num_default_rss_queues();
4361 return 0; 4300 return 0;
@@ -4618,7 +4557,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state)
4618 struct be_adapter *adapter = pci_get_drvdata(pdev); 4557 struct be_adapter *adapter = pci_get_drvdata(pdev);
4619 struct net_device *netdev = adapter->netdev; 4558 struct net_device *netdev = adapter->netdev;
4620 4559
4621 if (adapter->wol) 4560 if (adapter->wol_en)
4622 be_setup_wol(adapter, true); 4561 be_setup_wol(adapter, true);
4623 4562
4624 be_intr_set(adapter, false); 4563 be_intr_set(adapter, false);
@@ -4674,7 +4613,7 @@ static int be_resume(struct pci_dev *pdev)
4674 msecs_to_jiffies(1000)); 4613 msecs_to_jiffies(1000));
4675 netif_device_attach(netdev); 4614 netif_device_attach(netdev);
4676 4615
4677 if (adapter->wol) 4616 if (adapter->wol_en)
4678 be_setup_wol(adapter, false); 4617 be_setup_wol(adapter, false);
4679 4618
4680 return 0; 4619 return 0;