完成 #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);
|
||