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 //------------------------------------------------------------
ncsi_set_error_flag(MAC_ENGINE * eng,int eflag)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 //------------------------------------------------------------
ncsi_reqdump(MAC_ENGINE * eng,NCSI_Command_Packet * in)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 }
ncsi_respdump(MAC_ENGINE * eng,NCSI_Response_Packet * in)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 //------------------------------------------------------------
NCSI_PrintCommandStr(MAC_ENGINE * eng,unsigned char command,unsigned iid)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 //------------------------------------------------------------
NCSI_PrintCommandType(MAC_ENGINE * eng,unsigned char command,unsigned iid)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 //------------------------------------------------------------
NCSI_PrintCommandType2File(MAC_ENGINE * eng,unsigned char command,unsigned iid)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 //------------------------------------------------------------
NCSI_Struct_Initialize_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Calculate_Checksum_NCSI(MAC_ENGINE * eng,unsigned char * buffer_base,int Length)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 */
check_rx_desc_err(MAC_ENGINE * p_eng,uint32_t rx_desc0)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 //------------------------------------------------------------
NCSI_Rx_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
NCSI_Tx(MAC_ENGINE * eng,unsigned char command,unsigned char allid,uint16_t length)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 //------------------------------------------------------------
NCSI_ARP(MAC_ENGINE * eng)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 //------------------------------------------------------------
NCSI_SentWaitPacket(MAC_ENGINE * eng,unsigned char command,unsigned char allid,uint16_t length)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 //------------------------------------------------------------
Clear_Initial_State_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Select_Package_SLT(MAC_ENGINE * eng,char skipflag)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 //------------------------------------------------------------
Select_Active_Package_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
DeSelect_Package_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Enable_Channel_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Disable_Channel_SLT(MAC_ENGINE * eng,char skipflag)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 //------------------------------------------------------------
Enable_Network_TX_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Disable_Network_TX_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Set_Link_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Get_Link_Status_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Enable_Set_MAC_Address_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Enable_Broadcast_Filter_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Get_Version_ID_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Get_Capabilities_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
Get_Controller_Packet_Statistics_SLT(MAC_ENGINE * eng)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 //------------------------------------------------------------
phy_ncsi(MAC_ENGINE * eng)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