char/misc driver fixes for 3.10-rc2
Here are some small char/misc driver fixes for 3.10-rc2. Nothing major here, just a number of fixes for things that people have reported, and a MAINTAINERS update for the recent changes for the hyperv files that went into 3.10-rc1. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iEYEABECAAYFAlGePEIACgkQMUfUDdst+yk0VQCfXuaBzq+dtK4k2aMtzNYl7KW3 8HsAoLxBNJAVg3iic8xs3HuHnIzwuL1W =rkfh -----END PGP SIGNATURE----- Merge tag 'char-misc-3.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc Pull char/misc driver fixes from Greg Kroah-Hartman: "Here are some small char/misc driver fixes for 3.10-rc2. Nothing major here, just a number of fixes for things that people have reported, and a MAINTAINERS update for the recent changes for the hyperv files that went into 3.10-rc1." * tag 'char-misc-3.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: ttyprintk: Fix NULL pointer deref by setting tty_port ops after initializing port uio: UIO_DMEM_GENIRQ should depend on HAS_DMA MAINTAINERS: update Hyper-V file list mei: bus: Reset event_cb when disabling a device Drivers: hv: Fix a bug in get_vp_index() mei: fix out of array access to me clients array Char: lp, protect LPGETSTATUS with port_mutex dummy-irq: require the user to specify an IRQ number
This commit is contained in:
Коммит
5cc0c03823
|
@ -3865,9 +3865,16 @@ M: K. Y. Srinivasan <kys@microsoft.com>
|
||||||
M: Haiyang Zhang <haiyangz@microsoft.com>
|
M: Haiyang Zhang <haiyangz@microsoft.com>
|
||||||
L: devel@linuxdriverproject.org
|
L: devel@linuxdriverproject.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/hv/
|
F: arch/x86/include/asm/mshyperv.h
|
||||||
|
F: arch/x86/include/uapi/asm/hyperv.h
|
||||||
|
F: arch/x86/kernel/cpu/mshyperv.c
|
||||||
F: drivers/hid/hid-hyperv.c
|
F: drivers/hid/hid-hyperv.c
|
||||||
|
F: drivers/hv/
|
||||||
F: drivers/net/hyperv/
|
F: drivers/net/hyperv/
|
||||||
|
F: drivers/scsi/storvsc_drv.c
|
||||||
|
F: drivers/video/hyperv_fb.c
|
||||||
|
F: include/linux/hyperv.h
|
||||||
|
F: tools/hv/
|
||||||
|
|
||||||
I2C OVER PARALLEL PORT
|
I2C OVER PARALLEL PORT
|
||||||
M: Jean Delvare <khali@linux-fr.org>
|
M: Jean Delvare <khali@linux-fr.org>
|
||||||
|
|
|
@ -622,9 +622,12 @@ static int lp_do_ioctl(unsigned int minor, unsigned int cmd,
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
break;
|
break;
|
||||||
case LPGETSTATUS:
|
case LPGETSTATUS:
|
||||||
|
if (mutex_lock_interruptible(&lp_table[minor].port_mutex))
|
||||||
|
return -EINTR;
|
||||||
lp_claim_parport_or_block (&lp_table[minor]);
|
lp_claim_parport_or_block (&lp_table[minor]);
|
||||||
status = r_str(minor);
|
status = r_str(minor);
|
||||||
lp_release_parport (&lp_table[minor]);
|
lp_release_parport (&lp_table[minor]);
|
||||||
|
mutex_unlock(&lp_table[minor].port_mutex);
|
||||||
|
|
||||||
if (copy_to_user(argp, &status, sizeof(int)))
|
if (copy_to_user(argp, &status, sizeof(int)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
|
@ -179,7 +179,6 @@ static int __init ttyprintk_init(void)
|
||||||
{
|
{
|
||||||
int ret = -ENOMEM;
|
int ret = -ENOMEM;
|
||||||
|
|
||||||
tpk_port.port.ops = &null_ops;
|
|
||||||
mutex_init(&tpk_port.port_write_mutex);
|
mutex_init(&tpk_port.port_write_mutex);
|
||||||
|
|
||||||
ttyprintk_driver = tty_alloc_driver(1,
|
ttyprintk_driver = tty_alloc_driver(1,
|
||||||
|
@ -190,6 +189,7 @@ static int __init ttyprintk_init(void)
|
||||||
return PTR_ERR(ttyprintk_driver);
|
return PTR_ERR(ttyprintk_driver);
|
||||||
|
|
||||||
tty_port_init(&tpk_port.port);
|
tty_port_init(&tpk_port.port);
|
||||||
|
tpk_port.port.ops = &null_ops;
|
||||||
|
|
||||||
ttyprintk_driver->driver_name = "ttyprintk";
|
ttyprintk_driver->driver_name = "ttyprintk";
|
||||||
ttyprintk_driver->name = "ttyprintk";
|
ttyprintk_driver->name = "ttyprintk";
|
||||||
|
|
|
@ -329,7 +329,7 @@ static u32 get_vp_index(uuid_le *type_guid)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
cur_cpu = (++next_vp % max_cpus);
|
cur_cpu = (++next_vp % max_cpus);
|
||||||
return cur_cpu;
|
return hv_context.vp_index[cur_cpu];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
static int irq;
|
static int irq = -1;
|
||||||
|
|
||||||
static irqreturn_t dummy_interrupt(int irq, void *dev_id)
|
static irqreturn_t dummy_interrupt(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
|
@ -36,6 +36,10 @@ static irqreturn_t dummy_interrupt(int irq, void *dev_id)
|
||||||
|
|
||||||
static int __init dummy_irq_init(void)
|
static int __init dummy_irq_init(void)
|
||||||
{
|
{
|
||||||
|
if (irq < 0) {
|
||||||
|
printk(KERN_ERR "dummy-irq: no IRQ given. Use irq=N\n");
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
if (request_irq(irq, &dummy_interrupt, IRQF_SHARED, "dummy_irq", &irq)) {
|
if (request_irq(irq, &dummy_interrupt, IRQF_SHARED, "dummy_irq", &irq)) {
|
||||||
printk(KERN_ERR "dummy-irq: cannot register IRQ %d\n", irq);
|
printk(KERN_ERR "dummy-irq: cannot register IRQ %d\n", irq);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
|
@ -496,6 +496,8 @@ int mei_cl_disable_device(struct mei_cl_device *device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
device->event_cb = NULL;
|
||||||
|
|
||||||
mutex_unlock(&dev->device_lock);
|
mutex_unlock(&dev->device_lock);
|
||||||
|
|
||||||
if (!device->ops || !device->ops->disable)
|
if (!device->ops || !device->ops->disable)
|
||||||
|
|
|
@ -489,11 +489,16 @@ static int mei_ioctl_connect_client(struct file *file,
|
||||||
|
|
||||||
/* find ME client we're trying to connect to */
|
/* find ME client we're trying to connect to */
|
||||||
i = mei_me_cl_by_uuid(dev, &data->in_client_uuid);
|
i = mei_me_cl_by_uuid(dev, &data->in_client_uuid);
|
||||||
if (i >= 0 && !dev->me_clients[i].props.fixed_address) {
|
if (i < 0 || dev->me_clients[i].props.fixed_address) {
|
||||||
cl->me_client_id = dev->me_clients[i].client_id;
|
dev_dbg(&dev->pdev->dev, "Cannot connect to FW Client UUID = %pUl\n",
|
||||||
cl->state = MEI_FILE_CONNECTING;
|
&data->in_client_uuid);
|
||||||
|
rets = -ENODEV;
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cl->me_client_id = dev->me_clients[i].client_id;
|
||||||
|
cl->state = MEI_FILE_CONNECTING;
|
||||||
|
|
||||||
dev_dbg(&dev->pdev->dev, "Connect to FW Client ID = %d\n",
|
dev_dbg(&dev->pdev->dev, "Connect to FW Client ID = %d\n",
|
||||||
cl->me_client_id);
|
cl->me_client_id);
|
||||||
dev_dbg(&dev->pdev->dev, "FW Client - Protocol Version = %d\n",
|
dev_dbg(&dev->pdev->dev, "FW Client - Protocol Version = %d\n",
|
||||||
|
@ -527,11 +532,6 @@ static int mei_ioctl_connect_client(struct file *file,
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cl->state != MEI_FILE_CONNECTING) {
|
|
||||||
rets = -ENODEV;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* prepare the output buffer */
|
/* prepare the output buffer */
|
||||||
client = &data->out_client_properties;
|
client = &data->out_client_properties;
|
||||||
|
@ -543,7 +543,6 @@ static int mei_ioctl_connect_client(struct file *file,
|
||||||
rets = mei_cl_connect(cl, file);
|
rets = mei_cl_connect(cl, file);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
dev_dbg(&dev->pdev->dev, "free connect cb memory.");
|
|
||||||
return rets;
|
return rets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@ config UIO_PDRV_GENIRQ
|
||||||
|
|
||||||
config UIO_DMEM_GENIRQ
|
config UIO_DMEM_GENIRQ
|
||||||
tristate "Userspace platform driver with generic irq and dynamic memory"
|
tristate "Userspace platform driver with generic irq and dynamic memory"
|
||||||
|
depends on HAS_DMA
|
||||||
help
|
help
|
||||||
Platform driver for Userspace I/O devices, including generic
|
Platform driver for Userspace I/O devices, including generic
|
||||||
interrupt handling code. Shared interrupts are not supported.
|
interrupt handling code. Shared interrupts are not supported.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче