Commit 5cc0c038 authored by Linus Torvalds's avatar Linus Torvalds

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
parents b6419406 b5325a02
...@@ -3865,9 +3865,16 @@ M: K. Y. Srinivasan <kys@microsoft.com> ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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,10 +489,15 @@ static int mei_ioctl_connect_client(struct file *file, ...@@ -489,10 +489,15 @@ 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) {
dev_dbg(&dev->pdev->dev, "Cannot connect to FW Client UUID = %pUl\n",
&data->in_client_uuid);
rets = -ENODEV;
goto end;
}
cl->me_client_id = dev->me_clients[i].client_id; cl->me_client_id = dev->me_clients[i].client_id;
cl->state = MEI_FILE_CONNECTING; 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);
...@@ -527,11 +532,6 @@ static int mei_ioctl_connect_client(struct file *file, ...@@ -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, ...@@ -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 ...@@ -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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment