Lines Matching refs:mc

348 static int pcan_usb_update_ts(struct pcan_usb_msg_context *mc)  in pcan_usb_update_ts()  argument
352 if ((mc->ptr+2) > mc->end) in pcan_usb_update_ts()
355 memcpy(&tmp16, mc->ptr, 2); in pcan_usb_update_ts()
357 mc->ts16 = le16_to_cpu(tmp16); in pcan_usb_update_ts()
359 if (mc->rec_idx > 0) in pcan_usb_update_ts()
360 peak_usb_update_ts_now(&mc->pdev->time_ref, mc->ts16); in pcan_usb_update_ts()
362 peak_usb_set_ts_now(&mc->pdev->time_ref, mc->ts16); in pcan_usb_update_ts()
370 static int pcan_usb_decode_ts(struct pcan_usb_msg_context *mc, u8 first_packet) in pcan_usb_decode_ts() argument
376 if ((mc->ptr + 2) > mc->end) in pcan_usb_decode_ts()
379 memcpy(&tmp16, mc->ptr, 2); in pcan_usb_decode_ts()
380 mc->ptr += 2; in pcan_usb_decode_ts()
382 mc->ts16 = le16_to_cpu(tmp16); in pcan_usb_decode_ts()
383 mc->prev_ts8 = mc->ts16 & 0x00ff; in pcan_usb_decode_ts()
387 if ((mc->ptr + 1) > mc->end) in pcan_usb_decode_ts()
390 ts8 = *mc->ptr++; in pcan_usb_decode_ts()
392 if (ts8 < mc->prev_ts8) in pcan_usb_decode_ts()
393 mc->ts16 += 0x100; in pcan_usb_decode_ts()
395 mc->ts16 &= 0xff00; in pcan_usb_decode_ts()
396 mc->ts16 |= ts8; in pcan_usb_decode_ts()
397 mc->prev_ts8 = ts8; in pcan_usb_decode_ts()
403 static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, in pcan_usb_decode_error() argument
413 if (!mc->pdev->time_ref.tick_count) in pcan_usb_decode_error()
416 new_state = mc->pdev->dev.can.state; in pcan_usb_decode_error()
418 switch (mc->pdev->dev.can.state) { in pcan_usb_decode_error()
444 mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE; in pcan_usb_decode_error()
469 mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE; in pcan_usb_decode_error()
480 if (mc->pdev->dev.can.state == new_state) in pcan_usb_decode_error()
484 skb = alloc_can_err_skb(mc->netdev, &cf); in pcan_usb_decode_error()
491 mc->pdev->dev.can.can_stats.bus_off++; in pcan_usb_decode_error()
492 can_bus_off(mc->netdev); in pcan_usb_decode_error()
499 mc->pdev->dev.can.can_stats.error_passive++; in pcan_usb_decode_error()
506 mc->pdev->dev.can.can_stats.error_warning++; in pcan_usb_decode_error()
513 mc->netdev->stats.rx_over_errors++; in pcan_usb_decode_error()
514 mc->netdev->stats.rx_errors++; in pcan_usb_decode_error()
516 new_state = mc->pdev->dev.can.state; in pcan_usb_decode_error()
520 mc->pdev->dev.can.state = new_state; in pcan_usb_decode_error()
525 peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv); in pcan_usb_decode_error()
530 mc->netdev->stats.rx_packets++; in pcan_usb_decode_error()
531 mc->netdev->stats.rx_bytes += cf->can_dlc; in pcan_usb_decode_error()
539 static int pcan_usb_decode_status(struct pcan_usb_msg_context *mc, in pcan_usb_decode_status() argument
547 if ((mc->ptr + 2) > mc->end) in pcan_usb_decode_status()
550 f = mc->ptr[PCAN_USB_CMD_FUNC]; in pcan_usb_decode_status()
551 n = mc->ptr[PCAN_USB_CMD_NUM]; in pcan_usb_decode_status()
552 mc->ptr += PCAN_USB_CMD_ARGS; in pcan_usb_decode_status()
555 int err = pcan_usb_decode_ts(mc, !mc->rec_idx); in pcan_usb_decode_status()
563 err = pcan_usb_decode_error(mc, n, status_len); in pcan_usb_decode_status()
580 if (pcan_usb_update_ts(mc)) in pcan_usb_decode_status()
587 netdev_dbg(mc->netdev, "device Tx queue full)\n"); in pcan_usb_decode_status()
590 netdev_err(mc->netdev, "unexpected function %u\n", f); in pcan_usb_decode_status()
594 if ((mc->ptr + rec_len) > mc->end) in pcan_usb_decode_status()
597 mc->ptr += rec_len; in pcan_usb_decode_status()
605 static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len) in pcan_usb_decode_data() argument
613 skb = alloc_can_skb(mc->netdev, &cf); in pcan_usb_decode_data()
620 if ((mc->ptr + 4) > mc->end) in pcan_usb_decode_data()
623 memcpy(&tmp32, mc->ptr, 4); in pcan_usb_decode_data()
624 mc->ptr += 4; in pcan_usb_decode_data()
630 if ((mc->ptr + 2) > mc->end) in pcan_usb_decode_data()
633 memcpy(&tmp16, mc->ptr, 2); in pcan_usb_decode_data()
634 mc->ptr += 2; in pcan_usb_decode_data()
642 if (pcan_usb_decode_ts(mc, !mc->rec_data_idx)) in pcan_usb_decode_data()
650 if ((mc->ptr + rec_len) > mc->end) in pcan_usb_decode_data()
653 memcpy(cf->data, mc->ptr, cf->can_dlc); in pcan_usb_decode_data()
654 mc->ptr += rec_len; in pcan_usb_decode_data()
658 peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv); in pcan_usb_decode_data()
666 mc->netdev->stats.rx_packets++; in pcan_usb_decode_data()
667 mc->netdev->stats.rx_bytes += cf->can_dlc; in pcan_usb_decode_data()
681 struct pcan_usb_msg_context mc = { in pcan_usb_decode_msg() local
690 for (err = 0; mc.rec_idx < mc.rec_cnt && !err; mc.rec_idx++) { in pcan_usb_decode_msg()
691 u8 sl = *mc.ptr++; in pcan_usb_decode_msg()
695 err = pcan_usb_decode_status(&mc, sl); in pcan_usb_decode_msg()
698 err = pcan_usb_decode_data(&mc, sl); in pcan_usb_decode_msg()
699 mc.rec_data_idx++; in pcan_usb_decode_msg()