int prefs_from_tstr(prefs_data *prefs, const TCHAR *str, size_t str_len_cch)
{
    int     f_ok;
    size_t  str_len_cb;

    assert(str);
    if (!str) return FALSE;

    if (-1 == str_len_cch)
        str_len_cch = tstr_len(str);

    str_len_cb = str_len_cch * sizeof(TCHAR);
    while (0 != str_len_cb) {
        f_ok = prefs_parse_item(prefs, &str, &str_len_cb);
        if (!f_ok)
            return FALSE;
    }
    assert(0 == str_len_cb);
    return TRUE;
}
uint32 sec_save_wlinfo(char* firm_ver, char* dhd_ver, char* nvram_p)
{
	struct file *fp = NULL;
	struct file *nvfp = NULL;
	char *filepath = "/data/.wifiver.info";
	int min_len, str_len = 0;
	int ret = 0;
	char* nvram_buf;
	char temp_buf[256];

	DHD_TRACE(("[WIFI] %s: Entered.\n", __FUNCTION__));

	DHD_INFO(("[WIFI] firmware version   : %s\n", firm_ver));
	DHD_INFO(("[WIFI] dhd driver version : %s\n", dhd_ver));
	DHD_INFO(("[WIFI] nvram path : %s\n", nvram_p));

	memset(version_info,0,sizeof(version_info));

	if(strlen(dhd_ver)){
		min_len = min(strlen(dhd_ver) ,  max_len(temp_buf, DHD_prefix));
		min_len += strlen(DHD_prefix) + 3;
		DHD_INFO(("[WIFI] DHD ver length : %d\n", min_len));
		snprintf(version_info+str_len, min_len, DHD_prefix " %s\n",dhd_ver);
		str_len = strlen(version_info);

		DHD_INFO(("[WIFI] version_info len : %d\n", str_len));
		DHD_INFO(("[WIFI] version_info : %s\n", version_info));
	}else{
		DHD_ERROR(("[WIFI] Driver version is missing.\n"));
	}

	if(strlen(firm_ver)){
		min_len = min(strlen(firm_ver) ,  max_len(temp_buf, Firm_prefix));
		min_len += strlen(Firm_prefix) + 3;
		DHD_INFO(("[WIFI] firmware ver length : %d\n", min_len));
		snprintf(version_info+str_len, min_len, Firm_prefix " %s\n",firm_ver);
		str_len = strlen(version_info);

		DHD_INFO(("[WIFI] version_info len : %d\n", str_len));
		DHD_INFO(("[WIFI] version_info : %s\n", version_info));
	}else{
		DHD_ERROR(("[WIFI] Firmware version is missing.\n"));
	}

	if(nvram_p){
		memset(temp_buf,0,sizeof(temp_buf));
		nvfp = filp_open(nvram_p, O_RDONLY, 0);
		if (IS_ERR(nvfp) || (nvfp == NULL)) {
			DHD_ERROR(("[WIFI] %s: Nvarm File open failed.\n", __FUNCTION__));
			return -1;
		} else {
			ret = kernel_read(nvfp, nvfp->f_pos, temp_buf, sizeof(temp_buf));
			filp_close(nvfp, NULL);
		}

		if(strlen(temp_buf)){
			nvram_buf = temp_buf;
			bcmstrtok(&nvram_buf, "\n", 0);
			DHD_INFO(("[WIFI] nvram tolkening : %s(%d) \n", temp_buf, strlen(temp_buf)));
			snprintf(version_info+str_len, tstr_len(temp_buf, Nv_prefix), Nv_prefix " %s\n", temp_buf);
			str_len = strlen(version_info);
			DHD_INFO(("[WIFI] version_info : %s\n", version_info));
			DHD_INFO(("[WIFI] version_info len : %d, nvram len : %d\n", str_len, strlen(temp_buf)));
		}else{
			DHD_ERROR(("[WIFI] No info is missing.\n"));
		}
	}else{
		DHD_ERROR(("[WIFI] No nvram path\n"));
	}

	DHD_INFO(("[WIFI] version_info : %s, strlen : %d\n", version_info,strlen(version_info)));

	fp = filp_open(filepath, O_RDONLY, 0);
	if (fp != NULL) {
		if (IS_ERR(fp) || (fp == NULL)) {
			DHD_INFO(("[WIFI] %s: File open failed.\n", __FUNCTION__));
		} else {
			memset(version_old_info, 0, sizeof(version_old_info));
			ret = kernel_read(fp, fp->f_pos, version_old_info, sizeof(version_info));
			filp_close(fp, NULL);
			DHD_INFO(("[WIFI] kernel_read ret : %d.\n", ret));
			if(strcmp(version_info,version_old_info) == 0){
				DHD_ERROR(("[WIFI] %s: : already saved.\n", __FUNCTION__));
				return 0;
			}
		}
	}

	fp = filp_open(filepath, O_RDWR | O_CREAT, 0666);
	if (IS_ERR(fp) || (fp == NULL)) {
		DHD_ERROR(("[WIFI] %s: File open failed.\n",
			__FUNCTION__));
	} else {
		ret = write_filesystem(fp, fp->f_pos, version_info, sizeof(version_info));
		DHD_INFO(("[WIFI] sec_save_wlinfo done. ret : %d\n",ret));
		DHD_ERROR(("[WIFI] save .wifiver.info file.\n"));
		filp_close(fp, NULL);
	}
	return ret;
}