s390/sclp: reduce dependency on event type masks
The event type masks can change asynchronously. These changes are reported by SCLP to the OS by state-change events which are retrieved with the read event data command. The SCLP driver has a request queue, there is a window where the read event data request has not completed yet but the SCLP console drivers are trying to queue output requests. As the masks are not updated yet the requests are discarded. The simplest fix is to queue the console requests independent of the event type masks and rely on SCLP to return with an error code if a specific event type is not available. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
170387a887
commit
ea61a579ab
|
@ -281,7 +281,7 @@ out:
|
||||||
|
|
||||||
static unsigned int __init sclp_con_check_linemode(struct init_sccb *sccb)
|
static unsigned int __init sclp_con_check_linemode(struct init_sccb *sccb)
|
||||||
{
|
{
|
||||||
if (!(sccb->sclp_send_mask & (EVTYP_OPCMD_MASK | EVTYP_PMSGCMD_MASK)))
|
if (!(sccb->sclp_send_mask & EVTYP_OPCMD_MASK))
|
||||||
return 0;
|
return 0;
|
||||||
if (!(sccb->sclp_receive_mask & (EVTYP_MSG_MASK | EVTYP_PMSGCMD_MASK)))
|
if (!(sccb->sclp_receive_mask & (EVTYP_MSG_MASK | EVTYP_PMSGCMD_MASK)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -33,7 +33,7 @@ static void sclp_rw_pm_event(struct sclp_register *reg,
|
||||||
|
|
||||||
/* Event type structure for write message and write priority message */
|
/* Event type structure for write message and write priority message */
|
||||||
static struct sclp_register sclp_rw_event = {
|
static struct sclp_register sclp_rw_event = {
|
||||||
.send_mask = EVTYP_MSG_MASK | EVTYP_PMSGCMD_MASK,
|
.send_mask = EVTYP_MSG_MASK,
|
||||||
.pm_event_fn = sclp_rw_pm_event,
|
.pm_event_fn = sclp_rw_pm_event,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -456,14 +456,9 @@ sclp_emit_buffer(struct sclp_buffer *buffer,
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
sccb = buffer->sccb;
|
sccb = buffer->sccb;
|
||||||
if (sclp_rw_event.sclp_receive_mask & EVTYP_MSG_MASK)
|
/* Use normal write message */
|
||||||
/* Use normal write message */
|
sccb->msg_buf.header.type = EVTYP_MSG;
|
||||||
sccb->msg_buf.header.type = EVTYP_MSG;
|
|
||||||
else if (sclp_rw_event.sclp_receive_mask & EVTYP_PMSGCMD_MASK)
|
|
||||||
/* Use write priority message */
|
|
||||||
sccb->msg_buf.header.type = EVTYP_PMSGCMD;
|
|
||||||
else
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
buffer->request.command = SCLP_CMDW_WRITE_EVENT_DATA;
|
buffer->request.command = SCLP_CMDW_WRITE_EVENT_DATA;
|
||||||
buffer->request.status = SCLP_REQ_FILLED;
|
buffer->request.status = SCLP_REQ_FILLED;
|
||||||
buffer->request.callback = sclp_writedata_callback;
|
buffer->request.callback = sclp_writedata_callback;
|
||||||
|
|
|
@ -206,10 +206,6 @@ sclp_vt220_callback(struct sclp_req *request, void *data)
|
||||||
static int
|
static int
|
||||||
__sclp_vt220_emit(struct sclp_vt220_request *request)
|
__sclp_vt220_emit(struct sclp_vt220_request *request)
|
||||||
{
|
{
|
||||||
if (!(sclp_vt220_register.sclp_receive_mask & EVTYP_VT220MSG_MASK)) {
|
|
||||||
request->sclp_req.status = SCLP_REQ_FAILED;
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
request->sclp_req.command = SCLP_CMDW_WRITE_EVENT_DATA;
|
request->sclp_req.command = SCLP_CMDW_WRITE_EVENT_DATA;
|
||||||
request->sclp_req.status = SCLP_REQ_FILLED;
|
request->sclp_req.status = SCLP_REQ_FILLED;
|
||||||
request->sclp_req.callback = sclp_vt220_callback;
|
request->sclp_req.callback = sclp_vt220_callback;
|
||||||
|
|
Loading…
Reference in New Issue