openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

loopback.h (9994B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2020 Broadcom Inc. All rights reserved.
      6  *
      7  * Loopback Test definitions.
      8  */
      9 #ifndef __LOOPBACKTEST__H
     10 #define __LOOPBACKTEST__H
     11 
     12 #include <sal/types.h>
     13 #include <sal/compiler.h>
     14 
     15 #include <soc/mem.h>
     16 #include <soc/dma.h>
     17 #include <soc/enet.h>
     18 #include <soc/counter.h>
     19 #include <soc/register.h>
     20 #include <soc/memory.h>
     21 
     22 #include <bcm/port.h>
     23 #include <bcm/l2.h>
     24 
     25 #define LB_MAC_CHAIN    4       /* # DCBs in MAC loopback chain */
     26 #define LB_PHY_CHAIN    4       /* # DCBs in PHY loopback chain */
     27 #define LB_EXT_CHAIN    4       /* # DCBs in EXT loopback chain */
     28 #define LB_SNAKE_CHAIN  1       /* # DCBs in SNAKE loopback chain */
     29 #define LB_VLAN_ID      1
     30 #define CHAN_CONFIG_COUNT         12  /* 4-choose-2 DMA config combos */
     31 #define CMICX_CHAN_CONFIG_COUNT   56  /* 8-choose-2 DMA config combos */
     32 #define LB_LINKSCAN_PERIOD  100000
     33 #define LB_LINK_TIMEOUT     10000000 /* Microseconds */
     34 #define LB_PACKET_TIMEOUT   5
     35 #define LB_PACKET_TIMEOUT_QT    60
     36 #define LB_PACKET_TIMEOUT_PLI   (3*60)
     37 #define LB_FFP_PARAM_BYTES      6
     38 #define LB_JUMBO_MAXSZ          0x3fe8  /* Maximum size of loopback packets */
     39 #define LB_LEGACY_DMA_MODE      0
     40 #define LB_CONTINUOUS_DMA_MODE  1
     41 
     42 #define MH_BYTES        16
     43 
     44 /* Specific checks for DMA modes */
     45 #define LB_DMA_MODE_IS_LEGACY(m) (m == LB_LEGACY_DMA_MODE)
     46 #define LB_DMA_MODE_IS_CONTINUOUS(m) (m == LB_CONTINUOUS_DMA_MODE)
     47 
     48 /* Loopback test data, attributes of a given loopback test */
     49 typedef struct loopback_testdata_s {
     50     pbmp_t      lp_pbm;                 /* Ports under test */
     51     pbmp_t      lp_pbm_tx;              /* Ports under test, TX only */
     52     pbmp_t      lp_ext_self_loop_pbm;   /* Ports which have external loopback cables */
     53     soc_port_t  lp_tx_port;             /* Current TX port */
     54     soc_port_t  lp_rx_port;             /* Current RX port */
     55     soc_port_t  lp_dst_inc;             /* Destination increment */
     56     pbmp_t      lp_ubm;                 /* Untag bit mask */
     57     uint32      lp_pattern;             /* Data Pattern */
     58     uint32      lp_pattern_inc;         /* Data Pattern increment  */
     59     uint32      lp_vlan;                /* Vlan tag */
     60     int         lp_d_mod;               /* Destination module, HiGig hdr */
     61     int         lp_d_mod_inc;           /* HiGig modid increment */
     62     uint32      lp_d_port;              /* Destination port, HiGig hdr */
     63     uint32      lp_opcode;              /* Opcode, HiGig hdr */
     64     int     lp_l_start;             /* Start length */
     65     int     lp_l_end;               /* End length */
     66     int     lp_l_inc;               /* Length increment */
     67     int     lp_c_start;             /* Start chain count */
     68     int     lp_c_end;               /* End chain count */
     69     int     lp_c_inc;               /* Chain count increment */
     70     int     lp_dv_start;            /* Starting # DV chains */
     71     int     lp_dv_end;              /* End # DV chains */
     72     int     lp_dv_inc;              /* Starting # DV chains */
     73     int     lp_ppc_start;           /* Packets per chain start */
     74     int     lp_ppc_end;             /* Packets per chain end */
     75     int     lp_ppc_inc;             /* Packets per chain increment */
     76     int     lp_dpp_start;           /* DCBs per packet start*/
     77     int     lp_dpp_end;             /* DCBs per packet end */
     78     int     lp_dpp_inc;             /* DCBs per packet increment */
     79     int     lp_sg;                  /* S/G if TRUE, lp_ppc_X != lp_c_X */
     80     int     lp_seed;                /* Random seed (0 == don't set) */
     81     int     lp_count;               /* # chains of each */
     82     int     lp_cos_start;           /* Starting COS value */
     83     int     lp_cos_end;             /* Ending COS value */
     84     int     lp_crc_mode;            /* CRC generation mode */
     85     int     lp_check_data;          /* Check data integrity on receive */
     86     int     lp_check_crc;           /* CRC data integrity on receive */
     87     int     lp_speed;               /* Speed to configure ports */
     88     int     lp_autoneg;             /* Enable autoneg (ext lb only) */
     89     sal_mac_addr_t lp_mac_src;      /* SRC Mac address under test */
     90     uint32  lp_mac_src_inc;         /* Source mac increment */
     91     sal_mac_addr_t lp_mac_dst;      /* SRC Mac address under test */
     92     uint32  lp_mac_dst_inc;         /* Destination mac increment */
     93     int     lp_duration;            /* Duration time for Snake Test */
     94     int     lp_two_way;             /* Both directions of snake path */
     95 } loopback_testdata_t;
     96 
     97 
     98 /* Loopback test structure, consolidated testdata for each
     99  * type of loopback test.
    100  */
    101 
    102 typedef struct loopback_test_s {
    103     int     lw_set_up;      /* TRUE if lb_setup() done */
    104     loopback_testdata_t lw_lp_dma;   /* DMA loopback Parameters */
    105     loopback_testdata_t lw_lp_mac;   /* Mac Loopback Parameters */
    106     loopback_testdata_t lw_lp_phy;   /* PHY loopback Parameters */
    107     loopback_testdata_t lw_lp_ext;   /* EXT loopback Parameters */
    108     loopback_testdata_t lw_lp_snake;     /* EXT Snake Parameters */
    109     loopback_testdata_t lw_lp_sg_dma;    /* Scatter/Gather Loopback DMA */
    110     loopback_testdata_t lw_lp_sg_random; /* Scatter/Gather Random DMA */
    111     loopback_testdata_t *lw_lp;      /* Current lp parameters */
    112     int     lw_unit;         /* Unit # */
    113     bcm_port_info_t lw_save_port[SOC_MAX_NUM_PORTS]; /* Port information */
    114     uint32   lw_save_port_data[SOC_MAX_NUM_PORTS]; /* Port info to restore information (mostly used for SHADOW)*/
    115 
    116     int     lw_save_linkscan_period;
    117     int         lw_save_vlan_valid;
    118     bcm_stg_t   lw_save_vlan_stg;
    119     pbmp_t      lw_save_vlan_pbmp;
    120     pbmp_t      lw_save_vlan_ubmp;
    121     volatile int lw_eoc_tx;     /* TRUE --> End-of-chain seen */
    122     volatile int lw_eoc_rx;     /* TRUE --> End-of-chain seen */
    123     volatile dv_t *lw_tx_dv_chain_done; /* Pointer to dv waiting for */
    124     volatile dv_t *lw_rx_dv_chain_done; /* Pointer to dv waiting for */
    125     dv_t    **lw_rx_dv;     /* RX dv pointer */
    126     dv_t    **lw_tx_dv;     /* TX dv pointer */
    127     int     lw_dma_mode;    /* Legacy or Continuous Mode(CMICDV2) */
    128     int     lw_tx_started;  /* TRUE if Continuous Mode and TX has started */
    129     int     lw_rx_started;  /* TRUE if Continuous Mode and RX has started */
    130     volatile int lw_tx_dv_idx;   /* Index of TX DV in array Continuous Mode only */
    131     volatile int lw_rx_dv_idx;   /* Index of RX DV in array Continuous Mode only */
    132     int     lw_stats_init;      /* TRUE if stats initialized */
    133     int     lw_tx_seq;      /* Seq # in sent packet */
    134     int     lw_tx_total;        /* Total # to send (multiplied out)*/
    135     int     lw_tx_count;        /* Total packets sent so far */
    136     sal_time_t  lw_tx_stime;        /* Transmit start time */
    137     sal_time_t  lw_tx_rtime;        /* Time of next report */
    138     COMPILER_DOUBLE lw_tx_bytes;    /* Total bytes sent so far */
    139     int     lw_rx_count;        /* Total packets received so far */
    140     COMPILER_DOUBLE lw_rx_bytes;    /* Total bytes received so far */
    141     int     lw_rx_fill;     /* Fill RX buffer with 0xdeadbeef */
    142 
    143     sal_mac_addr_t lw_mac_src;      /* Source MAC address under test */
    144     uint32  lw_mac_src_inc;     /* Source MAC increment */
    145     sal_mac_addr_t lw_mac_dst;      /* Dest MAC address under test */
    146     uint32  lw_mac_dst_inc;     /* Dest MAC increment */
    147 
    148     sal_sem_t   lw_sema;        /* Sleep semaphore */
    149     volatile int lw_sema_woke;      /* Used to prevent excess semGives */
    150     uint32      lw_timeout_usec;        /* Timeout for packet operations */
    151     int     lw_tx_init_chn;     /* TX # in chain inited */
    152     int     lw_tx_init_len;     /* TX packet length inited */
    153     int     lw_tx_init_ppc;     /* TX packets/chain inited */
    154 
    155     int     lw_arl_src_delete;  /* TRUE --> Delete ARL when done */
    156     int     lw_arl_dst_delete;  /* TRUE --> Delete ARL when done */
    157     bcm_l2_addr_t    lw_arl_src;    /* Source port ARL entry */
    158     bcm_l2_addr_t    lw_arl_dst;    /* Destination port ARL entry */
    159     int     lw_tx_packet_cnt;   /* Allocate TX packets */
    160     int     lw_rx_packet_cnt;   /* Allocate RX packets */
    161     uint8   **lw_tx_packets;    /* Array of pointers to TX packets */
    162     uint8   **lw_rx_packets;    /* Array of pointers to RX packets */
    163     uint8   **lw_tx_dcbs;       /* Array of pointers to TX dcbs(only in cmicx) */
    164     sal_mac_addr_t lw_cur_mac_src;  /* SRC Mac address under test */
    165     sal_mac_addr_t lw_cur_mac_dst;  /* SRC Mac address under test */
    166 
    167     /* Snake test */
    168 
    169     int     lw_iPhase;      /* 0=none, 1=clean up FE, */
    170                     /*         2=clean up GE */
    171     int     lw_fwdPort[2];      /* forward port */
    172     int     lw_bwdPort[2];      /* backward port */
    173     int     lw_curC;        /* current Chain during setup */
    174     int     lw_ether_start;         /* Offset into start of eth hdr*/
    175     int         lw_c3_lrp_bypass;
    176     uint32  lw_tx_dcb_factor;       /* Number of tx dcbs per packet */
    177 } loopback_test_t;
    178 
    179 
    180 /*
    181  * A dma descriptor has two user-defined fields, one which we use
    182  * for packet data, the other for test data.
    183  */
    184 #define dv_pckt dv_public1.u32      /* Which packet is being worked on */
    185 #define dv_dsc  dv_public2.u32      /* RX: idx of next to look at */
    186 
    187 
    188 extern loopback_test_t* lb_get_test(int unit);
    189 extern loopback_testdata_t* lb_get_dma_testdata(int unit);
    190 
    191 extern int lb_dma_testapi_init(int unit,
    192             uint32 pattern,
    193             uint32 patternIncrement,
    194             int startLength,
    195             int endLength,
    196             int lengthIncrement,
    197             int chainStart,
    198             int chainEnd,
    199             int chainIncrement,
    200             int cosStart,
    201             int cosEnd,
    202             int countPackets,
    203             int checkData);
    204 
    205 extern int lb_dma_testapi_run(int unit,
    206                loopback_test_t  *lw,
    207                loopback_testdata_t  *lp);
    208 
    209 extern int lb_dma_testapi_done(int unit);
    210 
    211 
    212 #endif /*!__LOOPBACKTEST__H */