Skip to content

Commit d08aeb9

Browse files
author
Kalle Valo
committed
Merge tag 'mt76-for-kvalo-2024-05-02' of https://github.com/nbd168/wireless
mt76 patches for 6.10 - fixes - mt7603 stability improvements - mt7921 LED control - mt7925 EHT radiotap support
2 parents daf85b7 + 59f4c57 commit d08aeb9

39 files changed

+656
-145
lines changed

drivers/net/wireless/mediatek/mt76/dma.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ mt76_dma_tx_queue_skb_raw(struct mt76_dev *dev, struct mt76_queue *q,
532532
}
533533

534534
static int
535-
mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
535+
mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,
536536
enum mt76_txq_id qid, struct sk_buff *skb,
537537
struct mt76_wcid *wcid, struct ieee80211_sta *sta)
538538
{
@@ -542,14 +542,15 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
542542
struct mt76_tx_info tx_info = {
543543
.skb = skb,
544544
};
545+
struct mt76_dev *dev = phy->dev;
545546
struct ieee80211_hw *hw;
546547
int len, n = 0, ret = -ENOMEM;
547548
struct mt76_txwi_cache *t;
548549
struct sk_buff *iter;
549550
dma_addr_t addr;
550551
u8 *txwi;
551552

552-
if (test_bit(MT76_RESET, &dev->phy.state))
553+
if (test_bit(MT76_RESET, &phy->state))
553554
goto free_skb;
554555

555556
t = mt76_get_txwi(dev);

drivers/net/wireless/mediatek/mt76/mac80211.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@ mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw)
465465
ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
466466
ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
467467
ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
468+
ieee80211_hw_set(hw, SPECTRUM_MGMT);
468469

469470
if (!(dev->drv->drv_flags & MT_DRV_AMSDU_OFFLOAD) &&
470471
hw->max_tx_fragments > 1) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ struct mt76_queue_ops {
256256
int idx, int n_desc, int bufsize,
257257
u32 ring_base);
258258

259-
int (*tx_queue_skb)(struct mt76_dev *dev, struct mt76_queue *q,
259+
int (*tx_queue_skb)(struct mt76_phy *phy, struct mt76_queue *q,
260260
enum mt76_txq_id qid, struct sk_buff *skb,
261261
struct mt76_wcid *wcid, struct ieee80211_sta *sta);
262262

@@ -1127,7 +1127,7 @@ static inline int mt76_wed_dma_setup(struct mt76_dev *dev, struct mt76_queue *q,
11271127
#define mt76_init_queues(dev, ...) (dev)->mt76.queue_ops->init(&((dev)->mt76), __VA_ARGS__)
11281128
#define mt76_queue_alloc(dev, ...) (dev)->mt76.queue_ops->alloc(&((dev)->mt76), __VA_ARGS__)
11291129
#define mt76_tx_queue_skb_raw(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb_raw(&((dev)->mt76), __VA_ARGS__)
1130-
#define mt76_tx_queue_skb(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb(&((dev)->mt76), __VA_ARGS__)
1130+
#define mt76_tx_queue_skb(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb(&((dev)->mphy), __VA_ARGS__)
11311131
#define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__)
11321132
#define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__)
11331133
#define mt76_queue_rx_cleanup(dev, ...) (dev)->mt76.queue_ops->rx_cleanup(&((dev)->mt76), __VA_ARGS__)

drivers/net/wireless/mediatek/mt76/mt7603/dma.c

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44
#include "mac.h"
55
#include "../dma.h"
66

7+
static const u8 wmm_queue_map[] = {
8+
[IEEE80211_AC_BK] = 0,
9+
[IEEE80211_AC_BE] = 1,
10+
[IEEE80211_AC_VI] = 2,
11+
[IEEE80211_AC_VO] = 3,
12+
};
13+
714
static void
815
mt7603_rx_loopback_skb(struct mt7603_dev *dev, struct sk_buff *skb)
916
{
@@ -22,10 +29,10 @@ mt7603_rx_loopback_skb(struct mt7603_dev *dev, struct sk_buff *skb)
2229
struct ieee80211_sta *sta;
2330
struct mt7603_sta *msta;
2431
struct mt76_wcid *wcid;
32+
u8 tid = 0, hwq = 0;
2533
void *priv;
2634
int idx;
2735
u32 val;
28-
u8 tid = 0;
2936

3037
if (skb->len < MT_TXD_SIZE + sizeof(struct ieee80211_hdr))
3138
goto free;
@@ -42,19 +49,36 @@ mt7603_rx_loopback_skb(struct mt7603_dev *dev, struct sk_buff *skb)
4249
goto free;
4350

4451
priv = msta = container_of(wcid, struct mt7603_sta, wcid);
45-
val = le32_to_cpu(txd[0]);
46-
val &= ~(MT_TXD0_P_IDX | MT_TXD0_Q_IDX);
47-
val |= FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_HW_QUEUE_MGMT);
48-
txd[0] = cpu_to_le32(val);
4952

5053
sta = container_of(priv, struct ieee80211_sta, drv_priv);
5154
hdr = (struct ieee80211_hdr *)&skb->data[MT_TXD_SIZE];
52-
if (ieee80211_is_data_qos(hdr->frame_control))
55+
56+
hwq = wmm_queue_map[IEEE80211_AC_BE];
57+
if (ieee80211_is_data_qos(hdr->frame_control)) {
5358
tid = *ieee80211_get_qos_ctl(hdr) &
54-
IEEE80211_QOS_CTL_TAG1D_MASK;
55-
skb_set_queue_mapping(skb, tid_to_ac[tid]);
59+
IEEE80211_QOS_CTL_TAG1D_MASK;
60+
u8 qid = tid_to_ac[tid];
61+
hwq = wmm_queue_map[qid];
62+
skb_set_queue_mapping(skb, qid);
63+
} else if (ieee80211_is_data(hdr->frame_control)) {
64+
skb_set_queue_mapping(skb, IEEE80211_AC_BE);
65+
hwq = wmm_queue_map[IEEE80211_AC_BE];
66+
} else {
67+
skb_pull(skb, MT_TXD_SIZE);
68+
if (!ieee80211_is_bufferable_mmpdu(skb))
69+
goto free;
70+
skb_push(skb, MT_TXD_SIZE);
71+
skb_set_queue_mapping(skb, MT_TXQ_PSD);
72+
hwq = MT_TX_HW_QUEUE_MGMT;
73+
}
74+
5675
ieee80211_sta_set_buffered(sta, tid, true);
5776

77+
val = le32_to_cpu(txd[0]);
78+
val &= ~(MT_TXD0_P_IDX | MT_TXD0_Q_IDX);
79+
val |= FIELD_PREP(MT_TXD0_Q_IDX, hwq);
80+
txd[0] = cpu_to_le32(val);
81+
5882
spin_lock_bh(&dev->ps_lock);
5983
__skb_queue_tail(&msta->psq, skb);
6084
if (skb_queue_len(&msta->psq) >= 64) {
@@ -151,12 +175,6 @@ static int mt7603_poll_tx(struct napi_struct *napi, int budget)
151175

152176
int mt7603_dma_init(struct mt7603_dev *dev)
153177
{
154-
static const u8 wmm_queue_map[] = {
155-
[IEEE80211_AC_BK] = 0,
156-
[IEEE80211_AC_BE] = 1,
157-
[IEEE80211_AC_VI] = 2,
158-
[IEEE80211_AC_VO] = 3,
159-
};
160178
int ret;
161179
int i;
162180

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,6 +1393,7 @@ void mt7603_pse_client_reset(struct mt7603_dev *dev)
13931393
MT_CLIENT_RESET_TX_R_E_2_S);
13941394

13951395
/* Start PSE client TX abort */
1396+
mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_FORCE_TX_EOF);
13961397
mt76_set(dev, addr, MT_CLIENT_RESET_TX_R_E_1);
13971398
mt76_poll_msec(dev, addr, MT_CLIENT_RESET_TX_R_E_1_S,
13981399
MT_CLIENT_RESET_TX_R_E_1_S, 500);

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,19 @@ static inline bool is_mt7925(struct mt76_dev *dev)
177177
return mt76_chip(dev) == 0x7925;
178178
}
179179

180+
static inline bool is_mt7920(struct mt76_dev *dev)
181+
{
182+
return mt76_chip(dev) == 0x7920;
183+
}
184+
180185
static inline bool is_mt7922(struct mt76_dev *dev)
181186
{
182187
return mt76_chip(dev) == 0x7922;
183188
}
184189

185190
static inline bool is_mt7921(struct mt76_dev *dev)
186191
{
187-
return mt76_chip(dev) == 0x7961 || is_mt7922(dev);
192+
return mt76_chip(dev) == 0x7961 || is_mt7922(dev) || is_mt7920(dev);
188193
}
189194

190195
static inline bool is_mt7663(struct mt76_dev *dev)
@@ -259,6 +264,7 @@ static inline bool is_mt76_fw_txp(struct mt76_dev *dev)
259264
{
260265
switch (mt76_chip(dev)) {
261266
case 0x7961:
267+
case 0x7920:
262268
case 0x7922:
263269
case 0x7925:
264270
case 0x7663:
@@ -445,4 +451,6 @@ void mt76_connac2_tx_token_put(struct mt76_dev *dev);
445451
/* connac3 */
446452
void mt76_connac3_mac_decode_he_radiotap(struct sk_buff *skb, __le32 *rxv,
447453
u8 mode);
454+
void mt76_connac3_mac_decode_eht_radiotap(struct sk_buff *skb, __le32 *rxv,
455+
u8 mode);
448456
#endif /* __MT76_CONNAC_H */

drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.c

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
#include "dma.h"
77

88
#define HE_BITS(f) cpu_to_le16(IEEE80211_RADIOTAP_HE_##f)
9+
#define EHT_BITS(f) cpu_to_le32(IEEE80211_RADIOTAP_EHT_##f)
910
#define HE_PREP(f, m, v) le16_encode_bits(le32_get_bits(v, MT_CRXV_HE_##m),\
1011
IEEE80211_RADIOTAP_HE_##f)
12+
#define EHT_PREP(f, m, v) le32_encode_bits(le32_get_bits(v, MT_CRXV_EHT_##m),\
13+
IEEE80211_RADIOTAP_EHT_##f)
1114

1215
static void
1316
mt76_connac3_mac_decode_he_radiotap_ru(struct mt76_rx_status *status,
@@ -180,3 +183,85 @@ void mt76_connac3_mac_decode_he_radiotap(struct sk_buff *skb, __le32 *rxv,
180183
}
181184
}
182185
EXPORT_SYMBOL_GPL(mt76_connac3_mac_decode_he_radiotap);
186+
187+
static void *
188+
mt76_connac3_mac_radiotap_push_tlv(struct sk_buff *skb, u16 type, u16 len)
189+
{
190+
struct ieee80211_radiotap_tlv *tlv;
191+
192+
tlv = skb_push(skb, sizeof(*tlv) + len);
193+
tlv->type = cpu_to_le16(type);
194+
tlv->len = cpu_to_le16(len);
195+
memset(tlv->data, 0, len);
196+
197+
return tlv->data;
198+
}
199+
200+
void mt76_connac3_mac_decode_eht_radiotap(struct sk_buff *skb, __le32 *rxv,
201+
u8 mode)
202+
{
203+
struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
204+
struct ieee80211_radiotap_eht_usig *usig;
205+
struct ieee80211_radiotap_eht *eht;
206+
u32 ltf_size = le32_get_bits(rxv[4], MT_CRXV_HE_LTF_SIZE) + 1;
207+
u8 bw = FIELD_GET(MT_PRXV_FRAME_MODE, le32_to_cpu(rxv[2]));
208+
209+
if (WARN_ONCE(skb_mac_header(skb) != skb->data,
210+
"Should push tlv at the top of mac hdr"))
211+
return;
212+
213+
eht = mt76_connac3_mac_radiotap_push_tlv(skb, IEEE80211_RADIOTAP_EHT,
214+
sizeof(*eht) + sizeof(u32));
215+
usig = mt76_connac3_mac_radiotap_push_tlv(skb, IEEE80211_RADIOTAP_EHT_USIG,
216+
sizeof(*usig));
217+
218+
status->flag |= RX_FLAG_RADIOTAP_TLV_AT_END;
219+
220+
eht->known |= EHT_BITS(KNOWN_SPATIAL_REUSE) |
221+
EHT_BITS(KNOWN_GI) |
222+
EHT_BITS(KNOWN_EHT_LTF) |
223+
EHT_BITS(KNOWN_LDPC_EXTRA_SYM_OM) |
224+
EHT_BITS(KNOWN_PE_DISAMBIGUITY_OM) |
225+
EHT_BITS(KNOWN_NSS_S);
226+
227+
eht->data[0] |=
228+
EHT_PREP(DATA0_SPATIAL_REUSE, SR_MASK, rxv[13]) |
229+
cpu_to_le32(FIELD_PREP(IEEE80211_RADIOTAP_EHT_DATA0_GI, status->eht.gi) |
230+
FIELD_PREP(IEEE80211_RADIOTAP_EHT_DATA0_LTF, ltf_size)) |
231+
EHT_PREP(DATA0_PE_DISAMBIGUITY_OM, PE_DISAMBIG, rxv[5]) |
232+
EHT_PREP(DATA0_LDPC_EXTRA_SYM_OM, LDPC_EXT_SYM, rxv[4]);
233+
234+
eht->data[7] |= le32_encode_bits(status->nss, IEEE80211_RADIOTAP_EHT_DATA7_NSS_S);
235+
236+
eht->user_info[0] |=
237+
EHT_BITS(USER_INFO_MCS_KNOWN) |
238+
EHT_BITS(USER_INFO_CODING_KNOWN) |
239+
EHT_BITS(USER_INFO_NSS_KNOWN_O) |
240+
EHT_BITS(USER_INFO_BEAMFORMING_KNOWN_O) |
241+
EHT_BITS(USER_INFO_DATA_FOR_USER) |
242+
le32_encode_bits(status->rate_idx, IEEE80211_RADIOTAP_EHT_USER_INFO_MCS) |
243+
le32_encode_bits(status->nss, IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_O);
244+
245+
if (le32_to_cpu(rxv[0]) & MT_PRXV_TXBF)
246+
eht->user_info[0] |= EHT_BITS(USER_INFO_BEAMFORMING_O);
247+
248+
if (le32_to_cpu(rxv[0]) & MT_PRXV_HT_AD_CODE)
249+
eht->user_info[0] |= EHT_BITS(USER_INFO_CODING);
250+
251+
if (mode == MT_PHY_TYPE_EHT_MU)
252+
eht->user_info[0] |= EHT_BITS(USER_INFO_STA_ID_KNOWN) |
253+
EHT_PREP(USER_INFO_STA_ID, MU_AID, rxv[8]);
254+
255+
usig->common |=
256+
EHT_BITS(USIG_COMMON_PHY_VER_KNOWN) |
257+
EHT_BITS(USIG_COMMON_BW_KNOWN) |
258+
EHT_BITS(USIG_COMMON_UL_DL_KNOWN) |
259+
EHT_BITS(USIG_COMMON_BSS_COLOR_KNOWN) |
260+
EHT_BITS(USIG_COMMON_TXOP_KNOWN) |
261+
le32_encode_bits(0, IEEE80211_RADIOTAP_EHT_USIG_COMMON_PHY_VER) |
262+
le32_encode_bits(bw, IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW) |
263+
EHT_PREP(USIG_COMMON_UL_DL, UPLINK, rxv[5]) |
264+
EHT_PREP(USIG_COMMON_BSS_COLOR, BSS_COLOR, rxv[9]) |
265+
EHT_PREP(USIG_COMMON_TXOP, TXOP_DUR, rxv[9]);
266+
}
267+
EXPORT_SYMBOL_GPL(mt76_connac3_mac_decode_eht_radiotap);

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,28 @@ enum {
142142
#define MT_CRXV_HE_RU3_L GENMASK(31, 27)
143143
#define MT_CRXV_HE_RU3_H GENMASK(3, 0)
144144

145+
#define MT_CRXV_EHT_NUM_USER GENMASK(26, 20)
146+
#define MT_CRXV_EHT_LTF_SIZE GENMASK(28, 27)
147+
#define MT_CRXV_EHT_LDPC_EXT_SYM BIT(30)
148+
#define MT_CRXV_EHT_PE_DISAMBIG BIT(1)
149+
#define MT_CRXV_EHT_UPLINK BIT(2)
150+
#define MT_CRXV_EHT_MU_AID GENMASK(27, 17)
151+
#define MT_CRXV_EHT_BEAM_CHNG BIT(29)
152+
#define MT_CRXV_EHT_DOPPLER BIT(0)
153+
#define MT_CRXV_EHT_BSS_COLOR GENMASK(15, 10)
154+
#define MT_CRXV_EHT_TXOP_DUR GENMASK(23, 17)
155+
#define MT_CRXV_EHT_SR_MASK GENMASK(11, 8)
156+
#define MT_CRXV_EHT_SR1_MASK GENMASK(15, 12)
157+
#define MT_CRXV_EHT_SR2_MASK GENMASK(19, 16)
158+
#define MT_CRXV_EHT_SR3_MASK GENMASK(23, 20)
159+
#define MT_CRXV_EHT_RU0 GENMASK(8, 0)
160+
#define MT_CRXV_EHT_RU1 GENMASK(17, 9)
161+
#define MT_CRXV_EHT_RU2 GENMASK(26, 18)
162+
#define MT_CRXV_EHT_RU3_L GENMASK(31, 27)
163+
#define MT_CRXV_EHT_RU3_H GENMASK(3, 0)
164+
#define MT_CRXV_EHT_SIG_MCS GENMASK(19, 18)
165+
#define MT_CRXV_EHT_LTF_SYM GENMASK(22, 20)
166+
145167
enum tx_header_format {
146168
MT_HDR_FORMAT_802_3,
147169
MT_HDR_FORMAT_CMD,

drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ mt76_connac_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len,
257257
};
258258
u16 ntlv;
259259

260-
ptlv = skb_put(skb, len);
260+
ptlv = skb_put_zero(skb, len);
261261
memcpy(ptlv, &tlv, sizeof(tlv));
262262

263263
ntlv = le16_to_cpu(ntlv_hdr->tlv_num);
@@ -283,7 +283,7 @@ __mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif *mvif,
283283
};
284284
struct sk_buff *skb;
285285

286-
if (is_mt799x(dev) && !wcid->sta)
286+
if (wcid && !wcid->sta)
287287
hdr.muar_idx = 0xe;
288288

289289
mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
@@ -392,7 +392,14 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
392392

393393
if (!sta) {
394394
basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
395-
eth_broadcast_addr(basic->peer_addr);
395+
396+
if (vif->type == NL80211_IFTYPE_STATION &&
397+
!is_zero_ether_addr(vif->bss_conf.bssid)) {
398+
memcpy(basic->peer_addr, vif->bss_conf.bssid, ETH_ALEN);
399+
basic->aid = cpu_to_le16(vif->cfg.aid);
400+
} else {
401+
eth_broadcast_addr(basic->peer_addr);
402+
}
396403
return;
397404
}
398405

@@ -1670,7 +1677,7 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
16701677
set_bit(MT76_HW_SCANNING, &phy->state);
16711678
mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
16721679

1673-
req = (struct mt76_connac_hw_scan_req *)skb_put(skb, sizeof(*req));
1680+
req = (struct mt76_connac_hw_scan_req *)skb_put_zero(skb, sizeof(*req));
16741681

16751682
req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
16761683
req->bss_idx = mvif->idx;
@@ -1798,7 +1805,7 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
17981805

17991806
mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
18001807

1801-
req = (struct mt76_connac_sched_scan_req *)skb_put(skb, sizeof(*req));
1808+
req = (struct mt76_connac_sched_scan_req *)skb_put_zero(skb, sizeof(*req));
18021809
req->version = 1;
18031810
req->seq_num = mvif->scan_seq_num | mvif->band_idx << 7;
18041811

@@ -2321,7 +2328,7 @@ int mt76_connac_mcu_update_gtk_rekey(struct ieee80211_hw *hw,
23212328
return -ENOMEM;
23222329

23232330
skb_put_data(skb, &hdr, sizeof(hdr));
2324-
gtk_tlv = (struct mt76_connac_gtk_rekey_tlv *)skb_put(skb,
2331+
gtk_tlv = (struct mt76_connac_gtk_rekey_tlv *)skb_put_zero(skb,
23252332
sizeof(*gtk_tlv));
23262333
gtk_tlv->tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY);
23272334
gtk_tlv->len = cpu_to_le16(sizeof(*gtk_tlv));
@@ -2446,7 +2453,7 @@ mt76_connac_mcu_set_wow_pattern(struct mt76_dev *dev,
24462453
return -ENOMEM;
24472454

24482455
skb_put_data(skb, &hdr, sizeof(hdr));
2449-
ptlv = (struct mt76_connac_wow_pattern_tlv *)skb_put(skb, sizeof(*ptlv));
2456+
ptlv = (struct mt76_connac_wow_pattern_tlv *)skb_put_zero(skb, sizeof(*ptlv));
24502457
ptlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
24512458
ptlv->len = cpu_to_le16(sizeof(*ptlv));
24522459
ptlv->data_len = pattern->pattern_len;
@@ -2527,6 +2534,7 @@ int mt76_connac_mcu_set_hif_suspend(struct mt76_dev *dev, bool suspend)
25272534
__le16 tag;
25282535
__le16 len;
25292536
u8 suspend;
2537+
u8 pad[7];
25302538
} __packed hif_suspend;
25312539
} req = {
25322540
.hif_suspend = {

0 commit comments

Comments
 (0)