|
|
@@ -47,6 +47,8 @@
|
|
|
#include <linux/platform_device.h>
|
|
|
#include <linux/of_device.h>
|
|
|
#include <linux/of_net.h>
|
|
|
+#include <linux/uaccess.h>
|
|
|
+#include <linux/capability.h>
|
|
|
#include <asm/io.h>
|
|
|
|
|
|
/*
|
|
|
@@ -472,56 +474,85 @@ static int ptm_ioctl(struct net_device *dev, struct ifreq *ifr, void __user *dat
|
|
|
{
|
|
|
int ndev;
|
|
|
|
|
|
+ if (!capable(CAP_NET_ADMIN))
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
for ( ndev = 0; ndev < ARRAY_SIZE(g_net_dev) && g_net_dev[ndev] != dev; ndev++ );
|
|
|
ASSERT(ndev >= 0 && ndev < ARRAY_SIZE(g_net_dev), "ndev = %d (wrong value)", ndev);
|
|
|
|
|
|
switch ( cmd )
|
|
|
{
|
|
|
case IFX_PTM_MIB_CW_GET:
|
|
|
- ((PTM_CW_IF_ENTRY_T *)data)->ifRxNoIdleCodewords = WAN_MIB_TABLE[ndev].wrx_nonidle_cw;
|
|
|
- ((PTM_CW_IF_ENTRY_T *)data)->ifRxIdleCodewords = WAN_MIB_TABLE[ndev].wrx_idle_cw;
|
|
|
- ((PTM_CW_IF_ENTRY_T *)data)->ifRxCodingViolation = WAN_MIB_TABLE[ndev].wrx_err_cw;
|
|
|
- ((PTM_CW_IF_ENTRY_T *)data)->ifTxNoIdleCodewords = 0;
|
|
|
- ((PTM_CW_IF_ENTRY_T *)data)->ifTxIdleCodewords = 0;
|
|
|
- break;
|
|
|
- case IFX_PTM_MIB_FRAME_GET:
|
|
|
- ((PTM_FRAME_MIB_T *)data)->RxCorrect = WAN_MIB_TABLE[ndev].wrx_correct_pdu;
|
|
|
- ((PTM_FRAME_MIB_T *)data)->TC_CrcError = WAN_MIB_TABLE[ndev].wrx_tccrc_err_pdu;
|
|
|
- ((PTM_FRAME_MIB_T *)data)->RxDropped = WAN_MIB_TABLE[ndev].wrx_nodesc_drop_pdu + WAN_MIB_TABLE[ndev].wrx_len_violation_drop_pdu;
|
|
|
- ((PTM_FRAME_MIB_T *)data)->TxSend = WAN_MIB_TABLE[ndev].wtx_total_pdu;
|
|
|
- break;
|
|
|
- case IFX_PTM_CFG_GET:
|
|
|
- ((IFX_PTM_CFG_T *)data)->RxEthCrcPresent = CFG_ETH_EFMTC_CRC->rx_eth_crc_present;
|
|
|
- ((IFX_PTM_CFG_T *)data)->RxEthCrcCheck = CFG_ETH_EFMTC_CRC->rx_eth_crc_check;
|
|
|
- ((IFX_PTM_CFG_T *)data)->RxTcCrcCheck = CFG_ETH_EFMTC_CRC->rx_tc_crc_check;
|
|
|
- ((IFX_PTM_CFG_T *)data)->RxTcCrcLen = CFG_ETH_EFMTC_CRC->rx_tc_crc_len;
|
|
|
- ((IFX_PTM_CFG_T *)data)->TxEthCrcGen = CFG_ETH_EFMTC_CRC->tx_eth_crc_gen;
|
|
|
- ((IFX_PTM_CFG_T *)data)->TxTcCrcGen = CFG_ETH_EFMTC_CRC->tx_tc_crc_gen;
|
|
|
- ((IFX_PTM_CFG_T *)data)->TxTcCrcLen = CFG_ETH_EFMTC_CRC->tx_tc_crc_len;
|
|
|
- break;
|
|
|
- case IFX_PTM_CFG_SET:
|
|
|
- CFG_ETH_EFMTC_CRC->rx_eth_crc_present = ((IFX_PTM_CFG_T *)data)->RxEthCrcPresent ? 1 : 0;
|
|
|
- CFG_ETH_EFMTC_CRC->rx_eth_crc_check = ((IFX_PTM_CFG_T *)data)->RxEthCrcCheck ? 1 : 0;
|
|
|
- if ( ((IFX_PTM_CFG_T *)data)->RxTcCrcCheck && (((IFX_PTM_CFG_T *)data)->RxTcCrcLen == 16 || ((IFX_PTM_CFG_T *)data)->RxTcCrcLen == 32) )
|
|
|
{
|
|
|
- CFG_ETH_EFMTC_CRC->rx_tc_crc_check = 1;
|
|
|
- CFG_ETH_EFMTC_CRC->rx_tc_crc_len = ((IFX_PTM_CFG_T *)data)->RxTcCrcLen;
|
|
|
+ PTM_CW_IF_ENTRY_T tmp = {0};
|
|
|
+
|
|
|
+ tmp.ifRxNoIdleCodewords = WAN_MIB_TABLE[ndev].wrx_nonidle_cw;
|
|
|
+ tmp.ifRxIdleCodewords = WAN_MIB_TABLE[ndev].wrx_idle_cw;
|
|
|
+ tmp.ifRxCodingViolation = WAN_MIB_TABLE[ndev].wrx_err_cw;
|
|
|
+ tmp.ifTxNoIdleCodewords = 0;
|
|
|
+ tmp.ifTxIdleCodewords = 0;
|
|
|
+
|
|
|
+ if (copy_to_user(data, &tmp, sizeof(tmp)))
|
|
|
+ return -EFAULT;
|
|
|
}
|
|
|
- else
|
|
|
+ break;
|
|
|
+ case IFX_PTM_MIB_FRAME_GET:
|
|
|
{
|
|
|
- CFG_ETH_EFMTC_CRC->rx_tc_crc_check = 0;
|
|
|
- CFG_ETH_EFMTC_CRC->rx_tc_crc_len = 0;
|
|
|
+ PTM_FRAME_MIB_T tmp = {0};
|
|
|
+
|
|
|
+ tmp.RxCorrect = WAN_MIB_TABLE[ndev].wrx_correct_pdu;
|
|
|
+ tmp.TC_CrcError = WAN_MIB_TABLE[ndev].wrx_tccrc_err_pdu;
|
|
|
+ tmp.RxDropped = WAN_MIB_TABLE[ndev].wrx_nodesc_drop_pdu + WAN_MIB_TABLE[ndev].wrx_len_violation_drop_pdu;
|
|
|
+ tmp.TxSend = WAN_MIB_TABLE[ndev].wtx_total_pdu;
|
|
|
+ if (copy_to_user(data, &tmp, sizeof(tmp)))
|
|
|
+ return -EFAULT;
|
|
|
}
|
|
|
- CFG_ETH_EFMTC_CRC->tx_eth_crc_gen = ((IFX_PTM_CFG_T *)data)->TxEthCrcGen ? 1 : 0;
|
|
|
- if ( ((IFX_PTM_CFG_T *)data)->TxTcCrcGen && (((IFX_PTM_CFG_T *)data)->TxTcCrcLen == 16 || ((IFX_PTM_CFG_T *)data)->TxTcCrcLen == 32) )
|
|
|
+ break;
|
|
|
+ case IFX_PTM_CFG_GET:
|
|
|
{
|
|
|
- CFG_ETH_EFMTC_CRC->tx_tc_crc_gen = 1;
|
|
|
- CFG_ETH_EFMTC_CRC->tx_tc_crc_len = ((IFX_PTM_CFG_T *)data)->TxTcCrcLen;
|
|
|
+ IFX_PTM_CFG_T tmp = {0};
|
|
|
+
|
|
|
+ tmp.RxEthCrcPresent = CFG_ETH_EFMTC_CRC->rx_eth_crc_present;
|
|
|
+ tmp.RxEthCrcCheck = CFG_ETH_EFMTC_CRC->rx_eth_crc_check;
|
|
|
+ tmp.RxTcCrcCheck = CFG_ETH_EFMTC_CRC->rx_tc_crc_check;
|
|
|
+ tmp.RxTcCrcLen = CFG_ETH_EFMTC_CRC->rx_tc_crc_len;
|
|
|
+ tmp.TxEthCrcGen = CFG_ETH_EFMTC_CRC->tx_eth_crc_gen;
|
|
|
+ tmp.TxTcCrcGen = CFG_ETH_EFMTC_CRC->tx_tc_crc_gen;
|
|
|
+ tmp.TxTcCrcLen = CFG_ETH_EFMTC_CRC->tx_tc_crc_len;
|
|
|
+ if (copy_to_user(data, &tmp, sizeof(tmp)))
|
|
|
+ return -EFAULT;
|
|
|
}
|
|
|
- else
|
|
|
+ break;
|
|
|
+ case IFX_PTM_CFG_SET:
|
|
|
{
|
|
|
- CFG_ETH_EFMTC_CRC->tx_tc_crc_gen = 0;
|
|
|
- CFG_ETH_EFMTC_CRC->tx_tc_crc_len = 0;
|
|
|
+ IFX_PTM_CFG_T cfg = {0};
|
|
|
+
|
|
|
+ if (copy_from_user(&cfg, data, sizeof(cfg)))
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
+ CFG_ETH_EFMTC_CRC->rx_eth_crc_present = cfg.RxEthCrcPresent ? 1 : 0;
|
|
|
+ CFG_ETH_EFMTC_CRC->rx_eth_crc_check = cfg.RxEthCrcCheck ? 1 : 0;
|
|
|
+ if ( cfg.RxTcCrcCheck && (cfg.RxTcCrcLen == 16 || cfg.RxTcCrcLen == 32) )
|
|
|
+ {
|
|
|
+ CFG_ETH_EFMTC_CRC->rx_tc_crc_check = 1;
|
|
|
+ CFG_ETH_EFMTC_CRC->rx_tc_crc_len = cfg.RxTcCrcLen;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ CFG_ETH_EFMTC_CRC->rx_tc_crc_check = 0;
|
|
|
+ CFG_ETH_EFMTC_CRC->rx_tc_crc_len = 0;
|
|
|
+ }
|
|
|
+ CFG_ETH_EFMTC_CRC->tx_eth_crc_gen = cfg.TxEthCrcGen ? 1 : 0;
|
|
|
+ if ( cfg.TxTcCrcGen && (cfg.TxTcCrcLen == 16 || cfg.TxTcCrcLen == 32) )
|
|
|
+ {
|
|
|
+ CFG_ETH_EFMTC_CRC->tx_tc_crc_gen = 1;
|
|
|
+ CFG_ETH_EFMTC_CRC->tx_tc_crc_len = cfg.TxTcCrcLen;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ CFG_ETH_EFMTC_CRC->tx_tc_crc_gen = 0;
|
|
|
+ CFG_ETH_EFMTC_CRC->tx_tc_crc_len = 0;
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
default:
|