Hi again,
I found bugs in your code:
loops = 0; /* Yes, this is a mess, but it's the easiest way to do it */ while((inb(SMBUS_IO_BASE + SMBHSTSTAT) & 1) == 1 && loops <= SMBUS_TIMEOUT) ++loops;
You have already an IO BASE in SMBHSTSTAT this makes me wonder why it works for you...
smbus_print_error(inb(SMBUS_IO_BASE + SMBHSTSTAT), loops);
same here
I'm attaching version which works for me (tm)
Rudolf