summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_drv.c12
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c109
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_ptp.c4
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h5
4 files changed, 81 insertions, 49 deletions
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_drv.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_drv.c
index c467561..0a84972 100644
--- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_drv.c
+++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_drv.c
@@ -4961,11 +4961,11 @@ static VOID DWC_ETH_QOS_config_timer_registers(
DBGPR("-->DWC_ETH_QOS_config_timer_registers\n");
- pdata->ptpclk_freq = DWC_ETH_QOS_DEFAULT_PTP_CLOCK;
+ pdata->ptpclk_freq = pdata->default_ptp_clock;
/* program default addend */
- hw_if->config_default_addend(pdata, DWC_ETH_QOS_DEFAULT_PTP_CLOCK);
+ hw_if->config_default_addend(pdata, pdata->default_ptp_clock);
/* program Sub Second Increment Reg */
- hw_if->config_sub_second_increment(DWC_ETH_QOS_DEFAULT_PTP_CLOCK);
+ hw_if->config_sub_second_increment(pdata->default_ptp_clock);
/* initialize system time */
getnstimeofday(&now);
hw_if->init_systime(now.tv_sec, now.tv_nsec);
@@ -5269,7 +5269,7 @@ int ETH_PPSOUT_Config(struct DWC_ETH_QOS_prv_data *pdata, struct ifr_data_struct
will change & We will not see 19.2Mhz for PPS0.
*/
if (pdata->res_data->pps_lpass_conn_en ) {
- eth_pps_cfg->ptpclk_freq = DWC_ETH_QOS_DEFAULT_PTP_CLOCK;
+ eth_pps_cfg->ptpclk_freq = pdata->default_ptp_clock;
EMACDBG("using default ptp clock \n");
}
@@ -6040,10 +6040,10 @@ static int DWC_ETH_QOS_handle_hwtstamp_ioctl(struct DWC_ETH_QOS_prv_data *pdata,
hw_if->config_hw_time_stamping(VARMAC_TCR);
/* program default addend */
- hw_if->config_default_addend(pdata, DWC_ETH_QOS_DEFAULT_PTP_CLOCK);
+ hw_if->config_default_addend(pdata, pdata->default_ptp_clock);
/* program Sub Second Increment Reg */
- hw_if->config_sub_second_increment(DWC_ETH_QOS_DEFAULT_PTP_CLOCK);
+ hw_if->config_sub_second_increment(pdata->default_ptp_clock);
/* initialize system time */
getnstimeofday(&now);
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c
index 32b6a57..253bf35 100644
--- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c
+++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c
@@ -51,10 +51,13 @@
void *ipc_emac_log_ctxt;
-static UCHAR dev_addr[6] = {0, 0x55, 0x7b, 0xb5, 0x7d, 0xf7};
+#define MAC_ADDR_CFG_FPATH "/data/emac_config.ini"
+static UCHAR dev_addr[ETH_ALEN] = {0, 0x55, 0x7b, 0xb5, 0x7d, 0xf7};
struct DWC_ETH_QOS_res_data dwc_eth_qos_res_data = {0, };
static struct msm_bus_scale_pdata *emac_bus_scale_vec = NULL;
+UCHAR config_dev_addr[ETH_ALEN];
+
ULONG dwc_eth_qos_base_addr;
ULONG dwc_rgmii_io_csr_base_addr;
struct DWC_ETH_QOS_prv_data *gDWC_ETH_QOS_prv_data;
@@ -89,38 +92,6 @@ MODULE_PARM_DESC(phy_interrupt_en,
struct ip_params pparams = {};
#ifdef DWC_ETH_QOS_BUILTIN
-/*!
- * \brief API to extract MAC Address from given string
- *
- * \param[in] pointer to MAC Address string
- *
- * \return None
- */
-void DWC_ETH_QOS_extract_macid(char *mac_addr)
-{
- char *input = NULL;
- int i = 0;
- UCHAR mac_id = 0;
-
- if (!mac_addr)
- return;
-
- /* Extract MAC ID byte by byte */
- input = strsep(&mac_addr, ":");
- while(input != NULL && i < DWC_ETH_QOS_MAC_ADDR_LEN) {
- sscanf(input, "%x", &mac_id);
- pparams.mac_addr[i++] = mac_id;
- input = strsep(&mac_addr, ":");
- }
- if (!is_valid_ether_addr(pparams.mac_addr)) {
- EMACERR("Invalid Mac address programmed: %s\n", mac_addr);
- return;
- } else
- pparams.is_valid_mac_addr = true;
-
- return;
-}
-
static int __init set_early_ethernet_ipv4(char *ipv4_addr_in)
{
int ret = 1;
@@ -170,17 +141,25 @@ __setup("eipv6=", set_early_ethernet_ipv6);
static int __init set_early_ethernet_mac(char* mac_addr)
{
int ret = 1;
- char temp_mac_addr[DWC_ETH_QOS_MAC_ADDR_STR_LEN];
- pparams.is_valid_mac_addr = false;
+ bool valid_mac = false;
+ pparams.is_valid_mac_addr = false;
if(!mac_addr)
return ret;
- strlcpy(temp_mac_addr, mac_addr, sizeof(temp_mac_addr));
- EMACDBG("Early ethernet MAC address assigned: %s\n", temp_mac_addr);
- temp_mac_addr[DWC_ETH_QOS_MAC_ADDR_STR_LEN-1] = '\0';
+ valid_mac = mac_pton(mac_addr, pparams.mac_addr);
+ if(!valid_mac)
+ goto fail;
+
+ valid_mac = is_valid_ether_addr(pparams.mac_addr);
+ if (!valid_mac)
+ goto fail;
+
+ pparams.is_valid_mac_addr = true;
+ return ret;
- DWC_ETH_QOS_extract_macid(temp_mac_addr);
+fail:
+ EMACERR("Invalid Mac address programmed: %s\n", mac_addr);
return ret;
}
__setup("ermac=", set_early_ethernet_mac);
@@ -1616,6 +1595,47 @@ u32 l3mdev_fib_table1 (const struct net_device *dev)
const struct l3mdev_ops l3mdev_op1 = {.l3mdev_fib_table = l3mdev_fib_table1};
+/*!
+ * \brief Parse the config file to obtain the MAC address
+ *
+ * \param[in] None
+ *
+ * \return None
+ *
+ */
+
+static void DWC_ETH_QOS_read_mac_addr_from_config(void)
+{
+ int ret = -ENOENT;
+ void *data = NULL;
+ char *file_path = MAC_ADDR_CFG_FPATH;
+ loff_t size = 0;
+ loff_t max_size = 30;
+
+ EMACDBG("Enter\n");
+
+ ret = kernel_read_file_from_path(file_path, &data, &size,
+ max_size, READING_POLICY);
+
+ if (ret < 0) {
+ EMACINFO("unable to open file: %s (%d)\n", file_path, ret);
+ goto ret;
+ }
+
+ if (!mac_pton(data, config_dev_addr) && !is_valid_ether_addr(config_dev_addr)) {
+ EMACERR("Invalid mac addr found in emac_config.ini\n");
+ goto ret;
+ }
+
+ EMACDBG("mac address read from config.ini successfully\n");
+ ether_addr_copy(dev_addr, config_dev_addr);
+
+ret:
+ if (data)
+ vfree(data);
+ return;
+}
+
static int DWC_ETH_QOS_configure_netdevice(struct platform_device *pdev)
{
struct DWC_ETH_QOS_prv_data *pdata = NULL;
@@ -1641,6 +1661,8 @@ static int DWC_ETH_QOS_configure_netdevice(struct platform_device *pdev)
if (pparams.is_valid_mac_addr == true)
ether_addr_copy(dev_addr, pparams.mac_addr);
+ else
+ DWC_ETH_QOS_read_mac_addr_from_config();
dev->dev_addr[0] = dev_addr[0];
dev->dev_addr[1] = dev_addr[1];
@@ -1819,10 +1841,17 @@ static int DWC_ETH_QOS_configure_netdevice(struct platform_device *pdev)
DWC_ETH_QOS_init_rx_coalesce(pdata);
+ if (dwc_eth_qos_res_data.emac_hw_version_type == EMAC_HW_v2_2_0 )
+ pdata->default_ptp_clock = DWC_ETH_QOS_PTP_CLOCK_57_6;
+ else if (dwc_eth_qos_res_data.emac_hw_version_type == EMAC_HW_v2_1_2 || dwc_eth_qos_res_data.emac_hw_version_type == EMAC_HW_v2_3_1)
+ pdata->default_ptp_clock = DWC_ETH_QOS_PTP_CLOCK_96;
+ else if (dwc_eth_qos_res_data.emac_hw_version_type == EMAC_HW_v2_3_2 )
+ pdata->default_ptp_clock = DWC_ETH_QOS_PTP_CLOCK_62_5;
+
#ifdef DWC_ETH_QOS_CONFIG_PTP
DWC_ETH_QOS_ptp_init(pdata);
/*default ptp clock frequency set to 50Mhz*/
- pdata->ptpclk_freq = DWC_ETH_QOS_DEFAULT_PTP_CLOCK;
+ pdata->ptpclk_freq = pdata->default_ptp_clock;
#endif /* end of DWC_ETH_QOS_CONFIG_PTP */
#endif /* end of DWC_ETH_QOS_CONFIG_PGTEST */
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_ptp.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_ptp.c
index 1bcead3..2f40f55 100644
--- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_ptp.c
+++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_ptp.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -318,7 +318,7 @@ int DWC_ETH_QOS_ptp_init(struct DWC_ETH_QOS_prv_data *pdata)
if (pdata->res_data->pps_lpass_conn_en) {
/*Configuring PPS0 PPS output frequency to defualt 19.2 Mhz*/
eth_pps_cfg.ppsout_ch = 0;
- eth_pps_cfg.ptpclk_freq = DWC_ETH_QOS_DEFAULT_PTP_CLOCK;
+ eth_pps_cfg.ptpclk_freq = pdata->default_ptp_clock;
eth_pps_cfg.ppsout_freq = DWC_ETH_QOS_DEFAULT_LPASS_PPS_FREQUENCY;
eth_pps_cfg.ppsout_start = 1;
eth_pps_cfg.ppsout_duty = 50;
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h b/drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h
index b0a1210..22ad45a 100644
--- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h
+++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h
@@ -427,7 +427,9 @@ extern void *ipc_emac_log_ctxt;
#define DWC_ETH_QOS_SYSCLOCK 250000000 /* System clock is 250MHz */
#define DWC_ETH_QOS_SYSTIMEPERIOD 4 /* System time period is 4ns */
-#define DWC_ETH_QOS_DEFAULT_PTP_CLOCK 96000000
+#define DWC_ETH_QOS_PTP_CLOCK_57_6 57600000
+#define DWC_ETH_QOS_PTP_CLOCK_62_5 62500000
+#define DWC_ETH_QOS_PTP_CLOCK_96 96000000
#define DWC_ETH_QOS_DEFAULT_LPASS_PPS_FREQUENCY 19200000
#define DWC_ETH_QOS_TX_QUEUE_CNT (pdata->tx_queue_cnt)
@@ -1879,6 +1881,7 @@ struct DWC_ETH_QOS_prv_data {
struct class* avb_class_b_class;
struct delayed_work ipv6_addr_assign_wq;
bool print_kpi;
+ unsigned long default_ptp_clock;
bool wol_enabled;
};