| .. | .. |
|---|
| 58 | 58 | |
|---|
| 59 | 59 | ret = ib_query_port(&dev->ib_dev, port_num, tprops); |
|---|
| 60 | 60 | if (ret) { |
|---|
| 61 | | - printk(KERN_WARNING "ib_query_port failed (%d) for %s port %d\n", |
|---|
| 62 | | - ret, dev->ib_dev.name, port_num); |
|---|
| 61 | + dev_warn(&dev->ib_dev.dev, |
|---|
| 62 | + "ib_query_port failed (%d) forport %d\n", ret, |
|---|
| 63 | + port_num); |
|---|
| 63 | 64 | goto out; |
|---|
| 64 | 65 | } |
|---|
| 65 | 66 | |
|---|
| .. | .. |
|---|
| 88 | 89 | rdma_ah_set_port_num(&ah_attr, port_num); |
|---|
| 89 | 90 | |
|---|
| 90 | 91 | new_ah = rdma_create_ah(dev->send_agent[port_num - 1][0]->qp->pd, |
|---|
| 91 | | - &ah_attr); |
|---|
| 92 | + &ah_attr, 0); |
|---|
| 92 | 93 | if (IS_ERR(new_ah)) |
|---|
| 93 | 94 | return; |
|---|
| 94 | 95 | |
|---|
| 95 | 96 | spin_lock_irqsave(&dev->sm_lock, flags); |
|---|
| 96 | 97 | if (dev->sm_ah[port_num - 1]) |
|---|
| 97 | | - rdma_destroy_ah(dev->sm_ah[port_num - 1]); |
|---|
| 98 | + rdma_destroy_ah(dev->sm_ah[port_num - 1], 0); |
|---|
| 98 | 99 | dev->sm_ah[port_num - 1] = new_ah; |
|---|
| 99 | 100 | spin_unlock_irqrestore(&dev->sm_lock, flags); |
|---|
| 100 | 101 | } |
|---|
| .. | .. |
|---|
| 195 | 196 | } |
|---|
| 196 | 197 | } |
|---|
| 197 | 198 | |
|---|
| 198 | | -int mthca_process_mad(struct ib_device *ibdev, |
|---|
| 199 | | - int mad_flags, |
|---|
| 200 | | - u8 port_num, |
|---|
| 201 | | - const struct ib_wc *in_wc, |
|---|
| 202 | | - const struct ib_grh *in_grh, |
|---|
| 203 | | - const struct ib_mad_hdr *in, size_t in_mad_size, |
|---|
| 204 | | - struct ib_mad_hdr *out, size_t *out_mad_size, |
|---|
| 205 | | - u16 *out_mad_pkey_index) |
|---|
| 199 | +int mthca_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, |
|---|
| 200 | + const struct ib_wc *in_wc, const struct ib_grh *in_grh, |
|---|
| 201 | + const struct ib_mad *in, struct ib_mad *out, |
|---|
| 202 | + size_t *out_mad_size, u16 *out_mad_pkey_index) |
|---|
| 206 | 203 | { |
|---|
| 207 | 204 | int err; |
|---|
| 208 | 205 | u16 slid = in_wc ? ib_lid_cpu16(in_wc->slid) : be16_to_cpu(IB_LID_PERMISSIVE); |
|---|
| 209 | 206 | u16 prev_lid = 0; |
|---|
| 210 | 207 | struct ib_port_attr pattr; |
|---|
| 211 | | - const struct ib_mad *in_mad = (const struct ib_mad *)in; |
|---|
| 212 | | - struct ib_mad *out_mad = (struct ib_mad *)out; |
|---|
| 213 | | - |
|---|
| 214 | | - if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || |
|---|
| 215 | | - *out_mad_size != sizeof(*out_mad))) |
|---|
| 216 | | - return IB_MAD_RESULT_FAILURE; |
|---|
| 217 | 208 | |
|---|
| 218 | 209 | /* Forward locally generated traps to the SM */ |
|---|
| 219 | | - if (in_mad->mad_hdr.method == IB_MGMT_METHOD_TRAP && |
|---|
| 220 | | - slid == 0) { |
|---|
| 221 | | - forward_trap(to_mdev(ibdev), port_num, in_mad); |
|---|
| 210 | + if (in->mad_hdr.method == IB_MGMT_METHOD_TRAP && !slid) { |
|---|
| 211 | + forward_trap(to_mdev(ibdev), port_num, in); |
|---|
| 222 | 212 | return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED; |
|---|
| 223 | 213 | } |
|---|
| 224 | 214 | |
|---|
| .. | .. |
|---|
| 228 | 218 | * Only handle PMA and Mellanox vendor-specific class gets and |
|---|
| 229 | 219 | * sets for other classes. |
|---|
| 230 | 220 | */ |
|---|
| 231 | | - if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED || |
|---|
| 232 | | - in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) { |
|---|
| 233 | | - if (in_mad->mad_hdr.method != IB_MGMT_METHOD_GET && |
|---|
| 234 | | - in_mad->mad_hdr.method != IB_MGMT_METHOD_SET && |
|---|
| 235 | | - in_mad->mad_hdr.method != IB_MGMT_METHOD_TRAP_REPRESS) |
|---|
| 221 | + if (in->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED || |
|---|
| 222 | + in->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) { |
|---|
| 223 | + if (in->mad_hdr.method != IB_MGMT_METHOD_GET && |
|---|
| 224 | + in->mad_hdr.method != IB_MGMT_METHOD_SET && |
|---|
| 225 | + in->mad_hdr.method != IB_MGMT_METHOD_TRAP_REPRESS) |
|---|
| 236 | 226 | return IB_MAD_RESULT_SUCCESS; |
|---|
| 237 | 227 | |
|---|
| 238 | 228 | /* |
|---|
| 239 | 229 | * Don't process SMInfo queries or vendor-specific |
|---|
| 240 | 230 | * MADs -- the SMA can't handle them. |
|---|
| 241 | 231 | */ |
|---|
| 242 | | - if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO || |
|---|
| 243 | | - ((in_mad->mad_hdr.attr_id & IB_SMP_ATTR_VENDOR_MASK) == |
|---|
| 232 | + if (in->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO || |
|---|
| 233 | + ((in->mad_hdr.attr_id & IB_SMP_ATTR_VENDOR_MASK) == |
|---|
| 244 | 234 | IB_SMP_ATTR_VENDOR_MASK)) |
|---|
| 245 | 235 | return IB_MAD_RESULT_SUCCESS; |
|---|
| 246 | | - } else if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT || |
|---|
| 247 | | - in_mad->mad_hdr.mgmt_class == MTHCA_VENDOR_CLASS1 || |
|---|
| 248 | | - in_mad->mad_hdr.mgmt_class == MTHCA_VENDOR_CLASS2) { |
|---|
| 249 | | - if (in_mad->mad_hdr.method != IB_MGMT_METHOD_GET && |
|---|
| 250 | | - in_mad->mad_hdr.method != IB_MGMT_METHOD_SET) |
|---|
| 236 | + } else if (in->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT || |
|---|
| 237 | + in->mad_hdr.mgmt_class == MTHCA_VENDOR_CLASS1 || |
|---|
| 238 | + in->mad_hdr.mgmt_class == MTHCA_VENDOR_CLASS2) { |
|---|
| 239 | + if (in->mad_hdr.method != IB_MGMT_METHOD_GET && |
|---|
| 240 | + in->mad_hdr.method != IB_MGMT_METHOD_SET) |
|---|
| 251 | 241 | return IB_MAD_RESULT_SUCCESS; |
|---|
| 252 | 242 | } else |
|---|
| 253 | 243 | return IB_MAD_RESULT_SUCCESS; |
|---|
| 254 | | - if ((in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED || |
|---|
| 255 | | - in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) && |
|---|
| 256 | | - in_mad->mad_hdr.method == IB_MGMT_METHOD_SET && |
|---|
| 257 | | - in_mad->mad_hdr.attr_id == IB_SMP_ATTR_PORT_INFO && |
|---|
| 244 | + if ((in->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED || |
|---|
| 245 | + in->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) && |
|---|
| 246 | + in->mad_hdr.method == IB_MGMT_METHOD_SET && |
|---|
| 247 | + in->mad_hdr.attr_id == IB_SMP_ATTR_PORT_INFO && |
|---|
| 258 | 248 | !ib_query_port(ibdev, port_num, &pattr)) |
|---|
| 259 | 249 | prev_lid = ib_lid_cpu16(pattr.lid); |
|---|
| 260 | 250 | |
|---|
| 261 | | - err = mthca_MAD_IFC(to_mdev(ibdev), |
|---|
| 262 | | - mad_flags & IB_MAD_IGNORE_MKEY, |
|---|
| 263 | | - mad_flags & IB_MAD_IGNORE_BKEY, |
|---|
| 264 | | - port_num, in_wc, in_grh, in_mad, out_mad); |
|---|
| 251 | + err = mthca_MAD_IFC(to_mdev(ibdev), mad_flags & IB_MAD_IGNORE_MKEY, |
|---|
| 252 | + mad_flags & IB_MAD_IGNORE_BKEY, port_num, in_wc, |
|---|
| 253 | + in_grh, in, out); |
|---|
| 265 | 254 | if (err == -EBADMSG) |
|---|
| 266 | 255 | return IB_MAD_RESULT_SUCCESS; |
|---|
| 267 | 256 | else if (err) { |
|---|
| .. | .. |
|---|
| 269 | 258 | return IB_MAD_RESULT_FAILURE; |
|---|
| 270 | 259 | } |
|---|
| 271 | 260 | |
|---|
| 272 | | - if (!out_mad->mad_hdr.status) { |
|---|
| 273 | | - smp_snoop(ibdev, port_num, in_mad, prev_lid); |
|---|
| 274 | | - node_desc_override(ibdev, out_mad); |
|---|
| 261 | + if (!out->mad_hdr.status) { |
|---|
| 262 | + smp_snoop(ibdev, port_num, in, prev_lid); |
|---|
| 263 | + node_desc_override(ibdev, out); |
|---|
| 275 | 264 | } |
|---|
| 276 | 265 | |
|---|
| 277 | 266 | /* set return bit in status of directed route responses */ |
|---|
| 278 | | - if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) |
|---|
| 279 | | - out_mad->mad_hdr.status |= cpu_to_be16(1 << 15); |
|---|
| 267 | + if (in->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) |
|---|
| 268 | + out->mad_hdr.status |= cpu_to_be16(1 << 15); |
|---|
| 280 | 269 | |
|---|
| 281 | | - if (in_mad->mad_hdr.method == IB_MGMT_METHOD_TRAP_REPRESS) |
|---|
| 270 | + if (in->mad_hdr.method == IB_MGMT_METHOD_TRAP_REPRESS) |
|---|
| 282 | 271 | /* no response for trap repress */ |
|---|
| 283 | 272 | return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED; |
|---|
| 284 | 273 | |
|---|
| .. | .. |
|---|
| 346 | 335 | } |
|---|
| 347 | 336 | |
|---|
| 348 | 337 | if (dev->sm_ah[p]) |
|---|
| 349 | | - rdma_destroy_ah(dev->sm_ah[p]); |
|---|
| 338 | + rdma_destroy_ah(dev->sm_ah[p], |
|---|
| 339 | + RDMA_DESTROY_AH_SLEEPABLE); |
|---|
| 350 | 340 | } |
|---|
| 351 | 341 | } |
|---|