|
@@ -41,6 +41,10 @@
|
|
|
|
|
|
#include "c_can.h"
|
|
|
|
|
|
+/* Number of interface registers */
|
|
|
+#define IF_ENUM_REG_LEN 11
|
|
|
+#define C_CAN_IFACE(reg, iface) (C_CAN_IF1_##reg + (iface) * IF_ENUM_REG_LEN)
|
|
|
+
|
|
|
/* control register */
|
|
|
#define CONTROL_TEST BIT(7)
|
|
|
#define CONTROL_CCE BIT(6)
|
|
@@ -209,10 +213,10 @@ static inline int get_tx_echo_msg_obj(const struct c_can_priv *priv)
|
|
|
C_CAN_MSG_OBJ_TX_FIRST;
|
|
|
}
|
|
|
|
|
|
-static u32 c_can_read_reg32(struct c_can_priv *priv, void *reg)
|
|
|
+static u32 c_can_read_reg32(struct c_can_priv *priv, enum reg index)
|
|
|
{
|
|
|
- u32 val = priv->read_reg(priv, reg);
|
|
|
- val |= ((u32) priv->read_reg(priv, reg + 2)) << 16;
|
|
|
+ u32 val = priv->read_reg(priv, index);
|
|
|
+ val |= ((u32) priv->read_reg(priv, index + 1)) << 16;
|
|
|
return val;
|
|
|
}
|
|
|
|
|
@@ -220,14 +224,14 @@ static void c_can_enable_all_interrupts(struct c_can_priv *priv,
|
|
|
int enable)
|
|
|
{
|
|
|
unsigned int cntrl_save = priv->read_reg(priv,
|
|
|
- &priv->regs->control);
|
|
|
+ C_CAN_CTRL_REG);
|
|
|
|
|
|
if (enable)
|
|
|
cntrl_save |= (CONTROL_SIE | CONTROL_EIE | CONTROL_IE);
|
|
|
else
|
|
|
cntrl_save &= ~(CONTROL_EIE | CONTROL_IE | CONTROL_SIE);
|
|
|
|
|
|
- priv->write_reg(priv, &priv->regs->control, cntrl_save);
|
|
|
+ priv->write_reg(priv, C_CAN_CTRL_REG, cntrl_save);
|
|
|
}
|
|
|
|
|
|
static inline int c_can_msg_obj_is_busy(struct c_can_priv *priv, int iface)
|
|
@@ -235,7 +239,7 @@ static inline int c_can_msg_obj_is_busy(struct c_can_priv *priv, int iface)
|
|
|
int count = MIN_TIMEOUT_VALUE;
|
|
|
|
|
|
while (count && priv->read_reg(priv,
|
|
|
- &priv->regs->ifregs[iface].com_req) &
|
|
|
+ C_CAN_IFACE(COMREQ_REG, iface)) &
|
|
|
IF_COMR_BUSY) {
|
|
|
count--;
|
|
|
udelay(1);
|
|
@@ -258,9 +262,9 @@ static inline void c_can_object_get(struct net_device *dev,
|
|
|
* register and message RAM must be complete in 6 CAN-CLK
|
|
|
* period.
|
|
|
*/
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].com_mask,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(COMMSK_REG, iface),
|
|
|
IFX_WRITE_LOW_16BIT(mask));
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].com_req,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(COMREQ_REG, iface),
|
|
|
IFX_WRITE_LOW_16BIT(objno));
|
|
|
|
|
|
if (c_can_msg_obj_is_busy(priv, iface))
|
|
@@ -278,9 +282,9 @@ static inline void c_can_object_put(struct net_device *dev,
|
|
|
* register and message RAM must be complete in 6 CAN-CLK
|
|
|
* period.
|
|
|
*/
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].com_mask,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(COMMSK_REG, iface),
|
|
|
(IF_COMM_WR | IFX_WRITE_LOW_16BIT(mask)));
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].com_req,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(COMREQ_REG, iface),
|
|
|
IFX_WRITE_LOW_16BIT(objno));
|
|
|
|
|
|
if (c_can_msg_obj_is_busy(priv, iface))
|
|
@@ -306,18 +310,18 @@ static void c_can_write_msg_object(struct net_device *dev,
|
|
|
|
|
|
flags |= IF_ARB_MSGVAL;
|
|
|
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].arb1,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface),
|
|
|
IFX_WRITE_LOW_16BIT(id));
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].arb2, flags |
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), flags |
|
|
|
IFX_WRITE_HIGH_16BIT(id));
|
|
|
|
|
|
for (i = 0; i < frame->can_dlc; i += 2) {
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].data[i / 2],
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(DATA1_REG, iface) + i / 2,
|
|
|
frame->data[i] | (frame->data[i + 1] << 8));
|
|
|
}
|
|
|
|
|
|
/* enable interrupt for this message object */
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface),
|
|
|
IF_MCONT_TXIE | IF_MCONT_TXRQST | IF_MCONT_EOB |
|
|
|
frame->can_dlc);
|
|
|
c_can_object_put(dev, iface, objno, IF_COMM_ALL);
|
|
@@ -329,7 +333,7 @@ static inline void c_can_mark_rx_msg_obj(struct net_device *dev,
|
|
|
{
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface),
|
|
|
ctrl_mask & ~(IF_MCONT_MSGLST | IF_MCONT_INTPND));
|
|
|
c_can_object_put(dev, iface, obj, IF_COMM_CONTROL);
|
|
|
|
|
@@ -343,7 +347,7 @@ static inline void c_can_activate_all_lower_rx_msg_obj(struct net_device *dev,
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
for (i = C_CAN_MSG_OBJ_RX_FIRST; i <= C_CAN_MSG_RX_LOW_LAST; i++) {
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface),
|
|
|
ctrl_mask & ~(IF_MCONT_MSGLST |
|
|
|
IF_MCONT_INTPND | IF_MCONT_NEWDAT));
|
|
|
c_can_object_put(dev, iface, i, IF_COMM_CONTROL);
|
|
@@ -356,7 +360,7 @@ static inline void c_can_activate_rx_msg_obj(struct net_device *dev,
|
|
|
{
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface),
|
|
|
ctrl_mask & ~(IF_MCONT_MSGLST |
|
|
|
IF_MCONT_INTPND | IF_MCONT_NEWDAT));
|
|
|
c_can_object_put(dev, iface, obj, IF_COMM_CONTROL);
|
|
@@ -374,7 +378,7 @@ static void c_can_handle_lost_msg_obj(struct net_device *dev,
|
|
|
|
|
|
c_can_object_get(dev, iface, objno, IF_COMM_ALL & ~IF_COMM_TXRQST);
|
|
|
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface),
|
|
|
IF_MCONT_CLR_MSGLST);
|
|
|
|
|
|
c_can_object_put(dev, 0, objno, IF_COMM_CONTROL);
|
|
@@ -410,8 +414,8 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, int ctrl)
|
|
|
|
|
|
frame->can_dlc = get_can_dlc(ctrl & 0x0F);
|
|
|
|
|
|
- flags = priv->read_reg(priv, &priv->regs->ifregs[iface].arb2);
|
|
|
- val = priv->read_reg(priv, &priv->regs->ifregs[iface].arb1) |
|
|
|
+ flags = priv->read_reg(priv, C_CAN_IFACE(ARB2_REG, iface));
|
|
|
+ val = priv->read_reg(priv, C_CAN_IFACE(ARB1_REG, iface)) |
|
|
|
(flags << 16);
|
|
|
|
|
|
if (flags & IF_ARB_MSGXTD)
|
|
@@ -424,7 +428,7 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, int ctrl)
|
|
|
else {
|
|
|
for (i = 0; i < frame->can_dlc; i += 2) {
|
|
|
data = priv->read_reg(priv,
|
|
|
- &priv->regs->ifregs[iface].data[i / 2]);
|
|
|
+ C_CAN_IFACE(DATA1_REG, iface) + i / 2);
|
|
|
frame->data[i] = data;
|
|
|
frame->data[i + 1] = data >> 8;
|
|
|
}
|
|
@@ -444,40 +448,40 @@ static void c_can_setup_receive_object(struct net_device *dev, int iface,
|
|
|
{
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].mask1,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(MASK1_REG, iface),
|
|
|
IFX_WRITE_LOW_16BIT(mask));
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].mask2,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(MASK2_REG, iface),
|
|
|
IFX_WRITE_HIGH_16BIT(mask));
|
|
|
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].arb1,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface),
|
|
|
IFX_WRITE_LOW_16BIT(id));
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].arb2,
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface),
|
|
|
(IF_ARB_MSGVAL | IFX_WRITE_HIGH_16BIT(id)));
|
|
|
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl, mcont);
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), mcont);
|
|
|
c_can_object_put(dev, iface, objno, IF_COMM_ALL & ~IF_COMM_TXRQST);
|
|
|
|
|
|
netdev_dbg(dev, "obj no:%d, msgval:0x%08x\n", objno,
|
|
|
- c_can_read_reg32(priv, &priv->regs->msgval1));
|
|
|
+ c_can_read_reg32(priv, C_CAN_MSGVAL1_REG));
|
|
|
}
|
|
|
|
|
|
static void c_can_inval_msg_object(struct net_device *dev, int iface, int objno)
|
|
|
{
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].arb1, 0);
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].arb2, 0);
|
|
|
- priv->write_reg(priv, &priv->regs->ifregs[iface].msg_cntrl, 0);
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), 0);
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), 0);
|
|
|
+ priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), 0);
|
|
|
|
|
|
c_can_object_put(dev, iface, objno, IF_COMM_ARB | IF_COMM_CONTROL);
|
|
|
|
|
|
netdev_dbg(dev, "obj no:%d, msgval:0x%08x\n", objno,
|
|
|
- c_can_read_reg32(priv, &priv->regs->msgval1));
|
|
|
+ c_can_read_reg32(priv, C_CAN_MSGVAL1_REG));
|
|
|
}
|
|
|
|
|
|
static inline int c_can_is_next_tx_obj_busy(struct c_can_priv *priv, int objno)
|
|
|
{
|
|
|
- int val = c_can_read_reg32(priv, &priv->regs->txrqst1);
|
|
|
+ int val = c_can_read_reg32(priv, C_CAN_TXRQST1_REG);
|
|
|
|
|
|
/*
|
|
|
* as transmission request register's bit n-1 corresponds to
|
|
@@ -540,12 +544,12 @@ static int c_can_set_bittiming(struct net_device *dev)
|
|
|
netdev_info(dev,
|
|
|
"setting BTR=%04x BRPE=%04x\n", reg_btr, reg_brpe);
|
|
|
|
|
|
- ctrl_save = priv->read_reg(priv, &priv->regs->control);
|
|
|
- priv->write_reg(priv, &priv->regs->control,
|
|
|
+ ctrl_save = priv->read_reg(priv, C_CAN_CTRL_REG);
|
|
|
+ priv->write_reg(priv, C_CAN_CTRL_REG,
|
|
|
ctrl_save | CONTROL_CCE | CONTROL_INIT);
|
|
|
- priv->write_reg(priv, &priv->regs->btr, reg_btr);
|
|
|
- priv->write_reg(priv, &priv->regs->brp_ext, reg_brpe);
|
|
|
- priv->write_reg(priv, &priv->regs->control, ctrl_save);
|
|
|
+ priv->write_reg(priv, C_CAN_BTR_REG, reg_btr);
|
|
|
+ priv->write_reg(priv, C_CAN_BRPEXT_REG, reg_brpe);
|
|
|
+ priv->write_reg(priv, C_CAN_CTRL_REG, ctrl_save);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -587,36 +591,36 @@ static void c_can_chip_config(struct net_device *dev)
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
/* enable automatic retransmission */
|
|
|
- priv->write_reg(priv, &priv->regs->control,
|
|
|
+ priv->write_reg(priv, C_CAN_CTRL_REG,
|
|
|
CONTROL_ENABLE_AR);
|
|
|
|
|
|
if (priv->can.ctrlmode & (CAN_CTRLMODE_LISTENONLY &
|
|
|
CAN_CTRLMODE_LOOPBACK)) {
|
|
|
/* loopback + silent mode : useful for hot self-test */
|
|
|
- priv->write_reg(priv, &priv->regs->control, CONTROL_EIE |
|
|
|
+ priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_EIE |
|
|
|
CONTROL_SIE | CONTROL_IE | CONTROL_TEST);
|
|
|
- priv->write_reg(priv, &priv->regs->test,
|
|
|
+ priv->write_reg(priv, C_CAN_TEST_REG,
|
|
|
TEST_LBACK | TEST_SILENT);
|
|
|
} else if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) {
|
|
|
/* loopback mode : useful for self-test function */
|
|
|
- priv->write_reg(priv, &priv->regs->control, CONTROL_EIE |
|
|
|
+ priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_EIE |
|
|
|
CONTROL_SIE | CONTROL_IE | CONTROL_TEST);
|
|
|
- priv->write_reg(priv, &priv->regs->test, TEST_LBACK);
|
|
|
+ priv->write_reg(priv, C_CAN_TEST_REG, TEST_LBACK);
|
|
|
} else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) {
|
|
|
/* silent mode : bus-monitoring mode */
|
|
|
- priv->write_reg(priv, &priv->regs->control, CONTROL_EIE |
|
|
|
+ priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_EIE |
|
|
|
CONTROL_SIE | CONTROL_IE | CONTROL_TEST);
|
|
|
- priv->write_reg(priv, &priv->regs->test, TEST_SILENT);
|
|
|
+ priv->write_reg(priv, C_CAN_TEST_REG, TEST_SILENT);
|
|
|
} else
|
|
|
/* normal mode*/
|
|
|
- priv->write_reg(priv, &priv->regs->control,
|
|
|
+ priv->write_reg(priv, C_CAN_CTRL_REG,
|
|
|
CONTROL_EIE | CONTROL_SIE | CONTROL_IE);
|
|
|
|
|
|
/* configure message objects */
|
|
|
c_can_configure_msg_objects(dev);
|
|
|
|
|
|
/* set a `lec` value so that we can check for updates later */
|
|
|
- priv->write_reg(priv, &priv->regs->status, LEC_UNUSED);
|
|
|
+ priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED);
|
|
|
|
|
|
/* set bittiming params */
|
|
|
c_can_set_bittiming(dev);
|
|
@@ -669,7 +673,7 @@ static int c_can_get_berr_counter(const struct net_device *dev,
|
|
|
unsigned int reg_err_counter;
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
- reg_err_counter = priv->read_reg(priv, &priv->regs->err_cnt);
|
|
|
+ reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
|
|
|
bec->rxerr = (reg_err_counter & ERR_CNT_REC_MASK) >>
|
|
|
ERR_CNT_REC_SHIFT;
|
|
|
bec->txerr = reg_err_counter & ERR_CNT_TEC_MASK;
|
|
@@ -697,12 +701,12 @@ static void c_can_do_tx(struct net_device *dev)
|
|
|
|
|
|
for (/* nix */; (priv->tx_next - priv->tx_echo) > 0; priv->tx_echo++) {
|
|
|
msg_obj_no = get_tx_echo_msg_obj(priv);
|
|
|
- val = c_can_read_reg32(priv, &priv->regs->txrqst1);
|
|
|
+ val = c_can_read_reg32(priv, C_CAN_TXRQST1_REG);
|
|
|
if (!(val & (1 << (msg_obj_no - 1)))) {
|
|
|
can_get_echo_skb(dev,
|
|
|
msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST);
|
|
|
stats->tx_bytes += priv->read_reg(priv,
|
|
|
- &priv->regs->ifregs[0].msg_cntrl)
|
|
|
+ C_CAN_IFACE(MSGCTRL_REG, 0))
|
|
|
& IF_MCONT_DLC_MASK;
|
|
|
stats->tx_packets++;
|
|
|
c_can_inval_msg_object(dev, 0, msg_obj_no);
|
|
@@ -744,11 +748,11 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota)
|
|
|
u32 num_rx_pkts = 0;
|
|
|
unsigned int msg_obj, msg_ctrl_save;
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
- u32 val = c_can_read_reg32(priv, &priv->regs->intpnd1);
|
|
|
+ u32 val = c_can_read_reg32(priv, C_CAN_INTPND1_REG);
|
|
|
|
|
|
for (msg_obj = C_CAN_MSG_OBJ_RX_FIRST;
|
|
|
msg_obj <= C_CAN_MSG_OBJ_RX_LAST && quota > 0;
|
|
|
- val = c_can_read_reg32(priv, &priv->regs->intpnd1),
|
|
|
+ val = c_can_read_reg32(priv, C_CAN_INTPND1_REG),
|
|
|
msg_obj++) {
|
|
|
/*
|
|
|
* as interrupt pending register's bit n-1 corresponds to
|
|
@@ -758,7 +762,7 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota)
|
|
|
c_can_object_get(dev, 0, msg_obj, IF_COMM_ALL &
|
|
|
~IF_COMM_TXRQST);
|
|
|
msg_ctrl_save = priv->read_reg(priv,
|
|
|
- &priv->regs->ifregs[0].msg_cntrl);
|
|
|
+ C_CAN_IFACE(MSGCTRL_REG, 0));
|
|
|
|
|
|
if (msg_ctrl_save & IF_MCONT_EOB)
|
|
|
return num_rx_pkts;
|
|
@@ -819,7 +823,7 @@ static int c_can_handle_state_change(struct net_device *dev,
|
|
|
return 0;
|
|
|
|
|
|
c_can_get_berr_counter(dev, &bec);
|
|
|
- reg_err_counter = priv->read_reg(priv, &priv->regs->err_cnt);
|
|
|
+ reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
|
|
|
rx_err_passive = (reg_err_counter & ERR_CNT_RP_MASK) >>
|
|
|
ERR_CNT_RP_SHIFT;
|
|
|
|
|
@@ -935,7 +939,7 @@ static int c_can_handle_bus_err(struct net_device *dev,
|
|
|
}
|
|
|
|
|
|
/* set a `lec` value so that we can check for updates later */
|
|
|
- priv->write_reg(priv, &priv->regs->status, LEC_UNUSED);
|
|
|
+ priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED);
|
|
|
|
|
|
netif_receive_skb(skb);
|
|
|
stats->rx_packets++;
|
|
@@ -959,15 +963,15 @@ static int c_can_poll(struct napi_struct *napi, int quota)
|
|
|
/* status events have the highest priority */
|
|
|
if (irqstatus == STATUS_INTERRUPT) {
|
|
|
priv->current_status = priv->read_reg(priv,
|
|
|
- &priv->regs->status);
|
|
|
+ C_CAN_STS_REG);
|
|
|
|
|
|
/* handle Tx/Rx events */
|
|
|
if (priv->current_status & STATUS_TXOK)
|
|
|
- priv->write_reg(priv, &priv->regs->status,
|
|
|
+ priv->write_reg(priv, C_CAN_STS_REG,
|
|
|
priv->current_status & ~STATUS_TXOK);
|
|
|
|
|
|
if (priv->current_status & STATUS_RXOK)
|
|
|
- priv->write_reg(priv, &priv->regs->status,
|
|
|
+ priv->write_reg(priv, C_CAN_STS_REG,
|
|
|
priv->current_status & ~STATUS_RXOK);
|
|
|
|
|
|
/* handle state changes */
|
|
@@ -1033,7 +1037,7 @@ static irqreturn_t c_can_isr(int irq, void *dev_id)
|
|
|
struct net_device *dev = (struct net_device *)dev_id;
|
|
|
struct c_can_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
- priv->irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
|
|
|
+ priv->irqstatus = priv->read_reg(priv, C_CAN_INT_REG);
|
|
|
if (!priv->irqstatus)
|
|
|
return IRQ_NONE;
|
|
|
|