提交 aeec92ca 编写于 作者: S Stefan Haberland 提交者: Martin Schwidefsky

[S390] dasd: correct debugfeature sense dump

remove loop, add some debug data and use get_sense function
Signed-off-by: NStefan Haberland <stefan.haberland@de.ibm.com>
Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
上级 bb8c29ca
...@@ -1696,8 +1696,7 @@ static void dasd_eckd_handle_unsolicited_interrupt(struct dasd_device *device, ...@@ -1696,8 +1696,7 @@ static void dasd_eckd_handle_unsolicited_interrupt(struct dasd_device *device,
DBF_DEV_EVENT(DBF_ERR, device, "%s", DBF_DEV_EVENT(DBF_ERR, device, "%s",
"unsolicited interrupt received " "unsolicited interrupt received "
"(sense available)"); "(sense available)");
device->discipline->dump_sense_dbf(device, NULL, irb, device->discipline->dump_sense_dbf(device, irb, "unsolicited");
"unsolicited");
} }
dasd_schedule_device_bh(device); dasd_schedule_device_bh(device);
...@@ -2941,42 +2940,20 @@ dasd_eckd_dump_ccw_range(struct ccw1 *from, struct ccw1 *to, char *page) ...@@ -2941,42 +2940,20 @@ dasd_eckd_dump_ccw_range(struct ccw1 *from, struct ccw1 *to, char *page)
} }
static void static void
dasd_eckd_dump_sense_dbf(struct dasd_device *device, struct dasd_ccw_req *req, dasd_eckd_dump_sense_dbf(struct dasd_device *device, struct irb *irb,
struct irb *irb, char *reason) char *reason)
{ {
u64 *sense; u64 *sense;
int sl;
struct tsb *tsb;
sense = NULL; sense = (u64 *) dasd_get_sense(irb);
tsb = NULL;
if (req && scsw_is_tm(&req->irb.scsw)) {
if (irb->scsw.tm.tcw)
tsb = tcw_get_tsb(
(struct tcw *)(unsigned long)irb->scsw.tm.tcw);
if (tsb && (irb->scsw.tm.fcxs == 0x01)) {
switch (tsb->flags & 0x07) {
case 1: /* tsa_iostat */
sense = (u64 *)tsb->tsa.iostat.sense;
break;
case 2: /* ts_ddpc */
sense = (u64 *)tsb->tsa.ddpc.sense;
break;
case 3: /* tsa_intrg */
break;
}
}
} else {
if (irb->esw.esw0.erw.cons)
sense = (u64 *)irb->ecw;
}
if (sense) { if (sense) {
for (sl = 0; sl < 4; sl++) { DBF_DEV_EVENT(DBF_EMERG, device,
DBF_DEV_EVENT(DBF_EMERG, device, "%s: %s %02x%02x%02x %016llx %016llx %016llx "
"%s: %016llx %016llx %016llx %016llx", "%016llx", reason,
reason, sense[0], sense[1], sense[2], scsw_is_tm(&irb->scsw) ? "t" : "c",
sense[3]); scsw_cc(&irb->scsw), scsw_cstat(&irb->scsw),
} scsw_dstat(&irb->scsw), sense[0], sense[1],
sense[2], sense[3]);
} else { } else {
DBF_DEV_EVENT(DBF_EMERG, device, "%s", DBF_DEV_EVENT(DBF_EMERG, device, "%s",
"SORRY - NO VALID SENSE AVAILABLE\n"); "SORRY - NO VALID SENSE AVAILABLE\n");
......
...@@ -172,7 +172,7 @@ dasd_log_sense_dbf(struct dasd_ccw_req *cqr, struct irb *irb) ...@@ -172,7 +172,7 @@ dasd_log_sense_dbf(struct dasd_ccw_req *cqr, struct irb *irb)
device = cqr->startdev; device = cqr->startdev;
/* dump sense data to s390 debugfeature*/ /* dump sense data to s390 debugfeature*/
if (device->discipline && device->discipline->dump_sense_dbf) if (device->discipline && device->discipline->dump_sense_dbf)
device->discipline->dump_sense_dbf(device, cqr, irb, "log"); device->discipline->dump_sense_dbf(device, irb, "log");
} }
EXPORT_SYMBOL(dasd_log_sense_dbf); EXPORT_SYMBOL(dasd_log_sense_dbf);
......
...@@ -241,7 +241,7 @@ static void dasd_fba_handle_unsolicited_interrupt(struct dasd_device *device, ...@@ -241,7 +241,7 @@ static void dasd_fba_handle_unsolicited_interrupt(struct dasd_device *device,
/* check for unsolicited interrupts */ /* check for unsolicited interrupts */
DBF_DEV_EVENT(DBF_WARNING, device, "%s", DBF_DEV_EVENT(DBF_WARNING, device, "%s",
"unsolicited interrupt received"); "unsolicited interrupt received");
device->discipline->dump_sense_dbf(device, NULL, irb, "unsolicited"); device->discipline->dump_sense_dbf(device, irb, "unsolicited");
dasd_schedule_device_bh(device); dasd_schedule_device_bh(device);
return; return;
}; };
...@@ -444,17 +444,20 @@ dasd_fba_fill_info(struct dasd_device * device, ...@@ -444,17 +444,20 @@ dasd_fba_fill_info(struct dasd_device * device,
} }
static void static void
dasd_fba_dump_sense_dbf(struct dasd_device *device, struct dasd_ccw_req *req, dasd_fba_dump_sense_dbf(struct dasd_device *device, struct irb *irb,
struct irb *irb, char *reason) char *reason)
{ {
int sl; u64 *sense;
if (irb->esw.esw0.erw.cons) {
for (sl = 0; sl < 4; sl++) { sense = (u64 *) dasd_get_sense(irb);
DBF_DEV_EVENT(DBF_EMERG, device, if (sense) {
"%s: %08x %08x %08x %08x", DBF_DEV_EVENT(DBF_EMERG, device,
reason, irb->ecw[8 * 0], irb->ecw[8 * 1], "%s: %s %02x%02x%02x %016llx %016llx %016llx "
irb->ecw[8 * 2], irb->ecw[8 * 3]); "%016llx", reason,
} scsw_is_tm(&irb->scsw) ? "t" : "c",
scsw_cc(&irb->scsw), scsw_cstat(&irb->scsw),
scsw_dstat(&irb->scsw), sense[0], sense[1],
sense[2], sense[3]);
} else { } else {
DBF_DEV_EVENT(DBF_EMERG, device, "%s", DBF_DEV_EVENT(DBF_EMERG, device, "%s",
"SORRY - NO VALID SENSE AVAILABLE\n"); "SORRY - NO VALID SENSE AVAILABLE\n");
......
...@@ -284,8 +284,7 @@ struct dasd_discipline { ...@@ -284,8 +284,7 @@ struct dasd_discipline {
dasd_erp_fn_t(*erp_postaction) (struct dasd_ccw_req *); dasd_erp_fn_t(*erp_postaction) (struct dasd_ccw_req *);
void (*dump_sense) (struct dasd_device *, struct dasd_ccw_req *, void (*dump_sense) (struct dasd_device *, struct dasd_ccw_req *,
struct irb *); struct irb *);
void (*dump_sense_dbf) (struct dasd_device *, struct dasd_ccw_req *, void (*dump_sense_dbf) (struct dasd_device *, struct irb *, char *);
struct irb *, char *);
void (*handle_unsolicited_interrupt) (struct dasd_device *, void (*handle_unsolicited_interrupt) (struct dasd_device *,
struct irb *); struct irb *);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册