Merge branch 'LA.UM.9.1.R1.10.00.00.604.038' via branch 'qcom-msm-4.14' into android-msm-pixel-4.14

 Conflicts:
	drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h
	drivers/rmnet/shs/rmnet_shs_wq.c

Bug: 155859424
Signed-off-by: Wilson Sung <wilsonsung@google.com>
Change-Id: Ia233ce675f3ffea5de23e0e146199f9da937abd4
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_drv.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_drv.c
index fda72a8..9fc79e7 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 @@
 
 		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 @@
 	   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 @@
 		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 @@
 
 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 @@
 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;
 
-	DWC_ETH_QOS_extract_macid(temp_mac_addr);
+	valid_mac = is_valid_ether_addr(pparams.mac_addr);
+	if (!valid_mac)
+		goto fail;
+
+	pparams.is_valid_mac_addr = true;
+	return ret;
+
+fail:
+	EMACERR("Invalid Mac address programmed: %s\n", mac_addr);
 	return ret;
 }
 __setup("ermac=", set_early_ethernet_mac);
@@ -1616,6 +1595,47 @@
 
 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 @@
 
 	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 @@
 
 	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 @@
 	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 @@
 #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 class* avb_class_b_class;
 	struct delayed_work ipv6_addr_assign_wq;
 	bool print_kpi;
+	unsigned long default_ptp_clock;
 	bool wol_enabled;
 };
 
diff --git a/drivers/rmnet/shs/rmnet_shs_wq.c b/drivers/rmnet/shs/rmnet_shs_wq.c
index 53f5826..73abb28 100644
--- a/drivers/rmnet/shs/rmnet_shs_wq.c
+++ b/drivers/rmnet/shs/rmnet_shs_wq.c
@@ -2043,8 +2043,11 @@
         rmnet_shs_wq_cleanup_hash_tbl(PERIODIC_CLEAN);
         rmnet_shs_wq_debug_print_flows();
 
+<<<<<<< HEAD
+=======
 	jiffies = msecs_to_jiffies(rmnet_shs_wq_interval_ms);
 
+>>>>>>> LA.UM.9.1.R1.10.00.00.604.038
 	queue_delayed_work(rmnet_shs_wq, &rmnet_shs_delayed_wq->wq,
 			   jiffies);