1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
45:
46: 47: 48: 49:
50:
51: #include <tk/tkernel.h>
52: #include <tk/util.h>
53: #include <libstr.h>
54: #include <device/gdrvif.h>
55: #include <device/netdrv.h>
56: #include <device/pcmcia.h>
57: #include <device/devconf.h>
58:
59: #ifdef DEBUG
60: #define DP(exp) printf exp
61: #define DBG(exp) exp
62: #else
63: #define DP(exp)
64: #define DBG(exp)
65: #endif
66:
67: #define INVALID_ID (0)
68: #define INVALID_DEVID (-1)
69:
70: 71: 72:
73: #define DEFAULT_PRI (25)
74: #ifdef DEBUG
75: #define TASK_STKSZ (4096)
76: #else
77: #define TASK_STKSZ (2048)
78: #endif
79:
80: 81: 82:
83: #define MAX_NETDEV 2
84:
85: #define L_EADDR (6)
86:
87: #define MAXPKTLEN (1500+14+6)
88: #define MINPKTLEN (46+14)
89: #define MINRXBUFSZ (512+20+44)
90:
91: #define N_RXBUF (64)
92:
93: #define IOSTEP 1
94:
95: 96: 97:
98: typedef struct _netinf {
99: W netno;
100: ID devid;
101: GDI Gdi;
102: ID mbfid;
103: ID tskid;
104:
105: NetDevInfo di;
106: W pciadr;
107: W devix;
108:
109: NetAddr eaddr;
110: NetStInfo stinf;
111:
112: W opencnt;
113: W tmout;
114:
115: BOOL exist:1;
116: BOOL suspended:1;
117: BOOL txbusy:1;
118: BOOL poweroff:1;
119: BOOL rsv1:12;
120: BOOL wrkflg1:1;
121: BOOL wrkflg2:1;
122: BOOL wrkflg3:1;
123: BOOL wrkflg4:1;
124: BOOL rsv2:12;
125:
126: ID cardid;
127: ID mapid;
128: UH ccraddr;
129: UB ccr[2];
130: UW orgbase;
131:
132: NetRxBufSz bufsz;
133: UW ip_rxbuf;
134: UW op_rxbuf;
135: VP rxbuf[N_RXBUF];
136:
137:
138: ER (*initfn)(struct _netinf *inf, W init);
139: void (*inthdr)(struct _netinf *inf);
140: INT (*sendfn)(struct _netinf *inf, UB *buf, W len);
141: void (*reset)(struct _netinf *inf, BOOL start);
142: ER (*cardchk)(struct _netinf *inf);
143: INT (*misc)(struct _netinf *inf, W wrt, W par, VP buf, W len);
144: void (*tmofn)(struct _netinf *inf);
145: UH (*mii_read)(struct _netinf *inf, W adr, W reg);
146: void (*mii_write)(struct _netinf *inf, W adr, W reg, W dat);
147: INT (*mcast)(struct _netinf *inf, W wrt, W all, UB *buf, W len);
148:
149: union {
150: VP vp[12];
151: UW uw[12];
152: UH uh[24];
153: UB ub[48];
154: } wrk;
155: VP extwrk;
156: FastLock lock;
157: } NetInf;
158:
159: #define NetUnit(inf) ((inf)->netno + 'a')
160:
161: 162: 163:
164: typedef struct {
165: UH vendor;
166: UH devid;
167: UH idmask;
168: UH devix;
169: } PciTab;
170:
171: #define PCI_NET_ETHER 0x0200
172:
173: 174: 175:
176: typedef struct {
177: UW kind;
178: PciTab *pcitab;
179: ER (*initfn)(NetInf *inf, W init);
180: } DrvDef;
181:
182: 183: 184:
185: #define HK_MASK (0x000007ff)
186: #define HK_CHIPMASK (0x000000ff)
187: #define HK_ISA (0x00000000)
188: #define HK_PCI (0x00000100)
189: #define HK_PCCARD (0x00000200)
190: #define isPcCARD(inf) (((inf)->di.kind & 0x00000700) == HK_PCCARD)
191: #define isPCI(inf) (((inf)->di.kind & 0x00000700) == HK_PCI)
192: #define isISA(inf) (((inf)->di.kind & 0x00000700) == HK_ISA)
193:
194: #define isFORCE_OPEN(inf) ( (inf)->di.kind & 0x00000800)
195: #define IFC_TYPE(inf) (((inf)->di.kind & 0x0000f000) >> 12)
196:
197: #define HK_FDX (0x00010000)
198: #define isFDX(inf) ((inf)->di.kind & HK_FDX)
199:
200: 201: 202:
203: #define InB(ix) in_b(IOB + ((ix) * IOSTEP))
204: #define InH(ix) in_h(IOB + ((ix) * IOSTEP))
205: #define InW(ix) in_w(IOB + ((ix) * IOSTEP))
206: #define OutB(ix, dt) out_b(IOB + ((ix) * IOSTEP), (dt))
207: #define OutH(ix, dt) out_h(IOB + ((ix) * IOSTEP), (dt))
208: #define OutW(ix, dt) out_w(IOB + ((ix) * IOSTEP), (dt))
209:
210: 211: 212:
213:
214:
215: IMPORT PRI TskPri;
216: IMPORT ID CreTask(FP entry, PRI pri, W name, UW par, W stksz);
217:
218:
219: IMPORT ER OpenProc(ID devid, UINT omode, GDI gdi);
220: IMPORT ER CloseProc(ID devid, UINT option, GDI gdi);
221: IMPORT INT EventProc(INT evttyp, VP evtinf, GDI gdi);
222: IMPORT void AcceptRequest(NetInf *inf);
223:
224:
225: IMPORT void CardPowerOff(NetInf *inf, BOOL close);
226: IMPORT ER CardPowerOn(NetInf *inf, BOOL open);
227: IMPORT ER CardEvent(NetInf *inf, CardReq *req);
228:
229:
230: IMPORT void OutMemB(UW iob, W ix, UB *buf, W cnt);
231: IMPORT void InMemB(UW iob, W ix, UB *buf, W cnt);
232: IMPORT void OutMemH(UW iob, W ix, UH *buf, W cnt);
233: IMPORT void InMemH(UW iob, W ix, UH *buf, W cnt);
234: IMPORT void OutMemW(UW iob, W ix, UW *buf, W cnt);
235: IMPORT void InMemW(UW iob, W ix, UW *buf, W cnt);
236:
237:
238: IMPORT ER DefIntHdr(NetInf *inf, BOOL regist);
239:
240:
241: IMPORT ER PciAllocMem(W sz, VP *p);
242: IMPORT void PciFreeMem(VP p);
243: IMPORT ER PciProbe(NetInf *inf, PciTab *tab);
244: IMPORT void PciEnable(W caddr, W iocmd, W latency);
245: IMPORT void SetACPI(NetInf *inf, W state);
246: IMPORT INT GetPCIAdr(VP addr, W len, VP *physical_addr);
247:
248:
249: IMPORT ER AllocMem(W sz, VP *p);
250: IMPORT void FreeMem(VP p);
251: IMPORT ER SetRxBuf(NetInf *inf, VP bp);
252: IMPORT VP GetRxBuf(NetInf *inf);
253: IMPORT ER SendMsg(NetInf *inf, VP pb, W len);
254: IMPORT INT MIIfind(NetInf *inf, W target);
255: IMPORT INT MIIinit(NetInf *inf, W target);
256: IMPORT void SetProdName(NetInf *inf, UB **nm1, UB **nm2);
257: IMPORT UW CalcCRC32(UB *data, W len);
258:
259:
260: IMPORT ER InitSMSC9118(NetInf *inf, W init);
261: