--- /dev/null
+From a90f13b24fb40d02d11496cce6a10ae8d4b319b2 Mon Sep 17 00:00:00 2001
+From: Jonas Peterson <jonas.peterson@gmail.com>
+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 <jonas.peterson@gmail.com>
+
+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 <jonas.peterson@gmail.com>
+Signed-off-by: Olivier Sobrie <olivier@sobrie.be>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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;
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
--- /dev/null
+From 9bc297ea0622bb2a6b3abfa2fa84f0a3b86ef8c8 Mon Sep 17 00:00:00 2001
+From: Nithin Sujir <nsujir@broadcom.com>
+Date: Mon, 3 Jun 2013 09:19:34 +0000
+Subject: tg3: Add read dma workaround for 5720
+
+From: Nithin Sujir <nsujir@broadcom.com>
+
+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 <roland@purestorage.com>
+Tested-by: Roland Dreier <roland@purestorage.com>
+Signed-off-by: Nithin Nayak Sujir <nsujir@broadcom.com>
+Signed-off-by: Michael Chan <mchan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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,