xref: /openbmc/u-boot/cmd/aspeed/nettest/ncsi.c (revision 783c0c9b1c558f35767200192be737d032e7e595)
15c8f9400Sryan_chen /*
25c8f9400Sryan_chen  *  This program is distributed in the hope that it will be useful,
35c8f9400Sryan_chen  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
45c8f9400Sryan_chen  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
55c8f9400Sryan_chen  *  GNU General Public License for more details.
65c8f9400Sryan_chen  *
75c8f9400Sryan_chen  *  You should have received a copy of the GNU General Public License
85c8f9400Sryan_chen  *  along with this program; if not, write to the Free Software
95c8f9400Sryan_chen  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
105c8f9400Sryan_chen  */
115c8f9400Sryan_chen 
125c8f9400Sryan_chen #define NCSI_C
135c8f9400Sryan_chen 
145c8f9400Sryan_chen #include "swfunc.h"
155c8f9400Sryan_chen 
165c8f9400Sryan_chen #include "comminf.h"
175c8f9400Sryan_chen //#include "io.h"
185c8f9400Sryan_chen #include "ncsi.h"
195c8f9400Sryan_chen #include <command.h>
205c8f9400Sryan_chen #include <common.h>
215c8f9400Sryan_chen #include "mac_api.h"
225c8f9400Sryan_chen 
235c8f9400Sryan_chen //------------------------------------------------------------
24*783c0c9bSDylan Hung int ncsi_set_error_flag(MAC_ENGINE *eng, int eflag)
25*783c0c9bSDylan Hung {
26*783c0c9bSDylan Hung 	eng->flg.ncsi = eng->flg.ncsi | eflag;
27*783c0c9bSDylan Hung 	eng->flg.error = eng->flg.error | ERR_FLAG_NCSI_LINKFAIL;
28*783c0c9bSDylan Hung 	if (DBG_PRINT_ERR_FLAG)
29*783c0c9bSDylan Hung 		printf("\nflags: error = %08x, ncsi = %08x\n",
30*783c0c9bSDylan Hung 		       eng->flg.error, eng->flg.ncsi);
315c8f9400Sryan_chen 
325c8f9400Sryan_chen 	return (1);
335c8f9400Sryan_chen }
345c8f9400Sryan_chen 
355c8f9400Sryan_chen //------------------------------------------------------------
365c8f9400Sryan_chen // PHY IC(NC-SI)
375c8f9400Sryan_chen //------------------------------------------------------------
38*783c0c9bSDylan Hung void ncsi_reqdump(MAC_ENGINE *eng, NCSI_Command_Packet *in)
39*783c0c9bSDylan Hung {
405c8f9400Sryan_chen 	int     i;
415c8f9400Sryan_chen 	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 ]);
425c8f9400Sryan_chen 	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 ]);
435c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Request] EtherType      : %04x\n", SWAP_2B_BEDN( in->EtherType )             );//DMTF NC-SI
445c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Request] MC_ID          : %02x\n", in->MC_ID                                 );//Management Controller should set this field to 0x00
455c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Request] Header_Revision: %02x\n", in->Header_Revision                       );//For NC-SI 1.0 spec, this field has to set 0x01
465c8f9400Sryan_chen //	PRINTF( FP_LOG, "[NCSI-Request] Reserved_1     : %02x\n", in->Reserved_1                            ); //Reserved has to set to 0x00
475c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Request] IID            : %02x\n", in->IID                                   );//Instance ID
485c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Request] Command        : %02x\n", in->Command                               );
495c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Request] ChID           : %02x\n", in->ChID                                  );
505c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Request] Payload_Length : %04x\n", SWAP_2B_BEDN( in->Payload_Length )        );//Payload Length = 12 bits, 4 bits are reserved
515c8f9400Sryan_chen //	PRINTF( FP_LOG, "[NCSI-Request] Reserved_2     : %04x\n", in->Reserved_2                            );
525c8f9400Sryan_chen //	PRINTF( FP_LOG, "[NCSI-Request] Reserved_3     : %04x\n", in->Reserved_3                            );
535c8f9400Sryan_chen //	PRINTF( FP_LOG, "[NCSI-Request] Reserved_4     : %04x\n", in->Reserved_4                            );
545c8f9400Sryan_chen //	PRINTF( FP_LOG, "[NCSI-Request] Reserved_5     : %04x\n", in->Reserved_5                            );
555c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Request] Response_Code  : %04x\n", SWAP_2B_BEDN( in->Response_Code )         );
565c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Request] Reason_Code    : %04x\n", SWAP_2B_BEDN( in->Reason_Code )           );
575c8f9400Sryan_chen 	for ( i = 0; i < SWAP_2B_BEDN( in->Payload_Length ); i++ ) {
585c8f9400Sryan_chen 		switch ( i % 4 ) {
595c8f9400Sryan_chen 			case 0	: PRINTF( FP_LOG, "[NCSI-Request] Payload_Data   : %02x", in->Payload_Data[ i ]); break;
605c8f9400Sryan_chen 			case 3	: PRINTF( FP_LOG, " %02x\n", in->Payload_Data[ i ]); break;
615c8f9400Sryan_chen 			default	: PRINTF( FP_LOG, " %02x", in->Payload_Data[ i ]); break;
625c8f9400Sryan_chen 		}
635c8f9400Sryan_chen 	}
645c8f9400Sryan_chen 	if ( ( i % 4 ) != 3 )
655c8f9400Sryan_chen 		PRINTF( FP_LOG, "\n");
665c8f9400Sryan_chen }
675c8f9400Sryan_chen void ncsi_respdump (MAC_ENGINE *eng, NCSI_Response_Packet *in) {
685c8f9400Sryan_chen 	int     i;
695c8f9400Sryan_chen //	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 ]);
705c8f9400Sryan_chen //	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 ]);
715c8f9400Sryan_chen 	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 ]);
725c8f9400Sryan_chen 	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 ]);
735c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Respond] EtherType      : %04x\n", SWAP_2B_BEDN( in->EtherType )             );//DMTF NC-SI
745c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Respond] MC_ID          : %02x\n", in->MC_ID                                 );//Management Controller should set this field to 0x00
755c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Respond] Header_Revision: %02x\n", in->Header_Revision                       );//For NC-SI 1.0 spec, this field has to set 0x01
765c8f9400Sryan_chen //	PRINTF( FP_LOG, "[NCSI-Respond] Reserved_1     : %02x\n", in->Reserved_1                            ); //Reserved has to set to 0x00
775c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Respond] IID            : %02x\n", in->IID                                   );//Instance ID
785c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Respond] Command        : %02x\n", in->Command                               );
795c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Respond] ChID           : %02x\n", in->ChID                                  );
805c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Respond] Payload_Length : %04x\n", SWAP_2B_BEDN( in->Payload_Length )        );//Payload Length = 12 bits, 4 bits are reserved
815c8f9400Sryan_chen //	PRINTF( FP_LOG, "[NCSI-Respond] Reserved_2     : %04x\n", in->Reserved_2                            );
825c8f9400Sryan_chen //	PRINTF( FP_LOG, "[NCSI-Respond] Reserved_3     : %04x\n", in->Reserved_3                            );
835c8f9400Sryan_chen //	PRINTF( FP_LOG, "[NCSI-Respond] Reserved_4     : %04x\n", in->Reserved_4                            );
845c8f9400Sryan_chen //	PRINTF( FP_LOG, "[NCSI-Respond] Reserved_5     : %04x\n", in->Reserved_5                            );
855c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Respond] Response_Code  : %04x\n", SWAP_2B_BEDN( in->Response_Code )         );
865c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-Respond] Reason_Code    : %04x\n", SWAP_2B_BEDN( in->Reason_Code )           );
875c8f9400Sryan_chen 	for ( i = 0; i < SWAP_2B_BEDN( in->Payload_Length ); i++ ) {
885c8f9400Sryan_chen 		switch ( i % 4 ) {
895c8f9400Sryan_chen 			case 0	: PRINTF( FP_LOG, "[NCSI-Respond] Payload_Data   : %02x", in->Payload_Data[ i ]); break;
905c8f9400Sryan_chen 			case 3	: PRINTF( FP_LOG, " %02x\n", in->Payload_Data[ i ]); break;
915c8f9400Sryan_chen 			default	: PRINTF( FP_LOG, " %02x", in->Payload_Data[ i ]); break;
925c8f9400Sryan_chen 		}
935c8f9400Sryan_chen 	}
945c8f9400Sryan_chen 	if ( ( i % 4 ) != 3 )
955c8f9400Sryan_chen 		PRINTF( FP_LOG, "\n");
965c8f9400Sryan_chen }
975c8f9400Sryan_chen 
985c8f9400Sryan_chen //------------------------------------------------------------
995c8f9400Sryan_chen void NCSI_PrintCommandStr (MAC_ENGINE *eng, unsigned char command, unsigned iid) {
1005c8f9400Sryan_chen 	switch ( command & 0x80 ) {
1015c8f9400Sryan_chen 		case 0x80   : sprintf(eng->dat.NCSI_CommandStr, "IID:%3d [%02x:Respond]", iid, command); break;
1025c8f9400Sryan_chen 		default     : sprintf(eng->dat.NCSI_CommandStr, "IID:%3d [%02x:Request]", iid, command); break;
1035c8f9400Sryan_chen 	}
1045c8f9400Sryan_chen 	switch ( command & 0x7f ) {
1055c8f9400Sryan_chen 		case 0x00   : sprintf(eng->dat.NCSI_CommandStr, "%s[CLEAR_INITIAL_STATE                ]", eng->dat.NCSI_CommandStr); break;
1065c8f9400Sryan_chen 		case 0x01   : sprintf(eng->dat.NCSI_CommandStr, "%s[SELECT_PACKAGE                     ]", eng->dat.NCSI_CommandStr); break;
1075c8f9400Sryan_chen 		case 0x02   : sprintf(eng->dat.NCSI_CommandStr, "%s[DESELECT_PACKAGE                   ]", eng->dat.NCSI_CommandStr); break;
1085c8f9400Sryan_chen 		case 0x03   : sprintf(eng->dat.NCSI_CommandStr, "%s[ENABLE_CHANNEL                     ]", eng->dat.NCSI_CommandStr); break;
1095c8f9400Sryan_chen 		case 0x04   : sprintf(eng->dat.NCSI_CommandStr, "%s[DISABLE_CHANNEL                    ]", eng->dat.NCSI_CommandStr); break;
1105c8f9400Sryan_chen 		case 0x05   : sprintf(eng->dat.NCSI_CommandStr, "%s[RESET_CHANNEL                      ]", eng->dat.NCSI_CommandStr); break;
1115c8f9400Sryan_chen 		case 0x06   : sprintf(eng->dat.NCSI_CommandStr, "%s[ENABLE_CHANNEL_NETWORK_TX          ]", eng->dat.NCSI_CommandStr); break;
1125c8f9400Sryan_chen 		case 0x07   : sprintf(eng->dat.NCSI_CommandStr, "%s[DISABLE_CHANNEL_NETWORK_TX         ]", eng->dat.NCSI_CommandStr); break;
1135c8f9400Sryan_chen 		case 0x08   : sprintf(eng->dat.NCSI_CommandStr, "%s[AEN_ENABLE                         ]", eng->dat.NCSI_CommandStr); break;
1145c8f9400Sryan_chen 		case 0x09   : sprintf(eng->dat.NCSI_CommandStr, "%s[SET_LINK                           ]", eng->dat.NCSI_CommandStr); break;
1155c8f9400Sryan_chen 		case 0x0A   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_LINK_STATUS                    ]", eng->dat.NCSI_CommandStr); break;
1165c8f9400Sryan_chen 		case 0x0B   : sprintf(eng->dat.NCSI_CommandStr, "%s[SET_VLAN_FILTER                    ]", eng->dat.NCSI_CommandStr); break;
1175c8f9400Sryan_chen 		case 0x0C   : sprintf(eng->dat.NCSI_CommandStr, "%s[ENABLE_VLAN                        ]", eng->dat.NCSI_CommandStr); break;
1185c8f9400Sryan_chen 		case 0x0D   : sprintf(eng->dat.NCSI_CommandStr, "%s[DISABLE_VLAN                       ]", eng->dat.NCSI_CommandStr); break;
1195c8f9400Sryan_chen 		case 0x0E   : sprintf(eng->dat.NCSI_CommandStr, "%s[SET_MAC_ADDRESS                    ]", eng->dat.NCSI_CommandStr); break;
1205c8f9400Sryan_chen 		case 0x10   : sprintf(eng->dat.NCSI_CommandStr, "%s[ENABLE_BROADCAST_FILTERING         ]", eng->dat.NCSI_CommandStr); break;
1215c8f9400Sryan_chen 		case 0x11   : sprintf(eng->dat.NCSI_CommandStr, "%s[DISABLE_BROADCAST_FILTERING        ]", eng->dat.NCSI_CommandStr); break;
1225c8f9400Sryan_chen 		case 0x12   : sprintf(eng->dat.NCSI_CommandStr, "%s[ENABLE_GLOBAL_MULTICAST_FILTERING  ]", eng->dat.NCSI_CommandStr); break;
1235c8f9400Sryan_chen 		case 0x13   : sprintf(eng->dat.NCSI_CommandStr, "%s[DISABLE_GLOBAL_MULTICAST_FILTERING ]", eng->dat.NCSI_CommandStr); break;
1245c8f9400Sryan_chen 		case 0x14   : sprintf(eng->dat.NCSI_CommandStr, "%s[SET_NCSI_FLOW_CONTROL              ]", eng->dat.NCSI_CommandStr); break;
1255c8f9400Sryan_chen 		case 0x15   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_VERSION_ID                     ]", eng->dat.NCSI_CommandStr); break;
1265c8f9400Sryan_chen 		case 0x16   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_CAPABILITIES                   ]", eng->dat.NCSI_CommandStr); break;
1275c8f9400Sryan_chen 		case 0x17   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_PARAMETERS                     ]", eng->dat.NCSI_CommandStr); break;
1285c8f9400Sryan_chen 		case 0x18   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_CONTROLLER_PACKET_STATISTICS   ]", eng->dat.NCSI_CommandStr); break;
1295c8f9400Sryan_chen 		case 0x19   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_NCSI_STATISTICS                ]", eng->dat.NCSI_CommandStr); break;
1305c8f9400Sryan_chen 		case 0x1A   : sprintf(eng->dat.NCSI_CommandStr, "%s[GET_NCSI_PASS_THROUGH_STATISTICS   ]", eng->dat.NCSI_CommandStr); break;
1315c8f9400Sryan_chen 		case 0x50   : sprintf(eng->dat.NCSI_CommandStr, "%s[OEM_COMMAND                        ]", eng->dat.NCSI_CommandStr); break;
1325c8f9400Sryan_chen 		default     : sprintf(eng->dat.NCSI_CommandStr, "%s Not Support Command", eng->dat.NCSI_CommandStr); break ;
1335c8f9400Sryan_chen 	}
1345c8f9400Sryan_chen } // End void NCSI_PrintCommandStr (MAC_ENGINE *eng, unsigned char command, unsigned iid)
1355c8f9400Sryan_chen 
1365c8f9400Sryan_chen //------------------------------------------------------------
1375c8f9400Sryan_chen void NCSI_PrintCommandType (MAC_ENGINE *eng, unsigned char command, unsigned iid) {
1385c8f9400Sryan_chen 	NCSI_PrintCommandStr( eng, command, iid );
1395c8f9400Sryan_chen 	printf("[NCSI-commd]%s\n", eng->dat.NCSI_CommandStr);
1405c8f9400Sryan_chen }
1415c8f9400Sryan_chen 
1425c8f9400Sryan_chen //------------------------------------------------------------
1435c8f9400Sryan_chen void NCSI_PrintCommandType2File (MAC_ENGINE *eng, unsigned char command, unsigned iid) {
1445c8f9400Sryan_chen 	NCSI_PrintCommandStr( eng, command, iid );
1455c8f9400Sryan_chen 	PRINTF( FP_LOG, "[NCSI-commd]%s\n", eng->dat.NCSI_CommandStr );
1465c8f9400Sryan_chen }
1475c8f9400Sryan_chen 
1485c8f9400Sryan_chen //------------------------------------------------------------
1495c8f9400Sryan_chen void NCSI_Struct_Initialize_SLT (MAC_ENGINE *eng)
1505c8f9400Sryan_chen {
1515c8f9400Sryan_chen 	int i;
1525c8f9400Sryan_chen 	uint32_t NCSI_RxDatBase;
1535c8f9400Sryan_chen 
1545c8f9400Sryan_chen 	eng->run.NCSI_RxTimeOutScale = 1;
1555c8f9400Sryan_chen 
1565c8f9400Sryan_chen 	for (i = 0; i < 6; i++) {
1575c8f9400Sryan_chen 		eng->ncsi_req.DA[i] = 0xFF;
1585c8f9400Sryan_chen 		eng->ncsi_req.SA[i] = eng->inf.SA[i];
1595c8f9400Sryan_chen 	}
1605c8f9400Sryan_chen 
1615c8f9400Sryan_chen 	/* EtherType = 0x88F8 (DMTF DSP0222 NC-SI spec)
1625c8f9400Sryan_chen 	ethernet frame header format, table 8 */
1635c8f9400Sryan_chen 	eng->ncsi_req.EtherType = SWAP_2B_BEDN(0x88F8);
1645c8f9400Sryan_chen 
1655c8f9400Sryan_chen 	eng->ncsi_req.MC_ID           = 0;
1665c8f9400Sryan_chen 	eng->ncsi_req.Header_Revision = 0x01;
1675c8f9400Sryan_chen 	eng->ncsi_req.Reserved_1      = 0;
1685c8f9400Sryan_chen 	eng->ncsi_req.IID             = 0;
1695c8f9400Sryan_chen //	eng->ncsi_req.Command         = 0;
1705c8f9400Sryan_chen //	eng->ncsi_req.ChID            = 0;
1715c8f9400Sryan_chen //	eng->ncsi_req.Payload_Length  = 0;
1725c8f9400Sryan_chen 
1735c8f9400Sryan_chen 	eng->ncsi_req.Response_Code   = 0;
1745c8f9400Sryan_chen 	eng->ncsi_req.Reason_Code     = 0;
1755c8f9400Sryan_chen 	eng->ncsi_req.Reserved_2      = 0;
1765c8f9400Sryan_chen 	eng->ncsi_req.Reserved_3      = 0;
1775c8f9400Sryan_chen 
1785c8f9400Sryan_chen 	eng->dat.NCSI_TxByteBUF = (unsigned char *) &eng->dat.NCSI_TxDWBUF[0];
1795c8f9400Sryan_chen 	eng->dat.NCSI_RxByteBUF = (unsigned char *) &eng->dat.NCSI_RxDWBUF[0];
1805c8f9400Sryan_chen 
1815c8f9400Sryan_chen 	eng->run.ncsi_tdes_base = eng->run.tdes_base;//base for read/write
1825c8f9400Sryan_chen 	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x04, 0                        );
1835c8f9400Sryan_chen 	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x08, 0                        );
1845c8f9400Sryan_chen 	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x0C, DMA_BASE - ASPEED_DRAM_BASE);
1855c8f9400Sryan_chen 
1865c8f9400Sryan_chen 	eng->run.ncsi_rdes_base = eng->run.rdes_base;//base for read/write
1875c8f9400Sryan_chen 	NCSI_RxDatBase = AT_MEMRW_BUF( NCSI_RxDMA_BASE );//base of the descriptor
1885c8f9400Sryan_chen 
1895c8f9400Sryan_chen 	for (i = 0; i < NCSI_RxDESNum - 1; i++) {
1905c8f9400Sryan_chen 		Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base        ), 0x00000000     );
1915c8f9400Sryan_chen 		Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x04 ), 0x00000000     );
1925c8f9400Sryan_chen 		Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x08 ), 0x00000000     );
1935c8f9400Sryan_chen 		Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x0C ), NCSI_RxDatBase );
1945c8f9400Sryan_chen 		eng->run.ncsi_rdes_base += 16;
1955c8f9400Sryan_chen 		NCSI_RxDatBase += NCSI_RxDMA_PakSize;
1965c8f9400Sryan_chen 	}
1975c8f9400Sryan_chen 	Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base        ), EOR_IniVal     );
1985c8f9400Sryan_chen 	Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x04 ), 0x00000000     );
1995c8f9400Sryan_chen 	Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x08 ), 0x00000000     );
2005c8f9400Sryan_chen //	Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x0C ), (NCSI_RxDatBase + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
2015c8f9400Sryan_chen 	Write_Mem_Des_NCSI_DD( ( eng->run.ncsi_rdes_base + 0x0C ), NCSI_RxDatBase ); // 20130730
2025c8f9400Sryan_chen 
2035c8f9400Sryan_chen 	eng->run.ncsi_rdes_base = eng->run.rdes_base;//base for read/write
2045c8f9400Sryan_chen }
2055c8f9400Sryan_chen 
2065c8f9400Sryan_chen //------------------------------------------------------------
2075c8f9400Sryan_chen void Calculate_Checksum_NCSI (MAC_ENGINE *eng, unsigned char *buffer_base, int Length) {
2085c8f9400Sryan_chen 	uint32_t      CheckSum = 0;
2095c8f9400Sryan_chen 	uint32_t      Data;
2105c8f9400Sryan_chen 	uint32_t      Data1;
2115c8f9400Sryan_chen 	int        i;
2125c8f9400Sryan_chen 
2135c8f9400Sryan_chen 	// Calculate checksum is from byte 14 of ethernet Haeder and Control packet header
2145c8f9400Sryan_chen 	// Page 50, NC-SI spec. ver. 1.0.0 form DMTF
2155c8f9400Sryan_chen 	for (i = 14; i < Length; i += 2 ) {
2165c8f9400Sryan_chen 		Data      = buffer_base[i];
2175c8f9400Sryan_chen 		Data1     = buffer_base[i + 1];
2185c8f9400Sryan_chen 		CheckSum += ((Data << 8) + Data1);
2195c8f9400Sryan_chen 	}
2205c8f9400Sryan_chen 	eng->dat.Payload_Checksum_NCSI = SWAP_4B_BEDN(~(CheckSum) + 1); //2's complement
2215c8f9400Sryan_chen }
2225c8f9400Sryan_chen 
2235c8f9400Sryan_chen /**
2245c8f9400Sryan_chen  * @brief	check error mask in RX descriptor
2255c8f9400Sryan_chen  * @param	rx_desc0	RX descript[0]
2265c8f9400Sryan_chen */
2275c8f9400Sryan_chen static int check_rx_desc_err(MAC_ENGINE *p_eng, uint32_t rx_desc0)
2285c8f9400Sryan_chen {
2295c8f9400Sryan_chen 	uint8_t prefix[8] = "[RxDes]";
2305c8f9400Sryan_chen 
2315c8f9400Sryan_chen 	if (rx_desc0 & RXDES_EM_ALL) {
2325c8f9400Sryan_chen #ifdef CheckRxErr
2335c8f9400Sryan_chen 		if (rx_desc0 & RXDES_EM_RXERR) {
2345c8f9400Sryan_chen 			PRINTF(STD_OUT, "%s Error RxErr        %08x\n", prefix,
2355c8f9400Sryan_chen 			       rx_desc0);
2365c8f9400Sryan_chen 			p_eng->dat.NCSI_RxEr = 1;
2375c8f9400Sryan_chen 		}
2385c8f9400Sryan_chen #endif
2395c8f9400Sryan_chen 
2405c8f9400Sryan_chen #ifdef CheckCRC
2415c8f9400Sryan_chen 		if (rx_desc0 & RXDES_EM_CRC) {
2425c8f9400Sryan_chen 			PRINTF(STD_OUT, "%s Error CRC          %08x\n", prefix,
2435c8f9400Sryan_chen 			       rx_desc0);
2445c8f9400Sryan_chen 			FindErr_Des(p_eng, Des_Flag_CRC);
2455c8f9400Sryan_chen 		}
2465c8f9400Sryan_chen #endif
2475c8f9400Sryan_chen 
2485c8f9400Sryan_chen #ifdef CheckFTL
2495c8f9400Sryan_chen 		if (rx_desc0 & RXDES_EM_FTL) {
2505c8f9400Sryan_chen 			PRINTF(STD_OUT, "%s Error FTL          %08x\n", prefix,
2515c8f9400Sryan_chen 			       rx_desc0);
2525c8f9400Sryan_chen 			FindErr_Des(p_eng, Des_Flag_FTL);
2535c8f9400Sryan_chen 		}
2545c8f9400Sryan_chen #endif
2555c8f9400Sryan_chen 
2565c8f9400Sryan_chen #ifdef CheckRunt
2575c8f9400Sryan_chen 		if (rx_desc0 & RXDES_EM_RUNT) {
2585c8f9400Sryan_chen 			PRINTF(STD_OUT, "%s Error Runt         %08x\n", prefix,
2595c8f9400Sryan_chen 			       rx_desc0);
2605c8f9400Sryan_chen 			FindErr_Des(p_eng, Des_Flag_Runt);
2615c8f9400Sryan_chen 		}
2625c8f9400Sryan_chen #endif
2635c8f9400Sryan_chen 
2645c8f9400Sryan_chen #ifdef CheckOddNibble
2655c8f9400Sryan_chen 		if (rx_desc0 & RXDES_EM_ODD_NB) {
2665c8f9400Sryan_chen 			PRINTF(STD_OUT, "%s Odd Nibble         %08x\n", prefix,
2675c8f9400Sryan_chen 			       rx_desc0);
2685c8f9400Sryan_chen 			FindErr_Des(p_eng, Des_Flag_OddNibble);
2695c8f9400Sryan_chen 		}
2705c8f9400Sryan_chen #endif
2715c8f9400Sryan_chen 
2725c8f9400Sryan_chen #ifdef CheckRxFIFOFull
2735c8f9400Sryan_chen 		if (rx_desc0 & RXDES_EM_FIFO_FULL) {
2745c8f9400Sryan_chen 			PRINTF(STD_OUT, "%s Error Rx FIFO Full %08x\n", prefix,
2755c8f9400Sryan_chen 			       rx_desc0);
2765c8f9400Sryan_chen 			FindErr_Des(p_eng, Des_Flag_RxFIFOFull);
2775c8f9400Sryan_chen 		}
2785c8f9400Sryan_chen #endif
2795c8f9400Sryan_chen 	}
2805c8f9400Sryan_chen 
2815c8f9400Sryan_chen 	return 0;
2825c8f9400Sryan_chen }
2835c8f9400Sryan_chen 
2845c8f9400Sryan_chen //------------------------------------------------------------
2855c8f9400Sryan_chen // return 0: it is PASS
2865c8f9400Sryan_chen // return 1: it is FAIL
2875c8f9400Sryan_chen //------------------------------------------------------------
2885c8f9400Sryan_chen char NCSI_Rx_SLT (MAC_ENGINE *eng) {
2895c8f9400Sryan_chen 	int        timeout = 0;
2905c8f9400Sryan_chen 	int        bytesize;
2915c8f9400Sryan_chen 	int        dwsize;
2925c8f9400Sryan_chen 	int        i;
2935c8f9400Sryan_chen 	int        retry   = 0;
2945c8f9400Sryan_chen 	char       ret     = 1;
2955c8f9400Sryan_chen 
2965c8f9400Sryan_chen 	uint32_t      NCSI_RxDatBase;
2975c8f9400Sryan_chen 	uint32_t      NCSI_RxDesDat;
2985c8f9400Sryan_chen 	uint32_t      NCSI_RxData;
2995c8f9400Sryan_chen 	uint32_t      NCSI_BufData;
3005c8f9400Sryan_chen 
3015c8f9400Sryan_chen 	do {
3025c8f9400Sryan_chen 		mac_reg_write( eng, 0x1C, 0x00000000 );//Rx Poll
3035c8f9400Sryan_chen 
3045c8f9400Sryan_chen 		timeout = 0;
3055c8f9400Sryan_chen 		do {
3065c8f9400Sryan_chen 			NCSI_RxDesDat = Read_Mem_Des_NCSI_DD( eng->run.ncsi_rdes_base );
3075c8f9400Sryan_chen 			if ( ++timeout > TIME_OUT_NCSI * eng->run.NCSI_RxTimeOutScale ) {
3085c8f9400Sryan_chen 				PRINTF( FP_LOG, "[RxDes] DesOwn timeout     %08x\n", NCSI_RxDesDat );
3095c8f9400Sryan_chen 				return( FindErr( eng, Err_Flag_NCSI_Check_RxOwnTimeOut ) );
3105c8f9400Sryan_chen 			}
3115c8f9400Sryan_chen 		} while( HWOwnRx( NCSI_RxDesDat ) );
3125c8f9400Sryan_chen 
3135c8f9400Sryan_chen 		check_rx_desc_err(eng, NCSI_RxDesDat);
3145c8f9400Sryan_chen 
3155c8f9400Sryan_chen 		// Get point of RX DMA buffer
3165c8f9400Sryan_chen 		NCSI_RxDatBase = AT_BUF_MEMRW( Read_Mem_Des_NCSI_DD( eng->run.ncsi_rdes_base + 0x0C ) );//base for read/write
3175c8f9400Sryan_chen 		NCSI_RxData    = SWAP_4B_LEDN_NCSI( SWAP_4B_LEDN( Read_Mem_Dat_NCSI_DD( NCSI_RxDatBase + 0x0C ) ) );
3185c8f9400Sryan_chen 
3195c8f9400Sryan_chen 		// Get RX valid data in offset 00h of RXDS#0
3205c8f9400Sryan_chen #ifdef NCSI_Skip_RxCRCData
3215c8f9400Sryan_chen 		bytesize  = (NCSI_RxDesDat & 0x3fff) - 4;
3225c8f9400Sryan_chen #else
3235c8f9400Sryan_chen 		bytesize  = (NCSI_RxDesDat & 0x3fff);
3245c8f9400Sryan_chen #endif
3255c8f9400Sryan_chen 		// Fill up to multiple of 4
3265c8f9400Sryan_chen 		if ( ( bytesize % 4 ) != 0 )
3275c8f9400Sryan_chen 			dwsize = ( bytesize >> 2 ) + 1;
3285c8f9400Sryan_chen 		else
3295c8f9400Sryan_chen 			dwsize = bytesize >> 2;
3305c8f9400Sryan_chen 
3315c8f9400Sryan_chen 		if ( eng->arg.ctrl.b.print_ncsi ) {
3325c8f9400Sryan_chen #ifdef NCSI_Skip_RxCRCData
3335c8f9400Sryan_chen 			PRINTF( FP_LOG ,"----->[Rx] %d bytes(%xh) [Remove CRC data]\n", bytesize, bytesize );
3345c8f9400Sryan_chen #else
3355c8f9400Sryan_chen 			PRINTF( FP_LOG ,"----->[Rx] %d bytes(%xh)\n", bytesize, bytesize );
3365c8f9400Sryan_chen #endif
3375c8f9400Sryan_chen 			for (i = 0; i < dwsize - 1; i++) {
3385c8f9400Sryan_chen 				NCSI_BufData = SWAP_4B_LEDN_NCSI( Read_Mem_Dat_NCSI_DD( NCSI_RxDatBase + ( i << 2 ) ) );
3395c8f9400Sryan_chen 				PRINTF( FP_LOG ,"      [Rx]%02d:%08x %08x\n", i, NCSI_BufData, SWAP_4B( NCSI_BufData ) );
3405c8f9400Sryan_chen 			}
3415c8f9400Sryan_chen 
3425c8f9400Sryan_chen 			i = ( dwsize - 1 );
3435c8f9400Sryan_chen 			NCSI_BufData = SWAP_4B_LEDN_NCSI( Read_Mem_Dat_NCSI_DD( NCSI_RxDatBase + ( i << 2 ) ) );
3445c8f9400Sryan_chen 			switch ( bytesize % 4 ) {
3455c8f9400Sryan_chen 				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;
3465c8f9400Sryan_chen 				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;
3475c8f9400Sryan_chen 				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;
3485c8f9400Sryan_chen 				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;
3495c8f9400Sryan_chen 				default : PRINTF( FP_LOG ,"      [Rx]%02d:error", i ); break;
3505c8f9400Sryan_chen 			}
3515c8f9400Sryan_chen 		}
3525c8f9400Sryan_chen 
3535c8f9400Sryan_chen 		// EtherType field of the response packet should be 0x88F8
3545c8f9400Sryan_chen //
3555c8f9400Sryan_chen 		if ( ( NCSI_RxData & 0xffff ) == 0xf888 ) {
3565c8f9400Sryan_chen 			for (i = 0; i < dwsize; i++)
3575c8f9400Sryan_chen 				eng->dat.NCSI_RxDWBUF[i] = SWAP_4B_LEDN_NCSI( Read_Mem_Dat_NCSI_DD( NCSI_RxDatBase + ( i << 2 ) ) );
3585c8f9400Sryan_chen 
3595c8f9400Sryan_chen 			memcpy ( &eng->ncsi_rsp, eng->dat.NCSI_RxByteBUF, bytesize );
3605c8f9400Sryan_chen 
3615c8f9400Sryan_chen 			if ( eng->arg.ctrl.b.print_ncsi )
3625c8f9400Sryan_chen 				PRINTF( FP_LOG ,"[Frm-NCSI][Rx IID:%2d]\n", eng->ncsi_rsp.IID );
3635c8f9400Sryan_chen 
3645c8f9400Sryan_chen 			if ( ( eng->ncsi_rsp.IID == 0x0 ) && ( eng->ncsi_rsp.Command == 0xff ) ) { // AEN Packet
3655c8f9400Sryan_chen 				if ( eng->arg.ctrl.b.print_ncsi )
3665c8f9400Sryan_chen 					PRINTF( FP_LOG ,"[Frm-NCSI][AEN Packet]Type:%2d\n", SWAP_2B_BEDN( eng->ncsi_rsp.Reason_Code ) & 0xff );
3675c8f9400Sryan_chen 			}
3685c8f9400Sryan_chen 			else {
3695c8f9400Sryan_chen 				ret = 0;
3705c8f9400Sryan_chen 			}
3715c8f9400Sryan_chen 		}
3725c8f9400Sryan_chen 		else {
3735c8f9400Sryan_chen 			if ( eng->arg.ctrl.b.print_ncsi )
3745c8f9400Sryan_chen 				PRINTF( FP_LOG, "[Frm-Skip] Not NCSI Response: [%08x & %08x = %08x]!=[%08x]\n", NCSI_RxData, 0xffff, NCSI_RxData & 0xffff, 0xf888 );
3755c8f9400Sryan_chen 		} // End if ( ( NCSI_RxData & 0xffff ) == 0xf888 )
3765c8f9400Sryan_chen 
3775c8f9400Sryan_chen 		if ( HWEOR( NCSI_RxDesDat ) ) {
3785c8f9400Sryan_chen 			// it is last the descriptor in the receive Ring
3795c8f9400Sryan_chen 			Write_Mem_Des_NCSI_DD( eng->run.ncsi_rdes_base     , EOR_IniVal    );
3805c8f9400Sryan_chen 			eng->run.ncsi_rdes_base = eng->run.rdes_base;//base for read/write
3815c8f9400Sryan_chen 		}
3825c8f9400Sryan_chen 		else {
3835c8f9400Sryan_chen 			Write_Mem_Des_NCSI_DD( eng->run.ncsi_rdes_base     , 0x00000000    );
3845c8f9400Sryan_chen 			eng->run.ncsi_rdes_base += 16;
3855c8f9400Sryan_chen 		}
3865c8f9400Sryan_chen 
3875c8f9400Sryan_chen 		if ( ret == 0 )
3885c8f9400Sryan_chen 			break;
3895c8f9400Sryan_chen 		retry++;
3905c8f9400Sryan_chen 	} while ( retry < NCSI_RxDESNum );
3915c8f9400Sryan_chen 
3925c8f9400Sryan_chen 	if ( ( ret == 0 ) && eng->arg.ctrl.b.print_ncsi ) {
3935c8f9400Sryan_chen #ifdef Print_DetailFrame
3945c8f9400Sryan_chen 		ncsi_respdump ( eng, &eng->ncsi_rsp );
3955c8f9400Sryan_chen #else
3965c8f9400Sryan_chen 		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",
3975c8f9400Sryan_chen 		SWAP_2B_BEDN( eng->ncsi_rsp.EtherType ),
3985c8f9400Sryan_chen 		eng->ncsi_rsp.MC_ID,
3995c8f9400Sryan_chen 		eng->ncsi_rsp.Header_Revision,
4005c8f9400Sryan_chen 		eng->ncsi_rsp.IID,
4015c8f9400Sryan_chen 		eng->ncsi_rsp.Command,
4025c8f9400Sryan_chen 		eng->ncsi_rsp.ChID,
4035c8f9400Sryan_chen 		SWAP_2B_BEDN( eng->ncsi_rsp.Payload_Length ),
4045c8f9400Sryan_chen 		SWAP_2B_BEDN( eng->ncsi_rsp.Response_Code ),
4055c8f9400Sryan_chen 		SWAP_2B_BEDN( eng->ncsi_rsp.Reason_Code ));
4065c8f9400Sryan_chen #endif
4075c8f9400Sryan_chen 
4085c8f9400Sryan_chen 		NCSI_PrintCommandType2File( eng, eng->ncsi_rsp.Command, eng->ncsi_rsp.IID );
4095c8f9400Sryan_chen 	}
4105c8f9400Sryan_chen 
4115c8f9400Sryan_chen 	return( ret );
4125c8f9400Sryan_chen } // End char NCSI_Rx_SLT (MAC_ENGINE *eng)
4135c8f9400Sryan_chen 
4145c8f9400Sryan_chen //------------------------------------------------------------
4155c8f9400Sryan_chen char NCSI_Tx (MAC_ENGINE *eng, unsigned char command, unsigned char allid, uint16_t length) {
4165c8f9400Sryan_chen 	int        bytesize;
4175c8f9400Sryan_chen 	int        dwsize;
4185c8f9400Sryan_chen 	int        i;
4195c8f9400Sryan_chen 	int        timeout = 0;
4205c8f9400Sryan_chen 	uint32_t      NCSI_TxDesDat;
4215c8f9400Sryan_chen 
4225c8f9400Sryan_chen 	eng->ncsi_req.IID++;
4235c8f9400Sryan_chen 	eng->ncsi_req.Command        = command;
4245c8f9400Sryan_chen 	eng->ncsi_req.ChID           = allid;
4255c8f9400Sryan_chen 	eng->ncsi_req.Payload_Length = SWAP_2B_BEDN( length );
4265c8f9400Sryan_chen 
4275c8f9400Sryan_chen 	memcpy (  eng->dat.NCSI_TxByteBUF               , &eng->ncsi_req                 , 30     );
4285c8f9400Sryan_chen 	memcpy ( (eng->dat.NCSI_TxByteBUF + 30         ), &eng->dat.NCSI_Payload_Data    , length );
4295c8f9400Sryan_chen 	Calculate_Checksum_NCSI( eng, eng->dat.NCSI_TxByteBUF, 30 + length );
4305c8f9400Sryan_chen 	memcpy ( (eng->dat.NCSI_TxByteBUF + 30 + length), &eng->dat.Payload_Checksum_NCSI, 4      );
4315c8f9400Sryan_chen 
4325c8f9400Sryan_chen 	// Header of NC-SI command format is 34 bytes. page 58, NC-SI spec. ver 1.0.0 from DMTF
4335c8f9400Sryan_chen 	// The minimum size of a NC-SI package is 64 bytes.
4345c8f9400Sryan_chen 	bytesize = 34 + length;
4355c8f9400Sryan_chen 	if ( bytesize < 60 ) {
4365c8f9400Sryan_chen 		memset ( eng->dat.NCSI_TxByteBUF + bytesize, 0, 60 - bytesize );
4375c8f9400Sryan_chen 		bytesize = 60;
4385c8f9400Sryan_chen 	}
4395c8f9400Sryan_chen 
4405c8f9400Sryan_chen 	// Fill up to multiple of 4
4415c8f9400Sryan_chen 	//    dwsize = (bytesize + 3) >> 2;
4425c8f9400Sryan_chen 	if ( ( bytesize % 4 ) != 0 )
4435c8f9400Sryan_chen 		dwsize = ( bytesize >> 2 ) + 1;
4445c8f9400Sryan_chen 	else
4455c8f9400Sryan_chen 		dwsize = bytesize >> 2;
4465c8f9400Sryan_chen 
4475c8f9400Sryan_chen 	if ( eng->arg.ctrl.b.print_ncsi ) {
4485c8f9400Sryan_chen 		if ( bytesize % 4 )
4495c8f9400Sryan_chen 			memset ( eng->dat.NCSI_TxByteBUF + bytesize, 0, (dwsize << 2) - bytesize );
4505c8f9400Sryan_chen 
4515c8f9400Sryan_chen 		PRINTF( FP_LOG ,"----->[Tx] %d bytes(%xh)\n", bytesize, bytesize );
4525c8f9400Sryan_chen 		for ( i = 0; i < dwsize-1; i++ )
4535c8f9400Sryan_chen 			PRINTF( FP_LOG, "      [Tx]%02d:%08x %08x\n", i, eng->dat.NCSI_TxDWBUF[i], SWAP_4B( eng->dat.NCSI_TxDWBUF[i] ) );
4545c8f9400Sryan_chen 
4555c8f9400Sryan_chen 		i = dwsize - 1;
4565c8f9400Sryan_chen 		switch ( bytesize % 4 ) {
4575c8f9400Sryan_chen 			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;
4585c8f9400Sryan_chen 			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;
4595c8f9400Sryan_chen 			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;
4605c8f9400Sryan_chen 			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;
4615c8f9400Sryan_chen 			default : PRINTF( FP_LOG ,"      [Tx]%02d:error", i ); break;
4625c8f9400Sryan_chen 		}
4635c8f9400Sryan_chen 		PRINTF( FP_LOG ,"[Frm-NCSI][Tx IID:%2d]\n", eng->ncsi_req.IID );
4645c8f9400Sryan_chen 	}
4655c8f9400Sryan_chen 
4665c8f9400Sryan_chen #if 1
4675c8f9400Sryan_chen 	// Copy data to DMA buffer
4685c8f9400Sryan_chen 	for ( i = 0; i < dwsize; i++ )
4695c8f9400Sryan_chen 		Write_Mem_Dat_NCSI_DD( DMA_BASE + ( i << 2 ), SWAP_4B_LEDN_NCSI( eng->dat.NCSI_TxDWBUF[i] ) );
4705c8f9400Sryan_chen #endif
4715c8f9400Sryan_chen 
4725c8f9400Sryan_chen 	// Setting one TX descriptor
4735c8f9400Sryan_chen 	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base       , 0xf0008000 + bytesize );
4745c8f9400Sryan_chen 
4755c8f9400Sryan_chen //	mac_reg_write( eng, 0x40, eng->reg.MAC_040 ); // 20170505
4765c8f9400Sryan_chen 
4775c8f9400Sryan_chen 	// Fire
4785c8f9400Sryan_chen 	mac_reg_write( eng, 0x18, 0x00000000 );//Tx Poll
4795c8f9400Sryan_chen 
4805c8f9400Sryan_chen 	do {
4815c8f9400Sryan_chen 		NCSI_TxDesDat = Read_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base );
4825c8f9400Sryan_chen 		if ( ++timeout > TIME_OUT_NCSI ) {
4835c8f9400Sryan_chen 			PRINTF( FP_LOG, "[TxDes] DesOwn timeout     %08X\n", NCSI_TxDesDat );
4845c8f9400Sryan_chen 			return( FindErr( eng, Err_Flag_NCSI_Check_TxOwnTimeOut  ));
4855c8f9400Sryan_chen 		}
4865c8f9400Sryan_chen 	} while ( HWOwnTx( NCSI_TxDesDat ) );
4875c8f9400Sryan_chen 
4885c8f9400Sryan_chen 	if ( eng->arg.ctrl.b.print_ncsi ) {
4895c8f9400Sryan_chen #ifdef Print_DetailFrame
4905c8f9400Sryan_chen 		ncsi_reqdump ( eng, &eng->ncsi_req );
4915c8f9400Sryan_chen #else
4925c8f9400Sryan_chen 		PRINTF( FP_LOG, "[NCSI-Request] ETyp:%04x MC_ID:%02x HeadVer:%02x IID:%02x Comm:%02x ChlID:%02x PayLen:%04x\n",
4935c8f9400Sryan_chen 		SWAP_2B_BEDN( eng->ncsi_req.EtherType ),
4945c8f9400Sryan_chen 		eng->ncsi_req.MC_ID,
4955c8f9400Sryan_chen 		eng->ncsi_req.Header_Revision,
4965c8f9400Sryan_chen 		eng->ncsi_req.IID,
4975c8f9400Sryan_chen 		eng->ncsi_req.Command,
4985c8f9400Sryan_chen 		eng->ncsi_req.ChID,
4995c8f9400Sryan_chen 		SWAP_2B_BEDN( eng->ncsi_req.Payload_Length ) );
5005c8f9400Sryan_chen #endif
5015c8f9400Sryan_chen 
5025c8f9400Sryan_chen 		NCSI_PrintCommandType2File( eng, eng->ncsi_req.Command, eng->ncsi_req.IID );
5035c8f9400Sryan_chen 	}
5045c8f9400Sryan_chen #ifdef Print_PackageName
5055c8f9400Sryan_chen 	NCSI_PrintCommandType( eng, eng->ncsi_req.Command, eng->ncsi_req.IID );
5065c8f9400Sryan_chen #endif
5075c8f9400Sryan_chen 
5085c8f9400Sryan_chen 	return(0);
5095c8f9400Sryan_chen } // End char NCSI_Tx (MAC_ENGINE *eng, unsigned char command, unsigned char allid, uint16_t length)
5105c8f9400Sryan_chen 
5115c8f9400Sryan_chen //------------------------------------------------------------
5125c8f9400Sryan_chen char NCSI_ARP (MAC_ENGINE *eng) {
5135c8f9400Sryan_chen 	int        i;
5145c8f9400Sryan_chen 	int        timeout = 0;
5155c8f9400Sryan_chen 	uint32_t      NCSI_TxDesDat;
5165c8f9400Sryan_chen 
5175c8f9400Sryan_chen 	if ( eng->arg.ctrl.b.print_ncsi )
5185c8f9400Sryan_chen 		PRINTF( FP_LOG ,"----->[ARP] 60 bytes x%d\n", eng->arg.GARPNumCnt );
5195c8f9400Sryan_chen 
5205c8f9400Sryan_chen 	for (i = 0; i < 15; i++) {
5215c8f9400Sryan_chen 		if ( eng->arg.ctrl.b.print_ncsi )
5225c8f9400Sryan_chen 			PRINTF( FP_LOG, "      [Tx%02d] %08x %08x\n", i, eng->dat.ARP_data[i], SWAP_4B( eng->dat.ARP_data[i] ) );
5235c8f9400Sryan_chen 
5245c8f9400Sryan_chen 		Write_Mem_Dat_NCSI_DD(((uint32_t)&dma_buf) + ( i << 2 ), eng->dat.ARP_data[i] );
5255c8f9400Sryan_chen 	}
5265c8f9400Sryan_chen 
5275c8f9400Sryan_chen //	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x04, 0                        );
5285c8f9400Sryan_chen //	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x08, 0                        );
5295c8f9400Sryan_chen //	Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base + 0x0C, AT_MEMRW_BUF( DMA_BASE ) );
5305c8f9400Sryan_chen 	for (i = 0; i < eng->arg.GARPNumCnt; i++) {
5315c8f9400Sryan_chen 		Write_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base      , 0xf0008000 + 60);
5325c8f9400Sryan_chen 		mac_reg_write( eng, 0x18, 0x00000000 );//Tx Poll
5335c8f9400Sryan_chen 
5345c8f9400Sryan_chen 		do {
5355c8f9400Sryan_chen 			NCSI_TxDesDat = Read_Mem_Des_NCSI_DD( eng->run.ncsi_tdes_base );
5365c8f9400Sryan_chen 			if ( ++timeout > TIME_OUT_NCSI ) {
5375c8f9400Sryan_chen 				PRINTF( FP_LOG, "[TxDes-ARP] DesOwn timeout %08x\n", NCSI_TxDesDat );
5385c8f9400Sryan_chen 				return( FindErr( eng, Err_Flag_NCSI_Check_ARPOwnTimeOut ) );
5395c8f9400Sryan_chen 			}
5405c8f9400Sryan_chen 		} while ( HWOwnTx( NCSI_TxDesDat ) );
5415c8f9400Sryan_chen 	}
5425c8f9400Sryan_chen 	return(0);
5435c8f9400Sryan_chen } // End char NCSI_ARP (MAC_ENGINE *eng)
5445c8f9400Sryan_chen 
5455c8f9400Sryan_chen //------------------------------------------------------------
5465c8f9400Sryan_chen char NCSI_SentWaitPacket (MAC_ENGINE *eng, unsigned char command, unsigned char allid, uint16_t length) {
5475c8f9400Sryan_chen 	int        Retry = 0;
5485c8f9400Sryan_chen 
5495c8f9400Sryan_chen 	do {
5505c8f9400Sryan_chen 		if ( NCSI_Tx( eng, command, allid, length ) )
5515c8f9400Sryan_chen 			return( 1 );
5525c8f9400Sryan_chen 
5535c8f9400Sryan_chen #ifdef NCSI_EnableDelay_EachPackage
5545c8f9400Sryan_chen 		DELAY( Delay_EachPackage );
5555c8f9400Sryan_chen #endif
5565c8f9400Sryan_chen 		if ( NCSI_Rx_SLT( eng ) )
5575c8f9400Sryan_chen 			return( 2 );
5585c8f9400Sryan_chen 
5595c8f9400Sryan_chen 		if (    ( eng->ncsi_rsp.IID           != eng->ncsi_req.IID                        )
5605c8f9400Sryan_chen 		     || ( eng->ncsi_rsp.Command       != ( command | 0x80 )                       )
5615c8f9400Sryan_chen 		     || ( eng->ncsi_rsp.Response_Code != SWAP_2B_BEDN( COMMAND_COMPLETED ) ) ) {
5625c8f9400Sryan_chen 			if ( eng->arg.ctrl.b.print_ncsi ) {
5635c8f9400Sryan_chen 				PRINTF( FP_LOG, "Retry: Command = %x, Response_Code = %x", eng->ncsi_req.Command, SWAP_2B_BEDN( eng->ncsi_rsp.Response_Code ) );
5645c8f9400Sryan_chen 				switch ( SWAP_2B_BEDN( eng->ncsi_rsp.Response_Code ) ) {
5655c8f9400Sryan_chen 					case COMMAND_COMPLETED  	: PRINTF( FP_LOG, "(completed  )\n" ); break;
5665c8f9400Sryan_chen 					case COMMAND_FAILED     	: PRINTF( FP_LOG, "(failed     )\n" ); break;
5675c8f9400Sryan_chen 					case COMMAND_UNAVAILABLE	: PRINTF( FP_LOG, "(unavailable)\n" ); break;
5685c8f9400Sryan_chen 					case COMMAND_UNSUPPORTED	: PRINTF( FP_LOG, "(unsupported)\n" ); break;
5695c8f9400Sryan_chen 					default                 	: PRINTF( FP_LOG, "(-----------)\n" ); break;
5705c8f9400Sryan_chen 				}
5715c8f9400Sryan_chen 			}
5725c8f9400Sryan_chen 			Retry++;
5735c8f9400Sryan_chen 		}
5745c8f9400Sryan_chen 		else {
5755c8f9400Sryan_chen 			return( 0 );
5765c8f9400Sryan_chen 		}
5775c8f9400Sryan_chen 	} while (Retry <= SENT_RETRY_COUNT);
5785c8f9400Sryan_chen 
5795c8f9400Sryan_chen 	return( 3 );
5805c8f9400Sryan_chen } // End char NCSI_SentWaitPacket (unsigned char command, unsigned char id, uint16_t length)
5815c8f9400Sryan_chen 
5825c8f9400Sryan_chen //------------------------------------------------------------
5835c8f9400Sryan_chen char Clear_Initial_State_SLT (MAC_ENGINE *eng) {//Command:0x00
5845c8f9400Sryan_chen 	char       return_value;
5855c8f9400Sryan_chen 
586*783c0c9bSDylan Hung 	eng->flg.error_backup  = eng->flg.error;
587*783c0c9bSDylan Hung 	eng->flg.ncsi_backup = eng->flg.ncsi;
5885c8f9400Sryan_chen 
5895c8f9400Sryan_chen 	return_value = NCSI_SentWaitPacket( eng, CLEAR_INITIAL_STATE, eng->ncsi_cap.All_ID, 0 );//Internal Channel ID = 0
5905c8f9400Sryan_chen 
591*783c0c9bSDylan Hung 	eng->flg.error  = eng->flg.error_backup;
592*783c0c9bSDylan Hung 	eng->flg.ncsi = eng->flg.ncsi_backup;
5935c8f9400Sryan_chen 	return( return_value );//Internal Channel ID = 0
5945c8f9400Sryan_chen }
5955c8f9400Sryan_chen 
5965c8f9400Sryan_chen //------------------------------------------------------------
5975c8f9400Sryan_chen char Select_Package_SLT (MAC_ENGINE *eng, char skipflag) {//Command:0x01
5985c8f9400Sryan_chen 	char       return_value;
5995c8f9400Sryan_chen 
6005c8f9400Sryan_chen 	if ( skipflag ) {
601*783c0c9bSDylan Hung 		eng->flg.error_backup  = eng->flg.error;
602*783c0c9bSDylan Hung 		eng->flg.ncsi_backup = eng->flg.ncsi;
6035c8f9400Sryan_chen 	}
6045c8f9400Sryan_chen 
6055c8f9400Sryan_chen 	memset ((void *)eng->dat.NCSI_Payload_Data, 0, 4);
6065c8f9400Sryan_chen 	eng->dat.NCSI_Payload_Data[ 3 ] = 1; //Arbitration Disable
6075c8f9400Sryan_chen 	return_value = NCSI_SentWaitPacket( eng, SELECT_PACKAGE, ( eng->ncsi_cap.Package_ID << 5 ) + 0x1F, 4 );//Internal Channel ID = 0x1F, 0x1F means all channel
6085c8f9400Sryan_chen 	if ( return_value )
609*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Select_Package );
6105c8f9400Sryan_chen 
6115c8f9400Sryan_chen 	if ( skipflag ) {
612*783c0c9bSDylan Hung 		eng->flg.error  = eng->flg.error_backup;
613*783c0c9bSDylan Hung 		eng->flg.ncsi = eng->flg.ncsi_backup;
6145c8f9400Sryan_chen 	}
6155c8f9400Sryan_chen 	return( return_value );
6165c8f9400Sryan_chen }
6175c8f9400Sryan_chen 
6185c8f9400Sryan_chen //------------------------------------------------------------
6195c8f9400Sryan_chen void Select_Active_Package_SLT (MAC_ENGINE *eng) {//Command:0x01
6205c8f9400Sryan_chen 	memset ((void *)eng->dat.NCSI_Payload_Data, 0, 4);
6215c8f9400Sryan_chen 	eng->dat.NCSI_Payload_Data[ 3 ] = 1; //Arbitration Disable
6225c8f9400Sryan_chen 
6235c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, SELECT_PACKAGE, ( eng->ncsi_cap.Package_ID << 5 ) + 0x1F, 4 ) ) //Internal Channel ID = 0x1F, 0x1F means all channel
624*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Select_Active_Package );
6255c8f9400Sryan_chen }
6265c8f9400Sryan_chen 
6275c8f9400Sryan_chen //------------------------------------------------------------
6285c8f9400Sryan_chen void DeSelect_Package_SLT (MAC_ENGINE *eng) {//Command:0x02
6295c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, DESELECT_PACKAGE, ( eng->ncsi_cap.Package_ID << 5 ) + 0x1F, 0 ) ) //Internal Channel ID = 0x1F, 0x1F means all channel
630*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Deselect_Package );
6315c8f9400Sryan_chen 
6325c8f9400Sryan_chen #ifdef NCSI_EnableDelay_DeSelectPackage
6335c8f9400Sryan_chen 	DELAY( Delay_DeSelectPackage );
6345c8f9400Sryan_chen #endif
6355c8f9400Sryan_chen }
6365c8f9400Sryan_chen 
6375c8f9400Sryan_chen //------------------------------------------------------------
6385c8f9400Sryan_chen void Enable_Channel_SLT (MAC_ENGINE *eng) {//Command:0x03
6395c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, ENABLE_CHANNEL, eng->ncsi_cap.All_ID, 0 ) )
640*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Enable_Channel );
6415c8f9400Sryan_chen }
6425c8f9400Sryan_chen 
6435c8f9400Sryan_chen //------------------------------------------------------------
6445c8f9400Sryan_chen void Disable_Channel_SLT (MAC_ENGINE *eng, char skipflag) {//Command:0x04
6455c8f9400Sryan_chen 	if ( skipflag ) {
646*783c0c9bSDylan Hung 		eng->flg.error_backup  = eng->flg.error;
647*783c0c9bSDylan Hung 		eng->flg.ncsi_backup = eng->flg.ncsi;
6485c8f9400Sryan_chen 	}
6495c8f9400Sryan_chen 
6505c8f9400Sryan_chen 	memset ((void *)eng->dat.NCSI_Payload_Data, 0, 4);
6515c8f9400Sryan_chen 	eng->dat.NCSI_Payload_Data[ 3 ] = 0x1; //ALD
6525c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, DISABLE_CHANNEL, eng->ncsi_cap.All_ID, 4 ) )
653*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Disable_Channel );
6545c8f9400Sryan_chen 
6555c8f9400Sryan_chen 	if ( skipflag ) {
656*783c0c9bSDylan Hung 		eng->flg.error  = eng->flg.error_backup;
657*783c0c9bSDylan Hung 		eng->flg.ncsi = eng->flg.ncsi_backup;
6585c8f9400Sryan_chen 	}
6595c8f9400Sryan_chen }
6605c8f9400Sryan_chen 
6615c8f9400Sryan_chen //------------------------------------------------------------
6625c8f9400Sryan_chen void Enable_Network_TX_SLT (MAC_ENGINE *eng) {//Command:0x06
6635c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, ENABLE_CHANNEL_NETWORK_TX, eng->ncsi_cap.All_ID, 0 ) )
664*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Enable_Network_TX );
6655c8f9400Sryan_chen }
6665c8f9400Sryan_chen 
6675c8f9400Sryan_chen //------------------------------------------------------------
6685c8f9400Sryan_chen void Disable_Network_TX_SLT (MAC_ENGINE *eng) {//Command:0x07
6695c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, DISABLE_CHANNEL_NETWORK_TX, eng->ncsi_cap.All_ID, 0 ) )
670*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Disable_Network_TX );
6715c8f9400Sryan_chen }
6725c8f9400Sryan_chen 
6735c8f9400Sryan_chen //------------------------------------------------------------
6745c8f9400Sryan_chen void Set_Link_SLT (MAC_ENGINE *eng) {//Command:0x09
6755c8f9400Sryan_chen 	memset ((void *)eng->dat.NCSI_Payload_Data, 0, 8);
6765c8f9400Sryan_chen 	eng->dat.NCSI_Payload_Data[ 2 ] = 0x02; //full duplex
6775c8f9400Sryan_chen //	eng->dat.NCSI_Payload_Data[ 3 ] = 0x04; //100M, auto-disable
6785c8f9400Sryan_chen 	eng->dat.NCSI_Payload_Data[ 3 ] = 0x05; //100M, auto-enable
6795c8f9400Sryan_chen 
6805c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, SET_LINK, eng->ncsi_cap.All_ID, 8 ) )
681*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Set_Link );
6825c8f9400Sryan_chen }
6835c8f9400Sryan_chen 
6845c8f9400Sryan_chen //------------------------------------------------------------
6855c8f9400Sryan_chen char Get_Link_Status_SLT (MAC_ENGINE *eng) {//Command:0x0a
6865c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, GET_LINK_STATUS, eng->ncsi_cap.All_ID, 0 ) )
6875c8f9400Sryan_chen 		return(0);
6885c8f9400Sryan_chen 	else {
6895c8f9400Sryan_chen 		if ( eng->ncsi_rsp.Payload_Data[ 3 ] & 0x20 ) {
6905c8f9400Sryan_chen 			if ( eng->ncsi_rsp.Payload_Data[ 3 ] & 0x40 ) {
6915c8f9400Sryan_chen 				if ( eng->ncsi_rsp.Payload_Data[ 3 ] & 0x01 )
6925c8f9400Sryan_chen 					return(1); //Link Up or Not
6935c8f9400Sryan_chen 				else
6945c8f9400Sryan_chen 					return(0);
6955c8f9400Sryan_chen 			}
6965c8f9400Sryan_chen 			else
6975c8f9400Sryan_chen 				return(0); //Auto Negotiate did not finish
6985c8f9400Sryan_chen 		}
6995c8f9400Sryan_chen 		else {
7005c8f9400Sryan_chen 			if ( eng->ncsi_rsp.Payload_Data[ 3 ] & 0x01 )
7015c8f9400Sryan_chen 				return(1); //Link Up or Not
7025c8f9400Sryan_chen 			else
7035c8f9400Sryan_chen 				return(0);
7045c8f9400Sryan_chen 		}
7055c8f9400Sryan_chen 	}
7065c8f9400Sryan_chen } // End char Get_Link_Status_SLT (MAC_ENGINE *eng)
7075c8f9400Sryan_chen 
7085c8f9400Sryan_chen //------------------------------------------------------------
7095c8f9400Sryan_chen void Enable_Set_MAC_Address_SLT (MAC_ENGINE *eng)
7105c8f9400Sryan_chen {
7115c8f9400Sryan_chen 	//Command:0x0e
7125c8f9400Sryan_chen 
7135c8f9400Sryan_chen 	int        i;
7145c8f9400Sryan_chen 
7155c8f9400Sryan_chen 	for ( i = 0; i < 6; i++ )
7165c8f9400Sryan_chen 		eng->dat.NCSI_Payload_Data[ i ] = eng->ncsi_req.SA[ i ];
7175c8f9400Sryan_chen 	eng->dat.NCSI_Payload_Data[ 6 ] = 1; //MAC Address Num = 1 --> address filter 1, fixed in sample code
7185c8f9400Sryan_chen 
7195c8f9400Sryan_chen 	if ( eng->ncsi_req.SA[ 0 ] & 0x1 )
7205c8f9400Sryan_chen 		eng->dat.NCSI_Payload_Data[ 7 ] = MULTICAST + ENABLE_MAC_ADDRESS_FILTER; //AT + E
7215c8f9400Sryan_chen 	else
7225c8f9400Sryan_chen 		eng->dat.NCSI_Payload_Data[ 7 ] = UNICAST   + ENABLE_MAC_ADDRESS_FILTER; //AT + E
7235c8f9400Sryan_chen 
7245c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, SET_MAC_ADDRESS, eng->ncsi_cap.All_ID, 8 ) )
725*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Enable_Set_MAC_Address );
7265c8f9400Sryan_chen }
7275c8f9400Sryan_chen 
7285c8f9400Sryan_chen //------------------------------------------------------------
7295c8f9400Sryan_chen void Enable_Broadcast_Filter_SLT (MAC_ENGINE *eng) {//Command:0x10
7305c8f9400Sryan_chen 	memset ((void *)eng->dat.NCSI_Payload_Data, 0, 4);
7315c8f9400Sryan_chen 	eng->dat.NCSI_Payload_Data[ 3 ] = 0xF; //ARP, DHCP, NetBIOS
7325c8f9400Sryan_chen 
7335c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, ENABLE_BROADCAST_FILTERING, eng->ncsi_cap.All_ID, 4 ) )
734*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Enable_Broadcast_Filter );
7355c8f9400Sryan_chen }
7365c8f9400Sryan_chen 
7375c8f9400Sryan_chen //------------------------------------------------------------
7385c8f9400Sryan_chen void Get_Version_ID_SLT (MAC_ENGINE *eng) {//Command:0x15
7395c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, GET_VERSION_ID, eng->ncsi_cap.All_ID, 0 ) )
740*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Get_Version_ID );
7415c8f9400Sryan_chen 	else {
7425c8f9400Sryan_chen #ifdef Print_Version_ID
7435c8f9400Sryan_chen 		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 ]);
7445c8f9400Sryan_chen 		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 ]);
7455c8f9400Sryan_chen 		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 ]);
7465c8f9400Sryan_chen 		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 ]);
7475c8f9400Sryan_chen 		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 ]);
7485c8f9400Sryan_chen 		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 ]);
7495c8f9400Sryan_chen 		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 ]);
7505c8f9400Sryan_chen 		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 ]);
7515c8f9400Sryan_chen 		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 ]);
7525c8f9400Sryan_chen 		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 ]);
7535c8f9400Sryan_chen #endif
7545c8f9400Sryan_chen 		eng->ncsi_cap.PCI_DID_VID    = (eng->ncsi_rsp.Payload_Data[ 24 ]<<24)
7555c8f9400Sryan_chen 		                             | (eng->ncsi_rsp.Payload_Data[ 25 ]<<16)
7565c8f9400Sryan_chen 		                             | (eng->ncsi_rsp.Payload_Data[ 26 ]<< 8)
7575c8f9400Sryan_chen 		                             | (eng->ncsi_rsp.Payload_Data[ 27 ]    );
7585c8f9400Sryan_chen 		eng->ncsi_cap.manufacturer_id = (eng->ncsi_rsp.Payload_Data[ 32 ]<<24)
7595c8f9400Sryan_chen 		                             | (eng->ncsi_rsp.Payload_Data[ 33 ]<<16)
7605c8f9400Sryan_chen 		                             | (eng->ncsi_rsp.Payload_Data[ 34 ]<< 8)
7615c8f9400Sryan_chen 		                             | (eng->ncsi_rsp.Payload_Data[ 35 ]    );
7625c8f9400Sryan_chen 	}
7635c8f9400Sryan_chen } // End void Get_Version_ID_SLT (MAC_ENGINE *eng)
7645c8f9400Sryan_chen 
7655c8f9400Sryan_chen //------------------------------------------------------------
7665c8f9400Sryan_chen void Get_Capabilities_SLT (MAC_ENGINE *eng) {//Command:0x16
7675c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, GET_CAPABILITIES, eng->ncsi_cap.All_ID, 0 ) )
768*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Get_Capabilities );
7695c8f9400Sryan_chen 	else {
7705c8f9400Sryan_chen //		eng->ncsi_cap.Capabilities_Flags                   = (eng->ncsi_rsp.Payload_Data[  0 ]<<24)
7715c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[  1 ]<<16)
7725c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[  2 ]<< 8)
7735c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[  3 ]    );
7745c8f9400Sryan_chen //		eng->ncsi_cap.Broadcast_Packet_Filter_Capabilities = (eng->ncsi_rsp.Payload_Data[  4 ]<<24)
7755c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[  5 ]<<16)
7765c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[  6 ]<< 8)
7775c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[  7 ]    );
7785c8f9400Sryan_chen //		eng->ncsi_cap.Multicast_Packet_Filter_Capabilities = (eng->ncsi_rsp.Payload_Data[  8 ]<<24)
7795c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[  9 ]<<16)
7805c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[ 10 ]<< 8)
7815c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[ 11 ]    );
7825c8f9400Sryan_chen //		eng->ncsi_cap.Buffering_Capabilities               = (eng->ncsi_rsp.Payload_Data[ 12 ]<<24)
7835c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[ 13 ]<<16)
7845c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[ 14 ]<< 8)
7855c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[ 15 ]    );
7865c8f9400Sryan_chen //		eng->ncsi_cap.AEN_Control_Support                  = (eng->ncsi_rsp.Payload_Data[ 16 ]<<24)
7875c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[ 17 ]<<16)
7885c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[ 18 ]<< 8)
7895c8f9400Sryan_chen //		                                                   | (eng->ncsi_rsp.Payload_Data[ 19 ]    );
7905c8f9400Sryan_chen //		eng->ncsi_cap.VLAN_Filter_Count                    =  eng->ncsi_rsp.Payload_Data[ 20 ];
7915c8f9400Sryan_chen 		eng->ncsi_cap.Mixed_Filter_Count                   =  eng->ncsi_rsp.Payload_Data[ 21 ];
7925c8f9400Sryan_chen //		eng->ncsi_cap.Multicast_Filter_Count               =  eng->ncsi_rsp.Payload_Data[ 22 ];
7935c8f9400Sryan_chen 		eng->ncsi_cap.Unicast_Filter_Count                 =  eng->ncsi_rsp.Payload_Data[ 23 ];
7945c8f9400Sryan_chen //		eng->ncsi_cap.VLAN_Mode_Support                    =  eng->ncsi_rsp.Payload_Data[ 26 ]
7955c8f9400Sryan_chen 		eng->ncsi_cap.Channel_Count                        =  eng->ncsi_rsp.Payload_Data[ 27 ];
7965c8f9400Sryan_chen 	}
7975c8f9400Sryan_chen }
7985c8f9400Sryan_chen 
7995c8f9400Sryan_chen //------------------------------------------------------------
8005c8f9400Sryan_chen void Get_Controller_Packet_Statistics_SLT (MAC_ENGINE *eng) {//Command:0x18
8015c8f9400Sryan_chen 	if ( NCSI_SentWaitPacket( eng, GET_CONTROLLER_PACKET_STATISTICS, eng->ncsi_cap.All_ID, 0 ) )
802*783c0c9bSDylan Hung 		ncsi_set_error_flag( eng, NCSI_Flag_Get_Controller_Packet_Statistics );
8035c8f9400Sryan_chen }
8045c8f9400Sryan_chen 
8055c8f9400Sryan_chen //------------------------------------------------------------
8065c8f9400Sryan_chen char phy_ncsi (MAC_ENGINE *eng)
8075c8f9400Sryan_chen {
8085c8f9400Sryan_chen 	uint32_t pkg_idx;
8095c8f9400Sryan_chen 	uint32_t chl_idx;
8105c8f9400Sryan_chen 	uint32_t select_flag[MAX_PACKAGE_NUM];
8115c8f9400Sryan_chen 	uint32_t Re_Send;
8125c8f9400Sryan_chen 	uint32_t Link_Status;
8135c8f9400Sryan_chen 
8145c8f9400Sryan_chen 	eng->dat.NCSI_RxEr = 0;
8155c8f9400Sryan_chen 	eng->dat.number_chl = 0;
8165c8f9400Sryan_chen 	eng->dat.number_pak = 0;
8175c8f9400Sryan_chen 	eng->ncsi_cap.Package_ID = 0;
8185c8f9400Sryan_chen 	eng->ncsi_cap.Channel_ID = 0x1F;
8195c8f9400Sryan_chen 	eng->ncsi_cap.All_ID = 0x1F;
8205c8f9400Sryan_chen 	PRINTF(FP_LOG, "\n\n======> Start:\n");
8215c8f9400Sryan_chen 
8225c8f9400Sryan_chen 	NCSI_Struct_Initialize_SLT(eng);
8235c8f9400Sryan_chen 
8245c8f9400Sryan_chen #ifdef NCSI_Skip_Phase1_DeSelectPackage
8255c8f9400Sryan_chen #else
8265c8f9400Sryan_chen 	//NCSI Start
8275c8f9400Sryan_chen 	//Disable Channel then DeSelect Package
8285c8f9400Sryan_chen 	for (pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++) {
8295c8f9400Sryan_chen 		eng->ncsi_cap.Package_ID = pkg_idx;
8305c8f9400Sryan_chen 		eng->ncsi_cap.Channel_ID = 0x1F;
8315c8f9400Sryan_chen 		eng->ncsi_cap.All_ID     = ( eng->ncsi_cap.Package_ID << 5) + eng->ncsi_cap.Channel_ID;
8325c8f9400Sryan_chen 
8335c8f9400Sryan_chen 		select_flag[ pkg_idx ] = Select_Package_SLT ( eng, 1 ); //skipflag// Command:0x01
8345c8f9400Sryan_chen 
8355c8f9400Sryan_chen 		if ( select_flag[ pkg_idx ] == 0 ) {
8365c8f9400Sryan_chen 			if ( !eng->run.IO_MrgChk ) {
8375c8f9400Sryan_chen 				printf("----Find Package ID: %d\n", eng->ncsi_cap.Package_ID);
8385c8f9400Sryan_chen 				PRINTF(FP_LOG, "----Find Package ID: %d\n", eng->ncsi_cap.Package_ID );
8395c8f9400Sryan_chen 			}
8405c8f9400Sryan_chen 			for ( chl_idx = 0; chl_idx < MAX_CHANNEL_NUM; chl_idx++ ) {
8415c8f9400Sryan_chen 				eng->ncsi_cap.Channel_ID = chl_idx;
8425c8f9400Sryan_chen 				eng->ncsi_cap.All_ID     = ( eng->ncsi_cap.Package_ID << 5) + eng->ncsi_cap.Channel_ID;
8435c8f9400Sryan_chen 
8445c8f9400Sryan_chen 				Disable_Channel_SLT( eng, 1 );//skipflag // Command: 0x04
8455c8f9400Sryan_chen 			}
8465c8f9400Sryan_chen   #ifdef NCSI_Skip_DeSelectPackage
8475c8f9400Sryan_chen   #else
8485c8f9400Sryan_chen 			DeSelect_Package_SLT ( eng ); // Command:0x02
8495c8f9400Sryan_chen   #endif
8505c8f9400Sryan_chen 		} else {
8515c8f9400Sryan_chen 			if ( !eng->run.IO_MrgChk ) {
8525c8f9400Sryan_chen 				printf("----Absence of Package ID: %d\n", pkg_idx);
8535c8f9400Sryan_chen 				PRINTF( FP_LOG, "----Absence of Package ID: %d\n", pkg_idx );
8545c8f9400Sryan_chen 			}
8555c8f9400Sryan_chen 		} // End if ( select_flag[ pkg_idx ] == 0 )
8565c8f9400Sryan_chen 	} // End for (pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++)
8575c8f9400Sryan_chen #endif
8585c8f9400Sryan_chen 
8595c8f9400Sryan_chen 	//Select Package
8605c8f9400Sryan_chen 	for ( pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++ ) {
8615c8f9400Sryan_chen 		eng->ncsi_cap.Package_ID = pkg_idx;
8625c8f9400Sryan_chen 		eng->ncsi_cap.Channel_ID = 0x1F;
8635c8f9400Sryan_chen 		eng->ncsi_cap.All_ID     = ( eng->ncsi_cap.Package_ID << 5) + eng->ncsi_cap.Channel_ID;
8645c8f9400Sryan_chen 
8655c8f9400Sryan_chen #ifdef NCSI_Skip_Phase1_DeSelectPackage
8665c8f9400Sryan_chen 		select_flag[ pkg_idx ] = Select_Package_SLT ( eng, 1 ); //skipflag//Command:0x01
8675c8f9400Sryan_chen #endif
8685c8f9400Sryan_chen 
8695c8f9400Sryan_chen 		if ( select_flag[ pkg_idx ] == 0 ) {
8705c8f9400Sryan_chen 			//eng->run.NCSI_RxTimeOutScale = 1000;
8715c8f9400Sryan_chen 			eng->run.NCSI_RxTimeOutScale = 10;
8725c8f9400Sryan_chen 
8735c8f9400Sryan_chen #ifdef NCSI_Skip_Phase1_DeSelectPackage
8745c8f9400Sryan_chen #else
8755c8f9400Sryan_chen 			Select_Package_SLT ( eng, 0 );//Command:0x01
8765c8f9400Sryan_chen #endif
8775c8f9400Sryan_chen 			eng->dat.number_pak++;
8785c8f9400Sryan_chen 			if ( !eng->run.IO_MrgChk ) {
8795c8f9400Sryan_chen 				printf("====Find Package ID: %d\n", eng->ncsi_cap.Package_ID);
8805c8f9400Sryan_chen 				PRINTF(FP_LOG, "====Find Package ID: %d\n", eng->ncsi_cap.Package_ID );
8815c8f9400Sryan_chen 			}
8825c8f9400Sryan_chen 
8835c8f9400Sryan_chen 			// Scan all channel in the package
8845c8f9400Sryan_chen 			for ( chl_idx = 0; chl_idx < MAX_CHANNEL_NUM; chl_idx++ ) {
8855c8f9400Sryan_chen 				eng->ncsi_cap.Channel_ID = chl_idx;
8865c8f9400Sryan_chen 				eng->ncsi_cap.All_ID     = ( eng->ncsi_cap.Package_ID << 5) + eng->ncsi_cap.Channel_ID;
8875c8f9400Sryan_chen 
8885c8f9400Sryan_chen 				if ( Clear_Initial_State_SLT( eng ) == 0 ) { //Command:0x00
8895c8f9400Sryan_chen 					eng->dat.number_chl++;
8905c8f9400Sryan_chen 					if ( !eng->run.IO_MrgChk ) {
8915c8f9400Sryan_chen 						printf("--------Find Channel ID: %d\n", eng->ncsi_cap.Channel_ID);
8925c8f9400Sryan_chen 						PRINTF( FP_LOG, "--------Find Channel ID: %d\n", eng->ncsi_cap.Channel_ID );
8935c8f9400Sryan_chen 					}
8945c8f9400Sryan_chen 
8955c8f9400Sryan_chen 					// Get Version and Capabilities
8965c8f9400Sryan_chen 					Get_Version_ID_SLT( eng );          //Command:0x15
8975c8f9400Sryan_chen 					Get_Capabilities_SLT( eng );        //Command:0x16
8985c8f9400Sryan_chen 					Select_Active_Package_SLT( eng );   //Command:0x01
8995c8f9400Sryan_chen 					Enable_Set_MAC_Address_SLT( eng );  //Command:0x0e
9005c8f9400Sryan_chen 					Enable_Broadcast_Filter_SLT( eng ); //Command:0x10
9015c8f9400Sryan_chen 
9025c8f9400Sryan_chen 					// Enable TX
9035c8f9400Sryan_chen 					Enable_Network_TX_SLT( eng );       //Command:0x06
9045c8f9400Sryan_chen 
9055c8f9400Sryan_chen 					// Enable Channel
9065c8f9400Sryan_chen 					Enable_Channel_SLT( eng );          //Command:0x03
9075c8f9400Sryan_chen 
9085c8f9400Sryan_chen 					// Get Link Status
9095c8f9400Sryan_chen 					Re_Send = 0;
9105c8f9400Sryan_chen 					do {
9115c8f9400Sryan_chen #ifdef NCSI_EnableDelay_GetLinkStatus
9125c8f9400Sryan_chen 						if ( Re_Send )
9135c8f9400Sryan_chen 							DELAY( Delay_GetLinkStatus );
9145c8f9400Sryan_chen #endif
9155c8f9400Sryan_chen 
9165c8f9400Sryan_chen 						Link_Status = Get_Link_Status_SLT( eng );//Command:0x0a
9175c8f9400Sryan_chen 						if ( Link_Status == LINK_UP ) {
9185c8f9400Sryan_chen 							if ( eng->arg.GARPNumCnt )
9195c8f9400Sryan_chen 								NCSI_ARP ( eng );
9205c8f9400Sryan_chen 							break;
9215c8f9400Sryan_chen 						} // End if ( Link_Status == LINK_UP )
9225c8f9400Sryan_chen 					} while ( Re_Send++ <= 2 );
9235c8f9400Sryan_chen 
9245c8f9400Sryan_chen 					if ( !eng->run.IO_MrgChk ) {
9255c8f9400Sryan_chen 						if ( Link_Status == LINK_UP ) {
9265c8f9400Sryan_chen 							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);
9275c8f9400Sryan_chen 							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);
9285c8f9400Sryan_chen 						}
9295c8f9400Sryan_chen 						else {
9305c8f9400Sryan_chen 							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);
9315c8f9400Sryan_chen 							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);
9325c8f9400Sryan_chen 						}
9335c8f9400Sryan_chen 					}
9345c8f9400Sryan_chen 
9355c8f9400Sryan_chen #ifdef NCSI_Skip_DiSChannel
9365c8f9400Sryan_chen #else
9375c8f9400Sryan_chen 					if ( eng->run.TM_NCSI_DiSChannel ) {
9385c8f9400Sryan_chen 						// Disable TX
9395c8f9400Sryan_chen 						Disable_Network_TX_SLT( eng ); //Command:0x07
9405c8f9400Sryan_chen 						// Disable Channel
9415c8f9400Sryan_chen 						Disable_Channel_SLT( eng, 0 );    //Command:0x04
9425c8f9400Sryan_chen 					}
9435c8f9400Sryan_chen #endif
9445c8f9400Sryan_chen 				} // End if ( Clear_Initial_State_SLT( eng, chl_idx ) == 0 )
9455c8f9400Sryan_chen 			} // End for ( chl_idx = 0; chl_idx < MAX_CHANNEL_NUM; chl_idx++ )
9465c8f9400Sryan_chen 
9475c8f9400Sryan_chen #ifdef NCSI_Skip_DeSelectPackage
9485c8f9400Sryan_chen #else
9495c8f9400Sryan_chen 			DeSelect_Package_SLT ( eng );//Command:0x02
9505c8f9400Sryan_chen #endif
9515c8f9400Sryan_chen 			eng->run.NCSI_RxTimeOutScale = 1;
9525c8f9400Sryan_chen 		}
9535c8f9400Sryan_chen 		else {
9545c8f9400Sryan_chen 			if ( !eng->run.IO_MrgChk ) {
9555c8f9400Sryan_chen 				printf("====Absence of Package ID: %d\n", pkg_idx);
9565c8f9400Sryan_chen 				PRINTF( FP_LOG, "====Absence of Package ID: %d\n", pkg_idx );
9575c8f9400Sryan_chen 			}
9585c8f9400Sryan_chen 		} // End if ( select_flag[pkg_idx] == 0 )
9595c8f9400Sryan_chen 	} // End for ( pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++ )
9605c8f9400Sryan_chen 
9615c8f9400Sryan_chen 	if ( eng->dat.number_pak == 0                       ) FindErr( eng, Err_Flag_NCSI_No_PHY      );
9625c8f9400Sryan_chen 	if ( eng->dat.number_pak != eng->arg.GPackageTolNum ) FindErr( eng, Err_Flag_NCSI_Package_Num );
9635c8f9400Sryan_chen 	if ( eng->dat.number_chl != eng->arg.GChannelTolNum ) FindErr( eng, Err_Flag_NCSI_Channel_Num );
9645c8f9400Sryan_chen //	if ( eng->dat.number_chl == 0                       ) FindErr( eng );
9655c8f9400Sryan_chen 
966*783c0c9bSDylan Hung 	if ( eng->flg.error ) {
9675c8f9400Sryan_chen 		if ( eng->dat.NCSI_RxEr )
9685c8f9400Sryan_chen 			FindErr_Des( eng, Des_Flag_RxErr );
9695c8f9400Sryan_chen 		return(1);
9705c8f9400Sryan_chen 	}
9715c8f9400Sryan_chen 	else {
9725c8f9400Sryan_chen 		if ( eng->dat.NCSI_RxEr ) {
973*783c0c9bSDylan Hung 			eng->flg.warn = eng->flg.warn | Wrn_Flag_RxErFloatting;
9745c8f9400Sryan_chen 			if ( eng->arg.ctrl.b.skip_rx_err ) {
9755c8f9400Sryan_chen 				eng->flg.all_fail = 0;
9765c8f9400Sryan_chen 				return(0);
9775c8f9400Sryan_chen 			}
9785c8f9400Sryan_chen 			else {
9795c8f9400Sryan_chen 				FindErr_Des( eng, Des_Flag_RxErr );
9805c8f9400Sryan_chen 				return(1);
9815c8f9400Sryan_chen 			}
9825c8f9400Sryan_chen 		}
9835c8f9400Sryan_chen 		else {
9845c8f9400Sryan_chen 			eng->flg.all_fail = 0;
9855c8f9400Sryan_chen 			return(0);
9865c8f9400Sryan_chen 		}
9875c8f9400Sryan_chen 	}
9885c8f9400Sryan_chen }
989