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+
5767static 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
6272static int pibridge_set_serial (struct serdev_device * serdev )
@@ -70,20 +80,24 @@ static int pibridge_set_serial(struct serdev_device *serdev)
7080static 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}
151169EXPORT_SYMBOL (pibridge_send );
@@ -161,19 +179,25 @@ EXPORT_SYMBOL(pibridge_clear_fifo);
161179int 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}
179203EXPORT_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