- /* Response received */
- if ((sl->header_received == true) &&
- ((sl->rx_cnt >= sl->rx_expect) ||
- ((sl->rx_len_unknown == true) && (count == 0)))) {
-
- sll_bump(sl);
- pr_debug("sllin: Received LIN header & LIN response. "
- "rx_cnt = %u, rx_expect = %u\n", sl->rx_cnt,
- sl->rx_expect);
-
- /* Prepare for reception of new header */
- sl->rx_cnt = 0;
- sl->rx_expect = SLLIN_BUFF_ID + 1;
- sl->rx_len_unknown = false; /* We do know exact length of the header */
- sl->header_received = false;
+ if (sl->rx_cnt < SLLIN_BUFF_LEN) {
+ pr_debug("sllin: LIN_RX[%d]: 0x%02x\n", sl->rx_cnt, *cp);
+ sl->rx_buff[sl->rx_cnt++] = *cp++;
+ }
+
+ /* Header received */
+ if ((sl->header_received == false) && (sl->rx_cnt >= (SLLIN_BUFF_ID + 1))) {
+ unsigned long flags;
+
+ lin_id = sl->rx_buff[SLLIN_BUFF_ID] & LIN_ID_MASK;
+ sce = &sl->linfr_cache[lin_id];
+
+ spin_lock_irqsave(&sl->linfr_lock, flags);
+ /* Is the length of data set in frame cache? */
+ if (sce->frame_fl & LIN_LOC_SLAVE_CACHE) {
+ sl->rx_expect += sce->dlc;
+ sl->rx_len_unknown = false;
+ } else {
+ sl->rx_expect += SLLIN_DATA_MAX + 1; /* + checksum */
+ sl->rx_len_unknown = true;