]> git.openfabrics.org - ~emulex/compat-rdma_3.12.git/commitdiff
linux-next-cherry-picks: Bring upstream fixes on cxgb4
authorKumar Sanghvi <kumaras@chelsio.com>
Wed, 19 Feb 2014 07:11:12 +0000 (12:41 +0530)
committerKumar Sanghvi <kumaras@chelsio.com>
Wed, 19 Feb 2014 13:18:13 +0000 (05:18 -0800)
Bring below upstream fixes on cxgb4:
f0a8e6d cxgb4: Add more PCI device ids.
0034b29 cxgb4: Don't assume LSO only uses SGL path in t4_eth_xmit()
c1f49e3 cxgb4: Remove unused registers and add missing ones
1ac0f09 cxgb4: Query firmware for T5 ULPTX MEMWRITE DSGL capabilities
4fe44dd cxgb4: LE-Workaround is not atomic in firmware
57d8b76 cxgb4: Allow >10G ports to have multiple queues
a94cd70 cxgb4: Print adapter VPD Part Number instead of Engineering Change field
72aca4b cxgb4: Add support to recognize 40G links

This adds support for Chelsio 40G adapters.
And also, brings in misc. fixes on cxgb4 for T4 and T5 adapters.

Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
linux-next-cherry-picks/0044-cxgb4-Add-support-to-recognize-40G-links.patch [new file with mode: 0644]
linux-next-cherry-picks/0045-cxgb4-Print-adapter-VPD-Part-Number-instead-of-Engin.patch [new file with mode: 0644]
linux-next-cherry-picks/0046-cxgb4-Allow-10G-ports-to-have-multiple-queues.patch [new file with mode: 0644]
linux-next-cherry-picks/0047-cxgb4-LE-Workaround-is-not-atomic-in-firmware.patch [new file with mode: 0644]
linux-next-cherry-picks/0048-cxgb4-Query-firmware-for-T5-ULPTX-MEMWRITE-DSGL-capa.patch [new file with mode: 0644]
linux-next-cherry-picks/0049-cxgb4-Remove-unused-registers-and-add-missing-ones.patch [new file with mode: 0644]
linux-next-cherry-picks/0050-cxgb4-Don-t-assume-LSO-only-uses-SGL-path-in-t4_eth_.patch [new file with mode: 0644]
linux-next-cherry-picks/0051-cxgb4-Add-more-PCI-device-ids.patch [new file with mode: 0644]

diff --git a/linux-next-cherry-picks/0044-cxgb4-Add-support-to-recognize-40G-links.patch b/linux-next-cherry-picks/0044-cxgb4-Add-support-to-recognize-40G-links.patch
new file mode 100644 (file)
index 0000000..adb17ab
--- /dev/null
@@ -0,0 +1,190 @@
+From 72aca4bfce3a39be98e40ce0b18776b9f91022f4 Mon Sep 17 00:00:00 2001
+From: Kumar Sanghvi <kumaras@chelsio.com>
+Date: Tue, 18 Feb 2014 17:56:08 +0530
+Subject: [PATCH] cxgb4: Add support to recognize 40G links
+
+Also, create a new Common Code interface to translate Firmware Port Technology
+Type values (enum fw_port_type) to string descriptions.  This will allow us
+to maintain the description translation table in one place rather than in
+every driver.
+
+Based on original work by Scott Bardone and Casey Leedom <leedom@chelsio.com>
+
+Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/chelsio/cxgb4/cxgb4.h      |    2 +-
+ drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |   24 ++++++++++-----
+ drivers/net/ethernet/chelsio/cxgb4/t4_hw.c      |   35 ++++++++++++++++++++++-
+ drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h   |    3 ++
+ 4 files changed, 54 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+index 1f4b9b3..0c4edd1 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+@@ -957,7 +957,7 @@ int t4_mc_read(struct adapter *adap, int idx, u32 addr, __be32 *data,
+              u64 *parity);
+ int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data,
+               u64 *parity);
+-
++const char *t4_get_port_type_description(enum fw_port_type port_type);
+ void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p);
+ void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log);
+ void t4_tp_wr_bits_indirect(struct adapter *adap, unsigned int addr,
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+index bd0321d..1da4adb 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+@@ -432,6 +432,9 @@ static void link_report(struct net_device *dev)
+               case SPEED_100:
+                       s = "100Mbps";
+                       break;
++              case 40000: /* Need a SPEED_40000 in ethtool.h */
++                      s = "40Gbps";
++                      break;
+               }
+               netdev_info(dev, "link up, %s, full-duplex, %s PAUSE\n", s,
+@@ -2199,6 +2202,8 @@ static unsigned int from_fw_linkcaps(unsigned int type, unsigned int caps)
+       else if (type == FW_PORT_TYPE_FIBER_XFI ||
+                type == FW_PORT_TYPE_FIBER_XAUI || type == FW_PORT_TYPE_SFP)
+               v |= SUPPORTED_FIBRE;
++      else if (type == FW_PORT_TYPE_BP40_BA)
++              v |= SUPPORTED_40000baseSR4_Full;
+       if (caps & FW_PORT_CAP_ANEG)
+               v |= SUPPORTED_Autoneg;
+@@ -2215,6 +2220,8 @@ static unsigned int to_fw_linkcaps(unsigned int caps)
+               v |= FW_PORT_CAP_SPEED_1G;
+       if (caps & ADVERTISED_10000baseT_Full)
+               v |= FW_PORT_CAP_SPEED_10G;
++      if (caps & ADVERTISED_40000baseSR4_Full)
++              v |= FW_PORT_CAP_SPEED_40G;
+       return v;
+ }
+@@ -2269,6 +2276,8 @@ static unsigned int speed_to_caps(int speed)
+               return FW_PORT_CAP_SPEED_1G;
+       if (speed == SPEED_10000)
+               return FW_PORT_CAP_SPEED_10G;
++      if (speed == 40000) /* Need SPEED_40000 in ethtool.h */
++              return FW_PORT_CAP_SPEED_40G;
+       return 0;
+ }
+@@ -2296,8 +2305,10 @@ static int set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+       if (cmd->autoneg == AUTONEG_DISABLE) {
+               cap = speed_to_caps(speed);
+-              if (!(lc->supported & cap) || (speed == SPEED_1000) ||
+-                  (speed == SPEED_10000))
++              if (!(lc->supported & cap) ||
++                  (speed == SPEED_1000) ||
++                  (speed == SPEED_10000) ||
++                  (speed == 40000))
+                       return -EINVAL;
+               lc->requested_speed = cap;
+               lc->advertising = 0;
+@@ -5799,11 +5810,6 @@ static int init_rss(struct adapter *adap)
+ static void print_port_info(const struct net_device *dev)
+ {
+-      static const char *base[] = {
+-              "R XFI", "R XAUI", "T SGMII", "T XFI", "T XAUI", "KX4", "CX4",
+-              "KX", "KR", "R SFP+", "KR/KX", "KR/KX/KX4"
+-      };
+-
+       char buf[80];
+       char *bufp = buf;
+       const char *spd = "";
+@@ -5821,9 +5827,11 @@ static void print_port_info(const struct net_device *dev)
+               bufp += sprintf(bufp, "1000/");
+       if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_10G)
+               bufp += sprintf(bufp, "10G/");
++      if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_40G)
++              bufp += sprintf(bufp, "40G/");
+       if (bufp != buf)
+               --bufp;
+-      sprintf(bufp, "BASE-%s", base[pi->port_type]);
++      sprintf(bufp, "BASE-%s", t4_get_port_type_description(pi->port_type));
+       netdev_info(dev, "Chelsio %s rev %d %s %sNIC PCIe x%d%s%s\n",
+                   adap->params.vpd.id,
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
+index 2c10934..514c525 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
+@@ -1155,7 +1155,8 @@ out:
+ }
+ #define ADVERT_MASK (FW_PORT_CAP_SPEED_100M | FW_PORT_CAP_SPEED_1G |\
+-                   FW_PORT_CAP_SPEED_10G | FW_PORT_CAP_ANEG)
++                   FW_PORT_CAP_SPEED_10G | FW_PORT_CAP_SPEED_40G | \
++                   FW_PORT_CAP_ANEG)
+ /**
+  *    t4_link_start - apply link configuration to MAC/PHY
+@@ -2247,6 +2248,36 @@ static unsigned int get_mps_bg_map(struct adapter *adap, int idx)
+ }
+ /**
++ *      t4_get_port_type_description - return Port Type string description
++ *      @port_type: firmware Port Type enumeration
++ */
++const char *t4_get_port_type_description(enum fw_port_type port_type)
++{
++      static const char *const port_type_description[] = {
++              "R XFI",
++              "R XAUI",
++              "T SGMII",
++              "T XFI",
++              "T XAUI",
++              "KX4",
++              "CX4",
++              "KX",
++              "KR",
++              "R SFP+",
++              "KR/KX",
++              "KR/KX/KX4",
++              "R QSFP_10G",
++              "",
++              "R QSFP",
++              "R BP40_BA",
++      };
++
++      if (port_type < ARRAY_SIZE(port_type_description))
++              return port_type_description[port_type];
++      return "UNKNOWN";
++}
++
++/**
+  *    t4_get_port_stats - collect port statistics
+  *    @adap: the adapter
+  *    @idx: the port index
+@@ -3538,6 +3569,8 @@ int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl)
+                       speed = SPEED_1000;
+               else if (stat & FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_10G))
+                       speed = SPEED_10000;
++              else if (stat & FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_40G))
++                      speed = 40000; /* Need SPEED_40000 in ethtool.h */
+               if (link_ok != lc->link_ok || speed != lc->speed ||
+                   fc != lc->fc) {                    /* something changed */
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
+index 74fea74..af6e124 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
++++ b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
+@@ -1742,6 +1742,9 @@ enum fw_port_type {
+       FW_PORT_TYPE_SFP,
+       FW_PORT_TYPE_BP_AP,
+       FW_PORT_TYPE_BP4_AP,
++      FW_PORT_TYPE_QSFP_10G,
++      FW_PORT_TYPE_QSFP,
++      FW_PORT_TYPE_BP40_BA,
+       FW_PORT_TYPE_NONE = FW_PORT_CMD_PTYPE_MASK
+ };
+-- 
+1.7.1
+
diff --git a/linux-next-cherry-picks/0045-cxgb4-Print-adapter-VPD-Part-Number-instead-of-Engin.patch b/linux-next-cherry-picks/0045-cxgb4-Print-adapter-VPD-Part-Number-instead-of-Engin.patch
new file mode 100644 (file)
index 0000000..9602d5a
--- /dev/null
@@ -0,0 +1,84 @@
+From a94cd70521151d107bb069f0c15d1bb7acf302b5 Mon Sep 17 00:00:00 2001
+From: Kumar Sanghvi <kumaras@chelsio.com>
+Date: Tue, 18 Feb 2014 17:56:09 +0530
+Subject: [PATCH] cxgb4: Print adapter VPD Part Number instead of Engineering Change field
+
+When we attach to adapter, print VPD Part Number instead of Engineering Change field.
+Based on original work by Casey Leedom <leedom@chelsio.com>
+
+Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/chelsio/cxgb4/cxgb4.h      |    2 ++
+ drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |    4 ++--
+ drivers/net/ethernet/chelsio/cxgb4/t4_hw.c      |    5 ++++-
+ 3 files changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+index 0c4edd1..028b5e5 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+@@ -66,6 +66,7 @@ enum {
+       SERNUM_LEN = 24,    /* Serial # length */
+       EC_LEN     = 16,    /* E/C length */
+       ID_LEN     = 16,    /* ID length */
++      PN_LEN     = 16,    /* Part Number length */
+ };
+ enum {
+@@ -254,6 +255,7 @@ struct vpd_params {
+       u8 ec[EC_LEN + 1];
+       u8 sn[SERNUM_LEN + 1];
+       u8 id[ID_LEN + 1];
++      u8 pn[PN_LEN + 1];
+ };
+ struct pci_params {
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+index 1da4adb..809685d 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+@@ -5839,8 +5839,8 @@ static void print_port_info(const struct net_device *dev)
+                   is_offload(adap) ? "R" : "", adap->params.pci.width, spd,
+                   (adap->flags & USING_MSIX) ? " MSI-X" :
+                   (adap->flags & USING_MSI) ? " MSI" : "");
+-      netdev_info(dev, "S/N: %s, E/C: %s\n",
+-                  adap->params.vpd.sn, adap->params.vpd.ec);
++      netdev_info(dev, "S/N: %s, P/N: %s\n",
++                  adap->params.vpd.sn, adap->params.vpd.pn);
+ }
+ static void enable_pcie_relaxed_ordering(struct pci_dev *dev)
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
+index 514c525..7ae756d 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
+@@ -573,7 +573,7 @@ int get_vpd_params(struct adapter *adapter, struct vpd_params *p)
+ {
+       u32 cclk_param, cclk_val;
+       int i, ret, addr;
+-      int ec, sn;
++      int ec, sn, pn;
+       u8 *vpd, csum;
+       unsigned int vpdr_len, kw_offset, id_len;
+@@ -638,6 +638,7 @@ int get_vpd_params(struct adapter *adapter, struct vpd_params *p)
+       FIND_VPD_KW(ec, "EC");
+       FIND_VPD_KW(sn, "SN");
++      FIND_VPD_KW(pn, "PN");
+ #undef FIND_VPD_KW
+       memcpy(p->id, vpd + PCI_VPD_LRDT_TAG_SIZE, id_len);
+@@ -647,6 +648,8 @@ int get_vpd_params(struct adapter *adapter, struct vpd_params *p)
+       i = pci_vpd_info_field_size(vpd + sn - PCI_VPD_INFO_FLD_HDR_SIZE);
+       memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN));
+       strim(p->sn);
++      memcpy(p->pn, vpd + pn, min(i, PN_LEN));
++      strim(p->pn);
+       /*
+        * Ask firmware for the Core Clock since it knows how to translate the
+-- 
+1.7.1
+
diff --git a/linux-next-cherry-picks/0046-cxgb4-Allow-10G-ports-to-have-multiple-queues.patch b/linux-next-cherry-picks/0046-cxgb4-Allow-10G-ports-to-have-multiple-queues.patch
new file mode 100644 (file)
index 0000000..603d36b
--- /dev/null
@@ -0,0 +1,51 @@
+From 57d8b7649d119e8ad6a976a196a21cb4e5e2714c Mon Sep 17 00:00:00 2001
+From: Kumar Sanghvi <kumaras@chelsio.com>
+Date: Tue, 18 Feb 2014 17:56:10 +0530
+Subject: [PATCH] cxgb4: Allow >10G ports to have multiple queues
+
+Based on original work by Divy Le Ray.
+
+Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |    9 +++++----
+ 1 files changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+index 809685d..9222a8a 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+@@ -5614,9 +5614,10 @@ static const struct pci_error_handlers cxgb4_eeh = {
+       .resume         = eeh_resume,
+ };
+-static inline bool is_10g_port(const struct link_config *lc)
++static inline bool is_x_10g_port(const struct link_config *lc)
+ {
+-      return (lc->supported & FW_PORT_CAP_SPEED_10G) != 0;
++      return (lc->supported & FW_PORT_CAP_SPEED_10G) != 0 ||
++             (lc->supported & FW_PORT_CAP_SPEED_40G) != 0;
+ }
+ static inline void init_rspq(struct sge_rspq *q, u8 timer_idx, u8 pkt_cnt_idx,
+@@ -5640,7 +5641,7 @@ static void cfg_queues(struct adapter *adap)
+       int i, q10g = 0, n10g = 0, qidx = 0;
+       for_each_port(adap, i)
+-              n10g += is_10g_port(&adap2pinfo(adap, i)->link_cfg);
++              n10g += is_x_10g_port(&adap2pinfo(adap, i)->link_cfg);
+       /*
+        * We default to 1 queue per non-10G port and up to # of cores queues
+@@ -5655,7 +5656,7 @@ static void cfg_queues(struct adapter *adap)
+               struct port_info *pi = adap2pinfo(adap, i);
+               pi->first_qset = qidx;
+-              pi->nqsets = is_10g_port(&pi->link_cfg) ? q10g : 1;
++              pi->nqsets = is_x_10g_port(&pi->link_cfg) ? q10g : 1;
+               qidx += pi->nqsets;
+       }
+-- 
+1.7.1
+
diff --git a/linux-next-cherry-picks/0047-cxgb4-LE-Workaround-is-not-atomic-in-firmware.patch b/linux-next-cherry-picks/0047-cxgb4-LE-Workaround-is-not-atomic-in-firmware.patch
new file mode 100644 (file)
index 0000000..24b4b5d
--- /dev/null
@@ -0,0 +1,37 @@
+From 4fe44dd77602fef804561c46ad10b988ee2859ac Mon Sep 17 00:00:00 2001
+From: Kumar Sanghvi <kumaras@chelsio.com>
+Date: Tue, 18 Feb 2014 17:56:11 +0530
+Subject: [PATCH] cxgb4: LE-Workaround is not atomic in firmware
+
+The LE workaround in firmware is not atomic and fw_ofld_connection_wrs must not interleave.
+Therefore, when the workaround is enabled, we need to send all ctrlq WRs on a single ctrl queue.
+
+Based on original work by Santosh Rastapur <santosh@chelsio.com>
+
+Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/chelsio/cxgb4/sge.c |    6 +++++-
+ 1 files changed, 5 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
+index 47ffa64..23dbe28 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
+@@ -1467,8 +1467,12 @@ static inline int ofld_send(struct adapter *adap, struct sk_buff *skb)
+ {
+       unsigned int idx = skb_txq(skb);
+-      if (unlikely(is_ctrl_pkt(skb)))
++      if (unlikely(is_ctrl_pkt(skb))) {
++              /* Single ctrl queue is a requirement for LE workaround path */
++              if (adap->tids.nsftids)
++                      idx = 0;
+               return ctrl_xmit(&adap->sge.ctrlq[idx], skb);
++      }
+       return ofld_xmit(&adap->sge.ofldtxq[idx], skb);
+ }
+-- 
+1.7.1
+
diff --git a/linux-next-cherry-picks/0048-cxgb4-Query-firmware-for-T5-ULPTX-MEMWRITE-DSGL-capa.patch b/linux-next-cherry-picks/0048-cxgb4-Query-firmware-for-T5-ULPTX-MEMWRITE-DSGL-capa.patch
new file mode 100644 (file)
index 0000000..0ba4451
--- /dev/null
@@ -0,0 +1,93 @@
+From 1ac0f095634a3e0494bc1d8c11a2c5972b80595f Mon Sep 17 00:00:00 2001
+From: Kumar Sanghvi <kumaras@chelsio.com>
+Date: Tue, 18 Feb 2014 17:56:12 +0530
+Subject: [PATCH] cxgb4: Query firmware for T5 ULPTX MEMWRITE DSGL capabilities
+
+Query firmware to see whether we're allowed to use T5 ULPTX MEMWRITE DSGL
+capabilities.  Also pass that information to Upper Layer Drivers via the
+new (struct cxgb4_lld_info).ulptx_memwrite_dsgl boolean.
+
+Based on original work by Casey Leedom <leedom@chelsio.com>
+
+Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/chelsio/cxgb4/cxgb4.h      |    1 +
+ drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |   16 ++++++++++++++++
+ drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h  |    1 +
+ drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h   |    1 +
+ 4 files changed, 19 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+index 028b5e5..944f2cb 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+@@ -308,6 +308,7 @@ struct adapter_params {
+       unsigned char bypass;
+       unsigned int ofldq_wr_cred;
++      bool ulptx_memwrite_dsgl;          /* use of T5 DSGL allowed */
+ };
+ #include "t4fw_api.h"
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+index 9222a8a..aeeaa06 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+@@ -3776,6 +3776,7 @@ static void uld_attach(struct adapter *adap, unsigned int uld)
+       lli.dbfifo_int_thresh = dbfifo_int_thresh;
+       lli.sge_pktshift = adap->sge.pktshift;
+       lli.enable_fw_ofld_conn = adap->flags & FW_OFLD_CONN;
++      lli.ulptx_memwrite_dsgl = adap->params.ulptx_memwrite_dsgl;
+       handle = ulds[uld].add(&lli);
+       if (IS_ERR(handle)) {
+@@ -5381,6 +5382,21 @@ static int adap_init0(struct adapter *adap)
+       (void) t4_set_params(adap, adap->mbox, adap->fn, 0, 1, params, val);
+       /*
++       * Find out whether we're allowed to use the T5+ ULPTX MEMWRITE DSGL
++       * capability.  Earlier versions of the firmware didn't have the
++       * ULPTX_MEMWRITE_DSGL so we'll interpret a query failure as no
++       * permission to use ULPTX MEMWRITE DSGL.
++       */
++      if (is_t4(adap->params.chip)) {
++              adap->params.ulptx_memwrite_dsgl = false;
++      } else {
++              params[0] = FW_PARAM_DEV(ULPTX_MEMWRITE_DSGL);
++              ret = t4_query_params(adap, adap->mbox, adap->fn, 0,
++                                    1, params, val);
++              adap->params.ulptx_memwrite_dsgl = (ret == 0 && val[0] != 0);
++      }
++
++      /*
+        * Get device capabilities so we can determine what resources we need
+        * to manage.
+        */
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
+index 4dd0a82..e274a04 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
+@@ -253,6 +253,7 @@ struct cxgb4_lld_info {
+                                            /* packet data */
+       bool enable_fw_ofld_conn;            /* Enable connection through fw */
+                                            /* WR */
++      bool ulptx_memwrite_dsgl;            /* use of T5 DSGL allowed */
+ };
+ struct cxgb4_uld_info {
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
+index af6e124..9cc973f 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
++++ b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
+@@ -932,6 +932,7 @@ enum fw_params_param_dev {
+       FW_PARAMS_PARAM_DEV_FWREV = 0x0B,
+       FW_PARAMS_PARAM_DEV_TPREV = 0x0C,
+       FW_PARAMS_PARAM_DEV_CF = 0x0D,
++      FW_PARAMS_PARAM_DEV_ULPTX_MEMWRITE_DSGL = 0x17,
+ };
+ /*
+-- 
+1.7.1
+
diff --git a/linux-next-cherry-picks/0049-cxgb4-Remove-unused-registers-and-add-missing-ones.patch b/linux-next-cherry-picks/0049-cxgb4-Remove-unused-registers-and-add-missing-ones.patch
new file mode 100644 (file)
index 0000000..e13b56e
--- /dev/null
@@ -0,0 +1,39 @@
+From c1f49e3e4adfba6eb953481d6731b2ee07085237 Mon Sep 17 00:00:00 2001
+From: Kumar Sanghvi <kumaras@chelsio.com>
+Date: Tue, 18 Feb 2014 17:56:13 +0530
+Subject: [PATCH] cxgb4: Remove unused registers and add missing ones
+
+Remove unused registers for registers list, and add missing ones
+Based on original work by Santosh Rastapur <santosh@chelsio.com>
+
+Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+index aeeaa06..d431ad7 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+@@ -2064,7 +2064,7 @@ static void get_regs(struct net_device *dev, struct ethtool_regs *regs,
+               0x40200, 0x40298,
+               0x402ac, 0x4033c,
+               0x403f8, 0x403fc,
+-              0x41300, 0x413c4,
++              0x41304, 0x413c4,
+               0x41400, 0x4141c,
+               0x41480, 0x414d0,
+               0x44000, 0x44078,
+@@ -2092,7 +2092,7 @@ static void get_regs(struct net_device *dev, struct ethtool_regs *regs,
+               0x48200, 0x48298,
+               0x482ac, 0x4833c,
+               0x483f8, 0x483fc,
+-              0x49300, 0x493c4,
++              0x49304, 0x493c4,
+               0x49400, 0x4941c,
+               0x49480, 0x494d0,
+               0x4c000, 0x4c078,
+-- 
+1.7.1
+
diff --git a/linux-next-cherry-picks/0050-cxgb4-Don-t-assume-LSO-only-uses-SGL-path-in-t4_eth_.patch b/linux-next-cherry-picks/0050-cxgb4-Don-t-assume-LSO-only-uses-SGL-path-in-t4_eth_.patch
new file mode 100644 (file)
index 0000000..8fdc599
--- /dev/null
@@ -0,0 +1,123 @@
+From 0034b2986ae44c72f8b784cf419e67f48e5304de Mon Sep 17 00:00:00 2001
+From: Kumar Sanghvi <kumaras@chelsio.com>
+Date: Tue, 18 Feb 2014 17:56:14 +0530
+Subject: [PATCH] cxgb4: Don't assume LSO only uses SGL path in t4_eth_xmit()
+
+Also, modify is_eth_imm() to return header length so it doesn't
+have to be recomputed in calc_tx_flits().
+
+Based on original work by Mike Werner <werner@chelsio.com>
+
+Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/chelsio/cxgb4/sge.c |   32 ++++++++++++++++++++---------
+ 1 files changed, 22 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
+index 23dbe28..af76b25 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
+@@ -706,11 +706,17 @@ static inline unsigned int flits_to_desc(unsigned int n)
+  *    @skb: the packet
+  *
+  *    Returns whether an Ethernet packet is small enough to fit as
+- *    immediate data.
++ *    immediate data. Return value corresponds to headroom required.
+  */
+ static inline int is_eth_imm(const struct sk_buff *skb)
+ {
+-      return skb->len <= MAX_IMM_TX_PKT_LEN - sizeof(struct cpl_tx_pkt);
++      int hdrlen = skb_shinfo(skb)->gso_size ?
++                      sizeof(struct cpl_tx_pkt_lso_core) : 0;
++
++      hdrlen += sizeof(struct cpl_tx_pkt);
++      if (skb->len <= MAX_IMM_TX_PKT_LEN - hdrlen)
++              return hdrlen;
++      return 0;
+ }
+ /**
+@@ -723,9 +729,10 @@ static inline int is_eth_imm(const struct sk_buff *skb)
+ static inline unsigned int calc_tx_flits(const struct sk_buff *skb)
+ {
+       unsigned int flits;
++      int hdrlen = is_eth_imm(skb);
+-      if (is_eth_imm(skb))
+-              return DIV_ROUND_UP(skb->len + sizeof(struct cpl_tx_pkt), 8);
++      if (hdrlen)
++              return DIV_ROUND_UP(skb->len + hdrlen, sizeof(__be64));
+       flits = sgl_len(skb_shinfo(skb)->nr_frags + 1) + 4;
+       if (skb_shinfo(skb)->gso_size)
+@@ -971,6 +978,7 @@ static inline void txq_advance(struct sge_txq *q, unsigned int n)
+  */
+ netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev)
+ {
++      int len;
+       u32 wr_mid;
+       u64 cntrl, *end;
+       int qidx, credits;
+@@ -982,6 +990,7 @@ netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev)
+       struct cpl_tx_pkt_core *cpl;
+       const struct skb_shared_info *ssi;
+       dma_addr_t addr[MAX_SKB_FRAGS + 1];
++      bool immediate = false;
+       /*
+        * The chip min packet length is 10 octets but play safe and reject
+@@ -1011,7 +1020,10 @@ out_free:       dev_kfree_skb(skb);
+               return NETDEV_TX_BUSY;
+       }
+-      if (!is_eth_imm(skb) &&
++      if (is_eth_imm(skb))
++              immediate = true;
++
++      if (!immediate &&
+           unlikely(map_skb(adap->pdev_dev, skb, addr) < 0)) {
+               q->mapping_err++;
+               goto out_free;
+@@ -1028,6 +1040,8 @@ out_free:        dev_kfree_skb(skb);
+       wr->r3 = cpu_to_be64(0);
+       end = (u64 *)wr + flits;
++      len = immediate ? skb->len : 0;
++      len += sizeof(*cpl);
+       ssi = skb_shinfo(skb);
+       if (ssi->gso_size) {
+               struct cpl_tx_pkt_lso *lso = (void *)wr;
+@@ -1035,8 +1049,9 @@ out_free:        dev_kfree_skb(skb);
+               int l3hdr_len = skb_network_header_len(skb);
+               int eth_xtra_len = skb_network_offset(skb) - ETH_HLEN;
++              len += sizeof(*lso);
+               wr->op_immdlen = htonl(FW_WR_OP(FW_ETH_TX_PKT_WR) |
+-                                     FW_WR_IMMDLEN(sizeof(*lso)));
++                                     FW_WR_IMMDLEN(len));
+               lso->c.lso_ctrl = htonl(LSO_OPCODE(CPL_TX_PKT_LSO) |
+                                       LSO_FIRST_SLICE | LSO_LAST_SLICE |
+                                       LSO_IPV6(v6) |
+@@ -1054,9 +1069,6 @@ out_free:        dev_kfree_skb(skb);
+               q->tso++;
+               q->tx_cso += ssi->gso_segs;
+       } else {
+-              int len;
+-
+-              len = is_eth_imm(skb) ? skb->len + sizeof(*cpl) : sizeof(*cpl);
+               wr->op_immdlen = htonl(FW_WR_OP(FW_ETH_TX_PKT_WR) |
+                                      FW_WR_IMMDLEN(len));
+               cpl = (void *)(wr + 1);
+@@ -1078,7 +1090,7 @@ out_free:        dev_kfree_skb(skb);
+       cpl->len = htons(skb->len);
+       cpl->ctrl1 = cpu_to_be64(cntrl);
+-      if (is_eth_imm(skb)) {
++      if (immediate) {
+               inline_tx_skb(skb, &q->q, cpl + 1);
+               dev_kfree_skb(skb);
+       } else {
+-- 
+1.7.1
+
diff --git a/linux-next-cherry-picks/0051-cxgb4-Add-more-PCI-device-ids.patch b/linux-next-cherry-picks/0051-cxgb4-Add-more-PCI-device-ids.patch
new file mode 100644 (file)
index 0000000..914d174
--- /dev/null
@@ -0,0 +1,36 @@
+From f0a8e6dea0f6785e84673f5f9ddb620de5447aba Mon Sep 17 00:00:00 2001
+From: Hariprasad Shenai <hariprasad@chelsio.com>
+Date: Tue, 18 Feb 2014 17:56:15 +0530
+Subject: [PATCH] cxgb4: Add more PCI device ids.
+
+Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |    4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+index d431ad7..4660f55 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+@@ -254,6 +254,8 @@ static DEFINE_PCI_DEVICE_TABLE(cxgb4_pci_tbl) = {
+       CH_DEVICE(0x5011, 4),
+       CH_DEVICE(0x5012, 4),
+       CH_DEVICE(0x5013, 4),
++      CH_DEVICE(0x5014, 4),
++      CH_DEVICE(0x5015, 4),
+       CH_DEVICE(0x5401, 4),
+       CH_DEVICE(0x5402, 4),
+       CH_DEVICE(0x5403, 4),
+@@ -273,6 +275,8 @@ static DEFINE_PCI_DEVICE_TABLE(cxgb4_pci_tbl) = {
+       CH_DEVICE(0x5411, 4),
+       CH_DEVICE(0x5412, 4),
+       CH_DEVICE(0x5413, 4),
++      CH_DEVICE(0x5414, 4),
++      CH_DEVICE(0x5415, 4),
+       { 0, }
+ };
+-- 
+1.7.1
+