mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2402f958cf
commit
98d86d87aa
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user