|
@@ -1128,6 +1128,27 @@ void handle_port_mgmt_change_event(struct work_struct *work)
|
|
|
|
|
|
/* Generate GUID changed event */
|
|
|
if (changed_attr & MLX4_EQ_PORT_INFO_GID_PFX_CHANGE_MASK) {
|
|
|
+ if (mlx4_is_master(dev->dev)) {
|
|
|
+ union ib_gid gid;
|
|
|
+ int err = 0;
|
|
|
+
|
|
|
+ if (!eqe->event.port_mgmt_change.params.port_info.gid_prefix)
|
|
|
+ err = __mlx4_ib_query_gid(&dev->ib_dev, port, 0, &gid, 1);
|
|
|
+ else
|
|
|
+ gid.global.subnet_prefix =
|
|
|
+ eqe->event.port_mgmt_change.params.port_info.gid_prefix;
|
|
|
+ if (err) {
|
|
|
+ pr_warn("Could not change QP1 subnet prefix for port %d: query_gid error (%d)\n",
|
|
|
+ port, err);
|
|
|
+ } else {
|
|
|
+ pr_debug("Changing QP1 subnet prefix for port %d. old=0x%llx. new=0x%llx\n",
|
|
|
+ port,
|
|
|
+ (u64)atomic64_read(&dev->sriov.demux[port - 1].subnet_prefix),
|
|
|
+ be64_to_cpu(gid.global.subnet_prefix));
|
|
|
+ atomic64_set(&dev->sriov.demux[port - 1].subnet_prefix,
|
|
|
+ be64_to_cpu(gid.global.subnet_prefix));
|
|
|
+ }
|
|
|
+ }
|
|
|
mlx4_ib_dispatch_event(dev, port, IB_EVENT_GID_CHANGE);
|
|
|
/*if master, notify all slaves*/
|
|
|
if (mlx4_is_master(dev->dev))
|
|
@@ -2202,6 +2223,8 @@ int mlx4_ib_init_sriov(struct mlx4_ib_dev *dev)
|
|
|
if (err)
|
|
|
goto demux_err;
|
|
|
dev->sriov.demux[i].guid_cache[0] = gid.global.interface_id;
|
|
|
+ atomic64_set(&dev->sriov.demux[i].subnet_prefix,
|
|
|
+ be64_to_cpu(gid.global.subnet_prefix));
|
|
|
err = alloc_pv_object(dev, mlx4_master_func_num(dev->dev), i + 1,
|
|
|
&dev->sriov.sqps[i]);
|
|
|
if (err)
|