Project

General

Profile

完成 #209 » can_echo.diff

余 顺, 08/18/2023 06:51 AM

View differences:

kernel/drivers/net/can/rockchip/rockchip_canfd.c
val = rockchip_canfd_read(rcan, CAN_MODE);
val |= WORK_MODE;
if (rcan->mode >= ROCKCHIP_CAN_MODE && rcan->txtorx)
val |= MODE_RXSTX;
rockchip_canfd_write(rcan, CAN_MODE, val);
netdev_dbg(ndev, "%s MODE=0x%08x\n", __func__,
......
rockchip_canfd_write(rcan, CAN_CMD, CAN_TX0_REQ);
schedule_delayed_work(&rcan->tx_err_work, 1);
} else if (rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && id & CAN_EFF_FLAG) {
schedule_delayed_work(&rcan->tx_err_work, 1); //rpdzkj
schedule_delayed_work(&rcan->tx_err_work, 1);
}
}
......
dlc |= TX_FD_BRS_ENABLE;
}
if (rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && cf->can_id & CAN_EFF_FLAG)
rockchip_canfd_write(rcan, CAN_MODE, rockchip_canfd_read(rcan, CAN_MODE) | MODE_RXSTX);
else
rockchip_canfd_write(rcan, CAN_MODE, rockchip_canfd_read(rcan, CAN_MODE) & (~MODE_RXSTX));
if (!rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && cf->can_id & CAN_EFF_FLAG) {
/* Two frames are sent consecutively.
* Before the first frame is tx finished,
......
if (rcan->txtorx) {
if (rockchip_canfd_read(rcan, CAN_TX_CHECK_FIC) & FORMAT_MASK) {
ret = rockchip_canfd_read(rcan, CAN_TXID) & CAN_SFF_MASK;
if (id_rockchip_canfd == ret) {
if ((id_rockchip_canfd == ret) && !(dlc & FORMAT_MASK)) {
rockchip_canfd_write(rcan, CAN_TX_CHECK_FIC,
ts | CAN_TX0_REQ);
return 1;
} else {
return 1;
}
}
}
......
}
if (rcan->can.state >= CAN_STATE_BUS_OFF ||
((sta_reg & 0x20) == 0x20))
((sta_reg & 0x20) == 0x20)) {
can_bus_off(ndev);
}
stats->rx_packets++;
stats->rx_bytes += cf->can_dlc;
......
if (rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && dlc & FORMAT_MASK) {
cancel_delayed_work(&rcan->tx_err_work);
rockchip_canfd_write(rcan, CAN_TX_CHECK_FIC, FORMAT_MASK);
quota = (rockchip_canfd_read(rcan, CAN_RXFC) &
rcan->rx_fifo_mask) >>
rcan->rx_fifo_shift;
do {
quota = (rockchip_canfd_read(rcan, CAN_RXFC) &
rcan->rx_fifo_mask) >>
rcan->rx_fifo_shift;
} while (quota == 0);
if (quota) {
while (work_done < quota)
work_done += rockchip_canfd_rx(ndev);
kernel/net/can/raw.c
skb->sk = sk;
skb->priority = sk->sk_priority;
err = can_send(skb, ro->loopback);
err = can_send(skb, 0);
dev_put(dev);
(2-2/7)