diff options
author | Florian Fainelli <f.fainelli@gmail.com> | 2014-07-21 18:29:23 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-07-21 19:04:31 -0400 |
commit | 8562056f267db98f5c078fcf7f071c8a4a752ef3 (patch) | |
tree | c48dde0f091464f83ec8797f4d372f7d25ebb0d4 | |
parent | b6e978e50444a063f066f058d134173de877b968 (diff) |
net: bcmgenet: request Wake-on-LAN interrupt
Attempt to the request the Wake-on-LAN interrupt bit, and if successful,
advertise wakeup capability instead of doing this unconditionnally.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/broadcom/genet/bcmgenet.c | 19 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/genet/bcmgenet.h | 2 |
2 files changed, 19 insertions, 2 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index bbd8bf326a35..344a889deaaa 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | |||
@@ -1918,6 +1918,15 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) | |||
1918 | return IRQ_HANDLED; | 1918 | return IRQ_HANDLED; |
1919 | } | 1919 | } |
1920 | 1920 | ||
1921 | static irqreturn_t bcmgenet_wol_isr(int irq, void *dev_id) | ||
1922 | { | ||
1923 | struct bcmgenet_priv *priv = dev_id; | ||
1924 | |||
1925 | pm_wakeup_event(&priv->pdev->dev, 0); | ||
1926 | |||
1927 | return IRQ_HANDLED; | ||
1928 | } | ||
1929 | |||
1921 | static void bcmgenet_umac_reset(struct bcmgenet_priv *priv) | 1930 | static void bcmgenet_umac_reset(struct bcmgenet_priv *priv) |
1922 | { | 1931 | { |
1923 | u32 reg; | 1932 | u32 reg; |
@@ -2046,8 +2055,6 @@ static int bcmgenet_open(struct net_device *dev) | |||
2046 | bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); | 2055 | bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); |
2047 | } | 2056 | } |
2048 | 2057 | ||
2049 | device_set_wakeup_capable(&dev->dev, 1); | ||
2050 | |||
2051 | /* Disable RX/TX DMA and flush TX queues */ | 2058 | /* Disable RX/TX DMA and flush TX queues */ |
2052 | dma_ctrl = bcmgenet_dma_disable(priv); | 2059 | dma_ctrl = bcmgenet_dma_disable(priv); |
2053 | 2060 | ||
@@ -2473,6 +2480,7 @@ static int bcmgenet_probe(struct platform_device *pdev) | |||
2473 | priv = netdev_priv(dev); | 2480 | priv = netdev_priv(dev); |
2474 | priv->irq0 = platform_get_irq(pdev, 0); | 2481 | priv->irq0 = platform_get_irq(pdev, 0); |
2475 | priv->irq1 = platform_get_irq(pdev, 1); | 2482 | priv->irq1 = platform_get_irq(pdev, 1); |
2483 | priv->wol_irq = platform_get_irq(pdev, 2); | ||
2476 | if (!priv->irq0 || !priv->irq1) { | 2484 | if (!priv->irq0 || !priv->irq1) { |
2477 | dev_err(&pdev->dev, "can't find IRQs\n"); | 2485 | dev_err(&pdev->dev, "can't find IRQs\n"); |
2478 | err = -EINVAL; | 2486 | err = -EINVAL; |
@@ -2507,6 +2515,13 @@ static int bcmgenet_probe(struct platform_device *pdev) | |||
2507 | dev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM | | 2515 | dev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM | |
2508 | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM; | 2516 | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM; |
2509 | 2517 | ||
2518 | /* Request the WOL interrupt and advertise suspend if available */ | ||
2519 | priv->wol_irq_disabled = true; | ||
2520 | err = devm_request_irq(&pdev->dev, priv->wol_irq, bcmgenet_wol_isr, 0, | ||
2521 | dev->name, priv); | ||
2522 | if (!err) | ||
2523 | device_set_wakeup_capable(&pdev->dev, 1); | ||
2524 | |||
2510 | /* Set the needed headroom to account for any possible | 2525 | /* Set the needed headroom to account for any possible |
2511 | * features enabling/disabling at runtime | 2526 | * features enabling/disabling at runtime |
2512 | */ | 2527 | */ |
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h index f4891a1b6758..64bc53d86480 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h | |||
@@ -569,6 +569,8 @@ struct bcmgenet_priv { | |||
569 | int irq1; | 569 | int irq1; |
570 | unsigned int irq0_stat; | 570 | unsigned int irq0_stat; |
571 | unsigned int irq1_stat; | 571 | unsigned int irq1_stat; |
572 | int wol_irq; | ||
573 | bool wol_irq_disabled; | ||
572 | 574 | ||
573 | /* HW descriptors/checksum variables */ | 575 | /* HW descriptors/checksum variables */ |
574 | bool desc_64b_en; | 576 | bool desc_64b_en; |