Lines Matching defs:ibdev

82 static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init);
134 struct mlx4_ib_dev *ibdev = to_mdev(device);
138 dev = mlx4_get_protocol_dev(ibdev->dev, MLX4_PROT_ETH, port_num);
141 if (mlx4_is_bonded(ibdev->dev)) {
162 struct mlx4_ib_dev *ibdev,
167 struct mlx4_dev *dev = ibdev->dev;
195 struct mlx4_ib_dev *ibdev,
200 struct mlx4_dev *dev = ibdev->dev;
240 struct mlx4_ib_dev *ibdev,
243 if (ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_ROCE_V1_V2)
244 return mlx4_ib_update_gids_v1_v2(gids, ibdev, port_num);
246 return mlx4_ib_update_gids_v1(gids, ibdev, port_num);
258 struct mlx4_ib_dev *ibdev = to_mdev(attr->device);
259 struct mlx4_ib_iboe *iboe = &ibdev->iboe;
335 ret = mlx4_ib_update_gids(gids, ibdev, attr->port_num);
351 struct mlx4_ib_dev *ibdev = to_mdev(attr->device);
352 struct mlx4_ib_iboe *iboe = &ibdev->iboe;
395 ret = mlx4_ib_update_gids(gids, ibdev, attr->port_num);
401 int mlx4_ib_gid_index_to_real_index(struct mlx4_ib_dev *ibdev,
404 struct mlx4_ib_iboe *iboe = &ibdev->iboe;
415 if (mlx4_is_bonded(ibdev->dev))
418 if (!rdma_cap_roce_gid_table(&ibdev->ib_dev, port_num))
437 static int mlx4_ib_query_device(struct ib_device *ibdev,
441 struct mlx4_ib_dev *dev = to_mdev(ibdev);
476 err = mlx4_MAD_IFC(to_mdev(ibdev), MLX4_MAD_IFC_IGNORE_KEYS,
565 if (mlx4_ib_port_link_layer(ibdev, 1) == IB_LINK_LAYER_ETHERNET ||
566 mlx4_ib_port_link_layer(ibdev, 2) == IB_LINK_LAYER_ETHERNET) {
624 ((mlx4_ib_port_link_layer(ibdev, 1) ==
626 (mlx4_ib_port_link_layer(ibdev, 2) ==
657 static int ib_link_query_port(struct ib_device *ibdev, u8 port,
675 if (mlx4_is_mfunc(to_mdev(ibdev)->dev) && netw_view)
678 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port, NULL, NULL,
694 props->gid_tbl_len = to_mdev(ibdev)->dev->caps.gid_table_len[port];
695 props->max_msg_sz = to_mdev(ibdev)->dev->caps.max_msg_sz;
696 props->pkey_tbl_len = to_mdev(ibdev)->dev->caps.pkey_table_len[port];
727 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port,
753 static int eth_link_query_port(struct ib_device *ibdev, u8 port,
757 struct mlx4_ib_dev *mdev = to_mdev(ibdev);
814 int __mlx4_ib_query_port(struct ib_device *ibdev, u8 port,
821 err = mlx4_ib_port_link_layer(ibdev, port) == IB_LINK_LAYER_INFINIBAND ?
822 ib_link_query_port(ibdev, port, props, netw_view) :
823 eth_link_query_port(ibdev, port, props);
828 static int mlx4_ib_query_port(struct ib_device *ibdev, u8 port,
832 return __mlx4_ib_query_port(ibdev, port, props, 0);
835 int __mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
841 struct mlx4_ib_dev *dev = to_mdev(ibdev);
891 static int mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index,
894 if (rdma_protocol_ib(ibdev, port))
895 return __mlx4_ib_query_gid(ibdev, port, index, gid, 0);
899 static int mlx4_ib_query_sl2vl(struct ib_device *ibdev, u8 port, u64 *sl2vl_tbl)
908 if (mlx4_is_slave(to_mdev(ibdev)->dev)) {
922 if (mlx4_is_mfunc(to_mdev(ibdev)->dev))
925 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port, NULL, NULL,
959 int __mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
976 if (mlx4_is_mfunc(to_mdev(ibdev)->dev) && netw_view)
979 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port, NULL, NULL,
992 static int mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
994 return __mlx4_ib_query_pkey(ibdev, port, index, pkey, 0);
997 static int mlx4_ib_modify_device(struct ib_device *ibdev, int mask,
1009 if (mlx4_is_slave(to_mdev(ibdev)->dev))
1012 spin_lock_irqsave(&to_mdev(ibdev)->sm_lock, flags);
1013 memcpy(ibdev->node_desc, props->node_desc, IB_DEVICE_NODE_DESC_MAX);
1014 spin_unlock_irqrestore(&to_mdev(ibdev)->sm_lock, flags);
1020 mailbox = mlx4_alloc_cmd_mailbox(to_mdev(ibdev)->dev);
1025 mlx4_cmd(to_mdev(ibdev)->dev, mailbox->dma, 1, 0,
1028 mlx4_free_cmd_mailbox(to_mdev(ibdev)->dev, mailbox);
1059 static int mlx4_ib_modify_port(struct ib_device *ibdev, u8 port, int mask,
1062 struct mlx4_ib_dev *mdev = to_mdev(ibdev);
1077 err = ib_query_port(ibdev, port, &attr);
1089 mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex);
1096 struct ib_device *ibdev = uctx->device;
1097 struct mlx4_ib_dev *dev = to_mdev(ibdev);
1106 if (ibdev->ops.uverbs_abi_ver ==
1119 err = mlx4_uar_alloc(to_mdev(ibdev)->dev, &context->uar);
1129 if (ibdev->ops.uverbs_abi_ver == MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION)
1135 mlx4_uar_free(to_mdev(ibdev)->dev, &context->uar);
1201 struct ib_device *ibdev = ibpd->device;
1204 err = mlx4_pd_alloc(to_mdev(ibdev)->dev, &pd->pdn);
1209 mlx4_pd_free(to_mdev(ibdev)->dev, pd->pdn);
1288 static void mlx4_ib_delete_counters_table(struct mlx4_ib_dev *ibdev,
1297 mlx4_counter_free(ibdev->dev, counter->index);
2101 static struct rdma_hw_stats *mlx4_ib_alloc_hw_stats(struct ib_device *ibdev,
2104 struct mlx4_ib_dev *dev = to_mdev(ibdev);
2115 static int mlx4_ib_get_hw_stats(struct ib_device *ibdev,
2119 struct mlx4_ib_dev *dev = to_mdev(ibdev);
2140 static int __mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev,
2150 if (ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_DIAG_PER_PORT)
2173 static void mlx4_ib_fill_diag_counters(struct mlx4_ib_dev *ibdev,
2186 if (ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_DIAG_PER_PORT) {
2206 static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev)
2208 struct mlx4_ib_diag_counters *diag = ibdev->diag_counters;
2211 bool per_port = !!(ibdev->dev->caps.flags2 &
2214 if (mlx4_is_slave(ibdev->dev))
2222 ret = __mlx4_ib_alloc_diag_counters(ibdev, &diag[i].name,
2228 mlx4_ib_fill_diag_counters(ibdev, diag[i].name,
2232 ib_set_device_ops(&ibdev->ib_dev, &mlx4_ib_hw_stats_ops);
2245 static void mlx4_ib_diag_cleanup(struct mlx4_ib_dev *ibdev)
2250 kfree(ibdev->diag_counters[i].offset);
2251 kfree(ibdev->diag_counters[i].name);
2256 static void mlx4_ib_update_qps(struct mlx4_ib_dev *ibdev,
2268 atomic64_set(&ibdev->iboe.mac[port - 1], new_smac);
2271 if (!mlx4_is_mfunc(ibdev->dev))
2274 mutex_lock(&ibdev->qp1_proxy_lock[port - 1]);
2275 qp = ibdev->qp1_proxy[port - 1];
2286 new_smac_index = mlx4_register_mac(ibdev->dev, port, new_smac);
2292 if (mlx4_update_qp(ibdev->dev, qp->mqp.qpn, MLX4_UPDATE_QP_SMAC,
2307 mlx4_unregister_mac(ibdev->dev, port, release_mac);
2310 mutex_unlock(&ibdev->qp1_proxy_lock[port - 1]);
2313 static void mlx4_ib_scan_netdevs(struct mlx4_ib_dev *ibdev,
2324 iboe = &ibdev->iboe;
2327 mlx4_foreach_ib_transport_port(port, ibdev->dev) {
2330 mlx4_get_protocol_dev(ibdev->dev, MLX4_PROT_ETH, port);
2342 if (ib_get_cached_port_state(&ibdev->ib_dev, port,
2356 ibev.device = &ibdev->ib_dev;
2367 mlx4_ib_update_qps(ibdev, dev, update_qps_port);
2374 struct mlx4_ib_dev *ibdev;
2379 ibdev = container_of(this, struct mlx4_ib_dev, iboe.nb);
2380 mlx4_ib_scan_netdevs(ibdev, dev, event);
2385 static void init_pkeys(struct mlx4_ib_dev *ibdev)
2391 if (mlx4_is_master(ibdev->dev)) {
2392 for (slave = 0; slave <= ibdev->dev->persist->num_vfs;
2394 for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) {
2396 i < ibdev->dev->phys_caps.pkey_phys_table_len[port];
2398 ibdev->pkeys.virt2phys_pkey[slave][port - 1][i] =
2400 (slave == mlx4_master_func_num(ibdev->dev) || !i) ? i :
2401 ibdev->dev->phys_caps.pkey_phys_table_len[port] - 1;
2402 mlx4_sync_pkey_table(ibdev->dev, slave, port, i,
2403 ibdev->pkeys.virt2phys_pkey[slave][port - 1][i]);
2408 for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) {
2410 i < ibdev->dev->phys_caps.pkey_phys_table_len[port];
2412 ibdev->pkeys.phys_pkey_cache[port-1][i] =
2418 static void mlx4_ib_alloc_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev)
2422 ibdev->eq_table = kcalloc(dev->caps.num_comp_vectors,
2423 sizeof(ibdev->eq_table[0]), GFP_KERNEL);
2424 if (!ibdev->eq_table)
2432 ibdev->eq_table[eq] = total_eqs;
2434 &ibdev->eq_table[eq]))
2437 ibdev->eq_table[eq] = -1;
2442 ibdev->eq_table[i++] = -1)
2446 ibdev->ib_dev.num_comp_vectors = eq;
2449 static void mlx4_ib_free_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev)
2452 int total_eqs = ibdev->ib_dev.num_comp_vectors;
2455 if (!ibdev->eq_table)
2459 ibdev->ib_dev.num_comp_vectors = 0;
2462 mlx4_release_eq(dev, ibdev->eq_table[i]);
2464 kfree(ibdev->eq_table);
2465 ibdev->eq_table = NULL;
2468 static int mlx4_port_immutable(struct ib_device *ibdev, u8 port_num,
2472 struct mlx4_ib_dev *mdev = to_mdev(ibdev);
2475 if (mlx4_ib_port_link_layer(ibdev, port_num) == IB_LINK_LAYER_INFINIBAND) {
2490 err = ib_query_port(ibdev, port_num, &attr);
2604 struct mlx4_ib_dev *ibdev;
2625 ibdev = ib_alloc_device(mlx4_ib_dev, ib_dev);
2626 if (!ibdev) {
2632 iboe = &ibdev->iboe;
2634 if (mlx4_pd_alloc(dev, &ibdev->priv_pdn))
2637 if (mlx4_uar_alloc(dev, &ibdev->priv_uar))
2640 ibdev->uar_map = ioremap((phys_addr_t) ibdev->priv_uar.pfn << PAGE_SHIFT,
2642 if (!ibdev->uar_map)
2644 MLX4_INIT_DOORBELL_LOCK(&ibdev->uar_lock);
2646 ibdev->dev = dev;
2647 ibdev->bond_next_port = 0;
2649 ibdev->ib_dev.node_type = RDMA_NODE_IB_CA;
2650 ibdev->ib_dev.local_dma_lkey = dev->caps.reserved_lkey;
2651 ibdev->num_ports = num_ports;
2652 ibdev->ib_dev.phys_port_cnt = mlx4_is_bonded(dev) ?
2653 1 : ibdev->num_ports;
2654 ibdev->ib_dev.num_comp_vectors = dev->caps.num_comp_vectors;
2655 ibdev->ib_dev.dev.parent = &dev->persist->pdev->dev;
2657 ibdev->ib_dev.uverbs_cmd_mask =
2683 ib_set_device_ops(&ibdev->ib_dev, &mlx4_ib_dev_ops);
2684 ibdev->ib_dev.uverbs_ex_cmd_mask |=
2689 ((mlx4_ib_port_link_layer(&ibdev->ib_dev, 1) ==
2691 (mlx4_ib_port_link_layer(&ibdev->ib_dev, 2) ==
2693 ib_set_device_ops(&ibdev->ib_dev, &mlx4_ib_dev_wq_ops);
2697 ibdev->ib_dev.uverbs_cmd_mask |=
2700 ib_set_device_ops(&ibdev->ib_dev, &mlx4_ib_dev_mw_ops);
2704 ibdev->ib_dev.uverbs_cmd_mask |=
2707 ib_set_device_ops(&ibdev->ib_dev, &mlx4_ib_dev_xrc_ops);
2711 ibdev->steering_support = MLX4_STEERING_MODE_DEVICE_MANAGED;
2712 ib_set_device_ops(&ibdev->ib_dev, &mlx4_ib_dev_fs_ops);
2716 ibdev->ib_dev.ops.uverbs_abi_ver =
2719 mlx4_ib_alloc_eqs(dev, ibdev);
2723 if (init_node_data(ibdev))
2725 mlx4_init_sl2vl_tbl(ibdev);
2727 for (i = 0; i < ibdev->num_ports; ++i) {
2728 mutex_init(&ibdev->counters_table[i].mutex);
2729 INIT_LIST_HEAD(&ibdev->counters_table[i].counters_list);
2733 num_req_counters = mlx4_is_bonded(dev) ? 1 : ibdev->num_ports;
2735 mutex_init(&ibdev->qp1_proxy_lock[i]);
2737 if (mlx4_ib_port_link_layer(&ibdev->ib_dev, i + 1) ==
2739 err = mlx4_counter_alloc(ibdev->dev, &counter_index,
2756 mlx4_counter_free(ibdev->dev, counter_index);
2762 &ibdev->counters_table[i].counters_list);
2763 ibdev->counters_table[i].default_counter = counter_index;
2768 for (i = 1; i < ibdev->num_ports ; ++i) {
2777 &ibdev->counters_table[i].counters_list);
2778 ibdev->counters_table[i].default_counter =
2785 spin_lock_init(&ibdev->sm_lock);
2786 mutex_init(&ibdev->cap_mask_mutex);
2787 INIT_LIST_HEAD(&ibdev->qp_list);
2788 spin_lock_init(&ibdev->reset_flow_resource_lock);
2790 if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED &&
2792 ibdev->steer_qpn_count = MLX4_IB_UC_MAX_NUM_QPS;
2793 err = mlx4_qp_reserve_range(dev, ibdev->steer_qpn_count,
2795 &ibdev->steer_qpn_base, 0,
2800 ibdev->ib_uc_qpns_bitmap =
2801 kmalloc_array(BITS_TO_LONGS(ibdev->steer_qpn_count),
2804 if (!ibdev->ib_uc_qpns_bitmap)
2808 bitmap_zero(ibdev->ib_uc_qpns_bitmap,
2809 ibdev->steer_qpn_count);
2811 dev, ibdev->steer_qpn_base,
2812 ibdev->steer_qpn_base +
2813 ibdev->steer_qpn_count - 1);
2817 bitmap_fill(ibdev->ib_uc_qpns_bitmap,
2818 ibdev->steer_qpn_count);
2822 for (j = 1; j <= ibdev->dev->caps.num_ports; j++)
2823 atomic64_set(&iboe->mac[j - 1], ibdev->dev->caps.def_mac[j]);
2825 if (mlx4_ib_alloc_diag_counters(ibdev))
2828 rdma_set_device_sysfs_group(&ibdev->ib_dev, &mlx4_attr_group);
2829 if (ib_register_device(&ibdev->ib_dev, "mlx4_%d",
2833 if (mlx4_ib_mad_init(ibdev))
2836 if (mlx4_ib_init_sriov(ibdev))
2853 ibdev->ib_active = true;
2856 &ibdev->ib_dev);
2858 if (mlx4_is_mfunc(ibdev->dev))
2859 init_pkeys(ibdev);
2862 if (mlx4_is_master(ibdev->dev)) {
2864 if (j == mlx4_master_func_num(ibdev->dev))
2866 if (mlx4_is_slave_active(ibdev->dev, j))
2867 do_slave_init(ibdev, j, 1);
2870 return ibdev;
2873 if (ibdev->iboe.nb.notifier_call) {
2874 if (unregister_netdevice_notifier(&ibdev->iboe.nb))
2876 ibdev->iboe.nb.notifier_call = NULL;
2880 mlx4_ib_close_sriov(ibdev);
2883 mlx4_ib_mad_cleanup(ibdev);
2886 ib_unregister_device(&ibdev->ib_dev);
2889 mlx4_ib_diag_cleanup(ibdev);
2892 kfree(ibdev->ib_uc_qpns_bitmap);
2895 mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
2896 ibdev->steer_qpn_count);
2898 for (i = 0; i < ibdev->num_ports; ++i)
2899 mlx4_ib_delete_counters_table(ibdev, &ibdev->counters_table[i]);
2902 mlx4_ib_free_eqs(dev, ibdev);
2903 iounmap(ibdev->uar_map);
2906 mlx4_uar_free(dev, &ibdev->priv_uar);
2909 mlx4_pd_free(dev, ibdev->priv_pdn);
2912 ib_dealloc_device(&ibdev->ib_dev);
2983 struct mlx4_ib_dev *ibdev = ibdev_ptr;
2989 ibdev->ib_active = false;
2992 if (ibdev->iboe.nb.notifier_call) {
2993 if (unregister_netdevice_notifier(&ibdev->iboe.nb))
2995 ibdev->iboe.nb.notifier_call = NULL;
2998 mlx4_ib_close_sriov(ibdev);
2999 mlx4_ib_mad_cleanup(ibdev);
3000 ib_unregister_device(&ibdev->ib_dev);
3001 mlx4_ib_diag_cleanup(ibdev);
3003 mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
3004 ibdev->steer_qpn_count);
3005 kfree(ibdev->ib_uc_qpns_bitmap);
3007 iounmap(ibdev->uar_map);
3008 for (p = 0; p < ibdev->num_ports; ++p)
3009 mlx4_ib_delete_counters_table(ibdev, &ibdev->counters_table[p]);
3014 mlx4_ib_free_eqs(dev, ibdev);
3016 mlx4_uar_free(dev, &ibdev->priv_uar);
3017 mlx4_pd_free(dev, ibdev->priv_pdn);
3018 ib_dealloc_device(&ibdev->ib_dev);
3021 static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init)
3024 struct mlx4_dev *dev = ibdev->dev;
3053 dm[i]->dev = ibdev;
3056 spin_lock_irqsave(&ibdev->sriov.going_down_lock, flags);
3057 if (!ibdev->sriov.is_going_down) {
3059 queue_work(ibdev->sriov.demux[i].ud_wq, &dm[i]->work);
3060 spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags);
3062 spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags);
3071 static void mlx4_ib_handle_catas_error(struct mlx4_ib_dev *ibdev)
3084 /* Go over qp list reside on that ibdev, sync with create/destroy qp.*/
3085 spin_lock_irqsave(&ibdev->reset_flow_resource_lock, flags);
3087 list_for_each_entry(mqp, &ibdev->qp_list, qps_list) {
3128 spin_unlock_irqrestore(&ibdev->reset_flow_resource_lock, flags);
3136 struct mlx4_ib_dev *ibdev = ew->ib_dev;
3142 spin_lock_bh(&ibdev->iboe.lock);
3144 struct net_device *curr_netdev = ibdev->iboe.netdevs[i];
3158 spin_unlock_bh(&ibdev->iboe.lock);
3160 ibev.device = &ibdev->ib_dev;
3193 void mlx4_sched_ib_sl2vl_update_work(struct mlx4_ib_dev *ibdev,
3202 ew->ib_dev = ibdev;
3211 struct mlx4_ib_dev *ibdev = to_mdev((struct ib_device *) ibdev_ptr);
3223 ew->ib_dev = ibdev;
3235 if (p > ibdev->num_ports)
3238 rdma_port_get_link_layer(&ibdev->ib_dev, p) ==
3241 mlx4_ib_invalidate_all_guid_record(ibdev, p);
3242 if (ibdev->dev->flags & MLX4_FLAG_SECURE_HOST &&
3243 !(ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_SL_TO_VL_CHANGE_EVENT))
3244 mlx4_sched_ib_sl2vl_update_work(ibdev, p);
3250 if (p > ibdev->num_ports)
3256 ibdev->ib_active = false;
3258 mlx4_ib_handle_catas_error(ibdev);
3268 ew->ib_dev = ibdev;
3278 do_slave_init(ibdev, p, 1);
3282 for (i = 1; i <= ibdev->num_ports; i++) {
3283 if (rdma_port_get_link_layer(&ibdev->ib_dev, i)
3285 mlx4_ib_slave_alias_guid_event(ibdev,
3296 for (i = 1; i <= ibdev->num_ports; i++) {
3297 if (rdma_port_get_link_layer(&ibdev->ib_dev, i)
3299 mlx4_ib_slave_alias_guid_event(ibdev,
3305 do_slave_init(ibdev, p, 0);
3313 ibev.element.port_num = mlx4_is_bonded(ibdev->dev) ? 1 : (u8)p;