Commit 52465bce authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'char-misc-4.20-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 issues that have been
  reported.

  Nothing major, highlights include:

   - gnss sync write fixes

   - uio oops fix

   - nvmem fixes

   - other minor fixes and some documentation/maintainers updates

  Full details are in the shortlog.

  All of these have been in linux-next for a while with no reported
  issues"

* tag 'char-misc-4.20-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
  Documentation/security-bugs: Postpone fix publication in exceptional cases
  MAINTAINERS: Add Sasha as a stable branch maintainer
  gnss: sirf: fix synchronous write timeout
  gnss: serial: fix synchronous write timeout
  uio: Fix an Oops on load
  test_firmware: fix error return getting clobbered
  nvmem: core: fix regression in of_nvmem_cell_get()
  misc: atmel-ssc: Fix section annotation on atmel_ssc_get_driver_data
  drivers/misc/sgi-gru: fix Spectre v1 vulnerability
  Drivers: hv: kvp: Fix the recent regression caused by incorrect clean-up
  slimbus: ngd: remove unnecessary check
parents 4cd73195 544b03da
...@@ -32,16 +32,17 @@ Disclosure and embargoed information ...@@ -32,16 +32,17 @@ Disclosure and embargoed information
The security list is not a disclosure channel. For that, see Coordination The security list is not a disclosure channel. For that, see Coordination
below. below.
Once a robust fix has been developed, our preference is to release the Once a robust fix has been developed, the release process starts. Fixes
fix in a timely fashion, treating it no differently than any of the other for publicly known bugs are released immediately.
thousands of changes and fixes the Linux kernel project releases every
month. Although our preference is to release fixes for publicly undisclosed bugs
as soon as they become available, this may be postponed at the request of
However, at the request of the reporter, we will postpone releasing the the reporter or an affected party for up to 7 calendar days from the start
fix for up to 5 business days after the date of the report or after the of the release process, with an exceptional extension to 14 calendar days
embargo has lifted; whichever comes first. The only exception to that if it is agreed that the criticality of the bug requires more time. The
rule is if the bug is publicly known, in which case the preference is to only valid reason for deferring the publication of a fix is to accommodate
release the fix as soon as it's available. the logistics of QA and large scale rollouts which require release
coordination.
Whilst embargoed information may be shared with trusted individuals in Whilst embargoed information may be shared with trusted individuals in
order to develop a fix, such information will not be published alongside order to develop a fix, such information will not be published alongside
......
...@@ -14085,6 +14085,7 @@ F: Documentation/devicetree/bindings/iio/proximity/vl53l0x.txt ...@@ -14085,6 +14085,7 @@ F: Documentation/devicetree/bindings/iio/proximity/vl53l0x.txt
STABLE BRANCH STABLE BRANCH
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
M: Sasha Levin <sashal@kernel.org>
L: stable@vger.kernel.org L: stable@vger.kernel.org
S: Supported S: Supported
F: Documentation/process/stable-kernel-rules.rst F: Documentation/process/stable-kernel-rules.rst
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/sched.h>
#include <linux/serdev.h> #include <linux/serdev.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -63,7 +64,7 @@ static int gnss_serial_write_raw(struct gnss_device *gdev, ...@@ -63,7 +64,7 @@ static int gnss_serial_write_raw(struct gnss_device *gdev,
int ret; int ret;
/* write is only buffered synchronously */ /* write is only buffered synchronously */
ret = serdev_device_write(serdev, buf, count, 0); ret = serdev_device_write(serdev, buf, count, MAX_SCHEDULE_TIMEOUT);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <linux/sched.h>
#include <linux/serdev.h> #include <linux/serdev.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/wait.h> #include <linux/wait.h>
...@@ -83,7 +84,7 @@ static int sirf_write_raw(struct gnss_device *gdev, const unsigned char *buf, ...@@ -83,7 +84,7 @@ static int sirf_write_raw(struct gnss_device *gdev, const unsigned char *buf,
int ret; int ret;
/* write is only buffered synchronously */ /* write is only buffered synchronously */
ret = serdev_device_write(serdev, buf, count, 0); ret = serdev_device_write(serdev, buf, count, MAX_SCHEDULE_TIMEOUT);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -353,6 +353,9 @@ static void process_ib_ipinfo(void *in_msg, void *out_msg, int op) ...@@ -353,6 +353,9 @@ static void process_ib_ipinfo(void *in_msg, void *out_msg, int op)
out->body.kvp_ip_val.dhcp_enabled = in->kvp_ip_val.dhcp_enabled; out->body.kvp_ip_val.dhcp_enabled = in->kvp_ip_val.dhcp_enabled;
/* fallthrough */
case KVP_OP_GET_IP_INFO:
utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.adapter_id, utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.adapter_id,
MAX_ADAPTER_ID_SIZE, MAX_ADAPTER_ID_SIZE,
UTF16_LITTLE_ENDIAN, UTF16_LITTLE_ENDIAN,
...@@ -405,7 +408,11 @@ kvp_send_key(struct work_struct *dummy) ...@@ -405,7 +408,11 @@ kvp_send_key(struct work_struct *dummy)
process_ib_ipinfo(in_msg, message, KVP_OP_SET_IP_INFO); process_ib_ipinfo(in_msg, message, KVP_OP_SET_IP_INFO);
break; break;
case KVP_OP_GET_IP_INFO: case KVP_OP_GET_IP_INFO:
/* We only need to pass on message->kvp_hdr.operation. */ /*
* We only need to pass on the info of operation, adapter_id
* and addr_family to the userland kvp daemon.
*/
process_ib_ipinfo(in_msg, message, KVP_OP_GET_IP_INFO);
break; break;
case KVP_OP_SET: case KVP_OP_SET:
switch (in_msg->body.kvp_set.data.value_type) { switch (in_msg->body.kvp_set.data.value_type) {
...@@ -446,9 +453,9 @@ kvp_send_key(struct work_struct *dummy) ...@@ -446,9 +453,9 @@ kvp_send_key(struct work_struct *dummy)
} }
break; /*
* The key is always a string - utf16 encoding.
case KVP_OP_GET: */
message->body.kvp_set.data.key_size = message->body.kvp_set.data.key_size =
utf16s_to_utf8s( utf16s_to_utf8s(
(wchar_t *)in_msg->body.kvp_set.data.key, (wchar_t *)in_msg->body.kvp_set.data.key,
...@@ -456,6 +463,17 @@ kvp_send_key(struct work_struct *dummy) ...@@ -456,6 +463,17 @@ kvp_send_key(struct work_struct *dummy)
UTF16_LITTLE_ENDIAN, UTF16_LITTLE_ENDIAN,
message->body.kvp_set.data.key, message->body.kvp_set.data.key,
HV_KVP_EXCHANGE_MAX_KEY_SIZE - 1) + 1; HV_KVP_EXCHANGE_MAX_KEY_SIZE - 1) + 1;
break;
case KVP_OP_GET:
message->body.kvp_get.data.key_size =
utf16s_to_utf8s(
(wchar_t *)in_msg->body.kvp_get.data.key,
in_msg->body.kvp_get.data.key_size,
UTF16_LITTLE_ENDIAN,
message->body.kvp_get.data.key,
HV_KVP_EXCHANGE_MAX_KEY_SIZE - 1) + 1;
break; break;
case KVP_OP_DELETE: case KVP_OP_DELETE:
......
...@@ -132,7 +132,7 @@ static const struct of_device_id atmel_ssc_dt_ids[] = { ...@@ -132,7 +132,7 @@ static const struct of_device_id atmel_ssc_dt_ids[] = {
MODULE_DEVICE_TABLE(of, atmel_ssc_dt_ids); MODULE_DEVICE_TABLE(of, atmel_ssc_dt_ids);
#endif #endif
static inline const struct atmel_ssc_platform_data * __init static inline const struct atmel_ssc_platform_data *
atmel_ssc_get_driver_data(struct platform_device *pdev) atmel_ssc_get_driver_data(struct platform_device *pdev)
{ {
if (pdev->dev.of_node) { if (pdev->dev.of_node) {
......
...@@ -27,6 +27,9 @@ ...@@ -27,6 +27,9 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <asm/uv/uv_hub.h> #include <asm/uv/uv_hub.h>
#include <linux/nospec.h>
#include "gru.h" #include "gru.h"
#include "grutables.h" #include "grutables.h"
#include "gruhandles.h" #include "gruhandles.h"
...@@ -196,6 +199,7 @@ int gru_dump_chiplet_request(unsigned long arg) ...@@ -196,6 +199,7 @@ int gru_dump_chiplet_request(unsigned long arg)
/* Currently, only dump by gid is implemented */ /* Currently, only dump by gid is implemented */
if (req.gid >= gru_max_gids) if (req.gid >= gru_max_gids)
return -EINVAL; return -EINVAL;
req.gid = array_index_nospec(req.gid, gru_max_gids);
gru = GID_TO_GRU(req.gid); gru = GID_TO_GRU(req.gid);
ubuf = req.buf; ubuf = req.buf;
......
...@@ -44,6 +44,7 @@ struct nvmem_cell { ...@@ -44,6 +44,7 @@ struct nvmem_cell {
int bytes; int bytes;
int bit_offset; int bit_offset;
int nbits; int nbits;
struct device_node *np;
struct nvmem_device *nvmem; struct nvmem_device *nvmem;
struct list_head node; struct list_head node;
}; };
...@@ -298,6 +299,7 @@ static void nvmem_cell_drop(struct nvmem_cell *cell) ...@@ -298,6 +299,7 @@ static void nvmem_cell_drop(struct nvmem_cell *cell)
mutex_lock(&nvmem_mutex); mutex_lock(&nvmem_mutex);
list_del(&cell->node); list_del(&cell->node);
mutex_unlock(&nvmem_mutex); mutex_unlock(&nvmem_mutex);
of_node_put(cell->np);
kfree(cell->name); kfree(cell->name);
kfree(cell); kfree(cell);
} }
...@@ -530,6 +532,7 @@ static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) ...@@ -530,6 +532,7 @@ static int nvmem_add_cells_from_of(struct nvmem_device *nvmem)
return -ENOMEM; return -ENOMEM;
cell->nvmem = nvmem; cell->nvmem = nvmem;
cell->np = of_node_get(child);
cell->offset = be32_to_cpup(addr++); cell->offset = be32_to_cpup(addr++);
cell->bytes = be32_to_cpup(addr); cell->bytes = be32_to_cpup(addr);
cell->name = kasprintf(GFP_KERNEL, "%pOFn", child); cell->name = kasprintf(GFP_KERNEL, "%pOFn", child);
...@@ -960,14 +963,13 @@ nvmem_cell_get_from_lookup(struct device *dev, const char *con_id) ...@@ -960,14 +963,13 @@ nvmem_cell_get_from_lookup(struct device *dev, const char *con_id)
#if IS_ENABLED(CONFIG_OF) #if IS_ENABLED(CONFIG_OF)
static struct nvmem_cell * static struct nvmem_cell *
nvmem_find_cell_by_index(struct nvmem_device *nvmem, int index) nvmem_find_cell_by_node(struct nvmem_device *nvmem, struct device_node *np)
{ {
struct nvmem_cell *cell = NULL; struct nvmem_cell *cell = NULL;
int i = 0;
mutex_lock(&nvmem_mutex); mutex_lock(&nvmem_mutex);
list_for_each_entry(cell, &nvmem->cells, node) { list_for_each_entry(cell, &nvmem->cells, node) {
if (index == i++) if (np == cell->np)
break; break;
} }
mutex_unlock(&nvmem_mutex); mutex_unlock(&nvmem_mutex);
...@@ -1011,7 +1013,7 @@ struct nvmem_cell *of_nvmem_cell_get(struct device_node *np, const char *id) ...@@ -1011,7 +1013,7 @@ struct nvmem_cell *of_nvmem_cell_get(struct device_node *np, const char *id)
if (IS_ERR(nvmem)) if (IS_ERR(nvmem))
return ERR_CAST(nvmem); return ERR_CAST(nvmem);
cell = nvmem_find_cell_by_index(nvmem, index); cell = nvmem_find_cell_by_node(nvmem, cell_np);
if (!cell) { if (!cell) {
__nvmem_device_put(nvmem); __nvmem_device_put(nvmem);
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
......
...@@ -777,9 +777,6 @@ static int qcom_slim_ngd_xfer_msg(struct slim_controller *sctrl, ...@@ -777,9 +777,6 @@ static int qcom_slim_ngd_xfer_msg(struct slim_controller *sctrl,
u8 la = txn->la; u8 la = txn->la;
bool usr_msg = false; bool usr_msg = false;
if (txn->mc & SLIM_MSG_CLK_PAUSE_SEQ_FLG)
return -EPROTONOSUPPORT;
if (txn->mt == SLIM_MSG_MT_CORE && if (txn->mt == SLIM_MSG_MT_CORE &&
(txn->mc >= SLIM_MSG_MC_BEGIN_RECONFIGURATION && (txn->mc >= SLIM_MSG_MC_BEGIN_RECONFIGURATION &&
txn->mc <= SLIM_MSG_MC_RECONFIGURE_NOW)) txn->mc <= SLIM_MSG_MC_RECONFIGURE_NOW))
......
...@@ -61,12 +61,6 @@ ...@@ -61,12 +61,6 @@
#define SLIM_MSG_MC_NEXT_REMOVE_CHANNEL 0x58 #define SLIM_MSG_MC_NEXT_REMOVE_CHANNEL 0x58
#define SLIM_MSG_MC_RECONFIGURE_NOW 0x5F #define SLIM_MSG_MC_RECONFIGURE_NOW 0x5F
/*
* Clock pause flag to indicate that the reconfig message
* corresponds to clock pause sequence
*/
#define SLIM_MSG_CLK_PAUSE_SEQ_FLG (1U << 8)
/* Clock pause values per SLIMbus spec */ /* Clock pause values per SLIMbus spec */
#define SLIM_CLK_FAST 0 #define SLIM_CLK_FAST 0
#define SLIM_CLK_CONST_PHASE 1 #define SLIM_CLK_CONST_PHASE 1
......
...@@ -961,6 +961,8 @@ int __uio_register_device(struct module *owner, ...@@ -961,6 +961,8 @@ int __uio_register_device(struct module *owner,
if (ret) if (ret)
goto err_uio_dev_add_attributes; goto err_uio_dev_add_attributes;
info->uio_dev = idev;
if (info->irq && (info->irq != UIO_IRQ_CUSTOM)) { if (info->irq && (info->irq != UIO_IRQ_CUSTOM)) {
/* /*
* Note that we deliberately don't use devm_request_irq * Note that we deliberately don't use devm_request_irq
...@@ -972,11 +974,12 @@ int __uio_register_device(struct module *owner, ...@@ -972,11 +974,12 @@ int __uio_register_device(struct module *owner,
*/ */
ret = request_irq(info->irq, uio_interrupt, ret = request_irq(info->irq, uio_interrupt,
info->irq_flags, info->name, idev); info->irq_flags, info->name, idev);
if (ret) if (ret) {
info->uio_dev = NULL;
goto err_request_irq; goto err_request_irq;
}
} }
info->uio_dev = idev;
return 0; return 0;
err_request_irq: err_request_irq:
......
...@@ -837,6 +837,7 @@ static ssize_t read_firmware_show(struct device *dev, ...@@ -837,6 +837,7 @@ static ssize_t read_firmware_show(struct device *dev,
if (req->fw->size > PAGE_SIZE) { if (req->fw->size > PAGE_SIZE) {
pr_err("Testing interface must use PAGE_SIZE firmware for now\n"); pr_err("Testing interface must use PAGE_SIZE firmware for now\n");
rc = -EINVAL; rc = -EINVAL;
goto out;
} }
memcpy(buf, req->fw->data, req->fw->size); memcpy(buf, req->fw->data, req->fw->size);
......
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