Here is the problem.... if you make everything a byte stream (which is a great fundamental way of building up a small cooperating program with a common interface), how do you handle the mechanisms to modify the stream in a manner than make sense (control if you will) in an out-of-band manner, but not end up with a fisherman's stew of different and special things (access methods, frameworks, et al) that are peculiar to that specific stream?
The problem with stty/getty was is was specific to TTY's. It was a fine OOB scheme, but did not make sense for say changing parameters on other devices (tape as an example). The tape solution was different names, which worked there because you were not supposed to change things like density mid tape write. Other peripherals worked differently. ioctl became the only way out, as Noel points out.
So ... this begs the question? Does the ctl file idea work better than ioctl? You still have to know what the ctl interface is for that device? It is ASCII which is nice and huge improvement over the binary command encoding crap.
Clem