-LINUX_VERSION-5.10 = .168
-LINUX_KERNEL_HASH-5.10.168 = b67d2596ba8d30510f743f31899c94c43eaf006a254ff44d7fc6ea26e7ab359c
+LINUX_VERSION-5.10 = .169
+LINUX_KERNEL_HASH-5.10.169 = d9754f6eb55e88214c7aaa7c4831c215f88b48da1d9b40f871b055ff56ebafcf
#include <linux/uaccess.h>
#include <linux/ipv6.h>
#include <linux/icmpv6.h>
-@@ -926,10 +927,10 @@ static void tcp_v6_send_response(const s
+@@ -927,10 +928,10 @@ static void tcp_v6_send_response(const s
topt = (__be32 *)(t1 + 1);
if (tsecr) {
+++ /dev/null
-From d61615c366a489646a1bfe5b33455f916762d5f4 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 8 Feb 2023 10:16:37 +0100
-Subject: [PATCH] net: bgmac: fix BCM5358 support by setting correct flags
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Code blocks handling BCMA_CHIP_ID_BCM5357 and BCMA_CHIP_ID_BCM53572 were
-incorrectly unified. Chip package values are not unique and cannot be
-checked independently. They are meaningful only in a context of a given
-chip.
-
-Packages BCM5358 and BCM47188 share the same value but then belong to
-different chips. Code unification resulted in treating BCM5358 as
-BCM47188 and broke its initialization.
-
-Link: https://github.com/openwrt/openwrt/issues/8278
-Fixes: cb1b0f90acfe ("net: ethernet: bgmac: unify code of the same family")
-Cc: Jon Mason <jdmason@kudzu.us>
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Link: https://lore.kernel.org/r/20230208091637.16291-1-zajec5@gmail.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- drivers/net/ethernet/broadcom/bgmac-bcma.c | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
-@@ -240,12 +240,12 @@ static int bgmac_probe(struct bcma_devic
- bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
- bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
- bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
-- if (ci->pkg == BCMA_PKG_ID_BCM47188 ||
-- ci->pkg == BCMA_PKG_ID_BCM47186) {
-+ if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
-+ (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) {
- bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
- bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
- }
-- if (ci->pkg == BCMA_PKG_ID_BCM5358)
-+ if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358)
- bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII;
- break;
- case BCMA_CHIP_ID_BCM53573:
int irq;
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
-@@ -5013,7 +5013,7 @@ int stmmac_dvr_probe(struct device *devi
+@@ -5014,7 +5014,7 @@ int stmmac_dvr_probe(struct device *devi
priv->wol_irq = res->wol_irq;
priv->lpi_irq = res->lpi_irq;
if (!config->no_of_node)
nvmem->dev.of_node = config->dev->of_node;
-@@ -680,6 +819,12 @@ struct nvmem_device *nvmem_register(cons
- nvmem->dev.groups = nvmem_dev_groups;
- #endif
+@@ -703,6 +842,12 @@ struct nvmem_device *nvmem_register(cons
+ if (rval)
+ goto err_remove_cells;
+ if (nvmem->nkeepout) {
+ rval = nvmem_validate_keepouts(nvmem);
+
dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name);
- rval = device_register(&nvmem->dev);
+ rval = device_add(&nvmem->dev);
--- a/include/linux/nvmem-provider.h
+++ b/include/linux/nvmem-provider.h
@@ -31,6 +31,19 @@ enum nvmem_type {
* @type: Type of the nvmem storage
* @read_only: Device is read-only.
* @root_only: Device is accessibly to root only.
-@@ -67,6 +82,8 @@ struct nvmem_config {
- struct gpio_desc *wp_gpio;
+@@ -65,6 +80,8 @@ struct nvmem_config {
+ struct module *owner;
const struct nvmem_cell_info *cells;
int ncells;
+ const struct nvmem_keepout *keepout;
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
-@@ -1612,6 +1612,101 @@ int nvmem_cell_read_u64(struct device *d
+@@ -1613,6 +1613,101 @@ int nvmem_cell_read_u64(struct device *d
}
EXPORT_SYMBOL_GPL(nvmem_cell_read_u64);
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
-@@ -1699,7 +1699,7 @@ int nvmem_cell_read_variable_le_u64(stru
+@@ -1700,7 +1700,7 @@ int nvmem_cell_read_variable_le_u64(stru
/* Copy w/ implicit endian conversion */
*val = 0;
for (i = 0; i < len; i++)
--- /dev/null
+From 35cd2598c910ad6a1cc8bd3f731429b1901abc63 Mon Sep 17 00:00:00 2001
+From: Kuniyuki Iwashima <kuniyu@amazon.com>
+Date: Mon, 27 Feb 2023 13:15:48 -0800
+Subject: [PATCH] net: Remove WARN_ON_ONCE(sk->sk_forward_alloc) from
+ sk_stream_kill_queues().
+
+commit 62ec33b44e0f7168ff2886520fec6fb62d03b5a3 upstream.
+
+Christoph Paasch reported that commit b5fc29233d28 ("inet6: Remove
+inet6_destroy_sock() in sk->sk_prot->destroy().") started triggering
+WARN_ON_ONCE(sk->sk_forward_alloc) in sk_stream_kill_queues(). [0 - 2]
+Also, we can reproduce it by a program in [3].
+
+In the commit, we delay freeing ipv6_pinfo.pktoptions from sk->destroy()
+to sk->sk_destruct(), so sk->sk_forward_alloc is no longer zero in
+inet_csk_destroy_sock().
+
+The same check has been in inet_sock_destruct() from at least v2.6,
+we can just remove the WARN_ON_ONCE(). However, among the users of
+sk_stream_kill_queues(), only CAIF is not calling inet_sock_destruct().
+Thus, we add the same WARN_ON_ONCE() to caif_sock_destructor().
+
+[0]: https://lore.kernel.org/netdev/39725AB4-88F1-41B3-B07F-949C5CAEFF4F@icloud.com/
+[1]: https://github.com/multipath-tcp/mptcp_net-next/issues/341
+[2]:
+WARNING: CPU: 0 PID: 3232 at net/core/stream.c:212 sk_stream_kill_queues+0x2f9/0x3e0
+Modules linked in:
+CPU: 0 PID: 3232 Comm: syz-executor.0 Not tainted 6.2.0-rc5ab24eb4698afbe147b424149c529e2a43ec24eb5 #2
+Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014
+RIP: 0010:sk_stream_kill_queues+0x2f9/0x3e0
+Code: 03 0f b6 04 02 84 c0 74 08 3c 03 0f 8e ec 00 00 00 8b ab 08 01 00 00 e9 60 ff ff ff e8 d0 5f b6 fe 0f 0b eb 97 e8 c7 5f b6 fe <0f> 0b eb a0 e8 be 5f b6 fe 0f 0b e9 6a fe ff ff e8 02 07 e3 fe e9
+RSP: 0018:ffff88810570fc68 EFLAGS: 00010293
+RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
+RDX: ffff888101f38f40 RSI: ffffffff8285e529 RDI: 0000000000000005
+RBP: 0000000000000ce0 R08: 0000000000000005 R09: 0000000000000000
+R10: 0000000000000ce0 R11: 0000000000000001 R12: ffff8881009e9488
+R13: ffffffff84af2cc0 R14: 0000000000000000 R15: ffff8881009e9458
+FS: 00007f7fdfbd5800(0000) GS:ffff88811b600000(0000) knlGS:0000000000000000
+CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+CR2: 0000001b32923000 CR3: 00000001062fc006 CR4: 0000000000170ef0
+Call Trace:
+ <TASK>
+ inet_csk_destroy_sock+0x1a1/0x320
+ __tcp_close+0xab6/0xe90
+ tcp_close+0x30/0xc0
+ inet_release+0xe9/0x1f0
+ inet6_release+0x4c/0x70
+ __sock_release+0xd2/0x280
+ sock_close+0x15/0x20
+ __fput+0x252/0xa20
+ task_work_run+0x169/0x250
+ exit_to_user_mode_prepare+0x113/0x120
+ syscall_exit_to_user_mode+0x1d/0x40
+ do_syscall_64+0x48/0x90
+ entry_SYSCALL_64_after_hwframe+0x72/0xdc
+RIP: 0033:0x7f7fdf7ae28d
+Code: c1 20 00 00 75 10 b8 03 00 00 00 0f 05 48 3d 01 f0 ff ff 73 31 c3 48 83 ec 08 e8 ee fb ff ff 48 89 04 24 b8 03 00 00 00 0f 05 <48> 8b 3c 24 48 89 c2 e8 37 fc ff ff 48 89 d0 48 83 c4 08 48 3d 01
+RSP: 002b:00000000007dfbb0 EFLAGS: 00000293 ORIG_RAX: 0000000000000003
+RAX: 0000000000000000 RBX: 0000000000000004 RCX: 00007f7fdf7ae28d
+RDX: 0000000000000000 RSI: ffffffffffffffff RDI: 0000000000000003
+RBP: 0000000000000000 R08: 000000007f338e0f R09: 0000000000000e0f
+R10: 000000007f338e13 R11: 0000000000000293 R12: 00007f7fdefff000
+R13: 00007f7fdefffcd8 R14: 00007f7fdefffce0 R15: 00007f7fdefffcd8
+ </TASK>
+
+[3]: https://lore.kernel.org/netdev/20230208004245.83497-1-kuniyu@amazon.com/
+
+Fixes: b5fc29233d28 ("inet6: Remove inet6_destroy_sock() in sk->sk_prot->destroy().")
+Reported-by: syzbot <syzkaller@googlegroups.com>
+Reported-by: Christoph Paasch <christophpaasch@icloud.com>
+Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ net/caif/caif_socket.c | 1 +
+ net/core/stream.c | 1 -
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/caif/caif_socket.c
++++ b/net/caif/caif_socket.c
+@@ -1020,6 +1020,7 @@ static void caif_sock_destructor(struct
+ return;
+ }
+ sk_stream_kill_queues(&cf_sk->sk);
++ WARN_ON(sk->sk_forward_alloc);
+ caif_free_client(&cf_sk->layer);
+ }
+
+--- a/net/core/stream.c
++++ b/net/core/stream.c
+@@ -209,7 +209,6 @@ void sk_stream_kill_queues(struct sock *
+ sk_mem_reclaim(sk);
+
+ WARN_ON(sk->sk_wmem_queued);
+- WARN_ON(sk->sk_forward_alloc);
+
+ /* It is _impossible_ for the backlog to contain anything
+ * when we get here. All user references to this socket
* @no_of_node: Device should not use the parent's of_node even if it's !NULL.
* @reg_read: Callback to read data.
* @reg_write: Callback to write data.
-@@ -87,6 +88,7 @@ struct nvmem_config {
+@@ -85,6 +86,7 @@ struct nvmem_config {
enum nvmem_type type;
bool read_only;
bool root_only;
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
-@@ -1614,9 +1614,9 @@ int nvmem_cell_read_u64(struct device *d
+@@ -1615,9 +1615,9 @@ int nvmem_cell_read_u64(struct device *d
}
EXPORT_SYMBOL_GPL(nvmem_cell_read_u64);
{
struct nvmem_cell *cell;
int nbits;
-@@ -1660,7 +1660,7 @@ int nvmem_cell_read_variable_le_u32(stru
+@@ -1661,7 +1661,7 @@ int nvmem_cell_read_variable_le_u32(stru
u32 *val)
{
size_t len;
int i;
buf = nvmem_cell_read_variable_common(dev, cell_id, sizeof(*val), &len);
-@@ -1691,7 +1691,7 @@ int nvmem_cell_read_variable_le_u64(stru
+@@ -1692,7 +1692,7 @@ int nvmem_cell_read_variable_le_u64(stru
u64 *val)
{
size_t len;
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
-@@ -827,8 +827,11 @@ struct nvmem_device *nvmem_register(cons
+@@ -850,8 +850,11 @@ struct nvmem_device *nvmem_register(cons
if (nvmem->nkeepout) {
rval = nvmem_validate_keepouts(nvmem);
}
return 0;
-@@ -1144,9 +1146,33 @@ struct nvmem_device *devm_nvmem_device_g
+@@ -1145,9 +1147,33 @@ struct nvmem_device *devm_nvmem_device_g
}
EXPORT_SYMBOL_GPL(devm_nvmem_device_get);
struct nvmem_cell *cell = ERR_PTR(-ENOENT);
struct nvmem_cell_lookup *lookup;
struct nvmem_device *nvmem;
-@@ -1171,11 +1197,15 @@ nvmem_cell_get_from_lookup(struct device
+@@ -1172,11 +1198,15 @@ nvmem_cell_get_from_lookup(struct device
break;
}
}
break;
}
-@@ -1186,10 +1216,10 @@ nvmem_cell_get_from_lookup(struct device
+@@ -1187,10 +1217,10 @@ nvmem_cell_get_from_lookup(struct device
}
#if IS_ENABLED(CONFIG_OF)
mutex_lock(&nvmem_mutex);
list_for_each_entry(iter, &nvmem->cells, node) {
-@@ -1219,6 +1249,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
+@@ -1220,6 +1250,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
{
struct device_node *cell_np, *nvmem_np;
struct nvmem_device *nvmem;
struct nvmem_cell *cell;
int index = 0;
-@@ -1239,12 +1270,16 @@ struct nvmem_cell *of_nvmem_cell_get(str
+@@ -1240,12 +1271,16 @@ struct nvmem_cell *of_nvmem_cell_get(str
if (IS_ERR(nvmem))
return ERR_CAST(nvmem);
return cell;
}
EXPORT_SYMBOL_GPL(of_nvmem_cell_get);
-@@ -1350,13 +1385,17 @@ EXPORT_SYMBOL(devm_nvmem_cell_put);
+@@ -1351,13 +1386,17 @@ EXPORT_SYMBOL(devm_nvmem_cell_put);
*/
void nvmem_cell_put(struct nvmem_cell *cell)
{
{
u8 *p, *b;
int i, extra, bit_offset = cell->bit_offset;
-@@ -1390,8 +1429,8 @@ static void nvmem_shift_read_buffer_in_p
+@@ -1391,8 +1430,8 @@ static void nvmem_shift_read_buffer_in_p
}
static int __nvmem_cell_read(struct nvmem_device *nvmem,
{
int rc;
-@@ -1422,18 +1461,18 @@ static int __nvmem_cell_read(struct nvme
+@@ -1423,18 +1462,18 @@ static int __nvmem_cell_read(struct nvme
*/
void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len)
{
if (rc) {
kfree(buf);
return ERR_PTR(rc);
-@@ -1443,7 +1482,7 @@ void *nvmem_cell_read(struct nvmem_cell
+@@ -1444,7 +1483,7 @@ void *nvmem_cell_read(struct nvmem_cell
}
EXPORT_SYMBOL_GPL(nvmem_cell_read);
u8 *_buf, int len)
{
struct nvmem_device *nvmem = cell->nvmem;
-@@ -1496,16 +1535,7 @@ err:
+@@ -1497,16 +1536,7 @@ err:
return ERR_PTR(rc);
}
{
struct nvmem_device *nvmem = cell->nvmem;
int rc;
-@@ -1531,6 +1561,21 @@ int nvmem_cell_write(struct nvmem_cell *
+@@ -1532,6 +1562,21 @@ int nvmem_cell_write(struct nvmem_cell *
return len;
}
EXPORT_SYMBOL_GPL(nvmem_cell_write);
static int nvmem_cell_read_common(struct device *dev, const char *cell_id,
-@@ -1633,7 +1678,7 @@ static const void *nvmem_cell_read_varia
+@@ -1634,7 +1679,7 @@ static const void *nvmem_cell_read_varia
if (IS_ERR(cell))
return cell;
buf = nvmem_cell_read(cell, len);
nvmem_cell_put(cell);
if (IS_ERR(buf))
-@@ -1729,18 +1774,18 @@ EXPORT_SYMBOL_GPL(nvmem_cell_read_variab
+@@ -1730,18 +1775,18 @@ EXPORT_SYMBOL_GPL(nvmem_cell_read_variab
ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,
struct nvmem_cell_info *info, void *buf)
{
if (rc)
return rc;
-@@ -1760,17 +1805,17 @@ EXPORT_SYMBOL_GPL(nvmem_device_cell_read
+@@ -1761,17 +1806,17 @@ EXPORT_SYMBOL_GPL(nvmem_device_cell_read
int nvmem_device_cell_write(struct nvmem_device *nvmem,
struct nvmem_cell_info *info, void *buf)
{
nvmem->keepout = config->keepout;
nvmem->nkeepout = config->nkeepout;
if (config->of_node)
-@@ -1443,6 +1445,13 @@ static int __nvmem_cell_read(struct nvme
+@@ -1444,6 +1446,13 @@ static int __nvmem_cell_read(struct nvme
if (cell->bit_offset || cell->nbits)
nvmem_shift_read_buffer_in_place(cell, buf);
* @size: Device size.
* @word_size: Minimum read/write access granularity.
* @stride: Minimum read/write access stride.
-@@ -94,6 +98,7 @@ struct nvmem_config {
+@@ -92,6 +96,7 @@ struct nvmem_config {
bool no_of_node;
nvmem_reg_read_t reg_read;
nvmem_reg_write_t reg_write;
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
-@@ -945,28 +945,6 @@ struct nvmem_device *devm_nvmem_register
+@@ -946,28 +946,6 @@ struct nvmem_device *devm_nvmem_register
}
EXPORT_SYMBOL_GPL(devm_nvmem_register);
{
--- a/include/linux/nvmem-provider.h
+++ b/include/linux/nvmem-provider.h
-@@ -135,8 +135,6 @@ void nvmem_unregister(struct nvmem_devic
+@@ -133,8 +133,6 @@ void nvmem_unregister(struct nvmem_devic
struct nvmem_device *devm_nvmem_register(struct device *dev,
const struct nvmem_config *cfg);
void nvmem_add_cell_table(struct nvmem_cell_table *table);
void nvmem_del_cell_table(struct nvmem_cell_table *table);
-@@ -155,12 +153,6 @@ devm_nvmem_register(struct device *dev,
+@@ -153,12 +151,6 @@ devm_nvmem_register(struct device *dev,
return nvmem_register(c);
}
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
-@@ -907,9 +907,9 @@ void nvmem_unregister(struct nvmem_devic
+@@ -908,9 +908,9 @@ void nvmem_unregister(struct nvmem_devic
}
EXPORT_SYMBOL_GPL(nvmem_unregister);
}
/**
-@@ -926,20 +926,16 @@ static void devm_nvmem_release(struct de
+@@ -927,20 +927,16 @@ static void devm_nvmem_release(struct de
struct nvmem_device *devm_nvmem_register(struct device *dev,
const struct nvmem_config *config)
{
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
-@@ -903,7 +903,8 @@ static void nvmem_device_release(struct
+@@ -904,7 +904,8 @@ static void nvmem_device_release(struct
*/
void nvmem_unregister(struct nvmem_device *nvmem)
{
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
-@@ -830,21 +830,18 @@ struct nvmem_device *nvmem_register(cons
+@@ -833,6 +833,12 @@ struct nvmem_device *nvmem_register(cons
nvmem->dev.groups = nvmem_dev_groups;
#endif
++ if (nvmem->nkeepout) {
++ rval = nvmem_validate_keepouts(nvmem);
++ if (rval)
++ goto err_put_device;
++ }
++
+ if (config->compat) {
+ rval = nvmem_sysfs_setup_compat(nvmem, config);
+ if (rval)
+@@ -853,15 +859,6 @@ struct nvmem_device *nvmem_register(cons
+ if (rval)
+ goto err_remove_cells;
+
- if (nvmem->nkeepout) {
- rval = nvmem_validate_keepouts(nvmem);
- if (rval) {
-
dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name);
- rval = device_register(&nvmem->dev);
- if (rval)
- goto err_put_device;
-
-+ if (nvmem->nkeepout) {
-+ rval = nvmem_validate_keepouts(nvmem);
-+ if (rval)
-+ goto err_device_del;
-+ }
-+
- if (config->compat) {
- rval = nvmem_sysfs_setup_compat(nvmem, config);
- if (rval)
+ rval = device_add(&nvmem->dev);
+++ /dev/null
-From 5544e90c81261e82e02bbf7c6015a4b9c8c825ef Mon Sep 17 00:00:00 2001
-From: Gaosheng Cui <cuigaosheng1@huawei.com>
-Date: Fri, 16 Sep 2022 13:20:50 +0100
-Subject: [PATCH] nvmem: core: add error handling for dev_set_name
-
-The type of return value of dev_set_name is int, which may return
-wrong result, so we add error handling for it to reclaim memory
-of nvmem resource, and return early when an error occurs.
-
-Signed-off-by: Gaosheng Cui <cuigaosheng1@huawei.com>
-Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
-Link: https://lore.kernel.org/r/20220916122100.170016-4-srinivas.kandagatla@linaro.org
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/nvmem/core.c | 12 +++++++++---
- 1 file changed, 9 insertions(+), 3 deletions(-)
-
---- a/drivers/nvmem/core.c
-+++ b/drivers/nvmem/core.c
-@@ -811,18 +811,24 @@ struct nvmem_device *nvmem_register(cons
-
- switch (config->id) {
- case NVMEM_DEVID_NONE:
-- dev_set_name(&nvmem->dev, "%s", config->name);
-+ rval = dev_set_name(&nvmem->dev, "%s", config->name);
- break;
- case NVMEM_DEVID_AUTO:
-- dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
-+ rval = dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
- break;
- default:
-- dev_set_name(&nvmem->dev, "%s%d",
-+ rval = dev_set_name(&nvmem->dev, "%s%d",
- config->name ? : "nvmem",
- config->name ? config->id : nvmem->id);
- break;
- }
-
-+ if (rval) {
-+ ida_free(&nvmem_ida, nvmem->id);
-+ kfree(nvmem);
-+ return ERR_PTR(rval);
-+ }
-+
- nvmem->read_only = device_property_present(config->dev, "read-only") ||
- config->read_only || !nvmem->reg_write;
-
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
-@@ -1242,16 +1242,21 @@ struct nvmem_cell *of_nvmem_cell_get(str
+@@ -1237,16 +1237,21 @@ struct nvmem_cell *of_nvmem_cell_get(str
if (!cell_np)
return ERR_PTR(-ENOENT);
};
static DEFINE_MUTEX(nvmem_mutex);
-@@ -1127,7 +1128,8 @@ struct nvmem_device *devm_nvmem_device_g
+@@ -1122,7 +1123,8 @@ struct nvmem_device *devm_nvmem_device_g
}
EXPORT_SYMBOL_GPL(devm_nvmem_device_get);
{
struct nvmem_cell *cell;
const char *name = NULL;
-@@ -1146,6 +1148,7 @@ static struct nvmem_cell *nvmem_create_c
+@@ -1141,6 +1143,7 @@ static struct nvmem_cell *nvmem_create_c
cell->id = name;
cell->entry = entry;
return cell;
}
-@@ -1184,7 +1187,7 @@ nvmem_cell_get_from_lookup(struct device
+@@ -1179,7 +1182,7 @@ nvmem_cell_get_from_lookup(struct device
__nvmem_device_put(nvmem);
cell = ERR_PTR(-ENOENT);
} else {
if (IS_ERR(cell))
__nvmem_device_put(nvmem);
}
-@@ -1232,15 +1235,27 @@ struct nvmem_cell *of_nvmem_cell_get(str
+@@ -1227,15 +1230,27 @@ struct nvmem_cell *of_nvmem_cell_get(str
struct nvmem_device *nvmem;
struct nvmem_cell_entry *cell_entry;
struct nvmem_cell *cell;
nvmem_np = of_get_parent(cell_np);
if (!nvmem_np) {
-@@ -1262,7 +1277,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
+@@ -1257,7 +1272,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
return ERR_PTR(-ENOENT);
}
if (IS_ERR(cell))
__nvmem_device_put(nvmem);
-@@ -1415,8 +1430,8 @@ static void nvmem_shift_read_buffer_in_p
+@@ -1410,8 +1425,8 @@ static void nvmem_shift_read_buffer_in_p
}
static int __nvmem_cell_read(struct nvmem_device *nvmem,
{
int rc;
-@@ -1430,7 +1445,7 @@ static int __nvmem_cell_read(struct nvme
+@@ -1425,7 +1440,7 @@ static int __nvmem_cell_read(struct nvme
nvmem_shift_read_buffer_in_place(cell, buf);
if (nvmem->cell_post_process) {
cell->offset, buf, cell->bytes);
if (rc)
return rc;
-@@ -1465,7 +1480,7 @@ void *nvmem_cell_read(struct nvmem_cell
+@@ -1460,7 +1475,7 @@ void *nvmem_cell_read(struct nvmem_cell
if (!buf)
return ERR_PTR(-ENOMEM);
if (rc) {
kfree(buf);
return ERR_PTR(rc);
-@@ -1778,7 +1793,7 @@ ssize_t nvmem_device_cell_read(struct nv
+@@ -1773,7 +1788,7 @@ ssize_t nvmem_device_cell_read(struct nv
if (rc)
return rc;
/**
--- a/include/linux/nvmem-provider.h
+++ b/include/linux/nvmem-provider.h
-@@ -155,6 +155,9 @@ struct nvmem_device *devm_nvmem_register
+@@ -153,6 +153,9 @@ struct nvmem_device *devm_nvmem_register
void nvmem_add_cell_table(struct nvmem_cell_table *table);
void nvmem_del_cell_table(struct nvmem_cell_table *table);
#else
static inline struct nvmem_device *nvmem_register(const struct nvmem_config *c)
-@@ -172,6 +175,11 @@ devm_nvmem_register(struct device *dev,
+@@ -170,6 +173,11 @@ devm_nvmem_register(struct device *dev,
static inline void nvmem_add_cell_table(struct nvmem_cell_table *table) {}
static inline void nvmem_del_cell_table(struct nvmem_cell_table *table) {}
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
-@@ -5046,6 +5046,10 @@ int stmmac_dvr_probe(struct device *devi
+@@ -5047,6 +5047,10 @@ int stmmac_dvr_probe(struct device *devi
reset_control_reset(priv->plat->stmmac_rst);
}
/* Init MAC and get the capabilities */
ret = stmmac_hw_init(priv);
if (ret)
-@@ -5260,6 +5264,7 @@ int stmmac_dvr_remove(struct device *dev
+@@ -5261,6 +5265,7 @@ int stmmac_dvr_remove(struct device *dev
phylink_destroy(priv->phylink);
if (priv->plat->stmmac_rst)
reset_control_assert(priv->plat->stmmac_rst);