コード例 #1
0
ファイル: nvram_linux.c プロジェクト: 3sOx/asuswrt-merlin
static int cfe_init(void)
{
        size_t erasesize;
        int i;
        int ret = 0;
printk("!!! cfe_init !!!\n");
        /* Find associated MTD device */
        for (i = 0; i < MAX_MTD_DEVICES; i++) {
                cfe_mtd = get_mtd_device(NULL, i);
                if (cfe_mtd != NULL) {
                        printk("cfe_init: CFE MTD %x %s %x\n", i, cfe_mtd->name, cfe_mtd->size);
                        if (!strcmp(cfe_mtd->name, "pmon"))
                                break;
                        put_mtd_device(cfe_mtd);
                }
        }

        if (i >= MAX_MTD_DEVICES)
        {
                printk("cfe_init: No CFE MTD\n");
                cfe_mtd = NULL;
                ret = -ENODEV;
        }

        if(cfe_mtd == NULL) goto fail;

        /* sector blocks to be erased and backup */
        erasesize = ROUNDUP(CFE_NVRAM_SPACE, cfe_mtd->erasesize);

	printk("cfe_init: block size %d\n", erasesize);
        cfe_buf = kmalloc(erasesize, GFP_KERNEL);

        if(cfe_buf == NULL)
        {
                printk("cfe_init: No CFE Memory\n");
                ret = -ENOMEM;
                goto fail;
        }
        if((ret = get_embedded_block(cfe_mtd, cfe_buf, erasesize, &cfe_offset, &cfe_nvram_header, &cfe_embedded_size)))
                goto fail;

        printk("cfe_init: cfe_nvram_header(%08x)\n", (unsigned int) cfe_nvram_header);
	bcm947xx_watchdog_disable();

        return 0;

fail:
        if (cfe_mtd != NULL)
        {
                put_mtd_device(cfe_mtd);
                cfe_mtd=NULL;
        }
        if(cfe_buf != NULL)
        {
                kfree(cfe_buf);
                cfe_buf=NULL;
        }
        return ret;
}
コード例 #2
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;
}
コード例 #3
0
ファイル: nvram_linux.c プロジェクト: 3sOx/asuswrt-merlin
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;
}
コード例 #4
0
ファイル: nvram_linux.c プロジェクト: Einheri/wl500g
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;
}
コード例 #5
0
ファイル: nvram_linux.c プロジェクト: Einheri/wl500g
void cfe_init(void)
{
        size_t erasesize, len;
        int i;

        /* Find associated MTD device */
        for (i = 0; i < MAX_MTD_DEVICES; i++) {
                cfe_mtd = get_mtd_device(NULL, i);
                if (cfe_mtd) {
                        printk("CFE MTD: %x %s %x\n", i, cfe_mtd->name, cfe_mtd->size);
                        if (!strcmp(cfe_mtd->name, "boot"))
                                break;
                        put_mtd_device(cfe_mtd);
                }
        }
        if (i >= MAX_MTD_DEVICES)
        {
                printk("No CFE MTD\n");
                cfe_mtd = NULL;
        }

        if(!cfe_mtd) goto fail;

        /* sector blocks to be erased and backup */
        erasesize = ROUNDUP(CFE_NVRAM_SPACE, cfe_mtd->erasesize);

        /* printk("block size %d\n", erasesize); */

        cfe_buf = kmalloc(erasesize, GFP_KERNEL);

        if(!cfe_buf)
        {
                /* printk("No CFE Memory\n"); */
                goto fail;
        }
        cfe_mtd->read(cfe_mtd, CFE_NVRAM_START, erasesize, &len, cfe_buf);

        /* find nvram header */
        for(i=0;i<len;i+=4)
        {
                cfe_nvram_header=(struct nvram_header *)&cfe_buf[i];
                if (cfe_nvram_header->magic==NVRAM_MAGIC) break;
        }

        bcm947xx_watchdog_disable(); /*disable watchdog as well */

#if 0                                                           
        printf("read from nvram %d %s\n", i, cfe_buf);
        for(i=0;i<CFE_SPACE;i++)
        {
              if(i%16) printk("\n");
              printk("%02x ", (unsigned char)cfe_buf[i]);
        }
#endif
        return;
fail:
        if (cfe_mtd)
        {
                put_mtd_device(cfe_mtd);
                cfe_mtd=NULL;
        }
        if(cfe_buf)
        {
                kfree(cfe_buf);
                cfe_buf=NULL;
        }
        return;
}