|
@@ -66,9 +66,6 @@ static void hns_roce_wq_catas_err_handle(struct hns_roce_dev *hr_dev,
|
|
{
|
|
{
|
|
struct device *dev = &hr_dev->pdev->dev;
|
|
struct device *dev = &hr_dev->pdev->dev;
|
|
|
|
|
|
- qpn = roce_get_field(aeqe->event.qp_event.qp,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_S);
|
|
|
|
dev_warn(dev, "Local Work Queue Catastrophic Error.\n");
|
|
dev_warn(dev, "Local Work Queue Catastrophic Error.\n");
|
|
switch (roce_get_field(aeqe->asyn, HNS_ROCE_AEQE_U32_4_EVENT_SUB_TYPE_M,
|
|
switch (roce_get_field(aeqe->asyn, HNS_ROCE_AEQE_U32_4_EVENT_SUB_TYPE_M,
|
|
HNS_ROCE_AEQE_U32_4_EVENT_SUB_TYPE_S)) {
|
|
HNS_ROCE_AEQE_U32_4_EVENT_SUB_TYPE_S)) {
|
|
@@ -96,13 +93,6 @@ static void hns_roce_wq_catas_err_handle(struct hns_roce_dev *hr_dev,
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
-
|
|
|
|
- hns_roce_qp_event(hr_dev, roce_get_field(aeqe->event.qp_event.qp,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_S),
|
|
|
|
- roce_get_field(aeqe->asyn,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_M,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_S));
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static void hns_roce_local_wq_access_err_handle(struct hns_roce_dev *hr_dev,
|
|
static void hns_roce_local_wq_access_err_handle(struct hns_roce_dev *hr_dev,
|
|
@@ -111,9 +101,6 @@ static void hns_roce_local_wq_access_err_handle(struct hns_roce_dev *hr_dev,
|
|
{
|
|
{
|
|
struct device *dev = &hr_dev->pdev->dev;
|
|
struct device *dev = &hr_dev->pdev->dev;
|
|
|
|
|
|
- qpn = roce_get_field(aeqe->event.qp_event.qp,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_S);
|
|
|
|
dev_warn(dev, "Local Access Violation Work Queue Error.\n");
|
|
dev_warn(dev, "Local Access Violation Work Queue Error.\n");
|
|
switch (roce_get_field(aeqe->asyn, HNS_ROCE_AEQE_U32_4_EVENT_SUB_TYPE_M,
|
|
switch (roce_get_field(aeqe->asyn, HNS_ROCE_AEQE_U32_4_EVENT_SUB_TYPE_M,
|
|
HNS_ROCE_AEQE_U32_4_EVENT_SUB_TYPE_S)) {
|
|
HNS_ROCE_AEQE_U32_4_EVENT_SUB_TYPE_S)) {
|
|
@@ -141,13 +128,69 @@ static void hns_roce_local_wq_access_err_handle(struct hns_roce_dev *hr_dev,
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void hns_roce_qp_err_handle(struct hns_roce_dev *hr_dev,
|
|
|
|
+ struct hns_roce_aeqe *aeqe,
|
|
|
|
+ int event_type)
|
|
|
|
+{
|
|
|
|
+ struct device *dev = &hr_dev->pdev->dev;
|
|
|
|
+ int phy_port;
|
|
|
|
+ int qpn;
|
|
|
|
+
|
|
|
|
+ qpn = roce_get_field(aeqe->event.qp_event.qp,
|
|
|
|
+ HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_M,
|
|
|
|
+ HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_S);
|
|
|
|
+ phy_port = roce_get_field(aeqe->event.qp_event.qp,
|
|
|
|
+ HNS_ROCE_AEQE_EVENT_QP_EVENT_PORT_NUM_M,
|
|
|
|
+ HNS_ROCE_AEQE_EVENT_QP_EVENT_PORT_NUM_S);
|
|
|
|
+ if (qpn <= 1)
|
|
|
|
+ qpn = HNS_ROCE_MAX_PORTS * qpn + phy_port;
|
|
|
|
+
|
|
|
|
+ switch (event_type) {
|
|
|
|
+ case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR:
|
|
|
|
+ dev_warn(dev, "Invalid Req Local Work Queue Error.\n"
|
|
|
|
+ "QP %d, phy_port %d.\n", qpn, phy_port);
|
|
|
|
+ break;
|
|
|
|
+ case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR:
|
|
|
|
+ hns_roce_wq_catas_err_handle(hr_dev, aeqe, qpn);
|
|
|
|
+ break;
|
|
|
|
+ case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR:
|
|
|
|
+ hns_roce_local_wq_access_err_handle(hr_dev, aeqe, qpn);
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ hns_roce_qp_event(hr_dev, qpn, event_type);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void hns_roce_cq_err_handle(struct hns_roce_dev *hr_dev,
|
|
|
|
+ struct hns_roce_aeqe *aeqe,
|
|
|
|
+ int event_type)
|
|
|
|
+{
|
|
|
|
+ struct device *dev = &hr_dev->pdev->dev;
|
|
|
|
+ u32 cqn;
|
|
|
|
+
|
|
|
|
+ cqn = le32_to_cpu(roce_get_field(aeqe->event.cq_event.cq,
|
|
|
|
+ HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_M,
|
|
|
|
+ HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_S));
|
|
|
|
+
|
|
|
|
+ switch (event_type) {
|
|
|
|
+ case HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR:
|
|
|
|
+ dev_warn(dev, "CQ 0x%x access err.\n", cqn);
|
|
|
|
+ break;
|
|
|
|
+ case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW:
|
|
|
|
+ dev_warn(dev, "CQ 0x%x overflow\n", cqn);
|
|
|
|
+ break;
|
|
|
|
+ case HNS_ROCE_EVENT_TYPE_CQ_ID_INVALID:
|
|
|
|
+ dev_warn(dev, "CQ 0x%x ID invalid.\n", cqn);
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
- hns_roce_qp_event(hr_dev, roce_get_field(aeqe->event.qp_event.qp,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_S),
|
|
|
|
- roce_get_field(aeqe->asyn,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_M,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_S));
|
|
|
|
|
|
+ hns_roce_cq_event(hr_dev, cqn, event_type);
|
|
}
|
|
}
|
|
|
|
|
|
static void hns_roce_db_overflow_handle(struct hns_roce_dev *hr_dev,
|
|
static void hns_roce_db_overflow_handle(struct hns_roce_dev *hr_dev,
|
|
@@ -185,7 +228,7 @@ static int hns_roce_aeq_int(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
|
|
struct device *dev = &hr_dev->pdev->dev;
|
|
struct device *dev = &hr_dev->pdev->dev;
|
|
struct hns_roce_aeqe *aeqe;
|
|
struct hns_roce_aeqe *aeqe;
|
|
int aeqes_found = 0;
|
|
int aeqes_found = 0;
|
|
- int qpn = 0;
|
|
|
|
|
|
+ int event_type;
|
|
|
|
|
|
while ((aeqe = next_aeqe_sw(eq))) {
|
|
while ((aeqe = next_aeqe_sw(eq))) {
|
|
dev_dbg(dev, "aeqe = %p, aeqe->asyn.event_type = 0x%lx\n", aeqe,
|
|
dev_dbg(dev, "aeqe = %p, aeqe->asyn.event_type = 0x%lx\n", aeqe,
|
|
@@ -195,9 +238,10 @@ static int hns_roce_aeq_int(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
|
|
/* Memory barrier */
|
|
/* Memory barrier */
|
|
rmb();
|
|
rmb();
|
|
|
|
|
|
- switch (roce_get_field(aeqe->asyn,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_M,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_S)) {
|
|
|
|
|
|
+ event_type = roce_get_field(aeqe->asyn,
|
|
|
|
+ HNS_ROCE_AEQE_U32_4_EVENT_TYPE_M,
|
|
|
|
+ HNS_ROCE_AEQE_U32_4_EVENT_TYPE_S);
|
|
|
|
+ switch (event_type) {
|
|
case HNS_ROCE_EVENT_TYPE_PATH_MIG:
|
|
case HNS_ROCE_EVENT_TYPE_PATH_MIG:
|
|
dev_warn(dev, "PATH MIG not supported\n");
|
|
dev_warn(dev, "PATH MIG not supported\n");
|
|
break;
|
|
break;
|
|
@@ -211,23 +255,9 @@ static int hns_roce_aeq_int(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
|
|
dev_warn(dev, "PATH MIG failed\n");
|
|
dev_warn(dev, "PATH MIG failed\n");
|
|
break;
|
|
break;
|
|
case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR:
|
|
case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR:
|
|
- dev_warn(dev, "qpn = 0x%lx\n",
|
|
|
|
- roce_get_field(aeqe->event.qp_event.qp,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_S));
|
|
|
|
- hns_roce_qp_event(hr_dev,
|
|
|
|
- roce_get_field(aeqe->event.qp_event.qp,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_QP_EVENT_QP_QPN_S),
|
|
|
|
- roce_get_field(aeqe->asyn,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_M,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_S));
|
|
|
|
- break;
|
|
|
|
case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR:
|
|
case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR:
|
|
- hns_roce_wq_catas_err_handle(hr_dev, aeqe, qpn);
|
|
|
|
- break;
|
|
|
|
case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR:
|
|
case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR:
|
|
- hns_roce_local_wq_access_err_handle(hr_dev, aeqe, qpn);
|
|
|
|
|
|
+ hns_roce_qp_err_handle(hr_dev, aeqe, event_type);
|
|
break;
|
|
break;
|
|
case HNS_ROCE_EVENT_TYPE_SRQ_LIMIT_REACH:
|
|
case HNS_ROCE_EVENT_TYPE_SRQ_LIMIT_REACH:
|
|
case HNS_ROCE_EVENT_TYPE_SRQ_CATAS_ERROR:
|
|
case HNS_ROCE_EVENT_TYPE_SRQ_CATAS_ERROR:
|
|
@@ -235,40 +265,9 @@ static int hns_roce_aeq_int(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
|
|
dev_warn(dev, "SRQ not support!\n");
|
|
dev_warn(dev, "SRQ not support!\n");
|
|
break;
|
|
break;
|
|
case HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR:
|
|
case HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR:
|
|
- dev_warn(dev, "CQ 0x%lx access err.\n",
|
|
|
|
- roce_get_field(aeqe->event.cq_event.cq,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_S));
|
|
|
|
- hns_roce_cq_event(hr_dev,
|
|
|
|
- le32_to_cpu(roce_get_field(aeqe->event.cq_event.cq,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_S)),
|
|
|
|
- roce_get_field(aeqe->asyn,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_M,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_S));
|
|
|
|
- break;
|
|
|
|
case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW:
|
|
case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW:
|
|
- dev_warn(dev, "CQ 0x%lx overflow\n",
|
|
|
|
- roce_get_field(aeqe->event.cq_event.cq,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_S));
|
|
|
|
- hns_roce_cq_event(hr_dev,
|
|
|
|
- le32_to_cpu(roce_get_field(aeqe->event.cq_event.cq,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_S)),
|
|
|
|
- roce_get_field(aeqe->asyn,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_M,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_S));
|
|
|
|
- break;
|
|
|
|
case HNS_ROCE_EVENT_TYPE_CQ_ID_INVALID:
|
|
case HNS_ROCE_EVENT_TYPE_CQ_ID_INVALID:
|
|
- dev_warn(dev, "CQ ID invalid.\n");
|
|
|
|
- hns_roce_cq_event(hr_dev,
|
|
|
|
- le32_to_cpu(roce_get_field(aeqe->event.cq_event.cq,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_M,
|
|
|
|
- HNS_ROCE_AEQE_EVENT_CQ_EVENT_CQ_CQN_S)),
|
|
|
|
- roce_get_field(aeqe->asyn,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_M,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_S));
|
|
|
|
|
|
+ hns_roce_cq_err_handle(hr_dev, aeqe, event_type);
|
|
break;
|
|
break;
|
|
case HNS_ROCE_EVENT_TYPE_PORT_CHANGE:
|
|
case HNS_ROCE_EVENT_TYPE_PORT_CHANGE:
|
|
dev_warn(dev, "port change.\n");
|
|
dev_warn(dev, "port change.\n");
|
|
@@ -290,11 +289,8 @@ static int hns_roce_aeq_int(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
|
|
HNS_ROCE_AEQE_EVENT_CE_EVENT_CEQE_CEQN_S));
|
|
HNS_ROCE_AEQE_EVENT_CE_EVENT_CEQE_CEQN_S));
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
- dev_warn(dev, "Unhandled event 0x%lx on EQ %d at index %u\n",
|
|
|
|
- roce_get_field(aeqe->asyn,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_M,
|
|
|
|
- HNS_ROCE_AEQE_U32_4_EVENT_TYPE_S),
|
|
|
|
- eq->eqn, eq->cons_index);
|
|
|
|
|
|
+ dev_warn(dev, "Unhandled event %d on EQ %d at index %u\n",
|
|
|
|
+ event_type, eq->eqn, eq->cons_index);
|
|
break;
|
|
break;
|
|
};
|
|
};
|
|
|
|
|