完成 #209 » can_echo.diff
| 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);
|
||