|
@@ -1820,11 +1820,34 @@ static noinline int handle_trace_pkt(struct adapter *adap,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * cxgb4_sgetim_to_hwtstamp - convert sge time stamp to hw time stamp
|
|
|
|
+ * @adap: the adapter
|
|
|
|
+ * @hwtstamps: time stamp structure to update
|
|
|
|
+ * @sgetstamp: 60bit iqe timestamp
|
|
|
|
+ *
|
|
|
|
+ * Every ingress queue entry has the 60-bit timestamp, convert that timestamp
|
|
|
|
+ * which is in Core Clock ticks into ktime_t and assign it
|
|
|
|
+ **/
|
|
|
|
+static void cxgb4_sgetim_to_hwtstamp(struct adapter *adap,
|
|
|
|
+ struct skb_shared_hwtstamps *hwtstamps,
|
|
|
|
+ u64 sgetstamp)
|
|
|
|
+{
|
|
|
|
+ u64 ns;
|
|
|
|
+ u64 tmp = (sgetstamp * 1000 * 1000 + adap->params.vpd.cclk / 2);
|
|
|
|
+
|
|
|
|
+ ns = div_u64(tmp, adap->params.vpd.cclk);
|
|
|
|
+
|
|
|
|
+ memset(hwtstamps, 0, sizeof(*hwtstamps));
|
|
|
|
+ hwtstamps->hwtstamp = ns_to_ktime(ns);
|
|
|
|
+}
|
|
|
|
+
|
|
static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
|
|
static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
|
|
const struct cpl_rx_pkt *pkt)
|
|
const struct cpl_rx_pkt *pkt)
|
|
{
|
|
{
|
|
struct adapter *adapter = rxq->rspq.adap;
|
|
struct adapter *adapter = rxq->rspq.adap;
|
|
struct sge *s = &adapter->sge;
|
|
struct sge *s = &adapter->sge;
|
|
|
|
+ struct port_info *pi;
|
|
int ret;
|
|
int ret;
|
|
struct sk_buff *skb;
|
|
struct sk_buff *skb;
|
|
|
|
|
|
@@ -1842,6 +1865,10 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
skb_record_rx_queue(skb, rxq->rspq.idx);
|
|
skb_record_rx_queue(skb, rxq->rspq.idx);
|
|
skb_mark_napi_id(skb, &rxq->rspq.napi);
|
|
skb_mark_napi_id(skb, &rxq->rspq.napi);
|
|
|
|
+ pi = netdev_priv(skb->dev);
|
|
|
|
+ if (pi->rxtstamp)
|
|
|
|
+ cxgb4_sgetim_to_hwtstamp(adapter, skb_hwtstamps(skb),
|
|
|
|
+ gl->sgetstamp);
|
|
if (rxq->rspq.netdev->features & NETIF_F_RXHASH)
|
|
if (rxq->rspq.netdev->features & NETIF_F_RXHASH)
|
|
skb_set_hash(skb, (__force u32)pkt->rsshdr.hash_val,
|
|
skb_set_hash(skb, (__force u32)pkt->rsshdr.hash_val,
|
|
PKT_HASH_TYPE_L3);
|
|
PKT_HASH_TYPE_L3);
|
|
@@ -1877,9 +1904,7 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
|
|
struct sge *s = &q->adap->sge;
|
|
struct sge *s = &q->adap->sge;
|
|
int cpl_trace_pkt = is_t4(q->adap->params.chip) ?
|
|
int cpl_trace_pkt = is_t4(q->adap->params.chip) ?
|
|
CPL_TRACE_PKT : CPL_TRACE_PKT_T5;
|
|
CPL_TRACE_PKT : CPL_TRACE_PKT_T5;
|
|
-#ifdef CONFIG_CHELSIO_T4_FCOE
|
|
|
|
struct port_info *pi;
|
|
struct port_info *pi;
|
|
-#endif
|
|
|
|
|
|
|
|
if (unlikely(*(u8 *)rsp == cpl_trace_pkt))
|
|
if (unlikely(*(u8 *)rsp == cpl_trace_pkt))
|
|
return handle_trace_pkt(q->adap, si);
|
|
return handle_trace_pkt(q->adap, si);
|
|
@@ -1910,6 +1935,10 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
|
|
|
|
|
|
rxq->stats.pkts++;
|
|
rxq->stats.pkts++;
|
|
|
|
|
|
|
|
+ pi = netdev_priv(skb->dev);
|
|
|
|
+ if (pi->rxtstamp)
|
|
|
|
+ cxgb4_sgetim_to_hwtstamp(q->adap, skb_hwtstamps(skb),
|
|
|
|
+ si->sgetstamp);
|
|
if (csum_ok && (pkt->l2info & htonl(RXF_UDP_F | RXF_TCP_F))) {
|
|
if (csum_ok && (pkt->l2info & htonl(RXF_UDP_F | RXF_TCP_F))) {
|
|
if (!pkt->ip_frag) {
|
|
if (!pkt->ip_frag) {
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
@@ -1926,7 +1955,6 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
|
|
#define CPL_RX_PKT_FLAGS (RXF_PSH_F | RXF_SYN_F | RXF_UDP_F | \
|
|
#define CPL_RX_PKT_FLAGS (RXF_PSH_F | RXF_SYN_F | RXF_UDP_F | \
|
|
RXF_TCP_F | RXF_IP_F | RXF_IP6_F | RXF_LRO_F)
|
|
RXF_TCP_F | RXF_IP_F | RXF_IP6_F | RXF_LRO_F)
|
|
|
|
|
|
- pi = netdev_priv(skb->dev);
|
|
|
|
if (!(pkt->l2info & cpu_to_be32(CPL_RX_PKT_FLAGS))) {
|
|
if (!(pkt->l2info & cpu_to_be32(CPL_RX_PKT_FLAGS))) {
|
|
if ((pkt->l2info & cpu_to_be32(RXF_FCOE_F)) &&
|
|
if ((pkt->l2info & cpu_to_be32(RXF_FCOE_F)) &&
|
|
(pi->fcoe.flags & CXGB_FCOE_ENABLED)) {
|
|
(pi->fcoe.flags & CXGB_FCOE_ENABLED)) {
|
|
@@ -2067,6 +2095,8 @@ static int process_responses(struct sge_rspq *q, int budget)
|
|
unmap_rx_buf(q->adap, &rxq->fl);
|
|
unmap_rx_buf(q->adap, &rxq->fl);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ si.sgetstamp = SGE_TIMESTAMP_G(
|
|
|
|
+ be64_to_cpu(rc->last_flit));
|
|
/*
|
|
/*
|
|
* Last buffer remains mapped so explicitly make it
|
|
* Last buffer remains mapped so explicitly make it
|
|
* coherent for CPU access.
|
|
* coherent for CPU access.
|