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

Commit 5e2d6764 authored by Alex Estrin's avatar Alex Estrin Committed by Doug Ledford
Browse files

IB/hfi1: Verify port data VLs credits on transition to Armed



There is a window where the FM can read the buffer control table
and decide not to program buffers. When a port goes down, the code
clears the table and if it is not programmed, posted SDMA descriptors
will never complete due to no buffer credits.

Reviewed-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarAlex Estrin <alex.estrin@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent a618b7e4
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -10489,6 +10489,14 @@ void set_link_down_reason(struct hfi1_pportdata *ppd, u8 lcl_reason,
	}
}

/*
 * Verify if BCT for data VLs is non-zero.
 */
static inline bool data_vls_operational(struct hfi1_pportdata *ppd)
{
	return !!ppd->actual_vls_operational;
}

/*
 * Change the physical and/or logical link state.
 *
@@ -10587,6 +10595,13 @@ int set_link_state(struct hfi1_pportdata *ppd, u32 state)
		if (ppd->host_link_state != HLS_UP_INIT)
			goto unexpected;

		if (!data_vls_operational(ppd)) {
			dd_dev_err(dd,
				   "%s: data VLs not operational\n", __func__);
			ret = -EINVAL;
			break;
		}

		ppd->host_link_state = HLS_UP_ARMED;
		set_logical_state(dd, LSTATE_ARMED);
		ret = wait_logical_linkstate(ppd, IB_PORT_ARMED, 1000);
@@ -14832,7 +14847,6 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
		}
		ppd->vls_supported = num_vls;
		ppd->vls_operational = ppd->vls_supported;
		ppd->actual_vls_operational = ppd->vls_supported;
		/* Set the default MTU. */
		for (vl = 0; vl < num_vls; vl++)
			dd->vld[vl].mtu = hfi1_max_mtu;
+1 −0
Original line number Diff line number Diff line
@@ -164,6 +164,7 @@ void handle_linkup_change(struct hfi1_devdata *dd, u32 linkup)
		ppd->linkup = 0;

		/* clear HW details of the previous connection */
		ppd->actual_vls_operational = 0;
		reset_link_credits(dd);

		/* freeze after a link down to guarantee a clean egress */