1 /* 2 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved. 3 * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved. 4 * 5 * This software is available to you under a choice of one of two 6 * licenses. You may choose to be licensed under the terms of the GNU 7 * General Public License (GPL) Version 2, available from the file 8 * COPYING in the main directory of this source tree, or the 9 * OpenIB.org BSD license below: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * - Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 */ 33 34 #include <linux/module.h> 35 #include <linux/init.h> 36 #include <linux/slab.h> 37 #include <linux/errno.h> 38 #include <linux/netdevice.h> 39 #include <linux/inetdevice.h> 40 #include <linux/rtnetlink.h> 41 #include <linux/if_vlan.h> 42 43 #include <rdma/ib_smi.h> 44 #include <rdma/ib_user_verbs.h> 45 #include <rdma/ib_addr.h> 46 47 #include <linux/mlx4/driver.h> 48 #include <linux/mlx4/cmd.h> 49 50 #include "mlx4_ib.h" 51 #include "user.h" 52 53 #define DRV_NAME "mlx4_ib" 54 #define DRV_VERSION "1.0" 55 #define DRV_RELDATE "April 4, 2008" 56 57 MODULE_AUTHOR("Roland Dreier"); 58 MODULE_DESCRIPTION("Mellanox ConnectX HCA InfiniBand driver"); 59 MODULE_LICENSE("Dual BSD/GPL"); 60 MODULE_VERSION(DRV_VERSION); 61 62 static const char mlx4_ib_version[] = 63 DRV_NAME ": Mellanox ConnectX InfiniBand driver v" 64 DRV_VERSION " (" DRV_RELDATE ")\n"; 65 66 struct update_gid_work { 67 struct work_struct work; 68 union ib_gid gids[128]; 69 struct mlx4_ib_dev *dev; 70 int port; 71 }; 72 73 static struct workqueue_struct *wq; 74 75 static void init_query_mad(struct ib_smp *mad) 76 { 77 mad->base_version = 1; 78 mad->mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED; 79 mad->class_version = 1; 80 mad->method = IB_MGMT_METHOD_GET; 81 } 82 83 static union ib_gid zgid; 84 85 static int mlx4_ib_query_device(struct ib_device *ibdev, 86 struct ib_device_attr *props) 87 { 88 struct mlx4_ib_dev *dev = to_mdev(ibdev); 89 struct ib_smp *in_mad = NULL; 90 struct ib_smp *out_mad = NULL; 91 int err = -ENOMEM; 92 93 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); 94 out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL); 95 if (!in_mad || !out_mad) 96 goto out; 97 98 init_query_mad(in_mad); 99 in_mad->attr_id = IB_SMP_ATTR_NODE_INFO; 100 101 err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, 1, NULL, NULL, in_mad, out_mad); 102 if (err) 103 goto out; 104 105 memset(props, 0, sizeof *props); 106 107 props->fw_ver = dev->dev->caps.fw_ver; 108 props->device_cap_flags = IB_DEVICE_CHANGE_PHY_PORT | 109 IB_DEVICE_PORT_ACTIVE_EVENT | 110 IB_DEVICE_SYS_IMAGE_GUID | 111 IB_DEVICE_RC_RNR_NAK_GEN | 112 IB_DEVICE_BLOCK_MULTICAST_LOOPBACK; 113 if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BAD_PKEY_CNTR) 114 props->device_cap_flags |= IB_DEVICE_BAD_PKEY_CNTR; 115 if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BAD_QKEY_CNTR) 116 props->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR; 117 if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_APM) 118 props->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG; 119 if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_UD_AV_PORT) 120 props->device_cap_flags |= IB_DEVICE_UD_AV_PORT_ENFORCE; 121 if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_IPOIB_CSUM) 122 props->device_cap_flags |= IB_DEVICE_UD_IP_CSUM; 123 if (dev->dev->caps.max_gso_sz && dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BLH) 124 props->device_cap_flags |= IB_DEVICE_UD_TSO; 125 if (dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_RESERVED_LKEY) 126 props->device_cap_flags |= IB_DEVICE_LOCAL_DMA_LKEY; 127 if ((dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_LOCAL_INV) && 128 (dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_REMOTE_INV) && 129 (dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_FAST_REG_WR)) 130 props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS; 131 if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_XRC) 132 props->device_cap_flags |= IB_DEVICE_XRC; 133 134 props->vendor_id = be32_to_cpup((__be32 *) (out_mad->data + 36)) & 135 0xffffff; 136 props->vendor_part_id = be16_to_cpup((__be16 *) (out_mad->data + 30)); 137 props->hw_ver = be32_to_cpup((__be32 *) (out_mad->data + 32)); 138 memcpy(&props->sys_image_guid, out_mad->data + 4, 8); 139 140 props->max_mr_size = ~0ull; 141 props->page_size_cap = dev->dev->caps.page_size_cap; 142 props->max_qp = dev->dev->caps.num_qps - dev->dev->caps.reserved_qps; 143 props->max_qp_wr = dev->dev->caps.max_wqes; 144 props->max_sge = min(dev->dev->caps.max_sq_sg, 145 dev->dev->caps.max_rq_sg); 146 props->max_cq = dev->dev->caps.num_cqs - dev->dev->caps.reserved_cqs; 147 props->max_cqe = dev->dev->caps.max_cqes; 148 props->max_mr = dev->dev->caps.num_mpts - dev->dev->caps.reserved_mrws; 149 props->max_pd = dev->dev->caps.num_pds - dev->dev->caps.reserved_pds; 150 props->max_qp_rd_atom = dev->dev->caps.max_qp_dest_rdma; 151 props->max_qp_init_rd_atom = dev->dev->caps.max_qp_init_rdma; 152 props->max_res_rd_atom = props->max_qp_rd_atom * props->max_qp; 153 props->max_srq = dev->dev->caps.num_srqs - dev->dev->caps.reserved_srqs; 154 props->max_srq_wr = dev->dev->caps.max_srq_wqes - 1; 155 props->max_srq_sge = dev->dev->caps.max_srq_sge; 156 props->max_fast_reg_page_list_len = MLX4_MAX_FAST_REG_PAGES; 157 props->local_ca_ack_delay = dev->dev->caps.local_ca_ack_delay; 158 props->atomic_cap = dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_ATOMIC ? 159 IB_ATOMIC_HCA : IB_ATOMIC_NONE; 160 props->masked_atomic_cap = IB_ATOMIC_HCA; 161 props->max_pkeys = dev->dev->caps.pkey_table_len[1]; 162 props->max_mcast_grp = dev->dev->caps.num_mgms + dev->dev->caps.num_amgms; 163 props->max_mcast_qp_attach = dev->dev->caps.num_qp_per_mgm; 164 props->max_total_mcast_qp_attach = props->max_mcast_qp_attach * 165 props->max_mcast_grp; 166 props->max_map_per_fmr = dev->dev->caps.max_fmr_maps; 167 168 out: 169 kfree(in_mad); 170 kfree(out_mad); 171 172 return err; 173 } 174 175 static enum rdma_link_layer 176 mlx4_ib_port_link_layer(struct ib_device *device, u8 port_num) 177 { 178 struct mlx4_dev *dev = to_mdev(device)->dev; 179 180 return dev->caps.port_mask[port_num] == MLX4_PORT_TYPE_IB ? 181 IB_LINK_LAYER_INFINIBAND : IB_LINK_LAYER_ETHERNET; 182 } 183 184 static int ib_link_query_port(struct ib_device *ibdev, u8 port, 185 struct ib_port_attr *props) 186 { 187 struct ib_smp *in_mad = NULL; 188 struct ib_smp *out_mad = NULL; 189 int ext_active_speed; 190 int err = -ENOMEM; 191 192 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); 193 out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL); 194 if (!in_mad || !out_mad) 195 goto out; 196 197 init_query_mad(in_mad); 198 in_mad->attr_id = IB_SMP_ATTR_PORT_INFO; 199 in_mad->attr_mod = cpu_to_be32(port); 200 201 err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, 202 in_mad, out_mad); 203 if (err) 204 goto out; 205 206 207 props->lid = be16_to_cpup((__be16 *) (out_mad->data + 16)); 208 props->lmc = out_mad->data[34] & 0x7; 209 props->sm_lid = be16_to_cpup((__be16 *) (out_mad->data + 18)); 210 props->sm_sl = out_mad->data[36] & 0xf; 211 props->state = out_mad->data[32] & 0xf; 212 props->phys_state = out_mad->data[33] >> 4; 213 props->port_cap_flags = be32_to_cpup((__be32 *) (out_mad->data + 20)); 214 props->gid_tbl_len = to_mdev(ibdev)->dev->caps.gid_table_len[port]; 215 props->max_msg_sz = to_mdev(ibdev)->dev->caps.max_msg_sz; 216 props->pkey_tbl_len = to_mdev(ibdev)->dev->caps.pkey_table_len[port]; 217 props->bad_pkey_cntr = be16_to_cpup((__be16 *) (out_mad->data + 46)); 218 props->qkey_viol_cntr = be16_to_cpup((__be16 *) (out_mad->data + 48)); 219 props->active_width = out_mad->data[31] & 0xf; 220 props->active_speed = out_mad->data[35] >> 4; 221 props->max_mtu = out_mad->data[41] & 0xf; 222 props->active_mtu = out_mad->data[36] >> 4; 223 props->subnet_timeout = out_mad->data[51] & 0x1f; 224 props->max_vl_num = out_mad->data[37] >> 4; 225 props->init_type_reply = out_mad->data[41] >> 4; 226 227 /* Check if extended speeds (EDR/FDR/...) are supported */ 228 if (props->port_cap_flags & IB_PORT_EXTENDED_SPEEDS_SUP) { 229 ext_active_speed = out_mad->data[62] >> 4; 230 231 switch (ext_active_speed) { 232 case 1: 233 props->active_speed = IB_SPEED_FDR; 234 break; 235 case 2: 236 props->active_speed = IB_SPEED_EDR; 237 break; 238 } 239 } 240 241 /* If reported active speed is QDR, check if is FDR-10 */ 242 if (props->active_speed == IB_SPEED_QDR) { 243 init_query_mad(in_mad); 244 in_mad->attr_id = MLX4_ATTR_EXTENDED_PORT_INFO; 245 in_mad->attr_mod = cpu_to_be32(port); 246 247 err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port, 248 NULL, NULL, in_mad, out_mad); 249 if (err) 250 goto out; 251 252 /* Checking LinkSpeedActive for FDR-10 */ 253 if (out_mad->data[15] & 0x1) 254 props->active_speed = IB_SPEED_FDR10; 255 } 256 257 /* Avoid wrong speed value returned by FW if the IB link is down. */ 258 if (props->state == IB_PORT_DOWN) 259 props->active_speed = IB_SPEED_SDR; 260 261 out: 262 kfree(in_mad); 263 kfree(out_mad); 264 return err; 265 } 266 267 static u8 state_to_phys_state(enum ib_port_state state) 268 { 269 return state == IB_PORT_ACTIVE ? 5 : 3; 270 } 271 272 static int eth_link_query_port(struct ib_device *ibdev, u8 port, 273 struct ib_port_attr *props) 274 { 275 276 struct mlx4_ib_dev *mdev = to_mdev(ibdev); 277 struct mlx4_ib_iboe *iboe = &mdev->iboe; 278 struct net_device *ndev; 279 enum ib_mtu tmp; 280 struct mlx4_cmd_mailbox *mailbox; 281 int err = 0; 282 283 mailbox = mlx4_alloc_cmd_mailbox(mdev->dev); 284 if (IS_ERR(mailbox)) 285 return PTR_ERR(mailbox); 286 287 err = mlx4_cmd_box(mdev->dev, 0, mailbox->dma, port, 0, 288 MLX4_CMD_QUERY_PORT, MLX4_CMD_TIME_CLASS_B, 289 MLX4_CMD_WRAPPED); 290 if (err) 291 goto out; 292 293 props->active_width = (((u8 *)mailbox->buf)[5] == 0x40) ? 294 IB_WIDTH_4X : IB_WIDTH_1X; 295 props->active_speed = IB_SPEED_QDR; 296 props->port_cap_flags = IB_PORT_CM_SUP; 297 props->gid_tbl_len = mdev->dev->caps.gid_table_len[port]; 298 props->max_msg_sz = mdev->dev->caps.max_msg_sz; 299 props->pkey_tbl_len = 1; 300 props->max_mtu = IB_MTU_4096; 301 props->max_vl_num = 2; 302 props->state = IB_PORT_DOWN; 303 props->phys_state = state_to_phys_state(props->state); 304 props->active_mtu = IB_MTU_256; 305 spin_lock(&iboe->lock); 306 ndev = iboe->netdevs[port - 1]; 307 if (!ndev) 308 goto out_unlock; 309 310 tmp = iboe_get_mtu(ndev->mtu); 311 props->active_mtu = tmp ? min(props->max_mtu, tmp) : IB_MTU_256; 312 313 props->state = (netif_running(ndev) && netif_carrier_ok(ndev)) ? 314 IB_PORT_ACTIVE : IB_PORT_DOWN; 315 props->phys_state = state_to_phys_state(props->state); 316 out_unlock: 317 spin_unlock(&iboe->lock); 318 out: 319 mlx4_free_cmd_mailbox(mdev->dev, mailbox); 320 return err; 321 } 322 323 static int mlx4_ib_query_port(struct ib_device *ibdev, u8 port, 324 struct ib_port_attr *props) 325 { 326 int err; 327 328 memset(props, 0, sizeof *props); 329 330 err = mlx4_ib_port_link_layer(ibdev, port) == IB_LINK_LAYER_INFINIBAND ? 331 ib_link_query_port(ibdev, port, props) : 332 eth_link_query_port(ibdev, port, props); 333 334 return err; 335 } 336 337 static int __mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index, 338 union ib_gid *gid) 339 { 340 struct ib_smp *in_mad = NULL; 341 struct ib_smp *out_mad = NULL; 342 int err = -ENOMEM; 343 344 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); 345 out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL); 346 if (!in_mad || !out_mad) 347 goto out; 348 349 init_query_mad(in_mad); 350 in_mad->attr_id = IB_SMP_ATTR_PORT_INFO; 351 in_mad->attr_mod = cpu_to_be32(port); 352 353 err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, in_mad, out_mad); 354 if (err) 355 goto out; 356 357 memcpy(gid->raw, out_mad->data + 8, 8); 358 359 init_query_mad(in_mad); 360 in_mad->attr_id = IB_SMP_ATTR_GUID_INFO; 361 in_mad->attr_mod = cpu_to_be32(index / 8); 362 363 err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, in_mad, out_mad); 364 if (err) 365 goto out; 366 367 memcpy(gid->raw + 8, out_mad->data + (index % 8) * 8, 8); 368 369 out: 370 kfree(in_mad); 371 kfree(out_mad); 372 return err; 373 } 374 375 static int iboe_query_gid(struct ib_device *ibdev, u8 port, int index, 376 union ib_gid *gid) 377 { 378 struct mlx4_ib_dev *dev = to_mdev(ibdev); 379 380 *gid = dev->iboe.gid_table[port - 1][index]; 381 382 return 0; 383 } 384 385 static int mlx4_ib_query_gid(struct ib_device *ibdev, u8 port, int index, 386 union ib_gid *gid) 387 { 388 if (rdma_port_get_link_layer(ibdev, port) == IB_LINK_LAYER_INFINIBAND) 389 return __mlx4_ib_query_gid(ibdev, port, index, gid); 390 else 391 return iboe_query_gid(ibdev, port, index, gid); 392 } 393 394 static int mlx4_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, 395 u16 *pkey) 396 { 397 struct ib_smp *in_mad = NULL; 398 struct ib_smp *out_mad = NULL; 399 int err = -ENOMEM; 400 401 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); 402 out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL); 403 if (!in_mad || !out_mad) 404 goto out; 405 406 init_query_mad(in_mad); 407 in_mad->attr_id = IB_SMP_ATTR_PKEY_TABLE; 408 in_mad->attr_mod = cpu_to_be32(index / 32); 409 410 err = mlx4_MAD_IFC(to_mdev(ibdev), 1, 1, port, NULL, NULL, in_mad, out_mad); 411 if (err) 412 goto out; 413 414 *pkey = be16_to_cpu(((__be16 *) out_mad->data)[index % 32]); 415 416 out: 417 kfree(in_mad); 418 kfree(out_mad); 419 return err; 420 } 421 422 static int mlx4_ib_modify_device(struct ib_device *ibdev, int mask, 423 struct ib_device_modify *props) 424 { 425 struct mlx4_cmd_mailbox *mailbox; 426 427 if (mask & ~IB_DEVICE_MODIFY_NODE_DESC) 428 return -EOPNOTSUPP; 429 430 if (!(mask & IB_DEVICE_MODIFY_NODE_DESC)) 431 return 0; 432 433 spin_lock(&to_mdev(ibdev)->sm_lock); 434 memcpy(ibdev->node_desc, props->node_desc, 64); 435 spin_unlock(&to_mdev(ibdev)->sm_lock); 436 437 /* 438 * If possible, pass node desc to FW, so it can generate 439 * a 144 trap. If cmd fails, just ignore. 440 */ 441 mailbox = mlx4_alloc_cmd_mailbox(to_mdev(ibdev)->dev); 442 if (IS_ERR(mailbox)) 443 return 0; 444 445 memset(mailbox->buf, 0, 256); 446 memcpy(mailbox->buf, props->node_desc, 64); 447 mlx4_cmd(to_mdev(ibdev)->dev, mailbox->dma, 1, 0, 448 MLX4_CMD_SET_NODE, MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED); 449 450 mlx4_free_cmd_mailbox(to_mdev(ibdev)->dev, mailbox); 451 452 return 0; 453 } 454 455 static int mlx4_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_viols, 456 u32 cap_mask) 457 { 458 struct mlx4_cmd_mailbox *mailbox; 459 int err; 460 u8 is_eth = dev->dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH; 461 462 mailbox = mlx4_alloc_cmd_mailbox(dev->dev); 463 if (IS_ERR(mailbox)) 464 return PTR_ERR(mailbox); 465 466 memset(mailbox->buf, 0, 256); 467 468 if (dev->dev->flags & MLX4_FLAG_OLD_PORT_CMDS) { 469 *(u8 *) mailbox->buf = !!reset_qkey_viols << 6; 470 ((__be32 *) mailbox->buf)[2] = cpu_to_be32(cap_mask); 471 } else { 472 ((u8 *) mailbox->buf)[3] = !!reset_qkey_viols; 473 ((__be32 *) mailbox->buf)[1] = cpu_to_be32(cap_mask); 474 } 475 476 err = mlx4_cmd(dev->dev, mailbox->dma, port, is_eth, MLX4_CMD_SET_PORT, 477 MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE); 478 479 mlx4_free_cmd_mailbox(dev->dev, mailbox); 480 return err; 481 } 482 483 static int mlx4_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, 484 struct ib_port_modify *props) 485 { 486 struct ib_port_attr attr; 487 u32 cap_mask; 488 int err; 489 490 mutex_lock(&to_mdev(ibdev)->cap_mask_mutex); 491 492 err = mlx4_ib_query_port(ibdev, port, &attr); 493 if (err) 494 goto out; 495 496 cap_mask = (attr.port_cap_flags | props->set_port_cap_mask) & 497 ~props->clr_port_cap_mask; 498 499 err = mlx4_SET_PORT(to_mdev(ibdev), port, 500 !!(mask & IB_PORT_RESET_QKEY_CNTR), 501 cap_mask); 502 503 out: 504 mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex); 505 return err; 506 } 507 508 static struct ib_ucontext *mlx4_ib_alloc_ucontext(struct ib_device *ibdev, 509 struct ib_udata *udata) 510 { 511 struct mlx4_ib_dev *dev = to_mdev(ibdev); 512 struct mlx4_ib_ucontext *context; 513 struct mlx4_ib_alloc_ucontext_resp resp; 514 int err; 515 516 if (!dev->ib_active) 517 return ERR_PTR(-EAGAIN); 518 519 resp.qp_tab_size = dev->dev->caps.num_qps; 520 resp.bf_reg_size = dev->dev->caps.bf_reg_size; 521 resp.bf_regs_per_page = dev->dev->caps.bf_regs_per_page; 522 523 context = kmalloc(sizeof *context, GFP_KERNEL); 524 if (!context) 525 return ERR_PTR(-ENOMEM); 526 527 err = mlx4_uar_alloc(to_mdev(ibdev)->dev, &context->uar); 528 if (err) { 529 kfree(context); 530 return ERR_PTR(err); 531 } 532 533 INIT_LIST_HEAD(&context->db_page_list); 534 mutex_init(&context->db_page_mutex); 535 536 err = ib_copy_to_udata(udata, &resp, sizeof resp); 537 if (err) { 538 mlx4_uar_free(to_mdev(ibdev)->dev, &context->uar); 539 kfree(context); 540 return ERR_PTR(-EFAULT); 541 } 542 543 return &context->ibucontext; 544 } 545 546 static int mlx4_ib_dealloc_ucontext(struct ib_ucontext *ibcontext) 547 { 548 struct mlx4_ib_ucontext *context = to_mucontext(ibcontext); 549 550 mlx4_uar_free(to_mdev(ibcontext->device)->dev, &context->uar); 551 kfree(context); 552 553 return 0; 554 } 555 556 static int mlx4_ib_mmap(struct ib_ucontext *context, struct vm_area_struct *vma) 557 { 558 struct mlx4_ib_dev *dev = to_mdev(context->device); 559 560 if (vma->vm_end - vma->vm_start != PAGE_SIZE) 561 return -EINVAL; 562 563 if (vma->vm_pgoff == 0) { 564 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 565 566 if (io_remap_pfn_range(vma, vma->vm_start, 567 to_mucontext(context)->uar.pfn, 568 PAGE_SIZE, vma->vm_page_prot)) 569 return -EAGAIN; 570 } else if (vma->vm_pgoff == 1 && dev->dev->caps.bf_reg_size != 0) { 571 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); 572 573 if (io_remap_pfn_range(vma, vma->vm_start, 574 to_mucontext(context)->uar.pfn + 575 dev->dev->caps.num_uars, 576 PAGE_SIZE, vma->vm_page_prot)) 577 return -EAGAIN; 578 } else 579 return -EINVAL; 580 581 return 0; 582 } 583 584 static struct ib_pd *mlx4_ib_alloc_pd(struct ib_device *ibdev, 585 struct ib_ucontext *context, 586 struct ib_udata *udata) 587 { 588 struct mlx4_ib_pd *pd; 589 int err; 590 591 pd = kmalloc(sizeof *pd, GFP_KERNEL); 592 if (!pd) 593 return ERR_PTR(-ENOMEM); 594 595 err = mlx4_pd_alloc(to_mdev(ibdev)->dev, &pd->pdn); 596 if (err) { 597 kfree(pd); 598 return ERR_PTR(err); 599 } 600 601 if (context) 602 if (ib_copy_to_udata(udata, &pd->pdn, sizeof (__u32))) { 603 mlx4_pd_free(to_mdev(ibdev)->dev, pd->pdn); 604 kfree(pd); 605 return ERR_PTR(-EFAULT); 606 } 607 608 return &pd->ibpd; 609 } 610 611 static int mlx4_ib_dealloc_pd(struct ib_pd *pd) 612 { 613 mlx4_pd_free(to_mdev(pd->device)->dev, to_mpd(pd)->pdn); 614 kfree(pd); 615 616 return 0; 617 } 618 619 static struct ib_xrcd *mlx4_ib_alloc_xrcd(struct ib_device *ibdev, 620 struct ib_ucontext *context, 621 struct ib_udata *udata) 622 { 623 struct mlx4_ib_xrcd *xrcd; 624 int err; 625 626 if (!(to_mdev(ibdev)->dev->caps.flags & MLX4_DEV_CAP_FLAG_XRC)) 627 return ERR_PTR(-ENOSYS); 628 629 xrcd = kmalloc(sizeof *xrcd, GFP_KERNEL); 630 if (!xrcd) 631 return ERR_PTR(-ENOMEM); 632 633 err = mlx4_xrcd_alloc(to_mdev(ibdev)->dev, &xrcd->xrcdn); 634 if (err) 635 goto err1; 636 637 xrcd->pd = ib_alloc_pd(ibdev); 638 if (IS_ERR(xrcd->pd)) { 639 err = PTR_ERR(xrcd->pd); 640 goto err2; 641 } 642 643 xrcd->cq = ib_create_cq(ibdev, NULL, NULL, xrcd, 1, 0); 644 if (IS_ERR(xrcd->cq)) { 645 err = PTR_ERR(xrcd->cq); 646 goto err3; 647 } 648 649 return &xrcd->ibxrcd; 650 651 err3: 652 ib_dealloc_pd(xrcd->pd); 653 err2: 654 mlx4_xrcd_free(to_mdev(ibdev)->dev, xrcd->xrcdn); 655 err1: 656 kfree(xrcd); 657 return ERR_PTR(err); 658 } 659 660 static int mlx4_ib_dealloc_xrcd(struct ib_xrcd *xrcd) 661 { 662 ib_destroy_cq(to_mxrcd(xrcd)->cq); 663 ib_dealloc_pd(to_mxrcd(xrcd)->pd); 664 mlx4_xrcd_free(to_mdev(xrcd->device)->dev, to_mxrcd(xrcd)->xrcdn); 665 kfree(xrcd); 666 667 return 0; 668 } 669 670 static int add_gid_entry(struct ib_qp *ibqp, union ib_gid *gid) 671 { 672 struct mlx4_ib_qp *mqp = to_mqp(ibqp); 673 struct mlx4_ib_dev *mdev = to_mdev(ibqp->device); 674 struct mlx4_ib_gid_entry *ge; 675 676 ge = kzalloc(sizeof *ge, GFP_KERNEL); 677 if (!ge) 678 return -ENOMEM; 679 680 ge->gid = *gid; 681 if (mlx4_ib_add_mc(mdev, mqp, gid)) { 682 ge->port = mqp->port; 683 ge->added = 1; 684 } 685 686 mutex_lock(&mqp->mutex); 687 list_add_tail(&ge->list, &mqp->gid_list); 688 mutex_unlock(&mqp->mutex); 689 690 return 0; 691 } 692 693 int mlx4_ib_add_mc(struct mlx4_ib_dev *mdev, struct mlx4_ib_qp *mqp, 694 union ib_gid *gid) 695 { 696 u8 mac[6]; 697 struct net_device *ndev; 698 int ret = 0; 699 700 if (!mqp->port) 701 return 0; 702 703 spin_lock(&mdev->iboe.lock); 704 ndev = mdev->iboe.netdevs[mqp->port - 1]; 705 if (ndev) 706 dev_hold(ndev); 707 spin_unlock(&mdev->iboe.lock); 708 709 if (ndev) { 710 rdma_get_mcast_mac((struct in6_addr *)gid, mac); 711 rtnl_lock(); 712 dev_mc_add(mdev->iboe.netdevs[mqp->port - 1], mac); 713 ret = 1; 714 rtnl_unlock(); 715 dev_put(ndev); 716 } 717 718 return ret; 719 } 720 721 static int mlx4_ib_mcg_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) 722 { 723 int err; 724 struct mlx4_ib_dev *mdev = to_mdev(ibqp->device); 725 struct mlx4_ib_qp *mqp = to_mqp(ibqp); 726 727 err = mlx4_multicast_attach(mdev->dev, &mqp->mqp, gid->raw, 728 !!(mqp->flags & MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK), 729 MLX4_PROT_IB_IPV6); 730 if (err) 731 return err; 732 733 err = add_gid_entry(ibqp, gid); 734 if (err) 735 goto err_add; 736 737 return 0; 738 739 err_add: 740 mlx4_multicast_detach(mdev->dev, &mqp->mqp, gid->raw, MLX4_PROT_IB_IPV6); 741 return err; 742 } 743 744 static struct mlx4_ib_gid_entry *find_gid_entry(struct mlx4_ib_qp *qp, u8 *raw) 745 { 746 struct mlx4_ib_gid_entry *ge; 747 struct mlx4_ib_gid_entry *tmp; 748 struct mlx4_ib_gid_entry *ret = NULL; 749 750 list_for_each_entry_safe(ge, tmp, &qp->gid_list, list) { 751 if (!memcmp(raw, ge->gid.raw, 16)) { 752 ret = ge; 753 break; 754 } 755 } 756 757 return ret; 758 } 759 760 static int mlx4_ib_mcg_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) 761 { 762 int err; 763 struct mlx4_ib_dev *mdev = to_mdev(ibqp->device); 764 struct mlx4_ib_qp *mqp = to_mqp(ibqp); 765 u8 mac[6]; 766 struct net_device *ndev; 767 struct mlx4_ib_gid_entry *ge; 768 769 err = mlx4_multicast_detach(mdev->dev, 770 &mqp->mqp, gid->raw, MLX4_PROT_IB_IPV6); 771 if (err) 772 return err; 773 774 mutex_lock(&mqp->mutex); 775 ge = find_gid_entry(mqp, gid->raw); 776 if (ge) { 777 spin_lock(&mdev->iboe.lock); 778 ndev = ge->added ? mdev->iboe.netdevs[ge->port - 1] : NULL; 779 if (ndev) 780 dev_hold(ndev); 781 spin_unlock(&mdev->iboe.lock); 782 rdma_get_mcast_mac((struct in6_addr *)gid, mac); 783 if (ndev) { 784 rtnl_lock(); 785 dev_mc_del(mdev->iboe.netdevs[ge->port - 1], mac); 786 rtnl_unlock(); 787 dev_put(ndev); 788 } 789 list_del(&ge->list); 790 kfree(ge); 791 } else 792 printk(KERN_WARNING "could not find mgid entry\n"); 793 794 mutex_unlock(&mqp->mutex); 795 796 return 0; 797 } 798 799 static int init_node_data(struct mlx4_ib_dev *dev) 800 { 801 struct ib_smp *in_mad = NULL; 802 struct ib_smp *out_mad = NULL; 803 int err = -ENOMEM; 804 805 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); 806 out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL); 807 if (!in_mad || !out_mad) 808 goto out; 809 810 init_query_mad(in_mad); 811 in_mad->attr_id = IB_SMP_ATTR_NODE_DESC; 812 813 err = mlx4_MAD_IFC(dev, 1, 1, 1, NULL, NULL, in_mad, out_mad); 814 if (err) 815 goto out; 816 817 memcpy(dev->ib_dev.node_desc, out_mad->data, 64); 818 819 in_mad->attr_id = IB_SMP_ATTR_NODE_INFO; 820 821 err = mlx4_MAD_IFC(dev, 1, 1, 1, NULL, NULL, in_mad, out_mad); 822 if (err) 823 goto out; 824 825 memcpy(&dev->ib_dev.node_guid, out_mad->data + 12, 8); 826 827 out: 828 kfree(in_mad); 829 kfree(out_mad); 830 return err; 831 } 832 833 static ssize_t show_hca(struct device *device, struct device_attribute *attr, 834 char *buf) 835 { 836 struct mlx4_ib_dev *dev = 837 container_of(device, struct mlx4_ib_dev, ib_dev.dev); 838 return sprintf(buf, "MT%d\n", dev->dev->pdev->device); 839 } 840 841 static ssize_t show_fw_ver(struct device *device, struct device_attribute *attr, 842 char *buf) 843 { 844 struct mlx4_ib_dev *dev = 845 container_of(device, struct mlx4_ib_dev, ib_dev.dev); 846 return sprintf(buf, "%d.%d.%d\n", (int) (dev->dev->caps.fw_ver >> 32), 847 (int) (dev->dev->caps.fw_ver >> 16) & 0xffff, 848 (int) dev->dev->caps.fw_ver & 0xffff); 849 } 850 851 static ssize_t show_rev(struct device *device, struct device_attribute *attr, 852 char *buf) 853 { 854 struct mlx4_ib_dev *dev = 855 container_of(device, struct mlx4_ib_dev, ib_dev.dev); 856 return sprintf(buf, "%x\n", dev->dev->rev_id); 857 } 858 859 static ssize_t show_board(struct device *device, struct device_attribute *attr, 860 char *buf) 861 { 862 struct mlx4_ib_dev *dev = 863 container_of(device, struct mlx4_ib_dev, ib_dev.dev); 864 return sprintf(buf, "%.*s\n", MLX4_BOARD_ID_LEN, 865 dev->dev->board_id); 866 } 867 868 static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL); 869 static DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL); 870 static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL); 871 static DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL); 872 873 static struct device_attribute *mlx4_class_attributes[] = { 874 &dev_attr_hw_rev, 875 &dev_attr_fw_ver, 876 &dev_attr_hca_type, 877 &dev_attr_board_id 878 }; 879 880 static void mlx4_addrconf_ifid_eui48(u8 *eui, u16 vlan_id, struct net_device *dev) 881 { 882 memcpy(eui, dev->dev_addr, 3); 883 memcpy(eui + 5, dev->dev_addr + 3, 3); 884 if (vlan_id < 0x1000) { 885 eui[3] = vlan_id >> 8; 886 eui[4] = vlan_id & 0xff; 887 } else { 888 eui[3] = 0xff; 889 eui[4] = 0xfe; 890 } 891 eui[0] ^= 2; 892 } 893 894 static void update_gids_task(struct work_struct *work) 895 { 896 struct update_gid_work *gw = container_of(work, struct update_gid_work, work); 897 struct mlx4_cmd_mailbox *mailbox; 898 union ib_gid *gids; 899 int err; 900 struct mlx4_dev *dev = gw->dev->dev; 901 struct ib_event event; 902 903 mailbox = mlx4_alloc_cmd_mailbox(dev); 904 if (IS_ERR(mailbox)) { 905 printk(KERN_WARNING "update gid table failed %ld\n", PTR_ERR(mailbox)); 906 return; 907 } 908 909 gids = mailbox->buf; 910 memcpy(gids, gw->gids, sizeof gw->gids); 911 912 err = mlx4_cmd(dev, mailbox->dma, MLX4_SET_PORT_GID_TABLE << 8 | gw->port, 913 1, MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B, 914 MLX4_CMD_NATIVE); 915 if (err) 916 printk(KERN_WARNING "set port command failed\n"); 917 else { 918 memcpy(gw->dev->iboe.gid_table[gw->port - 1], gw->gids, sizeof gw->gids); 919 event.device = &gw->dev->ib_dev; 920 event.element.port_num = gw->port; 921 event.event = IB_EVENT_GID_CHANGE; 922 ib_dispatch_event(&event); 923 } 924 925 mlx4_free_cmd_mailbox(dev, mailbox); 926 kfree(gw); 927 } 928 929 static int update_ipv6_gids(struct mlx4_ib_dev *dev, int port, int clear) 930 { 931 struct net_device *ndev = dev->iboe.netdevs[port - 1]; 932 struct update_gid_work *work; 933 struct net_device *tmp; 934 int i; 935 u8 *hits; 936 int ret; 937 union ib_gid gid; 938 int free; 939 int found; 940 int need_update = 0; 941 u16 vid; 942 943 work = kzalloc(sizeof *work, GFP_ATOMIC); 944 if (!work) 945 return -ENOMEM; 946 947 hits = kzalloc(128, GFP_ATOMIC); 948 if (!hits) { 949 ret = -ENOMEM; 950 goto out; 951 } 952 953 rcu_read_lock(); 954 for_each_netdev_rcu(&init_net, tmp) { 955 if (ndev && (tmp == ndev || rdma_vlan_dev_real_dev(tmp) == ndev)) { 956 gid.global.subnet_prefix = cpu_to_be64(0xfe80000000000000LL); 957 vid = rdma_vlan_dev_vlan_id(tmp); 958 mlx4_addrconf_ifid_eui48(&gid.raw[8], vid, ndev); 959 found = 0; 960 free = -1; 961 for (i = 0; i < 128; ++i) { 962 if (free < 0 && 963 !memcmp(&dev->iboe.gid_table[port - 1][i], &zgid, sizeof zgid)) 964 free = i; 965 if (!memcmp(&dev->iboe.gid_table[port - 1][i], &gid, sizeof gid)) { 966 hits[i] = 1; 967 found = 1; 968 break; 969 } 970 } 971 972 if (!found) { 973 if (tmp == ndev && 974 (memcmp(&dev->iboe.gid_table[port - 1][0], 975 &gid, sizeof gid) || 976 !memcmp(&dev->iboe.gid_table[port - 1][0], 977 &zgid, sizeof gid))) { 978 dev->iboe.gid_table[port - 1][0] = gid; 979 ++need_update; 980 hits[0] = 1; 981 } else if (free >= 0) { 982 dev->iboe.gid_table[port - 1][free] = gid; 983 hits[free] = 1; 984 ++need_update; 985 } 986 } 987 } 988 } 989 rcu_read_unlock(); 990 991 for (i = 0; i < 128; ++i) 992 if (!hits[i]) { 993 if (memcmp(&dev->iboe.gid_table[port - 1][i], &zgid, sizeof zgid)) 994 ++need_update; 995 dev->iboe.gid_table[port - 1][i] = zgid; 996 } 997 998 if (need_update) { 999 memcpy(work->gids, dev->iboe.gid_table[port - 1], sizeof work->gids); 1000 INIT_WORK(&work->work, update_gids_task); 1001 work->port = port; 1002 work->dev = dev; 1003 queue_work(wq, &work->work); 1004 } else 1005 kfree(work); 1006 1007 kfree(hits); 1008 return 0; 1009 1010 out: 1011 kfree(work); 1012 return ret; 1013 } 1014 1015 static void handle_en_event(struct mlx4_ib_dev *dev, int port, unsigned long event) 1016 { 1017 switch (event) { 1018 case NETDEV_UP: 1019 case NETDEV_CHANGEADDR: 1020 update_ipv6_gids(dev, port, 0); 1021 break; 1022 1023 case NETDEV_DOWN: 1024 update_ipv6_gids(dev, port, 1); 1025 dev->iboe.netdevs[port - 1] = NULL; 1026 } 1027 } 1028 1029 static void netdev_added(struct mlx4_ib_dev *dev, int port) 1030 { 1031 update_ipv6_gids(dev, port, 0); 1032 } 1033 1034 static void netdev_removed(struct mlx4_ib_dev *dev, int port) 1035 { 1036 update_ipv6_gids(dev, port, 1); 1037 } 1038 1039 static int mlx4_ib_netdev_event(struct notifier_block *this, unsigned long event, 1040 void *ptr) 1041 { 1042 struct net_device *dev = ptr; 1043 struct mlx4_ib_dev *ibdev; 1044 struct net_device *oldnd; 1045 struct mlx4_ib_iboe *iboe; 1046 int port; 1047 1048 if (!net_eq(dev_net(dev), &init_net)) 1049 return NOTIFY_DONE; 1050 1051 ibdev = container_of(this, struct mlx4_ib_dev, iboe.nb); 1052 iboe = &ibdev->iboe; 1053 1054 spin_lock(&iboe->lock); 1055 mlx4_foreach_ib_transport_port(port, ibdev->dev) { 1056 oldnd = iboe->netdevs[port - 1]; 1057 iboe->netdevs[port - 1] = 1058 mlx4_get_protocol_dev(ibdev->dev, MLX4_PROT_ETH, port); 1059 if (oldnd != iboe->netdevs[port - 1]) { 1060 if (iboe->netdevs[port - 1]) 1061 netdev_added(ibdev, port); 1062 else 1063 netdev_removed(ibdev, port); 1064 } 1065 } 1066 1067 if (dev == iboe->netdevs[0] || 1068 (iboe->netdevs[0] && rdma_vlan_dev_real_dev(dev) == iboe->netdevs[0])) 1069 handle_en_event(ibdev, 1, event); 1070 else if (dev == iboe->netdevs[1] 1071 || (iboe->netdevs[1] && rdma_vlan_dev_real_dev(dev) == iboe->netdevs[1])) 1072 handle_en_event(ibdev, 2, event); 1073 1074 spin_unlock(&iboe->lock); 1075 1076 return NOTIFY_DONE; 1077 } 1078 1079 static void *mlx4_ib_add(struct mlx4_dev *dev) 1080 { 1081 struct mlx4_ib_dev *ibdev; 1082 int num_ports = 0; 1083 int i; 1084 int err; 1085 struct mlx4_ib_iboe *iboe; 1086 1087 printk_once(KERN_INFO "%s", mlx4_ib_version); 1088 1089 if (mlx4_is_mfunc(dev)) { 1090 printk(KERN_WARNING "IB not yet supported in SRIOV\n"); 1091 return NULL; 1092 } 1093 1094 mlx4_foreach_ib_transport_port(i, dev) 1095 num_ports++; 1096 1097 /* No point in registering a device with no ports... */ 1098 if (num_ports == 0) 1099 return NULL; 1100 1101 ibdev = (struct mlx4_ib_dev *) ib_alloc_device(sizeof *ibdev); 1102 if (!ibdev) { 1103 dev_err(&dev->pdev->dev, "Device struct alloc failed\n"); 1104 return NULL; 1105 } 1106 1107 iboe = &ibdev->iboe; 1108 1109 if (mlx4_pd_alloc(dev, &ibdev->priv_pdn)) 1110 goto err_dealloc; 1111 1112 if (mlx4_uar_alloc(dev, &ibdev->priv_uar)) 1113 goto err_pd; 1114 1115 ibdev->uar_map = ioremap((phys_addr_t) ibdev->priv_uar.pfn << PAGE_SHIFT, 1116 PAGE_SIZE); 1117 if (!ibdev->uar_map) 1118 goto err_uar; 1119 MLX4_INIT_DOORBELL_LOCK(&ibdev->uar_lock); 1120 1121 ibdev->dev = dev; 1122 1123 strlcpy(ibdev->ib_dev.name, "mlx4_%d", IB_DEVICE_NAME_MAX); 1124 ibdev->ib_dev.owner = THIS_MODULE; 1125 ibdev->ib_dev.node_type = RDMA_NODE_IB_CA; 1126 ibdev->ib_dev.local_dma_lkey = dev->caps.reserved_lkey; 1127 ibdev->num_ports = num_ports; 1128 ibdev->ib_dev.phys_port_cnt = ibdev->num_ports; 1129 ibdev->ib_dev.num_comp_vectors = dev->caps.num_comp_vectors; 1130 ibdev->ib_dev.dma_device = &dev->pdev->dev; 1131 1132 ibdev->ib_dev.uverbs_abi_ver = MLX4_IB_UVERBS_ABI_VERSION; 1133 ibdev->ib_dev.uverbs_cmd_mask = 1134 (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) | 1135 (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) | 1136 (1ull << IB_USER_VERBS_CMD_QUERY_PORT) | 1137 (1ull << IB_USER_VERBS_CMD_ALLOC_PD) | 1138 (1ull << IB_USER_VERBS_CMD_DEALLOC_PD) | 1139 (1ull << IB_USER_VERBS_CMD_REG_MR) | 1140 (1ull << IB_USER_VERBS_CMD_DEREG_MR) | 1141 (1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL) | 1142 (1ull << IB_USER_VERBS_CMD_CREATE_CQ) | 1143 (1ull << IB_USER_VERBS_CMD_RESIZE_CQ) | 1144 (1ull << IB_USER_VERBS_CMD_DESTROY_CQ) | 1145 (1ull << IB_USER_VERBS_CMD_CREATE_QP) | 1146 (1ull << IB_USER_VERBS_CMD_MODIFY_QP) | 1147 (1ull << IB_USER_VERBS_CMD_QUERY_QP) | 1148 (1ull << IB_USER_VERBS_CMD_DESTROY_QP) | 1149 (1ull << IB_USER_VERBS_CMD_ATTACH_MCAST) | 1150 (1ull << IB_USER_VERBS_CMD_DETACH_MCAST) | 1151 (1ull << IB_USER_VERBS_CMD_CREATE_SRQ) | 1152 (1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) | 1153 (1ull << IB_USER_VERBS_CMD_QUERY_SRQ) | 1154 (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) | 1155 (1ull << IB_USER_VERBS_CMD_CREATE_XSRQ) | 1156 (1ull << IB_USER_VERBS_CMD_OPEN_QP); 1157 1158 ibdev->ib_dev.query_device = mlx4_ib_query_device; 1159 ibdev->ib_dev.query_port = mlx4_ib_query_port; 1160 ibdev->ib_dev.get_link_layer = mlx4_ib_port_link_layer; 1161 ibdev->ib_dev.query_gid = mlx4_ib_query_gid; 1162 ibdev->ib_dev.query_pkey = mlx4_ib_query_pkey; 1163 ibdev->ib_dev.modify_device = mlx4_ib_modify_device; 1164 ibdev->ib_dev.modify_port = mlx4_ib_modify_port; 1165 ibdev->ib_dev.alloc_ucontext = mlx4_ib_alloc_ucontext; 1166 ibdev->ib_dev.dealloc_ucontext = mlx4_ib_dealloc_ucontext; 1167 ibdev->ib_dev.mmap = mlx4_ib_mmap; 1168 ibdev->ib_dev.alloc_pd = mlx4_ib_alloc_pd; 1169 ibdev->ib_dev.dealloc_pd = mlx4_ib_dealloc_pd; 1170 ibdev->ib_dev.create_ah = mlx4_ib_create_ah; 1171 ibdev->ib_dev.query_ah = mlx4_ib_query_ah; 1172 ibdev->ib_dev.destroy_ah = mlx4_ib_destroy_ah; 1173 ibdev->ib_dev.create_srq = mlx4_ib_create_srq; 1174 ibdev->ib_dev.modify_srq = mlx4_ib_modify_srq; 1175 ibdev->ib_dev.query_srq = mlx4_ib_query_srq; 1176 ibdev->ib_dev.destroy_srq = mlx4_ib_destroy_srq; 1177 ibdev->ib_dev.post_srq_recv = mlx4_ib_post_srq_recv; 1178 ibdev->ib_dev.create_qp = mlx4_ib_create_qp; 1179 ibdev->ib_dev.modify_qp = mlx4_ib_modify_qp; 1180 ibdev->ib_dev.query_qp = mlx4_ib_query_qp; 1181 ibdev->ib_dev.destroy_qp = mlx4_ib_destroy_qp; 1182 ibdev->ib_dev.post_send = mlx4_ib_post_send; 1183 ibdev->ib_dev.post_recv = mlx4_ib_post_recv; 1184 ibdev->ib_dev.create_cq = mlx4_ib_create_cq; 1185 ibdev->ib_dev.modify_cq = mlx4_ib_modify_cq; 1186 ibdev->ib_dev.resize_cq = mlx4_ib_resize_cq; 1187 ibdev->ib_dev.destroy_cq = mlx4_ib_destroy_cq; 1188 ibdev->ib_dev.poll_cq = mlx4_ib_poll_cq; 1189 ibdev->ib_dev.req_notify_cq = mlx4_ib_arm_cq; 1190 ibdev->ib_dev.get_dma_mr = mlx4_ib_get_dma_mr; 1191 ibdev->ib_dev.reg_user_mr = mlx4_ib_reg_user_mr; 1192 ibdev->ib_dev.dereg_mr = mlx4_ib_dereg_mr; 1193 ibdev->ib_dev.alloc_fast_reg_mr = mlx4_ib_alloc_fast_reg_mr; 1194 ibdev->ib_dev.alloc_fast_reg_page_list = mlx4_ib_alloc_fast_reg_page_list; 1195 ibdev->ib_dev.free_fast_reg_page_list = mlx4_ib_free_fast_reg_page_list; 1196 ibdev->ib_dev.attach_mcast = mlx4_ib_mcg_attach; 1197 ibdev->ib_dev.detach_mcast = mlx4_ib_mcg_detach; 1198 ibdev->ib_dev.process_mad = mlx4_ib_process_mad; 1199 1200 ibdev->ib_dev.alloc_fmr = mlx4_ib_fmr_alloc; 1201 ibdev->ib_dev.map_phys_fmr = mlx4_ib_map_phys_fmr; 1202 ibdev->ib_dev.unmap_fmr = mlx4_ib_unmap_fmr; 1203 ibdev->ib_dev.dealloc_fmr = mlx4_ib_fmr_dealloc; 1204 1205 if (dev->caps.flags & MLX4_DEV_CAP_FLAG_XRC) { 1206 ibdev->ib_dev.alloc_xrcd = mlx4_ib_alloc_xrcd; 1207 ibdev->ib_dev.dealloc_xrcd = mlx4_ib_dealloc_xrcd; 1208 ibdev->ib_dev.uverbs_cmd_mask |= 1209 (1ull << IB_USER_VERBS_CMD_OPEN_XRCD) | 1210 (1ull << IB_USER_VERBS_CMD_CLOSE_XRCD); 1211 } 1212 1213 spin_lock_init(&iboe->lock); 1214 1215 if (init_node_data(ibdev)) 1216 goto err_map; 1217 1218 for (i = 0; i < ibdev->num_ports; ++i) { 1219 if (mlx4_ib_port_link_layer(&ibdev->ib_dev, i + 1) == 1220 IB_LINK_LAYER_ETHERNET) { 1221 err = mlx4_counter_alloc(ibdev->dev, &ibdev->counters[i]); 1222 if (err) 1223 ibdev->counters[i] = -1; 1224 } else 1225 ibdev->counters[i] = -1; 1226 } 1227 1228 spin_lock_init(&ibdev->sm_lock); 1229 mutex_init(&ibdev->cap_mask_mutex); 1230 1231 if (ib_register_device(&ibdev->ib_dev, NULL)) 1232 goto err_counter; 1233 1234 if (mlx4_ib_mad_init(ibdev)) 1235 goto err_reg; 1236 1237 if (dev->caps.flags & MLX4_DEV_CAP_FLAG_IBOE && !iboe->nb.notifier_call) { 1238 iboe->nb.notifier_call = mlx4_ib_netdev_event; 1239 err = register_netdevice_notifier(&iboe->nb); 1240 if (err) 1241 goto err_reg; 1242 } 1243 1244 for (i = 0; i < ARRAY_SIZE(mlx4_class_attributes); ++i) { 1245 if (device_create_file(&ibdev->ib_dev.dev, 1246 mlx4_class_attributes[i])) 1247 goto err_notif; 1248 } 1249 1250 ibdev->ib_active = true; 1251 1252 return ibdev; 1253 1254 err_notif: 1255 if (unregister_netdevice_notifier(&ibdev->iboe.nb)) 1256 printk(KERN_WARNING "failure unregistering notifier\n"); 1257 flush_workqueue(wq); 1258 1259 err_reg: 1260 ib_unregister_device(&ibdev->ib_dev); 1261 1262 err_counter: 1263 for (; i; --i) 1264 if (ibdev->counters[i - 1] != -1) 1265 mlx4_counter_free(ibdev->dev, ibdev->counters[i - 1]); 1266 1267 err_map: 1268 iounmap(ibdev->uar_map); 1269 1270 err_uar: 1271 mlx4_uar_free(dev, &ibdev->priv_uar); 1272 1273 err_pd: 1274 mlx4_pd_free(dev, ibdev->priv_pdn); 1275 1276 err_dealloc: 1277 ib_dealloc_device(&ibdev->ib_dev); 1278 1279 return NULL; 1280 } 1281 1282 static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr) 1283 { 1284 struct mlx4_ib_dev *ibdev = ibdev_ptr; 1285 int p; 1286 1287 mlx4_ib_mad_cleanup(ibdev); 1288 ib_unregister_device(&ibdev->ib_dev); 1289 if (ibdev->iboe.nb.notifier_call) { 1290 if (unregister_netdevice_notifier(&ibdev->iboe.nb)) 1291 printk(KERN_WARNING "failure unregistering notifier\n"); 1292 ibdev->iboe.nb.notifier_call = NULL; 1293 } 1294 iounmap(ibdev->uar_map); 1295 for (p = 0; p < ibdev->num_ports; ++p) 1296 if (ibdev->counters[p] != -1) 1297 mlx4_counter_free(ibdev->dev, ibdev->counters[p]); 1298 mlx4_foreach_port(p, dev, MLX4_PORT_TYPE_IB) 1299 mlx4_CLOSE_PORT(dev, p); 1300 1301 mlx4_uar_free(dev, &ibdev->priv_uar); 1302 mlx4_pd_free(dev, ibdev->priv_pdn); 1303 ib_dealloc_device(&ibdev->ib_dev); 1304 } 1305 1306 static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr, 1307 enum mlx4_dev_event event, int port) 1308 { 1309 struct ib_event ibev; 1310 struct mlx4_ib_dev *ibdev = to_mdev((struct ib_device *) ibdev_ptr); 1311 1312 if (port > ibdev->num_ports) 1313 return; 1314 1315 switch (event) { 1316 case MLX4_DEV_EVENT_PORT_UP: 1317 ibev.event = IB_EVENT_PORT_ACTIVE; 1318 break; 1319 1320 case MLX4_DEV_EVENT_PORT_DOWN: 1321 ibev.event = IB_EVENT_PORT_ERR; 1322 break; 1323 1324 case MLX4_DEV_EVENT_CATASTROPHIC_ERROR: 1325 ibdev->ib_active = false; 1326 ibev.event = IB_EVENT_DEVICE_FATAL; 1327 break; 1328 1329 default: 1330 return; 1331 } 1332 1333 ibev.device = ibdev_ptr; 1334 ibev.element.port_num = port; 1335 1336 ib_dispatch_event(&ibev); 1337 } 1338 1339 static struct mlx4_interface mlx4_ib_interface = { 1340 .add = mlx4_ib_add, 1341 .remove = mlx4_ib_remove, 1342 .event = mlx4_ib_event, 1343 .protocol = MLX4_PROT_IB_IPV6 1344 }; 1345 1346 static int __init mlx4_ib_init(void) 1347 { 1348 int err; 1349 1350 wq = create_singlethread_workqueue("mlx4_ib"); 1351 if (!wq) 1352 return -ENOMEM; 1353 1354 err = mlx4_register_interface(&mlx4_ib_interface); 1355 if (err) { 1356 destroy_workqueue(wq); 1357 return err; 1358 } 1359 1360 return 0; 1361 } 1362 1363 static void __exit mlx4_ib_cleanup(void) 1364 { 1365 mlx4_unregister_interface(&mlx4_ib_interface); 1366 destroy_workqueue(wq); 1367 } 1368 1369 module_init(mlx4_ib_init); 1370 module_exit(mlx4_ib_cleanup); 1371