summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2013-10-09 19:37:41 +0000
committerjimharris <jimharris@FreeBSD.org>2013-10-09 19:37:41 +0000
commit40003e03dd1bc3afb919f8348506188ae16f597a (patch)
treea63b4b35ba1eb4121c089efd71146e8e7e9df847
parentcc9e8d9ddd9061ffba3384b67d6796a3c96fb2ef (diff)
downloadFreeBSD-src-40003e03dd1bc3afb919f8348506188ae16f597a.zip
FreeBSD-src-40003e03dd1bc3afb919f8348506188ae16f597a.tar.gz
Improve logging around some of the isci(4) reset and recovery paths.
Sponsored by: Intel Discussed with: scottl Approved by: re (marius) MFC after: 1 week
-rw-r--r--sys/dev/isci/isci_io_request.c9
-rw-r--r--sys/dev/isci/isci_sysctl.c34
-rw-r--r--sys/dev/isci/isci_task_request.c13
3 files changed, 52 insertions, 4 deletions
diff --git a/sys/dev/isci/isci_io_request.c b/sys/dev/isci/isci_io_request.c
index 4486f31..d1f5afe 100644
--- a/sys/dev/isci/isci_io_request.c
+++ b/sys/dev/isci/isci_io_request.c
@@ -153,11 +153,16 @@ isci_io_request_complete(SCI_CONTROLLER_HANDLE_T scif_controller,
case SCI_IO_FAILURE_REMOTE_DEVICE_RESET_REQUIRED:
isci_remote_device_reset(isci_remote_device, NULL);
+ ccb->ccb_h.status |= CAM_REQ_TERMIO;
+ isci_log_message(0, "ISCI",
+ "isci: bus=%x target=%x lun=%x cdb[0]=%x remote device reset required\n",
+ ccb->ccb_h.path_id, ccb->ccb_h.target_id,
+ ccb->ccb_h.target_lun, ccb->csio.cdb_io.cdb_bytes[0]);
+ break;
- /* drop through */
case SCI_IO_FAILURE_TERMINATED:
ccb->ccb_h.status |= CAM_REQ_TERMIO;
- isci_log_message(1, "ISCI",
+ isci_log_message(0, "ISCI",
"isci: bus=%x target=%x lun=%x cdb[0]=%x terminated\n",
ccb->ccb_h.path_id, ccb->ccb_h.target_id,
ccb->ccb_h.target_lun, ccb->csio.cdb_io.cdb_bytes[0]);
diff --git a/sys/dev/isci/isci_sysctl.c b/sys/dev/isci/isci_sysctl.c
index 6a22e38..4623a8a 100644
--- a/sys/dev/isci/isci_sysctl.c
+++ b/sys/dev/isci/isci_sysctl.c
@@ -193,6 +193,35 @@ isci_sysctl_start_phy(SYSCTL_HANDLER_ARGS)
return 0;
}
+static int
+isci_sysctl_log_frozen_lun_masks(SYSCTL_HANDLER_ARGS)
+{
+ struct isci_softc *isci = (struct isci_softc *)arg1;
+ struct ISCI_REMOTE_DEVICE *device;
+ int32_t log_frozen_devices = 0;
+ int error, i, j;
+
+ error = sysctl_handle_int(oidp, &log_frozen_devices, 0, req);
+
+ if (error || log_frozen_devices == 0)
+ return (error);
+
+ for (i = 0; i < isci->controller_count; i++) {
+ for (j = 0; j < SCI_MAX_REMOTE_DEVICES; j++) {
+ device = isci->controllers[i].remote_device[j];
+
+ if (device == NULL)
+ continue;
+
+ device_printf(isci->device,
+ "controller %d device %3d frozen_lun_mask 0x%02x\n",
+ i, j, device->frozen_lun_mask);
+ }
+ }
+
+ return (0);
+}
+
void isci_sysctl_initialize(struct isci_softc *isci)
{
struct sysctl_ctx_list *sysctl_ctx = device_get_sysctl_ctx(isci->device);
@@ -225,5 +254,10 @@ void isci_sysctl_initialize(struct isci_softc *isci)
SYSCTL_ADD_PROC(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree), OID_AUTO,
"start_phy", CTLTYPE_UINT| CTLFLAG_RW, isci, 0,
isci_sysctl_start_phy, "IU", "Start PHY on a controller");
+
+ SYSCTL_ADD_PROC(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree), OID_AUTO,
+ "log_frozen_lun_masks", CTLTYPE_UINT| CTLFLAG_RW, isci, 0,
+ isci_sysctl_log_frozen_lun_masks, "IU",
+ "Log frozen lun masks to kernel log");
}
diff --git a/sys/dev/isci/isci_task_request.c b/sys/dev/isci/isci_task_request.c
index 4ad0731..5d7f63d 100644
--- a/sys/dev/isci/isci_task_request.c
+++ b/sys/dev/isci/isci_task_request.c
@@ -194,11 +194,20 @@ isci_task_request_complete(SCI_CONTROLLER_HANDLE_T scif_controller,
break;
case SCI_TASK_FAILURE_INVALID_STATE:
+ retry_task = TRUE;
+ isci_log_message(0, "ISCI",
+ "task failure (invalid state) - retrying\n");
+ break;
+
case SCI_TASK_FAILURE_INSUFFICIENT_RESOURCES:
- case SCI_FAILURE_TIMEOUT:
retry_task = TRUE;
isci_log_message(0, "ISCI",
- "unhandled task completion code 0x%x\n", completion_status);
+ "task failure (insufficient resources) - retrying\n");
+ break;
+
+ case SCI_FAILURE_TIMEOUT:
+ retry_task = TRUE;
+ isci_log_message(0, "ISCI", "task timeout - retrying\n");
break;
case SCI_TASK_FAILURE:
OpenPOWER on IntegriCloud