+ case SLSTATE_ID_RECEIVED:
+ lin_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
+ sce = &sl->linfr_cache[lin_id];
+ spin_lock_irqsave(&sl->linfr_lock, flags);
+
+ if ((sce->frame_fl & LIN_CACHE_RESPONSE)
+ && (sce->dlc > 0)
+ && (test_bit(SLF_MSGEVENT, &sl->flags))) {
+ int mode;
+
+ netdev_dbg(sl->dev, "Sending LIN response from linfr_cache\n");
+
+ lin_data = sce->data;
+ lin_dlc = sce->dlc;
+ if (lin_dlc > SLLIN_DATA_MAX)
+ lin_dlc = SLLIN_DATA_MAX;
+ memcpy(lin_data_buff, lin_data, lin_dlc);
+ lin_data = lin_data_buff;
+ tx_bytes = lin_dlc;
+
+ mode = SLLIN_STPMSG_RESPONLY;
+ if (sl->rx_buff[SLLIN_BUFF_ID] & LIN_CHECKSUM_EXTENDED)
+ mode |= SLLIN_STPMSG_CHCKSUM_ENH;
+
+ if (sllin_setup_msg(sl, mode, lin_id & LIN_ID_MASK,
+ lin_data, lin_dlc) != -1) {
+
+ sl->rx_expect = sl->tx_lim;
+ sl->data_to_send = true;
+ sl->dev->stats.tx_packets++;
+ sl->dev->stats.tx_bytes += tx_bytes;
+ sl->resp_len_known = true;
+
+ if (!sl->lin_master) {
+ sl->tx_cnt = SLLIN_BUFF_DATA;
+ }
+ 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);
+ }
+ spin_unlock_irqrestore(&sl->linfr_lock, flags);
+ sl->lin_state = SLSTATE_IDLE;
+ break;
+