17
17
/* esdACC DLC register layout */
18
18
#define ACC_DLC_DLC_MASK GENMASK(3, 0)
19
19
#define ACC_DLC_RTR_FLAG BIT(4)
20
+ #define ACC_DLC_SSTX_FLAG BIT(24) /* Single Shot TX */
21
+
22
+ /* esdACC DLC in struct acc_bmmsg_rxtxdone::acc_dlc.len only! */
20
23
#define ACC_DLC_TXD_FLAG BIT(5)
21
24
22
25
/* ecc value of esdACC equals SJA1000's ECC register */
43
46
44
47
static void acc_resetmode_enter (struct acc_core * core )
45
48
{
46
- acc_set_bits (core , ACC_CORE_OF_CTRL_MODE ,
47
- ACC_REG_CONTROL_MASK_MODE_RESETMODE );
49
+ acc_set_bits (core , ACC_CORE_OF_CTRL ,
50
+ ACC_REG_CTRL_MASK_RESETMODE );
48
51
49
52
/* Read back reset mode bit to flush PCI write posting */
50
53
acc_resetmode_entered (core );
51
54
}
52
55
53
56
static void acc_resetmode_leave (struct acc_core * core )
54
57
{
55
- acc_clear_bits (core , ACC_CORE_OF_CTRL_MODE ,
56
- ACC_REG_CONTROL_MASK_MODE_RESETMODE );
58
+ acc_clear_bits (core , ACC_CORE_OF_CTRL ,
59
+ ACC_REG_CTRL_MASK_RESETMODE );
57
60
58
61
/* Read back reset mode bit to flush PCI write posting */
59
62
acc_resetmode_entered (core );
60
63
}
61
64
62
- static void acc_txq_put (struct acc_core * core , u32 acc_id , u8 acc_dlc ,
65
+ static void acc_txq_put (struct acc_core * core , u32 acc_id , u32 acc_dlc ,
63
66
const void * data )
64
67
{
65
68
acc_write32_noswap (core , ACC_CORE_OF_TXFIFO_DATA_1 ,
@@ -172,7 +175,7 @@ int acc_open(struct net_device *netdev)
172
175
struct acc_net_priv * priv = netdev_priv (netdev );
173
176
struct acc_core * core = priv -> core ;
174
177
u32 tx_fifo_status ;
175
- u32 ctrl_mode ;
178
+ u32 ctrl ;
176
179
int err ;
177
180
178
181
/* Retry to enter RESET mode if out of sync. */
@@ -187,19 +190,19 @@ int acc_open(struct net_device *netdev)
187
190
if (err )
188
191
return err ;
189
192
190
- ctrl_mode = ACC_REG_CONTROL_MASK_IE_RXTX |
191
- ACC_REG_CONTROL_MASK_IE_TXERROR |
192
- ACC_REG_CONTROL_MASK_IE_ERRWARN |
193
- ACC_REG_CONTROL_MASK_IE_OVERRUN |
194
- ACC_REG_CONTROL_MASK_IE_ERRPASS ;
193
+ ctrl = ACC_REG_CTRL_MASK_IE_RXTX |
194
+ ACC_REG_CTRL_MASK_IE_TXERROR |
195
+ ACC_REG_CTRL_MASK_IE_ERRWARN |
196
+ ACC_REG_CTRL_MASK_IE_OVERRUN |
197
+ ACC_REG_CTRL_MASK_IE_ERRPASS ;
195
198
196
199
if (priv -> can .ctrlmode & CAN_CTRLMODE_BERR_REPORTING )
197
- ctrl_mode |= ACC_REG_CONTROL_MASK_IE_BUSERR ;
200
+ ctrl |= ACC_REG_CTRL_MASK_IE_BUSERR ;
198
201
199
202
if (priv -> can .ctrlmode & CAN_CTRLMODE_LISTENONLY )
200
- ctrl_mode |= ACC_REG_CONTROL_MASK_MODE_LOM ;
203
+ ctrl |= ACC_REG_CTRL_MASK_LOM ;
201
204
202
- acc_set_bits (core , ACC_CORE_OF_CTRL_MODE , ctrl_mode );
205
+ acc_set_bits (core , ACC_CORE_OF_CTRL , ctrl );
203
206
204
207
acc_resetmode_leave (core );
205
208
priv -> can .state = CAN_STATE_ERROR_ACTIVE ;
@@ -218,13 +221,13 @@ int acc_close(struct net_device *netdev)
218
221
struct acc_net_priv * priv = netdev_priv (netdev );
219
222
struct acc_core * core = priv -> core ;
220
223
221
- acc_clear_bits (core , ACC_CORE_OF_CTRL_MODE ,
222
- ACC_REG_CONTROL_MASK_IE_RXTX |
223
- ACC_REG_CONTROL_MASK_IE_TXERROR |
224
- ACC_REG_CONTROL_MASK_IE_ERRWARN |
225
- ACC_REG_CONTROL_MASK_IE_OVERRUN |
226
- ACC_REG_CONTROL_MASK_IE_ERRPASS |
227
- ACC_REG_CONTROL_MASK_IE_BUSERR );
224
+ acc_clear_bits (core , ACC_CORE_OF_CTRL ,
225
+ ACC_REG_CTRL_MASK_IE_RXTX |
226
+ ACC_REG_CTRL_MASK_IE_TXERROR |
227
+ ACC_REG_CTRL_MASK_IE_ERRWARN |
228
+ ACC_REG_CTRL_MASK_IE_OVERRUN |
229
+ ACC_REG_CTRL_MASK_IE_ERRPASS |
230
+ ACC_REG_CTRL_MASK_IE_BUSERR );
228
231
229
232
netif_stop_queue (netdev );
230
233
acc_resetmode_enter (core );
@@ -233,9 +236,9 @@ int acc_close(struct net_device *netdev)
233
236
/* Mark pending TX requests to be aborted after controller restart. */
234
237
acc_write32 (core , ACC_CORE_OF_TX_ABORT_MASK , 0xffff );
235
238
236
- /* ACC_REG_CONTROL_MASK_MODE_LOM is only accessible in RESET mode */
237
- acc_clear_bits (core , ACC_CORE_OF_CTRL_MODE ,
238
- ACC_REG_CONTROL_MASK_MODE_LOM );
239
+ /* ACC_REG_CTRL_MASK_LOM is only accessible in RESET mode */
240
+ acc_clear_bits (core , ACC_CORE_OF_CTRL ,
241
+ ACC_REG_CTRL_MASK_LOM );
239
242
240
243
close_candev (netdev );
241
244
return 0 ;
@@ -249,7 +252,7 @@ netdev_tx_t acc_start_xmit(struct sk_buff *skb, struct net_device *netdev)
249
252
u8 tx_fifo_head = core -> tx_fifo_head ;
250
253
int fifo_usage ;
251
254
u32 acc_id ;
252
- u8 acc_dlc ;
255
+ u32 acc_dlc ;
253
256
254
257
if (can_dropped_invalid_skb (netdev , skb ))
255
258
return NETDEV_TX_OK ;
@@ -274,6 +277,8 @@ netdev_tx_t acc_start_xmit(struct sk_buff *skb, struct net_device *netdev)
274
277
acc_dlc = can_get_cc_dlc (cf , priv -> can .ctrlmode );
275
278
if (cf -> can_id & CAN_RTR_FLAG )
276
279
acc_dlc |= ACC_DLC_RTR_FLAG ;
280
+ if (priv -> can .ctrlmode & CAN_CTRLMODE_ONE_SHOT )
281
+ acc_dlc |= ACC_DLC_SSTX_FLAG ;
277
282
278
283
if (cf -> can_id & CAN_EFF_FLAG ) {
279
284
acc_id = cf -> can_id & CAN_EFF_MASK ;
0 commit comments