Re: [net-next PATCH v4 03/11] net: phylink: introduce internal phylink PCS handling
flat view
From: Sean Anderson <sean.anderson@linux.dev>
Date: 2025-05-13 19:23:55
Also in:
linux-arm-kernel, linux-devicetree, linux-mediatek, lkml, llvm
On 5/13/25 15:03, Daniel Golle wrote:
On Tue, May 13, 2025 at 02:18:02PM -0400, Sean Anderson wrote:quoted
On 5/11/25 16:12, Christian Marangi wrote:quoted
Introduce internal handling of PCS for phylink. This is an alternative to .mac_select_pcs that moves the selection logic of the PCS entirely to phylink with the usage of the supported_interface value in the PCS struct. MAC should now provide an array of available PCS in phylink_config in .available_pcs and fill the .num_available_pcs with the number of elements in the array. MAC should also define a new bitmap, pcs_interfaces, in phylink_config to define for what interface mode a dedicated PCS is required. On phylink_create() this array is parsed and a linked list of PCS is created based on the PCS passed in phylink_config. Also the supported_interface value in phylink struct is updated with the new supported_interface from the provided PCS. On phylink_start() every PCS in phylink PCS list gets attached to the phylink instance. This is done by setting the phylink value in phylink_pcs struct to the phylink instance. On phylink_stop(), every PCS in phylink PCS list is detached from the phylink instance. This is done by setting the phylink value in phylink_pcs struct to NULL. phylink_validate_mac_and_pcs(), phylink_major_config() and phylink_inband_caps() are updated to support this new implementation with the PCS list stored in phylink. They will make use of phylink_validate_pcs_interface() that will loop for every PCS in the phylink PCS available list and find one that supports the passed interface. phylink_validate_pcs_interface() applies the same logic of .mac_select_pcs where if a supported_interface value is not set for the PCS struct, then it's assumed every interface is supported. A MAC is required to implement either a .mac_select_pcs or make use of the PCS list implementation. Implementing both will result in a fail on MAC/PCS validation. phylink value in phylink_pcs struct with this implementation is used to track from PCS side when it's attached to a phylink instance. PCS driver will make use of this information to correctly detach from a phylink instance if needed. The .mac_select_pcs implementation is not changed but it's expected that every MAC driver migrates to the new implementation to later deprecate and remove .mac_select_pcs.This introduces a completely parallel PCS selection system used by a single driver. I don't think we want the maintenance burden and complexity of two systems in perpetuity. So what is your plan for conversion of existing drivers to your new system?Moving functionality duplicated in many drivers to a common shared implementation is nothing unsual. While this series proposes the new mechanism for Airoha SoC, they are immediately useful (and long awaited) also for MediaTek and Qualcomm SoCs. Also in the series you posted at least the macb driver (in "[net-next PATCH v4 09/11] net: macb: Move most of mac_config to mac_prepare") would benefit from that shared implementation, as all it does in it's mac_select_pcs is selecting the PCS by a given phy_interface_t, which is what most Ethernet drivers which use more than one PCS are doing in their implementatio of mac_select_pcs().
I generally agree. The vast majority of select_pcs implementations just
determine the PCS based on the interface. But I don't think this is the
right approach. This touches a lot of other areas of the code and
reimplements much of the existing phylink machinery.
I would prefer something more self-contained like
phylink_generic_select_pcs(phylink, interface)
{
for_each(pcs : phylink->available_pcss) {
if (test_bit(pcs->supported, interface))
return pcs;
}
return NULL;
}
which could be dropped into existing implementations in an incremental
manner.
I think the inclusion of PCS lifetime management in this patch
complicates things significantly.
Also axienet_mac_select_pcs() from "[net-next PATCH v4 08/11] net: axienet: Convert to use PCS subsystem" could obviously very easily be mirated to use the phylink-internal handling of PCS selection.
But the bulk of the patch remains. We still have to add the external PCS lookup. There still needs to be another case in mac_config to mux the PCS correctly. And we would need to add some code to create a list of PCSs. I don't know whether we win on the balance.
quoted
DSA drivers typically have different PCSs for each port. At the moment these are selected with mac_select_pcs, allowing the use of a single phylink_config for each port. If you need to pass PCSs through phylink_config then each port will needs its own config. This may prove difficult to integrate with the existing API.This might be a misunderstanding. Also here there is only a single phylink_config for each MAC or DSA port,
My point is that while this is the case at the moment, it would not be the case with a "generic" select pcs. You would need to modify the config for each port to ensure the right PCSs are passed in.
just instead of having many more or less identical implementations of .mac_select_pcs, this functionality is moved into phylink. As a nice side-effect that also makes managing the life-cycle of the PCS more easy, so we won't need all the wrappers for all the PCS OPs.
I think the wrapper approach is very obviously correct. This way has me worried about exciting new concurrency bugs. --Sean