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

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
...@@ -10489,6 +10489,14 @@ void set_link_down_reason(struct hfi1_pportdata *ppd, u8 lcl_reason, ...@@ -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. * Change the physical and/or logical link state.
* *
...@@ -10587,6 +10595,13 @@ int set_link_state(struct hfi1_pportdata *ppd, u32 state) ...@@ -10587,6 +10595,13 @@ int set_link_state(struct hfi1_pportdata *ppd, u32 state)
if (ppd->host_link_state != HLS_UP_INIT) if (ppd->host_link_state != HLS_UP_INIT)
goto unexpected; 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; ppd->host_link_state = HLS_UP_ARMED;
set_logical_state(dd, LSTATE_ARMED); set_logical_state(dd, LSTATE_ARMED);
ret = wait_logical_linkstate(ppd, IB_PORT_ARMED, 1000); ret = wait_logical_linkstate(ppd, IB_PORT_ARMED, 1000);
...@@ -14832,7 +14847,6 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev, ...@@ -14832,7 +14847,6 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
} }
ppd->vls_supported = num_vls; ppd->vls_supported = num_vls;
ppd->vls_operational = ppd->vls_supported; ppd->vls_operational = ppd->vls_supported;
ppd->actual_vls_operational = ppd->vls_supported;
/* Set the default MTU. */ /* Set the default MTU. */
for (vl = 0; vl < num_vls; vl++) for (vl = 0; vl < num_vls; vl++)
dd->vld[vl].mtu = hfi1_max_mtu; dd->vld[vl].mtu = hfi1_max_mtu;
......
...@@ -164,6 +164,7 @@ void handle_linkup_change(struct hfi1_devdata *dd, u32 linkup) ...@@ -164,6 +164,7 @@ void handle_linkup_change(struct hfi1_devdata *dd, u32 linkup)
ppd->linkup = 0; ppd->linkup = 0;
/* clear HW details of the previous connection */ /* clear HW details of the previous connection */
ppd->actual_vls_operational = 0;
reset_link_credits(dd); reset_link_credits(dd);
/* freeze after a link down to guarantee a clean egress */ /* freeze after a link down to guarantee a clean egress */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment