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