/* For backwards-compatibility with device trees that don't have any *snps,mtl-rx-configorsnps,mtl-tx-configproperties,wefallback *tooneRXandTXqueueseach.
*/
plat->rx_queues_to_use = 1;
plat->tx_queues_to_use = 1;
/* First Queue must always be in DCB mode. As MTL_QUEUE_DCB = 1 we need *toalwayssetthis,otherwiseQueuewillbeclassifiedasAVB *(becauseMTL_QUEUE_AVB=0).
*/
plat->rx_queues_cfg[0].mode_to_use = MTL_QUEUE_DCB;
plat->tx_queues_cfg[0].mode_to_use = MTL_QUEUE_DCB;
rx_node = of_parse_phandle(pdev->dev.of_node, "snps,mtl-rx-config", 0); if (!rx_node) return ret;
if (of_property_read_u32(q_node, "snps,map-to-dma-channel",
&plat->rx_queues_cfg[queue].chan))
plat->rx_queues_cfg[queue].chan = queue; /* TODO: Dynamic mapping to be included in the future */
plat->mdio_node = stmmac_of_get_mdio(np); if (plat->mdio_node)
dev_dbg(dev, "Found MDIO subnode\n");
/* Legacy devicetrees allowed for no MDIO bus description and expect *thebustobescannedfordevices.Ifthere'snophyorfixed-link *describedassumethisisthecasesincetheremustbesomething *connectedtotheMAC.
*/
legacy_mdio = !of_phy_is_fixed_link(np) && !plat->phy_node; if (legacy_mdio)
dev_info(dev, "Deprecated MDIO bus assumption used\n");
if (plat->mdio_node || legacy_mdio) {
plat->mdio_bus_data = devm_kzalloc(dev, sizeof(*plat->mdio_bus_data),
GFP_KERNEL); if (!plat->mdio_bus_data) return -ENOMEM;
/* Some wrapper drivers still rely on phy_node. Let's save it while
* they are not converted to phylink. */
plat->phy_node = of_parse_phandle(np, "phy-handle", 0);
/* Get max speed of operation from device tree */
of_property_read_u32(np, "max-speed", &plat->max_speed);
plat->bus_id = of_alias_get_id(np, "ethernet"); if (plat->bus_id < 0) { if (bus_id < 0)
bus_id = of_alias_get_highest_id("ethernet"); /* No ethernet alias found, init at -1 so first bus_id is 0 */ if (bus_id < 0)
bus_id = -1;
plat->bus_id = ++bus_id;
}
/* Default to phy auto-detection */
plat->phy_addr = -1;
/* Default to get clk_csr from stmmac_clk_csr_set(), *orgetclk_csrfromdevicetree.
*/
plat->clk_csr = -1; if (of_property_read_u32(np, "snps,clk-csr", &plat->clk_csr))
of_property_read_u32(np, "clk_csr", &plat->clk_csr);
/* "snps,phy-addr" is not a standard property. Mark it as deprecated *andwarnofitsuse.Removethiswhenphynodesupportisadded.
*/ if (of_property_read_u32(np, "snps,phy-addr", &plat->phy_addr) == 0)
dev_warn(&pdev->dev, "snps,phy-addr property is deprecated\n");
rc = stmmac_mdio_setup(plat, np, &pdev->dev); if (rc) {
ret = ERR_PTR(rc); goto error_put_phy;
}
if (of_property_read_bool(np, "snps,en-tx-lpi-clockgating")) {
dev_warn(&pdev->dev, "OF property snps,en-tx-lpi-clockgating is deprecated, please convert driver to use STMMAC_FLAG_EN_TX_LPI_CLK_PHY_CAP\n");
plat->flags |= STMMAC_FLAG_EN_TX_LPI_CLOCKGATING;
}
/* Set the maxmtu to a default of JUMBO_LEN in case the *parameterisnotpresentinthedevicetree.
*/
plat->maxmtu = JUMBO_LEN;
/* Set default value for multicast hash bins */
plat->multicast_filter_bins = HASH_TABLE_SIZE;
/* Set default value for unicast filter entries */
plat->unicast_filter_entries = 1;
/* *CurrentlyonlythepropertiesneededonSPEAr600 *areprovided.Allotherpropertiesshouldbeadded *onceneededonotherplatforms.
*/ if (of_device_is_compatible(np, "st,spear600-gmac") ||
of_device_is_compatible(np, "snps,dwmac-3.50a") ||
of_device_is_compatible(np, "snps,dwmac-3.70a") ||
of_device_is_compatible(np, "snps,dwmac-3.72a") ||
of_device_is_compatible(np, "snps,dwmac")) { /* Note that the max-frame-size parameter as defined in the *ePAPRv1.1specisdefinedasmax-frame-size,it's *actuallyusedastheIEEEdefinitionofMACClient *data,orMTU.TheePAPRspecificationisconfusingas *thedefinitionismax-frame-size,butusageexamples *areclearlyMTUs
*/
of_property_read_u32(np, "max-frame-size", &plat->maxmtu);
of_property_read_u32(np, "snps,multicast-filter-bins",
&plat->multicast_filter_bins);
of_property_read_u32(np, "snps,perfect-filter-entries",
&plat->unicast_filter_entries);
plat->unicast_filter_entries = dwmac1000_validate_ucast_entries(
&pdev->dev, plat->unicast_filter_entries);
plat->multicast_filter_bins = dwmac1000_validate_mcast_bins(
&pdev->dev, plat->multicast_filter_bins);
plat->has_gmac = 1;
plat->pmt = 1;
}
rc = stmmac_mtl_setup(pdev, plat); if (rc) {
ret = ERR_PTR(rc); goto error_put_mdio;
}
/* clock setup */ if (!of_device_is_compatible(np, "snps,dwc-qos-ethernet-4.10")) {
plat->stmmac_clk = devm_clk_get(&pdev->dev,
STMMAC_RESOURCE_NAME); if (IS_ERR(plat->stmmac_clk)) {
dev_warn(&pdev->dev, "Cannot get CSR clock\n");
plat->stmmac_clk = NULL;
}
clk_prepare_enable(plat->stmmac_clk);
}
plat->pclk = devm_clk_get_optional(&pdev->dev, "pclk"); if (IS_ERR(plat->pclk)) {
ret = plat->pclk; goto error_pclk_get;
}
clk_prepare_enable(plat->pclk);
/* Fall-back to main clock in case of no PTP ref is passed */
plat->clk_ptp_ref = devm_clk_get(&pdev->dev, "ptp_ref"); if (IS_ERR(plat->clk_ptp_ref)) {
plat->clk_ptp_rate = clk_get_rate(plat->stmmac_clk);
plat->clk_ptp_ref = NULL;
dev_info(&pdev->dev, "PTP uses main clock\n");
} else {
plat->clk_ptp_rate = clk_get_rate(plat->clk_ptp_ref);
dev_dbg(&pdev->dev, "PTP rate %lu\n", plat->clk_ptp_rate);
}
plat->stmmac_rst = devm_reset_control_get_optional(&pdev->dev,
STMMAC_RESOURCE_NAME); if (IS_ERR(plat->stmmac_rst)) {
ret = plat->stmmac_rst; goto error_hw_init;
}
plat->stmmac_ahb_rst = devm_reset_control_get_optional_shared(
&pdev->dev, "ahb"); if (IS_ERR(plat->stmmac_ahb_rst)) {
ret = plat->stmmac_ahb_rst; goto error_hw_init;
}
/* Get IRQ information early to have an ability to ask for deferred *probeifneededbeforewewenttoofarwithresourceallocation.
*/
stmmac_res->irq = platform_get_irq_byname(pdev, "macirq"); if (stmmac_res->irq < 0) return stmmac_res->irq;
/* On some platforms e.g. SPEAr the wake up irq differs from the mac irq *Theexternalwakeupirqcanbepassedthroughtheplatformcode *namedas"eth_wake_irq" * *Incasethewakeupinterruptisnotpassedfromtheplatform *sothedriverwillcontinuetousethemacirq(ndev->irq)
*/
stmmac_res->wol_irq =
platform_get_irq_byname_optional(pdev, "eth_wake_irq"); if (stmmac_res->wol_irq < 0) { if (stmmac_res->wol_irq == -EPROBE_DEFER) return -EPROBE_DEFER;
dev_info(&pdev->dev, "IRQ eth_wake_irq not found\n");
stmmac_res->wol_irq = stmmac_res->irq;
}
stmmac_res->lpi_irq =
platform_get_irq_byname_optional(pdev, "eth_lpi"); if (stmmac_res->lpi_irq < 0) { if (stmmac_res->lpi_irq == -EPROBE_DEFER) return -EPROBE_DEFER;
dev_info(&pdev->dev, "IRQ eth_lpi not found\n");
}
stmmac_res->sfty_irq =
platform_get_irq_byname_optional(pdev, "sfty"); if (stmmac_res->sfty_irq < 0) { if (stmmac_res->sfty_irq == -EPROBE_DEFER) return -EPROBE_DEFER;
dev_info(&pdev->dev, "IRQ sfty not found\n");
}
if (!device_may_wakeup(priv->device) || !priv->plat->pmt) { /* enable the clk previously disabled */
ret = pm_runtime_force_resume(dev); if (ret) return ret;
ret = clk_prepare_enable(priv->plat->clk_ptp_ref); if (ret < 0) {
netdev_warn(priv->dev, "failed to enable PTP reference clock: %pe\n",
ERR_PTR(ret)); return ret;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.