MTHCA_VENDOR_CLASS2 = 0xa
};
-static int mthca_update_rate(struct mthca_dev *dev, u8 port_num)
-{
- struct ib_port_attr *tprops = NULL;
- int ret;
-
- tprops = kmalloc(sizeof *tprops, GFP_KERNEL);
- if (!tprops)
- return -ENOMEM;
-
- ret = ib_query_port(&dev->ib_dev, port_num, tprops);
- if (ret) {
- printk(KERN_WARNING "ib_query_port failed (%d) for %s port %d\n",
- ret, dev->ib_dev.name, port_num);
- goto out;
- }
-
- dev->rate[port_num - 1] = tprops->active_speed *
- ib_width_enum_to_int(tprops->active_width);
-
-out:
- kfree(tprops);
- return ret;
-}
-
static void update_sm_ah(struct mthca_dev *dev,
u8 port_num, u16 lid, u8 sl)
{
mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) &&
mad->mad_hdr.method == IB_MGMT_METHOD_SET) {
if (mad->mad_hdr.attr_id == IB_SMP_ATTR_PORT_INFO) {
- struct ib_port_info *pinfo =
- (struct ib_port_info *) ((struct ib_smp *) mad)->data;
-
- mthca_update_rate(to_mdev(ibdev), port_num);
update_sm_ah(to_mdev(ibdev), port_num,
- be16_to_cpu(pinfo->sm_lid),
- pinfo->neighbormtu_mastersmsl & 0xf);
+ be16_to_cpup((__be16 *) (mad->data + 58)),
+ (*(u8 *) (mad->data + 76)) & 0xf);
event.device = ibdev;
+ event.event = IB_EVENT_LID_CHANGE;
event.element.port_num = port_num;
-
- if(pinfo->clientrereg_resv_subnetto & 0x80)
- event.event = IB_EVENT_CLIENT_REREGISTER;
- else
- event.event = IB_EVENT_LID_CHANGE;
-
ib_dispatch_event(&event);
}
}
}
-static void node_desc_override(struct ib_device *dev,
- struct ib_mad *mad)
-{
- if ((mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED ||
- mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) &&
- mad->mad_hdr.method == IB_MGMT_METHOD_GET_RESP &&
- mad->mad_hdr.attr_id == IB_SMP_ATTR_NODE_DESC) {
- mutex_lock(&to_mdev(dev)->cap_mask_mutex);
- memcpy(((struct ib_smp *) mad)->data, dev->node_desc, 64);
- mutex_unlock(&to_mdev(dev)->cap_mask_mutex);
- }
-}
-
static void forward_trap(struct mthca_dev *dev,
u8 port_num,
struct ib_mad *mad)
return IB_MAD_RESULT_FAILURE;
}
- if (!out_mad->mad_hdr.status) {
+ if (!out_mad->mad_hdr.status)
smp_snoop(ibdev, port_num, in_mad);
- node_desc_override(ibdev, out_mad);
- }
/* set return bit in status of directed route responses */
if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)
{
struct ib_mad_agent *agent;
int p, q;
- int ret;
spin_lock_init(&dev->sm_lock);
q ? IB_QPT_GSI : IB_QPT_SMI,
NULL, 0, send_handler,
NULL, NULL);
- if (IS_ERR(agent)) {
- ret = PTR_ERR(agent);
+ if (IS_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:
if (dev->send_agent[p][q])
ib_unregister_mad_agent(dev->send_agent[p][q]);
- return ret;
+ return PTR_ERR(agent);
}
-void __devexit mthca_free_agents(struct mthca_dev *dev)
+void mthca_free_agents(struct mthca_dev *dev)
{
struct ib_mad_agent *agent;
int p, q;