aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/block/dasd_alias.c
diff options
context:
space:
mode:
authorStefan Weinhuber <wein@de.ibm.com>2009-03-26 10:23:48 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2009-03-26 10:24:05 -0400
commitf3eb5384cf0325c02e306b1d81e70f81a03d7432 (patch)
tree4d75517ad2c61ac2f8b6431eafd62b5d32c188ed /drivers/s390/block/dasd_alias.c
parentb44b0ab3bac16356f03e94b1b49ba9305710c445 (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.c25
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) {