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