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.