> -----Original Message----- > From: Martin Blumenstingl <martin.blumenstingl@xxxxxxxxxxxxxx> > Sent: Wednesday, December 29, 2021 5:15 AM > To: linux-wireless@xxxxxxxxxxxxxxx > Cc: tony0620emma@xxxxxxxxx; kvalo@xxxxxxxxxxxxxx; johannes@xxxxxxxxxxxxxxxx; netdev@xxxxxxxxxxxxxxx; > linux-kernel@xxxxxxxxxxxxxxx; Neo Jou <neojou@xxxxxxxxx>; Jernej Skrabec <jernej.skrabec@xxxxxxxxx>; > Pkshih <pkshih@xxxxxxxxxxx>; Martin Blumenstingl <martin.blumenstingl@xxxxxxxxxxxxxx> > Subject: [PATCH 3/9] rtw88: Move rtw_update_sta_info() out of rtw_ra_mask_info_update_iter() > > rtw_update_sta_info() internally access some registers while being > called unter an atomic lock acquired by rtw_iterate_vifs_atomic(). Move > rtw_update_sta_info() call out of (rtw_ra_mask_info_update_iter) in > preparation for SDIO support where register access may sleep. > > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@xxxxxxxxxxxxxx> > --- > v1 -> v2: > - this patch is new in v2 > - keep rtw_iterate_vifs_atomic() to prevent deadlocks as Johannes > suggested. Keep track of all relevant stations inside > rtw_ra_mask_info_update_iter() and the iter-data and then call > rtw_update_sta_info() while held under rtwdev->mutex instead > > drivers/net/wireless/realtek/rtw88/mac80211.c | 14 +++++++++++++- > 1 file changed, 13 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c > b/drivers/net/wireless/realtek/rtw88/mac80211.c > index ae7d97de5fdf..3bd12354a8a1 100644 > --- a/drivers/net/wireless/realtek/rtw88/mac80211.c > +++ b/drivers/net/wireless/realtek/rtw88/mac80211.c [...] > @@ -699,11 +702,20 @@ static void rtw_ra_mask_info_update(struct rtw_dev *rtwdev, > const struct cfg80211_bitrate_mask *mask) > { > struct rtw_iter_bitrate_mask_data br_data; > + unsigned int i; > + > + mutex_lock(&rtwdev->mutex); I think this lock is used to protect br_data.si[i], right? And, I prefer to move mutex lock to caller, like: @@ -734,7 +734,9 @@ static int rtw_ops_set_bitrate_mask(struct ieee80211_hw *hw, { struct rtw_dev *rtwdev = hw->priv; + mutex_lock(&rtwdev->mutex); rtw_ra_mask_info_update(rtwdev, vif, mask); + mutex_unlock(&rtwdev->mutex); return 0; } > > br_data.rtwdev = rtwdev; > br_data.vif = vif; > br_data.mask = mask; > + br_data.num_si = 0; > rtw_iterate_stas_atomic(rtwdev, rtw_ra_mask_info_update_iter, &br_data); > + > + for (i = 0; i < br_data.num_si; i++) > + rtw_update_sta_info(rtwdev, br_data.si[i]); > + > + mutex_unlock(&rtwdev->mutex); > } > -- Ping-Ke