diff options
author | Alex Hong <rurumihong@google.com> | 2020-01-02 16:01:41 +0800 |
---|---|---|
committer | Alex Hong <rurumihong@google.com> | 2020-01-02 16:01:41 +0800 |
commit | fb62fa6a3514f784e34baaaa84a4cef9f5007615 (patch) | |
tree | db2730605bc93054aab13e9b68b6bfccb1fc6fd2 | |
parent | 57983f9ec44785882946d8ffa6d13d5320d90c87 (diff) | |
parent | c9056c1c817129a58c7961758302e75af280cd2f (diff) | |
download | data-kernel-fb62fa6a3514f784e34baaaa84a4cef9f5007615.tar.gz |
Merge branch 'LA.UM.8.13.R1.08.00.00.571.042' into qcom-msm-4.19-7250
Change-Id: I89b1b0d06c7de3cf25f86e2fc0a72a600b8c8f3a
-rw-r--r-- | drivers/emac-dwc-eqos/DWC_ETH_QOS_ipa.c | 18 | ||||
-rw-r--r-- | drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c | 107 | ||||
-rw-r--r-- | drivers/rmnet/perf/rmnet_perf_core.c | 18 |
3 files changed, 93 insertions, 50 deletions
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_ipa.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_ipa.c index c09a6f5..f871ce3 100644 --- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_ipa.c +++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_ipa.c @@ -684,15 +684,19 @@ static void ntn_ipa_notify_cb(void *priv, enum ipa_dp_evt_type evt, /* Submit packet to network stack */ /* If its a ping packet submit it via rx_ni else use rx */ - if (ip_hdr->protocol == IPPROTO_ICMP) { - stat = netif_rx_ni(skb); - } else if ((pdata->dev->stats.rx_packets % - IPA_ETH_RX_SOFTIRQ_THRESH) == 0){ - stat = netif_rx_ni(skb); + /* If NAPI is enabled call receive_skb */ + if(ipa_get_lan_rx_napi()){ + stat = netif_receive_skb(skb); } else { - stat = netif_rx(skb); + if (ip_hdr->protocol == IPPROTO_ICMP) { + stat = netif_rx_ni(skb); + } else if ((pdata->dev->stats.rx_packets % + IPA_ETH_RX_SOFTIRQ_THRESH) == 0){ + stat = netif_rx_ni(skb); + } else { + stat = netif_rx(skb); + } } - if(stat == NET_RX_DROP) { pdata->dev->stats.rx_dropped++; } else { diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c index 2a7e11a..9102457 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; - DWC_ETH_QOS_extract_macid(temp_mac_addr); + 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); @@ -1604,6 +1583,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; @@ -1629,6 +1649,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]; @@ -2264,6 +2286,13 @@ int DWC_ETH_QOS_remove(struct platform_device *pdev) static void DWC_ETH_QOS_shutdown(struct platform_device *pdev) { pr_info("qcom-emac-dwc-eqos: DWC_ETH_QOS_shutdown\n"); +#ifdef DWC_ETH_QOS_BUILTIN + if (gDWC_ETH_QOS_prv_data->dev->flags & IFF_UP) { + gDWC_ETH_QOS_prv_data->dev->netdev_ops->ndo_stop(gDWC_ETH_QOS_prv_data->dev); + gDWC_ETH_QOS_prv_data->dev->flags &= ~IFF_UP; + } + DWC_ETH_QOS_remove(pdev); +#endif } #ifdef CONFIG_PM diff --git a/drivers/rmnet/perf/rmnet_perf_core.c b/drivers/rmnet/perf/rmnet_perf_core.c index ee2a978..4e8d4c6 100644 --- a/drivers/rmnet/perf/rmnet_perf_core.c +++ b/drivers/rmnet/perf/rmnet_perf_core.c @@ -498,7 +498,10 @@ rmnet_perf_core_handle_map_control_start(struct rmnet_map_dl_ind_hdr *dlhdr) struct rmnet_perf *perf = rmnet_perf_config_get_perf(); struct rmnet_perf_core_burst_marker_state *bm_state; - rmnet_perf_core_grab_lock(); + /* If handling deaggregation, we're already locked */ + if (!rmnet_perf_core_is_deag_mode()) + rmnet_perf_core_grab_lock(); + bm_state = perf->core_meta->bm_state; /* if we get two starts in a row, without an end, then we flush * and carry on @@ -517,7 +520,9 @@ rmnet_perf_core_handle_map_control_start(struct rmnet_map_dl_ind_hdr *dlhdr) trace_rmnet_perf_low(RMNET_PERF_MODULE, RMNET_PERF_START_DL_MRK, bm_state->expect_packets, 0xDEF, 0xDEF, 0xDEF, NULL, NULL); - rmnet_perf_core_release_lock(); + + if (!rmnet_perf_core_is_deag_mode()) + rmnet_perf_core_release_lock(); } void rmnet_perf_core_handle_map_control_end_v2(struct rmnet_map_dl_ind_trl *dltrl, @@ -531,7 +536,10 @@ void rmnet_perf_core_handle_map_control_end(struct rmnet_map_dl_ind_trl *dltrl) struct rmnet_perf *perf = rmnet_perf_config_get_perf(); struct rmnet_perf_core_burst_marker_state *bm_state; - rmnet_perf_core_grab_lock(); + /* If handling deaggregation, we're already locked */ + if (!rmnet_perf_core_is_deag_mode()) + rmnet_perf_core_grab_lock(); + bm_state = perf->core_meta->bm_state; rmnet_perf_opt_flush_all_flow_nodes(); rmnet_perf_core_flush_reason_cnt[RMNET_PERF_CORE_DL_MARKER_FLUSHES]++; @@ -540,7 +548,9 @@ void rmnet_perf_core_handle_map_control_end(struct rmnet_map_dl_ind_trl *dltrl) bm_state->expect_packets = 0; trace_rmnet_perf_low(RMNET_PERF_MODULE, RMNET_PERF_END_DL_MRK, 0xDEF, 0xDEF, 0xDEF, 0xDEF, NULL, NULL); - rmnet_perf_core_release_lock(); + + if (!rmnet_perf_core_is_deag_mode()) + rmnet_perf_core_release_lock(); } int rmnet_perf_core_validate_pkt_csum(struct sk_buff *skb, |