int mthca_create_agents(struct mthca_dev *dev) { struct ib_mad_agent *agent; int p, q; spin_lock_init(&dev->sm_lock); for (p = 0; p < dev->limits.num_ports; ++p) for (q = 0; q <= 1; ++q) { agent = ib_register_mad_agent(&dev->ib_dev, p + 1, q ? IB_QPT_GSI : IB_QPT_SMI, NULL, 0, send_handler, NULL, NULL); if (IS_ERR(agent)) goto err; dev->send_agent[p][q] = agent; } return 0; err: for (p = 0; p < dev->limits.num_ports; ++p) for (q = 0; q <= 1; ++q) if (dev->send_agent[p][q]) ib_unregister_mad_agent(dev->send_agent[p][q]); return PTR_ERR(agent); }
int mlx4_ib_mad_init(struct mlx4_ib_dev *dev) { struct ib_mad_agent *agent; int p, q; int ret; enum rdma_link_layer ll; for (p = 0; p < dev->num_ports; ++p) { ll = rdma_port_get_link_layer(&dev->ib_dev, p + 1); for (q = 0; q <= 1; ++q) { if (ll == IB_LINK_LAYER_INFINIBAND) { agent = ib_register_mad_agent(&dev->ib_dev, p + 1, q ? IB_QPT_GSI : IB_QPT_SMI, NULL, 0, send_handler, NULL, NULL); if (IS_ERR(agent)) { ret = PTR_ERR(agent); goto err; } dev->send_agent[p][q] = agent; } else dev->send_agent[p][q] = NULL; } } return 0; err: for (p = 0; p < dev->num_ports; ++p) for (q = 0; q <= 1; ++q) if (dev->send_agent[p][q]) ib_unregister_mad_agent(dev->send_agent[p][q]); return ret; }
int mlx4_ib_mad_init(struct mlx4_ib_dev *dev) { struct ib_mad_agent *agent; int p, q; int ret; for (p = 0; p < dev->num_ports; ++p) for (q = 0; q <= 1; ++q) { agent = ib_register_mad_agent(&dev->ib_dev, p + 1, q ? IB_QPT_GSI : IB_QPT_SMI, NULL, 0, send_handler, NULL, NULL); if (IS_ERR(agent)) { ret = PTR_ERR(agent); goto err; } dev->send_agent[p][q] = agent; } return 0; err: for (p = 0; p < dev->num_ports; ++p) for (q = 0; q <= 1; ++q) if (dev->send_agent[p][q]) ib_unregister_mad_agent(dev->send_agent[p][q]); return ret; }
void mlx4_ib_mad_cleanup(struct mlx4_ib_dev *dev) { struct ib_mad_agent *agent; int p, q; for (p = 0; p < dev->num_ports; ++p) { for (q = 0; q <= 1; ++q) { agent = dev->send_agent[p][q]; dev->send_agent[p][q] = NULL; ib_unregister_mad_agent(agent); } if (dev->sm_ah[p]) ib_destroy_ah(dev->sm_ah[p]); } }
void __devexit mthca_free_agents(struct mthca_dev *dev) { struct ib_mad_agent *agent; int p, q; for (p = 0; p < dev->limits.num_ports; ++p) { for (q = 0; q <= 1; ++q) { agent = dev->send_agent[p][q]; dev->send_agent[p][q] = NULL; ib_unregister_mad_agent(agent); } if (dev->sm_ah[p]) ib_destroy_ah(dev->sm_ah[p]); } }
void mthca_free_agents(struct mthca_dev *dev) { struct ib_mad_agent *agent; int p, q; for (p = 0; p < dev->limits.num_ports; ++p) { for (q = 0; q <= 1; ++q) { agent = dev->send_agent[p][q]; dev->send_agent[p][q] = NULL; ib_unregister_mad_agent(agent); } if (dev->sm_ah[p]) rdma_destroy_ah(dev->sm_ah[p], RDMA_DESTROY_AH_SLEEPABLE); } }
int mthca_create_agents(struct mthca_dev *dev) { struct ib_mad_agent *agent; int p, q; int ret; spin_lock_init(&dev->sm_lock); for (p = 0; p < dev->limits.num_ports; ++p) for (q = 0; q <= 1; ++q) { agent = ib_register_mad_agent(&dev->ib_dev, p + 1, q ? IB_QPT_GSI : IB_QPT_SMI, NULL, 0, send_handler, NULL, NULL); if (IS_ERR(agent)) { ret = PTR_ERR(agent); goto err; } dev->send_agent[p][q] = agent; } for (p = 1; p <= dev->limits.num_ports; ++p) { ret = mthca_update_rate(dev, p); if (ret) { mthca_err(dev, "Failed to obtain port %d rate." " aborting.\n", p); goto err; } } return 0; err: for (p = 0; p < dev->limits.num_ports; ++p) for (q = 0; q <= 1; ++q) if (dev->send_agent[p][q]) ib_unregister_mad_agent(dev->send_agent[p][q]); return ret; }
/** * rvt_create_mad_agents - create mad agents * @rdi: rvt dev struct * * If driver needs to be notified of mad agent creation then call back * * Return 0 on success */ int rvt_create_mad_agents(struct rvt_dev_info *rdi) { struct ib_mad_agent *agent; struct rvt_ibport *rvp; int p; int ret; for (p = 0; p < rdi->dparms.nports; p++) { rvp = rdi->ports[p]; agent = ib_register_mad_agent(&rdi->ibdev, p + 1, IB_QPT_SMI, NULL, 0, rvt_send_mad_handler, NULL, NULL, 0); if (IS_ERR(agent)) { ret = PTR_ERR(agent); goto err; } rvp->send_agent = agent; if (rdi->driver_f.notify_create_mad_agent) rdi->driver_f.notify_create_mad_agent(rdi, p); } return 0; err: for (p = 0; p < rdi->dparms.nports; p++) { rvp = rdi->ports[p]; if (rvp->send_agent) { agent = rvp->send_agent; rvp->send_agent = NULL; ib_unregister_mad_agent(agent); if (rdi->driver_f.notify_free_mad_agent) rdi->driver_f.notify_free_mad_agent(rdi, p); } } return ret; }
/** * rvt_free_mad_agents - free up mad agents * @rdi: rvt dev struct * * If driver needs notification of mad agent removal make the call back */ void rvt_free_mad_agents(struct rvt_dev_info *rdi) { struct ib_mad_agent *agent; struct rvt_ibport *rvp; int p; for (p = 0; p < rdi->dparms.nports; p++) { rvp = rdi->ports[p]; if (rvp->send_agent) { agent = rvp->send_agent; rvp->send_agent = NULL; ib_unregister_mad_agent(agent); } if (rvp->sm_ah) { ib_destroy_ah(&rvp->sm_ah->ibah); rvp->sm_ah = NULL; } if (rdi->driver_f.notify_free_mad_agent) rdi->driver_f.notify_free_mad_agent(rdi, p); } }