aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorMartin Peschke <mp3@de.ibm.com>2008-03-27 09:21:58 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-04-07 13:19:03 -0400
commitb75db73159ccffaf60a67896fdfed3856b1f65e3 (patch)
tree76702c9d4714e57f2ac0cc52e3515cb6efa6964e /drivers/s390
parent07c70d26b556b342e7ad285963974808efba3104 (diff)
[SCSI] zfcp: Add qtcb dump to hba debug trace
This patch adds per request hardware debugging data to the trace record which is written per request. It's a replacement for some sad kernel message based debugging code. Considering the amount of trace data, printk() is not suitable for this stuff. Writing binary traces is more efficient. In addition we got all information in one place. The QTCB trace data is only dumped for requests other than SCSI requests. Otherwise we would flood the trace ring buffer. We are mostly interested in non-SCSI, recovery related requests here anyway. This patch also works around a known hardware bug. It truncates QTCB traces so that we do not save unused areas of the hardware trace. Signed-off-by: Martin Peschke <mp3@de.ibm.com> Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/scsi/zfcp_dbf.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c
index 5019d7b738bc..658053c74707 100644
--- a/drivers/s390/scsi/zfcp_dbf.c
+++ b/drivers/s390/scsi/zfcp_dbf.c
@@ -179,6 +179,9 @@ void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *fsf_req)
179 (fsf_req->fsf_command == FSF_QTCB_OPEN_LUN)) { 179 (fsf_req->fsf_command == FSF_QTCB_OPEN_LUN)) {
180 strncpy(rec->tag2, "open", ZFCP_DBF_TAG_SIZE); 180 strncpy(rec->tag2, "open", ZFCP_DBF_TAG_SIZE);
181 level = 4; 181 level = 4;
182 } else if (qtcb->header.log_length) {
183 strncpy(rec->tag2, "qtcb", ZFCP_DBF_TAG_SIZE);
184 level = 5;
182 } else { 185 } else {
183 strncpy(rec->tag2, "norm", ZFCP_DBF_TAG_SIZE); 186 strncpy(rec->tag2, "norm", ZFCP_DBF_TAG_SIZE);
184 level = 6; 187 level = 6;
@@ -250,6 +253,17 @@ void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *fsf_req)
250 253
251 debug_event(adapter->hba_dbf, level, 254 debug_event(adapter->hba_dbf, level,
252 rec, sizeof(struct zfcp_hba_dbf_record)); 255 rec, sizeof(struct zfcp_hba_dbf_record));
256
257 /* have fcp channel microcode fixed to use as little as possible */
258 if (fsf_req->fsf_command != FSF_QTCB_FCP_CMND) {
259 /* adjust length skipping trailing zeros */
260 char *buf = (char *)qtcb + qtcb->header.log_start;
261 int len = qtcb->header.log_length;
262 for (; len && !buf[len - 1]; len--);
263 zfcp_dbf_hexdump(adapter->hba_dbf, rec, sizeof(*rec), level,
264 buf, len);
265 }
266
253 spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags); 267 spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
254} 268}
255 269