1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Network device driver for Cell Processor-Based Blade and Celleb platform 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * (C) Copyright IBM Corp. 2005 6*4882a593Smuzhiyun * (C) Copyright 2006 TOSHIBA CORPORATION 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Authors : Utz Bacher <utz.bacher@de.ibm.com> 9*4882a593Smuzhiyun * Jens Osterkamp <Jens.Osterkamp@de.ibm.com> 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef _SPIDER_NET_H 13*4882a593Smuzhiyun #define _SPIDER_NET_H 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define VERSION "2.0 B" 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <linux/sungem_phy.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun int spider_net_stop(struct net_device *netdev); 20*4882a593Smuzhiyun int spider_net_open(struct net_device *netdev); 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun extern const struct ethtool_ops spider_net_ethtool_ops; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun extern char spider_net_driver_name[]; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define SPIDER_NET_MAX_FRAME 2312 27*4882a593Smuzhiyun #define SPIDER_NET_MAX_MTU 2294 28*4882a593Smuzhiyun #define SPIDER_NET_MIN_MTU 64 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define SPIDER_NET_RXBUF_ALIGN 128 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define SPIDER_NET_RX_DESCRIPTORS_DEFAULT 256 33*4882a593Smuzhiyun #define SPIDER_NET_RX_DESCRIPTORS_MIN 16 34*4882a593Smuzhiyun #define SPIDER_NET_RX_DESCRIPTORS_MAX 512 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define SPIDER_NET_TX_DESCRIPTORS_DEFAULT 256 37*4882a593Smuzhiyun #define SPIDER_NET_TX_DESCRIPTORS_MIN 16 38*4882a593Smuzhiyun #define SPIDER_NET_TX_DESCRIPTORS_MAX 512 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define SPIDER_NET_TX_TIMER (HZ/5) 41*4882a593Smuzhiyun #define SPIDER_NET_ANEG_TIMER (HZ) 42*4882a593Smuzhiyun #define SPIDER_NET_ANEG_TIMEOUT 5 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define SPIDER_NET_RX_CSUM_DEFAULT 1 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define SPIDER_NET_WATCHDOG_TIMEOUT 50*HZ 47*4882a593Smuzhiyun #define SPIDER_NET_NAPI_WEIGHT 64 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define SPIDER_NET_FIRMWARE_SEQS 6 50*4882a593Smuzhiyun #define SPIDER_NET_FIRMWARE_SEQWORDS 1024 51*4882a593Smuzhiyun #define SPIDER_NET_FIRMWARE_LEN (SPIDER_NET_FIRMWARE_SEQS * \ 52*4882a593Smuzhiyun SPIDER_NET_FIRMWARE_SEQWORDS * \ 53*4882a593Smuzhiyun sizeof(u32)) 54*4882a593Smuzhiyun #define SPIDER_NET_FIRMWARE_NAME "spider_fw.bin" 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /** spider_net SMMIO registers */ 57*4882a593Smuzhiyun #define SPIDER_NET_GHIINT0STS 0x00000000 58*4882a593Smuzhiyun #define SPIDER_NET_GHIINT1STS 0x00000004 59*4882a593Smuzhiyun #define SPIDER_NET_GHIINT2STS 0x00000008 60*4882a593Smuzhiyun #define SPIDER_NET_GHIINT0MSK 0x00000010 61*4882a593Smuzhiyun #define SPIDER_NET_GHIINT1MSK 0x00000014 62*4882a593Smuzhiyun #define SPIDER_NET_GHIINT2MSK 0x00000018 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #define SPIDER_NET_GRESUMINTNUM 0x00000020 65*4882a593Smuzhiyun #define SPIDER_NET_GREINTNUM 0x00000024 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define SPIDER_NET_GFFRMNUM 0x00000028 68*4882a593Smuzhiyun #define SPIDER_NET_GFAFRMNUM 0x0000002c 69*4882a593Smuzhiyun #define SPIDER_NET_GFBFRMNUM 0x00000030 70*4882a593Smuzhiyun #define SPIDER_NET_GFCFRMNUM 0x00000034 71*4882a593Smuzhiyun #define SPIDER_NET_GFDFRMNUM 0x00000038 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* clear them (don't use it) */ 74*4882a593Smuzhiyun #define SPIDER_NET_GFREECNNUM 0x0000003c 75*4882a593Smuzhiyun #define SPIDER_NET_GONETIMENUM 0x00000040 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define SPIDER_NET_GTOUTFRMNUM 0x00000044 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #define SPIDER_NET_GTXMDSET 0x00000050 80*4882a593Smuzhiyun #define SPIDER_NET_GPCCTRL 0x00000054 81*4882a593Smuzhiyun #define SPIDER_NET_GRXMDSET 0x00000058 82*4882a593Smuzhiyun #define SPIDER_NET_GIPSECINIT 0x0000005c 83*4882a593Smuzhiyun #define SPIDER_NET_GFTRESTRT 0x00000060 84*4882a593Smuzhiyun #define SPIDER_NET_GRXDMAEN 0x00000064 85*4882a593Smuzhiyun #define SPIDER_NET_GMRWOLCTRL 0x00000068 86*4882a593Smuzhiyun #define SPIDER_NET_GPCWOPCMD 0x0000006c 87*4882a593Smuzhiyun #define SPIDER_NET_GPCROPCMD 0x00000070 88*4882a593Smuzhiyun #define SPIDER_NET_GTTFRMCNT 0x00000078 89*4882a593Smuzhiyun #define SPIDER_NET_GTESTMD 0x0000007c 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define SPIDER_NET_GSINIT 0x00000080 92*4882a593Smuzhiyun #define SPIDER_NET_GSnPRGADR 0x00000084 93*4882a593Smuzhiyun #define SPIDER_NET_GSnPRGDAT 0x00000088 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #define SPIDER_NET_GMACOPEMD 0x00000100 96*4882a593Smuzhiyun #define SPIDER_NET_GMACLENLMT 0x00000108 97*4882a593Smuzhiyun #define SPIDER_NET_GMACST 0x00000110 98*4882a593Smuzhiyun #define SPIDER_NET_GMACINTEN 0x00000118 99*4882a593Smuzhiyun #define SPIDER_NET_GMACPHYCTRL 0x00000120 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define SPIDER_NET_GMACAPAUSE 0x00000154 102*4882a593Smuzhiyun #define SPIDER_NET_GMACTXPAUSE 0x00000164 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #define SPIDER_NET_GMACMODE 0x000001b0 105*4882a593Smuzhiyun #define SPIDER_NET_GMACBSTLMT 0x000001b4 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun #define SPIDER_NET_GMACUNIMACU 0x000001c0 108*4882a593Smuzhiyun #define SPIDER_NET_GMACUNIMACL 0x000001c8 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #define SPIDER_NET_GMRMHFILnR 0x00000400 111*4882a593Smuzhiyun #define SPIDER_NET_MULTICAST_HASHES 256 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #define SPIDER_NET_GMRUAFILnR 0x00000500 114*4882a593Smuzhiyun #define SPIDER_NET_GMRUA0FIL15R 0x00000578 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define SPIDER_NET_GTTQMSK 0x00000934 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* RX DMA controller registers, all 0x00000a.. are for DMA controller A, 119*4882a593Smuzhiyun * 0x00000b.. for DMA controller B, etc. */ 120*4882a593Smuzhiyun #define SPIDER_NET_GDADCHA 0x00000a00 121*4882a593Smuzhiyun #define SPIDER_NET_GDADMACCNTR 0x00000a04 122*4882a593Smuzhiyun #define SPIDER_NET_GDACTDPA 0x00000a08 123*4882a593Smuzhiyun #define SPIDER_NET_GDACTDCNT 0x00000a0c 124*4882a593Smuzhiyun #define SPIDER_NET_GDACDBADDR 0x00000a20 125*4882a593Smuzhiyun #define SPIDER_NET_GDACDBSIZE 0x00000a24 126*4882a593Smuzhiyun #define SPIDER_NET_GDACNEXTDA 0x00000a28 127*4882a593Smuzhiyun #define SPIDER_NET_GDACCOMST 0x00000a2c 128*4882a593Smuzhiyun #define SPIDER_NET_GDAWBCOMST 0x00000a30 129*4882a593Smuzhiyun #define SPIDER_NET_GDAWBRSIZE 0x00000a34 130*4882a593Smuzhiyun #define SPIDER_NET_GDAWBVSIZE 0x00000a38 131*4882a593Smuzhiyun #define SPIDER_NET_GDAWBTRST 0x00000a3c 132*4882a593Smuzhiyun #define SPIDER_NET_GDAWBTRERR 0x00000a40 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun /* TX DMA controller registers */ 135*4882a593Smuzhiyun #define SPIDER_NET_GDTDCHA 0x00000e00 136*4882a593Smuzhiyun #define SPIDER_NET_GDTDMACCNTR 0x00000e04 137*4882a593Smuzhiyun #define SPIDER_NET_GDTCDPA 0x00000e08 138*4882a593Smuzhiyun #define SPIDER_NET_GDTDMASEL 0x00000e14 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define SPIDER_NET_ECMODE 0x00000f00 141*4882a593Smuzhiyun /* clock and reset control register */ 142*4882a593Smuzhiyun #define SPIDER_NET_CKRCTRL 0x00000ff0 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /** SCONFIG registers */ 145*4882a593Smuzhiyun #define SPIDER_NET_SCONFIG_IOACTE 0x00002810 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun /** interrupt mask registers */ 148*4882a593Smuzhiyun #define SPIDER_NET_INT0_MASK_VALUE 0x3f7fe2c7 149*4882a593Smuzhiyun #define SPIDER_NET_INT1_MASK_VALUE 0x0000fff2 150*4882a593Smuzhiyun #define SPIDER_NET_INT2_MASK_VALUE 0x000003f1 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /* we rely on flagged descriptor interrupts */ 153*4882a593Smuzhiyun #define SPIDER_NET_FRAMENUM_VALUE 0x00000000 154*4882a593Smuzhiyun /* set this first, then the FRAMENUM_VALUE */ 155*4882a593Smuzhiyun #define SPIDER_NET_GFXFRAMES_VALUE 0x00000000 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun #define SPIDER_NET_STOP_SEQ_VALUE 0x00000000 158*4882a593Smuzhiyun #define SPIDER_NET_RUN_SEQ_VALUE 0x0000007e 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define SPIDER_NET_PHY_CTRL_VALUE 0x00040040 161*4882a593Smuzhiyun /* #define SPIDER_NET_PHY_CTRL_VALUE 0x01070080*/ 162*4882a593Smuzhiyun #define SPIDER_NET_RXMODE_VALUE 0x00000011 163*4882a593Smuzhiyun /* auto retransmission in case of MAC aborts */ 164*4882a593Smuzhiyun #define SPIDER_NET_TXMODE_VALUE 0x00010000 165*4882a593Smuzhiyun #define SPIDER_NET_RESTART_VALUE 0x00000000 166*4882a593Smuzhiyun #define SPIDER_NET_WOL_VALUE 0x00001111 167*4882a593Smuzhiyun #if 0 168*4882a593Smuzhiyun #define SPIDER_NET_WOL_VALUE 0x00000000 169*4882a593Smuzhiyun #endif 170*4882a593Smuzhiyun #define SPIDER_NET_IPSECINIT_VALUE 0x6f716f71 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* pause frames: automatic, no upper retransmission count */ 173*4882a593Smuzhiyun /* outside loopback mode: ETOMOD signal dont matter, not connected */ 174*4882a593Smuzhiyun /* ETOMOD signal is brought to PHY reset. bit 2 must be 1 in Celleb */ 175*4882a593Smuzhiyun #define SPIDER_NET_OPMODE_VALUE 0x00000067 176*4882a593Smuzhiyun /*#define SPIDER_NET_OPMODE_VALUE 0x001b0062*/ 177*4882a593Smuzhiyun #define SPIDER_NET_LENLMT_VALUE 0x00000908 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun #define SPIDER_NET_MACAPAUSE_VALUE 0x00000800 /* about 1 ms */ 180*4882a593Smuzhiyun #define SPIDER_NET_TXPAUSE_VALUE 0x00000000 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun #define SPIDER_NET_MACMODE_VALUE 0x00000001 183*4882a593Smuzhiyun #define SPIDER_NET_BURSTLMT_VALUE 0x00000200 /* about 16 us */ 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /* DMAC control register GDMACCNTR 186*4882a593Smuzhiyun * 187*4882a593Smuzhiyun * 1(0) enable r/tx dma 188*4882a593Smuzhiyun * 0000000 fixed to 0 189*4882a593Smuzhiyun * 190*4882a593Smuzhiyun * 000000 fixed to 0 191*4882a593Smuzhiyun * 0(1) en/disable descr writeback on force end 192*4882a593Smuzhiyun * 0(1) force end 193*4882a593Smuzhiyun * 194*4882a593Smuzhiyun * 000000 fixed to 0 195*4882a593Smuzhiyun * 00 burst alignment: 128 bytes 196*4882a593Smuzhiyun * 11 burst alignment: 1024 bytes 197*4882a593Smuzhiyun * 198*4882a593Smuzhiyun * 00000 fixed to 0 199*4882a593Smuzhiyun * 0 descr writeback size 32 bytes 200*4882a593Smuzhiyun * 0(1) descr chain end interrupt enable 201*4882a593Smuzhiyun * 0(1) descr status writeback enable */ 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun /* to set RX_DMA_EN */ 204*4882a593Smuzhiyun #define SPIDER_NET_DMA_RX_VALUE 0x80000000 205*4882a593Smuzhiyun #define SPIDER_NET_DMA_RX_FEND_VALUE 0x00030003 206*4882a593Smuzhiyun /* to set TX_DMA_EN */ 207*4882a593Smuzhiyun #define SPIDER_NET_TX_DMA_EN 0x80000000 208*4882a593Smuzhiyun #define SPIDER_NET_GDTBSTA 0x00000300 209*4882a593Smuzhiyun #define SPIDER_NET_GDTDCEIDIS 0x00000002 210*4882a593Smuzhiyun #define SPIDER_NET_DMA_TX_VALUE SPIDER_NET_TX_DMA_EN | \ 211*4882a593Smuzhiyun SPIDER_NET_GDTDCEIDIS | \ 212*4882a593Smuzhiyun SPIDER_NET_GDTBSTA 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define SPIDER_NET_DMA_TX_FEND_VALUE 0x00030003 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun /* SPIDER_NET_UA_DESCR_VALUE is OR'ed with the unicast address */ 217*4882a593Smuzhiyun #define SPIDER_NET_UA_DESCR_VALUE 0x00080000 218*4882a593Smuzhiyun #define SPIDER_NET_PROMISC_VALUE 0x00080000 219*4882a593Smuzhiyun #define SPIDER_NET_NONPROMISC_VALUE 0x00000000 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun #define SPIDER_NET_DMASEL_VALUE 0x00000001 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun #define SPIDER_NET_ECMODE_VALUE 0x00000000 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun #define SPIDER_NET_CKRCTRL_RUN_VALUE 0x1fff010f 226*4882a593Smuzhiyun #define SPIDER_NET_CKRCTRL_STOP_VALUE 0x0000010f 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun #define SPIDER_NET_SBIMSTATE_VALUE 0x00000000 229*4882a593Smuzhiyun #define SPIDER_NET_SBTMSTATE_VALUE 0x00000000 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* SPIDER_NET_GHIINT0STS bits, in reverse order so that they can be used 232*4882a593Smuzhiyun * with 1 << SPIDER_NET_... */ 233*4882a593Smuzhiyun enum spider_net_int0_status { 234*4882a593Smuzhiyun SPIDER_NET_GPHYINT = 0, 235*4882a593Smuzhiyun SPIDER_NET_GMAC2INT, 236*4882a593Smuzhiyun SPIDER_NET_GMAC1INT, 237*4882a593Smuzhiyun SPIDER_NET_GIPSINT, 238*4882a593Smuzhiyun SPIDER_NET_GFIFOINT, 239*4882a593Smuzhiyun SPIDER_NET_GDMACINT, 240*4882a593Smuzhiyun SPIDER_NET_GSYSINT, 241*4882a593Smuzhiyun SPIDER_NET_GPWOPCMPINT, 242*4882a593Smuzhiyun SPIDER_NET_GPROPCMPINT, 243*4882a593Smuzhiyun SPIDER_NET_GPWFFINT, 244*4882a593Smuzhiyun SPIDER_NET_GRMDADRINT, 245*4882a593Smuzhiyun SPIDER_NET_GRMARPINT, 246*4882a593Smuzhiyun SPIDER_NET_GRMMPINT, 247*4882a593Smuzhiyun SPIDER_NET_GDTDEN0INT, 248*4882a593Smuzhiyun SPIDER_NET_GDDDEN0INT, 249*4882a593Smuzhiyun SPIDER_NET_GDCDEN0INT, 250*4882a593Smuzhiyun SPIDER_NET_GDBDEN0INT, 251*4882a593Smuzhiyun SPIDER_NET_GDADEN0INT, 252*4882a593Smuzhiyun SPIDER_NET_GDTFDCINT, 253*4882a593Smuzhiyun SPIDER_NET_GDDFDCINT, 254*4882a593Smuzhiyun SPIDER_NET_GDCFDCINT, 255*4882a593Smuzhiyun SPIDER_NET_GDBFDCINT, 256*4882a593Smuzhiyun SPIDER_NET_GDAFDCINT, 257*4882a593Smuzhiyun SPIDER_NET_GTTEDINT, 258*4882a593Smuzhiyun SPIDER_NET_GDTDCEINT, 259*4882a593Smuzhiyun SPIDER_NET_GRFDNMINT, 260*4882a593Smuzhiyun SPIDER_NET_GRFCNMINT, 261*4882a593Smuzhiyun SPIDER_NET_GRFBNMINT, 262*4882a593Smuzhiyun SPIDER_NET_GRFANMINT, 263*4882a593Smuzhiyun SPIDER_NET_GRFNMINT, 264*4882a593Smuzhiyun SPIDER_NET_G1TMCNTINT, 265*4882a593Smuzhiyun SPIDER_NET_GFREECNTINT 266*4882a593Smuzhiyun }; 267*4882a593Smuzhiyun /* GHIINT1STS bits */ 268*4882a593Smuzhiyun enum spider_net_int1_status { 269*4882a593Smuzhiyun SPIDER_NET_GTMFLLINT = 0, 270*4882a593Smuzhiyun SPIDER_NET_GRMFLLINT, 271*4882a593Smuzhiyun SPIDER_NET_GTMSHTINT, 272*4882a593Smuzhiyun SPIDER_NET_GDTINVDINT, 273*4882a593Smuzhiyun SPIDER_NET_GRFDFLLINT, 274*4882a593Smuzhiyun SPIDER_NET_GDDDCEINT, 275*4882a593Smuzhiyun SPIDER_NET_GDDINVDINT, 276*4882a593Smuzhiyun SPIDER_NET_GRFCFLLINT, 277*4882a593Smuzhiyun SPIDER_NET_GDCDCEINT, 278*4882a593Smuzhiyun SPIDER_NET_GDCINVDINT, 279*4882a593Smuzhiyun SPIDER_NET_GRFBFLLINT, 280*4882a593Smuzhiyun SPIDER_NET_GDBDCEINT, 281*4882a593Smuzhiyun SPIDER_NET_GDBINVDINT, 282*4882a593Smuzhiyun SPIDER_NET_GRFAFLLINT, 283*4882a593Smuzhiyun SPIDER_NET_GDADCEINT, 284*4882a593Smuzhiyun SPIDER_NET_GDAINVDINT, 285*4882a593Smuzhiyun SPIDER_NET_GDTRSERINT, 286*4882a593Smuzhiyun SPIDER_NET_GDDRSERINT, 287*4882a593Smuzhiyun SPIDER_NET_GDCRSERINT, 288*4882a593Smuzhiyun SPIDER_NET_GDBRSERINT, 289*4882a593Smuzhiyun SPIDER_NET_GDARSERINT, 290*4882a593Smuzhiyun SPIDER_NET_GDSERINT, 291*4882a593Smuzhiyun SPIDER_NET_GDTPTERINT, 292*4882a593Smuzhiyun SPIDER_NET_GDDPTERINT, 293*4882a593Smuzhiyun SPIDER_NET_GDCPTERINT, 294*4882a593Smuzhiyun SPIDER_NET_GDBPTERINT, 295*4882a593Smuzhiyun SPIDER_NET_GDAPTERINT 296*4882a593Smuzhiyun }; 297*4882a593Smuzhiyun /* GHIINT2STS bits */ 298*4882a593Smuzhiyun enum spider_net_int2_status { 299*4882a593Smuzhiyun SPIDER_NET_GPROPERINT = 0, 300*4882a593Smuzhiyun SPIDER_NET_GMCTCRSNGINT, 301*4882a593Smuzhiyun SPIDER_NET_GMCTLCOLINT, 302*4882a593Smuzhiyun SPIDER_NET_GMCTTMOTINT, 303*4882a593Smuzhiyun SPIDER_NET_GMCRCAERINT, 304*4882a593Smuzhiyun SPIDER_NET_GMCRCALERINT, 305*4882a593Smuzhiyun SPIDER_NET_GMCRALNERINT, 306*4882a593Smuzhiyun SPIDER_NET_GMCROVRINT, 307*4882a593Smuzhiyun SPIDER_NET_GMCRRNTINT, 308*4882a593Smuzhiyun SPIDER_NET_GMCRRXERINT, 309*4882a593Smuzhiyun SPIDER_NET_GTITCSERINT, 310*4882a593Smuzhiyun SPIDER_NET_GTIFMTERINT, 311*4882a593Smuzhiyun SPIDER_NET_GTIPKTRVKINT, 312*4882a593Smuzhiyun SPIDER_NET_GTISPINGINT, 313*4882a593Smuzhiyun SPIDER_NET_GTISADNGINT, 314*4882a593Smuzhiyun SPIDER_NET_GTISPDNGINT, 315*4882a593Smuzhiyun SPIDER_NET_GRIFMTERINT, 316*4882a593Smuzhiyun SPIDER_NET_GRIPKTRVKINT, 317*4882a593Smuzhiyun SPIDER_NET_GRISPINGINT, 318*4882a593Smuzhiyun SPIDER_NET_GRISADNGINT, 319*4882a593Smuzhiyun SPIDER_NET_GRISPDNGINT 320*4882a593Smuzhiyun }; 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun #define SPIDER_NET_TXINT (1 << SPIDER_NET_GDTFDCINT) 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun /* We rely on flagged descriptor interrupts */ 325*4882a593Smuzhiyun #define SPIDER_NET_RXINT ( (1 << SPIDER_NET_GDAFDCINT) ) 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun #define SPIDER_NET_LINKINT ( 1 << SPIDER_NET_GMAC2INT ) 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun #define SPIDER_NET_ERRINT ( 0xffffffff & \ 330*4882a593Smuzhiyun (~SPIDER_NET_TXINT) & \ 331*4882a593Smuzhiyun (~SPIDER_NET_RXINT) & \ 332*4882a593Smuzhiyun (~SPIDER_NET_LINKINT) ) 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun #define SPIDER_NET_GPREXEC 0x80000000 335*4882a593Smuzhiyun #define SPIDER_NET_GPRDAT_MASK 0x0000ffff 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun #define SPIDER_NET_DMAC_NOINTR_COMPLETE 0x00800000 338*4882a593Smuzhiyun #define SPIDER_NET_DMAC_TXFRMTL 0x00040000 339*4882a593Smuzhiyun #define SPIDER_NET_DMAC_TCP 0x00020000 340*4882a593Smuzhiyun #define SPIDER_NET_DMAC_UDP 0x00030000 341*4882a593Smuzhiyun #define SPIDER_NET_TXDCEST 0x08000000 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RXFDIS 0x00000001 344*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RXDCEIS 0x00000002 345*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RXDEN0IS 0x00000004 346*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RXINVDIS 0x00000008 347*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RXRERRIS 0x00000010 348*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RXFDCIMS 0x00000100 349*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RXDCEIMS 0x00000200 350*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RXDEN0IMS 0x00000400 351*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RXINVDIMS 0x00000800 352*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RXRERRMIS 0x00001000 353*4882a593Smuzhiyun #define SPIDER_NET_DESCR_UNUSED 0x077fe0e0 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun #define SPIDER_NET_DESCR_IND_PROC_MASK 0xF0000000 356*4882a593Smuzhiyun #define SPIDER_NET_DESCR_COMPLETE 0x00000000 /* used in rx and tx */ 357*4882a593Smuzhiyun #define SPIDER_NET_DESCR_RESPONSE_ERROR 0x10000000 /* used in rx and tx */ 358*4882a593Smuzhiyun #define SPIDER_NET_DESCR_PROTECTION_ERROR 0x20000000 /* used in rx and tx */ 359*4882a593Smuzhiyun #define SPIDER_NET_DESCR_FRAME_END 0x40000000 /* used in rx */ 360*4882a593Smuzhiyun #define SPIDER_NET_DESCR_FORCE_END 0x50000000 /* used in rx and tx */ 361*4882a593Smuzhiyun #define SPIDER_NET_DESCR_CARDOWNED 0xA0000000 /* used in rx and tx */ 362*4882a593Smuzhiyun #define SPIDER_NET_DESCR_NOT_IN_USE 0xF0000000 363*4882a593Smuzhiyun #define SPIDER_NET_DESCR_TXDESFLG 0x00800000 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun #define SPIDER_NET_DESCR_BAD_STATUS (SPIDER_NET_DESCR_RXDEN0IS | \ 366*4882a593Smuzhiyun SPIDER_NET_DESCR_RXRERRIS | \ 367*4882a593Smuzhiyun SPIDER_NET_DESCR_RXDEN0IMS | \ 368*4882a593Smuzhiyun SPIDER_NET_DESCR_RXINVDIMS | \ 369*4882a593Smuzhiyun SPIDER_NET_DESCR_RXRERRMIS | \ 370*4882a593Smuzhiyun SPIDER_NET_DESCR_UNUSED) 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun /* Descriptor, as defined by the hardware */ 373*4882a593Smuzhiyun struct spider_net_hw_descr { 374*4882a593Smuzhiyun u32 buf_addr; 375*4882a593Smuzhiyun u32 buf_size; 376*4882a593Smuzhiyun u32 next_descr_addr; 377*4882a593Smuzhiyun u32 dmac_cmd_status; 378*4882a593Smuzhiyun u32 result_size; 379*4882a593Smuzhiyun u32 valid_size; /* all zeroes for tx */ 380*4882a593Smuzhiyun u32 data_status; 381*4882a593Smuzhiyun u32 data_error; /* all zeroes for tx */ 382*4882a593Smuzhiyun } __attribute__((aligned(32))); 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun struct spider_net_descr { 385*4882a593Smuzhiyun struct spider_net_hw_descr *hwdescr; 386*4882a593Smuzhiyun struct sk_buff *skb; 387*4882a593Smuzhiyun u32 bus_addr; 388*4882a593Smuzhiyun struct spider_net_descr *next; 389*4882a593Smuzhiyun struct spider_net_descr *prev; 390*4882a593Smuzhiyun }; 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun struct spider_net_descr_chain { 393*4882a593Smuzhiyun spinlock_t lock; 394*4882a593Smuzhiyun struct spider_net_descr *head; 395*4882a593Smuzhiyun struct spider_net_descr *tail; 396*4882a593Smuzhiyun struct spider_net_descr *ring; 397*4882a593Smuzhiyun int num_desc; 398*4882a593Smuzhiyun struct spider_net_hw_descr *hwring; 399*4882a593Smuzhiyun dma_addr_t dma_addr; 400*4882a593Smuzhiyun }; 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun /* descriptor data_status bits */ 403*4882a593Smuzhiyun #define SPIDER_NET_RX_IPCHK 29 404*4882a593Smuzhiyun #define SPIDER_NET_RX_TCPCHK 28 405*4882a593Smuzhiyun #define SPIDER_NET_VLAN_PACKET 21 406*4882a593Smuzhiyun #define SPIDER_NET_DATA_STATUS_CKSUM_MASK ( (1 << SPIDER_NET_RX_IPCHK) | \ 407*4882a593Smuzhiyun (1 << SPIDER_NET_RX_TCPCHK) ) 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun /* descriptor data_error bits */ 410*4882a593Smuzhiyun #define SPIDER_NET_RX_IPCHKERR 27 411*4882a593Smuzhiyun #define SPIDER_NET_RX_RXTCPCHKERR 28 412*4882a593Smuzhiyun 413*4882a593Smuzhiyun #define SPIDER_NET_DATA_ERR_CKSUM_MASK (1 << SPIDER_NET_RX_IPCHKERR) 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun /* the cases we don't pass the packet to the stack. 416*4882a593Smuzhiyun * 701b8000 would be correct, but every packets gets that flag */ 417*4882a593Smuzhiyun #define SPIDER_NET_DESTROY_RX_FLAGS 0x700b8000 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun #define SPIDER_NET_DEFAULT_MSG ( NETIF_MSG_DRV | \ 420*4882a593Smuzhiyun NETIF_MSG_PROBE | \ 421*4882a593Smuzhiyun NETIF_MSG_LINK | \ 422*4882a593Smuzhiyun NETIF_MSG_TIMER | \ 423*4882a593Smuzhiyun NETIF_MSG_IFDOWN | \ 424*4882a593Smuzhiyun NETIF_MSG_IFUP | \ 425*4882a593Smuzhiyun NETIF_MSG_RX_ERR | \ 426*4882a593Smuzhiyun NETIF_MSG_TX_ERR | \ 427*4882a593Smuzhiyun NETIF_MSG_TX_QUEUED | \ 428*4882a593Smuzhiyun NETIF_MSG_INTR | \ 429*4882a593Smuzhiyun NETIF_MSG_TX_DONE | \ 430*4882a593Smuzhiyun NETIF_MSG_RX_STATUS | \ 431*4882a593Smuzhiyun NETIF_MSG_PKTDATA | \ 432*4882a593Smuzhiyun NETIF_MSG_HW | \ 433*4882a593Smuzhiyun NETIF_MSG_WOL ) 434*4882a593Smuzhiyun 435*4882a593Smuzhiyun struct spider_net_extra_stats { 436*4882a593Smuzhiyun unsigned long rx_desc_error; 437*4882a593Smuzhiyun unsigned long tx_timeouts; 438*4882a593Smuzhiyun unsigned long alloc_rx_skb_error; 439*4882a593Smuzhiyun unsigned long rx_iommu_map_error; 440*4882a593Smuzhiyun unsigned long tx_iommu_map_error; 441*4882a593Smuzhiyun unsigned long rx_desc_unk_state; 442*4882a593Smuzhiyun }; 443*4882a593Smuzhiyun 444*4882a593Smuzhiyun struct spider_net_card { 445*4882a593Smuzhiyun struct net_device *netdev; 446*4882a593Smuzhiyun struct pci_dev *pdev; 447*4882a593Smuzhiyun struct mii_phy phy; 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun struct napi_struct napi; 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun int medium; 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun void __iomem *regs; 454*4882a593Smuzhiyun 455*4882a593Smuzhiyun struct spider_net_descr_chain tx_chain; 456*4882a593Smuzhiyun struct spider_net_descr_chain rx_chain; 457*4882a593Smuzhiyun struct spider_net_descr *low_watermark; 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun int aneg_count; 460*4882a593Smuzhiyun struct timer_list aneg_timer; 461*4882a593Smuzhiyun struct timer_list tx_timer; 462*4882a593Smuzhiyun struct work_struct tx_timeout_task; 463*4882a593Smuzhiyun atomic_t tx_timeout_task_counter; 464*4882a593Smuzhiyun wait_queue_head_t waitq; 465*4882a593Smuzhiyun int num_rx_ints; 466*4882a593Smuzhiyun int ignore_rx_ramfull; 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun /* for ethtool */ 469*4882a593Smuzhiyun int msg_enable; 470*4882a593Smuzhiyun struct spider_net_extra_stats spider_stats; 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun /* Must be last item in struct */ 473*4882a593Smuzhiyun struct spider_net_descr darray[]; 474*4882a593Smuzhiyun }; 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun #endif 477