Commit 211a84e3 authored by Anish Bhatt's avatar Anish Bhatt Committed by David S. Miller

cxgb4i : Call into recently added cxgb4 ipv6 api

Get a reference on every ipv6 address we offload to hardware so that it cannot
be prematurely cleared out before cleanup.
Signed-off-by: default avatarAnish Bhatt <anish@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b5a02f50
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "t4fw_api.h" #include "t4fw_api.h"
#include "l2t.h" #include "l2t.h"
#include "cxgb4i.h" #include "cxgb4i.h"
#include "clip_tbl.h"
static unsigned int dbg_level; static unsigned int dbg_level;
...@@ -1322,6 +1323,9 @@ static inline void l2t_put(struct cxgbi_sock *csk) ...@@ -1322,6 +1323,9 @@ static inline void l2t_put(struct cxgbi_sock *csk)
static void release_offload_resources(struct cxgbi_sock *csk) static void release_offload_resources(struct cxgbi_sock *csk)
{ {
struct cxgb4_lld_info *lldi; struct cxgb4_lld_info *lldi;
#if IS_ENABLED(CONFIG_IPV6)
struct net_device *ndev = csk->cdev->ports[csk->port_id];
#endif
log_debug(1 << CXGBI_DBG_TOE | 1 << CXGBI_DBG_SOCK, log_debug(1 << CXGBI_DBG_TOE | 1 << CXGBI_DBG_SOCK,
"csk 0x%p,%u,0x%lx,%u.\n", "csk 0x%p,%u,0x%lx,%u.\n",
...@@ -1334,6 +1338,12 @@ static void release_offload_resources(struct cxgbi_sock *csk) ...@@ -1334,6 +1338,12 @@ static void release_offload_resources(struct cxgbi_sock *csk)
} }
l2t_put(csk); l2t_put(csk);
#if IS_ENABLED(CONFIG_IPV6)
if (csk->csk_family == AF_INET6)
cxgb4_clip_release(ndev,
(const u32 *)&csk->saddr6.sin6_addr, 1);
#endif
if (cxgbi_sock_flag(csk, CTPF_HAS_ATID)) if (cxgbi_sock_flag(csk, CTPF_HAS_ATID))
free_atid(csk); free_atid(csk);
else if (cxgbi_sock_flag(csk, CTPF_HAS_TID)) { else if (cxgbi_sock_flag(csk, CTPF_HAS_TID)) {
...@@ -1391,10 +1401,15 @@ static int init_act_open(struct cxgbi_sock *csk) ...@@ -1391,10 +1401,15 @@ static int init_act_open(struct cxgbi_sock *csk)
csk->l2t = cxgb4_l2t_get(lldi->l2t, n, ndev, 0); csk->l2t = cxgb4_l2t_get(lldi->l2t, n, ndev, 0);
if (!csk->l2t) { if (!csk->l2t) {
pr_err("%s, cannot alloc l2t.\n", ndev->name); pr_err("%s, cannot alloc l2t.\n", ndev->name);
goto rel_resource; goto rel_resource_without_clip;
} }
cxgbi_sock_get(csk); cxgbi_sock_get(csk);
#if IS_ENABLED(CONFIG_IPV6)
if (csk->csk_family == AF_INET6)
cxgb4_clip_get(ndev, (const u32 *)&csk->saddr6.sin6_addr, 1);
#endif
if (t4) { if (t4) {
size = sizeof(struct cpl_act_open_req); size = sizeof(struct cpl_act_open_req);
size6 = sizeof(struct cpl_act_open_req6); size6 = sizeof(struct cpl_act_open_req6);
...@@ -1451,6 +1466,12 @@ static int init_act_open(struct cxgbi_sock *csk) ...@@ -1451,6 +1466,12 @@ static int init_act_open(struct cxgbi_sock *csk)
return 0; return 0;
rel_resource: rel_resource:
#if IS_ENABLED(CONFIG_IPV6)
if (csk->csk_family == AF_INET6)
cxgb4_clip_release(ndev,
(const u32 *)&csk->saddr6.sin6_addr, 1);
#endif
rel_resource_without_clip:
if (n) if (n)
neigh_release(n); neigh_release(n);
if (skb) if (skb)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment