Add a bunch of new/tested stuff and various small changes 17

Tested Mainboards:
OK:
 - Acer V75-M (used in IBM Aptiva 2170-G)
   http://www.flashrom.org/pipermail/flashrom/2012-December/010300.html
 - Acorp 6M810C
   http://www.flashrom.org/pipermail/flashrom/2013-January/010433.html
 - ASRock G31M-S rev 2.0
   http://www.flashrom.org/pipermail/flashrom/2013-February/010538.html
 - ASUS F1A75-V PRO
   http://paste.flashrom.org/view.php?id=1528
 - ASUS M5A97 (rev. 1.0)
   http://www.flashrom.org/pipermail/flashrom/2013-February/010483.html
 - ASUS P5KPL-AM IN/GB
   http://www.flashrom.org/pipermail/flashrom/2013-January/010455.html
 - GABYTE GA-H77M-D3H
   http://www.flashrom.org/pipermail/flashrom/2013-February/010538.html

NOT OK:
 - GIGABYTE GA-Z77MX-D3H
   http://paste.flashrom.org/view.php?id=1529
   http://paste.flashrom.org/view.php?id=1530

Tested flash chips:
 - Winbond W25X10 to PREW (+PREW)
   Reported on IRC(?)
 - Eon EN25Q32(A/B) to PREW (+REW)
   http://www.flashrom.org/pipermail/flashrom/2013-February/010533.html
 - Eon EN25Q64 to PREW (+PREW)
   http://www.flashrom.org/pipermail/flashrom/2013-January/010466.html

Miscellaneous:
- Fix superflouos line breaks in wiki mainboard and laptop output.
- Use the .nh (no hyphenation) command in the manpage to enforce
  single-line URLs where useful.
- Reference the manpage (besides the Laptops wiki page) in the laptop warning.
- Minor output and whitespace fixes.
- Add Fidelix IDs.
- Add ISSE clones of PMC chips.
- Fix typo: EMST -> ESMT.
- Add ID of ESMT F25D08QA.
- Refine GigaDevice GD25Q series (missing voltages and comments).
- Use underscore instead of lower-case x as wildcard in Sharp chip names.

Corresponding to flashrom svn r1650.

Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Acked-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
diff --git a/flashchips.c b/flashchips.c
index b976ee6..d4ab1be 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -2713,11 +2713,11 @@
 	},
 
 	{
-		.vendor		= "EMST",
+		.vendor		= "ESMT",
 		.name		= "F49B002UA",
 		.bustype	= BUS_PARALLEL,
-		.manufacture_id	= EMST_ID,
-		.model_id	= EMST_F49B002UA,
+		.manufacture_id	= ESMT_ID,
+		.model_id	= ESMT_F49B002UA,
 		.total_size	= 256,
 		.page_size	= 4096,
 		.feature_bits	= FEATURE_EITHER_RESET,
@@ -2745,11 +2745,11 @@
 	},
 
 	{
-		.vendor		= "EMST",
+		.vendor		= "ESMT",
 		.name		= "F25L008A",
 		.bustype	= BUS_SPI,
-		.manufacture_id	= EMST_ID,
-		.model_id	= EMST_F25L008A,
+		.manufacture_id	= ESMT_ID,
+		.model_id	= ESMT_F25L008A,
 		.total_size	= 1024,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER,
@@ -3748,7 +3748,7 @@
 		.page_size	= 256,
 		/* OTP: 512B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
-		.tested		= TEST_OK_PROBE,
+		.tested		= TEST_OK_PREW,
 		.probe		= probe_spi_rdid,
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
@@ -3784,7 +3784,7 @@
 		.page_size	= 256,
 		/* OTP: 512B total; enter 0x3A */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
-		.tested		= TEST_UNTESTED,
+		.tested		= TEST_OK_PREW,
 		.probe		= probe_spi_rdid,
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
@@ -4248,13 +4248,13 @@
 
 	{
 		.vendor		= "GigaDevice",
-		.name		= "GD25Q80",
+		.name		= "GD25Q80(B)",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= GIGADEVICE_ID,
 		.model_id	= GIGADEVICE_GD25Q80,
 		.total_size	= 1024,
 		.page_size	= 256,
-		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
+		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
 		.probe		= probe_spi_rdid,
@@ -4293,7 +4293,7 @@
 		.model_id	= GIGADEVICE_GD25Q16,
 		.total_size	= 2048,
 		.page_size	= 256,
-		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
+		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
 		.probe		= probe_spi_rdid,
@@ -4326,13 +4326,13 @@
 
 	{
 		.vendor		= "GigaDevice",
-		.name		= "GD25Q32",
+		.name		= "GD25Q32(B)",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= GIGADEVICE_ID,
 		.model_id	= GIGADEVICE_GD25Q32,
 		.total_size	= 4096,
 		.page_size	= 256,
-		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
+		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
 		.probe		= probe_spi_rdid,
@@ -4365,13 +4365,13 @@
 
 	{
 		.vendor		= "GigaDevice",
-		.name		= "GD25Q64",
+		.name		= "GD25Q64(B)",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= GIGADEVICE_ID,
 		.model_id	= GIGADEVICE_GD25Q64,
 		.total_size	= 8192,
 		.page_size	= 256,
-		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
+		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
 		.probe		= probe_spi_rdid,
@@ -4399,17 +4399,18 @@
 		.unlock		= spi_disable_blockprotect,
 		.write		= spi_chip_write_256,
 		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
 	},
 
 	{
 		.vendor		= "GigaDevice",
-		.name		= "GD25Q128",
+		.name		= "GD25Q128B",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= GIGADEVICE_ID,
 		.model_id	= GIGADEVICE_GD25Q128,
 		.total_size	= 16384,
 		.page_size	= 256,
-		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
+		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_UNTESTED,
 		.probe		= probe_spi_rdid,
@@ -4437,6 +4438,7 @@
 		.unlock		= spi_disable_blockprotect,
 		.write		= spi_chip_write_256,
 		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
 	},
 
 	{
@@ -4447,7 +4449,8 @@
 		.model_id	= GIGADEVICE_GD25LQ32,
 		.total_size	= 4096,
 		.page_size	= 256,
-		.feature_bits	= FEATURE_WRSR_WREN,
+		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
 		.tested		= TEST_OK_PREW,
 		.probe		= probe_spi_rdid,
 		.probe_timing	= TIMING_ZERO,
@@ -6687,7 +6690,7 @@
 		.name		= "LH28F008BJT-BTLZ1",
 		.bustype	= BUS_PARALLEL,
 		.manufacture_id	= SHARP_ID,
-		.model_id	= SHARP_LH28F008BJxxPB,
+		.model_id	= SHARP_LH28F008BJ__PB,
 		.total_size	= 1024,
 		.page_size	= 64 * 1024,
 		.tested		= TEST_OK_PREW,
diff --git a/flashchips.h b/flashchips.h
index d123ab0..1a0696f 100644
--- a/flashchips.h
+++ b/flashchips.h
@@ -201,9 +201,10 @@
 #define CATALYST_ID		0x31	/* Catalyst */
 #define CATALYST_CAT28F512	0xB8
 
-#define EMST_ID			0x8C	/* EMST / EFST Elite Flash Storage */
-#define EMST_F25L008A		0x2014
-#define EMST_F49B002UA		0x00
+#define ESMT_ID			0x8C	/* Elite Semiconductor Memory Technology (ESMT) / EFST Elite Flash Storage */
+#define ESMT_F25L008A		0x2014
+#define ESMT_F25D08QA		0x2534
+#define ESMT_F49B002UA		0x00
 
 /*
  * EN25 chips are SPI, first byte of device ID is memory type,
@@ -265,6 +266,15 @@
 #define EON_EN29F002T		0x7F92	/* Same as EN29F002A */
 #define EON_EN29F002B		0x7F97	/* Same as EN29F002AN */
 
+#define FIDELIX_ID		0xF8	/* Fidelix */
+#define FIDELIX_FM25M16		0x4215
+#define FIDELIX_FM25M32		0x4216
+#define FIDELIX_FM25M64		0x4217
+#define FIDELIX_FM25Q08		0x3214
+#define FIDELIX_FM25Q16		0x3215	/* Same as FM25S16 (which is apparently single I/O only) */
+#define FIDELIX_FM25Q32		0x3216
+#define FIDELIX_FM25Q64		0x3217
+
 #define FUJITSU_ID		0x04	/* Fujitsu */
 #define FUJITSU_MBM29DL400BC	0x0F
 #define FUJITSU_MBM29DL400TC	0x0C
@@ -299,11 +309,11 @@
 #define GIGADEVICE_ID		0xC8	/* GigaDevice */
 #define GIGADEVICE_GD25Q20	0x4012
 #define GIGADEVICE_GD25Q40	0x4013
-#define GIGADEVICE_GD25Q80	0x4014
-#define GIGADEVICE_GD25Q16	0x4015
-#define GIGADEVICE_GD25Q32	0x4016
-#define GIGADEVICE_GD25Q64	0x4017
-#define GIGADEVICE_GD25Q128	0x4018
+#define GIGADEVICE_GD25Q80	0x4014	/* Same as GD25Q80B (which has OTP) */
+#define GIGADEVICE_GD25Q16	0x4015	/* Same as GD25Q16B (which has OTP) */
+#define GIGADEVICE_GD25Q32	0x4016	/* Same as GD25Q32B */
+#define GIGADEVICE_GD25Q64	0x4017	/* Same as GD25Q64B */
+#define GIGADEVICE_GD25Q128	0x4018	/* GD25Q128B only? */
 #define GIGADEVICE_GD25LQ32	0x6016
 
 #define HYUNDAI_ID		0xAD	/* Hyundai */
@@ -451,10 +461,10 @@
 #define PMC_PM25LV016B		0x14
 #define PMC_PM29F002T		0x1D
 #define PMC_PM29F002B		0x2D
-#define PMC_PM39LV512		0x1B
-#define PMC_PM39F010		0x1C	/* Same as Pm39LV010 */
+#define PMC_PM39LV512		0x1B	/* Same as IS39LV512 */
+#define PMC_PM39F010		0x1C	/* Same as Pm39LV010, IS39LV010 */
 #define PMC_PM39LV020		0x3D
-#define PMC_PM39LV040		0x3E
+#define PMC_PM39LV040		0x3E	/* Same as IS39LV040 */
 #define PMC_PM39F020		0x4D
 #define PMC_PM39F040		0x4E
 #define PMC_PM49FL002		0x6D
@@ -469,11 +479,11 @@
 #define SANYO_LE25FW203A	0x1600
 
 #define SHARP_ID		0xB0	/* Sharp */
-#define SHARP_LH28F008BJxxPT	0xEC
-#define SHARP_LH28F008BJxxPB	0xED
-#define SHARP_LH28F800BVxxBTL	0x4B
-#define SHARP_LH28F800BVxxBV	0x4D
-#define SHARP_LH28F800BVxxTV	0x4C
+#define SHARP_LH28F008BJ__PT	0xEC
+#define SHARP_LH28F008BJ__PB	0xED
+#define SHARP_LH28F800BV__BTL	0x4B
+#define SHARP_LH28F800BV__BV	0x4D
+#define SHARP_LH28F800BV__TV	0x4C
 #define SHARP_LHF00L02		0xC9	/* Same as LHF00L06/LHF00L07 */
 #define SHARP_LHF00L04		0xCF	/* Same as LHF00L03/LHF00L05 */
 
diff --git a/flashrom.8 b/flashrom.8
index f8f1c4e..c6c518e 100644
--- a/flashrom.8
+++ b/flashrom.8
@@ -161,6 +161,7 @@
 .BR \-\-list\-supported ,
 but outputs the supported hardware in MediaWiki syntax, so that it can be
 easily pasted into the wiki page at
+.nh
 .BR http://www.flashrom.org/ .
 Please note that MediaWiki output is not compiled in by default.
 .TP
@@ -390,6 +391,7 @@
 .B BUGS
 section). The embedded controller (EC) in these
 machines often interacts badly with flashing.
+.nh
 .B http://www.flashrom.org/Laptops
 has more information. For example the EC firmware sometimes resides on the same
 flash chip as the host firmware. While flashrom tries to change the contents of
@@ -715,8 +717,10 @@
 (DLC 5).
 .sp
 More information about the RayeR hardware is available at
+.nh
 .BR "http://rayer.ic.cz/elektro/spipgm.htm " .
 The schematic of the Xilinx DLC 5 was published at
+.nh
 .BR "http://www.xilinx.com/itp/xilinx4/data/docs/pac/appendixb.html " .
 .SS
 .BR "pony_spi " programmer
@@ -730,6 +734,7 @@
 parameter accepts the values "si_prog" (default) or "serbang".
 .sp
 Information about the SI-Prog adapter can be found at
+.nh
 .BR "http://www.lancos.com/siprogsch.html " .
 .sp
 An example call to flashrom is
@@ -765,6 +770,7 @@
 section above.
 .sp
 More information about the hardware is available at
+.nh
 .BR http://wiki.opengraphics.org .
 .SS
 .BR "linux_spi " programmer
@@ -869,6 +875,7 @@
 too. Please provide a way to contact you later (e.g.\& a mail address) and be
 patient if there is no immediate reaction. Also, we provide a pastebin service
 at
+.nh
 .B http://paste.flashrom.org
 that is very useful when you want to share logs etc.\& without spamming the
 channel.
@@ -884,8 +891,8 @@
 .B internal programmer
 subsection of the
 .B PROGRAMMER SPECIFIC INFO
-section.
-.B "  http://www.flashrom.org/Laptops"
+section and the information in our wiki at
+.BR "http://www.flashrom.org/Laptops " .
 .SS
 One-time programmable (OTP) memory and unique IDs
 .sp
diff --git a/internal.c b/internal.c
index 1c89fd0..5af74cd 100644
--- a/internal.c
+++ b/internal.c
@@ -299,7 +299,7 @@
 		msg_perr("Laptops, notebooks and netbooks are difficult to support and we\n"
 			 "recommend to use the vendor flashing utility. The embedded controller\n"
 			 "(EC) in these machines often interacts badly with flashing.\n"
-			 "See http://www.flashrom.org/Laptops for details.\n\n"
+			 "See the manpage and http://www.flashrom.org/Laptops for details.\n\n"
 			 "If flash is shared with the EC, erase is guaranteed to brick your laptop\n"
 			 "and write may brick your laptop.\n"
 			 "Read and probe may irritate your EC and cause fan failure, backlight\n"
diff --git a/it87spi.c b/it87spi.c
index a35ddc0..8e4e0ad 100644
--- a/it87spi.c
+++ b/it87spi.c
@@ -87,15 +87,12 @@
 		case 0x86:
 		case 0x87:
 			/* FIXME: Print revision for all models? */
-			msg_pdbg("Found ITE Super I/O, ID 0x%04hx on port "
-				 "0x%x\n", s.model, s.port);
+			msg_pdbg("Found ITE Super I/O, ID 0x%04hx on port 0x%x\n", s.model, s.port);
 			register_superio(s);
 			break;
 		case 0x85:
-			msg_pdbg("Found ITE EC, ID 0x%04hx,"
-			         "Rev 0x%02x on port 0x%x.\n",
-			         s.model, sio_read(s.port, CHIP_VER_REG),
-			         s.port);
+			msg_pdbg("Found ITE EC, ID 0x%04hx, Rev 0x%02x on port 0x%x.\n",
+				 s.model, sio_read(s.port, CHIP_VER_REG), s.port);
 			register_superio(s);
 			break;
 		}
diff --git a/print.c b/print.c
index df3f17f..ecde90f 100644
--- a/print.c
+++ b/print.c
@@ -519,6 +519,7 @@
 	B("abit",	"VT6X4",		OK, NULL, NULL),
 	B("Acer",	"V75-M",		OK, NULL, "This is an OEM board used by IBM in e.g. Aptiva 2170-G"),
 	B("Acorp",	"6A815EPD",		OK, "http://web.archive.org/web/20021206163652/www.acorp.com.tw/English/default.asp", NULL),
+	B("Acorp",	"6M810C",		OK, NULL, NULL),
 	B("Advantech",	"PCM-5820",		OK, "http://www.emacinc.com/sbc_pc_compatible/pcm_5820.htm", NULL),
 	B("agami",	"Aruma",		OK, "http://web.archive.org/web/20080212111524/http://www.agami.com/site/ais-6000-series", NULL),
 	B("Albatron",	"PM266A Pro",		OK, "http://www.albatron.com.tw/English/Product/MB/pro_detail.asp?rlink=Overview&no=56", NULL), /* FIXME */
@@ -540,6 +541,7 @@
 	B("ASRock",	"ALiveNF6G-DVI",	OK, "http://www.asrock.com/mb/overview.asp?Model=ALiveNF6G-DVI", NULL),
 	B("ASRock",	"AM2NF6G-VSTA",		OK, "http://www.asrock.com/mb/overview.asp?Model=AM2NF6G-VSTA", NULL),
 	B("ASRock",	"E350M1/USB3",		OK, "http://www.asrock.com/mb/overview.asp?model=e350m1/usb3", NULL),
+	B("ASRock",	"G31M-S rev 2.0",	OK, "http://www.asrock.com/mb/overview.asp?model=G31M-S", NULL),
 	B("ASRock",	"ConRoeXFire-eSATA2",	OK, "http://www.asrock.com/mb/overview.asp?model=conroexfire-esata2", NULL),
 	B("ASRock",	"H61M-ITX",		BAD, "http://www.asrock.com/mb/overview.asp?Model=H61M-ITX", "Probing works (Macronix MX25L3205, 4096 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."),
 	B("ASRock",	"H67M",			BAD, "http://www.asrock.com/mb/overview.asp?Model=H67M", "Probing works (Winbond W25Q64, 8192 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."),
@@ -577,6 +579,7 @@
 	B("ASUS",	"Crosshair IV Extreme",	OK, "http://www.asus.com/Motherboards/AMD_AM3/Crosshair_IV_Extreme/", NULL),
 	B("ASUS",	"DSAN-DX",		NT, "http://www.asus.com/Server_Workstation/Server_Motherboards/DSANDX/", NULL),
 	B("ASUS",	"E35M1-I DELUXE",	OK, "http://www.asus.com/Motherboards/AMD_CPU_on_Board/E35M1I_DELUXE/", NULL),
+	B("ASUS",	"F1A75-V PRO",		OK, "http://www.asus.com/Motherboard/F1A75V_PRO/", NULL),
 	B("ASUS",	"K8N",			OK, "http://www.asus.com/Motherboards/AMD_Socket_754/K8N/", NULL),
 	B("ASUS",	"K8V",			OK, "http://www.asus.com/Motherboards/AMD_Socket_754/K8V/", NULL),
 	B("ASUS",	"K8V SE Deluxe",	OK, "http://www.asus.com/Motherboards/AMD_Socket_754/K8V_SE_Deluxe/", NULL),
@@ -611,6 +614,7 @@
 	B("ASUS",	"M4N68T V2",		OK, "http://www.asus.com/Motherboards/AMD_AM3/M4N68T_V2/", NULL),
 	B("ASUS",	"M4N78 PRO",		OK, "http://www.asus.com/Motherboards/AMD_AM2Plus/M4N78_PRO/", NULL),
 	B("ASUS",	"M5A78L-M LX",		OK, "http://www.asus.com/Motherboards/AMD_AM3Plus/M5A78LM_LX/", "The MAC address of the onboard LAN NIC is stored in flash, hence overwritten by flashrom; see http://www.flashrom.org/pipermail/flashrom/2012-May/009200.html"),
+	B("ASUS",	"M5A97 (rev. 1.0)",	OK, "http://www.asus.com/Motherboard/M5A97/", NULL),
 	B("ASUS",	"M5A99X EVO",		OK, "http://www.asus.com/Motherboards/AMD_AM3Plus/M5A99X_EVO/", NULL),
 	B("ASUS",	"Maximus IV Extreme",	BAD, "http://www.asus.com/Motherboards/Intel_Socket_1155/Maximus_IV_Extreme/", "Probing works (Macronix MX25L3205, 4096 kB, SPI), but parts of the flash are problematic: descriptor is r/o (conforming to ICH reqs), ME region is locked."),
 	B("ASUS",	"MEW-AM",		BAD, NULL, "No public report found. Owned by Uwe Hermann <uwe@hermann-uwe.de>. May work now."),
@@ -656,6 +660,7 @@
 	B("ASUS",	"P5K-V",		OK, "http://www.asus.com/Motherboards/Intel_Socket_775/P5KV/", NULL),
 	B("ASUS",	"P5K-VM",		OK, "http://www.asus.com/Motherboards/Intel_Socket_775/P5KVM/", NULL),
 	B("ASUS",	"P5KC",			OK, "http://www.asus.com/Motherboards/Intel_Socket_775/P5KC/", NULL),
+	B("ASUS",	"P5KPL-AM IN/GB",	OK, "http://support.asus.com/download.aspx?SLanguage=en&m=P5KPL-AM+IN%2fGB&os=29", NULL),
 	B("ASUS",	"P5KPL-CM",		OK, "http://www.asus.com/Motherboards/Intel_Socket_775/P5KPLCM/", NULL),
 	B("ASUS",	"P5L-MX",		OK, "http://www.asus.com/Motherboards/Intel_Socket_775/P5LMX/", NULL),
 	B("ASUS",	"P5L-VM 1394",		OK, "http://www.asus.com/Motherboards/Intel_Socket_775/P5LVM_1394/", NULL),
@@ -777,6 +782,7 @@
 	B("GIGABYTE",	"GA-H61M-D2-B3",	OK, "http://www.gigabyte.com/products/product-page.aspx?pid=3773", NULL),
 	B("GIGABYTE",	"GA-H61M-D2H-USB3",	OK, "http://www.gigabyte.com/products/product-page.aspx?pid=4004", NULL),
 	B("GIGABYTE",	"GA-H77-D3H",		OK, "http://www.gigabyte.com/products/product-page.aspx?pid=4141", "Does only work with -p internal:ich_spi_mode=hwseq due to an evil twin of MX25L6405 and ICH SPI lockdown."),
+	B("GIGABYTE",	"GA-H77M-D3H",		OK, "http://www.gigabyte.com/products/product-page.aspx?pid=4388", NULL),
 	B("GIGABYTE",	"GA-EX58-UD4P",		OK, "http://www.gigabyte.com/products/product-page.aspx?pid=2986", NULL),
 	B("GIGABYTE",	"GA-K8N-SLI",		OK, "http://www.gigabyte.com/products/product-page.aspx?pid=1928", NULL),
 	B("GIGABYTE",	"GA-K8N51GMF",		OK, "http://www.gigabyte.com/products/product-page.aspx?pid=1950", NULL),
@@ -804,6 +810,7 @@
 	B("GIGABYTE",	"GA-X79-UD5", OK, NULL, NULL),
 	B("GIGABYTE",	"GA-Z68MX-UD2H-B (rev. 1.3)", OK, "http://www.gigabyte.com/products/product-page.aspx?pid=3854", NULL),
 	B("GIGABYTE",	"GA-Z68XP-UD3 (rev. 1.0)", OK, "http://www.gigabyte.com/products/product-page.aspx?pid=3892", NULL),
+	B("GIGABYTE",	"GA-Z77MX-D3H",		BAD, "http://www.gigabyte.com/products/product-page.aspx?pid=4145", "Uses MX25L6436E and requires a small patch (but works flawlessly with that)."),
 	B("HP",		"8100 Elite CMT PC (304Bh)", BAD, NULL, "SPI lock down, PR, read-only descriptor, locked ME region."),
 	B("HP",		"e-Vectra P2706T",	OK, "http://h20000.www2.hp.com/bizsupport/TechSupport/Home.jsp?lang=en&cc=us&prodSeriesId=77515&prodTypeId=12454", NULL),
 	B("HP",		"ProLiant DL145 G3",	OK, "http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?objectID=c00816835&lang=en&cc=us&taskId=101&prodSeriesId=3219755&prodTypeId=15351", NULL),
diff --git a/print_wiki.c b/print_wiki.c
index 81f7efb..bd9d9f7 100644
--- a/print_wiki.c
+++ b/print_wiki.c
@@ -209,7 +209,7 @@
 	/* end inner table if it did not fill the last column fully */
 	if (((i % lines_per_col)) > 0)
 		printf("\n|}\n\n");
-	printf("\n\n|}\n");
+	printf("|}\n");
 
 	if (num_notes > 0)
 		printf("\n<small>\n%s</small>\n", notes);