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