]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Jun 2013 19:58:39 +0000 (12:58 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Jun 2013 19:58:39 +0000 (12:58 -0700)
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

queue-3.9/net-can-kvaser_usb-fix-reception-on-usbcan-pro-and-usbcan-r-type-hardware.patch [new file with mode: 0644]
queue-3.9/series
queue-3.9/tg3-add-read-dma-workaround-for-5720.patch [new file with mode: 0644]

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 (file)
index 0000000..79ea6db
--- /dev/null
@@ -0,0 +1,127 @@
+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;
index e505157ffe3bfee9db0bd1cc75fa1988c4510566..e25d4ae1b57b6ebbe1160a0fa55d164aef892c08 100644 (file)
@@ -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 (file)
index 0000000..372ff9b
--- /dev/null
@@ -0,0 +1,103 @@
+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,