s390x/css: generate solicited crw for rchp completion signaling

A successful completion of rchp should signal a solicited channel path
initialized CRW (channel report word), while the current implementation
always generates an un-solicited one. Let's fix this.

Reported-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Signed-off-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Message-Id: <20170803003527.86979-3-bjsdjshi@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
Dong Jia Shi 2017-08-03 02:35:27 +02:00 committed by Cornelia Huck
parent 808e668bbc
commit 5c8d6f008c
2 changed files with 12 additions and 7 deletions

View file

@ -1750,10 +1750,10 @@ int css_do_rchp(uint8_t cssid, uint8_t chpid)
} }
/* We don't really use a channel path, so we're done here. */ /* We don't really use a channel path, so we're done here. */
css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 1,
channel_subsys.max_cssid > 0 ? 1 : 0, chpid); channel_subsys.max_cssid > 0 ? 1 : 0, chpid);
if (channel_subsys.max_cssid > 0) { if (channel_subsys.max_cssid > 0) {
css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 0, real_cssid << 8); css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 1, 0, real_cssid << 8);
} }
return 0; return 0;
} }
@ -2033,7 +2033,8 @@ void css_subch_assign(uint8_t cssid, uint8_t ssid, uint16_t schid,
} }
} }
void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid) void css_queue_crw(uint8_t rsc, uint8_t erc, int solicited,
int chain, uint16_t rsid)
{ {
CrwContainer *crw_cont; CrwContainer *crw_cont;
@ -2045,6 +2046,9 @@ void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid)
return; return;
} }
crw_cont->crw.flags = (rsc << 8) | erc; crw_cont->crw.flags = (rsc << 8) | erc;
if (solicited) {
crw_cont->crw.flags |= CRW_FLAGS_MASK_S;
}
if (chain) { if (chain) {
crw_cont->crw.flags |= CRW_FLAGS_MASK_C; crw_cont->crw.flags |= CRW_FLAGS_MASK_C;
} }
@ -2091,9 +2095,9 @@ void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid,
} }
chain_crw = (channel_subsys.max_ssid > 0) || chain_crw = (channel_subsys.max_ssid > 0) ||
(channel_subsys.max_cssid > 0); (channel_subsys.max_cssid > 0);
css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, chain_crw ? 1 : 0, schid); css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, chain_crw ? 1 : 0, schid);
if (chain_crw) { if (chain_crw) {
css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, 0,
(guest_cssid << 8) | (ssid << 4)); (guest_cssid << 8) | (ssid << 4));
} }
/* RW_ERC_IPI --> clear pending interrupts */ /* RW_ERC_IPI --> clear pending interrupts */
@ -2108,7 +2112,7 @@ void css_generate_chp_crws(uint8_t cssid, uint8_t chpid)
void css_generate_css_crws(uint8_t cssid) void css_generate_css_crws(uint8_t cssid)
{ {
if (!channel_subsys.sei_pending) { if (!channel_subsys.sei_pending) {
css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, cssid); css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, 0, cssid);
} }
channel_subsys.sei_pending = true; channel_subsys.sei_pending = true;
} }

View file

@ -150,7 +150,8 @@ void copy_scsw_to_guest(SCSW *dest, const SCSW *src);
void css_inject_io_interrupt(SubchDev *sch); void css_inject_io_interrupt(SubchDev *sch);
void css_reset(void); void css_reset(void);
void css_reset_sch(SubchDev *sch); void css_reset_sch(SubchDev *sch);
void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid); void css_queue_crw(uint8_t rsc, uint8_t erc, int solicited,
int chain, uint16_t rsid);
void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid, void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid,
int hotplugged, int add); int hotplugged, int add);
void css_generate_chp_crws(uint8_t cssid, uint8_t chpid); void css_generate_chp_crws(uint8_t cssid, uint8_t chpid);