From: Sasha Levin Date: Sun, 15 Dec 2019 21:31:08 +0000 (-0500) Subject: fixes for 4.19 X-Git-Tag: v5.4.4~51 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1dc40adf500fab9f424c910bf6f43c11685a40ea;p=thirdparty%2Fkernel%2Fstable-queue.git fixes for 4.19 Signed-off-by: Sasha Levin --- diff --git a/queue-4.19/ath10k-fix-fw-crash-by-moving-chip-reset-after-napi-.patch b/queue-4.19/ath10k-fix-fw-crash-by-moving-chip-reset-after-napi-.patch new file mode 100644 index 00000000000..286c80c14c5 --- /dev/null +++ b/queue-4.19/ath10k-fix-fw-crash-by-moving-chip-reset-after-napi-.patch @@ -0,0 +1,74 @@ +From b7fa969a60bef0faa53bc575e26d57e788d89129 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 May 2019 11:16:22 +0800 +Subject: ath10k: fix fw crash by moving chip reset after napi disabled + +From: Miaoqing Pan + +[ Upstream commit 08d80e4cd27ba19f9bee9e5f788f9a9fc440a22f ] + +On SMP platform, when continuously running wifi up/down, the napi +poll can be scheduled during chip reset, which will call +ath10k_pci_has_fw_crashed() to check the fw status. But in the reset +period, the value from FW_INDICATOR_ADDRESS register will return +0xdeadbeef, which also be treated as fw crash. Fix the issue by +moving chip reset after napi disabled. + +ath10k_pci 0000:01:00.0: firmware crashed! (guid 73b30611-5b1e-4bdd-90b4-64c81eb947b6) +ath10k_pci 0000:01:00.0: qca9984/qca9994 hw1.0 target 0x01000000 chip_id 0x00000000 sub 168c:cafe +ath10k_pci 0000:01:00.0: htt-ver 2.2 wmi-op 6 htt-op 4 cal otp max-sta 512 raw 0 hwcrypto 1 +ath10k_pci 0000:01:00.0: failed to get memcpy hi address for firmware address 4: -16 +ath10k_pci 0000:01:00.0: failed to read firmware dump area: -16 +ath10k_pci 0000:01:00.0: Copy Engine register dump: +ath10k_pci 0000:01:00.0: [00]: 0x0004a000 0 0 0 0 +ath10k_pci 0000:01:00.0: [01]: 0x0004a400 0 0 0 0 +ath10k_pci 0000:01:00.0: [02]: 0x0004a800 0 0 0 0 +ath10k_pci 0000:01:00.0: [03]: 0x0004ac00 0 0 0 0 +ath10k_pci 0000:01:00.0: [04]: 0x0004b000 0 0 0 0 +ath10k_pci 0000:01:00.0: [05]: 0x0004b400 0 0 0 0 +ath10k_pci 0000:01:00.0: [06]: 0x0004b800 0 0 0 0 +ath10k_pci 0000:01:00.0: [07]: 0x0004bc00 1 0 1 0 +ath10k_pci 0000:01:00.0: [08]: 0x0004c000 0 0 0 0 +ath10k_pci 0000:01:00.0: [09]: 0x0004c400 0 0 0 0 +ath10k_pci 0000:01:00.0: [10]: 0x0004c800 0 0 0 0 +ath10k_pci 0000:01:00.0: [11]: 0x0004cc00 0 0 0 0 + +Tested HW: QCA9984,QCA9887,WCN3990 + +Signed-off-by: Miaoqing Pan +Signed-off-by: Kalle Valo +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath10k/pci.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c +index 50a801a5d4f15..2a503aacf0c64 100644 +--- a/drivers/net/wireless/ath/ath10k/pci.c ++++ b/drivers/net/wireless/ath/ath10k/pci.c +@@ -2052,6 +2052,11 @@ static void ath10k_pci_hif_stop(struct ath10k *ar) + + ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot hif stop\n"); + ++ ath10k_pci_irq_disable(ar); ++ ath10k_pci_irq_sync(ar); ++ napi_synchronize(&ar->napi); ++ napi_disable(&ar->napi); ++ + /* Most likely the device has HTT Rx ring configured. The only way to + * prevent the device from accessing (and possible corrupting) host + * memory is to reset the chip now. +@@ -2065,10 +2070,6 @@ static void ath10k_pci_hif_stop(struct ath10k *ar) + */ + ath10k_pci_safe_chip_reset(ar); + +- ath10k_pci_irq_disable(ar); +- ath10k_pci_irq_sync(ar); +- napi_synchronize(&ar->napi); +- napi_disable(&ar->napi); + ath10k_pci_flush(ar); + + spin_lock_irqsave(&ar_pci->ps_lock, flags); +-- +2.20.1 + diff --git a/queue-4.19/drbd-change-drbd_request_detach_interruptible-s-retu.patch b/queue-4.19/drbd-change-drbd_request_detach_interruptible-s-retu.patch new file mode 100644 index 00000000000..ad6d8c2821a --- /dev/null +++ b/queue-4.19/drbd-change-drbd_request_detach_interruptible-s-retu.patch @@ -0,0 +1,67 @@ +From 209d53e41da6df448ebc1a78bad0c7bfb7ae5619 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 20 Dec 2018 17:23:44 +0100 +Subject: drbd: Change drbd_request_detach_interruptible's return type to int + +From: Nathan Chancellor + +[ Upstream commit 5816a0932b4fd74257b8cc5785bc8067186a8723 ] + +Clang warns when an implicit conversion is done between enumerated +types: + +drivers/block/drbd/drbd_state.c:708:8: warning: implicit conversion from +enumeration type 'enum drbd_ret_code' to different enumeration type +'enum drbd_state_rv' [-Wenum-conversion] + rv = ERR_INTR; + ~ ^~~~~~~~ + +drbd_request_detach_interruptible's only call site is in the return +statement of adm_detach, which returns an int. Change the return type of +drbd_request_detach_interruptible to match, silencing Clang's warning. + +Reported-by: Nick Desaulniers +Reviewed-by: Nick Desaulniers +Signed-off-by: Nathan Chancellor +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + drivers/block/drbd/drbd_state.c | 6 ++---- + drivers/block/drbd/drbd_state.h | 3 +-- + 2 files changed, 3 insertions(+), 6 deletions(-) + +diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c +index 0813c654c8938..b452359b6aae8 100644 +--- a/drivers/block/drbd/drbd_state.c ++++ b/drivers/block/drbd/drbd_state.c +@@ -688,11 +688,9 @@ request_detach(struct drbd_device *device) + CS_VERBOSE | CS_ORDERED | CS_INHIBIT_MD_IO); + } + +-enum drbd_state_rv +-drbd_request_detach_interruptible(struct drbd_device *device) ++int drbd_request_detach_interruptible(struct drbd_device *device) + { +- enum drbd_state_rv rv; +- int ret; ++ int ret, rv; + + drbd_suspend_io(device); /* so no-one is stuck in drbd_al_begin_io */ + wait_event_interruptible(device->state_wait, +diff --git a/drivers/block/drbd/drbd_state.h b/drivers/block/drbd/drbd_state.h +index b2a390ba73a05..f87371e55e682 100644 +--- a/drivers/block/drbd/drbd_state.h ++++ b/drivers/block/drbd/drbd_state.h +@@ -162,8 +162,7 @@ static inline int drbd_request_state(struct drbd_device *device, + } + + /* for use in adm_detach() (drbd_adm_detach(), drbd_adm_down()) */ +-enum drbd_state_rv +-drbd_request_detach_interruptible(struct drbd_device *device); ++int drbd_request_detach_interruptible(struct drbd_device *device); + + enum drbd_role conn_highest_role(struct drbd_connection *connection); + enum drbd_role conn_highest_peer(struct drbd_connection *connection); +-- +2.20.1 + diff --git a/queue-4.19/e100-fix-passing-zero-to-ptr_err-warning-in-e100_loa.patch b/queue-4.19/e100-fix-passing-zero-to-ptr_err-warning-in-e100_loa.patch new file mode 100644 index 00000000000..7e6d71d57ff --- /dev/null +++ b/queue-4.19/e100-fix-passing-zero-to-ptr_err-warning-in-e100_loa.patch @@ -0,0 +1,39 @@ +From af83bc0613db7a318a9fa88f8e229ab6d6b1b2b3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 19 Nov 2018 20:48:19 +0800 +Subject: e100: Fix passing zero to 'PTR_ERR' warning in e100_load_ucode_wait + +From: YueHaibing + +[ Upstream commit cd0d465bb697a9c7bf66a9fe940f7981232f1676 ] + +Fix a static code checker warning: +drivers/net/ethernet/intel/e100.c:1349 + e100_load_ucode_wait() warn: passing zero to 'PTR_ERR' + +Signed-off-by: YueHaibing +Tested-by: Aaron Brown +Signed-off-by: Jeff Kirsher +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/e100.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c +index 27d5f27163d2c..78b44d7876386 100644 +--- a/drivers/net/ethernet/intel/e100.c ++++ b/drivers/net/ethernet/intel/e100.c +@@ -1345,8 +1345,8 @@ static inline int e100_load_ucode_wait(struct nic *nic) + + fw = e100_request_firmware(nic); + /* If it's NULL, then no ucode is required */ +- if (!fw || IS_ERR(fw)) +- return PTR_ERR(fw); ++ if (IS_ERR_OR_NULL(fw)) ++ return PTR_ERR_OR_ZERO(fw); + + if ((err = e100_exec_cb(nic, (void *)fw, e100_setup_ucode))) + netif_err(nic, probe, nic->netdev, +-- +2.20.1 + diff --git a/queue-4.19/iio-ad7949-kill-pointless-readback-handling-code.patch b/queue-4.19/iio-ad7949-kill-pointless-readback-handling-code.patch new file mode 100644 index 00000000000..f217b6f92fb --- /dev/null +++ b/queue-4.19/iio-ad7949-kill-pointless-readback-handling-code.patch @@ -0,0 +1,47 @@ +From cf178be2195def6b6aafe97fee3d0d8398ccd316 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Nov 2019 12:30:46 -0600 +Subject: iio: ad7949: kill pointless "readback"-handling code + +From: Meng Li + +[ Upstream commit c270bbf7bb9ddc4e2a51b3c56557c377c9ac79bc ] + +The device could be configured to spit out also the configuration word +while reading the AD result value (in the same SPI xfer) - this is called +"readback" in the device datasheet. + +The driver checks if readback is enabled and it eventually adjusts the SPI +xfer length and it applies proper shifts to still get the data, discarding +the configuration word. + +The readback option is actually never enabled (the driver disables it), so +the said checks do not serve for any purpose. + +Since enabling the readback option seems not to provide any advantage (the +driver entirely sets the configuration word without relying on any default +value), just kill the said, unused, code. + +Signed-off-by: Andrea Merello +Reviewed-by: Alexandru Ardelean +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/edac/altera_edac.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c +index 56de378ad13dc..c9108906bcdc0 100644 +--- a/drivers/edac/altera_edac.c ++++ b/drivers/edac/altera_edac.c +@@ -600,6 +600,7 @@ static const struct regmap_config s10_sdram_regmap_cfg = { + .reg_read = s10_protected_reg_read, + .reg_write = s10_protected_reg_write, + .use_single_rw = true, ++ .fast_io = true, + }; + + static int altr_s10_sdram_probe(struct platform_device *pdev) +-- +2.20.1 + diff --git a/queue-4.19/media-vimc-fix-component-match-compare.patch b/queue-4.19/media-vimc-fix-component-match-compare.patch new file mode 100644 index 00000000000..238cae786ee --- /dev/null +++ b/queue-4.19/media-vimc-fix-component-match-compare.patch @@ -0,0 +1,61 @@ +From c37b617ae5f2cd09b35d3c84a4cee04466ca75d4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 May 2019 13:20:11 -0400 +Subject: media: vimc: fix component match compare + +From: Helen Koike + +[ Upstream commit ee1c71a8e1456ab53fe667281d855849edf26a4d ] + +If the system has other devices being registered in the component +framework, the compare function will be called with a device that +doesn't belong to vimc. +This device is not necessarily a platform_device, nor have a +platform_data (which causes a NULL pointer dereference error) and if it +does have a pdata, it is not necessarily type of struct vimc_platform_data. +So casting to any of these types is wrong. + +Instead of expecting a given pdev with a given pdata, just expect for +the device it self. vimc-core is the one who creates them, we know in +advance exactly which object to expect in the match. + +Fixes: 4a29b7090749 ("[media] vimc: Subdevices as modules") + +Signed-off-by: Helen Koike +Reviewed-by: Boris Brezillon +Tested-by: Boris Brezillon +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/platform/vimc/vimc-core.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/drivers/media/platform/vimc/vimc-core.c b/drivers/media/platform/vimc/vimc-core.c +index 27db8835c2410..8548fa93bcf65 100644 +--- a/drivers/media/platform/vimc/vimc-core.c ++++ b/drivers/media/platform/vimc/vimc-core.c +@@ -243,10 +243,7 @@ static void vimc_comp_unbind(struct device *master) + + static int vimc_comp_compare(struct device *comp, void *data) + { +- const struct platform_device *pdev = to_platform_device(comp); +- const char *name = data; +- +- return !strcmp(pdev->dev.platform_data, name); ++ return comp == data; + } + + static struct component_match *vimc_add_subdevs(struct vimc_device *vimc) +@@ -276,7 +273,7 @@ static struct component_match *vimc_add_subdevs(struct vimc_device *vimc) + } + + component_match_add(&vimc->pdev.dev, &match, vimc_comp_compare, +- (void *)vimc->pipe_cfg->ents[i].name); ++ &vimc->subdevs[i]->dev); + } + + return match; +-- +2.20.1 + diff --git a/queue-4.19/mlxsw-spectrum_router-refresh-nexthop-neighbour-when.patch b/queue-4.19/mlxsw-spectrum_router-refresh-nexthop-neighbour-when.patch new file mode 100644 index 00000000000..1863d0281b8 --- /dev/null +++ b/queue-4.19/mlxsw-spectrum_router-refresh-nexthop-neighbour-when.patch @@ -0,0 +1,142 @@ +From f4e63960c36587fa338f03d9301a276e0c7939b8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 11 Jun 2019 10:19:41 +0300 +Subject: mlxsw: spectrum_router: Refresh nexthop neighbour when it becomes + dead + +From: Ido Schimmel + +[ Upstream commit 83d5782681cc12b3d485a83cb34c46b2445f510c ] + +The driver tries to periodically refresh neighbours that are used to +reach nexthops. This is done by periodically calling neigh_event_send(). + +However, if the neighbour becomes dead, there is nothing we can do to +return it to a connected state and the above function call is basically +a NOP. + +This results in the nexthop never being written to the device's +adjacency table and therefore never used to forward packets. + +Fix this by dropping our reference from the dead neighbour and +associating the nexthop with a new neigbhour which we will try to +refresh. + +Fixes: a7ff87acd995 ("mlxsw: spectrum_router: Implement next-hop routing") +Signed-off-by: Ido Schimmel +Reported-by: Alex Veber +Tested-by: Alex Veber +Acked-by: Jiri Pirko +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + .../ethernet/mellanox/mlxsw/spectrum_router.c | 73 ++++++++++++++++++- + 1 file changed, 70 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +index 44b6c2ac5961d..76960d3adfc03 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +@@ -2228,7 +2228,7 @@ static void mlxsw_sp_router_probe_unresolved_nexthops(struct work_struct *work) + static void + mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp *mlxsw_sp, + struct mlxsw_sp_neigh_entry *neigh_entry, +- bool removing); ++ bool removing, bool dead); + + static enum mlxsw_reg_rauht_op mlxsw_sp_rauht_op(bool adding) + { +@@ -2359,7 +2359,8 @@ static void mlxsw_sp_router_neigh_event_work(struct work_struct *work) + + memcpy(neigh_entry->ha, ha, ETH_ALEN); + mlxsw_sp_neigh_entry_update(mlxsw_sp, neigh_entry, entry_connected); +- mlxsw_sp_nexthop_neigh_update(mlxsw_sp, neigh_entry, !entry_connected); ++ mlxsw_sp_nexthop_neigh_update(mlxsw_sp, neigh_entry, !entry_connected, ++ dead); + + if (!neigh_entry->connected && list_empty(&neigh_entry->nexthop_list)) + mlxsw_sp_neigh_entry_destroy(mlxsw_sp, neigh_entry); +@@ -3323,13 +3324,79 @@ static void __mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp_nexthop *nh, + nh->update = 1; + } + ++static int ++mlxsw_sp_nexthop_dead_neigh_replace(struct mlxsw_sp *mlxsw_sp, ++ struct mlxsw_sp_neigh_entry *neigh_entry) ++{ ++ struct neighbour *n, *old_n = neigh_entry->key.n; ++ struct mlxsw_sp_nexthop *nh; ++ bool entry_connected; ++ u8 nud_state, dead; ++ int err; ++ ++ nh = list_first_entry(&neigh_entry->nexthop_list, ++ struct mlxsw_sp_nexthop, neigh_list_node); ++ ++ n = neigh_lookup(nh->nh_grp->neigh_tbl, &nh->gw_addr, nh->rif->dev); ++ if (!n) { ++ n = neigh_create(nh->nh_grp->neigh_tbl, &nh->gw_addr, ++ nh->rif->dev); ++ if (IS_ERR(n)) ++ return PTR_ERR(n); ++ neigh_event_send(n, NULL); ++ } ++ ++ mlxsw_sp_neigh_entry_remove(mlxsw_sp, neigh_entry); ++ neigh_entry->key.n = n; ++ err = mlxsw_sp_neigh_entry_insert(mlxsw_sp, neigh_entry); ++ if (err) ++ goto err_neigh_entry_insert; ++ ++ read_lock_bh(&n->lock); ++ nud_state = n->nud_state; ++ dead = n->dead; ++ read_unlock_bh(&n->lock); ++ entry_connected = nud_state & NUD_VALID && !dead; ++ ++ list_for_each_entry(nh, &neigh_entry->nexthop_list, ++ neigh_list_node) { ++ neigh_release(old_n); ++ neigh_clone(n); ++ __mlxsw_sp_nexthop_neigh_update(nh, !entry_connected); ++ mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nh_grp); ++ } ++ ++ neigh_release(n); ++ ++ return 0; ++ ++err_neigh_entry_insert: ++ neigh_entry->key.n = old_n; ++ mlxsw_sp_neigh_entry_insert(mlxsw_sp, neigh_entry); ++ neigh_release(n); ++ return err; ++} ++ + static void + mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp *mlxsw_sp, + struct mlxsw_sp_neigh_entry *neigh_entry, +- bool removing) ++ bool removing, bool dead) + { + struct mlxsw_sp_nexthop *nh; + ++ if (list_empty(&neigh_entry->nexthop_list)) ++ return; ++ ++ if (dead) { ++ int err; ++ ++ err = mlxsw_sp_nexthop_dead_neigh_replace(mlxsw_sp, ++ neigh_entry); ++ if (err) ++ dev_err(mlxsw_sp->bus_info->dev, "Failed to replace dead neigh\n"); ++ return; ++ } ++ + list_for_each_entry(nh, &neigh_entry->nexthop_list, + neigh_list_node) { + __mlxsw_sp_nexthop_neigh_update(nh, removing); +-- +2.20.1 + diff --git a/queue-4.19/net-hns3-change-hnae3_register_ae_dev-to-int.patch b/queue-4.19/net-hns3-change-hnae3_register_ae_dev-to-int.patch new file mode 100644 index 00000000000..c88138a4a96 --- /dev/null +++ b/queue-4.19/net-hns3-change-hnae3_register_ae_dev-to-int.patch @@ -0,0 +1,98 @@ +From fe7793bc249d54b8085357939457835d6611f820 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Jan 2019 04:55:44 +0800 +Subject: net: hns3: change hnae3_register_ae_dev() to int + +From: Huazhong Tan + +[ Upstream commit 74354140a579008fd164241e3697d9c37e5b8989 ] + +hnae3_register_ae_dev() may fail, and it should return a error code +to its caller, so change hnae3_register_ae_dev() return type to int. + +Also, when hnae3_register_ae_dev() return error, hns3_probe() should +do some error handling and return the error code. + +Signed-off-by: Huazhong Tan +Signed-off-by: Peng Li +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/hisilicon/hns3/hnae3.c | 10 +++++++++- + drivers/net/ethernet/hisilicon/hns3/hnae3.h | 2 +- + drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 8 ++++++-- + 3 files changed, 16 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c +index 2097f92e14c5c..f98bff60bec37 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c +@@ -239,7 +239,7 @@ EXPORT_SYMBOL(hnae3_unregister_ae_algo); + * @ae_dev: the AE device + * NOTE: the duplicated name will not be checked + */ +-void hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev) ++int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev) + { + const struct pci_device_id *id; + struct hnae3_ae_algo *ae_algo; +@@ -260,6 +260,7 @@ void hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev) + + if (!ae_dev->ops) { + dev_err(&ae_dev->pdev->dev, "ae_dev ops are null\n"); ++ ret = -EOPNOTSUPP; + goto out_err; + } + +@@ -286,8 +287,15 @@ void hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev) + ret); + } + ++ mutex_unlock(&hnae3_common_lock); ++ ++ return 0; ++ + out_err: ++ list_del(&ae_dev->node); + mutex_unlock(&hnae3_common_lock); ++ ++ return ret; + } + EXPORT_SYMBOL(hnae3_register_ae_dev); + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h +index f5c7fc9c5e5cc..5e1a7ab06c63b 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h ++++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h +@@ -513,7 +513,7 @@ struct hnae3_handle { + #define hnae3_get_bit(origin, shift) \ + hnae3_get_field((origin), (0x1 << (shift)), (shift)) + +-void hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev); ++int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev); + void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev); + + void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo); +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +index 4b4d9de0a6bb5..0788e78747d94 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +@@ -1604,9 +1604,13 @@ static int hns3_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + ae_dev->dev_type = HNAE3_DEV_KNIC; + pci_set_drvdata(pdev, ae_dev); + +- hnae3_register_ae_dev(ae_dev); ++ ret = hnae3_register_ae_dev(ae_dev); ++ if (ret) { ++ devm_kfree(&pdev->dev, ae_dev); ++ pci_set_drvdata(pdev, NULL); ++ } + +- return 0; ++ return ret; + } + + /* hns3_remove - Device removal routine +-- +2.20.1 + diff --git a/queue-4.19/net-hns3-check-variable-is-valid-before-assigning-it.patch b/queue-4.19/net-hns3-check-variable-is-valid-before-assigning-it.patch new file mode 100644 index 00000000000..1caa009ba09 --- /dev/null +++ b/queue-4.19/net-hns3-check-variable-is-valid-before-assigning-it.patch @@ -0,0 +1,81 @@ +From 720adfd4f3da51b6322ed34bb461204d0f33fe8f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Feb 2019 10:32:41 +0800 +Subject: net: hns3: Check variable is valid before assigning it to another + +From: Yonglong Liu + +[ Upstream commit 676131f7c53ecdd79e29fc8cfcdefe6f9f2485e8 ] + +In hnae3_register_ae_dev(), ae_algo->ops is assigned to ae_dev->ops +before check that ae_algo->ops is valid. + +And in hnae3_register_ae_algo(), missing check for ae_algo->ops. + +This patch fixes them. + +Signed-off-by: Yonglong Liu +Signed-off-by: Peng Li +Signed-off-by: Huazhong Tan +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/hisilicon/hns3/hnae3.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c +index f98bff60bec37..f9259e568fa05 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c +@@ -173,8 +173,12 @@ void hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo) + if (!id) + continue; + +- /* ae_dev init should set flag */ ++ if (!ae_algo->ops) { ++ dev_err(&ae_dev->pdev->dev, "ae_algo ops are null\n"); ++ continue; ++ } + ae_dev->ops = ae_algo->ops; ++ + ret = ae_algo->ops->init_ae_dev(ae_dev); + if (ret) { + dev_err(&ae_dev->pdev->dev, +@@ -182,6 +186,7 @@ void hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo) + continue; + } + ++ /* ae_dev init should set flag */ + hnae3_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 1); + + /* check the client list for the match with this ae_dev type and +@@ -256,15 +261,13 @@ int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev) + if (!id) + continue; + +- ae_dev->ops = ae_algo->ops; +- +- if (!ae_dev->ops) { +- dev_err(&ae_dev->pdev->dev, "ae_dev ops are null\n"); ++ if (!ae_algo->ops) { ++ dev_err(&ae_dev->pdev->dev, "ae_algo ops are null\n"); + ret = -EOPNOTSUPP; + goto out_err; + } ++ ae_dev->ops = ae_algo->ops; + +- /* ae_dev init should set flag */ + ret = ae_dev->ops->init_ae_dev(ae_dev); + if (ret) { + dev_err(&ae_dev->pdev->dev, +@@ -272,6 +275,7 @@ int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev) + goto out_err; + } + ++ /* ae_dev init should set flag */ + hnae3_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 1); + break; + } +-- +2.20.1 + diff --git a/queue-4.19/net-hns3-clear-pci-private-data-when-unload-hns3-dri.patch b/queue-4.19/net-hns3-clear-pci-private-data-when-unload-hns3-dri.patch new file mode 100644 index 00000000000..31f9617fdd8 --- /dev/null +++ b/queue-4.19/net-hns3-clear-pci-private-data-when-unload-hns3-dri.patch @@ -0,0 +1,35 @@ +From 44fa837923a7afe7902f7f48fabbfcc613191eed Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 27 Jan 2019 00:49:11 +0800 +Subject: net: hns3: clear pci private data when unload hns3 driver + +From: Jian Shen + +[ Upstream commit ac864c2346d087dd3739435af1b8d36be5f60c75 ] + +When unload hns3 driver, we should clear the pci private data. + +Signed-off-by: Jian Shen +Signed-off-by: Peng Li +Signed-off-by: Huazhong Tan +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +index b2860087a7dc7..4b4d9de0a6bb5 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +@@ -1620,6 +1620,7 @@ static void hns3_remove(struct pci_dev *pdev) + hns3_disable_sriov(pdev); + + hnae3_unregister_ae_dev(ae_dev); ++ pci_set_drvdata(pdev, NULL); + } + + /** +-- +2.20.1 + diff --git a/queue-4.19/net-smc-do-not-wait-under-send_lock.patch b/queue-4.19/net-smc-do-not-wait-under-send_lock.patch new file mode 100644 index 00000000000..0ce35b66d1a --- /dev/null +++ b/queue-4.19/net-smc-do-not-wait-under-send_lock.patch @@ -0,0 +1,59 @@ +From f6e2aeb742fadbd487eba91c4b5d87e00f47abf4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 30 Jan 2019 18:51:05 +0100 +Subject: net/smc: do not wait under send_lock + +From: Karsten Graul + +[ Upstream commit 33f3fcc290671590821ff3c0c9396db1ec9b7d4c ] + +smc_cdc_get_free_slot() might wait for free transfer buffers when using +SMC-R. This wait should not be done under the send_lock, which is a +spin_lock. This fixes a cpu loop in parallel threads waiting for the +send_lock. + +Signed-off-by: Karsten Graul +Signed-off-by: Ursula Braun +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/smc/smc_tx.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +diff --git a/net/smc/smc_tx.c b/net/smc/smc_tx.c +index 0ecbbdc337b82..62885a2781c9a 100644 +--- a/net/smc/smc_tx.c ++++ b/net/smc/smc_tx.c +@@ -486,25 +486,23 @@ static int smcr_tx_sndbuf_nonempty(struct smc_connection *conn) + struct smc_wr_buf *wr_buf; + int rc; + +- spin_lock_bh(&conn->send_lock); + rc = smc_cdc_get_free_slot(conn, &wr_buf, &pend); + if (rc < 0) { + if (rc == -EBUSY) { + struct smc_sock *smc = + container_of(conn, struct smc_sock, conn); + +- if (smc->sk.sk_err == ECONNABORTED) { +- rc = sock_error(&smc->sk); +- goto out_unlock; +- } ++ if (smc->sk.sk_err == ECONNABORTED) ++ return sock_error(&smc->sk); + rc = 0; + if (conn->alert_token_local) /* connection healthy */ + mod_delayed_work(system_wq, &conn->tx_work, + SMC_TX_WORK_DELAY); + } +- goto out_unlock; ++ return rc; + } + ++ spin_lock_bh(&conn->send_lock); + if (!conn->local_tx_ctrl.prod_flags.urg_data_present) { + rc = smc_tx_rdma_writes(conn); + if (rc) { +-- +2.20.1 + diff --git a/queue-4.19/omap-pdata-quirks-remove-openpandora-quirks-for-mmc3.patch b/queue-4.19/omap-pdata-quirks-remove-openpandora-quirks-for-mmc3.patch new file mode 100644 index 00000000000..5e873c658da --- /dev/null +++ b/queue-4.19/omap-pdata-quirks-remove-openpandora-quirks-for-mmc3.patch @@ -0,0 +1,142 @@ +From 0b02b11e0e5d23dd1ed0967cb87802f34f3b8001 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Nov 2019 11:30:39 +0100 +Subject: omap: pdata-quirks: remove openpandora quirks for mmc3 and wl1251 + +From: H. Nikolaus Schaller + +[ Upstream commit 2398c41d64321e62af54424fd399964f3d48cdc2 ] + +With a wl1251 child node of mmc3 in the device tree decoded +in omap_hsmmc.c to handle special wl1251 initialization, we do +no longer need to instantiate the mmc3 through pdata quirks. + +We also can remove the wlan regulator and reset/interrupt definitions +and do them through device tree. + +Fixes: 81eef6ca9201 ("mmc: omap_hsmmc: Use dma_request_chan() for requesting DMA channel") +Signed-off-by: H. Nikolaus Schaller +Cc: # v4.7+ +Acked-by: Tony Lindgren +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + arch/arm/mach-omap2/pdata-quirks.c | 93 ------------------------------ + 1 file changed, 93 deletions(-) + +diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c +index 7f02743edbe4c..dae7262287704 100644 +--- a/arch/arm/mach-omap2/pdata-quirks.c ++++ b/arch/arm/mach-omap2/pdata-quirks.c +@@ -305,108 +305,15 @@ static void __init omap3_logicpd_torpedo_init(void) + } + + /* omap3pandora legacy devices */ +-#define PANDORA_WIFI_IRQ_GPIO 21 +-#define PANDORA_WIFI_NRESET_GPIO 23 + + static struct platform_device pandora_backlight = { + .name = "pandora-backlight", + .id = -1, + }; + +-static struct regulator_consumer_supply pandora_vmmc3_supply[] = { +- REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"), +-}; +- +-static struct regulator_init_data pandora_vmmc3 = { +- .constraints = { +- .valid_ops_mask = REGULATOR_CHANGE_STATUS, +- }, +- .num_consumer_supplies = ARRAY_SIZE(pandora_vmmc3_supply), +- .consumer_supplies = pandora_vmmc3_supply, +-}; +- +-static struct fixed_voltage_config pandora_vwlan = { +- .supply_name = "vwlan", +- .microvolts = 1800000, /* 1.8V */ +- .gpio = PANDORA_WIFI_NRESET_GPIO, +- .startup_delay = 50000, /* 50ms */ +- .enable_high = 1, +- .init_data = &pandora_vmmc3, +-}; +- +-static struct platform_device pandora_vwlan_device = { +- .name = "reg-fixed-voltage", +- .id = 1, +- .dev = { +- .platform_data = &pandora_vwlan, +- }, +-}; +- +-static void pandora_wl1251_init_card(struct mmc_card *card) +-{ +- /* +- * We have TI wl1251 attached to MMC3. Pass this information to +- * SDIO core because it can't be probed by normal methods. +- */ +- if (card->type == MMC_TYPE_SDIO || card->type == MMC_TYPE_SD_COMBO) { +- card->quirks |= MMC_QUIRK_NONSTD_SDIO; +- card->cccr.wide_bus = 1; +- card->cis.vendor = 0x104c; +- card->cis.device = 0x9066; +- card->cis.blksize = 512; +- card->cis.max_dtr = 24000000; +- card->ocr = 0x80; +- } +-} +- +-static struct omap2_hsmmc_info pandora_mmc3[] = { +- { +- .mmc = 3, +- .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD, +- .gpio_cd = -EINVAL, +- .gpio_wp = -EINVAL, +- .init_card = pandora_wl1251_init_card, +- }, +- {} /* Terminator */ +-}; +- +-static void __init pandora_wl1251_init(void) +-{ +- struct wl1251_platform_data pandora_wl1251_pdata; +- int ret; +- +- memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata)); +- +- pandora_wl1251_pdata.power_gpio = -1; +- +- ret = gpio_request_one(PANDORA_WIFI_IRQ_GPIO, GPIOF_IN, "wl1251 irq"); +- if (ret < 0) +- goto fail; +- +- pandora_wl1251_pdata.irq = gpio_to_irq(PANDORA_WIFI_IRQ_GPIO); +- if (pandora_wl1251_pdata.irq < 0) +- goto fail_irq; +- +- pandora_wl1251_pdata.use_eeprom = true; +- ret = wl1251_set_platform_data(&pandora_wl1251_pdata); +- if (ret < 0) +- goto fail_irq; +- +- return; +- +-fail_irq: +- gpio_free(PANDORA_WIFI_IRQ_GPIO); +-fail: +- pr_err("wl1251 board initialisation failed\n"); +-} +- + static void __init omap3_pandora_legacy_init(void) + { + platform_device_register(&pandora_backlight); +- platform_device_register(&pandora_vwlan_device); +- omap_hsmmc_init(pandora_mmc3); +- omap_hsmmc_late_init(pandora_mmc3); +- pandora_wl1251_init(); + } + #endif /* CONFIG_ARCH_OMAP3 */ + +-- +2.20.1 + diff --git a/queue-4.19/power-supply-cpcap-battery-fix-signed-counter-sample.patch b/queue-4.19/power-supply-cpcap-battery-fix-signed-counter-sample.patch new file mode 100644 index 00000000000..19e35f3166b --- /dev/null +++ b/queue-4.19/power-supply-cpcap-battery-fix-signed-counter-sample.patch @@ -0,0 +1,82 @@ +From df3f57e7ef625febc1a43e587b5ea3660cf2786c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Apr 2019 11:12:50 -0700 +Subject: power: supply: cpcap-battery: Fix signed counter sample register + +From: Tony Lindgren + +[ Upstream commit c68b901ac4fa969db8917b6a9f9b40524a690d20 ] + +The accumulator sample register is signed 32-bits wide register on +droid 4. And only the earlier version of cpcap has a signed 24-bits +wide register. We're currently passing it around as unsigned, so +let's fix that and use sign_extend32() for the earlier revision. + +Signed-off-by: Tony Lindgren +Acked-by: Pavel Machek +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/power/supply/cpcap-battery.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/drivers/power/supply/cpcap-battery.c b/drivers/power/supply/cpcap-battery.c +index 3bae02380bb22..e183a22de7153 100644 +--- a/drivers/power/supply/cpcap-battery.c ++++ b/drivers/power/supply/cpcap-battery.c +@@ -82,7 +82,7 @@ struct cpcap_battery_config { + }; + + struct cpcap_coulomb_counter_data { +- s32 sample; /* 24-bits */ ++ s32 sample; /* 24 or 32 bits */ + s32 accumulator; + s16 offset; /* 10-bits */ + }; +@@ -213,7 +213,7 @@ static int cpcap_battery_get_current(struct cpcap_battery_ddata *ddata) + * TI or ST coulomb counter in the PMIC. + */ + static int cpcap_battery_cc_raw_div(struct cpcap_battery_ddata *ddata, +- u32 sample, s32 accumulator, ++ s32 sample, s32 accumulator, + s16 offset, u32 divider) + { + s64 acc; +@@ -224,7 +224,6 @@ static int cpcap_battery_cc_raw_div(struct cpcap_battery_ddata *ddata, + if (!divider) + return 0; + +- sample &= 0xffffff; /* 24-bits, unsigned */ + offset &= 0x7ff; /* 10-bits, signed */ + + switch (ddata->vendor) { +@@ -259,7 +258,7 @@ static int cpcap_battery_cc_raw_div(struct cpcap_battery_ddata *ddata, + + /* 3600000μAms = 1μAh */ + static int cpcap_battery_cc_to_uah(struct cpcap_battery_ddata *ddata, +- u32 sample, s32 accumulator, ++ s32 sample, s32 accumulator, + s16 offset) + { + return cpcap_battery_cc_raw_div(ddata, sample, +@@ -268,7 +267,7 @@ static int cpcap_battery_cc_to_uah(struct cpcap_battery_ddata *ddata, + } + + static int cpcap_battery_cc_to_ua(struct cpcap_battery_ddata *ddata, +- u32 sample, s32 accumulator, ++ s32 sample, s32 accumulator, + s16 offset) + { + return cpcap_battery_cc_raw_div(ddata, sample, +@@ -312,6 +311,8 @@ cpcap_battery_read_accumulated(struct cpcap_battery_ddata *ddata, + /* Sample value CPCAP_REG_CCS1 & 2 */ + ccd->sample = (buf[1] & 0x0fff) << 16; + ccd->sample |= buf[0]; ++ if (ddata->vendor == CPCAP_VENDOR_TI) ++ ccd->sample = sign_extend32(24, ccd->sample); + + /* Accumulator value CPCAP_REG_CCA1 & 2 */ + ccd->accumulator = ((s16)buf[3]) << 16; +-- +2.20.1 + diff --git a/queue-4.19/pvcalls-front-don-t-return-error-when-the-ring-is-fu.patch b/queue-4.19/pvcalls-front-don-t-return-error-when-the-ring-is-fu.patch new file mode 100644 index 00000000000..aad65fe7dcc --- /dev/null +++ b/queue-4.19/pvcalls-front-don-t-return-error-when-the-ring-is-fu.patch @@ -0,0 +1,39 @@ +From 2a9a8ac33bf3f210f6400fdcdd3029825e79434a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 21 Dec 2018 15:06:32 -0800 +Subject: pvcalls-front: don't return error when the ring is full + +From: Stefano Stabellini + +[ Upstream commit d90a1ca60a1eccb4383fe203c76223ab4c0799ed ] + +When the ring is full, size == array_size. It is not an error condition, +so simply return 0 instead of an error. + +Signed-off-by: Stefano Stabellini +Reviewed-by: Boris Ostrovsky +Signed-off-by: Boris Ostrovsky +Signed-off-by: Sasha Levin +--- + drivers/xen/pvcalls-front.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/xen/pvcalls-front.c b/drivers/xen/pvcalls-front.c +index 3a144eecb6a72..d7438fdc57061 100644 +--- a/drivers/xen/pvcalls-front.c ++++ b/drivers/xen/pvcalls-front.c +@@ -504,8 +504,10 @@ static int __write_ring(struct pvcalls_data_intf *intf, + virt_mb(); + + size = pvcalls_queued(prod, cons, array_size); +- if (size >= array_size) ++ if (size > array_size) + return -EINVAL; ++ if (size == array_size) ++ return 0; + if (len > array_size - size) + len = array_size - size; + +-- +2.20.1 + diff --git a/queue-4.19/regulator-88pm800-fix-warning-same-module-names.patch b/queue-4.19/regulator-88pm800-fix-warning-same-module-names.patch new file mode 100644 index 00000000000..a7428b1a32e --- /dev/null +++ b/queue-4.19/regulator-88pm800-fix-warning-same-module-names.patch @@ -0,0 +1,47 @@ +From 0c2533b01e6048f65bb2455a503ee915a936ede2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 12 Jun 2019 10:11:58 +0200 +Subject: regulator: 88pm800: fix warning same module names + +From: Anders Roxell + +[ Upstream commit 6f10419187d0d5fe395e2a2f2a64370961bf02a3 ] + +When building with CONFIG_MFD_88PM800 and CONFIG_REGULATOR_88PM800 +enabled as loadable modules, we see the following warning: + +warning: same module names found: + drivers/regulator/88pm800.ko + drivers/mfd/88pm800.ko + +Rework so that the file is named 88pm800-regulator. + +Signed-off-by: Anders Roxell +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/regulator/{88pm800.c => 88pm800-regulator.c} | 0 + drivers/regulator/Makefile | 2 +- + 2 files changed, 1 insertion(+), 1 deletion(-) + rename drivers/regulator/{88pm800.c => 88pm800-regulator.c} (100%) + +diff --git a/drivers/regulator/88pm800.c b/drivers/regulator/88pm800-regulator.c +similarity index 100% +rename from drivers/regulator/88pm800.c +rename to drivers/regulator/88pm800-regulator.c +diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile +index 801d9a34a2037..bba9c4851faf3 100644 +--- a/drivers/regulator/Makefile ++++ b/drivers/regulator/Makefile +@@ -11,7 +11,7 @@ obj-$(CONFIG_REGULATOR_VIRTUAL_CONSUMER) += virtual.o + obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o + + obj-$(CONFIG_REGULATOR_88PG86X) += 88pg86x.o +-obj-$(CONFIG_REGULATOR_88PM800) += 88pm800.o ++obj-$(CONFIG_REGULATOR_88PM800) += 88pm800-regulator.o + obj-$(CONFIG_REGULATOR_88PM8607) += 88pm8607.o + obj-$(CONFIG_REGULATOR_CPCAP) += cpcap-regulator.o + obj-$(CONFIG_REGULATOR_AAT2870) += aat2870-regulator.o +-- +2.20.1 + diff --git a/queue-4.19/sch_cake-correctly-update-parent-qlen-when-splitting.patch b/queue-4.19/sch_cake-correctly-update-parent-qlen-when-splitting.patch new file mode 100644 index 00000000000..445441c2674 --- /dev/null +++ b/queue-4.19/sch_cake-correctly-update-parent-qlen-when-splitting.patch @@ -0,0 +1,58 @@ +From c88da8572936a0452353b5c6be38fe8c310b715a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Jan 2019 17:09:44 +0100 +Subject: sch_cake: Correctly update parent qlen when splitting GSO packets +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Toke Høiland-Jørgensen + +[ Upstream commit 8c6c37fdc20ec9ffaa342f827a8e20afe736fb0c ] + +To ensure parent qdiscs have the same notion of the number of enqueued +packets even after splitting a GSO packet, update the qdisc tree with the +number of packets that was added due to the split. + +Reported-by: Pete Heist +Tested-by: Pete Heist +Signed-off-by: Toke Høiland-Jørgensen +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/sched/sch_cake.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c +index 9fd37d91b5ed0..e4cf72b0675e1 100644 +--- a/net/sched/sch_cake.c ++++ b/net/sched/sch_cake.c +@@ -1666,7 +1666,7 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch, + if (skb_is_gso(skb) && q->rate_flags & CAKE_FLAG_SPLIT_GSO) { + struct sk_buff *segs, *nskb; + netdev_features_t features = netif_skb_features(skb); +- unsigned int slen = 0; ++ unsigned int slen = 0, numsegs = 0; + + segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); + if (IS_ERR_OR_NULL(segs)) +@@ -1682,6 +1682,7 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch, + flow_queue_add(flow, segs); + + sch->q.qlen++; ++ numsegs++; + slen += segs->len; + q->buffer_used += segs->truesize; + b->packets++; +@@ -1695,7 +1696,7 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch, + sch->qstats.backlog += slen; + q->avg_window_bytes += slen; + +- qdisc_tree_reduce_backlog(sch, 1, len); ++ qdisc_tree_reduce_backlog(sch, 1-numsegs, len-slen); + consume_skb(skb); + } else { + /* not splitting */ +-- +2.20.1 + diff --git a/queue-4.19/scsi-hisi_sas-reject-setting-programmed-minimum-link.patch b/queue-4.19/scsi-hisi_sas-reject-setting-programmed-minimum-link.patch new file mode 100644 index 00000000000..e6525bdb750 --- /dev/null +++ b/queue-4.19/scsi-hisi_sas-reject-setting-programmed-minimum-link.patch @@ -0,0 +1,77 @@ +From 6da3e653ad093b19ec5289aaa80ad2820b791776 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 25 Jan 2019 22:22:34 +0800 +Subject: scsi: hisi_sas: Reject setting programmed minimum linkrate > 1.5G + +From: Luo Jiaxing + +[ Upstream commit eb44e4d7b5a3090f0114927f42ae575c29664a09 ] + +The SAS controller cannot support a programmed minimum linkrate of > 1.5G +(it will always negotiate to 1.5G at least), so just reject it. + +This solves a strange situation where the PHY negotiated linkrate may be +less than the programmed minimum linkrate. + +Signed-off-by: Luo Jiaxing +Signed-off-by: John Garry +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/hisi_sas/hisi_sas_main.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c +index 0ad8875c30e8e..f35c56217694b 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -886,7 +886,7 @@ static int hisi_sas_queue_command(struct sas_task *task, gfp_t gfp_flags) + return hisi_sas_task_exec(task, gfp_flags, 0, NULL); + } + +-static void hisi_sas_phy_set_linkrate(struct hisi_hba *hisi_hba, int phy_no, ++static int hisi_sas_phy_set_linkrate(struct hisi_hba *hisi_hba, int phy_no, + struct sas_phy_linkrates *r) + { + struct sas_phy_linkrates _r; +@@ -895,6 +895,9 @@ static void hisi_sas_phy_set_linkrate(struct hisi_hba *hisi_hba, int phy_no, + struct asd_sas_phy *sas_phy = &phy->sas_phy; + enum sas_linkrate min, max; + ++ if (r->minimum_linkrate > SAS_LINK_RATE_1_5_GBPS) ++ return -EINVAL; ++ + if (r->maximum_linkrate == SAS_LINK_RATE_UNKNOWN) { + max = sas_phy->phy->maximum_linkrate; + min = r->minimum_linkrate; +@@ -902,7 +905,7 @@ static void hisi_sas_phy_set_linkrate(struct hisi_hba *hisi_hba, int phy_no, + max = r->maximum_linkrate; + min = sas_phy->phy->minimum_linkrate; + } else +- return; ++ return -EINVAL; + + _r.maximum_linkrate = max; + _r.minimum_linkrate = min; +@@ -914,6 +917,8 @@ static void hisi_sas_phy_set_linkrate(struct hisi_hba *hisi_hba, int phy_no, + msleep(100); + hisi_hba->hw->phy_set_linkrate(hisi_hba, phy_no, &_r); + hisi_hba->hw->phy_start(hisi_hba, phy_no); ++ ++ return 0; + } + + static int hisi_sas_control_phy(struct asd_sas_phy *sas_phy, enum phy_func func, +@@ -939,8 +944,7 @@ static int hisi_sas_control_phy(struct asd_sas_phy *sas_phy, enum phy_func func, + break; + + case PHY_FUNC_SET_LINK_RATE: +- hisi_sas_phy_set_linkrate(hisi_hba, phy_no, funcdata); +- break; ++ return hisi_sas_phy_set_linkrate(hisi_hba, phy_no, funcdata); + case PHY_FUNC_GET_EVENTS: + if (hisi_hba->hw->get_events) { + hisi_hba->hw->get_events(hisi_hba, phy_no); +-- +2.20.1 + diff --git a/queue-4.19/scsi-hisi_sas-send-primitive-notify-to-ssp-situation.patch b/queue-4.19/scsi-hisi_sas-send-primitive-notify-to-ssp-situation.patch new file mode 100644 index 00000000000..222a42e2baf --- /dev/null +++ b/queue-4.19/scsi-hisi_sas-send-primitive-notify-to-ssp-situation.patch @@ -0,0 +1,121 @@ +From 7da65bea0126389275a9cc37a14a115478077cfc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 25 Jan 2019 22:22:30 +0800 +Subject: scsi: hisi_sas: send primitive NOTIFY to SSP situation only + +From: Xiang Chen + +[ Upstream commit 569eddcf3a0f4efff4ef96a7012010e0f7daa8b4 ] + +Send primitive NOTIFY to SSP situation only, or it causes underflow issue +when sending IO. Also rename hisi_sas_hw.sl_notify() to hisi_sas_hw. +sl_notify_ssp(). + +Signed-off-by: Xiang Chen +Signed-off-by: John Garry +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/hisi_sas/hisi_sas.h | 2 +- + drivers/scsi/hisi_sas/hisi_sas_main.c | 3 ++- + drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 4 ++-- + drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 4 ++-- + drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 4 ++-- + 5 files changed, 9 insertions(+), 8 deletions(-) + +diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h +index 6c7d2e201abed..d499c44661661 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas.h ++++ b/drivers/scsi/hisi_sas/hisi_sas.h +@@ -220,7 +220,7 @@ struct hisi_sas_hw { + int (*slot_index_alloc)(struct hisi_hba *hisi_hba, int *slot_idx, + struct domain_device *device); + struct hisi_sas_device *(*alloc_dev)(struct domain_device *device); +- void (*sl_notify)(struct hisi_hba *hisi_hba, int phy_no); ++ void (*sl_notify_ssp)(struct hisi_hba *hisi_hba, int phy_no); + int (*get_free_slot)(struct hisi_hba *hisi_hba, struct hisi_sas_dq *dq); + void (*start_delivery)(struct hisi_sas_dq *dq); + void (*prep_ssp)(struct hisi_hba *hisi_hba, +diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c +index f478d1f50dfc0..0ad8875c30e8e 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -716,7 +716,8 @@ static void hisi_sas_phyup_work(struct work_struct *work) + struct asd_sas_phy *sas_phy = &phy->sas_phy; + int phy_no = sas_phy->id; + +- hisi_hba->hw->sl_notify(hisi_hba, phy_no); /* This requires a sleep */ ++ if (phy->identify.target_port_protocols == SAS_PROTOCOL_SSP) ++ hisi_hba->hw->sl_notify_ssp(hisi_hba, phy_no); + hisi_sas_bytes_dmaed(hisi_hba, phy_no); + } + +diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +index 410eccf0bc5eb..8aa3222fe4865 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +@@ -834,7 +834,7 @@ static void phys_init_v1_hw(struct hisi_hba *hisi_hba) + mod_timer(timer, jiffies + HZ); + } + +-static void sl_notify_v1_hw(struct hisi_hba *hisi_hba, int phy_no) ++static void sl_notify_ssp_v1_hw(struct hisi_hba *hisi_hba, int phy_no) + { + u32 sl_control; + +@@ -1822,7 +1822,7 @@ static struct scsi_host_template sht_v1_hw = { + static const struct hisi_sas_hw hisi_sas_v1_hw = { + .hw_init = hisi_sas_v1_init, + .setup_itct = setup_itct_v1_hw, +- .sl_notify = sl_notify_v1_hw, ++ .sl_notify_ssp = sl_notify_ssp_v1_hw, + .clear_itct = clear_itct_v1_hw, + .prep_smp = prep_smp_v1_hw, + .prep_ssp = prep_ssp_v1_hw, +diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +index c4774d63d5d04..ebc984ffe6a22 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +@@ -1584,7 +1584,7 @@ static void phys_init_v2_hw(struct hisi_hba *hisi_hba) + } + } + +-static void sl_notify_v2_hw(struct hisi_hba *hisi_hba, int phy_no) ++static void sl_notify_ssp_v2_hw(struct hisi_hba *hisi_hba, int phy_no) + { + u32 sl_control; + +@@ -3575,7 +3575,7 @@ static const struct hisi_sas_hw hisi_sas_v2_hw = { + .setup_itct = setup_itct_v2_hw, + .slot_index_alloc = slot_index_alloc_quirk_v2_hw, + .alloc_dev = alloc_dev_quirk_v2_hw, +- .sl_notify = sl_notify_v2_hw, ++ .sl_notify_ssp = sl_notify_ssp_v2_hw, + .get_wideport_bitmap = get_wideport_bitmap_v2_hw, + .clear_itct = clear_itct_v2_hw, + .free_device = free_device_v2_hw, +diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +index a7407d5376ba2..ce2f232b3df38 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -827,7 +827,7 @@ static void phys_init_v3_hw(struct hisi_hba *hisi_hba) + } + } + +-static void sl_notify_v3_hw(struct hisi_hba *hisi_hba, int phy_no) ++static void sl_notify_ssp_v3_hw(struct hisi_hba *hisi_hba, int phy_no) + { + u32 sl_control; + +@@ -2127,7 +2127,7 @@ static const struct hisi_sas_hw hisi_sas_v3_hw = { + .get_wideport_bitmap = get_wideport_bitmap_v3_hw, + .complete_hdr_size = sizeof(struct hisi_sas_complete_v3_hdr), + .clear_itct = clear_itct_v3_hw, +- .sl_notify = sl_notify_v3_hw, ++ .sl_notify_ssp = sl_notify_ssp_v3_hw, + .prep_ssp = prep_ssp_v3_hw, + .prep_smp = prep_smp_v3_hw, + .prep_stp = prep_ata_v3_hw, +-- +2.20.1 + diff --git a/queue-4.19/scsi-lpfc-cap-npiv-vports-to-256.patch b/queue-4.19/scsi-lpfc-cap-npiv-vports-to-256.patch new file mode 100644 index 00000000000..a74156be6d5 --- /dev/null +++ b/queue-4.19/scsi-lpfc-cap-npiv-vports-to-256.patch @@ -0,0 +1,87 @@ +From b2ab9f73f6deab108fc84e2dec1d35b8b9157424 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 29 Nov 2018 16:09:33 -0800 +Subject: scsi: lpfc: Cap NPIV vports to 256 + +From: James Smart + +[ Upstream commit 8b47ae69e049ae0b3373859d901f0334322f9fe9 ] + +Depending on the chipset, the number of NPIV vports may vary and be in +excess of what most switches support (256). To avoid confusion with the +users, limit the reported NPIV vports to 256. + +Additionally correct the 16G adapter which is reporting a bogus NPIV vport +number if the link is down. + +Signed-off-by: Dick Kennedy +Signed-off-by: James Smart +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/lpfc/lpfc.h | 3 ++- + drivers/scsi/lpfc/lpfc_attr.c | 12 ++++++++++-- + drivers/scsi/lpfc/lpfc_init.c | 3 +++ + 3 files changed, 15 insertions(+), 3 deletions(-) + +diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h +index a62e85cb62eb2..706aca3f7c253 100644 +--- a/drivers/scsi/lpfc/lpfc.h ++++ b/drivers/scsi/lpfc/lpfc.h +@@ -966,7 +966,8 @@ struct lpfc_hba { + struct list_head port_list; + struct lpfc_vport *pport; /* physical lpfc_vport pointer */ + uint16_t max_vpi; /* Maximum virtual nports */ +-#define LPFC_MAX_VPI 0xFFFF /* Max number of VPI supported */ ++#define LPFC_MAX_VPI 0xFF /* Max number VPI supported 0 - 0xff */ ++#define LPFC_MAX_VPORTS 0x100 /* Max vports per port, with pport */ + uint16_t max_vports; /* + * For IOV HBAs max_vpi can change + * after a reset. max_vports is max +diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c +index 3f69a5e4e470a..1e9002138d31c 100644 +--- a/drivers/scsi/lpfc/lpfc_attr.c ++++ b/drivers/scsi/lpfc/lpfc_attr.c +@@ -1632,6 +1632,9 @@ lpfc_get_hba_info(struct lpfc_hba *phba, + max_vpi = (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) > 0) ? + (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - 1) : 0; + ++ /* Limit the max we support */ ++ if (max_vpi > LPFC_MAX_VPI) ++ max_vpi = LPFC_MAX_VPI; + if (mvpi) + *mvpi = max_vpi; + if (avpi) +@@ -1647,8 +1650,13 @@ lpfc_get_hba_info(struct lpfc_hba *phba, + *axri = pmb->un.varRdConfig.avail_xri; + if (mvpi) + *mvpi = pmb->un.varRdConfig.max_vpi; +- if (avpi) +- *avpi = pmb->un.varRdConfig.avail_vpi; ++ if (avpi) { ++ /* avail_vpi is only valid if link is up and ready */ ++ if (phba->link_state == LPFC_HBA_READY) ++ *avpi = pmb->un.varRdConfig.avail_vpi; ++ else ++ *avpi = pmb->un.varRdConfig.max_vpi; ++ } + } + + mempool_free(pmboxq, phba->mbox_mem_pool); +diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c +index da63c026ba460..57510a831735b 100644 +--- a/drivers/scsi/lpfc/lpfc_init.c ++++ b/drivers/scsi/lpfc/lpfc_init.c +@@ -7766,6 +7766,9 @@ lpfc_sli4_read_config(struct lpfc_hba *phba) + bf_get(lpfc_mbx_rd_conf_xri_base, rd_config); + phba->sli4_hba.max_cfg_param.max_vpi = + bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config); ++ /* Limit the max we support */ ++ if (phba->sli4_hba.max_cfg_param.max_vpi > LPFC_MAX_VPORTS) ++ phba->sli4_hba.max_cfg_param.max_vpi = LPFC_MAX_VPORTS; + phba->sli4_hba.max_cfg_param.vpi_base = + bf_get(lpfc_mbx_rd_conf_vpi_base, rd_config); + phba->sli4_hba.max_cfg_param.max_rpi = +-- +2.20.1 + diff --git a/queue-4.19/scsi-lpfc-correct-code-setting-non-existent-bits-in-.patch b/queue-4.19/scsi-lpfc-correct-code-setting-non-existent-bits-in-.patch new file mode 100644 index 00000000000..5fcbdb73360 --- /dev/null +++ b/queue-4.19/scsi-lpfc-correct-code-setting-non-existent-bits-in-.patch @@ -0,0 +1,86 @@ +From 95f45c0bcc18fd0d24b454d67641f782d4a7efaf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 29 Nov 2018 16:09:37 -0800 +Subject: scsi: lpfc: Correct code setting non existent bits in sli4 ABORT WQE + +From: James Smart + +[ Upstream commit 1c36833d82ff24d0d54215fd956e7cc30fffce54 ] + +Driver is setting bits in word 10 of the SLI4 ABORT WQE (the wqid). The +field was a carry over from a prior SLI revision. The field does not exist +in SLI4, and the action may result in an overlap with future definition of +the WQE. + +Remove the setting of WQID in the ABORT WQE. + +Also cleaned up WQE field settings - initialize to zero, don't bother to +set fields to zero. + +Signed-off-by: Dick Kennedy +Signed-off-by: James Smart +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/lpfc/lpfc_nvme.c | 2 -- + drivers/scsi/lpfc/lpfc_sli.c | 14 +++----------- + 2 files changed, 3 insertions(+), 13 deletions(-) + +diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c +index 8ee585e453dcf..f73726e55e44d 100644 +--- a/drivers/scsi/lpfc/lpfc_nvme.c ++++ b/drivers/scsi/lpfc/lpfc_nvme.c +@@ -1856,7 +1856,6 @@ lpfc_nvme_fcp_abort(struct nvme_fc_local_port *pnvme_lport, + bf_set(abort_cmd_criteria, &abts_wqe->abort_cmd, T_XRI_TAG); + + /* word 7 */ +- bf_set(wqe_ct, &abts_wqe->abort_cmd.wqe_com, 0); + bf_set(wqe_cmnd, &abts_wqe->abort_cmd.wqe_com, CMD_ABORT_XRI_CX); + bf_set(wqe_class, &abts_wqe->abort_cmd.wqe_com, + nvmereq_wqe->iocb.ulpClass); +@@ -1871,7 +1870,6 @@ lpfc_nvme_fcp_abort(struct nvme_fc_local_port *pnvme_lport, + abts_buf->iotag); + + /* word 10 */ +- bf_set(wqe_wqid, &abts_wqe->abort_cmd.wqe_com, nvmereq_wqe->hba_wqidx); + bf_set(wqe_qosd, &abts_wqe->abort_cmd.wqe_com, 1); + bf_set(wqe_lenloc, &abts_wqe->abort_cmd.wqe_com, LPFC_WQE_LENLOC_NONE); + +diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c +index 755803ff6cfef..f459fd62e493c 100644 +--- a/drivers/scsi/lpfc/lpfc_sli.c ++++ b/drivers/scsi/lpfc/lpfc_sli.c +@@ -10989,19 +10989,12 @@ lpfc_sli4_abort_nvme_io(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, + + /* Complete prepping the abort wqe and issue to the FW. */ + abts_wqe = &abtsiocbp->wqe; +- bf_set(abort_cmd_ia, &abts_wqe->abort_cmd, 0); +- bf_set(abort_cmd_criteria, &abts_wqe->abort_cmd, T_XRI_TAG); +- +- /* Explicitly set reserved fields to zero.*/ +- abts_wqe->abort_cmd.rsrvd4 = 0; +- abts_wqe->abort_cmd.rsrvd5 = 0; + +- /* WQE Common - word 6. Context is XRI tag. Set 0. */ +- bf_set(wqe_xri_tag, &abts_wqe->abort_cmd.wqe_com, 0); +- bf_set(wqe_ctxt_tag, &abts_wqe->abort_cmd.wqe_com, 0); ++ /* Clear any stale WQE contents */ ++ memset(abts_wqe, 0, sizeof(union lpfc_wqe)); ++ bf_set(abort_cmd_criteria, &abts_wqe->abort_cmd, T_XRI_TAG); + + /* word 7 */ +- bf_set(wqe_ct, &abts_wqe->abort_cmd.wqe_com, 0); + bf_set(wqe_cmnd, &abts_wqe->abort_cmd.wqe_com, CMD_ABORT_XRI_CX); + bf_set(wqe_class, &abts_wqe->abort_cmd.wqe_com, + cmdiocb->iocb.ulpClass); +@@ -11016,7 +11009,6 @@ lpfc_sli4_abort_nvme_io(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, + abtsiocbp->iotag); + + /* word 10 */ +- bf_set(wqe_wqid, &abts_wqe->abort_cmd.wqe_com, cmdiocb->hba_wqidx); + bf_set(wqe_qosd, &abts_wqe->abort_cmd.wqe_com, 1); + bf_set(wqe_lenloc, &abts_wqe->abort_cmd.wqe_com, LPFC_WQE_LENLOC_NONE); + +-- +2.20.1 + diff --git a/queue-4.19/scsi-lpfc-correct-topology-type-reporting-on-g7-adap.patch b/queue-4.19/scsi-lpfc-correct-topology-type-reporting-on-g7-adap.patch new file mode 100644 index 00000000000..036375db394 --- /dev/null +++ b/queue-4.19/scsi-lpfc-correct-topology-type-reporting-on-g7-adap.patch @@ -0,0 +1,60 @@ +From 94184856b62b380279e479d17ac3941a91aba0fe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 29 Nov 2018 16:09:38 -0800 +Subject: scsi: lpfc: Correct topology type reporting on G7 adapters + +From: James Smart + +[ Upstream commit 76558b25733140a0c6bd53ea8af04b2811c92ec3 ] + +Driver missed classifying the chip type for G7 when reporting supported +topologies. This resulted in loop being shown as supported on FC links that +are not supported per the standard. + +Add the chip classifications to the topology checks in the driver. + +Signed-off-by: Dick Kennedy +Signed-off-by: James Smart +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/lpfc/lpfc_attr.c | 5 +++-- + drivers/scsi/lpfc/lpfc_mbox.c | 6 +++--- + 2 files changed, 6 insertions(+), 5 deletions(-) + +diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c +index 1e9002138d31c..fe084d47ed9e5 100644 +--- a/drivers/scsi/lpfc/lpfc_attr.c ++++ b/drivers/scsi/lpfc/lpfc_attr.c +@@ -3849,8 +3849,9 @@ lpfc_topology_store(struct device *dev, struct device_attribute *attr, + val); + return -EINVAL; + } +- if (phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC && +- val == 4) { ++ if ((phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC || ++ phba->pcidev->device == PCI_DEVICE_ID_LANCER_G7_FC) && ++ val == 4) { + lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, + "3114 Loop mode not supported\n"); + return -EINVAL; +diff --git a/drivers/scsi/lpfc/lpfc_mbox.c b/drivers/scsi/lpfc/lpfc_mbox.c +index deb094fdbb793..e6bf5e8bc7670 100644 +--- a/drivers/scsi/lpfc/lpfc_mbox.c ++++ b/drivers/scsi/lpfc/lpfc_mbox.c +@@ -513,9 +513,9 @@ lpfc_init_link(struct lpfc_hba * phba, + break; + } + +- if (phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC && +- mb->un.varInitLnk.link_flags & FLAGS_TOPOLOGY_MODE_LOOP) { +- /* Failover is not tried for Lancer G6 */ ++ if ((phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC || ++ phba->pcidev->device == PCI_DEVICE_ID_LANCER_G7_FC) && ++ mb->un.varInitLnk.link_flags & FLAGS_TOPOLOGY_MODE_LOOP) { + mb->un.varInitLnk.link_flags = FLAGS_TOPOLOGY_MODE_PT_PT; + phba->cfg_topology = FLAGS_TOPOLOGY_MODE_PT_PT; + } +-- +2.20.1 + diff --git a/queue-4.19/scsi-qla2xxx-always-check-the-qla2x00_wait_for_hba_o.patch b/queue-4.19/scsi-qla2xxx-always-check-the-qla2x00_wait_for_hba_o.patch new file mode 100644 index 00000000000..80f934dc927 --- /dev/null +++ b/queue-4.19/scsi-qla2xxx-always-check-the-qla2x00_wait_for_hba_o.patch @@ -0,0 +1,66 @@ +From 1d7513613553f79baedc894b51007364648e69f5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 8 Aug 2019 20:01:52 -0700 +Subject: scsi: qla2xxx: Always check the qla2x00_wait_for_hba_online() return + value + +From: Bart Van Assche + +[ Upstream commit e6803efae5acd109fad9f2f07dab674563441a53 ] + +This patch fixes several Coverity complaints about not always checking +the qla2x00_wait_for_hba_online() return value. + +Cc: Himanshu Madhani +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/qla2xxx/qla_attr.c | 3 ++- + drivers/scsi/qla2xxx/qla_target.c | 7 +++++-- + 2 files changed, 7 insertions(+), 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 3e9c49b3184f1..b008d583dd6e1 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -655,7 +655,8 @@ qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj, + break; + } else { + /* Make sure FC side is not in reset */ +- qla2x00_wait_for_hba_online(vha); ++ WARN_ON_ONCE(qla2x00_wait_for_hba_online(vha) != ++ QLA_SUCCESS); + + /* Issue MPI reset */ + scsi_block_requests(vha->host); +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 2a03d097da7b6..210ce294038df 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -6543,7 +6543,8 @@ qlt_enable_vha(struct scsi_qla_host *vha) + } else { + set_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags); + qla2xxx_wake_dpc(base_vha); +- qla2x00_wait_for_hba_online(base_vha); ++ WARN_ON_ONCE(qla2x00_wait_for_hba_online(base_vha) != ++ QLA_SUCCESS); + } + } + EXPORT_SYMBOL(qlt_enable_vha); +@@ -6573,7 +6574,9 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) + + set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); + qla2xxx_wake_dpc(vha); +- qla2x00_wait_for_hba_online(vha); ++ if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) ++ ql_dbg(ql_dbg_tgt, vha, 0xe081, ++ "qla2x00_wait_for_hba_online() failed\n"); + } + + /* +-- +2.20.1 + diff --git a/queue-4.19/scsi-qla2xxx-fix-dma-unmap-leak.patch b/queue-4.19/scsi-qla2xxx-fix-dma-unmap-leak.patch new file mode 100644 index 00000000000..5e67dcd4699 --- /dev/null +++ b/queue-4.19/scsi-qla2xxx-fix-dma-unmap-leak.patch @@ -0,0 +1,54 @@ +From 682f061eb436342a6e78ed7aa71a05678c54a0ba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 26 Jul 2019 09:07:26 -0700 +Subject: scsi: qla2xxx: Fix DMA unmap leak + +From: Himanshu Madhani + +[ Upstream commit 5d328de64d89400dcf9911125844d8adc0db697f ] + +With debug kernel we see following wanings indicating memory leak. + +[28809.523959] WARNING: CPU: 3 PID: 6790 at lib/dma-debug.c:978 +dma_debug_device_change+0x166/0x1d0 +[28809.523964] pci 0000:0c:00.6: DMA-API: device driver has pending DMA +allocations while released from device [count=5] +[28809.523964] One of leaked entries details: [device +address=0x00000002aefe4000] [size=8208 bytes] [mapped with DMA_BIDIRECTIONAL] +[mapped as coherent] + +Fix this by unmapping DMA memory. + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/qla2xxx/qla_bsg.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c +index 85b03a7f473c1..b68a708c67251 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -342,6 +342,8 @@ qla2x00_process_els(struct bsg_job *bsg_job) + dma_map_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, + bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); + if (!req_sg_cnt) { ++ dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, ++ bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); + rval = -ENOMEM; + goto done_free_fcport; + } +@@ -349,6 +351,8 @@ qla2x00_process_els(struct bsg_job *bsg_job) + rsp_sg_cnt = dma_map_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list, + bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE); + if (!rsp_sg_cnt) { ++ dma_unmap_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list, ++ bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE); + rval = -ENOMEM; + goto done_free_fcport; + } +-- +2.20.1 + diff --git a/queue-4.19/scsi-qla2xxx-fix-hang-in-fcport-delete-path.patch b/queue-4.19/scsi-qla2xxx-fix-hang-in-fcport-delete-path.patch new file mode 100644 index 00000000000..2de213bc046 --- /dev/null +++ b/queue-4.19/scsi-qla2xxx-fix-hang-in-fcport-delete-path.patch @@ -0,0 +1,50 @@ +From b85b135728075e52b7cda8802f41c07d5f4bb887 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 26 Jul 2019 09:07:38 -0700 +Subject: scsi: qla2xxx: Fix hang in fcport delete path + +From: Quinn Tran + +[ Upstream commit f00b3428a801758243693e046b34226e92bc56b3 ] + +A hang was observed in the fcport delete path when the device was +responding slow and an issue-lip path (results in session termination) was +taken. + +Fix this by issuing logo requests unconditionally. + +PID: 19491 TASK: ffff8e23e67bb150 CPU: 0 COMMAND: "kworker/0:0" + #0 [ffff8e2370297bf8] __schedule at ffffffffb4f7dbb0 + #1 [ffff8e2370297c88] schedule at ffffffffb4f7e199 + #2 [ffff8e2370297c98] schedule_timeout at ffffffffb4f7ba68 + #3 [ffff8e2370297d40] msleep at ffffffffb48ad9ff + #4 [ffff8e2370297d58] qlt_free_session_done at ffffffffc0c32052 [qla2xxx] + #5 [ffff8e2370297e20] process_one_work at ffffffffb48bcfdf + #6 [ffff8e2370297e68] worker_thread at ffffffffb48bdca6 + #7 [ffff8e2370297ec8] kthread at ffffffffb48c4f81 + +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/qla2xxx/qla_init.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index df91847d20cd0..9cb5527d3d8f1 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -291,9 +291,6 @@ qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport) + struct srb_iocb *lio; + int rval = QLA_FUNCTION_FAILED; + +- if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT)) +- return rval; +- + fcport->flags |= FCF_ASYNC_SENT; + sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL); + if (!sp) +-- +2.20.1 + diff --git a/queue-4.19/scsi-qla2xxx-fix-message-indicating-vectors-used-by-.patch b/queue-4.19/scsi-qla2xxx-fix-message-indicating-vectors-used-by-.patch new file mode 100644 index 00000000000..0da5a20de92 --- /dev/null +++ b/queue-4.19/scsi-qla2xxx-fix-message-indicating-vectors-used-by-.patch @@ -0,0 +1,46 @@ +From 293cbcff9eb0e3f2a56d8c514bb1234bd357de9c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 30 Aug 2019 15:23:57 -0700 +Subject: scsi: qla2xxx: Fix message indicating vectors used by driver + +From: Himanshu Madhani + +[ Upstream commit da48b82425b8bf999fb9f7c220e967c4d661b5f8 ] + +This patch updates log message which indicates number of vectors used by +the driver instead of displaying failure to get maximum requested +vectors. Driver will always request maximum vectors during +initialization. In the event driver is not able to get maximum requested +vectors, it will adjust the allocated vectors. This is normal and does not +imply failure in driver. + +Signed-off-by: Himanshu Madhani +Reviewed-by: Ewan D. Milne +Reviewed-by: Lee Duncan +Link: https://lore.kernel.org/r/20190830222402.23688-2-hmadhani@marvell.com +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/qla2xxx/qla_isr.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c +index 8fa7242dbb437..afe15b3e45fbf 100644 +--- a/drivers/scsi/qla2xxx/qla_isr.c ++++ b/drivers/scsi/qla2xxx/qla_isr.c +@@ -3418,10 +3418,8 @@ qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp) + ha->msix_count, ret); + goto msix_out; + } else if (ret < ha->msix_count) { +- ql_log(ql_log_warn, vha, 0x00c6, +- "MSI-X: Failed to enable support " +- "with %d vectors, using %d vectors.\n", +- ha->msix_count, ret); ++ ql_log(ql_log_info, vha, 0x00c6, ++ "MSI-X: Using %d vectors\n", ret); + ha->msix_count = ret; + /* Recalculate queue values */ + if (ha->mqiobase && (ql2xmqsupport || ql2xnvmeenable)) { +-- +2.20.1 + diff --git a/queue-4.19/scsi-qla2xxx-fix-qla24xx_process_bidir_cmd.patch b/queue-4.19/scsi-qla2xxx-fix-qla24xx_process_bidir_cmd.patch new file mode 100644 index 00000000000..fc155c79d37 --- /dev/null +++ b/queue-4.19/scsi-qla2xxx-fix-qla24xx_process_bidir_cmd.patch @@ -0,0 +1,70 @@ +From 724d13a24797709d265920828f11e4b677dfe8a0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 8 Aug 2019 20:01:48 -0700 +Subject: scsi: qla2xxx: Fix qla24xx_process_bidir_cmd() + +From: Bart Van Assche + +[ Upstream commit c29282c65d1cf54daeea63be46243d7f69d72f4d ] + +Set the r??_data_len variables before using these instead of after. + +This patch fixes the following Coverity complaint: + +const: At condition req_data_len != rsp_data_len, the value of req_data_len +must be equal to 0. +const: At condition req_data_len != rsp_data_len, the value of rsp_data_len +must be equal to 0. +dead_error_condition: The condition req_data_len != rsp_data_len cannot be +true. + +Cc: Himanshu Madhani +Fixes: a9b6f722f62d ("[SCSI] qla2xxx: Implementation of bidirectional.") # v3.7. +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/qla2xxx/qla_bsg.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c +index b68a708c67251..47f062e96e62c 100644 +--- a/drivers/scsi/qla2xxx/qla_bsg.c ++++ b/drivers/scsi/qla2xxx/qla_bsg.c +@@ -1779,8 +1779,8 @@ qla24xx_process_bidir_cmd(struct bsg_job *bsg_job) + uint16_t nextlid = 0; + uint32_t tot_dsds; + srb_t *sp = NULL; +- uint32_t req_data_len = 0; +- uint32_t rsp_data_len = 0; ++ uint32_t req_data_len; ++ uint32_t rsp_data_len; + + /* Check the type of the adapter */ + if (!IS_BIDI_CAPABLE(ha)) { +@@ -1885,6 +1885,9 @@ qla24xx_process_bidir_cmd(struct bsg_job *bsg_job) + goto done_unmap_sg; + } + ++ req_data_len = bsg_job->request_payload.payload_len; ++ rsp_data_len = bsg_job->reply_payload.payload_len; ++ + if (req_data_len != rsp_data_len) { + rval = EXT_STATUS_BUSY; + ql_log(ql_log_warn, vha, 0x70aa, +@@ -1892,10 +1895,6 @@ qla24xx_process_bidir_cmd(struct bsg_job *bsg_job) + goto done_unmap_sg; + } + +- req_data_len = bsg_job->request_payload.payload_len; +- rsp_data_len = bsg_job->reply_payload.payload_len; +- +- + /* Alloc SRB structure */ + sp = qla2x00_get_sp(vha, &(vha->bidir_fcport), GFP_KERNEL); + if (!sp) { +-- +2.20.1 + diff --git a/queue-4.19/scsi-qla2xxx-fix-session-lookup-in-qlt_abort_work.patch b/queue-4.19/scsi-qla2xxx-fix-session-lookup-in-qlt_abort_work.patch new file mode 100644 index 00000000000..a53d8e65ac3 --- /dev/null +++ b/queue-4.19/scsi-qla2xxx-fix-session-lookup-in-qlt_abort_work.patch @@ -0,0 +1,48 @@ +From cf984a52ea64b2936b8f59bd214b458e3b6dfb73 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 8 Aug 2019 20:01:40 -0700 +Subject: scsi: qla2xxx: Fix session lookup in qlt_abort_work() + +From: Bart Van Assche + +[ Upstream commit ac452b8e79320c9e90c78edf32ba2d42431e4daf ] + +Pass the correct session ID to find_sess_by_s_id() instead of passing an +uninitialized variable. + +Cc: Himanshu Madhani +Fixes: 2d70c103fd2a ("[SCSI] qla2xxx: Add LLD target-mode infrastructure for >= 24xx series") # v3.5. +Signed-off-by: Bart Van Assche +Tested-by: Himanshu Madhani +Reviewed-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/qla2xxx/qla_target.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c +index 078d124533247..2a03d097da7b6 100644 +--- a/drivers/scsi/qla2xxx/qla_target.c ++++ b/drivers/scsi/qla2xxx/qla_target.c +@@ -6062,7 +6062,6 @@ static void qlt_abort_work(struct qla_tgt *tgt, + struct qla_hw_data *ha = vha->hw; + struct fc_port *sess = NULL; + unsigned long flags = 0, flags2 = 0; +- uint32_t be_s_id; + uint8_t s_id[3]; + int rc; + +@@ -6075,8 +6074,7 @@ static void qlt_abort_work(struct qla_tgt *tgt, + s_id[1] = prm->abts.fcp_hdr_le.s_id[1]; + s_id[2] = prm->abts.fcp_hdr_le.s_id[0]; + +- sess = ha->tgt.tgt_ops->find_sess_by_s_id(vha, +- (unsigned char *)&be_s_id); ++ sess = ha->tgt.tgt_ops->find_sess_by_s_id(vha, s_id); + if (!sess) { + spin_unlock_irqrestore(&ha->tgt.sess_lock, flags2); + +-- +2.20.1 + diff --git a/queue-4.19/scsi-qla2xxx-fix-srb-leak-on-switch-command-timeout.patch b/queue-4.19/scsi-qla2xxx-fix-srb-leak-on-switch-command-timeout.patch new file mode 100644 index 00000000000..151d2096d74 --- /dev/null +++ b/queue-4.19/scsi-qla2xxx-fix-srb-leak-on-switch-command-timeout.patch @@ -0,0 +1,161 @@ +From d88e51aa25a3ee282e5dd5394f05851602174b4d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Nov 2019 07:06:52 -0800 +Subject: scsi: qla2xxx: Fix SRB leak on switch command timeout + +From: Quinn Tran + +[ Upstream commit af2a0c51b1205327f55a7e82e530403ae1d42cbb ] + +when GPSC/GPDB switch command fails, driver just returns without doing a +proper cleanup. This patch fixes this memory leak by calling sp->free() in +the error path. + +Link: https://lore.kernel.org/r/20191105150657.8092-4-hmadhani@marvell.com +Reviewed-by: Ewan D. Milne +Signed-off-by: Quinn Tran +Signed-off-by: Himanshu Madhani +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/qla2xxx/qla_gs.c | 2 +- + drivers/scsi/qla2xxx/qla_init.c | 11 +++++------ + drivers/scsi/qla2xxx/qla_mbx.c | 4 ---- + drivers/scsi/qla2xxx/qla_mid.c | 11 ++++------- + drivers/scsi/qla2xxx/qla_os.c | 7 ++++++- + 5 files changed, 16 insertions(+), 19 deletions(-) + +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index b8d3403c3c85a..f621cb55ccfb2 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -3264,7 +3264,7 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res) + fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); + + if (res == QLA_FUNCTION_TIMEOUT) +- return; ++ goto done; + + if (res == (DID_ERROR << 16)) { + /* entry status error */ +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 9cb5527d3d8f1..e6f3a0f5188c4 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -982,13 +982,11 @@ void qla24xx_async_gpdb_sp_done(void *s, int res) + "Async done-%s res %x, WWPN %8phC mb[1]=%x mb[2]=%x \n", + sp->name, res, fcport->port_name, mb[1], mb[2]); + +- if (res == QLA_FUNCTION_TIMEOUT) { +- dma_pool_free(sp->vha->hw->s_dma_pool, sp->u.iocb_cmd.u.mbx.in, +- sp->u.iocb_cmd.u.mbx.in_dma); +- return; +- } +- + fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); ++ ++ if (res == QLA_FUNCTION_TIMEOUT) ++ goto done; ++ + memset(&ea, 0, sizeof(ea)); + ea.event = FCME_GPDB_DONE; + ea.fcport = fcport; +@@ -996,6 +994,7 @@ void qla24xx_async_gpdb_sp_done(void *s, int res) + + qla2x00_fcport_event_handler(vha, &ea); + ++done: + dma_pool_free(ha->s_dma_pool, sp->u.iocb_cmd.u.mbx.in, + sp->u.iocb_cmd.u.mbx.in_dma); + +diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c +index 128fcff24f1be..b01f69dd4b283 100644 +--- a/drivers/scsi/qla2xxx/qla_mbx.c ++++ b/drivers/scsi/qla2xxx/qla_mbx.c +@@ -6131,17 +6131,13 @@ int qla24xx_send_mb_cmd(struct scsi_qla_host *vha, mbx_cmd_t *mcp) + case QLA_SUCCESS: + ql_dbg(ql_dbg_mbx, vha, 0x119d, "%s: %s done.\n", + __func__, sp->name); +- sp->free(sp); + break; + default: + ql_dbg(ql_dbg_mbx, vha, 0x119e, "%s: %s Failed. %x.\n", + __func__, sp->name, rval); +- sp->free(sp); + break; + } + +- return rval; +- + done_free_sp: + sp->free(sp); + done: +diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c +index d620f4bebcd0d..516fccdbcebd4 100644 +--- a/drivers/scsi/qla2xxx/qla_mid.c ++++ b/drivers/scsi/qla2xxx/qla_mid.c +@@ -931,7 +931,7 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) + + sp = qla2x00_get_sp(base_vha, NULL, GFP_KERNEL); + if (!sp) +- goto done; ++ return rval; + + sp->type = SRB_CTRL_VP; + sp->name = "ctrl_vp"; +@@ -946,7 +946,7 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) + ql_dbg(ql_dbg_async, vha, 0xffff, + "%s: %s Failed submission. %x.\n", + __func__, sp->name, rval); +- goto done_free_sp; ++ goto done; + } + + ql_dbg(ql_dbg_vport, vha, 0x113f, "%s hndl %x submitted\n", +@@ -962,16 +962,13 @@ int qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) + case QLA_SUCCESS: + ql_dbg(ql_dbg_vport, vha, 0xffff, "%s: %s done.\n", + __func__, sp->name); +- goto done_free_sp; ++ break; + default: + ql_dbg(ql_dbg_vport, vha, 0xffff, "%s: %s Failed. %x.\n", + __func__, sp->name, rval); +- goto done_free_sp; ++ break; + } + done: +- return rval; +- +-done_free_sp: + sp->free(sp); + return rval; + } +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 183bfda8f5d11..bb20a4a228cfe 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1029,7 +1029,7 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd, + ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x3078, + "Start scsi failed rval=%d for cmd=%p.\n", rval, cmd); + if (rval == QLA_INTERFACE_ERROR) +- goto qc24_fail_command; ++ goto qc24_free_sp_fail_command; + goto qc24_host_busy_free_sp; + } + +@@ -1044,6 +1044,11 @@ qc24_host_busy: + qc24_target_busy: + return SCSI_MLQUEUE_TARGET_BUSY; + ++qc24_free_sp_fail_command: ++ sp->free(sp); ++ CMD_SP(cmd) = NULL; ++ qla2xxx_rel_qpair_sp(sp->qpair, sp); ++ + qc24_fail_command: + cmd->scsi_done(cmd); + +-- +2.20.1 + diff --git a/queue-4.19/scsi-zfcp-trace-channel-log-even-for-fcp-command-res.patch b/queue-4.19/scsi-zfcp-trace-channel-log-even-for-fcp-command-res.patch new file mode 100644 index 00000000000..ca5d1b96908 --- /dev/null +++ b/queue-4.19/scsi-zfcp-trace-channel-log-even-for-fcp-command-res.patch @@ -0,0 +1,50 @@ +From 0db77d01e2a42da7498566336d9df147deb9f598 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 25 Oct 2019 18:12:53 +0200 +Subject: scsi: zfcp: trace channel log even for FCP command responses + +From: Steffen Maier + +[ Upstream commit 100843f176109af94600e500da0428e21030ca7f ] + +While v2.6.26 commit b75db73159cc ("[SCSI] zfcp: Add qtcb dump to hba debug +trace") is right that we don't want to flood the (payload) trace ring +buffer, we don't trace successful FCP command responses by default. So we +can include the channel log for problem determination with failed responses +of any FSF request type. + +Fixes: b75db73159cc ("[SCSI] zfcp: Add qtcb dump to hba debug trace") +Fixes: a54ca0f62f95 ("[SCSI] zfcp: Redesign of the debug tracing for HBA records.") +Cc: #2.6.38+ +Link: https://lore.kernel.org/r/e37597b5c4ae123aaa85fd86c23a9f71e994e4a9.1572018132.git.bblock@linux.ibm.com +Reviewed-by: Benjamin Block +Signed-off-by: Steffen Maier +Signed-off-by: Benjamin Block +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/s390/scsi/zfcp_dbf.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c +index 3b368fcf13f40..946380f0d7199 100644 +--- a/drivers/s390/scsi/zfcp_dbf.c ++++ b/drivers/s390/scsi/zfcp_dbf.c +@@ -94,11 +94,9 @@ void zfcp_dbf_hba_fsf_res(char *tag, int level, struct zfcp_fsf_req *req) + memcpy(rec->u.res.fsf_status_qual, &q_head->fsf_status_qual, + FSF_STATUS_QUALIFIER_SIZE); + +- if (req->fsf_command != FSF_QTCB_FCP_CMND) { +- rec->pl_len = q_head->log_length; +- zfcp_dbf_pl_write(dbf, (char *)q_pref + q_head->log_start, +- rec->pl_len, "fsf_res", req->req_id); +- } ++ rec->pl_len = q_head->log_length; ++ zfcp_dbf_pl_write(dbf, (char *)q_pref + q_head->log_start, ++ rec->pl_len, "fsf_res", req->req_id); + + debug_event(dbf->hba, level, rec, sizeof(*rec)); + spin_unlock_irqrestore(&dbf->hba_lock, flags); +-- +2.20.1 + diff --git a/queue-4.19/series b/queue-4.19/series index a7a347d04e9..5dea7c32d1e 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -94,3 +94,35 @@ ext2-check-err-when-partial-null.patch quota-fix-livelock-in-dquot_writeback_dquots.patch ext4-fix-credit-estimate-for-final-inode-freeing.patch reiserfs-fix-extended-attributes-on-the-root-directory.patch +scsi-zfcp-trace-channel-log-even-for-fcp-command-res.patch +scsi-qla2xxx-fix-dma-unmap-leak.patch +scsi-qla2xxx-fix-hang-in-fcport-delete-path.patch +scsi-qla2xxx-fix-session-lookup-in-qlt_abort_work.patch +scsi-qla2xxx-fix-qla24xx_process_bidir_cmd.patch +scsi-qla2xxx-always-check-the-qla2x00_wait_for_hba_o.patch +scsi-qla2xxx-fix-message-indicating-vectors-used-by-.patch +scsi-qla2xxx-fix-srb-leak-on-switch-command-timeout.patch +xhci-make-sure-interrupts-are-restored-to-correct-st.patch +iio-ad7949-kill-pointless-readback-handling-code.patch +usb-typec-fix-use-after-free-in-typec_register_port.patch +omap-pdata-quirks-remove-openpandora-quirks-for-mmc3.patch +scsi-lpfc-cap-npiv-vports-to-256.patch +scsi-lpfc-correct-code-setting-non-existent-bits-in-.patch +scsi-lpfc-correct-topology-type-reporting-on-g7-adap.patch +drbd-change-drbd_request_detach_interruptible-s-retu.patch +e100-fix-passing-zero-to-ptr_err-warning-in-e100_loa.patch +pvcalls-front-don-t-return-error-when-the-ring-is-fu.patch +sch_cake-correctly-update-parent-qlen-when-splitting.patch +net-smc-do-not-wait-under-send_lock.patch +net-hns3-clear-pci-private-data-when-unload-hns3-dri.patch +net-hns3-change-hnae3_register_ae_dev-to-int.patch +net-hns3-check-variable-is-valid-before-assigning-it.patch +scsi-hisi_sas-send-primitive-notify-to-ssp-situation.patch +scsi-hisi_sas-reject-setting-programmed-minimum-link.patch +x86-mce-amd-turn-off-mc4_misc-thresholding-on-all-fa.patch +x86-mce-amd-carve-out-the-mc4_misc-thresholding-quir.patch +power-supply-cpcap-battery-fix-signed-counter-sample.patch +mlxsw-spectrum_router-refresh-nexthop-neighbour-when.patch +media-vimc-fix-component-match-compare.patch +ath10k-fix-fw-crash-by-moving-chip-reset-after-napi-.patch +regulator-88pm800-fix-warning-same-module-names.patch diff --git a/queue-4.19/usb-typec-fix-use-after-free-in-typec_register_port.patch b/queue-4.19/usb-typec-fix-use-after-free-in-typec_register_port.patch new file mode 100644 index 00000000000..0a3c2a11585 --- /dev/null +++ b/queue-4.19/usb-typec-fix-use-after-free-in-typec_register_port.patch @@ -0,0 +1,53 @@ +From 3860e016001bba5aa8654734c06722e2cc89c9b1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Nov 2019 22:04:52 +0800 +Subject: usb: typec: fix use after free in typec_register_port() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Wen Yang + +[ Upstream commit 5c388abefda0d92355714010c0199055c57ab6c7 ] + +We can't use "port->sw" and/or "port->mux" after it has been freed. + +Fixes: 23481121c81d ("usb: typec: class: Don't use port parent for getting mux handles") +Signed-off-by: Wen Yang +Cc: stable +Cc: linux-usb@vger.kernel.org +Cc: linux-kernel@vger.kernel.org +Acked-by: Heikki Krogerus  +Link: https://lore.kernel.org/r/20191126140452.14048-1-wenyang@linux.alibaba.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/typec/class.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c +index 00141e05bc724..1916ee1600b47 100644 +--- a/drivers/usb/typec/class.c ++++ b/drivers/usb/typec/class.c +@@ -1589,14 +1589,16 @@ struct typec_port *typec_register_port(struct device *parent, + + port->sw = typec_switch_get(&port->dev); + if (IS_ERR(port->sw)) { ++ ret = PTR_ERR(port->sw); + put_device(&port->dev); +- return ERR_CAST(port->sw); ++ return ERR_PTR(ret); + } + + port->mux = typec_mux_get(&port->dev, "typec-mux"); + if (IS_ERR(port->mux)) { ++ ret = PTR_ERR(port->mux); + put_device(&port->dev); +- return ERR_CAST(port->mux); ++ return ERR_PTR(ret); + } + + ret = device_add(&port->dev); +-- +2.20.1 + diff --git a/queue-4.19/x86-mce-amd-carve-out-the-mc4_misc-thresholding-quir.patch b/queue-4.19/x86-mce-amd-carve-out-the-mc4_misc-thresholding-quir.patch new file mode 100644 index 00000000000..e912161c2a3 --- /dev/null +++ b/queue-4.19/x86-mce-amd-carve-out-the-mc4_misc-thresholding-quir.patch @@ -0,0 +1,130 @@ +From 240adc43c6d69c0e820ebc4cc2cc5adfd5d8065c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 16 Jan 2019 15:10:40 +0000 +Subject: x86/MCE/AMD: Carve out the MC4_MISC thresholding quirk + +From: Shirish S + +[ Upstream commit 30aa3d26edb0f3d7992757287eec0ca588a5c259 ] + +The MC4_MISC thresholding quirk needs to be applied during S5 -> S0 and +S3 -> S0 state transitions, which follow different code paths. Carve it +out into a separate function and call it mce_amd_feature_init() where +the two code paths of the state transitions converge. + + [ bp: massage commit message and the carved out function. ] + +Signed-off-by: Shirish S +Signed-off-by: Borislav Petkov +Cc: "H. Peter Anvin" +Cc: Ingo Molnar +Cc: Kees Cook +Cc: Thomas Gleixner +Cc: Tony Luck +Cc: Vishal Verma +Cc: Yazen Ghannam +Cc: x86-ml +Link: https://lkml.kernel.org/r/1547651417-23583-3-git-send-email-shirish.s@amd.com +Signed-off-by: Sasha Levin +--- + arch/x86/kernel/cpu/mcheck/mce.c | 29 ---------------------- + arch/x86/kernel/cpu/mcheck/mce_amd.c | 36 ++++++++++++++++++++++++++++ + 2 files changed, 36 insertions(+), 29 deletions(-) + +diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c +index a0bc7f7570814..87ed8462a5c72 100644 +--- a/arch/x86/kernel/cpu/mcheck/mce.c ++++ b/arch/x86/kernel/cpu/mcheck/mce.c +@@ -1631,35 +1631,6 @@ static int __mcheck_cpu_apply_quirks(struct cpuinfo_x86 *c) + if (c->x86 == 0x15 && c->x86_model <= 0xf) + mce_flags.overflow_recov = 1; + +- /* +- * Turn off MC4_MISC thresholding banks on all models since +- * they're not supported there. +- */ +- if (c->x86 == 0x15) { +- int i; +- u64 hwcr; +- bool need_toggle; +- u32 msrs[] = { +- 0x00000413, /* MC4_MISC0 */ +- 0xc0000408, /* MC4_MISC1 */ +- }; +- +- rdmsrl(MSR_K7_HWCR, hwcr); +- +- /* McStatusWrEn has to be set */ +- need_toggle = !(hwcr & BIT(18)); +- +- if (need_toggle) +- wrmsrl(MSR_K7_HWCR, hwcr | BIT(18)); +- +- /* Clear CntP bit safely */ +- for (i = 0; i < ARRAY_SIZE(msrs); i++) +- msr_clear_bit(msrs[i], 62); +- +- /* restore old settings */ +- if (need_toggle) +- wrmsrl(MSR_K7_HWCR, hwcr); +- } + } + + if (c->x86_vendor == X86_VENDOR_INTEL) { +diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c +index 9f915a8791cc7..5bdfe52b2c9d9 100644 +--- a/arch/x86/kernel/cpu/mcheck/mce_amd.c ++++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c +@@ -545,6 +545,40 @@ out: + return offset; + } + ++/* ++ * Turn off MC4_MISC thresholding banks on all family 0x15 models since ++ * they're not supported there. ++ */ ++void disable_err_thresholding(struct cpuinfo_x86 *c) ++{ ++ int i; ++ u64 hwcr; ++ bool need_toggle; ++ u32 msrs[] = { ++ 0x00000413, /* MC4_MISC0 */ ++ 0xc0000408, /* MC4_MISC1 */ ++ }; ++ ++ if (c->x86 != 0x15) ++ return; ++ ++ rdmsrl(MSR_K7_HWCR, hwcr); ++ ++ /* McStatusWrEn has to be set */ ++ need_toggle = !(hwcr & BIT(18)); ++ ++ if (need_toggle) ++ wrmsrl(MSR_K7_HWCR, hwcr | BIT(18)); ++ ++ /* Clear CntP bit safely */ ++ for (i = 0; i < ARRAY_SIZE(msrs); i++) ++ msr_clear_bit(msrs[i], 62); ++ ++ /* restore old settings */ ++ if (need_toggle) ++ wrmsrl(MSR_K7_HWCR, hwcr); ++} ++ + /* cpu init entry point, called from mce.c with preempt off */ + void mce_amd_feature_init(struct cpuinfo_x86 *c) + { +@@ -552,6 +586,8 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c) + unsigned int bank, block, cpu = smp_processor_id(); + int offset = -1; + ++ disable_err_thresholding(c); ++ + for (bank = 0; bank < mca_cfg.banks; ++bank) { + if (mce_flags.smca) + smca_configure(bank, cpu); +-- +2.20.1 + diff --git a/queue-4.19/x86-mce-amd-turn-off-mc4_misc-thresholding-on-all-fa.patch b/queue-4.19/x86-mce-amd-turn-off-mc4_misc-thresholding-on-all-fa.patch new file mode 100644 index 00000000000..df5f0875321 --- /dev/null +++ b/queue-4.19/x86-mce-amd-turn-off-mc4_misc-thresholding-on-all-fa.patch @@ -0,0 +1,49 @@ +From 24477b1d36d67515925e874983ce0d0c23e0522a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Jan 2019 07:54:40 +0000 +Subject: x86/MCE/AMD: Turn off MC4_MISC thresholding on all family 0x15 models + +From: Shirish S + +[ Upstream commit c95b323dcd3598dd7ef5005d6723c1ba3b801093 ] + +MC4_MISC thresholding is not supported on all family 0x15 processors, +hence skip the x86_model check when applying the quirk. + + [ bp: massage commit message. ] + +Signed-off-by: Shirish S +Signed-off-by: Borislav Petkov +Cc: "H. Peter Anvin" +Cc: Ingo Molnar +Cc: Thomas Gleixner +Cc: Tony Luck +Cc: Vishal Verma +Cc: x86-ml +Link: https://lkml.kernel.org/r/1547106849-3476-2-git-send-email-shirish.s@amd.com +Signed-off-by: Sasha Levin +--- + arch/x86/kernel/cpu/mcheck/mce.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c +index fee118b3b69fd..a0bc7f7570814 100644 +--- a/arch/x86/kernel/cpu/mcheck/mce.c ++++ b/arch/x86/kernel/cpu/mcheck/mce.c +@@ -1632,11 +1632,10 @@ static int __mcheck_cpu_apply_quirks(struct cpuinfo_x86 *c) + mce_flags.overflow_recov = 1; + + /* +- * Turn off MC4_MISC thresholding banks on those models since ++ * Turn off MC4_MISC thresholding banks on all models since + * they're not supported there. + */ +- if (c->x86 == 0x15 && +- (c->x86_model >= 0x10 && c->x86_model <= 0x1f)) { ++ if (c->x86 == 0x15) { + int i; + u64 hwcr; + bool need_toggle; +-- +2.20.1 + diff --git a/queue-4.19/xhci-make-sure-interrupts-are-restored-to-correct-st.patch b/queue-4.19/xhci-make-sure-interrupts-are-restored-to-correct-st.patch new file mode 100644 index 00000000000..179414413cb --- /dev/null +++ b/queue-4.19/xhci-make-sure-interrupts-are-restored-to-correct-st.patch @@ -0,0 +1,69 @@ +From d43e9f3dc5f60fa2bbde0f0fdc72ad362afbb319 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 11 Dec 2019 16:20:07 +0200 +Subject: xhci: make sure interrupts are restored to correct state + +From: Mathias Nyman + +[ Upstream commit bd82873f23c9a6ad834348f8b83f3b6a5bca2c65 ] + +spin_unlock_irqrestore() might be called with stale flags after +reading port status, possibly restoring interrupts to a incorrect +state. + +If a usb2 port just finished resuming while the port status is read +the spin lock will be temporary released and re-acquired in a separate +function. The flags parameter is passed as value instead of a pointer, +not updating flags properly before the final spin_unlock_irqrestore() +is called. + +Cc: # v3.12+ +Fixes: 8b3d45705e54 ("usb: Fix xHCI host issues on remote wakeup.") +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20191211142007.8847-7-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci-hub.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index 333f9202ec8be..02843c16f9c78 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -831,7 +831,7 @@ static u32 xhci_get_ext_port_status(u32 raw_port_status, u32 port_li) + static u32 xhci_get_port_status(struct usb_hcd *hcd, + struct xhci_bus_state *bus_state, + u16 wIndex, u32 raw_port_status, +- unsigned long flags) ++ unsigned long *flags) + __releases(&xhci->lock) + __acquires(&xhci->lock) + { +@@ -917,12 +917,12 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, + xhci_test_and_clear_bit(xhci, port, PORT_PLC); + xhci_set_link_state(xhci, port, XDEV_U0); + +- spin_unlock_irqrestore(&xhci->lock, flags); ++ spin_unlock_irqrestore(&xhci->lock, *flags); + time_left = wait_for_completion_timeout( + &bus_state->rexit_done[wIndex], + msecs_to_jiffies( + XHCI_MAX_REXIT_TIMEOUT_MS)); +- spin_lock_irqsave(&xhci->lock, flags); ++ spin_lock_irqsave(&xhci->lock, *flags); + + if (time_left) { + slot_id = xhci_find_slot_id_by_port(hcd, +@@ -1076,7 +1076,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + } + trace_xhci_get_port_status(wIndex, temp); + status = xhci_get_port_status(hcd, bus_state, wIndex, temp, +- flags); ++ &flags); + if (status == 0xffffffff) + goto error; + +-- +2.20.1 +