root/drivers/net/wireless/ath/ath10k/coredump.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ath10k_coredump_get_ramdump_size
  2. ath10k_coredump_get_mem_layout
  3. ath10k_coredump_new
  4. ath10k_coredump_build
  5. ath10k_coredump_submit
  6. ath10k_coredump_create
  7. ath10k_coredump_register
  8. ath10k_coredump_unregister
  9. ath10k_coredump_destroy

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

/* [<][>][^][v][top][bottom][index][help] */