Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce8b2fd0 authored by Sebastian Sanchez's avatar Sebastian Sanchez Committed by Doug Ledford
Browse files

IB/hfi1: Update pkey table properly after link down or FM start



When FM is disabled, and the HFI port on the switch is
changed from MgmtAllowed=YES to MgmtAllowed=NO and the
link is bounced, FULL_MGMT_P_KEY doesn't get cleared
from the pkey table. This also occurs when the QSFP
cable is moved from a switch port with MgmtAllowed=YES
to a MgmtAllowed=NO port. Clear pkey entry properly.

Also, when the driver is loaded and the switch port is
set to MgmtAllowed=NO, FULL_MGMT_P_KEY shouldn't be added
to pkey table after FM is started. Only set FULL_MGMT_P_KEY
in the pkey table if switch port is configured to
MgmtAllowed=YES.

Reviewed-by: default avatarDean Luick <dean.luick@intel.com>
Signed-off-by: default avatarSebastian Sanchez <sebastian.sanchez@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 8b103e9c
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -1037,6 +1037,7 @@ static void dc_shutdown(struct hfi1_devdata *);
static void dc_start(struct hfi1_devdata *);
static void dc_start(struct hfi1_devdata *);
static int qos_rmt_entries(struct hfi1_devdata *dd, unsigned int *mp,
static int qos_rmt_entries(struct hfi1_devdata *dd, unsigned int *mp,
			   unsigned int *np);
			   unsigned int *np);
static void remove_full_mgmt_pkey(struct hfi1_pportdata *ppd);


/*
/*
 * Error interrupt table entry.  This is used as input to the interrupt
 * Error interrupt table entry.  This is used as input to the interrupt
@@ -6961,6 +6962,8 @@ void handle_link_down(struct work_struct *work)
	}
	}


	reset_neighbor_info(ppd);
	reset_neighbor_info(ppd);
	if (ppd->mgmt_allowed)
		remove_full_mgmt_pkey(ppd);


	/* disable the port */
	/* disable the port */
	clear_rcvctrl(ppd->dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK);
	clear_rcvctrl(ppd->dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK);
@@ -7069,6 +7072,12 @@ static void add_full_mgmt_pkey(struct hfi1_pportdata *ppd)
	(void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0);
	(void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0);
}
}


static void remove_full_mgmt_pkey(struct hfi1_pportdata *ppd)
{
	ppd->pkeys[2] = 0;
	(void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0);
}

/*
/*
 * Convert the given link width to the OPA link width bitmask.
 * Convert the given link width to the OPA link width bitmask.
 */
 */
+6 −0
Original line number Original line Diff line number Diff line
@@ -1402,6 +1402,12 @@ static int set_pkeys(struct hfi1_devdata *dd, u8 port, u16 *pkeys)


		if (key == okey)
		if (key == okey)
			continue;
			continue;
		/*
		 * Don't update pkeys[2], if an HFI port without MgmtAllowed
		 * by neighbor is a switch.
		 */
		if (i == 2 && !ppd->mgmt_allowed && ppd->neighbor_type == 1)
			continue;
		/*
		/*
		 * The SM gives us the complete PKey table. We have
		 * The SM gives us the complete PKey table. We have
		 * to ensure that we put the PKeys in the matching
		 * to ensure that we put the PKeys in the matching