Skip to content

Commit 0fe41a8

Browse files
Merge patch series "can: esd_402_pci: Do cleanup; Add one-shot mode"
Stefan Mätje <[email protected]> says: The goal of this patch series is to do some cleanup and also add the support for the one-shot mode before the next patch introduces CAN-FD support for this driver. Link: https://lore.kernel.org/all/[email protected] Signed-off-by: Marc Kleine-Budde <[email protected]>
2 parents 72e5f5a + c20ff3e commit 0fe41a8

File tree

3 files changed

+53
-45
lines changed

3 files changed

+53
-45
lines changed

drivers/net/can/esd/esd_402_pci-core.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,12 +369,13 @@ static int pci402_init_cores(struct pci_dev *pdev)
369369
SET_NETDEV_DEV(netdev, &pdev->dev);
370370

371371
priv = netdev_priv(netdev);
372+
priv->can.clock.freq = card->ov.core_frequency;
372373
priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
373374
CAN_CTRLMODE_LISTENONLY |
374375
CAN_CTRLMODE_BERR_REPORTING |
375376
CAN_CTRLMODE_CC_LEN8_DLC;
376-
377-
priv->can.clock.freq = card->ov.core_frequency;
377+
if (card->ov.features & ACC_OV_REG_FEAT_MASK_DAR)
378+
priv->can.ctrlmode_supported |= CAN_CTRLMODE_ONE_SHOT;
378379
if (card->ov.features & ACC_OV_REG_FEAT_MASK_CANFD)
379380
priv->can.bittiming_const = &pci402_bittiming_const_canfd;
380381
else

drivers/net/can/esd/esdacc.c

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
/* esdACC DLC register layout */
1818
#define ACC_DLC_DLC_MASK GENMASK(3, 0)
1919
#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! */
2023
#define ACC_DLC_TXD_FLAG BIT(5)
2124

2225
/* ecc value of esdACC equals SJA1000's ECC register */
@@ -43,23 +46,23 @@
4346

4447
static void acc_resetmode_enter(struct acc_core *core)
4548
{
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);
4851

4952
/* Read back reset mode bit to flush PCI write posting */
5053
acc_resetmode_entered(core);
5154
}
5255

5356
static void acc_resetmode_leave(struct acc_core *core)
5457
{
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);
5760

5861
/* Read back reset mode bit to flush PCI write posting */
5962
acc_resetmode_entered(core);
6063
}
6164

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,
6366
const void *data)
6467
{
6568
acc_write32_noswap(core, ACC_CORE_OF_TXFIFO_DATA_1,
@@ -172,7 +175,7 @@ int acc_open(struct net_device *netdev)
172175
struct acc_net_priv *priv = netdev_priv(netdev);
173176
struct acc_core *core = priv->core;
174177
u32 tx_fifo_status;
175-
u32 ctrl_mode;
178+
u32 ctrl;
176179
int err;
177180

178181
/* Retry to enter RESET mode if out of sync. */
@@ -187,19 +190,19 @@ int acc_open(struct net_device *netdev)
187190
if (err)
188191
return err;
189192

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;
195198

196199
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;
198201

199202
if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
200-
ctrl_mode |= ACC_REG_CONTROL_MASK_MODE_LOM;
203+
ctrl |= ACC_REG_CTRL_MASK_LOM;
201204

202-
acc_set_bits(core, ACC_CORE_OF_CTRL_MODE, ctrl_mode);
205+
acc_set_bits(core, ACC_CORE_OF_CTRL, ctrl);
203206

204207
acc_resetmode_leave(core);
205208
priv->can.state = CAN_STATE_ERROR_ACTIVE;
@@ -218,13 +221,13 @@ int acc_close(struct net_device *netdev)
218221
struct acc_net_priv *priv = netdev_priv(netdev);
219222
struct acc_core *core = priv->core;
220223

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);
228231

229232
netif_stop_queue(netdev);
230233
acc_resetmode_enter(core);
@@ -233,9 +236,9 @@ int acc_close(struct net_device *netdev)
233236
/* Mark pending TX requests to be aborted after controller restart. */
234237
acc_write32(core, ACC_CORE_OF_TX_ABORT_MASK, 0xffff);
235238

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);
239242

240243
close_candev(netdev);
241244
return 0;
@@ -249,7 +252,7 @@ netdev_tx_t acc_start_xmit(struct sk_buff *skb, struct net_device *netdev)
249252
u8 tx_fifo_head = core->tx_fifo_head;
250253
int fifo_usage;
251254
u32 acc_id;
252-
u8 acc_dlc;
255+
u32 acc_dlc;
253256

254257
if (can_dropped_invalid_skb(netdev, skb))
255258
return NETDEV_TX_OK;
@@ -274,6 +277,8 @@ netdev_tx_t acc_start_xmit(struct sk_buff *skb, struct net_device *netdev)
274277
acc_dlc = can_get_cc_dlc(cf, priv->can.ctrlmode);
275278
if (cf->can_id & CAN_RTR_FLAG)
276279
acc_dlc |= ACC_DLC_RTR_FLAG;
280+
if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
281+
acc_dlc |= ACC_DLC_SSTX_FLAG;
277282

278283
if (cf->can_id & CAN_EFF_FLAG) {
279284
acc_id = cf->can_id & CAN_EFF_MASK;

drivers/net/can/esd/esdacc.h

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
*/
3636
#define ACC_OV_REG_FEAT_MASK_CANFD BIT(27 - 16)
3737
#define ACC_OV_REG_FEAT_MASK_NEW_PSC BIT(28 - 16)
38+
#define ACC_OV_REG_FEAT_MASK_DAR BIT(30 - 16)
3839

3940
#define ACC_OV_REG_MODE_MASK_ENDIAN_LITTLE BIT(0)
4041
#define ACC_OV_REG_MODE_MASK_BM_ENABLE BIT(1)
@@ -50,7 +51,7 @@
5051
#define ACC_OV_REG_MODE_MASK_FPGA_RESET BIT(31)
5152

5253
/* esdACC CAN Core Module */
53-
#define ACC_CORE_OF_CTRL_MODE 0x0000
54+
#define ACC_CORE_OF_CTRL 0x0000
5455
#define ACC_CORE_OF_STATUS_IRQ 0x0008
5556
#define ACC_CORE_OF_BRP 0x000c
5657
#define ACC_CORE_OF_BTR 0x0010
@@ -66,21 +67,22 @@
6667
#define ACC_CORE_OF_TXFIFO_DATA_0 0x00c8
6768
#define ACC_CORE_OF_TXFIFO_DATA_1 0x00cc
6869

69-
#define ACC_REG_CONTROL_MASK_MODE_RESETMODE BIT(0)
70-
#define ACC_REG_CONTROL_MASK_MODE_LOM BIT(1)
71-
#define ACC_REG_CONTROL_MASK_MODE_STM BIT(2)
72-
#define ACC_REG_CONTROL_MASK_MODE_TRANSEN BIT(5)
73-
#define ACC_REG_CONTROL_MASK_MODE_TS BIT(6)
74-
#define ACC_REG_CONTROL_MASK_MODE_SCHEDULE BIT(7)
75-
76-
#define ACC_REG_CONTROL_MASK_IE_RXTX BIT(8)
77-
#define ACC_REG_CONTROL_MASK_IE_TXERROR BIT(9)
78-
#define ACC_REG_CONTROL_MASK_IE_ERRWARN BIT(10)
79-
#define ACC_REG_CONTROL_MASK_IE_OVERRUN BIT(11)
80-
#define ACC_REG_CONTROL_MASK_IE_TSI BIT(12)
81-
#define ACC_REG_CONTROL_MASK_IE_ERRPASS BIT(13)
82-
#define ACC_REG_CONTROL_MASK_IE_ALI BIT(14)
83-
#define ACC_REG_CONTROL_MASK_IE_BUSERR BIT(15)
70+
/* CTRL register layout */
71+
#define ACC_REG_CTRL_MASK_RESETMODE BIT(0)
72+
#define ACC_REG_CTRL_MASK_LOM BIT(1)
73+
#define ACC_REG_CTRL_MASK_STM BIT(2)
74+
#define ACC_REG_CTRL_MASK_TRANSEN BIT(5)
75+
#define ACC_REG_CTRL_MASK_TS BIT(6)
76+
#define ACC_REG_CTRL_MASK_SCHEDULE BIT(7)
77+
78+
#define ACC_REG_CTRL_MASK_IE_RXTX BIT(8)
79+
#define ACC_REG_CTRL_MASK_IE_TXERROR BIT(9)
80+
#define ACC_REG_CTRL_MASK_IE_ERRWARN BIT(10)
81+
#define ACC_REG_CTRL_MASK_IE_OVERRUN BIT(11)
82+
#define ACC_REG_CTRL_MASK_IE_TSI BIT(12)
83+
#define ACC_REG_CTRL_MASK_IE_ERRPASS BIT(13)
84+
#define ACC_REG_CTRL_MASK_IE_ALI BIT(14)
85+
#define ACC_REG_CTRL_MASK_IE_BUSERR BIT(15)
8486

8587
/* BRP and BTR register layout for CAN-Classic version */
8688
#define ACC_REG_BRP_CL_MASK_BRP GENMASK(8, 0)
@@ -300,9 +302,9 @@ static inline void acc_clear_bits(struct acc_core *core,
300302

301303
static inline int acc_resetmode_entered(struct acc_core *core)
302304
{
303-
u32 ctrl = acc_read32(core, ACC_CORE_OF_CTRL_MODE);
305+
u32 ctrl = acc_read32(core, ACC_CORE_OF_CTRL);
304306

305-
return (ctrl & ACC_REG_CONTROL_MASK_MODE_RESETMODE) != 0;
307+
return (ctrl & ACC_REG_CTRL_MASK_RESETMODE) != 0;
306308
}
307309

308310
static inline u32 acc_ov_read32(struct acc_ov *ov, unsigned short offs)

0 commit comments

Comments
 (0)