Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89286320 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by Martin Schwidefsky
Browse files

s390/qdio: clear intparm during shutdown



During shutdown, qdio returns its ccw device back to control by the
upper-layer driver. But there is a remote chance that by the time where the
IRQ handler gets switched back, the interrupt for the preceding
ccw_device_{clear,halt} hasn't been presented yet.
Upper-layer drivers would then need to handle this IRQ - and since the IO
is issued with an intparm, it could very well be confused with whatever
intparm mechanism the driver uses itself (eg intparm == request address).

So when switching over the IRQ handler, also clear the intparm and have
upper-layer drivers deal with any such delayed interrupt as if it was
unsolicited.

Suggested-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent ab7efda4
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -1207,8 +1207,10 @@ int qdio_shutdown(struct ccw_device *cdev, int how)
	qdio_shutdown_thinint(irq_ptr);

	/* restore interrupt handler */
	if ((void *)cdev->handler == (void *)qdio_int_handler)
	if ((void *)cdev->handler == (void *)qdio_int_handler) {
		cdev->handler = irq_ptr->orig_handler;
		cdev->private->intparm = 0;
	}
	spin_unlock_irq(get_ccwdev_lock(cdev));

	qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE);