Browse Source

Merge tag 'char-misc-4.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

Pull char/misc driver fixes from Greg KH:
 "Here are some small char/misc driver fixes for 4.10-rc4 that resolve
  some reported issues.

  The MEI driver issue resolves a lot of problems that people have been
  having, as does the mem driver fix. The other minor fixes resolve
  other reported issues.

  All of these have been in linux-next for a while"

* tag 'char-misc-4.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
  vme: Fix wrong pointer utilization in ca91cx42_slave_get
  auxdisplay: fix new ht16k33 build errors
  ppdev: don't print a free'd string
  extcon: return error code on failure
  drivers: char: mem: Fix thinkos in kmem address checks
  mei: bus: enable OS version only for SPT and newer
Linus Torvalds 8 years ago
parent
commit
c928162756

+ 3 - 3
drivers/auxdisplay/Kconfig

@@ -132,9 +132,9 @@ config HT16K33
 	tristate "Holtek Ht16K33 LED controller with keyscan"
 	tristate "Holtek Ht16K33 LED controller with keyscan"
 	depends on FB && OF && I2C && INPUT
 	depends on FB && OF && I2C && INPUT
 	select FB_SYS_FOPS
 	select FB_SYS_FOPS
-	select FB_CFB_FILLRECT
-	select FB_CFB_COPYAREA
-	select FB_CFB_IMAGEBLIT
+	select FB_SYS_FILLRECT
+	select FB_SYS_COPYAREA
+	select FB_SYS_IMAGEBLIT
 	select INPUT_MATRIXKMAP
 	select INPUT_MATRIXKMAP
 	select FB_BACKLIGHT
 	select FB_BACKLIGHT
 	help
 	help

+ 4 - 6
drivers/char/mem.c

@@ -381,9 +381,6 @@ static ssize_t read_kmem(struct file *file, char __user *buf,
 	char *kbuf; /* k-addr because vread() takes vmlist_lock rwlock */
 	char *kbuf; /* k-addr because vread() takes vmlist_lock rwlock */
 	int err = 0;
 	int err = 0;
 
 
-	if (!pfn_valid(PFN_DOWN(p)))
-		return -EIO;
-
 	read = 0;
 	read = 0;
 	if (p < (unsigned long) high_memory) {
 	if (p < (unsigned long) high_memory) {
 		low_count = count;
 		low_count = count;
@@ -412,6 +409,8 @@ static ssize_t read_kmem(struct file *file, char __user *buf,
 			 * by the kernel or data corruption may occur
 			 * by the kernel or data corruption may occur
 			 */
 			 */
 			kbuf = xlate_dev_kmem_ptr((void *)p);
 			kbuf = xlate_dev_kmem_ptr((void *)p);
+			if (!virt_addr_valid(kbuf))
+				return -ENXIO;
 
 
 			if (copy_to_user(buf, kbuf, sz))
 			if (copy_to_user(buf, kbuf, sz))
 				return -EFAULT;
 				return -EFAULT;
@@ -482,6 +481,8 @@ static ssize_t do_write_kmem(unsigned long p, const char __user *buf,
 		 * corruption may occur.
 		 * corruption may occur.
 		 */
 		 */
 		ptr = xlate_dev_kmem_ptr((void *)p);
 		ptr = xlate_dev_kmem_ptr((void *)p);
+		if (!virt_addr_valid(ptr))
+			return -ENXIO;
 
 
 		copied = copy_from_user(ptr, buf, sz);
 		copied = copy_from_user(ptr, buf, sz);
 		if (copied) {
 		if (copied) {
@@ -512,9 +513,6 @@ static ssize_t write_kmem(struct file *file, const char __user *buf,
 	char *kbuf; /* k-addr because vwrite() takes vmlist_lock rwlock */
 	char *kbuf; /* k-addr because vwrite() takes vmlist_lock rwlock */
 	int err = 0;
 	int err = 0;
 
 
-	if (!pfn_valid(PFN_DOWN(p)))
-		return -EIO;
-
 	if (p < (unsigned long) high_memory) {
 	if (p < (unsigned long) high_memory) {
 		unsigned long to_write = min_t(unsigned long, count,
 		unsigned long to_write = min_t(unsigned long, count,
 					       (unsigned long)high_memory - p);
 					       (unsigned long)high_memory - p);

+ 8 - 5
drivers/char/ppdev.c

@@ -290,6 +290,7 @@ static int register_device(int minor, struct pp_struct *pp)
 	struct pardevice *pdev = NULL;
 	struct pardevice *pdev = NULL;
 	char *name;
 	char *name;
 	struct pardev_cb ppdev_cb;
 	struct pardev_cb ppdev_cb;
+	int rc = 0;
 
 
 	name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor);
 	name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor);
 	if (name == NULL)
 	if (name == NULL)
@@ -298,8 +299,8 @@ static int register_device(int minor, struct pp_struct *pp)
 	port = parport_find_number(minor);
 	port = parport_find_number(minor);
 	if (!port) {
 	if (!port) {
 		pr_warn("%s: no associated port!\n", name);
 		pr_warn("%s: no associated port!\n", name);
-		kfree(name);
-		return -ENXIO;
+		rc = -ENXIO;
+		goto err;
 	}
 	}
 
 
 	memset(&ppdev_cb, 0, sizeof(ppdev_cb));
 	memset(&ppdev_cb, 0, sizeof(ppdev_cb));
@@ -308,16 +309,18 @@ static int register_device(int minor, struct pp_struct *pp)
 	ppdev_cb.private = pp;
 	ppdev_cb.private = pp;
 	pdev = parport_register_dev_model(port, name, &ppdev_cb, minor);
 	pdev = parport_register_dev_model(port, name, &ppdev_cb, minor);
 	parport_put_port(port);
 	parport_put_port(port);
-	kfree(name);
 
 
 	if (!pdev) {
 	if (!pdev) {
 		pr_warn("%s: failed to register device!\n", name);
 		pr_warn("%s: failed to register device!\n", name);
-		return -ENXIO;
+		rc = -ENXIO;
+		goto err;
 	}
 	}
 
 
 	pp->pdev = pdev;
 	pp->pdev = pdev;
 	dev_dbg(&pdev->dev, "registered pardevice\n");
 	dev_dbg(&pdev->dev, "registered pardevice\n");
-	return 0;
+err:
+	kfree(name);
+	return rc;
 }
 }
 
 
 static enum ieee1284_phase init_phase(int mode)
 static enum ieee1284_phase init_phase(int mode)

+ 1 - 1
drivers/extcon/extcon.c

@@ -453,7 +453,7 @@ int extcon_sync(struct extcon_dev *edev, unsigned int id)
 		dev_err(&edev->dev, "out of memory in extcon_set_state\n");
 		dev_err(&edev->dev, "out of memory in extcon_set_state\n");
 		kobject_uevent(&edev->dev.kobj, KOBJ_CHANGE);
 		kobject_uevent(&edev->dev.kobj, KOBJ_CHANGE);
 
 
-		return 0;
+		return -ENOMEM;
 	}
 	}
 
 
 	length = name_show(&edev->dev, NULL, prop_buf);
 	length = name_show(&edev->dev, NULL, prop_buf);

+ 3 - 0
drivers/misc/mei/bus-fixup.c

@@ -152,6 +152,9 @@ static void mei_mkhi_fix(struct mei_cl_device *cldev)
 {
 {
 	int ret;
 	int ret;
 
 
+	if (!cldev->bus->hbm_f_os_supported)
+		return;
+
 	ret = mei_cldev_enable(cldev);
 	ret = mei_cldev_enable(cldev);
 	if (ret)
 	if (ret)
 		return;
 		return;

+ 2 - 0
drivers/misc/mei/debugfs.c

@@ -180,6 +180,8 @@ static ssize_t mei_dbgfs_read_devstate(struct file *fp, char __user *ubuf,
 				 dev->hbm_f_ev_supported);
 				 dev->hbm_f_ev_supported);
 		pos += scnprintf(buf + pos, bufsz - pos, "\tFA: %01d\n",
 		pos += scnprintf(buf + pos, bufsz - pos, "\tFA: %01d\n",
 				 dev->hbm_f_fa_supported);
 				 dev->hbm_f_fa_supported);
+		pos += scnprintf(buf + pos, bufsz - pos, "\tOS: %01d\n",
+				 dev->hbm_f_os_supported);
 	}
 	}
 
 
 	pos += scnprintf(buf + pos, bufsz - pos, "pg:  %s, %s\n",
 	pos += scnprintf(buf + pos, bufsz - pos, "pg:  %s, %s\n",

+ 4 - 0
drivers/misc/mei/hbm.c

@@ -989,6 +989,10 @@ static void mei_hbm_config_features(struct mei_device *dev)
 	/* Fixed Address Client Support */
 	/* Fixed Address Client Support */
 	if (dev->version.major_version >= HBM_MAJOR_VERSION_FA)
 	if (dev->version.major_version >= HBM_MAJOR_VERSION_FA)
 		dev->hbm_f_fa_supported = 1;
 		dev->hbm_f_fa_supported = 1;
+
+	/* OS ver message Support */
+	if (dev->version.major_version >= HBM_MAJOR_VERSION_OS)
+		dev->hbm_f_os_supported = 1;
 }
 }
 
 
 /**
 /**

+ 6 - 0
drivers/misc/mei/hw.h

@@ -76,6 +76,12 @@
 #define HBM_MINOR_VERSION_FA               0
 #define HBM_MINOR_VERSION_FA               0
 #define HBM_MAJOR_VERSION_FA               2
 #define HBM_MAJOR_VERSION_FA               2
 
 
+/*
+ * MEI version with OS ver message support
+ */
+#define HBM_MINOR_VERSION_OS               0
+#define HBM_MAJOR_VERSION_OS               2
+
 /* Host bus message command opcode */
 /* Host bus message command opcode */
 #define MEI_HBM_CMD_OP_MSK                  0x7f
 #define MEI_HBM_CMD_OP_MSK                  0x7f
 /* Host bus message command RESPONSE */
 /* Host bus message command RESPONSE */

+ 2 - 0
drivers/misc/mei/mei_dev.h

@@ -406,6 +406,7 @@ const char *mei_pg_state_str(enum mei_pg_state state);
  * @hbm_f_ev_supported  : hbm feature event notification
  * @hbm_f_ev_supported  : hbm feature event notification
  * @hbm_f_fa_supported  : hbm feature fixed address client
  * @hbm_f_fa_supported  : hbm feature fixed address client
  * @hbm_f_ie_supported  : hbm feature immediate reply to enum request
  * @hbm_f_ie_supported  : hbm feature immediate reply to enum request
+ * @hbm_f_os_supported  : hbm feature support OS ver message
  *
  *
  * @me_clients_rwsem: rw lock over me_clients list
  * @me_clients_rwsem: rw lock over me_clients list
  * @me_clients  : list of FW clients
  * @me_clients  : list of FW clients
@@ -487,6 +488,7 @@ struct mei_device {
 	unsigned int hbm_f_ev_supported:1;
 	unsigned int hbm_f_ev_supported:1;
 	unsigned int hbm_f_fa_supported:1;
 	unsigned int hbm_f_fa_supported:1;
 	unsigned int hbm_f_ie_supported:1;
 	unsigned int hbm_f_ie_supported:1;
+	unsigned int hbm_f_os_supported:1;
 
 
 	struct rw_semaphore me_clients_rwsem;
 	struct rw_semaphore me_clients_rwsem;
 	struct list_head me_clients;
 	struct list_head me_clients;

+ 1 - 1
drivers/vme/bridges/vme_ca91cx42.c

@@ -464,7 +464,7 @@ static int ca91cx42_slave_get(struct vme_slave_resource *image, int *enabled,
 	vme_bound = ioread32(bridge->base + CA91CX42_VSI_BD[i]);
 	vme_bound = ioread32(bridge->base + CA91CX42_VSI_BD[i]);
 	pci_offset = ioread32(bridge->base + CA91CX42_VSI_TO[i]);
 	pci_offset = ioread32(bridge->base + CA91CX42_VSI_TO[i]);
 
 
-	*pci_base = (dma_addr_t)vme_base + pci_offset;
+	*pci_base = (dma_addr_t)*vme_base + pci_offset;
 	*size = (unsigned long long)((vme_bound - *vme_base) + granularity);
 	*size = (unsigned long long)((vme_bound - *vme_base) + granularity);
 
 
 	*enabled = 0;
 	*enabled = 0;