sparc64: vcc: Enable LDC event processing engine
authorJag Raman <jag.raman@oracle.com>
Tue, 15 Aug 2017 21:03:03 +0000 (17:03 -0400)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Aug 2017 04:33:52 +0000 (21:33 -0700)
Enable event processing engine to handle LDC events

Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
Reviewed-by: Shannon Nelson <shannon.nelson@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/tty/vcc.c

index 27566d5..91f663d 100644 (file)
@@ -437,8 +437,42 @@ done:
        vcc_put(port, false);
 }
 
+/**
+ * vcc_event() - LDC event processing engine
+ * @arg: VCC private data
+ * @event: LDC event
+ *
+ * Handles LDC events for VCC
+ */
 static void vcc_event(void *arg, int event)
 {
+       struct vio_driver_state *vio;
+       struct vcc_port *port;
+       unsigned long flags;
+       int rv;
+
+       port = arg;
+       vio = &port->vio;
+
+       spin_lock_irqsave(&port->lock, flags);
+
+       switch (event) {
+       case LDC_EVENT_RESET:
+       case LDC_EVENT_UP:
+               vio_link_state_change(vio, event);
+               break;
+
+       case LDC_EVENT_DATA_READY:
+               rv = vcc_ldc_read(port);
+               if (rv == -ECONNRESET)
+                       vio_conn_reset(vio);
+               break;
+
+       default:
+               pr_err("VCC: unexpected LDC event(%d)\n", event);
+       }
+
+       spin_unlock_irqrestore(&port->lock, flags);
 }
 
 static struct ldc_channel_config vcc_ldc_cfg = {