History

Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma

Pull infiniband/rdma fixes from Doug Ledford: "This should hopefully be the last request for 4.1-rc for the RDMA stack. It contains some late ocrdma fixes that I'm including because they are small and self contained. It also contains two bug fixes that are simple and easily verified. Summary: - a number of small, well contained bug fixes for ocrdma driver - a simple fix for the connection negotiation sequence on IB - fix for broken AF_IB address on UD queue pair support" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: IB/cma: Fix broken AF_IB UD support ib/cm: Change reject message type when destroying cm_id RDMA/ocrdma: Update ocrdma version number RDMA/ocrdma: Fail connection for MTU lesser than 512 RDMA/ocrdma: Fix dmac resolution for link local address RDMA/ocrdma: Prevent allocation of DPP PDs if FW doesnt support it RDMA/ocrdma: Fix the request length for RDMA_QUERY_QP mailbox command to FW. RDMA/ocrdma: Use VID 0 if PFC is enabled and vlan is not configured RDMA/ocrdma: Fix QP state transition in destroy_qp RDMA/ocrdma: Report EQ full fatal error RDMA/ocrdma: Fix EQ destroy failure during driver unload

Linus Torvalds committed 11 years ago

Commit 83ee4122 parents 97793a8 c07678b7 files · +101 −53Browse files

Unified · Split

7 files
  1. drivers/infiniband/core/cm.c +1 −1
  2. drivers/infiniband/core/cma.c +21 −11
  3. drivers/infiniband/hw/ocrdma/ocrdma.h +3 −1
  4. drivers/infiniband/hw/ocrdma/ocrdma_ah.c +10 −2
  5. drivers/infiniband/hw/ocrdma/ocrdma_hw.c +50 −33
  6. drivers/infiniband/hw/ocrdma/ocrdma_sli.h +9 −0
  7. drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +7 −5
drivers/infiniband/core/cm.c+1−1
@@ -861,6 +861,7 @@ retest: · 860 unmodified lines
861 cm_reject_sidr_req(cm_id_priv, IB_SIDR_REJECT);861 cm_reject_sidr_req(cm_id_priv, IB_SIDR_REJECT);
862 break;862 break;
863 case IB_CM_REQ_SENT:863 case IB_CM_REQ_SENT:
864 case IB_CM_MRA_REQ_RCVD:
864 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);865 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
865 spin_unlock_irq(&cm_id_priv->lock);866 spin_unlock_irq(&cm_id_priv->lock);
866 ib_send_cm_rej(cm_id, IB_CM_REJ_TIMEOUT,867 ib_send_cm_rej(cm_id, IB_CM_REJ_TIMEOUT,
@@ -879,7 +880,6 @@ retest: · 12 unmodified lines
879 NULL, 0, NULL, 0);880 NULL, 0, NULL, 0);
880 }881 }
881 break;882 break;
882 case IB_CM_MRA_REQ_RCVD:
883 case IB_CM_REP_SENT:883 case IB_CM_REP_SENT:
884 case IB_CM_MRA_REP_RCVD:884 case IB_CM_MRA_REP_RCVD:
885 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);885 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
drivers/infiniband/core/cma.c+21−11
@@ -845,18 +845,26 @@ static void cma_save_ib_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id · 844 unmodified lines
845 listen_ib = (struct sockaddr_ib *) &listen_id->route.addr.src_addr;845 listen_ib = (struct sockaddr_ib *) &listen_id->route.addr.src_addr;
846 ib = (struct sockaddr_ib *) &id->route.addr.src_addr;846 ib = (struct sockaddr_ib *) &id->route.addr.src_addr;
847 ib->sib_family = listen_ib->sib_family;847 ib->sib_family = listen_ib->sib_family;
848 ib->sib_pkey = path->pkey;848 if (path) {
849 ib->sib_flowinfo = path->flow_label;849 ib->sib_pkey = path->pkey;
850 memcpy(&ib->sib_addr, &path->sgid, 16);850 ib->sib_flowinfo = path->flow_label;
851 memcpy(&ib->sib_addr, &path->sgid, 16);
852 } else {
853 ib->sib_pkey = listen_ib->sib_pkey;
854 ib->sib_flowinfo = listen_ib->sib_flowinfo;
855 ib->sib_addr = listen_ib->sib_addr;
856 }
851 ib->sib_sid = listen_ib->sib_sid;857 ib->sib_sid = listen_ib->sib_sid;
852 ib->sib_sid_mask = cpu_to_be64(0xffffffffffffffffULL);858 ib->sib_sid_mask = cpu_to_be64(0xffffffffffffffffULL);
853 ib->sib_scope_id = listen_ib->sib_scope_id;859 ib->sib_scope_id = listen_ib->sib_scope_id;
854 860
855 ib = (struct sockaddr_ib *) &id->route.addr.dst_addr;861 if (path) {
856 ib->sib_family = listen_ib->sib_family;862 ib = (struct sockaddr_ib *) &id->route.addr.dst_addr;
857 ib->sib_pkey = path->pkey;863 ib->sib_family = listen_ib->sib_family;
858 ib->sib_flowinfo = path->flow_label;864 ib->sib_pkey = path->pkey;
859 memcpy(&ib->sib_addr, &path->dgid, 16);865 ib->sib_flowinfo = path->flow_label;
866 memcpy(&ib->sib_addr, &path->dgid, 16);
867 }
860}868}
861 869
862static __be16 ss_get_port(const struct sockaddr_storage *ss)870static __be16 ss_get_port(const struct sockaddr_storage *ss)
@@ -905,9 +913,11 @@ static int cma_save_net_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id · 42 unmodified lines
905{913{
906 struct cma_hdr *hdr;914 struct cma_hdr *hdr;
907 915
908 if ((listen_id->route.addr.src_addr.ss_family == AF_IB) &&916 if (listen_id->route.addr.src_addr.ss_family == AF_IB) {
909 (ib_event->event == IB_CM_REQ_RECEIVED)) {917 if (ib_event->event == IB_CM_REQ_RECEIVED)
910 cma_save_ib_info(id, listen_id, ib_event->param.req_rcvd.primary_path);918 cma_save_ib_info(id, listen_id, ib_event->param.req_rcvd.primary_path);
919 else if (ib_event->event == IB_CM_SIDR_REQ_RECEIVED)
920 cma_save_ib_info(id, listen_id, NULL);
911 return 0;921 return 0;
912 }922 }
913 923
drivers/infiniband/hw/ocrdma/ocrdma.h+3−1
@@ -40,7 +40,7 @@ · 39 unmodified lines
40#include <be_roce.h>40#include <be_roce.h>
41#include "ocrdma_sli.h"41#include "ocrdma_sli.h"
42 42
43#define OCRDMA_ROCE_DRV_VERSION "10.4.205.0u"43#define OCRDMA_ROCE_DRV_VERSION "10.6.0.0"
44 44
45#define OCRDMA_ROCE_DRV_DESC "Emulex OneConnect RoCE Driver"45#define OCRDMA_ROCE_DRV_DESC "Emulex OneConnect RoCE Driver"
46#define OCRDMA_NODE_DESC "Emulex OneConnect RoCE HCA"46#define OCRDMA_NODE_DESC "Emulex OneConnect RoCE HCA"
@@ -515,6 +515,8 @@ static inline int ocrdma_resolve_dmac(struct ocrdma_dev *dev, · 468 unmodified lines
515 memcpy(&in6, ah_attr->grh.dgid.raw, sizeof(in6));515 memcpy(&in6, ah_attr->grh.dgid.raw, sizeof(in6));
516 if (rdma_is_multicast_addr(&in6))516 if (rdma_is_multicast_addr(&in6))
517 rdma_get_mcast_mac(&in6, mac_addr);517 rdma_get_mcast_mac(&in6, mac_addr);
518 else if (rdma_link_local_addr(&in6))
519 rdma_get_ll_mac(&in6, mac_addr);
518 else520 else
519 memcpy(mac_addr, ah_attr->dmac, ETH_ALEN);521 memcpy(mac_addr, ah_attr->dmac, ETH_ALEN);
520 return 0;522 return 0;
drivers/infiniband/hw/ocrdma/ocrdma_ah.c+10−2
@@ -56,7 +56,13 @@ static inline int set_av_attr(struct ocrdma_dev *dev, struct ocrdma_ah *ah, · 55 unmodified lines
56 vlan_tag = attr->vlan_id;56 vlan_tag = attr->vlan_id;
57 if (!vlan_tag || (vlan_tag > 0xFFF))57 if (!vlan_tag || (vlan_tag > 0xFFF))
58 vlan_tag = dev->pvid;58 vlan_tag = dev->pvid;
59 if (vlan_tag && (vlan_tag < 0x1000)) {59 if (vlan_tag || dev->pfc_state) {
60 if (!vlan_tag) {
61 pr_err("ocrdma%d:Using VLAN with PFC is recommended\n",
62 dev->id);
63 pr_err("ocrdma%d:Using VLAN 0 for this connection\n",
64 dev->id);
65 }
60 eth.eth_type = cpu_to_be16(0x8100);66 eth.eth_type = cpu_to_be16(0x8100);
61 eth.roce_eth_type = cpu_to_be16(OCRDMA_ROCE_ETH_TYPE);67 eth.roce_eth_type = cpu_to_be16(OCRDMA_ROCE_ETH_TYPE);
62 vlan_tag |= (dev->sl & 0x07) << OCRDMA_VID_PCP_SHIFT;68 vlan_tag |= (dev->sl & 0x07) << OCRDMA_VID_PCP_SHIFT;
@@ -121,7 +127,9 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr) · 58 unmodified lines
121 goto av_conf_err;127 goto av_conf_err;
122 }128 }
123 129
124 if (pd->uctx) {130 if ((pd->uctx) &&
131 (!rdma_is_multicast_addr((struct in6_addr *)attr->grh.dgid.raw)) &&
132 (!rdma_link_local_addr((struct in6_addr *)attr->grh.dgid.raw))) {
125 status = rdma_addr_find_dmac_by_grh(&sgid, &attr->grh.dgid,133 status = rdma_addr_find_dmac_by_grh(&sgid, &attr->grh.dgid,
126 attr->dmac, &attr->vlan_id);134 attr->dmac, &attr->vlan_id);
127 if (status) {135 if (status) {
drivers/infiniband/hw/ocrdma/ocrdma_hw.c+50−33
@@ -933,12 +933,18 @@ static irqreturn_t ocrdma_irq_handler(int irq, void *handle) · 932 unmodified lines
933 struct ocrdma_eqe eqe;933 struct ocrdma_eqe eqe;
934 struct ocrdma_eqe *ptr;934 struct ocrdma_eqe *ptr;
935 u16 cq_id;935 u16 cq_id;
936 u8 mcode;
936 int budget = eq->cq_cnt;937 int budget = eq->cq_cnt;
937 938
938 do {939 do {
939 ptr = ocrdma_get_eqe(eq);940 ptr = ocrdma_get_eqe(eq);
940 eqe = *ptr;941 eqe = *ptr;
941 ocrdma_le32_to_cpu(&eqe, sizeof(eqe));942 ocrdma_le32_to_cpu(&eqe, sizeof(eqe));
943 mcode = (eqe.id_valid & OCRDMA_EQE_MAJOR_CODE_MASK)
944 >> OCRDMA_EQE_MAJOR_CODE_SHIFT;
945 if (mcode == OCRDMA_MAJOR_CODE_SENTINAL)
946 pr_err("EQ full on eqid = 0x%x, eqe = 0x%x\n",
947 eq->q.id, eqe.id_valid);
942 if ((eqe.id_valid & OCRDMA_EQE_VALID_MASK) == 0)948 if ((eqe.id_valid & OCRDMA_EQE_VALID_MASK) == 0)
943 break;949 break;
944 950
@@ -1434,27 +1440,30 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev) · 489 unmodified lines
1434 struct ocrdma_alloc_pd_range_rsp *rsp;1440 struct ocrdma_alloc_pd_range_rsp *rsp;
1435 1441
1436 /* Pre allocate the DPP PDs */1442 /* Pre allocate the DPP PDs */
1437 cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd));1443 if (dev->attr.max_dpp_pds) {
1438 if (!cmd)1444 cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE,
1439 return -ENOMEM;1445 sizeof(*cmd));
1440 cmd->pd_count = dev->attr.max_dpp_pds;1446 if (!cmd)
1441 cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP;1447 return -ENOMEM;
1442 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);1448 cmd->pd_count = dev->attr.max_dpp_pds;
1443 if (status)1449 cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP;
1444 goto mbx_err;1450 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
1445 rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;1451 rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;
1446 1452
1447 if ((rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) && rsp->pd_count) {1453 if (!status && (rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) &&
1448 dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >>1454 rsp->pd_count) {
1449 OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT;1455 dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >>
1450 dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid &1456 OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT;
1451 OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;1457 dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid &
1452 dev->pd_mgr->max_dpp_pd = rsp->pd_count;1458 OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;
1453 pd_bitmap_size = BITS_TO_LONGS(rsp->pd_count) * sizeof(long);1459 dev->pd_mgr->max_dpp_pd = rsp->pd_count;
1454 dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size,1460 pd_bitmap_size =
1455 GFP_KERNEL);1461 BITS_TO_LONGS(rsp->pd_count) * sizeof(long);
1462 dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size,
1463 GFP_KERNEL);
1464 }
1465 kfree(cmd);
1456 }1466 }
1457 kfree(cmd);
1458 1467
1459 cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd));1468 cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd));
1460 if (!cmd)1469 if (!cmd)
@@ -1462,10 +1471,8 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev) · 1 unmodified line
1462 1471
1463 cmd->pd_count = dev->attr.max_pd - dev->attr.max_dpp_pds;1472 cmd->pd_count = dev->attr.max_pd - dev->attr.max_dpp_pds;
1464 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);1473 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
1465 if (status)
1466 goto mbx_err;
1467 rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;1474 rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;
1468 if (rsp->pd_count) {1475 if (!status && rsp->pd_count) {
1469 dev->pd_mgr->pd_norm_start = rsp->dpp_page_pdid &1476 dev->pd_mgr->pd_norm_start = rsp->dpp_page_pdid &
1470 OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;1477 OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;
1471 dev->pd_mgr->max_normal_pd = rsp->pd_count;1478 dev->pd_mgr->max_normal_pd = rsp->pd_count;
@@ -1473,15 +1480,13 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev) · 1 unmodified line
1473 dev->pd_mgr->pd_norm_bitmap = kzalloc(pd_bitmap_size,1480 dev->pd_mgr->pd_norm_bitmap = kzalloc(pd_bitmap_size,
1474 GFP_KERNEL);1481 GFP_KERNEL);
1475 }1482 }
1483 kfree(cmd);
1476 1484
1477 if (dev->pd_mgr->pd_norm_bitmap || dev->pd_mgr->pd_dpp_bitmap) {1485 if (dev->pd_mgr->pd_norm_bitmap || dev->pd_mgr->pd_dpp_bitmap) {
1478 /* Enable PD resource manager */1486 /* Enable PD resource manager */
1479 dev->pd_mgr->pd_prealloc_valid = true;1487 dev->pd_mgr->pd_prealloc_valid = true;
1480 } else {1488 return 0;
1481 return -ENOMEM;
1482 }1489 }
1483mbx_err:
1484 kfree(cmd);
1485 return status;1490 return status;
1486}1491}
1487 1492
@@ -2406,7 +2411,7 @@ int ocrdma_mbx_query_qp(struct ocrdma_dev *dev, struct ocrdma_qp *qp, · 918 unmodified lines
2406 struct ocrdma_query_qp *cmd;2411 struct ocrdma_query_qp *cmd;
2407 struct ocrdma_query_qp_rsp *rsp;2412 struct ocrdma_query_qp_rsp *rsp;
2408 2413
2409 cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_QUERY_QP, sizeof(*cmd));2414 cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_QUERY_QP, sizeof(*rsp));
2410 if (!cmd)2415 if (!cmd)
2411 return status;2416 return status;
2412 cmd->qp_id = qp->id;2417 cmd->qp_id = qp->id;
@@ -2428,7 +2433,7 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp, · 15 unmodified lines
2428 int status;2433 int status;
2429 struct ib_ah_attr *ah_attr = &attrs->ah_attr;2434 struct ib_ah_attr *ah_attr = &attrs->ah_attr;
2430 union ib_gid sgid, zgid;2435 union ib_gid sgid, zgid;
2431 u32 vlan_id;2436 u32 vlan_id = 0xFFFF;
2432 u8 mac_addr[6];2437 u8 mac_addr[6];
2433 struct ocrdma_dev *dev = get_ocrdma_dev(qp->ibqp.device);2438 struct ocrdma_dev *dev = get_ocrdma_dev(qp->ibqp.device);
2434 2439
@@ -2468,12 +2473,22 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp, · 33 unmodified lines
2468 cmd->params.vlan_dmac_b4_to_b5 = mac_addr[4] | (mac_addr[5] << 8);2473 cmd->params.vlan_dmac_b4_to_b5 = mac_addr[4] | (mac_addr[5] << 8);
2469 if (attr_mask & IB_QP_VID) {2474 if (attr_mask & IB_QP_VID) {
2470 vlan_id = attrs->vlan_id;2475 vlan_id = attrs->vlan_id;
2476 } else if (dev->pfc_state) {
2477 vlan_id = 0;
2478 pr_err("ocrdma%d:Using VLAN with PFC is recommended\n",
2479 dev->id);
2480 pr_err("ocrdma%d:Using VLAN 0 for this connection\n",
2481 dev->id);
2482 }
2483
2484 if (vlan_id < 0x1000) {
2471 cmd->params.vlan_dmac_b4_to_b5 |=2485 cmd->params.vlan_dmac_b4_to_b5 |=
2472 vlan_id << OCRDMA_QP_PARAMS_VLAN_SHIFT;2486 vlan_id << OCRDMA_QP_PARAMS_VLAN_SHIFT;
2473 cmd->flags |= OCRDMA_QP_PARA_VLAN_EN_VALID;2487 cmd->flags |= OCRDMA_QP_PARA_VLAN_EN_VALID;
2474 cmd->params.rnt_rc_sl_fl |=2488 cmd->params.rnt_rc_sl_fl |=
2475 (dev->sl & 0x07) << OCRDMA_QP_PARAMS_SL_SHIFT;2489 (dev->sl & 0x07) << OCRDMA_QP_PARAMS_SL_SHIFT;
2476 }2490 }
2491
2477 return 0;2492 return 0;
2478}2493}
2479 2494
@@ -2519,8 +2534,10 @@ static int ocrdma_set_qp_params(struct ocrdma_qp *qp, · 39 unmodified lines
2519 cmd->flags |= OCRDMA_QP_PARA_DST_QPN_VALID;2534 cmd->flags |= OCRDMA_QP_PARA_DST_QPN_VALID;
2520 }2535 }
2521 if (attr_mask & IB_QP_PATH_MTU) {2536 if (attr_mask & IB_QP_PATH_MTU) {
2522 if (attrs->path_mtu < IB_MTU_256 ||2537 if (attrs->path_mtu < IB_MTU_512 ||
2523 attrs->path_mtu > IB_MTU_4096) {2538 attrs->path_mtu > IB_MTU_4096) {
2539 pr_err("ocrdma%d: IB MTU %d is not supported\n",
2540 dev->id, ib_mtu_enum_to_int(attrs->path_mtu));
2524 status = -EINVAL;2541 status = -EINVAL;
2525 goto pmtu_err;2542 goto pmtu_err;
2526 }2543 }
@@ -3147,9 +3164,9 @@ void ocrdma_cleanup_hw(struct ocrdma_dev *dev) · 620 unmodified lines
3147 ocrdma_free_pd_pool(dev);3164 ocrdma_free_pd_pool(dev);
3148 ocrdma_mbx_delete_ah_tbl(dev);3165 ocrdma_mbx_delete_ah_tbl(dev);
3149 3166
3150 /* cleanup the eqs */
3151 ocrdma_destroy_eqs(dev);
3152
3153 /* cleanup the control path */3167 /* cleanup the control path */
3154 ocrdma_destroy_mq(dev);3168 ocrdma_destroy_mq(dev);
3169
3170 /* cleanup the eqs */
3171 ocrdma_destroy_eqs(dev);
3155}3172}
drivers/infiniband/hw/ocrdma/ocrdma_sli.h+9−0
@@ -1176,6 +1176,8 @@ struct ocrdma_query_qp_rsp { · 1175 unmodified lines
1176 struct ocrdma_mqe_hdr hdr;1176 struct ocrdma_mqe_hdr hdr;
1177 struct ocrdma_mbx_rsp rsp;1177 struct ocrdma_mbx_rsp rsp;
1178 struct ocrdma_qp_params params;1178 struct ocrdma_qp_params params;
1179 u32 dpp_credits_cqid;
1180 u32 rbq_id;
1179};1181};
1180 1182
1181enum {1183enum {
@@ -1624,12 +1626,19 @@ struct ocrdma_delete_ah_tbl_rsp { · 442 unmodified lines
1624enum {1626enum {
1625 OCRDMA_EQE_VALID_SHIFT = 0,1627 OCRDMA_EQE_VALID_SHIFT = 0,
1626 OCRDMA_EQE_VALID_MASK = BIT(0),1628 OCRDMA_EQE_VALID_MASK = BIT(0),
1629 OCRDMA_EQE_MAJOR_CODE_MASK = 0x0E,
1630 OCRDMA_EQE_MAJOR_CODE_SHIFT = 0x01,
1627 OCRDMA_EQE_FOR_CQE_MASK = 0xFFFE,1631 OCRDMA_EQE_FOR_CQE_MASK = 0xFFFE,
1628 OCRDMA_EQE_RESOURCE_ID_SHIFT = 16,1632 OCRDMA_EQE_RESOURCE_ID_SHIFT = 16,
1629 OCRDMA_EQE_RESOURCE_ID_MASK = 0xFFFF <<1633 OCRDMA_EQE_RESOURCE_ID_MASK = 0xFFFF <<
1630 OCRDMA_EQE_RESOURCE_ID_SHIFT,1634 OCRDMA_EQE_RESOURCE_ID_SHIFT,
1631};1635};
1632 1636
1637enum major_code {
1638 OCRDMA_MAJOR_CODE_COMPLETION = 0x00,
1639 OCRDMA_MAJOR_CODE_SENTINAL = 0x01
1640};
1641
1633struct ocrdma_eqe {1642struct ocrdma_eqe {
1634 u32 id_valid;1643 u32 id_valid;
1635};1644};
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c+7−5
@@ -365,7 +365,7 @@ static struct ocrdma_pd *_ocrdma_alloc_pd(struct ocrdma_dev *dev, · 364 unmodified lines
365 if (!pd)365 if (!pd)
366 return ERR_PTR(-ENOMEM);366 return ERR_PTR(-ENOMEM);
367 367
368 if (udata && uctx) {368 if (udata && uctx && dev->attr.max_dpp_pds) {
369 pd->dpp_enabled =369 pd->dpp_enabled =
370 ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R;370 ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R;
371 pd->num_dpp_qp =371 pd->num_dpp_qp =
@@ -1721,18 +1721,20 @@ int ocrdma_destroy_qp(struct ib_qp *ibqp) · 1349 unmodified lines
1721 struct ocrdma_qp *qp;1721 struct ocrdma_qp *qp;
1722 struct ocrdma_dev *dev;1722 struct ocrdma_dev *dev;
1723 struct ib_qp_attr attrs;1723 struct ib_qp_attr attrs;
1724 int attr_mask = IB_QP_STATE;1724 int attr_mask;
1725 unsigned long flags;1725 unsigned long flags;
1726 1726
1727 qp = get_ocrdma_qp(ibqp);1727 qp = get_ocrdma_qp(ibqp);
1728 dev = get_ocrdma_dev(ibqp->device);1728 dev = get_ocrdma_dev(ibqp->device);
1729 1729
1730 attrs.qp_state = IB_QPS_ERR;
1731 pd = qp->pd;1730 pd = qp->pd;
1732 1731
1733 /* change the QP state to ERROR */1732 /* change the QP state to ERROR */
1734 _ocrdma_modify_qp(ibqp, &attrs, attr_mask);1733 if (qp->state != OCRDMA_QPS_RST) {
1735 1734 attrs.qp_state = IB_QPS_ERR;
1735 attr_mask = IB_QP_STATE;
1736 _ocrdma_modify_qp(ibqp, &attrs, attr_mask);
1737 }
1736 /* ensure that CQEs for newly created QP (whose id may be same with1738 /* ensure that CQEs for newly created QP (whose id may be same with
1737 * one which just getting destroyed are same), dont get1739 * one which just getting destroyed are same), dont get
1738 * discarded until the old CQEs are discarded.1740 * discarded until the old CQEs are discarded.