The brief
Mr Lim's X6 was misfiring, the engine stumbling and rough with the check engine light on. The easy assumption is the ignition coils, but a misfire isn't always about the coils, sometimes it's a vacuum leak. He brought it in for a proper diagnosis. The crankcase breather hose vents the gases that build up inside the crankcase back into the intake to be burned cleanly. That hose is rubber, and over the years it heat-cycles, perishes and cracks, so unmetered air gets sucked in through the split. The engine can't keep the air-fuel mix right with a leak it can't measure, so the idle goes lumpy and it misfires, and the management trips the light. A perished breather hose doesn't reseal, so it needs replacing.
The diagnosis
Diagnostics confirmed it, lean-mixture and misfire codes, and a leak test showed unmetered air getting in through a crack in the crankcase breather hose. The coils, the plugs and the rest of the engine checked out, the spark was fine, it was a vacuum leak. That's a hose replacement, fresh rubber where the old had perished, then the codes cleared and the engine let to relearn its fuelling.
The work
The perished crankcase breather hose was removed, the connections cleaned up, and a new genuine BMW-spec hose fitted, the other breather and vacuum hoses checked over while everything was apart. The fault codes were cleared and the engine's fuelling adaptations reset so it could relearn against a sealed crankcase ventilation system. A road test confirmed a steady idle, no misfires, the light staying off, and smooth power.
The outcome
Smooth idle, clean pull through the rev range, no misfires, no warning light, and the engine running properly again. The X6 went home running properly. A perished breather hose lets unmetered air in and the engine misfires fighting its own fuelling, so a proper diagnosis pointed at the leak rather than the coils, and changing the hose put the running right.