Lines Matching +full:link +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2020-2023 Intel Corporation
23 #include "driver-ops.h"
38 return d->format(d->sdata, buf, bufsize);
47 struct ieee80211_sub_if_data *sdata = file->private_data;
54 return wiphy_locked_debugfs_read(sdata->local->hw.wiphy,
74 return d->write(d->sdata, buf, count);
83 struct ieee80211_sub_if_data *sdata = file->private_data;
90 return wiphy_locked_debugfs_write(sdata->local->hw.wiphy,
99 struct ieee80211_link_data *link;
110 return d->format(d->link, buf, bufsize);
117 ssize_t (*format)(const struct ieee80211_link_data *link, char *, int))
119 struct ieee80211_link_data *link = file->private_data;
122 .link = link,
126 return wiphy_locked_debugfs_read(link->sdata->local->hw.wiphy,
135 struct ieee80211_link_data *link;
146 return d->write(d->sdata, buf, count);
153 ssize_t (*write)(struct ieee80211_link_data *link, const char *, int))
155 struct ieee80211_link_data *link = file->private_data;
158 .link = link,
162 return wiphy_locked_debugfs_write(link->sdata->local->hw.wiphy,
169 #define IEEE80211_IF_FMT(name, type, field, format_string) \
170 static ssize_t ieee80211_if_fmt_##name( \
174 return scnprintf(buf, buflen, format_string, data->field); \
176 #define IEEE80211_IF_FMT_DEC(name, type, field) \
177 IEEE80211_IF_FMT(name, type, field, "%d\n")
178 #define IEEE80211_IF_FMT_HEX(name, type, field) \
179 IEEE80211_IF_FMT(name, type, field, "%#x\n")
180 #define IEEE80211_IF_FMT_LHEX(name, type, field) \
181 IEEE80211_IF_FMT(name, type, field, "%#lx\n")
183 #define IEEE80211_IF_FMT_HEXARRAY(name, type, field) \
184 static ssize_t ieee80211_if_fmt_##name( \
190 for (i = 0; i < sizeof(data->field); i++) { \
191 p += scnprintf(p, buflen + buf - p, "%.2x ", \
192 data->field[i]); \
194 p += scnprintf(p, buflen + buf - p, "\n"); \
195 return p - buf; \
198 #define IEEE80211_IF_FMT_ATOMIC(name, type, field) \
199 static ssize_t ieee80211_if_fmt_##name( \
203 return scnprintf(buf, buflen, "%d\n", atomic_read(&data->field));\
206 #define IEEE80211_IF_FMT_MAC(name, type, field) \
207 static ssize_t ieee80211_if_fmt_##name( \
211 return scnprintf(buf, buflen, "%pM\n", data->field); \
214 #define IEEE80211_IF_FMT_JIFFIES_TO_MS(name, type, field) \
215 static ssize_t ieee80211_if_fmt_##name( \
220 jiffies_to_msecs(data->field)); \
223 #define _IEEE80211_IF_FILE_OPS(name, _read, _write) \
224 static const struct debugfs_short_fops name##_ops = { \
230 #define _IEEE80211_IF_FILE_R_FN(name) \
231 static ssize_t ieee80211_if_read_##name(struct file *file, \
237 ieee80211_if_fmt_##name); \
240 #define _IEEE80211_IF_FILE_W_FN(name) \
241 static ssize_t ieee80211_if_write_##name(struct file *file, \
247 ieee80211_if_parse_##name); \
250 #define IEEE80211_IF_FILE_R(name) \
251 _IEEE80211_IF_FILE_R_FN(name) \
252 _IEEE80211_IF_FILE_OPS(name, ieee80211_if_read_##name, NULL)
254 #define IEEE80211_IF_FILE_W(name) \
255 _IEEE80211_IF_FILE_W_FN(name) \
256 _IEEE80211_IF_FILE_OPS(name, NULL, ieee80211_if_write_##name)
258 #define IEEE80211_IF_FILE_RW(name) \
259 _IEEE80211_IF_FILE_R_FN(name) \
260 _IEEE80211_IF_FILE_W_FN(name) \
261 _IEEE80211_IF_FILE_OPS(name, ieee80211_if_read_##name, \
262 ieee80211_if_write_##name)
264 #define IEEE80211_IF_FILE(name, field, format) \
265 IEEE80211_IF_FMT_##format(name, struct ieee80211_sub_if_data, field) \
266 IEEE80211_IF_FILE_R(name)
268 #define _IEEE80211_IF_LINK_R_FN(name) \
269 static ssize_t ieee80211_if_read_##name(struct file *file, \
275 ieee80211_if_fmt_##name); \
278 #define _IEEE80211_IF_LINK_W_FN(name) \
279 static ssize_t ieee80211_if_write_##name(struct file *file, \
285 ieee80211_if_parse_##name); \
288 #define IEEE80211_IF_LINK_FILE_R(name) \
289 _IEEE80211_IF_LINK_R_FN(name) \
290 _IEEE80211_IF_FILE_OPS(link_##name, ieee80211_if_read_##name, NULL)
292 #define IEEE80211_IF_LINK_FILE_W(name) \
293 _IEEE80211_IF_LINK_W_FN(name) \
294 _IEEE80211_IF_FILE_OPS(link_##name, NULL, ieee80211_if_write_##name)
296 #define IEEE80211_IF_LINK_FILE_RW(name) \
297 _IEEE80211_IF_LINK_R_FN(name) \
298 _IEEE80211_IF_LINK_W_FN(name) \
299 _IEEE80211_IF_FILE_OPS(link_##name, ieee80211_if_read_##name, \
300 ieee80211_if_write_##name)
302 #define IEEE80211_IF_LINK_FILE(name, field, format) \
303 IEEE80211_IF_FMT_##format(name, struct ieee80211_link_data, field) \
304 IEEE80211_IF_LINK_FILE_R(name)
321 const u16 *mask = sdata->rc_rateidx_vht_mcs_mask[NL80211_BAND_2GHZ];
324 len += scnprintf(buf + len, buflen - len, "%04x ", mask[i]);
325 len += scnprintf(buf + len, buflen - len, "\n");
337 const u16 *mask = sdata->rc_rateidx_vht_mcs_mask[NL80211_BAND_5GHZ];
340 len += scnprintf(buf + len, buflen - len, "%04x ", mask[i]);
341 len += scnprintf(buf + len, buflen - len, "\n");
350 IEEE80211_IF_LINK_FILE(txpower, conf->txpower, DEC);
361 sdata->vif.hw_queue[IEEE80211_AC_VO],
362 sdata->vif.hw_queue[IEEE80211_AC_VI],
363 sdata->vif.hw_queue[IEEE80211_AC_BE],
364 sdata->vif.hw_queue[IEEE80211_AC_BK]);
366 if (sdata->vif.type == NL80211_IFTYPE_AP)
367 len += scnprintf(buf + len, buflen - len, "cab queue: %d\n",
368 sdata->vif.cab_queue);
379 static int ieee80211_set_smps(struct ieee80211_link_data *link,
382 struct ieee80211_sub_if_data *sdata = link->sdata;
383 struct ieee80211_local *local = sdata->local;
388 if (sdata->vif.driver_flags & IEEE80211_VIF_EML_ACTIVE)
389 return -EOPNOTSUPP;
391 if (!(local->hw.wiphy->features & NL80211_FEATURE_STATIC_SMPS) &&
393 return -EINVAL;
396 if (!(local->hw.wiphy->features & NL80211_FEATURE_DYNAMIC_SMPS) &&
399 return -EINVAL;
401 if (sdata->vif.type != NL80211_IFTYPE_STATION)
402 return -EOPNOTSUPP;
404 return __ieee80211_request_smps_mgd(link->sdata, link, smps_mode);
414 static ssize_t ieee80211_if_fmt_smps(const struct ieee80211_link_data *link,
417 if (link->sdata->vif.type == NL80211_IFTYPE_STATION)
419 smps_modes[link->u.mgd.req_smps],
420 smps_modes[link->smps_mode]);
421 return -EINVAL;
424 static ssize_t ieee80211_if_parse_smps(struct ieee80211_link_data *link,
431 int err = ieee80211_set_smps(link, mode);
438 return -EINVAL;
445 struct ieee80211_local *local = sdata->local;
452 return -EINVAL;
455 return -ENOTCONN;
457 skb = dev_alloc_skb(local->hw.extra_tx_headroom + 24 + 100);
459 return -ENOMEM;
460 skb_reserve(skb, local->hw.extra_tx_headroom);
465 switch (sdata->vif.type) {
469 memcpy(hdr->addr1, addr, ETH_ALEN);
470 memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN);
471 memcpy(hdr->addr3, sdata->vif.addr, ETH_ALEN);
476 if (!sdata->u.mgd.associated) {
478 return -ENOTCONN;
480 memcpy(hdr->addr1, sdata->deflink.u.mgd.bssid, ETH_ALEN);
481 memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN);
482 memcpy(hdr->addr3, addr, ETH_ALEN);
486 return -EOPNOTSUPP;
488 hdr->frame_control = fc;
497 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_TKIP_MIC_FAILURE;
508 if (!ieee80211_sdata_running(sdata) || !sdata->vif.cfg.assoc)
509 return -ENOTCONN;
511 ieee80211_beacon_loss(&sdata->vif);
520 const struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
522 return snprintf(buf, buflen, "0x%x\n", ifmgd->uapsd_queues);
528 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
537 return -ERANGE;
539 ifmgd->uapsd_queues = val;
548 const struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
550 return snprintf(buf, buflen, "0x%x\n", ifmgd->uapsd_max_sp_len);
556 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
562 return -EINVAL;
565 return -ERANGE;
567 ifmgd->uapsd_max_sp_len = val;
576 const struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
579 tdls_wider_bw = ieee80211_hw_check(&sdata->local->hw, TDLS_WIDER_BW) &&
580 !ifmgd->tdls_wider_bw_prohibited;
588 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
596 ifmgd->tdls_wider_bw_prohibited = !val;
611 skb_queue_len(&sdata->u.ap.ps.bc_buf));
618 struct ieee80211_local *local = sdata->local;
622 if (!sdata->vif.txq)
625 txqi = to_txq_info(sdata->vif.txq);
627 spin_lock_bh(&local->fq.lock);
631 "ac backlog-bytes backlog-packets new-flows drops marks overlimit collisions tx-bytes tx-packets\n"
633 txqi->txq.ac,
634 txqi->tin.backlog_bytes,
635 txqi->tin.backlog_packets,
636 txqi->tin.flows,
637 txqi->cstats.drop_count,
638 txqi->cstats.ecn_mark,
639 txqi->tin.overlimit,
640 txqi->tin.collisions,
641 txqi->tin.tx_bytes,
642 txqi->tin.tx_packets);
644 spin_unlock_bh(&local->fq.lock);
656 struct ieee80211_local *local = sdata->local;
667 struct ieee80211_local *local = sdata->local;
673 if (local->ops->reset_tsf) {
675 wiphy_info(local->hw.wiphy, "debugfs reset TSF\n");
681 else if (buf[0] == '-')
682 tsf_is_delta = -1;
684 return -EINVAL;
690 if (tsf_is_delta && local->ops->offset_tsf) {
692 wiphy_info(local->hw.wiphy,
695 } else if (local->ops->set_tsf) {
700 wiphy_info(local->hw.wiphy,
713 return snprintf(buf, buflen, "0x%x\n", sdata->vif.valid_links);
720 return snprintf(buf, buflen, "0x%x\n", sdata->vif.active_links);
729 return -EINVAL;
731 return ieee80211_set_active_links(&sdata->vif, active_links) ?: buflen;
735 IEEE80211_IF_LINK_FILE(addr, conf->addr, MAC);
801 #define DEBUGFS_ADD_MODE(name, mode) \
802 debugfs_create_file(#name, mode, sdata->vif.debugfs_dir, \
803 sdata, &name##_ops)
806 debugfs_create_x##_bits(#_name, _mode, sdata->vif.debugfs_dir, \
807 &sdata->vif._name)
818 #define DEBUGFS_ADD(name) DEBUGFS_ADD_MODE(name, 0400)
830 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
831 sdata->vif.type != NL80211_IFTYPE_NAN)
862 /* add num_mcast_sta_vlan using name num_mcast_sta */
863 debugfs_create_file("num_mcast_sta", 0400, sdata->vif.debugfs_dir,
883 sdata->vif.debugfs_dir);
884 #define MESHSTATS_ADD(name)\
885 debugfs_create_file(#name, 0400, dir, sdata, &name##_ops)
898 sdata->vif.debugfs_dir);
900 #define MESHPARAMS_ADD(name) \
901 debugfs_create_file(#name, 0600, dir, sdata, &name##_ops)
938 if (!sdata->vif.debugfs_dir)
944 if (sdata->vif.type != NL80211_IFTYPE_MONITOR)
947 switch (sdata->vif.type) {
975 #define DEBUGFS_ADD_MODE(dentry, name, mode) \
976 debugfs_create_file(#name, mode, dentry, \
977 link, &link_##name##_ops)
979 #define DEBUGFS_ADD(dentry, name) DEBUGFS_ADD_MODE(dentry, name, 0400)
981 static void add_link_files(struct ieee80211_link_data *link,
988 switch (link->sdata->vif.type) {
1002 sprintf(buf, "netdev:%s", sdata->name);
1003 sdata->vif.debugfs_dir = debugfs_create_dir(buf,
1004 sdata->local->hw.wiphy->debugfsdir);
1006 sdata->deflink.debugfs_dir = sdata->vif.debugfs_dir;
1007 sdata->debugfs.subdir_stations = debugfs_create_dir("stations",
1008 sdata->vif.debugfs_dir);
1011 add_link_files(&sdata->deflink, sdata->vif.debugfs_dir);
1016 if (!sdata->vif.debugfs_dir)
1019 debugfs_remove_recursive(sdata->vif.debugfs_dir);
1020 sdata->vif.debugfs_dir = NULL;
1021 sdata->debugfs.subdir_stations = NULL;
1026 debugfs_change_name(sdata->vif.debugfs_dir, "netdev:%s", sdata->name);
1035 if (sdata->flags & IEEE80211_SDATA_IN_DRIVER) {
1036 drv_vif_add_debugfs(sdata->local, sdata);
1038 ieee80211_link_debugfs_drv_add(&sdata->deflink);
1042 void ieee80211_link_debugfs_add(struct ieee80211_link_data *link)
1046 if (WARN_ON(!link->sdata->vif.debugfs_dir || link->debugfs_dir))
1049 /* For now, this should not be called for non-MLO capable drivers */
1050 if (WARN_ON(!(link->sdata->local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)))
1054 "link-%d", link->link_id);
1056 link->debugfs_dir =
1058 link->sdata->vif.debugfs_dir);
1060 DEBUGFS_ADD(link->debugfs_dir, addr);
1061 add_link_files(link, link->debugfs_dir);
1064 void ieee80211_link_debugfs_remove(struct ieee80211_link_data *link)
1066 if (!link->sdata->vif.debugfs_dir || !link->debugfs_dir) {
1067 link->debugfs_dir = NULL;
1071 if (link->debugfs_dir == link->sdata->vif.debugfs_dir) {
1072 WARN_ON(link != &link->sdata->deflink);
1073 link->debugfs_dir = NULL;
1077 debugfs_remove_recursive(link->debugfs_dir);
1078 link->debugfs_dir = NULL;
1081 void ieee80211_link_debugfs_drv_add(struct ieee80211_link_data *link)
1083 if (link->sdata->vif.type == NL80211_IFTYPE_MONITOR ||
1084 WARN_ON(!link->debugfs_dir))
1087 drv_link_add_debugfs(link->sdata->local, link->sdata,
1088 link->conf, link->debugfs_dir);
1091 void ieee80211_link_debugfs_drv_remove(struct ieee80211_link_data *link)
1093 if (!link || !link->debugfs_dir)
1096 if (WARN_ON(link->debugfs_dir == link->sdata->vif.debugfs_dir))
1100 debugfs_remove_recursive(link->debugfs_dir);
1101 link->debugfs_dir = NULL;
1103 ieee80211_link_debugfs_add(link);