0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _SUNHME_H
0010 #define _SUNHME_H
0011
0012 #include <linux/pci.h>
0013
0014
0015 #define GREG_SWRESET 0x000UL
0016 #define GREG_CFG 0x004UL
0017 #define GREG_STAT 0x100UL
0018 #define GREG_IMASK 0x104UL
0019 #define GREG_REG_SIZE 0x108UL
0020
0021
0022 #define GREG_RESET_ETX 0x01
0023 #define GREG_RESET_ERX 0x02
0024 #define GREG_RESET_ALL 0x03
0025
0026
0027 #define GREG_CFG_BURSTMSK 0x03
0028 #define GREG_CFG_BURST16 0x00
0029 #define GREG_CFG_BURST32 0x01
0030 #define GREG_CFG_BURST64 0x02
0031 #define GREG_CFG_64BIT 0x04
0032 #define GREG_CFG_PARITY 0x08
0033 #define GREG_CFG_RESV 0x10
0034
0035
0036 #define GREG_STAT_GOTFRAME 0x00000001
0037 #define GREG_STAT_RCNTEXP 0x00000002
0038 #define GREG_STAT_ACNTEXP 0x00000004
0039 #define GREG_STAT_CCNTEXP 0x00000008
0040 #define GREG_STAT_LCNTEXP 0x00000010
0041 #define GREG_STAT_RFIFOVF 0x00000020
0042 #define GREG_STAT_CVCNTEXP 0x00000040
0043 #define GREG_STAT_STSTERR 0x00000080
0044 #define GREG_STAT_SENTFRAME 0x00000100
0045 #define GREG_STAT_TFIFO_UND 0x00000200
0046 #define GREG_STAT_MAXPKTERR 0x00000400
0047 #define GREG_STAT_NCNTEXP 0x00000800
0048 #define GREG_STAT_ECNTEXP 0x00001000
0049 #define GREG_STAT_LCCNTEXP 0x00002000
0050 #define GREG_STAT_FCNTEXP 0x00004000
0051 #define GREG_STAT_DTIMEXP 0x00008000
0052 #define GREG_STAT_RXTOHOST 0x00010000
0053 #define GREG_STAT_NORXD 0x00020000
0054 #define GREG_STAT_RXERR 0x00040000
0055 #define GREG_STAT_RXLATERR 0x00080000
0056 #define GREG_STAT_RXPERR 0x00100000
0057 #define GREG_STAT_RXTERR 0x00200000
0058 #define GREG_STAT_EOPERR 0x00400000
0059 #define GREG_STAT_MIFIRQ 0x00800000
0060 #define GREG_STAT_HOSTTOTX 0x01000000
0061 #define GREG_STAT_TXALL 0x02000000
0062 #define GREG_STAT_TXEACK 0x04000000
0063 #define GREG_STAT_TXLERR 0x08000000
0064 #define GREG_STAT_TXPERR 0x10000000
0065 #define GREG_STAT_TXTERR 0x20000000
0066 #define GREG_STAT_SLVERR 0x40000000
0067 #define GREG_STAT_SLVPERR 0x80000000
0068
0069
0070 #define GREG_STAT_ERRORS 0xfc7efefc
0071
0072
0073 #define GREG_IMASK_GOTFRAME 0x00000001
0074 #define GREG_IMASK_RCNTEXP 0x00000002
0075 #define GREG_IMASK_ACNTEXP 0x00000004
0076 #define GREG_IMASK_CCNTEXP 0x00000008
0077 #define GREG_IMASK_LCNTEXP 0x00000010
0078 #define GREG_IMASK_RFIFOVF 0x00000020
0079 #define GREG_IMASK_CVCNTEXP 0x00000040
0080 #define GREG_IMASK_STSTERR 0x00000080
0081 #define GREG_IMASK_SENTFRAME 0x00000100
0082 #define GREG_IMASK_TFIFO_UND 0x00000200
0083 #define GREG_IMASK_MAXPKTERR 0x00000400
0084 #define GREG_IMASK_NCNTEXP 0x00000800
0085 #define GREG_IMASK_ECNTEXP 0x00001000
0086 #define GREG_IMASK_LCCNTEXP 0x00002000
0087 #define GREG_IMASK_FCNTEXP 0x00004000
0088 #define GREG_IMASK_DTIMEXP 0x00008000
0089 #define GREG_IMASK_RXTOHOST 0x00010000
0090 #define GREG_IMASK_NORXD 0x00020000
0091 #define GREG_IMASK_RXERR 0x00040000
0092 #define GREG_IMASK_RXLATERR 0x00080000
0093 #define GREG_IMASK_RXPERR 0x00100000
0094 #define GREG_IMASK_RXTERR 0x00200000
0095 #define GREG_IMASK_EOPERR 0x00400000
0096 #define GREG_IMASK_MIFIRQ 0x00800000
0097 #define GREG_IMASK_HOSTTOTX 0x01000000
0098 #define GREG_IMASK_TXALL 0x02000000
0099 #define GREG_IMASK_TXEACK 0x04000000
0100 #define GREG_IMASK_TXLERR 0x08000000
0101 #define GREG_IMASK_TXPERR 0x10000000
0102 #define GREG_IMASK_TXTERR 0x20000000
0103 #define GREG_IMASK_SLVERR 0x40000000
0104 #define GREG_IMASK_SLVPERR 0x80000000
0105
0106
0107 #define ETX_PENDING 0x00UL
0108 #define ETX_CFG 0x04UL
0109 #define ETX_RING 0x08UL
0110 #define ETX_BBASE 0x0cUL
0111 #define ETX_BDISP 0x10UL
0112 #define ETX_FIFOWPTR 0x14UL
0113 #define ETX_FIFOSWPTR 0x18UL
0114 #define ETX_FIFORPTR 0x1cUL
0115 #define ETX_FIFOSRPTR 0x20UL
0116 #define ETX_FIFOPCNT 0x24UL
0117 #define ETX_SMACHINE 0x28UL
0118 #define ETX_RSIZE 0x2cUL
0119 #define ETX_BPTR 0x30UL
0120 #define ETX_REG_SIZE 0x34UL
0121
0122
0123 #define ETX_TP_DMAWAKEUP 0x00000001
0124
0125
0126 #define ETX_CFG_DMAENABLE 0x00000001
0127 #define ETX_CFG_FIFOTHRESH 0x000003fe
0128 #define ETX_CFG_IRQDAFTER 0x00000400
0129 #define ETX_CFG_IRQDBEFORE 0x00000000
0130
0131 #define ETX_RSIZE_SHIFT 4
0132
0133
0134 #define ERX_CFG 0x00UL
0135 #define ERX_RING 0x04UL
0136 #define ERX_BPTR 0x08UL
0137 #define ERX_FIFOWPTR 0x0cUL
0138 #define ERX_FIFOSWPTR 0x10UL
0139 #define ERX_FIFORPTR 0x14UL
0140 #define ERX_FIFOSRPTR 0x18UL
0141 #define ERX_SMACHINE 0x1cUL
0142 #define ERX_REG_SIZE 0x20UL
0143
0144
0145 #define ERX_CFG_DMAENABLE 0x00000001
0146 #define ERX_CFG_RESV1 0x00000006
0147 #define ERX_CFG_BYTEOFFSET 0x00000038
0148 #define ERX_CFG_RESV2 0x000001c0
0149 #define ERX_CFG_SIZE32 0x00000000
0150 #define ERX_CFG_SIZE64 0x00000200
0151 #define ERX_CFG_SIZE128 0x00000400
0152 #define ERX_CFG_SIZE256 0x00000600
0153 #define ERX_CFG_RESV3 0x0000f800
0154 #define ERX_CFG_CSUMSTART 0x007f0000
0155
0156
0157
0158 #define BMAC_XIFCFG 0x0000UL
0159
0160 #define BMAC_TXSWRESET 0x208UL
0161 #define BMAC_TXCFG 0x20cUL
0162 #define BMAC_IGAP1 0x210UL
0163 #define BMAC_IGAP2 0x214UL
0164 #define BMAC_ALIMIT 0x218UL
0165 #define BMAC_STIME 0x21cUL
0166 #define BMAC_PLEN 0x220UL
0167 #define BMAC_PPAT 0x224UL
0168 #define BMAC_TXSDELIM 0x228UL
0169 #define BMAC_JSIZE 0x22cUL
0170 #define BMAC_TXMAX 0x230UL
0171 #define BMAC_TXMIN 0x234UL
0172 #define BMAC_PATTEMPT 0x238UL
0173 #define BMAC_DTCTR 0x23cUL
0174 #define BMAC_NCCTR 0x240UL
0175 #define BMAC_FCCTR 0x244UL
0176 #define BMAC_EXCTR 0x248UL
0177 #define BMAC_LTCTR 0x24cUL
0178 #define BMAC_RSEED 0x250UL
0179 #define BMAC_TXSMACHINE 0x254UL
0180
0181 #define BMAC_RXSWRESET 0x308UL
0182 #define BMAC_RXCFG 0x30cUL
0183 #define BMAC_RXMAX 0x310UL
0184 #define BMAC_RXMIN 0x314UL
0185 #define BMAC_MACADDR2 0x318UL
0186 #define BMAC_MACADDR1 0x31cUL
0187 #define BMAC_MACADDR0 0x320UL
0188 #define BMAC_FRCTR 0x324UL
0189 #define BMAC_GLECTR 0x328UL
0190 #define BMAC_UNALECTR 0x32cUL
0191 #define BMAC_RCRCECTR 0x330UL
0192 #define BMAC_RXSMACHINE 0x334UL
0193 #define BMAC_RXCVALID 0x338UL
0194
0195 #define BMAC_HTABLE3 0x340UL
0196 #define BMAC_HTABLE2 0x344UL
0197 #define BMAC_HTABLE1 0x348UL
0198 #define BMAC_HTABLE0 0x34cUL
0199 #define BMAC_AFILTER2 0x350UL
0200 #define BMAC_AFILTER1 0x354UL
0201 #define BMAC_AFILTER0 0x358UL
0202 #define BMAC_AFMASK 0x35cUL
0203 #define BMAC_REG_SIZE 0x360UL
0204
0205
0206 #define BIGMAC_XCFG_ODENABLE 0x00000001
0207 #define BIGMAC_XCFG_XLBACK 0x00000002
0208 #define BIGMAC_XCFG_MLBACK 0x00000004
0209 #define BIGMAC_XCFG_MIIDISAB 0x00000008
0210 #define BIGMAC_XCFG_SQENABLE 0x00000010
0211 #define BIGMAC_XCFG_SQETWIN 0x000003e0
0212 #define BIGMAC_XCFG_LANCE 0x00000010
0213 #define BIGMAC_XCFG_LIPG0 0x000003e0
0214
0215
0216 #define BIGMAC_TXCFG_ENABLE 0x00000001
0217 #define BIGMAC_TXCFG_SMODE 0x00000020
0218 #define BIGMAC_TXCFG_CIGN 0x00000040
0219 #define BIGMAC_TXCFG_FCSOFF 0x00000080
0220 #define BIGMAC_TXCFG_DBACKOFF 0x00000100
0221 #define BIGMAC_TXCFG_FULLDPLX 0x00000200
0222 #define BIGMAC_TXCFG_DGIVEUP 0x00000400
0223
0224
0225 #define BIGMAC_RXCFG_ENABLE 0x00000001
0226 #define BIGMAC_RXCFG_PSTRIP 0x00000020
0227 #define BIGMAC_RXCFG_PMISC 0x00000040
0228 #define BIGMAC_RXCFG_DERR 0x00000080
0229 #define BIGMAC_RXCFG_DCRCS 0x00000100
0230 #define BIGMAC_RXCFG_REJME 0x00000200
0231 #define BIGMAC_RXCFG_PGRP 0x00000400
0232 #define BIGMAC_RXCFG_HENABLE 0x00000800
0233 #define BIGMAC_RXCFG_AENABLE 0x00001000
0234
0235
0236 #define TCVR_BBCLOCK 0x00UL
0237 #define TCVR_BBDATA 0x04UL
0238 #define TCVR_BBOENAB 0x08UL
0239 #define TCVR_FRAME 0x0cUL
0240 #define TCVR_CFG 0x10UL
0241 #define TCVR_IMASK 0x14UL
0242 #define TCVR_STATUS 0x18UL
0243 #define TCVR_SMACHINE 0x1cUL
0244 #define TCVR_REG_SIZE 0x20UL
0245
0246
0247 #define FRAME_WRITE 0x50020000
0248 #define FRAME_READ 0x60020000
0249
0250
0251 #define TCV_CFG_PSELECT 0x00000001
0252 #define TCV_CFG_PENABLE 0x00000002
0253 #define TCV_CFG_BENABLE 0x00000004
0254 #define TCV_CFG_PREGADDR 0x000000f8
0255 #define TCV_CFG_MDIO0 0x00000100
0256 #define TCV_CFG_MDIO1 0x00000200
0257 #define TCV_CFG_PDADDR 0x00007c00
0258
0259
0260 #define TCV_PADDR_ETX 0
0261 #define TCV_PADDR_ITX 1
0262
0263
0264 #define TCV_STAT_BASIC 0xffff0000
0265 #define TCV_STAT_NORMAL 0x0000ffff
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282 #define DP83840_CSCONFIG 0x17
0283
0284
0285 #define CSCONFIG_RESV1 0x0001
0286 #define CSCONFIG_LED4 0x0002
0287 #define CSCONFIG_LED1 0x0004
0288 #define CSCONFIG_RESV2 0x0008
0289 #define CSCONFIG_TCVDISAB 0x0010
0290 #define CSCONFIG_DFBYPASS 0x0020
0291 #define CSCONFIG_GLFORCE 0x0040
0292 #define CSCONFIG_CLKTRISTATE 0x0080
0293 #define CSCONFIG_RESV3 0x0700
0294 #define CSCONFIG_ENCODE 0x0800
0295 #define CSCONFIG_RENABLE 0x1000
0296 #define CSCONFIG_TCDISABLE 0x2000
0297 #define CSCONFIG_RESV4 0x4000
0298 #define CSCONFIG_NDISABLE 0x8000
0299
0300
0301
0302
0303
0304
0305
0306 typedef u32 __bitwise hme32;
0307
0308 struct happy_meal_rxd {
0309 hme32 rx_flags;
0310 hme32 rx_addr;
0311 };
0312
0313 #define RXFLAG_OWN 0x80000000
0314 #define RXFLAG_OVERFLOW 0x40000000
0315 #define RXFLAG_SIZE 0x3fff0000
0316 #define RXFLAG_CSUM 0x0000ffff
0317
0318 struct happy_meal_txd {
0319 hme32 tx_flags;
0320 hme32 tx_addr;
0321 };
0322
0323 #define TXFLAG_OWN 0x80000000
0324 #define TXFLAG_SOP 0x40000000
0325 #define TXFLAG_EOP 0x20000000
0326 #define TXFLAG_CSENABLE 0x10000000
0327 #define TXFLAG_CSLOCATION 0x0ff00000
0328 #define TXFLAG_CSBUFBEGIN 0x000fc000
0329 #define TXFLAG_SIZE 0x00003fff
0330
0331 #define TX_RING_SIZE 32
0332 #define RX_RING_SIZE 32
0333
0334 #if (TX_RING_SIZE < 16 || TX_RING_SIZE > 256 || (TX_RING_SIZE % 16) != 0)
0335 #error TX_RING_SIZE holds illegal value
0336 #endif
0337
0338 #define TX_RING_MAXSIZE 256
0339 #define RX_RING_MAXSIZE 256
0340
0341
0342 #if (RX_RING_SIZE == 32)
0343 #define ERX_CFG_DEFAULT(off) (ERX_CFG_DMAENABLE|((off)<<3)|ERX_CFG_SIZE32|((14/2)<<16))
0344 #else
0345 #if (RX_RING_SIZE == 64)
0346 #define ERX_CFG_DEFAULT(off) (ERX_CFG_DMAENABLE|((off)<<3)|ERX_CFG_SIZE64|((14/2)<<16))
0347 #else
0348 #if (RX_RING_SIZE == 128)
0349 #define ERX_CFG_DEFAULT(off) (ERX_CFG_DMAENABLE|((off)<<3)|ERX_CFG_SIZE128|((14/2)<<16))
0350 #else
0351 #if (RX_RING_SIZE == 256)
0352 #define ERX_CFG_DEFAULT(off) (ERX_CFG_DMAENABLE|((off)<<3)|ERX_CFG_SIZE256|((14/2)<<16))
0353 #else
0354 #error RX_RING_SIZE holds illegal value
0355 #endif
0356 #endif
0357 #endif
0358 #endif
0359
0360 #define NEXT_RX(num) (((num) + 1) & (RX_RING_SIZE - 1))
0361 #define NEXT_TX(num) (((num) + 1) & (TX_RING_SIZE - 1))
0362 #define PREV_RX(num) (((num) - 1) & (RX_RING_SIZE - 1))
0363 #define PREV_TX(num) (((num) - 1) & (TX_RING_SIZE - 1))
0364
0365 #define TX_BUFFS_AVAIL(hp) \
0366 (((hp)->tx_old <= (hp)->tx_new) ? \
0367 (hp)->tx_old + (TX_RING_SIZE - 1) - (hp)->tx_new : \
0368 (hp)->tx_old - (hp)->tx_new - 1)
0369
0370 #define RX_OFFSET 2
0371 #define RX_BUF_ALLOC_SIZE (1546 + RX_OFFSET + 64)
0372
0373 #define RX_COPY_THRESHOLD 256
0374
0375 struct hmeal_init_block {
0376 struct happy_meal_rxd happy_meal_rxd[RX_RING_MAXSIZE];
0377 struct happy_meal_txd happy_meal_txd[TX_RING_MAXSIZE];
0378 };
0379
0380 #define hblock_offset(mem, elem) \
0381 ((__u32)((unsigned long)(&(((struct hmeal_init_block *)0)->mem[elem]))))
0382
0383
0384 enum happy_transceiver {
0385 external = 0,
0386 internal = 1,
0387 none = 2,
0388 };
0389
0390
0391 enum happy_timer_state {
0392 arbwait = 0,
0393 lupwait = 1,
0394 ltrywait = 2,
0395 asleep = 3,
0396 };
0397
0398 struct quattro;
0399
0400
0401 struct happy_meal {
0402 void __iomem *gregs;
0403 struct hmeal_init_block *happy_block;
0404
0405 #if defined(CONFIG_SBUS) && defined(CONFIG_PCI)
0406 u32 (*read_desc32)(hme32 *);
0407 void (*write_txd)(struct happy_meal_txd *, u32, u32);
0408 void (*write_rxd)(struct happy_meal_rxd *, u32, u32);
0409 #endif
0410
0411
0412 void *happy_dev;
0413 struct device *dma_dev;
0414
0415 spinlock_t happy_lock;
0416
0417 struct sk_buff *rx_skbs[RX_RING_SIZE];
0418 struct sk_buff *tx_skbs[TX_RING_SIZE];
0419
0420 int rx_new, tx_new, rx_old, tx_old;
0421
0422 #if defined(CONFIG_SBUS) && defined(CONFIG_PCI)
0423 u32 (*read32)(void __iomem *);
0424 void (*write32)(void __iomem *, u32);
0425 #endif
0426
0427 void __iomem *etxregs;
0428 void __iomem *erxregs;
0429 void __iomem *bigmacregs;
0430 void __iomem *tcvregs;
0431
0432 dma_addr_t hblock_dvma;
0433 unsigned int happy_flags;
0434 int irq;
0435 enum happy_transceiver tcvr_type;
0436 unsigned int happy_bursts;
0437 unsigned int paddr;
0438 unsigned short hm_revision;
0439 unsigned short sw_bmcr;
0440 unsigned short sw_bmsr;
0441 unsigned short sw_physid1;
0442 unsigned short sw_physid2;
0443 unsigned short sw_advertise;
0444 unsigned short sw_lpa;
0445 unsigned short sw_expansion;
0446 unsigned short sw_csconfig;
0447 unsigned int auto_speed;
0448 unsigned int forced_speed;
0449 unsigned int poll_data;
0450 unsigned int poll_flag;
0451 unsigned int linkcheck;
0452 unsigned int lnkup;
0453 unsigned int lnkdown;
0454 unsigned int lnkcnt;
0455 struct timer_list happy_timer;
0456 enum happy_timer_state timer_state;
0457 unsigned int timer_ticks;
0458
0459 struct net_device *dev;
0460 struct quattro *qfe_parent;
0461 int qfe_ent;
0462 };
0463
0464
0465 #define HFLAG_POLL 0x00000001
0466 #define HFLAG_FENABLE 0x00000002
0467 #define HFLAG_LANCE 0x00000004
0468 #define HFLAG_RXENABLE 0x00000008
0469 #define HFLAG_AUTO 0x00000010
0470 #define HFLAG_FULL 0x00000020
0471 #define HFLAG_MACFULL 0x00000040
0472 #define HFLAG_POLLENABLE 0x00000080
0473 #define HFLAG_RXCV 0x00000100
0474 #define HFLAG_INIT 0x00000200
0475 #define HFLAG_LINKUP 0x00000400
0476 #define HFLAG_PCI 0x00000800
0477 #define HFLAG_QUATTRO 0x00001000
0478
0479 #define HFLAG_20_21 (HFLAG_POLLENABLE | HFLAG_FENABLE)
0480 #define HFLAG_NOT_A0 (HFLAG_POLLENABLE | HFLAG_FENABLE | HFLAG_LANCE | HFLAG_RXCV)
0481
0482
0483 struct quattro {
0484 struct net_device *happy_meals[4];
0485
0486
0487 void *quattro_dev;
0488
0489 struct quattro *next;
0490
0491
0492 #ifdef CONFIG_SBUS
0493 struct linux_prom_ranges ranges[8];
0494 #endif
0495 int nranges;
0496 };
0497
0498
0499 #define ALIGNED_RX_SKB_ADDR(addr) \
0500 ((((unsigned long)(addr) + (64UL - 1UL)) & ~(64UL - 1UL)) - (unsigned long)(addr))
0501 #define happy_meal_alloc_skb(__length, __gfp_flags) \
0502 ({ struct sk_buff *__skb; \
0503 __skb = alloc_skb((__length) + 64, (__gfp_flags)); \
0504 if(__skb) { \
0505 int __offset = (int) ALIGNED_RX_SKB_ADDR(__skb->data); \
0506 if(__offset) \
0507 skb_reserve(__skb, __offset); \
0508 } \
0509 __skb; \
0510 })
0511
0512 #endif