2 * JMicron JMC2x0 series PCIe Ethernet gPXE Device Driver
4 * Copyright 2010 Guo-Fu Tseng <cooldavid@cooldavid.org>
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.
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.
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., 51 Franklin Street, Fifth Floor, Boston, MA
21 FILE_LICENCE ( GPL2_OR_LATER );
23 #ifndef __JME_H_INCLUDED__
24 #define __JME_H_INCLUDED__
26 #define PCI_VENDOR_ID_JMICRON 0x197b
27 #define PCI_DEVICE_ID_JMICRON_JMC250 0x0250
28 #define PCI_DEVICE_ID_JMICRON_JMC260 0x0260
31 * Extra PCI Configuration space interface
33 #define PCI_DCSR_MRRS 0x59
34 #define PCI_DCSR_MRRS_MASK 0x70
36 enum pci_dcsr_mrrs_vals {
48 * TX/RX Ring DESC Count Must be multiple of 16 and <= 1024
50 #define RING_DESC_ALIGN 16 /* Descriptor alignment */
51 #define TX_DESC_SIZE 16
111 enum jme_txdesc_flags_bits {
122 #define TXDESC_MSS_SHIFT 2
123 enum jme_txwbdesc_flags_bits {
126 TXWBFLAG_TMOUT = 0x20,
127 TXWBFLAG_TRYOUT = 0x10,
130 TXWBFLAG_ALLERR = TXWBFLAG_TMOUT |
135 #define RX_DESC_SIZE 16
136 #define RX_BUF_DMA_ALIGN 8
137 #define RX_PREPAD_SIZE 10
138 #define ETH_CRC_LEN 2
139 #define RX_VLANHDR_LEN 2
140 #define RX_EXTRA_LEN (ETH_HLEN + \
144 #define FIXED_MTU 1500
145 #define RX_ALLOC_LEN (FIXED_MTU + RX_EXTRA_LEN)
188 enum jme_rxdesc_flags_bits {
194 enum jme_rxwbdesc_flags_bits {
195 RXWBFLAG_OWN = 0x8000,
196 RXWBFLAG_INT = 0x4000,
197 RXWBFLAG_MF = 0x2000,
198 RXWBFLAG_64BIT = 0x2000,
199 RXWBFLAG_TCPON = 0x1000,
200 RXWBFLAG_UDPON = 0x0800,
201 RXWBFLAG_IPCS = 0x0400,
202 RXWBFLAG_TCPCS = 0x0200,
203 RXWBFLAG_UDPCS = 0x0100,
204 RXWBFLAG_TAGON = 0x0080,
205 RXWBFLAG_IPV4 = 0x0040,
206 RXWBFLAG_IPV6 = 0x0020,
207 RXWBFLAG_PAUSE = 0x0010,
208 RXWBFLAG_MAGIC = 0x0008,
209 RXWBFLAG_WAKEUP = 0x0004,
210 RXWBFLAG_DEST = 0x0003,
211 RXWBFLAG_DEST_UNI = 0x0001,
212 RXWBFLAG_DEST_MUL = 0x0002,
213 RXWBFLAG_DEST_BRO = 0x0003,
216 enum jme_rxwbdesc_desccnt_mask {
217 RXWBDCNT_WBCPL = 0x80,
218 RXWBDCNT_DCNT = 0x7F,
221 enum jme_rxwbdesc_errstat_bits {
222 RXWBERR_LIMIT = 0x80,
223 RXWBERR_MIIER = 0x40,
224 RXWBERR_NIBON = 0x20,
225 RXWBERR_COLON = 0x10,
226 RXWBERR_ABORT = 0x08,
227 RXWBERR_SHORT = 0x04,
228 RXWBERR_OVERUN = 0x02,
229 RXWBERR_CRCERR = 0x01,
230 RXWBERR_ALLERR = 0xFF,
234 * The structure holding buffer information and ring descriptors all together.
237 void *desc; /* pointer to ring memory */
238 unsigned long dma; /* phys address for ring dma */
240 /* Buffer information corresponding to each descriptor */
241 struct io_buffer **bufinf;
250 * Jmac Adapter Private data
254 struct mii_if_info mii_if;
255 struct pci_device *pdev;
256 unsigned int fpgaver;
257 unsigned int chiprev;
263 struct jme_ring rxring;
264 uint32_t rx_ring_size;
265 uint32_t rx_ring_mask;
266 struct jme_ring txring;
267 uint32_t tx_ring_size;
268 uint32_t tx_ring_mask;
274 enum jme_iomap_regs_value {
275 JME_REGS_SIZE = 0x1000,
278 enum jme_iomap_offsets {
285 enum jme_iomap_lens {
292 enum jme_iomap_regs {
293 JME_TXCS = JME_MAC | 0x00, /* Transmit Control and Status */
294 JME_TXDBA_LO = JME_MAC | 0x04, /* Transmit Queue Desc Base Addr */
295 JME_TXDBA_HI = JME_MAC | 0x08, /* Transmit Queue Desc Base Addr */
296 JME_TXQDC = JME_MAC | 0x0C, /* Transmit Queue Desc Count */
297 JME_TXNDA = JME_MAC | 0x10, /* Transmit Queue Next Desc Addr */
298 JME_TXMCS = JME_MAC | 0x14, /* Transmit MAC Control Status */
299 JME_TXPFC = JME_MAC | 0x18, /* Transmit Pause Frame Control */
300 JME_TXTRHD = JME_MAC | 0x1C, /* Transmit Timer/Retry@Half-Dup */
302 JME_RXCS = JME_MAC | 0x20, /* Receive Control and Status */
303 JME_RXDBA_LO = JME_MAC | 0x24, /* Receive Queue Desc Base Addr */
304 JME_RXDBA_HI = JME_MAC | 0x28, /* Receive Queue Desc Base Addr */
305 JME_RXQDC = JME_MAC | 0x2C, /* Receive Queue Desc Count */
306 JME_RXNDA = JME_MAC | 0x30, /* Receive Queue Next Desc Addr */
307 JME_RXMCS = JME_MAC | 0x34, /* Receive MAC Control Status */
308 JME_RXUMA_LO = JME_MAC | 0x38, /* Receive Unicast MAC Address */
309 JME_RXUMA_HI = JME_MAC | 0x3C, /* Receive Unicast MAC Address */
310 JME_RXMCHT_LO = JME_MAC | 0x40, /* Recv Multicast Addr HashTable */
311 JME_RXMCHT_HI = JME_MAC | 0x44, /* Recv Multicast Addr HashTable */
312 JME_WFODP = JME_MAC | 0x48, /* Wakeup Frame Output Data Port */
313 JME_WFOI = JME_MAC | 0x4C, /* Wakeup Frame Output Interface */
315 JME_SMI = JME_MAC | 0x50, /* Station Management Interface */
316 JME_GHC = JME_MAC | 0x54, /* Global Host Control */
317 JME_PMCS = JME_MAC | 0x60, /* Power Management Control/Stat */
320 JME_PHY_CS = JME_PHY | 0x28, /* PHY Ctrl and Status Register */
321 JME_PHY_LINK = JME_PHY | 0x30, /* PHY Link Status Register */
322 JME_SMBCSR = JME_PHY | 0x40, /* SMB Control and Status */
323 JME_SMBINTF = JME_PHY | 0x44, /* SMB Interface */
326 JME_TMCSR = JME_MISC | 0x00, /* Timer Control/Status Register */
327 JME_GPREG0 = JME_MISC | 0x08, /* General purpose REG-0 */
328 JME_GPREG1 = JME_MISC | 0x0C, /* General purpose REG-1 */
329 JME_IEVE = JME_MISC | 0x20, /* Interrupt Event Status */
330 JME_IREQ = JME_MISC | 0x24, /* Intr Req Status(For Debug) */
331 JME_IENS = JME_MISC | 0x28, /* Intr Enable - Setting Port */
332 JME_IENC = JME_MISC | 0x2C, /* Interrupt Enable - Clear Port */
333 JME_PCCRX0 = JME_MISC | 0x30, /* PCC Control for RX Queue 0 */
334 JME_PCCTX = JME_MISC | 0x40, /* PCC Control for TX Queues */
335 JME_CHIPMODE = JME_MISC | 0x44, /* Identify FPGA Version */
336 JME_SHBA_HI = JME_MISC | 0x48, /* Shadow Register Base HI */
337 JME_SHBA_LO = JME_MISC | 0x4C, /* Shadow Register Base LO */
338 JME_TIMER1 = JME_MISC | 0x70, /* Timer1 */
339 JME_TIMER2 = JME_MISC | 0x74, /* Timer2 */
340 JME_APMC = JME_MISC | 0x7C, /* Aggressive Power Mode Control */
341 JME_PCCSRX0 = JME_MISC | 0x80, /* PCC Status of RX0 */
345 * TX Control/Status Bits
348 TXCS_QUEUE7S = 0x00008000,
349 TXCS_QUEUE6S = 0x00004000,
350 TXCS_QUEUE5S = 0x00002000,
351 TXCS_QUEUE4S = 0x00001000,
352 TXCS_QUEUE3S = 0x00000800,
353 TXCS_QUEUE2S = 0x00000400,
354 TXCS_QUEUE1S = 0x00000200,
355 TXCS_QUEUE0S = 0x00000100,
356 TXCS_FIFOTH = 0x000000C0,
357 TXCS_DMASIZE = 0x00000030,
358 TXCS_BURST = 0x00000004,
359 TXCS_ENABLE = 0x00000001,
362 enum jme_txcs_value {
363 TXCS_FIFOTH_16QW = 0x000000C0,
364 TXCS_FIFOTH_12QW = 0x00000080,
365 TXCS_FIFOTH_8QW = 0x00000040,
366 TXCS_FIFOTH_4QW = 0x00000000,
368 TXCS_DMASIZE_64B = 0x00000000,
369 TXCS_DMASIZE_128B = 0x00000010,
370 TXCS_DMASIZE_256B = 0x00000020,
371 TXCS_DMASIZE_512B = 0x00000030,
373 TXCS_SELECT_QUEUE0 = 0x00000000,
374 TXCS_SELECT_QUEUE1 = 0x00010000,
375 TXCS_SELECT_QUEUE2 = 0x00020000,
376 TXCS_SELECT_QUEUE3 = 0x00030000,
377 TXCS_SELECT_QUEUE4 = 0x00040000,
378 TXCS_SELECT_QUEUE5 = 0x00050000,
379 TXCS_SELECT_QUEUE6 = 0x00060000,
380 TXCS_SELECT_QUEUE7 = 0x00070000,
382 TXCS_DEFAULT = TXCS_FIFOTH_4QW |
386 #define JME_TX_DISABLE_TIMEOUT 10 /* 10 msec */
389 * TX MAC Control/Status Bits
391 enum jme_txmcs_bit_masks {
392 TXMCS_IFG2 = 0xC0000000,
393 TXMCS_IFG1 = 0x30000000,
394 TXMCS_TTHOLD = 0x00000300,
395 TXMCS_FBURST = 0x00000080,
396 TXMCS_CARRIEREXT = 0x00000040,
397 TXMCS_DEFER = 0x00000020,
398 TXMCS_BACKOFF = 0x00000010,
399 TXMCS_CARRIERSENSE = 0x00000008,
400 TXMCS_COLLISION = 0x00000004,
401 TXMCS_CRC = 0x00000002,
402 TXMCS_PADDING = 0x00000001,
405 enum jme_txmcs_values {
406 TXMCS_IFG2_6_4 = 0x00000000,
407 TXMCS_IFG2_8_5 = 0x40000000,
408 TXMCS_IFG2_10_6 = 0x80000000,
409 TXMCS_IFG2_12_7 = 0xC0000000,
411 TXMCS_IFG1_8_4 = 0x00000000,
412 TXMCS_IFG1_12_6 = 0x10000000,
413 TXMCS_IFG1_16_8 = 0x20000000,
414 TXMCS_IFG1_20_10 = 0x30000000,
416 TXMCS_TTHOLD_1_8 = 0x00000000,
417 TXMCS_TTHOLD_1_4 = 0x00000100,
418 TXMCS_TTHOLD_1_2 = 0x00000200,
419 TXMCS_TTHOLD_FULL = 0x00000300,
421 TXMCS_DEFAULT = TXMCS_IFG2_8_5 |
429 enum jme_txpfc_bits_masks {
430 TXPFC_VLAN_TAG = 0xFFFF0000,
431 TXPFC_VLAN_EN = 0x00008000,
432 TXPFC_PF_EN = 0x00000001,
435 enum jme_txtrhd_bits_masks {
436 TXTRHD_TXPEN = 0x80000000,
437 TXTRHD_TXP = 0x7FFFFF00,
438 TXTRHD_TXREN = 0x00000080,
439 TXTRHD_TXRL = 0x0000007F,
442 enum jme_txtrhd_shifts {
443 TXTRHD_TXP_SHIFT = 8,
444 TXTRHD_TXRL_SHIFT = 0,
448 * RX Control/Status Bits
450 enum jme_rxcs_bit_masks {
451 /* FIFO full threshold for transmitting Tx Pause Packet */
452 RXCS_FIFOTHTP = 0x30000000,
453 /* FIFO threshold for processing next packet */
454 RXCS_FIFOTHNP = 0x0C000000,
455 RXCS_DMAREQSZ = 0x03000000, /* DMA Request Size */
456 RXCS_QUEUESEL = 0x00030000, /* Queue selection */
457 RXCS_RETRYGAP = 0x0000F000, /* RX Desc full retry gap */
458 RXCS_RETRYCNT = 0x00000F00, /* RX Desc full retry counter */
459 RXCS_WAKEUP = 0x00000040, /* Enable receive wakeup packet */
460 RXCS_MAGIC = 0x00000020, /* Enable receive magic packet */
461 RXCS_SHORT = 0x00000010, /* Enable receive short packet */
462 RXCS_ABORT = 0x00000008, /* Enable receive errorr packet */
463 RXCS_QST = 0x00000004, /* Receive queue start */
464 RXCS_SUSPEND = 0x00000002,
465 RXCS_ENABLE = 0x00000001,
468 enum jme_rxcs_values {
469 RXCS_FIFOTHTP_16T = 0x00000000,
470 RXCS_FIFOTHTP_32T = 0x10000000,
471 RXCS_FIFOTHTP_64T = 0x20000000,
472 RXCS_FIFOTHTP_128T = 0x30000000,
474 RXCS_FIFOTHNP_16QW = 0x00000000,
475 RXCS_FIFOTHNP_32QW = 0x04000000,
476 RXCS_FIFOTHNP_64QW = 0x08000000,
477 RXCS_FIFOTHNP_128QW = 0x0C000000,
479 RXCS_DMAREQSZ_16B = 0x00000000,
480 RXCS_DMAREQSZ_32B = 0x01000000,
481 RXCS_DMAREQSZ_64B = 0x02000000,
482 RXCS_DMAREQSZ_128B = 0x03000000,
484 RXCS_QUEUESEL_Q0 = 0x00000000,
485 RXCS_QUEUESEL_Q1 = 0x00010000,
486 RXCS_QUEUESEL_Q2 = 0x00020000,
487 RXCS_QUEUESEL_Q3 = 0x00030000,
489 RXCS_RETRYGAP_256ns = 0x00000000,
490 RXCS_RETRYGAP_512ns = 0x00001000,
491 RXCS_RETRYGAP_1024ns = 0x00002000,
492 RXCS_RETRYGAP_2048ns = 0x00003000,
493 RXCS_RETRYGAP_4096ns = 0x00004000,
494 RXCS_RETRYGAP_8192ns = 0x00005000,
495 RXCS_RETRYGAP_16384ns = 0x00006000,
496 RXCS_RETRYGAP_32768ns = 0x00007000,
498 RXCS_RETRYCNT_0 = 0x00000000,
499 RXCS_RETRYCNT_4 = 0x00000100,
500 RXCS_RETRYCNT_8 = 0x00000200,
501 RXCS_RETRYCNT_12 = 0x00000300,
502 RXCS_RETRYCNT_16 = 0x00000400,
503 RXCS_RETRYCNT_20 = 0x00000500,
504 RXCS_RETRYCNT_24 = 0x00000600,
505 RXCS_RETRYCNT_28 = 0x00000700,
506 RXCS_RETRYCNT_32 = 0x00000800,
507 RXCS_RETRYCNT_36 = 0x00000900,
508 RXCS_RETRYCNT_40 = 0x00000A00,
509 RXCS_RETRYCNT_44 = 0x00000B00,
510 RXCS_RETRYCNT_48 = 0x00000C00,
511 RXCS_RETRYCNT_52 = 0x00000D00,
512 RXCS_RETRYCNT_56 = 0x00000E00,
513 RXCS_RETRYCNT_60 = 0x00000F00,
515 RXCS_DEFAULT = RXCS_FIFOTHTP_128T |
516 RXCS_FIFOTHNP_128QW |
518 RXCS_RETRYGAP_256ns |
522 #define JME_RX_DISABLE_TIMEOUT 10 /* 10 msec */
525 * RX MAC Control/Status Bits
527 enum jme_rxmcs_bits {
528 RXMCS_ALLFRAME = 0x00000800,
529 RXMCS_BRDFRAME = 0x00000400,
530 RXMCS_MULFRAME = 0x00000200,
531 RXMCS_UNIFRAME = 0x00000100,
532 RXMCS_ALLMULFRAME = 0x00000080,
533 RXMCS_MULFILTERED = 0x00000040,
534 RXMCS_RXCOLLDEC = 0x00000020,
535 RXMCS_FLOWCTRL = 0x00000008,
536 RXMCS_VTAGRM = 0x00000004,
537 RXMCS_PREPAD = 0x00000002,
538 RXMCS_CHECKSUM = 0x00000001,
540 RXMCS_DEFAULT = RXMCS_VTAGRM |
546 * Wakeup Frame setup interface registers
548 #define WAKEUP_FRAME_NR 8
549 #define WAKEUP_FRAME_MASK_DWNR 4
551 enum jme_wfoi_bit_masks {
552 WFOI_MASK_SEL = 0x00000070,
553 WFOI_CRC_SEL = 0x00000008,
554 WFOI_FRAME_SEL = 0x00000007,
557 enum jme_wfoi_shifts {
562 * SMI Related definitions
564 enum jme_smi_bit_mask {
565 SMI_DATA_MASK = 0xFFFF0000,
566 SMI_REG_ADDR_MASK = 0x0000F800,
567 SMI_PHY_ADDR_MASK = 0x000007C0,
568 SMI_OP_WRITE = 0x00000020,
569 /* Set to 1, after req done it'll be cleared to 0 */
570 SMI_OP_REQ = 0x00000010,
571 SMI_OP_MDIO = 0x00000008, /* Software assess In/Out */
572 SMI_OP_MDOE = 0x00000004, /* Software Output Enable */
573 SMI_OP_MDC = 0x00000002, /* Software CLK Control */
574 SMI_OP_MDEN = 0x00000001, /* Software access Enable */
577 enum jme_smi_bit_shift {
579 SMI_REG_ADDR_SHIFT = 11,
580 SMI_PHY_ADDR_SHIFT = 6,
583 static inline uint32_t smi_reg_addr(int x)
585 return (x << SMI_REG_ADDR_SHIFT) & SMI_REG_ADDR_MASK;
588 static inline uint32_t smi_phy_addr(int x)
590 return (x << SMI_PHY_ADDR_SHIFT) & SMI_PHY_ADDR_MASK;
593 #define JME_PHY_TIMEOUT 100 /* 100 msec */
594 #define JME_PHY_REG_NR 32
597 * Global Host Control
599 enum jme_ghc_bit_mask {
600 GHC_SWRST = 0x40000000,
601 GHC_DPX = 0x00000040,
602 GHC_SPEED = 0x00000030,
603 GHC_LINK_POLL = 0x00000001,
606 enum jme_ghc_speed_val {
607 GHC_SPEED_10M = 0x00000010,
608 GHC_SPEED_100M = 0x00000020,
609 GHC_SPEED_1000M = 0x00000030,
612 enum jme_ghc_to_clk {
613 GHC_TO_CLK_OFF = 0x00000000,
614 GHC_TO_CLK_GPHY = 0x00400000,
615 GHC_TO_CLK_PCIE = 0x00800000,
616 GHC_TO_CLK_INVALID = 0x00C00000,
619 enum jme_ghc_txmac_clk {
620 GHC_TXMAC_CLK_OFF = 0x00000000,
621 GHC_TXMAC_CLK_GPHY = 0x00100000,
622 GHC_TXMAC_CLK_PCIE = 0x00200000,
623 GHC_TXMAC_CLK_INVALID = 0x00300000,
627 * Power management control and status register
629 enum jme_pmcs_bit_masks {
630 PMCS_WF7DET = 0x80000000,
631 PMCS_WF6DET = 0x40000000,
632 PMCS_WF5DET = 0x20000000,
633 PMCS_WF4DET = 0x10000000,
634 PMCS_WF3DET = 0x08000000,
635 PMCS_WF2DET = 0x04000000,
636 PMCS_WF1DET = 0x02000000,
637 PMCS_WF0DET = 0x01000000,
638 PMCS_LFDET = 0x00040000,
639 PMCS_LRDET = 0x00020000,
640 PMCS_MFDET = 0x00010000,
641 PMCS_WF7EN = 0x00008000,
642 PMCS_WF6EN = 0x00004000,
643 PMCS_WF5EN = 0x00002000,
644 PMCS_WF4EN = 0x00001000,
645 PMCS_WF3EN = 0x00000800,
646 PMCS_WF2EN = 0x00000400,
647 PMCS_WF1EN = 0x00000200,
648 PMCS_WF0EN = 0x00000100,
649 PMCS_LFEN = 0x00000004,
650 PMCS_LREN = 0x00000002,
651 PMCS_MFEN = 0x00000001,
655 * Giga PHY Status Registers
657 enum jme_phy_link_bit_mask {
658 PHY_LINK_SPEED_MASK = 0x0000C000,
659 PHY_LINK_DUPLEX = 0x00002000,
660 PHY_LINK_SPEEDDPU_RESOLVED = 0x00000800,
661 PHY_LINK_UP = 0x00000400,
662 PHY_LINK_AUTONEG_COMPLETE = 0x00000200,
663 PHY_LINK_MDI_STAT = 0x00000040,
666 enum jme_phy_link_speed_val {
667 PHY_LINK_SPEED_10M = 0x00000000,
668 PHY_LINK_SPEED_100M = 0x00004000,
669 PHY_LINK_SPEED_1000M = 0x00008000,
672 #define JME_SPDRSV_TIMEOUT 500 /* 500 us */
675 * SMB Control and Status
677 enum jme_smbcsr_bit_mask {
678 SMBCSR_CNACK = 0x00020000,
679 SMBCSR_RELOAD = 0x00010000,
680 SMBCSR_EEPROMD = 0x00000020,
681 SMBCSR_INITDONE = 0x00000010,
682 SMBCSR_BUSY = 0x0000000F,
685 enum jme_smbintf_bit_mask {
686 SMBINTF_HWDATR = 0xFF000000,
687 SMBINTF_HWDATW = 0x00FF0000,
688 SMBINTF_HWADDR = 0x0000FF00,
689 SMBINTF_HWRWN = 0x00000020,
690 SMBINTF_HWCMD = 0x00000010,
691 SMBINTF_FASTM = 0x00000008,
692 SMBINTF_GPIOSCL = 0x00000004,
693 SMBINTF_GPIOSDA = 0x00000002,
694 SMBINTF_GPIOEN = 0x00000001,
697 enum jme_smbintf_vals {
698 SMBINTF_HWRWN_READ = 0x00000020,
699 SMBINTF_HWRWN_WRITE = 0x00000000,
702 enum jme_smbintf_shifts {
703 SMBINTF_HWDATR_SHIFT = 24,
704 SMBINTF_HWDATW_SHIFT = 16,
705 SMBINTF_HWADDR_SHIFT = 8,
708 #define JME_EEPROM_RELOAD_TIMEOUT 2000 /* 2000 msec */
709 #define JME_SMB_BUSY_TIMEOUT 20 /* 20 msec */
710 #define JME_SMB_LEN 256
711 #define JME_EEPROM_MAGIC 0x250
714 * Timer Control/Status Register
716 enum jme_tmcsr_bit_masks {
717 TMCSR_SWIT = 0x80000000,
718 TMCSR_EN = 0x01000000,
719 TMCSR_CNT = 0x00FFFFFF,
723 * General Purpose REG-0
725 enum jme_gpreg0_masks {
726 GPREG0_DISSH = 0xFF000000,
727 GPREG0_PCIRLMT = 0x00300000,
728 GPREG0_PCCNOMUTCLR = 0x00040000,
729 GPREG0_LNKINTPOLL = 0x00001000,
730 GPREG0_PCCTMR = 0x00000300,
731 GPREG0_PHYADDR = 0x0000001F,
734 enum jme_gpreg0_vals {
735 GPREG0_DISSH_DW7 = 0x80000000,
736 GPREG0_DISSH_DW6 = 0x40000000,
737 GPREG0_DISSH_DW5 = 0x20000000,
738 GPREG0_DISSH_DW4 = 0x10000000,
739 GPREG0_DISSH_DW3 = 0x08000000,
740 GPREG0_DISSH_DW2 = 0x04000000,
741 GPREG0_DISSH_DW1 = 0x02000000,
742 GPREG0_DISSH_DW0 = 0x01000000,
743 GPREG0_DISSH_ALL = 0xFF000000,
745 GPREG0_PCIRLMT_8 = 0x00000000,
746 GPREG0_PCIRLMT_6 = 0x00100000,
747 GPREG0_PCIRLMT_5 = 0x00200000,
748 GPREG0_PCIRLMT_4 = 0x00300000,
750 GPREG0_PCCTMR_16ns = 0x00000000,
751 GPREG0_PCCTMR_256ns = 0x00000100,
752 GPREG0_PCCTMR_1us = 0x00000200,
753 GPREG0_PCCTMR_1ms = 0x00000300,
755 GPREG0_PHYADDR_1 = 0x00000001,
757 GPREG0_DEFAULT = GPREG0_DISSH_ALL |
764 * General Purpose REG-1
765 * Note: All theses bits defined here are for
766 * Chip mode revision 0x11 only
768 enum jme_gpreg1_masks {
769 GPREG1_INTRDELAYUNIT = 0x00000018,
770 GPREG1_INTRDELAYENABLE = 0x00000007,
773 enum jme_gpreg1_vals {
774 GPREG1_RSSPATCH = 0x00000040,
775 GPREG1_HALFMODEPATCH = 0x00000020,
777 GPREG1_INTDLYUNIT_16NS = 0x00000000,
778 GPREG1_INTDLYUNIT_256NS = 0x00000008,
779 GPREG1_INTDLYUNIT_1US = 0x00000010,
780 GPREG1_INTDLYUNIT_16US = 0x00000018,
782 GPREG1_INTDLYEN_1U = 0x00000001,
783 GPREG1_INTDLYEN_2U = 0x00000002,
784 GPREG1_INTDLYEN_3U = 0x00000003,
785 GPREG1_INTDLYEN_4U = 0x00000004,
786 GPREG1_INTDLYEN_5U = 0x00000005,
787 GPREG1_INTDLYEN_6U = 0x00000006,
788 GPREG1_INTDLYEN_7U = 0x00000007,
790 GPREG1_DEFAULT = 0x00000000,
794 * Interrupt Status Bits
796 enum jme_interrupt_bits {
797 INTR_SWINTR = 0x80000000,
798 INTR_TMINTR = 0x40000000,
799 INTR_LINKCH = 0x20000000,
800 INTR_PAUSERCV = 0x10000000,
801 INTR_MAGICRCV = 0x08000000,
802 INTR_WAKERCV = 0x04000000,
803 INTR_PCCRX0TO = 0x02000000,
804 INTR_PCCRX1TO = 0x01000000,
805 INTR_PCCRX2TO = 0x00800000,
806 INTR_PCCRX3TO = 0x00400000,
807 INTR_PCCTXTO = 0x00200000,
808 INTR_PCCRX0 = 0x00100000,
809 INTR_PCCRX1 = 0x00080000,
810 INTR_PCCRX2 = 0x00040000,
811 INTR_PCCRX3 = 0x00020000,
812 INTR_PCCTX = 0x00010000,
813 INTR_RX3EMP = 0x00008000,
814 INTR_RX2EMP = 0x00004000,
815 INTR_RX1EMP = 0x00002000,
816 INTR_RX0EMP = 0x00001000,
817 INTR_RX3 = 0x00000800,
818 INTR_RX2 = 0x00000400,
819 INTR_RX1 = 0x00000200,
820 INTR_RX0 = 0x00000100,
821 INTR_TX7 = 0x00000080,
822 INTR_TX6 = 0x00000040,
823 INTR_TX5 = 0x00000020,
824 INTR_TX4 = 0x00000010,
825 INTR_TX3 = 0x00000008,
826 INTR_TX2 = 0x00000004,
827 INTR_TX1 = 0x00000002,
828 INTR_TX0 = 0x00000001,
831 static const uint32_t INTR_ENABLE = INTR_LINKCH |
837 * PCC Control Registers
839 enum jme_pccrx_masks {
840 PCCRXTO_MASK = 0xFFFF0000,
841 PCCRX_MASK = 0x0000FF00,
844 enum jme_pcctx_masks {
845 PCCTXTO_MASK = 0xFFFF0000,
846 PCCTX_MASK = 0x0000FF00,
847 PCCTX_QS_MASK = 0x000000FF,
850 enum jme_pccrx_shifts {
855 enum jme_pcctx_shifts {
860 enum jme_pcctx_bits {
861 PCCTXQ0_EN = 0x00000001,
862 PCCTXQ1_EN = 0x00000002,
863 PCCTXQ2_EN = 0x00000004,
864 PCCTXQ3_EN = 0x00000008,
865 PCCTXQ4_EN = 0x00000010,
866 PCCTXQ5_EN = 0x00000020,
867 PCCTXQ6_EN = 0x00000040,
868 PCCTXQ7_EN = 0x00000080,
874 enum jme_chipmode_bit_masks {
875 CM_FPGAVER_MASK = 0xFFFF0000,
876 CM_CHIPREV_MASK = 0x0000FF00,
877 CM_CHIPMODE_MASK = 0x0000000F,
880 enum jme_chipmode_shifts {
881 CM_FPGAVER_SHIFT = 16,
882 CM_CHIPREV_SHIFT = 8,
888 static inline int is_buggy250(unsigned short device, unsigned int chiprev)
890 return device == PCI_DEVICE_ID_JMICRON_JMC250 && chiprev == 0x11;
894 * Read/Write I/O Registers
896 static inline uint32_t jread32(struct jme_adapter *jme, uint32_t reg)
898 return readl(jme->regs + reg);
901 static inline void jwrite32(struct jme_adapter *jme, uint32_t reg, uint32_t val)
903 writel(val, jme->regs + reg);
906 static void jwrite32f(struct jme_adapter *jme, uint32_t reg, uint32_t val)
909 * Read after write should cause flush
911 writel(val, jme->regs + reg);
912 readl(jme->regs + reg);