19751ee09SNobuhiro Iwamatsu /*
2*1cc0a9f4SRobert P. J. Day * sh_eth.h - Driver for Renesas SuperH ethernet controller.
39751ee09SNobuhiro Iwamatsu *
4dcd5a593SNobuhiro Iwamatsu * Copyright (C) 2008 - 2012 Renesas Solutions Corp.
5dcd5a593SNobuhiro Iwamatsu * Copyright (c) 2008 - 2012 Nobuhiro Iwamatsu
69751ee09SNobuhiro Iwamatsu * Copyright (c) 2007 Carlos Munoz <carlos@kenati.com>
79751ee09SNobuhiro Iwamatsu *
81a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
99751ee09SNobuhiro Iwamatsu */
109751ee09SNobuhiro Iwamatsu
11bd3980ccSNobuhiro Iwamatsu #include <netdev.h>
129751ee09SNobuhiro Iwamatsu #include <asm/types.h>
139751ee09SNobuhiro Iwamatsu
149751ee09SNobuhiro Iwamatsu #define SHETHER_NAME "sh_eth"
159751ee09SNobuhiro Iwamatsu
16dcd5a593SNobuhiro Iwamatsu #if defined(CONFIG_SH)
179751ee09SNobuhiro Iwamatsu /* Malloc returns addresses in the P1 area (cacheable). However we need to
189751ee09SNobuhiro Iwamatsu use area P2 (non-cacheable) */
199751ee09SNobuhiro Iwamatsu #define ADDR_TO_P2(addr) ((((int)(addr) & ~0xe0000000) | 0xa0000000))
209751ee09SNobuhiro Iwamatsu
219751ee09SNobuhiro Iwamatsu /* The ethernet controller needs to use physical addresses */
22903de461SYoshihiro Shimoda #if defined(CONFIG_SH_32BIT)
23903de461SYoshihiro Shimoda #define ADDR_TO_PHY(addr) ((((int)(addr) & ~0xe0000000) | 0x40000000))
24903de461SYoshihiro Shimoda #else
259751ee09SNobuhiro Iwamatsu #define ADDR_TO_PHY(addr) ((int)(addr) & ~0xe0000000)
26903de461SYoshihiro Shimoda #endif
27dcd5a593SNobuhiro Iwamatsu #elif defined(CONFIG_ARM)
28dcd5a593SNobuhiro Iwamatsu #define inl readl
29dcd5a593SNobuhiro Iwamatsu #define outl writel
30dcd5a593SNobuhiro Iwamatsu #define ADDR_TO_PHY(addr) ((int)(addr))
31dcd5a593SNobuhiro Iwamatsu #define ADDR_TO_P2(addr) (addr)
32dcd5a593SNobuhiro Iwamatsu #endif /* defined(CONFIG_SH) */
339751ee09SNobuhiro Iwamatsu
34f8b7507dSNobuhiro Iwamatsu /* base padding size is 16 */
35f8b7507dSNobuhiro Iwamatsu #ifndef CONFIG_SH_ETHER_ALIGNE_SIZE
36f8b7507dSNobuhiro Iwamatsu #define CONFIG_SH_ETHER_ALIGNE_SIZE 16
37f8b7507dSNobuhiro Iwamatsu #endif
38f8b7507dSNobuhiro Iwamatsu
399751ee09SNobuhiro Iwamatsu /* Number of supported ports */
409751ee09SNobuhiro Iwamatsu #define MAX_PORT_NUM 2
419751ee09SNobuhiro Iwamatsu
429751ee09SNobuhiro Iwamatsu /* Buffers must be big enough to hold the largest ethernet frame. Also, rx
439751ee09SNobuhiro Iwamatsu buffers must be a multiple of 32 bytes */
449751ee09SNobuhiro Iwamatsu #define MAX_BUF_SIZE (48 * 32)
459751ee09SNobuhiro Iwamatsu
469751ee09SNobuhiro Iwamatsu /* The number of tx descriptors must be large enough to point to 5 or more
479751ee09SNobuhiro Iwamatsu frames. If each frame uses 2 descriptors, at least 10 descriptors are needed.
489751ee09SNobuhiro Iwamatsu We use one descriptor per frame */
499751ee09SNobuhiro Iwamatsu #define NUM_TX_DESC 8
509751ee09SNobuhiro Iwamatsu
519751ee09SNobuhiro Iwamatsu /* The size of the tx descriptor is determined by how much padding is used.
529751ee09SNobuhiro Iwamatsu 4, 20, or 52 bytes of padding can be used */
53f8b7507dSNobuhiro Iwamatsu #define TX_DESC_PADDING (CONFIG_SH_ETHER_ALIGNE_SIZE - 12)
549751ee09SNobuhiro Iwamatsu
55bd3980ccSNobuhiro Iwamatsu /* Tx descriptor. We always use 3 bytes of padding */
569751ee09SNobuhiro Iwamatsu struct tx_desc_s {
579751ee09SNobuhiro Iwamatsu volatile u32 td0;
589751ee09SNobuhiro Iwamatsu u32 td1;
599751ee09SNobuhiro Iwamatsu u32 td2; /* Buffer start */
60f8b7507dSNobuhiro Iwamatsu u8 padding[TX_DESC_PADDING]; /* aligned cache line size */
619751ee09SNobuhiro Iwamatsu };
629751ee09SNobuhiro Iwamatsu
639751ee09SNobuhiro Iwamatsu /* There is no limitation in the number of rx descriptors */
649751ee09SNobuhiro Iwamatsu #define NUM_RX_DESC 8
659751ee09SNobuhiro Iwamatsu
669751ee09SNobuhiro Iwamatsu /* The size of the rx descriptor is determined by how much padding is used.
679751ee09SNobuhiro Iwamatsu 4, 20, or 52 bytes of padding can be used */
68f8b7507dSNobuhiro Iwamatsu #define RX_DESC_PADDING (CONFIG_SH_ETHER_ALIGNE_SIZE - 12)
69f8b7507dSNobuhiro Iwamatsu /* aligned cache line size */
70f8b7507dSNobuhiro Iwamatsu #define RX_BUF_ALIGNE_SIZE (CONFIG_SH_ETHER_ALIGNE_SIZE > 32 ? 64 : 32)
719751ee09SNobuhiro Iwamatsu
729751ee09SNobuhiro Iwamatsu /* Rx descriptor. We always use 4 bytes of padding */
739751ee09SNobuhiro Iwamatsu struct rx_desc_s {
749751ee09SNobuhiro Iwamatsu volatile u32 rd0;
759751ee09SNobuhiro Iwamatsu volatile u32 rd1;
769751ee09SNobuhiro Iwamatsu u32 rd2; /* Buffer start */
77f8b7507dSNobuhiro Iwamatsu u8 padding[TX_DESC_PADDING]; /* aligned cache line size */
789751ee09SNobuhiro Iwamatsu };
799751ee09SNobuhiro Iwamatsu
80bd3980ccSNobuhiro Iwamatsu struct sh_eth_info {
81000889cdSNobuhiro Iwamatsu struct tx_desc_s *tx_desc_alloc;
829751ee09SNobuhiro Iwamatsu struct tx_desc_s *tx_desc_base;
839751ee09SNobuhiro Iwamatsu struct tx_desc_s *tx_desc_cur;
84000889cdSNobuhiro Iwamatsu struct rx_desc_s *rx_desc_alloc;
859751ee09SNobuhiro Iwamatsu struct rx_desc_s *rx_desc_base;
869751ee09SNobuhiro Iwamatsu struct rx_desc_s *rx_desc_cur;
87000889cdSNobuhiro Iwamatsu u8 *rx_buf_alloc;
889751ee09SNobuhiro Iwamatsu u8 *rx_buf_base;
899751ee09SNobuhiro Iwamatsu u8 mac_addr[6];
909751ee09SNobuhiro Iwamatsu u8 phy_addr;
91bd3980ccSNobuhiro Iwamatsu struct eth_device *dev;
92bd1024b0SYoshihiro Shimoda struct phy_device *phydev;
939751ee09SNobuhiro Iwamatsu };
949751ee09SNobuhiro Iwamatsu
95bd3980ccSNobuhiro Iwamatsu struct sh_eth_dev {
969751ee09SNobuhiro Iwamatsu int port;
97bd3980ccSNobuhiro Iwamatsu struct sh_eth_info port_info[MAX_PORT_NUM];
989751ee09SNobuhiro Iwamatsu };
999751ee09SNobuhiro Iwamatsu
10049afb8caSYoshihiro Shimoda /* from linux/drivers/net/ethernet/renesas/sh_eth.h */
10149afb8caSYoshihiro Shimoda enum {
10249afb8caSYoshihiro Shimoda /* E-DMAC registers */
10349afb8caSYoshihiro Shimoda EDSR = 0,
10449afb8caSYoshihiro Shimoda EDMR,
10549afb8caSYoshihiro Shimoda EDTRR,
10649afb8caSYoshihiro Shimoda EDRRR,
10749afb8caSYoshihiro Shimoda EESR,
10849afb8caSYoshihiro Shimoda EESIPR,
10949afb8caSYoshihiro Shimoda TDLAR,
11049afb8caSYoshihiro Shimoda TDFAR,
11149afb8caSYoshihiro Shimoda TDFXR,
11249afb8caSYoshihiro Shimoda TDFFR,
11349afb8caSYoshihiro Shimoda RDLAR,
11449afb8caSYoshihiro Shimoda RDFAR,
11549afb8caSYoshihiro Shimoda RDFXR,
11649afb8caSYoshihiro Shimoda RDFFR,
11749afb8caSYoshihiro Shimoda TRSCER,
11849afb8caSYoshihiro Shimoda RMFCR,
11949afb8caSYoshihiro Shimoda TFTR,
12049afb8caSYoshihiro Shimoda FDR,
12149afb8caSYoshihiro Shimoda RMCR,
12249afb8caSYoshihiro Shimoda EDOCR,
12349afb8caSYoshihiro Shimoda TFUCR,
12449afb8caSYoshihiro Shimoda RFOCR,
12549afb8caSYoshihiro Shimoda FCFTR,
12649afb8caSYoshihiro Shimoda RPADIR,
12749afb8caSYoshihiro Shimoda TRIMD,
12849afb8caSYoshihiro Shimoda RBWAR,
12949afb8caSYoshihiro Shimoda TBRAR,
13049afb8caSYoshihiro Shimoda
13149afb8caSYoshihiro Shimoda /* Ether registers */
13249afb8caSYoshihiro Shimoda ECMR,
13349afb8caSYoshihiro Shimoda ECSR,
13449afb8caSYoshihiro Shimoda ECSIPR,
13549afb8caSYoshihiro Shimoda PIR,
13649afb8caSYoshihiro Shimoda PSR,
13749afb8caSYoshihiro Shimoda RDMLR,
13849afb8caSYoshihiro Shimoda PIPR,
13949afb8caSYoshihiro Shimoda RFLR,
14049afb8caSYoshihiro Shimoda IPGR,
14149afb8caSYoshihiro Shimoda APR,
14249afb8caSYoshihiro Shimoda MPR,
14349afb8caSYoshihiro Shimoda PFTCR,
14449afb8caSYoshihiro Shimoda PFRCR,
14549afb8caSYoshihiro Shimoda RFCR,
14649afb8caSYoshihiro Shimoda RFCF,
14749afb8caSYoshihiro Shimoda TPAUSER,
14849afb8caSYoshihiro Shimoda TPAUSECR,
14949afb8caSYoshihiro Shimoda BCFR,
15049afb8caSYoshihiro Shimoda BCFRR,
15149afb8caSYoshihiro Shimoda GECMR,
15249afb8caSYoshihiro Shimoda BCULR,
15349afb8caSYoshihiro Shimoda MAHR,
15449afb8caSYoshihiro Shimoda MALR,
15549afb8caSYoshihiro Shimoda TROCR,
15649afb8caSYoshihiro Shimoda CDCR,
15749afb8caSYoshihiro Shimoda LCCR,
15849afb8caSYoshihiro Shimoda CNDCR,
15949afb8caSYoshihiro Shimoda CEFCR,
16049afb8caSYoshihiro Shimoda FRECR,
16149afb8caSYoshihiro Shimoda TSFRCR,
16249afb8caSYoshihiro Shimoda TLFRCR,
16349afb8caSYoshihiro Shimoda CERCR,
16449afb8caSYoshihiro Shimoda CEECR,
1658707678cSNobuhiro Iwamatsu RMIIMR, /* R8A7790 */
16649afb8caSYoshihiro Shimoda MAFCR,
16749afb8caSYoshihiro Shimoda RTRATE,
16849afb8caSYoshihiro Shimoda CSMR,
16949afb8caSYoshihiro Shimoda RMII_MII,
17049afb8caSYoshihiro Shimoda
17149afb8caSYoshihiro Shimoda /* This value must be written at last. */
17249afb8caSYoshihiro Shimoda SH_ETH_MAX_REGISTER_OFFSET,
17349afb8caSYoshihiro Shimoda };
17449afb8caSYoshihiro Shimoda
17549afb8caSYoshihiro Shimoda static const u16 sh_eth_offset_gigabit[SH_ETH_MAX_REGISTER_OFFSET] = {
17649afb8caSYoshihiro Shimoda [EDSR] = 0x0000,
17749afb8caSYoshihiro Shimoda [EDMR] = 0x0400,
17849afb8caSYoshihiro Shimoda [EDTRR] = 0x0408,
17949afb8caSYoshihiro Shimoda [EDRRR] = 0x0410,
18049afb8caSYoshihiro Shimoda [EESR] = 0x0428,
18149afb8caSYoshihiro Shimoda [EESIPR] = 0x0430,
18249afb8caSYoshihiro Shimoda [TDLAR] = 0x0010,
18349afb8caSYoshihiro Shimoda [TDFAR] = 0x0014,
18449afb8caSYoshihiro Shimoda [TDFXR] = 0x0018,
18549afb8caSYoshihiro Shimoda [TDFFR] = 0x001c,
18649afb8caSYoshihiro Shimoda [RDLAR] = 0x0030,
18749afb8caSYoshihiro Shimoda [RDFAR] = 0x0034,
18849afb8caSYoshihiro Shimoda [RDFXR] = 0x0038,
18949afb8caSYoshihiro Shimoda [RDFFR] = 0x003c,
19049afb8caSYoshihiro Shimoda [TRSCER] = 0x0438,
19149afb8caSYoshihiro Shimoda [RMFCR] = 0x0440,
19249afb8caSYoshihiro Shimoda [TFTR] = 0x0448,
19349afb8caSYoshihiro Shimoda [FDR] = 0x0450,
19449afb8caSYoshihiro Shimoda [RMCR] = 0x0458,
19549afb8caSYoshihiro Shimoda [RPADIR] = 0x0460,
19649afb8caSYoshihiro Shimoda [FCFTR] = 0x0468,
19749afb8caSYoshihiro Shimoda [CSMR] = 0x04E4,
19849afb8caSYoshihiro Shimoda
19949afb8caSYoshihiro Shimoda [ECMR] = 0x0500,
20049afb8caSYoshihiro Shimoda [ECSR] = 0x0510,
20149afb8caSYoshihiro Shimoda [ECSIPR] = 0x0518,
20249afb8caSYoshihiro Shimoda [PIR] = 0x0520,
20349afb8caSYoshihiro Shimoda [PSR] = 0x0528,
20449afb8caSYoshihiro Shimoda [PIPR] = 0x052c,
20549afb8caSYoshihiro Shimoda [RFLR] = 0x0508,
20649afb8caSYoshihiro Shimoda [APR] = 0x0554,
20749afb8caSYoshihiro Shimoda [MPR] = 0x0558,
20849afb8caSYoshihiro Shimoda [PFTCR] = 0x055c,
20949afb8caSYoshihiro Shimoda [PFRCR] = 0x0560,
21049afb8caSYoshihiro Shimoda [TPAUSER] = 0x0564,
21149afb8caSYoshihiro Shimoda [GECMR] = 0x05b0,
21249afb8caSYoshihiro Shimoda [BCULR] = 0x05b4,
21349afb8caSYoshihiro Shimoda [MAHR] = 0x05c0,
21449afb8caSYoshihiro Shimoda [MALR] = 0x05c8,
21549afb8caSYoshihiro Shimoda [TROCR] = 0x0700,
21649afb8caSYoshihiro Shimoda [CDCR] = 0x0708,
21749afb8caSYoshihiro Shimoda [LCCR] = 0x0710,
21849afb8caSYoshihiro Shimoda [CEFCR] = 0x0740,
21949afb8caSYoshihiro Shimoda [FRECR] = 0x0748,
22049afb8caSYoshihiro Shimoda [TSFRCR] = 0x0750,
22149afb8caSYoshihiro Shimoda [TLFRCR] = 0x0758,
22249afb8caSYoshihiro Shimoda [RFCR] = 0x0760,
22349afb8caSYoshihiro Shimoda [CERCR] = 0x0768,
22449afb8caSYoshihiro Shimoda [CEECR] = 0x0770,
22549afb8caSYoshihiro Shimoda [MAFCR] = 0x0778,
22649afb8caSYoshihiro Shimoda [RMII_MII] = 0x0790,
22749afb8caSYoshihiro Shimoda };
22849afb8caSYoshihiro Shimoda
22962cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_RZ)
23062cbddc4SNobuhiro Iwamatsu static const u16 sh_eth_offset_rz[SH_ETH_MAX_REGISTER_OFFSET] = {
23162cbddc4SNobuhiro Iwamatsu [EDSR] = 0x0000,
23262cbddc4SNobuhiro Iwamatsu [EDMR] = 0x0400,
23362cbddc4SNobuhiro Iwamatsu [EDTRR] = 0x0408,
23462cbddc4SNobuhiro Iwamatsu [EDRRR] = 0x0410,
23562cbddc4SNobuhiro Iwamatsu [EESR] = 0x0428,
23662cbddc4SNobuhiro Iwamatsu [EESIPR] = 0x0430,
23762cbddc4SNobuhiro Iwamatsu [TDLAR] = 0x0010,
23862cbddc4SNobuhiro Iwamatsu [TDFAR] = 0x0014,
23962cbddc4SNobuhiro Iwamatsu [TDFXR] = 0x0018,
24062cbddc4SNobuhiro Iwamatsu [TDFFR] = 0x001c,
24162cbddc4SNobuhiro Iwamatsu [RDLAR] = 0x0030,
24262cbddc4SNobuhiro Iwamatsu [RDFAR] = 0x0034,
24362cbddc4SNobuhiro Iwamatsu [RDFXR] = 0x0038,
24462cbddc4SNobuhiro Iwamatsu [RDFFR] = 0x003c,
24562cbddc4SNobuhiro Iwamatsu [TRSCER] = 0x0438,
24662cbddc4SNobuhiro Iwamatsu [RMFCR] = 0x0440,
24762cbddc4SNobuhiro Iwamatsu [TFTR] = 0x0448,
24862cbddc4SNobuhiro Iwamatsu [FDR] = 0x0450,
24962cbddc4SNobuhiro Iwamatsu [RMCR] = 0x0458,
25062cbddc4SNobuhiro Iwamatsu [RPADIR] = 0x0460,
25162cbddc4SNobuhiro Iwamatsu [FCFTR] = 0x0468,
25262cbddc4SNobuhiro Iwamatsu [CSMR] = 0x04E4,
25362cbddc4SNobuhiro Iwamatsu
25462cbddc4SNobuhiro Iwamatsu [ECMR] = 0x0500,
25562cbddc4SNobuhiro Iwamatsu [ECSR] = 0x0510,
25662cbddc4SNobuhiro Iwamatsu [ECSIPR] = 0x0518,
25762cbddc4SNobuhiro Iwamatsu [PSR] = 0x0528,
25862cbddc4SNobuhiro Iwamatsu [PIPR] = 0x052c,
25962cbddc4SNobuhiro Iwamatsu [RFLR] = 0x0508,
26062cbddc4SNobuhiro Iwamatsu [APR] = 0x0554,
26162cbddc4SNobuhiro Iwamatsu [MPR] = 0x0558,
26262cbddc4SNobuhiro Iwamatsu [PFTCR] = 0x055c,
26362cbddc4SNobuhiro Iwamatsu [PFRCR] = 0x0560,
26462cbddc4SNobuhiro Iwamatsu [TPAUSER] = 0x0564,
26562cbddc4SNobuhiro Iwamatsu [GECMR] = 0x05b0,
26662cbddc4SNobuhiro Iwamatsu [BCULR] = 0x05b4,
26762cbddc4SNobuhiro Iwamatsu [MAHR] = 0x05c0,
26862cbddc4SNobuhiro Iwamatsu [MALR] = 0x05c8,
26962cbddc4SNobuhiro Iwamatsu [TROCR] = 0x0700,
27062cbddc4SNobuhiro Iwamatsu [CDCR] = 0x0708,
27162cbddc4SNobuhiro Iwamatsu [LCCR] = 0x0710,
27262cbddc4SNobuhiro Iwamatsu [CEFCR] = 0x0740,
27362cbddc4SNobuhiro Iwamatsu [FRECR] = 0x0748,
27462cbddc4SNobuhiro Iwamatsu [TSFRCR] = 0x0750,
27562cbddc4SNobuhiro Iwamatsu [TLFRCR] = 0x0758,
27662cbddc4SNobuhiro Iwamatsu [RFCR] = 0x0760,
27762cbddc4SNobuhiro Iwamatsu [CERCR] = 0x0768,
27862cbddc4SNobuhiro Iwamatsu [CEECR] = 0x0770,
27962cbddc4SNobuhiro Iwamatsu [MAFCR] = 0x0778,
28062cbddc4SNobuhiro Iwamatsu [RMII_MII] = 0x0790,
28162cbddc4SNobuhiro Iwamatsu };
28262cbddc4SNobuhiro Iwamatsu #endif
28362cbddc4SNobuhiro Iwamatsu
28449afb8caSYoshihiro Shimoda static const u16 sh_eth_offset_fast_sh4[SH_ETH_MAX_REGISTER_OFFSET] = {
28549afb8caSYoshihiro Shimoda [ECMR] = 0x0100,
28649afb8caSYoshihiro Shimoda [RFLR] = 0x0108,
28749afb8caSYoshihiro Shimoda [ECSR] = 0x0110,
28849afb8caSYoshihiro Shimoda [ECSIPR] = 0x0118,
28949afb8caSYoshihiro Shimoda [PIR] = 0x0120,
29049afb8caSYoshihiro Shimoda [PSR] = 0x0128,
29149afb8caSYoshihiro Shimoda [RDMLR] = 0x0140,
29249afb8caSYoshihiro Shimoda [IPGR] = 0x0150,
29349afb8caSYoshihiro Shimoda [APR] = 0x0154,
29449afb8caSYoshihiro Shimoda [MPR] = 0x0158,
29549afb8caSYoshihiro Shimoda [TPAUSER] = 0x0164,
29649afb8caSYoshihiro Shimoda [RFCF] = 0x0160,
29749afb8caSYoshihiro Shimoda [TPAUSECR] = 0x0168,
29849afb8caSYoshihiro Shimoda [BCFRR] = 0x016c,
29949afb8caSYoshihiro Shimoda [MAHR] = 0x01c0,
30049afb8caSYoshihiro Shimoda [MALR] = 0x01c8,
30149afb8caSYoshihiro Shimoda [TROCR] = 0x01d0,
30249afb8caSYoshihiro Shimoda [CDCR] = 0x01d4,
30349afb8caSYoshihiro Shimoda [LCCR] = 0x01d8,
30449afb8caSYoshihiro Shimoda [CNDCR] = 0x01dc,
30549afb8caSYoshihiro Shimoda [CEFCR] = 0x01e4,
30649afb8caSYoshihiro Shimoda [FRECR] = 0x01e8,
30749afb8caSYoshihiro Shimoda [TSFRCR] = 0x01ec,
30849afb8caSYoshihiro Shimoda [TLFRCR] = 0x01f0,
30949afb8caSYoshihiro Shimoda [RFCR] = 0x01f4,
31049afb8caSYoshihiro Shimoda [MAFCR] = 0x01f8,
31149afb8caSYoshihiro Shimoda [RTRATE] = 0x01fc,
31249afb8caSYoshihiro Shimoda
31349afb8caSYoshihiro Shimoda [EDMR] = 0x0000,
31449afb8caSYoshihiro Shimoda [EDTRR] = 0x0008,
31549afb8caSYoshihiro Shimoda [EDRRR] = 0x0010,
31649afb8caSYoshihiro Shimoda [TDLAR] = 0x0018,
31749afb8caSYoshihiro Shimoda [RDLAR] = 0x0020,
31849afb8caSYoshihiro Shimoda [EESR] = 0x0028,
31949afb8caSYoshihiro Shimoda [EESIPR] = 0x0030,
32049afb8caSYoshihiro Shimoda [TRSCER] = 0x0038,
32149afb8caSYoshihiro Shimoda [RMFCR] = 0x0040,
32249afb8caSYoshihiro Shimoda [TFTR] = 0x0048,
32349afb8caSYoshihiro Shimoda [FDR] = 0x0050,
32449afb8caSYoshihiro Shimoda [RMCR] = 0x0058,
32549afb8caSYoshihiro Shimoda [TFUCR] = 0x0064,
32649afb8caSYoshihiro Shimoda [RFOCR] = 0x0068,
3278707678cSNobuhiro Iwamatsu [RMIIMR] = 0x006C,
32849afb8caSYoshihiro Shimoda [FCFTR] = 0x0070,
32949afb8caSYoshihiro Shimoda [RPADIR] = 0x0078,
33049afb8caSYoshihiro Shimoda [TRIMD] = 0x007c,
33149afb8caSYoshihiro Shimoda [RBWAR] = 0x00c8,
33249afb8caSYoshihiro Shimoda [RDFAR] = 0x00cc,
33349afb8caSYoshihiro Shimoda [TBRAR] = 0x00d4,
33449afb8caSYoshihiro Shimoda [TDFAR] = 0x00d8,
33549afb8caSYoshihiro Shimoda };
33649afb8caSYoshihiro Shimoda
3379751ee09SNobuhiro Iwamatsu /* Register Address */
33849afb8caSYoshihiro Shimoda #if defined(CONFIG_CPU_SH7763) || defined(CONFIG_CPU_SH7734)
33926235093SYoshihiro Shimoda #define SH_ETH_TYPE_GETHER
3409751ee09SNobuhiro Iwamatsu #define BASE_IO_ADDR 0xfee00000
3413067f81fSYoshihiro Shimoda #elif defined(CONFIG_CPU_SH7757) || \
3423067f81fSYoshihiro Shimoda defined(CONFIG_CPU_SH7752) || \
3433067f81fSYoshihiro Shimoda defined(CONFIG_CPU_SH7753)
344631fea8fSYoshihiro Shimoda #if defined(CONFIG_SH_ETHER_USE_GETHER)
345631fea8fSYoshihiro Shimoda #define SH_ETH_TYPE_GETHER
346631fea8fSYoshihiro Shimoda #define BASE_IO_ADDR 0xfee00000
347631fea8fSYoshihiro Shimoda #else
34826235093SYoshihiro Shimoda #define SH_ETH_TYPE_ETHER
349903de461SYoshihiro Shimoda #define BASE_IO_ADDR 0xfef00000
350631fea8fSYoshihiro Shimoda #endif
3513bb4cc31SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7724)
35226235093SYoshihiro Shimoda #define SH_ETH_TYPE_ETHER
3533bb4cc31SNobuhiro Iwamatsu #define BASE_IO_ADDR 0xA4600000
354dcd5a593SNobuhiro Iwamatsu #elif defined(CONFIG_R8A7740)
355dcd5a593SNobuhiro Iwamatsu #define SH_ETH_TYPE_GETHER
356dcd5a593SNobuhiro Iwamatsu #define BASE_IO_ADDR 0xE9A00000
35717243747SNobuhiro Iwamatsu #elif defined(CONFIG_R8A7790) || defined(CONFIG_R8A7791) || \
358a341b7e0SNobuhiro Iwamatsu defined(CONFIG_R8A7793) || defined(CONFIG_R8A7794)
3598707678cSNobuhiro Iwamatsu #define SH_ETH_TYPE_ETHER
3608707678cSNobuhiro Iwamatsu #define BASE_IO_ADDR 0xEE700200
36162cbddc4SNobuhiro Iwamatsu #elif defined(CONFIG_R7S72100)
36262cbddc4SNobuhiro Iwamatsu #define SH_ETH_TYPE_RZ
36362cbddc4SNobuhiro Iwamatsu #define BASE_IO_ADDR 0xE8203000
364903de461SYoshihiro Shimoda #endif
365903de461SYoshihiro Shimoda
3669751ee09SNobuhiro Iwamatsu /*
3679751ee09SNobuhiro Iwamatsu * Register's bits
3689751ee09SNobuhiro Iwamatsu * Copy from Linux driver source code
3699751ee09SNobuhiro Iwamatsu */
37062cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
3719751ee09SNobuhiro Iwamatsu /* EDSR */
3729751ee09SNobuhiro Iwamatsu enum EDSR_BIT {
3739751ee09SNobuhiro Iwamatsu EDSR_ENT = 0x01, EDSR_ENR = 0x02,
3749751ee09SNobuhiro Iwamatsu };
3759751ee09SNobuhiro Iwamatsu #define EDSR_ENALL (EDSR_ENT|EDSR_ENR)
3769751ee09SNobuhiro Iwamatsu #endif
3779751ee09SNobuhiro Iwamatsu
3789751ee09SNobuhiro Iwamatsu /* EDMR */
3799751ee09SNobuhiro Iwamatsu enum DMAC_M_BIT {
3809751ee09SNobuhiro Iwamatsu EDMR_DL1 = 0x20, EDMR_DL0 = 0x10,
38162cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
382ee6ec5d4SNobuhiro Iwamatsu EDMR_SRST = 0x03, /* Receive/Send reset */
3839751ee09SNobuhiro Iwamatsu EMDR_DESC_R = 0x30, /* Descriptor reserve size */
3849751ee09SNobuhiro Iwamatsu EDMR_EL = 0x40, /* Litte endian */
38526235093SYoshihiro Shimoda #elif defined(SH_ETH_TYPE_ETHER)
386903de461SYoshihiro Shimoda EDMR_SRST = 0x01,
387903de461SYoshihiro Shimoda EMDR_DESC_R = 0x30, /* Descriptor reserve size */
388903de461SYoshihiro Shimoda EDMR_EL = 0x40, /* Litte endian */
38926235093SYoshihiro Shimoda #else
3909751ee09SNobuhiro Iwamatsu EDMR_SRST = 0x01,
3919751ee09SNobuhiro Iwamatsu #endif
3929751ee09SNobuhiro Iwamatsu };
3939751ee09SNobuhiro Iwamatsu
394f8b7507dSNobuhiro Iwamatsu #if CONFIG_SH_ETHER_ALIGNE_SIZE == 64
395f8b7507dSNobuhiro Iwamatsu # define EMDR_DESC EDMR_DL1
396f8b7507dSNobuhiro Iwamatsu #elif CONFIG_SH_ETHER_ALIGNE_SIZE == 32
397f8b7507dSNobuhiro Iwamatsu # define EMDR_DESC EDMR_DL0
398f8b7507dSNobuhiro Iwamatsu #elif CONFIG_SH_ETHER_ALIGNE_SIZE == 16 /* Default */
399f8b7507dSNobuhiro Iwamatsu # define EMDR_DESC 0
400f8b7507dSNobuhiro Iwamatsu #endif
401f8b7507dSNobuhiro Iwamatsu
4029751ee09SNobuhiro Iwamatsu /* RFLR */
4039751ee09SNobuhiro Iwamatsu #define RFLR_RFL_MIN 0x05EE /* Recv Frame length 1518 byte */
4049751ee09SNobuhiro Iwamatsu
4059751ee09SNobuhiro Iwamatsu /* EDTRR */
4069751ee09SNobuhiro Iwamatsu enum DMAC_T_BIT {
40762cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
4089751ee09SNobuhiro Iwamatsu EDTRR_TRNS = 0x03,
4099751ee09SNobuhiro Iwamatsu #else
4109751ee09SNobuhiro Iwamatsu EDTRR_TRNS = 0x01,
4119751ee09SNobuhiro Iwamatsu #endif
4129751ee09SNobuhiro Iwamatsu };
4139751ee09SNobuhiro Iwamatsu
4149751ee09SNobuhiro Iwamatsu /* GECMR */
4159751ee09SNobuhiro Iwamatsu enum GECMR_BIT {
4163067f81fSYoshihiro Shimoda #if defined(CONFIG_CPU_SH7757) || \
4173067f81fSYoshihiro Shimoda defined(CONFIG_CPU_SH7752) || \
4183067f81fSYoshihiro Shimoda defined(CONFIG_CPU_SH7753)
419631fea8fSYoshihiro Shimoda GECMR_1000B = 0x20, GECMR_100B = 0x01, GECMR_10B = 0x00,
420631fea8fSYoshihiro Shimoda #else
42109fcc8b5SSimon Munton GECMR_1000B = 0x01, GECMR_100B = 0x04, GECMR_10B = 0x00,
422631fea8fSYoshihiro Shimoda #endif
4239751ee09SNobuhiro Iwamatsu };
4249751ee09SNobuhiro Iwamatsu
4259751ee09SNobuhiro Iwamatsu /* EDRRR*/
4269751ee09SNobuhiro Iwamatsu enum EDRRR_R_BIT {
4279751ee09SNobuhiro Iwamatsu EDRRR_R = 0x01,
4289751ee09SNobuhiro Iwamatsu };
4299751ee09SNobuhiro Iwamatsu
4309751ee09SNobuhiro Iwamatsu /* TPAUSER */
4319751ee09SNobuhiro Iwamatsu enum TPAUSER_BIT {
4329751ee09SNobuhiro Iwamatsu TPAUSER_TPAUSE = 0x0000ffff,
4339751ee09SNobuhiro Iwamatsu TPAUSER_UNLIMITED = 0,
4349751ee09SNobuhiro Iwamatsu };
4359751ee09SNobuhiro Iwamatsu
4369751ee09SNobuhiro Iwamatsu /* BCFR */
4379751ee09SNobuhiro Iwamatsu enum BCFR_BIT {
4389751ee09SNobuhiro Iwamatsu BCFR_RPAUSE = 0x0000ffff,
4399751ee09SNobuhiro Iwamatsu BCFR_UNLIMITED = 0,
4409751ee09SNobuhiro Iwamatsu };
4419751ee09SNobuhiro Iwamatsu
4429751ee09SNobuhiro Iwamatsu /* PIR */
4439751ee09SNobuhiro Iwamatsu enum PIR_BIT {
4449751ee09SNobuhiro Iwamatsu PIR_MDI = 0x08, PIR_MDO = 0x04, PIR_MMD = 0x02, PIR_MDC = 0x01,
4459751ee09SNobuhiro Iwamatsu };
4469751ee09SNobuhiro Iwamatsu
4479751ee09SNobuhiro Iwamatsu /* PSR */
4489751ee09SNobuhiro Iwamatsu enum PHY_STATUS_BIT { PHY_ST_LINK = 0x01, };
4499751ee09SNobuhiro Iwamatsu
4509751ee09SNobuhiro Iwamatsu /* EESR */
4519751ee09SNobuhiro Iwamatsu enum EESR_BIT {
45226235093SYoshihiro Shimoda #if defined(SH_ETH_TYPE_ETHER)
4539751ee09SNobuhiro Iwamatsu EESR_TWB = 0x40000000,
4549751ee09SNobuhiro Iwamatsu #else
4559751ee09SNobuhiro Iwamatsu EESR_TWB = 0xC0000000,
4569751ee09SNobuhiro Iwamatsu EESR_TC1 = 0x20000000,
4579751ee09SNobuhiro Iwamatsu EESR_TUC = 0x10000000,
4589751ee09SNobuhiro Iwamatsu EESR_ROC = 0x80000000,
4599751ee09SNobuhiro Iwamatsu #endif
4609751ee09SNobuhiro Iwamatsu EESR_TABT = 0x04000000,
4619751ee09SNobuhiro Iwamatsu EESR_RABT = 0x02000000, EESR_RFRMER = 0x01000000,
46226235093SYoshihiro Shimoda #if defined(SH_ETH_TYPE_ETHER)
4639751ee09SNobuhiro Iwamatsu EESR_ADE = 0x00800000,
4649751ee09SNobuhiro Iwamatsu #endif
4659751ee09SNobuhiro Iwamatsu EESR_ECI = 0x00400000,
4669751ee09SNobuhiro Iwamatsu EESR_FTC = 0x00200000, EESR_TDE = 0x00100000,
4679751ee09SNobuhiro Iwamatsu EESR_TFE = 0x00080000, EESR_FRC = 0x00040000,
4689751ee09SNobuhiro Iwamatsu EESR_RDE = 0x00020000, EESR_RFE = 0x00010000,
46926235093SYoshihiro Shimoda #if defined(SH_ETH_TYPE_ETHER)
4709751ee09SNobuhiro Iwamatsu EESR_CND = 0x00000800,
4719751ee09SNobuhiro Iwamatsu #endif
4729751ee09SNobuhiro Iwamatsu EESR_DLC = 0x00000400,
4739751ee09SNobuhiro Iwamatsu EESR_CD = 0x00000200, EESR_RTO = 0x00000100,
4749751ee09SNobuhiro Iwamatsu EESR_RMAF = 0x00000080, EESR_CEEF = 0x00000040,
4759751ee09SNobuhiro Iwamatsu EESR_CELF = 0x00000020, EESR_RRF = 0x00000010,
4761dbd7280SNobuhiro Iwamatsu EESR_RTLF = 0x00000008, EESR_RTSF = 0x00000004,
4779751ee09SNobuhiro Iwamatsu EESR_PRE = 0x00000002, EESR_CERF = 0x00000001,
4789751ee09SNobuhiro Iwamatsu };
4799751ee09SNobuhiro Iwamatsu
4809751ee09SNobuhiro Iwamatsu
48162cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
4829751ee09SNobuhiro Iwamatsu # define TX_CHECK (EESR_TC1 | EESR_FTC)
4839751ee09SNobuhiro Iwamatsu # define EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE \
4849751ee09SNobuhiro Iwamatsu | EESR_RFRMER | EESR_TFE | EESR_TDE | EESR_ECI)
4859751ee09SNobuhiro Iwamatsu # define TX_ERROR_CEHCK (EESR_TWB | EESR_TABT | EESR_TDE | EESR_TFE)
4869751ee09SNobuhiro Iwamatsu
4879751ee09SNobuhiro Iwamatsu #else
4889751ee09SNobuhiro Iwamatsu # define TX_CHECK (EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | EESR_RTO)
4899751ee09SNobuhiro Iwamatsu # define EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE \
4909751ee09SNobuhiro Iwamatsu | EESR_RFRMER | EESR_ADE | EESR_TFE | EESR_TDE | EESR_ECI)
4919751ee09SNobuhiro Iwamatsu # define TX_ERROR_CEHCK (EESR_TWB | EESR_TABT | EESR_ADE | EESR_TDE | EESR_TFE)
4929751ee09SNobuhiro Iwamatsu #endif
4939751ee09SNobuhiro Iwamatsu
4949751ee09SNobuhiro Iwamatsu /* EESIPR */
4959751ee09SNobuhiro Iwamatsu enum DMAC_IM_BIT {
4969751ee09SNobuhiro Iwamatsu DMAC_M_TWB = 0x40000000, DMAC_M_TABT = 0x04000000,
4979751ee09SNobuhiro Iwamatsu DMAC_M_RABT = 0x02000000,
4989751ee09SNobuhiro Iwamatsu DMAC_M_RFRMER = 0x01000000, DMAC_M_ADF = 0x00800000,
4999751ee09SNobuhiro Iwamatsu DMAC_M_ECI = 0x00400000, DMAC_M_FTC = 0x00200000,
5009751ee09SNobuhiro Iwamatsu DMAC_M_TDE = 0x00100000, DMAC_M_TFE = 0x00080000,
5019751ee09SNobuhiro Iwamatsu DMAC_M_FRC = 0x00040000, DMAC_M_RDE = 0x00020000,
5029751ee09SNobuhiro Iwamatsu DMAC_M_RFE = 0x00010000, DMAC_M_TINT4 = 0x00000800,
5039751ee09SNobuhiro Iwamatsu DMAC_M_TINT3 = 0x00000400, DMAC_M_TINT2 = 0x00000200,
5049751ee09SNobuhiro Iwamatsu DMAC_M_TINT1 = 0x00000100, DMAC_M_RINT8 = 0x00000080,
5059751ee09SNobuhiro Iwamatsu DMAC_M_RINT5 = 0x00000010, DMAC_M_RINT4 = 0x00000008,
5069751ee09SNobuhiro Iwamatsu DMAC_M_RINT3 = 0x00000004, DMAC_M_RINT2 = 0x00000002,
5079751ee09SNobuhiro Iwamatsu DMAC_M_RINT1 = 0x00000001,
5089751ee09SNobuhiro Iwamatsu };
5099751ee09SNobuhiro Iwamatsu
5109751ee09SNobuhiro Iwamatsu /* Receive descriptor bit */
5119751ee09SNobuhiro Iwamatsu enum RD_STS_BIT {
5129751ee09SNobuhiro Iwamatsu RD_RACT = 0x80000000, RD_RDLE = 0x40000000,
5139751ee09SNobuhiro Iwamatsu RD_RFP1 = 0x20000000, RD_RFP0 = 0x10000000,
5149751ee09SNobuhiro Iwamatsu RD_RFE = 0x08000000, RD_RFS10 = 0x00000200,
5159751ee09SNobuhiro Iwamatsu RD_RFS9 = 0x00000100, RD_RFS8 = 0x00000080,
5169751ee09SNobuhiro Iwamatsu RD_RFS7 = 0x00000040, RD_RFS6 = 0x00000020,
5179751ee09SNobuhiro Iwamatsu RD_RFS5 = 0x00000010, RD_RFS4 = 0x00000008,
5189751ee09SNobuhiro Iwamatsu RD_RFS3 = 0x00000004, RD_RFS2 = 0x00000002,
5199751ee09SNobuhiro Iwamatsu RD_RFS1 = 0x00000001,
5209751ee09SNobuhiro Iwamatsu };
5219751ee09SNobuhiro Iwamatsu #define RDF1ST RD_RFP1
5229751ee09SNobuhiro Iwamatsu #define RDFEND RD_RFP0
5239751ee09SNobuhiro Iwamatsu #define RD_RFP (RD_RFP1|RD_RFP0)
5249751ee09SNobuhiro Iwamatsu
5259751ee09SNobuhiro Iwamatsu /* RDFFR*/
5269751ee09SNobuhiro Iwamatsu enum RDFFR_BIT {
5279751ee09SNobuhiro Iwamatsu RDFFR_RDLF = 0x01,
5289751ee09SNobuhiro Iwamatsu };
5299751ee09SNobuhiro Iwamatsu
5309751ee09SNobuhiro Iwamatsu /* FCFTR */
5319751ee09SNobuhiro Iwamatsu enum FCFTR_BIT {
5329751ee09SNobuhiro Iwamatsu FCFTR_RFF2 = 0x00040000, FCFTR_RFF1 = 0x00020000,
5339751ee09SNobuhiro Iwamatsu FCFTR_RFF0 = 0x00010000, FCFTR_RFD2 = 0x00000004,
5349751ee09SNobuhiro Iwamatsu FCFTR_RFD1 = 0x00000002, FCFTR_RFD0 = 0x00000001,
5359751ee09SNobuhiro Iwamatsu };
5369751ee09SNobuhiro Iwamatsu #define FIFO_F_D_RFF (FCFTR_RFF2|FCFTR_RFF1|FCFTR_RFF0)
5379751ee09SNobuhiro Iwamatsu #define FIFO_F_D_RFD (FCFTR_RFD2|FCFTR_RFD1|FCFTR_RFD0)
5389751ee09SNobuhiro Iwamatsu
5399751ee09SNobuhiro Iwamatsu /* Transfer descriptor bit */
5409751ee09SNobuhiro Iwamatsu enum TD_STS_BIT {
54162cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_ETHER) || \
54262cbddc4SNobuhiro Iwamatsu defined(SH_ETH_TYPE_RZ)
5439751ee09SNobuhiro Iwamatsu TD_TACT = 0x80000000,
5449751ee09SNobuhiro Iwamatsu #else
5459751ee09SNobuhiro Iwamatsu TD_TACT = 0x7fffffff,
5469751ee09SNobuhiro Iwamatsu #endif
5479751ee09SNobuhiro Iwamatsu TD_TDLE = 0x40000000, TD_TFP1 = 0x20000000,
5489751ee09SNobuhiro Iwamatsu TD_TFP0 = 0x10000000,
5499751ee09SNobuhiro Iwamatsu };
5509751ee09SNobuhiro Iwamatsu #define TDF1ST TD_TFP1
5519751ee09SNobuhiro Iwamatsu #define TDFEND TD_TFP0
5529751ee09SNobuhiro Iwamatsu #define TD_TFP (TD_TFP1|TD_TFP0)
5539751ee09SNobuhiro Iwamatsu
5549751ee09SNobuhiro Iwamatsu /* RMCR */
5559751ee09SNobuhiro Iwamatsu enum RECV_RST_BIT { RMCR_RST = 0x01, };
5569751ee09SNobuhiro Iwamatsu /* ECMR */
5579751ee09SNobuhiro Iwamatsu enum FELIC_MODE_BIT {
55862cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
559e2752db0SNobuhiro Iwamatsu ECMR_TRCCM = 0x04000000, ECMR_RCSC = 0x00800000,
560e2752db0SNobuhiro Iwamatsu ECMR_DPAD = 0x00200000, ECMR_RZPF = 0x00100000,
5619751ee09SNobuhiro Iwamatsu #endif
5629751ee09SNobuhiro Iwamatsu ECMR_ZPF = 0x00080000, ECMR_PFR = 0x00040000, ECMR_RXF = 0x00020000,
5639751ee09SNobuhiro Iwamatsu ECMR_TXF = 0x00010000, ECMR_MCT = 0x00002000, ECMR_PRCEF = 0x00001000,
5649751ee09SNobuhiro Iwamatsu ECMR_PMDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020,
5659751ee09SNobuhiro Iwamatsu ECMR_ILB = 0x00000008, ECMR_ELB = 0x00000004, ECMR_DM = 0x00000002,
5669751ee09SNobuhiro Iwamatsu ECMR_PRM = 0x00000001,
5673bb4cc31SNobuhiro Iwamatsu #ifdef CONFIG_CPU_SH7724
5683bb4cc31SNobuhiro Iwamatsu ECMR_RTM = 0x00000010,
56917243747SNobuhiro Iwamatsu #elif defined(CONFIG_R8A7790) || defined(CONFIG_R8A7791) || \
570a341b7e0SNobuhiro Iwamatsu defined(CONFIG_R8A7793) || defined(CONFIG_R8A7794)
5718707678cSNobuhiro Iwamatsu ECMR_RTM = 0x00000004,
5723bb4cc31SNobuhiro Iwamatsu #endif
5733bb4cc31SNobuhiro Iwamatsu
5749751ee09SNobuhiro Iwamatsu };
5759751ee09SNobuhiro Iwamatsu
57662cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
577e2752db0SNobuhiro Iwamatsu #define ECMR_CHG_DM (ECMR_TRCCM | ECMR_RZPF | ECMR_ZPF | ECMR_PFR | \
578e2752db0SNobuhiro Iwamatsu ECMR_RXF | ECMR_TXF | ECMR_MCT)
57926235093SYoshihiro Shimoda #elif defined(SH_ETH_TYPE_ETHER)
5803bb4cc31SNobuhiro Iwamatsu #define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF)
5819751ee09SNobuhiro Iwamatsu #else
582903de461SYoshihiro Shimoda #define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF | ECMR_MCT)
5839751ee09SNobuhiro Iwamatsu #endif
5849751ee09SNobuhiro Iwamatsu
5859751ee09SNobuhiro Iwamatsu /* ECSR */
5869751ee09SNobuhiro Iwamatsu enum ECSR_STATUS_BIT {
58726235093SYoshihiro Shimoda #if defined(SH_ETH_TYPE_ETHER)
5889751ee09SNobuhiro Iwamatsu ECSR_BRCRX = 0x20, ECSR_PSRTO = 0x10,
5899751ee09SNobuhiro Iwamatsu #endif
5909751ee09SNobuhiro Iwamatsu ECSR_LCHNG = 0x04,
5919751ee09SNobuhiro Iwamatsu ECSR_MPD = 0x02, ECSR_ICD = 0x01,
5929751ee09SNobuhiro Iwamatsu };
5939751ee09SNobuhiro Iwamatsu
59462cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
5959751ee09SNobuhiro Iwamatsu # define ECSR_INIT (ECSR_ICD | ECSIPR_MPDIP)
5969751ee09SNobuhiro Iwamatsu #else
5979751ee09SNobuhiro Iwamatsu # define ECSR_INIT (ECSR_BRCRX | ECSR_PSRTO | \
5989751ee09SNobuhiro Iwamatsu ECSR_LCHNG | ECSR_ICD | ECSIPR_MPDIP)
5999751ee09SNobuhiro Iwamatsu #endif
6009751ee09SNobuhiro Iwamatsu
6019751ee09SNobuhiro Iwamatsu /* ECSIPR */
6029751ee09SNobuhiro Iwamatsu enum ECSIPR_STATUS_MASK_BIT {
60326235093SYoshihiro Shimoda #if defined(SH_ETH_TYPE_ETHER)
604a6616efbSNobuhiro Iwamatsu ECSIPR_BRCRXIP = 0x20,
605ee6ec5d4SNobuhiro Iwamatsu ECSIPR_PSRTOIP = 0x10,
60626235093SYoshihiro Shimoda #elif defined(SH_ETY_TYPE_GETHER)
607ee6ec5d4SNobuhiro Iwamatsu ECSIPR_PSRTOIP = 0x10,
608ee6ec5d4SNobuhiro Iwamatsu ECSIPR_PHYIP = 0x08,
609a6616efbSNobuhiro Iwamatsu #endif
610ee6ec5d4SNobuhiro Iwamatsu ECSIPR_LCHNGIP = 0x04,
611ee6ec5d4SNobuhiro Iwamatsu ECSIPR_MPDIP = 0x02,
612ee6ec5d4SNobuhiro Iwamatsu ECSIPR_ICDIP = 0x01,
6139751ee09SNobuhiro Iwamatsu };
6149751ee09SNobuhiro Iwamatsu
61562cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
6169751ee09SNobuhiro Iwamatsu # define ECSIPR_INIT (ECSIPR_LCHNGIP | ECSIPR_ICDIP | ECSIPR_MPDIP)
6179751ee09SNobuhiro Iwamatsu #else
6189751ee09SNobuhiro Iwamatsu # define ECSIPR_INIT (ECSIPR_BRCRXIP | ECSIPR_PSRTOIP | ECSIPR_LCHNGIP | \
6199751ee09SNobuhiro Iwamatsu ECSIPR_ICDIP | ECSIPR_MPDIP)
6209751ee09SNobuhiro Iwamatsu #endif
6219751ee09SNobuhiro Iwamatsu
6229751ee09SNobuhiro Iwamatsu /* APR */
6239751ee09SNobuhiro Iwamatsu enum APR_BIT {
6249751ee09SNobuhiro Iwamatsu APR_AP = 0x00000004,
6259751ee09SNobuhiro Iwamatsu };
6269751ee09SNobuhiro Iwamatsu
6279751ee09SNobuhiro Iwamatsu /* MPR */
6289751ee09SNobuhiro Iwamatsu enum MPR_BIT {
6299751ee09SNobuhiro Iwamatsu MPR_MP = 0x00000006,
6309751ee09SNobuhiro Iwamatsu };
6319751ee09SNobuhiro Iwamatsu
6329751ee09SNobuhiro Iwamatsu /* TRSCER */
6339751ee09SNobuhiro Iwamatsu enum DESC_I_BIT {
6349751ee09SNobuhiro Iwamatsu DESC_I_TINT4 = 0x0800, DESC_I_TINT3 = 0x0400, DESC_I_TINT2 = 0x0200,
6359751ee09SNobuhiro Iwamatsu DESC_I_TINT1 = 0x0100, DESC_I_RINT8 = 0x0080, DESC_I_RINT5 = 0x0010,
6369751ee09SNobuhiro Iwamatsu DESC_I_RINT4 = 0x0008, DESC_I_RINT3 = 0x0004, DESC_I_RINT2 = 0x0002,
6379751ee09SNobuhiro Iwamatsu DESC_I_RINT1 = 0x0001,
6389751ee09SNobuhiro Iwamatsu };
6399751ee09SNobuhiro Iwamatsu
6409751ee09SNobuhiro Iwamatsu /* RPADIR */
6419751ee09SNobuhiro Iwamatsu enum RPADIR_BIT {
6429751ee09SNobuhiro Iwamatsu RPADIR_PADS1 = 0x20000, RPADIR_PADS0 = 0x10000,
6439751ee09SNobuhiro Iwamatsu RPADIR_PADR = 0x0003f,
6449751ee09SNobuhiro Iwamatsu };
6459751ee09SNobuhiro Iwamatsu
64662cbddc4SNobuhiro Iwamatsu #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
6479751ee09SNobuhiro Iwamatsu # define RPADIR_INIT (0x00)
6489751ee09SNobuhiro Iwamatsu #else
6499751ee09SNobuhiro Iwamatsu # define RPADIR_INIT (RPADIR_PADS1)
6509751ee09SNobuhiro Iwamatsu #endif
6519751ee09SNobuhiro Iwamatsu
6529751ee09SNobuhiro Iwamatsu /* FDR */
6539751ee09SNobuhiro Iwamatsu enum FIFO_SIZE_BIT {
6549751ee09SNobuhiro Iwamatsu FIFO_SIZE_T = 0x00000700, FIFO_SIZE_R = 0x00000007,
6559751ee09SNobuhiro Iwamatsu };
65649afb8caSYoshihiro Shimoda
sh_eth_reg_addr(struct sh_eth_dev * eth,int enum_index)65749afb8caSYoshihiro Shimoda static inline unsigned long sh_eth_reg_addr(struct sh_eth_dev *eth,
65849afb8caSYoshihiro Shimoda int enum_index)
65949afb8caSYoshihiro Shimoda {
66049afb8caSYoshihiro Shimoda #if defined(SH_ETH_TYPE_GETHER)
66149afb8caSYoshihiro Shimoda const u16 *reg_offset = sh_eth_offset_gigabit;
66249afb8caSYoshihiro Shimoda #elif defined(SH_ETH_TYPE_ETHER)
66349afb8caSYoshihiro Shimoda const u16 *reg_offset = sh_eth_offset_fast_sh4;
66462cbddc4SNobuhiro Iwamatsu #elif defined(SH_ETH_TYPE_RZ)
66562cbddc4SNobuhiro Iwamatsu const u16 *reg_offset = sh_eth_offset_rz;
66649afb8caSYoshihiro Shimoda #else
66749afb8caSYoshihiro Shimoda #error
66849afb8caSYoshihiro Shimoda #endif
66949afb8caSYoshihiro Shimoda return BASE_IO_ADDR + reg_offset[enum_index] + 0x800 * eth->port;
67049afb8caSYoshihiro Shimoda }
67149afb8caSYoshihiro Shimoda
sh_eth_write(struct sh_eth_dev * eth,unsigned long data,int enum_index)67249afb8caSYoshihiro Shimoda static inline void sh_eth_write(struct sh_eth_dev *eth, unsigned long data,
67349afb8caSYoshihiro Shimoda int enum_index)
67449afb8caSYoshihiro Shimoda {
67549afb8caSYoshihiro Shimoda outl(data, sh_eth_reg_addr(eth, enum_index));
67649afb8caSYoshihiro Shimoda }
67749afb8caSYoshihiro Shimoda
sh_eth_read(struct sh_eth_dev * eth,int enum_index)67849afb8caSYoshihiro Shimoda static inline unsigned long sh_eth_read(struct sh_eth_dev *eth,
67949afb8caSYoshihiro Shimoda int enum_index)
68049afb8caSYoshihiro Shimoda {
68149afb8caSYoshihiro Shimoda return inl(sh_eth_reg_addr(eth, enum_index));
68249afb8caSYoshihiro Shimoda }
683