Commit fc362e2e authored by Hendrik Brueckner's avatar Hendrik Brueckner Committed by Benjamin Herrenschmidt
Browse files

hvc_console: Add a hangup notifier for backends



I have added a hangup notifier that can be used by hvc console
backends to handle a tty hangup. The default irq hangup notifier
calls the notifier_del_irq() for compatibility.

Acked-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: default avatarHendrik Brueckner <brueckner@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent a02efb90
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -418,8 +418,8 @@ static void hvc_hangup(struct tty_struct *tty)

	spin_unlock_irqrestore(&hp->lock, flags);

	if (hp->ops->notifier_del)
			hp->ops->notifier_del(hp, hp->data);
	if (hp->ops->notifier_hangup)
			hp->ops->notifier_hangup(hp, hp->data);

	while(temp_open_count) {
		--temp_open_count;
+3 −1
Original line number Diff line number Diff line
@@ -65,9 +65,10 @@ struct hv_ops {
	int (*get_chars)(uint32_t vtermno, char *buf, int count);
	int (*put_chars)(uint32_t vtermno, const char *buf, int count);

	/* Callbacks for notification. Called in open and close */
	/* Callbacks for notification. Called in open, close and hangup */
	int (*notifier_add)(struct hvc_struct *hp, int irq);
	void (*notifier_del)(struct hvc_struct *hp, int irq);
	void (*notifier_hangup)(struct hvc_struct *hp, int irq);
};

/* Register a vterm and a slot index for use as a console (console_init) */
@@ -86,6 +87,7 @@ void hvc_kick(void);
/* default notifier for irq based notification */
extern int notifier_add_irq(struct hvc_struct *hp, int data);
extern void notifier_del_irq(struct hvc_struct *hp, int data);
extern void notifier_hangup_irq(struct hvc_struct *hp, int data);


#if defined(CONFIG_XMON) && defined(CONFIG_SMP)
+5 −0
Original line number Diff line number Diff line
@@ -42,3 +42,8 @@ void notifier_del_irq(struct hvc_struct *hp, int irq)
	free_irq(irq, hp);
	hp->irq_requested = 0;
}

void notifier_hangup_irq(struct hvc_struct *hp, int irq)
{
	notifier_del_irq(hp, irq);
}
+1 −0
Original line number Diff line number Diff line
@@ -202,6 +202,7 @@ static struct hv_ops hvc_get_put_ops = {
	.put_chars = put_chars,
	.notifier_add = notifier_add_irq,
	.notifier_del = notifier_del_irq,
	.notifier_hangup = notifier_hangup_irq,
};

static int __devinit hvc_vio_probe(struct vio_dev *vdev,
+1 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ static struct hv_ops hvc_get_put_ops = {
	.put_chars = hvc_put_chars,
	.notifier_add = notifier_add_irq,
	.notifier_del = notifier_del_irq,
	.notifier_hangup = notifier_hangup_irq,
};

static int __devinit hvc_vio_probe(struct vio_dev *vdev,
Loading