Hi,
The disk access code is called from 16bit mode, and thus it needs to be compiled in 16bit mode. The link errors you are seeing are there to force a build error (instead of failing mysterously at run time).
What does your driver do that requires 32bit mode?
Access special pages for communication with the hypervisor (grant tables, request ring).
I thought that, apart from the entry points and some special cases, SeaBIOS mostly ran in 32-bit mode. Have I just misunderstood?
Pretty much all initialization code (including drive probing) runs in 32bit mode. Any 16bit interrupt handling runs in 16bit mode.
The ahci driver has to access some memory addresses above 1 meg to work properly and so it uses the pci_readl/writel() functions which trampoline to/from 32bit mode to acomplish this. If you need to do something similar, you could use that as a model.
Another option would be to have the int15 handler trampoline to 32bit mode before calling process_op.
cheers, Gerd