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);