root/drivers/net/ethernet/renesas/rswitch.h
/* SPDX-License-Identifier: GPL-2.0 */
/* Renesas Ethernet Switch device driver
 *
 * Copyright (C) 2022-2025 Renesas Electronics Corporation
 */

#ifndef __RSWITCH_H__
#define __RSWITCH_H__

#include <linux/platform_device.h>
#include <linux/phy.h>

#include "rcar_gen4_ptp.h"

#define RSWITCH_MAX_NUM_QUEUES  128

#define RSWITCH_NUM_AGENTS      5
#define RSWITCH_NUM_PORTS       3

#define rswitch_for_all_ports(_priv, _rdev)                     \
        list_for_each_entry(_rdev, &_priv->port_list, list)

#define rswitch_for_each_enabled_port(priv, i)          \
        for (i = 0; i < RSWITCH_NUM_PORTS; i++)         \
                if (priv->rdev[i]->disabled)            \
                        continue;                       \
                else

#define rswitch_for_each_enabled_port_continue_reverse(priv, i) \
        for (; i-- > 0; )                                       \
                if (priv->rdev[i]->disabled)                    \
                        continue;                               \
                else

#define TX_RING_SIZE            1024
#define RX_RING_SIZE            4096
#define TS_RING_SIZE            (TX_RING_SIZE * RSWITCH_NUM_PORTS)

#define RSWITCH_MAX_MTU         9600
#define RSWITCH_HEADROOM        (NET_SKB_PAD + NET_IP_ALIGN)
#define RSWITCH_DESC_BUF_SIZE   2048
#define RSWITCH_TAILROOM        SKB_DATA_ALIGN(sizeof(struct skb_shared_info))
#define RSWITCH_ALIGN           128
#define RSWITCH_BUF_SIZE        (RSWITCH_HEADROOM + RSWITCH_DESC_BUF_SIZE + \
                                 RSWITCH_TAILROOM + RSWITCH_ALIGN)
#define RSWITCH_MAP_BUF_SIZE    (RSWITCH_BUF_SIZE - RSWITCH_HEADROOM)
#define RSWITCH_MAX_CTAG_PCP    7

#define RSWITCH_TIMEOUT_US      100000

#define RSWITCH_TOP_OFFSET      0x00008000
#define RSWITCH_COMA_OFFSET     0x00009000
#define RSWITCH_ETHA_OFFSET     0x0000a000      /* with RMAC */
#define RSWITCH_ETHA_SIZE       0x00002000      /* with RMAC */
#define RSWITCH_GWCA0_OFFSET    0x00010000
#define RSWITCH_GWCA1_OFFSET    0x00012000

/* TODO: hardcoded ETHA/GWCA settings for now */
#define GWCA_IRQ_RESOURCE_NAME  "gwca0_rxtx%d"
#define GWCA_IRQ_NAME           "rswitch: gwca0_rxtx%d"
#define GWCA_NUM_IRQS           8
#define GWCA_INDEX              0
#define AGENT_INDEX_GWCA        3
#define GWCA_IPV_NUM            0
#define GWRO                    RSWITCH_GWCA0_OFFSET

#define GWCA_TS_IRQ_RESOURCE_NAME       "gwca0_rxts0"
#define GWCA_TS_IRQ_NAME                "rswitch: gwca0_rxts0"
#define GWCA_TS_IRQ_BIT                 BIT(0)

#define FWRO    0
#define TPRO    RSWITCH_TOP_OFFSET
#define CARO    RSWITCH_COMA_OFFSET
#define TARO    0
#define RMRO    0x1000
enum rswitch_reg {
        FWGC            = FWRO + 0x0000,
        FWTTC0          = FWRO + 0x0010,
        FWTTC1          = FWRO + 0x0014,
        FWLBMC          = FWRO + 0x0018,
        FWCEPTC         = FWRO + 0x0020,
        FWCEPRC0        = FWRO + 0x0024,
        FWCEPRC1        = FWRO + 0x0028,
        FWCEPRC2        = FWRO + 0x002c,
        FWCLPTC         = FWRO + 0x0030,
        FWCLPRC         = FWRO + 0x0034,
        FWCMPTC         = FWRO + 0x0040,
        FWEMPTC         = FWRO + 0x0044,
        FWSDMPTC        = FWRO + 0x0050,
        FWSDMPVC        = FWRO + 0x0054,
        FWLBWMC0        = FWRO + 0x0080,
        FWPC00          = FWRO + 0x0100,
        FWPC10          = FWRO + 0x0104,
        FWPC20          = FWRO + 0x0108,
        FWCTGC00        = FWRO + 0x0400,
        FWCTGC10        = FWRO + 0x0404,
        FWCTTC00        = FWRO + 0x0408,
        FWCTTC10        = FWRO + 0x040c,
        FWCTTC200       = FWRO + 0x0410,
        FWCTSC00        = FWRO + 0x0420,
        FWCTSC10        = FWRO + 0x0424,
        FWCTSC20        = FWRO + 0x0428,
        FWCTSC30        = FWRO + 0x042c,
        FWCTSC40        = FWRO + 0x0430,
        FWTWBFC0        = FWRO + 0x1000,
        FWTWBFVC0       = FWRO + 0x1004,
        FWTHBFC0        = FWRO + 0x1400,
        FWTHBFV0C0      = FWRO + 0x1404,
        FWTHBFV1C0      = FWRO + 0x1408,
        FWFOBFC0        = FWRO + 0x1800,
        FWFOBFV0C0      = FWRO + 0x1804,
        FWFOBFV1C0      = FWRO + 0x1808,
        FWRFC0          = FWRO + 0x1c00,
        FWRFVC0         = FWRO + 0x1c04,
        FWCFC0          = FWRO + 0x2000,
        FWCFMC00        = FWRO + 0x2004,
        FWIP4SC         = FWRO + 0x4008,
        FWIP6SC         = FWRO + 0x4018,
        FWIP6OC         = FWRO + 0x401c,
        FWL2SC          = FWRO + 0x4020,
        FWSFHEC         = FWRO + 0x4030,
        FWSHCR0         = FWRO + 0x4040,
        FWSHCR1         = FWRO + 0x4044,
        FWSHCR2         = FWRO + 0x4048,
        FWSHCR3         = FWRO + 0x404c,
        FWSHCR4         = FWRO + 0x4050,
        FWSHCR5         = FWRO + 0x4054,
        FWSHCR6         = FWRO + 0x4058,
        FWSHCR7         = FWRO + 0x405c,
        FWSHCR8         = FWRO + 0x4060,
        FWSHCR9         = FWRO + 0x4064,
        FWSHCR10        = FWRO + 0x4068,
        FWSHCR11        = FWRO + 0x406c,
        FWSHCR12        = FWRO + 0x4070,
        FWSHCR13        = FWRO + 0x4074,
        FWSHCRR         = FWRO + 0x4078,
        FWLTHHEC        = FWRO + 0x4090,
        FWLTHHC         = FWRO + 0x4094,
        FWLTHTL0        = FWRO + 0x40a0,
        FWLTHTL1        = FWRO + 0x40a4,
        FWLTHTL2        = FWRO + 0x40a8,
        FWLTHTL3        = FWRO + 0x40ac,
        FWLTHTL4        = FWRO + 0x40b0,
        FWLTHTL5        = FWRO + 0x40b4,
        FWLTHTL6        = FWRO + 0x40b8,
        FWLTHTL7        = FWRO + 0x40bc,
        FWLTHTL80       = FWRO + 0x40c0,
        FWLTHTL9        = FWRO + 0x40d0,
        FWLTHTLR        = FWRO + 0x40d4,
        FWLTHTIM        = FWRO + 0x40e0,
        FWLTHTEM        = FWRO + 0x40e4,
        FWLTHTS0        = FWRO + 0x4100,
        FWLTHTS1        = FWRO + 0x4104,
        FWLTHTS2        = FWRO + 0x4108,
        FWLTHTS3        = FWRO + 0x410c,
        FWLTHTS4        = FWRO + 0x4110,
        FWLTHTSR0       = FWRO + 0x4120,
        FWLTHTSR1       = FWRO + 0x4124,
        FWLTHTSR2       = FWRO + 0x4128,
        FWLTHTSR3       = FWRO + 0x412c,
        FWLTHTSR40      = FWRO + 0x4130,
        FWLTHTSR5       = FWRO + 0x4140,
        FWLTHTR         = FWRO + 0x4150,
        FWLTHTRR0       = FWRO + 0x4154,
        FWLTHTRR1       = FWRO + 0x4158,
        FWLTHTRR2       = FWRO + 0x415c,
        FWLTHTRR3       = FWRO + 0x4160,
        FWLTHTRR4       = FWRO + 0x4164,
        FWLTHTRR5       = FWRO + 0x4168,
        FWLTHTRR6       = FWRO + 0x416c,
        FWLTHTRR7       = FWRO + 0x4170,
        FWLTHTRR8       = FWRO + 0x4174,
        FWLTHTRR9       = FWRO + 0x4180,
        FWLTHTRR10      = FWRO + 0x4190,
        FWIPHEC         = FWRO + 0x4214,
        FWIPHC          = FWRO + 0x4218,
        FWIPTL0         = FWRO + 0x4220,
        FWIPTL1         = FWRO + 0x4224,
        FWIPTL2         = FWRO + 0x4228,
        FWIPTL3         = FWRO + 0x422c,
        FWIPTL4         = FWRO + 0x4230,
        FWIPTL5         = FWRO + 0x4234,
        FWIPTL6         = FWRO + 0x4238,
        FWIPTL7         = FWRO + 0x4240,
        FWIPTL8         = FWRO + 0x4250,
        FWIPTLR         = FWRO + 0x4254,
        FWIPTIM         = FWRO + 0x4260,
        FWIPTEM         = FWRO + 0x4264,
        FWIPTS0         = FWRO + 0x4270,
        FWIPTS1         = FWRO + 0x4274,
        FWIPTS2         = FWRO + 0x4278,
        FWIPTS3         = FWRO + 0x427c,
        FWIPTS4         = FWRO + 0x4280,
        FWIPTSR0        = FWRO + 0x4284,
        FWIPTSR1        = FWRO + 0x4288,
        FWIPTSR2        = FWRO + 0x428c,
        FWIPTSR3        = FWRO + 0x4290,
        FWIPTSR4        = FWRO + 0x42a0,
        FWIPTR          = FWRO + 0x42b0,
        FWIPTRR0        = FWRO + 0x42b4,
        FWIPTRR1        = FWRO + 0x42b8,
        FWIPTRR2        = FWRO + 0x42bc,
        FWIPTRR3        = FWRO + 0x42c0,
        FWIPTRR4        = FWRO + 0x42c4,
        FWIPTRR5        = FWRO + 0x42c8,
        FWIPTRR6        = FWRO + 0x42cc,
        FWIPTRR7        = FWRO + 0x42d0,
        FWIPTRR8        = FWRO + 0x42e0,
        FWIPTRR9        = FWRO + 0x42f0,
        FWIPHLEC        = FWRO + 0x4300,
        FWIPAGUSPC      = FWRO + 0x4500,
        FWIPAGC         = FWRO + 0x4504,
        FWIPAGM0        = FWRO + 0x4510,
        FWIPAGM1        = FWRO + 0x4514,
        FWIPAGM2        = FWRO + 0x4518,
        FWIPAGM3        = FWRO + 0x451c,
        FWIPAGM4        = FWRO + 0x4520,
        FWMACHEC        = FWRO + 0x4620,
        FWMACHC         = FWRO + 0x4624,
        FWMACTL0        = FWRO + 0x4630,
        FWMACTL1        = FWRO + 0x4634,
        FWMACTL2        = FWRO + 0x4638,
        FWMACTL3        = FWRO + 0x463c,
        FWMACTL4        = FWRO + 0x4640,
        FWMACTL5        = FWRO + 0x4650,
        FWMACTLR        = FWRO + 0x4654,
        FWMACTIM        = FWRO + 0x4660,
        FWMACTEM        = FWRO + 0x4664,
        FWMACTS0        = FWRO + 0x4670,
        FWMACTS1        = FWRO + 0x4674,
        FWMACTSR0       = FWRO + 0x4678,
        FWMACTSR1       = FWRO + 0x467c,
        FWMACTSR2       = FWRO + 0x4680,
        FWMACTSR3       = FWRO + 0x4690,
        FWMACTR         = FWRO + 0x46a0,
        FWMACTRR0       = FWRO + 0x46a4,
        FWMACTRR1       = FWRO + 0x46a8,
        FWMACTRR2       = FWRO + 0x46ac,
        FWMACTRR3       = FWRO + 0x46b0,
        FWMACTRR4       = FWRO + 0x46b4,
        FWMACTRR5       = FWRO + 0x46c0,
        FWMACTRR6       = FWRO + 0x46d0,
        FWMACHLEC       = FWRO + 0x4700,
        FWMACAGUSPC     = FWRO + 0x4880,
        FWMACAGC        = FWRO + 0x4884,
        FWMACAGM0       = FWRO + 0x4888,
        FWMACAGM1       = FWRO + 0x488c,
        FWVLANTEC       = FWRO + 0x4900,
        FWVLANTL0       = FWRO + 0x4910,
        FWVLANTL1       = FWRO + 0x4914,
        FWVLANTL2       = FWRO + 0x4918,
        FWVLANTL3       = FWRO + 0x4920,
        FWVLANTL4       = FWRO + 0x4930,
        FWVLANTLR       = FWRO + 0x4934,
        FWVLANTIM       = FWRO + 0x4940,
        FWVLANTEM       = FWRO + 0x4944,
        FWVLANTS        = FWRO + 0x4950,
        FWVLANTSR0      = FWRO + 0x4954,
        FWVLANTSR1      = FWRO + 0x4958,
        FWVLANTSR2      = FWRO + 0x4960,
        FWVLANTSR3      = FWRO + 0x4970,
        FWPBFC0         = FWRO + 0x4a00,
        FWPBFCSDC00     = FWRO + 0x4a04,
        FWL23URL0       = FWRO + 0x4e00,
        FWL23URL1       = FWRO + 0x4e04,
        FWL23URL2       = FWRO + 0x4e08,
        FWL23URL3       = FWRO + 0x4e0c,
        FWL23URLR       = FWRO + 0x4e10,
        FWL23UTIM       = FWRO + 0x4e20,
        FWL23URR        = FWRO + 0x4e30,
        FWL23URRR0      = FWRO + 0x4e34,
        FWL23URRR1      = FWRO + 0x4e38,
        FWL23URRR2      = FWRO + 0x4e3c,
        FWL23URRR3      = FWRO + 0x4e40,
        FWL23URMC0      = FWRO + 0x4f00,
        FWPMFGC0        = FWRO + 0x5000,
        FWPGFC0         = FWRO + 0x5100,
        FWPGFIGSC0      = FWRO + 0x5104,
        FWPGFENC0       = FWRO + 0x5108,
        FWPGFENM0       = FWRO + 0x510c,
        FWPGFCSTC00     = FWRO + 0x5110,
        FWPGFCSTC10     = FWRO + 0x5114,
        FWPGFCSTM00     = FWRO + 0x5118,
        FWPGFCSTM10     = FWRO + 0x511c,
        FWPGFCTC0       = FWRO + 0x5120,
        FWPGFCTM0       = FWRO + 0x5124,
        FWPGFHCC0       = FWRO + 0x5128,
        FWPGFSM0        = FWRO + 0x512c,
        FWPGFGC0        = FWRO + 0x5130,
        FWPGFGL0        = FWRO + 0x5500,
        FWPGFGL1        = FWRO + 0x5504,
        FWPGFGLR        = FWRO + 0x5518,
        FWPGFGR         = FWRO + 0x5510,
        FWPGFGRR0       = FWRO + 0x5514,
        FWPGFGRR1       = FWRO + 0x5518,
        FWPGFRIM        = FWRO + 0x5520,
        FWPMTRFC0       = FWRO + 0x5600,
        FWPMTRCBSC0     = FWRO + 0x5604,
        FWPMTRC0RC0     = FWRO + 0x5608,
        FWPMTREBSC0     = FWRO + 0x560c,
        FWPMTREIRC0     = FWRO + 0x5610,
        FWPMTRFM0       = FWRO + 0x5614,
        FWFTL0          = FWRO + 0x6000,
        FWFTL1          = FWRO + 0x6004,
        FWFTLR          = FWRO + 0x6008,
        FWFTOC          = FWRO + 0x6010,
        FWFTOPC         = FWRO + 0x6014,
        FWFTIM          = FWRO + 0x6020,
        FWFTR           = FWRO + 0x6030,
        FWFTRR0         = FWRO + 0x6034,
        FWFTRR1         = FWRO + 0x6038,
        FWFTRR2         = FWRO + 0x603c,
        FWSEQNGC0       = FWRO + 0x6100,
        FWSEQNGM0       = FWRO + 0x6104,
        FWSEQNRC        = FWRO + 0x6200,
        FWCTFDCN0       = FWRO + 0x6300,
        FWLTHFDCN0      = FWRO + 0x6304,
        FWIPFDCN0       = FWRO + 0x6308,
        FWLTWFDCN0      = FWRO + 0x630c,
        FWPBFDCN0       = FWRO + 0x6310,
        FWMHLCN0        = FWRO + 0x6314,
        FWIHLCN0        = FWRO + 0x6318,
        FWICRDCN0       = FWRO + 0x6500,
        FWWMRDCN0       = FWRO + 0x6504,
        FWCTRDCN0       = FWRO + 0x6508,
        FWLTHRDCN0      = FWRO + 0x650c,
        FWIPRDCN0       = FWRO + 0x6510,
        FWLTWRDCN0      = FWRO + 0x6514,
        FWPBRDCN0       = FWRO + 0x6518,
        FWPMFDCN0       = FWRO + 0x6700,
        FWPGFDCN0       = FWRO + 0x6780,
        FWPMGDCN0       = FWRO + 0x6800,
        FWPMYDCN0       = FWRO + 0x6804,
        FWPMRDCN0       = FWRO + 0x6808,
        FWFRPPCN0       = FWRO + 0x6a00,
        FWFRDPCN0       = FWRO + 0x6a04,
        FWEIS00         = FWRO + 0x7900,
        FWEIE00         = FWRO + 0x7904,
        FWEID00         = FWRO + 0x7908,
        FWEIS1          = FWRO + 0x7a00,
        FWEIE1          = FWRO + 0x7a04,
        FWEID1          = FWRO + 0x7a08,
        FWEIS2          = FWRO + 0x7a10,
        FWEIE2          = FWRO + 0x7a14,
        FWEID2          = FWRO + 0x7a18,
        FWEIS3          = FWRO + 0x7a20,
        FWEIE3          = FWRO + 0x7a24,
        FWEID3          = FWRO + 0x7a28,
        FWEIS4          = FWRO + 0x7a30,
        FWEIE4          = FWRO + 0x7a34,
        FWEID4          = FWRO + 0x7a38,
        FWEIS5          = FWRO + 0x7a40,
        FWEIE5          = FWRO + 0x7a44,
        FWEID5          = FWRO + 0x7a48,
        FWEIS60         = FWRO + 0x7a50,
        FWEIE60         = FWRO + 0x7a54,
        FWEID60         = FWRO + 0x7a58,
        FWEIS61         = FWRO + 0x7a60,
        FWEIE61         = FWRO + 0x7a64,
        FWEID61         = FWRO + 0x7a68,
        FWEIS62         = FWRO + 0x7a70,
        FWEIE62         = FWRO + 0x7a74,
        FWEID62         = FWRO + 0x7a78,
        FWEIS63         = FWRO + 0x7a80,
        FWEIE63         = FWRO + 0x7a84,
        FWEID63         = FWRO + 0x7a88,
        FWEIS70         = FWRO + 0x7a90,
        FWEIE70         = FWRO + 0x7A94,
        FWEID70         = FWRO + 0x7a98,
        FWEIS71         = FWRO + 0x7aa0,
        FWEIE71         = FWRO + 0x7aa4,
        FWEID71         = FWRO + 0x7aa8,
        FWEIS72         = FWRO + 0x7ab0,
        FWEIE72         = FWRO + 0x7ab4,
        FWEID72         = FWRO + 0x7ab8,
        FWEIS73         = FWRO + 0x7ac0,
        FWEIE73         = FWRO + 0x7ac4,
        FWEID73         = FWRO + 0x7ac8,
        FWEIS80         = FWRO + 0x7ad0,
        FWEIE80         = FWRO + 0x7ad4,
        FWEID80         = FWRO + 0x7ad8,
        FWEIS81         = FWRO + 0x7ae0,
        FWEIE81         = FWRO + 0x7ae4,
        FWEID81         = FWRO + 0x7ae8,
        FWEIS82         = FWRO + 0x7af0,
        FWEIE82         = FWRO + 0x7af4,
        FWEID82         = FWRO + 0x7af8,
        FWEIS83         = FWRO + 0x7b00,
        FWEIE83         = FWRO + 0x7b04,
        FWEID83         = FWRO + 0x7b08,
        FWMIS0          = FWRO + 0x7c00,
        FWMIE0          = FWRO + 0x7c04,
        FWMID0          = FWRO + 0x7c08,
        FWSCR0          = FWRO + 0x7d00,
        FWSCR1          = FWRO + 0x7d04,
        FWSCR2          = FWRO + 0x7d08,
        FWSCR3          = FWRO + 0x7d0c,
        FWSCR4          = FWRO + 0x7d10,
        FWSCR5          = FWRO + 0x7d14,
        FWSCR6          = FWRO + 0x7d18,
        FWSCR7          = FWRO + 0x7d1c,
        FWSCR8          = FWRO + 0x7d20,
        FWSCR9          = FWRO + 0x7d24,
        FWSCR10         = FWRO + 0x7d28,
        FWSCR11         = FWRO + 0x7d2c,
        FWSCR12         = FWRO + 0x7d30,
        FWSCR13         = FWRO + 0x7d34,
        FWSCR14         = FWRO + 0x7d38,
        FWSCR15         = FWRO + 0x7d3c,
        FWSCR16         = FWRO + 0x7d40,
        FWSCR17         = FWRO + 0x7d44,
        FWSCR18         = FWRO + 0x7d48,
        FWSCR19         = FWRO + 0x7d4c,
        FWSCR20         = FWRO + 0x7d50,
        FWSCR21         = FWRO + 0x7d54,
        FWSCR22         = FWRO + 0x7d58,
        FWSCR23         = FWRO + 0x7d5c,
        FWSCR24         = FWRO + 0x7d60,
        FWSCR25         = FWRO + 0x7d64,
        FWSCR26         = FWRO + 0x7d68,
        FWSCR27         = FWRO + 0x7d6c,
        FWSCR28         = FWRO + 0x7d70,
        FWSCR29         = FWRO + 0x7d74,
        FWSCR30         = FWRO + 0x7d78,
        FWSCR31         = FWRO + 0x7d7c,
        FWSCR32         = FWRO + 0x7d80,
        FWSCR33         = FWRO + 0x7d84,
        FWSCR34         = FWRO + 0x7d88,
        FWSCR35         = FWRO + 0x7d8c,
        FWSCR36         = FWRO + 0x7d90,
        FWSCR37         = FWRO + 0x7d94,
        FWSCR38         = FWRO + 0x7d98,
        FWSCR39         = FWRO + 0x7d9c,
        FWSCR40         = FWRO + 0x7da0,
        FWSCR41         = FWRO + 0x7da4,
        FWSCR42         = FWRO + 0x7da8,
        FWSCR43         = FWRO + 0x7dac,
        FWSCR44         = FWRO + 0x7db0,
        FWSCR45         = FWRO + 0x7db4,
        FWSCR46         = FWRO + 0x7db8,

        TPEMIMC0        = TPRO + 0x0000,
        TPEMIMC1        = TPRO + 0x0004,
        TPEMIMC2        = TPRO + 0x0008,
        TPEMIMC3        = TPRO + 0x000c,
        TPEMIMC4        = TPRO + 0x0010,
        TPEMIMC5        = TPRO + 0x0014,
        TPEMIMC60       = TPRO + 0x0080,
        TPEMIMC70       = TPRO + 0x0100,
        TSIM            = TPRO + 0x0700,
        TFIM            = TPRO + 0x0704,
        TCIM            = TPRO + 0x0708,
        TGIM0           = TPRO + 0x0710,
        TGIM1           = TPRO + 0x0714,
        TEIM0           = TPRO + 0x0720,
        TEIM1           = TPRO + 0x0724,
        TEIM2           = TPRO + 0x0728,

        RIPV            = CARO + 0x0000,
        RRC             = CARO + 0x0004,
        RCEC            = CARO + 0x0008,
        RCDC            = CARO + 0x000c,
        RSSIS           = CARO + 0x0010,
        RSSIE           = CARO + 0x0014,
        RSSID           = CARO + 0x0018,
        CABPIBWMC       = CARO + 0x0020,
        CABPWMLC        = CARO + 0x0040,
        CABPPFLC0       = CARO + 0x0050,
        CABPPWMLC0      = CARO + 0x0060,
        CABPPPFLC00     = CARO + 0x00a0,
        CABPULC         = CARO + 0x0100,
        CABPIRM         = CARO + 0x0140,
        CABPPCM         = CARO + 0x0144,
        CABPLCM         = CARO + 0x0148,
        CABPCPM         = CARO + 0x0180,
        CABPMCPM        = CARO + 0x0200,
        CARDNM          = CARO + 0x0280,
        CARDMNM         = CARO + 0x0284,
        CARDCN          = CARO + 0x0290,
        CAEIS0          = CARO + 0x0300,
        CAEIE0          = CARO + 0x0304,
        CAEID0          = CARO + 0x0308,
        CAEIS1          = CARO + 0x0310,
        CAEIE1          = CARO + 0x0314,
        CAEID1          = CARO + 0x0318,
        CAMIS0          = CARO + 0x0340,
        CAMIE0          = CARO + 0x0344,
        CAMID0          = CARO + 0x0348,
        CAMIS1          = CARO + 0x0350,
        CAMIE1          = CARO + 0x0354,
        CAMID1          = CARO + 0x0358,
        CASCR           = CARO + 0x0380,

        EAMC            = TARO + 0x0000,
        EAMS            = TARO + 0x0004,
        EAIRC           = TARO + 0x0010,
        EATDQSC         = TARO + 0x0014,
        EATDQC          = TARO + 0x0018,
        EATDQAC         = TARO + 0x001c,
        EATPEC          = TARO + 0x0020,
        EATMFSC0        = TARO + 0x0040,
        EATDQDC0        = TARO + 0x0060,
        EATDQM0         = TARO + 0x0080,
        EATDQMLM0       = TARO + 0x00a0,
        EACTQC          = TARO + 0x0100,
        EACTDQDC        = TARO + 0x0104,
        EACTDQM         = TARO + 0x0108,
        EACTDQMLM       = TARO + 0x010c,
        EAVCC           = TARO + 0x0130,
        EAVTC           = TARO + 0x0134,
        EATTFC          = TARO + 0x0138,
        EACAEC          = TARO + 0x0200,
        EACC            = TARO + 0x0204,
        EACAIVC0        = TARO + 0x0220,
        EACAULC0        = TARO + 0x0240,
        EACOEM          = TARO + 0x0260,
        EACOIVM0        = TARO + 0x0280,
        EACOULM0        = TARO + 0x02a0,
        EACGSM          = TARO + 0x02c0,
        EATASC          = TARO + 0x0300,
        EATASENC0       = TARO + 0x0320,
        EATASCTENC      = TARO + 0x0340,
        EATASENM0       = TARO + 0x0360,
        EATASCTENM      = TARO + 0x0380,
        EATASCSTC0      = TARO + 0x03a0,
        EATASCSTC1      = TARO + 0x03a4,
        EATASCSTM0      = TARO + 0x03a8,
        EATASCSTM1      = TARO + 0x03ac,
        EATASCTC        = TARO + 0x03b0,
        EATASCTM        = TARO + 0x03b4,
        EATASGL0        = TARO + 0x03c0,
        EATASGL1        = TARO + 0x03c4,
        EATASGLR        = TARO + 0x03c8,
        EATASGR         = TARO + 0x03d0,
        EATASGRR        = TARO + 0x03d4,
        EATASHCC        = TARO + 0x03e0,
        EATASRIRM       = TARO + 0x03e4,
        EATASSM         = TARO + 0x03e8,
        EAUSMFSECN      = TARO + 0x0400,
        EATFECN         = TARO + 0x0404,
        EAFSECN         = TARO + 0x0408,
        EADQOECN        = TARO + 0x040c,
        EADQSECN        = TARO + 0x0410,
        EACKSECN        = TARO + 0x0414,
        EAEIS0          = TARO + 0x0500,
        EAEIE0          = TARO + 0x0504,
        EAEID0          = TARO + 0x0508,
        EAEIS1          = TARO + 0x0510,
        EAEIE1          = TARO + 0x0514,
        EAEID1          = TARO + 0x0518,
        EAEIS2          = TARO + 0x0520,
        EAEIE2          = TARO + 0x0524,
        EAEID2          = TARO + 0x0528,
        EASCR           = TARO + 0x0580,

        MPSM            = RMRO + 0x0000,
        MPIC            = RMRO + 0x0004,
        MPIM            = RMRO + 0x0008,
        MIOC            = RMRO + 0x0010,
        MIOM            = RMRO + 0x0014,
        MXMS            = RMRO + 0x0018,
        MTFFC           = RMRO + 0x0020,
        MTPFC           = RMRO + 0x0024,
        MTPFC2          = RMRO + 0x0028,
        MTPFC30         = RMRO + 0x0030,
        MTATC0          = RMRO + 0x0050,
        MTIM            = RMRO + 0x0060,
        MRGC            = RMRO + 0x0080,
        MRMAC0          = RMRO + 0x0084,
        MRMAC1          = RMRO + 0x0088,
        MRAFC           = RMRO + 0x008c,
        MRSCE           = RMRO + 0x0090,
        MRSCP           = RMRO + 0x0094,
        MRSCC           = RMRO + 0x0098,
        MRFSCE          = RMRO + 0x009c,
        MRFSCP          = RMRO + 0x00a0,
        MTRC            = RMRO + 0x00a4,
        MRIM            = RMRO + 0x00a8,
        MRPFM           = RMRO + 0x00ac,
        MPFC0           = RMRO + 0x0100,
        MLVC            = RMRO + 0x0180,
        MEEEC           = RMRO + 0x0184,
        MLBC            = RMRO + 0x0188,
        MXGMIIC         = RMRO + 0x0190,
        MPCH            = RMRO + 0x0194,
        MANC            = RMRO + 0x0198,
        MANM            = RMRO + 0x019c,
        MPLCA1          = RMRO + 0x01a0,
        MPLCA2          = RMRO + 0x01a4,
        MPLCA3          = RMRO + 0x01a8,
        MPLCA4          = RMRO + 0x01ac,
        MPLCAM          = RMRO + 0x01b0,
        MHDC1           = RMRO + 0x01c0,
        MHDC2           = RMRO + 0x01c4,
        MEIS            = RMRO + 0x0200,
        MEIE            = RMRO + 0x0204,
        MEID            = RMRO + 0x0208,
        MMIS0           = RMRO + 0x0210,
        MMIE0           = RMRO + 0x0214,
        MMID0           = RMRO + 0x0218,
        MMIS1           = RMRO + 0x0220,
        MMIE1           = RMRO + 0x0224,
        MMID1           = RMRO + 0x0228,
        MMIS2           = RMRO + 0x0230,
        MMIE2           = RMRO + 0x0234,
        MMID2           = RMRO + 0x0238,
        MMPFTCT         = RMRO + 0x0300,
        MAPFTCT         = RMRO + 0x0304,
        MPFRCT          = RMRO + 0x0308,
        MFCICT          = RMRO + 0x030c,
        MEEECT          = RMRO + 0x0310,
        MMPCFTCT0       = RMRO + 0x0320,
        MAPCFTCT0       = RMRO + 0x0330,
        MPCFRCT0        = RMRO + 0x0340,
        MHDCC           = RMRO + 0x0350,
        MROVFC          = RMRO + 0x0354,
        MRHCRCEC        = RMRO + 0x0358,
        MRXBCE          = RMRO + 0x0400,
        MRXBCP          = RMRO + 0x0404,
        MRGFCE          = RMRO + 0x0408,
        MRGFCP          = RMRO + 0x040c,
        MRBFC           = RMRO + 0x0410,
        MRMFC           = RMRO + 0x0414,
        MRUFC           = RMRO + 0x0418,
        MRPEFC          = RMRO + 0x041c,
        MRNEFC          = RMRO + 0x0420,
        MRFMEFC         = RMRO + 0x0424,
        MRFFMEFC        = RMRO + 0x0428,
        MRCFCEFC        = RMRO + 0x042c,
        MRFCEFC         = RMRO + 0x0430,
        MRRCFEFC        = RMRO + 0x0434,
        MRUEFC          = RMRO + 0x043c,
        MROEFC          = RMRO + 0x0440,
        MRBOEC          = RMRO + 0x0444,
        MTXBCE          = RMRO + 0x0500,
        MTXBCP          = RMRO + 0x0504,
        MTGFCE          = RMRO + 0x0508,
        MTGFCP          = RMRO + 0x050c,
        MTBFC           = RMRO + 0x0510,
        MTMFC           = RMRO + 0x0514,
        MTUFC           = RMRO + 0x0518,
        MTEFC           = RMRO + 0x051c,

        GWMC            = GWRO + 0x0000,
        GWMS            = GWRO + 0x0004,
        GWIRC           = GWRO + 0x0010,
        GWRDQSC         = GWRO + 0x0014,
        GWRDQC          = GWRO + 0x0018,
        GWRDQAC         = GWRO + 0x001c,
        GWRGC           = GWRO + 0x0020,
        GWRMFSC0        = GWRO + 0x0040,
        GWRDQDC0        = GWRO + 0x0060,
        GWRDQM0         = GWRO + 0x0080,
        GWRDQMLM0       = GWRO + 0x00a0,
        GWMTIRM         = GWRO + 0x0100,
        GWMSTLS         = GWRO + 0x0104,
        GWMSTLR         = GWRO + 0x0108,
        GWMSTSS         = GWRO + 0x010c,
        GWMSTSR         = GWRO + 0x0110,
        GWMAC0          = GWRO + 0x0120,
        GWMAC1          = GWRO + 0x0124,
        GWVCC           = GWRO + 0x0130,
        GWVTC           = GWRO + 0x0134,
        GWTTFC          = GWRO + 0x0138,
        GWTDCAC00       = GWRO + 0x0140,
        GWTDCAC10       = GWRO + 0x0144,
        GWTSDCC0        = GWRO + 0x0160,
        GWTNM           = GWRO + 0x0180,
        GWTMNM          = GWRO + 0x0184,
        GWAC            = GWRO + 0x0190,
        GWDCBAC0        = GWRO + 0x0194,
        GWDCBAC1        = GWRO + 0x0198,
        GWIICBSC        = GWRO + 0x019c,
        GWMDNC          = GWRO + 0x01a0,
        GWTRC0          = GWRO + 0x0200,
        GWTPC0          = GWRO + 0x0300,
        GWARIRM         = GWRO + 0x0380,
        GWDCC0          = GWRO + 0x0400,
        GWAARSS         = GWRO + 0x0800,
        GWAARSR0        = GWRO + 0x0804,
        GWAARSR1        = GWRO + 0x0808,
        GWIDAUAS0       = GWRO + 0x0840,
        GWIDASM0        = GWRO + 0x0880,
        GWIDASAM00      = GWRO + 0x0900,
        GWIDASAM10      = GWRO + 0x0904,
        GWIDACAM00      = GWRO + 0x0980,
        GWIDACAM10      = GWRO + 0x0984,
        GWGRLC          = GWRO + 0x0a00,
        GWGRLULC        = GWRO + 0x0a04,
        GWRLIVC0        = GWRO + 0x0a80,
        GWRLULC0        = GWRO + 0x0a84,
        GWIDPC          = GWRO + 0x0b00,
        GWIDC0          = GWRO + 0x0c00,
        GWDIS0          = GWRO + 0x1100,
        GWDIE0          = GWRO + 0x1104,
        GWDID0          = GWRO + 0x1108,
        GWTSDIS         = GWRO + 0x1180,
        GWTSDIE         = GWRO + 0x1184,
        GWTSDID         = GWRO + 0x1188,
        GWEIS0          = GWRO + 0x1190,
        GWEIE0          = GWRO + 0x1194,
        GWEID0          = GWRO + 0x1198,
        GWEIS1          = GWRO + 0x11a0,
        GWEIE1          = GWRO + 0x11a4,
        GWEID1          = GWRO + 0x11a8,
        GWEIS20         = GWRO + 0x1200,
        GWEIE20         = GWRO + 0x1204,
        GWEID20         = GWRO + 0x1208,
        GWEIS3          = GWRO + 0x1280,
        GWEIE3          = GWRO + 0x1284,
        GWEID3          = GWRO + 0x1288,
        GWEIS4          = GWRO + 0x1290,
        GWEIE4          = GWRO + 0x1294,
        GWEID4          = GWRO + 0x1298,
        GWEIS5          = GWRO + 0x12a0,
        GWEIE5          = GWRO + 0x12a4,
        GWEID5          = GWRO + 0x12a8,
        GWSCR0          = GWRO + 0x1800,
        GWSCR1          = GWRO + 0x1900,
};

/* ETHA/RMAC */
enum rswitch_etha_mode {
        EAMC_OPC_RESET,
        EAMC_OPC_DISABLE,
        EAMC_OPC_CONFIG,
        EAMC_OPC_OPERATION,
};

#define EAMS_OPS_MASK           EAMC_OPC_OPERATION

#define EAVCC_VEM_SC_TAG        (0x3 << 16)

#define MPIC_PIS                GENMASK(2, 0)
#define MPIC_PIS_GMII           2
#define MPIC_PIS_XGMII          4
#define MPIC_LSC                GENMASK(5, 3)
#define MPIC_LSC_100M           1
#define MPIC_LSC_1G             2
#define MPIC_LSC_2_5G           3
#define MPIC_PSMCS              GENMASK(22, 16)
#define MPIC_PSMHT              GENMASK(26, 24)

#define MPSM_PSME               BIT(0)
#define MPSM_MFF                BIT(2)
#define MPSM_MMF_C22            0
#define MPSM_MMF_C45            1
#define MPSM_PDA                GENMASK(7, 3)
#define MPSM_PRA                GENMASK(12, 8)
#define MPSM_POP                GENMASK(14, 13)
#define MPSM_POP_ADDRESS        0
#define MPSM_POP_WRITE          1
#define MPSM_POP_READ_C22       2
#define MPSM_POP_READ_C45       3
#define MPSM_PRD                GENMASK(31, 16)

#define MLVC_PLV                BIT(16)

/* GWCA */
enum rswitch_gwca_mode {
        GWMC_OPC_RESET,
        GWMC_OPC_DISABLE,
        GWMC_OPC_CONFIG,
        GWMC_OPC_OPERATION,
};

#define GWMS_OPS_MASK           GWMC_OPC_OPERATION

#define GWMTIRM_MTIOG           BIT(0)
#define GWMTIRM_MTR             BIT(1)

#define GWVCC_VEM_SC_TAG        (0x3 << 16)

#define GWARIRM_ARIOG           BIT(0)
#define GWARIRM_ARR             BIT(1)

#define GWMDNC_TSDMN(num)       (((num) << 16) & GENMASK(17, 16))
#define GWMDNC_TXDMN(num)       (((num) << 8) & GENMASK(12, 8))
#define GWMDNC_RXDMN(num)       ((num) & GENMASK(4, 0))

#define GWDCC_BALR              BIT(24)
#define GWDCC_DCP_MASK          GENMASK(18, 16)
#define GWDCC_DCP(prio)         FIELD_PREP(GWDCC_DCP_MASK, (prio))
#define GWDCC_DQT               BIT(11)
#define GWDCC_ETS               BIT(9)
#define GWDCC_EDE               BIT(8)

#define GWTRC(queue)            (GWTRC0 + (queue) / 32 * 4)
#define GWTPC_PPPL(ipv)         BIT(ipv)
#define GWDCC_OFFS(queue)       (GWDCC0 + (queue) * 4)

#define GWDIS(i)                (GWDIS0 + (i) * 0x10)
#define GWDIE(i)                (GWDIE0 + (i) * 0x10)
#define GWDID(i)                (GWDID0 + (i) * 0x10)

/* COMA */
#define RRC_RR                  BIT(0)
#define RRC_RR_CLR              0
#define RCEC_ACE_DEFAULT        (BIT(0) | BIT(AGENT_INDEX_GWCA))
#define RCEC_RCE                BIT(16)
#define RCDC_RCD                BIT(16)

#define CABPIRM_BPIOG           BIT(0)
#define CABPIRM_BPR             BIT(1)

#define CABPPFLC_INIT_VALUE     0x00800080

/* MFWD */
#define FWPC0(i)                (FWPC00 + (i) * 0x10)
#define FWPC0_LTHTA             BIT(0)
#define FWPC0_IP4UE             BIT(3)
#define FWPC0_IP4TE             BIT(4)
#define FWPC0_IP4OE             BIT(5)
#define FWPC0_L2SE              BIT(9)
#define FWPC0_IP4EA             BIT(10)
#define FWPC0_IPDSA             BIT(12)
#define FWPC0_IPHLA             BIT(18)
#define FWPC0_MACDSA            BIT(20)
#define FWPC0_MACSSA            BIT(23)
#define FWPC0_MACHLA            BIT(26)
#define FWPC0_MACHMA            BIT(27)
#define FWPC0_VLANSA            BIT(28)

#define FWPC1(i)                (FWPC10 + (i) * 0x10)
#define FWCP1_LTHFW             GENMASK(16 + (RSWITCH_NUM_AGENTS - 1), 16)
#define FWPC1_DDE               BIT(0)

#define FWPC2(i)                (FWPC20 + (i) * 0x10)
#define FWCP2_LTWFW             GENMASK(16 + (RSWITCH_NUM_AGENTS - 1), 16)
#define FWCP2_LTWFW_MASK        GENMASK(16 + (RSWITCH_NUM_AGENTS - 1), 16)

#define FWPBFC(i)               (FWPBFC0 + (i) * 0x10)
#define FWPBFC_PBDV             GENMASK(RSWITCH_NUM_AGENTS - 1, 0)

#define FWPBFCSDC(j, i)         (FWPBFCSDC00 + (i) * 0x10 + (j) * 0x04)

#define FWMACHEC_MACHMUE_MASK   GENMASK(26, 16)

#define FWMACTIM_MACTIOG        BIT(0)
#define FWMACTIM_MACTR          BIT(1)

#define FWMACAGUSPC_MACAGUSP    GENMASK(9, 0)
#define FWMACAGC_MACAGT         GENMASK(15, 0)
#define FWMACAGC_MACAGE         BIT(16)
#define FWMACAGC_MACAGSL        BIT(17)
#define FWMACAGC_MACAGPM        BIT(18)
#define FWMACAGC_MACDES         BIT(24)
#define FWMACAGC_MACAGOG        BIT(28)
#define FWMACAGC_MACDESOG       BIT(29)

#define RSW_AGEING_CLK_PER_US   0x140
#define RSW_AGEING_TIME         300

/* TOP */
#define TPEMIMC7(queue)         (TPEMIMC70 + (queue) * 4)

/* Descriptors */
enum RX_DS_CC_BIT {
        RX_DS   = 0x0fff, /* Data size */
        RX_TR   = 0x1000, /* Truncation indication */
        RX_EI   = 0x2000, /* Error indication */
        RX_PS   = 0xc000, /* Padding selection */
};

enum TX_DS_TAGL_BIT {
        TX_DS   = 0x0fff, /* Data size */
        TX_TAGL = 0xf000, /* Frame tag LSBs */
};

enum DIE_DT {
        /* Frame data */
        DT_FSINGLE      = 0x80,
        DT_FSTART       = 0x90,
        DT_FMID         = 0xa0,
        DT_FEND         = 0xb0,

        /* Chain control */
        DT_LEMPTY       = 0xc0,
        DT_EEMPTY       = 0xd0,
        DT_LINKFIX      = 0x00,
        DT_LINK         = 0xe0,
        DT_EOS          = 0xf0,
        /* HW/SW arbitration */
        DT_FEMPTY       = 0x40,
        DT_FEMPTY_IS    = 0x10,
        DT_FEMPTY_IC    = 0x20,
        DT_FEMPTY_ND    = 0x30,
        DT_FEMPTY_START = 0x50,
        DT_FEMPTY_MID   = 0x60,
        DT_FEMPTY_END   = 0x70,

        DT_MASK         = 0xf0,
        DIE             = 0x08, /* Descriptor Interrupt Enable */
};

/* Both transmission and reception */
#define INFO1_FMT               BIT(2)
#define INFO1_TXC               BIT(3)

/* For transmission */
#define INFO1_TSUN(val)         ((u64)(val) << 8ULL)
#define INFO1_IPV(prio)         ((u64)(prio) << 28ULL)
#define INFO1_CSD0(index)       ((u64)(index) << 32ULL)
#define INFO1_CSD1(index)       ((u64)(index) << 40ULL)
#define INFO1_DV(port_vector)   ((u64)(port_vector) << 48ULL)

/* For reception */
#define INFO1_SPN(port)         ((u64)(port) << 36ULL)

/* For timestamp descriptor in dptrl (Byte 4 to 7) */
#define TS_DESC_TSUN(dptrl)     ((dptrl) & GENMASK(7, 0))
#define TS_DESC_SPN(dptrl)      (((dptrl) & GENMASK(10, 8)) >> 8)
#define TS_DESC_DPN(dptrl)      (((dptrl) & GENMASK(17, 16)) >> 16)
#define TS_DESC_TN(dptrl)       ((dptrl) & BIT(24))

struct rswitch_desc {
        __le16 info_ds; /* Descriptor size */
        u8 die_dt;      /* Descriptor interrupt enable and type */
        __u8  dptrh;    /* Descriptor pointer MSB */
        __le32 dptrl;   /* Descriptor pointer LSW */
} __packed;

struct rswitch_ts_desc {
        struct rswitch_desc desc;
        __le32 ts_nsec;
        __le32 ts_sec;
} __packed;

struct rswitch_ext_desc {
        struct rswitch_desc desc;
        __le64 info1;
} __packed;

struct rswitch_ext_ts_desc {
        struct rswitch_desc desc;
        __le64 info1;
        __le32 ts_nsec;
        __le32 ts_sec;
} __packed;

struct rswitch_etha {
        unsigned int index;
        void __iomem *addr;
        void __iomem *coma_addr;
        bool external_phy;
        struct mii_bus *mii;
        phy_interface_t phy_interface;
        u32 psmcs;
        u8 mac_addr[MAX_ADDR_LEN];
        int link;
        int speed;

        /* This hardware could not be initialized twice so that marked
         * this flag to avoid multiple initialization.
         */
        bool operated;
};

/* The datasheet said descriptor "chain" and/or "queue". For consistency of
 * name, this driver calls "queue".
 */
struct rswitch_gwca_queue {
        union {
                struct rswitch_ext_desc *tx_ring;
                struct rswitch_ext_ts_desc *rx_ring;
                struct rswitch_ts_desc *ts_ring;
        };

        /* Common */
        dma_addr_t ring_dma;
        unsigned int ring_size;
        unsigned int cur;
        unsigned int dirty;

        /* For [rt]x_ring */
        unsigned int index;
        bool dir_tx;
        struct net_device *ndev;        /* queue to ndev for irq */

        union {
                /* For TX */
                struct {
                        struct sk_buff **skbs;
                        dma_addr_t *unmap_addrs;
                };
                /* For RX */
                struct {
                        void **rx_bufs;
                        struct sk_buff *skb_fstart;
                        u16 pkt_len;
                };
        };
};

#define RSWITCH_NUM_IRQ_REGS    (RSWITCH_MAX_NUM_QUEUES / BITS_PER_TYPE(u32))
struct rswitch_gwca {
        unsigned int index;
        struct rswitch_desc *linkfix_table;
        dma_addr_t linkfix_table_dma;
        u32 linkfix_table_size;
        struct rswitch_gwca_queue *queues;
        int num_queues;
        struct rswitch_gwca_queue ts_queue;
        DECLARE_BITMAP(used, RSWITCH_MAX_NUM_QUEUES);
        u32 tx_irq_bits[RSWITCH_NUM_IRQ_REGS];
        u32 rx_irq_bits[RSWITCH_NUM_IRQ_REGS];
};

#define NUM_QUEUES_PER_NDEV     2
#define TS_TAGS_PER_PORT        256
struct rswitch_device {
        struct rswitch_private *priv;
        struct net_device *ndev;
        struct napi_struct napi;
        void __iomem *addr;
        struct rswitch_gwca_queue *tx_queue;
        struct rswitch_gwca_queue *rx_queue;
        struct sk_buff *ts_skb[TS_TAGS_PER_PORT];
        DECLARE_BITMAP(ts_skb_used, TS_TAGS_PER_PORT);
        bool disabled;

        struct list_head list;

        int port;
        struct rswitch_etha *etha;
        struct device_node *np_port;
        struct phy *serdes;

        struct net_device *brdev;       /* master bridge device */
        unsigned int learning_requested : 1;
        unsigned int learning_offloaded : 1;
        unsigned int forwarding_requested : 1;
        unsigned int forwarding_offloaded : 1;
};

struct rswitch_mfwd_mac_table_entry {
        int queue_index;
        unsigned char addr[MAX_ADDR_LEN];
};

struct rswitch_mfwd {
        struct rswitch_mac_table_entry *mac_table_entries;
        int num_mac_table_entries;
};

struct rswitch_private {
        struct platform_device *pdev;
        void __iomem *addr;
        struct rcar_gen4_ptp_private *ptp_priv;

        struct rswitch_device *rdev[RSWITCH_NUM_PORTS];
        DECLARE_BITMAP(opened_ports, RSWITCH_NUM_PORTS);

        struct rswitch_gwca gwca;
        struct rswitch_etha etha[RSWITCH_NUM_PORTS];
        struct rswitch_mfwd mfwd;

        struct list_head port_list;

        spinlock_t lock;        /* lock interrupt registers' control */
        struct clk *clk;

        bool etha_no_runtime_change;
        bool gwca_halt;
        struct net_device *offload_brdev;

        enum hwtstamp_tx_types tstamp_tx_ctrl;
        enum hwtstamp_rx_filters tstamp_rx_ctrl;
};

bool is_rdev(const struct net_device *ndev);
void rswitch_modify(void __iomem *addr, enum rswitch_reg reg, u32 clear, u32 set);

#endif  /* #ifndef __RSWITCH_H__ */