|
@@ -3321,6 +3321,21 @@ static void nvme_fw_act_work(struct work_struct *work)
|
|
|
nvme_get_fw_slot_info(ctrl);
|
|
|
}
|
|
|
|
|
|
+static void nvme_handle_aen_notice(struct nvme_ctrl *ctrl, u32 result)
|
|
|
+{
|
|
|
+ switch ((result & 0xff00) >> 8) {
|
|
|
+ case NVME_AER_NOTICE_NS_CHANGED:
|
|
|
+ dev_info(ctrl->device, "rescanning\n");
|
|
|
+ nvme_queue_scan(ctrl);
|
|
|
+ break;
|
|
|
+ case NVME_AER_NOTICE_FW_ACT_STARTING:
|
|
|
+ queue_work(nvme_wq, &ctrl->fw_act_work);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ dev_warn(ctrl->device, "async event result %08x\n", result);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void nvme_complete_async_event(struct nvme_ctrl *ctrl, __le16 status,
|
|
|
volatile union nvme_result *res)
|
|
|
{
|
|
@@ -3330,6 +3345,9 @@ void nvme_complete_async_event(struct nvme_ctrl *ctrl, __le16 status,
|
|
|
return;
|
|
|
|
|
|
switch (result & 0x7) {
|
|
|
+ case NVME_AER_NOTICE:
|
|
|
+ nvme_handle_aen_notice(ctrl, result);
|
|
|
+ break;
|
|
|
case NVME_AER_ERROR:
|
|
|
case NVME_AER_SMART:
|
|
|
case NVME_AER_CSS:
|
|
@@ -3339,18 +3357,6 @@ void nvme_complete_async_event(struct nvme_ctrl *ctrl, __le16 status,
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
-
|
|
|
- switch (result & 0xff07) {
|
|
|
- case NVME_AER_NOTICE_NS_CHANGED:
|
|
|
- dev_info(ctrl->device, "rescanning\n");
|
|
|
- nvme_queue_scan(ctrl);
|
|
|
- break;
|
|
|
- case NVME_AER_NOTICE_FW_ACT_STARTING:
|
|
|
- queue_work(nvme_wq, &ctrl->fw_act_work);
|
|
|
- break;
|
|
|
- default:
|
|
|
- dev_warn(ctrl->device, "async event result %08x\n", result);
|
|
|
- }
|
|
|
queue_work(nvme_wq, &ctrl->async_event_work);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nvme_complete_async_event);
|