]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qed/qede: Add UDP ports in bulletin board
authorChopra, Manish <Manish.Chopra@cavium.com>
Mon, 24 Apr 2017 17:00:48 +0000 (10:00 -0700)
committerChuck Anderson <chuck.anderson@oracle.com>
Tue, 19 Sep 2017 05:31:56 +0000 (22:31 -0700)
Orabug: 26783820

This patch adds support for UDP ports in bulletin board
to notify UDP ports change to the VFs

Signed-off-by: Manish Chopra <manish.chopra@cavium.com>
Signed-off-by: Yuval Mintz <yuval.mintz@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
[ Upstream commit 97379f15c21e7ae27eb1ecf84adcace42c960c87 ]
Signed-off-by: Somasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
drivers/net/ethernet/qlogic/qed/qed_l2.c
drivers/net/ethernet/qlogic/qed/qed_sriov.c
drivers/net/ethernet/qlogic/qed/qed_sriov.h
drivers/net/ethernet/qlogic/qed/qed_vf.c
drivers/net/ethernet/qlogic/qed/qed_vf.h
drivers/net/ethernet/qlogic/qede/qede.h
drivers/net/ethernet/qlogic/qede/qede_filter.c
drivers/net/ethernet/qlogic/qede/qede_main.c
include/linux/qed/qed_eth_if.h

index 6e22b8377cde16305c17336ed27081597691e261..ee9e7e2fa7ba152cdc64658c772e4ccc85d0da42 100644 (file)
@@ -2250,11 +2250,30 @@ static int qed_tunn_configure(struct qed_dev *cdev,
 
        for_each_hwfn(cdev, i) {
                struct qed_hwfn *hwfn = &cdev->hwfns[i];
+               struct qed_tunnel_info *tun;
+
+               tun = &hwfn->cdev->tunnel;
 
                rc = qed_sp_pf_update_tunn_cfg(hwfn, &tunn_info,
                                               QED_SPQ_MODE_EBLOCK, NULL);
                if (rc)
                        return rc;
+
+               if (IS_PF_SRIOV(hwfn)) {
+                       u16 vxlan_port, geneve_port;
+                       int j;
+
+                       vxlan_port = tun->vxlan_port.port;
+                       geneve_port = tun->geneve_port.port;
+
+                       qed_for_each_vf(hwfn, j) {
+                               qed_iov_bulletin_set_udp_ports(hwfn, j,
+                                                              vxlan_port,
+                                                              geneve_port);
+                       }
+
+                       qed_schedule_iov(hwfn, QED_IOV_WQ_BULLETIN_UPDATE_FLAG);
+               }
        }
 
        return 0;
index 0b71d51aa095a8321bcd0030386d68bf27059d82..f93cf75ec67bfedd40fbdf4053bc8cb18e7516d2 100644 (file)
@@ -3457,6 +3457,29 @@ static void qed_iov_bulletin_set_forced_vlan(struct qed_hwfn *p_hwfn,
        qed_iov_configure_vport_forced(p_hwfn, vf_info, feature);
 }
 
+void qed_iov_bulletin_set_udp_ports(struct qed_hwfn *p_hwfn,
+                                   int vfid, u16 vxlan_port, u16 geneve_port)
+{
+       struct qed_vf_info *vf_info;
+
+       vf_info = qed_iov_get_vf_info(p_hwfn, (u16)vfid, true);
+       if (!vf_info) {
+               DP_NOTICE(p_hwfn->cdev,
+                         "Can not set udp ports, invalid vfid [%d]\n", vfid);
+               return;
+       }
+
+       if (vf_info->b_malicious) {
+               DP_VERBOSE(p_hwfn, QED_MSG_IOV,
+                          "Can not set udp ports to malicious VF [%d]\n",
+                          vfid);
+               return;
+       }
+
+       vf_info->bulletin.p_virt->vxlan_udp_port = vxlan_port;
+       vf_info->bulletin.p_virt->geneve_udp_port = geneve_port;
+}
+
 static bool qed_iov_vf_has_vport_instance(struct qed_hwfn *p_hwfn, int vfid)
 {
        struct qed_vf_info *p_vf_info;
index e54ab1a26a3cd7fd822510a64af4fd473ebe61c6..526ae1c93fdfb30371f5fd42f8429856d3df89cd 100644 (file)
@@ -261,6 +261,9 @@ enum qed_iov_wq_flag {
  */
 u16 qed_iov_get_next_active_vf(struct qed_hwfn *p_hwfn, u16 rel_vf_id);
 
+void qed_iov_bulletin_set_udp_ports(struct qed_hwfn *p_hwfn,
+                                   int vfid, u16 vxlan_port, u16 geneve_port);
+
 /**
  * @brief Read sriov related information and allocated resources
  *  reads from configuraiton space, shmem, etc.
@@ -369,6 +372,12 @@ static inline u16 qed_iov_get_next_active_vf(struct qed_hwfn *p_hwfn,
        return MAX_NUM_VFS;
 }
 
+static inline void
+qed_iov_bulletin_set_udp_ports(struct qed_hwfn *p_hwfn, int vfid,
+                              u16 vxlan_port, u16 geneve_port)
+{
+}
+
 static inline int qed_iov_hw_info(struct qed_hwfn *p_hwfn)
 {
        return 0;
index 14c20e1c923772c9ca9cc97613edc81c9e9fb5c7..65bc30aa8592a0feeeefd13628a9a9d422b02b83 100644 (file)
@@ -1243,6 +1243,18 @@ static bool qed_vf_bulletin_get_forced_mac(struct qed_hwfn *hwfn,
        return true;
 }
 
+static void
+qed_vf_bulletin_get_udp_ports(struct qed_hwfn *p_hwfn,
+                             u16 *p_vxlan_port, u16 *p_geneve_port)
+{
+       struct qed_bulletin_content *p_bulletin;
+
+       p_bulletin = &p_hwfn->vf_iov_info->bulletin_shadow;
+
+       *p_vxlan_port = p_bulletin->vxlan_udp_port;
+       *p_geneve_port = p_bulletin->geneve_udp_port;
+}
+
 void qed_vf_get_fw_version(struct qed_hwfn *p_hwfn,
                           u16 *fw_major, u16 *fw_minor,
                           u16 *fw_rev, u16 *fw_eng)
@@ -1262,12 +1274,16 @@ static void qed_handle_bulletin_change(struct qed_hwfn *hwfn)
        struct qed_eth_cb_ops *ops = hwfn->cdev->protocol_ops.eth;
        u8 mac[ETH_ALEN], is_mac_exist, is_mac_forced;
        void *cookie = hwfn->cdev->ops_cookie;
+       u16 vxlan_port, geneve_port;
 
+       qed_vf_bulletin_get_udp_ports(hwfn, &vxlan_port, &geneve_port);
        is_mac_exist = qed_vf_bulletin_get_forced_mac(hwfn, mac,
                                                      &is_mac_forced);
        if (is_mac_exist && cookie)
                ops->force_mac(cookie, mac, !!is_mac_forced);
 
+       ops->ports_update(cookie, vxlan_port, geneve_port);
+
        /* Always update link configuration according to bulletin */
        qed_link_update(hwfn);
 }
index 105c0edd2a01eec6a2f6af0547551265838bd53f..6cca145331cdd77da8791c54d6cc0a561b971cb3 100644 (file)
@@ -513,7 +513,9 @@ struct qed_bulletin_content {
        u8 partner_rx_flow_ctrl_en;
        u8 partner_adv_pause;
        u8 sfp_tx_fault;
-       u8 padding4[6];
+       u16 vxlan_udp_port;
+       u16 geneve_udp_port;
+       u8 padding4[2];
 
        u32 speed;
        u32 partner_adv_speed;
index 48812d8f83a47d18500d3b941541d77203be3ad1..94c494e90cbaa11a1b8133fd7726c19b20dabe42 100644 (file)
@@ -449,6 +449,7 @@ irqreturn_t qede_msix_fp_int(int irq, void *fp_cookie);
 
 /* Filtering function definitions */
 void qede_force_mac(void *dev, u8 *mac, bool forced);
+void qede_udp_ports_update(void *dev, u16 vxlan_port, u16 geneve_port);
 int qede_set_mac_addr(struct net_device *ndev, void *p);
 
 int qede_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid);
index bdb46bad1e38451d2a2365539241889ec9c4583f..a3f08bb2ce6e7444ce292a91a98ff8e20bcee65f 100644 (file)
@@ -479,6 +479,17 @@ ret_unlock:
 }
 #endif
 
+void qede_udp_ports_update(void *dev, u16 vxlan_port, u16 geneve_port)
+{
+       struct qede_dev *edev = dev;
+
+       if (edev->vxlan_dst_port != vxlan_port)
+               edev->vxlan_dst_port = 0;
+
+       if (edev->geneve_dst_port != geneve_port)
+               edev->geneve_dst_port = 0;
+}
+
 void qede_force_mac(void *dev, u8 *mac, bool forced)
 {
        struct qede_dev *edev = dev;
index c1182201a6c4b28ecc0cd67c1c498fd04c276bd0..f64c12036b99ea17d0b52015d6a75ffb9d269b42 100644 (file)
@@ -226,6 +226,7 @@ static struct qed_eth_cb_ops qede_ll_ops = {
                .link_update = qede_link_update,
        },
        .force_mac = qede_force_mac,
+       .ports_update = qede_udp_ports_update,
 };
 
 static int qede_netdev_event(struct notifier_block *this, unsigned long event,
index 6f366d24faa849d519be2dde0dbe89c72c530061..16c339242523da61c09e4cc2303fdfc140c23045 100644 (file)
@@ -158,6 +158,7 @@ struct qed_tunn_params {
 struct qed_eth_cb_ops {
        struct qed_common_cb_ops common;
        void (*force_mac) (void *dev, u8 *mac, bool forced);
+       void (*ports_update)(void *dev, u16 vxlan_port, u16 geneve_port);
 };
 
 #define QED_MAX_PHC_DRIFT_PPB   291666666