diff options
Diffstat (limited to 'drivers/net/gianfar.h')
-rw-r--r-- | drivers/net/gianfar.h | 436 |
1 files changed, 373 insertions, 63 deletions
diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h index 2cd94338b5d3..17d25e714236 100644 --- a/drivers/net/gianfar.h +++ b/drivers/net/gianfar.h | |||
@@ -7,8 +7,9 @@ | |||
7 | * | 7 | * |
8 | * Author: Andy Fleming | 8 | * Author: Andy Fleming |
9 | * Maintainer: Kumar Gala | 9 | * Maintainer: Kumar Gala |
10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> | ||
10 | * | 11 | * |
11 | * Copyright (c) 2002-2004 Freescale Semiconductor, Inc. | 12 | * Copyright 2002-2009 Freescale Semiconductor, Inc. |
12 | * | 13 | * |
13 | * This program is free software; you can redistribute it and/or modify it | 14 | * This program is free software; you can redistribute it and/or modify it |
14 | * under the terms of the GNU General Public License as published by the | 15 | * under the terms of the GNU General Public License as published by the |
@@ -74,6 +75,13 @@ | |||
74 | extern const char gfar_driver_name[]; | 75 | extern const char gfar_driver_name[]; |
75 | extern const char gfar_driver_version[]; | 76 | extern const char gfar_driver_version[]; |
76 | 77 | ||
78 | /* MAXIMUM NUMBER OF QUEUES SUPPORTED */ | ||
79 | #define MAX_TX_QS 0x8 | ||
80 | #define MAX_RX_QS 0x8 | ||
81 | |||
82 | /* MAXIMUM NUMBER OF GROUPS SUPPORTED */ | ||
83 | #define MAXGROUPS 0x2 | ||
84 | |||
77 | /* These need to be powers of 2 for this driver */ | 85 | /* These need to be powers of 2 for this driver */ |
78 | #define DEFAULT_TX_RING_SIZE 256 | 86 | #define DEFAULT_TX_RING_SIZE 256 |
79 | #define DEFAULT_RX_RING_SIZE 256 | 87 | #define DEFAULT_RX_RING_SIZE 256 |
@@ -171,12 +179,63 @@ extern const char gfar_driver_version[]; | |||
171 | 179 | ||
172 | #define MINFLR_INIT_SETTINGS 0x00000040 | 180 | #define MINFLR_INIT_SETTINGS 0x00000040 |
173 | 181 | ||
182 | /* Tqueue control */ | ||
183 | #define TQUEUE_EN0 0x00008000 | ||
184 | #define TQUEUE_EN1 0x00004000 | ||
185 | #define TQUEUE_EN2 0x00002000 | ||
186 | #define TQUEUE_EN3 0x00001000 | ||
187 | #define TQUEUE_EN4 0x00000800 | ||
188 | #define TQUEUE_EN5 0x00000400 | ||
189 | #define TQUEUE_EN6 0x00000200 | ||
190 | #define TQUEUE_EN7 0x00000100 | ||
191 | #define TQUEUE_EN_ALL 0x0000FF00 | ||
192 | |||
193 | #define TR03WT_WT0_MASK 0xFF000000 | ||
194 | #define TR03WT_WT1_MASK 0x00FF0000 | ||
195 | #define TR03WT_WT2_MASK 0x0000FF00 | ||
196 | #define TR03WT_WT3_MASK 0x000000FF | ||
197 | |||
198 | #define TR47WT_WT4_MASK 0xFF000000 | ||
199 | #define TR47WT_WT5_MASK 0x00FF0000 | ||
200 | #define TR47WT_WT6_MASK 0x0000FF00 | ||
201 | #define TR47WT_WT7_MASK 0x000000FF | ||
202 | |||
203 | /* Rqueue control */ | ||
204 | #define RQUEUE_EX0 0x00800000 | ||
205 | #define RQUEUE_EX1 0x00400000 | ||
206 | #define RQUEUE_EX2 0x00200000 | ||
207 | #define RQUEUE_EX3 0x00100000 | ||
208 | #define RQUEUE_EX4 0x00080000 | ||
209 | #define RQUEUE_EX5 0x00040000 | ||
210 | #define RQUEUE_EX6 0x00020000 | ||
211 | #define RQUEUE_EX7 0x00010000 | ||
212 | #define RQUEUE_EX_ALL 0x00FF0000 | ||
213 | |||
214 | #define RQUEUE_EN0 0x00000080 | ||
215 | #define RQUEUE_EN1 0x00000040 | ||
216 | #define RQUEUE_EN2 0x00000020 | ||
217 | #define RQUEUE_EN3 0x00000010 | ||
218 | #define RQUEUE_EN4 0x00000008 | ||
219 | #define RQUEUE_EN5 0x00000004 | ||
220 | #define RQUEUE_EN6 0x00000002 | ||
221 | #define RQUEUE_EN7 0x00000001 | ||
222 | #define RQUEUE_EN_ALL 0x000000FF | ||
223 | |||
174 | /* Init to do tx snooping for buffers and descriptors */ | 224 | /* Init to do tx snooping for buffers and descriptors */ |
175 | #define DMACTRL_INIT_SETTINGS 0x000000c3 | 225 | #define DMACTRL_INIT_SETTINGS 0x000000c3 |
176 | #define DMACTRL_GRS 0x00000010 | 226 | #define DMACTRL_GRS 0x00000010 |
177 | #define DMACTRL_GTS 0x00000008 | 227 | #define DMACTRL_GTS 0x00000008 |
178 | 228 | ||
179 | #define TSTAT_CLEAR_THALT 0x80000000 | 229 | #define TSTAT_CLEAR_THALT_ALL 0xFF000000 |
230 | #define TSTAT_CLEAR_THALT 0x80000000 | ||
231 | #define TSTAT_CLEAR_THALT0 0x80000000 | ||
232 | #define TSTAT_CLEAR_THALT1 0x40000000 | ||
233 | #define TSTAT_CLEAR_THALT2 0x20000000 | ||
234 | #define TSTAT_CLEAR_THALT3 0x10000000 | ||
235 | #define TSTAT_CLEAR_THALT4 0x08000000 | ||
236 | #define TSTAT_CLEAR_THALT5 0x04000000 | ||
237 | #define TSTAT_CLEAR_THALT6 0x02000000 | ||
238 | #define TSTAT_CLEAR_THALT7 0x01000000 | ||
180 | 239 | ||
181 | /* Interrupt coalescing macros */ | 240 | /* Interrupt coalescing macros */ |
182 | #define IC_ICEN 0x80000000 | 241 | #define IC_ICEN 0x80000000 |
@@ -227,6 +286,13 @@ extern const char gfar_driver_version[]; | |||
227 | #define TCTRL_IPCSEN 0x00004000 | 286 | #define TCTRL_IPCSEN 0x00004000 |
228 | #define TCTRL_TUCSEN 0x00002000 | 287 | #define TCTRL_TUCSEN 0x00002000 |
229 | #define TCTRL_VLINS 0x00001000 | 288 | #define TCTRL_VLINS 0x00001000 |
289 | #define TCTRL_THDF 0x00000800 | ||
290 | #define TCTRL_RFCPAUSE 0x00000010 | ||
291 | #define TCTRL_TFCPAUSE 0x00000008 | ||
292 | #define TCTRL_TXSCHED_MASK 0x00000006 | ||
293 | #define TCTRL_TXSCHED_INIT 0x00000000 | ||
294 | #define TCTRL_TXSCHED_PRIO 0x00000002 | ||
295 | #define TCTRL_TXSCHED_WRRS 0x00000004 | ||
230 | #define TCTRL_INIT_CSUM (TCTRL_TUCSEN | TCTRL_IPCSEN) | 296 | #define TCTRL_INIT_CSUM (TCTRL_TUCSEN | TCTRL_IPCSEN) |
231 | 297 | ||
232 | #define IEVENT_INIT_CLEAR 0xffffffff | 298 | #define IEVENT_INIT_CLEAR 0xffffffff |
@@ -267,7 +333,7 @@ extern const char gfar_driver_version[]; | |||
267 | #define IMASK_BSY 0x20000000 | 333 | #define IMASK_BSY 0x20000000 |
268 | #define IMASK_EBERR 0x10000000 | 334 | #define IMASK_EBERR 0x10000000 |
269 | #define IMASK_MSRO 0x04000000 | 335 | #define IMASK_MSRO 0x04000000 |
270 | #define IMASK_GRSC 0x02000000 | 336 | #define IMASK_GTSC 0x02000000 |
271 | #define IMASK_BABT 0x01000000 | 337 | #define IMASK_BABT 0x01000000 |
272 | #define IMASK_TXC 0x00800000 | 338 | #define IMASK_TXC 0x00800000 |
273 | #define IMASK_TXEEN 0x00400000 | 339 | #define IMASK_TXEEN 0x00400000 |
@@ -278,7 +344,7 @@ extern const char gfar_driver_version[]; | |||
278 | #define IMASK_XFUN 0x00010000 | 344 | #define IMASK_XFUN 0x00010000 |
279 | #define IMASK_RXB0 0x00008000 | 345 | #define IMASK_RXB0 0x00008000 |
280 | #define IMASK_MAG 0x00000800 | 346 | #define IMASK_MAG 0x00000800 |
281 | #define IMASK_GTSC 0x00000100 | 347 | #define IMASK_GRSC 0x00000100 |
282 | #define IMASK_RXFEN0 0x00000080 | 348 | #define IMASK_RXFEN0 0x00000080 |
283 | #define IMASK_FIR 0x00000008 | 349 | #define IMASK_FIR 0x00000008 |
284 | #define IMASK_FIQ 0x00000004 | 350 | #define IMASK_FIQ 0x00000004 |
@@ -315,6 +381,88 @@ extern const char gfar_driver_version[]; | |||
315 | #define BD_LFLAG(flags) ((flags) << 16) | 381 | #define BD_LFLAG(flags) ((flags) << 16) |
316 | #define BD_LENGTH_MASK 0x0000ffff | 382 | #define BD_LENGTH_MASK 0x0000ffff |
317 | 383 | ||
384 | #define CLASS_CODE_UNRECOG 0x00 | ||
385 | #define CLASS_CODE_DUMMY1 0x01 | ||
386 | #define CLASS_CODE_ETHERTYPE1 0x02 | ||
387 | #define CLASS_CODE_ETHERTYPE2 0x03 | ||
388 | #define CLASS_CODE_USER_PROG1 0x04 | ||
389 | #define CLASS_CODE_USER_PROG2 0x05 | ||
390 | #define CLASS_CODE_USER_PROG3 0x06 | ||
391 | #define CLASS_CODE_USER_PROG4 0x07 | ||
392 | #define CLASS_CODE_TCP_IPV4 0x08 | ||
393 | #define CLASS_CODE_UDP_IPV4 0x09 | ||
394 | #define CLASS_CODE_AH_ESP_IPV4 0x0a | ||
395 | #define CLASS_CODE_SCTP_IPV4 0x0b | ||
396 | #define CLASS_CODE_TCP_IPV6 0x0c | ||
397 | #define CLASS_CODE_UDP_IPV6 0x0d | ||
398 | #define CLASS_CODE_AH_ESP_IPV6 0x0e | ||
399 | #define CLASS_CODE_SCTP_IPV6 0x0f | ||
400 | |||
401 | #define FPR_FILER_MASK 0xFFFFFFFF | ||
402 | #define MAX_FILER_IDX 0xFF | ||
403 | |||
404 | /* This default RIR value directly corresponds | ||
405 | * to the 3-bit hash value generated */ | ||
406 | #define DEFAULT_RIR0 0x05397700 | ||
407 | |||
408 | /* RQFCR register bits */ | ||
409 | #define RQFCR_GPI 0x80000000 | ||
410 | #define RQFCR_HASHTBL_Q 0x00000000 | ||
411 | #define RQFCR_HASHTBL_0 0x00020000 | ||
412 | #define RQFCR_HASHTBL_1 0x00040000 | ||
413 | #define RQFCR_HASHTBL_2 0x00060000 | ||
414 | #define RQFCR_HASHTBL_3 0x00080000 | ||
415 | #define RQFCR_HASH 0x00010000 | ||
416 | #define RQFCR_CLE 0x00000200 | ||
417 | #define RQFCR_RJE 0x00000100 | ||
418 | #define RQFCR_AND 0x00000080 | ||
419 | #define RQFCR_CMP_EXACT 0x00000000 | ||
420 | #define RQFCR_CMP_MATCH 0x00000020 | ||
421 | #define RQFCR_CMP_NOEXACT 0x00000040 | ||
422 | #define RQFCR_CMP_NOMATCH 0x00000060 | ||
423 | |||
424 | /* RQFCR PID values */ | ||
425 | #define RQFCR_PID_MASK 0x00000000 | ||
426 | #define RQFCR_PID_PARSE 0x00000001 | ||
427 | #define RQFCR_PID_ARB 0x00000002 | ||
428 | #define RQFCR_PID_DAH 0x00000003 | ||
429 | #define RQFCR_PID_DAL 0x00000004 | ||
430 | #define RQFCR_PID_SAH 0x00000005 | ||
431 | #define RQFCR_PID_SAL 0x00000006 | ||
432 | #define RQFCR_PID_ETY 0x00000007 | ||
433 | #define RQFCR_PID_VID 0x00000008 | ||
434 | #define RQFCR_PID_PRI 0x00000009 | ||
435 | #define RQFCR_PID_TOS 0x0000000A | ||
436 | #define RQFCR_PID_L4P 0x0000000B | ||
437 | #define RQFCR_PID_DIA 0x0000000C | ||
438 | #define RQFCR_PID_SIA 0x0000000D | ||
439 | #define RQFCR_PID_DPT 0x0000000E | ||
440 | #define RQFCR_PID_SPT 0x0000000F | ||
441 | |||
442 | /* RQFPR when PID is 0x0001 */ | ||
443 | #define RQFPR_HDR_GE_512 0x00200000 | ||
444 | #define RQFPR_LERR 0x00100000 | ||
445 | #define RQFPR_RAR 0x00080000 | ||
446 | #define RQFPR_RARQ 0x00040000 | ||
447 | #define RQFPR_AR 0x00020000 | ||
448 | #define RQFPR_ARQ 0x00010000 | ||
449 | #define RQFPR_EBC 0x00008000 | ||
450 | #define RQFPR_VLN 0x00004000 | ||
451 | #define RQFPR_CFI 0x00002000 | ||
452 | #define RQFPR_JUM 0x00001000 | ||
453 | #define RQFPR_IPF 0x00000800 | ||
454 | #define RQFPR_FIF 0x00000400 | ||
455 | #define RQFPR_IPV4 0x00000200 | ||
456 | #define RQFPR_IPV6 0x00000100 | ||
457 | #define RQFPR_ICC 0x00000080 | ||
458 | #define RQFPR_ICV 0x00000040 | ||
459 | #define RQFPR_TCP 0x00000020 | ||
460 | #define RQFPR_UDP 0x00000010 | ||
461 | #define RQFPR_TUC 0x00000008 | ||
462 | #define RQFPR_TUV 0x00000004 | ||
463 | #define RQFPR_PER 0x00000002 | ||
464 | #define RQFPR_EER 0x00000001 | ||
465 | |||
318 | /* TxBD status field bits */ | 466 | /* TxBD status field bits */ |
319 | #define TXBD_READY 0x8000 | 467 | #define TXBD_READY 0x8000 |
320 | #define TXBD_PADCRC 0x4000 | 468 | #define TXBD_PADCRC 0x4000 |
@@ -418,6 +566,12 @@ struct rxfcb { | |||
418 | u16 vlctl; /* VLAN control word */ | 566 | u16 vlctl; /* VLAN control word */ |
419 | }; | 567 | }; |
420 | 568 | ||
569 | struct gianfar_skb_cb { | ||
570 | int alignamount; | ||
571 | }; | ||
572 | |||
573 | #define GFAR_CB(skb) ((struct gianfar_skb_cb *)((skb)->cb)) | ||
574 | |||
421 | struct rmon_mib | 575 | struct rmon_mib |
422 | { | 576 | { |
423 | u32 tr64; /* 0x.680 - Transmit and Receive 64-byte Frame Counter */ | 577 | u32 tr64; /* 0x.680 - Transmit and Receive 64-byte Frame Counter */ |
@@ -503,25 +657,32 @@ struct gfar_stats { | |||
503 | 657 | ||
504 | struct gfar { | 658 | struct gfar { |
505 | u32 tsec_id; /* 0x.000 - Controller ID register */ | 659 | u32 tsec_id; /* 0x.000 - Controller ID register */ |
506 | u8 res1[12]; | 660 | u32 tsec_id2; /* 0x.004 - Controller ID2 register */ |
661 | u8 res1[8]; | ||
507 | u32 ievent; /* 0x.010 - Interrupt Event Register */ | 662 | u32 ievent; /* 0x.010 - Interrupt Event Register */ |
508 | u32 imask; /* 0x.014 - Interrupt Mask Register */ | 663 | u32 imask; /* 0x.014 - Interrupt Mask Register */ |
509 | u32 edis; /* 0x.018 - Error Disabled Register */ | 664 | u32 edis; /* 0x.018 - Error Disabled Register */ |
510 | u8 res2[4]; | 665 | u32 emapg; /* 0x.01c - Group Error mapping register */ |
511 | u32 ecntrl; /* 0x.020 - Ethernet Control Register */ | 666 | u32 ecntrl; /* 0x.020 - Ethernet Control Register */ |
512 | u32 minflr; /* 0x.024 - Minimum Frame Length Register */ | 667 | u32 minflr; /* 0x.024 - Minimum Frame Length Register */ |
513 | u32 ptv; /* 0x.028 - Pause Time Value Register */ | 668 | u32 ptv; /* 0x.028 - Pause Time Value Register */ |
514 | u32 dmactrl; /* 0x.02c - DMA Control Register */ | 669 | u32 dmactrl; /* 0x.02c - DMA Control Register */ |
515 | u32 tbipa; /* 0x.030 - TBI PHY Address Register */ | 670 | u32 tbipa; /* 0x.030 - TBI PHY Address Register */ |
516 | u8 res3[88]; | 671 | u8 res2[28]; |
672 | u32 fifo_rx_pause; /* 0x.050 - FIFO receive pause start threshold | ||
673 | register */ | ||
674 | u32 fifo_rx_pause_shutoff; /* x.054 - FIFO receive starve shutoff | ||
675 | register */ | ||
676 | u32 fifo_rx_alarm; /* 0x.058 - FIFO receive alarm start threshold | ||
677 | register */ | ||
678 | u32 fifo_rx_alarm_shutoff; /*0x.05c - FIFO receive alarm starve | ||
679 | shutoff register */ | ||
680 | u8 res3[44]; | ||
517 | u32 fifo_tx_thr; /* 0x.08c - FIFO transmit threshold register */ | 681 | u32 fifo_tx_thr; /* 0x.08c - FIFO transmit threshold register */ |
518 | u8 res4[8]; | 682 | u8 res4[8]; |
519 | u32 fifo_tx_starve; /* 0x.098 - FIFO transmit starve register */ | 683 | u32 fifo_tx_starve; /* 0x.098 - FIFO transmit starve register */ |
520 | u32 fifo_tx_starve_shutoff; /* 0x.09c - FIFO transmit starve shutoff register */ | 684 | u32 fifo_tx_starve_shutoff; /* 0x.09c - FIFO transmit starve shutoff register */ |
521 | u8 res5[4]; | 685 | u8 res5[96]; |
522 | u32 fifo_rx_pause; /* 0x.0a4 - FIFO receive pause threshold register */ | ||
523 | u32 fifo_rx_alarm; /* 0x.0a8 - FIFO receive alarm threshold register */ | ||
524 | u8 res6[84]; | ||
525 | u32 tctrl; /* 0x.100 - Transmit Control Register */ | 686 | u32 tctrl; /* 0x.100 - Transmit Control Register */ |
526 | u32 tstat; /* 0x.104 - Transmit Status Register */ | 687 | u32 tstat; /* 0x.104 - Transmit Status Register */ |
527 | u32 dfvlan; /* 0x.108 - Default VLAN Control word */ | 688 | u32 dfvlan; /* 0x.108 - Default VLAN Control word */ |
@@ -572,7 +733,11 @@ struct gfar { | |||
572 | u8 res12[8]; | 733 | u8 res12[8]; |
573 | u32 rxic; /* 0x.310 - Receive Interrupt Coalescing Configuration Register */ | 734 | u32 rxic; /* 0x.310 - Receive Interrupt Coalescing Configuration Register */ |
574 | u32 rqueue; /* 0x.314 - Receive queue control register */ | 735 | u32 rqueue; /* 0x.314 - Receive queue control register */ |
575 | u8 res13[24]; | 736 | u32 rir0; /* 0x.318 - Ring mapping register 0 */ |
737 | u32 rir1; /* 0x.31c - Ring mapping register 1 */ | ||
738 | u32 rir2; /* 0x.320 - Ring mapping register 2 */ | ||
739 | u32 rir3; /* 0x.324 - Ring mapping register 3 */ | ||
740 | u8 res13[8]; | ||
576 | u32 rbifx; /* 0x.330 - Receive bit field extract control register */ | 741 | u32 rbifx; /* 0x.330 - Receive bit field extract control register */ |
577 | u32 rqfar; /* 0x.334 - Receive queue filing table address register */ | 742 | u32 rqfar; /* 0x.334 - Receive queue filing table address register */ |
578 | u32 rqfcr; /* 0x.338 - Receive queue filing table control register */ | 743 | u32 rqfcr; /* 0x.338 - Receive queue filing table control register */ |
@@ -621,7 +786,7 @@ struct gfar { | |||
621 | u32 maxfrm; /* 0x.510 - Maximum Frame Length Register */ | 786 | u32 maxfrm; /* 0x.510 - Maximum Frame Length Register */ |
622 | u8 res18[12]; | 787 | u8 res18[12]; |
623 | u8 gfar_mii_regs[24]; /* See gianfar_phy.h */ | 788 | u8 gfar_mii_regs[24]; /* See gianfar_phy.h */ |
624 | u8 res19[4]; | 789 | u32 ifctrl; /* 0x.538 - Interface control register */ |
625 | u32 ifstat; /* 0x.53c - Interface Status Register */ | 790 | u32 ifstat; /* 0x.53c - Interface Status Register */ |
626 | u32 macstnaddr1; /* 0x.540 - Station Address Part 1 Register */ | 791 | u32 macstnaddr1; /* 0x.540 - Station Address Part 1 Register */ |
627 | u32 macstnaddr2; /* 0x.544 - Station Address Part 2 Register */ | 792 | u32 macstnaddr2; /* 0x.544 - Station Address Part 2 Register */ |
@@ -682,8 +847,30 @@ struct gfar { | |||
682 | u8 res23c[248]; | 847 | u8 res23c[248]; |
683 | u32 attr; /* 0x.bf8 - Attributes Register */ | 848 | u32 attr; /* 0x.bf8 - Attributes Register */ |
684 | u32 attreli; /* 0x.bfc - Attributes Extract Length and Extract Index Register */ | 849 | u32 attreli; /* 0x.bfc - Attributes Extract Length and Extract Index Register */ |
685 | u8 res24[1024]; | 850 | u8 res24[688]; |
686 | 851 | u32 isrg0; /* 0x.eb0 - Interrupt steering group 0 register */ | |
852 | u32 isrg1; /* 0x.eb4 - Interrupt steering group 1 register */ | ||
853 | u32 isrg2; /* 0x.eb8 - Interrupt steering group 2 register */ | ||
854 | u32 isrg3; /* 0x.ebc - Interrupt steering group 3 register */ | ||
855 | u8 res25[16]; | ||
856 | u32 rxic0; /* 0x.ed0 - Ring 0 Rx interrupt coalescing */ | ||
857 | u32 rxic1; /* 0x.ed4 - Ring 1 Rx interrupt coalescing */ | ||
858 | u32 rxic2; /* 0x.ed8 - Ring 2 Rx interrupt coalescing */ | ||
859 | u32 rxic3; /* 0x.edc - Ring 3 Rx interrupt coalescing */ | ||
860 | u32 rxic4; /* 0x.ee0 - Ring 4 Rx interrupt coalescing */ | ||
861 | u32 rxic5; /* 0x.ee4 - Ring 5 Rx interrupt coalescing */ | ||
862 | u32 rxic6; /* 0x.ee8 - Ring 6 Rx interrupt coalescing */ | ||
863 | u32 rxic7; /* 0x.eec - Ring 7 Rx interrupt coalescing */ | ||
864 | u8 res26[32]; | ||
865 | u32 txic0; /* 0x.f10 - Ring 0 Tx interrupt coalescing */ | ||
866 | u32 txic1; /* 0x.f14 - Ring 1 Tx interrupt coalescing */ | ||
867 | u32 txic2; /* 0x.f18 - Ring 2 Tx interrupt coalescing */ | ||
868 | u32 txic3; /* 0x.f1c - Ring 3 Tx interrupt coalescing */ | ||
869 | u32 txic4; /* 0x.f20 - Ring 4 Tx interrupt coalescing */ | ||
870 | u32 txic5; /* 0x.f24 - Ring 5 Tx interrupt coalescing */ | ||
871 | u32 txic6; /* 0x.f28 - Ring 6 Tx interrupt coalescing */ | ||
872 | u32 txic7; /* 0x.f2c - Ring 7 Tx interrupt coalescing */ | ||
873 | u8 res27[208]; | ||
687 | }; | 874 | }; |
688 | 875 | ||
689 | /* Flags related to gianfar device features */ | 876 | /* Flags related to gianfar device features */ |
@@ -699,6 +886,143 @@ struct gfar { | |||
699 | #define FSL_GIANFAR_DEV_HAS_BD_STASHING 0x00000200 | 886 | #define FSL_GIANFAR_DEV_HAS_BD_STASHING 0x00000200 |
700 | #define FSL_GIANFAR_DEV_HAS_BUF_STASHING 0x00000400 | 887 | #define FSL_GIANFAR_DEV_HAS_BUF_STASHING 0x00000400 |
701 | 888 | ||
889 | #if (MAXGROUPS == 2) | ||
890 | #define DEFAULT_MAPPING 0xAA | ||
891 | #else | ||
892 | #define DEFAULT_MAPPING 0xFF | ||
893 | #endif | ||
894 | |||
895 | #define ISRG_SHIFT_TX 0x10 | ||
896 | #define ISRG_SHIFT_RX 0x18 | ||
897 | |||
898 | /* The same driver can operate in two modes */ | ||
899 | /* SQ_SG_MODE: Single Queue Single Group Mode | ||
900 | * (Backward compatible mode) | ||
901 | * MQ_MG_MODE: Multi Queue Multi Group mode | ||
902 | */ | ||
903 | enum { | ||
904 | SQ_SG_MODE = 0, | ||
905 | MQ_MG_MODE | ||
906 | }; | ||
907 | |||
908 | /** | ||
909 | * struct gfar_priv_tx_q - per tx queue structure | ||
910 | * @txlock: per queue tx spin lock | ||
911 | * @tx_skbuff:skb pointers | ||
912 | * @skb_curtx: to be used skb pointer | ||
913 | * @skb_dirtytx:the last used skb pointer | ||
914 | * @qindex: index of this queue | ||
915 | * @dev: back pointer to the dev structure | ||
916 | * @grp: back pointer to the group to which this queue belongs | ||
917 | * @tx_bd_base: First tx buffer descriptor | ||
918 | * @cur_tx: Next free ring entry | ||
919 | * @dirty_tx: First buffer in line to be transmitted | ||
920 | * @tx_ring_size: Tx ring size | ||
921 | * @num_txbdfree: number of free TxBds | ||
922 | * @txcoalescing: enable/disable tx coalescing | ||
923 | * @txic: transmit interrupt coalescing value | ||
924 | * @txcount: coalescing value if based on tx frame count | ||
925 | * @txtime: coalescing value if based on time | ||
926 | */ | ||
927 | struct gfar_priv_tx_q { | ||
928 | spinlock_t txlock __attribute__ ((aligned (SMP_CACHE_BYTES))); | ||
929 | struct sk_buff ** tx_skbuff; | ||
930 | /* Buffer descriptor pointers */ | ||
931 | dma_addr_t tx_bd_dma_base; | ||
932 | struct txbd8 *tx_bd_base; | ||
933 | struct txbd8 *cur_tx; | ||
934 | struct txbd8 *dirty_tx; | ||
935 | struct net_device *dev; | ||
936 | struct gfar_priv_grp *grp; | ||
937 | u16 skb_curtx; | ||
938 | u16 skb_dirtytx; | ||
939 | u16 qindex; | ||
940 | unsigned int tx_ring_size; | ||
941 | unsigned int num_txbdfree; | ||
942 | /* Configuration info for the coalescing features */ | ||
943 | unsigned char txcoalescing; | ||
944 | unsigned long txic; | ||
945 | unsigned short txcount; | ||
946 | unsigned short txtime; | ||
947 | }; | ||
948 | |||
949 | /* | ||
950 | * Per RX queue stats | ||
951 | */ | ||
952 | struct rx_q_stats { | ||
953 | unsigned long rx_packets; | ||
954 | unsigned long rx_bytes; | ||
955 | unsigned long rx_dropped; | ||
956 | }; | ||
957 | |||
958 | /** | ||
959 | * struct gfar_priv_rx_q - per rx queue structure | ||
960 | * @rxlock: per queue rx spin lock | ||
961 | * @rx_skbuff: skb pointers | ||
962 | * @skb_currx: currently use skb pointer | ||
963 | * @rx_bd_base: First rx buffer descriptor | ||
964 | * @cur_rx: Next free rx ring entry | ||
965 | * @qindex: index of this queue | ||
966 | * @dev: back pointer to the dev structure | ||
967 | * @rx_ring_size: Rx ring size | ||
968 | * @rxcoalescing: enable/disable rx-coalescing | ||
969 | * @rxic: receive interrupt coalescing vlaue | ||
970 | */ | ||
971 | |||
972 | struct gfar_priv_rx_q { | ||
973 | spinlock_t rxlock __attribute__ ((aligned (SMP_CACHE_BYTES))); | ||
974 | struct sk_buff ** rx_skbuff; | ||
975 | dma_addr_t rx_bd_dma_base; | ||
976 | struct rxbd8 *rx_bd_base; | ||
977 | struct rxbd8 *cur_rx; | ||
978 | struct net_device *dev; | ||
979 | struct gfar_priv_grp *grp; | ||
980 | struct rx_q_stats stats; | ||
981 | u16 skb_currx; | ||
982 | u16 qindex; | ||
983 | unsigned int rx_ring_size; | ||
984 | /* RX Coalescing values */ | ||
985 | unsigned char rxcoalescing; | ||
986 | unsigned long rxic; | ||
987 | }; | ||
988 | |||
989 | /** | ||
990 | * struct gfar_priv_grp - per group structure | ||
991 | * @napi: the napi poll function | ||
992 | * @priv: back pointer to the priv structure | ||
993 | * @regs: the ioremapped register space for this group | ||
994 | * @grp_id: group id for this group | ||
995 | * @interruptTransmit: The TX interrupt number for this group | ||
996 | * @interruptReceive: The RX interrupt number for this group | ||
997 | * @interruptError: The ERROR interrupt number for this group | ||
998 | * @int_name_tx: tx interrupt name for this group | ||
999 | * @int_name_rx: rx interrupt name for this group | ||
1000 | * @int_name_er: er interrupt name for this group | ||
1001 | */ | ||
1002 | |||
1003 | struct gfar_priv_grp { | ||
1004 | spinlock_t grplock __attribute__ ((aligned (SMP_CACHE_BYTES))); | ||
1005 | struct napi_struct napi; | ||
1006 | struct gfar_private *priv; | ||
1007 | struct gfar __iomem *regs; | ||
1008 | unsigned int grp_id; | ||
1009 | unsigned long rx_bit_map; | ||
1010 | unsigned long tx_bit_map; | ||
1011 | unsigned long num_tx_queues; | ||
1012 | unsigned long num_rx_queues; | ||
1013 | unsigned int rstat; | ||
1014 | unsigned int tstat; | ||
1015 | unsigned int imask; | ||
1016 | unsigned int ievent; | ||
1017 | unsigned int interruptTransmit; | ||
1018 | unsigned int interruptReceive; | ||
1019 | unsigned int interruptError; | ||
1020 | |||
1021 | char int_name_tx[GFAR_INT_NAME_MAX]; | ||
1022 | char int_name_rx[GFAR_INT_NAME_MAX]; | ||
1023 | char int_name_er[GFAR_INT_NAME_MAX]; | ||
1024 | }; | ||
1025 | |||
702 | /* Struct stolen almost completely (and shamelessly) from the FCC enet source | 1026 | /* Struct stolen almost completely (and shamelessly) from the FCC enet source |
703 | * (Ok, that's not so true anymore, but there is a family resemblence) | 1027 | * (Ok, that's not so true anymore, but there is a family resemblence) |
704 | * The GFAR buffer descriptors track the ring buffers. The rx_bd_base | 1028 | * The GFAR buffer descriptors track the ring buffers. The rx_bd_base |
@@ -709,62 +1033,36 @@ struct gfar { | |||
709 | * the buffer descriptor determines the actual condition. | 1033 | * the buffer descriptor determines the actual condition. |
710 | */ | 1034 | */ |
711 | struct gfar_private { | 1035 | struct gfar_private { |
712 | /* Fields controlled by TX lock */ | ||
713 | spinlock_t txlock; | ||
714 | 1036 | ||
715 | /* Pointer to the array of skbuffs */ | 1037 | /* Indicates how many tx, rx queues are enabled */ |
716 | struct sk_buff ** tx_skbuff; | 1038 | unsigned int num_tx_queues; |
1039 | unsigned int num_rx_queues; | ||
1040 | unsigned int num_grps; | ||
1041 | unsigned int mode; | ||
717 | 1042 | ||
718 | /* next free skb in the array */ | 1043 | /* The total tx and rx ring size for the enabled queues */ |
719 | u16 skb_curtx; | 1044 | unsigned int total_tx_ring_size; |
720 | 1045 | unsigned int total_rx_ring_size; | |
721 | /* First skb in line to be transmitted */ | ||
722 | u16 skb_dirtytx; | ||
723 | |||
724 | /* Configuration info for the coalescing features */ | ||
725 | unsigned char txcoalescing; | ||
726 | unsigned long txic; | ||
727 | |||
728 | /* Buffer descriptor pointers */ | ||
729 | struct txbd8 *tx_bd_base; /* First tx buffer descriptor */ | ||
730 | struct txbd8 *cur_tx; /* Next free ring entry */ | ||
731 | struct txbd8 *dirty_tx; /* First buffer in line | ||
732 | to be transmitted */ | ||
733 | unsigned int tx_ring_size; | ||
734 | unsigned int num_txbdfree; /* number of TxBDs free */ | ||
735 | |||
736 | /* RX Locked fields */ | ||
737 | spinlock_t rxlock; | ||
738 | 1046 | ||
739 | struct device_node *node; | 1047 | struct device_node *node; |
740 | struct net_device *ndev; | 1048 | struct net_device *ndev; |
741 | struct of_device *ofdev; | 1049 | struct of_device *ofdev; |
742 | struct napi_struct napi; | ||
743 | 1050 | ||
744 | /* skb array and index */ | 1051 | struct gfar_priv_grp gfargrp[MAXGROUPS]; |
745 | struct sk_buff ** rx_skbuff; | 1052 | struct gfar_priv_tx_q *tx_queue[MAX_TX_QS]; |
746 | u16 skb_currx; | 1053 | struct gfar_priv_rx_q *rx_queue[MAX_RX_QS]; |
747 | 1054 | ||
748 | /* RX Coalescing values */ | 1055 | /* RX per device parameters */ |
749 | unsigned char rxcoalescing; | ||
750 | unsigned long rxic; | ||
751 | |||
752 | struct rxbd8 *rx_bd_base; /* First Rx buffers */ | ||
753 | struct rxbd8 *cur_rx; /* Next free rx ring entry */ | ||
754 | |||
755 | /* RX parameters */ | ||
756 | unsigned int rx_ring_size; | ||
757 | unsigned int rx_buffer_size; | 1056 | unsigned int rx_buffer_size; |
758 | unsigned int rx_stash_size; | 1057 | unsigned int rx_stash_size; |
759 | unsigned int rx_stash_index; | 1058 | unsigned int rx_stash_index; |
760 | 1059 | ||
1060 | u32 cur_filer_idx; | ||
1061 | |||
761 | struct sk_buff_head rx_recycle; | 1062 | struct sk_buff_head rx_recycle; |
762 | 1063 | ||
763 | struct vlan_group *vlgrp; | 1064 | struct vlan_group *vlgrp; |
764 | 1065 | ||
765 | /* Unprotected fields */ | ||
766 | /* Pointer to the GFAR memory mapped Registers */ | ||
767 | struct gfar __iomem *regs; | ||
768 | 1066 | ||
769 | /* Hash registers and their width */ | 1067 | /* Hash registers and their width */ |
770 | u32 __iomem *hash_regs[16]; | 1068 | u32 __iomem *hash_regs[16]; |
@@ -785,13 +1083,10 @@ struct gfar_private { | |||
785 | unsigned char rx_csum_enable:1, | 1083 | unsigned char rx_csum_enable:1, |
786 | extended_hash:1, | 1084 | extended_hash:1, |
787 | bd_stash_en:1, | 1085 | bd_stash_en:1, |
1086 | rx_filer_enable:1, | ||
788 | wol_en:1; /* Wake-on-LAN enabled */ | 1087 | wol_en:1; /* Wake-on-LAN enabled */ |
789 | unsigned short padding; | 1088 | unsigned short padding; |
790 | 1089 | ||
791 | unsigned int interruptTransmit; | ||
792 | unsigned int interruptReceive; | ||
793 | unsigned int interruptError; | ||
794 | |||
795 | /* PHY stuff */ | 1090 | /* PHY stuff */ |
796 | struct phy_device *phydev; | 1091 | struct phy_device *phydev; |
797 | struct mii_bus *mii_bus; | 1092 | struct mii_bus *mii_bus; |
@@ -803,14 +1098,13 @@ struct gfar_private { | |||
803 | 1098 | ||
804 | struct work_struct reset_task; | 1099 | struct work_struct reset_task; |
805 | 1100 | ||
806 | char int_name_tx[GFAR_INT_NAME_MAX]; | ||
807 | char int_name_rx[GFAR_INT_NAME_MAX]; | ||
808 | char int_name_er[GFAR_INT_NAME_MAX]; | ||
809 | |||
810 | /* Network Statistics */ | 1101 | /* Network Statistics */ |
811 | struct gfar_extra_stats extra_stats; | 1102 | struct gfar_extra_stats extra_stats; |
812 | }; | 1103 | }; |
813 | 1104 | ||
1105 | extern unsigned int ftp_rqfpr[MAX_FILER_IDX + 1]; | ||
1106 | extern unsigned int ftp_rqfcr[MAX_FILER_IDX + 1]; | ||
1107 | |||
814 | static inline u32 gfar_read(volatile unsigned __iomem *addr) | 1108 | static inline u32 gfar_read(volatile unsigned __iomem *addr) |
815 | { | 1109 | { |
816 | u32 val; | 1110 | u32 val; |
@@ -823,12 +1117,28 @@ static inline void gfar_write(volatile unsigned __iomem *addr, u32 val) | |||
823 | out_be32(addr, val); | 1117 | out_be32(addr, val); |
824 | } | 1118 | } |
825 | 1119 | ||
1120 | static inline void gfar_write_filer(struct gfar_private *priv, | ||
1121 | unsigned int far, unsigned int fcr, unsigned int fpr) | ||
1122 | { | ||
1123 | struct gfar __iomem *regs = priv->gfargrp[0].regs; | ||
1124 | |||
1125 | gfar_write(®s->rqfar, far); | ||
1126 | gfar_write(®s->rqfcr, fcr); | ||
1127 | gfar_write(®s->rqfpr, fpr); | ||
1128 | } | ||
1129 | |||
1130 | extern void lock_rx_qs(struct gfar_private *priv); | ||
1131 | extern void lock_tx_qs(struct gfar_private *priv); | ||
1132 | extern void unlock_rx_qs(struct gfar_private *priv); | ||
1133 | extern void unlock_tx_qs(struct gfar_private *priv); | ||
826 | extern irqreturn_t gfar_receive(int irq, void *dev_id); | 1134 | extern irqreturn_t gfar_receive(int irq, void *dev_id); |
827 | extern int startup_gfar(struct net_device *dev); | 1135 | extern int startup_gfar(struct net_device *dev); |
828 | extern void stop_gfar(struct net_device *dev); | 1136 | extern void stop_gfar(struct net_device *dev); |
829 | extern void gfar_halt(struct net_device *dev); | 1137 | extern void gfar_halt(struct net_device *dev); |
830 | extern void gfar_phy_test(struct mii_bus *bus, struct phy_device *phydev, | 1138 | extern void gfar_phy_test(struct mii_bus *bus, struct phy_device *phydev, |
831 | int enable, u32 regnum, u32 read); | 1139 | int enable, u32 regnum, u32 read); |
1140 | extern void gfar_configure_coalescing(struct gfar_private *priv, | ||
1141 | unsigned long tx_mask, unsigned long rx_mask); | ||
832 | void gfar_init_sysfs(struct net_device *dev); | 1142 | void gfar_init_sysfs(struct net_device *dev); |
833 | 1143 | ||
834 | extern const struct ethtool_ops gfar_ethtool_ops; | 1144 | extern const struct ethtool_ops gfar_ethtool_ops; |