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

Commit 32663b8b authored by Alistair Popple's avatar Alistair Popple Committed by David S. Miller
Browse files

ibm emac: Fix locking for enable/disable eob irq



Calls to mal_enable_eob_irq perform a read-write-modify of a dcr to
enable device irqs which is protected by a spin lock. However calls to
mal_disable_eob_irq do not take the corresponding lock.

This patch resolves the problem by ensuring that calls to
mal_disable_eob_irq also take the lock.

Signed-off-by: default avatarAlistair Popple <alistair@popple.id.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b4dfd326
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -263,7 +263,9 @@ static inline void mal_schedule_poll(struct mal_instance *mal)
{
	if (likely(napi_schedule_prep(&mal->napi))) {
		MAL_DBG2(mal, "schedule_poll" NL);
		spin_lock(&mal->lock);
		mal_disable_eob_irq(mal);
		spin_unlock(&mal->lock);
		__napi_schedule(&mal->napi);
	} else
		MAL_DBG2(mal, "already in poll" NL);
@@ -445,7 +447,9 @@ static int mal_poll(struct napi_struct *napi, int budget)
			if (!napi_reschedule(napi))
				goto more_work;

			spin_lock_irqsave(&mal->lock, flags);
			mal_disable_eob_irq(mal);
			spin_unlock_irqrestore(&mal->lock, flags);
			goto again;
		}
		mc->ops->poll_tx(mc->dev);