Changeset 11586


Ignore:
Timestamp:
02/11/09 11:40:24 (4 years ago)
Author:
eko
Message:

write fake checksum for Netgear WGR614L, so we don't need special trx image any more

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/brcm/linux.v24_2/drivers/mtd/maps/bcm947xx-flash.c

    r11376 r11586  
    380380                vfree(block); 
    381381                printk(KERN_EMERG "Done\n"); 
     382                 
     383                /* Write fake Netgear checksum to the flash */           
     384                uint boardnum = bcm_strtoul( nvram_safe_get( "boardnum" ), NULL, 0 ); 
     385                if ( (boardnum == 83258 || boardnum == 01)  //or 001 or 0x01 
     386                && (nvram_match("boardtype", "0x048e") || nvram_match("boardtype", "0x48E")) 
     387                && (nvram_match("boardrev", "0x11") || nvram_match("boardrev", "0x10")) 
     388                && (nvram_match("boardflags", "0x750") || nvram_match("boardflags", "0x0750")) 
     389                &&  nvram_match ("sdram_init", "0x000A") ) { 
     390#define WGR614_CHECKSUM_BLOCK_START    0x003A0000 
     391#define WGR614_CHECKSUM_OFF            0x003AFFF8 
     392#define WGR614_FAKE_LEN                0x00000004  //we fake checksum only over 4 bytes (HDR0) 
     393#define WGR614_FAKE_CHK                0x02C0010E 
     394                /* 
     395                 * Read into buffer  
     396                 */ 
     397                block = vmalloc(mtd->erasesize); 
     398                if (MTD_READ(mtd, WGR614_CHECKSUM_BLOCK_START, mtd->erasesize, &len, block) || 
     399                    len != mtd->erasesize) { 
     400                        printk(KERN_EMERG "Error accessing the WGR614 checksum eraseblock\n"); 
     401                        vfree(block); 
     402                        } 
     403                        else { 
     404                        char imageInfo[8]; 
     405                        u32 fake_len = le32_to_cpu(WGR614_FAKE_LEN); 
     406                        u32 fake_chk = le32_to_cpu(WGR614_FAKE_CHK); 
     407                        memcpy(&imageInfo[0], (char *)&fake_len, 4); 
     408                        memcpy(&imageInfo[4], (char *)&fake_chk, 4); 
     409                        char *tmp;       
     410                        tmp = block + ((WGR614_CHECKSUM_OFF - WGR614_CHECKSUM_BLOCK_START) % mtd->erasesize); 
     411                        memcpy( tmp, imageInfo, sizeof( imageInfo ) ); 
     412                        if (mtd->unlock) 
     413                                mtd->unlock(mtd, WGR614_CHECKSUM_BLOCK_START, mtd->erasesize); 
     414                        erase_write(mtd, WGR614_CHECKSUM_BLOCK_START, mtd->erasesize, block); 
     415                        if (mtd->sync) 
     416                                mtd->sync(mtd); 
     417                        vfree(block); 
     418                        printk(KERN_EMERG "Done fixing WGR614 checksum\n");                
     419                        } 
     420                }        
     421                 
     422                 
    382423        } 
    383424         
Note: See TracChangeset for help on using the changeset viewer.