Lines Matching +full:d +full:- +full:link

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2020-2023 Intel Corporation
23 #include "driver-ops.h"
36 struct ieee80211_if_read_sdata_data *d = data; in ieee80211_if_read_sdata_handler() local
38 return d->format(d->sdata, buf, bufsize); in ieee80211_if_read_sdata_handler()
47 struct ieee80211_sub_if_data *sdata = file->private_data; in ieee80211_if_read_sdata()
54 return wiphy_locked_debugfs_read(sdata->local->hw.wiphy, in ieee80211_if_read_sdata()
72 struct ieee80211_if_write_sdata_data *d = data; in ieee80211_if_write_sdata_handler() local
74 return d->write(d->sdata, buf, count); in ieee80211_if_write_sdata_handler()
83 struct ieee80211_sub_if_data *sdata = file->private_data; in ieee80211_if_write_sdata()
90 return wiphy_locked_debugfs_write(sdata->local->hw.wiphy, in ieee80211_if_write_sdata()
99 struct ieee80211_link_data *link; member
108 struct ieee80211_if_read_link_data *d = data; in ieee80211_if_read_link_handler() local
110 return d->format(d->link, buf, bufsize); in ieee80211_if_read_link_handler()
117 ssize_t (*format)(const struct ieee80211_link_data *link, char *, int)) in ieee80211_if_read_link() argument
119 struct ieee80211_link_data *link = file->private_data; in ieee80211_if_read_link() local
122 .link = link, in ieee80211_if_read_link()
126 return wiphy_locked_debugfs_read(link->sdata->local->hw.wiphy, in ieee80211_if_read_link()
135 struct ieee80211_link_data *link; member
144 struct ieee80211_if_write_sdata_data *d = data; in ieee80211_if_write_link_handler() local
146 return d->write(d->sdata, buf, count); in ieee80211_if_write_link_handler()
153 ssize_t (*write)(struct ieee80211_link_data *link, const char *, int)) in ieee80211_if_write_link() argument
155 struct ieee80211_link_data *link = file->private_data; in ieee80211_if_write_link() local
158 .link = link, in ieee80211_if_write_link()
162 return wiphy_locked_debugfs_write(link->sdata->local->hw.wiphy, in ieee80211_if_write_link()
174 return scnprintf(buf, buflen, format_string, data->field); \
177 IEEE80211_IF_FMT(name, type, field, "%d\n")
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; \
203 return scnprintf(buf, buflen, "%d\n", atomic_read(&data->field));\
211 return scnprintf(buf, buflen, "%pM\n", data->field); \
219 return scnprintf(buf, buflen, "%d\n", \
220 jiffies_to_msecs(data->field)); \
321 const u16 *mask = sdata->rc_rateidx_vht_mcs_mask[NL80211_BAND_2GHZ]; in ieee80211_if_fmt_rc_rateidx_vht_mcs_mask_2ghz()
324 len += scnprintf(buf + len, buflen - len, "%04x ", mask[i]); in ieee80211_if_fmt_rc_rateidx_vht_mcs_mask_2ghz()
325 len += scnprintf(buf + len, buflen - len, "\n"); in ieee80211_if_fmt_rc_rateidx_vht_mcs_mask_2ghz()
337 const u16 *mask = sdata->rc_rateidx_vht_mcs_mask[NL80211_BAND_5GHZ]; in ieee80211_if_fmt_rc_rateidx_vht_mcs_mask_5ghz()
340 len += scnprintf(buf + len, buflen - len, "%04x ", mask[i]); in ieee80211_if_fmt_rc_rateidx_vht_mcs_mask_5ghz()
341 len += scnprintf(buf + len, buflen - len, "\n"); in ieee80211_if_fmt_rc_rateidx_vht_mcs_mask_5ghz()
350 IEEE80211_IF_LINK_FILE(txpower, conf->txpower, DEC);
360 len = scnprintf(buf, buflen, "AC queues: VO:%d VI:%d BE:%d BK:%d\n", in ieee80211_if_fmt_hw_queues()
361 sdata->vif.hw_queue[IEEE80211_AC_VO], in ieee80211_if_fmt_hw_queues()
362 sdata->vif.hw_queue[IEEE80211_AC_VI], in ieee80211_if_fmt_hw_queues()
363 sdata->vif.hw_queue[IEEE80211_AC_BE], in ieee80211_if_fmt_hw_queues()
364 sdata->vif.hw_queue[IEEE80211_AC_BK]); in ieee80211_if_fmt_hw_queues()
366 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_if_fmt_hw_queues()
367 len += scnprintf(buf + len, buflen - len, "cab queue: %d\n", in ieee80211_if_fmt_hw_queues()
368 sdata->vif.cab_queue); in ieee80211_if_fmt_hw_queues()
379 static int ieee80211_set_smps(struct ieee80211_link_data *link, in ieee80211_set_smps() argument
382 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_set_smps()
383 struct ieee80211_local *local = sdata->local; in ieee80211_set_smps()
388 if (sdata->vif.driver_flags & IEEE80211_VIF_EML_ACTIVE) in ieee80211_set_smps()
389 return -EOPNOTSUPP; in ieee80211_set_smps()
391 if (!(local->hw.wiphy->features & NL80211_FEATURE_STATIC_SMPS) && in ieee80211_set_smps()
393 return -EINVAL; in ieee80211_set_smps()
396 if (!(local->hw.wiphy->features & NL80211_FEATURE_DYNAMIC_SMPS) && in ieee80211_set_smps()
399 return -EINVAL; in ieee80211_set_smps()
401 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_set_smps()
402 return -EOPNOTSUPP; in ieee80211_set_smps()
404 return __ieee80211_request_smps_mgd(link->sdata, link, smps_mode); in ieee80211_set_smps()
414 static ssize_t ieee80211_if_fmt_smps(const struct ieee80211_link_data *link, in ieee80211_if_fmt_smps() argument
417 if (link->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_if_fmt_smps()
419 smps_modes[link->u.mgd.req_smps], in ieee80211_if_fmt_smps()
420 smps_modes[link->smps_mode]); in ieee80211_if_fmt_smps()
421 return -EINVAL; in ieee80211_if_fmt_smps()
424 static ssize_t ieee80211_if_parse_smps(struct ieee80211_link_data *link, in ieee80211_if_parse_smps() argument
431 int err = ieee80211_set_smps(link, mode); in ieee80211_if_parse_smps()
438 return -EINVAL; in ieee80211_if_parse_smps()
445 struct ieee80211_local *local = sdata->local; in ieee80211_if_parse_tkip_mic_test()
452 return -EINVAL; in ieee80211_if_parse_tkip_mic_test()
455 return -ENOTCONN; in ieee80211_if_parse_tkip_mic_test()
457 skb = dev_alloc_skb(local->hw.extra_tx_headroom + 24 + 100); in ieee80211_if_parse_tkip_mic_test()
459 return -ENOMEM; in ieee80211_if_parse_tkip_mic_test()
460 skb_reserve(skb, local->hw.extra_tx_headroom); in ieee80211_if_parse_tkip_mic_test()
465 switch (sdata->vif.type) { in ieee80211_if_parse_tkip_mic_test()
469 memcpy(hdr->addr1, addr, ETH_ALEN); in ieee80211_if_parse_tkip_mic_test()
470 memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_if_parse_tkip_mic_test()
471 memcpy(hdr->addr3, sdata->vif.addr, ETH_ALEN); in ieee80211_if_parse_tkip_mic_test()
476 if (!sdata->u.mgd.associated) { in ieee80211_if_parse_tkip_mic_test()
478 return -ENOTCONN; in ieee80211_if_parse_tkip_mic_test()
480 memcpy(hdr->addr1, sdata->deflink.u.mgd.bssid, ETH_ALEN); in ieee80211_if_parse_tkip_mic_test()
481 memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_if_parse_tkip_mic_test()
482 memcpy(hdr->addr3, addr, ETH_ALEN); in ieee80211_if_parse_tkip_mic_test()
486 return -EOPNOTSUPP; in ieee80211_if_parse_tkip_mic_test()
488 hdr->frame_control = fc; in ieee80211_if_parse_tkip_mic_test()
497 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_TKIP_MIC_FAILURE; in ieee80211_if_parse_tkip_mic_test()
508 if (!ieee80211_sdata_running(sdata) || !sdata->vif.cfg.assoc) in ieee80211_if_parse_beacon_loss()
509 return -ENOTCONN; in ieee80211_if_parse_beacon_loss()
511 ieee80211_beacon_loss(&sdata->vif); in ieee80211_if_parse_beacon_loss()
520 const struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_if_fmt_uapsd_queues()
522 return snprintf(buf, buflen, "0x%x\n", ifmgd->uapsd_queues); in ieee80211_if_fmt_uapsd_queues()
528 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_if_parse_uapsd_queues()
537 return -ERANGE; in ieee80211_if_parse_uapsd_queues()
539 ifmgd->uapsd_queues = val; in ieee80211_if_parse_uapsd_queues()
548 const struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_if_fmt_uapsd_max_sp_len()
550 return snprintf(buf, buflen, "0x%x\n", ifmgd->uapsd_max_sp_len); in ieee80211_if_fmt_uapsd_max_sp_len()
556 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_if_parse_uapsd_max_sp_len()
562 return -EINVAL; in ieee80211_if_parse_uapsd_max_sp_len()
565 return -ERANGE; in ieee80211_if_parse_uapsd_max_sp_len()
567 ifmgd->uapsd_max_sp_len = val; in ieee80211_if_parse_uapsd_max_sp_len()
576 const struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_if_fmt_tdls_wider_bw()
579 tdls_wider_bw = ieee80211_hw_check(&sdata->local->hw, TDLS_WIDER_BW) && in ieee80211_if_fmt_tdls_wider_bw()
580 !ifmgd->tdls_wider_bw_prohibited; in ieee80211_if_fmt_tdls_wider_bw()
582 return snprintf(buf, buflen, "%d\n", tdls_wider_bw); in ieee80211_if_fmt_tdls_wider_bw()
588 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_if_parse_tdls_wider_bw()
596 ifmgd->tdls_wider_bw_prohibited = !val; in ieee80211_if_parse_tdls_wider_bw()
611 skb_queue_len(&sdata->u.ap.ps.bc_buf)); in ieee80211_if_fmt_num_buffered_multicast()
618 struct ieee80211_local *local = sdata->local; in ieee80211_if_fmt_aqm()
622 if (!sdata->vif.txq) in ieee80211_if_fmt_aqm()
625 txqi = to_txq_info(sdata->vif.txq); in ieee80211_if_fmt_aqm()
627 spin_lock_bh(&local->fq.lock); in ieee80211_if_fmt_aqm()
632 …"ac backlog-bytes backlog-packets new-flows drops marks overlimit collisions tx-bytes tx-packets\n" in ieee80211_if_fmt_aqm()
634 txqi->txq.ac, in ieee80211_if_fmt_aqm()
635 txqi->tin.backlog_bytes, in ieee80211_if_fmt_aqm()
636 txqi->tin.backlog_packets, in ieee80211_if_fmt_aqm()
637 txqi->tin.flows, in ieee80211_if_fmt_aqm()
638 txqi->cstats.drop_count, in ieee80211_if_fmt_aqm()
639 txqi->cstats.ecn_mark, in ieee80211_if_fmt_aqm()
640 txqi->tin.overlimit, in ieee80211_if_fmt_aqm()
641 txqi->tin.collisions, in ieee80211_if_fmt_aqm()
642 txqi->tin.tx_bytes, in ieee80211_if_fmt_aqm()
643 txqi->tin.tx_packets); in ieee80211_if_fmt_aqm()
646 spin_unlock_bh(&local->fq.lock); in ieee80211_if_fmt_aqm()
658 struct ieee80211_local *local = sdata->local; in ieee80211_if_fmt_tsf()
669 struct ieee80211_local *local = sdata->local; in ieee80211_if_parse_tsf()
675 if (local->ops->reset_tsf) { in ieee80211_if_parse_tsf()
677 wiphy_info(local->hw.wiphy, "debugfs reset TSF\n"); in ieee80211_if_parse_tsf()
683 else if (buf[0] == '-') in ieee80211_if_parse_tsf()
684 tsf_is_delta = -1; in ieee80211_if_parse_tsf()
686 return -EINVAL; in ieee80211_if_parse_tsf()
692 if (tsf_is_delta && local->ops->offset_tsf) { in ieee80211_if_parse_tsf()
694 wiphy_info(local->hw.wiphy, in ieee80211_if_parse_tsf()
697 } else if (local->ops->set_tsf) { in ieee80211_if_parse_tsf()
702 wiphy_info(local->hw.wiphy, in ieee80211_if_parse_tsf()
715 return snprintf(buf, buflen, "0x%x\n", sdata->vif.valid_links); in ieee80211_if_fmt_valid_links()
722 return snprintf(buf, buflen, "0x%x\n", sdata->vif.active_links); in ieee80211_if_fmt_active_links()
731 return -EINVAL; in ieee80211_if_parse_active_links()
733 return ieee80211_set_active_links(&sdata->vif, active_links) ?: buflen; in ieee80211_if_parse_active_links()
737 IEEE80211_IF_LINK_FILE(addr, conf->addr, MAC);
804 debugfs_create_file(#name, mode, sdata->vif.debugfs_dir, \
808 debugfs_create_x##_bits(#_name, _mode, sdata->vif.debugfs_dir, \
809 &sdata->vif._name)
832 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && in add_common_files()
833 sdata->vif.type != NL80211_IFTYPE_NAN) in add_common_files()
865 debugfs_create_file("num_mcast_sta", 0400, sdata->vif.debugfs_dir, in add_vlan_files()
885 sdata->vif.debugfs_dir); in add_mesh_stats()
900 sdata->vif.debugfs_dir); in add_mesh_config()
940 if (!sdata->vif.debugfs_dir) in add_files()
946 if (sdata->vif.type != NL80211_IFTYPE_MONITOR) in add_files()
949 switch (sdata->vif.type) { in add_files()
979 link, &link_##name##_ops)
983 static void add_link_files(struct ieee80211_link_data *link, in add_link_files() argument
990 switch (link->sdata->vif.type) { in add_link_files()
1004 sprintf(buf, "netdev:%s", sdata->name); in ieee80211_debugfs_add_netdev()
1005 sdata->vif.debugfs_dir = debugfs_create_dir(buf, in ieee80211_debugfs_add_netdev()
1006 sdata->local->hw.wiphy->debugfsdir); in ieee80211_debugfs_add_netdev()
1008 sdata->deflink.debugfs_dir = sdata->vif.debugfs_dir; in ieee80211_debugfs_add_netdev()
1009 sdata->debugfs.subdir_stations = debugfs_create_dir("stations", in ieee80211_debugfs_add_netdev()
1010 sdata->vif.debugfs_dir); in ieee80211_debugfs_add_netdev()
1013 add_link_files(&sdata->deflink, sdata->vif.debugfs_dir); in ieee80211_debugfs_add_netdev()
1018 if (!sdata->vif.debugfs_dir) in ieee80211_debugfs_remove_netdev()
1021 debugfs_remove_recursive(sdata->vif.debugfs_dir); in ieee80211_debugfs_remove_netdev()
1022 sdata->vif.debugfs_dir = NULL; in ieee80211_debugfs_remove_netdev()
1023 sdata->debugfs.subdir_stations = NULL; in ieee80211_debugfs_remove_netdev()
1028 debugfs_change_name(sdata->vif.debugfs_dir, "netdev:%s", sdata->name); in ieee80211_debugfs_rename_netdev()
1037 if (sdata->flags & IEEE80211_SDATA_IN_DRIVER) { in ieee80211_debugfs_recreate_netdev()
1038 drv_vif_add_debugfs(sdata->local, sdata); in ieee80211_debugfs_recreate_netdev()
1040 ieee80211_link_debugfs_drv_add(&sdata->deflink); in ieee80211_debugfs_recreate_netdev()
1044 void ieee80211_link_debugfs_add(struct ieee80211_link_data *link) in ieee80211_link_debugfs_add() argument
1048 if (WARN_ON(!link->sdata->vif.debugfs_dir || link->debugfs_dir)) in ieee80211_link_debugfs_add()
1051 /* For now, this should not be called for non-MLO capable drivers */ in ieee80211_link_debugfs_add()
1052 if (WARN_ON(!(link->sdata->local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO))) in ieee80211_link_debugfs_add()
1056 "link-%d", link->link_id); in ieee80211_link_debugfs_add()
1058 link->debugfs_dir = in ieee80211_link_debugfs_add()
1060 link->sdata->vif.debugfs_dir); in ieee80211_link_debugfs_add()
1062 DEBUGFS_ADD(link->debugfs_dir, addr); in ieee80211_link_debugfs_add()
1063 add_link_files(link, link->debugfs_dir); in ieee80211_link_debugfs_add()
1066 void ieee80211_link_debugfs_remove(struct ieee80211_link_data *link) in ieee80211_link_debugfs_remove() argument
1068 if (!link->sdata->vif.debugfs_dir || !link->debugfs_dir) { in ieee80211_link_debugfs_remove()
1069 link->debugfs_dir = NULL; in ieee80211_link_debugfs_remove()
1073 if (link->debugfs_dir == link->sdata->vif.debugfs_dir) { in ieee80211_link_debugfs_remove()
1074 WARN_ON(link != &link->sdata->deflink); in ieee80211_link_debugfs_remove()
1075 link->debugfs_dir = NULL; in ieee80211_link_debugfs_remove()
1079 debugfs_remove_recursive(link->debugfs_dir); in ieee80211_link_debugfs_remove()
1080 link->debugfs_dir = NULL; in ieee80211_link_debugfs_remove()
1083 void ieee80211_link_debugfs_drv_add(struct ieee80211_link_data *link) in ieee80211_link_debugfs_drv_add() argument
1085 if (link->sdata->vif.type == NL80211_IFTYPE_MONITOR || in ieee80211_link_debugfs_drv_add()
1086 WARN_ON(!link->debugfs_dir)) in ieee80211_link_debugfs_drv_add()
1089 drv_link_add_debugfs(link->sdata->local, link->sdata, in ieee80211_link_debugfs_drv_add()
1090 link->conf, link->debugfs_dir); in ieee80211_link_debugfs_drv_add()
1093 void ieee80211_link_debugfs_drv_remove(struct ieee80211_link_data *link) in ieee80211_link_debugfs_drv_remove() argument
1095 if (!link || !link->debugfs_dir) in ieee80211_link_debugfs_drv_remove()
1098 if (WARN_ON(link->debugfs_dir == link->sdata->vif.debugfs_dir)) in ieee80211_link_debugfs_drv_remove()
1102 debugfs_remove_recursive(link->debugfs_dir); in ieee80211_link_debugfs_drv_remove()
1103 link->debugfs_dir = NULL; in ieee80211_link_debugfs_drv_remove()
1105 ieee80211_link_debugfs_add(link); in ieee80211_link_debugfs_drv_remove()