wOn 09/23/2010 10:29 AM, [email protected] wrote:
> From: David Jander <[email protected]>
> 
> This patch drastically reduces the amount of SPI transactions needed in
> the ISR of the driver. This can have a significant performance impact.

My git has found a trailing whitespace (see inline).

I'm going to test it now,

cheers, Marc

> Signed-off-by: David Jander <[email protected]>
> ---
>  drivers/net/can/mcp251x.c |   42 ++++++++++++++++++++++++++++++++++--------
>  1 files changed, 34 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c
> index b11a0cb..32037d8 100644
> --- a/drivers/net/can/mcp251x.c
> +++ b/drivers/net/can/mcp251x.c
> @@ -319,6 +319,20 @@ static u8 mcp251x_read_reg(struct spi_device *spi, 
> uint8_t reg)
>       return val;
>  }
>  
> +static void mcp251x_read_2regs(struct spi_device *spi, uint8_t reg,
> +                            uint8_t *v1, uint8_t *v2)
> +{
> +     struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
> +
> +     priv->spi_tx_buf[0] = INSTRUCTION_READ;
> +     priv->spi_tx_buf[1] = reg;
> +
> +     mcp251x_spi_trans(spi, 4);
> +
> +     *v1 = priv->spi_rx_buf[2];
> +     *v2 = priv->spi_rx_buf[3];
> +}
> +
>  static void mcp251x_write_reg(struct spi_device *spi, u8 reg, uint8_t val)
>  {
>       struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
> @@ -330,6 +344,18 @@ static void mcp251x_write_reg(struct spi_device *spi, u8 
> reg, uint8_t val)
>       mcp251x_spi_trans(spi, 3);
>  }
>  
> +static void mcp251x_write_2regs(struct spi_device *spi, u8 reg, uint8_t v1, 
> uint8_t v2)
> +{
> +     struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
> +
> +     priv->spi_tx_buf[0] = INSTRUCTION_WRITE;
> +     priv->spi_tx_buf[1] = reg;
> +     priv->spi_tx_buf[2] = v1;
> +     priv->spi_tx_buf[3] = v2;
> +
> +     mcp251x_spi_trans(spi, 4);
> +}
> +
>  static void mcp251x_write_bits(struct spi_device *spi, u8 reg,
>                              u8 mask, uint8_t val)
>  {
> @@ -754,25 +780,23 @@ static irqreturn_t mcp251x_can_ist(int irq, void 
> *dev_id)
>       mutex_lock(&priv->mcp_lock);
>       while (!priv->force_quit) {
>               enum can_state new_state;
> -             u8 intf = mcp251x_read_reg(spi, CANINTF);
> +             u8 intf;
>               u8 eflag;
>               int can_id = 0, data1 = 0;
>  
> +             mcp251x_read_2regs(spi, CANINTF, &intf, &eflag);
> +
>               if (intf & CANINTF_RX0IF) {
>                       mcp251x_hw_rx(spi, 0);
>                       /* Free one buffer ASAP */
> -                     mcp251x_write_bits(spi, CANINTF, intf & CANINTF_RX0IF,
> -                                        0x00);
> +                     if (intf & CANINTF_RX1IF)
> +                             mcp251x_write_bits(spi, CANINTF, 
                                                               ^^^

there's a trailing whitespace

> +                                     intf & CANINTF_RX0IF, 0x00);
>               }
>  
>               if (intf & CANINTF_RX1IF)
>                       mcp251x_hw_rx(spi, 1);
>  
> -             mcp251x_write_bits(spi, CANINTF, intf, 0x00);
> -
> -             eflag = mcp251x_read_reg(spi, EFLG);
> -             mcp251x_write_reg(spi, EFLG, 0x00);
> -
>               /* Update can state */
>               if (eflag & EFLG_TXBO) {
>                       new_state = CAN_STATE_BUS_OFF;
> @@ -838,6 +862,8 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id)
>               if (intf == 0)
>                       break;
>  
> +             mcp251x_write_2regs(spi, CANINTF, 0x00, 0x00);
> +
>               if (intf & (CANINTF_TX2IF | CANINTF_TX1IF | CANINTF_TX0IF)) {
>                       net->stats.tx_packets++;
>                       net->stats.tx_bytes += priv->tx_len - 1;


-- 
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: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Socketcan-core mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/socketcan-core

Reply via email to