d5dc161dc18038e3c5b376be05bbd341381fe25d
[tpg/acess2.git] / KernelLand / Modules / Network / PRO100 / main.c
1 /*
2  * Acess2 PRO/100 Driver
3  * - By John Hodge (thePowersGang)
4  *
5  * main.c
6  * - Driver core
7  *
8  * Built with reference to the linux e100 driver (drivers/net/ethernet/intel/e100.c)
9  * 82559-fast-ethernet-multifunciton-pci-datasheet.pdf
10  */
11 #include <acess.h>
12 #include <IPStack/include/adapter_api.h>
13 #include <modules.h>
14
15 // === CONSTANTS ===
16 const Uint16    caSupportedCards[][2] = {
17         {0x8086, 0x103D},
18         };
19 const int       ciNumSupportedCards = sizeof(caSupportedCards)/sizeof(caSupportedCards[0]);
20
21 // === PROTOTYPES ===
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);
28
29 size_t  PRO100_int_ReadEEPROM(tCard *Card, size_t Ofs, size_t Len, void *Buffer);
30 // === GLOBALS ===
31 MODULE_DEFINE(0, PRO100, PRO100_Install, PRO100_Cleanup, "IPStack", NULL);
32 tIPStack_AdapterType    gPRO100_AdapterType = {
33         .Name = "PRO/100",
34         .Type = ADAPTERTYPE_ETHERNET_100M,
35         .Flags = 0,     
36         .SendPacket = PRO100_SendPacket,
37         .WaitForPacket = PRO100_WaitForPacket
38         
39 };
40
41 // === CODE ===
42 int PRO100_Install(char **Arguments)
43 {
44         return MODULE_ERR_OK;
45 }
46
47 int PRO100_InitCard(tCard *Card)
48 {
49         // Card reset
50         Card->MMIO->Port = PORT_SELECTIVERESET;
51         // - Write Flush, wait 20us
52         Card->MMIO->Port = PORT_SOFTWARERESET;
53         // - Write Flush, wait 20us
54
55         // Read MAC address
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);
59         
60         return 0;
61 }
62
63 void PRO100_Cleanup(void)
64 {
65         return 0;
66 }
67
68 tIPStackBuffer  *PRO100_WaitForPacket(void *Ptr)
69 {
70 }
71
72 int PRO100_SendPacket(void *Ptr, tIPStackBuffer *Buffer)
73 {
74         
75 }
76
77 void PRO100_IRQHandler(int Num, void *Ptr)
78 {
79         
80 }
81
82 Uint16 PRO100_int_ReadEEPROM(tCard *Card, size_t Ofs)
83 {
84         Uint8   addr_len = 8;
85         Uint32  addr_data = ((EEPROM_OP_READ << addr_len) | Ofs) << 16;
86         
87         Card->MMIO->EEPROMCtrl = EEPROM_CTRL_CS | EEPROM_CTRL_SK;
88         // Flush + 4us
89         
90         for( int i = 32; i --; )
91         {
92                 Uint8   ctrl = EEPROM_CTRL_CS | ((addr_data & (1 << i)) ? EEPROM_CTRL_DI : 0);
93                 Card->MMIO->EEPROMCtrl = ctrl;
94                 // Flush + 4us
95                 Card->MMIO->EEPROMCtrl = ctrl | EEPROM_CTRL_SK;
96                 // Flush + 4us
97                 
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 )
101                 {
102                         addr_len = addr_len - (i - 16);
103                         i = 17;
104                 }
105                 
106                 data = (data << 1) | (ctrl & EEPROM_CTRL_DO ? 1 : 0)
107         }
108
109         // Deslect chip
110         Card->MMIO->EEPROMCtrl = 0;     
111         // Flush + 4us
112
113         return (data & 0xFFFF);
114 }

UCC git Repository :: git.ucc.asn.au