From 485dd69088b6ff6cf1c1b6b2c8157c1c9846992a Mon Sep 17 00:00:00 2001 From: Sascha Silbe Date: Mon, 11 Jul 2016 13:00:36 +0200 Subject: s390x/css: copy CCW format bit from ORB to SCSW The CCW Format (F) flag of the Subchannel-Status Word (SCSW) indicates the format of the CCWs "associated with an I/O operation", i.e. the value of CCW-Format Control (F) bit of the Operation-Request Block (ORB). Copy the CCW format bit from the ORB to the SCSW so we correctly indicate the format of the CCWs to the guest. Signed-off-by: Sascha Silbe Reviewed-by: Halil Pasic Signed-off-by: Cornelia Huck --- hw/s390x/css.c | 1 + 1 file changed, 1 insertion(+) (limited to 'hw/s390x/css.c') diff --git a/hw/s390x/css.c b/hw/s390x/css.c index aa61773885..9e98f50868 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -524,6 +524,7 @@ static void sch_handle_start_func(SubchDev *sch, ORB *orb) return; } sch->ccw_fmt_1 = !!(orb->ctrl0 & ORB_CTRL0_MASK_FMT); + s->flags |= (sch->ccw_fmt_1) ? SCSW_FLAGS_MASK_FMT : 0; sch->ccw_no_data_cnt = 0; suspend_allowed = !!(orb->ctrl0 & ORB_CTRL0_MASK_SPND); } else { -- cgit 1.4.1 From 727a0424dd77a2c9176d63e7b92d017ee3e8b761 Mon Sep 17 00:00:00 2001 From: Sascha Silbe Date: Tue, 12 Jul 2016 14:08:08 +0200 Subject: s390x/css: sch_handle_start_func() handles resume, too It's not obvious from the code flow that sch_handle_start_func() gets called for rsch. Add some comments explaining this. Signed-off-by: Sascha Silbe Reviewed-by: Halil Pasic Signed-off-by: Cornelia Huck --- hw/s390x/css.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'hw/s390x/css.c') diff --git a/hw/s390x/css.c b/hw/s390x/css.c index 9e98f50868..bb8e4be339 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -511,6 +511,7 @@ static void sch_handle_start_func(SubchDev *sch, ORB *orb) path = 0x80; if (!(s->ctrl & SCSW_ACTL_SUSP)) { + /* Start Function triggered via ssch, i.e. we have an ORB */ s->cstat = 0; s->dstat = 0; /* Look at the orb and try to execute the channel program. */ @@ -528,6 +529,8 @@ static void sch_handle_start_func(SubchDev *sch, ORB *orb) sch->ccw_no_data_cnt = 0; suspend_allowed = !!(orb->ctrl0 & ORB_CTRL0_MASK_SPND); } else { + /* Start Function resumed via rsch, i.e. we don't have an + * ORB */ s->ctrl &= ~(SCSW_ACTL_SUSP | SCSW_ACTL_RESUME_PEND); /* The channel program had been suspended before. */ suspend_allowed = true; @@ -610,6 +613,7 @@ static void do_subchannel_work(SubchDev *sch, ORB *orb) } else if (s->ctrl & SCSW_FCTL_HALT_FUNC) { sch_handle_halt_func(sch); } else if (s->ctrl & SCSW_FCTL_START_FUNC) { + /* Triggered by both ssch and rsch. */ sch_handle_start_func(sch, orb); } else { /* Cannot happen. */ -- cgit 1.4.1