6.17.8-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainerPATCH 540/849 wifi: mt76: mt7996: Temporarily disable EPCS
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Lin <[email protected]>
[ Upstream commit e6291bb7a5935b2f1d337fd7a58eab7ada6678ad ]
EPCS is not yet ready, so do not claim to support it.
--- drivers/net/wireless/mediatek/mt76/mt7996/init.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7996/init.c +0 -1
@@ -1330,7 +1330,6 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band, eht_cap->has_eht = true; eht_cap_elem->mac_cap_info[0 ] = -IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |IEEE80211_EHT_MAC_CAP0_OM_CONTROL |u8_encode_bits (IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_11454 ,IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_MASK );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 541/849 wifi: mt76: mt7996: support writing MAC TXD for AddBA Request
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Howard Hsu <[email protected]>
[ Upstream commit cb6ebbdffef2a888b95f121637cd1fad473919c6 ]
Support writing MAC TXD for the AddBA Req. Without this commit, the start sequence number in AddBA Req will be unexpected value for MT7996 and MT7992. This can result in certain stations (e.g., AX200) dropping packets, leading to ping failures and degraded connectivity. Ensuring the correct MAC TXD and TXP helps maintain reliable packet transmission and prevents interoperability issues with affected stations.
--- .../wireless/mediatek/mt76/mt76_connac3_mac.h | 7 ++ .../net/wireless/mediatek/mt76/mt7996/mac.c | 91 +++++++++++++------ 2 files changed, 69 insertions(+), 29 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h +7 -0
@@ -294,6 +294,13 @@ enum tx_frag_idx {#define MT_TXP_BUF_LEN GENMASK(11, 0)#define MT_TXP_DMA_ADDR_H GENMASK(15, 12) +#define MT_TXP0_TOKEN_ID0 GENMASK(14, 0) +#define MT_TXP0_TOKEN_ID0_VALID_MASK BIT(15) + +#define MT_TXP1_TID_ADDBA GENMASK(14, 12) +#define MT_TXP3_ML0_MASK BIT(15) +#define MT_TXP3_DMA_ADDR_H GENMASK(13, 12) +#define MT_TX_RATE_STBC BIT(14)#define MT_TX_RATE_NSS GENMASK(13, 10)#define MT_TX_RATE_MODE GENMASK(9, 6)
drivers/net/wireless/mediatek/mt76/mt7996/mac.c +62 -29
124 lines not on this page · raw message
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 542/849 wifi: mt76: mt76_eeprom_override to int
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 c7c682100cec97b699fe24b26d89278fd459cc84 ]
mt76_eeprom_override has of_get_mac_address, which can return -EPROBE_DEFER if the nvmem driver gets loaded after mt76 for some reason.
Make sure this gets passed to probe so that nvmem mac overrides always work.
--- drivers/net/wireless/mediatek/mt76/eeprom.c | 9 +++++++-- drivers/net/wireless/mediatek/mt76/mt76.h | 2 +- drivers/net/wireless/mediatek/mt76/mt7603/eeprom.c | 3 +-- drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c | 4 +--- drivers/net/wireless/mediatek/mt76/mt7615/init.c | 5 ++++- drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c | 6 +++++- drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c | 4 +++- drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c | 4 +--- drivers/net/wireless/mediatek/mt76/mt7915/init.c | 4 +++- drivers/net/wireless/mediatek/mt76/mt7921/init.c | 4 +++- drivers/net/wireless/mediatek/mt76/mt7925/init.c | 4 +++- drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c | 3 +-- drivers/net/wireless/mediatek/mt76/mt7996/init.c | 4 +++- 13 files changed, 36 insertions(+), 20 deletions(-)
drivers/net/wireless/mediatek/mt76/eeprom.c +7 -2
@@ -163,13 +163,16 @@ static int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int len)return mt76_get_of_data_from_nvmem (dev, eep,"eeprom" , len); } -void +int mt76_eeprom_override (struct mt76_phy *phy) {struct mt76_dev *dev = phy->dev;struct device_node *np = dev->dev->of_node; +int err; -of_get_mac_address (np, phy->macaddr); + err =of_get_mac_address (np, phy->macaddr); +if (err == -EPROBE_DEFER ) +return err;if (!is_valid_ether_addr (phy->macaddr)) {eth_random_addr (phy->macaddr);
@@ -177,6 +180,8 @@ mt76_eeprom_override(struct mt76_phy *phy)"Invalid MAC address, using random address %pM\n" , phy->macaddr); } + +return 0 ; }EXPORT_SYMBOL_GPL (mt76_eeprom_override);
drivers/net/wireless/mediatek/mt76/mt76.h +1 -1
@@ -1268,7 +1268,7 @@ void mt76_seq_puts_array(struct seq_file *file, const char *str, s8 *val, int len);int mt76_eeprom_init (struct mt76_dev *dev,int len); -void mt76_eeprom_override (struct mt76_phy *phy); +int mt76_eeprom_override (struct mt76_phy *phy);int mt76_get_of_data_from_mtd (struct mt76_dev *dev,void *eep,int offset,int len);int mt76_get_of_data_from_nvmem (struct mt76_dev *dev,void *eep,const char *cell_name,int len);
drivers/net/wireless/mediatek/mt76/mt7603/eeprom.c +1 -2
@@ -182,7 +182,6 @@ int mt7603_eeprom_init(struct mt7603_dev *dev) dev->mphy.antenna_mask =1 ; dev->mphy.chainmask = dev->mphy.antenna_mask; -mt76_eeprom_override (&dev->mphy); -return 0 ; +return mt76_eeprom_override (&dev->mphy); }
drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c +1 -3
@@ -351,8 +351,6 @@ int mt7615_eeprom_init(struct mt7615_dev *dev, u32 addr)memcpy (dev->mphy.macaddr, dev->mt76.eeprom.data +MT_EE_MAC_ADDR ,ETH_ALEN ); -mt76_eeprom_override (&dev->mphy); - -return 0 ; +return mt76_eeprom_override (&dev->mphy); }EXPORT_SYMBOL_GPL (mt7615_eeprom_init);
drivers/net/wireless/mediatek/mt76/mt7615/init.c +4 -1
@@ -570,7 +570,10 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev) ETH_ALEN); mphy->macaddr[0 ] |=2 ; mphy->macaddr[0 ] ^=BIT (7 ); -mt76_eeprom_override (mphy); + + ret =mt76_eeprom_override (mphy); +if (ret) +return ret;/* second phy can only handle 5 GHz */ mphy->cap.has_5ghz = true;
drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c +5 -1
@@ -332,7 +332,11 @@ int mt76x0_eeprom_init(struct mt76x02_dev *dev)memcpy (dev->mphy.macaddr, (u8 *)dev->mt76.eeprom.data +MT_EE_MAC_ADDR ,ETH_ALEN ); -mt76_eeprom_override (&dev->mphy); + + err =mt76_eeprom_override (&dev->mphy); +if (err) +return err; +mt76x02_mac_setaddr (dev, dev->mphy.macaddr);mt76x0_set_chip_cap (dev);
drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c +3 -1
@@ -499,7 +499,9 @@ int mt76x2_eeprom_init(struct mt76x02_dev *dev)mt76x02_eeprom_parse_hw_cap (dev);mt76x2_eeprom_get_macaddr (dev); -mt76_eeprom_override (&dev->mphy); + ret =mt76_eeprom_override (&dev->mphy); +if (ret) +return ret; dev->mphy.macaddr[0 ] &= ~BIT (1 );return 0 ;
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c +1 -3
@@ -284,9 +284,7 @@ int mt7915_eeprom_init(struct mt7915_dev *dev)memcpy (dev->mphy.macaddr, dev->mt76.eeprom.data +MT_EE_MAC_ADDR ,ETH_ALEN ); -mt76_eeprom_override (&dev->mphy); - -return 0 ; +return mt76_eeprom_override (&dev->mphy); } int mt7915_eeprom_get_target_power(struct mt7915_dev *dev,
drivers/net/wireless/mediatek/mt76/mt7915/init.c +3 -1
@@ -702,7 +702,9 @@ mt7915_register_ext_phy(struct mt7915_dev *dev, struct mt7915_phy *phy) mphy->macaddr[0 ] |=2 ; mphy->macaddr[0 ] ^=BIT (7 ); } -mt76_eeprom_override (mphy); + ret =mt76_eeprom_override (mphy); +if (ret) +return ret;/* init wiphy according to mphy and phy */ mt7915_init_wiphy (phy);
drivers/net/wireless/mediatek/mt76/mt7921/init.c +3 -1
@@ -189,7 +189,9 @@ static int __mt7921_init_hardware(struct mt792x_dev *dev)if (ret) goto out; -mt76_eeprom_override (&dev->mphy); + ret =mt76_eeprom_override (&dev->mphy); +if (ret) + goto out; ret =mt7921_mcu_set_eeprom (dev);if (ret)
drivers/net/wireless/mediatek/mt76/mt7925/init.c +3 -1
@@ -249,7 +249,9 @@ static int __mt7925_init_hardware(struct mt792x_dev *dev)if (ret) goto out; -mt76_eeprom_override (&dev->mphy); + ret =mt76_eeprom_override (&dev->mphy); +if (ret) + goto out; ret =mt7925_mcu_set_eeprom (dev);if (ret)
drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c +1 -2
@@ -334,9 +334,8 @@ int mt7996_eeprom_init(struct mt7996_dev *dev)return ret;memcpy (dev->mphy.macaddr, dev->mt76.eeprom.data +MT_EE_MAC_ADDR ,ETH_ALEN ); -mt76_eeprom_override (&dev->mphy); -return 0 ; +return mt76_eeprom_override (&dev->mphy); } int mt7996_eeprom_get_target_power(struct mt7996_dev *dev,
drivers/net/wireless/mediatek/mt76/mt7996/init.c +3 -1
@@ -667,7 +667,9 @@ static int mt7996_register_phy(struct mt7996_dev *dev, enum mt76_band_id band)if (band ==MT_BAND2 ) mphy->macaddr[0 ] ^=BIT (6 ); } -mt76_eeprom_override (mphy); + ret =mt76_eeprom_override (mphy); +if (ret) + goto error;/* init wiphy according to mphy and phy */ mt7996_init_wiphy_band (mphy->hw, phy);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 543/849 ALSA: serial-generic: remove shared static buffer
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Keeping <[email protected]>
[ Upstream commit 84973249011fda3ff292f83439a062fec81ef982 ]
If multiple instances of this driver are instantiated and try to send concurrently then the single static buffer snd_serial_generic_tx_work() will cause corruption in the data output.
Move the buffer into the per-instance driver data to avoid this.
--- sound/drivers/serial-generic.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
sound/drivers/serial-generic.c +7 -5
@@ -37,6 +37,8 @@ MODULE_LICENSE("GPL");#define SERIAL_TX_STATE_ACTIVE 1#define SERIAL_TX_STATE_WAKEUP 2 +#define INTERNAL_BUF_SIZE 256 +struct snd_serial_generic {struct serdev_device *serdev;
@@ -51,6 +53,7 @@ struct snd_serial_generic {struct work_struct tx_work;unsigned long tx_state; +char tx_buf[INTERNAL_BUF_SIZE ]; };static void snd_serial_generic_tx_wakeup (struct snd_serial_generic *drvdata)
@@ -61,11 +64,8 @@ static void snd_serial_generic_tx_wakeup(struct snd_serial_generic *drvdata)schedule_work (&drvdata->tx_work); } -#define INTERNAL_BUF_SIZE 256 -static void snd_serial_generic_tx_work (struct work_struct *work) { -static char buf[INTERNAL_BUF_SIZE ];int num_bytes; struct snd_serial_generic *drvdata = container_of(work, struct snd_serial_generic, tx_work);
@@ -78,8 +78,10 @@ static void snd_serial_generic_tx_work(struct work_struct *work)if (!test_bit (SERIAL_MODE_OUTPUT_OPEN , &drvdata->filemode))break ; - num_bytes =snd_rawmidi_transmit_peek (substream, buf,INTERNAL_BUF_SIZE ); - num_bytes =serdev_device_write_buf (drvdata->serdev, buf, num_bytes); + num_bytes =snd_rawmidi_transmit_peek (substream, drvdata->tx_buf, +INTERNAL_BUF_SIZE ); + num_bytes =serdev_device_write_buf (drvdata->serdev, drvdata->tx_buf, + num_bytes);if (!num_bytes)break ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 544/849 wifi: mt76: mt7996: fix memory leak on mt7996_mcu_sta_key_tlv error
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit 7c0f63fe37a5da2c13fc35c89053b31be8ead895 ]
Free the allocated skb on error
--- drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +3 -1
@@ -2535,8 +2535,10 @@ int mt7996_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif,return PTR_ERR (skb); ret =mt7996_mcu_sta_key_tlv (wcid, skb, key, cmd); -if (ret) +if (ret) { +dev_kfree_skb (skb);return ret; + }return mt76_mcu_skb_send_msg (dev, skb, mcu_cmd, true); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 545/849 wifi: mt76: mt7996: disable promiscuous mode by default
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Chiu <[email protected]>
[ Upstream commit a4a66cbaa20f51cb953d09a95c67cb237a088ec9 ]
Set MT_WF_RFCR_DROP_OTHER_UC by default and disable this flag in mt7996_set_monitor only if monitor mode is enabled.
Without this patch, the MT_WF_RFCR_DROP_OTHER_UC would not be set so the driver would receive lots of packets meant for other devices.
--- drivers/net/wireless/mediatek/mt76/mt7996/init.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/mediatek/mt76/mt7996/init.c +1 -0
@@ -383,6 +383,7 @@ mt7996_init_wiphy_band(struct ieee80211_hw *hw, struct mt7996_phy *phy) phy->slottime =9 ; phy->beacon_rate =-1 ; + phy->rxfilter =MT_WF_RFCR_DROP_OTHER_UC ;if (phy->mt76->cap.has_2ghz) { phy->mt76->sband_2g.sband.ht_cap.cap |=
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 546/849 wifi: mt76: use altx queue for offchannel tx on connac+
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit 12911593efa97abc27b75e98c530b8b1193c384b ]
This ensures that packets are sent out immediately and are not held by firmware internal buffering.
--- drivers/net/wireless/mediatek/mt76/tx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/tx.c +2 -1
@@ -618,7 +618,8 @@ mt76_txq_schedule_pending_wcid(struct mt76_phy *phy, struct mt76_wcid *wcid, !(info->flags &IEEE80211_TX_CTL_HW_80211_ENCAP ) && !ieee80211_is_data (hdr->frame_control) && (!ieee80211_is_bufferable_mmpdu (skb) || - ieee80211_is_deauth(hdr->frame_control))) +ieee80211_is_deauth (hdr->frame_control) || + head == &wcid->tx_offchannel)) qid = MT_TXQ_PSD; q = phy->q_tx[qid];
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 547/849 wifi: mt76: improve phy reset on hw restart
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit 3f34cced88a429872d1eefc393686f9a48ec01d9 ]
- fix number of station accounting for scanning code.
- reset channel context
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/mediatek/mt76/mac80211.c +2 -0
@@ -824,6 +824,8 @@ static void mt76_reset_phy(struct mt76_phy *phy)return ;INIT_LIST_HEAD (&phy->tx_list); + phy->num_sta =0 ; + phy->chanctx =NULL ; }void mt76_reset_device (struct mt76_dev *dev)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 548/849 drm/amdgpu: Use memdup_array_user in amdgpu_cs_wait_fences_ioctl
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tvrtko Ursulin <[email protected]>
[ Upstream commit dea75df7afe14d6217576dbc28cc3ec1d1f712fb ]
Replace kmalloc_array() + copy_from_user() with memdup_array_user().
This shrinks the source code and improves separation between the kernel and userspace slabs.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +5 -14
@@ -1767,30 +1767,21 @@ int amdgpu_cs_wait_fences_ioctl(struct drm_device *dev, void *data, {struct amdgpu_device *adev =drm_to_adev (dev);union drm_amdgpu_wait_fences *wait = data; -uint32_t fence_count = wait->in.fence_count; -struct drm_amdgpu_fence *fences_user;struct drm_amdgpu_fence *fences;int r;/* Get the fences from userspace */ - fences =kmalloc_array (fence_count,sizeof (struct drm_amdgpu_fence ), -GFP_KERNEL ); -if (fences ==NULL ) -return -ENOMEM ; - - fences_user =u64_to_user_ptr (wait->in.fences); -if (copy_from_user (fences, fences_user, -sizeof (struct drm_amdgpu_fence ) * fence_count)) { - r = -EFAULT ; - goto err_free_fences; - } + fences =memdup_array_user (u64_to_user_ptr (wait->in.fences), + wait->in.fence_count, +sizeof (struct drm_amdgpu_fence )); +if (IS_ERR (fences)) +return PTR_ERR (fences);if (wait->in.wait_all) r =amdgpu_cs_wait_all_fences (adev, filp, wait, fences);else r =amdgpu_cs_wait_any_fence (adev, filp, wait, fences); -err_free_fences:kfree (fences);return r;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 549/849 drm/amdgpu: validate userq buffer virtual address and size
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 9e46b8bb0539d7bc9a9e7b3072fa4f6082490392 ]
It needs to validate the userq object virtual address to determine whether it is residented in a valid vm mapping.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 40 ++++++++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h | 2 ++ drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 16 +++++++++ 3 files changed, 58 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c +40 -0
@@ -44,6 +44,38 @@ u32 amdgpu_userq_get_supported_ip_mask(struct amdgpu_device *adev)return userq_ip_mask; } +int amdgpu_userq_input_va_validate (struct amdgpu_vm *vm,u64 addr, +u64 expected_size) +{ +struct amdgpu_bo_va_mapping *va_map; +u64 user_addr; +u64 size; +int r =0 ; + + user_addr = (addr &AMDGPU_GMC_HOLE_MASK ) >>AMDGPU_GPU_PAGE_SHIFT ; + size = expected_size >>AMDGPU_GPU_PAGE_SHIFT ; + + r =amdgpu_bo_reserve (vm->root.bo, false); +if (r) +return r; + + va_map =amdgpu_vm_bo_lookup_mapping (vm, user_addr); +if (!va_map) { + r = -EINVAL ; + goto out_err; + } +/* Only validate the userq whether resident in the VM mapping range */ +if (user_addr >= va_map->start && + va_map->last - user_addr +1 >= size) { +amdgpu_bo_unreserve (vm->root.bo); +return 0 ; + } + +out_err: +amdgpu_bo_unreserve (vm->root.bo); +return r; +} +static int amdgpu_userq_unmap_helper (struct amdgpu_userq_mgr *uq_mgr,struct amdgpu_usermode_queue *queue)
@@ -439,6 +471,14 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args) r = -ENOMEM ; goto unlock; } + +/* Validate the userq virtual address.*/ +if (amdgpu_userq_input_va_validate (&fpriv->vm, args->in.queue_va, args->in.queue_size) || +amdgpu_userq_input_va_validate (&fpriv->vm, args->in.rptr_va,AMDGPU_GPU_PAGE_SIZE ) || +amdgpu_userq_input_va_validate (&fpriv->vm, args->in.wptr_va,AMDGPU_GPU_PAGE_SIZE )) { +kfree (queue); + goto unlock; + } queue->doorbell_handle = args->in.doorbell_handle; queue->queue_type = args->in.ip_type; queue->vm = &fpriv->vm;
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h +2 -0
@@ -133,4 +133,6 @@ int amdgpu_userq_stop_sched_for_enforce_isolation(struct amdgpu_device *adev,int amdgpu_userq_start_sched_for_enforce_isolation (struct amdgpu_device *adev,u32 idx); +int amdgpu_userq_input_va_validate (struct amdgpu_vm *vm,u64 addr, +u64 expected_size);#endif
drivers/gpu/drm/amd/amdgpu/mes_userqueue.c +16 -0
@@ -206,6 +206,7 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr,struct amdgpu_mqd *mqd_hw_default = &adev->mqds[queue->queue_type];struct drm_amdgpu_userq_in *mqd_user = args_in;struct amdgpu_mqd_prop *userq_props; +struct amdgpu_gfx_shadow_info shadow_info;int r;/* Structure to initialize MQD for userqueue using generic MQD init function */
@@ -231,6 +232,8 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr, userq_props->doorbell_index = queue->doorbell_index; userq_props->fence_address = queue->fence_drv->gpu_addr; +if (adev->gfx.funcs->get_gfx_shadow_info) + adev->gfx.funcs->get_gfx_shadow_info (adev, &shadow_info, true);if (queue->queue_type ==AMDGPU_HW_IP_COMPUTE ) {struct drm_amdgpu_userq_mqd_compute_gfx11 *compute_mqd;
@@ -247,6 +250,10 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr, goto free_mqd; } +if (amdgpu_userq_input_va_validate (queue->vm, compute_mqd->eop_va, +max_t (u32,PAGE_SIZE ,AMDGPU_GPU_PAGE_SIZE ))) + goto free_mqd; + userq_props->eop_gpu_addr = compute_mqd->eop_va; userq_props->hqd_pipe_priority =AMDGPU_GFX_PIPE_PRIO_NORMAL ; userq_props->hqd_queue_priority =AMDGPU_GFX_QUEUE_PRIORITY_MINIMUM ;
@@ -274,6 +281,11 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr, userq_props->csa_addr = mqd_gfx_v11->csa_va; userq_props->tmz_queue = mqd_user->flags &AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE ; + +if (amdgpu_userq_input_va_validate (queue->vm, mqd_gfx_v11->shadow_va, + shadow_info.shadow_size)) + goto free_mqd; +kfree (mqd_gfx_v11); }else if (queue->queue_type ==AMDGPU_HW_IP_DMA ) {struct drm_amdgpu_userq_mqd_sdma_gfx11 *mqd_sdma_v11;
@@ -291,6 +303,10 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr, goto free_mqd; } +if (amdgpu_userq_input_va_validate (queue->vm, mqd_sdma_v11->csa_va, + shadow_info.csa_size)) + goto free_mqd; + userq_props->csa_addr = mqd_sdma_v11->csa_va;kfree (mqd_sdma_v11); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 550/849 drm/amdgpu: Release hive reference properly
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lijo Lazar <[email protected]>
[ Upstream commit c1456fadce0c99175f97e66c2b982dd051e01aa2 ]
xgmi hive reference is taken on function entry, but not released correctly for all paths. Use __free() to release reference properly.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 7 +++---- drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +3 -4
@@ -6880,7 +6880,8 @@ pci_ers_result_t amdgpu_pci_error_detected(struct pci_dev *pdev, pci_channel_sta {struct drm_device *dev =pci_get_drvdata (pdev);struct amdgpu_device *adev =drm_to_adev (dev); -struct amdgpu_hive_info *hive =amdgpu_get_xgmi_hive (adev); + struct amdgpu_hive_info *hive __free(xgmi_put_hive) = +amdgpu_get_xgmi_hive (adev);struct amdgpu_reset_context reset_context;struct list_head device_list;
@@ -6911,10 +6912,8 @@ pci_ers_result_t amdgpu_pci_error_detected(struct pci_dev *pdev, pci_channel_staamdgpu_device_recovery_get_reset_lock (adev, &device_list);amdgpu_device_halt_activities (adev,NULL , &reset_context, &device_list, hive, false); -if (hive) { +if (hive)mutex_unlock (&hive->hive_lock); -amdgpu_put_xgmi_hive (hive); - }return PCI_ERS_RESULT_NEED_RESET ;case pci_channel_io_perm_failure:/* Permanent error, prepare for device removal */
drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h +4 -0
@@ -126,4 +126,8 @@ uint32_t amdgpu_xgmi_get_max_bandwidth(struct amdgpu_device *adev);void amgpu_xgmi_set_max_speed_width (struct amdgpu_device *adev,uint16_t max_speed,uint8_t max_width); + +/* Cleanup macro for use with __free(xgmi_put_hive) */ +DEFINE_FREE(xgmi_put_hive, struct amdgpu_hive_info *, if (_T) amdgpu_put_xgmi_hive(_T)) +#endif
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 551/849 drm/amd/display: Fix DMCUB loading sequence for DCN3.2
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Kazlauskas <[email protected]>
[ Upstream commit 18e755155caa57a6e6c4aa4a40b0db0fba015289 ]
[Why]
New sequence from HW for reset and firmware reloading has been provided that aims to stabilize the reload sequence in the case the firmware is hung or has outstanding requests.
[How]
Update the sequence to remove the DMUIF reset and the redundant writes in the release.
--- .../gpu/drm/amd/display/dmub/src/dmub_dcn32.c | 53 ++++++++++--------- .../gpu/drm/amd/display/dmub/src/dmub_dcn32.h | 8 ++- 2 files changed, 35 insertions(+), 26 deletions(-)
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.c +28 -25
@@ -89,44 +89,50 @@ static inline void dmub_dcn32_translate_addr(const union dmub_addr *addr_in,void dmub_dcn32_reset (struct dmub_srv *dmub) {union dmub_gpint_data_register cmd; -const uint32_t timeout =30 ; -uint32_t in_reset, scratch, i; +const uint32_t timeout =100000 ; +uint32_t in_reset, is_enabled, scratch, i, pwait_mode;REG_GET (DMCUB_CNTL2 ,DMCUB_SOFT_RESET , &in_reset); +REG_GET (DMCUB_CNTL ,DMCUB_ENABLE , &is_enabled); -if (in_reset ==0 ) { +if (in_reset ==0 && is_enabled !=0 ) { cmd.bits.status =1 ; cmd.bits.command_code =DMUB_GPINT__STOP_FW ; cmd.bits.param =0 ; dmub->hw_funcs.set_gpint (dmub, cmd); -/** -* Timeout covers both the ACK and the wait -* for remaining work to finish. -* -* This is mostly bound by the PHY disable sequence. -* Each register check will be greater than 1us, so -* don't bother using udelay. -*/ -for (i =0 ; i < timeout; ++i) {if (dmub->hw_funcs.is_gpint_acked (dmub, cmd))break ; + +udelay (1 ); }for (i =0 ; i < timeout; ++i) { - scratch = dmub->hw_funcs.get_gpint_response (dmub); + scratch =REG_READ (DMCUB_SCRATCH7 );if (scratch ==DMUB_GPINT__STOP_FW_RESPONSE )break ; + +udelay (1 ); } +for (i =0 ; i < timeout; ++i) { +REG_GET (DMCUB_CNTL ,DMCUB_PWAIT_MODE_STATUS , &pwait_mode); +if (pwait_mode & (1 <<0 )) +break ; + +udelay (1 ); + }/* Force reset in case we timed out, DMCUB is likely hung. */ } -REG_UPDATE (DMCUB_CNTL2 ,DMCUB_SOFT_RESET ,1 ); -REG_UPDATE (DMCUB_CNTL ,DMCUB_ENABLE ,0 ); -REG_UPDATE (MMHUBBUB_SOFT_RESET ,DMUIF_SOFT_RESET ,1 ); +if (is_enabled) { +REG_UPDATE (DMCUB_CNTL2 ,DMCUB_SOFT_RESET ,1 ); +udelay (1 ); +REG_UPDATE (DMCUB_CNTL ,DMCUB_ENABLE ,0 ); + } +REG_WRITE (DMCUB_INBOX1_RPTR ,0 );REG_WRITE (DMCUB_INBOX1_WPTR ,0 );REG_WRITE (DMCUB_OUTBOX1_RPTR ,0 );
@@ -135,7 +141,7 @@ void dmub_dcn32_reset(struct dmub_srv *dmub)REG_WRITE (DMCUB_OUTBOX0_WPTR ,0 );REG_WRITE (DMCUB_SCRATCH0 ,0 ); -/* Clear the GPINT command manually so we don't reset again. */ +/* Clear the GPINT command manually so we don't send anything during boot. */ cmd.all =0 ; dmub->hw_funcs.set_gpint (dmub, cmd); }
@@ -419,8 +425,8 @@ uint32_t dmub_dcn32_get_current_time(struct dmub_srv *dmub)void dmub_dcn32_get_diagnostic_data (struct dmub_srv *dmub) { -uint32_t is_dmub_enabled, is_soft_reset, is_sec_reset; -uint32_t is_traceport_enabled, is_cw0_enabled, is_cw6_enabled; +uint32_t is_dmub_enabled, is_soft_reset, is_pwait; +uint32_t is_traceport_enabled, is_cw6_enabled;struct dmub_timeout_info timeout = {0 };if (!dmub)
@@ -470,18 +476,15 @@ void dmub_dcn32_get_diagnostic_data(struct dmub_srv *dmub)REG_GET (DMCUB_CNTL ,DMCUB_ENABLE , &is_dmub_enabled); dmub->debug.is_dmcub_enabled = is_dmub_enabled; +REG_GET (DMCUB_CNTL ,DMCUB_PWAIT_MODE_STATUS , &is_pwait); + dmub->debug.is_pwait = is_pwait; +REG_GET (DMCUB_CNTL2 ,DMCUB_SOFT_RESET , &is_soft_reset); dmub->debug.is_dmcub_soft_reset = is_soft_reset; -REG_GET (DMCUB_SEC_CNTL ,DMCUB_SEC_RESET_STATUS , &is_sec_reset); - dmub->debug.is_dmcub_secure_reset = is_sec_reset; -REG_GET (DMCUB_CNTL ,DMCUB_TRACEPORT_EN , &is_traceport_enabled); dmub->debug.is_traceport_en = is_traceport_enabled; -REG_GET (DMCUB_REGION3_CW0_TOP_ADDRESS ,DMCUB_REGION3_CW0_ENABLE , &is_cw0_enabled); - dmub->debug.is_cw0_enabled = is_cw0_enabled; -REG_GET (DMCUB_REGION3_CW6_TOP_ADDRESS ,DMCUB_REGION3_CW6_ENABLE , &is_cw6_enabled); dmub->debug.is_cw6_enabled = is_cw6_enabled;
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.h +7 -1
@@ -89,6 +89,9 @@ struct dmub_srv; DMUB_SR(DMCUB_REGION5_OFFSET) \ DMUB_SR(DMCUB_REGION5_OFFSET_HIGH) \ DMUB_SR(DMCUB_REGION5_TOP_ADDRESS) \ + DMUB_SR(DMCUB_REGION6_OFFSET) \ + DMUB_SR(DMCUB_REGION6_OFFSET_HIGH) \ + DMUB_SR(DMCUB_REGION6_TOP_ADDRESS) \ DMUB_SR(DMCUB_SCRATCH0) \ DMUB_SR(DMCUB_SCRATCH1) \ DMUB_SR(DMCUB_SCRATCH2) \
@@ -155,6 +158,8 @@ struct dmub_srv; DMUB_SF(DMCUB_REGION4_TOP_ADDRESS, DMCUB_REGION4_ENABLE) \ DMUB_SF(DMCUB_REGION5_TOP_ADDRESS, DMCUB_REGION5_TOP_ADDRESS) \ DMUB_SF(DMCUB_REGION5_TOP_ADDRESS, DMCUB_REGION5_ENABLE) \ + DMUB_SF(DMCUB_REGION6_TOP_ADDRESS, DMCUB_REGION6_TOP_ADDRESS) \ + DMUB_SF(DMCUB_REGION6_TOP_ADDRESS, DMCUB_REGION6_ENABLE) \ DMUB_SF(CC_DC_PIPE_DIS, DC_DMCUB_ENABLE) \ DMUB_SF(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET) \DMUB_SF (DCN_VM_FB_LOCATION_BASE ,FB_BASE ) \
@@ -162,7 +167,8 @@ struct dmub_srv; DMUB_SF(DMCUB_INBOX0_WPTR, DMCUB_INBOX0_WPTR) \ DMUB_SF(DMCUB_REGION3_TMR_AXI_SPACE, DMCUB_REGION3_TMR_AXI_SPACE) \ DMUB_SF(DMCUB_INTERRUPT_ENABLE, DMCUB_GPINT_IH_INT_EN) \ - DMUB_SF(DMCUB_INTERRUPT_ACK, DMCUB_GPINT_IH_INT_ACK) + DMUB_SF(DMCUB_INTERRUPT_ACK, DMCUB_GPINT_IH_INT_ACK) \ + DMUB_SF(DMCUB_CNTL, DMCUB_PWAIT_MODE_STATUS)struct dmub_srv_dcn32_reg_offset {#define DMUB_SR (reg) uint32_t reg;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 552/849 drm/amd/display: Set up pixel encoding for YCBCR422
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 5e76bc677cb7c92b37d8bc66bb67a18922895be2 ]
[Why]fill_stream_properties_from_drm_display_mode() will not configure pixel encoding to YCBCR422 when the DRM color format supports YCBCR422 but not YCBCR420 or YCBCR4444. Instead it will fallback to RGB.
[How]
Add support for YCBCR422 in pixel encoding mapping.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +3 -0
@@ -6399,6 +6399,9 @@ static void fill_stream_properties_from_drm_display_mode( && aconnector && aconnector->force_yuv420_output) timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420; + else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR422) + && stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) + timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR422; else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR444) && stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR444;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 553/849 drm/amd/display: fix dml ms order of operations
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 02a6c2e4b28ff31f7a904c196a99fb2efe81e2cf ]
[why&how]
small error in order of operations in immediateflipbytes calculation on dml ms side that can result in dml ms and mp mismatch immediateflip support for a given pipe and thus an invalid hw state, correct the order to align with mp.
--- drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.c +1 -1
@@ -6529,7 +6529,7 @@ static noinline_for_stack void dml_prefetch_check(struct display_mode_lib_st *mo mode_lib->ms.TotImmediateFlipBytes =0 ;for (k =0 ; k <= mode_lib->ms.num_active_planes -1 ; k++) {if (!(mode_lib->ms.policy.ImmediateFlipRequirement[k] == dml_immediate_flip_not_required)) { - mode_lib->ms.TotImmediateFlipBytes = mode_lib->ms.TotImmediateFlipBytes + mode_lib->ms.NoOfDPP[j][k] * mode_lib->ms.PDEAndMetaPTEBytesPerFrame[j][k] + mode_lib->ms.MetaRowBytes[j][k]; + mode_lib->ms.TotImmediateFlipBytes = mode_lib->ms.TotImmediateFlipBytes + mode_lib->ms.NoOfDPP[j][k] * (mode_lib->ms.PDEAndMetaPTEBytesPerFrame[j][k] + mode_lib->ms.MetaRowBytes[j][k]);if (mode_lib->ms.use_one_row_for_frame_flip[j][k]) { mode_lib->ms.TotImmediateFlipBytes = mode_lib->ms.TotImmediateFlipBytes + mode_lib->ms.NoOfDPP[j][k] * (2 * mode_lib->ms.DPTEBytesPerRow[j][k]); }else {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 554/849 drm/amd: Avoid evicting resources at S5
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 531df041f2a5296174abd8292d298eb62fe1ea97 ]
Normally resources are evicted on dGPUs at suspend or hibernate and on APUs at hibernate. These steps are unnecessary when using the S4 callbacks to put the system into S5.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +4 -0
@@ -5016,6 +5016,10 @@ static int amdgpu_device_evict_resources(struct amdgpu_device *adev)if (!adev->in_s4 && (adev->flags &AMD_IS_APU ))return 0 ; +/* No need to evict when going to S5 through S4 callbacks */ +if (system_state ==SYSTEM_POWER_OFF ) +return 0 ; + ret =amdgpu_ttm_evict_resources (adev,TTM_PL_VRAM );if (ret) {dev_warn (adev->dev,"evicting device resources failed\n" );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 555/849 drm/amd/display: Dont use non-registered VUPDATE on DCE 6
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 6cbe6e072c5d088101cd542ad8ef8541edeea5c3 ]
The VUPDATE interrupt isn't registered on DCE 6, so don't try to use that.
This fixes a page flip timeout after sleep/resume on DCE 6.
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 22 ++++++++++++------- .../amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 16 +++++++++----- 2 files changed, 24 insertions(+), 14 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +14 -8
@@ -3050,14 +3050,20 @@ static void dm_gpureset_toggle_interrupts(struct amdgpu_device *adev,drm_warn (adev_to_drm (adev),"Failed to %s pflip interrupts\n" , enable ?"enable" :"disable" ); -if (enable) { -if (amdgpu_dm_crtc_vrr_active (to_dm_crtc_state (acrtc->base.state))) - rc =amdgpu_dm_crtc_set_vupdate_irq (&acrtc->base, true); - }else - rc =amdgpu_dm_crtc_set_vupdate_irq (&acrtc->base, false); - -if (rc) -drm_warn (adev_to_drm (adev),"Failed to %sable vupdate interrupt\n" , enable ?"en" :"dis" ); +if (dc_supports_vrr (adev->dm.dc->ctx->dce_version)) { +if (enable) { +if (amdgpu_dm_crtc_vrr_active ( +to_dm_crtc_state (acrtc->base.state))) + rc =amdgpu_dm_crtc_set_vupdate_irq ( + &acrtc->base, true); + }else + rc =amdgpu_dm_crtc_set_vupdate_irq ( + &acrtc->base, false); + +if (rc) +drm_warn (adev_to_drm (adev),"Failed to %sable vupdate interrupt\n" , + enable ?"en" :"dis" ); + } irq_source =IRQ_TYPE_VBLANK + acrtc->otg_inst;/* During gpu-reset we disable and then enable vblank irq, so
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c +10 -6
@@ -321,13 +321,17 @@ static inline int amdgpu_dm_crtc_set_vblank(struct drm_crtc *crtc, bool enable) dc->config.disable_ips != DMUB_IPS_DISABLE_ALL && sr_supported && vblank->config.disable_immediate)drm_crtc_vblank_restore (crtc); + } -/* vblank irq on -> Only need vupdate irq in vrr mode */ -if (amdgpu_dm_crtc_vrr_active (acrtc_state)) - rc =amdgpu_dm_crtc_set_vupdate_irq (crtc, true); - }else { -/* vblank irq off -> vupdate irq off */ - rc =amdgpu_dm_crtc_set_vupdate_irq (crtc, false); +if (dc_supports_vrr (dm->dc->ctx->dce_version)) { +if (enable) { +/* vblank irq on -> Only need vupdate irq in vrr mode */ +if (amdgpu_dm_crtc_vrr_active (acrtc_state)) + rc =amdgpu_dm_crtc_set_vupdate_irq (crtc, true); + }else { +/* vblank irq off -> vupdate irq off */ + rc =amdgpu_dm_crtc_set_vupdate_irq (crtc, false); + } }if (rc)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 556/849 drm/amd/display: Keep PLL0 running on DCE 6.0 and 6.4
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 0449726b58ea64ec96b95f95944f0a3650204059 ]
DC can turn off the display clock when no displays are connected or when all displays are off, for reference see:
- dce*_validate_bandwidth
DC also assumes that the DP clock is always on and never powers it down, for reference see:
- dce110_clock_source_power_down
In case of DCE 6.0 and 6.4, PLL0 is the clock source for both the engine clock and DP clock, for reference see:
- radeon_atom_pick_pll
- atombios_crtc_set_disp_eng_pll
Therefore, PLL0 should be always kept running on DCE 6.0 and 6.4. This commit achieves that by ensuring that by setting the display clock to the corresponding value in low power state instead of zero.
This fixes a page flip timeout on SI with DC which happens when all connected displays are blanked.
--- .../amd/display/dc/resource/dce60/dce60_resource.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c +10 -1
@@ -881,7 +881,16 @@ static enum dc_status dce60_validate_bandwidth( context->bw_ctx.bw.dce.dispclk_khz =681000 ; context->bw_ctx.bw.dce.yclk_khz =250000 *MEMORY_TYPE_MULTIPLIER_CZ ; }else { - context->bw_ctx.bw.dce.dispclk_khz =0 ; +/* On DCE 6.0 and 6.4 the PLL0 is both the display engine clock and +* the DP clock, and shouldn't be turned off. Just select the display +* clock value from its low power mode. +*/ +if (dc->ctx->dce_version ==DCE_VERSION_6_0 || + dc->ctx->dce_version ==DCE_VERSION_6_4 ) + context->bw_ctx.bw.dce.dispclk_khz =352000 ; +else + context->bw_ctx.bw.dce.dispclk_khz =0 ; + context->bw_ctx.bw.dce.yclk_khz =0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 557/849 drm/amd/display: Fix DVI-D/HDMI adapters
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 489f0f600ce2c0dae640df9035e1d82677d2580f ]
When the EDID has the HDMI bit, we should simply select the HDMI signal type even on DVI ports.
For reference see, the legacy amdgpu display code:amdgpu_atombios_encoder_get_encoder_mode
which selects ATOM_ENCODER_MODE_HDMI for the same case.
This commit fixes DVI connectors to work with DVI-D/HDMI adapters so that they can now produce output over these connectors for HDMI monitors with higher bandwidth modes. With this change, even HDMI audio works through DVI.
For testing, I used a CAA-DMDHFD3 DVI-D/HDMI adapter with the following GPUs:
Tahiti (DCE 6) - DC can now output 4K 30 Hz over DVI Polaris 10 (DCE 11.2) - DC can now output 4K 60 Hz over DVI
--- drivers/gpu/drm/amd/display/dc/link/link_detection.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/amd/display/dc/link/link_detection.c +4 -0
@@ -1140,6 +1140,10 @@ static bool detect_link_and_local_sink(struct dc_link *link,if (sink->sink_signal ==SIGNAL_TYPE_HDMI_TYPE_A && !sink->edid_caps.edid_hdmi) sink->sink_signal =SIGNAL_TYPE_DVI_SINGLE_LINK ; +else if (dc_is_dvi_signal (sink->sink_signal) && + aud_support->hdmi_audio_native && + sink->edid_caps.edid_hdmi) + sink->sink_signal =SIGNAL_TYPE_HDMI_TYPE_A ;if (link->local_sink &&dc_is_dp_signal (sink_caps.signal))dp_trace_init (link);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 558/849 drm/amd/display: Disable VRR on DCE 6
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 043c87d7d56e135393f8aab927148096e2d17589 ]
DCE 6 was not advertised as being able to support VRR, so let's mark it as unsupported for now.
The VRR implementation in amdgpu_dm depends on the VUPDATE interrupt which is not registered for DCE 6.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 4 +++- drivers/gpu/drm/amd/display/dc/dc_helper.c | 5 +++++ drivers/gpu/drm/amd/display/dc/dm_services.h | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +3 -1
@@ -10787,6 +10787,8 @@ static void get_freesync_config_for_crtc( }else { config.state =VRR_STATE_INACTIVE ; } + }else { + config.state =VRR_STATE_UNSUPPORTED ; } out: new_crtc_state->freesync_config = config;
@@ -12688,7 +12690,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, dm_con_state =to_dm_connector_state (connector->state); -if (!adev->dm.freesync_module) +if (!adev->dm.freesync_module || !dc_supports_vrr (sink->ctx->dce_version)) goto update; edid =drm_edid_raw (drm_edid);// FIXME: Get rid of drm_edid_raw()
drivers/gpu/drm/amd/display/dc/dc_helper.c +5 -0
@@ -755,3 +755,8 @@ char *dce_version_to_string(const int version)return "Unknown" ; } } + +bool dc_supports_vrr (const enum dce_version v) +{ +return v >=DCE_VERSION_8_0 ; +}
drivers/gpu/drm/amd/display/dc/dm_services.h +2 -0
@@ -311,4 +311,6 @@ void dm_dtn_log_end(struct dc_context *ctx,char *dce_version_to_string (const int version); +bool dc_supports_vrr (const enum dce_version v); +#endif /* __DM_SERVICES_H__ */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 559/849 drm/amd/display/dml2: Guard dml21_map_dc_state_into_dml_display_cfg with DC_FP_START
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xi Ruoyao <[email protected]>
[ Upstream commit c97a7dccb3ed680031011cfc1457506e6de49c9a ]
dml21_map_dc_state_into_dml_display_cfg calls (the call is usually inlined by the compiler) populate_dml21_surface_config_from_plane_state and populate_dml21_plane_config_from_plane_state which may use FPU. In a x86-64 build:
$ objdump --disassemble=dml21_map_dc_state_into_dml_display_cfg \
Quoted 2 lines
drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.o| grep %xmm -c
63
Thus it needs to be guarded with DC_FP_START. But we must note that the current code quality of the in-kernel FPU use in AMD dml2 is very much
problematic: we are actually calling DC_FP_START in dml21_wrapper.c here, and this translation unit is built with CC_FLAGS_FPU. Strictly speaking this does not make any sense: with CC_FLAGS_FPU the compiler is allowed to generate FPU uses anywhere in the translated code, perhaps out of the DC_FP_START guard. This problematic pattern also occurs in at least dml2_wrapper.c, dcn35_fpu.c, and dcn351_fpu.c. Thus we really need a careful audit and refactor for the in-kernel FPU uses, and this patch is simply whacking a mole. However per the reporter, whacking this mole is enough to make a 9060XT "just work."
--- drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c +4 -0
@@ -224,7 +224,9 @@ static bool dml21_mode_check_and_programming(const struct dc *in_dc, struct dc_s dml_ctx->config.svp_pstate.callbacks.release_phantom_streams_and_planes (in_dc, context);/* Populate stream, plane mappings and other fields in display config. */ +DC_FP_START (); result =dml21_map_dc_state_into_dml_display_cfg (in_dc, context, dml_ctx); +DC_FP_END ();if (!result)return false;
@@ -279,7 +281,9 @@ static bool dml21_check_mode_support(const struct dc *in_dc, struct dc_state *co dml_ctx->config.svp_pstate.callbacks.release_phantom_streams_and_planes (in_dc, context); mode_support->dml2_instance = dml_init->dml2_instance; +DC_FP_START ();dml21_map_dc_state_into_dml_display_cfg (in_dc, context, dml_ctx); +DC_FP_END (); dml_ctx->v21.mode_programming.dml2_instance->scratch.build_mode_programming_locals.mode_programming_params.programming = dml_ctx->v21.mode_programming.programming;DC_FP_START (); is_supported =dml2_check_mode_supported (mode_support);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 560/849 net: phy: clear EEE runtime state in PHY_HALTED/PHY_ERROR
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
[ Upstream commit 0915cb22452723407ca9606b7e5cc3fe6ce767d5 ]
Clear EEE runtime flags when the PHY transitions to HALTED or ERROR and the state machine drops the link. This avoids stale EEE state being reported via ethtool after the PHY is stopped or hits an error.
This change intentionally only clears software runtime flags and avoids MDIO accesses in HALTED/ERROR. A follow-up patch will address other link state variables.
--- drivers/net/phy/phy.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/phy/phy.c +2 -0
@@ -1551,6 +1551,8 @@ static enum phy_state_work _phy_state_machine(struct phy_device *phydev)case PHY_ERROR :if (phydev->link) { phydev->link =0 ; + phydev->eee_active = false; + phydev->enable_tx_lpi = false;phy_link_down (phydev); } state_work =PHY_STATE_WORK_SUSPEND ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 561/849 page_pool: always add GFP_NOWARN for ATOMIC allocations
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 f3b52167a0cb23b27414452fbc1278da2ee884fc ]
Driver authors often forget to add GFP_NOWARN for page allocation from the datapath. This is annoying to users as OOMs are a fact of life, and we pretty much expect network Rx to hit page allocation failures during OOM. Make page pool add GFP_NOWARN for ATOMIC allocations by default.
--- net/core/page_pool.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/core/page_pool.c +6 -0
@@ -596,6 +596,12 @@ static noinline netmem_ref __page_pool_alloc_netmems_slow(struct page_pool *poolnetmem_ref netmem;int i, nr_pages; +/* Unconditionally set NOWARN if allocating from NAPI. +* Drivers forget to set it, and OOM reports on packet Rx are useless. +*/ +if ((gfp &GFP_ATOMIC ) ==GFP_ATOMIC ) + gfp |= __GFP_NOWARN; +/* Don't support bulk alloc for high-order pages */ if (unlikely (pp_order))return page_to_netmem (__page_pool_alloc_page_order (pool, gfp));
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 562/849 ethernet: Extend device_get_mac_address() to use NVMEM
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wahren <[email protected]>
[ Upstream commit d2d3f529e7b6ff2aa432b16a2317126621c28058 ]
A lot of modern SoC have the ability to store MAC addresses in their NVMEM. So extend the generic function device_get_mac_address() to obtain the MAC address from an nvmem cell named 'mac-address' in case there is no firmware node which contains the MAC address directly.
--- net/ethernet/eth.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/ethernet/eth.c +4 -1
@@ -613,7 +613,10 @@ EXPORT_SYMBOL(fwnode_get_mac_address);*/ int device_get_mac_address (struct device *dev,char *addr) { -return fwnode_get_mac_address (dev_fwnode (dev), addr); +if (!fwnode_get_mac_address (dev_fwnode (dev), addr)) +return 0 ; + +return nvmem_get_mac_address (dev, addr); }EXPORT_SYMBOL (device_get_mac_address);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 563/849 scsi: ufs: ufs-qcom: Disable lane clocks during phy hibern8
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 c1553fc105dff28f79bef90fab207235f5f2d977 ]
Currently, the UFS lane clocks remain enabled even after the link enters the Hibern8 state and are only disabled during runtime/system suspend.This patch modifies the behavior to disable the lane clocks during ufs_qcom_setup_clocks(), which is invoked shortly after the link enters Hibern8 via gate work.
While hibern8_notify() offers immediate control, toggling clocks on every transition isn't ideal due to varied contexts like clock scaling. Since setup_clocks() manages PHY/controller resources and is invoked soon after Hibern8 entry, it serves as a central and stable point for clock gating.
Message-ID: <[email protected]>
--- drivers/ufs/host/ufs-qcom.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/ufs/host/ufs-qcom.c +10 -0
@@ -1183,6 +1183,13 @@ static int ufs_qcom_setup_clocks(struct ufs_hba *hba, bool on,case PRE_CHANGE :if (on) {ufs_qcom_icc_update_bw (host); +if (ufs_qcom_is_link_hibern8 (hba)) { + err =ufs_qcom_enable_lane_clks (host); +if (err) { +dev_err (hba->dev,"enable lane clks failed, ret=%d\n" , err); +return err; + } + } }else {if (!ufs_qcom_is_link_active (hba)) {/* disable device ref_clk */
@@ -1208,6 +1215,9 @@ static int ufs_qcom_setup_clocks(struct ufs_hba *hba, bool on,if (ufshcd_is_hs_mode (&hba->pwr_info))ufs_qcom_dev_ref_clk_ctrl (host, true); }else { +if (ufs_qcom_is_link_hibern8 (hba)) +ufs_qcom_disable_lane_clks (host); +ufs_qcom_icc_set_bw (host, ufs_qcom_bw_table[MODE_MIN ][0 ][0 ].mem_bw, ufs_qcom_bw_table[MODE_MIN ][0 ][0 ].cfg_bw); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 564/849 HID: i2c-hid: Resolve touchpad issues on Dell systems during S4
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 7d62beb102d6fa9a4e5e874be7fbf47a62fcc4f6 ]
Dell systems utilize an EC-based touchpad emulation when the ACPI touchpad _DSM is not invoked. This emulation acts as a secondary master on the I2C bus, designed for scenarios where the I2C touchpad driver is absent, such as in BIOS menus. Typically, loading the i2c-hid module triggers the _DSM at initialization, disabling the EC-based emulation.
However, if the i2c-hid module is missing from the boot kernel used for hibernation snapshot restoration, the _DSM remains uncalled, resulting in dual masters on the I2C bus and subsequent arbitration errors. This issue arises when i2c-hid resides in the rootfs instead of the kernel or initramfs.
To address this, switch from using the SYSTEM_SLEEP_PM_OPS() macro to dedicated callbacks, introducing a specific callback for restoring the S4 image. This callback ensures the _DSM is invoked.
--- drivers/hid/i2c-hid/i2c-hid-acpi.c | 8 ++++++++ drivers/hid/i2c-hid/i2c-hid-core.c | 28 +++++++++++++++++++++++++++- drivers/hid/i2c-hid/i2c-hid.h | 2 ++ 3 files changed, 37 insertions(+), 1 deletion(-)
drivers/hid/i2c-hid/i2c-hid-acpi.c +8 -0
@@ -76,6 +76,13 @@ static int i2c_hid_acpi_get_descriptor(struct i2c_hid_acpi *ihid_acpi)return hid_descriptor_address; } +static void i2c_hid_acpi_restore_sequence (struct i2chid_ops *ops) +{ + struct i2c_hid_acpi *ihid_acpi = container_of(ops, struct i2c_hid_acpi, ops); + +i2c_hid_acpi_get_descriptor (ihid_acpi); +} +static void i2c_hid_acpi_shutdown_tail (struct i2chid_ops *ops) { struct i2c_hid_acpi *ihid_acpi = container_of(ops, struct i2c_hid_acpi, ops);
@@ -96,6 +103,7 @@ static int i2c_hid_acpi_probe(struct i2c_client *client) ihid_acpi->adev =ACPI_COMPANION (dev); ihid_acpi->ops.shutdown_tail = i2c_hid_acpi_shutdown_tail; + ihid_acpi->ops.restore_sequence = i2c_hid_acpi_restore_sequence; ret =i2c_hid_acpi_get_descriptor (ihid_acpi);if (ret <0 )
drivers/hid/i2c-hid/i2c-hid-core.c +27 -1
@@ -961,6 +961,14 @@ static void i2c_hid_core_shutdown_tail(struct i2c_hid *ihid) ihid->ops->shutdown_tail (ihid->ops); } +static void i2c_hid_core_restore_sequence (struct i2c_hid *ihid) +{ +if (!ihid->ops->restore_sequence) +return ; + + ihid->ops->restore_sequence (ihid->ops); +} +static int i2c_hid_core_suspend (struct i2c_hid *ihid,bool force_poweroff) {struct i2c_client *client = ihid->client;
@@ -1370,8 +1378,26 @@ static int i2c_hid_core_pm_resume(struct device *dev)return i2c_hid_core_resume (ihid); } +static int i2c_hid_core_pm_restore (struct device *dev) +{ +struct i2c_client *client =to_i2c_client (dev); +struct i2c_hid *ihid =i2c_get_clientdata (client); + +if (ihid->is_panel_follower) +return 0 ; + +i2c_hid_core_restore_sequence (ihid); + +return i2c_hid_core_resume (ihid); +} +const struct dev_pm_ops i2c_hid_core_pm = { -SYSTEM_SLEEP_PM_OPS (i2c_hid_core_pm_suspend, i2c_hid_core_pm_resume) + .suspend =pm_sleep_ptr (i2c_hid_core_pm_suspend), + .resume =pm_sleep_ptr (i2c_hid_core_pm_resume), + .freeze =pm_sleep_ptr (i2c_hid_core_pm_suspend), + .thaw =pm_sleep_ptr (i2c_hid_core_pm_resume), + .poweroff =pm_sleep_ptr (i2c_hid_core_pm_suspend), + .restore =pm_sleep_ptr (i2c_hid_core_pm_restore), };EXPORT_SYMBOL_GPL (i2c_hid_core_pm);
drivers/hid/i2c-hid/i2c-hid.h +2 -0
@@ -27,11 +27,13 @@ static inline u32 i2c_hid_get_dmi_quirks(const u16 vendor, const u16 product)* @power_up: do sequencing to power up the device. * @power_down: do sequencing to power down the device. * @shutdown_tail: called at the end of shutdown. +* @restore_sequence: hibernation restore sequence. */ struct i2chid_ops {int (*power_up)(struct i2chid_ops *ops);void (*power_down)(struct i2chid_ops *ops);void (*shutdown_tail)(struct i2chid_ops *ops); +void (*restore_sequence)(struct i2chid_ops *ops); }; int i2c_hid_core_probe(struct i2c_client *client, struct i2chid_ops *ops,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 565/849 hinic3: Queue pair endianness improvements
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fan Gong <[email protected]>
[ Upstream commit 6b822b658aafe840ffd6d7f1af5bf4f77df15a11 ]
Explicitly use little-endian & big-endian structs to support big endian hosts.
--- .../ethernet/huawei/hinic3/hinic3_nic_io.h | 15 ++-- .../net/ethernet/huawei/hinic3/hinic3_rx.c | 10 +-- .../net/ethernet/huawei/hinic3/hinic3_rx.h | 24 +++--- .../net/ethernet/huawei/hinic3/hinic3_tx.c | 81 ++++++++++--------- .../net/ethernet/huawei/hinic3/hinic3_tx.h | 18 ++--- 5 files changed, 79 insertions(+), 69 deletions(-)
drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.h +8 -7
@@ -75,8 +75,8 @@ static inline u16 hinic3_get_sq_hw_ci(const struct hinic3_io_queue *sq)#define DB_CFLAG_DP_RQ 1struct hinic3_nic_db { -u32 db_info; -u32 pi_hi; +__le32 db_info; +__le32 pi_hi; }; static inline void hinic3_write_db(struct hinic3_io_queue *queue, int cos,
@@ -84,11 +84,12 @@ static inline void hinic3_write_db(struct hinic3_io_queue *queue, int cos, {struct hinic3_nic_db db; - db.db_info =DB_INFO_SET (DB_SRC_TYPE ,TYPE ) | -DB_INFO_SET (cflag,CFLAG ) | -DB_INFO_SET (cos,COS ) | -DB_INFO_SET (queue->q_id,QID ); - db.pi_hi =DB_PI_HIGH (pi); + db.db_info = +cpu_to_le32 (DB_INFO_SET (DB_SRC_TYPE ,TYPE ) | +DB_INFO_SET (cflag,CFLAG ) | +DB_INFO_SET (cos,COS ) | +DB_INFO_SET (queue->q_id,QID )); + db.pi_hi =cpu_to_le32 (DB_PI_HIGH (pi));writeq (*((u64 *)&db),DB_ADDR (queue, pi)); }
drivers/net/ethernet/huawei/hinic3/hinic3_rx.c +5 -5
@@ -66,8 +66,8 @@ static void rq_wqe_buf_set(struct hinic3_io_queue *rq, uint32_t wqe_idx,struct hinic3_rq_wqe *rq_wqe; rq_wqe =get_q_element (&rq->wq.qpages, wqe_idx,NULL ); - rq_wqe->buf_hi_addr =upper_32_bits (dma_addr); - rq_wqe->buf_lo_addr =lower_32_bits (dma_addr); + rq_wqe->buf_hi_addr =cpu_to_le32 (upper_32_bits (dma_addr)); + rq_wqe->buf_lo_addr =cpu_to_le32 (lower_32_bits (dma_addr)); }static u32 hinic3_rx_fill_buffers (struct hinic3_rxq *rxq)
@@ -279,7 +279,7 @@ static int recv_one_pkt(struct hinic3_rxq *rxq, struct hinic3_rq_cqe *rx_cqe,if (skb_is_nonlinear (skb))hinic3_pull_tail (skb); - offload_type = rx_cqe->offload_type; + offload_type =le32_to_cpu (rx_cqe->offload_type);hinic3_rx_csum (rxq, offload_type, status, skb); num_lro =RQ_CQE_STATUS_GET (status,NUM_LRO );
@@ -311,14 +311,14 @@ int hinic3_rx_poll(struct hinic3_rxq *rxq, int budget)while (likely (nr_pkts < budget)) { sw_ci = rxq->cons_idx & rxq->q_mask; rx_cqe = rxq->cqe_arr + sw_ci; - status = rx_cqe->status; + status =le32_to_cpu (rx_cqe->status);if (!RQ_CQE_STATUS_GET (status,RXDONE ))break ;/* make sure we read rx_done before packet length */ rmb (); - vlan_len = rx_cqe->vlan_len; + vlan_len =le32_to_cpu (rx_cqe->vlan_len); pkt_len =RQ_CQE_SGE_GET (vlan_len,LEN );if (recv_one_pkt (rxq, rx_cqe, pkt_len, vlan_len, status))break ;
drivers/net/ethernet/huawei/hinic3/hinic3_rx.h +12 -12
@@ -27,21 +27,21 @@/* RX Completion information that is provided by HW for a specific RX WQE */ struct hinic3_rq_cqe { -u32 status; -u32 vlan_len; -u32 offload_type; -u32 rsvd3; -u32 rsvd4; -u32 rsvd5; -u32 rsvd6; -u32 pkt_info; +__le32 status; +__le32 vlan_len; +__le32 offload_type; +__le32 rsvd3; +__le32 rsvd4; +__le32 rsvd5; +__le32 rsvd6; +__le32 pkt_info; };struct hinic3_rq_wqe { -u32 buf_hi_addr; -u32 buf_lo_addr; -u32 cqe_hi_addr; -u32 cqe_lo_addr; +__le32 buf_hi_addr; +__le32 buf_lo_addr; +__le32 cqe_hi_addr; +__le32 cqe_lo_addr; };struct hinic3_rx_info {
drivers/net/ethernet/huawei/hinic3/hinic3_tx.c +45 -36
181 lines not on this page · raw message
drivers/net/ethernet/huawei/hinic3/hinic3_tx.h +9 -9
@@ -58,7 +58,7 @@ enum hinic3_tx_offload_type {#define SQ_CTRL_QUEUE_INFO_SET (val, member) \ FIELD_PREP(SQ_CTRL_QUEUE_INFO_##member##_MASK, val)#define SQ_CTRL_QUEUE_INFO_GET (val, member) \ - FIELD_GET(SQ_CTRL_QUEUE_INFO_##member##_MASK, val) + FIELD_GET(SQ_CTRL_QUEUE_INFO_##member##_MASK, le32_to_cpu(val))#define SQ_CTRL_MAX_PLDOFF 221
@@ -77,17 +77,17 @@ enum hinic3_tx_offload_type { FIELD_PREP(SQ_TASK_INFO3_##member##_MASK, val)struct hinic3_sq_wqe_desc { -u32 ctrl_len; -u32 queue_info; -u32 hi_addr; -u32 lo_addr; +__le32 ctrl_len; +__le32 queue_info; +__le32 hi_addr; +__le32 lo_addr; };struct hinic3_sq_task { -u32 pkt_info0; -u32 ip_identify; -u32 rsvd; -u32 vlan_offload; +__le32 pkt_info0; +__le32 ip_identify; +__le32 rsvd; +__le32 vlan_offload; };struct hinic3_sq_wqe_combo {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 566/849 hinic3: Fix missing napi->dev in netif_queue_set_napi
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fan Gong <[email protected]>
[ Upstream commit 4404f6af810829588a51968959c6b85574109c13 ]
As netif_queue_set_napi checks napi->dev, if it doesn't have it and it will warn_on and return. So we should use netif_napi_add before netif_queue_set_napi because netif_napi_add has "napi->dev = dev".
--- drivers/net/ethernet/huawei/hinic3/hinic3_irq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/huawei/hinic3/hinic3_irq.c +1 -1
@@ -42,11 +42,11 @@ void qp_add_napi(struct hinic3_irq_cfg *irq_cfg) {struct hinic3_nic_dev *nic_dev =netdev_priv (irq_cfg->netdev); +netif_napi_add (nic_dev->netdev, &irq_cfg->napi, hinic3_poll);netif_queue_set_napi (irq_cfg->netdev, irq_cfg->irq_id,NETDEV_QUEUE_TYPE_RX , &irq_cfg->napi);netif_queue_set_napi (irq_cfg->netdev, irq_cfg->irq_id,NETDEV_QUEUE_TYPE_TX , &irq_cfg->napi); -netif_napi_add (nic_dev->netdev, &irq_cfg->napi, hinic3_poll);napi_enable (&irq_cfg->napi); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 567/849 tools: ynl-gen: validate nested arrays
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 1d99aa4ed707c5630a7a7f067c8818e19167e3a1 ]
In nested arrays don't require that the intermediate attribute type should be a valid attribute type, it might just be zero or an incrementing index, it is often not even used.
See include/net/netlink.h about NLA_NESTED_ARRAY:
Quoted 5 lines
The difference to
NLA_NESTEDis the structure:NLA_NESTEDhas the nested attributes directly inside while an array has the nested attributes at another level down and the attribute types directly in the nesting don't matter.
Example based on include/uapi/linux/wireguard.h:
Quoted 7 lines
WGDEVICE_A_PEERS:NLA_NESTED
0:NLA_NESTED
WGPEER_A_PUBLIC_KEY:NLA_EXACT_LEN, lenWG_KEY_LEN[..]
0:NLA_NESTED......
Previous the check required that the nested type was valid in the parent attribute set, which in this case resolves to WGDEVICE_A_UNSPEC, which is YNL_PT_REJECT, and it took the early exit and returned YNL_PARSE_CB_ERROR.
This patch renames the old nl_attr_validate() to __nl_attr_validate(), and creates a new inline function nl_attr_validate() to mimic the old one.
The new __nl_attr_validate() takes the attribute type as an argument, so we can use it to validate attributes of a nested attribute, in the context of the parents attribute type, which in the above case is generated as:
[WGDEVICE_A_PEERS] = {
.name = "peers",
.type = YNL_PT_NEST,
.nest = &wireguard_wgpeer_nest,
},
__nl_attr_validate() only checks if the attribute length is plausible for a given attribute type, so the .nest in the above example is not used.
As the new inline function needs to be defined after ynl_attr_type(), then the definitions are moved down, so we avoid a forward declaration of ynl_attr_type().
Some other examples are NL80211_BAND_ATTR_FREQS (nest) and NL80211_ATTR_SUPPORTED_COMMANDS (u32) both in nl80211-user.c
$ make -C tools/net/ynl/generated nl80211-user.c
--- tools/net/ynl/lib/ynl-priv.h | 10 +++++++++- tools/net/ynl/lib/ynl.c | 6 +++--- tools/net/ynl/pyynl/ynl_gen_c.py | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-)
tools/net/ynl/lib/ynl-priv.h +9 -1
@@ -106,7 +106,6 @@ ynl_gemsg_start_req(struct ynl_sock *ys, __u32 id, __u8 cmd, __u8 version);struct nlmsghdr *ynl_gemsg_start_dump (struct ynl_sock *ys,__u32 id,__u8 cmd,__u8 version); -int ynl_attr_validate (struct ynl_parse_arg *yarg,const struct nlattr *attr);int ynl_submsg_failed (struct ynl_parse_arg *yarg,const char *field_name,const char *sel_name);
@@ -467,4 +466,13 @@ ynl_attr_put_sint(struct nlmsghdr *nlh, __u16 type, __s64 data) else ynl_attr_put_s64(nlh, type, data); } + +int __ynl_attr_validate (struct ynl_parse_arg *yarg,const struct nlattr *attr, +unsigned int type); + +static inline int ynl_attr_validate (struct ynl_parse_arg *yarg, +const struct nlattr *attr) +{ +return __ynl_attr_validate (yarg, attr,ynl_attr_type (attr)); +}#endif
tools/net/ynl/lib/ynl.c +3 -3
@@ -360,15 +360,15 @@ static int ynl_cb_done(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg)/* Attribute validation */ -int ynl_attr_validate (struct ynl_parse_arg *yarg,const struct nlattr *attr) +int __ynl_attr_validate (struct ynl_parse_arg *yarg,const struct nlattr *attr, +unsigned int type) {const struct ynl_policy_attr *policy; -unsigned int type, len;unsigned char *data; +unsigned int len; data =ynl_attr_data (attr); len =ynl_attr_data_len (attr); - type =ynl_attr_type (attr);if (type > yarg->rsp_policy->max_attr) {yerr (yarg->ys,YNL_ERROR_INTERNAL ,"Internal error, validating unknown attribute" );
tools/net/ynl/pyynl/ynl_gen_c.py +1 -1
@@ -828,7 +828,7 @@ class TypeArrayNest(Type): local_vars = ['const struct nlattr *attr2;'] get_lines = [f'attr_{self.c_name} = attr;', 'ynl_attr_for_each_nested(attr2, attr) {', - '\tif (ynl_attr_validate(yarg, attr2))', + '\tif (__ynl_attr_validate(yarg, attr2, type))', '\t\treturn YNL_PARSE_CB_ERROR;', f'\tn_{self.c_name}++;', '}']
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 568/849 drm/xe/guc: Return an error code if the GuC load fails
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Harrison <[email protected]>
[ Upstream commit 3b09b11805bfee32d5a0000f5ede42c07237a6c4 ]
Due to multiple explosion issues in the early days of the Xe driver, the GuC load was hacked to never return a failure. That prevented kernel panics and such initially, but now all it achieves is creating more confusing errors when the driver tries to submit commands to a GuC it already knows is not there. So fix that up.
As a stop-gap and to help with debug of load failures due to invalid GuC init params, a wedge call had been added to the inner GuC load function. The reason being that it leaves the GuC log accessible via debugfs. However, for an end user, simply aborting the module load is much cleaner than wedging and trying to continue. The wedge blocks user submissions but it seems that various bits of the driver itself still try to submit to a dead GuC and lots of subsequent errors occur. And with regards to developers debugging why their particular code change is being rejected by the GuC, it is trivial to either add the wedge back in and hack the return code to zero again or to just do a GuC log dump to dmesg.
v2: Add support for error injection testing and drop the now redundant wedge call.
--- drivers/gpu/drm/xe/xe_guc.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/gpu/drm/xe/xe_guc.c +9 -4
@@ -1056,7 +1056,7 @@ static s32 guc_pc_get_cur_freq(struct xe_guc_pc *guc_pc)#endif #define GUC_LOAD_TIME_WARN_MS 200 -static void guc_wait_ucode (struct xe_guc *guc) +static int guc_wait_ucode (struct xe_guc *guc) {struct xe_gt *gt =guc_to_gt (guc);struct xe_mmio *mmio = >->mmio;
@@ -1163,7 +1163,7 @@ static void guc_wait_ucode(struct xe_guc *guc)break ; } -xe_device_declare_wedged (gt_to_xe (gt)); +return -EPROTO ; }else if (delta_ms >GUC_LOAD_TIME_WARN_MS ) {xe_gt_warn (gt,"excessive init time: %lldms! [status = 0x%08X, timeouts = %d]\n" , delta_ms, status, count);
@@ -1175,7 +1175,10 @@ static void guc_wait_ucode(struct xe_guc *guc) delta_ms,xe_guc_pc_get_act_freq (guc_pc),guc_pc_get_cur_freq (guc_pc), before_freq, status, count); } + +return 0 ; } +ALLOW_ERROR_INJECTION (guc_wait_ucode,ERRNO );static int __xe_guc_upload (struct xe_guc *guc) {
@@ -1207,14 +1210,16 @@ static int __xe_guc_upload(struct xe_guc *guc) goto out;/* Wait for authentication */ -guc_wait_ucode (guc); + ret =guc_wait_ucode (guc); +if (ret) + goto out;xe_uc_fw_change_status (&guc->fw,XE_UC_FIRMWARE_RUNNING );return 0 ; out:xe_uc_fw_change_status (&guc->fw,XE_UC_FIRMWARE_LOAD_FAIL ); -return 0 /* FIXME: ret, don't want to stop load currently */ ; +return ret; }static int vf_guc_min_load_for_hwconfig (struct xe_guc *guc)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 569/849 drm/amdgpu: reject gang submissions under SRIOV
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian König <[email protected]>
[ Upstream commit d7ddcf921e7d0d8ebe82e89635bc9dc26ba9540d ]
Gang submission means that the kernel driver guarantees that multiple submissions are executed on the HW at the same time on different engines.
Background is that those submissions then depend on each other and each can't finish stand alone.
SRIOV now uses world switch to preempt submissions on the engines to allow sharing the HW resources between multiple VFs.
The problem is now that the SRIOV world switch can't know about such inter dependencies and will cause a timeout if it waits for a partially running gang submission.
To conclude SRIOV and gang submissions are fundamentally incompatible at the moment. For now just disable them.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +1 -1
@@ -286,7 +286,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p, } } -if (!p->gang_size) { +if (!p->gang_size || (amdgpu_sriov_vf (p->adev) && p->gang_size >1 )) { ret = -EINVAL ; goto free_all_kdata; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 570/849 selftests/Makefile: include $(INSTALL_DEP_TARGETS) in clean target to clean net/lib dependency
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nai-Chen Cheng <[email protected]>
[ Upstream commit d3f7457da7b9527a06dbcbfaf666aa51ac2eeb53 ]
The selftests 'make clean' does not clean the net/lib because it only processes $(TARGETS) and ignores $(INSTALL_DEP_TARGETS). This leaves compiled objects in net/lib after cleaning, requiring manual cleanup.
Include $(INSTALL_DEP_TARGETS) in clean target to ensure net/lib dependency is properly cleaned.
--- tools/testing/selftests/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/Makefile +1 -1
@@ -314,7 +314,7 @@ gen_tar: install @echo "Created ${TAR_PATH}" clean: - @for TARGET in $(TARGETS); do \ + @for TARGET in $(TARGETS) $(INSTALL_DEP_TARGETS); do \ BUILD_TARGET=$$BUILD/$$TARGET; \ $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET clean;\ done;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 571/849 scsi: ufs: core: Disable timestamp functionality if not supported
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
[ Upstream commit fb1f4568346153d2f80fdb4ffcfa0cf4fb257d3c ]
Some Kioxia UFS 4 devices do not support the qTimestamp attribute. Set the UFS_DEVICE_QUIRK_NO_TIMESTAMP_SUPPORT for these devices such that no error messages appear in the kernel log about failures to set the qTimestamp attribute.
Message-ID: <[email protected]>
--- drivers/ufs/core/ufshcd.c | 6 +++++- include/ufs/ufs_quirks.h | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-)
drivers/ufs/core/ufshcd.c +5 -1
@@ -316,6 +316,9 @@ static const struct ufs_dev_quirk ufs_fixups[] = { { .wmanufacturerid = UFS_VENDOR_TOSHIBA, .model = "THGLF2G9D8KBADG", .quirk = UFS_DEVICE_QUIRK_PA_TACTIVATE }, + { .wmanufacturerid = UFS_VENDOR_TOSHIBA, + .model = "THGJFJT1E45BATP", + .quirk = UFS_DEVICE_QUIRK_NO_TIMESTAMP_SUPPORT }, {} };
@@ -8794,7 +8797,8 @@ static void ufshcd_set_timestamp_attr(struct ufs_hba *hba)struct ufs_dev_info *dev_info = &hba->dev_info;struct utp_upiu_query_v4_0 *upiu_data; -if (dev_info->wspecversion <0x400 ) +if (dev_info->wspecversion <0x400 || + hba->dev_quirks &UFS_DEVICE_QUIRK_NO_TIMESTAMP_SUPPORT )return ;ufshcd_dev_man_lock (hba);
include/ufs/ufs_quirks.h +3 -0
@@ -113,4 +113,7 @@ struct ufs_dev_quirk {*/ #define UFS_DEVICE_QUIRK_PA_HIBER8TIME (1 << 12) +/* Some UFS 4 devices do not support the qTimestamp attribute */ +#define UFS_DEVICE_QUIRK_NO_TIMESTAMP_SUPPORT (1 << 13) +#endif /* UFS_QUIRKS_H_ */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 572/849 scsi: lpfc: Clean up allocated queues when queue setup mbox commands fail
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Tee <[email protected]>
[ Upstream commit 803dfd83df33b7565f23aef597d5dd036adfa792 ]
lpfc_sli4_queue_setup() does not allocate memory and is used for submitting CREATE_QUEUE mailbox commands. Thus, if such mailbox commands fail we should clean up by also freeing the memory allocated for the queues with lpfc_sli4_queue_destroy(). Change the intended clean up label for the lpfc_sli4_queue_setup() error case to out_destroy_queue.
Message-ID: <[email protected]>
--- drivers/scsi/lpfc/lpfc_sli.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/lpfc/lpfc_sli.c +1 -2
@@ -8820,7 +8820,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)if (unlikely (rc)) {lpfc_printf_log (phba,KERN_ERR ,LOG_TRACE_EVENT ,"0381 Error %d during queue setup.\n" , rc); - goto out_stop_timers; + goto out_destroy_queue; }/* Initialize the driver internal SLI layer lists. */ lpfc_sli4_setup (phba);
@@ -9103,7 +9103,6 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)lpfc_free_iocb_list (phba); out_destroy_queue:lpfc_sli4_queue_destroy (phba); -out_stop_timers:lpfc_stop_hba_timers (phba); out_free_mbox:mempool_free (mboxq, phba->mbox_mem_pool);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 573/849 scsi: lpfc: Decrement ndlp kref after FDISC retries exhausted
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Tee <[email protected]>
[ Upstream commit b5bf6d681fce69cd1a57bfc0f1bdbbb348035117 ]
The kref for Fabric_DID ndlps is not decremented after repeated FDISC failures and exhausting maximum allowed retries. This can leave the ndlp lingering unnecessarily. Add a test and set bit operation for the NLP_DROPPED flag. If not previously set, then a kref is decremented. The ndlp is freed when the remaining reference for the completing ELS is put.
Message-ID: <[email protected]>
--- drivers/scsi/lpfc/lpfc_els.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/scsi/lpfc/lpfc_els.c +5 -0
@@ -11259,6 +11259,11 @@ lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,lpfc_vlog_msg (vport,KERN_WARNING ,LOG_ELS ,"0126 FDISC cmpl status: x%x/x%x)\n" , ulp_status, ulp_word4); + +/* drop initial reference */ +if (!test_and_set_bit (NLP_DROPPED , &ndlp->nlp_flag)) +lpfc_nlp_put (ndlp); + goto fdisc_failed; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 574/849 scsi: lpfc: Check return status of lpfc_reset_flush_io_context during TGT_RESET
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Tee <[email protected]>
[ Upstream commit f408dde2468b3957e92b25e7438f74c8e9fb9e73 ]
If lpfc_reset_flush_io_context fails to execute, then the wrong return status code may be passed back to upper layers when issuing a target reset TMF command. Fix by checking the return status from lpfc_reset_flush_io_context() first in order to properly return FAILED or FAST_IO_FAIL.
Message-ID: <[email protected]>
--- drivers/scsi/lpfc/lpfc_scsi.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
drivers/scsi/lpfc/lpfc_scsi.c +10 -4
@@ -5935,7 +5935,7 @@ lpfc_chk_tgt_mapped(struct lpfc_vport *vport, struct fc_rport *rport)/** * lpfc_reset_flush_io_context - * @vport: The virtual port (scsi_host) for the flush context -* @tgt_id: If aborting by Target contect - specifies the target id +* @tgt_id: If aborting by Target context - specifies the target id * @lun_id: If aborting by Lun context - specifies the lun id * @context: specifies the context level to flush at. *
@@ -6109,8 +6109,14 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd) pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE ;spin_unlock_irqrestore (&pnode->lock, flags); } -lpfc_reset_flush_io_context (vport, tgt_id, lun_id, -LPFC_CTX_TGT ); + status =lpfc_reset_flush_io_context (vport, tgt_id, lun_id, +LPFC_CTX_TGT ); +if (status !=SUCCESS ) { +lpfc_printf_vlog (vport,KERN_ERR ,LOG_FCP , +"0726 Target Reset flush status x%x\n" , + status); +return status; + }return FAST_IO_FAIL ; }
@@ -6202,7 +6208,7 @@ lpfc_host_reset_handler(struct scsi_cmnd *cmnd)int rc, ret =SUCCESS ;lpfc_printf_vlog (vport,KERN_ERR ,LOG_FCP , -"3172 SCSI layer issued Host Reset Data:\n" ); +"3172 SCSI layer issued Host Reset\n" );lpfc_offline_prep (phba,LPFC_MBX_WAIT );lpfc_offline (phba);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 575/849 scsi: lpfc: Remove ndlp kref decrement clause for F_Port_Ctrl in lpfc_cleanup
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Tee <[email protected]>
[ Upstream commit a4809b98eb004fcbf7c4d45eb5a624d1c682bb73 ]
In lpfc_cleanup, there is an extraneous nlp_put for NPIV ports on the F_Port_Ctrl ndlp object. In cases when an ABTS is issued, the outstanding kref is needed for when a second XRI_ABORTED CQE is received. The final kref for the ndlp is designed to be decremented in lpfc_sli4_els_xri_aborted instead. Also, add a new log message to allow for future diagnostics when debugging related issues.
Message-ID: <[email protected]>
--- drivers/scsi/lpfc/lpfc_els.c | 6 +++++- drivers/scsi/lpfc/lpfc_init.c | 7 ------- 2 files changed, 5 insertions(+), 8 deletions(-)
drivers/scsi/lpfc/lpfc_els.c +5 -1
@@ -12013,7 +12013,11 @@ lpfc_sli4_els_xri_aborted(struct lpfc_hba *phba, sglq_entry->state =SGL_FREED ;spin_unlock_irqrestore (&phba->sli4_hba.sgl_list_lock, iflag); - +lpfc_printf_log (phba,KERN_INFO ,LOG_ELS |LOG_SLI | +LOG_DISCOVERY |LOG_NODE , +"0732 ELS XRI ABORT on Node: ndlp=x%px " +"xri=x%x\n" , + ndlp, xri);if (ndlp) { lpfc_set_rrq_active(phba, ndlp, sglq_entry->sli4_lxritag,
drivers/scsi/lpfc/lpfc_init.c +0 -7
@@ -3057,13 +3057,6 @@ lpfc_cleanup(struct lpfc_vport *vport)lpfc_vmid_vport_cleanup (vport);list_for_each_entry_safe (ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) { -if (vport->port_type !=LPFC_PHYSICAL_PORT && - ndlp->nlp_DID == Fabric_DID) { -/* Just free up ndlp with Fabric_DID for vports */ -lpfc_nlp_put (ndlp); -continue ; - } -if (ndlp->nlp_DID == Fabric_Cntl_DID && ndlp->nlp_state ==NLP_STE_UNUSED_NODE ) {lpfc_nlp_put (ndlp);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 576/849 scsi: lpfc: Define size of debugfs entry for xri rebalancing
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Tee <[email protected]>
[ Upstream commit 5de09770b1c0e229d2cec93e7f634fcdc87c9bc8 ]
To assist in debugging lpfc_xri_rebalancing driver parameter, a debugfs entry is used. The debugfs file operations for xri rebalancing have been previously implemented, but lack definition for its information buffer size. Similar to other pre-existing debugfs entry buffers, define LPFC_HDWQINFO_SIZE as 8192 bytes.
Message-ID: <[email protected]>
--- drivers/scsi/lpfc/lpfc_debugfs.h | 3 +++ 1 file changed, 3 insertions(+)
drivers/scsi/lpfc/lpfc_debugfs.h +3 -0
@@ -44,6 +44,9 @@/* hbqinfo output buffer size */ #define LPFC_HBQINFO_SIZE 8192 +/* hdwqinfo output buffer size */ +#define LPFC_HDWQINFO_SIZE 8192 +/* nvmestat output buffer size */ #define LPFC_NVMESTAT_SIZE 8192#define LPFC_IOKTIME_SIZE 8192
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 577/849 scsi: lpfc: Ensure PLOGI_ACC is sent prior to PRLI in Point to Point topology
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Tee <[email protected]>
[ Upstream commit 2bf81856a403c92a4ce375288f33fba82ca2ccc6 ]
There is a timing race condition when a PRLI may be sent on the wire before PLOGI_ACC in Point to Point topology. Fix by deferring REG_RPI mbox completion handling to after PLOGI_ACC's CQE completion. Because the discovery state machine only sends PRLI after REG_RPI mbox completion, PRLI is now guaranteed to be sent after PLOGI_ACC.
Message-ID: <[email protected]>
--- drivers/scsi/lpfc/lpfc_els.c | 10 +++++++--- drivers/scsi/lpfc/lpfc_nportdisc.c | 23 ++++++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-)
drivers/scsi/lpfc/lpfc_els.c +7 -3
@@ -5339,12 +5339,12 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, ulp_status, ulp_word4, did);/* ELS response tag <ulpIoTag> completes */ lpfc_printf_vlog (vport,KERN_INFO ,LOG_ELS , -"0110 ELS response tag x%x completes " +"0110 ELS response tag x%x completes fc_flag x%lx" "Data: x%x x%x x%x x%x x%lx x%x x%x x%x %p %p\n" , - iotag, ulp_status, ulp_word4, tmo, + iotag, vport->fc_flag, ulp_status, ulp_word4, tmo, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi,kref_read (&ndlp->kref), mbox, ndlp); -if (mbox) { +if (mbox && !test_bit (FC_PT2PT , &vport->fc_flag)) {if (ulp_status ==0 &&test_bit (NLP_ACC_REGLOGIN , &ndlp->nlp_flag)) { if (!lpfc_unreg_rpi(vport, ndlp) &&
@@ -5403,6 +5403,10 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, } out_free_mbox:lpfc_mbox_rsrc_cleanup (phba, mbox,MBOX_THD_UNLOCKED ); + }else if (mbox &&test_bit (FC_PT2PT , &vport->fc_flag) && +test_bit (NLP_ACC_REGLOGIN , &ndlp->nlp_flag)) { +lpfc_mbx_cmpl_reg_login (phba, mbox); +clear_bit (NLP_ACC_REGLOGIN , &ndlp->nlp_flag); } out:if (ndlp && shost) {
drivers/scsi/lpfc/lpfc_nportdisc.c +18 -5
@@ -326,8 +326,14 @@ lpfc_defer_plogi_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *login_mbox)/* Now that REG_RPI completed successfully, * we can now proceed with sending the PLOGI ACC. */ - rc =lpfc_els_rsp_acc (login_mbox->vport,ELS_CMD_PLOGI , - save_iocb, ndlp,NULL ); +if (test_bit (FC_PT2PT , &ndlp->vport->fc_flag)) { + rc =lpfc_els_rsp_acc (login_mbox->vport,ELS_CMD_PLOGI , + save_iocb, ndlp, login_mbox); + }else { + rc =lpfc_els_rsp_acc (login_mbox->vport,ELS_CMD_PLOGI , + save_iocb, ndlp,NULL ); + } +if (rc) {lpfc_printf_log (phba,KERN_ERR ,LOG_TRACE_EVENT , "4576 PLOGI ACC fails pt2pt discovery: "
@@ -335,9 +341,16 @@ lpfc_defer_plogi_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *login_mbox) } } -/* Now process the REG_RPI cmpl */ -lpfc_mbx_cmpl_reg_login (phba, login_mbox); -clear_bit (NLP_ACC_REGLOGIN , &ndlp->nlp_flag); +/* If this is a fabric topology, complete the reg_rpi and prli now. +* For Pt2Pt, the reg_rpi and PRLI are deferred until after the LS_ACC +* completes. This ensures, in Pt2Pt, that the PLOGI LS_ACC is sent +* before the PRLI. +*/ +if (!test_bit (FC_PT2PT , &ndlp->vport->fc_flag)) { +/* Now process the REG_RPI cmpl */ +lpfc_mbx_cmpl_reg_login (phba, login_mbox); +clear_bit (NLP_ACC_REGLOGIN , &ndlp->nlp_flag); + }kfree (save_iocb); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 580/849 usb: xhci: plat: Facilitate using autosuspend for xhci plat devices
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krishna Kurapati <[email protected]>
[ Upstream commit 41cf11946b9076383a2222bbf1ef57d64d033f66 ]
Allow autosuspend to be used by xhci plat device. For Qualcomm SoCs, when in host mode, it is intended that the controller goes to suspend state to save power and wait for interrupts from connected peripheral to wake it up. This is particularly used in cases where a HID or Audio device is connected. In such scenarios, the usb controller can enter auto suspend and resume action after getting interrupts from the connected device.
--- drivers/usb/host/xhci-plat.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/host/xhci-plat.c +1 -0
@@ -171,6 +171,7 @@ int xhci_plat_probe(struct platform_device *pdev, struct device *sysdev, const sreturn ret;pm_runtime_set_active (&pdev->dev); +pm_runtime_use_autosuspend (&pdev->dev);pm_runtime_enable (&pdev->dev);pm_runtime_get_noresume (&pdev->dev);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 581/849 f2fs: fix infinite loop in __insert_extent_tree()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: wangzijie <[email protected]>
[ Upstream commit 23361bd54966b437e1ed3eb1a704572f4b279e58 ]
When we get wrong extent info data, and look up extent_node in rb tree, it will cause infinite loop (CONFIG_F2FS_CHECK_FS=n). Avoiding this by return NULL and print some kernel messages in that case.
--- fs/f2fs/extent_cache.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/f2fs/extent_cache.c +6 -0
@@ -604,7 +604,13 @@ static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi, p = &(*p)->rb_right; leftmost = false; }else { +f2fs_err_ratelimited (sbi,"%s: corrupted extent, type: %d, " +"extent node in rb tree [%u, %u, %u], age [%llu, %llu], " +"extent node to insert [%u, %u, %u], age [%llu, %llu]" , + __func__, et->type, en->ei.fofs, en->ei.blk, en->ei.len, en->ei.age, + en->ei.last_blocks, ei->fofs, ei->blk, ei->len, ei->age, ei->last_blocks);f2fs_bug_on (sbi,1 ); +return NULL ; } }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 582/849 wifi: rtw89: disable RTW89_PHYSTS_IE09_FTR_0 for ppdu status
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chih-Kang Chang <[email protected]>
[ Upstream commit 4e79a5cc01c5e1f1ba393ed3b44b0c3611eaadf1 ]
The IE length of RTW89_PHYSTS_IE09_FTR_0 is dynamic, need to calculate more to get it. This IE is not necessary now, disable it to avoid get wrong IE length to let the parse function check failed.
--- drivers/net/wireless/realtek/rtw89/phy.c | 2 -- 1 file changed, 2 deletions(-)
drivers/net/wireless/realtek/rtw89/phy.c +0 -2
@@ -5929,8 +5929,6 @@ static void __rtw89_physts_parsing_init(struct rtw89_dev *rtwdev, val |=BIT (RTW89_PHYSTS_IE13_DL_MU_DEF ) |BIT (RTW89_PHYSTS_IE01_CMN_OFDM ); }else if (i >=RTW89_CCK_PKT ) { - val |=BIT (RTW89_PHYSTS_IE09_FTR_0 ); - val &= ~(GENMASK (RTW89_PHYSTS_IE07_CMN_EXT_PATH_D ,RTW89_PHYSTS_IE04_CMN_EXT_PATH_A ));
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 583/849 wifi: rtw89: obtain RX path from ppdu status IE00
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chih-Kang Chang <[email protected]>
[ Upstream commit e156d2ab36d7e47aec36845705e4ecb1e4e89976 ]
The header v2 of ppdu status is optional, If it is not enabled, the RX path must be obtained from IE00 or IE01. Append the IE00 part.
--- drivers/net/wireless/realtek/rtw89/core.c | 4 ++++ drivers/net/wireless/realtek/rtw89/txrx.h | 1 + 2 files changed, 5 insertions(+)
drivers/net/wireless/realtek/rtw89/core.c +4 -0
@@ -1844,6 +1844,10 @@ static void rtw89_core_parse_phy_status_ie00(struct rtw89_dev *rtwdev, tmp_rpl =le32_get_bits (ie->w0,RTW89_PHY_STS_IE00_W0_RPL ); phy_ppdu->rpl_avg = tmp_rpl >>1 ; + +if (!phy_ppdu->hdr_2_en) + phy_ppdu->rx_path_en = +le32_get_bits (ie->w3,RTW89_PHY_STS_IE00_W3_RX_PATH_EN ); } static void rtw89_core_parse_phy_status_ie00_v2(struct rtw89_dev *rtwdev,
drivers/net/wireless/realtek/rtw89/txrx.h +1 -0
@@ -572,6 +572,7 @@ struct rtw89_phy_sts_ie00 { } __packed;#define RTW89_PHY_STS_IE00_W0_RPL GENMASK(15, 7) +#define RTW89_PHY_STS_IE00_W3_RX_PATH_EN GENMASK(31, 28)struct rtw89_phy_sts_ie00_v2 {__le32 w0;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 584/849 wifi: rtw89: renew a completion for each H2C command waiting C2H event
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zong-Zhe Yang <[email protected]>
[ Upstream commit bc2a5a12fa6259e190c7edb03e63b28ab480101b ]
Logically before a waiting side which has already timed out turns the atomic status back to idle, a completing side could still pass atomic condition and call complete. It will make the following H2C commands, waiting C2H events, get a completion unexpectedly early. Hence, renew a completion for each H2C command waiting a C2H event.
--- drivers/net/wireless/realtek/rtw89/core.c | 49 ++++++++++++++++++++--- drivers/net/wireless/realtek/rtw89/core.h | 10 ++++- drivers/net/wireless/realtek/rtw89/fw.c | 2 + 3 files changed, 53 insertions(+), 8 deletions(-)
drivers/net/wireless/realtek/rtw89/core.c +43 -6
@@ -4860,37 +4860,74 @@ void rtw89_core_csa_beacon_work(struct wiphy *wiphy, struct wiphy_work *work)int rtw89_wait_for_cond (struct rtw89_wait_info *wait,unsigned int cond) { -struct completion *cmpl = &wait->completion; +struct rtw89_wait_response *prep;unsigned long time_left;unsigned int cur; +int err =0 ; cur =atomic_cmpxchg (&wait->cond,RTW89_WAIT_COND_IDLE , cond);if (cur !=RTW89_WAIT_COND_IDLE )return -EBUSY ; - time_left =wait_for_completion_timeout (cmpl,RTW89_WAIT_FOR_COND_TIMEOUT ); + prep =kzalloc (sizeof (*prep),GFP_KERNEL ); +if (!prep) { + err = -ENOMEM ; + goto reset; + } + +init_completion (&prep->completion); + +rcu_assign_pointer (wait->resp, prep); + + time_left =wait_for_completion_timeout (&prep->completion, +RTW89_WAIT_FOR_COND_TIMEOUT );if (time_left ==0 ) { -atomic_set (&wait->cond,RTW89_WAIT_COND_IDLE ); -return -ETIMEDOUT ; + err = -ETIMEDOUT ; + goto cleanup; } + wait->data = prep->data; + +cleanup: +rcu_assign_pointer (wait->resp,NULL ); +kfree_rcu (prep, rcu_head); + +reset: +atomic_set (&wait->cond,RTW89_WAIT_COND_IDLE ); + +if (err) +return err; +if (wait->data.err)return -EFAULT ;return 0 ; } +static void rtw89_complete_cond_resp (struct rtw89_wait_response *resp, +const struct rtw89_completion_data *data) +{ + resp->data = *data; +complete (&resp->completion); +} +void rtw89_complete_cond (struct rtw89_wait_info *wait,unsigned int cond,const struct rtw89_completion_data *data) { +struct rtw89_wait_response *resp;unsigned int cur; +guard (rcu)(); + + resp =rcu_dereference (wait->resp); +if (!resp) +return ; + cur =atomic_cmpxchg (&wait->cond, cond,RTW89_WAIT_COND_IDLE );if (cur != cond)return ; - wait->data = *data; -complete (&wait->completion); +rtw89_complete_cond_resp (resp, data); }void rtw89_core_ntfy_btc_event (struct rtw89_dev *rtwdev,enum rtw89_btc_hmsg event)
drivers/net/wireless/realtek/rtw89/core.h +8 -2
@@ -4545,17 +4545,23 @@ struct rtw89_completion_data {u8 buf[RTW89_COMPLETION_BUF_SIZE ]; }; +struct rtw89_wait_response { +struct rcu_head rcu_head; +struct completion completion; +struct rtw89_completion_data data; +}; +struct rtw89_wait_info {atomic_t cond; -struct completion completion;struct rtw89_completion_data data; +struct rtw89_wait_response __rcu *resp; };#define RTW89_WAIT_FOR_COND_TIMEOUT msecs_to_jiffies(100)static inline void rtw89_init_wait (struct rtw89_wait_info *wait) { -init_completion (&wait->completion); +rcu_assign_pointer (wait->resp,NULL );atomic_set (&wait->cond,RTW89_WAIT_COND_IDLE ); }
drivers/net/wireless/realtek/rtw89/fw.c +2 -0
@@ -8679,6 +8679,8 @@ static int rtw89_h2c_tx_and_wait(struct rtw89_dev *rtwdev, struct sk_buff *skb, {int ret; +lockdep_assert_wiphy (rtwdev->hw->wiphy); + ret =rtw89_h2c_tx (rtwdev, skb, false);if (ret) {rtw89_err (rtwdev,"failed to send h2c\n" );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 585/849 usb: xhci-pci: add support for hosts with zero USB3 ports
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Neronin <[email protected]>
[ Upstream commit 719de070f764e079cdcb4ddeeb5b19b3ddddf9c1 ]
Add xhci support for PCI hosts that have zero USB3 ports. Avoid creating a shared Host Controller Driver (HCD) when there is only one root hub. Additionally, all references to 'xhci->shared_hcd' are now checked before use.
Only xhci-pci.c requires modification to accommodate this change, as the xhci core already supports configurations with zero USB3 ports. This capability was introduced when xHCI Platform and MediaTek added support for zero USB3 ports.
--- drivers/usb/host/xhci-pci.c | 42 +++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 18 deletions(-)
drivers/usb/host/xhci-pci.c +24 -18
@@ -610,7 +610,7 @@ int xhci_pci_common_probe(struct pci_dev *dev, const struct pci_device_id *id) {int retval;struct xhci_hcd *xhci; -struct usb_hcd *hcd; +struct usb_hcd *hcd, *usb3_hcd;struct reset_control *reset; reset =devm_reset_control_get_optional_exclusive (&dev->dev,NULL );
@@ -636,26 +636,32 @@ int xhci_pci_common_probe(struct pci_dev *dev, const struct pci_device_id *id) hcd =dev_get_drvdata (&dev->dev); xhci =hcd_to_xhci (hcd); xhci->reset = reset; - xhci->shared_hcd =usb_create_shared_hcd (&xhci_pci_hc_driver, &dev->dev, -pci_name (dev), hcd); -if (!xhci->shared_hcd) { - retval = -ENOMEM ; - goto dealloc_usb2_hcd; - } - retval =xhci_ext_cap_init (xhci); -if (retval) - goto put_usb3_hcd; + xhci->allow_single_roothub =1 ; +if (!xhci_has_one_roothub (xhci)) { + xhci->shared_hcd =usb_create_shared_hcd (&xhci_pci_hc_driver, &dev->dev, +pci_name (dev), hcd); +if (!xhci->shared_hcd) { + retval = -ENOMEM ; + goto dealloc_usb2_hcd; + } - retval =usb_add_hcd (xhci->shared_hcd, dev->irq, -IRQF_SHARED ); -if (retval) - goto put_usb3_hcd; -/* Roothub already marked as USB 3.0 speed */ + retval =xhci_ext_cap_init (xhci); +if (retval) + goto put_usb3_hcd; + + retval =usb_add_hcd (xhci->shared_hcd, dev->irq,IRQF_SHARED ); +if (retval) + goto put_usb3_hcd; + }else { + retval =xhci_ext_cap_init (xhci); +if (retval) + goto dealloc_usb2_hcd; + } -if (!(xhci->quirks &XHCI_BROKEN_STREAMS ) && -HCC_MAX_PSA (xhci->hcc_params) >=4 ) - xhci->shared_hcd->can_do_streams =1 ; + usb3_hcd =xhci_get_usb3_hcd (xhci); +if (usb3_hcd && !(xhci->quirks &XHCI_BROKEN_STREAMS ) &&HCC_MAX_PSA (xhci->hcc_params) >=4 ) + usb3_hcd->can_do_streams =1 ;/* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ pm_runtime_put_noidle (&dev->dev);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 586/849 ipv6: np->rxpmtu race annotation
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 9fba1eb39e2f74d2002c5cbcf1d4435d37a4f752 ]
Add READ_ONCE() annotations because np->rxpmtu can be changed while udpv6_recvmsg() and rawv6_recvmsg() read it.
Since this is a very rarely used feature, and that udpv6_recvmsg() and rawv6_recvmsg() read np->rxopt anyway, change the test order so that np->rxpmtu does not need to be in a hot cache line.
--- net/ipv6/raw.c | 2 +- net/ipv6/udp.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/ipv6/raw.c +1 -1
@@ -445,7 +445,7 @@ static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,if (flags &MSG_ERRQUEUE )return ipv6_recv_error (sk, msg, len, addr_len); -if (np->rxpmtu && np->rxopt.bits.rxpmtu) +if (np->rxopt.bits.rxpmtu &&READ_ONCE (np->rxpmtu))return ipv6_recv_rxpmtu (sk, msg, len, addr_len); skb =skb_recv_datagram (sk, flags, &err);
net/ipv6/udp.c +1 -1
@@ -479,7 +479,7 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,if (flags &MSG_ERRQUEUE )return ipv6_recv_error (sk, msg, len, addr_len); -if (np->rxpmtu && np->rxopt.bits.rxpmtu) +if (np->rxopt.bits.rxpmtu &&READ_ONCE (np->rxpmtu))return ipv6_recv_rxpmtu (sk, msg, len, addr_len); try_again:
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 587/849 RDMA/irdma: Update Kconfig
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tatyana Nikolova <[email protected]>
[ Upstream commit 060842fed53f77a73824c9147f51dc6746c1267a ]
Update Kconfig to add dependency on idpf module and add IPU E2000 to the list of supported devices.
--- drivers/infiniband/hw/irdma/Kconfig | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/infiniband/hw/irdma/Kconfig +4 -3
@@ -4,10 +4,11 @@ config INFINIBAND_IRDMA depends on INET depends on IPV6 || !IPV6 depends on PCI - depends on ICE && I40E + depends on IDPF && ICE && I40E select GENERIC_ALLOCATOR select AUXILIARY_BUS select CRC32 help - This is an Intel(R) Ethernet Protocol Driver for RDMA driver - that support E810 (iWARP/RoCE) and X722 (iWARP) network devices. + This is an Intel(R) Ethernet Protocol Driver for RDMA that + supports IPU E2000 (RoCEv2), E810 (iWARP/RoCEv2) and X722 (iWARP) + network devices.
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 588/849 IB/ipoib: Ignore L3 master device
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Dumitrescu <[email protected]>
[ Upstream commit 42f993d3439827c4959ea77e60620d7ebfb3a477 ]
Currently, all master upper netdevices (e.g., bond, VRF) are treated equally.
When a VRF netdevice is used over an IPoIB netdevice, the expected netdev resolution is on the lower IPoIB device which has the IP address assigned to it and not the VRF device.
The rdma_cm module (CMA) tries to match incoming requests to a particular netdevice. When successful, it also validates that the return path points to the same device by performing a routing table lookup. Currently, the former would resolve to the VRF netdevice, while the latter to the correct lower IPoIB netdevice, leading to failure in rdma_cm.
Improve this by ignoring the VRF master netdevice, if it exists, and instead return the lower IPoIB device.
--- drivers/infiniband/ulp/ipoib/ipoib_main.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
drivers/infiniband/ulp/ipoib/ipoib_main.c +11 -10
@@ -351,26 +351,27 @@ static bool ipoib_is_dev_match_addr_rcu(const struct sockaddr *addr, }/* -* Find the master net_device on top of the given net_device. +* Find the L2 master net_device on top of the given net_device. * @dev: base IPoIB net_device * -* Returns the master net_device with a reference held, or the same net_device -* if no master exists. +* Returns the L2 master net_device with reference held if the L2 master +* exists (such as bond netdevice), or returns same netdev with reference +* held when master does not exist or when L3 master (such as VRF netdev). */ static struct net_device *ipoib_get_master_net_dev (struct net_device *dev) {struct net_device *master;rcu_read_lock (); + master =netdev_master_upper_dev_get_rcu (dev); +if (!master ||netif_is_l3_master (master)) + master = dev; +dev_hold (master);rcu_read_unlock (); -if (master) -return master; - -dev_hold (dev); -return dev; +return master; }struct ipoib_walk_data {
@@ -522,7 +523,7 @@ static struct net_device *ipoib_get_net_dev_by_params(if (ret)return NULL ; -/* See if we can find a unique device matching the L2 parameters */ +/* See if we can find a unique device matching the pkey and GID */ matches =__ipoib_get_net_dev_by_params (dev_list, port, pkey_index, gid,NULL , &net_dev);
@@ -535,7 +536,7 @@ static struct net_device *ipoib_get_net_dev_by_params(dev_put (net_dev); -/* Couldn't find a unique device with L2 parameters only. Use L3 +/* Couldn't find a unique device with pkey and GID only. Use L3 * address to uniquely match the net device */ matches =__ipoib_get_net_dev_by_params (dev_list, port, pkey_index, gid, addr, &net_dev);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 589/849 bnxt_en: Add fw log trace support for 5731X/5741X chips
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shruti Parab <[email protected]>
[ Upstream commit ba1aefee2e9835fe6e07b86cb7020bd2550a81ee ]
These older chips now support the fw log traces via backing store qcaps_v2. No other backing store memory types are supported besides the fw trace types.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 9 +++++++-- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 ++- drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c | 3 ++- drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.h | 1 + 4 files changed, 12 insertions(+), 4 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +7 -2
@@ -265,6 +265,7 @@ const u16 bnxt_bstore_to_trace[] = { [BNXT_CTX_CA1] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_CA1_TRACE, [BNXT_CTX_CA2] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_CA2_TRACE, [BNXT_CTX_RIGP1] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_RIGP1_TRACE, + [BNXT_CTX_KONG] = DBG_LOG_BUFFER_FLUSH_REQ_TYPE_AFM_KONG_HWRM_TRACE, };static struct workqueue_struct *bnxt_pf_wq;
@@ -9155,7 +9156,7 @@ static int bnxt_backing_store_cfg_v2(struct bnxt *bp, u32 ena)int rc =0 ;u16 type; -for (type =BNXT_CTX_SRT ; type <=BNXT_CTX_RIGP1 ; type++) { +for (type =BNXT_CTX_SRT ; type <=BNXT_CTX_KONG ; type++) { ctxm = &ctx->ctx_arr[type];if (!bnxt_bs_trace_avail (bp, type))continue ;
@@ -9305,6 +9306,10 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp)if (!ctx || (ctx->flags &BNXT_CTX_FLAG_INITED ))return 0 ; + ena =0 ; +if (!(bp->flags &BNXT_FLAG_CHIP_P5_PLUS )) + goto skip_legacy; + ctxm = &ctx->ctx_arr[BNXT_CTX_QP ]; l2_qps = ctxm->qp_l2_entries; qp1_qps = ctxm->qp_qp1_entries;
@@ -9313,7 +9318,6 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp) ctxm = &ctx->ctx_arr[BNXT_CTX_SRQ ]; srqs = ctxm->srq_l2_entries; max_srqs = ctxm->max_entries; - ena =0 ;if ((bp->flags &BNXT_FLAG_ROCE_CAP ) && !is_kdump_kernel ()) { pg_lvl =2 ;if (BNXT_SW_RES_LMT (bp)) {
@@ -9407,6 +9411,7 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp) ena |=FUNC_BACKING_STORE_CFG_REQ_ENABLES_TQM_SP << i; ena |=FUNC_BACKING_STORE_CFG_REQ_DFLT_ENABLES ; +skip_legacy:if (bp->fw_cap &BNXT_FW_CAP_BACKING_STORE_V2 ) rc =bnxt_backing_store_cfg_v2 (bp, ena);else
drivers/net/ethernet/broadcom/bnxt/bnxt.h +2 -1
@@ -1968,10 +1968,11 @@ struct bnxt_ctx_mem_type {#define BNXT_CTX_CA1 FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CA1_TRACE#define BNXT_CTX_CA2 FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CA2_TRACE#define BNXT_CTX_RIGP1 FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_RIGP1_TRACE +#define BNXT_CTX_KONG FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_AFM_KONG_HWRM_TRACE#define BNXT_CTX_MAX (BNXT_CTX_TIM + 1)#define BNXT_CTX_L2_MAX (BNXT_CTX_FTQM + 1) -#define BNXT_CTX_V2_MAX (BNXT_CTX_RIGP1 + 1) +#define BNXT_CTX_V2_MAX (BNXT_CTX_KONG + 1)#define BNXT_CTX_INV ((u16)-1)struct bnxt_ctx_mem_info {
drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c +2 -1
@@ -36,6 +36,7 @@ static const u16 bnxt_bstore_to_seg_id[] = { [BNXT_CTX_CA1] = BNXT_CTX_MEM_SEG_CA1, [BNXT_CTX_CA2] = BNXT_CTX_MEM_SEG_CA2, [BNXT_CTX_RIGP1] = BNXT_CTX_MEM_SEG_RIGP1, + [BNXT_CTX_KONG] = BNXT_CTX_MEM_SEG_KONG, }; static int bnxt_dbg_hwrm_log_buffer_flush(struct bnxt *bp, u16 type, u32 flags,
@@ -359,7 +360,7 @@ static u32 bnxt_get_ctx_coredump(struct bnxt *bp, void *buf, u32 offset,if (buf) buf += offset; -for (type =0 ; type <=BNXT_CTX_RIGP1 ; type++) { +for (type =0 ; type <=BNXT_CTX_KONG ; type++) {struct bnxt_ctx_mem_type *ctxm = &ctx->ctx_arr[type];bool trace =bnxt_bs_trace_avail (bp, type);u32 seg_id = bnxt_bstore_to_seg_id[type];
drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.h +1 -0
@@ -102,6 +102,7 @@ struct bnxt_driver_segment_record {#define BNXT_CTX_MEM_SEG_CA1 0x9#define BNXT_CTX_MEM_SEG_CA2 0xa#define BNXT_CTX_MEM_SEG_RIGP1 0xb +#define BNXT_CTX_MEM_SEG_KONG 0xd#define BNXT_CRASH_DUMP_LEN (8 << 20)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 590/849 jfs: Verify inode mode when loading from disk
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 7a5aa54fba2bd591b22b9b624e6baa9037276986 ]
The inode mode loaded from corrupted disk can be invalid. Do like what commit 0a9e74051313 ("isofs: Verify inode mode when loading from disk") does.
--- fs/jfs/inode.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
fs/jfs/inode.c +7 -1
@@ -59,9 +59,15 @@ struct inode *jfs_iget(struct super_block *sb, unsigned long ino)*/ inode->i_link[inode->i_size] ='\0' ; } - }else { + }else if (S_ISCHR (inode->i_mode) ||S_ISBLK (inode->i_mode) || +S_ISFIFO (inode->i_mode) ||S_ISSOCK (inode->i_mode)) { inode->i_op = &jfs_file_inode_operations;init_special_inode (inode, inode->i_mode, inode->i_rdev); + }else { +printk (KERN_DEBUG "JFS: Invalid file type 0%04o for inode %lu.\n" , + inode->i_mode, inode->i_ino); +iget_failed (inode); +return ERR_PTR (-EIO ); }unlock_new_inode (inode);return inode;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 591/849 jfs: fix uninitialized waitqueue in transaction manager
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shaurya Rane <[email protected]>
[ Upstream commit 300b072df72694ea330c4c673c035253e07827b8 ]
The transaction manager initialization in txInit() was not properly initializing TxBlock[0].waitor waitqueue, causing a crash when txEnd(0) is called on read-only filesystems.
When a filesystem is mounted read-only, txBegin() returns tid=0 to indicate no transaction. However, txEnd(0) still gets called and tries to access TxBlock[0].waitor via tid_to_tblock(0), but this waitqueue was never initialized because the initialization loop started at index 1 instead of 0.
This causes a 'non-static key' lockdep warning and system crash:
INFO: trying to register non-static key in txEnd
Fix by ensuring all transaction blocks including TxBlock[0] have their waitqueues properly initialized during txInit().
--- fs/jfs/jfs_txnmgr.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
fs/jfs/jfs_txnmgr.c +5 -4
@@ -272,14 +272,15 @@ int txInit(void)if (TxBlock ==NULL )return -ENOMEM ; -for (k =1 ; k < nTxBlock -1 ; k++) { - TxBlock[k].next = k +1 ; +for (k =0 ; k < nTxBlock; k++) {init_waitqueue_head (&TxBlock[k].gcwait);init_waitqueue_head (&TxBlock[k].waitor); } + +for (k =1 ; k < nTxBlock -1 ; k++) { + TxBlock[k].next = k +1 ; + } TxBlock[k].next =0 ; -init_waitqueue_head (&TxBlock[k].gcwait); -init_waitqueue_head (&TxBlock[k].waitor); TxAnchor.freetid =1 ;init_waitqueue_head (&TxAnchor.freewait);
Signature · 1 line
2.51.0
syzbot
syzbotRe: [PATCH 6.17 591/849] jfs: fix uninitialized waitqueue in transaction manager
I see the command but can't find the corresponding bug. The email is sent to [email protected] address but the HASH does not correspond to any known bug. Please double check the…
Quoted 62 lines
6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shaurya Rane <[email protected]>
[ Upstream commit
300b072df72694ea330c4c673c035253e07827b8]The transaction manager initialization in
txInit()was not properly initializing TxBlock[0].waitor waitqueue, causing a crash when txEnd(0) is called on read-only filesystems.When a filesystem is mounted read-only,
txBegin()returns tid=0 to indicate no transaction. However, txEnd(0) still gets called and tries to access TxBlock[0].waitor viatid_to_tblock(0), but this waitqueue was never initialized because the initialization loop started at index 1 instead of 0.This causes a 'non-static key' lockdep warning and system crash:
INFO: trying to register non-static key in txEndFix by ensuring all transaction blocks including TxBlock[0] have their waitqueues properly initialized during
txInit().Reported-by [email protected]Signed-off-by Shaurya Rane <[email protected]>Signed-off-by Dave Kleikamp <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- fs/jfs/jfs_txnmgr.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)fs/jfs/jfs_txnmgr.c +5
-4@@ -272,14 +272,15 @@ int txInit(void)if (TxBlock ==NULL )return -ENOMEM ; -for (k =1 ; k < nTxBlock -1 ; k++) { - TxBlock[k].next = k +1 ; +for (k =0 ; k < nTxBlock; k++) {init_waitqueue_head (&TxBlock[k].gcwait);init_waitqueue_head (&TxBlock[k].waitor); } + +for (k =1 ; k < nTxBlock -1 ; k++) { + TxBlock[k].next = k +1 ; + } TxBlock[k].next =0 ; -init_waitqueue_head (&TxBlock[k].gcwait); -init_waitqueue_head (&TxBlock[k].waitor); TxAnchor.freetid =1 ;init_waitqueue_head (&TxAnchor.freewait);Signature · 1 line
2.51.0
I see the command but can't find the corresponding bug. The email is sent to [email protected] address but the HASH does not correspond to any known bug. Please double check the address.
Greg Kroah-Hartman
maintainerPATCH 592/849 mei: make a local copy of client uuid in connect
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Usyskin <[email protected]>
[ Upstream commit bb29fc32ae56393269d8fe775159fd59e45682d1 ]
Connect ioctl has the same memory for in and out parameters. Copy in parameter (client uuid) to the local stack to avoid it be overwritten by out parameters fill.
--- drivers/misc/mei/main.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/misc/mei/main.c +9 -9
@@ -641,7 +641,7 @@ static long mei_ioctl(struct file *file, unsigned int cmd, unsigned long data)struct mei_cl *cl = file->private_data;struct mei_connect_client_data conn;struct mei_connect_client_data_vtag conn_vtag; -const uuid_le *cl_uuid; +uuid_le cl_uuid;struct mei_client *props;u8 vtag;u32 notify_get, notify_req;
@@ -669,18 +669,18 @@ static long mei_ioctl(struct file *file, unsigned int cmd, unsigned long data) rets = -EFAULT ; goto out; } - cl_uuid = &conn.in_client_uuid; + cl_uuid = conn.in_client_uuid; props = &conn.out_client_properties; vtag =0 ; - rets =mei_vt_support_check (dev, cl_uuid); + rets =mei_vt_support_check (dev, &cl_uuid);if (rets == -ENOTTY ) goto out;if (!rets) - rets =mei_ioctl_connect_vtag (file, cl_uuid, props, + rets =mei_ioctl_connect_vtag (file, &cl_uuid, props, vtag);else - rets =mei_ioctl_connect_client (file, cl_uuid, props); + rets =mei_ioctl_connect_client (file, &cl_uuid, props);if (rets) goto out;
@@ -702,14 +702,14 @@ static long mei_ioctl(struct file *file, unsigned int cmd, unsigned long data) goto out; } - cl_uuid = &conn_vtag.connect.in_client_uuid; + cl_uuid = conn_vtag.connect.in_client_uuid; props = &conn_vtag.out_client_properties; vtag = conn_vtag.connect.vtag; - rets =mei_vt_support_check (dev, cl_uuid); + rets =mei_vt_support_check (dev, &cl_uuid);if (rets == -EOPNOTSUPP )cl_dbg (dev, cl,"FW Client %pUl does not support vtags\n" , - cl_uuid); + &cl_uuid);if (rets) goto out;
@@ -719,7 +719,7 @@ static long mei_ioctl(struct file *file, unsigned int cmd, unsigned long data) goto out; } - rets =mei_ioctl_connect_vtag (file, cl_uuid, props, vtag); + rets =mei_ioctl_connect_vtag (file, &cl_uuid, props, vtag);if (rets) goto out;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 593/849 drm/amdgpu/atom: Check kcalloc() for WS buffer in amdgpu_atom_execute_table_locked()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guangshuo Li <[email protected]>
[ Upstream commit cc9a8e238e42c1f43b98c097995137d644b69245 ]
kcalloc() may fail. When WS is non-zero and allocation fails, ectx.ws remains NULL while ectx.ws_size is set, leading to a potential NULL pointer dereference in atom_get_src_int() when accessing WS entries.
Return -ENOMEM on allocation failure to avoid the NULL dereference.
--- drivers/gpu/drm/amd/amdgpu/atom.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/amd/amdgpu/atom.c +4 -0
@@ -1246,6 +1246,10 @@ static int amdgpu_atom_execute_table_locked(struct atom_context *ctx, int index, ectx.last_jump_jiffies =0 ;if (ws) { ectx.ws =kcalloc (4 , ws,GFP_KERNEL ); +if (!ectx.ws) { + ret = -ENOMEM ; + goto free; + } ectx.ws_size = ws; }else { ectx.ws =NULL ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 594/849 ASoC: qcom: sc8280xp: explicitly set S16LE format in sc8280xp_be_hw_params_fixup()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Klimov <[email protected]>
[ Upstream commit 9565c9d53c5b440f0dde6fa731a99c1b14d879d2 ]
Setting format to s16le is required for compressed playback on compatible soundcards.
--- sound/soc/qcom/sc8280xp.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/qcom/sc8280xp.c +3 -0
@@ -7,6 +7,7 @@#include <sound/soc.h> #include <sound/soc-dapm.h> #include <sound/pcm.h> +#include <sound/pcm_params.h> #include <linux/soundwire/sdw.h> #include <sound/jack.h> #include <linux/input-event-codes.h>
@@ -86,8 +87,10 @@ static int sc8280xp_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, SNDRV_PCM_HW_PARAM_RATE);struct snd_interval *channels =hw_param_interval (params,SNDRV_PCM_HW_PARAM_CHANNELS ); +struct snd_mask *fmt =hw_param_mask (params,SNDRV_PCM_HW_PARAM_FORMAT ); rate->min = rate->max =48000 ; +snd_mask_set_format (fmt,SNDRV_PCM_FORMAT_S16_LE ); channels->min =2 ; channels->max =2 ;switch (cpu_dai->id) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 595/849 net: phy: clear link parameters on admin link down
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
[ Upstream commit 60f887b1290b43a4f5a3497982a725687b193fa4 ]
When a PHY is halted (e.g. ip link set dev lan2 down), several fields in struct phy_device may still reflect the last active connection. This leads to ethtool showing stale values even though the link is down.
Reset selected fields in _phy_state_machine() when transitioning to PHY_HALTED and the link was previously up:
- speed/duplex -> UNKNOWN, but only in autoneg mode (in forced mode these fields carry configuration, not status)
- master_slave_state -> UNKNOWN if previously supported
- mdix -> INVALID (state only, same meaning as "unknown")
- lp_advertising -> always cleared
The cleanup is skipped if the PHY is in PHY_ERROR state, so the last values remain available for diagnostics.
--- drivers/net/phy/phy.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/net/phy/phy.c +13 -0
@@ -1548,6 +1548,19 @@ static enum phy_state_work _phy_state_machine(struct phy_device *phydev) }break ;case PHY_HALTED : +if (phydev->link) { +if (phydev->autoneg ==AUTONEG_ENABLE ) { + phydev->speed =SPEED_UNKNOWN ; + phydev->duplex =DUPLEX_UNKNOWN ; + } +if (phydev->master_slave_state != +MASTER_SLAVE_STATE_UNSUPPORTED ) + phydev->master_slave_state = +MASTER_SLAVE_STATE_UNKNOWN ; + phydev->mdix =ETH_TP_MDI_INVALID ; +linkmode_zero (phydev->lp_advertising); + } + fallthrough;case PHY_ERROR :if (phydev->link) { phydev->link =0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 596/849 net: ethernet: microchip: sparx5: make it selectable for ARCH_LAN969X
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Marko <[email protected]>
[ Upstream commit 6287982aa54946449bccff3e6488d3a15e458392 ]
LAN969x switchdev support depends on the SparX-5 core,so make it selectable for ARCH_LAN969X.
--- drivers/net/ethernet/microchip/sparx5/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/microchip/sparx5/Kconfig +1 -1
@@ -3,7 +3,7 @@ config SPARX5_SWITCH depends on NET_SWITCHDEV depends on HAS_IOMEM depends on OF - depends on ARCH_SPARX5 || COMPILE_TEST + depends on ARCH_SPARX5 || ARCH_LAN969X || COMPILE_TEST depends on PTP_1588_CLOCK_OPTIONAL depends on BRIDGE || BRIDGE=n select PHYLINK
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 597/849 bus: mhi: core: Improve mhi_sync_power_up handling for SYS_ERR state
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vivek Pernamitta <[email protected]>
[ Upstream commit aa1a0e93ed21a06acb7ca9d4a4a9fce75ea53d0c ]
Allow mhi_sync_power_up to handle SYS_ERR during power-up, reboot, or recovery. This is to avoid premature exit when MHI_PM_IN_ERROR_STATE is observed during above mentioned system states.
To achieve this, treat SYS_ERR as a valid state and let its handler process the error and queue the next transition to Mission Mode instead of aborting early.
--- drivers/bus/mhi/host/internal.h | 2 ++ drivers/bus/mhi/host/pm.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/bus/mhi/host/internal.h +2 -0
@@ -170,6 +170,8 @@ enum mhi_pm_state { MHI_PM_IN_ERROR_STATE(pm_state))#define MHI_PM_IN_SUSPEND_STATE (pm_state) (pm_state & \ (MHI_PM_M3_ENTER | MHI_PM_M3)) +#define MHI_PM_FATAL_ERROR (pm_state) ((pm_state == MHI_PM_FW_DL_ERR) || \ + (pm_state >= MHI_PM_SYS_ERR_FAIL))#define NR_OF_CMD_RINGS 1#define CMD_EL_PER_RING 128
drivers/bus/mhi/host/pm.c +1 -1
@@ -1279,7 +1279,7 @@ int mhi_sync_power_up(struct mhi_controller *mhi_cntrl) mhi_cntrl->ready_timeout_ms : mhi_cntrl->timeout_ms;wait_event_timeout (mhi_cntrl->state_event,MHI_IN_MISSION_MODE (mhi_cntrl->ee) || -MHI_PM_IN_ERROR_STATE (mhi_cntrl->pm_state), +MHI_PM_FATAL_ERROR (mhi_cntrl->pm_state),msecs_to_jiffies (timeout_ms)); ret = (MHI_IN_MISSION_MODE (mhi_cntrl->ee)) ?0 : -ETIMEDOUT ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 598/849 iommu/vt-d: Replace snprintf with scnprintf in dmar_latency_snapshot()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Seyediman Seyedarab <[email protected]>
[ Upstream commit 75c02a037609f34db17e91be195cedb33b61bae0 ]
snprintf() returns the number of bytes that would have been written, not the number actually written. Using this for offset tracking can cause buffer overruns if truncation occurs.
Replace snprintf() with scnprintf() to ensure the offset stays within bounds.
Since scnprintf() never returns a negative value, and zero is not possible in this context because 'bytes' starts at 0 and 'size - bytes' is DEBUG_BUFFER_SIZE in the first call, which is large enough to hold the string literals used, the return value is always positive. An integer overflow is also completely out of reach here due to the small and fixed buffer size. The error check in latency_show_one() is therefore unnecessary. Remove it and make dmar_latency_snapshot() return void.
--- drivers/iommu/intel/debugfs.c | 10 ++-------- drivers/iommu/intel/perf.c | 10 ++++------ drivers/iommu/intel/perf.h | 5 ++--- 3 files changed, 8 insertions(+), 17 deletions(-)
drivers/iommu/intel/debugfs.c +2 -8
@@ -661,17 +661,11 @@ DEFINE_SHOW_ATTRIBUTE(ir_translation_struct);static void latency_show_one (struct seq_file *m,struct intel_iommu *iommu,struct dmar_drhd_unit *drhd) { -int ret; -seq_printf (m,"IOMMU: %s Register Base Address: %llx\n" , iommu->name, drhd->reg_base_addr); - ret =dmar_latency_snapshot (iommu, debug_buf,DEBUG_BUFFER_SIZE ); -if (ret <0 ) -seq_puts (m,"Failed to get latency snapshot" ); -else -seq_puts (m, debug_buf); -seq_puts (m,"\n" ); +dmar_latency_snapshot (iommu, debug_buf,DEBUG_BUFFER_SIZE ); +seq_printf (m,"%s\n" , debug_buf); }static int latency_show (struct seq_file *m,void *v)
drivers/iommu/intel/perf.c +4 -6
@@ -113,7 +113,7 @@ static char *latency_type_names[] = { " svm_prq" }; -int dmar_latency_snapshot (struct intel_iommu *iommu,char *str,size_t size) +void dmar_latency_snapshot (struct intel_iommu *iommu,char *str,size_t size) {struct latency_statistic *lstat = iommu->perf_statistic;unsigned long flags;
@@ -122,7 +122,7 @@ int dmar_latency_snapshot(struct intel_iommu *iommu, char *str, size_t size)memset (str,0 , size);for (i =0 ; i <COUNTS_NUM ; i++) - bytes +=snprintf (str + bytes, size - bytes, + bytes +=scnprintf (str + bytes, size - bytes,"%s" , latency_counter_names[i]);spin_lock_irqsave (&latency_lock, flags);
@@ -130,7 +130,7 @@ int dmar_latency_snapshot(struct intel_iommu *iommu, char *str, size_t size)if (!dmar_latency_enabled (iommu, i))continue ; - bytes +=snprintf (str + bytes, size - bytes, + bytes +=scnprintf (str + bytes, size - bytes,"\n%s" , latency_type_names[i]);for (j =0 ; j <COUNTS_NUM ; j++) {
@@ -156,11 +156,9 @@ int dmar_latency_snapshot(struct intel_iommu *iommu, char *str, size_t size)break ; } - bytes +=snprintf (str + bytes, size - bytes, + bytes +=scnprintf (str + bytes, size - bytes,"%12lld" , val); } }spin_unlock_irqrestore (&latency_lock, flags); - -return bytes; }
drivers/iommu/intel/perf.h +2 -3
@@ -40,7 +40,7 @@ void dmar_latency_disable(struct intel_iommu *iommu, enum latency_type type);bool dmar_latency_enabled (struct intel_iommu *iommu,enum latency_type type);void dmar_latency_update (struct intel_iommu *iommu,enum latency_type type,u64 latency); -int dmar_latency_snapshot (struct intel_iommu *iommu,char *str,size_t size); +void dmar_latency_snapshot (struct intel_iommu *iommu,char *str,size_t size);#else static inline int dmar_latency_enable (struct intel_iommu *iommu,enum latency_type type)
@@ -64,9 +64,8 @@ dmar_latency_update(struct intel_iommu *iommu, enum latency_type type, u64 laten { } -static inline int +static inline void dmar_latency_snapshot (struct intel_iommu *iommu,char *str,size_t size) { -return 0 ; }#endif /* CONFIG_DMAR_PERF */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 599/849 wifi: ath10k: Fix connection after GTK rekeying
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 487e8a8c3421df0af3707e54c7e069f1d89cbda7 ]
It appears that not all hardware/firmware implementations support group key deletion correctly, which can lead to connection hangs and deauthentication following GTK rekeying (delete and install).
To avoid this issue, instead of attempting to delete the key using the special WMI_CIPHER_NONE value, we now replace the key with an invalid (random) value.
This behavior has been observed with WCN39xx chipsets.
Tested-on: WCN3990 hw1.0 WLAN.HL.3.3.7.c2-00931-QCAHLSWMTPLZ-1
--- drivers/net/wireless/ath/ath10k/mac.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/net/wireless/ath/ath10k/mac.c +10 -2
@@ -16,6 +16,7 @@#include <linux/acpi.h> #include <linux/of.h> #include <linux/bitfield.h> +#include <linux/random.h> #include "hif.h" #include "core.h"
@@ -290,8 +291,15 @@ static int ath10k_send_key(struct ath10k_vif *arvif, key->flags |=IEEE80211_KEY_FLAG_GENERATE_IV ;if (cmd ==DISABLE_KEY ) { - arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE ]; - arg.key_data =NULL ; +if (flags &WMI_KEY_GROUP ) { +/* Not all hardware handles group-key deletion operation +* correctly. Replace the key with a junk value to invalidate it. +*/ +get_random_bytes (key->key, key->keylen); + }else { + arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE ]; + arg.key_data =NULL ; + } }return ath10k_wmi_vdev_install_key (arvif->ar, &arg);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 600/849 iommu/vt-d: Remove LPIG from page group response descriptor
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lu Baolu <[email protected]>
[ Upstream commit 4402e8f39d0bfff5c0a5edb5e1afe27a56545e11 ]
Bit 66 in the page group response descriptor used to be the LPIG (Last Page in Group), but it was marked as Reserved since Specification 4.0. Remove programming on this bit to make it consistent with the latest specification.
Existing hardware all treats bit 66 of the page group response descriptor as "ignored", therefore this change doesn't break any existing hardware.
--- drivers/iommu/intel/iommu.h | 1 - drivers/iommu/intel/prq.c | 7 ++----- 2 files changed, 2 insertions(+), 6 deletions(-)
drivers/iommu/intel/iommu.h +0 -1
@@ -462,7 +462,6 @@ enum {#define QI_PGRP_PASID (pasid) (((u64)(pasid)) << 32)/* Page group response descriptor QW1 */ -#define QI_PGRP_LPIG (x) (((u64)(x)) << 2)#define QI_PGRP_IDX (idx) (((u64)(idx)) << 3)
drivers/iommu/intel/prq.c +2 -5
@@ -151,8 +151,7 @@ static void handle_bad_prq_event(struct intel_iommu *iommu,QI_PGRP_PASID_P (req->pasid_present) |QI_PGRP_RESP_CODE (result) |QI_PGRP_RESP_TYPE ; - desc.qw1 =QI_PGRP_IDX (req->prg_index) | -QI_PGRP_LPIG (req->lpig); + desc.qw1 =QI_PGRP_IDX (req->prg_index);qi_submit_sync (iommu, &desc,1 ,0 ); }
@@ -379,19 +378,17 @@ void intel_iommu_page_response(struct device *dev, struct iopf_fault *evt,struct iommu_fault_page_request *prm;struct qi_desc desc;bool pasid_present; -bool last_page;u16 sid; prm = &evt->fault.prm; sid =PCI_DEVID (bus, devfn); pasid_present = prm->flags &IOMMU_FAULT_PAGE_REQUEST_PASID_VALID ; - last_page = prm->flags &IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE ; desc.qw0 =QI_PGRP_PASID (prm->pasid) |QI_PGRP_DID (sid) |QI_PGRP_PASID_P (pasid_present) |QI_PGRP_RESP_CODE (msg->code) |QI_PGRP_RESP_TYPE ; - desc.qw1 =QI_PGRP_IDX (prm->grpid) |QI_PGRP_LPIG (last_page); + desc.qw1 =QI_PGRP_IDX (prm->grpid); desc.qw2 =0 ; desc.qw3 =0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 601/849 wifi: mac80211: Get the correct interface for non-netdev skb status
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 c7b5355b37a59c927b2374e9f783acd004d00960 ]
The function ieee80211_sdata_from_skb() always returned the P2P Device interface in case the skb was not associated with a netdev and didn't consider the possibility that an NAN Device interface is also enabled.
To support configurations where both P2P Device and a NAN Device interface are active, extend the function to match the correct interface based on address 2 in the 802.11 MAC header.
Since the 'p2p_sdata' field in struct ieee80211_local is no longer needed, remove it.
--- net/mac80211/ieee80211_i.h | 2 -- net/mac80211/iface.c | 16 +--------------- net/mac80211/status.c | 21 +++++++++++++++++++-- 3 files changed, 20 insertions(+), 19 deletions(-)
net/mac80211/ieee80211_i.h +0 -2
@@ -1665,8 +1665,6 @@ struct ieee80211_local {struct idr ack_status_frames;spinlock_t ack_status_lock; -struct ieee80211_sub_if_data __rcu *p2p_sdata; -/* virtual monitor interface */ struct ieee80211_sub_if_data __rcu *monitor_sdata;struct ieee80211_chan_req monitor_chanreq;
net/mac80211/iface.c +1 -15
@@ -611,10 +611,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_dospin_unlock_bh (&sdata->u.nan.func_lock);break ; -case NL80211_IFTYPE_P2P_DEVICE : -/* relies on synchronize_rcu() below */ -RCU_INIT_POINTER (local->p2p_sdata,NULL ); - fallthrough;default :wiphy_work_cancel (sdata->local->hw.wiphy, &sdata->work);/*
@@ -1405,6 +1401,7 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)ieee80211_recalc_idle (local);netif_carrier_on (dev); +list_add_tail_rcu (&sdata->u.mntr.list, &local->mon_list);break ;default :if (coming_up) {
@@ -1468,17 +1465,6 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up) sdata->vif.type != NL80211_IFTYPE_STATION); } -switch (sdata->vif.type) { -case NL80211_IFTYPE_P2P_DEVICE : -rcu_assign_pointer (local->p2p_sdata, sdata); -break ; -case NL80211_IFTYPE_MONITOR : -list_add_tail_rcu (&sdata->u.mntr.list, &local->mon_list); -break ; -default : -break ; - } -/* * set_multicast_list will be invoked by the networking core * which will check whether any increments here were done in
net/mac80211/status.c +19 -2
@@ -5,7 +5,7 @@* Copyright 2006-2007 Jiri Benc <[email protected]> * Copyright 2008-2010 Johannes Berg <[email protected]> * Copyright 2013-2014 Intel Mobile Communications GmbH -* Copyright 2021-2024 Intel Corporation +* Copyright 2021-2025 Intel Corporation */ #include <linux/export.h>
@@ -572,6 +572,7 @@ static struct ieee80211_sub_if_data * ieee80211_sdata_from_skb(struct ieee80211_local *local, struct sk_buff *skb) { struct ieee80211_sub_if_data *sdata; +struct ieee80211_hdr *hdr = (void *)skb->data;if (skb->dev) {list_for_each_entry_rcu (sdata, &local->interfaces, list) {
@@ -585,7 +586,23 @@ ieee80211_sdata_from_skb(struct ieee80211_local *local, struct sk_buff *skb)return NULL ; } -return rcu_dereference (local->p2p_sdata); +list_for_each_entry_rcu (sdata, &local->interfaces, list) { +switch (sdata->vif.type) { +case NL80211_IFTYPE_P2P_DEVICE : +break ; +case NL80211_IFTYPE_NAN : +if (sdata->u.nan.started) +break ; + fallthrough; +default : +continue ; + } + +if (ether_addr_equal (sdata->vif.addr, hdr->addr2)) +return sdata; + } + +return NULL ; } static void ieee80211_report_ack_skb(struct ieee80211_local *local,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 602/849 wifi: mac80211: Track NAN interface start/stop
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 8f79d2f13dd3b0af00a5303d4ff913767dd7684e ]
In case that NAN is started, mark the device as non idle, and set LED triggering similar to scan and ROC. Set the device to idle once NAN is stopped.
--- net/mac80211/cfg.c | 20 +++++++++++++++++--- net/mac80211/ieee80211_i.h | 2 ++ net/mac80211/iface.c | 9 +++++++++ 3 files changed, 28 insertions(+), 3 deletions(-)
net/mac80211/cfg.c +17 -3
@@ -320,6 +320,9 @@ static int ieee80211_start_nan(struct wiphy *wiphy,lockdep_assert_wiphy (sdata->local->hw.wiphy); +if (sdata->u.nan.started) +return -EALREADY ; + ret =ieee80211_check_combinations (sdata,NULL ,0 ,0 ,-1 );if (ret <0 )return ret;
@@ -329,12 +332,18 @@ static int ieee80211_start_nan(struct wiphy *wiphy,return ret; ret =drv_start_nan (sdata->local, sdata, conf); -if (ret) +if (ret) {ieee80211_sdata_stop (sdata); +return ret; + } - sdata->u.nan.conf = *conf; + sdata->u.nan.started = true; +ieee80211_recalc_idle (sdata->local); -return ret; + sdata->u.nan.conf.master_pref = conf->master_pref; + sdata->u.nan.conf.bands = conf->bands; + +return 0 ; } static void ieee80211_stop_nan(struct wiphy *wiphy,
@@ -342,8 +351,13 @@ static void ieee80211_stop_nan(struct wiphy *wiphy, {struct ieee80211_sub_if_data *sdata =IEEE80211_WDEV_TO_SUB_IF (wdev); +if (!sdata->u.nan.started) +return ; +drv_stop_nan (sdata->local, sdata); + sdata->u.nan.started = false;ieee80211_sdata_stop (sdata); +ieee80211_recalc_idle (sdata->local); } static int ieee80211_nan_change_conf(struct wiphy *wiphy,
net/mac80211/ieee80211_i.h +2 -0
@@ -977,11 +977,13 @@ struct ieee80211_if_mntr {* struct ieee80211_if_nan - NAN state * * @conf: current NAN configuration +* @started: true iff NAN is started * @func_lock: lock for @func_inst_ids * @function_inst_ids: a bitmap of available instance_id's */ struct ieee80211_if_nan {struct cfg80211_nan_conf conf; +bool started;/* protects function_inst_ids */ spinlock_t func_lock;
net/mac80211/iface.c +9 -0
@@ -107,6 +107,7 @@ static u32 __ieee80211_recalc_idle(struct ieee80211_local *local, {bool working, scanning, active;unsigned int led_trig_start =0 , led_trig_stop =0 ; +struct ieee80211_sub_if_data *iter;lockdep_assert_wiphy (local->hw.wiphy);
@@ -117,6 +118,14 @@ static u32 __ieee80211_recalc_idle(struct ieee80211_local *local, working = !local->ops->remain_on_channel && !list_empty (&local->roc_list); +list_for_each_entry (iter, &local->interfaces, list) { +if (iter->vif.type ==NL80211_IFTYPE_NAN && + iter->u.nan.started) { + working = true; +break ; + } + } + scanning =test_bit (SCAN_SW_SCANNING , &local->scanning) ||test_bit (SCAN_ONCHANNEL_SCANNING , &local->scanning);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 603/849 net: intel: fm10k: Fix parameter idx set but not used
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brahmajit Das <[email protected]>
[ Upstream commit 99e9c5ffbbee0f258a1da4eadf602b943f8c8300 ]
Variable idx is set in the loop, but is never used resulting in dead code. Building with GCC 16, which enables -Werror=unused-but-set-parameter= by default results in build error. This patch removes the idx parameter, since all the callers of the fm10k_unbind_hw_stats_q as 0 as idx anyways.
--- drivers/net/ethernet/intel/fm10k/fm10k_common.c | 5 ++--- drivers/net/ethernet/intel/fm10k/fm10k_common.h | 2 +- drivers/net/ethernet/intel/fm10k/fm10k_pf.c | 2 +- drivers/net/ethernet/intel/fm10k/fm10k_vf.c | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/fm10k/fm10k_common.c +2 -3
@@ -447,17 +447,16 @@ void fm10k_update_hw_stats_q(struct fm10k_hw *hw, struct fm10k_hw_stats_q *q,/** * fm10k_unbind_hw_stats_q - Unbind the queue counters from their queues * @q: pointer to the ring of hardware statistics queue -* @idx: index pointing to the start of the ring iteration * @count: number of queues to iterate over * * Function invalidates the index values for the queues so any updates that * may have happened are ignored and the base for the queue stats is reset. **/ -void fm10k_unbind_hw_stats_q (struct fm10k_hw_stats_q *q,u32 idx,u32 count) +void fm10k_unbind_hw_stats_q (struct fm10k_hw_stats_q *q,u32 count) {u32 i; -for (i =0 ; i < count; i++, idx++, q++) { +for (i =0 ; i < count; i++, q++) { q->rx_stats_idx =0 ; q->tx_stats_idx =0 ; }
drivers/net/ethernet/intel/fm10k/fm10k_common.h +1 -1
@@ -43,6 +43,6 @@ u32 fm10k_read_hw_stats_32b(struct fm10k_hw *hw, u32 addr,void fm10k_update_hw_stats_q (struct fm10k_hw *hw,struct fm10k_hw_stats_q *q,u32 idx,u32 count);#define fm10k_unbind_hw_stats_32b (s) ((s)->base_h = 0) -void fm10k_unbind_hw_stats_q (struct fm10k_hw_stats_q *q,u32 idx,u32 count); +void fm10k_unbind_hw_stats_q (struct fm10k_hw_stats_q *q,u32 count);s32 fm10k_get_host_state_generic (struct fm10k_hw *hw,bool *host_ready);#endif /* _FM10K_COMMON_H_ */
drivers/net/ethernet/intel/fm10k/fm10k_pf.c +1 -1
@@ -1389,7 +1389,7 @@ static void fm10k_rebind_hw_stats_pf(struct fm10k_hw *hw,fm10k_unbind_hw_stats_32b (&stats->nodesc_drop);/* Unbind Queue Statistics */ -fm10k_unbind_hw_stats_q (stats->q,0 , hw->mac.max_queues); +fm10k_unbind_hw_stats_q (stats->q, hw->mac.max_queues);/* Reinitialize bases for all stats */ fm10k_update_hw_stats_pf (hw, stats);
drivers/net/ethernet/intel/fm10k/fm10k_vf.c +1 -1
@@ -465,7 +465,7 @@ static void fm10k_rebind_hw_stats_vf(struct fm10k_hw *hw, struct fm10k_hw_stats *stats) {/* Unbind Queue Statistics */ -fm10k_unbind_hw_stats_q (stats->q,0 , hw->mac.max_queues); +fm10k_unbind_hw_stats_q (stats->q, hw->mac.max_queues);/* Reinitialize bases for all stats */ fm10k_update_hw_stats_vf (hw, stats);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 604/849 r8169: set EEE speed down ratio to 1
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: ChunHao Lin <[email protected]>
[ Upstream commit bf7154ffb1c65a201906296a9d3eb22e9daa5ffc ]
EEE speed down means speed down MAC MCU clock. It is not from spec. It is kind of Realtek specific power saving feature. But enable it may cause some issues, like packet drop or interrupt loss. Different hardware may have different issues.
EEE speed down ratio (mac ocp 0xe056[7:4]) is used to set EEE speed down rate. The larger this value is, the more power can save. But it actually save less power then we expected. And, as mentioned above, will impact compatibility. So set it to 1 (mac ocp 0xe056[7:4] = 0) , which means not to speed down, to improve compatibility.
--- drivers/net/ethernet/realtek/r8169_main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/realtek/r8169_main.c +3 -3
@@ -3409,7 +3409,7 @@ static void rtl_hw_start_8168h_1(struct rtl8169_private *tp)r8168_mac_ocp_modify (tp,0xd412 ,0x0fff , sw_cnt_1ms_ini); } -r8168_mac_ocp_modify (tp,0xe056 ,0x00f0 ,0x0070 ); +r8168_mac_ocp_modify (tp,0xe056 ,0x00f0 ,0x0000 );r8168_mac_ocp_modify (tp,0xe052 ,0x6000 ,0x8008 );r8168_mac_ocp_modify (tp,0xe0d6 ,0x01ff ,0x017f );r8168_mac_ocp_modify (tp,0xd420 ,0x0fff ,0x047f );
@@ -3514,7 +3514,7 @@ static void rtl_hw_start_8117(struct rtl8169_private *tp)r8168_mac_ocp_modify (tp,0xd412 ,0x0fff , sw_cnt_1ms_ini); } -r8168_mac_ocp_modify (tp,0xe056 ,0x00f0 ,0x0070 ); +r8168_mac_ocp_modify (tp,0xe056 ,0x00f0 ,0x0000 );r8168_mac_ocp_write (tp,0xea80 ,0x0003 );r8168_mac_ocp_modify (tp,0xe052 ,0x0000 ,0x0009 );r8168_mac_ocp_modify (tp,0xd420 ,0x0fff ,0x047f );
@@ -3715,7 +3715,7 @@ static void rtl_hw_start_8125_common(struct rtl8169_private *tp)r8168_mac_ocp_modify (tp,0xc0b4 ,0x0000 ,0x000c );r8168_mac_ocp_modify (tp,0xeb6a ,0x00ff ,0x0033 );r8168_mac_ocp_modify (tp,0xeb50 ,0x03e0 ,0x0040 ); -r8168_mac_ocp_modify (tp,0xe056 ,0x00f0 ,0x0030 ); +r8168_mac_ocp_modify (tp,0xe056 ,0x00f0 ,0x0000 );r8168_mac_ocp_modify (tp,0xe040 ,0x1000 ,0x0000 );r8168_mac_ocp_modify (tp,0xea1c ,0x0003 ,0x0001 ); if (tp->mac_version == RTL_GIGA_MAC_VER_70 ||
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 605/849 PCI: cadence: Check for the existence of cdns_pcie::ops before using it
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Wang <[email protected]>
[ Upstream commit 49a6c160ad4812476f8ae1a8f4ed6d15adfa6c09 ]
cdns_pcie::ops might not be populated by all the Cadence glue drivers. This is going to be true for the upcoming Sophgo platform which doesn't set the ops.
Hence, add a check to prevent NULL pointer dereference.
--- drivers/pci/controller/cadence/pcie-cadence-host.c | 2 +- drivers/pci/controller/cadence/pcie-cadence.c | 4 ++-- drivers/pci/controller/cadence/pcie-cadence.h | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-)
drivers/pci/controller/cadence/pcie-cadence-host.c +1 -1
@@ -531,7 +531,7 @@ static int cdns_pcie_host_init_address_translation(struct cdns_pcie_rc *rc)cdns_pcie_writel (pcie,CDNS_PCIE_AT_OB_REGION_PCI_ADDR1 (0 ), addr1);cdns_pcie_writel (pcie,CDNS_PCIE_AT_OB_REGION_DESC1 (0 ), desc1); -if (pcie->ops->cpu_addr_fixup) +if (pcie->ops && pcie->ops->cpu_addr_fixup) cpu_addr = pcie->ops->cpu_addr_fixup (pcie, cpu_addr); addr0 = CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS(12) |
drivers/pci/controller/cadence/pcie-cadence.c +2 -2
@@ -92,7 +92,7 @@ void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 busnr, u8 fn,cdns_pcie_writel (pcie,CDNS_PCIE_AT_OB_REGION_DESC1 (r), desc1);/* Set the CPU address */ -if (pcie->ops->cpu_addr_fixup) +if (pcie->ops && pcie->ops->cpu_addr_fixup) cpu_addr = pcie->ops->cpu_addr_fixup (pcie, cpu_addr); addr0 = CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS(nbits) |
@@ -123,7 +123,7 @@ void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie, }/* Set the CPU address */ -if (pcie->ops->cpu_addr_fixup) +if (pcie->ops && pcie->ops->cpu_addr_fixup) cpu_addr = pcie->ops->cpu_addr_fixup (pcie, cpu_addr); addr0 = CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS(17) |
drivers/pci/controller/cadence/pcie-cadence.h +3 -3
@@ -468,7 +468,7 @@ static inline u32 cdns_pcie_ep_fn_readl(struct cdns_pcie *pcie, u8 fn, u32 reg)static inline int cdns_pcie_start_link (struct cdns_pcie *pcie) { -if (pcie->ops->start_link) +if (pcie->ops && pcie->ops->start_link)return pcie->ops->start_link (pcie);return 0 ;
@@ -476,13 +476,13 @@ static inline int cdns_pcie_start_link(struct cdns_pcie *pcie)static inline void cdns_pcie_stop_link (struct cdns_pcie *pcie) { -if (pcie->ops->stop_link) +if (pcie->ops && pcie->ops->stop_link) pcie->ops->stop_link (pcie); }static inline bool cdns_pcie_link_up (struct cdns_pcie *pcie) { -if (pcie->ops->link_up) +if (pcie->ops && pcie->ops->link_up)return pcie->ops->link_up (pcie);return true;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 606/849 sparc/module: Add R_SPARC_UA64 relocation handling
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Koakuma <[email protected]>
[ Upstream commit 05457d96175d25c976ab6241c332ae2eb5e07833 ]
This is needed so that the kernel can handle R_SPARC_UA64 relocations, which is emitted by LLVM's IAS.
--- arch/sparc/include/asm/elf_64.h | 1 + arch/sparc/kernel/module.c | 1 + 2 files changed, 2 insertions(+)
arch/sparc/include/asm/elf_64.h +1 -0
@@ -58,6 +58,7 @@#define R_SPARC_7 43#define R_SPARC_5 44#define R_SPARC_6 45 +#define R_SPARC_UA64 54/* Bits present in AT_HWCAP, primarily for Sparc32. */ #define HWCAP_SPARC_FLUSH 0x00000001
arch/sparc/kernel/module.c +1 -0
@@ -87,6 +87,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,break ;#ifdef CONFIG_SPARC64 case R_SPARC_64 : +case R_SPARC_UA64 : location[0 ] = v >>56 ; location[1 ] = v >>48 ; location[2 ] = v >>40 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 607/849 sparc64: fix prototypes of reads[bwl]()
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 7205ef77dfe167df1b83aea28cf00fc02d662990 ]
Conventions for readsl() are the same as for readl() - any __iomem pointer is acceptable, both const and volatile ones being OK. Same for readsb() and readsw().
--- arch/sparc/include/asm/io_64.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/sparc/include/asm/io_64.h +3 -3
@@ -250,19 +250,19 @@ void insl(unsigned long, void *, unsigned long);#define insw insw#define insl insl -static inline void readsb (void __iomem *port,void *buf,unsigned long count) +static inline void readsb (const volatile void __iomem *port,void *buf,unsigned long count) {insb ((unsigned long __force )port, buf, count); }#define readsb readsb -static inline void readsw (void __iomem *port,void *buf,unsigned long count) +static inline void readsw (const volatile void __iomem *port,void *buf,unsigned long count) {insw ((unsigned long __force )port, buf, count); }#define readsw readsw -static inline void readsl (void __iomem *port,void *buf,unsigned long count) +static inline void readsl (const volatile void __iomem *port,void *buf,unsigned long count) {insl ((unsigned long __force )port, buf, count); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 608/849 vfio: return -ENOTTY for unsupported device feature
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Mastro <[email protected]>
[ Upstream commit 16df67f2189a71a8310bcebddb87ed569e8352be ]
The two implementers of vfio_device_ops.device_feature, vfio_cdx_ioctl_feature and vfio_pci_core_ioctl_feature, return -ENOTTY in the fallthrough case when the feature is unsupported. For consistency, the base case, vfio_ioctl_device_feature, should do the same when device_feature == NULL, indicating an implementation has no feature extensions.
--- drivers/vfio/vfio_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/vfio/vfio_main.c +1 -1
@@ -1251,7 +1251,7 @@ static int vfio_ioctl_device_feature(struct vfio_device *device, feature.argsz - minsz);default :if (unlikely (!device->ops->device_feature)) -return -EINVAL ; +return -ENOTTY ;return device->ops->device_feature (device, feature.flags, arg->data, feature.argsz - minsz);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 609/849 ptp_ocp: make ptp_ocp driver compatible with PTP_EXTTS_REQUEST2
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vadim Fedorenko <[email protected]>
[ Upstream commit d3ca2ef0c915d219e0d958e0bdcc4be6c02c210b ]
Originally ptp_ocp driver was not strictly checking flags for external timestamper and was always activating rising edge timestamping as it's the only supported mode. Recent changes to ptp made it incompatible with PTP_EXTTS_REQUEST2 ioctl. Adjust ptp_clock_info to provide supported mode and be compatible with new infra.
While at here remove explicit check of periodic output flags from the driver and provide supported flags for ptp core to check.
--- drivers/ptp/ptp_ocp.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/ptp/ptp_ocp.c +2 -4
@@ -1485,6 +1485,8 @@ static const struct ptp_clock_info ptp_ocp_clock_info = { .pps = true, .n_ext_ts = 6, .n_per_out = 5, + .supported_extts_flags = PTP_STRICT_FLAGS | PTP_RISING_EDGE, + .supported_perout_flags = PTP_PEROUT_DUTY_CYCLE | PTP_PEROUT_PHASE, }; static void
@@ -2095,10 +2097,6 @@ ptp_ocp_signal_from_perout(struct ptp_ocp *bp, int gen, {struct ptp_ocp_signal s = { }; -if (req->flags & ~(PTP_PEROUT_DUTY_CYCLE | -PTP_PEROUT_PHASE )) -return -EOPNOTSUPP ; - s.polarity = bp->signal[gen].polarity; s.period =ktime_set (req->period.sec, req->period.nsec);if (!s.period)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 610/849 crypto: hisilicon/qm - invalidate queues in use
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weili Qian <[email protected]>
[ Upstream commit 85acd1b26b8f5b838887dc965dc3aa2c0253f4d1 ]
Before the device reset, although the driver has set the queue status to intercept doorbells sent by the task process, the reset thread is isolated from the user-mode task process, so the task process may still send doorbells. Therefore, before the reset, the queue is directly invalidated, and the device directly discards the doorbells sent by the process.
--- drivers/crypto/hisilicon/qm.c | 53 ++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 13 deletions(-)
drivers/crypto/hisilicon/qm.c +40 -13
@@ -45,6 +45,8 @@#define QM_SQ_TYPE_MASK GENMASK(3, 0)#define QM_SQ_TAIL_IDX (sqc) ((le16_to_cpu((sqc).w11) >> 6) & 0x1) +#define QM_SQC_DISABLE_QP (1U << 6) +#define QM_XQC_RANDOM_DATA 0xaaaa/* cqc shift */ #define QM_CQ_HOP_NUM_SHIFT 0
@@ -3179,6 +3181,9 @@ static int qm_eq_aeq_ctx_cfg(struct hisi_qm *qm)qm_init_eq_aeq_status (qm); +/* Before starting the dev, clear the memory and then configure to device using. */ +memset (qm->qdma.va,0 , qm->qdma.size); + ret =qm_eq_ctx_cfg (qm);if (ret) {dev_err (dev,"Set eqc failed!\n" );
@@ -3190,9 +3195,13 @@ static int qm_eq_aeq_ctx_cfg(struct hisi_qm *qm)static int __hisi_qm_start (struct hisi_qm *qm) { +struct device *dev = &qm->pdev->dev;int ret; -WARN_ON (!qm->qdma.va); +if (!qm->qdma.va) { +dev_err (dev,"qm qdma is NULL!\n" ); +return -EINVAL ; + }if (qm->fun_type ==QM_HW_PF ) { ret =hisi_qm_set_vft (qm,0 , qm->qp_base, qm->qp_num);
@@ -3266,7 +3275,7 @@ static int qm_restart(struct hisi_qm *qm)for (i =0 ; i < qm->qp_num; i++) { qp = &qm->qp_array[i];if (atomic_read (&qp->qp_status.flags) ==QP_STOP && - qp->is_resetting == true) { + qp->is_resetting == true && qp->is_in_kernel == true) { ret =qm_start_qp_nolock (qp,0 );if (ret <0 ) {dev_err (dev,"Failed to start qp%d!\n" , i);
@@ -3298,24 +3307,44 @@ static void qm_stop_started_qp(struct hisi_qm *qm) }/** -* qm_clear_queues() - Clear all queues memory in a qm. -* @qm: The qm in which the queues will be cleared. +* qm_invalid_queues() - invalid all queues in use. +* @qm: The qm in which the queues will be invalidated. * -* This function clears all queues memory in a qm. Reset of accelerator can -* use this to clear queues. +* This function invalid all queues in use. If the doorbell command is sent +* to device in user space after the device is reset, the device discards +* the doorbell command. */ -static void qm_clear_queues (struct hisi_qm *qm) +static void qm_invalid_queues (struct hisi_qm *qm) {struct hisi_qp *qp; +struct qm_sqc *sqc; +struct qm_cqc *cqc;int i; +/* +* Normal stop queues is no longer used and does not need to be +* invalid queues. +*/ +if (qm->status.stop_reason ==QM_NORMAL ) +return ; + +if (qm->status.stop_reason ==QM_DOWN ) +hisi_qm_cache_wb (qm); +for (i =0 ; i < qm->qp_num; i++) { qp = &qm->qp_array[i]; -if (qp->is_in_kernel && qp->is_resetting) +if (!qp->is_resetting) +continue ; + +/* Modify random data and set sqc close bit to invalid queue. */ + sqc = qm->sqc + i; + cqc = qm->cqc + i; + sqc->w8 =cpu_to_le16 (QM_XQC_RANDOM_DATA ); + sqc->w13 =cpu_to_le16 (QM_SQC_DISABLE_QP ); + cqc->w8 =cpu_to_le16 (QM_XQC_RANDOM_DATA ); +if (qp->is_in_kernel)memset (qp->qdma.va,0 , qp->qdma.size); } - -memset (qm->qdma.va,0 , qm->qdma.size); }/**
@@ -3372,7 +3401,7 @@ int hisi_qm_stop(struct hisi_qm *qm, enum qm_stop_reason r) } } -qm_clear_queues (qm); +qm_invalid_queues (qm); qm->status.stop_reason =QM_NORMAL ; err_unlock:
@@ -4770,8 +4799,6 @@ void hisi_qm_dev_shutdown(struct pci_dev *pdev) ret =hisi_qm_stop (qm,QM_DOWN );if (ret)dev_err (&pdev->dev,"Fail to stop qm in shutdown!\n" ); - -hisi_qm_cache_wb (qm); }EXPORT_SYMBOL_GPL (hisi_qm_dev_shutdown);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 611/849 crypto: hisilicon/qm - clear all VF configurations in the hardware
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weili Qian <[email protected]>
[ Upstream commit 64b9642fc29a14e1fe67842be9c69c7b90a3bcd6 ]
When disabling SR-IOV, clear the configuration of each VF in the hardware. Do not exit the configuration clearing process due to the failure of a single VF. Additionally, Clear the VF configurations before decrementing the PM counter.
--- drivers/crypto/hisilicon/qm.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-)
drivers/crypto/hisilicon/qm.c +12 -13
@@ -3646,19 +3646,19 @@ static int qm_vf_q_assign(struct hisi_qm *qm, u32 num_vfs)return 0 ; } -static int qm_clear_vft_config (struct hisi_qm *qm) +static void qm_clear_vft_config (struct hisi_qm *qm) { -int ret;u32 i; -for (i =1 ; i <= qm->vfs_num; i++) { - ret =hisi_qm_set_vft (qm, i,0 ,0 ); -if (ret) -return ret; - } - qm->vfs_num =0 ; +/* +* When disabling SR-IOV, clear the configuration of each VF in the hardware +* sequentially. Failure to clear a single VF should not affect the clearing +* operation of other VFs. +*/ +for (i =1 ; i <= qm->vfs_num; i++) + (void )hisi_qm_set_vft (qm, i,0 ,0 ); -return 0 ; + qm->vfs_num =0 ; }static int qm_func_shaper_enable (struct hisi_qm *qm,u32 fun_index,u32 qos)
@@ -3993,13 +3993,13 @@ int hisi_qm_sriov_enable(struct pci_dev *pdev, int max_vfs) goto err_put_sync; } + qm->vfs_num = num_vfs; ret =pci_enable_sriov (pdev, num_vfs);if (ret) {pci_err (pdev,"Can't enable VF!\n" );qm_clear_vft_config (qm); goto err_put_sync; } - qm->vfs_num = num_vfs;pci_info (pdev,"VF enabled, vfs_num(=%d)!\n" , num_vfs);
@@ -4034,11 +4034,10 @@ int hisi_qm_sriov_disable(struct pci_dev *pdev, bool is_frozen) }pci_disable_sriov (pdev); - - qm->vfs_num =0 ; +qm_clear_vft_config (qm);qm_pm_put_sync (qm); -return qm_clear_vft_config (qm); +return 0 ; }EXPORT_SYMBOL_GPL (hisi_qm_sriov_disable);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 612/849 ASoC: ops: improve snd_soc_get_volsw
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niranjan H Y <[email protected]>
[ Upstream commit a0ce874cfaaab9792d657440b9d050e2112f6e4d ]
* clamp the values if the register value read is
out of range
[This patch originally had two changes in it, I removed a second buggy
one -- broonie]
--
v5:
- remove clamp parameter
- move the boundary check after sign-bit extension
--- sound/soc/soc-ops.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/soc-ops.c +1 -0
@@ -118,6 +118,7 @@ static int soc_mixer_reg_to_ctl(struct soc_mixer_control *mc, unsigned int reg_vif (mc->sign_bit) val =sign_extend32 (val, mc->sign_bit); + val =clamp (val, mc->min, mc->max); val -= mc->min;if (mc->invert)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 613/849 PCI/PM: Skip resuming to D0 if device is disconnected
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 299fad4133677b845ce962f78c9cf75bded63f61 ]
When a device is surprise-removed (e.g., due to a dock unplug), the PCI core unconfigures all downstream devices and sets their error state to pci_channel_io_perm_failure. This marks them as disconnected via pci_dev_is_disconnected().
During device removal, the runtime PM framework may attempt to resume the device to D0 via pm_runtime_get_sync(), which calls into pci_power_up(). Since the device is already disconnected, this resume attempt is unnecessary and results in a predictable errors like this, typically when undocking from a TBT3 or USB4 dock with PCIe tunneling:
pci 0000:01:00.0: Unable to change power state from D3cold to D0, device inaccessible
Avoid powering up disconnected devices by checking their status early in pci_power_up() and returning -EIO.
--- drivers/pci/pci.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/pci/pci.c +5 -0
@@ -1374,6 +1374,11 @@ int pci_power_up(struct pci_dev *dev)return -EIO ; } +if (pci_dev_is_disconnected (dev)) { + dev->current_state = PCI_D3cold; +return -EIO ; + } +pci_read_config_word (dev, dev->pm_cap +PCI_PM_CTRL , &pmcsr);if (PCI_POSSIBLE_ERROR (pmcsr)) { pci_err(dev, "Unable to change power state from %s to D0, device inaccessible\n",
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 614/849 selftests: forwarding: Reorder (ar)ping arguments to obey POSIX getopt
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Yang <[email protected]>
[ Upstream commit 50d51cef555ee42fe47dd51b71366a77895e5f0b ]
Quoted from musl wiki:
GNU getopt permutes argv to pull options to the front, ahead of non-option arguments. musl and the POSIX standard getopt stop processing options at the first non-option argument with no permutation.
Thus these scripts stop working on musl since non-option arguments for tools using getopt() (in this case, (ar)ping) do not always come last. Fix it by reordering arguments.
--- .../selftests/net/forwarding/custom_multipath_hash.sh | 2 +- .../selftests/net/forwarding/gre_custom_multipath_hash.sh | 2 +- .../selftests/net/forwarding/ip6_forward_instats_vrf.sh | 6 +++--- .../net/forwarding/ip6gre_custom_multipath_hash.sh | 2 +- tools/testing/selftests/net/forwarding/lib.sh | 8 ++++---- .../selftests/net/forwarding/mirror_gre_bridge_1q_lag.sh | 2 +- .../selftests/net/forwarding/mirror_gre_vlan_bridge_1q.sh | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-)
tools/testing/selftests/net/forwarding/custom_multipath_hash.sh +1 -1
@@ -226,7 +226,7 @@ send_flowlabel() # Generate 16384 echo requests, each with a random flow label. ip vrf exec v$h1 sh -c \ "for _ in {1..16384}; do \ - $PING6 2001:db8:4::2 -F 0 -c 1 -q >/dev/null 2>&1; \ + $PING6 -F 0 -c 1 -q 2001:db8:4::2 >/dev/null 2>&1; \ done" }
tools/testing/selftests/net/forwarding/gre_custom_multipath_hash.sh +1 -1
@@ -321,7 +321,7 @@ send_flowlabel() # Generate 16384 echo requests, each with a random flow label. ip vrf exec v$h1 sh -c \ "for _ in {1..16384}; do \ - $PING6 2001:db8:2::2 -F 0 -c 1 -q >/dev/null 2>&1; \ + $PING6 -F 0 -c 1 -q 2001:db8:2::2 >/dev/null 2>&1; \ done" }
tools/testing/selftests/net/forwarding/ip6_forward_instats_vrf.sh +3 -3
@@ -95,7 +95,7 @@ ipv6_in_too_big_err() # Send too big packets ip vrf exec $vrf_name \ - $PING6 -s 1300 2001:1:2::2 -c 1 -w $PING_TIMEOUT &> /dev/null + $PING6 -s 1300 -c 1 -w $PING_TIMEOUT 2001:1:2::2 &> /dev/null local t1=$(ipv6_stats_get $rtr1 Ip6InTooBigErrors) test "$((t1 - t0))" -ne 0
@@ -131,7 +131,7 @@ ipv6_in_addr_err() # Disable forwarding temporary while sending the packet sysctl -qw net.ipv6.conf.all.forwarding=0 ip vrf exec $vrf_name \ - $PING6 2001:1:2::2 -c 1 -w $PING_TIMEOUT &> /dev/null + $PING6 -c 1 -w $PING_TIMEOUT 2001:1:2::2 &> /dev/null sysctl -qw net.ipv6.conf.all.forwarding=1 local t1=$(ipv6_stats_get $rtr1 Ip6InAddrErrors)
@@ -150,7 +150,7 @@ ipv6_in_discard() # Add a policy to discard ip xfrm policy add dst 2001:1:2::2/128 dir fwd action block ip vrf exec $vrf_name \ - $PING6 2001:1:2::2 -c 1 -w $PING_TIMEOUT &> /dev/null + $PING6 -c 1 -w $PING_TIMEOUT 2001:1:2::2 &> /dev/null ip xfrm policy del dst 2001:1:2::2/128 dir fwd local t1=$(ipv6_stats_get $rtr1 Ip6InDiscards)
tools/testing/selftests/net/forwarding/ip6gre_custom_multipath_hash.sh +1 -1
@@ -323,7 +323,7 @@ send_flowlabel() # Generate 16384 echo requests, each with a random flow label. ip vrf exec v$h1 sh -c \ "for _ in {1..16384}; do \ - $PING6 2001:db8:2::2 -F 0 -c 1 -q >/dev/null 2>&1; \ + $PING6 -F 0 -c 1 -q 2001:db8:2::2 >/dev/null 2>&1; \ done" }
tools/testing/selftests/net/forwarding/lib.sh +4 -4
@@ -1291,8 +1291,8 @@ ping_do() vrf_name=$(master_name_get $if_name) ip vrf exec $vrf_name \ - $PING $args $dip -c $PING_COUNT -i 0.1 \ - -w $PING_TIMEOUT &> /dev/null + $PING $args -c $PING_COUNT -i 0.1 \ + -w $PING_TIMEOUT $dip &> /dev/null } ping_test()
@@ -1322,8 +1322,8 @@ ping6_do() vrf_name=$(master_name_get $if_name) ip vrf exec $vrf_name \ - $PING6 $args $dip -c $PING_COUNT -i 0.1 \ - -w $PING_TIMEOUT &> /dev/null + $PING6 $args -c $PING_COUNT -i 0.1 \ + -w $PING_TIMEOUT $dip &> /dev/null } ping6_test()
tools/testing/selftests/net/forwarding/mirror_gre_bridge_1q_lag.sh +1 -1
@@ -238,7 +238,7 @@ test_lag_slave() ip neigh flush dev br1 setup_wait_dev $up_dev setup_wait_dev $host_dev - $ARPING -I br1 192.0.2.130 -qfc 1 + $ARPING -I br1 -qfc 1 192.0.2.130 sleep 2 mirror_test vrf-h1 192.0.2.1 192.0.2.18 $host_dev 1 ">= 10"
tools/testing/selftests/net/forwarding/mirror_gre_vlan_bridge_1q.sh +2 -2
@@ -196,7 +196,7 @@ test_span_gre_forbidden_egress() bridge vlan add dev $swp3 vid 555 # Re-prime FDB - $ARPING -I br1.555 192.0.2.130 -fqc 1 + $ARPING -I br1.555 -fqc 1 192.0.2.130 sleep 1 quick_test_span_gre_dir $tundev
@@ -290,7 +290,7 @@ test_span_gre_fdb_roaming() bridge fdb del dev $swp2 $h3mac vlan 555 master 2>/dev/null # Re-prime FDB - $ARPING -I br1.555 192.0.2.130 -fqc 1 + $ARPING -I br1.555 -fqc 1 192.0.2.130 sleep 1 quick_test_span_gre_dir $tundev
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 615/849 remoteproc: qcom: q6v5: Avoid handling handover twice
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephan Gerhold <[email protected]>
[ Upstream commit 54898664e1eb6b5b3e6cdd9343c6eb15da776153 ]
A remoteproc could theoretically signal handover twice. This is unexpected and would break the reference counting for the handover resources (power domains, clocks, regulators, etc), so add a check to prevent that from happening.
--- drivers/remoteproc/qcom_q6v5.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/remoteproc/qcom_q6v5.c +5 -0
@@ -164,6 +164,11 @@ static irqreturn_t q6v5_handover_interrupt(int irq, void *data) {struct qcom_q6v5 *q6v5 = data; +if (q6v5->handover_issued) { +dev_err (q6v5->dev,"Handover signaled, but it already happened\n" ); +return IRQ_HANDLED ; + } +if (q6v5->handover) q6v5->handover (q6v5);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 616/849 wifi: ath12k: Increase DP_REO_CMD_RING_SIZE to 256
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nithyanantham Paramasivam <[email protected]>
[ Upstream commit 82993345aef6987a916337ebd2fca3ff4a6250a7 ]
Increase DP_REO_CMD_RING_SIZE from 128 to 256 to avoid queuing failures observed during stress test scenarios.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/dp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath12k/dp.h +1 -1
@@ -184,7 +184,7 @@ struct ath12k_pdev_dp {#define DP_REO_REINJECT_RING_SIZE 32#define DP_RX_RELEASE_RING_SIZE 1024#define DP_REO_EXCEPTION_RING_SIZE 128 -#define DP_REO_CMD_RING_SIZE 128 +#define DP_REO_CMD_RING_SIZE 256#define DP_REO_STATUS_RING_SIZE 2048#define DP_RXDMA_BUF_RING_SIZE 4096#define DP_RX_MAC_BUF_RING_SIZE 2048
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 617/849 net: dsa: microchip: Set SPI as bus interface during reset for KSZ8463
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bastien Curutchet <[email protected]>
[ Upstream commit a0b977a3d19368b235f2a6c06e800fb25452029b ]
At reset, the KSZ8463 uses a strap-based configuration to set SPI as bus interface. SPI is the only bus supported by the driver. If the required pull-ups/pull-downs are missing (by mistake or by design to save power) the pins may float and the configuration can go wrong preventing any communication with the switch.
Introduce a ksz8463_configure_straps_spi() function called during the device reset. It relies on the 'straps-rxd-gpios' OF property and the 'reset' pinmux configuration to enforce SPI as bus interface.
--- drivers/net/dsa/microchip/ksz_common.c | 45 ++++++++++++++++++++++++++ 1 file changed, 45 insertions(+)
drivers/net/dsa/microchip/ksz_common.c +45 -0
@@ -23,6 +23,7 @@#include <linux/of_mdio.h> #include <linux/of_net.h> #include <linux/micrel_phy.h> +#include <linux/pinctrl/consumer.h> #include <net/dsa.h> #include <net/ieee8021q.h> #include <net/pkt_cls.h>
@@ -5345,6 +5346,38 @@ static int ksz_parse_drive_strength(struct ksz_device *dev)return 0 ; } +static int ksz8463_configure_straps_spi (struct ksz_device *dev) +{ +struct pinctrl *pinctrl; +struct gpio_desc *rxd0; +struct gpio_desc *rxd1; + + rxd0 =devm_gpiod_get_index_optional (dev->dev,"straps-rxd" ,0 ,GPIOD_OUT_LOW ); +if (IS_ERR (rxd0)) +return PTR_ERR (rxd0); + + rxd1 =devm_gpiod_get_index_optional (dev->dev,"straps-rxd" ,1 ,GPIOD_OUT_HIGH ); +if (IS_ERR (rxd1)) +return PTR_ERR (rxd1); + +if (!rxd0 && !rxd1) +return 0 ; + +if ((rxd0 && !rxd1) || (rxd1 && !rxd0)) +return -EINVAL ; + + pinctrl =devm_pinctrl_get_select (dev->dev,"reset" ); +if (IS_ERR (pinctrl)) +return PTR_ERR (pinctrl); + +return 0 ; +} + +static int ksz8463_release_straps_spi (struct ksz_device *dev) +{ +return pinctrl_select_default_state (dev->dev); +} +int ksz_switch_register (struct ksz_device *dev) {const struct ksz_chip_data *info;
@@ -5360,10 +5393,22 @@ int ksz_switch_register(struct ksz_device *dev)return PTR_ERR (dev->reset_gpio);if (dev->reset_gpio) { +if (of_device_is_compatible (dev->dev->of_node,"microchip,ksz8463" )) { + ret =ksz8463_configure_straps_spi (dev); +if (ret) +return ret; + } +gpiod_set_value_cansleep (dev->reset_gpio,1 );usleep_range (10000 ,12000 );gpiod_set_value_cansleep (dev->reset_gpio,0 );msleep (100 ); + +if (of_device_is_compatible (dev->dev->of_node,"microchip,ksz8463" )) { + ret =ksz8463_release_straps_spi (dev); +if (ret) +return ret; + } }mutex_init (&dev->dev_mutex);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 618/849 bng_en: make bnge_alloc_ring() self-unwind on failure
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bhargava Marreddy <[email protected]>
[ Upstream commit 9ee5994418bb527788e77361d338af40a126aa21 ]
Ensure bnge_alloc_ring() frees any intermediate allocations when it fails. This enables later patches to rely on this self-unwinding behavior.
--- drivers/net/ethernet/broadcom/bnge/bnge_rmem.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/ethernet/broadcom/bnge/bnge_rmem.c +6 -3
@@ -95,7 +95,7 @@ int bnge_alloc_ring(struct bnge_dev *bd, struct bnge_ring_mem_info *rmem) &rmem->dma_arr[i], GFP_KERNEL);if (!rmem->pg_arr[i]) -return -ENOMEM ; + goto err_free_ring;if (rmem->ctx_mem) bnge_init_ctx_mem(rmem->ctx_mem, rmem->pg_arr[i],
@@ -116,10 +116,13 @@ int bnge_alloc_ring(struct bnge_dev *bd, struct bnge_ring_mem_info *rmem)if (rmem->vmem_size) { *rmem->vmem =vzalloc (rmem->vmem_size);if (!(*rmem->vmem)) -return -ENOMEM ; + goto err_free_ring; } -return 0 ; + +err_free_ring: +bnge_free_ring (bd, rmem); +return -ENOMEM ; } static int bnge_alloc_ctx_one_lvl(struct bnge_dev *bd,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 619/849 ALSA: usb-audio: dont apply interface quirk to Presonus S1824c
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roy Vegard Ovesen <[email protected]>
[ Upstream commit d1d6ad7f6686e208aba06b7af3feef7a7cba61cf ]
Testing with a Presonus STUDIO 1824c together with a Behringer ultragain digital ADAT device shows that using all 3 altno settings works fine.
When selecting sample rate, the driver sets the interface to the correct altno setting and the correct number of channels is set.
Selecting the correct altno setting via Ardour, Reaper or whatever other way to set the sample rate is more convenient than re-loading the driver module with device_setup to set altno.
--- sound/usb/quirks.c | 3 --- 1 file changed, 3 deletions(-)
sound/usb/quirks.c +0 -3
@@ -1599,9 +1599,6 @@ int snd_usb_apply_interface_quirk(struct snd_usb_audio *chip,/* presonus studio 1810c: skip altsets incompatible with device_setup */ if (chip->usb_id ==USB_ID (0x194f ,0x010c ))return s1810c_skip_setting_quirk (chip, iface, altno); -/* presonus studio 1824c: skip altsets incompatible with device_setup */ -if (chip->usb_id ==USB_ID (0x194f ,0x010d )) -return s1810c_skip_setting_quirk (chip, iface, altno);return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 620/849 tcp: Update bind bucket state on port release
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Sitnicki <[email protected]>
[ Upstream commit d57f4b874946e997be52f5ebb5e0e1dad368c16f ]
Today, once an inet_bind_bucket enters a state where fastreuse >= 0 or fastreuseport >= 0 after a socket is explicitly bound to a port, it remains in that state until all sockets are removed and the bucket is destroyed.
In this state, the bucket is skipped during ephemeral port selection in connect(). For applications using a reduced ephemeral port range (IP_LOCAL_PORT_RANGE socket option), this can cause faster port exhaustion since blocked buckets are excluded from reuse.
The reason the bucket state isn't updated on port release is unclear. Possibly a performance trade-off to avoid scanning bucket owners, or just an oversight.
Fix it by recalculating the bucket state when a socket releases a port. To limit overhead, each inet_bind2_bucket stores its own (fastreuse, fastreuseport) state. On port release, only the relevant port-addr bucket is scanned, and the overall state is derived from these.
--- include/net/inet_connection_sock.h | 5 ++-- include/net/inet_hashtables.h | 2 ++ include/net/inet_timewait_sock.h | 3 +- include/net/sock.h | 4 +++ net/ipv4/inet_connection_sock.c | 12 +++++--- net/ipv4/inet_hashtables.c | 44 +++++++++++++++++++++++++++++- net/ipv4/inet_timewait_sock.c | 1 + 7 files changed, 63 insertions(+), 8 deletions(-)
include/net/inet_connection_sock.h +3 -2
@@ -322,8 +322,9 @@ int inet_csk_listen_start(struct sock *sk);void inet_csk_listen_stop (struct sock *sk);/* update the fast reuse flag when adding a socket */ -void inet_csk_update_fastreuse (struct inet_bind_bucket *tb, -struct sock *sk); +void inet_csk_update_fastreuse (const struct sock *sk, +struct inet_bind_bucket *tb, +struct inet_bind2_bucket *tb2);struct dst_entry *inet_csk_update_pmtu (struct sock *sk,u32 mtu);
include/net/inet_hashtables.h +2 -0
@@ -108,6 +108,8 @@ struct inet_bind2_bucket {struct hlist_node bhash_node;/* List of sockets hashed to this bucket */ struct hlist_head owners; +signed char fastreuse; +signed char fastreuseport; };static inline struct net *ib_net (const struct inet_bind_bucket *ib)
include/net/inet_timewait_sock.h +2 -1
@@ -70,7 +70,8 @@ struct inet_timewait_sock { unsigned int tw_transparent : 1, tw_flowlabel : 20, tw_usec_ts : 1, - tw_pad : 2, /* 2 bits hole */ + tw_connect_bind : 1, + tw_pad : 1, /* 1 bit hole */ tw_tos : 8;u32 tw_txhash;u32 tw_priority;
include/net/sock.h +4 -0
@@ -1488,6 +1488,10 @@ static inline int __sk_prot_rehash(struct sock *sk)#define SOCK_BINDADDR_LOCK 4#define SOCK_BINDPORT_LOCK 8 +/** +* define SOCK_CONNECT_BIND - &sock->sk_userlocks flag for auto-bind at connect() time +*/ +#define SOCK_CONNECT_BIND 16struct socket_alloc {struct socket socket;
net/ipv4/inet_connection_sock.c +8 -4
@@ -423,7 +423,7 @@ inet_csk_find_open_port(const struct sock *sk, struct inet_bind_bucket **tb_ret, }static inline int sk_reuseport_match (struct inet_bind_bucket *tb, -struct sock *sk) +const struct sock *sk) {if (tb->fastreuseport <=0 )return 0 ;
@@ -453,8 +453,9 @@ static inline int sk_reuseport_match(struct inet_bind_bucket *tb, ipv6_only_sock(sk), true, false); } -void inet_csk_update_fastreuse (struct inet_bind_bucket *tb, -struct sock *sk) +void inet_csk_update_fastreuse (const struct sock *sk, +struct inet_bind_bucket *tb, +struct inet_bind2_bucket *tb2) {bool reuse = sk->sk_reuse && sk->sk_state !=TCP_LISTEN ;
@@ -501,6 +502,9 @@ void inet_csk_update_fastreuse(struct inet_bind_bucket *tb, tb->fastreuseport =0 ; } } + + tb2->fastreuse = tb->fastreuse; + tb2->fastreuseport = tb->fastreuseport; }/* Obtain a reference to a local port for the given sock,
@@ -582,7 +586,7 @@ int inet_csk_get_port(struct sock *sk, unsigned short snum) } success: -inet_csk_update_fastreuse (tb, sk); +inet_csk_update_fastreuse (sk, tb, tb2);if (!inet_csk (sk)->icsk_bind_hash)inet_bind_hash (sk, tb, tb2, port);
net/ipv4/inet_hashtables.c +43 -1
107 lines not on this page · raw message
net/ipv4/inet_timewait_sock.c +1 -0
@@ -206,6 +206,7 @@ struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, tw->tw_hash = sk->sk_hash; tw->tw_ipv6only =0 ; tw->tw_transparent =inet_test_bit (TRANSPARENT , sk); + tw->tw_connect_bind = !!(sk->sk_userlocks &SOCK_CONNECT_BIND ); tw->tw_prot = sk->sk_prot_creator;atomic64_set (&tw->tw_cookie,atomic64_read (&sk->sk_cookie));twsk_net_set (tw,sock_net (sk));
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 621/849 ovl: make sure that ovl_create_real() returns a hashed dentry
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amir Goldstein <[email protected]>
[ Upstream commit ad1423922781e6552f18d055a5742b1cff018cdc ]
e8bd877fb76bb9f3 ("ovl: fix possible double unlink") added a sanity check of !d_unhashed(child) to try to verify that child dentry was not unlinked while parent dir was unlocked.
This "was not unlink" check has a false positive result in the case of casefolded parent dir, because in that case, ovl_create_temp() returns an unhashed dentry after ovl_create_real() gets an unhashed dentry from ovl_lookup_upper() and makes it positive.
To avoid returning unhashed dentry from ovl_create_temp(), let ovl_create_real() lookup again after making the newdentry positive, so it always returns a hashed positive dentry (or an error).
This fixes the error in ovl_parent_lock() in ovl_check_rename_whiteout() after ovl_create_temp() and allows mount of overlayfs with casefolding enabled layers.
--- fs/overlayfs/dir.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
fs/overlayfs/dir.c +21 -1
@@ -205,12 +205,32 @@ struct dentry *ovl_create_real(struct ovl_fs *ofs, struct dentry *parent, err = -EPERM ; } } -if (!err &&WARN_ON (!newdentry->d_inode)) { +if (err) + goto out; + +if (WARN_ON (!newdentry->d_inode)) {/* * Not quite sure if non-instantiated dentry is legal or not. * VFS doesn't seem to care so check and warn here. */ err = -EIO ; + }else if (d_unhashed (newdentry)) { +struct dentry *d; +/* +* Some filesystems (i.e. casefolded) may return an unhashed +* negative dentry from the ovl_lookup_upper() call before +* ovl_create_real(). +* In that case, lookup again after making the newdentry +* positive, so ovl_create_upper() always returns a hashed +* positive dentry. +*/ + d =ovl_lookup_upper (ofs, newdentry->d_name.name, parent, + newdentry->d_name.len); +dput (newdentry); +if (IS_ERR_OR_NULL (d)) + err = d ?PTR_ERR (d) : -ENOENT ; +else +return d; } out:if (err) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 622/849 drm/amd/display: Add missing post flip calls
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dillon Varone <[email protected]>
[ Upstream commit 54980f3c63ed3e5cca3d251416581193c90eae76 ]
[WHY&HOW]dc_post_update_surfaces_to_stream needs to be called after a full update completes in order to optimize clocks and watermarks for power. Add missing calls before idle entry is requested to ensure optimal power.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 +-- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 8 ++++++-- 2 files changed, 7 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +1 -2
@@ -427,8 +427,7 @@ static inline bool update_planes_and_stream_adapter(struct dc *dc,/* * Previous frame finished and HW is ready for optimization. */ -if (update_type ==UPDATE_TYPE_FAST ) -dc_post_update_surfaces_to_stream (dc); +dc_post_update_surfaces_to_stream (dc); return dc_update_planes_and_stream(dc, array_of_surface_update,
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c +6 -2
@@ -218,8 +218,10 @@ static void amdgpu_dm_idle_worker(struct work_struct *work)break ; } -if (idle_work->enable) +if (idle_work->enable) { +dc_post_update_surfaces_to_stream (idle_work->dm->dc);dc_allow_idle_optimizations (idle_work->dm->dc, true); + }mutex_unlock (&idle_work->dm->dc_lock); } idle_work->dm->idle_workqueue->running = false;
@@ -273,8 +275,10 @@ static void amdgpu_dm_crtc_vblank_control_worker(struct work_struct *work) vblank_work->acrtc->dm_irq_params.allow_sr_entry); } -if (dm->active_vblank_irq_count ==0 ) +if (dm->active_vblank_irq_count ==0 ) { +dc_post_update_surfaces_to_stream (dm->dc);dc_allow_idle_optimizations (dm->dc, true); + }mutex_unlock (&dm->dc_lock);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 623/849 drm/amd/display: Add AVI infoframe copy in copy_stream_update_to_stream
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karthi Kandasamy <[email protected]>
[ Upstream commit c8bedab2d9a1a0daa49ac20f9928a943f7205582 ]
[WHY]
Ensure AVI infoframe updates from stream updates are applied to the active stream so OS overrides are not lost.
[HOW]
Copy avi_infopacket to stream when valid flag is set.
Follow existing infopacket copy pattern and perform a basic validity check before assignment.
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 7 ++++++- drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 6 ++++++ drivers/gpu/drm/amd/display/dc/dc_stream.h | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +6 -1
@@ -3307,6 +3307,9 @@ static void copy_stream_update_to_stream(struct dc *dc,if (update->adaptive_sync_infopacket) stream->adaptive_sync_infopacket = *update->adaptive_sync_infopacket; +if (update->avi_infopacket) + stream->avi_infopacket = *update->avi_infopacket; +if (update->dither_option) stream->dither_option = *update->dither_option;
@@ -3601,7 +3604,8 @@ static void commit_planes_do_stream_update(struct dc *dc, stream_update->vsp_infopacket || stream_update->hfvsif_infopacket || stream_update->adaptive_sync_infopacket || - stream_update->vtem_infopacket) { + stream_update->vtem_infopacket || + stream_update->avi_infopacket) {resource_build_info_frame (pipe_ctx); dc->hwss.update_info_frame (pipe_ctx);
@@ -5073,6 +5077,7 @@ static bool full_update_required(struct dc *dc, stream_update->hfvsif_infopacket || stream_update->vtem_infopacket || stream_update->adaptive_sync_infopacket || + stream_update->avi_infopacket || stream_update->dpms_off || stream_update->allow_freesync || stream_update->vrr_active_variable ||
drivers/gpu/drm/amd/display/dc/core/dc_resource.c +6 -0
@@ -4417,8 +4417,14 @@ static void set_avi_info_frame(unsigned int fr_ind = pipe_ctx->stream->timing.fr_index;enum dc_timing_3d_format format; +if (stream->avi_infopacket.valid) { + *info_packet = stream->avi_infopacket; +return ; + } +memset (&hdmi_info,0 ,sizeof (union hdmi_info_packet )); + color_space = pipe_ctx->stream->output_color_space;if (color_space ==COLOR_SPACE_UNKNOWN ) color_space = (stream->timing.pixel_encoding == PIXEL_ENCODING_RGB) ?
drivers/gpu/drm/amd/display/dc/dc_stream.h +3 -0
@@ -203,6 +203,7 @@ struct dc_stream_state {struct dc_info_packet hfvsif_infopacket;struct dc_info_packet vtem_infopacket;struct dc_info_packet adaptive_sync_infopacket; +struct dc_info_packet avi_infopacket;uint8_t dsc_packed_pps[128 ];struct rect src;/* composition area */ struct rect dst;/* stream addressable area */
@@ -335,6 +336,8 @@ struct dc_stream_update {struct dc_info_packet *hfvsif_infopacket;struct dc_info_packet *vtem_infopacket;struct dc_info_packet *adaptive_sync_infopacket; +struct dc_info_packet *avi_infopacket; +bool *dpms_off;bool integer_scaling_update;bool *allow_freesync;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 624/849 drm/amd/display: Add fast sync field in ultra sleep more for DMUB
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Allen Li <[email protected]>
[ Upstream commit b65cf4baeb24bdb5fee747679ee88f1ade5c1d6c ]
[Why&How]
We need to inform DMUB whether fast sync in ultra sleep mode is supported, so that it can disable desync error detection when the it is not enabled. This helps prevent unexpected desync errors when transitioning out of ultra sleep mode.
Add fast sync in ultra sleep mode field in replay copy setting command.
--- drivers/gpu/drm/amd/display/dc/dce/dmub_replay.c | 1 + drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dce/dmub_replay.c +1 -0
@@ -168,6 +168,7 @@ static bool dmub_replay_copy_settings(struct dmub_replay *dmub, copy_settings_data->max_deviation_line = link->dpcd_caps.pr_info.max_deviation_line; copy_settings_data->smu_optimizations_en = link->replay_settings.replay_smu_opt_enable; copy_settings_data->replay_timing_sync_supported = link->replay_settings.config.replay_timing_sync_supported; + copy_settings_data->replay_support_fast_resync_in_ultra_sleep_mode = link->replay_settings.config.replay_support_fast_resync_in_ultra_sleep_mode; copy_settings_data->debug.bitfields.enable_ips_visual_confirm = dc->dc->debug.enable_ips_visual_confirm;
drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h +5 -1
@@ -4104,10 +4104,14 @@ struct dmub_cmd_replay_copy_settings_data {* @hpo_link_enc_inst: HPO link encoder instance */ uint8_t hpo_link_enc_inst; +/** +* Determines if fast sync in ultra sleep mode is enabled/disabled. +*/ +uint8_t replay_support_fast_resync_in_ultra_sleep_mode;/** * @pad: Align structure to 4 byte boundary. */ -uint8_t pad[2 ]; +uint8_t pad[1 ]; };/**
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 625/849 drm/amd/display: Init dispclk from bootup clock for DCN314
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lo-an Chen <[email protected]>
[ Upstream commit f082daf08f2ff313bdf9cf929a28f6d888117986 ]
[Why]
Driver does not pick up and save vbios's clocks during init clocks, the dispclk in clk_mgr will keep 0 until the first update clocks. In some cases, OS changes the timing in the second set mode (lower the pixel clock), causing the driver to lower the dispclk in prepare bandwidth, which is illegal and causes grey screen.
[How]
1. Dump and save the vbios's clocks, and init the dispclk in dcn314_init_clocks.
2. Fix the condition in dcn314_update_clocks, regarding a 0kHz value.
--- .../dc/clk_mgr/dcn314/dcn314_clk_mgr.c | 142 +++++++++++++++++- .../dc/clk_mgr/dcn314/dcn314_clk_mgr.h | 5 + .../dc/resource/dcn314/dcn314_resource.c | 1 + 3 files changed, 143 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c +137 -5
@@ -77,6 +77,7 @@ static const struct IP_BASE CLK_BASE = { { { { 0x00016C00, 0x02401800, 0, 0, 0,#undef DC_LOGGER#define DC_LOGGER \ clk_mgr->base.base.ctx->logger +#define regCLK1_CLK_PLL_REQ 0x0237#define regCLK1_CLK_PLL_REQ_BASE_IDX 0
@@ -87,8 +88,70 @@ static const struct IP_BASE CLK_BASE = { { { { 0x00016C00, 0x02401800, 0, 0, 0,#define CLK1_CLK_PLL_REQ__PllSpineDiv_MASK 0x0000F000L#define CLK1_CLK_PLL_REQ__FbMult_frac_MASK 0xFFFF0000L +#define regCLK1_CLK0_DFS_CNTL 0x0269 +#define regCLK1_CLK0_DFS_CNTL_BASE_IDX 0 +#define regCLK1_CLK1_DFS_CNTL 0x026c +#define regCLK1_CLK1_DFS_CNTL_BASE_IDX 0 +#define regCLK1_CLK2_DFS_CNTL 0x026f +#define regCLK1_CLK2_DFS_CNTL_BASE_IDX 0 +#define regCLK1_CLK3_DFS_CNTL 0x0272 +#define regCLK1_CLK3_DFS_CNTL_BASE_IDX 0 +#define regCLK1_CLK4_DFS_CNTL 0x0275 +#define regCLK1_CLK4_DFS_CNTL_BASE_IDX 0 +#define regCLK1_CLK5_DFS_CNTL 0x0278 +#define regCLK1_CLK5_DFS_CNTL_BASE_IDX 0 + +#define regCLK1_CLK0_CURRENT_CNT 0x02fb +#define regCLK1_CLK0_CURRENT_CNT_BASE_IDX 0 +#define regCLK1_CLK1_CURRENT_CNT 0x02fc +#define regCLK1_CLK1_CURRENT_CNT_BASE_IDX 0 +#define regCLK1_CLK2_CURRENT_CNT 0x02fd +#define regCLK1_CLK2_CURRENT_CNT_BASE_IDX 0 +#define regCLK1_CLK3_CURRENT_CNT 0x02fe +#define regCLK1_CLK3_CURRENT_CNT_BASE_IDX 0 +#define regCLK1_CLK4_CURRENT_CNT 0x02ff +#define regCLK1_CLK4_CURRENT_CNT_BASE_IDX 0 +#define regCLK1_CLK5_CURRENT_CNT 0x0300 +#define regCLK1_CLK5_CURRENT_CNT_BASE_IDX 0 + +#define regCLK1_CLK0_BYPASS_CNTL 0x028a +#define regCLK1_CLK0_BYPASS_CNTL_BASE_IDX 0 +#define regCLK1_CLK1_BYPASS_CNTL 0x0293 +#define regCLK1_CLK1_BYPASS_CNTL_BASE_IDX 0#define regCLK1_CLK2_BYPASS_CNTL 0x029c#define regCLK1_CLK2_BYPASS_CNTL_BASE_IDX 0 +#define regCLK1_CLK3_BYPASS_CNTL 0x02a5 +#define regCLK1_CLK3_BYPASS_CNTL_BASE_IDX 0 +#define regCLK1_CLK4_BYPASS_CNTL 0x02ae +#define regCLK1_CLK4_BYPASS_CNTL_BASE_IDX 0 +#define regCLK1_CLK5_BYPASS_CNTL 0x02b7 +#define regCLK1_CLK5_BYPASS_CNTL_BASE_IDX 0 + +#define regCLK1_CLK0_DS_CNTL 0x0283 +#define regCLK1_CLK0_DS_CNTL_BASE_IDX 0 +#define regCLK1_CLK1_DS_CNTL 0x028c +#define regCLK1_CLK1_DS_CNTL_BASE_IDX 0 +#define regCLK1_CLK2_DS_CNTL 0x0295 +#define regCLK1_CLK2_DS_CNTL_BASE_IDX 0 +#define regCLK1_CLK3_DS_CNTL 0x029e +#define regCLK1_CLK3_DS_CNTL_BASE_IDX 0 +#define regCLK1_CLK4_DS_CNTL 0x02a7 +#define regCLK1_CLK4_DS_CNTL_BASE_IDX 0 +#define regCLK1_CLK5_DS_CNTL 0x02b0 +#define regCLK1_CLK5_DS_CNTL_BASE_IDX 0 + +#define regCLK1_CLK0_ALLOW_DS 0x0284 +#define regCLK1_CLK0_ALLOW_DS_BASE_IDX 0 +#define regCLK1_CLK1_ALLOW_DS 0x028d +#define regCLK1_CLK1_ALLOW_DS_BASE_IDX 0 +#define regCLK1_CLK2_ALLOW_DS 0x0296 +#define regCLK1_CLK2_ALLOW_DS_BASE_IDX 0 +#define regCLK1_CLK3_ALLOW_DS 0x029f +#define regCLK1_CLK3_ALLOW_DS_BASE_IDX 0 +#define regCLK1_CLK4_ALLOW_DS 0x02a8 +#define regCLK1_CLK4_ALLOW_DS_BASE_IDX 0 +#define regCLK1_CLK5_ALLOW_DS 0x02b1 +#define regCLK1_CLK5_ALLOW_DS_BASE_IDX 0#define CLK1_CLK2_BYPASS_CNTL__CLK2_BYPASS_SEL__SHIFT 0x0#define CLK1_CLK2_BYPASS_CNTL__CLK2_BYPASS_DIV__SHIFT 0x10
@@ -185,6 +248,8 @@ void dcn314_init_clocks(struct clk_mgr *clk_mgr) {struct clk_mgr_internal *clk_mgr_int =TO_CLK_MGR_INTERNAL (clk_mgr);uint32_t ref_dtbclk = clk_mgr->clks.ref_dtbclk_khz; +struct clk_mgr_dcn314 *clk_mgr_dcn314 =TO_CLK_MGR_DCN314 (clk_mgr_int); +struct clk_log_info log_info = {0 };memset (&(clk_mgr->clks),0 ,sizeof (struct dc_clocks ));// Assumption is that boot state always supports pstate
@@ -200,6 +265,9 @@ void dcn314_init_clocks(struct clk_mgr *clk_mgr)dce_adjust_dp_ref_freq_for_ss (clk_mgr_int, clk_mgr->dprefclk_khz); else clk_mgr->dp_dto_source_clock_in_khz = clk_mgr->dprefclk_khz; + +dcn314_dump_clk_registers (&clk_mgr->boot_snapshot, &clk_mgr_dcn314->base.base, &log_info); + clk_mgr->clks.dispclk_khz = clk_mgr->boot_snapshot.dispclk *1000 ; } void dcn314_update_clocks(struct clk_mgr *clk_mgr_base,
@@ -218,6 +286,8 @@ void dcn314_update_clocks(struct clk_mgr *clk_mgr_base,if (dc->work_arounds.skip_clock_update)return ; + display_count =dcn314_get_active_display_cnt_wa (dc, context); +/* * if it is safe to lower, but we are already in the lower state, we don't have to do anything * also if safe to lower is false, we just go in the higher state
@@ -236,7 +306,6 @@ void dcn314_update_clocks(struct clk_mgr *clk_mgr_base, }/* check that we're not already in lower */ if (clk_mgr_base->clks.pwr_state !=DCN_PWR_STATE_LOW_POWER ) { - display_count =dcn314_get_active_display_cnt_wa (dc, context);/* if we can go lower, go lower */ if (display_count ==0 ) {union display_idle_optimization_u idle_info = {0 };
@@ -293,11 +362,19 @@ void dcn314_update_clocks(struct clk_mgr *clk_mgr_base, update_dppclk = true; } -if (should_set_clock (safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz)) { +if (should_set_clock (safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz) && + (new_clocks->dispclk_khz >0 || (safe_to_lower && display_count ==0 ))) { +int requested_dispclk_khz = new_clocks->dispclk_khz; +dcn314_disable_otg_wa (clk_mgr_base, context, safe_to_lower, true); +/* Clamp the requested clock to PMFW based on their limit. */ +if (dc->debug.min_disp_clk_khz >0 && requested_dispclk_khz < dc->debug.min_disp_clk_khz) + requested_dispclk_khz = dc->debug.min_disp_clk_khz; + +dcn314_smu_set_dispclk (clk_mgr, requested_dispclk_khz); clk_mgr_base->clks.dispclk_khz = new_clocks->dispclk_khz; -dcn314_smu_set_dispclk (clk_mgr, clk_mgr_base->clks.dispclk_khz); +dcn314_disable_otg_wa (clk_mgr_base, context, safe_to_lower, false); update_dispclk = true;
@@ -385,10 +462,65 @@ bool dcn314_are_clock_states_equal(struct dc_clocks *a,return true; } -static void dcn314_dump_clk_registers (struct clk_state_registers_and_bypass *regs_and_bypass, + +static void dcn314_dump_clk_registers_internal (struct dcn35_clk_internal *internal,struct clk_mgr *clk_mgr_base) +{ +struct clk_mgr_internal *clk_mgr =TO_CLK_MGR_INTERNAL (clk_mgr_base); + +// read dtbclk + internal->CLK1_CLK4_CURRENT_CNT =REG_READ (CLK1_CLK4_CURRENT_CNT ); + internal->CLK1_CLK4_BYPASS_CNTL =REG_READ (CLK1_CLK4_BYPASS_CNTL ); + +// read dcfclk + internal->CLK1_CLK3_CURRENT_CNT =REG_READ (CLK1_CLK3_CURRENT_CNT ); + internal->CLK1_CLK3_BYPASS_CNTL =REG_READ (CLK1_CLK3_BYPASS_CNTL ); + +// read dcf deep sleep divider + internal->CLK1_CLK3_DS_CNTL =REG_READ (CLK1_CLK3_DS_CNTL ); + internal->CLK1_CLK3_ALLOW_DS =REG_READ (CLK1_CLK3_ALLOW_DS ); + +// read dppclk + internal->CLK1_CLK1_CURRENT_CNT =REG_READ (CLK1_CLK1_CURRENT_CNT ); + internal->CLK1_CLK1_BYPASS_CNTL =REG_READ (CLK1_CLK1_BYPASS_CNTL ); + +// read dprefclk + internal->CLK1_CLK2_CURRENT_CNT =REG_READ (CLK1_CLK2_CURRENT_CNT ); + internal->CLK1_CLK2_BYPASS_CNTL =REG_READ (CLK1_CLK2_BYPASS_CNTL ); + +// read dispclk + internal->CLK1_CLK0_CURRENT_CNT =REG_READ (CLK1_CLK0_CURRENT_CNT ); + internal->CLK1_CLK0_BYPASS_CNTL =REG_READ (CLK1_CLK0_BYPASS_CNTL ); +} + +void dcn314_dump_clk_registers (struct clk_state_registers_and_bypass *regs_and_bypass,struct clk_mgr *clk_mgr_base,struct clk_log_info *log_info) { -return ; + +struct dcn35_clk_internal internal = {0 }; + +dcn314_dump_clk_registers_internal (&internal, clk_mgr_base); + + regs_and_bypass->dcfclk = internal.CLK1_CLK3_CURRENT_CNT /10 ; + regs_and_bypass->dcf_deep_sleep_divider = internal.CLK1_CLK3_DS_CNTL /10 ; + regs_and_bypass->dcf_deep_sleep_allow = internal.CLK1_CLK3_ALLOW_DS; + regs_and_bypass->dprefclk = internal.CLK1_CLK2_CURRENT_CNT /10 ; + regs_and_bypass->dispclk = internal.CLK1_CLK0_CURRENT_CNT /10 ; + regs_and_bypass->dppclk = internal.CLK1_CLK1_CURRENT_CNT /10 ; + regs_and_bypass->dtbclk = internal.CLK1_CLK4_CURRENT_CNT /10 ; + + regs_and_bypass->dppclk_bypass = internal.CLK1_CLK1_BYPASS_CNTL &0x0007 ; +if (regs_and_bypass->dppclk_bypass <0 || regs_and_bypass->dppclk_bypass >4 ) + regs_and_bypass->dppclk_bypass =0 ; + regs_and_bypass->dcfclk_bypass = internal.CLK1_CLK3_BYPASS_CNTL &0x0007 ; +if (regs_and_bypass->dcfclk_bypass <0 || regs_and_bypass->dcfclk_bypass >4 ) + regs_and_bypass->dcfclk_bypass =0 ; + regs_and_bypass->dispclk_bypass = internal.CLK1_CLK0_BYPASS_CNTL &0x0007 ; +if (regs_and_bypass->dispclk_bypass <0 || regs_and_bypass->dispclk_bypass >4 ) + regs_and_bypass->dispclk_bypass =0 ; + regs_and_bypass->dprefclk_bypass = internal.CLK1_CLK2_BYPASS_CNTL &0x0007 ; +if (regs_and_bypass->dprefclk_bypass <0 || regs_and_bypass->dprefclk_bypass >4 ) + regs_and_bypass->dprefclk_bypass =0 ; + }static struct clk_bw_params dcn314_bw_params = {
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.h +5 -0
@@ -65,4 +65,9 @@ void dcn314_clk_mgr_construct(struct dc_context *ctx,void dcn314_clk_mgr_destroy (struct clk_mgr_internal *clk_mgr_int); + +void dcn314_dump_clk_registers (struct clk_state_registers_and_bypass *regs_and_bypass, +struct clk_mgr *clk_mgr_base,struct clk_log_info *log_info); + +#endif //__DCN314_CLK_MGR_H__
drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c +1 -0
@@ -927,6 +927,7 @@ static const struct dc_debug_options debug_defaults_drv = { .enable_legacy_fast_update = true, .using_dml2 = false, .disable_dsc_power_gate = true, + .min_disp_clk_khz = 100000, };static const struct dc_panel_config panel_config_defaults = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 626/849 drm/amd/display: Fix for test crash due to power gating
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sridevi Arvindekar <[email protected]>
[ Upstream commit 0bf6b216d4783cb51f9af05a49d3cce4fc22dc24 ]
[Why/How]
Call power gating routine only if it is defined.
--- drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c +2 -1
@@ -3129,7 +3129,8 @@ void dcn20_fpga_init_hw(struct dc *dc) res_pool->dccg->funcs->dccg_init (res_pool->dccg);//Enable ability to power gate / don't force power on permanently - hws->funcs.enable_power_gating_plane (hws, true); +if (hws->funcs.enable_power_gating_plane) + hws->funcs.enable_power_gating_plane (hws, true);// Specific to FPGA dccg and registers REG_WRITE (RBBMIF_TIMEOUT_DIS ,0xFFFFFFFF );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 627/849 drm/amd/display: change dc stream color settings only in atomic commit
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Melissa Wen <[email protected]>
[ Upstream commit 51cb93aa0c4a9bb126b76f6e9fd640d88de25cee ]
Don't update DC stream color components during atomic check. The driver will continue validating the new CRTC color state but will not change DC stream color components. The DC stream color state will only be programmed at commit time in the atomic_setup_commit stage.
It fixes gamma LUT loss reported by KDE users when changing brightness quickly or changing Display settings (such as overscan) with nightlight on and HDR. As KWin can do a test commit with color settings different from those that should be applied in a non-test-only commit, if the driver changes DC stream color state in atomic check, this state can be eventually HW programmed in commit tail, instead of the respective state set by the non-blocking commit.
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 2 + .../amd/display/amdgpu_dm/amdgpu_dm_color.c | 86 ++++++++++++++----- 3 files changed, 66 insertions(+), 24 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +1 -1
@@ -11105,7 +11105,7 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,if (dm_new_crtc_state->base.color_mgmt_changed || dm_old_crtc_state->regamma_tf != dm_new_crtc_state->regamma_tf ||drm_atomic_crtc_needs_modeset (new_crtc_state)) { - ret =amdgpu_dm_update_crtc_color_mgmt (dm_new_crtc_state); + ret =amdgpu_dm_check_crtc_color_mgmt (dm_new_crtc_state, true);if (ret) goto fail; }
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +2 -0
@@ -1037,6 +1037,8 @@ void amdgpu_dm_init_color_mod(void);int amdgpu_dm_create_color_properties (struct amdgpu_device *adev);int amdgpu_dm_verify_lut_sizes (const struct drm_crtc_state *crtc_state);int amdgpu_dm_update_crtc_color_mgmt (struct dm_crtc_state *crtc); +int amdgpu_dm_check_crtc_color_mgmt (struct dm_crtc_state *crtc, +bool check_only);int amdgpu_dm_update_plane_color_mgmt (struct dm_crtc_state *crtc,struct drm_plane_state *plane_state,struct dc_plane_state *dc_plane_state);
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c +63 -23
144 lines not on this page · raw message
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 628/849 NFSv4: handle ERR_GRACE on delegation recalls
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Olga Kornievskaia <[email protected]>
[ Upstream commit be390f95242785adbf37d7b8a5101dd2f2ba891b ]
RFC7530 states that clients should be prepared for the return of NFS4ERR_GRACE errors for non-reclaim lock and I/O requests.
--- fs/nfs/nfs4proc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/nfs/nfs4proc.c +2 -2
@@ -7872,10 +7872,10 @@ int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state,return err;do { err =_nfs4_do_setlk (state,F_SETLK , fl,NFS_LOCK_NEW ); -if (err != -NFS4ERR_DELAY ) +if (err != -NFS4ERR_DELAY && err != -NFS4ERR_GRACE )break ;ssleep (1 ); - }while (err == -NFS4ERR_DELAY ); + }while (err == -NFS4ERR_DELAY || err == -NFSERR_GRACE );return nfs4_handle_delegation_recall_error (server, state, stateid, fl, err); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 629/849 NFSv4.1: fix mount hang after CREATE_SESSION failure
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anthony Iliopoulos <[email protected]>
[ Upstream commit bf75ad096820fee5da40e671ebb32de725a1c417 ]
When client initialization goes through server trunking discovery, it schedules the state manager and then sleeps waiting for nfs_client initialization completion.
The state manager can fail during state recovery, and specifically in lease establishment as nfs41_init_clientid() will bail out in case of errors returned from nfs4_proc_create_session(), without ever marking the client ready. The session creation can fail for a variety of reasons e.g. during backchannel parameter negotiation, with status -EINVAL.
The error status will propagate all the way to the nfs4_state_manager but the client status will not be marked, and thus the mount process will remain blocked waiting.
Fix it by adding -EINVAL error handling to nfs4_state_manager().
--- fs/nfs/nfs4state.c | 3 +++ 1 file changed, 3 insertions(+)
fs/nfs/nfs4state.c +3 -0
@@ -2744,6 +2744,9 @@ static void nfs4_state_manager(struct nfs_client *clp)case -ENETUNREACH :nfs_mark_client_ready (clp, -EIO );break ; +case -EINVAL : +nfs_mark_client_ready (clp, status); +break ;default :ssleep (1 );break ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 630/849 nfs4_setup_readdir(): insufficient locking for ->d_parent->d_inode dereferencing
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 a890a2e339b929dbd843328f9a92a1625404fe63 ]
Theoretically it's an oopsable race, but I don't believe one can manage to hit it on real hardware; might become doable on a KVM, but it still won't be easy to attack.
Anyway, it's easy to deal with - since xdr_encode_hyper() is just a call of put_unaligned_be64(), we can put that under ->d_lock and be done with that.
--- fs/nfs/nfs4proc.c | 2 ++ 1 file changed, 2 insertions(+)
fs/nfs/nfs4proc.c +2 -0
@@ -391,7 +391,9 @@ static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dent *p++ =htonl (attrs);/* bitmap */ *p++ =htonl (12 );/* attribute buffer length */ *p++ =htonl (NF4DIR ); +spin_lock (&dentry->d_lock); p =xdr_encode_hyper (p,NFS_FILEID (d_inode (dentry->d_parent))); +spin_unlock (&dentry->d_lock); readdir->pgbase = (char *)p - (char *)start; readdir->count -= readdir->pgbase;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 631/849 net: bridge: Install FDB for bridge MAC on VLAN 0
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 cd9a9562b2559973aa1b68c3af63021a2c5fd022 ]
Currently, after the bridge is created, the FDB does not hold an FDB entry for the bridge MAC on VLAN 0:
# ip link add name br up type bridge # ip -br link show dev br br UNKNOWN 92:19:8c:4e:01:ed <BROADCAST,MULTICAST,UP,LOWER_UP> # bridge fdb show | grep 92:19:8c:4e:01:ed 92:19:8c:4e:01:ed dev br vlan 1 master br permanent
Later when the bridge MAC is changed, or in fact when the address is given during netdevice creation, the entry appears:
# ip link add name br up address 00:11:22:33:44:55 type bridge # bridge fdb show | grep 00:11:22:33:44:55 00:11:22:33:44:55 dev br vlan 1 master br permanent 00:11:22:33:44:55 dev br master br permanent
However when the bridge address is set by the user to the current bridge address before the first port is enslaved, none of the address handlers gets invoked, because the address is not actually changed. The address is however marked as NET_ADDR_SET. Then when a port is enslaved, the address is not changed, because it is NET_ADDR_SET. Thus the VLAN 0 entry is not added, and it has not been added previously either:
# ip link add name br up type bridge # ip -br link show dev br br UNKNOWN 7e:f0:a8:1a:be:c2 <BROADCAST,MULTICAST,UP,LOWER_UP> # ip link set dev br addr 7e:f0:a8:1a:be:c2 # ip link add name v up type veth # ip link set dev v master br # ip -br link show dev br br UNKNOWN 7e:f0:a8:1a:be:c2 <BROADCAST,MULTICAST,UP,LOWER_UP> # bridge fdb | grep 7e:f0:a8:1a:be:c2 7e:f0:a8:1a:be:c2 dev br vlan 1 master br permanent
Then when the bridge MAC is used as DMAC, and br_handle_frame_finish() looks up an FDB entry with VLAN=0, it doesn't find any, and floods the traffic instead of passing it up.
Fix this by simply adding the VLAN 0 FDB entry for the bridge itself always on netdevice creation. This also makes the behavior consistent with how ports are treated: ports always have an FDB entry for each member VLAN as well as VLAN 0.
--- net/bridge/br.c | 5 +++++ 1 file changed, 5 insertions(+)
net/bridge/br.c +5 -0
@@ -37,6 +37,11 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, vint err;if (netif_is_bridge_master (dev)) { +struct net_bridge *br =netdev_priv (dev); + +if (event ==NETDEV_REGISTER ) +br_fdb_change_mac_address (br, dev->dev_addr); + err =br_vlan_bridge_event (dev, event, ptr);if (err)return notifier_from_errno (err);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 632/849 net: phy: dp83640: improve phydev and driver removal handling
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit 42e2a9e11a1dcb81c83d50d18c547dc9a1c6d6ed ]
Once the last user of a clock has been removed, the clock should be removed. So far orphaned clocks are cleaned up in dp83640_free_clocks() only. Add the logic to remove orphaned clocks in dp83640_remove(). This allows to simplify the code, and use standard macro module_phy_driver(). dp83640 was the last external user of phy_driver_register(), so we can stop exporting this function afterwards.
--- drivers/net/phy/dp83640.c | 58 ++++++++++++++------------------------- 1 file changed, 20 insertions(+), 38 deletions(-)
drivers/net/phy/dp83640.c +20 -38
@@ -953,30 +953,6 @@ static void decode_status_frame(struct dp83640_private *dp83640, } } -static void dp83640_free_clocks (void ) -{ -struct dp83640_clock *clock; -struct list_head *this, *next; - -mutex_lock (&phyter_clocks_lock); - -list_for_each_safe (this, next, &phyter_clocks) { - clock = list_entry(this, struct dp83640_clock, list); -if (!list_empty (&clock->phylist)) { -pr_warn ("phy list non-empty while unloading\n" ); -BUG (); - } -list_del (&clock->list); -mutex_destroy (&clock->extreg_lock); -mutex_destroy (&clock->clock_lock); -put_device (&clock->bus->dev); -kfree (clock->caps.pin_config); -kfree (clock); - } - -mutex_unlock (&phyter_clocks_lock); -} -static void dp83640_clock_init (struct dp83640_clock *clock,struct mii_bus *bus) {INIT_LIST_HEAD (&clock->list);
@@ -1479,6 +1455,7 @@ static void dp83640_remove(struct phy_device *phydev)struct dp83640_clock *clock;struct list_head *this, *next;struct dp83640_private *tmp, *dp83640 = phydev->priv; +bool remove_clock = false;if (phydev->mdio.addr ==BROADCAST_ADDR )return ;
@@ -1506,11 +1483,27 @@ static void dp83640_remove(struct phy_device *phydev) } } +if (!clock->chosen &&list_empty (&clock->phylist)) + remove_clock = true; +dp83640_clock_put (clock);kfree (dp83640); + +if (remove_clock) { +mutex_lock (&phyter_clocks_lock); +list_del (&clock->list); +mutex_unlock (&phyter_clocks_lock); + +mutex_destroy (&clock->extreg_lock); +mutex_destroy (&clock->clock_lock); +put_device (&clock->bus->dev); +kfree (clock->caps.pin_config); +kfree (clock); + } } -static struct phy_driver dp83640_driver = { +static struct phy_driver dp83640_driver[] = { +{ .phy_id =DP83640_PHY_ID , .phy_id_mask =0xfffffff0 , .name ="NatSemi DP83640" ,
@@ -1521,26 +1514,15 @@ static struct phy_driver dp83640_driver = { .config_init = dp83640_config_init, .config_intr = dp83640_config_intr, .handle_interrupt = dp83640_handle_interrupt, +}, }; -static int __init dp83640_init (void ) -{ -return phy_driver_register (&dp83640_driver,THIS_MODULE ); -} - -static void __exit dp83640_exit(void) -{ -dp83640_free_clocks (); -phy_driver_unregister (&dp83640_driver); -} +module_phy_driver (dp83640_driver);MODULE_DESCRIPTION ("National Semiconductor DP83640 PHY driver" );MODULE_AUTHOR ("Richard Cochran <[email protected]>" );MODULE_LICENSE ("GPL" ); -module_init (dp83640_init); -module_exit (dp83640_exit); -static const struct mdio_device_id __maybe_unused dp83640_tbl[] = { {DP83640_PHY_ID ,0xfffffff0 }, { }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 633/849 scsi: ufs: core: Change MCQ interrupt enable 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 253757797973c54ea967f8fd8f40d16e4a78e6d4 ]
Move the MCQ interrupt enable process to ufshcd_mcq_make_queues_operational() to ensure that interrupts are set correctly when making queues operational, similar to ufshcd_make_hba_operational(). This change addresses the issue where ufshcd_mcq_make_queues_operational() was not fully operational due to missing interrupt enablement.
This change only affects host drivers that call ufshcd_mcq_make_queues_operational(), i.e. ufs-mediatek.
--- drivers/ufs/core/ufs-mcq.c | 11 +++++++++++ drivers/ufs/core/ufshcd.c | 12 +----------- include/ufs/ufshcd.h | 1 + 3 files changed, 13 insertions(+), 11 deletions(-)
drivers/ufs/core/ufs-mcq.c +11 -0
@@ -29,6 +29,10 @@#define MCQ_ENTRY_SIZE_IN_DWORD 8#define CQE_UCD_BA GENMASK_ULL(63, 7) +#define UFSHCD_ENABLE_MCQ_INTRS (UTP_TASK_REQ_COMPL |\ + UFSHCD_ERROR_MASK |\ + MCQ_CQ_EVENT_STATUS) +/* Max mcq register polling time in microseconds */ #define MCQ_POLL_US 500000
@@ -355,9 +359,16 @@ EXPORT_SYMBOL_GPL(ufshcd_mcq_poll_cqe_lock);void ufshcd_mcq_make_queues_operational (struct ufs_hba *hba) {struct ufs_hw_queue *hwq; +u32 intrs;u16 qsize;int i; +/* Enable required interrupts */ + intrs =UFSHCD_ENABLE_MCQ_INTRS ; +if (hba->quirks &UFSHCD_QUIRK_MCQ_BROKEN_INTR ) + intrs &= ~MCQ_CQ_EVENT_STATUS ; +ufshcd_enable_intr (hba, intrs); +for (i =0 ; i < hba->nr_hw_queues; i++) { hwq = &hba->uhq[i]; hwq->id = i;
drivers/ufs/core/ufshcd.c +1 -11
@@ -45,11 +45,6 @@ UTP_TASK_REQ_COMPL |\ UFSHCD_ERROR_MASK) -#define UFSHCD_ENABLE_MCQ_INTRS (UTP_TASK_REQ_COMPL |\ - UFSHCD_ERROR_MASK |\ - MCQ_CQ_EVENT_STATUS) - -/* UIC command timeout, unit: ms */ enum {UIC_CMD_TIMEOUT_DEFAULT =500 ,
@@ -372,7 +367,7 @@ EXPORT_SYMBOL_GPL(ufshcd_disable_irq);* @hba: per adapter instance * @intrs: interrupt bits */ -static void ufshcd_enable_intr (struct ufs_hba *hba,u32 intrs) +void ufshcd_enable_intr (struct ufs_hba *hba,u32 intrs) {u32 old_val =ufshcd_readl (hba,REG_INTERRUPT_ENABLE );u32 new_val = old_val | intrs;
@@ -8925,16 +8920,11 @@ static int ufshcd_alloc_mcq(struct ufs_hba *hba)static void ufshcd_config_mcq (struct ufs_hba *hba) {int ret; -u32 intrs; ret =ufshcd_mcq_vops_config_esi (hba); hba->mcq_esi_enabled = !ret;dev_info (hba->dev,"ESI %sconfigured\n" , ret ?"is not " :"" ); - intrs =UFSHCD_ENABLE_MCQ_INTRS ; -if (hba->quirks &UFSHCD_QUIRK_MCQ_BROKEN_INTR ) - intrs &= ~MCQ_CQ_EVENT_STATUS ; -ufshcd_enable_intr (hba, intrs);ufshcd_mcq_make_queues_operational (hba);ufshcd_mcq_config_mac (hba, hba->nutrs);
include/ufs/ufshcd.h +1 -0
@@ -1321,6 +1321,7 @@ static inline void ufshcd_rmwl(struct ufs_hba *hba, u32 mask, u32 val, u32 reg)void ufshcd_enable_irq (struct ufs_hba *hba);void ufshcd_disable_irq (struct ufs_hba *hba); +void ufshcd_enable_intr (struct ufs_hba *hba,u32 intrs);int ufshcd_alloc_host (struct device *,struct ufs_hba **);int ufshcd_hba_enable (struct ufs_hba *hba);int ufshcd_init (struct ufs_hba *,void __iomem *,unsigned int );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 634/849 scsi: libfc: Fix potential buffer overflow in fc_ct_ms_fill()
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 072fdd4b0be9b9051bdf75f36d0227aa705074ba ]
The fc_ct_ms_fill() helper currently formats the OS name and version into entry->value using "%s v%s". Since init_utsname()->sysname and ->release are unbounded strings, snprintf() may attempt to write more than FC_FDMI_HBA_ATTR_OSNAMEVERSION_LEN bytes, triggering a -Wformat-truncation warning with W=1.
In file included from drivers/scsi/libfc/fc_elsct.c:18:drivers/scsi/libfc/fc_encode.h: In function ‘fc_ct_ms_fill.constprop’:drivers/scsi/libfc/fc_encode.h:359:30: error: ‘%s’ directive output may be truncated writing up to 64 bytes into a region of size between 62 and 126 [-Werror=format-truncation=]
359 | "%s v%s",
| ^~
360 | init_utsname()->sysname,
361 | init_utsname()->release);
| ~~~~~~~~~~~~~~~~~~~~~~~
drivers/scsi/libfc/fc_encode.h:357:17: note: ‘snprintf’ output between
3 and 131 bytes into a destination of size 128
357 | snprintf((char *)&entry->value,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
358 | FC_FDMI_HBA_ATTR_OSNAMEVERSION_LEN,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
359 | "%s v%s",
| ~~~~~~~~~
360 | init_utsname()->sysname,
| ~~~~~~~~~~~~~~~~~~~~~~~~
361 | init_utsname()->release);
| ~~~~~~~~~~~~~~~~~~~~~~~~Fix this by using "%.62s v%.62s", which ensures sysname and release are truncated to fit within the 128-byte field defined by FC_FDMI_HBA_ATTR_OSNAMEVERSION_LEN.
[mkp: clarified commit description]
--- drivers/scsi/libfc/fc_encode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/libfc/fc_encode.h +1 -1
@@ -356,7 +356,7 @@ static inline int fc_ct_ms_fill(struct fc_lport *lport,put_unaligned_be16 (len, &entry->len);snprintf ((char *)&entry->value,FC_FDMI_HBA_ATTR_OSNAMEVERSION_LEN , -"%s v%s" , +"%.62s v%.62s" ,init_utsname ()->sysname,init_utsname ()->release);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 635/849 accel/habanalabs/gaudi2: fix BMON disable configuration
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vered Yavniely <[email protected]>
[ Upstream commit b4fd8e56c9a3b614370fde2d45aec1032eb67ddd ]
Change the BMON_CR register value back to its original state before enabling, so that BMON does not continue to collect information after being disabled.
--- drivers/accel/habanalabs/gaudi2/gaudi2_coresight.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/accel/habanalabs/gaudi2/gaudi2_coresight.c +1 -1
@@ -2426,7 +2426,7 @@ static int gaudi2_config_bmon(struct hl_device *hdev, struct hl_debug_params *paWREG32 (base_reg + mmBMON_ADDRH_E3_OFFSET,0 );WREG32 (base_reg + mmBMON_REDUCTION_OFFSET,0 );WREG32 (base_reg + mmBMON_STM_TRC_OFFSET,0x7 | (0xA <<8 )); -WREG32 (base_reg + mmBMON_CR_OFFSET,0x77 |0xf <<24 ); +WREG32 (base_reg + mmBMON_CR_OFFSET,0x41 ); }return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 636/849 scsi: mpt3sas: Add support for 22.5 Gbps SAS link rate
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ranjan Kumar <[email protected]>
[ Upstream commit 4be7599d6b27bade41bfccca42901b917c01c30c ]
Add handling for MPI26_SAS_NEG_LINK_RATE_22_5 in _transport_convert_phy_link_rate(). This maps the new 22.5 Gbps negotiated rate to SAS_LINK_RATE_22_5_GBPS, to get correct PHY link speeds.
Message-Id: <[email protected]>
--- drivers/scsi/mpt3sas/mpt3sas_transport.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/scsi/mpt3sas/mpt3sas_transport.c +3 -0
@@ -166,6 +166,9 @@ _transport_convert_phy_link_rate(u8 link_rate)case MPI25_SAS_NEG_LINK_RATE_12_0 : rc =SAS_LINK_RATE_12_0_GBPS ;break ; +case MPI26_SAS_NEG_LINK_RATE_22_5 : + rc =SAS_LINK_RATE_22_5_GBPS ; +break ;case MPI2_SAS_NEG_LINK_RATE_PHY_DISABLED : rc =SAS_PHY_DISABLED ;break ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 637/849 accel/habanalabs: return ENOMEM if less than requested pages were pinned
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomer Tayar <[email protected]>
[ Upstream commit 9f5067531c9b79318c4e48a933cb2694f53f3de2 ]
EFAULT is currently returned if less than requested user pages are pinned. This value means a "bad address" which might be confusing to the user, as the address of the given user memory is not necessarily "bad".
Modify the return value to ENOMEM, as "out of memory" is more suitable in this case.
--- drivers/accel/habanalabs/common/memory.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/accel/habanalabs/common/memory.c +1 -1
@@ -2332,7 +2332,7 @@ static int get_user_memory(struct hl_device *hdev, u64 addr, u64 size,if (rc <0 ) goto destroy_pages; npages = rc; - rc = -EFAULT ; + rc = -ENOMEM ; goto put_pages; } userptr->npages = npages;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 638/849 accel/habanalabs/gaudi2: read preboot status after recovering from dirty state
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Sinyuk <[email protected]>
[ Upstream commit a0d866bab184161ba155b352650083bf6695e50e ]
Dirty state can occur when the host VM undergoes a reset while the device does not. In such a case, the driver must reset the device before it can be used again. As part of this reset, the device capabilities are zeroed. Therefore, the driver must read the Preboot status again to learn the Preboot state, capabilities, and security configuration.
--- drivers/accel/habanalabs/gaudi2/gaudi2.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/accel/habanalabs/gaudi2/gaudi2.c +7 -1
@@ -3150,7 +3150,6 @@ static int gaudi2_early_init(struct hl_device *hdev) rc =hl_fw_read_preboot_status (hdev);if (rc) {if (hdev->reset_on_preboot_fail) -/* we are already on failure flow, so don't check if hw_fini fails. */ hdev->asic_funcs->hw_fini (hdev, true, false); goto pci_fini; }
@@ -3162,6 +3161,13 @@ static int gaudi2_early_init(struct hl_device *hdev)dev_err (hdev->dev,"failed to reset HW in dirty state (%d)\n" , rc); goto pci_fini; } + + rc =hl_fw_read_preboot_status (hdev); +if (rc) { +if (hdev->reset_on_preboot_fail) + hdev->asic_funcs->hw_fini (hdev, true, false); + goto pci_fini; + } }return 0 ;
Signature · 1 line
2.51.0
Re: [PATCH 6.17 638/849] accel/habanalabs/gaudi2: read preboot status after recovering from dirty state
Quoted 14 lines · Greg Kroah-Hartman
6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Sinyuk <[email protected]>
[ Upstream commit
a0d866bab184161ba155b352650083bf6695e50e]Dirty state can occur when the host VM undergoes a reset while the device does not. In such a case, the driver must reset the device before it can be used again. As part of this reset, the device capabilities are zeroed. Therefore, the driver must read the Preboot status again to learn the Preboot state, capabilities, and security configuration.
Quoted 4 lines
Signed-off-by Konstantin Sinyuk <[email protected]>Reviewed-by Koby Elbaz <[email protected]>Signed-off-by Koby Elbaz <[email protected]>Signed-off-by Sasha Levin <[email protected]>
Looks good for 6.17-stable. The backport correctly re-reads the preboot status after recovering from a dirty state, restoring accurate capability and security information following a VM-only reset.
Thanks,
Konstantin
Greg Kroah-Hartman
maintainerPATCH 639/849 accel/habanalabs: support mapping cb with vmalloc-backed coherent memory
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Moti Haimovski <[email protected]>
[ Upstream commit 513024d5a0e34fd34247043f1876b6138ca52847 ]
When IOMMU is enabled, dma_alloc_coherent() with GFP_USER may return addresses from the vmalloc range. If such an address is mapped without VM_MIXEDMAP, vm_insert_page() will trigger a BUG_ON due to the VM_PFNMAP restriction.
Fix this by checking for vmalloc addresses and setting VM_MIXEDMAP in the VMA before mapping. This ensures safe mapping and avoids kernel crashes. The memory is still driver-allocated and cannot be accessed directly by userspace.
--- drivers/accel/habanalabs/gaudi/gaudi.c | 19 +++++++++++++++++++ drivers/accel/habanalabs/gaudi2/gaudi2.c | 7 +++++++ 2 files changed, 26 insertions(+)
drivers/accel/habanalabs/gaudi/gaudi.c +19 -0
@@ -4168,10 +4168,29 @@ static int gaudi_mmap(struct hl_device *hdev, struct vm_area_struct *vma,vm_flags_set (vma,VM_IO |VM_PFNMAP |VM_DONTEXPAND |VM_DONTDUMP |VM_DONTCOPY |VM_NORESERVE ); +#ifdef _HAS_DMA_MMAP_COHERENT +/* +* If dma_alloc_coherent() returns a vmalloc address, set VM_MIXEDMAP +* so vm_insert_page() can handle it safely. Without this, the kernel +* may BUG_ON due to VM_PFNMAP. +*/ +if (is_vmalloc_addr (cpu_addr)) +vm_flags_set (vma,VM_MIXEDMAP ); + rc =dma_mmap_coherent (hdev->dev, vma, cpu_addr, (dma_addr -HOST_PHYS_BASE ), size);if (rc)dev_err (hdev->dev,"dma_mmap_coherent error %d" , rc); +#else + + rc =remap_pfn_range (vma, vma->vm_start, +virt_to_phys (cpu_addr) >>PAGE_SHIFT , + size, vma->vm_page_prot); +if (rc) +dev_err (hdev->dev,"remap_pfn_range error %d" , rc); + +#endif +return rc; }
drivers/accel/habanalabs/gaudi2/gaudi2.c +7 -0
@@ -6490,6 +6490,13 @@ static int gaudi2_mmap(struct hl_device *hdev, struct vm_area_struct *vma, VM_DONTCOPY | VM_NORESERVE);#ifdef _HAS_DMA_MMAP_COHERENT +/* +* If dma_alloc_coherent() returns a vmalloc address, set VM_MIXEDMAP +* so vm_insert_page() can handle it safely. Without this, the kernel +* may BUG_ON due to VM_PFNMAP. +*/ +if (is_vmalloc_addr (cpu_addr)) +vm_flags_set (vma,VM_MIXEDMAP ); rc =dma_mmap_coherent (hdev->dev, vma, cpu_addr, dma_addr, size);if (rc)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 640/849 ASoC: renesas: msiof: add .symmetric_xxx on snd_soc_dai_driver
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuninori Morimoto <[email protected]>
[ Upstream commit ab77fa5533e4d1dcfdd2711b9b1e166e4ed57dab ]
MSIOF TX/RX are sharing same clock. Adds .symmetric_xxx flags.
--- sound/soc/renesas/rcar/msiof.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/renesas/rcar/msiof.c +3 -0
@@ -292,6 +292,9 @@ static struct snd_soc_dai_driver msiof_dai_driver = { .channels_max = 2, }, .ops = &msiof_dai_ops, + .symmetric_rate = 1, + .symmetric_channels = 1, + .symmetric_sample_bits = 1, }; static struct snd_pcm_hardware msiof_pcm_hardware = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 641/849 ASoC: renesas: msiof: use reset controller
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuninori Morimoto <[email protected]>
[ Upstream commit 25226abc1affd4bf4f6dd415d475b76e7a273fa8 ]
MSIOF has TXRST/RXRST to reset FIFO, but it shouldn't be used during SYNC signal was asserted, because it will be cause of HW issue.
When MSIOF is used as Sound driver, this driver is assuming it is used as clock consumer mode (= Codec is clock provider). This means, it can't control SYNC signal by itself.
We need to use SW reset (= reset_control_xxx()) instead of TXRST/RXRST.
--- sound/soc/renesas/rcar/msiof.c | 39 +++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-)
sound/soc/renesas/rcar/msiof.c +38 -1
@@ -24,12 +24,25 @@* Clock/Frame Consumer Mode. */ +/* +* [NOTE-RESET] +* +* MSIOF has TXRST/RXRST to reset FIFO, but it shouldn't be used during SYNC signal was asserted, +* because it will be cause of HW issue. +* +* When MSIOF is used as Sound driver, this driver is assuming it is used as clock consumer mode +* (= Codec is clock provider). This means, it can't control SYNC signal by itself. +* +* We need to use SW reset (= reset_control_xxx()) instead of TXRST/RXRST. +*/ +#include <linux/module.h> #include <linux/of.h> #include <linux/of_dma.h> #include <linux/of_graph.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> +#include <linux/reset.h> #include <linux/spi/sh_msiof.h> #include <sound/dmaengine_pcm.h> #include <sound/soc.h>
@@ -61,10 +74,13 @@struct msiof_priv {struct device *dev;struct snd_pcm_substream *substream[SNDRV_PCM_STREAM_LAST +1 ]; +struct reset_control *reset;spinlock_t lock;void __iomem *base;resource_size_t phy_addr; +int count; +/* for error */ int err_syc[SNDRV_PCM_STREAM_LAST +1 ];int err_ovf[SNDRV_PCM_STREAM_LAST +1 ];
@@ -126,6 +142,16 @@ static int msiof_hw_start(struct snd_soc_component *component,* RX: Fig 109.15 */ +/* +* Use reset_control_xx() instead of TXRST/RXRST. +* see +* [NOTE-RESET] +*/ +if (!priv->count) +reset_control_deassert (priv->reset); + + priv->count++; +/* reset errors */ priv->err_syc[substream->stream] = priv->err_ovf[substream->stream] =
@@ -144,7 +170,6 @@ static int msiof_hw_start(struct snd_soc_component *component, val =FIELD_PREP (SIMDR2_BITLEN1 , width -1 );msiof_write (priv,SITMDR2 , val |FIELD_PREP (SIMDR2_GRP ,1 ));msiof_write (priv,SITMDR3 , val); - }/* SIRMDRx */ else {
@@ -217,6 +242,11 @@ static int msiof_hw_stop(struct snd_soc_component *component, priv->err_ovf[substream->stream], priv->err_udf[substream->stream]); + priv->count--; + +if (!priv->count) +reset_control_assert (priv->reset); +return 0 ; }
@@ -493,12 +523,19 @@ static int msiof_probe(struct platform_device *pdev)if (IS_ERR (priv->base))return PTR_ERR (priv->base); + priv->reset =devm_reset_control_get_exclusive (dev,NULL ); +if (IS_ERR (priv->reset)) +return PTR_ERR (priv->reset); + +reset_control_assert (priv->reset); + ret =devm_request_irq (dev, irq, msiof_interrupt,0 ,dev_name (dev), priv);if (ret)return ret; priv->dev = dev; priv->phy_addr = res->start; + priv->count =0 ;spin_lock_init (&priv->lock);platform_set_drvdata (pdev, priv);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 642/849 ASoC: renesas: msiof: tidyup DMAC stop timing
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuninori Morimoto <[email protected]>
[ Upstream commit 25aa058b5c83a3c455a2a288bb3295c0b234f093 ]
Current DMAC is stopped before HW stop, but it might be cause of sync error. Stop HW first.
--- sound/soc/renesas/rcar/msiof.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/soc/renesas/rcar/msiof.c +3 -3
@@ -222,9 +222,6 @@ static int msiof_hw_stop(struct snd_soc_component *component, val =SIIER_RDREQE |SIIER_RDMAE |SISTR_ERR_RX ;msiof_update (priv,SIIER , val,0 ); -/* Stop DMAC */ -snd_dmaengine_pcm_trigger (substream, cmd); -/* SICTR */ if (is_play) val =SICTR_TXE ;
@@ -232,6 +229,9 @@ static int msiof_hw_stop(struct snd_soc_component *component, val =SICTR_RXE ;msiof_update_and_wait (priv,SICTR , val,0 ,0 ); +/* Stop DMAC */ +snd_dmaengine_pcm_trigger (substream, cmd); +/* indicate error status if exist */ if (priv->err_syc[substream->stream] || priv->err_ovf[substream->stream] ||
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 643/849 ASoC: renesas: msiof: set SIFCTR register
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuninori Morimoto <[email protected]>
[ Upstream commit 130947b4681c515a5e5a7961244b502de2de85ca ]
Because it uses DMAC, we would like to transfer data if there is any data. Set SIFCTR for it.
--- sound/soc/renesas/rcar/msiof.c | 6 ++++++ 1 file changed, 6 insertions(+)
sound/soc/renesas/rcar/msiof.c +6 -0
@@ -185,6 +185,12 @@ static int msiof_hw_start(struct snd_soc_component *component,msiof_write (priv,SIRMDR3 , val); } +/* SIFCTR */ +if (is_play) +msiof_update (priv,SIFCTR ,SIFCTR_TFWM ,FIELD_PREP (SIFCTR_TFWM ,SIFCTR_TFWM_1 )); +else +msiof_update (priv,SIFCTR ,SIFCTR_RFWM ,FIELD_PREP (SIFCTR_RFWM ,SIFCTR_RFWM_1 )); +/* SIIER */ if (is_play) val =SIIER_TDREQE |SIIER_TDMAE |SISTR_ERR_TX ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 644/849 fs: ext4: change GFP_KERNEL to GFP_NOFS to avoid deadlock
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: chuguangqing <[email protected]>
[ Upstream commit 1534f72dc2a11ded38b0e0268fbcc0ca24e9fd4a ]
The parent function ext4_xattr_inode_lookup_create already uses GFP_NOFS for memory alloction, so the function ext4_xattr_inode_cache_find should use same gfp_flag.
--- fs/ext4/xattr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/xattr.c +1 -1
@@ -1535,7 +1535,7 @@ ext4_xattr_inode_cache_find(struct inode *inode, const void *value,WARN_ON_ONCE (ext4_handle_valid (journal_current_handle ()) && !(current->flags &PF_MEMALLOC_NOFS )); - ea_data =kvmalloc (value_len,GFP_KERNEL ); + ea_data =kvmalloc (value_len,GFP_NOFS );if (!ea_data) {mb_cache_entry_put (ea_inode_cache, ce);return NULL ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 645/849 ext4: increase IO priority of fastcommit
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Julian Sun <[email protected]>
[ Upstream commit 46e75c56dfeafb6756773b71cabe187a6886859a ]
The following code paths may result in high latency or even task hangs:
1. fastcommit io is throttled by wbt.
2. jbd2_fc_wait_bufs() might wait for a long time whileJBD2_FAST_COMMIT_ONGOING is set in journal->flags, and then jbd2_journal_commit_transaction() waits for the JBD2_FAST_COMMIT_ONGOING bit for a long time while holding the write lock of j_state_lock.
3. start_this_handle() waits for read lock of j_state_lock which
results in high latency or task hang.
Given the fact that ext4_fc_commit() already modifies the current process' IO priority to match that of the jbd2 thread, it should be reasonable to match jbd2's IO submission flags as well.
Message-ID: <[email protected]>
--- fs/ext4/fast_commit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/fast_commit.c +1 -1
@@ -663,7 +663,7 @@ void ext4_fc_track_range(handle_t *handle, struct inode *inode, ext4_lblk_t starstatic void ext4_fc_submit_bh (struct super_block *sb,bool is_tail) { -blk_opf_t write_flags =REQ_SYNC ; +blk_opf_t write_flags =JBD2_JOURNAL_REQ_FLAGS ;struct buffer_head *bh =EXT4_SB (sb)->s_fc_bh;/* Add REQ_FUA | REQ_PREFLUSH only its tail */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 646/849 amd/amdkfd: resolve a race in amdgpu_amdkfd_device_fini_sw
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yifan Zhang <[email protected]>
[ Upstream commit 99d7181bca34e96fbf61bdb6844918bdd4df2814 ]
There is race in amdgpu_amdkfd_device_fini_sw and interrupt. if amdgpu_amdkfd_device_fini_sw run in b/w kfd_cleanup_nodes and
kfree(kfd), and KGD interrupt generated.
kernel panic log:
BUG: kernel NULL pointer dereference, address: 0000000000000098
amdgpu 0000:c8:00.0: amdgpu: Requesting 4 partitions through PSP
PGD d78c68067 P4D d78c68067
kfd kfd: amdgpu: Allocated 3969056 bytes on gart
PUD 1465b8067 PMD @
Oops: @002 [#1] SMP NOPTI
kfd kfd: amdgpu: Total number of KFD nodes to be created: 4
CPU: 115 PID: @ Comm: swapper/115 Kdump: loaded Tainted: G S W OE K RIP: 0010:_raw_spin_lock_irqsave+0x12/0x40 Code: 89 e@ 41 5c c3 cc cc cc cc 66 66 2e Of 1f 84 00 00 00 00 00 OF 1f 40 00 Of 1f 44% 00 00 41 54 9c 41 5c fa 31 cO ba 01 00 00 00 <fO> OF b1 17 75 Ba 4c 89 e@ 41 Sc
89 c6 e8 07 38 5d
RSP: 0018: ffffc90@1a6b0e28 EFLAGS: 00010046
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000018 0000000000000001 RSI: ffff8883bb623e00 RDI: 0000000000000098 ffff8883bb000000 RO8: ffff888100055020 ROO: ffff888100055020 0000000000000000 R11: 0000000000000000 R12: 0900000000000002 ffff888F2b97da0@ R14: @000000000000098 R15: ffff8883babdfo00
CS: 010 DS: 0000 ES: 0000 CRO: 0000000080050033
CR2: 0000000000000098 CR3: 0000000e7cae2006 CR4: 0000000002770ce0 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 0000000000000000 DR6: 00000000fffeO7FO DR7: 0000000000000400
PKRU: 55555554
Call Trace: <IRQ>
kgd2kfd_interrupt+@x6b/0x1f@ [amdgpu]
? amdgpu_fence_process+0xa4/0x150 [amdgpu]
kfd kfd: amdgpu: Node: 0, interrupt_bitmap: 3 YcpxFl Rant tErace
amdgpu_irq_dispatch+0x165/0x210 [amdgpu] amdgpu_ih_process+0x80/0x100 [amdgpu]
amdgpu: Virtual CRAT table created for GPU
amdgpu_irq_handler+0x1f/@x60 [amdgpu]
__handle_irq_event_percpu+0x3d/0x170
amdgpu: Topology: Add dGPU node [0x74a2:0x1002]
handle_irq_event+0x5a/@xcO
handle_edge_irq+0x93/0x240
kfd kfd: amdgpu: KFD node 1 partition @ size 49148M
asm_call_irq_on_stack+0xf/@x20
</IRQ> common_interrupt+0xb3/0x130 asm_common_interrupt+0x1le/0x40
5.10.134-010.a1i5000.a18.x86_64 #1
--- drivers/gpu/drm/amd/amdkfd/kfd_device.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdkfd/kfd_device.c +9 -1
@@ -1133,7 +1133,15 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry) }for (i =0 ; i < kfd->num_nodes; i++) { - node = kfd->nodes[i]; +/* Race if another thread in b/w +* kfd_cleanup_nodes and kfree(kfd), +* when kfd->nodes[i] = NULL +*/ +if (kfd->nodes[i]) + node = kfd->nodes[i]; +else +return ; +spin_lock_irqsave (&node->interrupt_lock, flags); if (node->interrupts_active
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 647/849 drm/amdgpu: Add fallback to pipe reset if KCQ ring reset fails
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jesse.Zhang <[email protected]>
[ Upstream commit 7469567d882374dcac3fdb8b300e0f28cf875a75 ]
Add a fallback mechanism to attempt pipe reset when KCQ reset fails to recover the ring. After performing the KCQ reset and queue remapping, test the ring functionality. If the ring test fails, initiate a pipe reset as an additional recovery step.
v2: fix the typo (Lijo)
v3: try pipeline reset when kiq mapping fails (Lijo)
--- drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c +12 -0
@@ -3562,6 +3562,7 @@ static int gfx_v9_4_3_reset_kcq(struct amdgpu_ring *ring,struct amdgpu_device *adev = ring->adev;struct amdgpu_kiq *kiq = &adev->gfx.kiq[ring->xcc_id];struct amdgpu_ring *kiq_ring = &kiq->ring; +int reset_mode =AMDGPU_RESET_TYPE_PER_QUEUE ;unsigned long flags;int r;
@@ -3599,6 +3600,7 @@ static int gfx_v9_4_3_reset_kcq(struct amdgpu_ring *ring,if (!(adev->gfx.compute_supported_reset &AMDGPU_RESET_TYPE_PER_PIPE ))return -EOPNOTSUPP ; r =gfx_v9_4_3_reset_hw_pipe (ring); + reset_mode =AMDGPU_RESET_TYPE_PER_PIPE ;dev_info (adev->dev,"ring: %s pipe reset :%s\n" , ring->name, r ?"failed" :"successfully" );if (r)
@@ -3621,10 +3623,20 @@ static int gfx_v9_4_3_reset_kcq(struct amdgpu_ring *ring, r =amdgpu_ring_test_ring (kiq_ring);spin_unlock_irqrestore (&kiq->ring_lock, flags);if (r) { +if (reset_mode ==AMDGPU_RESET_TYPE_PER_QUEUE ) + goto pipe_reset; +dev_err (adev->dev,"fail to remap queue\n" );return r; } +if (reset_mode ==AMDGPU_RESET_TYPE_PER_QUEUE ) { + r =amdgpu_ring_test_ring (ring); +if (r) + goto pipe_reset; + } + +return amdgpu_ring_reset_helper_end (ring, timedout_fence); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 648/849 drm/amdgpu: Fix fence signaling race condition in userqueue
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jesse.Zhang <[email protected]>
[ Upstream commit b8ae2640f9acd4f411c9227d2493755d03fe440a ]
This commit fixes a potential race condition in the userqueue fence signaling mechanism by replacing dma_fence_is_signaled_locked() with dma_fence_is_signaled().
The issue occurred because:
1. dma_fence_is_signaled_locked() should only be used when holding the fence's individual lock, not just the fence list lock
2. Using the locked variant without the proper fence lock could lead to double-signaling scenarios:
- Hardware completion signals the fence
- Software path also tries to signal the same fence
By using dma_fence_is_signaled() instead, we properly handle the locking hierarchy and avoid the race condition while still maintaining the necessary synchronization through the fence_list_lock.
v2: drop the comment (Christian)
--- drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c +1 -1
@@ -276,7 +276,7 @@ static int amdgpu_userq_fence_create(struct amdgpu_usermode_queue *userq,/* Check if hardware has already processed the job */ spin_lock_irqsave (&fence_drv->fence_list_lock, flags); -if (!dma_fence_is_signaled_locked (fence)) +if (!dma_fence_is_signaled (fence))list_add_tail (&userq_fence->link, &fence_drv->fences);else dma_fence_put (fence);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 649/849 ASoC: stm32: sai: manage context in set_sysclk callback
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Olivier Moysan <[email protected]>
[ Upstream commit 27fa1a8b2803dfd88c39f03b0969c55f667cdc43 ]
The mclk direction now needs to be specified in endpoint node with "system-clock-direction-out" property. However some calls to the set_sysclk callback, related to CPU DAI clock, result in unbalanced calls to clock API.
The set_sysclk callback in STM32 SAI driver is intended only for mclk management. So it is relevant to ensure that calls to set_sysclk are related to mclk only.
Since the master clock is handled only at runtime, skip the calls to set_sysclk in the initialization phase.
--- sound/soc/stm/stm32_sai_sub.c | 8 ++++++++ 1 file changed, 8 insertions(+)
sound/soc/stm/stm32_sai_sub.c +8 -0
@@ -672,6 +672,14 @@ static int stm32_sai_set_sysclk(struct snd_soc_dai *cpu_dai,struct stm32_sai_sub_data *sai =snd_soc_dai_get_drvdata (cpu_dai);int ret; +/* +* The mclk rate is determined at runtime from the audio stream rate. +* Skip calls to the set_sysclk callback that are not relevant during the +* initialization phase. +*/ +if (!snd_soc_card_is_instantiated (cpu_dai->component->card)) +return 0 ; +if (dir ==SND_SOC_CLOCK_OUT && sai->sai_mclk) { ret = stm32_sai_sub_reg_up(sai, STM_SAI_CR1_REGX, SAI_XCR1_NODIV,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 650/849 amd/amdkfd: enhance kfd process check in switch partition
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yifan Zhang <[email protected]>
[ Upstream commit 45da20e00d5da842e17dfc633072b127504f0d0e ]
current switch partition only check if kfd_processes_table is empty. kfd_prcesses_table entry is deleted in kfd_process_notifier_release, but kfd_process tear down is in kfd_process_wq_release.
consider two processes:
Process A (workqueue) -> kfd_process_wq_release -> Access kfd_node member Process B switch partition -> amdgpu_xcp_pre_partition_switch -> amdgpu_amdkfd_device_fini_sw -> kfd_node tear down.
Process A and B may trigger a race as shown in dmesg log.
This patch is to resolve the race by adding an atomic kfd_process counter kfd_processes_count, it increment as create kfd process, decrement as finish kfd_process_wq_release.
v2: Put kfd_processes_count per kfd_dev, move decrement to kfd_process_destroy_pdds and bug fix. (Philip Yang)
[3966658.307702] divide error: 0000 [#1] SMP NOPTI [3966658.350818] i10nm_edac [3966658.356318] CPU: 124 PID: 38435 Comm: kworker/124:0 Kdump: loaded Tainted [3966658.356890] Workqueue: kfd_process_wq kfd_process_wq_release [amdgpu] [3966658.362839] nfit [3966658.366457] RIP: 0010:kfd_get_num_sdma_engines+0x17/0x40 [amdgpu] [3966658.366460] Code: 00 00 e9 ac 81 02 00 66 66 2e 0f 1f 84 00 00 00 00 00 90 0f 1f 44 00 00 48 8b 4f 08 48 8b b7 00 01 00 00 8b 81 58 26 03 00 99 <f7> be b8 01 00 00 80 b9 70 2e 00 00 00 74 0b 83 f8 02 ba 02 00 00 [3966658.380967] x86_pkg_temp_thermal [3966658.391529] RSP: 0018:ffffc900a0edfdd8 EFLAGS: 00010246 [3966658.391531] RAX: 0000000000000008 RBX: ffff8974e593b800 RCX: ffff888645900000 [3966658.391531] RDX: 0000000000000000 RSI: ffff888129154400 RDI: ffff888129151c00 [3966658.391532] RBP: ffff8883ad79d400 R08: 0000000000000000 R09: ffff8890d2750af4 [3966658.391532] R10: 0000000000000018 R11: 0000000000000018 R12: 0000000000000000 [3966658.391533] R13: ffff8883ad79d400 R14: ffffe87ff662ba00 R15: ffff8974e593b800 [3966658.391533] FS: 0000000000000000(0000) GS:ffff88fe7f600000(0000) knlGS:0000000000000000 [3966658.391534] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [3966658.391534] CR2: 0000000000d71000 CR3: 000000dd0e970004 CR4: 0000000002770ee0 [3966658.391535] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [3966658.391535] DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400 [3966658.391536] PKRU: 55555554 [3966658.391536] Call Trace: [3966658.391674] deallocate_sdma_queue+0x38/0xa0 [amdgpu] [3966658.391762] process_termination_cpsch+0x1ed/0x480 [amdgpu] [3966658.399754] intel_powerclamp [3966658.402831] kfd_process_dequeue_from_all_devices+0x5b/0xc0 [amdgpu] [3966658.402908] kfd_process_wq_release+0x1a/0x1a0 [amdgpu] [3966658.410516] coretemp [3966658.434016] process_one_work+0x1ad/0x380 [3966658.434021] worker_thread+0x49/0x310 [3966658.438963] kvm_intel [3966658.446041] ? process_one_work+0x380/0x380 [3966658.446045] kthread+0x118/0x140 [3966658.446047] ? __kthread_bind_mask+0x60/0x60 [3966658.446050] ret_from_fork+0x1f/0x30 [3966658.446053] Modules linked in: kpatch_20765354(OEK) [3966658.455310] kvm [3966658.464534] mptcp_diag xsk_diag raw_diag unix_diag af_packet_diag netlink_diag udp_diag act_pedit act_mirred act_vlan cls_flower kpatch_21951273(OEK) kpatch_18424469(OEK) kpatch_19749756(OEK) [3966658.473462] idxd_mdev [3966658.482306] kpatch_17971294(OEK) sch_ingress xt_conntrack amdgpu(OE) amdxcp(OE) amddrm_buddy(OE) amd_sched(OE) amdttm(OE) amdkcl(OE) intel_ifs iptable_mangle tcm_loop target_core_pscsi tcp_diag target_core_file inet_diag target_core_iblock target_core_user target_core_mod coldpgs kpatch_18383292(OEK) ip6table_nat ip6table_filter ip6_tables ip_set_hash_ipportip ip_set_hash_ipportnet ip_set_hash_ipport ip_set_bitmap_port xt_comment iptable_nat nf_nat iptable_filter ip_tables ip_set ip_vs_sh ip_vs_wrr ip_vs_rr ip_vs nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 sn_core_odd(OE) i40e overlay binfmt_misc tun bonding(OE) aisqos(OE) aisqos_hotfixes(OE) rfkill uio_pci_generic uio cuse fuse nf_tables nfnetlink intel_rapl_msr intel_rapl_common intel_uncore_frequency intel_uncore_frequency_common i10nm_edac nfit x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm idxd_mdev [3966658.491237] vfio_pci [3966658.501196] vfio_pci vfio_virqfd mdev vfio_iommu_type1 vfio iax_crypto intel_pmt_telemetry iTCO_wdt intel_pmt_class iTCO_vendor_support irqbypass crct10dif_pclmul crc32_pclmul ghash_clmulni_intel rapl intel_cstate snd_hda_intel snd_intel_dspcfg snd_hda_codec snd_hda_core snd_hwdep snd_seq [3966658.508537] vfio_virqfd [3966658.517569] snd_seq_device ipmi_ssif isst_if_mbox_pci isst_if_mmio pcspkr snd_pcm idxd intel_uncore ses isst_if_common intel_vsec idxd_bus enclosure snd_timer mei_me snd i2c_i801 i2c_smbus mei i2c_ismt soundcore joydev acpi_ipmi ipmi_si ipmi_devintf ipmi_msghandler acpi_power_meter acpi_pad vfat fat [3966658.526851] mdev [3966658.536096] nfsd auth_rpcgss nfs_acl lockd grace slb_vtoa(OE) sunrpc dm_mod hookers mlx5_ib(OE) ast i2c_algo_bit drm_vram_helper drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm_ttm_helper ttm mlx5_core(OE) mlxfw(OE) [3966658.540381] vfio_iommu_type1 [3966658.544341] nvme mpt3sas tls drm nvme_core pci_hyperv_intf raid_class psample libcrc32c crc32c_intel mlxdevm(OE) i2c_core [3966658.551254] vfio [3966658.558742] scsi_transport_sas wmi pinctrl_emmitsburg sd_mod t10_pi sg ahci libahci libata rdma_ucm(OE) ib_uverbs(OE) rdma_cm(OE) iw_cm(OE) ib_cm(OE) ib_umad(OE) ib_core(OE) ib_ucm(OE) mlx_compat(OE) [3966658.563004] iax_crypto [3966658.570988] [last unloaded: diagnose] [3966658.571027] ---[ end trace cc9dbb180f9ae537 ]---
--- drivers/gpu/drm/amd/amdkfd/kfd_device.c | 10 ++++++++++ drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 2 ++ drivers/gpu/drm/amd/amdkfd/kfd_process.c | 4 ++++ 3 files changed, 16 insertions(+)
drivers/gpu/drm/amd/amdkfd/kfd_device.c +10 -0
@@ -495,6 +495,7 @@ struct kfd_dev *kgd2kfd_probe(struct amdgpu_device *adev, bool vf)mutex_init (&kfd->doorbell_mutex);ida_init (&kfd->doorbell_ida); +atomic_set (&kfd->kfd_processes_count,0 );return kfd; }
@@ -1493,6 +1494,15 @@ int kgd2kfd_check_and_lock_kfd(struct kfd_dev *kfd)mutex_lock (&kfd_processes_mutex); +/* kfd_processes_count is per kfd_dev, return -EBUSY without +* further check +*/ +if (!!atomic_read (&kfd->kfd_processes_count)) { +pr_debug ("process_wq_release not finished\n" ); + r = -EBUSY ; + goto out; + } +if (hash_empty (kfd_processes_table) && !kfd_is_locked (kfd)) goto out;
drivers/gpu/drm/amd/amdkfd/kfd_priv.h +2 -0
@@ -382,6 +382,8 @@ struct kfd_dev {/* for dynamic partitioning */ int kfd_dev_lock; + +atomic_t kfd_processes_count; };enum kfd_mempool {
drivers/gpu/drm/amd/amdkfd/kfd_process.c +4 -0
@@ -1088,6 +1088,8 @@ static void kfd_process_destroy_pdds(struct kfd_process *p) pdd->runtime_inuse = false; } +atomic_dec (&pdd->dev->kfd->kfd_processes_count); +kfree (pdd); p->pdds[i] =NULL ; }
@@ -1649,6 +1651,8 @@ struct kfd_process_device *kfd_create_process_device_data(struct kfd_node *dev,/* Init idr used for memory handle translation */ idr_init (&pdd->alloc_idr); +atomic_inc (&dev->kfd->kfd_processes_count); +return pdd; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 651/849 ASoC: tlv320aic3x: Fix class-D initialization for tlv320aic3007
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Primoz Fiser <[email protected]>
[ Upstream commit 733a763dd8b3ac2858dd238a91bb3a2fdff4739e ]
The problem of having class-D initialization sequence in probe using regmap_register_patch() is that it will do hardware register writes immediately after being called as it bypasses regcache. Afterwards, in aic3x_init() we also perform codec soft reset, rendering class-D init sequence pointless. This issue is even more apparent when using reset GPIO line, since in that case class-D amplifier initialization fails with "Failed to init class D: -5" message as codec is already held in reset state after requesting the reset GPIO and hence hardware I/O fails with -EIO errno.
Thus move class-D amplifier initialization sequence from probe function to aic3x_set_power() just before the usual regcache sync. Use bypassed regmap_multi_reg_write_bypassed() function to make sure, class-D init sequence is performed in proper order as described in the datasheet.
--- sound/soc/codecs/tlv320aic3x.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-)
sound/soc/codecs/tlv320aic3x.c +14 -18
@@ -121,6 +121,16 @@ static const struct reg_default aic3x_reg[] = { { 108, 0x00 }, { 109, 0x00 }, }; +static const struct reg_sequence aic3007_class_d[] = { +/* Class-D speaker driver init; datasheet p. 46 */ + {AIC3X_PAGE_SELECT ,0x0D }, + {0xD ,0x0D }, + {0x8 ,0x5C }, + {0x8 ,0x5D }, + {0x8 ,0x5C }, + {AIC3X_PAGE_SELECT ,0x00 }, +}; +static bool aic3x_volatile_reg (struct device *dev,unsigned int reg) {switch (reg) {
@@ -1393,6 +1403,10 @@ static int aic3x_set_power(struct snd_soc_component *component, int power)gpiod_set_value (aic3x->gpio_reset,0 ); } +if (aic3x->model ==AIC3X_MODEL_3007 ) +regmap_multi_reg_write_bypassed (aic3x->regmap, aic3007_class_d, +ARRAY_SIZE (aic3007_class_d)); +/* Sync reg_cache with the hardware */ regcache_cache_only (aic3x->regmap, false);regcache_sync (aic3x->regmap);
@@ -1723,17 +1737,6 @@ static void aic3x_configure_ocmv(struct device *dev, struct aic3x_priv *aic3x) } } - -static const struct reg_sequence aic3007_class_d[] = { -/* Class-D speaker driver init; datasheet p. 46 */ - {AIC3X_PAGE_SELECT ,0x0D }, - {0xD ,0x0D }, - {0x8 ,0x5C }, - {0x8 ,0x5D }, - {0x8 ,0x5C }, - {AIC3X_PAGE_SELECT ,0x00 }, -}; -int aic3x_probe (struct device *dev,struct regmap *regmap,kernel_ulong_t driver_data) {struct aic3x_priv *aic3x;
@@ -1823,13 +1826,6 @@ int aic3x_probe(struct device *dev, struct regmap *regmap, kernel_ulong_t driveraic3x_configure_ocmv (dev, aic3x); -if (aic3x->model ==AIC3X_MODEL_3007 ) { - ret =regmap_register_patch (aic3x->regmap, aic3007_class_d, -ARRAY_SIZE (aic3007_class_d)); -if (ret !=0 ) -dev_err (dev,"Failed to init class D: %d\n" , ret); - } - ret =devm_snd_soc_register_component (dev, &soc_component_dev_aic3x, &aic3x_dai,1 );if (ret)return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 652/849 ACPI: scan: Update honor list for RPMI System MSI
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sunil V L <[email protected]>
[ Upstream commit 4215d1cf59e4b272755f4277a05cd5967935a704 ]
The RPMI System MSI interrupt controller (just like PLIC and APLIC) needs to probed prior to devices like GED which use interrupts provided by it. Also, it has dependency on the SBI MPXY mailbox device.
Add HIDs of RPMI System MSI and SBI MPXY mailbox devices to the honor list so that those dependencies are handled.
--- drivers/acpi/scan.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/acpi/scan.c +2 -0
@@ -860,6 +860,8 @@ static const char * const acpi_honor_dep_ids[] = {"INTC10CF" ,/* IVSC (MTL) driver must be loaded to allow i2c access to camera sensors */ "RSCV0001" ,/* RISC-V PLIC */ "RSCV0002" ,/* RISC-V APLIC */ +"RSCV0005" ,/* RISC-V SBI MPXY MBOX */ +"RSCV0006" ,/* RISC-V RPMI SYSMSI */ "PNP0C0F" ,/* PCI Link Device */ NULL };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 653/849 platform/x86: x86-android-tablets: Stop using EPROBE_DEFER
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
[ Upstream commit 01fd7cf3534aa107797d130f461ba7bcad30414d ]
Since the x86-android-tablets code uses platform_create_bundle() it cannot use EPROBE_DEFER and the driver-core will translate EPROBE_DEFER to ENXIO.
Stop using EPROBE_DEFER instead log an error and return ENODEV, or for non-fatal cases log a warning and return 0.
--- drivers/platform/x86/x86-android-tablets/core.c | 6 ++++-- drivers/platform/x86/x86-android-tablets/other.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-)
drivers/platform/x86/x86-android-tablets/core.c +4 -2
@@ -277,8 +277,10 @@ get_serdev_controller_by_pci_parent(const struct x86_serdev_info *info)struct pci_dev *pdev; pdev =pci_get_domain_bus_and_slot (0 ,0 , info->ctrl.pci.devfn); -if (!pdev) -return ERR_PTR (-EPROBE_DEFER ); +if (!pdev) { +pr_err ("error could not get PCI serdev at devfn 0x%02x\n" , info->ctrl.pci.devfn); +return ERR_PTR (-ENODEV ); + }/* This puts our reference on pdev and returns a ref on the ctrl */ return get_serdev_controller_from_parent (&pdev->dev,0 , info->ctrl_devname);
drivers/platform/x86/x86-android-tablets/other.c +4 -2
@@ -809,8 +809,10 @@ static int __init vexia_edu_atla10_9v_init(struct device *dev)/* Reprobe the SDIO controller to enumerate the now enabled Wifi module */ pdev =pci_get_domain_bus_and_slot (0 ,0 ,PCI_DEVFN (0x11 ,0 )); -if (!pdev) -return -EPROBE_DEFER ; +if (!pdev) { +pr_warn ("Could not get PCI SDIO at devfn 0x%02x\n" ,PCI_DEVFN (0x11 ,0 )); +return 0 ; + } ret =device_reprobe (&pdev->dev);if (ret)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 654/849 vfio/pci: Fix INTx handling on legacy non-PCI 2.3 devices
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timothy Pearson <[email protected]>
[ Upstream commit 8b9f128947dd72e0fcf256088a673abac9b720bf ]
PCI devices prior to PCI 2.3 both use level interrupts and do not support interrupt masking, leading to a failure when passed through to a KVM guest on at least the ppc64 platform. This failure manifests as receiving and acknowledging a single interrupt in the guest, while the device continues to assert the level interrupt indicating a need for further servicing.
When lazy IRQ masking is used on DisINTx- (non-PCI 2.3) hardware, the following sequence occurs:
* Level IRQ assertion on device
* IRQ marked disabled in kernel
* Host interrupt handler exits without clearing the interrupt on the device
* Eventfd is delivered to userspace
* Guest processes IRQ and clears device interrupt
* Device de-asserts INTx, then re-asserts INTx while the interrupt is masked
* Newly asserted interrupt acknowledged by kernel VMM without being handled
* Software mask removed by VFIO driver
* Device INTx still asserted, host controller does not see new edge after EOI
The behavior is now platform-dependent. Some platforms (amd64) will continue to spew IRQs for as long as the INTX line remains asserted, therefore the IRQ will be handled by the host as soon as the mask is dropped. Others (ppc64) will only send the one request, and if it is not handled no further interrupts will be sent. The former behavior theoretically leaves the system vulnerable to interrupt storm, and the latter will result in the device stalling after receiving exactly one interrupt in the guest.
Work around this by disabling lazy IRQ masking for DisINTx- INTx devices.
--- drivers/vfio/pci/vfio_pci_intrs.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/vfio/pci/vfio_pci_intrs.c +7 -0
@@ -304,9 +304,14 @@ static int vfio_intx_enable(struct vfio_pci_core_device *vdev, vdev->irq_type =VFIO_PCI_INTX_IRQ_INDEX ; +if (!vdev->pci_2_3) +irq_set_status_flags (pdev->irq,IRQ_DISABLE_UNLAZY ); + ret =request_irq (pdev->irq, vfio_intx_handler, irqflags, ctx->name, ctx);if (ret) { +if (!vdev->pci_2_3) +irq_clear_status_flags (pdev->irq,IRQ_DISABLE_UNLAZY ); vdev->irq_type =VFIO_PCI_NUM_IRQS ;kfree (name);vfio_irq_ctx_free (vdev, ctx,0 );
@@ -352,6 +357,8 @@ static void vfio_intx_disable(struct vfio_pci_core_device *vdev)vfio_virqfd_disable (&ctx->unmask);vfio_virqfd_disable (&ctx->mask);free_irq (pdev->irq, ctx); +if (!vdev->pci_2_3) +irq_clear_status_flags (pdev->irq,IRQ_DISABLE_UNLAZY );if (ctx->trigger)eventfd_ctx_put (ctx->trigger);kfree (ctx->name);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 655/849 vfio/nvgrace-gpu: Add GB300 SKU to the devid table
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tushar Dave <[email protected]>
[ Upstream commit 407aa63018d15c35a34938633868e61174d2ef6e ]
GB300 is NVIDIA's Grace Blackwell Ultra Superchip.
Add the GB300 SKU device-id to nvgrace_gpu_vfio_pci_table.
--- drivers/vfio/pci/nvgrace-gpu/main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/vfio/pci/nvgrace-gpu/main.c +2 -0
@@ -995,6 +995,8 @@ static const struct pci_device_id nvgrace_gpu_vfio_pci_table[] = { { PCI_DRIVER_OVERRIDE_DEVICE_VFIO(PCI_VENDOR_ID_NVIDIA, 0x2348) },/* GB200 SKU */ { PCI_DRIVER_OVERRIDE_DEVICE_VFIO(PCI_VENDOR_ID_NVIDIA, 0x2941) }, +/* GB300 SKU */ + { PCI_DRIVER_OVERRIDE_DEVICE_VFIO(PCI_VENDOR_ID_NVIDIA, 0x31C2) }, {} };
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 656/849 selftest: net: Fix error message if empty variable
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alessandro Zanni <[email protected]>
[ Upstream commit 81dcfdd21dbd7067068c7c341ee448c3f0d6f115 ]
Fix to avoid cases where the res shell variable is empty in script comparisons.
The comparison has been modified into string comparison to handle other possible values the variable could assume.
The issue can be reproduced with the command:
make kselftest TARGETS=net
It solves the error:
./tfo_passive.sh: line 98: [: -eq: unary operator expected
--- tools/testing/selftests/net/tfo_passive.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/tfo_passive.sh +1 -1
@@ -95,7 +95,7 @@ wait res=$(cat $out_file) rm $out_file -if [ $res -eq 0 ]; then +if [ "$res" = "0" ]; then echo "got invalid NAPI ID from passive TFO socket" cleanup_ns exit 1
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 657/849 net/mlx5e: Dont query FEC statistics when FEC is disabled
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carolina Jubran <[email protected]>
[ Upstream commit 6b81b8a0b1978284e007566d7a1607b47f92209f ]
Update mlx5e_stats_fec_get() to check the active FEC mode and skip statistics collection when FEC is disabled.
--- drivers/net/ethernet/mellanox/mlx5/core/en_stats.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_stats.c +6 -6
@@ -1446,16 +1446,13 @@ static void fec_set_rs_stats(struct ethtool_fec_stats *fec_stats, u32 *ppcnt) }static void fec_set_block_stats (struct mlx5e_priv *priv, +int mode,struct ethtool_fec_stats *fec_stats) {struct mlx5_core_dev *mdev = priv->mdev;u32 out[MLX5_ST_SZ_DW (ppcnt_reg)] = {};u32 in[MLX5_ST_SZ_DW (ppcnt_reg)] = {};int sz =MLX5_ST_SZ_BYTES (ppcnt_reg); -int mode =fec_active_mode (mdev); - -if (mode ==MLX5E_FEC_NOFEC ) -return ;MLX5_SET (ppcnt_reg, in, local_port,1 );MLX5_SET (ppcnt_reg, in, grp,MLX5_PHYSICAL_LAYER_COUNTERS_GROUP );
@@ -1497,11 +1494,14 @@ static void fec_set_corrected_bits_total(struct mlx5e_priv *priv,void mlx5e_stats_fec_get (struct mlx5e_priv *priv,struct ethtool_fec_stats *fec_stats) { -if (!MLX5_CAP_PCAM_FEATURE (priv->mdev, ppcnt_statistical_group)) +int mode =fec_active_mode (priv->mdev); + +if (mode ==MLX5E_FEC_NOFEC || + !MLX5_CAP_PCAM_FEATURE (priv->mdev, ppcnt_statistical_group))return ;fec_set_corrected_bits_total (priv, fec_stats); -fec_set_block_stats (priv, fec_stats); +fec_set_block_stats (priv, mode, fec_stats); }#define PPORT_ETH_EXT_OFF (c) \
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 658/849 Bluetooth: btintel: Add support for BlazarIW core
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kiran K <[email protected]>
[ Upstream commit 926e8bfaaa11471b3df25befc284da62b11a1e92 ]
Add support for the BlazarIW Bluetooth core used in the Wildcat Lake platform.
HCI traces:
< HCI Command: Intel Read Version (0x3f|0x0005) plen 1
Requested Type:
All Supported Types(0xff)Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 122
Intel Read Version (0x3f|0x0005) ncmd 1
Status: Success (0x00)
.....
CNVi BT(18): 0x00223700 - BlazarIW(0x22)
.....
.....--- drivers/bluetooth/btintel.c | 3 +++ drivers/bluetooth/btintel_pcie.c | 1 + 2 files changed, 4 insertions(+)
drivers/bluetooth/btintel.c +3 -0
@@ -484,6 +484,7 @@ int btintel_version_info_tlv(struct hci_dev *hdev,case 0x1d :/* BlazarU (BzrU) */ case 0x1e :/* BlazarI (Bzr) */ case 0x1f :/* Scorpious Peak */ +case 0x22 :/* BlazarIW (BzrIW) */ break ;default : bt_dev_err(hdev, "Unsupported Intel hardware variant (0x%x)",
@@ -3253,6 +3254,7 @@ void btintel_set_msft_opcode(struct hci_dev *hdev, u8 hw_variant)case 0x1d :case 0x1e :case 0x1f : +case 0x22 :hci_set_msft_opcode (hdev,0xFC1E );break ;default :
@@ -3593,6 +3595,7 @@ static int btintel_setup_combined(struct hci_dev *hdev)case 0x1d :case 0x1e :case 0x1f : +case 0x22 :/* Display version information of TLV type */ btintel_version_info_tlv (hdev, &ver_tlv);
drivers/bluetooth/btintel_pcie.c +1 -0
@@ -2088,6 +2088,7 @@ static int btintel_pcie_setup_internal(struct hci_dev *hdev)switch (INTEL_HW_VARIANT (ver_tlv.cnvi_bt)) {case 0x1e :/* BzrI */ case 0x1f :/* ScP */ +case 0x22 :/* BzrIW */ /* Display version information of TLV type */ btintel_version_info_tlv (hdev, &ver_tlv);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 659/849 net: macb: avoid dealing with endianness in macb_set_hwaddr()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Théo Lebrun <[email protected]>
[ Upstream commit 70a5ce8bc94545ba0fb47b2498bfb12de2132f4d ]
bp->dev->dev_addr is of type unsigned char *. Casting it to a u32 pointer and dereferencing implies dealing manually with endianness, which is error-prone.
Replace by calls to get_unaligned_le32|le16() helpers.
This was found using sparse:
⟩ make C=2 drivers/net/ethernet/cadence/macb_main.o
warning: incorrect type in assignment (different base types)
expected unsigned int [usertype] bottom
got restricted __le32 [usertype]
warning: incorrect type in assignment (different base types)
expected unsigned short [usertype] top
got restricted __le16 [usertype]
...
--- drivers/net/ethernet/cadence/macb_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/cadence/macb_main.c +2 -2
@@ -274,9 +274,9 @@ static void macb_set_hwaddr(struct macb *bp)u32 bottom;u16 top; - bottom =cpu_to_le32 (*((u32 *)bp->dev->dev_addr)); + bottom =get_unaligned_le32 (bp->dev->dev_addr);macb_or_gem_writel (bp,SA1B , bottom); - top =cpu_to_le16 (*((u16 *)(bp->dev->dev_addr +4 ))); + top =get_unaligned_le16 (bp->dev->dev_addr +4 );macb_or_gem_writel (bp,SA1T , top);if (gem_has_ptp (bp)) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 660/849 Bluetooth: btusb: Add new VID/PID 13d3/3627 for MT7925
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Lu <[email protected]>
[ Upstream commit 576952cf981b7d2b7d3227b246b4326e5548a133 ]
Add VID 13d3 & PID 3627 for MediaTek MT7922 USB Bluetooth chip.
The information in /sys/kernel/debug/usb/devices about the Bluetooth device is listed as the below.
T: Bus=07 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=13d3 ProdID=3627 Rev= 1.00 S: Manufacturer=MediaTek Inc. S: Product=Wireless_Device S: SerialNumber=000000000 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -734,6 +734,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3613), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x13d3, 0x3627), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3628), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3630), .driver_info = BTUSB_MEDIATEK |
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 661/849 Bluetooth: btintel_pcie: Define hdev->wakeup() callback
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chandrashekar Devegowda <[email protected]>
[ Upstream commit 3e94262921990e2884ff7a49064c12fb6d3a0733 ]
Implement hdev->wakeup() callback to support Wake On BT feature.
Test steps:
1. echo enabled > /sys/bus/pci/devices/0000:00:14.7/power/wakeup
2. connect bluetooth hid device
3. put the system to suspend - rtcwake -m mem -s 300
4. press any key on hid to wake up the system
--- drivers/bluetooth/btintel_pcie.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/bluetooth/btintel_pcie.c +8 -0
@@ -2342,6 +2342,13 @@ static void btintel_pcie_hw_error(struct hci_dev *hdev, u8 code)btintel_pcie_reset (hdev); } +static bool btintel_pcie_wakeup (struct hci_dev *hdev) +{ +struct btintel_pcie_data *data =hci_get_drvdata (hdev); + +return device_may_wakeup (&data->pdev->dev); +} +static int btintel_pcie_setup_hdev (struct btintel_pcie_data *data) {int err;
@@ -2367,6 +2374,7 @@ static int btintel_pcie_setup_hdev(struct btintel_pcie_data *data) hdev->set_diag = btintel_set_diag; hdev->set_bdaddr = btintel_set_bdaddr; hdev->reset = btintel_pcie_reset; + hdev->wakeup = btintel_pcie_wakeup; err =hci_register_dev (hdev);if (err <0 ) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 662/849 Bluetooth: ISO: Dont initiate CIS connections if there are no buffers
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit d79c7d01f1c8bcf9a48337c8960d618fbe31fc0c ]
If the controller has no buffers left return -ENOBUFF to indicate that iso_cnt might be out of sync.
--- net/bluetooth/iso.c | 7 +++++++ 1 file changed, 7 insertions(+)
net/bluetooth/iso.c +7 -0
@@ -460,6 +460,13 @@ static int iso_connect_cis(struct sock *sk) goto unlock; } +/* Check if there are available buffers for output/TX. */ +if (iso_pi (sk)->qos.ucast.out.sdu && !hci_iso_count (hdev) && + (hdev->iso_pkts && !hdev->iso_cnt)) { + err = -ENOBUFS ; + goto unlock; + } +/* Just bind if DEFER_SETUP has been set */ if (test_bit (BT_SK_DEFER_SETUP , &bt_sk (sk)->flags)) { hcon = hci_bind_cis(hdev, &iso_pi(sk)->dst,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 663/849 Bluetooth: btusb: Check for unexpected bytes when defragmenting HCI frames
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arkadiusz Bokowy <[email protected]>
[ Upstream commit 7722d6fb54e428a8f657fccf422095a8d7e2d72c ]
Some Barrot based USB Bluetooth dongles erroneously send one extra random byte for the HCI_OP_READ_LOCAL_EXT_FEATURES command. The consequence of that is that the next HCI transfer is misaligned by one byte causing undefined behavior. In most cases the response event for the next command fails with random error code.
Since the HCI_OP_READ_LOCAL_EXT_FEATURES command is used during HCI controller initialization, the initialization fails rendering the USB dongle not usable.
Quoted 6 lines
[59.464099] usb 1-1.3: new full-speed USB device number 11 using xhci_hcd [59.561617] usb 1-1.3: New USB device found, idVendor=33fa, idProduct=0012, bcdDevice=88.91 [59.561642] usb 1-1.3: New USB device strings: Mfr=0, Product=2, SerialNumber=0 [59.561656] usb 1-1.3: Product: UGREEN BT6.0 Adapter [61.720116] Bluetooth: hci1: command 0x1005 tx timeout [61.720167] Bluetooth: hci1: Opcode 0x1005 failed: -110
This patch was tested with the 33fa:0012 device. The info from the /sys/kernel/debug/usb/devices is shown below:
T: Bus=01 Lev=02 Prnt=02 Port=02 Cnt=01 Dev#= 12 Spd=12 MxCh= 0 D: Ver= 2.00 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=33fa ProdID=0012 Rev=88.91 S: Product=UGREEN BT6.0 Adapter C:* #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=100mA I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms
Now the device is initialized properly:
Quoted 7 lines
[43.329852] usb 1-1.4: new full-speed USB device number 4 using dwc_otg [43.446790] usb 1-1.4: New USB device found, idVendor=33fa, idProduct=0012, bcdDevice=88.91 [43.446813] usb 1-1.4: New USB device strings: Mfr=0, Product=2, SerialNumber=0 [43.446821] usb 1-1.4: Product: UGREEN BT6.0 Adapter [43.582024] Bluetooth: hci1: Unexpected continuation: 1 bytes [43.703025] Bluetooth: hci1: Unexpected continuation: 1 bytes [43.750141] Bluetooth: MGMT ver 1.23
--- drivers/bluetooth/btusb.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
drivers/bluetooth/btusb.c +17 -0
@@ -66,6 +66,7 @@ static struct usb_driver btusb_driver;#define BTUSB_INTEL_BROKEN_INITIAL_NCMD BIT(25)#define BTUSB_INTEL_NO_WBS_SUPPORT BIT(26)#define BTUSB_ACTIONS_SEMI BIT(27) +#define BTUSB_BARROT BIT(28)static const struct usb_device_id btusb_table[] = {/* Generic Bluetooth USB device */
@@ -814,6 +815,10 @@ static const struct usb_device_id quirks_table[] = { { USB_DEVICE(0x0cb5, 0xc547), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + /* Barrot Technology Bluetooth devices */ + { USB_DEVICE(0x33fa, 0x0010), .driver_info = BTUSB_BARROT }, + { USB_DEVICE(0x33fa, 0x0012), .driver_info = BTUSB_BARROT }, + /* Actions Semiconductor ATS2851 based devices */ { USB_DEVICE(0x10d7, 0xb012), .driver_info = BTUSB_ACTIONS_SEMI },
@@ -1196,6 +1201,18 @@ static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count) }if (!hci_skb_expect (skb)) { +/* Each chunk should correspond to at least 1 or more +* events so if there are still bytes left that doesn't +* constitute a new event this is likely a bug in the +* controller. +*/ +if (count && count <HCI_EVENT_HDR_SIZE ) { +bt_dev_warn (data->hdev, +"Unexpected continuation: %d bytes" , + count); + count =0 ; + } +/* Complete frame */ btusb_recv_event (data, skb); skb =NULL ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 664/849 Bluetooth: ISO: Use sk_sndtimeo as conn_timeout
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 339a87883a14d6a818ca436fed41aa5d10e0f4bd ]
This aligns the usage of socket sk_sndtimeo as conn_timeout when initiating a connection and then use it when scheduling the resulting HCI command, similar to what has been done in bf98feea5b65 ("Bluetooth: hci_conn: Always use sk_timeo as conn_timeout").
--- include/net/bluetooth/hci_core.h | 10 ++++++---- net/bluetooth/hci_conn.c | 20 ++++++++++++-------- net/bluetooth/iso.c | 16 ++++++++++------ 3 files changed, 28 insertions(+), 18 deletions(-)
include/net/bluetooth/hci_core.h +6 -4
@@ -1588,16 +1588,18 @@ struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst, __u16 setting, struct bt_codec *codec, u16 timeout);struct hci_conn *hci_bind_cis (struct hci_dev *hdev,bdaddr_t *dst, -__u8 dst_type,struct bt_iso_qos *qos); +__u8 dst_type,struct bt_iso_qos *qos, +u16 timeout);struct hci_conn *hci_bind_bis (struct hci_dev *hdev,bdaddr_t *dst,__u8 sid,struct bt_iso_qos *qos, -__u8 base_len,__u8 *base); +__u8 base_len,__u8 *base,u16 timeout);struct hci_conn *hci_connect_cis (struct hci_dev *hdev,bdaddr_t *dst, -__u8 dst_type,struct bt_iso_qos *qos); +__u8 dst_type,struct bt_iso_qos *qos, +u16 timeout);struct hci_conn *hci_connect_bis (struct hci_dev *hdev,bdaddr_t *dst,__u8 dst_type,__u8 sid,struct bt_iso_qos *qos, -__u8 data_len,__u8 *data); +__u8 data_len,__u8 *data,u16 timeout);struct hci_conn *hci_pa_create_sync (struct hci_dev *hdev,bdaddr_t *dst,__u8 dst_type,__u8 sid,struct bt_iso_qos *qos); int hci_conn_big_create_sync(struct hci_dev *hdev, struct hci_conn *hcon,
net/bluetooth/hci_conn.c +12 -8
@@ -1547,7 +1547,7 @@ static int qos_set_bis(struct hci_dev *hdev, struct bt_iso_qos *qos)/* This function requires the caller holds hdev->lock */ static struct hci_conn *hci_add_bis (struct hci_dev *hdev,bdaddr_t *dst,__u8 sid,struct bt_iso_qos *qos, -__u8 base_len,__u8 *base) +__u8 base_len,__u8 *base,u16 timeout) {struct hci_conn *conn;int err;
@@ -1589,6 +1589,7 @@ static struct hci_conn *hci_add_bis(struct hci_dev *hdev, bdaddr_t *dst, conn->state =BT_CONNECT ; conn->sid = sid; + conn->conn_timeout = timeout;hci_conn_hold (conn);return conn;
@@ -1929,7 +1930,8 @@ static bool hci_le_set_cig_params(struct hci_conn *conn, struct bt_iso_qos *qos) }struct hci_conn *hci_bind_cis (struct hci_dev *hdev,bdaddr_t *dst, -__u8 dst_type,struct bt_iso_qos *qos) +__u8 dst_type,struct bt_iso_qos *qos, +u16 timeout) {struct hci_conn *cis;
@@ -1944,6 +1946,7 @@ struct hci_conn *hci_bind_cis(struct hci_dev *hdev, bdaddr_t *dst, cis->dst_type = dst_type; cis->iso_qos.ucast.cig =BT_ISO_QOS_CIG_UNSET ; cis->iso_qos.ucast.cis =BT_ISO_QOS_CIS_UNSET ; + cis->conn_timeout = timeout; }if (cis->state ==BT_CONNECTED )
@@ -2183,7 +2186,7 @@ static void create_big_complete(struct hci_dev *hdev, void *data, int err)struct hci_conn *hci_bind_bis (struct hci_dev *hdev,bdaddr_t *dst,__u8 sid,struct bt_iso_qos *qos, -__u8 base_len,__u8 *base) +__u8 base_len,__u8 *base,u16 timeout) {struct hci_conn *conn;struct hci_conn *parent;
@@ -2204,7 +2207,7 @@ struct hci_conn *hci_bind_bis(struct hci_dev *hdev, bdaddr_t *dst, __u8 sid, base, base_len);/* We need hci_conn object using the BDADDR_ANY as dst */ - conn =hci_add_bis (hdev, dst, sid, qos, base_len, eir); + conn =hci_add_bis (hdev, dst, sid, qos, base_len, eir, timeout);if (IS_ERR (conn))return conn;
@@ -2257,13 +2260,13 @@ static void bis_mark_per_adv(struct hci_conn *conn, void *data)struct hci_conn *hci_connect_bis (struct hci_dev *hdev,bdaddr_t *dst,__u8 dst_type,__u8 sid,struct bt_iso_qos *qos, -__u8 base_len,__u8 *base) +__u8 base_len,__u8 *base,u16 timeout) {struct hci_conn *conn;int err;struct iso_list_data data; - conn =hci_bind_bis (hdev, dst, sid, qos, base_len, base); + conn =hci_bind_bis (hdev, dst, sid, qos, base_len, base, timeout);if (IS_ERR (conn))return conn;
@@ -2306,7 +2309,8 @@ struct hci_conn *hci_connect_bis(struct hci_dev *hdev, bdaddr_t *dst, }struct hci_conn *hci_connect_cis (struct hci_dev *hdev,bdaddr_t *dst, -__u8 dst_type,struct bt_iso_qos *qos) +__u8 dst_type,struct bt_iso_qos *qos, +u16 timeout) {struct hci_conn *le;struct hci_conn *cis;
@@ -2330,7 +2334,7 @@ struct hci_conn *hci_connect_cis(struct hci_dev *hdev, bdaddr_t *dst,hci_iso_qos_setup (hdev, le, &qos->ucast.in, le->le_rx_phy ? le->le_rx_phy : hdev->le_rx_def_phys); - cis =hci_bind_cis (hdev, dst, dst_type, qos); + cis =hci_bind_cis (hdev, dst, dst_type, qos, timeout);if (IS_ERR (cis)) {hci_conn_drop (le);return cis;
net/bluetooth/iso.c +10 -6
@@ -91,8 +91,8 @@ static struct sock *iso_get_sock(bdaddr_t *src, bdaddr_t *dst, iso_sock_match_t match, void *data);/* ---- ISO timers ---- */ -#define ISO_CONN_TIMEOUT (HZ * 40) -#define ISO_DISCONN_TIMEOUT (HZ * 2) +#define ISO_CONN_TIMEOUT secs_to_jiffies(20) +#define ISO_DISCONN_TIMEOUT secs_to_jiffies(2)static void iso_conn_free (struct kref *ref) {
@@ -369,7 +369,8 @@ static int iso_connect_bis(struct sock *sk)if (test_bit (BT_SK_DEFER_SETUP , &bt_sk (sk)->flags)) { hcon =hci_bind_bis (hdev, &iso_pi (sk)->dst,iso_pi (sk)->bc_sid, &iso_pi (sk)->qos,iso_pi (sk)->base_len, -iso_pi (sk)->base); +iso_pi (sk)->base, +READ_ONCE (sk->sk_sndtimeo));if (IS_ERR (hcon)) { err =PTR_ERR (hcon); goto unlock;
@@ -378,7 +379,8 @@ static int iso_connect_bis(struct sock *sk) hcon =hci_connect_bis (hdev, &iso_pi (sk)->dst,le_addr_type (iso_pi (sk)->dst_type),iso_pi (sk)->bc_sid, &iso_pi (sk)->qos, -iso_pi (sk)->base_len,iso_pi (sk)->base); +iso_pi (sk)->base_len,iso_pi (sk)->base, +READ_ONCE (sk->sk_sndtimeo));if (IS_ERR (hcon)) { err =PTR_ERR (hcon); goto unlock;
@@ -471,7 +473,8 @@ static int iso_connect_cis(struct sock *sk)if (test_bit (BT_SK_DEFER_SETUP , &bt_sk (sk)->flags)) { hcon =hci_bind_cis (hdev, &iso_pi (sk)->dst,le_addr_type (iso_pi (sk)->dst_type), - &iso_pi (sk)->qos); + &iso_pi (sk)->qos, +READ_ONCE (sk->sk_sndtimeo));if (IS_ERR (hcon)) { err =PTR_ERR (hcon); goto unlock;
@@ -479,7 +482,8 @@ static int iso_connect_cis(struct sock *sk) }else { hcon =hci_connect_cis (hdev, &iso_pi (sk)->dst,le_addr_type (iso_pi (sk)->dst_type), - &iso_pi (sk)->qos); + &iso_pi (sk)->qos, +READ_ONCE (sk->sk_sndtimeo));if (IS_ERR (hcon)) { err =PTR_ERR (hcon); goto unlock;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 665/849 Bluetooth: SCO: Fix UAF on sco_conn_free
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit ecb9a843be4d6fd710d7026e359f21015a062572 ]
BUG: KASAN: slab-use-after-free in sco_conn_free net/bluetooth/sco.c:87 [inline] BUG: KASAN: slab-use-after-free in kref_put include/linux/kref.h:65 [inline] BUG: KASAN: slab-use-after-free in sco_conn_put+0xdd/0x410 net/bluetooth/sco.c:107 Write of size 8 at addr ffff88811cb96b50 by task kworker/u17:4/352 CPU: 1 UID: 0 PID: 352 Comm: kworker/u17:4 Not tainted 6.17.0-rc5-g717368f83676 #4 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 Workqueue: hci13 hci_cmd_sync_work Call Trace: <TASK> __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x10b/0x170 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:378 [inline] print_report+0x191/0x550 mm/kasan/report.c:482 kasan_report+0xc4/0x100 mm/kasan/report.c:595 sco_conn_free net/bluetooth/sco.c:87 [inline] kref_put include/linux/kref.h:65 [inline] sco_conn_put+0xdd/0x410 net/bluetooth/sco.c:107 sco_connect_cfm+0xb4/0xae0 net/bluetooth/sco.c:1441 hci_connect_cfm include/net/bluetooth/hci_core.h:2082 [inline] hci_conn_failed+0x20a/0x2e0 net/bluetooth/hci_conn.c:1313 hci_conn_unlink+0x55f/0x810 net/bluetooth/hci_conn.c:1121 hci_conn_del+0xb6/0x1110 net/bluetooth/hci_conn.c:1147 hci_abort_conn_sync+0x8c5/0xbb0 net/bluetooth/hci_sync.c:5689 hci_cmd_sync_work+0x281/0x380 net/bluetooth/hci_sync.c:332 process_one_work kernel/workqueue.c:3236 [inline] process_scheduled_works+0x77e/0x1040 kernel/workqueue.c:3319 worker_thread+0xbee/0x1200 kernel/workqueue.c:3400 kthread+0x3c7/0x870 kernel/kthread.c:463 ret_from_fork+0x13a/0x1e0 arch/x86/kernel/process.c:148 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245 </TASK> Allocated by task 31370: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x30/0x70 mm/kasan/common.c:68 poison_kmalloc_redzone mm/kasan/common.c:388 [inline] __kasan_kmalloc+0x82/0x90 mm/kasan/common.c:405 kasan_kmalloc include/linux/kasan.h:260 [inline] __do_kmalloc_node mm/slub.c:4382 [inline] __kmalloc_noprof+0x22f/0x390 mm/slub.c:4394 kmalloc_noprof include/linux/slab.h:909 [inline] sk_prot_alloc+0xae/0x220 net/core/sock.c:2239 sk_alloc+0x34/0x5a0 net/core/sock.c:2295 bt_sock_alloc+0x3c/0x330 net/bluetooth/af_bluetooth.c:151 sco_sock_alloc net/bluetooth/sco.c:562 [inline] sco_sock_create+0xc0/0x350 net/bluetooth/sco.c:593 bt_sock_create+0x161/0x3b0 net/bluetooth/af_bluetooth.c:135 __sock_create+0x3ad/0x780 net/socket.c:1589 sock_create net/socket.c:1647 [inline] __sys_socket_create net/socket.c:1684 [inline] __sys_socket+0xd5/0x330 net/socket.c:1731 __do_sys_socket net/socket.c:1745 [inline] __se_sys_socket net/socket.c:1743 [inline] __x64_sys_socket+0x7a/0x90 net/socket.c:1743 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xc7/0x240 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 31374: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x30/0x70 mm/kasan/common.c:68 kasan_save_free_info+0x40/0x50 mm/kasan/generic.c:576 poison_slab_object mm/kasan/common.c:243 [inline] __kasan_slab_free+0x3d/0x50 mm/kasan/common.c:275 kasan_slab_free include/linux/kasan.h:233 [inline] slab_free_hook mm/slub.c:2428 [inline] slab_free mm/slub.c:4701 [inline] kfree+0x199/0x3b0 mm/slub.c:4900 sk_prot_free net/core/sock.c:2278 [inline] __sk_destruct+0x4aa/0x630 net/core/sock.c:2373 sco_sock_release+0x2ad/0x300 net/bluetooth/sco.c:1333 __sock_release net/socket.c:649 [inline] sock_close+0xb8/0x230 net/socket.c:1439 __fput+0x3d1/0x9e0 fs/file_table.c:468 task_work_run+0x206/0x2a0 kernel/task_work.c:227 get_signal+0x1201/0x1410 kernel/signal.c:2807 arch_do_signal_or_restart+0x34/0x740 arch/x86/kernel/signal.c:337 exit_to_user_mode_loop+0x68/0xc0 kernel/entry/common.c:40 exit_to_user_mode_prepare include/linux/irq-entry-common.h:225 [inline] syscall_exit_to_user_mode_work include/linux/entry-common.h:175 [inline] syscall_exit_to_user_mode include/linux/entry-common.h:210 [inline] do_syscall_64+0x1dd/0x240 arch/x86/entry/syscall_64.c:100 entry_SYSCALL_64_after_hwframe+0x77/0x7f
--- net/bluetooth/sco.c | 7 +++++++ 1 file changed, 7 insertions(+)
net/bluetooth/sco.c +7 -0
@@ -498,6 +498,13 @@ static void sco_sock_kill(struct sock *sk)BT_DBG ("sk %p state %d" , sk, sk->sk_state); +/* Sock is dead, so set conn->sk to NULL to avoid possible UAF */ +if (sco_pi (sk)->conn) { +sco_conn_lock (sco_pi (sk)->conn); +sco_pi (sk)->conn->sk =NULL ; +sco_conn_unlock (sco_pi (sk)->conn); + } +/* Kill poor orphan */ bt_sock_unlink (&sco_sk_list, sk);sock_set_flag (sk,SOCK_DEAD );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 666/849 Bluetooth: btusb: Add new VID/PID 13d3/3633 for MT7922
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Lu <[email protected]>
[ Upstream commit 70cd38d22d4659ca8133c7124528c90678215dda ]
Add VID 13d3 & PID 3633 for MediaTek MT7922 USB Bluetooth chip.
The information in /sys/kernel/debug/usb/devices about the Bluetooth device is listed as the below.
T: Bus=06 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=13d3 ProdID=3633 Rev= 1.00 S: Manufacturer=MediaTek Inc. S: Product=Wireless_Device S: SerialNumber=000000000 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -701,6 +701,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x13d3, 0x3615), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x13d3, 0x3633), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x35f5, 0x7922), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH },
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 667/849 Bluetooth: bcsp: receive data only if registered
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Pravdin <[email protected]>
[ Upstream commit ca94b2b036c22556c3a66f1b80f490882deef7a6 ]
Currently, bcsp_recv() can be called even when the BCSP protocol has not been registered. This leads to a NULL pointer dereference, as shown in the following stack trace:
KASAN: null-ptr-deref in range [0x0000000000000108-0x000000000000010f]
RIP: 0010:bcsp_recv+0x13d/0x1740 drivers/bluetooth/hci_bcsp.c:590
Call Trace:
<TASK>
hci_uart_tty_receive+0x194/0x220 drivers/bluetooth/hci_ldisc.c:627
tiocsti+0x23c/0x2c0 drivers/tty/tty_io.c:2290
tty_ioctl+0x626/0xde0 drivers/tty/tty_io.c:2706
vfs_ioctl fs/ioctl.c:51 [inline]
__do_sys_ioctl fs/ioctl.c:907 [inline]
__se_sys_ioctl+0xfc/0x170 fs/ioctl.c:893
do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94
entry_SYSCALL_64_after_hwframe+0x77/0x7fTo prevent this, ensure that the HCI_UART_REGISTERED flag is set before processing received data. If the protocol is not registered, return -EUNATCH.
--- drivers/bluetooth/hci_bcsp.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/bluetooth/hci_bcsp.c +3 -0
@@ -582,6 +582,9 @@ static int bcsp_recv(struct hci_uart *hu, const void *data, int count)struct bcsp_struct *bcsp = hu->priv;const unsigned char *ptr; +if (!test_bit (HCI_UART_REGISTERED , &hu->flags)) +return -EUNATCH ; +BT_DBG ("hu %p count %d rx_state %d rx_count %ld" , hu, count, bcsp->rx_state, bcsp->rx_count);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 668/849 net: stmmac: est: Drop frames causing HLBS error
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 7ce48d497475d7222bd8258c5c055eb7d928793c ]
Drop those frames causing Head-of-Line Blocking due to Scheduling (HLBS) error to avoid HLBS interrupt flooding and netdev watchdog timeouts due to blocked packets. Tx queues can be configured to drop those blocked packets by setting Drop Frames causing Scheduling Error (DFBS) bit of EST_CONTROL register.
Also, add per queue HLBS drop count.
--- drivers/net/ethernet/stmicro/stmmac/common.h | 1 + drivers/net/ethernet/stmicro/stmmac/stmmac_est.c | 9 ++++++--- drivers/net/ethernet/stmicro/stmmac/stmmac_est.h | 1 + 3 files changed, 8 insertions(+), 3 deletions(-)
drivers/net/ethernet/stmicro/stmmac/common.h +1 -0
@@ -228,6 +228,7 @@ struct stmmac_extra_stats {unsigned long mtl_est_btrlm;unsigned long max_sdu_txq_drop[MTL_MAX_TX_QUEUES ];unsigned long mtl_est_txq_hlbf[MTL_MAX_TX_QUEUES ]; +unsigned long mtl_est_txq_hlbs[MTL_MAX_TX_QUEUES ];/* per queue statistics */ struct stmmac_txq_stats txq_stats[MTL_MAX_TX_QUEUES ];struct stmmac_rxq_stats rxq_stats[MTL_MAX_RX_QUEUES ];
drivers/net/ethernet/stmicro/stmmac/stmmac_est.c +6 -3
@@ -63,7 +63,7 @@ static int est_configure(struct stmmac_priv *priv, struct stmmac_est *cfg,EST_GMAC5_PTOV_SHIFT ; }if (cfg->enable) - ctrl |=EST_EEST |EST_SSWL ; + ctrl |=EST_EEST |EST_SSWL |EST_DFBS ;else ctrl &= ~EST_EEST ;
@@ -109,6 +109,10 @@ static void est_irq_status(struct stmmac_priv *priv, struct net_device *dev, x->mtl_est_hlbs++; +for (i =0 ; i < txqcnt; i++) +if (value &BIT (i)) + x->mtl_est_txq_hlbs[i]++; +/* Clear Interrupt */ writel (value, est_addr +EST_SCH_ERR );
@@ -131,10 +135,9 @@ static void est_irq_status(struct stmmac_priv *priv, struct net_device *dev, x->mtl_est_hlbf++; -for (i =0 ; i < txqcnt; i++) { +for (i =0 ; i < txqcnt; i++)if (feqn &BIT (i)) x->mtl_est_txq_hlbf[i]++; - }/* Clear Interrupt */ writel (feqn, est_addr +EST_FRM_SZ_ERR );
drivers/net/ethernet/stmicro/stmmac/stmmac_est.h +1 -0
@@ -16,6 +16,7 @@#define EST_XGMAC_PTOV_MUL 9#define EST_SSWL BIT(1)#define EST_EEST BIT(0) +#define EST_DFBS BIT(5)#define EST_STATUS 0x00000008#define EST_GMAC5_BTRL GENMASK(11, 8)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 669/849 exfat: limit log print for IO error
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chi Zhiling <[email protected]>
[ Upstream commit 6dfba108387bf4e71411b3da90b2d5cce48ba054 ]
For exFAT filesystems with 4MB read_ahead_size, removing the storage device when the read operation is in progress, which cause the last read syscall spent 150s [1]. The main reason is that exFAT generates excessive log messages [2].
After applying this patch, approximately 300,000 lines of log messages were suppressed, and the delay of the last read() syscall was reduced to about 4 seconds.
[1]:write(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 <0.000120> read(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 <0.000032> write(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072 <0.000119>read(4, 0x7fccf28ae000, 131072) = -1 EIO (Input/output error) <150.186215>
[2]:
[ 333.696603] exFAT-fs (vdb): error, failed to access to FAT (entry 0x0000d780, err:-5) [ 333.697378] exFAT-fs (vdb): error, failed to access to FAT (entry 0x0000d780, err:-5) [ 333.698156] exFAT-fs (vdb): error, failed to access to FAT (entry 0x0000d780, err:-5)
--- fs/exfat/fatent.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
fs/exfat/fatent.c +6 -5
@@ -89,35 +89,36 @@ int exfat_ent_get(struct super_block *sb, unsigned int loc,int err;if (!is_valid_cluster (sbi, loc)) { -exfat_fs_error (sb,"invalid access to FAT (entry 0x%08x)" , +exfat_fs_error_ratelimit (sb, +"invalid access to FAT (entry 0x%08x)" , loc);return -EIO ; } err =__exfat_ent_get (sb, loc, content);if (err) { -exfat_fs_error (sb, +exfat_fs_error_ratelimit (sb,"failed to access to FAT (entry 0x%08x, err:%d)" , loc, err);return err; }if (*content ==EXFAT_FREE_CLUSTER ) { -exfat_fs_error (sb, +exfat_fs_error_ratelimit (sb,"invalid access to FAT free cluster (entry 0x%08x)" , loc);return -EIO ; }if (*content ==EXFAT_BAD_CLUSTER ) { -exfat_fs_error (sb, +exfat_fs_error_ratelimit (sb,"invalid access to FAT bad cluster (entry 0x%08x)" , loc);return -EIO ; }if (*content !=EXFAT_EOF_CLUSTER && !is_valid_cluster (sbi, *content)) { -exfat_fs_error (sb, +exfat_fs_error_ratelimit (sb,"invalid access to FAT (entry 0x%08x) bogus content (0x%08x)" , loc, *content);return -EIO ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 670/849 exfat: validate cluster allocation bits of the allocation bitmap
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
[ Upstream commit 79c1587b6cda74deb0c86fc7ba194b92958c793c ]
syzbot created an exfat image with cluster bits not set for the allocation bitmap. exfat-fs reads and uses the allocation bitmap without checking this. The problem is that if the start cluster of the allocation bitmap is 6, cluster 6 can be allocated when creating a directory with mkdir. exfat zeros out this cluster in exfat_mkdir, which can delete existing entries. This can reallocate the allocated entries. In addition, the allocation bitmap is also zeroed out, so cluster 6 can be reallocated. This patch adds exfat_test_bitmap_range to validate that clusters used for the allocation bitmap are correctly marked as in-use.
--- fs/exfat/balloc.c | 72 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 12 deletions(-)
fs/exfat/balloc.c +60 -12
@@ -26,12 +26,55 @@/* * Allocation Bitmap Management Functions */ +static bool exfat_test_bitmap_range (struct super_block *sb,unsigned int clu, +unsigned int count) +{ +struct exfat_sb_info *sbi =EXFAT_SB (sb); +unsigned int start = clu; +unsigned int end = clu + count; +unsigned int ent_idx, i, b; +unsigned int bit_offset, bits_to_check; +__le_long *bitmap_le; +unsigned long mask, word; + +if (!is_valid_cluster (sbi, start) || !is_valid_cluster (sbi, end -1 )) +return false; + +while (start < end) { + ent_idx =CLUSTER_TO_BITMAP_ENT (start); + i =BITMAP_OFFSET_SECTOR_INDEX (sb, ent_idx); + b =BITMAP_OFFSET_BIT_IN_SECTOR (sb, ent_idx); + + bitmap_le = (__le_long *)sbi->vol_amap[i]->b_data; + +/* Calculate how many bits we can check in the current word */ + bit_offset = b %BITS_PER_LONG ; + bits_to_check =min (end - start, + (unsigned int )(BITS_PER_LONG - bit_offset)); + +/* Create a bitmask for the range of bits to check */ +if (bits_to_check >=BITS_PER_LONG ) + mask = ~0UL ; +else + mask = ((1UL << bits_to_check) -1 ) << bit_offset; + word =lel_to_cpu (bitmap_le[b /BITS_PER_LONG ]); + +/* Check if all bits in the mask are set */ +if ((word & mask) != mask) +return false; + + start += bits_to_check; + } + +return true; +} +static int exfat_allocate_bitmap (struct super_block *sb,struct exfat_dentry *ep) {struct exfat_sb_info *sbi =EXFAT_SB (sb);long long map_size; -unsigned int i, need_map_size; +unsigned int i, j, need_map_size;sector_t sector; sbi->map_clu =le32_to_cpu (ep->dentry.bitmap.start_clu);
@@ -58,20 +101,25 @@ static int exfat_allocate_bitmap(struct super_block *sb, sector =exfat_cluster_to_sector (sbi, sbi->map_clu);for (i =0 ; i < sbi->map_sectors; i++) { sbi->vol_amap[i] =sb_bread (sb, sector + i); -if (!sbi->vol_amap[i]) { -/* release all buffers and free vol_amap */ -int j =0 ; - -while (j < i) -brelse (sbi->vol_amap[j++]); - -kvfree (sbi->vol_amap); - sbi->vol_amap =NULL ; -return -EIO ; - } +if (!sbi->vol_amap[i]) + goto err_out; } +if (exfat_test_bitmap_range (sb, sbi->map_clu, +EXFAT_B_TO_CLU_ROUND_UP (map_size, sbi)) == false) + goto err_out; +return 0 ; + +err_out: + j =0 ; +/* release all buffers and free vol_amap */ +while (j < i) +brelse (sbi->vol_amap[j++]); + +kvfree (sbi->vol_amap); + sbi->vol_amap =NULL ; +return -EIO ; }int exfat_load_bitmap (struct super_block *sb)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 671/849 6pack: drop redundant locking and refcounting
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qingfang Deng <[email protected]>
[ Upstream commit 38b04ed7072e54086102eae2d05d03ffcdb4b695 ]
The TTY layer already serializes line discipline operations with tty->ldisc_sem, so the extra disc_data_lock and refcnt in 6pack are unnecessary.
Removing them simplifies the code and also resolves a lockdep warning reported by syzbot. The warning did not indicate a real deadlock, since the write-side lock was only taken in process context with hardirqs disabled.
--- drivers/net/hamradio/6pack.c | 57 ++++-------------------------------- 1 file changed, 5 insertions(+), 52 deletions(-)
drivers/net/hamradio/6pack.c +5 -52
@@ -115,8 +115,6 @@ struct sixpack {struct timer_list tx_t;struct timer_list resync_t; -refcount_t refcnt; -struct completion dead;spinlock_t lock; };
@@ -353,42 +351,13 @@ static void sp_bump(struct sixpack *sp, char cmd)/* ----------------------------------------------------------------------- */ -/* -* We have a potential race on dereferencing tty->disc_data, because the tty -* layer provides no locking at all - thus one cpu could be running -* sixpack_receive_buf while another calls sixpack_close, which zeroes -* tty->disc_data and frees the memory that sixpack_receive_buf is using. The -* best way to fix this is to use a rwlock in the tty struct, but for now we -* use a single global rwlock for all ttys in ppp line discipline. -*/ -static DEFINE_RWLOCK (disc_data_lock); - -static struct sixpack *sp_get (struct tty_struct *tty) -{ -struct sixpack *sp; - -read_lock (&disc_data_lock); - sp = tty->disc_data; -if (sp) -refcount_inc (&sp->refcnt); -read_unlock (&disc_data_lock); - -return sp; -} - -static void sp_put (struct sixpack *sp) -{ -if (refcount_dec_and_test (&sp->refcnt)) -complete (&sp->dead); -} -/* * Called by the TTY driver when there's room for more data. If we have * more packets to send, we send them here. */ static void sixpack_write_wakeup (struct tty_struct *tty) { -struct sixpack *sp =sp_get (tty); +struct sixpack *sp = tty->disc_data;int actual;if (!sp)
@@ -400,7 +369,7 @@ static void sixpack_write_wakeup(struct tty_struct *tty)clear_bit (TTY_DO_WRITE_WAKEUP , &tty->flags); sp->tx_enable =0 ;netif_wake_queue (sp->dev); - goto out; +return ; }if (sp->tx_enable) {
@@ -408,9 +377,6 @@ static void sixpack_write_wakeup(struct tty_struct *tty) sp->xleft -= actual; sp->xhead += actual; } - -out: -sp_put (sp); }/* ----------------------------------------------------------------------- */
@@ -430,7 +396,7 @@ static void sixpack_receive_buf(struct tty_struct *tty, const u8 *cp,if (!count)return ; - sp =sp_get (tty); + sp = tty->disc_data;if (!sp)return ;
@@ -446,7 +412,6 @@ static void sixpack_receive_buf(struct tty_struct *tty, const u8 *cp, }sixpack_decode (sp, cp, count1); -sp_put (sp);tty_unthrottle (tty); }
@@ -561,8 +526,6 @@ static int sixpack_open(struct tty_struct *tty)spin_lock_init (&sp->lock);spin_lock_init (&sp->rxlock); -refcount_set (&sp->refcnt,1 ); -init_completion (&sp->dead);/* !!! length of the buffers. MTU is IP MTU, not PACLEN! */
@@ -638,19 +601,11 @@ static void sixpack_close(struct tty_struct *tty) {struct sixpack *sp; -write_lock_irq (&disc_data_lock); sp = tty->disc_data; - tty->disc_data =NULL ; -write_unlock_irq (&disc_data_lock);if (!sp)return ; -/* -* We have now ensured that nobody can start using ap from now on, but -* we have to wait for all existing users to finish. -*/ -if (!refcount_dec_and_test (&sp->refcnt)) -wait_for_completion (&sp->dead); + tty->disc_data =NULL ;/* We must stop the queue to avoid potentially scribbling * on the free buffers. The sp->dead completion is not sufficient
@@ -673,7 +628,7 @@ static void sixpack_close(struct tty_struct *tty)static int sixpack_ioctl (struct tty_struct *tty,unsigned int cmd,unsigned long arg) { -struct sixpack *sp =sp_get (tty); +struct sixpack *sp = tty->disc_data;struct net_device *dev;unsigned int tmp, err;
@@ -725,8 +680,6 @@ static int sixpack_ioctl(struct tty_struct *tty, unsigned int cmd, err =tty_mode_ioctl (tty, cmd, arg); } -sp_put (sp); -return err; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 672/849 page_pool: Clamp pool size to max 16K pages
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dragos Tatulea <[email protected]>
[ Upstream commit a1b501a8c6a87c9265fd03bd004035199e2e8128 ]
page_pool_init() returns E2BIG when the page_pool size goes above 32K pages. As some drivers are configuring the page_pool size according to the MTU and ring size, there are cases where this limit is exceeded and the queue creation fails.
The page_pool size doesn't have to cover a full queue, especially for larger ring size. So clamp the size instead of returning an error. Do this in the core to avoid having each driver do the clamping.
The current limit was deemed to high [1] so it was reduced to 16K to avoid page waste.
[1] https://lore.kernel.org/all/[email protected]/
--- net/core/page_pool.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
net/core/page_pool.c +1 -5
@@ -211,11 +211,7 @@ static int page_pool_init(struct page_pool *pool,return -EINVAL ;if (pool->p.pool_size) - ring_qsize = pool->p.pool_size; - -/* Sanity limit mem that can be pinned down */ -if (ring_qsize >32768 ) -return -E2BIG ; + ring_qsize =min (pool->p.pool_size,16384 );/* DMA direction is either DMA_FROM_DEVICE or DMA_BIDIRECTIONAL. * DMA_BIDIRECTIONAL is for allowing page used for DMA sending,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 673/849 orangefs: fix xattr related buffer overflow...
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Marshall <[email protected]>
[ Upstream commit 025e880759c279ec64d0f754fe65bf45961da864 ]
Willy Tarreau <[email protected]> forwarded me a message from Disclosure <[email protected]> with the following warning:
Quoted 5 lines
The helper
xattr_key()uses the pointer variable in the loop condition rather than dereferencing it. Askeyis incremented, it remains non-NULL (until it runs into unmapped memory), so the loop does not terminate on valid C strings and will walk memory indefinitely, consuming CPU or hanging the thread.
I easily reproduced this with setfattr and getfattr, causing a kernel oops, hung user processes and corrupted orangefs files. Disclosure sent along a diff (not a patch) with a suggested fix, which I based this patch on.
After xattr_key started working right, xfstest generic/069 exposed an xattr related memory leak that lead to OOM. xattr_key returns a hashed key. When adding xattrs to the orangefs xattr cache, orangefs used hash_add, a kernel hashing macro. hash_add also hashes the key using hash_log which resulted in additions to the xattr cache going to the wrong hash bucket. generic/069 tortures a single file and orangefs does a getattr for the xattr "security.capability" every time. Orangefs negative caches on xattrs which includes a kmalloc. Since adds to the xattr cache were going to the wrong bucket, every getattr for "security.capability" resulted in another kmalloc, none of which were ever freed.
I changed the two uses of hash_add to hlist_add_head instead and the memory leak ceased and generic/069 quit throwing furniture.
--- fs/orangefs/xattr.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
fs/orangefs/xattr.c +7 -5
@@ -54,7 +54,9 @@ static inline int convert_to_internal_xattr_flags(int setxattr_flags)static unsigned int xattr_key (const char *key) {unsigned int i =0 ; -while (key) +if (!key) +return 0 ; +while (*key) i += *key++;return i %16 ; }
@@ -175,8 +177,8 @@ ssize_t orangefs_inode_getxattr(struct inode *inode, const char *name, cx->length =-1 ; cx->timeout = jiffies + orangefs_getattr_timeout_msecs*HZ /1000 ; -hash_add (orangefs_inode->xattr_cache, &cx->node, -xattr_key (cx->key)); +hlist_add_head ( &cx->node, + &orangefs_inode->xattr_cache[xattr_key (cx->key)]); } } goto out_release_op;
@@ -229,8 +231,8 @@ ssize_t orangefs_inode_getxattr(struct inode *inode, const char *name,memcpy (cx->val, buffer, length); cx->length = length; cx->timeout = jiffies +HZ ; -hash_add (orangefs_inode->xattr_cache, &cx->node, -xattr_key (cx->key)); +hlist_add_head (&cx->node, + &orangefs_inode->xattr_cache[xattr_key (cx->key)]); } }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 674/849 ftrace: Fix softlockup in ftrace_module_enable
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Riabchun <[email protected]>
[ Upstream commit 4099b98203d6b33d990586542fa5beee408032a3 ]
A soft lockup was observed when loading amdgpu module.
If a module has a lot of tracable functions, multiple calls to kallsyms_lookup can spend too much time in RCU critical section and with disabled preemption, causing kernel panic. This is the same issue that was fixed in
commit d0b24b4e91fc ("ftrace: Prevent RCU stall on PREEMPT_VOLUNTARY kernels") and commit 42ea22e754ba ("ftrace: Add cond_resched() to ftrace_graph_set_hash()").
Fix it the same way by adding cond_resched() in ftrace_module_enable.
--- kernel/trace/ftrace.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/trace/ftrace.c +2 -0
@@ -7535,6 +7535,8 @@ void ftrace_module_enable(struct module *mod)if (!within_module (rec->ip, mod))break ; +cond_resched (); +/* Weak functions should still be ignored */ if (!test_for_valid_rec (rec)) {/* Clear all other flags. Should not be enabled anyway */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 675/849 net/mlx5e: Prevent entering switchdev mode with inconsistent netns
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jianbo Liu <[email protected]>
[ Upstream commit 06fdc45f16c392dc3394c67e7c17ae63935715d3 ]
When a PF enters switchdev mode, its netdevice becomes the uplink representor but remains in its current network namespace. All other representors (VFs, SFs) are created in the netns of the devlink instance.
If the PF's netns has been moved and differs from the devlink's netns, enabling switchdev mode would create a state where the OVS control plane (ovs-vsctl) cannot manage the switch because the PF uplink representor and the other representors are split across different namespaces.
To prevent this inconsistent configuration, block the request to enter switchdev mode if the PF netdevice's netns does not match the netns of its devlink instance.
As part of this change, the PF's netns is first marked as immutable. This prevents race conditions where the netns could be changed after the check is performed but before the mode transition is complete, and it aligns the PF's behavior with that of the final uplink representor.
--- .../mellanox/mlx5/core/eswitch_offloads.c | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +33 -0
@@ -3739,6 +3739,29 @@ void mlx5_eswitch_unblock_mode(struct mlx5_core_dev *dev)up_write (&esw->mode_lock); } +/* Returns false only when uplink netdev exists and its netns is different from +* devlink's netns. True for all others so entering switchdev mode is allowed. +*/ +static bool mlx5_devlink_netdev_netns_immutable_set (struct devlink *devlink, +bool immutable) +{ +struct mlx5_core_dev *mdev =devlink_priv (devlink); +struct net_device *netdev; +bool ret; + + netdev =mlx5_uplink_netdev_get (mdev); +if (!netdev) +return true; + +rtnl_lock (); + netdev->netns_immutable = immutable; + ret =net_eq (dev_net (netdev),devlink_net (devlink)); +rtnl_unlock (); + +mlx5_uplink_netdev_put (mdev, netdev); +return ret; +} +int mlx5_devlink_eswitch_mode_set (struct devlink *devlink,u16 mode,struct netlink_ext_ack *extack) {
@@ -3781,6 +3804,14 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode, esw->eswitch_operation_in_progress = true;up_write (&esw->mode_lock); +if (mode ==DEVLINK_ESWITCH_MODE_SWITCHDEV && + !mlx5_devlink_netdev_netns_immutable_set (devlink, true)) { +NL_SET_ERR_MSG_MOD (extack, +"Can't change E-Switch mode to switchdev when netdev net namespace has diverged from the devlink's." ); + err = -EINVAL ; + goto skip; + } +if (mode ==DEVLINK_ESWITCH_MODE_LEGACY ) esw->dev->priv.flags |=MLX5_PRIV_FLAGS_SWITCH_LEGACY ;mlx5_eswitch_disable_locked (esw);
@@ -3799,6 +3830,8 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode, } skip: +if (mode ==DEVLINK_ESWITCH_MODE_SWITCHDEV && err) +mlx5_devlink_netdev_netns_immutable_set (devlink, false);down_write (&esw->mode_lock); esw->eswitch_operation_in_progress = false; unlock:
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 676/849 ksmbd: use sock_create_kern interface to create kernel socket
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
[ Upstream commit 3677ca67b9791481af16d86e47c3c7d1f2442f95 ]
we should use sock_create_kern() if the socket resides in kernel space.
--- fs/smb/server/transport_tcp.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
fs/smb/server/transport_tcp.c +4 -3
@@ -473,12 +473,13 @@ static int create_socket(struct interface *iface)struct socket *ksmbd_socket;bool ipv4 = false; - ret =sock_create (PF_INET6 ,SOCK_STREAM ,IPPROTO_TCP , &ksmbd_socket); + ret =sock_create_kern (current->nsproxy->net_ns,PF_INET6 ,SOCK_STREAM , +IPPROTO_TCP , &ksmbd_socket);if (ret) {if (ret != -EAFNOSUPPORT )pr_err ("Can't create socket for ipv6, fallback to ipv4: %d\n" , ret); - ret =sock_create (PF_INET ,SOCK_STREAM ,IPPROTO_TCP , - &ksmbd_socket); + ret =sock_create_kern (current->nsproxy->net_ns,PF_INET , +SOCK_STREAM ,IPPROTO_TCP , &ksmbd_socket);if (ret) {pr_err ("Can't create socket for ipv4: %d\n" , ret); goto out_clear;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 677/849 smb: client: update cfid->last_access_time in open_cached_dir_by_dentry()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Henrique Carvalho <[email protected]>
[ Upstream commit 5676398315b73f21d6a4e2d36606ce94e8afc79e ]
open_cached_dir_by_dentry() was missing an update of cfid->last_access_time to jiffies, similar to what open_cached_dir() has.
Add it to the function.
--- fs/smb/client/cached_dir.c | 1 + 1 file changed, 1 insertion(+)
fs/smb/client/cached_dir.c +1 -0
@@ -423,6 +423,7 @@ int open_cached_dir_by_dentry(struct cifs_tcon *tcon,cifs_dbg (FYI ,"found a cached file handle by dentry\n" );kref_get (&cfid->refcount); *ret_cfid = cfid; + cfid->last_access_time = jiffies;spin_unlock (&cfids->cfid_list_lock);return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 678/849 smb: client: transport: avoid reconnects triggered by pending task work
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fiona Ebner <[email protected]>
[ Upstream commit 00be6f26a2a7c671f1402d74c4d3c30a5844660a ]
When io_uring is used in the same task as CIFS, there might be unnecessary reconnects, causing issues in user-space applications like QEMU with a log like:
Quoted 1 line
CIFS: VFS: \\10.10.100.81 Error -512 sending data on socket to server
Certain io_uring completions might be added to task_work with notify_method being TWA_SIGNAL and thus TIF_NOTIFY_SIGNAL is set for the task.
In __smb_send_rqst(), signals are masked before calling smb_send_kvec(), but the masking does not apply to TIF_NOTIFY_SIGNAL.
If sk_stream_wait_memory() is reached via sock_sendmsg() while TIF_NOTIFY_SIGNAL is set, signal_pending(current) will evaluate to true there, and -EINTR will be propagated all the way from sk_stream_wait_memory() to sock_sendmsg() in smb_send_kvec(). Afterwards, __smb_send_rqst() will see that not everything was written and reconnect.
--- fs/smb/client/transport.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
fs/smb/client/transport.c +9 -1
@@ -22,6 +22,7 @@#include <linux/mempool.h> #include <linux/sched/signal.h> #include <linux/task_io_accounting_ops.h> +#include <linux/task_work.h> #include "cifspdu.h" #include "cifsglob.h" #include "cifsproto.h"
@@ -173,9 +174,16 @@ smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg,* send a packet. In most cases if we fail to send * after the retries we will kill the socket and * reconnect which may clear the network problem. +* +* Even if regular signals are masked, EINTR might be +* propagated from sk_stream_wait_memory() to here when +* TIF_NOTIFY_SIGNAL is used for task work. For example, +* certain io_uring completions will use that. Treat +* having EINTR with pending task work the same as EAGAIN +* to avoid unnecessary reconnects. */ rc =sock_sendmsg (ssocket, smb_msg); -if (rc == -EAGAIN ) { +if (rc == -EAGAIN ||unlikely (rc == -EINTR &&task_work_pending (current))) { retries++;if (retries >=14 || (!server->noblocksnd && (retries >2 ))) {
Signature · 1 line
2.51.0