The msm_hsic_host wakelock is because the 3G modem is connected to the phone as an external USB device controlled by the hsic host controller. When the modem wakes up for any reason (apps sync, location, tower ping, etc...) the wakelock is requested. The problem is that the hsic host controller doesn't go back into suspend mode properly, this is a problem with the kernel. The result is that because the hsic host controller isn't asleep the phone wont enter deep sleep while it waits for the hsic host to suspend.
There is the additional issue that if your signal is poor the operations that caused the wakelock in the first place take longer to complete thus lengthening the time the wakelock is held.
The issue is significantly reduced on WiFi for obvious reasons, all the data is transmitted via WiFi so the 3G modem doesn't need to wake up nearly as often, it still wakes up to deal with tower checks and that sort of thing to ensure that it has voice connectivity, but those events are much rarer.
There are kernels available that attempt to solve this problem, Harsh kernel as suggested by another user has fixes in it along with a lot of other changes, the fixed kernel I'm working on is stock with these changes as well, either should help, it's not possible to eliminate this wakelock completely without shutting down the 3G modem which would of course prevent data and voice use of the phone, but they will reduce the wakelock and may help with your battery life.