mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-29 15:15:28 -04:00
ravb: Add MII support for R-Car V4M
All EtherAVB instances on R-Car Gen3/Gen4 SoCs support the RGMII interface. In addition, the first two EtherAVB instances on R-Car V4M also support the MII interface, but this is not yet supported by the driver. Add support for MII on R-Car Gen4 by adding an R-Car Gen4-specific EMAC initialization function that selects the MII clock instead of the RGMII clock when the PHY interface is MII. Note that all implementations of EtherAVB on R-Car Gen4 SoCs have the APSR register, but only MII-capable instances are documented to have the MIISELECT bit, which has a documented value of zero when reserved. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru> Link: https://patch.msgid.link/3a21d1d6680864aa85afff9260234c2b8054020a.1719234830.git.geert+renesas@glider.be Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
8d653d26ff
commit
6e0713cc82
@@ -258,6 +258,7 @@ enum APSR_BIT {
|
||||
APSR_CMSW = 0x00000010,
|
||||
APSR_RDM = 0x00002000,
|
||||
APSR_TDM = 0x00004000,
|
||||
APSR_MIISELECT = 0x01000000, /* R-Car V4M only */
|
||||
};
|
||||
|
||||
/* RCR */
|
||||
|
||||
@@ -579,6 +579,16 @@ static void ravb_emac_init_rcar(struct net_device *ndev)
|
||||
ravb_write(ndev, ECSIPR_ICDIP | ECSIPR_MPDIP | ECSIPR_LCHNGIP, ECSIPR);
|
||||
}
|
||||
|
||||
static void ravb_emac_init_rcar_gen4(struct net_device *ndev)
|
||||
{
|
||||
struct ravb_private *priv = netdev_priv(ndev);
|
||||
bool mii = priv->phy_interface == PHY_INTERFACE_MODE_MII;
|
||||
|
||||
ravb_modify(ndev, APSR, APSR_MIISELECT, mii ? APSR_MIISELECT : 0);
|
||||
|
||||
ravb_emac_init_rcar(ndev);
|
||||
}
|
||||
|
||||
/* E-MAC init function */
|
||||
static void ravb_emac_init(struct net_device *ndev)
|
||||
{
|
||||
@@ -2699,6 +2709,31 @@ static const struct ravb_hw_info ravb_gen3_hw_info = {
|
||||
.magic_pkt = 1,
|
||||
};
|
||||
|
||||
static const struct ravb_hw_info ravb_gen4_hw_info = {
|
||||
.receive = ravb_rx_rcar,
|
||||
.set_rate = ravb_set_rate_rcar,
|
||||
.set_feature = ravb_set_features_rcar,
|
||||
.dmac_init = ravb_dmac_init_rcar,
|
||||
.emac_init = ravb_emac_init_rcar_gen4,
|
||||
.gstrings_stats = ravb_gstrings_stats,
|
||||
.gstrings_size = sizeof(ravb_gstrings_stats),
|
||||
.net_hw_features = NETIF_F_RXCSUM,
|
||||
.net_features = NETIF_F_RXCSUM,
|
||||
.stats_len = ARRAY_SIZE(ravb_gstrings_stats),
|
||||
.tccr_mask = TCCR_TSRQ0 | TCCR_TSRQ1 | TCCR_TSRQ2 | TCCR_TSRQ3,
|
||||
.rx_max_frame_size = SZ_2K,
|
||||
.rx_buffer_size = SZ_2K +
|
||||
SKB_DATA_ALIGN(sizeof(struct skb_shared_info)),
|
||||
.rx_desc_size = sizeof(struct ravb_ex_rx_desc),
|
||||
.internal_delay = 1,
|
||||
.tx_counters = 1,
|
||||
.multi_irqs = 1,
|
||||
.irq_en_dis = 1,
|
||||
.ccc_gac = 1,
|
||||
.nc_queues = 1,
|
||||
.magic_pkt = 1,
|
||||
};
|
||||
|
||||
static const struct ravb_hw_info ravb_rzv2m_hw_info = {
|
||||
.receive = ravb_rx_rcar,
|
||||
.set_rate = ravb_set_rate_rcar,
|
||||
@@ -2751,7 +2786,7 @@ static const struct of_device_id ravb_match_table[] = {
|
||||
{ .compatible = "renesas,etheravb-rcar-gen2", .data = &ravb_gen2_hw_info },
|
||||
{ .compatible = "renesas,etheravb-r8a7795", .data = &ravb_gen3_hw_info },
|
||||
{ .compatible = "renesas,etheravb-rcar-gen3", .data = &ravb_gen3_hw_info },
|
||||
{ .compatible = "renesas,etheravb-rcar-gen4", .data = &ravb_gen3_hw_info },
|
||||
{ .compatible = "renesas,etheravb-rcar-gen4", .data = &ravb_gen4_hw_info },
|
||||
{ .compatible = "renesas,etheravb-rzv2m", .data = &ravb_rzv2m_hw_info },
|
||||
{ .compatible = "renesas,rzg2l-gbeth", .data = &gbeth_hw_info },
|
||||
{ }
|
||||
|
||||
Reference in New Issue
Block a user