162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * JMicron JMC2x0 series PCIe Ethernet Linux Device Driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2008 JMicron Technology Corporation
662306a36Sopenharmony_ci * https://www.jmicron.com/
762306a36Sopenharmony_ci * Copyright (c) 2009 - 2010 Guo-Fu Tseng <cooldavid@cooldavid.org>
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Author: Guo-Fu Tseng <cooldavid@cooldavid.org>
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef __JME_H_INCLUDED__
1362306a36Sopenharmony_ci#define __JME_H_INCLUDED__
1462306a36Sopenharmony_ci#include <linux/interrupt.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define DRV_NAME	"jme"
1762306a36Sopenharmony_ci#define DRV_VERSION	"1.0.8"
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define PCI_DEVICE_ID_JMICRON_JMC250	0x0250
2062306a36Sopenharmony_ci#define PCI_DEVICE_ID_JMICRON_JMC260	0x0260
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/*
2362306a36Sopenharmony_ci * Message related definitions
2462306a36Sopenharmony_ci */
2562306a36Sopenharmony_ci#define JME_DEF_MSG_ENABLE \
2662306a36Sopenharmony_ci	(NETIF_MSG_PROBE | \
2762306a36Sopenharmony_ci	NETIF_MSG_LINK | \
2862306a36Sopenharmony_ci	NETIF_MSG_RX_ERR | \
2962306a36Sopenharmony_ci	NETIF_MSG_TX_ERR | \
3062306a36Sopenharmony_ci	NETIF_MSG_HW)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#ifdef TX_DEBUG
3362306a36Sopenharmony_ci#define tx_dbg(priv, fmt, args...)					\
3462306a36Sopenharmony_ci	printk(KERN_DEBUG "%s: " fmt, (priv)->dev->name, ##args)
3562306a36Sopenharmony_ci#else
3662306a36Sopenharmony_ci#define tx_dbg(priv, fmt, args...)					\
3762306a36Sopenharmony_cido {									\
3862306a36Sopenharmony_ci	if (0)								\
3962306a36Sopenharmony_ci		printk(KERN_DEBUG "%s: " fmt, (priv)->dev->name, ##args); \
4062306a36Sopenharmony_ci} while (0)
4162306a36Sopenharmony_ci#endif
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/*
4462306a36Sopenharmony_ci * Extra PCI Configuration space interface
4562306a36Sopenharmony_ci */
4662306a36Sopenharmony_ci#define PCI_DCSR_MRRS		0x59
4762306a36Sopenharmony_ci#define PCI_DCSR_MRRS_MASK	0x70
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cienum pci_dcsr_mrrs_vals {
5062306a36Sopenharmony_ci	MRRS_128B	= 0x00,
5162306a36Sopenharmony_ci	MRRS_256B	= 0x10,
5262306a36Sopenharmony_ci	MRRS_512B	= 0x20,
5362306a36Sopenharmony_ci	MRRS_1024B	= 0x30,
5462306a36Sopenharmony_ci	MRRS_2048B	= 0x40,
5562306a36Sopenharmony_ci	MRRS_4096B	= 0x50,
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define PCI_SPI			0xB0
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cienum pci_spi_bits {
6162306a36Sopenharmony_ci	SPI_EN		= 0x10,
6262306a36Sopenharmony_ci	SPI_MISO	= 0x08,
6362306a36Sopenharmony_ci	SPI_MOSI	= 0x04,
6462306a36Sopenharmony_ci	SPI_SCLK	= 0x02,
6562306a36Sopenharmony_ci	SPI_CS		= 0x01,
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistruct jme_spi_op {
6962306a36Sopenharmony_ci	void __user *uwbuf;
7062306a36Sopenharmony_ci	void __user *urbuf;
7162306a36Sopenharmony_ci	__u8	wn;	/* Number of write actions */
7262306a36Sopenharmony_ci	__u8	rn;	/* Number of read actions */
7362306a36Sopenharmony_ci	__u8	bitn;	/* Number of bits per action */
7462306a36Sopenharmony_ci	__u8	spd;	/* The maxim acceptable speed of controller, in MHz.*/
7562306a36Sopenharmony_ci	__u8	mode;	/* CPOL, CPHA, and Duplex mode of SPI */
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	/* Internal use only */
7862306a36Sopenharmony_ci	u8	*kwbuf;
7962306a36Sopenharmony_ci	u8	*krbuf;
8062306a36Sopenharmony_ci	u8	sr;
8162306a36Sopenharmony_ci	u16	halfclk; /* Half of clock cycle calculated from spd, in ns */
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cienum jme_spi_op_bits {
8562306a36Sopenharmony_ci	SPI_MODE_CPHA	= 0x01,
8662306a36Sopenharmony_ci	SPI_MODE_CPOL	= 0x02,
8762306a36Sopenharmony_ci	SPI_MODE_DUP	= 0x80,
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci#define HALF_US 500	/* 500 ns */
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#define PCI_PRIV_PE1		0xE4
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cienum pci_priv_pe1_bit_masks {
9562306a36Sopenharmony_ci	PE1_ASPMSUPRT	= 0x00000003, /*
9662306a36Sopenharmony_ci				       * RW:
9762306a36Sopenharmony_ci				       * Aspm_support[1:0]
9862306a36Sopenharmony_ci				       * (R/W Port of 5C[11:10])
9962306a36Sopenharmony_ci				       */
10062306a36Sopenharmony_ci	PE1_MULTIFUN	= 0x00000004, /* RW: Multi_fun_bit */
10162306a36Sopenharmony_ci	PE1_RDYDMA	= 0x00000008, /* RO: ~link.rdy_for_dma */
10262306a36Sopenharmony_ci	PE1_ASPMOPTL	= 0x00000030, /* RW: link.rx10s_option[1:0] */
10362306a36Sopenharmony_ci	PE1_ASPMOPTH	= 0x000000C0, /* RW: 10_req=[3]?HW:[2] */
10462306a36Sopenharmony_ci	PE1_GPREG0	= 0x0000FF00, /*
10562306a36Sopenharmony_ci				       * SRW:
10662306a36Sopenharmony_ci				       * Cfg_gp_reg0
10762306a36Sopenharmony_ci				       * [7:6] phy_giga BG control
10862306a36Sopenharmony_ci				       * [5] CREQ_N as CREQ_N1 (CPPE# as CREQ#)
10962306a36Sopenharmony_ci				       * [4:0] Reserved
11062306a36Sopenharmony_ci				       */
11162306a36Sopenharmony_ci	PE1_GPREG0_PBG	= 0x0000C000, /* phy_giga BG control */
11262306a36Sopenharmony_ci	PE1_GPREG1	= 0x00FF0000, /* RW: Cfg_gp_reg1 */
11362306a36Sopenharmony_ci	PE1_REVID	= 0xFF000000, /* RO: Rev ID */
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cienum pci_priv_pe1_values {
11762306a36Sopenharmony_ci	PE1_GPREG0_ENBG		= 0x00000000, /* en BG */
11862306a36Sopenharmony_ci	PE1_GPREG0_PDD3COLD	= 0x00004000, /* giga_PD + d3cold */
11962306a36Sopenharmony_ci	PE1_GPREG0_PDPCIESD	= 0x00008000, /* giga_PD + pcie_shutdown */
12062306a36Sopenharmony_ci	PE1_GPREG0_PDPCIEIDDQ	= 0x0000C000, /* giga_PD + pcie_iddq */
12162306a36Sopenharmony_ci};
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci/*
12462306a36Sopenharmony_ci * Dynamic(adaptive)/Static PCC values
12562306a36Sopenharmony_ci */
12662306a36Sopenharmony_cienum dynamic_pcc_values {
12762306a36Sopenharmony_ci	PCC_OFF		= 0,
12862306a36Sopenharmony_ci	PCC_P1		= 1,
12962306a36Sopenharmony_ci	PCC_P2		= 2,
13062306a36Sopenharmony_ci	PCC_P3		= 3,
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	PCC_OFF_TO	= 0,
13362306a36Sopenharmony_ci	PCC_P1_TO	= 1,
13462306a36Sopenharmony_ci	PCC_P2_TO	= 64,
13562306a36Sopenharmony_ci	PCC_P3_TO	= 128,
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	PCC_OFF_CNT	= 0,
13862306a36Sopenharmony_ci	PCC_P1_CNT	= 1,
13962306a36Sopenharmony_ci	PCC_P2_CNT	= 16,
14062306a36Sopenharmony_ci	PCC_P3_CNT	= 32,
14162306a36Sopenharmony_ci};
14262306a36Sopenharmony_cistruct dynpcc_info {
14362306a36Sopenharmony_ci	unsigned long	last_bytes;
14462306a36Sopenharmony_ci	unsigned long	last_pkts;
14562306a36Sopenharmony_ci	unsigned long	intr_cnt;
14662306a36Sopenharmony_ci	unsigned char	cur;
14762306a36Sopenharmony_ci	unsigned char	attempt;
14862306a36Sopenharmony_ci	unsigned char	cnt;
14962306a36Sopenharmony_ci};
15062306a36Sopenharmony_ci#define PCC_INTERVAL_US	100000
15162306a36Sopenharmony_ci#define PCC_INTERVAL (HZ / (1000000 / PCC_INTERVAL_US))
15262306a36Sopenharmony_ci#define PCC_P3_THRESHOLD (2 * 1024 * 1024)
15362306a36Sopenharmony_ci#define PCC_P2_THRESHOLD 800
15462306a36Sopenharmony_ci#define PCC_INTR_THRESHOLD 800
15562306a36Sopenharmony_ci#define PCC_TX_TO 1000
15662306a36Sopenharmony_ci#define PCC_TX_CNT 8
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/*
15962306a36Sopenharmony_ci * TX/RX Descriptors
16062306a36Sopenharmony_ci *
16162306a36Sopenharmony_ci * TX/RX Ring DESC Count Must be multiple of 16 and <= 1024
16262306a36Sopenharmony_ci */
16362306a36Sopenharmony_ci#define RING_DESC_ALIGN		16	/* Descriptor alignment */
16462306a36Sopenharmony_ci#define TX_DESC_SIZE		16
16562306a36Sopenharmony_ci#define TX_RING_NR		8
16662306a36Sopenharmony_ci#define TX_RING_ALLOC_SIZE(s)	((s * TX_DESC_SIZE) + RING_DESC_ALIGN)
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_cistruct txdesc {
16962306a36Sopenharmony_ci	union {
17062306a36Sopenharmony_ci		__u8	all[16];
17162306a36Sopenharmony_ci		__le32	dw[4];
17262306a36Sopenharmony_ci		struct {
17362306a36Sopenharmony_ci			/* DW0 */
17462306a36Sopenharmony_ci			__le16	vlan;
17562306a36Sopenharmony_ci			__u8	rsv1;
17662306a36Sopenharmony_ci			__u8	flags;
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci			/* DW1 */
17962306a36Sopenharmony_ci			__le16	datalen;
18062306a36Sopenharmony_ci			__le16	mss;
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci			/* DW2 */
18362306a36Sopenharmony_ci			__le16	pktsize;
18462306a36Sopenharmony_ci			__le16	rsv2;
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci			/* DW3 */
18762306a36Sopenharmony_ci			__le32	bufaddr;
18862306a36Sopenharmony_ci		} desc1;
18962306a36Sopenharmony_ci		struct {
19062306a36Sopenharmony_ci			/* DW0 */
19162306a36Sopenharmony_ci			__le16	rsv1;
19262306a36Sopenharmony_ci			__u8	rsv2;
19362306a36Sopenharmony_ci			__u8	flags;
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci			/* DW1 */
19662306a36Sopenharmony_ci			__le16	datalen;
19762306a36Sopenharmony_ci			__le16	rsv3;
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci			/* DW2 */
20062306a36Sopenharmony_ci			__le32	bufaddrh;
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci			/* DW3 */
20362306a36Sopenharmony_ci			__le32	bufaddrl;
20462306a36Sopenharmony_ci		} desc2;
20562306a36Sopenharmony_ci		struct {
20662306a36Sopenharmony_ci			/* DW0 */
20762306a36Sopenharmony_ci			__u8	ehdrsz;
20862306a36Sopenharmony_ci			__u8	rsv1;
20962306a36Sopenharmony_ci			__u8	rsv2;
21062306a36Sopenharmony_ci			__u8	flags;
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci			/* DW1 */
21362306a36Sopenharmony_ci			__le16	trycnt;
21462306a36Sopenharmony_ci			__le16	segcnt;
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci			/* DW2 */
21762306a36Sopenharmony_ci			__le16	pktsz;
21862306a36Sopenharmony_ci			__le16	rsv3;
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci			/* DW3 */
22162306a36Sopenharmony_ci			__le32	bufaddrl;
22262306a36Sopenharmony_ci		} descwb;
22362306a36Sopenharmony_ci	};
22462306a36Sopenharmony_ci};
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_cienum jme_txdesc_flags_bits {
22762306a36Sopenharmony_ci	TXFLAG_OWN	= 0x80,
22862306a36Sopenharmony_ci	TXFLAG_INT	= 0x40,
22962306a36Sopenharmony_ci	TXFLAG_64BIT	= 0x20,
23062306a36Sopenharmony_ci	TXFLAG_TCPCS	= 0x10,
23162306a36Sopenharmony_ci	TXFLAG_UDPCS	= 0x08,
23262306a36Sopenharmony_ci	TXFLAG_IPCS	= 0x04,
23362306a36Sopenharmony_ci	TXFLAG_LSEN	= 0x02,
23462306a36Sopenharmony_ci	TXFLAG_TAGON	= 0x01,
23562306a36Sopenharmony_ci};
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci#define TXDESC_MSS_SHIFT	2
23862306a36Sopenharmony_cienum jme_txwbdesc_flags_bits {
23962306a36Sopenharmony_ci	TXWBFLAG_OWN	= 0x80,
24062306a36Sopenharmony_ci	TXWBFLAG_INT	= 0x40,
24162306a36Sopenharmony_ci	TXWBFLAG_TMOUT	= 0x20,
24262306a36Sopenharmony_ci	TXWBFLAG_TRYOUT	= 0x10,
24362306a36Sopenharmony_ci	TXWBFLAG_COL	= 0x08,
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	TXWBFLAG_ALLERR	= TXWBFLAG_TMOUT |
24662306a36Sopenharmony_ci			  TXWBFLAG_TRYOUT |
24762306a36Sopenharmony_ci			  TXWBFLAG_COL,
24862306a36Sopenharmony_ci};
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci#define RX_DESC_SIZE		16
25162306a36Sopenharmony_ci#define RX_RING_NR		4
25262306a36Sopenharmony_ci#define RX_RING_ALLOC_SIZE(s)	((s * RX_DESC_SIZE) + RING_DESC_ALIGN)
25362306a36Sopenharmony_ci#define RX_BUF_DMA_ALIGN	8
25462306a36Sopenharmony_ci#define RX_PREPAD_SIZE		10
25562306a36Sopenharmony_ci#define ETH_CRC_LEN		2
25662306a36Sopenharmony_ci#define RX_VLANHDR_LEN		2
25762306a36Sopenharmony_ci#define RX_EXTRA_LEN		(RX_PREPAD_SIZE + \
25862306a36Sopenharmony_ci				ETH_HLEN + \
25962306a36Sopenharmony_ci				ETH_CRC_LEN + \
26062306a36Sopenharmony_ci				RX_VLANHDR_LEN + \
26162306a36Sopenharmony_ci				RX_BUF_DMA_ALIGN)
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_cistruct rxdesc {
26462306a36Sopenharmony_ci	union {
26562306a36Sopenharmony_ci		__u8	all[16];
26662306a36Sopenharmony_ci		__le32	dw[4];
26762306a36Sopenharmony_ci		struct {
26862306a36Sopenharmony_ci			/* DW0 */
26962306a36Sopenharmony_ci			__le16	rsv2;
27062306a36Sopenharmony_ci			__u8	rsv1;
27162306a36Sopenharmony_ci			__u8	flags;
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci			/* DW1 */
27462306a36Sopenharmony_ci			__le16	datalen;
27562306a36Sopenharmony_ci			__le16	wbcpl;
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci			/* DW2 */
27862306a36Sopenharmony_ci			__le32	bufaddrh;
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci			/* DW3 */
28162306a36Sopenharmony_ci			__le32	bufaddrl;
28262306a36Sopenharmony_ci		} desc1;
28362306a36Sopenharmony_ci		struct {
28462306a36Sopenharmony_ci			/* DW0 */
28562306a36Sopenharmony_ci			__le16	vlan;
28662306a36Sopenharmony_ci			__le16	flags;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci			/* DW1 */
28962306a36Sopenharmony_ci			__le16	framesize;
29062306a36Sopenharmony_ci			__u8	errstat;
29162306a36Sopenharmony_ci			__u8	desccnt;
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci			/* DW2 */
29462306a36Sopenharmony_ci			__le32	rsshash;
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci			/* DW3 */
29762306a36Sopenharmony_ci			__u8	hashfun;
29862306a36Sopenharmony_ci			__u8	hashtype;
29962306a36Sopenharmony_ci			__le16	resrv;
30062306a36Sopenharmony_ci		} descwb;
30162306a36Sopenharmony_ci	};
30262306a36Sopenharmony_ci};
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_cienum jme_rxdesc_flags_bits {
30562306a36Sopenharmony_ci	RXFLAG_OWN	= 0x80,
30662306a36Sopenharmony_ci	RXFLAG_INT	= 0x40,
30762306a36Sopenharmony_ci	RXFLAG_64BIT	= 0x20,
30862306a36Sopenharmony_ci};
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_cienum jme_rxwbdesc_flags_bits {
31162306a36Sopenharmony_ci	RXWBFLAG_OWN		= 0x8000,
31262306a36Sopenharmony_ci	RXWBFLAG_INT		= 0x4000,
31362306a36Sopenharmony_ci	RXWBFLAG_MF		= 0x2000,
31462306a36Sopenharmony_ci	RXWBFLAG_64BIT		= 0x2000,
31562306a36Sopenharmony_ci	RXWBFLAG_TCPON		= 0x1000,
31662306a36Sopenharmony_ci	RXWBFLAG_UDPON		= 0x0800,
31762306a36Sopenharmony_ci	RXWBFLAG_IPCS		= 0x0400,
31862306a36Sopenharmony_ci	RXWBFLAG_TCPCS		= 0x0200,
31962306a36Sopenharmony_ci	RXWBFLAG_UDPCS		= 0x0100,
32062306a36Sopenharmony_ci	RXWBFLAG_TAGON		= 0x0080,
32162306a36Sopenharmony_ci	RXWBFLAG_IPV4		= 0x0040,
32262306a36Sopenharmony_ci	RXWBFLAG_IPV6		= 0x0020,
32362306a36Sopenharmony_ci	RXWBFLAG_PAUSE		= 0x0010,
32462306a36Sopenharmony_ci	RXWBFLAG_MAGIC		= 0x0008,
32562306a36Sopenharmony_ci	RXWBFLAG_WAKEUP		= 0x0004,
32662306a36Sopenharmony_ci	RXWBFLAG_DEST		= 0x0003,
32762306a36Sopenharmony_ci	RXWBFLAG_DEST_UNI	= 0x0001,
32862306a36Sopenharmony_ci	RXWBFLAG_DEST_MUL	= 0x0002,
32962306a36Sopenharmony_ci	RXWBFLAG_DEST_BRO	= 0x0003,
33062306a36Sopenharmony_ci};
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_cienum jme_rxwbdesc_desccnt_mask {
33362306a36Sopenharmony_ci	RXWBDCNT_WBCPL	= 0x80,
33462306a36Sopenharmony_ci	RXWBDCNT_DCNT	= 0x7F,
33562306a36Sopenharmony_ci};
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_cienum jme_rxwbdesc_errstat_bits {
33862306a36Sopenharmony_ci	RXWBERR_LIMIT	= 0x80,
33962306a36Sopenharmony_ci	RXWBERR_MIIER	= 0x40,
34062306a36Sopenharmony_ci	RXWBERR_NIBON	= 0x20,
34162306a36Sopenharmony_ci	RXWBERR_COLON	= 0x10,
34262306a36Sopenharmony_ci	RXWBERR_ABORT	= 0x08,
34362306a36Sopenharmony_ci	RXWBERR_SHORT	= 0x04,
34462306a36Sopenharmony_ci	RXWBERR_OVERUN	= 0x02,
34562306a36Sopenharmony_ci	RXWBERR_CRCERR	= 0x01,
34662306a36Sopenharmony_ci	RXWBERR_ALLERR	= 0xFF,
34762306a36Sopenharmony_ci};
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci/*
35062306a36Sopenharmony_ci * Buffer information corresponding to ring descriptors.
35162306a36Sopenharmony_ci */
35262306a36Sopenharmony_cistruct jme_buffer_info {
35362306a36Sopenharmony_ci	struct sk_buff *skb;
35462306a36Sopenharmony_ci	dma_addr_t mapping;
35562306a36Sopenharmony_ci	int len;
35662306a36Sopenharmony_ci	int nr_desc;
35762306a36Sopenharmony_ci	unsigned long start_xmit;
35862306a36Sopenharmony_ci};
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci/*
36162306a36Sopenharmony_ci * The structure holding buffer information and ring descriptors all together.
36262306a36Sopenharmony_ci */
36362306a36Sopenharmony_cistruct jme_ring {
36462306a36Sopenharmony_ci	void *alloc;		/* pointer to allocated memory */
36562306a36Sopenharmony_ci	void *desc;		/* pointer to ring memory  */
36662306a36Sopenharmony_ci	dma_addr_t dmaalloc;	/* phys address of ring alloc */
36762306a36Sopenharmony_ci	dma_addr_t dma;		/* phys address for ring dma */
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci	/* Buffer information corresponding to each descriptor */
37062306a36Sopenharmony_ci	struct jme_buffer_info *bufinf;
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci	int next_to_use;
37362306a36Sopenharmony_ci	atomic_t next_to_clean;
37462306a36Sopenharmony_ci	atomic_t nr_free;
37562306a36Sopenharmony_ci};
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci#define NET_STAT(priv) (priv->dev->stats)
37862306a36Sopenharmony_ci#define NETDEV_GET_STATS(netdev, fun_ptr)
37962306a36Sopenharmony_ci#define DECLARE_NET_DEVICE_STATS
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci#define DECLARE_NAPI_STRUCT struct napi_struct napi;
38262306a36Sopenharmony_ci#define JME_NAPI_HOLDER(holder) struct napi_struct *holder
38362306a36Sopenharmony_ci#define JME_NAPI_WEIGHT(w) int w
38462306a36Sopenharmony_ci#define JME_NAPI_WEIGHT_VAL(w) w
38562306a36Sopenharmony_ci#define JME_NAPI_WEIGHT_SET(w, r)
38662306a36Sopenharmony_ci#define JME_RX_COMPLETE(dev, napis) napi_complete(napis)
38762306a36Sopenharmony_ci#define JME_NAPI_ENABLE(priv) napi_enable(&priv->napi);
38862306a36Sopenharmony_ci#define JME_NAPI_DISABLE(priv) \
38962306a36Sopenharmony_ci	if (!napi_disable_pending(&priv->napi)) \
39062306a36Sopenharmony_ci		napi_disable(&priv->napi);
39162306a36Sopenharmony_ci#define JME_RX_SCHEDULE_PREP(priv) \
39262306a36Sopenharmony_ci	napi_schedule_prep(&priv->napi)
39362306a36Sopenharmony_ci#define JME_RX_SCHEDULE(priv) \
39462306a36Sopenharmony_ci	__napi_schedule(&priv->napi);
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci/*
39762306a36Sopenharmony_ci * Jmac Adapter Private data
39862306a36Sopenharmony_ci */
39962306a36Sopenharmony_cistruct jme_adapter {
40062306a36Sopenharmony_ci	struct pci_dev          *pdev;
40162306a36Sopenharmony_ci	struct net_device       *dev;
40262306a36Sopenharmony_ci	void __iomem            *regs;
40362306a36Sopenharmony_ci	struct mii_if_info	mii_if;
40462306a36Sopenharmony_ci	struct jme_ring		rxring[RX_RING_NR];
40562306a36Sopenharmony_ci	struct jme_ring		txring[TX_RING_NR];
40662306a36Sopenharmony_ci	spinlock_t		phy_lock;
40762306a36Sopenharmony_ci	spinlock_t		macaddr_lock;
40862306a36Sopenharmony_ci	spinlock_t		rxmcs_lock;
40962306a36Sopenharmony_ci	struct tasklet_struct	rxempty_task;
41062306a36Sopenharmony_ci	struct tasklet_struct	rxclean_task;
41162306a36Sopenharmony_ci	struct tasklet_struct	txclean_task;
41262306a36Sopenharmony_ci	struct work_struct	linkch_task;
41362306a36Sopenharmony_ci	struct tasklet_struct	pcc_task;
41462306a36Sopenharmony_ci	unsigned long		flags;
41562306a36Sopenharmony_ci	u32			reg_txcs;
41662306a36Sopenharmony_ci	u32			reg_txpfc;
41762306a36Sopenharmony_ci	u32			reg_rxcs;
41862306a36Sopenharmony_ci	u32			reg_rxmcs;
41962306a36Sopenharmony_ci	u32			reg_ghc;
42062306a36Sopenharmony_ci	u32			reg_pmcs;
42162306a36Sopenharmony_ci	u32			reg_gpreg1;
42262306a36Sopenharmony_ci	u32			phylink;
42362306a36Sopenharmony_ci	u32			tx_ring_size;
42462306a36Sopenharmony_ci	u32			tx_ring_mask;
42562306a36Sopenharmony_ci	u32			tx_wake_threshold;
42662306a36Sopenharmony_ci	u32			rx_ring_size;
42762306a36Sopenharmony_ci	u32			rx_ring_mask;
42862306a36Sopenharmony_ci	u8			mrrs;
42962306a36Sopenharmony_ci	unsigned int		fpgaver;
43062306a36Sopenharmony_ci	u8			chiprev;
43162306a36Sopenharmony_ci	u8			chip_main_rev;
43262306a36Sopenharmony_ci	u8			chip_sub_rev;
43362306a36Sopenharmony_ci	u8			pcirev;
43462306a36Sopenharmony_ci	u32			msg_enable;
43562306a36Sopenharmony_ci	struct ethtool_link_ksettings old_cmd;
43662306a36Sopenharmony_ci	unsigned int		old_mtu;
43762306a36Sopenharmony_ci	struct dynpcc_info	dpi;
43862306a36Sopenharmony_ci	atomic_t		intr_sem;
43962306a36Sopenharmony_ci	atomic_t		link_changing;
44062306a36Sopenharmony_ci	atomic_t		tx_cleaning;
44162306a36Sopenharmony_ci	atomic_t		rx_cleaning;
44262306a36Sopenharmony_ci	atomic_t		rx_empty;
44362306a36Sopenharmony_ci	int			(*jme_rx)(struct sk_buff *skb);
44462306a36Sopenharmony_ci	DECLARE_NAPI_STRUCT
44562306a36Sopenharmony_ci	DECLARE_NET_DEVICE_STATS
44662306a36Sopenharmony_ci};
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_cienum jme_flags_bits {
44962306a36Sopenharmony_ci	JME_FLAG_MSI		= 1,
45062306a36Sopenharmony_ci	JME_FLAG_SSET		= 2,
45162306a36Sopenharmony_ci	JME_FLAG_POLL		= 5,
45262306a36Sopenharmony_ci	JME_FLAG_SHUTDOWN	= 6,
45362306a36Sopenharmony_ci};
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_ci#define TX_TIMEOUT		(5 * HZ)
45662306a36Sopenharmony_ci#define JME_REG_LEN		0x500
45762306a36Sopenharmony_ci#define MAX_ETHERNET_JUMBO_PACKET_SIZE 9216
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_cistatic inline struct jme_adapter*
46062306a36Sopenharmony_cijme_napi_priv(struct napi_struct *napi)
46162306a36Sopenharmony_ci{
46262306a36Sopenharmony_ci	struct jme_adapter *jme;
46362306a36Sopenharmony_ci	jme = container_of(napi, struct jme_adapter, napi);
46462306a36Sopenharmony_ci	return jme;
46562306a36Sopenharmony_ci}
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci/*
46862306a36Sopenharmony_ci * MMaped I/O Resters
46962306a36Sopenharmony_ci */
47062306a36Sopenharmony_cienum jme_iomap_offsets {
47162306a36Sopenharmony_ci	JME_MAC		= 0x0000,
47262306a36Sopenharmony_ci	JME_PHY		= 0x0400,
47362306a36Sopenharmony_ci	JME_MISC	= 0x0800,
47462306a36Sopenharmony_ci	JME_RSS		= 0x0C00,
47562306a36Sopenharmony_ci};
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_cienum jme_iomap_lens {
47862306a36Sopenharmony_ci	JME_MAC_LEN	= 0x80,
47962306a36Sopenharmony_ci	JME_PHY_LEN	= 0x58,
48062306a36Sopenharmony_ci	JME_MISC_LEN	= 0x98,
48162306a36Sopenharmony_ci	JME_RSS_LEN	= 0xFF,
48262306a36Sopenharmony_ci};
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_cienum jme_iomap_regs {
48562306a36Sopenharmony_ci	JME_TXCS	= JME_MAC | 0x00, /* Transmit Control and Status */
48662306a36Sopenharmony_ci	JME_TXDBA_LO	= JME_MAC | 0x04, /* Transmit Queue Desc Base Addr */
48762306a36Sopenharmony_ci	JME_TXDBA_HI	= JME_MAC | 0x08, /* Transmit Queue Desc Base Addr */
48862306a36Sopenharmony_ci	JME_TXQDC	= JME_MAC | 0x0C, /* Transmit Queue Desc Count */
48962306a36Sopenharmony_ci	JME_TXNDA	= JME_MAC | 0x10, /* Transmit Queue Next Desc Addr */
49062306a36Sopenharmony_ci	JME_TXMCS	= JME_MAC | 0x14, /* Transmit MAC Control Status */
49162306a36Sopenharmony_ci	JME_TXPFC	= JME_MAC | 0x18, /* Transmit Pause Frame Control */
49262306a36Sopenharmony_ci	JME_TXTRHD	= JME_MAC | 0x1C, /* Transmit Timer/Retry@Half-Dup */
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci	JME_RXCS	= JME_MAC | 0x20, /* Receive Control and Status */
49562306a36Sopenharmony_ci	JME_RXDBA_LO	= JME_MAC | 0x24, /* Receive Queue Desc Base Addr */
49662306a36Sopenharmony_ci	JME_RXDBA_HI	= JME_MAC | 0x28, /* Receive Queue Desc Base Addr */
49762306a36Sopenharmony_ci	JME_RXQDC	= JME_MAC | 0x2C, /* Receive Queue Desc Count */
49862306a36Sopenharmony_ci	JME_RXNDA	= JME_MAC | 0x30, /* Receive Queue Next Desc Addr */
49962306a36Sopenharmony_ci	JME_RXMCS	= JME_MAC | 0x34, /* Receive MAC Control Status */
50062306a36Sopenharmony_ci	JME_RXUMA_LO	= JME_MAC | 0x38, /* Receive Unicast MAC Address */
50162306a36Sopenharmony_ci	JME_RXUMA_HI	= JME_MAC | 0x3C, /* Receive Unicast MAC Address */
50262306a36Sopenharmony_ci	JME_RXMCHT_LO	= JME_MAC | 0x40, /* Recv Multicast Addr HashTable */
50362306a36Sopenharmony_ci	JME_RXMCHT_HI	= JME_MAC | 0x44, /* Recv Multicast Addr HashTable */
50462306a36Sopenharmony_ci	JME_WFODP	= JME_MAC | 0x48, /* Wakeup Frame Output Data Port */
50562306a36Sopenharmony_ci	JME_WFOI	= JME_MAC | 0x4C, /* Wakeup Frame Output Interface */
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ci	JME_SMI		= JME_MAC | 0x50, /* Station Management Interface */
50862306a36Sopenharmony_ci	JME_GHC		= JME_MAC | 0x54, /* Global Host Control */
50962306a36Sopenharmony_ci	JME_PMCS	= JME_MAC | 0x60, /* Power Management Control/Stat */
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ci
51262306a36Sopenharmony_ci	JME_PHY_PWR	= JME_PHY | 0x24, /* New PHY Power Ctrl Register */
51362306a36Sopenharmony_ci	JME_PHY_CS	= JME_PHY | 0x28, /* PHY Ctrl and Status Register */
51462306a36Sopenharmony_ci	JME_PHY_LINK	= JME_PHY | 0x30, /* PHY Link Status Register */
51562306a36Sopenharmony_ci	JME_SMBCSR	= JME_PHY | 0x40, /* SMB Control and Status */
51662306a36Sopenharmony_ci	JME_SMBINTF	= JME_PHY | 0x44, /* SMB Interface */
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci
51962306a36Sopenharmony_ci	JME_TMCSR	= JME_MISC | 0x00, /* Timer Control/Status Register */
52062306a36Sopenharmony_ci	JME_GPREG0	= JME_MISC | 0x08, /* General purpose REG-0 */
52162306a36Sopenharmony_ci	JME_GPREG1	= JME_MISC | 0x0C, /* General purpose REG-1 */
52262306a36Sopenharmony_ci	JME_IEVE	= JME_MISC | 0x20, /* Interrupt Event Status */
52362306a36Sopenharmony_ci	JME_IREQ	= JME_MISC | 0x24, /* Intr Req Status(For Debug) */
52462306a36Sopenharmony_ci	JME_IENS	= JME_MISC | 0x28, /* Intr Enable - Setting Port */
52562306a36Sopenharmony_ci	JME_IENC	= JME_MISC | 0x2C, /* Interrupt Enable - Clear Port */
52662306a36Sopenharmony_ci	JME_PCCRX0	= JME_MISC | 0x30, /* PCC Control for RX Queue 0 */
52762306a36Sopenharmony_ci	JME_PCCTX	= JME_MISC | 0x40, /* PCC Control for TX Queues */
52862306a36Sopenharmony_ci	JME_CHIPMODE	= JME_MISC | 0x44, /* Identify FPGA Version */
52962306a36Sopenharmony_ci	JME_SHBA_HI	= JME_MISC | 0x48, /* Shadow Register Base HI */
53062306a36Sopenharmony_ci	JME_SHBA_LO	= JME_MISC | 0x4C, /* Shadow Register Base LO */
53162306a36Sopenharmony_ci	JME_TIMER1	= JME_MISC | 0x70, /* Timer1 */
53262306a36Sopenharmony_ci	JME_TIMER2	= JME_MISC | 0x74, /* Timer2 */
53362306a36Sopenharmony_ci	JME_APMC	= JME_MISC | 0x7C, /* Aggressive Power Mode Control */
53462306a36Sopenharmony_ci	JME_PCCSRX0	= JME_MISC | 0x80, /* PCC Status of RX0 */
53562306a36Sopenharmony_ci};
53662306a36Sopenharmony_ci
53762306a36Sopenharmony_ci/*
53862306a36Sopenharmony_ci * TX Control/Status Bits
53962306a36Sopenharmony_ci */
54062306a36Sopenharmony_cienum jme_txcs_bits {
54162306a36Sopenharmony_ci	TXCS_QUEUE7S	= 0x00008000,
54262306a36Sopenharmony_ci	TXCS_QUEUE6S	= 0x00004000,
54362306a36Sopenharmony_ci	TXCS_QUEUE5S	= 0x00002000,
54462306a36Sopenharmony_ci	TXCS_QUEUE4S	= 0x00001000,
54562306a36Sopenharmony_ci	TXCS_QUEUE3S	= 0x00000800,
54662306a36Sopenharmony_ci	TXCS_QUEUE2S	= 0x00000400,
54762306a36Sopenharmony_ci	TXCS_QUEUE1S	= 0x00000200,
54862306a36Sopenharmony_ci	TXCS_QUEUE0S	= 0x00000100,
54962306a36Sopenharmony_ci	TXCS_FIFOTH	= 0x000000C0,
55062306a36Sopenharmony_ci	TXCS_DMASIZE	= 0x00000030,
55162306a36Sopenharmony_ci	TXCS_BURST	= 0x00000004,
55262306a36Sopenharmony_ci	TXCS_ENABLE	= 0x00000001,
55362306a36Sopenharmony_ci};
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_cienum jme_txcs_value {
55662306a36Sopenharmony_ci	TXCS_FIFOTH_16QW	= 0x000000C0,
55762306a36Sopenharmony_ci	TXCS_FIFOTH_12QW	= 0x00000080,
55862306a36Sopenharmony_ci	TXCS_FIFOTH_8QW		= 0x00000040,
55962306a36Sopenharmony_ci	TXCS_FIFOTH_4QW		= 0x00000000,
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ci	TXCS_DMASIZE_64B	= 0x00000000,
56262306a36Sopenharmony_ci	TXCS_DMASIZE_128B	= 0x00000010,
56362306a36Sopenharmony_ci	TXCS_DMASIZE_256B	= 0x00000020,
56462306a36Sopenharmony_ci	TXCS_DMASIZE_512B	= 0x00000030,
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_ci	TXCS_SELECT_QUEUE0	= 0x00000000,
56762306a36Sopenharmony_ci	TXCS_SELECT_QUEUE1	= 0x00010000,
56862306a36Sopenharmony_ci	TXCS_SELECT_QUEUE2	= 0x00020000,
56962306a36Sopenharmony_ci	TXCS_SELECT_QUEUE3	= 0x00030000,
57062306a36Sopenharmony_ci	TXCS_SELECT_QUEUE4	= 0x00040000,
57162306a36Sopenharmony_ci	TXCS_SELECT_QUEUE5	= 0x00050000,
57262306a36Sopenharmony_ci	TXCS_SELECT_QUEUE6	= 0x00060000,
57362306a36Sopenharmony_ci	TXCS_SELECT_QUEUE7	= 0x00070000,
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ci	TXCS_DEFAULT		= TXCS_FIFOTH_4QW |
57662306a36Sopenharmony_ci				  TXCS_BURST,
57762306a36Sopenharmony_ci};
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci#define JME_TX_DISABLE_TIMEOUT 10 /* 10 msec */
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_ci/*
58262306a36Sopenharmony_ci * TX MAC Control/Status Bits
58362306a36Sopenharmony_ci */
58462306a36Sopenharmony_cienum jme_txmcs_bit_masks {
58562306a36Sopenharmony_ci	TXMCS_IFG2		= 0xC0000000,
58662306a36Sopenharmony_ci	TXMCS_IFG1		= 0x30000000,
58762306a36Sopenharmony_ci	TXMCS_TTHOLD		= 0x00000300,
58862306a36Sopenharmony_ci	TXMCS_FBURST		= 0x00000080,
58962306a36Sopenharmony_ci	TXMCS_CARRIEREXT	= 0x00000040,
59062306a36Sopenharmony_ci	TXMCS_DEFER		= 0x00000020,
59162306a36Sopenharmony_ci	TXMCS_BACKOFF		= 0x00000010,
59262306a36Sopenharmony_ci	TXMCS_CARRIERSENSE	= 0x00000008,
59362306a36Sopenharmony_ci	TXMCS_COLLISION		= 0x00000004,
59462306a36Sopenharmony_ci	TXMCS_CRC		= 0x00000002,
59562306a36Sopenharmony_ci	TXMCS_PADDING		= 0x00000001,
59662306a36Sopenharmony_ci};
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_cienum jme_txmcs_values {
59962306a36Sopenharmony_ci	TXMCS_IFG2_6_4		= 0x00000000,
60062306a36Sopenharmony_ci	TXMCS_IFG2_8_5		= 0x40000000,
60162306a36Sopenharmony_ci	TXMCS_IFG2_10_6		= 0x80000000,
60262306a36Sopenharmony_ci	TXMCS_IFG2_12_7		= 0xC0000000,
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_ci	TXMCS_IFG1_8_4		= 0x00000000,
60562306a36Sopenharmony_ci	TXMCS_IFG1_12_6		= 0x10000000,
60662306a36Sopenharmony_ci	TXMCS_IFG1_16_8		= 0x20000000,
60762306a36Sopenharmony_ci	TXMCS_IFG1_20_10	= 0x30000000,
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci	TXMCS_TTHOLD_1_8	= 0x00000000,
61062306a36Sopenharmony_ci	TXMCS_TTHOLD_1_4	= 0x00000100,
61162306a36Sopenharmony_ci	TXMCS_TTHOLD_1_2	= 0x00000200,
61262306a36Sopenharmony_ci	TXMCS_TTHOLD_FULL	= 0x00000300,
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci	TXMCS_DEFAULT		= TXMCS_IFG2_8_5 |
61562306a36Sopenharmony_ci				  TXMCS_IFG1_16_8 |
61662306a36Sopenharmony_ci				  TXMCS_TTHOLD_FULL |
61762306a36Sopenharmony_ci				  TXMCS_DEFER |
61862306a36Sopenharmony_ci				  TXMCS_CRC |
61962306a36Sopenharmony_ci				  TXMCS_PADDING,
62062306a36Sopenharmony_ci};
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_cienum jme_txpfc_bits_masks {
62362306a36Sopenharmony_ci	TXPFC_VLAN_TAG		= 0xFFFF0000,
62462306a36Sopenharmony_ci	TXPFC_VLAN_EN		= 0x00008000,
62562306a36Sopenharmony_ci	TXPFC_PF_EN		= 0x00000001,
62662306a36Sopenharmony_ci};
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_cienum jme_txtrhd_bits_masks {
62962306a36Sopenharmony_ci	TXTRHD_TXPEN		= 0x80000000,
63062306a36Sopenharmony_ci	TXTRHD_TXP		= 0x7FFFFF00,
63162306a36Sopenharmony_ci	TXTRHD_TXREN		= 0x00000080,
63262306a36Sopenharmony_ci	TXTRHD_TXRL		= 0x0000007F,
63362306a36Sopenharmony_ci};
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_cienum jme_txtrhd_shifts {
63662306a36Sopenharmony_ci	TXTRHD_TXP_SHIFT	= 8,
63762306a36Sopenharmony_ci	TXTRHD_TXRL_SHIFT	= 0,
63862306a36Sopenharmony_ci};
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_cienum jme_txtrhd_values {
64162306a36Sopenharmony_ci	TXTRHD_FULLDUPLEX	= 0x00000000,
64262306a36Sopenharmony_ci	TXTRHD_HALFDUPLEX	= TXTRHD_TXPEN |
64362306a36Sopenharmony_ci				  ((0x2000 << TXTRHD_TXP_SHIFT) & TXTRHD_TXP) |
64462306a36Sopenharmony_ci				  TXTRHD_TXREN |
64562306a36Sopenharmony_ci				  ((8 << TXTRHD_TXRL_SHIFT) & TXTRHD_TXRL),
64662306a36Sopenharmony_ci};
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci/*
64962306a36Sopenharmony_ci * RX Control/Status Bits
65062306a36Sopenharmony_ci */
65162306a36Sopenharmony_cienum jme_rxcs_bit_masks {
65262306a36Sopenharmony_ci	/* FIFO full threshold for transmitting Tx Pause Packet */
65362306a36Sopenharmony_ci	RXCS_FIFOTHTP	= 0x30000000,
65462306a36Sopenharmony_ci	/* FIFO threshold for processing next packet */
65562306a36Sopenharmony_ci	RXCS_FIFOTHNP	= 0x0C000000,
65662306a36Sopenharmony_ci	RXCS_DMAREQSZ	= 0x03000000, /* DMA Request Size */
65762306a36Sopenharmony_ci	RXCS_QUEUESEL	= 0x00030000, /* Queue selection */
65862306a36Sopenharmony_ci	RXCS_RETRYGAP	= 0x0000F000, /* RX Desc full retry gap */
65962306a36Sopenharmony_ci	RXCS_RETRYCNT	= 0x00000F00, /* RX Desc full retry counter */
66062306a36Sopenharmony_ci	RXCS_WAKEUP	= 0x00000040, /* Enable receive wakeup packet */
66162306a36Sopenharmony_ci	RXCS_MAGIC	= 0x00000020, /* Enable receive magic packet */
66262306a36Sopenharmony_ci	RXCS_SHORT	= 0x00000010, /* Enable receive short packet */
66362306a36Sopenharmony_ci	RXCS_ABORT	= 0x00000008, /* Enable receive errorr packet */
66462306a36Sopenharmony_ci	RXCS_QST	= 0x00000004, /* Receive queue start */
66562306a36Sopenharmony_ci	RXCS_SUSPEND	= 0x00000002,
66662306a36Sopenharmony_ci	RXCS_ENABLE	= 0x00000001,
66762306a36Sopenharmony_ci};
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_cienum jme_rxcs_values {
67062306a36Sopenharmony_ci	RXCS_FIFOTHTP_16T	= 0x00000000,
67162306a36Sopenharmony_ci	RXCS_FIFOTHTP_32T	= 0x10000000,
67262306a36Sopenharmony_ci	RXCS_FIFOTHTP_64T	= 0x20000000,
67362306a36Sopenharmony_ci	RXCS_FIFOTHTP_128T	= 0x30000000,
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci	RXCS_FIFOTHNP_16QW	= 0x00000000,
67662306a36Sopenharmony_ci	RXCS_FIFOTHNP_32QW	= 0x04000000,
67762306a36Sopenharmony_ci	RXCS_FIFOTHNP_64QW	= 0x08000000,
67862306a36Sopenharmony_ci	RXCS_FIFOTHNP_128QW	= 0x0C000000,
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_ci	RXCS_DMAREQSZ_16B	= 0x00000000,
68162306a36Sopenharmony_ci	RXCS_DMAREQSZ_32B	= 0x01000000,
68262306a36Sopenharmony_ci	RXCS_DMAREQSZ_64B	= 0x02000000,
68362306a36Sopenharmony_ci	RXCS_DMAREQSZ_128B	= 0x03000000,
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_ci	RXCS_QUEUESEL_Q0	= 0x00000000,
68662306a36Sopenharmony_ci	RXCS_QUEUESEL_Q1	= 0x00010000,
68762306a36Sopenharmony_ci	RXCS_QUEUESEL_Q2	= 0x00020000,
68862306a36Sopenharmony_ci	RXCS_QUEUESEL_Q3	= 0x00030000,
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci	RXCS_RETRYGAP_256ns	= 0x00000000,
69162306a36Sopenharmony_ci	RXCS_RETRYGAP_512ns	= 0x00001000,
69262306a36Sopenharmony_ci	RXCS_RETRYGAP_1024ns	= 0x00002000,
69362306a36Sopenharmony_ci	RXCS_RETRYGAP_2048ns	= 0x00003000,
69462306a36Sopenharmony_ci	RXCS_RETRYGAP_4096ns	= 0x00004000,
69562306a36Sopenharmony_ci	RXCS_RETRYGAP_8192ns	= 0x00005000,
69662306a36Sopenharmony_ci	RXCS_RETRYGAP_16384ns	= 0x00006000,
69762306a36Sopenharmony_ci	RXCS_RETRYGAP_32768ns	= 0x00007000,
69862306a36Sopenharmony_ci
69962306a36Sopenharmony_ci	RXCS_RETRYCNT_0		= 0x00000000,
70062306a36Sopenharmony_ci	RXCS_RETRYCNT_4		= 0x00000100,
70162306a36Sopenharmony_ci	RXCS_RETRYCNT_8		= 0x00000200,
70262306a36Sopenharmony_ci	RXCS_RETRYCNT_12	= 0x00000300,
70362306a36Sopenharmony_ci	RXCS_RETRYCNT_16	= 0x00000400,
70462306a36Sopenharmony_ci	RXCS_RETRYCNT_20	= 0x00000500,
70562306a36Sopenharmony_ci	RXCS_RETRYCNT_24	= 0x00000600,
70662306a36Sopenharmony_ci	RXCS_RETRYCNT_28	= 0x00000700,
70762306a36Sopenharmony_ci	RXCS_RETRYCNT_32	= 0x00000800,
70862306a36Sopenharmony_ci	RXCS_RETRYCNT_36	= 0x00000900,
70962306a36Sopenharmony_ci	RXCS_RETRYCNT_40	= 0x00000A00,
71062306a36Sopenharmony_ci	RXCS_RETRYCNT_44	= 0x00000B00,
71162306a36Sopenharmony_ci	RXCS_RETRYCNT_48	= 0x00000C00,
71262306a36Sopenharmony_ci	RXCS_RETRYCNT_52	= 0x00000D00,
71362306a36Sopenharmony_ci	RXCS_RETRYCNT_56	= 0x00000E00,
71462306a36Sopenharmony_ci	RXCS_RETRYCNT_60	= 0x00000F00,
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci	RXCS_DEFAULT		= RXCS_FIFOTHTP_128T |
71762306a36Sopenharmony_ci				  RXCS_FIFOTHNP_16QW |
71862306a36Sopenharmony_ci				  RXCS_DMAREQSZ_128B |
71962306a36Sopenharmony_ci				  RXCS_RETRYGAP_256ns |
72062306a36Sopenharmony_ci				  RXCS_RETRYCNT_32,
72162306a36Sopenharmony_ci};
72262306a36Sopenharmony_ci
72362306a36Sopenharmony_ci#define JME_RX_DISABLE_TIMEOUT 10 /* 10 msec */
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_ci/*
72662306a36Sopenharmony_ci * RX MAC Control/Status Bits
72762306a36Sopenharmony_ci */
72862306a36Sopenharmony_cienum jme_rxmcs_bits {
72962306a36Sopenharmony_ci	RXMCS_ALLFRAME		= 0x00000800,
73062306a36Sopenharmony_ci	RXMCS_BRDFRAME		= 0x00000400,
73162306a36Sopenharmony_ci	RXMCS_MULFRAME		= 0x00000200,
73262306a36Sopenharmony_ci	RXMCS_UNIFRAME		= 0x00000100,
73362306a36Sopenharmony_ci	RXMCS_ALLMULFRAME	= 0x00000080,
73462306a36Sopenharmony_ci	RXMCS_MULFILTERED	= 0x00000040,
73562306a36Sopenharmony_ci	RXMCS_RXCOLLDEC		= 0x00000020,
73662306a36Sopenharmony_ci	RXMCS_FLOWCTRL		= 0x00000008,
73762306a36Sopenharmony_ci	RXMCS_VTAGRM		= 0x00000004,
73862306a36Sopenharmony_ci	RXMCS_PREPAD		= 0x00000002,
73962306a36Sopenharmony_ci	RXMCS_CHECKSUM		= 0x00000001,
74062306a36Sopenharmony_ci
74162306a36Sopenharmony_ci	RXMCS_DEFAULT		= RXMCS_VTAGRM |
74262306a36Sopenharmony_ci				  RXMCS_PREPAD |
74362306a36Sopenharmony_ci				  RXMCS_FLOWCTRL |
74462306a36Sopenharmony_ci				  RXMCS_CHECKSUM,
74562306a36Sopenharmony_ci};
74662306a36Sopenharmony_ci
74762306a36Sopenharmony_ci/*	Extern PHY common register 2	*/
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci#define PHY_GAD_TEST_MODE_1			0x00002000
75062306a36Sopenharmony_ci#define PHY_GAD_TEST_MODE_MSK			0x0000E000
75162306a36Sopenharmony_ci#define JM_PHY_SPEC_REG_READ			0x00004000
75262306a36Sopenharmony_ci#define JM_PHY_SPEC_REG_WRITE			0x00008000
75362306a36Sopenharmony_ci#define PHY_CALIBRATION_DELAY			20
75462306a36Sopenharmony_ci#define JM_PHY_SPEC_ADDR_REG			0x1E
75562306a36Sopenharmony_ci#define JM_PHY_SPEC_DATA_REG			0x1F
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_ci#define JM_PHY_EXT_COMM_0_REG			0x30
75862306a36Sopenharmony_ci#define JM_PHY_EXT_COMM_1_REG			0x31
75962306a36Sopenharmony_ci#define JM_PHY_EXT_COMM_2_REG			0x32
76062306a36Sopenharmony_ci#define JM_PHY_EXT_COMM_2_CALI_ENABLE		0x01
76162306a36Sopenharmony_ci#define JM_PHY_EXT_COMM_2_CALI_MODE_0		0x02
76262306a36Sopenharmony_ci#define JM_PHY_EXT_COMM_2_CALI_LATCH		0x10
76362306a36Sopenharmony_ci#define PCI_PRIV_SHARE_NICCTRL			0xF5
76462306a36Sopenharmony_ci#define JME_FLAG_PHYEA_ENABLE			0x2
76562306a36Sopenharmony_ci
76662306a36Sopenharmony_ci/*
76762306a36Sopenharmony_ci * Wakeup Frame setup interface registers
76862306a36Sopenharmony_ci */
76962306a36Sopenharmony_ci#define WAKEUP_FRAME_NR	8
77062306a36Sopenharmony_ci#define WAKEUP_FRAME_MASK_DWNR	4
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_cienum jme_wfoi_bit_masks {
77362306a36Sopenharmony_ci	WFOI_MASK_SEL		= 0x00000070,
77462306a36Sopenharmony_ci	WFOI_CRC_SEL		= 0x00000008,
77562306a36Sopenharmony_ci	WFOI_FRAME_SEL		= 0x00000007,
77662306a36Sopenharmony_ci};
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_cienum jme_wfoi_shifts {
77962306a36Sopenharmony_ci	WFOI_MASK_SHIFT		= 4,
78062306a36Sopenharmony_ci};
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_ci/*
78362306a36Sopenharmony_ci * SMI Related definitions
78462306a36Sopenharmony_ci */
78562306a36Sopenharmony_cienum jme_smi_bit_mask {
78662306a36Sopenharmony_ci	SMI_DATA_MASK		= 0xFFFF0000,
78762306a36Sopenharmony_ci	SMI_REG_ADDR_MASK	= 0x0000F800,
78862306a36Sopenharmony_ci	SMI_PHY_ADDR_MASK	= 0x000007C0,
78962306a36Sopenharmony_ci	SMI_OP_WRITE		= 0x00000020,
79062306a36Sopenharmony_ci	/* Set to 1, after req done it'll be cleared to 0 */
79162306a36Sopenharmony_ci	SMI_OP_REQ		= 0x00000010,
79262306a36Sopenharmony_ci	SMI_OP_MDIO		= 0x00000008, /* Software assess In/Out */
79362306a36Sopenharmony_ci	SMI_OP_MDOE		= 0x00000004, /* Software Output Enable */
79462306a36Sopenharmony_ci	SMI_OP_MDC		= 0x00000002, /* Software CLK Control */
79562306a36Sopenharmony_ci	SMI_OP_MDEN		= 0x00000001, /* Software access Enable */
79662306a36Sopenharmony_ci};
79762306a36Sopenharmony_ci
79862306a36Sopenharmony_cienum jme_smi_bit_shift {
79962306a36Sopenharmony_ci	SMI_DATA_SHIFT		= 16,
80062306a36Sopenharmony_ci	SMI_REG_ADDR_SHIFT	= 11,
80162306a36Sopenharmony_ci	SMI_PHY_ADDR_SHIFT	= 6,
80262306a36Sopenharmony_ci};
80362306a36Sopenharmony_ci
80462306a36Sopenharmony_cistatic inline u32 smi_reg_addr(int x)
80562306a36Sopenharmony_ci{
80662306a36Sopenharmony_ci	return (x << SMI_REG_ADDR_SHIFT) & SMI_REG_ADDR_MASK;
80762306a36Sopenharmony_ci}
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_cistatic inline u32 smi_phy_addr(int x)
81062306a36Sopenharmony_ci{
81162306a36Sopenharmony_ci	return (x << SMI_PHY_ADDR_SHIFT) & SMI_PHY_ADDR_MASK;
81262306a36Sopenharmony_ci}
81362306a36Sopenharmony_ci
81462306a36Sopenharmony_ci#define JME_PHY_TIMEOUT 100 /* 100 msec */
81562306a36Sopenharmony_ci#define JME_PHY_REG_NR 32
81662306a36Sopenharmony_ci
81762306a36Sopenharmony_ci/*
81862306a36Sopenharmony_ci * Global Host Control
81962306a36Sopenharmony_ci */
82062306a36Sopenharmony_cienum jme_ghc_bit_mask {
82162306a36Sopenharmony_ci	GHC_SWRST		= 0x40000000,
82262306a36Sopenharmony_ci	GHC_TO_CLK_SRC		= 0x00C00000,
82362306a36Sopenharmony_ci	GHC_TXMAC_CLK_SRC	= 0x00300000,
82462306a36Sopenharmony_ci	GHC_DPX			= 0x00000040,
82562306a36Sopenharmony_ci	GHC_SPEED		= 0x00000030,
82662306a36Sopenharmony_ci	GHC_LINK_POLL		= 0x00000001,
82762306a36Sopenharmony_ci};
82862306a36Sopenharmony_ci
82962306a36Sopenharmony_cienum jme_ghc_speed_val {
83062306a36Sopenharmony_ci	GHC_SPEED_10M		= 0x00000010,
83162306a36Sopenharmony_ci	GHC_SPEED_100M		= 0x00000020,
83262306a36Sopenharmony_ci	GHC_SPEED_1000M		= 0x00000030,
83362306a36Sopenharmony_ci};
83462306a36Sopenharmony_ci
83562306a36Sopenharmony_cienum jme_ghc_to_clk {
83662306a36Sopenharmony_ci	GHC_TO_CLK_OFF		= 0x00000000,
83762306a36Sopenharmony_ci	GHC_TO_CLK_GPHY		= 0x00400000,
83862306a36Sopenharmony_ci	GHC_TO_CLK_PCIE		= 0x00800000,
83962306a36Sopenharmony_ci	GHC_TO_CLK_INVALID	= 0x00C00000,
84062306a36Sopenharmony_ci};
84162306a36Sopenharmony_ci
84262306a36Sopenharmony_cienum jme_ghc_txmac_clk {
84362306a36Sopenharmony_ci	GHC_TXMAC_CLK_OFF	= 0x00000000,
84462306a36Sopenharmony_ci	GHC_TXMAC_CLK_GPHY	= 0x00100000,
84562306a36Sopenharmony_ci	GHC_TXMAC_CLK_PCIE	= 0x00200000,
84662306a36Sopenharmony_ci	GHC_TXMAC_CLK_INVALID	= 0x00300000,
84762306a36Sopenharmony_ci};
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_ci/*
85062306a36Sopenharmony_ci * Power management control and status register
85162306a36Sopenharmony_ci */
85262306a36Sopenharmony_cienum jme_pmcs_bit_masks {
85362306a36Sopenharmony_ci	PMCS_STMASK	= 0xFFFF0000,
85462306a36Sopenharmony_ci	PMCS_WF7DET	= 0x80000000,
85562306a36Sopenharmony_ci	PMCS_WF6DET	= 0x40000000,
85662306a36Sopenharmony_ci	PMCS_WF5DET	= 0x20000000,
85762306a36Sopenharmony_ci	PMCS_WF4DET	= 0x10000000,
85862306a36Sopenharmony_ci	PMCS_WF3DET	= 0x08000000,
85962306a36Sopenharmony_ci	PMCS_WF2DET	= 0x04000000,
86062306a36Sopenharmony_ci	PMCS_WF1DET	= 0x02000000,
86162306a36Sopenharmony_ci	PMCS_WF0DET	= 0x01000000,
86262306a36Sopenharmony_ci	PMCS_LFDET	= 0x00040000,
86362306a36Sopenharmony_ci	PMCS_LRDET	= 0x00020000,
86462306a36Sopenharmony_ci	PMCS_MFDET	= 0x00010000,
86562306a36Sopenharmony_ci	PMCS_ENMASK	= 0x0000FFFF,
86662306a36Sopenharmony_ci	PMCS_WF7EN	= 0x00008000,
86762306a36Sopenharmony_ci	PMCS_WF6EN	= 0x00004000,
86862306a36Sopenharmony_ci	PMCS_WF5EN	= 0x00002000,
86962306a36Sopenharmony_ci	PMCS_WF4EN	= 0x00001000,
87062306a36Sopenharmony_ci	PMCS_WF3EN	= 0x00000800,
87162306a36Sopenharmony_ci	PMCS_WF2EN	= 0x00000400,
87262306a36Sopenharmony_ci	PMCS_WF1EN	= 0x00000200,
87362306a36Sopenharmony_ci	PMCS_WF0EN	= 0x00000100,
87462306a36Sopenharmony_ci	PMCS_LFEN	= 0x00000004,
87562306a36Sopenharmony_ci	PMCS_LREN	= 0x00000002,
87662306a36Sopenharmony_ci	PMCS_MFEN	= 0x00000001,
87762306a36Sopenharmony_ci};
87862306a36Sopenharmony_ci
87962306a36Sopenharmony_ci/*
88062306a36Sopenharmony_ci * New PHY Power Control Register
88162306a36Sopenharmony_ci */
88262306a36Sopenharmony_cienum jme_phy_pwr_bit_masks {
88362306a36Sopenharmony_ci	PHY_PWR_DWN1SEL	= 0x01000000, /* Phy_giga.p_PWR_DOWN1_SEL */
88462306a36Sopenharmony_ci	PHY_PWR_DWN1SW	= 0x02000000, /* Phy_giga.p_PWR_DOWN1_SW */
88562306a36Sopenharmony_ci	PHY_PWR_DWN2	= 0x04000000, /* Phy_giga.p_PWR_DOWN2 */
88662306a36Sopenharmony_ci	PHY_PWR_CLKSEL	= 0x08000000, /*
88762306a36Sopenharmony_ci				       * XTL_OUT Clock select
88862306a36Sopenharmony_ci				       * (an internal free-running clock)
88962306a36Sopenharmony_ci				       * 0: xtl_out = phy_giga.A_XTL25_O
89062306a36Sopenharmony_ci				       * 1: xtl_out = phy_giga.PD_OSC
89162306a36Sopenharmony_ci				       */
89262306a36Sopenharmony_ci};
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci/*
89562306a36Sopenharmony_ci * Giga PHY Status Registers
89662306a36Sopenharmony_ci */
89762306a36Sopenharmony_cienum jme_phy_link_bit_mask {
89862306a36Sopenharmony_ci	PHY_LINK_SPEED_MASK		= 0x0000C000,
89962306a36Sopenharmony_ci	PHY_LINK_DUPLEX			= 0x00002000,
90062306a36Sopenharmony_ci	PHY_LINK_SPEEDDPU_RESOLVED	= 0x00000800,
90162306a36Sopenharmony_ci	PHY_LINK_UP			= 0x00000400,
90262306a36Sopenharmony_ci	PHY_LINK_AUTONEG_COMPLETE	= 0x00000200,
90362306a36Sopenharmony_ci	PHY_LINK_MDI_STAT		= 0x00000040,
90462306a36Sopenharmony_ci};
90562306a36Sopenharmony_ci
90662306a36Sopenharmony_cienum jme_phy_link_speed_val {
90762306a36Sopenharmony_ci	PHY_LINK_SPEED_10M		= 0x00000000,
90862306a36Sopenharmony_ci	PHY_LINK_SPEED_100M		= 0x00004000,
90962306a36Sopenharmony_ci	PHY_LINK_SPEED_1000M		= 0x00008000,
91062306a36Sopenharmony_ci};
91162306a36Sopenharmony_ci
91262306a36Sopenharmony_ci#define JME_SPDRSV_TIMEOUT	500	/* 500 us */
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci/*
91562306a36Sopenharmony_ci * SMB Control and Status
91662306a36Sopenharmony_ci */
91762306a36Sopenharmony_cienum jme_smbcsr_bit_mask {
91862306a36Sopenharmony_ci	SMBCSR_CNACK	= 0x00020000,
91962306a36Sopenharmony_ci	SMBCSR_RELOAD	= 0x00010000,
92062306a36Sopenharmony_ci	SMBCSR_EEPROMD	= 0x00000020,
92162306a36Sopenharmony_ci	SMBCSR_INITDONE	= 0x00000010,
92262306a36Sopenharmony_ci	SMBCSR_BUSY	= 0x0000000F,
92362306a36Sopenharmony_ci};
92462306a36Sopenharmony_ci
92562306a36Sopenharmony_cienum jme_smbintf_bit_mask {
92662306a36Sopenharmony_ci	SMBINTF_HWDATR	= 0xFF000000,
92762306a36Sopenharmony_ci	SMBINTF_HWDATW	= 0x00FF0000,
92862306a36Sopenharmony_ci	SMBINTF_HWADDR	= 0x0000FF00,
92962306a36Sopenharmony_ci	SMBINTF_HWRWN	= 0x00000020,
93062306a36Sopenharmony_ci	SMBINTF_HWCMD	= 0x00000010,
93162306a36Sopenharmony_ci	SMBINTF_FASTM	= 0x00000008,
93262306a36Sopenharmony_ci	SMBINTF_GPIOSCL	= 0x00000004,
93362306a36Sopenharmony_ci	SMBINTF_GPIOSDA	= 0x00000002,
93462306a36Sopenharmony_ci	SMBINTF_GPIOEN	= 0x00000001,
93562306a36Sopenharmony_ci};
93662306a36Sopenharmony_ci
93762306a36Sopenharmony_cienum jme_smbintf_vals {
93862306a36Sopenharmony_ci	SMBINTF_HWRWN_READ	= 0x00000020,
93962306a36Sopenharmony_ci	SMBINTF_HWRWN_WRITE	= 0x00000000,
94062306a36Sopenharmony_ci};
94162306a36Sopenharmony_ci
94262306a36Sopenharmony_cienum jme_smbintf_shifts {
94362306a36Sopenharmony_ci	SMBINTF_HWDATR_SHIFT	= 24,
94462306a36Sopenharmony_ci	SMBINTF_HWDATW_SHIFT	= 16,
94562306a36Sopenharmony_ci	SMBINTF_HWADDR_SHIFT	= 8,
94662306a36Sopenharmony_ci};
94762306a36Sopenharmony_ci
94862306a36Sopenharmony_ci#define JME_EEPROM_RELOAD_TIMEOUT 2000 /* 2000 msec */
94962306a36Sopenharmony_ci#define JME_SMB_BUSY_TIMEOUT 20 /* 20 msec */
95062306a36Sopenharmony_ci#define JME_SMB_LEN 256
95162306a36Sopenharmony_ci#define JME_EEPROM_MAGIC 0x250
95262306a36Sopenharmony_ci
95362306a36Sopenharmony_ci/*
95462306a36Sopenharmony_ci * Timer Control/Status Register
95562306a36Sopenharmony_ci */
95662306a36Sopenharmony_cienum jme_tmcsr_bit_masks {
95762306a36Sopenharmony_ci	TMCSR_SWIT	= 0x80000000,
95862306a36Sopenharmony_ci	TMCSR_EN	= 0x01000000,
95962306a36Sopenharmony_ci	TMCSR_CNT	= 0x00FFFFFF,
96062306a36Sopenharmony_ci};
96162306a36Sopenharmony_ci
96262306a36Sopenharmony_ci/*
96362306a36Sopenharmony_ci * General Purpose REG-0
96462306a36Sopenharmony_ci */
96562306a36Sopenharmony_cienum jme_gpreg0_masks {
96662306a36Sopenharmony_ci	GPREG0_DISSH		= 0xFF000000,
96762306a36Sopenharmony_ci	GPREG0_PCIRLMT		= 0x00300000,
96862306a36Sopenharmony_ci	GPREG0_PCCNOMUTCLR	= 0x00040000,
96962306a36Sopenharmony_ci	GPREG0_LNKINTPOLL	= 0x00001000,
97062306a36Sopenharmony_ci	GPREG0_PCCTMR		= 0x00000300,
97162306a36Sopenharmony_ci	GPREG0_PHYADDR		= 0x0000001F,
97262306a36Sopenharmony_ci};
97362306a36Sopenharmony_ci
97462306a36Sopenharmony_cienum jme_gpreg0_vals {
97562306a36Sopenharmony_ci	GPREG0_DISSH_DW7	= 0x80000000,
97662306a36Sopenharmony_ci	GPREG0_DISSH_DW6	= 0x40000000,
97762306a36Sopenharmony_ci	GPREG0_DISSH_DW5	= 0x20000000,
97862306a36Sopenharmony_ci	GPREG0_DISSH_DW4	= 0x10000000,
97962306a36Sopenharmony_ci	GPREG0_DISSH_DW3	= 0x08000000,
98062306a36Sopenharmony_ci	GPREG0_DISSH_DW2	= 0x04000000,
98162306a36Sopenharmony_ci	GPREG0_DISSH_DW1	= 0x02000000,
98262306a36Sopenharmony_ci	GPREG0_DISSH_DW0	= 0x01000000,
98362306a36Sopenharmony_ci	GPREG0_DISSH_ALL	= 0xFF000000,
98462306a36Sopenharmony_ci
98562306a36Sopenharmony_ci	GPREG0_PCIRLMT_8	= 0x00000000,
98662306a36Sopenharmony_ci	GPREG0_PCIRLMT_6	= 0x00100000,
98762306a36Sopenharmony_ci	GPREG0_PCIRLMT_5	= 0x00200000,
98862306a36Sopenharmony_ci	GPREG0_PCIRLMT_4	= 0x00300000,
98962306a36Sopenharmony_ci
99062306a36Sopenharmony_ci	GPREG0_PCCTMR_16ns	= 0x00000000,
99162306a36Sopenharmony_ci	GPREG0_PCCTMR_256ns	= 0x00000100,
99262306a36Sopenharmony_ci	GPREG0_PCCTMR_1us	= 0x00000200,
99362306a36Sopenharmony_ci	GPREG0_PCCTMR_1ms	= 0x00000300,
99462306a36Sopenharmony_ci
99562306a36Sopenharmony_ci	GPREG0_PHYADDR_1	= 0x00000001,
99662306a36Sopenharmony_ci
99762306a36Sopenharmony_ci	GPREG0_DEFAULT		= GPREG0_PCIRLMT_4 |
99862306a36Sopenharmony_ci				  GPREG0_PCCTMR_1us |
99962306a36Sopenharmony_ci				  GPREG0_PHYADDR_1,
100062306a36Sopenharmony_ci};
100162306a36Sopenharmony_ci
100262306a36Sopenharmony_ci/*
100362306a36Sopenharmony_ci * General Purpose REG-1
100462306a36Sopenharmony_ci */
100562306a36Sopenharmony_cienum jme_gpreg1_bit_masks {
100662306a36Sopenharmony_ci	GPREG1_RXCLKOFF		= 0x04000000,
100762306a36Sopenharmony_ci	GPREG1_PCREQN		= 0x00020000,
100862306a36Sopenharmony_ci	GPREG1_HALFMODEPATCH	= 0x00000040, /* For Chip revision 0x11 only */
100962306a36Sopenharmony_ci	GPREG1_RSSPATCH		= 0x00000020, /* For Chip revision 0x11 only */
101062306a36Sopenharmony_ci	GPREG1_INTRDELAYUNIT	= 0x00000018,
101162306a36Sopenharmony_ci	GPREG1_INTRDELAYENABLE	= 0x00000007,
101262306a36Sopenharmony_ci};
101362306a36Sopenharmony_ci
101462306a36Sopenharmony_cienum jme_gpreg1_vals {
101562306a36Sopenharmony_ci	GPREG1_INTDLYUNIT_16NS	= 0x00000000,
101662306a36Sopenharmony_ci	GPREG1_INTDLYUNIT_256NS	= 0x00000008,
101762306a36Sopenharmony_ci	GPREG1_INTDLYUNIT_1US	= 0x00000010,
101862306a36Sopenharmony_ci	GPREG1_INTDLYUNIT_16US	= 0x00000018,
101962306a36Sopenharmony_ci
102062306a36Sopenharmony_ci	GPREG1_INTDLYEN_1U	= 0x00000001,
102162306a36Sopenharmony_ci	GPREG1_INTDLYEN_2U	= 0x00000002,
102262306a36Sopenharmony_ci	GPREG1_INTDLYEN_3U	= 0x00000003,
102362306a36Sopenharmony_ci	GPREG1_INTDLYEN_4U	= 0x00000004,
102462306a36Sopenharmony_ci	GPREG1_INTDLYEN_5U	= 0x00000005,
102562306a36Sopenharmony_ci	GPREG1_INTDLYEN_6U	= 0x00000006,
102662306a36Sopenharmony_ci	GPREG1_INTDLYEN_7U	= 0x00000007,
102762306a36Sopenharmony_ci
102862306a36Sopenharmony_ci	GPREG1_DEFAULT		= GPREG1_PCREQN,
102962306a36Sopenharmony_ci};
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_ci/*
103262306a36Sopenharmony_ci * Interrupt Status Bits
103362306a36Sopenharmony_ci */
103462306a36Sopenharmony_cienum jme_interrupt_bits {
103562306a36Sopenharmony_ci	INTR_SWINTR	= 0x80000000,
103662306a36Sopenharmony_ci	INTR_TMINTR	= 0x40000000,
103762306a36Sopenharmony_ci	INTR_LINKCH	= 0x20000000,
103862306a36Sopenharmony_ci	INTR_PAUSERCV	= 0x10000000,
103962306a36Sopenharmony_ci	INTR_MAGICRCV	= 0x08000000,
104062306a36Sopenharmony_ci	INTR_WAKERCV	= 0x04000000,
104162306a36Sopenharmony_ci	INTR_PCCRX0TO	= 0x02000000,
104262306a36Sopenharmony_ci	INTR_PCCRX1TO	= 0x01000000,
104362306a36Sopenharmony_ci	INTR_PCCRX2TO	= 0x00800000,
104462306a36Sopenharmony_ci	INTR_PCCRX3TO	= 0x00400000,
104562306a36Sopenharmony_ci	INTR_PCCTXTO	= 0x00200000,
104662306a36Sopenharmony_ci	INTR_PCCRX0	= 0x00100000,
104762306a36Sopenharmony_ci	INTR_PCCRX1	= 0x00080000,
104862306a36Sopenharmony_ci	INTR_PCCRX2	= 0x00040000,
104962306a36Sopenharmony_ci	INTR_PCCRX3	= 0x00020000,
105062306a36Sopenharmony_ci	INTR_PCCTX	= 0x00010000,
105162306a36Sopenharmony_ci	INTR_RX3EMP	= 0x00008000,
105262306a36Sopenharmony_ci	INTR_RX2EMP	= 0x00004000,
105362306a36Sopenharmony_ci	INTR_RX1EMP	= 0x00002000,
105462306a36Sopenharmony_ci	INTR_RX0EMP	= 0x00001000,
105562306a36Sopenharmony_ci	INTR_RX3	= 0x00000800,
105662306a36Sopenharmony_ci	INTR_RX2	= 0x00000400,
105762306a36Sopenharmony_ci	INTR_RX1	= 0x00000200,
105862306a36Sopenharmony_ci	INTR_RX0	= 0x00000100,
105962306a36Sopenharmony_ci	INTR_TX7	= 0x00000080,
106062306a36Sopenharmony_ci	INTR_TX6	= 0x00000040,
106162306a36Sopenharmony_ci	INTR_TX5	= 0x00000020,
106262306a36Sopenharmony_ci	INTR_TX4	= 0x00000010,
106362306a36Sopenharmony_ci	INTR_TX3	= 0x00000008,
106462306a36Sopenharmony_ci	INTR_TX2	= 0x00000004,
106562306a36Sopenharmony_ci	INTR_TX1	= 0x00000002,
106662306a36Sopenharmony_ci	INTR_TX0	= 0x00000001,
106762306a36Sopenharmony_ci};
106862306a36Sopenharmony_ci
106962306a36Sopenharmony_cistatic const u32 INTR_ENABLE = INTR_SWINTR |
107062306a36Sopenharmony_ci				 INTR_TMINTR |
107162306a36Sopenharmony_ci				 INTR_LINKCH |
107262306a36Sopenharmony_ci				 INTR_PCCRX0TO |
107362306a36Sopenharmony_ci				 INTR_PCCRX0 |
107462306a36Sopenharmony_ci				 INTR_PCCTXTO |
107562306a36Sopenharmony_ci				 INTR_PCCTX |
107662306a36Sopenharmony_ci				 INTR_RX0EMP;
107762306a36Sopenharmony_ci
107862306a36Sopenharmony_ci/*
107962306a36Sopenharmony_ci * PCC Control Registers
108062306a36Sopenharmony_ci */
108162306a36Sopenharmony_cienum jme_pccrx_masks {
108262306a36Sopenharmony_ci	PCCRXTO_MASK	= 0xFFFF0000,
108362306a36Sopenharmony_ci	PCCRX_MASK	= 0x0000FF00,
108462306a36Sopenharmony_ci};
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_cienum jme_pcctx_masks {
108762306a36Sopenharmony_ci	PCCTXTO_MASK	= 0xFFFF0000,
108862306a36Sopenharmony_ci	PCCTX_MASK	= 0x0000FF00,
108962306a36Sopenharmony_ci	PCCTX_QS_MASK	= 0x000000FF,
109062306a36Sopenharmony_ci};
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_cienum jme_pccrx_shifts {
109362306a36Sopenharmony_ci	PCCRXTO_SHIFT	= 16,
109462306a36Sopenharmony_ci	PCCRX_SHIFT	= 8,
109562306a36Sopenharmony_ci};
109662306a36Sopenharmony_ci
109762306a36Sopenharmony_cienum jme_pcctx_shifts {
109862306a36Sopenharmony_ci	PCCTXTO_SHIFT	= 16,
109962306a36Sopenharmony_ci	PCCTX_SHIFT	= 8,
110062306a36Sopenharmony_ci};
110162306a36Sopenharmony_ci
110262306a36Sopenharmony_cienum jme_pcctx_bits {
110362306a36Sopenharmony_ci	PCCTXQ0_EN	= 0x00000001,
110462306a36Sopenharmony_ci	PCCTXQ1_EN	= 0x00000002,
110562306a36Sopenharmony_ci	PCCTXQ2_EN	= 0x00000004,
110662306a36Sopenharmony_ci	PCCTXQ3_EN	= 0x00000008,
110762306a36Sopenharmony_ci	PCCTXQ4_EN	= 0x00000010,
110862306a36Sopenharmony_ci	PCCTXQ5_EN	= 0x00000020,
110962306a36Sopenharmony_ci	PCCTXQ6_EN	= 0x00000040,
111062306a36Sopenharmony_ci	PCCTXQ7_EN	= 0x00000080,
111162306a36Sopenharmony_ci};
111262306a36Sopenharmony_ci
111362306a36Sopenharmony_ci/*
111462306a36Sopenharmony_ci * Chip Mode Register
111562306a36Sopenharmony_ci */
111662306a36Sopenharmony_cienum jme_chipmode_bit_masks {
111762306a36Sopenharmony_ci	CM_FPGAVER_MASK		= 0xFFFF0000,
111862306a36Sopenharmony_ci	CM_CHIPREV_MASK		= 0x0000FF00,
111962306a36Sopenharmony_ci	CM_CHIPMODE_MASK	= 0x0000000F,
112062306a36Sopenharmony_ci};
112162306a36Sopenharmony_ci
112262306a36Sopenharmony_cienum jme_chipmode_shifts {
112362306a36Sopenharmony_ci	CM_FPGAVER_SHIFT	= 16,
112462306a36Sopenharmony_ci	CM_CHIPREV_SHIFT	= 8,
112562306a36Sopenharmony_ci};
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_ci/*
112862306a36Sopenharmony_ci * Aggressive Power Mode Control
112962306a36Sopenharmony_ci */
113062306a36Sopenharmony_cienum jme_apmc_bits {
113162306a36Sopenharmony_ci	JME_APMC_PCIE_SD_EN	= 0x40000000,
113262306a36Sopenharmony_ci	JME_APMC_PSEUDO_HP_EN	= 0x20000000,
113362306a36Sopenharmony_ci	JME_APMC_EPIEN		= 0x04000000,
113462306a36Sopenharmony_ci	JME_APMC_EPIEN_CTRL	= 0x03000000,
113562306a36Sopenharmony_ci};
113662306a36Sopenharmony_ci
113762306a36Sopenharmony_cienum jme_apmc_values {
113862306a36Sopenharmony_ci	JME_APMC_EPIEN_CTRL_EN	= 0x02000000,
113962306a36Sopenharmony_ci	JME_APMC_EPIEN_CTRL_DIS	= 0x01000000,
114062306a36Sopenharmony_ci};
114162306a36Sopenharmony_ci
114262306a36Sopenharmony_ci#define APMC_PHP_SHUTDOWN_DELAY	(10 * 1000 * 1000)
114362306a36Sopenharmony_ci
114462306a36Sopenharmony_ci#ifdef REG_DEBUG
114562306a36Sopenharmony_cistatic char *MAC_REG_NAME[] = {
114662306a36Sopenharmony_ci	"JME_TXCS",      "JME_TXDBA_LO",  "JME_TXDBA_HI", "JME_TXQDC",
114762306a36Sopenharmony_ci	"JME_TXNDA",     "JME_TXMCS",     "JME_TXPFC",    "JME_TXTRHD",
114862306a36Sopenharmony_ci	"JME_RXCS",      "JME_RXDBA_LO",  "JME_RXDBA_HI", "JME_RXQDC",
114962306a36Sopenharmony_ci	"JME_RXNDA",     "JME_RXMCS",     "JME_RXUMA_LO", "JME_RXUMA_HI",
115062306a36Sopenharmony_ci	"JME_RXMCHT_LO", "JME_RXMCHT_HI", "JME_WFODP",    "JME_WFOI",
115162306a36Sopenharmony_ci	"JME_SMI",       "JME_GHC",       "UNKNOWN",      "UNKNOWN",
115262306a36Sopenharmony_ci	"JME_PMCS"};
115362306a36Sopenharmony_ci
115462306a36Sopenharmony_cistatic char *PE_REG_NAME[] = {
115562306a36Sopenharmony_ci	"UNKNOWN",      "UNKNOWN",     "UNKNOWN",    "UNKNOWN",
115662306a36Sopenharmony_ci	"UNKNOWN",      "UNKNOWN",     "UNKNOWN",    "UNKNOWN",
115762306a36Sopenharmony_ci	"UNKNOWN",      "UNKNOWN",     "JME_PHY_CS", "UNKNOWN",
115862306a36Sopenharmony_ci	"JME_PHY_LINK", "UNKNOWN",     "UNKNOWN",    "UNKNOWN",
115962306a36Sopenharmony_ci	"JME_SMBCSR",   "JME_SMBINTF"};
116062306a36Sopenharmony_ci
116162306a36Sopenharmony_cistatic char *MISC_REG_NAME[] = {
116262306a36Sopenharmony_ci	"JME_TMCSR",  "JME_GPIO",     "JME_GPREG0",  "JME_GPREG1",
116362306a36Sopenharmony_ci	"JME_IEVE",   "JME_IREQ",     "JME_IENS",    "JME_IENC",
116462306a36Sopenharmony_ci	"JME_PCCRX0", "JME_PCCRX1",   "JME_PCCRX2",  "JME_PCCRX3",
116562306a36Sopenharmony_ci	"JME_PCCTX0", "JME_CHIPMODE", "JME_SHBA_HI", "JME_SHBA_LO",
116662306a36Sopenharmony_ci	"UNKNOWN",    "UNKNOWN",      "UNKNOWN",     "UNKNOWN",
116762306a36Sopenharmony_ci	"UNKNOWN",    "UNKNOWN",      "UNKNOWN",     "UNKNOWN",
116862306a36Sopenharmony_ci	"UNKNOWN",    "UNKNOWN",      "UNKNOWN",     "UNKNOWN",
116962306a36Sopenharmony_ci	"JME_TIMER1", "JME_TIMER2",   "UNKNOWN",     "JME_APMC",
117062306a36Sopenharmony_ci	"JME_PCCSRX0"};
117162306a36Sopenharmony_ci
117262306a36Sopenharmony_cistatic inline void reg_dbg(const struct jme_adapter *jme,
117362306a36Sopenharmony_ci		const char *msg, u32 val, u32 reg)
117462306a36Sopenharmony_ci{
117562306a36Sopenharmony_ci	const char *regname;
117662306a36Sopenharmony_ci	switch (reg & 0xF00) {
117762306a36Sopenharmony_ci	case 0x000:
117862306a36Sopenharmony_ci		regname = MAC_REG_NAME[(reg & 0xFF) >> 2];
117962306a36Sopenharmony_ci		break;
118062306a36Sopenharmony_ci	case 0x400:
118162306a36Sopenharmony_ci		regname = PE_REG_NAME[(reg & 0xFF) >> 2];
118262306a36Sopenharmony_ci		break;
118362306a36Sopenharmony_ci	case 0x800:
118462306a36Sopenharmony_ci		regname = MISC_REG_NAME[(reg & 0xFF) >> 2];
118562306a36Sopenharmony_ci		break;
118662306a36Sopenharmony_ci	default:
118762306a36Sopenharmony_ci		regname = PE_REG_NAME[0];
118862306a36Sopenharmony_ci	}
118962306a36Sopenharmony_ci	printk(KERN_DEBUG "%s: %-20s %08x@%s\n", jme->dev->name,
119062306a36Sopenharmony_ci			msg, val, regname);
119162306a36Sopenharmony_ci}
119262306a36Sopenharmony_ci#else
119362306a36Sopenharmony_cistatic inline void reg_dbg(const struct jme_adapter *jme,
119462306a36Sopenharmony_ci		const char *msg, u32 val, u32 reg) {}
119562306a36Sopenharmony_ci#endif
119662306a36Sopenharmony_ci
119762306a36Sopenharmony_ci/*
119862306a36Sopenharmony_ci * Read/Write MMaped I/O Registers
119962306a36Sopenharmony_ci */
120062306a36Sopenharmony_cistatic inline u32 jread32(struct jme_adapter *jme, u32 reg)
120162306a36Sopenharmony_ci{
120262306a36Sopenharmony_ci	return readl(jme->regs + reg);
120362306a36Sopenharmony_ci}
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_cistatic inline void jwrite32(struct jme_adapter *jme, u32 reg, u32 val)
120662306a36Sopenharmony_ci{
120762306a36Sopenharmony_ci	reg_dbg(jme, "REG WRITE", val, reg);
120862306a36Sopenharmony_ci	writel(val, jme->regs + reg);
120962306a36Sopenharmony_ci	reg_dbg(jme, "VAL AFTER WRITE", readl(jme->regs + reg), reg);
121062306a36Sopenharmony_ci}
121162306a36Sopenharmony_ci
121262306a36Sopenharmony_cistatic inline void jwrite32f(struct jme_adapter *jme, u32 reg, u32 val)
121362306a36Sopenharmony_ci{
121462306a36Sopenharmony_ci	/*
121562306a36Sopenharmony_ci	 * Read after write should cause flush
121662306a36Sopenharmony_ci	 */
121762306a36Sopenharmony_ci	reg_dbg(jme, "REG WRITE FLUSH", val, reg);
121862306a36Sopenharmony_ci	writel(val, jme->regs + reg);
121962306a36Sopenharmony_ci	readl(jme->regs + reg);
122062306a36Sopenharmony_ci	reg_dbg(jme, "VAL AFTER WRITE", readl(jme->regs + reg), reg);
122162306a36Sopenharmony_ci}
122262306a36Sopenharmony_ci
122362306a36Sopenharmony_ci/*
122462306a36Sopenharmony_ci * PHY Regs
122562306a36Sopenharmony_ci */
122662306a36Sopenharmony_cienum jme_phy_reg17_bit_masks {
122762306a36Sopenharmony_ci	PREG17_SPEED		= 0xC000,
122862306a36Sopenharmony_ci	PREG17_DUPLEX		= 0x2000,
122962306a36Sopenharmony_ci	PREG17_SPDRSV		= 0x0800,
123062306a36Sopenharmony_ci	PREG17_LNKUP		= 0x0400,
123162306a36Sopenharmony_ci	PREG17_MDI		= 0x0040,
123262306a36Sopenharmony_ci};
123362306a36Sopenharmony_ci
123462306a36Sopenharmony_cienum jme_phy_reg17_vals {
123562306a36Sopenharmony_ci	PREG17_SPEED_10M	= 0x0000,
123662306a36Sopenharmony_ci	PREG17_SPEED_100M	= 0x4000,
123762306a36Sopenharmony_ci	PREG17_SPEED_1000M	= 0x8000,
123862306a36Sopenharmony_ci};
123962306a36Sopenharmony_ci
124062306a36Sopenharmony_ci#define BMSR_ANCOMP               0x0020
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_ci/*
124362306a36Sopenharmony_ci * Workaround
124462306a36Sopenharmony_ci */
124562306a36Sopenharmony_cistatic inline int is_buggy250(unsigned short device, u8 chiprev)
124662306a36Sopenharmony_ci{
124762306a36Sopenharmony_ci	return device == PCI_DEVICE_ID_JMICRON_JMC250 && chiprev == 0x11;
124862306a36Sopenharmony_ci}
124962306a36Sopenharmony_ci
125062306a36Sopenharmony_cistatic inline int new_phy_power_ctrl(u8 chip_main_rev)
125162306a36Sopenharmony_ci{
125262306a36Sopenharmony_ci	return chip_main_rev >= 5;
125362306a36Sopenharmony_ci}
125462306a36Sopenharmony_ci
125562306a36Sopenharmony_ci/*
125662306a36Sopenharmony_ci * Function prototypes
125762306a36Sopenharmony_ci */
125862306a36Sopenharmony_cistatic int jme_set_link_ksettings(struct net_device *netdev,
125962306a36Sopenharmony_ci				  const struct ethtool_link_ksettings *cmd);
126062306a36Sopenharmony_cistatic void jme_set_unicastaddr(struct net_device *netdev);
126162306a36Sopenharmony_cistatic void jme_set_multi(struct net_device *netdev);
126262306a36Sopenharmony_ci
126362306a36Sopenharmony_ci#endif
1264