diff options
author | David S. Miller <davem@davemloft.net> | 2014-01-15 18:52:07 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-01-15 18:52:07 -0500 |
commit | e96a41ebde3b66dbb59d3ffa0a38dff6e5ca25a9 (patch) | |
tree | 61d39e14420b228f89e7dd60b1c7983a6a80a491 | |
parent | 286ab723d4b83d37deb4017008ef1444a95cfb0d (diff) | |
parent | 5e5110183bcea260c70e1b04c0c04c1223f4763b (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.h | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 178 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.h | 33 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_ethtool.c | 73 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 137 |
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 | ||
2697 | err: | 2703 | err: |
@@ -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 | */ |
2738 | int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac, | 2744 | int 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 | ||
2830 | int be_cmd_get_active_mac(struct be_adapter *adapter, u32 curr_pmac_id, u8 *mac) | 2837 | int 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 | ||
2843 | int be_cmd_get_perm_mac(struct be_adapter *adapter, u8 *mac) | 2854 | int 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 | } |
3081 | err: | 3091 | err: |
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 | |||
3099 | int 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); | ||
3129 | err: | ||
3130 | pci_free_consistent(adapter->pdev, extfat_cmd.size, extfat_cmd.va, | ||
3131 | extfat_cmd.dma); | ||
3132 | return status; | ||
3133 | } | ||
3134 | |||
3135 | int 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); | ||
3164 | err: | ||
3165 | return level; | ||
3166 | } | ||
3167 | |||
3088 | int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter, | 3168 | int 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 */ | ||
3693 | int 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 | |||
3721 | err: | ||
3722 | mutex_unlock(&adapter->mbox_lock); | ||
3723 | return status; | ||
3724 | } | ||
3725 | |||
3612 | int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload, | 3726 | int 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 | ||
455 | struct amap_mcc_context_lancer { | 456 | struct 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 */ | ||
1102 | static 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 | ||
1929 | struct be_cmd_req_get_active_profile { | ||
1930 | struct be_cmd_req_hdr hdr; | ||
1931 | u32 rsvd; | ||
1932 | } __packed; | ||
1933 | |||
1934 | struct 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 | |||
1920 | struct be_cmd_enable_disable_vf { | 1940 | struct 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, | |||
2037 | int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges, | 2057 | int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges, |
2038 | u32 vf_num); | 2058 | u32 vf_num); |
2039 | int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac, | 2059 | int 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, |
2041 | int be_cmd_get_active_mac(struct be_adapter *adapter, u32 pmac_id, u8 *mac); | 2061 | u32 if_handle, u8 domain); |
2062 | int be_cmd_get_active_mac(struct be_adapter *adapter, u32 pmac_id, u8 *mac, | ||
2063 | u32 if_handle, bool active, u32 domain); | ||
2042 | int be_cmd_get_perm_mac(struct be_adapter *adapter, u8 *mac); | 2064 | int be_cmd_get_perm_mac(struct be_adapter *adapter, u8 *mac); |
2043 | int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, u8 mac_count, | 2065 | int 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, | |||
2048 | int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, u32 domain, | 2070 | int 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); |
2050 | int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter); | 2072 | int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter); |
2073 | int be_cmd_set_fw_log_level(struct be_adapter *adapter, u32 level); | ||
2074 | int be_cmd_get_fw_log_level(struct be_adapter *adapter); | ||
2051 | int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter, | 2075 | int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter, |
2052 | struct be_dma_mem *cmd); | 2076 | struct be_dma_mem *cmd); |
2053 | int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter, | 2077 | int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter, |
@@ -2063,6 +2087,7 @@ int be_cmd_get_func_config(struct be_adapter *adapter, | |||
2063 | int be_cmd_get_profile_config(struct be_adapter *adapter, | 2087 | int be_cmd_get_profile_config(struct be_adapter *adapter, |
2064 | struct be_resources *res, u8 domain); | 2088 | struct be_resources *res, u8 domain); |
2065 | int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps, u8 domain); | 2089 | int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps, u8 domain); |
2090 | int be_cmd_get_active_profile(struct be_adapter *adapter, u16 *profile); | ||
2066 | int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg, | 2091 | int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg, |
2067 | int vf_num); | 2092 | int vf_num); |
2068 | int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain); | 2093 | int 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 | ||
915 | static 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); | ||
955 | err: | ||
956 | return; | ||
957 | } | ||
958 | |||
959 | static void be_set_msg_level(struct net_device *netdev, u32 level) | 911 | static 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 */ | ||
125 | static 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 | ||
131 | static void be_queue_free(struct be_adapter *adapter, struct be_queue_info *q) | 125 | static 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 | ||
1445 | static struct be_rx_page_info *get_rx_page_info(struct be_rx_obj *rxo, | 1446 | static 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, | |||
1467 | static void be_rx_compl_discard(struct be_rx_obj *rxo, | 1469 | static 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, | |||
1486 | static void skb_fill_rx_data(struct be_rx_obj *rxo, struct sk_buff *skb, | 1486 | static 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 */ |
3234 | static int be_get_config(struct be_adapter *adapter) | 3220 | static 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 | ||
4291 | bool 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 | |||
4297 | u32 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); | ||
4330 | err: | ||
4331 | return level; | ||
4332 | } | ||
4333 | |||
4334 | static int be_get_initial_config(struct be_adapter *adapter) | 4282 | static 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; |