Path: blob/main/sys/contrib/dev/athk/ath10k/coredump.c
48378 views
// SPDX-License-Identifier: ISC1/*2* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.3* Copyright (c) 2018, The Linux Foundation. All rights reserved.4*/56#include "coredump.h"78#include <linux/devcoredump.h>9#include <linux/kernel.h>10#include <linux/types.h>11#include <linux/utsname.h>1213#include "debug.h"14#include "hw.h"1516static const struct ath10k_mem_section qca6174_hw21_register_sections[] = {17{0x800, 0x810},18{0x820, 0x82C},19{0x830, 0x8F4},20{0x90C, 0x91C},21{0xA14, 0xA18},22{0xA84, 0xA94},23{0xAA8, 0xAD4},24{0xADC, 0xB40},25{0x1000, 0x10A4},26{0x10BC, 0x111C},27{0x1134, 0x1138},28{0x1144, 0x114C},29{0x1150, 0x115C},30{0x1160, 0x1178},31{0x1240, 0x1260},32{0x2000, 0x207C},33{0x3000, 0x3014},34{0x4000, 0x4014},35{0x5000, 0x5124},36{0x6000, 0x6040},37{0x6080, 0x60CC},38{0x6100, 0x611C},39{0x6140, 0x61D8},40{0x6200, 0x6238},41{0x6240, 0x628C},42{0x62C0, 0x62EC},43{0x6380, 0x63E8},44{0x6400, 0x6440},45{0x6480, 0x64CC},46{0x6500, 0x651C},47{0x6540, 0x6580},48{0x6600, 0x6638},49{0x6640, 0x668C},50{0x66C0, 0x66EC},51{0x6780, 0x67E8},52{0x7080, 0x708C},53{0x70C0, 0x70C8},54{0x7400, 0x741C},55{0x7440, 0x7454},56{0x7800, 0x7818},57{0x8000, 0x8004},58{0x8010, 0x8064},59{0x8080, 0x8084},60{0x80A0, 0x80A4},61{0x80C0, 0x80C4},62{0x80E0, 0x80F4},63{0x8100, 0x8104},64{0x8110, 0x812C},65{0x9000, 0x9004},66{0x9800, 0x982C},67{0x9830, 0x9838},68{0x9840, 0x986C},69{0x9870, 0x9898},70{0x9A00, 0x9C00},71{0xD580, 0xD59C},72{0xF000, 0xF0E0},73{0xF140, 0xF190},74{0xF250, 0xF25C},75{0xF260, 0xF268},76{0xF26C, 0xF2A8},77{0x10008, 0x1000C},78{0x10014, 0x10018},79{0x1001C, 0x10020},80{0x10024, 0x10028},81{0x10030, 0x10034},82{0x10040, 0x10054},83{0x10058, 0x1007C},84{0x10080, 0x100C4},85{0x100C8, 0x10114},86{0x1012C, 0x10130},87{0x10138, 0x10144},88{0x10200, 0x10220},89{0x10230, 0x10250},90{0x10260, 0x10280},91{0x10290, 0x102B0},92{0x102C0, 0x102DC},93{0x102E0, 0x102F4},94{0x102FC, 0x1037C},95{0x10380, 0x10390},96{0x10800, 0x10828},97{0x10840, 0x10844},98{0x10880, 0x10884},99{0x108C0, 0x108E8},100{0x10900, 0x10928},101{0x10940, 0x10944},102{0x10980, 0x10984},103{0x109C0, 0x109E8},104{0x10A00, 0x10A28},105{0x10A40, 0x10A50},106{0x11000, 0x11028},107{0x11030, 0x11034},108{0x11038, 0x11068},109{0x11070, 0x11074},110{0x11078, 0x110A8},111{0x110B0, 0x110B4},112{0x110B8, 0x110E8},113{0x110F0, 0x110F4},114{0x110F8, 0x11128},115{0x11138, 0x11144},116{0x11178, 0x11180},117{0x111B8, 0x111C0},118{0x111F8, 0x11200},119{0x11238, 0x1123C},120{0x11270, 0x11274},121{0x11278, 0x1127C},122{0x112B0, 0x112B4},123{0x112B8, 0x112BC},124{0x112F0, 0x112F4},125{0x112F8, 0x112FC},126{0x11338, 0x1133C},127{0x11378, 0x1137C},128{0x113B8, 0x113BC},129{0x113F8, 0x113FC},130{0x11438, 0x11440},131{0x11478, 0x11480},132{0x114B8, 0x114BC},133{0x114F8, 0x114FC},134{0x11538, 0x1153C},135{0x11578, 0x1157C},136{0x115B8, 0x115BC},137{0x115F8, 0x115FC},138{0x11638, 0x1163C},139{0x11678, 0x1167C},140{0x116B8, 0x116BC},141{0x116F8, 0x116FC},142{0x11738, 0x1173C},143{0x11778, 0x1177C},144{0x117B8, 0x117BC},145{0x117F8, 0x117FC},146{0x17000, 0x1701C},147{0x17020, 0x170AC},148{0x18000, 0x18050},149{0x18054, 0x18074},150{0x18080, 0x180D4},151{0x180DC, 0x18104},152{0x18108, 0x1813C},153{0x18144, 0x18148},154{0x18168, 0x18174},155{0x18178, 0x18180},156{0x181C8, 0x181E0},157{0x181E4, 0x181E8},158{0x181EC, 0x1820C},159{0x1825C, 0x18280},160{0x18284, 0x18290},161{0x18294, 0x182A0},162{0x18300, 0x18304},163{0x18314, 0x18320},164{0x18328, 0x18350},165{0x1835C, 0x1836C},166{0x18370, 0x18390},167{0x18398, 0x183AC},168{0x183BC, 0x183D8},169{0x183DC, 0x183F4},170{0x18400, 0x186F4},171{0x186F8, 0x1871C},172{0x18720, 0x18790},173{0x19800, 0x19830},174{0x19834, 0x19840},175{0x19880, 0x1989C},176{0x198A4, 0x198B0},177{0x198BC, 0x19900},178{0x19C00, 0x19C88},179{0x19D00, 0x19D20},180{0x19E00, 0x19E7C},181{0x19E80, 0x19E94},182{0x19E98, 0x19EAC},183{0x19EB0, 0x19EBC},184{0x19F70, 0x19F74},185{0x19F80, 0x19F8C},186{0x19FA0, 0x19FB4},187{0x19FC0, 0x19FD8},188{0x1A000, 0x1A200},189{0x1A204, 0x1A210},190{0x1A228, 0x1A22C},191{0x1A230, 0x1A248},192{0x1A250, 0x1A270},193{0x1A280, 0x1A290},194{0x1A2A0, 0x1A2A4},195{0x1A2C0, 0x1A2EC},196{0x1A300, 0x1A3BC},197{0x1A3F0, 0x1A3F4},198{0x1A3F8, 0x1A434},199{0x1A438, 0x1A444},200{0x1A448, 0x1A468},201{0x1A580, 0x1A58C},202{0x1A644, 0x1A654},203{0x1A670, 0x1A698},204{0x1A6AC, 0x1A6B0},205{0x1A6D0, 0x1A6D4},206{0x1A6EC, 0x1A70C},207{0x1A710, 0x1A738},208{0x1A7C0, 0x1A7D0},209{0x1A7D4, 0x1A7D8},210{0x1A7DC, 0x1A7E4},211{0x1A7F0, 0x1A7F8},212{0x1A888, 0x1A89C},213{0x1A8A8, 0x1A8AC},214{0x1A8C0, 0x1A8DC},215{0x1A8F0, 0x1A8FC},216{0x1AE04, 0x1AE08},217{0x1AE18, 0x1AE24},218{0x1AF80, 0x1AF8C},219{0x1AFA0, 0x1AFB4},220{0x1B000, 0x1B200},221{0x1B284, 0x1B288},222{0x1B2D0, 0x1B2D8},223{0x1B2DC, 0x1B2EC},224{0x1B300, 0x1B340},225{0x1B374, 0x1B378},226{0x1B380, 0x1B384},227{0x1B388, 0x1B38C},228{0x1B404, 0x1B408},229{0x1B420, 0x1B428},230{0x1B440, 0x1B444},231{0x1B448, 0x1B44C},232{0x1B450, 0x1B458},233{0x1B45C, 0x1B468},234{0x1B584, 0x1B58C},235{0x1B68C, 0x1B690},236{0x1B6AC, 0x1B6B0},237{0x1B7F0, 0x1B7F8},238{0x1C800, 0x1CC00},239{0x1CE00, 0x1CE04},240{0x1CF80, 0x1CF84},241{0x1D200, 0x1D800},242{0x1E000, 0x20014},243{0x20100, 0x20124},244{0x21400, 0x217A8},245{0x21800, 0x21BA8},246{0x21C00, 0x21FA8},247{0x22000, 0x223A8},248{0x22400, 0x227A8},249{0x22800, 0x22BA8},250{0x22C00, 0x22FA8},251{0x23000, 0x233A8},252{0x24000, 0x24034},253{0x26000, 0x26064},254{0x27000, 0x27024},255{0x34000, 0x3400C},256{0x34400, 0x3445C},257{0x34800, 0x3485C},258{0x34C00, 0x34C5C},259{0x35000, 0x3505C},260{0x35400, 0x3545C},261{0x35800, 0x3585C},262{0x35C00, 0x35C5C},263{0x36000, 0x3605C},264{0x38000, 0x38064},265{0x38070, 0x380E0},266{0x3A000, 0x3A064},267{0x40000, 0x400A4},268{0x80000, 0x8000C},269{0x80010, 0x80020},270};271272static const struct ath10k_mem_section qca6174_hw30_sdio_register_sections[] = {273{0x800, 0x810},274{0x820, 0x82C},275{0x830, 0x8F4},276{0x90C, 0x91C},277{0xA14, 0xA18},278{0xA84, 0xA94},279{0xAA8, 0xAD4},280{0xADC, 0xB40},281{0x1000, 0x10A4},282{0x10BC, 0x111C},283{0x1134, 0x1138},284{0x1144, 0x114C},285{0x1150, 0x115C},286{0x1160, 0x1178},287{0x1240, 0x1260},288{0x2000, 0x207C},289{0x3000, 0x3014},290{0x4000, 0x4014},291{0x5000, 0x5124},292{0x6000, 0x6040},293{0x6080, 0x60CC},294{0x6100, 0x611C},295{0x6140, 0x61D8},296{0x6200, 0x6238},297{0x6240, 0x628C},298{0x62C0, 0x62EC},299{0x6380, 0x63E8},300{0x6400, 0x6440},301{0x6480, 0x64CC},302{0x6500, 0x651C},303{0x6540, 0x6580},304{0x6600, 0x6638},305{0x6640, 0x668C},306{0x66C0, 0x66EC},307{0x6780, 0x67E8},308{0x7080, 0x708C},309{0x70C0, 0x70C8},310{0x7400, 0x741C},311{0x7440, 0x7454},312{0x7800, 0x7818},313{0x8010, 0x8060},314{0x8080, 0x8084},315{0x80A0, 0x80A4},316{0x80C0, 0x80C4},317{0x80E0, 0x80ec},318{0x8110, 0x8128},319{0x9000, 0x9004},320{0xF000, 0xF0E0},321{0xF140, 0xF190},322{0xF250, 0xF25C},323{0xF260, 0xF268},324{0xF26C, 0xF2A8},325{0x10008, 0x1000C},326{0x10014, 0x10018},327{0x1001C, 0x10020},328{0x10024, 0x10028},329{0x10030, 0x10034},330{0x10040, 0x10054},331{0x10058, 0x1007C},332{0x10080, 0x100C4},333{0x100C8, 0x10114},334{0x1012C, 0x10130},335{0x10138, 0x10144},336{0x10200, 0x10220},337{0x10230, 0x10250},338{0x10260, 0x10280},339{0x10290, 0x102B0},340{0x102C0, 0x102DC},341{0x102E0, 0x102F4},342{0x102FC, 0x1037C},343{0x10380, 0x10390},344{0x10800, 0x10828},345{0x10840, 0x10844},346{0x10880, 0x10884},347{0x108C0, 0x108E8},348{0x10900, 0x10928},349{0x10940, 0x10944},350{0x10980, 0x10984},351{0x109C0, 0x109E8},352{0x10A00, 0x10A28},353{0x10A40, 0x10A50},354{0x11000, 0x11028},355{0x11030, 0x11034},356{0x11038, 0x11068},357{0x11070, 0x11074},358{0x11078, 0x110A8},359{0x110B0, 0x110B4},360{0x110B8, 0x110E8},361{0x110F0, 0x110F4},362{0x110F8, 0x11128},363{0x11138, 0x11144},364{0x11178, 0x11180},365{0x111B8, 0x111C0},366{0x111F8, 0x11200},367{0x11238, 0x1123C},368{0x11270, 0x11274},369{0x11278, 0x1127C},370{0x112B0, 0x112B4},371{0x112B8, 0x112BC},372{0x112F0, 0x112F4},373{0x112F8, 0x112FC},374{0x11338, 0x1133C},375{0x11378, 0x1137C},376{0x113B8, 0x113BC},377{0x113F8, 0x113FC},378{0x11438, 0x11440},379{0x11478, 0x11480},380{0x114B8, 0x114BC},381{0x114F8, 0x114FC},382{0x11538, 0x1153C},383{0x11578, 0x1157C},384{0x115B8, 0x115BC},385{0x115F8, 0x115FC},386{0x11638, 0x1163C},387{0x11678, 0x1167C},388{0x116B8, 0x116BC},389{0x116F8, 0x116FC},390{0x11738, 0x1173C},391{0x11778, 0x1177C},392{0x117B8, 0x117BC},393{0x117F8, 0x117FC},394{0x17000, 0x1701C},395{0x17020, 0x170AC},396{0x18000, 0x18050},397{0x18054, 0x18074},398{0x18080, 0x180D4},399{0x180DC, 0x18104},400{0x18108, 0x1813C},401{0x18144, 0x18148},402{0x18168, 0x18174},403{0x18178, 0x18180},404{0x181C8, 0x181E0},405{0x181E4, 0x181E8},406{0x181EC, 0x1820C},407{0x1825C, 0x18280},408{0x18284, 0x18290},409{0x18294, 0x182A0},410{0x18300, 0x18304},411{0x18314, 0x18320},412{0x18328, 0x18350},413{0x1835C, 0x1836C},414{0x18370, 0x18390},415{0x18398, 0x183AC},416{0x183BC, 0x183D8},417{0x183DC, 0x183F4},418{0x18400, 0x186F4},419{0x186F8, 0x1871C},420{0x18720, 0x18790},421{0x19800, 0x19830},422{0x19834, 0x19840},423{0x19880, 0x1989C},424{0x198A4, 0x198B0},425{0x198BC, 0x19900},426{0x19C00, 0x19C88},427{0x19D00, 0x19D20},428{0x19E00, 0x19E7C},429{0x19E80, 0x19E94},430{0x19E98, 0x19EAC},431{0x19EB0, 0x19EBC},432{0x19F70, 0x19F74},433{0x19F80, 0x19F8C},434{0x19FA0, 0x19FB4},435{0x19FC0, 0x19FD8},436{0x1A000, 0x1A200},437{0x1A204, 0x1A210},438{0x1A228, 0x1A22C},439{0x1A230, 0x1A248},440{0x1A250, 0x1A270},441{0x1A280, 0x1A290},442{0x1A2A0, 0x1A2A4},443{0x1A2C0, 0x1A2EC},444{0x1A300, 0x1A3BC},445{0x1A3F0, 0x1A3F4},446{0x1A3F8, 0x1A434},447{0x1A438, 0x1A444},448{0x1A448, 0x1A468},449{0x1A580, 0x1A58C},450{0x1A644, 0x1A654},451{0x1A670, 0x1A698},452{0x1A6AC, 0x1A6B0},453{0x1A6D0, 0x1A6D4},454{0x1A6EC, 0x1A70C},455{0x1A710, 0x1A738},456{0x1A7C0, 0x1A7D0},457{0x1A7D4, 0x1A7D8},458{0x1A7DC, 0x1A7E4},459{0x1A7F0, 0x1A7F8},460{0x1A888, 0x1A89C},461{0x1A8A8, 0x1A8AC},462{0x1A8C0, 0x1A8DC},463{0x1A8F0, 0x1A8FC},464{0x1AE04, 0x1AE08},465{0x1AE18, 0x1AE24},466{0x1AF80, 0x1AF8C},467{0x1AFA0, 0x1AFB4},468{0x1B000, 0x1B200},469{0x1B284, 0x1B288},470{0x1B2D0, 0x1B2D8},471{0x1B2DC, 0x1B2EC},472{0x1B300, 0x1B340},473{0x1B374, 0x1B378},474{0x1B380, 0x1B384},475{0x1B388, 0x1B38C},476{0x1B404, 0x1B408},477{0x1B420, 0x1B428},478{0x1B440, 0x1B444},479{0x1B448, 0x1B44C},480{0x1B450, 0x1B458},481{0x1B45C, 0x1B468},482{0x1B584, 0x1B58C},483{0x1B68C, 0x1B690},484{0x1B6AC, 0x1B6B0},485{0x1B7F0, 0x1B7F8},486{0x1C800, 0x1CC00},487{0x1CE00, 0x1CE04},488{0x1CF80, 0x1CF84},489{0x1D200, 0x1D800},490{0x1E000, 0x20014},491{0x20100, 0x20124},492{0x21400, 0x217A8},493{0x21800, 0x21BA8},494{0x21C00, 0x21FA8},495{0x22000, 0x223A8},496{0x22400, 0x227A8},497{0x22800, 0x22BA8},498{0x22C00, 0x22FA8},499{0x23000, 0x233A8},500{0x24000, 0x24034},501502/* EFUSE0,1,2 is disabled here503* because its state may be reset504*505* {0x24800, 0x24804},506* {0x25000, 0x25004},507* {0x25800, 0x25804},508*/509510{0x26000, 0x26064},511{0x27000, 0x27024},512{0x34000, 0x3400C},513{0x34400, 0x3445C},514{0x34800, 0x3485C},515{0x34C00, 0x34C5C},516{0x35000, 0x3505C},517{0x35400, 0x3545C},518{0x35800, 0x3585C},519{0x35C00, 0x35C5C},520{0x36000, 0x3605C},521{0x38000, 0x38064},522{0x38070, 0x380E0},523{0x3A000, 0x3A074},524525/* DBI windows is skipped here, it can be only accessed when pcie526* is active (not in reset) and CORE_CTRL_PCIE_LTSSM_EN = 0 &&527* PCIE_CTRL_APP_LTSSM_ENALBE=0.528* {0x3C000 , 0x3C004},529*/530531{0x40000, 0x400A4},532533/* SI register is skipped here.534* Because it will cause bus hang535*536* {0x50000, 0x50018},537*/538539{0x80000, 0x8000C},540{0x80010, 0x80020},541};542543static const struct ath10k_mem_section qca6174_hw30_register_sections[] = {544{0x800, 0x810},545{0x820, 0x82C},546{0x830, 0x8F4},547{0x90C, 0x91C},548{0xA14, 0xA18},549{0xA84, 0xA94},550{0xAA8, 0xAD4},551{0xADC, 0xB40},552{0x1000, 0x10A4},553{0x10BC, 0x111C},554{0x1134, 0x1138},555{0x1144, 0x114C},556{0x1150, 0x115C},557{0x1160, 0x1178},558{0x1240, 0x1260},559{0x2000, 0x207C},560{0x3000, 0x3014},561{0x4000, 0x4014},562{0x5000, 0x5124},563{0x6000, 0x6040},564{0x6080, 0x60CC},565{0x6100, 0x611C},566{0x6140, 0x61D8},567{0x6200, 0x6238},568{0x6240, 0x628C},569{0x62C0, 0x62EC},570{0x6380, 0x63E8},571{0x6400, 0x6440},572{0x6480, 0x64CC},573{0x6500, 0x651C},574{0x6540, 0x6580},575{0x6600, 0x6638},576{0x6640, 0x668C},577{0x66C0, 0x66EC},578{0x6780, 0x67E8},579{0x7080, 0x708C},580{0x70C0, 0x70C8},581{0x7400, 0x741C},582{0x7440, 0x7454},583{0x7800, 0x7818},584{0x8000, 0x8004},585{0x8010, 0x8064},586{0x8080, 0x8084},587{0x80A0, 0x80A4},588{0x80C0, 0x80C4},589{0x80E0, 0x80F4},590{0x8100, 0x8104},591{0x8110, 0x812C},592{0x9000, 0x9004},593{0x9800, 0x982C},594{0x9830, 0x9838},595{0x9840, 0x986C},596{0x9870, 0x9898},597{0x9A00, 0x9C00},598{0xD580, 0xD59C},599{0xF000, 0xF0E0},600{0xF140, 0xF190},601{0xF250, 0xF25C},602{0xF260, 0xF268},603{0xF26C, 0xF2A8},604{0x10008, 0x1000C},605{0x10014, 0x10018},606{0x1001C, 0x10020},607{0x10024, 0x10028},608{0x10030, 0x10034},609{0x10040, 0x10054},610{0x10058, 0x1007C},611{0x10080, 0x100C4},612{0x100C8, 0x10114},613{0x1012C, 0x10130},614{0x10138, 0x10144},615{0x10200, 0x10220},616{0x10230, 0x10250},617{0x10260, 0x10280},618{0x10290, 0x102B0},619{0x102C0, 0x102DC},620{0x102E0, 0x102F4},621{0x102FC, 0x1037C},622{0x10380, 0x10390},623{0x10800, 0x10828},624{0x10840, 0x10844},625{0x10880, 0x10884},626{0x108C0, 0x108E8},627{0x10900, 0x10928},628{0x10940, 0x10944},629{0x10980, 0x10984},630{0x109C0, 0x109E8},631{0x10A00, 0x10A28},632{0x10A40, 0x10A50},633{0x11000, 0x11028},634{0x11030, 0x11034},635{0x11038, 0x11068},636{0x11070, 0x11074},637{0x11078, 0x110A8},638{0x110B0, 0x110B4},639{0x110B8, 0x110E8},640{0x110F0, 0x110F4},641{0x110F8, 0x11128},642{0x11138, 0x11144},643{0x11178, 0x11180},644{0x111B8, 0x111C0},645{0x111F8, 0x11200},646{0x11238, 0x1123C},647{0x11270, 0x11274},648{0x11278, 0x1127C},649{0x112B0, 0x112B4},650{0x112B8, 0x112BC},651{0x112F0, 0x112F4},652{0x112F8, 0x112FC},653{0x11338, 0x1133C},654{0x11378, 0x1137C},655{0x113B8, 0x113BC},656{0x113F8, 0x113FC},657{0x11438, 0x11440},658{0x11478, 0x11480},659{0x114B8, 0x114BC},660{0x114F8, 0x114FC},661{0x11538, 0x1153C},662{0x11578, 0x1157C},663{0x115B8, 0x115BC},664{0x115F8, 0x115FC},665{0x11638, 0x1163C},666{0x11678, 0x1167C},667{0x116B8, 0x116BC},668{0x116F8, 0x116FC},669{0x11738, 0x1173C},670{0x11778, 0x1177C},671{0x117B8, 0x117BC},672{0x117F8, 0x117FC},673{0x17000, 0x1701C},674{0x17020, 0x170AC},675{0x18000, 0x18050},676{0x18054, 0x18074},677{0x18080, 0x180D4},678{0x180DC, 0x18104},679{0x18108, 0x1813C},680{0x18144, 0x18148},681{0x18168, 0x18174},682{0x18178, 0x18180},683{0x181C8, 0x181E0},684{0x181E4, 0x181E8},685{0x181EC, 0x1820C},686{0x1825C, 0x18280},687{0x18284, 0x18290},688{0x18294, 0x182A0},689{0x18300, 0x18304},690{0x18314, 0x18320},691{0x18328, 0x18350},692{0x1835C, 0x1836C},693{0x18370, 0x18390},694{0x18398, 0x183AC},695{0x183BC, 0x183D8},696{0x183DC, 0x183F4},697{0x18400, 0x186F4},698{0x186F8, 0x1871C},699{0x18720, 0x18790},700{0x19800, 0x19830},701{0x19834, 0x19840},702{0x19880, 0x1989C},703{0x198A4, 0x198B0},704{0x198BC, 0x19900},705{0x19C00, 0x19C88},706{0x19D00, 0x19D20},707{0x19E00, 0x19E7C},708{0x19E80, 0x19E94},709{0x19E98, 0x19EAC},710{0x19EB0, 0x19EBC},711{0x19F70, 0x19F74},712{0x19F80, 0x19F8C},713{0x19FA0, 0x19FB4},714{0x19FC0, 0x19FD8},715{0x1A000, 0x1A200},716{0x1A204, 0x1A210},717{0x1A228, 0x1A22C},718{0x1A230, 0x1A248},719{0x1A250, 0x1A270},720{0x1A280, 0x1A290},721{0x1A2A0, 0x1A2A4},722{0x1A2C0, 0x1A2EC},723{0x1A300, 0x1A3BC},724{0x1A3F0, 0x1A3F4},725{0x1A3F8, 0x1A434},726{0x1A438, 0x1A444},727{0x1A448, 0x1A468},728{0x1A580, 0x1A58C},729{0x1A644, 0x1A654},730{0x1A670, 0x1A698},731{0x1A6AC, 0x1A6B0},732{0x1A6D0, 0x1A6D4},733{0x1A6EC, 0x1A70C},734{0x1A710, 0x1A738},735{0x1A7C0, 0x1A7D0},736{0x1A7D4, 0x1A7D8},737{0x1A7DC, 0x1A7E4},738{0x1A7F0, 0x1A7F8},739{0x1A888, 0x1A89C},740{0x1A8A8, 0x1A8AC},741{0x1A8C0, 0x1A8DC},742{0x1A8F0, 0x1A8FC},743{0x1AE04, 0x1AE08},744{0x1AE18, 0x1AE24},745{0x1AF80, 0x1AF8C},746{0x1AFA0, 0x1AFB4},747{0x1B000, 0x1B200},748{0x1B284, 0x1B288},749{0x1B2D0, 0x1B2D8},750{0x1B2DC, 0x1B2EC},751{0x1B300, 0x1B340},752{0x1B374, 0x1B378},753{0x1B380, 0x1B384},754{0x1B388, 0x1B38C},755{0x1B404, 0x1B408},756{0x1B420, 0x1B428},757{0x1B440, 0x1B444},758{0x1B448, 0x1B44C},759{0x1B450, 0x1B458},760{0x1B45C, 0x1B468},761{0x1B584, 0x1B58C},762{0x1B68C, 0x1B690},763{0x1B6AC, 0x1B6B0},764{0x1B7F0, 0x1B7F8},765{0x1C800, 0x1CC00},766{0x1CE00, 0x1CE04},767{0x1CF80, 0x1CF84},768{0x1D200, 0x1D800},769{0x1E000, 0x20014},770{0x20100, 0x20124},771{0x21400, 0x217A8},772{0x21800, 0x21BA8},773{0x21C00, 0x21FA8},774{0x22000, 0x223A8},775{0x22400, 0x227A8},776{0x22800, 0x22BA8},777{0x22C00, 0x22FA8},778{0x23000, 0x233A8},779{0x24000, 0x24034},780{0x26000, 0x26064},781{0x27000, 0x27024},782{0x34000, 0x3400C},783{0x34400, 0x3445C},784{0x34800, 0x3485C},785{0x34C00, 0x34C5C},786{0x35000, 0x3505C},787{0x35400, 0x3545C},788{0x35800, 0x3585C},789{0x35C00, 0x35C5C},790{0x36000, 0x3605C},791{0x38000, 0x38064},792{0x38070, 0x380E0},793{0x3A000, 0x3A074},794{0x40000, 0x400A4},795{0x80000, 0x8000C},796{0x80010, 0x80020},797};798799static const struct ath10k_mem_region qca6174_hw10_mem_regions[] = {800{801.type = ATH10K_MEM_REGION_TYPE_DRAM,802.start = 0x400000,803.len = 0x70000,804.name = "DRAM",805.section_table = {806.sections = NULL,807.size = 0,808},809},810{811.type = ATH10K_MEM_REGION_TYPE_REG,812813/* RTC_SOC_BASE_ADDRESS */814.start = 0x0,815816/* WLAN_MBOX_BASE_ADDRESS - RTC_SOC_BASE_ADDRESS */817.len = 0x800 - 0x0,818819.name = "REG_PART1",820.section_table = {821.sections = NULL,822.size = 0,823},824},825{826.type = ATH10K_MEM_REGION_TYPE_REG,827828/* STEREO_BASE_ADDRESS */829.start = 0x27000,830831/* USB_BASE_ADDRESS - STEREO_BASE_ADDRESS */832.len = 0x60000 - 0x27000,833834.name = "REG_PART2",835.section_table = {836.sections = NULL,837.size = 0,838},839},840};841842static const struct ath10k_mem_region qca6174_hw21_mem_regions[] = {843{844.type = ATH10K_MEM_REGION_TYPE_DRAM,845.start = 0x400000,846.len = 0x70000,847.name = "DRAM",848.section_table = {849.sections = NULL,850.size = 0,851},852},853{854.type = ATH10K_MEM_REGION_TYPE_AXI,855.start = 0xa0000,856.len = 0x18000,857.name = "AXI",858.section_table = {859.sections = NULL,860.size = 0,861},862},863{864.type = ATH10K_MEM_REGION_TYPE_REG,865.start = 0x800,866.len = 0x80020 - 0x800,867.name = "REG_TOTAL",868.section_table = {869.sections = qca6174_hw21_register_sections,870.size = ARRAY_SIZE(qca6174_hw21_register_sections),871},872},873};874875static const struct ath10k_mem_region qca6174_hw30_sdio_mem_regions[] = {876{877.type = ATH10K_MEM_REGION_TYPE_DRAM,878.start = 0x400000,879.len = 0xa8000,880.name = "DRAM",881.section_table = {882.sections = NULL,883.size = 0,884},885},886{887.type = ATH10K_MEM_REGION_TYPE_AXI,888.start = 0xa0000,889.len = 0x18000,890.name = "AXI",891.section_table = {892.sections = NULL,893.size = 0,894},895},896{897.type = ATH10K_MEM_REGION_TYPE_IRAM1,898.start = 0x00980000,899.len = 0x00080000,900.name = "IRAM1",901.section_table = {902.sections = NULL,903.size = 0,904},905},906{907.type = ATH10K_MEM_REGION_TYPE_IRAM2,908.start = 0x00a00000,909.len = 0x00040000,910.name = "IRAM2",911.section_table = {912.sections = NULL,913.size = 0,914},915},916{917.type = ATH10K_MEM_REGION_TYPE_REG,918.start = 0x800,919.len = 0x80020 - 0x800,920.name = "REG_TOTAL",921.section_table = {922.sections = qca6174_hw30_sdio_register_sections,923.size = ARRAY_SIZE(qca6174_hw30_sdio_register_sections),924},925},926};927928static const struct ath10k_mem_region qca6174_hw30_mem_regions[] = {929{930.type = ATH10K_MEM_REGION_TYPE_DRAM,931.start = 0x400000,932.len = 0xa8000,933.name = "DRAM",934.section_table = {935.sections = NULL,936.size = 0,937},938},939{940.type = ATH10K_MEM_REGION_TYPE_AXI,941.start = 0xa0000,942.len = 0x18000,943.name = "AXI",944.section_table = {945.sections = NULL,946.size = 0,947},948},949{950.type = ATH10K_MEM_REGION_TYPE_REG,951.start = 0x800,952.len = 0x80020 - 0x800,953.name = "REG_TOTAL",954.section_table = {955.sections = qca6174_hw30_register_sections,956.size = ARRAY_SIZE(qca6174_hw30_register_sections),957},958},959960/* IRAM dump must be put last */961{962.type = ATH10K_MEM_REGION_TYPE_IRAM1,963.start = 0x00980000,964.len = 0x00080000,965.name = "IRAM1",966.section_table = {967.sections = NULL,968.size = 0,969},970},971{972.type = ATH10K_MEM_REGION_TYPE_IRAM2,973.start = 0x00a00000,974.len = 0x00040000,975.name = "IRAM2",976.section_table = {977.sections = NULL,978.size = 0,979},980},981};982983static const struct ath10k_mem_region qca988x_hw20_mem_regions[] = {984{985.type = ATH10K_MEM_REGION_TYPE_DRAM,986.start = 0x400000,987.len = 0x50000,988.name = "DRAM",989.section_table = {990.sections = NULL,991.size = 0,992},993},994{995.type = ATH10K_MEM_REGION_TYPE_REG,996.start = 0x4000,997.len = 0x2000,998.name = "REG_PART1",999.section_table = {1000.sections = NULL,1001.size = 0,1002},1003},1004{1005.type = ATH10K_MEM_REGION_TYPE_REG,1006.start = 0x8000,1007.len = 0x58000,1008.name = "REG_PART2",1009.section_table = {1010.sections = NULL,1011.size = 0,1012},1013},1014};10151016static const struct ath10k_mem_region qca99x0_hw20_mem_regions[] = {1017{1018.type = ATH10K_MEM_REGION_TYPE_DRAM,1019.start = 0x400000,1020.len = 0x60000,1021.name = "DRAM",1022.section_table = {1023.sections = NULL,1024.size = 0,1025},1026},1027{1028.type = ATH10K_MEM_REGION_TYPE_REG,1029.start = 0x980000,1030.len = 0x50000,1031.name = "IRAM",1032.section_table = {1033.sections = NULL,1034.size = 0,1035},1036},1037{1038.type = ATH10K_MEM_REGION_TYPE_IOSRAM,1039.start = 0xC0000,1040.len = 0x40000,1041.name = "SRAM",1042.section_table = {1043.sections = NULL,1044.size = 0,1045},1046},1047{1048.type = ATH10K_MEM_REGION_TYPE_IOREG,1049.start = 0x30000,1050.len = 0x7000,1051.name = "APB REG 1",1052.section_table = {1053.sections = NULL,1054.size = 0,1055},1056},1057{1058.type = ATH10K_MEM_REGION_TYPE_IOREG,1059.start = 0x3f000,1060.len = 0x3000,1061.name = "APB REG 2",1062.section_table = {1063.sections = NULL,1064.size = 0,1065},1066},1067{1068.type = ATH10K_MEM_REGION_TYPE_IOREG,1069.start = 0x43000,1070.len = 0x3000,1071.name = "WIFI REG",1072.section_table = {1073.sections = NULL,1074.size = 0,1075},1076},1077{1078.type = ATH10K_MEM_REGION_TYPE_IOREG,1079.start = 0x4A000,1080.len = 0x5000,1081.name = "CE REG",1082.section_table = {1083.sections = NULL,1084.size = 0,1085},1086},1087{1088.type = ATH10K_MEM_REGION_TYPE_IOREG,1089.start = 0x80000,1090.len = 0x6000,1091.name = "SOC REG",1092.section_table = {1093.sections = NULL,1094.size = 0,1095},1096},1097};10981099static const struct ath10k_mem_region qca9984_hw10_mem_regions[] = {1100{1101.type = ATH10K_MEM_REGION_TYPE_DRAM,1102.start = 0x400000,1103.len = 0x80000,1104.name = "DRAM",1105.section_table = {1106.sections = NULL,1107.size = 0,1108},1109},1110{1111.type = ATH10K_MEM_REGION_TYPE_REG,1112.start = 0x980000,1113.len = 0x50000,1114.name = "IRAM",1115.section_table = {1116.sections = NULL,1117.size = 0,1118},1119},1120{1121.type = ATH10K_MEM_REGION_TYPE_IOSRAM,1122.start = 0xC0000,1123.len = 0x40000,1124.name = "SRAM",1125.section_table = {1126.sections = NULL,1127.size = 0,1128},1129},1130{1131.type = ATH10K_MEM_REGION_TYPE_IOREG,1132.start = 0x30000,1133.len = 0x7000,1134.name = "APB REG 1",1135.section_table = {1136.sections = NULL,1137.size = 0,1138},1139},1140{1141.type = ATH10K_MEM_REGION_TYPE_IOREG,1142.start = 0x3f000,1143.len = 0x3000,1144.name = "APB REG 2",1145.section_table = {1146.sections = NULL,1147.size = 0,1148},1149},1150{1151.type = ATH10K_MEM_REGION_TYPE_IOREG,1152.start = 0x43000,1153.len = 0x3000,1154.name = "WIFI REG",1155.section_table = {1156.sections = NULL,1157.size = 0,1158},1159},1160{1161.type = ATH10K_MEM_REGION_TYPE_IOREG,1162.start = 0x4A000,1163.len = 0x5000,1164.name = "CE REG",1165.section_table = {1166.sections = NULL,1167.size = 0,1168},1169},1170{1171.type = ATH10K_MEM_REGION_TYPE_IOREG,1172.start = 0x80000,1173.len = 0x6000,1174.name = "SOC REG",1175.section_table = {1176.sections = NULL,1177.size = 0,1178},1179},1180};11811182static const struct ath10k_mem_section ipq4019_soc_reg_range[] = {1183{0x080000, 0x080004},1184{0x080020, 0x080024},1185{0x080028, 0x080050},1186{0x0800d4, 0x0800ec},1187{0x08010c, 0x080118},1188{0x080284, 0x080290},1189{0x0802a8, 0x0802b8},1190{0x0802dc, 0x08030c},1191{0x082000, 0x083fff}1192};11931194static const struct ath10k_mem_region qca4019_hw10_mem_regions[] = {1195{1196.type = ATH10K_MEM_REGION_TYPE_DRAM,1197.start = 0x400000,1198.len = 0x68000,1199.name = "DRAM",1200.section_table = {1201.sections = NULL,1202.size = 0,1203},1204},1205{1206.type = ATH10K_MEM_REGION_TYPE_REG,1207.start = 0xC0000,1208.len = 0x40000,1209.name = "SRAM",1210.section_table = {1211.sections = NULL,1212.size = 0,1213},1214},1215{1216.type = ATH10K_MEM_REGION_TYPE_REG,1217.start = 0x980000,1218.len = 0x50000,1219.name = "IRAM",1220.section_table = {1221.sections = NULL,1222.size = 0,1223},1224},1225{1226.type = ATH10K_MEM_REGION_TYPE_IOREG,1227.start = 0x30000,1228.len = 0x7000,1229.name = "APB REG 1",1230.section_table = {1231.sections = NULL,1232.size = 0,1233},1234},1235{1236.type = ATH10K_MEM_REGION_TYPE_IOREG,1237.start = 0x3f000,1238.len = 0x3000,1239.name = "APB REG 2",1240.section_table = {1241.sections = NULL,1242.size = 0,1243},1244},1245{1246.type = ATH10K_MEM_REGION_TYPE_IOREG,1247.start = 0x43000,1248.len = 0x3000,1249.name = "WIFI REG",1250.section_table = {1251.sections = NULL,1252.size = 0,1253},1254},1255{1256.type = ATH10K_MEM_REGION_TYPE_IOREG,1257.start = 0x4A000,1258.len = 0x5000,1259.name = "CE REG",1260.section_table = {1261.sections = NULL,1262.size = 0,1263},1264},1265{1266.type = ATH10K_MEM_REGION_TYPE_REG,1267.start = 0x080000,1268.len = 0x083fff - 0x080000,1269.name = "REG_TOTAL",1270.section_table = {1271.sections = ipq4019_soc_reg_range,1272.size = ARRAY_SIZE(ipq4019_soc_reg_range),1273},1274},1275};12761277static const struct ath10k_mem_region wcn399x_hw10_mem_regions[] = {1278{1279/* MSA region start is not fixed, hence it is assigned at runtime */1280.type = ATH10K_MEM_REGION_TYPE_MSA,1281.len = 0x100000,1282.name = "DRAM",1283.section_table = {1284.sections = NULL,1285.size = 0,1286},1287},1288};12891290static const struct ath10k_hw_mem_layout hw_mem_layouts[] = {1291{1292.hw_id = QCA6174_HW_1_0_VERSION,1293.hw_rev = ATH10K_HW_QCA6174,1294.bus = ATH10K_BUS_PCI,1295.region_table = {1296.regions = qca6174_hw10_mem_regions,1297.size = ARRAY_SIZE(qca6174_hw10_mem_regions),1298},1299},1300{1301.hw_id = QCA6174_HW_1_1_VERSION,1302.hw_rev = ATH10K_HW_QCA6174,1303.bus = ATH10K_BUS_PCI,1304.region_table = {1305.regions = qca6174_hw10_mem_regions,1306.size = ARRAY_SIZE(qca6174_hw10_mem_regions),1307},1308},1309{1310.hw_id = QCA6174_HW_1_3_VERSION,1311.hw_rev = ATH10K_HW_QCA6174,1312.bus = ATH10K_BUS_PCI,1313.region_table = {1314.regions = qca6174_hw10_mem_regions,1315.size = ARRAY_SIZE(qca6174_hw10_mem_regions),1316},1317},1318{1319.hw_id = QCA6174_HW_2_1_VERSION,1320.hw_rev = ATH10K_HW_QCA6174,1321.bus = ATH10K_BUS_PCI,1322.region_table = {1323.regions = qca6174_hw21_mem_regions,1324.size = ARRAY_SIZE(qca6174_hw21_mem_regions),1325},1326},1327{1328.hw_id = QCA6174_HW_3_0_VERSION,1329.hw_rev = ATH10K_HW_QCA6174,1330.bus = ATH10K_BUS_PCI,1331.region_table = {1332.regions = qca6174_hw30_mem_regions,1333.size = ARRAY_SIZE(qca6174_hw30_mem_regions),1334},1335},1336{1337.hw_id = QCA6174_HW_3_2_VERSION,1338.hw_rev = ATH10K_HW_QCA6174,1339.bus = ATH10K_BUS_PCI,1340.region_table = {1341.regions = qca6174_hw30_mem_regions,1342.size = ARRAY_SIZE(qca6174_hw30_mem_regions),1343},1344},1345{1346.hw_id = QCA6174_HW_3_2_VERSION,1347.hw_rev = ATH10K_HW_QCA6174,1348.bus = ATH10K_BUS_SDIO,1349.region_table = {1350.regions = qca6174_hw30_sdio_mem_regions,1351.size = ARRAY_SIZE(qca6174_hw30_sdio_mem_regions),1352},1353},1354{1355.hw_id = QCA9377_HW_1_1_DEV_VERSION,1356.hw_rev = ATH10K_HW_QCA9377,1357.bus = ATH10K_BUS_PCI,1358.region_table = {1359.regions = qca6174_hw30_mem_regions,1360.size = ARRAY_SIZE(qca6174_hw30_mem_regions),1361},1362},1363{1364.hw_id = QCA988X_HW_2_0_VERSION,1365.hw_rev = ATH10K_HW_QCA988X,1366.bus = ATH10K_BUS_PCI,1367.region_table = {1368.regions = qca988x_hw20_mem_regions,1369.size = ARRAY_SIZE(qca988x_hw20_mem_regions),1370},1371},1372{1373.hw_id = QCA9984_HW_1_0_DEV_VERSION,1374.hw_rev = ATH10K_HW_QCA9984,1375.bus = ATH10K_BUS_PCI,1376.region_table = {1377.regions = qca9984_hw10_mem_regions,1378.size = ARRAY_SIZE(qca9984_hw10_mem_regions),1379},1380},1381{1382.hw_id = QCA9888_HW_2_0_DEV_VERSION,1383.hw_rev = ATH10K_HW_QCA9888,1384.bus = ATH10K_BUS_PCI,1385.region_table = {1386.regions = qca9984_hw10_mem_regions,1387.size = ARRAY_SIZE(qca9984_hw10_mem_regions),1388},1389},1390{1391.hw_id = QCA99X0_HW_2_0_DEV_VERSION,1392.hw_rev = ATH10K_HW_QCA99X0,1393.bus = ATH10K_BUS_PCI,1394.region_table = {1395.regions = qca99x0_hw20_mem_regions,1396.size = ARRAY_SIZE(qca99x0_hw20_mem_regions),1397},1398},1399{1400.hw_id = QCA4019_HW_1_0_DEV_VERSION,1401.hw_rev = ATH10K_HW_QCA4019,1402.bus = ATH10K_BUS_AHB,1403.region_table = {1404.regions = qca4019_hw10_mem_regions,1405.size = ARRAY_SIZE(qca4019_hw10_mem_regions),1406},1407},1408{1409.hw_id = WCN3990_HW_1_0_DEV_VERSION,1410.hw_rev = ATH10K_HW_WCN3990,1411.bus = ATH10K_BUS_SNOC,1412.region_table = {1413.regions = wcn399x_hw10_mem_regions,1414.size = ARRAY_SIZE(wcn399x_hw10_mem_regions),1415},1416},1417};14181419static u32 ath10k_coredump_get_ramdump_size(struct ath10k *ar)1420{1421const struct ath10k_hw_mem_layout *hw;1422const struct ath10k_mem_region *mem_region;1423size_t size = 0;1424int i;14251426hw = ath10k_coredump_get_mem_layout(ar);14271428if (!hw)1429return 0;14301431mem_region = &hw->region_table.regions[0];14321433for (i = 0; i < hw->region_table.size; i++) {1434size += mem_region->len;1435mem_region++;1436}14371438/* reserve space for the headers */1439size += hw->region_table.size * sizeof(struct ath10k_dump_ram_data_hdr);14401441/* make sure it is aligned 16 bytes for debug message print out */1442size = ALIGN(size, 16);14431444return size;1445}14461447const struct ath10k_hw_mem_layout *ath10k_coredump_get_mem_layout(struct ath10k *ar)1448{1449if (!test_bit(ATH10K_FW_CRASH_DUMP_RAM_DATA, &ath10k_coredump_mask))1450return NULL;14511452return _ath10k_coredump_get_mem_layout(ar);1453}1454EXPORT_SYMBOL(ath10k_coredump_get_mem_layout);14551456const struct ath10k_hw_mem_layout *_ath10k_coredump_get_mem_layout(struct ath10k *ar)1457{1458int i;14591460if (WARN_ON(ar->target_version == 0))1461return NULL;14621463for (i = 0; i < ARRAY_SIZE(hw_mem_layouts); i++) {1464if (ar->target_version == hw_mem_layouts[i].hw_id &&1465ar->hw_rev == hw_mem_layouts[i].hw_rev &&1466hw_mem_layouts[i].bus == ar->hif.bus)1467return &hw_mem_layouts[i];1468}14691470return NULL;1471}14721473struct ath10k_fw_crash_data *ath10k_coredump_new(struct ath10k *ar)1474{1475struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data;14761477lockdep_assert_held(&ar->dump_mutex);14781479if (ath10k_coredump_mask == 0)1480/* coredump disabled */1481return NULL;14821483guid_gen(&crash_data->guid);1484ktime_get_real_ts64(&crash_data->timestamp);14851486return crash_data;1487}1488EXPORT_SYMBOL(ath10k_coredump_new);14891490static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar)1491{1492struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data;1493struct ath10k_ce_crash_hdr *ce_hdr;1494struct ath10k_dump_file_data *dump_data;1495struct ath10k_tlv_dump_data *dump_tlv;1496size_t hdr_len = sizeof(*dump_data);1497size_t len, sofar = 0;1498unsigned char *buf;14991500len = hdr_len;15011502if (test_bit(ATH10K_FW_CRASH_DUMP_REGISTERS, &ath10k_coredump_mask))1503len += sizeof(*dump_tlv) + sizeof(crash_data->registers);15041505if (test_bit(ATH10K_FW_CRASH_DUMP_CE_DATA, &ath10k_coredump_mask))1506len += sizeof(*dump_tlv) + sizeof(*ce_hdr) +1507CE_COUNT * sizeof(ce_hdr->entries[0]);15081509if (test_bit(ATH10K_FW_CRASH_DUMP_RAM_DATA, &ath10k_coredump_mask))1510len += sizeof(*dump_tlv) + crash_data->ramdump_buf_len;15111512sofar += hdr_len;15131514/* This is going to get big when we start dumping FW RAM and such,1515* so go ahead and use vmalloc.1516*/1517buf = vzalloc(len);1518if (!buf)1519return NULL;15201521mutex_lock(&ar->dump_mutex);15221523dump_data = (struct ath10k_dump_file_data *)(buf);1524strscpy(dump_data->df_magic, "ATH10K-FW-DUMP",1525sizeof(dump_data->df_magic));1526dump_data->len = cpu_to_le32(len);15271528dump_data->version = cpu_to_le32(ATH10K_FW_CRASH_DUMP_VERSION);15291530guid_copy(&dump_data->guid, &crash_data->guid);1531dump_data->chip_id = cpu_to_le32(ar->bus_param.chip_id);1532dump_data->bus_type = cpu_to_le32(0);1533dump_data->target_version = cpu_to_le32(ar->target_version);1534dump_data->fw_version_major = cpu_to_le32(ar->fw_version_major);1535dump_data->fw_version_minor = cpu_to_le32(ar->fw_version_minor);1536dump_data->fw_version_release = cpu_to_le32(ar->fw_version_release);1537dump_data->fw_version_build = cpu_to_le32(ar->fw_version_build);1538dump_data->phy_capability = cpu_to_le32(ar->phy_capability);1539dump_data->hw_min_tx_power = cpu_to_le32(ar->hw_min_tx_power);1540dump_data->hw_max_tx_power = cpu_to_le32(ar->hw_max_tx_power);1541dump_data->ht_cap_info = cpu_to_le32(ar->ht_cap_info);1542dump_data->vht_cap_info = cpu_to_le32(ar->vht_cap_info);1543dump_data->num_rf_chains = cpu_to_le32(ar->num_rf_chains);15441545strscpy(dump_data->fw_ver, ar->hw->wiphy->fw_version,1546sizeof(dump_data->fw_ver));15471548dump_data->kernel_ver_code = 0;1549strscpy(dump_data->kernel_ver, init_utsname()->release,1550sizeof(dump_data->kernel_ver));15511552dump_data->tv_sec = cpu_to_le64(crash_data->timestamp.tv_sec);1553dump_data->tv_nsec = cpu_to_le64(crash_data->timestamp.tv_nsec);15541555if (test_bit(ATH10K_FW_CRASH_DUMP_REGISTERS, &ath10k_coredump_mask)) {1556dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar);1557dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_REGISTERS);1558dump_tlv->tlv_len = cpu_to_le32(sizeof(crash_data->registers));1559memcpy(dump_tlv->tlv_data, &crash_data->registers,1560sizeof(crash_data->registers));1561sofar += sizeof(*dump_tlv) + sizeof(crash_data->registers);1562}15631564if (test_bit(ATH10K_FW_CRASH_DUMP_CE_DATA, &ath10k_coredump_mask)) {1565dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar);1566dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_CE_DATA);1567dump_tlv->tlv_len = cpu_to_le32(struct_size(ce_hdr, entries,1568CE_COUNT));1569ce_hdr = (struct ath10k_ce_crash_hdr *)(dump_tlv->tlv_data);1570ce_hdr->ce_count = cpu_to_le32(CE_COUNT);1571memset(ce_hdr->reserved, 0, sizeof(ce_hdr->reserved));1572memcpy(ce_hdr->entries, crash_data->ce_crash_data,1573CE_COUNT * sizeof(ce_hdr->entries[0]));1574sofar += sizeof(*dump_tlv) + sizeof(*ce_hdr) +1575CE_COUNT * sizeof(ce_hdr->entries[0]);1576}15771578/* Gather ram dump */1579if (test_bit(ATH10K_FW_CRASH_DUMP_RAM_DATA, &ath10k_coredump_mask)) {1580dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar);1581dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_RAM_DATA);1582dump_tlv->tlv_len = cpu_to_le32(crash_data->ramdump_buf_len);1583if (crash_data->ramdump_buf_len) {1584memcpy(dump_tlv->tlv_data, crash_data->ramdump_buf,1585crash_data->ramdump_buf_len);1586sofar += sizeof(*dump_tlv) + crash_data->ramdump_buf_len;1587}1588}15891590mutex_unlock(&ar->dump_mutex);15911592return dump_data;1593}15941595int ath10k_coredump_submit(struct ath10k *ar)1596{1597struct ath10k_dump_file_data *dump;15981599if (ath10k_coredump_mask == 0)1600/* coredump disabled */1601return 0;16021603dump = ath10k_coredump_build(ar);1604if (!dump) {1605ath10k_warn(ar, "no crash dump data found for devcoredump");1606return -ENODATA;1607}16081609dev_coredumpv(ar->dev, dump, le32_to_cpu(dump->len), GFP_KERNEL);16101611return 0;1612}16131614int ath10k_coredump_create(struct ath10k *ar)1615{1616if (ath10k_coredump_mask == 0)1617/* coredump disabled */1618return 0;16191620ar->coredump.fw_crash_data = vzalloc(sizeof(*ar->coredump.fw_crash_data));1621if (!ar->coredump.fw_crash_data)1622return -ENOMEM;16231624return 0;1625}16261627int ath10k_coredump_register(struct ath10k *ar)1628{1629struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data;16301631if (test_bit(ATH10K_FW_CRASH_DUMP_RAM_DATA, &ath10k_coredump_mask)) {1632crash_data->ramdump_buf_len = ath10k_coredump_get_ramdump_size(ar);16331634if (!crash_data->ramdump_buf_len)1635return 0;16361637crash_data->ramdump_buf = vzalloc(crash_data->ramdump_buf_len);1638if (!crash_data->ramdump_buf)1639return -ENOMEM;1640}16411642return 0;1643}16441645void ath10k_coredump_unregister(struct ath10k *ar)1646{1647struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data;16481649vfree(crash_data->ramdump_buf);1650}16511652void ath10k_coredump_destroy(struct ath10k *ar)1653{1654if (ar->coredump.fw_crash_data->ramdump_buf) {1655vfree(ar->coredump.fw_crash_data->ramdump_buf);1656ar->coredump.fw_crash_data->ramdump_buf = NULL;1657ar->coredump.fw_crash_data->ramdump_buf_len = 0;1658}16591660vfree(ar->coredump.fw_crash_data);1661ar->coredump.fw_crash_data = NULL;1662}166316641665