Commit 970cf1d2 authored by David S. Miller's avatar David S. Miller

Merge branch 'qed-dcb-enhancements'

Sudarsana Reddy Kalluru says:

====================
qed*: Dcbx/dcbnl enhancements.

The series has set of enhancements for dcbx/dcbnl implementation of
qed/qede drivers.
 - Patches (1) & (3) capture the sematic and debug changes.
 - Patch (2) adds the driver support for populating RoCEv2 dcb data.
 - Patch (4) adds the required support for reading/configuring the
   IEEE selection field (SF).
 - Patch (5) adds the support for configuring the static dcbx mode.

Please consider applying this to 'net-next' branch.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 9b538163 49632b58
...@@ -271,8 +271,8 @@ qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn, ...@@ -271,8 +271,8 @@ qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn,
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)
{ {
u8 tc, priority_map;
enum dcbx_protocol_type type; enum dcbx_protocol_type type;
u8 tc, priority_map;
bool enable, ieee; bool enable, ieee;
u16 protocol_id; u16 protocol_id;
int priority; int priority;
...@@ -556,8 +556,9 @@ qed_dcbx_get_pfc_data(struct qed_hwfn *p_hwfn, ...@@ -556,8 +556,9 @@ qed_dcbx_get_pfc_data(struct qed_hwfn *p_hwfn,
p_params->pfc.prio[7] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_7); p_params->pfc.prio[7] = !!(pfc_map & DCBX_PFC_PRI_EN_BITMAP_PRI_7);
DP_VERBOSE(p_hwfn, QED_MSG_DCB, DP_VERBOSE(p_hwfn, QED_MSG_DCB,
"PFC params: willing %d, pfc_bitmap %d\n", "PFC params: willing %d, pfc_bitmap %u max_tc = %u enabled = %d\n",
p_params->pfc.willing, pfc_map); p_params->pfc.willing, pfc_map, p_params->pfc.max_tc,
p_params->pfc.enabled);
} }
static void static void
...@@ -576,10 +577,10 @@ qed_dcbx_get_ets_data(struct qed_hwfn *p_hwfn, ...@@ -576,10 +577,10 @@ qed_dcbx_get_ets_data(struct qed_hwfn *p_hwfn,
p_params->max_ets_tc = QED_MFW_GET_FIELD(p_ets->flags, p_params->max_ets_tc = QED_MFW_GET_FIELD(p_ets->flags,
DCBX_ETS_MAX_TCS); DCBX_ETS_MAX_TCS);
DP_VERBOSE(p_hwfn, QED_MSG_DCB, DP_VERBOSE(p_hwfn, QED_MSG_DCB,
"ETS params: willing %d, ets_cbs %d pri_tc_tbl_0 %x max_ets_tc %d\n", "ETS params: willing %d, enabled = %d ets_cbs %d pri_tc_tbl_0 %x max_ets_tc %d\n",
p_params->ets_willing, p_params->ets_willing, p_params->ets_enabled,
p_params->ets_cbs, p_params->ets_cbs, p_ets->pri_tc_tbl[0],
p_ets->pri_tc_tbl[0], p_params->max_ets_tc); p_params->max_ets_tc);
if (p_params->ets_enabled && !p_params->max_ets_tc) { if (p_params->ets_enabled && !p_params->max_ets_tc) {
p_params->max_ets_tc = QED_MAX_PFC_PRIORITIES; p_params->max_ets_tc = QED_MAX_PFC_PRIORITIES;
...@@ -620,8 +621,7 @@ qed_dcbx_get_common_params(struct qed_hwfn *p_hwfn, ...@@ -620,8 +621,7 @@ qed_dcbx_get_common_params(struct qed_hwfn *p_hwfn,
} }
static void static void
qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn, qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *params)
struct qed_ptt *p_ptt, struct qed_dcbx_get *params)
{ {
struct dcbx_features *p_feat; struct dcbx_features *p_feat;
...@@ -633,8 +633,7 @@ qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn, ...@@ -633,8 +633,7 @@ qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn,
} }
static void static void
qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn, qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *params)
struct qed_ptt *p_ptt, struct qed_dcbx_get *params)
{ {
struct dcbx_features *p_feat; struct dcbx_features *p_feat;
...@@ -647,7 +646,6 @@ qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn, ...@@ -647,7 +646,6 @@ qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn,
static void static void
qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn, qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn,
struct qed_ptt *p_ptt,
struct qed_dcbx_get *params) struct qed_dcbx_get *params)
{ {
struct qed_dcbx_operational_params *p_operational; struct qed_dcbx_operational_params *p_operational;
...@@ -668,6 +666,7 @@ qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn, ...@@ -668,6 +666,7 @@ qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn,
if (!enabled) { if (!enabled) {
p_operational->enabled = enabled; p_operational->enabled = enabled;
p_operational->valid = false; p_operational->valid = false;
DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Dcbx is disabled\n");
return; return;
} }
...@@ -681,8 +680,14 @@ qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn, ...@@ -681,8 +680,14 @@ qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn,
DCBX_CONFIG_VERSION_CEE); DCBX_CONFIG_VERSION_CEE);
p_operational->cee = val; p_operational->cee = val;
DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Version support: ieee %d, cee %d\n", val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) ==
p_operational->ieee, p_operational->cee); DCBX_CONFIG_VERSION_STATIC);
p_operational->local = val;
DP_VERBOSE(p_hwfn, QED_MSG_DCB,
"Version support: ieee %d, cee %d, static %d\n",
p_operational->ieee, p_operational->cee,
p_operational->local);
qed_dcbx_get_common_params(p_hwfn, &p_feat->app, qed_dcbx_get_common_params(p_hwfn, &p_feat->app,
p_feat->app.app_pri_tbl, &p_feat->ets, p_feat->app.app_pri_tbl, &p_feat->ets,
...@@ -697,7 +702,6 @@ qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn, ...@@ -697,7 +702,6 @@ qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn,
static void static void
qed_dcbx_get_local_lldp_params(struct qed_hwfn *p_hwfn, qed_dcbx_get_local_lldp_params(struct qed_hwfn *p_hwfn,
struct qed_ptt *p_ptt,
struct qed_dcbx_get *params) struct qed_dcbx_get *params)
{ {
struct lldp_config_params_s *p_local; struct lldp_config_params_s *p_local;
...@@ -712,7 +716,6 @@ qed_dcbx_get_local_lldp_params(struct qed_hwfn *p_hwfn, ...@@ -712,7 +716,6 @@ qed_dcbx_get_local_lldp_params(struct qed_hwfn *p_hwfn,
static void static void
qed_dcbx_get_remote_lldp_params(struct qed_hwfn *p_hwfn, qed_dcbx_get_remote_lldp_params(struct qed_hwfn *p_hwfn,
struct qed_ptt *p_ptt,
struct qed_dcbx_get *params) struct qed_dcbx_get *params)
{ {
struct lldp_status_params_s *p_remote; struct lldp_status_params_s *p_remote;
...@@ -726,25 +729,24 @@ qed_dcbx_get_remote_lldp_params(struct qed_hwfn *p_hwfn, ...@@ -726,25 +729,24 @@ qed_dcbx_get_remote_lldp_params(struct qed_hwfn *p_hwfn,
} }
static int static int
qed_dcbx_get_params(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, qed_dcbx_get_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *p_params,
struct qed_dcbx_get *p_params,
enum qed_mib_read_type type) enum qed_mib_read_type type)
{ {
switch (type) { switch (type) {
case QED_DCBX_REMOTE_MIB: case QED_DCBX_REMOTE_MIB:
qed_dcbx_get_remote_params(p_hwfn, p_ptt, p_params); qed_dcbx_get_remote_params(p_hwfn, p_params);
break; break;
case QED_DCBX_LOCAL_MIB: case QED_DCBX_LOCAL_MIB:
qed_dcbx_get_local_params(p_hwfn, p_ptt, p_params); qed_dcbx_get_local_params(p_hwfn, p_params);
break; break;
case QED_DCBX_OPERATIONAL_MIB: case QED_DCBX_OPERATIONAL_MIB:
qed_dcbx_get_operational_params(p_hwfn, p_ptt, p_params); qed_dcbx_get_operational_params(p_hwfn, p_params);
break; break;
case QED_DCBX_REMOTE_LLDP_MIB: case QED_DCBX_REMOTE_LLDP_MIB:
qed_dcbx_get_remote_lldp_params(p_hwfn, p_ptt, p_params); qed_dcbx_get_remote_lldp_params(p_hwfn, p_params);
break; break;
case QED_DCBX_LOCAL_LLDP_MIB: case QED_DCBX_LOCAL_LLDP_MIB:
qed_dcbx_get_local_lldp_params(p_hwfn, p_ptt, p_params); qed_dcbx_get_local_lldp_params(p_hwfn, p_params);
break; break;
default: default:
DP_ERR(p_hwfn, "MIB read err, unknown mib type %d\n", type); DP_ERR(p_hwfn, "MIB read err, unknown mib type %d\n", type);
...@@ -902,7 +904,8 @@ qed_dcbx_mib_update_event(struct qed_hwfn *p_hwfn, ...@@ -902,7 +904,8 @@ qed_dcbx_mib_update_event(struct qed_hwfn *p_hwfn,
qed_sp_pf_update(p_hwfn); qed_sp_pf_update(p_hwfn);
} }
} }
qed_dcbx_get_params(p_hwfn, p_ptt, &p_hwfn->p_dcbx_info->get, type);
qed_dcbx_get_params(p_hwfn, &p_hwfn->p_dcbx_info->get, type);
qed_dcbx_aen(p_hwfn, type); qed_dcbx_aen(p_hwfn, type);
return rc; return rc;
...@@ -910,17 +913,14 @@ qed_dcbx_mib_update_event(struct qed_hwfn *p_hwfn, ...@@ -910,17 +913,14 @@ qed_dcbx_mib_update_event(struct qed_hwfn *p_hwfn,
int qed_dcbx_info_alloc(struct qed_hwfn *p_hwfn) int qed_dcbx_info_alloc(struct qed_hwfn *p_hwfn)
{ {
int rc = 0;
p_hwfn->p_dcbx_info = kzalloc(sizeof(*p_hwfn->p_dcbx_info), GFP_KERNEL); p_hwfn->p_dcbx_info = kzalloc(sizeof(*p_hwfn->p_dcbx_info), GFP_KERNEL);
if (!p_hwfn->p_dcbx_info) if (!p_hwfn->p_dcbx_info)
rc = -ENOMEM; return -ENOMEM;
return rc; return 0;
} }
void qed_dcbx_info_free(struct qed_hwfn *p_hwfn, void qed_dcbx_info_free(struct qed_hwfn *p_hwfn)
struct qed_dcbx_info *p_dcbx_info)
{ {
kfree(p_hwfn->p_dcbx_info); kfree(p_hwfn->p_dcbx_info);
} }
...@@ -959,14 +959,9 @@ void qed_dcbx_set_pf_update_params(struct qed_dcbx_results *p_src, ...@@ -959,14 +959,9 @@ void qed_dcbx_set_pf_update_params(struct qed_dcbx_results *p_src,
p_dcb_data = &p_dest->fcoe_dcb_data; p_dcb_data = &p_dest->fcoe_dcb_data;
qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_FCOE); qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_FCOE);
p_dcb_data = &p_dest->roce_dcb_data; p_dcb_data = &p_dest->roce_dcb_data;
qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ROCE);
if (p_src->arr[DCBX_PROTOCOL_ROCE].update) p_dcb_data = &p_dest->rroce_dcb_data;
qed_dcbx_update_protocol_data(p_dcb_data, p_src, qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ROCE_V2);
DCBX_PROTOCOL_ROCE);
if (p_src->arr[DCBX_PROTOCOL_ROCE_V2].update)
qed_dcbx_update_protocol_data(p_dcb_data, p_src,
DCBX_PROTOCOL_ROCE_V2);
p_dcb_data = &p_dest->iscsi_dcb_data; p_dcb_data = &p_dest->iscsi_dcb_data;
qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ISCSI); qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ISCSI);
p_dcb_data = &p_dest->eth_dcb_data; p_dcb_data = &p_dest->eth_dcb_data;
...@@ -992,7 +987,7 @@ static int qed_dcbx_query_params(struct qed_hwfn *p_hwfn, ...@@ -992,7 +987,7 @@ static int qed_dcbx_query_params(struct qed_hwfn *p_hwfn,
if (rc) if (rc)
goto out; goto out;
rc = qed_dcbx_get_params(p_hwfn, p_ptt, p_get, type); rc = qed_dcbx_get_params(p_hwfn, p_get, type);
out: out:
qed_ptt_release(p_hwfn, p_ptt); qed_ptt_release(p_hwfn, p_ptt);
...@@ -1167,6 +1162,9 @@ qed_dcbx_set_local_params(struct qed_hwfn *p_hwfn, ...@@ -1167,6 +1162,9 @@ qed_dcbx_set_local_params(struct qed_hwfn *p_hwfn,
local_admin->config = DCBX_CONFIG_VERSION_DISABLED; local_admin->config = DCBX_CONFIG_VERSION_DISABLED;
} }
DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Dcbx version = %d\n",
local_admin->config);
if (params->override_flags & QED_DCBX_OVERRIDE_PFC_CFG) if (params->override_flags & QED_DCBX_OVERRIDE_PFC_CFG)
qed_dcbx_set_pfc_data(p_hwfn, &local_admin->features.pfc, qed_dcbx_set_pfc_data(p_hwfn, &local_admin->features.pfc,
&params->config.params); &params->config.params);
...@@ -1243,6 +1241,8 @@ int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn, ...@@ -1243,6 +1241,8 @@ int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn,
p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_CEE; p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_CEE;
if (dcbx_info->operational.ieee) if (dcbx_info->operational.ieee)
p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_IEEE; p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_IEEE;
if (dcbx_info->operational.local)
p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_STATIC;
p_hwfn->p_dcbx_info->set.enabled = dcbx_info->operational.enabled; p_hwfn->p_dcbx_info->set.enabled = dcbx_info->operational.enabled;
memcpy(&p_hwfn->p_dcbx_info->set.config.params, memcpy(&p_hwfn->p_dcbx_info->set.config.params,
...@@ -1792,8 +1792,9 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode) ...@@ -1792,8 +1792,9 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode)
DP_VERBOSE(hwfn, QED_MSG_DCB, "new mode = %x\n", mode); DP_VERBOSE(hwfn, QED_MSG_DCB, "new mode = %x\n", mode);
if (!(mode & DCB_CAP_DCBX_VER_IEEE) && !(mode & DCB_CAP_DCBX_VER_CEE)) { if (!(mode & DCB_CAP_DCBX_VER_IEEE) &&
DP_INFO(hwfn, "Allowed mode is cee, ieee or both\n"); !(mode & DCB_CAP_DCBX_VER_CEE) && !(mode & DCB_CAP_DCBX_STATIC)) {
DP_INFO(hwfn, "Allowed modes are cee, ieee or static\n");
return 1; return 1;
} }
...@@ -1813,6 +1814,11 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode) ...@@ -1813,6 +1814,11 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode)
dcbx_set.enabled = true; dcbx_set.enabled = true;
} }
if (mode & DCB_CAP_DCBX_STATIC) {
dcbx_set.ver_num |= DCBX_CONFIG_VERSION_STATIC;
dcbx_set.enabled = true;
}
ptt = qed_ptt_acquire(hwfn); ptt = qed_ptt_acquire(hwfn);
if (!ptt) if (!ptt)
return 1; return 1;
...@@ -1821,7 +1827,7 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode) ...@@ -1821,7 +1827,7 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode)
qed_ptt_release(hwfn, ptt); qed_ptt_release(hwfn, ptt);
return 0; return rc;
} }
static u8 qed_dcbnl_getfeatcfg(struct qed_dev *cdev, int featid, u8 *flags) static u8 qed_dcbnl_getfeatcfg(struct qed_dev *cdev, int featid, u8 *flags)
...@@ -2200,15 +2206,46 @@ qed_dcbnl_ieee_peer_getpfc(struct qed_dev *cdev, struct ieee_pfc *pfc) ...@@ -2200,15 +2206,46 @@ qed_dcbnl_ieee_peer_getpfc(struct qed_dev *cdev, struct ieee_pfc *pfc)
return qed_dcbnl_get_ieee_pfc(cdev, pfc, true); return qed_dcbnl_get_ieee_pfc(cdev, pfc, true);
} }
static int qed_get_sf_ieee_value(u8 selector, u8 *sf_ieee)
{
switch (selector) {
case IEEE_8021QAZ_APP_SEL_ETHERTYPE:
*sf_ieee = QED_DCBX_SF_IEEE_ETHTYPE;
break;
case IEEE_8021QAZ_APP_SEL_STREAM:
*sf_ieee = QED_DCBX_SF_IEEE_TCP_PORT;
break;
case IEEE_8021QAZ_APP_SEL_DGRAM:
*sf_ieee = QED_DCBX_SF_IEEE_UDP_PORT;
break;
case IEEE_8021QAZ_APP_SEL_ANY:
*sf_ieee = QED_DCBX_SF_IEEE_TCP_UDP_PORT;
break;
default:
return -EINVAL;
}
return 0;
}
static int qed_dcbnl_ieee_getapp(struct qed_dev *cdev, struct dcb_app *app) static int qed_dcbnl_ieee_getapp(struct qed_dev *cdev, struct dcb_app *app)
{ {
struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev);
struct qed_dcbx_get *dcbx_info; struct qed_dcbx_get *dcbx_info;
struct qed_app_entry *entry; struct qed_app_entry *entry;
bool ethtype;
u8 prio = 0; u8 prio = 0;
u8 sf_ieee;
int i; int i;
DP_VERBOSE(hwfn, QED_MSG_DCB, "selector = %d protocol = %d\n",
app->selector, app->protocol);
if (qed_get_sf_ieee_value(app->selector, &sf_ieee)) {
DP_INFO(cdev, "Invalid selector field value %d\n",
app->selector);
return -EINVAL;
}
dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB);
if (!dcbx_info) if (!dcbx_info)
return -EINVAL; return -EINVAL;
...@@ -2219,11 +2256,9 @@ static int qed_dcbnl_ieee_getapp(struct qed_dev *cdev, struct dcb_app *app) ...@@ -2219,11 +2256,9 @@ static int qed_dcbnl_ieee_getapp(struct qed_dev *cdev, struct dcb_app *app)
return -EINVAL; return -EINVAL;
} }
/* ieee defines the selector field value for ethertype to be 1 */
ethtype = !!((app->selector - 1) == DCB_APP_IDTYPE_ETHTYPE);
for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) {
entry = &dcbx_info->operational.params.app_entry[i]; entry = &dcbx_info->operational.params.app_entry[i];
if ((entry->ethtype == ethtype) && if ((entry->sf_ieee == sf_ieee) &&
(entry->proto_id == app->protocol)) { (entry->proto_id == app->protocol)) {
prio = entry->prio; prio = entry->prio;
break; break;
...@@ -2251,14 +2286,22 @@ static int qed_dcbnl_ieee_setapp(struct qed_dev *cdev, struct dcb_app *app) ...@@ -2251,14 +2286,22 @@ static int qed_dcbnl_ieee_setapp(struct qed_dev *cdev, struct dcb_app *app)
struct qed_dcbx_set dcbx_set; struct qed_dcbx_set dcbx_set;
struct qed_app_entry *entry; struct qed_app_entry *entry;
struct qed_ptt *ptt; struct qed_ptt *ptt;
bool ethtype; u8 sf_ieee;
int rc, i; int rc, i;
DP_VERBOSE(hwfn, QED_MSG_DCB, "selector = %d protocol = %d pri = %d\n",
app->selector, app->protocol, app->priority);
if (app->priority < 0 || app->priority >= QED_MAX_PFC_PRIORITIES) { if (app->priority < 0 || app->priority >= QED_MAX_PFC_PRIORITIES) {
DP_INFO(hwfn, "Invalid priority %d\n", app->priority); DP_INFO(hwfn, "Invalid priority %d\n", app->priority);
return -EINVAL; return -EINVAL;
} }
if (qed_get_sf_ieee_value(app->selector, &sf_ieee)) {
DP_INFO(cdev, "Invalid selector field value %d\n",
app->selector);
return -EINVAL;
}
dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB); dcbx_info = qed_dcbnl_get_dcbx(hwfn, QED_DCBX_OPERATIONAL_MIB);
if (!dcbx_info) if (!dcbx_info)
return -EINVAL; return -EINVAL;
...@@ -2276,11 +2319,9 @@ static int qed_dcbnl_ieee_setapp(struct qed_dev *cdev, struct dcb_app *app) ...@@ -2276,11 +2319,9 @@ static int qed_dcbnl_ieee_setapp(struct qed_dev *cdev, struct dcb_app *app)
if (rc) if (rc)
return -EINVAL; return -EINVAL;
/* ieee defines the selector field value for ethertype to be 1 */
ethtype = !!((app->selector - 1) == DCB_APP_IDTYPE_ETHTYPE);
for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) { for (i = 0; i < QED_DCBX_MAX_APP_PROTOCOL; i++) {
entry = &dcbx_set.config.params.app_entry[i]; entry = &dcbx_set.config.params.app_entry[i];
if ((entry->ethtype == ethtype) && if ((entry->sf_ieee == sf_ieee) &&
(entry->proto_id == app->protocol)) (entry->proto_id == app->protocol))
break; break;
/* First empty slot */ /* First empty slot */
...@@ -2296,7 +2337,7 @@ static int qed_dcbnl_ieee_setapp(struct qed_dev *cdev, struct dcb_app *app) ...@@ -2296,7 +2337,7 @@ static int qed_dcbnl_ieee_setapp(struct qed_dev *cdev, struct dcb_app *app)
} }
dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG; dcbx_set.override_flags |= QED_DCBX_OVERRIDE_APP_CFG;
dcbx_set.config.params.app_entry[i].ethtype = ethtype; dcbx_set.config.params.app_entry[i].sf_ieee = sf_ieee;
dcbx_set.config.params.app_entry[i].proto_id = app->protocol; dcbx_set.config.params.app_entry[i].proto_id = app->protocol;
dcbx_set.config.params.app_entry[i].prio = BIT(app->priority); dcbx_set.config.params.app_entry[i].prio = BIT(app->priority);
......
...@@ -119,7 +119,7 @@ qed_dcbx_mib_update_event(struct qed_hwfn *, ...@@ -119,7 +119,7 @@ qed_dcbx_mib_update_event(struct qed_hwfn *,
struct qed_ptt *, enum qed_mib_read_type); struct qed_ptt *, enum qed_mib_read_type);
int qed_dcbx_info_alloc(struct qed_hwfn *p_hwfn); int qed_dcbx_info_alloc(struct qed_hwfn *p_hwfn);
void qed_dcbx_info_free(struct qed_hwfn *, struct qed_dcbx_info *); void qed_dcbx_info_free(struct qed_hwfn *p_hwfn);
void qed_dcbx_set_pf_update_params(struct qed_dcbx_results *p_src, void qed_dcbx_set_pf_update_params(struct qed_dcbx_results *p_src,
struct pf_update_ramrod_data *p_dest); struct pf_update_ramrod_data *p_dest);
......
...@@ -183,7 +183,7 @@ void qed_resc_free(struct qed_dev *cdev) ...@@ -183,7 +183,7 @@ void qed_resc_free(struct qed_dev *cdev)
} }
qed_iov_free(p_hwfn); qed_iov_free(p_hwfn);
qed_dmae_info_free(p_hwfn); qed_dmae_info_free(p_hwfn);
qed_dcbx_info_free(p_hwfn, p_hwfn->p_dcbx_info); qed_dcbx_info_free(p_hwfn);
} }
} }
......
...@@ -281,6 +281,11 @@ static int qede_dcbnl_ieee_setapp(struct net_device *netdev, ...@@ -281,6 +281,11 @@ static int qede_dcbnl_ieee_setapp(struct net_device *netdev,
struct dcb_app *app) struct dcb_app *app)
{ {
struct qede_dev *edev = netdev_priv(netdev); struct qede_dev *edev = netdev_priv(netdev);
int err;
err = dcb_ieee_setapp(netdev, app);
if (err)
return err;
return edev->ops->dcb->ieee_setapp(edev->cdev, app); return edev->ops->dcb->ieee_setapp(edev->cdev, app);
} }
......
...@@ -144,6 +144,7 @@ struct qed_dcbx_operational_params { ...@@ -144,6 +144,7 @@ struct qed_dcbx_operational_params {
bool enabled; bool enabled;
bool ieee; bool ieee;
bool cee; bool cee;
bool local;
u32 err; u32 err;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment