Example #1
0
int
nvram_set(const char *name, const char *value)
{
	unsigned long flags;
	struct nvram_header *header;
	int ret;

	if (!name)
		return -EINVAL;

	// Check early write
	if (nvram_major < 0)
		return 0;

	spin_lock_irqsave(&nvram_lock, flags);
	if ((ret = _nvram_set(name, value))) {
		/* Consolidate space and try again */
		if ((header = kmalloc(NVRAM_SPACE, GFP_ATOMIC))) {
			if (_nvram_commit(header) == 0) {
				ret = _nvram_set(name, value);
			}
			kfree(header);
		}
	}
	spin_unlock_irqrestore(&nvram_lock, flags);

	return ret;
}
Example #2
0
/* (Re)initialize the hash table. Should be locked. */
static int
BCMINITFN(nvram_rehash)(struct nvram_header *header)
{
	char buf[] = "0xXXXXXXXX", *name, *value, *end, *eq;

	/* (Re)initialize hash table */
	nvram_free();

	/* Parse and set "name=value\0 ... \0\0" */
	name = (char *) &header[1];
	end = (char *) header + NVRAM_SPACE - 2;
	end[0] = end[1] = '\0';
	for (; *name; name = value + strlen(value) + 1) {
		if (!(eq = strchr(name, '=')))
			break;
		*eq = '\0';
		value = eq + 1;
		_nvram_set(name, value);
		*eq = '=';
	}

	/* Set special SDRAM parameters */
	if (!_nvram_get("sdram_init")) {
		sprintf(buf, "0x%04X", (uint16)(header->crc_ver_init >> 16));
		_nvram_set("sdram_init", buf);
	}
Example #3
0
/* (Re)initialize the hash table. Should be locked. */
static int
BCMINITFN(nvram_rehash)(struct nvram_header *header)
{
	char buf[] = "0xXXXXXXXX", *name, *value, *end, *eq;
	struct nvram_header *hdrptr;
	/* (Re)initialize hash table */
	nvram_free();

	hdrptr = header;

	/* Parse and set "name=value\0 ... \0\0" */
	name = (char *) &hdrptr[1];
	end = (char *) hdrptr + NVRAM_SPACE - 2;
	end[0] = end[1] = '\0';

again:
	for (; *name; name = value + strlen(value) + 1) {
		if (!(eq = strchr(name, '=')))
			break;
		*eq = '\0';
		value = eq + 1;
		_nvram_set(name, value);
		*eq = '=';
	}

printk("rehash %x %x\n", header, name);
{
	int j;

	for(j=0;j<64;j++) {
		if(j%16==0) printk("\n");
		printk("%x ", *(name-32+j));
	}
	printk("\n");
}
	hdrptr = find_next_header(header, name+2);

	if(hdrptr)
		printk("magic: %x\n", hdrptr->magic);

	if(hdrptr && hdrptr->magic==NVRAM_MAGIC) {
		name = (char *)&hdrptr[1];
		goto again;
	}

	/* Set special SDRAM parameters */
	if (!_nvram_get("sdram_init")) {
		sprintf(buf, "0x%04X", (uint16)(header->crc_ver_init >> 16));
		_nvram_set("sdram_init", buf);
	}
Example #4
0
int nvram_unset(const char *name)
{
//lock();
	int v = _nvram_set(name, NULL);
//unlock();
	return v;
}
Example #5
0
int
nvram_set(const char *name, const char *value)
{
	unsigned long flags;
	int ret;
	struct nvram_header *header;

	spin_lock_irqsave(&nvram_lock, flags);
#ifdef CFE_UPDATE //write back to default sector as well, Chen-I
        if(strncmp(name, CFE_NVRAM_PREFIX, strlen(CFE_NVRAM_PREFIX))==0)
        {
                if(strcmp(name, CFE_NVRAM_COMMIT)==0)
		{
#ifdef CONFIG_MTD_NFLASH
			spin_unlock_irqrestore(&nvram_lock, flags);
			return cfe_commit();
#else
			cfe_commit();
#endif
		}
                else if(strcmp(name, "asuscfe_dump") == 0)
                        ret = cfe_dump();
                else if(strcmp(name, CFE_NVRAM_WATCHDOG)==0)
                {
                        bcm947xx_watchdog_disable();
                }
                else
                {
                        cfe_update(name+strlen(CFE_NVRAM_PREFIX), value);
                        _nvram_set(name+strlen(CFE_NVRAM_PREFIX), value);
                }
        }
        else
#endif
	if ((ret = _nvram_set(name, value))) {
		printk( KERN_INFO "nvram: consolidating space!\n");
		/* Consolidate space and try again */
		if ((header = kmalloc(nvram_space, GFP_ATOMIC))) {
			if (_nvram_commit(header) == 0)
				ret = _nvram_set(name, value);
			kfree(header);
		}
	}
	spin_unlock_irqrestore(&nvram_lock, flags);

	return ret;
}
Example #6
0
int
nvram_set(const char *name, const char *value)
{
	int ret;

	NVRAM_LOCK();
	ret = _nvram_set(name, value);
	NVRAM_UNLOCK();

	return ret;
}
Example #7
0
int
nvram_set(const char *name, const char *value)
{
	unsigned long flags;
	int ret;
	struct nvram_header *header;

	spin_lock_irqsave(&nvram_lock, flags);
	if ((ret = _nvram_set(name, value))) {
		printk( KERN_INFO "nvram: consolidating space!\n");
		/* Consolidate space and try again */
		if ((header = kmalloc(nvram_space, GFP_ATOMIC))) {
			if (_nvram_commit(header) == 0)
				ret = _nvram_set(name, value);
			kfree(header);
		}
	}
	spin_unlock_irqrestore(&nvram_lock, flags);

	return ret;
}
Example #8
0
int nvram_set(const char *name, const char *value)
{
	LOCK_NVRAM();
	int stat;
	if(!(_nvram!=NULL)) _nvram =  _lib_nvram_open_staging();
	if(!(_nvram!=NULL)) {
		UNLOCK_NVRAM();
		return -1;
	}
	stat=_nvram_set(_nvram, name,value);
	UNLOCK_NVRAM();
	return stat;
}
Example #9
0
int nvram_set(const char *name, const char *value)
{
	extern struct nvram_convert nvram_converts[];
	struct nvram_convert *v;
	int ret;
#ifdef HAVE_NOWIFI
	if (!strcmp(name, "ip_conntrack_max") && value != NULL) {
		int val = atoi(value);
		if (val > 4096) {
			return _nvram_set(name, "4096");
		}

	}
#endif
	ret = _nvram_set(name, value);

	for (v = nvram_converts; v->name; v++) {
		if (!strcmp(v->name, name)) {
			if (strcmp(v->wl0_name, ""))
				_nvram_set(v->wl0_name, value);
		}
	}
	return ret;
}
Example #10
0
/* (Re)initialize the hash table. */
static int _nvram_rehash(nvram_handle_t *h)
{
	nvram_header_t *header =(nvram_header_t *) &h->mmap[0]; 
	char *name, *value, *eq;

	_nvram_free(h);
	name = (char *) &header[1];
	for (; *name; name = value + strlen(value) + 1)
	{
		if (!(eq = strchr(name, '=')))  //。第一个形参就是要搜索的字符串,第二个是被搜索的字符。
			//如果找到了该字符就返回该字符第一次出现的内存地址。如果没有找到就返回NULL(也就是0)。
			break;
		*eq = '\0';
		value = eq + 1;
		_nvram_set(h, name, value);
		*eq = '=';
	}
	return 0;
}
Example #11
0
File: nvram.c Project: janfj/dd-wrt
/* (Re)initialize the hash table. Should be locked. */
static int nvram_rehash(struct nvram_header *header)
{
	char *name, *value, *end, *eq;
	/* (Re)initialize hash table */
	nvram_free();

	/* Parse and set "name=value\0 ... \0\0" */
	name = (char *)&header[1];
	end = (char *)header + NVRAM_SPACE - 2;
	end[0] = end[1] = '\0';
	for (; *name; name = value + strlen(value) + 1) {
		if (!(eq = strchr(name, '=')))
			break;
		*eq = '\0';
		value = eq + 1;
		_nvram_set(name, value);
		*eq = '=';
	}

	return 0;
}
Example #12
0
int
_nvram_read(char *buf)
{
	struct nvram_header *header = (struct nvram_header *) buf;
	size_t len;
	int offset = 0;

	if (nvram_mtd) {
#ifdef NFLASH_SUPPORT
		if (nvram_mtd->type == MTD_NANDFLASH)
			offset = 0;
		else
#endif
			offset = nvram_mtd->size - nvram_space;
	}

#ifdef RTN66U_NVRAM_64K_SUPPORT /*Only for RT-N66U upgrade from nvram 32K -> 64K*/
	if (nvram_32_reset==1 || 
	    !nvram_mtd ||
            nvram_mtd->read(nvram_mtd, offset, nvram_space, &len, buf) ||
            len != nvram_space ||
	    header->magic != NVRAM_MAGIC) {
		nvram_32_reset=0;
#else
	if (nvram_inram || !nvram_mtd ||
	    nvram_mtd->read(nvram_mtd, offset, nvram_space, &len, buf) ||
	    len != nvram_space ||
	    header->magic != NVRAM_MAGIC) {
#endif
		/* Maybe we can recover some data from early initialization */
		if (nvram_inram)
			printk("Sourcing NVRAM from ram\n");
		memcpy(buf, nvram_buf, nvram_space);
	}

	return 0;
}

struct nvram_tuple *
_nvram_realloc(struct nvram_tuple *t, const char *name, const char *value)
{
	if ((nvram_offset + strlen(value) + 1) > nvram_space)
		return NULL;

	if (!t) {
		if (!(t = kmalloc(sizeof(struct nvram_tuple) + strlen(name) + 1, GFP_ATOMIC)))
			return NULL;

		/* Copy name */
		t->name = (char *) &t[1];
		strcpy(t->name, name);

		t->value = NULL;
	}

	/* Copy value */
	if (!t->value || strcmp(t->value, value)) {
		t->value = &nvram_buf[nvram_offset];
		strcpy(t->value, value);
		nvram_offset += strlen(value) + 1;
	}

	return t;
}

void
_nvram_free(struct nvram_tuple *t)
{
	if (!t)
		nvram_offset = 0;
	else
		kfree(t);
}

int
nvram_init(void *sih)
{
	return 0;
}

int
nvram_set(const char *name, const char *value)
{
	unsigned long flags;
	int ret;
	struct nvram_header *header;

	spin_lock_irqsave(&nvram_lock, flags);

#ifdef CFE_UPDATE //write back to default sector as well, Chen-I
        if(strncmp(name, CFE_NVRAM_PREFIX, strlen(CFE_NVRAM_PREFIX))==0)
        {
                if(strcmp(name, CFE_NVRAM_COMMIT)==0)
                        cfe_commit();
                else if(strcmp(name, "asuscfe_dump") == 0)
                        ret = cfe_dump();
                else if(strcmp(name, CFE_NVRAM_WATCHDOG)==0)
                {
                        bcm947xx_watchdog_disable();
                }
                else
                {
                        cfe_update(name+strlen(CFE_NVRAM_PREFIX), value);
                        _nvram_set(name+strlen(CFE_NVRAM_PREFIX), value);
                }
        }
        else
#endif
	if ((ret = _nvram_set(name, value))) {
		/* Consolidate space and try again */
		if ((header = kmalloc(nvram_space, GFP_ATOMIC))) {
			if (_nvram_commit(header) == 0)
				ret = _nvram_set(name, value);
			kfree(header);
		}
	}
	spin_unlock_irqrestore(&nvram_lock, flags);

	return ret;
}
Example #13
0
int
nvram_set_temp(const char *name, const char *value)
{
	return _nvram_set(name, value, 1);
}
Example #14
0
int nvram_set_int_temp(const char *name, int value)
{
	char int_str[16];
	sprintf(int_str, "%d", value);
	return _nvram_set(name, int_str, 1);
}
Example #15
0
int
nvram_set(const char *name, const char *value)
{
	unsigned long flags;
	int ret;
	struct nvram_header *header;
#if WPS
	char wps_name[32];
	int wep_len;
#endif

	spin_lock_irqsave(&nvram_lock, flags);

	//printk("nvram_set: name = %s, value = %s!\n", name, value);
#ifdef CFE_UPDATE
		// write back to default sector as well, Chen-I
        if(strncmp(name, CFE_NVRAM_PREFIX, strlen(CFE_NVRAM_PREFIX))==0)
        {
                if(strcmp(name, CFE_NVRAM_COMMIT)==0)
                        cfe_commit();
                else if(strcmp(name, "asuscfe_dump") == 0)
                        ret = cfe_dump();
                else if(strcmp(name, CFE_NVRAM_WATCHDOG)==0)
                {
                        bcm947xx_watchdog_disable();
                }
                else
                {
                        cfe_update(name+strlen(CFE_NVRAM_PREFIX), value);
                        _nvram_set(name+strlen(CFE_NVRAM_PREFIX), value);
                }
        }
        else
#endif /* CFE_UPDATE */

#if WPS
	if (strncmp(name, "wlx_", 4) == 0) {
		memset(wps_name, 0, sizeof(wps_name));
		sprintf(wps_name, "wl0_%s", name+4);
		ret = _nvram_set(wps_name, value);
		spin_unlock_irqrestore(&nvram_lock, flags);
                return ret;
	}

	if (strncmp(name, "wl0_", 4) == 0) 
	{
		/* Authentication mode */
		if (strncmp(name, "wl0_akm", 7) == 0) {
			if (strncmp(value, "psk2", 4) == 0) { 		// WPA2-Personal
        	                _nvram_set("wl_auth_mode", "psk");
	                        _nvram_set("wl_wpa_mode", "2");
			}
		        else if (strncmp(value, "psk ", 4) == 0) { 	// WPA-Auto-Personal
        	                _nvram_set("wl_auth_mode", "psk");
                	        _nvram_set("wl_wpa_mode", "0");
	                }
                	else if (strncmp(value, "psk", 3) == 0) { 	// WPA-Personal
        	                _nvram_set("wl_auth_mode", "psk");
                	        _nvram_set("wl_wpa_mode", "1");
	                }
        	        else if (strncmp(value, "wpa2", 4) == 0) {	// WPA2-Enterprise
                	        _nvram_set("wl_auth_mode", "wpa2");
        	        }
		        else if (strncmp(value, "wpa ", 4) == 0) {	// WPA-Auto-Enterprise
	                       	_nvram_set("wl_wpa_mode", "4");
        	                _nvram_set("wl_auth_mode", "wpa");
                	}
                	else if (strncmp(value, "wpa", 3) == 0) {	// WPA-Enterprise
	                       	_nvram_set("wl_wpa_mode", "3");
        	                _nvram_set("wl_auth_mode", "wpa");
                	}
			_nvram_set("wl_akm", value);
		}
		/* WPS KEY*/
		else if (strcmp(name, "wl0_wpa_psk") == 0) {
			_nvram_set("wl_wpa_psk", value);
		}
		/* WEP type */
#if 1
		else if ((strncmp(name, "wl0_key", 7) == 0 )) {

			wep_len = strlen (value);
			memset(wps_name, 0, sizeof(wps_name));

			if ((wep_len == 5) || (wep_len == 10)) { /* wl0_key1~4*/
//				_nvram_set ("wl0_wep_x", "1");
				_nvram_set ("wl_wep_x", "1");
				sprintf(wps_name, "wl_%s", name+4);
			}
			else if ((wep_len == 13) || (wep_len == 26)) { 
//				_nvram_set ("wl0_wep_x", "2");
				_nvram_set ("wl_wep_x", "2");
				sprintf(wps_name, "wl_%s", name+4);
			}
			else { /* wl0_key index */
				sprintf(wps_name, "wl_%s", name+4);
			}
			_nvram_set(wps_name, value);
		}
#endif
		else if (strcmp(name, "wl0_ssid") == 0) {
	//		_nvram_set("wl0_ssid2", value);
	//		_nvram_set("wl_ssid2", value);
			_nvram_set("wl_ssid", value);
		}	
		else if (strcmp(name, "wl0_crypto") == 0) {
			_nvram_set("wl_crypto", value);
		}
		else if (strncmp(name, "wl0_wps", 7) == 0) {
			memset(wps_name, 0, sizeof(wps_name));
			sprintf(wps_name, "wl_%s", name+4);
			_nvram_set(wps_name, value);
		}

	}
	else if (strncmp(name, "wps_random_ssid_prefix", 22) == 0) {
		memset(wps_name, 0, sizeof(wps_name));
		sprintf(wps_name, "ASUS_");
		ret = _nvram_set("wps_random_ssid_prefix", wps_name);
		spin_unlock_irqrestore(&nvram_lock, flags);
		return ret;
	}

	if ((strcmp(name, "wl_wps_config_state") == 0) || (strcmp(name, "wl0_wps_config_state") == 0))
		_nvram_set("wps_config_state", value);
//	else if ((strncmp(name, "wps_proc_status", 15) == 0 ) && (strcmp(value, "4"))) /* WPS success*/
//		_nvram_set("wps_config_state", "1");

#if 0
	if(!strcmp(name, "wl0_ssid"))
		_nvram_set("wl_ssid", value);
	if(!strcmp(name, "wl0_ssid"))
		_nvram_set("wl_ssid", value);
        /* Set Wireless encryption */
        if (!strcmp(name, "wl0_akm")) {
		_nvram_set("wl_auth_mode", "psk");
                _nvram_set("wl_wpa_mode", "1");
	}
	else if (!strcmp("wl0_akm", "psk2")) {
                _nvram_set("wl_auth_mode", "psk");
                _nvram_set("wl_wpa_mode", "2");
        }
        else if (nvram_match("wl0_akm", "wpa")) {
                _nvram_set("wl_auth_mode", "wpa");
                _nvram_set("wl_wpa_mode", "3");
        }
        else if (nvram_match("wl0_akm", "wpa2")) {
                _nvram_set("wl_auth_mode", "wpa2");
        }
        else
                _nvram_set("wl_auth_mode", nvram_get("wl0_auth_mode"));
#endif
#endif /* WPS */

	if ((ret = _nvram_set(name, value))) {
		/* Consolidate space and try again */
		if ((header = kmalloc(NVRAM_SPACE, GFP_ATOMIC))) {
			if (_nvram_commit(header) == 0)
				ret = _nvram_set(name, value);
			kfree(header);
		}
	}
	spin_unlock_irqrestore(&nvram_lock, flags);

	return ret;
}
Example #16
0
int
nvram_set(const char *name, const char *value)
{
	return _nvram_set(name, value);
}
Example #17
0
int
nvram_unset(const char *name)
{
	return _nvram_set(name, NULL);
}