linux-can-next-for-5.17-20220105
-----BEGIN PGP SIGNATURE----- iQFHBAABCgAxFiEEK3kIWJt9yTYMP3ehqclaivrt76kFAmHVfO4THG1rbEBwZW5n dXRyb25peC5kZQAKCRCpyVqK+u3vqYYCB/9lWoCLyk6woA7RY3Td/SWvgG58p3i4 Zew/bJmL5j9QJiAdZtYTORGysVnA/itr9rlKHGS5dqrPupIpZOAP5BtRoSsTDNjD 7Mj2aAGACsl5CY5b5Q3Y/OBEt+RFMThrWpJwnh0wcLRYsfg1GWa5R9vo3cgLeUl2 wdTpDzC6oRAvpo6iMzvzFyTS/CqBigArNiGt29XMXI3uDeCTqdNnxVqpVMrt8jK1 DVNp4Xy40fY9IwuGmhpHm7h0xK0YCneEKsKnf+aTKLcC2fYkWof1pgU3TbQwNYAH M6Gw4XC4wAsEPT9yRjrc6VoH6BBtOl0ZGglUJkub7L58CVD6MOPT1aUp =zIRd -----END PGP SIGNATURE----- Merge tag 'linux-can-next-for-5.17-20220105' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next Marc Kleine-Budde says: ==================== pull-request: can-next 2022-01-05 this is a pull request of 15 patches for net-next/master. The first patch is by me and removed an unused variable from the usb_8dev driver. Andy Shevchenko contributes a patch for the mcp251x driver, which removes an unneeded assignment. Jimmy Assarsson's patch for the kvaser_usb makes use of units.h in the assignment of frequencies. Lad Prabhakar provides 2 patches, converting the ti_hecc and the sja1000 driver to make use of platform_get_irq(). The 10 remaining patches are by Vincent Mailhol. First the etas_es58x driver populates the net_device::dev_port. The next 5 patches cleanup the handling of CAN error and CAN RTR messages of all drivers. The remaining 4 patches enhance the CAN controller mode flag handling and export it via netlink to user space. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
7da0694c01
|
@ -448,7 +448,6 @@ static void at91_chip_stop(struct net_device *dev, enum can_state state)
|
|||
static netdev_tx_t at91_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct at91_priv *priv = netdev_priv(dev);
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
struct can_frame *cf = (struct can_frame *)skb->data;
|
||||
unsigned int mb, prio;
|
||||
u32 reg_mid, reg_mcr;
|
||||
|
@ -480,8 +479,6 @@ static netdev_tx_t at91_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
/* This triggers transmission */
|
||||
at91_write(priv, AT91_MCR(mb), reg_mcr);
|
||||
|
||||
stats->tx_bytes += cf->len;
|
||||
|
||||
/* _NOTE_: subtract AT91_MB_TX_FIRST offset from mb! */
|
||||
can_put_echo_skb(skb, dev, mb - get_mb_tx_first(priv), 0);
|
||||
|
||||
|
@ -553,8 +550,6 @@ static void at91_rx_overflow_err(struct net_device *dev)
|
|||
cf->can_id |= CAN_ERR_CRTL;
|
||||
cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
|
||||
|
@ -619,7 +614,9 @@ static void at91_read_msg(struct net_device *dev, unsigned int mb)
|
|||
at91_read_mb(dev, mb, cf);
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
if (!(cf->can_id & CAN_RTR_FLAG))
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_receive_skb(skb);
|
||||
|
||||
can_led_event(dev, CAN_LED_EVENT_RX);
|
||||
|
@ -779,8 +776,6 @@ static int at91_poll_err(struct net_device *dev, int quota, u32 reg_sr)
|
|||
|
||||
at91_poll_err_frame(dev, cf, reg_sr);
|
||||
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += cf->len;
|
||||
netif_receive_skb(skb);
|
||||
|
||||
return 1;
|
||||
|
@ -854,7 +849,10 @@ static void at91_irq_tx(struct net_device *dev, u32 reg_sr)
|
|||
if (likely(reg_msr & AT91_MSR_MRDY &&
|
||||
~reg_msr & AT91_MSR_MABT)) {
|
||||
/* _NOTE_: subtract AT91_MB_TX_FIRST offset from mb! */
|
||||
can_get_echo_skb(dev, mb - get_mb_tx_first(priv), NULL);
|
||||
dev->stats.tx_bytes +=
|
||||
can_get_echo_skb(dev,
|
||||
mb - get_mb_tx_first(priv),
|
||||
NULL);
|
||||
dev->stats.tx_packets++;
|
||||
can_led_event(dev, CAN_LED_EVENT_TX);
|
||||
}
|
||||
|
@ -1037,8 +1035,6 @@ static void at91_irq_err(struct net_device *dev)
|
|||
|
||||
at91_irq_err_state(dev, cf, new_state);
|
||||
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
|
||||
priv->can.state = new_state;
|
||||
|
|
|
@ -211,7 +211,6 @@ struct c_can_priv {
|
|||
struct c_can_raminit raminit_sys; /* RAMINIT via syscon regmap */
|
||||
void (*raminit)(const struct c_can_priv *priv, bool enable);
|
||||
u32 comm_rcv_high;
|
||||
u32 dlc[];
|
||||
};
|
||||
|
||||
struct net_device *alloc_c_can_dev(int msg_obj_num);
|
||||
|
|
|
@ -403,10 +403,10 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, u32 ctrl)
|
|||
frame->data[i + 1] = data >> 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stats->rx_bytes += frame->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += frame->len;
|
||||
|
||||
netif_receive_skb(skb);
|
||||
return 0;
|
||||
|
@ -477,7 +477,6 @@ static netdev_tx_t c_can_start_xmit(struct sk_buff *skb,
|
|||
* transmit as we might race against do_tx().
|
||||
*/
|
||||
c_can_setup_tx_object(dev, IF_TX, frame, idx);
|
||||
priv->dlc[idx] = frame->len;
|
||||
can_put_echo_skb(skb, dev, idx, 0);
|
||||
obj = idx + priv->msg_obj_tx_first;
|
||||
c_can_object_put(dev, IF_TX, obj, cmd);
|
||||
|
@ -742,8 +741,7 @@ static void c_can_do_tx(struct net_device *dev)
|
|||
* NAPI. We are not transmitting.
|
||||
*/
|
||||
c_can_inval_tx_object(dev, IF_NAPI, obj);
|
||||
can_get_echo_skb(dev, idx, NULL);
|
||||
bytes += priv->dlc[idx];
|
||||
bytes += can_get_echo_skb(dev, idx, NULL);
|
||||
pkts++;
|
||||
}
|
||||
|
||||
|
@ -920,7 +918,6 @@ static int c_can_handle_state_change(struct net_device *dev,
|
|||
unsigned int reg_err_counter;
|
||||
unsigned int rx_err_passive;
|
||||
struct c_can_priv *priv = netdev_priv(dev);
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
struct can_frame *cf;
|
||||
struct sk_buff *skb;
|
||||
struct can_berr_counter bec;
|
||||
|
@ -996,8 +993,6 @@ static int c_can_handle_state_change(struct net_device *dev,
|
|||
break;
|
||||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_receive_skb(skb);
|
||||
|
||||
return 1;
|
||||
|
@ -1064,8 +1059,6 @@ static int c_can_handle_bus_err(struct net_device *dev,
|
|||
break;
|
||||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_receive_skb(skb);
|
||||
return 1;
|
||||
}
|
||||
|
@ -1232,8 +1225,7 @@ struct net_device *alloc_c_can_dev(int msg_obj_num)
|
|||
struct c_can_priv *priv;
|
||||
int msg_obj_tx_num = msg_obj_num / 2;
|
||||
|
||||
dev = alloc_candev(struct_size(priv, dlc, msg_obj_tx_num),
|
||||
msg_obj_tx_num);
|
||||
dev = alloc_candev(sizeof(*priv), msg_obj_tx_num);
|
||||
if (!dev)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -489,17 +489,17 @@ static void cc770_rx(struct net_device *dev, unsigned int mo, u8 ctrl1)
|
|||
cf->len = can_cc_dlc2len((config & 0xf0) >> 4);
|
||||
for (i = 0; i < cf->len; i++)
|
||||
cf->data[i] = cc770_read_reg(priv, msgobj[mo].data[i]);
|
||||
}
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
static int cc770_err(struct net_device *dev, u8 status)
|
||||
{
|
||||
struct cc770_priv *priv = netdev_priv(dev);
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
struct can_frame *cf;
|
||||
struct sk_buff *skb;
|
||||
u8 lec;
|
||||
|
@ -571,8 +571,6 @@ static int cc770_err(struct net_device *dev, u8 status)
|
|||
}
|
||||
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
|
||||
return 0;
|
||||
|
@ -666,7 +664,6 @@ static void cc770_tx_interrupt(struct net_device *dev, unsigned int o)
|
|||
struct cc770_priv *priv = netdev_priv(dev);
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
unsigned int mo = obj2msgobj(o);
|
||||
struct can_frame *cf;
|
||||
u8 ctrl1;
|
||||
|
||||
ctrl1 = cc770_read_reg(priv, msgobj[mo].ctrl1);
|
||||
|
@ -698,12 +695,9 @@ static void cc770_tx_interrupt(struct net_device *dev, unsigned int o)
|
|||
return;
|
||||
}
|
||||
|
||||
cf = (struct can_frame *)priv->tx_skb->data;
|
||||
stats->tx_bytes += cf->len;
|
||||
stats->tx_packets++;
|
||||
|
||||
can_put_echo_skb(priv->tx_skb, dev, 0, 0);
|
||||
can_get_echo_skb(dev, 0, NULL);
|
||||
stats->tx_bytes += can_get_echo_skb(dev, 0, NULL);
|
||||
stats->tx_packets++;
|
||||
priv->tx_skb = NULL;
|
||||
|
||||
netif_wake_queue(dev);
|
||||
|
|
|
@ -136,7 +136,6 @@ EXPORT_SYMBOL_GPL(can_change_state);
|
|||
static void can_restart(struct net_device *dev)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
struct sk_buff *skb;
|
||||
struct can_frame *cf;
|
||||
int err;
|
||||
|
@ -155,9 +154,6 @@ static void can_restart(struct net_device *dev)
|
|||
|
||||
cf->can_id |= CAN_ERR_RESTARTED;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_rx_ni(skb);
|
||||
|
||||
restart:
|
||||
|
@ -300,6 +296,7 @@ EXPORT_SYMBOL_GPL(free_candev);
|
|||
int can_change_mtu(struct net_device *dev, int new_mtu)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
u32 ctrlmode_static = can_get_static_ctrlmode(priv);
|
||||
|
||||
/* Do not allow changing the MTU while running */
|
||||
if (dev->flags & IFF_UP)
|
||||
|
@ -309,7 +306,7 @@ int can_change_mtu(struct net_device *dev, int new_mtu)
|
|||
switch (new_mtu) {
|
||||
case CAN_MTU:
|
||||
/* 'CANFD-only' controllers can not switch to CAN_MTU */
|
||||
if (priv->ctrlmode_static & CAN_CTRLMODE_FD)
|
||||
if (ctrlmode_static & CAN_CTRLMODE_FD)
|
||||
return -EINVAL;
|
||||
|
||||
priv->ctrlmode &= ~CAN_CTRLMODE_FD;
|
||||
|
@ -318,7 +315,7 @@ int can_change_mtu(struct net_device *dev, int new_mtu)
|
|||
case CANFD_MTU:
|
||||
/* check for potential CANFD ability */
|
||||
if (!(priv->ctrlmode_supported & CAN_CTRLMODE_FD) &&
|
||||
!(priv->ctrlmode_static & CAN_CTRLMODE_FD))
|
||||
!(ctrlmode_static & CAN_CTRLMODE_FD))
|
||||
return -EINVAL;
|
||||
|
||||
priv->ctrlmode |= CAN_CTRLMODE_FD;
|
||||
|
|
|
@ -21,6 +21,7 @@ static const struct nla_policy can_policy[IFLA_CAN_MAX + 1] = {
|
|||
[IFLA_CAN_DATA_BITTIMING_CONST] = { .len = sizeof(struct can_bittiming_const) },
|
||||
[IFLA_CAN_TERMINATION] = { .type = NLA_U16 },
|
||||
[IFLA_CAN_TDC] = { .type = NLA_NESTED },
|
||||
[IFLA_CAN_CTRLMODE_EXT] = { .type = NLA_NESTED },
|
||||
};
|
||||
|
||||
static const struct nla_policy can_tdc_policy[IFLA_CAN_TDC_MAX + 1] = {
|
||||
|
@ -211,7 +212,7 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
|
|||
if (dev->flags & IFF_UP)
|
||||
return -EBUSY;
|
||||
cm = nla_data(data[IFLA_CAN_CTRLMODE]);
|
||||
ctrlstatic = priv->ctrlmode_static;
|
||||
ctrlstatic = can_get_static_ctrlmode(priv);
|
||||
maskedflags = cm->flags & cm->mask;
|
||||
|
||||
/* check whether provided bits are allowed to be passed */
|
||||
|
@ -383,6 +384,12 @@ static size_t can_tdc_get_size(const struct net_device *dev)
|
|||
return size;
|
||||
}
|
||||
|
||||
static size_t can_ctrlmode_ext_get_size(void)
|
||||
{
|
||||
return nla_total_size(0) + /* nest IFLA_CAN_CTRLMODE_EXT */
|
||||
nla_total_size(sizeof(u32)); /* IFLA_CAN_CTRLMODE_SUPPORTED */
|
||||
}
|
||||
|
||||
static size_t can_get_size(const struct net_device *dev)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
|
@ -415,6 +422,7 @@ static size_t can_get_size(const struct net_device *dev)
|
|||
priv->data_bitrate_const_cnt);
|
||||
size += sizeof(priv->bitrate_max); /* IFLA_CAN_BITRATE_MAX */
|
||||
size += can_tdc_get_size(dev); /* IFLA_CAN_TDC */
|
||||
size += can_ctrlmode_ext_get_size(); /* IFLA_CAN_CTRLMODE_EXT */
|
||||
|
||||
return size;
|
||||
}
|
||||
|
@ -472,6 +480,25 @@ err_cancel:
|
|||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
static int can_ctrlmode_ext_fill_info(struct sk_buff *skb,
|
||||
const struct can_priv *priv)
|
||||
{
|
||||
struct nlattr *nest;
|
||||
|
||||
nest = nla_nest_start(skb, IFLA_CAN_CTRLMODE_EXT);
|
||||
if (!nest)
|
||||
return -EMSGSIZE;
|
||||
|
||||
if (nla_put_u32(skb, IFLA_CAN_CTRLMODE_SUPPORTED,
|
||||
priv->ctrlmode_supported)) {
|
||||
nla_nest_cancel(skb, nest);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
nla_nest_end(skb, nest);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
|
@ -531,7 +558,9 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
|
|||
sizeof(priv->bitrate_max),
|
||||
&priv->bitrate_max)) ||
|
||||
|
||||
(can_tdc_fill_info(skb, dev))
|
||||
can_tdc_fill_info(skb, dev) ||
|
||||
|
||||
can_ctrlmode_ext_fill_info(skb, priv)
|
||||
)
|
||||
|
||||
return -EMSGSIZE;
|
||||
|
|
|
@ -54,8 +54,11 @@ static int can_rx_offload_napi_poll(struct napi_struct *napi, int quota)
|
|||
struct can_frame *cf = (struct can_frame *)skb->data;
|
||||
|
||||
work_done++;
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
if (!(cf->can_id & CAN_ERR_FLAG)) {
|
||||
stats->rx_packets++;
|
||||
if (!(cf->can_id & CAN_RTR_FLAG))
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
|
||||
|
|
|
@ -255,7 +255,6 @@ struct grcan_priv {
|
|||
struct grcan_dma dma;
|
||||
|
||||
struct sk_buff **echo_skb; /* We allocate this on our own */
|
||||
u8 *txdlc; /* Length of queued frames */
|
||||
|
||||
/* The echo skb pointer, pointing into echo_skb and indicating which
|
||||
* frames can be echoed back. See the "Notes on the tx cyclic buffer
|
||||
|
@ -515,9 +514,7 @@ static int catch_up_echo_skb(struct net_device *dev, int budget, bool echo)
|
|||
if (echo) {
|
||||
/* Normal echo of messages */
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += priv->txdlc[i];
|
||||
priv->txdlc[i] = 0;
|
||||
can_get_echo_skb(dev, i, NULL);
|
||||
stats->tx_bytes += can_get_echo_skb(dev, i, NULL);
|
||||
} else {
|
||||
/* For cleanup of untransmitted messages */
|
||||
can_free_echo_skb(dev, i, NULL);
|
||||
|
@ -1062,16 +1059,10 @@ static int grcan_open(struct net_device *dev)
|
|||
priv->can.echo_skb_max = dma->tx.size;
|
||||
priv->can.echo_skb = priv->echo_skb;
|
||||
|
||||
priv->txdlc = kcalloc(dma->tx.size, sizeof(*priv->txdlc), GFP_KERNEL);
|
||||
if (!priv->txdlc) {
|
||||
err = -ENOMEM;
|
||||
goto exit_free_echo_skb;
|
||||
}
|
||||
|
||||
/* Get can device up */
|
||||
err = open_candev(dev);
|
||||
if (err)
|
||||
goto exit_free_txdlc;
|
||||
goto exit_free_echo_skb;
|
||||
|
||||
err = request_irq(dev->irq, grcan_interrupt, IRQF_SHARED,
|
||||
dev->name, dev);
|
||||
|
@ -1093,8 +1084,6 @@ static int grcan_open(struct net_device *dev)
|
|||
|
||||
exit_close_candev:
|
||||
close_candev(dev);
|
||||
exit_free_txdlc:
|
||||
kfree(priv->txdlc);
|
||||
exit_free_echo_skb:
|
||||
kfree(priv->echo_skb);
|
||||
exit_free_dma_buffers:
|
||||
|
@ -1129,7 +1118,6 @@ static int grcan_close(struct net_device *dev)
|
|||
priv->can.echo_skb_max = 0;
|
||||
priv->can.echo_skb = NULL;
|
||||
kfree(priv->echo_skb);
|
||||
kfree(priv->txdlc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1211,11 +1199,11 @@ static int grcan_receive(struct net_device *dev, int budget)
|
|||
shift = GRCAN_MSG_DATA_SHIFT(i);
|
||||
cf->data[i] = (u8)(slot[j] >> shift);
|
||||
}
|
||||
}
|
||||
|
||||
/* Update statistics and read pointer */
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_receive_skb(skb);
|
||||
|
||||
rd = grcan_ring_add(rd, GRCAN_MSG_SIZE, dma->rx.size);
|
||||
|
@ -1447,7 +1435,6 @@ static netdev_tx_t grcan_start_xmit(struct sk_buff *skb,
|
|||
* can_put_echo_skb would be an error unless other measures are
|
||||
* taken.
|
||||
*/
|
||||
priv->txdlc[slotindex] = cf->len; /* Store dlc for statistics */
|
||||
can_put_echo_skb(skb, dev, slotindex, 0);
|
||||
|
||||
/* Make sure everything is written before allowing hardware to
|
||||
|
|
|
@ -309,15 +309,15 @@ static void ifi_canfd_read_fifo(struct net_device *ndev)
|
|||
*(u32 *)(cf->data + i) =
|
||||
readl(priv->base + IFI_CANFD_RXFIFO_DATA + i);
|
||||
}
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
|
||||
/* Remove the packet from FIFO */
|
||||
writel(IFI_CANFD_RXSTCMD_REMOVE_MSG, priv->base + IFI_CANFD_RXSTCMD);
|
||||
writel(rx_irq_mask, priv->base + IFI_CANFD_INTERRUPT);
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
|
||||
|
@ -430,8 +430,6 @@ static int ifi_canfd_handle_lec_err(struct net_device *ndev)
|
|||
priv->base + IFI_CANFD_INTERRUPT);
|
||||
writel(IFI_CANFD_ERROR_CTR_ER_ENABLE, priv->base + IFI_CANFD_ERROR_CTR);
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_receive_skb(skb);
|
||||
|
||||
return 1;
|
||||
|
@ -456,7 +454,6 @@ static int ifi_canfd_handle_state_change(struct net_device *ndev,
|
|||
enum can_state new_state)
|
||||
{
|
||||
struct ifi_canfd_priv *priv = netdev_priv(ndev);
|
||||
struct net_device_stats *stats = &ndev->stats;
|
||||
struct can_frame *cf;
|
||||
struct sk_buff *skb;
|
||||
struct can_berr_counter bec;
|
||||
|
@ -522,8 +519,6 @@ static int ifi_canfd_handle_state_change(struct net_device *ndev,
|
|||
break;
|
||||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_receive_skb(skb);
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -1294,7 +1294,8 @@ static unsigned int ican3_get_echo_skb(struct ican3_dev *mod)
|
|||
}
|
||||
|
||||
cf = (struct can_frame *)skb->data;
|
||||
dlc = cf->len;
|
||||
if (!(cf->can_id & CAN_RTR_FLAG))
|
||||
dlc = cf->len;
|
||||
|
||||
/* check flag whether this packet has to be looped back */
|
||||
if (skb->pkt_type != PACKET_LOOPBACK) {
|
||||
|
@ -1421,7 +1422,8 @@ static int ican3_recv_skb(struct ican3_dev *mod)
|
|||
|
||||
/* update statistics, receive the skb */
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
if (!(cf->can_id & CAN_RTR_FLAG))
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_receive_skb(skb);
|
||||
|
||||
err_noalloc:
|
||||
|
|
|
@ -1185,20 +1185,21 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
|
|||
|
||||
cf->len = can_fd_dlc2len(p->header[1] >> KVASER_PCIEFD_RPACKET_DLC_SHIFT);
|
||||
|
||||
if (p->header[0] & KVASER_PCIEFD_RPACKET_RTR)
|
||||
if (p->header[0] & KVASER_PCIEFD_RPACKET_RTR) {
|
||||
cf->can_id |= CAN_RTR_FLAG;
|
||||
else
|
||||
} else {
|
||||
memcpy(cf->data, data, cf->len);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
|
||||
shhwtstamps = skb_hwtstamps(skb);
|
||||
|
||||
shhwtstamps->hwtstamp =
|
||||
ns_to_ktime(div_u64(p->timestamp * 1000,
|
||||
pcie->freq_to_ticks_div));
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
stats->rx_packets++;
|
||||
|
||||
return netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -1310,9 +1311,6 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
|
|||
cf->data[6] = bec.txerr;
|
||||
cf->data[7] = bec.rxerr;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_rx(skb);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1510,8 +1508,6 @@ static void kvaser_pciefd_handle_nack_packet(struct kvaser_pciefd_can *can,
|
|||
|
||||
if (skb) {
|
||||
cf->can_id |= CAN_ERR_BUSERROR;
|
||||
stats->rx_bytes += cf->len;
|
||||
stats->rx_packets++;
|
||||
netif_rx(skb);
|
||||
} else {
|
||||
stats->rx_dropped++;
|
||||
|
|
|
@ -518,14 +518,14 @@ static int m_can_read_fifo(struct net_device *dev, u32 rxfs)
|
|||
cf->data, DIV_ROUND_UP(cf->len, 4));
|
||||
if (err)
|
||||
goto out_free_skb;
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
|
||||
/* acknowledge rx fifo 0 */
|
||||
m_can_write(cdev, M_CAN_RXF0A, fgi);
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
timestamp = FIELD_GET(RX_BUF_RXTS_MASK, fifo_header.dlc);
|
||||
|
||||
m_can_receive_skb(cdev, skb, timestamp);
|
||||
|
@ -647,9 +647,6 @@ static int m_can_handle_lec_err(struct net_device *dev,
|
|||
break;
|
||||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
if (cdev->is_peripheral)
|
||||
timestamp = m_can_get_timestamp(cdev);
|
||||
|
||||
|
@ -706,7 +703,6 @@ static int m_can_handle_state_change(struct net_device *dev,
|
|||
enum can_state new_state)
|
||||
{
|
||||
struct m_can_classdev *cdev = netdev_priv(dev);
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
struct can_frame *cf;
|
||||
struct sk_buff *skb;
|
||||
struct can_berr_counter bec;
|
||||
|
@ -771,9 +767,6 @@ static int m_can_handle_state_change(struct net_device *dev,
|
|||
break;
|
||||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
if (cdev->is_peripheral)
|
||||
timestamp = m_can_get_timestamp(cdev);
|
||||
|
||||
|
@ -1463,7 +1456,7 @@ static bool m_can_niso_supported(struct m_can_classdev *cdev)
|
|||
static int m_can_dev_setup(struct m_can_classdev *cdev)
|
||||
{
|
||||
struct net_device *dev = cdev->net;
|
||||
int m_can_version;
|
||||
int m_can_version, err;
|
||||
|
||||
m_can_version = m_can_check_core_release(cdev);
|
||||
/* return if unsupported version */
|
||||
|
@ -1493,7 +1486,9 @@ static int m_can_dev_setup(struct m_can_classdev *cdev)
|
|||
switch (cdev->version) {
|
||||
case 30:
|
||||
/* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.0.x */
|
||||
can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
|
||||
err = can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
|
||||
if (err)
|
||||
return err;
|
||||
cdev->can.bittiming_const = cdev->bit_timing ?
|
||||
cdev->bit_timing : &m_can_bittiming_const_30X;
|
||||
|
||||
|
@ -1503,7 +1498,9 @@ static int m_can_dev_setup(struct m_can_classdev *cdev)
|
|||
break;
|
||||
case 31:
|
||||
/* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.1.x */
|
||||
can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
|
||||
err = can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
|
||||
if (err)
|
||||
return err;
|
||||
cdev->can.bittiming_const = cdev->bit_timing ?
|
||||
cdev->bit_timing : &m_can_bittiming_const_31X;
|
||||
|
||||
|
|
|
@ -401,13 +401,15 @@ static int mscan_rx_poll(struct napi_struct *napi, int quota)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (canrflg & MSCAN_RXF)
|
||||
if (canrflg & MSCAN_RXF) {
|
||||
mscan_get_rx_frame(dev, frame);
|
||||
else if (canrflg & MSCAN_ERR_IF)
|
||||
stats->rx_packets++;
|
||||
if (!(frame->can_id & CAN_RTR_FLAG))
|
||||
stats->rx_bytes += frame->len;
|
||||
} else if (canrflg & MSCAN_ERR_IF) {
|
||||
mscan_get_err_frame(dev, frame, canrflg);
|
||||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += frame->len;
|
||||
work_done++;
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
|
@ -446,9 +448,9 @@ static irqreturn_t mscan_isr(int irq, void *dev_id)
|
|||
continue;
|
||||
|
||||
out_8(®s->cantbsel, mask);
|
||||
stats->tx_bytes += in_8(®s->tx.dlr);
|
||||
stats->tx_bytes += can_get_echo_skb(dev, entry->id,
|
||||
NULL);
|
||||
stats->tx_packets++;
|
||||
can_get_echo_skb(dev, entry->id, NULL);
|
||||
priv->tx_active &= ~mask;
|
||||
list_del(pos);
|
||||
}
|
||||
|
|
|
@ -561,9 +561,6 @@ static void pch_can_error(struct net_device *ndev, u32 status)
|
|||
|
||||
priv->can.state = state;
|
||||
netif_receive_skb(skb);
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
|
||||
static irqreturn_t pch_can_interrupt(int irq, void *dev_id)
|
||||
|
@ -680,22 +677,23 @@ static int pch_can_rx_normal(struct net_device *ndev, u32 obj_num, int quota)
|
|||
cf->can_id = id;
|
||||
}
|
||||
|
||||
if (id2 & PCH_ID2_DIR)
|
||||
cf->can_id |= CAN_RTR_FLAG;
|
||||
|
||||
cf->len = can_cc_dlc2len((ioread32(&priv->regs->
|
||||
ifregs[0].mcont)) & 0xF);
|
||||
|
||||
for (i = 0; i < cf->len; i += 2) {
|
||||
data_reg = ioread16(&priv->regs->ifregs[0].data[i / 2]);
|
||||
cf->data[i] = data_reg;
|
||||
cf->data[i + 1] = data_reg >> 8;
|
||||
}
|
||||
if (id2 & PCH_ID2_DIR) {
|
||||
cf->can_id |= CAN_RTR_FLAG;
|
||||
} else {
|
||||
for (i = 0; i < cf->len; i += 2) {
|
||||
data_reg = ioread16(&priv->regs->ifregs[0].data[i / 2]);
|
||||
cf->data[i] = data_reg;
|
||||
cf->data[i + 1] = data_reg >> 8;
|
||||
}
|
||||
|
||||
rcv_pkts++;
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
rcv_pkts++;
|
||||
quota--;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_receive_skb(skb);
|
||||
|
||||
pch_fifo_thresh(priv, obj_num);
|
||||
|
@ -709,16 +707,13 @@ static void pch_can_tx_complete(struct net_device *ndev, u32 int_stat)
|
|||
{
|
||||
struct pch_can_priv *priv = netdev_priv(ndev);
|
||||
struct net_device_stats *stats = &(priv->ndev->stats);
|
||||
u32 dlc;
|
||||
|
||||
can_get_echo_skb(ndev, int_stat - PCH_RX_OBJ_END - 1, NULL);
|
||||
stats->tx_bytes += can_get_echo_skb(ndev, int_stat - PCH_RX_OBJ_END - 1,
|
||||
NULL);
|
||||
stats->tx_packets++;
|
||||
iowrite32(PCH_CMASK_RX_TX_GET | PCH_CMASK_CLRINTPND,
|
||||
&priv->regs->ifregs[1].cmask);
|
||||
pch_can_rw_msg_obj(&priv->regs->ifregs[1].creq, int_stat);
|
||||
dlc = can_cc_dlc2len(ioread32(&priv->regs->ifregs[1].mcont) &
|
||||
PCH_IF_MCONT_DLC);
|
||||
stats->tx_bytes += dlc;
|
||||
stats->tx_packets++;
|
||||
if (int_stat == PCH_TX_OBJ_END)
|
||||
netif_wake_queue(ndev);
|
||||
}
|
||||
|
|
|
@ -266,10 +266,9 @@ static int pucan_handle_can_rx(struct peak_canfd_priv *priv,
|
|||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->echo_lock, flags);
|
||||
can_get_echo_skb(priv->ndev, msg->client, NULL);
|
||||
|
||||
/* count bytes of the echo instead of skb */
|
||||
stats->tx_bytes += cf_len;
|
||||
stats->tx_bytes += can_get_echo_skb(priv->ndev, msg->client, NULL);
|
||||
stats->tx_packets++;
|
||||
|
||||
/* restart tx queue (a slot is free) */
|
||||
|
@ -310,12 +309,13 @@ static int pucan_handle_can_rx(struct peak_canfd_priv *priv,
|
|||
if (rx_msg_flags & PUCAN_MSG_EXT_ID)
|
||||
cf->can_id |= CAN_EFF_FLAG;
|
||||
|
||||
if (rx_msg_flags & PUCAN_MSG_RTR)
|
||||
if (rx_msg_flags & PUCAN_MSG_RTR) {
|
||||
cf->can_id |= CAN_RTR_FLAG;
|
||||
else
|
||||
} else {
|
||||
memcpy(cf->data, msg->d, cf->len);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
|
||||
pucan_netif_rx(skb, msg->ts_low, msg->ts_high);
|
||||
|
@ -409,8 +409,6 @@ static int pucan_handle_status(struct peak_canfd_priv *priv,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
pucan_netif_rx(skb, msg->ts_low, msg->ts_high);
|
||||
|
||||
return 0;
|
||||
|
@ -438,8 +436,6 @@ static int pucan_handle_cache_critical(struct peak_canfd_priv *priv)
|
|||
cf->data[6] = priv->bec.txerr;
|
||||
cf->data[7] = priv->bec.rxerr;
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
stats->rx_packets++;
|
||||
netif_rx(skb);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -94,7 +94,6 @@ struct rcar_can_priv {
|
|||
struct rcar_can_regs __iomem *regs;
|
||||
struct clk *clk;
|
||||
struct clk *can_clk;
|
||||
u8 tx_dlc[RCAR_CAN_FIFO_DEPTH];
|
||||
u32 tx_head;
|
||||
u32 tx_tail;
|
||||
u8 clock_select;
|
||||
|
@ -223,7 +222,6 @@ static void tx_failure_cleanup(struct net_device *ndev)
|
|||
static void rcar_can_error(struct net_device *ndev)
|
||||
{
|
||||
struct rcar_can_priv *priv = netdev_priv(ndev);
|
||||
struct net_device_stats *stats = &ndev->stats;
|
||||
struct can_frame *cf;
|
||||
struct sk_buff *skb;
|
||||
u8 eifr, txerr = 0, rxerr = 0;
|
||||
|
@ -362,11 +360,8 @@ static void rcar_can_error(struct net_device *ndev)
|
|||
}
|
||||
}
|
||||
|
||||
if (skb) {
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
if (skb)
|
||||
netif_rx(skb);
|
||||
}
|
||||
}
|
||||
|
||||
static void rcar_can_tx_done(struct net_device *ndev)
|
||||
|
@ -383,10 +378,11 @@ static void rcar_can_tx_done(struct net_device *ndev)
|
|||
if (priv->tx_head - priv->tx_tail <= unsent)
|
||||
break;
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += priv->tx_dlc[priv->tx_tail %
|
||||
RCAR_CAN_FIFO_DEPTH];
|
||||
priv->tx_dlc[priv->tx_tail % RCAR_CAN_FIFO_DEPTH] = 0;
|
||||
can_get_echo_skb(ndev, priv->tx_tail % RCAR_CAN_FIFO_DEPTH, NULL);
|
||||
stats->tx_bytes +=
|
||||
can_get_echo_skb(ndev,
|
||||
priv->tx_tail % RCAR_CAN_FIFO_DEPTH,
|
||||
NULL);
|
||||
|
||||
priv->tx_tail++;
|
||||
netif_wake_queue(ndev);
|
||||
}
|
||||
|
@ -616,7 +612,6 @@ static netdev_tx_t rcar_can_start_xmit(struct sk_buff *skb,
|
|||
|
||||
writeb(cf->len, &priv->regs->mb[RCAR_CAN_TX_FIFO_MBX].dlc);
|
||||
|
||||
priv->tx_dlc[priv->tx_head % RCAR_CAN_FIFO_DEPTH] = cf->len;
|
||||
can_put_echo_skb(skb, ndev, priv->tx_head % RCAR_CAN_FIFO_DEPTH, 0);
|
||||
priv->tx_head++;
|
||||
/* Start Tx: write 0xff to the TFPCR register to increment
|
||||
|
@ -666,12 +661,13 @@ static void rcar_can_rx_pkt(struct rcar_can_priv *priv)
|
|||
for (dlc = 0; dlc < cf->len; dlc++)
|
||||
cf->data[dlc] =
|
||||
readb(&priv->regs->mb[RCAR_CAN_RX_FIFO_MBX].data[dlc]);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
|
||||
can_led_event(priv->ndev, CAN_LED_EVENT_RX);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
stats->rx_packets++;
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
|
||||
|
|
|
@ -502,7 +502,6 @@ struct rcar_canfd_channel {
|
|||
struct rcar_canfd_global *gpriv; /* Controller reference */
|
||||
void __iomem *base; /* Register base address */
|
||||
struct napi_struct napi;
|
||||
u8 tx_len[RCANFD_FIFO_DEPTH]; /* For net stats */
|
||||
u32 tx_head; /* Incremented on xmit */
|
||||
u32 tx_tail; /* Incremented on xmit done */
|
||||
u32 channel; /* Channel number */
|
||||
|
@ -1033,8 +1032,6 @@ static void rcar_canfd_error(struct net_device *ndev, u32 cerfl,
|
|||
/* Clear channel error interrupts that are handled */
|
||||
rcar_canfd_write(priv->base, RCANFD_CERFL(ch),
|
||||
RCANFD_CERFL_ERR(~cerfl));
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -1051,9 +1048,7 @@ static void rcar_canfd_tx_done(struct net_device *ndev)
|
|||
|
||||
sent = priv->tx_tail % RCANFD_FIFO_DEPTH;
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += priv->tx_len[sent];
|
||||
priv->tx_len[sent] = 0;
|
||||
can_get_echo_skb(ndev, sent, NULL);
|
||||
stats->tx_bytes += can_get_echo_skb(ndev, sent, NULL);
|
||||
|
||||
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||
priv->tx_tail++;
|
||||
|
@ -1174,8 +1169,6 @@ static void rcar_canfd_state_change(struct net_device *ndev,
|
|||
rx_state = txerr <= rxerr ? state : 0;
|
||||
|
||||
can_change_state(ndev, cf, tx_state, rx_state);
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
}
|
||||
}
|
||||
|
@ -1465,7 +1458,6 @@ static netdev_tx_t rcar_canfd_start_xmit(struct sk_buff *skb,
|
|||
RCANFD_C_CFDF(ch, RCANFD_CFFIFO_IDX, 0));
|
||||
}
|
||||
|
||||
priv->tx_len[priv->tx_head % RCANFD_FIFO_DEPTH] = cf->len;
|
||||
can_put_echo_skb(skb, ndev, priv->tx_head % RCANFD_FIFO_DEPTH, 0);
|
||||
|
||||
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||
|
@ -1554,7 +1546,8 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
|
|||
|
||||
can_led_event(priv->ndev, CAN_LED_EVENT_RX);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
if (!(cf->can_id & CAN_RTR_FLAG))
|
||||
stats->rx_bytes += cf->len;
|
||||
stats->rx_packets++;
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
|
@ -1706,7 +1699,9 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
|
|||
&rcar_canfd_data_bittiming_const;
|
||||
|
||||
/* Controller starts in CAN FD only mode */
|
||||
can_set_static_ctrlmode(ndev, CAN_CTRLMODE_FD);
|
||||
err = can_set_static_ctrlmode(ndev, CAN_CTRLMODE_FD);
|
||||
if (err)
|
||||
goto fail;
|
||||
priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING;
|
||||
} else {
|
||||
/* Controller starts in Classical CAN only mode */
|
||||
|
|
|
@ -372,15 +372,16 @@ static void sja1000_rx(struct net_device *dev)
|
|||
} else {
|
||||
for (i = 0; i < cf->len; i++)
|
||||
cf->data[i] = priv->read_reg(priv, dreg++);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
|
||||
cf->can_id = id;
|
||||
|
||||
/* release receive buffer */
|
||||
sja1000_write_cmdreg(priv, CMD_RRB);
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
|
||||
can_led_event(dev, CAN_LED_EVENT_RX);
|
||||
|
@ -487,8 +488,6 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)
|
|||
can_bus_off(dev);
|
||||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
|
||||
return 0;
|
||||
|
@ -528,10 +527,8 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
|
|||
can_free_echo_skb(dev, 0, NULL);
|
||||
} else {
|
||||
/* transmission complete */
|
||||
stats->tx_bytes +=
|
||||
priv->read_reg(priv, SJA1000_FI) & 0xf;
|
||||
stats->tx_bytes += can_get_echo_skb(dev, 0, NULL);
|
||||
stats->tx_packets++;
|
||||
can_get_echo_skb(dev, 0, NULL);
|
||||
}
|
||||
netif_wake_queue(dev);
|
||||
can_led_event(dev, CAN_LED_EVENT_TX);
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_irq.h>
|
||||
|
||||
#include "sja1000.h"
|
||||
|
||||
|
@ -234,13 +233,15 @@ static int sp_probe(struct platform_device *pdev)
|
|||
if (!addr)
|
||||
return -ENOMEM;
|
||||
|
||||
if (of)
|
||||
irq = irq_of_parse_and_map(of, 0);
|
||||
else
|
||||
if (of) {
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
} else {
|
||||
res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
|
||||
if (!irq && !res_irq)
|
||||
return -ENODEV;
|
||||
if (!res_irq)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
of_id = of_match_device(sp_of_table, &pdev->dev);
|
||||
if (of_id && of_id->data) {
|
||||
|
|
|
@ -218,7 +218,9 @@ static void slc_bump(struct slcan *sl)
|
|||
skb_put_data(skb, &cf, sizeof(struct can_frame));
|
||||
|
||||
sl->dev->stats.rx_packets++;
|
||||
sl->dev->stats.rx_bytes += cf.len;
|
||||
if (!(cf.can_id & CAN_RTR_FLAG))
|
||||
sl->dev->stats.rx_bytes += cf.len;
|
||||
|
||||
netif_rx_ni(skb);
|
||||
}
|
||||
|
||||
|
@ -288,6 +290,8 @@ static void slc_encaps(struct slcan *sl, struct can_frame *cf)
|
|||
if (!(cf->can_id & CAN_RTR_FLAG)) {
|
||||
for (i = 0; i < cf->len; i++)
|
||||
pos = hex_byte_pack_upper(pos, cf->data[i]);
|
||||
|
||||
sl->dev->stats.tx_bytes += cf->len;
|
||||
}
|
||||
|
||||
*pos++ = '\r';
|
||||
|
@ -304,7 +308,6 @@ static void slc_encaps(struct slcan *sl, struct can_frame *cf)
|
|||
actual = sl->tty->ops->write(sl->tty, sl->xbuff, pos - sl->xbuff);
|
||||
sl->xleft = (pos - sl->xbuff) - actual;
|
||||
sl->xhead = sl->xbuff + actual;
|
||||
sl->dev->stats.tx_bytes += cf->len;
|
||||
}
|
||||
|
||||
/* Write out any remaining transmit buffer. Scheduled when tty is writable */
|
||||
|
|
|
@ -282,7 +282,10 @@ static int softing_handle_1(struct softing *card)
|
|||
skb = priv->can.echo_skb[priv->tx.echo_get];
|
||||
if (skb)
|
||||
skb->tstamp = ktime;
|
||||
can_get_echo_skb(netdev, priv->tx.echo_get, NULL);
|
||||
++netdev->stats.tx_packets;
|
||||
netdev->stats.tx_bytes +=
|
||||
can_get_echo_skb(netdev, priv->tx.echo_get,
|
||||
NULL);
|
||||
++priv->tx.echo_get;
|
||||
if (priv->tx.echo_get >= TX_ECHO_SKB_MAX)
|
||||
priv->tx.echo_get = 0;
|
||||
|
@ -290,9 +293,6 @@ static int softing_handle_1(struct softing *card)
|
|||
--priv->tx.pending;
|
||||
if (card->tx.pending)
|
||||
--card->tx.pending;
|
||||
++netdev->stats.tx_packets;
|
||||
if (!(msg.can_id & CAN_RTR_FLAG))
|
||||
netdev->stats.tx_bytes += msg.len;
|
||||
} else {
|
||||
int ret;
|
||||
|
||||
|
|
|
@ -153,7 +153,6 @@ struct hi3110_priv {
|
|||
u8 *spi_rx_buf;
|
||||
|
||||
struct sk_buff *tx_skb;
|
||||
int tx_len;
|
||||
|
||||
struct workqueue_struct *wq;
|
||||
struct work_struct tx_work;
|
||||
|
@ -166,6 +165,8 @@ struct hi3110_priv {
|
|||
#define HI3110_AFTER_SUSPEND_POWER 4
|
||||
#define HI3110_AFTER_SUSPEND_RESTART 8
|
||||
int restart_tx;
|
||||
bool tx_busy;
|
||||
|
||||
struct regulator *power;
|
||||
struct regulator *transceiver;
|
||||
struct clk *clk;
|
||||
|
@ -175,13 +176,13 @@ static void hi3110_clean(struct net_device *net)
|
|||
{
|
||||
struct hi3110_priv *priv = netdev_priv(net);
|
||||
|
||||
if (priv->tx_skb || priv->tx_len)
|
||||
if (priv->tx_skb || priv->tx_busy)
|
||||
net->stats.tx_errors++;
|
||||
dev_kfree_skb(priv->tx_skb);
|
||||
if (priv->tx_len)
|
||||
if (priv->tx_busy)
|
||||
can_free_echo_skb(priv->net, 0, NULL);
|
||||
priv->tx_skb = NULL;
|
||||
priv->tx_len = 0;
|
||||
priv->tx_busy = false;
|
||||
}
|
||||
|
||||
/* Note about handling of error return of hi3110_spi_trans: accessing
|
||||
|
@ -343,14 +344,15 @@ static void hi3110_hw_rx(struct spi_device *spi)
|
|||
/* Data length */
|
||||
frame->len = can_cc_dlc2len(buf[HI3110_FIFO_WOTIME_DLC_OFF] & 0x0F);
|
||||
|
||||
if (buf[HI3110_FIFO_WOTIME_ID_OFF + 3] & HI3110_FIFO_WOTIME_ID_RTR)
|
||||
if (buf[HI3110_FIFO_WOTIME_ID_OFF + 3] & HI3110_FIFO_WOTIME_ID_RTR) {
|
||||
frame->can_id |= CAN_RTR_FLAG;
|
||||
else
|
||||
} else {
|
||||
memcpy(frame->data, buf + HI3110_FIFO_WOTIME_DAT_OFF,
|
||||
frame->len);
|
||||
|
||||
priv->net->stats.rx_bytes += frame->len;
|
||||
}
|
||||
priv->net->stats.rx_packets++;
|
||||
priv->net->stats.rx_bytes += frame->len;
|
||||
|
||||
can_led_event(priv->net, CAN_LED_EVENT_RX);
|
||||
|
||||
|
@ -368,7 +370,7 @@ static netdev_tx_t hi3110_hard_start_xmit(struct sk_buff *skb,
|
|||
struct hi3110_priv *priv = netdev_priv(net);
|
||||
struct spi_device *spi = priv->spi;
|
||||
|
||||
if (priv->tx_skb || priv->tx_len) {
|
||||
if (priv->tx_skb || priv->tx_busy) {
|
||||
dev_err(&spi->dev, "hard_xmit called while tx busy\n");
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
@ -585,7 +587,7 @@ static void hi3110_tx_work_handler(struct work_struct *ws)
|
|||
} else {
|
||||
frame = (struct can_frame *)priv->tx_skb->data;
|
||||
hi3110_hw_tx(spi, frame);
|
||||
priv->tx_len = 1 + frame->len;
|
||||
priv->tx_busy = true;
|
||||
can_put_echo_skb(priv->tx_skb, net, 0, 0);
|
||||
priv->tx_skb = NULL;
|
||||
}
|
||||
|
@ -720,14 +722,11 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id)
|
|||
}
|
||||
}
|
||||
|
||||
if (priv->tx_len && statf & HI3110_STAT_TXMTY) {
|
||||
if (priv->tx_busy && statf & HI3110_STAT_TXMTY) {
|
||||
net->stats.tx_packets++;
|
||||
net->stats.tx_bytes += priv->tx_len - 1;
|
||||
net->stats.tx_bytes += can_get_echo_skb(net, 0, NULL);
|
||||
can_led_event(net, CAN_LED_EVENT_TX);
|
||||
if (priv->tx_len) {
|
||||
can_get_echo_skb(net, 0, NULL);
|
||||
priv->tx_len = 0;
|
||||
}
|
||||
priv->tx_busy = false;
|
||||
netif_wake_queue(net);
|
||||
}
|
||||
|
||||
|
@ -754,7 +753,7 @@ static int hi3110_open(struct net_device *net)
|
|||
|
||||
priv->force_quit = 0;
|
||||
priv->tx_skb = NULL;
|
||||
priv->tx_len = 0;
|
||||
priv->tx_busy = false;
|
||||
|
||||
ret = request_threaded_irq(spi->irq, NULL, hi3110_can_ist,
|
||||
flags, DEVICE_NAME, priv);
|
||||
|
|
|
@ -237,7 +237,6 @@ struct mcp251x_priv {
|
|||
u8 *spi_rx_buf;
|
||||
|
||||
struct sk_buff *tx_skb;
|
||||
int tx_len;
|
||||
|
||||
struct workqueue_struct *wq;
|
||||
struct work_struct tx_work;
|
||||
|
@ -250,6 +249,8 @@ struct mcp251x_priv {
|
|||
#define AFTER_SUSPEND_POWER 4
|
||||
#define AFTER_SUSPEND_RESTART 8
|
||||
int restart_tx;
|
||||
bool tx_busy;
|
||||
|
||||
struct regulator *power;
|
||||
struct regulator *transceiver;
|
||||
struct clk *clk;
|
||||
|
@ -272,13 +273,13 @@ static void mcp251x_clean(struct net_device *net)
|
|||
{
|
||||
struct mcp251x_priv *priv = netdev_priv(net);
|
||||
|
||||
if (priv->tx_skb || priv->tx_len)
|
||||
if (priv->tx_skb || priv->tx_busy)
|
||||
net->stats.tx_errors++;
|
||||
dev_kfree_skb(priv->tx_skb);
|
||||
if (priv->tx_len)
|
||||
if (priv->tx_busy)
|
||||
can_free_echo_skb(priv->net, 0, NULL);
|
||||
priv->tx_skb = NULL;
|
||||
priv->tx_len = 0;
|
||||
priv->tx_busy = false;
|
||||
}
|
||||
|
||||
/* Note about handling of error return of mcp251x_spi_trans: accessing
|
||||
|
@ -600,9 +601,6 @@ static int mcp251x_gpio_setup(struct mcp251x_priv *priv)
|
|||
gpio->ngpio = ARRAY_SIZE(mcp251x_gpio_names);
|
||||
gpio->names = mcp251x_gpio_names;
|
||||
gpio->can_sleep = true;
|
||||
#ifdef CONFIG_OF_GPIO
|
||||
gpio->of_node = priv->spi->dev.of_node;
|
||||
#endif
|
||||
|
||||
return devm_gpiochip_add_data(&priv->spi->dev, gpio, priv);
|
||||
}
|
||||
|
@ -733,10 +731,12 @@ static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx)
|
|||
}
|
||||
/* Data length */
|
||||
frame->len = can_cc_dlc2len(buf[RXBDLC_OFF] & RXBDLC_LEN_MASK);
|
||||
memcpy(frame->data, buf + RXBDAT_OFF, frame->len);
|
||||
if (!(frame->can_id & CAN_RTR_FLAG)) {
|
||||
memcpy(frame->data, buf + RXBDAT_OFF, frame->len);
|
||||
|
||||
priv->net->stats.rx_bytes += frame->len;
|
||||
}
|
||||
priv->net->stats.rx_packets++;
|
||||
priv->net->stats.rx_bytes += frame->len;
|
||||
|
||||
can_led_event(priv->net, CAN_LED_EVENT_RX);
|
||||
|
||||
|
@ -786,7 +786,7 @@ static netdev_tx_t mcp251x_hard_start_xmit(struct sk_buff *skb,
|
|||
struct mcp251x_priv *priv = netdev_priv(net);
|
||||
struct spi_device *spi = priv->spi;
|
||||
|
||||
if (priv->tx_skb || priv->tx_len) {
|
||||
if (priv->tx_skb || priv->tx_busy) {
|
||||
dev_warn(&spi->dev, "hard_xmit called while tx busy\n");
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
@ -1011,7 +1011,7 @@ static void mcp251x_tx_work_handler(struct work_struct *ws)
|
|||
if (frame->len > CAN_FRAME_MAX_DATA_LEN)
|
||||
frame->len = CAN_FRAME_MAX_DATA_LEN;
|
||||
mcp251x_hw_tx(spi, frame, 0);
|
||||
priv->tx_len = 1 + frame->len;
|
||||
priv->tx_busy = true;
|
||||
can_put_echo_skb(priv->tx_skb, net, 0, 0);
|
||||
priv->tx_skb = NULL;
|
||||
}
|
||||
|
@ -1177,12 +1177,12 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id)
|
|||
break;
|
||||
|
||||
if (intf & CANINTF_TX) {
|
||||
net->stats.tx_packets++;
|
||||
net->stats.tx_bytes += priv->tx_len - 1;
|
||||
can_led_event(net, CAN_LED_EVENT_TX);
|
||||
if (priv->tx_len) {
|
||||
can_get_echo_skb(net, 0, NULL);
|
||||
priv->tx_len = 0;
|
||||
if (priv->tx_busy) {
|
||||
net->stats.tx_packets++;
|
||||
net->stats.tx_bytes += can_get_echo_skb(net, 0,
|
||||
NULL);
|
||||
priv->tx_busy = false;
|
||||
}
|
||||
netif_wake_queue(net);
|
||||
}
|
||||
|
@ -1209,7 +1209,7 @@ static int mcp251x_open(struct net_device *net)
|
|||
|
||||
priv->force_quit = 0;
|
||||
priv->tx_skb = NULL;
|
||||
priv->tx_len = 0;
|
||||
priv->tx_busy = false;
|
||||
|
||||
if (!dev_fwnode(&spi->dev))
|
||||
flags = IRQF_TRIGGER_FALLING;
|
||||
|
|
|
@ -501,18 +501,20 @@ static void sun4i_can_rx(struct net_device *dev)
|
|||
}
|
||||
|
||||
/* remote frame ? */
|
||||
if (fi & SUN4I_MSG_RTR_FLAG)
|
||||
if (fi & SUN4I_MSG_RTR_FLAG) {
|
||||
id |= CAN_RTR_FLAG;
|
||||
else
|
||||
} else {
|
||||
for (i = 0; i < cf->len; i++)
|
||||
cf->data[i] = readl(priv->base + dreg + i * 4);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
|
||||
cf->can_id = id;
|
||||
|
||||
sun4i_can_write_cmdreg(priv, SUN4I_CMD_RELEASE_RBUF);
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
|
||||
can_led_event(dev, CAN_LED_EVENT_RX);
|
||||
|
@ -633,13 +635,10 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
|
|||
can_bus_off(dev);
|
||||
}
|
||||
|
||||
if (likely(skb)) {
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
if (likely(skb))
|
||||
netif_rx(skb);
|
||||
} else {
|
||||
else
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -662,11 +661,8 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
|
|||
|
||||
if (isrc & SUN4I_INT_TBUF_VLD) {
|
||||
/* transmission complete interrupt */
|
||||
stats->tx_bytes +=
|
||||
readl(priv->base +
|
||||
SUN4I_REG_RBUF_RBACK_START_ADDR) & 0xf;
|
||||
stats->tx_bytes += can_get_echo_skb(dev, 0, NULL);
|
||||
stats->tx_packets++;
|
||||
can_get_echo_skb(dev, 0, NULL);
|
||||
netif_wake_queue(dev);
|
||||
can_led_event(dev, CAN_LED_EVENT_TX);
|
||||
}
|
||||
|
|
|
@ -859,7 +859,6 @@ static int ti_hecc_probe(struct platform_device *pdev)
|
|||
struct net_device *ndev = (struct net_device *)0;
|
||||
struct ti_hecc_priv *priv;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct resource *irq;
|
||||
struct regulator *reg_xceiver;
|
||||
int err = -ENODEV;
|
||||
|
||||
|
@ -904,9 +903,9 @@ static int ti_hecc_probe(struct platform_device *pdev)
|
|||
goto probe_exit_candev;
|
||||
}
|
||||
|
||||
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (!irq) {
|
||||
dev_err(&pdev->dev, "No irq resource\n");
|
||||
ndev->irq = platform_get_irq(pdev, 0);
|
||||
if (ndev->irq < 0) {
|
||||
err = ndev->irq;
|
||||
goto probe_exit_candev;
|
||||
}
|
||||
|
||||
|
@ -920,7 +919,6 @@ static int ti_hecc_probe(struct platform_device *pdev)
|
|||
priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES;
|
||||
|
||||
spin_lock_init(&priv->mbx_lock);
|
||||
ndev->irq = irq->start;
|
||||
ndev->flags |= IFF_ECHO;
|
||||
platform_set_drvdata(pdev, ndev);
|
||||
SET_NETDEV_DEV(ndev, &pdev->dev);
|
||||
|
|
|
@ -230,7 +230,6 @@ struct ems_tx_urb_context {
|
|||
struct ems_usb *dev;
|
||||
|
||||
u32 echo_index;
|
||||
u8 dlc;
|
||||
};
|
||||
|
||||
struct ems_usb {
|
||||
|
@ -320,10 +319,11 @@ static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg)
|
|||
} else {
|
||||
for (i = 0; i < cf->len; i++)
|
||||
cf->data[i] = msg->msg.can_msg.msg[i];
|
||||
}
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -397,8 +397,6 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)
|
|||
stats->rx_errors++;
|
||||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -518,9 +516,8 @@ static void ems_usb_write_bulk_callback(struct urb *urb)
|
|||
|
||||
/* transmission complete interrupt */
|
||||
netdev->stats.tx_packets++;
|
||||
netdev->stats.tx_bytes += context->dlc;
|
||||
|
||||
can_get_echo_skb(netdev, context->echo_index, NULL);
|
||||
netdev->stats.tx_bytes += can_get_echo_skb(netdev, context->echo_index,
|
||||
NULL);
|
||||
|
||||
/* Release context */
|
||||
context->echo_index = MAX_TX_URBS;
|
||||
|
@ -806,7 +803,6 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
|
|||
|
||||
context->dev = dev;
|
||||
context->echo_index = i;
|
||||
context->dlc = cf->len;
|
||||
|
||||
usb_fill_bulk_urb(urb, dev->udev, usb_sndbulkpipe(dev->udev, 2), buf,
|
||||
size, ems_usb_write_bulk_callback, context);
|
||||
|
|
|
@ -183,7 +183,6 @@ struct esd_usb2_net_priv;
|
|||
struct esd_tx_urb_context {
|
||||
struct esd_usb2_net_priv *priv;
|
||||
u32 echo_index;
|
||||
int len; /* CAN payload length */
|
||||
};
|
||||
|
||||
struct esd_usb2 {
|
||||
|
@ -293,8 +292,6 @@ static void esd_usb2_rx_event(struct esd_usb2_net_priv *priv,
|
|||
priv->bec.txerr = txerr;
|
||||
priv->bec.rxerr = rxerr;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
}
|
||||
}
|
||||
|
@ -334,10 +331,11 @@ static void esd_usb2_rx_can_msg(struct esd_usb2_net_priv *priv,
|
|||
} else {
|
||||
for (i = 0; i < cf->len; i++)
|
||||
cf->data[i] = msg->msg.rx.data[i];
|
||||
}
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -358,8 +356,8 @@ static void esd_usb2_tx_done_msg(struct esd_usb2_net_priv *priv,
|
|||
|
||||
if (!msg->msg.txdone.status) {
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += context->len;
|
||||
can_get_echo_skb(netdev, context->echo_index, NULL);
|
||||
stats->tx_bytes += can_get_echo_skb(netdev, context->echo_index,
|
||||
NULL);
|
||||
} else {
|
||||
stats->tx_errors++;
|
||||
can_free_echo_skb(netdev, context->echo_index, NULL);
|
||||
|
@ -784,7 +782,6 @@ static netdev_tx_t esd_usb2_start_xmit(struct sk_buff *skb,
|
|||
|
||||
context->priv = priv;
|
||||
context->echo_index = i;
|
||||
context->len = cf->len;
|
||||
|
||||
/* hnd must not be 0 - MSB is stripped in txdone handling */
|
||||
msg->msg.tx.hnd = 0x80000000 | i; /* returned in TX done message */
|
||||
|
|
|
@ -849,13 +849,6 @@ int es58x_rx_err_msg(struct net_device *netdev, enum es58x_err error,
|
|||
break;
|
||||
}
|
||||
|
||||
/* driver/net/can/dev.c:can_restart() takes in account error
|
||||
* messages in the RX stats. Doing the same here for
|
||||
* consistency.
|
||||
*/
|
||||
netdev->stats.rx_packets++;
|
||||
netdev->stats.rx_bytes += CAN_ERR_DLC;
|
||||
|
||||
if (cf) {
|
||||
if (cf->data[1])
|
||||
cf->can_id |= CAN_ERR_CRTL;
|
||||
|
@ -2094,6 +2087,7 @@ static int es58x_init_netdev(struct es58x_device *es58x_dev, int channel_idx)
|
|||
|
||||
netdev->netdev_ops = &es58x_netdev_ops;
|
||||
netdev->flags |= IFF_ECHO; /* We support local echo */
|
||||
netdev->dev_port = channel_idx;
|
||||
|
||||
ret = register_candev(netdev);
|
||||
if (ret)
|
||||
|
|
|
@ -357,9 +357,6 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
|
|||
goto resubmit_urb;
|
||||
}
|
||||
|
||||
netdev->stats.tx_packets++;
|
||||
netdev->stats.tx_bytes += hf->can_dlc;
|
||||
|
||||
txc = gs_get_tx_context(dev, hf->echo_id);
|
||||
|
||||
/* bad devices send bad echo_ids. */
|
||||
|
@ -370,7 +367,9 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
|
|||
goto resubmit_urb;
|
||||
}
|
||||
|
||||
can_get_echo_skb(netdev, hf->echo_id, NULL);
|
||||
netdev->stats.tx_packets++;
|
||||
netdev->stats.tx_bytes += can_get_echo_skb(netdev, hf->echo_id,
|
||||
NULL);
|
||||
|
||||
gs_free_tx_context(txc);
|
||||
|
||||
|
|
|
@ -77,7 +77,6 @@ struct kvaser_usb_dev_card_data {
|
|||
struct kvaser_usb_tx_urb_context {
|
||||
struct kvaser_usb_net_priv *priv;
|
||||
u32 echo_index;
|
||||
int dlc;
|
||||
};
|
||||
|
||||
struct kvaser_usb {
|
||||
|
@ -162,8 +161,8 @@ struct kvaser_usb_dev_ops {
|
|||
void (*dev_read_bulk_callback)(struct kvaser_usb *dev, void *buf,
|
||||
int len);
|
||||
void *(*dev_frame_to_cmd)(const struct kvaser_usb_net_priv *priv,
|
||||
const struct sk_buff *skb, int *frame_len,
|
||||
int *cmd_len, u16 transid);
|
||||
const struct sk_buff *skb, int *cmd_len,
|
||||
u16 transid);
|
||||
};
|
||||
|
||||
struct kvaser_usb_dev_cfg {
|
||||
|
|
|
@ -279,8 +279,6 @@ int kvaser_usb_can_rx_over_error(struct net_device *netdev)
|
|||
cf->can_id |= CAN_ERR_CRTL;
|
||||
cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
|
||||
return 0;
|
||||
|
@ -567,7 +565,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb,
|
|||
goto freeurb;
|
||||
}
|
||||
|
||||
buf = dev->ops->dev_frame_to_cmd(priv, skb, &context->dlc, &cmd_len,
|
||||
buf = dev->ops->dev_frame_to_cmd(priv, skb, &cmd_len,
|
||||
context->echo_index);
|
||||
if (!buf) {
|
||||
stats->tx_dropped++;
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/units.h>
|
||||
#include <linux/usb.h>
|
||||
|
||||
#include <linux/can.h>
|
||||
|
@ -295,6 +296,7 @@ struct kvaser_cmd {
|
|||
#define KVASER_USB_HYDRA_CF_FLAG_OVERRUN BIT(1)
|
||||
#define KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME BIT(4)
|
||||
#define KVASER_USB_HYDRA_CF_FLAG_EXTENDED_ID BIT(5)
|
||||
#define KVASER_USB_HYDRA_CF_FLAG_TX_ACK BIT(6)
|
||||
/* CAN frame flags. Used in ext_rx_can and ext_tx_can */
|
||||
#define KVASER_USB_HYDRA_CF_FLAG_OSM_NACK BIT(12)
|
||||
#define KVASER_USB_HYDRA_CF_FLAG_ABL BIT(13)
|
||||
|
@ -869,7 +871,6 @@ static void kvaser_usb_hydra_update_state(struct kvaser_usb_net_priv *priv,
|
|||
struct net_device *netdev = priv->netdev;
|
||||
struct can_frame *cf;
|
||||
struct sk_buff *skb;
|
||||
struct net_device_stats *stats;
|
||||
enum can_state new_state, old_state;
|
||||
|
||||
old_state = priv->can.state;
|
||||
|
@ -919,9 +920,6 @@ static void kvaser_usb_hydra_update_state(struct kvaser_usb_net_priv *priv,
|
|||
cf->data[6] = bec->txerr;
|
||||
cf->data[7] = bec->rxerr;
|
||||
|
||||
stats = &netdev->stats;
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -1074,8 +1072,6 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv,
|
|||
cf->data[6] = bec.txerr;
|
||||
cf->data[7] = bec.rxerr;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
|
||||
priv->bec.txerr = bec.txerr;
|
||||
|
@ -1109,8 +1105,6 @@ static void kvaser_usb_hydra_one_shot_fail(struct kvaser_usb_net_priv *priv,
|
|||
}
|
||||
|
||||
stats->tx_errors++;
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -1120,7 +1114,9 @@ static void kvaser_usb_hydra_tx_acknowledge(const struct kvaser_usb *dev,
|
|||
struct kvaser_usb_tx_urb_context *context;
|
||||
struct kvaser_usb_net_priv *priv;
|
||||
unsigned long irq_flags;
|
||||
unsigned int len;
|
||||
bool one_shot_fail = false;
|
||||
bool is_err_frame = false;
|
||||
u16 transid = kvaser_usb_hydra_get_cmd_transid(cmd);
|
||||
|
||||
priv = kvaser_usb_hydra_net_priv_from_cmd(dev, cmd);
|
||||
|
@ -1139,24 +1135,28 @@ static void kvaser_usb_hydra_tx_acknowledge(const struct kvaser_usb *dev,
|
|||
kvaser_usb_hydra_one_shot_fail(priv, cmd_ext);
|
||||
one_shot_fail = true;
|
||||
}
|
||||
|
||||
is_err_frame = flags & KVASER_USB_HYDRA_CF_FLAG_TX_ACK &&
|
||||
flags & KVASER_USB_HYDRA_CF_FLAG_ERROR_FRAME;
|
||||
}
|
||||
|
||||
context = &priv->tx_contexts[transid % dev->max_tx_urbs];
|
||||
if (!one_shot_fail) {
|
||||
struct net_device_stats *stats = &priv->netdev->stats;
|
||||
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += can_fd_dlc2len(context->dlc);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&priv->tx_contexts_lock, irq_flags);
|
||||
|
||||
can_get_echo_skb(priv->netdev, context->echo_index, NULL);
|
||||
len = can_get_echo_skb(priv->netdev, context->echo_index, NULL);
|
||||
context->echo_index = dev->max_tx_urbs;
|
||||
--priv->active_tx_contexts;
|
||||
netif_wake_queue(priv->netdev);
|
||||
|
||||
spin_unlock_irqrestore(&priv->tx_contexts_lock, irq_flags);
|
||||
|
||||
if (!one_shot_fail && !is_err_frame) {
|
||||
struct net_device_stats *stats = &priv->netdev->stats;
|
||||
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += len;
|
||||
}
|
||||
}
|
||||
|
||||
static void kvaser_usb_hydra_rx_msg_std(const struct kvaser_usb *dev,
|
||||
|
@ -1208,13 +1208,15 @@ static void kvaser_usb_hydra_rx_msg_std(const struct kvaser_usb *dev,
|
|||
|
||||
cf->len = can_cc_dlc2len(cmd->rx_can.dlc);
|
||||
|
||||
if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME)
|
||||
if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME) {
|
||||
cf->can_id |= CAN_RTR_FLAG;
|
||||
else
|
||||
} else {
|
||||
memcpy(cf->data, cmd->rx_can.data, cf->len);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -1286,13 +1288,15 @@ static void kvaser_usb_hydra_rx_msg_ext(const struct kvaser_usb *dev,
|
|||
cf->len = can_cc_dlc2len(dlc);
|
||||
}
|
||||
|
||||
if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME)
|
||||
if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME) {
|
||||
cf->can_id |= CAN_RTR_FLAG;
|
||||
else
|
||||
} else {
|
||||
memcpy(cf->data, cmd->rx_can.kcan_payload, cf->len);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -1371,8 +1375,8 @@ static void kvaser_usb_hydra_handle_cmd(const struct kvaser_usb *dev,
|
|||
|
||||
static void *
|
||||
kvaser_usb_hydra_frame_to_cmd_ext(const struct kvaser_usb_net_priv *priv,
|
||||
const struct sk_buff *skb, int *frame_len,
|
||||
int *cmd_len, u16 transid)
|
||||
const struct sk_buff *skb, int *cmd_len,
|
||||
u16 transid)
|
||||
{
|
||||
struct kvaser_usb *dev = priv->dev;
|
||||
struct kvaser_cmd_ext *cmd;
|
||||
|
@ -1384,8 +1388,6 @@ kvaser_usb_hydra_frame_to_cmd_ext(const struct kvaser_usb_net_priv *priv,
|
|||
u32 kcan_id;
|
||||
u32 kcan_header;
|
||||
|
||||
*frame_len = nbr_of_bytes;
|
||||
|
||||
cmd = kcalloc(1, sizeof(struct kvaser_cmd_ext), GFP_ATOMIC);
|
||||
if (!cmd)
|
||||
return NULL;
|
||||
|
@ -1451,8 +1453,8 @@ kvaser_usb_hydra_frame_to_cmd_ext(const struct kvaser_usb_net_priv *priv,
|
|||
|
||||
static void *
|
||||
kvaser_usb_hydra_frame_to_cmd_std(const struct kvaser_usb_net_priv *priv,
|
||||
const struct sk_buff *skb, int *frame_len,
|
||||
int *cmd_len, u16 transid)
|
||||
const struct sk_buff *skb, int *cmd_len,
|
||||
u16 transid)
|
||||
{
|
||||
struct kvaser_usb *dev = priv->dev;
|
||||
struct kvaser_cmd *cmd;
|
||||
|
@ -1460,8 +1462,6 @@ kvaser_usb_hydra_frame_to_cmd_std(const struct kvaser_usb_net_priv *priv,
|
|||
u32 flags;
|
||||
u32 id;
|
||||
|
||||
*frame_len = cf->len;
|
||||
|
||||
cmd = kcalloc(1, sizeof(struct kvaser_cmd), GFP_ATOMIC);
|
||||
if (!cmd)
|
||||
return NULL;
|
||||
|
@ -1495,7 +1495,7 @@ kvaser_usb_hydra_frame_to_cmd_std(const struct kvaser_usb_net_priv *priv,
|
|||
cmd->tx_can.id = cpu_to_le32(id);
|
||||
cmd->tx_can.flags = flags;
|
||||
|
||||
memcpy(cmd->tx_can.data, cf->data, *frame_len);
|
||||
memcpy(cmd->tx_can.data, cf->data, cf->len);
|
||||
|
||||
return cmd;
|
||||
}
|
||||
|
@ -2003,17 +2003,17 @@ static void kvaser_usb_hydra_read_bulk_callback(struct kvaser_usb *dev,
|
|||
|
||||
static void *
|
||||
kvaser_usb_hydra_frame_to_cmd(const struct kvaser_usb_net_priv *priv,
|
||||
const struct sk_buff *skb, int *frame_len,
|
||||
int *cmd_len, u16 transid)
|
||||
const struct sk_buff *skb, int *cmd_len,
|
||||
u16 transid)
|
||||
{
|
||||
void *buf;
|
||||
|
||||
if (priv->dev->card_data.capabilities & KVASER_USB_HYDRA_CAP_EXT_CMD)
|
||||
buf = kvaser_usb_hydra_frame_to_cmd_ext(priv, skb, frame_len,
|
||||
cmd_len, transid);
|
||||
buf = kvaser_usb_hydra_frame_to_cmd_ext(priv, skb, cmd_len,
|
||||
transid);
|
||||
else
|
||||
buf = kvaser_usb_hydra_frame_to_cmd_std(priv, skb, frame_len,
|
||||
cmd_len, transid);
|
||||
buf = kvaser_usb_hydra_frame_to_cmd_std(priv, skb, cmd_len,
|
||||
transid);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
@ -2040,7 +2040,7 @@ const struct kvaser_usb_dev_ops kvaser_usb_hydra_dev_ops = {
|
|||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_kcan = {
|
||||
.clock = {
|
||||
.freq = 80000000,
|
||||
.freq = 80 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 80,
|
||||
.bittiming_const = &kvaser_usb_hydra_kcan_bittiming_c,
|
||||
|
@ -2049,7 +2049,7 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_kcan = {
|
|||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_flexc = {
|
||||
.clock = {
|
||||
.freq = 24000000,
|
||||
.freq = 24 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_hydra_flexc_bittiming_c,
|
||||
|
@ -2057,7 +2057,7 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_flexc = {
|
|||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_rt = {
|
||||
.clock = {
|
||||
.freq = 80000000,
|
||||
.freq = 80 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 24,
|
||||
.bittiming_const = &kvaser_usb_hydra_rt_bittiming_c,
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/units.h>
|
||||
#include <linux/usb.h>
|
||||
|
||||
#include <linux/can.h>
|
||||
|
@ -356,7 +357,7 @@ static const struct can_bittiming_const kvaser_usb_leaf_bittiming_const = {
|
|||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_8mhz = {
|
||||
.clock = {
|
||||
.freq = 8000000,
|
||||
.freq = 8 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
|
@ -364,7 +365,7 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_8mhz = {
|
|||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_16mhz = {
|
||||
.clock = {
|
||||
.freq = 16000000,
|
||||
.freq = 16 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
|
@ -372,7 +373,7 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_16mhz = {
|
|||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_24mhz = {
|
||||
.clock = {
|
||||
.freq = 24000000,
|
||||
.freq = 24 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
|
@ -380,7 +381,7 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_24mhz = {
|
|||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_32mhz = {
|
||||
.clock = {
|
||||
.freq = 32000000,
|
||||
.freq = 32 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
|
@ -388,16 +389,14 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_32mhz = {
|
|||
|
||||
static void *
|
||||
kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv,
|
||||
const struct sk_buff *skb, int *frame_len,
|
||||
int *cmd_len, u16 transid)
|
||||
const struct sk_buff *skb, int *cmd_len,
|
||||
u16 transid)
|
||||
{
|
||||
struct kvaser_usb *dev = priv->dev;
|
||||
struct kvaser_cmd *cmd;
|
||||
u8 *cmd_tx_can_flags = NULL; /* GCC */
|
||||
struct can_frame *cf = (struct can_frame *)skb->data;
|
||||
|
||||
*frame_len = cf->len;
|
||||
|
||||
cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC);
|
||||
if (cmd) {
|
||||
cmd->u.tx_can.tid = transid & 0xff;
|
||||
|
@ -641,8 +640,6 @@ static void kvaser_usb_leaf_tx_acknowledge(const struct kvaser_usb *dev,
|
|||
if (skb) {
|
||||
cf->can_id |= CAN_ERR_RESTARTED;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
} else {
|
||||
netdev_err(priv->netdev,
|
||||
|
@ -655,12 +652,11 @@ static void kvaser_usb_leaf_tx_acknowledge(const struct kvaser_usb *dev,
|
|||
priv->can.state = CAN_STATE_ERROR_ACTIVE;
|
||||
}
|
||||
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += context->dlc;
|
||||
|
||||
spin_lock_irqsave(&priv->tx_contexts_lock, flags);
|
||||
|
||||
can_get_echo_skb(priv->netdev, context->echo_index, NULL);
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += can_get_echo_skb(priv->netdev,
|
||||
context->echo_index, NULL);
|
||||
context->echo_index = dev->max_tx_urbs;
|
||||
--priv->active_tx_contexts;
|
||||
netif_wake_queue(priv->netdev);
|
||||
|
@ -843,8 +839,6 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
|
|||
cf->data[6] = es->txerr;
|
||||
cf->data[7] = es->rxerr;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -1071,7 +1065,8 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
|
|||
}
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
if (!(cf->can_id & CAN_RTR_FLAG))
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
|
|
@ -64,7 +64,6 @@
|
|||
struct mcba_usb_ctx {
|
||||
struct mcba_priv *priv;
|
||||
u32 ndx;
|
||||
u8 dlc;
|
||||
bool can;
|
||||
};
|
||||
|
||||
|
@ -184,13 +183,10 @@ static inline struct mcba_usb_ctx *mcba_usb_get_free_ctx(struct mcba_priv *priv,
|
|||
ctx = &priv->tx_context[i];
|
||||
ctx->ndx = i;
|
||||
|
||||
if (cf) {
|
||||
if (cf)
|
||||
ctx->can = true;
|
||||
ctx->dlc = cf->len;
|
||||
} else {
|
||||
else
|
||||
ctx->can = false;
|
||||
ctx->dlc = 0;
|
||||
}
|
||||
|
||||
atomic_dec(&priv->free_ctx_cnt);
|
||||
break;
|
||||
|
@ -236,10 +232,10 @@ static void mcba_usb_write_bulk_callback(struct urb *urb)
|
|||
return;
|
||||
|
||||
netdev->stats.tx_packets++;
|
||||
netdev->stats.tx_bytes += ctx->dlc;
|
||||
netdev->stats.tx_bytes += can_get_echo_skb(netdev, ctx->ndx,
|
||||
NULL);
|
||||
|
||||
can_led_event(netdev, CAN_LED_EVENT_TX);
|
||||
can_get_echo_skb(netdev, ctx->ndx, NULL);
|
||||
}
|
||||
|
||||
if (urb->status)
|
||||
|
@ -450,15 +446,16 @@ static void mcba_usb_process_can(struct mcba_priv *priv,
|
|||
cf->can_id = (sid & 0xffe0) >> 5;
|
||||
}
|
||||
|
||||
if (msg->dlc & MCBA_DLC_RTR_MASK)
|
||||
cf->can_id |= CAN_RTR_FLAG;
|
||||
|
||||
cf->len = can_cc_dlc2len(msg->dlc & MCBA_DLC_MASK);
|
||||
|
||||
memcpy(cf->data, msg->data, cf->len);
|
||||
if (msg->dlc & MCBA_DLC_RTR_MASK) {
|
||||
cf->can_id |= CAN_RTR_FLAG;
|
||||
} else {
|
||||
memcpy(cf->data, msg->data, cf->len);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
can_led_event(priv->netdev, CAN_LED_EVENT_RX);
|
||||
netif_rx(skb);
|
||||
|
|
|
@ -521,8 +521,6 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n,
|
|||
&hwts->hwtstamp);
|
||||
}
|
||||
|
||||
mc->netdev->stats.rx_packets++;
|
||||
mc->netdev->stats.rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
|
||||
return 0;
|
||||
|
@ -679,15 +677,16 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len)
|
|||
/* Ignore next byte (client private id) if SRR bit is set */
|
||||
if (can_id_flags & PCAN_USB_TX_SRR)
|
||||
mc->ptr++;
|
||||
|
||||
/* update statistics */
|
||||
mc->netdev->stats.rx_bytes += cf->len;
|
||||
}
|
||||
mc->netdev->stats.rx_packets++;
|
||||
|
||||
/* convert timestamp into kernel time */
|
||||
hwts = skb_hwtstamps(skb);
|
||||
peak_usb_get_ts_time(&mc->pdev->time_ref, mc->ts16, &hwts->hwtstamp);
|
||||
|
||||
/* update statistics */
|
||||
mc->netdev->stats.rx_packets++;
|
||||
mc->netdev->stats.rx_bytes += cf->len;
|
||||
/* push the skb */
|
||||
netif_rx(skb);
|
||||
|
||||
|
|
|
@ -291,6 +291,7 @@ static void peak_usb_write_bulk_callback(struct urb *urb)
|
|||
struct peak_tx_urb_context *context = urb->context;
|
||||
struct peak_usb_device *dev;
|
||||
struct net_device *netdev;
|
||||
int tx_bytes;
|
||||
|
||||
BUG_ON(!context);
|
||||
|
||||
|
@ -305,10 +306,6 @@ static void peak_usb_write_bulk_callback(struct urb *urb)
|
|||
/* check tx status */
|
||||
switch (urb->status) {
|
||||
case 0:
|
||||
/* transmission complete */
|
||||
netdev->stats.tx_packets++;
|
||||
netdev->stats.tx_bytes += context->data_len;
|
||||
|
||||
/* prevent tx timeout */
|
||||
netif_trans_update(netdev);
|
||||
break;
|
||||
|
@ -327,12 +324,17 @@ static void peak_usb_write_bulk_callback(struct urb *urb)
|
|||
}
|
||||
|
||||
/* should always release echo skb and corresponding context */
|
||||
can_get_echo_skb(netdev, context->echo_index, NULL);
|
||||
tx_bytes = can_get_echo_skb(netdev, context->echo_index, NULL);
|
||||
context->echo_index = PCAN_USB_MAX_TX_URBS;
|
||||
|
||||
/* do wakeup tx queue in case of success only */
|
||||
if (!urb->status)
|
||||
if (!urb->status) {
|
||||
/* transmission complete */
|
||||
netdev->stats.tx_packets++;
|
||||
netdev->stats.tx_bytes += tx_bytes;
|
||||
|
||||
/* do wakeup tx queue in case of success only */
|
||||
netif_wake_queue(netdev);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -344,7 +346,6 @@ static netdev_tx_t peak_usb_ndo_start_xmit(struct sk_buff *skb,
|
|||
struct peak_usb_device *dev = netdev_priv(netdev);
|
||||
struct peak_tx_urb_context *context = NULL;
|
||||
struct net_device_stats *stats = &netdev->stats;
|
||||
struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
|
||||
struct urb *urb;
|
||||
u8 *obuf;
|
||||
int i, err;
|
||||
|
@ -378,9 +379,6 @@ static netdev_tx_t peak_usb_ndo_start_xmit(struct sk_buff *skb,
|
|||
|
||||
context->echo_index = i;
|
||||
|
||||
/* Note: this works with CANFD frames too */
|
||||
context->data_len = cfd->len;
|
||||
|
||||
usb_anchor_urb(urb, &dev->tx_submitted);
|
||||
|
||||
can_put_echo_skb(skb, netdev, context->echo_index, 0);
|
||||
|
|
|
@ -99,7 +99,6 @@ struct peak_time_ref {
|
|||
struct peak_tx_urb_context {
|
||||
struct peak_usb_device *dev;
|
||||
u32 echo_index;
|
||||
u8 data_len;
|
||||
struct urb *urb;
|
||||
};
|
||||
|
||||
|
|
|
@ -507,13 +507,13 @@ static int pcan_usb_fd_decode_canmsg(struct pcan_usb_fd_if *usb_if,
|
|||
if (rx_msg_flags & PUCAN_MSG_EXT_ID)
|
||||
cfd->can_id |= CAN_EFF_FLAG;
|
||||
|
||||
if (rx_msg_flags & PUCAN_MSG_RTR)
|
||||
if (rx_msg_flags & PUCAN_MSG_RTR) {
|
||||
cfd->can_id |= CAN_RTR_FLAG;
|
||||
else
|
||||
} else {
|
||||
memcpy(cfd->data, rm->d, cfd->len);
|
||||
|
||||
netdev->stats.rx_bytes += cfd->len;
|
||||
}
|
||||
netdev->stats.rx_packets++;
|
||||
netdev->stats.rx_bytes += cfd->len;
|
||||
|
||||
peak_usb_netif_rx_64(skb, le32_to_cpu(rm->ts_low),
|
||||
le32_to_cpu(rm->ts_high));
|
||||
|
@ -577,9 +577,6 @@ static int pcan_usb_fd_decode_status(struct pcan_usb_fd_if *usb_if,
|
|||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
netdev->stats.rx_packets++;
|
||||
netdev->stats.rx_bytes += cf->len;
|
||||
|
||||
peak_usb_netif_rx_64(skb, le32_to_cpu(sm->ts_low),
|
||||
le32_to_cpu(sm->ts_high));
|
||||
|
||||
|
|
|
@ -536,17 +536,19 @@ static int pcan_usb_pro_handle_canmsg(struct pcan_usb_pro_interface *usb_if,
|
|||
if (rx->flags & PCAN_USBPRO_EXT)
|
||||
can_frame->can_id |= CAN_EFF_FLAG;
|
||||
|
||||
if (rx->flags & PCAN_USBPRO_RTR)
|
||||
if (rx->flags & PCAN_USBPRO_RTR) {
|
||||
can_frame->can_id |= CAN_RTR_FLAG;
|
||||
else
|
||||
} else {
|
||||
memcpy(can_frame->data, rx->data, can_frame->len);
|
||||
|
||||
netdev->stats.rx_bytes += can_frame->len;
|
||||
}
|
||||
netdev->stats.rx_packets++;
|
||||
|
||||
hwts = skb_hwtstamps(skb);
|
||||
peak_usb_get_ts_time(&usb_if->time_ref, le32_to_cpu(rx->ts32),
|
||||
&hwts->hwtstamp);
|
||||
|
||||
netdev->stats.rx_packets++;
|
||||
netdev->stats.rx_bytes += can_frame->len;
|
||||
netif_rx(skb);
|
||||
|
||||
return 0;
|
||||
|
@ -660,8 +662,6 @@ static int pcan_usb_pro_handle_error(struct pcan_usb_pro_interface *usb_if,
|
|||
|
||||
hwts = skb_hwtstamps(skb);
|
||||
peak_usb_get_ts_time(&usb_if->time_ref, le32_to_cpu(er->ts32), &hwts->hwtstamp);
|
||||
netdev->stats.rx_packets++;
|
||||
netdev->stats.rx_bytes += can_frame->len;
|
||||
netif_rx(skb);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -259,7 +259,6 @@ struct ucan_priv;
|
|||
/* Context Information for transmission URBs */
|
||||
struct ucan_urb_context {
|
||||
struct ucan_priv *up;
|
||||
u8 dlc;
|
||||
bool allocated;
|
||||
};
|
||||
|
||||
|
@ -621,8 +620,11 @@ static void ucan_rx_can_msg(struct ucan_priv *up, struct ucan_message_in *m)
|
|||
memcpy(cf->data, m->msg.can_msg.data, cf->len);
|
||||
|
||||
/* don't count error frames as real packets */
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
if (!(cf->can_id & CAN_ERR_FLAG)) {
|
||||
stats->rx_packets++;
|
||||
if (!(cf->can_id & CAN_RTR_FLAG))
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
|
||||
/* pass it to Linux */
|
||||
netif_rx(skb);
|
||||
|
@ -634,7 +636,7 @@ static void ucan_tx_complete_msg(struct ucan_priv *up,
|
|||
{
|
||||
unsigned long flags;
|
||||
u16 count, i;
|
||||
u8 echo_index, dlc;
|
||||
u8 echo_index;
|
||||
u16 len = le16_to_cpu(m->len);
|
||||
|
||||
struct ucan_urb_context *context;
|
||||
|
@ -658,7 +660,6 @@ static void ucan_tx_complete_msg(struct ucan_priv *up,
|
|||
|
||||
/* gather information from the context */
|
||||
context = &up->context_array[echo_index];
|
||||
dlc = READ_ONCE(context->dlc);
|
||||
|
||||
/* Release context and restart queue if necessary.
|
||||
* Also check if the context was allocated
|
||||
|
@ -671,8 +672,8 @@ static void ucan_tx_complete_msg(struct ucan_priv *up,
|
|||
UCAN_TX_COMPLETE_SUCCESS) {
|
||||
/* update statistics */
|
||||
up->netdev->stats.tx_packets++;
|
||||
up->netdev->stats.tx_bytes += dlc;
|
||||
can_get_echo_skb(up->netdev, echo_index, NULL);
|
||||
up->netdev->stats.tx_bytes +=
|
||||
can_get_echo_skb(up->netdev, echo_index, NULL);
|
||||
} else {
|
||||
up->netdev->stats.tx_dropped++;
|
||||
can_free_echo_skb(up->netdev, echo_index, NULL);
|
||||
|
@ -1086,8 +1087,6 @@ static struct urb *ucan_prepare_tx_urb(struct ucan_priv *up,
|
|||
}
|
||||
m->len = cpu_to_le16(mlen);
|
||||
|
||||
context->dlc = cf->len;
|
||||
|
||||
m->subtype = echo_index;
|
||||
|
||||
/* build the urb */
|
||||
|
|
|
@ -114,15 +114,12 @@ struct usb_8dev_tx_urb_context {
|
|||
struct usb_8dev_priv *priv;
|
||||
|
||||
u32 echo_index;
|
||||
u8 dlc;
|
||||
};
|
||||
|
||||
/* Structure to hold all of our device specific stuff */
|
||||
struct usb_8dev_priv {
|
||||
struct can_priv can; /* must be the first member */
|
||||
|
||||
struct sk_buff *echo_skb[MAX_TX_URBS];
|
||||
|
||||
struct usb_device *udev;
|
||||
struct net_device *netdev;
|
||||
|
||||
|
@ -449,8 +446,6 @@ static void usb_8dev_rx_err_msg(struct usb_8dev_priv *priv,
|
|||
priv->bec.txerr = txerr;
|
||||
priv->bec.rxerr = rxerr;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
|
@ -476,13 +471,14 @@ static void usb_8dev_rx_can_msg(struct usb_8dev_priv *priv,
|
|||
if (msg->flags & USB_8DEV_EXTID)
|
||||
cf->can_id |= CAN_EFF_FLAG;
|
||||
|
||||
if (msg->flags & USB_8DEV_RTR)
|
||||
if (msg->flags & USB_8DEV_RTR) {
|
||||
cf->can_id |= CAN_RTR_FLAG;
|
||||
else
|
||||
} else {
|
||||
memcpy(cf->data, msg->data, cf->len);
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
netif_rx(skb);
|
||||
|
||||
can_led_event(priv->netdev, CAN_LED_EVENT_RX);
|
||||
|
@ -584,9 +580,7 @@ static void usb_8dev_write_bulk_callback(struct urb *urb)
|
|||
urb->status);
|
||||
|
||||
netdev->stats.tx_packets++;
|
||||
netdev->stats.tx_bytes += context->dlc;
|
||||
|
||||
can_get_echo_skb(netdev, context->echo_index, NULL);
|
||||
netdev->stats.tx_bytes += can_get_echo_skb(netdev, context->echo_index, NULL);
|
||||
|
||||
can_led_event(netdev, CAN_LED_EVENT_TX);
|
||||
|
||||
|
@ -657,7 +651,6 @@ static netdev_tx_t usb_8dev_start_xmit(struct sk_buff *skb,
|
|||
|
||||
context->priv = priv;
|
||||
context->echo_index = i;
|
||||
context->dlc = cf->len;
|
||||
|
||||
usb_fill_bulk_urb(urb, priv->udev,
|
||||
usb_sndbulkpipe(priv->udev, USB_8DEV_ENDP_DATA_TX),
|
||||
|
|
|
@ -87,13 +87,14 @@ static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
{
|
||||
struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
int loop;
|
||||
int loop, len;
|
||||
|
||||
if (can_dropped_invalid_skb(dev, skb))
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
len = cfd->can_id & CAN_RTR_FLAG ? 0 : cfd->len;
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += cfd->len;
|
||||
stats->tx_bytes += len;
|
||||
|
||||
/* set flag whether this packet has to be looped back */
|
||||
loop = skb->pkt_type == PACKET_LOOPBACK;
|
||||
|
@ -105,7 +106,7 @@ static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
* CAN core already did the echo for us
|
||||
*/
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cfd->len;
|
||||
stats->rx_bytes += len;
|
||||
}
|
||||
consume_skb(skb);
|
||||
return NETDEV_TX_OK;
|
||||
|
|
|
@ -62,7 +62,7 @@ static netdev_tx_t vxcan_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
skb->dev = peer;
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
len = cfd->len;
|
||||
len = cfd->can_id & CAN_RTR_FLAG ? 0 : cfd->len;
|
||||
if (netif_rx_ni(skb) == NET_RX_SUCCESS) {
|
||||
srcstats->tx_packets++;
|
||||
srcstats->tx_bytes += len;
|
||||
|
|
|
@ -787,10 +787,11 @@ static int xcan_rx(struct net_device *ndev, int frame_base)
|
|||
*(__be32 *)(cf->data) = cpu_to_be32(data[0]);
|
||||
if (cf->len > 4)
|
||||
*(__be32 *)(cf->data + 4) = cpu_to_be32(data[1]);
|
||||
}
|
||||
|
||||
stats->rx_bytes += cf->len;
|
||||
stats->rx_bytes += cf->len;
|
||||
}
|
||||
stats->rx_packets++;
|
||||
|
||||
netif_receive_skb(skb);
|
||||
|
||||
return 1;
|
||||
|
@ -871,8 +872,11 @@ static int xcanfd_rx(struct net_device *ndev, int frame_base)
|
|||
*(__be32 *)(cf->data + i) = cpu_to_be32(data[0]);
|
||||
}
|
||||
}
|
||||
stats->rx_bytes += cf->len;
|
||||
|
||||
if (!(cf->can_id & CAN_RTR_FLAG))
|
||||
stats->rx_bytes += cf->len;
|
||||
stats->rx_packets++;
|
||||
|
||||
netif_receive_skb(skb);
|
||||
|
||||
return 1;
|
||||
|
@ -965,13 +969,8 @@ static void xcan_update_error_state_after_rxtx(struct net_device *ndev)
|
|||
|
||||
xcan_set_error_state(ndev, new_state, skb ? cf : NULL);
|
||||
|
||||
if (skb) {
|
||||
struct net_device_stats *stats = &ndev->stats;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->len;
|
||||
if (skb)
|
||||
netif_rx(skb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1095,8 +1094,6 @@ static void xcan_err_interrupt(struct net_device *ndev, u32 isr)
|
|||
if (skb) {
|
||||
skb_cf->can_id |= cf.can_id;
|
||||
memcpy(skb_cf->data, cf.data, CAN_ERR_DLC);
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += CAN_ERR_DLC;
|
||||
netif_rx(skb);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,12 +64,14 @@ struct can_priv {
|
|||
struct gpio_desc *termination_gpio;
|
||||
u16 termination_gpio_ohms[CAN_TERMINATION_GPIO_MAX];
|
||||
|
||||
unsigned int echo_skb_max;
|
||||
struct sk_buff **echo_skb;
|
||||
|
||||
enum can_state state;
|
||||
|
||||
/* CAN controller features - see include/uapi/linux/can/netlink.h */
|
||||
u32 ctrlmode; /* current options setting */
|
||||
u32 ctrlmode_supported; /* options that can be modified by netlink */
|
||||
u32 ctrlmode_static; /* static enabled options for driver/hardware */
|
||||
|
||||
int restart_ms;
|
||||
struct delayed_work restart_work;
|
||||
|
@ -84,9 +86,6 @@ struct can_priv {
|
|||
struct can_berr_counter *bec);
|
||||
int (*do_get_auto_tdcv)(const struct net_device *dev, u32 *tdcv);
|
||||
|
||||
unsigned int echo_skb_max;
|
||||
struct sk_buff **echo_skb;
|
||||
|
||||
#ifdef CONFIG_CAN_LEDS
|
||||
struct led_trigger *tx_led_trig;
|
||||
char tx_led_trig_name[CAN_LED_NAME_SZ];
|
||||
|
@ -132,18 +131,29 @@ static inline s32 can_get_relative_tdco(const struct can_priv *priv)
|
|||
}
|
||||
|
||||
/* helper to define static CAN controller features at device creation time */
|
||||
static inline void can_set_static_ctrlmode(struct net_device *dev,
|
||||
u32 static_mode)
|
||||
static inline int __must_check can_set_static_ctrlmode(struct net_device *dev,
|
||||
u32 static_mode)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
|
||||
/* alloc_candev() succeeded => netdev_priv() is valid at this point */
|
||||
if (priv->ctrlmode_supported & static_mode) {
|
||||
netdev_warn(dev,
|
||||
"Controller features can not be supported and static at the same time\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
priv->ctrlmode = static_mode;
|
||||
priv->ctrlmode_static = static_mode;
|
||||
|
||||
/* override MTU which was set by default in can_setup()? */
|
||||
if (static_mode & CAN_CTRLMODE_FD)
|
||||
dev->mtu = CANFD_MTU;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u32 can_get_static_ctrlmode(struct can_priv *priv)
|
||||
{
|
||||
return priv->ctrlmode & ~priv->ctrlmode_supported;
|
||||
}
|
||||
|
||||
void can_setup(struct net_device *dev);
|
||||
|
|
|
@ -21,8 +21,9 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
|
|||
unsigned int idx, unsigned int frame_len);
|
||||
struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx,
|
||||
u8 *len_ptr, unsigned int *frame_len_ptr);
|
||||
unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx,
|
||||
unsigned int *frame_len_ptr);
|
||||
unsigned int __must_check can_get_echo_skb(struct net_device *dev,
|
||||
unsigned int idx,
|
||||
unsigned int *frame_len_ptr);
|
||||
void can_free_echo_skb(struct net_device *dev, unsigned int idx,
|
||||
unsigned int *frame_len_ptr);
|
||||
struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf);
|
||||
|
|
|
@ -137,6 +137,7 @@ enum {
|
|||
IFLA_CAN_DATA_BITRATE_CONST,
|
||||
IFLA_CAN_BITRATE_MAX,
|
||||
IFLA_CAN_TDC,
|
||||
IFLA_CAN_CTRLMODE_EXT,
|
||||
|
||||
/* add new constants above here */
|
||||
__IFLA_CAN_MAX,
|
||||
|
@ -166,6 +167,18 @@ enum {
|
|||
IFLA_CAN_TDC_MAX = __IFLA_CAN_TDC - 1
|
||||
};
|
||||
|
||||
/*
|
||||
* IFLA_CAN_CTRLMODE_EXT nest: controller mode extended parameters
|
||||
*/
|
||||
enum {
|
||||
IFLA_CAN_CTRLMODE_UNSPEC,
|
||||
IFLA_CAN_CTRLMODE_SUPPORTED, /* u32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__IFLA_CAN_CTRLMODE,
|
||||
IFLA_CAN_CTRLMODE_MAX = __IFLA_CAN_CTRLMODE - 1
|
||||
};
|
||||
|
||||
/* u16 termination range: 1..65535 Ohms */
|
||||
#define CAN_TERMINATION_DISABLED 0
|
||||
|
||||
|
|
Loading…
Reference in New Issue