Staging: epl: run Lindent on *.c files
[deliverable/linux.git] / drivers / staging / epl / Edrv8139.c
1 /****************************************************************************
2
3 (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
4 www.systec-electronic.com
5
6 Project: openPOWERLINK
7
8 Description: Ethernet driver for Realtek RTL8139 chips
9 except the RTL8139C+, because it has a different
10 Tx descriptor handling.
11
12 License:
13
14 Redistribution and use in source and binary forms, with or without
15 modification, are permitted provided that the following conditions
16 are met:
17
18 1. Redistributions of source code must retain the above copyright
19 notice, this list of conditions and the following disclaimer.
20
21 2. Redistributions in binary form must reproduce the above copyright
22 notice, this list of conditions and the following disclaimer in the
23 documentation and/or other materials provided with the distribution.
24
25 3. Neither the name of SYSTEC electronic GmbH nor the names of its
26 contributors may be used to endorse or promote products derived
27 from this software without prior written permission. For written
28 permission, please contact info@systec-electronic.com.
29
30 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
33 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
34 COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
35 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
36 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
37 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
38 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
39 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
40 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 POSSIBILITY OF SUCH DAMAGE.
42
43 Severability Clause:
44
45 If a provision of this License is or becomes illegal, invalid or
46 unenforceable in any jurisdiction, that shall not affect:
47 1. the validity or enforceability in that jurisdiction of any other
48 provision of this License; or
49 2. the validity or enforceability in other jurisdictions of that or
50 any other provision of this License.
51
52 -------------------------------------------------------------------------
53
54 $RCSfile: Edrv8139.c,v $
55
56 $Author: D.Krueger $
57
58 $Revision: 1.10 $ $Date: 2008/11/21 09:00:38 $
59
60 $State: Exp $
61
62 Build Environment:
63 Dev C++ and GNU-Compiler for m68k
64
65 -------------------------------------------------------------------------
66
67 Revision History:
68
69 2008/02/05 d.k.: start of implementation
70
71 ****************************************************************************/
72
73 #include "global.h"
74 #include "EplInc.h"
75 #include "edrv.h"
76
77 #include <linux/module.h>
78 #include <linux/kernel.h>
79 #include <linux/pci.h>
80 #include <linux/interrupt.h>
81 #include <linux/init.h>
82 #include <linux/errno.h>
83 #include <linux/major.h>
84 #include <linux/version.h>
85 #include <asm/io.h>
86 #include <asm/uaccess.h>
87 #include <asm/atomic.h>
88 #include <asm/irq.h>
89 #include <linux/sched.h>
90 #include <linux/delay.h>
91
92 /***************************************************************************/
93 /* */
94 /* */
95 /* G L O B A L D E F I N I T I O N S */
96 /* */
97 /* */
98 /***************************************************************************/
99
100 // Buffer handling:
101 // All buffers are created statically (i.e. at compile time resp. at
102 // initialisation via kmalloc() ) and not dynamically on request (i.e. via
103 // EdrvAllocTxMsgBuffer().
104 // EdrvAllocTxMsgBuffer() searches for an unused buffer which is large enough.
105 // EdrvInit() may allocate some buffers with sizes less than maximum frame
106 // size (i.e. 1514 bytes), e.g. for SoC, SoA, StatusResponse, IdentResponse,
107 // NMT requests / commands. The less the size of the buffer the less the
108 // number of the buffer.
109
110 //---------------------------------------------------------------------------
111 // const defines
112 //---------------------------------------------------------------------------
113
114 #ifndef EDRV_MAX_TX_BUFFERS
115 #define EDRV_MAX_TX_BUFFERS 20
116 #endif
117
118 #define EDRV_MAX_FRAME_SIZE 0x600
119
120 #define EDRV_RX_BUFFER_SIZE 0x8610 // 32 kB + 16 Byte + 1,5 kB (WRAP is enabled)
121 #define EDRV_RX_BUFFER_LENGTH (EDRV_RX_BUFFER_SIZE & 0xF800) // buffer size cut down to 2 kB alignment
122
123 #define EDRV_TX_BUFFER_SIZE (EDRV_MAX_TX_BUFFERS * EDRV_MAX_FRAME_SIZE) // n * (MTU + 14 + 4)
124
125 #define DRV_NAME "epl"
126
127 #define EDRV_REGW_INT_MASK 0x3C // interrupt mask register
128 #define EDRV_REGW_INT_STATUS 0x3E // interrupt status register
129 #define EDRV_REGW_INT_ROK 0x0001 // Receive OK interrupt
130 #define EDRV_REGW_INT_RER 0x0002 // Receive error interrupt
131 #define EDRV_REGW_INT_TOK 0x0004 // Transmit OK interrupt
132 #define EDRV_REGW_INT_TER 0x0008 // Transmit error interrupt
133 #define EDRV_REGW_INT_RXOVW 0x0010 // Rx buffer overflow interrupt
134 #define EDRV_REGW_INT_PUN 0x0020 // Packet underrun/ link change interrupt
135 #define EDRV_REGW_INT_FOVW 0x0040 // Rx FIFO overflow interrupt
136 #define EDRV_REGW_INT_LENCHG 0x2000 // Cable length change interrupt
137 #define EDRV_REGW_INT_TIMEOUT 0x4000 // Time out interrupt
138 #define EDRV_REGW_INT_SERR 0x8000 // System error interrupt
139 #define EDRV_REGW_INT_MASK_DEF (EDRV_REGW_INT_ROK \
140 | EDRV_REGW_INT_RER \
141 | EDRV_REGW_INT_TOK \
142 | EDRV_REGW_INT_TER \
143 | EDRV_REGW_INT_RXOVW \
144 | EDRV_REGW_INT_FOVW \
145 | EDRV_REGW_INT_PUN \
146 | EDRV_REGW_INT_TIMEOUT \
147 | EDRV_REGW_INT_SERR) // default interrupt mask
148
149 #define EDRV_REGB_COMMAND 0x37 // command register
150 #define EDRV_REGB_COMMAND_RST 0x10
151 #define EDRV_REGB_COMMAND_RE 0x08
152 #define EDRV_REGB_COMMAND_TE 0x04
153 #define EDRV_REGB_COMMAND_BUFE 0x01
154
155 #define EDRV_REGB_CMD9346 0x50 // 93C46 command register
156 #define EDRV_REGB_CMD9346_LOCK 0x00 // lock configuration registers
157 #define EDRV_REGB_CMD9346_UNLOCK 0xC0 // unlock configuration registers
158
159 #define EDRV_REGDW_RCR 0x44 // Rx configuration register
160 #define EDRV_REGDW_RCR_NO_FTH 0x0000E000 // no receive FIFO threshold
161 #define EDRV_REGDW_RCR_RBLEN32K 0x00001000 // 32 kB receive buffer
162 #define EDRV_REGDW_RCR_MXDMAUNL 0x00000700 // unlimited maximum DMA burst size
163 #define EDRV_REGDW_RCR_NOWRAP 0x00000080 // do not wrap frame at end of buffer
164 #define EDRV_REGDW_RCR_AER 0x00000020 // accept error frames (CRC, alignment, collided)
165 #define EDRV_REGDW_RCR_AR 0x00000010 // accept runt
166 #define EDRV_REGDW_RCR_AB 0x00000008 // accept broadcast frames
167 #define EDRV_REGDW_RCR_AM 0x00000004 // accept multicast frames
168 #define EDRV_REGDW_RCR_APM 0x00000002 // accept physical match frames
169 #define EDRV_REGDW_RCR_AAP 0x00000001 // accept all frames
170 #define EDRV_REGDW_RCR_DEF (EDRV_REGDW_RCR_NO_FTH \
171 | EDRV_REGDW_RCR_RBLEN32K \
172 | EDRV_REGDW_RCR_MXDMAUNL \
173 | EDRV_REGDW_RCR_NOWRAP \
174 | EDRV_REGDW_RCR_AB \
175 | EDRV_REGDW_RCR_AM \
176 | EDRV_REGDW_RCR_APM) // default value
177
178 #define EDRV_REGDW_TCR 0x40 // Tx configuration register
179 #define EDRV_REGDW_TCR_VER_MASK 0x7CC00000 // mask for hardware version
180 #define EDRV_REGDW_TCR_VER_C 0x74000000 // RTL8139C
181 #define EDRV_REGDW_TCR_VER_D 0x74400000 // RTL8139D
182 #define EDRV_REGDW_TCR_IFG96 0x03000000 // default interframe gap (960 ns)
183 #define EDRV_REGDW_TCR_CRC 0x00010000 // disable appending of CRC by the controller
184 #define EDRV_REGDW_TCR_MXDMAUNL 0x00000700 // maximum DMA burst size of 2048 b
185 #define EDRV_REGDW_TCR_TXRETRY 0x00000000 // 16 retries
186 #define EDRV_REGDW_TCR_DEF (EDRV_REGDW_TCR_IFG96 \
187 | EDRV_REGDW_TCR_MXDMAUNL \
188 | EDRV_REGDW_TCR_TXRETRY)
189
190 #define EDRV_REGW_MULINT 0x5C // multiple interrupt select register
191
192 #define EDRV_REGDW_MPC 0x4C // missed packet counter register
193
194 #define EDRV_REGDW_TSAD0 0x20 // Transmit start address of descriptor 0
195 #define EDRV_REGDW_TSAD1 0x24 // Transmit start address of descriptor 1
196 #define EDRV_REGDW_TSAD2 0x28 // Transmit start address of descriptor 2
197 #define EDRV_REGDW_TSAD3 0x2C // Transmit start address of descriptor 3
198 #define EDRV_REGDW_TSD0 0x10 // Transmit status of descriptor 0
199 #define EDRV_REGDW_TSD_CRS 0x80000000 // Carrier sense lost
200 #define EDRV_REGDW_TSD_TABT 0x40000000 // Transmit Abort
201 #define EDRV_REGDW_TSD_OWC 0x20000000 // Out of window collision
202 #define EDRV_REGDW_TSD_TXTH_DEF 0x00020000 // Transmit FIFO threshold of 64 bytes
203 #define EDRV_REGDW_TSD_TOK 0x00008000 // Transmit OK
204 #define EDRV_REGDW_TSD_TUN 0x00004000 // Transmit FIFO underrun
205 #define EDRV_REGDW_TSD_OWN 0x00002000 // Owner
206
207 #define EDRV_REGDW_RBSTART 0x30 // Receive buffer start address
208
209 #define EDRV_REGW_CAPR 0x38 // Current address of packet read
210
211 #define EDRV_REGDW_IDR0 0x00 // ID register 0
212 #define EDRV_REGDW_IDR4 0x04 // ID register 4
213
214 #define EDRV_REGDW_MAR0 0x08 // Multicast address register 0
215 #define EDRV_REGDW_MAR4 0x0C // Multicast address register 4
216
217 // defines for the status word in the receive buffer
218 #define EDRV_RXSTAT_MAR 0x8000 // Multicast address received
219 #define EDRV_RXSTAT_PAM 0x4000 // Physical address matched
220 #define EDRV_RXSTAT_BAR 0x2000 // Broadcast address received
221 #define EDRV_RXSTAT_ISE 0x0020 // Invalid symbol error
222 #define EDRV_RXSTAT_RUNT 0x0010 // Runt packet received
223 #define EDRV_RXSTAT_LONG 0x0008 // Long packet
224 #define EDRV_RXSTAT_CRC 0x0004 // CRC error
225 #define EDRV_RXSTAT_FAE 0x0002 // Frame alignment error
226 #define EDRV_RXSTAT_ROK 0x0001 // Receive OK
227
228 #define EDRV_REGDW_WRITE(dwReg, dwVal) writel(dwVal, EdrvInstance_l.m_pIoAddr + dwReg)
229 #define EDRV_REGW_WRITE(dwReg, wVal) writew(wVal, EdrvInstance_l.m_pIoAddr + dwReg)
230 #define EDRV_REGB_WRITE(dwReg, bVal) writeb(bVal, EdrvInstance_l.m_pIoAddr + dwReg)
231 #define EDRV_REGDW_READ(dwReg) readl(EdrvInstance_l.m_pIoAddr + dwReg)
232 #define EDRV_REGW_READ(dwReg) readw(EdrvInstance_l.m_pIoAddr + dwReg)
233 #define EDRV_REGB_READ(dwReg) readb(EdrvInstance_l.m_pIoAddr + dwReg)
234
235 // TracePoint support for realtime-debugging
236 #ifdef _DBG_TRACE_POINTS_
237 void PUBLIC TgtDbgSignalTracePoint(BYTE bTracePointNumber_p);
238 void PUBLIC TgtDbgPostTraceValue(DWORD dwTraceValue_p);
239 #define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
240 #define TGT_DBG_POST_TRACE_VALUE(v) TgtDbgPostTraceValue(v)
241 #else
242 #define TGT_DBG_SIGNAL_TRACE_POINT(p)
243 #define TGT_DBG_POST_TRACE_VALUE(v)
244 #endif
245
246 #define EDRV_COUNT_SEND TGT_DBG_SIGNAL_TRACE_POINT(2)
247 #define EDRV_COUNT_TIMEOUT TGT_DBG_SIGNAL_TRACE_POINT(3)
248 #define EDRV_COUNT_PCI_ERR TGT_DBG_SIGNAL_TRACE_POINT(4)
249 #define EDRV_COUNT_TX TGT_DBG_SIGNAL_TRACE_POINT(5)
250 #define EDRV_COUNT_RX TGT_DBG_SIGNAL_TRACE_POINT(6)
251 #define EDRV_COUNT_LATECOLLISION TGT_DBG_SIGNAL_TRACE_POINT(10)
252 #define EDRV_COUNT_TX_COL_RL TGT_DBG_SIGNAL_TRACE_POINT(11)
253 #define EDRV_COUNT_TX_FUN TGT_DBG_SIGNAL_TRACE_POINT(12)
254 #define EDRV_COUNT_TX_ERR TGT_DBG_SIGNAL_TRACE_POINT(13)
255 #define EDRV_COUNT_RX_CRC TGT_DBG_SIGNAL_TRACE_POINT(14)
256 #define EDRV_COUNT_RX_ERR TGT_DBG_SIGNAL_TRACE_POINT(15)
257 #define EDRV_COUNT_RX_FOVW TGT_DBG_SIGNAL_TRACE_POINT(16)
258 #define EDRV_COUNT_RX_PUN TGT_DBG_SIGNAL_TRACE_POINT(17)
259 #define EDRV_COUNT_RX_FAE TGT_DBG_SIGNAL_TRACE_POINT(18)
260 #define EDRV_COUNT_RX_OVW TGT_DBG_SIGNAL_TRACE_POINT(19)
261
262 #define EDRV_TRACE_CAPR(x) TGT_DBG_POST_TRACE_VALUE(((x) & 0xFFFF) | 0x06000000)
263 #define EDRV_TRACE_RX_CRC(x) TGT_DBG_POST_TRACE_VALUE(((x) & 0xFFFF) | 0x0E000000)
264 #define EDRV_TRACE_RX_ERR(x) TGT_DBG_POST_TRACE_VALUE(((x) & 0xFFFF) | 0x0F000000)
265 #define EDRV_TRACE_RX_PUN(x) TGT_DBG_POST_TRACE_VALUE(((x) & 0xFFFF) | 0x11000000)
266 #define EDRV_TRACE(x) TGT_DBG_POST_TRACE_VALUE(((x) & 0xFFFF0000) | 0x0000FEC0)
267
268 //---------------------------------------------------------------------------
269 // local types
270 //---------------------------------------------------------------------------
271 /*
272 typedef struct
273 {
274 BOOL m_fUsed;
275 unsigned int m_uiSize;
276 MCD_bufDescFec *m_pBufDescr;
277
278 } tEdrvTxBufferIntern;
279 */
280
281 // Private structure
282 typedef struct {
283 struct pci_dev *m_pPciDev; // pointer to PCI device structure
284 void *m_pIoAddr; // pointer to register space of Ethernet controller
285 BYTE *m_pbRxBuf; // pointer to Rx buffer
286 dma_addr_t m_pRxBufDma;
287 BYTE *m_pbTxBuf; // pointer to Tx buffer
288 dma_addr_t m_pTxBufDma;
289 BOOL m_afTxBufUsed[EDRV_MAX_TX_BUFFERS];
290 unsigned int m_uiCurTxDesc;
291
292 tEdrvInitParam m_InitParam;
293 tEdrvTxBuffer *m_pLastTransmittedTxBuffer;
294
295 } tEdrvInstance;
296
297 //---------------------------------------------------------------------------
298 // local function prototypes
299 //---------------------------------------------------------------------------
300
301 static int EdrvInitOne(struct pci_dev *pPciDev,
302 const struct pci_device_id *pId);
303
304 static void EdrvRemoveOne(struct pci_dev *pPciDev);
305
306 //---------------------------------------------------------------------------
307 // modul globale vars
308 //---------------------------------------------------------------------------
309 // buffers and buffer descriptors and pointers
310
311 static struct pci_device_id aEdrvPciTbl[] = {
312 {0x10ec, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
313 {0,}
314 };
315
316 MODULE_DEVICE_TABLE(pci, aEdrvPciTbl);
317
318 static tEdrvInstance EdrvInstance_l;
319
320 static struct pci_driver EdrvDriver = {
321 .name = DRV_NAME,
322 .id_table = aEdrvPciTbl,
323 .probe = EdrvInitOne,
324 .remove = EdrvRemoveOne,
325 };
326
327 /***************************************************************************/
328 /* */
329 /* */
330 /* C L A S S <edrv> */
331 /* */
332 /* */
333 /***************************************************************************/
334 //
335 // Description:
336 //
337 //
338 /***************************************************************************/
339
340 //=========================================================================//
341 // //
342 // P R I V A T E D E F I N I T I O N S //
343 // //
344 //=========================================================================//
345
346 //---------------------------------------------------------------------------
347 // const defines
348 //---------------------------------------------------------------------------
349
350 //---------------------------------------------------------------------------
351 // local types
352 //---------------------------------------------------------------------------
353
354 //---------------------------------------------------------------------------
355 // local vars
356 //---------------------------------------------------------------------------
357
358 //---------------------------------------------------------------------------
359 // local function prototypes
360 //---------------------------------------------------------------------------
361
362 static BYTE EdrvCalcHash(BYTE * pbMAC_p);
363
364 //---------------------------------------------------------------------------
365 //
366 // Function: EdrvInit
367 //
368 // Description: function for init of the Ethernet controller
369 //
370 // Parameters: pEdrvInitParam_p = pointer to struct including the init-parameters
371 //
372 // Returns: Errorcode = kEplSuccessful
373 // = kEplNoResource
374 //
375 // State:
376 //
377 //---------------------------------------------------------------------------
378 tEplKernel EdrvInit(tEdrvInitParam * pEdrvInitParam_p)
379 {
380 tEplKernel Ret;
381 int iResult;
382
383 Ret = kEplSuccessful;
384
385 // clear instance structure
386 EPL_MEMSET(&EdrvInstance_l, 0, sizeof(EdrvInstance_l));
387
388 // save the init data
389 EdrvInstance_l.m_InitParam = *pEdrvInitParam_p;
390
391 // register PCI driver
392 iResult = pci_register_driver(&EdrvDriver);
393 if (iResult != 0) {
394 printk("%s pci_register_driver failed with %d\n", __FUNCTION__,
395 iResult);
396 Ret = kEplNoResource;
397 goto Exit;
398 }
399
400 if (EdrvInstance_l.m_pPciDev == NULL) {
401 printk("%s m_pPciDev=NULL\n", __FUNCTION__);
402 Ret = kEplNoResource;
403 goto Exit;
404 }
405 // read MAC address from controller
406 printk("%s local MAC = ", __FUNCTION__);
407 for (iResult = 0; iResult < 6; iResult++) {
408 pEdrvInitParam_p->m_abMyMacAddr[iResult] =
409 EDRV_REGB_READ((EDRV_REGDW_IDR0 + iResult));
410 printk("%02X ",
411 (unsigned int)pEdrvInitParam_p->m_abMyMacAddr[iResult]);
412 }
413 printk("\n");
414
415 Exit:
416 return Ret;
417
418 }
419
420 //---------------------------------------------------------------------------
421 //
422 // Function: EdrvShutdown
423 //
424 // Description: Shutdown the Ethernet controller
425 //
426 // Parameters: void
427 //
428 // Returns: Errorcode = kEplSuccessful
429 //
430 // State:
431 //
432 //---------------------------------------------------------------------------
433 tEplKernel EdrvShutdown(void)
434 {
435
436 // unregister PCI driver
437 printk("%s calling pci_unregister_driver()\n", __FUNCTION__);
438 pci_unregister_driver(&EdrvDriver);
439
440 return kEplSuccessful;
441 }
442
443 //---------------------------------------------------------------------------
444 //
445 // Function: EdrvDefineRxMacAddrEntry
446 //
447 // Description: Set a multicast entry into the Ethernet controller
448 //
449 // Parameters: pbMacAddr_p = pointer to multicast entry to set
450 //
451 // Returns: Errorcode = kEplSuccessful
452 //
453 // State:
454 //
455 //---------------------------------------------------------------------------
456 tEplKernel EdrvDefineRxMacAddrEntry(BYTE * pbMacAddr_p)
457 {
458 tEplKernel Ret = kEplSuccessful;
459 DWORD dwData;
460 BYTE bHash;
461
462 bHash = EdrvCalcHash(pbMacAddr_p);
463 /*
464 dwData = ether_crc(6, pbMacAddr_p);
465
466 printk("EdrvDefineRxMacAddrEntry('%02X:%02X:%02X:%02X:%02X:%02X') hash = %u / %u ether_crc = 0x%08lX\n",
467 (WORD) pbMacAddr_p[0], (WORD) pbMacAddr_p[1], (WORD) pbMacAddr_p[2],
468 (WORD) pbMacAddr_p[3], (WORD) pbMacAddr_p[4], (WORD) pbMacAddr_p[5],
469 (WORD) bHash, (WORD) (dwData >> 26), dwData);
470 */
471 if (bHash > 31) {
472 dwData = EDRV_REGDW_READ(EDRV_REGDW_MAR4);
473 dwData |= 1 << (bHash - 32);
474 EDRV_REGDW_WRITE(EDRV_REGDW_MAR4, dwData);
475 } else {
476 dwData = EDRV_REGDW_READ(EDRV_REGDW_MAR0);
477 dwData |= 1 << bHash;
478 EDRV_REGDW_WRITE(EDRV_REGDW_MAR0, dwData);
479 }
480
481 return Ret;
482 }
483
484 //---------------------------------------------------------------------------
485 //
486 // Function: EdrvUndefineRxMacAddrEntry
487 //
488 // Description: Reset a multicast entry in the Ethernet controller
489 //
490 // Parameters: pbMacAddr_p = pointer to multicast entry to reset
491 //
492 // Returns: Errorcode = kEplSuccessful
493 //
494 // State:
495 //
496 //---------------------------------------------------------------------------
497 tEplKernel EdrvUndefineRxMacAddrEntry(BYTE * pbMacAddr_p)
498 {
499 tEplKernel Ret = kEplSuccessful;
500 DWORD dwData;
501 BYTE bHash;
502
503 bHash = EdrvCalcHash(pbMacAddr_p);
504
505 if (bHash > 31) {
506 dwData = EDRV_REGDW_READ(EDRV_REGDW_MAR4);
507 dwData &= ~(1 << (bHash - 32));
508 EDRV_REGDW_WRITE(EDRV_REGDW_MAR4, dwData);
509 } else {
510 dwData = EDRV_REGDW_READ(EDRV_REGDW_MAR0);
511 dwData &= ~(1 << bHash);
512 EDRV_REGDW_WRITE(EDRV_REGDW_MAR0, dwData);
513 }
514
515 return Ret;
516 }
517
518 //---------------------------------------------------------------------------
519 //
520 // Function: EdrvAllocTxMsgBuffer
521 //
522 // Description: Register a Tx-Buffer
523 //
524 // Parameters: pBuffer_p = pointer to Buffer structure
525 //
526 // Returns: Errorcode = kEplSuccessful
527 // = kEplEdrvNoFreeBufEntry
528 //
529 // State:
530 //
531 //---------------------------------------------------------------------------
532 tEplKernel EdrvAllocTxMsgBuffer(tEdrvTxBuffer * pBuffer_p)
533 {
534 tEplKernel Ret = kEplSuccessful;
535 DWORD i;
536
537 if (pBuffer_p->m_uiMaxBufferLen > EDRV_MAX_FRAME_SIZE) {
538 Ret = kEplEdrvNoFreeBufEntry;
539 goto Exit;
540 }
541 // search a free Tx buffer with appropriate size
542 for (i = 0; i < EDRV_MAX_TX_BUFFERS; i++) {
543 if (EdrvInstance_l.m_afTxBufUsed[i] == FALSE) {
544 // free channel found
545 EdrvInstance_l.m_afTxBufUsed[i] = TRUE;
546 pBuffer_p->m_uiBufferNumber = i;
547 pBuffer_p->m_pbBuffer =
548 EdrvInstance_l.m_pbTxBuf +
549 (i * EDRV_MAX_FRAME_SIZE);
550 pBuffer_p->m_uiMaxBufferLen = EDRV_MAX_FRAME_SIZE;
551 break;
552 }
553 }
554 if (i >= EDRV_MAX_TX_BUFFERS) {
555 Ret = kEplEdrvNoFreeBufEntry;
556 goto Exit;
557 }
558
559 Exit:
560 return Ret;
561
562 }
563
564 //---------------------------------------------------------------------------
565 //
566 // Function: EdrvReleaseTxMsgBuffer
567 //
568 // Description: Register a Tx-Buffer
569 //
570 // Parameters: pBuffer_p = pointer to Buffer structure
571 //
572 // Returns: Errorcode = kEplSuccessful
573 //
574 // State:
575 //
576 //---------------------------------------------------------------------------
577 tEplKernel EdrvReleaseTxMsgBuffer(tEdrvTxBuffer * pBuffer_p)
578 {
579 unsigned int uiBufferNumber;
580
581 uiBufferNumber = pBuffer_p->m_uiBufferNumber;
582
583 if (uiBufferNumber < EDRV_MAX_TX_BUFFERS) {
584 EdrvInstance_l.m_afTxBufUsed[uiBufferNumber] = FALSE;
585 }
586
587 return kEplSuccessful;
588
589 }
590
591 //---------------------------------------------------------------------------
592 //
593 // Function: EdrvSendTxMsg
594 //
595 // Description: immediately starts the transmission of the buffer
596 //
597 // Parameters: pBuffer_p = buffer descriptor to transmit
598 //
599 // Returns: Errorcode = kEplSuccessful
600 //
601 // State:
602 //
603 //---------------------------------------------------------------------------
604 tEplKernel EdrvSendTxMsg(tEdrvTxBuffer * pBuffer_p)
605 {
606 tEplKernel Ret = kEplSuccessful;
607 unsigned int uiBufferNumber;
608 DWORD dwTemp;
609
610 uiBufferNumber = pBuffer_p->m_uiBufferNumber;
611
612 if ((uiBufferNumber >= EDRV_MAX_TX_BUFFERS)
613 || (EdrvInstance_l.m_afTxBufUsed[uiBufferNumber] == FALSE)) {
614 Ret = kEplEdrvBufNotExisting;
615 goto Exit;
616 }
617
618 if (EdrvInstance_l.m_pLastTransmittedTxBuffer != NULL) { // transmission is already active
619 Ret = kEplInvalidOperation;
620 dwTemp =
621 EDRV_REGDW_READ((EDRV_REGDW_TSD0 +
622 (EdrvInstance_l.m_uiCurTxDesc *
623 sizeof(DWORD))));
624 printk("%s InvOp TSD%u = 0x%08lX", __FUNCTION__,
625 EdrvInstance_l.m_uiCurTxDesc, dwTemp);
626 printk(" Cmd = 0x%02X\n",
627 (WORD) EDRV_REGB_READ(EDRV_REGB_COMMAND));
628 goto Exit;
629 }
630 // save pointer to buffer structure for TxHandler
631 EdrvInstance_l.m_pLastTransmittedTxBuffer = pBuffer_p;
632
633 EDRV_COUNT_SEND;
634
635 // pad with zeros if necessary, because controller does not do it
636 if (pBuffer_p->m_uiTxMsgLen < MIN_ETH_SIZE) {
637 EPL_MEMSET(pBuffer_p->m_pbBuffer + pBuffer_p->m_uiTxMsgLen, 0,
638 MIN_ETH_SIZE - pBuffer_p->m_uiTxMsgLen);
639 pBuffer_p->m_uiTxMsgLen = MIN_ETH_SIZE;
640 }
641 // set DMA address of buffer
642 EDRV_REGDW_WRITE((EDRV_REGDW_TSAD0 +
643 (EdrvInstance_l.m_uiCurTxDesc * sizeof(DWORD))),
644 (EdrvInstance_l.m_pTxBufDma +
645 (uiBufferNumber * EDRV_MAX_FRAME_SIZE)));
646 dwTemp =
647 EDRV_REGDW_READ((EDRV_REGDW_TSAD0 +
648 (EdrvInstance_l.m_uiCurTxDesc * sizeof(DWORD))));
649 // printk("%s TSAD%u = 0x%08lX", __FUNCTION__, EdrvInstance_l.m_uiCurTxDesc, dwTemp);
650
651 // start transmission
652 EDRV_REGDW_WRITE((EDRV_REGDW_TSD0 +
653 (EdrvInstance_l.m_uiCurTxDesc * sizeof(DWORD))),
654 (EDRV_REGDW_TSD_TXTH_DEF | pBuffer_p->m_uiTxMsgLen));
655 dwTemp =
656 EDRV_REGDW_READ((EDRV_REGDW_TSD0 +
657 (EdrvInstance_l.m_uiCurTxDesc * sizeof(DWORD))));
658 // printk(" TSD%u = 0x%08lX / 0x%08lX\n", EdrvInstance_l.m_uiCurTxDesc, dwTemp, (DWORD)(EDRV_REGDW_TSD_TXTH_DEF | pBuffer_p->m_uiTxMsgLen));
659
660 Exit:
661 return Ret;
662 }
663
664 #if 0
665 //---------------------------------------------------------------------------
666 //
667 // Function: EdrvTxMsgReady
668 //
669 // Description: starts copying the buffer to the ethernet controller's FIFO
670 //
671 // Parameters: pbBuffer_p - bufferdescriptor to transmit
672 //
673 // Returns: Errorcode - kEplSuccessful
674 //
675 // State:
676 //
677 //---------------------------------------------------------------------------
678 tEplKernel EdrvTxMsgReady(tEdrvTxBuffer * pBuffer_p)
679 {
680 tEplKernel Ret = kEplSuccessful;
681 unsigned int uiBufferNumber;
682
683 Exit:
684 return Ret;
685 }
686
687 //---------------------------------------------------------------------------
688 //
689 // Function: EdrvTxMsgStart
690 //
691 // Description: starts transmission of the ethernet controller's FIFO
692 //
693 // Parameters: pbBuffer_p - bufferdescriptor to transmit
694 //
695 // Returns: Errorcode - kEplSuccessful
696 //
697 // State:
698 //
699 //---------------------------------------------------------------------------
700 tEplKernel EdrvTxMsgStart(tEdrvTxBuffer * pBuffer_p)
701 {
702 tEplKernel Ret = kEplSuccessful;
703
704 return Ret;
705 }
706 #endif
707
708 //---------------------------------------------------------------------------
709 //
710 // Function: EdrvReinitRx
711 //
712 // Description: reinitialize the Rx process, because of error
713 //
714 // Parameters: void
715 //
716 // Returns: void
717 //
718 // State:
719 //
720 //---------------------------------------------------------------------------
721 static void EdrvReinitRx(void)
722 {
723 BYTE bCmd;
724
725 // simply switch off and on the receiver
726 // this will reset the CAPR register
727 bCmd = EDRV_REGB_READ(EDRV_REGB_COMMAND);
728 EDRV_REGB_WRITE(EDRV_REGB_COMMAND, (bCmd & ~EDRV_REGB_COMMAND_RE));
729 EDRV_REGB_WRITE(EDRV_REGB_COMMAND, bCmd);
730
731 // set receive configuration register
732 EDRV_REGDW_WRITE(EDRV_REGDW_RCR, EDRV_REGDW_RCR_DEF);
733 }
734
735 //---------------------------------------------------------------------------
736 //
737 // Function: EdrvInterruptHandler
738 //
739 // Description: interrupt handler
740 //
741 // Parameters: void
742 //
743 // Returns: void
744 //
745 // State:
746 //
747 //---------------------------------------------------------------------------
748 #if 0
749 void EdrvInterruptHandler(void)
750 {
751 }
752 #endif
753
754 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
755 static int TgtEthIsr(int nIrqNum_p, void *ppDevInstData_p)
756 #else
757 static int TgtEthIsr(int nIrqNum_p, void *ppDevInstData_p,
758 struct pt_regs *ptRegs_p)
759 #endif
760 {
761 // EdrvInterruptHandler();
762 tEdrvRxBuffer RxBuffer;
763 tEdrvTxBuffer *pTxBuffer;
764 WORD wStatus;
765 DWORD dwTxStatus;
766 DWORD dwRxStatus;
767 WORD wCurRx;
768 BYTE *pbRxBuf;
769 unsigned int uiLength;
770 int iHandled = IRQ_HANDLED;
771
772 // printk("¤");
773
774 // read the interrupt status
775 wStatus = EDRV_REGW_READ(EDRV_REGW_INT_STATUS);
776
777 // acknowledge the interrupts
778 EDRV_REGW_WRITE(EDRV_REGW_INT_STATUS, wStatus);
779
780 if (wStatus == 0) {
781 iHandled = IRQ_NONE;
782 goto Exit;
783 }
784 // process tasks
785 if ((wStatus & (EDRV_REGW_INT_TER | EDRV_REGW_INT_TOK)) != 0) { // transmit interrupt
786
787 if (EdrvInstance_l.m_pbTxBuf == NULL) {
788 printk("%s Tx buffers currently not allocated\n",
789 __FUNCTION__);
790 goto Exit;
791 }
792 // read transmit status
793 dwTxStatus =
794 EDRV_REGDW_READ((EDRV_REGDW_TSD0 +
795 (EdrvInstance_l.m_uiCurTxDesc *
796 sizeof(DWORD))));
797 if ((dwTxStatus & (EDRV_REGDW_TSD_TOK | EDRV_REGDW_TSD_TABT | EDRV_REGDW_TSD_TUN)) != 0) { // transmit finished
798 EdrvInstance_l.m_uiCurTxDesc =
799 (EdrvInstance_l.m_uiCurTxDesc + 1) & 0x03;
800 pTxBuffer = EdrvInstance_l.m_pLastTransmittedTxBuffer;
801 EdrvInstance_l.m_pLastTransmittedTxBuffer = NULL;
802
803 if ((dwTxStatus & EDRV_REGDW_TSD_TOK) != 0) {
804 EDRV_COUNT_TX;
805 } else if ((dwTxStatus & EDRV_REGDW_TSD_TUN) != 0) {
806 EDRV_COUNT_TX_FUN;
807 } else { // assume EDRV_REGDW_TSD_TABT
808 EDRV_COUNT_TX_COL_RL;
809 }
810
811 // printk("T");
812 if (pTxBuffer != NULL) {
813 // call Tx handler of Data link layer
814 EdrvInstance_l.m_InitParam.
815 m_pfnTxHandler(pTxBuffer);
816 }
817 } else {
818 EDRV_COUNT_TX_ERR;
819 }
820 }
821
822 if ((wStatus & (EDRV_REGW_INT_RER | EDRV_REGW_INT_FOVW | EDRV_REGW_INT_RXOVW | EDRV_REGW_INT_PUN)) != 0) { // receive error interrupt
823
824 if ((wStatus & EDRV_REGW_INT_FOVW) != 0) {
825 EDRV_COUNT_RX_FOVW;
826 } else if ((wStatus & EDRV_REGW_INT_RXOVW) != 0) {
827 EDRV_COUNT_RX_OVW;
828 } else if ((wStatus & EDRV_REGW_INT_PUN) != 0) { // Packet underrun
829 EDRV_TRACE_RX_PUN(wStatus);
830 EDRV_COUNT_RX_PUN;
831 } else { /*if ((wStatus & EDRV_REGW_INT_RER) != 0) */
832
833 EDRV_TRACE_RX_ERR(wStatus);
834 EDRV_COUNT_RX_ERR;
835 }
836
837 // reinitialize Rx process
838 EdrvReinitRx();
839 }
840
841 if ((wStatus & EDRV_REGW_INT_ROK) != 0) { // receive interrupt
842
843 if (EdrvInstance_l.m_pbRxBuf == NULL) {
844 printk("%s Rx buffers currently not allocated\n",
845 __FUNCTION__);
846 goto Exit;
847 }
848 // read current offset in receive buffer
849 wCurRx =
850 (EDRV_REGW_READ(EDRV_REGW_CAPR) +
851 0x10) % EDRV_RX_BUFFER_LENGTH;
852
853 while ((EDRV_REGB_READ(EDRV_REGB_COMMAND) & EDRV_REGB_COMMAND_BUFE) == 0) { // frame available
854
855 // calculate pointer to current frame in receive buffer
856 pbRxBuf = EdrvInstance_l.m_pbRxBuf + wCurRx;
857
858 // read receive status DWORD
859 dwRxStatus = le32_to_cpu(*((DWORD *) pbRxBuf));
860
861 // calculate length of received frame
862 uiLength = dwRxStatus >> 16;
863
864 if (uiLength == 0xFFF0) { // frame is unfinished (maybe early Rx interrupt is active)
865 break;
866 }
867
868 if ((dwRxStatus & EDRV_RXSTAT_ROK) == 0) { // error occured while receiving this frame
869 // ignore it
870 if ((dwRxStatus & EDRV_RXSTAT_FAE) != 0) {
871 EDRV_COUNT_RX_FAE;
872 } else if ((dwRxStatus & EDRV_RXSTAT_CRC) != 0) {
873 EDRV_TRACE_RX_CRC(dwRxStatus);
874 EDRV_COUNT_RX_CRC;
875 } else {
876 EDRV_TRACE_RX_ERR(dwRxStatus);
877 EDRV_COUNT_RX_ERR;
878 }
879
880 // reinitialize Rx process
881 EdrvReinitRx();
882
883 break;
884 } else { // frame is OK
885 RxBuffer.m_BufferInFrame =
886 kEdrvBufferLastInFrame;
887 RxBuffer.m_uiRxMsgLen = uiLength - ETH_CRC_SIZE;
888 RxBuffer.m_pbBuffer =
889 pbRxBuf + sizeof(dwRxStatus);
890
891 // printk("R");
892 EDRV_COUNT_RX;
893
894 // call Rx handler of Data link layer
895 EdrvInstance_l.m_InitParam.
896 m_pfnRxHandler(&RxBuffer);
897 }
898
899 // calulate new offset (DWORD aligned)
900 wCurRx =
901 (WORD) ((wCurRx + uiLength + sizeof(dwRxStatus) +
902 3) & ~0x3);
903 EDRV_TRACE_CAPR(wCurRx - 0x10);
904 EDRV_REGW_WRITE(EDRV_REGW_CAPR, wCurRx - 0x10);
905
906 // reread current offset in receive buffer
907 wCurRx =
908 (EDRV_REGW_READ(EDRV_REGW_CAPR) +
909 0x10) % EDRV_RX_BUFFER_LENGTH;
910
911 }
912 }
913
914 if ((wStatus & EDRV_REGW_INT_SERR) != 0) { // PCI error
915 EDRV_COUNT_PCI_ERR;
916 }
917
918 if ((wStatus & EDRV_REGW_INT_TIMEOUT) != 0) { // Timeout
919 EDRV_COUNT_TIMEOUT;
920 }
921
922 Exit:
923 return iHandled;
924 }
925
926 //---------------------------------------------------------------------------
927 //
928 // Function: EdrvInitOne
929 //
930 // Description: initializes one PCI device
931 //
932 // Parameters: pPciDev = pointer to corresponding PCI device structure
933 // pId = PCI device ID
934 //
935 // Returns: (int) = error code
936 //
937 // State:
938 //
939 //---------------------------------------------------------------------------
940
941 static int EdrvInitOne(struct pci_dev *pPciDev, const struct pci_device_id *pId)
942 {
943 int iResult = 0;
944 DWORD dwTemp;
945
946 if (EdrvInstance_l.m_pPciDev != NULL) { // Edrv is already connected to a PCI device
947 printk("%s device %s discarded\n", __FUNCTION__,
948 pci_name(pPciDev));
949 iResult = -ENODEV;
950 goto Exit;
951 }
952
953 if (pPciDev->revision >= 0x20) {
954 printk
955 ("%s device %s is an enhanced 8139C+ version, which is not supported\n",
956 __FUNCTION__, pci_name(pPciDev));
957 iResult = -ENODEV;
958 goto Exit;
959 }
960
961 EdrvInstance_l.m_pPciDev = pPciDev;
962
963 // enable device
964 printk("%s enable device\n", __FUNCTION__);
965 iResult = pci_enable_device(pPciDev);
966 if (iResult != 0) {
967 goto Exit;
968 }
969
970 if ((pci_resource_flags(pPciDev, 1) & IORESOURCE_MEM) == 0) {
971 iResult = -ENODEV;
972 goto Exit;
973 }
974
975 printk("%s request regions\n", __FUNCTION__);
976 iResult = pci_request_regions(pPciDev, DRV_NAME);
977 if (iResult != 0) {
978 goto Exit;
979 }
980
981 printk("%s ioremap\n", __FUNCTION__);
982 EdrvInstance_l.m_pIoAddr =
983 ioremap(pci_resource_start(pPciDev, 1),
984 pci_resource_len(pPciDev, 1));
985 if (EdrvInstance_l.m_pIoAddr == NULL) { // remap of controller's register space failed
986 iResult = -EIO;
987 goto Exit;
988 }
989 // enable PCI busmaster
990 printk("%s enable busmaster\n", __FUNCTION__);
991 pci_set_master(pPciDev);
992
993 // reset controller
994 printk("%s reset controller\n", __FUNCTION__);
995 EDRV_REGB_WRITE(EDRV_REGB_COMMAND, EDRV_REGB_COMMAND_RST);
996
997 // wait until reset has finished
998 for (iResult = 500; iResult > 0; iResult--) {
999 if ((EDRV_REGB_READ(EDRV_REGB_COMMAND) & EDRV_REGB_COMMAND_RST)
1000 == 0) {
1001 break;
1002 }
1003
1004 schedule_timeout(10);
1005 }
1006
1007 // check hardware version, i.e. chip ID
1008 dwTemp = EDRV_REGDW_READ(EDRV_REGDW_TCR);
1009 if (((dwTemp & EDRV_REGDW_TCR_VER_MASK) != EDRV_REGDW_TCR_VER_C)
1010 && ((dwTemp & EDRV_REGDW_TCR_VER_MASK) != EDRV_REGDW_TCR_VER_D)) { // unsupported chip
1011 printk("%s Unsupported chip! TCR = 0x%08lX\n", __FUNCTION__,
1012 dwTemp);
1013 iResult = -ENODEV;
1014 goto Exit;
1015 }
1016 // disable interrupts
1017 printk("%s disable interrupts\n", __FUNCTION__);
1018 EDRV_REGW_WRITE(EDRV_REGW_INT_MASK, 0);
1019 // acknowledge all pending interrupts
1020 EDRV_REGW_WRITE(EDRV_REGW_INT_STATUS,
1021 EDRV_REGW_READ(EDRV_REGW_INT_STATUS));
1022
1023 // install interrupt handler
1024 printk("%s install interrupt handler\n", __FUNCTION__);
1025 iResult =
1026 request_irq(pPciDev->irq, TgtEthIsr, IRQF_SHARED,
1027 DRV_NAME /*pPciDev->dev.name */ , pPciDev);
1028 if (iResult != 0) {
1029 goto Exit;
1030 }
1031
1032 /*
1033 // unlock configuration registers
1034 printk("%s unlock configuration registers\n", __FUNCTION__);
1035 EDRV_REGB_WRITE(EDRV_REGB_CMD9346, EDRV_REGB_CMD9346_UNLOCK);
1036
1037 // check if user specified a MAC address
1038 printk("%s check specified MAC address\n", __FUNCTION__);
1039 for (iResult = 0; iResult < 6; iResult++)
1040 {
1041 if (EdrvInstance_l.m_InitParam.m_abMyMacAddr[iResult] != 0)
1042 {
1043 printk("%s set local MAC address\n", __FUNCTION__);
1044 // write this MAC address to controller
1045 EDRV_REGDW_WRITE(EDRV_REGDW_IDR0,
1046 le32_to_cpu(*((DWORD*)&EdrvInstance_l.m_InitParam.m_abMyMacAddr[0])));
1047 dwTemp = EDRV_REGDW_READ(EDRV_REGDW_IDR0);
1048
1049 EDRV_REGDW_WRITE(EDRV_REGDW_IDR4,
1050 le32_to_cpu(*((DWORD*)&EdrvInstance_l.m_InitParam.m_abMyMacAddr[4])));
1051 dwTemp = EDRV_REGDW_READ(EDRV_REGDW_IDR4);
1052 break;
1053 }
1054 }
1055 iResult = 0;
1056
1057 // lock configuration registers
1058 EDRV_REGB_WRITE(EDRV_REGB_CMD9346, EDRV_REGB_CMD9346_LOCK);
1059 */
1060
1061 // allocate buffers
1062 printk("%s allocate buffers\n", __FUNCTION__);
1063 EdrvInstance_l.m_pbTxBuf =
1064 pci_alloc_consistent(pPciDev, EDRV_TX_BUFFER_SIZE,
1065 &EdrvInstance_l.m_pTxBufDma);
1066 if (EdrvInstance_l.m_pbTxBuf == NULL) {
1067 iResult = -ENOMEM;
1068 goto Exit;
1069 }
1070
1071 EdrvInstance_l.m_pbRxBuf =
1072 pci_alloc_consistent(pPciDev, EDRV_RX_BUFFER_SIZE,
1073 &EdrvInstance_l.m_pRxBufDma);
1074 if (EdrvInstance_l.m_pbRxBuf == NULL) {
1075 iResult = -ENOMEM;
1076 goto Exit;
1077 }
1078 // reset pointers for Tx buffers
1079 printk("%s reset pointers fo Tx buffers\n", __FUNCTION__);
1080 EDRV_REGDW_WRITE(EDRV_REGDW_TSAD0, 0);
1081 dwTemp = EDRV_REGDW_READ(EDRV_REGDW_TSAD0);
1082 EDRV_REGDW_WRITE(EDRV_REGDW_TSAD1, 0);
1083 dwTemp = EDRV_REGDW_READ(EDRV_REGDW_TSAD1);
1084 EDRV_REGDW_WRITE(EDRV_REGDW_TSAD2, 0);
1085 dwTemp = EDRV_REGDW_READ(EDRV_REGDW_TSAD2);
1086 EDRV_REGDW_WRITE(EDRV_REGDW_TSAD3, 0);
1087 dwTemp = EDRV_REGDW_READ(EDRV_REGDW_TSAD3);
1088
1089 printk(" Command = 0x%02X\n",
1090 (WORD) EDRV_REGB_READ(EDRV_REGB_COMMAND));
1091
1092 // set pointer for receive buffer in controller
1093 printk("%s set pointer to Rx buffer\n", __FUNCTION__);
1094 EDRV_REGDW_WRITE(EDRV_REGDW_RBSTART, EdrvInstance_l.m_pRxBufDma);
1095
1096 // enable transmitter and receiver
1097 printk("%s enable Tx and Rx", __FUNCTION__);
1098 EDRV_REGB_WRITE(EDRV_REGB_COMMAND,
1099 (EDRV_REGB_COMMAND_RE | EDRV_REGB_COMMAND_TE));
1100 printk(" Command = 0x%02X\n",
1101 (WORD) EDRV_REGB_READ(EDRV_REGB_COMMAND));
1102
1103 // clear missed packet counter to enable Rx/Tx process
1104 EDRV_REGDW_WRITE(EDRV_REGDW_MPC, 0);
1105
1106 // set transmit configuration register
1107 printk("%s set Tx conf register", __FUNCTION__);
1108 EDRV_REGDW_WRITE(EDRV_REGDW_TCR, EDRV_REGDW_TCR_DEF);
1109 printk(" = 0x%08X\n", EDRV_REGDW_READ(EDRV_REGDW_TCR));
1110
1111 // set receive configuration register
1112 printk("%s set Rx conf register", __FUNCTION__);
1113 EDRV_REGDW_WRITE(EDRV_REGDW_RCR, EDRV_REGDW_RCR_DEF);
1114 printk(" = 0x%08X\n", EDRV_REGDW_READ(EDRV_REGDW_RCR));
1115
1116 // reset multicast MAC address filter
1117 EDRV_REGDW_WRITE(EDRV_REGDW_MAR0, 0);
1118 dwTemp = EDRV_REGDW_READ(EDRV_REGDW_MAR0);
1119 EDRV_REGDW_WRITE(EDRV_REGDW_MAR4, 0);
1120 dwTemp = EDRV_REGDW_READ(EDRV_REGDW_MAR4);
1121
1122 /*
1123 // enable transmitter and receiver
1124 printk("%s enable Tx and Rx", __FUNCTION__);
1125 EDRV_REGB_WRITE(EDRV_REGB_COMMAND, (EDRV_REGB_COMMAND_RE | EDRV_REGB_COMMAND_TE));
1126 printk(" Command = 0x%02X\n", (WORD) EDRV_REGB_READ(EDRV_REGB_COMMAND));
1127 */
1128 // disable early interrupts
1129 EDRV_REGW_WRITE(EDRV_REGW_MULINT, 0);
1130
1131 // enable interrupts
1132 printk("%s enable interrupts\n", __FUNCTION__);
1133 EDRV_REGW_WRITE(EDRV_REGW_INT_MASK, EDRV_REGW_INT_MASK_DEF);
1134
1135 Exit:
1136 printk("%s finished with %d\n", __FUNCTION__, iResult);
1137 return iResult;
1138 }
1139
1140 //---------------------------------------------------------------------------
1141 //
1142 // Function: EdrvRemoveOne
1143 //
1144 // Description: shuts down one PCI device
1145 //
1146 // Parameters: pPciDev = pointer to corresponding PCI device structure
1147 //
1148 // Returns: (void)
1149 //
1150 // State:
1151 //
1152 //---------------------------------------------------------------------------
1153
1154 static void EdrvRemoveOne(struct pci_dev *pPciDev)
1155 {
1156
1157 if (EdrvInstance_l.m_pPciDev != pPciDev) { // trying to remove unknown device
1158 BUG_ON(EdrvInstance_l.m_pPciDev != pPciDev);
1159 goto Exit;
1160 }
1161 // disable transmitter and receiver
1162 EDRV_REGB_WRITE(EDRV_REGB_COMMAND, 0);
1163
1164 // disable interrupts
1165 EDRV_REGW_WRITE(EDRV_REGW_INT_MASK, 0);
1166
1167 // remove interrupt handler
1168 free_irq(pPciDev->irq, pPciDev);
1169
1170 // free buffers
1171 if (EdrvInstance_l.m_pbTxBuf != NULL) {
1172 pci_free_consistent(pPciDev, EDRV_TX_BUFFER_SIZE,
1173 EdrvInstance_l.m_pbTxBuf,
1174 EdrvInstance_l.m_pTxBufDma);
1175 EdrvInstance_l.m_pbTxBuf = NULL;
1176 }
1177
1178 if (EdrvInstance_l.m_pbRxBuf != NULL) {
1179 pci_free_consistent(pPciDev, EDRV_RX_BUFFER_SIZE,
1180 EdrvInstance_l.m_pbRxBuf,
1181 EdrvInstance_l.m_pRxBufDma);
1182 EdrvInstance_l.m_pbRxBuf = NULL;
1183 }
1184 // unmap controller's register space
1185 if (EdrvInstance_l.m_pIoAddr != NULL) {
1186 iounmap(EdrvInstance_l.m_pIoAddr);
1187 }
1188 // disable the PCI device
1189 pci_disable_device(pPciDev);
1190
1191 // release memory regions
1192 pci_release_regions(pPciDev);
1193
1194 EdrvInstance_l.m_pPciDev = NULL;
1195
1196 Exit:;
1197 }
1198
1199 //---------------------------------------------------------------------------
1200 //
1201 // Function: EdrvCalcHash
1202 //
1203 // Description: function calculates the entry for the hash-table from MAC
1204 // address
1205 //
1206 // Parameters: pbMAC_p - pointer to MAC address
1207 //
1208 // Returns: hash value
1209 //
1210 // State:
1211 //
1212 //---------------------------------------------------------------------------
1213 #define HASH_BITS 6 // used bits in hash
1214 #define CRC32_POLY 0x04C11DB6 //
1215 //#define CRC32_POLY 0xEDB88320 //
1216 // G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
1217
1218 static BYTE EdrvCalcHash(BYTE * pbMAC_p)
1219 {
1220 DWORD dwByteCounter;
1221 DWORD dwBitCounter;
1222 DWORD dwData;
1223 DWORD dwCrc;
1224 DWORD dwCarry;
1225 BYTE *pbData;
1226 BYTE bHash;
1227
1228 pbData = pbMAC_p;
1229
1230 // calculate crc32 value of mac address
1231 dwCrc = 0xFFFFFFFF;
1232
1233 for (dwByteCounter = 0; dwByteCounter < 6; dwByteCounter++) {
1234 dwData = *pbData;
1235 pbData++;
1236 for (dwBitCounter = 0; dwBitCounter < 8;
1237 dwBitCounter++, dwData >>= 1) {
1238 dwCarry = (((dwCrc >> 31) ^ dwData) & 1);
1239 dwCrc = dwCrc << 1;
1240 if (dwCarry != 0) {
1241 dwCrc = (dwCrc ^ CRC32_POLY) | dwCarry;
1242 }
1243 }
1244 }
1245
1246 // printk("MyCRC = 0x%08lX\n", dwCrc);
1247 // only upper 6 bits (HASH_BITS) are used
1248 // which point to specific bit in the hash registers
1249 bHash = (BYTE) ((dwCrc >> (32 - HASH_BITS)) & 0x3f);
1250
1251 return bHash;
1252 }
This page took 0.062131 seconds and 5 git commands to generate.