diff options
-rw-r--r-- | drivers/emac-dwc-eqos/DWC_ETH_QOS_drv.c | 12 | ||||
-rw-r--r-- | drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c | 109 | ||||
-rw-r--r-- | drivers/emac-dwc-eqos/DWC_ETH_QOS_ptp.c | 4 | ||||
-rw-r--r-- | drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h | 8 | ||||
-rw-r--r-- | drivers/rmnet/shs/rmnet_shs_wq.c | 12 |
5 files changed, 96 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 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 @@ 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..e69b07e 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,10 @@ struct DWC_ETH_QOS_prv_data { struct class* avb_class_b_class; struct delayed_work ipv6_addr_assign_wq; bool print_kpi; +<<<<<<< HEAD + unsigned long default_ptp_clock; +======= +>>>>>>> LA.UM.9.1.R1.10.00.00.604.030 bool wol_enabled; }; diff --git a/drivers/rmnet/shs/rmnet_shs_wq.c b/drivers/rmnet/shs/rmnet_shs_wq.c index 07566a2..4f9e4c5 100644 --- a/drivers/rmnet/shs/rmnet_shs_wq.c +++ b/drivers/rmnet/shs/rmnet_shs_wq.c @@ -2027,7 +2027,16 @@ void rmnet_shs_wq_update_stats(void) } rmnet_shs_wq_refresh_new_flow_list(); +<<<<<<< HEAD +<<<<<<< HEAD +======= + /*Invoke after both the locks are released*/ + rmnet_shs_wq_cleanup_hash_tbl(PERIODIC_CLEAN); + rmnet_shs_wq_debug_print_flows(); +======= +>>>>>>> LA.UM.9.1.R1.10.00.00.604.035 rmnet_shs_wq_filter(); +>>>>>>> LA.UM.9.1.R1.10.00.00.604.030 } void rmnet_shs_wq_process_wq(struct work_struct *work) @@ -2047,8 +2056,11 @@ void rmnet_shs_wq_process_wq(struct work_struct *work) 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.035 queue_delayed_work(rmnet_shs_wq, &rmnet_shs_delayed_wq->wq, jiffies); |