Lines Matching full:mc
391 static int pcan_usb_update_ts(struct pcan_usb_msg_context *mc) in pcan_usb_update_ts() argument
395 if ((mc->ptr+2) > mc->end) in pcan_usb_update_ts()
398 memcpy(&tmp16, mc->ptr, 2); in pcan_usb_update_ts()
400 mc->ts16 = le16_to_cpu(tmp16); in pcan_usb_update_ts()
402 if (mc->rec_idx > 0) in pcan_usb_update_ts()
403 peak_usb_update_ts_now(&mc->pdev->time_ref, mc->ts16); in pcan_usb_update_ts()
405 peak_usb_set_ts_now(&mc->pdev->time_ref, mc->ts16); in pcan_usb_update_ts()
413 static int pcan_usb_decode_ts(struct pcan_usb_msg_context *mc, u8 first_packet) in pcan_usb_decode_ts() argument
419 if ((mc->ptr + 2) > mc->end) in pcan_usb_decode_ts()
422 memcpy(&tmp16, mc->ptr, 2); in pcan_usb_decode_ts()
423 mc->ptr += 2; in pcan_usb_decode_ts()
425 mc->ts16 = le16_to_cpu(tmp16); in pcan_usb_decode_ts()
426 mc->prev_ts8 = mc->ts16 & 0x00ff; in pcan_usb_decode_ts()
430 if ((mc->ptr + 1) > mc->end) in pcan_usb_decode_ts()
433 ts8 = *mc->ptr++; in pcan_usb_decode_ts()
435 if (ts8 < mc->prev_ts8) in pcan_usb_decode_ts()
436 mc->ts16 += 0x100; in pcan_usb_decode_ts()
438 mc->ts16 &= 0xff00; in pcan_usb_decode_ts()
439 mc->ts16 |= ts8; in pcan_usb_decode_ts()
440 mc->prev_ts8 = ts8; in pcan_usb_decode_ts()
446 static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, in pcan_usb_decode_error() argument
455 if (!mc->pdev->time_ref.tick_count) in pcan_usb_decode_error()
458 new_state = mc->pdev->dev.can.state; in pcan_usb_decode_error()
460 switch (mc->pdev->dev.can.state) { in pcan_usb_decode_error()
523 if (mc->pdev->dev.can.state == new_state) in pcan_usb_decode_error()
527 skb = alloc_can_err_skb(mc->netdev, &cf); in pcan_usb_decode_error()
534 mc->pdev->dev.can.can_stats.bus_off++; in pcan_usb_decode_error()
535 can_bus_off(mc->netdev); in pcan_usb_decode_error()
540 cf->data[1] = (mc->pdev->bec.txerr > mc->pdev->bec.rxerr) ? in pcan_usb_decode_error()
543 cf->data[6] = mc->pdev->bec.txerr; in pcan_usb_decode_error()
544 cf->data[7] = mc->pdev->bec.rxerr; in pcan_usb_decode_error()
546 mc->pdev->dev.can.can_stats.error_passive++; in pcan_usb_decode_error()
551 cf->data[1] = (mc->pdev->bec.txerr > mc->pdev->bec.rxerr) ? in pcan_usb_decode_error()
554 cf->data[6] = mc->pdev->bec.txerr; in pcan_usb_decode_error()
555 cf->data[7] = mc->pdev->bec.rxerr; in pcan_usb_decode_error()
557 mc->pdev->dev.can.can_stats.error_warning++; in pcan_usb_decode_error()
565 mc->pdev->bec.txerr = 0; in pcan_usb_decode_error()
566 mc->pdev->bec.rxerr = 0; in pcan_usb_decode_error()
572 netdev_dbg(mc->netdev, "device Tx queue full)\n"); in pcan_usb_decode_error()
575 netdev_dbg(mc->netdev, "data overrun interrupt\n"); in pcan_usb_decode_error()
578 mc->netdev->stats.rx_over_errors++; in pcan_usb_decode_error()
579 mc->netdev->stats.rx_errors++; in pcan_usb_decode_error()
582 cf->data[6] = mc->pdev->bec.txerr; in pcan_usb_decode_error()
583 cf->data[7] = mc->pdev->bec.rxerr; in pcan_usb_decode_error()
585 new_state = mc->pdev->dev.can.state; in pcan_usb_decode_error()
589 mc->pdev->dev.can.state = new_state; in pcan_usb_decode_error()
594 peak_usb_get_ts_time(&mc->pdev->time_ref, mc->ts16, in pcan_usb_decode_error()
598 mc->netdev->stats.rx_packets++; in pcan_usb_decode_error()
599 mc->netdev->stats.rx_bytes += cf->can_dlc; in pcan_usb_decode_error()
608 static int pcan_usb_handle_bus_evt(struct pcan_usb_msg_context *mc, u8 ir) in pcan_usb_handle_bus_evt() argument
610 struct pcan_usb *pdev = mc->pdev; in pcan_usb_handle_bus_evt()
617 pdev->bec.rxerr = mc->ptr[0]; in pcan_usb_handle_bus_evt()
618 pdev->bec.txerr = mc->ptr[1]; in pcan_usb_handle_bus_evt()
632 static int pcan_usb_decode_status(struct pcan_usb_msg_context *mc, in pcan_usb_decode_status() argument
640 if ((mc->ptr + 2) > mc->end) in pcan_usb_decode_status()
643 f = mc->ptr[PCAN_USB_CMD_FUNC]; in pcan_usb_decode_status()
644 n = mc->ptr[PCAN_USB_CMD_NUM]; in pcan_usb_decode_status()
645 mc->ptr += PCAN_USB_CMD_ARGS; in pcan_usb_decode_status()
648 int err = pcan_usb_decode_ts(mc, !mc->rec_ts_idx); in pcan_usb_decode_status()
656 mc->rec_ts_idx++; in pcan_usb_decode_status()
661 err = pcan_usb_decode_error(mc, n, status_len); in pcan_usb_decode_status()
678 if (pcan_usb_update_ts(mc)) in pcan_usb_decode_status()
684 err = pcan_usb_handle_bus_evt(mc, n); in pcan_usb_decode_status()
689 netdev_err(mc->netdev, "unexpected function %u\n", f); in pcan_usb_decode_status()
693 if ((mc->ptr + rec_len) > mc->end) in pcan_usb_decode_status()
696 mc->ptr += rec_len; in pcan_usb_decode_status()
704 static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len) in pcan_usb_decode_data() argument
711 skb = alloc_can_skb(mc->netdev, &cf); in pcan_usb_decode_data()
718 if ((mc->ptr + 4) > mc->end) in pcan_usb_decode_data()
721 memcpy(&tmp32, mc->ptr, 4); in pcan_usb_decode_data()
722 mc->ptr += 4; in pcan_usb_decode_data()
728 if ((mc->ptr + 2) > mc->end) in pcan_usb_decode_data()
731 memcpy(&tmp16, mc->ptr, 2); in pcan_usb_decode_data()
732 mc->ptr += 2; in pcan_usb_decode_data()
740 if (pcan_usb_decode_ts(mc, !mc->rec_ts_idx)) in pcan_usb_decode_data()
744 mc->rec_ts_idx++; in pcan_usb_decode_data()
751 if ((mc->ptr + rec_len) > mc->end) in pcan_usb_decode_data()
754 memcpy(cf->data, mc->ptr, cf->can_dlc); in pcan_usb_decode_data()
755 mc->ptr += rec_len; in pcan_usb_decode_data()
760 peak_usb_get_ts_time(&mc->pdev->time_ref, mc->ts16, &hwts->hwtstamp); in pcan_usb_decode_data()
763 mc->netdev->stats.rx_packets++; in pcan_usb_decode_data()
764 mc->netdev->stats.rx_bytes += cf->can_dlc; in pcan_usb_decode_data()
780 struct pcan_usb_msg_context mc = { in pcan_usb_decode_msg() local
789 for (err = 0; mc.rec_idx < mc.rec_cnt && !err; mc.rec_idx++) { in pcan_usb_decode_msg()
790 u8 sl = *mc.ptr++; in pcan_usb_decode_msg()
794 err = pcan_usb_decode_status(&mc, sl); in pcan_usb_decode_msg()
797 err = pcan_usb_decode_data(&mc, sl); in pcan_usb_decode_msg()