|
47 | 47 | #include <linux/platform_device.h> |
48 | 48 | #include <linux/of_device.h> |
49 | 49 | #include <linux/of_net.h> |
| 50 | +#include <linux/uaccess.h> |
| 51 | +#include <linux/capability.h> |
50 | 52 | #include <asm/io.h> |
51 | 53 |
|
52 | 54 | /* |
@@ -472,56 +474,85 @@ static int ptm_ioctl(struct net_device *dev, struct ifreq *ifr, void __user *dat |
472 | 474 | { |
473 | 475 | int ndev; |
474 | 476 |
|
| 477 | + if (!capable(CAP_NET_ADMIN)) |
| 478 | + return -EPERM; |
| 479 | + |
475 | 480 | for ( ndev = 0; ndev < ARRAY_SIZE(g_net_dev) && g_net_dev[ndev] != dev; ndev++ ); |
476 | 481 | ASSERT(ndev >= 0 && ndev < ARRAY_SIZE(g_net_dev), "ndev = %d (wrong value)", ndev); |
477 | 482 |
|
478 | 483 | switch ( cmd ) |
479 | 484 | { |
480 | 485 | case IFX_PTM_MIB_CW_GET: |
481 | | - ((PTM_CW_IF_ENTRY_T *)data)->ifRxNoIdleCodewords = WAN_MIB_TABLE[ndev].wrx_nonidle_cw; |
482 | | - ((PTM_CW_IF_ENTRY_T *)data)->ifRxIdleCodewords = WAN_MIB_TABLE[ndev].wrx_idle_cw; |
483 | | - ((PTM_CW_IF_ENTRY_T *)data)->ifRxCodingViolation = WAN_MIB_TABLE[ndev].wrx_err_cw; |
484 | | - ((PTM_CW_IF_ENTRY_T *)data)->ifTxNoIdleCodewords = 0; |
485 | | - ((PTM_CW_IF_ENTRY_T *)data)->ifTxIdleCodewords = 0; |
486 | | - break; |
487 | | - case IFX_PTM_MIB_FRAME_GET: |
488 | | - ((PTM_FRAME_MIB_T *)data)->RxCorrect = WAN_MIB_TABLE[ndev].wrx_correct_pdu; |
489 | | - ((PTM_FRAME_MIB_T *)data)->TC_CrcError = WAN_MIB_TABLE[ndev].wrx_tccrc_err_pdu; |
490 | | - ((PTM_FRAME_MIB_T *)data)->RxDropped = WAN_MIB_TABLE[ndev].wrx_nodesc_drop_pdu + WAN_MIB_TABLE[ndev].wrx_len_violation_drop_pdu; |
491 | | - ((PTM_FRAME_MIB_T *)data)->TxSend = WAN_MIB_TABLE[ndev].wtx_total_pdu; |
492 | | - break; |
493 | | - case IFX_PTM_CFG_GET: |
494 | | - ((IFX_PTM_CFG_T *)data)->RxEthCrcPresent = CFG_ETH_EFMTC_CRC->rx_eth_crc_present; |
495 | | - ((IFX_PTM_CFG_T *)data)->RxEthCrcCheck = CFG_ETH_EFMTC_CRC->rx_eth_crc_check; |
496 | | - ((IFX_PTM_CFG_T *)data)->RxTcCrcCheck = CFG_ETH_EFMTC_CRC->rx_tc_crc_check; |
497 | | - ((IFX_PTM_CFG_T *)data)->RxTcCrcLen = CFG_ETH_EFMTC_CRC->rx_tc_crc_len; |
498 | | - ((IFX_PTM_CFG_T *)data)->TxEthCrcGen = CFG_ETH_EFMTC_CRC->tx_eth_crc_gen; |
499 | | - ((IFX_PTM_CFG_T *)data)->TxTcCrcGen = CFG_ETH_EFMTC_CRC->tx_tc_crc_gen; |
500 | | - ((IFX_PTM_CFG_T *)data)->TxTcCrcLen = CFG_ETH_EFMTC_CRC->tx_tc_crc_len; |
501 | | - break; |
502 | | - case IFX_PTM_CFG_SET: |
503 | | - CFG_ETH_EFMTC_CRC->rx_eth_crc_present = ((IFX_PTM_CFG_T *)data)->RxEthCrcPresent ? 1 : 0; |
504 | | - CFG_ETH_EFMTC_CRC->rx_eth_crc_check = ((IFX_PTM_CFG_T *)data)->RxEthCrcCheck ? 1 : 0; |
505 | | - if ( ((IFX_PTM_CFG_T *)data)->RxTcCrcCheck && (((IFX_PTM_CFG_T *)data)->RxTcCrcLen == 16 || ((IFX_PTM_CFG_T *)data)->RxTcCrcLen == 32) ) |
506 | 486 | { |
507 | | - CFG_ETH_EFMTC_CRC->rx_tc_crc_check = 1; |
508 | | - CFG_ETH_EFMTC_CRC->rx_tc_crc_len = ((IFX_PTM_CFG_T *)data)->RxTcCrcLen; |
| 487 | + PTM_CW_IF_ENTRY_T tmp = {0}; |
| 488 | + |
| 489 | + tmp.ifRxNoIdleCodewords = WAN_MIB_TABLE[ndev].wrx_nonidle_cw; |
| 490 | + tmp.ifRxIdleCodewords = WAN_MIB_TABLE[ndev].wrx_idle_cw; |
| 491 | + tmp.ifRxCodingViolation = WAN_MIB_TABLE[ndev].wrx_err_cw; |
| 492 | + tmp.ifTxNoIdleCodewords = 0; |
| 493 | + tmp.ifTxIdleCodewords = 0; |
| 494 | + |
| 495 | + if (copy_to_user(data, &tmp, sizeof(tmp))) |
| 496 | + return -EFAULT; |
509 | 497 | } |
510 | | - else |
| 498 | + break; |
| 499 | + case IFX_PTM_MIB_FRAME_GET: |
511 | 500 | { |
512 | | - CFG_ETH_EFMTC_CRC->rx_tc_crc_check = 0; |
513 | | - CFG_ETH_EFMTC_CRC->rx_tc_crc_len = 0; |
| 501 | + PTM_FRAME_MIB_T tmp = {0}; |
| 502 | + |
| 503 | + tmp.RxCorrect = WAN_MIB_TABLE[ndev].wrx_correct_pdu; |
| 504 | + tmp.TC_CrcError = WAN_MIB_TABLE[ndev].wrx_tccrc_err_pdu; |
| 505 | + tmp.RxDropped = WAN_MIB_TABLE[ndev].wrx_nodesc_drop_pdu + WAN_MIB_TABLE[ndev].wrx_len_violation_drop_pdu; |
| 506 | + tmp.TxSend = WAN_MIB_TABLE[ndev].wtx_total_pdu; |
| 507 | + if (copy_to_user(data, &tmp, sizeof(tmp))) |
| 508 | + return -EFAULT; |
514 | 509 | } |
515 | | - CFG_ETH_EFMTC_CRC->tx_eth_crc_gen = ((IFX_PTM_CFG_T *)data)->TxEthCrcGen ? 1 : 0; |
516 | | - if ( ((IFX_PTM_CFG_T *)data)->TxTcCrcGen && (((IFX_PTM_CFG_T *)data)->TxTcCrcLen == 16 || ((IFX_PTM_CFG_T *)data)->TxTcCrcLen == 32) ) |
| 510 | + break; |
| 511 | + case IFX_PTM_CFG_GET: |
517 | 512 | { |
518 | | - CFG_ETH_EFMTC_CRC->tx_tc_crc_gen = 1; |
519 | | - CFG_ETH_EFMTC_CRC->tx_tc_crc_len = ((IFX_PTM_CFG_T *)data)->TxTcCrcLen; |
| 513 | + IFX_PTM_CFG_T tmp = {0}; |
| 514 | + |
| 515 | + tmp.RxEthCrcPresent = CFG_ETH_EFMTC_CRC->rx_eth_crc_present; |
| 516 | + tmp.RxEthCrcCheck = CFG_ETH_EFMTC_CRC->rx_eth_crc_check; |
| 517 | + tmp.RxTcCrcCheck = CFG_ETH_EFMTC_CRC->rx_tc_crc_check; |
| 518 | + tmp.RxTcCrcLen = CFG_ETH_EFMTC_CRC->rx_tc_crc_len; |
| 519 | + tmp.TxEthCrcGen = CFG_ETH_EFMTC_CRC->tx_eth_crc_gen; |
| 520 | + tmp.TxTcCrcGen = CFG_ETH_EFMTC_CRC->tx_tc_crc_gen; |
| 521 | + tmp.TxTcCrcLen = CFG_ETH_EFMTC_CRC->tx_tc_crc_len; |
| 522 | + if (copy_to_user(data, &tmp, sizeof(tmp))) |
| 523 | + return -EFAULT; |
520 | 524 | } |
521 | | - else |
| 525 | + break; |
| 526 | + case IFX_PTM_CFG_SET: |
522 | 527 | { |
523 | | - CFG_ETH_EFMTC_CRC->tx_tc_crc_gen = 0; |
524 | | - CFG_ETH_EFMTC_CRC->tx_tc_crc_len = 0; |
| 528 | + IFX_PTM_CFG_T cfg = {0}; |
| 529 | + |
| 530 | + if (copy_from_user(&cfg, data, sizeof(cfg))) |
| 531 | + return -EFAULT; |
| 532 | + |
| 533 | + CFG_ETH_EFMTC_CRC->rx_eth_crc_present = cfg.RxEthCrcPresent ? 1 : 0; |
| 534 | + CFG_ETH_EFMTC_CRC->rx_eth_crc_check = cfg.RxEthCrcCheck ? 1 : 0; |
| 535 | + if ( cfg.RxTcCrcCheck && (cfg.RxTcCrcLen == 16 || cfg.RxTcCrcLen == 32) ) |
| 536 | + { |
| 537 | + CFG_ETH_EFMTC_CRC->rx_tc_crc_check = 1; |
| 538 | + CFG_ETH_EFMTC_CRC->rx_tc_crc_len = cfg.RxTcCrcLen; |
| 539 | + } |
| 540 | + else |
| 541 | + { |
| 542 | + CFG_ETH_EFMTC_CRC->rx_tc_crc_check = 0; |
| 543 | + CFG_ETH_EFMTC_CRC->rx_tc_crc_len = 0; |
| 544 | + } |
| 545 | + CFG_ETH_EFMTC_CRC->tx_eth_crc_gen = cfg.TxEthCrcGen ? 1 : 0; |
| 546 | + if ( cfg.TxTcCrcGen && (cfg.TxTcCrcLen == 16 || cfg.TxTcCrcLen == 32) ) |
| 547 | + { |
| 548 | + CFG_ETH_EFMTC_CRC->tx_tc_crc_gen = 1; |
| 549 | + CFG_ETH_EFMTC_CRC->tx_tc_crc_len = cfg.TxTcCrcLen; |
| 550 | + } |
| 551 | + else |
| 552 | + { |
| 553 | + CFG_ETH_EFMTC_CRC->tx_tc_crc_gen = 0; |
| 554 | + CFG_ETH_EFMTC_CRC->tx_tc_crc_len = 0; |
| 555 | + } |
525 | 556 | } |
526 | 557 | break; |
527 | 558 | default: |
|
0 commit comments