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-2019 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 */