diff options
author | Stefan Weinhuber <wein@de.ibm.com> | 2009-03-26 10:23:48 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2009-03-26 10:24:05 -0400 |
commit | f3eb5384cf0325c02e306b1d81e70f81a03d7432 (patch) | |
tree | 4d75517ad2c61ac2f8b6431eafd62b5d32c188ed /drivers/s390/block/dasd_alias.c | |
parent | b44b0ab3bac16356f03e94b1b49ba9305710c445 (diff) |
[S390] dasd: add High Performance FICON support
To support High Performance FICON, the DASD device driver has to
translate I/O requests into the new transport mode control words (TCW)
instead of the traditional (command mode) CCW requests.
Signed-off-by: Stefan Weinhuber <wein@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/block/dasd_alias.c')
-rw-r--r-- | drivers/s390/block/dasd_alias.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/drivers/s390/block/dasd_alias.c b/drivers/s390/block/dasd_alias.c index 20676cdef4a5..219bee7bd77c 100644 --- a/drivers/s390/block/dasd_alias.c +++ b/drivers/s390/block/dasd_alias.c | |||
@@ -646,14 +646,16 @@ static int reset_summary_unit_check(struct alias_lcu *lcu, | |||
646 | { | 646 | { |
647 | struct dasd_ccw_req *cqr; | 647 | struct dasd_ccw_req *cqr; |
648 | int rc = 0; | 648 | int rc = 0; |
649 | struct ccw1 *ccw; | ||
649 | 650 | ||
650 | cqr = lcu->rsu_cqr; | 651 | cqr = lcu->rsu_cqr; |
651 | strncpy((char *) &cqr->magic, "ECKD", 4); | 652 | strncpy((char *) &cqr->magic, "ECKD", 4); |
652 | ASCEBC((char *) &cqr->magic, 4); | 653 | ASCEBC((char *) &cqr->magic, 4); |
653 | cqr->cpaddr->cmd_code = DASD_ECKD_CCW_RSCK; | 654 | ccw = cqr->cpaddr; |
654 | cqr->cpaddr->flags = 0 ; | 655 | ccw->cmd_code = DASD_ECKD_CCW_RSCK; |
655 | cqr->cpaddr->count = 16; | 656 | ccw->flags = 0 ; |
656 | cqr->cpaddr->cda = (__u32)(addr_t) cqr->data; | 657 | ccw->count = 16; |
658 | ccw->cda = (__u32)(addr_t) cqr->data; | ||
657 | ((char *)cqr->data)[0] = reason; | 659 | ((char *)cqr->data)[0] = reason; |
658 | 660 | ||
659 | clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); | 661 | clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); |
@@ -855,12 +857,21 @@ void dasd_alias_handle_summary_unit_check(struct dasd_device *device, | |||
855 | struct alias_lcu *lcu; | 857 | struct alias_lcu *lcu; |
856 | char reason; | 858 | char reason; |
857 | struct dasd_eckd_private *private; | 859 | struct dasd_eckd_private *private; |
860 | char *sense; | ||
858 | 861 | ||
859 | private = (struct dasd_eckd_private *) device->private; | 862 | private = (struct dasd_eckd_private *) device->private; |
860 | 863 | ||
861 | reason = irb->ecw[8]; | 864 | sense = dasd_get_sense(irb); |
862 | DEV_MESSAGE(KERN_WARNING, device, "%s %x", | 865 | if (sense) { |
863 | "eckd handle summary unit check: reason", reason); | 866 | reason = sense[8]; |
867 | DBF_DEV_EVENT(DBF_NOTICE, device, "%s %x", | ||
868 | "eckd handle summary unit check: reason", reason); | ||
869 | } else { | ||
870 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", | ||
871 | "eckd handle summary unit check:" | ||
872 | " no reason code available"); | ||
873 | return; | ||
874 | } | ||
864 | 875 | ||
865 | lcu = private->lcu; | 876 | lcu = private->lcu; |
866 | if (!lcu) { | 877 | if (!lcu) { |