|
@@ -1864,7 +1864,7 @@ static int process_responses(struct sge_rspq *rspq, int budget)
|
|
* for new buffer pointers, refill the Free List.
|
|
* for new buffer pointers, refill the Free List.
|
|
*/
|
|
*/
|
|
if (rspq->offset >= 0 &&
|
|
if (rspq->offset >= 0 &&
|
|
- rxq->fl.size - rxq->fl.avail >= 2*FL_PER_EQ_UNIT)
|
|
|
|
|
|
+ fl_cap(&rxq->fl) - rxq->fl.avail >= 2*FL_PER_EQ_UNIT)
|
|
__refill_fl(rspq->adapter, &rxq->fl);
|
|
__refill_fl(rspq->adapter, &rxq->fl);
|
|
return budget - budget_left;
|
|
return budget - budget_left;
|
|
}
|
|
}
|
|
@@ -2300,9 +2300,20 @@ int t4vf_sge_alloc_rxq(struct adapter *adapter, struct sge_rspq *rspq,
|
|
FW_IQ_CMD_FL0HOSTFCMODE_V(SGE_HOSTFCMODE_NONE) |
|
|
FW_IQ_CMD_FL0HOSTFCMODE_V(SGE_HOSTFCMODE_NONE) |
|
|
FW_IQ_CMD_FL0PACKEN_F |
|
|
FW_IQ_CMD_FL0PACKEN_F |
|
|
FW_IQ_CMD_FL0PADEN_F);
|
|
FW_IQ_CMD_FL0PADEN_F);
|
|
|
|
+
|
|
|
|
+ /* In T6, for egress queue type FL there is internal overhead
|
|
|
|
+ * of 16B for header going into FLM module. Hence the maximum
|
|
|
|
+ * allowed burst size is 448 bytes. For T4/T5, the hardware
|
|
|
|
+ * doesn't coalesce fetch requests if more than 64 bytes of
|
|
|
|
+ * Free List pointers are provided, so we use a 128-byte Fetch
|
|
|
|
+ * Burst Minimum there (T6 implements coalescing so we can use
|
|
|
|
+ * the smaller 64-byte value there).
|
|
|
|
+ */
|
|
cmd.fl0dcaen_to_fl0cidxfthresh =
|
|
cmd.fl0dcaen_to_fl0cidxfthresh =
|
|
cpu_to_be16(
|
|
cpu_to_be16(
|
|
- FW_IQ_CMD_FL0FBMIN_V(SGE_FETCHBURSTMIN_64B) |
|
|
|
|
|
|
+ FW_IQ_CMD_FL0FBMIN_V(chip <= CHELSIO_T5 ?
|
|
|
|
+ FETCHBURSTMIN_128B_X :
|
|
|
|
+ FETCHBURSTMIN_64B_X) |
|
|
FW_IQ_CMD_FL0FBMAX_V((chip <= CHELSIO_T5) ?
|
|
FW_IQ_CMD_FL0FBMAX_V((chip <= CHELSIO_T5) ?
|
|
FETCHBURSTMAX_512B_X :
|
|
FETCHBURSTMAX_512B_X :
|
|
FETCHBURSTMAX_256B_X));
|
|
FETCHBURSTMAX_256B_X));
|
|
@@ -2607,7 +2618,6 @@ int t4vf_sge_init(struct adapter *adapter)
|
|
u32 fl0 = sge_params->sge_fl_buffer_size[0];
|
|
u32 fl0 = sge_params->sge_fl_buffer_size[0];
|
|
u32 fl1 = sge_params->sge_fl_buffer_size[1];
|
|
u32 fl1 = sge_params->sge_fl_buffer_size[1];
|
|
struct sge *s = &adapter->sge;
|
|
struct sge *s = &adapter->sge;
|
|
- unsigned int ingpadboundary, ingpackboundary, ingpad_shift;
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
* Start by vetting the basic SGE parameters which have been set up by
|
|
* Start by vetting the basic SGE parameters which have been set up by
|
|
@@ -2619,7 +2629,8 @@ int t4vf_sge_init(struct adapter *adapter)
|
|
fl0, fl1);
|
|
fl0, fl1);
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
- if ((sge_params->sge_control & RXPKTCPLMODE_F) == 0) {
|
|
|
|
|
|
+ if ((sge_params->sge_control & RXPKTCPLMODE_F) !=
|
|
|
|
+ RXPKTCPLMODE_V(RXPKTCPLMODE_SPLIT_X)) {
|
|
dev_err(adapter->pdev_dev, "bad SGE CPL MODE\n");
|
|
dev_err(adapter->pdev_dev, "bad SGE CPL MODE\n");
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
@@ -2632,41 +2643,7 @@ int t4vf_sge_init(struct adapter *adapter)
|
|
s->stat_len = ((sge_params->sge_control & EGRSTATUSPAGESIZE_F)
|
|
s->stat_len = ((sge_params->sge_control & EGRSTATUSPAGESIZE_F)
|
|
? 128 : 64);
|
|
? 128 : 64);
|
|
s->pktshift = PKTSHIFT_G(sge_params->sge_control);
|
|
s->pktshift = PKTSHIFT_G(sge_params->sge_control);
|
|
-
|
|
|
|
- /* T4 uses a single control field to specify both the PCIe Padding and
|
|
|
|
- * Packing Boundary. T5 introduced the ability to specify these
|
|
|
|
- * separately. The actual Ingress Packet Data alignment boundary
|
|
|
|
- * within Packed Buffer Mode is the maximum of these two
|
|
|
|
- * specifications. (Note that it makes no real practical sense to
|
|
|
|
- * have the Pading Boudary be larger than the Packing Boundary but you
|
|
|
|
- * could set the chip up that way and, in fact, legacy T4 code would
|
|
|
|
- * end doing this because it would initialize the Padding Boundary and
|
|
|
|
- * leave the Packing Boundary initialized to 0 (16 bytes).)
|
|
|
|
- * Padding Boundary values in T6 starts from 8B,
|
|
|
|
- * where as it is 32B for T4 and T5.
|
|
|
|
- */
|
|
|
|
- if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5)
|
|
|
|
- ingpad_shift = INGPADBOUNDARY_SHIFT_X;
|
|
|
|
- else
|
|
|
|
- ingpad_shift = T6_INGPADBOUNDARY_SHIFT_X;
|
|
|
|
-
|
|
|
|
- ingpadboundary = 1 << (INGPADBOUNDARY_G(sge_params->sge_control) +
|
|
|
|
- ingpad_shift);
|
|
|
|
- if (is_t4(adapter->params.chip)) {
|
|
|
|
- s->fl_align = ingpadboundary;
|
|
|
|
- } else {
|
|
|
|
- /* T5 has a different interpretation of one of the PCIe Packing
|
|
|
|
- * Boundary values.
|
|
|
|
- */
|
|
|
|
- ingpackboundary = INGPACKBOUNDARY_G(sge_params->sge_control2);
|
|
|
|
- if (ingpackboundary == INGPACKBOUNDARY_16B_X)
|
|
|
|
- ingpackboundary = 16;
|
|
|
|
- else
|
|
|
|
- ingpackboundary = 1 << (ingpackboundary +
|
|
|
|
- INGPACKBOUNDARY_SHIFT_X);
|
|
|
|
-
|
|
|
|
- s->fl_align = max(ingpadboundary, ingpackboundary);
|
|
|
|
- }
|
|
|
|
|
|
+ s->fl_align = t4vf_fl_pkt_align(adapter);
|
|
|
|
|
|
/* A FL with <= fl_starve_thres buffers is starving and a periodic
|
|
/* A FL with <= fl_starve_thres buffers is starving and a periodic
|
|
* timer will attempt to refill it. This needs to be larger than the
|
|
* timer will attempt to refill it. This needs to be larger than the
|