X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Finfiniband%2Fhw%2Fmthca%2Fmthca_mad.c;fp=drivers%2Finfiniband%2Fhw%2Fmthca%2Fmthca_mad.c;h=1229c604c6e0258e49c73d5d4a4d26f695587c14;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=45e106f148071c95a93125beb4e20f878988f0ec;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/drivers/infiniband/hw/mthca/mthca_mad.c b/drivers/infiniband/hw/mthca/mthca_mad.c index 45e106f14..1229c604c 100644 --- a/drivers/infiniband/hw/mthca/mthca_mad.c +++ b/drivers/infiniband/hw/mthca/mthca_mad.c @@ -49,30 +49,6 @@ enum { 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) { @@ -114,22 +90,13 @@ static void smp_snoop(struct ib_device *ibdev, 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); } @@ -142,19 +109,6 @@ static void smp_snoop(struct ib_device *ibdev, } } -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) @@ -253,10 +207,8 @@ int mthca_process_mad(struct ib_device *ibdev, 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) @@ -279,7 +231,6 @@ int mthca_create_agents(struct mthca_dev *dev) { struct ib_mad_agent *agent; int p, q; - int ret; spin_lock_init(&dev->sm_lock); @@ -289,23 +240,11 @@ int mthca_create_agents(struct mthca_dev *dev) 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: @@ -314,10 +253,10 @@ 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;