|
|
@@ -632,15 +632,30 @@ static void free_mem(struct cxlflash_cfg *cfg)
|
|
|
* @cfg: Internal structure associated with the host.
|
|
|
*
|
|
|
* Safe to call with AFU in a partially allocated/initialized state.
|
|
|
+ *
|
|
|
+ * Cleans up all state associated with the command queue, and unmaps
|
|
|
+ * the MMIO space.
|
|
|
+ *
|
|
|
+ * - complete() will take care of commands we initiated (they'll be checked
|
|
|
+ * in as part of the cleanup that occurs after the completion)
|
|
|
+ *
|
|
|
+ * - cmd_checkin() will take care of entries that we did not initiate and that
|
|
|
+ * have not (and will not) complete because they are sitting on a [now stale]
|
|
|
+ * hardware queue
|
|
|
*/
|
|
|
static void stop_afu(struct cxlflash_cfg *cfg)
|
|
|
{
|
|
|
int i;
|
|
|
struct afu *afu = cfg->afu;
|
|
|
+ struct afu_cmd *cmd;
|
|
|
|
|
|
if (likely(afu)) {
|
|
|
- for (i = 0; i < CXLFLASH_NUM_CMDS; i++)
|
|
|
- complete(&afu->cmd[i].cevent);
|
|
|
+ for (i = 0; i < CXLFLASH_NUM_CMDS; i++) {
|
|
|
+ cmd = &afu->cmd[i];
|
|
|
+ complete(&cmd->cevent);
|
|
|
+ if (!atomic_read(&cmd->free))
|
|
|
+ cmd_checkin(cmd);
|
|
|
+ }
|
|
|
|
|
|
if (likely(afu->afu_map)) {
|
|
|
cxl_psa_unmap((void __iomem *)afu->afu_map);
|