1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
diff --git a/sllin/sllin.c b/sllin/sllin.c
index 2db896f..2969448 100644
--- a/sllin/sllin.c
+++ b/sllin/sllin.c
@@ -869,7 +869,6 @@ static int sllin_send_tx_buff(struct sllin *sl)
#else
remains = sl->tx_lim - sl->tx_cnt;
#endif
-
res = tty->ops->write(tty, sl->tx_buff + sl->tx_cnt, remains);
if (res < 0)
goto error_in_write;
@@ -916,10 +915,25 @@ static int sllin_send_break(struct sllin *sl)
unsigned long break_baud;
int res;
+ netdev_dbg(sl->dev, "%s()#<BREAK_BY_BAUD> invoke.\n", __func__);
+ if (tty == NULL) {
+ netdev_dbg(sl->dev, "%s() tty == NULL.\n", __func__);
+ sl->lin_state = SLSTATE_IDLE;
+ return -1;
+ }
+ if (tty->ops == NULL) {
+ netdev_dbg(sl->dev, "%s() tty->ops == NULL.\n", __func__);
+ sl->lin_state = SLSTATE_IDLE;
+ return -1;
+ }
break_baud = ((sl->lin_baud * 2) / 3);
sltty_change_speed(tty, break_baud);
- tty->ops->flush_buffer(tty);
+ if (tty->ops->flush_buffer) {
+ tty->ops->flush_buffer(tty);
+ } else {
+ netdev_dbg(sl->dev, "%s() tty->ops->flush_buffer is NULL.\n", __func__);
+ }
sl->rx_cnt = SLLIN_BUFF_BREAK;
sl->rx_expect = SLLIN_BUFF_BREAK + 1;
@@ -943,6 +957,17 @@ static int sllin_send_break(struct sllin *sl)
unsigned long usleep_range_min;
unsigned long usleep_range_max;
+ netdev_dbg(sl->dev, "%s() invoke.\n", __func__);
+ if (tty == NULL) {
+ netdev_dbg(sl->dev, "%s() tty == NULL.\n", __func__);
+ sl->lin_state = SLSTATE_IDLE;
+ return -1;
+ }
+ if (tty->ops == NULL) {
+ netdev_dbg(sl->dev, "%s() tty->ops == NULL.\n", __func__);
+ sl->lin_state = SLSTATE_IDLE;
+ return -1;
+ }
break_baud = ((sl->lin_baud * 2) / 3);
sl->rx_cnt = SLLIN_BUFF_BREAK;
sl->rx_expect = SLLIN_BUFF_BREAK + 1;
@@ -950,21 +975,31 @@ static int sllin_send_break(struct sllin *sl)
/* Do the break ourselves; Inspired by
http://lxr.linux.no/#linux+v3.1.2/drivers/tty/tty_io.c#L2452 */
- retval = tty->ops->break_ctl(tty, -1);
- if (retval)
- return retval;
+ if (tty->ops->break_ctl) {
+ retval = tty->ops->break_ctl(tty, -1);
+ if (retval)
+ return retval;
+ } else {
+ netdev_dbg(sl->dev, "%s() tty->ops->break_ctl is NULL.\n", __func__);
+ }
/* udelay(712); */
usleep_range_min = (1000000l * SLLIN_SAMPLES_PER_CHAR) / break_baud;
usleep_range_max = usleep_range_min + 50;
usleep_range(usleep_range_min, usleep_range_max);
- retval = tty->ops->break_ctl(tty, 0);
+ if(tty->ops->break_ctl) {
+ retval = tty->ops->break_ctl(tty, 0);
+ }
usleep_range_min = (1000000l * 1 /* 1 bit */) / break_baud;
usleep_range_max = usleep_range_min + 30;
usleep_range(usleep_range_min, usleep_range_max);
- tty->ops->flush_buffer(tty);
+ if ( tty->ops->flush_buffer) {
+ tty->ops->flush_buffer(tty);
+ } else {
+ netdev_dbg(sl->dev, "%s() tty->ops->flush_buffer is NULL.\n", __func__);
+ }
sl->tx_cnt = SLLIN_BUFF_SYNC;
@@ -1028,6 +1063,12 @@ static int sllin_kwthread(void *ptr)
int lin_dlc;
u8 lin_data_buff[SLLIN_DATA_MAX];
+ if (sl == NULL) {
+ pr_err("sllin: sl is NULL\n");
+ }
+ if (sl->dev == NULL) {
+ pr_err("sllin: sl->dev is NULL\n");
+ }
if ((sl->lin_state == SLSTATE_IDLE) && sl->lin_master &&
sl->id_to_send) {
@@ -1036,6 +1077,7 @@ static int sllin_kwthread(void *ptr)
}
}
+ netdev_dbg(sl->dev, "sllin_kthread <WAIT_EVENT>\n");
wait_event_killable(sl->kwt_wq, kthread_should_stop() ||
test_bit(SLF_RXEVENT, &sl->flags) ||
test_bit(SLF_TXEVENT, &sl->flags) ||
@@ -1046,6 +1088,7 @@ static int sllin_kwthread(void *ptr)
(sl->lin_state == SLSTATE_RESPONSE_WAIT))
&& test_bit(SLF_MSGEVENT, &sl->flags)));
+ netdev_dbg(sl->dev, "sllin_kthread <WAKEUPED>\n");
if (test_and_clear_bit(SLF_RXEVENT, &sl->flags)) {
netdev_dbg(sl->dev, "sllin_kthread RXEVENT\n");
}
@@ -1078,21 +1121,25 @@ static int sllin_kwthread(void *ptr)
sl->lin_state = SLSTATE_IDLE;
}
+ netdev_dbg(sl->dev, "sllin_kthread: lin_state <%08x>\n",sl->lin_state);
switch (sl->lin_state) {
case SLSTATE_IDLE:
if (!test_bit(SLF_MSGEVENT, &sl->flags))
break;
-
+ if (sl->tx_req_skb == NULL)
+ netdev_dbg(sl->dev, "sl->tx_req_skb == NULL\n");
+ if (sl->tx_req_skb->data == NULL)
+ netdev_dbg(sl->dev, "sl->tx_req_skb->data == NULL\n");
cf = (struct can_frame *)sl->tx_req_skb->data;
/* SFF RTR CAN frame -> LIN header */
if (cf->can_id & CAN_RTR_FLAG) {
struct sllin_conf_entry *sce;
- netdev_dbg(sl->dev, "%s: RTR SFF CAN frame, ID = %x\n",
- __func__, cf->can_id & LIN_ID_MASK);
sce = &sl->linfr_cache[cf->can_id & LIN_ID_MASK];
+ netdev_dbg(sl->dev, "%s: RTR SFF CAN frame, ID = %x dlc=%d\n",
+ __func__, cf->can_id & LIN_ID_MASK, sce->dlc);
spin_lock_irqsave(&sl->linfr_lock, flags);
/* Is there Slave response in linfr_cache to be sent? */
@@ -1114,8 +1161,8 @@ static int sllin_kwthread(void *ptr)
spin_unlock_irqrestore(&sl->linfr_lock, flags);
} else { /* SFF NON-RTR CAN frame -> LIN header + LIN response */
- netdev_dbg(sl->dev, "%s: NON-RTR SFF CAN frame, ID = %x\n",
- __func__, (int)cf->can_id & LIN_ID_MASK);
+ netdev_dbg(sl->dev, "%s: NON-RTR SFF CAN frame, ID = %x\n dlc=%d",
+ __func__, (int)cf->can_id & LIN_ID_MASK, cf->can_dlc);
lin_data = cf->data;
lin_dlc = cf->can_dlc;
@@ -1140,6 +1187,7 @@ static int sllin_kwthread(void *ptr)
hrtimer_start(&sl->rx_timer,
ktime_add(ktime_get(), sl->rx_timer_timeout),
HRTIMER_MODE_ABS);
+ netdev_dbg(sl->dev, "sllin_kthread: SLSTATE finish\n");
break;
case SLSTATE_BREAK_SENT:
@@ -1654,3 +1702,4 @@ static void __exit sllin_exit(void)
module_init(sllin_init);
module_exit(sllin_exit);
+
|