aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/can/c_can/c_can.c28
-rw-r--r--drivers/net/can/c_can/c_can.h28
2 files changed, 29 insertions, 27 deletions
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
index 8ea1379a398b..1e75223d614f 100644
--- a/drivers/net/can/c_can/c_can.c
+++ b/drivers/net/can/c_can/c_can.c
@@ -145,33 +145,6 @@
145#define IF_RX 0 145#define IF_RX 0
146#define IF_TX 1 146#define IF_TX 1
147 147
148/*
149 * IFx register masks:
150 * allow easy operation on 16-bit registers when the
151 * argument is 32-bit instead
152 */
153#define IFX_WRITE_LOW_16BIT(x) ((x) & 0xFFFF)
154#define IFX_WRITE_HIGH_16BIT(x) (((x) & 0xFFFF0000) >> 16)
155
156/* message object split */
157#define C_CAN_NO_OF_OBJECTS 32
158#define C_CAN_MSG_OBJ_RX_NUM 16
159#define C_CAN_MSG_OBJ_TX_NUM 16
160
161#define C_CAN_MSG_OBJ_RX_FIRST 1
162#define C_CAN_MSG_OBJ_RX_LAST (C_CAN_MSG_OBJ_RX_FIRST + \
163 C_CAN_MSG_OBJ_RX_NUM - 1)
164
165#define C_CAN_MSG_OBJ_TX_FIRST (C_CAN_MSG_OBJ_RX_LAST + 1)
166#define C_CAN_MSG_OBJ_TX_LAST (C_CAN_MSG_OBJ_TX_FIRST + \
167 C_CAN_MSG_OBJ_TX_NUM - 1)
168
169#define C_CAN_MSG_OBJ_RX_SPLIT 9
170#define C_CAN_MSG_RX_LOW_LAST (C_CAN_MSG_OBJ_RX_SPLIT - 1)
171
172#define C_CAN_NEXT_MSG_OBJ_MASK (C_CAN_MSG_OBJ_TX_NUM - 1)
173#define RECEIVE_OBJECT_BITS 0x0000ffff
174
175/* status interrupt */ 148/* status interrupt */
176#define STATUS_INTERRUPT 0x8000 149#define STATUS_INTERRUPT 0x8000
177 150
@@ -537,6 +510,7 @@ static netdev_tx_t c_can_start_xmit(struct sk_buff *skb,
537 510
538 /* prepare message object for transmission */ 511 /* prepare message object for transmission */
539 c_can_write_msg_object(dev, IF_TX, frame, msg_obj_no); 512 c_can_write_msg_object(dev, IF_TX, frame, msg_obj_no);
513 priv->dlc[msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST] = frame->can_dlc;
540 can_put_echo_skb(skb, dev, msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST); 514 can_put_echo_skb(skb, dev, msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST);
541 515
542 /* 516 /*
diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h
index 5097c802a61e..faa8404162b3 100644
--- a/drivers/net/can/c_can/c_can.h
+++ b/drivers/net/can/c_can/c_can.h
@@ -22,6 +22,33 @@
22#ifndef C_CAN_H 22#ifndef C_CAN_H
23#define C_CAN_H 23#define C_CAN_H
24 24
25/*
26 * IFx register masks:
27 * allow easy operation on 16-bit registers when the
28 * argument is 32-bit instead
29 */
30#define IFX_WRITE_LOW_16BIT(x) ((x) & 0xFFFF)
31#define IFX_WRITE_HIGH_16BIT(x) (((x) & 0xFFFF0000) >> 16)
32
33/* message object split */
34#define C_CAN_NO_OF_OBJECTS 32
35#define C_CAN_MSG_OBJ_RX_NUM 16
36#define C_CAN_MSG_OBJ_TX_NUM 16
37
38#define C_CAN_MSG_OBJ_RX_FIRST 1
39#define C_CAN_MSG_OBJ_RX_LAST (C_CAN_MSG_OBJ_RX_FIRST + \
40 C_CAN_MSG_OBJ_RX_NUM - 1)
41
42#define C_CAN_MSG_OBJ_TX_FIRST (C_CAN_MSG_OBJ_RX_LAST + 1)
43#define C_CAN_MSG_OBJ_TX_LAST (C_CAN_MSG_OBJ_TX_FIRST + \
44 C_CAN_MSG_OBJ_TX_NUM - 1)
45
46#define C_CAN_MSG_OBJ_RX_SPLIT 9
47#define C_CAN_MSG_RX_LOW_LAST (C_CAN_MSG_OBJ_RX_SPLIT - 1)
48
49#define C_CAN_NEXT_MSG_OBJ_MASK (C_CAN_MSG_OBJ_TX_NUM - 1)
50#define RECEIVE_OBJECT_BITS 0x0000ffff
51
25enum reg { 52enum reg {
26 C_CAN_CTRL_REG = 0, 53 C_CAN_CTRL_REG = 0,
27 C_CAN_CTRL_EX_REG, 54 C_CAN_CTRL_EX_REG,
@@ -173,6 +200,7 @@ struct c_can_priv {
173 u32 __iomem *raminit_ctrlreg; 200 u32 __iomem *raminit_ctrlreg;
174 unsigned int instance; 201 unsigned int instance;
175 void (*raminit) (const struct c_can_priv *priv, bool enable); 202 void (*raminit) (const struct c_can_priv *priv, bool enable);
203 u32 dlc[C_CAN_MSG_OBJ_TX_NUM];
176}; 204};
177 205
178struct net_device *alloc_c_can_dev(void); 206struct net_device *alloc_c_can_dev(void);