Loading drivers/infiniband/hw/ocrdma/ocrdma.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -61,6 +61,7 @@ struct ocrdma_dev_attr { u32 max_inline_data; u32 max_inline_data; int max_send_sge; int max_send_sge; int max_recv_sge; int max_recv_sge; int max_srq_sge; int max_mr; int max_mr; u64 max_mr_size; u64 max_mr_size; u32 max_num_mr_pbl; u32 max_num_mr_pbl; Loading drivers/infiniband/hw/ocrdma/ocrdma_hw.c +8 −10 Original line number Original line Diff line number Diff line Loading @@ -990,8 +990,6 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev, struct ocrdma_dev_attr *attr, struct ocrdma_dev_attr *attr, struct ocrdma_mbx_query_config *rsp) struct ocrdma_mbx_query_config *rsp) { { int max_q_mem; attr->max_pd = attr->max_pd = (rsp->max_pd_ca_ack_delay & OCRDMA_MBX_QUERY_CFG_MAX_PD_MASK) >> (rsp->max_pd_ca_ack_delay & OCRDMA_MBX_QUERY_CFG_MAX_PD_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_PD_SHIFT; OCRDMA_MBX_QUERY_CFG_MAX_PD_SHIFT; Loading @@ -1004,6 +1002,9 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev, attr->max_recv_sge = (rsp->max_write_send_sge & attr->max_recv_sge = (rsp->max_write_send_sge & OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT; OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT; attr->max_srq_sge = (rsp->max_srq_rqe_sge & OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET; attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; Loading Loading @@ -1037,18 +1038,15 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev, attr->max_inline_data = attr->max_inline_data = attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) + attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) + sizeof(struct ocrdma_sge)); sizeof(struct ocrdma_sge)); max_q_mem = OCRDMA_Q_PAGE_BASE_SIZE << (OCRDMA_MAX_Q_PAGE_SIZE_CNT - 1); /* hw can queue one less then the configured size, * so publish less by one to stack. */ if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { dev->attr.max_wqe = max_q_mem / dev->attr.wqe_size; attr->ird = 1; attr->ird = 1; attr->ird_page_size = OCRDMA_MIN_Q_PAGE_SIZE; attr->ird_page_size = OCRDMA_MIN_Q_PAGE_SIZE; attr->num_ird_pages = MAX_OCRDMA_IRD_PAGES; attr->num_ird_pages = MAX_OCRDMA_IRD_PAGES; } else } dev->attr.max_wqe = (max_q_mem / dev->attr.wqe_size) - 1; dev->attr.max_wqe = rsp->max_wqes_rqes_per_q >> dev->attr.max_rqe = (max_q_mem / dev->attr.rqe_size) - 1; OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET; dev->attr.max_rqe = rsp->max_wqes_rqes_per_q & OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_MASK; } } static int ocrdma_check_fw_config(struct ocrdma_dev *dev, static int ocrdma_check_fw_config(struct ocrdma_dev *dev, Loading drivers/infiniband/hw/ocrdma/ocrdma_main.c +34 −29 Original line number Original line Diff line number Diff line Loading @@ -97,13 +97,11 @@ static void ocrdma_build_sgid_mac(union ib_gid *sgid, unsigned char *mac_addr, sgid->raw[15] = mac_addr[5]; sgid->raw[15] = mac_addr[5]; } } static void ocrdma_add_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, static bool ocrdma_add_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, bool is_vlan, u16 vlan_id) bool is_vlan, u16 vlan_id) { { int i; int i; bool found = false; union ib_gid new_sgid; union ib_gid new_sgid; int free_idx = OCRDMA_MAX_SGID; unsigned long flags; unsigned long flags; memset(&ocrdma_zero_sgid, 0, sizeof(union ib_gid)); memset(&ocrdma_zero_sgid, 0, sizeof(union ib_gid)); Loading @@ -115,23 +113,19 @@ static void ocrdma_add_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, if (!memcmp(&dev->sgid_tbl[i], &ocrdma_zero_sgid, if (!memcmp(&dev->sgid_tbl[i], &ocrdma_zero_sgid, sizeof(union ib_gid))) { sizeof(union ib_gid))) { /* found free entry */ /* found free entry */ if (!found) { memcpy(&dev->sgid_tbl[i], &new_sgid, free_idx = i; sizeof(union ib_gid)); found = true; spin_unlock_irqrestore(&dev->sgid_lock, flags); break; return true; } } else if (!memcmp(&dev->sgid_tbl[i], &new_sgid, } else if (!memcmp(&dev->sgid_tbl[i], &new_sgid, sizeof(union ib_gid))) { sizeof(union ib_gid))) { /* entry already present, no addition is required. */ /* entry already present, no addition is required. */ spin_unlock_irqrestore(&dev->sgid_lock, flags); spin_unlock_irqrestore(&dev->sgid_lock, flags); return; return false; } } } } /* if entry doesn't exist and if table has some space, add entry */ if (found) memcpy(&dev->sgid_tbl[free_idx], &new_sgid, sizeof(union ib_gid)); spin_unlock_irqrestore(&dev->sgid_lock, flags); spin_unlock_irqrestore(&dev->sgid_lock, flags); return false; } } static bool ocrdma_del_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, static bool ocrdma_del_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, Loading Loading @@ -167,7 +161,8 @@ static void ocrdma_add_default_sgid(struct ocrdma_dev *dev) ocrdma_get_guid(dev, &sgid->raw[8]); ocrdma_get_guid(dev, &sgid->raw[8]); } } static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev) #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) static void ocrdma_add_vlan_sgids(struct ocrdma_dev *dev) { { struct net_device *netdev, *tmp; struct net_device *netdev, *tmp; u16 vlan_id; u16 vlan_id; Loading @@ -175,8 +170,6 @@ static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev) netdev = dev->nic_info.netdev; netdev = dev->nic_info.netdev; ocrdma_add_default_sgid(dev); rcu_read_lock(); rcu_read_lock(); for_each_netdev_rcu(&init_net, tmp) { for_each_netdev_rcu(&init_net, tmp) { if (netdev == tmp || vlan_dev_real_dev(tmp) == netdev) { if (netdev == tmp || vlan_dev_real_dev(tmp) == netdev) { Loading @@ -194,10 +187,23 @@ static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev) } } } } rcu_read_unlock(); rcu_read_unlock(); } #else static void ocrdma_add_vlan_sgids(struct ocrdma_dev *dev) { } #endif /* VLAN */ static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev) { ocrdma_add_default_sgid(dev); ocrdma_add_vlan_sgids(dev); return 0; return 0; } } #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) || \ defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) static int ocrdma_inet6addr_event(struct notifier_block *notifier, static int ocrdma_inet6addr_event(struct notifier_block *notifier, unsigned long event, void *ptr) unsigned long event, void *ptr) Loading @@ -208,6 +214,7 @@ static int ocrdma_inet6addr_event(struct notifier_block *notifier, struct ib_event gid_event; struct ib_event gid_event; struct ocrdma_dev *dev; struct ocrdma_dev *dev; bool found = false; bool found = false; bool updated = false; bool is_vlan = false; bool is_vlan = false; u16 vid = 0; u16 vid = 0; Loading @@ -233,23 +240,21 @@ static int ocrdma_inet6addr_event(struct notifier_block *notifier, mutex_lock(&dev->dev_lock); mutex_lock(&dev->dev_lock); switch (event) { switch (event) { case NETDEV_UP: case NETDEV_UP: ocrdma_add_sgid(dev, netdev->dev_addr, is_vlan, vid); updated = ocrdma_add_sgid(dev, netdev->dev_addr, is_vlan, vid); break; break; case NETDEV_DOWN: case NETDEV_DOWN: found = ocrdma_del_sgid(dev, netdev->dev_addr, is_vlan, vid); updated = ocrdma_del_sgid(dev, netdev->dev_addr, is_vlan, vid); if (found) { break; /* found the matching entry, notify default: * the consumers about it break; */ } if (updated) { /* GID table updated, notify the consumers about it */ gid_event.device = &dev->ibdev; gid_event.device = &dev->ibdev; gid_event.element.port_num = 1; gid_event.element.port_num = 1; gid_event.event = IB_EVENT_GID_CHANGE; gid_event.event = IB_EVENT_GID_CHANGE; ib_dispatch_event(&gid_event); ib_dispatch_event(&gid_event); } } break; default: break; } mutex_unlock(&dev->dev_lock); mutex_unlock(&dev->dev_lock); return NOTIFY_OK; return NOTIFY_OK; } } Loading @@ -258,7 +263,7 @@ static struct notifier_block ocrdma_inet6addr_notifier = { .notifier_call = ocrdma_inet6addr_event .notifier_call = ocrdma_inet6addr_event }; }; #endif /* IPV6 */ #endif /* IPV6 and VLAN */ static enum rdma_link_layer ocrdma_link_layer(struct ib_device *device, static enum rdma_link_layer ocrdma_link_layer(struct ib_device *device, u8 port_num) u8 port_num) Loading drivers/infiniband/hw/ocrdma/ocrdma_sli.h +4 −1 Original line number Original line Diff line number Diff line Loading @@ -418,6 +418,9 @@ enum { OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT = 0, OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT = 0, OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK = 0xFFFF, OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK = 0xFFFF, OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT = 16, OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_MASK = 0xFFFF << OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT, OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT = 0, OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT = 0, OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK = 0xFFFF, OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK = 0xFFFF, Loading Loading @@ -458,7 +461,7 @@ enum { OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET, OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET, OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_OFFSET = 0, OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_OFFSET = 0, OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_MASK = 0xFFFF << OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_MASK = 0xFFFF << OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET, OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_OFFSET, OCRDMA_MBX_QUERY_CFG_MAX_CQ_OFFSET = 16, OCRDMA_MBX_QUERY_CFG_MAX_CQ_OFFSET = 16, OCRDMA_MBX_QUERY_CFG_MAX_CQ_MASK = 0xFFFF << OCRDMA_MBX_QUERY_CFG_MAX_CQ_MASK = 0xFFFF << Loading drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +7 −5 Original line number Original line Diff line number Diff line Loading @@ -53,7 +53,7 @@ int ocrdma_query_gid(struct ib_device *ibdev, u8 port, dev = get_ocrdma_dev(ibdev); dev = get_ocrdma_dev(ibdev); memset(sgid, 0, sizeof(*sgid)); memset(sgid, 0, sizeof(*sgid)); if (index > OCRDMA_MAX_SGID) if (index >= OCRDMA_MAX_SGID) return -EINVAL; return -EINVAL; memcpy(sgid, &dev->sgid_tbl[index], sizeof(*sgid)); memcpy(sgid, &dev->sgid_tbl[index], sizeof(*sgid)); Loading Loading @@ -83,8 +83,8 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr) IB_DEVICE_SHUTDOWN_PORT | IB_DEVICE_SHUTDOWN_PORT | IB_DEVICE_SYS_IMAGE_GUID | IB_DEVICE_SYS_IMAGE_GUID | IB_DEVICE_LOCAL_DMA_LKEY; IB_DEVICE_LOCAL_DMA_LKEY; attr->max_sge = dev->attr.max_send_sge; attr->max_sge = min(dev->attr.max_send_sge, dev->attr.max_srq_sge); attr->max_sge_rd = dev->attr.max_send_sge; attr->max_sge_rd = 0; attr->max_cq = dev->attr.max_cq; attr->max_cq = dev->attr.max_cq; attr->max_cqe = dev->attr.max_cqe; attr->max_cqe = dev->attr.max_cqe; attr->max_mr = dev->attr.max_mr; attr->max_mr = dev->attr.max_mr; Loading @@ -97,7 +97,7 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr) min(dev->attr.max_ord_per_qp, dev->attr.max_ird_per_qp); min(dev->attr.max_ord_per_qp, dev->attr.max_ird_per_qp); attr->max_qp_init_rd_atom = dev->attr.max_ord_per_qp; attr->max_qp_init_rd_atom = dev->attr.max_ord_per_qp; attr->max_srq = (dev->attr.max_qp - 1); attr->max_srq = (dev->attr.max_qp - 1); attr->max_srq_sge = attr->max_sge; attr->max_srq_sge = attr->max_srq_sge; attr->max_srq_wr = dev->attr.max_rqe; attr->max_srq_wr = dev->attr.max_rqe; attr->local_ca_ack_delay = dev->attr.local_ca_ack_delay; attr->local_ca_ack_delay = dev->attr.local_ca_ack_delay; attr->max_fast_reg_page_list_len = 0; attr->max_fast_reg_page_list_len = 0; Loading Loading @@ -2301,8 +2301,10 @@ static bool ocrdma_poll_err_rcqe(struct ocrdma_qp *qp, struct ocrdma_cqe *cqe, *stop = true; *stop = true; expand = false; expand = false; } } } else } else { *polled = true; expand = ocrdma_update_err_rcqe(ibwc, cqe, qp, status); expand = ocrdma_update_err_rcqe(ibwc, cqe, qp, status); } return expand; return expand; } } Loading Loading
drivers/infiniband/hw/ocrdma/ocrdma.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -61,6 +61,7 @@ struct ocrdma_dev_attr { u32 max_inline_data; u32 max_inline_data; int max_send_sge; int max_send_sge; int max_recv_sge; int max_recv_sge; int max_srq_sge; int max_mr; int max_mr; u64 max_mr_size; u64 max_mr_size; u32 max_num_mr_pbl; u32 max_num_mr_pbl; Loading
drivers/infiniband/hw/ocrdma/ocrdma_hw.c +8 −10 Original line number Original line Diff line number Diff line Loading @@ -990,8 +990,6 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev, struct ocrdma_dev_attr *attr, struct ocrdma_dev_attr *attr, struct ocrdma_mbx_query_config *rsp) struct ocrdma_mbx_query_config *rsp) { { int max_q_mem; attr->max_pd = attr->max_pd = (rsp->max_pd_ca_ack_delay & OCRDMA_MBX_QUERY_CFG_MAX_PD_MASK) >> (rsp->max_pd_ca_ack_delay & OCRDMA_MBX_QUERY_CFG_MAX_PD_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_PD_SHIFT; OCRDMA_MBX_QUERY_CFG_MAX_PD_SHIFT; Loading @@ -1004,6 +1002,9 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev, attr->max_recv_sge = (rsp->max_write_send_sge & attr->max_recv_sge = (rsp->max_write_send_sge & OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT; OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT; attr->max_srq_sge = (rsp->max_srq_rqe_sge & OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET; attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; Loading Loading @@ -1037,18 +1038,15 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev, attr->max_inline_data = attr->max_inline_data = attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) + attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) + sizeof(struct ocrdma_sge)); sizeof(struct ocrdma_sge)); max_q_mem = OCRDMA_Q_PAGE_BASE_SIZE << (OCRDMA_MAX_Q_PAGE_SIZE_CNT - 1); /* hw can queue one less then the configured size, * so publish less by one to stack. */ if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { dev->attr.max_wqe = max_q_mem / dev->attr.wqe_size; attr->ird = 1; attr->ird = 1; attr->ird_page_size = OCRDMA_MIN_Q_PAGE_SIZE; attr->ird_page_size = OCRDMA_MIN_Q_PAGE_SIZE; attr->num_ird_pages = MAX_OCRDMA_IRD_PAGES; attr->num_ird_pages = MAX_OCRDMA_IRD_PAGES; } else } dev->attr.max_wqe = (max_q_mem / dev->attr.wqe_size) - 1; dev->attr.max_wqe = rsp->max_wqes_rqes_per_q >> dev->attr.max_rqe = (max_q_mem / dev->attr.rqe_size) - 1; OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET; dev->attr.max_rqe = rsp->max_wqes_rqes_per_q & OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_MASK; } } static int ocrdma_check_fw_config(struct ocrdma_dev *dev, static int ocrdma_check_fw_config(struct ocrdma_dev *dev, Loading
drivers/infiniband/hw/ocrdma/ocrdma_main.c +34 −29 Original line number Original line Diff line number Diff line Loading @@ -97,13 +97,11 @@ static void ocrdma_build_sgid_mac(union ib_gid *sgid, unsigned char *mac_addr, sgid->raw[15] = mac_addr[5]; sgid->raw[15] = mac_addr[5]; } } static void ocrdma_add_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, static bool ocrdma_add_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, bool is_vlan, u16 vlan_id) bool is_vlan, u16 vlan_id) { { int i; int i; bool found = false; union ib_gid new_sgid; union ib_gid new_sgid; int free_idx = OCRDMA_MAX_SGID; unsigned long flags; unsigned long flags; memset(&ocrdma_zero_sgid, 0, sizeof(union ib_gid)); memset(&ocrdma_zero_sgid, 0, sizeof(union ib_gid)); Loading @@ -115,23 +113,19 @@ static void ocrdma_add_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, if (!memcmp(&dev->sgid_tbl[i], &ocrdma_zero_sgid, if (!memcmp(&dev->sgid_tbl[i], &ocrdma_zero_sgid, sizeof(union ib_gid))) { sizeof(union ib_gid))) { /* found free entry */ /* found free entry */ if (!found) { memcpy(&dev->sgid_tbl[i], &new_sgid, free_idx = i; sizeof(union ib_gid)); found = true; spin_unlock_irqrestore(&dev->sgid_lock, flags); break; return true; } } else if (!memcmp(&dev->sgid_tbl[i], &new_sgid, } else if (!memcmp(&dev->sgid_tbl[i], &new_sgid, sizeof(union ib_gid))) { sizeof(union ib_gid))) { /* entry already present, no addition is required. */ /* entry already present, no addition is required. */ spin_unlock_irqrestore(&dev->sgid_lock, flags); spin_unlock_irqrestore(&dev->sgid_lock, flags); return; return false; } } } } /* if entry doesn't exist and if table has some space, add entry */ if (found) memcpy(&dev->sgid_tbl[free_idx], &new_sgid, sizeof(union ib_gid)); spin_unlock_irqrestore(&dev->sgid_lock, flags); spin_unlock_irqrestore(&dev->sgid_lock, flags); return false; } } static bool ocrdma_del_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, static bool ocrdma_del_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, Loading Loading @@ -167,7 +161,8 @@ static void ocrdma_add_default_sgid(struct ocrdma_dev *dev) ocrdma_get_guid(dev, &sgid->raw[8]); ocrdma_get_guid(dev, &sgid->raw[8]); } } static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev) #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) static void ocrdma_add_vlan_sgids(struct ocrdma_dev *dev) { { struct net_device *netdev, *tmp; struct net_device *netdev, *tmp; u16 vlan_id; u16 vlan_id; Loading @@ -175,8 +170,6 @@ static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev) netdev = dev->nic_info.netdev; netdev = dev->nic_info.netdev; ocrdma_add_default_sgid(dev); rcu_read_lock(); rcu_read_lock(); for_each_netdev_rcu(&init_net, tmp) { for_each_netdev_rcu(&init_net, tmp) { if (netdev == tmp || vlan_dev_real_dev(tmp) == netdev) { if (netdev == tmp || vlan_dev_real_dev(tmp) == netdev) { Loading @@ -194,10 +187,23 @@ static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev) } } } } rcu_read_unlock(); rcu_read_unlock(); } #else static void ocrdma_add_vlan_sgids(struct ocrdma_dev *dev) { } #endif /* VLAN */ static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev) { ocrdma_add_default_sgid(dev); ocrdma_add_vlan_sgids(dev); return 0; return 0; } } #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) || \ defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) static int ocrdma_inet6addr_event(struct notifier_block *notifier, static int ocrdma_inet6addr_event(struct notifier_block *notifier, unsigned long event, void *ptr) unsigned long event, void *ptr) Loading @@ -208,6 +214,7 @@ static int ocrdma_inet6addr_event(struct notifier_block *notifier, struct ib_event gid_event; struct ib_event gid_event; struct ocrdma_dev *dev; struct ocrdma_dev *dev; bool found = false; bool found = false; bool updated = false; bool is_vlan = false; bool is_vlan = false; u16 vid = 0; u16 vid = 0; Loading @@ -233,23 +240,21 @@ static int ocrdma_inet6addr_event(struct notifier_block *notifier, mutex_lock(&dev->dev_lock); mutex_lock(&dev->dev_lock); switch (event) { switch (event) { case NETDEV_UP: case NETDEV_UP: ocrdma_add_sgid(dev, netdev->dev_addr, is_vlan, vid); updated = ocrdma_add_sgid(dev, netdev->dev_addr, is_vlan, vid); break; break; case NETDEV_DOWN: case NETDEV_DOWN: found = ocrdma_del_sgid(dev, netdev->dev_addr, is_vlan, vid); updated = ocrdma_del_sgid(dev, netdev->dev_addr, is_vlan, vid); if (found) { break; /* found the matching entry, notify default: * the consumers about it break; */ } if (updated) { /* GID table updated, notify the consumers about it */ gid_event.device = &dev->ibdev; gid_event.device = &dev->ibdev; gid_event.element.port_num = 1; gid_event.element.port_num = 1; gid_event.event = IB_EVENT_GID_CHANGE; gid_event.event = IB_EVENT_GID_CHANGE; ib_dispatch_event(&gid_event); ib_dispatch_event(&gid_event); } } break; default: break; } mutex_unlock(&dev->dev_lock); mutex_unlock(&dev->dev_lock); return NOTIFY_OK; return NOTIFY_OK; } } Loading @@ -258,7 +263,7 @@ static struct notifier_block ocrdma_inet6addr_notifier = { .notifier_call = ocrdma_inet6addr_event .notifier_call = ocrdma_inet6addr_event }; }; #endif /* IPV6 */ #endif /* IPV6 and VLAN */ static enum rdma_link_layer ocrdma_link_layer(struct ib_device *device, static enum rdma_link_layer ocrdma_link_layer(struct ib_device *device, u8 port_num) u8 port_num) Loading
drivers/infiniband/hw/ocrdma/ocrdma_sli.h +4 −1 Original line number Original line Diff line number Diff line Loading @@ -418,6 +418,9 @@ enum { OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT = 0, OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT = 0, OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK = 0xFFFF, OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK = 0xFFFF, OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT = 16, OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_MASK = 0xFFFF << OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT, OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT = 0, OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT = 0, OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK = 0xFFFF, OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK = 0xFFFF, Loading Loading @@ -458,7 +461,7 @@ enum { OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET, OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET, OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_OFFSET = 0, OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_OFFSET = 0, OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_MASK = 0xFFFF << OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_MASK = 0xFFFF << OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET, OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_OFFSET, OCRDMA_MBX_QUERY_CFG_MAX_CQ_OFFSET = 16, OCRDMA_MBX_QUERY_CFG_MAX_CQ_OFFSET = 16, OCRDMA_MBX_QUERY_CFG_MAX_CQ_MASK = 0xFFFF << OCRDMA_MBX_QUERY_CFG_MAX_CQ_MASK = 0xFFFF << Loading
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +7 −5 Original line number Original line Diff line number Diff line Loading @@ -53,7 +53,7 @@ int ocrdma_query_gid(struct ib_device *ibdev, u8 port, dev = get_ocrdma_dev(ibdev); dev = get_ocrdma_dev(ibdev); memset(sgid, 0, sizeof(*sgid)); memset(sgid, 0, sizeof(*sgid)); if (index > OCRDMA_MAX_SGID) if (index >= OCRDMA_MAX_SGID) return -EINVAL; return -EINVAL; memcpy(sgid, &dev->sgid_tbl[index], sizeof(*sgid)); memcpy(sgid, &dev->sgid_tbl[index], sizeof(*sgid)); Loading Loading @@ -83,8 +83,8 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr) IB_DEVICE_SHUTDOWN_PORT | IB_DEVICE_SHUTDOWN_PORT | IB_DEVICE_SYS_IMAGE_GUID | IB_DEVICE_SYS_IMAGE_GUID | IB_DEVICE_LOCAL_DMA_LKEY; IB_DEVICE_LOCAL_DMA_LKEY; attr->max_sge = dev->attr.max_send_sge; attr->max_sge = min(dev->attr.max_send_sge, dev->attr.max_srq_sge); attr->max_sge_rd = dev->attr.max_send_sge; attr->max_sge_rd = 0; attr->max_cq = dev->attr.max_cq; attr->max_cq = dev->attr.max_cq; attr->max_cqe = dev->attr.max_cqe; attr->max_cqe = dev->attr.max_cqe; attr->max_mr = dev->attr.max_mr; attr->max_mr = dev->attr.max_mr; Loading @@ -97,7 +97,7 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr) min(dev->attr.max_ord_per_qp, dev->attr.max_ird_per_qp); min(dev->attr.max_ord_per_qp, dev->attr.max_ird_per_qp); attr->max_qp_init_rd_atom = dev->attr.max_ord_per_qp; attr->max_qp_init_rd_atom = dev->attr.max_ord_per_qp; attr->max_srq = (dev->attr.max_qp - 1); attr->max_srq = (dev->attr.max_qp - 1); attr->max_srq_sge = attr->max_sge; attr->max_srq_sge = attr->max_srq_sge; attr->max_srq_wr = dev->attr.max_rqe; attr->max_srq_wr = dev->attr.max_rqe; attr->local_ca_ack_delay = dev->attr.local_ca_ack_delay; attr->local_ca_ack_delay = dev->attr.local_ca_ack_delay; attr->max_fast_reg_page_list_len = 0; attr->max_fast_reg_page_list_len = 0; Loading Loading @@ -2301,8 +2301,10 @@ static bool ocrdma_poll_err_rcqe(struct ocrdma_qp *qp, struct ocrdma_cqe *cqe, *stop = true; *stop = true; expand = false; expand = false; } } } else } else { *polled = true; expand = ocrdma_update_err_rcqe(ibwc, cqe, qp, status); expand = ocrdma_update_err_rcqe(ibwc, cqe, qp, status); } return expand; return expand; } } Loading