From: Sasha Levin Date: Sun, 20 Feb 2022 23:55:48 +0000 (-0500) Subject: Fixes for 4.19 X-Git-Tag: v4.9.303~26^2~11 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2ace624d4f973276308a434286694b730611a0e8;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 4.19 Signed-off-by: Sasha Levin --- diff --git a/queue-4.19/drivers-hv-vmbus-expose-monitor-data-only-when-monit.patch b/queue-4.19/drivers-hv-vmbus-expose-monitor-data-only-when-monit.patch new file mode 100644 index 00000000000..a5e052bf3aa --- /dev/null +++ b/queue-4.19/drivers-hv-vmbus-expose-monitor-data-only-when-monit.patch @@ -0,0 +1,235 @@ +From 043d2dffb7166a898f4f07663b902d9f2b2d8a72 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Mar 2019 00:04:01 -0400 +Subject: Drivers: hv: vmbus: Expose monitor data only when monitor pages are + used +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Kimberly Brown + +[ Upstream commit 46fc15487d02451448c11b83c4d086d87a6ad588 ] + +There are two methods for signaling the host: the monitor page mechanism +and hypercalls. The monitor page mechanism is used by performance +critical channels (storage, networking, etc.) because it provides +improved throughput. However, latency is increased. Monitor pages are +allocated to these channels. + +Monitor pages are not allocated to channels that do not use the monitor +page mechanism. Therefore, these channels do not have a valid monitor id +or valid monitor page data. In these cases, some of the "_show" +functions return incorrect data. They return an invalid monitor id and +data that is beyond the bounds of the hv_monitor_page array fields. + +The "channel->offermsg.monitor_allocated" value can be used to determine +whether monitor pages have been allocated to a channel. + +Add "is_visible()" callback functions for the device-level and +channel-level attribute groups. These functions will hide the monitor +sysfs files when the monitor mechanism is not used. + +Remove ".default_attributes" from "vmbus_chan_attrs" and create a +channel-level attribute group. These changes allow the new +"is_visible()" callback function to be applied to the channel-level +attributes. + +Call "sysfs_create_group()" in "vmbus_add_channel_kobj()" to create the +channel's sysfs files. Add a new function, +“vmbus_remove_channel_attr_group()”, and call it in "free_channel()" to +remove the channel's sysfs files when the channel is closed. + +Signed-off-by: Kimberly Brown +Reviewed-by: Greg Kroah-Hartman +Reviewed-by: Michael Kelley +Signed-off-by: Sasha Levin +--- + Documentation/ABI/stable/sysfs-bus-vmbus | 12 +++- + drivers/hv/channel_mgmt.c | 1 + + drivers/hv/hyperv_vmbus.h | 2 + + drivers/hv/vmbus_drv.c | 77 +++++++++++++++++++++++- + 4 files changed, 87 insertions(+), 5 deletions(-) + +diff --git a/Documentation/ABI/stable/sysfs-bus-vmbus b/Documentation/ABI/stable/sysfs-bus-vmbus +index 3fed8fdb873d7..c4ffdfc324b41 100644 +--- a/Documentation/ABI/stable/sysfs-bus-vmbus ++++ b/Documentation/ABI/stable/sysfs-bus-vmbus +@@ -81,7 +81,9 @@ What: /sys/bus/vmbus/devices//channels//latency + Date: September. 2017 + KernelVersion: 4.14 + Contact: Stephen Hemminger +-Description: Channel signaling latency ++Description: Channel signaling latency. This file is available only for ++ performance critical channels (storage, network, etc.) that use ++ the monitor page mechanism. + Users: Debugging tools + + What: /sys/bus/vmbus/devices//channels//out_mask +@@ -95,7 +97,9 @@ What: /sys/bus/vmbus/devices//channels//pending + Date: September. 2017 + KernelVersion: 4.14 + Contact: Stephen Hemminger +-Description: Channel interrupt pending state ++Description: Channel interrupt pending state. This file is available only for ++ performance critical channels (storage, network, etc.) that use ++ the monitor page mechanism. + Users: Debugging tools + + What: /sys/bus/vmbus/devices//channels//read_avail +@@ -137,7 +141,9 @@ What: /sys/bus/vmbus/devices//channels//monitor_id + Date: January. 2018 + KernelVersion: 4.16 + Contact: Stephen Hemminger +-Description: Monitor bit associated with channel ++Description: Monitor bit associated with channel. This file is available only ++ for performance critical channels (storage, network, etc.) that ++ use the monitor page mechanism. + Users: Debugging tools and userspace drivers + + What: /sys/bus/vmbus/devices//channels//ring +diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c +index cdd4392c589d3..a3f6933f94e30 100644 +--- a/drivers/hv/channel_mgmt.c ++++ b/drivers/hv/channel_mgmt.c +@@ -350,6 +350,7 @@ static struct vmbus_channel *alloc_channel(void) + static void free_channel(struct vmbus_channel *channel) + { + tasklet_kill(&channel->callback_event); ++ vmbus_remove_channel_attr_group(channel); + + kobject_put(&channel->kobj); + } +diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h +index 7e7c8debbd285..c4ad518890243 100644 +--- a/drivers/hv/hyperv_vmbus.h ++++ b/drivers/hv/hyperv_vmbus.h +@@ -392,6 +392,8 @@ void vmbus_device_unregister(struct hv_device *device_obj); + int vmbus_add_channel_kobj(struct hv_device *device_obj, + struct vmbus_channel *channel); + ++void vmbus_remove_channel_attr_group(struct vmbus_channel *channel); ++ + struct vmbus_channel *relid2channel(u32 relid); + + void vmbus_free_channels(void); +diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c +index 0699c60188895..aab21c1534a10 100644 +--- a/drivers/hv/vmbus_drv.c ++++ b/drivers/hv/vmbus_drv.c +@@ -609,7 +609,36 @@ static struct attribute *vmbus_dev_attrs[] = { + &dev_attr_device.attr, + NULL, + }; +-ATTRIBUTE_GROUPS(vmbus_dev); ++ ++/* ++ * Device-level attribute_group callback function. Returns the permission for ++ * each attribute, and returns 0 if an attribute is not visible. ++ */ ++static umode_t vmbus_dev_attr_is_visible(struct kobject *kobj, ++ struct attribute *attr, int idx) ++{ ++ struct device *dev = kobj_to_dev(kobj); ++ const struct hv_device *hv_dev = device_to_hv_device(dev); ++ ++ /* Hide the monitor attributes if the monitor mechanism is not used. */ ++ if (!hv_dev->channel->offermsg.monitor_allocated && ++ (attr == &dev_attr_monitor_id.attr || ++ attr == &dev_attr_server_monitor_pending.attr || ++ attr == &dev_attr_client_monitor_pending.attr || ++ attr == &dev_attr_server_monitor_latency.attr || ++ attr == &dev_attr_client_monitor_latency.attr || ++ attr == &dev_attr_server_monitor_conn_id.attr || ++ attr == &dev_attr_client_monitor_conn_id.attr)) ++ return 0; ++ ++ return attr->mode; ++} ++ ++static const struct attribute_group vmbus_dev_group = { ++ .attrs = vmbus_dev_attrs, ++ .is_visible = vmbus_dev_attr_is_visible ++}; ++__ATTRIBUTE_GROUPS(vmbus_dev); + + /* + * vmbus_uevent - add uevent for our device +@@ -1484,10 +1513,34 @@ static struct attribute *vmbus_chan_attrs[] = { + NULL + }; + ++/* ++ * Channel-level attribute_group callback function. Returns the permission for ++ * each attribute, and returns 0 if an attribute is not visible. ++ */ ++static umode_t vmbus_chan_attr_is_visible(struct kobject *kobj, ++ struct attribute *attr, int idx) ++{ ++ const struct vmbus_channel *channel = ++ container_of(kobj, struct vmbus_channel, kobj); ++ ++ /* Hide the monitor attributes if the monitor mechanism is not used. */ ++ if (!channel->offermsg.monitor_allocated && ++ (attr == &chan_attr_pending.attr || ++ attr == &chan_attr_latency.attr || ++ attr == &chan_attr_monitor_id.attr)) ++ return 0; ++ ++ return attr->mode; ++} ++ ++static struct attribute_group vmbus_chan_group = { ++ .attrs = vmbus_chan_attrs, ++ .is_visible = vmbus_chan_attr_is_visible ++}; ++ + static struct kobj_type vmbus_chan_ktype = { + .sysfs_ops = &vmbus_chan_sysfs_ops, + .release = vmbus_chan_release, +- .default_attrs = vmbus_chan_attrs, + }; + + /* +@@ -1495,6 +1548,7 @@ static struct kobj_type vmbus_chan_ktype = { + */ + int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel) + { ++ const struct device *device = &dev->device; + struct kobject *kobj = &channel->kobj; + u32 relid = channel->offermsg.child_relid; + int ret; +@@ -1505,11 +1559,30 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel) + if (ret) + return ret; + ++ ret = sysfs_create_group(kobj, &vmbus_chan_group); ++ ++ if (ret) { ++ /* ++ * The calling functions' error handling paths will cleanup the ++ * empty channel directory. ++ */ ++ dev_err(device, "Unable to set up channel sysfs files\n"); ++ return ret; ++ } ++ + kobject_uevent(kobj, KOBJ_ADD); + + return 0; + } + ++/* ++ * vmbus_remove_channel_attr_group - remove the channel's attribute group ++ */ ++void vmbus_remove_channel_attr_group(struct vmbus_channel *channel) ++{ ++ sysfs_remove_group(&channel->kobj, &vmbus_chan_group); ++} ++ + /* + * vmbus_device_create - Creates and registers a new child device + * on the vmbus. +-- +2.34.1 + diff --git a/queue-4.19/drivers-hv-vmbus-fix-memory-leak-in-vmbus_add_channe.patch b/queue-4.19/drivers-hv-vmbus-fix-memory-leak-in-vmbus_add_channe.patch new file mode 100644 index 00000000000..a066ef6a4e3 --- /dev/null +++ b/queue-4.19/drivers-hv-vmbus-fix-memory-leak-in-vmbus_add_channe.patch @@ -0,0 +1,57 @@ +From 99f192ecf2b5941496a33059802a4c4c81b196a4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 4 Feb 2022 01:30:08 +0800 +Subject: Drivers: hv: vmbus: Fix memory leak in vmbus_add_channel_kobj +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Miaoqian Lin + +[ Upstream commit 8bc69f86328e87a0ffa79438430cc82f3aa6a194 ] + +kobject_init_and_add() takes reference even when it fails. +According to the doc of kobject_init_and_add(): + + If this function returns an error, kobject_put() must be called to + properly clean up the memory associated with the object. + +Fix memory leak by calling kobject_put(). + +Fixes: c2e5df616e1a ("vmbus: add per-channel sysfs info") +Signed-off-by: Miaoqian Lin +Reviewed-by: Juan Vazquez +Link: https://lore.kernel.org/r/20220203173008.43480-1-linmq006@gmail.com +Signed-off-by: Wei Liu +Signed-off-by: Sasha Levin +--- + drivers/hv/vmbus_drv.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c +index aab21c1534a10..51fe219c91fc3 100644 +--- a/drivers/hv/vmbus_drv.c ++++ b/drivers/hv/vmbus_drv.c +@@ -1556,8 +1556,10 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel) + kobj->kset = dev->channels_kset; + ret = kobject_init_and_add(kobj, &vmbus_chan_ktype, NULL, + "%u", relid); +- if (ret) ++ if (ret) { ++ kobject_put(kobj); + return ret; ++ } + + ret = sysfs_create_group(kobj, &vmbus_chan_group); + +@@ -1566,6 +1568,7 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel) + * The calling functions' error handling paths will cleanup the + * empty channel directory. + */ ++ kobject_put(kobj); + dev_err(device, "Unable to set up channel sysfs files\n"); + return ret; + } +-- +2.34.1 + diff --git a/queue-4.19/kvm-x86-pmu-use-amd64_raw_event_mask-for-perf_type_r.patch b/queue-4.19/kvm-x86-pmu-use-amd64_raw_event_mask-for-perf_type_r.patch new file mode 100644 index 00000000000..4067597fd21 --- /dev/null +++ b/queue-4.19/kvm-x86-pmu-use-amd64_raw_event_mask-for-perf_type_r.patch @@ -0,0 +1,39 @@ +From 25d82d425ee588b5393c1fd698ad484feb5f25f6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Feb 2022 17:48:13 -0800 +Subject: KVM: x86/pmu: Use AMD64_RAW_EVENT_MASK for PERF_TYPE_RAW + +From: Jim Mattson + +[ Upstream commit 710c476514313c74045c41c0571bb5178fd16e3d ] + +AMD's event select is 3 nybbles, with the high nybble in bits 35:32 of +a PerfEvtSeln MSR. Don't mask off the high nybble when configuring a +RAW perf event. + +Fixes: ca724305a2b0 ("KVM: x86/vPMU: Implement AMD vPMU code for KVM") +Signed-off-by: Jim Mattson +Message-Id: <20220203014813.2130559-2-jmattson@google.com> +Reviewed-by: David Dunn +Signed-off-by: Paolo Bonzini +Signed-off-by: Sasha Levin +--- + arch/x86/kvm/pmu.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c +index acc8d217f6565..ad3d39c00d7fc 100644 +--- a/arch/x86/kvm/pmu.c ++++ b/arch/x86/kvm/pmu.c +@@ -171,7 +171,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel) + } + + if (type == PERF_TYPE_RAW) +- config = eventsel & X86_RAW_EVENT_MASK; ++ config = eventsel & AMD64_RAW_EVENT_MASK; + + pmc_reprogram_counter(pmc, type, config, + !(eventsel & ARCH_PERFMON_EVENTSEL_USR), +-- +2.34.1 + diff --git a/queue-4.19/mtd-rawnand-brcmnand-fixed-incorrect-sub-page-ecc-st.patch b/queue-4.19/mtd-rawnand-brcmnand-fixed-incorrect-sub-page-ecc-st.patch new file mode 100644 index 00000000000..76ca4cd5dc5 --- /dev/null +++ b/queue-4.19/mtd-rawnand-brcmnand-fixed-incorrect-sub-page-ecc-st.patch @@ -0,0 +1,48 @@ +From 9294c0a406b77114d8c8db99512d5287be2a2e26 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jan 2022 23:43:44 +0100 +Subject: mtd: rawnand: brcmnand: Fixed incorrect sub-page ECC status + +From: david regan + +[ Upstream commit 36415a7964711822e63695ea67fede63979054d9 ] + +The brcmnand driver contains a bug in which if a page (example 2k byte) +is read from the parallel/ONFI NAND and within that page a subpage (512 +byte) has correctable errors which is followed by a subpage with +uncorrectable errors, the page read will return the wrong status of +correctable (as opposed to the actual status of uncorrectable.) + +The bug is in function brcmnand_read_by_pio where there is a check for +uncorrectable bits which will be preempted if a previous status for +correctable bits is detected. + +The fix is to stop checking for bad bits only if we already have a bad +bits status. + +Fixes: 27c5b17cd1b1 ("mtd: nand: add NAND driver "library" for Broadcom STB NAND controller") +Signed-off-by: david regan +Reviewed-by: Florian Fainelli +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/trinity-478e0c09-9134-40e8-8f8c-31c371225eda-1643237024774@3c-app-mailcom-lxa02 +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/brcmnand/brcmnand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +index db18198f2834f..27bafb8fc35af 100644 +--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +@@ -1673,7 +1673,7 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, + mtd->oobsize / trans, + host->hwcfg.sector_size_1k); + +- if (!ret) { ++ if (ret != -EBADMSG) { + *err_addr = brcmnand_get_uncorrecc_addr(ctrl); + + if (*err_addr) +-- +2.34.1 + diff --git a/queue-4.19/mtd-rawnand-brcmnand-refactored-code-to-introduce-he.patch b/queue-4.19/mtd-rawnand-brcmnand-refactored-code-to-introduce-he.patch new file mode 100644 index 00000000000..3ec7de30e17 --- /dev/null +++ b/queue-4.19/mtd-rawnand-brcmnand-refactored-code-to-introduce-he.patch @@ -0,0 +1,185 @@ +From c35ba1cb8e3cceab6cdf3abbe496f1ceaeaa31e0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 4 Jun 2019 10:36:29 -0400 +Subject: mtd: rawnand: brcmnand: Refactored code to introduce helper functions + +From: Kamal Dasu + +[ Upstream commit 3c7c1e4594efd57b98ae6f7298f40cff4f4fb47b ] + +Refactored NAND ECC and CMD address configuration code to use helper +functions. + +Signed-off-by: Kamal Dasu +Signed-off-by: Miquel Raynal +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/brcmnand/brcmnand.c | 100 ++++++++++++++--------- + 1 file changed, 62 insertions(+), 38 deletions(-) + +diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +index 774ffa9e23f38..db18198f2834f 100644 +--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +@@ -589,6 +589,54 @@ static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl, + __raw_writel(val, ctrl->nand_fc + word * 4); + } + ++static void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl) ++{ ++ ++ /* Clear error addresses */ ++ brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0); ++ brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0); ++ brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0); ++ brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0); ++} ++ ++static u64 brcmnand_get_uncorrecc_addr(struct brcmnand_controller *ctrl) ++{ ++ u64 err_addr; ++ ++ err_addr = brcmnand_read_reg(ctrl, BRCMNAND_UNCORR_ADDR); ++ err_addr |= ((u64)(brcmnand_read_reg(ctrl, ++ BRCMNAND_UNCORR_EXT_ADDR) ++ & 0xffff) << 32); ++ ++ return err_addr; ++} ++ ++static u64 brcmnand_get_correcc_addr(struct brcmnand_controller *ctrl) ++{ ++ u64 err_addr; ++ ++ err_addr = brcmnand_read_reg(ctrl, BRCMNAND_CORR_ADDR); ++ err_addr |= ((u64)(brcmnand_read_reg(ctrl, ++ BRCMNAND_CORR_EXT_ADDR) ++ & 0xffff) << 32); ++ ++ return err_addr; ++} ++ ++static void brcmnand_set_cmd_addr(struct mtd_info *mtd, u64 addr) ++{ ++ struct nand_chip *chip = mtd_to_nand(mtd); ++ struct brcmnand_host *host = nand_get_controller_data(chip); ++ struct brcmnand_controller *ctrl = host->ctrl; ++ ++ brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, ++ (host->cs << 16) | ((addr >> 32) & 0xffff)); ++ (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); ++ brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, ++ lower_32_bits(addr)); ++ (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); ++} ++ + static inline u16 brcmnand_cs_offset(struct brcmnand_controller *ctrl, int cs, + enum brcmnand_cs_reg reg) + { +@@ -1217,9 +1265,12 @@ static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd) + { + struct brcmnand_controller *ctrl = host->ctrl; + int ret; ++ u64 cmd_addr; ++ ++ cmd_addr = brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); ++ ++ dev_dbg(ctrl->dev, "send native cmd %d addr 0x%llx\n", cmd, cmd_addr); + +- dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd, +- brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS)); + BUG_ON(ctrl->cmd_pending != 0); + ctrl->cmd_pending = cmd; + +@@ -1380,12 +1431,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command, + if (!native_cmd) + return; + +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, +- (host->cs << 16) | ((addr >> 32) & 0xffff)); +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, lower_32_bits(addr)); +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); +- ++ brcmnand_set_cmd_addr(mtd, addr); + brcmnand_send_cmd(host, native_cmd); + brcmnand_waitfunc(mtd, chip); + +@@ -1605,20 +1651,10 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, + struct brcmnand_controller *ctrl = host->ctrl; + int i, j, ret = 0; + +- /* Clear error addresses */ +- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0); +- brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0); +- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0); +- brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0); +- +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, +- (host->cs << 16) | ((addr >> 32) & 0xffff)); +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); ++ brcmnand_clear_ecc_addr(ctrl); + + for (i = 0; i < trans; i++, addr += FC_BYTES) { +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, +- lower_32_bits(addr)); +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); ++ brcmnand_set_cmd_addr(mtd, addr); + /* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */ + brcmnand_send_cmd(host, CMD_PAGE_READ); + brcmnand_waitfunc(mtd, chip); +@@ -1638,21 +1674,15 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, + host->hwcfg.sector_size_1k); + + if (!ret) { +- *err_addr = brcmnand_read_reg(ctrl, +- BRCMNAND_UNCORR_ADDR) | +- ((u64)(brcmnand_read_reg(ctrl, +- BRCMNAND_UNCORR_EXT_ADDR) +- & 0xffff) << 32); ++ *err_addr = brcmnand_get_uncorrecc_addr(ctrl); ++ + if (*err_addr) + ret = -EBADMSG; + } + + if (!ret) { +- *err_addr = brcmnand_read_reg(ctrl, +- BRCMNAND_CORR_ADDR) | +- ((u64)(brcmnand_read_reg(ctrl, +- BRCMNAND_CORR_EXT_ADDR) +- & 0xffff) << 32); ++ *err_addr = brcmnand_get_correcc_addr(ctrl); ++ + if (*err_addr) + ret = -EUCLEAN; + } +@@ -1722,7 +1752,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip, + dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf); + + try_dmaread: +- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_COUNT, 0); ++ brcmnand_clear_ecc_addr(ctrl); + + if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) { + err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES, +@@ -1866,15 +1896,9 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip, + goto out; + } + +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, +- (host->cs << 16) | ((addr >> 32) & 0xffff)); +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); +- + for (i = 0; i < trans; i++, addr += FC_BYTES) { + /* full address MUST be set before populating FC */ +- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, +- lower_32_bits(addr)); +- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); ++ brcmnand_set_cmd_addr(mtd, addr); + + if (buf) { + brcmnand_soc_data_bus_prepare(ctrl->soc, false); +-- +2.34.1 + diff --git a/queue-4.19/series b/queue-4.19/series index eb73930627b..3bd95f4e732 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -38,3 +38,8 @@ block-wbt-fix-negative-inflight-counter-when-remove-scsi-device.patch nfs-lookup_directory-is-also-ok-with-symlinks.patch nfs-do-not-report-writeback-errors-in-nfs_getattr.patch mtd-rawnand-qcom-fix-clock-sequencing-in-qcom_nandc_probe.patch +mtd-rawnand-brcmnand-refactored-code-to-introduce-he.patch +mtd-rawnand-brcmnand-fixed-incorrect-sub-page-ecc-st.patch +drivers-hv-vmbus-expose-monitor-data-only-when-monit.patch +drivers-hv-vmbus-fix-memory-leak-in-vmbus_add_channe.patch +kvm-x86-pmu-use-amd64_raw_event_mask-for-perf_type_r.patch