diff options
-rw-r--r-- | hw/s390x/css.c | 13 | ||||
-rw-r--r-- | hw/s390x/css.h | 1 | ||||
-rw-r--r-- | target-s390x/ioinst.c | 1 |
3 files changed, 14 insertions, 1 deletions
diff --git a/hw/s390x/css.c b/hw/s390x/css.c index 343c352..533357a 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -49,6 +49,7 @@ typedef struct IoAdapter { typedef struct ChannelSubSys { QTAILQ_HEAD(, CrwContainer) pending_crws; + bool sei_pending; bool do_crw_mchk; bool crws_lost; uint8_t max_cssid; @@ -1359,7 +1360,15 @@ void css_generate_chp_crws(uint8_t cssid, uint8_t chpid) void css_generate_css_crws(uint8_t cssid) { - css_queue_crw(CRW_RSC_CSS, 0, 0, cssid); + if (!channel_subsys->sei_pending) { + css_queue_crw(CRW_RSC_CSS, 0, 0, cssid); + } + channel_subsys->sei_pending = true; +} + +void css_clear_sei_pending(void) +{ + channel_subsys->sei_pending = false; } int css_enable_mcsse(void) @@ -1509,6 +1518,7 @@ static void css_init(void) { channel_subsys = g_malloc0(sizeof(*channel_subsys)); QTAILQ_INIT(&channel_subsys->pending_crws); + channel_subsys->sei_pending = false; channel_subsys->do_crw_mchk = true; channel_subsys->crws_lost = false; channel_subsys->chnmon_active = false; @@ -1561,6 +1571,7 @@ void css_reset(void) QTAILQ_REMOVE(&channel_subsys->pending_crws, crw_cont, sibling); g_free(crw_cont); } + channel_subsys->sei_pending = false; channel_subsys->do_crw_mchk = true; channel_subsys->crws_lost = false; diff --git a/hw/s390x/css.h b/hw/s390x/css.h index a09bb1f..a47937d 100644 --- a/hw/s390x/css.h +++ b/hw/s390x/css.h @@ -103,6 +103,7 @@ void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid, int hotplugged, int add); void css_generate_chp_crws(uint8_t cssid, uint8_t chpid); void css_generate_css_crws(uint8_t cssid); +void css_clear_sei_pending(void); void css_adapter_interrupt(uint8_t isc); #define CSS_IO_ADAPTER_VIRTIO 1 diff --git a/target-s390x/ioinst.c b/target-s390x/ioinst.c index 57c2d8b..9a8de6d 100644 --- a/target-s390x/ioinst.c +++ b/target-s390x/ioinst.c @@ -614,6 +614,7 @@ static void ioinst_handle_chsc_sei(ChscReq *req, ChscResp *res) (*res_flags) |= 0x80; } else { (*res_flags) &= ~0x80; + css_clear_sei_pending(); } } else { res->code = cpu_to_be16(0x0005); |