tzh
2024-08-15 d4a1bd480003f3e1a0590bc46fbcb24f05652ca7
longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_platform.c
old mode 100644new mode 100755
....@@ -16,7 +16,6 @@
1616 #include "reg_access.h"
1717 #include "hal_desc.h"
1818 #include "rwnx_main.h"
19
-#include "rwnx_pci.h"
2019 #ifndef CONFIG_RWNX_FHOST
2120 #include "ipc_host.h"
2221 #endif /* !CONFIG_RWNX_FHOST */
....@@ -30,8 +29,8 @@
3029 #include "aicwf_usb.h"
3130 #endif
3231
33
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)
34
-MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
32
+#ifdef AICWF_PCIE_SUPPORT
33
+#include "rwnx_pci.h"
3534 #endif
3635
3736 struct rwnx_plat *g_rwnx_plat;
....@@ -225,489 +224,232 @@
225224 return err;
226225 }
227226 #endif
228
-#endif /* !CONFIG_ROM_PATCH_EN */
229227
230
-#if 0
231
-#ifndef CONFIG_RWNX_TL4
232
-#define IHEX_REC_DATA 0
233
-#define IHEX_REC_EOF 1
234
-#define IHEX_REC_EXT_SEG_ADD 2
235
-#define IHEX_REC_START_SEG_ADD 3
236
-#define IHEX_REC_EXT_LIN_ADD 4
237
-#define IHEX_REC_START_LIN_ADD 5
228
+typedef struct {
229
+ txpwr_idx_conf_t txpwr_idx;
230
+ txpwr_ofst_conf_t txpwr_ofst;
231
+} nvram_info_t;
238232
239
-/**
240
- * rwnx_plat_ihex_fw_upload() - Load the requested intel hex 8 FW into embedded side.
241
- *
242
- * @rwnx_plat: pointer to platform structure
243
- * @fw_addr: Virtual address where the fw must be loaded
244
- * @filename: Name of the fw.
245
- *
246
- * Load a fw, stored as a ihex file, into the specified address.
247
- */
248
-static int rwnx_plat_ihex_fw_upload(struct rwnx_plat *rwnx_plat, u8 *fw_addr,
249
- char *filename)
233
+nvram_info_t nvram_info = {
234
+ .txpwr_idx = {
235
+ .enable = 1,
236
+ .dsss = 9,
237
+ .ofdmlowrate_2g4 = 8,
238
+ .ofdm64qam_2g4 = 8,
239
+ .ofdm256qam_2g4 = 8,
240
+ .ofdm1024qam_2g4 = 8,
241
+ .ofdmlowrate_5g = 11,
242
+ .ofdm64qam_5g = 10,
243
+ .ofdm256qam_5g = 9,
244
+ .ofdm1024qam_5g = 9
245
+ },
246
+ .txpwr_ofst = {
247
+ .enable = 1,
248
+ .chan_1_4 = 0,
249
+ .chan_5_9 = 0,
250
+ .chan_10_13 = 0,
251
+ .chan_36_64 = 0,
252
+ .chan_100_120 = 0,
253
+ .chan_122_140 = 0,
254
+ .chan_142_165 = 0,
255
+ },
256
+};
257
+
258
+void get_userconfig_txpwr_idx(txpwr_idx_conf_t *txpwr_idx)
250259 {
251
- const struct firmware *fw;
252
- struct device *dev = rwnx_platform_get_dev(rwnx_plat);
253
- u8 const *src, *end;
254
- u32 *dst;
255
- u16 haddr, segaddr, addr;
256
- u32 hwaddr;
257
- u8 load_fw, byte_count, checksum, csum, rec_type;
258
- int err, rec_idx;
259
- char hex_buff[9];
260
-
261
- err = request_firmware(&fw, filename, dev);
262
- if (err) {
263
- return err;
264
- }
265
-
266
- /* Copy the file on the Embedded side */
267
- dev_dbg(dev, "\n### Now copy %s firmware, @ = %p\n", filename, fw_addr);
268
-
269
- src = fw->data;
270
- end = src + (unsigned int)fw->size;
271
- haddr = 0;
272
- segaddr = 0;
273
- load_fw = 1;
274
- err = -EINVAL;
275
- rec_idx = 0;
276
- hwaddr = 0;
277
-
278
-#define IHEX_READ8(_val, _cs) { \
279
- hex_buff[2] = 0; \
280
- strncpy(hex_buff, src, 2); \
281
- if (kstrtou8(hex_buff, 16, &_val)) \
282
- goto end; \
283
- src += 2; \
284
- if (_cs) \
285
- csum += _val; \
286
- }
287
-
288
-#define IHEX_READ16(_val) { \
289
- hex_buff[4] = 0; \
290
- strncpy(hex_buff, src, 4); \
291
- if (kstrtou16(hex_buff, 16, &_val)) \
292
- goto end; \
293
- src += 4; \
294
- csum += (_val & 0xff) + (_val >> 8); \
295
- }
296
-
297
-#define IHEX_READ32(_val) { \
298
- hex_buff[8] = 0; \
299
- strncpy(hex_buff, src, 8); \
300
- if (kstrtouint(hex_buff, 16, &_val)) \
301
- goto end; \
302
- src += 8; \
303
- csum += (_val & 0xff) + ((_val >> 8) & 0xff) + \
304
- ((_val >> 16) & 0xff) + (_val >> 24); \
305
- }
306
-
307
-#define IHEX_READ32_PAD(_val, _nb) { \
308
- memset(hex_buff, '0', 8); \
309
- hex_buff[8] = 0; \
310
- strncpy(hex_buff, src, (2 * _nb)); \
311
- if (kstrtouint(hex_buff, 16, &_val)) \
312
- goto end; \
313
- src += (2 * _nb); \
314
- csum += (_val & 0xff) + ((_val >> 8) & 0xff) + \
315
- ((_val >> 16) & 0xff) + (_val >> 24); \
260
+ memcpy(txpwr_idx, &(nvram_info.txpwr_idx), sizeof(txpwr_idx_conf_t));
316261 }
317262
318
- /* loop until end of file is read*/
319
- while (load_fw) {
320
- rec_idx++;
321
- csum = 0;
263
+void get_userconfig_txpwr_ofst(txpwr_ofst_conf_t *txpwr_ofst)
264
+{
265
+ memcpy(txpwr_ofst, &(nvram_info.txpwr_ofst), sizeof(txpwr_ofst_conf_t));
266
+}
322267
323
- /* Find next colon start code */
324
- while (*src != ':') {
325
- src++;
326
- if ((src + 3) >= end) /* 3 = : + rec_len */
327
- goto end;
328
- }
329
- src++;
268
+#define MATCH_NODE(type, node, cfg_key) {cfg_key, offsetof(type, node)}
330269
331
- /* Read record len */
332
- IHEX_READ8(byte_count, 1);
333
- if ((src + (byte_count * 2) + 8) >= end) /* 8 = rec_addr + rec_type + chksum */
334
- goto end;
270
+struct parse_match_t {
271
+ char keyname[64];
272
+ int offset;
273
+};
335274
336
- /* Read record addr */
337
- IHEX_READ16(addr);
275
+static const char *parse_key_prefix[] = {
276
+ [0x01] = "module0_",
277
+ [0x21] = "module1_",
278
+};
338279
339
- /* Read record type */
340
- IHEX_READ8(rec_type, 1);
280
+static const struct parse_match_t parse_match_tab[] = {
281
+ MATCH_NODE(nvram_info_t, txpwr_idx.enable, "enable"),
282
+ MATCH_NODE(nvram_info_t, txpwr_idx.dsss, "dsss"),
283
+ MATCH_NODE(nvram_info_t, txpwr_idx.ofdmlowrate_2g4, "ofdmlowrate_2g4"),
284
+ MATCH_NODE(nvram_info_t, txpwr_idx.ofdm64qam_2g4, "ofdm64qam_2g4"),
285
+ MATCH_NODE(nvram_info_t, txpwr_idx.ofdm256qam_2g4, "ofdm256qam_2g4"),
286
+ MATCH_NODE(nvram_info_t, txpwr_idx.ofdm1024qam_2g4, "ofdm1024qam_2g4"),
287
+ MATCH_NODE(nvram_info_t, txpwr_idx.ofdmlowrate_5g, "ofdmlowrate_5g"),
288
+ MATCH_NODE(nvram_info_t, txpwr_idx.ofdm64qam_5g, "ofdm64qam_5g"),
289
+ MATCH_NODE(nvram_info_t, txpwr_idx.ofdm256qam_5g, "ofdm256qam_5g"),
290
+ MATCH_NODE(nvram_info_t, txpwr_idx.ofdm1024qam_5g, "ofdm1024qam_5g"),
341291
342
- switch (rec_type) {
343
- case IHEX_REC_DATA:
344
- {
345
- /* Update destination address */
346
- dst = (u32 *) (fw_addr + hwaddr + addr);
292
+ MATCH_NODE(nvram_info_t, txpwr_ofst.enable, "ofst_enable"),
293
+ MATCH_NODE(nvram_info_t, txpwr_ofst.chan_1_4, "ofst_chan_1_4"),
294
+ MATCH_NODE(nvram_info_t, txpwr_ofst.chan_5_9, "ofst_chan_5_9"),
295
+ MATCH_NODE(nvram_info_t, txpwr_ofst.chan_10_13, "ofst_chan_10_13"),
296
+ MATCH_NODE(nvram_info_t, txpwr_ofst.chan_36_64, "ofst_chan_36_64"),
297
+ MATCH_NODE(nvram_info_t, txpwr_ofst.chan_100_120, "ofst_chan_100_120"),
298
+ MATCH_NODE(nvram_info_t, txpwr_ofst.chan_122_140, "ofst_chan_122_140"),
299
+ MATCH_NODE(nvram_info_t, txpwr_ofst.chan_142_165, "ofst_chan_142_165"),
300
+};
347301
348
- while (byte_count) {
349
- u32 val;
350
- if (byte_count >= 4) {
351
- IHEX_READ32(val);
352
- byte_count -= 4;
353
- } else {
354
- IHEX_READ32_PAD(val, byte_count);
355
- byte_count = 0;
356
- }
357
- *dst++ = __swab32(val);
302
+static int parse_key_val(const char *str, const char *key, char *val)
303
+{
304
+ const char *p = NULL;
305
+ const char *dst = NULL;
306
+ int keysize = 0;
307
+ int bufsize = 0;
308
+
309
+ if (str == NULL || key == NULL || val == NULL)
310
+ return -1;
311
+
312
+ keysize = strlen(key);
313
+ bufsize = strlen(str);
314
+ if (bufsize <= keysize)
315
+ return -1;
316
+
317
+ p = str;
318
+ while (*p != 0 && *p == ' ')
319
+ p++;
320
+
321
+ if (*p == '#')
322
+ return -1;
323
+
324
+ if (str + bufsize - p <= keysize)
325
+ return -1;
326
+
327
+ if (strncmp(p, key, keysize) != 0)
328
+ return -1;
329
+
330
+ p += keysize;
331
+
332
+ while (*p != 0 && *p == ' ')
333
+ p++;
334
+
335
+ if (*p != '=')
336
+ return -1;
337
+
338
+ p++;
339
+ while (*p != 0 && *p == ' ')
340
+ p++;
341
+
342
+ if (*p == '"')
343
+ p++;
344
+
345
+ dst = p;
346
+ while (*p != 0)
347
+ p++;
348
+
349
+ p--;
350
+ while (*p == ' ')
351
+ p--;
352
+
353
+ if (*p == '"')
354
+ p--;
355
+
356
+ while (*p == '\r' || *p == '\n')
357
+ p--;
358
+
359
+ p++;
360
+ strncpy(val, dst, p -dst);
361
+ val[p - dst] = 0;
362
+ return 0;
363
+}
364
+
365
+void rwnx_plat_userconfig_parsing(struct rwnx_hw *rwnx_hw, char *buffer, int size)
366
+{
367
+ char conf[100], keyname[64];
368
+ char *line;
369
+ char *data;
370
+ int i = 0, err, len = 0;
371
+ long val;
372
+
373
+ if (size <= 0) {
374
+ pr_err("Config buffer size %d error\n", size);
375
+ return;
376
+ }
377
+
378
+ if (rwnx_hw->vendor_info > (sizeof(parse_key_prefix) / sizeof(parse_key_prefix[0]) - 1)) {
379
+ pr_err("Unsuppor vendor info config\n");
380
+ return;
381
+ }
382
+
383
+ data = vmalloc(size + 1);
384
+ if (!data) {
385
+ pr_err("vmalloc fail\n");
386
+ return;
387
+ }
388
+
389
+ memcpy(data, buffer, size);
390
+ buffer = data;
391
+
392
+ while (1) {
393
+ line = buffer;
394
+ if (*line == 0)
395
+ break;
396
+
397
+ while (*buffer != '\r' && *buffer != '\n' && *buffer != 0 && len++ < size)
398
+ buffer++;
399
+
400
+ while ((*buffer == '\r' || *buffer == '\n') && len++ < size)
401
+ *buffer++ = 0;
402
+
403
+ if (len >= size)
404
+ *buffer = 0;
405
+
406
+ // store value to data struct
407
+ for (i = 0; i < sizeof(parse_match_tab) / sizeof(parse_match_tab[0]); i++) {
408
+ sprintf(&keyname[0], "%s%s", parse_key_prefix[rwnx_hw->vendor_info], parse_match_tab[i].keyname);
409
+ if (parse_key_val(line, keyname, conf) == 0) {
410
+ err = kstrtol(conf, 0, &val);
411
+ *(unsigned char *)((unsigned long)&nvram_info + parse_match_tab[i].offset) = val;
412
+ printk("%s, %s = %ld\n", __func__, parse_match_tab[i].keyname, val);
413
+ break;
358414 }
359
- break;
360415 }
361
- case IHEX_REC_EOF:
362
- {
363
- load_fw = 0;
364
- err = 0;
365
- break;
366
- }
367
- case IHEX_REC_EXT_SEG_ADD: /* Extended Segment Address */
368
- {
369
- IHEX_READ16(segaddr);
370
- hwaddr = (haddr << 16) + (segaddr << 4);
371
- break;
372
- }
373
- case IHEX_REC_EXT_LIN_ADD: /* Extended Linear Address */
374
- {
375
- IHEX_READ16(haddr);
376
- hwaddr = (haddr << 16) + (segaddr << 4);
377
- break;
378
- }
379
- case IHEX_REC_START_LIN_ADD: /* Start Linear Address */
380
- {
381
- u32 val;
382
- IHEX_READ32(val); /* need to read for checksum */
383
- break;
384
- }
385
- case IHEX_REC_START_SEG_ADD:
386
- default:
387
- {
388
- dev_err(dev, "ihex: record type %d not supported\n", rec_type);
389
- load_fw = 0;
390
- }
391
- }
416
+ }
417
+ vfree(data);
418
+}
392419
393
- /* Read and compare checksum */
394
- IHEX_READ8(checksum, 0);
395
- if (checksum != (u8)(~csum + 1))
396
- goto end;
420
+#define FW_USERCONFIG_NAME "aic_userconfig.txt"
421
+
422
+int rwnx_plat_userconfig_upload_android(struct rwnx_hw *rwnx_hw, char *filename)
423
+{
424
+ int size;
425
+ char *dst = NULL;
426
+
427
+ const struct firmware *fw = NULL;
428
+ int ret = request_firmware(&fw, filename, NULL);
429
+
430
+ printk("userconfig file path:%s \r\n", filename);
431
+
432
+ if (ret < 0) {
433
+ printk("Load %s fail\n", filename);
434
+ return ret;
397435 }
398436
399
-#undef IHEX_READ8
400
-#undef IHEX_READ16
401
-#undef IHEX_READ32
402
-#undef IHEX_READ32_PAD
437
+ size = fw->size;
438
+ dst = (char *)fw->data;
403439
404
-end:
405
- release_firmware(fw);
406
-
407
- if (err)
408
- dev_err(dev, "%s: Invalid ihex record around line %d\n", filename, rec_idx);
409
-
410
- return err;
411
-}
412
-#endif /* CONFIG_RWNX_TL4 */
413
-
414
-#ifndef CONFIG_RWNX_SDM
415
-/**
416
- * rwnx_plat_get_rf() - Retrun the RF used in the platform
417
- *
418
- * @rwnx_plat: pointer to platform structure
419
- */
420
-static u32 rwnx_plat_get_rf(struct rwnx_plat *rwnx_plat)
421
-{
422
- u32 ver;
423
- ver = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, MDM_HDMCONFIG_ADDR);
424
-
425
- ver = __MDM_PHYCFG_FROM_VERS(ver);
426
- WARN(((ver != MDM_PHY_CONFIG_TRIDENT) &&
427
- (ver != MDM_PHY_CONFIG_ELMA) &&
428
- (ver != MDM_PHY_CONFIG_KARST)),
429
- "bad phy version 0x%08x\n", ver);
430
-
431
- return ver;
432
-}
433
-
434
-/**
435
- * rwnx_plat_stop_agcfsm() - Stop a AGC state machine
436
- *
437
- * @rwnx_plat: pointer to platform structure
438
- * @agg_reg: Address of the agccntl register (within RWNX_ADDR_SYSTEM)
439
- * @agcctl: Updated with value of the agccntl rgister before stop
440
- * @memclk: Updated with value of the clock register before stop
441
- * @agc_ver: Version of the AGC load procedure
442
- * @clkctrladdr: Indicates which AGC clock register should be accessed
443
- */
444
-static void rwnx_plat_stop_agcfsm(struct rwnx_plat *rwnx_plat, int agc_reg,
445
- u32 *agcctl, u32 *memclk, u8 agc_ver,
446
- u32 clkctrladdr)
447
-{
448
- /* First read agcctnl and clock registers */
449
- *memclk = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, clkctrladdr);
450
-
451
- /* Stop state machine : xxAGCCNTL0[AGCFSMRESET]=1 */
452
- *agcctl = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, agc_reg);
453
- RWNX_REG_WRITE((*agcctl) | BIT(12), rwnx_plat, RWNX_ADDR_SYSTEM, agc_reg);
454
-
455
- /* Force clock */
456
- if (agc_ver > 0) {
457
- /* CLKGATEFCTRL0[AGCCLKFORCE]=1 */
458
- RWNX_REG_WRITE((*memclk) | BIT(29), rwnx_plat, RWNX_ADDR_SYSTEM,
459
- clkctrladdr);
460
- } else {
461
- /* MEMCLKCTRL0[AGCMEMCLKCTRL]=0 */
462
- RWNX_REG_WRITE((*memclk) & ~BIT(3), rwnx_plat, RWNX_ADDR_SYSTEM,
463
- clkctrladdr);
464
- }
465
-}
466
-
467
-
468
-/**
469
- * rwnx_plat_start_agcfsm() - Restart a AGC state machine
470
- *
471
- * @rwnx_plat: pointer to platform structure
472
- * @agg_reg: Address of the agccntl register (within RWNX_ADDR_SYSTEM)
473
- * @agcctl: value of the agccntl register to restore
474
- * @memclk: value of the clock register to restore
475
- * @agc_ver: Version of the AGC load procedure
476
- * @clkctrladdr: Indicates which AGC clock register should be accessed
477
- */
478
-static void rwnx_plat_start_agcfsm(struct rwnx_plat *rwnx_plat, int agc_reg,
479
- u32 agcctl, u32 memclk, u8 agc_ver,
480
- u32 clkctrladdr)
481
-{
482
-
483
- /* Release clock */
484
- if (agc_ver > 0)
485
- /* CLKGATEFCTRL0[AGCCLKFORCE]=0 */
486
- RWNX_REG_WRITE(memclk & ~BIT(29), rwnx_plat, RWNX_ADDR_SYSTEM,
487
- clkctrladdr);
488
- else
489
- /* MEMCLKCTRL0[AGCMEMCLKCTRL]=1 */
490
- RWNX_REG_WRITE(memclk | BIT(3), rwnx_plat, RWNX_ADDR_SYSTEM,
491
- clkctrladdr);
492
-
493
- /* Restart state machine: xxAGCCNTL0[AGCFSMRESET]=0 */
494
- RWNX_REG_WRITE(agcctl & ~BIT(12), rwnx_plat, RWNX_ADDR_SYSTEM, agc_reg);
495
-}
496
-#endif
497
-
498
-/**
499
- * rwnx_plat_fcu_load() - Load FCU (Fith Chain Unit) ucode
500
- *
501
- * @rwnx_hw: main driver data
502
- *
503
- * c.f Modem UM (AGC/CCA initialization)
504
- */
505
-static int rwnx_plat_fcu_load(struct rwnx_hw *rwnx_hw)
506
-{
507
- int ret = 0;
508
-#ifndef CONFIG_RWNX_SDM
509
- struct rwnx_plat *rwnx_plat = rwnx_hw->plat;
510
- u32 agcctl, memclk;
511
-
512
-#ifndef CONFIG_RWNX_FHOST
513
- /* By default, we consider that there is only one RF in the system */
514
- rwnx_hw->phy.cnt = 1;
515
-#endif // CONFIG_RWNX_FHOST
516
-
517
- if (rwnx_plat_get_rf(rwnx_plat) != MDM_PHY_CONFIG_ELMA)
518
- /* No FCU for PHYs other than Elma */
519
- return 0;
520
-
521
- agcctl = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, RIU_RWNXAGCCNTL_ADDR);
522
- if (!__RIU_FCU_PRESENT(agcctl))
523
- /* No FCU present in this version */
524
- return 0;
525
-
526
-#ifndef CONFIG_RWNX_FHOST
527
- /* FCU is present */
528
- if (rwnx_hw->band_5g_support) {
529
- rwnx_hw->phy.cnt = 2;
530
- rwnx_hw->phy.sec_chan.band = NL80211_BAND_5GHZ;
531
- rwnx_hw->phy.sec_chan.type = PHY_CHNL_BW_20;
532
- rwnx_hw->phy.sec_chan.prim20_freq = 5500;
533
- rwnx_hw->phy.sec_chan.center_freq1 = 5500;
534
- rwnx_hw->phy.sec_chan.center_freq2 = 0;
535
- }
536
-#endif // CONFIG_RWNX_FHOST
537
-
538
- rwnx_plat_stop_agcfsm(rwnx_plat, FCU_RWNXFCAGCCNTL_ADDR, &agcctl, &memclk, 0,
539
- MDM_MEMCLKCTRL0_ADDR);
540
-
541
- ret = rwnx_plat_bin_fw_upload(rwnx_plat,
542
- RWNX_ADDR(rwnx_plat, RWNX_ADDR_SYSTEM, PHY_FCU_UCODE_ADDR),
543
- RWNX_FCU_FW_NAME);
544
-
545
- rwnx_plat_start_agcfsm(rwnx_plat, FCU_RWNXFCAGCCNTL_ADDR, agcctl, memclk, 0,
546
- MDM_MEMCLKCTRL0_ADDR);
547
-#endif
548
-
549
- return ret;
550
-}
551
-
552
-/**
553
- * rwnx_is_new_agc_load() - Return is new agc clock register should be used
554
- *
555
- * @rwnx_plat: platform data
556
- * @rf: rf in used
557
- *
558
- * c.f Modem UM (AGC/CCA initialization)
559
- */
560
-#ifndef CONFIG_RWNX_SDM
561
-static u8 rwnx_get_agc_load_version(struct rwnx_plat *rwnx_plat, u32 rf, u32 *clkctrladdr)
562
-{
563
- u8 agc_load_ver = 0;
564
- u32 agc_ver;
565
- u32 regval;
566
-
567
- /* Trident and Elma PHY use old method */
568
- if (rf != MDM_PHY_CONFIG_KARST) {
569
- *clkctrladdr = MDM_MEMCLKCTRL0_ADDR;
570
- return 0;
571
- }
572
-
573
- /* Get the FPGA signature */
574
- regval = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, SYSCTRL_SIGNATURE_ADDR);
575
-
576
- if (__FPGA_TYPE(regval) == 0xC0CA)
577
- *clkctrladdr = CRM_CLKGATEFCTRL0_ADDR;
578
- else
579
- *clkctrladdr = MDM_CLKGATEFCTRL0_ADDR;
580
-
581
- /* Read RIU version register */
582
- agc_ver = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, RIU_RWNXVERSION_ADDR);
583
- agc_load_ver = __RIU_AGCLOAD_FROM_VERS(agc_ver);
584
-
585
- return agc_load_ver;
586
-}
587
-#endif /* CONFIG_RWNX_SDM */
588
-
589
-/**
590
- * rwnx_plat_agc_load() - Load AGC ucode
591
- *
592
- * @rwnx_plat: platform data
593
- * c.f Modem UM (AGC/CCA initialization)
594
- */
595
-static int rwnx_plat_agc_load(struct rwnx_plat *rwnx_plat)
596
-{
597
- int ret = 0;
598
-#ifndef CONFIG_RWNX_SDM
599
- u32 agc = 0, agcctl, memclk;
600
- u32 clkctrladdr;
601
- u32 rf = rwnx_plat_get_rf(rwnx_plat);
602
- u8 agc_ver;
603
-
604
- switch (rf) {
605
- case MDM_PHY_CONFIG_TRIDENT:
606
- agc = AGC_RWNXAGCCNTL_ADDR;
607
- break;
608
- case MDM_PHY_CONFIG_ELMA:
609
- case MDM_PHY_CONFIG_KARST:
610
- agc = RIU_RWNXAGCCNTL_ADDR;
611
- break;
612
- default:
440
+ if (size <= 0) {
441
+ printk("wrong size of firmware file\n");
442
+ release_firmware(fw);
613443 return -1;
614444 }
615445
616
- agc_ver = rwnx_get_agc_load_version(rwnx_plat, rf, &clkctrladdr);
446
+ rwnx_plat_userconfig_parsing(rwnx_hw, (char *)dst, size);
617447
618
- rwnx_plat_stop_agcfsm(rwnx_plat, agc, &agcctl, &memclk, agc_ver, clkctrladdr);
619
-
620
- ret = rwnx_plat_bin_fw_upload(rwnx_plat,
621
- RWNX_ADDR(rwnx_plat, RWNX_ADDR_SYSTEM, PHY_AGC_UCODE_ADDR),
622
- RWNX_AGC_FW_NAME);
623
-
624
- if (!ret && (agc_ver == 1)) {
625
- /* Run BIST to ensure that the AGC RAM was correctly loaded */
626
- RWNX_REG_WRITE(BIT(28), rwnx_plat, RWNX_ADDR_SYSTEM,
627
- RIU_RWNXDYNAMICCONFIG_ADDR);
628
- while (RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, RIU_RWNXDYNAMICCONFIG_ADDR) & BIT(28)) {
629
- ;
630
- }
631
-
632
- if (!(RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM,
633
- RIU_AGCMEMBISTSTAT_ADDR) & BIT(0))) {
634
- dev_err(rwnx_platform_get_dev(rwnx_plat),
635
- "AGC RAM not loaded correctly 0x%08x\n",
636
- RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM,
637
- RIU_AGCMEMSIGNATURESTAT_ADDR));
638
- ret = -EIO;
639
- }
640
- }
641
-
642
- rwnx_plat_start_agcfsm(rwnx_plat, agc, agcctl, memclk, agc_ver, clkctrladdr);
643
-
644
-#endif
645
- return ret;
646
-}
647
-
648
-/**
649
- * rwnx_ldpc_load() - Load LDPC RAM
650
- *
651
- * @rwnx_hw: Main driver data
652
- * c.f Modem UM (LDPC initialization)
653
- */
654
-static int rwnx_ldpc_load(struct rwnx_hw *rwnx_hw)
655
-{
656
-#ifndef CONFIG_RWNX_SDM
657
- struct rwnx_plat *rwnx_plat = rwnx_hw->plat;
658
- u32 rf = rwnx_plat_get_rf(rwnx_plat);
659
- u32 phy_feat = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, MDM_HDMCONFIG_ADDR);
660
-
661
- if ((rf != MDM_PHY_CONFIG_KARST) ||
662
- (phy_feat & (MDM_LDPCDEC_BIT | MDM_LDPCENC_BIT)) !=
663
- (MDM_LDPCDEC_BIT | MDM_LDPCENC_BIT)) {
664
- goto disable_ldpc;
665
- }
666
-
667
- if (rwnx_plat_bin_fw_upload(rwnx_plat,
668
- RWNX_ADDR(rwnx_plat, RWNX_ADDR_SYSTEM, PHY_LDPC_RAM_ADDR),
669
- RWNX_LDPC_RAM_NAME)) {
670
- goto disable_ldpc;
671
- }
448
+ release_firmware(fw);
672449
673450 return 0;
674
-
675
-disable_ldpc:
676
- rwnx_hw->mod_params->ldpc_on = false;
677
-
678
-#endif /* CONFIG_RWNX_SDM */
679
- return 0;
680451 }
681452
682
-/**
683
- * rwnx_plat_lmac_load() - Load FW code
684
- *
685
- * @rwnx_plat: platform data
686
- */
687
-static int rwnx_plat_lmac_load(struct rwnx_plat *rwnx_plat)
688
-{
689
- int ret;
690
-
691
- #ifdef CONFIG_RWNX_TL4
692
- ret = rwnx_plat_tl4_fw_upload(rwnx_plat,
693
- RWNX_ADDR(rwnx_plat, RWNX_ADDR_CPU, RAM_LMAC_FW_ADDR),
694
- RWNX_MAC_FW_NAME);
695
- #else
696
- ret = rwnx_plat_ihex_fw_upload(rwnx_plat,
697
- RWNX_ADDR(rwnx_plat, RWNX_ADDR_CPU, RAM_LMAC_FW_ADDR),
698
- RWNX_MAC_FW_NAME);
699
- if (ret == -ENOENT) {
700
- ret = rwnx_plat_bin_fw_upload(rwnx_plat,
701
- RWNX_ADDR(rwnx_plat, RWNX_ADDR_CPU, RAM_LMAC_FW_ADDR),
702
- RWNX_MAC_FW_NAME2);
703
- }
704
- #endif
705
-
706
- return ret;
707
-}
708
-#endif
709
-
710
-#ifndef CONFIG_ROM_PATCH_EN
711453 /**
712454 * rwnx_plat_fmac_load() - Load FW code
713455 *
....@@ -718,42 +460,10 @@
718460 int ret = 0;
719461
720462 RWNX_DBG(RWNX_FN_ENTRY_STR);
721
- #if defined(CONFIG_NANOPI_M4) || defined(CONFIG_PLATFORM_ALLWINNER)
722
- //ret = rwnx_plat_bin_fw_upload_android(rwnx_hw, RAM_FMAC_FW_ADDR, RWNX_MAC_FW_NAME2);
723
- #else
724
- ret = rwnx_plat_bin_fw_upload_2(rwnx_hw,
725
- RAM_FMAC_FW_ADDR,
726
- RWNX_MAC_FW_NAME2);
727
- #endif
463
+ ret = rwnx_plat_userconfig_upload_android(rwnx_hw, FW_USERCONFIG_NAME);
728464 return ret;
729465 }
730466 #endif /* !CONFIG_ROM_PATCH_EN */
731
-
732
-#if 0
733
-/**
734
- * rwnx_plat_mpif_sel() - Select the MPIF according to the FPGA signature
735
- *
736
- * @rwnx_plat: platform data
737
- */
738
-static void rwnx_plat_mpif_sel(struct rwnx_plat *rwnx_plat)
739
-{
740
-#ifndef CONFIG_RWNX_SDM
741
- u32 regval;
742
- u32 type;
743
-
744
- /* Get the FPGA signature */
745
- regval = RWNX_REG_READ(rwnx_plat, RWNX_ADDR_SYSTEM, SYSCTRL_SIGNATURE_ADDR);
746
- type = __FPGA_TYPE(regval);
747
-
748
- /* Check if we need to switch to the old MPIF or not */
749
- if ((type != 0xCAFE) && (type != 0XC0CA) && (regval & 0xF) < 0x3) {
750
- /* A old FPGA A is used, so configure the FPGA B to use the old MPIF */
751
- RWNX_REG_WRITE(0x3, rwnx_plat, RWNX_ADDR_SYSTEM, FPGAB_MPIF_SEL_ADDR);
752
- }
753
-#endif
754
-}
755
-#endif
756
-
757467
758468 /**
759469 * rwnx_platform_reset() - Reset the platform
....@@ -982,79 +692,21 @@
982692 */
983693 int rwnx_platform_on(struct rwnx_hw *rwnx_hw, void *config)
984694 {
985
- #ifndef CONFIG_ROM_PATCH_EN
986
- #ifdef CONFIG_DOWNLOAD_FW
987695 int ret;
988
- #endif
989
- #endif
990696 struct rwnx_plat *rwnx_plat = rwnx_hw->plat;
697
+ (void)ret;
991698
992699 RWNX_DBG(RWNX_FN_ENTRY_STR);
993700
994701 if (rwnx_plat->enabled)
995702 return 0;
996703
997
- #if 0
998
- if (rwnx_platform_reset(rwnx_plat))
999
- return -1;
1000
-
1001
- rwnx_plat_mpif_sel(rwnx_plat);
1002
-
1003
- ret = rwnx_plat_fcu_load(rwnx_hw);
1004
- if (ret)
1005
- return ret;
1006
- ret = rwnx_plat_agc_load(rwnx_plat);
1007
- if (ret)
1008
- return ret;
1009
- ret = rwnx_ldpc_load(rwnx_hw);
1010
- if (ret)
1011
- return ret;
1012
- ret = rwnx_plat_lmac_load(rwnx_plat);
1013
- if (ret)
1014
- return ret;
1015
-
1016
- shared_ram = RWNX_ADDR(rwnx_plat, RWNX_ADDR_SYSTEM, SHARED_RAM_START_ADDR);
1017
- ret = rwnx_ipc_init(rwnx_hw, shared_ram);
1018
- if (ret)
1019
- return ret;
1020
-
1021
- ret = rwnx_plat->enable(rwnx_hw);
1022
- if (ret)
1023
- return ret;
1024
- RWNX_REG_WRITE(BOOTROM_ENABLE, rwnx_plat,
1025
- RWNX_ADDR_SYSTEM, SYSCTRL_MISC_CNTL_ADDR);
1026
-
1027
- #if 0
1028
- ret = rwnx_fw_trace_config_filters(rwnx_get_shared_trace_buf(rwnx_hw),
1029
- rwnx_ipc_fw_trace_desc_get(rwnx_hw),
1030
- rwnx_hw->mod_params->ftl);
1031
- if (ret)
1032
- #endif
1033
-
1034
- #ifndef CONFIG_RWNX_FHOST
1035
- {
1036
- ret = rwnx_check_fw_compatibility(rwnx_hw);
1037
- if (ret) {
1038
- rwnx_hw->plat->disable(rwnx_hw);
1039
- tasklet_kill(&rwnx_hw->task);
1040
- rwnx_ipc_deinit(rwnx_hw);
1041
- return ret;
1042
- }
1043
- }
1044
- #endif /* !CONFIG_RWNX_FHOST */
1045
-
1046
- if (config)
1047
- rwnx_term_restore_config(rwnx_plat, config);
1048
-
1049
- rwnx_ipc_start(rwnx_hw);
1050
- #else
1051704 #ifndef CONFIG_ROM_PATCH_EN
1052705 #ifdef CONFIG_DOWNLOAD_FW
1053706 ret = rwnx_plat_fmac_load(rwnx_hw);
1054707 if (ret)
1055708 return ret;
1056709 #endif /* !CONFIG_ROM_PATCH_EN */
1057
- #endif
1058710 #endif
1059711
1060712 rwnx_plat->enabled = true;
....@@ -1075,6 +727,7 @@
1075727 void rwnx_platform_off(struct rwnx_hw *rwnx_hw, void **config)
1076728 {
1077729 #if defined(AICWF_USB_SUPPORT) || defined(AICWF_SDIO_SUPPORT)
730
+ tasklet_kill(&rwnx_hw->task);
1078731 rwnx_hw->plat->enabled = false;
1079732 return ;
1080733 #endif
....@@ -1085,22 +738,12 @@
1085738 return;
1086739 }
1087740
1088
-#ifdef AICWF_PCIE_SUPPORT
1089
- rwnx_ipc_stop(rwnx_hw);
1090
-#endif
1091
-
1092741 if (config)
1093742 *config = rwnx_term_save_config(rwnx_hw->plat);
1094743
1095744 rwnx_hw->plat->disable(rwnx_hw);
1096745
1097746 tasklet_kill(&rwnx_hw->task);
1098
-
1099
-#ifdef AICWF_PCIE_SUPPORT
1100
- rwnx_ipc_deinit(rwnx_hw);
1101
-#endif
1102
-
1103
-
1104747 rwnx_platform_reset(rwnx_hw->plat);
1105748
1106749 rwnx_hw->plat->enabled = false;
....@@ -1148,6 +791,7 @@
1148791 #endif
1149792 }
1150793
794
+#ifdef AICWF_PCIE_SUPPORT
1151795 /**
1152796 * rwnx_platform_register_drv() - Register all possible platform drivers
1153797 */
....@@ -1164,6 +808,7 @@
1164808 {
1165809 return rwnx_pci_unregister_drv();
1166810 }
811
+#endif
1167812
1168813 struct device *rwnx_platform_get_dev(struct rwnx_plat *rwnx_plat)
1169814 {
....@@ -1173,7 +818,9 @@
1173818 #ifdef AICWF_USB_SUPPORT
1174819 return rwnx_plat->usbdev->dev;
1175820 #endif
821
+#ifdef AICWF_PCIE_SUPPORT
1176822 return &(rwnx_plat->pci_dev->dev);
823
+#endif
1177824 }
1178825
1179826