aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/mlx4/mad.c
diff options
context:
space:
mode:
authorJack Morgenstein <jackm@dev.mellanox.co.il>2012-08-03 04:40:54 -0400
committerRoland Dreier <roland@purestorage.com>2012-09-30 23:33:41 -0400
commit992e8e6e8781b71fd475bd1fd0555da7dba59966 (patch)
tree1b84b49303a9f4eff3644b90cf20848bca7beabc /drivers/infiniband/hw/mlx4/mad.c
parent980e90010f15362b3b02ed4875ef2758aee3de72 (diff)
IB/mlx4: Miscellaneous adjustments for SR-IOV IB support
1. Allow only master to change node description. 2. Prevent AH leakage in send mads. 3. Take device part number from PCI structure, so that guests see the VF part number (and not the PF part number). 4. Place the device revision ID into caps structure at startup. 5. SET_PORT in update_gids_task needs to go through wrapper on master. 6. In mlx4_ib_event(), PORT_MGMT_EVENT needs be handled in a work queue on the master, since it propagates events to slaves using GEN_EQE. 7. Do not support FMR on slaves. 8. Add spinlock to slave_event(), since it is called both in interrupt context and in process context (due to 6 above, and also if smp_snoop is used). This fix was found and implemented by Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw/mlx4/mad.c')
-rw-r--r--drivers/infiniband/hw/mlx4/mad.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c
index b689dbd6d8f6..b91b4865d635 100644
--- a/drivers/infiniband/hw/mlx4/mad.c
+++ b/drivers/infiniband/hw/mlx4/mad.c
@@ -709,7 +709,9 @@ static int ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
709 if (!out_mad->mad_hdr.status) { 709 if (!out_mad->mad_hdr.status) {
710 if (!(to_mdev(ibdev)->dev->caps.flags & MLX4_DEV_CAP_FLAG_PORT_MNG_CHG_EV)) 710 if (!(to_mdev(ibdev)->dev->caps.flags & MLX4_DEV_CAP_FLAG_PORT_MNG_CHG_EV))
711 smp_snoop(ibdev, port_num, in_mad, prev_lid); 711 smp_snoop(ibdev, port_num, in_mad, prev_lid);
712 node_desc_override(ibdev, out_mad); 712 /* slaves get node desc from FW */
713 if (!mlx4_is_slave(to_mdev(ibdev)->dev))
714 node_desc_override(ibdev, out_mad);
713 } 715 }
714 716
715 /* set return bit in status of directed route responses */ 717 /* set return bit in status of directed route responses */
@@ -792,6 +794,8 @@ int mlx4_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
792static void send_handler(struct ib_mad_agent *agent, 794static void send_handler(struct ib_mad_agent *agent,
793 struct ib_mad_send_wc *mad_send_wc) 795 struct ib_mad_send_wc *mad_send_wc)
794{ 796{
797 if (mad_send_wc->send_buf->context[0])
798 ib_destroy_ah(mad_send_wc->send_buf->context[0]);
795 ib_free_send_mad(mad_send_wc->send_buf); 799 ib_free_send_mad(mad_send_wc->send_buf);
796} 800}
797 801