Commit d082d3ce authored by Peter Oberparleiter's avatar Peter Oberparleiter Committed by Martin Schwidefsky

[S390] sclp: clean up send/receive naming scheme

Make state change events adjust the correct mask by cleaning up
naming inconsistencies. Also remove chance for lockup by removing
unnecessary mask related check before reading events.
Signed-off-by: default avatarPeter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 06cb92ff
...@@ -29,10 +29,10 @@ static ext_int_info_t ext_int_info_hwc; ...@@ -29,10 +29,10 @@ static ext_int_info_t ext_int_info_hwc;
/* Lock to protect internal data consistency. */ /* Lock to protect internal data consistency. */
static DEFINE_SPINLOCK(sclp_lock); static DEFINE_SPINLOCK(sclp_lock);
/* Mask of events that we can receive from the sclp interface. */ /* Mask of events that we can send to the sclp interface. */
static sccb_mask_t sclp_receive_mask; static sccb_mask_t sclp_receive_mask;
/* Mask of events that we can send to the sclp interface. */ /* Mask of events that we can receive from the sclp interface. */
static sccb_mask_t sclp_send_mask; static sccb_mask_t sclp_send_mask;
/* List of registered event listeners and senders. */ /* List of registered event listeners and senders. */
...@@ -380,7 +380,7 @@ sclp_interrupt_handler(__u16 code) ...@@ -380,7 +380,7 @@ sclp_interrupt_handler(__u16 code)
} }
sclp_running_state = sclp_running_state_idle; sclp_running_state = sclp_running_state_idle;
} }
if (evbuf_pending && sclp_receive_mask != 0 && if (evbuf_pending &&
sclp_activation_state == sclp_activation_state_active) sclp_activation_state == sclp_activation_state_active)
__sclp_queue_read_req(); __sclp_queue_read_req();
spin_unlock(&sclp_lock); spin_unlock(&sclp_lock);
...@@ -459,8 +459,8 @@ sclp_dispatch_state_change(void) ...@@ -459,8 +459,8 @@ sclp_dispatch_state_change(void)
reg = NULL; reg = NULL;
list_for_each(l, &sclp_reg_list) { list_for_each(l, &sclp_reg_list) {
reg = list_entry(l, struct sclp_register, list); reg = list_entry(l, struct sclp_register, list);
receive_mask = reg->receive_mask & sclp_receive_mask; receive_mask = reg->send_mask & sclp_receive_mask;
send_mask = reg->send_mask & sclp_send_mask; send_mask = reg->receive_mask & sclp_send_mask;
if (reg->sclp_receive_mask != receive_mask || if (reg->sclp_receive_mask != receive_mask ||
reg->sclp_send_mask != send_mask) { reg->sclp_send_mask != send_mask) {
reg->sclp_receive_mask = receive_mask; reg->sclp_receive_mask = receive_mask;
...@@ -615,8 +615,8 @@ struct init_sccb { ...@@ -615,8 +615,8 @@ struct init_sccb {
u16 mask_length; u16 mask_length;
sccb_mask_t receive_mask; sccb_mask_t receive_mask;
sccb_mask_t send_mask; sccb_mask_t send_mask;
sccb_mask_t sclp_send_mask;
sccb_mask_t sclp_receive_mask; sccb_mask_t sclp_receive_mask;
sccb_mask_t sclp_send_mask;
} __attribute__((packed)); } __attribute__((packed));
/* Prepare init mask request. Called while sclp_lock is locked. */ /* Prepare init mask request. Called while sclp_lock is locked. */
......
...@@ -122,11 +122,13 @@ struct sclp_req { ...@@ -122,11 +122,13 @@ struct sclp_req {
/* of some routines it wants to be called from the low level driver */ /* of some routines it wants to be called from the low level driver */
struct sclp_register { struct sclp_register {
struct list_head list; struct list_head list;
/* event masks this user is registered for */ /* User wants to receive: */
sccb_mask_t receive_mask; sccb_mask_t receive_mask;
/* User wants to send: */
sccb_mask_t send_mask; sccb_mask_t send_mask;
/* actually present events */ /* H/W can receive: */
sccb_mask_t sclp_receive_mask; sccb_mask_t sclp_receive_mask;
/* H/W can send: */
sccb_mask_t sclp_send_mask; sccb_mask_t sclp_send_mask;
/* called if event type availability changes */ /* called if event type availability changes */
void (*state_change_fn)(struct sclp_register *); void (*state_change_fn)(struct sclp_register *);
......
...@@ -64,7 +64,7 @@ static int __init sclp_conf_init(void) ...@@ -64,7 +64,7 @@ static int __init sclp_conf_init(void)
return rc; return rc;
} }
if (!(sclp_conf_register.sclp_receive_mask & EVTYP_CONFMGMDATA_MASK)) { if (!(sclp_conf_register.sclp_send_mask & EVTYP_CONFMGMDATA_MASK)) {
printk(KERN_WARNING TAG "no configuration management.\n"); printk(KERN_WARNING TAG "no configuration management.\n");
sclp_unregister(&sclp_conf_register); sclp_unregister(&sclp_conf_register);
rc = -ENOSYS; rc = -ENOSYS;
......
...@@ -129,7 +129,7 @@ static int cpi_req(void) ...@@ -129,7 +129,7 @@ static int cpi_req(void)
"to hardware console.\n"); "to hardware console.\n");
goto out; goto out;
} }
if (!(sclp_cpi_event.sclp_send_mask & EVTYP_CTLPROGIDENT_MASK)) { if (!(sclp_cpi_event.sclp_receive_mask & EVTYP_CTLPROGIDENT_MASK)) {
printk(KERN_WARNING "cpi: no control program " printk(KERN_WARNING "cpi: no control program "
"identification support\n"); "identification support\n");
rc = -EOPNOTSUPP; rc = -EOPNOTSUPP;
......
...@@ -452,10 +452,10 @@ sclp_emit_buffer(struct sclp_buffer *buffer, ...@@ -452,10 +452,10 @@ sclp_emit_buffer(struct sclp_buffer *buffer,
return -EIO; return -EIO;
sccb = buffer->sccb; sccb = buffer->sccb;
if (sclp_rw_event.sclp_send_mask & EVTYP_MSG_MASK) 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_send_mask & EVTYP_PMSGCMD_MASK) else if (sclp_rw_event.sclp_receive_mask & EVTYP_PMSGCMD_MASK)
/* Use write priority message */ /* Use write priority message */
sccb->msg_buf.header.type = EVTYP_PMSGCMD; sccb->msg_buf.header.type = EVTYP_PMSGCMD;
else else
......
...@@ -202,7 +202,7 @@ sclp_vt220_callback(struct sclp_req *request, void *data) ...@@ -202,7 +202,7 @@ 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_send_mask & EVTYP_VT220MSG_MASK)) { if (!(sclp_vt220_register.sclp_receive_mask & EVTYP_VT220MSG_MASK)) {
request->sclp_req.status = SCLP_REQ_FAILED; request->sclp_req.status = SCLP_REQ_FAILED;
return -EIO; return -EIO;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment