aboutsummaryrefslogtreecommitdiff
path: root/drivers/gpib
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpib')
-rw-r--r--drivers/gpib/Kconfig1
-rw-r--r--drivers/gpib/agilent_82350b/agilent_82350b.c7
-rw-r--r--drivers/gpib/agilent_82357a/agilent_82357a.c9
-rw-r--r--drivers/gpib/cb7210/cb7210.c11
-rw-r--r--drivers/gpib/cec/cec_gpib.c11
-rw-r--r--drivers/gpib/common/gpib_os.c127
-rw-r--r--drivers/gpib/common/iblib.c5
-rw-r--r--drivers/gpib/eastwood/fluke_gpib.c5
-rw-r--r--drivers/gpib/fmh_gpib/fmh_gpib.c5
-rw-r--r--drivers/gpib/gpio/gpib_bitbang.c11
-rw-r--r--drivers/gpib/hp_82335/hp82335.c9
-rw-r--r--drivers/gpib/hp_82341/hp_82341.c7
-rw-r--r--drivers/gpib/include/gpib_types.h8
-rw-r--r--drivers/gpib/ines/ines_gpib.c13
-rw-r--r--drivers/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c221
-rw-r--r--drivers/gpib/nec7210/nec7210.c12
-rw-r--r--drivers/gpib/ni_usb/ni_usb_gpib.c25
-rw-r--r--drivers/gpib/pc2/pc2_gpib.c11
-rw-r--r--drivers/gpib/tms9914/tms9914.c13
-rw-r--r--drivers/gpib/tnt4882/mite.c2
-rw-r--r--drivers/gpib/tnt4882/tnt4882_gpib.c22
21 files changed, 285 insertions, 250 deletions
diff --git a/drivers/gpib/Kconfig b/drivers/gpib/Kconfig
index eeb50956ce85..d43a28c62ed7 100644
--- a/drivers/gpib/Kconfig
+++ b/drivers/gpib/Kconfig
@@ -122,6 +122,7 @@ config GPIB_FLUKE
depends on OF
select GPIB_COMMON
select GPIB_NEC7210
+ depends on HAS_IOMEM
help
GPIB driver for Fluke based cda devices.
diff --git a/drivers/gpib/agilent_82350b/agilent_82350b.c b/drivers/gpib/agilent_82350b/agilent_82350b.c
index 01a5bb43cd2d..9787c09faad8 100644
--- a/drivers/gpib/agilent_82350b/agilent_82350b.c
+++ b/drivers/gpib/agilent_82350b/agilent_82350b.c
@@ -481,7 +481,7 @@ static void agilent_82350b_return_to_local(struct gpib_board *board)
static int agilent_82350b_allocate_private(struct gpib_board *board)
{
- board->private_data = kzalloc(sizeof(struct agilent_82350b_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct agilent_82350b_priv);
if (!board->private_data)
return -ENOMEM;
return 0;
@@ -599,8 +599,9 @@ static int agilent_82350b_generic_attach(struct gpib_board *board,
board->status = 0;
- if (agilent_82350b_allocate_private(board))
- return -ENOMEM;
+ retval = agilent_82350b_allocate_private(board);
+ if (retval)
+ return retval;
a_priv = board->private_data;
a_priv->using_fifos = use_fifos;
tms_priv = &a_priv->tms9914_priv;
diff --git a/drivers/gpib/agilent_82357a/agilent_82357a.c b/drivers/gpib/agilent_82357a/agilent_82357a.c
index 77c8e549b208..770ba6eb40d1 100644
--- a/drivers/gpib/agilent_82357a/agilent_82357a.c
+++ b/drivers/gpib/agilent_82357a/agilent_82357a.c
@@ -1196,7 +1196,7 @@ static int agilent_82357a_allocate_private(struct gpib_board *board)
{
struct agilent_82357a_priv *a_priv;
- board->private_data = kzalloc(sizeof(struct agilent_82357a_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct agilent_82357a_priv);
if (!board->private_data)
return -ENOMEM;
a_priv = board->private_data;
@@ -1316,7 +1316,7 @@ static int agilent_82357a_attach(struct gpib_board *board, const struct gpib_boa
return -ERESTARTSYS;
retval = agilent_82357a_allocate_private(board);
- if (retval < 0) {
+ if (retval) {
mutex_unlock(&agilent_82357a_hotplug_lock);
return retval;
}
@@ -1479,7 +1479,7 @@ static int agilent_82357a_driver_probe(struct usb_interface *interface,
if (mutex_lock_interruptible(&agilent_82357a_hotplug_lock))
return -ERESTARTSYS;
- usb_dev = usb_get_dev(interface_to_usbdev(interface));
+ usb_dev = interface_to_usbdev(interface);
for (i = 0; i < MAX_NUM_82357A_INTERFACES; ++i) {
if (!agilent_82357a_driver_interfaces[i]) {
agilent_82357a_driver_interfaces[i] = interface;
@@ -1490,14 +1490,12 @@ static int agilent_82357a_driver_probe(struct usb_interface *interface,
}
}
if (i == MAX_NUM_82357A_INTERFACES) {
- usb_put_dev(usb_dev);
mutex_unlock(&agilent_82357a_hotplug_lock);
dev_err(&usb_dev->dev, "out of space in agilent_82357a_driver_interfaces[]\n");
return -1;
}
path = kmalloc(path_length, GFP_KERNEL);
if (!path) {
- usb_put_dev(usb_dev);
mutex_unlock(&agilent_82357a_hotplug_lock);
return -ENOMEM;
}
@@ -1539,7 +1537,6 @@ static void agilent_82357a_driver_disconnect(struct usb_interface *interface)
}
if (i == MAX_NUM_82357A_INTERFACES)
dev_err(&usb_dev->dev, "unable to find interface - bug?\n");
- usb_put_dev(usb_dev);
mutex_unlock(&agilent_82357a_hotplug_lock);
}
diff --git a/drivers/gpib/cb7210/cb7210.c b/drivers/gpib/cb7210/cb7210.c
index 24c61b151071..6dd8637c5964 100644
--- a/drivers/gpib/cb7210/cb7210.c
+++ b/drivers/gpib/cb7210/cb7210.c
@@ -856,11 +856,10 @@ static int cb7210_allocate_private(struct gpib_board *board)
{
struct cb7210_priv *priv;
- board->private_data = kmalloc(sizeof(struct cb7210_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct cb7210_priv);
if (!board->private_data)
return -ENOMEM;
priv = board->private_data;
- memset(priv, 0, sizeof(struct cb7210_priv));
init_nec7210_private(&priv->nec7210_priv);
return 0;
}
@@ -876,11 +875,13 @@ static int cb7210_generic_attach(struct gpib_board *board)
{
struct cb7210_priv *cb_priv;
struct nec7210_priv *nec_priv;
+ int retval;
board->status = 0;
- if (cb7210_allocate_private(board))
- return -ENOMEM;
+ retval = cb7210_allocate_private(board);
+ if (retval)
+ return retval;
cb_priv = board->private_data;
nec_priv = &cb_priv->nec7210_priv;
nec_priv->read_byte = nec7210_locking_ioport_read_byte;
@@ -1187,7 +1188,7 @@ static int cb_gpib_probe(struct pcmcia_device *link)
int ret;
/* Allocate space for private device-specific data */
- info = kzalloc(sizeof(*info), GFP_KERNEL);
+ info = kzalloc_obj(*info);
if (!info)
return -ENOMEM;
diff --git a/drivers/gpib/cec/cec_gpib.c b/drivers/gpib/cec/cec_gpib.c
index dbf9b95baabc..c13bc302d9e9 100644
--- a/drivers/gpib/cec/cec_gpib.c
+++ b/drivers/gpib/cec/cec_gpib.c
@@ -220,11 +220,10 @@ static int cec_allocate_private(struct gpib_board *board)
{
struct cec_priv *priv;
- board->private_data = kmalloc(sizeof(struct cec_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct cec_priv);
if (!board->private_data)
- return -1;
+ return -ENOMEM;
priv = board->private_data;
- memset(priv, 0, sizeof(struct cec_priv));
init_nec7210_private(&priv->nec7210_priv);
return 0;
}
@@ -239,11 +238,13 @@ static int cec_generic_attach(struct gpib_board *board)
{
struct cec_priv *cec_priv;
struct nec7210_priv *nec_priv;
+ int retval;
board->status = 0;
- if (cec_allocate_private(board))
- return -ENOMEM;
+ retval = cec_allocate_private(board);
+ if (retval)
+ return retval;
cec_priv = board->private_data;
nec_priv = &cec_priv->nec7210_priv;
nec_priv->read_byte = nec7210_ioport_read_byte;
diff --git a/drivers/gpib/common/gpib_os.c b/drivers/gpib/common/gpib_os.c
index 9dbbac8b8436..5909274ddc12 100644
--- a/drivers/gpib/common/gpib_os.c
+++ b/drivers/gpib/common/gpib_os.c
@@ -199,7 +199,7 @@ int push_status_byte(struct gpib_board *board, struct gpib_status_queue *device,
return retval;
}
- status = kmalloc(sizeof(*status), GFP_KERNEL);
+ status = kmalloc_obj(*status);
if (!status)
return -ENOMEM;
@@ -513,7 +513,7 @@ static int init_gpib_file_private(struct gpib_file_private *priv)
{
memset(priv, 0, sizeof(*priv));
atomic_set(&priv->holding_mutex, 0);
- priv->descriptors[0] = kmalloc(sizeof(struct gpib_descriptor), GFP_KERNEL);
+ priv->descriptors[0] = kmalloc_obj(struct gpib_descriptor);
if (!priv->descriptors[0]) {
pr_err("gpib: failed to allocate default board descriptor\n");
return -ENOMEM;
@@ -537,7 +537,7 @@ int ibopen(struct inode *inode, struct file *filep)
board = &board_array[minor];
- filep->private_data = kmalloc(sizeof(struct gpib_file_private), GFP_KERNEL);
+ filep->private_data = kmalloc_obj(struct gpib_file_private);
if (!filep->private_data)
return -ENOMEM;
@@ -888,10 +888,6 @@ static int read_ioctl(struct gpib_file_private *file_priv, struct gpib_board *bo
if (read_cmd.completed_transfer_count > read_cmd.requested_transfer_count)
return -EINVAL;
- desc = handle_to_descriptor(file_priv, read_cmd.handle);
- if (!desc)
- return -EINVAL;
-
if (WARN_ON_ONCE(sizeof(userbuf) > sizeof(read_cmd.buffer_ptr)))
return -EFAULT;
@@ -904,6 +900,17 @@ static int read_ioctl(struct gpib_file_private *file_priv, struct gpib_board *bo
if (!access_ok(userbuf, remain))
return -EFAULT;
+ /* Lock descriptors to prevent concurrent close from freeing descriptor */
+ if (mutex_lock_interruptible(&file_priv->descriptors_mutex))
+ return -ERESTARTSYS;
+ desc = handle_to_descriptor(file_priv, read_cmd.handle);
+ if (!desc) {
+ mutex_unlock(&file_priv->descriptors_mutex);
+ return -EINVAL;
+ }
+ atomic_inc(&desc->descriptor_busy);
+ mutex_unlock(&file_priv->descriptors_mutex);
+
atomic_set(&desc->io_in_progress, 1);
/* Read buffer loads till we fill the user supplied buffer */
@@ -937,6 +944,7 @@ static int read_ioctl(struct gpib_file_private *file_priv, struct gpib_board *bo
retval = copy_to_user((void __user *)arg, &read_cmd, sizeof(read_cmd));
atomic_set(&desc->io_in_progress, 0);
+ atomic_dec(&desc->descriptor_busy);
wake_up_interruptible(&board->wait);
if (retval)
@@ -964,10 +972,6 @@ static int command_ioctl(struct gpib_file_private *file_priv,
if (cmd.completed_transfer_count > cmd.requested_transfer_count)
return -EINVAL;
- desc = handle_to_descriptor(file_priv, cmd.handle);
- if (!desc)
- return -EINVAL;
-
userbuf = (u8 __user *)(unsigned long)cmd.buffer_ptr;
userbuf += cmd.completed_transfer_count;
@@ -980,6 +984,17 @@ static int command_ioctl(struct gpib_file_private *file_priv,
if (!access_ok(userbuf, remain))
return -EFAULT;
+ /* Lock descriptors to prevent concurrent close from freeing descriptor */
+ if (mutex_lock_interruptible(&file_priv->descriptors_mutex))
+ return -ERESTARTSYS;
+ desc = handle_to_descriptor(file_priv, cmd.handle);
+ if (!desc) {
+ mutex_unlock(&file_priv->descriptors_mutex);
+ return -EINVAL;
+ }
+ atomic_inc(&desc->descriptor_busy);
+ mutex_unlock(&file_priv->descriptors_mutex);
+
/*
* Write buffer loads till we empty the user supplied buffer.
* Call drivers at least once, even if remain is zero, in
@@ -1003,6 +1018,7 @@ static int command_ioctl(struct gpib_file_private *file_priv,
userbuf += bytes_written;
if (retval < 0) {
atomic_set(&desc->io_in_progress, 0);
+ atomic_dec(&desc->descriptor_busy);
wake_up_interruptible(&board->wait);
break;
@@ -1022,6 +1038,7 @@ static int command_ioctl(struct gpib_file_private *file_priv,
*/
if (!no_clear_io_in_prog || fault)
atomic_set(&desc->io_in_progress, 0);
+ atomic_dec(&desc->descriptor_busy);
wake_up_interruptible(&board->wait);
if (fault)
@@ -1047,10 +1064,6 @@ static int write_ioctl(struct gpib_file_private *file_priv, struct gpib_board *b
if (write_cmd.completed_transfer_count > write_cmd.requested_transfer_count)
return -EINVAL;
- desc = handle_to_descriptor(file_priv, write_cmd.handle);
- if (!desc)
- return -EINVAL;
-
userbuf = (u8 __user *)(unsigned long)write_cmd.buffer_ptr;
userbuf += write_cmd.completed_transfer_count;
@@ -1060,6 +1073,17 @@ static int write_ioctl(struct gpib_file_private *file_priv, struct gpib_board *b
if (!access_ok(userbuf, remain))
return -EFAULT;
+ /* Lock descriptors to prevent concurrent close from freeing descriptor */
+ if (mutex_lock_interruptible(&file_priv->descriptors_mutex))
+ return -ERESTARTSYS;
+ desc = handle_to_descriptor(file_priv, write_cmd.handle);
+ if (!desc) {
+ mutex_unlock(&file_priv->descriptors_mutex);
+ return -EINVAL;
+ }
+ atomic_inc(&desc->descriptor_busy);
+ mutex_unlock(&file_priv->descriptors_mutex);
+
atomic_set(&desc->io_in_progress, 1);
/* Write buffer loads till we empty the user supplied buffer */
@@ -1094,6 +1118,7 @@ static int write_ioctl(struct gpib_file_private *file_priv, struct gpib_board *b
fault = copy_to_user((void __user *)arg, &write_cmd, sizeof(write_cmd));
atomic_set(&desc->io_in_progress, 0);
+ atomic_dec(&desc->descriptor_busy);
wake_up_interruptible(&board->wait);
if (fault)
@@ -1146,7 +1171,7 @@ static int increment_open_device_count(struct gpib_board *board, struct list_hea
}
/* otherwise we need to allocate a new struct gpib_status_queue */
- device = kmalloc(sizeof(struct gpib_status_queue), GFP_ATOMIC);
+ device = kmalloc_obj(struct gpib_status_queue, GFP_ATOMIC);
if (!device)
return -ENOMEM;
init_gpib_status_queue(device);
@@ -1241,7 +1266,7 @@ static int open_dev_ioctl(struct file *filep, struct gpib_board *board, unsigned
mutex_unlock(&file_priv->descriptors_mutex);
return -ERANGE;
}
- file_priv->descriptors[i] = kmalloc(sizeof(struct gpib_descriptor), GFP_KERNEL);
+ file_priv->descriptors[i] = kmalloc_obj(struct gpib_descriptor);
if (!file_priv->descriptors[i]) {
mutex_unlock(&file_priv->descriptors_mutex);
return -ENOMEM;
@@ -1276,6 +1301,9 @@ static int close_dev_ioctl(struct file *filep, struct gpib_board *board, unsigne
{
struct gpib_close_dev_ioctl cmd;
struct gpib_file_private *file_priv = filep->private_data;
+ struct gpib_descriptor *desc;
+ unsigned int pad;
+ int sad;
int retval;
retval = copy_from_user(&cmd, (void __user *)arg, sizeof(cmd));
@@ -1284,19 +1312,27 @@ static int close_dev_ioctl(struct file *filep, struct gpib_board *board, unsigne
if (cmd.handle >= GPIB_MAX_NUM_DESCRIPTORS)
return -EINVAL;
- if (!file_priv->descriptors[cmd.handle])
- return -EINVAL;
- retval = decrement_open_device_count(board, &board->device_list,
- file_priv->descriptors[cmd.handle]->pad,
- file_priv->descriptors[cmd.handle]->sad);
- if (retval < 0)
- return retval;
-
- kfree(file_priv->descriptors[cmd.handle]);
+ mutex_lock(&file_priv->descriptors_mutex);
+ desc = file_priv->descriptors[cmd.handle];
+ if (!desc) {
+ mutex_unlock(&file_priv->descriptors_mutex);
+ return -EINVAL;
+ }
+ if (atomic_read(&desc->descriptor_busy)) {
+ mutex_unlock(&file_priv->descriptors_mutex);
+ return -EBUSY;
+ }
+ /* Remove from table while holding lock to prevent new IO from starting */
file_priv->descriptors[cmd.handle] = NULL;
+ pad = desc->pad;
+ sad = desc->sad;
+ mutex_unlock(&file_priv->descriptors_mutex);
- return 0;
+ retval = decrement_open_device_count(board, &board->device_list, pad, sad);
+
+ kfree(desc);
+ return retval;
}
static int serial_poll_ioctl(struct gpib_board *board, unsigned long arg)
@@ -1331,12 +1367,25 @@ static int wait_ioctl(struct gpib_file_private *file_priv, struct gpib_board *bo
if (retval)
return -EFAULT;
+ /*
+ * Lock descriptors to prevent concurrent close from freeing
+ * descriptor. ibwait() releases big_gpib_mutex when wait_mask
+ * is non-zero, so desc must be pinned with descriptor_busy.
+ */
+ mutex_lock(&file_priv->descriptors_mutex);
desc = handle_to_descriptor(file_priv, wait_cmd.handle);
- if (!desc)
+ if (!desc) {
+ mutex_unlock(&file_priv->descriptors_mutex);
return -EINVAL;
+ }
+ atomic_inc(&desc->descriptor_busy);
+ mutex_unlock(&file_priv->descriptors_mutex);
retval = ibwait(board, wait_cmd.wait_mask, wait_cmd.clear_mask,
wait_cmd.set_mask, &wait_cmd.ibsta, wait_cmd.usec_timeout, desc);
+
+ atomic_dec(&desc->descriptor_busy);
+
if (retval < 0)
return retval;
@@ -1876,7 +1925,7 @@ static int push_gpib_event_nolock(struct gpib_board *board, short event_type)
return retval;
}
- event = kmalloc(sizeof(struct gpib_event), GFP_ATOMIC);
+ event = kmalloc_obj(struct gpib_event, GFP_ATOMIC);
if (!event) {
queue->dropped_event = 1;
dev_err(board->gpib_dev, "failed to allocate memory for event\n");
@@ -2035,13 +2084,14 @@ void init_gpib_descriptor(struct gpib_descriptor *desc)
desc->is_board = 0;
desc->autopoll_enabled = 0;
atomic_set(&desc->io_in_progress, 0);
+ atomic_set(&desc->descriptor_busy, 0);
}
int gpib_register_driver(struct gpib_interface *interface, struct module *provider_module)
{
struct gpib_interface_list *entry;
- entry = kmalloc(sizeof(*entry), GFP_KERNEL);
+ entry = kmalloc_obj(*entry);
if (!entry)
return -ENOMEM;
@@ -2169,10 +2219,13 @@ void init_gpib_status_queue(struct gpib_status_queue *device)
device->dropped_byte = 0;
}
-static struct class *gpib_class;
+static const struct class gpib_class = {
+ .name = "gpib_common",
+};
static int __init gpib_common_init_module(void)
{
+ int err;
int i;
pr_info("GPIB core driver\n");
@@ -2181,14 +2234,14 @@ static int __init gpib_common_init_module(void)
pr_err("gpib: can't get major %d\n", GPIB_CODE);
return -EIO;
}
- gpib_class = class_create("gpib_common");
- if (IS_ERR(gpib_class)) {
+ err = class_register(&gpib_class);
+ if (err) {
pr_err("gpib: failed to create gpib class\n");
unregister_chrdev(GPIB_CODE, "gpib");
- return PTR_ERR(gpib_class);
+ return err;
}
for (i = 0; i < GPIB_MAX_NUM_BOARDS; ++i)
- board_array[i].gpib_dev = device_create(gpib_class, NULL,
+ board_array[i].gpib_dev = device_create(&gpib_class, NULL,
MKDEV(GPIB_CODE, i), NULL, "gpib%i", i);
return 0;
@@ -2199,9 +2252,9 @@ static void __exit gpib_common_exit_module(void)
int i;
for (i = 0; i < GPIB_MAX_NUM_BOARDS; ++i)
- device_destroy(gpib_class, MKDEV(GPIB_CODE, i));
+ device_destroy(&gpib_class, MKDEV(GPIB_CODE, i));
- class_destroy(gpib_class);
+ class_unregister(&gpib_class);
unregister_chrdev(GPIB_CODE, "gpib");
}
diff --git a/drivers/gpib/common/iblib.c b/drivers/gpib/common/iblib.c
index 7cbb6a467177..b672dd6aad25 100644
--- a/drivers/gpib/common/iblib.c
+++ b/drivers/gpib/common/iblib.c
@@ -227,11 +227,10 @@ int ibonline(struct gpib_board *board)
#ifndef CONFIG_NIOS2
board->autospoll_task = kthread_run(&autospoll_thread, board,
"gpib%d_autospoll_kthread", board->minor);
- retval = IS_ERR(board->autospoll_task);
- if (retval) {
+ if (IS_ERR(board->autospoll_task)) {
dev_err(board->gpib_dev, "failed to create autospoll thread\n");
board->interface->detach(board);
- return retval;
+ return PTR_ERR(board->autospoll_task);
}
#endif
board->online = 1;
diff --git a/drivers/gpib/eastwood/fluke_gpib.c b/drivers/gpib/eastwood/fluke_gpib.c
index 3ae848e3f738..2069c771ecef 100644
--- a/drivers/gpib/eastwood/fluke_gpib.c
+++ b/drivers/gpib/eastwood/fluke_gpib.c
@@ -853,11 +853,10 @@ static int fluke_allocate_private(struct gpib_board *board)
{
struct fluke_priv *priv;
- board->private_data = kmalloc(sizeof(struct fluke_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct fluke_priv);
if (!board->private_data)
return -ENOMEM;
priv = board->private_data;
- memset(priv, 0, sizeof(struct fluke_priv));
init_nec7210_private(&priv->nec7210_priv);
priv->dma_buffer_size = 0x7ff;
priv->dma_buffer = kmalloc(priv->dma_buffer_size, GFP_KERNEL);
@@ -887,7 +886,7 @@ static int fluke_generic_attach(struct gpib_board *board)
board->status = 0;
retval = fluke_allocate_private(board);
- if (retval < 0)
+ if (retval)
return retval;
e_priv = board->private_data;
nec_priv = &e_priv->nec7210_priv;
diff --git a/drivers/gpib/fmh_gpib/fmh_gpib.c b/drivers/gpib/fmh_gpib/fmh_gpib.c
index f7bfb4a8e553..fcafdc02ea2e 100644
--- a/drivers/gpib/fmh_gpib/fmh_gpib.c
+++ b/drivers/gpib/fmh_gpib/fmh_gpib.c
@@ -1250,11 +1250,10 @@ static int fmh_gpib_allocate_private(struct gpib_board *board)
{
struct fmh_priv *priv;
- board->private_data = kmalloc(sizeof(struct fmh_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct fmh_priv);
if (!board->private_data)
return -ENOMEM;
priv = board->private_data;
- memset(priv, 0, sizeof(struct fmh_priv));
init_nec7210_private(&priv->nec7210_priv);
priv->dma_buffer_size = 0x800;
priv->dma_buffer = kmalloc(priv->dma_buffer_size, GFP_KERNEL);
@@ -1286,7 +1285,7 @@ static int fmh_gpib_generic_attach(struct gpib_board *board)
board->status = 0;
retval = fmh_gpib_allocate_private(board);
- if (retval < 0)
+ if (retval)
return retval;
e_priv = board->private_data;
nec_priv = &e_priv->nec7210_priv;
diff --git a/drivers/gpib/gpio/gpib_bitbang.c b/drivers/gpib/gpio/gpib_bitbang.c
index 374cd61355e9..0e227980b493 100644
--- a/drivers/gpib/gpio/gpib_bitbang.c
+++ b/drivers/gpib/gpio/gpib_bitbang.c
@@ -1066,9 +1066,9 @@ static int bb_line_status(const struct gpib_board *board)
static int allocate_private(struct gpib_board *board)
{
- board->private_data = kzalloc(sizeof(struct bb_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct bb_priv);
if (!board->private_data)
- return -1;
+ return -ENOMEM;
return 0;
}
@@ -1205,14 +1205,15 @@ static void bb_detach(struct gpib_board *board)
static int bb_attach(struct gpib_board *board, const struct gpib_board_config *config)
{
struct bb_priv *priv;
- int retval = 0;
+ int retval;
dbg_printk(2, "%s\n", "Enter ...");
board->status = 0;
- if (allocate_private(board))
- return -ENOMEM;
+ retval = allocate_private(board);
+ if (retval)
+ return retval;
priv = board->private_data;
priv->direction = -1;
priv->t1_delay = 2000;
diff --git a/drivers/gpib/hp_82335/hp82335.c b/drivers/gpib/hp_82335/hp82335.c
index d0e47ef77c87..b7544b3c15c6 100644
--- a/drivers/gpib/hp_82335/hp82335.c
+++ b/drivers/gpib/hp_82335/hp82335.c
@@ -210,9 +210,9 @@ static struct gpib_interface hp82335_interface = {
static int hp82335_allocate_private(struct gpib_board *board)
{
- board->private_data = kzalloc(sizeof(struct hp82335_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct hp82335_priv);
if (!board->private_data)
- return -1;
+ return -ENOMEM;
return 0;
}
@@ -253,8 +253,9 @@ static int hp82335_attach(struct gpib_board *board, const struct gpib_board_conf
board->status = 0;
- if (hp82335_allocate_private(board))
- return -ENOMEM;
+ retval = hp82335_allocate_private(board);
+ if (retval)
+ return retval;
hp_priv = board->private_data;
tms_priv = &hp_priv->tms9914_priv;
tms_priv->read_byte = hp82335_read_byte;
diff --git a/drivers/gpib/hp_82341/hp_82341.c b/drivers/gpib/hp_82341/hp_82341.c
index 1a2ad0560e14..46175ba2ac36 100644
--- a/drivers/gpib/hp_82341/hp_82341.c
+++ b/drivers/gpib/hp_82341/hp_82341.c
@@ -462,7 +462,7 @@ static struct gpib_interface hp_82341_interface = {
static int hp_82341_allocate_private(struct gpib_board *board)
{
- board->private_data = kzalloc(sizeof(struct hp_82341_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct hp_82341_priv);
if (!board->private_data)
return -ENOMEM;
return 0;
@@ -693,8 +693,9 @@ static int hp_82341_attach(struct gpib_board *board, const struct gpib_board_con
int retval;
board->status = 0;
- if (hp_82341_allocate_private(board))
- return -ENOMEM;
+ retval = hp_82341_allocate_private(board);
+ if (retval)
+ return retval;
hp_priv = board->private_data;
tms_priv = &hp_priv->tms9914_priv;
tms_priv->read_byte = hp_82341_read_byte;
diff --git a/drivers/gpib/include/gpib_types.h b/drivers/gpib/include/gpib_types.h
index 5a0978ae27e7..28b73157ffb7 100644
--- a/drivers/gpib/include/gpib_types.h
+++ b/drivers/gpib/include/gpib_types.h
@@ -364,6 +364,14 @@ struct gpib_descriptor {
unsigned int pad; /* primary gpib address */
int sad; /* secondary gpib address (negative means disabled) */
atomic_t io_in_progress;
+ /*
+ * Kernel-only reference count to prevent descriptor from being
+ * freed while IO handlers hold a pointer to it. Incremented
+ * before each IO operation, decremented when done. Unlike
+ * io_in_progress, this cannot be modified from userspace via
+ * general_ibstatus().
+ */
+ atomic_t descriptor_busy;
unsigned is_board : 1;
unsigned autopoll_enabled : 1;
};
diff --git a/drivers/gpib/ines/ines_gpib.c b/drivers/gpib/ines/ines_gpib.c
index a3cf846fd0f9..c000f647fbb5 100644
--- a/drivers/gpib/ines/ines_gpib.c
+++ b/drivers/gpib/ines/ines_gpib.c
@@ -657,11 +657,10 @@ static int ines_allocate_private(struct gpib_board *board)
{
struct ines_priv *priv;
- board->private_data = kmalloc(sizeof(struct ines_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct ines_priv);
if (!board->private_data)
- return -1;
+ return -ENOMEM;
priv = board->private_data;
- memset(priv, 0, sizeof(struct ines_priv));
init_nec7210_private(&priv->nec7210_priv);
return 0;
}
@@ -676,11 +675,13 @@ static int ines_generic_attach(struct gpib_board *board)
{
struct ines_priv *ines_priv;
struct nec7210_priv *nec_priv;
+ int retval;
board->status = 0;
- if (ines_allocate_private(board))
- return -ENOMEM;
+ retval = ines_allocate_private(board);
+ if (retval)
+ return retval;
ines_priv = board->private_data;
nec_priv = &ines_priv->nec7210_priv;
nec_priv->read_byte = nec7210_ioport_read_byte;
@@ -1060,7 +1061,7 @@ static int ines_gpib_probe(struct pcmcia_device *link)
// int ret, i;
/* Allocate space for private device-specific data */
- info = kzalloc(sizeof(*info), GFP_KERNEL);
+ info = kzalloc_obj(*info);
if (!info)
return -ENOMEM;
diff --git a/drivers/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c b/drivers/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c
index dd68c4843490..e6ea9422d6f2 100644
--- a/drivers/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c
+++ b/drivers/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c
@@ -38,8 +38,10 @@ MODULE_DESCRIPTION("GPIB driver for LPVO usb devices");
/*
* Table of devices that work with this driver.
*
- * Currently, only one device is known to be used in the
- * lpvo_usb_gpib adapter (FTDI 0403:6001).
+ * Currently, only one device is known to be used in the lpvo_usb_gpib
+ * adapter (FTDI 0403:6001) but as this device id is already handled by the
+ * ftdi_sio USB serial driver the LPVO driver must not bind to it by default.
+ *
* If your adapter uses a different chip, insert a line
* in the following table with proper <Vendor-id>, <Product-id>.
*
@@ -49,11 +51,10 @@ MODULE_DESCRIPTION("GPIB driver for LPVO usb devices");
*
*/
-static const struct usb_device_id skel_table[] = {
- { USB_DEVICE(0x0403, 0x6001) },
+static const struct usb_device_id lpvo_table[] = {
{ } /* Terminating entry */
};
-MODULE_DEVICE_TABLE(usb, skel_table);
+MODULE_DEVICE_TABLE(usb, lpvo_table);
/*
* *** Diagnostics and Debug ***
@@ -181,15 +182,11 @@ static int usb_minors[MAX_DEV]; /* usb minors */
static int assigned_usb_minors; /* mask of filled slots */
static struct mutex minors_lock; /* operations on usb_minors are to be protected */
-/*
- * usb-skeleton prototypes
- */
-
-struct usb_skel;
-static ssize_t skel_do_write(struct usb_skel *, const char *, size_t);
-static ssize_t skel_do_read(struct usb_skel *, char *, size_t);
-static int skel_do_open(struct gpib_board *, int);
-static int skel_do_release(struct gpib_board *);
+struct lpvo;
+static ssize_t lpvo_do_write(struct lpvo *, const char *, size_t);
+static ssize_t lpvo_do_read(struct lpvo *, char *, size_t);
+static int lpvo_do_open(struct gpib_board *, int);
+static int lpvo_do_release(struct gpib_board *);
/*
* usec_diff : take difference in MICROsec between two 'timespec'
@@ -217,7 +214,7 @@ static inline int usec_diff(struct timespec64 *a, struct timespec64 *b)
static int write_loop(void *dev, char *msg, int leng)
{
- return skel_do_write(dev, msg, leng);
+ return lpvo_do_write(dev, msg, leng);
}
/**
@@ -245,7 +242,7 @@ static int send_command(struct gpib_board *board, char *msg, int leng)
if (retval < 0)
return retval;
- nchar = skel_do_read(GPIB_DEV, buffer, 64);
+ nchar = lpvo_do_read(GPIB_DEV, buffer, 64);
if (nchar < 0) {
dev_err(board->gpib_dev, " return from read: %d\n", nchar);
@@ -309,7 +306,7 @@ static int one_char(struct gpib_board *board, struct char_buf *b)
return b->inbuf[b->last - b->nchar--];
}
ktime_get_real_ts64 (&before);
- b->nchar = skel_do_read(GPIB_DEV, b->inbuf, INBUF_SIZE);
+ b->nchar = lpvo_do_read(GPIB_DEV, b->inbuf, INBUF_SIZE);
b->last = b->nchar;
ktime_get_real_ts64 (&after);
@@ -405,7 +402,7 @@ static int usb_gpib_attach(struct gpib_board *board, const struct gpib_board_con
for (j = 0 ; j < MAX_DEV ; j++) {
if ((assigned_usb_minors & 1 << j) == 0)
continue;
- udev = usb_get_dev(interface_to_usbdev(lpvo_usb_interfaces[j]));
+ udev = interface_to_usbdev(lpvo_usb_interfaces[j]);
device_path = kobject_get_path(&udev->dev.kobj, GFP_KERNEL);
match = gpib_match_device_path(&lpvo_usb_interfaces[j]->dev,
config->device_path);
@@ -420,7 +417,7 @@ static int usb_gpib_attach(struct gpib_board *board, const struct gpib_board_con
for (j = 0 ; j < MAX_DEV ; j++) {
if ((assigned_usb_minors & 1 << j) == 0)
continue;
- udev = usb_get_dev(interface_to_usbdev(lpvo_usb_interfaces[j]));
+ udev = interface_to_usbdev(lpvo_usb_interfaces[j]);
DIA_LOG(1, "dev. %d: bus %d -> %d dev: %d -> %d\n", j,
udev->bus->busnum, config->pci_bus, udev->devnum, config->pci_slot);
if (config->pci_bus == udev->bus->busnum &&
@@ -440,16 +437,16 @@ static int usb_gpib_attach(struct gpib_board *board, const struct gpib_board_con
return -EIO;
}
- board->private_data = kzalloc(sizeof(struct usb_gpib_priv), GFP_KERNEL);
+ board->private_data = kzalloc_obj(struct usb_gpib_priv);
if (!board->private_data)
return -ENOMEM;
- retval = skel_do_open(board, usb_minors[j]);
+ retval = lpvo_do_open(board, usb_minors[j]);
- DIA_LOG(1, "Skel open: %d\n", retval);
+ DIA_LOG(1, "lpvo open: %d\n", retval);
if (retval) {
- dev_err(board->gpib_dev, "skel open failed.\n");
+ dev_err(board->gpib_dev, "lpvo open failed.\n");
kfree(board->private_data);
board->private_data = NULL;
return -ENODEV;
@@ -516,8 +513,8 @@ static void usb_gpib_detach(struct gpib_board *board)
write_loop(GPIB_DEV, USB_GPIB_OFF, strlen(USB_GPIB_OFF));
msleep(100);
DIA_LOG(1, "%s", "GPIB off\n");
- retval = skel_do_release(board);
- DIA_LOG(1, "skel release -> %d\n", retval);
+ retval = lpvo_do_release(board);
+ DIA_LOG(1, "lpvo release -> %d\n", retval);
}
kfree(board->privat