qed: VF XDP support
authorMintz, Yuval <Yuval.Mintz@cavium.com>
Sun, 4 Jun 2017 10:31:08 +0000 (13:31 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 5 Jun 2017 03:08:31 +0000 (23:08 -0400)
The final addition on the qed front -
 - VFs would now require their PFs to provide multiple CIDs
 - Based on the availability of connections from PF, determine whether
   XDP is feasible and share it with qede via dev_info.

Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qed/qed_l2.c
drivers/net/ethernet/qlogic/qed/qed_vf.c
drivers/net/ethernet/qlogic/qed/qed_vf.h
include/linux/qed/qed_eth_if.h

index cffa8e7e539b1c1b9acf6df9626c24f62843d0c8..cb8b05dbfc6e18a649fbbb88247b2f8f47fe48b9 100644 (file)
@@ -2119,15 +2119,26 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev,
 
                ether_addr_copy(info->port_mac,
                                cdev->hwfns[0].hw_info.hw_mac_addr);
+
+               info->xdp_supported = true;
        } else {
-               qed_vf_get_num_rxqs(QED_LEADING_HWFN(cdev), &info->num_queues);
-               if (cdev->num_hwfns > 1) {
-                       u8 queues = 0;
+               u16 total_cids = 0;
+
+               /* Determine queues &  XDP support */
+               for_each_hwfn(cdev, i) {
+                       struct qed_hwfn *p_hwfn = &cdev->hwfns[i];
+                       u8 queues, cids;
 
-                       qed_vf_get_num_rxqs(&cdev->hwfns[1], &queues);
+                       qed_vf_get_num_cids(p_hwfn, &cids);
+                       qed_vf_get_num_rxqs(p_hwfn, &queues);
                        info->num_queues += queues;
+                       total_cids += cids;
                }
 
+               /* Enable VF XDP in case PF guarntees sufficient connections */
+               if (total_cids >= info->num_queues * 3)
+                       info->xdp_supported = true;
+
                qed_vf_get_num_vlan_filters(&cdev->hwfns[0],
                                            (u8 *)&info->num_vlan_filters);
                qed_vf_get_num_mac_filters(&cdev->hwfns[0],
index cb81c357bf6259c58a74d17a0a1d2f15c96bf3d6..1926d1ed439fab471a0f12f1d6cae435c0313896 100644 (file)
@@ -291,9 +291,11 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn)
        req->vfdev_info.capabilities |= VFPF_ACQUIRE_CAP_100G;
 
        /* If we've mapped the doorbell bar, try using queue qids */
-       if (p_iov->b_doorbell_bar)
+       if (p_iov->b_doorbell_bar) {
                req->vfdev_info.capabilities |= VFPF_ACQUIRE_CAP_PHYSICAL_BAR |
                                                VFPF_ACQUIRE_CAP_QUEUE_QIDS;
+               p_resc->num_cids = QED_ETH_VF_MAX_NUM_CIDS;
+       }
 
        /* pf 2 vf bulletin board address */
        req->bulletin_addr = p_iov->bulletin.phys;
@@ -884,8 +886,8 @@ qed_vf_pf_txq_start(struct qed_hwfn *p_hwfn,
        }
 
        DP_VERBOSE(p_hwfn, QED_MSG_IOV,
-                  "Txq[0x%02x]: doorbell at %p [offset 0x%08x]\n",
-                  qid, *pp_doorbell, resp->offset);
+                  "Txq[0x%02x.%02x]: doorbell at %p [offset 0x%08x]\n",
+                  qid, p_cid->qid_usage_idx, *pp_doorbell, resp->offset);
 exit:
        qed_vf_pf_req_end(p_hwfn, rc);
 
@@ -1478,6 +1480,11 @@ void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs)
        *num_txqs = p_hwfn->vf_iov_info->acquire_resp.resc.num_txqs;
 }
 
+void qed_vf_get_num_cids(struct qed_hwfn *p_hwfn, u8 *num_cids)
+{
+       *num_cids = p_hwfn->vf_iov_info->acquire_resp.resc.num_cids;
+}
+
 void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac)
 {
        memcpy(port_mac,
index b8ce4bef8c9406bfdfe80cfbed5e98555c3e6fd1..b65bbc54a097937b0539eb8331c25edb5a0577d9 100644 (file)
@@ -731,6 +731,14 @@ void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs);
  */
 void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs);
 
+/**
+ * @brief Get number of available connections [both Rx and Tx] for VF
+ *
+ * @param p_hwfn
+ * @param num_cids - allocated number of connections
+ */
+void qed_vf_get_num_cids(struct qed_hwfn *p_hwfn, u8 *num_cids);
+
 /**
  * @brief Get port mac address for VF
  *
@@ -1010,6 +1018,10 @@ static inline void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs)
 {
 }
 
+static inline void qed_vf_get_num_cids(struct qed_hwfn *p_hwfn, u8 *num_cids)
+{
+}
+
 static inline void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac)
 {
 }
index fd72056f8d493cae8d6f0599b7674f4b572a5f39..0eef0a2b1901e6ba672a63a37c9242d4d6ee8b44 100644 (file)
@@ -73,6 +73,9 @@ struct qed_dev_eth_info {
 
        /* Legacy VF - this affects the datapath, so qede has to know */
        bool is_legacy;
+
+       /* Might depend on available resources [in case of VF] */
+       bool xdp_supported;
 };
 
 struct qed_update_vport_rss_params {