Re: [PATCH 3/3] ibm_newemac: MAL support for PowerPC 405EZ

2008-09-05 Thread Benjamin Herrenschmidt

> > > + if (of_device_is_compatible(ofdev->node, "ibm,mcmal-405ez"))
> > > + mal->features |= (MAL_FTR_CLEAR_ICINTSTAT | 
> > > MAL_FTR_COMMON_ERR_INT);
> > 
> > The above like is >80 characters wide.
> > But I'm not sure that anyone cares.
> 
> I don't.  If Ben complains I'll change it.

I wouldn't do a tatrum over it but if you're going to respin the
patch you may as well put the second constant on the next line.

Cheers,
Ben.


___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev


Re: [PATCH 3/3] ibm_newemac: MAL support for PowerPC 405EZ

2008-09-04 Thread Josh Boyer
On Fri, 5 Sep 2008 12:10:37 +1000
Simon Horman <[EMAIL PROTECTED]> wrote:
 
> > +static irqreturn_t mal_int(int irq, void *dev_instance)
> > +{
> > +   struct mal_instance *mal = dev_instance;
> > +   u32 esr = get_mal_dcrn(mal, MAL_ESR);
> > +
> > +   if (esr & MAL_ESR_EVB) {
> > +   /* descriptor error */
> > +   if (esr & MAL_ESR_DE) {
> > +   if (esr & MAL_ESR_CIDT)
> > +   return (mal_rxde(irq, dev_instance));
> 
>   Return statements shouldn't be enlosed in brackets according to
>   checkpatch.pl. Also in a few other places.

I hate checkpatch, but that's easy enough to fix.  Though I don't see
what other places I add with that mistake.

> > +   else
> > +   return (mal_txde(irq, dev_instance));
> > +   } else { /* SERR */
> > +   return (mal_serr(irq, dev_instance));
> > +   }
> > +   }
> > +   return IRQ_HANDLED;
> > +}
> > +
> >  void mal_poll_disable(struct mal_instance *mal, struct mal_commac *commac)
> >  {
> > /* Spinlock-type semantics: only one caller disable poll at a time */
> > @@ -542,11 +568,22 @@ static int __devinit mal_probe(struct of_device 
> > *ofdev,
> > goto fail;
> > }
> >  
> > -   mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
> > -   mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
> > -   mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
> > -   mal->txde_irq = irq_of_parse_and_map(ofdev->node, 3);
> > -   mal->rxde_irq = irq_of_parse_and_map(ofdev->node, 4);
> > +   if (of_device_is_compatible(ofdev->node, "ibm,mcmal-405ez"))
> > +   mal->features |= (MAL_FTR_CLEAR_ICINTSTAT | 
> > MAL_FTR_COMMON_ERR_INT);
> 
> The above like is >80 characters wide.
> But I'm not sure that anyone cares.

I don't.  If Ben complains I'll change it.

> > +
> > +   if (mal_has_feature(mal, MAL_FTR_COMMON_ERR_INT)) {
> > +   mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
> > +   mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
> > +   mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
> > +   mal->txde_irq = mal->rxde_irq = mal->serr_irq;
> > +   } else {
> > +   mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
> > +   mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
> > +   mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
> > +   mal->txde_irq = irq_of_parse_and_map(ofdev->node, 3);
> > +   mal->rxde_irq = irq_of_parse_and_map(ofdev->node, 4);
> > +   }
> 
> It seems that that first three calls to irq_of_parse_and_map() could
> be moved outside of the if/else clause.
> 
>   mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
>   mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
>   mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
>   if (mal_has_feature(mal, MAL_FTR_COMMON_ERR_INT)) {
>   mal->txde_irq = mal->rxde_irq = mal->serr_irq;
>   } else {
>   mal->txde_irq = irq_of_parse_and_map(ofdev->node, 3);
>   mal->rxde_irq = irq_of_parse_and_map(ofdev->node, 4);
>   }

Indeed they could.  Good catch.

> > +
> > if (mal->txeob_irq == NO_IRQ || mal->rxeob_irq == NO_IRQ ||
> > mal->serr_irq == NO_IRQ || mal->txde_irq == NO_IRQ ||
> > mal->rxde_irq == NO_IRQ) {
> > @@ -608,21 +645,42 @@ static int __devinit mal_probe(struct of_device 
> > *ofdev,
> >  sizeof(struct mal_descriptor) *
> >  mal_rx_bd_offset(mal, i));
> >  
> > -   err = request_irq(mal->serr_irq, mal_serr, 0, "MAL SERR", mal);
> > -   if (err)
> > -   goto fail2;
> > -   err = request_irq(mal->txde_irq, mal_txde, 0, "MAL TX DE", mal);
> > -   if (err)
> > -   goto fail3;
> > -   err = request_irq(mal->txeob_irq, mal_txeob, 0, "MAL TX EOB", mal);
> > -   if (err)
> > -   goto fail4;
> > -   err = request_irq(mal->rxde_irq, mal_rxde, 0, "MAL RX DE", mal);
> > -   if (err)
> > -   goto fail5;
> > -   err = request_irq(mal->rxeob_irq, mal_rxeob, 0, "MAL RX EOB", mal);
> > -   if (err)
> > -   goto fail6;
> > +   if (mal_has_feature(mal, MAL_FTR_COMMON_ERR_INT)) {
> > +   err = request_irq(mal->serr_irq, mal_int, IRQF_SHARED,
> > +   "MAL SERR", mal);
> > +   if (err)
> > +   goto fail2;
> > +   err = request_irq(mal->txde_irq, mal_int, IRQF_SHARED,
> > +   "MAL TX DE", mal);
> > +   if (err)
> > +   goto fail3;
> > +   err = request_irq(mal->txeob_irq, mal_txeob, 0, "MAL TX EOB", 
> > mal);
> > +   if (err)
> > +   goto fail4;
> > +   err = request_irq(mal->rxde_irq, mal_int, IRQF_SHARED,
> > +   "MAL RX DE", mal);
> > +   if (err)
> > +   goto fail5;
> > +   err = request_i

Re: [PATCH 3/3] ibm_newemac: MAL support for PowerPC 405EZ

2008-09-04 Thread Simon Horman
On Thu, Sep 04, 2008 at 11:02:16AM -0400, Josh Boyer wrote:
> The PowerPC 405EZ SoC has some differences in the interrupt layout and
> handling for the MAL.  The SERR, TXDE, and RXDE interrupts are OR'd into
> a single interrupt.  Also, due to the possibility for interrupt coalescing,
> the TXEOB and RXEOB interrupts require an interrupt bit to be cleared in
> the ICINTSTAT SDR.
> 
> This sets the proper MAL feature bits for 405EZ boards, and adds a common
> shared handler for SERR, TXDE, and RXDE.  This has been adapted from code
> originally written by Stefan Roese.
> 
> Signed-off-by: Josh Boyer <[EMAIL PROTECTED]>
> ---
>  drivers/net/ibm_newemac/mal.c |   98 
>  1 files changed, 78 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/net/ibm_newemac/mal.c b/drivers/net/ibm_newemac/mal.c
> index 10c267b..3cef534 100644
> --- a/drivers/net/ibm_newemac/mal.c
> +++ b/drivers/net/ibm_newemac/mal.c
> @@ -28,6 +28,7 @@
>  #include 
>  
>  #include "core.h"
> +#include 
>  
>  static int mal_count;
>  
> @@ -279,6 +280,9 @@ static irqreturn_t mal_txeob(int irq, void *dev_instance)
>   mal_schedule_poll(mal);
>   set_mal_dcrn(mal, MAL_TXEOBISR, r);
>  
> + if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT))
> + mtdcri(SDR0, 0x4510, (mfdcri(SDR0, 0x4510) | 0x6000));
> +
>   return IRQ_HANDLED;
>  }
>  
> @@ -293,6 +297,9 @@ static irqreturn_t mal_rxeob(int irq, void *dev_instance)
>   mal_schedule_poll(mal);
>   set_mal_dcrn(mal, MAL_RXEOBISR, r);
>  
> + if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT))
> + mtdcri(SDR0, 0x4510, (mfdcri(SDR0, 0x4510) | 0x8000));
> +
>   return IRQ_HANDLED;
>  }
>  
> @@ -336,6 +343,25 @@ static irqreturn_t mal_rxde(int irq, void *dev_instance)
>   return IRQ_HANDLED;
>  }
>  
> +static irqreturn_t mal_int(int irq, void *dev_instance)
> +{
> + struct mal_instance *mal = dev_instance;
> + u32 esr = get_mal_dcrn(mal, MAL_ESR);
> +
> + if (esr & MAL_ESR_EVB) {
> + /* descriptor error */
> + if (esr & MAL_ESR_DE) {
> + if (esr & MAL_ESR_CIDT)
> + return (mal_rxde(irq, dev_instance));

Return statements shouldn't be enlosed in brackets according to
checkpatch.pl. Also in a few other places.

> + else
> + return (mal_txde(irq, dev_instance));
> + } else { /* SERR */
> + return (mal_serr(irq, dev_instance));
> + }
> + }
> + return IRQ_HANDLED;
> +}
> +
>  void mal_poll_disable(struct mal_instance *mal, struct mal_commac *commac)
>  {
>   /* Spinlock-type semantics: only one caller disable poll at a time */
> @@ -542,11 +568,22 @@ static int __devinit mal_probe(struct of_device *ofdev,
>   goto fail;
>   }
>  
> - mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
> - mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
> - mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
> - mal->txde_irq = irq_of_parse_and_map(ofdev->node, 3);
> - mal->rxde_irq = irq_of_parse_and_map(ofdev->node, 4);
> + if (of_device_is_compatible(ofdev->node, "ibm,mcmal-405ez"))
> + mal->features |= (MAL_FTR_CLEAR_ICINTSTAT | 
> MAL_FTR_COMMON_ERR_INT);

The above like is >80 characters wide.
But I'm not sure that anyone cares.

> +
> + if (mal_has_feature(mal, MAL_FTR_COMMON_ERR_INT)) {
> + mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
> + mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
> + mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
> + mal->txde_irq = mal->rxde_irq = mal->serr_irq;
> + } else {
> + mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
> + mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
> + mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
> + mal->txde_irq = irq_of_parse_and_map(ofdev->node, 3);
> + mal->rxde_irq = irq_of_parse_and_map(ofdev->node, 4);
> + }

It seems that that first three calls to irq_of_parse_and_map() could
be moved outside of the if/else clause.

mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
if (mal_has_feature(mal, MAL_FTR_COMMON_ERR_INT)) {
mal->txde_irq = mal->rxde_irq = mal->serr_irq;
} else {
mal->txde_irq = irq_of_parse_and_map(ofdev->node, 3);
mal->rxde_irq = irq_of_parse_and_map(ofdev->node, 4);
}

> +
>   if (mal->txeob_irq == NO_IRQ || mal->rxeob_irq == NO_IRQ ||
>   mal->serr_irq == NO_IRQ || mal->txde_irq == NO_IRQ ||
>   mal->rxde_irq == NO_IRQ) {
> @@ -608,21 +645,42 @@ static int __devinit mal_probe(struc

[PATCH 3/3] ibm_newemac: MAL support for PowerPC 405EZ

2008-09-04 Thread Josh Boyer
The PowerPC 405EZ SoC has some differences in the interrupt layout and
handling for the MAL.  The SERR, TXDE, and RXDE interrupts are OR'd into
a single interrupt.  Also, due to the possibility for interrupt coalescing,
the TXEOB and RXEOB interrupts require an interrupt bit to be cleared in
the ICINTSTAT SDR.

This sets the proper MAL feature bits for 405EZ boards, and adds a common
shared handler for SERR, TXDE, and RXDE.  This has been adapted from code
originally written by Stefan Roese.

Signed-off-by: Josh Boyer <[EMAIL PROTECTED]>
---
 drivers/net/ibm_newemac/mal.c |   98 
 1 files changed, 78 insertions(+), 20 deletions(-)

diff --git a/drivers/net/ibm_newemac/mal.c b/drivers/net/ibm_newemac/mal.c
index 10c267b..3cef534 100644
--- a/drivers/net/ibm_newemac/mal.c
+++ b/drivers/net/ibm_newemac/mal.c
@@ -28,6 +28,7 @@
 #include 
 
 #include "core.h"
+#include 
 
 static int mal_count;
 
@@ -279,6 +280,9 @@ static irqreturn_t mal_txeob(int irq, void *dev_instance)
mal_schedule_poll(mal);
set_mal_dcrn(mal, MAL_TXEOBISR, r);
 
+   if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT))
+   mtdcri(SDR0, 0x4510, (mfdcri(SDR0, 0x4510) | 0x6000));
+
return IRQ_HANDLED;
 }
 
@@ -293,6 +297,9 @@ static irqreturn_t mal_rxeob(int irq, void *dev_instance)
mal_schedule_poll(mal);
set_mal_dcrn(mal, MAL_RXEOBISR, r);
 
+   if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT))
+   mtdcri(SDR0, 0x4510, (mfdcri(SDR0, 0x4510) | 0x8000));
+
return IRQ_HANDLED;
 }
 
@@ -336,6 +343,25 @@ static irqreturn_t mal_rxde(int irq, void *dev_instance)
return IRQ_HANDLED;
 }
 
+static irqreturn_t mal_int(int irq, void *dev_instance)
+{
+   struct mal_instance *mal = dev_instance;
+   u32 esr = get_mal_dcrn(mal, MAL_ESR);
+
+   if (esr & MAL_ESR_EVB) {
+   /* descriptor error */
+   if (esr & MAL_ESR_DE) {
+   if (esr & MAL_ESR_CIDT)
+   return (mal_rxde(irq, dev_instance));
+   else
+   return (mal_txde(irq, dev_instance));
+   } else { /* SERR */
+   return (mal_serr(irq, dev_instance));
+   }
+   }
+   return IRQ_HANDLED;
+}
+
 void mal_poll_disable(struct mal_instance *mal, struct mal_commac *commac)
 {
/* Spinlock-type semantics: only one caller disable poll at a time */
@@ -542,11 +568,22 @@ static int __devinit mal_probe(struct of_device *ofdev,
goto fail;
}
 
-   mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
-   mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
-   mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
-   mal->txde_irq = irq_of_parse_and_map(ofdev->node, 3);
-   mal->rxde_irq = irq_of_parse_and_map(ofdev->node, 4);
+   if (of_device_is_compatible(ofdev->node, "ibm,mcmal-405ez"))
+   mal->features |= (MAL_FTR_CLEAR_ICINTSTAT | 
MAL_FTR_COMMON_ERR_INT);
+
+   if (mal_has_feature(mal, MAL_FTR_COMMON_ERR_INT)) {
+   mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
+   mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
+   mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
+   mal->txde_irq = mal->rxde_irq = mal->serr_irq;
+   } else {
+   mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
+   mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
+   mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2);
+   mal->txde_irq = irq_of_parse_and_map(ofdev->node, 3);
+   mal->rxde_irq = irq_of_parse_and_map(ofdev->node, 4);
+   }
+
if (mal->txeob_irq == NO_IRQ || mal->rxeob_irq == NO_IRQ ||
mal->serr_irq == NO_IRQ || mal->txde_irq == NO_IRQ ||
mal->rxde_irq == NO_IRQ) {
@@ -608,21 +645,42 @@ static int __devinit mal_probe(struct of_device *ofdev,
 sizeof(struct mal_descriptor) *
 mal_rx_bd_offset(mal, i));
 
-   err = request_irq(mal->serr_irq, mal_serr, 0, "MAL SERR", mal);
-   if (err)
-   goto fail2;
-   err = request_irq(mal->txde_irq, mal_txde, 0, "MAL TX DE", mal);
-   if (err)
-   goto fail3;
-   err = request_irq(mal->txeob_irq, mal_txeob, 0, "MAL TX EOB", mal);
-   if (err)
-   goto fail4;
-   err = request_irq(mal->rxde_irq, mal_rxde, 0, "MAL RX DE", mal);
-   if (err)
-   goto fail5;
-   err = request_irq(mal->rxeob_irq, mal_rxeob, 0, "MAL RX EOB", mal);
-   if (err)
-   goto fail6;
+   if (mal_has_feature(mal, MAL_FTR_COMMON_ERR_INT)) {
+   err = request_irq(mal->serr_irq, mal_int, IRQF_SHARED,
+   "MAL SERR", mal);
+   if (err)
+