This patch introduces some helper functions to make the code more readable, especially the function mscan_rx_poll(). Unfortunately, there are still various coding style issue which should be fixed for kernel inclusion
Signed-off-by: Wolfgang Grandegger <[email protected]> --- kernel/2.6/drivers/net/can/mscan/mscan.c | 176 ++++++++++++++++--------------- 1 file changed, 95 insertions(+), 81 deletions(-) Index: trunk/kernel/2.6/drivers/net/can/mscan/mscan.c =================================================================== --- trunk.orig/kernel/2.6/drivers/net/can/mscan/mscan.c +++ trunk/kernel/2.6/drivers/net/can/mscan/mscan.c @@ -343,6 +343,94 @@ static inline int check_set_state(struct return ret; } +static inline void mscan_get_rx_frame(struct net_device *dev, + struct can_frame *frame) +{ + struct mscan_regs *regs = (struct mscan_regs *)dev->base_addr; + u32 can_id; + int i; + + can_id = in_be16(®s->rx.idr1_0); + if (can_id & (1 << 3)) { + frame->can_id = CAN_EFF_FLAG; + can_id = ((can_id << 16) | in_be16(®s->rx.idr3_2)); + can_id = ((can_id & 0xffe00000) | + ((can_id & 0x7ffff) << 2)) >> 2; + } else { + can_id >>= 4; + frame->can_id = 0; + } + + frame->can_id |= can_id >> 1; + if (can_id & 1) + frame->can_id |= CAN_RTR_FLAG; + frame->can_dlc = in_8(®s->rx.dlr) & 0xf; + + if (!(frame->can_id & CAN_RTR_FLAG)) { + void __iomem *data = ®s->rx.dsr1_0; + u16 *payload = (u16 *) frame->data; + for (i = 0; i < (frame->can_dlc + 1) / 2; i++) { + *payload++ = in_be16(data); + data += 2 + _MSCAN_RESERVED_DSR_SIZE; + } + } + + out_8(®s->canrflg, MSCAN_RXF); +} + +static inline void mscan_get_err_frame(struct net_device *dev, + struct can_frame *frame, u8 canrflg) +{ + struct mscan_regs *regs = (struct mscan_regs *)dev->base_addr; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) + struct net_device_stats *stats = can_get_stats(dev); +#else + struct net_device_stats *stats = &dev->stats; +#endif + struct mscan_priv *priv = netdev_priv(dev); + + dev_dbg(ND2D(dev), "error interrupt (canrflg=%#x)\n", canrflg); + frame->can_id = CAN_ERR_FLAG; + + if (canrflg & MSCAN_OVRIF) { + frame->can_id |= CAN_ERR_CRTL; + frame->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; + stats->rx_over_errors++; + stats->rx_errors++; + } else { + frame->data[1] = 0; + } + + if (check_set_state(dev, canrflg)) { + switch (priv->can.state) { + case CAN_STATE_ERROR_WARNING: + frame->can_id |= CAN_ERR_CRTL; + priv->can.can_stats.error_warning++; + if ((priv->shadow_statflg & MSCAN_RSTAT_MSK) < + (canrflg & MSCAN_RSTAT_MSK)) + frame->data[1] |= CAN_ERR_CRTL_RX_WARNING; + if ((priv->shadow_statflg & MSCAN_TSTAT_MSK) < + (canrflg & MSCAN_TSTAT_MSK)) + frame->data[1] |= CAN_ERR_CRTL_TX_WARNING; + break; + case CAN_STATE_ERROR_PASSIVE: + frame->can_id |= CAN_ERR_CRTL; + priv->can.can_stats.error_passive++; + frame->data[1] |= CAN_ERR_CRTL_RX_PASSIVE; + break; + case CAN_STATE_BUS_OFF: + frame->can_id |= CAN_ERR_BUSOFF; + can_bus_off(dev); + break; + default: + break; + } + } + priv->shadow_statflg = canrflg & MSCAN_STAT_MSK; + frame->can_dlc = CAN_ERR_DLC; + out_8(®s->canrflg, MSCAN_ERR_IF); +} + #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,23) static int mscan_rx_poll(struct napi_struct *napi, int quota) #else @@ -369,9 +457,7 @@ static int mscan_rx_poll(struct net_devi int ret = 1; struct sk_buff *skb; struct can_frame *frame; - u32 can_id; u8 canrflg; - int i; while (npackets < quota && ((canrflg = in_8(®s->canrflg)) & (MSCAN_RXF | MSCAN_ERR_IF))) { @@ -385,88 +471,16 @@ static int mscan_rx_poll(struct net_devi continue; } - if (canrflg & MSCAN_RXF) { - can_id = in_be16(®s->rx.idr1_0); - if (can_id & (1 << 3)) { - frame->can_id = CAN_EFF_FLAG; - can_id = ((can_id << 16) | - in_be16(®s->rx.idr3_2)); - can_id = ((can_id & 0xffe00000) | - ((can_id & 0x7ffff) << 2)) >> 2; - } else { - can_id >>= 4; - frame->can_id = 0; - } - - frame->can_id |= can_id >> 1; - if (can_id & 1) - frame->can_id |= CAN_RTR_FLAG; - frame->can_dlc = in_8(®s->rx.dlr) & 0xf; - - if (!(frame->can_id & CAN_RTR_FLAG)) { - void __iomem *data = ®s->rx.dsr1_0; - u16 *payload = (u16 *) frame->data; - for (i = 0; i < (frame->can_dlc + 1) / 2; i++) { - *payload++ = in_be16(data); - data += 2 + _MSCAN_RESERVED_DSR_SIZE; - } - } + if (canrflg & MSCAN_RXF) + mscan_get_rx_frame(dev, frame); + else if (canrflg & MSCAN_ERR_IF) + mscan_get_err_frame(dev, frame, canrflg); - out_8(®s->canrflg, MSCAN_RXF); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32) - dev->last_rx = jiffies; + dev->last_rx = jiffies; #endif - stats->rx_packets++; - stats->rx_bytes += frame->can_dlc; - } else if (canrflg & MSCAN_ERR_IF) { - dev_dbg(ND2D(dev), "error interrupt (canrflg=%#x)\n", - canrflg); - frame->can_id = CAN_ERR_FLAG; - - if (canrflg & MSCAN_OVRIF) { - frame->can_id |= CAN_ERR_CRTL; - frame->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; - stats->rx_over_errors++; - stats->rx_errors++; - } else - frame->data[1] = 0; - - if (check_set_state(dev, canrflg)) { - switch (priv->can.state) { - case CAN_STATE_ERROR_WARNING: - frame->can_id |= CAN_ERR_CRTL; - priv->can.can_stats.error_warning++; - if ((priv->shadow_statflg & - MSCAN_RSTAT_MSK) < - (canrflg & MSCAN_RSTAT_MSK)) - frame->data[1] |= - CAN_ERR_CRTL_RX_WARNING; - - if ((priv->shadow_statflg & - MSCAN_TSTAT_MSK) < - (canrflg & MSCAN_TSTAT_MSK)) - frame->data[1] |= - CAN_ERR_CRTL_TX_WARNING; - break; - case CAN_STATE_ERROR_PASSIVE: - frame->can_id |= CAN_ERR_CRTL; - priv->can.can_stats.error_passive++; - frame->data[1] |= - CAN_ERR_CRTL_RX_PASSIVE; - break; - case CAN_STATE_BUS_OFF: - frame->can_id |= CAN_ERR_BUSOFF; - can_bus_off(dev); - break; - default: - break; - } - } - priv->shadow_statflg = canrflg & MSCAN_STAT_MSK; - frame->can_dlc = CAN_ERR_DLC; - out_8(®s->canrflg, MSCAN_ERR_IF); - } - + stats->rx_packets++; + stats->rx_bytes += frame->can_dlc; npackets++; netif_receive_skb(skb); } _______________________________________________ Socketcan-core mailing list [email protected] https://lists.berlios.de/mailman/listinfo/socketcan-core
