debug.c 64 KB

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