Skip to content

Commit b18e170

Browse files
Manish Chopradavem330
authored andcommitted
qed/qede: Add VXLAN tunnel slowpath configuration support
This patch enables VXLAN tunnel on the adapter and add support for driver hooks to configure UDP ports for VXLAN tunnel offload to be performed by the adapter. Signed-off-by: Manish Chopra <manish.chopra@qlogic.com> Signed-off-by: Yuval Mintz <Yuval.Mintz@qlogic.com> Signed-off-by: Ariel Elior <Ariel.Elior@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 464f664 commit b18e170

File tree

5 files changed

+86
-4
lines changed

5 files changed

+86
-4
lines changed

drivers/net/ethernet/qlogic/Kconfig

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,15 @@ config QEDE
103103
depends on QED
104104
---help---
105105
This enables the support for ...
106+
107+
config QEDE_VXLAN
108+
bool "Virtual eXtensible Local Area Network support"
109+
default n
110+
depends on QEDE && VXLAN && !(QEDE=y && VXLAN=m)
111+
---help---
112+
This enables hardware offload support for VXLAN protocol over
113+
qede module. Say Y here if you want to enable hardware offload
114+
support for Virtual eXtensible Local Area Network (VXLAN)
115+
in the driver.
116+
106117
endif # NET_VENDOR_QLOGIC

drivers/net/ethernet/qlogic/qed/qed_main.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,7 @@ static void qed_update_pf_params(struct qed_dev *cdev,
744744
static int qed_slowpath_start(struct qed_dev *cdev,
745745
struct qed_slowpath_params *params)
746746
{
747+
struct qed_tunn_start_params tunn_info;
747748
struct qed_mcp_drv_version drv_version;
748749
const u8 *data = NULL;
749750
struct qed_hwfn *hwfn;
@@ -776,7 +777,12 @@ static int qed_slowpath_start(struct qed_dev *cdev,
776777
/* Start the slowpath */
777778
data = cdev->firmware->data;
778779

779-
rc = qed_hw_init(cdev, NULL, true, cdev->int_params.out.int_mode,
780+
memset(&tunn_info, 0, sizeof(tunn_info));
781+
tunn_info.tunn_mode |= 1 << QED_MODE_VXLAN_TUNN;
782+
tunn_info.tunn_clss_vxlan = QED_TUNN_CLSS_MAC_VLAN;
783+
784+
rc = qed_hw_init(cdev, &tunn_info, true,
785+
cdev->int_params.out.int_mode,
780786
true, data);
781787
if (rc)
782788
goto err2;

drivers/net/ethernet/qlogic/qed/qed_sp_commands.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,8 @@ int qed_sp_pf_start(struct qed_hwfn *p_hwfn,
353353
DMA_REGPAIR_LE(p_ramrod->consolid_q_pbl_addr,
354354
p_hwfn->p_consq->chain.pbl.p_phys_table);
355355

356-
qed_tunn_set_pf_start_params(p_hwfn, NULL, NULL);
356+
qed_tunn_set_pf_start_params(p_hwfn, p_tunn,
357+
&p_ramrod->tunnel_config);
357358
p_hwfn->hw_info.personality = PERSONALITY_ETH;
358359

359360
DP_VERBOSE(p_hwfn, QED_MSG_SPQ,

drivers/net/ethernet/qlogic/qede/qede.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ struct qede_dev {
169169
bool accept_any_vlan;
170170
struct delayed_work sp_task;
171171
unsigned long sp_flags;
172+
u16 vxlan_dst_port;
172173
};
173174

174175
enum QEDE_STATE {
@@ -289,7 +290,8 @@ struct qede_fastpath {
289290
#define QEDE_CSUM_ERROR BIT(0)
290291
#define QEDE_CSUM_UNNECESSARY BIT(1)
291292

292-
#define QEDE_SP_RX_MODE 1
293+
#define QEDE_SP_RX_MODE 1
294+
#define QEDE_SP_VXLAN_PORT_CONFIG 2
293295

294296
union qede_reload_args {
295297
u16 mtu;

drivers/net/ethernet/qlogic/qede/qede_main.c

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
#include <linux/netdev_features.h>
2525
#include <linux/udp.h>
2626
#include <linux/tcp.h>
27+
#ifdef CONFIG_QEDE_VXLAN
2728
#include <net/vxlan.h>
29+
#endif
2830
#include <linux/ip.h>
2931
#include <net/ipv6.h>
3032
#include <net/tcp.h>
@@ -1821,6 +1823,42 @@ static void qede_vlan_mark_nonconfigured(struct qede_dev *edev)
18211823
edev->accept_any_vlan = false;
18221824
}
18231825

1826+
#ifdef CONFIG_QEDE_VXLAN
1827+
static void qede_add_vxlan_port(struct net_device *dev,
1828+
sa_family_t sa_family, __be16 port)
1829+
{
1830+
struct qede_dev *edev = netdev_priv(dev);
1831+
u16 t_port = ntohs(port);
1832+
1833+
if (edev->vxlan_dst_port)
1834+
return;
1835+
1836+
edev->vxlan_dst_port = t_port;
1837+
1838+
DP_VERBOSE(edev, QED_MSG_DEBUG, "Added vxlan port=%d", t_port);
1839+
1840+
set_bit(QEDE_SP_VXLAN_PORT_CONFIG, &edev->sp_flags);
1841+
schedule_delayed_work(&edev->sp_task, 0);
1842+
}
1843+
1844+
static void qede_del_vxlan_port(struct net_device *dev,
1845+
sa_family_t sa_family, __be16 port)
1846+
{
1847+
struct qede_dev *edev = netdev_priv(dev);
1848+
u16 t_port = ntohs(port);
1849+
1850+
if (t_port != edev->vxlan_dst_port)
1851+
return;
1852+
1853+
edev->vxlan_dst_port = 0;
1854+
1855+
DP_VERBOSE(edev, QED_MSG_DEBUG, "Deleted vxlan port=%d", t_port);
1856+
1857+
set_bit(QEDE_SP_VXLAN_PORT_CONFIG, &edev->sp_flags);
1858+
schedule_delayed_work(&edev->sp_task, 0);
1859+
}
1860+
#endif
1861+
18241862
static const struct net_device_ops qede_netdev_ops = {
18251863
.ndo_open = qede_open,
18261864
.ndo_stop = qede_close,
@@ -1832,6 +1870,10 @@ static const struct net_device_ops qede_netdev_ops = {
18321870
.ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid,
18331871
.ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid,
18341872
.ndo_get_stats64 = qede_get_stats64,
1873+
#ifdef CONFIG_QEDE_VXLAN
1874+
.ndo_add_vxlan_port = qede_add_vxlan_port,
1875+
.ndo_del_vxlan_port = qede_del_vxlan_port,
1876+
#endif
18351877
};
18361878

18371879
/* -------------------------------------------------------------------------
@@ -2004,13 +2046,24 @@ static void qede_sp_task(struct work_struct *work)
20042046
{
20052047
struct qede_dev *edev = container_of(work, struct qede_dev,
20062048
sp_task.work);
2049+
struct qed_dev *cdev = edev->cdev;
2050+
20072051
mutex_lock(&edev->qede_lock);
20082052

20092053
if (edev->state == QEDE_STATE_OPEN) {
20102054
if (test_and_clear_bit(QEDE_SP_RX_MODE, &edev->sp_flags))
20112055
qede_config_rx_mode(edev->ndev);
20122056
}
20132057

2058+
if (test_and_clear_bit(QEDE_SP_VXLAN_PORT_CONFIG, &edev->sp_flags)) {
2059+
struct qed_tunn_params tunn_params;
2060+
2061+
memset(&tunn_params, 0, sizeof(tunn_params));
2062+
tunn_params.update_vxlan_port = 1;
2063+
tunn_params.vxlan_port = edev->vxlan_dst_port;
2064+
qed_ops->tunn_config(cdev, &tunn_params);
2065+
}
2066+
20142067
mutex_unlock(&edev->qede_lock);
20152068
}
20162069

@@ -3149,12 +3202,21 @@ void qede_reload(struct qede_dev *edev,
31493202
static int qede_open(struct net_device *ndev)
31503203
{
31513204
struct qede_dev *edev = netdev_priv(ndev);
3205+
int rc;
31523206

31533207
netif_carrier_off(ndev);
31543208

31553209
edev->ops->common->set_power_state(edev->cdev, PCI_D0);
31563210

3157-
return qede_load(edev, QEDE_LOAD_NORMAL);
3211+
rc = qede_load(edev, QEDE_LOAD_NORMAL);
3212+
3213+
if (rc)
3214+
return rc;
3215+
3216+
#ifdef CONFIG_QEDE_VXLAN
3217+
vxlan_get_rx_port(ndev);
3218+
#endif
3219+
return 0;
31583220
}
31593221

31603222
static int qede_close(struct net_device *ndev)

0 commit comments

Comments
 (0)