|
|
1.1 ! root 1: /* ! 2: * JMicron JMC2x0 series PCIe Ethernet gPXE Device Driver ! 3: * ! 4: * Copyright 2010 Guo-Fu Tseng <[email protected]> ! 5: * ! 6: * This program is free software; you can redistribute it and/or modify ! 7: * it under the terms of the GNU General Public License as published by ! 8: * the Free Software Foundation; either version 2 of the License. ! 9: * ! 10: * This program is distributed in the hope that it will be useful, ! 11: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 13: * GNU General Public License for more details. ! 14: * ! 15: * You should have received a copy of the GNU General Public License ! 16: * along with this program; if not, write to the Free Software ! 17: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 18: * ! 19: */ ! 20: FILE_LICENCE ( GPL2_OR_LATER ); ! 21: ! 22: #ifndef __JME_H_INCLUDED__ ! 23: #define __JME_H_INCLUDED__ ! 24: ! 25: #define PCI_VENDOR_ID_JMICRON 0x197b ! 26: #define PCI_DEVICE_ID_JMICRON_JMC250 0x0250 ! 27: #define PCI_DEVICE_ID_JMICRON_JMC260 0x0260 ! 28: ! 29: /* ! 30: * Extra PCI Configuration space interface ! 31: */ ! 32: #define PCI_DCSR_MRRS 0x59 ! 33: #define PCI_DCSR_MRRS_MASK 0x70 ! 34: ! 35: enum pci_dcsr_mrrs_vals { ! 36: MRRS_128B = 0x00, ! 37: MRRS_256B = 0x10, ! 38: MRRS_512B = 0x20, ! 39: MRRS_1024B = 0x30, ! 40: MRRS_2048B = 0x40, ! 41: MRRS_4096B = 0x50, ! 42: }; ! 43: ! 44: /* ! 45: * TX/RX Descriptors ! 46: * ! 47: * TX/RX Ring DESC Count Must be multiple of 16 and <= 1024 ! 48: */ ! 49: #define RING_DESC_ALIGN 16 /* Descriptor alignment */ ! 50: #define TX_DESC_SIZE 16 ! 51: ! 52: struct txdesc { ! 53: union { ! 54: uint8_t all[16]; ! 55: uint32_t dw[4]; ! 56: struct { ! 57: /* DW0 */ ! 58: uint16_t vlan; ! 59: uint8_t rsv1; ! 60: uint8_t flags; ! 61: ! 62: /* DW1 */ ! 63: uint16_t datalen; ! 64: uint16_t mss; ! 65: ! 66: /* DW2 */ ! 67: uint16_t pktsize; ! 68: uint16_t rsv2; ! 69: ! 70: /* DW3 */ ! 71: uint32_t bufaddr; ! 72: } desc1; ! 73: struct { ! 74: /* DW0 */ ! 75: uint16_t rsv1; ! 76: uint8_t rsv2; ! 77: uint8_t flags; ! 78: ! 79: /* DW1 */ ! 80: uint16_t datalen; ! 81: uint16_t rsv3; ! 82: ! 83: /* DW2 */ ! 84: uint32_t bufaddrh; ! 85: ! 86: /* DW3 */ ! 87: uint32_t bufaddrl; ! 88: } desc2; ! 89: struct { ! 90: /* DW0 */ ! 91: uint8_t ehdrsz; ! 92: uint8_t rsv1; ! 93: uint8_t rsv2; ! 94: uint8_t flags; ! 95: ! 96: /* DW1 */ ! 97: uint16_t trycnt; ! 98: uint16_t segcnt; ! 99: ! 100: /* DW2 */ ! 101: uint16_t pktsz; ! 102: uint16_t rsv3; ! 103: ! 104: /* DW3 */ ! 105: uint32_t bufaddrl; ! 106: } descwb; ! 107: }; ! 108: }; ! 109: ! 110: enum jme_txdesc_flags_bits { ! 111: TXFLAG_OWN = 0x80, ! 112: TXFLAG_INT = 0x40, ! 113: TXFLAG_64BIT = 0x20, ! 114: TXFLAG_TCPCS = 0x10, ! 115: TXFLAG_UDPCS = 0x08, ! 116: TXFLAG_IPCS = 0x04, ! 117: TXFLAG_LSEN = 0x02, ! 118: TXFLAG_TAGON = 0x01, ! 119: }; ! 120: ! 121: #define TXDESC_MSS_SHIFT 2 ! 122: enum jme_txwbdesc_flags_bits { ! 123: TXWBFLAG_OWN = 0x80, ! 124: TXWBFLAG_INT = 0x40, ! 125: TXWBFLAG_TMOUT = 0x20, ! 126: TXWBFLAG_TRYOUT = 0x10, ! 127: TXWBFLAG_COL = 0x08, ! 128: ! 129: TXWBFLAG_ALLERR = TXWBFLAG_TMOUT | ! 130: TXWBFLAG_TRYOUT | ! 131: TXWBFLAG_COL, ! 132: }; ! 133: ! 134: #define RX_DESC_SIZE 16 ! 135: #define RX_BUF_DMA_ALIGN 8 ! 136: #define RX_PREPAD_SIZE 10 ! 137: #define ETH_CRC_LEN 2 ! 138: #define RX_VLANHDR_LEN 2 ! 139: #define RX_EXTRA_LEN (ETH_HLEN + \ ! 140: ETH_CRC_LEN + \ ! 141: RX_VLANHDR_LEN + \ ! 142: RX_BUF_DMA_ALIGN) ! 143: #define FIXED_MTU 1500 ! 144: #define RX_ALLOC_LEN (FIXED_MTU + RX_EXTRA_LEN) ! 145: ! 146: struct rxdesc { ! 147: union { ! 148: uint8_t all[16]; ! 149: uint32_t dw[4]; ! 150: struct { ! 151: /* DW0 */ ! 152: uint16_t rsv2; ! 153: uint8_t rsv1; ! 154: uint8_t flags; ! 155: ! 156: /* DW1 */ ! 157: uint16_t datalen; ! 158: uint16_t wbcpl; ! 159: ! 160: /* DW2 */ ! 161: uint32_t bufaddrh; ! 162: ! 163: /* DW3 */ ! 164: uint32_t bufaddrl; ! 165: } desc1; ! 166: struct { ! 167: /* DW0 */ ! 168: uint16_t vlan; ! 169: uint16_t flags; ! 170: ! 171: /* DW1 */ ! 172: uint16_t framesize; ! 173: uint8_t errstat; ! 174: uint8_t desccnt; ! 175: ! 176: /* DW2 */ ! 177: uint32_t rsshash; ! 178: ! 179: /* DW3 */ ! 180: uint8_t hashfun; ! 181: uint8_t hashtype; ! 182: uint16_t resrv; ! 183: } descwb; ! 184: }; ! 185: }; ! 186: ! 187: enum jme_rxdesc_flags_bits { ! 188: RXFLAG_OWN = 0x80, ! 189: RXFLAG_INT = 0x40, ! 190: RXFLAG_64BIT = 0x20, ! 191: }; ! 192: ! 193: enum jme_rxwbdesc_flags_bits { ! 194: RXWBFLAG_OWN = 0x8000, ! 195: RXWBFLAG_INT = 0x4000, ! 196: RXWBFLAG_MF = 0x2000, ! 197: RXWBFLAG_64BIT = 0x2000, ! 198: RXWBFLAG_TCPON = 0x1000, ! 199: RXWBFLAG_UDPON = 0x0800, ! 200: RXWBFLAG_IPCS = 0x0400, ! 201: RXWBFLAG_TCPCS = 0x0200, ! 202: RXWBFLAG_UDPCS = 0x0100, ! 203: RXWBFLAG_TAGON = 0x0080, ! 204: RXWBFLAG_IPV4 = 0x0040, ! 205: RXWBFLAG_IPV6 = 0x0020, ! 206: RXWBFLAG_PAUSE = 0x0010, ! 207: RXWBFLAG_MAGIC = 0x0008, ! 208: RXWBFLAG_WAKEUP = 0x0004, ! 209: RXWBFLAG_DEST = 0x0003, ! 210: RXWBFLAG_DEST_UNI = 0x0001, ! 211: RXWBFLAG_DEST_MUL = 0x0002, ! 212: RXWBFLAG_DEST_BRO = 0x0003, ! 213: }; ! 214: ! 215: enum jme_rxwbdesc_desccnt_mask { ! 216: RXWBDCNT_WBCPL = 0x80, ! 217: RXWBDCNT_DCNT = 0x7F, ! 218: }; ! 219: ! 220: enum jme_rxwbdesc_errstat_bits { ! 221: RXWBERR_LIMIT = 0x80, ! 222: RXWBERR_MIIER = 0x40, ! 223: RXWBERR_NIBON = 0x20, ! 224: RXWBERR_COLON = 0x10, ! 225: RXWBERR_ABORT = 0x08, ! 226: RXWBERR_SHORT = 0x04, ! 227: RXWBERR_OVERUN = 0x02, ! 228: RXWBERR_CRCERR = 0x01, ! 229: RXWBERR_ALLERR = 0xFF, ! 230: }; ! 231: ! 232: /* ! 233: * The structure holding buffer information and ring descriptors all together. ! 234: */ ! 235: struct jme_ring { ! 236: void *desc; /* pointer to ring memory */ ! 237: unsigned long dma; /* phys address for ring dma */ ! 238: ! 239: /* Buffer information corresponding to each descriptor */ ! 240: struct io_buffer **bufinf; ! 241: ! 242: int next_to_clean; ! 243: int next_to_fill; ! 244: int next_to_use; ! 245: int nr_free; ! 246: }; ! 247: ! 248: /* ! 249: * Jmac Adapter Private data ! 250: */ ! 251: struct jme_adapter { ! 252: void *regs; ! 253: struct mii_if_info mii_if; ! 254: struct pci_device *pdev; ! 255: unsigned int fpgaver; ! 256: unsigned int chiprev; ! 257: uint32_t reg_ghc; ! 258: uint32_t reg_txcs; ! 259: uint32_t reg_rxcs; ! 260: uint32_t reg_rxmcs; ! 261: uint32_t phylink; ! 262: struct jme_ring rxring; ! 263: uint32_t rx_ring_size; ! 264: uint32_t rx_ring_mask; ! 265: struct jme_ring txring; ! 266: uint32_t tx_ring_size; ! 267: uint32_t tx_ring_mask; ! 268: }; ! 269: ! 270: /* ! 271: * I/O Resters ! 272: */ ! 273: enum jme_iomap_regs_value { ! 274: JME_REGS_SIZE = 0x1000, ! 275: }; ! 276: ! 277: enum jme_iomap_offsets { ! 278: JME_MAC = 0x0000, ! 279: JME_PHY = 0x0400, ! 280: JME_MISC = 0x0800, ! 281: JME_RSS = 0x0C00, ! 282: }; ! 283: ! 284: enum jme_iomap_lens { ! 285: JME_MAC_LEN = 0x80, ! 286: JME_PHY_LEN = 0x58, ! 287: JME_MISC_LEN = 0x98, ! 288: JME_RSS_LEN = 0xFF, ! 289: }; ! 290: ! 291: enum jme_iomap_regs { ! 292: JME_TXCS = JME_MAC | 0x00, /* Transmit Control and Status */ ! 293: JME_TXDBA_LO = JME_MAC | 0x04, /* Transmit Queue Desc Base Addr */ ! 294: JME_TXDBA_HI = JME_MAC | 0x08, /* Transmit Queue Desc Base Addr */ ! 295: JME_TXQDC = JME_MAC | 0x0C, /* Transmit Queue Desc Count */ ! 296: JME_TXNDA = JME_MAC | 0x10, /* Transmit Queue Next Desc Addr */ ! 297: JME_TXMCS = JME_MAC | 0x14, /* Transmit MAC Control Status */ ! 298: JME_TXPFC = JME_MAC | 0x18, /* Transmit Pause Frame Control */ ! 299: JME_TXTRHD = JME_MAC | 0x1C, /* Transmit Timer/Retry@Half-Dup */ ! 300: ! 301: JME_RXCS = JME_MAC | 0x20, /* Receive Control and Status */ ! 302: JME_RXDBA_LO = JME_MAC | 0x24, /* Receive Queue Desc Base Addr */ ! 303: JME_RXDBA_HI = JME_MAC | 0x28, /* Receive Queue Desc Base Addr */ ! 304: JME_RXQDC = JME_MAC | 0x2C, /* Receive Queue Desc Count */ ! 305: JME_RXNDA = JME_MAC | 0x30, /* Receive Queue Next Desc Addr */ ! 306: JME_RXMCS = JME_MAC | 0x34, /* Receive MAC Control Status */ ! 307: JME_RXUMA_LO = JME_MAC | 0x38, /* Receive Unicast MAC Address */ ! 308: JME_RXUMA_HI = JME_MAC | 0x3C, /* Receive Unicast MAC Address */ ! 309: JME_RXMCHT_LO = JME_MAC | 0x40, /* Recv Multicast Addr HashTable */ ! 310: JME_RXMCHT_HI = JME_MAC | 0x44, /* Recv Multicast Addr HashTable */ ! 311: JME_WFODP = JME_MAC | 0x48, /* Wakeup Frame Output Data Port */ ! 312: JME_WFOI = JME_MAC | 0x4C, /* Wakeup Frame Output Interface */ ! 313: ! 314: JME_SMI = JME_MAC | 0x50, /* Station Management Interface */ ! 315: JME_GHC = JME_MAC | 0x54, /* Global Host Control */ ! 316: JME_PMCS = JME_MAC | 0x60, /* Power Management Control/Stat */ ! 317: ! 318: ! 319: JME_PHY_CS = JME_PHY | 0x28, /* PHY Ctrl and Status Register */ ! 320: JME_PHY_LINK = JME_PHY | 0x30, /* PHY Link Status Register */ ! 321: JME_SMBCSR = JME_PHY | 0x40, /* SMB Control and Status */ ! 322: JME_SMBINTF = JME_PHY | 0x44, /* SMB Interface */ ! 323: ! 324: ! 325: JME_TMCSR = JME_MISC | 0x00, /* Timer Control/Status Register */ ! 326: JME_GPREG0 = JME_MISC | 0x08, /* General purpose REG-0 */ ! 327: JME_GPREG1 = JME_MISC | 0x0C, /* General purpose REG-1 */ ! 328: JME_IEVE = JME_MISC | 0x20, /* Interrupt Event Status */ ! 329: JME_IREQ = JME_MISC | 0x24, /* Intr Req Status(For Debug) */ ! 330: JME_IENS = JME_MISC | 0x28, /* Intr Enable - Setting Port */ ! 331: JME_IENC = JME_MISC | 0x2C, /* Interrupt Enable - Clear Port */ ! 332: JME_PCCRX0 = JME_MISC | 0x30, /* PCC Control for RX Queue 0 */ ! 333: JME_PCCTX = JME_MISC | 0x40, /* PCC Control for TX Queues */ ! 334: JME_CHIPMODE = JME_MISC | 0x44, /* Identify FPGA Version */ ! 335: JME_SHBA_HI = JME_MISC | 0x48, /* Shadow Register Base HI */ ! 336: JME_SHBA_LO = JME_MISC | 0x4C, /* Shadow Register Base LO */ ! 337: JME_TIMER1 = JME_MISC | 0x70, /* Timer1 */ ! 338: JME_TIMER2 = JME_MISC | 0x74, /* Timer2 */ ! 339: JME_APMC = JME_MISC | 0x7C, /* Aggressive Power Mode Control */ ! 340: JME_PCCSRX0 = JME_MISC | 0x80, /* PCC Status of RX0 */ ! 341: }; ! 342: ! 343: /* ! 344: * TX Control/Status Bits ! 345: */ ! 346: enum jme_txcs_bits { ! 347: TXCS_QUEUE7S = 0x00008000, ! 348: TXCS_QUEUE6S = 0x00004000, ! 349: TXCS_QUEUE5S = 0x00002000, ! 350: TXCS_QUEUE4S = 0x00001000, ! 351: TXCS_QUEUE3S = 0x00000800, ! 352: TXCS_QUEUE2S = 0x00000400, ! 353: TXCS_QUEUE1S = 0x00000200, ! 354: TXCS_QUEUE0S = 0x00000100, ! 355: TXCS_FIFOTH = 0x000000C0, ! 356: TXCS_DMASIZE = 0x00000030, ! 357: TXCS_BURST = 0x00000004, ! 358: TXCS_ENABLE = 0x00000001, ! 359: }; ! 360: ! 361: enum jme_txcs_value { ! 362: TXCS_FIFOTH_16QW = 0x000000C0, ! 363: TXCS_FIFOTH_12QW = 0x00000080, ! 364: TXCS_FIFOTH_8QW = 0x00000040, ! 365: TXCS_FIFOTH_4QW = 0x00000000, ! 366: ! 367: TXCS_DMASIZE_64B = 0x00000000, ! 368: TXCS_DMASIZE_128B = 0x00000010, ! 369: TXCS_DMASIZE_256B = 0x00000020, ! 370: TXCS_DMASIZE_512B = 0x00000030, ! 371: ! 372: TXCS_SELECT_QUEUE0 = 0x00000000, ! 373: TXCS_SELECT_QUEUE1 = 0x00010000, ! 374: TXCS_SELECT_QUEUE2 = 0x00020000, ! 375: TXCS_SELECT_QUEUE3 = 0x00030000, ! 376: TXCS_SELECT_QUEUE4 = 0x00040000, ! 377: TXCS_SELECT_QUEUE5 = 0x00050000, ! 378: TXCS_SELECT_QUEUE6 = 0x00060000, ! 379: TXCS_SELECT_QUEUE7 = 0x00070000, ! 380: ! 381: TXCS_DEFAULT = TXCS_FIFOTH_4QW | ! 382: TXCS_BURST, ! 383: }; ! 384: ! 385: #define JME_TX_DISABLE_TIMEOUT 10 /* 10 msec */ ! 386: ! 387: /* ! 388: * TX MAC Control/Status Bits ! 389: */ ! 390: enum jme_txmcs_bit_masks { ! 391: TXMCS_IFG2 = 0xC0000000, ! 392: TXMCS_IFG1 = 0x30000000, ! 393: TXMCS_TTHOLD = 0x00000300, ! 394: TXMCS_FBURST = 0x00000080, ! 395: TXMCS_CARRIEREXT = 0x00000040, ! 396: TXMCS_DEFER = 0x00000020, ! 397: TXMCS_BACKOFF = 0x00000010, ! 398: TXMCS_CARRIERSENSE = 0x00000008, ! 399: TXMCS_COLLISION = 0x00000004, ! 400: TXMCS_CRC = 0x00000002, ! 401: TXMCS_PADDING = 0x00000001, ! 402: }; ! 403: ! 404: enum jme_txmcs_values { ! 405: TXMCS_IFG2_6_4 = 0x00000000, ! 406: TXMCS_IFG2_8_5 = 0x40000000, ! 407: TXMCS_IFG2_10_6 = 0x80000000, ! 408: TXMCS_IFG2_12_7 = 0xC0000000, ! 409: ! 410: TXMCS_IFG1_8_4 = 0x00000000, ! 411: TXMCS_IFG1_12_6 = 0x10000000, ! 412: TXMCS_IFG1_16_8 = 0x20000000, ! 413: TXMCS_IFG1_20_10 = 0x30000000, ! 414: ! 415: TXMCS_TTHOLD_1_8 = 0x00000000, ! 416: TXMCS_TTHOLD_1_4 = 0x00000100, ! 417: TXMCS_TTHOLD_1_2 = 0x00000200, ! 418: TXMCS_TTHOLD_FULL = 0x00000300, ! 419: ! 420: TXMCS_DEFAULT = TXMCS_IFG2_8_5 | ! 421: TXMCS_IFG1_16_8 | ! 422: TXMCS_TTHOLD_FULL | ! 423: TXMCS_DEFER | ! 424: TXMCS_CRC | ! 425: TXMCS_PADDING, ! 426: }; ! 427: ! 428: enum jme_txpfc_bits_masks { ! 429: TXPFC_VLAN_TAG = 0xFFFF0000, ! 430: TXPFC_VLAN_EN = 0x00008000, ! 431: TXPFC_PF_EN = 0x00000001, ! 432: }; ! 433: ! 434: enum jme_txtrhd_bits_masks { ! 435: TXTRHD_TXPEN = 0x80000000, ! 436: TXTRHD_TXP = 0x7FFFFF00, ! 437: TXTRHD_TXREN = 0x00000080, ! 438: TXTRHD_TXRL = 0x0000007F, ! 439: }; ! 440: ! 441: enum jme_txtrhd_shifts { ! 442: TXTRHD_TXP_SHIFT = 8, ! 443: TXTRHD_TXRL_SHIFT = 0, ! 444: }; ! 445: ! 446: /* ! 447: * RX Control/Status Bits ! 448: */ ! 449: enum jme_rxcs_bit_masks { ! 450: /* FIFO full threshold for transmitting Tx Pause Packet */ ! 451: RXCS_FIFOTHTP = 0x30000000, ! 452: /* FIFO threshold for processing next packet */ ! 453: RXCS_FIFOTHNP = 0x0C000000, ! 454: RXCS_DMAREQSZ = 0x03000000, /* DMA Request Size */ ! 455: RXCS_QUEUESEL = 0x00030000, /* Queue selection */ ! 456: RXCS_RETRYGAP = 0x0000F000, /* RX Desc full retry gap */ ! 457: RXCS_RETRYCNT = 0x00000F00, /* RX Desc full retry counter */ ! 458: RXCS_WAKEUP = 0x00000040, /* Enable receive wakeup packet */ ! 459: RXCS_MAGIC = 0x00000020, /* Enable receive magic packet */ ! 460: RXCS_SHORT = 0x00000010, /* Enable receive short packet */ ! 461: RXCS_ABORT = 0x00000008, /* Enable receive errorr packet */ ! 462: RXCS_QST = 0x00000004, /* Receive queue start */ ! 463: RXCS_SUSPEND = 0x00000002, ! 464: RXCS_ENABLE = 0x00000001, ! 465: }; ! 466: ! 467: enum jme_rxcs_values { ! 468: RXCS_FIFOTHTP_16T = 0x00000000, ! 469: RXCS_FIFOTHTP_32T = 0x10000000, ! 470: RXCS_FIFOTHTP_64T = 0x20000000, ! 471: RXCS_FIFOTHTP_128T = 0x30000000, ! 472: ! 473: RXCS_FIFOTHNP_16QW = 0x00000000, ! 474: RXCS_FIFOTHNP_32QW = 0x04000000, ! 475: RXCS_FIFOTHNP_64QW = 0x08000000, ! 476: RXCS_FIFOTHNP_128QW = 0x0C000000, ! 477: ! 478: RXCS_DMAREQSZ_16B = 0x00000000, ! 479: RXCS_DMAREQSZ_32B = 0x01000000, ! 480: RXCS_DMAREQSZ_64B = 0x02000000, ! 481: RXCS_DMAREQSZ_128B = 0x03000000, ! 482: ! 483: RXCS_QUEUESEL_Q0 = 0x00000000, ! 484: RXCS_QUEUESEL_Q1 = 0x00010000, ! 485: RXCS_QUEUESEL_Q2 = 0x00020000, ! 486: RXCS_QUEUESEL_Q3 = 0x00030000, ! 487: ! 488: RXCS_RETRYGAP_256ns = 0x00000000, ! 489: RXCS_RETRYGAP_512ns = 0x00001000, ! 490: RXCS_RETRYGAP_1024ns = 0x00002000, ! 491: RXCS_RETRYGAP_2048ns = 0x00003000, ! 492: RXCS_RETRYGAP_4096ns = 0x00004000, ! 493: RXCS_RETRYGAP_8192ns = 0x00005000, ! 494: RXCS_RETRYGAP_16384ns = 0x00006000, ! 495: RXCS_RETRYGAP_32768ns = 0x00007000, ! 496: ! 497: RXCS_RETRYCNT_0 = 0x00000000, ! 498: RXCS_RETRYCNT_4 = 0x00000100, ! 499: RXCS_RETRYCNT_8 = 0x00000200, ! 500: RXCS_RETRYCNT_12 = 0x00000300, ! 501: RXCS_RETRYCNT_16 = 0x00000400, ! 502: RXCS_RETRYCNT_20 = 0x00000500, ! 503: RXCS_RETRYCNT_24 = 0x00000600, ! 504: RXCS_RETRYCNT_28 = 0x00000700, ! 505: RXCS_RETRYCNT_32 = 0x00000800, ! 506: RXCS_RETRYCNT_36 = 0x00000900, ! 507: RXCS_RETRYCNT_40 = 0x00000A00, ! 508: RXCS_RETRYCNT_44 = 0x00000B00, ! 509: RXCS_RETRYCNT_48 = 0x00000C00, ! 510: RXCS_RETRYCNT_52 = 0x00000D00, ! 511: RXCS_RETRYCNT_56 = 0x00000E00, ! 512: RXCS_RETRYCNT_60 = 0x00000F00, ! 513: ! 514: RXCS_DEFAULT = RXCS_FIFOTHTP_128T | ! 515: RXCS_FIFOTHNP_128QW | ! 516: RXCS_DMAREQSZ_128B | ! 517: RXCS_RETRYGAP_256ns | ! 518: RXCS_RETRYCNT_32, ! 519: }; ! 520: ! 521: #define JME_RX_DISABLE_TIMEOUT 10 /* 10 msec */ ! 522: ! 523: /* ! 524: * RX MAC Control/Status Bits ! 525: */ ! 526: enum jme_rxmcs_bits { ! 527: RXMCS_ALLFRAME = 0x00000800, ! 528: RXMCS_BRDFRAME = 0x00000400, ! 529: RXMCS_MULFRAME = 0x00000200, ! 530: RXMCS_UNIFRAME = 0x00000100, ! 531: RXMCS_ALLMULFRAME = 0x00000080, ! 532: RXMCS_MULFILTERED = 0x00000040, ! 533: RXMCS_RXCOLLDEC = 0x00000020, ! 534: RXMCS_FLOWCTRL = 0x00000008, ! 535: RXMCS_VTAGRM = 0x00000004, ! 536: RXMCS_PREPAD = 0x00000002, ! 537: RXMCS_CHECKSUM = 0x00000001, ! 538: ! 539: RXMCS_DEFAULT = RXMCS_VTAGRM | ! 540: RXMCS_FLOWCTRL | ! 541: RXMCS_CHECKSUM, ! 542: }; ! 543: ! 544: /* ! 545: * Wakeup Frame setup interface registers ! 546: */ ! 547: #define WAKEUP_FRAME_NR 8 ! 548: #define WAKEUP_FRAME_MASK_DWNR 4 ! 549: ! 550: enum jme_wfoi_bit_masks { ! 551: WFOI_MASK_SEL = 0x00000070, ! 552: WFOI_CRC_SEL = 0x00000008, ! 553: WFOI_FRAME_SEL = 0x00000007, ! 554: }; ! 555: ! 556: enum jme_wfoi_shifts { ! 557: WFOI_MASK_SHIFT = 4, ! 558: }; ! 559: ! 560: /* ! 561: * SMI Related definitions ! 562: */ ! 563: enum jme_smi_bit_mask { ! 564: SMI_DATA_MASK = 0xFFFF0000, ! 565: SMI_REG_ADDR_MASK = 0x0000F800, ! 566: SMI_PHY_ADDR_MASK = 0x000007C0, ! 567: SMI_OP_WRITE = 0x00000020, ! 568: /* Set to 1, after req done it'll be cleared to 0 */ ! 569: SMI_OP_REQ = 0x00000010, ! 570: SMI_OP_MDIO = 0x00000008, /* Software assess In/Out */ ! 571: SMI_OP_MDOE = 0x00000004, /* Software Output Enable */ ! 572: SMI_OP_MDC = 0x00000002, /* Software CLK Control */ ! 573: SMI_OP_MDEN = 0x00000001, /* Software access Enable */ ! 574: }; ! 575: ! 576: enum jme_smi_bit_shift { ! 577: SMI_DATA_SHIFT = 16, ! 578: SMI_REG_ADDR_SHIFT = 11, ! 579: SMI_PHY_ADDR_SHIFT = 6, ! 580: }; ! 581: ! 582: static inline uint32_t smi_reg_addr(int x) ! 583: { ! 584: return (x << SMI_REG_ADDR_SHIFT) & SMI_REG_ADDR_MASK; ! 585: } ! 586: ! 587: static inline uint32_t smi_phy_addr(int x) ! 588: { ! 589: return (x << SMI_PHY_ADDR_SHIFT) & SMI_PHY_ADDR_MASK; ! 590: } ! 591: ! 592: #define JME_PHY_TIMEOUT 100 /* 100 msec */ ! 593: #define JME_PHY_REG_NR 32 ! 594: ! 595: /* ! 596: * Global Host Control ! 597: */ ! 598: enum jme_ghc_bit_mask { ! 599: GHC_SWRST = 0x40000000, ! 600: GHC_DPX = 0x00000040, ! 601: GHC_SPEED = 0x00000030, ! 602: GHC_LINK_POLL = 0x00000001, ! 603: }; ! 604: ! 605: enum jme_ghc_speed_val { ! 606: GHC_SPEED_10M = 0x00000010, ! 607: GHC_SPEED_100M = 0x00000020, ! 608: GHC_SPEED_1000M = 0x00000030, ! 609: }; ! 610: ! 611: enum jme_ghc_to_clk { ! 612: GHC_TO_CLK_OFF = 0x00000000, ! 613: GHC_TO_CLK_GPHY = 0x00400000, ! 614: GHC_TO_CLK_PCIE = 0x00800000, ! 615: GHC_TO_CLK_INVALID = 0x00C00000, ! 616: }; ! 617: ! 618: enum jme_ghc_txmac_clk { ! 619: GHC_TXMAC_CLK_OFF = 0x00000000, ! 620: GHC_TXMAC_CLK_GPHY = 0x00100000, ! 621: GHC_TXMAC_CLK_PCIE = 0x00200000, ! 622: GHC_TXMAC_CLK_INVALID = 0x00300000, ! 623: }; ! 624: ! 625: /* ! 626: * Power management control and status register ! 627: */ ! 628: enum jme_pmcs_bit_masks { ! 629: PMCS_WF7DET = 0x80000000, ! 630: PMCS_WF6DET = 0x40000000, ! 631: PMCS_WF5DET = 0x20000000, ! 632: PMCS_WF4DET = 0x10000000, ! 633: PMCS_WF3DET = 0x08000000, ! 634: PMCS_WF2DET = 0x04000000, ! 635: PMCS_WF1DET = 0x02000000, ! 636: PMCS_WF0DET = 0x01000000, ! 637: PMCS_LFDET = 0x00040000, ! 638: PMCS_LRDET = 0x00020000, ! 639: PMCS_MFDET = 0x00010000, ! 640: PMCS_WF7EN = 0x00008000, ! 641: PMCS_WF6EN = 0x00004000, ! 642: PMCS_WF5EN = 0x00002000, ! 643: PMCS_WF4EN = 0x00001000, ! 644: PMCS_WF3EN = 0x00000800, ! 645: PMCS_WF2EN = 0x00000400, ! 646: PMCS_WF1EN = 0x00000200, ! 647: PMCS_WF0EN = 0x00000100, ! 648: PMCS_LFEN = 0x00000004, ! 649: PMCS_LREN = 0x00000002, ! 650: PMCS_MFEN = 0x00000001, ! 651: }; ! 652: ! 653: /* ! 654: * Giga PHY Status Registers ! 655: */ ! 656: enum jme_phy_link_bit_mask { ! 657: PHY_LINK_SPEED_MASK = 0x0000C000, ! 658: PHY_LINK_DUPLEX = 0x00002000, ! 659: PHY_LINK_SPEEDDPU_RESOLVED = 0x00000800, ! 660: PHY_LINK_UP = 0x00000400, ! 661: PHY_LINK_AUTONEG_COMPLETE = 0x00000200, ! 662: PHY_LINK_MDI_STAT = 0x00000040, ! 663: }; ! 664: ! 665: enum jme_phy_link_speed_val { ! 666: PHY_LINK_SPEED_10M = 0x00000000, ! 667: PHY_LINK_SPEED_100M = 0x00004000, ! 668: PHY_LINK_SPEED_1000M = 0x00008000, ! 669: }; ! 670: ! 671: #define JME_SPDRSV_TIMEOUT 500 /* 500 us */ ! 672: ! 673: /* ! 674: * SMB Control and Status ! 675: */ ! 676: enum jme_smbcsr_bit_mask { ! 677: SMBCSR_CNACK = 0x00020000, ! 678: SMBCSR_RELOAD = 0x00010000, ! 679: SMBCSR_EEPROMD = 0x00000020, ! 680: SMBCSR_INITDONE = 0x00000010, ! 681: SMBCSR_BUSY = 0x0000000F, ! 682: }; ! 683: ! 684: enum jme_smbintf_bit_mask { ! 685: SMBINTF_HWDATR = 0xFF000000, ! 686: SMBINTF_HWDATW = 0x00FF0000, ! 687: SMBINTF_HWADDR = 0x0000FF00, ! 688: SMBINTF_HWRWN = 0x00000020, ! 689: SMBINTF_HWCMD = 0x00000010, ! 690: SMBINTF_FASTM = 0x00000008, ! 691: SMBINTF_GPIOSCL = 0x00000004, ! 692: SMBINTF_GPIOSDA = 0x00000002, ! 693: SMBINTF_GPIOEN = 0x00000001, ! 694: }; ! 695: ! 696: enum jme_smbintf_vals { ! 697: SMBINTF_HWRWN_READ = 0x00000020, ! 698: SMBINTF_HWRWN_WRITE = 0x00000000, ! 699: }; ! 700: ! 701: enum jme_smbintf_shifts { ! 702: SMBINTF_HWDATR_SHIFT = 24, ! 703: SMBINTF_HWDATW_SHIFT = 16, ! 704: SMBINTF_HWADDR_SHIFT = 8, ! 705: }; ! 706: ! 707: #define JME_EEPROM_RELOAD_TIMEOUT 2000 /* 2000 msec */ ! 708: #define JME_SMB_BUSY_TIMEOUT 20 /* 20 msec */ ! 709: #define JME_SMB_LEN 256 ! 710: #define JME_EEPROM_MAGIC 0x250 ! 711: ! 712: /* ! 713: * Timer Control/Status Register ! 714: */ ! 715: enum jme_tmcsr_bit_masks { ! 716: TMCSR_SWIT = 0x80000000, ! 717: TMCSR_EN = 0x01000000, ! 718: TMCSR_CNT = 0x00FFFFFF, ! 719: }; ! 720: ! 721: /* ! 722: * General Purpose REG-0 ! 723: */ ! 724: enum jme_gpreg0_masks { ! 725: GPREG0_DISSH = 0xFF000000, ! 726: GPREG0_PCIRLMT = 0x00300000, ! 727: GPREG0_PCCNOMUTCLR = 0x00040000, ! 728: GPREG0_LNKINTPOLL = 0x00001000, ! 729: GPREG0_PCCTMR = 0x00000300, ! 730: GPREG0_PHYADDR = 0x0000001F, ! 731: }; ! 732: ! 733: enum jme_gpreg0_vals { ! 734: GPREG0_DISSH_DW7 = 0x80000000, ! 735: GPREG0_DISSH_DW6 = 0x40000000, ! 736: GPREG0_DISSH_DW5 = 0x20000000, ! 737: GPREG0_DISSH_DW4 = 0x10000000, ! 738: GPREG0_DISSH_DW3 = 0x08000000, ! 739: GPREG0_DISSH_DW2 = 0x04000000, ! 740: GPREG0_DISSH_DW1 = 0x02000000, ! 741: GPREG0_DISSH_DW0 = 0x01000000, ! 742: GPREG0_DISSH_ALL = 0xFF000000, ! 743: ! 744: GPREG0_PCIRLMT_8 = 0x00000000, ! 745: GPREG0_PCIRLMT_6 = 0x00100000, ! 746: GPREG0_PCIRLMT_5 = 0x00200000, ! 747: GPREG0_PCIRLMT_4 = 0x00300000, ! 748: ! 749: GPREG0_PCCTMR_16ns = 0x00000000, ! 750: GPREG0_PCCTMR_256ns = 0x00000100, ! 751: GPREG0_PCCTMR_1us = 0x00000200, ! 752: GPREG0_PCCTMR_1ms = 0x00000300, ! 753: ! 754: GPREG0_PHYADDR_1 = 0x00000001, ! 755: ! 756: GPREG0_DEFAULT = GPREG0_DISSH_ALL | ! 757: GPREG0_PCIRLMT_4 | ! 758: GPREG0_PCCTMR_1us | ! 759: GPREG0_PHYADDR_1, ! 760: }; ! 761: ! 762: /* ! 763: * General Purpose REG-1 ! 764: * Note: All theses bits defined here are for ! 765: * Chip mode revision 0x11 only ! 766: */ ! 767: enum jme_gpreg1_masks { ! 768: GPREG1_INTRDELAYUNIT = 0x00000018, ! 769: GPREG1_INTRDELAYENABLE = 0x00000007, ! 770: }; ! 771: ! 772: enum jme_gpreg1_vals { ! 773: GPREG1_RSSPATCH = 0x00000040, ! 774: GPREG1_HALFMODEPATCH = 0x00000020, ! 775: ! 776: GPREG1_INTDLYUNIT_16NS = 0x00000000, ! 777: GPREG1_INTDLYUNIT_256NS = 0x00000008, ! 778: GPREG1_INTDLYUNIT_1US = 0x00000010, ! 779: GPREG1_INTDLYUNIT_16US = 0x00000018, ! 780: ! 781: GPREG1_INTDLYEN_1U = 0x00000001, ! 782: GPREG1_INTDLYEN_2U = 0x00000002, ! 783: GPREG1_INTDLYEN_3U = 0x00000003, ! 784: GPREG1_INTDLYEN_4U = 0x00000004, ! 785: GPREG1_INTDLYEN_5U = 0x00000005, ! 786: GPREG1_INTDLYEN_6U = 0x00000006, ! 787: GPREG1_INTDLYEN_7U = 0x00000007, ! 788: ! 789: GPREG1_DEFAULT = 0x00000000, ! 790: }; ! 791: ! 792: /* ! 793: * Interrupt Status Bits ! 794: */ ! 795: enum jme_interrupt_bits { ! 796: INTR_SWINTR = 0x80000000, ! 797: INTR_TMINTR = 0x40000000, ! 798: INTR_LINKCH = 0x20000000, ! 799: INTR_PAUSERCV = 0x10000000, ! 800: INTR_MAGICRCV = 0x08000000, ! 801: INTR_WAKERCV = 0x04000000, ! 802: INTR_PCCRX0TO = 0x02000000, ! 803: INTR_PCCRX1TO = 0x01000000, ! 804: INTR_PCCRX2TO = 0x00800000, ! 805: INTR_PCCRX3TO = 0x00400000, ! 806: INTR_PCCTXTO = 0x00200000, ! 807: INTR_PCCRX0 = 0x00100000, ! 808: INTR_PCCRX1 = 0x00080000, ! 809: INTR_PCCRX2 = 0x00040000, ! 810: INTR_PCCRX3 = 0x00020000, ! 811: INTR_PCCTX = 0x00010000, ! 812: INTR_RX3EMP = 0x00008000, ! 813: INTR_RX2EMP = 0x00004000, ! 814: INTR_RX1EMP = 0x00002000, ! 815: INTR_RX0EMP = 0x00001000, ! 816: INTR_RX3 = 0x00000800, ! 817: INTR_RX2 = 0x00000400, ! 818: INTR_RX1 = 0x00000200, ! 819: INTR_RX0 = 0x00000100, ! 820: INTR_TX7 = 0x00000080, ! 821: INTR_TX6 = 0x00000040, ! 822: INTR_TX5 = 0x00000020, ! 823: INTR_TX4 = 0x00000010, ! 824: INTR_TX3 = 0x00000008, ! 825: INTR_TX2 = 0x00000004, ! 826: INTR_TX1 = 0x00000002, ! 827: INTR_TX0 = 0x00000001, ! 828: }; ! 829: ! 830: static const uint32_t INTR_ENABLE = INTR_LINKCH | ! 831: INTR_RX0EMP | ! 832: INTR_RX0 | ! 833: INTR_TX0; ! 834: ! 835: /* ! 836: * PCC Control Registers ! 837: */ ! 838: enum jme_pccrx_masks { ! 839: PCCRXTO_MASK = 0xFFFF0000, ! 840: PCCRX_MASK = 0x0000FF00, ! 841: }; ! 842: ! 843: enum jme_pcctx_masks { ! 844: PCCTXTO_MASK = 0xFFFF0000, ! 845: PCCTX_MASK = 0x0000FF00, ! 846: PCCTX_QS_MASK = 0x000000FF, ! 847: }; ! 848: ! 849: enum jme_pccrx_shifts { ! 850: PCCRXTO_SHIFT = 16, ! 851: PCCRX_SHIFT = 8, ! 852: }; ! 853: ! 854: enum jme_pcctx_shifts { ! 855: PCCTXTO_SHIFT = 16, ! 856: PCCTX_SHIFT = 8, ! 857: }; ! 858: ! 859: enum jme_pcctx_bits { ! 860: PCCTXQ0_EN = 0x00000001, ! 861: PCCTXQ1_EN = 0x00000002, ! 862: PCCTXQ2_EN = 0x00000004, ! 863: PCCTXQ3_EN = 0x00000008, ! 864: PCCTXQ4_EN = 0x00000010, ! 865: PCCTXQ5_EN = 0x00000020, ! 866: PCCTXQ6_EN = 0x00000040, ! 867: PCCTXQ7_EN = 0x00000080, ! 868: }; ! 869: ! 870: /* ! 871: * Chip Mode Register ! 872: */ ! 873: enum jme_chipmode_bit_masks { ! 874: CM_FPGAVER_MASK = 0xFFFF0000, ! 875: CM_CHIPREV_MASK = 0x0000FF00, ! 876: CM_CHIPMODE_MASK = 0x0000000F, ! 877: }; ! 878: ! 879: enum jme_chipmode_shifts { ! 880: CM_FPGAVER_SHIFT = 16, ! 881: CM_CHIPREV_SHIFT = 8, ! 882: }; ! 883: ! 884: /* ! 885: * Workaround ! 886: */ ! 887: static inline int is_buggy250(unsigned short device, unsigned int chiprev) ! 888: { ! 889: return device == PCI_DEVICE_ID_JMICRON_JMC250 && chiprev == 0x11; ! 890: } ! 891: ! 892: /* ! 893: * Read/Write I/O Registers ! 894: */ ! 895: static inline uint32_t jread32(struct jme_adapter *jme, uint32_t reg) ! 896: { ! 897: return readl(jme->regs + reg); ! 898: } ! 899: ! 900: static inline void jwrite32(struct jme_adapter *jme, uint32_t reg, uint32_t val) ! 901: { ! 902: writel(val, jme->regs + reg); ! 903: } ! 904: ! 905: static void jwrite32f(struct jme_adapter *jme, uint32_t reg, uint32_t val) ! 906: { ! 907: /* ! 908: * Read after write should cause flush ! 909: */ ! 910: writel(val, jme->regs + reg); ! 911: readl(jme->regs + reg); ! 912: } ! 913: ! 914: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.