mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-19 13:11:14 +00:00
sh_eth: fix TSU resource handling
When switching the driver to the managed device API, I managed to break
the case of a dual Ether devices sharing a single TSU: the 2nd Ether port
wouldn't probe. Iwamatsu-san has tried to fix this but his patch was buggy
and he then dropped the ball...
The solution is to limit calling devm_request_mem_region() to the first
of the two ports sharing the same TSU, so devm_ioremap_resource() can't
be used anymore for the TSU resource...
Fixes: d5e07e6921
("sh_eth: use managed device API")
Reported-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
879626e3a5
commit
dfe8266b8d
1 changed files with 22 additions and 3 deletions
|
@ -3225,10 +3225,29 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
|
||||||
/* ioremap the TSU registers */
|
/* ioremap the TSU registers */
|
||||||
if (mdp->cd->tsu) {
|
if (mdp->cd->tsu) {
|
||||||
struct resource *rtsu;
|
struct resource *rtsu;
|
||||||
|
|
||||||
rtsu = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
rtsu = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||||
mdp->tsu_addr = devm_ioremap_resource(&pdev->dev, rtsu);
|
if (!rtsu) {
|
||||||
if (IS_ERR(mdp->tsu_addr)) {
|
dev_err(&pdev->dev, "no TSU resource\n");
|
||||||
ret = PTR_ERR(mdp->tsu_addr);
|
ret = -ENODEV;
|
||||||
|
goto out_release;
|
||||||
|
}
|
||||||
|
/* We can only request the TSU region for the first port
|
||||||
|
* of the two sharing this TSU for the probe to succeed...
|
||||||
|
*/
|
||||||
|
if (devno % 2 == 0 &&
|
||||||
|
!devm_request_mem_region(&pdev->dev, rtsu->start,
|
||||||
|
resource_size(rtsu),
|
||||||
|
dev_name(&pdev->dev))) {
|
||||||
|
dev_err(&pdev->dev, "can't request TSU resource.\n");
|
||||||
|
ret = -EBUSY;
|
||||||
|
goto out_release;
|
||||||
|
}
|
||||||
|
mdp->tsu_addr = devm_ioremap(&pdev->dev, rtsu->start,
|
||||||
|
resource_size(rtsu));
|
||||||
|
if (!mdp->tsu_addr) {
|
||||||
|
dev_err(&pdev->dev, "TSU region ioremap() failed.\n");
|
||||||
|
ret = -ENOMEM;
|
||||||
goto out_release;
|
goto out_release;
|
||||||
}
|
}
|
||||||
mdp->port = devno % 2;
|
mdp->port = devno % 2;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue