* drivers/net/wireless/mediatek/mt76/mt7996/mac.c:1059 mt7996_tx_prepare_skb() error: we previously assumed 'sta' could be null (see line 1044)
@ 2025-12-24 10:42 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2025-12-24 10:42 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Shayne Chen <shayne.chen@mediatek.com>
CC: Felix Fietkau <nbd@nbd.name>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: b927546677c876e26eba308550207c2ddf812a43
commit: 85cd5534a3f2ec93e7d88713a77df5b4255520df wifi: mt76: mt7996: use correct link_id when filling TXD and TXP
date: 4 weeks ago
:::::: branch date: 2 days ago
:::::: commit date: 4 weeks ago
config: alpha-randconfig-r072-20251224 (https://download.01.org/0day-ci/archive/20251224/202512241853.oN0rQyHQ-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 15.1.0
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202512241853.oN0rQyHQ-lkp@intel.com/
New smatch warnings:
drivers/net/wireless/mediatek/mt76/mt7996/mac.c:1059 mt7996_tx_prepare_skb() error: we previously assumed 'sta' could be null (see line 1044)
drivers/net/wireless/mediatek/mt76/mt7996/mac.c:1099 mt7996_tx_prepare_skb() error: we previously assumed 'vif' could be null (see line 1043)
Old smatch warnings:
drivers/net/wireless/mediatek/mt76/mt7996/mac.c:483 mt7996_mac_fill_rx() warn: potential spectre issue 'dev->mt76.phys' [r]
drivers/net/wireless/mediatek/mt76/mt7996/mac.c:484 mt7996_mac_fill_rx() warn: possible spectre second half. 'mphy'
drivers/net/wireless/mediatek/mt76/mt7996/mac.c:3131 mt7996_mac_twt_sched_list_add() error: uninitialized symbol 'start_tsf'.
vim +/sta +1059 drivers/net/wireless/mediatek/mt76/mt7996/mac.c
b7ddeb9cc43949 Shayne Chen 2025-04-09 1032
98686cd21624c7 Shayne Chen 2022-11-22 1033 int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
98686cd21624c7 Shayne Chen 2022-11-22 1034 enum mt76_txq_id qid, struct mt76_wcid *wcid,
98686cd21624c7 Shayne Chen 2022-11-22 1035 struct ieee80211_sta *sta,
98686cd21624c7 Shayne Chen 2022-11-22 1036 struct mt76_tx_info *tx_info)
98686cd21624c7 Shayne Chen 2022-11-22 1037 {
85cd5534a3f2ec Shayne Chen 2025-11-06 1038 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx_info->skb->data;
98686cd21624c7 Shayne Chen 2022-11-22 1039 struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76);
98686cd21624c7 Shayne Chen 2022-11-22 1040 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb);
98686cd21624c7 Shayne Chen 2022-11-22 1041 struct ieee80211_key_conf *key = info->control.hw_key;
98686cd21624c7 Shayne Chen 2022-11-22 1042 struct ieee80211_vif *vif = info->control.vif;
85cd5534a3f2ec Shayne Chen 2025-11-06 @1043 struct mt7996_vif *mvif = vif ? (struct mt7996_vif *)vif->drv_priv : NULL;
85cd5534a3f2ec Shayne Chen 2025-11-06 @1044 struct mt7996_sta *msta = sta ? (struct mt7996_sta *)sta->drv_priv : NULL;
85cd5534a3f2ec Shayne Chen 2025-11-06 1045 struct mt76_vif_link *mlink = NULL;
98686cd21624c7 Shayne Chen 2022-11-22 1046 struct mt76_txwi_cache *t;
98686cd21624c7 Shayne Chen 2022-11-22 1047 int id, i, pid, nbuf = tx_info->nbuf - 1;
98686cd21624c7 Shayne Chen 2022-11-22 1048 bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1049 __le32 *ptr = (__le32 *)txwi_ptr;
98686cd21624c7 Shayne Chen 2022-11-22 1050 u8 *txwi = (u8 *)txwi_ptr;
85cd5534a3f2ec Shayne Chen 2025-11-06 1051 u8 link_id;
98686cd21624c7 Shayne Chen 2022-11-22 1052
98686cd21624c7 Shayne Chen 2022-11-22 1053 if (unlikely(tx_info->skb->len <= ETH_HLEN))
98686cd21624c7 Shayne Chen 2022-11-22 1054 return -EINVAL;
98686cd21624c7 Shayne Chen 2022-11-22 1055
98686cd21624c7 Shayne Chen 2022-11-22 1056 if (!wcid)
98686cd21624c7 Shayne Chen 2022-11-22 1057 wcid = &dev->mt76.global_wcid;
98686cd21624c7 Shayne Chen 2022-11-22 1058
85cd5534a3f2ec Shayne Chen 2025-11-06 @1059 if ((is_8023 || ieee80211_is_data_qos(hdr->frame_control)) && sta->mlo &&
85cd5534a3f2ec Shayne Chen 2025-11-06 1060 likely(tx_info->skb->protocol != cpu_to_be16(ETH_P_PAE))) {
85cd5534a3f2ec Shayne Chen 2025-11-06 1061 u8 tid = tx_info->skb->priority & IEEE80211_QOS_CTL_TID_MASK;
85cd5534a3f2ec Shayne Chen 2025-11-06 1062
85cd5534a3f2ec Shayne Chen 2025-11-06 1063 link_id = (tid % 2) ? msta->seclink_id : msta->deflink_id;
85cd5534a3f2ec Shayne Chen 2025-11-06 1064 } else {
85cd5534a3f2ec Shayne Chen 2025-11-06 1065 link_id = u32_get_bits(info->control.flags,
85cd5534a3f2ec Shayne Chen 2025-11-06 1066 IEEE80211_TX_CTRL_MLO_LINK);
85cd5534a3f2ec Shayne Chen 2025-11-06 1067 }
85cd5534a3f2ec Shayne Chen 2025-11-06 1068
85cd5534a3f2ec Shayne Chen 2025-11-06 1069 if (link_id != wcid->link_id && link_id != IEEE80211_LINK_UNSPECIFIED) {
85cd5534a3f2ec Shayne Chen 2025-11-06 1070 if (msta) {
85cd5534a3f2ec Shayne Chen 2025-11-06 1071 struct mt7996_sta_link *msta_link =
85cd5534a3f2ec Shayne Chen 2025-11-06 1072 rcu_dereference(msta->link[link_id]);
85cd5534a3f2ec Shayne Chen 2025-11-06 1073
85cd5534a3f2ec Shayne Chen 2025-11-06 1074 if (msta_link)
85cd5534a3f2ec Shayne Chen 2025-11-06 1075 wcid = &msta_link->wcid;
85cd5534a3f2ec Shayne Chen 2025-11-06 1076 } else if (mvif) {
85cd5534a3f2ec Shayne Chen 2025-11-06 1077 mlink = rcu_dereference(mvif->mt76.link[link_id]);
85cd5534a3f2ec Shayne Chen 2025-11-06 1078 if (mlink && mlink->wcid)
85cd5534a3f2ec Shayne Chen 2025-11-06 1079 wcid = mlink->wcid;
85cd5534a3f2ec Shayne Chen 2025-11-06 1080 }
85cd5534a3f2ec Shayne Chen 2025-11-06 1081 }
85cd5534a3f2ec Shayne Chen 2025-11-06 1082
98686cd21624c7 Shayne Chen 2022-11-22 1083 t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size);
98686cd21624c7 Shayne Chen 2022-11-22 1084 t->skb = tx_info->skb;
98686cd21624c7 Shayne Chen 2022-11-22 1085
98686cd21624c7 Shayne Chen 2022-11-22 1086 id = mt76_token_consume(mdev, &t);
98686cd21624c7 Shayne Chen 2022-11-22 1087 if (id < 0)
98686cd21624c7 Shayne Chen 2022-11-22 1088 return id;
98686cd21624c7 Shayne Chen 2022-11-22 1089
7ef0c7ad735b0c Shayne Chen 2025-09-04 1090 /* Since the rules of HW MLD address translation are not fully
7ef0c7ad735b0c Shayne Chen 2025-09-04 1091 * compatible with 802.11 EAPOL frame, we do the translation by
7ef0c7ad735b0c Shayne Chen 2025-09-04 1092 * software
7ef0c7ad735b0c Shayne Chen 2025-09-04 1093 */
7ef0c7ad735b0c Shayne Chen 2025-09-04 1094 if (tx_info->skb->protocol == cpu_to_be16(ETH_P_PAE) && sta->mlo) {
7ef0c7ad735b0c Shayne Chen 2025-09-04 1095 struct ieee80211_hdr *hdr = (void *)tx_info->skb->data;
7ef0c7ad735b0c Shayne Chen 2025-09-04 1096 struct ieee80211_bss_conf *link_conf;
7ef0c7ad735b0c Shayne Chen 2025-09-04 1097 struct ieee80211_link_sta *link_sta;
7ef0c7ad735b0c Shayne Chen 2025-09-04 1098
7ef0c7ad735b0c Shayne Chen 2025-09-04 @1099 link_conf = rcu_dereference(vif->link_conf[wcid->link_id]);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1100 if (!link_conf)
7ef0c7ad735b0c Shayne Chen 2025-09-04 1101 return -EINVAL;
7ef0c7ad735b0c Shayne Chen 2025-09-04 1102
7ef0c7ad735b0c Shayne Chen 2025-09-04 1103 link_sta = rcu_dereference(sta->link[wcid->link_id]);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1104 if (!link_sta)
7ef0c7ad735b0c Shayne Chen 2025-09-04 1105 return -EINVAL;
7ef0c7ad735b0c Shayne Chen 2025-09-04 1106
7ef0c7ad735b0c Shayne Chen 2025-09-04 1107 dma_sync_single_for_cpu(mdev->dma_dev, tx_info->buf[1].addr,
7ef0c7ad735b0c Shayne Chen 2025-09-04 1108 tx_info->buf[1].len, DMA_TO_DEVICE);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1109
7ef0c7ad735b0c Shayne Chen 2025-09-04 1110 memcpy(hdr->addr1, link_sta->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1111 memcpy(hdr->addr2, link_conf->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1112 if (ieee80211_has_a4(hdr->frame_control)) {
7ef0c7ad735b0c Shayne Chen 2025-09-04 1113 memcpy(hdr->addr3, sta->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1114 memcpy(hdr->addr4, vif->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1115 } else if (ieee80211_has_tods(hdr->frame_control)) {
7ef0c7ad735b0c Shayne Chen 2025-09-04 1116 memcpy(hdr->addr3, sta->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1117 } else if (ieee80211_has_fromds(hdr->frame_control)) {
7ef0c7ad735b0c Shayne Chen 2025-09-04 1118 memcpy(hdr->addr3, vif->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1119 }
7ef0c7ad735b0c Shayne Chen 2025-09-04 1120
7ef0c7ad735b0c Shayne Chen 2025-09-04 1121 dma_sync_single_for_device(mdev->dma_dev, tx_info->buf[1].addr,
7ef0c7ad735b0c Shayne Chen 2025-09-04 1122 tx_info->buf[1].len, DMA_TO_DEVICE);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1123 }
7ef0c7ad735b0c Shayne Chen 2025-09-04 1124
98686cd21624c7 Shayne Chen 2022-11-22 1125 pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1126 memset(txwi_ptr, 0, MT_TXD_SIZE);
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1127 /* Transmit non qos data by 802.11 header and need to fill txd by host*/
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1128 if (!is_8023 || pid >= MT_PACKET_ID_FIRST)
d0b6f86fdbefa6 Shayne Chen 2023-03-03 1129 mt7996_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key,
d0b6f86fdbefa6 Shayne Chen 2023-03-03 1130 pid, qid, 0);
98686cd21624c7 Shayne Chen 2022-11-22 1131
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1132 /* MT7996 and MT7992 require driver to provide the MAC TXP for AddBA
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1133 * req
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1134 */
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1135 if (le32_to_cpu(ptr[7]) & MT_TXD7_MAC_TXD) {
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1136 u32 val;
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1137
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1138 ptr = (__le32 *)(txwi + MT_TXD_SIZE);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1139 memset((void *)ptr, 0, sizeof(struct mt76_connac_fw_txp));
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1140
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1141 val = FIELD_PREP(MT_TXP0_TOKEN_ID0, id) |
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1142 MT_TXP0_TOKEN_ID0_VALID_MASK;
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1143 ptr[0] = cpu_to_le32(val);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1144
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1145 val = FIELD_PREP(MT_TXP1_TID_ADDBA,
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1146 tx_info->skb->priority &
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1147 IEEE80211_QOS_CTL_TID_MASK);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1148 ptr[1] = cpu_to_le32(val);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1149 ptr[2] = cpu_to_le32(tx_info->buf[1].addr & 0xFFFFFFFF);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1150
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1151 val = FIELD_PREP(MT_TXP_BUF_LEN, tx_info->buf[1].len) |
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1152 MT_TXP3_ML0_MASK;
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1153 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1154 val |= FIELD_PREP(MT_TXP3_DMA_ADDR_H,
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1155 tx_info->buf[1].addr >> 32);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1156 #endif
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1157 ptr[3] = cpu_to_le32(val);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1158 } else {
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1159 struct mt76_connac_txp_common *txp;
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1160
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1161 txp = (struct mt76_connac_txp_common *)(txwi + MT_TXD_SIZE);
98686cd21624c7 Shayne Chen 2022-11-22 1162 for (i = 0; i < nbuf; i++) {
4920a3a1285f5f Sujuan Chen 2023-11-17 1163 u16 len;
4920a3a1285f5f Sujuan Chen 2023-11-17 1164
4920a3a1285f5f Sujuan Chen 2023-11-17 1165 len = FIELD_PREP(MT_TXP_BUF_LEN, tx_info->buf[i + 1].len);
4920a3a1285f5f Sujuan Chen 2023-11-17 1166 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
4920a3a1285f5f Sujuan Chen 2023-11-17 1167 len |= FIELD_PREP(MT_TXP_DMA_ADDR_H,
4920a3a1285f5f Sujuan Chen 2023-11-17 1168 tx_info->buf[i + 1].addr >> 32);
4920a3a1285f5f Sujuan Chen 2023-11-17 1169 #endif
4920a3a1285f5f Sujuan Chen 2023-11-17 1170
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1171 txp->fw.buf[i] = cpu_to_le32(tx_info->buf[i + 1].addr);
4920a3a1285f5f Sujuan Chen 2023-11-17 1172 txp->fw.len[i] = cpu_to_le16(len);
98686cd21624c7 Shayne Chen 2022-11-22 1173 }
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1174 txp->fw.nbuf = nbuf;
98686cd21624c7 Shayne Chen 2022-11-22 1175
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1176 txp->fw.flags = cpu_to_le16(MT_CT_INFO_FROM_HOST);
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1177
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1178 if (!is_8023 || pid >= MT_PACKET_ID_FIRST)
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1179 txp->fw.flags |= cpu_to_le16(MT_CT_INFO_APPLY_TXD);
98686cd21624c7 Shayne Chen 2022-11-22 1180
98686cd21624c7 Shayne Chen 2022-11-22 1181 if (!key)
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1182 txp->fw.flags |= cpu_to_le16(MT_CT_INFO_NONE_CIPHER_FRAME);
98686cd21624c7 Shayne Chen 2022-11-22 1183
b7ddeb9cc43949 Shayne Chen 2025-04-09 1184 if (!is_8023 && mt7996_tx_use_mgmt(dev, tx_info->skb))
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1185 txp->fw.flags |= cpu_to_le16(MT_CT_INFO_MGMT_FRAME);
98686cd21624c7 Shayne Chen 2022-11-22 1186
85cd5534a3f2ec Shayne Chen 2025-11-06 1187 if (mvif) {
13b4c81083cc4b Felix Fietkau 2025-03-11 1188 if (wcid->offchannel)
13b4c81083cc4b Felix Fietkau 2025-03-11 1189 mlink = rcu_dereference(mvif->mt76.offchannel_link);
13b4c81083cc4b Felix Fietkau 2025-03-11 1190 if (!mlink)
59ea7af6f9ce21 Lorenzo Bianconi 2025-07-04 1191 mlink = rcu_dereference(mvif->mt76.link[wcid->link_id]);
98686cd21624c7 Shayne Chen 2022-11-22 1192
59ea7af6f9ce21 Lorenzo Bianconi 2025-07-04 1193 txp->fw.bss_idx = mlink ? mlink->idx : mvif->deflink.mt76.idx;
98686cd21624c7 Shayne Chen 2022-11-22 1194 }
98686cd21624c7 Shayne Chen 2022-11-22 1195
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1196 txp->fw.token = cpu_to_le16(id);
bde2e77f76266f Peter Chiu 2023-08-17 1197 txp->fw.rept_wds_wcid = cpu_to_le16(sta ? wcid->idx : 0xfff);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1198 }
bde2e77f76266f Peter Chiu 2023-08-17 1199
832f42699791e7 Felix Fietkau 2023-09-11 1200 tx_info->skb = NULL;
98686cd21624c7 Shayne Chen 2022-11-22 1201
98686cd21624c7 Shayne Chen 2022-11-22 1202 /* pass partial skb header to fw */
98686cd21624c7 Shayne Chen 2022-11-22 1203 tx_info->buf[1].len = MT_CT_PARSE_LEN;
98686cd21624c7 Shayne Chen 2022-11-22 1204 tx_info->buf[1].skip_unmap = true;
98686cd21624c7 Shayne Chen 2022-11-22 1205 tx_info->nbuf = MT_CT_DMA_BUF_NUM;
98686cd21624c7 Shayne Chen 2022-11-22 1206
98686cd21624c7 Shayne Chen 2022-11-22 1207 return 0;
98686cd21624c7 Shayne Chen 2022-11-22 1208 }
98686cd21624c7 Shayne Chen 2022-11-22 1209
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread
* drivers/net/wireless/mediatek/mt76/mt7996/mac.c:1059 mt7996_tx_prepare_skb() error: we previously assumed 'sta' could be null (see line 1044)
@ 2026-04-16 18:08 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2026-04-16 18:08 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Shayne Chen <shayne.chen@mediatek.com>
CC: Felix Fietkau <nbd@nbd.name>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 1d51b370a0f8f642f4fc84c795fbedac0fcdbbd2
commit: 85cd5534a3f2ec93e7d88713a77df5b4255520df wifi: mt76: mt7996: use correct link_id when filling TXD and TXP
date: 5 months ago
:::::: branch date: 15 hours ago
:::::: commit date: 5 months ago
config: arc-randconfig-r073-20260416 (https://download.01.org/0day-ci/archive/20260417/202604170133.h3fmmy0N-lkp@intel.com/config)
compiler: arc-linux-gcc (GCC) 11.5.0
smatch: v0.5.0-9007-gcf3ea02b
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Fixes: 85cd5534a3f2 ("wifi: mt76: mt7996: use correct link_id when filling TXD and TXP")
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202604170133.h3fmmy0N-lkp@intel.com/
New smatch warnings:
drivers/net/wireless/mediatek/mt76/mt7996/mac.c:1059 mt7996_tx_prepare_skb() error: we previously assumed 'sta' could be null (see line 1044)
drivers/net/wireless/mediatek/mt76/mt7996/mac.c:1099 mt7996_tx_prepare_skb() error: we previously assumed 'vif' could be null (see line 1043)
Old smatch warnings:
internal error: arch/arc/include/asm/bitops.h:139 SQL error #2: near "and": syntax error
internal error: arch/arc/include/asm/bitops.h:139 SQL: 'select * from return_states where and type = 1044 and parameter = -1 and key = '$' limit 1;'
vim +/sta +1059 drivers/net/wireless/mediatek/mt76/mt7996/mac.c
b7ddeb9cc43949 Shayne Chen 2025-04-09 1032
98686cd21624c7 Shayne Chen 2022-11-22 1033 int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
98686cd21624c7 Shayne Chen 2022-11-22 1034 enum mt76_txq_id qid, struct mt76_wcid *wcid,
98686cd21624c7 Shayne Chen 2022-11-22 1035 struct ieee80211_sta *sta,
98686cd21624c7 Shayne Chen 2022-11-22 1036 struct mt76_tx_info *tx_info)
98686cd21624c7 Shayne Chen 2022-11-22 1037 {
85cd5534a3f2ec Shayne Chen 2025-11-06 1038 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx_info->skb->data;
98686cd21624c7 Shayne Chen 2022-11-22 1039 struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76);
98686cd21624c7 Shayne Chen 2022-11-22 1040 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb);
98686cd21624c7 Shayne Chen 2022-11-22 1041 struct ieee80211_key_conf *key = info->control.hw_key;
98686cd21624c7 Shayne Chen 2022-11-22 1042 struct ieee80211_vif *vif = info->control.vif;
85cd5534a3f2ec Shayne Chen 2025-11-06 @1043 struct mt7996_vif *mvif = vif ? (struct mt7996_vif *)vif->drv_priv : NULL;
85cd5534a3f2ec Shayne Chen 2025-11-06 @1044 struct mt7996_sta *msta = sta ? (struct mt7996_sta *)sta->drv_priv : NULL;
85cd5534a3f2ec Shayne Chen 2025-11-06 1045 struct mt76_vif_link *mlink = NULL;
98686cd21624c7 Shayne Chen 2022-11-22 1046 struct mt76_txwi_cache *t;
98686cd21624c7 Shayne Chen 2022-11-22 1047 int id, i, pid, nbuf = tx_info->nbuf - 1;
98686cd21624c7 Shayne Chen 2022-11-22 1048 bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1049 __le32 *ptr = (__le32 *)txwi_ptr;
98686cd21624c7 Shayne Chen 2022-11-22 1050 u8 *txwi = (u8 *)txwi_ptr;
85cd5534a3f2ec Shayne Chen 2025-11-06 1051 u8 link_id;
98686cd21624c7 Shayne Chen 2022-11-22 1052
98686cd21624c7 Shayne Chen 2022-11-22 1053 if (unlikely(tx_info->skb->len <= ETH_HLEN))
98686cd21624c7 Shayne Chen 2022-11-22 1054 return -EINVAL;
98686cd21624c7 Shayne Chen 2022-11-22 1055
98686cd21624c7 Shayne Chen 2022-11-22 1056 if (!wcid)
98686cd21624c7 Shayne Chen 2022-11-22 1057 wcid = &dev->mt76.global_wcid;
98686cd21624c7 Shayne Chen 2022-11-22 1058
85cd5534a3f2ec Shayne Chen 2025-11-06 @1059 if ((is_8023 || ieee80211_is_data_qos(hdr->frame_control)) && sta->mlo &&
85cd5534a3f2ec Shayne Chen 2025-11-06 1060 likely(tx_info->skb->protocol != cpu_to_be16(ETH_P_PAE))) {
85cd5534a3f2ec Shayne Chen 2025-11-06 1061 u8 tid = tx_info->skb->priority & IEEE80211_QOS_CTL_TID_MASK;
85cd5534a3f2ec Shayne Chen 2025-11-06 1062
85cd5534a3f2ec Shayne Chen 2025-11-06 1063 link_id = (tid % 2) ? msta->seclink_id : msta->deflink_id;
85cd5534a3f2ec Shayne Chen 2025-11-06 1064 } else {
85cd5534a3f2ec Shayne Chen 2025-11-06 1065 link_id = u32_get_bits(info->control.flags,
85cd5534a3f2ec Shayne Chen 2025-11-06 1066 IEEE80211_TX_CTRL_MLO_LINK);
85cd5534a3f2ec Shayne Chen 2025-11-06 1067 }
85cd5534a3f2ec Shayne Chen 2025-11-06 1068
85cd5534a3f2ec Shayne Chen 2025-11-06 1069 if (link_id != wcid->link_id && link_id != IEEE80211_LINK_UNSPECIFIED) {
85cd5534a3f2ec Shayne Chen 2025-11-06 1070 if (msta) {
85cd5534a3f2ec Shayne Chen 2025-11-06 1071 struct mt7996_sta_link *msta_link =
85cd5534a3f2ec Shayne Chen 2025-11-06 1072 rcu_dereference(msta->link[link_id]);
85cd5534a3f2ec Shayne Chen 2025-11-06 1073
85cd5534a3f2ec Shayne Chen 2025-11-06 1074 if (msta_link)
85cd5534a3f2ec Shayne Chen 2025-11-06 1075 wcid = &msta_link->wcid;
85cd5534a3f2ec Shayne Chen 2025-11-06 1076 } else if (mvif) {
85cd5534a3f2ec Shayne Chen 2025-11-06 1077 mlink = rcu_dereference(mvif->mt76.link[link_id]);
85cd5534a3f2ec Shayne Chen 2025-11-06 1078 if (mlink && mlink->wcid)
85cd5534a3f2ec Shayne Chen 2025-11-06 1079 wcid = mlink->wcid;
85cd5534a3f2ec Shayne Chen 2025-11-06 1080 }
85cd5534a3f2ec Shayne Chen 2025-11-06 1081 }
85cd5534a3f2ec Shayne Chen 2025-11-06 1082
98686cd21624c7 Shayne Chen 2022-11-22 1083 t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size);
98686cd21624c7 Shayne Chen 2022-11-22 1084 t->skb = tx_info->skb;
98686cd21624c7 Shayne Chen 2022-11-22 1085
98686cd21624c7 Shayne Chen 2022-11-22 1086 id = mt76_token_consume(mdev, &t);
98686cd21624c7 Shayne Chen 2022-11-22 1087 if (id < 0)
98686cd21624c7 Shayne Chen 2022-11-22 1088 return id;
98686cd21624c7 Shayne Chen 2022-11-22 1089
7ef0c7ad735b0c Shayne Chen 2025-09-04 1090 /* Since the rules of HW MLD address translation are not fully
7ef0c7ad735b0c Shayne Chen 2025-09-04 1091 * compatible with 802.11 EAPOL frame, we do the translation by
7ef0c7ad735b0c Shayne Chen 2025-09-04 1092 * software
7ef0c7ad735b0c Shayne Chen 2025-09-04 1093 */
7ef0c7ad735b0c Shayne Chen 2025-09-04 1094 if (tx_info->skb->protocol == cpu_to_be16(ETH_P_PAE) && sta->mlo) {
7ef0c7ad735b0c Shayne Chen 2025-09-04 1095 struct ieee80211_hdr *hdr = (void *)tx_info->skb->data;
7ef0c7ad735b0c Shayne Chen 2025-09-04 1096 struct ieee80211_bss_conf *link_conf;
7ef0c7ad735b0c Shayne Chen 2025-09-04 1097 struct ieee80211_link_sta *link_sta;
7ef0c7ad735b0c Shayne Chen 2025-09-04 1098
7ef0c7ad735b0c Shayne Chen 2025-09-04 @1099 link_conf = rcu_dereference(vif->link_conf[wcid->link_id]);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1100 if (!link_conf)
7ef0c7ad735b0c Shayne Chen 2025-09-04 1101 return -EINVAL;
7ef0c7ad735b0c Shayne Chen 2025-09-04 1102
7ef0c7ad735b0c Shayne Chen 2025-09-04 1103 link_sta = rcu_dereference(sta->link[wcid->link_id]);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1104 if (!link_sta)
7ef0c7ad735b0c Shayne Chen 2025-09-04 1105 return -EINVAL;
7ef0c7ad735b0c Shayne Chen 2025-09-04 1106
7ef0c7ad735b0c Shayne Chen 2025-09-04 1107 dma_sync_single_for_cpu(mdev->dma_dev, tx_info->buf[1].addr,
7ef0c7ad735b0c Shayne Chen 2025-09-04 1108 tx_info->buf[1].len, DMA_TO_DEVICE);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1109
7ef0c7ad735b0c Shayne Chen 2025-09-04 1110 memcpy(hdr->addr1, link_sta->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1111 memcpy(hdr->addr2, link_conf->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1112 if (ieee80211_has_a4(hdr->frame_control)) {
7ef0c7ad735b0c Shayne Chen 2025-09-04 1113 memcpy(hdr->addr3, sta->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1114 memcpy(hdr->addr4, vif->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1115 } else if (ieee80211_has_tods(hdr->frame_control)) {
7ef0c7ad735b0c Shayne Chen 2025-09-04 1116 memcpy(hdr->addr3, sta->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1117 } else if (ieee80211_has_fromds(hdr->frame_control)) {
7ef0c7ad735b0c Shayne Chen 2025-09-04 1118 memcpy(hdr->addr3, vif->addr, ETH_ALEN);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1119 }
7ef0c7ad735b0c Shayne Chen 2025-09-04 1120
7ef0c7ad735b0c Shayne Chen 2025-09-04 1121 dma_sync_single_for_device(mdev->dma_dev, tx_info->buf[1].addr,
7ef0c7ad735b0c Shayne Chen 2025-09-04 1122 tx_info->buf[1].len, DMA_TO_DEVICE);
7ef0c7ad735b0c Shayne Chen 2025-09-04 1123 }
7ef0c7ad735b0c Shayne Chen 2025-09-04 1124
98686cd21624c7 Shayne Chen 2022-11-22 1125 pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1126 memset(txwi_ptr, 0, MT_TXD_SIZE);
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1127 /* Transmit non qos data by 802.11 header and need to fill txd by host*/
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1128 if (!is_8023 || pid >= MT_PACKET_ID_FIRST)
d0b6f86fdbefa6 Shayne Chen 2023-03-03 1129 mt7996_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key,
d0b6f86fdbefa6 Shayne Chen 2023-03-03 1130 pid, qid, 0);
98686cd21624c7 Shayne Chen 2022-11-22 1131
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1132 /* MT7996 and MT7992 require driver to provide the MAC TXP for AddBA
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1133 * req
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1134 */
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1135 if (le32_to_cpu(ptr[7]) & MT_TXD7_MAC_TXD) {
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1136 u32 val;
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1137
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1138 ptr = (__le32 *)(txwi + MT_TXD_SIZE);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1139 memset((void *)ptr, 0, sizeof(struct mt76_connac_fw_txp));
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1140
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1141 val = FIELD_PREP(MT_TXP0_TOKEN_ID0, id) |
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1142 MT_TXP0_TOKEN_ID0_VALID_MASK;
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1143 ptr[0] = cpu_to_le32(val);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1144
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1145 val = FIELD_PREP(MT_TXP1_TID_ADDBA,
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1146 tx_info->skb->priority &
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1147 IEEE80211_QOS_CTL_TID_MASK);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1148 ptr[1] = cpu_to_le32(val);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1149 ptr[2] = cpu_to_le32(tx_info->buf[1].addr & 0xFFFFFFFF);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1150
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1151 val = FIELD_PREP(MT_TXP_BUF_LEN, tx_info->buf[1].len) |
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1152 MT_TXP3_ML0_MASK;
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1153 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1154 val |= FIELD_PREP(MT_TXP3_DMA_ADDR_H,
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1155 tx_info->buf[1].addr >> 32);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1156 #endif
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1157 ptr[3] = cpu_to_le32(val);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1158 } else {
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1159 struct mt76_connac_txp_common *txp;
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1160
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1161 txp = (struct mt76_connac_txp_common *)(txwi + MT_TXD_SIZE);
98686cd21624c7 Shayne Chen 2022-11-22 1162 for (i = 0; i < nbuf; i++) {
4920a3a1285f5f Sujuan Chen 2023-11-17 1163 u16 len;
4920a3a1285f5f Sujuan Chen 2023-11-17 1164
4920a3a1285f5f Sujuan Chen 2023-11-17 1165 len = FIELD_PREP(MT_TXP_BUF_LEN, tx_info->buf[i + 1].len);
4920a3a1285f5f Sujuan Chen 2023-11-17 1166 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
4920a3a1285f5f Sujuan Chen 2023-11-17 1167 len |= FIELD_PREP(MT_TXP_DMA_ADDR_H,
4920a3a1285f5f Sujuan Chen 2023-11-17 1168 tx_info->buf[i + 1].addr >> 32);
4920a3a1285f5f Sujuan Chen 2023-11-17 1169 #endif
4920a3a1285f5f Sujuan Chen 2023-11-17 1170
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1171 txp->fw.buf[i] = cpu_to_le32(tx_info->buf[i + 1].addr);
4920a3a1285f5f Sujuan Chen 2023-11-17 1172 txp->fw.len[i] = cpu_to_le16(len);
98686cd21624c7 Shayne Chen 2022-11-22 1173 }
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1174 txp->fw.nbuf = nbuf;
98686cd21624c7 Shayne Chen 2022-11-22 1175
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1176 txp->fw.flags = cpu_to_le16(MT_CT_INFO_FROM_HOST);
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1177
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1178 if (!is_8023 || pid >= MT_PACKET_ID_FIRST)
3dbfb8abe3fd3f Shayne Chen 2025-03-28 1179 txp->fw.flags |= cpu_to_le16(MT_CT_INFO_APPLY_TXD);
98686cd21624c7 Shayne Chen 2022-11-22 1180
98686cd21624c7 Shayne Chen 2022-11-22 1181 if (!key)
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1182 txp->fw.flags |= cpu_to_le16(MT_CT_INFO_NONE_CIPHER_FRAME);
98686cd21624c7 Shayne Chen 2022-11-22 1183
b7ddeb9cc43949 Shayne Chen 2025-04-09 1184 if (!is_8023 && mt7996_tx_use_mgmt(dev, tx_info->skb))
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1185 txp->fw.flags |= cpu_to_le16(MT_CT_INFO_MGMT_FRAME);
98686cd21624c7 Shayne Chen 2022-11-22 1186
85cd5534a3f2ec Shayne Chen 2025-11-06 1187 if (mvif) {
13b4c81083cc4b Felix Fietkau 2025-03-11 1188 if (wcid->offchannel)
13b4c81083cc4b Felix Fietkau 2025-03-11 1189 mlink = rcu_dereference(mvif->mt76.offchannel_link);
13b4c81083cc4b Felix Fietkau 2025-03-11 1190 if (!mlink)
59ea7af6f9ce21 Lorenzo Bianconi 2025-07-04 1191 mlink = rcu_dereference(mvif->mt76.link[wcid->link_id]);
98686cd21624c7 Shayne Chen 2022-11-22 1192
59ea7af6f9ce21 Lorenzo Bianconi 2025-07-04 1193 txp->fw.bss_idx = mlink ? mlink->idx : mvif->deflink.mt76.idx;
98686cd21624c7 Shayne Chen 2022-11-22 1194 }
98686cd21624c7 Shayne Chen 2022-11-22 1195
3c38dfc1702d81 Lorenzo Bianconi 2023-01-18 1196 txp->fw.token = cpu_to_le16(id);
bde2e77f76266f Peter Chiu 2023-08-17 1197 txp->fw.rept_wds_wcid = cpu_to_le16(sta ? wcid->idx : 0xfff);
cb6ebbdffef2a8 Howard Hsu 2025-09-09 1198 }
bde2e77f76266f Peter Chiu 2023-08-17 1199
832f42699791e7 Felix Fietkau 2023-09-11 1200 tx_info->skb = NULL;
98686cd21624c7 Shayne Chen 2022-11-22 1201
98686cd21624c7 Shayne Chen 2022-11-22 1202 /* pass partial skb header to fw */
98686cd21624c7 Shayne Chen 2022-11-22 1203 tx_info->buf[1].len = MT_CT_PARSE_LEN;
98686cd21624c7 Shayne Chen 2022-11-22 1204 tx_info->buf[1].skip_unmap = true;
98686cd21624c7 Shayne Chen 2022-11-22 1205 tx_info->nbuf = MT_CT_DMA_BUF_NUM;
98686cd21624c7 Shayne Chen 2022-11-22 1206
98686cd21624c7 Shayne Chen 2022-11-22 1207 return 0;
98686cd21624c7 Shayne Chen 2022-11-22 1208 }
98686cd21624c7 Shayne Chen 2022-11-22 1209
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread
* drivers/net/wireless/mediatek/mt76/mt7996/mac.c:1059 mt7996_tx_prepare_skb() error: we previously assumed 'sta' could be null (see line 1044)
@ 2026-08-10 7:56 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2026-08-10 7:56 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Shayne Chen <shayne.chen@mediatek.com>
CC: Felix Fietkau <nbd@nbd.name>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 06cf61899d6498b33e4b7c87d99d5bd471ccc375
commit: 85cd5534a3f2ec93e7d88713a77df5b4255520df wifi: mt76: mt7996: use correct link_id when filling TXD and TXP
date: 9 months ago
:::::: branch date: 32 hours ago
:::::: commit date: 9 months ago
config: x86_64-randconfig-161-20260810 (https://download.01.org/0day-ci/archive/20260810/202608101558.Q1CI1hTW-lkp@intel.com/config)
compiler: clang version 22.1.3 (https://github.com/llvm/llvm-project e9846648fd6183ee6d8cbdb4502213fcf902a211)
smatch: v0.5.0-9187-g5189e3fb
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Fixes: 85cd5534a3f2 ("wifi: mt76: mt7996: use correct link_id when filling TXD and TXP")
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202608101558.Q1CI1hTW-lkp@intel.com/
smatch warnings:
drivers/net/wireless/mediatek/mt76/mt7996/mac.c:1059 mt7996_tx_prepare_skb() error: we previously assumed 'sta' could be null (see line 1044)
drivers/net/wireless/mediatek/mt76/mt7996/mac.c:1099 mt7996_tx_prepare_skb() error: we previously assumed 'vif' could be null (see line 1043)
vim +/sta +1059 drivers/net/wireless/mediatek/mt76/mt7996/mac.c
b7ddeb9cc43949d Shayne Chen 2025-04-09 1032
98686cd21624c75 Shayne Chen 2022-11-22 1033 int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
98686cd21624c75 Shayne Chen 2022-11-22 1034 enum mt76_txq_id qid, struct mt76_wcid *wcid,
98686cd21624c75 Shayne Chen 2022-11-22 1035 struct ieee80211_sta *sta,
98686cd21624c75 Shayne Chen 2022-11-22 1036 struct mt76_tx_info *tx_info)
98686cd21624c75 Shayne Chen 2022-11-22 1037 {
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1038 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx_info->skb->data;
98686cd21624c75 Shayne Chen 2022-11-22 1039 struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76);
98686cd21624c75 Shayne Chen 2022-11-22 1040 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb);
98686cd21624c75 Shayne Chen 2022-11-22 1041 struct ieee80211_key_conf *key = info->control.hw_key;
98686cd21624c75 Shayne Chen 2022-11-22 1042 struct ieee80211_vif *vif = info->control.vif;
85cd5534a3f2ec9 Shayne Chen 2025-11-06 @1043 struct mt7996_vif *mvif = vif ? (struct mt7996_vif *)vif->drv_priv : NULL;
85cd5534a3f2ec9 Shayne Chen 2025-11-06 @1044 struct mt7996_sta *msta = sta ? (struct mt7996_sta *)sta->drv_priv : NULL;
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1045 struct mt76_vif_link *mlink = NULL;
98686cd21624c75 Shayne Chen 2022-11-22 1046 struct mt76_txwi_cache *t;
98686cd21624c75 Shayne Chen 2022-11-22 1047 int id, i, pid, nbuf = tx_info->nbuf - 1;
98686cd21624c75 Shayne Chen 2022-11-22 1048 bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1049 __le32 *ptr = (__le32 *)txwi_ptr;
98686cd21624c75 Shayne Chen 2022-11-22 1050 u8 *txwi = (u8 *)txwi_ptr;
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1051 u8 link_id;
98686cd21624c75 Shayne Chen 2022-11-22 1052
98686cd21624c75 Shayne Chen 2022-11-22 1053 if (unlikely(tx_info->skb->len <= ETH_HLEN))
98686cd21624c75 Shayne Chen 2022-11-22 1054 return -EINVAL;
98686cd21624c75 Shayne Chen 2022-11-22 1055
98686cd21624c75 Shayne Chen 2022-11-22 1056 if (!wcid)
98686cd21624c75 Shayne Chen 2022-11-22 1057 wcid = &dev->mt76.global_wcid;
98686cd21624c75 Shayne Chen 2022-11-22 1058
85cd5534a3f2ec9 Shayne Chen 2025-11-06 @1059 if ((is_8023 || ieee80211_is_data_qos(hdr->frame_control)) && sta->mlo &&
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1060 likely(tx_info->skb->protocol != cpu_to_be16(ETH_P_PAE))) {
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1061 u8 tid = tx_info->skb->priority & IEEE80211_QOS_CTL_TID_MASK;
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1062
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1063 link_id = (tid % 2) ? msta->seclink_id : msta->deflink_id;
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1064 } else {
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1065 link_id = u32_get_bits(info->control.flags,
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1066 IEEE80211_TX_CTRL_MLO_LINK);
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1067 }
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1068
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1069 if (link_id != wcid->link_id && link_id != IEEE80211_LINK_UNSPECIFIED) {
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1070 if (msta) {
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1071 struct mt7996_sta_link *msta_link =
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1072 rcu_dereference(msta->link[link_id]);
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1073
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1074 if (msta_link)
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1075 wcid = &msta_link->wcid;
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1076 } else if (mvif) {
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1077 mlink = rcu_dereference(mvif->mt76.link[link_id]);
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1078 if (mlink && mlink->wcid)
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1079 wcid = mlink->wcid;
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1080 }
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1081 }
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1082
98686cd21624c75 Shayne Chen 2022-11-22 1083 t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size);
98686cd21624c75 Shayne Chen 2022-11-22 1084 t->skb = tx_info->skb;
98686cd21624c75 Shayne Chen 2022-11-22 1085
98686cd21624c75 Shayne Chen 2022-11-22 1086 id = mt76_token_consume(mdev, &t);
98686cd21624c75 Shayne Chen 2022-11-22 1087 if (id < 0)
98686cd21624c75 Shayne Chen 2022-11-22 1088 return id;
98686cd21624c75 Shayne Chen 2022-11-22 1089
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1090 /* Since the rules of HW MLD address translation are not fully
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1091 * compatible with 802.11 EAPOL frame, we do the translation by
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1092 * software
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1093 */
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1094 if (tx_info->skb->protocol == cpu_to_be16(ETH_P_PAE) && sta->mlo) {
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1095 struct ieee80211_hdr *hdr = (void *)tx_info->skb->data;
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1096 struct ieee80211_bss_conf *link_conf;
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1097 struct ieee80211_link_sta *link_sta;
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1098
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 @1099 link_conf = rcu_dereference(vif->link_conf[wcid->link_id]);
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1100 if (!link_conf)
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1101 return -EINVAL;
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1102
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1103 link_sta = rcu_dereference(sta->link[wcid->link_id]);
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1104 if (!link_sta)
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1105 return -EINVAL;
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1106
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1107 dma_sync_single_for_cpu(mdev->dma_dev, tx_info->buf[1].addr,
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1108 tx_info->buf[1].len, DMA_TO_DEVICE);
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1109
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1110 memcpy(hdr->addr1, link_sta->addr, ETH_ALEN);
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1111 memcpy(hdr->addr2, link_conf->addr, ETH_ALEN);
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1112 if (ieee80211_has_a4(hdr->frame_control)) {
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1113 memcpy(hdr->addr3, sta->addr, ETH_ALEN);
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1114 memcpy(hdr->addr4, vif->addr, ETH_ALEN);
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1115 } else if (ieee80211_has_tods(hdr->frame_control)) {
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1116 memcpy(hdr->addr3, sta->addr, ETH_ALEN);
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1117 } else if (ieee80211_has_fromds(hdr->frame_control)) {
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1118 memcpy(hdr->addr3, vif->addr, ETH_ALEN);
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1119 }
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1120
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1121 dma_sync_single_for_device(mdev->dma_dev, tx_info->buf[1].addr,
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1122 tx_info->buf[1].len, DMA_TO_DEVICE);
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1123 }
7ef0c7ad735b0c3 Shayne Chen 2025-09-04 1124
98686cd21624c75 Shayne Chen 2022-11-22 1125 pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
3dbfb8abe3fd3ff Shayne Chen 2025-03-28 1126 memset(txwi_ptr, 0, MT_TXD_SIZE);
3dbfb8abe3fd3ff Shayne Chen 2025-03-28 1127 /* Transmit non qos data by 802.11 header and need to fill txd by host*/
3dbfb8abe3fd3ff Shayne Chen 2025-03-28 1128 if (!is_8023 || pid >= MT_PACKET_ID_FIRST)
d0b6f86fdbefa62 Shayne Chen 2023-03-03 1129 mt7996_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key,
d0b6f86fdbefa62 Shayne Chen 2023-03-03 1130 pid, qid, 0);
98686cd21624c75 Shayne Chen 2022-11-22 1131
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1132 /* MT7996 and MT7992 require driver to provide the MAC TXP for AddBA
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1133 * req
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1134 */
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1135 if (le32_to_cpu(ptr[7]) & MT_TXD7_MAC_TXD) {
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1136 u32 val;
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1137
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1138 ptr = (__le32 *)(txwi + MT_TXD_SIZE);
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1139 memset((void *)ptr, 0, sizeof(struct mt76_connac_fw_txp));
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1140
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1141 val = FIELD_PREP(MT_TXP0_TOKEN_ID0, id) |
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1142 MT_TXP0_TOKEN_ID0_VALID_MASK;
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1143 ptr[0] = cpu_to_le32(val);
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1144
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1145 val = FIELD_PREP(MT_TXP1_TID_ADDBA,
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1146 tx_info->skb->priority &
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1147 IEEE80211_QOS_CTL_TID_MASK);
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1148 ptr[1] = cpu_to_le32(val);
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1149 ptr[2] = cpu_to_le32(tx_info->buf[1].addr & 0xFFFFFFFF);
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1150
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1151 val = FIELD_PREP(MT_TXP_BUF_LEN, tx_info->buf[1].len) |
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1152 MT_TXP3_ML0_MASK;
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1153 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1154 val |= FIELD_PREP(MT_TXP3_DMA_ADDR_H,
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1155 tx_info->buf[1].addr >> 32);
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1156 #endif
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1157 ptr[3] = cpu_to_le32(val);
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1158 } else {
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1159 struct mt76_connac_txp_common *txp;
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1160
3c38dfc1702d812 Lorenzo Bianconi 2023-01-18 1161 txp = (struct mt76_connac_txp_common *)(txwi + MT_TXD_SIZE);
98686cd21624c75 Shayne Chen 2022-11-22 1162 for (i = 0; i < nbuf; i++) {
4920a3a1285f5fd Sujuan Chen 2023-11-17 1163 u16 len;
4920a3a1285f5fd Sujuan Chen 2023-11-17 1164
4920a3a1285f5fd Sujuan Chen 2023-11-17 1165 len = FIELD_PREP(MT_TXP_BUF_LEN, tx_info->buf[i + 1].len);
4920a3a1285f5fd Sujuan Chen 2023-11-17 1166 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
4920a3a1285f5fd Sujuan Chen 2023-11-17 1167 len |= FIELD_PREP(MT_TXP_DMA_ADDR_H,
4920a3a1285f5fd Sujuan Chen 2023-11-17 1168 tx_info->buf[i + 1].addr >> 32);
4920a3a1285f5fd Sujuan Chen 2023-11-17 1169 #endif
4920a3a1285f5fd Sujuan Chen 2023-11-17 1170
3c38dfc1702d812 Lorenzo Bianconi 2023-01-18 1171 txp->fw.buf[i] = cpu_to_le32(tx_info->buf[i + 1].addr);
4920a3a1285f5fd Sujuan Chen 2023-11-17 1172 txp->fw.len[i] = cpu_to_le16(len);
98686cd21624c75 Shayne Chen 2022-11-22 1173 }
3c38dfc1702d812 Lorenzo Bianconi 2023-01-18 1174 txp->fw.nbuf = nbuf;
98686cd21624c75 Shayne Chen 2022-11-22 1175
3dbfb8abe3fd3ff Shayne Chen 2025-03-28 1176 txp->fw.flags = cpu_to_le16(MT_CT_INFO_FROM_HOST);
3dbfb8abe3fd3ff Shayne Chen 2025-03-28 1177
3dbfb8abe3fd3ff Shayne Chen 2025-03-28 1178 if (!is_8023 || pid >= MT_PACKET_ID_FIRST)
3dbfb8abe3fd3ff Shayne Chen 2025-03-28 1179 txp->fw.flags |= cpu_to_le16(MT_CT_INFO_APPLY_TXD);
98686cd21624c75 Shayne Chen 2022-11-22 1180
98686cd21624c75 Shayne Chen 2022-11-22 1181 if (!key)
3c38dfc1702d812 Lorenzo Bianconi 2023-01-18 1182 txp->fw.flags |= cpu_to_le16(MT_CT_INFO_NONE_CIPHER_FRAME);
98686cd21624c75 Shayne Chen 2022-11-22 1183
b7ddeb9cc43949d Shayne Chen 2025-04-09 1184 if (!is_8023 && mt7996_tx_use_mgmt(dev, tx_info->skb))
3c38dfc1702d812 Lorenzo Bianconi 2023-01-18 1185 txp->fw.flags |= cpu_to_le16(MT_CT_INFO_MGMT_FRAME);
98686cd21624c75 Shayne Chen 2022-11-22 1186
85cd5534a3f2ec9 Shayne Chen 2025-11-06 1187 if (mvif) {
13b4c81083cc4b5 Felix Fietkau 2025-03-11 1188 if (wcid->offchannel)
13b4c81083cc4b5 Felix Fietkau 2025-03-11 1189 mlink = rcu_dereference(mvif->mt76.offchannel_link);
13b4c81083cc4b5 Felix Fietkau 2025-03-11 1190 if (!mlink)
59ea7af6f9ce218 Lorenzo Bianconi 2025-07-04 1191 mlink = rcu_dereference(mvif->mt76.link[wcid->link_id]);
98686cd21624c75 Shayne Chen 2022-11-22 1192
59ea7af6f9ce218 Lorenzo Bianconi 2025-07-04 1193 txp->fw.bss_idx = mlink ? mlink->idx : mvif->deflink.mt76.idx;
98686cd21624c75 Shayne Chen 2022-11-22 1194 }
98686cd21624c75 Shayne Chen 2022-11-22 1195
3c38dfc1702d812 Lorenzo Bianconi 2023-01-18 1196 txp->fw.token = cpu_to_le16(id);
bde2e77f76266fb Peter Chiu 2023-08-17 1197 txp->fw.rept_wds_wcid = cpu_to_le16(sta ? wcid->idx : 0xfff);
cb6ebbdffef2a88 Howard Hsu 2025-09-09 1198 }
bde2e77f76266fb Peter Chiu 2023-08-17 1199
832f42699791e7a Felix Fietkau 2023-09-11 1200 tx_info->skb = NULL;
98686cd21624c75 Shayne Chen 2022-11-22 1201
98686cd21624c75 Shayne Chen 2022-11-22 1202 /* pass partial skb header to fw */
98686cd21624c75 Shayne Chen 2022-11-22 1203 tx_info->buf[1].len = MT_CT_PARSE_LEN;
98686cd21624c75 Shayne Chen 2022-11-22 1204 tx_info->buf[1].skip_unmap = true;
98686cd21624c75 Shayne Chen 2022-11-22 1205 tx_info->nbuf = MT_CT_DMA_BUF_NUM;
98686cd21624c75 Shayne Chen 2022-11-22 1206
98686cd21624c75 Shayne Chen 2022-11-22 1207 return 0;
98686cd21624c75 Shayne Chen 2022-11-22 1208 }
98686cd21624c75 Shayne Chen 2022-11-22 1209
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-08-10 7:57 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-10 7:56 drivers/net/wireless/mediatek/mt76/mt7996/mac.c:1059 mt7996_tx_prepare_skb() error: we previously assumed 'sta' could be null (see line 1044) kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2026-04-16 18:08 kernel test robot
2025-12-24 10:42 kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.