Message ID | 20240917-qcom_emac_fix-v5-1-526bb2aa0034@quicinc.com (mailing list archive) |
---|---|
State | Deferred |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next,v5] net: qcom/emac: Find sgmii_ops by device_for_each_child() | expand |
On 9/17/24 03:57, Zijun Hu wrote: > From: Zijun Hu <quic_zijuhu@quicinc.com> > > To prepare for constifying the following old driver core API: > > struct device *device_find_child(struct device *dev, void *data, > int (*match)(struct device *dev, void *data)); > to new: > struct device *device_find_child(struct device *dev, const void *data, > int (*match)(struct device *dev, const void *data)); > > The new API does not allow its match function (*match)() to modify > caller's match data @*data, but emac_sgmii_acpi_match(), as the old > API's match function, indeed modifies relevant match data, so it is > not suitable for the new API any more, solved by implementing the same > finding sgmii_ops function by correcting the function and using it > as parameter of device_for_each_child() instead of device_find_child(). > > By the way, this commit does not change any existing logic. > > Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com> ## Form letter - net-next-closed The merge window for v6.12 and therefore net-next is closed for new drivers, features, code refactoring and optimizations. We are currently accepting bug fixes only. Please repost when net-next reopens after Sept 30th. RFC patches sent for review only are obviously welcome at any time. See: https://www.kernel.org/doc/html/next/process/maintainer-netdev.html#development-cycle
On 2024/9/19 16:26, Paolo Abeni wrote: > On 9/17/24 03:57, Zijun Hu wrote: >> From: Zijun Hu <quic_zijuhu@quicinc.com> >> >> To prepare for constifying the following old driver core API: >> >> struct device *device_find_child(struct device *dev, void *data, >> int (*match)(struct device *dev, void *data)); >> to new: >> struct device *device_find_child(struct device *dev, const void *data, >> int (*match)(struct device *dev, const void *data)); >> >> The new API does not allow its match function (*match)() to modify >> caller's match data @*data, but emac_sgmii_acpi_match(), as the old >> API's match function, indeed modifies relevant match data, so it is >> not suitable for the new API any more, solved by implementing the same >> finding sgmii_ops function by correcting the function and using it >> as parameter of device_for_each_child() instead of device_find_child(). >> >> By the way, this commit does not change any existing logic. >> >> Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com> > > > ## Form letter - net-next-closed > > The merge window for v6.12 and therefore net-next is closed for new > drivers, features, code refactoring and optimizations. We are currently > accepting bug fixes only. > > Please repost when net-next reopens after Sept 30th. > > RFC patches sent for review only are obviously welcome at any time. > thanks for your remainder. will post it after merge window is opened again. and always welcome code reviewers to give comments before that. (^^). > See: > https://www.kernel.org/doc/html/next/process/maintainer-netdev.html#development-cycle
diff --git a/drivers/net/ethernet/qualcomm/emac/emac-sgmii.c b/drivers/net/ethernet/qualcomm/emac/emac-sgmii.c index e4bc18009d08..e8265761c416 100644 --- a/drivers/net/ethernet/qualcomm/emac/emac-sgmii.c +++ b/drivers/net/ethernet/qualcomm/emac/emac-sgmii.c @@ -293,6 +293,11 @@ static struct sgmii_ops qdf2400_ops = { }; #endif +struct emac_match_data { + struct sgmii_ops **sgmii_ops; + struct device *target_device; +}; + static int emac_sgmii_acpi_match(struct device *dev, void *data) { #ifdef CONFIG_ACPI @@ -303,7 +308,7 @@ static int emac_sgmii_acpi_match(struct device *dev, void *data) {} }; const struct acpi_device_id *id = acpi_match_device(match_table, dev); - struct sgmii_ops **ops = data; + struct emac_match_data *match_data = data; if (id) { acpi_handle handle = ACPI_HANDLE(dev); @@ -324,10 +329,12 @@ static int emac_sgmii_acpi_match(struct device *dev, void *data) switch (hrv) { case 1: - *ops = &qdf2432_ops; + *match_data->sgmii_ops = &qdf2432_ops; + match_data->target_device = get_device(dev); return 1; case 2: - *ops = &qdf2400_ops; + *match_data->sgmii_ops = &qdf2400_ops; + match_data->target_device = get_device(dev); return 1; } } @@ -356,10 +363,14 @@ int emac_sgmii_config(struct platform_device *pdev, struct emac_adapter *adpt) int ret; if (has_acpi_companion(&pdev->dev)) { + struct emac_match_data match_data = { + .sgmii_ops = &phy->sgmii_ops, + .target_device = NULL, + }; struct device *dev; - dev = device_find_child(&pdev->dev, &phy->sgmii_ops, - emac_sgmii_acpi_match); + device_for_each_child(&pdev->dev, &match_data, emac_sgmii_acpi_match); + dev = match_data.target_device; if (!dev) { dev_warn(&pdev->dev, "cannot find internal phy node\n");