Lines Matching +full:mram +full:- +full:cfg
1 // SPDX-License-Identifier: GPL-2.0
5 // Copyright (C) 2018-19 Texas Instruments Incorporated - http://www.ti.com/
8 * https://github.com/linux-can/can-doc/tree/master/m_can
332 return cdev->ops->read_reg(cdev, reg); in m_can_read()
338 cdev->ops->write_reg(cdev, reg, val); in m_can_write()
345 u32 addr_offset = cdev->mcfg[MRAM_RXF0].off + fgi * RXF0_ELEMENT_SIZE + in m_can_fifo_read()
351 return cdev->ops->read_fifo(cdev, addr_offset, val, val_count); in m_can_fifo_read()
358 u32 addr_offset = cdev->mcfg[MRAM_TXB].off + fpi * TXB_ELEMENT_SIZE + in m_can_fifo_write()
364 return cdev->ops->write_fifo(cdev, addr_offset, val, val_count); in m_can_fifo_write()
370 return cdev->ops->write_fifo(cdev, fpi, &val, 1); in m_can_fifo_write_no_off()
376 u32 addr_offset = cdev->mcfg[MRAM_TXE].off + fgi * TXE_ELEMENT_SIZE + in m_can_txe_fifo_read()
379 return cdev->ops->read_fifo(cdev, addr_offset, val, 1); in m_can_txe_fifo_read()
389 dev_err(cdev->dev, in m_can_cccr_update_bits()
391 return -EBUSY; in m_can_cccr_update_bits()
401 while (tries--) { in m_can_cccr_update_bits()
418 return -ETIMEDOUT; in m_can_cccr_update_bits()
431 netdev_err(cdev->net, "failed to enable configuration mode\n"); in m_can_config_enable()
445 netdev_err(cdev->net, "failed to disable configuration registers\n"); in m_can_config_disable()
452 if (cdev->active_interrupts == interrupts) in m_can_interrupt_enable()
454 cdev->ops->write_reg(cdev, M_CAN_IE, interrupts); in m_can_interrupt_enable()
455 cdev->active_interrupts = interrupts; in m_can_interrupt_enable()
460 u32 new_interrupts = cdev->active_interrupts | IR_RF0N | IR_TEFN; in m_can_coalescing_disable()
462 if (!cdev->net->irq) in m_can_coalescing_disable()
465 hrtimer_cancel(&cdev->hrtimer); in m_can_coalescing_disable()
471 if (!cdev->net->irq) { in m_can_enable_all_interrupts()
472 dev_dbg(cdev->dev, "Start hrtimer\n"); in m_can_enable_all_interrupts()
473 hrtimer_start(&cdev->hrtimer, in m_can_enable_all_interrupts()
487 if (!cdev->net->irq) { in m_can_disable_all_interrupts()
488 dev_dbg(cdev->dev, "Stop hrtimer\n"); in m_can_disable_all_interrupts()
489 hrtimer_try_to_cancel(&cdev->hrtimer); in m_can_disable_all_interrupts()
493 /* Retrieve internal timestamp counter from TSCV.TSC, and shift it to 32-bit
512 if (cdev->tx_ops) { in m_can_clean()
513 for (int i = 0; i != cdev->tx_fifo_size; ++i) { in m_can_clean()
514 if (!cdev->tx_ops[i].skb) in m_can_clean()
517 net->stats.tx_errors++; in m_can_clean()
518 cdev->tx_ops[i].skb = NULL; in m_can_clean()
522 for (int i = 0; i != cdev->can.echo_skb_max; ++i) in m_can_clean()
523 can_free_echo_skb(cdev->net, i, NULL); in m_can_clean()
525 netdev_reset_queue(cdev->net); in m_can_clean()
527 spin_lock_irqsave(&cdev->tx_handling_spinlock, irqflags); in m_can_clean()
528 cdev->tx_fifo_in_flight = 0; in m_can_clean()
529 spin_unlock_irqrestore(&cdev->tx_handling_spinlock, irqflags); in m_can_clean()
532 /* For peripherals, pass skb to rx-offload, which will push skb from
533 * napi. For non-peripherals, RX is done in napi already, so push
535 * rx-offload and is ignored for non-peripherals.
541 if (cdev->is_peripheral) { in m_can_receive_skb()
542 struct net_device_stats *stats = &cdev->net->stats; in m_can_receive_skb()
545 err = can_rx_offload_queue_timestamp(&cdev->offload, skb, in m_can_receive_skb()
548 stats->rx_fifo_errors++; in m_can_receive_skb()
556 struct net_device_stats *stats = &dev->stats; in m_can_read_fifo()
573 stats->rx_dropped++; in m_can_read_fifo()
578 cf->len = can_fd_dlc2len((fifo_header.dlc >> 16) & 0x0F); in m_can_read_fifo()
580 cf->len = can_cc_dlc2len((fifo_header.dlc >> 16) & 0x0F); in m_can_read_fifo()
583 cf->can_id = (fifo_header.id & CAN_EFF_MASK) | CAN_EFF_FLAG; in m_can_read_fifo()
585 cf->can_id = (fifo_header.id >> 18) & CAN_SFF_MASK; in m_can_read_fifo()
588 cf->flags |= CANFD_ESI; in m_can_read_fifo()
593 cf->can_id |= CAN_RTR_FLAG; in m_can_read_fifo()
596 cf->flags |= CANFD_BRS; in m_can_read_fifo()
599 cf->data, DIV_ROUND_UP(cf->len, 4)); in m_can_read_fifo()
603 stats->rx_bytes += cf->len; in m_can_read_fifo()
605 stats->rx_packets++; in m_can_read_fifo()
627 int ack_fgi = -1; in m_can_do_rx_poll()
645 quota--; in m_can_do_rx_poll()
648 fgi = (++fgi >= cdev->mcfg[MRAM_RXF0].num ? 0 : fgi); in m_can_do_rx_poll()
651 if (ack_fgi != -1) in m_can_do_rx_poll()
663 struct net_device_stats *stats = &dev->stats; in m_can_handle_lost_msg()
670 stats->rx_errors++; in m_can_handle_lost_msg()
671 stats->rx_over_errors++; in m_can_handle_lost_msg()
677 frame->can_id |= CAN_ERR_CRTL; in m_can_handle_lost_msg()
678 frame->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; in m_can_handle_lost_msg()
680 if (cdev->is_peripheral) in m_can_handle_lost_msg()
692 struct net_device_stats *stats = &dev->stats; in m_can_handle_lec_err()
697 cdev->can.can_stats.bus_error++; in m_can_handle_lec_err()
706 cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; in m_can_handle_lec_err()
711 stats->rx_errors++; in m_can_handle_lec_err()
713 cf->data[2] |= CAN_ERR_PROT_STUFF; in m_can_handle_lec_err()
717 stats->rx_errors++; in m_can_handle_lec_err()
719 cf->data[2] |= CAN_ERR_PROT_FORM; in m_can_handle_lec_err()
723 stats->tx_errors++; in m_can_handle_lec_err()
725 cf->data[3] = CAN_ERR_PROT_LOC_ACK; in m_can_handle_lec_err()
729 stats->tx_errors++; in m_can_handle_lec_err()
731 cf->data[2] |= CAN_ERR_PROT_BIT1; in m_can_handle_lec_err()
735 stats->tx_errors++; in m_can_handle_lec_err()
737 cf->data[2] |= CAN_ERR_PROT_BIT0; in m_can_handle_lec_err()
741 stats->rx_errors++; in m_can_handle_lec_err()
743 cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; in m_can_handle_lec_err()
752 if (cdev->is_peripheral) in m_can_handle_lec_err()
767 bec->rxerr = FIELD_GET(ECR_REC_MASK, ecr); in __m_can_get_berr_counter()
768 bec->txerr = FIELD_GET(ECR_TEC_MASK, ecr); in __m_can_get_berr_counter()
775 if (cdev->pm_clock_support == 0) in m_can_clk_start()
778 return pm_runtime_resume_and_get(cdev->dev); in m_can_clk_start()
783 if (cdev->pm_clock_support) in m_can_clk_stop()
784 pm_runtime_put_sync(cdev->dev); in m_can_clk_stop()
817 cdev->can.can_stats.error_warning++; in m_can_handle_state_change()
818 cdev->can.state = CAN_STATE_ERROR_WARNING; in m_can_handle_state_change()
822 cdev->can.can_stats.error_passive++; in m_can_handle_state_change()
823 cdev->can.state = CAN_STATE_ERROR_PASSIVE; in m_can_handle_state_change()
826 /* bus-off state */ in m_can_handle_state_change()
827 cdev->can.state = CAN_STATE_BUS_OFF; in m_can_handle_state_change()
829 cdev->can.can_stats.bus_off++; in m_can_handle_state_change()
846 cf->can_id |= CAN_ERR_CRTL | CAN_ERR_CNT; in m_can_handle_state_change()
847 cf->data[1] = (bec.txerr > bec.rxerr) ? in m_can_handle_state_change()
850 cf->data[6] = bec.txerr; in m_can_handle_state_change()
851 cf->data[7] = bec.rxerr; in m_can_handle_state_change()
855 cf->can_id |= CAN_ERR_CRTL | CAN_ERR_CNT; in m_can_handle_state_change()
858 cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE; in m_can_handle_state_change()
860 cf->data[1] |= CAN_ERR_CRTL_TX_PASSIVE; in m_can_handle_state_change()
861 cf->data[6] = bec.txerr; in m_can_handle_state_change()
862 cf->data[7] = bec.rxerr; in m_can_handle_state_change()
865 /* bus-off state */ in m_can_handle_state_change()
866 cf->can_id |= CAN_ERR_BUSOFF; in m_can_handle_state_change()
872 if (cdev->is_peripheral) in m_can_handle_state_change()
885 if (psr & PSR_EW && cdev->can.state != CAN_STATE_ERROR_WARNING) { in m_can_handle_state_errors()
891 if (psr & PSR_EP && cdev->can.state != CAN_STATE_ERROR_PASSIVE) { in m_can_handle_state_errors()
897 if (psr & PSR_BO && cdev->can.state != CAN_STATE_BUS_OFF) { in m_can_handle_state_errors()
932 struct net_device_stats *stats = &dev->stats; in m_can_handle_protocol_error()
942 stats->tx_errors++; in m_can_handle_protocol_error()
945 if (cdev->version >= 31 && (irqstatus & IR_PEA)) { in m_can_handle_protocol_error()
947 cdev->can.can_stats.arbitration_lost++; in m_can_handle_protocol_error()
949 cf->can_id |= CAN_ERR_LOSTARB; in m_can_handle_protocol_error()
950 cf->data[0] |= CAN_ERR_LOSTARB_UNSPEC; in m_can_handle_protocol_error()
959 if (cdev->is_peripheral) in m_can_handle_protocol_error()
977 if (cdev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) { in m_can_handle_bus_errors()
993 if ((cdev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) && in m_can_handle_bus_errors()
1022 if (cdev->version <= 31 && irqstatus & IR_MRAF && in m_can_rx_handler()
1042 rx_work_or_err = m_can_do_rx_poll(dev, (quota - work_done)); in m_can_rx_handler()
1054 struct net_device *dev = napi->dev; in m_can_poll()
1059 irqstatus = cdev->irqstatus | m_can_read(cdev, M_CAN_IR); in m_can_poll()
1063 /* Don't re-enable interrupts if the driver had a fatal error in m_can_poll()
1074 /* Echo tx skb and update net stats. Peripherals use rx-offload for
1076 * by rx-offload, and is ignored for non-peripherals.
1081 struct net_device *dev = cdev->net; in m_can_tx_update_stats()
1082 struct net_device_stats *stats = &dev->stats; in m_can_tx_update_stats()
1085 if (cdev->is_peripheral) in m_can_tx_update_stats()
1086 stats->tx_bytes += in m_can_tx_update_stats()
1087 can_rx_offload_get_echo_skb_queue_timestamp(&cdev->offload, in m_can_tx_update_stats()
1092 stats->tx_bytes += can_get_echo_skb(dev, msg_mark, &frame_len); in m_can_tx_update_stats()
1094 stats->tx_packets++; in m_can_tx_update_stats()
1104 netdev_completed_queue(cdev->net, transmitted, transmitted_frame_len); in m_can_finish_tx()
1106 spin_lock_irqsave(&cdev->tx_handling_spinlock, irqflags); in m_can_finish_tx()
1107 if (cdev->tx_fifo_in_flight >= cdev->tx_fifo_size && transmitted > 0) in m_can_finish_tx()
1108 netif_wake_queue(cdev->net); in m_can_finish_tx()
1109 cdev->tx_fifo_in_flight -= transmitted; in m_can_finish_tx()
1110 spin_unlock_irqrestore(&cdev->tx_handling_spinlock, irqflags); in m_can_finish_tx()
1118 spin_lock_irqsave(&cdev->tx_handling_spinlock, irqflags); in m_can_start_tx()
1119 tx_fifo_in_flight = cdev->tx_fifo_in_flight + 1; in m_can_start_tx()
1120 if (tx_fifo_in_flight >= cdev->tx_fifo_size) { in m_can_start_tx()
1121 netif_stop_queue(cdev->net); in m_can_start_tx()
1122 if (tx_fifo_in_flight > cdev->tx_fifo_size) { in m_can_start_tx()
1123 netdev_err_once(cdev->net, "hard_xmit called while TX FIFO full\n"); in m_can_start_tx()
1124 spin_unlock_irqrestore(&cdev->tx_handling_spinlock, irqflags); in m_can_start_tx()
1128 cdev->tx_fifo_in_flight = tx_fifo_in_flight; in m_can_start_tx()
1129 spin_unlock_irqrestore(&cdev->tx_handling_spinlock, irqflags); in m_can_start_tx()
1139 int ack_fgi = -1; in m_can_echo_tx_event()
1170 fgi = (++fgi >= cdev->mcfg[MRAM_TXE].num ? 0 : fgi); in m_can_echo_tx_event()
1179 if (ack_fgi != -1) in m_can_echo_tx_event()
1190 u32 new_interrupts = cdev->active_interrupts; in m_can_coalescing_update()
1194 if (!cdev->net->irq) in m_can_coalescing_update()
1197 if (cdev->rx_coalesce_usecs_irq > 0 && (ir & (IR_RF0N | IR_RF0W))) { in m_can_coalescing_update()
1201 if (cdev->tx_coalesce_usecs_irq > 0 && (ir & (IR_TEFN | IR_TEFW))) { in m_can_coalescing_update()
1205 if (!enable_rx_timer && !hrtimer_active(&cdev->hrtimer)) in m_can_coalescing_update()
1207 if (!enable_tx_timer && !hrtimer_active(&cdev->hrtimer)) in m_can_coalescing_update()
1212 hrtimer_start(&cdev->hrtimer, cdev->irq_timer_wait, in m_can_coalescing_update()
1222 struct net_device *dev = cdev->net; in m_can_interrupt_handler()
1226 if (pm_runtime_suspended(cdev->dev)) in m_can_interrupt_handler()
1231 * edge-triggered (for example with m_can_pci). For these in m_can_interrupt_handler()
1232 * edge-triggered integrations, we must observe that IR is 0 at least in m_can_interrupt_handler()
1241 if (!cdev->irq_edge_triggered) in m_can_interrupt_handler()
1249 if (cdev->ops->clear_interrupts) in m_can_interrupt_handler()
1250 cdev->ops->clear_interrupts(cdev); in m_can_interrupt_handler()
1253 * - rx IRQ in m_can_interrupt_handler()
1254 * - state change IRQ in m_can_interrupt_handler()
1255 * - bus error IRQ and bus error reporting in m_can_interrupt_handler()
1258 cdev->irqstatus = ir; in m_can_interrupt_handler()
1259 if (!cdev->is_peripheral) { in m_can_interrupt_handler()
1261 napi_schedule(&cdev->napi); in m_can_interrupt_handler()
1269 if (cdev->version == 30) { in m_can_interrupt_handler()
1275 if (cdev->is_peripheral) in m_can_interrupt_handler()
1289 if (cdev->is_peripheral) in m_can_interrupt_handler()
1290 can_rx_offload_threaded_irq_finish(&cdev->offload); in m_can_interrupt_handler()
1314 if (cdev->can.state == CAN_STATE_BUS_OFF || in m_can_coalescing_timer()
1315 cdev->can.state == CAN_STATE_STOPPED) in m_can_coalescing_timer()
1318 irq_wake_thread(cdev->net->irq, cdev->net); in m_can_coalescing_timer()
1374 const struct can_bittiming *bt = &cdev->can.bittiming; in m_can_set_bittiming()
1375 const struct can_bittiming *dbt = &cdev->can.data_bittiming; in m_can_set_bittiming()
1379 brp = bt->brp - 1; in m_can_set_bittiming()
1380 sjw = bt->sjw - 1; in m_can_set_bittiming()
1381 tseg1 = bt->prop_seg + bt->phase_seg1 - 1; in m_can_set_bittiming()
1382 tseg2 = bt->phase_seg2 - 1; in m_can_set_bittiming()
1389 if (cdev->can.ctrlmode & CAN_CTRLMODE_FD) { in m_can_set_bittiming()
1391 brp = dbt->brp - 1; in m_can_set_bittiming()
1392 sjw = dbt->sjw - 1; in m_can_set_bittiming()
1393 tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1; in m_can_set_bittiming()
1394 tseg2 = dbt->phase_seg2 - 1; in m_can_set_bittiming()
1400 if (dbt->bitrate > 2500000) { in m_can_set_bittiming()
1406 ssp = dbt->sample_point; in m_can_set_bittiming()
1411 tdco = (cdev->can.clock.freq / 1000) * in m_can_set_bittiming()
1412 ssp / dbt->bitrate; in m_can_set_bittiming()
1438 * - set rx buffer/fifo element size
1439 * - configure rx fifo
1440 * - accept non-matching frame into fifo 0
1441 * - configure tx buffer
1442 * - >= v3.1.x: TX FIFO is used
1443 * - configure mode
1444 * - setup bittiming
1445 * - configure timestamp generation
1456 dev_err(cdev->dev, "Message RAM configuration failed\n"); in m_can_chip_config()
1475 /* Accept Non-matching Frames Into FIFO 0 */ in m_can_chip_config()
1478 if (cdev->version == 30) { in m_can_chip_config()
1481 cdev->mcfg[MRAM_TXB].off); in m_can_chip_config()
1486 cdev->mcfg[MRAM_TXB].num) | in m_can_chip_config()
1487 cdev->mcfg[MRAM_TXB].off); in m_can_chip_config()
1495 if (cdev->version == 30) { in m_can_chip_config()
1498 cdev->mcfg[MRAM_TXE].off); in m_can_chip_config()
1503 cdev->tx_max_coalesced_frames_irq) | in m_can_chip_config()
1505 cdev->mcfg[MRAM_TXE].num) | in m_can_chip_config()
1506 cdev->mcfg[MRAM_TXE].off); in m_can_chip_config()
1511 FIELD_PREP(RXFC_FWM_MASK, cdev->rx_max_coalesced_frames_irq) | in m_can_chip_config()
1512 FIELD_PREP(RXFC_FS_MASK, cdev->mcfg[MRAM_RXF0].num) | in m_can_chip_config()
1513 cdev->mcfg[MRAM_RXF0].off); in m_can_chip_config()
1516 FIELD_PREP(RXFC_FS_MASK, cdev->mcfg[MRAM_RXF1].num) | in m_can_chip_config()
1517 cdev->mcfg[MRAM_RXF1].off); in m_can_chip_config()
1522 if (cdev->version == 30) { in m_can_chip_config()
1529 if (cdev->can.ctrlmode & CAN_CTRLMODE_FD) in m_can_chip_config()
1538 if (cdev->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO) in m_can_chip_config()
1541 if (cdev->can.ctrlmode & CAN_CTRLMODE_FD) in m_can_chip_config()
1546 if (cdev->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) { in m_can_chip_config()
1552 if (cdev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) in m_can_chip_config()
1556 if (cdev->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT) in m_can_chip_config()
1564 if (!(cdev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)) { in m_can_chip_config()
1565 if (cdev->version == 30) in m_can_chip_config()
1570 cdev->active_interrupts = 0; in m_can_chip_config()
1590 if (cdev->ops->init) in m_can_chip_config()
1591 cdev->ops->init(cdev); in m_can_chip_config()
1606 netdev_queue_set_dql_min_limit(netdev_get_tx_queue(cdev->net, 0), in m_can_start()
1607 cdev->tx_max_coalesced_frames); in m_can_start()
1609 cdev->can.state = CAN_STATE_ERROR_ACTIVE; in m_can_start()
1613 if (cdev->version > 30) in m_can_start()
1614 cdev->tx_fifo_putidx = FIELD_GET(TXFQS_TFQPI_MASK, in m_can_start()
1633 return -EOPNOTSUPP; in m_can_set_mode()
1686 dev_err(cdev->dev, "failed to revert the NON-ISO bit in CCCR\n"); in m_can_niso_supported()
1699 struct net_device *dev = cdev->net; in m_can_dev_setup()
1705 dev_err(cdev->dev, "Unsupported version number: %2d", in m_can_dev_setup()
1707 return -EINVAL; in m_can_dev_setup()
1718 if (!cdev->is_peripheral) in m_can_dev_setup()
1719 netif_napi_add(dev, &cdev->napi, m_can_poll); in m_can_dev_setup()
1722 cdev->version = m_can_version; in m_can_dev_setup()
1723 cdev->can.do_set_mode = m_can_set_mode; in m_can_dev_setup()
1724 cdev->can.do_get_berr_counter = m_can_get_berr_counter; in m_can_dev_setup()
1727 cdev->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | in m_can_dev_setup()
1734 switch (cdev->version) { in m_can_dev_setup()
1740 cdev->can.bittiming_const = &m_can_bittiming_const_30X; in m_can_dev_setup()
1741 cdev->can.data_bittiming_const = &m_can_data_bittiming_const_30X; in m_can_dev_setup()
1748 cdev->can.bittiming_const = &m_can_bittiming_const_31X; in m_can_dev_setup()
1749 cdev->can.data_bittiming_const = &m_can_data_bittiming_const_31X; in m_can_dev_setup()
1754 cdev->can.bittiming_const = &m_can_bittiming_const_31X; in m_can_dev_setup()
1755 cdev->can.data_bittiming_const = &m_can_data_bittiming_const_31X; in m_can_dev_setup()
1761 cdev->can.ctrlmode_supported |= CAN_CTRLMODE_FD_NON_ISO; in m_can_dev_setup()
1764 dev_err(cdev->dev, "Unsupported version number: %2d", in m_can_dev_setup()
1765 cdev->version); in m_can_dev_setup()
1766 return -EINVAL; in m_can_dev_setup()
1787 cdev->can.state = CAN_STATE_STOPPED; in m_can_stop()
1789 if (cdev->ops->deinit) { in m_can_stop()
1790 ret = cdev->ops->deinit(cdev); in m_can_stop()
1804 if (dev->irq) in m_can_close()
1805 free_irq(dev->irq, dev); in m_can_close()
1809 if (cdev->is_peripheral) { in m_can_close()
1810 destroy_workqueue(cdev->tx_wq); in m_can_close()
1811 cdev->tx_wq = NULL; in m_can_close()
1812 can_rx_offload_disable(&cdev->offload); in m_can_close()
1814 napi_disable(&cdev->napi); in m_can_close()
1820 phy_power_off(cdev->transceiver); in m_can_close()
1828 struct canfd_frame *cf = (struct canfd_frame *)skb->data; in m_can_tx_handler()
1829 u8 len_padded = DIV_ROUND_UP(cf->len, 4); in m_can_tx_handler()
1831 struct net_device *dev = cdev->net; in m_can_tx_handler()
1839 if (cf->can_id & CAN_EFF_FLAG) { in m_can_tx_handler()
1840 fifo_element.id = cf->can_id & CAN_EFF_MASK; in m_can_tx_handler()
1843 fifo_element.id = ((cf->can_id & CAN_SFF_MASK) << 18); in m_can_tx_handler()
1846 if (cf->can_id & CAN_RTR_FLAG) in m_can_tx_handler()
1849 if (cdev->version == 30) { in m_can_tx_handler()
1852 fifo_element.dlc = can_fd_len2dlc(cf->len) << 16; in m_can_tx_handler()
1860 cf->data, len_padded); in m_can_tx_handler()
1864 if (cdev->can.ctrlmode & CAN_CTRLMODE_FD) { in m_can_tx_handler()
1868 if (cf->flags & CANFD_BRS) in m_can_tx_handler()
1889 putidx = cdev->tx_fifo_putidx; in m_can_tx_handler()
1891 /* Construct DLC Field, with CAN-FD configuration. in m_can_tx_handler()
1900 if (cf->flags & CANFD_BRS) in m_can_tx_handler()
1905 FIELD_PREP(TX_BUF_DLC_MASK, can_fd_len2dlc(cf->len)) | in m_can_tx_handler()
1908 memcpy_and_pad(fifo_element.data, CANFD_MAX_DLEN, &cf->data, in m_can_tx_handler()
1909 cf->len, 0); in m_can_tx_handler()
1921 if (cdev->is_peripheral) { in m_can_tx_handler()
1923 cdev->tx_peripheral_submit |= BIT(putidx); in m_can_tx_handler()
1928 cdev->tx_fifo_putidx = (++cdev->tx_fifo_putidx >= cdev->can.echo_skb_max ? in m_can_tx_handler()
1929 0 : cdev->tx_fifo_putidx); in m_can_tx_handler()
1942 if (cdev->version == 30) in m_can_tx_submit()
1944 if (!cdev->is_peripheral) in m_can_tx_submit()
1947 m_can_write(cdev, M_CAN_TXBAR, cdev->tx_peripheral_submit); in m_can_tx_submit()
1948 cdev->tx_peripheral_submit = 0; in m_can_tx_submit()
1954 struct m_can_classdev *cdev = op->cdev; in m_can_tx_work_queue()
1955 struct sk_buff *skb = op->skb; in m_can_tx_work_queue()
1957 op->skb = NULL; in m_can_tx_work_queue()
1959 if (op->submit) in m_can_tx_work_queue()
1966 cdev->tx_ops[cdev->next_tx_op].skb = skb; in m_can_tx_queue_skb()
1967 cdev->tx_ops[cdev->next_tx_op].submit = submit; in m_can_tx_queue_skb()
1968 queue_work(cdev->tx_wq, &cdev->tx_ops[cdev->next_tx_op].work); in m_can_tx_queue_skb()
1970 ++cdev->next_tx_op; in m_can_tx_queue_skb()
1971 if (cdev->next_tx_op >= cdev->tx_fifo_size) in m_can_tx_queue_skb()
1972 cdev->next_tx_op = 0; in m_can_tx_queue_skb()
1980 ++cdev->nr_txs_without_submit; in m_can_start_peripheral_xmit()
1981 if (cdev->nr_txs_without_submit >= cdev->tx_max_coalesced_frames || in m_can_start_peripheral_xmit()
1983 cdev->nr_txs_without_submit = 0; in m_can_start_peripheral_xmit()
2005 if (cdev->can.state == CAN_STATE_BUS_OFF) { in m_can_start_xmit()
2006 m_can_clean(cdev->net); in m_can_start_xmit()
2016 if (cdev->is_peripheral) in m_can_start_xmit()
2033 if (cdev->can.state == CAN_STATE_BUS_OFF || in hrtimer_callback()
2034 cdev->can.state == CAN_STATE_STOPPED) in hrtimer_callback()
2040 if (ret < 0 || napi_is_scheduled(&cdev->napi)) in hrtimer_callback()
2053 err = phy_power_on(cdev->transceiver); in m_can_open()
2068 if (cdev->is_peripheral) in m_can_open()
2069 can_rx_offload_enable(&cdev->offload); in m_can_open()
2071 napi_enable(&cdev->napi); in m_can_open()
2074 if (cdev->is_peripheral) { in m_can_open()
2075 cdev->tx_wq = alloc_ordered_workqueue("mcan_wq", in m_can_open()
2077 if (!cdev->tx_wq) { in m_can_open()
2078 err = -ENOMEM; in m_can_open()
2082 for (int i = 0; i != cdev->tx_fifo_size; ++i) { in m_can_open()
2083 cdev->tx_ops[i].cdev = cdev; in m_can_open()
2084 INIT_WORK(&cdev->tx_ops[i].work, m_can_tx_work_queue); in m_can_open()
2087 err = request_threaded_irq(dev->irq, NULL, m_can_isr, in m_can_open()
2089 dev->name, dev); in m_can_open()
2090 } else if (dev->irq) { in m_can_open()
2091 err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name, in m_can_open()
2110 if (cdev->is_peripheral || dev->irq) in m_can_open()
2111 free_irq(dev->irq, dev); in m_can_open()
2113 if (cdev->is_peripheral) in m_can_open()
2114 destroy_workqueue(cdev->tx_wq); in m_can_open()
2116 if (cdev->is_peripheral) in m_can_open()
2117 can_rx_offload_disable(&cdev->offload); in m_can_open()
2119 napi_disable(&cdev->napi); in m_can_open()
2124 phy_power_off(cdev->transceiver); in m_can_open()
2142 ec->rx_max_coalesced_frames_irq = cdev->rx_max_coalesced_frames_irq; in m_can_get_coalesce()
2143 ec->rx_coalesce_usecs_irq = cdev->rx_coalesce_usecs_irq; in m_can_get_coalesce()
2144 ec->tx_max_coalesced_frames = cdev->tx_max_coalesced_frames; in m_can_get_coalesce()
2145 ec->tx_max_coalesced_frames_irq = cdev->tx_max_coalesced_frames_irq; in m_can_get_coalesce()
2146 ec->tx_coalesce_usecs_irq = cdev->tx_coalesce_usecs_irq; in m_can_get_coalesce()
2158 if (cdev->can.state != CAN_STATE_STOPPED) { in m_can_set_coalesce()
2160 return -EBUSY; in m_can_set_coalesce()
2163 if (ec->rx_max_coalesced_frames_irq > cdev->mcfg[MRAM_RXF0].num) { in m_can_set_coalesce()
2164 netdev_err(dev, "rx-frames-irq %u greater than the RX FIFO %u\n", in m_can_set_coalesce()
2165 ec->rx_max_coalesced_frames_irq, in m_can_set_coalesce()
2166 cdev->mcfg[MRAM_RXF0].num); in m_can_set_coalesce()
2167 return -EINVAL; in m_can_set_coalesce()
2169 if ((ec->rx_max_coalesced_frames_irq == 0) != (ec->rx_coalesce_usecs_irq == 0)) { in m_can_set_coalesce()
2170 netdev_err(dev, "rx-frames-irq and rx-usecs-irq can only be set together\n"); in m_can_set_coalesce()
2171 return -EINVAL; in m_can_set_coalesce()
2173 if (ec->tx_max_coalesced_frames_irq > cdev->mcfg[MRAM_TXE].num) { in m_can_set_coalesce()
2174 netdev_err(dev, "tx-frames-irq %u greater than the TX event FIFO %u\n", in m_can_set_coalesce()
2175 ec->tx_max_coalesced_frames_irq, in m_can_set_coalesce()
2176 cdev->mcfg[MRAM_TXE].num); in m_can_set_coalesce()
2177 return -EINVAL; in m_can_set_coalesce()
2179 if (ec->tx_max_coalesced_frames_irq > cdev->mcfg[MRAM_TXB].num) { in m_can_set_coalesce()
2180 netdev_err(dev, "tx-frames-irq %u greater than the TX FIFO %u\n", in m_can_set_coalesce()
2181 ec->tx_max_coalesced_frames_irq, in m_can_set_coalesce()
2182 cdev->mcfg[MRAM_TXB].num); in m_can_set_coalesce()
2183 return -EINVAL; in m_can_set_coalesce()
2185 if ((ec->tx_max_coalesced_frames_irq == 0) != (ec->tx_coalesce_usecs_irq == 0)) { in m_can_set_coalesce()
2186 netdev_err(dev, "tx-frames-irq and tx-usecs-irq can only be set together\n"); in m_can_set_coalesce()
2187 return -EINVAL; in m_can_set_coalesce()
2189 if (ec->tx_max_coalesced_frames > cdev->mcfg[MRAM_TXE].num) { in m_can_set_coalesce()
2190 netdev_err(dev, "tx-frames %u greater than the TX event FIFO %u\n", in m_can_set_coalesce()
2191 ec->tx_max_coalesced_frames, in m_can_set_coalesce()
2192 cdev->mcfg[MRAM_TXE].num); in m_can_set_coalesce()
2193 return -EINVAL; in m_can_set_coalesce()
2195 if (ec->tx_max_coalesced_frames > cdev->mcfg[MRAM_TXB].num) { in m_can_set_coalesce()
2196 netdev_err(dev, "tx-frames %u greater than the TX FIFO %u\n", in m_can_set_coalesce()
2197 ec->tx_max_coalesced_frames, in m_can_set_coalesce()
2198 cdev->mcfg[MRAM_TXB].num); in m_can_set_coalesce()
2199 return -EINVAL; in m_can_set_coalesce()
2201 if (ec->rx_coalesce_usecs_irq != 0 && ec->tx_coalesce_usecs_irq != 0 && in m_can_set_coalesce()
2202 ec->rx_coalesce_usecs_irq != ec->tx_coalesce_usecs_irq) { in m_can_set_coalesce()
2203 netdev_err(dev, "rx-usecs-irq %u needs to be equal to tx-usecs-irq %u if both are enabled\n", in m_can_set_coalesce()
2204 ec->rx_coalesce_usecs_irq, in m_can_set_coalesce()
2205 ec->tx_coalesce_usecs_irq); in m_can_set_coalesce()
2206 return -EINVAL; in m_can_set_coalesce()
2209 cdev->rx_max_coalesced_frames_irq = ec->rx_max_coalesced_frames_irq; in m_can_set_coalesce()
2210 cdev->rx_coalesce_usecs_irq = ec->rx_coalesce_usecs_irq; in m_can_set_coalesce()
2211 cdev->tx_max_coalesced_frames = ec->tx_max_coalesced_frames; in m_can_set_coalesce()
2212 cdev->tx_max_coalesced_frames_irq = ec->tx_max_coalesced_frames_irq; in m_can_set_coalesce()
2213 cdev->tx_coalesce_usecs_irq = ec->tx_coalesce_usecs_irq; in m_can_set_coalesce()
2215 if (cdev->rx_coalesce_usecs_irq) in m_can_set_coalesce()
2216 cdev->irq_timer_wait = in m_can_set_coalesce()
2217 ns_to_ktime(cdev->rx_coalesce_usecs_irq * NSEC_PER_USEC); in m_can_set_coalesce()
2219 cdev->irq_timer_wait = in m_can_set_coalesce()
2220 ns_to_ktime(cdev->tx_coalesce_usecs_irq * NSEC_PER_USEC); in m_can_set_coalesce()
2242 struct net_device *dev = cdev->net; in register_m_can_dev()
2244 dev->flags |= IFF_ECHO; /* we support local echo */ in register_m_can_dev()
2245 dev->netdev_ops = &m_can_netdev_ops; in register_m_can_dev()
2246 if (dev->irq && cdev->is_peripheral) in register_m_can_dev()
2247 dev->ethtool_ops = &m_can_ethtool_ops_coalescing; in register_m_can_dev()
2249 dev->ethtool_ops = &m_can_ethtool_ops; in register_m_can_dev()
2258 total_size = cdev->mcfg[MRAM_TXB].off - cdev->mcfg[MRAM_SIDF].off + in m_can_check_mram_cfg()
2259 cdev->mcfg[MRAM_TXB].num * TXB_ELEMENT_SIZE; in m_can_check_mram_cfg()
2261 dev_err(cdev->dev, "Total size of mram config(%u) exceeds mram(%u)\n", in m_can_check_mram_cfg()
2263 return -EINVAL; in m_can_check_mram_cfg()
2273 cdev->mcfg[MRAM_SIDF].off = mram_config_vals[0]; in m_can_of_parse_mram()
2274 cdev->mcfg[MRAM_SIDF].num = mram_config_vals[1]; in m_can_of_parse_mram()
2275 cdev->mcfg[MRAM_XIDF].off = cdev->mcfg[MRAM_SIDF].off + in m_can_of_parse_mram()
2276 cdev->mcfg[MRAM_SIDF].num * SIDF_ELEMENT_SIZE; in m_can_of_parse_mram()
2277 cdev->mcfg[MRAM_XIDF].num = mram_config_vals[2]; in m_can_of_parse_mram()
2278 cdev->mcfg[MRAM_RXF0].off = cdev->mcfg[MRAM_XIDF].off + in m_can_of_parse_mram()
2279 cdev->mcfg[MRAM_XIDF].num * XIDF_ELEMENT_SIZE; in m_can_of_parse_mram()
2280 cdev->mcfg[MRAM_RXF0].num = mram_config_vals[3] & in m_can_of_parse_mram()
2282 cdev->mcfg[MRAM_RXF1].off = cdev->mcfg[MRAM_RXF0].off + in m_can_of_parse_mram()
2283 cdev->mcfg[MRAM_RXF0].num * RXF0_ELEMENT_SIZE; in m_can_of_parse_mram()
2284 cdev->mcfg[MRAM_RXF1].num = mram_config_vals[4] & in m_can_of_parse_mram()
2286 cdev->mcfg[MRAM_RXB].off = cdev->mcfg[MRAM_RXF1].off + in m_can_of_parse_mram()
2287 cdev->mcfg[MRAM_RXF1].num * RXF1_ELEMENT_SIZE; in m_can_of_parse_mram()
2288 cdev->mcfg[MRAM_RXB].num = mram_config_vals[5]; in m_can_of_parse_mram()
2289 cdev->mcfg[MRAM_TXE].off = cdev->mcfg[MRAM_RXB].off + in m_can_of_parse_mram()
2290 cdev->mcfg[MRAM_RXB].num * RXB_ELEMENT_SIZE; in m_can_of_parse_mram()
2291 cdev->mcfg[MRAM_TXE].num = mram_config_vals[6]; in m_can_of_parse_mram()
2292 cdev->mcfg[MRAM_TXB].off = cdev->mcfg[MRAM_TXE].off + in m_can_of_parse_mram()
2293 cdev->mcfg[MRAM_TXE].num * TXE_ELEMENT_SIZE; in m_can_of_parse_mram()
2294 cdev->mcfg[MRAM_TXB].num = mram_config_vals[7] & in m_can_of_parse_mram()
2297 dev_dbg(cdev->dev, in m_can_of_parse_mram()
2299 cdev->mcfg[MRAM_SIDF].off, cdev->mcfg[MRAM_SIDF].num, in m_can_of_parse_mram()
2300 cdev->mcfg[MRAM_XIDF].off, cdev->mcfg[MRAM_XIDF].num, in m_can_of_parse_mram()
2301 cdev->mcfg[MRAM_RXF0].off, cdev->mcfg[MRAM_RXF0].num, in m_can_of_parse_mram()
2302 cdev->mcfg[MRAM_RXF1].off, cdev->mcfg[MRAM_RXF1].num, in m_can_of_parse_mram()
2303 cdev->mcfg[MRAM_RXB].off, cdev->mcfg[MRAM_RXB].num, in m_can_of_parse_mram()
2304 cdev->mcfg[MRAM_TXE].off, cdev->mcfg[MRAM_TXE].num, in m_can_of_parse_mram()
2305 cdev->mcfg[MRAM_TXB].off, cdev->mcfg[MRAM_TXB].num); in m_can_of_parse_mram()
2316 start = cdev->mcfg[MRAM_SIDF].off; in m_can_init_ram()
2317 end = cdev->mcfg[MRAM_TXB].off + in m_can_init_ram()
2318 cdev->mcfg[MRAM_TXB].num * TXB_ELEMENT_SIZE; in m_can_init_ram()
2334 cdev->hclk = devm_clk_get(cdev->dev, "hclk"); in m_can_class_get_clocks()
2335 cdev->cclk = devm_clk_get(cdev->dev, "cclk"); in m_can_class_get_clocks()
2337 if (IS_ERR(cdev->hclk) || IS_ERR(cdev->cclk)) { in m_can_class_get_clocks()
2338 dev_err(cdev->dev, "no clock found\n"); in m_can_class_get_clocks()
2339 ret = -ENODEV; in m_can_class_get_clocks()
2356 "bosch,mram-cfg", in m_can_class_allocate_dev()
2377 class_dev->net = net_dev; in m_can_class_allocate_dev()
2378 class_dev->dev = dev; in m_can_class_allocate_dev()
2397 cdev->tx_fifo_size = max(1, min(cdev->mcfg[MRAM_TXB].num, in m_can_class_register()
2398 cdev->mcfg[MRAM_TXE].num)); in m_can_class_register()
2399 if (cdev->is_peripheral) { in m_can_class_register()
2400 cdev->tx_ops = in m_can_class_register()
2401 devm_kzalloc(cdev->dev, in m_can_class_register()
2402 cdev->tx_fifo_size * sizeof(*cdev->tx_ops), in m_can_class_register()
2404 if (!cdev->tx_ops) { in m_can_class_register()
2405 dev_err(cdev->dev, "Failed to allocate tx_ops for workqueue\n"); in m_can_class_register()
2406 return -ENOMEM; in m_can_class_register()
2414 if (cdev->is_peripheral) { in m_can_class_register()
2415 ret = can_rx_offload_add_manual(cdev->net, &cdev->offload, in m_can_class_register()
2421 if (!cdev->net->irq) { in m_can_class_register()
2422 dev_dbg(cdev->dev, "Polling enabled, initialize hrtimer"); in m_can_class_register()
2423 hrtimer_init(&cdev->hrtimer, CLOCK_MONOTONIC, in m_can_class_register()
2425 cdev->hrtimer.function = &hrtimer_callback; in m_can_class_register()
2427 hrtimer_init(&cdev->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); in m_can_class_register()
2428 cdev->hrtimer.function = m_can_coalescing_timer; in m_can_class_register()
2437 dev_err(cdev->dev, "registering %s failed (err=%d)\n", in m_can_class_register()
2438 cdev->net->name, ret); in m_can_class_register()
2442 of_can_transceiver(cdev->net); in m_can_class_register()
2444 dev_info(cdev->dev, "%s device registered (irq=%d, version=%d)\n", in m_can_class_register()
2445 KBUILD_MODNAME, cdev->net->irq, cdev->version); in m_can_class_register()
2455 if (cdev->is_peripheral) in m_can_class_register()
2456 can_rx_offload_del(&cdev->offload); in m_can_class_register()
2466 if (cdev->is_peripheral) in m_can_class_unregister()
2467 can_rx_offload_del(&cdev->offload); in m_can_class_unregister()
2468 unregister_candev(cdev->net); in m_can_class_unregister()
2475 struct net_device *ndev = cdev->net; in m_can_class_suspend()
2483 * used as a wake-up source. Coalescing needs to be reset then, in m_can_class_suspend()
2486 if (cdev->pm_wake_source) { in m_can_class_suspend()
2487 hrtimer_cancel(&cdev->hrtimer); in m_can_class_suspend()
2490 if (cdev->ops->deinit) in m_can_class_suspend()
2491 ret = cdev->ops->deinit(cdev); in m_can_class_suspend()
2501 cdev->can.state = CAN_STATE_SLEEPING; in m_can_class_suspend()
2510 struct net_device *ndev = cdev->net; in m_can_class_resume()
2515 cdev->can.state = CAN_STATE_ERROR_ACTIVE; in m_can_class_resume()
2522 if (cdev->pm_wake_source) { in m_can_class_resume()
2529 cdev->active_interrupts |= IR_RF0N | IR_TEFN; in m_can_class_resume()
2531 if (cdev->ops->init) in m_can_class_resume()
2532 ret = cdev->ops->init(cdev); in m_can_class_resume()
2534 m_can_write(cdev, M_CAN_IE, cdev->active_interrupts); in m_can_class_resume()