diff mbox series

net: broadcom: bcm4908enet: add platform_get_irq_byname error checking

Message ID 20220909062545.16696-1-yuzhe@nfschina.com (mailing list archive)
State Rejected
Delegated to: Netdev Maintainers
Headers show
Series net: broadcom: bcm4908enet: add platform_get_irq_byname error checking | expand

Checks

Context Check Description
netdev/tree_selection success Guessed tree name to be net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix warning Target tree name not specified in the subject
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers success CCed 7 of 7 maintainers
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 8 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Yu Zhe Sept. 9, 2022, 6:25 a.m. UTC
The platform_get_irq_byname() function returns negative error codes on error,
check it.

Signed-off-by: Yu Zhe <yuzhe@nfschina.com>
---
 drivers/net/ethernet/broadcom/bcm4908_enet.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Dan Carpenter Sept. 12, 2022, 11:29 a.m. UTC | #1
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@nfschina.com>
> ---
>  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.

regards,
dan carpenter
Florian Fainelli Sept. 12, 2022, 6:14 p.m. UTC | #2
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@nfschina.com>
>> ---
>>   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 ^^

           free_irq(enet->netdev->irq, enet);

           return 0;
Dan Carpenter Sept. 13, 2022, 10:51 a.m. UTC | #3
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@nfschina.com>
> > > ---
> > >   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
Dan Carpenter Sept. 15, 2022, 9:49 a.m. UTC | #4
On Mon, Sep 12, 2022 at 02:29:17PM +0300, 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@nfschina.com>
> > ---
> >  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.

Btw, my comment of "don't change it unless you can test it" only applies
to this specific IRQ...  We constantly apply untested patches.  I have
submitted my share of buggy patches.  I don't want to discourage you
from your static analysis work.

regards,
dan carpenter
diff mbox series

Patch

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;
 
 	err = dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
 	if (err)