Skip to content

Commit faa7268

Browse files
LorenzoBianconinbd168
authored andcommitted
mt76: mt7615: run key configuration in mt7615_set_key for usb/sdio devices
Since rate configuration is run holding dev mutex, we can run key configuration in mt7615_set_key for usb/sdio devices avoiding to schedule the workqueue Tested-by: Tested-by: YN Chen <[email protected]> Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Felix Fietkau <[email protected]>
1 parent 930e0ea commit faa7268

File tree

4 files changed

+44
-141
lines changed

4 files changed

+44
-141
lines changed

drivers/net/wireless/mediatek/mt76/mt7615/mac.c

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,32 +1030,32 @@ void mt7615_mac_set_rates(struct mt7615_phy *phy, struct mt7615_sta *sta,
10301030
}
10311031
EXPORT_SYMBOL_GPL(mt7615_mac_set_rates);
10321032

1033-
int mt7615_mac_wtbl_update_key(struct mt7615_dev *dev,
1034-
struct mt76_wcid *wcid,
1035-
u8 *key, u8 keylen,
1036-
enum mt7615_cipher_type cipher,
1037-
enum set_key_cmd cmd)
1033+
static int
1034+
mt7615_mac_wtbl_update_key(struct mt7615_dev *dev, struct mt76_wcid *wcid,
1035+
struct ieee80211_key_conf *key,
1036+
enum mt7615_cipher_type cipher,
1037+
enum set_key_cmd cmd)
10381038
{
10391039
u32 addr = mt7615_mac_wtbl_addr(dev, wcid->idx) + 30 * 4;
10401040
u8 data[32] = {};
10411041

1042-
if (keylen > sizeof(data))
1042+
if (key->keylen > sizeof(data))
10431043
return -EINVAL;
10441044

10451045
mt76_rr_copy(dev, addr, data, sizeof(data));
10461046
if (cmd == SET_KEY) {
10471047
if (cipher == MT_CIPHER_TKIP) {
10481048
/* Rx/Tx MIC keys are swapped */
1049-
memcpy(data, key, 16);
1050-
memcpy(data + 16, key + 24, 8);
1051-
memcpy(data + 24, key + 16, 8);
1049+
memcpy(data, key->key, 16);
1050+
memcpy(data + 16, key->key + 24, 8);
1051+
memcpy(data + 24, key->key + 16, 8);
10521052
} else {
10531053
if (cipher != MT_CIPHER_BIP_CMAC_128 && wcid->cipher)
10541054
memmove(data + 16, data, 16);
10551055
if (cipher != MT_CIPHER_BIP_CMAC_128 || !wcid->cipher)
1056-
memcpy(data, key, keylen);
1056+
memcpy(data, key->key, key->keylen);
10571057
else if (cipher == MT_CIPHER_BIP_CMAC_128)
1058-
memcpy(data + 16, key, 16);
1058+
memcpy(data + 16, key->key, 16);
10591059
}
10601060
} else {
10611061
if (wcid->cipher & ~BIT(cipher)) {
@@ -1070,12 +1070,11 @@ int mt7615_mac_wtbl_update_key(struct mt7615_dev *dev,
10701070

10711071
return 0;
10721072
}
1073-
EXPORT_SYMBOL_GPL(mt7615_mac_wtbl_update_key);
10741073

1075-
int mt7615_mac_wtbl_update_pk(struct mt7615_dev *dev,
1076-
struct mt76_wcid *wcid,
1077-
enum mt7615_cipher_type cipher,
1078-
int keyidx, enum set_key_cmd cmd)
1074+
static int
1075+
mt7615_mac_wtbl_update_pk(struct mt7615_dev *dev, struct mt76_wcid *wcid,
1076+
enum mt7615_cipher_type cipher,
1077+
int keyidx, enum set_key_cmd cmd)
10791078
{
10801079
u32 addr = mt7615_mac_wtbl_addr(dev, wcid->idx), w0, w1;
10811080

@@ -1107,12 +1106,11 @@ int mt7615_mac_wtbl_update_pk(struct mt7615_dev *dev,
11071106

11081107
return 0;
11091108
}
1110-
EXPORT_SYMBOL_GPL(mt7615_mac_wtbl_update_pk);
11111109

1112-
void mt7615_mac_wtbl_update_cipher(struct mt7615_dev *dev,
1113-
struct mt76_wcid *wcid,
1114-
enum mt7615_cipher_type cipher,
1115-
enum set_key_cmd cmd)
1110+
static void
1111+
mt7615_mac_wtbl_update_cipher(struct mt7615_dev *dev, struct mt76_wcid *wcid,
1112+
enum mt7615_cipher_type cipher,
1113+
enum set_key_cmd cmd)
11161114
{
11171115
u32 addr = mt7615_mac_wtbl_addr(dev, wcid->idx);
11181116

@@ -1130,12 +1128,11 @@ void mt7615_mac_wtbl_update_cipher(struct mt7615_dev *dev,
11301128
mt76_clear(dev, addr + 2 * 4, MT_WTBL_W2_KEY_TYPE);
11311129
}
11321130
}
1133-
EXPORT_SYMBOL_GPL(mt7615_mac_wtbl_update_cipher);
11341131

1135-
int mt7615_mac_wtbl_set_key(struct mt7615_dev *dev,
1136-
struct mt76_wcid *wcid,
1137-
struct ieee80211_key_conf *key,
1138-
enum set_key_cmd cmd)
1132+
int __mt7615_mac_wtbl_set_key(struct mt7615_dev *dev,
1133+
struct mt76_wcid *wcid,
1134+
struct ieee80211_key_conf *key,
1135+
enum set_key_cmd cmd)
11391136
{
11401137
enum mt7615_cipher_type cipher;
11411138
int err;
@@ -1144,25 +1141,32 @@ int mt7615_mac_wtbl_set_key(struct mt7615_dev *dev,
11441141
if (cipher == MT_CIPHER_NONE)
11451142
return -EOPNOTSUPP;
11461143

1147-
spin_lock_bh(&dev->mt76.lock);
1148-
11491144
mt7615_mac_wtbl_update_cipher(dev, wcid, cipher, cmd);
1150-
err = mt7615_mac_wtbl_update_key(dev, wcid, key->key, key->keylen,
1151-
cipher, cmd);
1145+
err = mt7615_mac_wtbl_update_key(dev, wcid, key, cipher, cmd);
11521146
if (err < 0)
1153-
goto out;
1147+
return err;
11541148

1155-
err = mt7615_mac_wtbl_update_pk(dev, wcid, cipher, key->keyidx,
1156-
cmd);
1149+
err = mt7615_mac_wtbl_update_pk(dev, wcid, cipher, key->keyidx, cmd);
11571150
if (err < 0)
1158-
goto out;
1151+
return err;
11591152

11601153
if (cmd == SET_KEY)
11611154
wcid->cipher |= BIT(cipher);
11621155
else
11631156
wcid->cipher &= ~BIT(cipher);
11641157

1165-
out:
1158+
return 0;
1159+
}
1160+
1161+
int mt7615_mac_wtbl_set_key(struct mt7615_dev *dev,
1162+
struct mt76_wcid *wcid,
1163+
struct ieee80211_key_conf *key,
1164+
enum set_key_cmd cmd)
1165+
{
1166+
int err;
1167+
1168+
spin_lock_bh(&dev->mt76.lock);
1169+
err = __mt7615_mac_wtbl_set_key(dev, wcid, key, cmd);
11661170
spin_unlock_bh(&dev->mt76.lock);
11671171

11681172
return err;

drivers/net/wireless/mediatek/mt76/mt7615/main.c

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -320,39 +320,6 @@ int mt7615_set_channel(struct mt7615_phy *phy)
320320
return ret;
321321
}
322322

323-
static int
324-
mt7615_queue_key_update(struct mt7615_dev *dev, enum set_key_cmd cmd,
325-
struct mt7615_sta *msta,
326-
struct ieee80211_key_conf *key)
327-
{
328-
struct mt7615_wtbl_desc *wd;
329-
330-
wd = kzalloc(sizeof(*wd), GFP_KERNEL);
331-
if (!wd)
332-
return -ENOMEM;
333-
334-
wd->type = MT7615_WTBL_KEY_DESC;
335-
wd->sta = msta;
336-
337-
wd->key.key = kmemdup(key->key, key->keylen, GFP_KERNEL);
338-
if (!wd->key.key) {
339-
kfree(wd);
340-
return -ENOMEM;
341-
}
342-
wd->key.cipher = key->cipher;
343-
wd->key.keyidx = key->keyidx;
344-
wd->key.keylen = key->keylen;
345-
wd->key.cmd = cmd;
346-
347-
spin_lock_bh(&dev->mt76.lock);
348-
list_add_tail(&wd->node, &dev->wd_head);
349-
spin_unlock_bh(&dev->mt76.lock);
350-
351-
queue_work(dev->mt76.wq, &dev->wtbl_work);
352-
353-
return 0;
354-
}
355-
356323
static int mt7615_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
357324
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
358325
struct ieee80211_key_conf *key)
@@ -406,7 +373,7 @@ static int mt7615_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
406373
if (mt76_is_mmio(&dev->mt76))
407374
err = mt7615_mac_wtbl_set_key(dev, wcid, key, cmd);
408375
else
409-
err = mt7615_queue_key_update(dev, cmd, msta, key);
376+
err = __mt7615_mac_wtbl_set_key(dev, wcid, key, cmd);
410377

411378
mt7615_mutex_release(dev);
412379

drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,6 @@ struct mt7615_rate_desc {
108108

109109
enum mt7615_wtbl_desc_type {
110110
MT7615_WTBL_RATE_DESC,
111-
MT7615_WTBL_KEY_DESC
112-
};
113-
114-
struct mt7615_key_desc {
115-
enum set_key_cmd cmd;
116-
u32 cipher;
117-
s8 keyidx;
118-
u8 keylen;
119-
u8 *key;
120111
};
121112

122113
struct mt7615_wtbl_desc {
@@ -127,7 +118,6 @@ struct mt7615_wtbl_desc {
127118

128119
union {
129120
struct mt7615_rate_desc rate;
130-
struct mt7615_key_desc key;
131121
};
132122
};
133123

@@ -571,22 +561,13 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,
571561
struct ieee80211_sta *sta, int pid,
572562
struct ieee80211_key_conf *key, bool beacon);
573563
void mt7615_mac_set_timing(struct mt7615_phy *phy);
564+
int __mt7615_mac_wtbl_set_key(struct mt7615_dev *dev,
565+
struct mt76_wcid *wcid,
566+
struct ieee80211_key_conf *key,
567+
enum set_key_cmd cmd);
574568
int mt7615_mac_wtbl_set_key(struct mt7615_dev *dev, struct mt76_wcid *wcid,
575569
struct ieee80211_key_conf *key,
576570
enum set_key_cmd cmd);
577-
int mt7615_mac_wtbl_update_pk(struct mt7615_dev *dev,
578-
struct mt76_wcid *wcid,
579-
enum mt7615_cipher_type cipher,
580-
int keyidx, enum set_key_cmd cmd);
581-
void mt7615_mac_wtbl_update_cipher(struct mt7615_dev *dev,
582-
struct mt76_wcid *wcid,
583-
enum mt7615_cipher_type cipher,
584-
enum set_key_cmd cmd);
585-
int mt7615_mac_wtbl_update_key(struct mt7615_dev *dev,
586-
struct mt76_wcid *wcid,
587-
u8 *key, u8 keylen,
588-
enum mt7615_cipher_type cipher,
589-
enum set_key_cmd cmd);
590571
void mt7615_mac_reset_work(struct work_struct *work);
591572
u32 mt7615_mac_get_sta_tid_sn(struct mt7615_dev *dev, int wcid, u8 tid);
592573

drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -132,52 +132,6 @@ mt7663_usb_sdio_set_rates(struct mt7615_dev *dev,
132132
return 0;
133133
}
134134

135-
static int
136-
mt7663_usb_sdio_set_key(struct mt7615_dev *dev,
137-
struct mt7615_wtbl_desc *wd)
138-
{
139-
struct mt7615_key_desc *key = &wd->key;
140-
struct mt7615_sta *sta = wd->sta;
141-
enum mt7615_cipher_type cipher;
142-
struct mt76_wcid *wcid;
143-
int err;
144-
145-
lockdep_assert_held(&dev->mt76.mutex);
146-
147-
if (!sta) {
148-
err = -EINVAL;
149-
goto out;
150-
}
151-
152-
cipher = mt7615_mac_get_cipher(key->cipher);
153-
if (cipher == MT_CIPHER_NONE) {
154-
err = -EOPNOTSUPP;
155-
goto out;
156-
}
157-
158-
wcid = &wd->sta->wcid;
159-
160-
mt7615_mac_wtbl_update_cipher(dev, wcid, cipher, key->cmd);
161-
err = mt7615_mac_wtbl_update_key(dev, wcid, key->key, key->keylen,
162-
cipher, key->cmd);
163-
if (err < 0)
164-
goto out;
165-
166-
err = mt7615_mac_wtbl_update_pk(dev, wcid, cipher, key->keyidx,
167-
key->cmd);
168-
if (err < 0)
169-
goto out;
170-
171-
if (key->cmd == SET_KEY)
172-
wcid->cipher |= BIT(cipher);
173-
else
174-
wcid->cipher &= ~BIT(cipher);
175-
out:
176-
kfree(key->key);
177-
178-
return err;
179-
}
180-
181135
void mt7663_usb_sdio_wtbl_work(struct work_struct *work)
182136
{
183137
struct mt7615_wtbl_desc *wd, *wd_next;
@@ -201,9 +155,6 @@ void mt7663_usb_sdio_wtbl_work(struct work_struct *work)
201155
case MT7615_WTBL_RATE_DESC:
202156
mt7663_usb_sdio_set_rates(dev, wd);
203157
break;
204-
case MT7615_WTBL_KEY_DESC:
205-
mt7663_usb_sdio_set_key(dev, wd);
206-
break;
207158
}
208159

209160
mt7615_mutex_release(dev);

0 commit comments

Comments
 (0)