xref: /openbmc/u-boot/cmd/aspeed/nettest/ncsi.c (revision 25fde1c0)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) ASPEED Technology Inc.
4  */
5 
6 #define NCSI_C
7 
8 #include "swfunc.h"
9 
10 #include "comminf.h"
11 //#include "io.h"
12 #include "ncsi.h"
13 #include <command.h>
14 #include <common.h>
15 #include "mac_api.h"
16 
17 //------------------------------------------------------------
18 int ncsi_set_error_flag(MAC_ENGINE *eng, int eflag)
19 {
20 	eng->flg.ncsi = eng->flg.ncsi | eflag;
21 	eng->flg.error = eng->flg.error | ERR_FLAG_NCSI_LINKFAIL;
22 	if (DBG_PRINT_ERR_FLAG)
23 		printf("\nflags: error = %08x, ncsi = %08x\n",
24 		       eng->flg.error, eng->flg.ncsi);
25 
26 	return (1);
27 }
28 
29 //------------------------------------------------------------
30 // PHY IC(NC-SI)
31 //------------------------------------------------------------
32 void ncsi_reqdump(MAC_ENGINE *eng, NCSI_Command_Packet *in)
33 {
34 	int     i;
35 	PRINTF( FP_LOG, "[NCSI-Request] DA             : %02x %02x %02x %02x %02x %02x\n", in->DA[ 0 ], in->DA[ 1 ], in->DA[ 2 ], in->DA[ 3 ], in->DA[ 4 ] , in->DA[ 5 ]);
36 	PRINTF( FP_LOG, "[NCSI-Request] SA             : %02x %02x %02x %02x %02x %02x\n", in->SA[ 0 ], in->SA[ 1 ], in->SA[ 2 ], in->SA[ 3 ], in->SA[ 4 ] , in->SA[ 5 ]);
37 	PRINTF( FP_LOG, "[NCSI-Request] EtherType      : %04x\n", SWAP_2B_BEDN( in->EtherType )             );//DMTF NC-SI
38 	PRINTF( FP_LOG, "[NCSI-Request] MC_ID          : %02x\n", in->MC_ID                                 );//Management Controller should set this field to 0x00
39 	PRINTF( FP_LOG, "[NCSI-Request] Header_Revision: %02x\n", in->Header_Revision                       );//For NC-SI 1.0 spec, this field has to set 0x01
40 //	PRINTF( FP_LOG, "[NCSI-Request] Reserved_1     : %02x\n", in->Reserved_1                            ); //Reserved has to set to 0x00
41 	PRINTF( FP_LOG, "[NCSI-Request] IID            : %02x\n", in->IID                                   );//Instance ID
42 	PRINTF( FP_LOG, "[NCSI-Request] Command        : %02x\n", in->Command                               );
43 	PRINTF( FP_LOG, "[NCSI-Request] ChID           : %02x\n", in->ChID                                  );
44 	PRINTF( FP_LOG, "[NCSI-Request] Payload_Length : %04x\n", SWAP_2B_BEDN( in->Payload_Length )        );//Payload Length = 12 bits, 4 bits are reserved
45 //	PRINTF( FP_LOG, "[NCSI-Request] Reserved_2     : %04x\n", in->Reserved_2                            );
46 //	PRINTF( FP_LOG, "[NCSI-Request] Reserved_3     : %04x\n", in->Reserved_3                            );
47 //	PRINTF( FP_LOG, "[NCSI-Request] Reserved_4     : %04x\n", in->Reserved_4                            );
48 //	PRINTF( FP_LOG, "[NCSI-Request] Reserved_5     : %04x\n", in->Reserved_5                            );
49 	PRINTF( FP_LOG, "[NCSI-Request] Response_Code  : %04x\n", SWAP_2B_BEDN( in->Response_Code )         );
50 	PRINTF( FP_LOG, "[NCSI-Request] Reason_Code    : %04x\n", SWAP_2B_BEDN( in->Reason_Code )           );
51 	for ( i = 0; i < SWAP_2B_BEDN( in->Payload_Length ); i++ ) {
52 		switch ( i % 4 ) {
53 			case 0	: PRINTF( FP_LOG, "[NCSI-Request] Payload_Data   : %02x", in->Payload_Data[ i ]); break;
54 			case 3	: PRINTF( FP_LOG, " %02x\n", in->Payload_Data[ i ]); break;
55 			default	: PRINTF( FP_LOG, " %02x", in->Payload_Data[ i ]); break;
56 		}
57 	}
58 	if ( ( i % 4 ) != 3 )
59 		PRINTF( FP_LOG, "\n");
60 }
61 void ncsi_respdump (MAC_ENGINE *eng, NCSI_Response_Packet *in) {
62 	int     i;
63 //	PRINTF( FP_LOG, "[NCSI-Respond] DA             : %02x %02x %02x %02x %02x %02x\n", in->DA[ 5 ], in->DA[ 4 ], in->DA[ 3 ], in->DA[ 2 ], in->DA[ 1] , in->DA[ 0 ]);
64 //	PRINTF( FP_LOG, "[NCSI-Respond] SA             : %02x %02x %02x %02x %02x %02x\n", in->SA[ 5 ], in->SA[ 4 ], in->SA[ 3 ], in->SA[ 2 ], in->SA[ 1] , in->SA[ 0 ]);
65 	PRINTF( FP_LOG, "[NCSI-Respond] DA             : %02x %02x %02x %02x %02x %02x\n", in->DA[ 0 ], in->DA[ 1 ], in->DA[ 2 ], in->DA[ 3 ], in->DA[ 4 ] , in->DA[ 5 ]);
66 	PRINTF( FP_LOG, "[NCSI-Respond] SA             : %02x %02x %02x %02x %02x %02x\n", in->SA[ 0 ], in->SA[ 1 ], in->SA[ 2 ], in->SA[ 3 ], in->SA[ 4 ] , in->SA[ 5 ]);
67 	PRINTF( FP_LOG, "[NCSI-Respond] EtherType      : %04x\n", SWAP_2B_BEDN( in->EtherType )             );//DMTF NC-SI
68 	PRINTF( FP_LOG, "[NCSI-Respond] MC_ID          : %02x\n", in->MC_ID                                 );//Management Controller should set this field to 0x00
69 	PRINTF( FP_LOG, "[NCSI-Respond] Header_Revision: %02x\n", in->Header_Revision                       );//For NC-SI 1.0 spec, this field has to set 0x01
70 //	PRINTF( FP_LOG, "[NCSI-Respond] Reserved_1     : %02x\n", in->Reserved_1                            ); //Reserved has to set to 0x00
71 	PRINTF( FP_LOG, "[NCSI-Respond] IID            : %02x\n", in->IID                                   );//Instance ID
72 	PRINTF( FP_LOG, "[NCSI-Respond] Command        : %02x\n", in->Command                               );
73 	PRINTF( FP_LOG, "[NCSI-Respond] ChID           : %02x\n", in->ChID                                  );
74 	PRINTF( FP_LOG, "[NCSI-Respond] Payload_Length : %04x\n", SWAP_2B_BEDN( in->Payload_Length )        );//Payload Length = 12 bits, 4 bits are reserved
75 //	PRINTF( FP_LOG, "[NCSI-Respond] Reserved_2     : %04x\n", in->Reserved_2                            );
76 //	PRINTF( FP_LOG, "[NCSI-Respond] Reserved_3     : %04x\n", in->Reserved_3                            );
77 //	PRINTF( FP_LOG, "[NCSI-Respond] Reserved_4     : %04x\n", in->Reserved_4                            );
78 //	PRINTF( FP_LOG, "[NCSI-Respond] Reserved_5     : %04x\n", in->Reserved_5                            );
79 	PRINTF( FP_LOG, "[NCSI-Respond] Response_Code  : %04x\n", SWAP_2B_BEDN( in->Response_Code )         );
80 	PRINTF( FP_LOG, "[NCSI-Respond] Reason_Code    : %04x\n", SWAP_2B_BEDN( in->Reason_Code )           );
81 	for ( i = 0; i < SWAP_2B_BEDN( in->Payload_Length ); i++ ) {
82 		switch ( i % 4 ) {
83 			case 0	: PRINTF( FP_LOG, "[NCSI-Respond] Payload_Data   : %02x", in->Payload_Data[ i ]); break;
84 			case 3	: PRINTF( FP_LOG, " %02x\n", in->Payload_Data[ i ]); break;
85 			default	: PRINTF( FP_LOG, " %02x", in->Payload_Data[ i ]); break;
86 		}
87 	}
88 	if ( ( i % 4 ) != 3 )
89 		PRINTF( FP_LOG, "\n");
90 }
91 
92 //------------------------------------------------------------
93 void NCSI_PrintCommandStr (MAC_ENGINE *eng, unsigned char command, unsigned iid) {
94 	switch ( command & 0x80 ) {
95 		case 0x80   : sprintf(eng->dat.NCSI_CommandStr, "IID:%3d [%02x:Respond]", iid, command); break;
96 		default     : sprintf(eng->dat.NCSI_CommandStr, "IID:%3d [%02x:Request]", iid, command); break;
97 	}
98 	switch ( command & 0x7f ) {
99 		case 0x00   : sprintf(eng->dat.NCSI_CommandStr, "%s[CLEAR_INITIAL_STATE                ]", eng->dat.NCSI_CommandStr); break;
100 		case 0x01   : sprintf(eng->dat.NCSI_CommandStr, "%s[SELECT_PACKAGE                     ]", eng->dat.NCSI_CommandStr); break;
101 		case 0x02   : sprintf(eng->dat.NCSI_CommandStr, "%s[DESELECT_PACKAGE                   ]", eng->dat.NCSI_CommandStr); break;
102 		case 0x03   : sprintf(eng->dat.NCSI_CommandStr, "%s[ENABLE_CHANNEL                     ]", eng->dat.NCSI_CommandStr); break;
103 		case 0x04   : sprintf(eng->dat.NCSI_CommandStr, "%s[DISABLE_CHANNEL                    ]", eng->dat.NCSI_CommandStr); break;
104 		case 0x05   : sprintf(eng->dat.NCSI_CommandStr, "%s[RESET_CHANNEL                      ]", eng->dat.NCSI_CommandStr); break;
105 		case 0x06   : sprintf(eng->dat.NCSI_CommandStr, "%s[ENABLE_CHANNEL_NETWORK_TX          ]", eng->dat.NCSI_CommandStr); break;
106 		case 0x07   : sprintf(eng->dat.NCSI_CommandStr, "%s[DISABLE_CHANNEL_NETWORK_TX         ]", eng->dat.NCSI_CommandStr); break;
107 		case 0x08   : sprintf(eng->dat.NCSI_CommandStr, "%s[AEN_ENABLE                         ]", eng->dat.NCSI_CommandStr); break;
108 		case 0x09   : sprintf(eng->dat.NCSI_CommandStr, "%s[SET_LINK                           ]", eng->dat.NCSI_CommandStr); break;
109 		case 0x0A   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_LINK_STATUS                    ]", eng->dat.NCSI_CommandStr); break;
110 		case 0x0B   : sprintf(eng->dat.NCSI_CommandStr, "%s[SET_VLAN_FILTER                    ]", eng->dat.NCSI_CommandStr); break;
111 		case 0x0C   : sprintf(eng->dat.NCSI_CommandStr, "%s[ENABLE_VLAN                        ]", eng->dat.NCSI_CommandStr); break;
112 		case 0x0D   : sprintf(eng->dat.NCSI_CommandStr, "%s[DISABLE_VLAN                       ]", eng->dat.NCSI_CommandStr); break;
113 		case 0x0E   : sprintf(eng->dat.NCSI_CommandStr, "%s[SET_MAC_ADDRESS                    ]", eng->dat.NCSI_CommandStr); break;
114 		case 0x10   : sprintf(eng->dat.NCSI_CommandStr, "%s[ENABLE_BROADCAST_FILTERING         ]", eng->dat.NCSI_CommandStr); break;
115 		case 0x11   : sprintf(eng->dat.NCSI_CommandStr, "%s[DISABLE_BROADCAST_FILTERING        ]", eng->dat.NCSI_CommandStr); break;
116 		case 0x12   : sprintf(eng->dat.NCSI_CommandStr, "%s[ENABLE_GLOBAL_MULTICAST_FILTERING  ]", eng->dat.NCSI_CommandStr); break;
117 		case 0x13   : sprintf(eng->dat.NCSI_CommandStr, "%s[DISABLE_GLOBAL_MULTICAST_FILTERING ]", eng->dat.NCSI_CommandStr); break;
118 		case 0x14   : sprintf(eng->dat.NCSI_CommandStr, "%s[SET_NCSI_FLOW_CONTROL              ]", eng->dat.NCSI_CommandStr); break;
119 		case 0x15   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_VERSION_ID                     ]", eng->dat.NCSI_CommandStr); break;
120 		case 0x16   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_CAPABILITIES                   ]", eng->dat.NCSI_CommandStr); break;
121 		case 0x17   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_PARAMETERS                     ]", eng->dat.NCSI_CommandStr); break;
122 		case 0x18   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_CONTROLLER_PACKET_STATISTICS   ]", eng->dat.NCSI_CommandStr); break;
123 		case 0x19   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_NCSI_STATISTICS                ]", eng->dat.NCSI_CommandStr); break;
124 		case 0x1A   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_NCSI_PASS_THROUGH_STATISTICS   ]", eng->dat.NCSI_CommandStr); break;
125 		case 0x50   : sprintf(eng->dat.NCSI_CommandStr, "%s[OEM_COMMAND                        ]", eng->dat.NCSI_CommandStr); break;
126 		default     : sprintf(eng->dat.NCSI_CommandStr, "%s Not Support Command", eng->dat.NCSI_CommandStr); break ;
127 	}
128 } // End void NCSI_PrintCommandStr (MAC_ENGINE *eng, unsigned char command, unsigned iid)
129 
130 //------------------------------------------------------------
131 void NCSI_PrintCommandType (MAC_ENGINE *eng, unsigned char command, unsigned iid) {
132 	NCSI_PrintCommandStr( eng, command, iid );
133 	printf("[NCSI-commd]%s\n", eng->dat.NCSI_CommandStr);
134 }
135 
136 //------------------------------------------------------------
137 void NCSI_PrintCommandType2File (MAC_ENGINE *eng, unsigned char command, unsigned iid) {
138 	NCSI_PrintCommandStr( eng, command, iid );
139 	PRINTF( FP_LOG, "[NCSI-commd]%s\n", eng->dat.NCSI_CommandStr );
140 }
141 
142 //------------------------------------------------------------
143 void NCSI_Struct_Initialize_SLT (MAC_ENGINE *eng)
144 {
145 	int i;
146 	uint32_t NCSI_RxDatBase;
147 
148 	eng->run.NCSI_RxTimeOutScale = 1;
149 
150 	for (i = 0; i < 6; i++) {
151 		eng->ncsi_req.DA[i] = 0xFF;
152 		eng->ncsi_req.SA[i] = eng->inf.SA[i];
153 	}
154 
155 	/* EtherType = 0x88F8 (DMTF DSP0222 NC-SI spec)
156 	ethernet frame header format, table 8 */
157 	eng->ncsi_req.EtherType = SWAP_2B_BEDN(0x88F8);
158 
159 	eng->ncsi_req.MC_ID           = 0;
160 	eng->ncsi_req.Header_Revision = 0x01;
161 	eng->ncsi_req.Reserved_1      = 0;
162 	eng->ncsi_req.IID             = 0;
163 //	eng->ncsi_req.Command         = 0;
164 //	eng->ncsi_req.ChID            = 0;
165 //	eng->ncsi_req.Payload_Length  = 0;
166 
167 	eng->ncsi_req.Response_Code   = 0;
168 	eng->ncsi_req.Reason_Code     = 0;
169 	eng->ncsi_req.Reserved_2      = 0;
170 	eng->ncsi_req.Reserved_3      = 0;
171 
172 	eng->dat.NCSI_TxByteBUF = (unsigned char *) &eng->dat.NCSI_TxDWBUF[0];
173 	eng->dat.NCSI_RxByteBUF = (unsigned char *) &eng->dat.NCSI_RxDWBUF[0];
174 
175 	eng->run.ncsi_tdes_base = eng->run.tdes_base;//base for read/write
176 	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x04, 0                        );
177 	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x08, 0                        );
178 	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x0C, DMA_BASE - ASPEED_DRAM_BASE);
179 
180 	eng->run.ncsi_rdes_base = eng->run.rdes_base;//base for read/write
181 	NCSI_RxDatBase = AT_MEMRW_BUF( NCSI_RxDMA_BASE );//base of the descriptor
182 
183 	for (i = 0; i < NCSI_RxDESNum - 1; i++) {
184 		Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base        ), 0x00000000     );
185 		Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x04 ), 0x00000000     );
186 		Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x08 ), 0x00000000     );
187 		Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x0C ), NCSI_RxDatBase );
188 		eng->run.ncsi_rdes_base += 16;
189 		NCSI_RxDatBase += NCSI_RxDMA_PakSize;
190 	}
191 	Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base        ), EOR_IniVal     );
192 	Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x04 ), 0x00000000     );
193 	Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x08 ), 0x00000000     );
194 //	Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x0C ), (NCSI_RxDatBase + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
195 	Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x0C ), NCSI_RxDatBase ); // 20130730
196 
197 	eng->run.ncsi_rdes_base = eng->run.rdes_base;//base for read/write
198 }
199 
200 //------------------------------------------------------------
201 void Calculate_Checksum_NCSI (MAC_ENGINE *eng, unsigned char *buffer_base, int Length) {
202 	uint32_t      CheckSum = 0;
203 	uint32_t      Data;
204 	uint32_t      Data1;
205 	int        i;
206 
207 	// Calculate checksum is from byte 14 of ethernet Haeder and Control packet header
208 	// Page 50, NC-SI spec. ver. 1.0.0 form DMTF
209 	for (i = 14; i < Length; i += 2 ) {
210 		Data      = buffer_base[i];
211 		Data1     = buffer_base[i + 1];
212 		CheckSum += ((Data << 8) + Data1);
213 	}
214 	eng->dat.Payload_Checksum_NCSI = SWAP_4B_BEDN(~(CheckSum) + 1); //2's complement
215 }
216 
217 /**
218  * @brief	check error mask in RX descriptor
219  * @param	rx_desc0	RX descript[0]
220 */
221 static int check_rx_desc_err(MAC_ENGINE *p_eng, uint32_t rx_desc0)
222 {
223 	uint8_t prefix[8] = "[RxDes]";
224 
225 	if (rx_desc0 & RXDES_EM_ALL) {
226 #ifdef CheckRxErr
227 		if (rx_desc0 & RXDES_EM_RXERR) {
228 			PRINTF(STD_OUT, "%s Error RxErr        %08x\n", prefix,
229 			       rx_desc0);
230 			p_eng->dat.NCSI_RxEr = 1;
231 		}
232 #endif
233 
234 #ifdef CheckCRC
235 		if (rx_desc0 & RXDES_EM_CRC) {
236 			PRINTF(STD_OUT, "%s Error CRC          %08x\n", prefix,
237 			       rx_desc0);
238 			FindErr_Des(p_eng, Des_Flag_CRC);
239 		}
240 #endif
241 
242 #ifdef CheckFTL
243 		if (rx_desc0 & RXDES_EM_FTL) {
244 			PRINTF(STD_OUT, "%s Error FTL          %08x\n", prefix,
245 			       rx_desc0);
246 			FindErr_Des(p_eng, Des_Flag_FTL);
247 		}
248 #endif
249 
250 #ifdef CheckRunt
251 		if (rx_desc0 & RXDES_EM_RUNT) {
252 			PRINTF(STD_OUT, "%s Error Runt         %08x\n", prefix,
253 			       rx_desc0);
254 			FindErr_Des(p_eng, Des_Flag_Runt);
255 		}
256 #endif
257 
258 #ifdef CheckOddNibble
259 		if (rx_desc0 & RXDES_EM_ODD_NB) {
260 			PRINTF(STD_OUT, "%s Odd Nibble         %08x\n", prefix,
261 			       rx_desc0);
262 			FindErr_Des(p_eng, Des_Flag_OddNibble);
263 		}
264 #endif
265 
266 #ifdef CheckRxFIFOFull
267 		if (rx_desc0 & RXDES_EM_FIFO_FULL) {
268 			PRINTF(STD_OUT, "%s Error Rx FIFO Full %08x\n", prefix,
269 			       rx_desc0);
270 			FindErr_Des(p_eng, Des_Flag_RxFIFOFull);
271 		}
272 #endif
273 	}
274 
275 	return 0;
276 }
277 
278 //------------------------------------------------------------
279 // return 0: it is PASS
280 // return 1: it is FAIL
281 //------------------------------------------------------------
282 char NCSI_Rx_SLT (MAC_ENGINE *eng) {
283 	int        timeout = 0;
284 	int        bytesize;
285 	int        dwsize;
286 	int        i;
287 	int        retry   = 0;
288 	char       ret     = 1;
289 
290 	uint32_t      NCSI_RxDatBase;
291 	uint32_t      NCSI_RxDesDat;
292 	uint32_t      NCSI_RxData;
293 	uint32_t      NCSI_BufData;
294 
295 	do {
296 		mac_reg_write( eng, 0x1C, 0x00000000 );//Rx Poll
297 
298 		timeout = 0;
299 		do {
300 			NCSI_RxDesDat = Read_Mem_Des_NCSI_DD( eng->run.ncsi_rdes_base );
301 			if ( ++timeout > TIME_OUT_NCSI * eng->run.NCSI_RxTimeOutScale ) {
302 				PRINTF( FP_LOG, "[RxDes] DesOwn timeout     %08x\n", NCSI_RxDesDat );
303 				return( FindErr( eng, Err_Flag_NCSI_Check_RxOwnTimeOut ) );
304 			}
305 		} while( HWOwnRx( NCSI_RxDesDat ) );
306 
307 		check_rx_desc_err(eng, NCSI_RxDesDat);
308 
309 		// Get point of RX DMA buffer
310 		NCSI_RxDatBase = AT_BUF_MEMRW( Read_Mem_Des_NCSI_DD( eng->run.ncsi_rdes_base + 0x0C ) );//base for read/write
311 		NCSI_RxData    = SWAP_4B_LEDN_NCSI( SWAP_4B_LEDN( Read_Mem_Dat_NCSI_DD( NCSI_RxDatBase + 0x0C ) ) );
312 
313 		// Get RX valid data in offset 00h of RXDS#0
314 #ifdef NCSI_Skip_RxCRCData
315 		bytesize  = (NCSI_RxDesDat & 0x3fff) - 4;
316 #else
317 		bytesize  = (NCSI_RxDesDat & 0x3fff);
318 #endif
319 		// Fill up to multiple of 4
320 		if ( ( bytesize % 4 ) != 0 )
321 			dwsize = ( bytesize >> 2 ) + 1;
322 		else
323 			dwsize = bytesize >> 2;
324 
325 		if ( eng->arg.ctrl.b.print_ncsi ) {
326 #ifdef NCSI_Skip_RxCRCData
327 			PRINTF( FP_LOG ,"----->[Rx] %d bytes(%xh) [Remove CRC data]\n", bytesize, bytesize );
328 #else
329 			PRINTF( FP_LOG ,"----->[Rx] %d bytes(%xh)\n", bytesize, bytesize );
330 #endif
331 			for (i = 0; i < dwsize - 1; i++) {
332 				NCSI_BufData = SWAP_4B_LEDN_NCSI( Read_Mem_Dat_NCSI_DD( NCSI_RxDatBase + ( i << 2 ) ) );
333 				PRINTF( FP_LOG ,"      [Rx]%02d:%08x %08x\n", i, NCSI_BufData, SWAP_4B( NCSI_BufData ) );
334 			}
335 
336 			i = ( dwsize - 1 );
337 			NCSI_BufData = SWAP_4B_LEDN_NCSI( Read_Mem_Dat_NCSI_DD( NCSI_RxDatBase + ( i << 2 ) ) );
338 			switch ( bytesize % 4 ) {
339 				case 0  : PRINTF( FP_LOG ,"      [Rx]%02d:%08x %08x\n",                          i, NCSI_BufData & SWAP_4B_LEDN_NCSI( 0xffffffff ), SWAP_4B( NCSI_BufData ) & SWAP_4B_BEDN_NCSI( 0xffffffff ) ); break;
340 				case 3  : PRINTF( FP_LOG ,"      [Rx]%02d:%08x %08x [%08x %08x][%08x %08x]\n", i, NCSI_BufData & SWAP_4B_LEDN_NCSI( 0x00ffffff ), SWAP_4B( NCSI_BufData ) & SWAP_4B_BEDN_NCSI( 0x00ffffff ), NCSI_BufData, SWAP_4B( NCSI_BufData ), SWAP_4B_LEDN_NCSI( 0x00ffffff ), SWAP_4B_BEDN_NCSI( 0x00ffffff ) ); break;
341 				case 2  : PRINTF( FP_LOG ,"      [Rx]%02d:%08x %08x [%08x %08x][%08x %08x]\n", i, NCSI_BufData & SWAP_4B_LEDN_NCSI( 0x0000ffff ), SWAP_4B( NCSI_BufData ) & SWAP_4B_BEDN_NCSI( 0x0000ffff ), NCSI_BufData, SWAP_4B( NCSI_BufData ), SWAP_4B_LEDN_NCSI( 0x0000ffff ), SWAP_4B_BEDN_NCSI( 0x0000ffff ) ); break;
342 				case 1  : PRINTF( FP_LOG ,"      [Rx]%02d:%08x %08x [%08x %08x][%08x %08x]\n", i, NCSI_BufData & SWAP_4B_LEDN_NCSI( 0x000000ff ), SWAP_4B( NCSI_BufData ) & SWAP_4B_BEDN_NCSI( 0x000000ff ), NCSI_BufData, SWAP_4B( NCSI_BufData ), SWAP_4B_LEDN_NCSI( 0x000000ff ), SWAP_4B_BEDN_NCSI( 0x000000ff ) ); break;
343 				default : PRINTF( FP_LOG ,"      [Rx]%02d:error", i ); break;
344 			}
345 		}
346 
347 		// EtherType field of the response packet should be 0x88F8
348 //
349 		if ( ( NCSI_RxData & 0xffff ) == 0xf888 ) {
350 			for (i = 0; i < dwsize; i++)
351 				eng->dat.NCSI_RxDWBUF[i] = SWAP_4B_LEDN_NCSI( Read_Mem_Dat_NCSI_DD( NCSI_RxDatBase + ( i << 2 ) ) );
352 
353 			memcpy ( &eng->ncsi_rsp, eng->dat.NCSI_RxByteBUF, bytesize );
354 
355 			if ( eng->arg.ctrl.b.print_ncsi )
356 				PRINTF( FP_LOG ,"[Frm-NCSI][Rx IID:%2d]\n", eng->ncsi_rsp.IID );
357 
358 			if ( ( eng->ncsi_rsp.IID == 0x0 ) && ( eng->ncsi_rsp.Command == 0xff ) ) { // AEN Packet
359 				if ( eng->arg.ctrl.b.print_ncsi )
360 					PRINTF( FP_LOG ,"[Frm-NCSI][AEN Packet]Type:%2d\n", SWAP_2B_BEDN( eng->ncsi_rsp.Reason_Code ) & 0xff );
361 			}
362 			else {
363 				ret = 0;
364 			}
365 		}
366 		else {
367 			if ( eng->arg.ctrl.b.print_ncsi )
368 				PRINTF( FP_LOG, "[Frm-Skip] Not NCSI Response: [%08x & %08x = %08x]!=[%08x]\n", NCSI_RxData, 0xffff, NCSI_RxData & 0xffff, 0xf888 );
369 		} // End if ( ( NCSI_RxData & 0xffff ) == 0xf888 )
370 
371 		if ( HWEOR( NCSI_RxDesDat ) ) {
372 			// it is last the descriptor in the receive Ring
373 			Write_Mem_Des_NCSI_DD( eng->run.ncsi_rdes_base     , EOR_IniVal    );
374 			eng->run.ncsi_rdes_base = eng->run.rdes_base;//base for read/write
375 		}
376 		else {
377 			Write_Mem_Des_NCSI_DD( eng->run.ncsi_rdes_base     , 0x00000000    );
378 			eng->run.ncsi_rdes_base += 16;
379 		}
380 
381 		if ( ret == 0 )
382 			break;
383 		retry++;
384 	} while ( retry < NCSI_RxDESNum );
385 
386 	if ( ( ret == 0 ) && eng->arg.ctrl.b.print_ncsi ) {
387 #ifdef Print_DetailFrame
388 		ncsi_respdump ( eng, &eng->ncsi_rsp );
389 #else
390 		PRINTF( FP_LOG, "[NCSI-Respond] ETyp:%04x MC_ID:%02x HeadVer:%02x IID:%02x Comm:%02x ChlID:%02x PayLen:%04x ResCd:%02x ReaCd:%02x\n",
391 		SWAP_2B_BEDN( eng->ncsi_rsp.EtherType ),
392 		eng->ncsi_rsp.MC_ID,
393 		eng->ncsi_rsp.Header_Revision,
394 		eng->ncsi_rsp.IID,
395 		eng->ncsi_rsp.Command,
396 		eng->ncsi_rsp.ChID,
397 		SWAP_2B_BEDN( eng->ncsi_rsp.Payload_Length ),
398 		SWAP_2B_BEDN( eng->ncsi_rsp.Response_Code ),
399 		SWAP_2B_BEDN( eng->ncsi_rsp.Reason_Code ));
400 #endif
401 
402 		NCSI_PrintCommandType2File( eng, eng->ncsi_rsp.Command, eng->ncsi_rsp.IID );
403 	}
404 
405 	return( ret );
406 } // End char NCSI_Rx_SLT (MAC_ENGINE *eng)
407 
408 //------------------------------------------------------------
409 char NCSI_Tx (MAC_ENGINE *eng, unsigned char command, unsigned char allid, uint16_t length) {
410 	int        bytesize;
411 	int        dwsize;
412 	int        i;
413 	int        timeout = 0;
414 	uint32_t      NCSI_TxDesDat;
415 
416 	eng->ncsi_req.IID++;
417 	eng->ncsi_req.Command        = command;
418 	eng->ncsi_req.ChID           = allid;
419 	eng->ncsi_req.Payload_Length = SWAP_2B_BEDN( length );
420 
421 	memcpy (  eng->dat.NCSI_TxByteBUF               , &eng->ncsi_req                 , 30     );
422 	memcpy ( (eng->dat.NCSI_TxByteBUF + 30         ), &eng->dat.NCSI_Payload_Data    , length );
423 	Calculate_Checksum_NCSI( eng, eng->dat.NCSI_TxByteBUF, 30 + length );
424 	memcpy ( (eng->dat.NCSI_TxByteBUF + 30 + length), &eng->dat.Payload_Checksum_NCSI, 4      );
425 
426 	// Header of NC-SI command format is 34 bytes. page 58, NC-SI spec. ver 1.0.0 from DMTF
427 	// The minimum size of a NC-SI package is 64 bytes.
428 	bytesize = 34 + length;
429 	if ( bytesize < 60 ) {
430 		memset ( eng->dat.NCSI_TxByteBUF + bytesize, 0, 60 - bytesize );
431 		bytesize = 60;
432 	}
433 
434 	// Fill up to multiple of 4
435 	//    dwsize = (bytesize + 3) >> 2;
436 	if ( ( bytesize % 4 ) != 0 )
437 		dwsize = ( bytesize >> 2 ) + 1;
438 	else
439 		dwsize = bytesize >> 2;
440 
441 	if ( eng->arg.ctrl.b.print_ncsi ) {
442 		if ( bytesize % 4 )
443 			memset ( eng->dat.NCSI_TxByteBUF + bytesize, 0, (dwsize << 2) - bytesize );
444 
445 		PRINTF( FP_LOG ,"----->[Tx] %d bytes(%xh)\n", bytesize, bytesize );
446 		for ( i = 0; i < dwsize-1; i++ )
447 			PRINTF( FP_LOG, "      [Tx]%02d:%08x %08x\n", i, eng->dat.NCSI_TxDWBUF[i], SWAP_4B( eng->dat.NCSI_TxDWBUF[i] ) );
448 
449 		i = dwsize - 1;
450 		switch ( bytesize % 4 ) {
451 			case 0  : PRINTF( FP_LOG ,"      [Tx]%02d:%08x %08x\n",                          i, eng->dat.NCSI_TxDWBUF[i] & SWAP_4B_LEDN_NCSI( 0xffffffff ), SWAP_4B( eng->dat.NCSI_TxDWBUF[i] ) & SWAP_4B_BEDN_NCSI( 0xffffffff ) ); break;
452 			case 3  : PRINTF( FP_LOG ,"      [Tx]%02d:%08x %08x [%08x %08x][%08x %08x]\n", i, eng->dat.NCSI_TxDWBUF[i] & SWAP_4B_LEDN_NCSI( 0x00ffffff ), SWAP_4B( eng->dat.NCSI_TxDWBUF[i] ) & SWAP_4B_BEDN_NCSI( 0x00ffffff ), eng->dat.NCSI_TxDWBUF[i], SWAP_4B( eng->dat.NCSI_TxDWBUF[i] ), SWAP_4B_LEDN_NCSI( 0x00ffffff ), SWAP_4B_BEDN_NCSI( 0x00ffffff ) ); break;
453 			case 2  : PRINTF( FP_LOG ,"      [Tx]%02d:%08x %08x [%08x %08x][%08x %08x]\n", i, eng->dat.NCSI_TxDWBUF[i] & SWAP_4B_LEDN_NCSI( 0x0000ffff ), SWAP_4B( eng->dat.NCSI_TxDWBUF[i] ) & SWAP_4B_BEDN_NCSI( 0x0000ffff ), eng->dat.NCSI_TxDWBUF[i], SWAP_4B( eng->dat.NCSI_TxDWBUF[i] ), SWAP_4B_LEDN_NCSI( 0x0000ffff ), SWAP_4B_BEDN_NCSI( 0x0000ffff ) ); break;
454 			case 1  : PRINTF( FP_LOG ,"      [Tx]%02d:%08x %08x [%08x %08x][%08x %08x]\n", i, eng->dat.NCSI_TxDWBUF[i] & SWAP_4B_LEDN_NCSI( 0x000000ff ), SWAP_4B( eng->dat.NCSI_TxDWBUF[i] ) & SWAP_4B_BEDN_NCSI( 0x000000ff ), eng->dat.NCSI_TxDWBUF[i], SWAP_4B( eng->dat.NCSI_TxDWBUF[i] ), SWAP_4B_LEDN_NCSI( 0x000000ff ), SWAP_4B_BEDN_NCSI( 0x000000ff ) ); break;
455 			default : PRINTF( FP_LOG ,"      [Tx]%02d:error", i ); break;
456 		}
457 		PRINTF( FP_LOG ,"[Frm-NCSI][Tx IID:%2d]\n", eng->ncsi_req.IID );
458 	}
459 
460 #if 1
461 	// Copy data to DMA buffer
462 	for ( i = 0; i < dwsize; i++ )
463 		Write_Mem_Dat_NCSI_DD( DMA_BASE + ( i << 2 ), SWAP_4B_LEDN_NCSI( eng->dat.NCSI_TxDWBUF[i] ) );
464 #endif
465 
466 	// Setting one TX descriptor
467 	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base       , 0xf0008000 + bytesize );
468 
469 //	mac_reg_write( eng, 0x40, eng->reg.MAC_040 ); // 20170505
470 
471 	// Fire
472 	mac_reg_write( eng, 0x18, 0x00000000 );//Tx Poll
473 
474 	do {
475 		NCSI_TxDesDat = Read_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base );
476 		if ( ++timeout > TIME_OUT_NCSI ) {
477 			PRINTF( FP_LOG, "[TxDes] DesOwn timeout     %08X\n", NCSI_TxDesDat );
478 			return( FindErr( eng, Err_Flag_NCSI_Check_TxOwnTimeOut  ));
479 		}
480 	} while ( HWOwnTx( NCSI_TxDesDat ) );
481 
482 	if ( eng->arg.ctrl.b.print_ncsi ) {
483 #ifdef Print_DetailFrame
484 		ncsi_reqdump ( eng, &eng->ncsi_req );
485 #else
486 		PRINTF( FP_LOG, "[NCSI-Request] ETyp:%04x MC_ID:%02x HeadVer:%02x IID:%02x Comm:%02x ChlID:%02x PayLen:%04x\n",
487 		SWAP_2B_BEDN( eng->ncsi_req.EtherType ),
488 		eng->ncsi_req.MC_ID,
489 		eng->ncsi_req.Header_Revision,
490 		eng->ncsi_req.IID,
491 		eng->ncsi_req.Command,
492 		eng->ncsi_req.ChID,
493 		SWAP_2B_BEDN( eng->ncsi_req.Payload_Length ) );
494 #endif
495 
496 		NCSI_PrintCommandType2File( eng, eng->ncsi_req.Command, eng->ncsi_req.IID );
497 	}
498 #ifdef Print_PackageName
499 	NCSI_PrintCommandType( eng, eng->ncsi_req.Command, eng->ncsi_req.IID );
500 #endif
501 
502 	return(0);
503 } // End char NCSI_Tx (MAC_ENGINE *eng, unsigned char command, unsigned char allid, uint16_t length)
504 
505 //------------------------------------------------------------
506 char NCSI_ARP (MAC_ENGINE *eng) {
507 	int        i;
508 	int        timeout = 0;
509 	uint32_t      NCSI_TxDesDat;
510 
511 	if ( eng->arg.ctrl.b.print_ncsi )
512 		PRINTF( FP_LOG ,"----->[ARP] 60 bytes x%d\n", eng->arg.GARPNumCnt );
513 
514 	for (i = 0; i < 15; i++) {
515 		if ( eng->arg.ctrl.b.print_ncsi )
516 			PRINTF( FP_LOG, "      [Tx%02d] %08x %08x\n", i, eng->dat.ARP_data[i], SWAP_4B( eng->dat.ARP_data[i] ) );
517 
518 		Write_Mem_Dat_NCSI_DD(((uint32_t)&dma_buf) + ( i << 2 ), eng->dat.ARP_data[i] );
519 	}
520 
521 //	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x04, 0                        );
522 //	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x08, 0                        );
523 //	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x0C, AT_MEMRW_BUF( DMA_BASE ) );
524 	for (i = 0; i < eng->arg.GARPNumCnt; i++) {
525 		Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base      , 0xf0008000 + 60);
526 		mac_reg_write( eng, 0x18, 0x00000000 );//Tx Poll
527 
528 		do {
529 			NCSI_TxDesDat = Read_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base );
530 			if ( ++timeout > TIME_OUT_NCSI ) {
531 				PRINTF( FP_LOG, "[TxDes-ARP] DesOwn timeout %08x\n", NCSI_TxDesDat );
532 				return( FindErr( eng, Err_Flag_NCSI_Check_ARPOwnTimeOut ) );
533 			}
534 		} while ( HWOwnTx( NCSI_TxDesDat ) );
535 	}
536 	return(0);
537 } // End char NCSI_ARP (MAC_ENGINE *eng)
538 
539 //------------------------------------------------------------
540 char NCSI_SentWaitPacket (MAC_ENGINE *eng, unsigned char command, unsigned char allid, uint16_t length) {
541 	int        Retry = 0;
542 
543 	do {
544 		if ( NCSI_Tx( eng, command, allid, length ) )
545 			return( 1 );
546 
547 #ifdef NCSI_EnableDelay_EachPackage
548 		DELAY( Delay_EachPackage );
549 #endif
550 		if ( NCSI_Rx_SLT( eng ) )
551 			return( 2 );
552 
553 		if (    ( eng->ncsi_rsp.IID           != eng->ncsi_req.IID                        )
554 		     || ( eng->ncsi_rsp.Command       != ( command | 0x80 )                       )
555 		     || ( eng->ncsi_rsp.Response_Code != SWAP_2B_BEDN( COMMAND_COMPLETED ) ) ) {
556 			if ( eng->arg.ctrl.b.print_ncsi ) {
557 				PRINTF( FP_LOG, "Retry: Command = %x, Response_Code = %x", eng->ncsi_req.Command, SWAP_2B_BEDN( eng->ncsi_rsp.Response_Code ) );
558 				switch ( SWAP_2B_BEDN( eng->ncsi_rsp.Response_Code ) ) {
559 					case COMMAND_COMPLETED  	: PRINTF( FP_LOG, "(completed  )\n" ); break;
560 					case COMMAND_FAILED     	: PRINTF( FP_LOG, "(failed     )\n" ); break;
561 					case COMMAND_UNAVAILABLE	: PRINTF( FP_LOG, "(unavailable)\n" ); break;
562 					case COMMAND_UNSUPPORTED	: PRINTF( FP_LOG, "(unsupported)\n" ); break;
563 					default                 	: PRINTF( FP_LOG, "(-----------)\n" ); break;
564 				}
565 			}
566 			Retry++;
567 		}
568 		else {
569 			return( 0 );
570 		}
571 	} while (Retry <= SENT_RETRY_COUNT);
572 
573 	return( 3 );
574 } // End char NCSI_SentWaitPacket (unsigned char command, unsigned char id, uint16_t length)
575 
576 //------------------------------------------------------------
577 char Clear_Initial_State_SLT (MAC_ENGINE *eng) {//Command:0x00
578 	char       return_value;
579 
580 	eng->flg.error_backup  = eng->flg.error;
581 	eng->flg.ncsi_backup = eng->flg.ncsi;
582 
583 	return_value = NCSI_SentWaitPacket( eng, CLEAR_INITIAL_STATE, eng->ncsi_cap.All_ID, 0 );//Internal Channel ID = 0
584 
585 	eng->flg.error  = eng->flg.error_backup;
586 	eng->flg.ncsi = eng->flg.ncsi_backup;
587 	return( return_value );//Internal Channel ID = 0
588 }
589 
590 //------------------------------------------------------------
591 char Select_Package_SLT (MAC_ENGINE *eng, char skipflag) {//Command:0x01
592 	char       return_value;
593 
594 	if ( skipflag ) {
595 		eng->flg.error_backup  = eng->flg.error;
596 		eng->flg.ncsi_backup = eng->flg.ncsi;
597 	}
598 
599 	memset ((void *)eng->dat.NCSI_Payload_Data, 0, 4);
600 	eng->dat.NCSI_Payload_Data[ 3 ] = 1; //Arbitration Disable
601 	return_value = NCSI_SentWaitPacket( eng, SELECT_PACKAGE, ( eng->ncsi_cap.Package_ID << 5 ) + 0x1F, 4 );//Internal Channel ID = 0x1F, 0x1F means all channel
602 	if ( return_value )
603 		ncsi_set_error_flag( eng, NCSI_Flag_Select_Package );
604 
605 	if ( skipflag ) {
606 		eng->flg.error  = eng->flg.error_backup;
607 		eng->flg.ncsi = eng->flg.ncsi_backup;
608 	}
609 	return( return_value );
610 }
611 
612 //------------------------------------------------------------
613 void Select_Active_Package_SLT (MAC_ENGINE *eng) {//Command:0x01
614 	memset ((void *)eng->dat.NCSI_Payload_Data, 0, 4);
615 	eng->dat.NCSI_Payload_Data[ 3 ] = 1; //Arbitration Disable
616 
617 	if ( NCSI_SentWaitPacket( eng, SELECT_PACKAGE, ( eng->ncsi_cap.Package_ID << 5 ) + 0x1F, 4 ) ) //Internal Channel ID = 0x1F, 0x1F means all channel
618 		ncsi_set_error_flag( eng, NCSI_Flag_Select_Active_Package );
619 }
620 
621 //------------------------------------------------------------
622 void DeSelect_Package_SLT (MAC_ENGINE *eng) {//Command:0x02
623 	if ( NCSI_SentWaitPacket( eng, DESELECT_PACKAGE, ( eng->ncsi_cap.Package_ID << 5 ) + 0x1F, 0 ) ) //Internal Channel ID = 0x1F, 0x1F means all channel
624 		ncsi_set_error_flag( eng, NCSI_Flag_Deselect_Package );
625 
626 #ifdef NCSI_EnableDelay_DeSelectPackage
627 	DELAY( Delay_DeSelectPackage );
628 #endif
629 }
630 
631 //------------------------------------------------------------
632 void Enable_Channel_SLT (MAC_ENGINE *eng) {//Command:0x03
633 	if ( NCSI_SentWaitPacket( eng, ENABLE_CHANNEL, eng->ncsi_cap.All_ID, 0 ) )
634 		ncsi_set_error_flag( eng, NCSI_Flag_Enable_Channel );
635 }
636 
637 //------------------------------------------------------------
638 void Disable_Channel_SLT (MAC_ENGINE *eng, char skipflag) {//Command:0x04
639 	if ( skipflag ) {
640 		eng->flg.error_backup  = eng->flg.error;
641 		eng->flg.ncsi_backup = eng->flg.ncsi;
642 	}
643 
644 	memset ((void *)eng->dat.NCSI_Payload_Data, 0, 4);
645 	eng->dat.NCSI_Payload_Data[ 3 ] = 0x1; //ALD
646 	if ( NCSI_SentWaitPacket( eng, DISABLE_CHANNEL, eng->ncsi_cap.All_ID, 4 ) )
647 		ncsi_set_error_flag( eng, NCSI_Flag_Disable_Channel );
648 
649 	if ( skipflag ) {
650 		eng->flg.error  = eng->flg.error_backup;
651 		eng->flg.ncsi = eng->flg.ncsi_backup;
652 	}
653 }
654 
655 //------------------------------------------------------------
656 void Enable_Network_TX_SLT (MAC_ENGINE *eng) {//Command:0x06
657 	if ( NCSI_SentWaitPacket( eng, ENABLE_CHANNEL_NETWORK_TX, eng->ncsi_cap.All_ID, 0 ) )
658 		ncsi_set_error_flag( eng, NCSI_Flag_Enable_Network_TX );
659 }
660 
661 //------------------------------------------------------------
662 void Disable_Network_TX_SLT (MAC_ENGINE *eng) {//Command:0x07
663 	if ( NCSI_SentWaitPacket( eng, DISABLE_CHANNEL_NETWORK_TX, eng->ncsi_cap.All_ID, 0 ) )
664 		ncsi_set_error_flag( eng, NCSI_Flag_Disable_Network_TX );
665 }
666 
667 //------------------------------------------------------------
668 void Set_Link_SLT (MAC_ENGINE *eng) {//Command:0x09
669 	memset ((void *)eng->dat.NCSI_Payload_Data, 0, 8);
670 	eng->dat.NCSI_Payload_Data[ 2 ] = 0x02; //full duplex
671 //	eng->dat.NCSI_Payload_Data[ 3 ] = 0x04; //100M, auto-disable
672 	eng->dat.NCSI_Payload_Data[ 3 ] = 0x05; //100M, auto-enable
673 
674 	if ( NCSI_SentWaitPacket( eng, SET_LINK, eng->ncsi_cap.All_ID, 8 ) )
675 		ncsi_set_error_flag( eng, NCSI_Flag_Set_Link );
676 }
677 
678 //------------------------------------------------------------
679 char Get_Link_Status_SLT (MAC_ENGINE *eng) {//Command:0x0a
680 	if ( NCSI_SentWaitPacket( eng, GET_LINK_STATUS, eng->ncsi_cap.All_ID, 0 ) )
681 		return(0);
682 	else {
683 		if ( eng->ncsi_rsp.Payload_Data[ 3 ] & 0x20 ) {
684 			if ( eng->ncsi_rsp.Payload_Data[ 3 ] & 0x40 ) {
685 				if ( eng->ncsi_rsp.Payload_Data[ 3 ] & 0x01 )
686 					return(1); //Link Up or Not
687 				else
688 					return(0);
689 			}
690 			else
691 				return(0); //Auto Negotiate did not finish
692 		}
693 		else {
694 			if ( eng->ncsi_rsp.Payload_Data[ 3 ] & 0x01 )
695 				return(1); //Link Up or Not
696 			else
697 				return(0);
698 		}
699 	}
700 } // End char Get_Link_Status_SLT (MAC_ENGINE *eng)
701 
702 //------------------------------------------------------------
703 void Enable_Set_MAC_Address_SLT (MAC_ENGINE *eng)
704 {
705 	//Command:0x0e
706 
707 	int        i;
708 
709 	for ( i = 0; i < 6; i++ )
710 		eng->dat.NCSI_Payload_Data[ i ] = eng->ncsi_req.SA[ i ];
711 	eng->dat.NCSI_Payload_Data[ 6 ] = 1; //MAC Address Num = 1 --> address filter 1, fixed in sample code
712 
713 	if ( eng->ncsi_req.SA[ 0 ] & 0x1 )
714 		eng->dat.NCSI_Payload_Data[ 7 ] = MULTICAST + ENABLE_MAC_ADDRESS_FILTER; //AT + E
715 	else
716 		eng->dat.NCSI_Payload_Data[ 7 ] = UNICAST   + ENABLE_MAC_ADDRESS_FILTER; //AT + E
717 
718 	if ( NCSI_SentWaitPacket( eng, SET_MAC_ADDRESS, eng->ncsi_cap.All_ID, 8 ) )
719 		ncsi_set_error_flag( eng, NCSI_Flag_Enable_Set_MAC_Address );
720 }
721 
722 //------------------------------------------------------------
723 void Enable_Broadcast_Filter_SLT (MAC_ENGINE *eng) {//Command:0x10
724 	memset ((void *)eng->dat.NCSI_Payload_Data, 0, 4);
725 	eng->dat.NCSI_Payload_Data[ 3 ] = 0xF; //ARP, DHCP, NetBIOS
726 
727 	if ( NCSI_SentWaitPacket( eng, ENABLE_BROADCAST_FILTERING, eng->ncsi_cap.All_ID, 4 ) )
728 		ncsi_set_error_flag( eng, NCSI_Flag_Enable_Broadcast_Filter );
729 }
730 
731 //------------------------------------------------------------
732 void Get_Version_ID_SLT (MAC_ENGINE *eng) {//Command:0x15
733 	if ( NCSI_SentWaitPacket( eng, GET_VERSION_ID, eng->ncsi_cap.All_ID, 0 ) )
734 		ncsi_set_error_flag( eng, NCSI_Flag_Get_Version_ID );
735 	else {
736 #ifdef Print_Version_ID
737 		printf("NCSI Version        : %02x %02x %02x %02x\n", eng->ncsi_rsp.Payload_Data[  0 ], eng->ncsi_rsp.Payload_Data[  1 ], eng->ncsi_rsp.Payload_Data[  2 ], eng->ncsi_rsp.Payload_Data[  3 ]);
738 		printf("NCSI Version        : %02x %02x %02x %02x\n", eng->ncsi_rsp.Payload_Data[  4 ], eng->ncsi_rsp.Payload_Data[  5 ], eng->ncsi_rsp.Payload_Data[  6 ], eng->ncsi_rsp.Payload_Data[  7 ]);
739 		printf("Firmware Name String: %02x %02x %02x %02x\n", eng->ncsi_rsp.Payload_Data[  8 ], eng->ncsi_rsp.Payload_Data[  9 ], eng->ncsi_rsp.Payload_Data[ 10 ], eng->ncsi_rsp.Payload_Data[ 11 ]);
740 		printf("Firmware Name String: %02x %02x %02x %02x\n", eng->ncsi_rsp.Payload_Data[ 12 ], eng->ncsi_rsp.Payload_Data[ 13 ], eng->ncsi_rsp.Payload_Data[ 14 ], eng->ncsi_rsp.Payload_Data[ 15 ]);
741 		printf("Firmware Name String: %02x %02x %02x %02x\n", eng->ncsi_rsp.Payload_Data[ 16 ], eng->ncsi_rsp.Payload_Data[ 17 ], eng->ncsi_rsp.Payload_Data[ 18 ], eng->ncsi_rsp.Payload_Data[ 19 ]);
742 		printf("Firmware Version    : %02x %02x %02x %02x\n", eng->ncsi_rsp.Payload_Data[ 20 ], eng->ncsi_rsp.Payload_Data[ 21 ], eng->ncsi_rsp.Payload_Data[ 22 ], eng->ncsi_rsp.Payload_Data[ 23 ]);
743 		printf("PCI DID/VID         : %02x %02x/%02x %02x\n", eng->ncsi_rsp.Payload_Data[ 24 ], eng->ncsi_rsp.Payload_Data[ 25 ], eng->ncsi_rsp.Payload_Data[ 26 ], eng->ncsi_rsp.Payload_Data[ 27 ]);
744 		printf("PCI SSID/SVID       : %02x %02x/%02x %02x\n", eng->ncsi_rsp.Payload_Data[ 28 ], eng->ncsi_rsp.Payload_Data[ 29 ], eng->ncsi_rsp.Payload_Data[ 30 ], eng->ncsi_rsp.Payload_Data[ 31 ]);
745 		printf("Manufacturer ID     : %02x %02x %02x %02x\n", eng->ncsi_rsp.Payload_Data[ 32 ], eng->ncsi_rsp.Payload_Data[ 33 ], eng->ncsi_rsp.Payload_Data[ 34 ], eng->ncsi_rsp.Payload_Data[ 35 ]);
746 		printf("Checksum            : %02x %02x %02x %02x\n", eng->ncsi_rsp.Payload_Data[ 36 ], eng->ncsi_rsp.Payload_Data[ 37 ], eng->ncsi_rsp.Payload_Data[ 38 ], eng->ncsi_rsp.Payload_Data[ 39 ]);
747 #endif
748 		eng->ncsi_cap.PCI_DID_VID    = (eng->ncsi_rsp.Payload_Data[ 24 ]<<24)
749 		                             | (eng->ncsi_rsp.Payload_Data[ 25 ]<<16)
750 		                             | (eng->ncsi_rsp.Payload_Data[ 26 ]<< 8)
751 		                             | (eng->ncsi_rsp.Payload_Data[ 27 ]    );
752 		eng->ncsi_cap.manufacturer_id = (eng->ncsi_rsp.Payload_Data[ 32 ]<<24)
753 		                             | (eng->ncsi_rsp.Payload_Data[ 33 ]<<16)
754 		                             | (eng->ncsi_rsp.Payload_Data[ 34 ]<< 8)
755 		                             | (eng->ncsi_rsp.Payload_Data[ 35 ]    );
756 	}
757 } // End void Get_Version_ID_SLT (MAC_ENGINE *eng)
758 
759 //------------------------------------------------------------
760 void Get_Capabilities_SLT (MAC_ENGINE *eng) {//Command:0x16
761 	if ( NCSI_SentWaitPacket( eng, GET_CAPABILITIES, eng->ncsi_cap.All_ID, 0 ) )
762 		ncsi_set_error_flag( eng, NCSI_Flag_Get_Capabilities );
763 	else {
764 //		eng->ncsi_cap.Capabilities_Flags                   = (eng->ncsi_rsp.Payload_Data[  0 ]<<24)
765 //		                                                   | (eng->ncsi_rsp.Payload_Data[  1 ]<<16)
766 //		                                                   | (eng->ncsi_rsp.Payload_Data[  2 ]<< 8)
767 //		                                                   | (eng->ncsi_rsp.Payload_Data[  3 ]    );
768 //		eng->ncsi_cap.Broadcast_Packet_Filter_Capabilities = (eng->ncsi_rsp.Payload_Data[  4 ]<<24)
769 //		                                                   | (eng->ncsi_rsp.Payload_Data[  5 ]<<16)
770 //		                                                   | (eng->ncsi_rsp.Payload_Data[  6 ]<< 8)
771 //		                                                   | (eng->ncsi_rsp.Payload_Data[  7 ]    );
772 //		eng->ncsi_cap.Multicast_Packet_Filter_Capabilities = (eng->ncsi_rsp.Payload_Data[  8 ]<<24)
773 //		                                                   | (eng->ncsi_rsp.Payload_Data[  9 ]<<16)
774 //		                                                   | (eng->ncsi_rsp.Payload_Data[ 10 ]<< 8)
775 //		                                                   | (eng->ncsi_rsp.Payload_Data[ 11 ]    );
776 //		eng->ncsi_cap.Buffering_Capabilities               = (eng->ncsi_rsp.Payload_Data[ 12 ]<<24)
777 //		                                                   | (eng->ncsi_rsp.Payload_Data[ 13 ]<<16)
778 //		                                                   | (eng->ncsi_rsp.Payload_Data[ 14 ]<< 8)
779 //		                                                   | (eng->ncsi_rsp.Payload_Data[ 15 ]    );
780 //		eng->ncsi_cap.AEN_Control_Support                  = (eng->ncsi_rsp.Payload_Data[ 16 ]<<24)
781 //		                                                   | (eng->ncsi_rsp.Payload_Data[ 17 ]<<16)
782 //		                                                   | (eng->ncsi_rsp.Payload_Data[ 18 ]<< 8)
783 //		                                                   | (eng->ncsi_rsp.Payload_Data[ 19 ]    );
784 //		eng->ncsi_cap.VLAN_Filter_Count                    =  eng->ncsi_rsp.Payload_Data[ 20 ];
785 		eng->ncsi_cap.Mixed_Filter_Count                   =  eng->ncsi_rsp.Payload_Data[ 21 ];
786 //		eng->ncsi_cap.Multicast_Filter_Count               =  eng->ncsi_rsp.Payload_Data[ 22 ];
787 		eng->ncsi_cap.Unicast_Filter_Count                 =  eng->ncsi_rsp.Payload_Data[ 23 ];
788 //		eng->ncsi_cap.VLAN_Mode_Support                    =  eng->ncsi_rsp.Payload_Data[ 26 ]
789 		eng->ncsi_cap.Channel_Count                        =  eng->ncsi_rsp.Payload_Data[ 27 ];
790 	}
791 }
792 
793 //------------------------------------------------------------
794 void Get_Controller_Packet_Statistics_SLT (MAC_ENGINE *eng) {//Command:0x18
795 	if ( NCSI_SentWaitPacket( eng, GET_CONTROLLER_PACKET_STATISTICS, eng->ncsi_cap.All_ID, 0 ) )
796 		ncsi_set_error_flag( eng, NCSI_Flag_Get_Controller_Packet_Statistics );
797 }
798 
799 //------------------------------------------------------------
800 char phy_ncsi (MAC_ENGINE *eng)
801 {
802 	uint32_t pkg_idx;
803 	uint32_t chl_idx;
804 	uint32_t select_flag[MAX_PACKAGE_NUM];
805 #ifdef NCSI_VERBOSE_TEST
806 	uint32_t Re_Send;
807 	uint32_t Link_Status;
808 #endif
809 	eng->dat.NCSI_RxEr = 0;
810 	eng->dat.number_chl = 0;
811 	eng->dat.number_pak = 0;
812 	eng->ncsi_cap.Package_ID = 0;
813 	eng->ncsi_cap.Channel_ID = 0x1F;
814 	eng->ncsi_cap.All_ID = 0x1F;
815 	PRINTF(FP_LOG, "\n\n======> Start:\n");
816 
817 	NCSI_Struct_Initialize_SLT(eng);
818 
819 #ifdef NCSI_Skip_Phase1_DeSelectPackage
820 #else
821 	//NCSI Start
822 	//Disable Channel then DeSelect Package
823 	for (pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++) {
824 		eng->ncsi_cap.Package_ID = pkg_idx;
825 		eng->ncsi_cap.Channel_ID = 0x1F;
826 		eng->ncsi_cap.All_ID     = ( eng->ncsi_cap.Package_ID << 5) + eng->ncsi_cap.Channel_ID;
827 
828 		select_flag[ pkg_idx ] = Select_Package_SLT ( eng, 1 ); //skipflag// Command:0x01
829 
830 		if ( select_flag[ pkg_idx ] == 0 ) {
831 			if ( !eng->run.IO_MrgChk ) {
832 				printf("----Find Package ID: %d\n", eng->ncsi_cap.Package_ID);
833 				PRINTF(FP_LOG, "----Find Package ID: %d\n", eng->ncsi_cap.Package_ID );
834 			}
835 			for ( chl_idx = 0; chl_idx < MAX_CHANNEL_NUM; chl_idx++ ) {
836 				eng->ncsi_cap.Channel_ID = chl_idx;
837 				eng->ncsi_cap.All_ID     = ( eng->ncsi_cap.Package_ID << 5) + eng->ncsi_cap.Channel_ID;
838 
839 				Disable_Channel_SLT( eng, 1 );//skipflag // Command: 0x04
840 			}
841   #ifdef NCSI_Skip_DeSelectPackage
842   #else
843 			DeSelect_Package_SLT ( eng ); // Command:0x02
844   #endif
845 		} else {
846 			if ( !eng->run.IO_MrgChk ) {
847 				printf("----Absence of Package ID: %d\n", pkg_idx);
848 				PRINTF( FP_LOG, "----Absence of Package ID: %d\n", pkg_idx );
849 			}
850 		} // End if ( select_flag[ pkg_idx ] == 0 )
851 	} // End for (pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++)
852 #endif
853 
854 	//Select Package
855 	for ( pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++ ) {
856 		eng->ncsi_cap.Package_ID = pkg_idx;
857 		eng->ncsi_cap.Channel_ID = 0x1F;
858 		eng->ncsi_cap.All_ID     = ( eng->ncsi_cap.Package_ID << 5) + eng->ncsi_cap.Channel_ID;
859 
860 #ifdef NCSI_Skip_Phase1_DeSelectPackage
861 		select_flag[ pkg_idx ] = Select_Package_SLT ( eng, 1 ); //skipflag//Command:0x01
862 #endif
863 
864 		if ( select_flag[ pkg_idx ] == 0 ) {
865 			//eng->run.NCSI_RxTimeOutScale = 1000;
866 			eng->run.NCSI_RxTimeOutScale = 10;
867 
868 #ifdef NCSI_Skip_Phase1_DeSelectPackage
869 #else
870 			Select_Package_SLT ( eng, 0 );//Command:0x01
871 #endif
872 			eng->dat.number_pak++;
873 			if ( !eng->run.IO_MrgChk ) {
874 				printf("====Find Package ID: %d\n", eng->ncsi_cap.Package_ID);
875 				PRINTF(FP_LOG, "====Find Package ID: %d\n", eng->ncsi_cap.Package_ID );
876 			}
877 
878 			// Scan all channel in the package
879 			for ( chl_idx = 0; chl_idx < MAX_CHANNEL_NUM; chl_idx++ ) {
880 				eng->ncsi_cap.Channel_ID = chl_idx;
881 				eng->ncsi_cap.All_ID     = ( eng->ncsi_cap.Package_ID << 5) + eng->ncsi_cap.Channel_ID;
882 
883 				if ( Clear_Initial_State_SLT( eng ) == 0 ) { //Command:0x00
884 					eng->dat.number_chl++;
885 					if ( !eng->run.IO_MrgChk ) {
886 						printf("--------Find Channel ID: %d\n", eng->ncsi_cap.Channel_ID);
887 						PRINTF( FP_LOG, "--------Find Channel ID: %d\n", eng->ncsi_cap.Channel_ID );
888 					}
889 
890 					// Get Version and Capabilities
891 					Get_Version_ID_SLT( eng );          //Command:0x15
892 #ifdef NCSI_VERBOSE_TEST
893 					Get_Capabilities_SLT( eng );        //Command:0x16
894 					Select_Active_Package_SLT( eng );   //Command:0x01
895 					Enable_Set_MAC_Address_SLT( eng );  //Command:0x0e
896 					Enable_Broadcast_Filter_SLT( eng ); //Command:0x10
897 
898 					// Enable TX
899 					Enable_Network_TX_SLT( eng );       //Command:0x06
900 
901 					// Enable Channel
902 					Enable_Channel_SLT( eng );          //Command:0x03
903 
904 					// Get Link Status
905 					Re_Send = 0;
906 					do {
907 #ifdef NCSI_EnableDelay_GetLinkStatus
908 						if ( Re_Send )
909 							DELAY( Delay_GetLinkStatus );
910 #endif
911 
912 						Link_Status = Get_Link_Status_SLT( eng );//Command:0x0a
913 						if ( Link_Status == LINK_UP ) {
914 							if ( eng->arg.GARPNumCnt )
915 								NCSI_ARP ( eng );
916 							break;
917 						} // End if ( Link_Status == LINK_UP )
918 					} while ( Re_Send++ <= 2 );
919 
920 					if ( !eng->run.IO_MrgChk ) {
921 						if ( Link_Status == LINK_UP ) {
922 							printf("        This Channel is LINK_UP (MFC:%d, UFC:%d, CC:%d)\n", eng->ncsi_cap.Mixed_Filter_Count, eng->ncsi_cap.Unicast_Filter_Count, eng->ncsi_cap.Channel_Count);
923 							PRINTF( FP_LOG, "        This Channel is LINK_UP (MFC:%d, UFC:%d, CC:%d)\n", eng->ncsi_cap.Mixed_Filter_Count, eng->ncsi_cap.Unicast_Filter_Count, eng->ncsi_cap.Channel_Count);
924 						}
925 						else {
926 							printf("        This Channel is LINK_DOWN (MFC:%d, UFC:%d, CC:%d)\n", eng->ncsi_cap.Mixed_Filter_Count, eng->ncsi_cap.Unicast_Filter_Count, eng->ncsi_cap.Channel_Count);
927 							PRINTF( FP_LOG, "        This Channel is LINK_DOWN (MFC:%d, UFC:%d, CC:%d)\n", eng->ncsi_cap.Mixed_Filter_Count, eng->ncsi_cap.Unicast_Filter_Count, eng->ncsi_cap.Channel_Count);
928 						}
929 					}
930 #endif	/* endof "#ifdef NCSI_VERBOSE_TEST" */
931 
932 #ifdef NCSI_Skip_DiSChannel
933 #else
934 					if ( eng->run.TM_NCSI_DiSChannel ) {
935 						// Disable TX
936 						Disable_Network_TX_SLT( eng ); //Command:0x07
937 						// Disable Channel
938 						Disable_Channel_SLT( eng, 0 );    //Command:0x04
939 					}
940 #endif
941 				} // End if ( Clear_Initial_State_SLT( eng, chl_idx ) == 0 )
942 			} // End for ( chl_idx = 0; chl_idx < MAX_CHANNEL_NUM; chl_idx++ )
943 
944 #ifdef NCSI_Skip_DeSelectPackage
945 #else
946 			DeSelect_Package_SLT ( eng );//Command:0x02
947 #endif
948 			eng->run.NCSI_RxTimeOutScale = 1;
949 		}
950 		else {
951 			if ( !eng->run.IO_MrgChk ) {
952 				printf("====Absence of Package ID: %d\n", pkg_idx);
953 				PRINTF( FP_LOG, "====Absence of Package ID: %d\n", pkg_idx );
954 			}
955 		} // End if ( select_flag[pkg_idx] == 0 )
956 	} // End for ( pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++ )
957 
958 	if ( eng->dat.number_pak == 0                       ) FindErr( eng, Err_Flag_NCSI_No_PHY      );
959 	if ( eng->dat.number_pak != eng->arg.GPackageTolNum ) FindErr( eng, Err_Flag_NCSI_Package_Num );
960 	if ( eng->dat.number_chl != eng->arg.GChannelTolNum ) FindErr( eng, Err_Flag_NCSI_Channel_Num );
961 //	if ( eng->dat.number_chl == 0                       ) FindErr( eng );
962 
963 	if ( eng->flg.error ) {
964 		if ( eng->dat.NCSI_RxEr )
965 			FindErr_Des( eng, Des_Flag_RxErr );
966 		return(1);
967 	}
968 	else {
969 		if ( eng->dat.NCSI_RxEr ) {
970 			eng->flg.warn = eng->flg.warn | Wrn_Flag_RxErFloatting;
971 			if ( eng->arg.ctrl.b.skip_rx_err ) {
972 				eng->flg.all_fail = 0;
973 				return(0);
974 			}
975 			else {
976 				FindErr_Des( eng, Des_Flag_RxErr );
977 				return(1);
978 			}
979 		}
980 		else {
981 			eng->flg.all_fail = 0;
982 			return(0);
983 		}
984 	}
985 }
986