Merge branch 'icssg-half-duplex-support'
==================== net: Add Half Duplex support for ICSSG Driver This series adds support for half duplex operation for ICSSG driver. In order to support half-duplex operation at 10M and 100M link speeds, the PHY collision detection signal (COL) should be routed to ICSSG GPIO pin (PRGx_PRU0/1_GPI10) so that firmware can detect collision signal and apply the CSMA/CD algorithm applicable for half duplex operation. A DT property, "ti,half-duplex-capable" is introduced for this purpose in the first patch of the series. If board has PHY COL pin conencted to PRGx_PRU1_GPIO10, this DT property can be added to eth node of ICSSG, MII port to support half duplex operation at that port. Second patch of the series configures driver to support half-duplex operation if the DT property "ti,half-duplex-capable" is enabled. This series addresses comments on [v2]. This series is based on the latest net-next/main. This series has no dependency. Changes from v1 to v2: *) Changed the description of "ti,half-duplex-capable" property as asked by Rob and Andrew to avoid confusion between capable and enable. Changes from v1 to v2: *) Dropped the RFC tag. *) Added RB tags of Andrew and Roger. [v1] https://lore.kernel.org/all/20230830113134.1226970-1-danishanwar@ti.com/ [v2] https://lore.kernel.org/all/20230911060200.2164771-1-danishanwar@ti.com/ ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
13a46acc05
@ -107,6 +107,13 @@ properties:
|
||||
phandle to system controller node and register offset
|
||||
to ICSSG control register for RGMII transmit delay
|
||||
|
||||
ti,half-duplex-capable:
|
||||
type: boolean
|
||||
description:
|
||||
Indicates that the PHY output pin COL is routed to ICSSG GPIO pin
|
||||
(PRGx_PRU0/1_GPIO10) as input so that the ICSSG MII port is
|
||||
capable of half duplex operations.
|
||||
|
||||
required:
|
||||
- reg
|
||||
anyOf:
|
||||
|
@ -433,6 +433,17 @@ int emac_set_port_state(struct prueth_emac *emac,
|
||||
return ret;
|
||||
}
|
||||
|
||||
void icssg_config_half_duplex(struct prueth_emac *emac)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
if (!emac->half_duplex)
|
||||
return;
|
||||
|
||||
val = get_random_u32();
|
||||
writel(val, emac->dram.va + HD_RAND_SEED_OFFSET);
|
||||
}
|
||||
|
||||
void icssg_config_set_speed(struct prueth_emac *emac)
|
||||
{
|
||||
u8 fw_speed;
|
||||
@ -453,5 +464,8 @@ void icssg_config_set_speed(struct prueth_emac *emac)
|
||||
return;
|
||||
}
|
||||
|
||||
if (emac->duplex == DUPLEX_HALF)
|
||||
fw_speed |= FW_LINK_SPEED_HD;
|
||||
|
||||
writeb(fw_speed, emac->dram.va + PORT_LINK_SPEED_OFFSET);
|
||||
}
|
||||
|
@ -1029,6 +1029,8 @@ static void emac_adjust_link(struct net_device *ndev)
|
||||
* values
|
||||
*/
|
||||
if (emac->link) {
|
||||
if (emac->duplex == DUPLEX_HALF)
|
||||
icssg_config_half_duplex(emac);
|
||||
/* Set the RGMII cfg for gig en and full duplex */
|
||||
icssg_update_rgmii_cfg(prueth->miig_rt, emac);
|
||||
|
||||
@ -1147,9 +1149,13 @@ static int emac_phy_connect(struct prueth_emac *emac)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!emac->half_duplex) {
|
||||
dev_dbg(prueth->dev, "half duplex mode is not supported\n");
|
||||
phy_remove_link_mode(ndev->phydev, ETHTOOL_LINK_MODE_10baseT_Half_BIT);
|
||||
phy_remove_link_mode(ndev->phydev, ETHTOOL_LINK_MODE_100baseT_Half_BIT);
|
||||
}
|
||||
|
||||
/* remove unsupported modes */
|
||||
phy_remove_link_mode(ndev->phydev, ETHTOOL_LINK_MODE_10baseT_Half_BIT);
|
||||
phy_remove_link_mode(ndev->phydev, ETHTOOL_LINK_MODE_100baseT_Half_BIT);
|
||||
phy_remove_link_mode(ndev->phydev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
|
||||
phy_remove_link_mode(ndev->phydev, ETHTOOL_LINK_MODE_Pause_BIT);
|
||||
phy_remove_link_mode(ndev->phydev, ETHTOOL_LINK_MODE_Asym_Pause_BIT);
|
||||
@ -2113,6 +2119,10 @@ static int prueth_probe(struct platform_device *pdev)
|
||||
eth0_node->name);
|
||||
goto exit_iep;
|
||||
}
|
||||
|
||||
if (of_find_property(eth0_node, "ti,half-duplex-capable", NULL))
|
||||
prueth->emac[PRUETH_MAC0]->half_duplex = 1;
|
||||
|
||||
prueth->emac[PRUETH_MAC0]->iep = prueth->iep0;
|
||||
}
|
||||
|
||||
@ -2124,6 +2134,9 @@ static int prueth_probe(struct platform_device *pdev)
|
||||
goto netdev_exit;
|
||||
}
|
||||
|
||||
if (of_find_property(eth1_node, "ti,half-duplex-capable", NULL))
|
||||
prueth->emac[PRUETH_MAC1]->half_duplex = 1;
|
||||
|
||||
prueth->emac[PRUETH_MAC1]->iep = prueth->iep0;
|
||||
}
|
||||
|
||||
|
@ -145,6 +145,7 @@ struct prueth_emac {
|
||||
struct icss_iep *iep;
|
||||
unsigned int rx_ts_enabled : 1;
|
||||
unsigned int tx_ts_enabled : 1;
|
||||
unsigned int half_duplex : 1;
|
||||
|
||||
/* DMA related */
|
||||
struct prueth_tx_chn tx_chns[PRUETH_MAX_TX_QUEUES];
|
||||
@ -271,6 +272,7 @@ int icssg_config(struct prueth *prueth, struct prueth_emac *emac,
|
||||
int emac_set_port_state(struct prueth_emac *emac,
|
||||
enum icssg_port_state_cmd state);
|
||||
void icssg_config_set_speed(struct prueth_emac *emac);
|
||||
void icssg_config_half_duplex(struct prueth_emac *emac);
|
||||
|
||||
/* Buffer queue helpers */
|
||||
int icssg_queue_pop(struct prueth *prueth, u8 queue);
|
||||
|
Loading…
x
Reference in New Issue
Block a user