From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B84B43E2AD6 for ; Tue, 30 Jun 2026 09:24:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.182 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782811466; cv=none; b=rZaGGoVgU8zCi3TmBEHxqT7wyk3Ju9X/nOmPNcnQ/BXR1WZtjjPhTOQpMsGjWO4fuWqIJUvDq9Rc25qW2wE/QNBrDRoYmS5mSUgWxJKWIz4wcvm4Lpt6IAW8G5lhICO5TfDy+kE9/SWFLJkNH+yk+PWtqULx4H1OknabDMWSnQc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782811466; c=relaxed/simple; bh=DJU7wYUKdNFg9ZqYUQthIv9jdYxFb3W3uC/e5j7n+kw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=Lv0NQkYotrAlJXiK3ozeEwC17I41Q/IFJhvlIMfd8VHUI8R3jKdl1lsjawJ4rpttBMc1TboyZ7b5S7mKWGqyGC1MMOb92nYIbjyX2IbejShBx6UZmssM1QK8HWdvlFv1Ufh171Tq3PydPy1+V4qy8yovqMUV5nLISvc4hRG/1Vk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ABgt/33n; arc=none smtp.client-ip=209.85.208.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ABgt/33n" Received: by mail-lj1-f182.google.com with SMTP id 38308e7fff4ca-39b1eab2f29so3801091fa.0 for ; Tue, 30 Jun 2026 02:24:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782811461; x=1783416261; darn=vger.kernel.org; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to; bh=id0JzR8DMFgNaaYwE+5av5VFyxJ1aUPJggiRjKz1CuI=; b=ABgt/33n+sIvZALm4VitD0P9TNjgCFr4sVR0g30BJFKiwjIm3OfwGLib7GjIIfMyV7 O6pkejLGVXECQlsss5L2h3hR5usDulXviSqTEz1MttIImcxGmwwerfvRBNh95kIvjh1a T+EpqHSOUrc+hU8md31a5PrOphZth+BP6AsmRHQpYXoMmuorIa4VQ/pkKvg3TP9UzUY2 P2QFpIOGc3Ix64rTge8aysvYAui+LdHPXFnozUIvpk8DFYfPb/7FPtn1SHPscbx9kbA2 dMk/ji7OMQt6JfLgcls2blHT09jx0+4BSKna8KVfPJIV4DhTi/uHJjYaXkHLpUZwyww7 q+Mw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782811461; x=1783416261; h=references:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=id0JzR8DMFgNaaYwE+5av5VFyxJ1aUPJggiRjKz1CuI=; b=CuJZprOnLs3vgtrQd4War5okdtw3945pUyBXCzio/hPQO07B/ofMLiUn5FBkhY94eH qtusQJwOGtkfl+/Cx264pcL75dIWQRaGa9TNytngGOx66Xanoq/TBy2UdKrjAATo7rwo JC1p3iwJqRZvwBlRbkFSiKjscr7W7xl0TiL2JKUodbtNCaXbEeZfEdTNPS46NItvbx94 6Z8sbBzAxeZF3vdFqL1mJhfzIP0E0srwlFHq2ypthoq0jBjYOFrcAHFl2QqknV5Q1xY5 ra+2/lnwfe4bL6ecLi17C/lyIFOYbYpckaD+Ns98NGJDEpdaJMBDWkRfVP0zxs9AlXeG qSMg== X-Forwarded-Encrypted: i=1; AHgh+RrbIo3j5g+RlrjVy6MS0sWOcjTO+VYmhTFnEm33tBn8cw/lE/MAq/JTy2TV473/vVb3qx8F3DafWMh43+4=@vger.kernel.org X-Gm-Message-State: AOJu0Yxq9bh7q5PCJlqM9cut5wFZ4PTX6tdqc4UsFbuLPzW+AGJsFeZE xr4i4Hm2M7w6D1yhB1IJqsbaolksCo6kzOk8eBS8q598RtvfMLjjuirh X-Gm-Gg: AfdE7cmCBpBY1CbzrwM7Hu4CpD6gTDDchhINDCW9OYj0AXbi0r7wGuoSpqJ1wxBoup6 gS74Lsrf7zOEhYnhmZz776aIcT6wrxaHAENOczqg30Bm/G+AVHibUBxuzsPs6fNT2Wigkotxcz9 YrtqPVBEHXkEXWzvJLt6XFsNaKBGEb+nWsfzGzEwtn9FMsKjhRYOuAPKT7eafgD+KjMCOr9z5sf 26He11W/Gc456ni7QfCUzKowSCrXOmsojhpTbYv2uTzdNMsozjVYo8+SJ2UR3s+5UPo/321m+8e thEDCnNKUY7qSiIXtYQUyVFpkF2vZUPhGaKOsf/FHEw694Gye68Nux4uvIaUgugWfuviVTYaZru NUQ0WXgdnMj7FNfjQBSpsvZ+ddXkiV9QqOiZ3jej+sc434PcXsuGkVpFk9w3Zgt+pTuIJCsKzvt h7IkgJM9VmcumqKA5mTt1k/Izqkj7YjNqiwbpCf/W71dL9KRmzbrw= X-Received: by 2002:a05:6512:3da8:b0:5ae:a9ed:35a7 with SMTP id 2adb3069b0e04-5aebf98a85bmr305577e87.32.1782811460452; Tue, 30 Jun 2026 02:24:20 -0700 (PDT) Received: from localhost (c-85-228-45-68.bbcust.telenor.se. [85.228.45.68]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5aebe4aa014sm409209e87.77.2026.06.30.02.24.19 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Tue, 30 Jun 2026 02:24:20 -0700 (PDT) From: Eli Billauer To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-kernel@vger.kernel.org, Eli Billauer Subject: [PATCH 7/7] char: xillybus: Ignore and report unsolicited interrupts Date: Tue, 30 Jun 2026 11:23:30 +0200 Message-Id: <20260630092330.43534-8-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260630092330.43534-1-eli.billauer@gmail.com> References: <20260630092330.43534-1-eli.billauer@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: During initialization, the hardware should issue interrupts only in response to requests from the host. Ignore and log unexpected interrupts, as these indicate misbehaving hardware. In the same spirit, in xilly_quiesce(), assign endpoint->num_channels = 0 before allowing the ISR, in order to expose whether the hardware incorrectly sends messages related to data channels during shutdown. Signed-off-by: Eli Billauer --- drivers/char/xillybus/xillybus.h | 3 ++ drivers/char/xillybus/xillybus_core.c | 46 ++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/drivers/char/xillybus/xillybus.h b/drivers/char/xillybus/xillybus.h index 51de7cbc579e..98c7ac4dd1f9 100644 --- a/drivers/char/xillybus/xillybus.h +++ b/drivers/char/xillybus/xillybus.h @@ -94,6 +94,9 @@ struct xilly_endpoint { __iomem void *registers; int fatal_error; + bool allow_isr; + spinlock_t allow_isr_lock; + struct mutex register_mutex; wait_queue_head_t ep_wait; diff --git a/drivers/char/xillybus/xillybus_core.c b/drivers/char/xillybus/xillybus_core.c index 3436f16092e0..ea0debe24968 100644 --- a/drivers/char/xillybus/xillybus_core.c +++ b/drivers/char/xillybus/xillybus_core.c @@ -72,6 +72,8 @@ static struct workqueue_struct *xillybus_wq; * * rd_spinlock does the same with rd_*_buf_idx, rd_empty and end_offset. * + * allow_isr_lock protects allow_isr. + * * register_mutex is endpoint-specific, and is held when non-atomic * register operations are performed. wr_mutex and rd_mutex may be * held when register_mutex is taken, but none of the spinlocks. Note that @@ -84,7 +86,8 @@ static struct workqueue_struct *xillybus_wq; * Only interruptible blocking is allowed on mutexes and wait queues. * * All in all, the locking order goes (with skips allowed, of course): - * wr_mutex -> rd_mutex -> register_mutex -> wr_spinlock -> rd_spinlock + * wr_mutex -> rd_mutex -> register_mutex -> + * allow_isr_lock -> wr_spinlock -> rd_spinlock */ static void malformed_message(struct xilly_endpoint *endpoint, u32 *buf) @@ -119,6 +122,13 @@ irqreturn_t xillybus_isr(int irq, void *data) unsigned int msg_channel, msg_bufno, msg_data, msg_dir; struct xilly_channel *channel; + guard(spinlock)(&ep->allow_isr_lock); + + if (!ep->allow_isr) { + dev_err_ratelimited(ep->dev, "Unexpected interrupt! Something is wrong with the hardware.\n"); + return IRQ_HANDLED; + } + buf = ep->msgbuf_addr; buf_size = ep->msg_buf_size/sizeof(u32); @@ -283,6 +293,19 @@ irqreturn_t xillybus_isr(int irq, void *data) } EXPORT_SYMBOL(xillybus_isr); +/* + * xilly_allow_isr() is similar to enabling / disabling the interrupt, + * with the difference that if an interrupt is issued while ep->allow_isr + * is false, this is visible in the kernel log. + */ + +static void xilly_allow_isr(struct xilly_endpoint *ep, bool newstate) +{ + guard(spinlock_irqsave)(&ep->allow_isr_lock); + + ep->allow_isr = newstate; +} + /* * A few trivial memory management functions. * NOTE: These functions are used only on probe and remove, and therefore @@ -651,6 +674,8 @@ static int xilly_obtain_idt(struct xilly_endpoint *endpoint) channel->wr_sleepy = 1; + xilly_allow_isr(endpoint, true); + iowrite32(1 | (3 << 24), /* Opcode 3 for channel 0 = Send IDT */ endpoint->registers + fpga_buf_ctrl_reg); @@ -659,6 +684,8 @@ static int xilly_obtain_idt(struct xilly_endpoint *endpoint) (!channel->wr_sleepy), XILLY_TIMEOUT); + xilly_allow_isr(endpoint, false); + if (t <= 0) { dev_err(endpoint->dev, "Failed to obtain IDT. Aborting.\n"); @@ -1843,6 +1870,9 @@ struct xilly_endpoint *xillybus_init_endpoint(struct device *dev) endpoint->failed_messages = 0; endpoint->fatal_error = 0; + endpoint->allow_isr = false; + spin_lock_init(&endpoint->allow_isr_lock); + init_waitqueue_head(&endpoint->ep_wait); mutex_init(&endpoint->register_mutex); @@ -1855,6 +1885,9 @@ static int xilly_quiesce(struct xilly_endpoint *endpoint) long t; endpoint->idtlen = -1; + endpoint->num_channels = 0; + + xilly_allow_isr(endpoint, true); iowrite32((u32) (endpoint->dma_using_dac & 0x0001), endpoint->registers + fpga_dma_control_reg); @@ -1862,6 +1895,9 @@ static int xilly_quiesce(struct xilly_endpoint *endpoint) t = wait_event_interruptible_timeout(endpoint->ep_wait, (endpoint->idtlen >= 0), XILLY_TIMEOUT); + + xilly_allow_isr(endpoint, false); + if (t <= 0) { dev_err(endpoint->dev, "Failed to quiesce the device on exit.\n"); @@ -1915,6 +1951,8 @@ int xillybus_endpoint_discovery(struct xilly_endpoint *endpoint) endpoint->idtlen = -1; + xilly_allow_isr(endpoint, true); + /* * Set DMA 32/64 bit mode, quiesce the device (?!) and get IDT * buffer size. @@ -1925,6 +1963,9 @@ int xillybus_endpoint_discovery(struct xilly_endpoint *endpoint) t = wait_event_interruptible_timeout(endpoint->ep_wait, (endpoint->idtlen >= 0), XILLY_TIMEOUT); + + xilly_allow_isr(endpoint, false); + if (t <= 0) { dev_err(endpoint->dev, "No response from FPGA. Aborting.\n"); return -ENODEV; @@ -1951,6 +1992,7 @@ int xillybus_endpoint_discovery(struct xilly_endpoint *endpoint) if (rc) goto failed_idt; + /* xilly_obtain_idt() allows and then disallows the ISR */ rc = xilly_obtain_idt(endpoint); if (rc) goto failed_idt; @@ -1969,6 +2011,8 @@ int xillybus_endpoint_discovery(struct xilly_endpoint *endpoint) if (rc) goto failed_idt; + xilly_allow_isr(endpoint, true); + rc = xillybus_init_chrdev(dev, &xillybus_fops, endpoint->owner, endpoint, idt_handle.names, -- 2.34.1