1. Volscan
  2. Blog
  3. Volvo fault codes explained

Volvo fault codes explained: what ECM-940F means and how status works

Forum posts quote Volvo codes like ECM-940F or SRS-012B, while a generic scanner only ever shows P0xxx. They are not two spellings of the same thing — here is how Volvo's own fault codes are built and read.

· 7 min read

Diagram: four control modules — ECM, TCM, CEM and SRS — connected to a fault code list showing ECM-940F as active and TCM-002E and SRS-012B as stored
Every Volvo fault code belongs to the module that stored it, and each comes with a status: active now, or stored from earlier.

Anatomy of a Volvo fault code

A Volvo fault code has two parts: the module that stored it, and the module's own code number. Take ECM-940F:

This is a real code from our test car, a 2008 C70 diesel. In October 2026 its engine module returned code 940F, which the engine module's definitions describe as the brake pedal sensor. The description lives with the module: the same four digits stored by the CEM or the airbag module would mean something entirely different. That is why a Volvo code is only useful with its prefix, and why good tools always show the two together.

In short: module + 16-bit code. The code number alone is not unique across the car; the module name is part of the code.

Why not just P-codes?

The familiar P0xxx codes are legislated OBD-II codes. They exist so that inspection stations and generic scanners can read emissions faults in the same way on every car, and only the emissions-related modules — in practice the engine and, on automatics, the gearbox — have to provide them.

Volvo's own diagnostics work at a different level. Every module, from the engine to the door modules, keeps its own fault memory in its own format and answers Volvo's own diagnostic requests. A body or airbag fault simply has no P-code to be translated into, and there is no formula that turns a module code into a P-code or back. When a forum post gives you CEM-xxxx, you are looking at the module's native fault memory, which carries far more detail than the emissions summary.

How P1 and P2 modules report codes

On P1 and P2 cars the modules speak Volvo's D2 messages (our guide to the P1, P2 and P3 platforms explains which models use what). Fault codes are read with Volvo's own AE service, sent to the module's address:

Which of the two a module supports is part of that module's definition, so a tool should ask for the right one rather than guess. The raw answer from our C70's engine module looked like this — one real record, then an empty slot:

BytesMeaning
EE 1BPositive answer to the AE 1B request
94 0F 00 00 00 00 00 00Code 940F → shown as ECM-940F, brake pedal sensor
FF FF FF FF FF FF FF FFEmpty slot — no code

A module answers this request only when it is asked directly, on the right bus. On many P1 cars the airbag, door and climate modules sit on the low-speed CAN bus on OBD pins 3 and 11 — see Volvo HS-CAN and LS-CAN explained.

Active or stored: the status of a code

A code in the list does not tell you whether the fault is happening right now. For that, a D2 module can be asked for the status of each code with a separate request, AE 18 followed by the code. The answer is a set of flags defined for D2 modules:

In everyday terms that boils down to two states. An active code is a fault the module sees now. A stored code was detected earlier and is kept in memory even though the condition may have gone — a loose connector that only fails on bumpy roads, for example. Stored codes are not "old news": they are often the only trace of an intermittent problem.

Volscan asks for the status whenever a module supports the request and marks a code active when "fault present now" is set; otherwise it is shown as stored. If a module does not answer the status request, the code is shown as stored, never silently dropped. We are still confirming on a car how every module fills in these flags.

P3 cars: fault codes over UDS

P3 cars — the S60, V60, XC60, V70, XC70 and S80 from 2007 on — use UDS (ISO 14229) instead of D2. The fault codes are read with service 19 02, "report codes by status mask". Each code comes back as three bytes plus a status byte, and the request itself carries a mask that says which statuses you want to see.

The UDS status byte is a set of standard flags, among them:

The mask matters more than it looks. Ask for every status and a module also returns codes whose only flag is "test not completed" — not faults at all, just checks that haven't run yet. On a 2019 V40 we saw one such read report about 400 codes, and the count changed from one read to the next. Volvo's own diagnostic routines ask for failed since last clear, which returns only codes that have actually failed. Volscan does the same, ignores records without a failure flag, and shows a code as active when "test failed" is set and as stored otherwise.

The result looks the same on screen as on a D2 car: a module-prefixed code, its description from that module's definitions, and an active or stored status.

Why a generic scanner sees so few codes

Put all of this together and the gap is obvious. A generic OBD-II scanner sends one broadcast request for emissions codes. Only the engine and gearbox are required to answer, and they answer with P-codes. It never sends AE 1B to a D2 module or 19 02 to a P3 body module, and most adapters cannot reach the low-speed bus at all. We go through this in detail in why a generic OBD-II scanner misses Volvo fault codes.

Clearing codes is a separate service again, and a module may refuse it — our C70's engine module declined a clear request during testing. Volscan is read-only by default: reading codes and their status changes nothing in the car, and clearing is only offered on D2 modules whose definition lists it, with a confirmation and a fresh read afterwards. See supported cars and adapters.

FAQ

What does a Volvo code like ECM-940F mean?

The part before the dash is the module that stored the code (ECM is the engine control module); the part after it is the module's own 16-bit code in hexadecimal. Its meaning comes from that module's definitions. On our 2008 C70, ECM-940F is the brake pedal sensor.

Can I convert a Volvo module code into a P-code?

Not by arithmetic. Generic P-codes are the legislated OBD-II emissions codes; a Volvo module code is the module's own number and is described by that module's definitions. The same four digits on another module mean something else.

What is the difference between an active and a stored Volvo fault code?

An active code is a fault the module sees right now. A stored code is a fault that was detected earlier and is kept in memory, even if the condition has gone. Both are worth reading: a stored code often explains an intermittent problem.