[S390] dasd: correct debugfeature sense dump
remove loop, add some debug data and use get_sense function Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
committed by
Martin Schwidefsky
parent
bb8c29caff
commit
aeec92ca3a
@@ -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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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: %016llx %016llx %016llx %016llx",
|
"%s: %s %02x%02x%02x %016llx %016llx %016llx "
|
||||||
reason, sense[0], sense[1], sense[2],
|
"%016llx", reason,
|
||||||
sense[3]);
|
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");
|
||||||
|
@@ -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,
|
|||||||
/* 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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
if (sense) {
|
||||||
DBF_DEV_EVENT(DBF_EMERG, device,
|
DBF_DEV_EVENT(DBF_EMERG, device,
|
||||||
"%s: %08x %08x %08x %08x",
|
"%s: %s %02x%02x%02x %016llx %016llx %016llx "
|
||||||
reason, irb->ecw[8 * 0], irb->ecw[8 * 1],
|
"%016llx", reason,
|
||||||
irb->ecw[8 * 2], irb->ecw[8 * 3]);
|
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 {
|
|||||||
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 *);
|
||||||
|
Reference in New Issue
Block a user