summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Hong <rurumihong@google.com>2020-01-02 16:01:41 +0800
committerAlex Hong <rurumihong@google.com>2020-01-02 16:01:41 +0800
commitfb62fa6a3514f784e34baaaa84a4cef9f5007615 (patch)
treedb2730605bc93054aab13e9b68b6bfccb1fc6fd2
parent57983f9ec44785882946d8ffa6d13d5320d90c87 (diff)
parentc9056c1c817129a58c7961758302e75af280cd2f (diff)
downloaddata-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.c18
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_platform.c107
-rw-r--r--drivers/rmnet/perf/rmnet_perf_core.c18
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,