It’s the all-too-familiar case of Decent Product, Crappy Drivers.
Both printer and scanner drivers from Brother are simply binary blobs wrapped with [L]GPLed code. Really, really crappy code at that.
The stock CUPS filter wrapper for MFC-420CN actually did not work at all as it was, for some bizarre reason, written in csh: not the most widely used default shell for Linux distributions. After dissecting the code, I realized that the two or three dozen calls to the binary blob printer configuration tool could be replaced with a single call, provided that some smart argument processing is done instead of configuration the printer for every single setting that needs to be parsed from 3 separate sources.
I am currently working on replacing this abomination with Perl.
Of course, that’s only half of the story, as the MFC-420CN is a multi-function printer/scanner/fax.
To make a long story short, I am about 10 minutes into trying to get the scanner to work, and I’m already baffled at the sheer insanity of it all. It requires /proc/bus/usb to be mounted 0666, a manually created usbscanner node, and, from what I can gather from the “source” tarball, has various parts of other OSS projects compiled in statically, like snprintf, strdup, getenv, and usleep.
On the plus side, if you don’t care about polluting your /usr/lib, the drivers do seem to work reliably if you let the RPM do its thing. Nevertheless, cheap toners be damned, what Brother printers I have now will be my last.