static void c_can_do_tx(struct net_device *dev) { struct c_can_priv *priv = netdev_priv(dev); struct net_device_stats *stats = &dev->stats; u32 idx, obj, pkts = 0, bytes = 0, pend, clr; clr = pend = priv->read_reg(priv, C_CAN_INTPND2_REG); while ((idx = ffs(pend))) { idx--; pend &= ~(1 << idx); obj = idx + C_CAN_MSG_OBJ_TX_FIRST; c_can_inval_tx_object(dev, IF_RX, obj); can_get_echo_skb(dev, idx); bytes += priv->dlc[idx]; pkts++; } /* Clear the bits in the tx_active mask */ atomic_sub(clr, &priv->tx_active); if (clr & (1 << (C_CAN_MSG_OBJ_TX_NUM - 1))) netif_wake_queue(dev); if (pkts) { stats->tx_bytes += bytes; stats->tx_packets += pkts; can_led_event(dev, CAN_LED_EVENT_TX); } }
static void c_can_inval_msg_object(struct net_device *dev, int iface, int obj) { struct c_can_priv *priv = netdev_priv(dev); priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), 0); priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), 0); c_can_inval_tx_object(dev, iface, obj); }