Merge branch 'qed-fixes'
Sudarsana Reddy Kalluru says: ==================== qed: Fix series for multi-function mode implementation. The patch series addresses few issues in the switch dependent multi-function modes. Please consider applying it to 'net' tree. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
bffd5e8695
|
@ -190,10 +190,8 @@ qed_dcbx_dp_protocol(struct qed_hwfn *p_hwfn, struct qed_dcbx_results *p_data)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
qed_dcbx_set_params(struct qed_dcbx_results *p_data,
|
qed_dcbx_set_params(struct qed_dcbx_results *p_data,
|
||||||
struct qed_hw_info *p_info,
|
struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
||||||
bool enable,
|
bool enable, u8 prio, u8 tc,
|
||||||
u8 prio,
|
|
||||||
u8 tc,
|
|
||||||
enum dcbx_protocol_type type,
|
enum dcbx_protocol_type type,
|
||||||
enum qed_pci_personality personality)
|
enum qed_pci_personality personality)
|
||||||
{
|
{
|
||||||
|
@ -206,19 +204,30 @@ qed_dcbx_set_params(struct qed_dcbx_results *p_data,
|
||||||
else
|
else
|
||||||
p_data->arr[type].update = DONT_UPDATE_DCB_DSCP;
|
p_data->arr[type].update = DONT_UPDATE_DCB_DSCP;
|
||||||
|
|
||||||
|
/* Do not add vlan tag 0 when DCB is enabled and port in UFP/OV mode */
|
||||||
|
if ((test_bit(QED_MF_8021Q_TAGGING, &p_hwfn->cdev->mf_bits) ||
|
||||||
|
test_bit(QED_MF_8021AD_TAGGING, &p_hwfn->cdev->mf_bits)))
|
||||||
|
p_data->arr[type].dont_add_vlan0 = true;
|
||||||
|
|
||||||
/* QM reconf data */
|
/* QM reconf data */
|
||||||
if (p_info->personality == personality)
|
if (p_hwfn->hw_info.personality == personality)
|
||||||
qed_hw_info_set_offload_tc(p_info, tc);
|
qed_hw_info_set_offload_tc(&p_hwfn->hw_info, tc);
|
||||||
|
|
||||||
|
/* Configure dcbx vlan priority in doorbell block for roce EDPM */
|
||||||
|
if (test_bit(QED_MF_UFP_SPECIFIC, &p_hwfn->cdev->mf_bits) &&
|
||||||
|
type == DCBX_PROTOCOL_ROCE) {
|
||||||
|
qed_wr(p_hwfn, p_ptt, DORQ_REG_TAG1_OVRD_MODE, 1);
|
||||||
|
qed_wr(p_hwfn, p_ptt, DORQ_REG_PF_PCP_BB_K2, prio << 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update app protocol data and hw_info fields with the TLV info */
|
/* Update app protocol data and hw_info fields with the TLV info */
|
||||||
static void
|
static void
|
||||||
qed_dcbx_update_app_info(struct qed_dcbx_results *p_data,
|
qed_dcbx_update_app_info(struct qed_dcbx_results *p_data,
|
||||||
struct qed_hwfn *p_hwfn,
|
struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
||||||
bool enable,
|
bool enable, u8 prio, u8 tc,
|
||||||
u8 prio, u8 tc, enum dcbx_protocol_type type)
|
enum dcbx_protocol_type type)
|
||||||
{
|
{
|
||||||
struct qed_hw_info *p_info = &p_hwfn->hw_info;
|
|
||||||
enum qed_pci_personality personality;
|
enum qed_pci_personality personality;
|
||||||
enum dcbx_protocol_type id;
|
enum dcbx_protocol_type id;
|
||||||
int i;
|
int i;
|
||||||
|
@ -231,7 +240,7 @@ qed_dcbx_update_app_info(struct qed_dcbx_results *p_data,
|
||||||
|
|
||||||
personality = qed_dcbx_app_update[i].personality;
|
personality = qed_dcbx_app_update[i].personality;
|
||||||
|
|
||||||
qed_dcbx_set_params(p_data, p_info, enable,
|
qed_dcbx_set_params(p_data, p_hwfn, p_ptt, enable,
|
||||||
prio, tc, type, personality);
|
prio, tc, type, personality);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -265,7 +274,7 @@ qed_dcbx_get_app_protocol_type(struct qed_hwfn *p_hwfn,
|
||||||
* reconfiguring QM. Get protocol specific data for PF update ramrod command.
|
* reconfiguring QM. Get protocol specific data for PF update ramrod command.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn,
|
qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
||||||
struct qed_dcbx_results *p_data,
|
struct qed_dcbx_results *p_data,
|
||||||
struct dcbx_app_priority_entry *p_tbl,
|
struct dcbx_app_priority_entry *p_tbl,
|
||||||
u32 pri_tc_tbl, int count, u8 dcbx_version)
|
u32 pri_tc_tbl, int count, u8 dcbx_version)
|
||||||
|
@ -309,7 +318,7 @@ qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn,
|
||||||
enable = true;
|
enable = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qed_dcbx_update_app_info(p_data, p_hwfn, enable,
|
qed_dcbx_update_app_info(p_data, p_hwfn, p_ptt, enable,
|
||||||
priority, tc, type);
|
priority, tc, type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -331,7 +340,7 @@ qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
enable = (type == DCBX_PROTOCOL_ETH) ? false : !!dcbx_version;
|
enable = (type == DCBX_PROTOCOL_ETH) ? false : !!dcbx_version;
|
||||||
qed_dcbx_update_app_info(p_data, p_hwfn, enable,
|
qed_dcbx_update_app_info(p_data, p_hwfn, p_ptt, enable,
|
||||||
priority, tc, type);
|
priority, tc, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,7 +350,8 @@ qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn,
|
||||||
/* Parse app TLV's to update TC information in hw_info structure for
|
/* Parse app TLV's to update TC information in hw_info structure for
|
||||||
* reconfiguring QM. Get protocol specific data for PF update ramrod command.
|
* reconfiguring QM. Get protocol specific data for PF update ramrod command.
|
||||||
*/
|
*/
|
||||||
static int qed_dcbx_process_mib_info(struct qed_hwfn *p_hwfn)
|
static int
|
||||||
|
qed_dcbx_process_mib_info(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
|
||||||
{
|
{
|
||||||
struct dcbx_app_priority_feature *p_app;
|
struct dcbx_app_priority_feature *p_app;
|
||||||
struct dcbx_app_priority_entry *p_tbl;
|
struct dcbx_app_priority_entry *p_tbl;
|
||||||
|
@ -365,7 +375,7 @@ static int qed_dcbx_process_mib_info(struct qed_hwfn *p_hwfn)
|
||||||
p_info = &p_hwfn->hw_info;
|
p_info = &p_hwfn->hw_info;
|
||||||
num_entries = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_NUM_ENTRIES);
|
num_entries = QED_MFW_GET_FIELD(p_app->flags, DCBX_APP_NUM_ENTRIES);
|
||||||
|
|
||||||
rc = qed_dcbx_process_tlv(p_hwfn, &data, p_tbl, pri_tc_tbl,
|
rc = qed_dcbx_process_tlv(p_hwfn, p_ptt, &data, p_tbl, pri_tc_tbl,
|
||||||
num_entries, dcbx_version);
|
num_entries, dcbx_version);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -891,7 +901,7 @@ qed_dcbx_mib_update_event(struct qed_hwfn *p_hwfn,
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if (type == QED_DCBX_OPERATIONAL_MIB) {
|
if (type == QED_DCBX_OPERATIONAL_MIB) {
|
||||||
rc = qed_dcbx_process_mib_info(p_hwfn);
|
rc = qed_dcbx_process_mib_info(p_hwfn, p_ptt);
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
/* reconfigure tcs of QM queues according
|
/* reconfigure tcs of QM queues according
|
||||||
* to negotiation results
|
* to negotiation results
|
||||||
|
@ -954,6 +964,7 @@ static void qed_dcbx_update_protocol_data(struct protocol_dcb_data *p_data,
|
||||||
p_data->dcb_enable_flag = p_src->arr[type].enable;
|
p_data->dcb_enable_flag = p_src->arr[type].enable;
|
||||||
p_data->dcb_priority = p_src->arr[type].priority;
|
p_data->dcb_priority = p_src->arr[type].priority;
|
||||||
p_data->dcb_tc = p_src->arr[type].tc;
|
p_data->dcb_tc = p_src->arr[type].tc;
|
||||||
|
p_data->dcb_dont_add_vlan0 = p_src->arr[type].dont_add_vlan0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set pf update ramrod command params */
|
/* Set pf update ramrod command params */
|
||||||
|
|
|
@ -55,6 +55,7 @@ struct qed_dcbx_app_data {
|
||||||
u8 update; /* Update indication */
|
u8 update; /* Update indication */
|
||||||
u8 priority; /* Priority */
|
u8 priority; /* Priority */
|
||||||
u8 tc; /* Traffic Class */
|
u8 tc; /* Traffic Class */
|
||||||
|
bool dont_add_vlan0; /* Do not insert a vlan tag with id 0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define QED_DCBX_VERSION_DISABLED 0
|
#define QED_DCBX_VERSION_DISABLED 0
|
||||||
|
|
|
@ -1706,7 +1706,7 @@ static int qed_vf_start(struct qed_hwfn *p_hwfn,
|
||||||
int qed_hw_init(struct qed_dev *cdev, struct qed_hw_init_params *p_params)
|
int qed_hw_init(struct qed_dev *cdev, struct qed_hw_init_params *p_params)
|
||||||
{
|
{
|
||||||
struct qed_load_req_params load_req_params;
|
struct qed_load_req_params load_req_params;
|
||||||
u32 load_code, param, drv_mb_param;
|
u32 load_code, resp, param, drv_mb_param;
|
||||||
bool b_default_mtu = true;
|
bool b_default_mtu = true;
|
||||||
struct qed_hwfn *p_hwfn;
|
struct qed_hwfn *p_hwfn;
|
||||||
int rc = 0, mfw_rc, i;
|
int rc = 0, mfw_rc, i;
|
||||||
|
@ -1852,6 +1852,19 @@ int qed_hw_init(struct qed_dev *cdev, struct qed_hw_init_params *p_params)
|
||||||
|
|
||||||
if (IS_PF(cdev)) {
|
if (IS_PF(cdev)) {
|
||||||
p_hwfn = QED_LEADING_HWFN(cdev);
|
p_hwfn = QED_LEADING_HWFN(cdev);
|
||||||
|
|
||||||
|
/* Get pre-negotiated values for stag, bandwidth etc. */
|
||||||
|
DP_VERBOSE(p_hwfn,
|
||||||
|
QED_MSG_SPQ,
|
||||||
|
"Sending GET_OEM_UPDATES command to trigger stag/bandwidth attention handling\n");
|
||||||
|
drv_mb_param = 1 << DRV_MB_PARAM_DUMMY_OEM_UPDATES_OFFSET;
|
||||||
|
rc = qed_mcp_cmd(p_hwfn, p_hwfn->p_main_ptt,
|
||||||
|
DRV_MSG_CODE_GET_OEM_UPDATES,
|
||||||
|
drv_mb_param, &resp, ¶m);
|
||||||
|
if (rc)
|
||||||
|
DP_NOTICE(p_hwfn,
|
||||||
|
"Failed to send GET_OEM_UPDATES attention request\n");
|
||||||
|
|
||||||
drv_mb_param = STORM_FW_VERSION;
|
drv_mb_param = STORM_FW_VERSION;
|
||||||
rc = qed_mcp_cmd(p_hwfn, p_hwfn->p_main_ptt,
|
rc = qed_mcp_cmd(p_hwfn, p_hwfn->p_main_ptt,
|
||||||
DRV_MSG_CODE_OV_UPDATE_STORM_FW_VER,
|
DRV_MSG_CODE_OV_UPDATE_STORM_FW_VER,
|
||||||
|
|
|
@ -12414,6 +12414,7 @@ struct public_drv_mb {
|
||||||
#define DRV_MSG_SET_RESOURCE_VALUE_MSG 0x35000000
|
#define DRV_MSG_SET_RESOURCE_VALUE_MSG 0x35000000
|
||||||
#define DRV_MSG_CODE_OV_UPDATE_WOL 0x38000000
|
#define DRV_MSG_CODE_OV_UPDATE_WOL 0x38000000
|
||||||
#define DRV_MSG_CODE_OV_UPDATE_ESWITCH_MODE 0x39000000
|
#define DRV_MSG_CODE_OV_UPDATE_ESWITCH_MODE 0x39000000
|
||||||
|
#define DRV_MSG_CODE_GET_OEM_UPDATES 0x41000000
|
||||||
|
|
||||||
#define DRV_MSG_CODE_BW_UPDATE_ACK 0x32000000
|
#define DRV_MSG_CODE_BW_UPDATE_ACK 0x32000000
|
||||||
#define DRV_MSG_CODE_NIG_DRAIN 0x30000000
|
#define DRV_MSG_CODE_NIG_DRAIN 0x30000000
|
||||||
|
@ -12541,6 +12542,9 @@ struct public_drv_mb {
|
||||||
#define DRV_MB_PARAM_ESWITCH_MODE_VEB 0x1
|
#define DRV_MB_PARAM_ESWITCH_MODE_VEB 0x1
|
||||||
#define DRV_MB_PARAM_ESWITCH_MODE_VEPA 0x2
|
#define DRV_MB_PARAM_ESWITCH_MODE_VEPA 0x2
|
||||||
|
|
||||||
|
#define DRV_MB_PARAM_DUMMY_OEM_UPDATES_MASK 0x1
|
||||||
|
#define DRV_MB_PARAM_DUMMY_OEM_UPDATES_OFFSET 0
|
||||||
|
|
||||||
#define DRV_MB_PARAM_SET_LED_MODE_OPER 0x0
|
#define DRV_MB_PARAM_SET_LED_MODE_OPER 0x0
|
||||||
#define DRV_MB_PARAM_SET_LED_MODE_ON 0x1
|
#define DRV_MB_PARAM_SET_LED_MODE_ON 0x1
|
||||||
#define DRV_MB_PARAM_SET_LED_MODE_OFF 0x2
|
#define DRV_MB_PARAM_SET_LED_MODE_OFF 0x2
|
||||||
|
|
|
@ -1581,13 +1581,29 @@ static void qed_mcp_update_stag(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
|
||||||
p_hwfn->mcp_info->func_info.ovlan = (u16)shmem_info.ovlan_stag &
|
p_hwfn->mcp_info->func_info.ovlan = (u16)shmem_info.ovlan_stag &
|
||||||
FUNC_MF_CFG_OV_STAG_MASK;
|
FUNC_MF_CFG_OV_STAG_MASK;
|
||||||
p_hwfn->hw_info.ovlan = p_hwfn->mcp_info->func_info.ovlan;
|
p_hwfn->hw_info.ovlan = p_hwfn->mcp_info->func_info.ovlan;
|
||||||
if ((p_hwfn->hw_info.hw_mode & BIT(MODE_MF_SD)) &&
|
if (test_bit(QED_MF_OVLAN_CLSS, &p_hwfn->cdev->mf_bits)) {
|
||||||
(p_hwfn->hw_info.ovlan != QED_MCP_VLAN_UNSET)) {
|
if (p_hwfn->hw_info.ovlan != QED_MCP_VLAN_UNSET) {
|
||||||
qed_wr(p_hwfn, p_ptt,
|
qed_wr(p_hwfn, p_ptt, NIG_REG_LLH_FUNC_TAG_VALUE,
|
||||||
NIG_REG_LLH_FUNC_TAG_VALUE, p_hwfn->hw_info.ovlan);
|
p_hwfn->hw_info.ovlan);
|
||||||
|
qed_wr(p_hwfn, p_ptt, NIG_REG_LLH_FUNC_TAG_EN, 1);
|
||||||
|
|
||||||
|
/* Configure DB to add external vlan to EDPM packets */
|
||||||
|
qed_wr(p_hwfn, p_ptt, DORQ_REG_TAG1_OVRD_MODE, 1);
|
||||||
|
qed_wr(p_hwfn, p_ptt, DORQ_REG_PF_EXT_VID_BB_K2,
|
||||||
|
p_hwfn->hw_info.ovlan);
|
||||||
|
} else {
|
||||||
|
qed_wr(p_hwfn, p_ptt, NIG_REG_LLH_FUNC_TAG_EN, 0);
|
||||||
|
qed_wr(p_hwfn, p_ptt, NIG_REG_LLH_FUNC_TAG_VALUE, 0);
|
||||||
|
qed_wr(p_hwfn, p_ptt, DORQ_REG_TAG1_OVRD_MODE, 0);
|
||||||
|
qed_wr(p_hwfn, p_ptt, DORQ_REG_PF_EXT_VID_BB_K2, 0);
|
||||||
|
}
|
||||||
|
|
||||||
qed_sp_pf_update_stag(p_hwfn);
|
qed_sp_pf_update_stag(p_hwfn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DP_VERBOSE(p_hwfn, QED_MSG_SP, "ovlan = %d hw_mode = 0x%x\n",
|
||||||
|
p_hwfn->mcp_info->func_info.ovlan, p_hwfn->hw_info.hw_mode);
|
||||||
|
|
||||||
/* Acknowledge the MFW */
|
/* Acknowledge the MFW */
|
||||||
qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_S_TAG_UPDATE_ACK, 0,
|
qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_S_TAG_UPDATE_ACK, 0,
|
||||||
&resp, ¶m);
|
&resp, ¶m);
|
||||||
|
|
|
@ -216,6 +216,12 @@
|
||||||
0x00c000UL
|
0x00c000UL
|
||||||
#define DORQ_REG_IFEN \
|
#define DORQ_REG_IFEN \
|
||||||
0x100040UL
|
0x100040UL
|
||||||
|
#define DORQ_REG_TAG1_OVRD_MODE \
|
||||||
|
0x1008b4UL
|
||||||
|
#define DORQ_REG_PF_PCP_BB_K2 \
|
||||||
|
0x1008c4UL
|
||||||
|
#define DORQ_REG_PF_EXT_VID_BB_K2 \
|
||||||
|
0x1008c8UL
|
||||||
#define DORQ_REG_DB_DROP_REASON \
|
#define DORQ_REG_DB_DROP_REASON \
|
||||||
0x100a2cUL
|
0x100a2cUL
|
||||||
#define DORQ_REG_DB_DROP_DETAILS \
|
#define DORQ_REG_DB_DROP_DETAILS \
|
||||||
|
|
Loading…
Reference in New Issue