From 82d1bf89a3992687e2a4985d93634404ba969b61 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 5 Jun 2013 12:58:39 -0700 Subject: [PATCH] 3.9-stable patches added patches: net-can-kvaser_usb-fix-reception-on-usbcan-pro-and-usbcan-r-type-hardware.patch tg3-add-read-dma-workaround-for-5720.patch --- ...sbcan-pro-and-usbcan-r-type-hardware.patch | 127 ++++++++++++++++++ queue-3.9/series | 2 + ...tg3-add-read-dma-workaround-for-5720.patch | 103 ++++++++++++++ 3 files changed, 232 insertions(+) create mode 100644 queue-3.9/net-can-kvaser_usb-fix-reception-on-usbcan-pro-and-usbcan-r-type-hardware.patch create mode 100644 queue-3.9/tg3-add-read-dma-workaround-for-5720.patch diff --git a/queue-3.9/net-can-kvaser_usb-fix-reception-on-usbcan-pro-and-usbcan-r-type-hardware.patch b/queue-3.9/net-can-kvaser_usb-fix-reception-on-usbcan-pro-and-usbcan-r-type-hardware.patch new file mode 100644 index 00000000000..79ea6db070f --- /dev/null +++ b/queue-3.9/net-can-kvaser_usb-fix-reception-on-usbcan-pro-and-usbcan-r-type-hardware.patch @@ -0,0 +1,127 @@ +From a90f13b24fb40d02d11496cce6a10ae8d4b319b2 Mon Sep 17 00:00:00 2001 +From: Jonas Peterson +Date: Tue, 7 May 2013 22:05:23 +0200 +Subject: net: can: kvaser_usb: fix reception on "USBcan Pro" and "USBcan R" type hardware. + +From: Jonas Peterson + +commit a90f13b24fb40d02d11496cce6a10ae8d4b319b2 upstream. + +Unlike Kvaser Leaf light devices, some other Kvaser devices (like USBcan +Pro, USBcan R) receive CAN messages in CMD_LOG_MESSAGE frames. This +patch adds support for it. + +Signed-off-by: Jonas Peterson +Signed-off-by: Olivier Sobrie +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/can/usb/kvaser_usb.c | 68 +++++++++++++++++++++++++-------------- + 1 file changed, 45 insertions(+), 23 deletions(-) + +--- a/drivers/net/can/usb/kvaser_usb.c ++++ b/drivers/net/can/usb/kvaser_usb.c +@@ -136,6 +136,9 @@ + #define KVASER_CTRL_MODE_SELFRECEPTION 3 + #define KVASER_CTRL_MODE_OFF 4 + ++/* log message */ ++#define KVASER_EXTENDED_FRAME BIT(31) ++ + struct kvaser_msg_simple { + u8 tid; + u8 channel; +@@ -817,8 +820,13 @@ static void kvaser_usb_rx_can_msg(const + priv = dev->nets[channel]; + stats = &priv->netdev->stats; + +- if (msg->u.rx_can.flag & (MSG_FLAG_ERROR_FRAME | MSG_FLAG_NERR | +- MSG_FLAG_OVERRUN)) { ++ if ((msg->u.rx_can.flag & MSG_FLAG_ERROR_FRAME) && ++ (msg->id == CMD_LOG_MESSAGE)) { ++ kvaser_usb_rx_error(dev, msg); ++ return; ++ } else if (msg->u.rx_can.flag & (MSG_FLAG_ERROR_FRAME | ++ MSG_FLAG_NERR | ++ MSG_FLAG_OVERRUN)) { + kvaser_usb_rx_can_err(priv, msg); + return; + } else if (msg->u.rx_can.flag & ~MSG_FLAG_REMOTE_FRAME) { +@@ -834,22 +842,40 @@ static void kvaser_usb_rx_can_msg(const + return; + } + +- cf->can_id = ((msg->u.rx_can.msg[0] & 0x1f) << 6) | +- (msg->u.rx_can.msg[1] & 0x3f); +- cf->can_dlc = get_can_dlc(msg->u.rx_can.msg[5]); +- +- if (msg->id == CMD_RX_EXT_MESSAGE) { +- cf->can_id <<= 18; +- cf->can_id |= ((msg->u.rx_can.msg[2] & 0x0f) << 14) | +- ((msg->u.rx_can.msg[3] & 0xff) << 6) | +- (msg->u.rx_can.msg[4] & 0x3f); +- cf->can_id |= CAN_EFF_FLAG; +- } +- +- if (msg->u.rx_can.flag & MSG_FLAG_REMOTE_FRAME) +- cf->can_id |= CAN_RTR_FLAG; +- else +- memcpy(cf->data, &msg->u.rx_can.msg[6], cf->can_dlc); ++ if (msg->id == CMD_LOG_MESSAGE) { ++ cf->can_id = le32_to_cpu(msg->u.log_message.id); ++ if (cf->can_id & KVASER_EXTENDED_FRAME) ++ cf->can_id &= CAN_EFF_MASK | CAN_EFF_FLAG; ++ else ++ cf->can_id &= CAN_SFF_MASK; ++ ++ cf->can_dlc = get_can_dlc(msg->u.log_message.dlc); ++ ++ if (msg->u.log_message.flags & MSG_FLAG_REMOTE_FRAME) ++ cf->can_id |= CAN_RTR_FLAG; ++ else ++ memcpy(cf->data, &msg->u.log_message.data, ++ cf->can_dlc); ++ } else { ++ cf->can_id = ((msg->u.rx_can.msg[0] & 0x1f) << 6) | ++ (msg->u.rx_can.msg[1] & 0x3f); ++ ++ if (msg->id == CMD_RX_EXT_MESSAGE) { ++ cf->can_id <<= 18; ++ cf->can_id |= ((msg->u.rx_can.msg[2] & 0x0f) << 14) | ++ ((msg->u.rx_can.msg[3] & 0xff) << 6) | ++ (msg->u.rx_can.msg[4] & 0x3f); ++ cf->can_id |= CAN_EFF_FLAG; ++ } ++ ++ cf->can_dlc = get_can_dlc(msg->u.rx_can.msg[5]); ++ ++ if (msg->u.rx_can.flag & MSG_FLAG_REMOTE_FRAME) ++ cf->can_id |= CAN_RTR_FLAG; ++ else ++ memcpy(cf->data, &msg->u.rx_can.msg[6], ++ cf->can_dlc); ++ } + + netif_rx(skb); + +@@ -911,6 +937,7 @@ static void kvaser_usb_handle_message(co + + case CMD_RX_STD_MESSAGE: + case CMD_RX_EXT_MESSAGE: ++ case CMD_LOG_MESSAGE: + kvaser_usb_rx_can_msg(dev, msg); + break; + +@@ -919,11 +946,6 @@ static void kvaser_usb_handle_message(co + kvaser_usb_rx_error(dev, msg); + break; + +- case CMD_LOG_MESSAGE: +- if (msg->u.log_message.flags & MSG_FLAG_ERROR_FRAME) +- kvaser_usb_rx_error(dev, msg); +- break; +- + case CMD_TX_ACKNOWLEDGE: + kvaser_usb_tx_acknowledge(dev, msg); + break; diff --git a/queue-3.9/series b/queue-3.9/series index e505157ffe3..e25d4ae1b57 100644 --- a/queue-3.9/series +++ b/queue-3.9/series @@ -109,3 +109,5 @@ iwlwifi-dvm-fix-zero-lq-cmd-sending-avoidance.patch iwlwifi-mvm-tell-firmware-to-let-multicast-frames-in.patch cfg80211-check-wdev-netdev-in-connection-work.patch ath9k-use-correct-otp-register-offsets-for-ar9550.patch +tg3-add-read-dma-workaround-for-5720.patch +net-can-kvaser_usb-fix-reception-on-usbcan-pro-and-usbcan-r-type-hardware.patch diff --git a/queue-3.9/tg3-add-read-dma-workaround-for-5720.patch b/queue-3.9/tg3-add-read-dma-workaround-for-5720.patch new file mode 100644 index 00000000000..372ff9b87a3 --- /dev/null +++ b/queue-3.9/tg3-add-read-dma-workaround-for-5720.patch @@ -0,0 +1,103 @@ +From 9bc297ea0622bb2a6b3abfa2fa84f0a3b86ef8c8 Mon Sep 17 00:00:00 2001 +From: Nithin Sujir +Date: Mon, 3 Jun 2013 09:19:34 +0000 +Subject: tg3: Add read dma workaround for 5720 + +From: Nithin Sujir + +commit 9bc297ea0622bb2a6b3abfa2fa84f0a3b86ef8c8 upstream. + +Commit 091f0ea30074bc43f9250961b3247af713024bc6 "tg3: Add New 5719 Read +DMA workaround" added a workaround for TX DMA stall on the 5719. This +workaround needs to be applied to the 5720 as well. + +Reported-by: Roland Dreier +Tested-by: Roland Dreier +Signed-off-by: Nithin Nayak Sujir +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/ethernet/broadcom/tg3.c | 21 +++++++++++++++------ + drivers/net/ethernet/broadcom/tg3.h | 5 +++-- + 2 files changed, 18 insertions(+), 8 deletions(-) + +--- a/drivers/net/ethernet/broadcom/tg3.c ++++ b/drivers/net/ethernet/broadcom/tg3.c +@@ -9093,6 +9093,14 @@ static void tg3_rss_write_indir_tbl(stru + } + } + ++static inline u32 tg3_lso_rd_dma_workaround_bit(struct tg3 *tp) ++{ ++ if (tg3_asic_rev(tp) == ASIC_REV_5719) ++ return TG3_LSO_RD_DMA_TX_LENGTH_WA_5719; ++ else ++ return TG3_LSO_RD_DMA_TX_LENGTH_WA_5720; ++} ++ + /* tp->lock is held. */ + static int tg3_reset_hw(struct tg3 *tp, int reset_phy) + { +@@ -9772,16 +9780,17 @@ static int tg3_reset_hw(struct tg3 *tp, + tw32_f(RDMAC_MODE, rdmac_mode); + udelay(40); + +- if (tg3_asic_rev(tp) == ASIC_REV_5719) { ++ if (tg3_asic_rev(tp) == ASIC_REV_5719 || ++ tg3_asic_rev(tp) == ASIC_REV_5720) { + for (i = 0; i < TG3_NUM_RDMA_CHANNELS; i++) { + if (tr32(TG3_RDMA_LENGTH + (i << 2)) > TG3_MAX_MTU(tp)) + break; + } + if (i < TG3_NUM_RDMA_CHANNELS) { + val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); +- val |= TG3_LSO_RD_DMA_TX_LENGTH_WA; ++ val |= tg3_lso_rd_dma_workaround_bit(tp); + tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); +- tg3_flag_set(tp, 5719_RDMA_BUG); ++ tg3_flag_set(tp, 5719_5720_RDMA_BUG); + } + } + +@@ -10138,15 +10147,15 @@ static void tg3_periodic_fetch_stats(str + TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST); + TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST); + TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST); +- if (unlikely(tg3_flag(tp, 5719_RDMA_BUG) && ++ if (unlikely(tg3_flag(tp, 5719_5720_RDMA_BUG) && + (sp->tx_ucast_packets.low + sp->tx_mcast_packets.low + + sp->tx_bcast_packets.low) > TG3_NUM_RDMA_CHANNELS)) { + u32 val; + + val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); +- val &= ~TG3_LSO_RD_DMA_TX_LENGTH_WA; ++ val &= ~tg3_lso_rd_dma_workaround_bit(tp); + tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); +- tg3_flag_clear(tp, 5719_RDMA_BUG); ++ tg3_flag_clear(tp, 5719_5720_RDMA_BUG); + } + + TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS); +--- a/drivers/net/ethernet/broadcom/tg3.h ++++ b/drivers/net/ethernet/broadcom/tg3.h +@@ -1422,7 +1422,8 @@ + #define TG3_LSO_RD_DMA_CRPTEN_CTRL 0x00004910 + #define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_BD_4K 0x00030000 + #define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_LSO_4K 0x000c0000 +-#define TG3_LSO_RD_DMA_TX_LENGTH_WA 0x02000000 ++#define TG3_LSO_RD_DMA_TX_LENGTH_WA_5719 0x02000000 ++#define TG3_LSO_RD_DMA_TX_LENGTH_WA_5720 0x00200000 + /* 0x4914 --> 0x4be0 unused */ + + #define TG3_NUM_RDMA_CHANNELS 4 +@@ -3043,7 +3044,7 @@ enum TG3_FLAGS { + TG3_FLAG_APE_HAS_NCSI, + TG3_FLAG_TX_TSTAMP_EN, + TG3_FLAG_4K_FIFO_LIMIT, +- TG3_FLAG_5719_RDMA_BUG, ++ TG3_FLAG_5719_5720_RDMA_BUG, + TG3_FLAG_RESET_TASK_PENDING, + TG3_FLAG_PTP_CAPABLE, + TG3_FLAG_5705_PLUS, -- 2.47.3