Loading drivers/infiniband/core/cma.c +7 −2 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ MODULE_LICENSE("Dual BSD/GPL"); #define CMA_MAX_CM_RETRIES 15 #define CMA_CM_MRA_SETTING (IB_CM_MRA_FLAG_DELAY | 24) #define CMA_IBOE_PACKET_LIFETIME 18 #define CMA_PREFERRED_ROCE_GID_TYPE IB_GID_TYPE_ROCE_UDP_ENCAP static const char * const cma_events[] = { [RDMA_CM_EVENT_ADDR_RESOLVED] = "address resolved", Loading Loading @@ -4281,6 +4282,10 @@ static void cma_add_one(struct ib_device *device) for (i = rdma_start_port(device); i <= rdma_end_port(device); i++) { supported_gids = roce_gid_type_mask_support(device, i); WARN_ON(!supported_gids); if (supported_gids & CMA_PREFERRED_ROCE_GID_TYPE) cma_dev->default_gid_type[i - rdma_start_port(device)] = CMA_PREFERRED_ROCE_GID_TYPE; else cma_dev->default_gid_type[i - rdma_start_port(device)] = find_first_bit(&supported_gids, BITS_PER_LONG); cma_dev->default_roce_tos[i - rdma_start_port(device)] = 0; Loading drivers/infiniband/core/roce_gid_mgmt.c +2 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,8 @@ static struct workqueue_struct *gid_cache_wq; static struct workqueue_struct *gid_cache_wq; enum gid_op_type { GID_DEL = 0, GID_ADD Loading drivers/infiniband/core/verbs.c +55 −0 Original line number Diff line number Diff line Loading @@ -1314,6 +1314,61 @@ int ib_modify_qp_with_udata(struct ib_qp *qp, struct ib_qp_attr *attr, } EXPORT_SYMBOL(ib_modify_qp_with_udata); int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u8 *speed, u8 *width) { int rc; u32 netdev_speed; struct net_device *netdev; struct ethtool_link_ksettings lksettings; if (rdma_port_get_link_layer(dev, port_num) != IB_LINK_LAYER_ETHERNET) return -EINVAL; if (!dev->get_netdev) return -EOPNOTSUPP; netdev = dev->get_netdev(dev, port_num); if (!netdev) return -ENODEV; rtnl_lock(); rc = __ethtool_get_link_ksettings(netdev, &lksettings); rtnl_unlock(); dev_put(netdev); if (!rc) { netdev_speed = lksettings.base.speed; } else { netdev_speed = SPEED_1000; pr_warn("%s speed is unknown, defaulting to %d\n", netdev->name, netdev_speed); } if (netdev_speed <= SPEED_1000) { *width = IB_WIDTH_1X; *speed = IB_SPEED_SDR; } else if (netdev_speed <= SPEED_10000) { *width = IB_WIDTH_1X; *speed = IB_SPEED_FDR10; } else if (netdev_speed <= SPEED_20000) { *width = IB_WIDTH_4X; *speed = IB_SPEED_DDR; } else if (netdev_speed <= SPEED_25000) { *width = IB_WIDTH_1X; *speed = IB_SPEED_EDR; } else if (netdev_speed <= SPEED_40000) { *width = IB_WIDTH_4X; *speed = IB_SPEED_FDR10; } else { *width = IB_WIDTH_4X; *speed = IB_SPEED_EDR; } return 0; } EXPORT_SYMBOL(ib_get_eth_speed); int ib_modify_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr, int qp_attr_mask) Loading drivers/infiniband/hw/bnxt_re/ib_verbs.c +25 −63 Original line number Diff line number Diff line Loading @@ -223,50 +223,6 @@ int bnxt_re_modify_device(struct ib_device *ibdev, return 0; } static void __to_ib_speed_width(struct net_device *netdev, u8 *speed, u8 *width) { struct ethtool_link_ksettings lksettings; u32 espeed; if (netdev->ethtool_ops && netdev->ethtool_ops->get_link_ksettings) { memset(&lksettings, 0, sizeof(lksettings)); rtnl_lock(); netdev->ethtool_ops->get_link_ksettings(netdev, &lksettings); rtnl_unlock(); espeed = lksettings.base.speed; } else { espeed = SPEED_UNKNOWN; } switch (espeed) { case SPEED_1000: *speed = IB_SPEED_SDR; *width = IB_WIDTH_1X; break; case SPEED_10000: *speed = IB_SPEED_QDR; *width = IB_WIDTH_1X; break; case SPEED_20000: *speed = IB_SPEED_DDR; *width = IB_WIDTH_4X; break; case SPEED_25000: *speed = IB_SPEED_EDR; *width = IB_WIDTH_1X; break; case SPEED_40000: *speed = IB_SPEED_QDR; *width = IB_WIDTH_4X; break; case SPEED_50000: break; default: *speed = IB_SPEED_SDR; *width = IB_WIDTH_1X; break; } } /* Port */ int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num, struct ib_port_attr *port_attr) Loading Loading @@ -308,25 +264,9 @@ int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num, * IB stack to avoid race in the NETDEV_UNREG path */ if (test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags)) __to_ib_speed_width(rdev->netdev, &port_attr->active_speed, &port_attr->active_width); return 0; } int bnxt_re_modify_port(struct ib_device *ibdev, u8 port_num, int port_modify_mask, struct ib_port_modify *port_modify) { switch (port_modify_mask) { case IB_PORT_SHUTDOWN: break; case IB_PORT_INIT_TYPE: break; case IB_PORT_RESET_QKEY_CNTR: break; default: break; } if (!ib_get_eth_speed(ibdev, port_num, &port_attr->active_speed, &port_attr->active_width)) return -EINVAL; return 0; } Loading Loading @@ -846,6 +786,7 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp) struct bnxt_re_dev *rdev = qp->rdev; int rc; bnxt_qplib_del_flush_qp(&qp->qplib_qp); rc = bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp); if (rc) { dev_err(rdev_to_dev(rdev), "Failed to destroy HW QP"); Loading @@ -860,6 +801,7 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp) return rc; } bnxt_qplib_del_flush_qp(&qp->qplib_qp); rc = bnxt_qplib_destroy_qp(&rdev->qplib_res, &rdev->qp1_sqp->qplib_qp); if (rc) { Loading Loading @@ -1404,6 +1346,21 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr, } qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_STATE; qp->qplib_qp.state = __from_ib_qp_state(qp_attr->qp_state); if (!qp->sumem && qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_ERR) { dev_dbg(rdev_to_dev(rdev), "Move QP = %p to flush list\n", qp); bnxt_qplib_add_flush_qp(&qp->qplib_qp); } if (!qp->sumem && qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_RESET) { dev_dbg(rdev_to_dev(rdev), "Move QP = %p out of flush list\n", qp); bnxt_qplib_del_flush_qp(&qp->qplib_qp); } } if (qp_attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY) { qp->qplib_qp.modify_flags |= Loading Loading @@ -2414,6 +2371,7 @@ struct ib_cq *bnxt_re_create_cq(struct ib_device *ibdev, } cq->qplib_cq.max_wqe = entries; cq->qplib_cq.cnq_hw_ring_id = rdev->nq.ring_id; cq->qplib_cq.nq = &rdev->nq; rc = bnxt_qplib_create_cq(&rdev->qplib_res, &cq->qplib_cq); if (rc) { Loading Loading @@ -2921,6 +2879,10 @@ int bnxt_re_poll_cq(struct ib_cq *ib_cq, int num_entries, struct ib_wc *wc) sq->send_phantom = false; } } if (ncqe < budget) ncqe += bnxt_qplib_process_flush_list(&cq->qplib_cq, cqe + ncqe, budget - ncqe); if (!ncqe) break; Loading drivers/infiniband/hw/bnxt_re/ib_verbs.h +0 −3 Original line number Diff line number Diff line Loading @@ -141,9 +141,6 @@ int bnxt_re_modify_device(struct ib_device *ibdev, struct ib_device_modify *device_modify); int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num, struct ib_port_attr *port_attr); int bnxt_re_modify_port(struct ib_device *ibdev, u8 port_num, int port_modify_mask, struct ib_port_modify *port_modify); int bnxt_re_get_port_immutable(struct ib_device *ibdev, u8 port_num, struct ib_port_immutable *immutable); int bnxt_re_query_pkey(struct ib_device *ibdev, u8 port_num, Loading Loading
drivers/infiniband/core/cma.c +7 −2 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ MODULE_LICENSE("Dual BSD/GPL"); #define CMA_MAX_CM_RETRIES 15 #define CMA_CM_MRA_SETTING (IB_CM_MRA_FLAG_DELAY | 24) #define CMA_IBOE_PACKET_LIFETIME 18 #define CMA_PREFERRED_ROCE_GID_TYPE IB_GID_TYPE_ROCE_UDP_ENCAP static const char * const cma_events[] = { [RDMA_CM_EVENT_ADDR_RESOLVED] = "address resolved", Loading Loading @@ -4281,6 +4282,10 @@ static void cma_add_one(struct ib_device *device) for (i = rdma_start_port(device); i <= rdma_end_port(device); i++) { supported_gids = roce_gid_type_mask_support(device, i); WARN_ON(!supported_gids); if (supported_gids & CMA_PREFERRED_ROCE_GID_TYPE) cma_dev->default_gid_type[i - rdma_start_port(device)] = CMA_PREFERRED_ROCE_GID_TYPE; else cma_dev->default_gid_type[i - rdma_start_port(device)] = find_first_bit(&supported_gids, BITS_PER_LONG); cma_dev->default_roce_tos[i - rdma_start_port(device)] = 0; Loading
drivers/infiniband/core/roce_gid_mgmt.c +2 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,8 @@ static struct workqueue_struct *gid_cache_wq; static struct workqueue_struct *gid_cache_wq; enum gid_op_type { GID_DEL = 0, GID_ADD Loading
drivers/infiniband/core/verbs.c +55 −0 Original line number Diff line number Diff line Loading @@ -1314,6 +1314,61 @@ int ib_modify_qp_with_udata(struct ib_qp *qp, struct ib_qp_attr *attr, } EXPORT_SYMBOL(ib_modify_qp_with_udata); int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u8 *speed, u8 *width) { int rc; u32 netdev_speed; struct net_device *netdev; struct ethtool_link_ksettings lksettings; if (rdma_port_get_link_layer(dev, port_num) != IB_LINK_LAYER_ETHERNET) return -EINVAL; if (!dev->get_netdev) return -EOPNOTSUPP; netdev = dev->get_netdev(dev, port_num); if (!netdev) return -ENODEV; rtnl_lock(); rc = __ethtool_get_link_ksettings(netdev, &lksettings); rtnl_unlock(); dev_put(netdev); if (!rc) { netdev_speed = lksettings.base.speed; } else { netdev_speed = SPEED_1000; pr_warn("%s speed is unknown, defaulting to %d\n", netdev->name, netdev_speed); } if (netdev_speed <= SPEED_1000) { *width = IB_WIDTH_1X; *speed = IB_SPEED_SDR; } else if (netdev_speed <= SPEED_10000) { *width = IB_WIDTH_1X; *speed = IB_SPEED_FDR10; } else if (netdev_speed <= SPEED_20000) { *width = IB_WIDTH_4X; *speed = IB_SPEED_DDR; } else if (netdev_speed <= SPEED_25000) { *width = IB_WIDTH_1X; *speed = IB_SPEED_EDR; } else if (netdev_speed <= SPEED_40000) { *width = IB_WIDTH_4X; *speed = IB_SPEED_FDR10; } else { *width = IB_WIDTH_4X; *speed = IB_SPEED_EDR; } return 0; } EXPORT_SYMBOL(ib_get_eth_speed); int ib_modify_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr, int qp_attr_mask) Loading
drivers/infiniband/hw/bnxt_re/ib_verbs.c +25 −63 Original line number Diff line number Diff line Loading @@ -223,50 +223,6 @@ int bnxt_re_modify_device(struct ib_device *ibdev, return 0; } static void __to_ib_speed_width(struct net_device *netdev, u8 *speed, u8 *width) { struct ethtool_link_ksettings lksettings; u32 espeed; if (netdev->ethtool_ops && netdev->ethtool_ops->get_link_ksettings) { memset(&lksettings, 0, sizeof(lksettings)); rtnl_lock(); netdev->ethtool_ops->get_link_ksettings(netdev, &lksettings); rtnl_unlock(); espeed = lksettings.base.speed; } else { espeed = SPEED_UNKNOWN; } switch (espeed) { case SPEED_1000: *speed = IB_SPEED_SDR; *width = IB_WIDTH_1X; break; case SPEED_10000: *speed = IB_SPEED_QDR; *width = IB_WIDTH_1X; break; case SPEED_20000: *speed = IB_SPEED_DDR; *width = IB_WIDTH_4X; break; case SPEED_25000: *speed = IB_SPEED_EDR; *width = IB_WIDTH_1X; break; case SPEED_40000: *speed = IB_SPEED_QDR; *width = IB_WIDTH_4X; break; case SPEED_50000: break; default: *speed = IB_SPEED_SDR; *width = IB_WIDTH_1X; break; } } /* Port */ int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num, struct ib_port_attr *port_attr) Loading Loading @@ -308,25 +264,9 @@ int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num, * IB stack to avoid race in the NETDEV_UNREG path */ if (test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags)) __to_ib_speed_width(rdev->netdev, &port_attr->active_speed, &port_attr->active_width); return 0; } int bnxt_re_modify_port(struct ib_device *ibdev, u8 port_num, int port_modify_mask, struct ib_port_modify *port_modify) { switch (port_modify_mask) { case IB_PORT_SHUTDOWN: break; case IB_PORT_INIT_TYPE: break; case IB_PORT_RESET_QKEY_CNTR: break; default: break; } if (!ib_get_eth_speed(ibdev, port_num, &port_attr->active_speed, &port_attr->active_width)) return -EINVAL; return 0; } Loading Loading @@ -846,6 +786,7 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp) struct bnxt_re_dev *rdev = qp->rdev; int rc; bnxt_qplib_del_flush_qp(&qp->qplib_qp); rc = bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp); if (rc) { dev_err(rdev_to_dev(rdev), "Failed to destroy HW QP"); Loading @@ -860,6 +801,7 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp) return rc; } bnxt_qplib_del_flush_qp(&qp->qplib_qp); rc = bnxt_qplib_destroy_qp(&rdev->qplib_res, &rdev->qp1_sqp->qplib_qp); if (rc) { Loading Loading @@ -1404,6 +1346,21 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr, } qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_STATE; qp->qplib_qp.state = __from_ib_qp_state(qp_attr->qp_state); if (!qp->sumem && qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_ERR) { dev_dbg(rdev_to_dev(rdev), "Move QP = %p to flush list\n", qp); bnxt_qplib_add_flush_qp(&qp->qplib_qp); } if (!qp->sumem && qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_RESET) { dev_dbg(rdev_to_dev(rdev), "Move QP = %p out of flush list\n", qp); bnxt_qplib_del_flush_qp(&qp->qplib_qp); } } if (qp_attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY) { qp->qplib_qp.modify_flags |= Loading Loading @@ -2414,6 +2371,7 @@ struct ib_cq *bnxt_re_create_cq(struct ib_device *ibdev, } cq->qplib_cq.max_wqe = entries; cq->qplib_cq.cnq_hw_ring_id = rdev->nq.ring_id; cq->qplib_cq.nq = &rdev->nq; rc = bnxt_qplib_create_cq(&rdev->qplib_res, &cq->qplib_cq); if (rc) { Loading Loading @@ -2921,6 +2879,10 @@ int bnxt_re_poll_cq(struct ib_cq *ib_cq, int num_entries, struct ib_wc *wc) sq->send_phantom = false; } } if (ncqe < budget) ncqe += bnxt_qplib_process_flush_list(&cq->qplib_cq, cqe + ncqe, budget - ncqe); if (!ncqe) break; Loading
drivers/infiniband/hw/bnxt_re/ib_verbs.h +0 −3 Original line number Diff line number Diff line Loading @@ -141,9 +141,6 @@ int bnxt_re_modify_device(struct ib_device *ibdev, struct ib_device_modify *device_modify); int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num, struct ib_port_attr *port_attr); int bnxt_re_modify_port(struct ib_device *ibdev, u8 port_num, int port_modify_mask, struct ib_port_modify *port_modify); int bnxt_re_get_port_immutable(struct ib_device *ibdev, u8 port_num, struct ib_port_immutable *immutable); int bnxt_re_query_pkey(struct ib_device *ibdev, u8 port_num, Loading