[PATCH net] net: starfire: Disable PCI device on probe failures

From: Myeonghun Pak

Date: Mon Sep 14 2026 - 22:07:45 EST


starfire_init_one() enables the PCI device but leaves it enabled on
subsequent probe failures. Route all failures after successful enablement
through pci_disable_device(), preserving the existing error codes and
resource unwind order.

This issue is already present in the initial Git import; its pre-Git
introduction is unknown.

This issue was identified during our ongoing static-analysis research
while reviewing kernel code.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@xxxxxxxxxxxxxxx
Assisted-by: LLM
Co-developed-by: Ijae Kim <ae878000@xxxxxxxxx>
Signed-off-by: Ijae Kim <ae878000@xxxxxxxxx>
Signed-off-by: Myeonghun Pak <mhun512@xxxxxxxxx>
---
drivers/net/ethernet/adaptec/starfire.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/adaptec/starfire.c b/drivers/net/ethernet/adaptec/starfire.c
index f1109d9..f7bd765 100644
--- a/drivers/net/ethernet/adaptec/starfire.c
+++ b/drivers/net/ethernet/adaptec/starfire.c
@@ -638,6 +638,7 @@ static int starfire_init_one(struct pci_dev *pdev,
void __iomem *base;
int drv_flags, io_size;
int boguscnt;
+ int err = -ENODEV;

if (pci_enable_device (pdev))
return -EIO;
@@ -646,12 +647,14 @@ static int starfire_init_one(struct pci_dev *pdev,
io_size = pci_resource_len(pdev, 0);
if (!ioaddr || ((pci_resource_flags(pdev, 0) & IORESOURCE_MEM) == 0)) {
dev_err(d, "no PCI MEM resources, aborting\n");
- return -ENODEV;
+ goto err_out_disable;
}

dev = alloc_etherdev(sizeof(*np));
- if (!dev)
- return -ENOMEM;
+ if (!dev) {
+ err = -ENOMEM;
+ goto err_out_disable;
+ }

SET_NETDEV_DEV(dev, &pdev->dev);

@@ -818,7 +821,9 @@ err_out_free_res:
pci_release_regions (pdev);
err_out_free_netdev:
free_netdev(dev);
- return -ENODEV;
+err_out_disable:
+ pci_disable_device(pdev);
+ return err;
}