Author: np
Date: Wed May 18 22:09:04 2011
New Revision: 222085
URL: http://svn.freebsd.org/changeset/base/222085

Log:
  - Enable per-channel congestion notification.
  - Enable PCIe relaxed ordering for all egress queues and rx data buffers.
  
  MFC after:    3 days

Modified:
  head/sys/dev/cxgbe/t4_main.c
  head/sys/dev/cxgbe/t4_sge.c

Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c        Wed May 18 21:06:20 2011        
(r222084)
+++ head/sys/dev/cxgbe/t4_main.c        Wed May 18 22:09:04 2011        
(r222085)
@@ -366,7 +366,13 @@ t4_attach(device_t dev)
        sc->mbox = sc->pf;
 
        pci_enable_busmaster(dev);
-       pci_set_max_read_req(dev, 4096);
+       if (pci_find_cap(dev, PCIY_EXPRESS, &i) == 0) {
+               pci_set_max_read_req(dev, 4096);
+               v = pci_read_config(dev, i + PCIR_EXPRESS_DEVICE_CTL, 2);
+               v |= PCIM_EXP_CTL_RELAXED_ORD_ENABLE;
+               pci_write_config(dev, i + PCIR_EXPRESS_DEVICE_CTL, v, 2);
+       }
+
        snprintf(sc->lockname, sizeof(sc->lockname), "%s",
            device_get_nameunit(dev));
        mtx_init(&sc->sc_lock, sc->lockname, 0, MTX_DEF);
@@ -3206,6 +3212,7 @@ filter_rpl(struct adapter *sc, const str
        }
 }
 
+/* XXX: use pci_find_cap */
 int
 t4_os_find_pci_capability(struct adapter *sc, int cap)
 {

Modified: head/sys/dev/cxgbe/t4_sge.c
==============================================================================
--- head/sys/dev/cxgbe/t4_sge.c Wed May 18 21:06:20 2011        (r222084)
+++ head/sys/dev/cxgbe/t4_sge.c Wed May 18 22:09:04 2011        (r222085)
@@ -100,7 +100,7 @@ static int alloc_ring(struct adapter *, 
 static int free_ring(struct adapter *, bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
     void *);
 static int alloc_iq_fl(struct port_info *, struct sge_iq *, struct sge_fl *,
-    int);
+    int, int);
 static int free_iq_fl(struct port_info *, struct sge_iq *, struct sge_fl *);
 static int alloc_iq(struct sge_iq *, int);
 static int free_iq(struct sge_iq *);
@@ -1104,7 +1104,7 @@ free_ring(struct adapter *sc, bus_dma_ta
  */
 static int
 alloc_iq_fl(struct port_info *pi, struct sge_iq *iq, struct sge_fl *fl,
-    int intr_idx)
+    int intr_idx, int cong)
 {
        int rc, i, cntxt_id;
        size_t len;
@@ -1155,6 +1155,8 @@ alloc_iq_fl(struct port_info *pi, struct
            V_FW_IQ_CMD_IQESIZE(ilog2(iq->esize) - 4));
        c.iqsize = htobe16(iq->qsize);
        c.iqaddr = htobe64(iq->ba);
+       if (cong >= 0)
+               c.iqns_to_fl0congen = htobe32(F_FW_IQ_CMD_IQFLINTCONGEN);
 
        if (fl) {
                mtx_init(&fl->fl_lock, fl->lockname, NULL, MTX_DEF);
@@ -1198,7 +1200,15 @@ alloc_iq_fl(struct port_info *pi, struct
                fl->needed = fl->cap;
 
                c.iqns_to_fl0congen =
-                   htobe32(V_FW_IQ_CMD_FL0HOSTFCMODE(X_HOSTFCMODE_NONE));
+                   htobe32(V_FW_IQ_CMD_FL0HOSTFCMODE(X_HOSTFCMODE_NONE) |
+                       F_FW_IQ_CMD_FL0FETCHRO | F_FW_IQ_CMD_FL0DATARO |
+                       F_FW_IQ_CMD_FL0PADEN);
+               if (cong >= 0) {
+                       c.iqns_to_fl0congen |=
+                               htobe32(V_FW_IQ_CMD_FL0CNGCHMAP(cong) |
+                                   F_FW_IQ_CMD_FL0CONGCIF |
+                                   F_FW_IQ_CMD_FL0CONGEN);
+               }
                c.fl0dcaen_to_fl0cidxfthresh =
                    htobe16(V_FW_IQ_CMD_FL0FBMIN(X_FETCHBURSTMIN_64B) |
                        V_FW_IQ_CMD_FL0FBMAX(X_FETCHBURSTMAX_512B));
@@ -1325,7 +1335,7 @@ free_iq_fl(struct port_info *pi, struct 
 static int
 alloc_iq(struct sge_iq *iq, int intr_idx)
 {
-       return alloc_iq_fl(NULL, iq, NULL, intr_idx);
+       return alloc_iq_fl(NULL, iq, NULL, intr_idx, -1);
 }
 
 static int
@@ -1342,7 +1352,7 @@ alloc_rxq(struct port_info *pi, struct s
        struct sysctl_oid_list *children;
        char name[16];
 
-       rc = alloc_iq_fl(pi, &rxq->iq, &rxq->fl, intr_idx);
+       rc = alloc_iq_fl(pi, &rxq->iq, &rxq->fl, intr_idx, 1 << pi->tx_chan);
        if (rc != 0)
                return (rc);
 
@@ -1436,7 +1446,7 @@ alloc_ctrlq(struct adapter *sc, struct s
        c.physeqid_pkd = htobe32(0);
        c.fetchszm_to_iqid =
            htobe32(V_FW_EQ_CTRL_CMD_HOSTFCMODE(X_HOSTFCMODE_STATUS_PAGE) |
-               V_FW_EQ_CTRL_CMD_PCIECHN(idx) |
+               V_FW_EQ_CTRL_CMD_PCIECHN(idx) | F_FW_EQ_CTRL_CMD_FETCHRO |
                V_FW_EQ_CTRL_CMD_IQID(eq->iqid));
        c.dcaen_to_eqsize =
            htobe32(V_FW_EQ_CTRL_CMD_FBMIN(X_FETCHBURSTMIN_64B) |
@@ -1561,7 +1571,7 @@ alloc_txq(struct port_info *pi, struct s
        c.viid_pkd = htobe32(V_FW_EQ_ETH_CMD_VIID(pi->viid));
        c.fetchszm_to_iqid =
            htobe32(V_FW_EQ_ETH_CMD_HOSTFCMODE(X_HOSTFCMODE_STATUS_PAGE) |
-               V_FW_EQ_ETH_CMD_PCIECHN(pi->tx_chan) |
+               V_FW_EQ_ETH_CMD_PCIECHN(pi->tx_chan) | F_FW_EQ_ETH_CMD_FETCHRO |
                V_FW_EQ_ETH_CMD_IQID(eq->iqid));
        c.dcaen_to_eqsize = htobe32(V_FW_EQ_ETH_CMD_FBMIN(X_FETCHBURSTMIN_64B) |
                      V_FW_EQ_ETH_CMD_FBMAX(X_FETCHBURSTMAX_512B) |
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to