diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/infiniband/hw/mlx4/alias_GUID.c | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx4/mad.c | 85 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx4/mcg.c | 18 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/eq.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 6 |
6 files changed, 55 insertions, 67 deletions
diff --git a/drivers/infiniband/hw/mlx4/alias_GUID.c b/drivers/infiniband/hw/mlx4/alias_GUID.c index d2fb38d43571..2f215b93db6b 100644 --- a/drivers/infiniband/hw/mlx4/alias_GUID.c +++ b/drivers/infiniband/hw/mlx4/alias_GUID.c | |||
@@ -107,7 +107,7 @@ static __be64 get_cached_alias_guid(struct mlx4_ib_dev *dev, int port, int index | |||
107 | { | 107 | { |
108 | if (index >= NUM_ALIAS_GUID_PER_PORT) { | 108 | if (index >= NUM_ALIAS_GUID_PER_PORT) { |
109 | pr_err("%s: ERROR: asked for index:%d\n", __func__, index); | 109 | pr_err("%s: ERROR: asked for index:%d\n", __func__, index); |
110 | return (__force __be64) ((u64) 0xFFFFFFFFFFFFFFFFUL); | 110 | return (__force __be64) -1; |
111 | } | 111 | } |
112 | return *(__be64 *)&dev->sriov.demux[port - 1].guid_cache[index]; | 112 | return *(__be64 *)&dev->sriov.demux[port - 1].guid_cache[index]; |
113 | } | 113 | } |
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c index 21a794152d15..0a903c129f0a 100644 --- a/drivers/infiniband/hw/mlx4/mad.c +++ b/drivers/infiniband/hw/mlx4/mad.c | |||
@@ -409,38 +409,45 @@ int mlx4_ib_find_real_gid(struct ib_device *ibdev, u8 port, __be64 guid) | |||
409 | } | 409 | } |
410 | 410 | ||
411 | 411 | ||
412 | static int get_pkey_phys_indices(struct mlx4_ib_dev *ibdev, u8 port, u8 ph_pkey_ix, | 412 | static int find_slave_port_pkey_ix(struct mlx4_ib_dev *dev, int slave, |
413 | u8 *full_pk_ix, u8 *partial_pk_ix, | 413 | u8 port, u16 pkey, u16 *ix) |
414 | int *is_full_member) | ||
415 | { | 414 | { |
416 | u16 search_pkey; | 415 | int i, ret; |
417 | int fm; | 416 | u8 unassigned_pkey_ix, pkey_ix, partial_ix = 0xFF; |
418 | int err = 0; | 417 | u16 slot_pkey; |
419 | u16 pk; | ||
420 | 418 | ||
421 | err = ib_get_cached_pkey(&ibdev->ib_dev, port, ph_pkey_ix, &search_pkey); | 419 | if (slave == mlx4_master_func_num(dev->dev)) |
422 | if (err) | 420 | return ib_find_cached_pkey(&dev->ib_dev, port, pkey, ix); |
423 | return err; | ||
424 | 421 | ||
425 | fm = (search_pkey & 0x8000) ? 1 : 0; | 422 | unassigned_pkey_ix = dev->dev->phys_caps.pkey_phys_table_len[port] - 1; |
426 | if (fm) { | ||
427 | *full_pk_ix = ph_pkey_ix; | ||
428 | search_pkey &= 0x7FFF; | ||
429 | } else { | ||
430 | *partial_pk_ix = ph_pkey_ix; | ||
431 | search_pkey |= 0x8000; | ||
432 | } | ||
433 | 423 | ||
434 | if (ib_find_exact_cached_pkey(&ibdev->ib_dev, port, search_pkey, &pk)) | 424 | for (i = 0; i < dev->dev->caps.pkey_table_len[port]; i++) { |
435 | pk = 0xFFFF; | 425 | if (dev->pkeys.virt2phys_pkey[slave][port - 1][i] == unassigned_pkey_ix) |
426 | continue; | ||
436 | 427 | ||
437 | if (fm) | 428 | pkey_ix = dev->pkeys.virt2phys_pkey[slave][port - 1][i]; |
438 | *partial_pk_ix = (pk & 0xFF); | ||
439 | else | ||
440 | *full_pk_ix = (pk & 0xFF); | ||
441 | 429 | ||
442 | *is_full_member = fm; | 430 | ret = ib_get_cached_pkey(&dev->ib_dev, port, pkey_ix, &slot_pkey); |
443 | return err; | 431 | if (ret) |
432 | continue; | ||
433 | if ((slot_pkey & 0x7FFF) == (pkey & 0x7FFF)) { | ||
434 | if (slot_pkey & 0x8000) { | ||
435 | *ix = (u16) pkey_ix; | ||
436 | return 0; | ||
437 | } else { | ||
438 | /* take first partial pkey index found */ | ||
439 | if (partial_ix == 0xFF) | ||
440 | partial_ix = pkey_ix; | ||
441 | } | ||
442 | } | ||
443 | } | ||
444 | |||
445 | if (partial_ix < 0xFF) { | ||
446 | *ix = (u16) partial_ix; | ||
447 | return 0; | ||
448 | } | ||
449 | |||
450 | return -EINVAL; | ||
444 | } | 451 | } |
445 | 452 | ||
446 | int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u8 port, | 453 | int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u8 port, |
@@ -458,10 +465,8 @@ int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u8 port, | |||
458 | unsigned tun_tx_ix = 0; | 465 | unsigned tun_tx_ix = 0; |
459 | int dqpn; | 466 | int dqpn; |
460 | int ret = 0; | 467 | int ret = 0; |
461 | int i; | ||
462 | int is_full_member = 0; | ||
463 | u16 tun_pkey_ix; | 468 | u16 tun_pkey_ix; |
464 | u8 ph_pkey_ix, full_pk_ix = 0, partial_pk_ix = 0; | 469 | u16 cached_pkey; |
465 | 470 | ||
466 | if (dest_qpt > IB_QPT_GSI) | 471 | if (dest_qpt > IB_QPT_GSI) |
467 | return -EINVAL; | 472 | return -EINVAL; |
@@ -481,27 +486,17 @@ int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u8 port, | |||
481 | else | 486 | else |
482 | tun_qp = &tun_ctx->qp[1]; | 487 | tun_qp = &tun_ctx->qp[1]; |
483 | 488 | ||
484 | /* compute pkey index for slave */ | 489 | /* compute P_Key index to put in tunnel header for slave */ |
485 | /* get physical pkey -- virtualized Dom0 pkey to phys*/ | ||
486 | if (dest_qpt) { | 490 | if (dest_qpt) { |
487 | ph_pkey_ix = | 491 | u16 pkey_ix; |
488 | dev->pkeys.virt2phys_pkey[mlx4_master_func_num(dev->dev)][port - 1][wc->pkey_index]; | 492 | ret = ib_get_cached_pkey(&dev->ib_dev, port, wc->pkey_index, &cached_pkey); |
489 | |||
490 | /* now, translate this to the slave pkey index */ | ||
491 | ret = get_pkey_phys_indices(dev, port, ph_pkey_ix, &full_pk_ix, | ||
492 | &partial_pk_ix, &is_full_member); | ||
493 | if (ret) | 493 | if (ret) |
494 | return -EINVAL; | 494 | return -EINVAL; |
495 | 495 | ||
496 | for (i = 0; i < dev->dev->caps.pkey_table_len[port]; i++) { | 496 | ret = find_slave_port_pkey_ix(dev, slave, port, cached_pkey, &pkey_ix); |
497 | if ((dev->pkeys.virt2phys_pkey[slave][port - 1][i] == full_pk_ix) || | 497 | if (ret) |
498 | (is_full_member && | ||
499 | (dev->pkeys.virt2phys_pkey[slave][port - 1][i] == partial_pk_ix))) | ||
500 | break; | ||
501 | } | ||
502 | if (i == dev->dev->caps.pkey_table_len[port]) | ||
503 | return -EINVAL; | 498 | return -EINVAL; |
504 | tun_pkey_ix = i; | 499 | tun_pkey_ix = pkey_ix; |
505 | } else | 500 | } else |
506 | tun_pkey_ix = dev->pkeys.virt2phys_pkey[slave][port - 1][0]; | 501 | tun_pkey_ix = dev->pkeys.virt2phys_pkey[slave][port - 1][0]; |
507 | 502 | ||
diff --git a/drivers/infiniband/hw/mlx4/mcg.c b/drivers/infiniband/hw/mlx4/mcg.c index 3c3b54c3fdd9..25b2cdff00f8 100644 --- a/drivers/infiniband/hw/mlx4/mcg.c +++ b/drivers/infiniband/hw/mlx4/mcg.c | |||
@@ -233,7 +233,8 @@ static int send_mad_to_slave(int slave, struct mlx4_ib_demux_ctx *ctx, | |||
233 | 233 | ||
234 | ib_query_ah(dev->sm_ah[ctx->port - 1], &ah_attr); | 234 | ib_query_ah(dev->sm_ah[ctx->port - 1], &ah_attr); |
235 | 235 | ||
236 | wc.pkey_index = 0; | 236 | if (ib_find_cached_pkey(&dev->ib_dev, ctx->port, IB_DEFAULT_PKEY_FULL, &wc.pkey_index)) |
237 | return -EINVAL; | ||
237 | wc.sl = 0; | 238 | wc.sl = 0; |
238 | wc.dlid_path_bits = 0; | 239 | wc.dlid_path_bits = 0; |
239 | wc.port_num = ctx->port; | 240 | wc.port_num = ctx->port; |
@@ -1074,10 +1075,6 @@ static void _mlx4_ib_mcg_port_cleanup(struct mlx4_ib_demux_ctx *ctx, int destroy | |||
1074 | unsigned long end; | 1075 | unsigned long end; |
1075 | int count; | 1076 | int count; |
1076 | 1077 | ||
1077 | if (ctx->flushing) | ||
1078 | return; | ||
1079 | |||
1080 | ctx->flushing = 1; | ||
1081 | for (i = 0; i < MAX_VFS; ++i) | 1078 | for (i = 0; i < MAX_VFS; ++i) |
1082 | clean_vf_mcast(ctx, i); | 1079 | clean_vf_mcast(ctx, i); |
1083 | 1080 | ||
@@ -1107,9 +1104,6 @@ static void _mlx4_ib_mcg_port_cleanup(struct mlx4_ib_demux_ctx *ctx, int destroy | |||
1107 | force_clean_group(group); | 1104 | force_clean_group(group); |
1108 | } | 1105 | } |
1109 | mutex_unlock(&ctx->mcg_table_lock); | 1106 | mutex_unlock(&ctx->mcg_table_lock); |
1110 | |||
1111 | if (!destroy_wq) | ||
1112 | ctx->flushing = 0; | ||
1113 | } | 1107 | } |
1114 | 1108 | ||
1115 | struct clean_work { | 1109 | struct clean_work { |
@@ -1123,6 +1117,7 @@ static void mcg_clean_task(struct work_struct *work) | |||
1123 | struct clean_work *cw = container_of(work, struct clean_work, work); | 1117 | struct clean_work *cw = container_of(work, struct clean_work, work); |
1124 | 1118 | ||
1125 | _mlx4_ib_mcg_port_cleanup(cw->ctx, cw->destroy_wq); | 1119 | _mlx4_ib_mcg_port_cleanup(cw->ctx, cw->destroy_wq); |
1120 | cw->ctx->flushing = 0; | ||
1126 | kfree(cw); | 1121 | kfree(cw); |
1127 | } | 1122 | } |
1128 | 1123 | ||
@@ -1130,13 +1125,20 @@ void mlx4_ib_mcg_port_cleanup(struct mlx4_ib_demux_ctx *ctx, int destroy_wq) | |||
1130 | { | 1125 | { |
1131 | struct clean_work *work; | 1126 | struct clean_work *work; |
1132 | 1127 | ||
1128 | if (ctx->flushing) | ||
1129 | return; | ||
1130 | |||
1131 | ctx->flushing = 1; | ||
1132 | |||
1133 | if (destroy_wq) { | 1133 | if (destroy_wq) { |
1134 | _mlx4_ib_mcg_port_cleanup(ctx, destroy_wq); | 1134 | _mlx4_ib_mcg_port_cleanup(ctx, destroy_wq); |
1135 | ctx->flushing = 0; | ||
1135 | return; | 1136 | return; |
1136 | } | 1137 | } |
1137 | 1138 | ||
1138 | work = kmalloc(sizeof *work, GFP_KERNEL); | 1139 | work = kmalloc(sizeof *work, GFP_KERNEL); |
1139 | if (!work) { | 1140 | if (!work) { |
1141 | ctx->flushing = 0; | ||
1140 | mcg_warn("failed allocating work for cleanup\n"); | 1142 | mcg_warn("failed allocating work for cleanup\n"); |
1141 | return; | 1143 | return; |
1142 | } | 1144 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index 51c764901ad2..194221b75b90 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c | |||
@@ -329,9 +329,6 @@ int set_and_calc_slave_port_state(struct mlx4_dev *dev, int slave, | |||
329 | ctx = &priv->mfunc.master.slave_state[slave]; | 329 | ctx = &priv->mfunc.master.slave_state[slave]; |
330 | spin_lock_irqsave(&ctx->lock, flags); | 330 | spin_lock_irqsave(&ctx->lock, flags); |
331 | 331 | ||
332 | mlx4_dbg(dev, "%s: slave: %d, current state: %d new event :%d\n", | ||
333 | __func__, slave, cur_state, event); | ||
334 | |||
335 | switch (cur_state) { | 332 | switch (cur_state) { |
336 | case SLAVE_PORT_DOWN: | 333 | case SLAVE_PORT_DOWN: |
337 | if (MLX4_PORT_STATE_DEV_EVENT_PORT_UP == event) | 334 | if (MLX4_PORT_STATE_DEV_EVENT_PORT_UP == event) |
@@ -366,9 +363,6 @@ int set_and_calc_slave_port_state(struct mlx4_dev *dev, int slave, | |||
366 | goto out; | 363 | goto out; |
367 | } | 364 | } |
368 | ret = mlx4_get_slave_port_state(dev, slave, port); | 365 | ret = mlx4_get_slave_port_state(dev, slave, port); |
369 | mlx4_dbg(dev, "%s: slave: %d, current state: %d new event" | ||
370 | " :%d gen_event: %d\n", | ||
371 | __func__, slave, cur_state, event, *gen_event); | ||
372 | 366 | ||
373 | out: | 367 | out: |
374 | spin_unlock_irqrestore(&ctx->lock, flags); | 368 | spin_unlock_irqrestore(&ctx->lock, flags); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 80df2ab0177c..2aa80afd98d2 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
@@ -1405,7 +1405,10 @@ unmap_bf: | |||
1405 | unmap_bf_area(dev); | 1405 | unmap_bf_area(dev); |
1406 | 1406 | ||
1407 | err_close: | 1407 | err_close: |
1408 | mlx4_close_hca(dev); | 1408 | if (mlx4_is_slave(dev)) |
1409 | mlx4_slave_exit(dev); | ||
1410 | else | ||
1411 | mlx4_CLOSE_HCA(dev, 0); | ||
1409 | 1412 | ||
1410 | err_free_icm: | 1413 | err_free_icm: |
1411 | if (!mlx4_is_slave(dev)) | 1414 | if (!mlx4_is_slave(dev)) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 926c911c0ac4..b05705f50f0f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
@@ -330,9 +330,6 @@ static void update_pkey_index(struct mlx4_dev *dev, int slave, | |||
330 | 330 | ||
331 | new_index = priv->virt2phys_pkey[slave][port - 1][orig_index]; | 331 | new_index = priv->virt2phys_pkey[slave][port - 1][orig_index]; |
332 | *(u8 *)(inbox->buf + 35) = new_index; | 332 | *(u8 *)(inbox->buf + 35) = new_index; |
333 | |||
334 | mlx4_dbg(dev, "port = %d, orig pkey index = %d, " | ||
335 | "new pkey index = %d\n", port, orig_index, new_index); | ||
336 | } | 333 | } |
337 | 334 | ||
338 | static void update_gid(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *inbox, | 335 | static void update_gid(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *inbox, |
@@ -351,9 +348,6 @@ static void update_gid(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *inbox, | |||
351 | if (optpar & MLX4_QP_OPTPAR_ALT_ADDR_PATH) | 348 | if (optpar & MLX4_QP_OPTPAR_ALT_ADDR_PATH) |
352 | qp_ctx->alt_path.mgid_index = slave & 0x7F; | 349 | qp_ctx->alt_path.mgid_index = slave & 0x7F; |
353 | } | 350 | } |
354 | |||
355 | mlx4_dbg(dev, "slave %d, new gid index: 0x%x ", | ||
356 | slave, qp_ctx->pri_path.mgid_index); | ||
357 | } | 351 | } |
358 | 352 | ||
359 | static int mpt_mask(struct mlx4_dev *dev) | 353 | static int mpt_mask(struct mlx4_dev *dev) |