Performance does not scale linearly with clock speed at all. (try 500mhz and 800mhz and you will see)
Of course it does. Unless perhaps if you are using SDK 2.6.
A simply test shows it does not.
870Mhz 397Mhash/s 870/397=2.191
800Mhz 359Mhash/s 800/359=2.222
500Mhz 202Mhash/s 500/202=2.475
In theory it can't be linear, same reason why cpu does not scale linearly with core speed.
Of course CPU bound cache resident benchmarks do scale linearly with clockspeed. Try benchmarking Coremark, its linear from 0.1 Hz to 1 GHz.
As for your results, like I said,
unless perhaps you are using SDK 2.6. In that case, you become memory bandwidth bound. Hashrate will still scale linearly with gpu clock but only if you can scale memory clock as well.
If you use SDK 2.1 or 2.4, hashrate is not bandwidth bound, in fact you typically get a small increase as you lower memory clocks
down to ~150-200 MHz. Yes negative scaling. Check the link and try yourself. But the result is perfectly linear performance scaling with GPU clock.