Lines Matching refs:ibdev

84 static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init);
134 static int mlx4_ib_query_device(struct ib_device *ibdev, in mlx4_ib_query_device() argument
137 struct mlx4_ib_dev *dev = to_mdev(ibdev); in mlx4_ib_query_device()
151 err = mlx4_MAD_IFC(to_mdev(ibdev), MLX4_MAD_IFC_IGNORE_KEYS, in mlx4_ib_query_device()
249 static int ib_link_query_port(struct ib_device *ibdev, u8 port, in ib_link_query_port() argument
267 if (mlx4_is_mfunc(to_mdev(ibdev)->dev) && netw_view) in ib_link_query_port()
270 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port, NULL, NULL, in ib_link_query_port()
286 props->gid_tbl_len = to_mdev(ibdev)->dev->caps.gid_table_len[port]; in ib_link_query_port()
287 props->max_msg_sz = to_mdev(ibdev)->dev->caps.max_msg_sz; in ib_link_query_port()
288 props->pkey_tbl_len = to_mdev(ibdev)->dev->caps.pkey_table_len[port]; in ib_link_query_port()
319 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port, in ib_link_query_port()
344 static int eth_link_query_port(struct ib_device *ibdev, u8 port, in eth_link_query_port() argument
348 struct mlx4_ib_dev *mdev = to_mdev(ibdev); in eth_link_query_port()
402 int __mlx4_ib_query_port(struct ib_device *ibdev, u8 port, in __mlx4_ib_query_port() argument
409 err = mlx4_ib_port_link_layer(ibdev, port) == IB_LINK_LAYER_INFINIBAND ? in __mlx4_ib_query_port()
410 ib_link_query_port(ibdev, port, props, netw_view) : in __mlx4_ib_query_port()
411 eth_link_query_port(ibdev, port, props, netw_view); in __mlx4_ib_query_port()
416 static int mlx4_ib_query_port(struct ib_device *ibdev, u8 port, in mlx4_ib_query_port() argument
420 return __mlx4_ib_query_port(ibdev, port, props, 0); in mlx4_ib_query_port()
423 int __mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index, in __mlx4_ib_query_gid() argument
429 struct mlx4_ib_dev *dev = to_mdev(ibdev); in __mlx4_ib_query_gid()
479 static int iboe_query_gid(struct ib_device *ibdev, u8 port, int index, in iboe_query_gid() argument
482 struct mlx4_ib_dev *dev = to_mdev(ibdev); in iboe_query_gid()
489 static int mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index, in mlx4_ib_query_gid() argument
492 if (rdma_port_get_link_layer(ibdev, port) == IB_LINK_LAYER_INFINIBAND) in mlx4_ib_query_gid()
493 return __mlx4_ib_query_gid(ibdev, port, index, gid, 0); in mlx4_ib_query_gid()
495 return iboe_query_gid(ibdev, port, index, gid); in mlx4_ib_query_gid()
498 int __mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, in __mlx4_ib_query_pkey() argument
515 if (mlx4_is_mfunc(to_mdev(ibdev)->dev) && netw_view) in __mlx4_ib_query_pkey()
518 err = mlx4_MAD_IFC(to_mdev(ibdev), mad_ifc_flags, port, NULL, NULL, in __mlx4_ib_query_pkey()
531 static int mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) in mlx4_ib_query_pkey() argument
533 return __mlx4_ib_query_pkey(ibdev, port, index, pkey, 0); in mlx4_ib_query_pkey()
536 static int mlx4_ib_modify_device(struct ib_device *ibdev, int mask, in mlx4_ib_modify_device() argument
548 if (mlx4_is_slave(to_mdev(ibdev)->dev)) in mlx4_ib_modify_device()
551 spin_lock_irqsave(&to_mdev(ibdev)->sm_lock, flags); in mlx4_ib_modify_device()
552 memcpy(ibdev->node_desc, props->node_desc, 64); in mlx4_ib_modify_device()
553 spin_unlock_irqrestore(&to_mdev(ibdev)->sm_lock, flags); in mlx4_ib_modify_device()
559 mailbox = mlx4_alloc_cmd_mailbox(to_mdev(ibdev)->dev); in mlx4_ib_modify_device()
564 mlx4_cmd(to_mdev(ibdev)->dev, mailbox->dma, 1, 0, in mlx4_ib_modify_device()
567 mlx4_free_cmd_mailbox(to_mdev(ibdev)->dev, mailbox); in mlx4_ib_modify_device()
598 static int mlx4_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, in mlx4_ib_modify_port() argument
601 struct mlx4_ib_dev *mdev = to_mdev(ibdev); in mlx4_ib_modify_port()
616 err = mlx4_ib_query_port(ibdev, port, &attr); in mlx4_ib_modify_port()
628 mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex); in mlx4_ib_modify_port()
632 static struct ib_ucontext *mlx4_ib_alloc_ucontext(struct ib_device *ibdev, in mlx4_ib_alloc_ucontext() argument
635 struct mlx4_ib_dev *dev = to_mdev(ibdev); in mlx4_ib_alloc_ucontext()
644 if (ibdev->uverbs_abi_ver == MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION) { in mlx4_ib_alloc_ucontext()
660 err = mlx4_uar_alloc(to_mdev(ibdev)->dev, &context->uar); in mlx4_ib_alloc_ucontext()
669 if (ibdev->uverbs_abi_ver == MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION) in mlx4_ib_alloc_ucontext()
675 mlx4_uar_free(to_mdev(ibdev)->dev, &context->uar); in mlx4_ib_alloc_ucontext()
721 static struct ib_pd *mlx4_ib_alloc_pd(struct ib_device *ibdev, in mlx4_ib_alloc_pd() argument
732 err = mlx4_pd_alloc(to_mdev(ibdev)->dev, &pd->pdn); in mlx4_ib_alloc_pd()
740 mlx4_pd_free(to_mdev(ibdev)->dev, pd->pdn); in mlx4_ib_alloc_pd()
756 static struct ib_xrcd *mlx4_ib_alloc_xrcd(struct ib_device *ibdev, in mlx4_ib_alloc_xrcd() argument
763 if (!(to_mdev(ibdev)->dev->caps.flags & MLX4_DEV_CAP_FLAG_XRC)) in mlx4_ib_alloc_xrcd()
770 err = mlx4_xrcd_alloc(to_mdev(ibdev)->dev, &xrcd->xrcdn); in mlx4_ib_alloc_xrcd()
774 xrcd->pd = ib_alloc_pd(ibdev); in mlx4_ib_alloc_xrcd()
780 xrcd->cq = ib_create_cq(ibdev, NULL, NULL, xrcd, 1, 0); in mlx4_ib_alloc_xrcd()
791 mlx4_xrcd_free(to_mdev(ibdev)->dev, xrcd->xrcdn); in mlx4_ib_alloc_xrcd()
1665 struct mlx4_ib_dev *ibdev, union ib_gid *gid) in mlx4_ib_addr_event() argument
1687 iboe = &ibdev->iboe; in mlx4_ib_addr_event()
1690 for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) in mlx4_ib_addr_event()
1695 update_gid_table(ibdev, port, gid, in mlx4_ib_addr_event()
1704 struct mlx4_ib_dev *ibdev) in mlx4_ib_get_dev_port() argument
1711 iboe = &ibdev->iboe; in mlx4_ib_get_dev_port()
1713 for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) in mlx4_ib_get_dev_port()
1720 if ((port == 0) || (port > ibdev->dev->caps.num_ports)) in mlx4_ib_get_dev_port()
1729 struct mlx4_ib_dev *ibdev; in mlx4_ib_inet_event() local
1736 ibdev = container_of(this, struct mlx4_ib_dev, iboe.nb_inet); in mlx4_ib_inet_event()
1738 mlx4_ib_addr_event(event, event_netdev, ibdev, &gid); in mlx4_ib_inet_event()
1746 struct mlx4_ib_dev *ibdev; in mlx4_ib_inet6_event() local
1751 ibdev = container_of(this, struct mlx4_ib_dev, iboe.nb_inet6); in mlx4_ib_inet6_event()
1753 mlx4_ib_addr_event(event, event_netdev, ibdev, gid); in mlx4_ib_inet6_event()
1759 static void mlx4_ib_update_qps(struct mlx4_ib_dev *ibdev, in mlx4_ib_update_qps() argument
1771 atomic64_set(&ibdev->iboe.mac[port - 1], new_smac); in mlx4_ib_update_qps()
1774 if (!mlx4_is_mfunc(ibdev->dev)) in mlx4_ib_update_qps()
1777 mutex_lock(&ibdev->qp1_proxy_lock[port - 1]); in mlx4_ib_update_qps()
1778 qp = ibdev->qp1_proxy[port - 1]; in mlx4_ib_update_qps()
1789 new_smac_index = mlx4_register_mac(ibdev->dev, port, new_smac); in mlx4_ib_update_qps()
1795 if (mlx4_update_qp(ibdev->dev, qp->mqp.qpn, MLX4_UPDATE_QP_SMAC, in mlx4_ib_update_qps()
1810 mlx4_unregister_mac(ibdev->dev, port, release_mac); in mlx4_ib_update_qps()
1813 mutex_unlock(&ibdev->qp1_proxy_lock[port - 1]); in mlx4_ib_update_qps()
1817 struct mlx4_ib_dev *ibdev, u8 port) in mlx4_ib_get_dev_addr() argument
1829 if ((port == 0) || (port > ibdev->dev->caps.num_ports)) in mlx4_ib_get_dev_addr()
1839 update_gid_table(ibdev, port, &gid, 0, 0); in mlx4_ib_get_dev_addr()
1854 update_gid_table(ibdev, port, pgid, 0, 0); in mlx4_ib_get_dev_addr()
1862 static void mlx4_ib_set_default_gid(struct mlx4_ib_dev *ibdev, in mlx4_ib_set_default_gid() argument
1867 update_gid_table(ibdev, port, &gid, 0, 1); in mlx4_ib_set_default_gid()
1870 static int mlx4_ib_init_gid_table(struct mlx4_ib_dev *ibdev) in mlx4_ib_init_gid_table() argument
1873 struct mlx4_ib_iboe *iboe = &ibdev->iboe; in mlx4_ib_init_gid_table()
1877 for (i = 1; i <= ibdev->num_ports; ++i) { in mlx4_ib_init_gid_table()
1878 if (rdma_port_get_link_layer(&ibdev->ib_dev, i) == in mlx4_ib_init_gid_table()
1880 err = reset_gid_table(ibdev, i); in mlx4_ib_init_gid_table()
1890 u8 port = mlx4_ib_get_dev_port(dev, ibdev); in mlx4_ib_init_gid_table()
1893 mlx4_ib_set_default_gid(ibdev, dev, port); in mlx4_ib_init_gid_table()
1894 mlx4_ib_get_dev_addr(dev, ibdev, port); in mlx4_ib_init_gid_table()
1904 static void mlx4_ib_scan_netdevs(struct mlx4_ib_dev *ibdev, in mlx4_ib_scan_netdevs() argument
1913 iboe = &ibdev->iboe; in mlx4_ib_scan_netdevs()
1916 mlx4_foreach_ib_transport_port(port, ibdev->dev) { in mlx4_ib_scan_netdevs()
1923 mlx4_get_protocol_dev(ibdev->dev, MLX4_PROT_ETH, port); in mlx4_ib_scan_netdevs()
1925 mlx4_ib_set_default_gid(ibdev, in mlx4_ib_scan_netdevs()
1946 mlx4_ib_set_default_gid(ibdev, curr_netdev, port); in mlx4_ib_scan_netdevs()
1953 !mlx4_is_bonded(ibdev->dev)) { in mlx4_ib_scan_netdevs()
1954 reset_gid_table(ibdev, port); in mlx4_ib_scan_netdevs()
1955 mlx4_ib_set_default_gid(ibdev, in mlx4_ib_scan_netdevs()
1963 ibdev, port); in mlx4_ib_scan_netdevs()
1971 reset_gid_table(ibdev, port); in mlx4_ib_scan_netdevs()
1972 mlx4_ib_set_default_gid(ibdev, in mlx4_ib_scan_netdevs()
1974 mlx4_ib_get_dev_addr(curr_master, ibdev, port); in mlx4_ib_scan_netdevs()
1978 reset_gid_table(ibdev, port); in mlx4_ib_scan_netdevs()
1979 mlx4_ib_set_default_gid(ibdev, in mlx4_ib_scan_netdevs()
1981 mlx4_ib_get_dev_addr(curr_netdev, ibdev, port); in mlx4_ib_scan_netdevs()
1984 reset_gid_table(ibdev, port); in mlx4_ib_scan_netdevs()
1991 mlx4_ib_update_qps(ibdev, dev, update_qps_port); in mlx4_ib_scan_netdevs()
1998 struct mlx4_ib_dev *ibdev; in mlx4_ib_netdev_event() local
2003 ibdev = container_of(this, struct mlx4_ib_dev, iboe.nb); in mlx4_ib_netdev_event()
2004 mlx4_ib_scan_netdevs(ibdev, dev, event); in mlx4_ib_netdev_event()
2009 static void init_pkeys(struct mlx4_ib_dev *ibdev) in init_pkeys() argument
2015 if (mlx4_is_master(ibdev->dev)) { in init_pkeys()
2016 for (slave = 0; slave <= ibdev->dev->persist->num_vfs; in init_pkeys()
2018 for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) { in init_pkeys()
2020 i < ibdev->dev->phys_caps.pkey_phys_table_len[port]; in init_pkeys()
2022 ibdev->pkeys.virt2phys_pkey[slave][port - 1][i] = in init_pkeys()
2024 (slave == mlx4_master_func_num(ibdev->dev) || !i) ? i : in init_pkeys()
2025 ibdev->dev->phys_caps.pkey_phys_table_len[port] - 1; in init_pkeys()
2026 mlx4_sync_pkey_table(ibdev->dev, slave, port, i, in init_pkeys()
2027 ibdev->pkeys.virt2phys_pkey[slave][port - 1][i]); in init_pkeys()
2032 for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) { in init_pkeys()
2034 i < ibdev->dev->phys_caps.pkey_phys_table_len[port]; in init_pkeys()
2036 ibdev->pkeys.phys_pkey_cache[port-1][i] = in init_pkeys()
2042 static void mlx4_ib_alloc_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev) in mlx4_ib_alloc_eqs() argument
2064 ibdev->eq_table = kzalloc(total_eqs * sizeof(int), GFP_KERNEL); in mlx4_ib_alloc_eqs()
2065 if (!ibdev->eq_table) in mlx4_ib_alloc_eqs()
2068 ibdev->eq_added = added_eqs; in mlx4_ib_alloc_eqs()
2077 &ibdev->eq_table[eq])) { in mlx4_ib_alloc_eqs()
2080 ibdev->eq_table[eq] = in mlx4_ib_alloc_eqs()
2089 ibdev->eq_table[eq++] = i; in mlx4_ib_alloc_eqs()
2092 ibdev->ib_dev.num_comp_vectors = total_eqs; in mlx4_ib_alloc_eqs()
2095 static void mlx4_ib_free_eqs(struct mlx4_dev *dev, struct mlx4_ib_dev *ibdev) in mlx4_ib_free_eqs() argument
2100 if (!ibdev->eq_table) in mlx4_ib_free_eqs()
2104 ibdev->ib_dev.num_comp_vectors = dev->caps.num_comp_vectors; in mlx4_ib_free_eqs()
2107 for (i = 0; i < ibdev->eq_added; i++) { in mlx4_ib_free_eqs()
2109 if (ibdev->eq_table[i] <= dev->caps.num_comp_vectors) in mlx4_ib_free_eqs()
2111 mlx4_release_eq(dev, ibdev->eq_table[i]); in mlx4_ib_free_eqs()
2114 kfree(ibdev->eq_table); in mlx4_ib_free_eqs()
2119 struct mlx4_ib_dev *ibdev; in mlx4_ib_add() local
2137 ibdev = (struct mlx4_ib_dev *) ib_alloc_device(sizeof *ibdev); in mlx4_ib_add()
2138 if (!ibdev) { in mlx4_ib_add()
2144 iboe = &ibdev->iboe; in mlx4_ib_add()
2146 if (mlx4_pd_alloc(dev, &ibdev->priv_pdn)) in mlx4_ib_add()
2149 if (mlx4_uar_alloc(dev, &ibdev->priv_uar)) in mlx4_ib_add()
2152 ibdev->uar_map = ioremap((phys_addr_t) ibdev->priv_uar.pfn << PAGE_SHIFT, in mlx4_ib_add()
2154 if (!ibdev->uar_map) in mlx4_ib_add()
2156 MLX4_INIT_DOORBELL_LOCK(&ibdev->uar_lock); in mlx4_ib_add()
2158 ibdev->dev = dev; in mlx4_ib_add()
2159 ibdev->bond_next_port = 0; in mlx4_ib_add()
2161 strlcpy(ibdev->ib_dev.name, "mlx4_%d", IB_DEVICE_NAME_MAX); in mlx4_ib_add()
2162 ibdev->ib_dev.owner = THIS_MODULE; in mlx4_ib_add()
2163 ibdev->ib_dev.node_type = RDMA_NODE_IB_CA; in mlx4_ib_add()
2164 ibdev->ib_dev.local_dma_lkey = dev->caps.reserved_lkey; in mlx4_ib_add()
2165 ibdev->num_ports = num_ports; in mlx4_ib_add()
2166 ibdev->ib_dev.phys_port_cnt = mlx4_is_bonded(dev) ? in mlx4_ib_add()
2167 1 : ibdev->num_ports; in mlx4_ib_add()
2168 ibdev->ib_dev.num_comp_vectors = dev->caps.num_comp_vectors; in mlx4_ib_add()
2169 ibdev->ib_dev.dma_device = &dev->persist->pdev->dev; in mlx4_ib_add()
2172 ibdev->ib_dev.uverbs_abi_ver = MLX4_IB_UVERBS_ABI_VERSION; in mlx4_ib_add()
2174 ibdev->ib_dev.uverbs_abi_ver = MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION; in mlx4_ib_add()
2176 ibdev->ib_dev.uverbs_cmd_mask = in mlx4_ib_add()
2202 ibdev->ib_dev.query_device = mlx4_ib_query_device; in mlx4_ib_add()
2203 ibdev->ib_dev.query_port = mlx4_ib_query_port; in mlx4_ib_add()
2204 ibdev->ib_dev.get_link_layer = mlx4_ib_port_link_layer; in mlx4_ib_add()
2205 ibdev->ib_dev.query_gid = mlx4_ib_query_gid; in mlx4_ib_add()
2206 ibdev->ib_dev.query_pkey = mlx4_ib_query_pkey; in mlx4_ib_add()
2207 ibdev->ib_dev.modify_device = mlx4_ib_modify_device; in mlx4_ib_add()
2208 ibdev->ib_dev.modify_port = mlx4_ib_modify_port; in mlx4_ib_add()
2209 ibdev->ib_dev.alloc_ucontext = mlx4_ib_alloc_ucontext; in mlx4_ib_add()
2210 ibdev->ib_dev.dealloc_ucontext = mlx4_ib_dealloc_ucontext; in mlx4_ib_add()
2211 ibdev->ib_dev.mmap = mlx4_ib_mmap; in mlx4_ib_add()
2212 ibdev->ib_dev.alloc_pd = mlx4_ib_alloc_pd; in mlx4_ib_add()
2213 ibdev->ib_dev.dealloc_pd = mlx4_ib_dealloc_pd; in mlx4_ib_add()
2214 ibdev->ib_dev.create_ah = mlx4_ib_create_ah; in mlx4_ib_add()
2215 ibdev->ib_dev.query_ah = mlx4_ib_query_ah; in mlx4_ib_add()
2216 ibdev->ib_dev.destroy_ah = mlx4_ib_destroy_ah; in mlx4_ib_add()
2217 ibdev->ib_dev.create_srq = mlx4_ib_create_srq; in mlx4_ib_add()
2218 ibdev->ib_dev.modify_srq = mlx4_ib_modify_srq; in mlx4_ib_add()
2219 ibdev->ib_dev.query_srq = mlx4_ib_query_srq; in mlx4_ib_add()
2220 ibdev->ib_dev.destroy_srq = mlx4_ib_destroy_srq; in mlx4_ib_add()
2221 ibdev->ib_dev.post_srq_recv = mlx4_ib_post_srq_recv; in mlx4_ib_add()
2222 ibdev->ib_dev.create_qp = mlx4_ib_create_qp; in mlx4_ib_add()
2223 ibdev->ib_dev.modify_qp = mlx4_ib_modify_qp; in mlx4_ib_add()
2224 ibdev->ib_dev.query_qp = mlx4_ib_query_qp; in mlx4_ib_add()
2225 ibdev->ib_dev.destroy_qp = mlx4_ib_destroy_qp; in mlx4_ib_add()
2226 ibdev->ib_dev.post_send = mlx4_ib_post_send; in mlx4_ib_add()
2227 ibdev->ib_dev.post_recv = mlx4_ib_post_recv; in mlx4_ib_add()
2228 ibdev->ib_dev.create_cq = mlx4_ib_create_cq; in mlx4_ib_add()
2229 ibdev->ib_dev.modify_cq = mlx4_ib_modify_cq; in mlx4_ib_add()
2230 ibdev->ib_dev.resize_cq = mlx4_ib_resize_cq; in mlx4_ib_add()
2231 ibdev->ib_dev.destroy_cq = mlx4_ib_destroy_cq; in mlx4_ib_add()
2232 ibdev->ib_dev.poll_cq = mlx4_ib_poll_cq; in mlx4_ib_add()
2233 ibdev->ib_dev.req_notify_cq = mlx4_ib_arm_cq; in mlx4_ib_add()
2234 ibdev->ib_dev.get_dma_mr = mlx4_ib_get_dma_mr; in mlx4_ib_add()
2235 ibdev->ib_dev.reg_user_mr = mlx4_ib_reg_user_mr; in mlx4_ib_add()
2236 ibdev->ib_dev.rereg_user_mr = mlx4_ib_rereg_user_mr; in mlx4_ib_add()
2237 ibdev->ib_dev.dereg_mr = mlx4_ib_dereg_mr; in mlx4_ib_add()
2238 ibdev->ib_dev.alloc_fast_reg_mr = mlx4_ib_alloc_fast_reg_mr; in mlx4_ib_add()
2239 ibdev->ib_dev.alloc_fast_reg_page_list = mlx4_ib_alloc_fast_reg_page_list; in mlx4_ib_add()
2240 ibdev->ib_dev.free_fast_reg_page_list = mlx4_ib_free_fast_reg_page_list; in mlx4_ib_add()
2241 ibdev->ib_dev.attach_mcast = mlx4_ib_mcg_attach; in mlx4_ib_add()
2242 ibdev->ib_dev.detach_mcast = mlx4_ib_mcg_detach; in mlx4_ib_add()
2243 ibdev->ib_dev.process_mad = mlx4_ib_process_mad; in mlx4_ib_add()
2245 if (!mlx4_is_slave(ibdev->dev)) { in mlx4_ib_add()
2246 ibdev->ib_dev.alloc_fmr = mlx4_ib_fmr_alloc; in mlx4_ib_add()
2247 ibdev->ib_dev.map_phys_fmr = mlx4_ib_map_phys_fmr; in mlx4_ib_add()
2248 ibdev->ib_dev.unmap_fmr = mlx4_ib_unmap_fmr; in mlx4_ib_add()
2249 ibdev->ib_dev.dealloc_fmr = mlx4_ib_fmr_dealloc; in mlx4_ib_add()
2254 ibdev->ib_dev.alloc_mw = mlx4_ib_alloc_mw; in mlx4_ib_add()
2255 ibdev->ib_dev.bind_mw = mlx4_ib_bind_mw; in mlx4_ib_add()
2256 ibdev->ib_dev.dealloc_mw = mlx4_ib_dealloc_mw; in mlx4_ib_add()
2258 ibdev->ib_dev.uverbs_cmd_mask |= in mlx4_ib_add()
2264 ibdev->ib_dev.alloc_xrcd = mlx4_ib_alloc_xrcd; in mlx4_ib_add()
2265 ibdev->ib_dev.dealloc_xrcd = mlx4_ib_dealloc_xrcd; in mlx4_ib_add()
2266 ibdev->ib_dev.uverbs_cmd_mask |= in mlx4_ib_add()
2272 ibdev->steering_support = MLX4_STEERING_MODE_DEVICE_MANAGED; in mlx4_ib_add()
2273 ibdev->ib_dev.create_flow = mlx4_ib_create_flow; in mlx4_ib_add()
2274 ibdev->ib_dev.destroy_flow = mlx4_ib_destroy_flow; in mlx4_ib_add()
2276 ibdev->ib_dev.uverbs_ex_cmd_mask |= in mlx4_ib_add()
2281 mlx4_ib_alloc_eqs(dev, ibdev); in mlx4_ib_add()
2285 if (init_node_data(ibdev)) in mlx4_ib_add()
2288 num_req_counters = mlx4_is_bonded(dev) ? 1 : ibdev->num_ports; in mlx4_ib_add()
2290 mutex_init(&ibdev->qp1_proxy_lock[i]); in mlx4_ib_add()
2291 if (mlx4_ib_port_link_layer(&ibdev->ib_dev, i + 1) == in mlx4_ib_add()
2293 err = mlx4_counter_alloc(ibdev->dev, &ibdev->counters[i]); in mlx4_ib_add()
2295 ibdev->counters[i] = -1; in mlx4_ib_add()
2297 ibdev->counters[i] = -1; in mlx4_ib_add()
2301 for (i = 1; i < ibdev->num_ports ; ++i) in mlx4_ib_add()
2302 ibdev->counters[i] = ibdev->counters[0]; in mlx4_ib_add()
2308 spin_lock_init(&ibdev->sm_lock); in mlx4_ib_add()
2309 mutex_init(&ibdev->cap_mask_mutex); in mlx4_ib_add()
2310 INIT_LIST_HEAD(&ibdev->qp_list); in mlx4_ib_add()
2311 spin_lock_init(&ibdev->reset_flow_resource_lock); in mlx4_ib_add()
2313 if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED && in mlx4_ib_add()
2315 ibdev->steer_qpn_count = MLX4_IB_UC_MAX_NUM_QPS; in mlx4_ib_add()
2316 err = mlx4_qp_reserve_range(dev, ibdev->steer_qpn_count, in mlx4_ib_add()
2318 &ibdev->steer_qpn_base, 0); in mlx4_ib_add()
2322 ibdev->ib_uc_qpns_bitmap = in mlx4_ib_add()
2323 kmalloc(BITS_TO_LONGS(ibdev->steer_qpn_count) * in mlx4_ib_add()
2326 if (!ibdev->ib_uc_qpns_bitmap) { in mlx4_ib_add()
2332 bitmap_zero(ibdev->ib_uc_qpns_bitmap, ibdev->steer_qpn_count); in mlx4_ib_add()
2335 dev, ibdev->steer_qpn_base, in mlx4_ib_add()
2336 ibdev->steer_qpn_base + in mlx4_ib_add()
2337 ibdev->steer_qpn_count - 1); in mlx4_ib_add()
2342 for (j = 1; j <= ibdev->dev->caps.num_ports; j++) in mlx4_ib_add()
2343 atomic64_set(&iboe->mac[j - 1], ibdev->dev->caps.def_mac[j]); in mlx4_ib_add()
2345 if (ib_register_device(&ibdev->ib_dev, NULL)) in mlx4_ib_add()
2348 if (mlx4_ib_mad_init(ibdev)) in mlx4_ib_add()
2351 if (mlx4_ib_init_sriov(ibdev)) in mlx4_ib_add()
2381 if (mlx4_ib_init_gid_table(ibdev)) in mlx4_ib_add()
2386 if (device_create_file(&ibdev->ib_dev.dev, in mlx4_ib_add()
2391 ibdev->ib_active = true; in mlx4_ib_add()
2393 if (mlx4_is_mfunc(ibdev->dev)) in mlx4_ib_add()
2394 init_pkeys(ibdev); in mlx4_ib_add()
2397 if (mlx4_is_master(ibdev->dev)) { in mlx4_ib_add()
2399 if (j == mlx4_master_func_num(ibdev->dev)) in mlx4_ib_add()
2401 if (mlx4_is_slave_active(ibdev->dev, j)) in mlx4_ib_add()
2402 do_slave_init(ibdev, j, 1); in mlx4_ib_add()
2405 return ibdev; in mlx4_ib_add()
2408 if (ibdev->iboe.nb.notifier_call) { in mlx4_ib_add()
2409 if (unregister_netdevice_notifier(&ibdev->iboe.nb)) in mlx4_ib_add()
2411 ibdev->iboe.nb.notifier_call = NULL; in mlx4_ib_add()
2413 if (ibdev->iboe.nb_inet.notifier_call) { in mlx4_ib_add()
2414 if (unregister_inetaddr_notifier(&ibdev->iboe.nb_inet)) in mlx4_ib_add()
2416 ibdev->iboe.nb_inet.notifier_call = NULL; in mlx4_ib_add()
2419 if (ibdev->iboe.nb_inet6.notifier_call) { in mlx4_ib_add()
2420 if (unregister_inet6addr_notifier(&ibdev->iboe.nb_inet6)) in mlx4_ib_add()
2422 ibdev->iboe.nb_inet6.notifier_call = NULL; in mlx4_ib_add()
2427 mlx4_ib_close_sriov(ibdev); in mlx4_ib_add()
2430 mlx4_ib_mad_cleanup(ibdev); in mlx4_ib_add()
2433 ib_unregister_device(&ibdev->ib_dev); in mlx4_ib_add()
2436 kfree(ibdev->ib_uc_qpns_bitmap); in mlx4_ib_add()
2439 if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) in mlx4_ib_add()
2440 mlx4_qp_release_range(dev, ibdev->steer_qpn_base, in mlx4_ib_add()
2441 ibdev->steer_qpn_count); in mlx4_ib_add()
2444 if (ibdev->counters[i - 1] != -1) in mlx4_ib_add()
2445 mlx4_counter_free(ibdev->dev, ibdev->counters[i - 1]); in mlx4_ib_add()
2448 iounmap(ibdev->uar_map); in mlx4_ib_add()
2451 mlx4_uar_free(dev, &ibdev->priv_uar); in mlx4_ib_add()
2454 mlx4_pd_free(dev, ibdev->priv_pdn); in mlx4_ib_add()
2457 ib_dealloc_device(&ibdev->ib_dev); in mlx4_ib_add()
2527 struct mlx4_ib_dev *ibdev = ibdev_ptr; in mlx4_ib_remove() local
2530 ibdev->ib_active = false; in mlx4_ib_remove()
2533 mlx4_ib_close_sriov(ibdev); in mlx4_ib_remove()
2534 mlx4_ib_mad_cleanup(ibdev); in mlx4_ib_remove()
2535 ib_unregister_device(&ibdev->ib_dev); in mlx4_ib_remove()
2536 if (ibdev->iboe.nb.notifier_call) { in mlx4_ib_remove()
2537 if (unregister_netdevice_notifier(&ibdev->iboe.nb)) in mlx4_ib_remove()
2539 ibdev->iboe.nb.notifier_call = NULL; in mlx4_ib_remove()
2542 if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) { in mlx4_ib_remove()
2543 mlx4_qp_release_range(dev, ibdev->steer_qpn_base, in mlx4_ib_remove()
2544 ibdev->steer_qpn_count); in mlx4_ib_remove()
2545 kfree(ibdev->ib_uc_qpns_bitmap); in mlx4_ib_remove()
2548 if (ibdev->iboe.nb_inet.notifier_call) { in mlx4_ib_remove()
2549 if (unregister_inetaddr_notifier(&ibdev->iboe.nb_inet)) in mlx4_ib_remove()
2551 ibdev->iboe.nb_inet.notifier_call = NULL; in mlx4_ib_remove()
2554 if (ibdev->iboe.nb_inet6.notifier_call) { in mlx4_ib_remove()
2555 if (unregister_inet6addr_notifier(&ibdev->iboe.nb_inet6)) in mlx4_ib_remove()
2557 ibdev->iboe.nb_inet6.notifier_call = NULL; in mlx4_ib_remove()
2561 iounmap(ibdev->uar_map); in mlx4_ib_remove()
2562 for (p = 0; p < ibdev->num_ports; ++p) in mlx4_ib_remove()
2563 if (ibdev->counters[p] != -1) in mlx4_ib_remove()
2564 mlx4_counter_free(ibdev->dev, ibdev->counters[p]); in mlx4_ib_remove()
2568 mlx4_ib_free_eqs(dev, ibdev); in mlx4_ib_remove()
2570 mlx4_uar_free(dev, &ibdev->priv_uar); in mlx4_ib_remove()
2571 mlx4_pd_free(dev, ibdev->priv_pdn); in mlx4_ib_remove()
2572 ib_dealloc_device(&ibdev->ib_dev); in mlx4_ib_remove()
2575 static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init) in do_slave_init() argument
2578 struct mlx4_dev *dev = ibdev->dev; in do_slave_init()
2615 dm[i]->dev = ibdev; in do_slave_init()
2616 spin_lock_irqsave(&ibdev->sriov.going_down_lock, flags); in do_slave_init()
2617 if (!ibdev->sriov.is_going_down) in do_slave_init()
2618 queue_work(ibdev->sriov.demux[i].ud_wq, &dm[i]->work); in do_slave_init()
2619 spin_unlock_irqrestore(&ibdev->sriov.going_down_lock, flags); in do_slave_init()
2626 static void mlx4_ib_handle_catas_error(struct mlx4_ib_dev *ibdev) in mlx4_ib_handle_catas_error() argument
2640 spin_lock_irqsave(&ibdev->reset_flow_resource_lock, flags); in mlx4_ib_handle_catas_error()
2642 list_for_each_entry(mqp, &ibdev->qp_list, qps_list) { in mlx4_ib_handle_catas_error()
2683 spin_unlock_irqrestore(&ibdev->reset_flow_resource_lock, flags); in mlx4_ib_handle_catas_error()
2691 struct mlx4_ib_dev *ibdev = ew->ib_dev; in handle_bonded_port_state_event() local
2697 spin_lock_bh(&ibdev->iboe.lock); in handle_bonded_port_state_event()
2699 struct net_device *curr_netdev = ibdev->iboe.netdevs[i]; in handle_bonded_port_state_event()
2713 spin_unlock_bh(&ibdev->iboe.lock); in handle_bonded_port_state_event()
2715 ibev.device = &ibdev->ib_dev; in handle_bonded_port_state_event()
2727 struct mlx4_ib_dev *ibdev = to_mdev((struct ib_device *) ibdev_ptr); in mlx4_ib_event() local
2739 ew->ib_dev = ibdev; in mlx4_ib_event()
2751 if (p > ibdev->num_ports) in mlx4_ib_event()
2754 rdma_port_get_link_layer(&ibdev->ib_dev, p) == in mlx4_ib_event()
2756 mlx4_ib_invalidate_all_guid_record(ibdev, p); in mlx4_ib_event()
2762 if (p > ibdev->num_ports) in mlx4_ib_event()
2768 ibdev->ib_active = false; in mlx4_ib_event()
2770 mlx4_ib_handle_catas_error(ibdev); in mlx4_ib_event()
2782 ew->ib_dev = ibdev; in mlx4_ib_event()
2792 do_slave_init(ibdev, p, 1); in mlx4_ib_event()
2796 for (i = 1; i <= ibdev->num_ports; i++) { in mlx4_ib_event()
2797 if (rdma_port_get_link_layer(&ibdev->ib_dev, i) in mlx4_ib_event()
2799 mlx4_ib_slave_alias_guid_event(ibdev, in mlx4_ib_event()
2810 for (i = 1; i <= ibdev->num_ports; i++) { in mlx4_ib_event()
2811 if (rdma_port_get_link_layer(&ibdev->ib_dev, i) in mlx4_ib_event()
2813 mlx4_ib_slave_alias_guid_event(ibdev, in mlx4_ib_event()
2819 do_slave_init(ibdev, p, 0); in mlx4_ib_event()
2827 ibev.element.port_num = mlx4_is_bonded(ibdev->dev) ? 1 : (u8)p; in mlx4_ib_event()