2 * Acess2 PRO/100 Driver
3 * - By John Hodge (thePowersGang)
8 * Built with reference to the linux e100 driver (drivers/net/ethernet/intel/e100.c)
9 * 82559-fast-ethernet-multifunciton-pci-datasheet.pdf
12 #include <IPStack/include/adapter_api.h>
16 const Uint16 caSupportedCards[][2] = {
19 const int ciNumSupportedCards = sizeof(caSupportedCards)/sizeof(caSupportedCards[0]);
22 int PRO100_Install(char **Arguments);
23 int PRO100_InitCard(tCard *Card);
24 void PRO100_Cleanup(void);
25 tIPStackBuffer *PRO100_WaitForPacket(void *Ptr);
26 int PRO100_SendPacket(void *Ptr, tIPStackBuffer *Buffer);
27 void PRO100_IRQHandler(int Num, void *Ptr);
29 size_t PRO100_int_ReadEEPROM(tCard *Card, size_t Ofs, size_t Len, void *Buffer);
31 MODULE_DEFINE(0, PRO100, PRO100_Install, PRO100_Cleanup, "IPStack", NULL);
32 tIPStack_AdapterType gPRO100_AdapterType = {
34 .Type = ADAPTERTYPE_ETHERNET_100M,
36 .SendPacket = PRO100_SendPacket,
37 .WaitForPacket = PRO100_WaitForPacket
42 int PRO100_Install(char **Arguments)
47 int PRO100_InitCard(tCard *Card)
50 Card->MMIO->Port = PORT_SELECTIVERESET;
51 // - Write Flush, wait 20us
52 Card->MMIO->Port = PORT_SOFTWARERESET;
53 // - Write Flush, wait 20us
56 Card->MAC.Words[0] = PRO100_int_ReadEEPROM(Card, 0);
57 Card->MAC.Words[1] = PRO100_int_ReadEEPROM(Card, 1);
58 Card->MAC.Words[2] = PRO100_int_ReadEEPROM(Card, 2);
63 void PRO100_Cleanup(void)
68 tIPStackBuffer *PRO100_WaitForPacket(void *Ptr)
72 int PRO100_SendPacket(void *Ptr, tIPStackBuffer *Buffer)
77 void PRO100_IRQHandler(int Num, void *Ptr)
82 Uint16 PRO100_int_ReadEEPROM(tCard *Card, size_t Ofs)
85 Uint32 addr_data = ((EEPROM_OP_READ << addr_len) | Ofs) << 16;
87 Card->MMIO->EEPROMCtrl = EEPROM_CTRL_CS | EEPROM_CTRL_SK;
90 for( int i = 32; i --; )
92 Uint8 ctrl = EEPROM_CTRL_CS | ((addr_data & (1 << i)) ? EEPROM_CTRL_DI : 0);
93 Card->MMIO->EEPROMCtrl = ctrl;
95 Card->MMIO->EEPROMCtrl = ctrl | EEPROM_CTRL_SK;
98 ctrl = Card->MMIO->EEPROMCtrl;
99 // Once the address is fully recieved, the card emits a zero bit
100 if( !(ctrl & EEPROM_CTRL_DO) && i > 16 )
102 addr_len = addr_len - (i - 16);
106 data = (data << 1) | (ctrl & EEPROM_CTRL_DO ? 1 : 0)
110 Card->MMIO->EEPROMCtrl = 0;
113 return (data & 0xFFFF);