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 <[email protected]>
| Newsgroups | dev.linux.lists.oe-kbuild |
|---|---|
| Message-ID | <[email protected]> |
BCC: [email protected] CC: [email protected] CC: [email protected] TO: Shayne Chen <[email protected]> CC: Felix Fietkau <[email protected]> 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/[email protected]/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 <[email protected]> | Reported-by: Dan Carpenter <[email protected]> | Closes: https://lore.kernel.org/r/[email protected]/ 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