Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'cxgb4'

Hariprasad Shenai says:

====================
Adds support for Chelsio T5 40G adapter and Misc. fixes

This patch series adds support for Chelsio T5 40G adapters and provides
miscelleneous fixes for cxgb4 driver.

It also adds device ids of two new T5 adapters.

We would like to request this patch series to get merged via David Miller's
'net-next' tree.

We have included all the maintainers of respective drivers. Kindly review the
change and let us know in case of any review comments.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+119 -30
+4 -1
drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
··· 66 66 SERNUM_LEN = 24, /* Serial # length */ 67 67 EC_LEN = 16, /* E/C length */ 68 68 ID_LEN = 16, /* ID length */ 69 + PN_LEN = 16, /* Part Number length */ 69 70 }; 70 71 71 72 enum { ··· 255 254 u8 ec[EC_LEN + 1]; 256 255 u8 sn[SERNUM_LEN + 1]; 257 256 u8 id[ID_LEN + 1]; 257 + u8 pn[PN_LEN + 1]; 258 258 }; 259 259 260 260 struct pci_params { ··· 308 306 unsigned char bypass; 309 307 310 308 unsigned int ofldq_wr_cred; 309 + bool ulptx_memwrite_dsgl; /* use of T5 DSGL allowed */ 311 310 }; 312 311 313 312 #include "t4fw_api.h" ··· 960 957 u64 *parity); 961 958 int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, 962 959 u64 *parity); 963 - 960 + const char *t4_get_port_type_description(enum fw_port_type port_type); 964 961 void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p); 965 962 void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log); 966 963 void t4_tp_wr_bits_indirect(struct adapter *adap, unsigned int addr,
+45 -16
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
··· 254 254 CH_DEVICE(0x5011, 4), 255 255 CH_DEVICE(0x5012, 4), 256 256 CH_DEVICE(0x5013, 4), 257 + CH_DEVICE(0x5014, 4), 258 + CH_DEVICE(0x5015, 4), 257 259 CH_DEVICE(0x5401, 4), 258 260 CH_DEVICE(0x5402, 4), 259 261 CH_DEVICE(0x5403, 4), ··· 275 273 CH_DEVICE(0x5411, 4), 276 274 CH_DEVICE(0x5412, 4), 277 275 CH_DEVICE(0x5413, 4), 276 + CH_DEVICE(0x5414, 4), 277 + CH_DEVICE(0x5415, 4), 278 278 { 0, } 279 279 }; 280 280 ··· 435 431 break; 436 432 case SPEED_100: 437 433 s = "100Mbps"; 434 + break; 435 + case 40000: /* Need a SPEED_40000 in ethtool.h */ 436 + s = "40Gbps"; 438 437 break; 439 438 } 440 439 ··· 2068 2061 0x40200, 0x40298, 2069 2062 0x402ac, 0x4033c, 2070 2063 0x403f8, 0x403fc, 2071 - 0x41300, 0x413c4, 2064 + 0x41304, 0x413c4, 2072 2065 0x41400, 0x4141c, 2073 2066 0x41480, 0x414d0, 2074 2067 0x44000, 0x44078, ··· 2096 2089 0x48200, 0x48298, 2097 2090 0x482ac, 0x4833c, 2098 2091 0x483f8, 0x483fc, 2099 - 0x49300, 0x493c4, 2092 + 0x49304, 0x493c4, 2100 2093 0x49400, 0x4941c, 2101 2094 0x49480, 0x494d0, 2102 2095 0x4c000, 0x4c078, ··· 2206 2199 else if (type == FW_PORT_TYPE_FIBER_XFI || 2207 2200 type == FW_PORT_TYPE_FIBER_XAUI || type == FW_PORT_TYPE_SFP) 2208 2201 v |= SUPPORTED_FIBRE; 2202 + else if (type == FW_PORT_TYPE_BP40_BA) 2203 + v |= SUPPORTED_40000baseSR4_Full; 2209 2204 2210 2205 if (caps & FW_PORT_CAP_ANEG) 2211 2206 v |= SUPPORTED_Autoneg; ··· 2224 2215 v |= FW_PORT_CAP_SPEED_1G; 2225 2216 if (caps & ADVERTISED_10000baseT_Full) 2226 2217 v |= FW_PORT_CAP_SPEED_10G; 2218 + if (caps & ADVERTISED_40000baseSR4_Full) 2219 + v |= FW_PORT_CAP_SPEED_40G; 2227 2220 return v; 2228 2221 } 2229 2222 ··· 2280 2269 return FW_PORT_CAP_SPEED_1G; 2281 2270 if (speed == SPEED_10000) 2282 2271 return FW_PORT_CAP_SPEED_10G; 2272 + if (speed == 40000) /* Need SPEED_40000 in ethtool.h */ 2273 + return FW_PORT_CAP_SPEED_40G; 2283 2274 return 0; 2284 2275 } 2285 2276 ··· 2309 2296 if (cmd->autoneg == AUTONEG_DISABLE) { 2310 2297 cap = speed_to_caps(speed); 2311 2298 2312 - if (!(lc->supported & cap) || (speed == SPEED_1000) || 2313 - (speed == SPEED_10000)) 2299 + if (!(lc->supported & cap) || 2300 + (speed == SPEED_1000) || 2301 + (speed == SPEED_10000) || 2302 + (speed == 40000)) 2314 2303 return -EINVAL; 2315 2304 lc->requested_speed = cap; 2316 2305 lc->advertising = 0; ··· 3780 3765 lli.dbfifo_int_thresh = dbfifo_int_thresh; 3781 3766 lli.sge_pktshift = adap->sge.pktshift; 3782 3767 lli.enable_fw_ofld_conn = adap->flags & FW_OFLD_CONN; 3768 + lli.ulptx_memwrite_dsgl = adap->params.ulptx_memwrite_dsgl; 3783 3769 3784 3770 handle = ulds[uld].add(&lli); 3785 3771 if (IS_ERR(handle)) { ··· 5386 5370 (void) t4_set_params(adap, adap->mbox, adap->fn, 0, 1, params, val); 5387 5371 5388 5372 /* 5373 + * Find out whether we're allowed to use the T5+ ULPTX MEMWRITE DSGL 5374 + * capability. Earlier versions of the firmware didn't have the 5375 + * ULPTX_MEMWRITE_DSGL so we'll interpret a query failure as no 5376 + * permission to use ULPTX MEMWRITE DSGL. 5377 + */ 5378 + if (is_t4(adap->params.chip)) { 5379 + adap->params.ulptx_memwrite_dsgl = false; 5380 + } else { 5381 + params[0] = FW_PARAM_DEV(ULPTX_MEMWRITE_DSGL); 5382 + ret = t4_query_params(adap, adap->mbox, adap->fn, 0, 5383 + 1, params, val); 5384 + adap->params.ulptx_memwrite_dsgl = (ret == 0 && val[0] != 0); 5385 + } 5386 + 5387 + /* 5389 5388 * Get device capabilities so we can determine what resources we need 5390 5389 * to manage. 5391 5390 */ ··· 5634 5603 .resume = eeh_resume, 5635 5604 }; 5636 5605 5637 - static inline bool is_10g_port(const struct link_config *lc) 5606 + static inline bool is_x_10g_port(const struct link_config *lc) 5638 5607 { 5639 - return (lc->supported & FW_PORT_CAP_SPEED_10G) != 0; 5608 + return (lc->supported & FW_PORT_CAP_SPEED_10G) != 0 || 5609 + (lc->supported & FW_PORT_CAP_SPEED_40G) != 0; 5640 5610 } 5641 5611 5642 5612 static inline void init_rspq(struct sge_rspq *q, u8 timer_idx, u8 pkt_cnt_idx, ··· 5661 5629 int i, q10g = 0, n10g = 0, qidx = 0; 5662 5630 5663 5631 for_each_port(adap, i) 5664 - n10g += is_10g_port(&adap2pinfo(adap, i)->link_cfg); 5632 + n10g += is_x_10g_port(&adap2pinfo(adap, i)->link_cfg); 5665 5633 5666 5634 /* 5667 5635 * We default to 1 queue per non-10G port and up to # of cores queues ··· 5676 5644 struct port_info *pi = adap2pinfo(adap, i); 5677 5645 5678 5646 pi->first_qset = qidx; 5679 - pi->nqsets = is_10g_port(&pi->link_cfg) ? q10g : 1; 5647 + pi->nqsets = is_x_10g_port(&pi->link_cfg) ? q10g : 1; 5680 5648 qidx += pi->nqsets; 5681 5649 } 5682 5650 ··· 5831 5799 5832 5800 static void print_port_info(const struct net_device *dev) 5833 5801 { 5834 - static const char *base[] = { 5835 - "R XFI", "R XAUI", "T SGMII", "T XFI", "T XAUI", "KX4", "CX4", 5836 - "KX", "KR", "R SFP+", "KR/KX", "KR/KX/KX4" 5837 - }; 5838 - 5839 5802 char buf[80]; 5840 5803 char *bufp = buf; 5841 5804 const char *spd = ""; ··· 5848 5821 bufp += sprintf(bufp, "1000/"); 5849 5822 if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_10G) 5850 5823 bufp += sprintf(bufp, "10G/"); 5824 + if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_40G) 5825 + bufp += sprintf(bufp, "40G/"); 5851 5826 if (bufp != buf) 5852 5827 --bufp; 5853 - sprintf(bufp, "BASE-%s", base[pi->port_type]); 5828 + sprintf(bufp, "BASE-%s", t4_get_port_type_description(pi->port_type)); 5854 5829 5855 5830 netdev_info(dev, "Chelsio %s rev %d %s %sNIC PCIe x%d%s%s\n", 5856 5831 adap->params.vpd.id, ··· 5860 5831 is_offload(adap) ? "R" : "", adap->params.pci.width, spd, 5861 5832 (adap->flags & USING_MSIX) ? " MSI-X" : 5862 5833 (adap->flags & USING_MSI) ? " MSI" : ""); 5863 - netdev_info(dev, "S/N: %s, E/C: %s\n", 5864 - adap->params.vpd.sn, adap->params.vpd.ec); 5834 + netdev_info(dev, "S/N: %s, P/N: %s\n", 5835 + adap->params.vpd.sn, adap->params.vpd.pn); 5865 5836 } 5866 5837 5867 5838 static void enable_pcie_relaxed_ordering(struct pci_dev *dev)
+1
drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
··· 253 253 /* packet data */ 254 254 bool enable_fw_ofld_conn; /* Enable connection through fw */ 255 255 /* WR */ 256 + bool ulptx_memwrite_dsgl; /* use of T5 DSGL allowed */ 256 257 }; 257 258 258 259 struct cxgb4_uld_info {
+27 -11
drivers/net/ethernet/chelsio/cxgb4/sge.c
··· 706 706 * @skb: the packet 707 707 * 708 708 * Returns whether an Ethernet packet is small enough to fit as 709 - * immediate data. 709 + * immediate data. Return value corresponds to headroom required. 710 710 */ 711 711 static inline int is_eth_imm(const struct sk_buff *skb) 712 712 { 713 - return skb->len <= MAX_IMM_TX_PKT_LEN - sizeof(struct cpl_tx_pkt); 713 + int hdrlen = skb_shinfo(skb)->gso_size ? 714 + sizeof(struct cpl_tx_pkt_lso_core) : 0; 715 + 716 + hdrlen += sizeof(struct cpl_tx_pkt); 717 + if (skb->len <= MAX_IMM_TX_PKT_LEN - hdrlen) 718 + return hdrlen; 719 + return 0; 714 720 } 715 721 716 722 /** ··· 729 723 static inline unsigned int calc_tx_flits(const struct sk_buff *skb) 730 724 { 731 725 unsigned int flits; 726 + int hdrlen = is_eth_imm(skb); 732 727 733 - if (is_eth_imm(skb)) 734 - return DIV_ROUND_UP(skb->len + sizeof(struct cpl_tx_pkt), 8); 728 + if (hdrlen) 729 + return DIV_ROUND_UP(skb->len + hdrlen, sizeof(__be64)); 735 730 736 731 flits = sgl_len(skb_shinfo(skb)->nr_frags + 1) + 4; 737 732 if (skb_shinfo(skb)->gso_size) ··· 978 971 */ 979 972 netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev) 980 973 { 974 + int len; 981 975 u32 wr_mid; 982 976 u64 cntrl, *end; 983 977 int qidx, credits; ··· 990 982 struct cpl_tx_pkt_core *cpl; 991 983 const struct skb_shared_info *ssi; 992 984 dma_addr_t addr[MAX_SKB_FRAGS + 1]; 985 + bool immediate = false; 993 986 994 987 /* 995 988 * The chip min packet length is 10 octets but play safe and reject ··· 1020 1011 return NETDEV_TX_BUSY; 1021 1012 } 1022 1013 1023 - if (!is_eth_imm(skb) && 1014 + if (is_eth_imm(skb)) 1015 + immediate = true; 1016 + 1017 + if (!immediate && 1024 1018 unlikely(map_skb(adap->pdev_dev, skb, addr) < 0)) { 1025 1019 q->mapping_err++; 1026 1020 goto out_free; ··· 1040 1028 wr->r3 = cpu_to_be64(0); 1041 1029 end = (u64 *)wr + flits; 1042 1030 1031 + len = immediate ? skb->len : 0; 1032 + len += sizeof(*cpl); 1043 1033 ssi = skb_shinfo(skb); 1044 1034 if (ssi->gso_size) { 1045 1035 struct cpl_tx_pkt_lso *lso = (void *)wr; ··· 1049 1035 int l3hdr_len = skb_network_header_len(skb); 1050 1036 int eth_xtra_len = skb_network_offset(skb) - ETH_HLEN; 1051 1037 1038 + len += sizeof(*lso); 1052 1039 wr->op_immdlen = htonl(FW_WR_OP(FW_ETH_TX_PKT_WR) | 1053 - FW_WR_IMMDLEN(sizeof(*lso))); 1040 + FW_WR_IMMDLEN(len)); 1054 1041 lso->c.lso_ctrl = htonl(LSO_OPCODE(CPL_TX_PKT_LSO) | 1055 1042 LSO_FIRST_SLICE | LSO_LAST_SLICE | 1056 1043 LSO_IPV6(v6) | ··· 1069 1054 q->tso++; 1070 1055 q->tx_cso += ssi->gso_segs; 1071 1056 } else { 1072 - int len; 1073 - 1074 - len = is_eth_imm(skb) ? skb->len + sizeof(*cpl) : sizeof(*cpl); 1075 1057 wr->op_immdlen = htonl(FW_WR_OP(FW_ETH_TX_PKT_WR) | 1076 1058 FW_WR_IMMDLEN(len)); 1077 1059 cpl = (void *)(wr + 1); ··· 1090 1078 cpl->len = htons(skb->len); 1091 1079 cpl->ctrl1 = cpu_to_be64(cntrl); 1092 1080 1093 - if (is_eth_imm(skb)) { 1081 + if (immediate) { 1094 1082 inline_tx_skb(skb, &q->q, cpl + 1); 1095 1083 dev_kfree_skb(skb); 1096 1084 } else { ··· 1479 1467 { 1480 1468 unsigned int idx = skb_txq(skb); 1481 1469 1482 - if (unlikely(is_ctrl_pkt(skb))) 1470 + if (unlikely(is_ctrl_pkt(skb))) { 1471 + /* Single ctrl queue is a requirement for LE workaround path */ 1472 + if (adap->tids.nsftids) 1473 + idx = 0; 1483 1474 return ctrl_xmit(&adap->sge.ctrlq[idx], skb); 1475 + } 1484 1476 return ofld_xmit(&adap->sge.ofldtxq[idx], skb); 1485 1477 } 1486 1478
+38 -2
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
··· 573 573 { 574 574 u32 cclk_param, cclk_val; 575 575 int i, ret, addr; 576 - int ec, sn; 576 + int ec, sn, pn; 577 577 u8 *vpd, csum; 578 578 unsigned int vpdr_len, kw_offset, id_len; 579 579 ··· 638 638 639 639 FIND_VPD_KW(ec, "EC"); 640 640 FIND_VPD_KW(sn, "SN"); 641 + FIND_VPD_KW(pn, "PN"); 641 642 #undef FIND_VPD_KW 642 643 643 644 memcpy(p->id, vpd + PCI_VPD_LRDT_TAG_SIZE, id_len); ··· 648 647 i = pci_vpd_info_field_size(vpd + sn - PCI_VPD_INFO_FLD_HDR_SIZE); 649 648 memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN)); 650 649 strim(p->sn); 650 + memcpy(p->pn, vpd + pn, min(i, PN_LEN)); 651 + strim(p->pn); 651 652 652 653 /* 653 654 * Ask firmware for the Core Clock since it knows how to translate the ··· 1158 1155 } 1159 1156 1160 1157 #define ADVERT_MASK (FW_PORT_CAP_SPEED_100M | FW_PORT_CAP_SPEED_1G |\ 1161 - FW_PORT_CAP_SPEED_10G | FW_PORT_CAP_ANEG) 1158 + FW_PORT_CAP_SPEED_10G | FW_PORT_CAP_SPEED_40G | \ 1159 + FW_PORT_CAP_ANEG) 1162 1160 1163 1161 /** 1164 1162 * t4_link_start - apply link configuration to MAC/PHY ··· 2248 2244 if (n == 1) 2249 2245 return idx < 2 ? (3 << (2 * idx)) : 0; 2250 2246 return 1 << idx; 2247 + } 2248 + 2249 + /** 2250 + * t4_get_port_type_description - return Port Type string description 2251 + * @port_type: firmware Port Type enumeration 2252 + */ 2253 + const char *t4_get_port_type_description(enum fw_port_type port_type) 2254 + { 2255 + static const char *const port_type_description[] = { 2256 + "R XFI", 2257 + "R XAUI", 2258 + "T SGMII", 2259 + "T XFI", 2260 + "T XAUI", 2261 + "KX4", 2262 + "CX4", 2263 + "KX", 2264 + "KR", 2265 + "R SFP+", 2266 + "KR/KX", 2267 + "KR/KX/KX4", 2268 + "R QSFP_10G", 2269 + "", 2270 + "R QSFP", 2271 + "R BP40_BA", 2272 + }; 2273 + 2274 + if (port_type < ARRAY_SIZE(port_type_description)) 2275 + return port_type_description[port_type]; 2276 + return "UNKNOWN"; 2251 2277 } 2252 2278 2253 2279 /** ··· 3572 3538 speed = SPEED_1000; 3573 3539 else if (stat & FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_10G)) 3574 3540 speed = SPEED_10000; 3541 + else if (stat & FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_40G)) 3542 + speed = 40000; /* Need SPEED_40000 in ethtool.h */ 3575 3543 3576 3544 if (link_ok != lc->link_ok || speed != lc->speed || 3577 3545 fc != lc->fc) { /* something changed */
+4
drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
··· 932 932 FW_PARAMS_PARAM_DEV_FWREV = 0x0B, 933 933 FW_PARAMS_PARAM_DEV_TPREV = 0x0C, 934 934 FW_PARAMS_PARAM_DEV_CF = 0x0D, 935 + FW_PARAMS_PARAM_DEV_ULPTX_MEMWRITE_DSGL = 0x17, 935 936 }; 936 937 937 938 /* ··· 1743 1742 FW_PORT_TYPE_SFP, 1744 1743 FW_PORT_TYPE_BP_AP, 1745 1744 FW_PORT_TYPE_BP4_AP, 1745 + FW_PORT_TYPE_QSFP_10G, 1746 + FW_PORT_TYPE_QSFP, 1747 + FW_PORT_TYPE_BP40_BA, 1746 1748 1747 1749 FW_PORT_TYPE_NONE = FW_PORT_CMD_PTYPE_MASK 1748 1750 };