summaryrefslogtreecommitdiff
path: root/drivers/net/can/apalis-tk1-k20-can.c
diff options
context:
space:
mode:
authorDominik Sliwa <dominik.sliwa@toradex.com>2018-01-31 17:43:22 +0100
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2018-03-28 18:11:50 +0200
commite57a938d023cdf933731a77a350cfacadc37d3c4 (patch)
treea6c6ce33fd8c131af6207a7c928de9502b0087ea /drivers/net/can/apalis-tk1-k20-can.c
parent877a32308600b065f376f8cf41e1bf9093aff64f (diff)
can: mfd: apalis-tk1-k20:increased clock speed, zero copy
Increased SPI speed for transfers and peripheral speed. Switch to cleaning IRQ flags on read, instead of separate write. Switched to zero-copy on SPI reads. Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com> Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
Diffstat (limited to 'drivers/net/can/apalis-tk1-k20-can.c')
-rw-r--r--drivers/net/can/apalis-tk1-k20-can.c31
1 files changed, 2 insertions, 29 deletions
diff --git a/drivers/net/can/apalis-tk1-k20-can.c b/drivers/net/can/apalis-tk1-k20-can.c
index 22437c48296f..5d0f5d764ceb 100644
--- a/drivers/net/can/apalis-tk1-k20-can.c
+++ b/drivers/net/can/apalis-tk1-k20-can.c
@@ -155,30 +155,11 @@ static void apalis_tk1_k20_can_hw_rx_frame(struct net_device *net, u8 *buf,
apalis_tk1_k20_unlock(priv->apalis_tk1_k20);
}
-static u32 apalis_tk1_k20_can_available_rx_frames(struct net_device *net)
-{
- u32 frame_cnt = 0;
- struct apalis_tk1_k20_priv *priv = netdev_priv(net);
- int ret;
-
- apalis_tk1_k20_lock(priv->apalis_tk1_k20);
-
- ret = apalis_tk1_k20_reg_read(priv->apalis_tk1_k20,
- APALIS_TK1_K20_CAN_IN_BUF_CNT
- + APALIS_TK1_K20_CAN_DEV_OFFSET(
- priv->pdata->id), &frame_cnt);
- apalis_tk1_k20_unlock(priv->apalis_tk1_k20);
-
- return (ret == 0) ? frame_cnt : 0;
-}
-
static void apalis_tk1_k20_can_hw_rx(struct net_device *net, int buf_idx)
{
struct apalis_tk1_k20_priv *priv = netdev_priv(net);
struct sk_buff *skb;
struct can_frame *frame;
- u8 available_frames = 0;
- u8 buf[CAN_TRANSFER_BUF_LEN];
skb = alloc_can_skb(priv->net, &frame);
if (!skb) {
@@ -187,14 +168,7 @@ static void apalis_tk1_k20_can_hw_rx(struct net_device *net, int buf_idx)
return;
}
- available_frames = apalis_tk1_k20_can_available_rx_frames(net);
-
- while ((available_frames > 0)) {
- apalis_tk1_k20_can_hw_rx_frame(net, buf, buf_idx);
- memcpy(&frame->can_id, buf + MB_EID_OFF, MB_EID_LEN);
- /* Data length */
- frame->can_dlc = get_can_dlc(buf[MB_DLC_OFF]);
- memcpy(frame->data, buf + CAN_HEADER_MAX_LEN, frame->can_dlc);
+ apalis_tk1_k20_can_hw_rx_frame(net, (unsigned char *)frame, buf_idx);
priv->net->stats.rx_packets++;
priv->net->stats.rx_bytes += frame->can_dlc;
@@ -202,8 +176,7 @@ static void apalis_tk1_k20_can_hw_rx(struct net_device *net, int buf_idx)
can_led_event(priv->net, CAN_LED_EVENT_RX);
netif_rx_ni(skb);
- available_frames--;
- }
+
}
static netdev_tx_t apalis_tk1_k20_can_hard_start_xmit(struct sk_buff *skb,