|
@@ -187,7 +187,8 @@
|
|
*/
|
|
*/
|
|
#define FLEXCAN_QUIRK_BROKEN_ERR_STATE BIT(1) /* [TR]WRN_INT not connected */
|
|
#define FLEXCAN_QUIRK_BROKEN_ERR_STATE BIT(1) /* [TR]WRN_INT not connected */
|
|
#define FLEXCAN_QUIRK_DISABLE_RXFG BIT(2) /* Disable RX FIFO Global mask */
|
|
#define FLEXCAN_QUIRK_DISABLE_RXFG BIT(2) /* Disable RX FIFO Global mask */
|
|
-#define FLEXCAN_QUIRK_DISABLE_MECR BIT(3) /* Disble Memory error detection */
|
|
|
|
|
|
+#define FLEXCAN_QUIRK_ENABLE_EACEN_RRS BIT(3) /* Enable EACEN and RRS bit in ctrl2 */
|
|
|
|
+#define FLEXCAN_QUIRK_DISABLE_MECR BIT(4) /* Disble Memory error detection */
|
|
|
|
|
|
/* Structure of the message buffer */
|
|
/* Structure of the message buffer */
|
|
struct flexcan_mb {
|
|
struct flexcan_mb {
|
|
@@ -276,11 +277,12 @@ static const struct flexcan_devtype_data fsl_p1010_devtype_data = {
|
|
static const struct flexcan_devtype_data fsl_imx28_devtype_data;
|
|
static const struct flexcan_devtype_data fsl_imx28_devtype_data;
|
|
|
|
|
|
static const struct flexcan_devtype_data fsl_imx6q_devtype_data = {
|
|
static const struct flexcan_devtype_data fsl_imx6q_devtype_data = {
|
|
- .quirks = FLEXCAN_QUIRK_DISABLE_RXFG,
|
|
|
|
|
|
+ .quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct flexcan_devtype_data fsl_vf610_devtype_data = {
|
|
static const struct flexcan_devtype_data fsl_vf610_devtype_data = {
|
|
- .quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_DISABLE_MECR,
|
|
|
|
|
|
+ .quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS |
|
|
|
|
+ FLEXCAN_QUIRK_DISABLE_MECR,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct can_bittiming_const flexcan_bittiming_const = {
|
|
static const struct can_bittiming_const flexcan_bittiming_const = {
|
|
@@ -825,6 +827,12 @@ static int flexcan_chip_start(struct net_device *dev)
|
|
netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl);
|
|
netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl);
|
|
flexcan_write(reg_ctrl, ®s->ctrl);
|
|
flexcan_write(reg_ctrl, ®s->ctrl);
|
|
|
|
|
|
|
|
+ if ((priv->devtype_data->quirks & FLEXCAN_QUIRK_ENABLE_EACEN_RRS)) {
|
|
|
|
+ reg_ctrl2 = flexcan_read(®s->ctrl2);
|
|
|
|
+ reg_ctrl2 |= FLEXCAN_CTRL2_EACEN | FLEXCAN_CTRL2_RRS;
|
|
|
|
+ flexcan_write(reg_ctrl2, ®s->ctrl2);
|
|
|
|
+ }
|
|
|
|
+
|
|
/* clear and invalidate all mailboxes first */
|
|
/* clear and invalidate all mailboxes first */
|
|
for (i = priv->tx_mb_idx; i < ARRAY_SIZE(regs->mb); i++) {
|
|
for (i = priv->tx_mb_idx; i < ARRAY_SIZE(regs->mb); i++) {
|
|
flexcan_write(FLEXCAN_MB_CODE_RX_INACTIVE,
|
|
flexcan_write(FLEXCAN_MB_CODE_RX_INACTIVE,
|