Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

comedi: 8255: Fail to attach if fail to request I/O port region

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>

authored by

Ian Abbott and committed by
Greg Kroah-Hartman
98d86d87 2402f958

+9 -11
+9 -11
drivers/comedi/drivers/8255.c
··· 77 77 * base address of the chip. 78 78 */ 79 79 ret = __comedi_request_region(dev, iobase, I8255_SIZE); 80 + if (ret) 81 + return ret; 82 + ret = subdev_8255_io_init(dev, s, iobase); 80 83 if (ret) { 84 + /* 85 + * Release the I/O port region here, as the 86 + * "detach" handler cannot find it. 87 + */ 88 + release_region(iobase, I8255_SIZE); 81 89 s->type = COMEDI_SUBD_UNUSED; 82 - } else { 83 - ret = subdev_8255_io_init(dev, s, iobase); 84 - if (ret) { 85 - /* 86 - * Release the I/O port region here, as the 87 - * "detach" handler cannot find it. 88 - */ 89 - release_region(iobase, I8255_SIZE); 90 - s->type = COMEDI_SUBD_UNUSED; 91 - return ret; 92 - } 90 + return ret; 93 91 } 94 92 } 95 93