sl->lin_state = SLSTATE_ID_RECEIVED;
/* Is the length of data set in frame cache? */
- if (sce->frame_fl & LIN_CACHE_RESPONSE) {
+ if (sce->dlc > 0) {
sl->rx_expect += sce->dlc + 1; /* + checksum */
sl->rx_len_unknown = false;
- set_bit(SLF_MSGEVENT, &sl->flags);
wake_up(&sl->kwt_wq);
} else {
sl->rx_expect += SLLIN_DATA_MAX + 1; /* + checksum */
{
struct sllin *sl = container_of(hrtimer, struct sllin, rx_timer);
- if (sl->lin_master) {
+ /*
+ * Signal timeout when:
+ * master: We did not receive as much characters as expected
+ * slave: * we did not receive any data bytes at all
+ * * we know the length and didn't receive enough
+ */
+ if ((sl->lin_master) ||
+ (sl->rx_cnt <= SLLIN_BUFF_DATA) ||
+ ((!sl->rx_len_unknown) &&
+ (sl->rx_cnt < sl->rx_expect))) {
sllin_report_error(sl, LIN_ERR_RX_TIMEOUT);
set_bit(SLF_TMOUTEVENT, &sl->flags);
} else {
test_bit(SLF_TXEVENT, &sl->flags) ||
test_bit(SLF_TMOUTEVENT, &sl->flags) ||
test_bit(SLF_ERROR, &sl->flags) ||
+ (sl->lin_state == SLSTATE_ID_RECEIVED) ||
(((sl->lin_state == SLSTATE_IDLE) ||
- (sl->lin_state == SLSTATE_RESPONSE_WAIT) ||
- (sl->lin_state == SLSTATE_ID_RECEIVED))
+ (sl->lin_state == SLSTATE_RESPONSE_WAIT))
&& test_bit(SLF_MSGEVENT, &sl->flags)));
if (test_and_clear_bit(SLF_RXEVENT, &sl->flags)) {
spin_lock_irqsave(&sl->linfr_lock, flags);
if ((sce->frame_fl & LIN_CACHE_RESPONSE)
- && (sce->dlc > 0)
- && (test_bit(SLF_MSGEVENT, &sl->flags))) {
+ && (sce->dlc > 0)) {
int mode;
netdev_dbg(sl->dev, "Sending LIN response from linfr_cache\n");
tx_bytes = lin_dlc;
mode = SLLIN_STPMSG_RESPONLY;
- if (sl->rx_buff[SLLIN_BUFF_ID] & LIN_CHECKSUM_EXTENDED)
+ if (sce->frame_fl & LIN_CHECKSUM_EXTENDED)
mode |= SLLIN_STPMSG_CHCKSUM_ENH;
if (sllin_setup_msg(sl, mode, lin_id & LIN_ID_MASK,
sllin_send_tx_buff(sl);
}
- clear_bit(SLF_MSGEVENT, &sl->flags);
- kfree_skb(sl->tx_req_skb);
- netif_wake_queue(sl->dev);
hrtimer_start(&sl->rx_timer,
ktime_add(ktime_get(), sl->rx_timer_timeout),
HRTIMER_MODE_ABS);