On Mon, Sep 12, 2022 at 11:14:42AM -0700, Florian Fainelli wrote: > On 9/12/22 04:29, Dan Carpenter wrote: > > On Fri, Sep 09, 2022 at 02:25:45PM +0800, Yu Zhe wrote: > > > The platform_get_irq_byname() function returns negative error codes on error, > > > check it. > > > > > > Signed-off-by: Yu Zhe <yuzhe@xxxxxxxxxxxx> > > > --- > > > drivers/net/ethernet/broadcom/bcm4908_enet.c | 2 ++ > > > 1 file changed, 2 insertions(+) > > > > > > diff --git a/drivers/net/ethernet/broadcom/bcm4908_enet.c b/drivers/net/ethernet/broadcom/bcm4908_enet.c > > > index c131d8118489..d985056db6c2 100644 > > > --- a/drivers/net/ethernet/broadcom/bcm4908_enet.c > > > +++ b/drivers/net/ethernet/broadcom/bcm4908_enet.c > > > @@ -705,6 +705,8 @@ static int bcm4908_enet_probe(struct platform_device *pdev) > > > return netdev->irq; > > > enet->irq_tx = platform_get_irq_byname(pdev, "tx"); > > > + if (enet->irq_tx < 0) > > > + return enet->irq_tx; > > > > If you read the driver, then you will see that this is deliberate. > > Search for irq_tx and read the comments. I'm not a subsystem expert so > > I don't know if this an ideal way to write the code, but it's done > > deliberately so please don't change it unless you can test it. > > Yup, the transmit interrupt is deemed optional, or at least was up to some > point during the driver development. There is however a worthy bug you could > fix: > > static int bcm4908_enet_stop(struct net_device *netdev) > { > struct bcm4908_enet *enet = netdev_priv(netdev); > struct bcm4908_enet_dma_ring *tx_ring = &enet->tx_ring; > struct bcm4908_enet_dma_ring *rx_ring = &enet->rx_ring; > > netif_stop_queue(netdev); > netif_carrier_off(netdev); > napi_disable(&rx_ring->napi); > napi_disable(&tx_ring->napi); > > bcm4908_enet_dma_rx_ring_disable(enet, &enet->rx_ring); > bcm4908_enet_dma_tx_ring_disable(enet, &enet->tx_ring); > > bcm4908_enet_dma_uninit(enet); > > free_irq(enet->irq_tx, enet); > > We might attempt to free an invalid interrupt here ^^ Freeing a negative IRQ does not cause an issue. The irq_to_desc() function will return NULL so it becomes a no-op. It's ugly code because you have to read in a couple different files to verify that it works... regards, dan carpenter