I’ve got a Sony Xperia 5 II. It’s a 5G phone with the same bands as my carrier, but it only works on 4G for some reason. Also when you make a phone call it’ll drop down to 3G since it doesn’t support Voice over LTE (VoLTE).

3G networks are gonna start being turned off, so I’m gonna be stuck with a 3 year old 5G phone that can’t make calls because 3GPP have seriously dropped the ball on this one. Carriers are acting like switching off 3G is no big deal, since LTE has been around since 2012, get with the times! VoLTE has only been around since 2016, and even then, was limited to carrier approved models. And only worked if you bought the phone directly from the carrier. And only if you had postpaid plan. And only if your account had a “VoLTE enable” flag set by calling them.

To this day, when it doesn’t work phone makers and carriers will point the finger at each other, leaving customers with no clue who to chase for a solution. All parties still act like VoLTE is a nice to have and not a requirement. I really believe the rush to deploy 5G was to have the pretence to shut off 3G and force customers to buy new phones.

In the case of my Sony Xperia 5 II, the issue seems to be Sony’s fault. This is great news since I can more legally hack my own phone than my carrier’s network. There are many XDA posts going through the steps to get it working, most of which are written by self confessed amateurs that don’t speak English. Massive respect to these folks that don’t know how to install a driver doing a better job than the entire mobile phone industry in getting phones to make calls.

Let’s fix this

The high level steps to fix are:

  1. Gain root.
  2. Use root to enable diagnostic serial access to the Qualcomm modem.
  3. Use the diagnostic serial access to write a working carrier config to the modem.

I thought step 3 would be difficult, since where am I meant to get the config from? How do I know it’s valid? What if it breaks and I don’t know how to get to the previous config?

Turns out, Sony ship working configs for most carriers in every firmware. They just don’t apply them all the time for some reason. I didn’t even bother to extract the config myself, this dude posted a bunch on his guide for a completely different model and it worked fine.

Unfortunately no single guide worked for me since I seem to have a unique setup (Xperia 5 II running LineageOS 20), so here’s what it took to make my phone use VoLTE. This needs Windows, I’m sorry.

Get Root

LineageOS already has root for adb. In Developer options, enable USB Debugging and Root Debugging just under it. Grab the android platform tools, and plug that phone in. Now you need to restart the adb service on your PC to use root

adb.exe root
adb.exe shell
# Enters interactive shell on the phone, ensure it's root with # and/or doing a whoami

Enable Qualcomm Diagnostics

This was tricky. Xperia guides will tell you setprop persist.usb.eng 1, but this is a Sony thing. The generic android setting is setprop sys.usb.config diag, which also doesn’t work. The Pixel specific setprop sys.usb.config diag_mdm is what enables it on the LineageOS 20 on my phone 🤷‍♂️. I’m going to do all three diag,diag_mdm,adb for good measure.

# At the phone's adb root shell:
# setprop sys.usb.config diag,diag_mdm,adb

This will immediately make a new device appear in Windows. It won’t install the driver automatically so we gotta do it.

Download QPST Tool. Qualcomm don’t publish the drivers publicly and this is the least dodgy place to get a copy I could find. In the zip there’ll be a Driver folder, with a Qualcomm USB Driver V1.0.exe file. Run this to install every god damn Qualcomm driver under the sun.

Windows still won’t put 2 and 2 together, so you gotta get all Win95 in Device Manager and select the driver yourself. This tripped up most people on XDA, I don’t think many people experienced the pain of manually installing drivers on Windows.

In device manager find the mystery device, right click “Update driver…”. Select to pick manually from the way too big list. COM device -> Qualcomm Incorporated -> Qualcomm HS-USB Diagnostics 9091. Yeah it hasn’t changed in 30 years and it’s still just as bad to scroll in the tiny 3 line text list boxes. No idea if other driver numbers work as well?

Write that config

Download efstools. To test the app is communicating with the phone, try in a new cmd window:

EfsTools.exe efsInfo

No errors? No worries. You might need .NET 5 or something.

Now these configs take the form of .mbn files. Grab the mdn.zip from this post for the Xperia 1 III and it might work. It has lots of carriers, but not all.

Apparently you can also copy the files off your phone with root, they are in root/vendor/firmware_mnt/modem_pr/mcfg/configs/mcfg_sw/generic/.

In both cases the mbn files are organised by region and carrier, all named mcfg_sw.mbm.

Now we can tell efstools do write our selected config:

EfsTools.exe uploadDirectory -i mcfg_sw.mbn -o / -v

Reboot the phone and dial *#*#4636#*#* to check if VoLTE is working. Phone information -> Three dots -> IMS service status.

Calls should have a lil ‘HD’ logo and you’ll see the signal indicator stay on LTE. Woohoo, you’ve made the world a little less broken.

Cleanup

You’ll probably want to disable all this deep diagnostic access to your phone:

# setprop sys.usb.config adb

Disable USD debugging and root debugging developer settings on the phone. All back to normal.