
#ifdef CCODE_LIST
#ifdef CONFIG_COMPAT
#include <linux/compat.h>
#endif /* COMFIG_COMPAT */
#include <typedefs.h>
#include <dhd_config.h>

#ifdef BCMSDIO
#define CCODE_43438
#define CCODE_43455C0
#define CCODE_43456C5
#endif
#if defined(BCMSDIO) || defined(BCMPCIE)
#define CCODE_4356A2
#define CCODE_4359C0
#endif
#ifdef BCMDBUS
#define CCODE_4358U
#endif

#ifdef BCMSDIO
#ifdef CCODE_43438
const char ccode_43438[] = "RU/13";
#else
const char ccode_43438 = "";
#endif

#ifdef CCODE_43455C0
const char ccode_43455c0[] = \
"AE/6 AG/2 AI/1 AL/2 AS/12 AT/4 AU/6 AW/2 AZ/2 "\
"BA/2 BD/1 BE/4 BG/4 BH/4 BM/12 BN/4 BR/2 BS/2 BY/3 "\
"CA/2 CA/31 CH/4 CN/38 CO/17 CR/17 CY/4 CZ/4 "\
"DE/3 DE/7 DK/4 "\
"EC/21 EE/4 EG/13 ES/4 ET/2 "\
"FI/4 FR/5 "\
"GB/1 GB/6 GD/2 GF/2 GP/2 GR/4 GT/1 GU/30 "\
"HK/2 HR/4 HU/4 "\
"ID/1 IE/5 IL/14 IN/3 IS/4 IT/4 "\
"JO/3 JP/45 JP/58 "\
"KH/2 KR/45 KR/48 KR/49 KR/70 KR/71 KR/96 KW/5 KY/3 "\
"LA/2 LB/5 LI/4 LK/1 LS/2 LT/4 LU/3 LV/4 "\
"MA/2 MC/1 MD/2 ME/2 MK/2 MN/1 MQ/2 MR/2 MT/4 MU/2 MV/3 MW/1 MX/44 MY/3 "\
"NI/2 NL/4 NO/4 NZ/4 "\
"OM/4 "\
"PA/17 PE/20 PH/5 PL/4 PR/38 PT/4 PY/2 "\
"Q2/993 "\
"RE/2 RO/4 RS/2 RU/13 "\
"SE/4 SI/4 SK/4 SV/25 "\
"TH/5 TN/1 TR/7 TT/3 TW/1 "\
"UA/8 US/988 "\
"VA/2 VE/3 VG/2 VN/4 "\
"XZ/11 "\
"YT/2 "\
"ZA/6";
#else
const char ccode_43455c0[] = "";
#endif

#ifdef CCODE_43456C5
const char ccode_43456c5[] = \
"AE/6 AG/2 AI/1 AL/2 AS/12 AT/4 AU/6 AW/2 AZ/2 "\
"BA/2 BD/1 BE/4 BG/4 BH/4 BM/12 BN/4 BR/4 BS/2 BY/3 "\
"CA/2 CH/4 CN/38 CO/17 CR/17 CY/4 CZ/4 "\
"DE/7 DK/4 "\
"EC/21 EE/4 EG/13 ES/4 ET/2 "\
"FI/4 FR/5 "\
"GB/6 GD/2 GF/2 GP/2 GR/4 GT/1 GU/30 "\
"HK/2 HR/4 HU/4 "\
"ID/1 IE/5 IL/14 IN/3 IS/4 IT/4 "\
"JO/3 JP/58 "\
"KH/2 KR/96 KW/5 KY/3 "\
"LA/2 LB/5 LI/4 LK/1 LS/2 LT/4 LU/3 LV/4 "\
"MA/2 MC/1 MD/2 ME/2 MK/2 MN/1 MQ/2 MR/2 MT/4 MU/2 MV/3 MW/1 MX/44 MY/3 "\
"NI/2 NL/4 NO/4 NZ/4 "\
"OM/4 "\
"PA/17 PE/20 PH/5 PL/4 PR/38 PT/4 PY/2 "\
"Q2/993 "\
"RE/2 RO/4 RS/2 RU/13 "\
"SE/4 SI/4 SK/4 SV/25 "\
"TH/5 TN/1 TR/7 TT/3 TW/65 "\
"UA/8 US/988 "\
"VA/2 VE/3 VG/2 VN/4 "\
"XZ/11 "\
"YT/2 "\
"ZA/6";
#else
const char ccode_43456c5[] = "";
#endif
#endif

#ifdef CCODE_4356A2
const char ccode_4356a2[] = \
"AE/6 AG/2 AI/1 AL/2 AN/2 AR/21 AS/12 AT/4 AU/6 AW/2 AZ/2 "\
"BA/2 BD/2 BE/4 BG/4 BH/4 BM/12 BN/4 BR/4 BS/2 BY/3 "\
"CA/31 CH/4 CN/38 CO/17 CR/17 CY/4 CZ/4 "\
"DE/7 DK/4 DZ/1 "\
"EC/21 EE/4 ES/4 ET/2 "\
"FI/4 FR/5 "\
"GB/6 GD/2 GF/2 GP/2 GR/4 GT/1 GU/12 "\
"HK/2 HR/4 HU/4 "\
"ID/13 IE/5 IL/7 IN/28 IS/4 IT/4 "\
"JO/3 JP/58 "\
"KH/2 KR/57 KW/5 KY/3 "\
"LA/2 LB/5 LI/4 LK/1 LS/2 LT/4 LU/3 LV/4 "\
"MA/2 MC/1 MD/2 ME/2 MK/2 MN/1 MO/2 MR/2 MT/4 MQ/2 MU/2 MV/3 MW/1 MX/20 MY/16 "\
"NI/2 NL/4 NO/4 NP/3 NZ/4 "\
"OM/4 "\
"PA/17 PE/20 PG/2 PH/5 PL/4 PR/20 PT/4 PY/2 "\
"RE/2 RO/4 RS/2 RU/986 "\
"SE/4 SG/4 SG/19 SI/4 SK/4 SN/2 SV/19 "\
"TH/9 TN/1 TR/7 TT/3 TW/1 "\
"UA/8 UG/2 US/1 UY/1 "\
"VA/2 UA/16 VE/3 VG/2 VI/13 VN/4 "\
"XZ/11 "\
"YT/2 "\
"ZM/2 "\
"E0/32";
#else
const char ccode_4356a2[] = "";
#endif

#ifdef CCODE_4359C0
const char ccode_4359c0[] = \
"AD/1 AE/6 AG/2 AI/1 AL/3 AS/12 AT/21 AU/6 AW/2 AZ/8 "\
"BA/4 BD/1 BE/19 BG/18 BH/4 BM/12 BN/4 BR/2 BS/2 BY/3 "\
"CN/38 CO/17 CR/17 CY/18 CZ/18 "\
"DE/30 DK/19 "\
"E0/32 EC/21 EE/18 EG/13 ES/21 ET/2 "\
"FI/19 FR/21 "\
"GB/996 GD/2 GE/1 GF/2 GP/2 GR/18 GT/1 GU/30 "\
"HK/2 HR/18 HU/18 "\
"ID/1 IE/21 IL/14 IN/3 IS/17 IT/20 "\
"JO/3 JP/967 "\
"KH/2 KR/70 KW/5 KY/3 "\
"LA/2 LB/5 LI/17 LI/4 LK/1 LS/2 LT/18 LU/18 LV/18 "\
"MA/2 MC/2 MD/3 ME/5 MK/4 MN/1 MQ/2 MR/2 MT/18 MU/2 MV/3 MW/1 MX/44 MY/3 "\
"NI/2 NL/19 NO/18 NZ/4 "\
"OM/4 "\
"PA/17 PE/20 PH/5 PL/18 PR/38 PT/20 PY/2 "\
"Q1/947 Q2/993 "\
"RE/2 RO/18 RS/4 RU/986 "\
"SE/19 SI/18 SK/18 SM/1 SV/25 "\
"TH/5 TN/1 TR/18 TT/3 TW/1 "\
"UA/16 US/988 "\
"VA/3 VE/3 VG/2 VN/4 "\
"XZ/11 "\
"YT/2 "\
"ZA/6";
#else
const char ccode_4359c0[] = "";
#endif

#ifdef CCODE_4358U
const char ccode_4358u[] = \
"BE/4 BR/4 CA/2 CH/4 CN/38 CY/4 DE/7 DK/4 ES/4 "\
"FI/4 FR/5 GB/6 GR/4 HK/2 HU/4 IE/5 IL/7 IS/4 "\
"IT/4 JP/72 KE/0 MY/3 NL/4 PT/4 SA/5 SE/4 SG/0 "\
"SZ/0 TH/5 TR/7 TW/230 US/0 VN/4";
#else
const char ccode_4358u[] = "";
#endif

typedef struct ccode_list_map_t {
	uint chip;
	uint chiprev;
	const char *ccode_list;
	const char *ccode_ww;
} ccode_list_map_t;

extern const char ccode_43438[];
extern const char ccode_43455c0[];
extern const char ccode_43456c5[];
extern const char ccode_4356a2[];
extern const char ccode_4359c0[];
extern const char ccode_4358u[];

const ccode_list_map_t ccode_list_map[] = {
	/* ChipID		Chiprev		ccode  */
#ifdef BCMSDIO
	{BCM43430_CHIP_ID,	0,	ccode_43438, ""},
	{BCM43430_CHIP_ID,	1,	ccode_43438, ""},
	{BCM4345_CHIP_ID,	6,	ccode_43455c0, "XZ/11"},
	{BCM43454_CHIP_ID,	6,	ccode_43455c0, "XZ/11"},
	{BCM4345_CHIP_ID,	9,	ccode_43456c5, "XZ/11"},
	{BCM43454_CHIP_ID,	9,	ccode_43456c5, "XZ/11"},
	{BCM4354_CHIP_ID,	2,	ccode_4356a2, "XZ/11"},
	{BCM4356_CHIP_ID,	2,	ccode_4356a2, "XZ/11"},
	{BCM4371_CHIP_ID,	2,	ccode_4356a2, "XZ/11"},
	{BCM4359_CHIP_ID,	9,	ccode_4359c0, "XZ/11"},
#endif
#ifdef BCMPCIE
	{BCM4354_CHIP_ID,	2,	ccode_4356a2, "XZ/11"},
	{BCM4356_CHIP_ID,	2,	ccode_4356a2, "XZ/11"},
	{BCM4359_CHIP_ID,	9,	ccode_4359c0, "XZ/11"},
#endif
#ifdef BCMDBUS
	{BCM43569_CHIP_ID,	2,	ccode_4358u, "XW/0"},
#endif
};

int
dhd_ccode_map_country_list(dhd_pub_t *dhd, wl_country_t *cspec)
{
	int bcmerror = -1, i;
	uint chip = dhd->conf->chip, chiprev = dhd->conf->chiprev; 
	const char *ccode_list = NULL, *ccode_ww = NULL;
	char *pch;

	for (i=0;  i<sizeof(ccode_list_map)/sizeof(ccode_list_map[0]);  i++) {
		const ccode_list_map_t* row = &ccode_list_map[i];
		if (row->chip == chip && row->chiprev == chiprev) {
			ccode_list = row->ccode_list;
			ccode_ww = row->ccode_ww;
			break;
		}
	}

	if (ccode_list) {
		pch = strstr(ccode_list, cspec->ccode);
		if (pch) {
			cspec->rev = (int)simple_strtol(pch+strlen(cspec->ccode)+1, NULL, 0);
			bcmerror = 0;
		}
	}

	if (bcmerror && ccode_ww && strlen(ccode_ww)>=4) {
		memcpy(cspec->ccode, ccode_ww, 2);
		cspec->rev = (int)simple_strtol(ccode_ww+3, NULL, 0);
	}

	return bcmerror;
}
#endif
