After a couple of weeks of head-scratching, I managed to get the rewritten USB-wireless ZD1211 driver transmitting data.
The code has been written for a while, and although it seems to work (the device doesn’t indicate any form of failure), the frames simply weren’t “hitting the air”.
The problem originates from the huge number of undocumented physical registers in the vendor driver. Rather than list all 200 of them in our driver source in the ugly manner which ZyDAS do so, we devised a quick one-line macro to perform the same task:
#define CR(reg) CTL_REG((reg)*4)
However, it appears that ZyDAS have some trouble counting. A snippet from the vendor driver:
#define ZD_CR1 0x0004 #define ZD_CR2 0x0008 #define ZD_CR3 0x000C #define ZD_CR5 0x0010 #define ZD_CR6 0x0014 #define ZD_CR7 0x0018 #define ZD_CR8 0x001C #define ZD_CR4 0x0020 #define ZD_CR9 0x0024
1,2,3,5,6,7,8,4,9… Our macro obviously doesn’t match the unordered nature of those low CR addresses.
After inserting the appropriate hacks into our driver, packets start flying, as confirmed by another wireless card in monitor mode.
Be warned: although we have transmit and receive working to some degree, the driver isn’t ready for users wanting to connect to networks yet.
I’m attending the OSDL Wireless Developer Summit in the first week of April, and I’m hoping that we’ll have a partially usable driver in time for that.