HERE'S HOW TO TETHER FOR FREE ON AT&T ON AN IPHONE 3G WITH iOS 4[I haven't tested it on the 3GS or iPhone 4]:
Things you need:
A jailbroken iPhone 3G on iOS4, with multitasking enabled.
SBSettings
MyWi(No Rock)[which you can get by adding
http://cydia.xsellize.com/ to your sources, it's under 'x apps']
Step one: install SBsettings.
Step two: install MyWi(No Rock). WHEN IT TELLS YOU TO RESTART SPRINGBOARD DO NOT DO IT. Instead, press the home button to return to your home screen. Then hit the home button twice to bring up the multitasking interface. You'll see Cydia there. Hold it until it wiggles, then press the minus sign in the top left corner of the icon. This will stop Cydia from running, therefore allowing you to use it.
Step three: Open MyWi and you'll see a slider to "Enable Internet Tethering". Slide it over. Then close MyWi. Then re-open MyWi and re-enable it. It may still be enabled, if so, just turn it off then back on.
Step four: Now, if you've done this correctly, you should be able to tether. But SpringBoard will crash every time you respring due to MyWi's incompatibility with iOS4. Now what you need to do is open SBsettings and hit the "More" button. Then click "MobileSubstrate Addons" Then disable MyWi. This will allow you to keep tethering, but also allow you to respring without SpringBoard crashing.
Bingo. Tethering. It's been working fine on my 3G for a few days now.
Edit:
Okay so here's the deal. If you disable MyWi through SBsettings, it will only let you tether for that one session, as long as you disable MyWi while the blue internet tethering bar is up. When you plug it in next time, it doesn't tether. So this method works kind of. Spring board will still crash if you have MyWi enabled. I thought I had it too... :[ well it's still easier than installing and uninstalling MyWi everytime you want to tether. Just disable it in SBsettings when you're not using it and SpringBoard won't crash, then just enable it when you want to tether. Not too hard.