6.17.8-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainerPATCH 412/849 ptp: Limit time setting of PTP clocks
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miroslav Lichvar <[email protected]>
[ Upstream commit 5a8c02a6bf52b1cf9cfb7868a8330f7c3c6aebe9 ]
Networking drivers implementing PTP clocks and kernel socket code handling hardware timestamps use the 64-bit signed ktime_t type counting nanoseconds. When a PTP clock reaches the maximum value in year 2262, the timestamps returned to applications will overflow into year 1667. The same thing happens when injecting a large offset with clock_adjtime(ADJ_SETOFFSET).
The commit 7a8e61f84786 ("timekeeping: Force upper bound for setting CLOCK_REALTIME") limited the maximum accepted value setting the system clock to 30 years before the maximum representable value (i.e. year 2232) to avoid the overflow, assuming the system will not run for more than 30 years.
Enforce the same limit for PTP clocks. Don't allow negative values and values closer than 30 years to the maximum value. Drivers may implement an even lower limit if the hardware registers cannot represent the whole interval between years 1970 and 2262 in the required resolution.
--- drivers/ptp/ptp_clock.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/ptp/ptp_clock.c +12 -1
@@ -100,6 +100,9 @@ static int ptp_clock_settime(struct posix_clock *pc, const struct timespec64 *tpreturn -EBUSY ; } +if (!timespec64_valid_settod (tp)) +return -EINVAL ; +return ptp->info->settime64 (ptp->info, tp); }
@@ -130,7 +133,7 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx) ops = ptp->info;if (tx->modes &ADJ_SETOFFSET ) { -struct timespec64 ts; +struct timespec64 ts, ts2;ktime_t kt;s64 delta;
@@ -143,6 +146,14 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx)if ((unsigned long ) ts.tv_nsec >=NSEC_PER_SEC )return -EINVAL ; +/* Make sure the offset is valid */ + err =ptp_clock_gettime (pc, &ts2); +if (err) +return err; + ts2 =timespec64_add (ts2, ts); +if (!timespec64_valid_settod (&ts2)) +return -EINVAL ; + kt =timespec64_to_ktime (ts); delta =ktime_to_ns (kt); err = ops->adjtime (ops, delta);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 413/849 drm/xe/guc: Add devm release action to safely tear down CT
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Satyanarayana K V P <[email protected]>
[ Upstream commit ee4b32220a6b41e71512e8804585325e685456ba ]
When a buffer object (BO) is allocated with the XE_BO_FLAG_GGTT_INVALIDATE flag, the driver initiates TLB invalidation requests via the CTB mechanism while releasing the BO. However a premature release of the CTB BO can lead to system crashes, as observed in:
Oops: Oops: 0000 [#1] SMP NOPTI RIP: 0010:h2g_write+0x2f3/0x7c0 [xe] Call Trace: guc_ct_send_locked+0x8b/0x670 [xe] xe_guc_ct_send_locked+0x19/0x60 [xe] send_tlb_invalidation+0xb4/0x460 [xe] xe_gt_tlb_invalidation_ggtt+0x15e/0x2e0 [xe] ggtt_invalidate_gt_tlb.part.0+0x16/0x90 [xe] ggtt_node_remove+0x110/0x140 [xe] xe_ggtt_node_remove+0x40/0xa0 [xe] xe_ggtt_remove_bo+0x87/0x250 [xe]
Introduce a devm-managed release action during xe_guc_ct_init() and xe_guc_ct_init_post_hwconfig() to ensure proper CTB disablement before resource deallocation, preventing the use-after-free scenario.
--- drivers/gpu/drm/xe/xe_guc.c | 8 +++---- drivers/gpu/drm/xe/xe_guc_ct.c | 41 +++++++++++++++++++++++++++++++++- drivers/gpu/drm/xe/xe_guc_ct.h | 1 + 3 files changed, 45 insertions(+), 5 deletions(-)
drivers/gpu/drm/xe/xe_guc.c +4 -4
@@ -701,10 +701,6 @@ static int xe_guc_realloc_post_hwconfig(struct xe_guc *guc)if (ret)return ret; - ret =xe_managed_bo_reinit_in_vram (xe, tile, &guc->ct.bo); -if (ret) -return ret; -return 0 ; }
@@ -839,6 +835,10 @@ int xe_guc_init_post_hwconfig(struct xe_guc *guc)if (ret)return ret; + ret =xe_guc_ct_init_post_hwconfig (&guc->ct); +if (ret) +return ret; +guc_init_params_post_hwconfig (guc); ret =xe_guc_submit_init (guc, ~0 );
drivers/gpu/drm/xe/xe_guc_ct.c +40 -1
62 lines not on this page · raw message
drivers/gpu/drm/xe/xe_guc_ct.h +1 -0
@@ -13,6 +13,7 @@ struct xe_device;int xe_guc_ct_init_noalloc (struct xe_guc_ct *ct);int xe_guc_ct_init (struct xe_guc_ct *ct); +int xe_guc_ct_init_post_hwconfig (struct xe_guc_ct *ct);int xe_guc_ct_enable (struct xe_guc_ct *ct);void xe_guc_ct_disable (struct xe_guc_ct *ct);void xe_guc_ct_stop (struct xe_guc_ct *ct);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 414/849 dmaengine: sh: setup_xref error handling
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Andreatta <[email protected]>
[ Upstream commit d9a3e9929452780df16f3414f0d59b5f69d058cf ]
This patch modifies the type of setup_xref from void to int and handles errors since the function can fail.
setup_xref now returns the (eventual) error from dmae_set_dmars|dmae_set_chcr, while shdma_tx_submit handles the result, removing the chunks from the queue and marking PM as idle in case of an error.
--- drivers/dma/sh/shdma-base.c | 25 +++++++++++++++++++------ drivers/dma/sh/shdmac.c | 17 +++++++++++++---- include/linux/shdma-base.h | 2 +- 3 files changed, 33 insertions(+), 11 deletions(-)
drivers/dma/sh/shdma-base.c +19 -6
@@ -129,12 +129,25 @@ static dma_cookie_t shdma_tx_submit(struct dma_async_tx_descriptor *tx)const struct shdma_ops *ops = sdev->ops;dev_dbg (schan->dev,"Bring up channel %d\n" , schan->id); -/* -* TODO: .xfer_setup() might fail on some platforms. -* Make it int then, on error remove chunks from the -* queue again -*/ - ops->setup_xfer (schan, schan->slave_id); + + ret = ops->setup_xfer (schan, schan->slave_id); +if (ret <0 ) { +dev_err (schan->dev,"setup_xfer failed: %d\n" , ret); + +/* Remove chunks from the queue and mark them as idle */ +list_for_each_entry_safe (chunk, c, &schan->ld_queue, node) { +if (chunk->cookie == cookie) { + chunk->mark =DESC_IDLE ; +list_move (&chunk->node, &schan->ld_free); + } + } + + schan->pm_state =SHDMA_PM_ESTABLISHED ; + ret =pm_runtime_put (schan->dev); + +spin_unlock_irq (&schan->chan_lock); +return ret; + }if (schan->pm_state ==SHDMA_PM_PENDING )shdma_chan_xfer_ld_queue (schan);
drivers/dma/sh/shdmac.c +13 -4
@@ -300,21 +300,30 @@ static bool sh_dmae_channel_busy(struct shdma_chan *schan)return dmae_is_busy (sh_chan); } -static void sh_dmae_setup_xfer (struct shdma_chan *schan, -int slave_id) +static int sh_dmae_setup_xfer (struct shdma_chan *schan,int slave_id) { struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan, shdma_chan); +int ret =0 ;if (slave_id >=0 ) {const struct sh_dmae_slave_config *cfg = sh_chan->config; -dmae_set_dmars (sh_chan, cfg->mid_rid); -dmae_set_chcr (sh_chan, cfg->chcr); + ret =dmae_set_dmars (sh_chan, cfg->mid_rid); +if (ret <0 ) + goto END; + + ret =dmae_set_chcr (sh_chan, cfg->chcr); +if (ret <0 ) + goto END; + }else {dmae_init (sh_chan); } + +END: +return ret; }/*
include/linux/shdma-base.h +1 -1
@@ -96,7 +96,7 @@ struct shdma_ops {int (*desc_setup)(struct shdma_chan *,struct shdma_desc *,dma_addr_t ,dma_addr_t ,size_t *);int (*set_slave)(struct shdma_chan *,int ,dma_addr_t ,bool ); -void (*setup_xfer)(struct shdma_chan *,int ); +int (*setup_xfer)(struct shdma_chan *,int );void (*start_xfer)(struct shdma_chan *,struct shdma_desc *);struct shdma_desc *(*embedded_desc)(void *,int );bool (*chan_irq)(struct shdma_chan *,int );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 415/849 dmaengine: mv_xor: match alloc_wc and free_wc
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit a33e3b667d2f004fdfae6b442bd4676f6c510abb ]
dma_alloc_wc is used but not dma_free_wc.
--- drivers/dma/mv_xor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/dma/mv_xor.c +2 -2
@@ -1013,7 +1013,7 @@ static int mv_xor_channel_remove(struct mv_xor_chan *mv_chan)dma_async_device_unregister (&mv_chan->dmadev); -dma_free_coherent (dev,MV_XOR_POOL_SIZE , +dma_free_wc (dev,MV_XOR_POOL_SIZE , mv_chan->dma_desc_pool_virt, mv_chan->dma_desc_pool);dma_unmap_single (dev, mv_chan->dummy_src_addr,MV_XOR_MIN_BYTE_COUNT ,DMA_FROM_DEVICE );
@@ -1163,7 +1163,7 @@ mv_xor_channel_add(struct mv_xor_device *xordev, err_free_irq:free_irq (mv_chan->irq, mv_chan); err_free_dma: -dma_free_coherent (&pdev->dev,MV_XOR_POOL_SIZE , +dma_free_wc (&pdev->dev,MV_XOR_POOL_SIZE , mv_chan->dma_desc_pool_virt, mv_chan->dma_desc_pool); err_unmap_dst: dma_unmap_single(dma_dev->dev, mv_chan->dummy_dst_addr,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 416/849 dmaengine: dw-edma: Set status for callback_result
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Devendra K Verma <[email protected]>
[ Upstream commit 5e742de97c806a4048418237ef1283e7d71eaf4b ]
DMA Engine has support for the callback_result which provides the status of the request and the residue. This helps in determining the correct status of the request and in efficient resource management of the request.
The 'callback_result' method is preferred over the deprecated 'callback' method.
--- drivers/dma/dw-edma/dw-edma-core.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/dma/dw-edma/dw-edma-core.c +22 -0
@@ -584,6 +584,25 @@ dw_edma_device_prep_interleaved_dma(struct dma_chan *dchan,return dw_edma_device_transfer (&xfer); } +static void dw_hdma_set_callback_result (struct virt_dma_desc *vd, +enum dmaengine_tx_result result) +{ +u32 residue =0 ; +struct dw_edma_desc *desc; +struct dmaengine_result *res; + +if (!vd->tx.callback_result) +return ; + + desc =vd2dw_edma_desc (vd); +if (desc) + residue = desc->alloc_sz - desc->xfer_sz; + + res = &vd->tx_result; + res->result = result; + res->residue = residue; +} +static void dw_edma_done_interrupt (struct dw_edma_chan *chan) {struct dw_edma_desc *desc;
@@ -597,6 +616,8 @@ static void dw_edma_done_interrupt(struct dw_edma_chan *chan)case EDMA_REQ_NONE : desc =vd2dw_edma_desc (vd);if (!desc->chunks_alloc) { +dw_hdma_set_callback_result (vd, +DMA_TRANS_NOERROR );list_del (&vd->node);vchan_cookie_complete (vd); }
@@ -633,6 +654,7 @@ static void dw_edma_abort_interrupt(struct dw_edma_chan *chan)spin_lock_irqsave (&chan->vc.lock, flags); vd =vchan_next_desc (&chan->vc);if (vd) { +dw_hdma_set_callback_result (vd,DMA_TRANS_ABORTED );list_del (&vd->node);vchan_cookie_complete (vd); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 417/849 netfilter: nf_tables: all transaction allocations can now sleep
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit 3d95a2e016abab29ccb6f384576b2038e544a5a8 ]
Now that nft_setelem_flush is not called with rcu read lock held or disabled softinterrupts anymore this can now use GFP_KERNEL too.
This is the last atomic allocation of transaction elements, so remove all gfp_t arguments and the wrapper function.
This makes attempts to delete large sets much more reliable, before this was prone to transient memory allocation failures.
--- net/netfilter/nf_tables_api.c | 47 ++++++++++++++--------------------- 1 file changed, 19 insertions(+), 28 deletions(-)
net/netfilter/nf_tables_api.c +19 -28
@@ -151,12 +151,12 @@ static void nft_ctx_init(struct nft_ctx *ctx,bitmap_zero (ctx->reg_inited,NFT_REG32_NUM ); } -static struct nft_trans *nft_trans_alloc_gfp (const struct nft_ctx *ctx, -int msg_type,u32 size,gfp_t gfp) +static struct nft_trans *nft_trans_alloc (const struct nft_ctx *ctx, +int msg_type,u32 size) {struct nft_trans *trans; - trans =kzalloc (size, gfp); + trans =kzalloc (size,GFP_KERNEL );if (trans ==NULL )return NULL ;
@@ -172,12 +172,6 @@ static struct nft_trans *nft_trans_alloc_gfp(const struct nft_ctx *ctx,return trans; } -static struct nft_trans *nft_trans_alloc (const struct nft_ctx *ctx, -int msg_type,u32 size) -{ -return nft_trans_alloc_gfp (ctx, msg_type, size,GFP_KERNEL ); -} -static struct nft_trans_binding *nft_trans_get_binding (struct nft_trans *trans) {switch (trans->msg_type) {
@@ -442,8 +436,7 @@ static bool nft_trans_collapse_set_elem_allowed(const struct nft_trans_elem *a,static bool nft_trans_collapse_set_elem (struct nftables_pernet *nft_net,struct nft_trans_elem *tail, -struct nft_trans_elem *trans, -gfp_t gfp) +struct nft_trans_elem *trans) {unsigned int nelems, old_nelems = tail->nelems;struct nft_trans_elem *new_trans;
@@ -466,9 +459,11 @@ static bool nft_trans_collapse_set_elem(struct nftables_pernet *nft_net,/* krealloc might free tail which invalidates list pointers */ list_del_init (&tail->nft_trans.list); - new_trans =krealloc (tail,struct_size (tail, elems, nelems), gfp); + new_trans =krealloc (tail,struct_size (tail, elems, nelems), +GFP_KERNEL );if (!new_trans) { -list_add_tail (&tail->nft_trans.list, &nft_net->commit_list); +list_add_tail (&tail->nft_trans.list, + &nft_net->commit_list);return false; }
@@ -484,7 +479,7 @@ static bool nft_trans_collapse_set_elem(struct nftables_pernet *nft_net, }static bool nft_trans_try_collapse (struct nftables_pernet *nft_net, -struct nft_trans *trans,gfp_t gfp) +struct nft_trans *trans) {struct nft_trans *tail;
@@ -501,7 +496,7 @@ static bool nft_trans_try_collapse(struct nftables_pernet *nft_net,case NFT_MSG_DELSETELEM :return nft_trans_collapse_set_elem (nft_net,nft_trans_container_elem (tail), -nft_trans_container_elem (trans), gfp); +nft_trans_container_elem (trans)); }return false;
@@ -537,17 +532,14 @@ static void nft_trans_commit_list_add_tail(struct net *net, struct nft_trans *tr } } -static void nft_trans_commit_list_add_elem (struct net *net,struct nft_trans *trans, -gfp_t gfp) +static void nft_trans_commit_list_add_elem (struct net *net,struct nft_trans *trans) {struct nftables_pernet *nft_net =nft_pernet (net);WARN_ON_ONCE (trans->msg_type !=NFT_MSG_NEWSETELEM && trans->msg_type !=NFT_MSG_DELSETELEM ); -might_alloc (gfp); - -if (nft_trans_try_collapse (nft_net, trans, gfp)) { +if (nft_trans_try_collapse (nft_net, trans)) {kfree (trans);return ; }
@@ -7573,7 +7565,7 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set, } ue->priv = elem_priv; -nft_trans_commit_list_add_elem (ctx->net, trans,GFP_KERNEL ); +nft_trans_commit_list_add_elem (ctx->net, trans); goto err_elem_free; } }
@@ -7597,7 +7589,7 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set, }nft_trans_container_elem (trans)->elems[0 ].priv = elem.priv; -nft_trans_commit_list_add_elem (ctx->net, trans,GFP_KERNEL ); +nft_trans_commit_list_add_elem (ctx->net, trans);return 0 ; err_set_full:
@@ -7863,7 +7855,7 @@ static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,nft_setelem_data_deactivate (ctx->net, set, elem.priv);nft_trans_container_elem (trans)->elems[0 ].priv = elem.priv; -nft_trans_commit_list_add_elem (ctx->net, trans,GFP_KERNEL ); +nft_trans_commit_list_add_elem (ctx->net, trans);return 0 ; fail_ops:
@@ -7888,9 +7880,8 @@ static int nft_setelem_flush(const struct nft_ctx *ctx,if (!nft_set_elem_active (ext, iter->genmask))return 0 ; - trans =nft_trans_alloc_gfp (ctx,NFT_MSG_DELSETELEM , - struct_size_t(struct nft_trans_elem, elems, 1), -GFP_ATOMIC ); + trans =nft_trans_alloc (ctx,NFT_MSG_DELSETELEM , + struct_size_t(struct nft_trans_elem, elems, 1));if (!trans)return -ENOMEM ;
@@ -7901,7 +7892,7 @@ static int nft_setelem_flush(const struct nft_ctx *ctx,nft_trans_elem_set (trans) = set;nft_trans_container_elem (trans)->nelems =1 ;nft_trans_container_elem (trans)->elems[0 ].priv = elem_priv; -nft_trans_commit_list_add_elem (ctx->net, trans,GFP_ATOMIC ); +nft_trans_commit_list_add_elem (ctx->net, trans);return 0 ; }
@@ -7918,7 +7909,7 @@ static int __nft_set_catchall_flush(const struct nft_ctx *ctx,nft_setelem_data_deactivate (ctx->net, set, elem_priv);nft_trans_container_elem (trans)->elems[0 ].priv = elem_priv; -nft_trans_commit_list_add_elem (ctx->net, trans,GFP_KERNEL ); +nft_trans_commit_list_add_elem (ctx->net, trans);return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 418/849 drm/msm/dsi/phy: Toggle back buffer resync after preparing PLL
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit b63f008f395ca5f6bc89123db97440bdc19981c4 ]
According to Hardware Programming Guide for DSI PHY, the retime buffer resync should be done after PLL clock users (byte_clk and intf_byte_clk) are enabled. Downstream also does it as part of configuring the PLL.
Driver was only turning off the resync FIFO buffer, but never bringing it on again.
Patchwork: https://patchwork.freedesktop.org/patch/657823/
--- drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c +4 -0
@@ -491,6 +491,10 @@ static int dsi_pll_7nm_vco_prepare(struct clk_hw *hw)if (pll_7nm->slave)dsi_pll_enable_global_clk (pll_7nm->slave); +writel (0x1 , pll_7nm->phy->base + REG_DSI_7nm_PHY_CMN_RBUF_CTRL); +if (pll_7nm->slave) +writel (0x1 , pll_7nm->slave->phy->base + REG_DSI_7nm_PHY_CMN_RBUF_CTRL); + error:return rc; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 419/849 drm/msm/dsi/phy_7nm: Fix missing initial VCO rate
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 5ddcb0cb9d10e6e70a68e0cb8f0b8e3a7eb8ccaf ]
Driver unconditionally saves current state on first init in dsi_pll_7nm_init(), but does not save the VCO rate, only some of the divider registers. The state is then restored during probe/enable via msm_dsi_phy_enable() -> msm_dsi_phy_pll_restore_state() -> dsi_7nm_pll_restore_state().
Restoring calls dsi_pll_7nm_vco_set_rate() with pll_7nm->vco_current_rate=0, which basically overwrites existing rate of VCO and messes with clock hierarchy, by setting frequency to 0 to clock tree. This makes anyway little sense - VCO rate was not saved, so should not be restored.
If PLL was not configured configure it to minimum rate to avoid glitches and configuring entire in clock hierarchy to 0 Hz.
Patchwork: https://patchwork.freedesktop.org/patch/657827/
--- drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c +6 -0
@@ -843,6 +843,12 @@ static int dsi_pll_7nm_init(struct msm_dsi_phy *phy)/* TODO: Remove this when we have proper display handover support */ msm_dsi_phy_pll_save_state (phy); +/* +* Store also proper vco_current_rate, because its value will be used in +* dsi_7nm_pll_restore_state(). +*/ +if (!dsi_pll_7nm_vco_recalc_rate (&pll_7nm->clk_hw,VCO_REF_CLK_RATE )) + pll_7nm->vco_current_rate = pll_7nm->phy->cfg->min_pll_rate;return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 420/849 drm/amdgpu: Allow kfd CRIU with no buffer objects
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Francis <[email protected]>
[ Upstream commit 85705b18ae7674347f8675f64b2b3115fb1d5629 ]
The kfd CRIU checkpoint ioctl would return an error if trying to checkpoint a process with no kfd buffer objects.
This is a normal case and should not be an error.
--- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +2 -2
@@ -2571,8 +2571,8 @@ static int criu_restore(struct file *filep,pr_debug ("CRIU restore (num_devices:%u num_bos:%u num_objects:%u priv_data_size:%llu)\n" , args->num_devices, args->num_bos, args->num_objects, args->priv_data_size); -if (!args->bos || !args->devices || !args->priv_data || !args->priv_data_size || - !args->num_devices || !args->num_bos) +if ((args->num_bos >0 && !args->bos) || !args->devices || !args->priv_data || + !args->priv_data_size || !args->num_devices)return -EINVAL ;mutex_lock (&p->mutex);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 421/849 drm/xe/guc: Increase GuC crash dump buffer size
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhanjun Dong <[email protected]>
[ Upstream commit ad83b1da5b786ee2d245e41ce55cb1c71fed7c22 ]
There are platforms already have a maximum dump size of 12KB, to avoid data truncating, increase GuC crash dump buffer size to 16KB.
--- drivers/gpu/drm/xe/xe_guc_log.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_guc_log.h +1 -1
@@ -17,7 +17,7 @@ struct xe_device;#define DEBUG_BUFFER_SIZE SZ_8M#define CAPTURE_BUFFER_SIZE SZ_2M#else -#define CRASH_BUFFER_SIZE SZ_8K +#define CRASH_BUFFER_SIZE SZ_16K#define DEBUG_BUFFER_SIZE SZ_64K#define CAPTURE_BUFFER_SIZE SZ_1M#endif
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 422/849 drm/amd/pm: Increase SMC timeout on SI and warn (v3)
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timur Kristóf <[email protected]>
[ Upstream commit 813d13524a3bdcc5f0253e06542440ca74c2653a ]
The SMC can take an excessive amount of time to process some messages under some conditions.
Background:
Sending a message to the SMC works by writing the message into the mmSMC_MESSAGE_0 register and its optional parameter into the mmSMC_SCRATCH0, and then polling mmSMC_RESP_0. Previously the timeout was AMDGPU_MAX_USEC_TIMEOUT, ie. 100 ms.
Increase the timeout to 200 ms for all messages and to 1 sec for a few messages which I've observed to be especially slow:PPSMC_MSG_NoForcedLevelPPSMC_MSG_SetEnabledLevelsPPSMC_MSG_SetForcedLevelsPPSMC_MSG_DisableULVPPSMC_MSG_SwitchToSwState
This fixes the following problems on Tahiti when switching from a lower clock power state to a higher clock state, such as when DC turns on a display which was previously turned off.
* si_restrict_performance_levels_before_switch would fail (if the user previously forced high clocks using sysfs)
* si_set_sw_state would fail (always)
It turns out that both of those failures were SMC timeouts and that the SMC actually didn't fail or hang, just needs more time to process those.
Add a warning when there is an SMC timeout to make it easier to identify this type of problem in the future.
--- drivers/gpu/drm/amd/pm/legacy-dpm/si_smc.c | 26 ++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/pm/legacy-dpm/si_smc.c +24 -2
@@ -172,20 +172,42 @@ PPSMC_Result amdgpu_si_send_msg_to_smc(struct amdgpu_device *adev, {u32 tmp;int i; +int usec_timeout; + +/* SMC seems to process some messages exceptionally slowly. */ +switch (msg) { +case PPSMC_MSG_NoForcedLevel: +case PPSMC_MSG_SetEnabledLevels: +case PPSMC_MSG_SetForcedLevels: +case PPSMC_MSG_DisableULV: +case PPSMC_MSG_SwitchToSwState: + usec_timeout =1000000 ;/* 1 sec */ +break ; +default : + usec_timeout =200000 ;/* 200 ms */ +break ; + }if (!amdgpu_si_is_smc_running (adev))return PPSMC_Result_Failed;WREG32 (mmSMC_MESSAGE_0, msg); -for (i =0 ; i < adev->usec_timeout; i++) { +for (i =0 ; i < usec_timeout; i++) { tmp =RREG32 (mmSMC_RESP_0);if (tmp !=0 )break ;udelay (1 ); } -return (PPSMC_Result )RREG32 (mmSMC_RESP_0); + tmp =RREG32 (mmSMC_RESP_0); +if (tmp ==0 ) { +drm_warn (adev_to_drm (adev), +"%s timeout on message: %x (SMC_SCRATCH0: %x)\n" , + __func__, msg,RREG32 (mmSMC_SCRATCH0)); + } + +return (PPSMC_Result )tmp; }PPSMC_Result amdgpu_si_wait_for_smc_inactive (struct amdgpu_device *adev)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 423/849 move_mount(2): take sanity checks in beneath case into do_lock_mount()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
[ Upstream commit d29da1a8f119130e6fc7d5d71029d402dabe2cb0 ]
We want to mount beneath the given location. For that operation to make sense, location must be the root of some mount that has something under it. Currently we let it proceed if those requirements are not met, with rather meaningless results, and have that bogosity caught further down the road; let's fail early instead - do_lock_mount() doesn't make sense unless those conditions hold, and checking them there makes things simpler.
--- fs/namespace.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
fs/namespace.c +7 -8
@@ -2785,12 +2785,19 @@ static int do_lock_mount(struct path *path, struct pinned_mountpoint *pinned, bostruct path under = {};int err = -ENOENT ; +if (unlikely (beneath) && !path_mounted (path)) +return -EINVAL ; +for (;;) {struct mount *m =real_mount (mnt);if (beneath) {path_put (&under);read_seqlock_excl (&mount_lock); +if (unlikely (!mnt_has_parent (m))) { +read_sequnlock_excl (&mount_lock); +return -EINVAL ; + } under.mnt =mntget (&m->mnt_parent->mnt); under.dentry =dget (m->mnt_mountpoint);read_sequnlock_excl (&mount_lock);
@@ -3462,8 +3469,6 @@ static bool mount_is_ancestor(const struct mount *p1, const struct mount *p2)* @to: mount under which to mount * @mp: mountpoint of @to * -* - Make sure that @to->dentry is actually the root of a mount under -* which we can mount another mount. * - Make sure that nothing can be mounted beneath the caller's current * root or the rootfs of the namespace. * - Make sure that the caller can unmount the topmost mount ensuring
@@ -3485,12 +3490,6 @@ static int can_move_mount_beneath(const struct path *from, *mnt_to =real_mount (to->mnt), *parent_mnt_to = mnt_to->mnt_parent; -if (!mnt_has_parent (mnt_to)) -return -EINVAL ; - -if (!path_mounted (to)) -return -EINVAL ; -if (IS_MNT_LOCKED (mnt_to))return -EINVAL ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 424/849 selftests: drv-net: rss_ctx: make the test pass with few queues
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit e2cf2d5baa09248d3d50b73522594b778388e3bc ]
rss_ctx.test_rss_key_indir implicitly expects at least 5 queues, as it checks that the traffic on first 2 queues is lower than the remaining queues when we use all queues. Special case fewer queues.
--- tools/testing/selftests/drivers/net/hw/rss_ctx.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
tools/testing/selftests/drivers/net/hw/rss_ctx.py +7 -2
@@ -178,8 +178,13 @@ def test_rss_key_indir(cfg): cnts = _get_rx_cnts(cfg) GenerateTraffic(cfg).wait_pkts_and_stop(20000) cnts = _get_rx_cnts(cfg, prev=cnts) - # First two queues get less traffic than all the rest - ksft_lt(sum(cnts[:2]), sum(cnts[2:]), "traffic distributed: " + str(cnts)) + if qcnt > 4: + # First two queues get less traffic than all the rest + ksft_lt(sum(cnts[:2]), sum(cnts[2:]), + "traffic distributed: " + str(cnts)) + else: + # When queue count is low make sure third queue got significant pkts + ksft_ge(cnts[2], 3500, "traffic distributed: " + str(cnts)) def test_rss_queue_reconfigure(cfg, main_ctx=True):
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 425/849 ipv6: Add sanity checks on ipv6_devconf.rpl_seg_enabled
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yue Haibing <[email protected]>
[ Upstream commit 3d95261eeb74958cd496e1875684827dc5d028cc ]
In ipv6_rpl_srh_rcv() we use min(net->ipv6.devconf_all->rpl_seg_enabled, idev->cnf.rpl_seg_enabled) is intended to return 0 when either value is zero, but if one of the values is negative it will in fact return non-zero.
--- net/ipv6/addrconf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/ipv6/addrconf.c +3 -1
@@ -7238,7 +7238,9 @@ static const struct ctl_table addrconf_sysctl[] = { .data = &ipv6_devconf.rpl_seg_enabled, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, }, { .procname = "ioam6_enabled",
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 426/849 drm/xe: Extend Wa_22021007897 to Xe3 platforms
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tangudu Tilak Tirumalesh <[email protected]>
[ Upstream commit 8d6f16f1f082881aa50ea7ae537b604dec647ed6 ]
WA 22021007897 should also be applied to Graphics Versions 30.00, 30.01 and 30.03. To make it simple, simply use the range [3000, 3003] that should be ok as there isn't a 3002 and if it's added, the WA list would need to be revisited anyway.
--- drivers/gpu/drm/xe/xe_wa.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/xe/xe_wa.c +4 -0
@@ -879,6 +879,10 @@ static const struct xe_rtp_entry_sr lrc_was[] = {DIS_PARTIAL_AUTOSTRIP | DIS_AUTOSTRIP)) }, + { XE_RTP_NAME("22021007897"), +XE_RTP_RULES (GRAPHICS_VERSION_RANGE (3000 ,3003 ),ENGINE_CLASS (RENDER )), +XE_RTP_ACTIONS (SET (COMMON_SLICE_CHICKEN4 ,SBE_PUSH_CONSTANT_BEHIND_FIX_ENABLE )) + }, }; static __maybe_unused const struct xe_rtp_entry oob_was[] = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 427/849 wifi: mac80211: count reg connection element in the size
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miri Korenblit <[email protected]>
[ Upstream commit 1373f94148a5adac2f42c8ba9771105624fe4af0 ]
We currently don't count the reg connection length in the per-link capability length. Fix it.
--- net/mac80211/mlme.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/mac80211/mlme.c +4 -1
@@ -2112,8 +2112,11 @@ ieee80211_link_common_elems_size(struct ieee80211_sub_if_data *sdata,sizeof (struct ieee80211_he_mcs_nss_supp ) +IEEE80211_HE_PPE_THRES_MAX_LEN ; -if (sband->band ==NL80211_BAND_6GHZ ) +if (sband->band ==NL80211_BAND_6GHZ ) { size +=2 +1 +sizeof (struct ieee80211_he_6ghz_capa ); +/* reg connection */ + size +=4 ; + } size +=2 +1 +sizeof (struct ieee80211_eht_cap_elem ) + sizeof(struct ieee80211_eht_mcs_nss_supp) +
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 428/849 drm/panthor: check bo offset alignment in vm bind
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chia-I Wu <[email protected]>
[ Upstream commit 5afa9d2a9bb1410f816e0123846047288b16e4b9 ]
Fail early from panthor_vm_bind_prepare_op_ctx instead of late from ops->map_pages.
--- drivers/gpu/drm/panthor/panthor_mmu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/panthor/panthor_mmu.c +2 -2
@@ -1198,7 +1198,7 @@ static int panthor_vm_prepare_map_op_ctx(struct panthor_vm_op_ctx *op_ctx, (flags & DRM_PANTHOR_VM_BIND_OP_TYPE_MASK) != DRM_PANTHOR_VM_BIND_OP_TYPE_MAP)return -EINVAL ; -/* Make sure the VA and size are aligned and in-bounds. */ +/* Make sure the VA and size are in-bounds. */ if (size > bo->base.base.size || offset > bo->base.base.size - size)return -EINVAL ;
@@ -2415,7 +2415,7 @@ panthor_vm_bind_prepare_op_ctx(struct drm_file *file,int ret;/* Aligned on page size. */ -if (!IS_ALIGNED (op->va | op->size, vm_pgsz)) +if (!IS_ALIGNED (op->va | op->size | op->bo_offset, vm_pgsz))return -EINVAL ;switch (op->flags &DRM_PANTHOR_VM_BIND_OP_TYPE_MASK ) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 429/849 drm: panel-backlight-quirks: Make EDID match optional
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antheas Kapenekakis <[email protected]>
[ Upstream commit 9931e4be11f2129a20ffd908bc364598a63016f8 ]
Currently, having a valid panel_id match is required to use the quirk system. For certain devices, we know that all SKUs need a certain quirk. Therefore, allow not specifying ident by only checking for a match if panel_id is non-zero.
--- drivers/gpu/drm/drm_panel_backlight_quirks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panel_backlight_quirks.c +1 -1
@@ -50,7 +50,7 @@ static bool drm_panel_min_backlight_quirk_matches(const struct drm_panel_min_bacif (!dmi_match (quirk->dmi_match.field, quirk->dmi_match.value))return false; -if (!drm_edid_match (edid, &quirk->ident)) +if (quirk->ident.panel_id && !drm_edid_match (edid, &quirk->ident))return false;return true;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 430/849 ixgbe: reduce number of reads when getting OROM data
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jedrzej Jagielski <[email protected]>
[ Upstream commit 08a1af326a80b88324acd73877db81ae927b1219 ]
Currently, during locating the CIVD section, the ixgbe driver loops over the OROM area and at each iteration reads only OROM-datastruct-size amount of data. This results in many small reads and is inefficient.
Optimize this by reading the entire OROM bank into memory once before entering the loop. This significantly reduces the probing time.
Without this patch probing time may exceed over 25s, whereas with this patch applied average time of probe is not greater than 5s.
without the patch:
[14:12:22] ixgbe: Copyright (c) 1999-2016 Intel Corporation.
[14:12:25] ixgbe 0000:21:00.0: Multiqueue Enabled: Rx Queue count = 63, Tx Queue count = 63 XDP Queue count = 0 [14:12:25] ixgbe 0000:21:00.0: 63.012 Gb/s available PCIe bandwidth (16.0 GT/s PCIe x4 link) [14:12:26] ixgbe 0000:21:00.0: MAC: 7, PHY: 27, PBA No: N55484-001
[14:12:26] ixgbe 0000:21:00.0: 20:3a:43:09:3a:12
[14:12:26] ixgbe 0000:21:00.0: Intel(R) 10 Gigabit Network Connection
[14:12:50] ixgbe 0000:21:00.0 ens2f0np0: renamed from eth0
with the patch:
[14:18:18] ixgbe: Copyright (c) 1999-2016 Intel Corporation.
[14:18:19] ixgbe 0000:21:00.0: Multiqueue Enabled: Rx Queue count = 63, Tx Queue count = 63 XDP Queue count = 0 [14:18:19] ixgbe 0000:21:00.0: 63.012 Gb/s available PCIe bandwidth (16.0 GT/s PCIe x4 link) [14:18:19] ixgbe 0000:21:00.0: MAC: 7, PHY: 27, PBA No: N55484-001
[14:18:19] ixgbe 0000:21:00.0: 20:3a:43:09:3a:12
[14:18:19] ixgbe 0000:21:00.0: Intel(R) 10 Gigabit Network Connection
[14:18:22] ixgbe 0000:21:00.0 ens2f0np0: renamed from eth0
--- drivers/net/ethernet/intel/ixgbe/ixgbe_e610.c | 59 +++++++++++++------ 1 file changed, 40 insertions(+), 19 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_e610.c +40 -19
@@ -3008,50 +3008,71 @@ static int ixgbe_get_nvm_srev(struct ixgbe_hw *hw,* Searches through the Option ROM flash contents to locate the CIVD data for * the image. * -* Return: the exit code of the operation. +* Return: -ENOMEM when cannot allocate memory, -EDOM for checksum violation, +* -ENODATA when cannot find proper data, -EIO for faulty read or +* 0 on success. +* +* On success @civd stores collected data. */ static int ixgbe_get_orom_civd_data (struct ixgbe_hw *hw,enum ixgbe_bank_select bank,struct ixgbe_orom_civd_info *civd) { -struct ixgbe_orom_civd_info tmp; +u32 orom_size = hw->flash.banks.orom_size; +u8 *orom_data;u32 offset;int err; + orom_data =kzalloc (orom_size,GFP_KERNEL ); +if (!orom_data) +return -ENOMEM ; + + err =ixgbe_read_flash_module (hw, bank, +IXGBE_E610_SR_1ST_OROM_BANK_PTR ,0 , + orom_data, orom_size); +if (err) { + err = -EIO ; + goto cleanup; + } +/* The CIVD section is located in the Option ROM aligned to 512 bytes. * The first 4 bytes must contain the ASCII characters "$CIV". * A simple modulo 256 sum of all of the bytes of the structure must * equal 0. */ -for (offset =0 ; (offset +SZ_512 ) <= hw->flash.banks.orom_size; - offset +=SZ_512 ) { +for (offset =0 ; offset +SZ_512 <= orom_size; offset +=SZ_512 ) { +struct ixgbe_orom_civd_info *tmp;u8 sum =0 ;u32 i; - err =ixgbe_read_flash_module (hw, bank, -IXGBE_E610_SR_1ST_OROM_BANK_PTR , - offset, - (u8 *)&tmp,sizeof (tmp)); -if (err) -return err; +BUILD_BUG_ON (sizeof (*tmp) >SZ_512 ); + + tmp = (struct ixgbe_orom_civd_info *)&orom_data[offset];/* Skip forward until we find a matching signature */ -if (memcmp (IXGBE_OROM_CIV_SIGNATURE , tmp.signature, -sizeof (tmp.signature))) +if (memcmp (IXGBE_OROM_CIV_SIGNATURE , tmp->signature, +sizeof (tmp->signature)))continue ;/* Verify that the simple checksum is zero */ -for (i =0 ; i <sizeof (tmp); i++) - sum += ((u8 *)&tmp)[i]; +for (i =0 ; i <sizeof (*tmp); i++) + sum += ((u8 *)tmp)[i]; + +if (sum) { + err = -EDOM ; + goto cleanup; + } -if (sum) -return -EDOM ; + *civd = *tmp; + err =0 ; - *civd = tmp; -return 0 ; + goto cleanup; } -return -ENODATA ; + err = -ENODATA ; +cleanup: +kfree (orom_data); +return err; }/**
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 431/849 netlink: specs: fou: change local-v6/peer-v6 check
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Asbjørn Sloth Tønnesen <[email protected]>
[ Upstream commit 9f9581ba74a931843c6d807ecfeaff9fb8c1b731 ]
While updating the binary min-len implementation, I noticed that the only user, should AFAICT be using exact-len instead.
In net/ipv4/fou_core.c FOU_ATTR_LOCAL_V6 and FOU_ATTR_PEER_V6 are only used for singular IPv6 addresses, and there are AFAICT no known implementations trying to send more, it therefore appears safe to change it to an exact-len policy.
This patch therefore changes the local-v6/peer-v6 attributes to use an exact-len check, instead of a min-len check.
--- Documentation/netlink/specs/fou.yaml | 4 ++-- net/ipv4/fou_nl.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
Documentation/netlink/specs/fou.yaml +2 -2
@@ -52,7 +52,7 @@ attribute-sets: name: local-v6 type: binary checks: - min-len: 16 + exact-len: 16 - name: peer-v4 type: u32
@@ -60,7 +60,7 @@ attribute-sets: name: peer-v6 type: binary checks: - min-len: 16 + exact-len: 16 - name: peer-port type: u16
net/ipv4/fou_nl.c +2 -2
@@ -18,9 +18,9 @@ const struct nla_policy fou_nl_policy[FOU_ATTR_IFINDEX + 1] = { [FOU_ATTR_TYPE] = { .type = NLA_U8, }, [FOU_ATTR_REMCSUM_NOPARTIAL] = { .type = NLA_FLAG, }, [FOU_ATTR_LOCAL_V4] = { .type = NLA_U32, }, - [FOU_ATTR_LOCAL_V6] = { .len = 16, }, + [FOU_ATTR_LOCAL_V6] = NLA_POLICY_EXACT_LEN(16), [FOU_ATTR_PEER_V4] = { .type = NLA_U32, }, - [FOU_ATTR_PEER_V6] = { .len = 16, }, + [FOU_ATTR_PEER_V6] = NLA_POLICY_EXACT_LEN(16), [FOU_ATTR_PEER_PORT] = { .type = NLA_BE16, }, [FOU_ATTR_IFINDEX] = { .type = NLA_S32, }, };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 432/849 net: nfc: nci: Increase NCI_DATA_TIMEOUT to 3000 ms
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juraj Šarinay <[email protected]>
[ Upstream commit 21f82062d0f241e55dd59eb630e8710862cc90b4 ]
An exchange with a NFC target must complete within NCI_DATA_TIMEOUT. A delay of 700 ms is not sufficient for cryptographic operations on smart cards. CardOS 6.0 may need up to 1.3 seconds to perform 256-bit ECDH or 3072-bit RSA. To prevent brute-force attacks, passports and similar documents introduce even longer delays into access control protocols (BAC/PACE).
The timeout should be higher, but not too much. The expiration allows us to detect that a NFC target has disappeared.
--- include/net/nfc/nci_core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/nfc/nci_core.h +1 -1
@@ -52,7 +52,7 @@ enum nci_state {#define NCI_RF_DISC_SELECT_TIMEOUT 5000#define NCI_RF_DEACTIVATE_TIMEOUT 30000#define NCI_CMD_TIMEOUT 5000 -#define NCI_DATA_TIMEOUT 700 +#define NCI_DATA_TIMEOUT 3000struct nci_dev ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 433/849 media: adv7180: Add missing lock in suspend callback
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Söderlund <[email protected]>
[ Upstream commit 878c496ac5080f94a93a9216a8f70cfd67ace8c9 ]
The adv7180_set_power() utilizes adv7180_write() which in turn requires the state mutex to be held, take it before calling adv7180_set_power() to avoid tripping a lockdep_assert_held().
--- drivers/media/i2c/adv7180.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/media/i2c/adv7180.c +6 -0
@@ -813,6 +813,8 @@ static int adv7180_set_pad_format(struct v4l2_subdev *sd,if (format->which ==V4L2_SUBDEV_FORMAT_ACTIVE ) {if (state->field != format->format.field) { +guard (mutex)(&state->mutex); + state->field = format->format.field;adv7180_set_power (state, false);adv7180_set_field_mode (state);
@@ -1549,6 +1551,8 @@ static int adv7180_suspend(struct device *dev)struct v4l2_subdev *sd =dev_get_drvdata (dev);struct adv7180_state *state =to_state (sd); +guard (mutex)(&state->mutex); +return adv7180_set_power (state, false); }
@@ -1562,6 +1566,8 @@ static int adv7180_resume(struct device *dev)if (ret <0 )return ret; +guard (mutex)(&state->mutex); + ret =adv7180_set_power (state, state->powered);if (ret)return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 434/849 media: adv7180: Do not write format to device in set_fmt
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Söderlund <[email protected]>
[ Upstream commit 46c1e7814d1c3310ef23c01ed1a582ef0c8ab1d2 ]
The .set_fmt callback should not write the new format directly do the device, it should only store it and have it applied by .s_stream.
The .s_stream callback already calls adv7180_set_field_mode() so it's safe to remove programming of the device and just store the format and have .s_stream apply it.
--- drivers/media/i2c/adv7180.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
drivers/media/i2c/adv7180.c +1 -8
@@ -812,14 +812,7 @@ static int adv7180_set_pad_format(struct v4l2_subdev *sd, ret =adv7180_mbus_fmt (sd, &format->format);if (format->which ==V4L2_SUBDEV_FORMAT_ACTIVE ) { -if (state->field != format->format.field) { -guard (mutex)(&state->mutex); - - state->field = format->format.field; -adv7180_set_power (state, false); -adv7180_set_field_mode (state); -adv7180_set_power (state, true); - } + state->field = format->format.field; }else { framefmt =v4l2_subdev_state_get_format (sd_state,0 ); *framefmt = format->format;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 435/849 media: adv7180: Only validate format in querystd
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Söderlund <[email protected]>
[ Upstream commit 91c5d7c849273d14bc4bae1b92666bdb5409294a ]
The .querystd callback should not program the device with the detected standard, it should only report the standard to user-space. User-space may then use .s_std to set the standard, if it wants to use it.
All that is required of .querystd is to setup the auto detection of standards and report its findings.
While at it add some documentation on why this can't happen while streaming and improve the error handling using a scoped guard.
--- drivers/media/i2c/adv7180.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-)
drivers/media/i2c/adv7180.c +16 -21
@@ -357,32 +357,27 @@ static inline struct adv7180_state *to_state(struct v4l2_subdev *sd)static int adv7180_querystd (struct v4l2_subdev *sd,v4l2_std_id *std) {struct adv7180_state *state =to_state (sd); -int err =mutex_lock_interruptible (&state->mutex); -if (err) -return err; - -if (state->streaming) { - err = -EBUSY ; - goto unlock; - } +int ret; - err =adv7180_set_video_standard (state, -ADV7180_STD_AD_PAL_BG_NTSC_J_SECAM ); -if (err) - goto unlock; +guard (mutex)(&state->mutex); -msleep (100 ); -__adv7180_status (state,NULL , std); +/* +* We can't sample the standard if the device is streaming as that would +* interfere with the capture session as the VID_SEL reg is touched. +*/ +if (state->streaming) +return -EBUSY ; - err =v4l2_std_to_adv7180 (state->curr_norm); -if (err <0 ) - goto unlock; +/* Set the standard to autodetect PAL B/G/H/I/D, NTSC J or SECAM */ + ret =adv7180_set_video_standard (state, +ADV7180_STD_AD_PAL_BG_NTSC_J_SECAM ); +if (ret) +return ret; - err =adv7180_set_video_standard (state, err); +/* Allow some time for the autodetection to run. */ +msleep (100 ); -unlock: -mutex_unlock (&state->mutex); -return err; +return __adv7180_status (state,NULL , std); } static int adv7180_s_routing(struct v4l2_subdev *sd, u32 input,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 436/849 media: verisilicon: Explicitly disable selection api ioctls for decoders
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Kocialkowski <[email protected]>
[ Upstream commit 73d50aa92f28ee8414fbfde011974fce970b82cc ]
Call the dedicated v4l2_disable_ioctl helper instead of manually checking whether the current context is an encoder for the selection api ioctls.
--- drivers/media/platform/verisilicon/hantro_drv.c | 2 ++ drivers/media/platform/verisilicon/hantro_v4l2.c | 6 ++---- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/media/platform/verisilicon/hantro_drv.c +2 -0
@@ -917,6 +917,8 @@ static int hantro_add_func(struct hantro_dev *vpu, unsigned int funcid) vpu->decoder = func;v4l2_disable_ioctl (vfd,VIDIOC_TRY_ENCODER_CMD );v4l2_disable_ioctl (vfd,VIDIOC_ENCODER_CMD ); +v4l2_disable_ioctl (vfd,VIDIOC_G_SELECTION ); +v4l2_disable_ioctl (vfd,VIDIOC_S_SELECTION ); }video_set_drvdata (vfd, vpu);
drivers/media/platform/verisilicon/hantro_v4l2.c +2 -4
@@ -663,8 +663,7 @@ static int vidioc_g_selection(struct file *file, void *priv,struct hantro_ctx *ctx =fh_to_ctx (priv);/* Crop only supported on source. */ -if (!ctx->is_encoder || - sel->type !=V4L2_BUF_TYPE_VIDEO_OUTPUT ) +if (sel->type !=V4L2_BUF_TYPE_VIDEO_OUTPUT )return -EINVAL ;switch (sel->target) {
@@ -696,8 +695,7 @@ static int vidioc_s_selection(struct file *file, void *priv,struct vb2_queue *vq;/* Crop only supported on source. */ -if (!ctx->is_encoder || - sel->type !=V4L2_BUF_TYPE_VIDEO_OUTPUT ) +if (sel->type !=V4L2_BUF_TYPE_VIDEO_OUTPUT )return -EINVAL ;/* Change not allowed if the queue is streaming. */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 437/849 wifi: mac80211: Fix 6 GHz Band capabilities element advertisement in lower bands
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ramya Gnanasekar <[email protected]>
[ Upstream commit e53f8b12a21c2974b66fa8c706090182da06fff3 ]
Currently, when adding the 6 GHz Band Capabilities element, the channel list of the wiphy is checked to determine if 6 GHz is supported for a given virtual interface. However, in a multi-radio wiphy (e.g., one that has both lower bands and 6 GHz combined), the wiphy advertises support for all bands. As a result, the 6 GHz Band Capabilities element is incorrectly included in mesh beacon and station's association request frames of interfaces operating in lower bands, without verifying whether the interface is actually operating in a 6 GHz channel.
Fix this by verifying if the interface operates on 6 GHz channel before adding the element. Note that this check cannot be placed directly in ieee80211_put_he_6ghz_cap() as the same function is used to add probe request elements while initiating scan in which case the interface may not be operating in any band's channel.
--- net/mac80211/mesh.c | 3 +++ net/mac80211/mlme.c | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-)
net/mac80211/mesh.c +3 -0
@@ -624,6 +624,9 @@ int mesh_add_he_6ghz_cap_ie(struct ieee80211_sub_if_data *sdata,if (!sband)return -EINVAL ; +if (sband->band !=NL80211_BAND_6GHZ ) +return 0 ; + iftd =ieee80211_get_sband_iftype_data (sband,NL80211_IFTYPE_MESH_POINT );/* The device doesn't support HE in mesh mode or at all */
net/mac80211/mlme.c +2 -1
@@ -1850,7 +1850,8 @@ ieee80211_add_link_elems(struct ieee80211_sub_if_data *sdata,ieee80211_put_he_cap (skb, sdata, sband, &assoc_data->link[link_id].conn);ADD_PRESENT_EXT_ELEM (WLAN_EID_EXT_HE_CAPABILITY ); -ieee80211_put_he_6ghz_cap (skb, sdata, smps_mode); +if (sband->band ==NL80211_BAND_6GHZ ) +ieee80211_put_he_6ghz_cap (skb, sdata, smps_mode); }/*
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 438/849 platform/x86: think-lmi: Add extra TC BIOS error messages
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Pearson <[email protected]>
[ Upstream commit a0d6959c345d89d811288a718e3f6b145dcadc8c ]
Add extra error messages that are used by ThinkCenter platforms.
--- drivers/platform/x86/lenovo/think-lmi.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/platform/x86/lenovo/think-lmi.c +11 -0
@@ -179,10 +179,21 @@ MODULE_PARM_DESC(debug_support, "Enable debug command support");static const struct tlmi_err_codes tlmi_errs[] = { {"Success" ,0 }, + {"Set Certificate operation was successful." ,0 }, {"Not Supported" , -EOPNOTSUPP }, {"Invalid Parameter" , -EINVAL }, {"Access Denied" , -EACCES }, {"System Busy" , -EBUSY }, + {"Set Certificate operation failed with status:Invalid Parameter." , -EINVAL }, + {"Set Certificate operation failed with status:Invalid certificate type." , -EINVAL }, + {"Set Certificate operation failed with status:Invalid password format." , -EINVAL }, + {"Set Certificate operation failed with status:Password retry count exceeded." , -EACCES }, + {"Set Certificate operation failed with status:Password Invalid." , -EACCES }, + {"Set Certificate operation failed with status:Operation aborted." , -EBUSY }, + {"Set Certificate operation failed with status:No free slots to write." , -ENOSPC }, + {"Set Certificate operation failed with status:Certificate not found." , -EEXIST }, + {"Set Certificate operation failed with status:Internal error." , -EFAULT }, + {"Set Certificate operation failed with status:Certificate too large." , -EFBIG }, };static const char *const encoding_options[] = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 439/849 platform/x86/intel-uncore-freq: Present unique domain ID per package
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Pandruvada <[email protected]>
[ Upstream commit a191224186ec16a4cb1775b2a647ea91f5c139e1 ]
In partitioned systems, the domain ID is unique in the partition and a package can have multiple partitions.
Some user-space tools, such as turbostat, assume the domain ID is unique per package. These tools map CPU power domains, which are unique to a package. However, this approach does not work in partitioned systems.
There is no architectural definition of "partition" to present to user space.
To support these tools, set the domain_id to be unique per package. For compute die IDs, uniqueness can be achieved using the platform info cdie_mask, mirroring the behavior observed in non-partitioned systems.
For IO dies, which lack a direct CPU relationship, any unique logical ID can be assigned. Here domain IDs for IO dies are configured after all compute domain IDs. During the probe, keep the index of the next IO domain ID after the last IO domain ID of the current partition. Since CPU packages are symmetric, partition information is same for all packages.
The Intel Speed Select driver has already implemented a similar change to make the domain ID unique, with compute dies listed first, followed by I/O dies.
--- .../uncore-frequency/uncore-frequency-tpmi.c | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-)
drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c +73 -1
@@ -374,6 +374,77 @@ static void uncore_set_agent_type(struct tpmi_uncore_cluster_info *cluster_info) cluster_info->uncore_data.agent_type_mask =FIELD_GET (UNCORE_AGENT_TYPES , status); } +#define MAX_PARTITIONS 2 + +/* IO domain ID start index for a partition */ +static u8 io_die_start[MAX_PARTITIONS ]; + +/* Next IO domain ID index after the current partition IO die IDs */ +static u8 io_die_index_next; + +/* Lock to protect io_die_start, io_die_index_next */ +static DEFINE_MUTEX (domain_lock); + +static void set_domain_id (int id,int num_resources, +struct oobmsm_plat_info *plat_info, +struct tpmi_uncore_cluster_info *cluster_info) +{ +u8 part_io_index, cdie_range, pkg_io_index, max_dies; + +if (plat_info->partition >=MAX_PARTITIONS ) { + cluster_info->uncore_data.domain_id = id; +return ; + } + +if (cluster_info->uncore_data.agent_type_mask &AGENT_TYPE_CORE ) { + cluster_info->uncore_data.domain_id = cluster_info->cdie_id; +return ; + } + +/* Unlikely but cdie_mask may have holes, so take range */ + cdie_range =fls (plat_info->cdie_mask) -ffs (plat_info->cdie_mask) +1 ; + max_dies =topology_max_dies_per_package (); + +/* +* If the CPU doesn't enumerate dies, then use current cdie range +* as the max. +*/ +if (cdie_range > max_dies) + max_dies = cdie_range; + +guard (mutex)(&domain_lock); + +if (!io_die_index_next) + io_die_index_next = max_dies; + +if (!io_die_start[plat_info->partition]) { + io_die_start[plat_info->partition] = io_die_index_next; +/* +* number of IO dies = num_resources - cdie_range. Hence +* next partition io_die_index_next is set after IO dies +* in the current partition. +*/ + io_die_index_next += (num_resources - cdie_range); + } + +/* +* Index from IO die start within the partition: +* This is the first valid domain after the cdies. +* For example the current resource index 5 and cdies end at +* index 3 (cdie_cnt = 4). Then the IO only index 5 - 4 = 1. +*/ + part_io_index = id - cdie_range; + +/* +* Add to the IO die start index for this partition in this package +* to make unique in the package. +*/ + pkg_io_index = io_die_start[plat_info->partition] + part_io_index; + +/* Assign this to domain ID */ + cluster_info->uncore_data.domain_id = pkg_io_index; +} +/* Callback for sysfs read for TPMI uncore values. Called under mutex locks. */ static int uncore_read (struct uncore_data *data,unsigned int *value,enum uncore_index index) {
@@ -610,11 +681,12 @@ static int uncore_probe(struct auxiliary_device *auxdev, const struct auxiliary_ cluster_info->uncore_data.package_id = pkg;/* There are no dies like Cascade Lake */ cluster_info->uncore_data.die_id =0 ; - cluster_info->uncore_data.domain_id = i; cluster_info->uncore_data.cluster_id = j;set_cdie_id (i, cluster_info, plat_info); +set_domain_id (i, num_resources, plat_info, cluster_info); + cluster_info->uncore_root = tpmi_uncore;if (TPMI_MINOR_VERSION (pd_info->ufs_header_ver) >=UNCORE_ELC_SUPPORTED_VERSION )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 440/849 ALSA: usb-audio: apply quirk for MOONDROP Quark2
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cryolitia PukNgae <[email protected]>
[ Upstream commit a73349c5dd27bc544b048e2e2c8ef6394f05b793 ]
It reports a MIN value -15360 for volume control, but will mute when setting it less than -14208
--- sound/usb/mixer.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/usb/mixer.c +7 -0
@@ -1191,6 +1191,13 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, cval->res =1 ; }break ; +case USB_ID (0x3302 ,0x12db ):/* MOONDROP Quark2 */ +if (!strcmp (kctl->id.name,"PCM Playback Volume" )) { +usb_audio_info (chip, +"set volume quirk for MOONDROP Quark2\n" ); + cval->min =-14208 ;/* Mute under it */ + } +break ; } }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 441/849 PCI: imx6: Enable the Vaux supply if available
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Zhu <[email protected]>
[ Upstream commit c221cbf8dc547eb8489152ac62ef103fede99545 ]
When the 3.3Vaux supply is present, fetch it at the probe time and keep it enabled for the entire PCIe controller lifecycle so that the link can enter L2 state and the devices can signal wakeup using either Beacon or WAKE# mechanisms.
--- drivers/pci/controller/dwc/pci-imx6.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/pci/controller/dwc/pci-imx6.c +4 -0
@@ -1745,6 +1745,10 @@ static int imx_pcie_probe(struct platform_device *pdev) pci->max_link_speed =1 ;of_property_read_u32 (node,"fsl,max-link-speed" , &pci->max_link_speed); + ret =devm_regulator_get_enable_optional (&pdev->dev,"vpcie3v3aux" ); +if (ret <0 && ret != -ENODEV ) +return dev_err_probe (dev, ret,"failed to enable Vaux supply\n" ); + imx_pcie->vpcie =devm_regulator_get_optional (&pdev->dev,"vpcie" );if (IS_ERR (imx_pcie->vpcie)) {if (PTR_ERR (imx_pcie->vpcie) != -ENODEV )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 442/849 drm/xe/guc: Set upper limit of H2G retries over CTB
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Wajdeczko <[email protected]>
[ Upstream commit 2506af5f8109a387a5e8e9e3d7c498480b8033db ]
The GuC communication protocol allows GuC to send NO_RESPONSE_RETRY reply message to indicate that due to some interim condition it can not handle incoming H2G request and the host shall resend it.
But in some cases, due to errors, this unsatisfied condition might be final and this could lead to endless retries as it was recently seen on the CI:
[drm] GT0: PF: VF1 FLR didn't finish in 5000 ms (-ETIMEDOUT) [drm] GT0: PF: VF1 resource sanitizing failed (-ETIMEDOUT) [drm] GT0: PF: VF1 FLR failed!
[drm:guc_ct_send_recv [xe]] GT0: H2G action 0x5503 retrying: reason 0x0 [drm:guc_ct_send_recv [xe]] GT0: H2G action 0x5503 retrying: reason 0x0 [drm:guc_ct_send_recv [xe]] GT0: H2G action 0x5503 retrying: reason 0x0 [drm:guc_ct_send_recv [xe]] GT0: H2G action 0x5503 retrying: reason 0x0
To avoid such dangerous loops allow only limited number of retries (for now 50) and add some delays (n * 5ms) to slow down the rate of resending this repeated request.
--- drivers/gpu/drm/xe/xe_guc_ct.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/gpu/drm/xe/xe_guc_ct.c +10 -0
@@ -1079,11 +1079,15 @@ static bool retry_failure(struct xe_guc_ct *ct, int ret)return true; } +#define GUC_SEND_RETRY_LIMIT 50 +#define GUC_SEND_RETRY_MSLEEP 5 +static int guc_ct_send_recv (struct xe_guc_ct *ct,const u32 *action,u32 len,u32 *response_buffer,bool no_fail) {struct xe_gt *gt =ct_to_gt (ct);struct g2h_fence g2h_fence; +unsigned int retries =0 ;int ret =0 ;/*
@@ -1148,6 +1152,12 @@ static int guc_ct_send_recv(struct xe_guc_ct *ct, const u32 *action, u32 len,xe_gt_dbg (gt,"H2G action %#x retrying: reason %#x\n" , action[0 ], g2h_fence.reason);mutex_unlock (&ct->lock); +if (++retries >GUC_SEND_RETRY_LIMIT ) { +xe_gt_err (gt,"H2G action %#x reached retry limit=%u, aborting\n" , + action[0 ],GUC_SEND_RETRY_LIMIT ); +return -ELOOP ; + } +msleep (GUC_SEND_RETRY_MSLEEP * retries); goto retry; }if (g2h_fence.fail) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 443/849 net: call cond_resched() less often in __release_sock()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 16c610162d1f1c332209de1c91ffb09b659bb65d ]
While stress testing TCP I had unexpected retransmits and sack packets when a single cpu receives data from multiple high-throughput flows.
super_netperf 4 -H srv -T,10 -l 3000 &
Tcpdump extract:
00:00:00.000007 IP6 clnt > srv: Flags [.], seq 26062848:26124288, ack 1, win 66, options [nop,nop,TS val 651460834 ecr 3100749131], length 61440 00:00:00.000006 IP6 clnt > srv: Flags [.], seq 26124288:26185728, ack 1, win 66, options [nop,nop,TS val 651460834 ecr 3100749131], length 61440 00:00:00.000005 IP6 clnt > srv: Flags [P.], seq 26185728:26243072, ack 1, win 66, options [nop,nop,TS val 651460834 ecr 3100749131], length 57344 00:00:00.000006 IP6 clnt > srv: Flags [.], seq 26243072:26304512, ack 1, win 66, options [nop,nop,TS val 651460844 ecr 3100749141], length 61440 00:00:00.000005 IP6 clnt > srv: Flags [.], seq 26304512:26365952, ack 1, win 66, options [nop,nop,TS val 651460844 ecr 3100749141], length 61440 00:00:00.000007 IP6 clnt > srv: Flags [P.], seq 26365952:26423296, ack 1, win 66, options [nop,nop,TS val 651460844 ecr 3100749141], length 57344 00:00:00.000006 IP6 clnt > srv: Flags [.], seq 26423296:26484736, ack 1, win 66, options [nop,nop,TS val 651460853 ecr 3100749150], length 61440 00:00:00.000005 IP6 clnt > srv: Flags [.], seq 26484736:26546176, ack 1, win 66, options [nop,nop,TS val 651460853 ecr 3100749150], length 61440 00:00:00.000005 IP6 clnt > srv: Flags [P.], seq 26546176:26603520, ack 1, win 66, options [nop,nop,TS val 651460853 ecr 3100749150], length 57344 00:00:00.003932 IP6 clnt > srv: Flags [P.], seq 26603520:26619904, ack 1, win 66, options [nop,nop,TS val 651464844 ecr 3100753141], length 16384 00:00:00.006602 IP6 clnt > srv: Flags [.], seq 24862720:24866816, ack 1, win 66, options [nop,nop,TS val 651471419 ecr 3100759716], length 4096 00:00:00.013000 IP6 clnt > srv: Flags [.], seq 24862720:24866816, ack 1, win 66, options [nop,nop,TS val 651484421 ecr 3100772718], length 4096 00:00:00.000416 IP6 srv > clnt: Flags [.], ack 26619904, win 1393, options [nop,nop,TS val 3100773185 ecr 651484421,nop,nop,sack 1 {24862720:24866816}], length 0
After analysis, it appears this is because of the cond_resched() call from __release_sock().
When current thread is yielding, while still holding the TCP socket lock, it might regain the cpu after a very long time.
Other peer TLP/RTO is firing (multiple times) and packets are retransmit, while the initial copy is waiting in the socket backlog or receive queue.
In this patch, I call cond_resched() only once every 16 packets.
Modern TCP stack now spends less time per packet in the backlog, especially because ACK are no longer sent (commit 133c4c0d3717 "tcp: defer regular ACK while processing socket backlog")
Before:
clnt:/# nstat -n;sleep 10;nstat|egrep "TcpOutSegs|TcpRetransSegs|TCPFastRetrans|TCPTimeouts|Probes|TCPSpuriousRTOs|DSACK" TcpOutSegs 19046186 0.0 TcpRetransSegs 1471 0.0 TcpExtTCPTimeouts 1397 0.0 TcpExtTCPLossProbes 1356 0.0 TcpExtTCPDSACKRecv 1352 0.0 TcpExtTCPSpuriousRTOs 114 0.0 TcpExtTCPDSACKRecvSegs 1352 0.0
After:
clnt:/# nstat -n;sleep 10;nstat|egrep "TcpOutSegs|TcpRetransSegs|TCPFastRetrans|TCPTimeouts|Probes|TCPSpuriousRTOs|DSACK" TcpOutSegs 19218936 0.0
--- net/core/sock.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
net/core/sock.c +8 -4
@@ -3162,23 +3162,27 @@ void __release_sock(struct sock *sk) __acquires(&sk->sk_lock.slock) {struct sk_buff *skb, *next; +int nb =0 ;while ((skb = sk->sk_backlog.head) !=NULL ) { sk->sk_backlog.head = sk->sk_backlog.tail =NULL ;spin_unlock_bh (&sk->sk_lock.slock); -do { +while (1 ) { next = skb->next;prefetch (next);DEBUG_NET_WARN_ON_ONCE (skb_dst_is_noref (skb));skb_mark_not_on_list (skb);sk_backlog_rcv (sk, skb); -cond_resched (); - skb = next; - }while (skb !=NULL ); +if (!skb) +break ; + +if (!(++nb &15 )) +cond_resched (); + }spin_lock_bh (&sk->sk_lock.slock); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 444/849 smsc911x: add second read of EEPROM mac when possible corruption seen
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Foster <[email protected]>
[ Upstream commit 69777753a8919b0b8313c856e707e1d1fe5ced85 ]
When the EEPROM MAC is read by way of ADDRH, it can return all 0s the first time. Subsequent reads succeed.
This is fully reproduceable on the Phytec PCM049 SOM.
Re-read the ADDRH when this behaviour is observed, in an attempt to correctly apply the EEPROM MAC address.
--- drivers/net/ethernet/smsc/smsc911x.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/net/ethernet/smsc/smsc911x.c +12 -2
@@ -2162,10 +2162,20 @@ static const struct net_device_ops smsc911x_netdev_ops = {static void smsc911x_read_mac_address (struct net_device *dev) {struct smsc911x_data *pdata =netdev_priv (dev); -u32 mac_high16 =smsc911x_mac_read (pdata,ADDRH ); -u32 mac_low32 =smsc911x_mac_read (pdata,ADDRL ); +u32 mac_high16, mac_low32;u8 addr[ETH_ALEN ]; + mac_high16 =smsc911x_mac_read (pdata,ADDRH ); + mac_low32 =smsc911x_mac_read (pdata,ADDRL ); + +/* The first mac_read in some setups can incorrectly read 0. Re-read it +* to get the full MAC if this is observed. +*/ +if (mac_high16 ==0 ) { +SMSC_TRACE (pdata, probe,"Re-read MAC ADDRH\n" ); + mac_high16 =smsc911x_mac_read (pdata,ADDRH ); + } + addr[0 ] = (u8)(mac_low32); addr[1 ] = (u8)(mac_low32 >>8 ); addr[2 ] = (u8)(mac_low32 >>16 );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 445/849 drm/gpusvm: fix hmm_pfn_to_map_order() usage
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Auld <[email protected]>
[ Upstream commit c50729c68aaf93611c855752b00e49ce1fdd1558 ]
Handle the case where the hmm range partially covers a huge page (like 2M), otherwise we can potentially end up doing something nasty like mapping memory which is outside the range, and maybe not even mapped by the mm. Fix is based on the xe userptr code, which in a future patch will directly use gpusvm, so needs alignment here.
v2:
- Add kernel-doc (Matt B)
- s/fls/ilog2/ (Thomas)
--- drivers/gpu/drm/drm_gpusvm.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_gpusvm.c +31 -2
@@ -708,6 +708,35 @@ drm_gpusvm_range_alloc(struct drm_gpusvm *gpusvm,return range; } +/** +* drm_gpusvm_hmm_pfn_to_order() - Get the largest CPU mapping order. +* @hmm_pfn: The current hmm_pfn. +* @hmm_pfn_index: Index of the @hmm_pfn within the pfn array. +* @npages: Number of pages within the pfn array i.e the hmm range size. +* +* To allow skipping PFNs with the same flags (like when they belong to +* the same huge PTE) when looping over the pfn array, take a given a hmm_pfn, +* and return the largest order that will fit inside the CPU PTE, but also +* crucially accounting for the original hmm range boundaries. +* +* Return: The largest order that will safely fit within the size of the hmm_pfn +* CPU PTE. +*/ +static unsigned int drm_gpusvm_hmm_pfn_to_order (unsigned long hmm_pfn, +unsigned long hmm_pfn_index, +unsigned long npages) +{ +unsigned long size; + + size =1UL <<hmm_pfn_to_map_order (hmm_pfn); + size -= (hmm_pfn & ~HMM_PFN_FLAGS ) & (size -1 ); + hmm_pfn_index += size; +if (hmm_pfn_index > npages) + size -= (hmm_pfn_index - npages); + +return ilog2 (size); +} +/** * drm_gpusvm_check_pages() - Check pages * @gpusvm: Pointer to the GPU SVM structure
@@ -766,7 +795,7 @@ static bool drm_gpusvm_check_pages(struct drm_gpusvm *gpusvm, err = -EFAULT ; goto err_free; } - i +=0x1 <<hmm_pfn_to_map_order (pfns[i]); + i +=0x1 <<drm_gpusvm_hmm_pfn_to_order (pfns[i], i, npages); } err_free:
@@ -1342,7 +1371,7 @@ int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm,for (i =0 , j =0 ; i < npages; ++j) {struct page *page =hmm_pfn_to_page (pfns[i]); - order =hmm_pfn_to_map_order (pfns[i]); + order =drm_gpusvm_hmm_pfn_to_order (pfns[i], i, npages);if (is_device_private_page (page) ||is_device_coherent_page (page)) {if (zdd != page->zone_device_data && i >0 ) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 446/849 drm/xe: improve dma-resv handling for backup object
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Auld <[email protected]>
[ Upstream commit edb1745fc618ba8ef63a45ce3ae60de1bdf29231 ]
Since the dma-resv is shared we don't need to reserve and add a fence slot fence twice, plus no need to loop through the dependencies.
--- drivers/gpu/drm/xe/xe_bo.c | 13 +------------ drivers/gpu/drm/xe/xe_migrate.c | 2 +- 2 files changed, 2 insertions(+), 13 deletions(-)
drivers/gpu/drm/xe/xe_bo.c +1 -12
@@ -1242,14 +1242,11 @@ int xe_bo_evict_pinned(struct xe_bo *bo)else migrate =mem_type_to_migrate (xe, bo->ttm.resource->mem_type); +xe_assert (xe, bo->ttm.base.resv == backup->ttm.base.resv); ret =dma_resv_reserve_fences (bo->ttm.base.resv,1 );if (ret) goto out_backup; - ret =dma_resv_reserve_fences (backup->ttm.base.resv,1 ); -if (ret) - goto out_backup; - fence =xe_migrate_copy (migrate, bo, backup, bo->ttm.resource, backup->ttm.resource, false);if (IS_ERR (fence)) {
@@ -1259,8 +1256,6 @@ int xe_bo_evict_pinned(struct xe_bo *bo)dma_resv_add_fence (bo->ttm.base.resv, fence,DMA_RESV_USAGE_KERNEL ); -dma_resv_add_fence (backup->ttm.base.resv, fence, -DMA_RESV_USAGE_KERNEL );dma_fence_put (fence); }else { ret =xe_bo_vmap (backup);
@@ -1338,10 +1333,6 @@ int xe_bo_restore_pinned(struct xe_bo *bo)if (ret) goto out_unlock_bo; - ret =dma_resv_reserve_fences (backup->ttm.base.resv,1 ); -if (ret) - goto out_unlock_bo; - fence =xe_migrate_copy (migrate, backup, bo, backup->ttm.resource, bo->ttm.resource, false);
@@ -1352,8 +1343,6 @@ int xe_bo_restore_pinned(struct xe_bo *bo)dma_resv_add_fence (bo->ttm.base.resv, fence,DMA_RESV_USAGE_KERNEL ); -dma_resv_add_fence (backup->ttm.base.resv, fence, -DMA_RESV_USAGE_KERNEL );dma_fence_put (fence); }else { ret =xe_bo_vmap (backup);
drivers/gpu/drm/xe/xe_migrate.c +1 -1
@@ -901,7 +901,7 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,if (!fence) { err =xe_sched_job_add_deps (job, src_bo->ttm.base.resv,DMA_RESV_USAGE_BOOKKEEP ); -if (!err && src_bo != dst_bo) +if (!err && src_bo->ttm.base.resv != dst_bo->ttm.base.resv) err =xe_sched_job_add_deps (job, dst_bo->ttm.base.resv,DMA_RESV_USAGE_BOOKKEEP );if (err)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 447/849 iommu/amd: Add support to remap/unmap IOMMU buffers for kdump
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ashish Kalra <[email protected]>
[ Upstream commit f32fe7cb019861f585b40bff4c3daf237b9af294 ]
After a panic if SNP is enabled in the previous kernel then the kdump kernel boots with IOMMU SNP enforcement still enabled.
IOMMU completion wait buffers (CWBs), command buffers and event buffer registers remain locked and exclusive to the previous kernel. Attempts to allocate and use new buffers in the kdump kernel fail, as hardware ignores writes to the locked MMIO registers as per AMD IOMMU spec Section 2.12.2.1.
This results in repeated "Completion-Wait loop timed out" errors and a second kernel panic: "Kernel panic - not syncing: timer doesn't work through Interrupt-remapped IO-APIC"
The list of MMIO registers locked and which ignore writes after failed SNP shutdown are mentioned in the AMD IOMMU specifications below:
Section 2.12.2.1.
https://docs.amd.com/v/u/en-US/48882_3.10_PUB
Reuse the pages of the previous kernel for completion wait buffers, command buffers, event buffers and memremap them during kdump boot and essentially work with an already enabled IOMMU configuration and re-using the previous kernel’s data structures.
Reusing of command buffers and event buffers is now done for kdump boot irrespective of SNP being enabled during kdump.
Re-use of completion wait buffers is only done when SNP is enabled as the exclusion base register is used for the completion wait buffer (CWB) address only when SNP is enabled.
--- drivers/iommu/amd/amd_iommu_types.h | 5 + drivers/iommu/amd/init.c | 152 +++++++++++++++++++++++++--- drivers/iommu/amd/iommu.c | 2 +- 3 files changed, 146 insertions(+), 13 deletions(-)
drivers/iommu/amd/amd_iommu_types.h +5 -0
@@ -792,6 +792,11 @@ struct amd_iommu {u32 flags;volatile u64 *cmd_sem;atomic64_t cmd_sem_val; +/* +* Track physical address to directly use it in build_completion_wait() +* and avoid adding any special checks and handling for kdump. +*/ +u64 cmd_sem_paddr;#ifdef CONFIG_AMD_IOMMU_DEBUGFS /* DebugFS Info */
drivers/iommu/amd/init.c +140 -12
183 lines not on this page · raw message
drivers/iommu/amd/iommu.c +1 -1
@@ -1195,7 +1195,7 @@ static void build_completion_wait(struct iommu_cmd *cmd, struct amd_iommu *iommu, u64 data) { -u64 paddr =iommu_virt_to_phys ((void *)iommu->cmd_sem); +u64 paddr = iommu->cmd_sem_paddr;memset (cmd,0 ,sizeof (*cmd)); cmd->data[0 ] =lower_32_bits (paddr) |CMD_COMPL_WAIT_STORE_MASK ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 448/849 iommu/amd: Skip enabling command/event buffers for kdump
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ashish Kalra <[email protected]>
[ Upstream commit 9be15fbfc6c5c89c22cf6e209f66ea43ee0e58bb ]
After a panic if SNP is enabled in the previous kernel then the kdump kernel boots with IOMMU SNP enforcement still enabled.
IOMMU command buffers and event buffer registers remain locked and exclusive to the previous kernel. Attempts to enable command and event buffers in the kdump kernel will fail, as hardware ignores writes to the locked MMIO registers as per AMD IOMMU spec Section 2.12.2.1.
Skip enabling command buffers and event buffers for kdump boot as they are already enabled in the previous kernel.
--- drivers/iommu/amd/init.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-)
drivers/iommu/amd/init.c +19 -9
@@ -815,11 +815,16 @@ static void iommu_enable_command_buffer(struct amd_iommu *iommu)BUG_ON (iommu->cmd_buf ==NULL ); - entry =iommu_virt_to_phys (iommu->cmd_buf); - entry |=MMIO_CMD_SIZE_512 ; - -memcpy_toio (iommu->mmio_base +MMIO_CMD_BUF_OFFSET , - &entry,sizeof (entry)); +if (!is_kdump_kernel ()) { +/* +* Command buffer is re-used for kdump kernel and setting +* of MMIO register is not required. +*/ + entry =iommu_virt_to_phys (iommu->cmd_buf); + entry |=MMIO_CMD_SIZE_512 ; +memcpy_toio (iommu->mmio_base +MMIO_CMD_BUF_OFFSET , + &entry,sizeof (entry)); + }amd_iommu_reset_cmd_buffer (iommu); }
@@ -870,10 +875,15 @@ static void iommu_enable_event_buffer(struct amd_iommu *iommu)BUG_ON (iommu->evt_buf ==NULL ); - entry =iommu_virt_to_phys (iommu->evt_buf) |EVT_LEN_MASK ; - -memcpy_toio (iommu->mmio_base +MMIO_EVT_BUF_OFFSET , - &entry,sizeof (entry)); +if (!is_kdump_kernel ()) { +/* +* Event buffer is re-used for kdump kernel and setting +* of MMIO register is not required. +*/ + entry =iommu_virt_to_phys (iommu->evt_buf) |EVT_LEN_MASK ; +memcpy_toio (iommu->mmio_base +MMIO_EVT_BUF_OFFSET , + &entry,sizeof (entry)); + }/* set head and tail to zero manually */ writel (0x00 , iommu->mmio_base +MMIO_EVT_HEAD_OFFSET );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 449/849 iommu/amd: Reuse device table for kdump
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ashish Kalra <[email protected]>
[ Upstream commit 38e5f33ee3596f37ee8d1e694073a17590904004 ]
After a panic if SNP is enabled in the previous kernel then the kdump kernel boots with IOMMU SNP enforcement still enabled.
IOMMU device table register is locked and exclusive to the previous kernel. Attempts to copy old device table from the previous kernel fails in kdump kernel as hardware ignores writes to the locked device table base address register as per AMD IOMMU spec Section 2.12.2.1.
This causes the IOMMU driver (OS) and the hardware to reference different memory locations. As a result, the IOMMU hardware cannot process the command which results in repeated "Completion-Wait loop timed out" errors and a second kernel panic: "Kernel panic - not
syncing: timer doesn't work through Interrupt-remapped IO-APIC".
Reuse device table instead of copying device table in case of kdump boot and remove all copying device table code.
--- drivers/iommu/amd/init.c | 104 +++++++++++++-------------------------- 1 file changed, 34 insertions(+), 70 deletions(-)
drivers/iommu/amd/init.c +34 -70
@@ -406,6 +406,9 @@ static void iommu_set_device_table(struct amd_iommu *iommu)BUG_ON (iommu->mmio_base ==NULL ); +if (is_kdump_kernel ()) +return ; + entry =iommu_virt_to_phys (dev_table); entry |= (dev_table_size >>12 ) -1 ; memcpy_toio(iommu->mmio_base + MMIO_DEV_TABLE_OFFSET,
@@ -646,7 +649,10 @@ static inline int __init alloc_dev_table(struct amd_iommu_pci_seg *pci_seg)static inline void free_dev_table (struct amd_iommu_pci_seg *pci_seg) { -iommu_free_pages (pci_seg->dev_table); +if (is_kdump_kernel ()) +memunmap ((void *)pci_seg->dev_table); +else +iommu_free_pages (pci_seg->dev_table); pci_seg->dev_table =NULL ; }
@@ -1127,15 +1133,12 @@ static void set_dte_bit(struct dev_table_entry *dte, u8 bit) dte->data[i] |= (1UL << _bit); } -static bool __copy_device_table (struct amd_iommu *iommu) +static bool __reuse_device_table (struct amd_iommu *iommu) { -u64 int_ctl, int_tab_len, entry =0 ;struct amd_iommu_pci_seg *pci_seg = iommu->pci_seg; -struct dev_table_entry *old_devtb =NULL ; -u32 lo, hi, devid, old_devtb_size; +u32 lo, hi, old_devtb_size;phys_addr_t old_devtb_phys; -u16 dom_id, dte_v, irq_v; -u64 tmp; +u64 entry;/* Each IOMMU use separate device table with the same size */ lo =readl (iommu->mmio_base +MMIO_DEV_TABLE_OFFSET );
@@ -1160,66 +1163,20 @@ static bool __copy_device_table(struct amd_iommu *iommu)pr_err ("The address of old device table is above 4G, not trustworthy!\n" );return false; } - old_devtb = (cc_platform_has (CC_ATTR_HOST_MEM_ENCRYPT ) &&is_kdump_kernel ()) - ? (__force void *)ioremap_encrypted (old_devtb_phys, - pci_seg->dev_table_size) - :memremap (old_devtb_phys, pci_seg->dev_table_size,MEMREMAP_WB ); - -if (!old_devtb) -return false; - pci_seg->old_dev_tbl_cpy =iommu_alloc_pages_sz ( -GFP_KERNEL |GFP_DMA32 , pci_seg->dev_table_size); +/* +* Re-use the previous kernel's device table for kdump. +*/ + pci_seg->old_dev_tbl_cpy =iommu_memremap (old_devtb_phys, pci_seg->dev_table_size);if (pci_seg->old_dev_tbl_cpy ==NULL ) { -pr_err ("Failed to allocate memory for copying old device table!\n" ); -memunmap (old_devtb); +pr_err ("Failed to remap memory for reusing old device table!\n" );return false; } -for (devid =0 ; devid <= pci_seg->last_bdf; ++devid) { - pci_seg->old_dev_tbl_cpy[devid] = old_devtb[devid]; - dom_id = old_devtb[devid].data[1 ] &DEV_DOMID_MASK ; - dte_v = old_devtb[devid].data[0 ] &DTE_FLAG_V ; - -if (dte_v && dom_id) { - pci_seg->old_dev_tbl_cpy[devid].data[0 ] = old_devtb[devid].data[0 ]; - pci_seg->old_dev_tbl_cpy[devid].data[1 ] = old_devtb[devid].data[1 ]; -/* Reserve the Domain IDs used by previous kernel */ -if (ida_alloc_range (&pdom_ids, dom_id, dom_id,GFP_ATOMIC ) != dom_id) { -pr_err ("Failed to reserve domain ID 0x%x\n" , dom_id); -memunmap (old_devtb); -return false; - } -/* If gcr3 table existed, mask it out */ -if (old_devtb[devid].data[0 ] &DTE_FLAG_GV ) { - tmp = (DTE_GCR3_30_15 |DTE_GCR3_51_31 ); - pci_seg->old_dev_tbl_cpy[devid].data[1 ] &= ~tmp; - tmp = (DTE_GCR3_14_12 |DTE_FLAG_GV ); - pci_seg->old_dev_tbl_cpy[devid].data[0 ] &= ~tmp; - } - } - - irq_v = old_devtb[devid].data[2 ] &DTE_IRQ_REMAP_ENABLE ; - int_ctl = old_devtb[devid].data[2 ] &DTE_IRQ_REMAP_INTCTL_MASK ; - int_tab_len = old_devtb[devid].data[2 ] &DTE_INTTABLEN_MASK ; -if (irq_v && (int_ctl || int_tab_len)) { -if ((int_ctl !=DTE_IRQ_REMAP_INTCTL ) || - (int_tab_len !=DTE_INTTABLEN_512 && - int_tab_len !=DTE_INTTABLEN_2K )) { -pr_err ("Wrong old irq remapping flag: %#x\n" , devid); -memunmap (old_devtb); -return false; - } - - pci_seg->old_dev_tbl_cpy[devid].data[2 ] = old_devtb[devid].data[2 ]; - } - } -memunmap (old_devtb); -return true; } -static bool copy_device_table (void ) +static bool reuse_device_table (void ) {struct amd_iommu *iommu;struct amd_iommu_pci_seg *pci_seg;
@@ -1227,17 +1184,17 @@ static bool copy_device_table(void)if (!amd_iommu_pre_enabled)return false; -pr_warn ("Translation is already enabled - trying to copy translation structures\n" ); +pr_warn ("Translation is already enabled - trying to reuse translation structures\n" );/* * All IOMMUs within PCI segment shares common device table. -* Hence copy device table only once per PCI segment. +* Hence reuse device table only once per PCI segment. */ for_each_pci_segment (pci_seg) {for_each_iommu (iommu) {if (pci_seg->id != iommu->pci_seg->id)continue ; -if (!__copy_device_table (iommu)) +if (!__reuse_device_table (iommu))return false;break ; }
@@ -2916,8 +2873,8 @@ static void early_enable_iommu(struct amd_iommu *iommu)* This function finally enables all IOMMUs found in the system after * they have been initialized. * -* Or if in kdump kernel and IOMMUs are all pre-enabled, try to copy -* the old content of device table entries. Not this case or copy failed, +* Or if in kdump kernel and IOMMUs are all pre-enabled, try to reuse +* the old content of device table entries. Not this case or reuse failed, * just continue as normal kernel does. */ static void early_enable_iommus (void )
@@ -2925,18 +2882,25 @@ static void early_enable_iommus(void)struct amd_iommu *iommu;struct amd_iommu_pci_seg *pci_seg; -if (!copy_device_table ()) { +if (!reuse_device_table ()) {/* -* If come here because of failure in copying device table from old +* If come here because of failure in reusing device table from old * kernel with all IOMMUs enabled, print error message and try to * free allocated old_dev_tbl_cpy. */ -if (amd_iommu_pre_enabled) -pr_err ("Failed to copy DEV table from previous kernel.\n" ); +if (amd_iommu_pre_enabled) { +pr_err ("Failed to reuse DEV table from previous kernel.\n" ); +/* +* Bail out early if unable to remap/reuse DEV table from +* previous kernel if SNP enabled as IOMMU commands will +* time out without DEV table and cause kdump boot panic. +*/ +BUG_ON (check_feature (FEATURE_SNP )); + }for_each_pci_segment (pci_seg) {if (pci_seg->old_dev_tbl_cpy !=NULL ) { -iommu_free_pages (pci_seg->old_dev_tbl_cpy); +memunmap ((void *)pci_seg->old_dev_tbl_cpy); pci_seg->old_dev_tbl_cpy =NULL ; } }
@@ -2946,7 +2910,7 @@ static void early_enable_iommus(void)early_enable_iommu (iommu); } }else { -pr_info ("Copied DEV table from previous kernel.\n" ); +pr_info ("Reused DEV table from previous kernel.\n" );for_each_pci_segment (pci_seg) {iommu_free_pages (pci_seg->dev_table);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 450/849 crypto: ccp: Skip SEV and SNP INIT for kdump boot
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ashish Kalra <[email protected]>
[ Upstream commit 8c571019d8a817b701888926529a5d7a826b947b ]
Since SEV or SNP may already be initialized in the previous kernel, attempting to initialize them again in the kdump kernel can result in SNP initialization failures, which in turn lead to IOMMU initialization failures. Moreover, SNP/SEV guests are not run under a kdump kernel, so there is no need to initialize SEV or SNP during kdump boot.
Skip SNP and SEV INIT if doing kdump boot.
--- drivers/crypto/ccp/sev-dev.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/crypto/ccp/sev-dev.c +10 -0
@@ -28,6 +28,7 @@#include <linux/fs_struct.h> #include <linux/psp.h> #include <linux/amd-iommu.h> +#include <linux/crash_dump.h> #include <asm/smp.h> #include <asm/cacheflush.h>
@@ -1345,6 +1346,15 @@ static int _sev_platform_init_locked(struct sev_platform_init_args *args)if (!psp_master || !psp_master->sev_data)return -ENODEV ; +/* +* Skip SNP/SEV initialization under a kdump kernel as SEV/SNP +* may already be initialized in the previous kernel. Since no +* SNP/SEV guests are run under a kdump kernel, there is no +* need to initialize SNP or SEV during kdump boot. +*/ +if (is_kdump_kernel ()) +return 0 ; + sev = psp_master->sev_data;if (sev->state ==SEV_STATE_INIT )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 451/849 iommu/apple-dart: Clear stream error indicator bits for T8110 DARTs
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hector Martin <[email protected]>
[ Upstream commit ecf6508923f87e4597228f70cc838af3d37f6662 ]
These registers exist and at least on the t602x variant the IRQ only clears when theses are cleared.
--- drivers/iommu/apple-dart.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/iommu/apple-dart.c +5 -0
@@ -122,6 +122,8 @@#define DART_T8110_ERROR_ADDR_LO 0x170#define DART_T8110_ERROR_ADDR_HI 0x174 +#define DART_T8110_ERROR_STREAMS 0x1c0 +#define DART_T8110_PROTECT 0x200#define DART_T8110_UNPROTECT 0x204#define DART_T8110_PROTECT_LOCK 0x208
@@ -1077,6 +1079,9 @@ static irqreturn_t apple_dart_t8110_irq(int irq, void *dev) error, stream_idx, error_code, fault_name, addr);writel (error, dart->regs +DART_T8110_ERROR ); +for (int i =0 ; i <BITS_TO_U32 (dart->num_streams); i++) +writel (U32_MAX , dart->regs +DART_T8110_ERROR_STREAMS +4 * i); +return IRQ_HANDLED ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 452/849 bus: mhi: host: pci_generic: Add support for all Foxconn T99W696 SKU variants
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Slark Xiao <[email protected]>
[ Upstream commit 376358bb9770e5313d22d8784511497096cdb75f ]
Since there are too many variants available for Foxconn T99W696 modem, and they all share the same configuration, use PCI_ANY_ID as the subsystem device ID to match each possible SKUs and support all of them.
--- drivers/bus/mhi/host/pci_generic.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-)
drivers/bus/mhi/host/pci_generic.c +2 -14
@@ -917,20 +917,8 @@ static const struct pci_device_id mhi_pci_id_table[] = {/* Telit FE990A */ { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, 0x1c5d, 0x2015), .driver_data = (kernel_ulong_t) &mhi_telit_fe990a_info }, -/* Foxconn T99W696.01, Lenovo Generic SKU */ - { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, PCI_VENDOR_ID_FOXCONN, 0xe142), - .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w696_info }, -/* Foxconn T99W696.02, Lenovo X1 Carbon SKU */ - { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, PCI_VENDOR_ID_FOXCONN, 0xe143), - .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w696_info }, -/* Foxconn T99W696.03, Lenovo X1 2in1 SKU */ - { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, PCI_VENDOR_ID_FOXCONN, 0xe144), - .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w696_info }, -/* Foxconn T99W696.04, Lenovo PRC SKU */ - { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, PCI_VENDOR_ID_FOXCONN, 0xe145), - .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w696_info }, -/* Foxconn T99W696.00, Foxconn SKU */ - { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, PCI_VENDOR_ID_FOXCONN, 0xe146), +/* Foxconn T99W696, all variants */ + { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, PCI_VENDOR_ID_FOXCONN, PCI_ANY_ID), .driver_data = (kernel_ulong_t) &mhi_foxconn_t99w696_info }, { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0308), .driver_data = (kernel_ulong_t) &mhi_qcom_sdx65_info },
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 453/849 drm/amdgpu: Correct info field of bad page threshold exceed CPER
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Liu <[email protected]>
[ Upstream commit f320ed01cf5f2259e2035a56900952cb3cc77e7a ]
Correct valid_bits and ms_chk_bits of section info field for bad page threshold exceed CPER to match OOB's behavior.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c +3 -1
@@ -68,7 +68,6 @@ void amdgpu_cper_entry_fill_hdr(struct amdgpu_device *adev, hdr->error_severity = sev; hdr->valid_bits.platform_id =1 ; - hdr->valid_bits.partition_id =1 ; hdr->valid_bits.timestamp =1 ;amdgpu_cper_get_timestamp (&hdr->timestamp);
@@ -220,7 +219,10 @@ int amdgpu_cper_entry_fill_bad_page_threshold_section(struct amdgpu_device *adev section->hdr.valid_bits.err_context_cnt =1 ; section->info.error_type =RUNTIME ; + section->info.valid_bits.ms_chk =1 ; section->info.ms_chk_bits.err_type_valid =1 ; + section->info.ms_chk_bits.err_type =1 ; + section->info.ms_chk_bits.pcc =1 ; section->ctx.reg_ctx_type =CPER_CTX_TYPE_CRASH ; section->ctx.reg_arr_size =sizeof (section->ctx.reg_dump);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 454/849 drm/amd: add more cyan skillfish PCI ids
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit 1e18746381793bef7c715fc5ec5611a422a75c4c ]
Add additional PCI IDs to the cyan skillfish family.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +5 -0
@@ -2172,6 +2172,11 @@ static const struct pci_device_id pciidlist[] = { {0x1002, 0x7410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ALDEBARAN},/* CYAN_SKILLFISH */ + {0x1002, 0x13DB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU}, + {0x1002, 0x13F9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU}, + {0x1002, 0x13FA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU}, + {0x1002, 0x13FB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU}, + {0x1002, 0x13FC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU}, {0x1002, 0x13FE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU}, {0x1002, 0x143F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYAN_SKILLFISH|AMD_IS_APU},
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 455/849 drm/amdgpu: dont enable SMU on cyan skillfish
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit 94bd7bf2c920998b4c756bc8a54fd3dbdf7e4360 ]
Cyan skillfish uses different SMU firmware.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +4 -1
@@ -2126,7 +2126,6 @@ static int amdgpu_discovery_set_smu_ip_blocks(struct amdgpu_device *adev)case IP_VERSION (11 ,0 ,5 ):case IP_VERSION (11 ,0 ,9 ):case IP_VERSION (11 ,0 ,7 ): -case IP_VERSION (11 ,0 ,8 ):case IP_VERSION (11 ,0 ,11 ):case IP_VERSION (11 ,0 ,12 ):case IP_VERSION (11 ,0 ,13 ):
@@ -2134,6 +2133,10 @@ static int amdgpu_discovery_set_smu_ip_blocks(struct amdgpu_device *adev)case IP_VERSION (11 ,5 ,2 ):amdgpu_device_ip_block_add (adev, &smu_v11_0_ip_block);break ; +case IP_VERSION (11 ,0 ,8 ): +if (adev->apu_flags &AMD_APU_IS_CYAN_SKILLFISH2 ) +amdgpu_device_ip_block_add (adev, &smu_v11_0_ip_block); +break ;case IP_VERSION (12 ,0 ,0 ):case IP_VERSION (12 ,0 ,1 ):amdgpu_device_ip_block_add (adev, &smu_v12_0_ip_block);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 456/849 drm/amdgpu: add support for cyan skillfish gpu_info
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit fa819e3a7c1ee994ce014cc5a991c7fd91bc00f1 ]
Some SOCs which are part of the cyan skillfish family rely on an explicit firmware for IP discovery. Add support for the gpu_info firmware.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +4 -0
@@ -95,6 +95,7 @@ MODULE_FIRMWARE("amdgpu/picasso_gpu_info.bin");MODULE_FIRMWARE ("amdgpu/raven2_gpu_info.bin" );MODULE_FIRMWARE ("amdgpu/arcturus_gpu_info.bin" );MODULE_FIRMWARE ("amdgpu/navi12_gpu_info.bin" ); +MODULE_FIRMWARE ("amdgpu/cyan_skillfish_gpu_info.bin" );#define AMDGPU_RESUME_MS 2000#define AMDGPU_MAX_RETRY_LIMIT 2
@@ -2595,6 +2596,9 @@ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)return 0 ; chip_name ="navi12" ;break ; +case CHIP_CYAN_SKILLFISH : + chip_name ="cyan_skillfish" ; +break ; } err = amdgpu_ucode_request(adev, &adev->firmware.gpu_info_fw,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 457/849 drm/amd/display: Fix pbn_div Calculation Error
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fangzhi Zuo <[email protected]>
[ Upstream commit 12cdfb61b32a7be581ec5932e0b6a482cb098204 ]
[Why]dm_mst_get_pbn_divider() returns value integer coming from
the cast from fixed point, but the casted integer will then be used in dfixed_const to be multiplied by 4096. The cast from fixed point to integer causes the calculation error becomes bigger when multiplied by 4096.
That makes the calculated pbn_div value becomes smaller than it should be, which leads to the req_slot number becomes bigger.
Such error is getting reflected in 8k30 timing,
where the correct and incorrect calculated req_slot 62.9 Vs 63.1. That makes the wrong calculation failed to light up 8k30 after a dock under HBR3 x 4.
[How]
Restore the accuracy by keeping the fraction part
calculated for the left shift operation.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +- .../drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 13 ++++++++++--- .../drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +1 -1
@@ -7974,7 +7974,7 @@ static int dm_encoder_helper_atomic_check(struct drm_encoder *encoder,if (IS_ERR (mst_state))return PTR_ERR (mst_state); - mst_state->pbn_div.full =dfixed_const (dm_mst_get_pbn_divider (aconnector->mst_root->dc_link)); + mst_state->pbn_div.full =dm_mst_get_pbn_divider (aconnector->mst_root->dc_link);if (!state->duplicated) {int max_bpc = conn_state->max_requested_bpc;
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +10 -3
@@ -822,13 +822,20 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,drm_connector_attach_dp_subconnector_property (&aconnector->base); } -int dm_mst_get_pbn_divider (struct dc_link *link) +uint32_t dm_mst_get_pbn_divider (struct dc_link *link) { +uint32_t pbn_div_x100; +uint64_t dividend, divisor; +if (!link)return 0 ; -return dc_link_bandwidth_kbps (link, -dc_link_get_link_cap (link)) / (8 *1000 *54 ); + dividend = (uint64_t )dc_link_bandwidth_kbps (link,dc_link_get_link_cap (link)) *100 ; + divisor =8 *1000 *54 ; + + pbn_div_x100 =div64_u64 (dividend, divisor); + +return dfixed_const (pbn_div_x100) /100 ; }struct dsc_mst_fairness_params {
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h +1 -1
@@ -59,7 +59,7 @@ enum mst_msg_ready_type {struct amdgpu_display_manager ;struct amdgpu_dm_connector ; -int dm_mst_get_pbn_divider (struct dc_link *link); +uint32_t dm_mst_get_pbn_divider (struct dc_link *link); void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, struct amdgpu_dm_connector *aconnector,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 458/849 drm/amd/display: dont wait for pipe update during medupdate/highirq
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ausef Yousof <[email protected]>
[ Upstream commit 895b61395eefd28376250778a741f11e12715a39 ]
[why&how]
control flag for the wait during pipe update wait for vupdate should be set if update type is not fast or med to prevent an invalid sleep operation
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +1 -1
@@ -4163,7 +4163,7 @@ static void commit_planes_for_stream(struct dc *dc, }if (dc->hwseq->funcs.wait_for_pipe_update_if_needed) - dc->hwseq->funcs.wait_for_pipe_update_if_needed (dc, top_pipe_to_program, update_type ==UPDATE_TYPE_FAST ); + dc->hwseq->funcs.wait_for_pipe_update_if_needed (dc, top_pipe_to_program, update_type <UPDATE_TYPE_FULL );if (should_lock_all_pipes && dc->hwss.interdependent_update_lock) {if (dc->hwss.subvp_pipe_control_lock)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 459/849 drm/amd/pm: refine amdgpu pm sysfs node error code
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Wang <[email protected]>
[ Upstream commit cf32515a70618c0fb2319bd4a855f4d9447940a8 ]
v1:
Returns different error codes based on the scenario to help the user app understand the AMDGPU device status when an exception occurs.
v2:
change -NODEV to -EBUSY.
--- drivers/gpu/drm/amd/pm/amdgpu_pm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/pm/amdgpu_pm.c +3 -2
@@ -110,9 +110,10 @@ static int amdgpu_pm_dev_state_check(struct amdgpu_device *adev, bool runpm)bool runpm_check = runpm ? adev->in_runpm : false;if (amdgpu_in_reset (adev)) -return -EPERM ; +return -EBUSY ; +if (adev->in_suspend && !runpm_check) -return -EPERM ; +return -EBUSY ;return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 460/849 drm/amd/display: Indicate when custom brightness curves are in use
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
[ Upstream commit 68f3c044f37d9f50d67417fa8018d9cf16423458 ]
[Why]
There is a scale sysfs attribute that can be used to indicate when non-linear brightness scaling is in use. As Custom brightness curves work by linear interpolation of points the scale is no longer linear.
[How]
Indicate non-linear scaling when custom brightness curves in use and linear scaling otherwise.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +4 -1
@@ -5032,8 +5032,11 @@ amdgpu_dm_register_backlight_device(struct amdgpu_dm_connector *aconnector) }else props.brightness = props.max_brightness =MAX_BACKLIGHT_LEVEL ; -if (caps->data_points && !(amdgpu_dc_debug_mask &DC_DISABLE_CUSTOM_BRIGHTNESS_CURVE )) +if (caps->data_points && !(amdgpu_dc_debug_mask &DC_DISABLE_CUSTOM_BRIGHTNESS_CURVE )) {drm_info (drm,"Using custom brightness curve\n" ); + props.scale =BACKLIGHT_SCALE_NON_LINEAR ; + }else + props.scale =BACKLIGHT_SCALE_LINEAR ; props.type =BACKLIGHT_RAW ; snprintf(bl_name, sizeof(bl_name), "amdgpu_bl%d",
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 461/849 selftests: ncdevmem: dont retry EFAULT
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stanislav Fomichev <[email protected]>
[ Upstream commit 8c0b9ed2401b9b3f164c8c94221899a1ace6e9ab ]
devmem test fails on NIPA. Most likely we get skb(s) with readable frags (why?) but the failure manifests as an OOM. The OOM happens because ncdevmem spams the following message:
recvmsg ret=-1
recvmsg: Bad address
As of today, ncdevmem can't deal with various reasons of EFAULT:
- falling back to regular recvmsg for non-devmem skbs
- increasing ctrl_data size (can't happen with ncdevmem's large buffer)
Exit (cleanly) with error when recvmsg returns EFAULT. This should at least cause the test to cleanup its state.
--- tools/testing/selftests/drivers/net/hw/ncdevmem.c | 4 ++++ 1 file changed, 4 insertions(+)
tools/testing/selftests/drivers/net/hw/ncdevmem.c +4 -0
@@ -631,6 +631,10 @@ static int do_server(struct memory_buffer *mem)continue ;if (ret <0 ) {perror ("recvmsg" ); +if (errno ==EFAULT ) { +pr_err ("received EFAULT, won't recover" ); + goto err_close_client; + }continue ; }if (ret ==0 ) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 462/849 net: dsa: felix: support phy-mode = "10g-qxgmii"
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Oltean <[email protected]>
[ Upstream commit 6f616757dd306fce4b55131df23737732e347d8f ]
The "usxgmii" phy-mode that the Felix switch ports support on LS1028A is not quite USXGMII, it is defined by the USXGMII multiport specification document as 10G-QXGMII. It uses the same signaling as USXGMII, but it multiplexes 4 ports over the link, resulting in a maximum speed of 2.5G per port.
This change is needed in preparation for the lynx-10g SerDes driver on LS1028A, which will make a more clear distinction between usxgmii (supported on lane 0) and 10g-qxgmii (supported on lane 1). These protocols have their configuration in different PCCR registers (PCCRB vs PCCR9).
Continue parsing and supporting single-port-per-lane USXGMII when found in the device tree as usual (because it works), but add support for 10G-QXGMII too. Using phy-mode = "10g-qxgmii" will be required when modifying the device trees to specify a "phys" phandle to the SerDes lane. The result when the "phys" phandle is present but the phy-mode is wrong is undefined.
The only PHY driver in known use with this phy-mode, AQR412C, will gain logic to transition from "usxgmii" to "10g-qxgmii" in a future change. Prepare the driver by also setting PHY_INTERFACE_MODE_10G_QXGMII in supported_interfaces when PHY_INTERFACE_MODE_USXGMII is there, to prevent breakage with existing device trees.
--- drivers/net/dsa/ocelot/felix.c | 4 ++++ drivers/net/dsa/ocelot/felix.h | 3 ++- drivers/net/dsa/ocelot/felix_vsc9959.c | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-)
drivers/net/dsa/ocelot/felix.c +4 -0
@@ -1153,6 +1153,9 @@ static void felix_phylink_get_caps(struct dsa_switch *ds, int port,__set_bit (ocelot->ports[port]->phy_mode, config->supported_interfaces); +if (ocelot->ports[port]->phy_mode ==PHY_INTERFACE_MODE_USXGMII ) +__set_bit (PHY_INTERFACE_MODE_10G_QXGMII , + config->supported_interfaces); } static void felix_phylink_mac_config(struct phylink_config *config,
@@ -1359,6 +1362,7 @@ static const u32 felix_phy_match_table[PHY_INTERFACE_MODE_MAX] = { [PHY_INTERFACE_MODE_SGMII] = OCELOT_PORT_MODE_SGMII, [PHY_INTERFACE_MODE_QSGMII] = OCELOT_PORT_MODE_QSGMII, [PHY_INTERFACE_MODE_USXGMII] = OCELOT_PORT_MODE_USXGMII, + [PHY_INTERFACE_MODE_10G_QXGMII] = OCELOT_PORT_MODE_10G_QXGMII, [PHY_INTERFACE_MODE_1000BASEX] = OCELOT_PORT_MODE_1000BASEX, [PHY_INTERFACE_MODE_2500BASEX] = OCELOT_PORT_MODE_2500BASEX, };
drivers/net/dsa/ocelot/felix.h +2 -1
@@ -12,8 +12,9 @@#define OCELOT_PORT_MODE_SGMII BIT(1)#define OCELOT_PORT_MODE_QSGMII BIT(2)#define OCELOT_PORT_MODE_2500BASEX BIT(3) -#define OCELOT_PORT_MODE_USXGMII BIT(4) +#define OCELOT_PORT_MODE_USXGMII BIT(4)/* compatibility */ #define OCELOT_PORT_MODE_1000BASEX BIT(5) +#define OCELOT_PORT_MODE_10G_QXGMII BIT(6)struct device_node ;
drivers/net/dsa/ocelot/felix_vsc9959.c +2 -1
@@ -34,7 +34,8 @@ OCELOT_PORT_MODE_QSGMII | \ OCELOT_PORT_MODE_1000BASEX | \ OCELOT_PORT_MODE_2500BASEX | \ - OCELOT_PORT_MODE_USXGMII) + OCELOT_PORT_MODE_USXGMII | \ + OCELOT_PORT_MODE_10G_QXGMII)static const u32 vsc9959_port_modes[VSC9959_NUM_PORTS ] = {VSC9959_PORT_MODE_SERDES ,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 463/849 usb: gadget: f_hid: Fix zero length packet transfer
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: William Wu <[email protected]>
[ Upstream commit ed6f727c575b1eb8136e744acfd5e7306c9548f6 ]
Set the hid req->zero flag of ep0/in_ep to true by default, then the UDC drivers can transfer a zero length packet at the end if the hid transfer with size divisible to EPs max packet size according to the USB 2.0 spec.
--- drivers/usb/gadget/function/f_hid.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/gadget/function/f_hid.c +2 -2
@@ -511,7 +511,7 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer, } req->status =0 ; - req->zero =0 ; + req->zero =1 ; req->length = count; req->complete = f_hidg_req_complete; req->context = hidg;
@@ -967,7 +967,7 @@ static int hidg_setup(struct usb_function *f,return -EOPNOTSUPP ; respond: - req->zero =0 ; + req->zero =1 ; req->length = length; status =usb_ep_queue (cdev->gadget->ep0, req,GFP_ATOMIC );if (status <0 )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 464/849 usb: cdns3: gadget: Use-after-free during failed initialization and exit of cdnsp gadget
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Yufeng <[email protected]>
[ Upstream commit 87c5ff5615dc0a37167e8faf3adeeddc6f1344a3 ]
In the __cdnsp_gadget_init() and cdnsp_gadget_exit() functions, the gadget structure (pdev->gadget) was freed before its endpoints.
The endpoints are linked via the ep_list in the gadget structure. Freeing the gadget first leaves dangling pointers in the endpoint list. When the endpoints are subsequently freed, this results in a use-after-free.
Fix:
By separating the usb_del_gadget_udc() operation into distinct "del" and "put" steps, cdnsp_gadget_free_endpoints() can be executed prior to the final release of the gadget structure with usb_put_gadget().
A patch similar to bb9c74a5bd14("usb: dwc3: gadget: Free gadget structure
only after freeing endpoints").
--- drivers/usb/cdns3/cdnsp-gadget.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/usb/cdns3/cdnsp-gadget.c +6 -2
@@ -1976,7 +1976,10 @@ static int __cdnsp_gadget_init(struct cdns *cdns)return 0 ; del_gadget: -usb_del_gadget_udc (&pdev->gadget); +usb_del_gadget (&pdev->gadget); +cdnsp_gadget_free_endpoints (pdev); +usb_put_gadget (&pdev->gadget); + goto halt_pdev; free_endpoints:cdnsp_gadget_free_endpoints (pdev); halt_pdev:
@@ -1998,8 +2001,9 @@ static void cdnsp_gadget_exit(struct cdns *cdns)devm_free_irq (pdev->dev, cdns->dev_irq, pdev);pm_runtime_mark_last_busy (cdns->dev);pm_runtime_put_autosuspend (cdns->dev); -usb_del_gadget_udc (&pdev->gadget); +usb_del_gadget (&pdev->gadget);cdnsp_gadget_free_endpoints (pdev); +usb_put_gadget (&pdev->gadget);cdnsp_mem_cleanup (pdev);kfree (pdev); cdns->gadget_dev =NULL ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 465/849 serial: qcom-geni: Add DFS clock mode support to GENI UART driver
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viken Dadhaniya <[email protected]>
[ Upstream commit fc6a5b540c02d1ec624e4599f45a17f2941a5c00 ]
GENI UART driver currently supports only non-DFS (Dynamic Frequency Scaling) mode for source frequency selection. However, to operate correctly in DFS mode, the GENI SCLK register must be programmed with the appropriate DFS index. Failing to do so can result in incorrect frequency selection
Add support for Dynamic Frequency Scaling (DFS) mode in the GENI UART driver by configuring the GENI_CLK_SEL register with the appropriate DFS index. This ensures correct frequency selection when operating in DFS mode.
Replace the UART driver-specific logic for clock selection with the GENI common driver function to obtain the desired frequency and corresponding clock index. This improves maintainability and consistency across GENI-based drivers.
--- drivers/tty/serial/qcom_geni_serial.c | 92 ++++++--------------------- 1 file changed, 21 insertions(+), 71 deletions(-)
drivers/tty/serial/qcom_geni_serial.c +21 -71
@@ -1,5 +1,8 @@// SPDX-License-Identifier: GPL-2.0 -// Copyright (c) 2017-2018, The Linux foundation. All rights reserved. +/* +* Copyright (c) 2017-2018, The Linux foundation. All rights reserved. +* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +*/ /* Disable MMIO tracing to prevent excessive logging of unwanted MMIO traces */ #define __DISABLE_TRACE_MMIO__
@@ -1253,75 +1256,15 @@ static int qcom_geni_serial_startup(struct uart_port *uport)return 0 ; } -static unsigned long find_clk_rate_in_tol (struct clk *clk,unsigned int desired_clk, -unsigned int *clk_div,unsigned int percent_tol) -{ -unsigned long freq; -unsigned long div, maxdiv; -u64 mult; -unsigned long offset, abs_tol, achieved; - - abs_tol =div_u64 ((u64 )desired_clk * percent_tol,100 ); - maxdiv =CLK_DIV_MSK >>CLK_DIV_SHFT ; - div =1 ; -while (div <= maxdiv) { - mult = (u64 )div * desired_clk; -if (mult != (unsigned long )mult) -break ; - - offset = div * abs_tol; - freq =clk_round_rate (clk, mult - offset); - -/* Can only get lower if we're done */ -if (freq < mult - offset) -break ; - -/* -* Re-calculate div in case rounding skipped rates but we -* ended up at a good one, then check for a match. -*/ - div =DIV_ROUND_CLOSEST (freq, desired_clk); - achieved =DIV_ROUND_CLOSEST (freq, div); -if (achieved <= desired_clk + abs_tol && - achieved >= desired_clk - abs_tol) { - *clk_div = div; -return freq; - } - - div =DIV_ROUND_UP (freq, desired_clk); - } - -return 0 ; -} - -static unsigned long get_clk_div_rate (struct clk *clk,unsigned int baud, -unsigned int sampling_rate,unsigned int *clk_div) -{ -unsigned long ser_clk; -unsigned long desired_clk; - - desired_clk = baud * sampling_rate; -if (!desired_clk) -return 0 ; - -/* -* try to find a clock rate within 2% tolerance, then within 5% -*/ - ser_clk =find_clk_rate_in_tol (clk, desired_clk, clk_div,2 ); -if (!ser_clk) - ser_clk =find_clk_rate_in_tol (clk, desired_clk, clk_div,5 ); - -return ser_clk; -} -static int geni_serial_set_rate (struct uart_port *uport,unsigned int baud) {struct qcom_geni_serial_port *port =to_dev_port (uport);unsigned long clk_rate; -unsigned int avg_bw_core; +unsigned int avg_bw_core, clk_idx;unsigned int clk_div;u32 ver, sampling_rate;u32 ser_clk_cfg; +int ret; sampling_rate =UART_OVERSAMPLING ;/* Sampling rate is halved for IP versions >= 2.5 */
@@ -1329,17 +1272,22 @@ static int geni_serial_set_rate(struct uart_port *uport, unsigned int baud)if (ver >=QUP_SE_VERSION_2_5 ) sampling_rate /=2 ; - clk_rate =get_clk_div_rate (port->se.clk, baud, - sampling_rate, &clk_div); -if (!clk_rate) { -dev_err (port->se.dev, -"Couldn't find suitable clock rate for %u\n" , - baud * sampling_rate); + ret =geni_se_clk_freq_match (&port->se, baud * sampling_rate, &clk_idx, &clk_rate, false); +if (ret) { +dev_err (port->se.dev,"Failed to find src clk for baud rate: %d ret: %d\n" , + baud, ret); +return ret; + } + + clk_div =DIV_ROUND_UP (clk_rate, baud * sampling_rate); +/* Check if calculated divider exceeds maximum allowed value */ +if (clk_div > (CLK_DIV_MSK >>CLK_DIV_SHFT )) { +dev_err (port->se.dev,"Calculated clock divider %u exceeds maximum\n" , clk_div);return -EINVAL ; } -dev_dbg (port->se.dev,"desired_rate = %u, clk_rate = %lu, clk_div = %u\n" , - baud * sampling_rate, clk_rate, clk_div); +dev_dbg (port->se.dev,"desired_rate = %u, clk_rate = %lu, clk_div = %u\n, clk_idx = %u\n" , + baud * sampling_rate, clk_rate, clk_div, clk_idx); uport->uartclk = clk_rate; port->clk_rate = clk_rate;
@@ -1359,6 +1307,8 @@ static int geni_serial_set_rate(struct uart_port *uport, unsigned int baud)writel (ser_clk_cfg, uport->membase +GENI_SER_M_CLK_CFG );writel (ser_clk_cfg, uport->membase +GENI_SER_S_CLK_CFG ); +/* Configure clock selection register with the selected clock index */ +writel (clk_idx &CLK_SEL_MSK , uport->membase +SE_GENI_CLK_SEL );return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 466/849 serdev: Drop dev_pm_domain_detach() call
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit e3fa89f3a768a9c61cf1bfe86b939ab5f36a9744 ]
Starting with commit f99508074e78 ("PM: domains: Detach on device_unbind_cleanup()"), there is no longer a need to call dev_pm_domain_detach() in the bus remove function. The device_unbind_cleanup() function now handles this to avoid invoking devres cleanup handlers while the PM domain is powered off, which could otherwise lead to failures as described in the above-mentioned commit.
Drop the explicit dev_pm_domain_detach() call and rely instead on the flags passed to dev_pm_domain_attach() to power off the domain.
--- drivers/tty/serdev/core.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/tty/serdev/core.c +3 -8
@@ -399,15 +399,12 @@ static int serdev_drv_probe(struct device *dev)const struct serdev_device_driver *sdrv =to_serdev_device_driver (dev->driver);int ret; - ret =dev_pm_domain_attach (dev,PD_FLAG_ATTACH_POWER_ON ); + ret =dev_pm_domain_attach (dev,PD_FLAG_ATTACH_POWER_ON | +PD_FLAG_DETACH_POWER_OFF );if (ret)return ret; - ret = sdrv->probe (to_serdev_device (dev)); -if (ret) -dev_pm_domain_detach (dev, true); - -return ret; +return sdrv->probe (to_serdev_device (dev)); }static void serdev_drv_remove (struct device *dev)
@@ -415,8 +412,6 @@ static void serdev_drv_remove(struct device *dev)const struct serdev_device_driver *sdrv =to_serdev_device_driver (dev->driver);if (sdrv->remove) sdrv->remove (to_serdev_device (dev)); - -dev_pm_domain_detach (dev, true); }static const struct bus_type serdev_bus_type = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 467/849 tty/vt: Add missing return value for VT_RESIZE in vt_ioctl()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zizhi Wo <[email protected]>
[ Upstream commit da7e8b3823962b13e713d4891e136a261ed8e6a2 ]
In vt_ioctl(), the handler for VT_RESIZE always returns 0, which prevents users from detecting errors. Add the missing return value so that errors can be properly reported to users like vt_resizex().
--- drivers/tty/vt/vt_ioctl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/tty/vt/vt_ioctl.c +3 -1
@@ -923,7 +923,9 @@ int vt_ioctl(struct tty_struct *tty,if (vc) {/* FIXME: review v tty lock */ -__vc_resize (vc_cons[i].d, cc, ll, true); + ret =__vc_resize (vc_cons[i].d, cc, ll, true); +if (ret) +return ret; } }console_unlock ();
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 468/849 eeprom: at25: support Cypress FRAMs without device ID
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Heidelberg <[email protected]>
[ Upstream commit 1b434ed000cd474f074e62e8ab876f87449bb4ac ]
Not all FRAM chips have a device ID and implement the corresponding read command. For such chips this led to the following error on module loading:
at25 spi2.0: Error: no Cypress FRAM (id 00)
The device ID contains the memory size, so devices without this ID are supported now by setting the size manually in Devicetree using the "size" property.
Tested with FM25L16B and "size = <2048>;":
at25 spi2.0: 2 KByte fm25 fram, pagesize 4096
According to Infineon/Cypress datasheets, these FRAMs have a device ID:
FM25V01A
FM25V02A
FM25V05
FM25V10
FM25V20A
FM25VN10but these do not:
FM25040B
FM25640B
FM25C160B
FM25CL64B
FM25L04B
FM25L16B
FM25W256So all "FM25V*" FRAMs and only these have a device ID. The letter after "FM25" (V/C/L/W) only describes the voltage range, though.
--- drivers/misc/eeprom/at25.c | 67 ++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 31 deletions(-)
drivers/misc/eeprom/at25.c +36 -31
@@ -379,37 +379,49 @@ static int at25_fram_to_chip(struct device *dev, struct spi_eeprom *chip) struct at25_data *at25 = container_of(chip, struct at25_data, chip);u8 sernum[FM25_SN_LEN ];u8 id[FM25_ID_LEN ]; +u32 val;int i;strscpy (chip->name,"fm25" ,sizeof (chip->name)); -/* Get ID of chip */ -fm25_aux_read (at25, id,FM25_RDID ,FM25_ID_LEN ); -/* There are inside-out FRAM variations, detect them and reverse the ID bytes */ -if (id[6 ] ==0x7f && id[2 ] ==0xc2 ) -for (i =0 ; i <ARRAY_SIZE (id) /2 ; i++) { -u8 tmp = id[i]; -int j =ARRAY_SIZE (id) - i -1 ; +if (!device_property_read_u32 (dev,"size" , &val)) { + chip->byte_len = val; + }else { +/* Get ID of chip */ +fm25_aux_read (at25, id,FM25_RDID ,FM25_ID_LEN ); +/* There are inside-out FRAM variations, detect them and reverse the ID bytes */ +if (id[6 ] ==0x7f && id[2 ] ==0xc2 ) +for (i =0 ; i <ARRAY_SIZE (id) /2 ; i++) { +u8 tmp = id[i]; +int j =ARRAY_SIZE (id) - i -1 ; + + id[i] = id[j]; + id[j] = tmp; + } +if (id[6 ] !=0xc2 ) { +dev_err (dev,"Error: no Cypress FRAM (id %02x)\n" , id[6 ]); +return -ENODEV ; + } - id[i] = id[j]; - id[j] = tmp; +switch (id[7 ]) { + case 0x21 ... 0x26: + chip->byte_len =BIT (id[7 ] -0x21 +4 ) *1024 ; +break ; + case 0x2a ... 0x30: +/* CY15B116QN ... CY15B116QN */ + chip->byte_len =BIT (((id[7 ] >>1 ) &0xf ) +13 ); +break ; +default : +dev_err (dev,"Error: unsupported size (id %02x)\n" , id[7 ]); +return -ENODEV ; } -if (id[6 ] !=0xc2 ) { -dev_err (dev,"Error: no Cypress FRAM (id %02x)\n" , id[6 ]); -return -ENODEV ; - } -switch (id[7 ]) { - case 0x21 ... 0x26: - chip->byte_len =BIT (id[7 ] -0x21 +4 ) *1024 ; -break ; - case 0x2a ... 0x30: -/* CY15B116QN ... CY15B116QN */ - chip->byte_len =BIT (((id[7 ] >>1 ) &0xf ) +13 ); -break ; -default : -dev_err (dev,"Error: unsupported size (id %02x)\n" , id[7 ]); -return -ENODEV ; +if (id[8 ]) { +fm25_aux_read (at25, sernum,FM25_RDSN ,FM25_SN_LEN ); +/* Swap byte order */ +for (i =0 ; i <FM25_SN_LEN ; i++) + at25->sernum[i] = sernum[FM25_SN_LEN -1 - i]; + } }if (chip->byte_len >64 *1024 )
@@ -417,13 +429,6 @@ static int at25_fram_to_chip(struct device *dev, struct spi_eeprom *chip)else chip->flags |=EE_ADDR2 ; -if (id[8 ]) { -fm25_aux_read (at25, sernum,FM25_RDSN ,FM25_SN_LEN ); -/* Swap byte order */ -for (i =0 ; i <FM25_SN_LEN ; i++) - at25->sernum[i] = sernum[FM25_SN_LEN -1 - i]; - } - chip->page_size =PAGE_SIZE ;return 0 ; }
Signature · 1 line
2.51.0
Re: [PATCH 6.17 468/849] eeprom: at25: support Cypress FRAMs without device ID
Quoted 7 lines · Greg Kroah-Hartman
6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Heidelberg <[email protected]>
[ Upstream commit
1b434ed000cd474f074e62e8ab876f87449bb4ac]
No objections, but the corresponding bindings patch should be included as well then,
see upstream commit 534c702c3c234665ca2fe426a9fbb12281e55d55 ("dt-bindings: eeprom: at25: use "size" for FRAMs without device ID").
How to handle the third and last patch of the same series? See upstream commit dfb962e214788aa5f6dfe9f2bd4a482294533e3e ("eeprom: at25: make FRAM device ID error message more precise").
Greg Kroah-Hartman
maintainerRe: [PATCH 6.17 468/849] eeprom: at25: support Cypress FRAMs without device ID
Quoted 5 lines · Markus Heidelberg
Quoted 4 lines · Greg Kroah-Hartman
6.17-stable review patch. If anyone has any objections, please let me know.
------------------
Quoted 8 lines
Quoted 3 lines
From: Markus Heidelberg <[email protected]>
[ Upstream commit
1b434ed000cd474f074e62e8ab876f87449bb4ac]No objections, but the corresponding bindings patch should be included as well then,
see upstream commit534c702c3c234665ca2fe426a9fbb12281e55d55("dt-bindings: eeprom: at25: use "size" for FRAMs without device ID").
Great, now added.
Quoted 3 lines
How to handle the third and last patch of the same series? See upstream commit
dfb962e214788aa5f6dfe9f2bd4a482294533e3e("eeprom: at25: make FRAM device ID error message more precise").
Not really needed for a kernel tree that will only be alive another month or so, right?
thanks,
greg k-h
Re: [PATCH 6.17 468/849] eeprom: at25: support Cypress FRAMs without device ID
Quoted 15 lines · Greg Kroah-Hartman
Quoted 5 lines · Markus Heidelberg
Quoted 4 lines · Greg Kroah-Hartman
6.17-stable review patch. If anyone has any objections, please let me know.
------------------
Quoted 8 lines
Quoted 3 lines
From: Markus Heidelberg <[email protected]>
[ Upstream commit
1b434ed000cd474f074e62e8ab876f87449bb4ac]No objections, but the corresponding bindings patch should be included as well then,
see upstream commit534c702c3c234665ca2fe426a9fbb12281e55d55("dt-bindings: eeprom: at25: use "size" for FRAMs without device ID").
Quoted 8 lines
Great, now added.
Quoted 3 lines
How to handle the third and last patch of the same series? See upstream commit
dfb962e214788aa5f6dfe9f2bd4a482294533e3e("eeprom: at25: make FRAM device ID error message more precise").Not really needed for a kernel tree that will only be alive another month or so, right?
Indeed, you are right!
Thanks, Greg.
Markus
Greg Kroah-Hartman
maintainerPATCH 469/849 drm/msm/adreno: Add speedbins for A663 GPU
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
[ Upstream commit 0c5300343d0c622f7852145a763c570fbaf68a48 ]
Add speedbin mappings for A663 GPU.
Patchwork: https://patchwork.freedesktop.org/patch/670096/
--- drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/msm/adreno/a6xx_catalog.c +5 -0
@@ -1024,6 +1024,11 @@ static const struct adreno_info a6xx_gpus[] = { .gmu_cgc_mode = 0x00020200, .prim_fifo_threshold = 0x00300200, }, + .speedbins = ADRENO_SPEEDBINS( + { 0, 0 }, + { 169, 0 }, + { 113, 1 }, + ), }, { .chip_ids = ADRENO_CHIP_IDS(0x06030500), .family = ADRENO_6XX_GEN4,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 470/849 drm/msm: Fix 32b size truncation
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit 6d6a29a19b232e29b61a14d58b71fefc2e003fa4 ]
Somehow we never noticed this when arm64 became a thing, many years ago.
v2: also fix npages
Patchwork: https://patchwork.freedesktop.org/patch/669785/
--- drivers/gpu/drm/msm/msm_gem.c | 21 ++++++++++----------- drivers/gpu/drm/msm/msm_gem.h | 6 +++--- drivers/gpu/drm/msm/msm_gem_prime.c | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-)
drivers/gpu/drm/msm/msm_gem.c +10 -11
@@ -191,7 +191,7 @@ static struct page **get_pages(struct drm_gem_object *obj)if (!msm_obj->pages) {struct drm_device *dev = obj->dev;struct page **p; -int npages = obj->size >>PAGE_SHIFT ; +size_t npages = obj->size >>PAGE_SHIFT ; p =drm_gem_get_pages (obj);
@@ -1152,7 +1152,7 @@ static int msm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct/* convenience method to construct a GEM buffer object, and userspace handle */ int msm_gem_new_handle (struct drm_device *dev,struct drm_file *file, -uint32_t size,uint32_t flags,uint32_t *handle, +size_t size,uint32_t flags,uint32_t *handle,char *name) {struct drm_gem_object *obj;
@@ -1218,9 +1218,8 @@ static const struct drm_gem_object_funcs msm_gem_object_funcs = { .vm_ops = &vm_ops, }; -static int msm_gem_new_impl (struct drm_device *dev, -uint32_t size,uint32_t flags, -struct drm_gem_object **obj) +static int msm_gem_new_impl (struct drm_device *dev,uint32_t flags, +struct drm_gem_object **obj) {struct msm_drm_private *priv = dev->dev_private;struct msm_gem_object *msm_obj;
@@ -1254,7 +1253,7 @@ static int msm_gem_new_impl(struct drm_device *dev,return 0 ; } -struct drm_gem_object *msm_gem_new (struct drm_device *dev,uint32_t size,uint32_t flags) +struct drm_gem_object *msm_gem_new (struct drm_device *dev,size_t size,uint32_t flags) {struct msm_drm_private *priv = dev->dev_private;struct msm_gem_object *msm_obj;
@@ -1269,7 +1268,7 @@ struct drm_gem_object *msm_gem_new(struct drm_device *dev, uint32_t size, uint32if (size ==0 )return ERR_PTR (-EINVAL ); - ret =msm_gem_new_impl (dev, size, flags, &obj); + ret =msm_gem_new_impl (dev, flags, &obj);if (ret)return ERR_PTR (ret);
@@ -1309,12 +1308,12 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,struct msm_drm_private *priv = dev->dev_private;struct msm_gem_object *msm_obj;struct drm_gem_object *obj; -uint32_t size; -int ret, npages; +size_t size, npages; +int ret; size =PAGE_ALIGN (dmabuf->size); - ret =msm_gem_new_impl (dev, size,MSM_BO_WC , &obj); + ret =msm_gem_new_impl (dev,MSM_BO_WC , &obj);if (ret)return ERR_PTR (ret);
@@ -1357,7 +1356,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,return ERR_PTR (ret); } -void *msm_gem_kernel_new (struct drm_device *dev,uint32_t size,uint32_t flags, +void *msm_gem_kernel_new (struct drm_device *dev,size_t size,uint32_t flags,struct drm_gpuvm *vm,struct drm_gem_object **bo,uint64_t *iova) {
drivers/gpu/drm/msm/msm_gem.h +3 -3
@@ -297,10 +297,10 @@ bool msm_gem_active(struct drm_gem_object *obj);int msm_gem_cpu_prep (struct drm_gem_object *obj,uint32_t op,ktime_t *timeout);int msm_gem_cpu_fini (struct drm_gem_object *obj);int msm_gem_new_handle (struct drm_device *dev,struct drm_file *file, -uint32_t size,uint32_t flags,uint32_t *handle,char *name); +size_t size,uint32_t flags,uint32_t *handle,char *name);struct drm_gem_object *msm_gem_new (struct drm_device *dev, -uint32_t size,uint32_t flags); -void *msm_gem_kernel_new (struct drm_device *dev,uint32_t size,uint32_t flags, +size_t size,uint32_t flags); +void *msm_gem_kernel_new (struct drm_device *dev,size_t size,uint32_t flags,struct drm_gpuvm *vm,struct drm_gem_object **bo,uint64_t *iova);void msm_gem_kernel_put (struct drm_gem_object *bo,struct drm_gpuvm *vm);
drivers/gpu/drm/msm/msm_gem_prime.c +1 -1
@@ -15,7 +15,7 @@struct sg_table *msm_gem_prime_get_sg_table (struct drm_gem_object *obj) {struct msm_gem_object *msm_obj =to_msm_bo (obj); -int npages = obj->size >>PAGE_SHIFT ; +size_t npages = obj->size >>PAGE_SHIFT ;if (msm_obj->flags &MSM_BO_NO_SHARE )return ERR_PTR (-EINVAL );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 471/849 dt-bindings: display/msm/gmu: Update Adreno 623 bindings
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jie Zhang <[email protected]>
[ Upstream commit c2cc1e60c1afff4f23c22561b57a5d5157dde20d ]
Update Adreno 623's dt-binding to remove smmu_clk which is not required for this GMU.
Patchwork: https://patchwork.freedesktop.org/patch/672455/
--- .../devicetree/bindings/display/msm/gmu.yaml | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+)
Documentation/devicetree/bindings/display/msm/gmu.yaml +34 -0
@@ -124,6 +124,40 @@ allOf: contains: enum: - qcom,adreno-gmu-623.0 + then: + properties: + reg: + items: + - description: Core GMU registers + - description: Resource controller registers + - description: GMU PDC registers + reg-names: + items: + - const: gmu + - const: rscc + - const: gmu_pdc + clocks: + items: + - description: GMU clock + - description: GPU CX clock + - description: GPU AXI clock + - description: GPU MEMNOC clock + - description: GPU AHB clock + - description: GPU HUB CX clock + clock-names: + items: + - const: gmu + - const: cxo + - const: axi + - const: memnoc + - const: ahb + - const: hub + + - if: + properties: + compatible: + contains: + enum: - qcom,adreno-gmu-635.0 - qcom,adreno-gmu-660.1 - qcom,adreno-gmu-663.0
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 472/849 drm/msm: make sure to not queue up recovery more than once
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antonino Maniscalco <[email protected]>
[ Upstream commit 10fb1b2fcaee5545a5e54db1ed4d7b15c2db50c8 ]
If two fault IRQs arrive in short succession recovery work will be queued up twice.
When recovery runs a second time it may end up killing an unrelated context.
Prevent this by masking off interrupts when triggering recovery.
Patchwork: https://patchwork.freedesktop.org/patch/670023/
--- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +3 -0
@@ -1727,6 +1727,9 @@ static void a6xx_fault_detect_irq(struct msm_gpu *gpu)/* Turn off the hangcheck timer to keep it from bothering us */ timer_delete (&gpu->hangcheck_timer); +/* Turn off interrupts to avoid triggering recovery again */ +gpu_write (gpu,REG_A6XX_RBBM_INT_0_MASK ,0 ); +kthread_queue_work (gpu->worker, &gpu->recover_work); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 473/849 char: Use list_del_init() in misc_deregister() to reinitialize list pointer
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xion Wang <[email protected]>
[ Upstream commit e28022873c0d051e980c4145f1965cab5504b498 ]
Currently, misc_deregister() uses list_del() to remove the device from the list. After list_del(), the list pointers are set to LIST_POISON1 and LIST_POISON2, which may help catch use-after-free bugs, but does not reset the list head.
If misc_deregister() is called more than once on the same device, list_empty() will not return true, and list_del() may be called again, leading to undefined behavior.
Replace list_del() with list_del_init() to reinitialize the list head after deletion. This makes the code more robust against double deregistration and allows safe usage of list_empty() on the miscdevice after deregistration.
[ Note, this seems to keep broken out-of-tree drivers from doing foolish
things. While this does not matter for any in-kernel drivers, external drivers could use a bit of help to show them they shouldn't be doing stuff like re-registering misc devices - gregkh ]
--- drivers/char/misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/char/misc.c +1 -1
@@ -281,7 +281,7 @@ void misc_deregister(struct miscdevice *misc)return ;mutex_lock (&misc_mtx); -list_del (&misc->list); +list_del_init (&misc->list);device_destroy (&misc_class,MKDEV (MISC_MAJOR , misc->minor));misc_minor_free (misc->minor);if (misc->minor >MISC_DYNAMIC_MINOR )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 474/849 drm/msm/adreno: Add speedbin data for A623 GPU
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
[ Upstream commit 0584da4515dbb4fec69107ce837eef36a7be5d7d ]
Add the speedbin mappings for Adreno 623 GPU.
Patchwork: https://patchwork.freedesktop.org/patch/672462/
--- drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/msm/adreno/a6xx_catalog.c +5 -0
@@ -913,6 +913,11 @@ static const struct adreno_info a6xx_gpus[] = { { /* sentinel */ }, }, }, + .speedbins = ADRENO_SPEEDBINS( + { 0, 0 }, + { 185, 0 }, + { 127, 1 }, + ), }, { .chip_ids = ADRENO_CHIP_IDS( 0x06030001,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 475/849 drm/msm/adreno: Add fenced regwrite support
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
[ Upstream commit a27d774045566b587bfc1ae9fb122642b06677b8 ]
There are some special registers which are accessible even when GX power domain is collapsed during an IFPC sleep. Accessing these registers wakes up GPU from power collapse and allow programming these registers without additional handshake with GMU. This patch adds support for this special register write sequence.
Patchwork: https://patchwork.freedesktop.org/patch/673368/
--- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 80 ++++++++++++++++++++++- drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 1 + drivers/gpu/drm/msm/adreno/a6xx_preempt.c | 20 +++--- 3 files changed, 90 insertions(+), 11 deletions(-)
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +79 -1
@@ -16,6 +16,84 @@#define GPU_PAS_ID 13 +static bool fence_status_check (struct msm_gpu *gpu,u32 offset,u32 value,u32 status,u32 mask) +{ +/* Success if !writedropped0/1 */ +if (!(status & mask)) +return true; + +udelay (10 ); + +/* Try to update fenced register again */ +gpu_write (gpu, offset, value); + +/* We can't do a posted write here because the power domain could be +* in collapse state. So use the heaviest barrier instead +*/ +mb (); +return false; +} + +static int fenced_write (struct a6xx_gpu *a6xx_gpu,u32 offset,u32 value,u32 mask) +{ +struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; +struct msm_gpu *gpu = &adreno_gpu->base; +struct a6xx_gmu *gmu = &a6xx_gpu->gmu; +u32 status; + +gpu_write (gpu, offset, value); + +/* Nothing else to be done in the case of no-GMU */ +if (adreno_has_gmu_wrapper (adreno_gpu)) +return 0 ; + +/* We can't do a posted write here because the power domain could be +* in collapse state. So use the heaviest barrier instead +*/ +mb (); + +if (!gmu_poll_timeout (gmu,REG_A6XX_GMU_AHB_FENCE_STATUS , status, +fence_status_check (gpu, offset, value, status, mask),0 ,1000 )) +return 0 ; + +/* Try again for another 1ms before failing */ +gpu_write (gpu, offset, value); +mb (); + +if (!gmu_poll_timeout (gmu,REG_A6XX_GMU_AHB_FENCE_STATUS , status, +fence_status_check (gpu, offset, value, status, mask),0 ,1000 )) { +/* +* The 'delay' warning is here because the pause to print this +* warning will allow gpu to move to power collapse which +* defeats the purpose of continuous polling for 2 ms +*/ +dev_err_ratelimited (gmu->dev,"delay in fenced register write (0x%x)\n" , + offset); +return 0 ; + } + +dev_err_ratelimited (gmu->dev,"fenced register write (0x%x) fail\n" , + offset); + +return -ETIMEDOUT ; +} + +int a6xx_fenced_write (struct a6xx_gpu *a6xx_gpu,u32 offset,u64 value,u32 mask,bool is_64b) +{ +int ret; + + ret =fenced_write (a6xx_gpu, offset,lower_32_bits (value), mask); +if (ret) +return ret; + +if (!is_64b) +return 0 ; + + ret =fenced_write (a6xx_gpu, offset +1 ,upper_32_bits (value), mask); + +return ret; +} +static inline bool _a6xx_check_idle (struct msm_gpu *gpu) {struct adreno_gpu *adreno_gpu =to_adreno_gpu (gpu);
@@ -86,7 +164,7 @@ static void a6xx_flush(struct msm_gpu *gpu, struct msm_ringbuffer *ring)/* Update HW if this is the current ring and we are not in preempt*/ if (!a6xx_in_preempt (a6xx_gpu)) {if (a6xx_gpu->cur_ring == ring) -gpu_write (gpu,REG_A6XX_CP_RB_WPTR , wptr); +a6xx_fenced_write (a6xx_gpu,REG_A6XX_CP_RB_WPTR , wptr,BIT (0 ), false);else ring->restore_wptr = true; }else {
drivers/gpu/drm/msm/adreno/a6xx_gpu.h +1 -0
@@ -295,5 +295,6 @@ int a6xx_gpu_state_put(struct msm_gpu_state *state);void a6xx_bus_clear_pending_transactions (struct adreno_gpu *adreno_gpu,bool gx_off);void a6xx_gpu_sw_reset (struct msm_gpu *gpu,bool assert); +int a6xx_fenced_write (struct a6xx_gpu *gpu,u32 offset,u64 value,u32 mask,bool is_64b);#endif /* __A6XX_GPU_H__ */
drivers/gpu/drm/msm/adreno/a6xx_preempt.c +10 -10
@@ -41,7 +41,7 @@ static inline void set_preempt_state(struct a6xx_gpu *gpu, }/* Write the most recent wptr for the given ring into the hardware */ -static inline void update_wptr (struct msm_gpu *gpu,struct msm_ringbuffer *ring) +static inline void update_wptr (struct a6xx_gpu *a6xx_gpu,struct msm_ringbuffer *ring) {unsigned long flags;uint32_t wptr;
@@ -51,7 +51,7 @@ static inline void update_wptr(struct msm_gpu *gpu, struct msm_ringbuffer *ring)if (ring->restore_wptr) { wptr =get_wptr (ring); -gpu_write (gpu,REG_A6XX_CP_RB_WPTR , wptr); +a6xx_fenced_write (a6xx_gpu,REG_A6XX_CP_RB_WPTR , wptr,BIT (0 ), false); ring->restore_wptr = false; }
@@ -172,7 +172,7 @@ void a6xx_preempt_irq(struct msm_gpu *gpu)set_preempt_state (a6xx_gpu,PREEMPT_FINISH ); -update_wptr (gpu, a6xx_gpu->cur_ring); +update_wptr (a6xx_gpu, a6xx_gpu->cur_ring);set_preempt_state (a6xx_gpu,PREEMPT_NONE );
@@ -268,7 +268,7 @@ void a6xx_preempt_trigger(struct msm_gpu *gpu)*/ if (!ring || (a6xx_gpu->cur_ring == ring)) {set_preempt_state (a6xx_gpu,PREEMPT_FINISH ); -update_wptr (gpu, a6xx_gpu->cur_ring); +update_wptr (a6xx_gpu, a6xx_gpu->cur_ring);set_preempt_state (a6xx_gpu,PREEMPT_NONE );spin_unlock_irqrestore (&a6xx_gpu->eval_lock, flags);return ;
@@ -302,13 +302,13 @@ void a6xx_preempt_trigger(struct msm_gpu *gpu)spin_unlock_irqrestore (&ring->preempt_lock, flags); -gpu_write64 (gpu, -REG_A6XX_CP_CONTEXT_SWITCH_SMMU_INFO , - a6xx_gpu->preempt_smmu_iova[ring->id]); +a6xx_fenced_write (a6xx_gpu, +REG_A6XX_CP_CONTEXT_SWITCH_SMMU_INFO , a6xx_gpu->preempt_smmu_iova[ring->id], +BIT (1 ), true); -gpu_write64 (gpu, +a6xx_fenced_write (a6xx_gpu,REG_A6XX_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR , - a6xx_gpu->preempt_iova[ring->id]); + a6xx_gpu->preempt_iova[ring->id],BIT (1 ), true); a6xx_gpu->next_ring = ring;
@@ -328,7 +328,7 @@ void a6xx_preempt_trigger(struct msm_gpu *gpu)set_preempt_state (a6xx_gpu,PREEMPT_TRIGGERED );/* Trigger the preemption */ -gpu_write (gpu,REG_A6XX_CP_CONTEXT_SWITCH_CNTL , cntl); +a6xx_fenced_write (a6xx_gpu,REG_A6XX_CP_CONTEXT_SWITCH_CNTL , cntl,BIT (1 ), false); } static int preempt_init_ring(struct a6xx_gpu *a6xx_gpu,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 476/849 drm/msm/a6xx: Switch to GMU AO counter
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil P Oommen <[email protected]>
[ Upstream commit f195421318bd00151b3a111af6f315a25c3438a8 ]
CP_ALWAYS_ON counter falls under GX domain which is collapsed during IFPC. So switch to GMU_ALWAYS_ON counter for any CPU reads since it is not impacted by IFPC. Both counters are clocked by same xo clock source.
Patchwork: https://patchwork.freedesktop.org/patch/673373/
--- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 30 ++++++++++++++------------- 1 file changed, 16 insertions(+), 14 deletions(-)
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +16 -14
@@ -16,6 +16,19 @@#define GPU_PAS_ID 13 +static u64 read_gmu_ao_counter (struct a6xx_gpu *a6xx_gpu) +{ +u64 count_hi, count_lo, temp; + +do { + count_hi =gmu_read (&a6xx_gpu->gmu,REG_A6XX_GMU_ALWAYS_ON_COUNTER_H ); + count_lo =gmu_read (&a6xx_gpu->gmu,REG_A6XX_GMU_ALWAYS_ON_COUNTER_L ); + temp =gmu_read (&a6xx_gpu->gmu,REG_A6XX_GMU_ALWAYS_ON_COUNTER_H ); + }while (unlikely (count_hi != temp)); + +return (count_hi <<32 ) | count_lo; +} +static bool fence_status_check (struct msm_gpu *gpu,u32 offset,u32 value,u32 status,u32 mask) {/* Success if !writedropped0/1 */
@@ -376,8 +389,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)OUT_RING (ring,upper_32_bits (rbmemptr (ring, fence)));OUT_RING (ring, submit->seqno); -trace_msm_gpu_submit_flush (submit, -gpu_read64 (gpu,REG_A6XX_CP_ALWAYS_ON_COUNTER )); +trace_msm_gpu_submit_flush (submit,read_gmu_ao_counter (a6xx_gpu));a6xx_flush (gpu, ring); }
@@ -577,8 +589,7 @@ static void a7xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit) } -trace_msm_gpu_submit_flush (submit, -gpu_read64 (gpu,REG_A6XX_CP_ALWAYS_ON_COUNTER )); +trace_msm_gpu_submit_flush (submit,read_gmu_ao_counter (a6xx_gpu));a6xx_flush (gpu, ring);
@@ -2260,16 +2271,7 @@ static int a6xx_gmu_get_timestamp(struct msm_gpu *gpu, uint64_t *value)struct adreno_gpu *adreno_gpu =to_adreno_gpu (gpu);struct a6xx_gpu *a6xx_gpu =to_a6xx_gpu (adreno_gpu); -mutex_lock (&a6xx_gpu->gmu.lock); - -/* Force the GPU power on so we can read this register */ -a6xx_gmu_set_oob (&a6xx_gpu->gmu,GMU_OOB_PERFCOUNTER_SET ); - - *value =gpu_read64 (gpu,REG_A6XX_CP_ALWAYS_ON_COUNTER ); - -a6xx_gmu_clear_oob (&a6xx_gpu->gmu,GMU_OOB_PERFCOUNTER_SET ); - -mutex_unlock (&a6xx_gpu->gmu.lock); + *value =read_gmu_ao_counter (a6xx_gpu);return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 477/849 idpf: link NAPIs to queues
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Lobakin <[email protected]>
[ Upstream commit bd74a86bc75d35adefbebcec7c3a743d02c06230 ]
Add the missing linking of NAPIs to netdev queues when enabling interrupt vectors in order to support NAPI configuration and interfaces requiring get_rx_queue()->napi to be set (like XSk busy polling).
As currently, idpf_vport_{start,stop}() is called from several flows with inconsistent RTNL locking, we need to synchronize them to avoid runtime assertions. Notably:
* idpf_{open,stop}() -- regular NDOs, RTNL is always taken;
* idpf_initiate_soft_reset() -- usually called under RTNL;
* idpf_init_task -- called from the init work, needs RTNL;
* idpf_vport_dealloc -- called without RTNL taken, needs it.
Expand common idpf_vport_{start,stop}() to take an additional bool telling whether we need to manually take the RTNL lock.
--- drivers/net/ethernet/intel/idpf/idpf_lib.c | 38 +++++++++++++++------ drivers/net/ethernet/intel/idpf/idpf_txrx.c | 17 +++++++++ 2 files changed, 45 insertions(+), 10 deletions(-)
drivers/net/ethernet/intel/idpf/idpf_lib.c +28 -10
@@ -884,14 +884,18 @@ static void idpf_remove_features(struct idpf_vport *vport)/** * idpf_vport_stop - Disable a vport * @vport: vport to disable +* @rtnl: whether to take RTNL lock */ -static void idpf_vport_stop (struct idpf_vport *vport) +static void idpf_vport_stop (struct idpf_vport *vport,bool rtnl) {struct idpf_netdev_priv *np =netdev_priv (vport->netdev);if (np->state <= __IDPF_VPORT_DOWN)return ; +if (rtnl) +rtnl_lock (); +netif_carrier_off (vport->netdev);netif_tx_disable (vport->netdev);
@@ -913,6 +917,9 @@ static void idpf_vport_stop(struct idpf_vport *vport)idpf_vport_queues_rel (vport);idpf_vport_intr_rel (vport); np->state = __IDPF_VPORT_DOWN; + +if (rtnl) +rtnl_unlock (); }/**
@@ -936,7 +943,7 @@ static int idpf_stop(struct net_device *netdev)idpf_vport_ctrl_lock (netdev); vport =idpf_netdev_to_vport (netdev); -idpf_vport_stop (vport); +idpf_vport_stop (vport, false);idpf_vport_ctrl_unlock (netdev);
@@ -1029,7 +1036,7 @@ static void idpf_vport_dealloc(struct idpf_vport *vport)idpf_idc_deinit_vport_aux_device (vport->vdev_info);idpf_deinit_mac_addr (vport); -idpf_vport_stop (vport); +idpf_vport_stop (vport, true);if (!test_bit (IDPF_HR_RESET_IN_PROG , adapter->flags))idpf_decfg_netdev (vport);
@@ -1370,8 +1377,9 @@ static void idpf_rx_init_buf_tail(struct idpf_vport *vport)/** * idpf_vport_open - Bring up a vport * @vport: vport to bring up +* @rtnl: whether to take RTNL lock */ -static int idpf_vport_open (struct idpf_vport *vport) +static int idpf_vport_open (struct idpf_vport *vport,bool rtnl) {struct idpf_netdev_priv *np =netdev_priv (vport->netdev);struct idpf_adapter *adapter = vport->adapter;
@@ -1381,6 +1389,9 @@ static int idpf_vport_open(struct idpf_vport *vport)if (np->state != __IDPF_VPORT_DOWN)return -EBUSY ; +if (rtnl) +rtnl_lock (); +/* we do not allow interface up just yet */ netif_carrier_off (vport->netdev);
@@ -1388,7 +1399,7 @@ static int idpf_vport_open(struct idpf_vport *vport)if (err) {dev_err (&adapter->pdev->dev,"Failed to allocate interrupts for vport %u: %d\n" , vport->vport_id, err); -return err; + goto err_rtnl_unlock; } err =idpf_vport_queues_alloc (vport);
@@ -1475,6 +1486,9 @@ static int idpf_vport_open(struct idpf_vport *vport) goto deinit_rss; } +if (rtnl) +rtnl_unlock (); +return 0 ; deinit_rss:
@@ -1492,6 +1506,10 @@ static int idpf_vport_open(struct idpf_vport *vport) intr_rel:idpf_vport_intr_rel (vport); +err_rtnl_unlock: +if (rtnl) +rtnl_unlock (); +return err; }
@@ -1572,7 +1590,7 @@ void idpf_init_task(struct work_struct *work) np =netdev_priv (vport->netdev); np->state = __IDPF_VPORT_DOWN;if (test_and_clear_bit (IDPF_VPORT_UP_REQUESTED , vport_config->flags)) -idpf_vport_open (vport); +idpf_vport_open (vport, true);/* Spawn and return 'idpf_init_task' work queue until all the * default vports are created
@@ -1962,7 +1980,7 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport,idpf_send_delete_queues_msg (vport); }else {set_bit (IDPF_VPORT_DEL_QUEUES , vport->flags); -idpf_vport_stop (vport); +idpf_vport_stop (vport, false); }idpf_deinit_rss (vport);
@@ -1992,7 +2010,7 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport, goto err_open;if (current_state == __IDPF_VPORT_UP) - err =idpf_vport_open (vport); + err =idpf_vport_open (vport, false); goto free_vport;
@@ -2002,7 +2020,7 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport, err_open:if (current_state == __IDPF_VPORT_UP) -idpf_vport_open (vport); +idpf_vport_open (vport, false); free_vport:kfree (new_vport);
@@ -2240,7 +2258,7 @@ static int idpf_open(struct net_device *netdev)if (err) goto unlock; - err =idpf_vport_open (vport); + err =idpf_vport_open (vport, false); unlock:idpf_vport_ctrl_unlock (netdev);
drivers/net/ethernet/intel/idpf/idpf_txrx.c +17 -0
@@ -3430,6 +3430,20 @@ void idpf_vport_intr_rel(struct idpf_vport *vport) vport->q_vectors =NULL ; } +static void idpf_q_vector_set_napi (struct idpf_q_vector *q_vector,bool link) +{ +struct napi_struct *napi = link ? &q_vector->napi :NULL ; +struct net_device *dev = q_vector->vport->netdev; + +for (u32 i =0 ; i < q_vector->num_rxq; i++) +netif_queue_set_napi (dev, q_vector->rx[i]->idx, +NETDEV_QUEUE_TYPE_RX , napi); + +for (u32 i =0 ; i < q_vector->num_txq; i++) +netif_queue_set_napi (dev, q_vector->tx[i]->idx, +NETDEV_QUEUE_TYPE_TX , napi); +} +/** * idpf_vport_intr_rel_irq - Free the IRQ association with the OS * @vport: main vport structure
@@ -3450,6 +3464,7 @@ static void idpf_vport_intr_rel_irq(struct idpf_vport *vport) vidx = vport->q_vector_idxs[vector]; irq_num = adapter->msix_entries[vidx].vector; +idpf_q_vector_set_napi (q_vector, false);kfree (free_irq (irq_num, q_vector)); } }
@@ -3637,6 +3652,8 @@ static int idpf_vport_intr_req_irq(struct idpf_vport *vport) "Request_irq failed, error: %d\n", err); goto free_q_irqs; } + +idpf_q_vector_set_napi (q_vector, true); }return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 478/849 selftests: net: make the dump test less sensitive to mem accounting
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 27bc5eaf004c437309dee1b9af24806262631d57 ]
Recent changes to make netlink socket memory accounting must have broken the implicit assumption of the netlink-dump test that we can fit exactly 64 dumps into the socket. Handle the failure mode properly, and increase the dump count to 80 to make sure we still run into the error condition if the default buffer size increases in the future.
--- tools/testing/selftests/net/netlink-dumps.c | 43 ++++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-)
tools/testing/selftests/net/netlink-dumps.c +33 -10
@@ -31,9 +31,18 @@ struct ext_ack {const char *str; }; -/* 0: no done, 1: done found, 2: extack found, -1: error */ -static int nl_get_extack (char *buf,size_t n,struct ext_ack *ea) +enum get_ea_ret { +ERROR =-1 , +NO_CTRL =0 , +FOUND_DONE , +FOUND_ERR , +FOUND_EXTACK , +}; + +static enum get_ea_ret +nl_get_extack (char *buf,size_t n,struct ext_ack *ea) { +enum get_ea_ret ret =NO_CTRL ;const struct nlmsghdr *nlh;const struct nlattr *attr;ssize_t rem;
@@ -41,15 +50,19 @@ static int nl_get_extack(char *buf, size_t n, struct ext_ack *ea)for (rem = n; rem >0 ;NLMSG_NEXT (nlh, rem)) { nlh = (struct nlmsghdr *)&buf[n - rem];if (!NLMSG_OK (nlh, rem)) -return -1 ; +return ERROR ; -if (nlh->nlmsg_type !=NLMSG_DONE ) +if (nlh->nlmsg_type ==NLMSG_ERROR ) + ret =FOUND_ERR ; +else if (nlh->nlmsg_type ==NLMSG_DONE ) + ret =FOUND_DONE ; +else continue ; ea->err = -*(int *)NLMSG_DATA (nlh);if (!(nlh->nlmsg_flags &NLM_F_ACK_TLVS )) -return 1 ; +return ret;ynl_attr_for_each (attr, nlh,sizeof (int )) {switch (ynl_attr_type (attr)) {
@@ -68,10 +81,10 @@ static int nl_get_extack(char *buf, size_t n, struct ext_ack *ea) } } -return 2 ; +return FOUND_EXTACK ; } -return 0 ; +return ret; } static const struct {
@@ -99,9 +112,9 @@ static const struct {TEST (dump_extack) {int netlink_sock; +int i, cnt, ret;char buf[8192 ];int one =1 ; -int i, cnt;ssize_t n; netlink_sock =socket (AF_NETLINK ,SOCK_RAW ,NETLINK_ROUTE );
@@ -118,7 +131,7 @@ TEST(dump_extack)ASSERT_EQ (n,0 );/* Dump so many times we fill up the buffer */ - cnt =64 ; + cnt =80 ;for (i =0 ; i < cnt; i++) { n =send (netlink_sock, &dump_neigh_bad,sizeof (dump_neigh_bad),0 );
@@ -140,10 +153,20 @@ TEST(dump_extack) }ASSERT_GE (n, (ssize_t )sizeof (struct nlmsghdr )); -EXPECT_EQ (nl_get_extack (buf, n, &ea),2 ); + ret =nl_get_extack (buf, n, &ea); +/* Once we fill the buffer we'll see one ENOBUFS followed +* by a number of EBUSYs. Then the last recv() will finally +* trigger and complete the dump. +*/ +if (ret ==FOUND_ERR && (ea.err ==ENOBUFS || ea.err ==EBUSY )) +continue ; +EXPECT_EQ (ret,FOUND_EXTACK ); +EXPECT_EQ (ea.err,EINVAL );EXPECT_EQ (ea.attr_offs,sizeof (struct nlmsghdr ) +sizeof (struct ndmsg )); } +/* Make sure last message was a full DONE+extack */ +EXPECT_EQ (ret,FOUND_EXTACK ); } static const struct {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 479/849 PCI: endpoint: pci-epf-test: Limit PCIe BAR size for fixed BARs
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Vasut <[email protected]>
[ Upstream commit d5f6bd3ee3f5048f272182dc91675c082773999e ]
Currently, the test allocates BAR sizes according to fixed table bar_size. This does not work with controllers which have fixed size BARs that are smaller than the requested BAR size. One such controller is Renesas R-Car V4H PCIe controller, which has BAR4 size limited to 256 bytes, which is much less than one of the BAR size, 131072 currently requested by this test. A lot of controllers drivers in-tree have fixed size BARs, and they do work perfectly fine, but it is only because their fixed size is larger than the size requested by pci-epf-test.c
Adjust the test such that in case a fixed size BAR is detected, the fixed BAR size is used, as that is the only possible option.
This helps with test failures reported as follows:
pci_epf_test pci_epf_test.0: requested BAR size is larger than fixed size pci_epf_test pci_epf_test.0: Failed to allocate space for BAR4
--- drivers/pci/endpoint/functions/pci-epf-test.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/pci/endpoint/functions/pci-epf-test.c +6 -1
@@ -1067,7 +1067,12 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)if (bar == test_reg_bar)continue ; - base =pci_epf_alloc_space (epf, bar_size[bar], bar, +if (epc_features->bar[bar].type ==BAR_FIXED ) + test_reg_size = epc_features->bar[bar].fixed_size; +else + test_reg_size = bar_size[bar]; + + base =pci_epf_alloc_space (epf, test_reg_size, bar, epc_features,PRIMARY_INTERFACE );if (!base) dev_err(dev, "Failed to allocate space for BAR%d\n",
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 480/849 wifi: rtw89: Add USB ID 2001:332a for D-Link AX9U rev. A1
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zenm Chen <[email protected]>
[ Upstream commit 2ffc73cdb8247dc09b6534c4018681a126c1d5f5 ]
Add USB ID 2001:332a for D-Link AX9U rev. A1 which is a RTL8851BU-based Wi-Fi adapter.
Only managed mode and AP mode are tested and it works in both.
--- drivers/net/wireless/realtek/rtw89/rtw8851bu.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/realtek/rtw89/rtw8851bu.c +3 -0
@@ -16,6 +16,9 @@ static const struct rtw89_driver_info rtw89_8851bu_info = {static const struct usb_device_id rtw_8851bu_id_table[] = { {USB_DEVICE_AND_INTERFACE_INFO (0x0bda ,0xb851 ,0xff ,0xff ,0xff ), .driver_info = (kernel_ulong_t)&rtw89_8851bu_info }, +/* D-Link AX9U rev. A1 */ + {USB_DEVICE_AND_INTERFACE_INFO (0x2001 ,0x332a ,0xff ,0xff ,0xff ), + .driver_info = (kernel_ulong_t)&rtw89_8851bu_info },/* TP-Link Archer TX10UB Nano */ {USB_DEVICE_AND_INTERFACE_INFO (0x3625 ,0x010b ,0xff ,0xff ,0xff ), .driver_info = (kernel_ulong_t)&rtw89_8851bu_info },
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 481/849 wifi: rtw89: Add USB ID 2001:3327 for D-Link AX18U rev. A1
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zenm Chen <[email protected]>
[ Upstream commit 17002412a82feb21be040bd5577789049dfeebe2 ]
Add USB ID 2001:3327 for D-Link AX18U rev. A1 which is a RTL8832BU-based Wi-Fi adapter.
--- drivers/net/wireless/realtek/rtw89/rtw8852bu.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/realtek/rtw89/rtw8852bu.c +2 -0
@@ -30,6 +30,8 @@ static const struct usb_device_id rtw_8852bu_id_table[] = { .driver_info = (kernel_ulong_t)&rtw89_8852bu_info }, { USB_DEVICE_AND_INTERFACE_INFO(0x0db0, 0x6931, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t)&rtw89_8852bu_info }, + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3327, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&rtw89_8852bu_info }, { USB_DEVICE_AND_INTERFACE_INFO(0x3574, 0x6121, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t)&rtw89_8852bu_info }, { USB_DEVICE_AND_INTERFACE_INFO(0x35bc, 0x0100, 0xff, 0xff, 0xff),
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 482/849 wifi: iwlwifi: fw: Add ASUS to PPAG and TAS list
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nidhish A N <[email protected]>
[ Upstream commit c5318e6e1c6436ce35ba521d96975e13cc5119f7 ]
Add ASUS to the list of OEMs that are allowed to use the PPAG and TAS feature.
--- drivers/net/wireless/intel/iwlwifi/fw/regulatory.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/net/wireless/intel/iwlwifi/fw/regulatory.c +12 -2
@@ -59,11 +59,16 @@ static const struct dmi_system_id dmi_ppag_approved_list[] = {DMI_MATCH (DMI_SYS_VENDOR ,"Microsoft Corporation" ), }, }, - { .ident = "ASUS", + { .ident = "ASUSTEK", .matches = {DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), }, }, + { .ident = "ASUS", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"ASUS" ), + }, + }, { .ident = "GOOGLE-HP", .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Google"),
@@ -141,11 +146,16 @@ static const struct dmi_system_id dmi_tas_approved_list[] = {DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), }, }, - { .ident = "ASUS", + { .ident = "ASUSTEK", .matches = {DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), }, }, + { .ident = "ASUS", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"ASUS" ), + }, + }, { .ident = "GOOGLE-HP", .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Google"),
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 483/849 drm/xe/i2c: Enable bus mastering
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Raag Jadav <[email protected]>
[ Upstream commit fce99326c9cf5a0e57c4283a61c6b622ef5b0de8 ]
Enable bus mastering for I2C controller to support device initiated in-band transactions.
--- drivers/gpu/drm/xe/xe_i2c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_i2c.c +1 -1
@@ -245,7 +245,7 @@ void xe_i2c_pm_resume(struct xe_device *xe, bool d3cold)return ;if (d3cold) -xe_mmio_rmw32 (mmio,I2C_CONFIG_CMD ,0 ,PCI_COMMAND_MEMORY ); +xe_mmio_rmw32 (mmio,I2C_CONFIG_CMD ,0 ,PCI_COMMAND_MEMORY |PCI_COMMAND_MASTER );xe_mmio_rmw32 (mmio,I2C_CONFIG_PMCSR ,PCI_PM_CTRL_STATE_MASK , (__force u32 )PCI_D0 );drm_dbg (&xe->drm,"pmcsr: 0x%08x\n" ,xe_mmio_read32 (mmio,I2C_CONFIG_PMCSR ));
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 484/849 media: ov08x40: Fix the horizontal flip control
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hao Yao <[email protected]>
[ Upstream commit c7df6f339af94689fdc433887f9fbb480bf8a4ed ]
The datasheet of ov08x40 doesn't match the hardware behavior. 0x3821[2] == 1 is the original state and 0 the horizontal flip enabled.
--- drivers/media/i2c/ov08x40.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/i2c/ov08x40.c +1 -1
@@ -1648,7 +1648,7 @@ static int ov08x40_set_ctrl_hflip(struct ov08x40 *ov08x, u32 ctrl_val)return ov08x40_write_reg (ov08x,OV08X40_REG_MIRROR ,OV08X40_REG_VALUE_08BIT , - ctrl_val ? val |BIT (2 ) : val & ~BIT (2 )); + ctrl_val ? val & ~BIT (2 ) : val |BIT (2 )); }static int ov08x40_set_ctrl_vflip (struct ov08x40 *ov08x,u32 ctrl_val)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 485/849 media: i2c: og01a1b: Specify monochrome media bus format instead of Bayer
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Zapolskiy <[email protected]>
[ Upstream commit bfbd5aa5347fbd11ade188b316b800bfb27d9e22 ]
The OmniVision OG01A1B image sensor is a monochrome sensor, it supports 8-bit and 10-bit RAW output formats only.
That said the planar greyscale Y8/Y10 media formats are more appropriate for the sensor instead of the originally and arbitrary selected SGRBG one, since there is no red, green or blue color components.
--- drivers/media/i2c/og01a1b.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/media/i2c/og01a1b.c +3 -3
@@ -682,7 +682,7 @@ static void og01a1b_update_pad_format(const struct og01a1b_mode *mode, { fmt->width = mode->width; fmt->height = mode->height; - fmt->code =MEDIA_BUS_FMT_SGRBG10_1X10 ; + fmt->code =MEDIA_BUS_FMT_Y10_1X10 ; fmt->field =V4L2_FIELD_NONE ; }
@@ -828,7 +828,7 @@ static int og01a1b_enum_mbus_code(struct v4l2_subdev *sd,if (code->index >0 )return -EINVAL ; - code->code =MEDIA_BUS_FMT_SGRBG10_1X10 ; + code->code =MEDIA_BUS_FMT_Y10_1X10 ;return 0 ; }
@@ -840,7 +840,7 @@ static int og01a1b_enum_frame_size(struct v4l2_subdev *sd,if (fse->index >=ARRAY_SIZE (supported_modes))return -EINVAL ; -if (fse->code !=MEDIA_BUS_FMT_SGRBG10_1X10 ) +if (fse->code !=MEDIA_BUS_FMT_Y10_1X10 )return -EINVAL ; fse->min_width = supported_modes[fse->index].width;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 486/849 media: qcom: camss: csiphy-3ph: Add CSIPHY 2ph DPHY v2.0.1 init sequence
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Loic Poulain <[email protected]>
[ Upstream commit ce63fbdf849f52584d9b5d9a4cc23cbc88746c30 ]
This is the CSI PHY version found in QCS2290/QCM2290 SoCs. The table is extracted from downstream camera driver.
--- .../qcom/camss/camss-csiphy-3ph-1-0.c | 89 +++++++++++++++++++ drivers/media/platform/qcom/camss/camss.h | 1 + 2 files changed, 90 insertions(+)
drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c +89 -0
@@ -319,6 +319,90 @@ csiphy_lane_regs lane_regs_sm8250[] = { {0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, }; +/* 14nm 2PH v 2.0.1 2p5Gbps 4 lane DPHY mode */ +static const struct +csiphy_lane_regs lane_regs_qcm2290[] = { + {0x0030 ,0x02 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x002c ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0034 ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0028 ,0x04 ,0x00 ,CSIPHY_DNP_PARAMS }, + {0x003c ,0xb8 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x001c ,0x0a ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0000 ,0xd7 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0004 ,0x08 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0020 ,0x00 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0008 ,0x04 ,0x00 ,CSIPHY_SETTLE_CNT_LOWER_BYTE }, + {0x000c ,0xff ,0x00 ,CSIPHY_DNP_PARAMS }, + {0x0010 ,0x50 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0038 ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0060 ,0x00 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0064 ,0x3f ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + + {0x0730 ,0x02 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x072c ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0734 ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0728 ,0x04 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x073c ,0xb8 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x071c ,0x0a ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0700 ,0xc0 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0704 ,0x08 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0720 ,0x00 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0708 ,0x04 ,0x00 ,CSIPHY_SETTLE_CNT_LOWER_BYTE }, + {0x070c ,0xff ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0710 ,0x50 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0738 ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0760 ,0x00 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0764 ,0x3f ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + + {0x0230 ,0x02 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x022c ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0234 ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0228 ,0x04 ,0x00 ,CSIPHY_DNP_PARAMS }, + {0x023c ,0xb8 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x021c ,0x0a ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0200 ,0xd7 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0204 ,0x08 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0220 ,0x00 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0208 ,0x04 ,0x00 ,CSIPHY_SETTLE_CNT_LOWER_BYTE }, + {0x020c ,0xff ,0x00 ,CSIPHY_DNP_PARAMS }, + {0x0210 ,0x50 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0238 ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0260 ,0x00 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0264 ,0x3f ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + + {0x0430 ,0x02 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x042c ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0434 ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0428 ,0x04 ,0x00 ,CSIPHY_DNP_PARAMS }, + {0x043c ,0xb8 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x041c ,0x0a ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0400 ,0xd7 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0404 ,0x08 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0420 ,0x00 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0408 ,0x04 ,0x00 ,CSIPHY_SETTLE_CNT_LOWER_BYTE }, + {0x040C ,0xff ,0x00 ,CSIPHY_DNP_PARAMS }, + {0x0410 ,0x50 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0438 ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0460 ,0x00 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0464 ,0x3f ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + + {0x0630 ,0x02 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x062c ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0634 ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0628 ,0x04 ,0x00 ,CSIPHY_DNP_PARAMS }, + {0x063c ,0xb8 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x061c ,0x0a ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0600 ,0xd7 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0604 ,0x08 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0620 ,0x00 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0608 ,0x04 ,0x00 ,CSIPHY_SETTLE_CNT_LOWER_BYTE }, + {0x060C ,0xff ,0x00 ,CSIPHY_DNP_PARAMS }, + {0x0610 ,0x50 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0638 ,0x01 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0660 ,0x00 ,0x00 ,CSIPHY_DEFAULT_PARAMS }, + {0x0664 ,0x3f ,0x00 ,CSIPHY_DEFAULT_PARAMS }, +}; +/* GEN2 2.1.2 2PH DPHY mode */ static const struct csiphy_lane_regs lane_regs_sm8550[] = {
@@ -744,6 +828,7 @@ static bool csiphy_is_gen2(u32 version)bool ret = false;switch (version) { +case CAMSS_2290 :case CAMSS_7280 :case CAMSS_8250 :case CAMSS_8280XP :
@@ -829,6 +914,10 @@ static int csiphy_init(struct csiphy_device *csiphy) regs->lane_regs = &lane_regs_sdm845[0 ]; regs->lane_array_size =ARRAY_SIZE (lane_regs_sdm845);break ; +case CAMSS_2290 : + regs->lane_regs = &lane_regs_qcm2290[0 ]; + regs->lane_array_size =ARRAY_SIZE (lane_regs_qcm2290); +break ;case CAMSS_7280 :case CAMSS_8250 : regs->lane_regs = &lane_regs_sm8250[0 ];
drivers/media/platform/qcom/camss/camss.h +1 -0
@@ -78,6 +78,7 @@ enum pm_domain {enum camss_version {CAMSS_660 , +CAMSS_2290 ,CAMSS_7280 , CAMSS_8x16, CAMSS_8x53,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 487/849 drm/bridge: write full Audio InfoFrame
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit f0e7f358e72b10b01361787134ebcbd9e9aa72d9 ]
Instead of writing the first byte of the infoframe (and hoping that the rest is default / zeroes), hook Audio InfoFrame support into the write_infoframe / clear_infoframes callbacks and use drm_atomic_helper_connector_hdmi_update_audio_infoframe() to write the frame.
--- .../gpu/drm/bridge/adv7511/adv7511_audio.c | 23 +++++-------------- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 18 +++++++++++++++ 2 files changed, 24 insertions(+), 17 deletions(-)
drivers/gpu/drm/bridge/adv7511/adv7511_audio.c +6 -17
@@ -12,6 +12,8 @@#include <sound/soc.h> #include <linux/of_graph.h> +#include <drm/display/drm_hdmi_state_helper.h> +#include "adv7511.h" static void adv7511_calc_cts_n(unsigned int f_tmds, unsigned int fs,
@@ -155,17 +157,8 @@ int adv7511_hdmi_audio_prepare(struct drm_bridge *bridge,regmap_update_bits (adv7511->regmap,ADV7511_REG_I2C_FREQ_ID_CFG ,ADV7511_I2C_FREQ_ID_CFG_RATE_MASK , rate <<4 ); -/* send current Audio infoframe values while updating */ -regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE , -BIT (5 ),BIT (5 )); - -regmap_write (adv7511->regmap,ADV7511_REG_AUDIO_INFOFRAME (0 ),0x1 ); - -/* use Audio infoframe updated info */ -regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE , -BIT (5 ),0 ); - -return 0 ; +return drm_atomic_helper_connector_hdmi_update_audio_infoframe (connector, + &hparms->cea); } int adv7511_hdmi_audio_startup(struct drm_bridge *bridge,
@@ -188,15 +181,9 @@ int adv7511_hdmi_audio_startup(struct drm_bridge *bridge,/* not copyrighted */ regmap_update_bits (adv7511->regmap,ADV7511_REG_AUDIO_CFG1 ,BIT (5 ),BIT (5 )); -/* enable audio infoframes */ -regmap_update_bits (adv7511->regmap,ADV7511_REG_PACKET_ENABLE1 , -BIT (3 ),BIT (3 ));/* AV mute disable */ regmap_update_bits (adv7511->regmap,ADV7511_REG_GC (0 ),BIT (7 ) |BIT (6 ),BIT (7 )); -/* use Audio infoframe updated info */ -regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE , -BIT (5 ),0 );/* enable SPDIF receiver */ if (adv7511->audio_source ==ADV7511_AUDIO_SOURCE_SPDIF )
@@ -214,4 +201,6 @@ void adv7511_hdmi_audio_shutdown(struct drm_bridge *bridge,if (adv7511->audio_source ==ADV7511_AUDIO_SOURCE_SPDIF )regmap_update_bits (adv7511->regmap,ADV7511_REG_AUDIO_CONFIG ,BIT (7 ),0 ); + +drm_atomic_helper_connector_hdmi_clear_audio_infoframe (connector); }
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +18 -0
@@ -886,6 +886,9 @@ static int adv7511_bridge_hdmi_clear_infoframe(struct drm_bridge *bridge,struct adv7511 *adv7511 =bridge_to_adv7511 (bridge);switch (type) { +case HDMI_INFOFRAME_TYPE_AUDIO : +adv7511_packet_disable (adv7511,ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME ); +break ;case HDMI_INFOFRAME_TYPE_AVI :adv7511_packet_disable (adv7511,ADV7511_PACKET_ENABLE_AVI_INFOFRAME );break ;
@@ -906,6 +909,21 @@ static int adv7511_bridge_hdmi_write_infoframe(struct drm_bridge *bridge,adv7511_bridge_hdmi_clear_infoframe (bridge, type);switch (type) { +case HDMI_INFOFRAME_TYPE_AUDIO : +/* send current Audio infoframe values while updating */ +regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE , +BIT (5 ),BIT (5 )); + +/* The Audio infoframe id is not configurable */ +regmap_bulk_write (adv7511->regmap,ADV7511_REG_AUDIO_INFOFRAME_VERSION , + buffer +1 , len -1 ); + +/* use Audio infoframe updated info */ +regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE , +BIT (5 ),0 ); + +adv7511_packet_enable (adv7511,ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME ); +break ;case HDMI_INFOFRAME_TYPE_AVI :/* The AVI infoframe id is not configurable */ regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 488/849 drm/xe/guc: Always add CT disable action during second init step
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Wajdeczko <[email protected]>
[ Upstream commit 955f3bc4af440bb950c7a1567197aaf6aa2213ae ]
On DGFX, during init_post_hwconfig() step, we are reinitializing CTB BO in VRAM and we have to replace cleanup action to disable CT communication prior to release of underlying BO.
But that introduces some discrepancy between DGFX and iGFX, as for iGFX we keep previously added disable CT action that would be called during unwind much later.
To keep the same flow on both types of platforms, always replace old cleanup action and register new one.
--- drivers/gpu/drm/xe/xe_guc_ct.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/gpu/drm/xe/xe_guc_ct.c +5 -6
@@ -300,12 +300,11 @@ int xe_guc_ct_init_post_hwconfig(struct xe_guc_ct *ct)xe_assert (xe, !xe_guc_ct_enabled (ct)); -if (!IS_DGFX (xe)) -return 0 ; - - ret =xe_managed_bo_reinit_in_vram (xe, tile, &ct->bo); -if (ret) -return ret; +if (IS_DGFX (xe)) { + ret =xe_managed_bo_reinit_in_vram (xe, tile, &ct->bo); +if (ret) +return ret; + }devm_release_action (xe->drm.dev, guc_action_disable_ct, ct);return devm_add_action_or_reset (xe->drm.dev, guc_action_disable_ct, ct);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 489/849 f2fs: fix wrong layout information on 16KB page
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jaegeuk Kim <[email protected]>
[ Upstream commit a33be64b98d0723748d2fab0832b926613e1fce0 ]
This patch fixes to support different block size.
--- fs/f2fs/sysfs.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
fs/f2fs/sysfs.c +6 -3
@@ -1723,12 +1723,15 @@ static int __maybe_unused disk_map_seq_show(struct seq_file *seq,seq_printf (seq," Main : 0x%010x (%10d)\n" ,SM_I (sbi)->main_blkaddr,le32_to_cpu (F2FS_RAW_SUPER (sbi)->segment_count_main)); -seq_printf (seq," # of Sections : %12d\n" , -le32_to_cpu (F2FS_RAW_SUPER (sbi)->section_count)); +seq_printf (seq," Block size : %12lu KB\n" ,F2FS_BLKSIZE >>10 ); +seq_printf (seq," Segment size : %12d MB\n" , + (BLKS_PER_SEG (sbi) << (F2FS_BLKSIZE_BITS -10 )) >>10 );seq_printf (seq," Segs/Sections : %12d\n" ,SEGS_PER_SEC (sbi));seq_printf (seq," Section size : %12d MB\n" , -SEGS_PER_SEC (sbi) <<1 ); + (BLKS_PER_SEC (sbi) << (F2FS_BLKSIZE_BITS -10 )) >>10 ); +seq_printf (seq," # of Sections : %12d\n" , +le32_to_cpu (F2FS_RAW_SUPER (sbi)->section_count));if (!f2fs_is_multi_device (sbi))return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 490/849 drm/amdgpu: validate userq input args
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Prike Liang <[email protected]>
[ Upstream commit 219be4711a1ba788bc2a9fafc117139d133e5fea ]
This will help on validating the userq input args, and rejecting for the invalid userq request at the IOCTLs first place.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 81 +++++++++++++++------- drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 7 -- 2 files changed, 56 insertions(+), 32 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c +56 -25
@@ -404,27 +404,10 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args) (args->in.flags &AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_MASK ) >>AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_SHIFT ; -/* Usermode queues are only supported for GFX IP as of now */ -if (args->in.ip_type !=AMDGPU_HW_IP_GFX && - args->in.ip_type !=AMDGPU_HW_IP_DMA && - args->in.ip_type !=AMDGPU_HW_IP_COMPUTE ) { -drm_file_err (uq_mgr->file,"Usermode queue doesn't support IP type %u\n" , - args->in.ip_type); -return -EINVAL ; - } - r =amdgpu_userq_priority_permit (filp, priority);if (r)return r; -if ((args->in.flags &AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE ) && - (args->in.ip_type !=AMDGPU_HW_IP_GFX ) && - (args->in.ip_type !=AMDGPU_HW_IP_COMPUTE ) && - !amdgpu_is_tmz (adev)) { -drm_file_err (uq_mgr->file,"Secure only supported on GFX/Compute queues\n" ); -return -EINVAL ; - } - r =pm_runtime_get_sync (adev_to_drm (adev)->dev);if (r <0 ) {drm_file_err (uq_mgr->file,"pm_runtime_get_sync() failed for userqueue create\n" );
@@ -543,22 +526,45 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)return r; } -int amdgpu_userq_ioctl (struct drm_device *dev,void *data, -struct drm_file *filp) +static int amdgpu_userq_input_args_validate (struct drm_device *dev, +union drm_amdgpu_userq *args, +struct drm_file *filp) { -union drm_amdgpu_userq *args = data; -int r; +struct amdgpu_device *adev =drm_to_adev (dev);switch (args->in.op) {case AMDGPU_USERQ_OP_CREATE :if (args->in.flags & ~(AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_MASK |AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE ))return -EINVAL ; - r =amdgpu_userq_create (filp, args); -if (r) -drm_file_err (filp,"Failed to create usermode queue\n" ); -break ; +/* Usermode queues are only supported for GFX IP as of now */ +if (args->in.ip_type !=AMDGPU_HW_IP_GFX && + args->in.ip_type !=AMDGPU_HW_IP_DMA && + args->in.ip_type !=AMDGPU_HW_IP_COMPUTE ) { +drm_file_err (filp,"Usermode queue doesn't support IP type %u\n" , + args->in.ip_type); +return -EINVAL ; + } + +if ((args->in.flags &AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE ) && + (args->in.ip_type !=AMDGPU_HW_IP_GFX ) && + (args->in.ip_type !=AMDGPU_HW_IP_COMPUTE ) && + !amdgpu_is_tmz (adev)) { +drm_file_err (filp,"Secure only supported on GFX/Compute queues\n" ); +return -EINVAL ; + } +if (args->in.queue_va ==AMDGPU_BO_INVALID_OFFSET || + args->in.queue_va ==0 || + args->in.queue_size ==0 ) { +drm_file_err (filp,"invalidate userq queue va or size\n" ); +return -EINVAL ; + } +if (!args->in.wptr_va || !args->in.rptr_va) { +drm_file_err (filp,"invalidate userq queue rptr or wptr\n" ); +return -EINVAL ; + } +break ;case AMDGPU_USERQ_OP_FREE : if (args->in.ip_type || args->in.doorbell_handle ||
@@ -572,6 +578,31 @@ int amdgpu_userq_ioctl(struct drm_device *dev, void *data, args->in.mqd || args->in.mqd_size) return -EINVAL; +break ; +default : +return -EINVAL ; + } + +return 0 ; +} + +int amdgpu_userq_ioctl (struct drm_device *dev,void *data, +struct drm_file *filp) +{ +union drm_amdgpu_userq *args = data; +int r; + +if (amdgpu_userq_input_args_validate (dev, args, filp) <0 ) +return -EINVAL ; + +switch (args->in.op) { +case AMDGPU_USERQ_OP_CREATE : + r =amdgpu_userq_create (filp, args); +if (r) +drm_file_err (filp,"Failed to create usermode queue\n" ); +break ; + +case AMDGPU_USERQ_OP_FREE : r =amdgpu_userq_destroy (filp, args->in.queue_id);if (r)drm_file_err (filp,"Failed to destroy usermode queue\n" );
drivers/gpu/drm/amd/amdgpu/mes_userqueue.c +0 -7
@@ -215,13 +215,6 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr,return -ENOMEM ; } -if (!mqd_user->wptr_va || !mqd_user->rptr_va || - !mqd_user->queue_va || mqd_user->queue_size ==0 ) { -DRM_ERROR ("Invalid MQD parameters for userqueue\n" ); - r = -EINVAL ; - goto free_props; - } - r =amdgpu_userq_create_object (uq_mgr, &queue->mqd, mqd_hw_default->mqd_size);if (r) {DRM_ERROR ("Failed to create MQD object for userqueue\n" );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 491/849 selftests: mptcp: join: allow more time to send ADD_ADDR
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
[ Upstream commit e2cda6343bfe459c3331db5afcd675ab333112dd ]
When many ADD_ADDR need to be sent, it can take some time to send each of them, and create new subflows. Some CIs seem to occasionally have issues with these tests, especially with "debug" kernels.
Two subtests will now run for a slightly longer time: the last two where 3 or more ADD_ADDR are sent during the test.
--- tools/testing/selftests/net/mptcp/mptcp_join.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
tools/testing/selftests/net/mptcp/mptcp_join.sh +4 -2
@@ -2151,7 +2151,8 @@ signal_address_tests() pm_nl_add_endpoint $ns1 10.0.3.1 flags signal pm_nl_add_endpoint $ns1 10.0.4.1 flags signal pm_nl_set_limits $ns2 3 3 - run_tests $ns1 $ns2 10.0.1.1 + speed=slow \ + run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 3 3 3 chk_add_nr 3 3 fi
@@ -2163,7 +2164,8 @@ signal_address_tests() pm_nl_add_endpoint $ns1 10.0.3.1 flags signal pm_nl_add_endpoint $ns1 10.0.14.1 flags signal pm_nl_set_limits $ns2 3 3 - run_tests $ns1 $ns2 10.0.1.1 + speed=slow \ + run_tests $ns1 $ns2 10.0.1.1 join_syn_tx=3 \ chk_join_nr 1 1 1 chk_add_nr 3 3
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 492/849 scsi: ufs: host: mediatek: Enhance recovery on resume failure
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit 15ef3f5aa822f32524cba1463422a2c9372443f0 ]
Improve the recovery process for failed resume operations. Log the device's power status and return 0 if both resume and recovery fail to prevent I/O hang.
--- drivers/ufs/host/ufs-mediatek.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/ufs/host/ufs-mediatek.c +14 -1
@@ -1727,8 +1727,21 @@ static int ufs_mtk_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) }return 0 ; + fail: -return ufshcd_link_recovery (hba); +/* +* Check if the platform (parent) device has resumed, and ensure that +* power, clock, and MTCMOS are all turned on. +*/ + err =ufshcd_link_recovery (hba); +if (err) { +dev_err (hba->dev,"Device PM: req=%d, status:%d, err:%d\n" , + hba->dev->power.request, + hba->dev->power.runtime_status, + hba->dev->power.runtime_error); + } + +return 0 ;/* Cannot return a failure, otherwise, the I/O will hang. */ }static void ufs_mtk_dbg_register_dump (struct ufs_hba *hba)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 493/849 scsi: ufs: ufs-qcom: Align programming sequence of Shared ICE for UFS controller v5
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Palash Kambar <[email protected]>
[ Upstream commit 3126b5fd02270380cce833d06f973a3ffb33a69b ]
Disabling the AES core in Shared ICE is not supported during power collapse for UFS Host Controller v5.0, which may lead to data errors after Hibern8 exit. To comply with hardware programming guidelines and avoid this issue, issue a sync reset to ICE upon power collapse exit.
Hence follow below steps to reset the ICE upon exiting power collapse and align with Hw programming guide.
a. Assert the ICE sync reset by setting both SYNC_RST_SEL and
SYNC_RST_SW bits in UFS_MEM_ICE_CFG
b. Deassert the reset by clearing SYNC_RST_SW in UFS_MEM_ICE_CFG
--- drivers/ufs/host/ufs-qcom.c | 21 +++++++++++++++++++++ drivers/ufs/host/ufs-qcom.h | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-)
drivers/ufs/host/ufs-qcom.c +21 -0
@@ -38,6 +38,9 @@#define DEEMPHASIS_3_5_dB 0x04#define NO_DEEMPHASIS 0x0 +#define UFS_ICE_SYNC_RST_SEL BIT(3) +#define UFS_ICE_SYNC_RST_SW BIT(4) +enum {TSTBUS_UAWM ,TSTBUS_UARM ,
@@ -751,11 +754,29 @@ static int ufs_qcom_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) {struct ufs_qcom_host *host =ufshcd_get_variant (hba);int err; +u32 reg_val; err =ufs_qcom_enable_lane_clks (host);if (err)return err; +if ((!ufs_qcom_is_link_active (hba)) && + host->hw_ver.major ==5 && + host->hw_ver.minor ==0 && + host->hw_ver.step ==0 ) { +ufshcd_writel (hba,UFS_ICE_SYNC_RST_SEL |UFS_ICE_SYNC_RST_SW ,UFS_MEM_ICE_CFG ); + reg_val =ufshcd_readl (hba,UFS_MEM_ICE_CFG ); + reg_val &= ~(UFS_ICE_SYNC_RST_SEL |UFS_ICE_SYNC_RST_SW ); +/* +* HW documentation doesn't recommend any delay between the +* reset set and clear. But we are enforcing an arbitrary delay +* to give flops enough time to settle in. +*/ +usleep_range (50 ,100 ); +ufshcd_writel (hba, reg_val,UFS_MEM_ICE_CFG ); +ufshcd_readl (hba,UFS_MEM_ICE_CFG ); + } +return ufs_qcom_ice_resume (host); }
drivers/ufs/host/ufs-qcom.h +1 -1
@@ -60,7 +60,7 @@ enum {UFS_AH8_CFG =0xFC ,UFS_RD_REG_MCQ =0xD00 , - +UFS_MEM_ICE_CFG =0x2600 ,REG_UFS_MEM_ICE_CONFIG =0x260C , REG_UFS_MEM_ICE_NUM_CORE = 0x2664,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 494/849 scsi: ufs: host: mediatek: Fix unbalanced IRQ enable issue
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit 91cad911edd1612ed28f5cfb2d4c53a8824951a5 ]
Resolve the issue of unbalanced IRQ enablement by setting the 'is_mcq_intr_enabled' flag after the first successful IRQ enablement. Ensure proper tracking of the IRQ state and prevent potential mismatches in IRQ handling.
--- drivers/ufs/host/ufs-mediatek.c | 1 + 1 file changed, 1 insertion(+)
drivers/ufs/host/ufs-mediatek.c +1 -0
@@ -2111,6 +2111,7 @@ static int ufs_mtk_config_mcq_irq(struct ufs_hba *hba)return ret; } } + host->is_mcq_intr_enabled = true;return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 495/849 scsi: ufs: host: mediatek: Enhance recovery on hibernation exit failure
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit faac32d4ece30609f1a0930ca0ae951cf6dc1786 ]
Improve the recovery process for hibernation exit failures. Trigger the error handler and break the suspend operation to ensure effective recovery from hibernation errors. Activate the error handling mechanism by ufshcd_force_error_recovery and scheduling the error handler work.
--- drivers/ufs/core/ufshcd.c | 3 ++- drivers/ufs/host/ufs-mediatek.c | 14 +++++++++++--- include/ufs/ufshcd.h | 1 + 3 files changed, 14 insertions(+), 4 deletions(-)
drivers/ufs/core/ufshcd.c +2 -1
@@ -6462,13 +6462,14 @@ void ufshcd_schedule_eh_work(struct ufs_hba *hba) } } -static void ufshcd_force_error_recovery (struct ufs_hba *hba) +void ufshcd_force_error_recovery (struct ufs_hba *hba) {spin_lock_irq (hba->host->host_lock); hba->force_reset = true;ufshcd_schedule_eh_work (hba);spin_unlock_irq (hba->host->host_lock); } +EXPORT_SYMBOL_GPL (ufshcd_force_error_recovery);static void ufshcd_clk_scaling_allow (struct ufs_hba *hba,bool allow) {
drivers/ufs/host/ufs-mediatek.c +11 -3
@@ -1646,7 +1646,7 @@ static void ufs_mtk_dev_vreg_set_lpm(struct ufs_hba *hba, bool lpm) } } -static void ufs_mtk_auto_hibern8_disable (struct ufs_hba *hba) +static int ufs_mtk_auto_hibern8_disable (struct ufs_hba *hba) {int ret;
@@ -1657,8 +1657,16 @@ static void ufs_mtk_auto_hibern8_disable(struct ufs_hba *hba)ufs_mtk_wait_idle_state (hba,5 ); ret =ufs_mtk_wait_link_state (hba,VS_LINK_UP ,100 ); -if (ret) +if (ret) {dev_warn (hba->dev,"exit h8 state fail, ret=%d\n" , ret); + +ufshcd_force_error_recovery (hba); + +/* trigger error handler and break suspend */ + ret = -EBUSY ; + } + +return ret; } static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
@@ -1669,7 +1677,7 @@ static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,if (status ==PRE_CHANGE ) {if (ufshcd_is_auto_hibern8_supported (hba)) -ufs_mtk_auto_hibern8_disable (hba); +return ufs_mtk_auto_hibern8_disable (hba);return 0 ; }
include/ufs/ufshcd.h +1 -0
@@ -1511,5 +1511,6 @@ int __ufshcd_write_ee_control(struct ufs_hba *hba, u32 ee_ctrl_mask);int ufshcd_write_ee_control (struct ufs_hba *hba);int ufshcd_update_ee_control (struct ufs_hba *hba,u16 *mask,const u16 *other_mask,u16 set,u16 clr); +void ufshcd_force_error_recovery (struct ufs_hba *hba);#endif /* End of Header */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 496/849 net: phy: marvell: Fix 88e1510 downshift counter errata
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rohan G Thomas <[email protected]>
[ Upstream commit deb105f49879dd50d595f7f55207d6e74dec34e6 ]
The 88e1510 PHY has an erratum where the phy downshift counter is not cleared after phy being suspended(BMCR_PDOWN set) and then later resumed(BMCR_PDOWN cleared). This can cause the gigabit link to intermittently downshift to a lower speed.
Disabling and re-enabling the downshift feature clears the counter, allowing the PHY to retry gigabit link negotiation up to the programmed retry count times before downshifting. This behavior has been observed on copper links.
--- drivers/net/phy/marvell.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-)
drivers/net/phy/marvell.c +38 -1
@@ -1902,6 +1902,43 @@ static int marvell_resume(struct phy_device *phydev)return err; } +/* m88e1510_resume +* +* The 88e1510 PHY has an erratum where the phy downshift counter is not cleared +* after phy being suspended(BMCR_PDOWN set) and then later resumed(BMCR_PDOWN +* cleared). This can cause the link to intermittently downshift to a lower speed. +* +* Disabling and re-enabling the downshift feature clears the counter, allowing +* the PHY to retry gigabit link negotiation up to the programmed retry count +* before downshifting. This behavior has been observed on copper links. +*/ +static int m88e1510_resume (struct phy_device *phydev) +{ +int err; +u8 cnt =0 ; + + err =marvell_resume (phydev); +if (err <0 ) +return err; + +/* read downshift counter value */ + err =m88e1011_get_downshift (phydev, &cnt); +if (err <0 ) +return err; + +if (cnt) { +/* downshift disabled */ + err =m88e1011_set_downshift (phydev,0 ); +if (err <0 ) +return err; + +/* downshift enabled, with previous counter value */ + err =m88e1011_set_downshift (phydev, cnt); + } + +return err; +} +static int marvell_aneg_done (struct phy_device *phydev) {int retval =phy_read (phydev,MII_M1011_PHY_STATUS );
@@ -3923,7 +3960,7 @@ static struct phy_driver marvell_drivers[] = { .handle_interrupt = marvell_handle_interrupt, .get_wol = m88e1318_get_wol, .set_wol = m88e1318_set_wol, - .resume = marvell_resume, + .resume = m88e1510_resume, .suspend = marvell_suspend, .read_page = marvell_read_page, .write_page = marvell_write_page,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 497/849 scsi: ufs: host: mediatek: Correct system PM flow
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit 77b96ef70b6ba46e3473e5e3a66095c4bc0e93a4 ]
Refine the system power management (PM) flow by skipping low power mode (LPM) and MTCMOS settings if runtime PM is already applied. Prevent redundant operations to ensure a more efficient PM process.
--- drivers/ufs/host/ufs-mediatek.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
drivers/ufs/host/ufs-mediatek.c +14 -3
@@ -2264,27 +2264,38 @@ static int ufs_mtk_system_suspend(struct device *dev) ret =ufshcd_system_suspend (dev);if (ret) -return ret; + goto out; + +if (pm_runtime_suspended (hba->dev)) + goto out;ufs_mtk_dev_vreg_set_lpm (hba, true);if (ufs_mtk_is_rtff_mtcmos (hba))ufs_mtk_mtcmos_ctrl (false, res); - return 0; +out: + return ret; }static int ufs_mtk_system_resume (struct device *dev) { +int ret =0 ;struct ufs_hba *hba =dev_get_drvdata (dev);struct arm_smccc_res res; +if (pm_runtime_suspended (hba->dev)) + goto out; +ufs_mtk_dev_vreg_set_lpm (hba, false);if (ufs_mtk_is_rtff_mtcmos (hba))ufs_mtk_mtcmos_ctrl (true, res); -return ufshcd_system_resume (dev); +out: + ret =ufshcd_system_resume (dev); + +return ret; }#endif
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 498/849 scsi: ufs: host: mediatek: Disable auto-hibern8 during power mode changes
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit f5ca8d0c7a6388abd5d8023cc682e1543728cc73 ]
Disable auto-hibern8 during power mode transitions to prevent unintended entry into auto-hibern8. Restore the original auto-hibern8 timer value after completing the power mode change to maintain system stability and prevent potential issues during power state transitions.
--- drivers/ufs/host/ufs-mediatek.c | 53 +++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 23 deletions(-)
drivers/ufs/host/ufs-mediatek.c +30 -23
@@ -1400,19 +1400,49 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba,return ret; } +static int ufs_mtk_auto_hibern8_disable (struct ufs_hba *hba) +{ +int ret; + +/* disable auto-hibern8 */ +ufshcd_writel (hba,0 ,REG_AUTO_HIBERNATE_IDLE_TIMER ); + +/* wait host return to idle state when auto-hibern8 off */ +ufs_mtk_wait_idle_state (hba,5 ); + + ret =ufs_mtk_wait_link_state (hba,VS_LINK_UP ,100 ); +if (ret) { +dev_warn (hba->dev,"exit h8 state fail, ret=%d\n" , ret); + +ufshcd_force_error_recovery (hba); + +/* trigger error handler and break suspend */ + ret = -EBUSY ; + } + +return ret; +} +static int ufs_mtk_pwr_change_notify (struct ufs_hba *hba,enum ufs_notify_change_status stage,const struct ufs_pa_layer_attr *dev_max_params,struct ufs_pa_layer_attr *dev_req_params) {int ret =0 ; +static u32 reg;switch (stage) {case PRE_CHANGE : +if (ufshcd_is_auto_hibern8_supported (hba)) { + reg =ufshcd_readl (hba,REG_AUTO_HIBERNATE_IDLE_TIMER ); +ufs_mtk_auto_hibern8_disable (hba); + } ret =ufs_mtk_pre_pwr_change (hba, dev_max_params, dev_req_params);break ;case POST_CHANGE : +if (ufshcd_is_auto_hibern8_supported (hba)) +ufshcd_writel (hba, reg,REG_AUTO_HIBERNATE_IDLE_TIMER );break ;default : ret = -EINVAL ;
@@ -1646,29 +1676,6 @@ static void ufs_mtk_dev_vreg_set_lpm(struct ufs_hba *hba, bool lpm) } } -static int ufs_mtk_auto_hibern8_disable (struct ufs_hba *hba) -{ -int ret; - -/* disable auto-hibern8 */ -ufshcd_writel (hba,0 ,REG_AUTO_HIBERNATE_IDLE_TIMER ); - -/* wait host return to idle state when auto-hibern8 off */ -ufs_mtk_wait_idle_state (hba,5 ); - - ret =ufs_mtk_wait_link_state (hba,VS_LINK_UP ,100 ); -if (ret) { -dev_warn (hba->dev,"exit h8 state fail, ret=%d\n" , ret); - -ufshcd_force_error_recovery (hba); - -/* trigger error handler and break suspend */ - ret = -EBUSY ; - } - -return ret; -} -static int ufs_mtk_suspend (struct ufs_hba *hba,enum ufs_pm_op pm_op,enum ufs_notify_change_status status) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 499/849 scsi: ufs: host: mediatek: Fix adapt issue after PA_Init
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alice Chao <[email protected]>
[ Upstream commit d73836cb8535b3078e4d2a57913f301baec58a33 ]
Address the issue where the host does not send adapt to the device after PA_Init success. Ensure the adapt process is correctly initiated for devices with IP version MT6899 and above, resolving communication issues between the host and device.
--- drivers/ufs/host/ufs-mediatek.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/ufs/host/ufs-mediatek.c +11 -0
@@ -1503,8 +1503,19 @@ static int ufs_mtk_pre_link(struct ufs_hba *hba)return ret; } +static void ufs_mtk_post_link (struct ufs_hba *hba) { +struct ufs_mtk_host *host =ufshcd_get_variant (hba); +u32 tmp; + +/* fix device PA_INIT no adapt */ +if (host->ip_ver >=IP_VER_MT6899 ) { +ufshcd_dme_get (hba,UIC_ARG_MIB (VS_DEBUGOMC ), &tmp); + tmp |=0x100 ; +ufshcd_dme_set (hba,UIC_ARG_MIB (VS_DEBUGOMC ), tmp); + } +/* enable unipro clock gating feature */ ufs_mtk_cfg_unipro_cg (hba, true); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 500/849 ntfs3: pretend $Extend records as regular files
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
[ Upstream commit 4e8011ffec79717e5fdac43a7e79faf811a384b7 ]
Since commit af153bb63a33 ("vfs: catch invalid modes in may_open()") requires any inode be one of S_IFDIR/S_IFLNK/S_IFREG/S_IFCHR/S_IFBLK/ S_IFIFO/S_IFSOCK type, use S_IFREG for $Extend records.
--- fs/ntfs3/inode.c | 1 + 1 file changed, 1 insertion(+)
fs/ntfs3/inode.c +1 -0
@@ -471,6 +471,7 @@ static struct inode *ntfs_read_mft(struct inode *inode, fname->home.seq == cpu_to_le16(MFT_REC_EXTEND)) { /* Records in $Extend are not a files or general directories. */ inode->i_op = &ntfs_file_inode_operations; + mode = S_IFREG; } else { err = -EINVAL ; goto out;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 501/849 wifi: cfg80211: update the time stamps in hidden ssid
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miri Korenblit <[email protected]>
[ Upstream commit 185cc2352cb1ef2178fe4e9a220a73c94007b8bb ]
In hidden SSID we have separate BSS entries for the beacon and for the probe response(s).
The BSS entry time stamps represent the age of the BSS; when was the last time we heard the BSS.
When we receive a beacon of a hidden SSID it means that we heard that BSS, so it makes sense to indicate that in the probe response entries. Do that.
--- net/wireless/scan.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
net/wireless/scan.c +7 -2
@@ -1816,6 +1816,9 @@ static void cfg80211_update_hidden_bsses(struct cfg80211_internal_bss *known,WARN_ON (ies != old_ies);rcu_assign_pointer (bss->pub.beacon_ies, new_ies); + + bss->ts = known->ts; + bss->pub.ts_boottime = known->pub.ts_boottime; } }
@@ -1882,6 +1885,10 @@ cfg80211_update_known_bss(struct cfg80211_registered_device *rdev, {lockdep_assert_held (&rdev->bss_lock); +/* Update time stamps */ + known->ts = new->ts; + known->pub.ts_boottime = new->pub.ts_boottime; +/* Update IEs */ if (rcu_access_pointer (new->pub.proberesp_ies)) {const struct cfg80211_bss_ies *old;
@@ -1945,8 +1952,6 @@ cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,if (signal_valid) known->pub.signal = new->pub.signal; known->pub.capability = new->pub.capability; - known->ts = new->ts; - known->pub.ts_boottime = new->pub.ts_boottime; known->parent_tsf = new->parent_tsf; known->pub.chains = new->pub.chains; memcpy(known->pub.chain_signal, new->pub.chain_signal,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 502/849 wifi: mac80211: Fix HE capabilities element check
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilan Peer <[email protected]>
[ Upstream commit ea928544f3215fdeac24d66bef85e10bb638b8c1 ]
The element data length check did not account for the extra octet used for the extension ID. Fix it.
--- net/mac80211/mlme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mac80211/mlme.c +1 -1
@@ -5733,7 +5733,7 @@ static u8 ieee80211_max_rx_chains(struct ieee80211_link_data *link, he_cap_elem =cfg80211_find_ext_elem (WLAN_EID_EXT_HE_CAPABILITY , ies->data, ies->len); -if (!he_cap_elem || he_cap_elem->datalen <sizeof (*he_cap)) +if (!he_cap_elem || he_cap_elem->datalen <sizeof (*he_cap) +1 )return chains;/* skip one byte ext_tag_id */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 503/849 fbcon: Use screen info to find primary device
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello (AMD) <[email protected]>
[ Upstream commit ad90860bd10ee3ed387077aed88828b139339976 ]
On systems with non VGA GPUs fbcon can't find the primary GPU because video_is_primary_device() only checks the VGA arbiter.
Add a screen info check to video_is_primary_device() so that callers can get accurate data on such systems.
--- arch/x86/video/video-common.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-)
arch/x86/video/video-common.c +24 -1
@@ -9,6 +9,7 @@#include <linux/module.h> #include <linux/pci.h> +#include <linux/screen_info.h> #include <linux/vgaarb.h> #include <asm/video.h>
@@ -27,6 +28,11 @@ EXPORT_SYMBOL(pgprot_framebuffer);bool video_is_primary_device (struct device *dev) { +#ifdef CONFIG_SCREEN_INFO +struct screen_info *si = &screen_info; +struct resource res[SCREEN_INFO_MAX_RESOURCES ]; +ssize_t i, numres; +#endif struct pci_dev *pdev;if (!dev_is_pci (dev))
@@ -34,7 +40,24 @@ bool video_is_primary_device(struct device *dev) pdev =to_pci_dev (dev); -return (pdev ==vga_default_device ()); +if (!pci_is_display (pdev)) +return false; + +if (pdev ==vga_default_device ()) +return true; + +#ifdef CONFIG_SCREEN_INFO + numres =screen_info_resources (si, res,ARRAY_SIZE (res)); +for (i =0 ; i < numres; ++i) { +if (!(res[i].flags &IORESOURCE_MEM )) +continue ; + +if (pci_find_resource (pdev, &res[i])) +return true; + } +#endif + +return false; }EXPORT_SYMBOL (video_is_primary_device);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 504/849 phy: cadence: cdns-dphy: Enable lower resolutions in dphy
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harikrishna Shenoy <[email protected]>
[ Upstream commit 43bd2c44515f8ee5c019ce6e6583f5640387a41b ]
Enable support for data lane rates between 80-160 Mbps cdns dphy as mentioned in TRM [0] by setting the pll_opdiv field to 16. This change enables lower resolutions like 640x480 at 60Hz.
[0]: https://www.ti.com/lit/zip/spruil1
(Table 12-552. DPHY_TX_PLL_CTRL Register Field Descriptions)
--- drivers/phy/cadence/cdns-dphy.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/phy/cadence/cdns-dphy.c +3 -1
@@ -145,7 +145,7 @@ static int cdns_dsi_get_dphy_pll_cfg(struct cdns_dphy *dphy, dlane_bps = opts->hs_clk_rate; -if (dlane_bps >2500000000UL || dlane_bps <160000000UL ) +if (dlane_bps >2500000000UL || dlane_bps <80000000UL )return -EINVAL ;else if (dlane_bps >=1250000000 ) cfg->pll_opdiv =1 ;
@@ -155,6 +155,8 @@ static int cdns_dsi_get_dphy_pll_cfg(struct cdns_dphy *dphy, cfg->pll_opdiv =4 ; else if (dlane_bps >= 160000000) cfg->pll_opdiv = 8; + else if (dlane_bps >= 80000000) + cfg->pll_opdiv = 16; cfg->pll_fbdiv = DIV_ROUND_UP_ULL(dlane_bps * 2 * cfg->pll_opdiv * cfg->pll_ipdiv,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 506/849 phy: renesas: r8a779f0-ether-serdes: add new step added to latest datasheet
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Dege <[email protected]>
[ Upstream commit e4a8db93b5ec9bca1cc66b295544899e3afd5e86 ]
R-Car S4-8 datasheet Rev.1.20 describes some additional register settings at the end of the initialization.
--- drivers/phy/renesas/r8a779f0-ether-serdes.c | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+)
drivers/phy/renesas/r8a779f0-ether-serdes.c +28 -0
@@ -49,6 +49,13 @@ static void r8a779f0_eth_serdes_write32(void __iomem *addr, u32 offs, u32 bank,iowrite32 (data, addr + offs); } +static u32 r8a779f0_eth_serdes_read32 (void __iomem *addr,u32 offs,u32 bank) +{ +iowrite32 (bank, addr +R8A779F0_ETH_SERDES_BANK_SELECT ); + +return ioread32 (addr + offs); +} +static int r8a779f0_eth_serdes_reg_wait (struct r8a779f0_eth_serdes_channel *channel,u32 offs,u32 bank,u32 mask,u32 expected)
@@ -274,6 +281,7 @@ static int r8a779f0_eth_serdes_hw_init_late(struct r8a779f0_eth_serdes_channel *channel) {int ret; +u32 val; ret =r8a779f0_eth_serdes_chan_setting (channel);if (ret)
@@ -287,6 +295,26 @@ static int r8a779f0_eth_serdes_hw_init_late(struct r8a779f0_eth_serdes_channelr8a779f0_eth_serdes_write32 (channel->addr,0x03d0 ,0x380 ,0x0000 ); + val =r8a779f0_eth_serdes_read32 (channel->addr,0x00c0 ,0x180 ); +r8a779f0_eth_serdes_write32 (channel->addr,0x00c0 ,0x180 , val |BIT (8 )); + ret =r8a779f0_eth_serdes_reg_wait (channel,0x0100 ,0x180 ,BIT (0 ),1 ); +if (ret) +return ret; +r8a779f0_eth_serdes_write32 (channel->addr,0x00c0 ,0x180 , val & ~BIT (8 )); + ret =r8a779f0_eth_serdes_reg_wait (channel,0x0100 ,0x180 ,BIT (0 ),0 ); +if (ret) +return ret; + + val =r8a779f0_eth_serdes_read32 (channel->addr,0x0144 ,0x180 ); +r8a779f0_eth_serdes_write32 (channel->addr,0x0144 ,0x180 , val |BIT (4 )); + ret =r8a779f0_eth_serdes_reg_wait (channel,0x0180 ,0x180 ,BIT (0 ),1 ); +if (ret) +return ret; +r8a779f0_eth_serdes_write32 (channel->addr,0x0144 ,0x180 , val & ~BIT (4 )); + ret =r8a779f0_eth_serdes_reg_wait (channel,0x0180 ,0x180 ,BIT (0 ),0 ); +if (ret) +return ret; +return r8a779f0_eth_serdes_monitor_linkup (channel); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 507/849 phy: rockchip: phy-rockchip-inno-csidphy: allow writes to grf register 0
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Riesch <[email protected]>
[ Upstream commit 8c7c19466c854fa86b82d2148eaa9bf0e6531423 ]
The driver for the Rockchip MIPI CSI-2 DPHY uses GRF register offset value 0 to sort out undefined registers. However, the RK3588 CSIDPHY GRF this offset is perfectly fine (in fact, register 0 is the only one in this register file).
Introduce a boolean variable to indicate valid registers and allow writes to register 0.
--- drivers/phy/rockchip/phy-rockchip-inno-csidphy.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/phy/rockchip/phy-rockchip-inno-csidphy.c +3 -2
@@ -87,10 +87,11 @@ struct dphy_reg {u32 offset;u32 mask;u32 shift; +u8 valid; };#define PHY_REG (_offset, _width, _shift) \ - { .offset = _offset, .mask = BIT(_width) - 1, .shift = _shift, } + { .offset = _offset, .mask = BIT(_width) - 1, .shift = _shift, .valid = 1, }static const struct dphy_reg rk1808_grf_dphy_regs[] = { [GRF_DPHY_CSIPHY_FORCERXMODE ] =PHY_REG (RK1808_GRF_PD_VI_CON_OFFSET ,4 ,0 ),
@@ -145,7 +146,7 @@ static inline void write_grf_reg(struct rockchip_inno_csidphy *priv,const struct dphy_drv_data *drv_data = priv->drv_data;const struct dphy_reg *reg = &drv_data->grf_regs[index]; -if (reg->offset) +if (reg->valid)regmap_write (priv->grf, reg->offset,HIWORD_UPDATE (value, reg->mask, reg->shift)); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 508/849 drm/msm/registers: Generate _HI/LO builders for reg64
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit 60e9f776b7932d67c88e8475df7830cb9cdf3154 ]
The upstream mesa copy of the GPU regs has shifted more things to reg64 instead of seperate 32b HI/LO reg32's. This works better with the "new- style" c++ builders that mesa has been migrating to for a6xx+ (to better handle register shuffling between gens), but it leaves the C builders with missing _HI/LO builders.
So handle the special case of reg64, automatically generating the missing _HI/LO builders.
Patchwork: https://patchwork.freedesktop.org/patch/673559/
--- drivers/gpu/drm/msm/registers/gen_header.py | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/msm/registers/gen_header.py +7 -0
@@ -150,6 +150,7 @@ class Bitset(object): def __init__(self, name, template): self.name = name self.inline = False + self.reg = None if template: self.fields = template.fields[:] else:
@@ -256,6 +257,11 @@ class Bitset(object): def dump(self, prefix=None): if prefix == None: prefix = self.name + if self.reg and self.reg.bit_size == 64: + print("static inline uint32_t %s_LO(uint32_t val)\n{" % prefix) + print("\treturn val;\n}") + print("static inline uint32_t %s_HI(uint32_t val)\n{" % prefix) + print("\treturn val;\n}") for f in self.fields: if f.name: name = prefix + "_" + f.name
@@ -620,6 +626,7 @@ class Parser(object): self.current_reg = Reg(attrs, self.prefix(variant), self.current_array, bit_size) self.current_reg.bitset = self.current_bitset + self.current_bitset.reg = self.current_reg if len(self.stack) == 1: self.file.append(self.current_reg)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 509/849 net: sh_eth: Disable WoL if system can not suspend
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Söderlund <[email protected]>
[ Upstream commit 9c02ea544ac35a9def5827d30594406947ccd81a ]
The MAC can't facilitate WoL if the system can't go to sleep. Gate the WoL support callbacks in ethtool at compile time using CONFIG_PM_SLEEP.
--- drivers/net/ethernet/renesas/sh_eth.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/renesas/sh_eth.c +4 -0
@@ -2360,6 +2360,7 @@ static int sh_eth_set_ringparam(struct net_device *ndev,return 0 ; } +#ifdef CONFIG_PM_SLEEP static void sh_eth_get_wol (struct net_device *ndev,struct ethtool_wolinfo *wol) {struct sh_eth_private *mdp =netdev_priv (ndev);
@@ -2386,6 +2387,7 @@ static int sh_eth_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)return 0 ; } +#endif static const struct ethtool_ops sh_eth_ethtool_ops = { .get_regs_len = sh_eth_get_regs_len,
@@ -2401,8 +2403,10 @@ static const struct ethtool_ops sh_eth_ethtool_ops = { .set_ringparam = sh_eth_set_ringparam, .get_link_ksettings = phy_ethtool_get_link_ksettings, .set_link_ksettings = phy_ethtool_set_link_ksettings, +#ifdef CONFIG_PM_SLEEP .get_wol = sh_eth_get_wol, .set_wol = sh_eth_set_wol, +#endif };/* network device open function */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 510/849 selftests: net: replace sleeps in fcnal-test with waits
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 15c068cb214d74a2faca9293b25f454242d0d65e ]
fcnal-test.sh already includes lib.sh, use relevant helpers instead of sleeping. Replace sleep after starting nettest as a server with wait_local_port_listen.
--- tools/testing/selftests/net/fcnal-test.sh | 428 +++++++++++----------- 1 file changed, 214 insertions(+), 214 deletions(-)
tools/testing/selftests/net/fcnal-test.sh +214 -214
@@ -875,7 +875,7 @@ ipv4_tcp_md5_novrf() # basic use case log_start run_cmd nettest -s -M ${MD5_PW} -m ${NSB_IP} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: Single address config"
@@ -883,7 +883,7 @@ ipv4_tcp_md5_novrf() log_start show_hint "Should timeout due to MD5 mismatch" run_cmd nettest -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 2 "MD5: Server no config, client uses password"
@@ -891,7 +891,7 @@ ipv4_tcp_md5_novrf() log_start show_hint "Should timeout since client uses wrong password" run_cmd nettest -s -M ${MD5_PW} -m ${NSB_IP} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: Client uses wrong password"
@@ -899,7 +899,7 @@ ipv4_tcp_md5_novrf() log_start show_hint "Should timeout due to MD5 mismatch" run_cmd nettest -s -M ${MD5_PW} -m ${NSB_LO_IP} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 2 "MD5: Client address does not match address configured with password"
@@ -910,7 +910,7 @@ ipv4_tcp_md5_novrf() # client in prefix log_start run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: Prefix config"
@@ -918,7 +918,7 @@ ipv4_tcp_md5_novrf() log_start show_hint "Should timeout since client uses wrong password" run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: Prefix config, client uses wrong password"
@@ -926,7 +926,7 @@ ipv4_tcp_md5_novrf() log_start show_hint "Should timeout due to MD5 mismatch" run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -c ${NSB_LO_IP} -r ${NSA_IP} -X ${MD5_PW} log_test $? 2 "MD5: Prefix config, client address not in configured prefix" }
@@ -943,7 +943,7 @@ ipv4_tcp_md5() # basic use case log_start run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Single address config"
@@ -951,7 +951,7 @@ ipv4_tcp_md5() log_start show_hint "Should timeout since server does not have MD5 auth" run_cmd nettest -s -I ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Server no config, client uses password"
@@ -959,7 +959,7 @@ ipv4_tcp_md5() log_start show_hint "Should timeout since client uses wrong password" run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: VRF: Client uses wrong password"
@@ -967,7 +967,7 @@ ipv4_tcp_md5() log_start show_hint "Should timeout since server config differs from client" run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_LO_IP} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Client address does not match address configured with password"
@@ -978,7 +978,7 @@ ipv4_tcp_md5() # client in prefix log_start run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Prefix config"
@@ -986,7 +986,7 @@ ipv4_tcp_md5() log_start show_hint "Should timeout since client uses wrong password" run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: VRF: Prefix config, client uses wrong password"
@@ -994,7 +994,7 @@ ipv4_tcp_md5() log_start show_hint "Should timeout since client address is outside of prefix" run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -c ${NSB_LO_IP} -r ${NSA_IP} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Prefix config, client address not in configured prefix"
@@ -1005,14 +1005,14 @@ ipv4_tcp_md5() log_start run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} & run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NSB_IP} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Single address config in default VRF and VRF, conn in VRF" log_start run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} & run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NSB_IP} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_WRONG_PW} log_test $? 0 "MD5: VRF: Single address config in default VRF and VRF, conn in default VRF"
@@ -1020,7 +1020,7 @@ ipv4_tcp_md5() show_hint "Should timeout since client in default VRF uses VRF password" run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} & run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NSB_IP} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Single address config in default VRF and VRF, conn in default VRF with VRF pw"
@@ -1028,21 +1028,21 @@ ipv4_tcp_md5() show_hint "Should timeout since client in VRF uses default VRF password" run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP} & run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NSB_IP} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: VRF: Single address config in default VRF and VRF, conn in VRF with default VRF pw" log_start run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} & run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NS_NET} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Prefix config in default VRF and VRF, conn in VRF" log_start run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} & run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NS_NET} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_WRONG_PW} log_test $? 0 "MD5: VRF: Prefix config in default VRF and VRF, conn in default VRF"
@@ -1050,7 +1050,7 @@ ipv4_tcp_md5() show_hint "Should timeout since client in default VRF uses VRF password" run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} & run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NS_NET} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Prefix config in default VRF and VRF, conn in default VRF with VRF pw"
@@ -1058,7 +1058,7 @@ ipv4_tcp_md5() show_hint "Should timeout since client in VRF uses default VRF password" run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} & run_cmd nettest -s -M ${MD5_WRONG_PW} -m ${NS_NET} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: VRF: Prefix config in default VRF and VRF, conn in VRF with default VRF pw"
@@ -1082,14 +1082,14 @@ test_ipv4_md5_vrf__vrf_server__no_bind_ifindex() log_start show_hint "Simulates applications using VRF without TCP_MD5SIG_FLAG_IFINDEX" run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} --no-bind-key-ifindex & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: VRF: VRF-bound server, unbound key accepts connection" log_start show_hint "Binding both the socket and the key is not required but it works" run_cmd nettest -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET} --force-bind-key-ifindex & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: VRF: VRF-bound server, bound key accepts connection" }
@@ -1103,25 +1103,25 @@ test_ipv4_md5_vrf__global_server__bind_ifindex0() log_start run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} --force-bind-key-ifindex & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Global server, Key bound to ifindex=0 rejects VRF connection" log_start run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} --force-bind-key-ifindex & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Global server, key bound to ifindex=0 accepts non-VRF connection" log_start run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} --no-bind-key-ifindex & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Global server, key not bound to ifindex accepts VRF connection" log_start run_cmd nettest -s -M ${MD5_PW} -m ${NS_NET} --no-bind-key-ifindex & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsc nettest -r ${NSA_IP} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Global server, key not bound to ifindex accepts non-VRF connection"
@@ -1193,7 +1193,7 @@ ipv4_tcp_novrf() do log_start run_cmd nettest -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${a} log_test_addr ${a} $? 0 "Global server" done
@@ -1201,7 +1201,7 @@ ipv4_tcp_novrf() a=${NSA_IP} log_start run_cmd nettest -s -I ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${a} log_test_addr ${a} $? 0 "Device server"
@@ -1221,13 +1221,13 @@ ipv4_tcp_novrf() do log_start run_cmd_nsb nettest -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest -r ${a} -0 ${NSA_IP} log_test_addr ${a} $? 0 "Client" log_start run_cmd_nsb nettest -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest -r ${a} -d ${NSA_DEV} log_test_addr ${a} $? 0 "Client, device bind"
@@ -1249,7 +1249,7 @@ ipv4_tcp_novrf() do log_start run_cmd nettest -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} -0 ${a} -1 ${a} log_test_addr ${a} $? 0 "Global server, local connection" done
@@ -1257,7 +1257,7 @@ ipv4_tcp_novrf() a=${NSA_IP} log_start run_cmd nettest -s -I ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} -0 ${a} log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
@@ -1266,7 +1266,7 @@ ipv4_tcp_novrf() log_start show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope" run_cmd nettest -s -I ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} log_test_addr ${a} $? 1 "Device server, unbound client, local connection" done
@@ -1274,7 +1274,7 @@ ipv4_tcp_novrf() a=${NSA_IP} log_start run_cmd nettest -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} -0 ${a} -d ${NSA_DEV} log_test_addr ${a} $? 0 "Global server, device client, local connection"
@@ -1283,7 +1283,7 @@ ipv4_tcp_novrf() log_start show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope" run_cmd nettest -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} -d ${NSA_DEV} log_test_addr ${a} $? 1 "Global server, device client, local connection" done
@@ -1291,7 +1291,7 @@ ipv4_tcp_novrf() a=${NSA_IP} log_start run_cmd nettest -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -d ${NSA_DEV} -r ${a} -0 ${a} log_test_addr ${a} $? 0 "Device server, device client, local connection"
@@ -1323,19 +1323,19 @@ ipv4_tcp_vrf() log_start show_hint "Should fail 'Connection refused' since global server with VRF is disabled" run_cmd nettest -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${a} log_test_addr ${a} $? 1 "Global server" log_start run_cmd nettest -s -I ${VRF} -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${a} log_test_addr ${a} $? 0 "VRF server" log_start run_cmd nettest -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${a} log_test_addr ${a} $? 0 "Device server"
@@ -1352,7 +1352,7 @@ ipv4_tcp_vrf() log_start show_hint "Should fail 'Connection refused' since global server with VRF is disabled" run_cmd nettest -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} -d ${NSA_DEV} log_test_addr ${a} $? 1 "Global server, local connection"
@@ -1374,14 +1374,14 @@ ipv4_tcp_vrf() log_start show_hint "client socket should be bound to VRF" run_cmd nettest -s -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${a} log_test_addr ${a} $? 0 "Global server" log_start show_hint "client socket should be bound to VRF" run_cmd nettest -s -I ${VRF} -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${a} log_test_addr ${a} $? 0 "VRF server"
@@ -1396,7 +1396,7 @@ ipv4_tcp_vrf() log_start show_hint "client socket should be bound to device" run_cmd nettest -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${a} log_test_addr ${a} $? 0 "Device server"
@@ -1406,7 +1406,7 @@ ipv4_tcp_vrf() log_start show_hint "Should fail 'Connection refused' since client is not bound to VRF" run_cmd nettest -s -I ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} log_test_addr ${a} $? 1 "Global server, local connection" done
@@ -1418,13 +1418,13 @@ ipv4_tcp_vrf() do log_start run_cmd_nsb nettest -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest -r ${a} -d ${VRF} log_test_addr ${a} $? 0 "Client, VRF bind" log_start run_cmd_nsb nettest -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest -r ${a} -d ${NSA_DEV} log_test_addr ${a} $? 0 "Client, device bind"
@@ -1443,7 +1443,7 @@ ipv4_tcp_vrf() do log_start run_cmd nettest -s -I ${VRF} -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} -d ${VRF} -0 ${a} log_test_addr ${a} $? 0 "VRF server, VRF client, local connection" done
@@ -1451,26 +1451,26 @@ ipv4_tcp_vrf() a=${NSA_IP} log_start run_cmd nettest -s -I ${VRF} -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} -d ${NSA_DEV} -0 ${a} log_test_addr ${a} $? 0 "VRF server, device client, local connection" log_start show_hint "Should fail 'No route to host' since client is out of VRF scope" run_cmd nettest -s -I ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} log_test_addr ${a} $? 1 "VRF server, unbound client, local connection" log_start run_cmd nettest -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} -d ${VRF} -0 ${a} log_test_addr ${a} $? 0 "Device server, VRF client, local connection" log_start run_cmd nettest -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -r ${a} -d ${NSA_DEV} -0 ${a} log_test_addr ${a} $? 0 "Device server, device client, local connection" }
@@ -1509,7 +1509,7 @@ ipv4_udp_novrf() do log_start run_cmd nettest -D -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -D -r ${a} log_test_addr ${a} $? 0 "Global server"
@@ -1522,7 +1522,7 @@ ipv4_udp_novrf() a=${NSA_IP} log_start run_cmd nettest -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -D -r ${a} log_test_addr ${a} $? 0 "Device server"
@@ -1533,31 +1533,31 @@ ipv4_udp_novrf() do log_start run_cmd_nsb nettest -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -D -r ${a} -0 ${NSA_IP} log_test_addr ${a} $? 0 "Client" log_start run_cmd_nsb nettest -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -D -r ${a} -d ${NSA_DEV} -0 ${NSA_IP} log_test_addr ${a} $? 0 "Client, device bind" log_start run_cmd_nsb nettest -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -D -r ${a} -d ${NSA_DEV} -C -0 ${NSA_IP} log_test_addr ${a} $? 0 "Client, device send via cmsg" log_start run_cmd_nsb nettest -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S -0 ${NSA_IP} log_test_addr ${a} $? 0 "Client, device bind via IP_UNICAST_IF" log_start run_cmd_nsb nettest -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S -0 ${NSA_IP} -U log_test_addr ${a} $? 0 "Client, device bind via IP_UNICAST_IF, with connect()"
@@ -1580,7 +1580,7 @@ ipv4_udp_novrf() do log_start run_cmd nettest -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -r ${a} -0 ${a} -1 ${a} log_test_addr ${a} $? 0 "Global server, local connection" done
@@ -1588,7 +1588,7 @@ ipv4_udp_novrf() a=${NSA_IP} log_start run_cmd nettest -s -D -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -r ${a} log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
@@ -1597,7 +1597,7 @@ ipv4_udp_novrf() log_start show_hint "Should fail 'Connection refused' since address is out of device scope" run_cmd nettest -s -D -I ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -r ${a} log_test_addr ${a} $? 1 "Device server, unbound client, local connection" done
@@ -1605,25 +1605,25 @@ ipv4_udp_novrf() a=${NSA_IP} log_start run_cmd nettest -s -D & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "Global server, device client, local connection" log_start run_cmd nettest -s -D & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${NSA_DEV} -C -r ${a} log_test_addr ${a} $? 0 "Global server, device send via cmsg, local connection" log_start run_cmd nettest -s -D & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${NSA_DEV} -S -r ${a} log_test_addr ${a} $? 0 "Global server, device client via IP_UNICAST_IF, local connection" log_start run_cmd nettest -s -D & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${NSA_DEV} -S -r ${a} -U log_test_addr ${a} $? 0 "Global server, device client via IP_UNICAST_IF, local connection, with connect()"
@@ -1636,28 +1636,28 @@ ipv4_udp_novrf() log_start show_hint "Should fail since addresses on loopback are out of device scope" run_cmd nettest -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -r ${a} -d ${NSA_DEV} log_test_addr ${a} $? 2 "Global server, device client, local connection" log_start show_hint "Should fail since addresses on loopback are out of device scope" run_cmd nettest -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -r ${a} -d ${NSA_DEV} -C log_test_addr ${a} $? 1 "Global server, device send via cmsg, local connection" log_start show_hint "Should fail since addresses on loopback are out of device scope" run_cmd nettest -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection" log_start show_hint "Should fail since addresses on loopback are out of device scope" run_cmd nettest -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S -U log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection, with connect()"
@@ -1667,7 +1667,7 @@ ipv4_udp_novrf() a=${NSA_IP} log_start run_cmd nettest -D -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${NSA_DEV} -r ${a} -0 ${a} log_test_addr ${a} $? 0 "Device server, device client, local conn"
@@ -1709,19 +1709,19 @@ ipv4_udp_vrf() log_start show_hint "Fails because ingress is in a VRF and global server is disabled" run_cmd nettest -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -D -r ${a} log_test_addr ${a} $? 1 "Global server" log_start run_cmd nettest -D -I ${VRF} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -D -r ${a} log_test_addr ${a} $? 0 "VRF server" log_start run_cmd nettest -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -D -r ${a} log_test_addr ${a} $? 0 "Enslaved device server"
@@ -1733,7 +1733,7 @@ ipv4_udp_vrf() log_start show_hint "Should fail 'Connection refused' since global server is out of scope" run_cmd nettest -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${VRF} -r ${a} log_test_addr ${a} $? 1 "Global server, VRF client, local connection" done
@@ -1741,26 +1741,26 @@ ipv4_udp_vrf() a=${NSA_IP} log_start run_cmd nettest -s -D -I ${VRF} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "VRF server, VRF client, local conn" log_start run_cmd nettest -s -D -I ${VRF} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "VRF server, enslaved device client, local connection" a=${NSA_IP} log_start run_cmd nettest -s -D -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn" log_start run_cmd nettest -s -D -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
@@ -1775,19 +1775,19 @@ ipv4_udp_vrf() do log_start run_cmd nettest -D -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -D -r ${a} log_test_addr ${a} $? 0 "Global server" log_start run_cmd nettest -D -I ${VRF} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -D -r ${a} log_test_addr ${a} $? 0 "VRF server" log_start run_cmd nettest -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -D -r ${a} log_test_addr ${a} $? 0 "Enslaved device server"
@@ -1802,13 +1802,13 @@ ipv4_udp_vrf() # log_start run_cmd_nsb nettest -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -d ${VRF} -D -r ${NSB_IP} -1 ${NSA_IP} log_test $? 0 "VRF client" log_start run_cmd_nsb nettest -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -d ${NSA_DEV} -D -r ${NSB_IP} -1 ${NSA_IP} log_test $? 0 "Enslaved device client"
@@ -1829,31 +1829,31 @@ ipv4_udp_vrf() a=${NSA_IP} log_start run_cmd nettest -D -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "Global server, VRF client, local conn" log_start run_cmd nettest -s -D -I ${VRF} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "VRF server, VRF client, local conn" log_start run_cmd nettest -s -D -I ${VRF} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "VRF server, device client, local conn" log_start run_cmd nettest -s -D -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn" log_start run_cmd nettest -s -D -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
@@ -1861,7 +1861,7 @@ ipv4_udp_vrf() do log_start run_cmd nettest -D -s -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "Global server, VRF client, local conn" done
@@ -1870,7 +1870,7 @@ ipv4_udp_vrf() do log_start run_cmd nettest -s -D -I ${VRF} -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "VRF server, VRF client, local conn" done
@@ -2093,7 +2093,7 @@ ipv4_rt() do log_start run_cmd nettest ${varg} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest ${varg} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -2107,7 +2107,7 @@ ipv4_rt() do log_start run_cmd nettest ${varg} -s -I ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest ${varg} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -2120,7 +2120,7 @@ ipv4_rt() a=${NSA_IP} log_start run_cmd nettest ${varg} -s -I ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest ${varg} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -2134,7 +2134,7 @@ ipv4_rt() # log_start run_cmd_nsb nettest ${varg} -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest ${varg} -d ${VRF} -r ${NSB_IP} & sleep 3 run_cmd ip link del ${VRF}
@@ -2145,7 +2145,7 @@ ipv4_rt() log_start run_cmd_nsb nettest ${varg} -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest ${varg} -d ${NSA_DEV} -r ${NSB_IP} & sleep 3 run_cmd ip link del ${VRF}
@@ -2161,7 +2161,7 @@ ipv4_rt() do log_start run_cmd nettest ${varg} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest ${varg} -d ${VRF} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -2175,7 +2175,7 @@ ipv4_rt() do log_start run_cmd nettest ${varg} -I ${VRF} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest ${varg} -d ${VRF} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -2189,7 +2189,7 @@ ipv4_rt() log_start run_cmd nettest ${varg} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -2200,7 +2200,7 @@ ipv4_rt() log_start run_cmd nettest ${varg} -I ${VRF} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -2211,7 +2211,7 @@ ipv4_rt() log_start run_cmd nettest ${varg} -I ${NSA_DEV} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -2561,7 +2561,7 @@ ipv6_tcp_md5_novrf() # basic use case log_start run_cmd nettest -6 -s -M ${MD5_PW} -m ${NSB_IP6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 0 "MD5: Single address config"
@@ -2569,7 +2569,7 @@ ipv6_tcp_md5_novrf() log_start show_hint "Should timeout due to MD5 mismatch" run_cmd nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 2 "MD5: Server no config, client uses password"
@@ -2577,7 +2577,7 @@ ipv6_tcp_md5_novrf() log_start show_hint "Should timeout since client uses wrong password" run_cmd nettest -6 -s -M ${MD5_PW} -m ${NSB_IP6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: Client uses wrong password"
@@ -2585,7 +2585,7 @@ ipv6_tcp_md5_novrf() log_start show_hint "Should timeout due to MD5 mismatch" run_cmd nettest -6 -s -M ${MD5_PW} -m ${NSB_LO_IP6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 2 "MD5: Client address does not match address configured with password"
@@ -2596,7 +2596,7 @@ ipv6_tcp_md5_novrf() # client in prefix log_start run_cmd nettest -6 -s -M ${MD5_PW} -m ${NS_NET6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 0 "MD5: Prefix config"
@@ -2604,7 +2604,7 @@ ipv6_tcp_md5_novrf() log_start show_hint "Should timeout since client uses wrong password" run_cmd nettest -6 -s -M ${MD5_PW} -m ${NS_NET6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: Prefix config, client uses wrong password"
@@ -2612,7 +2612,7 @@ ipv6_tcp_md5_novrf() log_start show_hint "Should timeout due to MD5 mismatch" run_cmd nettest -6 -s -M ${MD5_PW} -m ${NS_NET6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -c ${NSB_LO_IP6} -r ${NSA_IP6} -X ${MD5_PW} log_test $? 2 "MD5: Prefix config, client address not in configured prefix" }
@@ -2629,7 +2629,7 @@ ipv6_tcp_md5() # basic use case log_start run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Single address config"
@@ -2637,7 +2637,7 @@ ipv6_tcp_md5() log_start show_hint "Should timeout since server does not have MD5 auth" run_cmd nettest -6 -s -I ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Server no config, client uses password"
@@ -2645,7 +2645,7 @@ ipv6_tcp_md5() log_start show_hint "Should timeout since client uses wrong password" run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: VRF: Client uses wrong password"
@@ -2653,7 +2653,7 @@ ipv6_tcp_md5() log_start show_hint "Should timeout since server config differs from client" run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_LO_IP6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Client address does not match address configured with password"
@@ -2664,7 +2664,7 @@ ipv6_tcp_md5() # client in prefix log_start run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Prefix config"
@@ -2672,7 +2672,7 @@ ipv6_tcp_md5() log_start show_hint "Should timeout since client uses wrong password" run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: VRF: Prefix config, client uses wrong password"
@@ -2680,7 +2680,7 @@ ipv6_tcp_md5() log_start show_hint "Should timeout since client address is outside of prefix" run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -c ${NSB_LO_IP6} -r ${NSA_IP6} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Prefix config, client address not in configured prefix"
@@ -2691,14 +2691,14 @@ ipv6_tcp_md5() log_start run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} & run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NSB_IP6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Single address config in default VRF and VRF, conn in VRF" log_start run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} & run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NSB_IP6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsc nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW} log_test $? 0 "MD5: VRF: Single address config in default VRF and VRF, conn in default VRF"
@@ -2706,7 +2706,7 @@ ipv6_tcp_md5() show_hint "Should timeout since client in default VRF uses VRF password" run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} & run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NSB_IP6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsc nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Single address config in default VRF and VRF, conn in default VRF with VRF pw"
@@ -2714,21 +2714,21 @@ ipv6_tcp_md5() show_hint "Should timeout since client in VRF uses default VRF password" run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NSB_IP6} & run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NSB_IP6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: VRF: Single address config in default VRF and VRF, conn in VRF with default VRF pw" log_start run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} & run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NS_NET6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 0 "MD5: VRF: Prefix config in default VRF and VRF, conn in VRF" log_start run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} & run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NS_NET6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsc nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW} log_test $? 0 "MD5: VRF: Prefix config in default VRF and VRF, conn in default VRF"
@@ -2736,7 +2736,7 @@ ipv6_tcp_md5() show_hint "Should timeout since client in default VRF uses VRF password" run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} & run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NS_NET6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsc nettest -6 -r ${NSA_IP6} -X ${MD5_PW} log_test $? 2 "MD5: VRF: Prefix config in default VRF and VRF, conn in default VRF with VRF pw"
@@ -2744,7 +2744,7 @@ ipv6_tcp_md5() show_hint "Should timeout since client in VRF uses default VRF password" run_cmd nettest -6 -s -I ${VRF} -M ${MD5_PW} -m ${NS_NET6} & run_cmd nettest -6 -s -M ${MD5_WRONG_PW} -m ${NS_NET6} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${NSA_IP6} -X ${MD5_WRONG_PW} log_test $? 2 "MD5: VRF: Prefix config in default VRF and VRF, conn in VRF with default VRF pw"
@@ -2772,7 +2772,7 @@ ipv6_tcp_novrf() do log_start run_cmd nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 0 "Global server" done
@@ -2793,7 +2793,7 @@ ipv6_tcp_novrf() do log_start run_cmd_nsb nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest -6 -r ${a} log_test_addr ${a} $? 0 "Client" done
@@ -2802,7 +2802,7 @@ ipv6_tcp_novrf() do log_start run_cmd_nsb nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest -6 -r ${a} -d ${NSA_DEV} log_test_addr ${a} $? 0 "Client, device bind" done
@@ -2822,7 +2822,7 @@ ipv6_tcp_novrf() do log_start run_cmd nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} log_test_addr ${a} $? 0 "Global server, local connection" done
@@ -2830,7 +2830,7 @@ ipv6_tcp_novrf() a=${NSA_IP6} log_start run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} -0 ${a} log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
@@ -2839,7 +2839,7 @@ ipv6_tcp_novrf() log_start show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope" run_cmd nettest -6 -s -I ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} log_test_addr ${a} $? 1 "Device server, unbound client, local connection" done
@@ -2847,7 +2847,7 @@ ipv6_tcp_novrf() a=${NSA_IP6} log_start run_cmd nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a} log_test_addr ${a} $? 0 "Global server, device client, local connection"
@@ -2856,7 +2856,7 @@ ipv6_tcp_novrf() log_start show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope" run_cmd nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} -d ${NSA_DEV} log_test_addr ${a} $? 1 "Global server, device client, local connection" done
@@ -2865,7 +2865,7 @@ ipv6_tcp_novrf() do log_start run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "Device server, device client, local conn" done
@@ -2898,7 +2898,7 @@ ipv6_tcp_vrf() log_start show_hint "Should fail 'Connection refused' since global server with VRF is disabled" run_cmd nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 1 "Global server" done
@@ -2907,7 +2907,7 @@ ipv6_tcp_vrf() do log_start run_cmd nettest -6 -s -I ${VRF} -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 0 "VRF server" done
@@ -2916,7 +2916,7 @@ ipv6_tcp_vrf() a=${NSA_LINKIP6}%${NSB_DEV} log_start run_cmd nettest -6 -s -I ${VRF} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 0 "VRF server"
@@ -2924,7 +2924,7 @@ ipv6_tcp_vrf() do log_start run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 0 "Device server" done
@@ -2943,7 +2943,7 @@ ipv6_tcp_vrf() log_start show_hint "Should fail 'Connection refused' since global server with VRF is disabled" run_cmd nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} -d ${NSA_DEV} log_test_addr ${a} $? 1 "Global server, local connection"
@@ -2964,7 +2964,7 @@ ipv6_tcp_vrf() do log_start run_cmd nettest -6 -s -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 0 "Global server" done
@@ -2973,7 +2973,7 @@ ipv6_tcp_vrf() do log_start run_cmd nettest -6 -s -I ${VRF} -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 0 "VRF server" done
@@ -2982,13 +2982,13 @@ ipv6_tcp_vrf() a=${NSA_LINKIP6}%${NSB_DEV} log_start run_cmd nettest -6 -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 0 "Global server" log_start run_cmd nettest -6 -s -I ${VRF} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 0 "VRF server"
@@ -2996,7 +2996,7 @@ ipv6_tcp_vrf() do log_start run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 0 "Device server" done
@@ -3016,7 +3016,7 @@ ipv6_tcp_vrf() log_start show_hint "Fails 'Connection refused' since client is not in VRF" run_cmd nettest -6 -s -I ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} log_test_addr ${a} $? 1 "Global server, local connection" done
@@ -3029,7 +3029,7 @@ ipv6_tcp_vrf() do log_start run_cmd_nsb nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest -6 -r ${a} -d ${VRF} log_test_addr ${a} $? 0 "Client, VRF bind" done
@@ -3038,7 +3038,7 @@ ipv6_tcp_vrf() log_start show_hint "Fails since VRF device does not allow linklocal addresses" run_cmd_nsb nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest -6 -r ${a} -d ${VRF} log_test_addr ${a} $? 1 "Client, VRF bind"
@@ -3046,7 +3046,7 @@ ipv6_tcp_vrf() do log_start run_cmd_nsb nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest -6 -r ${a} -d ${NSA_DEV} log_test_addr ${a} $? 0 "Client, device bind" done
@@ -3071,7 +3071,7 @@ ipv6_tcp_vrf() do log_start run_cmd nettest -6 -s -I ${VRF} -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} -d ${VRF} -0 ${a} log_test_addr ${a} $? 0 "VRF server, VRF client, local connection" done
@@ -3079,7 +3079,7 @@ ipv6_tcp_vrf() a=${NSA_IP6} log_start run_cmd nettest -6 -s -I ${VRF} -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a} log_test_addr ${a} $? 0 "VRF server, device client, local connection"
@@ -3087,13 +3087,13 @@ ipv6_tcp_vrf() log_start show_hint "Should fail since unbound client is out of VRF scope" run_cmd nettest -6 -s -I ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} log_test_addr ${a} $? 1 "VRF server, unbound client, local connection" log_start run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} -d ${VRF} -0 ${a} log_test_addr ${a} $? 0 "Device server, VRF client, local connection"
@@ -3101,7 +3101,7 @@ ipv6_tcp_vrf() do log_start run_cmd nettest -6 -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a} log_test_addr ${a} $? 0 "Device server, device client, local connection" done
@@ -3141,13 +3141,13 @@ ipv6_udp_novrf() do log_start run_cmd nettest -6 -D -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${a} log_test_addr ${a} $? 0 "Global server" log_start run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${a} log_test_addr ${a} $? 0 "Device server" done
@@ -3155,7 +3155,7 @@ ipv6_udp_novrf() a=${NSA_LO_IP6} log_start run_cmd nettest -6 -D -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${a} log_test_addr ${a} $? 0 "Global server"
@@ -3165,7 +3165,7 @@ ipv6_udp_novrf() #log_start #show_hint "Should fail since loopback address is out of scope" #run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - #sleep 1 + wait_local_port_listen ${NSA} 12345 udp #run_cmd_nsb nettest -6 -D -r ${a} #log_test_addr ${a} $? 1 "Device server"
@@ -3185,25 +3185,25 @@ ipv6_udp_novrf() do log_start run_cmd_nsb nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -6 -D -r ${a} -0 ${NSA_IP6} log_test_addr ${a} $? 0 "Client" log_start run_cmd_nsb nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -0 ${NSA_IP6} log_test_addr ${a} $? 0 "Client, device bind" log_start run_cmd_nsb nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -C -0 ${NSA_IP6} log_test_addr ${a} $? 0 "Client, device send via cmsg" log_start run_cmd_nsb nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -S -0 ${NSA_IP6} log_test_addr ${a} $? 0 "Client, device bind via IPV6_UNICAST_IF"
@@ -3225,7 +3225,7 @@ ipv6_udp_novrf() do log_start run_cmd nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -r ${a} -0 ${a} -1 ${a} log_test_addr ${a} $? 0 "Global server, local connection" done
@@ -3233,7 +3233,7 @@ ipv6_udp_novrf() a=${NSA_IP6} log_start run_cmd nettest -6 -s -D -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -r ${a} log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
@@ -3242,7 +3242,7 @@ ipv6_udp_novrf() log_start show_hint "Should fail 'Connection refused' since address is out of device scope" run_cmd nettest -6 -s -D -I ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -r ${a} log_test_addr ${a} $? 1 "Device server, local connection" done
@@ -3250,19 +3250,19 @@ ipv6_udp_novrf() a=${NSA_IP6} log_start run_cmd nettest -6 -s -D & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "Global server, device client, local connection" log_start run_cmd nettest -6 -s -D & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -C -r ${a} log_test_addr ${a} $? 0 "Global server, device send via cmsg, local connection" log_start run_cmd nettest -6 -s -D & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -S -r ${a} log_test_addr ${a} $? 0 "Global server, device client via IPV6_UNICAST_IF, local connection"
@@ -3271,28 +3271,28 @@ ipv6_udp_novrf() log_start show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope" run_cmd nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} log_test_addr ${a} $? 1 "Global server, device client, local connection" log_start show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope" run_cmd nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -C log_test_addr ${a} $? 1 "Global server, device send via cmsg, local connection" log_start show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope" run_cmd nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -S log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection" log_start show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope" run_cmd nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -S -U log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection, with connect()" done
@@ -3300,7 +3300,7 @@ ipv6_udp_novrf() a=${NSA_IP6} log_start run_cmd nettest -6 -D -s -I ${NSA_DEV} -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a} -0 ${a} log_test_addr ${a} $? 0 "Device server, device client, local conn"
@@ -3314,7 +3314,7 @@ ipv6_udp_novrf() run_cmd_nsb ip -6 ro add ${NSA_IP6}/128 dev ${NSB_DEV} log_start run_cmd nettest -6 -s -D & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${NSA_IP6} log_test $? 0 "UDP in - LLA to GUA"
@@ -3338,7 +3338,7 @@ ipv6_udp_vrf() log_start show_hint "Should fail 'Connection refused' since global server is disabled" run_cmd nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${a} log_test_addr ${a} $? 1 "Global server" done
@@ -3347,7 +3347,7 @@ ipv6_udp_vrf() do log_start run_cmd nettest -6 -D -I ${VRF} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${a} log_test_addr ${a} $? 0 "VRF server" done
@@ -3356,7 +3356,7 @@ ipv6_udp_vrf() do log_start run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${a} log_test_addr ${a} $? 0 "Enslaved device server" done
@@ -3378,7 +3378,7 @@ ipv6_udp_vrf() log_start show_hint "Should fail 'Connection refused' since global server is disabled" run_cmd nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${VRF} -r ${a} log_test_addr ${a} $? 1 "Global server, VRF client, local conn" done
@@ -3387,7 +3387,7 @@ ipv6_udp_vrf() do log_start run_cmd nettest -6 -D -I ${VRF} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "VRF server, VRF client, local conn" done
@@ -3396,25 +3396,25 @@ ipv6_udp_vrf() log_start show_hint "Should fail 'Connection refused' since global server is disabled" run_cmd nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 1 "Global server, device client, local conn" log_start run_cmd nettest -6 -D -I ${VRF} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "VRF server, device client, local conn" log_start run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn" log_start run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
@@ -3429,7 +3429,7 @@ ipv6_udp_vrf() do log_start run_cmd nettest -6 -D -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${a} log_test_addr ${a} $? 0 "Global server" done
@@ -3438,7 +3438,7 @@ ipv6_udp_vrf() do log_start run_cmd nettest -6 -D -I ${VRF} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${a} log_test_addr ${a} $? 0 "VRF server" done
@@ -3447,7 +3447,7 @@ ipv6_udp_vrf() do log_start run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${a} log_test_addr ${a} $? 0 "Enslaved device server" done
@@ -3465,7 +3465,7 @@ ipv6_udp_vrf() # log_start run_cmd_nsb nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -6 -D -d ${VRF} -r ${NSB_IP6} log_test $? 0 "VRF client"
@@ -3476,7 +3476,7 @@ ipv6_udp_vrf() log_start run_cmd_nsb nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSB_IP6} log_test $? 0 "Enslaved device client"
@@ -3491,13 +3491,13 @@ ipv6_udp_vrf() a=${NSA_IP6} log_start run_cmd nettest -6 -D -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "Global server, VRF client, local conn" #log_start run_cmd nettest -6 -D -I ${VRF} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
@@ -3505,13 +3505,13 @@ ipv6_udp_vrf() a=${VRF_IP6} log_start run_cmd nettest -6 -D -s -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "Global server, VRF client, local conn" log_start run_cmd nettest -6 -D -I ${VRF} -s -3 ${VRF} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
@@ -3527,25 +3527,25 @@ ipv6_udp_vrf() a=${NSA_IP6} log_start run_cmd nettest -6 -D -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "Global server, device client, local conn" log_start run_cmd nettest -6 -D -I ${VRF} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "VRF server, device client, local conn" log_start run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${VRF} -r ${a} log_test_addr ${a} $? 0 "Device server, VRF client, local conn" log_start run_cmd nettest -6 -D -I ${NSA_DEV} -s -3 ${NSA_DEV} & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a} log_test_addr ${a} $? 0 "Device server, device client, local conn"
@@ -3557,7 +3557,7 @@ ipv6_udp_vrf() # link local addresses log_start run_cmd nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -d ${NSB_DEV} -r ${NSA_LINKIP6} log_test $? 0 "Global server, linklocal IP"
@@ -3568,7 +3568,7 @@ ipv6_udp_vrf() log_start run_cmd_nsb nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSB_LINKIP6} log_test $? 0 "Enslaved device client, linklocal IP"
@@ -3579,7 +3579,7 @@ ipv6_udp_vrf() log_start run_cmd nettest -6 -D -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSA_LINKIP6} log_test $? 0 "Enslaved device client, local conn - linklocal IP"
@@ -3592,7 +3592,7 @@ ipv6_udp_vrf() run_cmd_nsb ip -6 ro add ${NSA_IP6}/128 dev ${NSB_DEV} log_start run_cmd nettest -6 -s -D & - sleep 1 + wait_local_port_listen ${NSA} 12345 udp run_cmd_nsb nettest -6 -D -r ${NSA_IP6} log_test $? 0 "UDP in - LLA to GUA"
@@ -3771,7 +3771,7 @@ ipv6_rt() do log_start run_cmd nettest ${varg} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest ${varg} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -3785,7 +3785,7 @@ ipv6_rt() do log_start run_cmd nettest ${varg} -I ${VRF} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest ${varg} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -3799,7 +3799,7 @@ ipv6_rt() do log_start run_cmd nettest ${varg} -I ${NSA_DEV} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest ${varg} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -3814,7 +3814,7 @@ ipv6_rt() # log_start run_cmd_nsb nettest ${varg} -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest ${varg} -d ${VRF} -r ${NSB_IP6} & sleep 3 run_cmd ip link del ${VRF}
@@ -3825,7 +3825,7 @@ ipv6_rt() log_start run_cmd_nsb nettest ${varg} -s & - sleep 1 + wait_local_port_listen ${NSB} 12345 tcp run_cmd nettest ${varg} -d ${NSA_DEV} -r ${NSB_IP6} & sleep 3 run_cmd ip link del ${VRF}
@@ -3842,7 +3842,7 @@ ipv6_rt() do log_start run_cmd nettest ${varg} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest ${varg} -d ${VRF} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -3856,7 +3856,7 @@ ipv6_rt() do log_start run_cmd nettest ${varg} -I ${VRF} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest ${varg} -d ${VRF} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -3869,7 +3869,7 @@ ipv6_rt() a=${NSA_IP6} log_start run_cmd nettest ${varg} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -3880,7 +3880,7 @@ ipv6_rt() log_start run_cmd nettest ${varg} -I ${VRF} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -3891,7 +3891,7 @@ ipv6_rt() log_start run_cmd nettest ${varg} -I ${NSA_DEV} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} & sleep 3 run_cmd ip link del ${VRF}
@@ -3950,7 +3950,7 @@ netfilter_tcp_reset() do log_start run_cmd nettest -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -r ${a} log_test_addr ${a} $? 1 "Global server, reject with TCP-reset on Rx" done
@@ -3968,7 +3968,7 @@ netfilter_icmp() do log_start run_cmd nettest ${arg} -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest ${arg} -r ${a} log_test_addr ${a} $? 1 "Global ${stype} server, Rx reject icmp-port-unreach" done
@@ -4007,7 +4007,7 @@ netfilter_tcp6_reset() do log_start run_cmd nettest -6 -s & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 -r ${a} log_test_addr ${a} $? 1 "Global server, reject with TCP-reset on Rx" done
@@ -4025,7 +4025,7 @@ netfilter_icmp6() do log_start run_cmd nettest -6 -s ${arg} & - sleep 1 + wait_local_port_listen ${NSA} 12345 tcp run_cmd_nsb nettest -6 ${arg} -r ${a} log_test_addr ${a} $? 1 "Global ${stype} server, Rx reject icmp-port-unreach" done
@@ -4221,12 +4221,12 @@ use_case_snat_on_vrf() run_cmd ip6tables -t nat -A POSTROUTING -p tcp -m tcp --dport ${port} -j SNAT --to-source ${NSA_LO_IP6} -o ${VRF} run_cmd_nsb nettest -s -l ${NSB_IP} -p ${port} & - sleep 1 + wait_local_port_listen ${NSB} ${port} tcp run_cmd nettest -d ${VRF} -r ${NSB_IP} -p ${port} log_test $? 0 "IPv4 TCP connection over VRF with SNAT" run_cmd_nsb nettest -6 -s -l ${NSB_IP6} -p ${port} & - sleep 1 + wait_local_port_listen ${NSB} ${port} tcp run_cmd nettest -6 -d ${VRF} -r ${NSB_IP6} -p ${port} log_test $? 0 "IPv6 TCP connection over VRF with SNAT"
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 511/849 media: redrat3: use int type to store negative error codes
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qianfeng Rong <[email protected]>
[ Upstream commit ecba852dc9f4993f4f894ea1f352564560e19a3e ]
Change "ret" from u8 to int type in redrat3_enable_detector() to store negative error codes or zero returned by redrat3_send_cmd() and usb_submit_urb() - this better aligns with the coding standards and maintains code consistency.
No effect on runtime.
--- drivers/media/rc/redrat3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/rc/redrat3.c +1 -1
@@ -422,7 +422,7 @@ static int redrat3_send_cmd(int cmd, struct redrat3_dev *rr3)static int redrat3_enable_detector (struct redrat3_dev *rr3) {struct device *dev = rr3->dev; -u8 ret; +int ret; ret =redrat3_send_cmd (RR3_RC_DET_ENABLE , rr3);if (ret !=0 )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 512/849 platform/x86/amd/pmf: Fix the custom bios input handling mechanism
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shyam Sundar S K <[email protected]>
[ Upstream commit d82e3d2dd0ba019ac6cdd81e47bf4c8ac895cfa0 ]
Originally, the 'amd_pmf_get_custom_bios_inputs()' function was written under the assumption that the BIOS would only send a single pending request for the driver to process. However, following OEM enablement, it became clear that multiple pending requests for custom BIOS inputs might be sent at the same time, a scenario that the current code logic does not support when it comes to handling multiple custom BIOS inputs.
To address this, the code logic needs to be improved to not only manage multiple simultaneous custom BIOS inputs but also to ensure it is scalable for future additional inputs.
--- drivers/platform/x86/amd/pmf/pmf.h | 15 +++++----- drivers/platform/x86/amd/pmf/spc.c | 48 +++++++++++++++++++++++------- 2 files changed, 44 insertions(+), 19 deletions(-)
drivers/platform/x86/amd/pmf/pmf.h +7 -8
@@ -621,14 +621,14 @@ enum ta_slider { TA_MAX, }; -enum apmf_smartpc_custom_bios_inputs { -APMF_SMARTPC_CUSTOM_BIOS_INPUT1 , -APMF_SMARTPC_CUSTOM_BIOS_INPUT2 , +struct amd_pmf_pb_bitmap { +const char *name; +u32 bit_mask; }; -enum apmf_preq_smartpc { -NOTIFY_CUSTOM_BIOS_INPUT1 =5 , -NOTIFY_CUSTOM_BIOS_INPUT2 , +static const struct amd_pmf_pb_bitmap custom_bios_inputs[]__used = { + {"NOTIFY_CUSTOM_BIOS_INPUT1" ,BIT (5 )}, + {"NOTIFY_CUSTOM_BIOS_INPUT2" ,BIT (6 )}, };enum platform_type {
@@ -686,8 +686,7 @@ struct ta_pmf_condition_info {u32 power_slider;u32 lid_state;bool user_present; -u32 bios_input1; -u32 bios_input2; +u32 bios_input_1[2 ];u32 monitor_count;u32 rsvd2[2 ];u32 bat_design;
drivers/platform/x86/amd/pmf/spc.c +37 -11
74 lines not on this page · raw message
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 513/849 selftests: traceroute: Use require_command()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 47efbac9b768553331b9459743a29861e0acd797 ]
Use require_command() so that the test will return SKIP (4) when a required command is not present.
Before:
# ./traceroute.sh SKIP: Could not run IPV6 test without traceroute6 SKIP: Could not run IPV4 test without traceroute $ echo $? 0
After:
# ./traceroute.sh TEST: traceroute6 not installed [SKIP] $ echo $? 4
--- tools/testing/selftests/net/traceroute.sh | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-)
tools/testing/selftests/net/traceroute.sh +3 -10
@@ -203,11 +203,6 @@ setup_traceroute6() run_traceroute6() { - if [ ! -x "$(command -v traceroute6)" ]; then - echo "SKIP: Could not run IPV6 test without traceroute6" - return - fi - setup_traceroute6 # traceroute6 host-2 from host-1 (expects 2000:102::2)
@@ -268,11 +263,6 @@ setup_traceroute() run_traceroute() { - if [ ! -x "$(command -v traceroute)" ]; then - echo "SKIP: Could not run IPV4 test without traceroute" - return - fi - setup_traceroute # traceroute host-2 from host-1 (expects 1.0.1.1). Takes a while.
@@ -306,6 +296,9 @@ do esac done +require_command traceroute6 +require_command traceroute + run_tests printf "\nTests passed: %3d\n" ${nsuccess}
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 514/849 selftests: traceroute: Return correct value on failure
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit c068ba9d3ded56cb1ba4d5135ee84bf8039bd563 ]
The test always returns success even if some tests were modified to fail. Fix by converting the test to use the appropriate library functions instead of using its own functions.
Before:
# ./traceroute.sh TEST: IPV6 traceroute [FAIL] TEST: IPV4 traceroute [ OK ]
Tests passed: 1
Tests failed: 1
$ echo $? 0
After:
# ./traceroute.sh
TEST: IPv6 traceroute [FAIL]
traceroute6 did not return 2000:102::2
TEST: IPv4 traceroute [ OK ]
$ echo $?
1--- tools/testing/selftests/net/traceroute.sh | 38 ++++++----------------- 1 file changed, 9 insertions(+), 29 deletions(-)
tools/testing/selftests/net/traceroute.sh +9 -29
@@ -10,28 +10,6 @@ PAUSE_ON_FAIL=no ################################################################################ # -log_test() -{ - local rc=$1 - local expected=$2 - local msg="$3" - - if [ ${rc} -eq ${expected} ]; then - printf "TEST: %-60s [ OK ]\n" "${msg}" - nsuccess=$((nsuccess+1)) - else - ret=1 - nfail=$((nfail+1)) - printf "TEST: %-60s [FAIL]\n" "${msg}" - if [ "${PAUSE_ON_FAIL}" = "yes" ]; then - echo - echo "hit enter to continue, 'q' to quit" - read a - [ "$a" = "q" ] && exit 1 - fi - fi -} - run_cmd() { local ns
@@ -205,9 +183,12 @@ run_traceroute6() { setup_traceroute6 + RET=0 + # traceroute6 host-2 from host-1 (expects 2000:102::2) run_cmd $h1 "traceroute6 2000:103::4 | grep -q 2000:102::2" - log_test $? 0 "IPV6 traceroute" + check_err $? "traceroute6 did not return 2000:102::2" + log_test "IPv6 traceroute" cleanup_traceroute6 }
@@ -265,9 +246,12 @@ run_traceroute() { setup_traceroute + RET=0 + # traceroute host-2 from host-1 (expects 1.0.1.1). Takes a while. run_cmd $h1 "traceroute 1.0.2.4 | grep -q 1.0.1.1" - log_test $? 0 "IPV4 traceroute" + check_err $? "traceroute did not return 1.0.1.1" + log_test "IPv4 traceroute" cleanup_traceroute }
@@ -284,9 +268,6 @@ run_tests() ################################################################################ # main -declare -i nfail=0 -declare -i nsuccess=0 - while getopts :pv o do case $o in
@@ -301,5 +282,4 @@ require_command traceroute run_tests -printf "\nTests passed: %3d\n" ${nsuccess} -printf "Tests failed: %3d\n" ${nfail} +exit "${EXIT_STATUS}"
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 515/849 openrisc: Add R_OR1K_32_PCREL relocation type module support
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: chenmiao <[email protected]>
[ Upstream commit 9d0cb6d00be891586261a35da7f8c3c956825c39 ]
To ensure the proper functioning of the jump_label test module, this patch adds support for the R_OR1K_32_PCREL relocation type for any modules. The implementation calculates the PC-relative offset by subtracting the instruction location from the target value and stores the result at the specified location.
--- arch/openrisc/kernel/module.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/openrisc/kernel/module.c +4 -0
@@ -55,6 +55,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, value |= *location &0xfc000000 ; *location = value;break ; +case R_OR1K_32_PCREL : + value -= (uint32_t )location; + *location = value; +break ;case R_OR1K_AHI16 :/* Adjust the operand to match with a signed LO16. */ value +=0x8000 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 516/849 netfilter: nf_reject: dont reply to icmp error messages
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit db99b2f2b3e2cd8227ac9990ca4a8a31a1e95e56 ]
tcp reject code won't reply to a tcp reset.
But the icmp reject 'netdev' family versions will reply to icmp dst-unreach errors, unlike icmp_send() and icmp6_send() which are used by the inet family implementation (and internally by the REJECT target).
Check for the icmp(6) type and do not respond if its an unreachable error.
Without this, something like 'ip protocol icmp reject', when used in a netdev chain attached to 'lo', cause a packet loop.
Same for two hosts that both use such a rule: each error packet will be replied to.
Such situation persist until the (bogus) rule is amended to ratelimit or checks the icmp type before the reject statement.
As the inet versions don't do this make the netdev ones follow along.
--- net/ipv4/netfilter/nf_reject_ipv4.c | 25 ++++++++++++++++++++++++ net/ipv6/netfilter/nf_reject_ipv6.c | 30 +++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+)
net/ipv4/netfilter/nf_reject_ipv4.c +25 -0
@@ -71,6 +71,27 @@ struct sk_buff *nf_reject_skb_v4_tcp_reset(struct net *net, }EXPORT_SYMBOL_GPL (nf_reject_skb_v4_tcp_reset); +static bool nf_skb_is_icmp_unreach (const struct sk_buff *skb) +{ +const struct iphdr *iph =ip_hdr (skb); +u8 *tp, _type; +int thoff; + +if (iph->protocol !=IPPROTO_ICMP ) +return false; + + thoff =skb_network_offset (skb) +sizeof (*iph); + + tp =skb_header_pointer (skb, + thoff + offsetof(struct icmphdr , type), +sizeof (_type), &_type); + +if (!tp) +return false; + +return *tp ==ICMP_DEST_UNREACH ; +} + struct sk_buff *nf_reject_skb_v4_unreach(struct net *net, struct sk_buff *oldskb, const struct net_device *dev,
@@ -91,6 +112,10 @@ struct sk_buff *nf_reject_skb_v4_unreach(struct net *net,if (ip_hdr (oldskb)->frag_off &htons (IP_OFFSET ))return NULL ; +/* don't reply to ICMP_DEST_UNREACH with ICMP_DEST_UNREACH. */ +if (nf_skb_is_icmp_unreach (oldskb)) +return NULL ; +/* RFC says return as much as we can without exceeding 576 bytes. */ len = min_t(unsigned int, 536, oldskb->len);
net/ipv6/netfilter/nf_reject_ipv6.c +30 -0
@@ -91,6 +91,32 @@ struct sk_buff *nf_reject_skb_v6_tcp_reset(struct net *net, }EXPORT_SYMBOL_GPL (nf_reject_skb_v6_tcp_reset); +static bool nf_skb_is_icmp6_unreach (const struct sk_buff *skb) +{ +const struct ipv6hdr *ip6h =ipv6_hdr (skb); +u8 proto = ip6h->nexthdr; +u8 _type, *tp; +int thoff; +__be16 fo; + + thoff =ipv6_skip_exthdr (skb, ((u8 *)(ip6h +1 ) - skb->data), &proto, &fo); + +if (thoff <0 || thoff >= skb->len || fo !=0 ) +return false; + +if (proto !=IPPROTO_ICMPV6 ) +return false; + + tp =skb_header_pointer (skb, + thoff + offsetof(struct icmp6hdr , icmp6_type), +sizeof (_type), &_type); + +if (!tp) +return false; + +return *tp ==ICMPV6_DEST_UNREACH ; +} + struct sk_buff *nf_reject_skb_v6_unreach(struct net *net, struct sk_buff *oldskb, const struct net_device *dev,
@@ -104,6 +130,10 @@ struct sk_buff *nf_reject_skb_v6_unreach(struct net *net,if (!nf_reject_ip6hdr_validate (oldskb))return NULL ; +/* Don't reply to ICMPV6_DEST_UNREACH with ICMPV6_DEST_UNREACH */ +if (nf_skb_is_icmp6_unreach (oldskb)) +return NULL ; +/* Include "As much of invoking packet as possible without the ICMPv6 * packet exceeding the minimum IPv6 MTU" in the ICMP payload. */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 517/849 x86/kvm: Prefer native qspinlock for dedicated vCPUs irrespective of PV_UNHALT
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li RongQing <[email protected]>
[ Upstream commit 960550503965094b0babd7e8c83ec66c8a763b0b ]
The commit b2798ba0b876 ("KVM: X86: Choose qspinlock when dedicated physical CPUs are available") states that when PV_DEDICATED=1 (vCPU has dedicated pCPU), qspinlock should be preferred regardless of PV_UNHALT. However, the current implementation doesn't reflect this: when PV_UNHALT=0, we still use virt_spin_lock() even with dedicated pCPUs.
This is suboptimal because:
1. Native qspinlocks should outperform virt_spin_lock() for dedicated vCPUs irrespective of HALT exiting
2. virt_spin_lock() should only be preferred when vCPUs may be preempted (non-dedicated case)
So reorder the PV spinlock checks to:
1. First handle dedicated pCPU case (disable virt_spin_lock_key)
2. Second check single CPU, and nopvspin configuration
3. Only then check PV_UNHALT support
This ensures we always use native qspinlock for dedicated vCPUs, delivering pretty performance gains at high contention levels.
--- arch/x86/kernel/kvm.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
arch/x86/kernel/kvm.c +10 -10
@@ -1089,16 +1089,6 @@ static void kvm_wait(u8 *ptr, u8 val)*/ void __init kvm_spinlock_init (void ) { -/* -* In case host doesn't support KVM_FEATURE_PV_UNHALT there is still an -* advantage of keeping virt_spin_lock_key enabled: virt_spin_lock() is -* preferred over native qspinlock when vCPU is preempted. -*/ -if (!kvm_para_has_feature (KVM_FEATURE_PV_UNHALT )) { -pr_info ("PV spinlocks disabled, no host support\n" ); -return ; - } -/* * Disable PV spinlocks and use native qspinlock when dedicated pCPUs * are available.
@@ -1118,6 +1108,16 @@ void __init kvm_spinlock_init(void) goto out; } +/* +* In case host doesn't support KVM_FEATURE_PV_UNHALT there is still an +* advantage of keeping virt_spin_lock_key enabled: virt_spin_lock() is +* preferred over native qspinlock when vCPU is preempted. +*/ +if (!kvm_para_has_feature (KVM_FEATURE_PV_UNHALT )) { +pr_info ("PV spinlocks disabled, no host support\n" ); +return ; + } +pr_info ("PV spinlocks enabled\n" );__pv_init_lock_hash ();
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 518/849 x86/virt/tdx: Use precalculated TDVPR page physical address
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kai Huang <[email protected]>
[ Upstream commit e414b1005891d74bb0c3d27684c58dfbfbd1754b ]
All of the x86 KVM guest types (VMX, SEV and TDX) do some special context tracking when entering guests. This means that the actual guest entry sequence must be noinstr.
Part of entering a TDX guest is passing a physical address to the TDX module. Right now, that physical address is stored as a 'struct page' and converted to a physical address at guest entry. That page=>phys conversion can be complicated, can vary greatly based on kernel config, and it is definitely _not_ a noinstr path today.
There have been a number of tinkering approaches to try and fix this up, but they all fall down due to some part of the page=>phys conversion infrastructure not being noinstr friendly.
Precalculate the page=>phys conversion and store it in the existing 'tdx_vp' structure. Use the new field at every site that needs a tdvpr physical address. Remove the now redundant tdx_tdvpr_pa(). Remove the __flatten remnant from the tinkering.
Note that only one user of the new field is actually noinstr. All others can use page_to_phys(). But, they might as well save the effort since there is a pre-calculated value sitting there for them.
[ dhansen: rewrite all the text ]
--- arch/x86/include/asm/tdx.h | 2 ++ arch/x86/kvm/vmx/tdx.c | 9 +++++++++ arch/x86/virt/vmx/tdx/tdx.c | 21 ++++++++------------- 3 files changed, 19 insertions(+), 13 deletions(-)
arch/x86/include/asm/tdx.h +2 -0
@@ -146,6 +146,8 @@ struct tdx_td {struct tdx_vp {/* TDVP root page */ struct page *tdvpr_page; +/* precalculated page_to_phys(tdvpr_page) for use in noinstr code */ +phys_addr_t tdvpr_pa;/* TD vCPU control structure: */ struct page **tdcx_pages;
arch/x86/kvm/vmx/tdx.c +9 -0
@@ -861,6 +861,7 @@ void tdx_vcpu_free(struct kvm_vcpu *vcpu)if (tdx->vp.tdvpr_page) {tdx_reclaim_control_page (tdx->vp.tdvpr_page); tdx->vp.tdvpr_page =0 ; + tdx->vp.tdvpr_pa =0 ; } tdx->state =VCPU_TD_STATE_UNINITIALIZED ;
@@ -2940,6 +2941,13 @@ static int tdx_td_vcpu_init(struct kvm_vcpu *vcpu, u64 vcpu_rcx)return -ENOMEM ; tdx->vp.tdvpr_page = page; +/* +* page_to_phys() does not work in 'noinstr' code, like guest +* entry via tdh_vp_enter(). Precalculate and store it instead +* of doing it at runtime later. +*/ + tdx->vp.tdvpr_pa =page_to_phys (tdx->vp.tdvpr_page); + tdx->vp.tdcx_pages =kcalloc (kvm_tdx->td.tdcx_nr_pages,sizeof (*tdx->vp.tdcx_pages),GFP_KERNEL );if (!tdx->vp.tdcx_pages) {
@@ -3002,6 +3010,7 @@ static int tdx_td_vcpu_init(struct kvm_vcpu *vcpu, u64 vcpu_rcx)if (tdx->vp.tdvpr_page)__free_page (tdx->vp.tdvpr_page); tdx->vp.tdvpr_page =0 ; + tdx->vp.tdvpr_pa =0 ;return ret; }
arch/x86/virt/vmx/tdx/tdx.c +8 -13
@@ -1502,11 +1502,6 @@ static inline u64 tdx_tdr_pa(struct tdx_td *td)return page_to_phys (td->tdr_page); } -static inline u64 tdx_tdvpr_pa (struct tdx_vp *td) -{ -return page_to_phys (td->tdvpr_page); -} -/* * The TDX module exposes a CLFLUSH_BEFORE_ALLOC bit to specify whether * a CLFLUSH of pages is required before handing them to the TDX module.
@@ -1518,9 +1513,9 @@ static void tdx_clflush_page(struct page *page)clflush_cache_range (page_to_virt (page),PAGE_SIZE ); } -noinstr __flatten u64 tdh_vp_enter(struct tdx_vp *td, struct tdx_module_args *args) +noinstr u64 tdh_vp_enter(struct tdx_vp *td, struct tdx_module_args *args) { - args->rcx =tdx_tdvpr_pa (td); + args->rcx = td->tdvpr_pa;return __seamcall_saved_ret (TDH_VP_ENTER , args); }
@@ -1581,7 +1576,7 @@ u64 tdh_vp_addcx(struct tdx_vp *vp, struct page *tdcx_page) {struct tdx_module_args args = { .rcx =page_to_phys (tdcx_page), - .rdx =tdx_tdvpr_pa (vp), + .rdx = vp->tdvpr_pa, };tdx_clflush_page (tdcx_page);
@@ -1650,7 +1645,7 @@ EXPORT_SYMBOL_GPL(tdh_mng_create);u64 tdh_vp_create (struct tdx_td *td,struct tdx_vp *vp) {struct tdx_module_args args = { - .rcx =tdx_tdvpr_pa (vp), + .rcx = vp->tdvpr_pa, .rdx =tdx_tdr_pa (td), };
@@ -1706,7 +1701,7 @@ EXPORT_SYMBOL_GPL(tdh_mr_finalize);u64 tdh_vp_flush (struct tdx_vp *vp) {struct tdx_module_args args = { - .rcx =tdx_tdvpr_pa (vp), + .rcx = vp->tdvpr_pa, };return seamcall (TDH_VP_FLUSH , &args);
@@ -1752,7 +1747,7 @@ EXPORT_SYMBOL_GPL(tdh_mng_init);u64 tdh_vp_rd (struct tdx_vp *vp,u64 field,u64 *data) {struct tdx_module_args args = { - .rcx =tdx_tdvpr_pa (vp), + .rcx = vp->tdvpr_pa, .rdx = field, };u64 ret;
@@ -1769,7 +1764,7 @@ EXPORT_SYMBOL_GPL(tdh_vp_rd);u64 tdh_vp_wr (struct tdx_vp *vp,u64 field,u64 data,u64 mask) {struct tdx_module_args args = { - .rcx =tdx_tdvpr_pa (vp), + .rcx = vp->tdvpr_pa, .rdx = field, .r8 = data, .r9 = mask,
@@ -1782,7 +1777,7 @@ EXPORT_SYMBOL_GPL(tdh_vp_wr);u64 tdh_vp_init (struct tdx_vp *vp,u64 initial_rcx,u32 x2apicid) {struct tdx_module_args args = { - .rcx =tdx_tdvpr_pa (vp), + .rcx = vp->tdvpr_pa, .rdx = initial_rcx, .r8 = x2apicid, };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 519/849 selftests: Disable dad for ipv6 in fcnal-test.sh
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Ahern <[email protected]>
[ Upstream commit 53d591730ea34f97a82f7ec6e7c987ca6e34dc21 ]
Constrained test environment; duplicate address detection is not needed and causes races so disable it.
--- tools/testing/selftests/net/fcnal-test.sh | 2 ++ 1 file changed, 2 insertions(+)
tools/testing/selftests/net/fcnal-test.sh +2 -0
@@ -424,6 +424,8 @@ create_ns() ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1 ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1 ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1 + ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0 + ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.accept_dad=0 } # create veth pair to connect namespaces and apply addresses.
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 520/849 eth: 8139too: Make 8139TOO_PIO depend on !NO_IOPORT_MAP
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Palmer <[email protected]>
[ Upstream commit 43adad382e1fdecabd2c4cd2bea777ef4ce4109e ]
When 8139too is probing and 8139TOO_PIO=y it will call pci_iomap_range() and from there __pci_ioport_map() for the PCI IO space.
If HAS_IOPORT_MAP=n and NO_GENERIC_PCI_IOPORT_MAP=n, like it is on my m68k config, __pci_ioport_map() becomes NULL, pci_iomap_range() will always fail and the driver will complain it couldn't map the PIO space and return an error.
NO_IOPORT_MAP seems to cover the case where what 8139too is trying to do cannot ever work so make 8139TOO_PIO depend on being it false and avoid creating an unusable driver.
--- drivers/net/ethernet/realtek/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/realtek/Kconfig +1 -1
@@ -58,7 +58,7 @@ config 8139TOO config 8139TOO_PIO bool "Use PIO instead of MMIO" default y - depends on 8139TOO + depends on 8139TOO && !NO_IOPORT_MAP help This instructs the driver to use programmed I/O ports (PIO) instead of PCI shared memory (MMIO). This can possibly solve some problems
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 521/849 PCI/AER: Fix NULL pointer access by aer_info
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vernon Yang <[email protected]>
[ Upstream commit 0a27bdb14b028fed30a10cec2f945c38cb5ca4fa ]
The kzalloc(GFP_KERNEL) may return NULL, so all accesses to aer_info->xxx will result in kernel panic. Fix it.
--- drivers/pci/pcie/aer.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/pci/pcie/aer.c +4 -0
@@ -383,6 +383,10 @@ void pci_aer_init(struct pci_dev *dev)return ; dev->aer_info =kzalloc (sizeof (*dev->aer_info),GFP_KERNEL ); +if (!dev->aer_info) { + dev->aer_cap =0 ; +return ; + }ratelimit_state_init (&dev->aer_info->correctable_ratelimit,DEFAULT_RATELIMIT_INTERVAL ,DEFAULT_RATELIMIT_BURST );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 522/849 selftests: Replace sleep with slowwait
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Ahern <[email protected]>
[ Upstream commit 2f186dd5585c3afb415df80e52f71af16c9d3655 ]
Replace the sleep in kill_procs with slowwait.
--- tools/testing/selftests/net/fcnal-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/fcnal-test.sh +1 -1
@@ -189,7 +189,7 @@ show_hint() kill_procs() { killall nettest ping ping6 >/dev/null 2>&1 - sleep 1 + slowwait 2 sh -c 'test -z "$(pgrep '"'^(nettest|ping|ping6)$'"')"' } set_ping_group()
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 523/849 net: devmem: expose tcp_recvmsg_locked errors
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stanislav Fomichev <[email protected]>
[ Upstream commit 18282100d7040614b553f1cad737cb689c04e2b9 ]
tcp_recvmsg_dmabuf can export the following errors:
- EFAULT when linear copy fails
- ETOOSMALL when cmsg put fails
- ENODEV if one of the frags is readable
- ENOMEM on xarray failures
But they are all ignored and replaced by EFAULT in the caller (tcp_recvmsg_locked). Expose real error to the userspace to add more transparency on what specifically fails.
In non-devmem case (skb_copy_datagram_msg) doing if (!copied) copied=-EFAULT is ok because skb_copy_datagram_msg can return only EFAULT.
--- net/ipv4/tcp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp.c +2 -2
@@ -2821,9 +2821,9 @@ static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len, err =tcp_recvmsg_dmabuf (sk, skb, offset, msg, used); -if (err <=0 ) { +if (err <0 ) {if (!copied) - copied = -EFAULT ; + copied = err;break ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 524/849 selftests: net: lib.sh: Dont defer failed commands
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Machata <[email protected]>
[ Upstream commit fa57032941d4b451c7264ebf3ad595bc98e3a9a9 ]
Usually the autodefer helpers in lib.sh are expected to be run in context where success is the expected outcome. However when using them for feature detection, failure can legitimately occur. But the failed command still schedules a cleanup, which will likely fail again.
Instead, only schedule deferred cleanup when the positive command succeeds.
This way of organizing the cleanup has the added benefit that now the return code from these functions reflects whether the command passed.
--- tools/testing/selftests/net/lib.sh | 32 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-)
tools/testing/selftests/net/lib.sh +16 -16
@@ -547,8 +547,8 @@ ip_link_add() { local name=$1; shift - ip link add name "$name" "$@" - defer ip link del dev "$name" + ip link add name "$name" "$@" && \ + defer ip link del dev "$name" } ip_link_set_master()
@@ -556,8 +556,8 @@ ip_link_set_master() local member=$1; shift local master=$1; shift - ip link set dev "$member" master "$master" - defer ip link set dev "$member" nomaster + ip link set dev "$member" master "$master" && \ + defer ip link set dev "$member" nomaster } ip_link_set_addr()
@@ -566,8 +566,8 @@ ip_link_set_addr() local addr=$1; shift local old_addr=$(mac_get "$name") - ip link set dev "$name" address "$addr" - defer ip link set dev "$name" address "$old_addr" + ip link set dev "$name" address "$addr" && \ + defer ip link set dev "$name" address "$old_addr" } ip_link_has_flag()
@@ -590,8 +590,8 @@ ip_link_set_up() local name=$1; shift if ! ip_link_is_up "$name"; then - ip link set dev "$name" up - defer ip link set dev "$name" down + ip link set dev "$name" up && \ + defer ip link set dev "$name" down fi }
@@ -600,8 +600,8 @@ ip_link_set_down() local name=$1; shift if ip_link_is_up "$name"; then - ip link set dev "$name" down - defer ip link set dev "$name" up + ip link set dev "$name" down && \ + defer ip link set dev "$name" up fi }
@@ -609,20 +609,20 @@ ip_addr_add() { local name=$1; shift - ip addr add dev "$name" "$@" - defer ip addr del dev "$name" "$@" + ip addr add dev "$name" "$@" && \ + defer ip addr del dev "$name" "$@" } ip_route_add() { - ip route add "$@" - defer ip route del "$@" + ip route add "$@" && \ + defer ip route del "$@" } bridge_vlan_add() { - bridge vlan add "$@" - defer bridge vlan del "$@" + bridge vlan add "$@" && \ + defer bridge vlan del "$@" } wait_local_port_listen()
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 525/849 udp_tunnel: use netdev_warn() instead of netdev_WARN()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit dc2f650f7e6857bf384069c1a56b2937a1ee370d ]
netdev_WARN() uses WARN/WARN_ON to print a backtrace along with file and line information. In this case, udp_tunnel_nic_register() returning an error is just a failed operation, not a kernel bug.
udp_tunnel_nic_register() can fail due to a memory allocation failure (kzalloc() or udp_tunnel_nic_alloc()).
This is a normal runtime error and not a kernel bug.
Replace netdev_WARN() with netdev_warn() accordingly.
--- net/ipv4/udp_tunnel_nic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/udp_tunnel_nic.c +1 -1
@@ -930,7 +930,7 @@ udp_tunnel_nic_netdevice_event(struct notifier_block *unused, err =udp_tunnel_nic_register (dev);if (err) -netdev_WARN (dev,"failed to register for UDP tunnel offloads: %d" , err); +netdev_warn (dev,"failed to register for UDP tunnel offloads: %d" , err);return notifier_from_errno (err); }/* All other events will need the udp_tunnel_nic state */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 526/849 HID: asus: add Z13 folio to generic group for multitouch to work
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antheas Kapenekakis <[email protected]>
[ Upstream commit b595974b4afe0e171dd707da570964ff642742e3 ]
The Asus Z13 folio has a multitouch touchpad that needs to bind to the hid-multitouch driver in order to work properly. So bind it to the HID_GROUP_GENERIC group to release the touchpad and move it to the bottom so that the comment applies to it.
While at it, change the generic KEYBOARD3 name to Z13_FOLIO.
--- drivers/hid/hid-asus.c | 6 +++--- drivers/hid/hid-ids.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/hid/hid-asus.c +3 -3
@@ -1387,9 +1387,6 @@ static const struct hid_device_id asus_devices[] = { {HID_USB_DEVICE (USB_VENDOR_ID_ASUSTEK ,USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD2 ), QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, - { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, -USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3 ), - QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,USB_DEVICE_ID_ASUSTEK_ROG_Z13_LIGHTBAR ), QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD },
@@ -1419,6 +1416,9 @@ static const struct hid_device_id asus_devices[] = {* Note bind to the HID_GROUP_GENERIC group, so that we only bind to the keyboard * part, while letting hid-multitouch.c handle the touchpad. */ + {HID_DEVICE (BUS_USB ,HID_GROUP_GENERIC , +USB_VENDOR_ID_ASUSTEK ,USB_DEVICE_ID_ASUSTEK_ROG_Z13_FOLIO ), + QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_T101HA_KEYBOARD) }, { }
drivers/hid/hid-ids.h +1 -1
@@ -223,7 +223,7 @@#define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3 0x1822#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD 0x1866#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD2 0x19b6 -#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3 0x1a30 +#define USB_DEVICE_ID_ASUSTEK_ROG_Z13_FOLIO 0x1a30#define USB_DEVICE_ID_ASUSTEK_ROG_Z13_LIGHTBAR 0x18c6#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY 0x1abe#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X 0x1b4c
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 527/849 watchdog: s3c2410_wdt: Fix max_timeout being calculated larger
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sangwook Shin <[email protected]>
[ Upstream commit df3c6e0b6d83450563d6266e1dacc7eaf25511f4 ]
Fix the issue of max_timeout being calculated larger than actual value. The calculation result of freq / (S3C2410_WTCON_PRESCALE_MAX + 1) / S3C2410_WTCON_MAXDIV is smaller than the actual value because the remainder is discarded during the calculation process. This leads to a larger calculated value for max_timeout compared to the actual settable value. To resolve this issue, the order of calculations in the computation process has been adjusted.
--- drivers/watchdog/s3c2410_wdt.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/watchdog/s3c2410_wdt.c +8 -2
@@ -27,6 +27,7 @@#include <linux/mfd/syscon.h> #include <linux/regmap.h> #include <linux/delay.h> +#include <linux/math64.h> #define S3C2410_WTCON 0x00#define S3C2410_WTDAT 0x04
@@ -410,9 +411,14 @@ static inline unsigned long s3c2410wdt_get_freq(struct s3c2410_wdt *wdt)static inline unsigned int s3c2410wdt_max_timeout (struct s3c2410_wdt *wdt) {const unsigned long freq =s3c2410wdt_get_freq (wdt); +const u64 n_max = (u64)(S3C2410_WTCON_PRESCALE_MAX +1 ) * +S3C2410_WTCON_MAXDIV *S3C2410_WTCNT_MAXCNT ; +u64 t_max =div64_ul (n_max, freq); -return S3C2410_WTCNT_MAXCNT / (freq / (S3C2410_WTCON_PRESCALE_MAX +1 ) - /S3C2410_WTCON_MAXDIV ); +if (t_max >UINT_MAX ) + t_max =UINT_MAX ; + +return t_max; }static int s3c2410wdt_disable_wdt_reset (struct s3c2410_wdt *wdt,bool mask)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 528/849 crypto: sun8i-ce - remove channel timeout field
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ovidiu Panait <[email protected]>
[ Upstream commit 9a23ea1f7558bdd3f8d2b35b1c2e16a2f9bf671e ]
Using the number of bytes in the request as DMA timeout is really inconsistent, as large requests could possibly set a timeout of hundreds of seconds.
Remove the per-channel timeout field and use a single, static DMA timeout of 3 seconds for all requests.
--- drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c | 1 - drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c | 5 ++--- drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c | 2 -- drivers/crypto/allwinner/sun8i-ce/sun8i-ce-prng.c | 1 - drivers/crypto/allwinner/sun8i-ce/sun8i-ce-trng.c | 1 - drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h | 2 +- 6 files changed, 3 insertions(+), 9 deletions(-)
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +0 -1
@@ -276,7 +276,6 @@ static int sun8i_ce_cipher_prepare(struct crypto_engine *engine, void *async_req goto theend_sgs; } - chan->timeout = areq->cryptlen; rctx->nr_sgs = ns; rctx->nr_sgd = nd;return 0 ;
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c +2 -3
@@ -210,11 +210,10 @@ int sun8i_ce_run_task(struct sun8i_ce_dev *ce, int flow, const char *name)mutex_unlock (&ce->mlock);wait_for_completion_interruptible_timeout (&ce->chanlist[flow].complete, -msecs_to_jiffies (ce->chanlist[flow].timeout)); +msecs_to_jiffies (CE_DMA_TIMEOUT_MS ));if (ce->chanlist[flow].status ==0 ) { -dev_err (ce->dev,"DMA timeout for %s (tm=%d) on flow %d\n" , name, - ce->chanlist[flow].timeout, flow); +dev_err (ce->dev,"DMA timeout for %s on flow %d\n" , name, flow); err = -EFAULT ; }/* No need to lock for this read, the channel is locked so
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c +0 -2
@@ -446,8 +446,6 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq)else cet->t_dlen =cpu_to_le32 (areq->nbytes /4 + j); - chan->timeout = areq->nbytes; - err =sun8i_ce_run_task (ce, flow,crypto_ahash_alg_name (tfm));dma_unmap_single (ce->dev, addr_pad, j *4 ,DMA_TO_DEVICE );
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-prng.c +0 -1
@@ -137,7 +137,6 @@ int sun8i_ce_prng_generate(struct crypto_rng *tfm, const u8 *src, cet->t_dst[0 ].addr =desc_addr_val_le32 (ce, dma_dst); cet->t_dst[0 ].len =cpu_to_le32 (todo /4 ); - ce->chanlist[flow].timeout =2000 ; err =sun8i_ce_run_task (ce,3 ,"PRNG" );mutex_unlock (&ce->rnglock);
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-trng.c +0 -1
@@ -79,7 +79,6 @@ static int sun8i_ce_trng_read(struct hwrng *rng, void *data, size_t max, bool wa cet->t_dst[0 ].addr =desc_addr_val_le32 (ce, dma_dst); cet->t_dst[0 ].len =cpu_to_le32 (todo /4 ); - ce->chanlist[flow].timeout = todo; err =sun8i_ce_run_task (ce,3 ,"TRNG" );mutex_unlock (&ce->rnglock);
drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h +1 -1
@@ -106,6 +106,7 @@#define MAX_SG 8#define CE_MAX_CLOCKS 4 +#define CE_DMA_TIMEOUT_MS 3000#define MAXFLOW 4
@@ -196,7 +197,6 @@ struct sun8i_ce_flow {struct completion complete;int status;dma_addr_t t_phy; -int timeout;struct ce_task *tl;void *backup_iv;void *bounce_iv;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 529/849 PCI: dwc: Verify the single eDMA IRQ in dw_pcie_edma_irq_verify()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Cassel <[email protected]>
[ Upstream commit 09fefb24ed5e15f3b112f6c04b21a90ea23eaf8b ]
dw_pcie_edma_irq_verify() is supposed to verify the eDMA IRQs in devicetree by fetching them using either 'dma' or 'dmaX' IRQ names. Former is used when the platform uses a single IRQ for all eDMA channels and latter is used when the platform uses separate IRQ per channel. But currently, dw_pcie_edma_irq_verify() bails out early if edma::nr_irqs is 1, i.e., when a single IRQ is used. This gives an impression that the driver could work with any single IRQ in devicetree, not necessarily with name 'dma'.
But dw_pcie_edma_irq_vector(), which actually requests the IRQ, does require the single IRQ to be named as 'dma'. So this creates inconsistency between dw_pcie_edma_irq_verify() and dw_pcie_edma_irq_vector().
Thus, to fix this inconsistency, make sure dw_pcie_edma_irq_verify() also verifies the single IRQ name by removing the bail out code.
--- drivers/pci/controller/dwc/pcie-designware.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/pci/controller/dwc/pcie-designware.c +1 -3
@@ -1045,9 +1045,7 @@ static int dw_pcie_edma_irq_verify(struct dw_pcie *pci)char name[15 ];int ret; -if (pci->edma.nr_irqs ==1 ) -return 0 ; -else if (pci->edma.nr_irqs >1 ) +if (pci->edma.nr_irqs >1 )return pci->edma.nr_irqs != ch_cnt ? -EINVAL :0 ; ret =platform_get_irq_byname_optional (pdev,"dma" );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 530/849 crypto: ccp - Fix incorrect payload size calculation in psp_poulate_hsti()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunseong Kim <[email protected]>
[ Upstream commit 2b0dc40ac6ca16ee0c489927f4856cf9cd3874c7 ]
payload_size field of the request header is incorrectly calculated using sizeof(req). Since 'req' is a pointer (struct hsti_request *), sizeof(req) returns the size of the pointer itself (e.g., 8 bytes on a 64-bit system), rather than the size of the structure it points to. This leads to an incorrect payload size being sent to the Platform Security Processor (PSP), potentially causing the HSTI query command to fail.
Fix this by using sizeof(*req) to correctly calculate the size of the struct hsti_request.
--- drivers/crypto/ccp/hsti.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/ccp/hsti.c +1 -1
@@ -88,7 +88,7 @@ static int psp_poulate_hsti(struct psp_device *psp)if (!req)return -ENOMEM ; - req->header.payload_size =sizeof (req); + req->header.payload_size =sizeof (*req); ret =psp_send_platform_access_msg (PSP_CMD_HSTI_QUERY , (struct psp_request *)req);if (ret)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 531/849 crypto: caam - double the entropy delay interval for retry
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gaurav Jain <[email protected]>
[ Upstream commit 9048beca9c5614d486e2b492c0a7867164bf56a8 ]
during entropy evaluation, if the generated samples fail any statistical test, then, all of the bits will be discarded, and a second set of samples will be generated and tested.
the entropy delay interval should be doubled before performing the retry.
also, ctrlpriv->rng4_sh_init and inst_handles both reads RNG DRNG status register, but only inst_handles is updated before every retry. so only check inst_handles and removing ctrlpriv->rng4_sh_init
--- drivers/crypto/caam/ctrl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/crypto/caam/ctrl.c +2 -2
@@ -703,12 +703,12 @@ static int caam_ctrl_rng_init(struct device *dev)*/ if (needs_entropy_delay_adjustment ()) ent_delay =12000 ; -if (!(ctrlpriv->rng4_sh_init || inst_handles)) { +if (!inst_handles) {dev_info (dev,"Entropy delay = %u\n" , ent_delay);kick_trng (dev, ent_delay); - ent_delay +=400 ; + ent_delay = ent_delay *2 ; }/* * if instantiate_rng(...) fails, the loop will rerun
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 532/849 can: rcar_canfd: Update bit rate constants for RZ/G3E and R-Car Gen4
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Biju Das <[email protected]>
[ Upstream commit 100fafc3e46138cb5a6526ddc03dcede8b020c8c ]
The calculation formula for nominal bit rate of classical CAN is the same as that of nominal bit rate of CANFD on the RZ/G3E and R-Car Gen4 SoCs compared to other SoCs. Update nominal bit rate constants.
--- drivers/net/can/rcar/rcar_canfd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/can/rcar/rcar_canfd.c +4 -1
@@ -1913,7 +1913,10 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch, priv->can.fd.do_get_auto_tdcv = rcar_canfd_get_auto_tdcv; }else {/* Controller starts in Classical CAN only mode */ - priv->can.bittiming_const = &rcar_canfd_bittiming_const; +if (gpriv->info->shared_can_regs) + priv->can.bittiming_const = gpriv->info->nom_bittiming; +else + priv->can.bittiming_const = &rcar_canfd_bittiming_const; priv->can.ctrlmode_supported =CAN_CTRLMODE_BERR_REPORTING ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 533/849 net: mana: Reduce waiting time if HWC not responding
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haiyang Zhang <[email protected]>
[ Upstream commit c4deabbc1abe452ea230b86d53ed3711e5a8a062 ]
If HW Channel (HWC) is not responding, reduce the waiting time, so further steps will fail quickly.
This will prevent getting stuck for a long time (30 minutes or more), for example, during unloading while HWC is not responding.
--- drivers/net/ethernet/microsoft/mana/hw_channel.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/ethernet/microsoft/mana/hw_channel.c +6 -1
@@ -881,7 +881,12 @@ int mana_hwc_send_request(struct hw_channel_context *hwc, u32 req_len,if (!wait_for_completion_timeout (&ctx->comp_event, (msecs_to_jiffies (hwc->hwc_timeout)))) {if (hwc->hwc_timeout !=0 ) -dev_err (hwc->dev,"HWC: Request timed out!\n" ); +dev_err (hwc->dev,"HWC: Request timed out: %u ms\n" , + hwc->hwc_timeout); + +/* Reduce further waiting if HWC no response */ +if (hwc->hwc_timeout >1 ) + hwc->hwc_timeout =1 ; err = -ETIMEDOUT ; goto out;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 534/849 ionic: use int type for err in ionic_get_module_eeprom_by_page
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit d586676a2714176bed06cf70467c4e08ac2d4681 ]
The variable 'err' is declared as u32, but it is used to store negative error codes such as -EINVAL.
Changing the type of 'err' to int ensures proper representation of negative error codes and aligns with standard kernel error handling conventions.
Also, there is no need to initialize 'err' since it is always set before being used.
--- drivers/net/ethernet/pensando/ionic/ionic_ethtool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/pensando/ionic/ionic_ethtool.c +1 -1
@@ -978,7 +978,7 @@ static int ionic_get_module_eeprom_by_page(struct net_device *netdev, {struct ionic_lif *lif =netdev_priv (netdev);struct ionic_dev *idev = &lif->ionic->idev; -u32 err = -EINVAL ; +int err;u8 *src;if (!page_data->length)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 535/849 net/cls_cgroup: Fix task_get_classid() during qdisc run
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yafang Shao <[email protected]>
[ Upstream commit 66048f8b3cc7e462953c04285183cdee43a1cb89 ]
During recent testing with the netem qdisc to inject delays into TCP traffic, we observed that our CLS BPF program failed to function correctly due to incorrect classid retrieval from task_get_classid(). The issue manifests in the following call stack:
bpf_get_cgroup_classid+5
cls_bpf_classify+507
__tcf_classify+90
tcf_classify+217
__dev_queue_xmit+798
bond_dev_queue_xmit+43
__bond_start_xmit+211
bond_start_xmit+70
dev_hard_start_xmit+142
sch_direct_xmit+161
__qdisc_run+102 <<<<< Issue location
__dev_xmit_skb+1015
__dev_queue_xmit+637
neigh_hh_output+159
ip_finish_output2+461
__ip_finish_output+183
ip_finish_output+41
ip_output+120
ip_local_out+94
__ip_queue_xmit+394
ip_queue_xmit+21
__tcp_transmit_skb+2169
tcp_write_xmit+959
__tcp_push_pending_frames+55
tcp_push+264
tcp_sendmsg_locked+661
tcp_sendmsg+45
inet_sendmsg+67
sock_sendmsg+98
sock_write_iter+147
vfs_write+786
ksys_write+181
__x64_sys_write+25
do_syscall_64+56
entry_SYSCALL_64_after_hwframe+100The problem occurs when multiple tasks share a single qdisc. In such cases, __qdisc_run() may transmit skbs created by different tasks. Consequently, task_get_classid() retrieves an incorrect classid since it references the current task's context rather than the skb's originating task.
Given that dev_queue_xmit() always executes with bh disabled, we can use softirq_count() instead to obtain the correct classid.
The simple steps to reproduce this issue:
1. Add network delay to the network interface:
such as: tc qdisc add dev bond0 root netem delay 1.5ms
2. Build two distinct net_cls cgroups, each with a network-intensive task
3. Initiate parallel TCP streams from both tasks to external servers.
Under this specific condition, the issue reliably occurs. The kernel eventually dequeues an SKB that originated from Task-A while executing in the context of Task-B.
It is worth noting that it will change the established behavior for a slightly different scenario:
<sock S is created by task A>
<class ID for task A is changed>
<skb is created by sock S xmit and classified>
prior to this patch the skb will be classified with the 'new' task A classid, now with the old/original one. The bpf_get_cgroup_classid_curr() function is a more appropriate choice for this case.
--- include/net/cls_cgroup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/cls_cgroup.h +1 -1
@@ -63,7 +63,7 @@ static inline u32 task_get_classid(const struct sk_buff *skb)* calls by looking at the number of nested bh disable calls because * softirqs always disables bh. */ -if (in_serving_softirq ()) { +if (softirq_count ()) {struct sock *sk =skb_to_full_sk (skb);/* If there is an sock_cgroup_classid we'll use that. */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 536/849 wifi: mt76: mt7921: Add 160MHz beamformee capability for mt7922 device
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Quan Zhou <[email protected]>
[ Upstream commit 25ef5b5d02ac03fe8dd91cf25bd011a570fbeba2 ]
Enable 160MHz beamformee support on mt7922 by updating HE capability element configuration. Previously, only 160MHz channel width was set, but beamformee for 160MHz was not properly advertised. This patch adds BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4 capability to allow devices to utilize 160MHz BW for beamforming.
Tested by connecting to 160MHz-bandwidth beamforming AP and verified HE capability.
--- drivers/net/wireless/mediatek/mt76/mt7921/main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7921/main.c +2 -0
@@ -135,6 +135,8 @@ mt7921_init_he_caps(struct mt792x_phy *phy, enum nl80211_band band,if (is_mt7922 (phy->mt76->dev)) { he_cap_elem->phy_cap_info[0 ] |=IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G ; + he_cap_elem->phy_cap_info[4 ] |= +IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4 ; he_cap_elem->phy_cap_info[8 ] |=IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 537/849 wifi: mt76: mt7925: add pci restore for hibernate
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jack Kao <[email protected]>
[ Upstream commit d54424fbc53b4d6be00f90a8b529cd368f20d357 ]
Due to hibernation causing a power off and power on,
this modification adds mt7925_pci_restore callback function for kernel. When hibernation resumes, it calls mt7925_pci_restore to reset the device, allowing it to return to the state it was in before the power off.
--- .../net/wireless/mediatek/mt76/mt7925/pci.c | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7925/pci.c +23 -3
@@ -529,7 +529,7 @@ static int mt7925_pci_suspend(struct device *device)return err; } -static int mt7925_pci_resume (struct device *device) +static int _mt7925_pci_resume (struct device *device,bool restore) {struct pci_dev *pdev =to_pci_dev (device);struct mt76_dev *mdev =pci_get_drvdata (pdev);
@@ -569,6 +569,9 @@ static int mt7925_pci_resume(struct device *device)napi_schedule (&mdev->tx_napi);local_bh_enable (); +if (restore) + goto failed; +mt76_connac_mcu_set_hif_suspend (mdev, false, false); ret =wait_event_timeout (dev->wait, dev->hif_resumed,3 *HZ );
@@ -585,7 +588,7 @@ static int mt7925_pci_resume(struct device *device) failed: pm->suspended = false; -if (err <0 ) +if (err <0 || restore)mt792x_reset (&dev->mt76);return err;
@@ -596,7 +599,24 @@ static void mt7925_pci_shutdown(struct pci_dev *pdev)mt7925_pci_remove (pdev); } -static DEFINE_SIMPLE_DEV_PM_OPS(mt7925_pm_ops, mt7925_pci_suspend, mt7925_pci_resume); +static int mt7925_pci_resume (struct device *device) +{ +return _mt7925_pci_resume (device, false); +} + +static int mt7925_pci_restore (struct device *device) +{ +return _mt7925_pci_resume (device, true); +} + +static const struct dev_pm_ops mt7925_pm_ops = { + .suspend =pm_sleep_ptr (mt7925_pci_suspend), + .resume =pm_sleep_ptr (mt7925_pci_resume), + .freeze =pm_sleep_ptr (mt7925_pci_suspend), + .thaw =pm_sleep_ptr (mt7925_pci_resume), + .poweroff =pm_sleep_ptr (mt7925_pci_suspend), + .restore =pm_sleep_ptr (mt7925_pci_restore), +};static struct pci_driver mt7925_pci_driver = { .name =KBUILD_MODNAME ,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 538/849 wifi: mt76: mt7996: Fix mt7996_reverse_frag0_hdr_trans for MLO
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shayne Chen <[email protected]>
[ Upstream commit a3ea1c309bf32fdb3665898c40b3ff8ca29ba6c4 ]
Update mt7996_reverse_frag0_hdr_trans routine to support MLO.
--- drivers/net/wireless/mediatek/mt76/mt7996/mac.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7996/mac.c +8 -3
@@ -229,7 +229,9 @@ static int mt7996_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap) {struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;struct ethhdr *eth_hdr = (struct ethhdr *)(skb->data + hdr_gap); -struct mt7996_sta *msta = (struct mt7996_sta *)status->wcid; +struct mt7996_sta_link *msta_link = (void *)status->wcid; +struct mt7996_sta *msta = msta_link->sta; +struct ieee80211_bss_conf *link_conf;__le32 *rxd = (__le32 *)skb->data;struct ieee80211_sta *sta;struct ieee80211_vif *vif;
@@ -246,8 +248,11 @@ static int mt7996_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)if (!msta || !msta->vif)return -EINVAL ; - sta = container_of((void *)msta, struct ieee80211_sta, drv_priv); + sta =wcid_to_sta (status->wcid); vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv); + link_conf =rcu_dereference (vif->link_conf[msta_link->wcid.link_id]); +if (!link_conf) +return -EINVAL ;/* store the info from RXD and ethhdr to avoid being overridden */ frame_control =le32_get_bits (rxd[8 ],MT_RXD8_FRAME_CONTROL );
@@ -260,7 +265,7 @@ static int mt7996_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)switch (frame_control & (IEEE80211_FCTL_TODS |IEEE80211_FCTL_FROMDS )) {case 0 : -ether_addr_copy (hdr.addr3, vif->bss_conf.bssid); +ether_addr_copy (hdr.addr3, link_conf->bssid);break ;case IEEE80211_FCTL_FROMDS :ether_addr_copy (hdr.addr3, eth_hdr->h_source);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 539/849 wifi: mt76: mt7996: Set def_wcid pointer in mt7996_mac_sta_init_link()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit a70b5903c57308fff525cbd62654f6104aa7ecbf ]
In order to get the ieee80211_sta pointer from wcid struct for a MLO client, set def_wcid pointer in mt7996_mac_sta_init_link routine.
--- drivers/net/wireless/mediatek/mt76/mt7996/main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/mediatek/mt76/mt7996/main.c +1 -0
@@ -969,6 +969,7 @@ mt7996_mac_sta_init_link(struct mt7996_dev *dev, msta_link->wcid.sta =1 ; msta_link->wcid.idx = idx; msta_link->wcid.link_id = link_id; + msta_link->wcid.def_wcid = &msta->deflink.wcid;ewma_avg_signal_init (&msta_link->avg_ack_signal);ewma_signal_init (&msta_link->wcid.rssi);
Signature · 1 line
2.51.0