<br><br><div class="gmail_quote">2010/12/4 Carl-Daniel Hailfinger <span dir="ltr"><<a href="mailto:c-d.hailfinger.devel.2006@gmx.net">c-d.hailfinger.devel.2006@gmx.net</a>></span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Print lock status for all supported Winbond W39* chips:<br>
W39V040A<br>
W39V040(F)B<br>
W39V040(F)C<br>
W39V040FA<br>
W39V080A<br>
W39V080FA<br>
W39V080FA (dual mode)<br>
<br>
Please note that the W39V040B/W39V040FB pair has identical IDs,<br>
identical read/write/erase, but locking differs. Right now they have a<br>
common chip definition, but that will have to change in the future. For<br>
chipsets which support LPC and FWH, separating the chips will be really<br>
painful because both variants will be detected and the user will have to<br>
choose. Same problem appears for W39V040C/W39V040FC.<br>
A better evil twin handling (patch available) will resolve that problem.<br>
<br>
Signed-off-by: Carl-Daniel Hailfinger <<a href="mailto:c-d.hailfinger.devel.2006@gmx.net">c-d.hailfinger.devel.2006@gmx.net</a>><br>
<br>
Please run "svn mv w39v080fa.c w39.c" before applying this patch.<br></blockquote><div><br>You'll want to run "svn cp w39v080fa.c w39.c" instead.<br> <br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<br>
Index: flashrom-w39_printlock/w39.c<br>
===================================================================<br>
--- flashrom-w39_printlock/w39.c        (Revision 1241)<br>
+++ flashrom-w39_printlock/w39.c        (Arbeitskopie)<br>
@@ -2,6 +2,7 @@<br>
  * This file is part of the flashrom project.<br>
  *<br>
  * Copyright (C) 2008 coresystems GmbH<br>
+ * Copyright (C) 2010 Carl-Daniel Hailfinger<br>
  *<br>
  * This program is free software; you can redistribute it and/or modify<br>
  * it under the terms of the GNU General Public License as published by<br>
@@ -21,67 +22,78 @@<br>
 #include "flash.h"<br>
 #include "chipdrivers.h"<br>
<br>
-static int unlock_block_winbond_fwhub(struct flashchip *flash, int offset)<br>
+static int printlock_w39_fwh_block(struct flashchip *flash, int offset)<br>
 {<br>
        chipaddr wrprotect = flash->virtual_registers + offset + 2;<br>
        uint8_t locking;<br>
<br>
-       msg_cdbg("Trying to unlock block @0x%08x = 0x%02x\n", offset,<br>
-                    chip_readb(wrprotect));<br>
-<br>
        locking = chip_readb(wrprotect);<br>
+       msg_cdbg("Lock status of block at 0x%08x is ", offset);<br>
        switch (locking & 0x7) {<br>
        case 0:<br>
                msg_cdbg("Full Access.\n");<br>
-               return 0;<br>
+               break;<br>
        case 1:<br>
                msg_cdbg("Write Lock (Default State).\n");<br>
-               chip_writeb(0, wrprotect);<br>
-               return 0;<br>
+               break;<br>
        case 2:<br>
                msg_cdbg("Locked Open (Full Access, Lock Down).\n");<br>
-               return 0;<br>
+               break;<br>
        case 3:<br>
                msg_cerr("Error: Write Lock, Locked Down.\n");<br>
-               return -1;<br>
+               break;<br>
        case 4:<br>
                msg_cdbg("Read Lock.\n");<br>
-               chip_writeb(0, wrprotect);<br>
-               return 0;<br>
+               break;<br>
        case 5:<br>
                msg_cdbg("Read/Write Lock.\n");<br>
-               chip_writeb(0, wrprotect);<br>
-               return 0;<br>
+               break;<br>
        case 6:<br>
                msg_cerr("Error: Read Lock, Locked Down.\n");<br>
-               return -1;<br>
+               break;<br>
        case 7:<br>
                msg_cerr("Error: Read/Write Lock, Locked Down.\n");<br>
-               return -1;<br>
+               break;<br>
        }<br>
<br>
-       /* We will never reach this point, but GCC doesn't know */<br>
-       return -1;<br>
+       /* Read or write lock present? */<br>
+       return (locking & ((1 << 2) | (1 << 0))) ? -1 : 0;<br>
 }<br>
<br>
-int unlock_winbond_fwhub(struct flashchip *flash)<br>
+static int unlock_w39_fwh_block(struct flashchip *flash, int offset)<br>
 {<br>
-       int i, total_size = flash->total_size * 1024;<br>
-       chipaddr bios = flash->virtual_memory;<br>
+       chipaddr wrprotect = flash->virtual_registers + offset + 2;<br>
        uint8_t locking;<br>
<br>
-       /* Are there any hardware restrictions that we can't overcome?<br>
-        * If flashrom fail here, someone's got to check all those GPIOs.<br>
-        */<br>
+       locking = chip_readb(wrprotect);<br>
+       /* Read or write lock present? */<br>
+       if (locking & ((1 << 2) | (1 << 0))) {<br>
+               /* Lockdown active? */<br>
+               if (locking & (1 << 1)) {<br>
+                       msg_cerr("Can't unlock block at 0x%x!\n", offset);<br>
+                       return -1;<br>
+               } else {<br>
+                       msg_cdbg("Unlocking block at 0x%x\n", offset);<br>
+                       chip_writeb(0, wrprotect);<br>
+               }<br>
+       }<br>
<br>
+       return 0;<br>
+}<br>
+<br>
+static uint8_t w39_idmode_readb(struct flashchip *flash, int offset)<br>
+{<br>
+       chipaddr bios = flash->virtual_memory;<br>
+       uint8_t val;<br>
+<br>
        /* Product Identification Entry */<br>
        chip_writeb(0xAA, bios + 0x5555);<br>
        chip_writeb(0x55, bios + 0x2AAA);<br>
        chip_writeb(0x90, bios + 0x5555);<br>
        programmer_delay(10);<br>
<br>
-       /* Read Hardware Lock Bits */<br>
-       locking = chip_readb(bios + 0xffff2);<br>
+       /* Read something, maybe hardware lock bits */<br>
+       val = chip_readb(bios + offset);<br>
<br>
        /* Product Identification Exit */<br>
        chip_writeb(0xAA, bios + 0x5555);<br>
@@ -89,25 +101,164 @@<br>
        chip_writeb(0xF0, bios + 0x5555);<br>
        programmer_delay(10);<br>
<br>
-       msg_cdbg("Lockout bits:\n");<br>
+       return val;<br>
+}<br>
<br>
-       if (locking & (1 << 2))<br>
-               msg_cerr("Error: hardware bootblock locking (#TBL).\n");<br>
-       else<br>
-               msg_cdbg("No hardware bootblock locking (good!)\n");<br>
+static int printlock_w39_wblwp(uint8_t lock)<br>
+{<br>
+       msg_cdbg("Hardware bootblock locking (#TBL) is %sactive.\n",<br>
+                (lock & (1 << 2)) ? "" : "not ");<br>
+       msg_cdbg("Hardware remaining chip locking (#WP) is %sactive..\n",<br>
+               (lock & (1 << 3)) ? "" : "not ");<br>
+       if (lock & ((1 << 2) | (1 << 3)))<br>
+               return -1;<br>
<br>
-       if (locking & (1 << 3))<br>
-               msg_cerr("Error: hardware block locking (#WP).\n");<br>
-       else<br>
-               msg_cdbg("No hardware block locking (good!)\n");<br>
+       return 0;<br>
+}<br>
<br>
-       if (locking & ((1 << 2) | (1 << 3)))<br>
+static int printlock_w39_bootblock_64k16k(uint8_t lock)<br>
+{<br>
+       msg_cdbg("Software 64 kB bootblock locking is %sactive.\n",<br>
+                (lock & (1 << 0)) ? "" : "not ");<br>
+       msg_cdbg("Software 16 kB bootblock locking is %sactive.\n",<br>
+                (lock & (1 << 1)) ? "" : "not ");<br>
+       if (lock & ((1 << 1) | (1 << 0)))<br>
                return -1;<br>
<br>
+       return 0;<br>
+}<br>
+<br>
+static int printlock_w39_common(struct flashchip *flash, int offset)<br>
+{<br>
+       uint8_t lock;<br>
+<br>
+       lock = w39_idmode_readb(flash, offset);<br>
+       msg_cdbg("Lockout bits:\n");<br>
+       return printlock_w39_wblwp(lock);<br>
+}<br>
+<br>
+static int printlock_w39_fwh(struct flashchip *flash)<br>
+{<br>
+       int i, total_size = flash->total_size * 1024;<br>
+<br>
+       /* Print lock status of the complete chip */<br>
+       for (i = 0; i < total_size; i += flash->page_size)<br>
+               if (printlock_w39_fwh_block(flash, i))<br>
+                       return -1;<br>
+<br>
+       return 0;<br>
+}<br>
+<br>
+static int unlock_w39_fwh(struct flashchip *flash)<br>
+{<br>
+       int i, total_size = flash->total_size * 1024;<br>
+<br>
        /* Unlock the complete chip */<br>
        for (i = 0; i < total_size; i += flash->page_size)<br>
-               if (unlock_block_winbond_fwhub(flash, i))<br>
+               if (unlock_w39_fwh_block(flash, i))<br>
                        return -1;<br>
<br>
        return 0;<br>
 }<br>
+<br>
+int printlock_w39v040a(struct flashchip *flash)<br>
+{<br>
+       uint8_t lock;<br>
+       int ret = 0;<br>
+<br>
+       /* The W39V040A datasheet contradicts itself on the lock register<br>
+        * location: 0x00002 and 0x7fff2 are both mentioned. Pick the one<br>
+        * which is similar to the other chips of the same family.<br>
+        */<br>
+       lock = w39_idmode_readb(flash, 0x7fff2);<br>
+       msg_cdbg("Lockout bits:\n");<br>
+<br>
+       ret = printlock_w39_wblwp(lock);<br>
+       ret |= printlock_w39_bootblock_64k16k(lock);<br>
+<br>
+       return ret;<br>
+}<br>
+<br>
+int printlock_w39v040b(struct flashchip *flash)<br>
+{<br>
+       return printlock_w39_common(flash, 0x7fff2);<br>
+}<br>
+<br>
+int printlock_w39v040c(struct flashchip *flash)<br>
+{<br>
+       return printlock_w39_common(flash, 0xfff2);<br>
+}<br>
+<br>
+int printlock_w39v040fa(struct flashchip *flash)<br>
+{<br>
+       int ret = 0;<br>
+<br>
+       ret = printlock_w39v040a(flash);<br>
+       ret |= printlock_w39_fwh(flash);<br>
+<br>
+       return ret;<br>
+}<br>
+<br>
+/* Unused because W39V040B and W39V040FB can not be distinguished from each<br>
+ * other based on ID.<br>
+ */<br>
+int printlock_w39v040fb(struct flashchip *flash)<br>
+{<br>
+       int ret = 0;<br>
+<br>
+       ret = printlock_w39v040b(flash);<br>
+       ret |= printlock_w39_fwh(flash);<br>
+<br>
+       return ret;<br>
+}<br>
+<br>
+/* Unused because W39V040C and W39V040FC can not be distinguished from each<br>
+ * other based on ID.<br>
+ */<br>
+int printlock_w39v040fc(struct flashchip *flash)<br>
+{<br>
+       int ret = 0;<br>
+<br>
+       /* W39V040C and W39V040FC use different WP/TBL offsets. */<br>
+       ret = printlock_w39_common(flash, 0x7fff2);<br>
+       ret |= printlock_w39_fwh(flash);<br>
+<br>
+       return ret;<br>
+}<br>
+<br>
+int printlock_w39v080a(struct flashchip *flash)<br>
+{<br>
+       return printlock_w39_common(flash, 0xffff2);<br>
+}<br>
+<br>
+int printlock_w39v080fa(struct flashchip *flash)<br>
+{<br>
+       int ret = 0;<br>
+<br>
+       ret = printlock_w39v080a(flash);<br>
+       ret |= printlock_w39_fwh(flash);<br>
+<br>
+       return ret;<br>
+}<br>
+<br>
+int printlock_w39v080fa_dual(struct flashchip *flash)<br>
+{<br>
+       msg_cinfo("Block locking for W39V080FA in dual mode is "<br>
+                 "undocumented.\n");<br>
+       /* Better safe than sorry. */<br>
+       return -1;<br>
+}<br>
+<br>
+int unlock_w39v080fa(struct flashchip *flash)<br>
+{<br>
+       if (unlock_w39_fwh(flash))<br>
+               return -1;<br>
+       /* The soft bootblock locks may have been deactivated by the unlock<br>
+        * above, so check them last.<br>
+        */<br>
+       if (printlock_w39_common(flash, 0xffff2))<br>
+               return -1;<br>
+<br>
+       return 0;<br>
+}<br>
+<br>
Index: flashrom-w39_printlock/Makefile<br>
===================================================================<br>
--- flashrom-w39_printlock/Makefile     (Revision 1241)<br>
+++ flashrom-w39_printlock/Makefile     (Arbeitskopie)<br>
@@ -82,7 +82,7 @@<br>
 endif<br>
 endif<br>
<br>
-CHIP_OBJS = jedec.o stm50flw0x0x.o w39v040c.o w39v080fa.o w29ee011.o \<br>
+CHIP_OBJS = jedec.o stm50flw0x0x.o w39.o w29ee011.o \<br>
        sst28sf040.o m29f400bt.o 82802ab.o pm49fl00x.o \<br>
        sst49lfxxxc.o sst_fwhub.o flashchips.o spi.o spi25.o sharplhf00l04.o<br>
<br>
Index: flashrom-w39_printlock/w39v040c.c<br>
===================================================================<br>
--- flashrom-w39_printlock/w39v040c.c   (Revision 1241)<br>
+++ flashrom-w39_printlock/w39v040c.c   (Arbeitskopie)<br>
@@ -1,48 +0,0 @@<br>
-/*<br>
- * This file is part of the flashrom project.<br>
- *<br>
- * Copyright (C) 2008 Peter Stuge <<a href="mailto:peter@stuge.se">peter@stuge.se</a>><br>
- *<br>
- * This program is free software; you can redistribute it and/or modify<br>
- * it under the terms of the GNU General Public License as published by<br>
- * the Free Software Foundation; either version 2 of the License, or<br>
- * (at your option) any later version.<br>
- *<br>
- * This program is distributed in the hope that it will be useful,<br>
- * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>
- * GNU General Public License for more details.<br>
- *<br>
- * You should have received a copy of the GNU General Public License<br>
- * along with this program; if not, write to the Free Software<br>
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA<br>
- */<br>
-<br>
-#include "flash.h"<br>
-#include "chipdrivers.h"<br>
-<br>
-int printlock_w39v040c(struct flashchip *flash)<br>
-{<br>
-       chipaddr bios = flash->virtual_memory;<br>
-       uint8_t lock;<br>
-<br>
-       chip_writeb(0xAA, bios + 0x5555);<br>
-       programmer_delay(10);<br>
-       chip_writeb(0x55, bios + 0x2AAA);<br>
-       programmer_delay(10);<br>
-       chip_writeb(0x90, bios + 0x5555);<br>
-       programmer_delay(10);<br>
-<br>
-       lock = chip_readb(bios + 0xfff2);<br>
-<br>
-       chip_writeb(0xAA, bios + 0x5555);<br>
-       programmer_delay(10);<br>
-       chip_writeb(0x55, bios + 0x2AAA);<br>
-       programmer_delay(10);<br>
-       chip_writeb(0xF0, bios + 0x5555);<br>
-       programmer_delay(40);<br>
-<br>
-       msg_cdbg("%s: Boot block #TBL is %slocked, rest of chip #WP is %slocked.\n",<br>
-               __func__, lock & 0x4 ? "" : "un", lock & 0x8 ? "" : "un");<br>
-       return 0;<br>
-}<br>
Index: flashrom-w39_printlock/flashchips.c<br>
===================================================================<br>
--- flashrom-w39_printlock/flashchips.c (Revision 1241)<br>
+++ flashrom-w39_printlock/flashchips.c (Arbeitskopie)<br>
@@ -7593,6 +7593,7 @@<br>
                                .block_erase = erase_chip_block_jedec,<br>
                        }<br>
                },<br>
+               .printlock      = printlock_w39v040a,<br>
                .write          = write_jedec_1,<br>
                .read           = read_memmapped,<br>
        },<br>
@@ -7600,7 +7601,7 @@<br>
        {<br>
                .vendor         = "Winbond",<br>
                .name           = "W39V040(F)B",<br>
-               .bustype        = CHIP_BUSTYPE_LPC,<br>
+               .bustype        = CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH,<br>
                .manufacture_id = WINBOND_ID,<br>
                .model_id       = WINBOND_W39V040B,<br>
                .total_size     = 512,<br>
@@ -7619,6 +7620,7 @@<br>
                                .block_erase = erase_chip_block_jedec,<br>
                        }<br>
                },<br>
+               .printlock      = printlock_w39v040b,<br>
                .write          = write_jedec_1,<br>
                .read           = read_memmapped,<br>
        },<br>
@@ -7626,7 +7628,7 @@<br>
        {<br>
                .vendor         = "Winbond",<br>
                .name           = "W39V040(F)C",<br>
-               .bustype        = CHIP_BUSTYPE_LPC,<br>
+               .bustype        = CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH,<br>
                .manufacture_id = WINBOND_ID,<br>
                .model_id       = WINBOND_W39V040C,<br>
                .total_size     = 512,<br>
@@ -7634,7 +7636,7 @@<br>
                .feature_bits   = FEATURE_EITHER_RESET,<br>
                .tested         = TEST_UNTESTED,<br>
                .probe          = probe_jedec,<br>
-               .probe_timing   = TIMING_FIXME,<br>
+               .probe_timing   = 10,<br>
                .block_erasers  =<br>
                {<br>
                        {<br>
@@ -7675,7 +7677,7 @@<br>
                                .block_erase = erase_chip_block_jedec,<br>
                        }<br>
                },<br>
-               .printlock      = printlock_sst_fwhub,<br>
+               .printlock      = printlock_w39v040fa,<br>
                .unlock         = unlock_sst_fwhub,<br>
                .write          = write_jedec_1,<br>
                .read           = read_memmapped,<br>
@@ -7703,6 +7705,7 @@<br>
                                .block_erase = erase_chip_block_jedec,<br>
                        }<br>
                },<br>
+               .printlock      = printlock_w39v080a,<br>
                .write          = write_jedec_1,<br>
                .read           = read_memmapped,<br>
        },<br>
@@ -7834,7 +7837,7 @@<br>
                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,<br>
                .tested         = TEST_OK_PRE,<br>
                .probe          = probe_jedec,<br>
-               .probe_timing   = TIMING_FIXME,<br>
+               .probe_timing   = 10,<br>
                .block_erasers  =<br>
                {<br>
                        {<br>
@@ -7845,7 +7848,8 @@<br>
                                .block_erase = erase_chip_block_jedec,<br>
                        }<br>
                },<br>
-               .unlock         = unlock_winbond_fwhub,<br>
+               .printlock      = printlock_w39v080fa,<br>
+               .unlock         = unlock_w39v080fa,<br>
                .write          = write_jedec_1,<br>
                .read           = read_memmapped,<br>
        },<br>
@@ -7861,7 +7865,7 @@<br>
                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,<br>
                .tested         = TEST_UNTESTED,<br>
                .probe          = probe_jedec,<br>
-               .probe_timing   = TIMING_FIXME,<br>
+               .probe_timing   = 10,<br>
                .block_erasers  =<br>
                {<br>
                        {<br>
@@ -7872,7 +7876,7 @@<br>
                                .block_erase = erase_chip_block_jedec,<br>
                        }<br>
                },<br>
-               .unlock         = unlock_winbond_fwhub,<br>
+               .printlock      = printlock_w39v080fa_dual,<br>
                .write          = write_jedec_1,<br>
                .read           = read_memmapped,<br>
        },<br>
Index: flashrom-w39_printlock/w39v080fa.c<br>
===================================================================<br>
--- flashrom-w39_printlock/w39v080fa.c  (Revision 1241)<br>
+++ flashrom-w39_printlock/w39v080fa.c  (Arbeitskopie)<br>
@@ -1,113 +0,0 @@<br>
-/*<br>
- * This file is part of the flashrom project.<br>
- *<br>
- * Copyright (C) 2008 coresystems GmbH<br>
- *<br>
- * This program is free software; you can redistribute it and/or modify<br>
- * it under the terms of the GNU General Public License as published by<br>
- * the Free Software Foundation; either version 2 of the License, or<br>
- * (at your option) any later version.<br>
- *<br>
- * This program is distributed in the hope that it will be useful,<br>
- * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>
- * GNU General Public License for more details.<br>
- *<br>
- * You should have received a copy of the GNU General Public License<br>
- * along with this program; if not, write to the Free Software<br>
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA<br>
- */<br>
-<br>
-#include "flash.h"<br>
-#include "chipdrivers.h"<br>
-<br>
-static int unlock_block_winbond_fwhub(struct flashchip *flash, int offset)<br>
-{<br>
-       chipaddr wrprotect = flash->virtual_registers + offset + 2;<br>
-       uint8_t locking;<br>
-<br>
-       msg_cdbg("Trying to unlock block @0x%08x = 0x%02x\n", offset,<br>
-                    chip_readb(wrprotect));<br>
-<br>
-       locking = chip_readb(wrprotect);<br>
-       switch (locking & 0x7) {<br>
-       case 0:<br>
-               msg_cdbg("Full Access.\n");<br>
-               return 0;<br>
-       case 1:<br>
-               msg_cdbg("Write Lock (Default State).\n");<br>
-               chip_writeb(0, wrprotect);<br>
-               return 0;<br>
-       case 2:<br>
-               msg_cdbg("Locked Open (Full Access, Lock Down).\n");<br>
-               return 0;<br>
-       case 3:<br>
-               msg_cerr("Error: Write Lock, Locked Down.\n");<br>
-               return -1;<br>
-       case 4:<br>
-               msg_cdbg("Read Lock.\n");<br>
-               chip_writeb(0, wrprotect);<br>
-               return 0;<br>
-       case 5:<br>
-               msg_cdbg("Read/Write Lock.\n");<br>
-               chip_writeb(0, wrprotect);<br>
-               return 0;<br>
-       case 6:<br>
-               msg_cerr("Error: Read Lock, Locked Down.\n");<br>
-               return -1;<br>
-       case 7:<br>
-               msg_cerr("Error: Read/Write Lock, Locked Down.\n");<br>
-               return -1;<br>
-       }<br>
-<br>
-       /* We will never reach this point, but GCC doesn't know */<br>
-       return -1;<br>
-}<br>
-<br>
-int unlock_winbond_fwhub(struct flashchip *flash)<br>
-{<br>
-       int i, total_size = flash->total_size * 1024;<br>
-       chipaddr bios = flash->virtual_memory;<br>
-       uint8_t locking;<br>
-<br>
-       /* Are there any hardware restrictions that we can't overcome?<br>
-        * If flashrom fail here, someone's got to check all those GPIOs.<br>
-        */<br>
-<br>
-       /* Product Identification Entry */<br>
-       chip_writeb(0xAA, bios + 0x5555);<br>
-       chip_writeb(0x55, bios + 0x2AAA);<br>
-       chip_writeb(0x90, bios + 0x5555);<br>
-       programmer_delay(10);<br>
-<br>
-       /* Read Hardware Lock Bits */<br>
-       locking = chip_readb(bios + 0xffff2);<br>
-<br>
-       /* Product Identification Exit */<br>
-       chip_writeb(0xAA, bios + 0x5555);<br>
-       chip_writeb(0x55, bios + 0x2AAA);<br>
-       chip_writeb(0xF0, bios + 0x5555);<br>
-       programmer_delay(10);<br>
-<br>
-       msg_cdbg("Lockout bits:\n");<br>
-<br>
-       if (locking & (1 << 2))<br>
-               msg_cerr("Error: hardware bootblock locking (#TBL).\n");<br>
-       else<br>
-               msg_cdbg("No hardware bootblock locking (good!)\n");<br>
-<br>
-       if (locking & (1 << 3))<br>
-               msg_cerr("Error: hardware block locking (#WP).\n");<br>
-       else<br>
-               msg_cdbg("No hardware block locking (good!)\n");<br>
-<br>
-       if (locking & ((1 << 2) | (1 << 3)))<br>
-               return -1;<br>
-<br>
-       /* Unlock the complete chip */<br>
-       for (i = 0; i < total_size; i += flash->page_size)<br>
-               if (unlock_block_winbond_fwhub(flash, i))<br>
-                       return -1;<br>
-<br>
-       return 0;<br>
-}<br>
Index: flashrom-w39_printlock/chipdrivers.h<br>
===================================================================<br>
--- flashrom-w39_printlock/chipdrivers.h        (Revision 1241)<br>
+++ flashrom-w39_printlock/chipdrivers.h        (Arbeitskopie)<br>
@@ -109,12 +109,16 @@<br>
 int printlock_sst_fwhub(struct flashchip *flash);<br>
 int unlock_sst_fwhub(struct flashchip *flash);<br>
<br>
-/* w39v040c.c */<br>
+/* w39.c */<br>
+int printlock_w39v040a(struct flashchip *flash);<br>
+int printlock_w39v040b(struct flashchip *flash);<br>
 int printlock_w39v040c(struct flashchip *flash);<br>
+int printlock_w39v040fa(struct flashchip *flash);<br>
+int printlock_w39v080a(struct flashchip *flash);<br>
+int printlock_w39v080fa(struct flashchip *flash);<br>
+int printlock_w39v080fa_dual(struct flashchip *flash);<br>
+int unlock_w39v080fa(struct flashchip *flash);<br>
<br>
-/* w39V080fa.c */<br>
-int unlock_winbond_fwhub(struct flashchip *flash);<br>
-<br>
 /* w29ee011.c */<br>
 int probe_w29ee011(struct flashchip *flash);<br>
<font color="#888888"><br>
<br>
<br>
--<br>
<a href="http://www.hailfinger.org/" target="_blank">http://www.hailfinger.org/</a><br>
<br>
<br>
_______________________________________________<br>
flashrom mailing list<br>
<a href="mailto:flashrom@flashrom.org">flashrom@flashrom.org</a><br>
<a href="http://www.flashrom.org/mailman/listinfo/flashrom" target="_blank">http://www.flashrom.org/mailman/listinfo/flashrom</a><br>
</font></blockquote></div><br>