linux-can.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: can: flexcan: patch
       [not found] <14855451462460611@web29h.yandex.ru>
@ 2016-05-06 10:26 ` Marc Kleine-Budde
  2016-05-06 13:47   ` Mikhail Kofanov
  0 siblings, 1 reply; 3+ messages in thread
From: Marc Kleine-Budde @ 2016-05-06 10:26 UTC (permalink / raw)
  To: Mikhail Kofanov; +Cc: linux-can


[-- Attachment #1.1: Type: text/plain, Size: 4865 bytes --]

On 05/05/2016 05:03 PM, Mikhail Kofanov wrote:
> Hello!
> 
> There is small patch for imx flexcan driver.
> 1. Improve state change handling
> 2. add tx/rx error counter to state change error frame
> 
> Tested on imx25 based custom board.

Against which kernel version does this patch apply?

> diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
> index e2d7ded..84d1fd8 100644
> --- a/drivers/net/can/flexcan.c
> +++ b/drivers/net/can/flexcan.c
> @@ -581,11 +581,14 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr)
>         struct flexcan_priv *priv = netdev_priv(dev);
>         struct sk_buff *skb;
>         struct can_frame *cf;
> +       struct flexcan_regs __iomem *regs = priv->regs;
>         enum can_state new_state = 0, rx_state = 0, tx_state = 0;
>         int flt;
>         struct can_berr_counter bec;
>  
>         flt = reg_esr & FLEXCAN_ESR_FLT_CONF_MASK;
> +       /* always send error counters in error frame */
> +       __flexcan_get_berr_counter(dev, &bec);
>         if (likely(flt == FLEXCAN_ESR_FLT_CONF_ACTIVE)) {
>                 tx_state = unlikely(reg_esr & FLEXCAN_ESR_TX_WRN) ?
>                         CAN_STATE_ERROR_WARNING : CAN_STATE_ERROR_ACTIVE;
> @@ -593,7 +596,6 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr)
>                         CAN_STATE_ERROR_WARNING : CAN_STATE_ERROR_ACTIVE;
>                 new_state = max(tx_state, rx_state);
>         } else {
> -               __flexcan_get_berr_counter(dev, &bec);
>                 new_state = flt == FLEXCAN_ESR_FLT_CONF_PASSIVE ?
>                         CAN_STATE_ERROR_PASSIVE : CAN_STATE_BUS_OFF;
>                 rx_state = bec.rxerr >= bec.txerr ? new_state : 0;
> @@ -603,6 +605,8 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr)
>         /* state hasn't changed */
>         if (likely(new_state == priv->can.state))
>                 return 0;
> +       netdev_dbg(dev, "reg_esr=0x%x flt=0x%x ctrl=0x%08x new_state=%d\n", reg_esr, flt, flex
> +                        new_state);
>  
>         skb = alloc_can_err_skb(dev, &cf);
>         if (unlikely(!skb))
> @@ -613,6 +617,8 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr)
>         if (unlikely(new_state == CAN_STATE_BUS_OFF))
>                 can_bus_off(dev);
>  
> +       cf->data[6] = bec.txerr;
> +       cf->data[7] = bec.rxerr;
>         dev->stats.rx_packets++;
>         dev->stats.rx_bytes += cf->can_dlc;
>         netif_receive_skb(skb);
> @@ -679,7 +685,7 @@ static int flexcan_poll(struct napi_struct *napi, int quota)
>         /* The error bits are cleared on read,
>          * use saved value from irq handler.
>          */
> -       reg_esr = flexcan_read(&regs->esr) | priv->reg_esr;
> +       reg_esr = flexcan_read(&regs->esr) | (priv->reg_esr & FLEXCAN_ESR_ERR_BUS);
>  
>         /* handle state changes */
>         work_done += flexcan_poll_state(dev, reg_esr);
> @@ -721,24 +727,29 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id)
>         if (reg_esr & FLEXCAN_ESR_ALL_INT)
>                 flexcan_write(reg_esr & FLEXCAN_ESR_ALL_INT, &regs->esr);
>  
> +
>         /* schedule NAPI in case of:
>          * - rx IRQ
> -        * - state change IRQ
> +        * - tx/rx warning or bus-off
> +        * - any state change
>          * - bus error IRQ and bus error reporting is activated
>          */
>         if ((reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE) ||
>             (reg_esr & FLEXCAN_ESR_ERR_STATE) ||
> +           ((reg_esr & FLEXCAN_ESR_FLT_CONF_MASK) != (priv->reg_esr & FLEXCAN_ESR_FLT_CONF_MAS

There seems to be a problem with this mail, the rest of this line is
missing.

Marc

>             flexcan_has_and_handle_berr(priv, reg_esr)) {
>                 /* The error bits are cleared on read,
>                  * save them for later use.
>                  */
> -               priv->reg_esr = reg_esr & FLEXCAN_ESR_ERR_BUS;
> +               priv->reg_esr = reg_esr;
>                 flexcan_write(FLEXCAN_IFLAG_DEFAULT &
>                               ~FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, &regs->imask1);
>                 flexcan_write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL,
>                               &regs->ctrl);
>                 napi_schedule(&priv->napi);
>         }
> +       else
> +               priv->reg_esr = reg_esr;
>  
>         /* FIFO overflow */
>         if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_OVERFLOW) {
> 


-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: can: flexcan: patch
  2016-05-06 10:26 ` can: flexcan: patch Marc Kleine-Budde
@ 2016-05-06 13:47   ` Mikhail Kofanov
  2016-05-06 15:56     ` Marc Kleine-Budde
  0 siblings, 1 reply; 3+ messages in thread
From: Mikhail Kofanov @ 2016-05-06 13:47 UTC (permalink / raw)
  To: Marc Kleine-Budde; +Cc: linux-can

https://git.kernel.org/cgit/linux/kernel/git/mkl/linux-can-next.git/tree/?id=ffd461f80d536336811d573f197f3e6d9872d054




06.05.2016, 13:26, "Marc Kleine-Budde" <mkl@pengutronix.de>:
> On 05/05/2016 05:03 PM, Mikhail Kofanov wrote:
>>  Hello!
>>
>>  There is small patch for imx flexcan driver.
>>  1. Improve state change handling
>>  2. add tx/rx error counter to state change error frame
>>
>>  Tested on imx25 based custom board.
>
> Against which kernel version does this patch apply?
>
>>  diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
>>  index e2d7ded..84d1fd8 100644
>>  --- a/drivers/net/can/flexcan.c
>>  +++ b/drivers/net/can/flexcan.c
>>  @@ -581,11 +581,14 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr)
>>          struct flexcan_priv *priv = netdev_priv(dev);
>>          struct sk_buff *skb;
>>          struct can_frame *cf;
>>  + struct flexcan_regs __iomem *regs = priv->regs;
>>          enum can_state new_state = 0, rx_state = 0, tx_state = 0;
>>          int flt;
>>          struct can_berr_counter bec;
>>
>>          flt = reg_esr & FLEXCAN_ESR_FLT_CONF_MASK;
>>  + /* always send error counters in error frame */
>>  + __flexcan_get_berr_counter(dev, &bec);
>>          if (likely(flt == FLEXCAN_ESR_FLT_CONF_ACTIVE)) {
>>                  tx_state = unlikely(reg_esr & FLEXCAN_ESR_TX_WRN) ?
>>                          CAN_STATE_ERROR_WARNING : CAN_STATE_ERROR_ACTIVE;
>>  @@ -593,7 +596,6 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr)
>>                          CAN_STATE_ERROR_WARNING : CAN_STATE_ERROR_ACTIVE;
>>                  new_state = max(tx_state, rx_state);
>>          } else {
>>  - __flexcan_get_berr_counter(dev, &bec);
>>                  new_state = flt == FLEXCAN_ESR_FLT_CONF_PASSIVE ?
>>                          CAN_STATE_ERROR_PASSIVE : CAN_STATE_BUS_OFF;
>>                  rx_state = bec.rxerr >= bec.txerr ? new_state : 0;
>>  @@ -603,6 +605,8 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr)
>>          /* state hasn't changed */
>>          if (likely(new_state == priv->can.state))
>>                  return 0;
>>  + netdev_dbg(dev, "reg_esr=0x%x flt=0x%x ctrl=0x%08x new_state=%d\n", reg_esr, flt, flex
>>  + new_state);
>>
>>          skb = alloc_can_err_skb(dev, &cf);
>>          if (unlikely(!skb))
>>  @@ -613,6 +617,8 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr)
>>          if (unlikely(new_state == CAN_STATE_BUS_OFF))
>>                  can_bus_off(dev);
>>
>>  + cf->data[6] = bec.txerr;
>>  + cf->data[7] = bec.rxerr;
>>          dev->stats.rx_packets++;
>>          dev->stats.rx_bytes += cf->can_dlc;
>>          netif_receive_skb(skb);
>>  @@ -679,7 +685,7 @@ static int flexcan_poll(struct napi_struct *napi, int quota)
>>          /* The error bits are cleared on read,
>>           * use saved value from irq handler.
>>           */
>>  - reg_esr = flexcan_read(&regs->esr) | priv->reg_esr;
>>  + reg_esr = flexcan_read(&regs->esr) | (priv->reg_esr & FLEXCAN_ESR_ERR_BUS);
>>
>>          /* handle state changes */
>>          work_done += flexcan_poll_state(dev, reg_esr);
>>  @@ -721,24 +727,29 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id)
>>          if (reg_esr & FLEXCAN_ESR_ALL_INT)
>>                  flexcan_write(reg_esr & FLEXCAN_ESR_ALL_INT, &regs->esr);
>>
>>  +
>>          /* schedule NAPI in case of:
>>           * - rx IRQ
>>  - * - state change IRQ
>>  + * - tx/rx warning or bus-off
>>  + * - any state change
>>           * - bus error IRQ and bus error reporting is activated
>>           */
>>          if ((reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE) ||
>>              (reg_esr & FLEXCAN_ESR_ERR_STATE) ||
>>  + ((reg_esr & FLEXCAN_ESR_FLT_CONF_MASK) != (priv->reg_esr & FLEXCAN_ESR_FLT_CONF_MAS
>
> There seems to be a problem with this mail, the rest of this line is
> missing.
>
> Marc
>
>>              flexcan_has_and_handle_berr(priv, reg_esr)) {
>>                  /* The error bits are cleared on read,
>>                   * save them for later use.
>>                   */
>>  - priv->reg_esr = reg_esr & FLEXCAN_ESR_ERR_BUS;
>>  + priv->reg_esr = reg_esr;
>>                  flexcan_write(FLEXCAN_IFLAG_DEFAULT &
>>                                ~FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, &regs->imask1);
>>                  flexcan_write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL,
>>                                &regs->ctrl);
>>                  napi_schedule(&priv->napi);
>>          }
>>  + else
>>  + priv->reg_esr = reg_esr;
>>
>>          /* FIFO overflow */
>>          if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_OVERFLOW) {
>
> --
> Pengutronix e.K. | Marc Kleine-Budde |
> Industrial Linux Solutions | Phone: +49-231-2826-924 |
> Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
> Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: can: flexcan: patch
  2016-05-06 13:47   ` Mikhail Kofanov
@ 2016-05-06 15:56     ` Marc Kleine-Budde
  0 siblings, 0 replies; 3+ messages in thread
From: Marc Kleine-Budde @ 2016-05-06 15:56 UTC (permalink / raw)
  To: Mikhail Kofanov; +Cc: linux-can


[-- Attachment #1.1: Type: text/plain, Size: 1115 bytes --]

On 05/06/2016 03:47 PM, Mikhail Kofanov wrote:
> https://git.kernel.org/cgit/linux/kernel/git/mkl/linux-can-next.git/tree/?id=ffd461f80d536336811d573f197f3e6d9872d054

The patch does not apply, as your mailer converted all tabs to spaces
and capped long lines....See below:

>>>          /* schedule NAPI in case of:
>>>           * - rx IRQ
>>>  - * - state change IRQ
>>>  + * - tx/rx warning or bus-off
>>>  + * - any state change
>>>           * - bus error IRQ and bus error reporting is activated
>>>           */
>>>          if ((reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE) ||
>>>              (reg_esr & FLEXCAN_ESR_ERR_STATE) ||
>>>  + ((reg_esr & FLEXCAN_ESR_FLT_CONF_MASK) != (priv->reg_esr & FLEXCAN_ESR_FLT_CONF_MAS

There seems to be a problem with this mail, the rest of this line is
missing.

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-05-06 15:56 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <14855451462460611@web29h.yandex.ru>
2016-05-06 10:26 ` can: flexcan: patch Marc Kleine-Budde
2016-05-06 13:47   ` Mikhail Kofanov
2016-05-06 15:56     ` Marc Kleine-Budde

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).