Updating Samsung SSD Firmware in the 21st Century

The firmware updates for the Samsung 840 EVO SSDs come as ISO images which isn't very helpful if your system doesn't have a CDROM drive. It turns out that the ISO images just contain DOS binaries, though. This article describes how to use a FreeDOS USB stick for flashing, instead.

Background

The Samsung SSD 840 EVO drives, like other Samsung SSDs, are infamous for their broken design and firmware bugs. The most notable symptom being the one where read speed deteriorates with the age of the written data. Samsung attempted to fix this via firmware updates two times, i.e. they pushed several firmware updates that try to work around limitations in the used SSD components.

Before we start

As of 2017-01 the most current Samsung 840 EVO versions are:

Model Firmware Version
840 EVO 2.5" EXT0DB6Q
840 EVO mSATA EXT43B6Q

Apparently those files were released mid 2015.

Under Linux, the version of the currently flashed firmware can be displayed with hdparm, e.g.:

$ for i in a b ; do hdparm -i /dev/sd$i  | grep Model ; done
Model=Samsung SSD 840 EVO 250GB, FwRev=EXT0CB6Q, SerialNo=S1ABC1234567890
Model=Samsung SSD 840 EVO 250GB mSATA, FwRev=EXT42B6Q, SerialNo=S1ABC1234567890

Firmware

Since Samsung can't be bothered to publish some checksums for the firmware updates in 2017, here are some SHA-256 ones:

b11658abe3194c933db22bd6734f932e3275679a247f3566ee70518e24acff2e  Samsung_SSD_840_EVO_EXT0DB6Q.iso
0bc484643f54880a141c680bace16333040600e720908608da548aaf2bd9a656  Samsung_SSD_840_EVO_mSATA_EXT43B6Q_Win_Mac.iso

At least, the files are also available via https.

Samsung continues to shine via failing to provide any changelog or instructions with the firmware download.

Create USB Stick

A natural method to inspect an ISO image under Linux is to loopback-mount it. But for our use case it is perhaps even simpler to just extract each image with 7z (if available):

$ mkdir ext0db6q ext43b6q
$ cd ext0d6q
$ 7z l ../Samsung_SSD_840_EVO_EXT0DB6Q.iso
$ 7z x ../Samsung_SSD_840_EVO_EXT0DB6Q.iso
$ cd ../ext43b6q
$ 7z x ../Samsung_SSD_840_EVO_mSATA_EXT43B6Q_Win_Mac.iso

Both extracts look similar, they show how the ISOLINUX boot loader is used. The interesting bit is the ISOLINUX/BTDSK.IMG file with contains the actual payload - i.e. a FAT image.

Again, this image can be loopback-mounted but using the Mtools user space utilites is sufficient, e.g.:

$ cd ext0d6q/ISOLINUX
$ mdir -i BTDSK.IMG
$ mkdir t
$ mcopy -s -i BTDSK.IMG ::autoexec.bat t
$ mcopy -s -i BTDSK.IMG ::license.txt t
$ mcopy -s -i BTDSK.IMG ::samsung t

Creating a FreeDOS USB stick can be unnecessarily tricky, but when it is ready transferring the firmware is simple as:

$ cp ext0db6q/ISOLINUX/t /run/media/juser/FREEDOS/samsung/ext0db6q -r
$ cp ext43b6q/ISOLINUX/t /run/media/juser/FREEDOS/samsung/ext43b6q -r
$ umount /run/media/juser/FREEDOS

Booting

Booting from the FreeDOS stick requires some BIOS support which should be quite common nowadays. Ideally, one doesn't have to change the boot order inside the BIOS configuration but can use a boot menu instead. For example, on a Thinkpad x220 the temporary boot device menu is invoked after power-on via pressing the 'ThinkVantage' button and then F12. Other popular shortcuts for this menu are just F12, F7 (Intel) or even ESC.

Flashing

Arrived at the DOS prompt one has just to execute the autoexec.bat, e.g.:

cd samsung/ext0db6q
autoexec.bat

See also