[OpenWrt-Devel] [PATCH][RESEND.3] ar71xx:stops qihoo c301 booting into backup firmware

swigger swigger at gmail.com
Sat Sep 20 06:00:46 EDT 2014


thanks. I have done.

On Sat, Sep 20, 2014 at 5:39 PM, Weijie Gao <hackpascal at gmail.com> wrote:
> Hi,
>
> You need to register a account at patchwork.openwrt.org, and mark your previous patches Superseded.
>
> Weijie Gao
>
>
> On 2014/9/20 17:18, swigger wrote:
>> Openwrt recently adds Qihoo [NYSE:QIHU] C301 router support.
>> However, this router has a backup firmware in the second flash and the
>> current trunk can only boot 3 times before u-boot boots into that backup
>> firmware. This is a stratgy for unbricking.
>>
>> This patch makes u-boot happy.
>>
>> Signed-off-by: Xungneg li <swigger at gmail.com>
>> ---
>>  .../ar71xx/files/arch/mips/ath79/mach-qihoo-c301.c |   87 ++++++++++++++++++++
>>  1 file changed, 87 insertions(+)
>>
>> diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-qihoo-c301.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-qihoo-c301.c
>> index 08a602f..816a433 100644
>> --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-qihoo-c301.c
>> +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-qihoo-c301.c
>> @@ -14,6 +14,8 @@
>>  #include <linux/gpio.h>
>>  #include <linux/platform_device.h>
>>  #include <linux/ath9k_platform.h>
>> +#include <linux/crc32.h>
>> +#include <linux/mtd/mtd.h>
>>
>>  #include <asm/mach-ath79/ar71xx_regs.h>
>>
>> @@ -79,6 +81,7 @@ static struct gpio_keys_button qihoo_c301_gpio_keys[] __initdata = {
>>       },
>>  };
>>
>> +static int qihoo_c301_board = 0;
>>  struct flash_platform_data flash __initdata = {NULL, NULL, 0};
>>
>>  static void qihoo_c301_get_mac(const char *name, char *mac)
>> @@ -98,6 +101,7 @@ static void __init qihoo_c301_setup(void)
>>       u8 tmpmac[ETH_ALEN];
>>
>>       ath79_register_m25p80_multi(&flash);
>> +     qihoo_c301_board = 1;
>>
>>       ath79_gpio_function_enable(AR934X_GPIO_FUNC_JTAG_DISABLE);
>>
>> @@ -164,3 +168,86 @@ static void __init qihoo_c301_setup(void)
>>
>>  MIPS_MACHINE(ATH79_MACH_QIHOO_C301, "QIHOO-C301", "Qihoo 360 C301",
>>            qihoo_c301_setup);
>> +
>> +
>> +//the following code stops qihoo's uboot booting into the backup system.
>> +static void erase_callback(struct erase_info *erase)
>> +{
>> +     char * buf = (char*) erase->priv;
>> +     int ret;
>> +     size_t nb=0;
>> +
>> +     if (erase->state == MTD_ERASE_DONE)
>> +     {
>> +             ret = mtd_write(erase->mtd, 0, 0x10000, &nb, buf);
>> +     }
>> +     kfree(erase);
>> +     kfree(buf);
>> +}
>> +
>> +static int qihoo_reset_trynum(void)
>> +{
>> +     size_t nb = 0;
>> +     char *buf=0, *p;
>> +     const char * match = "image1trynum=";
>> +     size_t matchlen = strlen(match);
>> +     struct erase_info *erase;
>> +     struct mtd_info * mtd;
>> +     unsigned int newcrc;
>> +     int ret;
>> +
>> +     if (! qihoo_c301_board)
>> +             return 0;
>> +
>> +     mtd = get_mtd_device_nm("action_image_config");
>> +     if (IS_ERR(mtd))
>> +     {
>> +             return PTR_ERR(mtd);
>> +     }
>> +     if (mtd->size!=0x10000)
>> +     {
>> +             return -1;
>> +     }
>> +     buf = kzalloc(0x10000+4, GFP_KERNEL);
>> +     ret = mtd_read(mtd, 0, 0x10000, &nb, buf);
>> +     if (nb != 0x10000)
>> +     {
>> +             kfree(buf);
>> +             return -1;
>> +     }
>> +     for (p=buf+4; *p; p+=strlen(p)+1)
>> +     {
>> +             if (strncmp(p, match, matchlen)==0)
>> +             {
>> +                     p += matchlen;
>> +                     while (*p)
>> +                             *p++ = '0';
>> +                     break;
>> +             }
>> +     }
>> +
>> +     newcrc = crc32(~0, buf+4, 0xfffc)^0xffffffff;
>> +     memcpy(buf, &newcrc, 4);
>> +
>> +     erase = kzalloc(sizeof(struct erase_info), GFP_KERNEL);
>> +     if (!erase)
>> +     {
>> +             kfree(buf);
>> +             return -1;
>> +     }
>> +     erase->mtd      = mtd;
>> +     erase->callback = erase_callback;
>> +     erase->addr     = 0;
>> +     erase->len      = 0x10000;
>> +     erase->priv     = (u_long) buf;
>> +     ret = mtd_erase(mtd, erase);
>> +
>> +     if (ret) {
>> +             kfree(buf);
>> +             kfree(erase);
>> +             return ret;
>> +     }
>> +
>> +     return 0;
>> +}
>> +late_initcall(qihoo_reset_trynum);
>
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list