| .. | .. |
|---|
| 261 | 261 | * |
|---|
| 262 | 262 | * Returns Link state |
|---|
| 263 | 263 | */ |
|---|
| 264 | | -cvmx_helper_link_info_t __cvmx_helper_rgmii_link_get(int ipd_port) |
|---|
| 264 | +union cvmx_helper_link_info __cvmx_helper_rgmii_link_get(int ipd_port) |
|---|
| 265 | 265 | { |
|---|
| 266 | 266 | int interface = cvmx_helper_get_interface_num(ipd_port); |
|---|
| 267 | 267 | int index = cvmx_helper_get_interface_index_num(ipd_port); |
|---|
| .. | .. |
|---|
| 270 | 270 | asxx_prt_loop.u64 = cvmx_read_csr(CVMX_ASXX_PRT_LOOP(interface)); |
|---|
| 271 | 271 | if (asxx_prt_loop.s.int_loop & (1 << index)) { |
|---|
| 272 | 272 | /* Force 1Gbps full duplex on internal loopback */ |
|---|
| 273 | | - cvmx_helper_link_info_t result; |
|---|
| 273 | + union cvmx_helper_link_info result; |
|---|
| 274 | 274 | result.u64 = 0; |
|---|
| 275 | 275 | result.s.full_duplex = 1; |
|---|
| 276 | 276 | result.s.link_up = 1; |
|---|
| .. | .. |
|---|
| 292 | 292 | * Returns Zero on success, negative on failure |
|---|
| 293 | 293 | */ |
|---|
| 294 | 294 | int __cvmx_helper_rgmii_link_set(int ipd_port, |
|---|
| 295 | | - cvmx_helper_link_info_t link_info) |
|---|
| 295 | + union cvmx_helper_link_info link_info) |
|---|
| 296 | 296 | { |
|---|
| 297 | 297 | int result = 0; |
|---|
| 298 | 298 | int interface = cvmx_helper_get_interface_num(ipd_port); |
|---|
| .. | .. |
|---|
| 448 | 448 | cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), new_gmx_cfg.u64); |
|---|
| 449 | 449 | |
|---|
| 450 | 450 | return result; |
|---|
| 451 | | -} |
|---|
| 452 | | - |
|---|
| 453 | | -/** |
|---|
| 454 | | - * Configure a port for internal and/or external loopback. Internal loopback |
|---|
| 455 | | - * causes packets sent by the port to be received by Octeon. External loopback |
|---|
| 456 | | - * causes packets received from the wire to sent out again. |
|---|
| 457 | | - * |
|---|
| 458 | | - * @ipd_port: IPD/PKO port to loopback. |
|---|
| 459 | | - * @enable_internal: |
|---|
| 460 | | - * Non zero if you want internal loopback |
|---|
| 461 | | - * @enable_external: |
|---|
| 462 | | - * Non zero if you want external loopback |
|---|
| 463 | | - * |
|---|
| 464 | | - * Returns Zero on success, negative on failure. |
|---|
| 465 | | - */ |
|---|
| 466 | | -int __cvmx_helper_rgmii_configure_loopback(int ipd_port, int enable_internal, |
|---|
| 467 | | - int enable_external) |
|---|
| 468 | | -{ |
|---|
| 469 | | - int interface = cvmx_helper_get_interface_num(ipd_port); |
|---|
| 470 | | - int index = cvmx_helper_get_interface_index_num(ipd_port); |
|---|
| 471 | | - int original_enable; |
|---|
| 472 | | - union cvmx_gmxx_prtx_cfg gmx_cfg; |
|---|
| 473 | | - union cvmx_asxx_prt_loop asxx_prt_loop; |
|---|
| 474 | | - |
|---|
| 475 | | - /* Read the current enable state and save it */ |
|---|
| 476 | | - gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface)); |
|---|
| 477 | | - original_enable = gmx_cfg.s.en; |
|---|
| 478 | | - /* Force port to be disabled */ |
|---|
| 479 | | - gmx_cfg.s.en = 0; |
|---|
| 480 | | - if (enable_internal) { |
|---|
| 481 | | - /* Force speed if we're doing internal loopback */ |
|---|
| 482 | | - gmx_cfg.s.duplex = 1; |
|---|
| 483 | | - gmx_cfg.s.slottime = 1; |
|---|
| 484 | | - gmx_cfg.s.speed = 1; |
|---|
| 485 | | - cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 1); |
|---|
| 486 | | - cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x200); |
|---|
| 487 | | - cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0x2000); |
|---|
| 488 | | - } |
|---|
| 489 | | - cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64); |
|---|
| 490 | | - |
|---|
| 491 | | - /* Set the loopback bits */ |
|---|
| 492 | | - asxx_prt_loop.u64 = cvmx_read_csr(CVMX_ASXX_PRT_LOOP(interface)); |
|---|
| 493 | | - if (enable_internal) |
|---|
| 494 | | - asxx_prt_loop.s.int_loop |= 1 << index; |
|---|
| 495 | | - else |
|---|
| 496 | | - asxx_prt_loop.s.int_loop &= ~(1 << index); |
|---|
| 497 | | - if (enable_external) |
|---|
| 498 | | - asxx_prt_loop.s.ext_loop |= 1 << index; |
|---|
| 499 | | - else |
|---|
| 500 | | - asxx_prt_loop.s.ext_loop &= ~(1 << index); |
|---|
| 501 | | - cvmx_write_csr(CVMX_ASXX_PRT_LOOP(interface), asxx_prt_loop.u64); |
|---|
| 502 | | - |
|---|
| 503 | | - /* Force enables in internal loopback */ |
|---|
| 504 | | - if (enable_internal) { |
|---|
| 505 | | - uint64_t tmp; |
|---|
| 506 | | - tmp = cvmx_read_csr(CVMX_ASXX_TX_PRT_EN(interface)); |
|---|
| 507 | | - cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(interface), |
|---|
| 508 | | - (1 << index) | tmp); |
|---|
| 509 | | - tmp = cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(interface)); |
|---|
| 510 | | - cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface), |
|---|
| 511 | | - (1 << index) | tmp); |
|---|
| 512 | | - original_enable = 1; |
|---|
| 513 | | - } |
|---|
| 514 | | - |
|---|
| 515 | | - /* Restore the enable state */ |
|---|
| 516 | | - gmx_cfg.s.en = original_enable; |
|---|
| 517 | | - cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64); |
|---|
| 518 | | - return 0; |
|---|
| 519 | 451 | } |
|---|