static int wifi_data_read_proc(struct file *file, char __user *buf, size_t size, loff_t *ppos) { unsigned char *ptr; unsigned int count = size; unsigned long p = *ppos; int ret = 0; if (p >= NVS_DATA_OFFSET) return 0; if (count > NVS_DATA_OFFSET - p) count = NVS_DATA_OFFSET - p; ptr = get_wifi_nvs_ram(); if (ptr != NULL) { if (copy_to_user(buf, (void*)(ptr+p), count)) { ret = - EFAULT; printk("wifi_data_read_proc: FAIL to copy \n"); } else { *ppos += count; ret = count; } } else { ret = - EFAULT; printk("wifi_data_read_proc: ptr is null \n"); } return ret; }
static uint get_mac_from_wifi_nvs_ram(char *buf, unsigned int buf_len) { unsigned char *nvs_ptr; unsigned char *mac_ptr; uint len = 0; if (!buf || !buf_len) return 0; nvs_ptr = get_wifi_nvs_ram(); if (nvs_ptr) nvs_ptr += NVS_DATA_OFFSET; mac_ptr = strstr(nvs_ptr, WIFI_MAC_PARAM_STR); if (mac_ptr) { mac_ptr += strlen(WIFI_MAC_PARAM_STR); while (mac_ptr[0] == ' ') mac_ptr++; len = 0; while (mac_ptr[len] != '\r' && mac_ptr[len] != '\n' && mac_ptr[len] != '\0') { len++; } if (len > buf_len) len = buf_len; memcpy(buf, mac_ptr, len); } return len; }
static unsigned holiday_wifi_update_nvs(char *str) { #define NVS_LEN_OFFSET 0x0C #define NVS_DATA_OFFSET 0x40 unsigned char *ptr; unsigned len; if (!str) return -EINVAL; ptr = get_wifi_nvs_ram(); /* Size in format LE assumed */ memcpy(&len, ptr + NVS_LEN_OFFSET, sizeof(len)); /* the last bye in NVRAM is 0, trim it */ if (ptr[NVS_DATA_OFFSET + len - 1] == 0) len -= 1; if (ptr[NVS_DATA_OFFSET + len -1] != '\n') { len += 1; ptr[NVS_DATA_OFFSET + len -1] = '\n'; } strcpy(ptr + NVS_DATA_OFFSET + len, str); len += strlen(str); memcpy(ptr + NVS_LEN_OFFSET, &len, sizeof(len)); return 0; }
static unsigned mahimahi_wifi_update_nvs(char *str, int add_flag) { #define NVS_LEN_OFFSET 0x0C #define NVS_DATA_OFFSET 0x40 unsigned char *ptr; unsigned len; if (!str) return -EINVAL; ptr = get_wifi_nvs_ram(); /* Size in format LE assumed */ memcpy(&len, ptr + NVS_LEN_OFFSET, sizeof(len)); /* if the last byte in NVRAM is 0, trim it */ if (ptr[NVS_DATA_OFFSET + len - 1] == 0) len -= 1; if (add_flag) { strcpy(ptr + NVS_DATA_OFFSET + len, str); len += strlen(str); } else { if (strnstr(ptr + NVS_DATA_OFFSET, str, len)) len -= strlen(str); } memcpy(ptr + NVS_LEN_OFFSET, &len, sizeof(len)); wifi_calibration_size_set(); return 0; }
static unsigned k2_u_wifi_update_nvs(char *str) { #define NVS_LEN_OFFSET 0x0C #define NVS_DATA_OFFSET 0x40 unsigned char *ptr; unsigned len; if (!str) return -EINVAL; ptr = get_wifi_nvs_ram(); memcpy(&len, ptr + NVS_LEN_OFFSET, sizeof(len)); if (ptr[NVS_DATA_OFFSET + len - 1] == 0) len -= 1; if (ptr[NVS_DATA_OFFSET + len - 1] != '\n') { len += 1; ptr[NVS_DATA_OFFSET + len - 1] = '\n'; } strcpy(ptr + NVS_DATA_OFFSET + len, str); len += strlen(str); memcpy(ptr + NVS_LEN_OFFSET, &len, sizeof(len)); return 0; }
int htc_get_wifi_data(char *buf) { unsigned char *ptr; ptr = get_wifi_nvs_ram(); memcpy(buf, ptr, NVS_DATA_OFFSET); return NVS_DATA_OFFSET; }
static int wifi_data_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { unsigned char *ptr; ptr = get_wifi_nvs_ram(); memcpy(page, ptr, NVS_DATA_OFFSET); return NVS_DATA_OFFSET; }
int htc_get_wifi_calibration(char *buf, int count) { unsigned char *ptr; unsigned len; ptr = get_wifi_nvs_ram(); len = min(wifi_get_nvs_size(), (unsigned) count); memcpy(buf, ptr + NVS_DATA_OFFSET, len); return len; }
static unsigned wifi_get_nvs_size( void ) { unsigned char *ptr; unsigned len; ptr = get_wifi_nvs_ram(); /* Size in format LE assumed */ memcpy(&len, ptr + NVS_LEN_OFFSET, sizeof(len)); len = min(len, (NVS_MAX_SIZE - NVS_DATA_OFFSET)); return len; }
static int wifi_calibration_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { unsigned char *ptr; unsigned len; ptr = get_wifi_nvs_ram(); len = min(wifi_get_nvs_size(), (unsigned)count); memcpy(page, ptr + NVS_DATA_OFFSET, len); return len; }
static unsigned strip_nvs_param(char* param) { unsigned char *nvs_data; unsigned param_len; int start_idx, end_idx; unsigned char *ptr; unsigned len; if (!param) return -EINVAL; ptr = get_wifi_nvs_ram(); /* Size in format LE assumed */ memcpy(&len, ptr + NVS_LEN_OFFSET, sizeof(len)); /* the last bye in NVRAM is 0, trim it */ if (ptr[NVS_DATA_OFFSET + len -1] == 0) len -= 1; nvs_data = ptr + NVS_DATA_OFFSET; param_len = strlen(param); /* search param */ for (start_idx = 0; start_idx < len - param_len; start_idx++) { if (memcmp(&nvs_data[start_idx], param, param_len) == 0) { break; } } end_idx = 0; if (start_idx < len - param_len) { /* search end-of-line */ for (end_idx = start_idx + param_len; end_idx < len; end_idx++) { if (nvs_data[end_idx] == '\n' || nvs_data[end_idx] == 0) { break; } } } if (start_idx < end_idx) { /* move the remain data forward */ for (; end_idx + 1 < len; start_idx++, end_idx++) { nvs_data[start_idx] = nvs_data[end_idx+1]; } len = len - (end_idx - start_idx + 1); memcpy(ptr + NVS_LEN_OFFSET, &len, sizeof(len)); } return 0; }
static unsigned strip_nvs_param(char *param) { unsigned char *nvs_data; unsigned param_len; int start_idx, end_idx; unsigned char *ptr; unsigned len; if (!param) return -EINVAL; ptr = get_wifi_nvs_ram(); memcpy(&len, ptr + NVS_LEN_OFFSET, sizeof(len)); if (ptr[NVS_DATA_OFFSET + len - 1] == 0) len -= 1; nvs_data = ptr + NVS_DATA_OFFSET; param_len = strlen(param); for (start_idx = 0; start_idx < len - param_len; start_idx++) { if (memcmp(&nvs_data[start_idx], param, param_len) == 0) break; } end_idx = 0; if (start_idx < len - param_len) { for (end_idx = start_idx + param_len; end_idx < len; end_idx++) { if (nvs_data[end_idx] == '\n' || nvs_data[end_idx] == 0) break; } } if (start_idx < end_idx) { for (; end_idx + 1 < len; start_idx++, end_idx++) nvs_data[start_idx] = nvs_data[end_idx+1]; len = len - (end_idx - start_idx + 1); memcpy(ptr + NVS_LEN_OFFSET, &len, sizeof(len)); } return 0; }
static int wifi_calibration_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { unsigned char *ptr; unsigned len; #ifdef NVS_MSM_WIFI_DEBUG unsigned i; #endif memcpy(page, nvs_mac_addr, NVS_MACADDR_SIZE); ptr = get_wifi_nvs_ram(); len = min(wifi_get_nvs_size(), (unsigned)count); memcpy(page+NVS_MACADDR_SIZE, ptr, strlen(hardcoded_nvs)); #ifdef NVS_MSM_WIFI_DEBUG printk("WiFi Data len = %d \n", len); for(i=0;( i < len );i++) { printk("%c", *page++); } #endif return len; }
static uint get_mac_from_wifi_nvs_ram(char* buf, unsigned int buf_len) { unsigned char *nvs_ptr; unsigned char *mac_ptr; uint len = 0; if (!buf || !buf_len) { return 0; } nvs_ptr = get_wifi_nvs_ram(); if (nvs_ptr) { nvs_ptr += NVS_DATA_OFFSET; } mac_ptr = strstr(nvs_ptr, WIFI_MAC_PARAM_STR); if (mac_ptr) { mac_ptr += strlen(WIFI_MAC_PARAM_STR); /* skip holidaying space */ while (mac_ptr[0] == ' ') { mac_ptr++; } /* locate end-of-line */ len = 0; while (mac_ptr[len] != '\r' && mac_ptr[len] != '\n' && mac_ptr[len] != '\0') { len++; } if (len > buf_len) { len = buf_len; } memcpy(buf, mac_ptr, len); } return len; }
/* calibration read func */ static int emapi_calibration_read(char *page, char **start, off_t off, int count, int *eof, void *data) { unsigned char *nvs; unsigned long len; nvs = get_wifi_nvs_ram(); if (nvs) { /* htc specific, 0x0c: body len */ memcpy(&len, nvs + 0x0c, 4); /* max size is 2048 */ len = min(len+ 0x40, (unsigned long)2048); memcpy((void *)page, (void *) nvs, len); //memcpy(page, nvs, len); printk("%s - read %d bytes\n", __FUNCTION__, (unsigned int)len); return len; } else { printk("%s - no calibration data\n", __FUNCTION__); return -EIO; } }