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:
parent
808e668bbc
commit
5c8d6f008c
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user