Changeset 27005


Ignore:
Timestamp:
2011-05-25T19:46:34+02:00 (5 years ago)
Author:
hauke
Message:

brcm47xx: fix partition layout on SimpleShare devices.

The flash driver code should be cleaned up and the broad detection code should be placed into arch code and used here.

This fixes #9323

Thank you Will Holmes for the patch.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/brcm47xx/files/drivers/mtd/maps/bcm47xx-flash.c

    r24267 r27005  
    9191#define ROUTER_NETGEAR_WNDR3300        3 
    9292#define ROUTER_NETGEAR_WNR3500L        4 
     93#define ROUTER_SIMPLETECH_SIMPLESHARE  5 
    9394 
    9495#ifdef CONFIG_SSB 
     
    127128        { name: "rootfs", offset: 0, size: 0, }, 
    128129        { name: "nvram", offset: 0, size: 0, }, 
     130        { name: NULL, }, /* Used to create custom partitons with the function get_router() */ 
    129131        { name: NULL, }, 
    130132}; 
     
    341343 
    342344 found: 
    343         printk(KERN_NOTICE"TRX offset : %lx\n", trxoff); 
     345        printk(KERN_NOTICE"TRX offset : %x\n", trxoff); 
    344346        if (part->size == 0) 
    345347                return 0; 
     
    398400        u16 sdram_init = 0; 
    399401        u16 cardbus = 0; 
     402        u16 strev = 0; 
    400403 
    401404        if (nvram_getenv("boardnum", buf, sizeof(buf)) >= 0) 
     
    411414        if (nvram_getenv("cardbus", buf, sizeof(buf)) >= 0) 
    412415                cardbus = simple_strtoul(buf, NULL, 0); 
     416        if (nvram_getenv("st_rev", buf, sizeof(buf)) >= 0) 
     417                strev = simple_strtoul(buf, NULL, 0); 
    413418 
    414419        if ((boardnum == 8 || boardnum == 01) 
     
    439444        } 
    440445 
     446        if (boardtype == 0x042f 
     447          && boardrev == 0x10 
     448          && boardflags == 0  
     449          && strev == 0x11) {  
     450                /* Simpletech Simpleshare */ 
     451                return ROUTER_SIMPLETECH_SIMPLESHARE; 
     452        } 
     453 
    441454        return 0; 
    442455} 
     
    451464         * Netgear WGR614v8/L/WW 
    452465         */ 
    453         int board_data_size = 0; 
    454  
    455         switch (get_router()) { 
    456         case ROUTER_NETGEAR_WGR614L: 
    457         case ROUTER_NETGEAR_WNR834B: 
    458         case ROUTER_NETGEAR_WNDR3300: 
    459         case ROUTER_NETGEAR_WNR3500L: 
    460                 /* Netgear: checksum is @ 0x003AFFF8 for 4M flash or checksum 
    461                  * is @ 0x007AFFF8 for 8M flash 
    462                  */ 
    463                 board_data_size = 4 * mtd->erasesize; 
    464                 break; 
    465         } 
     466        int custom_data_size = 0; 
    466467 
    467468        if ((cfe_size = find_cfe_size(mtd,size)) < 0) 
     
    474475        /* nvram */ 
    475476        if (cfe_size != 384 * 1024) { 
    476                 bcm47xx_parts[3].offset = size - ROUNDUP(NVRAM_SPACE, mtd->erasesize); 
    477                 bcm47xx_parts[3].size   = ROUNDUP(NVRAM_SPACE, mtd->erasesize); 
     477 
     478                switch (get_router()) { 
     479                case ROUTER_NETGEAR_WGR614L: 
     480                case ROUTER_NETGEAR_WNR834B: 
     481                case ROUTER_NETGEAR_WNDR3300: 
     482                case ROUTER_NETGEAR_WNR3500L: 
     483                        /* Netgear: checksum is @ 0x003AFFF8 for 4M flash or checksum 
     484                         * is @ 0x007AFFF8 for 8M flash 
     485                         */ 
     486                        custom_data_size = mtd->erasesize; 
     487 
     488                        bcm47xx_parts[3].offset = size - ROUNDUP(NVRAM_SPACE, mtd->erasesize); 
     489                        bcm47xx_parts[3].size   = ROUNDUP(NVRAM_SPACE, mtd->erasesize); 
     490 
     491                        /* Place CFE board_data into a partition */ 
     492                        bcm47xx_parts[4].name = "board_data"; 
     493                        bcm47xx_parts[4].offset = bcm47xx_parts[3].offset - custom_data_size; 
     494                        bcm47xx_parts[4].size   =  custom_data_size; 
     495                        break; 
     496 
     497                case ROUTER_SIMPLETECH_SIMPLESHARE: 
     498                        /* Fixup Simpletech Simple share nvram  */ 
     499 
     500                        printk("Setting up simpletech nvram\n"); 
     501                        custom_data_size = mtd->erasesize; 
     502 
     503                        bcm47xx_parts[3].offset = size - ROUNDUP(NVRAM_SPACE, mtd->erasesize) * 2; 
     504                        bcm47xx_parts[3].size   = ROUNDUP(NVRAM_SPACE, mtd->erasesize); 
     505 
     506                        /* Place backup nvram into a partition */ 
     507                        bcm47xx_parts[4].name = "nvram_copy"; 
     508                        bcm47xx_parts[4].offset = size - ROUNDUP(NVRAM_SPACE, mtd->erasesize); 
     509                        bcm47xx_parts[4].size   = ROUNDUP(NVRAM_SPACE, mtd->erasesize); 
     510                        break; 
     511 
     512                default: 
     513                        bcm47xx_parts[3].offset = size - ROUNDUP(NVRAM_SPACE, mtd->erasesize); 
     514                        bcm47xx_parts[3].size   = ROUNDUP(NVRAM_SPACE, mtd->erasesize); 
     515                } 
     516 
    478517        } else { 
    479518                /* nvram (old 128kb config partition on netgear wgt634u) */ 
     
    487526        /* linux (kernel and rootfs) */ 
    488527        if (cfe_size != 384 * 1024) { 
    489                 bcm47xx_parts[1].offset = bcm47xx_parts[0].size; 
    490                 bcm47xx_parts[1].size   = bcm47xx_parts[3].offset - dual_image_offset - 
    491                         bcm47xx_parts[1].offset - board_data_size; 
     528                if (get_router() == ROUTER_SIMPLETECH_SIMPLESHARE) { 
     529                        bcm47xx_parts[1].offset = bcm47xx_parts[0].size; 
     530                        bcm47xx_parts[1].size   = bcm47xx_parts[4].offset - dual_image_offset - 
     531                                bcm47xx_parts[1].offset - custom_data_size; 
     532                } else { 
     533                        bcm47xx_parts[1].offset = bcm47xx_parts[0].size; 
     534                        bcm47xx_parts[1].size   = bcm47xx_parts[3].offset - dual_image_offset - 
     535                                bcm47xx_parts[1].offset - custom_data_size; 
     536                } 
    492537        } else { 
    493538                /* do not count the elf loader, which is on one block */ 
     
    497542                        bcm47xx_parts[0].size -  
    498543                        (2*bcm47xx_parts[3].size) -  
    499                         mtd->erasesize - board_data_size; 
     544                        mtd->erasesize - custom_data_size; 
    500545        } 
    501546 
     
    504549        bcm47xx_parts[2].size = size - dual_image_offset - 
    505550                                bcm47xx_parts[2].offset - 
    506                                 bcm47xx_parts[3].size - board_data_size; 
     551                                bcm47xx_parts[3].size - custom_data_size; 
    507552 
    508553        return bcm47xx_parts; 
Note: See TracChangeset for help on using the changeset viewer.