diff options
Diffstat (limited to 'drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c')
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 6de054404156..803d91beec6f 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
@@ -1140,6 +1140,10 @@ static int set_filter_wr(struct adapter *adapter, int fidx) | |||
1140 | struct fw_filter_wr *fwr; | 1140 | struct fw_filter_wr *fwr; |
1141 | unsigned int ftid; | 1141 | unsigned int ftid; |
1142 | 1142 | ||
1143 | skb = alloc_skb(sizeof(*fwr), GFP_KERNEL); | ||
1144 | if (!skb) | ||
1145 | return -ENOMEM; | ||
1146 | |||
1143 | /* If the new filter requires loopback Destination MAC and/or VLAN | 1147 | /* If the new filter requires loopback Destination MAC and/or VLAN |
1144 | * rewriting then we need to allocate a Layer 2 Table (L2T) entry for | 1148 | * rewriting then we need to allocate a Layer 2 Table (L2T) entry for |
1145 | * the filter. | 1149 | * the filter. |
@@ -1147,19 +1151,21 @@ static int set_filter_wr(struct adapter *adapter, int fidx) | |||
1147 | if (f->fs.newdmac || f->fs.newvlan) { | 1151 | if (f->fs.newdmac || f->fs.newvlan) { |
1148 | /* allocate L2T entry for new filter */ | 1152 | /* allocate L2T entry for new filter */ |
1149 | f->l2t = t4_l2t_alloc_switching(adapter->l2t); | 1153 | f->l2t = t4_l2t_alloc_switching(adapter->l2t); |
1150 | if (f->l2t == NULL) | 1154 | if (f->l2t == NULL) { |
1155 | kfree_skb(skb); | ||
1151 | return -EAGAIN; | 1156 | return -EAGAIN; |
1157 | } | ||
1152 | if (t4_l2t_set_switching(adapter, f->l2t, f->fs.vlan, | 1158 | if (t4_l2t_set_switching(adapter, f->l2t, f->fs.vlan, |
1153 | f->fs.eport, f->fs.dmac)) { | 1159 | f->fs.eport, f->fs.dmac)) { |
1154 | cxgb4_l2t_release(f->l2t); | 1160 | cxgb4_l2t_release(f->l2t); |
1155 | f->l2t = NULL; | 1161 | f->l2t = NULL; |
1162 | kfree_skb(skb); | ||
1156 | return -ENOMEM; | 1163 | return -ENOMEM; |
1157 | } | 1164 | } |
1158 | } | 1165 | } |
1159 | 1166 | ||
1160 | ftid = adapter->tids.ftid_base + fidx; | 1167 | ftid = adapter->tids.ftid_base + fidx; |
1161 | 1168 | ||
1162 | skb = alloc_skb(sizeof(*fwr), GFP_KERNEL | __GFP_NOFAIL); | ||
1163 | fwr = (struct fw_filter_wr *)__skb_put(skb, sizeof(*fwr)); | 1169 | fwr = (struct fw_filter_wr *)__skb_put(skb, sizeof(*fwr)); |
1164 | memset(fwr, 0, sizeof(*fwr)); | 1170 | memset(fwr, 0, sizeof(*fwr)); |
1165 | 1171 | ||
@@ -1257,7 +1263,10 @@ static int del_filter_wr(struct adapter *adapter, int fidx) | |||
1257 | len = sizeof(*fwr); | 1263 | len = sizeof(*fwr); |
1258 | ftid = adapter->tids.ftid_base + fidx; | 1264 | ftid = adapter->tids.ftid_base + fidx; |
1259 | 1265 | ||
1260 | skb = alloc_skb(len, GFP_KERNEL | __GFP_NOFAIL); | 1266 | skb = alloc_skb(len, GFP_KERNEL); |
1267 | if (!skb) | ||
1268 | return -ENOMEM; | ||
1269 | |||
1261 | fwr = (struct fw_filter_wr *)__skb_put(skb, len); | 1270 | fwr = (struct fw_filter_wr *)__skb_put(skb, len); |
1262 | t4_mk_filtdelwr(ftid, fwr, adapter->sge.fw_evtq.abs_id); | 1271 | t4_mk_filtdelwr(ftid, fwr, adapter->sge.fw_evtq.abs_id); |
1263 | 1272 | ||