mirror of https://gitee.com/openkylin/linux.git
Merge branch 'fixes-for-3.6' of git://gitorious.org/linux-can/linux-can
Marc Kleine-Budde says: ==================== this patch is for the v3.6 release cycle. Benoît Locher fixed a repeated frame bug in the mcp251x driver. He implemented the workaround suggested by the errata sheet. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
463dde19a7
|
@ -83,6 +83,11 @@
|
||||||
#define INSTRUCTION_LOAD_TXB(n) (0x40 + 2 * (n))
|
#define INSTRUCTION_LOAD_TXB(n) (0x40 + 2 * (n))
|
||||||
#define INSTRUCTION_READ_RXB(n) (((n) == 0) ? 0x90 : 0x94)
|
#define INSTRUCTION_READ_RXB(n) (((n) == 0) ? 0x90 : 0x94)
|
||||||
#define INSTRUCTION_RESET 0xC0
|
#define INSTRUCTION_RESET 0xC0
|
||||||
|
#define RTS_TXB0 0x01
|
||||||
|
#define RTS_TXB1 0x02
|
||||||
|
#define RTS_TXB2 0x04
|
||||||
|
#define INSTRUCTION_RTS(n) (0x80 | ((n) & 0x07))
|
||||||
|
|
||||||
|
|
||||||
/* MPC251x registers */
|
/* MPC251x registers */
|
||||||
#define CANSTAT 0x0e
|
#define CANSTAT 0x0e
|
||||||
|
@ -397,6 +402,7 @@ static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf,
|
||||||
static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame,
|
static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame,
|
||||||
int tx_buf_idx)
|
int tx_buf_idx)
|
||||||
{
|
{
|
||||||
|
struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
|
||||||
u32 sid, eid, exide, rtr;
|
u32 sid, eid, exide, rtr;
|
||||||
u8 buf[SPI_TRANSFER_BUF_LEN];
|
u8 buf[SPI_TRANSFER_BUF_LEN];
|
||||||
|
|
||||||
|
@ -418,7 +424,10 @@ static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame,
|
||||||
buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc;
|
buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc;
|
||||||
memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc);
|
memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc);
|
||||||
mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx);
|
mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx);
|
||||||
mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx), TXBCTRL_TXREQ);
|
|
||||||
|
/* use INSTRUCTION_RTS, to avoid "repeated frame problem" */
|
||||||
|
priv->spi_tx_buf[0] = INSTRUCTION_RTS(1 << tx_buf_idx);
|
||||||
|
mcp251x_spi_trans(priv->spi, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf,
|
static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf,
|
||||||
|
|
Loading…
Reference in New Issue