mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-11 00:08:50 +00:00
cxlflash: Fix host link up event handling
Following a link up event, the LUNs available to the host may have changed. Without rescanning the host, the LUN topology is unknown to the user. In such a state, the user would be unable to locate provisioned resources. To remedy, the host should be rescanned after a link up event. Signed-off-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com> Signed-off-by: Manoj N. Kumar <manoj@linux.vnet.ibm.com> Reviewed-by: Brian King <brking@linux.vnet.ibm.com> Reviewed-by: Tomas Henzl <thenzl@redhat.com> Signed-off-by: James Bottomley <JBottomley@Odin.com>
This commit is contained in:
parent
8396012ff7
commit
ef51074a4e
@ -102,6 +102,7 @@ struct cxlflash_cfg {
|
|||||||
enum cxlflash_init_state init_state;
|
enum cxlflash_init_state init_state;
|
||||||
enum cxlflash_lr_state lr_state;
|
enum cxlflash_lr_state lr_state;
|
||||||
int lr_port;
|
int lr_port;
|
||||||
|
atomic_t scan_host_needed;
|
||||||
|
|
||||||
struct cxl_afu *cxl_afu;
|
struct cxl_afu *cxl_afu;
|
||||||
|
|
||||||
|
@ -1119,17 +1119,17 @@ static const struct asyc_intr_info ainfo[] = {
|
|||||||
{SISL_ASTATUS_FC0_CRC_T, "CRC threshold exceeded", 0, LINK_RESET},
|
{SISL_ASTATUS_FC0_CRC_T, "CRC threshold exceeded", 0, LINK_RESET},
|
||||||
{SISL_ASTATUS_FC0_LOGI_R, "login timed out, retrying", 0, 0},
|
{SISL_ASTATUS_FC0_LOGI_R, "login timed out, retrying", 0, 0},
|
||||||
{SISL_ASTATUS_FC0_LOGI_F, "login failed", 0, CLR_FC_ERROR},
|
{SISL_ASTATUS_FC0_LOGI_F, "login failed", 0, CLR_FC_ERROR},
|
||||||
{SISL_ASTATUS_FC0_LOGI_S, "login succeeded", 0, 0},
|
{SISL_ASTATUS_FC0_LOGI_S, "login succeeded", 0, SCAN_HOST},
|
||||||
{SISL_ASTATUS_FC0_LINK_DN, "link down", 0, 0},
|
{SISL_ASTATUS_FC0_LINK_DN, "link down", 0, 0},
|
||||||
{SISL_ASTATUS_FC0_LINK_UP, "link up", 0, 0},
|
{SISL_ASTATUS_FC0_LINK_UP, "link up", 0, SCAN_HOST},
|
||||||
{SISL_ASTATUS_FC1_OTHER, "other error", 1, CLR_FC_ERROR | LINK_RESET},
|
{SISL_ASTATUS_FC1_OTHER, "other error", 1, CLR_FC_ERROR | LINK_RESET},
|
||||||
{SISL_ASTATUS_FC1_LOGO, "target initiated LOGO", 1, 0},
|
{SISL_ASTATUS_FC1_LOGO, "target initiated LOGO", 1, 0},
|
||||||
{SISL_ASTATUS_FC1_CRC_T, "CRC threshold exceeded", 1, LINK_RESET},
|
{SISL_ASTATUS_FC1_CRC_T, "CRC threshold exceeded", 1, LINK_RESET},
|
||||||
{SISL_ASTATUS_FC1_LOGI_R, "login timed out, retrying", 1, 0},
|
{SISL_ASTATUS_FC1_LOGI_R, "login timed out, retrying", 1, 0},
|
||||||
{SISL_ASTATUS_FC1_LOGI_F, "login failed", 1, CLR_FC_ERROR},
|
{SISL_ASTATUS_FC1_LOGI_F, "login failed", 1, CLR_FC_ERROR},
|
||||||
{SISL_ASTATUS_FC1_LOGI_S, "login succeeded", 1, 0},
|
{SISL_ASTATUS_FC1_LOGI_S, "login succeeded", 1, SCAN_HOST},
|
||||||
{SISL_ASTATUS_FC1_LINK_DN, "link down", 1, 0},
|
{SISL_ASTATUS_FC1_LINK_DN, "link down", 1, 0},
|
||||||
{SISL_ASTATUS_FC1_LINK_UP, "link up", 1, 0},
|
{SISL_ASTATUS_FC1_LINK_UP, "link up", 1, SCAN_HOST},
|
||||||
{0x0, "", 0, 0} /* terminator */
|
{0x0, "", 0, 0} /* terminator */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1350,6 +1350,11 @@ static irqreturn_t cxlflash_async_err_irq(int irq, void *data)
|
|||||||
writeq_be(reg, &global->fc_regs[port][FC_ERROR / 8]);
|
writeq_be(reg, &global->fc_regs[port][FC_ERROR / 8]);
|
||||||
writeq_be(0, &global->fc_regs[port][FC_ERRCAP / 8]);
|
writeq_be(0, &global->fc_regs[port][FC_ERRCAP / 8]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (info->action & SCAN_HOST) {
|
||||||
|
atomic_inc(&cfg->scan_host_needed);
|
||||||
|
schedule_work(&cfg->work_q);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@ -2309,6 +2314,7 @@ MODULE_DEVICE_TABLE(pci, cxlflash_pci_table);
|
|||||||
* - Link reset which cannot be performed on interrupt context due to
|
* - Link reset which cannot be performed on interrupt context due to
|
||||||
* blocking up to a few seconds
|
* blocking up to a few seconds
|
||||||
* - Read AFU command room
|
* - Read AFU command room
|
||||||
|
* - Rescan the host
|
||||||
*/
|
*/
|
||||||
static void cxlflash_worker_thread(struct work_struct *work)
|
static void cxlflash_worker_thread(struct work_struct *work)
|
||||||
{
|
{
|
||||||
@ -2351,6 +2357,9 @@ static void cxlflash_worker_thread(struct work_struct *work)
|
|||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(cfg->host->host_lock, lock_flags);
|
spin_unlock_irqrestore(cfg->host->host_lock, lock_flags);
|
||||||
|
|
||||||
|
if (atomic_dec_if_positive(&cfg->scan_host_needed) >= 0)
|
||||||
|
scsi_scan_host(cfg->host);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -99,6 +99,7 @@ struct asyc_intr_info {
|
|||||||
u8 action;
|
u8 action;
|
||||||
#define CLR_FC_ERROR 0x01
|
#define CLR_FC_ERROR 0x01
|
||||||
#define LINK_RESET 0x02
|
#define LINK_RESET 0x02
|
||||||
|
#define SCAN_HOST 0x04
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef CONFIG_CXL_EEH
|
#ifndef CONFIG_CXL_EEH
|
||||||
|
Loading…
x
Reference in New Issue
Block a user