Lines Matching refs:ibdev

86 static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init);
136 struct mlx4_ib_dev *ibdev = to_mdev(device); in mlx4_ib_get_netdev() local
140 dev = mlx4_get_protocol_dev(ibdev->dev, MLX4_PROT_ETH, port_num); in mlx4_ib_get_netdev()
144 if (mlx4_is_bonded(ibdev->dev)) { in mlx4_ib_get_netdev()
166 struct mlx4_ib_dev *ibdev, in mlx4_ib_update_gids_v1() argument
171 struct mlx4_dev *dev = ibdev->dev; in mlx4_ib_update_gids_v1()
199 struct mlx4_ib_dev *ibdev, in mlx4_ib_update_gids_v1_v2() argument
204 struct mlx4_dev *dev = ibdev->dev; in mlx4_ib_update_gids_v1_v2()
246 struct mlx4_ib_dev *ibdev, in mlx4_ib_update_gids() argument
249 if (ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_ROCE_V1_V2) in mlx4_ib_update_gids()
250 return mlx4_ib_update_gids_v1_v2(gids, ibdev, port_num); in mlx4_ib_update_gids()
252 return mlx4_ib_update_gids_v1(gids, ibdev, port_num); in mlx4_ib_update_gids()
262 struct mlx4_ib_dev *ibdev = to_mdev(device); in mlx4_ib_add_gid() local
263 struct mlx4_ib_iboe *iboe = &ibdev->iboe; in mlx4_ib_add_gid()
327 ret = mlx4_ib_update_gids(gids, ibdev, port_num); in mlx4_ib_add_gid()
340 struct mlx4_ib_dev *ibdev = to_mdev(device); in mlx4_ib_del_gid() local
341 struct mlx4_ib_iboe *iboe = &ibdev->iboe; in mlx4_ib_del_gid()
385 ret = mlx4_ib_update_gids(gids, ibdev, port_num); in mlx4_ib_del_gid()
391 int mlx4_ib_gid_index_to_real_index(struct mlx4_ib_dev *ibdev, in mlx4_ib_gid_index_to_real_index() argument
394 struct mlx4_ib_iboe *iboe = &ibdev->iboe; in mlx4_ib_gid_index_to_real_index()
407 if (mlx4_is_bonded(ibdev->dev)) in mlx4_ib_gid_index_to_real_index()
410 if (!rdma_cap_roce_gid_table(&ibdev->ib_dev, port_num)) in mlx4_ib_gid_index_to_real_index()
413 ret = ib_get_cached_gid(&ibdev->ib_dev, port_num, index, &gid, &attr); in mlx4_ib_gid_index_to_real_index()
438 static int mlx4_ib_query_device(struct ib_device *ibdev, in mlx4_ib_query_device() argument
442 struct mlx4_ib_dev *dev = to_mdev(ibdev); in mlx4_ib_query_device()
476 err = mlx4_MAD_IFC(to_mdev(ibdev), MLX4_MAD_IFC_IGNORE_KEYS, in mlx4_ib_query_device()
592 static int ib_link_query_port(struct ib_device *ibdev, u8 port, in ib_link_query_port() argument
610 if (mlx4_is_mfunc(to_mdev(ibdev)->dev) && netw_view) in ib_link_query_port()
613 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port, NULL, NULL, in ib_link_query_port()
629 props->gid_tbl_len = to_mdev(ibdev)->dev->caps.gid_table_len[port]; in ib_link_query_port()
630 props->max_msg_sz = to_mdev(ibdev)->dev->caps.max_msg_sz; in ib_link_query_port()
631 props->pkey_tbl_len = to_mdev(ibdev)->dev->caps.pkey_table_len[port]; in ib_link_query_port()
662 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port, in ib_link_query_port()
688 static int eth_link_query_port(struct ib_device *ibdev, u8 port, in eth_link_query_port() argument
692 struct mlx4_ib_dev *mdev = to_mdev(ibdev); in eth_link_query_port()
748 int __mlx4_ib_query_port(struct ib_device *ibdev, u8 port, in __mlx4_ib_query_port() argument
755 err = mlx4_ib_port_link_layer(ibdev, port) == IB_LINK_LAYER_INFINIBAND ? in __mlx4_ib_query_port()
756 ib_link_query_port(ibdev, port, props, netw_view) : in __mlx4_ib_query_port()
757 eth_link_query_port(ibdev, port, props, netw_view); in __mlx4_ib_query_port()
762 static int mlx4_ib_query_port(struct ib_device *ibdev, u8 port, in mlx4_ib_query_port() argument
766 return __mlx4_ib_query_port(ibdev, port, props, 0); in mlx4_ib_query_port()
769 int __mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index, in __mlx4_ib_query_gid() argument
775 struct mlx4_ib_dev *dev = to_mdev(ibdev); in __mlx4_ib_query_gid()
825 static int mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index, in mlx4_ib_query_gid() argument
830 if (rdma_protocol_ib(ibdev, port)) in mlx4_ib_query_gid()
831 return __mlx4_ib_query_gid(ibdev, port, index, gid, 0); in mlx4_ib_query_gid()
833 if (!rdma_protocol_roce(ibdev, port)) in mlx4_ib_query_gid()
836 if (!rdma_cap_roce_gid_table(ibdev, port)) in mlx4_ib_query_gid()
839 ret = ib_get_cached_gid(ibdev, port, index, gid, NULL); in mlx4_ib_query_gid()
848 static int mlx4_ib_query_sl2vl(struct ib_device *ibdev, u8 port, u64 *sl2vl_tbl) in mlx4_ib_query_sl2vl() argument
857 if (mlx4_is_slave(to_mdev(ibdev)->dev)) { in mlx4_ib_query_sl2vl()
871 if (mlx4_is_mfunc(to_mdev(ibdev)->dev)) in mlx4_ib_query_sl2vl()
874 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port, NULL, NULL, in mlx4_ib_query_sl2vl()
908 int __mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, in __mlx4_ib_query_pkey() argument
925 if (mlx4_is_mfunc(to_mdev(ibdev)->dev) && netw_view) in __mlx4_ib_query_pkey()
928 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port, NULL, NULL, in __mlx4_ib_query_pkey()
941 static int mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) in mlx4_ib_query_pkey() argument
943 return __mlx4_ib_query_pkey(ibdev, port, index, pkey, 0); in mlx4_ib_query_pkey()
946 static int mlx4_ib_modify_device(struct ib_device *ibdev, int mask, in mlx4_ib_modify_device() argument
958 if (mlx4_is_slave(to_mdev(ibdev)->dev)) in mlx4_ib_modify_device()
961 spin_lock_irqsave(&to_mdev(ibdev)->sm_lock, flags); in mlx4_ib_modify_device()
962 memcpy(ibdev->node_desc, props->node_desc, IB_DEVICE_NODE_DESC_MAX); in mlx4_ib_modify_device()
963 spin_unlock_irqrestore(&to_mdev(ibdev)->sm_lock, flags); in mlx4_ib_modify_device()
969 mailbox = mlx4_alloc_cmd_mailbox(to_mdev(ibdev)->dev); in mlx4_ib_modify_device()
974 mlx4_cmd(to_mdev(ibdev)->dev, mailbox->dma, 1, 0, in mlx4_ib_modify_device()
977 mlx4_free_cmd_mailbox(to_mdev(ibdev)->dev, mailbox); in mlx4_ib_modify_device()
1008 static int mlx4_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, in mlx4_ib_modify_port() argument
1011 struct mlx4_ib_dev *mdev = to_mdev(ibdev); in mlx4_ib_modify_port()
1026 err = mlx4_ib_query_port(ibdev, port, &attr); in mlx4_ib_modify_port()
1038 mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex); in mlx4_ib_modify_port()
1042 static struct ib_ucontext *mlx4_ib_alloc_ucontext(struct ib_device *ibdev, in mlx4_ib_alloc_ucontext() argument
1045 struct mlx4_ib_dev *dev = to_mdev(ibdev); in mlx4_ib_alloc_ucontext()
1054 if (ibdev->uverbs_abi_ver == MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION) { in mlx4_ib_alloc_ucontext()
1070 err = mlx4_uar_alloc(to_mdev(ibdev)->dev, &context->uar); in mlx4_ib_alloc_ucontext()
1079 if (ibdev->uverbs_abi_ver == MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION) in mlx4_ib_alloc_ucontext()
1085 mlx4_uar_free(to_mdev(ibdev)->dev, &context->uar); in mlx4_ib_alloc_ucontext()
1219 static struct ib_pd *mlx4_ib_alloc_pd(struct ib_device *ibdev, in mlx4_ib_alloc_pd() argument
1230 err = mlx4_pd_alloc(to_mdev(ibdev)->dev, &pd->pdn); in mlx4_ib_alloc_pd()
1238 mlx4_pd_free(to_mdev(ibdev)->dev, pd->pdn); in mlx4_ib_alloc_pd()
1254 static struct ib_xrcd *mlx4_ib_alloc_xrcd(struct ib_device *ibdev, in mlx4_ib_alloc_xrcd() argument
1262 if (!(to_mdev(ibdev)->dev->caps.flags & MLX4_DEV_CAP_FLAG_XRC)) in mlx4_ib_alloc_xrcd()
1269 err = mlx4_xrcd_alloc(to_mdev(ibdev)->dev, &xrcd->xrcdn); in mlx4_ib_alloc_xrcd()
1273 xrcd->pd = ib_alloc_pd(ibdev, 0); in mlx4_ib_alloc_xrcd()
1280 xrcd->cq = ib_create_cq(ibdev, NULL, NULL, xrcd, &cq_attr); in mlx4_ib_alloc_xrcd()
1291 mlx4_xrcd_free(to_mdev(ibdev)->dev, xrcd->xrcdn); in mlx4_ib_alloc_xrcd()
1330 static void mlx4_ib_delete_counters_table(struct mlx4_ib_dev *ibdev, in mlx4_ib_delete_counters_table() argument
1339 mlx4_counter_free(ibdev->dev, counter->index); in mlx4_ib_delete_counters_table()
2133 static struct rdma_hw_stats *mlx4_ib_alloc_hw_stats(struct ib_device *ibdev, in mlx4_ib_alloc_hw_stats() argument
2136 struct mlx4_ib_dev *dev = to_mdev(ibdev); in mlx4_ib_alloc_hw_stats()
2147 static int mlx4_ib_get_hw_stats(struct ib_device *ibdev, in mlx4_ib_get_hw_stats() argument
2151 struct mlx4_ib_dev *dev = to_mdev(ibdev); in mlx4_ib_get_hw_stats()
2172 static int __mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev, in __mlx4_ib_alloc_diag_counters() argument
2182 if (ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_DIAG_PER_PORT) in __mlx4_ib_alloc_diag_counters()
2205 static void mlx4_ib_fill_diag_counters(struct mlx4_ib_dev *ibdev, in mlx4_ib_fill_diag_counters() argument
2218 if (ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_DIAG_PER_PORT) { in mlx4_ib_fill_diag_counters()
2233 static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev) in mlx4_ib_alloc_diag_counters() argument
2235 struct mlx4_ib_diag_counters *diag = ibdev->diag_counters; in mlx4_ib_alloc_diag_counters()
2238 bool per_port = !!(ibdev->dev->caps.flags2 & in mlx4_ib_alloc_diag_counters()
2241 if (mlx4_is_slave(ibdev->dev)) in mlx4_ib_alloc_diag_counters()
2249 ret = __mlx4_ib_alloc_diag_counters(ibdev, &diag[i].name, in mlx4_ib_alloc_diag_counters()
2255 mlx4_ib_fill_diag_counters(ibdev, diag[i].name, in mlx4_ib_alloc_diag_counters()
2259 ibdev->ib_dev.get_hw_stats = mlx4_ib_get_hw_stats; in mlx4_ib_alloc_diag_counters()
2260 ibdev->ib_dev.alloc_hw_stats = mlx4_ib_alloc_hw_stats; in mlx4_ib_alloc_diag_counters()
2273 static void mlx4_ib_diag_cleanup(struct mlx4_ib_dev *ibdev) in mlx4_ib_diag_cleanup() argument
2278 kfree(ibdev->diag_counters[i].offset); in mlx4_ib_diag_cleanup()
2279 kfree(ibdev->diag_counters[i].name); in mlx4_ib_diag_cleanup()
2284 static void mlx4_ib_update_qps(struct mlx4_ib_dev *ibdev, in mlx4_ib_update_qps() argument
2294 atomic64_set(&ibdev->iboe.mac[port - 1], new_smac); in mlx4_ib_update_qps()
2297 if (!mlx4_is_mfunc(ibdev->dev)) in mlx4_ib_update_qps()
2300 mutex_lock(&ibdev->qp1_proxy_lock[port - 1]); in mlx4_ib_update_qps()
2301 qp = ibdev->qp1_proxy[port - 1]; in mlx4_ib_update_qps()
2312 new_smac_index = mlx4_register_mac(ibdev->dev, port, new_smac); in mlx4_ib_update_qps()
2318 if (mlx4_update_qp(ibdev->dev, qp->mqp.qpn, MLX4_UPDATE_QP_SMAC, in mlx4_ib_update_qps()
2333 mlx4_unregister_mac(ibdev->dev, port, release_mac); in mlx4_ib_update_qps()
2336 mutex_unlock(&ibdev->qp1_proxy_lock[port - 1]); in mlx4_ib_update_qps()
2339 static void mlx4_ib_scan_netdevs(struct mlx4_ib_dev *ibdev, in mlx4_ib_scan_netdevs() argument
2348 iboe = &ibdev->iboe; in mlx4_ib_scan_netdevs()
2351 mlx4_foreach_ib_transport_port(port, ibdev->dev) { in mlx4_ib_scan_netdevs()
2354 mlx4_get_protocol_dev(ibdev->dev, MLX4_PROT_ETH, port); in mlx4_ib_scan_netdevs()
2365 mlx4_ib_update_qps(ibdev, dev, update_qps_port); in mlx4_ib_scan_netdevs()
2372 struct mlx4_ib_dev *ibdev; in mlx4_ib_netdev_event() local
2377 ibdev = container_of(this, struct mlx4_ib_dev, iboe.nb); in mlx4_ib_netdev_event()
2378 mlx4_ib_scan_netdevs(ibdev, dev, event); in mlx4_ib_netdev_event()
2383 static void init_pkeys(struct mlx4_ib_dev *ibdev) in init_pkeys() argument
2389 if (mlx4_is_master(ibdev->dev)) { in init_pkeys()
2390 for (slave = 0; slave <= ibdev->dev->persist->num_vfs; in init_pkeys()
2392 for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) { in init_pkeys()
2394 i < ibdev->dev->phys_caps.pkey_phys_table_len[port]; in init_pkeys()
2396 ibdev->pkeys.virt2phys_pkey[slave][port - 1][i] = in init_pkeys()
2398 (slave == mlx4_master_func_num(ibdev->dev) || !i) ? i : in init_pkeys()
2399 ibdev->dev->phys_caps.pkey_phys_table_len[port] - 1; in init_pkeys()
2400 mlx4_sync_pkey_table(ibdev->dev, slave, port, i, in init_pkeys()
2401 ibdev->pkeys.virt2phys_pkey[slave][port - 1][i]); in init_pkeys()
2406 for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) { in init_pkeys()
2408 i < ibdev->dev->phys_caps.pkey_phys_table_len[port]; in init_pkeys()
2410 ibdev->pkeys.phys_pkey_cache[port-1][i] = in init_pkeys()
2416 static void mlx4_ib_alloc_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev) in mlx4_ib_alloc_eqs() argument
2420 ibdev->eq_table = kcalloc(dev->caps.num_comp_vectors, in mlx4_ib_alloc_eqs()
2421 sizeof(ibdev->eq_table[0]), GFP_KERNEL); in mlx4_ib_alloc_eqs()
2422 if (!ibdev->eq_table) in mlx4_ib_alloc_eqs()
2430 ibdev->eq_table[eq] = total_eqs; in mlx4_ib_alloc_eqs()
2432 &ibdev->eq_table[eq])) in mlx4_ib_alloc_eqs()
2435 ibdev->eq_table[eq] = -1; in mlx4_ib_alloc_eqs()
2440 ibdev->eq_table[i++] = -1) in mlx4_ib_alloc_eqs()
2444 ibdev->ib_dev.num_comp_vectors = eq; in mlx4_ib_alloc_eqs()
2447 static void mlx4_ib_free_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev) in mlx4_ib_free_eqs() argument
2450 int total_eqs = ibdev->ib_dev.num_comp_vectors; in mlx4_ib_free_eqs()
2453 if (!ibdev->eq_table) in mlx4_ib_free_eqs()
2457 ibdev->ib_dev.num_comp_vectors = 0; in mlx4_ib_free_eqs()
2460 mlx4_release_eq(dev, ibdev->eq_table[i]); in mlx4_ib_free_eqs()
2462 kfree(ibdev->eq_table); in mlx4_ib_free_eqs()
2463 ibdev->eq_table = NULL; in mlx4_ib_free_eqs()
2466 static int mlx4_port_immutable(struct ib_device *ibdev, u8 port_num, in mlx4_port_immutable() argument
2470 struct mlx4_ib_dev *mdev = to_mdev(ibdev); in mlx4_port_immutable()
2473 err = mlx4_ib_query_port(ibdev, port_num, &attr); in mlx4_port_immutable()
2480 if (mlx4_ib_port_link_layer(ibdev, port_num) == IB_LINK_LAYER_INFINIBAND) { in mlx4_port_immutable()
2508 struct mlx4_ib_dev *ibdev; in mlx4_ib_add() local
2529 ibdev = (struct mlx4_ib_dev *) ib_alloc_device(sizeof *ibdev); in mlx4_ib_add()
2530 if (!ibdev) { in mlx4_ib_add()
2536 iboe = &ibdev->iboe; in mlx4_ib_add()
2538 if (mlx4_pd_alloc(dev, &ibdev->priv_pdn)) in mlx4_ib_add()
2541 if (mlx4_uar_alloc(dev, &ibdev->priv_uar)) in mlx4_ib_add()
2544 ibdev->uar_map = ioremap((phys_addr_t) ibdev->priv_uar.pfn << PAGE_SHIFT, in mlx4_ib_add()
2546 if (!ibdev->uar_map) in mlx4_ib_add()
2548 MLX4_INIT_DOORBELL_LOCK(&ibdev->uar_lock); in mlx4_ib_add()
2550 ibdev->dev = dev; in mlx4_ib_add()
2551 ibdev->bond_next_port = 0; in mlx4_ib_add()
2553 strlcpy(ibdev->ib_dev.name, "mlx4_%d", IB_DEVICE_NAME_MAX); in mlx4_ib_add()
2554 ibdev->ib_dev.owner = THIS_MODULE; in mlx4_ib_add()
2555 ibdev->ib_dev.node_type = RDMA_NODE_IB_CA; in mlx4_ib_add()
2556 ibdev->ib_dev.local_dma_lkey = dev->caps.reserved_lkey; in mlx4_ib_add()
2557 ibdev->num_ports = num_ports; in mlx4_ib_add()
2558 ibdev->ib_dev.phys_port_cnt = mlx4_is_bonded(dev) ? in mlx4_ib_add()
2559 1 : ibdev->num_ports; in mlx4_ib_add()
2560 ibdev->ib_dev.num_comp_vectors = dev->caps.num_comp_vectors; in mlx4_ib_add()
2561 ibdev->ib_dev.dma_device = &dev->persist->pdev->dev; in mlx4_ib_add()
2562 ibdev->ib_dev.get_netdev = mlx4_ib_get_netdev; in mlx4_ib_add()
2563 ibdev->ib_dev.add_gid = mlx4_ib_add_gid; in mlx4_ib_add()
2564 ibdev->ib_dev.del_gid = mlx4_ib_del_gid; in mlx4_ib_add()
2567 ibdev->ib_dev.uverbs_abi_ver = MLX4_IB_UVERBS_ABI_VERSION; in mlx4_ib_add()
2569 ibdev->ib_dev.uverbs_abi_ver = MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION; in mlx4_ib_add()
2571 ibdev->ib_dev.uverbs_cmd_mask = in mlx4_ib_add()
2597 ibdev->ib_dev.query_device = mlx4_ib_query_device; in mlx4_ib_add()
2598 ibdev->ib_dev.query_port = mlx4_ib_query_port; in mlx4_ib_add()
2599 ibdev->ib_dev.get_link_layer = mlx4_ib_port_link_layer; in mlx4_ib_add()
2600 ibdev->ib_dev.query_gid = mlx4_ib_query_gid; in mlx4_ib_add()
2601 ibdev->ib_dev.query_pkey = mlx4_ib_query_pkey; in mlx4_ib_add()
2602 ibdev->ib_dev.modify_device = mlx4_ib_modify_device; in mlx4_ib_add()
2603 ibdev->ib_dev.modify_port = mlx4_ib_modify_port; in mlx4_ib_add()
2604 ibdev->ib_dev.alloc_ucontext = mlx4_ib_alloc_ucontext; in mlx4_ib_add()
2605 ibdev->ib_dev.dealloc_ucontext = mlx4_ib_dealloc_ucontext; in mlx4_ib_add()
2606 ibdev->ib_dev.mmap = mlx4_ib_mmap; in mlx4_ib_add()
2607 ibdev->ib_dev.alloc_pd = mlx4_ib_alloc_pd; in mlx4_ib_add()
2608 ibdev->ib_dev.dealloc_pd = mlx4_ib_dealloc_pd; in mlx4_ib_add()
2609 ibdev->ib_dev.create_ah = mlx4_ib_create_ah; in mlx4_ib_add()
2610 ibdev->ib_dev.query_ah = mlx4_ib_query_ah; in mlx4_ib_add()
2611 ibdev->ib_dev.destroy_ah = mlx4_ib_destroy_ah; in mlx4_ib_add()
2612 ibdev->ib_dev.create_srq = mlx4_ib_create_srq; in mlx4_ib_add()
2613 ibdev->ib_dev.modify_srq = mlx4_ib_modify_srq; in mlx4_ib_add()
2614 ibdev->ib_dev.query_srq = mlx4_ib_query_srq; in mlx4_ib_add()
2615 ibdev->ib_dev.destroy_srq = mlx4_ib_destroy_srq; in mlx4_ib_add()
2616 ibdev->ib_dev.post_srq_recv = mlx4_ib_post_srq_recv; in mlx4_ib_add()
2617 ibdev->ib_dev.create_qp = mlx4_ib_create_qp; in mlx4_ib_add()
2618 ibdev->ib_dev.modify_qp = mlx4_ib_modify_qp; in mlx4_ib_add()
2619 ibdev->ib_dev.query_qp = mlx4_ib_query_qp; in mlx4_ib_add()
2620 ibdev->ib_dev.destroy_qp = mlx4_ib_destroy_qp; in mlx4_ib_add()
2621 ibdev->ib_dev.post_send = mlx4_ib_post_send; in mlx4_ib_add()
2622 ibdev->ib_dev.post_recv = mlx4_ib_post_recv; in mlx4_ib_add()
2623 ibdev->ib_dev.create_cq = mlx4_ib_create_cq; in mlx4_ib_add()
2624 ibdev->ib_dev.modify_cq = mlx4_ib_modify_cq; in mlx4_ib_add()
2625 ibdev->ib_dev.resize_cq = mlx4_ib_resize_cq; in mlx4_ib_add()
2626 ibdev->ib_dev.destroy_cq = mlx4_ib_destroy_cq; in mlx4_ib_add()
2627 ibdev->ib_dev.poll_cq = mlx4_ib_poll_cq; in mlx4_ib_add()
2628 ibdev->ib_dev.req_notify_cq = mlx4_ib_arm_cq; in mlx4_ib_add()
2629 ibdev->ib_dev.get_dma_mr = mlx4_ib_get_dma_mr; in mlx4_ib_add()
2630 ibdev->ib_dev.reg_user_mr = mlx4_ib_reg_user_mr; in mlx4_ib_add()
2631 ibdev->ib_dev.rereg_user_mr = mlx4_ib_rereg_user_mr; in mlx4_ib_add()
2632 ibdev->ib_dev.dereg_mr = mlx4_ib_dereg_mr; in mlx4_ib_add()
2633 ibdev->ib_dev.alloc_mr = mlx4_ib_alloc_mr; in mlx4_ib_add()
2634 ibdev->ib_dev.map_mr_sg = mlx4_ib_map_mr_sg; in mlx4_ib_add()
2635 ibdev->ib_dev.attach_mcast = mlx4_ib_mcg_attach; in mlx4_ib_add()
2636 ibdev->ib_dev.detach_mcast = mlx4_ib_mcg_detach; in mlx4_ib_add()
2637 ibdev->ib_dev.process_mad = mlx4_ib_process_mad; in mlx4_ib_add()
2638 ibdev->ib_dev.get_port_immutable = mlx4_port_immutable; in mlx4_ib_add()
2639 ibdev->ib_dev.get_dev_fw_str = get_fw_ver_str; in mlx4_ib_add()
2641 if (!mlx4_is_slave(ibdev->dev)) { in mlx4_ib_add()
2642 ibdev->ib_dev.alloc_fmr = mlx4_ib_fmr_alloc; in mlx4_ib_add()
2643 ibdev->ib_dev.map_phys_fmr = mlx4_ib_map_phys_fmr; in mlx4_ib_add()
2644 ibdev->ib_dev.unmap_fmr = mlx4_ib_unmap_fmr; in mlx4_ib_add()
2645 ibdev->ib_dev.dealloc_fmr = mlx4_ib_fmr_dealloc; in mlx4_ib_add()
2650 ibdev->ib_dev.alloc_mw = mlx4_ib_alloc_mw; in mlx4_ib_add()
2651 ibdev->ib_dev.dealloc_mw = mlx4_ib_dealloc_mw; in mlx4_ib_add()
2653 ibdev->ib_dev.uverbs_cmd_mask |= in mlx4_ib_add()
2659 ibdev->ib_dev.alloc_xrcd = mlx4_ib_alloc_xrcd; in mlx4_ib_add()
2660 ibdev->ib_dev.dealloc_xrcd = mlx4_ib_dealloc_xrcd; in mlx4_ib_add()
2661 ibdev->ib_dev.uverbs_cmd_mask |= in mlx4_ib_add()
2667 ibdev->steering_support = MLX4_STEERING_MODE_DEVICE_MANAGED; in mlx4_ib_add()
2668 ibdev->ib_dev.create_flow = mlx4_ib_create_flow; in mlx4_ib_add()
2669 ibdev->ib_dev.destroy_flow = mlx4_ib_destroy_flow; in mlx4_ib_add()
2671 ibdev->ib_dev.uverbs_ex_cmd_mask |= in mlx4_ib_add()
2676 ibdev->ib_dev.uverbs_ex_cmd_mask |= in mlx4_ib_add()
2681 mlx4_ib_alloc_eqs(dev, ibdev); in mlx4_ib_add()
2685 if (init_node_data(ibdev)) in mlx4_ib_add()
2687 mlx4_init_sl2vl_tbl(ibdev); in mlx4_ib_add()
2689 for (i = 0; i < ibdev->num_ports; ++i) { in mlx4_ib_add()
2690 mutex_init(&ibdev->counters_table[i].mutex); in mlx4_ib_add()
2691 INIT_LIST_HEAD(&ibdev->counters_table[i].counters_list); in mlx4_ib_add()
2694 num_req_counters = mlx4_is_bonded(dev) ? 1 : ibdev->num_ports; in mlx4_ib_add()
2696 mutex_init(&ibdev->qp1_proxy_lock[i]); in mlx4_ib_add()
2698 if (mlx4_ib_port_link_layer(&ibdev->ib_dev, i + 1) == in mlx4_ib_add()
2700 err = mlx4_counter_alloc(ibdev->dev, &counter_index); in mlx4_ib_add()
2716 mlx4_counter_free(ibdev->dev, counter_index); in mlx4_ib_add()
2722 &ibdev->counters_table[i].counters_list); in mlx4_ib_add()
2723 ibdev->counters_table[i].default_counter = counter_index; in mlx4_ib_add()
2728 for (i = 1; i < ibdev->num_ports ; ++i) { in mlx4_ib_add()
2737 &ibdev->counters_table[i].counters_list); in mlx4_ib_add()
2738 ibdev->counters_table[i].default_counter = in mlx4_ib_add()
2745 spin_lock_init(&ibdev->sm_lock); in mlx4_ib_add()
2746 mutex_init(&ibdev->cap_mask_mutex); in mlx4_ib_add()
2747 INIT_LIST_HEAD(&ibdev->qp_list); in mlx4_ib_add()
2748 spin_lock_init(&ibdev->reset_flow_resource_lock); in mlx4_ib_add()
2750 if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED && in mlx4_ib_add()
2752 ibdev->steer_qpn_count = MLX4_IB_UC_MAX_NUM_QPS; in mlx4_ib_add()
2753 err = mlx4_qp_reserve_range(dev, ibdev->steer_qpn_count, in mlx4_ib_add()
2755 &ibdev->steer_qpn_base, 0); in mlx4_ib_add()
2759 ibdev->ib_uc_qpns_bitmap = in mlx4_ib_add()
2760 kmalloc(BITS_TO_LONGS(ibdev->steer_qpn_count) * in mlx4_ib_add()
2763 if (!ibdev->ib_uc_qpns_bitmap) { in mlx4_ib_add()
2769 bitmap_zero(ibdev->ib_uc_qpns_bitmap, ibdev->steer_qpn_count); in mlx4_ib_add()
2772 dev, ibdev->steer_qpn_base, in mlx4_ib_add()
2773 ibdev->steer_qpn_base + in mlx4_ib_add()
2774 ibdev->steer_qpn_count - 1); in mlx4_ib_add()
2779 for (j = 1; j <= ibdev->dev->caps.num_ports; j++) in mlx4_ib_add()
2780 atomic64_set(&iboe->mac[j - 1], ibdev->dev->caps.def_mac[j]); in mlx4_ib_add()
2782 if (mlx4_ib_alloc_diag_counters(ibdev)) in mlx4_ib_add()
2785 if (ib_register_device(&ibdev->ib_dev, NULL)) in mlx4_ib_add()
2788 if (mlx4_ib_mad_init(ibdev)) in mlx4_ib_add()
2791 if (mlx4_ib_init_sriov(ibdev)) in mlx4_ib_add()
2813 if (device_create_file(&ibdev->ib_dev.dev, in mlx4_ib_add()
2818 ibdev->ib_active = true; in mlx4_ib_add()
2820 if (mlx4_is_mfunc(ibdev->dev)) in mlx4_ib_add()
2821 init_pkeys(ibdev); in mlx4_ib_add()
2824 if (mlx4_is_master(ibdev->dev)) { in mlx4_ib_add()
2826 if (j == mlx4_master_func_num(ibdev->dev)) in mlx4_ib_add()
2828 if (mlx4_is_slave_active(ibdev->dev, j)) in mlx4_ib_add()
2829 do_slave_init(ibdev, j, 1); in mlx4_ib_add()
2832 return ibdev; in mlx4_ib_add()
2835 if (ibdev->iboe.nb.notifier_call) { in mlx4_ib_add()
2836 if (unregister_netdevice_notifier(&ibdev->iboe.nb)) in mlx4_ib_add()
2838 ibdev->iboe.nb.notifier_call = NULL; in mlx4_ib_add()
2842 mlx4_ib_close_sriov(ibdev); in mlx4_ib_add()
2845 mlx4_ib_mad_cleanup(ibdev); in mlx4_ib_add()
2848 ib_unregister_device(&ibdev->ib_dev); in mlx4_ib_add()
2851 mlx4_ib_diag_cleanup(ibdev); in mlx4_ib_add()
2854 kfree(ibdev->ib_uc_qpns_bitmap); in mlx4_ib_add()
2857 if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) in mlx4_ib_add()
2858 mlx4_qp_release_range(dev, ibdev->steer_qpn_base, in mlx4_ib_add()
2859 ibdev->steer_qpn_count); in mlx4_ib_add()
2861 for (i = 0; i < ibdev->num_ports; ++i) in mlx4_ib_add()
2862 mlx4_ib_delete_counters_table(ibdev, &ibdev->counters_table[i]); in mlx4_ib_add()
2865 iounmap(ibdev->uar_map); in mlx4_ib_add()
2868 mlx4_uar_free(dev, &ibdev->priv_uar); in mlx4_ib_add()
2871 mlx4_pd_free(dev, ibdev->priv_pdn); in mlx4_ib_add()
2874 ib_dealloc_device(&ibdev->ib_dev); in mlx4_ib_add()
2944 struct mlx4_ib_dev *ibdev = ibdev_ptr; in mlx4_ib_remove() local
2947 ibdev->ib_active = false; in mlx4_ib_remove()
2950 mlx4_ib_close_sriov(ibdev); in mlx4_ib_remove()
2951 mlx4_ib_mad_cleanup(ibdev); in mlx4_ib_remove()
2952 ib_unregister_device(&ibdev->ib_dev); in mlx4_ib_remove()
2953 mlx4_ib_diag_cleanup(ibdev); in mlx4_ib_remove()
2954 if (ibdev->iboe.nb.notifier_call) { in mlx4_ib_remove()
2955 if (unregister_netdevice_notifier(&ibdev->iboe.nb)) in mlx4_ib_remove()
2957 ibdev->iboe.nb.notifier_call = NULL; in mlx4_ib_remove()
2960 if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) { in mlx4_ib_remove()
2961 mlx4_qp_release_range(dev, ibdev->steer_qpn_base, in mlx4_ib_remove()
2962 ibdev->steer_qpn_count); in mlx4_ib_remove()
2963 kfree(ibdev->ib_uc_qpns_bitmap); in mlx4_ib_remove()
2966 iounmap(ibdev->uar_map); in mlx4_ib_remove()
2967 for (p = 0; p < ibdev->num_ports; ++p) in mlx4_ib_remove()
2968 mlx4_ib_delete_counters_table(ibdev, &ibdev->counters_table[p]); in mlx4_ib_remove()
2973 mlx4_ib_free_eqs(dev, ibdev); in mlx4_ib_remove()
2975 mlx4_uar_free(dev, &ibdev->priv_uar); in mlx4_ib_remove()
2976 mlx4_pd_free(dev, ibdev->priv_pdn); in mlx4_ib_remove()
2977 ib_dealloc_device(&ibdev->ib_dev); in mlx4_ib_remove()
2980 static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init) in do_slave_init() argument
2983 struct mlx4_dev *dev = ibdev->dev; in do_slave_init()
3015 dm[i]->dev = ibdev; in do_slave_init()
3018 spin_lock_irqsave(&ibdev->sriov.going_down_lock, flags); in do_slave_init()
3019 if (!ibdev->sriov.is_going_down) { in do_slave_init()
3021 queue_work(ibdev->sriov.demux[i].ud_wq, &dm[i]->work); in do_slave_init()
3022 spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags); in do_slave_init()
3024 spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags); in do_slave_init()
3033 static void mlx4_ib_handle_catas_error(struct mlx4_ib_dev *ibdev) in mlx4_ib_handle_catas_error() argument
3047 spin_lock_irqsave(&ibdev->reset_flow_resource_lock, flags); in mlx4_ib_handle_catas_error()
3049 list_for_each_entry(mqp, &ibdev->qp_list, qps_list) { in mlx4_ib_handle_catas_error()
3090 spin_unlock_irqrestore(&ibdev->reset_flow_resource_lock, flags); in mlx4_ib_handle_catas_error()
3098 struct mlx4_ib_dev *ibdev = ew->ib_dev; in handle_bonded_port_state_event() local
3104 spin_lock_bh(&ibdev->iboe.lock); in handle_bonded_port_state_event()
3106 struct ifnet *curr_netdev = ibdev->iboe.netdevs[i]; in handle_bonded_port_state_event()
3120 spin_unlock_bh(&ibdev->iboe.lock); in handle_bonded_port_state_event()
3122 ibev.device = &ibdev->ib_dev; in handle_bonded_port_state_event()
3155 void mlx4_sched_ib_sl2vl_update_work(struct mlx4_ib_dev *ibdev, in mlx4_sched_ib_sl2vl_update_work() argument
3164 ew->ib_dev = ibdev; in mlx4_sched_ib_sl2vl_update_work()
3175 struct mlx4_ib_dev *ibdev = to_mdev((struct ib_device *) ibdev_ptr); in mlx4_ib_event() local
3187 ew->ib_dev = ibdev; in mlx4_ib_event()
3199 if (p > ibdev->num_ports) in mlx4_ib_event()
3202 rdma_port_get_link_layer(&ibdev->ib_dev, p) == in mlx4_ib_event()
3205 mlx4_ib_invalidate_all_guid_record(ibdev, p); in mlx4_ib_event()
3206 if (ibdev->dev->flags & MLX4_FLAG_SECURE_HOST && in mlx4_ib_event()
3207 !(ibdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_SL_TO_VL_CHANGE_EVENT)) in mlx4_ib_event()
3208 mlx4_sched_ib_sl2vl_update_work(ibdev, p); in mlx4_ib_event()
3214 if (p > ibdev->num_ports) in mlx4_ib_event()
3220 ibdev->ib_active = false; in mlx4_ib_event()
3222 mlx4_ib_handle_catas_error(ibdev); in mlx4_ib_event()
3234 ew->ib_dev = ibdev; in mlx4_ib_event()
3244 do_slave_init(ibdev, p, 1); in mlx4_ib_event()
3248 for (i = 1; i <= ibdev->num_ports; i++) { in mlx4_ib_event()
3249 if (rdma_port_get_link_layer(&ibdev->ib_dev, i) in mlx4_ib_event()
3251 mlx4_ib_slave_alias_guid_event(ibdev, in mlx4_ib_event()
3262 for (i = 1; i <= ibdev->num_ports; i++) { in mlx4_ib_event()
3263 if (rdma_port_get_link_layer(&ibdev->ib_dev, i) in mlx4_ib_event()
3265 mlx4_ib_slave_alias_guid_event(ibdev, in mlx4_ib_event()
3271 do_slave_init(ibdev, p, 0); in mlx4_ib_event()
3279 ibev.element.port_num = mlx4_is_bonded(ibdev->dev) ? 1 : (u8)p; in mlx4_ib_event()