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 //#define MAC_DEBUG_REGRW_MAC 12 //#define MAC_DEBUG_REGRW_PHY 13 //#define MAC_DEBUG_REGRW_SCU 14 //#define MAC_DEBUG_REGRW_WDT 15 //#define MAC_DEBUG_REGRW_SDR 16 //#define MAC_DEBUG_REGRW_SMB 17 //#define MAC_DEBUG_REGRW_TIMER 18 //#define MAC_DEBUG_REGRW_GPIO 19 //#define MAC_DEBUG_MEMRW_Dat 20 //#define MAC_DEBUG_MEMRW_Des 21 22 #define MAC_C 23 24 #include "swfunc.h" 25 26 #include "comminf.h" 27 #include <command.h> 28 #include <common.h> 29 #include <malloc.h> 30 #include "mem_io.h" 31 // ------------------------------------------------------------- 32 const uint32_t ARP_org_data[16] = { 33 0xffffffff, 34 0x0000ffff, // SA:00-00- 35 0x12345678, // SA:78-56-34-12 36 0x01000608, // ARP(0x0806) 37 0x04060008, 38 0x00000100, // sender MAC Address: 00 00 39 0x12345678, // sender MAC Address: 12 34 56 78 40 0xeb00a8c0, // sender IP Address: 192.168.0.235 (C0.A8.0.EB) 41 0x00000000, // target MAC Address: 00 00 00 00 42 0xa8c00000, // target MAC Address: 00 00, target IP Address:192.168 43 0x00005c00, // target IP Address: 0.92 (C0.A8.0.5C) 44 // 0x00000100, // target IP Address: 0.1 (C0.A8.0.1) 45 // 0x0000de00, // target IP Address: 0.222 (C0.A8.0.DE) 46 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xc68e2bd5}; 47 48 //------------------------------------------------------------ 49 // Read Memory 50 //------------------------------------------------------------ 51 uint32_t Read_Mem_Dat_NCSI_DD(uint32_t addr) 52 { 53 #ifdef MAC_DEBUG_MEMRW_Dat 54 printf("[MEMRd-Dat] %08x = %08x\n", addr, SWAP_4B_LEDN_MEM( readl(addr) ) ); 55 #endif 56 return ( SWAP_4B_LEDN_MEM( readl(addr) ) ); 57 } 58 59 uint32_t Read_Mem_Des_NCSI_DD(uint32_t addr) 60 { 61 #ifdef MAC_DEBUG_MEMRW_Des 62 printf("[MEMRd-Des] %08x = %08x\n", addr, 63 SWAP_4B_LEDN_MEM(readl(addr))); 64 #endif 65 return (SWAP_4B_LEDN_MEM(readl(addr))); 66 } 67 68 uint32_t Read_Mem_Dat_DD(uint32_t addr) 69 { 70 #ifdef MAC_DEBUG_MEMRW_Dat 71 printf("[MEMRd-Dat] %08x = %08x\n", addr, 72 SWAP_4B_LEDN_MEM(readl(addr))); 73 #endif 74 return (SWAP_4B_LEDN_MEM(readl(addr))); 75 } 76 77 uint32_t Read_Mem_Des_DD(uint32_t addr) 78 { 79 #ifdef MAC_DEBUG_MEMRW_Des 80 printf("[MEMRd-Des] %08x = %08x\n", addr, 81 SWAP_4B_LEDN_MEM(readl(addr))); 82 #endif 83 return (SWAP_4B_LEDN_MEM(readl(addr))); 84 } 85 86 //------------------------------------------------------------ 87 // Read Register 88 //------------------------------------------------------------ 89 uint32_t mac_reg_read(MAC_ENGINE *p_eng, uint32_t addr) 90 { 91 return readl(p_eng->run.mac_base + addr); 92 } 93 94 //------------------------------------------------------------ 95 // Write Memory 96 //------------------------------------------------------------ 97 void Write_Mem_Dat_NCSI_DD (uint32_t addr, uint32_t data) { 98 #ifdef MAC_DEBUG_MEMRW_Dat 99 printf("[MEMWr-Dat] %08x = %08x\n", addr, SWAP_4B_LEDN_MEM( data ) ); 100 #endif 101 writel(data, addr); 102 } 103 void Write_Mem_Des_NCSI_DD (uint32_t addr, uint32_t data) { 104 #ifdef MAC_DEBUG_MEMRW_Des 105 printf("[MEMWr-Des] %08x = %08x\n", addr, SWAP_4B_LEDN_MEM( data ) ); 106 #endif 107 writel(data, addr); 108 } 109 void Write_Mem_Dat_DD (uint32_t addr, uint32_t data) { 110 #ifdef MAC_DEBUG_MEMRW_Dat 111 printf("[MEMWr-Dat] %08x = %08x\n", addr, SWAP_4B_LEDN_MEM( data ) ); 112 #endif 113 writel(data, addr); 114 } 115 void Write_Mem_Des_DD (uint32_t addr, uint32_t data) { 116 #ifdef MAC_DEBUG_MEMRW_Des 117 printf("[MEMWr-Des] %08x = %08x\n", addr, SWAP_4B_LEDN_MEM( data ) ); 118 #endif 119 writel(data, addr); 120 } 121 122 //------------------------------------------------------------ 123 // Write Register 124 //------------------------------------------------------------ 125 void mac_reg_write(MAC_ENGINE *p_eng, uint32_t addr, uint32_t data) 126 { 127 writel(data, p_eng->run.mac_base + addr); 128 } 129 130 131 //------------------------------------------------------------ 132 // Others 133 //------------------------------------------------------------ 134 void debug_pause (void) { 135 #ifdef DbgPrn_Enable_Debug_pause 136 GET_CAHR(); 137 #endif 138 } 139 140 //------------------------------------------------------------ 141 void dump_mac_ROreg(MAC_ENGINE *p_eng) 142 { 143 int i = 0xa0; 144 145 printf("\nMAC%d base 0x%08x", p_eng->run.mac_idx, p_eng->run.mac_base); 146 printf("\n%02x:", i); 147 for (i = 0xa0; i <= 0xc8; i += 4) { 148 printf("%08x ", mac_reg_read(p_eng, i)); 149 if ((i & 0xf) == 0xc) 150 printf("\n%02x:", i + 4); 151 } 152 printf("\n"); 153 } 154 155 //------------------------------------------------------------ 156 // IO delay 157 //------------------------------------------------------------ 158 static void get_mac_1g_delay_1(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d) 159 { 160 int tx_d, rx_d; 161 mac_delay_1g_t reg; 162 163 reg.w = readl(addr); 164 tx_d = reg.b.tx_delay_1; 165 rx_d = reg.b.rx_delay_1; 166 #ifdef CONFIG_ASPEED_AST2600 167 if (reg.b.rx_clk_inv_1 == 1) { 168 rx_d = (-1) * rx_d; 169 } 170 #endif 171 *p_tx_d = tx_d; 172 *p_rx_d = rx_d; 173 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 174 rx_d, tx_d); 175 } 176 177 static void get_mac_1g_delay_2(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d) 178 { 179 int tx_d, rx_d; 180 mac_delay_1g_t reg; 181 182 reg.w = readl(addr); 183 tx_d = reg.b.tx_delay_2; 184 rx_d = reg.b.rx_delay_2; 185 #ifdef CONFIG_ASPEED_AST2600 186 if (reg.b.rx_clk_inv_2 == 1) { 187 rx_d = (-1) * rx_d; 188 } 189 #endif 190 *p_tx_d = tx_d; 191 *p_rx_d = rx_d; 192 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 193 rx_d, tx_d); 194 } 195 196 static void get_mac_100_10_delay_1(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d) 197 { 198 int tx_d, rx_d; 199 mac_delay_100_10_t reg; 200 201 reg.w = readl(addr); 202 tx_d = reg.b.tx_delay_1; 203 rx_d = reg.b.rx_delay_1; 204 #ifdef CONFIG_ASPEED_AST2600 205 if (reg.b.rx_clk_inv_1 == 1) { 206 rx_d = (-1) * rx_d; 207 } 208 #endif 209 *p_tx_d = tx_d; 210 *p_rx_d = rx_d; 211 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 212 rx_d, tx_d); 213 } 214 215 static void get_mac_100_10_delay_2(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d) 216 { 217 int tx_d, rx_d; 218 mac_delay_100_10_t reg; 219 220 reg.w = readl(addr); 221 tx_d = reg.b.tx_delay_2; 222 rx_d = reg.b.rx_delay_2; 223 #ifdef CONFIG_ASPEED_AST2600 224 if (reg.b.rx_clk_inv_2 == 1) { 225 rx_d = (-1) * rx_d; 226 } 227 #endif 228 *p_tx_d = tx_d; 229 *p_rx_d = rx_d; 230 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 231 rx_d, tx_d); 232 } 233 234 static void get_mac_rmii_delay_1(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d) 235 { 236 mac_delay_1g_t reg; 237 238 reg.w = readl(addr); 239 *p_rx_d = reg.b.rx_delay_1; 240 *p_tx_d = reg.b.rmii_tx_data_at_falling_1; 241 242 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 243 *p_rx_d, *p_tx_d); 244 } 245 static void get_mac_rmii_delay_2(uint32_t addr, int32_t *p_rx_d, int32_t *p_tx_d) 246 { 247 mac_delay_1g_t reg; 248 249 reg.w = readl(addr); 250 *p_rx_d = reg.b.rx_delay_2; 251 *p_tx_d = reg.b.rmii_tx_data_at_falling_2; 252 253 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 254 *p_rx_d, *p_tx_d); 255 } 256 257 static 258 void get_mac1_1g_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 259 { 260 get_mac_1g_delay_1(p_eng->io.mac12_1g_delay.addr, p_rx_d, p_tx_d); 261 } 262 static 263 void get_mac1_100m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 264 { 265 get_mac_100_10_delay_1(p_eng->io.mac12_100m_delay.addr, p_rx_d, p_tx_d); 266 } 267 static 268 void get_mac1_10m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 269 { 270 get_mac_100_10_delay_1(p_eng->io.mac12_10m_delay.addr, p_rx_d, p_tx_d); 271 } 272 static 273 void get_mac2_1g_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 274 { 275 get_mac_1g_delay_2(p_eng->io.mac12_1g_delay.addr, p_rx_d, p_tx_d); 276 } 277 static 278 void get_mac2_100m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 279 { 280 get_mac_100_10_delay_2(p_eng->io.mac12_100m_delay.addr, p_rx_d, p_tx_d); 281 } 282 static 283 void get_mac2_10m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 284 { 285 get_mac_100_10_delay_2(p_eng->io.mac12_10m_delay.addr, p_rx_d, p_tx_d); 286 } 287 static 288 void get_mac3_1g_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 289 { 290 get_mac_1g_delay_1(p_eng->io.mac34_1g_delay.addr, p_rx_d, p_tx_d); 291 } 292 static 293 void get_mac3_100m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 294 { 295 get_mac_100_10_delay_1(p_eng->io.mac34_100m_delay.addr, p_rx_d, p_tx_d); 296 } 297 static 298 void get_mac3_10m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 299 { 300 get_mac_100_10_delay_1(p_eng->io.mac34_10m_delay.addr, p_rx_d, p_tx_d); 301 } 302 static 303 void get_mac4_1g_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 304 { 305 get_mac_1g_delay_2(p_eng->io.mac34_1g_delay.addr, p_rx_d, p_tx_d); 306 } 307 static 308 void get_mac4_100m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 309 { 310 get_mac_100_10_delay_2(p_eng->io.mac34_100m_delay.addr, p_rx_d, p_tx_d); 311 } 312 static 313 void get_mac4_10m_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 314 { 315 get_mac_100_10_delay_2(p_eng->io.mac34_10m_delay.addr, p_rx_d, p_tx_d); 316 } 317 static 318 void get_mac1_rmii_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 319 { 320 get_mac_rmii_delay_1(p_eng->io.mac12_1g_delay.addr, p_rx_d, p_tx_d); 321 } 322 static 323 void get_mac2_rmii_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 324 { 325 get_mac_rmii_delay_2(p_eng->io.mac12_1g_delay.addr, p_rx_d, p_tx_d); 326 } 327 static 328 void get_mac3_rmii_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 329 { 330 get_mac_rmii_delay_1(p_eng->io.mac34_1g_delay.addr, p_rx_d, p_tx_d); 331 } 332 static 333 void get_mac4_rmii_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 334 { 335 get_mac_rmii_delay_2(p_eng->io.mac34_1g_delay.addr, p_rx_d, p_tx_d); 336 } 337 static 338 void get_dummy_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 339 { 340 debug("%s\n", __func__); 341 } 342 343 /** 344 * @brief function pointer table to get current delay setting 345 * 346 * get_delay_func_tbl[rmii/rgmii][mac_idx][speed_idx 1g/100m/10m] 347 */ 348 typedef void (*pfn_get_delay) (MAC_ENGINE *, int32_t *, int32_t *); 349 pfn_get_delay get_delay_func_tbl[2][4][3] = { 350 { 351 {get_mac1_rmii_delay, get_mac1_rmii_delay, get_mac1_rmii_delay}, 352 {get_mac2_rmii_delay, get_mac2_rmii_delay, get_mac2_rmii_delay}, 353 #if defined(CONFIG_ASPEED_AST2600) 354 {get_mac3_rmii_delay, get_mac3_rmii_delay, get_mac3_rmii_delay}, 355 {get_mac4_rmii_delay, get_mac4_rmii_delay, get_mac4_rmii_delay}, 356 #else 357 {get_dummy_delay, get_dummy_delay, get_dummy_delay}, 358 {get_dummy_delay, get_dummy_delay, get_dummy_delay}, 359 #endif 360 }, 361 { 362 {get_mac1_1g_delay, get_mac1_100m_delay, get_mac1_10m_delay}, 363 {get_mac2_1g_delay, get_mac2_100m_delay, get_mac2_10m_delay}, 364 #if defined(CONFIG_ASPEED_AST2600) 365 {get_mac3_1g_delay, get_mac3_100m_delay, get_mac3_10m_delay}, 366 {get_mac4_1g_delay, get_mac4_100m_delay, get_mac4_10m_delay}, 367 #else 368 {get_dummy_delay, get_dummy_delay, get_dummy_delay}, 369 {get_dummy_delay, get_dummy_delay, get_dummy_delay}, 370 #endif 371 } 372 }; 373 void mac_get_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 374 { 375 #if 1 376 uint32_t rgmii = (uint32_t)p_eng->run.is_rgmii; 377 uint32_t mac_idx = p_eng->run.mac_idx; 378 uint32_t speed_idx = p_eng->run.speed_idx; 379 380 get_delay_func_tbl[rgmii][mac_idx][speed_idx] (p_eng, p_rx_d, p_tx_d); 381 #else 382 /* for test */ 383 uint32_t rgmii; 384 uint32_t mac_idx; 385 uint32_t speed_idx; 386 for (rgmii = 0; rgmii < 2; rgmii++) 387 for (mac_idx = 0; mac_idx < 4; mac_idx++) 388 for (speed_idx = 0; speed_idx < 3; speed_idx++) 389 get_delay_func_tbl[rgmii][mac_idx][speed_idx]( 390 p_eng, p_rx_d, p_tx_d); 391 #endif 392 } 393 394 void mac_get_max_available_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 395 { 396 uint32_t rgmii = (uint32_t)p_eng->run.is_rgmii; 397 uint32_t mac_idx = p_eng->run.mac_idx; 398 int32_t tx_max, rx_max; 399 400 if (rgmii) { 401 if (mac_idx > 1) { 402 tx_max = p_eng->io.mac34_1g_delay.tx_max; 403 rx_max = p_eng->io.mac34_1g_delay.rx_max; 404 } else { 405 tx_max = p_eng->io.mac12_1g_delay.tx_max; 406 rx_max = p_eng->io.mac12_1g_delay.rx_max; 407 } 408 } else { 409 if (mac_idx > 1) { 410 tx_max = p_eng->io.mac34_1g_delay.rmii_tx_max; 411 rx_max = p_eng->io.mac34_1g_delay.rmii_rx_max; 412 } else { 413 tx_max = p_eng->io.mac12_1g_delay.rmii_tx_max; 414 rx_max = p_eng->io.mac12_1g_delay.rmii_rx_max; 415 } 416 } 417 *p_tx_d = tx_max; 418 *p_rx_d = rx_max; 419 } 420 421 void mac_get_min_available_delay(MAC_ENGINE *p_eng, int32_t *p_rx_d, int32_t *p_tx_d) 422 { 423 uint32_t rgmii = (uint32_t)p_eng->run.is_rgmii; 424 uint32_t mac_idx = p_eng->run.mac_idx; 425 int32_t tx_min, rx_min; 426 427 if (rgmii) { 428 if (mac_idx > 1) { 429 tx_min = p_eng->io.mac34_1g_delay.tx_min; 430 rx_min = p_eng->io.mac34_1g_delay.rx_min; 431 } else { 432 tx_min = p_eng->io.mac12_1g_delay.tx_min; 433 rx_min = p_eng->io.mac12_1g_delay.rx_min; 434 } 435 } else { 436 if (mac_idx > 1) { 437 tx_min = p_eng->io.mac34_1g_delay.rmii_tx_min; 438 rx_min = p_eng->io.mac34_1g_delay.rmii_rx_min; 439 } else { 440 tx_min = p_eng->io.mac12_1g_delay.rmii_tx_min; 441 rx_min = p_eng->io.mac12_1g_delay.rmii_rx_min; 442 } 443 } 444 *p_tx_d = tx_min; 445 *p_rx_d = rx_min; 446 } 447 448 static void set_mac_1g_delay_1(uint32_t addr, int32_t rx_d, int32_t tx_d) 449 { 450 mac_delay_1g_t reg; 451 452 reg.w = readl(addr); 453 #ifdef CONFIG_ASPEED_AST2600 454 if (rx_d < 0) { 455 reg.b.rx_clk_inv_1 = 1; 456 rx_d = abs(rx_d); 457 } 458 #endif 459 reg.b.rx_delay_1 = rx_d; 460 reg.b.tx_delay_1 = tx_d; 461 writel(reg.w, addr); 462 463 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 464 rx_d, tx_d); 465 } 466 467 static void set_mac_1g_delay_2(uint32_t addr, int32_t rx_d, int32_t tx_d) 468 { 469 mac_delay_1g_t reg; 470 471 reg.w = readl(addr); 472 #ifdef CONFIG_ASPEED_AST2600 473 if (rx_d < 0) { 474 reg.b.rx_clk_inv_2 = 1; 475 rx_d = abs(rx_d); 476 } 477 #endif 478 reg.b.rx_delay_2 = rx_d; 479 reg.b.tx_delay_2 = tx_d; 480 writel(reg.w, addr); 481 482 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 483 rx_d, tx_d); 484 } 485 486 static void set_mac_100_10_delay_1(uint32_t addr, int32_t rx_d, int32_t tx_d) 487 { 488 mac_delay_100_10_t reg; 489 490 reg.w = readl(addr); 491 #ifdef CONFIG_ASPEED_AST2600 492 if (rx_d < 0) { 493 reg.b.rx_clk_inv_1 = 1; 494 rx_d = abs(rx_d); 495 } 496 #endif 497 reg.b.rx_delay_1 = rx_d; 498 reg.b.tx_delay_1 = tx_d; 499 writel(reg.w, addr); 500 501 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 502 rx_d, tx_d); 503 } 504 505 static void set_mac_100_10_delay_2(uint32_t addr, int32_t rx_d, int32_t tx_d) 506 { 507 mac_delay_100_10_t reg; 508 509 reg.w = readl(addr); 510 #ifdef CONFIG_ASPEED_AST2600 511 if (rx_d < 0) { 512 reg.b.rx_clk_inv_2 = 1; 513 rx_d = abs(rx_d); 514 } 515 #endif 516 reg.b.rx_delay_2 = rx_d; 517 reg.b.tx_delay_2 = tx_d; 518 writel(reg.w, addr); 519 520 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 521 rx_d, tx_d); 522 } 523 524 static void set_mac_rmii_delay_1(uint32_t addr, int32_t rx_d, int32_t tx_d) 525 { 526 mac_delay_1g_t reg; 527 528 reg.w = readl(addr); 529 reg.b.rmii_tx_data_at_falling_1 = tx_d; 530 reg.b.rx_delay_1 = rx_d; 531 writel(reg.w, addr); 532 533 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 534 rx_d, tx_d); 535 } 536 537 static void set_mac_rmii_delay_2(uint32_t addr, int32_t rx_d, int32_t tx_d) 538 { 539 mac_delay_1g_t reg; 540 541 reg.w = readl(addr); 542 reg.b.rmii_tx_data_at_falling_2 = tx_d; 543 reg.b.rx_delay_2 = rx_d; 544 writel(reg.w, addr); 545 546 debug("%s:[%08x] %08x, rx_d=%d, tx_d=%d\n", __func__, addr, reg.w, 547 rx_d, tx_d); 548 } 549 550 551 static void set_mac1_1g_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 552 { 553 set_mac_1g_delay_1(p_eng->io.mac12_1g_delay.addr, rx_d, tx_d); 554 } 555 static void set_mac1_100m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 556 { 557 set_mac_100_10_delay_1(p_eng->io.mac12_100m_delay.addr, rx_d, tx_d); 558 } 559 static void set_mac1_10m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 560 { 561 set_mac_100_10_delay_1(p_eng->io.mac12_10m_delay.addr, rx_d, tx_d); 562 } 563 static void set_mac2_1g_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 564 { 565 set_mac_1g_delay_2(p_eng->io.mac12_1g_delay.addr, rx_d, tx_d); 566 } 567 static void set_mac2_100m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 568 { 569 set_mac_100_10_delay_2(p_eng->io.mac12_100m_delay.addr, rx_d, tx_d); 570 } 571 static void set_mac2_10m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 572 { 573 set_mac_100_10_delay_2(p_eng->io.mac12_10m_delay.addr, rx_d, tx_d); 574 } 575 static void set_mac3_1g_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 576 { 577 set_mac_1g_delay_1(p_eng->io.mac34_1g_delay.addr, rx_d, tx_d); 578 } 579 static void set_mac3_100m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 580 { 581 set_mac_100_10_delay_1(p_eng->io.mac34_100m_delay.addr, rx_d, tx_d); 582 } 583 static void set_mac3_10m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 584 { 585 set_mac_100_10_delay_1(p_eng->io.mac34_10m_delay.addr, rx_d, tx_d); 586 } 587 static void set_mac4_1g_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 588 { 589 set_mac_1g_delay_2(p_eng->io.mac34_1g_delay.addr, rx_d, tx_d); 590 } 591 static void set_mac4_100m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 592 { 593 set_mac_100_10_delay_2(p_eng->io.mac34_100m_delay.addr, rx_d, tx_d); 594 } 595 static void set_mac4_10m_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 596 { 597 set_mac_100_10_delay_2(p_eng->io.mac34_10m_delay.addr, rx_d, tx_d); 598 } 599 static void set_mac1_rmii_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 600 { 601 set_mac_rmii_delay_1(p_eng->io.mac12_1g_delay.addr, rx_d, tx_d); 602 } 603 static void set_mac2_rmii_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 604 { 605 set_mac_rmii_delay_2(p_eng->io.mac12_1g_delay.addr, rx_d, tx_d); 606 } 607 608 static void set_mac3_rmii_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 609 { 610 set_mac_rmii_delay_1(p_eng->io.mac34_1g_delay.addr, rx_d, tx_d); 611 } 612 613 static void set_mac4_rmii_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 614 { 615 set_mac_rmii_delay_2(p_eng->io.mac34_1g_delay.addr, rx_d, tx_d); 616 } 617 618 void set_dummy_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 619 { 620 printf("%s: %d, %d\n", __func__, rx_d, tx_d); 621 } 622 623 /** 624 * @brief function pointer table for delay setting 625 * 626 * set_delay_func_tbl[rmii/rgmii][mac_idx][speed_idx 1g/100m/10m] 627 */ 628 typedef void (*pfn_set_delay) (MAC_ENGINE *, int32_t, int32_t); 629 pfn_set_delay set_delay_func_tbl[2][4][3] = { 630 { 631 {set_mac1_rmii_delay, set_mac1_rmii_delay, set_mac1_rmii_delay}, 632 {set_mac2_rmii_delay, set_mac2_rmii_delay, set_mac2_rmii_delay}, 633 #if defined(CONFIG_ASPEED_AST2600) 634 {set_mac3_rmii_delay, set_mac3_rmii_delay, set_mac3_rmii_delay}, 635 {set_mac4_rmii_delay, set_mac4_rmii_delay, set_mac4_rmii_delay}, 636 #else 637 {set_dummy_delay, set_dummy_delay, set_dummy_delay}, 638 {set_dummy_delay, set_dummy_delay, set_dummy_delay}, 639 #endif 640 }, 641 { 642 {set_mac1_1g_delay, set_mac1_100m_delay, set_mac1_10m_delay}, 643 {set_mac2_1g_delay, set_mac2_100m_delay, set_mac2_10m_delay}, 644 #if defined(CONFIG_ASPEED_AST2600) 645 {set_mac3_1g_delay, set_mac3_100m_delay, set_mac3_10m_delay}, 646 {set_mac4_1g_delay, set_mac4_100m_delay, set_mac4_10m_delay}, 647 #else 648 {set_dummy_delay, set_dummy_delay, set_dummy_delay}, 649 {set_dummy_delay, set_dummy_delay, set_dummy_delay}, 650 #endif 651 } 652 }; 653 654 void mac_set_delay(MAC_ENGINE *p_eng, int32_t rx_d, int32_t tx_d) 655 { 656 uint32_t rgmii = (uint32_t)p_eng->run.is_rgmii; 657 uint32_t mac_idx = p_eng->run.mac_idx; 658 uint32_t speed_idx = p_eng->run.speed_idx; 659 660 set_delay_func_tbl[rgmii][mac_idx][speed_idx] (p_eng, rx_d, tx_d); 661 } 662 663 uint32_t mac_get_driving_strength(MAC_ENGINE *p_eng) 664 { 665 #ifdef CONFIG_ASPEED_AST2600 666 mac34_drv_t reg; 667 668 reg.w = readl(p_eng->io.mac34_drv_reg.addr); 669 /* ast2600 : only MAC#3 & MAC#4 have driving strength setting */ 670 if (p_eng->run.mac_idx == 2) { 671 return (reg.b.mac3_tx_drv); 672 } else if (p_eng->run.mac_idx == 3) { 673 return (reg.b.mac4_tx_drv); 674 } else { 675 return 0; 676 } 677 #else 678 mac12_drv_t reg; 679 680 reg.w = readl(p_eng->io.mac12_drv_reg.addr); 681 682 if (p_eng->run.mac_idx == 0) { 683 return (reg.b.mac1_tx_drv); 684 } else if (p_eng->run.mac_idx == 1) { 685 return (reg.b.mac2_tx_drv); 686 } else { 687 return 0; 688 } 689 #endif 690 } 691 void mac_set_driving_strength(MAC_ENGINE *p_eng, uint32_t strength) 692 { 693 #ifdef CONFIG_ASPEED_AST2600 694 mac34_drv_t reg; 695 696 if (strength > p_eng->io.mac34_drv_reg.drv_max) { 697 printf("invalid driving strength value\n"); 698 return; 699 } 700 701 /** 702 * read->modify->write for driving strength control register 703 * ast2600 : only MAC#3 & MAC#4 have driving strength setting 704 */ 705 reg.w = readl(p_eng->io.mac34_drv_reg.addr); 706 707 /* ast2600 : only MAC#3 & MAC#4 have driving strength setting */ 708 if (p_eng->run.mac_idx == 2) { 709 reg.b.mac3_tx_drv = strength; 710 } else if (p_eng->run.mac_idx == 3) { 711 reg.b.mac4_tx_drv = strength; 712 } 713 714 writel(reg.w, p_eng->io.mac34_drv_reg.addr); 715 #else 716 mac12_drv_t reg; 717 718 if (strength > p_eng->io.mac12_drv_reg.drv_max) { 719 printf("invalid driving strength value\n"); 720 return; 721 } 722 723 /* read->modify->write for driving strength control register */ 724 reg.w = readl(p_eng->io.mac12_drv_reg.addr); 725 if (p_eng->run.is_rgmii) { 726 if (p_eng->run.mac_idx == 0) { 727 reg.b.mac1_rgmii_tx_drv = 728 strength; 729 } else if (p_eng->run.mac_idx == 2) { 730 reg.b.mac2_rgmii_tx_drv = 731 strength; 732 } 733 } else { 734 if (p_eng->run.mac_idx == 0) { 735 reg.b.mac1_rmii_tx_drv = 736 strength; 737 } else if (p_eng->run.mac_idx == 1) { 738 reg.b.mac2_rmii_tx_drv = 739 strength; 740 } 741 } 742 writel(reg.w, p_eng->io.mac12_drv_reg.addr); 743 #endif 744 } 745 746 void mac_set_rmii_50m_output_enable(MAC_ENGINE *p_eng) 747 { 748 uint32_t addr; 749 mac_delay_1g_t value; 750 751 if (p_eng->run.mac_idx > 1) { 752 addr = p_eng->io.mac34_1g_delay.addr; 753 } else { 754 addr = p_eng->io.mac12_1g_delay.addr; 755 } 756 757 value.w = readl(addr); 758 if (p_eng->run.mac_idx & BIT(0)) { 759 value.b.rmii_50m_oe_2 = 1; 760 } else { 761 value.b.rmii_50m_oe_1 = 1; 762 } 763 writel(value.w, addr); 764 } 765 766 //------------------------------------------------------------ 767 int mac_set_scan_boundary(MAC_ENGINE *p_eng) 768 { 769 int32_t rx_cur, tx_cur; 770 int32_t rx_min, rx_max, tx_min, tx_max; 771 int32_t rx_scaling, tx_scaling; 772 773 nt_log_func_name(); 774 775 /* get current delay setting */ 776 mac_get_delay(p_eng, &rx_cur, &tx_cur); 777 778 /* get physical boundaries */ 779 mac_get_max_available_delay(p_eng, &rx_max, &tx_max); 780 mac_get_min_available_delay(p_eng, &rx_min, &tx_min); 781 782 if ((p_eng->run.is_rgmii) && (p_eng->arg.ctrl.b.inv_rgmii_rxclk)) { 783 rx_max = (rx_max > 0) ? 0 : rx_max; 784 } else { 785 rx_min = (rx_min < 0) ? 0 : rx_min; 786 } 787 788 if (p_eng->run.TM_IOTiming) { 789 if (p_eng->arg.ctrl.b.full_range) { 790 tx_scaling = 0; 791 rx_scaling = 0; 792 } else { 793 /* down-scaling to save test time */ 794 tx_scaling = TX_DELAY_SCALING; 795 rx_scaling = RX_DELAY_SCALING; 796 } 797 p_eng->io.rx_delay_scan.step = 1; 798 p_eng->io.tx_delay_scan.step = 1; 799 p_eng->io.rx_delay_scan.begin = rx_min >> rx_scaling; 800 p_eng->io.rx_delay_scan.end = rx_max >> rx_scaling; 801 p_eng->io.tx_delay_scan.begin = tx_min >> tx_scaling; 802 p_eng->io.tx_delay_scan.end = tx_max >> tx_scaling; 803 } else if (p_eng->run.delay_margin) { 804 p_eng->io.rx_delay_scan.step = 1; 805 p_eng->io.tx_delay_scan.step = 1; 806 p_eng->io.rx_delay_scan.begin = rx_cur - p_eng->run.delay_margin; 807 p_eng->io.rx_delay_scan.end = rx_cur + p_eng->run.delay_margin; 808 p_eng->io.tx_delay_scan.begin = tx_cur - p_eng->run.delay_margin; 809 p_eng->io.tx_delay_scan.end = tx_cur + p_eng->run.delay_margin; 810 } else { 811 p_eng->io.rx_delay_scan.step = 1; 812 p_eng->io.tx_delay_scan.step = 1; 813 p_eng->io.rx_delay_scan.begin = 0; 814 p_eng->io.rx_delay_scan.end = 0; 815 p_eng->io.tx_delay_scan.begin = 0; 816 p_eng->io.tx_delay_scan.end = 0; 817 } 818 819 /* backup current setting as the original for plotting result */ 820 p_eng->io.rx_delay_scan.orig = rx_cur; 821 p_eng->io.tx_delay_scan.orig = tx_cur; 822 823 /* check if setting is legal or not */ 824 if (p_eng->io.rx_delay_scan.begin < rx_min) 825 p_eng->io.rx_delay_scan.begin = rx_min; 826 827 if (p_eng->io.tx_delay_scan.begin < tx_min) 828 p_eng->io.tx_delay_scan.begin = tx_min; 829 830 if (p_eng->io.rx_delay_scan.end > rx_max) 831 p_eng->io.rx_delay_scan.end = rx_max; 832 833 if (p_eng->io.tx_delay_scan.end > tx_max) 834 p_eng->io.tx_delay_scan.end = tx_max; 835 836 if (p_eng->io.rx_delay_scan.begin > p_eng->io.rx_delay_scan.end) 837 p_eng->io.rx_delay_scan.begin = p_eng->io.rx_delay_scan.end; 838 839 if (p_eng->io.tx_delay_scan.begin > p_eng->io.tx_delay_scan.end) 840 p_eng->io.tx_delay_scan.begin = p_eng->io.tx_delay_scan.end; 841 842 if (p_eng->run.IO_MrgChk) { 843 if ((p_eng->io.rx_delay_scan.orig < 844 p_eng->io.rx_delay_scan.begin) || 845 (p_eng->io.rx_delay_scan.orig > 846 p_eng->io.rx_delay_scan.end)) { 847 printf("Warning: current delay is not in the " 848 "scan-range\n"); 849 printf("RX delay scan range:%d ~ %d, curr:%d\n", 850 p_eng->io.rx_delay_scan.begin, 851 p_eng->io.rx_delay_scan.end, 852 p_eng->io.rx_delay_scan.orig); 853 printf("TX delay scan range:%d ~ %d, curr:%d\n", 854 p_eng->io.tx_delay_scan.begin, 855 p_eng->io.tx_delay_scan.end, 856 p_eng->io.tx_delay_scan.orig); 857 } 858 } 859 860 return (0); 861 } 862 863 //------------------------------------------------------------ 864 // MAC 865 //------------------------------------------------------------ 866 void mac_set_addr(MAC_ENGINE *p_eng) 867 { 868 nt_log_func_name(); 869 870 uint32_t madr = p_eng->reg.mac_madr; 871 uint32_t ladr = p_eng->reg.mac_ladr; 872 873 if (((madr == 0x0000) && (ladr == 0x00000000)) || 874 ((madr == 0xffff) && (ladr == 0xffffffff))) { 875 /* FIXME: shall use random gen */ 876 madr = 0x0000000a; 877 ladr = 0xf7837dd4; 878 } 879 880 p_eng->inf.SA[0] = (madr >> 8) & 0xff; // MSB 881 p_eng->inf.SA[1] = (madr >> 0) & 0xff; 882 p_eng->inf.SA[2] = (ladr >> 24) & 0xff; 883 p_eng->inf.SA[3] = (ladr >> 16) & 0xff; 884 p_eng->inf.SA[4] = (ladr >> 8) & 0xff; 885 p_eng->inf.SA[5] = (ladr >> 0) & 0xff; // LSB 886 887 printf("mac address: "); 888 for (int i = 0; i < 6; i++) { 889 printf("%02x:", p_eng->inf.SA[i]); 890 } 891 printf("\n"); 892 } 893 894 void mac_set_interal_loopback(MAC_ENGINE *p_eng) 895 { 896 uint32_t reg = mac_reg_read(p_eng, 0x40); 897 mac_reg_write(p_eng, 0x40, reg | BIT(30)); 898 } 899 900 //------------------------------------------------------------ 901 void init_mac (MAC_ENGINE *eng) 902 { 903 nt_log_func_name(); 904 905 mac_cr_t maccr; 906 907 #ifdef Enable_MAC_SWRst 908 maccr.w = 0; 909 maccr.b.sw_rst = 1; 910 mac_reg_write(eng, 0x50, maccr.w); 911 912 do { 913 DELAY(Delay_MACRst); 914 maccr.w = mac_reg_read(eng, 0x50); 915 } while(maccr.b.sw_rst); 916 #endif 917 918 mac_reg_write(eng, 0x20, eng->run.tdes_base - ASPEED_DRAM_BASE); 919 mac_reg_write(eng, 0x24, eng->run.rdes_base - ASPEED_DRAM_BASE); 920 921 mac_reg_write(eng, 0x08, eng->reg.mac_madr); 922 mac_reg_write(eng, 0x0c, eng->reg.mac_ladr); 923 924 #ifdef MAC_030_def 925 mac_reg_write( eng, 0x30, MAC_030_def );//Int Thr/Cnt 926 #endif 927 #ifdef MAC_034_def 928 mac_reg_write( eng, 0x34, MAC_034_def );//Poll Cnt 929 #endif 930 #ifdef MAC_038_def 931 mac_reg_write( eng, 0x38, MAC_038_def ); 932 #endif 933 #ifdef MAC_048_def 934 mac_reg_write( eng, 0x48, MAC_048_def ); 935 #endif 936 #ifdef MAC_058_def 937 mac_reg_write( eng, 0x58, MAC_058_def ); 938 #endif 939 940 if ( eng->arg.run_mode == MODE_NCSI ) 941 mac_reg_write( eng, 0x4c, NCSI_RxDMA_PakSize ); 942 else 943 mac_reg_write( eng, 0x4c, DMA_PakSize ); 944 945 maccr.b.txdma_en = 1; 946 maccr.b.rxdma_en = 1; 947 maccr.b.txmac_en = 1; 948 maccr.b.rxmac_en = 1; 949 maccr.b.fulldup = 1; 950 maccr.b.crc_apd = 1; 951 952 if (eng->run.speed_sel[0]) { 953 maccr.b.gmac_mode = 1; 954 } else if (eng->run.speed_sel[1]) { 955 maccr.b.speed_100 = 1; 956 } 957 958 if (eng->arg.run_mode == MODE_NCSI) { 959 maccr.b.rx_broadpkt_en = 1; 960 maccr.b.speed_100 = 1; 961 } 962 else { 963 maccr.b.rx_alladr = 1; 964 #ifdef Enable_Runt 965 maccr.b.rx_runt = 1; 966 #endif 967 } 968 mac_reg_write(eng, 0x50, maccr.w); 969 DELAY(Delay_MACRst); 970 } // End void init_mac (MAC_ENGINE *eng) 971 972 //------------------------------------------------------------ 973 // Basic 974 //------------------------------------------------------------ 975 void FPri_RegValue (MAC_ENGINE *eng, uint8_t option) 976 { 977 nt_log_func_name(); 978 979 PRINTF( option, "[SRAM] Date:%08x\n", SRAM_RD( 0x88 ) ); 980 PRINTF( option, "[SRAM] 80:%08x %08x %08x %08x\n", SRAM_RD( 0x80 ), SRAM_RD( 0x84 ), SRAM_RD( 0x88 ), SRAM_RD( 0x8c ) ); 981 982 PRINTF( option, "[SCU] a0:%08x a4:%08x b8:%08x bc:%08x\n", SCU_RD( 0x0a0 ), SCU_RD( 0x0a4 ), SCU_RD( 0x0b8 ), SCU_RD( 0x0bc )); 983 984 PRINTF( option, "[SCU] 13c:%08x 140:%08x 144:%08x 1dc:%08x\n", SCU_RD( 0x13c ), SCU_RD( 0x140 ), SCU_RD( 0x144 ), SCU_RD( 0x1dc ) ); 985 PRINTF( option, "[WDT] 0c:%08x 2c:%08x 4c:%08x\n", eng->reg.WDT_00c, eng->reg.WDT_02c, eng->reg.WDT_04c ); 986 PRINTF( option, "[MAC] A0|%08x %08x %08x %08x\n", mac_reg_read( eng, 0xa0 ), mac_reg_read( eng, 0xa4 ), mac_reg_read( eng, 0xa8 ), mac_reg_read( eng, 0xac ) ); 987 PRINTF( option, "[MAC] B0|%08x %08x %08x %08x\n", mac_reg_read( eng, 0xb0 ), mac_reg_read( eng, 0xb4 ), mac_reg_read( eng, 0xb8 ), mac_reg_read( eng, 0xbc ) ); 988 PRINTF( option, "[MAC] C0|%08x %08x %08x\n", mac_reg_read( eng, 0xc0 ), mac_reg_read( eng, 0xc4 ), mac_reg_read( eng, 0xc8 ) ); 989 990 } // End void FPri_RegValue (MAC_ENGINE *eng, uint8_t *fp) 991 992 //------------------------------------------------------------ 993 void FPri_End (MAC_ENGINE *eng, uint8_t option) 994 { 995 nt_log_func_name(); 996 if ((0 == eng->run.is_rgmii) && (eng->phy.RMIICK_IOMode != 0) && 997 eng->run.IO_MrgChk && eng->flg.all_fail) { 998 if ( eng->arg.ctrl.b.rmii_phy_in == 0 ) { 999 PRINTF( option, "\n\n\n\n\n\n[Info] The PHY's RMII reference clock pin is setting to the OUTPUT mode now.\n" ); 1000 PRINTF( option, " Maybe you can run the INPUT mode command \"mactest %d %d %d %d %d %d %d\".\n\n\n\n", eng->arg.mac_idx, eng->arg.run_speed, (eng->arg.ctrl.w | 0x80), eng->arg.loop_max, eng->arg.test_mode, eng->arg.phy_addr, eng->arg.delay_scan_range ); 1001 } 1002 else { 1003 PRINTF( option, "\n\n\n\n\n\n[Info] The PHY's RMII reference clock pin is setting to the INPUT mode now.\n" ); 1004 PRINTF( option, " Maybe you can run the OUTPUT mode command \"mactest %d %d %d %d %d %d %d\".\n\n\n\n", eng->arg.mac_idx, eng->arg.run_speed, (eng->arg.ctrl.w & 0x7f), eng->arg.loop_max, eng->arg.test_mode, eng->arg.phy_addr, eng->arg.delay_scan_range ); 1005 } 1006 } 1007 1008 if (!eng->run.TM_RxDataEn) { 1009 } else if (eng->flg.error) { 1010 PRINTF(option, " \n----> fail !!!\n"); 1011 } 1012 1013 //------------------------------ 1014 //[Warning] PHY Address 1015 //------------------------------ 1016 if ( eng->arg.run_mode == MODE_DEDICATED ) { 1017 if ( eng->arg.phy_addr != eng->phy.Adr ) 1018 PRINTF( option, "\n[Warning] PHY Address change from %d to %d !!!\n", eng->arg.phy_addr, eng->phy.Adr ); 1019 } 1020 1021 //------------------------------ 1022 //[Warning] IO Strength 1023 //------------------------------ 1024 #ifdef CONFIG_ASPEED_AST2600 1025 if (eng->io.init_done && (eng->io.mac34_drv_reg.value.w != 0xf)) { 1026 PRINTF(option, 1027 "\n[Warning] [%08X] 0x%08x is not the suggestion value " 1028 "0xf.\n", 1029 eng->io.mac34_drv_reg.addr, 1030 eng->io.mac34_drv_reg.value.w); 1031 #else 1032 if (eng->io.init_done && eng->io.mac12_drv_reg.value.w) { 1033 PRINTF(option, 1034 "\n[Warning] [%08X] 0x%08x is not the suggestion value " 1035 "0.\n", 1036 eng->io.mac12_drv_reg.addr, 1037 eng->io.mac12_drv_reg.value.w); 1038 #endif 1039 PRINTF(option, " This change at this platform must " 1040 "been proven again by the ASPEED.\n"); 1041 } 1042 1043 //------------------------------ 1044 //[Warning] IO Timing 1045 //------------------------------ 1046 if ( eng->arg.run_mode == MODE_NCSI ) { 1047 PRINTF( option, "\n[Arg] %d %d %d %d %d %d %d {%d}\n", eng->arg.mac_idx, eng->arg.GPackageTolNum, eng->arg.GChannelTolNum, eng->arg.test_mode, eng->arg.delay_scan_range, eng->arg.ctrl.w, eng->arg.GARPNumCnt, TIME_OUT_NCSI ); 1048 1049 switch ( eng->ncsi_cap.PCI_DID_VID ) { 1050 case PCI_DID_VID_Intel_82574L : { PRINTF( option, "[NC]%08x %08x: Intel 82574L \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1051 case PCI_DID_VID_Intel_82575_10d6 : { PRINTF( option, "[NC]%08x %08x: Intel 82575 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1052 case PCI_DID_VID_Intel_82575_10a7 : { PRINTF( option, "[NC]%08x %08x: Intel 82575 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1053 case PCI_DID_VID_Intel_82575_10a9 : { PRINTF( option, "[NC]%08x %08x: Intel 82575 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1054 case PCI_DID_VID_Intel_82576_10c9 : { PRINTF( option, "[NC]%08x %08x: Intel 82576 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1055 case PCI_DID_VID_Intel_82576_10e6 : { PRINTF( option, "[NC]%08x %08x: Intel 82576 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1056 case PCI_DID_VID_Intel_82576_10e7 : { PRINTF( option, "[NC]%08x %08x: Intel 82576 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1057 case PCI_DID_VID_Intel_82576_10e8 : { PRINTF( option, "[NC]%08x %08x: Intel 82576 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1058 case PCI_DID_VID_Intel_82576_1518 : { PRINTF( option, "[NC]%08x %08x: Intel 82576 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1059 case PCI_DID_VID_Intel_82576_1526 : { PRINTF( option, "[NC]%08x %08x: Intel 82576 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1060 case PCI_DID_VID_Intel_82576_150a : { PRINTF( option, "[NC]%08x %08x: Intel 82576 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1061 case PCI_DID_VID_Intel_82576_150d : { PRINTF( option, "[NC]%08x %08x: Intel 82576 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1062 case PCI_DID_VID_Intel_82599_10fb : { PRINTF( option, "[NC]%08x %08x: Intel 82599 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1063 case PCI_DID_VID_Intel_82599_1557 : { PRINTF( option, "[NC]%08x %08x: Intel 82599 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1064 case PCI_DID_VID_Intel_I210_1533 : { PRINTF( option, "[NC]%08x %08x: Intel I210 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1065 case PCI_DID_VID_Intel_I210_1537 : { PRINTF( option, "[NC]%08x %08x: Intel I210 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1066 case PCI_DID_VID_Intel_I350_1521 : { PRINTF( option, "[NC]%08x %08x: Intel I350 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1067 case PCI_DID_VID_Intel_I350_1523 : { PRINTF( option, "[NC]%08x %08x: Intel I350 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1068 case PCI_DID_VID_Intel_X540 : { PRINTF( option, "[NC]%08x %08x: Intel X540 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1069 case PCI_DID_VID_Intel_X550 : { PRINTF( option, "[NC]%08x %08x: Intel X550 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1070 case PCI_DID_VID_Intel_Broadwell_DE : { PRINTF( option, "[NC]%08x %08x: Intel Broadwell-DE \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1071 case PCI_DID_VID_Intel_X722_37d0 : { PRINTF( option, "[NC]%08x %08x: Intel X722 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1072 case PCI_DID_VID_Broadcom_BCM5718 : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM5718 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1073 case PCI_DID_VID_Broadcom_BCM5719 : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM5719 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1074 case PCI_DID_VID_Broadcom_BCM5720 : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM5720 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1075 case PCI_DID_VID_Broadcom_BCM5725 : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM5725 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1076 case PCI_DID_VID_Broadcom_BCM57810S : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM57810S \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1077 case PCI_DID_VID_Broadcom_Cumulus : { PRINTF( option, "[NC]%08x %08x: Broadcom Cumulus \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1078 case PCI_DID_VID_Broadcom_BCM57302 : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM57302 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1079 case PCI_DID_VID_Broadcom_BCM957452 : { PRINTF( option, "[NC]%08x %08x: Broadcom BCM957452 \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1080 case PCI_DID_VID_Mellanox_ConnectX_3_1003 : { PRINTF( option, "[NC]%08x %08x: Mellanox ConnectX-3\n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1081 case PCI_DID_VID_Mellanox_ConnectX_3_1007 : { PRINTF( option, "[NC]%08x %08x: Mellanox ConnectX-3\n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1082 case PCI_DID_VID_Mellanox_ConnectX_4 : { PRINTF( option, "[NC]%08x %08x: Mellanox ConnectX-4\n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1083 default: 1084 switch ( eng->ncsi_cap.manufacturer_id ) { 1085 case ManufacturerID_Intel : { PRINTF( option, "[NC]%08x %08x: Intel \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1086 case ManufacturerID_Broadcom : { PRINTF( option, "[NC]%08x %08x: Broadcom \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1087 case ManufacturerID_Mellanox : { PRINTF( option, "[NC]%08x %08x: Mellanox \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1088 case ManufacturerID_Mellanox1: { PRINTF( option, "[NC]%08x %08x: Mellanox \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1089 case ManufacturerID_Emulex : { PRINTF( option, "[NC]%08x %08x: Emulex \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1090 default : { PRINTF( option, "[NC]%08x %08x \n", eng->ncsi_cap.manufacturer_id, eng->ncsi_cap.PCI_DID_VID ); break; } 1091 } // End switch ( eng->ncsi_cap.manufacturer_id ) 1092 } // End switch ( eng->ncsi_cap.PCI_DID_VID ) 1093 } 1094 else { 1095 PRINTF(option, "[PHY] @addr %d: id = %04x_%04x (%s)\n", 1096 eng->phy.Adr, eng->phy.id1, eng->phy.id2, 1097 eng->phy.phy_name); 1098 } // End if ( eng->arg.run_mode == MODE_NCSI ) 1099 } // End void FPri_End (MAC_ENGINE *eng, uint8_t option) 1100 1101 //------------------------------------------------------------ 1102 void FPri_ErrFlag (MAC_ENGINE *eng, uint8_t option) 1103 { 1104 nt_log_func_name(); 1105 if ( eng->flg.print_en ) { 1106 if ( eng->flg.warn ) { 1107 if ( eng->flg.warn & Wrn_Flag_IOMarginOUF ) { 1108 PRINTF(option, "[Warning] IO timing testing " 1109 "range out of boundary\n"); 1110 1111 if (0 == eng->run.is_rgmii) { 1112 PRINTF( option, " (reg:%d,%d) %dx1(%d~%d,%d)\n", eng->io.Dly_in_reg_idx, 1113 eng->io.Dly_out_reg_idx, 1114 eng->run.delay_margin, 1115 eng->io.Dly_in_min, 1116 eng->io.Dly_in_max, 1117 eng->io.Dly_out_min ); 1118 } 1119 else { 1120 PRINTF( option, " (reg:%d,%d) %dx%d(%d~%d,%d~%d)\n", eng->io.Dly_in_reg_idx, 1121 eng->io.Dly_out_reg_idx, 1122 eng->run.delay_margin, 1123 eng->run.delay_margin, 1124 eng->io.Dly_in_min, 1125 eng->io.Dly_in_max, 1126 eng->io.Dly_out_min, 1127 eng->io.Dly_out_max ); 1128 } 1129 } // End if ( eng->flg.warn & Wrn_Flag_IOMarginOUF ) 1130 if ( eng->flg.warn & Wrn_Flag_RxErFloatting ) { 1131 PRINTF( option, "[Warning] NCSI RXER pin may be floatting to the MAC !!!\n" ); 1132 PRINTF( option, " Please contact with the ASPEED Inc. for more help.\n" ); 1133 } // End if ( eng->flg.warn & Wrn_Flag_RxErFloatting ) 1134 } // End if ( eng->flg.warn ) 1135 1136 if ( eng->flg.error ) { 1137 PRINTF( option, "\n\n" ); 1138 //PRINTF( option, "error: %x\n\n", eng->flg.error ); 1139 1140 if ( eng->flg.error & Err_Flag_PHY_Type ) { PRINTF( option, "[Err] Unidentifiable PHY \n" ); } 1141 if ( eng->flg.error & Err_Flag_MALLOC_FrmSize ) { PRINTF( option, "[Err] Malloc fail at frame size buffer \n" ); } 1142 if ( eng->flg.error & Err_Flag_MALLOC_LastWP ) { PRINTF( option, "[Err] Malloc fail at last WP buffer \n" ); } 1143 if ( eng->flg.error & Err_Flag_Check_Buf_Data ) { PRINTF( option, "[Err] Received data mismatch \n" ); } 1144 if ( eng->flg.error & Err_Flag_NCSI_Check_TxOwnTimeOut ) { PRINTF( option, "[Err] Time out of checking Tx owner bit in NCSI packet \n" ); } 1145 if ( eng->flg.error & Err_Flag_NCSI_Check_RxOwnTimeOut ) { PRINTF( option, "[Err] Time out of checking Rx owner bit in NCSI packet \n" ); } 1146 if ( eng->flg.error & Err_Flag_NCSI_Check_ARPOwnTimeOut) { PRINTF( option, "[Err] Time out of checking ARP owner bit in NCSI packet \n" ); } 1147 if ( eng->flg.error & Err_Flag_NCSI_No_PHY ) { PRINTF( option, "[Err] Can not find NCSI PHY \n" ); } 1148 if ( eng->flg.error & Err_Flag_NCSI_Channel_Num ) { PRINTF( option, "[Err] NCSI Channel Number Mismatch \n" ); } 1149 if ( eng->flg.error & Err_Flag_NCSI_Package_Num ) { PRINTF( option, "[Err] NCSI Package Number Mismatch \n" ); } 1150 if ( eng->flg.error & Err_Flag_PHY_TimeOut_RW ) { PRINTF( option, "[Err] Time out of read/write PHY register \n" ); } 1151 if ( eng->flg.error & Err_Flag_PHY_TimeOut_Rst ) { PRINTF( option, "[Err] Time out of reset PHY register \n" ); } 1152 if ( eng->flg.error & Err_Flag_RXBUF_UNAVA ) { PRINTF( option, "[Err] MAC00h[2]:Receiving buffer unavailable \n" ); } 1153 if ( eng->flg.error & Err_Flag_RPKT_LOST ) { PRINTF( option, "[Err] MAC00h[3]:Received packet lost due to RX FIFO full \n" ); } 1154 if ( eng->flg.error & Err_Flag_NPTXBUF_UNAVA ) { PRINTF( option, "[Err] MAC00h[6]:Normal priority transmit buffer unavailable \n" ); } 1155 if ( eng->flg.error & Err_Flag_TPKT_LOST ) { PRINTF( option, "[Err] MAC00h[7]:Packets transmitted to Ethernet lost \n" ); } 1156 if ( eng->flg.error & Err_Flag_DMABufNum ) { PRINTF( option, "[Err] DMA Buffer is not enough \n" ); } 1157 if ( eng->flg.error & Err_Flag_IOMargin ) { PRINTF( option, "[Err] IO timing margin is not enough \n" ); } 1158 1159 if ( eng->flg.error & Err_Flag_MHCLK_Ratio ) { 1160 PRINTF( option, "[Err] Error setting of MAC AHB bus clock (SCU08[18:16]) \n" ); 1161 if ( eng->env.at_least_1g_valid ) 1162 { PRINTF( option, " SCU08[18:16] == 0x%01x is not the suggestion value 2.\n", eng->env.MHCLK_Ratio ); } 1163 else 1164 { PRINTF( option, " SCU08[18:16] == 0x%01x is not the suggestion value 4.\n", eng->env.MHCLK_Ratio ); } 1165 } // End if ( eng->flg.error & Err_Flag_MHCLK_Ratio ) 1166 1167 if ( eng->flg.error & Err_Flag_IOMarginOUF ) { 1168 PRINTF( option, "[Err] IO timing testing range out of boundary\n"); 1169 if (0 == eng->run.is_rgmii) { 1170 PRINTF( option, " (reg:%d,%d) %dx1(%d~%d,%d)\n", eng->io.Dly_in_reg_idx, 1171 eng->io.Dly_out_reg_idx, 1172 eng->run.delay_margin, 1173 eng->io.Dly_in_min, 1174 eng->io.Dly_in_max, 1175 eng->io.Dly_out_min ); 1176 } 1177 else { 1178 PRINTF( option, " (reg:%d,%d) %dx%d(%d~%d,%d~%d)\n", eng->io.Dly_in_reg_idx, 1179 eng->io.Dly_out_reg_idx, 1180 eng->run.delay_margin, 1181 eng->run.delay_margin, 1182 eng->io.Dly_in_min, 1183 eng->io.Dly_in_max, 1184 eng->io.Dly_out_min, 1185 eng->io.Dly_out_max ); 1186 } 1187 } // End if ( eng->flg.error & Err_Flag_IOMarginOUF ) 1188 1189 if ( eng->flg.error & Err_Flag_Check_Des ) { 1190 PRINTF( option, "[Err] Descriptor error\n"); 1191 if ( eng->flg.desc & Des_Flag_TxOwnTimeOut ) { PRINTF( option, "[Des] Time out of checking Tx owner bit\n" ); } 1192 if ( eng->flg.desc & Des_Flag_RxOwnTimeOut ) { PRINTF( option, "[Des] Time out of checking Rx owner bit\n" ); } 1193 if ( eng->flg.desc & Des_Flag_FrameLen ) { PRINTF( option, "[Des] Frame length mismatch \n" ); } 1194 if ( eng->flg.desc & Des_Flag_RxErr ) { PRINTF( option, "[Des] Input signal RxErr \n" ); } 1195 if ( eng->flg.desc & Des_Flag_CRC ) { PRINTF( option, "[Des] CRC error of frame \n" ); } 1196 if ( eng->flg.desc & Des_Flag_FTL ) { PRINTF( option, "[Des] Frame too long \n" ); } 1197 if ( eng->flg.desc & Des_Flag_Runt ) { PRINTF( option, "[Des] Runt packet \n" ); } 1198 if ( eng->flg.desc & Des_Flag_OddNibble ) { PRINTF( option, "[Des] Nibble bit happen \n" ); } 1199 if ( eng->flg.desc & Des_Flag_RxFIFOFull ) { PRINTF( option, "[Des] Rx FIFO full \n" ); } 1200 } // End if ( eng->flg.error & Err_Flag_Check_Des ) 1201 1202 if ( eng->flg.error & Err_Flag_MACMode ) { 1203 PRINTF( option, "[Err] MAC interface mode mismatch\n" ); 1204 for (int i = 0; i < 4; i++) { 1205 if (eng->env.is_1g_valid[i]) { 1206 PRINTF(option, 1207 "[MAC%d] is RGMII\n", i); 1208 } else { 1209 PRINTF(option, 1210 "[MAC%d] RMII\n", i); 1211 } 1212 } 1213 } // End if ( eng->flg.error & Err_Flag_MACMode ) 1214 1215 if ( eng->arg.run_mode == MODE_NCSI ) { 1216 if ( eng->flg.error & ERR_FLAG_NCSI_LINKFAIL ) { 1217 PRINTF( option, "[Err] NCSI packet retry number over flows when find channel\n" ); 1218 1219 if ( eng->flg.ncsi & NCSI_Flag_Get_Version_ID ) { PRINTF( option, "[NCSI] Time out when Get Version ID \n" ); } 1220 if ( eng->flg.ncsi & NCSI_Flag_Get_Capabilities ) { PRINTF( option, "[NCSI] Time out when Get Capabilities \n" ); } 1221 if ( eng->flg.ncsi & NCSI_Flag_Select_Active_Package ) { PRINTF( option, "[NCSI] Time out when Select Active Package \n" ); } 1222 if ( eng->flg.ncsi & NCSI_Flag_Enable_Set_MAC_Address ) { PRINTF( option, "[NCSI] Time out when Enable Set MAC Address \n" ); } 1223 if ( eng->flg.ncsi & NCSI_Flag_Enable_Broadcast_Filter ) { PRINTF( option, "[NCSI] Time out when Enable Broadcast Filter \n" ); } 1224 if ( eng->flg.ncsi & NCSI_Flag_Enable_Network_TX ) { PRINTF( option, "[NCSI] Time out when Enable Network TX \n" ); } 1225 if ( eng->flg.ncsi & NCSI_Flag_Enable_Channel ) { PRINTF( option, "[NCSI] Time out when Enable Channel \n" ); } 1226 if ( eng->flg.ncsi & NCSI_Flag_Disable_Network_TX ) { PRINTF( option, "[NCSI] Time out when Disable Network TX \n" ); } 1227 if ( eng->flg.ncsi & NCSI_Flag_Disable_Channel ) { PRINTF( option, "[NCSI] Time out when Disable Channel \n" ); } 1228 if ( eng->flg.ncsi & NCSI_Flag_Select_Package ) { PRINTF( option, "[NCSI] Time out when Select Package \n" ); } 1229 if ( eng->flg.ncsi & NCSI_Flag_Deselect_Package ) { PRINTF( option, "[NCSI] Time out when Deselect Package \n" ); } 1230 if ( eng->flg.ncsi & NCSI_Flag_Set_Link ) { PRINTF( option, "[NCSI] Time out when Set Link \n" ); } 1231 if ( eng->flg.ncsi & NCSI_Flag_Get_Controller_Packet_Statistics) { PRINTF( option, "[NCSI] Time out when Get Controller Packet Statistics\n" ); } 1232 } 1233 1234 if ( eng->flg.error & Err_Flag_NCSI_Channel_Num ) { PRINTF( option, "[NCSI] Channel number expected: %d, real: %d\n", eng->arg.GChannelTolNum, eng->dat.number_chl ); } 1235 if ( eng->flg.error & Err_Flag_NCSI_Package_Num ) { PRINTF( option, "[NCSI] Peckage number expected: %d, real: %d\n", eng->arg.GPackageTolNum, eng->dat.number_pak ); } 1236 } // End if ( eng->arg.run_mode == MODE_NCSI ) 1237 } // End if ( eng->flg.error ) 1238 } // End if ( eng->flg.print_en ) 1239 } // End void FPri_ErrFlag (MAC_ENGINE *eng, uint8_t option) 1240 1241 //------------------------------------------------------------ 1242 1243 //------------------------------------------------------------ 1244 int FindErr (MAC_ENGINE *p_eng, int value) 1245 { 1246 p_eng->flg.error = p_eng->flg.error | value; 1247 1248 if (DBG_PRINT_ERR_FLAG) 1249 printf("flags: error = %08x\n", p_eng->flg.error); 1250 1251 return (1); 1252 } 1253 1254 //------------------------------------------------------------ 1255 int FindErr_Des (MAC_ENGINE *p_eng, int value) 1256 { 1257 p_eng->flg.error = p_eng->flg.error | Err_Flag_Check_Des; 1258 p_eng->flg.desc = p_eng->flg.desc | value; 1259 if (DBG_PRINT_ERR_FLAG) 1260 printf("flags: error = %08x, desc = %08x\n", p_eng->flg.error, p_eng->flg.desc); 1261 1262 return (1); 1263 } 1264 1265 //------------------------------------------------------------ 1266 // Get and Check status of Interrupt 1267 //------------------------------------------------------------ 1268 int check_int (MAC_ENGINE *eng, char *type ) 1269 { 1270 nt_log_func_name(); 1271 1272 uint32_t mac_00; 1273 1274 mac_00 = mac_reg_read(eng, 0x00); 1275 #ifdef CheckRxbufUNAVA 1276 if (mac_00 & BIT(2)) { 1277 PRINTF( FP_LOG, "[%sIntStatus] Receiving buffer unavailable : %08x [loop[%d]:%d]\n", type, mac_00, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1278 FindErr( eng, Err_Flag_RXBUF_UNAVA ); 1279 } 1280 #endif 1281 1282 #ifdef CheckRPktLost 1283 if (mac_00 & BIT(3)) { 1284 PRINTF( FP_LOG, "[%sIntStatus] Received packet lost due to RX FIFO full : %08x [loop[%d]:%d]\n", type, mac_00, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1285 FindErr( eng, Err_Flag_RPKT_LOST ); 1286 } 1287 #endif 1288 1289 #ifdef CheckNPTxbufUNAVA 1290 if (mac_00 & BIT(6) ) { 1291 PRINTF( FP_LOG, "[%sIntStatus] Normal priority transmit buffer unavailable: %08x [loop[%d]:%d]\n", type, mac_00, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1292 FindErr( eng, Err_Flag_NPTXBUF_UNAVA ); 1293 } 1294 #endif 1295 1296 #ifdef CheckTPktLost 1297 if (mac_00 & BIT(7)) { 1298 PRINTF( FP_LOG, "[%sIntStatus] Packets transmitted to Ethernet lost : %08x [loop[%d]:%d]\n", type, mac_00, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1299 FindErr( eng, Err_Flag_TPKT_LOST ); 1300 } 1301 #endif 1302 1303 if ( eng->flg.error ) 1304 return(1); 1305 else 1306 return(0); 1307 } // End int check_int (MAC_ENGINE *eng, char *type) 1308 1309 1310 //------------------------------------------------------------ 1311 // Buffer 1312 //------------------------------------------------------------ 1313 void setup_framesize (MAC_ENGINE *eng) 1314 { 1315 int32_t des_num; 1316 1317 nt_log_func_name(); 1318 1319 //------------------------------ 1320 // Fill Frame Size out descriptor area 1321 //------------------------------ 1322 if (0) { 1323 for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ ) { 1324 if ( RAND_SIZE_SIMPLE ) 1325 switch( rand() % 5 ) { 1326 case 0 : eng->dat.FRAME_LEN[ des_num ] = 0x4e ; break; 1327 case 1 : eng->dat.FRAME_LEN[ des_num ] = 0x4ba; break; 1328 default: eng->dat.FRAME_LEN[ des_num ] = 0x5ea; break; 1329 } 1330 else 1331 // eng->dat.FRAME_LEN[ des_num ] = ( rand() + RAND_SIZE_MIN ) % ( RAND_SIZE_MAX + 1 ); 1332 eng->dat.FRAME_LEN[ des_num ] = RAND_SIZE_MIN + ( rand() % ( RAND_SIZE_MAX - RAND_SIZE_MIN + 1 ) ); 1333 1334 if ( DbgPrn_FRAME_LEN ) 1335 PRINTF( FP_LOG, "[setup_framesize] FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]\n", eng->dat.FRAME_LEN[ des_num ], des_num, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1336 } 1337 } 1338 else { 1339 for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ ) { 1340 #ifdef SelectSimpleLength 1341 if ( des_num % FRAME_SELH_PERD ) 1342 eng->dat.FRAME_LEN[ des_num ] = FRAME_LENH; 1343 else 1344 eng->dat.FRAME_LEN[ des_num ] = FRAME_LENL; 1345 #else 1346 if ( eng->run.tm_tx_only ) { 1347 if ( eng->run.TM_IEEE ) 1348 eng->dat.FRAME_LEN[ des_num ] = 1514; 1349 else 1350 eng->dat.FRAME_LEN[ des_num ] = 60; 1351 } 1352 else { 1353 #ifdef SelectLengthInc 1354 eng->dat.FRAME_LEN[ des_num ] = 1514 - ( des_num % 1455 ); 1355 #else 1356 if ( des_num % FRAME_SELH_PERD ) 1357 eng->dat.FRAME_LEN[ des_num ] = FRAME_LENH; 1358 else 1359 eng->dat.FRAME_LEN[ des_num ] = FRAME_LENL; 1360 #endif 1361 } // End if ( eng->run.tm_tx_only ) 1362 #endif 1363 if ( DbgPrn_FRAME_LEN ) 1364 PRINTF( FP_LOG, "[setup_framesize] FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]\n", eng->dat.FRAME_LEN[ des_num ], des_num, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1365 1366 } // End for (des_num = 0; des_num < eng->dat.Des_Num; des_num++) 1367 } // End if ( ENABLE_RAND_SIZE ) 1368 1369 // Calculate average of frame size 1370 #ifdef Enable_ShowBW 1371 eng->dat.Total_frame_len = 0; 1372 1373 for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ ) 1374 eng->dat.Total_frame_len += eng->dat.FRAME_LEN[ des_num ]; 1375 #endif 1376 1377 //------------------------------ 1378 // Write Plane 1379 //------------------------------ 1380 switch( ZeroCopy_OFFSET & 0x3 ) { 1381 case 0: eng->dat.wp_fir = 0xffffffff; break; 1382 case 1: eng->dat.wp_fir = 0xffffff00; break; 1383 case 2: eng->dat.wp_fir = 0xffff0000; break; 1384 case 3: eng->dat.wp_fir = 0xff000000; break; 1385 } 1386 1387 for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ ) 1388 switch( ( ZeroCopy_OFFSET + eng->dat.FRAME_LEN[ des_num ] - 1 ) & 0x3 ) { 1389 case 0: eng->dat.wp_lst[ des_num ] = 0x000000ff; break; 1390 case 1: eng->dat.wp_lst[ des_num ] = 0x0000ffff; break; 1391 case 2: eng->dat.wp_lst[ des_num ] = 0x00ffffff; break; 1392 case 3: eng->dat.wp_lst[ des_num ] = 0xffffffff; break; 1393 } 1394 } // End void setup_framesize (void) 1395 1396 //------------------------------------------------------------ 1397 void setup_arp(MAC_ENGINE *eng) 1398 { 1399 1400 nt_log_func_name(); 1401 1402 memcpy(eng->dat.ARP_data, ARP_org_data, sizeof(ARP_org_data)); 1403 1404 eng->dat.ARP_data[1] &= ~GENMASK(31, 16); 1405 eng->dat.ARP_data[1] |= (eng->inf.SA[1] << 24) | (eng->inf.SA[0] << 16); 1406 eng->dat.ARP_data[2] = (eng->inf.SA[5] << 24) | (eng->inf.SA[4] << 16) | 1407 (eng->inf.SA[3] << 8) | (eng->inf.SA[2]); 1408 eng->dat.ARP_data[5] &= ~GENMASK(31, 16); 1409 eng->dat.ARP_data[5] |= (eng->inf.SA[1] << 24) | (eng->inf.SA[0] << 16); 1410 eng->dat.ARP_data[6] = (eng->inf.SA[5] << 24) | (eng->inf.SA[4] << 16) | 1411 (eng->inf.SA[3] << 8) | (eng->inf.SA[2]); 1412 } 1413 1414 //------------------------------------------------------------ 1415 void setup_buf (MAC_ENGINE *eng) 1416 { 1417 int32_t des_num_max; 1418 int32_t des_num; 1419 int i; 1420 uint32_t adr; 1421 uint32_t adr_srt; 1422 uint32_t adr_end; 1423 uint32_t Current_framelen; 1424 uint32_t gdata = 0; 1425 #ifdef SelectSimpleDA 1426 int cnt; 1427 uint32_t len; 1428 #endif 1429 1430 nt_log_func_name(); 1431 1432 // It need be multiple of 4 1433 eng->dat.DMA_Base_Setup = DMA_BASE & 0xfffffffc; 1434 adr_srt = eng->dat.DMA_Base_Setup; 1435 1436 if (eng->run.tm_tx_only) { 1437 if (eng->run.TM_IEEE) { 1438 for (des_num = 0; des_num < eng->dat.Des_Num; des_num++) { 1439 if ( DbgPrn_BufAdr ) 1440 printf("[loop[%d]:%4d][des:%4d][setup_buf ] %08x\n", eng->run.loop_of_cnt, eng->run.loop_cnt, des_num, adr_srt); 1441 Write_Mem_Dat_DD(adr_srt, 0xffffffff); 1442 Write_Mem_Dat_DD(adr_srt + 4, 1443 eng->dat.ARP_data[1]); 1444 Write_Mem_Dat_DD(adr_srt + 8, 1445 eng->dat.ARP_data[2]); 1446 1447 for (adr = (adr_srt + 12); 1448 adr < (adr_srt + DMA_PakSize); adr += 4) { 1449 switch (eng->arg.test_mode) { 1450 case 4: 1451 gdata = rand() | (rand() << 16); 1452 break; 1453 case 5: 1454 gdata = eng->arg.user_def_val; 1455 break; 1456 } 1457 Write_Mem_Dat_DD(adr, gdata); 1458 } 1459 adr_srt += DMA_PakSize; 1460 } 1461 } else { 1462 printf("----->[ARP] 60 bytes\n"); 1463 for (i = 0; i < 16; i++) 1464 printf(" [Tx%02d] %08x %08x\n", i, eng->dat.ARP_data[i], SWAP_4B( eng->dat.ARP_data[i] ) ); 1465 1466 for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ ) { 1467 if ( DbgPrn_BufAdr ) 1468 printf("[loop[%d]:%4d][des:%4d][setup_buf ] %08x\n", eng->run.loop_of_cnt, eng->run.loop_cnt, des_num, adr_srt); 1469 1470 for (i = 0; i < 16; i++) 1471 Write_Mem_Dat_DD( adr_srt + ( i << 2 ), eng->dat.ARP_data[i] ); 1472 1473 1474 adr_srt += DMA_PakSize; 1475 } // End for (des_num = 0; des_num < eng->dat.Des_Num; des_num++) 1476 } // End if ( eng->run.TM_IEEE ) 1477 } else { 1478 if ( eng->arg.ctrl.b.single_packet ) 1479 des_num_max = 1; 1480 else 1481 des_num_max = eng->dat.Des_Num; 1482 1483 for (des_num = 0; des_num < des_num_max; des_num++) { 1484 if (DbgPrn_BufAdr) 1485 printf("[loop[%d]:%4d][des:%4d][setup_buf ] %08x\n", eng->run.loop_of_cnt, eng->run.loop_cnt, des_num, adr_srt); 1486 #ifdef SelectSimpleData 1487 #ifdef SimpleData_Fix 1488 switch( des_num % SimpleData_FixNum ) { 1489 case 0 : gdata = SimpleData_FixVal00; break; 1490 case 1 : gdata = SimpleData_FixVal01; break; 1491 case 2 : gdata = SimpleData_FixVal02; break; 1492 case 3 : gdata = SimpleData_FixVal03; break; 1493 case 4 : gdata = SimpleData_FixVal04; break; 1494 case 5 : gdata = SimpleData_FixVal05; break; 1495 case 6 : gdata = SimpleData_FixVal06; break; 1496 case 7 : gdata = SimpleData_FixVal07; break; 1497 case 8 : gdata = SimpleData_FixVal08; break; 1498 case 9 : gdata = SimpleData_FixVal09; break; 1499 case 10 : gdata = SimpleData_FixVal10; break; 1500 default : gdata = SimpleData_FixVal11; break; 1501 } 1502 #else 1503 gdata = 0x11111111 * ((des_num + SEED_START) % 256); 1504 #endif 1505 #else 1506 gdata = DATA_SEED( des_num + SEED_START ); 1507 #endif 1508 Current_framelen = eng->dat.FRAME_LEN[ des_num ]; 1509 1510 if ( DbgPrn_FRAME_LEN ) 1511 PRINTF( FP_LOG, "[setup_buf ] Current_framelen:%08x[Des:%d][loop[%d]:%d]\n", Current_framelen, des_num, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1512 #ifdef SelectSimpleDA 1513 cnt = 0; 1514 len = ( ( ( Current_framelen - 14 ) & 0xff ) << 8) | 1515 ( ( Current_framelen - 14 ) >> 8 ); 1516 #endif 1517 adr_end = adr_srt + DMA_PakSize; 1518 for ( adr = adr_srt; adr < adr_end; adr += 4 ) { 1519 #ifdef SelectSimpleDA 1520 cnt++; 1521 if ( cnt == 1 ) Write_Mem_Dat_DD( adr, SelectSimpleDA_Dat0 ); 1522 else if ( cnt == 2 ) Write_Mem_Dat_DD( adr, SelectSimpleDA_Dat1 ); 1523 else if ( cnt == 3 ) Write_Mem_Dat_DD( adr, SelectSimpleDA_Dat2 ); 1524 else if ( cnt == 4 ) Write_Mem_Dat_DD( adr, len | (len << 16) ); 1525 else 1526 #endif 1527 Write_Mem_Dat_DD( adr, gdata ); 1528 #ifdef SelectSimpleData 1529 gdata = gdata ^ SimpleData_XORVal; 1530 #else 1531 gdata += DATA_IncVal; 1532 #endif 1533 } 1534 adr_srt += DMA_PakSize; 1535 } // End for (des_num = 0; des_num < eng->dat.Des_Num; des_num++) 1536 } // End if ( eng->run.tm_tx_only ) 1537 } // End void setup_buf (MAC_ENGINE *eng) 1538 1539 //------------------------------------------------------------ 1540 // Check data of one packet 1541 //------------------------------------------------------------ 1542 char check_Data (MAC_ENGINE *eng, uint32_t datbase, int32_t number) 1543 { 1544 int32_t number_dat; 1545 int index; 1546 uint32_t rdata; 1547 uint32_t wp_lst_cur; 1548 uint32_t adr_las; 1549 uint32_t adr; 1550 uint32_t adr_srt; 1551 uint32_t adr_end; 1552 #ifdef SelectSimpleDA 1553 int cnt; 1554 uint32_t len; 1555 uint32_t gdata_bak; 1556 #endif 1557 uint32_t gdata; 1558 1559 uint32_t wp; 1560 1561 nt_log_func_name(); 1562 1563 if (eng->arg.ctrl.b.single_packet) 1564 number_dat = 0; 1565 else 1566 number_dat = number; 1567 1568 wp_lst_cur = eng->dat.wp_lst[ number ]; 1569 eng->dat.FRAME_LEN_Cur = eng->dat.FRAME_LEN[ number_dat ]; 1570 1571 if ( DbgPrn_FRAME_LEN ) 1572 PRINTF( FP_LOG, "[check_Data ] FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]\n", eng->dat.FRAME_LEN_Cur, number, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1573 1574 adr_srt = datbase; 1575 adr_end = adr_srt + PktByteSize; 1576 1577 #if defined(SelectSimpleData) 1578 #ifdef SimpleData_Fix 1579 switch( number_dat % SimpleData_FixNum ) { 1580 case 0 : gdata = SimpleData_FixVal00; break; 1581 case 1 : gdata = SimpleData_FixVal01; break; 1582 case 2 : gdata = SimpleData_FixVal02; break; 1583 case 3 : gdata = SimpleData_FixVal03; break; 1584 case 4 : gdata = SimpleData_FixVal04; break; 1585 case 5 : gdata = SimpleData_FixVal05; break; 1586 case 6 : gdata = SimpleData_FixVal06; break; 1587 case 7 : gdata = SimpleData_FixVal07; break; 1588 case 8 : gdata = SimpleData_FixVal08; break; 1589 case 9 : gdata = SimpleData_FixVal09; break; 1590 case 10 : gdata = SimpleData_FixVal10; break; 1591 default : gdata = SimpleData_FixVal11; break; 1592 } 1593 #else 1594 gdata = 0x11111111 * (( number_dat + SEED_START ) % 256 ); 1595 #endif 1596 #else 1597 gdata = DATA_SEED( number_dat + SEED_START ); 1598 #endif 1599 1600 //printf("check_buf: %08x - %08x [%08x]\n", adr_srt, adr_end, datbase); 1601 wp = eng->dat.wp_fir; 1602 adr_las = adr_end - 4; 1603 #ifdef SelectSimpleDA 1604 cnt = 0; 1605 len = ((( eng->dat.FRAME_LEN_Cur-14 ) & 0xff ) << 8 ) | 1606 ( ( eng->dat.FRAME_LEN_Cur-14 ) >> 8 ); 1607 #endif 1608 1609 if ( DbgPrn_Bufdat ) 1610 PRINTF( FP_LOG, " Inf:%08x ~ %08x(%08x) %08x [Des:%d][loop[%d]:%d]\n", adr_srt, adr_end, adr_las, gdata, number, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1611 1612 for ( adr = adr_srt; adr < adr_end; adr+=4 ) { 1613 #ifdef SelectSimpleDA 1614 cnt++; 1615 if ( cnt == 1 ) { gdata_bak = gdata; gdata = SelectSimpleDA_Dat0; } 1616 else if ( cnt == 2 ) { gdata_bak = gdata; gdata = SelectSimpleDA_Dat1; } 1617 else if ( cnt == 3 ) { gdata_bak = gdata; gdata = SelectSimpleDA_Dat2; } 1618 else if ( cnt == 4 ) { gdata_bak = gdata; gdata = len | (len << 16); } 1619 #endif 1620 rdata = Read_Mem_Dat_DD( adr ); 1621 if ( adr == adr_las ) 1622 wp = wp & wp_lst_cur; 1623 1624 if ( ( rdata & wp ) != ( gdata & wp ) ) { 1625 PRINTF( FP_LOG, "\nError: Adr:%08x[%3d] (%08x) (%08x:%08x) [Des:%d][loop[%d]:%d]\n", adr, ( adr - adr_srt ) / 4, rdata, gdata, wp, number, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1626 for ( index = 0; index < 6; index++ ) 1627 PRINTF( FP_LOG, "Rep : Adr:%08x (%08x) (%08x:%08x) [Des:%d][loop[%d]:%d]\n", adr, Read_Mem_Dat_DD( adr ), gdata, wp, number, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1628 1629 if (DbgPrn_DumpMACCnt) 1630 dump_mac_ROreg(eng); 1631 1632 return( FindErr( eng, Err_Flag_Check_Buf_Data ) ); 1633 } // End if ( (rdata & wp) != (gdata & wp) ) 1634 if ( DbgPrn_BufdatDetail ) 1635 PRINTF( FP_LOG, " Adr:%08x[%3d] (%08x) (%08x:%08x) [Des:%d][loop[%d]:%d]\n", adr, ( adr - adr_srt ) / 4, rdata, gdata, wp, number, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1636 1637 #ifdef SelectSimpleDA 1638 if ( cnt <= 4 ) 1639 gdata = gdata_bak; 1640 #endif 1641 1642 #if defined(SelectSimpleData) 1643 gdata = gdata ^ SimpleData_XORVal; 1644 #else 1645 gdata += DATA_IncVal; 1646 #endif 1647 1648 wp = 0xffffffff; 1649 } 1650 return(0); 1651 } // End char check_Data (MAC_ENGINE *eng, uint32_t datbase, int32_t number) 1652 1653 //------------------------------------------------------------ 1654 char check_buf (MAC_ENGINE *eng, int loopcnt) 1655 { 1656 int32_t des_num; 1657 uint32_t desadr; 1658 uint32_t datbase; 1659 1660 nt_log_func_name(); 1661 1662 desadr = eng->run.rdes_base + (16 * eng->dat.Des_Num) - 4; 1663 for (des_num = eng->dat.Des_Num - 1; des_num >= 0; des_num--) { 1664 #ifdef CHECK_RX_DATA 1665 datbase = AT_BUF_MEMRW(Read_Mem_Des_DD(desadr) & 0xfffffffc); 1666 if (check_Data(eng, datbase, des_num)) { 1667 check_int(eng, ""); 1668 return (1); 1669 } 1670 if (check_int(eng, "")) 1671 return 1; 1672 #endif 1673 desadr -= 16; 1674 } 1675 if (check_int(eng, "")) 1676 return (1); 1677 1678 #if defined(Delay_CheckData_LoopNum) && defined(Delay_CheckData) 1679 if ((loopcnt % Delay_CheckData_LoopNum) == 0) 1680 DELAY(Delay_CheckData); 1681 #endif 1682 return (0); 1683 } // End char check_buf (MAC_ENGINE *eng, int loopcnt) 1684 1685 //------------------------------------------------------------ 1686 // Descriptor 1687 //------------------------------------------------------------ 1688 void setup_txdes (MAC_ENGINE *eng, uint32_t desadr, uint32_t bufbase) 1689 { 1690 uint32_t bufadr; 1691 uint32_t bufadrgap; 1692 uint32_t desval = 0; 1693 int32_t des_num; 1694 1695 nt_log_func_name(); 1696 1697 bufadr = bufbase; 1698 if (eng->arg.ctrl.b.single_packet) 1699 bufadrgap = 0; 1700 else 1701 bufadrgap = DMA_PakSize; 1702 1703 if (eng->run.TM_TxDataEn) { 1704 for (des_num = 0; des_num < eng->dat.Des_Num; des_num++) { 1705 eng->dat.FRAME_LEN_Cur = eng->dat.FRAME_LEN[des_num]; 1706 desval = TDES_IniVal; 1707 Write_Mem_Des_DD(desadr + 0x04, 0); 1708 Write_Mem_Des_DD(desadr + 0x08, 0); 1709 Write_Mem_Des_DD(desadr + 0x0C, bufadr); 1710 Write_Mem_Des_DD(desadr, desval); 1711 1712 if (DbgPrn_FRAME_LEN) 1713 PRINTF( 1714 FP_LOG, 1715 "[setup_txdes ] " 1716 "FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]\n", 1717 eng->dat.FRAME_LEN_Cur, des_num, 1718 eng->run.loop_of_cnt, eng->run.loop_cnt); 1719 1720 if (DbgPrn_BufAdr) 1721 printf("[loop[%d]:%4d][des:%4d][setup_txdes] " 1722 "%08x [%08x]\n", 1723 eng->run.loop_of_cnt, eng->run.loop_cnt, 1724 des_num, desadr, bufadr); 1725 1726 desadr += 16; 1727 bufadr += bufadrgap; 1728 } 1729 barrier(); 1730 Write_Mem_Des_DD(desadr - 0x10, desval | EOR_IniVal); 1731 } else { 1732 Write_Mem_Des_DD(desadr, 0); 1733 } 1734 } 1735 1736 //------------------------------------------------------------ 1737 void setup_rxdes (MAC_ENGINE *eng, uint32_t desadr, uint32_t bufbase) 1738 { 1739 uint32_t bufadr; 1740 uint32_t desval; 1741 int32_t des_num; 1742 1743 nt_log_func_name(); 1744 1745 bufadr = bufbase; 1746 desval = RDES_IniVal; 1747 if ( eng->run.TM_RxDataEn ) { 1748 for ( des_num = 0; des_num < eng->dat.Des_Num; des_num++ ) { 1749 Write_Mem_Des_DD(desadr + 0x04, 0 ); 1750 Write_Mem_Des_DD(desadr + 0x08, 0 ); 1751 Write_Mem_Des_DD(desadr + 0x0C, bufadr); 1752 Write_Mem_Des_DD(desadr + 0x00, desval); 1753 1754 if ( DbgPrn_BufAdr ) 1755 printf("[loop[%d]:%4d][des:%4d][setup_rxdes] %08x [%08x]\n", eng->run.loop_of_cnt, eng->run.loop_cnt, des_num, desadr, bufadr); 1756 1757 desadr += 16; 1758 bufadr += DMA_PakSize; 1759 } 1760 barrier(); 1761 Write_Mem_Des_DD( desadr - 0x10, desval | EOR_IniVal ); 1762 } 1763 else { 1764 Write_Mem_Des_DD( desadr, 0x80000000 ); 1765 } // End if ( eng->run.TM_RxDataEn ) 1766 } // End void setup_rxdes (uint32_t desadr, uint32_t bufbase) 1767 1768 //------------------------------------------------------------ 1769 // First setting TX and RX information 1770 //------------------------------------------------------------ 1771 void setup_des (MAC_ENGINE *eng, uint32_t bufnum) 1772 { 1773 if (DbgPrn_BufAdr) { 1774 printf("setup_des: %d\n", bufnum); 1775 debug_pause(); 1776 } 1777 1778 eng->dat.DMA_Base_Tx = 1779 ZeroCopy_OFFSET + eng->dat.DMA_Base_Setup; 1780 eng->dat.DMA_Base_Rx = ZeroCopy_OFFSET + GET_DMA_BASE(eng, 0); 1781 1782 setup_txdes(eng, eng->run.tdes_base, 1783 AT_MEMRW_BUF(eng->dat.DMA_Base_Tx)); 1784 setup_rxdes(eng, eng->run.rdes_base, 1785 AT_MEMRW_BUF(eng->dat.DMA_Base_Rx)); 1786 } // End void setup_des (uint32_t bufnum) 1787 1788 //------------------------------------------------------------ 1789 // Move buffer point of TX and RX descriptor to next DMA buffer 1790 //------------------------------------------------------------ 1791 void setup_des_loop (MAC_ENGINE *eng, uint32_t bufnum) 1792 { 1793 int32_t des_num; 1794 uint32_t H_rx_desadr; 1795 uint32_t H_tx_desadr; 1796 uint32_t H_tx_bufadr; 1797 uint32_t H_rx_bufadr; 1798 1799 nt_log_func_name(); 1800 1801 if (eng->run.TM_RxDataEn) { 1802 H_rx_bufadr = AT_MEMRW_BUF(eng->dat.DMA_Base_Rx); 1803 H_rx_desadr = eng->run.rdes_base; 1804 for (des_num = 0; des_num < eng->dat.Des_Num - 1; des_num++) { 1805 Write_Mem_Des_DD(H_rx_desadr + 0x0C, H_rx_bufadr); 1806 Write_Mem_Des_DD(H_rx_desadr, RDES_IniVal); 1807 if (DbgPrn_BufAdr) 1808 printf("[loop[%d]:%4d][des:%4d][setup_rxdes] " 1809 "%08x [%08x]\n", 1810 eng->run.loop_of_cnt, eng->run.loop_cnt, 1811 des_num, H_rx_desadr, H_rx_bufadr); 1812 1813 H_rx_bufadr += DMA_PakSize; 1814 H_rx_desadr += 16; 1815 } 1816 Write_Mem_Des_DD(H_rx_desadr + 0x0C, H_rx_bufadr); 1817 Write_Mem_Des_DD(H_rx_desadr, RDES_IniVal | EOR_IniVal); 1818 if (DbgPrn_BufAdr) 1819 printf("[loop[%d]:%4d][des:%4d][setup_rxdes] %08x " 1820 "[%08x]\n", 1821 eng->run.loop_of_cnt, eng->run.loop_cnt, des_num, 1822 H_rx_desadr, H_rx_bufadr); 1823 } 1824 1825 if (eng->run.TM_TxDataEn) { 1826 H_tx_bufadr = AT_MEMRW_BUF(eng->dat.DMA_Base_Tx); 1827 H_tx_desadr = eng->run.tdes_base; 1828 for (des_num = 0; des_num < eng->dat.Des_Num - 1; des_num++) { 1829 eng->dat.FRAME_LEN_Cur = eng->dat.FRAME_LEN[des_num]; 1830 Write_Mem_Des_DD(H_tx_desadr + 0x0C, H_tx_bufadr); 1831 Write_Mem_Des_DD(H_tx_desadr, TDES_IniVal); 1832 if (DbgPrn_BufAdr) 1833 printf("[loop[%d]:%4d][des:%4d][setup_txdes] " 1834 "%08x [%08x]\n", 1835 eng->run.loop_of_cnt, eng->run.loop_cnt, 1836 des_num, H_tx_desadr, H_tx_bufadr); 1837 1838 H_tx_bufadr += DMA_PakSize; 1839 H_tx_desadr += 16; 1840 } 1841 eng->dat.FRAME_LEN_Cur = eng->dat.FRAME_LEN[des_num]; 1842 Write_Mem_Des_DD(H_tx_desadr + 0x0C, H_tx_bufadr); 1843 Write_Mem_Des_DD(H_tx_desadr, TDES_IniVal | EOR_IniVal); 1844 if (DbgPrn_BufAdr) 1845 printf("[loop[%d]:%4d][des:%4d][setup_txdes] %08x " 1846 "[%08x]\n", 1847 eng->run.loop_of_cnt, eng->run.loop_cnt, des_num, 1848 H_tx_desadr, H_tx_bufadr); 1849 } 1850 } // End void setup_des_loop (uint32_t bufnum) 1851 1852 //------------------------------------------------------------ 1853 char check_des_header_Tx (MAC_ENGINE *eng, char *type, uint32_t adr, int32_t desnum) 1854 { 1855 int timeout = 0; 1856 1857 eng->dat.TxDes0DW = Read_Mem_Des_DD(adr); 1858 1859 while (HWOwnTx(eng->dat.TxDes0DW)) { 1860 // we will run again, if transfer has not been completed. 1861 if ((eng->run.tm_tx_only || eng->run.TM_RxDataEn) && 1862 (++timeout > eng->run.timeout_th)) { 1863 PRINTF(FP_LOG, 1864 "[%sTxDesOwn] Address %08x = %08x " 1865 "[Des:%d][loop[%d]:%d]\n", 1866 type, adr, eng->dat.TxDes0DW, desnum, 1867 eng->run.loop_of_cnt, eng->run.loop_cnt); 1868 return (FindErr_Des(eng, Des_Flag_TxOwnTimeOut)); 1869 } 1870 1871 #ifdef Delay_ChkTxOwn 1872 DELAY(Delay_ChkTxOwn); 1873 #endif 1874 eng->dat.TxDes0DW = Read_Mem_Des_DD(adr); 1875 } 1876 1877 return(0); 1878 } // End char check_des_header_Tx (MAC_ENGINE *eng, char *type, uint32_t adr, int32_t desnum) 1879 1880 //------------------------------------------------------------ 1881 char check_des_header_Rx (MAC_ENGINE *eng, char *type, uint32_t adr, int32_t desnum) 1882 { 1883 #ifdef CheckRxOwn 1884 int timeout = 0; 1885 1886 eng->dat.RxDes0DW = Read_Mem_Des_DD(adr); 1887 1888 while (HWOwnRx(eng->dat.RxDes0DW)) { 1889 // we will run again, if transfer has not been completed. 1890 if (eng->run.TM_TxDataEn && (++timeout > eng->run.timeout_th)) { 1891 #if 0 1892 printf("[%sRxDesOwn] Address %08x = %08x " 1893 "[Des:%d][loop[%d]:%d]\n", 1894 type, adr, eng->dat.RxDes0DW, desnum, 1895 eng->run.loop_of_cnt, eng->run.loop_cnt); 1896 #endif 1897 FindErr_Des(eng, Des_Flag_RxOwnTimeOut); 1898 return (2); 1899 } 1900 1901 #ifdef Delay_ChkRxOwn 1902 DELAY(Delay_ChkRxOwn); 1903 #endif 1904 eng->dat.RxDes0DW = Read_Mem_Des_DD(adr); 1905 }; 1906 1907 #ifdef CheckRxLen 1908 if ( DbgPrn_FRAME_LEN ) 1909 PRINTF( FP_LOG, "[%sRxDes ] FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]\n", type, ( eng->dat.FRAME_LEN_Cur + 4 ), desnum, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1910 1911 if ( ( eng->dat.RxDes0DW & 0x3fff ) != ( eng->dat.FRAME_LEN_Cur + 4 ) ) { 1912 eng->dat.RxDes3DW = Read_Mem_Des_DD( adr + 12 ); 1913 PRINTF( FP_LOG, "[%sRxDes] Error Frame Length %08x:%08x %08x(%4d/%4d) [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, ( eng->dat.RxDes0DW & 0x3fff ), ( eng->dat.FRAME_LEN_Cur + 4 ), desnum, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1914 FindErr_Des( eng, Des_Flag_FrameLen ); 1915 } 1916 #endif // End CheckRxLen 1917 1918 if ( eng->dat.RxDes0DW & RXDES_EM_ALL ) { 1919 eng->dat.RxDes3DW = Read_Mem_Des_DD( adr + 12 ); 1920 #ifdef CheckRxErr 1921 if ( eng->dat.RxDes0DW & RXDES_EM_RXERR ) { 1922 PRINTF( FP_LOG, "[%sRxDes] Error RxErr %08x:%08x %08x [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1923 FindErr_Des( eng, Des_Flag_RxErr ); 1924 } 1925 #endif // End CheckRxErr 1926 1927 #ifdef CheckCRC 1928 if ( eng->dat.RxDes0DW & RXDES_EM_CRC ) { 1929 PRINTF( FP_LOG, "[%sRxDes] Error CRC %08x:%08x %08x [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1930 FindErr_Des( eng, Des_Flag_CRC ); 1931 } 1932 #endif // End CheckCRC 1933 1934 #ifdef CheckFTL 1935 if ( eng->dat.RxDes0DW & RXDES_EM_FTL ) { 1936 PRINTF( FP_LOG, "[%sRxDes] Error FTL %08x:%08x %08x [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1937 FindErr_Des( eng, Des_Flag_FTL ); 1938 } 1939 #endif // End CheckFTL 1940 1941 #ifdef CheckRunt 1942 if ( eng->dat.RxDes0DW & RXDES_EM_RUNT) { 1943 PRINTF( FP_LOG, "[%sRxDes] Error Runt %08x:%08x %08x [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1944 FindErr_Des( eng, Des_Flag_Runt ); 1945 } 1946 #endif // End CheckRunt 1947 1948 #ifdef CheckOddNibble 1949 if ( eng->dat.RxDes0DW & RXDES_EM_ODD_NB ) { 1950 PRINTF( FP_LOG, "[%sRxDes] Odd Nibble %08x:%08x %08x [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1951 FindErr_Des( eng, Des_Flag_OddNibble ); 1952 } 1953 #endif // End CheckOddNibble 1954 1955 #ifdef CheckRxFIFOFull 1956 if ( eng->dat.RxDes0DW & RXDES_EM_FIFO_FULL ) { 1957 PRINTF( FP_LOG, "[%sRxDes] Error Rx FIFO Full %08x:%08x %08x [Des:%d][loop[%d]:%d]\n", type, adr, eng->dat.RxDes0DW, eng->dat.RxDes3DW, desnum, eng->run.loop_of_cnt, eng->run.loop_cnt ); 1958 FindErr_Des( eng, Des_Flag_RxFIFOFull ); 1959 } 1960 #endif // End CheckRxFIFOFull 1961 } 1962 1963 #endif // End CheckRxOwn 1964 1965 if ( eng->flg.error ) 1966 return(1); 1967 else 1968 return(0); 1969 } // End char check_des_header_Rx (MAC_ENGINE *eng, char *type, uint32_t adr, int32_t desnum) 1970 1971 //------------------------------------------------------------ 1972 char check_des (MAC_ENGINE *eng, uint32_t bufnum, int checkpoint) 1973 { 1974 int32_t desnum; 1975 int8_t desnum_last; 1976 uint32_t H_rx_desadr; 1977 uint32_t H_tx_desadr; 1978 uint32_t H_tx_bufadr; 1979 uint32_t H_rx_bufadr; 1980 #ifdef Delay_DesGap 1981 uint32_t dly_cnt = 0; 1982 uint32_t dly_max = Delay_CntMaxIncVal; 1983 #endif 1984 int ret; 1985 1986 nt_log_func_name(); 1987 1988 /* Fire the engine to send and recvice */ 1989 mac_reg_write(eng, 0x1c, 0x00000001); // Rx Poll 1990 mac_reg_write(eng, 0x18, 0x00000001); // Tx Poll 1991 1992 #ifndef SelectSimpleDes 1993 /* base of the descriptors */ 1994 H_tx_bufadr = AT_MEMRW_BUF(eng->dat.DMA_Base_Tx); 1995 H_rx_bufadr = AT_MEMRW_BUF(eng->dat.DMA_Base_Rx); 1996 #endif 1997 H_rx_desadr = eng->run.rdes_base; 1998 H_tx_desadr = eng->run.tdes_base; 1999 2000 #ifdef Delay_DES 2001 DELAY(Delay_DES); 2002 #endif 2003 2004 for (desnum = 0; desnum < eng->dat.Des_Num; desnum++) { 2005 desnum_last = (desnum == (eng->dat.Des_Num - 1)) ? 1 : 0; 2006 if ( DbgPrn_BufAdr ) { 2007 if ( checkpoint ) 2008 printf("[loop[%d]:%4d][des:%4d][check_des ] %08x %08x [%08x %08x]\n", eng->run.loop_of_cnt, eng->run.loop_cnt, desnum, ( H_tx_desadr ), ( H_rx_desadr ), Read_Mem_Des_DD( H_tx_desadr + 12 ), Read_Mem_Des_DD( H_rx_desadr + 12 ) ); 2009 else 2010 printf("[loop[%d]:%4d][des:%4d][check_des ] %08x %08x [%08x %08x]->[%08x %08x]\n", eng->run.loop_of_cnt, eng->run.loop_cnt, desnum, ( H_tx_desadr ), ( H_rx_desadr ), Read_Mem_Des_DD( H_tx_desadr + 12 ), Read_Mem_Des_DD( H_rx_desadr + 12 ), H_tx_bufadr, H_rx_bufadr ); 2011 } 2012 2013 //[Delay]-------------------- 2014 #ifdef Delay_DesGap 2015 // if ( dly_cnt++ > 3 ) { 2016 if ( dly_cnt > Delay_CntMax ) { 2017 // switch ( rand() % 12 ) { 2018 // case 1 : dly_max = 00000; break; 2019 // case 3 : dly_max = 20000; break; 2020 // case 5 : dly_max = 40000; break; 2021 // case 7 : dly_max = 60000; break; 2022 // defaule: dly_max = 70000; break; 2023 // } 2024 // 2025 // dly_max += ( rand() % 4 ) * 14321; 2026 // 2027 // while (dly_cnt < dly_max) { 2028 // dly_cnt++; 2029 // } 2030 DELAY( Delay_DesGap ); 2031 dly_cnt = 0; 2032 } 2033 else { 2034 dly_cnt++; 2035 // timeout = 0; 2036 // while (timeout < 50000) {timeout++;}; 2037 } 2038 #endif // End Delay_DesGap 2039 2040 //[Check Owner Bit]-------------------- 2041 eng->dat.FRAME_LEN_Cur = eng->dat.FRAME_LEN[desnum]; 2042 if (DbgPrn_FRAME_LEN) 2043 PRINTF(FP_LOG, 2044 "[check_des ] " 2045 "FRAME_LEN_Cur:%08x[Des:%d][loop[%d]:%d]%d\n", 2046 eng->dat.FRAME_LEN_Cur, desnum, 2047 eng->run.loop_of_cnt, eng->run.loop_cnt, 2048 checkpoint); 2049 2050 // Check the description of Tx and Rx 2051 if (eng->run.TM_TxDataEn) { 2052 ret = check_des_header_Tx(eng, "", H_tx_desadr, desnum); 2053 if (ret) { 2054 eng->flg.n_desc_fail = desnum; 2055 return ret; 2056 } 2057 } 2058 if (eng->run.TM_RxDataEn) { 2059 ret = check_des_header_Rx(eng, "", H_rx_desadr, desnum); 2060 if (ret) { 2061 eng->flg.n_desc_fail = desnum; 2062 return ret; 2063 2064 } 2065 } 2066 2067 #ifndef SelectSimpleDes 2068 if (!checkpoint) { 2069 // Setting buffer address to description of Tx and Rx on next stage 2070 if ( eng->run.TM_RxDataEn ) { 2071 Write_Mem_Des_DD( H_rx_desadr + 0x0C, H_rx_bufadr ); 2072 if ( desnum_last ) 2073 Write_Mem_Des_DD( H_rx_desadr, RDES_IniVal | EOR_IniVal ); 2074 else 2075 Write_Mem_Des_DD( H_rx_desadr, RDES_IniVal ); 2076 2077 readl(H_rx_desadr); 2078 mac_reg_write(eng, 0x1c, 0x00000000); //Rx Poll 2079 H_rx_bufadr += DMA_PakSize; 2080 } 2081 if ( eng->run.TM_TxDataEn ) { 2082 Write_Mem_Des_DD( H_tx_desadr + 0x0C, H_tx_bufadr ); 2083 if ( desnum_last ) 2084 Write_Mem_Des_DD( H_tx_desadr, TDES_IniVal | EOR_IniVal ); 2085 else 2086 Write_Mem_Des_DD( H_tx_desadr, TDES_IniVal ); 2087 2088 readl(H_tx_desadr); 2089 mac_reg_write(eng, 0x18, 0x00000000); //Tx Poll 2090 H_tx_bufadr += DMA_PakSize; 2091 } 2092 } 2093 #endif // End SelectSimpleDes 2094 2095 H_rx_desadr += 16; 2096 H_tx_desadr += 16; 2097 } // End for (desnum = 0; desnum < eng->dat.Des_Num; desnum++) 2098 2099 return(0); 2100 } // End char check_des (MAC_ENGINE *eng, uint32_t bufnum, int checkpoint) 2101 //#endif 2102 2103 //------------------------------------------------------------ 2104 // Print 2105 //----------------------------------------------------------- 2106 void PrintIO_Header (MAC_ENGINE *eng, uint8_t option) 2107 { 2108 int32_t rx_d, step, tmp; 2109 2110 if (eng->run.TM_IOStrength) { 2111 if (eng->io.drv_upper_bond > 1) { 2112 #ifdef CONFIG_ASPEED_AST2600 2113 PRINTF(option, "<IO Strength register: [%08x] 0x%08x>", 2114 eng->io.mac34_drv_reg.addr, 2115 eng->io.mac34_drv_reg.value.w); 2116 #else 2117 PRINTF(option, "<IO Strength register: [%08x] 0x%08x>", 2118 eng->io.mac12_drv_reg.addr, 2119 eng->io.mac12_drv_reg.value.w); 2120 #endif 2121 } 2122 } 2123 2124 if ( eng->run.speed_sel[ 0 ] ) { PRINTF( option, "\n[1G ]========================================>\n" ); } 2125 else if ( eng->run.speed_sel[ 1 ] ) { PRINTF( option, "\n[100M]========================================>\n" ); } 2126 else { PRINTF( option, "\n[10M ]========================================>\n" ); } 2127 2128 if ( !(option == FP_LOG) ) { 2129 step = eng->io.rx_delay_scan.step; 2130 2131 PRINTF(option, "\n "); 2132 for (rx_d = eng->io.rx_delay_scan.begin; rx_d <= eng->io.rx_delay_scan.end; rx_d += step) { 2133 2134 if (rx_d < 0) { 2135 PRINTF(option, "-" ); 2136 } else { 2137 PRINTF(option, "+" ); 2138 } 2139 } 2140 2141 PRINTF(option, "\n "); 2142 for (rx_d = eng->io.rx_delay_scan.begin; rx_d <= eng->io.rx_delay_scan.end; rx_d += step) { 2143 tmp = (abs(rx_d) >> 4) & 0xf; 2144 if (tmp == 0) { 2145 PRINTF(option, "0" ); 2146 } else { 2147 PRINTF(option, "%1x", tmp); 2148 } 2149 } 2150 2151 PRINTF(option, "\n "); 2152 for (rx_d = eng->io.rx_delay_scan.begin; 2153 rx_d <= eng->io.rx_delay_scan.end; rx_d += step) { 2154 PRINTF(option, "%1x", (uint32_t)abs(rx_d) & 0xf); 2155 } 2156 2157 PRINTF(option, "\n "); 2158 for (rx_d = eng->io.rx_delay_scan.begin; rx_d <= eng->io.rx_delay_scan.end; rx_d += step) { 2159 if (eng->io.rx_delay_scan.orig == rx_d) { 2160 PRINTF(option, "|" ); 2161 } else { 2162 PRINTF(option, " " ); 2163 } 2164 } 2165 PRINTF( option, "\n"); 2166 } 2167 } 2168 2169 //------------------------------------------------------------ 2170 void PrintIO_LineS(MAC_ENGINE *p_eng, uint8_t option) 2171 { 2172 if (p_eng->io.tx_delay_scan.orig == p_eng->io.Dly_out_selval) { 2173 PRINTF( option, "%02x:-", p_eng->io.Dly_out_selval); 2174 } else { 2175 PRINTF( option, "%02x: ", p_eng->io.Dly_out_selval); 2176 } 2177 } // End void PrintIO_LineS (MAC_ENGINE *eng, uint8_t option) 2178 2179 //------------------------------------------------------------ 2180 void PrintIO_Line(MAC_ENGINE *p_eng, uint8_t option) 2181 { 2182 if ((p_eng->io.Dly_in_selval == p_eng->io.rx_delay_scan.orig) && 2183 (p_eng->io.Dly_out_selval == p_eng->io.tx_delay_scan.orig)) { 2184 if (1 == p_eng->io.result) { 2185 PRINTF(option, "X"); 2186 } else if (2 == p_eng->io.result) { 2187 PRINTF(option, "*"); 2188 } else { 2189 PRINTF(option, "O"); 2190 } 2191 } else { 2192 if (1 == p_eng->io.result) { 2193 PRINTF(option, "x"); 2194 } else if (2 == p_eng->io.result) { 2195 PRINTF(option, "."); 2196 } else { 2197 PRINTF(option, "o"); 2198 } 2199 } 2200 } 2201 2202 //------------------------------------------------------------ 2203 // main 2204 //------------------------------------------------------------ 2205 2206 //------------------------------------------------------------ 2207 void TestingSetup (MAC_ENGINE *eng) 2208 { 2209 nt_log_func_name(); 2210 2211 //[Setup]-------------------- 2212 setup_framesize( eng ); 2213 setup_buf( eng ); 2214 } 2215 2216 //------------------------------------------------------------ 2217 // Return 1 ==> fail 2218 // Return 0 ==> PASS 2219 //------------------------------------------------------------ 2220 char TestingLoop (MAC_ENGINE *eng, uint32_t loop_checknum) 2221 { 2222 char checkprd; 2223 char looplast; 2224 char checken; 2225 int ret; 2226 2227 nt_log_func_name(); 2228 2229 if (DbgPrn_DumpMACCnt) 2230 dump_mac_ROreg(eng); 2231 2232 //[Setup]-------------------- 2233 eng->run.loop_cnt = 0; 2234 checkprd = 0; 2235 checken = 0; 2236 looplast = 0; 2237 2238 2239 setup_des(eng, 0); 2240 2241 if ( eng->run.TM_WaitStart ) { 2242 printf("Press any key to start...\n"); 2243 GET_CAHR(); 2244 } 2245 2246 2247 while ( ( eng->run.loop_cnt < eng->run.loop_max ) || eng->arg.loop_inf ) { 2248 looplast = !eng->arg.loop_inf && ( eng->run.loop_cnt == eng->run.loop_max - 1 ); 2249 2250 #ifdef CheckRxBuf 2251 if (!eng->run.tm_tx_only) 2252 checkprd = ((eng->run.loop_cnt % loop_checknum) == (loop_checknum - 1)); 2253 checken = looplast | checkprd; 2254 #endif 2255 2256 if (DbgPrn_BufAdr) { 2257 printf("for start ======> [%d]%d/%d(%d) looplast:%d " 2258 "checkprd:%d checken:%d\n", 2259 eng->run.loop_of_cnt, eng->run.loop_cnt, 2260 eng->run.loop_max, eng->arg.loop_inf, 2261 looplast, checkprd, checken); 2262 debug_pause(); 2263 } 2264 2265 2266 if (eng->run.TM_RxDataEn) 2267 eng->dat.DMA_Base_Tx = eng->dat.DMA_Base_Rx; 2268 2269 eng->dat.DMA_Base_Rx = 2270 ZeroCopy_OFFSET + GET_DMA_BASE(eng, eng->run.loop_cnt + 1); 2271 //[Check DES]-------------------- 2272 if (ret = check_des(eng, eng->run.loop_cnt, checken)) { 2273 //descriptor error 2274 eng->dat.Des_Num = eng->flg.n_desc_fail + 1; 2275 #ifdef CheckRxBuf 2276 if (checkprd) 2277 check_buf(eng, loop_checknum); 2278 else 2279 check_buf(eng, (eng->run.loop_max % loop_checknum)); 2280 eng->dat.Des_Num = eng->dat.Des_Num_Org; 2281 #endif 2282 2283 if (DbgPrn_DumpMACCnt) 2284 dump_mac_ROreg(eng); 2285 2286 return ret; 2287 } 2288 2289 //[Check Buf]-------------------- 2290 if (eng->run.TM_RxDataEn && checken) { 2291 if (checkprd) { 2292 #ifdef Enable_ShowBW 2293 printf("[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", loop_checknum, ((double)loop_checknum * (double)eng->dat.Total_frame_len * 8.0) / ((double)eng->timeused * 1000000.0), eng->timeused); 2294 PRINTF( FP_LOG, "[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", loop_checknum, ((double)loop_checknum * (double)eng->dat.Total_frame_len * 8.0) / ((double)eng->timeused * 1000000.0), eng->timeused ); 2295 #endif 2296 2297 #ifdef CheckRxBuf 2298 if (check_buf(eng, loop_checknum)) 2299 return(1); 2300 #endif 2301 } else { 2302 #ifdef Enable_ShowBW 2303 printf("[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", (eng->run.loop_max % loop_checknum), ((double)(eng->run.loop_max % loop_checknum) * (double)eng->dat.Total_frame_len * 8.0) / ((double)eng->timeused * 1000000.0), eng->timeused); 2304 PRINTF( FP_LOG, "[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", (eng->run.loop_max % loop_checknum), ((double)(eng->run.loop_max % loop_checknum) * (double)eng->dat.Total_frame_len * 8.0) / ((double)eng->timeused * 1000000.0), eng->timeused ); 2305 #endif 2306 2307 #ifdef CheckRxBuf 2308 if (check_buf(eng, (eng->run.loop_max % loop_checknum))) 2309 return(1); 2310 #endif 2311 } // End if ( checkprd ) 2312 2313 #ifndef SelectSimpleDes 2314 if (!looplast) 2315 setup_des_loop(eng, eng->run.loop_cnt); 2316 #endif 2317 2318 #ifdef Enable_ShowBW 2319 timeold = clock(); 2320 #endif 2321 } // End if ( eng->run.TM_RxDataEn && checken ) 2322 2323 #ifdef SelectSimpleDes 2324 if (!looplast) 2325 setup_des_loop(eng, eng->run.loop_cnt); 2326 #endif 2327 2328 if ( eng->arg.loop_inf ) 2329 printf("===============> Loop[%d]: %d \r", eng->run.loop_of_cnt, eng->run.loop_cnt); 2330 else if ( eng->arg.test_mode == 0 ) { 2331 if ( !( DbgPrn_BufAdr || eng->run.delay_margin ) ) 2332 printf(" [%d]%d \r", eng->run.loop_of_cnt, eng->run.loop_cnt); 2333 } 2334 2335 if (DbgPrn_BufAdr) { 2336 printf("for end ======> [%d]%d/%d(%d)\n", 2337 eng->run.loop_of_cnt, eng->run.loop_cnt, 2338 eng->run.loop_max, eng->arg.loop_inf); 2339 debug_pause(); 2340 } 2341 2342 if (eng->run.loop_cnt >= 0x7fffffff) { 2343 debug("loop counter wrapped around\n"); 2344 eng->run.loop_cnt = 0; 2345 eng->run.loop_of_cnt++; 2346 } else 2347 eng->run.loop_cnt++; 2348 } // End while ( ( eng->run.loop_cnt < eng->run.loop_max ) || eng->arg.loop_inf ) 2349 2350 eng->flg.all_fail = 0; 2351 return(0); 2352 } // End char TestingLoop (MAC_ENGINE *eng, uint32_t loop_checknum) 2353