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¶
- Kyle's article that describes an alternative approach for
booting the Samsung image (i.e. loading the
BTDSK.IMG
file via the Syslinux memdisk loader via grub2). He also mentions queued trim issues with the new firmware and in a followup he links how Linux kernel 4.0.5 and later fix this via blacklisting queued TRIM in all Samsung 800-series drives. - German article about Samsung's first attempt at a fix (incl. slow restoration): Firmware-Update für Samsung-SSD 840 Evo verfügbar, heise.de, 2014-10-15
- German article about Samsung's last attempt: Samsungs neue 840-Evo-Firmware nun frei verfügbar, heise.de, 2015-04-29