nvethernet: Bringup fixes aggregated

1. Program padctrl registers direclty from driver
2. Disable RSS
3. Skip mac reset based on DT flag on auto platforms

Bug 200760072

Change-Id: Ie1ea86fdec8561d9ffd6479afc4aeec81deb1ea3
Signed-off-by: Bhadram Varka <vbhadram@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2573001
Reviewed-by: svcacv <svcacv@nvidia.com>
Reviewed-by: Narayan Reddy <narayanr@nvidia.com>
Reviewed-by: Nagarjuna Kristam <nkristam@nvidia.com>
Reviewed-by: Srinivas Ramachandran <srinivasra@nvidia.com>
Reviewed-by: svc_kernel_abi <svc_kernel_abi@nvidia.com>
Tested-by: Narayan Reddy <narayanr@nvidia.com>
GVS: Gerrit_Virtual_Submit
This commit is contained in:
Bhadram Varka
2021-08-09 14:07:04 +05:30
committed by Revanth Kumar Uppala
parent 277273634c
commit 27a4b4591a
2 changed files with 74 additions and 7 deletions

View File

@@ -4917,11 +4917,13 @@ static int ether_configure_car(struct platform_device *pdev,
/* get MAC reset */
pdata->mac_rst = devm_reset_control_get(&pdev->dev, "mac_rst");
if (IS_ERR_OR_NULL(pdata->mac_rst)) {
if (PTR_ERR(pdata->mac_rst) != -EPROBE_DEFER)
dev_err(&pdev->dev, "failed to get MAC reset\n");
return PTR_ERR(pdata->mac_rst);
if (!pdata->skip_mac_reset) {
pdata->mac_rst = devm_reset_control_get(&pdev->dev, "mac_rst");
if (IS_ERR_OR_NULL(pdata->mac_rst)) {
if (PTR_ERR(pdata->mac_rst) != -EPROBE_DEFER)
dev_err(&pdev->dev, "failed to get MAC rst\n");
return PTR_ERR(pdata->mac_rst);
}
}
if (osi_core->mac == OSI_MAC_HW_MGBE) {
@@ -5260,6 +5262,13 @@ static int ether_parse_dt(struct ether_priv_data *pdata)
unsigned int i, mtlq, chan, bitmap;
unsigned int dt_pad_calibration_enable;
/* Read flag to skip MAC reset on platform */
ret = of_property_read_u32(np, "nvidia,skip_mac_reset",
&pdata->skip_mac_reset);
if (ret != 0) {
dev_info(dev, "failed to read skip mac reset flag, default 0\n");
pdata->skip_mac_reset = 0U;
}
/* Read MDIO address */
ret = of_property_read_u32(np, "nvidia,mdio_addr",
&pdata->mdio_addr);
@@ -5895,6 +5904,9 @@ static void ether_init_rss(struct ether_priv_data *pdata,
return;
}
/* FIXME: Disable RSS as WAR for bringup */
osi_core->rss.enable = 0;
/* generate random key */
netdev_rss_key_fill(osi_core->rss.key, sizeof(osi_core->rss.key));
@@ -5931,7 +5943,61 @@ static int ether_probe(struct platform_device *pdev)
struct osi_dma_priv_data *osi_dma;
struct osi_ioctl ioctl_data = {};
struct net_device *ndev;
int ret = 0, i;
int ret = 0, i, val;
void __iomem *reg;
/* WAR to program PAD control registers until MB1 changes done */
if (tegra_get_chip_id() == TEGRA234) {
reg = ioremap(0x2445038, 4);
val = 0x2440;
writel(val, reg);
iounmap(reg);
reg = ioremap(0x2445048, 4);
val = 0x2400;
writel(val, reg);
iounmap(reg);
reg = ioremap(0x2440000, 4);
val = 0x440;
writel(val, reg);
iounmap(reg);
reg = ioremap(0x2440008, 4);
val = 0x400;
writel(val, reg);
iounmap(reg);
reg = ioremap(0x2440018, 4);
val = 0x440;
writel(val, reg);
iounmap(reg);
reg = ioremap(0x2440028, 4);
val = 0x400;
writel(val, reg);
iounmap(reg);
reg = ioremap(0x2440048, 4);
val = 0x440;
writel(val, reg);
iounmap(reg);
reg = ioremap(0x2440010, 4);
val = 0x400;
writel(val, reg);
iounmap(reg);
reg = ioremap(0x2440038, 4);
val = 0x440;
writel(val, reg);
iounmap(reg);
reg = ioremap(0x2440040, 4);
val = 0x400;
writel(val, reg);
iounmap(reg);
}
ether_get_num_dma_chan_mtl_q(pdev, &num_dma_chans,
&mac, &num_mtl_queues);
@@ -6356,7 +6422,6 @@ static int ether_resume(struct ether_priv_data *pdata)
dev_err(dev, "failed to do pad caliberation\n");
return ret;
}
osi_set_rx_buf_len(osi_dma);
ret = ether_allocate_dma_resources(pdata);