Skip to content

Commit bb43fb6

Browse files
linosanfilippo-kunbusl1k
authored andcommitted
pibridge-serdev: Use tracing macros in pibridge implementation
Use the pibridge tracing macros to trace - packet headers - packet data - CRC - expired timeouts - wakeup For this reason slightly modify the implemenation in pibridge_discard_timeout() and pibridge_recv_timeout(). Furthermore use a wrapper function around serdev_device_write_wakeup() that allows placing a tracepoint for a wakeup-write event. Signed-off-by: Lino Sanfilippo <l.sanfilippo@kunbus.com>
1 parent c0b007b commit bb43fb6

1 file changed

Lines changed: 60 additions & 13 deletions

File tree

drivers/tty/serdev/pibridge.c

Lines changed: 60 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
#include "pibridge.h"
1111

12+
#define CREATE_TRACE_POINTS
13+
#include "pibridge_trace.h"
14+
1215
#define PIBRIDGE_BAUDRATE 115200
1316
#define PIBRIDGE_IO_TIMEOUT 10 // msec
1417
#define PIBRIDGE_BC_ADDR 0xff
@@ -45,6 +48,7 @@ static int pibridge_receive_buf(struct serdev_device *serdev,
4548
ret = kfifo_in(&pi->read_fifo, buf, count);
4649
mutex_unlock(&pi->lock);
4750

51+
trace_pibridge_wakeup_receive_buffer(buf, count);
4852
wake_up(&pi->read_queue);
4953

5054
if (ret < count)
@@ -54,9 +58,15 @@ static int pibridge_receive_buf(struct serdev_device *serdev,
5458
return ret;
5559
}
5660

61+
static void pibridge_write_wakeup(struct serdev_device *serdev)
62+
{
63+
trace_pibridge_wakeup_write(serdev);
64+
serdev_device_write_wakeup(serdev);
65+
}
66+
5767
static const struct serdev_device_ops pibridge_serdev_ops = {
5868
.receive_buf = pibridge_receive_buf,
59-
.write_wakeup = serdev_device_write_wakeup,
69+
.write_wakeup = pibridge_write_wakeup,
6070
};
6171

6272
static int pibridge_set_serial(struct serdev_device *serdev)
@@ -70,20 +80,24 @@ static int pibridge_set_serial(struct serdev_device *serdev)
7080
static int pibridge_discard_timeout(u16 len, u16 timeout)
7181
{
7282
struct pibridge *pi = pibridge_s;
73-
int ret;
83+
unsigned int discarded;
84+
int ret = 0;
7485

7586
wait_event_timeout(pi->read_queue,
7687
kfifo_len(&pi->read_fifo) >= len,
7788
msecs_to_jiffies(timeout) + 1);
7889

7990
mutex_lock(&pi->lock);
80-
if (kfifo_len(&pi->read_fifo) >= len)
81-
ret = 0;
82-
else
83-
ret = -1;
91+
discarded = kfifo_len(&pi->read_fifo);
92+
trace_pibridge_discard_data(&pi->read_fifo);
8493
kfifo_reset(&pi->read_fifo);
8594
mutex_unlock(&pi->lock);
8695

96+
if (discarded < len) {
97+
trace_pibridge_discard_timeout(discarded, len, timeout);
98+
ret = -1;
99+
}
100+
87101
return ret;
88102
}
89103

@@ -143,9 +157,13 @@ int pibridge_send(void *buf, u8 len)
143157
struct serdev_device *serdev = pi->serdev;
144158
int ret;
145159

160+
trace_pibridge_send_begin(buf, len);
161+
146162
ret = serdev_device_write(serdev, buf, len, MAX_SCHEDULE_TIMEOUT);
147163
serdev_device_wait_until_sent(serdev, 0);
148164

165+
trace_pibridge_send_end(ret);
166+
149167
return ret;
150168
}
151169
EXPORT_SYMBOL(pibridge_send);
@@ -161,19 +179,25 @@ EXPORT_SYMBOL(pibridge_clear_fifo);
161179
int pibridge_recv_timeout(void *buf, u8 len, u16 timeout)
162180
{
163181
struct pibridge *pi = pibridge_s;
164-
int ret;
182+
unsigned int received;
183+
int ret = len;
165184

166-
wait_event_timeout(pi->read_queue,
167-
kfifo_len(&pi->read_fifo) >= len,
185+
trace_pibridge_receive_begin(len);
186+
187+
wait_event_timeout(pi->read_queue, kfifo_len(&pi->read_fifo) >= len,
168188
msecs_to_jiffies(timeout) + 1);
169189

170190
mutex_lock(&pi->lock);
171-
if (kfifo_len(&pi->read_fifo) >= len)
172-
ret = kfifo_out(&pi->read_fifo, buf, len);
173-
else
174-
ret = 0;
191+
received = kfifo_out(&pi->read_fifo, buf, len);
175192
mutex_unlock(&pi->lock);
176193

194+
trace_pibridge_receive_end(buf, received);
195+
196+
if (received != len) {
197+
trace_pibridge_receive_timeout(received, len, timeout);
198+
ret = 0;
199+
}
200+
177201
return ret;
178202
}
179203
EXPORT_SYMBOL(pibridge_recv_timeout);
@@ -196,12 +220,16 @@ int pibridge_req_send_gate(u8 dst, u16 cmd, void *snd_buf, u8 snd_len)
196220
pkthdr.cmd = cmd;
197221
pkthdr.len = snd_len;
198222

223+
trace_pibridge_send_gate_header(&pkthdr);
224+
199225
if (pibridge_send(&pkthdr, sizeof(pkthdr)) < 0) {
200226
dev_warn_ratelimited(&pibridge_s->serdev->dev,
201227
"send head error in gate-send\n");
202228
return -EIO;
203229
}
204230
if (snd_len != 0) {
231+
trace_pibridge_send_gate_data(snd_buf, snd_len);
232+
205233
if (pibridge_send(snd_buf, snd_len) < 0) {
206234
dev_warn_ratelimited(&pibridge_s->serdev->dev,
207235
"send data error in gate-send(len: %d)\n", snd_len);
@@ -214,6 +242,8 @@ int pibridge_req_send_gate(u8 dst, u16 cmd, void *snd_buf, u8 snd_len)
214242
if (snd_len != 0)
215243
crc = pibridge_crc8(crc, snd_buf, snd_len);
216244

245+
trace_pibridge_send_gate_crc(crc);
246+
217247
if (pibridge_send(&crc, sizeof(u8)) < 0) {
218248
dev_warn_ratelimited(&pibridge_s->serdev->dev,
219249
"send crc error in gate-send\n");
@@ -254,6 +284,8 @@ int pibridge_req_gate_tmt(u8 dst, u16 cmd, void *snd_buf, u8 snd_len,
254284
return -EIO;
255285
}
256286

287+
trace_pibridge_receive_gate_header(&pkthdr);
288+
257289
crc = pibridge_crc8(0, &pkthdr, sizeof(pkthdr));
258290

259291
to_receive = min(pkthdr.len, rcv_len);
@@ -266,6 +298,7 @@ int pibridge_req_gate_tmt(u8 dst, u16 cmd, void *snd_buf, u8 snd_len,
266298
to_receive);
267299
return -EIO;
268300
}
301+
trace_pibridge_receive_gate_data(rcv_buf, to_receive);
269302
crc = pibridge_crc8(crc, rcv_buf, to_receive);
270303
}
271304

@@ -290,6 +323,8 @@ int pibridge_req_gate_tmt(u8 dst, u16 cmd, void *snd_buf, u8 snd_len,
290323
return -EIO;
291324
}
292325

326+
trace_pibridge_receive_gate_crc(crc_rcv, crc);
327+
293328
if (crc != crc_rcv) {
294329
dev_warn_ratelimited(&pibridge_s->serdev->dev,
295330
"invalid checksum (expected: 0x%02x, got 0x%02x\n",
@@ -349,13 +384,17 @@ int pibridge_req_send_io(u8 addr, u8 cmd, void *snd_buf, u8 snd_len)
349384
pkthdr.cmd = cmd;
350385
pkthdr.len = snd_len;
351386

387+
trace_pibridge_send_io_header(&pkthdr);
388+
352389
if (pibridge_send(&pkthdr, sizeof(pkthdr)) < 0) {
353390
dev_warn_ratelimited(&pibridge_s->serdev->dev,
354391
"send head error in io-send(len: %zd)\n", sizeof(pkthdr));
355392
return -EIO;
356393
}
357394

358395
if (snd_len != 0) {
396+
trace_pibridge_send_io_data(snd_buf, snd_len);
397+
359398
if (pibridge_send(snd_buf, snd_len) < 0) {
360399
dev_warn_ratelimited(&pibridge_s->serdev->dev,
361400
"send data error in io-send(len: %d)\n",
@@ -366,6 +405,8 @@ int pibridge_req_send_io(u8 addr, u8 cmd, void *snd_buf, u8 snd_len)
366405
crc = pibridge_crc8(0, &pkthdr, sizeof(pkthdr));
367406
crc = pibridge_crc8(crc, snd_buf, snd_len);
368407

408+
trace_pibridge_send_io_crc(crc);
409+
369410
if (pibridge_send(&crc, sizeof(u8)) < 0) {
370411
dev_warn_ratelimited(&pibridge_s->serdev->dev,
371412
"send crc error in io-send\n");
@@ -400,6 +441,9 @@ int pibridge_req_io(u8 addr, u8 cmd, void *snd_buf, u8 snd_len, void *rcv_buf,
400441
"receive head error in io-req\n");
401442
return -EIO;
402443
}
444+
445+
trace_pibridge_receive_io_header(&pkthdr);
446+
403447
crc = pibridge_crc8(0, &pkthdr, sizeof(pkthdr));
404448

405449
to_receive = min((u8) pkthdr.len, rcv_len);
@@ -412,6 +456,7 @@ int pibridge_req_io(u8 addr, u8 cmd, void *snd_buf, u8 snd_len, void *rcv_buf,
412456
to_receive);
413457
return -EIO;
414458
}
459+
trace_pibridge_receive_io_data(rcv_buf, to_receive);
415460
crc = pibridge_crc8(crc, rcv_buf, to_receive);
416461
}
417462

@@ -437,6 +482,8 @@ int pibridge_req_io(u8 addr, u8 cmd, void *snd_buf, u8 snd_len, void *rcv_buf,
437482
return -EIO;
438483
}
439484

485+
trace_pibridge_receive_io_crc(crc_rcv, crc);
486+
440487
if (crc != crc_rcv) {
441488
dev_warn_ratelimited(&pibridge_s->serdev->dev,
442489
"invalid checksum (expected: 0x%02x, got 0x%02x\n",

0 commit comments

Comments
 (0)