Message ID | 1492760684-117205-2-git-send-email-yankejian@huawei.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On 21/04/17 09:44, Yankejian wrote: > From: lipeng <lipeng321@huawei.com> > > In the hip06 and hip07 SoCs, the interrupt lines from the > DSAF controllers are connected to mbigen hw module. > The mbigen module is probed with module_init, and, as such, > is not guaranteed to probe before the HNS driver. So we need > to support deferred probe. > > We check for probe deferral in the hw layer probe, so we not > probe into the main layer and memories, etc., to later learn > that we need to defer the probe. > Why? This looks like a hack. From what I see, we can handle EPROBE_DEFER easily inside hns_ppe_init checking the return value of hns_rcb_get_cfg. Like you do in 2/3 of this series. Regards, Matthias > Signed-off-by: lipeng <lipeng321@huawei.com> > Reviewed-by: Yisen Zhuang <yisen.zhuang@huawei.com> > --- > drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c > index 403ea9d..2da5b42 100644 > --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c > +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c > @@ -2971,6 +2971,18 @@ static int hns_dsaf_probe(struct platform_device *pdev) > struct dsaf_device *dsaf_dev; > int ret; > > + /* > + * Check if we should defer the probe before we probe the > + * dsaf, as it's hard to defer later on. > + */ > + ret = platform_get_irq(pdev, 0); > + if (ret < 0) { > + if (ret != -EPROBE_DEFER) > + dev_err(&pdev->dev, "Cannot obtain irq\n"); > + > + return ret; > + } > + > dsaf_dev = hns_dsaf_alloc_dev(&pdev->dev, sizeof(struct dsaf_drv_priv)); > if (IS_ERR(dsaf_dev)) { > ret = PTR_ERR(dsaf_dev); >
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c index 403ea9d..2da5b42 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c @@ -2971,6 +2971,18 @@ static int hns_dsaf_probe(struct platform_device *pdev) struct dsaf_device *dsaf_dev; int ret; + /* + * Check if we should defer the probe before we probe the + * dsaf, as it's hard to defer later on. + */ + ret = platform_get_irq(pdev, 0); + if (ret < 0) { + if (ret != -EPROBE_DEFER) + dev_err(&pdev->dev, "Cannot obtain irq\n"); + + return ret; + } + dsaf_dev = hns_dsaf_alloc_dev(&pdev->dev, sizeof(struct dsaf_drv_priv)); if (IS_ERR(dsaf_dev)) { ret = PTR_ERR(dsaf_dev);