|
@@ -271,8 +271,8 @@ qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn,
|
|
|
struct dcbx_app_priority_entry *p_tbl,
|
|
|
u32 pri_tc_tbl, int count, u8 dcbx_version)
|
|
|
{
|
|
|
- u8 tc, priority_map;
|
|
|
enum dcbx_protocol_type type;
|
|
|
+ u8 tc, priority_map;
|
|
|
bool enable, ieee;
|
|
|
u16 protocol_id;
|
|
|
int priority;
|
|
@@ -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);
|
|
|
|
|
|
DP_VERBOSE(p_hwfn, QED_MSG_DCB,
|
|
|
- "PFC params: willing %d, pfc_bitmap %d\n",
|
|
|
- p_params->pfc.willing, pfc_map);
|
|
|
+ "PFC params: willing %d, pfc_bitmap %u max_tc = %u enabled = %d\n",
|
|
|
+ p_params->pfc.willing, pfc_map, p_params->pfc.max_tc,
|
|
|
+ p_params->pfc.enabled);
|
|
|
}
|
|
|
|
|
|
static void
|
|
@@ -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,
|
|
|
DCBX_ETS_MAX_TCS);
|
|
|
DP_VERBOSE(p_hwfn, QED_MSG_DCB,
|
|
|
- "ETS params: willing %d, ets_cbs %d pri_tc_tbl_0 %x max_ets_tc %d\n",
|
|
|
- p_params->ets_willing,
|
|
|
- p_params->ets_cbs,
|
|
|
- p_ets->pri_tc_tbl[0], p_params->max_ets_tc);
|
|
|
+ "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_enabled,
|
|
|
+ p_params->ets_cbs, p_ets->pri_tc_tbl[0],
|
|
|
+ p_params->max_ets_tc);
|
|
|
|
|
|
if (p_params->ets_enabled && !p_params->max_ets_tc) {
|
|
|
p_params->max_ets_tc = QED_MAX_PFC_PRIORITIES;
|
|
@@ -620,8 +621,7 @@ qed_dcbx_get_common_params(struct qed_hwfn *p_hwfn,
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn,
|
|
|
- struct qed_ptt *p_ptt, struct qed_dcbx_get *params)
|
|
|
+qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *params)
|
|
|
{
|
|
|
struct dcbx_features *p_feat;
|
|
|
|
|
@@ -633,8 +633,7 @@ qed_dcbx_get_local_params(struct qed_hwfn *p_hwfn,
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn,
|
|
|
- struct qed_ptt *p_ptt, struct qed_dcbx_get *params)
|
|
|
+qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *params)
|
|
|
{
|
|
|
struct dcbx_features *p_feat;
|
|
|
|
|
@@ -647,7 +646,6 @@ qed_dcbx_get_remote_params(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
static void
|
|
|
qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn,
|
|
|
- struct qed_ptt *p_ptt,
|
|
|
struct qed_dcbx_get *params)
|
|
|
{
|
|
|
struct qed_dcbx_operational_params *p_operational;
|
|
@@ -668,6 +666,7 @@ qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn,
|
|
|
if (!enabled) {
|
|
|
p_operational->enabled = enabled;
|
|
|
p_operational->valid = false;
|
|
|
+ DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Dcbx is disabled\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -681,8 +680,14 @@ qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn,
|
|
|
DCBX_CONFIG_VERSION_CEE);
|
|
|
p_operational->cee = val;
|
|
|
|
|
|
- DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Version support: ieee %d, cee %d\n",
|
|
|
- p_operational->ieee, p_operational->cee);
|
|
|
+ val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) ==
|
|
|
+ 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,
|
|
|
p_feat->app.app_pri_tbl, &p_feat->ets,
|
|
@@ -697,7 +702,6 @@ qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
static void
|
|
|
qed_dcbx_get_local_lldp_params(struct qed_hwfn *p_hwfn,
|
|
|
- struct qed_ptt *p_ptt,
|
|
|
struct qed_dcbx_get *params)
|
|
|
{
|
|
|
struct lldp_config_params_s *p_local;
|
|
@@ -712,7 +716,6 @@ qed_dcbx_get_local_lldp_params(struct qed_hwfn *p_hwfn,
|
|
|
|
|
|
static void
|
|
|
qed_dcbx_get_remote_lldp_params(struct qed_hwfn *p_hwfn,
|
|
|
- struct qed_ptt *p_ptt,
|
|
|
struct qed_dcbx_get *params)
|
|
|
{
|
|
|
struct lldp_status_params_s *p_remote;
|
|
@@ -726,25 +729,24 @@ qed_dcbx_get_remote_lldp_params(struct qed_hwfn *p_hwfn,
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-qed_dcbx_get_params(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
|
|
- struct qed_dcbx_get *p_params,
|
|
|
+qed_dcbx_get_params(struct qed_hwfn *p_hwfn, struct qed_dcbx_get *p_params,
|
|
|
enum qed_mib_read_type type)
|
|
|
{
|
|
|
switch (type) {
|
|
|
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;
|
|
|
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;
|
|
|
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;
|
|
|
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;
|
|
|
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;
|
|
|
default:
|
|
|
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,
|
|
|
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);
|
|
|
|
|
|
return rc;
|
|
@@ -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 rc = 0;
|
|
|
-
|
|
|
p_hwfn->p_dcbx_info = kzalloc(sizeof(*p_hwfn->p_dcbx_info), GFP_KERNEL);
|
|
|
if (!p_hwfn->p_dcbx_info)
|
|
|
- rc = -ENOMEM;
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
- return rc;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-void qed_dcbx_info_free(struct qed_hwfn *p_hwfn,
|
|
|
- struct qed_dcbx_info *p_dcbx_info)
|
|
|
+void qed_dcbx_info_free(struct qed_hwfn *p_hwfn)
|
|
|
{
|
|
|
kfree(p_hwfn->p_dcbx_info);
|
|
|
}
|
|
@@ -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;
|
|
|
qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_FCOE);
|
|
|
p_dcb_data = &p_dest->roce_dcb_data;
|
|
|
-
|
|
|
- if (p_src->arr[DCBX_PROTOCOL_ROCE].update)
|
|
|
- qed_dcbx_update_protocol_data(p_dcb_data, p_src,
|
|
|
- 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);
|
|
|
-
|
|
|
+ qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ROCE);
|
|
|
+ p_dcb_data = &p_dest->rroce_dcb_data;
|
|
|
+ qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ROCE_V2);
|
|
|
p_dcb_data = &p_dest->iscsi_dcb_data;
|
|
|
qed_dcbx_update_protocol_data(p_dcb_data, p_src, DCBX_PROTOCOL_ISCSI);
|
|
|
p_dcb_data = &p_dest->eth_dcb_data;
|
|
@@ -992,7 +987,7 @@ static int qed_dcbx_query_params(struct qed_hwfn *p_hwfn,
|
|
|
if (rc)
|
|
|
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:
|
|
|
qed_ptt_release(p_hwfn, p_ptt);
|
|
@@ -1167,6 +1162,9 @@ qed_dcbx_set_local_params(struct qed_hwfn *p_hwfn,
|
|
|
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)
|
|
|
qed_dcbx_set_pfc_data(p_hwfn, &local_admin->features.pfc,
|
|
|
¶ms->config.params);
|
|
@@ -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;
|
|
|
if (dcbx_info->operational.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;
|
|
|
memcpy(&p_hwfn->p_dcbx_info->set.config.params,
|
|
@@ -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);
|
|
|
|
|
|
- if (!(mode & DCB_CAP_DCBX_VER_IEEE) && !(mode & DCB_CAP_DCBX_VER_CEE)) {
|
|
|
- DP_INFO(hwfn, "Allowed mode is cee, ieee or both\n");
|
|
|
+ if (!(mode & DCB_CAP_DCBX_VER_IEEE) &&
|
|
|
+ !(mode & DCB_CAP_DCBX_VER_CEE) && !(mode & DCB_CAP_DCBX_STATIC)) {
|
|
|
+ DP_INFO(hwfn, "Allowed modes are cee, ieee or static\n");
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -1813,6 +1814,11 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode)
|
|
|
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);
|
|
|
if (!ptt)
|
|
|
return 1;
|
|
@@ -1821,7 +1827,7 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode)
|
|
|
|
|
|
qed_ptt_release(hwfn, ptt);
|
|
|
|
|
|
- return 0;
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
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)
|
|
|
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)
|
|
|
{
|
|
|
struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev);
|
|
|
struct qed_dcbx_get *dcbx_info;
|
|
|
struct qed_app_entry *entry;
|
|
|
- bool ethtype;
|
|
|
u8 prio = 0;
|
|
|
+ u8 sf_ieee;
|
|
|
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);
|
|
|
if (!dcbx_info)
|
|
|
return -EINVAL;
|
|
@@ -2219,11 +2256,9 @@ static int qed_dcbnl_ieee_getapp(struct qed_dev *cdev, struct dcb_app *app)
|
|
|
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++) {
|
|
|
entry = &dcbx_info->operational.params.app_entry[i];
|
|
|
- if ((entry->ethtype == ethtype) &&
|
|
|
+ if ((entry->sf_ieee == sf_ieee) &&
|
|
|
(entry->proto_id == app->protocol)) {
|
|
|
prio = entry->prio;
|
|
|
break;
|
|
@@ -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_app_entry *entry;
|
|
|
struct qed_ptt *ptt;
|
|
|
- bool ethtype;
|
|
|
+ u8 sf_ieee;
|
|
|
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) {
|
|
|
DP_INFO(hwfn, "Invalid priority %d\n", app->priority);
|
|
|
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);
|
|
|
if (!dcbx_info)
|
|
|
return -EINVAL;
|
|
@@ -2276,11 +2319,9 @@ static int qed_dcbnl_ieee_setapp(struct qed_dev *cdev, struct dcb_app *app)
|
|
|
if (rc)
|
|
|
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++) {
|
|
|
entry = &dcbx_set.config.params.app_entry[i];
|
|
|
- if ((entry->ethtype == ethtype) &&
|
|
|
+ if ((entry->sf_ieee == sf_ieee) &&
|
|
|
(entry->proto_id == app->protocol))
|
|
|
break;
|
|
|
/* First empty slot */
|
|
@@ -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.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].prio = BIT(app->priority);
|
|
|
|