Updating Crucial P3 Plus NVMe Firmware on Linux
SSD firmware is still firmware§
Like all firmware, NVMe SSD firmware also has a big chance to contain bugs, missed optimisations and other quirky behaviour.
Many vendors just let you download new firmware for non-OEM devices - Intel, Samsung and Kioxia are in that group. Bootable ISOs!
Crucial also lets you update the firmware, but some drives only get newer firmware via a Windows-only utility called Crucial Storage Executive. The Crucial P3 Plus counts to that group.
Finding the Firmware§
Running Crucial Storage Executive with Fiddler Classic running yields the requests sent to Crucials' servers.
When the software checks for newer firmware, it sends a request like this:
https://www.orderingmemory.com/firmware/firmware.aspx?key=P3Plus&fw=P9CR40A&fwType=CR&os=Windows&lang=en-GB&oem=false&formFactor=&capacity=1000&toolVer=10.07.072024.01
The JSON answer that comes back tells us what we want to know.
After a bit of fiddling with the query parameters, you can minimize it only to the necessary ones for your drive and get the manual update package:
$ curl -s 'https://www.orderingmemory.com/firmware/firmware.aspx?key=P3Plus&fw=P9CR40A&fwType=CR' | jq '.'
{
"CurrentFW": "P9CR40A",
"latestFW": "P9CR40D",
"result": "Update available",
"error": "0",
"release_date": "",
"manualurl": "https://content.crucial.com/content/dam/crucial/support/ssd/firmware/ssdtool/p3plus/p9cr40d.zip",
"releasenotes": "It contains the following improvements: <ul> <li>Update to resolve BIOS enumeration issue on Lenovo ThinkPad platforms.</li> <li>Error handling enhancement.</li></ul>"
}
manualurl
is what we want.
Update flow on Linux§
Insert standard disclaimer here: If you break it, it's not my fault. If you don't have a P3 Plus, this is not the right firmware. Additionally, this drive only has a single firmware slot, so if it's fucked, it's fucked.
Fetch the manualurl
and unzip it:
$ curl -LOJ https://content.crucial.com/content/dam/crucial/support/ssd/firmware/ssdtool/p3plus/p9cr40d.zip
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2216k 0 2216k 0 0 9879k 0 --:--:-- --:--:-- --:--:-- 9894k
$ unzip p9cr40d.zip
Archive: p9cr40d.zip
extracting: firmware.properties
inflating: P9CR40D/1.bin
Updating the drive firmware with nvme-cli
is quite simple:
$ sudo nvme list
Node Generic SN Model Namespace Usage Format FW Rev
--------------------- --------------------- -------------------- ---------------------------------------- ---------- -------------------------- ---------------- --------
/dev/nvme0n1 /dev/ng0n1 XXXXXXXXXXXX KXG6AZNV1T02 TOSHIBA 0x1 1.02 TB / 1.02 TB 512 B + 0 B 5108AGLA
/dev/nvme1n1 /dev/ng1n1 XXXXXXXXXXXX CT4000P3PSSD8 0x1 4.00 TB / 4.00 TB 4 KiB + 0 B P9CR40A
$ # Update the right drive, yeah?
$ sudo nvme fw-download --fw=P9CR40D/1.bin /dev/nvme1
Firmware download success
$ sudo nvme fw-commit -v --action=3 /dev/nvme1
Success committing firmware action:3 slot:0
$ echo 1 | sudo tee /sys/class/nvme/nvme1/reset_controller
1
$ sudo nvme fw-log /dev/nvme1
Firmware Log for device:nvme1
afi : 0x1
frs1 : 0x44303452433950 (P9CR40D.)
Tada! Now the firmware is P9CR40D. I love NVMe!
Updating via fwupdtool
should also be possible, judging from this blog post. I haven't tried, but it mentioned the similarly named 1.bin
blob we also have here.
According to my own unscientific "benchmarks" and a random reddit user, the P3 Plus has gotten noticably faster.
Letter to Crucial§
Dear Crucial,
if you would just list the firmware binary on your site or produce a bare-minimum flasher ISOs, I would be very happy. Clearly, the updates have a point.
You have nothing to lose, but a bunch of potential support cases could be solved by simply delivering the fixes you already made.
If you're actually interested in getting those updates widely applied on Linux devices, look into LVFS. Updating NVMe devices is well supported and update submission is probably easily integrated into your workflow.
Thank you.