]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
comedi: 8255: Fail to attach if fail to request I/O port region
authorIan Abbott <abbotti@mev.co.uk>
Tue, 28 Oct 2025 11:28:33 +0000 (11:28 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Nov 2025 13:20:20 +0000 (14:20 +0100)
The COMEDI standalone 8255 driver can be used to configure a COMEDI
device consisting of one of more subdevices, each using an 8255 digital
I/O chip mapped to a range of port I/O addresses.  The base port I/O
address of each chip is specified in an array of integer option values
by the `COMEDI_DEVCONFIG` ioctl.

When support for multiple 8255 subdevices per device was added in the
out-of-tree comedi 0.7.27 back in 1999, if any port I/O region could not
be requested, then the corresponding subdevice was set to be an "unused"
subdevice, and the COMEDI device would still be set-up OK as long as
those were the only types of errors.  That has persisted until the
present day, but seems a bit odd in retrospect.  All the other COMEDI
drivers that use port I/O or memory regions will fail to set up the
device if any region cannot be requested.  It seems unlikely that the
sys admin would deliberately choose a port that cannot be requested just
to leave a gap in the device's usable subdevice numbers, and failing to
set-up the device will provide a more noticeable indication that
something hasn't been set-up correctly, so change the driver to fail to
set up the device if any of the port I/O regions cannot be requested.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Link: https://patch.msgid.link/20251028112833.15033-1-abbotti@mev.co.uk
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/comedi/drivers/8255.c

index f45f7bd1c61a7c55b0d42e41f7157e325d61860a..5f70938b44773821e70965b5b49c23232e1b3f10 100644 (file)
@@ -77,19 +77,17 @@ static int dev_8255_attach(struct comedi_device *dev,
                 * base address of the chip.
                 */
                ret = __comedi_request_region(dev, iobase, I8255_SIZE);
+               if (ret)
+                       return ret;
+               ret = subdev_8255_io_init(dev, s, iobase);
                if (ret) {
+                       /*
+                        * Release the I/O port region here, as the
+                        * "detach" handler cannot find it.
+                        */
+                       release_region(iobase, I8255_SIZE);
                        s->type = COMEDI_SUBD_UNUSED;
-               } else {
-                       ret = subdev_8255_io_init(dev, s, iobase);
-                       if (ret) {
-                               /*
-                                * Release the I/O port region here, as the
-                                * "detach" handler cannot find it.
-                                */
-                               release_region(iobase, I8255_SIZE);
-                               s->type = COMEDI_SUBD_UNUSED;
-                               return ret;
-                       }
+                       return ret;
                }
        }