debug.c 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530
  1. /*
  2. * Copyright (c) 2005-2011 Atheros Communications Inc.
  3. * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any
  6. * purpose with or without fee is hereby granted, provided that the above
  7. * copyright notice and this permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  10. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  11. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  12. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  13. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  15. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16. */
  17. #include <linux/module.h>
  18. #include <linux/debugfs.h>
  19. #include <linux/vmalloc.h>
  20. #include <linux/utsname.h>
  21. #include <linux/crc32.h>
  22. #include <linux/firmware.h>
  23. #include "core.h"
  24. #include "debug.h"
  25. #include "hif.h"
  26. #include "wmi-ops.h"
  27. /* ms */
  28. #define ATH10K_DEBUG_HTT_STATS_INTERVAL 1000
  29. #define ATH10K_DEBUG_CAL_DATA_LEN 12064
  30. #define ATH10K_FW_CRASH_DUMP_VERSION 1
  31. /**
  32. * enum ath10k_fw_crash_dump_type - types of data in the dump file
  33. * @ATH10K_FW_CRASH_DUMP_REGDUMP: Register crash dump in binary format
  34. */
  35. enum ath10k_fw_crash_dump_type {
  36. ATH10K_FW_CRASH_DUMP_REGISTERS = 0,
  37. ATH10K_FW_CRASH_DUMP_MAX,
  38. };
  39. struct ath10k_tlv_dump_data {
  40. /* see ath10k_fw_crash_dump_type above */
  41. __le32 type;
  42. /* in bytes */
  43. __le32 tlv_len;
  44. /* pad to 32-bit boundaries as needed */
  45. u8 tlv_data[];
  46. } __packed;
  47. struct ath10k_dump_file_data {
  48. /* dump file information */
  49. /* "ATH10K-FW-DUMP" */
  50. char df_magic[16];
  51. __le32 len;
  52. /* file dump version */
  53. __le32 version;
  54. /* some info we can get from ath10k struct that might help */
  55. u8 uuid[16];
  56. __le32 chip_id;
  57. /* 0 for now, in place for later hardware */
  58. __le32 bus_type;
  59. __le32 target_version;
  60. __le32 fw_version_major;
  61. __le32 fw_version_minor;
  62. __le32 fw_version_release;
  63. __le32 fw_version_build;
  64. __le32 phy_capability;
  65. __le32 hw_min_tx_power;
  66. __le32 hw_max_tx_power;
  67. __le32 ht_cap_info;
  68. __le32 vht_cap_info;
  69. __le32 num_rf_chains;
  70. /* firmware version string */
  71. char fw_ver[ETHTOOL_FWVERS_LEN];
  72. /* Kernel related information */
  73. /* time-of-day stamp */
  74. __le64 tv_sec;
  75. /* time-of-day stamp, nano-seconds */
  76. __le64 tv_nsec;
  77. /* LINUX_VERSION_CODE */
  78. __le32 kernel_ver_code;
  79. /* VERMAGIC_STRING */
  80. char kernel_ver[64];
  81. /* room for growth w/out changing binary format */
  82. u8 unused[128];
  83. /* struct ath10k_tlv_dump_data + more */
  84. u8 data[0];
  85. } __packed;
  86. void ath10k_info(struct ath10k *ar, const char *fmt, ...)
  87. {
  88. struct va_format vaf = {
  89. .fmt = fmt,
  90. };
  91. va_list args;
  92. va_start(args, fmt);
  93. vaf.va = &args;
  94. dev_info(ar->dev, "%pV", &vaf);
  95. trace_ath10k_log_info(ar, &vaf);
  96. va_end(args);
  97. }
  98. EXPORT_SYMBOL(ath10k_info);
  99. void ath10k_debug_print_hwfw_info(struct ath10k *ar)
  100. {
  101. const struct firmware *firmware;
  102. char fw_features[128] = {};
  103. u32 crc = 0;
  104. ath10k_core_get_fw_features_str(ar, fw_features, sizeof(fw_features));
  105. ath10k_info(ar, "%s target 0x%08x chip_id 0x%08x sub %04x:%04x",
  106. ar->hw_params.name,
  107. ar->target_version,
  108. ar->chip_id,
  109. ar->id.subsystem_vendor, ar->id.subsystem_device);
  110. ath10k_info(ar, "kconfig debug %d debugfs %d tracing %d dfs %d testmode %d\n",
  111. IS_ENABLED(CONFIG_ATH10K_DEBUG),
  112. IS_ENABLED(CONFIG_ATH10K_DEBUGFS),
  113. IS_ENABLED(CONFIG_ATH10K_TRACING),
  114. IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED),
  115. IS_ENABLED(CONFIG_NL80211_TESTMODE));
  116. firmware = ar->normal_mode_fw.fw_file.firmware;
  117. if (firmware)
  118. crc = crc32_le(0, firmware->data, firmware->size);
  119. ath10k_info(ar, "firmware ver %s api %d features %s crc32 %08x\n",
  120. ar->hw->wiphy->fw_version,
  121. ar->fw_api,
  122. fw_features,
  123. crc);
  124. }
  125. void ath10k_debug_print_board_info(struct ath10k *ar)
  126. {
  127. char boardinfo[100];
  128. if (ar->id.bmi_ids_valid)
  129. scnprintf(boardinfo, sizeof(boardinfo), "%d:%d",
  130. ar->id.bmi_chip_id, ar->id.bmi_board_id);
  131. else
  132. scnprintf(boardinfo, sizeof(boardinfo), "N/A");
  133. ath10k_info(ar, "board_file api %d bmi_id %s crc32 %08x",
  134. ar->bd_api,
  135. boardinfo,
  136. crc32_le(0, ar->normal_mode_fw.board->data,
  137. ar->normal_mode_fw.board->size));
  138. }
  139. void ath10k_debug_print_boot_info(struct ath10k *ar)
  140. {
  141. ath10k_info(ar, "htt-ver %d.%d wmi-op %d htt-op %d cal %s max-sta %d raw %d hwcrypto %d\n",
  142. ar->htt.target_version_major,
  143. ar->htt.target_version_minor,
  144. ar->normal_mode_fw.fw_file.wmi_op_version,
  145. ar->normal_mode_fw.fw_file.htt_op_version,
  146. ath10k_cal_mode_str(ar->cal_mode),
  147. ar->max_num_stations,
  148. test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags),
  149. !test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags));
  150. }
  151. void ath10k_print_driver_info(struct ath10k *ar)
  152. {
  153. ath10k_debug_print_hwfw_info(ar);
  154. ath10k_debug_print_board_info(ar);
  155. ath10k_debug_print_boot_info(ar);
  156. }
  157. EXPORT_SYMBOL(ath10k_print_driver_info);
  158. void ath10k_err(struct ath10k *ar, const char *fmt, ...)
  159. {
  160. struct va_format vaf = {
  161. .fmt = fmt,
  162. };
  163. va_list args;
  164. va_start(args, fmt);
  165. vaf.va = &args;
  166. dev_err(ar->dev, "%pV", &vaf);
  167. trace_ath10k_log_err(ar, &vaf);
  168. va_end(args);
  169. }
  170. EXPORT_SYMBOL(ath10k_err);
  171. void ath10k_warn(struct ath10k *ar, const char *fmt, ...)
  172. {
  173. struct va_format vaf = {
  174. .fmt = fmt,
  175. };
  176. va_list args;
  177. va_start(args, fmt);
  178. vaf.va = &args;
  179. dev_warn_ratelimited(ar->dev, "%pV", &vaf);
  180. trace_ath10k_log_warn(ar, &vaf);
  181. va_end(args);
  182. }
  183. EXPORT_SYMBOL(ath10k_warn);
  184. #ifdef CONFIG_ATH10K_DEBUGFS
  185. static ssize_t ath10k_read_wmi_services(struct file *file,
  186. char __user *user_buf,
  187. size_t count, loff_t *ppos)
  188. {
  189. struct ath10k *ar = file->private_data;
  190. char *buf;
  191. unsigned int len = 0, buf_len = 4096;
  192. const char *name;
  193. ssize_t ret_cnt;
  194. bool enabled;
  195. int i;
  196. buf = kzalloc(buf_len, GFP_KERNEL);
  197. if (!buf)
  198. return -ENOMEM;
  199. mutex_lock(&ar->conf_mutex);
  200. if (len > buf_len)
  201. len = buf_len;
  202. spin_lock_bh(&ar->data_lock);
  203. for (i = 0; i < WMI_SERVICE_MAX; i++) {
  204. enabled = test_bit(i, ar->wmi.svc_map);
  205. name = wmi_service_name(i);
  206. if (!name) {
  207. if (enabled)
  208. len += scnprintf(buf + len, buf_len - len,
  209. "%-40s %s (bit %d)\n",
  210. "unknown", "enabled", i);
  211. continue;
  212. }
  213. len += scnprintf(buf + len, buf_len - len,
  214. "%-40s %s\n",
  215. name, enabled ? "enabled" : "-");
  216. }
  217. spin_unlock_bh(&ar->data_lock);
  218. ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len);
  219. mutex_unlock(&ar->conf_mutex);
  220. kfree(buf);
  221. return ret_cnt;
  222. }
  223. static const struct file_operations fops_wmi_services = {
  224. .read = ath10k_read_wmi_services,
  225. .open = simple_open,
  226. .owner = THIS_MODULE,
  227. .llseek = default_llseek,
  228. };
  229. static void ath10k_fw_stats_pdevs_free(struct list_head *head)
  230. {
  231. struct ath10k_fw_stats_pdev *i, *tmp;
  232. list_for_each_entry_safe(i, tmp, head, list) {
  233. list_del(&i->list);
  234. kfree(i);
  235. }
  236. }
  237. static void ath10k_fw_stats_vdevs_free(struct list_head *head)
  238. {
  239. struct ath10k_fw_stats_vdev *i, *tmp;
  240. list_for_each_entry_safe(i, tmp, head, list) {
  241. list_del(&i->list);
  242. kfree(i);
  243. }
  244. }
  245. static void ath10k_fw_stats_peers_free(struct list_head *head)
  246. {
  247. struct ath10k_fw_stats_peer *i, *tmp;
  248. list_for_each_entry_safe(i, tmp, head, list) {
  249. list_del(&i->list);
  250. kfree(i);
  251. }
  252. }
  253. static void ath10k_fw_extd_stats_peers_free(struct list_head *head)
  254. {
  255. struct ath10k_fw_extd_stats_peer *i, *tmp;
  256. list_for_each_entry_safe(i, tmp, head, list) {
  257. list_del(&i->list);
  258. kfree(i);
  259. }
  260. }
  261. static void ath10k_debug_fw_stats_reset(struct ath10k *ar)
  262. {
  263. spin_lock_bh(&ar->data_lock);
  264. ar->debug.fw_stats_done = false;
  265. ar->debug.fw_stats.extended = false;
  266. ath10k_fw_stats_pdevs_free(&ar->debug.fw_stats.pdevs);
  267. ath10k_fw_stats_vdevs_free(&ar->debug.fw_stats.vdevs);
  268. ath10k_fw_stats_peers_free(&ar->debug.fw_stats.peers);
  269. ath10k_fw_extd_stats_peers_free(&ar->debug.fw_stats.peers_extd);
  270. spin_unlock_bh(&ar->data_lock);
  271. }
  272. void ath10k_debug_fw_stats_process(struct ath10k *ar, struct sk_buff *skb)
  273. {
  274. struct ath10k_fw_stats stats = {};
  275. bool is_start, is_started, is_end;
  276. size_t num_peers;
  277. size_t num_vdevs;
  278. int ret;
  279. INIT_LIST_HEAD(&stats.pdevs);
  280. INIT_LIST_HEAD(&stats.vdevs);
  281. INIT_LIST_HEAD(&stats.peers);
  282. INIT_LIST_HEAD(&stats.peers_extd);
  283. spin_lock_bh(&ar->data_lock);
  284. ret = ath10k_wmi_pull_fw_stats(ar, skb, &stats);
  285. if (ret) {
  286. ath10k_warn(ar, "failed to pull fw stats: %d\n", ret);
  287. goto free;
  288. }
  289. /* Stat data may exceed htc-wmi buffer limit. In such case firmware
  290. * splits the stats data and delivers it in a ping-pong fashion of
  291. * request cmd-update event.
  292. *
  293. * However there is no explicit end-of-data. Instead start-of-data is
  294. * used as an implicit one. This works as follows:
  295. * a) discard stat update events until one with pdev stats is
  296. * delivered - this skips session started at end of (b)
  297. * b) consume stat update events until another one with pdev stats is
  298. * delivered which is treated as end-of-data and is itself discarded
  299. */
  300. if (ath10k_peer_stats_enabled(ar))
  301. ath10k_sta_update_rx_duration(ar, &stats);
  302. if (ar->debug.fw_stats_done) {
  303. if (!ath10k_peer_stats_enabled(ar))
  304. ath10k_warn(ar, "received unsolicited stats update event\n");
  305. goto free;
  306. }
  307. num_peers = ath10k_wmi_fw_stats_num_peers(&ar->debug.fw_stats.peers);
  308. num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&ar->debug.fw_stats.vdevs);
  309. is_start = (list_empty(&ar->debug.fw_stats.pdevs) &&
  310. !list_empty(&stats.pdevs));
  311. is_end = (!list_empty(&ar->debug.fw_stats.pdevs) &&
  312. !list_empty(&stats.pdevs));
  313. if (is_start)
  314. list_splice_tail_init(&stats.pdevs, &ar->debug.fw_stats.pdevs);
  315. if (is_end)
  316. ar->debug.fw_stats_done = true;
  317. is_started = !list_empty(&ar->debug.fw_stats.pdevs);
  318. if (is_started && !is_end) {
  319. if (num_peers >= ATH10K_MAX_NUM_PEER_IDS) {
  320. /* Although this is unlikely impose a sane limit to
  321. * prevent firmware from DoS-ing the host.
  322. */
  323. ath10k_fw_stats_peers_free(&ar->debug.fw_stats.peers);
  324. ath10k_warn(ar, "dropping fw peer stats\n");
  325. goto free;
  326. }
  327. if (num_vdevs >= BITS_PER_LONG) {
  328. ath10k_fw_stats_vdevs_free(&ar->debug.fw_stats.vdevs);
  329. ath10k_warn(ar, "dropping fw vdev stats\n");
  330. goto free;
  331. }
  332. list_splice_tail_init(&stats.peers, &ar->debug.fw_stats.peers);
  333. list_splice_tail_init(&stats.vdevs, &ar->debug.fw_stats.vdevs);
  334. list_splice_tail_init(&stats.peers_extd,
  335. &ar->debug.fw_stats.peers_extd);
  336. }
  337. complete(&ar->debug.fw_stats_complete);
  338. free:
  339. /* In some cases lists have been spliced and cleared. Free up
  340. * resources if that is not the case.
  341. */
  342. ath10k_fw_stats_pdevs_free(&stats.pdevs);
  343. ath10k_fw_stats_vdevs_free(&stats.vdevs);
  344. ath10k_fw_stats_peers_free(&stats.peers);
  345. ath10k_fw_extd_stats_peers_free(&stats.peers_extd);
  346. spin_unlock_bh(&ar->data_lock);
  347. }
  348. static int ath10k_debug_fw_stats_request(struct ath10k *ar)
  349. {
  350. unsigned long timeout, time_left;
  351. int ret;
  352. lockdep_assert_held(&ar->conf_mutex);
  353. timeout = jiffies + msecs_to_jiffies(1 * HZ);
  354. ath10k_debug_fw_stats_reset(ar);
  355. for (;;) {
  356. if (time_after(jiffies, timeout))
  357. return -ETIMEDOUT;
  358. reinit_completion(&ar->debug.fw_stats_complete);
  359. ret = ath10k_wmi_request_stats(ar, ar->fw_stats_req_mask);
  360. if (ret) {
  361. ath10k_warn(ar, "could not request stats (%d)\n", ret);
  362. return ret;
  363. }
  364. time_left =
  365. wait_for_completion_timeout(&ar->debug.fw_stats_complete,
  366. 1 * HZ);
  367. if (!time_left)
  368. return -ETIMEDOUT;
  369. spin_lock_bh(&ar->data_lock);
  370. if (ar->debug.fw_stats_done) {
  371. spin_unlock_bh(&ar->data_lock);
  372. break;
  373. }
  374. spin_unlock_bh(&ar->data_lock);
  375. }
  376. return 0;
  377. }
  378. static int ath10k_fw_stats_open(struct inode *inode, struct file *file)
  379. {
  380. struct ath10k *ar = inode->i_private;
  381. void *buf = NULL;
  382. int ret;
  383. mutex_lock(&ar->conf_mutex);
  384. if (ar->state != ATH10K_STATE_ON) {
  385. ret = -ENETDOWN;
  386. goto err_unlock;
  387. }
  388. buf = vmalloc(ATH10K_FW_STATS_BUF_SIZE);
  389. if (!buf) {
  390. ret = -ENOMEM;
  391. goto err_unlock;
  392. }
  393. ret = ath10k_debug_fw_stats_request(ar);
  394. if (ret) {
  395. ath10k_warn(ar, "failed to request fw stats: %d\n", ret);
  396. goto err_free;
  397. }
  398. ret = ath10k_wmi_fw_stats_fill(ar, &ar->debug.fw_stats, buf);
  399. if (ret) {
  400. ath10k_warn(ar, "failed to fill fw stats: %d\n", ret);
  401. goto err_free;
  402. }
  403. file->private_data = buf;
  404. mutex_unlock(&ar->conf_mutex);
  405. return 0;
  406. err_free:
  407. vfree(buf);
  408. err_unlock:
  409. mutex_unlock(&ar->conf_mutex);
  410. return ret;
  411. }
  412. static int ath10k_fw_stats_release(struct inode *inode, struct file *file)
  413. {
  414. vfree(file->private_data);
  415. return 0;
  416. }
  417. static ssize_t ath10k_fw_stats_read(struct file *file, char __user *user_buf,
  418. size_t count, loff_t *ppos)
  419. {
  420. const char *buf = file->private_data;
  421. unsigned int len = strlen(buf);
  422. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  423. }
  424. static const struct file_operations fops_fw_stats = {
  425. .open = ath10k_fw_stats_open,
  426. .release = ath10k_fw_stats_release,
  427. .read = ath10k_fw_stats_read,
  428. .owner = THIS_MODULE,
  429. .llseek = default_llseek,
  430. };
  431. static ssize_t ath10k_debug_fw_reset_stats_read(struct file *file,
  432. char __user *user_buf,
  433. size_t count, loff_t *ppos)
  434. {
  435. struct ath10k *ar = file->private_data;
  436. int ret, len, buf_len;
  437. char *buf;
  438. buf_len = 500;
  439. buf = kmalloc(buf_len, GFP_KERNEL);
  440. if (!buf)
  441. return -ENOMEM;
  442. spin_lock_bh(&ar->data_lock);
  443. len = 0;
  444. len += scnprintf(buf + len, buf_len - len,
  445. "fw_crash_counter\t\t%d\n", ar->stats.fw_crash_counter);
  446. len += scnprintf(buf + len, buf_len - len,
  447. "fw_warm_reset_counter\t\t%d\n",
  448. ar->stats.fw_warm_reset_counter);
  449. len += scnprintf(buf + len, buf_len - len,
  450. "fw_cold_reset_counter\t\t%d\n",
  451. ar->stats.fw_cold_reset_counter);
  452. spin_unlock_bh(&ar->data_lock);
  453. ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
  454. kfree(buf);
  455. return ret;
  456. }
  457. static const struct file_operations fops_fw_reset_stats = {
  458. .open = simple_open,
  459. .read = ath10k_debug_fw_reset_stats_read,
  460. .owner = THIS_MODULE,
  461. .llseek = default_llseek,
  462. };
  463. /* This is a clean assert crash in firmware. */
  464. static int ath10k_debug_fw_assert(struct ath10k *ar)
  465. {
  466. struct wmi_vdev_install_key_cmd *cmd;
  467. struct sk_buff *skb;
  468. skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + 16);
  469. if (!skb)
  470. return -ENOMEM;
  471. cmd = (struct wmi_vdev_install_key_cmd *)skb->data;
  472. memset(cmd, 0, sizeof(*cmd));
  473. /* big enough number so that firmware asserts */
  474. cmd->vdev_id = __cpu_to_le32(0x7ffe);
  475. return ath10k_wmi_cmd_send(ar, skb,
  476. ar->wmi.cmd->vdev_install_key_cmdid);
  477. }
  478. static ssize_t ath10k_read_simulate_fw_crash(struct file *file,
  479. char __user *user_buf,
  480. size_t count, loff_t *ppos)
  481. {
  482. const char buf[] =
  483. "To simulate firmware crash write one of the keywords to this file:\n"
  484. "`soft` - this will send WMI_FORCE_FW_HANG_ASSERT to firmware if FW supports that command.\n"
  485. "`hard` - this will send to firmware command with illegal parameters causing firmware crash.\n"
  486. "`assert` - this will send special illegal parameter to firmware to cause assert failure and crash.\n"
  487. "`hw-restart` - this will simply queue hw restart without fw/hw actually crashing.\n";
  488. return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
  489. }
  490. /* Simulate firmware crash:
  491. * 'soft': Call wmi command causing firmware hang. This firmware hang is
  492. * recoverable by warm firmware reset.
  493. * 'hard': Force firmware crash by setting any vdev parameter for not allowed
  494. * vdev id. This is hard firmware crash because it is recoverable only by cold
  495. * firmware reset.
  496. */
  497. static ssize_t ath10k_write_simulate_fw_crash(struct file *file,
  498. const char __user *user_buf,
  499. size_t count, loff_t *ppos)
  500. {
  501. struct ath10k *ar = file->private_data;
  502. char buf[32];
  503. int ret;
  504. simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
  505. /* make sure that buf is null terminated */
  506. buf[sizeof(buf) - 1] = 0;
  507. /* drop the possible '\n' from the end */
  508. if (buf[count - 1] == '\n')
  509. buf[count - 1] = 0;
  510. mutex_lock(&ar->conf_mutex);
  511. if (ar->state != ATH10K_STATE_ON &&
  512. ar->state != ATH10K_STATE_RESTARTED) {
  513. ret = -ENETDOWN;
  514. goto exit;
  515. }
  516. if (!strcmp(buf, "soft")) {
  517. ath10k_info(ar, "simulating soft firmware crash\n");
  518. ret = ath10k_wmi_force_fw_hang(ar, WMI_FORCE_FW_HANG_ASSERT, 0);
  519. } else if (!strcmp(buf, "hard")) {
  520. ath10k_info(ar, "simulating hard firmware crash\n");
  521. /* 0x7fff is vdev id, and it is always out of range for all
  522. * firmware variants in order to force a firmware crash.
  523. */
  524. ret = ath10k_wmi_vdev_set_param(ar, 0x7fff,
  525. ar->wmi.vdev_param->rts_threshold,
  526. 0);
  527. } else if (!strcmp(buf, "assert")) {
  528. ath10k_info(ar, "simulating firmware assert crash\n");
  529. ret = ath10k_debug_fw_assert(ar);
  530. } else if (!strcmp(buf, "hw-restart")) {
  531. ath10k_info(ar, "user requested hw restart\n");
  532. queue_work(ar->workqueue, &ar->restart_work);
  533. ret = 0;
  534. } else {
  535. ret = -EINVAL;
  536. goto exit;
  537. }
  538. if (ret) {
  539. ath10k_warn(ar, "failed to simulate firmware crash: %d\n", ret);
  540. goto exit;
  541. }
  542. ret = count;
  543. exit:
  544. mutex_unlock(&ar->conf_mutex);
  545. return ret;
  546. }
  547. static const struct file_operations fops_simulate_fw_crash = {
  548. .read = ath10k_read_simulate_fw_crash,
  549. .write = ath10k_write_simulate_fw_crash,
  550. .open = simple_open,
  551. .owner = THIS_MODULE,
  552. .llseek = default_llseek,
  553. };
  554. static ssize_t ath10k_read_chip_id(struct file *file, char __user *user_buf,
  555. size_t count, loff_t *ppos)
  556. {
  557. struct ath10k *ar = file->private_data;
  558. unsigned int len;
  559. char buf[50];
  560. len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->chip_id);
  561. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  562. }
  563. static const struct file_operations fops_chip_id = {
  564. .read = ath10k_read_chip_id,
  565. .open = simple_open,
  566. .owner = THIS_MODULE,
  567. .llseek = default_llseek,
  568. };
  569. struct ath10k_fw_crash_data *
  570. ath10k_debug_get_new_fw_crash_data(struct ath10k *ar)
  571. {
  572. struct ath10k_fw_crash_data *crash_data = ar->debug.fw_crash_data;
  573. lockdep_assert_held(&ar->data_lock);
  574. crash_data->crashed_since_read = true;
  575. uuid_le_gen(&crash_data->uuid);
  576. getnstimeofday(&crash_data->timestamp);
  577. return crash_data;
  578. }
  579. EXPORT_SYMBOL(ath10k_debug_get_new_fw_crash_data);
  580. static struct ath10k_dump_file_data *ath10k_build_dump_file(struct ath10k *ar)
  581. {
  582. struct ath10k_fw_crash_data *crash_data = ar->debug.fw_crash_data;
  583. struct ath10k_dump_file_data *dump_data;
  584. struct ath10k_tlv_dump_data *dump_tlv;
  585. int hdr_len = sizeof(*dump_data);
  586. unsigned int len, sofar = 0;
  587. unsigned char *buf;
  588. len = hdr_len;
  589. len += sizeof(*dump_tlv) + sizeof(crash_data->registers);
  590. sofar += hdr_len;
  591. /* This is going to get big when we start dumping FW RAM and such,
  592. * so go ahead and use vmalloc.
  593. */
  594. buf = vzalloc(len);
  595. if (!buf)
  596. return NULL;
  597. spin_lock_bh(&ar->data_lock);
  598. if (!crash_data->crashed_since_read) {
  599. spin_unlock_bh(&ar->data_lock);
  600. vfree(buf);
  601. return NULL;
  602. }
  603. dump_data = (struct ath10k_dump_file_data *)(buf);
  604. strlcpy(dump_data->df_magic, "ATH10K-FW-DUMP",
  605. sizeof(dump_data->df_magic));
  606. dump_data->len = cpu_to_le32(len);
  607. dump_data->version = cpu_to_le32(ATH10K_FW_CRASH_DUMP_VERSION);
  608. memcpy(dump_data->uuid, &crash_data->uuid, sizeof(dump_data->uuid));
  609. dump_data->chip_id = cpu_to_le32(ar->chip_id);
  610. dump_data->bus_type = cpu_to_le32(0);
  611. dump_data->target_version = cpu_to_le32(ar->target_version);
  612. dump_data->fw_version_major = cpu_to_le32(ar->fw_version_major);
  613. dump_data->fw_version_minor = cpu_to_le32(ar->fw_version_minor);
  614. dump_data->fw_version_release = cpu_to_le32(ar->fw_version_release);
  615. dump_data->fw_version_build = cpu_to_le32(ar->fw_version_build);
  616. dump_data->phy_capability = cpu_to_le32(ar->phy_capability);
  617. dump_data->hw_min_tx_power = cpu_to_le32(ar->hw_min_tx_power);
  618. dump_data->hw_max_tx_power = cpu_to_le32(ar->hw_max_tx_power);
  619. dump_data->ht_cap_info = cpu_to_le32(ar->ht_cap_info);
  620. dump_data->vht_cap_info = cpu_to_le32(ar->vht_cap_info);
  621. dump_data->num_rf_chains = cpu_to_le32(ar->num_rf_chains);
  622. strlcpy(dump_data->fw_ver, ar->hw->wiphy->fw_version,
  623. sizeof(dump_data->fw_ver));
  624. dump_data->kernel_ver_code = 0;
  625. strlcpy(dump_data->kernel_ver, init_utsname()->release,
  626. sizeof(dump_data->kernel_ver));
  627. dump_data->tv_sec = cpu_to_le64(crash_data->timestamp.tv_sec);
  628. dump_data->tv_nsec = cpu_to_le64(crash_data->timestamp.tv_nsec);
  629. /* Gather crash-dump */
  630. dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar);
  631. dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_REGISTERS);
  632. dump_tlv->tlv_len = cpu_to_le32(sizeof(crash_data->registers));
  633. memcpy(dump_tlv->tlv_data, &crash_data->registers,
  634. sizeof(crash_data->registers));
  635. sofar += sizeof(*dump_tlv) + sizeof(crash_data->registers);
  636. ar->debug.fw_crash_data->crashed_since_read = false;
  637. spin_unlock_bh(&ar->data_lock);
  638. return dump_data;
  639. }
  640. static int ath10k_fw_crash_dump_open(struct inode *inode, struct file *file)
  641. {
  642. struct ath10k *ar = inode->i_private;
  643. struct ath10k_dump_file_data *dump;
  644. dump = ath10k_build_dump_file(ar);
  645. if (!dump)
  646. return -ENODATA;
  647. file->private_data = dump;
  648. return 0;
  649. }
  650. static ssize_t ath10k_fw_crash_dump_read(struct file *file,
  651. char __user *user_buf,
  652. size_t count, loff_t *ppos)
  653. {
  654. struct ath10k_dump_file_data *dump_file = file->private_data;
  655. return simple_read_from_buffer(user_buf, count, ppos,
  656. dump_file,
  657. le32_to_cpu(dump_file->len));
  658. }
  659. static int ath10k_fw_crash_dump_release(struct inode *inode,
  660. struct file *file)
  661. {
  662. vfree(file->private_data);
  663. return 0;
  664. }
  665. static const struct file_operations fops_fw_crash_dump = {
  666. .open = ath10k_fw_crash_dump_open,
  667. .read = ath10k_fw_crash_dump_read,
  668. .release = ath10k_fw_crash_dump_release,
  669. .owner = THIS_MODULE,
  670. .llseek = default_llseek,
  671. };
  672. static ssize_t ath10k_reg_addr_read(struct file *file,
  673. char __user *user_buf,
  674. size_t count, loff_t *ppos)
  675. {
  676. struct ath10k *ar = file->private_data;
  677. u8 buf[32];
  678. unsigned int len = 0;
  679. u32 reg_addr;
  680. mutex_lock(&ar->conf_mutex);
  681. reg_addr = ar->debug.reg_addr;
  682. mutex_unlock(&ar->conf_mutex);
  683. len += scnprintf(buf + len, sizeof(buf) - len, "0x%x\n", reg_addr);
  684. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  685. }
  686. static ssize_t ath10k_reg_addr_write(struct file *file,
  687. const char __user *user_buf,
  688. size_t count, loff_t *ppos)
  689. {
  690. struct ath10k *ar = file->private_data;
  691. u32 reg_addr;
  692. int ret;
  693. ret = kstrtou32_from_user(user_buf, count, 0, &reg_addr);
  694. if (ret)
  695. return ret;
  696. if (!IS_ALIGNED(reg_addr, 4))
  697. return -EFAULT;
  698. mutex_lock(&ar->conf_mutex);
  699. ar->debug.reg_addr = reg_addr;
  700. mutex_unlock(&ar->conf_mutex);
  701. return count;
  702. }
  703. static const struct file_operations fops_reg_addr = {
  704. .read = ath10k_reg_addr_read,
  705. .write = ath10k_reg_addr_write,
  706. .open = simple_open,
  707. .owner = THIS_MODULE,
  708. .llseek = default_llseek,
  709. };
  710. static ssize_t ath10k_reg_value_read(struct file *file,
  711. char __user *user_buf,
  712. size_t count, loff_t *ppos)
  713. {
  714. struct ath10k *ar = file->private_data;
  715. u8 buf[48];
  716. unsigned int len;
  717. u32 reg_addr, reg_val;
  718. int ret;
  719. mutex_lock(&ar->conf_mutex);
  720. if (ar->state != ATH10K_STATE_ON &&
  721. ar->state != ATH10K_STATE_UTF) {
  722. ret = -ENETDOWN;
  723. goto exit;
  724. }
  725. reg_addr = ar->debug.reg_addr;
  726. reg_val = ath10k_hif_read32(ar, reg_addr);
  727. len = scnprintf(buf, sizeof(buf), "0x%08x:0x%08x\n", reg_addr, reg_val);
  728. ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
  729. exit:
  730. mutex_unlock(&ar->conf_mutex);
  731. return ret;
  732. }
  733. static ssize_t ath10k_reg_value_write(struct file *file,
  734. const char __user *user_buf,
  735. size_t count, loff_t *ppos)
  736. {
  737. struct ath10k *ar = file->private_data;
  738. u32 reg_addr, reg_val;
  739. int ret;
  740. mutex_lock(&ar->conf_mutex);
  741. if (ar->state != ATH10K_STATE_ON &&
  742. ar->state != ATH10K_STATE_UTF) {
  743. ret = -ENETDOWN;
  744. goto exit;
  745. }
  746. reg_addr = ar->debug.reg_addr;
  747. ret = kstrtou32_from_user(user_buf, count, 0, &reg_val);
  748. if (ret)
  749. goto exit;
  750. ath10k_hif_write32(ar, reg_addr, reg_val);
  751. ret = count;
  752. exit:
  753. mutex_unlock(&ar->conf_mutex);
  754. return ret;
  755. }
  756. static const struct file_operations fops_reg_value = {
  757. .read = ath10k_reg_value_read,
  758. .write = ath10k_reg_value_write,
  759. .open = simple_open,
  760. .owner = THIS_MODULE,
  761. .llseek = default_llseek,
  762. };
  763. static ssize_t ath10k_mem_value_read(struct file *file,
  764. char __user *user_buf,
  765. size_t count, loff_t *ppos)
  766. {
  767. struct ath10k *ar = file->private_data;
  768. u8 *buf;
  769. int ret;
  770. if (*ppos < 0)
  771. return -EINVAL;
  772. if (!count)
  773. return 0;
  774. mutex_lock(&ar->conf_mutex);
  775. buf = vmalloc(count);
  776. if (!buf) {
  777. ret = -ENOMEM;
  778. goto exit;
  779. }
  780. if (ar->state != ATH10K_STATE_ON &&
  781. ar->state != ATH10K_STATE_UTF) {
  782. ret = -ENETDOWN;
  783. goto exit;
  784. }
  785. ret = ath10k_hif_diag_read(ar, *ppos, buf, count);
  786. if (ret) {
  787. ath10k_warn(ar, "failed to read address 0x%08x via diagnose window fnrom debugfs: %d\n",
  788. (u32)(*ppos), ret);
  789. goto exit;
  790. }
  791. ret = copy_to_user(user_buf, buf, count);
  792. if (ret) {
  793. ret = -EFAULT;
  794. goto exit;
  795. }
  796. count -= ret;
  797. *ppos += count;
  798. ret = count;
  799. exit:
  800. vfree(buf);
  801. mutex_unlock(&ar->conf_mutex);
  802. return ret;
  803. }
  804. static ssize_t ath10k_mem_value_write(struct file *file,
  805. const char __user *user_buf,
  806. size_t count, loff_t *ppos)
  807. {
  808. struct ath10k *ar = file->private_data;
  809. u8 *buf;
  810. int ret;
  811. if (*ppos < 0)
  812. return -EINVAL;
  813. if (!count)
  814. return 0;
  815. mutex_lock(&ar->conf_mutex);
  816. buf = vmalloc(count);
  817. if (!buf) {
  818. ret = -ENOMEM;
  819. goto exit;
  820. }
  821. if (ar->state != ATH10K_STATE_ON &&
  822. ar->state != ATH10K_STATE_UTF) {
  823. ret = -ENETDOWN;
  824. goto exit;
  825. }
  826. ret = copy_from_user(buf, user_buf, count);
  827. if (ret) {
  828. ret = -EFAULT;
  829. goto exit;
  830. }
  831. ret = ath10k_hif_diag_write(ar, *ppos, buf, count);
  832. if (ret) {
  833. ath10k_warn(ar, "failed to write address 0x%08x via diagnose window from debugfs: %d\n",
  834. (u32)(*ppos), ret);
  835. goto exit;
  836. }
  837. *ppos += count;
  838. ret = count;
  839. exit:
  840. vfree(buf);
  841. mutex_unlock(&ar->conf_mutex);
  842. return ret;
  843. }
  844. static const struct file_operations fops_mem_value = {
  845. .read = ath10k_mem_value_read,
  846. .write = ath10k_mem_value_write,
  847. .open = simple_open,
  848. .owner = THIS_MODULE,
  849. .llseek = default_llseek,
  850. };
  851. static int ath10k_debug_htt_stats_req(struct ath10k *ar)
  852. {
  853. u64 cookie;
  854. int ret;
  855. lockdep_assert_held(&ar->conf_mutex);
  856. if (ar->debug.htt_stats_mask == 0)
  857. /* htt stats are disabled */
  858. return 0;
  859. if (ar->state != ATH10K_STATE_ON)
  860. return 0;
  861. cookie = get_jiffies_64();
  862. ret = ath10k_htt_h2t_stats_req(&ar->htt, ar->debug.htt_stats_mask,
  863. cookie);
  864. if (ret) {
  865. ath10k_warn(ar, "failed to send htt stats request: %d\n", ret);
  866. return ret;
  867. }
  868. queue_delayed_work(ar->workqueue, &ar->debug.htt_stats_dwork,
  869. msecs_to_jiffies(ATH10K_DEBUG_HTT_STATS_INTERVAL));
  870. return 0;
  871. }
  872. static void ath10k_debug_htt_stats_dwork(struct work_struct *work)
  873. {
  874. struct ath10k *ar = container_of(work, struct ath10k,
  875. debug.htt_stats_dwork.work);
  876. mutex_lock(&ar->conf_mutex);
  877. ath10k_debug_htt_stats_req(ar);
  878. mutex_unlock(&ar->conf_mutex);
  879. }
  880. static ssize_t ath10k_read_htt_stats_mask(struct file *file,
  881. char __user *user_buf,
  882. size_t count, loff_t *ppos)
  883. {
  884. struct ath10k *ar = file->private_data;
  885. char buf[32];
  886. unsigned int len;
  887. len = scnprintf(buf, sizeof(buf), "%lu\n", ar->debug.htt_stats_mask);
  888. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  889. }
  890. static ssize_t ath10k_write_htt_stats_mask(struct file *file,
  891. const char __user *user_buf,
  892. size_t count, loff_t *ppos)
  893. {
  894. struct ath10k *ar = file->private_data;
  895. unsigned long mask;
  896. int ret;
  897. ret = kstrtoul_from_user(user_buf, count, 0, &mask);
  898. if (ret)
  899. return ret;
  900. /* max 8 bit masks (for now) */
  901. if (mask > 0xff)
  902. return -E2BIG;
  903. mutex_lock(&ar->conf_mutex);
  904. ar->debug.htt_stats_mask = mask;
  905. ret = ath10k_debug_htt_stats_req(ar);
  906. if (ret)
  907. goto out;
  908. ret = count;
  909. out:
  910. mutex_unlock(&ar->conf_mutex);
  911. return ret;
  912. }
  913. static const struct file_operations fops_htt_stats_mask = {
  914. .read = ath10k_read_htt_stats_mask,
  915. .write = ath10k_write_htt_stats_mask,
  916. .open = simple_open,
  917. .owner = THIS_MODULE,
  918. .llseek = default_llseek,
  919. };
  920. static ssize_t ath10k_read_htt_max_amsdu_ampdu(struct file *file,
  921. char __user *user_buf,
  922. size_t count, loff_t *ppos)
  923. {
  924. struct ath10k *ar = file->private_data;
  925. char buf[64];
  926. u8 amsdu, ampdu;
  927. unsigned int len;
  928. mutex_lock(&ar->conf_mutex);
  929. amsdu = ar->htt.max_num_amsdu;
  930. ampdu = ar->htt.max_num_ampdu;
  931. mutex_unlock(&ar->conf_mutex);
  932. len = scnprintf(buf, sizeof(buf), "%u %u\n", amsdu, ampdu);
  933. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  934. }
  935. static ssize_t ath10k_write_htt_max_amsdu_ampdu(struct file *file,
  936. const char __user *user_buf,
  937. size_t count, loff_t *ppos)
  938. {
  939. struct ath10k *ar = file->private_data;
  940. int res;
  941. char buf[64];
  942. unsigned int amsdu, ampdu;
  943. simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
  944. /* make sure that buf is null terminated */
  945. buf[sizeof(buf) - 1] = 0;
  946. res = sscanf(buf, "%u %u", &amsdu, &ampdu);
  947. if (res != 2)
  948. return -EINVAL;
  949. mutex_lock(&ar->conf_mutex);
  950. res = ath10k_htt_h2t_aggr_cfg_msg(&ar->htt, ampdu, amsdu);
  951. if (res)
  952. goto out;
  953. res = count;
  954. ar->htt.max_num_amsdu = amsdu;
  955. ar->htt.max_num_ampdu = ampdu;
  956. out:
  957. mutex_unlock(&ar->conf_mutex);
  958. return res;
  959. }
  960. static const struct file_operations fops_htt_max_amsdu_ampdu = {
  961. .read = ath10k_read_htt_max_amsdu_ampdu,
  962. .write = ath10k_write_htt_max_amsdu_ampdu,
  963. .open = simple_open,
  964. .owner = THIS_MODULE,
  965. .llseek = default_llseek,
  966. };
  967. static ssize_t ath10k_read_fw_dbglog(struct file *file,
  968. char __user *user_buf,
  969. size_t count, loff_t *ppos)
  970. {
  971. struct ath10k *ar = file->private_data;
  972. unsigned int len;
  973. char buf[96];
  974. len = scnprintf(buf, sizeof(buf), "0x%16llx %u\n",
  975. ar->debug.fw_dbglog_mask, ar->debug.fw_dbglog_level);
  976. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  977. }
  978. static ssize_t ath10k_write_fw_dbglog(struct file *file,
  979. const char __user *user_buf,
  980. size_t count, loff_t *ppos)
  981. {
  982. struct ath10k *ar = file->private_data;
  983. int ret;
  984. char buf[96];
  985. unsigned int log_level;
  986. u64 mask;
  987. simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
  988. /* make sure that buf is null terminated */
  989. buf[sizeof(buf) - 1] = 0;
  990. ret = sscanf(buf, "%llx %u", &mask, &log_level);
  991. if (!ret)
  992. return -EINVAL;
  993. if (ret == 1)
  994. /* default if user did not specify */
  995. log_level = ATH10K_DBGLOG_LEVEL_WARN;
  996. mutex_lock(&ar->conf_mutex);
  997. ar->debug.fw_dbglog_mask = mask;
  998. ar->debug.fw_dbglog_level = log_level;
  999. if (ar->state == ATH10K_STATE_ON) {
  1000. ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask,
  1001. ar->debug.fw_dbglog_level);
  1002. if (ret) {
  1003. ath10k_warn(ar, "dbglog cfg failed from debugfs: %d\n",
  1004. ret);
  1005. goto exit;
  1006. }
  1007. }
  1008. ret = count;
  1009. exit:
  1010. mutex_unlock(&ar->conf_mutex);
  1011. return ret;
  1012. }
  1013. /* TODO: Would be nice to always support ethtool stats, would need to
  1014. * move the stats storage out of ath10k_debug, or always have ath10k_debug
  1015. * struct available..
  1016. */
  1017. /* This generally cooresponds to the debugfs fw_stats file */
  1018. static const char ath10k_gstrings_stats[][ETH_GSTRING_LEN] = {
  1019. "tx_pkts_nic",
  1020. "tx_bytes_nic",
  1021. "rx_pkts_nic",
  1022. "rx_bytes_nic",
  1023. "d_noise_floor",
  1024. "d_cycle_count",
  1025. "d_phy_error",
  1026. "d_rts_bad",
  1027. "d_rts_good",
  1028. "d_tx_power", /* in .5 dbM I think */
  1029. "d_rx_crc_err", /* fcs_bad */
  1030. "d_no_beacon",
  1031. "d_tx_mpdus_queued",
  1032. "d_tx_msdu_queued",
  1033. "d_tx_msdu_dropped",
  1034. "d_local_enqued",
  1035. "d_local_freed",
  1036. "d_tx_ppdu_hw_queued",
  1037. "d_tx_ppdu_reaped",
  1038. "d_tx_fifo_underrun",
  1039. "d_tx_ppdu_abort",
  1040. "d_tx_mpdu_requed",
  1041. "d_tx_excessive_retries",
  1042. "d_tx_hw_rate",
  1043. "d_tx_dropped_sw_retries",
  1044. "d_tx_illegal_rate",
  1045. "d_tx_continuous_xretries",
  1046. "d_tx_timeout",
  1047. "d_tx_mpdu_txop_limit",
  1048. "d_pdev_resets",
  1049. "d_rx_mid_ppdu_route_change",
  1050. "d_rx_status",
  1051. "d_rx_extra_frags_ring0",
  1052. "d_rx_extra_frags_ring1",
  1053. "d_rx_extra_frags_ring2",
  1054. "d_rx_extra_frags_ring3",
  1055. "d_rx_msdu_htt",
  1056. "d_rx_mpdu_htt",
  1057. "d_rx_msdu_stack",
  1058. "d_rx_mpdu_stack",
  1059. "d_rx_phy_err",
  1060. "d_rx_phy_err_drops",
  1061. "d_rx_mpdu_errors", /* FCS, MIC, ENC */
  1062. "d_fw_crash_count",
  1063. "d_fw_warm_reset_count",
  1064. "d_fw_cold_reset_count",
  1065. };
  1066. #define ATH10K_SSTATS_LEN ARRAY_SIZE(ath10k_gstrings_stats)
  1067. void ath10k_debug_get_et_strings(struct ieee80211_hw *hw,
  1068. struct ieee80211_vif *vif,
  1069. u32 sset, u8 *data)
  1070. {
  1071. if (sset == ETH_SS_STATS)
  1072. memcpy(data, *ath10k_gstrings_stats,
  1073. sizeof(ath10k_gstrings_stats));
  1074. }
  1075. int ath10k_debug_get_et_sset_count(struct ieee80211_hw *hw,
  1076. struct ieee80211_vif *vif, int sset)
  1077. {
  1078. if (sset == ETH_SS_STATS)
  1079. return ATH10K_SSTATS_LEN;
  1080. return 0;
  1081. }
  1082. void ath10k_debug_get_et_stats(struct ieee80211_hw *hw,
  1083. struct ieee80211_vif *vif,
  1084. struct ethtool_stats *stats, u64 *data)
  1085. {
  1086. struct ath10k *ar = hw->priv;
  1087. static const struct ath10k_fw_stats_pdev zero_stats = {};
  1088. const struct ath10k_fw_stats_pdev *pdev_stats;
  1089. int i = 0, ret;
  1090. mutex_lock(&ar->conf_mutex);
  1091. if (ar->state == ATH10K_STATE_ON) {
  1092. ret = ath10k_debug_fw_stats_request(ar);
  1093. if (ret) {
  1094. /* just print a warning and try to use older results */
  1095. ath10k_warn(ar,
  1096. "failed to get fw stats for ethtool: %d\n",
  1097. ret);
  1098. }
  1099. }
  1100. pdev_stats = list_first_entry_or_null(&ar->debug.fw_stats.pdevs,
  1101. struct ath10k_fw_stats_pdev,
  1102. list);
  1103. if (!pdev_stats) {
  1104. /* no results available so just return zeroes */
  1105. pdev_stats = &zero_stats;
  1106. }
  1107. spin_lock_bh(&ar->data_lock);
  1108. data[i++] = pdev_stats->hw_reaped; /* ppdu reaped */
  1109. data[i++] = 0; /* tx bytes */
  1110. data[i++] = pdev_stats->htt_mpdus;
  1111. data[i++] = 0; /* rx bytes */
  1112. data[i++] = pdev_stats->ch_noise_floor;
  1113. data[i++] = pdev_stats->cycle_count;
  1114. data[i++] = pdev_stats->phy_err_count;
  1115. data[i++] = pdev_stats->rts_bad;
  1116. data[i++] = pdev_stats->rts_good;
  1117. data[i++] = pdev_stats->chan_tx_power;
  1118. data[i++] = pdev_stats->fcs_bad;
  1119. data[i++] = pdev_stats->no_beacons;
  1120. data[i++] = pdev_stats->mpdu_enqued;
  1121. data[i++] = pdev_stats->msdu_enqued;
  1122. data[i++] = pdev_stats->wmm_drop;
  1123. data[i++] = pdev_stats->local_enqued;
  1124. data[i++] = pdev_stats->local_freed;
  1125. data[i++] = pdev_stats->hw_queued;
  1126. data[i++] = pdev_stats->hw_reaped;
  1127. data[i++] = pdev_stats->underrun;
  1128. data[i++] = pdev_stats->tx_abort;
  1129. data[i++] = pdev_stats->mpdus_requed;
  1130. data[i++] = pdev_stats->tx_ko;
  1131. data[i++] = pdev_stats->data_rc;
  1132. data[i++] = pdev_stats->sw_retry_failure;
  1133. data[i++] = pdev_stats->illgl_rate_phy_err;
  1134. data[i++] = pdev_stats->pdev_cont_xretry;
  1135. data[i++] = pdev_stats->pdev_tx_timeout;
  1136. data[i++] = pdev_stats->txop_ovf;
  1137. data[i++] = pdev_stats->pdev_resets;
  1138. data[i++] = pdev_stats->mid_ppdu_route_change;
  1139. data[i++] = pdev_stats->status_rcvd;
  1140. data[i++] = pdev_stats->r0_frags;
  1141. data[i++] = pdev_stats->r1_frags;
  1142. data[i++] = pdev_stats->r2_frags;
  1143. data[i++] = pdev_stats->r3_frags;
  1144. data[i++] = pdev_stats->htt_msdus;
  1145. data[i++] = pdev_stats->htt_mpdus;
  1146. data[i++] = pdev_stats->loc_msdus;
  1147. data[i++] = pdev_stats->loc_mpdus;
  1148. data[i++] = pdev_stats->phy_errs;
  1149. data[i++] = pdev_stats->phy_err_drop;
  1150. data[i++] = pdev_stats->mpdu_errs;
  1151. data[i++] = ar->stats.fw_crash_counter;
  1152. data[i++] = ar->stats.fw_warm_reset_counter;
  1153. data[i++] = ar->stats.fw_cold_reset_counter;
  1154. spin_unlock_bh(&ar->data_lock);
  1155. mutex_unlock(&ar->conf_mutex);
  1156. WARN_ON(i != ATH10K_SSTATS_LEN);
  1157. }
  1158. static const struct file_operations fops_fw_dbglog = {
  1159. .read = ath10k_read_fw_dbglog,
  1160. .write = ath10k_write_fw_dbglog,
  1161. .open = simple_open,
  1162. .owner = THIS_MODULE,
  1163. .llseek = default_llseek,
  1164. };
  1165. static int ath10k_debug_cal_data_fetch(struct ath10k *ar)
  1166. {
  1167. u32 hi_addr;
  1168. __le32 addr;
  1169. int ret;
  1170. lockdep_assert_held(&ar->conf_mutex);
  1171. if (WARN_ON(ar->hw_params.cal_data_len > ATH10K_DEBUG_CAL_DATA_LEN))
  1172. return -EINVAL;
  1173. hi_addr = host_interest_item_address(HI_ITEM(hi_board_data));
  1174. ret = ath10k_hif_diag_read(ar, hi_addr, &addr, sizeof(addr));
  1175. if (ret) {
  1176. ath10k_warn(ar, "failed to read hi_board_data address: %d\n",
  1177. ret);
  1178. return ret;
  1179. }
  1180. ret = ath10k_hif_diag_read(ar, le32_to_cpu(addr), ar->debug.cal_data,
  1181. ar->hw_params.cal_data_len);
  1182. if (ret) {
  1183. ath10k_warn(ar, "failed to read calibration data: %d\n", ret);
  1184. return ret;
  1185. }
  1186. return 0;
  1187. }
  1188. static int ath10k_debug_cal_data_open(struct inode *inode, struct file *file)
  1189. {
  1190. struct ath10k *ar = inode->i_private;
  1191. mutex_lock(&ar->conf_mutex);
  1192. if (ar->state == ATH10K_STATE_ON ||
  1193. ar->state == ATH10K_STATE_UTF) {
  1194. ath10k_debug_cal_data_fetch(ar);
  1195. }
  1196. file->private_data = ar;
  1197. mutex_unlock(&ar->conf_mutex);
  1198. return 0;
  1199. }
  1200. static ssize_t ath10k_debug_cal_data_read(struct file *file,
  1201. char __user *user_buf,
  1202. size_t count, loff_t *ppos)
  1203. {
  1204. struct ath10k *ar = file->private_data;
  1205. mutex_lock(&ar->conf_mutex);
  1206. count = simple_read_from_buffer(user_buf, count, ppos,
  1207. ar->debug.cal_data,
  1208. ar->hw_params.cal_data_len);
  1209. mutex_unlock(&ar->conf_mutex);
  1210. return count;
  1211. }
  1212. static ssize_t ath10k_write_ani_enable(struct file *file,
  1213. const char __user *user_buf,
  1214. size_t count, loff_t *ppos)
  1215. {
  1216. struct ath10k *ar = file->private_data;
  1217. int ret;
  1218. u8 enable;
  1219. if (kstrtou8_from_user(user_buf, count, 0, &enable))
  1220. return -EINVAL;
  1221. mutex_lock(&ar->conf_mutex);
  1222. if (ar->ani_enabled == enable) {
  1223. ret = count;
  1224. goto exit;
  1225. }
  1226. ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->ani_enable,
  1227. enable);
  1228. if (ret) {
  1229. ath10k_warn(ar, "ani_enable failed from debugfs: %d\n", ret);
  1230. goto exit;
  1231. }
  1232. ar->ani_enabled = enable;
  1233. ret = count;
  1234. exit:
  1235. mutex_unlock(&ar->conf_mutex);
  1236. return ret;
  1237. }
  1238. static ssize_t ath10k_read_ani_enable(struct file *file, char __user *user_buf,
  1239. size_t count, loff_t *ppos)
  1240. {
  1241. struct ath10k *ar = file->private_data;
  1242. int len = 0;
  1243. char buf[32];
  1244. len = scnprintf(buf, sizeof(buf) - len, "%d\n",
  1245. ar->ani_enabled);
  1246. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  1247. }
  1248. static const struct file_operations fops_ani_enable = {
  1249. .read = ath10k_read_ani_enable,
  1250. .write = ath10k_write_ani_enable,
  1251. .open = simple_open,
  1252. .owner = THIS_MODULE,
  1253. .llseek = default_llseek,
  1254. };
  1255. static const struct file_operations fops_cal_data = {
  1256. .open = ath10k_debug_cal_data_open,
  1257. .read = ath10k_debug_cal_data_read,
  1258. .owner = THIS_MODULE,
  1259. .llseek = default_llseek,
  1260. };
  1261. static ssize_t ath10k_read_nf_cal_period(struct file *file,
  1262. char __user *user_buf,
  1263. size_t count, loff_t *ppos)
  1264. {
  1265. struct ath10k *ar = file->private_data;
  1266. unsigned int len;
  1267. char buf[32];
  1268. len = scnprintf(buf, sizeof(buf), "%d\n",
  1269. ar->debug.nf_cal_period);
  1270. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  1271. }
  1272. static ssize_t ath10k_write_nf_cal_period(struct file *file,
  1273. const char __user *user_buf,
  1274. size_t count, loff_t *ppos)
  1275. {
  1276. struct ath10k *ar = file->private_data;
  1277. unsigned long period;
  1278. int ret;
  1279. ret = kstrtoul_from_user(user_buf, count, 0, &period);
  1280. if (ret)
  1281. return ret;
  1282. if (period > WMI_PDEV_PARAM_CAL_PERIOD_MAX)
  1283. return -EINVAL;
  1284. /* there's no way to switch back to the firmware default */
  1285. if (period == 0)
  1286. return -EINVAL;
  1287. mutex_lock(&ar->conf_mutex);
  1288. ar->debug.nf_cal_period = period;
  1289. if (ar->state != ATH10K_STATE_ON) {
  1290. /* firmware is not running, nothing else to do */
  1291. ret = count;
  1292. goto exit;
  1293. }
  1294. ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->cal_period,
  1295. ar->debug.nf_cal_period);
  1296. if (ret) {
  1297. ath10k_warn(ar, "cal period cfg failed from debugfs: %d\n",
  1298. ret);
  1299. goto exit;
  1300. }
  1301. ret = count;
  1302. exit:
  1303. mutex_unlock(&ar->conf_mutex);
  1304. return ret;
  1305. }
  1306. static const struct file_operations fops_nf_cal_period = {
  1307. .read = ath10k_read_nf_cal_period,
  1308. .write = ath10k_write_nf_cal_period,
  1309. .open = simple_open,
  1310. .owner = THIS_MODULE,
  1311. .llseek = default_llseek,
  1312. };
  1313. #define ATH10K_TPC_CONFIG_BUF_SIZE (1024 * 1024)
  1314. static int ath10k_debug_tpc_stats_request(struct ath10k *ar)
  1315. {
  1316. int ret;
  1317. unsigned long time_left;
  1318. lockdep_assert_held(&ar->conf_mutex);
  1319. reinit_completion(&ar->debug.tpc_complete);
  1320. ret = ath10k_wmi_pdev_get_tpc_config(ar, WMI_TPC_CONFIG_PARAM);
  1321. if (ret) {
  1322. ath10k_warn(ar, "failed to request tpc config: %d\n", ret);
  1323. return ret;
  1324. }
  1325. time_left = wait_for_completion_timeout(&ar->debug.tpc_complete,
  1326. 1 * HZ);
  1327. if (time_left == 0)
  1328. return -ETIMEDOUT;
  1329. return 0;
  1330. }
  1331. void ath10k_debug_tpc_stats_process(struct ath10k *ar,
  1332. struct ath10k_tpc_stats *tpc_stats)
  1333. {
  1334. spin_lock_bh(&ar->data_lock);
  1335. kfree(ar->debug.tpc_stats);
  1336. ar->debug.tpc_stats = tpc_stats;
  1337. complete(&ar->debug.tpc_complete);
  1338. spin_unlock_bh(&ar->data_lock);
  1339. }
  1340. static void ath10k_tpc_stats_print(struct ath10k_tpc_stats *tpc_stats,
  1341. unsigned int j, char *buf, unsigned int *len)
  1342. {
  1343. unsigned int i, buf_len;
  1344. static const char table_str[][5] = { "CDD",
  1345. "STBC",
  1346. "TXBF" };
  1347. static const char pream_str[][6] = { "CCK",
  1348. "OFDM",
  1349. "HT20",
  1350. "HT40",
  1351. "VHT20",
  1352. "VHT40",
  1353. "VHT80",
  1354. "HTCUP" };
  1355. buf_len = ATH10K_TPC_CONFIG_BUF_SIZE;
  1356. *len += scnprintf(buf + *len, buf_len - *len,
  1357. "********************************\n");
  1358. *len += scnprintf(buf + *len, buf_len - *len,
  1359. "******************* %s POWER TABLE ****************\n",
  1360. table_str[j]);
  1361. *len += scnprintf(buf + *len, buf_len - *len,
  1362. "********************************\n");
  1363. *len += scnprintf(buf + *len, buf_len - *len,
  1364. "No. Preamble Rate_code tpc_value1 tpc_value2 tpc_value3\n");
  1365. for (i = 0; i < tpc_stats->rate_max; i++) {
  1366. *len += scnprintf(buf + *len, buf_len - *len,
  1367. "%8d %s 0x%2x %s\n", i,
  1368. pream_str[tpc_stats->tpc_table[j].pream_idx[i]],
  1369. tpc_stats->tpc_table[j].rate_code[i],
  1370. tpc_stats->tpc_table[j].tpc_value[i]);
  1371. }
  1372. *len += scnprintf(buf + *len, buf_len - *len,
  1373. "***********************************\n");
  1374. }
  1375. static void ath10k_tpc_stats_fill(struct ath10k *ar,
  1376. struct ath10k_tpc_stats *tpc_stats,
  1377. char *buf)
  1378. {
  1379. unsigned int len, j, buf_len;
  1380. len = 0;
  1381. buf_len = ATH10K_TPC_CONFIG_BUF_SIZE;
  1382. spin_lock_bh(&ar->data_lock);
  1383. if (!tpc_stats) {
  1384. ath10k_warn(ar, "failed to get tpc stats\n");
  1385. goto unlock;
  1386. }
  1387. len += scnprintf(buf + len, buf_len - len, "\n");
  1388. len += scnprintf(buf + len, buf_len - len,
  1389. "*************************************\n");
  1390. len += scnprintf(buf + len, buf_len - len,
  1391. "TPC config for channel %4d mode %d\n",
  1392. tpc_stats->chan_freq,
  1393. tpc_stats->phy_mode);
  1394. len += scnprintf(buf + len, buf_len - len,
  1395. "*************************************\n");
  1396. len += scnprintf(buf + len, buf_len - len,
  1397. "CTL = 0x%2x Reg. Domain = %2d\n",
  1398. tpc_stats->ctl,
  1399. tpc_stats->reg_domain);
  1400. len += scnprintf(buf + len, buf_len - len,
  1401. "Antenna Gain = %2d Reg. Max Antenna Gain = %2d\n",
  1402. tpc_stats->twice_antenna_gain,
  1403. tpc_stats->twice_antenna_reduction);
  1404. len += scnprintf(buf + len, buf_len - len,
  1405. "Power Limit = %2d Reg. Max Power = %2d\n",
  1406. tpc_stats->power_limit,
  1407. tpc_stats->twice_max_rd_power / 2);
  1408. len += scnprintf(buf + len, buf_len - len,
  1409. "Num tx chains = %2d Num supported rates = %2d\n",
  1410. tpc_stats->num_tx_chain,
  1411. tpc_stats->rate_max);
  1412. for (j = 0; j < tpc_stats->num_tx_chain ; j++) {
  1413. switch (j) {
  1414. case WMI_TPC_TABLE_TYPE_CDD:
  1415. if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) {
  1416. len += scnprintf(buf + len, buf_len - len,
  1417. "CDD not supported\n");
  1418. break;
  1419. }
  1420. ath10k_tpc_stats_print(tpc_stats, j, buf, &len);
  1421. break;
  1422. case WMI_TPC_TABLE_TYPE_STBC:
  1423. if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) {
  1424. len += scnprintf(buf + len, buf_len - len,
  1425. "STBC not supported\n");
  1426. break;
  1427. }
  1428. ath10k_tpc_stats_print(tpc_stats, j, buf, &len);
  1429. break;
  1430. case WMI_TPC_TABLE_TYPE_TXBF:
  1431. if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) {
  1432. len += scnprintf(buf + len, buf_len - len,
  1433. "TXBF not supported\n***************************\n");
  1434. break;
  1435. }
  1436. ath10k_tpc_stats_print(tpc_stats, j, buf, &len);
  1437. break;
  1438. default:
  1439. len += scnprintf(buf + len, buf_len - len,
  1440. "Invalid Type\n");
  1441. break;
  1442. }
  1443. }
  1444. unlock:
  1445. spin_unlock_bh(&ar->data_lock);
  1446. if (len >= buf_len)
  1447. buf[len - 1] = 0;
  1448. else
  1449. buf[len] = 0;
  1450. }
  1451. static int ath10k_tpc_stats_open(struct inode *inode, struct file *file)
  1452. {
  1453. struct ath10k *ar = inode->i_private;
  1454. void *buf = NULL;
  1455. int ret;
  1456. mutex_lock(&ar->conf_mutex);
  1457. if (ar->state != ATH10K_STATE_ON) {
  1458. ret = -ENETDOWN;
  1459. goto err_unlock;
  1460. }
  1461. buf = vmalloc(ATH10K_TPC_CONFIG_BUF_SIZE);
  1462. if (!buf) {
  1463. ret = -ENOMEM;
  1464. goto err_unlock;
  1465. }
  1466. ret = ath10k_debug_tpc_stats_request(ar);
  1467. if (ret) {
  1468. ath10k_warn(ar, "failed to request tpc config stats: %d\n",
  1469. ret);
  1470. goto err_free;
  1471. }
  1472. ath10k_tpc_stats_fill(ar, ar->debug.tpc_stats, buf);
  1473. file->private_data = buf;
  1474. mutex_unlock(&ar->conf_mutex);
  1475. return 0;
  1476. err_free:
  1477. vfree(buf);
  1478. err_unlock:
  1479. mutex_unlock(&ar->conf_mutex);
  1480. return ret;
  1481. }
  1482. static int ath10k_tpc_stats_release(struct inode *inode, struct file *file)
  1483. {
  1484. vfree(file->private_data);
  1485. return 0;
  1486. }
  1487. static ssize_t ath10k_tpc_stats_read(struct file *file, char __user *user_buf,
  1488. size_t count, loff_t *ppos)
  1489. {
  1490. const char *buf = file->private_data;
  1491. unsigned int len = strlen(buf);
  1492. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  1493. }
  1494. static const struct file_operations fops_tpc_stats = {
  1495. .open = ath10k_tpc_stats_open,
  1496. .release = ath10k_tpc_stats_release,
  1497. .read = ath10k_tpc_stats_read,
  1498. .owner = THIS_MODULE,
  1499. .llseek = default_llseek,
  1500. };
  1501. int ath10k_debug_start(struct ath10k *ar)
  1502. {
  1503. int ret;
  1504. lockdep_assert_held(&ar->conf_mutex);
  1505. ret = ath10k_debug_htt_stats_req(ar);
  1506. if (ret)
  1507. /* continue normally anyway, this isn't serious */
  1508. ath10k_warn(ar, "failed to start htt stats workqueue: %d\n",
  1509. ret);
  1510. if (ar->debug.fw_dbglog_mask) {
  1511. ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask,
  1512. ATH10K_DBGLOG_LEVEL_WARN);
  1513. if (ret)
  1514. /* not serious */
  1515. ath10k_warn(ar, "failed to enable dbglog during start: %d",
  1516. ret);
  1517. }
  1518. if (ar->debug.pktlog_filter) {
  1519. ret = ath10k_wmi_pdev_pktlog_enable(ar,
  1520. ar->debug.pktlog_filter);
  1521. if (ret)
  1522. /* not serious */
  1523. ath10k_warn(ar,
  1524. "failed to enable pktlog filter %x: %d\n",
  1525. ar->debug.pktlog_filter, ret);
  1526. } else {
  1527. ret = ath10k_wmi_pdev_pktlog_disable(ar);
  1528. if (ret)
  1529. /* not serious */
  1530. ath10k_warn(ar, "failed to disable pktlog: %d\n", ret);
  1531. }
  1532. if (ar->debug.nf_cal_period) {
  1533. ret = ath10k_wmi_pdev_set_param(ar,
  1534. ar->wmi.pdev_param->cal_period,
  1535. ar->debug.nf_cal_period);
  1536. if (ret)
  1537. /* not serious */
  1538. ath10k_warn(ar, "cal period cfg failed from debug start: %d\n",
  1539. ret);
  1540. }
  1541. return ret;
  1542. }
  1543. void ath10k_debug_stop(struct ath10k *ar)
  1544. {
  1545. lockdep_assert_held(&ar->conf_mutex);
  1546. ath10k_debug_cal_data_fetch(ar);
  1547. /* Must not use _sync to avoid deadlock, we do that in
  1548. * ath10k_debug_destroy(). The check for htt_stats_mask is to avoid
  1549. * warning from del_timer(). */
  1550. if (ar->debug.htt_stats_mask != 0)
  1551. cancel_delayed_work(&ar->debug.htt_stats_dwork);
  1552. ath10k_wmi_pdev_pktlog_disable(ar);
  1553. }
  1554. static ssize_t ath10k_write_simulate_radar(struct file *file,
  1555. const char __user *user_buf,
  1556. size_t count, loff_t *ppos)
  1557. {
  1558. struct ath10k *ar = file->private_data;
  1559. ieee80211_radar_detected(ar->hw);
  1560. return count;
  1561. }
  1562. static const struct file_operations fops_simulate_radar = {
  1563. .write = ath10k_write_simulate_radar,
  1564. .open = simple_open,
  1565. .owner = THIS_MODULE,
  1566. .llseek = default_llseek,
  1567. };
  1568. #define ATH10K_DFS_STAT(s, p) (\
  1569. len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \
  1570. ar->debug.dfs_stats.p))
  1571. #define ATH10K_DFS_POOL_STAT(s, p) (\
  1572. len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \
  1573. ar->debug.dfs_pool_stats.p))
  1574. static ssize_t ath10k_read_dfs_stats(struct file *file, char __user *user_buf,
  1575. size_t count, loff_t *ppos)
  1576. {
  1577. int retval = 0, len = 0;
  1578. const int size = 8000;
  1579. struct ath10k *ar = file->private_data;
  1580. char *buf;
  1581. buf = kzalloc(size, GFP_KERNEL);
  1582. if (buf == NULL)
  1583. return -ENOMEM;
  1584. if (!ar->dfs_detector) {
  1585. len += scnprintf(buf + len, size - len, "DFS not enabled\n");
  1586. goto exit;
  1587. }
  1588. ar->debug.dfs_pool_stats =
  1589. ar->dfs_detector->get_stats(ar->dfs_detector);
  1590. len += scnprintf(buf + len, size - len, "Pulse detector statistics:\n");
  1591. ATH10K_DFS_STAT("reported phy errors", phy_errors);
  1592. ATH10K_DFS_STAT("pulse events reported", pulses_total);
  1593. ATH10K_DFS_STAT("DFS pulses detected", pulses_detected);
  1594. ATH10K_DFS_STAT("DFS pulses discarded", pulses_discarded);
  1595. ATH10K_DFS_STAT("Radars detected", radar_detected);
  1596. len += scnprintf(buf + len, size - len, "Global Pool statistics:\n");
  1597. ATH10K_DFS_POOL_STAT("Pool references", pool_reference);
  1598. ATH10K_DFS_POOL_STAT("Pulses allocated", pulse_allocated);
  1599. ATH10K_DFS_POOL_STAT("Pulses alloc error", pulse_alloc_error);
  1600. ATH10K_DFS_POOL_STAT("Pulses in use", pulse_used);
  1601. ATH10K_DFS_POOL_STAT("Seqs. allocated", pseq_allocated);
  1602. ATH10K_DFS_POOL_STAT("Seqs. alloc error", pseq_alloc_error);
  1603. ATH10K_DFS_POOL_STAT("Seqs. in use", pseq_used);
  1604. exit:
  1605. if (len > size)
  1606. len = size;
  1607. retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
  1608. kfree(buf);
  1609. return retval;
  1610. }
  1611. static const struct file_operations fops_dfs_stats = {
  1612. .read = ath10k_read_dfs_stats,
  1613. .open = simple_open,
  1614. .owner = THIS_MODULE,
  1615. .llseek = default_llseek,
  1616. };
  1617. static ssize_t ath10k_write_pktlog_filter(struct file *file,
  1618. const char __user *ubuf,
  1619. size_t count, loff_t *ppos)
  1620. {
  1621. struct ath10k *ar = file->private_data;
  1622. u32 filter;
  1623. int ret;
  1624. if (kstrtouint_from_user(ubuf, count, 0, &filter))
  1625. return -EINVAL;
  1626. mutex_lock(&ar->conf_mutex);
  1627. if (ar->state != ATH10K_STATE_ON) {
  1628. ar->debug.pktlog_filter = filter;
  1629. ret = count;
  1630. goto out;
  1631. }
  1632. if (filter == ar->debug.pktlog_filter) {
  1633. ret = count;
  1634. goto out;
  1635. }
  1636. if (filter) {
  1637. ret = ath10k_wmi_pdev_pktlog_enable(ar, filter);
  1638. if (ret) {
  1639. ath10k_warn(ar, "failed to enable pktlog filter %x: %d\n",
  1640. ar->debug.pktlog_filter, ret);
  1641. goto out;
  1642. }
  1643. } else {
  1644. ret = ath10k_wmi_pdev_pktlog_disable(ar);
  1645. if (ret) {
  1646. ath10k_warn(ar, "failed to disable pktlog: %d\n", ret);
  1647. goto out;
  1648. }
  1649. }
  1650. ar->debug.pktlog_filter = filter;
  1651. ret = count;
  1652. out:
  1653. mutex_unlock(&ar->conf_mutex);
  1654. return ret;
  1655. }
  1656. static ssize_t ath10k_read_pktlog_filter(struct file *file, char __user *ubuf,
  1657. size_t count, loff_t *ppos)
  1658. {
  1659. char buf[32];
  1660. struct ath10k *ar = file->private_data;
  1661. int len = 0;
  1662. mutex_lock(&ar->conf_mutex);
  1663. len = scnprintf(buf, sizeof(buf) - len, "%08x\n",
  1664. ar->debug.pktlog_filter);
  1665. mutex_unlock(&ar->conf_mutex);
  1666. return simple_read_from_buffer(ubuf, count, ppos, buf, len);
  1667. }
  1668. static const struct file_operations fops_pktlog_filter = {
  1669. .read = ath10k_read_pktlog_filter,
  1670. .write = ath10k_write_pktlog_filter,
  1671. .open = simple_open
  1672. };
  1673. static ssize_t ath10k_write_quiet_period(struct file *file,
  1674. const char __user *ubuf,
  1675. size_t count, loff_t *ppos)
  1676. {
  1677. struct ath10k *ar = file->private_data;
  1678. u32 period;
  1679. if (kstrtouint_from_user(ubuf, count, 0, &period))
  1680. return -EINVAL;
  1681. if (period < ATH10K_QUIET_PERIOD_MIN) {
  1682. ath10k_warn(ar, "Quiet period %u can not be lesser than 25ms\n",
  1683. period);
  1684. return -EINVAL;
  1685. }
  1686. mutex_lock(&ar->conf_mutex);
  1687. ar->thermal.quiet_period = period;
  1688. ath10k_thermal_set_throttling(ar);
  1689. mutex_unlock(&ar->conf_mutex);
  1690. return count;
  1691. }
  1692. static ssize_t ath10k_read_quiet_period(struct file *file, char __user *ubuf,
  1693. size_t count, loff_t *ppos)
  1694. {
  1695. char buf[32];
  1696. struct ath10k *ar = file->private_data;
  1697. int len = 0;
  1698. mutex_lock(&ar->conf_mutex);
  1699. len = scnprintf(buf, sizeof(buf) - len, "%d\n",
  1700. ar->thermal.quiet_period);
  1701. mutex_unlock(&ar->conf_mutex);
  1702. return simple_read_from_buffer(ubuf, count, ppos, buf, len);
  1703. }
  1704. static const struct file_operations fops_quiet_period = {
  1705. .read = ath10k_read_quiet_period,
  1706. .write = ath10k_write_quiet_period,
  1707. .open = simple_open
  1708. };
  1709. static ssize_t ath10k_write_btcoex(struct file *file,
  1710. const char __user *ubuf,
  1711. size_t count, loff_t *ppos)
  1712. {
  1713. struct ath10k *ar = file->private_data;
  1714. char buf[32];
  1715. size_t buf_size;
  1716. int ret;
  1717. bool val;
  1718. u32 pdev_param;
  1719. buf_size = min(count, (sizeof(buf) - 1));
  1720. if (copy_from_user(buf, ubuf, buf_size))
  1721. return -EFAULT;
  1722. buf[buf_size] = '\0';
  1723. if (strtobool(buf, &val) != 0)
  1724. return -EINVAL;
  1725. mutex_lock(&ar->conf_mutex);
  1726. if (ar->state != ATH10K_STATE_ON &&
  1727. ar->state != ATH10K_STATE_RESTARTED) {
  1728. ret = -ENETDOWN;
  1729. goto exit;
  1730. }
  1731. if (!(test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) ^ val)) {
  1732. ret = count;
  1733. goto exit;
  1734. }
  1735. pdev_param = ar->wmi.pdev_param->enable_btcoex;
  1736. if (test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM,
  1737. ar->running_fw->fw_file.fw_features)) {
  1738. ret = ath10k_wmi_pdev_set_param(ar, pdev_param, val);
  1739. if (ret) {
  1740. ath10k_warn(ar, "failed to enable btcoex: %d\n", ret);
  1741. ret = count;
  1742. goto exit;
  1743. }
  1744. } else {
  1745. ath10k_info(ar, "restarting firmware due to btcoex change");
  1746. queue_work(ar->workqueue, &ar->restart_work);
  1747. }
  1748. if (val)
  1749. set_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
  1750. else
  1751. clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
  1752. ret = count;
  1753. exit:
  1754. mutex_unlock(&ar->conf_mutex);
  1755. return ret;
  1756. }
  1757. static ssize_t ath10k_read_btcoex(struct file *file, char __user *ubuf,
  1758. size_t count, loff_t *ppos)
  1759. {
  1760. char buf[32];
  1761. struct ath10k *ar = file->private_data;
  1762. int len = 0;
  1763. mutex_lock(&ar->conf_mutex);
  1764. len = scnprintf(buf, sizeof(buf) - len, "%d\n",
  1765. test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags));
  1766. mutex_unlock(&ar->conf_mutex);
  1767. return simple_read_from_buffer(ubuf, count, ppos, buf, len);
  1768. }
  1769. static const struct file_operations fops_btcoex = {
  1770. .read = ath10k_read_btcoex,
  1771. .write = ath10k_write_btcoex,
  1772. .open = simple_open
  1773. };
  1774. static ssize_t ath10k_write_peer_stats(struct file *file,
  1775. const char __user *ubuf,
  1776. size_t count, loff_t *ppos)
  1777. {
  1778. struct ath10k *ar = file->private_data;
  1779. char buf[32];
  1780. size_t buf_size;
  1781. int ret;
  1782. bool val;
  1783. buf_size = min(count, (sizeof(buf) - 1));
  1784. if (copy_from_user(buf, ubuf, buf_size))
  1785. return -EFAULT;
  1786. buf[buf_size] = '\0';
  1787. if (strtobool(buf, &val) != 0)
  1788. return -EINVAL;
  1789. mutex_lock(&ar->conf_mutex);
  1790. if (ar->state != ATH10K_STATE_ON &&
  1791. ar->state != ATH10K_STATE_RESTARTED) {
  1792. ret = -ENETDOWN;
  1793. goto exit;
  1794. }
  1795. if (!(test_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags) ^ val)) {
  1796. ret = count;
  1797. goto exit;
  1798. }
  1799. if (val)
  1800. set_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags);
  1801. else
  1802. clear_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags);
  1803. ath10k_info(ar, "restarting firmware due to Peer stats change");
  1804. queue_work(ar->workqueue, &ar->restart_work);
  1805. ret = count;
  1806. exit:
  1807. mutex_unlock(&ar->conf_mutex);
  1808. return ret;
  1809. }
  1810. static ssize_t ath10k_read_peer_stats(struct file *file, char __user *ubuf,
  1811. size_t count, loff_t *ppos)
  1812. {
  1813. char buf[32];
  1814. struct ath10k *ar = file->private_data;
  1815. int len = 0;
  1816. mutex_lock(&ar->conf_mutex);
  1817. len = scnprintf(buf, sizeof(buf) - len, "%d\n",
  1818. test_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags));
  1819. mutex_unlock(&ar->conf_mutex);
  1820. return simple_read_from_buffer(ubuf, count, ppos, buf, len);
  1821. }
  1822. static const struct file_operations fops_peer_stats = {
  1823. .read = ath10k_read_peer_stats,
  1824. .write = ath10k_write_peer_stats,
  1825. .open = simple_open
  1826. };
  1827. static ssize_t ath10k_debug_fw_checksums_read(struct file *file,
  1828. char __user *user_buf,
  1829. size_t count, loff_t *ppos)
  1830. {
  1831. struct ath10k *ar = file->private_data;
  1832. unsigned int len = 0, buf_len = 4096;
  1833. ssize_t ret_cnt;
  1834. char *buf;
  1835. buf = kzalloc(buf_len, GFP_KERNEL);
  1836. if (!buf)
  1837. return -ENOMEM;
  1838. mutex_lock(&ar->conf_mutex);
  1839. len += scnprintf(buf + len, buf_len - len,
  1840. "firmware-N.bin\t\t%08x\n",
  1841. crc32_le(0, ar->normal_mode_fw.fw_file.firmware->data,
  1842. ar->normal_mode_fw.fw_file.firmware->size));
  1843. len += scnprintf(buf + len, buf_len - len,
  1844. "athwlan\t\t\t%08x\n",
  1845. crc32_le(0, ar->normal_mode_fw.fw_file.firmware_data,
  1846. ar->normal_mode_fw.fw_file.firmware_len));
  1847. len += scnprintf(buf + len, buf_len - len,
  1848. "otp\t\t\t%08x\n",
  1849. crc32_le(0, ar->normal_mode_fw.fw_file.otp_data,
  1850. ar->normal_mode_fw.fw_file.otp_len));
  1851. len += scnprintf(buf + len, buf_len - len,
  1852. "codeswap\t\t%08x\n",
  1853. crc32_le(0, ar->normal_mode_fw.fw_file.codeswap_data,
  1854. ar->normal_mode_fw.fw_file.codeswap_len));
  1855. len += scnprintf(buf + len, buf_len - len,
  1856. "board-N.bin\t\t%08x\n",
  1857. crc32_le(0, ar->normal_mode_fw.board->data,
  1858. ar->normal_mode_fw.board->size));
  1859. len += scnprintf(buf + len, buf_len - len,
  1860. "board\t\t\t%08x\n",
  1861. crc32_le(0, ar->normal_mode_fw.board_data,
  1862. ar->normal_mode_fw.board_len));
  1863. ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len);
  1864. mutex_unlock(&ar->conf_mutex);
  1865. kfree(buf);
  1866. return ret_cnt;
  1867. }
  1868. static const struct file_operations fops_fw_checksums = {
  1869. .read = ath10k_debug_fw_checksums_read,
  1870. .open = simple_open,
  1871. .owner = THIS_MODULE,
  1872. .llseek = default_llseek,
  1873. };
  1874. int ath10k_debug_create(struct ath10k *ar)
  1875. {
  1876. ar->debug.fw_crash_data = vzalloc(sizeof(*ar->debug.fw_crash_data));
  1877. if (!ar->debug.fw_crash_data)
  1878. return -ENOMEM;
  1879. ar->debug.cal_data = vzalloc(ATH10K_DEBUG_CAL_DATA_LEN);
  1880. if (!ar->debug.cal_data)
  1881. return -ENOMEM;
  1882. INIT_LIST_HEAD(&ar->debug.fw_stats.pdevs);
  1883. INIT_LIST_HEAD(&ar->debug.fw_stats.vdevs);
  1884. INIT_LIST_HEAD(&ar->debug.fw_stats.peers);
  1885. INIT_LIST_HEAD(&ar->debug.fw_stats.peers_extd);
  1886. return 0;
  1887. }
  1888. void ath10k_debug_destroy(struct ath10k *ar)
  1889. {
  1890. vfree(ar->debug.fw_crash_data);
  1891. ar->debug.fw_crash_data = NULL;
  1892. vfree(ar->debug.cal_data);
  1893. ar->debug.cal_data = NULL;
  1894. ath10k_debug_fw_stats_reset(ar);
  1895. kfree(ar->debug.tpc_stats);
  1896. }
  1897. int ath10k_debug_register(struct ath10k *ar)
  1898. {
  1899. ar->debug.debugfs_phy = debugfs_create_dir("ath10k",
  1900. ar->hw->wiphy->debugfsdir);
  1901. if (IS_ERR_OR_NULL(ar->debug.debugfs_phy)) {
  1902. if (IS_ERR(ar->debug.debugfs_phy))
  1903. return PTR_ERR(ar->debug.debugfs_phy);
  1904. return -ENOMEM;
  1905. }
  1906. INIT_DELAYED_WORK(&ar->debug.htt_stats_dwork,
  1907. ath10k_debug_htt_stats_dwork);
  1908. init_completion(&ar->debug.tpc_complete);
  1909. init_completion(&ar->debug.fw_stats_complete);
  1910. debugfs_create_file("fw_stats", S_IRUSR, ar->debug.debugfs_phy, ar,
  1911. &fops_fw_stats);
  1912. debugfs_create_file("fw_reset_stats", S_IRUSR, ar->debug.debugfs_phy,
  1913. ar, &fops_fw_reset_stats);
  1914. debugfs_create_file("wmi_services", S_IRUSR, ar->debug.debugfs_phy, ar,
  1915. &fops_wmi_services);
  1916. debugfs_create_file("simulate_fw_crash", S_IRUSR | S_IWUSR,
  1917. ar->debug.debugfs_phy, ar, &fops_simulate_fw_crash);
  1918. debugfs_create_file("fw_crash_dump", S_IRUSR, ar->debug.debugfs_phy,
  1919. ar, &fops_fw_crash_dump);
  1920. debugfs_create_file("reg_addr", S_IRUSR | S_IWUSR,
  1921. ar->debug.debugfs_phy, ar, &fops_reg_addr);
  1922. debugfs_create_file("reg_value", S_IRUSR | S_IWUSR,
  1923. ar->debug.debugfs_phy, ar, &fops_reg_value);
  1924. debugfs_create_file("mem_value", S_IRUSR | S_IWUSR,
  1925. ar->debug.debugfs_phy, ar, &fops_mem_value);
  1926. debugfs_create_file("chip_id", S_IRUSR, ar->debug.debugfs_phy,
  1927. ar, &fops_chip_id);
  1928. debugfs_create_file("htt_stats_mask", S_IRUSR | S_IWUSR,
  1929. ar->debug.debugfs_phy, ar, &fops_htt_stats_mask);
  1930. debugfs_create_file("htt_max_amsdu_ampdu", S_IRUSR | S_IWUSR,
  1931. ar->debug.debugfs_phy, ar,
  1932. &fops_htt_max_amsdu_ampdu);
  1933. debugfs_create_file("fw_dbglog", S_IRUSR | S_IWUSR,
  1934. ar->debug.debugfs_phy, ar, &fops_fw_dbglog);
  1935. debugfs_create_file("cal_data", S_IRUSR, ar->debug.debugfs_phy,
  1936. ar, &fops_cal_data);
  1937. debugfs_create_file("ani_enable", S_IRUSR | S_IWUSR,
  1938. ar->debug.debugfs_phy, ar, &fops_ani_enable);
  1939. debugfs_create_file("nf_cal_period", S_IRUSR | S_IWUSR,
  1940. ar->debug.debugfs_phy, ar, &fops_nf_cal_period);
  1941. if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
  1942. debugfs_create_file("dfs_simulate_radar", S_IWUSR,
  1943. ar->debug.debugfs_phy, ar,
  1944. &fops_simulate_radar);
  1945. debugfs_create_bool("dfs_block_radar_events", S_IWUSR,
  1946. ar->debug.debugfs_phy,
  1947. &ar->dfs_block_radar_events);
  1948. debugfs_create_file("dfs_stats", S_IRUSR,
  1949. ar->debug.debugfs_phy, ar,
  1950. &fops_dfs_stats);
  1951. }
  1952. debugfs_create_file("pktlog_filter", S_IRUGO | S_IWUSR,
  1953. ar->debug.debugfs_phy, ar, &fops_pktlog_filter);
  1954. debugfs_create_file("quiet_period", S_IRUGO | S_IWUSR,
  1955. ar->debug.debugfs_phy, ar, &fops_quiet_period);
  1956. debugfs_create_file("tpc_stats", S_IRUSR,
  1957. ar->debug.debugfs_phy, ar, &fops_tpc_stats);
  1958. if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
  1959. debugfs_create_file("btcoex", S_IRUGO | S_IWUSR,
  1960. ar->debug.debugfs_phy, ar, &fops_btcoex);
  1961. if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
  1962. debugfs_create_file("peer_stats", S_IRUGO | S_IWUSR,
  1963. ar->debug.debugfs_phy, ar,
  1964. &fops_peer_stats);
  1965. debugfs_create_file("fw_checksums", S_IRUSR,
  1966. ar->debug.debugfs_phy, ar, &fops_fw_checksums);
  1967. return 0;
  1968. }
  1969. void ath10k_debug_unregister(struct ath10k *ar)
  1970. {
  1971. cancel_delayed_work_sync(&ar->debug.htt_stats_dwork);
  1972. }
  1973. #endif /* CONFIG_ATH10K_DEBUGFS */
  1974. #ifdef CONFIG_ATH10K_DEBUG
  1975. void ath10k_dbg(struct ath10k *ar, enum ath10k_debug_mask mask,
  1976. const char *fmt, ...)
  1977. {
  1978. struct va_format vaf;
  1979. va_list args;
  1980. va_start(args, fmt);
  1981. vaf.fmt = fmt;
  1982. vaf.va = &args;
  1983. if (ath10k_debug_mask & mask)
  1984. dev_printk(KERN_DEBUG, ar->dev, "%pV", &vaf);
  1985. trace_ath10k_log_dbg(ar, mask, &vaf);
  1986. va_end(args);
  1987. }
  1988. EXPORT_SYMBOL(ath10k_dbg);
  1989. void ath10k_dbg_dump(struct ath10k *ar,
  1990. enum ath10k_debug_mask mask,
  1991. const char *msg, const char *prefix,
  1992. const void *buf, size_t len)
  1993. {
  1994. char linebuf[256];
  1995. unsigned int linebuflen;
  1996. const void *ptr;
  1997. if (ath10k_debug_mask & mask) {
  1998. if (msg)
  1999. ath10k_dbg(ar, mask, "%s\n", msg);
  2000. for (ptr = buf; (ptr - buf) < len; ptr += 16) {
  2001. linebuflen = 0;
  2002. linebuflen += scnprintf(linebuf + linebuflen,
  2003. sizeof(linebuf) - linebuflen,
  2004. "%s%08x: ",
  2005. (prefix ? prefix : ""),
  2006. (unsigned int)(ptr - buf));
  2007. hex_dump_to_buffer(ptr, len - (ptr - buf), 16, 1,
  2008. linebuf + linebuflen,
  2009. sizeof(linebuf) - linebuflen, true);
  2010. dev_printk(KERN_DEBUG, ar->dev, "%s\n", linebuf);
  2011. }
  2012. }
  2013. /* tracing code doesn't like null strings :/ */
  2014. trace_ath10k_log_dbg_dump(ar, msg ? msg : "", prefix ? prefix : "",
  2015. buf, len);
  2016. }
  2017. EXPORT_SYMBOL(ath10k_dbg_dump);
  2018. #endif /* CONFIG_ATH10K_DEBUG */