1ec21e2ecSJeff Kirsher /* 23396c782SPaul Gortmaker * drivers/net/ethernet/freescale/gianfar.h 3ec21e2ecSJeff Kirsher * 4ec21e2ecSJeff Kirsher * Gianfar Ethernet Driver 5ec21e2ecSJeff Kirsher * Driver for FEC on MPC8540 and TSEC on MPC8540/MPC8560 6ec21e2ecSJeff Kirsher * Based on 8260_io/fcc_enet.c 7ec21e2ecSJeff Kirsher * 8ec21e2ecSJeff Kirsher * Author: Andy Fleming 9ec21e2ecSJeff Kirsher * Maintainer: Kumar Gala 10ec21e2ecSJeff Kirsher * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> 11ec21e2ecSJeff Kirsher * 1220862788SClaudiu Manoil * Copyright 2002-2009, 2011-2013 Freescale Semiconductor, Inc. 13ec21e2ecSJeff Kirsher * 14ec21e2ecSJeff Kirsher * This program is free software; you can redistribute it and/or modify it 15ec21e2ecSJeff Kirsher * under the terms of the GNU General Public License as published by the 16ec21e2ecSJeff Kirsher * Free Software Foundation; either version 2 of the License, or (at your 17ec21e2ecSJeff Kirsher * option) any later version. 18ec21e2ecSJeff Kirsher * 19ec21e2ecSJeff Kirsher * Still left to do: 20ec21e2ecSJeff Kirsher * -Add support for module parameters 21ec21e2ecSJeff Kirsher * -Add patch for ethtool phys id 22ec21e2ecSJeff Kirsher */ 23ec21e2ecSJeff Kirsher #ifndef __GIANFAR_H 24ec21e2ecSJeff Kirsher #define __GIANFAR_H 25ec21e2ecSJeff Kirsher 26ec21e2ecSJeff Kirsher #include <linux/kernel.h> 27ec21e2ecSJeff Kirsher #include <linux/sched.h> 28ec21e2ecSJeff Kirsher #include <linux/string.h> 29ec21e2ecSJeff Kirsher #include <linux/errno.h> 30ec21e2ecSJeff Kirsher #include <linux/slab.h> 31ec21e2ecSJeff Kirsher #include <linux/interrupt.h> 32ec21e2ecSJeff Kirsher #include <linux/delay.h> 33ec21e2ecSJeff Kirsher #include <linux/netdevice.h> 34ec21e2ecSJeff Kirsher #include <linux/etherdevice.h> 35ec21e2ecSJeff Kirsher #include <linux/skbuff.h> 36ec21e2ecSJeff Kirsher #include <linux/spinlock.h> 37ec21e2ecSJeff Kirsher #include <linux/mm.h> 38ec21e2ecSJeff Kirsher #include <linux/mii.h> 39ec21e2ecSJeff Kirsher #include <linux/phy.h> 40ec21e2ecSJeff Kirsher 41ec21e2ecSJeff Kirsher #include <asm/io.h> 42ec21e2ecSJeff Kirsher #include <asm/irq.h> 43ec21e2ecSJeff Kirsher #include <asm/uaccess.h> 44ec21e2ecSJeff Kirsher #include <linux/module.h> 45ec21e2ecSJeff Kirsher #include <linux/crc32.h> 46ec21e2ecSJeff Kirsher #include <linux/workqueue.h> 47ec21e2ecSJeff Kirsher #include <linux/ethtool.h> 48ec21e2ecSJeff Kirsher 49ec21e2ecSJeff Kirsher struct ethtool_flow_spec_container { 50ec21e2ecSJeff Kirsher struct ethtool_rx_flow_spec fs; 51ec21e2ecSJeff Kirsher struct list_head list; 52ec21e2ecSJeff Kirsher }; 53ec21e2ecSJeff Kirsher 54ec21e2ecSJeff Kirsher struct ethtool_rx_list { 55ec21e2ecSJeff Kirsher struct list_head list; 56ec21e2ecSJeff Kirsher unsigned int count; 57ec21e2ecSJeff Kirsher }; 58ec21e2ecSJeff Kirsher 59ec21e2ecSJeff Kirsher /* The maximum number of packets to be handled in one call of gfar_poll */ 60ec21e2ecSJeff Kirsher #define GFAR_DEV_WEIGHT 64 61ec21e2ecSJeff Kirsher 62ec21e2ecSJeff Kirsher /* Length for FCB */ 63ec21e2ecSJeff Kirsher #define GMAC_FCB_LEN 8 64ec21e2ecSJeff Kirsher 659c4886e5SManfred Rudigier /* Length for TxPAL */ 669c4886e5SManfred Rudigier #define GMAC_TXPAL_LEN 16 679c4886e5SManfred Rudigier 68ec21e2ecSJeff Kirsher /* Default padding amount */ 69ec21e2ecSJeff Kirsher #define DEFAULT_PADDING 2 70ec21e2ecSJeff Kirsher 71ec21e2ecSJeff Kirsher /* Number of bytes to align the rx bufs to */ 72ec21e2ecSJeff Kirsher #define RXBUF_ALIGNMENT 64 73ec21e2ecSJeff Kirsher 74ec21e2ecSJeff Kirsher #define PHY_INIT_TIMEOUT 100000 75ec21e2ecSJeff Kirsher 76ec21e2ecSJeff Kirsher #define DRV_NAME "gfar-enet" 77ec21e2ecSJeff Kirsher extern const char gfar_driver_version[]; 78ec21e2ecSJeff Kirsher 79ec21e2ecSJeff Kirsher /* MAXIMUM NUMBER OF QUEUES SUPPORTED */ 80ec21e2ecSJeff Kirsher #define MAX_TX_QS 0x8 81ec21e2ecSJeff Kirsher #define MAX_RX_QS 0x8 82ec21e2ecSJeff Kirsher 83ec21e2ecSJeff Kirsher /* MAXIMUM NUMBER OF GROUPS SUPPORTED */ 84ec21e2ecSJeff Kirsher #define MAXGROUPS 0x2 85ec21e2ecSJeff Kirsher 86ec21e2ecSJeff Kirsher /* These need to be powers of 2 for this driver */ 87ec21e2ecSJeff Kirsher #define DEFAULT_TX_RING_SIZE 256 88ec21e2ecSJeff Kirsher #define DEFAULT_RX_RING_SIZE 256 89ec21e2ecSJeff Kirsher 9076f31e8bSClaudiu Manoil #define GFAR_RX_BUFF_ALLOC 16 9176f31e8bSClaudiu Manoil 92ec21e2ecSJeff Kirsher #define GFAR_RX_MAX_RING_SIZE 256 93ec21e2ecSJeff Kirsher #define GFAR_TX_MAX_RING_SIZE 256 94ec21e2ecSJeff Kirsher 95ec21e2ecSJeff Kirsher #define GFAR_MAX_FIFO_THRESHOLD 511 96ec21e2ecSJeff Kirsher #define GFAR_MAX_FIFO_STARVE 511 97ec21e2ecSJeff Kirsher #define GFAR_MAX_FIFO_STARVE_OFF 511 98ec21e2ecSJeff Kirsher 9945b679c9SMatei Pavaluca #define FBTHR_SHIFT 24 10045b679c9SMatei Pavaluca #define DEFAULT_RX_LFC_THR 16 10145b679c9SMatei Pavaluca #define DEFAULT_LFC_PTVVAL 4 10245b679c9SMatei Pavaluca 10375354148SClaudiu Manoil #define GFAR_RXB_SIZE 1536 10475354148SClaudiu Manoil #define GFAR_SKBFRAG_SIZE (RXBUF_ALIGNMENT + GFAR_RXB_SIZE \ 10575354148SClaudiu Manoil + SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) 10675354148SClaudiu Manoil #define GFAR_RXB_TRUESIZE 2048 10775354148SClaudiu Manoil 108ec21e2ecSJeff Kirsher #define TX_RING_MOD_MASK(size) (size-1) 109ec21e2ecSJeff Kirsher #define RX_RING_MOD_MASK(size) (size-1) 11075354148SClaudiu Manoil #define GFAR_JUMBO_FRAME_SIZE 9600 111ec21e2ecSJeff Kirsher 112ec21e2ecSJeff Kirsher #define DEFAULT_FIFO_TX_THR 0x100 113ec21e2ecSJeff Kirsher #define DEFAULT_FIFO_TX_STARVE 0x40 114ec21e2ecSJeff Kirsher #define DEFAULT_FIFO_TX_STARVE_OFF 0x80 115ec21e2ecSJeff Kirsher #define DEFAULT_BD_STASH 1 116ec21e2ecSJeff Kirsher #define DEFAULT_STASH_LENGTH 96 117ec21e2ecSJeff Kirsher #define DEFAULT_STASH_INDEX 0 118ec21e2ecSJeff Kirsher 119ec21e2ecSJeff Kirsher /* The number of Exact Match registers */ 120ec21e2ecSJeff Kirsher #define GFAR_EM_NUM 15 121ec21e2ecSJeff Kirsher 122ec21e2ecSJeff Kirsher /* Latency of interface clock in nanoseconds */ 123ec21e2ecSJeff Kirsher /* Interface clock latency , in this case, means the 124ec21e2ecSJeff Kirsher * time described by a value of 1 in the interrupt 125ec21e2ecSJeff Kirsher * coalescing registers' time fields. Since those fields 126ec21e2ecSJeff Kirsher * refer to the time it takes for 64 clocks to pass, the 127ec21e2ecSJeff Kirsher * latencies are as such: 128ec21e2ecSJeff Kirsher * GBIT = 125MHz => 8ns/clock => 8*64 ns / tick 129ec21e2ecSJeff Kirsher * 100 = 25 MHz => 40ns/clock => 40*64 ns / tick 130ec21e2ecSJeff Kirsher * 10 = 2.5 MHz => 400ns/clock => 400*64 ns / tick 131ec21e2ecSJeff Kirsher */ 132ec21e2ecSJeff Kirsher #define GFAR_GBIT_TIME 512 133ec21e2ecSJeff Kirsher #define GFAR_100_TIME 2560 134ec21e2ecSJeff Kirsher #define GFAR_10_TIME 25600 135ec21e2ecSJeff Kirsher 136ec21e2ecSJeff Kirsher #define DEFAULT_TX_COALESCE 1 137ec21e2ecSJeff Kirsher #define DEFAULT_TXCOUNT 16 138ec21e2ecSJeff Kirsher #define DEFAULT_TXTIME 21 139ec21e2ecSJeff Kirsher 140ec21e2ecSJeff Kirsher #define DEFAULT_RXTIME 21 141ec21e2ecSJeff Kirsher 142ec21e2ecSJeff Kirsher #define DEFAULT_RX_COALESCE 0 143ec21e2ecSJeff Kirsher #define DEFAULT_RXCOUNT 0 144ec21e2ecSJeff Kirsher 145ec21e2ecSJeff Kirsher #define GFAR_SUPPORTED (SUPPORTED_10baseT_Half \ 146ec21e2ecSJeff Kirsher | SUPPORTED_10baseT_Full \ 147ec21e2ecSJeff Kirsher | SUPPORTED_100baseT_Half \ 148ec21e2ecSJeff Kirsher | SUPPORTED_100baseT_Full \ 149ec21e2ecSJeff Kirsher | SUPPORTED_Autoneg \ 150ec21e2ecSJeff Kirsher | SUPPORTED_MII) 151ec21e2ecSJeff Kirsher 152cf987afcSPavaluca Matei-B46610 #define GFAR_SUPPORTED_GBIT SUPPORTED_1000baseT_Full 15323402bddSClaudiu Manoil 154ec21e2ecSJeff Kirsher /* TBI register addresses */ 155ec21e2ecSJeff Kirsher #define MII_TBICON 0x11 156ec21e2ecSJeff Kirsher 157ec21e2ecSJeff Kirsher /* TBICON register bit fields */ 158ec21e2ecSJeff Kirsher #define TBICON_CLK_SELECT 0x0020 159ec21e2ecSJeff Kirsher 160ec21e2ecSJeff Kirsher /* MAC register bits */ 161ec21e2ecSJeff Kirsher #define MACCFG1_SOFT_RESET 0x80000000 162ec21e2ecSJeff Kirsher #define MACCFG1_RESET_RX_MC 0x00080000 163ec21e2ecSJeff Kirsher #define MACCFG1_RESET_TX_MC 0x00040000 164ec21e2ecSJeff Kirsher #define MACCFG1_RESET_RX_FUN 0x00020000 165ec21e2ecSJeff Kirsher #define MACCFG1_RESET_TX_FUN 0x00010000 166ec21e2ecSJeff Kirsher #define MACCFG1_LOOPBACK 0x00000100 167ec21e2ecSJeff Kirsher #define MACCFG1_RX_FLOW 0x00000020 168ec21e2ecSJeff Kirsher #define MACCFG1_TX_FLOW 0x00000010 169ec21e2ecSJeff Kirsher #define MACCFG1_SYNCD_RX_EN 0x00000008 170ec21e2ecSJeff Kirsher #define MACCFG1_RX_EN 0x00000004 171ec21e2ecSJeff Kirsher #define MACCFG1_SYNCD_TX_EN 0x00000002 172ec21e2ecSJeff Kirsher #define MACCFG1_TX_EN 0x00000001 173ec21e2ecSJeff Kirsher 174ec21e2ecSJeff Kirsher #define MACCFG2_INIT_SETTINGS 0x00007205 175ec21e2ecSJeff Kirsher #define MACCFG2_FULL_DUPLEX 0x00000001 176ec21e2ecSJeff Kirsher #define MACCFG2_IF 0x00000300 177ec21e2ecSJeff Kirsher #define MACCFG2_MII 0x00000100 178ec21e2ecSJeff Kirsher #define MACCFG2_GMII 0x00000200 179ec21e2ecSJeff Kirsher #define MACCFG2_HUGEFRAME 0x00000020 180ec21e2ecSJeff Kirsher #define MACCFG2_LENGTHCHECK 0x00000010 181ec21e2ecSJeff Kirsher #define MACCFG2_MPEN 0x00000008 182ec21e2ecSJeff Kirsher 183ec21e2ecSJeff Kirsher #define ECNTRL_FIFM 0x00008000 184ec21e2ecSJeff Kirsher #define ECNTRL_INIT_SETTINGS 0x00001000 185ec21e2ecSJeff Kirsher #define ECNTRL_TBI_MODE 0x00000020 186ec21e2ecSJeff Kirsher #define ECNTRL_REDUCED_MODE 0x00000010 187ec21e2ecSJeff Kirsher #define ECNTRL_R100 0x00000008 188ec21e2ecSJeff Kirsher #define ECNTRL_REDUCED_MII_MODE 0x00000004 189ec21e2ecSJeff Kirsher #define ECNTRL_SGMII_MODE 0x00000002 190ec21e2ecSJeff Kirsher 191ec21e2ecSJeff Kirsher #define MRBLR_INIT_SETTINGS DEFAULT_RX_BUFFER_SIZE 192ec21e2ecSJeff Kirsher 193ec21e2ecSJeff Kirsher #define MINFLR_INIT_SETTINGS 0x00000040 194ec21e2ecSJeff Kirsher 195ec21e2ecSJeff Kirsher /* Tqueue control */ 196ec21e2ecSJeff Kirsher #define TQUEUE_EN0 0x00008000 197ec21e2ecSJeff Kirsher #define TQUEUE_EN1 0x00004000 198ec21e2ecSJeff Kirsher #define TQUEUE_EN2 0x00002000 199ec21e2ecSJeff Kirsher #define TQUEUE_EN3 0x00001000 200ec21e2ecSJeff Kirsher #define TQUEUE_EN4 0x00000800 201ec21e2ecSJeff Kirsher #define TQUEUE_EN5 0x00000400 202ec21e2ecSJeff Kirsher #define TQUEUE_EN6 0x00000200 203ec21e2ecSJeff Kirsher #define TQUEUE_EN7 0x00000100 204ec21e2ecSJeff Kirsher #define TQUEUE_EN_ALL 0x0000FF00 205ec21e2ecSJeff Kirsher 206ec21e2ecSJeff Kirsher #define TR03WT_WT0_MASK 0xFF000000 207ec21e2ecSJeff Kirsher #define TR03WT_WT1_MASK 0x00FF0000 208ec21e2ecSJeff Kirsher #define TR03WT_WT2_MASK 0x0000FF00 209ec21e2ecSJeff Kirsher #define TR03WT_WT3_MASK 0x000000FF 210ec21e2ecSJeff Kirsher 211ec21e2ecSJeff Kirsher #define TR47WT_WT4_MASK 0xFF000000 212ec21e2ecSJeff Kirsher #define TR47WT_WT5_MASK 0x00FF0000 213ec21e2ecSJeff Kirsher #define TR47WT_WT6_MASK 0x0000FF00 214ec21e2ecSJeff Kirsher #define TR47WT_WT7_MASK 0x000000FF 215ec21e2ecSJeff Kirsher 216ec21e2ecSJeff Kirsher /* Rqueue control */ 217ec21e2ecSJeff Kirsher #define RQUEUE_EX0 0x00800000 218ec21e2ecSJeff Kirsher #define RQUEUE_EX1 0x00400000 219ec21e2ecSJeff Kirsher #define RQUEUE_EX2 0x00200000 220ec21e2ecSJeff Kirsher #define RQUEUE_EX3 0x00100000 221ec21e2ecSJeff Kirsher #define RQUEUE_EX4 0x00080000 222ec21e2ecSJeff Kirsher #define RQUEUE_EX5 0x00040000 223ec21e2ecSJeff Kirsher #define RQUEUE_EX6 0x00020000 224ec21e2ecSJeff Kirsher #define RQUEUE_EX7 0x00010000 225ec21e2ecSJeff Kirsher #define RQUEUE_EX_ALL 0x00FF0000 226ec21e2ecSJeff Kirsher 227ec21e2ecSJeff Kirsher #define RQUEUE_EN0 0x00000080 228ec21e2ecSJeff Kirsher #define RQUEUE_EN1 0x00000040 229ec21e2ecSJeff Kirsher #define RQUEUE_EN2 0x00000020 230ec21e2ecSJeff Kirsher #define RQUEUE_EN3 0x00000010 231ec21e2ecSJeff Kirsher #define RQUEUE_EN4 0x00000008 232ec21e2ecSJeff Kirsher #define RQUEUE_EN5 0x00000004 233ec21e2ecSJeff Kirsher #define RQUEUE_EN6 0x00000002 234ec21e2ecSJeff Kirsher #define RQUEUE_EN7 0x00000001 235ec21e2ecSJeff Kirsher #define RQUEUE_EN_ALL 0x000000FF 236ec21e2ecSJeff Kirsher 237ec21e2ecSJeff Kirsher /* Init to do tx snooping for buffers and descriptors */ 238ec21e2ecSJeff Kirsher #define DMACTRL_INIT_SETTINGS 0x000000c3 239ec21e2ecSJeff Kirsher #define DMACTRL_GRS 0x00000010 240ec21e2ecSJeff Kirsher #define DMACTRL_GTS 0x00000008 241ec21e2ecSJeff Kirsher 242ec21e2ecSJeff Kirsher #define TSTAT_CLEAR_THALT_ALL 0xFF000000 243ec21e2ecSJeff Kirsher #define TSTAT_CLEAR_THALT 0x80000000 244ec21e2ecSJeff Kirsher #define TSTAT_CLEAR_THALT0 0x80000000 245ec21e2ecSJeff Kirsher #define TSTAT_CLEAR_THALT1 0x40000000 246ec21e2ecSJeff Kirsher #define TSTAT_CLEAR_THALT2 0x20000000 247ec21e2ecSJeff Kirsher #define TSTAT_CLEAR_THALT3 0x10000000 248ec21e2ecSJeff Kirsher #define TSTAT_CLEAR_THALT4 0x08000000 249ec21e2ecSJeff Kirsher #define TSTAT_CLEAR_THALT5 0x04000000 250ec21e2ecSJeff Kirsher #define TSTAT_CLEAR_THALT6 0x02000000 251ec21e2ecSJeff Kirsher #define TSTAT_CLEAR_THALT7 0x01000000 252ec21e2ecSJeff Kirsher 253ec21e2ecSJeff Kirsher /* Interrupt coalescing macros */ 254ec21e2ecSJeff Kirsher #define IC_ICEN 0x80000000 255ec21e2ecSJeff Kirsher #define IC_ICFT_MASK 0x1fe00000 256ec21e2ecSJeff Kirsher #define IC_ICFT_SHIFT 21 257ec21e2ecSJeff Kirsher #define mk_ic_icft(x) \ 258ec21e2ecSJeff Kirsher (((unsigned int)x << IC_ICFT_SHIFT)&IC_ICFT_MASK) 259ec21e2ecSJeff Kirsher #define IC_ICTT_MASK 0x0000ffff 260ec21e2ecSJeff Kirsher #define mk_ic_ictt(x) (x&IC_ICTT_MASK) 261ec21e2ecSJeff Kirsher 262ec21e2ecSJeff Kirsher #define mk_ic_value(count, time) (IC_ICEN | \ 263ec21e2ecSJeff Kirsher mk_ic_icft(count) | \ 264ec21e2ecSJeff Kirsher mk_ic_ictt(time)) 265ec21e2ecSJeff Kirsher #define get_icft_value(ic) (((unsigned long)ic & IC_ICFT_MASK) >> \ 266ec21e2ecSJeff Kirsher IC_ICFT_SHIFT) 267ec21e2ecSJeff Kirsher #define get_ictt_value(ic) ((unsigned long)ic & IC_ICTT_MASK) 268ec21e2ecSJeff Kirsher 269ec21e2ecSJeff Kirsher #define DEFAULT_TXIC mk_ic_value(DEFAULT_TXCOUNT, DEFAULT_TXTIME) 270ec21e2ecSJeff Kirsher #define DEFAULT_RXIC mk_ic_value(DEFAULT_RXCOUNT, DEFAULT_RXTIME) 271ec21e2ecSJeff Kirsher 272ec21e2ecSJeff Kirsher #define skip_bd(bdp, stride, base, ring_size) ({ \ 273ec21e2ecSJeff Kirsher typeof(bdp) new_bd = (bdp) + (stride); \ 274ec21e2ecSJeff Kirsher (new_bd >= (base) + (ring_size)) ? (new_bd - (ring_size)) : new_bd; }) 275ec21e2ecSJeff Kirsher 276ec21e2ecSJeff Kirsher #define next_bd(bdp, base, ring_size) skip_bd(bdp, 1, base, ring_size) 277ec21e2ecSJeff Kirsher 278ec21e2ecSJeff Kirsher #define RCTRL_TS_ENABLE 0x01000000 279ec21e2ecSJeff Kirsher #define RCTRL_PAL_MASK 0x001f0000 28045b679c9SMatei Pavaluca #define RCTRL_LFC 0x00004000 281ec21e2ecSJeff Kirsher #define RCTRL_VLEX 0x00002000 282ec21e2ecSJeff Kirsher #define RCTRL_FILREN 0x00001000 283ec21e2ecSJeff Kirsher #define RCTRL_GHTX 0x00000400 284ec21e2ecSJeff Kirsher #define RCTRL_IPCSEN 0x00000200 285ec21e2ecSJeff Kirsher #define RCTRL_TUCSEN 0x00000100 286ec21e2ecSJeff Kirsher #define RCTRL_PRSDEP_MASK 0x000000c0 287ec21e2ecSJeff Kirsher #define RCTRL_PRSDEP_INIT 0x000000c0 288ec21e2ecSJeff Kirsher #define RCTRL_PRSFM 0x00000020 289ec21e2ecSJeff Kirsher #define RCTRL_PROM 0x00000008 290ec21e2ecSJeff Kirsher #define RCTRL_EMEN 0x00000002 291ec21e2ecSJeff Kirsher #define RCTRL_REQ_PARSER (RCTRL_VLEX | RCTRL_IPCSEN | \ 292ec21e2ecSJeff Kirsher RCTRL_TUCSEN | RCTRL_FILREN) 293ec21e2ecSJeff Kirsher #define RCTRL_CHECKSUMMING (RCTRL_IPCSEN | RCTRL_TUCSEN | \ 294ec21e2ecSJeff Kirsher RCTRL_PRSDEP_INIT) 295ec21e2ecSJeff Kirsher #define RCTRL_EXTHASH (RCTRL_GHTX) 296ec21e2ecSJeff Kirsher #define RCTRL_VLAN (RCTRL_PRSDEP_INIT) 297ec21e2ecSJeff Kirsher #define RCTRL_PADDING(x) ((x << 16) & RCTRL_PAL_MASK) 298ec21e2ecSJeff Kirsher 299ec21e2ecSJeff Kirsher 300ec21e2ecSJeff Kirsher #define RSTAT_CLEAR_RHALT 0x00800000 3016be5ed3fSClaudiu Manoil #define RSTAT_CLEAR_RXF0 0x00000080 3026be5ed3fSClaudiu Manoil #define RSTAT_RXF_MASK 0x000000ff 303ec21e2ecSJeff Kirsher 304ec21e2ecSJeff Kirsher #define TCTRL_IPCSEN 0x00004000 305ec21e2ecSJeff Kirsher #define TCTRL_TUCSEN 0x00002000 306ec21e2ecSJeff Kirsher #define TCTRL_VLINS 0x00001000 307ec21e2ecSJeff Kirsher #define TCTRL_THDF 0x00000800 308ec21e2ecSJeff Kirsher #define TCTRL_RFCPAUSE 0x00000010 309ec21e2ecSJeff Kirsher #define TCTRL_TFCPAUSE 0x00000008 310ec21e2ecSJeff Kirsher #define TCTRL_TXSCHED_MASK 0x00000006 311ec21e2ecSJeff Kirsher #define TCTRL_TXSCHED_INIT 0x00000000 312b98b8babSClaudiu Manoil /* priority scheduling */ 313ec21e2ecSJeff Kirsher #define TCTRL_TXSCHED_PRIO 0x00000002 314b98b8babSClaudiu Manoil /* weighted round-robin scheduling (WRRS) */ 315ec21e2ecSJeff Kirsher #define TCTRL_TXSCHED_WRRS 0x00000004 316b98b8babSClaudiu Manoil /* default WRRS weight and policy setting, 317b98b8babSClaudiu Manoil * tailored to the tr03wt and tr47wt registers: 318b98b8babSClaudiu Manoil * equal weight for all Tx Qs, measured in 64byte units 319b98b8babSClaudiu Manoil */ 320b98b8babSClaudiu Manoil #define DEFAULT_WRRS_WEIGHT 0x18181818 321b98b8babSClaudiu Manoil 322ec21e2ecSJeff Kirsher #define TCTRL_INIT_CSUM (TCTRL_TUCSEN | TCTRL_IPCSEN) 323ec21e2ecSJeff Kirsher 324ec21e2ecSJeff Kirsher #define IEVENT_INIT_CLEAR 0xffffffff 325ec21e2ecSJeff Kirsher #define IEVENT_BABR 0x80000000 326ec21e2ecSJeff Kirsher #define IEVENT_RXC 0x40000000 327ec21e2ecSJeff Kirsher #define IEVENT_BSY 0x20000000 328ec21e2ecSJeff Kirsher #define IEVENT_EBERR 0x10000000 329ec21e2ecSJeff Kirsher #define IEVENT_MSRO 0x04000000 330ec21e2ecSJeff Kirsher #define IEVENT_GTSC 0x02000000 331ec21e2ecSJeff Kirsher #define IEVENT_BABT 0x01000000 332ec21e2ecSJeff Kirsher #define IEVENT_TXC 0x00800000 333ec21e2ecSJeff Kirsher #define IEVENT_TXE 0x00400000 334ec21e2ecSJeff Kirsher #define IEVENT_TXB 0x00200000 335ec21e2ecSJeff Kirsher #define IEVENT_TXF 0x00100000 336ec21e2ecSJeff Kirsher #define IEVENT_LC 0x00040000 337ec21e2ecSJeff Kirsher #define IEVENT_CRL 0x00020000 338ec21e2ecSJeff Kirsher #define IEVENT_XFUN 0x00010000 339ec21e2ecSJeff Kirsher #define IEVENT_RXB0 0x00008000 340ec21e2ecSJeff Kirsher #define IEVENT_MAG 0x00000800 341ec21e2ecSJeff Kirsher #define IEVENT_GRSC 0x00000100 342ec21e2ecSJeff Kirsher #define IEVENT_RXF0 0x00000080 343ec21e2ecSJeff Kirsher #define IEVENT_FIR 0x00000008 344ec21e2ecSJeff Kirsher #define IEVENT_FIQ 0x00000004 345ec21e2ecSJeff Kirsher #define IEVENT_DPE 0x00000002 346ec21e2ecSJeff Kirsher #define IEVENT_PERR 0x00000001 347ec21e2ecSJeff Kirsher #define IEVENT_RX_MASK (IEVENT_RXB0 | IEVENT_RXF0 | IEVENT_BSY) 348ec21e2ecSJeff Kirsher #define IEVENT_TX_MASK (IEVENT_TXB | IEVENT_TXF) 349ec21e2ecSJeff Kirsher #define IEVENT_RTX_MASK (IEVENT_RX_MASK | IEVENT_TX_MASK) 350ec21e2ecSJeff Kirsher #define IEVENT_ERR_MASK \ 351ec21e2ecSJeff Kirsher (IEVENT_RXC | IEVENT_BSY | IEVENT_EBERR | IEVENT_MSRO | \ 352ec21e2ecSJeff Kirsher IEVENT_BABT | IEVENT_TXC | IEVENT_TXE | IEVENT_LC \ 353ec21e2ecSJeff Kirsher | IEVENT_CRL | IEVENT_XFUN | IEVENT_DPE | IEVENT_PERR \ 354ec21e2ecSJeff Kirsher | IEVENT_MAG | IEVENT_BABR) 355ec21e2ecSJeff Kirsher 356ec21e2ecSJeff Kirsher #define IMASK_INIT_CLEAR 0x00000000 357ec21e2ecSJeff Kirsher #define IMASK_BABR 0x80000000 358ec21e2ecSJeff Kirsher #define IMASK_RXC 0x40000000 359ec21e2ecSJeff Kirsher #define IMASK_BSY 0x20000000 360ec21e2ecSJeff Kirsher #define IMASK_EBERR 0x10000000 361ec21e2ecSJeff Kirsher #define IMASK_MSRO 0x04000000 362ec21e2ecSJeff Kirsher #define IMASK_GTSC 0x02000000 363ec21e2ecSJeff Kirsher #define IMASK_BABT 0x01000000 364ec21e2ecSJeff Kirsher #define IMASK_TXC 0x00800000 365ec21e2ecSJeff Kirsher #define IMASK_TXEEN 0x00400000 366ec21e2ecSJeff Kirsher #define IMASK_TXBEN 0x00200000 367ec21e2ecSJeff Kirsher #define IMASK_TXFEN 0x00100000 368ec21e2ecSJeff Kirsher #define IMASK_LC 0x00040000 369ec21e2ecSJeff Kirsher #define IMASK_CRL 0x00020000 370ec21e2ecSJeff Kirsher #define IMASK_XFUN 0x00010000 371ec21e2ecSJeff Kirsher #define IMASK_RXB0 0x00008000 372ec21e2ecSJeff Kirsher #define IMASK_MAG 0x00000800 373ec21e2ecSJeff Kirsher #define IMASK_GRSC 0x00000100 374ec21e2ecSJeff Kirsher #define IMASK_RXFEN0 0x00000080 375ec21e2ecSJeff Kirsher #define IMASK_FIR 0x00000008 376ec21e2ecSJeff Kirsher #define IMASK_FIQ 0x00000004 377ec21e2ecSJeff Kirsher #define IMASK_DPE 0x00000002 378ec21e2ecSJeff Kirsher #define IMASK_PERR 0x00000001 379ec21e2ecSJeff Kirsher #define IMASK_DEFAULT (IMASK_TXEEN | IMASK_TXFEN | IMASK_TXBEN | \ 380ec21e2ecSJeff Kirsher IMASK_RXFEN0 | IMASK_BSY | IMASK_EBERR | IMASK_BABR | \ 381ec21e2ecSJeff Kirsher IMASK_XFUN | IMASK_RXC | IMASK_BABT | IMASK_DPE \ 382ec21e2ecSJeff Kirsher | IMASK_PERR) 383aeb12c5eSClaudiu Manoil #define IMASK_RX_DEFAULT (IMASK_RXFEN0 | IMASK_BSY) 384aeb12c5eSClaudiu Manoil #define IMASK_TX_DEFAULT (IMASK_TXFEN | IMASK_TXBEN) 385aeb12c5eSClaudiu Manoil 386aeb12c5eSClaudiu Manoil #define IMASK_RX_DISABLED ((~(IMASK_RX_DEFAULT)) & IMASK_DEFAULT) 387aeb12c5eSClaudiu Manoil #define IMASK_TX_DISABLED ((~(IMASK_TX_DEFAULT)) & IMASK_DEFAULT) 388ec21e2ecSJeff Kirsher 389ec21e2ecSJeff Kirsher /* Fifo management */ 390ec21e2ecSJeff Kirsher #define FIFO_TX_THR_MASK 0x01ff 391ec21e2ecSJeff Kirsher #define FIFO_TX_STARVE_MASK 0x01ff 392ec21e2ecSJeff Kirsher #define FIFO_TX_STARVE_OFF_MASK 0x01ff 393ec21e2ecSJeff Kirsher 394ec21e2ecSJeff Kirsher /* Attribute fields */ 395ec21e2ecSJeff Kirsher 396ec21e2ecSJeff Kirsher /* This enables rx snooping for buffers and descriptors */ 397ec21e2ecSJeff Kirsher #define ATTR_BDSTASH 0x00000800 398ec21e2ecSJeff Kirsher 399ec21e2ecSJeff Kirsher #define ATTR_BUFSTASH 0x00004000 400ec21e2ecSJeff Kirsher 401ec21e2ecSJeff Kirsher #define ATTR_SNOOPING 0x000000c0 402ec21e2ecSJeff Kirsher #define ATTR_INIT_SETTINGS ATTR_SNOOPING 403ec21e2ecSJeff Kirsher 404ec21e2ecSJeff Kirsher #define ATTRELI_INIT_SETTINGS 0x0 405ec21e2ecSJeff Kirsher #define ATTRELI_EL_MASK 0x3fff0000 406ec21e2ecSJeff Kirsher #define ATTRELI_EL(x) (x << 16) 407ec21e2ecSJeff Kirsher #define ATTRELI_EI_MASK 0x00003fff 408ec21e2ecSJeff Kirsher #define ATTRELI_EI(x) (x) 409ec21e2ecSJeff Kirsher 410ec21e2ecSJeff Kirsher #define BD_LFLAG(flags) ((flags) << 16) 411ec21e2ecSJeff Kirsher #define BD_LENGTH_MASK 0x0000ffff 412ec21e2ecSJeff Kirsher 413ec21e2ecSJeff Kirsher #define FPR_FILER_MASK 0xFFFFFFFF 414ec21e2ecSJeff Kirsher #define MAX_FILER_IDX 0xFF 415ec21e2ecSJeff Kirsher 416ec21e2ecSJeff Kirsher /* This default RIR value directly corresponds 417ec21e2ecSJeff Kirsher * to the 3-bit hash value generated */ 41871ff9e3dSClaudiu Manoil #define DEFAULT_8RXQ_RIR0 0x05397700 41971ff9e3dSClaudiu Manoil /* Map even hash values to Q0, and odd ones to Q1 */ 42071ff9e3dSClaudiu Manoil #define DEFAULT_2RXQ_RIR0 0x04104100 421ec21e2ecSJeff Kirsher 422ec21e2ecSJeff Kirsher /* RQFCR register bits */ 423ec21e2ecSJeff Kirsher #define RQFCR_GPI 0x80000000 424ec21e2ecSJeff Kirsher #define RQFCR_HASHTBL_Q 0x00000000 425ec21e2ecSJeff Kirsher #define RQFCR_HASHTBL_0 0x00020000 426ec21e2ecSJeff Kirsher #define RQFCR_HASHTBL_1 0x00040000 427ec21e2ecSJeff Kirsher #define RQFCR_HASHTBL_2 0x00060000 428ec21e2ecSJeff Kirsher #define RQFCR_HASHTBL_3 0x00080000 429ec21e2ecSJeff Kirsher #define RQFCR_HASH 0x00010000 430ec21e2ecSJeff Kirsher #define RQFCR_QUEUE 0x0000FC00 431ec21e2ecSJeff Kirsher #define RQFCR_CLE 0x00000200 432ec21e2ecSJeff Kirsher #define RQFCR_RJE 0x00000100 433ec21e2ecSJeff Kirsher #define RQFCR_AND 0x00000080 434ec21e2ecSJeff Kirsher #define RQFCR_CMP_EXACT 0x00000000 435ec21e2ecSJeff Kirsher #define RQFCR_CMP_MATCH 0x00000020 436ec21e2ecSJeff Kirsher #define RQFCR_CMP_NOEXACT 0x00000040 437ec21e2ecSJeff Kirsher #define RQFCR_CMP_NOMATCH 0x00000060 438ec21e2ecSJeff Kirsher 439ec21e2ecSJeff Kirsher /* RQFCR PID values */ 440ec21e2ecSJeff Kirsher #define RQFCR_PID_MASK 0x00000000 441ec21e2ecSJeff Kirsher #define RQFCR_PID_PARSE 0x00000001 442ec21e2ecSJeff Kirsher #define RQFCR_PID_ARB 0x00000002 443ec21e2ecSJeff Kirsher #define RQFCR_PID_DAH 0x00000003 444ec21e2ecSJeff Kirsher #define RQFCR_PID_DAL 0x00000004 445ec21e2ecSJeff Kirsher #define RQFCR_PID_SAH 0x00000005 446ec21e2ecSJeff Kirsher #define RQFCR_PID_SAL 0x00000006 447ec21e2ecSJeff Kirsher #define RQFCR_PID_ETY 0x00000007 448ec21e2ecSJeff Kirsher #define RQFCR_PID_VID 0x00000008 449ec21e2ecSJeff Kirsher #define RQFCR_PID_PRI 0x00000009 450ec21e2ecSJeff Kirsher #define RQFCR_PID_TOS 0x0000000A 451ec21e2ecSJeff Kirsher #define RQFCR_PID_L4P 0x0000000B 452ec21e2ecSJeff Kirsher #define RQFCR_PID_DIA 0x0000000C 453ec21e2ecSJeff Kirsher #define RQFCR_PID_SIA 0x0000000D 454ec21e2ecSJeff Kirsher #define RQFCR_PID_DPT 0x0000000E 455ec21e2ecSJeff Kirsher #define RQFCR_PID_SPT 0x0000000F 456ec21e2ecSJeff Kirsher 457ec21e2ecSJeff Kirsher /* RQFPR when PID is 0x0001 */ 458ec21e2ecSJeff Kirsher #define RQFPR_HDR_GE_512 0x00200000 459ec21e2ecSJeff Kirsher #define RQFPR_LERR 0x00100000 460ec21e2ecSJeff Kirsher #define RQFPR_RAR 0x00080000 461ec21e2ecSJeff Kirsher #define RQFPR_RARQ 0x00040000 462ec21e2ecSJeff Kirsher #define RQFPR_AR 0x00020000 463ec21e2ecSJeff Kirsher #define RQFPR_ARQ 0x00010000 464ec21e2ecSJeff Kirsher #define RQFPR_EBC 0x00008000 465ec21e2ecSJeff Kirsher #define RQFPR_VLN 0x00004000 466ec21e2ecSJeff Kirsher #define RQFPR_CFI 0x00002000 467ec21e2ecSJeff Kirsher #define RQFPR_JUM 0x00001000 468ec21e2ecSJeff Kirsher #define RQFPR_IPF 0x00000800 469ec21e2ecSJeff Kirsher #define RQFPR_FIF 0x00000400 470ec21e2ecSJeff Kirsher #define RQFPR_IPV4 0x00000200 471ec21e2ecSJeff Kirsher #define RQFPR_IPV6 0x00000100 472ec21e2ecSJeff Kirsher #define RQFPR_ICC 0x00000080 473ec21e2ecSJeff Kirsher #define RQFPR_ICV 0x00000040 474ec21e2ecSJeff Kirsher #define RQFPR_TCP 0x00000020 475ec21e2ecSJeff Kirsher #define RQFPR_UDP 0x00000010 476ec21e2ecSJeff Kirsher #define RQFPR_TUC 0x00000008 477ec21e2ecSJeff Kirsher #define RQFPR_TUV 0x00000004 478ec21e2ecSJeff Kirsher #define RQFPR_PER 0x00000002 479ec21e2ecSJeff Kirsher #define RQFPR_EER 0x00000001 480ec21e2ecSJeff Kirsher 481ec21e2ecSJeff Kirsher /* TxBD status field bits */ 482ec21e2ecSJeff Kirsher #define TXBD_READY 0x8000 483ec21e2ecSJeff Kirsher #define TXBD_PADCRC 0x4000 484ec21e2ecSJeff Kirsher #define TXBD_WRAP 0x2000 485ec21e2ecSJeff Kirsher #define TXBD_INTERRUPT 0x1000 486ec21e2ecSJeff Kirsher #define TXBD_LAST 0x0800 487ec21e2ecSJeff Kirsher #define TXBD_CRC 0x0400 488ec21e2ecSJeff Kirsher #define TXBD_DEF 0x0200 489ec21e2ecSJeff Kirsher #define TXBD_HUGEFRAME 0x0080 490ec21e2ecSJeff Kirsher #define TXBD_LATECOLLISION 0x0080 491ec21e2ecSJeff Kirsher #define TXBD_RETRYLIMIT 0x0040 492ec21e2ecSJeff Kirsher #define TXBD_RETRYCOUNTMASK 0x003c 493ec21e2ecSJeff Kirsher #define TXBD_UNDERRUN 0x0002 494ec21e2ecSJeff Kirsher #define TXBD_TOE 0x0002 495ec21e2ecSJeff Kirsher 496ec21e2ecSJeff Kirsher /* Tx FCB param bits */ 497ec21e2ecSJeff Kirsher #define TXFCB_VLN 0x80 498ec21e2ecSJeff Kirsher #define TXFCB_IP 0x40 499ec21e2ecSJeff Kirsher #define TXFCB_IP6 0x20 500ec21e2ecSJeff Kirsher #define TXFCB_TUP 0x10 501ec21e2ecSJeff Kirsher #define TXFCB_UDP 0x08 502ec21e2ecSJeff Kirsher #define TXFCB_CIP 0x04 503ec21e2ecSJeff Kirsher #define TXFCB_CTU 0x02 504ec21e2ecSJeff Kirsher #define TXFCB_NPH 0x01 505ec21e2ecSJeff Kirsher #define TXFCB_DEFAULT (TXFCB_IP|TXFCB_TUP|TXFCB_CTU|TXFCB_NPH) 506ec21e2ecSJeff Kirsher 507ec21e2ecSJeff Kirsher /* RxBD status field bits */ 508ec21e2ecSJeff Kirsher #define RXBD_EMPTY 0x8000 509ec21e2ecSJeff Kirsher #define RXBD_RO1 0x4000 510ec21e2ecSJeff Kirsher #define RXBD_WRAP 0x2000 511ec21e2ecSJeff Kirsher #define RXBD_INTERRUPT 0x1000 512ec21e2ecSJeff Kirsher #define RXBD_LAST 0x0800 513ec21e2ecSJeff Kirsher #define RXBD_FIRST 0x0400 514ec21e2ecSJeff Kirsher #define RXBD_MISS 0x0100 515ec21e2ecSJeff Kirsher #define RXBD_BROADCAST 0x0080 516ec21e2ecSJeff Kirsher #define RXBD_MULTICAST 0x0040 517ec21e2ecSJeff Kirsher #define RXBD_LARGE 0x0020 518ec21e2ecSJeff Kirsher #define RXBD_NONOCTET 0x0010 519ec21e2ecSJeff Kirsher #define RXBD_SHORT 0x0008 520ec21e2ecSJeff Kirsher #define RXBD_CRCERR 0x0004 521ec21e2ecSJeff Kirsher #define RXBD_OVERRUN 0x0002 522ec21e2ecSJeff Kirsher #define RXBD_TRUNCATED 0x0001 523ec21e2ecSJeff Kirsher #define RXBD_STATS 0x01ff 524ec21e2ecSJeff Kirsher #define RXBD_ERR (RXBD_LARGE | RXBD_SHORT | RXBD_NONOCTET \ 525ec21e2ecSJeff Kirsher | RXBD_CRCERR | RXBD_OVERRUN \ 526ec21e2ecSJeff Kirsher | RXBD_TRUNCATED) 527ec21e2ecSJeff Kirsher 528ec21e2ecSJeff Kirsher /* Rx FCB status field bits */ 529ec21e2ecSJeff Kirsher #define RXFCB_VLN 0x8000 530ec21e2ecSJeff Kirsher #define RXFCB_IP 0x4000 531ec21e2ecSJeff Kirsher #define RXFCB_IP6 0x2000 532ec21e2ecSJeff Kirsher #define RXFCB_TUP 0x1000 533ec21e2ecSJeff Kirsher #define RXFCB_CIP 0x0800 534ec21e2ecSJeff Kirsher #define RXFCB_CTU 0x0400 535ec21e2ecSJeff Kirsher #define RXFCB_EIP 0x0200 536ec21e2ecSJeff Kirsher #define RXFCB_ETU 0x0100 537ec21e2ecSJeff Kirsher #define RXFCB_CSUM_MASK 0x0f00 538ec21e2ecSJeff Kirsher #define RXFCB_PERR_MASK 0x000c 539ec21e2ecSJeff Kirsher #define RXFCB_PERR_BADL3 0x0008 540ec21e2ecSJeff Kirsher 5410015e551SJoe Perches #define GFAR_INT_NAME_MAX (IFNAMSIZ + 6) /* '_g#_xx' */ 542ec21e2ecSJeff Kirsher 543ec21e2ecSJeff Kirsher struct txbd8 544ec21e2ecSJeff Kirsher { 545ec21e2ecSJeff Kirsher union { 546ec21e2ecSJeff Kirsher struct { 547a7312d58SClaudiu Manoil __be16 status; /* Status Fields */ 548a7312d58SClaudiu Manoil __be16 length; /* Buffer length */ 549ec21e2ecSJeff Kirsher }; 550a7312d58SClaudiu Manoil __be32 lstatus; 551ec21e2ecSJeff Kirsher }; 552a7312d58SClaudiu Manoil __be32 bufPtr; /* Buffer Pointer */ 553ec21e2ecSJeff Kirsher }; 554ec21e2ecSJeff Kirsher 555ec21e2ecSJeff Kirsher struct txfcb { 556ec21e2ecSJeff Kirsher u8 flags; 557ec21e2ecSJeff Kirsher u8 ptp; /* Flag to enable tx timestamping */ 558ec21e2ecSJeff Kirsher u8 l4os; /* Level 4 Header Offset */ 559ec21e2ecSJeff Kirsher u8 l3os; /* Level 3 Header Offset */ 56026eb9374SClaudiu Manoil __be16 phcs; /* Pseudo-header Checksum */ 56126eb9374SClaudiu Manoil __be16 vlctl; /* VLAN control word */ 562ec21e2ecSJeff Kirsher }; 563ec21e2ecSJeff Kirsher 564ec21e2ecSJeff Kirsher struct rxbd8 565ec21e2ecSJeff Kirsher { 566ec21e2ecSJeff Kirsher union { 567ec21e2ecSJeff Kirsher struct { 568a7312d58SClaudiu Manoil __be16 status; /* Status Fields */ 569a7312d58SClaudiu Manoil __be16 length; /* Buffer Length */ 570ec21e2ecSJeff Kirsher }; 571a7312d58SClaudiu Manoil __be32 lstatus; 572ec21e2ecSJeff Kirsher }; 573a7312d58SClaudiu Manoil __be32 bufPtr; /* Buffer Pointer */ 574ec21e2ecSJeff Kirsher }; 575ec21e2ecSJeff Kirsher 576ec21e2ecSJeff Kirsher struct rxfcb { 57726eb9374SClaudiu Manoil __be16 flags; 578ec21e2ecSJeff Kirsher u8 rq; /* Receive Queue index */ 579ec21e2ecSJeff Kirsher u8 pro; /* Layer 4 Protocol */ 580ec21e2ecSJeff Kirsher u16 reserved; 58126eb9374SClaudiu Manoil __be16 vlctl; /* VLAN control word */ 582ec21e2ecSJeff Kirsher }; 583ec21e2ecSJeff Kirsher 584ec21e2ecSJeff Kirsher struct gianfar_skb_cb { 58550ad076bSClaudiu Manoil unsigned int bytes_sent; /* bytes-on-wire (i.e. no FCB) */ 586ec21e2ecSJeff Kirsher }; 587ec21e2ecSJeff Kirsher 588ec21e2ecSJeff Kirsher #define GFAR_CB(skb) ((struct gianfar_skb_cb *)((skb)->cb)) 589ec21e2ecSJeff Kirsher 590ec21e2ecSJeff Kirsher struct rmon_mib 591ec21e2ecSJeff Kirsher { 592ec21e2ecSJeff Kirsher u32 tr64; /* 0x.680 - Transmit and Receive 64-byte Frame Counter */ 593ec21e2ecSJeff Kirsher u32 tr127; /* 0x.684 - Transmit and Receive 65-127 byte Frame Counter */ 594ec21e2ecSJeff Kirsher u32 tr255; /* 0x.688 - Transmit and Receive 128-255 byte Frame Counter */ 595ec21e2ecSJeff Kirsher u32 tr511; /* 0x.68c - Transmit and Receive 256-511 byte Frame Counter */ 596ec21e2ecSJeff Kirsher u32 tr1k; /* 0x.690 - Transmit and Receive 512-1023 byte Frame Counter */ 597ec21e2ecSJeff Kirsher u32 trmax; /* 0x.694 - Transmit and Receive 1024-1518 byte Frame Counter */ 598ec21e2ecSJeff Kirsher u32 trmgv; /* 0x.698 - Transmit and Receive 1519-1522 byte Good VLAN Frame */ 599ec21e2ecSJeff Kirsher u32 rbyt; /* 0x.69c - Receive Byte Counter */ 600ec21e2ecSJeff Kirsher u32 rpkt; /* 0x.6a0 - Receive Packet Counter */ 601ec21e2ecSJeff Kirsher u32 rfcs; /* 0x.6a4 - Receive FCS Error Counter */ 602ec21e2ecSJeff Kirsher u32 rmca; /* 0x.6a8 - Receive Multicast Packet Counter */ 603ec21e2ecSJeff Kirsher u32 rbca; /* 0x.6ac - Receive Broadcast Packet Counter */ 604ec21e2ecSJeff Kirsher u32 rxcf; /* 0x.6b0 - Receive Control Frame Packet Counter */ 605ec21e2ecSJeff Kirsher u32 rxpf; /* 0x.6b4 - Receive Pause Frame Packet Counter */ 606ec21e2ecSJeff Kirsher u32 rxuo; /* 0x.6b8 - Receive Unknown OP Code Counter */ 607ec21e2ecSJeff Kirsher u32 raln; /* 0x.6bc - Receive Alignment Error Counter */ 608ec21e2ecSJeff Kirsher u32 rflr; /* 0x.6c0 - Receive Frame Length Error Counter */ 609ec21e2ecSJeff Kirsher u32 rcde; /* 0x.6c4 - Receive Code Error Counter */ 610ec21e2ecSJeff Kirsher u32 rcse; /* 0x.6c8 - Receive Carrier Sense Error Counter */ 611ec21e2ecSJeff Kirsher u32 rund; /* 0x.6cc - Receive Undersize Packet Counter */ 612ec21e2ecSJeff Kirsher u32 rovr; /* 0x.6d0 - Receive Oversize Packet Counter */ 613ec21e2ecSJeff Kirsher u32 rfrg; /* 0x.6d4 - Receive Fragments Counter */ 614ec21e2ecSJeff Kirsher u32 rjbr; /* 0x.6d8 - Receive Jabber Counter */ 615ec21e2ecSJeff Kirsher u32 rdrp; /* 0x.6dc - Receive Drop Counter */ 616ec21e2ecSJeff Kirsher u32 tbyt; /* 0x.6e0 - Transmit Byte Counter Counter */ 617ec21e2ecSJeff Kirsher u32 tpkt; /* 0x.6e4 - Transmit Packet Counter */ 618ec21e2ecSJeff Kirsher u32 tmca; /* 0x.6e8 - Transmit Multicast Packet Counter */ 619ec21e2ecSJeff Kirsher u32 tbca; /* 0x.6ec - Transmit Broadcast Packet Counter */ 620ec21e2ecSJeff Kirsher u32 txpf; /* 0x.6f0 - Transmit Pause Control Frame Counter */ 621ec21e2ecSJeff Kirsher u32 tdfr; /* 0x.6f4 - Transmit Deferral Packet Counter */ 622ec21e2ecSJeff Kirsher u32 tedf; /* 0x.6f8 - Transmit Excessive Deferral Packet Counter */ 623ec21e2ecSJeff Kirsher u32 tscl; /* 0x.6fc - Transmit Single Collision Packet Counter */ 624ec21e2ecSJeff Kirsher u32 tmcl; /* 0x.700 - Transmit Multiple Collision Packet Counter */ 625ec21e2ecSJeff Kirsher u32 tlcl; /* 0x.704 - Transmit Late Collision Packet Counter */ 626ec21e2ecSJeff Kirsher u32 txcl; /* 0x.708 - Transmit Excessive Collision Packet Counter */ 627ec21e2ecSJeff Kirsher u32 tncl; /* 0x.70c - Transmit Total Collision Counter */ 628ec21e2ecSJeff Kirsher u8 res1[4]; 629ec21e2ecSJeff Kirsher u32 tdrp; /* 0x.714 - Transmit Drop Frame Counter */ 630ec21e2ecSJeff Kirsher u32 tjbr; /* 0x.718 - Transmit Jabber Frame Counter */ 631ec21e2ecSJeff Kirsher u32 tfcs; /* 0x.71c - Transmit FCS Error Counter */ 632ec21e2ecSJeff Kirsher u32 txcf; /* 0x.720 - Transmit Control Frame Counter */ 633ec21e2ecSJeff Kirsher u32 tovr; /* 0x.724 - Transmit Oversize Frame Counter */ 634ec21e2ecSJeff Kirsher u32 tund; /* 0x.728 - Transmit Undersize Frame Counter */ 635ec21e2ecSJeff Kirsher u32 tfrg; /* 0x.72c - Transmit Fragments Frame Counter */ 636ec21e2ecSJeff Kirsher u32 car1; /* 0x.730 - Carry Register One */ 637ec21e2ecSJeff Kirsher u32 car2; /* 0x.734 - Carry Register Two */ 638ec21e2ecSJeff Kirsher u32 cam1; /* 0x.738 - Carry Mask Register One */ 639ec21e2ecSJeff Kirsher u32 cam2; /* 0x.73c - Carry Mask Register Two */ 640ec21e2ecSJeff Kirsher }; 641ec21e2ecSJeff Kirsher 642ec21e2ecSJeff Kirsher struct gfar_extra_stats { 64376f31e8bSClaudiu Manoil atomic64_t rx_alloc_err; 644212079dfSPaul Gortmaker atomic64_t rx_large; 645212079dfSPaul Gortmaker atomic64_t rx_short; 646212079dfSPaul Gortmaker atomic64_t rx_nonoctet; 647212079dfSPaul Gortmaker atomic64_t rx_crcerr; 648212079dfSPaul Gortmaker atomic64_t rx_overrun; 649212079dfSPaul Gortmaker atomic64_t rx_bsy; 650212079dfSPaul Gortmaker atomic64_t rx_babr; 651212079dfSPaul Gortmaker atomic64_t rx_trunc; 652212079dfSPaul Gortmaker atomic64_t eberr; 653212079dfSPaul Gortmaker atomic64_t tx_babt; 654212079dfSPaul Gortmaker atomic64_t tx_underrun; 655212079dfSPaul Gortmaker atomic64_t tx_timeout; 656ec21e2ecSJeff Kirsher }; 657ec21e2ecSJeff Kirsher 658ec21e2ecSJeff Kirsher #define GFAR_RMON_LEN ((sizeof(struct rmon_mib) - 16)/sizeof(u32)) 659212079dfSPaul Gortmaker #define GFAR_EXTRA_STATS_LEN \ 660212079dfSPaul Gortmaker (sizeof(struct gfar_extra_stats)/sizeof(atomic64_t)) 661ec21e2ecSJeff Kirsher 66268719786SPaul Gortmaker /* Number of stats exported via ethtool */ 663ec21e2ecSJeff Kirsher #define GFAR_STATS_LEN (GFAR_RMON_LEN + GFAR_EXTRA_STATS_LEN) 664ec21e2ecSJeff Kirsher 665ec21e2ecSJeff Kirsher struct gfar { 666ec21e2ecSJeff Kirsher u32 tsec_id; /* 0x.000 - Controller ID register */ 667ec21e2ecSJeff Kirsher u32 tsec_id2; /* 0x.004 - Controller ID2 register */ 668ec21e2ecSJeff Kirsher u8 res1[8]; 669ec21e2ecSJeff Kirsher u32 ievent; /* 0x.010 - Interrupt Event Register */ 670ec21e2ecSJeff Kirsher u32 imask; /* 0x.014 - Interrupt Mask Register */ 671ec21e2ecSJeff Kirsher u32 edis; /* 0x.018 - Error Disabled Register */ 672ec21e2ecSJeff Kirsher u32 emapg; /* 0x.01c - Group Error mapping register */ 673ec21e2ecSJeff Kirsher u32 ecntrl; /* 0x.020 - Ethernet Control Register */ 674ec21e2ecSJeff Kirsher u32 minflr; /* 0x.024 - Minimum Frame Length Register */ 675ec21e2ecSJeff Kirsher u32 ptv; /* 0x.028 - Pause Time Value Register */ 676ec21e2ecSJeff Kirsher u32 dmactrl; /* 0x.02c - DMA Control Register */ 677ec21e2ecSJeff Kirsher u32 tbipa; /* 0x.030 - TBI PHY Address Register */ 678ec21e2ecSJeff Kirsher u8 res2[28]; 679ec21e2ecSJeff Kirsher u32 fifo_rx_pause; /* 0x.050 - FIFO receive pause start threshold 680ec21e2ecSJeff Kirsher register */ 681ec21e2ecSJeff Kirsher u32 fifo_rx_pause_shutoff; /* x.054 - FIFO receive starve shutoff 682ec21e2ecSJeff Kirsher register */ 683ec21e2ecSJeff Kirsher u32 fifo_rx_alarm; /* 0x.058 - FIFO receive alarm start threshold 684ec21e2ecSJeff Kirsher register */ 685ec21e2ecSJeff Kirsher u32 fifo_rx_alarm_shutoff; /*0x.05c - FIFO receive alarm starve 686ec21e2ecSJeff Kirsher shutoff register */ 687ec21e2ecSJeff Kirsher u8 res3[44]; 688ec21e2ecSJeff Kirsher u32 fifo_tx_thr; /* 0x.08c - FIFO transmit threshold register */ 689ec21e2ecSJeff Kirsher u8 res4[8]; 690ec21e2ecSJeff Kirsher u32 fifo_tx_starve; /* 0x.098 - FIFO transmit starve register */ 691ec21e2ecSJeff Kirsher u32 fifo_tx_starve_shutoff; /* 0x.09c - FIFO transmit starve shutoff register */ 692ec21e2ecSJeff Kirsher u8 res5[96]; 693ec21e2ecSJeff Kirsher u32 tctrl; /* 0x.100 - Transmit Control Register */ 694ec21e2ecSJeff Kirsher u32 tstat; /* 0x.104 - Transmit Status Register */ 695ec21e2ecSJeff Kirsher u32 dfvlan; /* 0x.108 - Default VLAN Control word */ 696ec21e2ecSJeff Kirsher u32 tbdlen; /* 0x.10c - Transmit Buffer Descriptor Data Length Register */ 697ec21e2ecSJeff Kirsher u32 txic; /* 0x.110 - Transmit Interrupt Coalescing Configuration Register */ 698ec21e2ecSJeff Kirsher u32 tqueue; /* 0x.114 - Transmit queue control register */ 699ec21e2ecSJeff Kirsher u8 res7[40]; 700ec21e2ecSJeff Kirsher u32 tr03wt; /* 0x.140 - TxBD Rings 0-3 round-robin weightings */ 701ec21e2ecSJeff Kirsher u32 tr47wt; /* 0x.144 - TxBD Rings 4-7 round-robin weightings */ 702ec21e2ecSJeff Kirsher u8 res8[52]; 703ec21e2ecSJeff Kirsher u32 tbdbph; /* 0x.17c - Tx data buffer pointer high */ 704ec21e2ecSJeff Kirsher u8 res9a[4]; 705ec21e2ecSJeff Kirsher u32 tbptr0; /* 0x.184 - TxBD Pointer for ring 0 */ 706ec21e2ecSJeff Kirsher u8 res9b[4]; 707ec21e2ecSJeff Kirsher u32 tbptr1; /* 0x.18c - TxBD Pointer for ring 1 */ 708ec21e2ecSJeff Kirsher u8 res9c[4]; 709ec21e2ecSJeff Kirsher u32 tbptr2; /* 0x.194 - TxBD Pointer for ring 2 */ 710ec21e2ecSJeff Kirsher u8 res9d[4]; 711ec21e2ecSJeff Kirsher u32 tbptr3; /* 0x.19c - TxBD Pointer for ring 3 */ 712ec21e2ecSJeff Kirsher u8 res9e[4]; 713ec21e2ecSJeff Kirsher u32 tbptr4; /* 0x.1a4 - TxBD Pointer for ring 4 */ 714ec21e2ecSJeff Kirsher u8 res9f[4]; 715ec21e2ecSJeff Kirsher u32 tbptr5; /* 0x.1ac - TxBD Pointer for ring 5 */ 716ec21e2ecSJeff Kirsher u8 res9g[4]; 717ec21e2ecSJeff Kirsher u32 tbptr6; /* 0x.1b4 - TxBD Pointer for ring 6 */ 718ec21e2ecSJeff Kirsher u8 res9h[4]; 719ec21e2ecSJeff Kirsher u32 tbptr7; /* 0x.1bc - TxBD Pointer for ring 7 */ 720ec21e2ecSJeff Kirsher u8 res9[64]; 721ec21e2ecSJeff Kirsher u32 tbaseh; /* 0x.200 - TxBD base address high */ 722ec21e2ecSJeff Kirsher u32 tbase0; /* 0x.204 - TxBD Base Address of ring 0 */ 723ec21e2ecSJeff Kirsher u8 res10a[4]; 724ec21e2ecSJeff Kirsher u32 tbase1; /* 0x.20c - TxBD Base Address of ring 1 */ 725ec21e2ecSJeff Kirsher u8 res10b[4]; 726ec21e2ecSJeff Kirsher u32 tbase2; /* 0x.214 - TxBD Base Address of ring 2 */ 727ec21e2ecSJeff Kirsher u8 res10c[4]; 728ec21e2ecSJeff Kirsher u32 tbase3; /* 0x.21c - TxBD Base Address of ring 3 */ 729ec21e2ecSJeff Kirsher u8 res10d[4]; 730ec21e2ecSJeff Kirsher u32 tbase4; /* 0x.224 - TxBD Base Address of ring 4 */ 731ec21e2ecSJeff Kirsher u8 res10e[4]; 732ec21e2ecSJeff Kirsher u32 tbase5; /* 0x.22c - TxBD Base Address of ring 5 */ 733ec21e2ecSJeff Kirsher u8 res10f[4]; 734ec21e2ecSJeff Kirsher u32 tbase6; /* 0x.234 - TxBD Base Address of ring 6 */ 735ec21e2ecSJeff Kirsher u8 res10g[4]; 736ec21e2ecSJeff Kirsher u32 tbase7; /* 0x.23c - TxBD Base Address of ring 7 */ 737ec21e2ecSJeff Kirsher u8 res10[192]; 738ec21e2ecSJeff Kirsher u32 rctrl; /* 0x.300 - Receive Control Register */ 739ec21e2ecSJeff Kirsher u32 rstat; /* 0x.304 - Receive Status Register */ 740ec21e2ecSJeff Kirsher u8 res12[8]; 741ec21e2ecSJeff Kirsher u32 rxic; /* 0x.310 - Receive Interrupt Coalescing Configuration Register */ 742ec21e2ecSJeff Kirsher u32 rqueue; /* 0x.314 - Receive queue control register */ 743ec21e2ecSJeff Kirsher u32 rir0; /* 0x.318 - Ring mapping register 0 */ 744ec21e2ecSJeff Kirsher u32 rir1; /* 0x.31c - Ring mapping register 1 */ 745ec21e2ecSJeff Kirsher u32 rir2; /* 0x.320 - Ring mapping register 2 */ 746ec21e2ecSJeff Kirsher u32 rir3; /* 0x.324 - Ring mapping register 3 */ 747ec21e2ecSJeff Kirsher u8 res13[8]; 748ec21e2ecSJeff Kirsher u32 rbifx; /* 0x.330 - Receive bit field extract control register */ 749ec21e2ecSJeff Kirsher u32 rqfar; /* 0x.334 - Receive queue filing table address register */ 750ec21e2ecSJeff Kirsher u32 rqfcr; /* 0x.338 - Receive queue filing table control register */ 751ec21e2ecSJeff Kirsher u32 rqfpr; /* 0x.33c - Receive queue filing table property register */ 752ec21e2ecSJeff Kirsher u32 mrblr; /* 0x.340 - Maximum Receive Buffer Length Register */ 753ec21e2ecSJeff Kirsher u8 res14[56]; 754ec21e2ecSJeff Kirsher u32 rbdbph; /* 0x.37c - Rx data buffer pointer high */ 755ec21e2ecSJeff Kirsher u8 res15a[4]; 756ec21e2ecSJeff Kirsher u32 rbptr0; /* 0x.384 - RxBD pointer for ring 0 */ 757ec21e2ecSJeff Kirsher u8 res15b[4]; 758ec21e2ecSJeff Kirsher u32 rbptr1; /* 0x.38c - RxBD pointer for ring 1 */ 759ec21e2ecSJeff Kirsher u8 res15c[4]; 760ec21e2ecSJeff Kirsher u32 rbptr2; /* 0x.394 - RxBD pointer for ring 2 */ 761ec21e2ecSJeff Kirsher u8 res15d[4]; 762ec21e2ecSJeff Kirsher u32 rbptr3; /* 0x.39c - RxBD pointer for ring 3 */ 763ec21e2ecSJeff Kirsher u8 res15e[4]; 764ec21e2ecSJeff Kirsher u32 rbptr4; /* 0x.3a4 - RxBD pointer for ring 4 */ 765ec21e2ecSJeff Kirsher u8 res15f[4]; 766ec21e2ecSJeff Kirsher u32 rbptr5; /* 0x.3ac - RxBD pointer for ring 5 */ 767ec21e2ecSJeff Kirsher u8 res15g[4]; 768ec21e2ecSJeff Kirsher u32 rbptr6; /* 0x.3b4 - RxBD pointer for ring 6 */ 769ec21e2ecSJeff Kirsher u8 res15h[4]; 770ec21e2ecSJeff Kirsher u32 rbptr7; /* 0x.3bc - RxBD pointer for ring 7 */ 771ec21e2ecSJeff Kirsher u8 res16[64]; 772ec21e2ecSJeff Kirsher u32 rbaseh; /* 0x.400 - RxBD base address high */ 773ec21e2ecSJeff Kirsher u32 rbase0; /* 0x.404 - RxBD base address of ring 0 */ 774ec21e2ecSJeff Kirsher u8 res17a[4]; 775ec21e2ecSJeff Kirsher u32 rbase1; /* 0x.40c - RxBD base address of ring 1 */ 776ec21e2ecSJeff Kirsher u8 res17b[4]; 777ec21e2ecSJeff Kirsher u32 rbase2; /* 0x.414 - RxBD base address of ring 2 */ 778ec21e2ecSJeff Kirsher u8 res17c[4]; 779ec21e2ecSJeff Kirsher u32 rbase3; /* 0x.41c - RxBD base address of ring 3 */ 780ec21e2ecSJeff Kirsher u8 res17d[4]; 781ec21e2ecSJeff Kirsher u32 rbase4; /* 0x.424 - RxBD base address of ring 4 */ 782ec21e2ecSJeff Kirsher u8 res17e[4]; 783ec21e2ecSJeff Kirsher u32 rbase5; /* 0x.42c - RxBD base address of ring 5 */ 784ec21e2ecSJeff Kirsher u8 res17f[4]; 785ec21e2ecSJeff Kirsher u32 rbase6; /* 0x.434 - RxBD base address of ring 6 */ 786ec21e2ecSJeff Kirsher u8 res17g[4]; 787ec21e2ecSJeff Kirsher u32 rbase7; /* 0x.43c - RxBD base address of ring 7 */ 788ec21e2ecSJeff Kirsher u8 res17[192]; 789ec21e2ecSJeff Kirsher u32 maccfg1; /* 0x.500 - MAC Configuration 1 Register */ 790ec21e2ecSJeff Kirsher u32 maccfg2; /* 0x.504 - MAC Configuration 2 Register */ 791ec21e2ecSJeff Kirsher u32 ipgifg; /* 0x.508 - Inter Packet Gap/Inter Frame Gap Register */ 792ec21e2ecSJeff Kirsher u32 hafdup; /* 0x.50c - Half Duplex Register */ 793ec21e2ecSJeff Kirsher u32 maxfrm; /* 0x.510 - Maximum Frame Length Register */ 794ec21e2ecSJeff Kirsher u8 res18[12]; 795ec21e2ecSJeff Kirsher u8 gfar_mii_regs[24]; /* See gianfar_phy.h */ 796ec21e2ecSJeff Kirsher u32 ifctrl; /* 0x.538 - Interface control register */ 797ec21e2ecSJeff Kirsher u32 ifstat; /* 0x.53c - Interface Status Register */ 798ec21e2ecSJeff Kirsher u32 macstnaddr1; /* 0x.540 - Station Address Part 1 Register */ 799ec21e2ecSJeff Kirsher u32 macstnaddr2; /* 0x.544 - Station Address Part 2 Register */ 800ec21e2ecSJeff Kirsher u32 mac01addr1; /* 0x.548 - MAC exact match address 1, part 1 */ 801ec21e2ecSJeff Kirsher u32 mac01addr2; /* 0x.54c - MAC exact match address 1, part 2 */ 802ec21e2ecSJeff Kirsher u32 mac02addr1; /* 0x.550 - MAC exact match address 2, part 1 */ 803ec21e2ecSJeff Kirsher u32 mac02addr2; /* 0x.554 - MAC exact match address 2, part 2 */ 804ec21e2ecSJeff Kirsher u32 mac03addr1; /* 0x.558 - MAC exact match address 3, part 1 */ 805ec21e2ecSJeff Kirsher u32 mac03addr2; /* 0x.55c - MAC exact match address 3, part 2 */ 806ec21e2ecSJeff Kirsher u32 mac04addr1; /* 0x.560 - MAC exact match address 4, part 1 */ 807ec21e2ecSJeff Kirsher u32 mac04addr2; /* 0x.564 - MAC exact match address 4, part 2 */ 808ec21e2ecSJeff Kirsher u32 mac05addr1; /* 0x.568 - MAC exact match address 5, part 1 */ 809ec21e2ecSJeff Kirsher u32 mac05addr2; /* 0x.56c - MAC exact match address 5, part 2 */ 810ec21e2ecSJeff Kirsher u32 mac06addr1; /* 0x.570 - MAC exact match address 6, part 1 */ 811ec21e2ecSJeff Kirsher u32 mac06addr2; /* 0x.574 - MAC exact match address 6, part 2 */ 812ec21e2ecSJeff Kirsher u32 mac07addr1; /* 0x.578 - MAC exact match address 7, part 1 */ 813ec21e2ecSJeff Kirsher u32 mac07addr2; /* 0x.57c - MAC exact match address 7, part 2 */ 814ec21e2ecSJeff Kirsher u32 mac08addr1; /* 0x.580 - MAC exact match address 8, part 1 */ 815ec21e2ecSJeff Kirsher u32 mac08addr2; /* 0x.584 - MAC exact match address 8, part 2 */ 816ec21e2ecSJeff Kirsher u32 mac09addr1; /* 0x.588 - MAC exact match address 9, part 1 */ 817ec21e2ecSJeff Kirsher u32 mac09addr2; /* 0x.58c - MAC exact match address 9, part 2 */ 818ec21e2ecSJeff Kirsher u32 mac10addr1; /* 0x.590 - MAC exact match address 10, part 1*/ 819ec21e2ecSJeff Kirsher u32 mac10addr2; /* 0x.594 - MAC exact match address 10, part 2*/ 820ec21e2ecSJeff Kirsher u32 mac11addr1; /* 0x.598 - MAC exact match address 11, part 1*/ 821ec21e2ecSJeff Kirsher u32 mac11addr2; /* 0x.59c - MAC exact match address 11, part 2*/ 822ec21e2ecSJeff Kirsher u32 mac12addr1; /* 0x.5a0 - MAC exact match address 12, part 1*/ 823ec21e2ecSJeff Kirsher u32 mac12addr2; /* 0x.5a4 - MAC exact match address 12, part 2*/ 824ec21e2ecSJeff Kirsher u32 mac13addr1; /* 0x.5a8 - MAC exact match address 13, part 1*/ 825ec21e2ecSJeff Kirsher u32 mac13addr2; /* 0x.5ac - MAC exact match address 13, part 2*/ 826ec21e2ecSJeff Kirsher u32 mac14addr1; /* 0x.5b0 - MAC exact match address 14, part 1*/ 827ec21e2ecSJeff Kirsher u32 mac14addr2; /* 0x.5b4 - MAC exact match address 14, part 2*/ 828ec21e2ecSJeff Kirsher u32 mac15addr1; /* 0x.5b8 - MAC exact match address 15, part 1*/ 829ec21e2ecSJeff Kirsher u32 mac15addr2; /* 0x.5bc - MAC exact match address 15, part 2*/ 830ec21e2ecSJeff Kirsher u8 res20[192]; 831ec21e2ecSJeff Kirsher struct rmon_mib rmon; /* 0x.680-0x.73c */ 832ec21e2ecSJeff Kirsher u32 rrej; /* 0x.740 - Receive filer rejected packet counter */ 833ec21e2ecSJeff Kirsher u8 res21[188]; 834ec21e2ecSJeff Kirsher u32 igaddr0; /* 0x.800 - Indivdual/Group address register 0*/ 835ec21e2ecSJeff Kirsher u32 igaddr1; /* 0x.804 - Indivdual/Group address register 1*/ 836ec21e2ecSJeff Kirsher u32 igaddr2; /* 0x.808 - Indivdual/Group address register 2*/ 837ec21e2ecSJeff Kirsher u32 igaddr3; /* 0x.80c - Indivdual/Group address register 3*/ 838ec21e2ecSJeff Kirsher u32 igaddr4; /* 0x.810 - Indivdual/Group address register 4*/ 839ec21e2ecSJeff Kirsher u32 igaddr5; /* 0x.814 - Indivdual/Group address register 5*/ 840ec21e2ecSJeff Kirsher u32 igaddr6; /* 0x.818 - Indivdual/Group address register 6*/ 841ec21e2ecSJeff Kirsher u32 igaddr7; /* 0x.81c - Indivdual/Group address register 7*/ 842ec21e2ecSJeff Kirsher u8 res22[96]; 843ec21e2ecSJeff Kirsher u32 gaddr0; /* 0x.880 - Group address register 0 */ 844ec21e2ecSJeff Kirsher u32 gaddr1; /* 0x.884 - Group address register 1 */ 845ec21e2ecSJeff Kirsher u32 gaddr2; /* 0x.888 - Group address register 2 */ 846ec21e2ecSJeff Kirsher u32 gaddr3; /* 0x.88c - Group address register 3 */ 847ec21e2ecSJeff Kirsher u32 gaddr4; /* 0x.890 - Group address register 4 */ 848ec21e2ecSJeff Kirsher u32 gaddr5; /* 0x.894 - Group address register 5 */ 849ec21e2ecSJeff Kirsher u32 gaddr6; /* 0x.898 - Group address register 6 */ 850ec21e2ecSJeff Kirsher u32 gaddr7; /* 0x.89c - Group address register 7 */ 851ec21e2ecSJeff Kirsher u8 res23a[352]; 852ec21e2ecSJeff Kirsher u32 fifocfg; /* 0x.a00 - FIFO interface config register */ 853ec21e2ecSJeff Kirsher u8 res23b[252]; 854ec21e2ecSJeff Kirsher u8 res23c[248]; 855ec21e2ecSJeff Kirsher u32 attr; /* 0x.bf8 - Attributes Register */ 856ec21e2ecSJeff Kirsher u32 attreli; /* 0x.bfc - Attributes Extract Length and Extract Index Register */ 85745b679c9SMatei Pavaluca u32 rqprm0; /* 0x.c00 - Receive queue parameters register 0 */ 85845b679c9SMatei Pavaluca u32 rqprm1; /* 0x.c04 - Receive queue parameters register 1 */ 85945b679c9SMatei Pavaluca u32 rqprm2; /* 0x.c08 - Receive queue parameters register 2 */ 86045b679c9SMatei Pavaluca u32 rqprm3; /* 0x.c0c - Receive queue parameters register 3 */ 86145b679c9SMatei Pavaluca u32 rqprm4; /* 0x.c10 - Receive queue parameters register 4 */ 86245b679c9SMatei Pavaluca u32 rqprm5; /* 0x.c14 - Receive queue parameters register 5 */ 86345b679c9SMatei Pavaluca u32 rqprm6; /* 0x.c18 - Receive queue parameters register 6 */ 86445b679c9SMatei Pavaluca u32 rqprm7; /* 0x.c1c - Receive queue parameters register 7 */ 86545b679c9SMatei Pavaluca u8 res24[36]; 86645b679c9SMatei Pavaluca u32 rfbptr0; /* 0x.c44 - Last free RxBD pointer for ring 0 */ 86745b679c9SMatei Pavaluca u8 res24a[4]; 86845b679c9SMatei Pavaluca u32 rfbptr1; /* 0x.c4c - Last free RxBD pointer for ring 1 */ 86945b679c9SMatei Pavaluca u8 res24b[4]; 87045b679c9SMatei Pavaluca u32 rfbptr2; /* 0x.c54 - Last free RxBD pointer for ring 2 */ 87145b679c9SMatei Pavaluca u8 res24c[4]; 87245b679c9SMatei Pavaluca u32 rfbptr3; /* 0x.c5c - Last free RxBD pointer for ring 3 */ 87345b679c9SMatei Pavaluca u8 res24d[4]; 87445b679c9SMatei Pavaluca u32 rfbptr4; /* 0x.c64 - Last free RxBD pointer for ring 4 */ 87545b679c9SMatei Pavaluca u8 res24e[4]; 87645b679c9SMatei Pavaluca u32 rfbptr5; /* 0x.c6c - Last free RxBD pointer for ring 5 */ 87745b679c9SMatei Pavaluca u8 res24f[4]; 87845b679c9SMatei Pavaluca u32 rfbptr6; /* 0x.c74 - Last free RxBD pointer for ring 6 */ 87945b679c9SMatei Pavaluca u8 res24g[4]; 88045b679c9SMatei Pavaluca u32 rfbptr7; /* 0x.c7c - Last free RxBD pointer for ring 7 */ 88145b679c9SMatei Pavaluca u8 res24h[4]; 88245b679c9SMatei Pavaluca u8 res24x[556]; 883ec21e2ecSJeff Kirsher u32 isrg0; /* 0x.eb0 - Interrupt steering group 0 register */ 884ec21e2ecSJeff Kirsher u32 isrg1; /* 0x.eb4 - Interrupt steering group 1 register */ 885ec21e2ecSJeff Kirsher u32 isrg2; /* 0x.eb8 - Interrupt steering group 2 register */ 886ec21e2ecSJeff Kirsher u32 isrg3; /* 0x.ebc - Interrupt steering group 3 register */ 887ec21e2ecSJeff Kirsher u8 res25[16]; 888ec21e2ecSJeff Kirsher u32 rxic0; /* 0x.ed0 - Ring 0 Rx interrupt coalescing */ 889ec21e2ecSJeff Kirsher u32 rxic1; /* 0x.ed4 - Ring 1 Rx interrupt coalescing */ 890ec21e2ecSJeff Kirsher u32 rxic2; /* 0x.ed8 - Ring 2 Rx interrupt coalescing */ 891ec21e2ecSJeff Kirsher u32 rxic3; /* 0x.edc - Ring 3 Rx interrupt coalescing */ 892ec21e2ecSJeff Kirsher u32 rxic4; /* 0x.ee0 - Ring 4 Rx interrupt coalescing */ 893ec21e2ecSJeff Kirsher u32 rxic5; /* 0x.ee4 - Ring 5 Rx interrupt coalescing */ 894ec21e2ecSJeff Kirsher u32 rxic6; /* 0x.ee8 - Ring 6 Rx interrupt coalescing */ 895ec21e2ecSJeff Kirsher u32 rxic7; /* 0x.eec - Ring 7 Rx interrupt coalescing */ 896ec21e2ecSJeff Kirsher u8 res26[32]; 897ec21e2ecSJeff Kirsher u32 txic0; /* 0x.f10 - Ring 0 Tx interrupt coalescing */ 898ec21e2ecSJeff Kirsher u32 txic1; /* 0x.f14 - Ring 1 Tx interrupt coalescing */ 899ec21e2ecSJeff Kirsher u32 txic2; /* 0x.f18 - Ring 2 Tx interrupt coalescing */ 900ec21e2ecSJeff Kirsher u32 txic3; /* 0x.f1c - Ring 3 Tx interrupt coalescing */ 901ec21e2ecSJeff Kirsher u32 txic4; /* 0x.f20 - Ring 4 Tx interrupt coalescing */ 902ec21e2ecSJeff Kirsher u32 txic5; /* 0x.f24 - Ring 5 Tx interrupt coalescing */ 903ec21e2ecSJeff Kirsher u32 txic6; /* 0x.f28 - Ring 6 Tx interrupt coalescing */ 904ec21e2ecSJeff Kirsher u32 txic7; /* 0x.f2c - Ring 7 Tx interrupt coalescing */ 905ec21e2ecSJeff Kirsher u8 res27[208]; 906ec21e2ecSJeff Kirsher }; 907ec21e2ecSJeff Kirsher 908ec21e2ecSJeff Kirsher /* Flags related to gianfar device features */ 909ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_GIGABIT 0x00000001 910ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_COALESCE 0x00000002 911ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_RMON 0x00000004 912ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_MULTI_INTR 0x00000008 913ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_CSUM 0x00000010 914ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_VLAN 0x00000020 915ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_EXTENDED_HASH 0x00000040 916ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_MAGIC_PACKET 0x00000100 917ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_BD_STASHING 0x00000200 918ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_BUF_STASHING 0x00000400 919ec21e2ecSJeff Kirsher #define FSL_GIANFAR_DEV_HAS_TIMER 0x00000800 920ec21e2ecSJeff Kirsher 921ec21e2ecSJeff Kirsher #if (MAXGROUPS == 2) 922ec21e2ecSJeff Kirsher #define DEFAULT_MAPPING 0xAA 923ec21e2ecSJeff Kirsher #else 924ec21e2ecSJeff Kirsher #define DEFAULT_MAPPING 0xFF 925ec21e2ecSJeff Kirsher #endif 926ec21e2ecSJeff Kirsher 92720862788SClaudiu Manoil #define ISRG_RR0 0x80000000 92820862788SClaudiu Manoil #define ISRG_TR0 0x00800000 929ec21e2ecSJeff Kirsher 930ec21e2ecSJeff Kirsher /* The same driver can operate in two modes */ 931ec21e2ecSJeff Kirsher /* SQ_SG_MODE: Single Queue Single Group Mode 932ec21e2ecSJeff Kirsher * (Backward compatible mode) 933ec21e2ecSJeff Kirsher * MQ_MG_MODE: Multi Queue Multi Group mode 934ec21e2ecSJeff Kirsher */ 935ec21e2ecSJeff Kirsher enum { 936ec21e2ecSJeff Kirsher SQ_SG_MODE = 0, 937ec21e2ecSJeff Kirsher MQ_MG_MODE 938ec21e2ecSJeff Kirsher }; 939ec21e2ecSJeff Kirsher 94071ff9e3dSClaudiu Manoil /* GFAR_SQ_POLLING: Single Queue NAPI polling mode 94171ff9e3dSClaudiu Manoil * The driver supports a single pair of RX/Tx queues 94271ff9e3dSClaudiu Manoil * per interrupt group (Rx/Tx int line). MQ_MG mode 94371ff9e3dSClaudiu Manoil * devices have 2 interrupt groups, so the device will 94471ff9e3dSClaudiu Manoil * have a total of 2 Tx and 2 Rx queues in this case. 94571ff9e3dSClaudiu Manoil * GFAR_MQ_POLLING: Multi Queue NAPI polling mode 94671ff9e3dSClaudiu Manoil * The driver supports all the 8 Rx and Tx HW queues 94771ff9e3dSClaudiu Manoil * each queue mapped by the Device Tree to one of 94871ff9e3dSClaudiu Manoil * the 2 interrupt groups. This mode implies significant 94971ff9e3dSClaudiu Manoil * processing overhead (CPU and controller level). 95071ff9e3dSClaudiu Manoil */ 95171ff9e3dSClaudiu Manoil enum gfar_poll_mode { 95271ff9e3dSClaudiu Manoil GFAR_SQ_POLLING = 0, 95371ff9e3dSClaudiu Manoil GFAR_MQ_POLLING 95471ff9e3dSClaudiu Manoil }; 95571ff9e3dSClaudiu Manoil 956ec21e2ecSJeff Kirsher /* 957ec21e2ecSJeff Kirsher * Per TX queue stats 958ec21e2ecSJeff Kirsher */ 959ec21e2ecSJeff Kirsher struct tx_q_stats { 960ec21e2ecSJeff Kirsher unsigned long tx_packets; 961ec21e2ecSJeff Kirsher unsigned long tx_bytes; 962ec21e2ecSJeff Kirsher }; 963ec21e2ecSJeff Kirsher 964ec21e2ecSJeff Kirsher /** 965ec21e2ecSJeff Kirsher * struct gfar_priv_tx_q - per tx queue structure 966ec21e2ecSJeff Kirsher * @txlock: per queue tx spin lock 967ec21e2ecSJeff Kirsher * @tx_skbuff:skb pointers 968ec21e2ecSJeff Kirsher * @skb_curtx: to be used skb pointer 969ec21e2ecSJeff Kirsher * @skb_dirtytx:the last used skb pointer 970ec21e2ecSJeff Kirsher * @stats: bytes/packets stats 971ec21e2ecSJeff Kirsher * @qindex: index of this queue 972ec21e2ecSJeff Kirsher * @dev: back pointer to the dev structure 973ec21e2ecSJeff Kirsher * @grp: back pointer to the group to which this queue belongs 974ec21e2ecSJeff Kirsher * @tx_bd_base: First tx buffer descriptor 975ec21e2ecSJeff Kirsher * @cur_tx: Next free ring entry 976ec21e2ecSJeff Kirsher * @dirty_tx: First buffer in line to be transmitted 977ec21e2ecSJeff Kirsher * @tx_ring_size: Tx ring size 978ec21e2ecSJeff Kirsher * @num_txbdfree: number of free TxBds 979ec21e2ecSJeff Kirsher * @txcoalescing: enable/disable tx coalescing 980ec21e2ecSJeff Kirsher * @txic: transmit interrupt coalescing value 981ec21e2ecSJeff Kirsher * @txcount: coalescing value if based on tx frame count 982ec21e2ecSJeff Kirsher * @txtime: coalescing value if based on time 983ec21e2ecSJeff Kirsher */ 984ec21e2ecSJeff Kirsher struct gfar_priv_tx_q { 9850cd3fdeaSClaudiu Manoil /* cacheline 1 */ 986ec21e2ecSJeff Kirsher spinlock_t txlock __attribute__ ((aligned (SMP_CACHE_BYTES))); 987ec21e2ecSJeff Kirsher struct txbd8 *tx_bd_base; 988ec21e2ecSJeff Kirsher struct txbd8 *cur_tx; 989ec21e2ecSJeff Kirsher unsigned int num_txbdfree; 9900cd3fdeaSClaudiu Manoil unsigned short skb_curtx; 9910cd3fdeaSClaudiu Manoil unsigned short tx_ring_size; 9920cd3fdeaSClaudiu Manoil struct tx_q_stats stats; 9930cd3fdeaSClaudiu Manoil struct gfar_priv_grp *grp; 9940cd3fdeaSClaudiu Manoil /* cacheline 2 */ 9950cd3fdeaSClaudiu Manoil struct net_device *dev; 9960cd3fdeaSClaudiu Manoil struct sk_buff **tx_skbuff; 9970cd3fdeaSClaudiu Manoil struct txbd8 *dirty_tx; 9980cd3fdeaSClaudiu Manoil unsigned short skb_dirtytx; 9990cd3fdeaSClaudiu Manoil unsigned short qindex; 1000ec21e2ecSJeff Kirsher /* Configuration info for the coalescing features */ 10010cd3fdeaSClaudiu Manoil unsigned int txcoalescing; 1002ec21e2ecSJeff Kirsher unsigned long txic; 10030cd3fdeaSClaudiu Manoil dma_addr_t tx_bd_dma_base; 1004ec21e2ecSJeff Kirsher }; 1005ec21e2ecSJeff Kirsher 1006ec21e2ecSJeff Kirsher /* 1007ec21e2ecSJeff Kirsher * Per RX queue stats 1008ec21e2ecSJeff Kirsher */ 1009ec21e2ecSJeff Kirsher struct rx_q_stats { 1010ec21e2ecSJeff Kirsher unsigned long rx_packets; 1011ec21e2ecSJeff Kirsher unsigned long rx_bytes; 1012ec21e2ecSJeff Kirsher unsigned long rx_dropped; 1013ec21e2ecSJeff Kirsher }; 1014ec21e2ecSJeff Kirsher 101575354148SClaudiu Manoil struct gfar_rx_buff { 101675354148SClaudiu Manoil dma_addr_t dma; 101775354148SClaudiu Manoil struct page *page; 101875354148SClaudiu Manoil unsigned int page_offset; 101975354148SClaudiu Manoil }; 102075354148SClaudiu Manoil 1021ec21e2ecSJeff Kirsher /** 1022ec21e2ecSJeff Kirsher * struct gfar_priv_rx_q - per rx queue structure 102375354148SClaudiu Manoil * @rx_buff: Array of buffer info metadata structs 1024ec21e2ecSJeff Kirsher * @rx_bd_base: First rx buffer descriptor 102576f31e8bSClaudiu Manoil * @next_to_use: index of the next buffer to be alloc'd 102676f31e8bSClaudiu Manoil * @next_to_clean: index of the next buffer to be cleaned 1027ec21e2ecSJeff Kirsher * @qindex: index of this queue 1028f23223f1SClaudiu Manoil * @ndev: back pointer to net_device 1029ec21e2ecSJeff Kirsher * @rx_ring_size: Rx ring size 1030ec21e2ecSJeff Kirsher * @rxcoalescing: enable/disable rx-coalescing 1031ec21e2ecSJeff Kirsher * @rxic: receive interrupt coalescing vlaue 1032ec21e2ecSJeff Kirsher */ 1033ec21e2ecSJeff Kirsher 1034ec21e2ecSJeff Kirsher struct gfar_priv_rx_q { 103575354148SClaudiu Manoil struct gfar_rx_buff *rx_buff __aligned(SMP_CACHE_BYTES); 1036ec21e2ecSJeff Kirsher struct rxbd8 *rx_bd_base; 1037f23223f1SClaudiu Manoil struct net_device *ndev; 103875354148SClaudiu Manoil struct device *dev; 103976f31e8bSClaudiu Manoil u16 rx_ring_size; 1040ec21e2ecSJeff Kirsher u16 qindex; 104175354148SClaudiu Manoil struct gfar_priv_grp *grp; 104276f31e8bSClaudiu Manoil u16 next_to_clean; 104376f31e8bSClaudiu Manoil u16 next_to_use; 104475354148SClaudiu Manoil u16 next_to_alloc; 104575354148SClaudiu Manoil struct sk_buff *skb; 104676f31e8bSClaudiu Manoil struct rx_q_stats stats; 104776f31e8bSClaudiu Manoil u32 __iomem *rfbptr; 1048ec21e2ecSJeff Kirsher unsigned char rxcoalescing; 1049ec21e2ecSJeff Kirsher unsigned long rxic; 105076f31e8bSClaudiu Manoil dma_addr_t rx_bd_dma_base; 1051ec21e2ecSJeff Kirsher }; 1052ec21e2ecSJeff Kirsher 1053ee873fdaSClaudiu Manoil enum gfar_irqinfo_id { 1054ee873fdaSClaudiu Manoil GFAR_TX = 0, 1055ee873fdaSClaudiu Manoil GFAR_RX = 1, 1056ee873fdaSClaudiu Manoil GFAR_ER = 2, 1057ee873fdaSClaudiu Manoil GFAR_NUM_IRQS = 3 1058ee873fdaSClaudiu Manoil }; 1059ee873fdaSClaudiu Manoil 1060ee873fdaSClaudiu Manoil struct gfar_irqinfo { 1061ee873fdaSClaudiu Manoil unsigned int irq; 1062ee873fdaSClaudiu Manoil char name[GFAR_INT_NAME_MAX]; 1063ee873fdaSClaudiu Manoil }; 1064ee873fdaSClaudiu Manoil 1065ec21e2ecSJeff Kirsher /** 1066ec21e2ecSJeff Kirsher * struct gfar_priv_grp - per group structure 1067ec21e2ecSJeff Kirsher * @napi: the napi poll function 1068ec21e2ecSJeff Kirsher * @priv: back pointer to the priv structure 1069ec21e2ecSJeff Kirsher * @regs: the ioremapped register space for this group 1070ee873fdaSClaudiu Manoil * @irqinfo: TX/RX/ER irq data for this group 1071ec21e2ecSJeff Kirsher */ 1072ec21e2ecSJeff Kirsher 1073ec21e2ecSJeff Kirsher struct gfar_priv_grp { 107471ff9e3dSClaudiu Manoil spinlock_t grplock __aligned(SMP_CACHE_BYTES); 1075aeb12c5eSClaudiu Manoil struct napi_struct napi_rx; 1076aeb12c5eSClaudiu Manoil struct napi_struct napi_tx; 1077ec21e2ecSJeff Kirsher struct gfar __iomem *regs; 107871ff9e3dSClaudiu Manoil struct gfar_priv_tx_q *tx_queue; 107971ff9e3dSClaudiu Manoil struct gfar_priv_rx_q *rx_queue; 1080ec21e2ecSJeff Kirsher unsigned int tstat; 108171ff9e3dSClaudiu Manoil unsigned int rstat; 108271ff9e3dSClaudiu Manoil 108371ff9e3dSClaudiu Manoil struct gfar_private *priv; 1084ee873fdaSClaudiu Manoil unsigned long num_tx_queues; 1085ee873fdaSClaudiu Manoil unsigned long tx_bit_map; 108671ff9e3dSClaudiu Manoil unsigned long num_rx_queues; 108771ff9e3dSClaudiu Manoil unsigned long rx_bit_map; 1088ec21e2ecSJeff Kirsher 1089ee873fdaSClaudiu Manoil struct gfar_irqinfo *irqinfo[GFAR_NUM_IRQS]; 1090ec21e2ecSJeff Kirsher }; 1091ec21e2ecSJeff Kirsher 1092ee873fdaSClaudiu Manoil #define gfar_irq(grp, ID) \ 1093ee873fdaSClaudiu Manoil ((grp)->irqinfo[GFAR_##ID]) 1094ee873fdaSClaudiu Manoil 1095ec21e2ecSJeff Kirsher enum gfar_errata { 1096ec21e2ecSJeff Kirsher GFAR_ERRATA_74 = 0x01, 1097ec21e2ecSJeff Kirsher GFAR_ERRATA_76 = 0x02, 1098ec21e2ecSJeff Kirsher GFAR_ERRATA_A002 = 0x04, 1099ec21e2ecSJeff Kirsher GFAR_ERRATA_12 = 0x08, /* a.k.a errata eTSEC49 */ 1100ec21e2ecSJeff Kirsher }; 1101ec21e2ecSJeff Kirsher 11020851133bSClaudiu Manoil enum gfar_dev_state { 11030851133bSClaudiu Manoil GFAR_DOWN = 1, 11040851133bSClaudiu Manoil GFAR_RESETTING 11050851133bSClaudiu Manoil }; 11060851133bSClaudiu Manoil 1107ec21e2ecSJeff Kirsher /* Struct stolen almost completely (and shamelessly) from the FCC enet source 1108ec21e2ecSJeff Kirsher * (Ok, that's not so true anymore, but there is a family resemblance) 1109ec21e2ecSJeff Kirsher * The GFAR buffer descriptors track the ring buffers. The rx_bd_base 1110ec21e2ecSJeff Kirsher * and tx_bd_base always point to the currently available buffer. 1111ec21e2ecSJeff Kirsher * The dirty_tx tracks the current buffer that is being sent by the 1112ec21e2ecSJeff Kirsher * controller. The cur_tx and dirty_tx are equal under both completely 1113ec21e2ecSJeff Kirsher * empty and completely full conditions. The empty/ready indicator in 1114ec21e2ecSJeff Kirsher * the buffer descriptor determines the actual condition. 1115ec21e2ecSJeff Kirsher */ 1116ec21e2ecSJeff Kirsher struct gfar_private { 1117b597d20dSClaudiu Manoil struct device *dev; 1118b597d20dSClaudiu Manoil struct net_device *ndev; 1119b597d20dSClaudiu Manoil enum gfar_errata errata; 1120b597d20dSClaudiu Manoil 1121ba779711SClaudiu Manoil u16 uses_rxfcb; 1122b597d20dSClaudiu Manoil u16 padding; 112371ff9e3dSClaudiu Manoil u32 device_flags; 1124b597d20dSClaudiu Manoil 1125b597d20dSClaudiu Manoil /* HW time stamping enabled flag */ 1126b597d20dSClaudiu Manoil int hwts_rx_en; 1127b597d20dSClaudiu Manoil int hwts_tx_en; 1128b597d20dSClaudiu Manoil 1129b597d20dSClaudiu Manoil struct gfar_priv_tx_q *tx_queue[MAX_TX_QS]; 1130b597d20dSClaudiu Manoil struct gfar_priv_rx_q *rx_queue[MAX_RX_QS]; 1131b597d20dSClaudiu Manoil struct gfar_priv_grp gfargrp[MAXGROUPS]; 1132b597d20dSClaudiu Manoil 11330851133bSClaudiu Manoil unsigned long state; 1134b597d20dSClaudiu Manoil 113571ff9e3dSClaudiu Manoil unsigned short mode; 113671ff9e3dSClaudiu Manoil unsigned short poll_mode; 1137b597d20dSClaudiu Manoil unsigned int num_tx_queues; 113871ff9e3dSClaudiu Manoil unsigned int num_rx_queues; 1139b597d20dSClaudiu Manoil unsigned int num_grps; 114045b679c9SMatei Pavaluca int tx_actual_en; 1141b597d20dSClaudiu Manoil 1142b597d20dSClaudiu Manoil /* Network Statistics */ 1143b597d20dSClaudiu Manoil struct gfar_extra_stats extra_stats; 1144b597d20dSClaudiu Manoil 1145b597d20dSClaudiu Manoil /* PHY stuff */ 1146b597d20dSClaudiu Manoil phy_interface_t interface; 1147b597d20dSClaudiu Manoil struct device_node *phy_node; 1148b597d20dSClaudiu Manoil struct device_node *tbi_node; 1149b597d20dSClaudiu Manoil struct phy_device *phydev; 1150b597d20dSClaudiu Manoil struct mii_bus *mii_bus; 1151b597d20dSClaudiu Manoil int oldspeed; 1152b597d20dSClaudiu Manoil int oldduplex; 1153b597d20dSClaudiu Manoil int oldlink; 1154b597d20dSClaudiu Manoil 1155b597d20dSClaudiu Manoil /* Bitfield update lock */ 1156b597d20dSClaudiu Manoil spinlock_t bflock; 1157b597d20dSClaudiu Manoil 1158b597d20dSClaudiu Manoil uint32_t msg_enable; 1159b597d20dSClaudiu Manoil 1160b597d20dSClaudiu Manoil struct work_struct reset_task; 1161b597d20dSClaudiu Manoil 1162b597d20dSClaudiu Manoil struct platform_device *ofdev; 1163b597d20dSClaudiu Manoil unsigned char 1164b597d20dSClaudiu Manoil extended_hash:1, 1165b597d20dSClaudiu Manoil bd_stash_en:1, 1166b597d20dSClaudiu Manoil rx_filer_enable:1, 1167b597d20dSClaudiu Manoil /* Wake-on-LAN enabled */ 1168b597d20dSClaudiu Manoil wol_en:1, 1169b597d20dSClaudiu Manoil /* Enable priorty based Tx scheduling in Hw */ 117023402bddSClaudiu Manoil prio_sched_en:1, 117123402bddSClaudiu Manoil /* Flow control flags */ 117223402bddSClaudiu Manoil pause_aneg_en:1, 117323402bddSClaudiu Manoil tx_pause_en:1, 117423402bddSClaudiu Manoil rx_pause_en:1; 1175ec21e2ecSJeff Kirsher 1176ec21e2ecSJeff Kirsher /* The total tx and rx ring size for the enabled queues */ 1177ec21e2ecSJeff Kirsher unsigned int total_tx_ring_size; 1178ec21e2ecSJeff Kirsher unsigned int total_rx_ring_size; 1179ec21e2ecSJeff Kirsher 118020862788SClaudiu Manoil u32 rqueue; 118120862788SClaudiu Manoil u32 tqueue; 118220862788SClaudiu Manoil 1183ec21e2ecSJeff Kirsher /* RX per device parameters */ 1184ec21e2ecSJeff Kirsher unsigned int rx_stash_size; 1185ec21e2ecSJeff Kirsher unsigned int rx_stash_index; 1186ec21e2ecSJeff Kirsher 1187ec21e2ecSJeff Kirsher u32 cur_filer_idx; 1188ec21e2ecSJeff Kirsher 1189ec21e2ecSJeff Kirsher /* RX queue filer rule set*/ 1190ec21e2ecSJeff Kirsher struct ethtool_rx_list rx_list; 1191ec21e2ecSJeff Kirsher struct mutex rx_queue_access; 1192ec21e2ecSJeff Kirsher 1193ec21e2ecSJeff Kirsher /* Hash registers and their width */ 1194ec21e2ecSJeff Kirsher u32 __iomem *hash_regs[16]; 1195ec21e2ecSJeff Kirsher int hash_width; 1196ec21e2ecSJeff Kirsher 1197ec21e2ecSJeff Kirsher /*Filer table*/ 1198ec21e2ecSJeff Kirsher unsigned int ftp_rqfpr[MAX_FILER_IDX + 1]; 1199ec21e2ecSJeff Kirsher unsigned int ftp_rqfcr[MAX_FILER_IDX + 1]; 1200ec21e2ecSJeff Kirsher }; 1201ec21e2ecSJeff Kirsher 1202ec21e2ecSJeff Kirsher 1203ec21e2ecSJeff Kirsher static inline int gfar_has_errata(struct gfar_private *priv, 1204ec21e2ecSJeff Kirsher enum gfar_errata err) 1205ec21e2ecSJeff Kirsher { 1206ec21e2ecSJeff Kirsher return priv->errata & err; 1207ec21e2ecSJeff Kirsher } 1208ec21e2ecSJeff Kirsher 1209fb017472SKim Phillips static inline u32 gfar_read(unsigned __iomem *addr) 1210ec21e2ecSJeff Kirsher { 1211ec21e2ecSJeff Kirsher u32 val; 1212fb017472SKim Phillips val = ioread32be(addr); 1213ec21e2ecSJeff Kirsher return val; 1214ec21e2ecSJeff Kirsher } 1215ec21e2ecSJeff Kirsher 1216fb017472SKim Phillips static inline void gfar_write(unsigned __iomem *addr, u32 val) 1217ec21e2ecSJeff Kirsher { 1218fb017472SKim Phillips iowrite32be(val, addr); 1219ec21e2ecSJeff Kirsher } 1220ec21e2ecSJeff Kirsher 1221ec21e2ecSJeff Kirsher static inline void gfar_write_filer(struct gfar_private *priv, 1222ec21e2ecSJeff Kirsher unsigned int far, unsigned int fcr, unsigned int fpr) 1223ec21e2ecSJeff Kirsher { 1224ec21e2ecSJeff Kirsher struct gfar __iomem *regs = priv->gfargrp[0].regs; 1225ec21e2ecSJeff Kirsher 1226ec21e2ecSJeff Kirsher gfar_write(®s->rqfar, far); 1227ec21e2ecSJeff Kirsher gfar_write(®s->rqfcr, fcr); 1228ec21e2ecSJeff Kirsher gfar_write(®s->rqfpr, fpr); 1229ec21e2ecSJeff Kirsher } 1230ec21e2ecSJeff Kirsher 1231ec21e2ecSJeff Kirsher static inline void gfar_read_filer(struct gfar_private *priv, 1232ec21e2ecSJeff Kirsher unsigned int far, unsigned int *fcr, unsigned int *fpr) 1233ec21e2ecSJeff Kirsher { 1234ec21e2ecSJeff Kirsher struct gfar __iomem *regs = priv->gfargrp[0].regs; 1235ec21e2ecSJeff Kirsher 1236ec21e2ecSJeff Kirsher gfar_write(®s->rqfar, far); 1237ec21e2ecSJeff Kirsher *fcr = gfar_read(®s->rqfcr); 1238ec21e2ecSJeff Kirsher *fpr = gfar_read(®s->rqfpr); 1239ec21e2ecSJeff Kirsher } 1240ec21e2ecSJeff Kirsher 124120862788SClaudiu Manoil static inline void gfar_write_isrg(struct gfar_private *priv) 124220862788SClaudiu Manoil { 124320862788SClaudiu Manoil struct gfar __iomem *regs = priv->gfargrp[0].regs; 124420862788SClaudiu Manoil u32 __iomem *baddr = ®s->isrg0; 124520862788SClaudiu Manoil u32 isrg = 0; 124620862788SClaudiu Manoil int grp_idx, i; 124720862788SClaudiu Manoil 124820862788SClaudiu Manoil for (grp_idx = 0; grp_idx < priv->num_grps; grp_idx++) { 124920862788SClaudiu Manoil struct gfar_priv_grp *grp = &priv->gfargrp[grp_idx]; 125020862788SClaudiu Manoil 125120862788SClaudiu Manoil for_each_set_bit(i, &grp->rx_bit_map, priv->num_rx_queues) { 125220862788SClaudiu Manoil isrg |= (ISRG_RR0 >> i); 125320862788SClaudiu Manoil } 125420862788SClaudiu Manoil 125520862788SClaudiu Manoil for_each_set_bit(i, &grp->tx_bit_map, priv->num_tx_queues) { 125620862788SClaudiu Manoil isrg |= (ISRG_TR0 >> i); 125720862788SClaudiu Manoil } 125820862788SClaudiu Manoil 125920862788SClaudiu Manoil gfar_write(baddr, isrg); 126020862788SClaudiu Manoil 126120862788SClaudiu Manoil baddr++; 126220862788SClaudiu Manoil isrg = 0; 126320862788SClaudiu Manoil } 126420862788SClaudiu Manoil } 126520862788SClaudiu Manoil 1266a4feee89SClaudiu Manoil static inline int gfar_is_dma_stopped(struct gfar_private *priv) 1267a4feee89SClaudiu Manoil { 1268a4feee89SClaudiu Manoil struct gfar __iomem *regs = priv->gfargrp[0].regs; 1269a4feee89SClaudiu Manoil 1270a4feee89SClaudiu Manoil return ((gfar_read(®s->ievent) & (IEVENT_GRSC | IEVENT_GTSC)) == 1271a4feee89SClaudiu Manoil (IEVENT_GRSC | IEVENT_GTSC)); 1272a4feee89SClaudiu Manoil } 1273a4feee89SClaudiu Manoil 1274a4feee89SClaudiu Manoil static inline int gfar_is_rx_dma_stopped(struct gfar_private *priv) 1275a4feee89SClaudiu Manoil { 1276a4feee89SClaudiu Manoil struct gfar __iomem *regs = priv->gfargrp[0].regs; 1277a4feee89SClaudiu Manoil 1278a4feee89SClaudiu Manoil return gfar_read(®s->ievent) & IEVENT_GRSC; 1279a4feee89SClaudiu Manoil } 1280a4feee89SClaudiu Manoil 1281d55398baSClaudiu Manoil static inline void gfar_wmb(void) 1282d55398baSClaudiu Manoil { 1283d55398baSClaudiu Manoil #if defined(CONFIG_PPC) 1284d55398baSClaudiu Manoil /* The powerpc-specific eieio() is used, as wmb() has too strong 1285d55398baSClaudiu Manoil * semantics (it requires synchronization between cacheable and 1286d55398baSClaudiu Manoil * uncacheable mappings, which eieio() doesn't provide and which we 1287d55398baSClaudiu Manoil * don't need), thus requiring a more expensive sync instruction. At 1288d55398baSClaudiu Manoil * some point, the set of architecture-independent barrier functions 1289d55398baSClaudiu Manoil * should be expanded to include weaker barriers. 1290d55398baSClaudiu Manoil */ 1291d55398baSClaudiu Manoil eieio(); 1292d55398baSClaudiu Manoil #else 1293d55398baSClaudiu Manoil wmb(); /* order write acesses for BD (or FCB) fields */ 1294d55398baSClaudiu Manoil #endif 1295d55398baSClaudiu Manoil } 1296d55398baSClaudiu Manoil 1297a7312d58SClaudiu Manoil static inline void gfar_clear_txbd_status(struct txbd8 *bdp) 1298a7312d58SClaudiu Manoil { 1299a7312d58SClaudiu Manoil u32 lstatus = be32_to_cpu(bdp->lstatus); 1300a7312d58SClaudiu Manoil 1301a7312d58SClaudiu Manoil lstatus &= BD_LFLAG(TXBD_WRAP); 1302a7312d58SClaudiu Manoil bdp->lstatus = cpu_to_be32(lstatus); 1303a7312d58SClaudiu Manoil } 1304a7312d58SClaudiu Manoil 130576f31e8bSClaudiu Manoil static inline int gfar_rxbd_unused(struct gfar_priv_rx_q *rxq) 130676f31e8bSClaudiu Manoil { 130776f31e8bSClaudiu Manoil if (rxq->next_to_clean > rxq->next_to_use) 130876f31e8bSClaudiu Manoil return rxq->next_to_clean - rxq->next_to_use - 1; 130976f31e8bSClaudiu Manoil 131076f31e8bSClaudiu Manoil return rxq->rx_ring_size + rxq->next_to_clean - rxq->next_to_use - 1; 131176f31e8bSClaudiu Manoil } 131276f31e8bSClaudiu Manoil 131376f31e8bSClaudiu Manoil static inline struct rxbd8 *gfar_rxbd_lastfree(struct gfar_priv_rx_q *rxq) 131476f31e8bSClaudiu Manoil { 131576f31e8bSClaudiu Manoil int i; 131676f31e8bSClaudiu Manoil 131776f31e8bSClaudiu Manoil i = rxq->next_to_use ? rxq->next_to_use - 1 : rxq->rx_ring_size - 1; 131876f31e8bSClaudiu Manoil 131976f31e8bSClaudiu Manoil return &rxq->rx_bd_base[i]; 132076f31e8bSClaudiu Manoil } 132176f31e8bSClaudiu Manoil 1322bddb2d9aSJoe Perches irqreturn_t gfar_receive(int irq, void *dev_id); 1323bddb2d9aSJoe Perches int startup_gfar(struct net_device *dev); 1324bddb2d9aSJoe Perches void stop_gfar(struct net_device *dev); 13250851133bSClaudiu Manoil void reset_gfar(struct net_device *dev); 13260851133bSClaudiu Manoil void gfar_mac_reset(struct gfar_private *priv); 1327c10650b6SClaudiu Manoil void gfar_halt(struct gfar_private *priv); 1328c10650b6SClaudiu Manoil void gfar_start(struct gfar_private *priv); 1329bddb2d9aSJoe Perches void gfar_phy_test(struct mii_bus *bus, struct phy_device *phydev, int enable, 1330bddb2d9aSJoe Perches u32 regnum, u32 read); 1331bddb2d9aSJoe Perches void gfar_configure_coalescing_all(struct gfar_private *priv); 1332c8f44affSMichał Mirosław int gfar_set_features(struct net_device *dev, netdev_features_t features); 1333ec21e2ecSJeff Kirsher 1334ec21e2ecSJeff Kirsher extern const struct ethtool_ops gfar_ethtool_ops; 1335ec21e2ecSJeff Kirsher 1336ec21e2ecSJeff Kirsher #define MAX_FILER_CACHE_IDX (2*(MAX_FILER_IDX)) 1337ec21e2ecSJeff Kirsher 1338ec21e2ecSJeff Kirsher #define RQFCR_PID_PRI_MASK 0xFFFFFFF8 1339ec21e2ecSJeff Kirsher #define RQFCR_PID_L4P_MASK 0xFFFFFF00 1340ec21e2ecSJeff Kirsher #define RQFCR_PID_VID_MASK 0xFFFFF000 1341ec21e2ecSJeff Kirsher #define RQFCR_PID_PORT_MASK 0xFFFF0000 1342ec21e2ecSJeff Kirsher #define RQFCR_PID_MAC_MASK 0xFF000000 1343ec21e2ecSJeff Kirsher 1344ec21e2ecSJeff Kirsher struct gfar_mask_entry { 1345ec21e2ecSJeff Kirsher unsigned int mask; /* The mask value which is valid form start to end */ 1346ec21e2ecSJeff Kirsher unsigned int start; 1347ec21e2ecSJeff Kirsher unsigned int end; 1348ec21e2ecSJeff Kirsher unsigned int block; /* Same block values indicate depended entries */ 1349ec21e2ecSJeff Kirsher }; 1350ec21e2ecSJeff Kirsher 1351ec21e2ecSJeff Kirsher /* Represents a receive filer table entry */ 1352ec21e2ecSJeff Kirsher struct gfar_filer_entry { 1353ec21e2ecSJeff Kirsher u32 ctrl; 1354ec21e2ecSJeff Kirsher u32 prop; 1355ec21e2ecSJeff Kirsher }; 1356ec21e2ecSJeff Kirsher 1357ec21e2ecSJeff Kirsher 1358ec21e2ecSJeff Kirsher /* The 20 additional entries are a shadow for one extra element */ 1359ec21e2ecSJeff Kirsher struct filer_table { 1360ec21e2ecSJeff Kirsher u32 index; 1361ec21e2ecSJeff Kirsher struct gfar_filer_entry fe[MAX_FILER_CACHE_IDX + 20]; 1362ec21e2ecSJeff Kirsher }; 1363ec21e2ecSJeff Kirsher 136466636287SRichard Cochran /* The gianfar_ptp module will set this variable */ 136566636287SRichard Cochran extern int gfar_phc_index; 136666636287SRichard Cochran 1367ec21e2ecSJeff Kirsher #endif /* __GIANFAR_H */ 1368