Skip to content

Commit 98d86d8

Browse files
ian-abbottgregkh
authored andcommitted
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>
1 parent 2402f95 commit 98d86d8

1 file changed

Lines changed: 9 additions & 11 deletions

File tree

drivers/comedi/drivers/8255.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,17 @@ static int dev_8255_attach(struct comedi_device *dev,
7777
* base address of the chip.
7878
*/
7979
ret = __comedi_request_region(dev, iobase, I8255_SIZE);
80+
if (ret)
81+
return ret;
82+
ret = subdev_8255_io_init(dev, s, iobase);
8083
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);
8189
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;
9391
}
9492
}
9593

0 commit comments

Comments
 (0)