Commit 826d8010 authored by Dave Olson's avatar Dave Olson Committed by Roland Dreier

IB/ipath: Enable 4KB MTU

Enable use of 4KB MTU.  Since the driver uses more pinned memory for
receive buffers when the 4KB MTU is enabled, whether or not the fabric
supports that MTU, add a "mtu4096" module parameter that can be used to
limit the MTU to 2KB when it is known that 4KB MTUs can't be used
anyway.
Signed-off-by: default avatarDave Olson <dave.olson@qlogic.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent 5d1ce03d
...@@ -73,6 +73,10 @@ module_param_named(debug, ipath_debug, uint, S_IWUSR | S_IRUGO); ...@@ -73,6 +73,10 @@ module_param_named(debug, ipath_debug, uint, S_IWUSR | S_IRUGO);
MODULE_PARM_DESC(debug, "mask for debug prints"); MODULE_PARM_DESC(debug, "mask for debug prints");
EXPORT_SYMBOL_GPL(ipath_debug); EXPORT_SYMBOL_GPL(ipath_debug);
unsigned ipath_mtu4096 = 1; /* max 4KB IB mtu by default, if supported */
module_param_named(mtu4096, ipath_mtu4096, uint, S_IRUGO);
MODULE_PARM_DESC(mtu4096, "enable MTU of 4096 bytes, if supported");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("QLogic <support@pathscale.com>"); MODULE_AUTHOR("QLogic <support@pathscale.com>");
MODULE_DESCRIPTION("QLogic InfiniPath driver"); MODULE_DESCRIPTION("QLogic InfiniPath driver");
...@@ -1800,7 +1804,7 @@ int ipath_set_mtu(struct ipath_devdata *dd, u16 arg) ...@@ -1800,7 +1804,7 @@ int ipath_set_mtu(struct ipath_devdata *dd, u16 arg)
* piosize). We check that it's one of the valid IB sizes. * piosize). We check that it's one of the valid IB sizes.
*/ */
if (arg != 256 && arg != 512 && arg != 1024 && arg != 2048 && if (arg != 256 && arg != 512 && arg != 1024 && arg != 2048 &&
arg != 4096) { (arg != 4096 || !ipath_mtu4096)) {
ipath_dbg("Trying to set invalid mtu %u, failing\n", arg); ipath_dbg("Trying to set invalid mtu %u, failing\n", arg);
ret = -EINVAL; ret = -EINVAL;
goto bail; goto bail;
...@@ -1816,6 +1820,8 @@ int ipath_set_mtu(struct ipath_devdata *dd, u16 arg) ...@@ -1816,6 +1820,8 @@ int ipath_set_mtu(struct ipath_devdata *dd, u16 arg)
if (arg >= (piosize - IPATH_PIO_MAXIBHDR)) { if (arg >= (piosize - IPATH_PIO_MAXIBHDR)) {
/* Only if it's not the initial value (or reset to it) */ /* Only if it's not the initial value (or reset to it) */
if (piosize != dd->ipath_init_ibmaxlen) { if (piosize != dd->ipath_init_ibmaxlen) {
if (arg > piosize && arg <= dd->ipath_init_ibmaxlen)
piosize = dd->ipath_init_ibmaxlen;
dd->ipath_ibmaxlen = piosize; dd->ipath_ibmaxlen = piosize;
changed = 1; changed = 1;
} }
...@@ -1829,24 +1835,17 @@ int ipath_set_mtu(struct ipath_devdata *dd, u16 arg) ...@@ -1829,24 +1835,17 @@ int ipath_set_mtu(struct ipath_devdata *dd, u16 arg)
} }
if (changed) { if (changed) {
u64 ibc = dd->ipath_ibcctrl, ibdw;
/* /*
* set the IBC maxpktlength to the size of our pio * update our housekeeping variables, and set IBC max
* buffers in words * size, same as init code; max IBC is max we allow in
* buffer, less the qword pbc, plus 1 for ICRC, in dwords
*/ */
u64 ibc = dd->ipath_ibcctrl; dd->ipath_ibmaxlen = piosize - 2 * sizeof(u32);
ibdw = (dd->ipath_ibmaxlen >> 2) + 1;
ibc &= ~(INFINIPATH_IBCC_MAXPKTLEN_MASK << ibc &= ~(INFINIPATH_IBCC_MAXPKTLEN_MASK <<
INFINIPATH_IBCC_MAXPKTLEN_SHIFT); dd->ibcc_mpl_shift);
ibc |= ibdw << dd->ibcc_mpl_shift;
piosize = piosize - 2 * sizeof(u32); /* ignore pbc */
dd->ipath_ibmaxlen = piosize;
piosize /= sizeof(u32); /* in words */
/*
* for ICRC, which we only send in diag test pkt mode, and
* we don't need to worry about that for mtu
*/
piosize += 1;
ibc |= piosize << INFINIPATH_IBCC_MAXPKTLEN_SHIFT;
dd->ipath_ibcctrl = ibc; dd->ipath_ibcctrl = ibc;
ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl, ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl,
dd->ipath_ibcctrl); dd->ipath_ibcctrl);
......
...@@ -219,7 +219,12 @@ static int ipath_get_base_info(struct file *fp, ...@@ -219,7 +219,12 @@ static int ipath_get_base_info(struct file *fp,
kinfo->spi_pioalign = dd->ipath_palign; kinfo->spi_pioalign = dd->ipath_palign;
kinfo->spi_qpair = IPATH_KD_QP; kinfo->spi_qpair = IPATH_KD_QP;
kinfo->spi_piosize = dd->ipath_ibmaxlen; /*
* user mode PIO buffers are always 2KB, even when 4KB can
* be received, and sent via the kernel; this is ibmaxlen
* for 2K MTU.
*/
kinfo->spi_piosize = dd->ipath_piosize2k - 2 * sizeof(u32);
kinfo->spi_mtu = dd->ipath_ibmaxlen; /* maxlen, not ibmtu */ kinfo->spi_mtu = dd->ipath_ibmaxlen; /* maxlen, not ibmtu */
kinfo->spi_port = pd->port_port; kinfo->spi_port = pd->port_port;
kinfo->spi_subport = subport_fp(fp); kinfo->spi_subport = subport_fp(fp);
......
...@@ -1441,17 +1441,13 @@ static int ipath_pe_early_init(struct ipath_devdata *dd) ...@@ -1441,17 +1441,13 @@ static int ipath_pe_early_init(struct ipath_devdata *dd)
dd->ipath_egrtidbase = (u64 __iomem *) dd->ipath_egrtidbase = (u64 __iomem *)
((char __iomem *) dd->ipath_kregbase + dd->ipath_rcvegrbase); ((char __iomem *) dd->ipath_kregbase + dd->ipath_rcvegrbase);
/* dd->ipath_rcvegrbufsize = ipath_mtu4096 ? 4096 : 2048;
* To truly support a 4KB MTU (for usermode), we need to
* bump this to a larger value. For now, we use them for
* the kernel only.
*/
dd->ipath_rcvegrbufsize = 2048;
/* /*
* the min() check here is currently a nop, but it may not always * the min() check here is currently a nop, but it may not always
* be, depending on just how we do ipath_rcvegrbufsize * be, depending on just how we do ipath_rcvegrbufsize
*/ */
dd->ipath_ibmaxlen = min(dd->ipath_piosize2k, dd->ipath_ibmaxlen = min(ipath_mtu4096 ? dd->ipath_piosize4k :
dd->ipath_piosize2k,
dd->ipath_rcvegrbufsize + dd->ipath_rcvegrbufsize +
(dd->ipath_rcvhdrentsize << 2)); (dd->ipath_rcvhdrentsize << 2));
dd->ipath_init_ibmaxlen = dd->ipath_ibmaxlen; dd->ipath_init_ibmaxlen = dd->ipath_ibmaxlen;
......
...@@ -155,24 +155,13 @@ static int bringup_link(struct ipath_devdata *dd) ...@@ -155,24 +155,13 @@ static int bringup_link(struct ipath_devdata *dd)
dd->ipath_control); dd->ipath_control);
/* /*
* Note that prior to try 14 or 15 of IB, the credit scaling * set initial max size pkt IBC will send, including ICRC; it's the
* wasn't working, because it was swapped for writes with the * PIO buffer size in dwords, less 1; also see ipath_set_mtu()
* 1 bit default linkstate field
*/ */
val = (dd->ipath_ibmaxlen >> 2) + 1;
ibc = val << dd->ibcc_mpl_shift;
/* ignore pbc and align word */ /* flowcontrolwatermark is in units of KBytes */
val = dd->ipath_piosize2k - 2 * sizeof(u32);
/*
* for ICRC, which we only send in diag test pkt mode, and we
* don't need to worry about that for mtu
*/
val += 1;
/*
* Set the IBC maxpktlength to the size of our pio buffers the
* maxpktlength is in words. This is *not* the IB data MTU.
*/
ibc = (val / sizeof(u32)) << INFINIPATH_IBCC_MAXPKTLEN_SHIFT;
/* in KB */
ibc |= 0x5ULL << INFINIPATH_IBCC_FLOWCTRLWATERMARK_SHIFT; ibc |= 0x5ULL << INFINIPATH_IBCC_FLOWCTRLWATERMARK_SHIFT;
/* /*
* How often flowctrl sent. More or less in usecs; balance against * How often flowctrl sent. More or less in usecs; balance against
...@@ -295,12 +284,9 @@ static int init_chip_first(struct ipath_devdata *dd, ...@@ -295,12 +284,9 @@ static int init_chip_first(struct ipath_devdata *dd,
val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_sendpiosize); val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_sendpiosize);
dd->ipath_piosize2k = val & ~0U; dd->ipath_piosize2k = val & ~0U;
dd->ipath_piosize4k = val >> 32; dd->ipath_piosize4k = val >> 32;
/* if (dd->ipath_piosize4k == 0 && ipath_mtu4096)
* Note: the chips support a maximum MTU of 4096, but the driver ipath_mtu4096 = 0; /* 4KB not supported by this chip */
* hasn't implemented this feature yet, so set the initial value dd->ipath_ibmtu = ipath_mtu4096 ? 4096 : 2048;
* to 2048.
*/
dd->ipath_ibmtu = 2048;
val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_sendpiobufcnt); val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_sendpiobufcnt);
dd->ipath_piobcnt2k = val & ~0U; dd->ipath_piobcnt2k = val & ~0U;
dd->ipath_piobcnt4k = val >> 32; dd->ipath_piobcnt4k = val >> 32;
......
...@@ -1066,6 +1066,7 @@ dma_addr_t ipath_map_single(struct pci_dev *, void *, size_t, int); ...@@ -1066,6 +1066,7 @@ dma_addr_t ipath_map_single(struct pci_dev *, void *, size_t, int);
#endif #endif
extern unsigned ipath_debug; /* debugging bit mask */ extern unsigned ipath_debug; /* debugging bit mask */
extern unsigned ipath_mtu4096;
#define IPATH_MAX_PARITY_ATTEMPTS 10000 /* max times to try recovery */ #define IPATH_MAX_PARITY_ATTEMPTS 10000 /* max times to try recovery */
......
...@@ -292,13 +292,9 @@ static int recv_subn_get_portinfo(struct ib_smp *smp, ...@@ -292,13 +292,9 @@ static int recv_subn_get_portinfo(struct ib_smp *smp,
/* pip->vl_arb_high_cap; // only one VL */ /* pip->vl_arb_high_cap; // only one VL */
/* pip->vl_arb_low_cap; // only one VL */ /* pip->vl_arb_low_cap; // only one VL */
/* InitTypeReply = 0 */ /* InitTypeReply = 0 */
/* /* our mtu cap depends on whether 4K MTU enabled or not */
* Note: the chips support a maximum MTU of 4096, but the driver pip->inittypereply_mtucap = ipath_mtu4096 ? IB_MTU_4096 : IB_MTU_2048;
* hasn't implemented this feature yet, so set the maximum value /* HCAs ignore VLStallCount and HOQLife */
* to 2048.
*/
pip->inittypereply_mtucap = IB_MTU_2048;
// HCAs ignore VLStallCount and HOQLife
/* pip->vlstallcnt_hoqlife; */ /* pip->vlstallcnt_hoqlife; */
pip->operationalvl_pei_peo_fpi_fpo = 0x10; /* OVLs = 1 */ pip->operationalvl_pei_peo_fpi_fpo = 0x10; /* OVLs = 1 */
pip->mkey_violations = cpu_to_be16(dev->mkey_violations); pip->mkey_violations = cpu_to_be16(dev->mkey_violations);
...@@ -491,6 +487,8 @@ static int recv_subn_set_portinfo(struct ib_smp *smp, ...@@ -491,6 +487,8 @@ static int recv_subn_set_portinfo(struct ib_smp *smp,
mtu = 2048; mtu = 2048;
break; break;
case IB_MTU_4096: case IB_MTU_4096:
if (!ipath_mtu4096)
goto err;
mtu = 4096; mtu = 4096;
break; break;
default: default:
......
...@@ -516,12 +516,12 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, ...@@ -516,12 +516,12 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
goto inval; goto inval;
/* /*
* Note: the chips support a maximum MTU of 4096, but the driver * don't allow invalid Path MTU values or greater than 2048
* hasn't implemented this feature yet, so don't allow Path MTU * unless we are configured for a 4KB MTU
* values greater than 2048.
*/ */
if (attr_mask & IB_QP_PATH_MTU) if ((attr_mask & IB_QP_PATH_MTU) &&
if (attr->path_mtu > IB_MTU_2048) (ib_mtu_enum_to_int(attr->path_mtu) == -1 ||
(attr->path_mtu > IB_MTU_2048 && !ipath_mtu4096)))
goto inval; goto inval;
if (attr_mask & IB_QP_PATH_MIG_STATE) if (attr_mask & IB_QP_PATH_MIG_STATE)
......
...@@ -1201,12 +1201,7 @@ static int ipath_query_port(struct ib_device *ibdev, ...@@ -1201,12 +1201,7 @@ static int ipath_query_port(struct ib_device *ibdev,
props->max_vl_num = 1; /* VLCap = VL0 */ props->max_vl_num = 1; /* VLCap = VL0 */
props->init_type_reply = 0; props->init_type_reply = 0;
/* props->max_mtu = ipath_mtu4096 ? IB_MTU_4096 : IB_MTU_2048;
* Note: the chip supports a maximum MTU of 4096, but the driver
* hasn't implemented this feature yet, so set the maximum value
* to 2048.
*/
props->max_mtu = IB_MTU_2048;
switch (dd->ipath_ibmtu) { switch (dd->ipath_ibmtu) {
case 4096: case 4096:
mtu = IB_MTU_4096; mtu = IB_MTU_4096;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment