0001
0002
0003
0004 #include "ice_vsi_vlan_lib.h"
0005 #include "ice_lib.h"
0006 #include "ice_fltr.h"
0007 #include "ice.h"
0008
0009 static void print_invalid_tpid(struct ice_vsi *vsi, u16 tpid)
0010 {
0011 dev_err(ice_pf_to_dev(vsi->back), "%s %d specified invalid VLAN tpid 0x%04x\n",
0012 ice_vsi_type_str(vsi->type), vsi->idx, tpid);
0013 }
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 static bool validate_vlan(struct ice_vsi *vsi, struct ice_vlan *vlan)
0025 {
0026 if (vlan->tpid != ETH_P_8021Q && vlan->tpid != ETH_P_8021AD &&
0027 vlan->tpid != ETH_P_QINQ1 && (vlan->tpid || vlan->vid)) {
0028 print_invalid_tpid(vsi, vlan->tpid);
0029 return false;
0030 }
0031
0032 return true;
0033 }
0034
0035
0036
0037
0038
0039
0040 int ice_vsi_add_vlan(struct ice_vsi *vsi, struct ice_vlan *vlan)
0041 {
0042 int err;
0043
0044 if (!validate_vlan(vsi, vlan))
0045 return -EINVAL;
0046
0047 err = ice_fltr_add_vlan(vsi, vlan);
0048 if (err && err != -EEXIST) {
0049 dev_err(ice_pf_to_dev(vsi->back), "Failure Adding VLAN %d on VSI %i, status %d\n",
0050 vlan->vid, vsi->vsi_num, err);
0051 return err;
0052 }
0053
0054 vsi->num_vlan++;
0055 return 0;
0056 }
0057
0058
0059
0060
0061
0062
0063 int ice_vsi_del_vlan(struct ice_vsi *vsi, struct ice_vlan *vlan)
0064 {
0065 struct ice_pf *pf = vsi->back;
0066 struct device *dev;
0067 int err;
0068
0069 if (!validate_vlan(vsi, vlan))
0070 return -EINVAL;
0071
0072 dev = ice_pf_to_dev(pf);
0073
0074 err = ice_fltr_remove_vlan(vsi, vlan);
0075 if (!err)
0076 vsi->num_vlan--;
0077 else if (err == -ENOENT || err == -EBUSY)
0078 err = 0;
0079 else
0080 dev_err(dev, "Error removing VLAN %d on VSI %i error: %d\n",
0081 vlan->vid, vsi->vsi_num, err);
0082
0083 return err;
0084 }
0085
0086
0087
0088
0089
0090 static int ice_vsi_manage_vlan_insertion(struct ice_vsi *vsi)
0091 {
0092 struct ice_hw *hw = &vsi->back->hw;
0093 struct ice_vsi_ctx *ctxt;
0094 int err;
0095
0096 ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);
0097 if (!ctxt)
0098 return -ENOMEM;
0099
0100
0101
0102
0103
0104 ctxt->info.inner_vlan_flags = ICE_AQ_VSI_INNER_VLAN_TX_MODE_ALL;
0105
0106
0107 ctxt->info.inner_vlan_flags |= (vsi->info.inner_vlan_flags &
0108 ICE_AQ_VSI_INNER_VLAN_EMODE_M);
0109
0110 ctxt->info.valid_sections = cpu_to_le16(ICE_AQ_VSI_PROP_VLAN_VALID);
0111
0112 err = ice_update_vsi(hw, vsi->idx, ctxt, NULL);
0113 if (err) {
0114 dev_err(ice_pf_to_dev(vsi->back), "update VSI for VLAN insert failed, err %d aq_err %s\n",
0115 err, ice_aq_str(hw->adminq.sq_last_status));
0116 goto out;
0117 }
0118
0119 vsi->info.inner_vlan_flags = ctxt->info.inner_vlan_flags;
0120 out:
0121 kfree(ctxt);
0122 return err;
0123 }
0124
0125
0126
0127
0128
0129
0130 static int ice_vsi_manage_vlan_stripping(struct ice_vsi *vsi, bool ena)
0131 {
0132 struct ice_hw *hw = &vsi->back->hw;
0133 struct ice_vsi_ctx *ctxt;
0134 int err;
0135
0136
0137
0138
0139 if (vsi->info.port_based_inner_vlan)
0140 return 0;
0141
0142 ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);
0143 if (!ctxt)
0144 return -ENOMEM;
0145
0146
0147
0148
0149
0150 if (ena)
0151
0152 ctxt->info.inner_vlan_flags = ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH;
0153 else
0154
0155 ctxt->info.inner_vlan_flags = ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING;
0156
0157
0158 ctxt->info.inner_vlan_flags |= ICE_AQ_VSI_INNER_VLAN_TX_MODE_ALL;
0159
0160 ctxt->info.valid_sections = cpu_to_le16(ICE_AQ_VSI_PROP_VLAN_VALID);
0161
0162 err = ice_update_vsi(hw, vsi->idx, ctxt, NULL);
0163 if (err) {
0164 dev_err(ice_pf_to_dev(vsi->back), "update VSI for VLAN strip failed, ena = %d err %d aq_err %s\n",
0165 ena, err, ice_aq_str(hw->adminq.sq_last_status));
0166 goto out;
0167 }
0168
0169 vsi->info.inner_vlan_flags = ctxt->info.inner_vlan_flags;
0170 out:
0171 kfree(ctxt);
0172 return err;
0173 }
0174
0175 int ice_vsi_ena_inner_stripping(struct ice_vsi *vsi, const u16 tpid)
0176 {
0177 if (tpid != ETH_P_8021Q) {
0178 print_invalid_tpid(vsi, tpid);
0179 return -EINVAL;
0180 }
0181
0182 return ice_vsi_manage_vlan_stripping(vsi, true);
0183 }
0184
0185 int ice_vsi_dis_inner_stripping(struct ice_vsi *vsi)
0186 {
0187 return ice_vsi_manage_vlan_stripping(vsi, false);
0188 }
0189
0190 int ice_vsi_ena_inner_insertion(struct ice_vsi *vsi, const u16 tpid)
0191 {
0192 if (tpid != ETH_P_8021Q) {
0193 print_invalid_tpid(vsi, tpid);
0194 return -EINVAL;
0195 }
0196
0197 return ice_vsi_manage_vlan_insertion(vsi);
0198 }
0199
0200 int ice_vsi_dis_inner_insertion(struct ice_vsi *vsi)
0201 {
0202 return ice_vsi_manage_vlan_insertion(vsi);
0203 }
0204
0205
0206
0207
0208
0209
0210 static int __ice_vsi_set_inner_port_vlan(struct ice_vsi *vsi, u16 pvid_info)
0211 {
0212 struct ice_hw *hw = &vsi->back->hw;
0213 struct ice_aqc_vsi_props *info;
0214 struct ice_vsi_ctx *ctxt;
0215 int ret;
0216
0217 ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);
0218 if (!ctxt)
0219 return -ENOMEM;
0220
0221 ctxt->info = vsi->info;
0222 info = &ctxt->info;
0223 info->inner_vlan_flags = ICE_AQ_VSI_INNER_VLAN_TX_MODE_ACCEPTUNTAGGED |
0224 ICE_AQ_VSI_INNER_VLAN_INSERT_PVID |
0225 ICE_AQ_VSI_INNER_VLAN_EMODE_STR;
0226 info->sw_flags2 |= ICE_AQ_VSI_SW_FLAG_RX_VLAN_PRUNE_ENA;
0227
0228 info->port_based_inner_vlan = cpu_to_le16(pvid_info);
0229 info->valid_sections = cpu_to_le16(ICE_AQ_VSI_PROP_VLAN_VALID |
0230 ICE_AQ_VSI_PROP_SW_VALID);
0231
0232 ret = ice_update_vsi(hw, vsi->idx, ctxt, NULL);
0233 if (ret) {
0234 dev_info(ice_hw_to_dev(hw), "update VSI for port VLAN failed, err %d aq_err %s\n",
0235 ret, ice_aq_str(hw->adminq.sq_last_status));
0236 goto out;
0237 }
0238
0239 vsi->info.inner_vlan_flags = info->inner_vlan_flags;
0240 vsi->info.sw_flags2 = info->sw_flags2;
0241 vsi->info.port_based_inner_vlan = info->port_based_inner_vlan;
0242 out:
0243 kfree(ctxt);
0244 return ret;
0245 }
0246
0247 int ice_vsi_set_inner_port_vlan(struct ice_vsi *vsi, struct ice_vlan *vlan)
0248 {
0249 u16 port_vlan_info;
0250
0251 if (vlan->tpid != ETH_P_8021Q)
0252 return -EINVAL;
0253
0254 if (vlan->prio > 7)
0255 return -EINVAL;
0256
0257 port_vlan_info = vlan->vid | (vlan->prio << VLAN_PRIO_SHIFT);
0258
0259 return __ice_vsi_set_inner_port_vlan(vsi, port_vlan_info);
0260 }
0261
0262
0263
0264
0265
0266
0267
0268
0269 static int ice_cfg_vlan_pruning(struct ice_vsi *vsi, bool ena)
0270 {
0271 struct ice_vsi_ctx *ctxt;
0272 struct ice_pf *pf;
0273 int status;
0274
0275 if (!vsi)
0276 return -EINVAL;
0277
0278
0279
0280
0281
0282 if (vsi->netdev && vsi->netdev->flags & IFF_PROMISC && ena)
0283 return 0;
0284
0285 pf = vsi->back;
0286 ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);
0287 if (!ctxt)
0288 return -ENOMEM;
0289
0290 ctxt->info = vsi->info;
0291
0292 if (ena)
0293 ctxt->info.sw_flags2 |= ICE_AQ_VSI_SW_FLAG_RX_VLAN_PRUNE_ENA;
0294 else
0295 ctxt->info.sw_flags2 &= ~ICE_AQ_VSI_SW_FLAG_RX_VLAN_PRUNE_ENA;
0296
0297 ctxt->info.valid_sections = cpu_to_le16(ICE_AQ_VSI_PROP_SW_VALID);
0298
0299 status = ice_update_vsi(&pf->hw, vsi->idx, ctxt, NULL);
0300 if (status) {
0301 netdev_err(vsi->netdev, "%sabling VLAN pruning on VSI handle: %d, VSI HW ID: %d failed, err = %d, aq_err = %s\n",
0302 ena ? "En" : "Dis", vsi->idx, vsi->vsi_num, status,
0303 ice_aq_str(pf->hw.adminq.sq_last_status));
0304 goto err_out;
0305 }
0306
0307 vsi->info.sw_flags2 = ctxt->info.sw_flags2;
0308
0309 kfree(ctxt);
0310 return 0;
0311
0312 err_out:
0313 kfree(ctxt);
0314 return status;
0315 }
0316
0317 int ice_vsi_ena_rx_vlan_filtering(struct ice_vsi *vsi)
0318 {
0319 return ice_cfg_vlan_pruning(vsi, true);
0320 }
0321
0322 int ice_vsi_dis_rx_vlan_filtering(struct ice_vsi *vsi)
0323 {
0324 return ice_cfg_vlan_pruning(vsi, false);
0325 }
0326
0327 static int ice_cfg_vlan_antispoof(struct ice_vsi *vsi, bool enable)
0328 {
0329 struct ice_vsi_ctx *ctx;
0330 int err;
0331
0332 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
0333 if (!ctx)
0334 return -ENOMEM;
0335
0336 ctx->info.sec_flags = vsi->info.sec_flags;
0337 ctx->info.valid_sections = cpu_to_le16(ICE_AQ_VSI_PROP_SECURITY_VALID);
0338
0339 if (enable)
0340 ctx->info.sec_flags |= ICE_AQ_VSI_SEC_TX_VLAN_PRUNE_ENA <<
0341 ICE_AQ_VSI_SEC_TX_PRUNE_ENA_S;
0342 else
0343 ctx->info.sec_flags &= ~(ICE_AQ_VSI_SEC_TX_VLAN_PRUNE_ENA <<
0344 ICE_AQ_VSI_SEC_TX_PRUNE_ENA_S);
0345
0346 err = ice_update_vsi(&vsi->back->hw, vsi->idx, ctx, NULL);
0347 if (err)
0348 dev_err(ice_pf_to_dev(vsi->back), "Failed to configure Tx VLAN anti-spoof %s for VSI %d, error %d\n",
0349 enable ? "ON" : "OFF", vsi->vsi_num, err);
0350 else
0351 vsi->info.sec_flags = ctx->info.sec_flags;
0352
0353 kfree(ctx);
0354
0355 return err;
0356 }
0357
0358 int ice_vsi_ena_tx_vlan_filtering(struct ice_vsi *vsi)
0359 {
0360 return ice_cfg_vlan_antispoof(vsi, true);
0361 }
0362
0363 int ice_vsi_dis_tx_vlan_filtering(struct ice_vsi *vsi)
0364 {
0365 return ice_cfg_vlan_antispoof(vsi, false);
0366 }
0367
0368
0369
0370
0371
0372
0373 static int tpid_to_vsi_outer_vlan_type(u16 tpid, u8 *tag_type)
0374 {
0375 switch (tpid) {
0376 case ETH_P_8021Q:
0377 *tag_type = ICE_AQ_VSI_OUTER_TAG_VLAN_8100;
0378 break;
0379 case ETH_P_8021AD:
0380 *tag_type = ICE_AQ_VSI_OUTER_TAG_STAG;
0381 break;
0382 case ETH_P_QINQ1:
0383 *tag_type = ICE_AQ_VSI_OUTER_TAG_VLAN_9100;
0384 break;
0385 default:
0386 *tag_type = 0;
0387 return -EINVAL;
0388 }
0389
0390 return 0;
0391 }
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412 int ice_vsi_ena_outer_stripping(struct ice_vsi *vsi, u16 tpid)
0413 {
0414 struct ice_hw *hw = &vsi->back->hw;
0415 struct ice_vsi_ctx *ctxt;
0416 u8 tag_type;
0417 int err;
0418
0419
0420
0421
0422 if (vsi->info.port_based_outer_vlan)
0423 return 0;
0424
0425 if (tpid_to_vsi_outer_vlan_type(tpid, &tag_type))
0426 return -EINVAL;
0427
0428 ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);
0429 if (!ctxt)
0430 return -ENOMEM;
0431
0432 ctxt->info.valid_sections =
0433 cpu_to_le16(ICE_AQ_VSI_PROP_OUTER_TAG_VALID);
0434
0435 ctxt->info.outer_vlan_flags = vsi->info.outer_vlan_flags &
0436 ~(ICE_AQ_VSI_OUTER_VLAN_EMODE_M | ICE_AQ_VSI_OUTER_TAG_TYPE_M);
0437 ctxt->info.outer_vlan_flags |=
0438 ((ICE_AQ_VSI_OUTER_VLAN_EMODE_SHOW_BOTH <<
0439 ICE_AQ_VSI_OUTER_VLAN_EMODE_S) |
0440 ((tag_type << ICE_AQ_VSI_OUTER_TAG_TYPE_S) &
0441 ICE_AQ_VSI_OUTER_TAG_TYPE_M));
0442
0443 err = ice_update_vsi(hw, vsi->idx, ctxt, NULL);
0444 if (err)
0445 dev_err(ice_pf_to_dev(vsi->back), "update VSI for enabling outer VLAN stripping failed, err %d aq_err %s\n",
0446 err, ice_aq_str(hw->adminq.sq_last_status));
0447 else
0448 vsi->info.outer_vlan_flags = ctxt->info.outer_vlan_flags;
0449
0450 kfree(ctxt);
0451 return err;
0452 }
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469 int ice_vsi_dis_outer_stripping(struct ice_vsi *vsi)
0470 {
0471 struct ice_hw *hw = &vsi->back->hw;
0472 struct ice_vsi_ctx *ctxt;
0473 int err;
0474
0475 if (vsi->info.port_based_outer_vlan)
0476 return 0;
0477
0478 ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);
0479 if (!ctxt)
0480 return -ENOMEM;
0481
0482 ctxt->info.valid_sections =
0483 cpu_to_le16(ICE_AQ_VSI_PROP_OUTER_TAG_VALID);
0484
0485 ctxt->info.outer_vlan_flags = vsi->info.outer_vlan_flags &
0486 ~ICE_AQ_VSI_OUTER_VLAN_EMODE_M;
0487 ctxt->info.outer_vlan_flags |= ICE_AQ_VSI_OUTER_VLAN_EMODE_NOTHING <<
0488 ICE_AQ_VSI_OUTER_VLAN_EMODE_S;
0489
0490 err = ice_update_vsi(hw, vsi->idx, ctxt, NULL);
0491 if (err)
0492 dev_err(ice_pf_to_dev(vsi->back), "update VSI for disabling outer VLAN stripping failed, err %d aq_err %s\n",
0493 err, ice_aq_str(hw->adminq.sq_last_status));
0494 else
0495 vsi->info.outer_vlan_flags = ctxt->info.outer_vlan_flags;
0496
0497 kfree(ctxt);
0498 return err;
0499 }
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520 int ice_vsi_ena_outer_insertion(struct ice_vsi *vsi, u16 tpid)
0521 {
0522 struct ice_hw *hw = &vsi->back->hw;
0523 struct ice_vsi_ctx *ctxt;
0524 u8 tag_type;
0525 int err;
0526
0527 if (vsi->info.port_based_outer_vlan)
0528 return 0;
0529
0530 if (tpid_to_vsi_outer_vlan_type(tpid, &tag_type))
0531 return -EINVAL;
0532
0533 ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);
0534 if (!ctxt)
0535 return -ENOMEM;
0536
0537 ctxt->info.valid_sections =
0538 cpu_to_le16(ICE_AQ_VSI_PROP_OUTER_TAG_VALID);
0539
0540 ctxt->info.outer_vlan_flags = vsi->info.outer_vlan_flags &
0541 ~(ICE_AQ_VSI_OUTER_VLAN_PORT_BASED_INSERT |
0542 ICE_AQ_VSI_OUTER_VLAN_BLOCK_TX_DESC |
0543 ICE_AQ_VSI_OUTER_VLAN_TX_MODE_M |
0544 ICE_AQ_VSI_OUTER_TAG_TYPE_M);
0545 ctxt->info.outer_vlan_flags |=
0546 ((ICE_AQ_VSI_OUTER_VLAN_TX_MODE_ALL <<
0547 ICE_AQ_VSI_OUTER_VLAN_TX_MODE_S) &
0548 ICE_AQ_VSI_OUTER_VLAN_TX_MODE_M) |
0549 ((tag_type << ICE_AQ_VSI_OUTER_TAG_TYPE_S) &
0550 ICE_AQ_VSI_OUTER_TAG_TYPE_M);
0551
0552 err = ice_update_vsi(hw, vsi->idx, ctxt, NULL);
0553 if (err)
0554 dev_err(ice_pf_to_dev(vsi->back), "update VSI for enabling outer VLAN insertion failed, err %d aq_err %s\n",
0555 err, ice_aq_str(hw->adminq.sq_last_status));
0556 else
0557 vsi->info.outer_vlan_flags = ctxt->info.outer_vlan_flags;
0558
0559 kfree(ctxt);
0560 return err;
0561 }
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578 int ice_vsi_dis_outer_insertion(struct ice_vsi *vsi)
0579 {
0580 struct ice_hw *hw = &vsi->back->hw;
0581 struct ice_vsi_ctx *ctxt;
0582 int err;
0583
0584 if (vsi->info.port_based_outer_vlan)
0585 return 0;
0586
0587 ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);
0588 if (!ctxt)
0589 return -ENOMEM;
0590
0591 ctxt->info.valid_sections =
0592 cpu_to_le16(ICE_AQ_VSI_PROP_OUTER_TAG_VALID);
0593
0594 ctxt->info.outer_vlan_flags = vsi->info.outer_vlan_flags &
0595 ~(ICE_AQ_VSI_OUTER_VLAN_PORT_BASED_INSERT |
0596 ICE_AQ_VSI_OUTER_VLAN_TX_MODE_M);
0597 ctxt->info.outer_vlan_flags |=
0598 ICE_AQ_VSI_OUTER_VLAN_BLOCK_TX_DESC |
0599 ((ICE_AQ_VSI_OUTER_VLAN_TX_MODE_ALL <<
0600 ICE_AQ_VSI_OUTER_VLAN_TX_MODE_S) &
0601 ICE_AQ_VSI_OUTER_VLAN_TX_MODE_M);
0602
0603 err = ice_update_vsi(hw, vsi->idx, ctxt, NULL);
0604 if (err)
0605 dev_err(ice_pf_to_dev(vsi->back), "update VSI for disabling outer VLAN insertion failed, err %d aq_err %s\n",
0606 err, ice_aq_str(hw->adminq.sq_last_status));
0607 else
0608 vsi->info.outer_vlan_flags = ctxt->info.outer_vlan_flags;
0609
0610 kfree(ctxt);
0611 return err;
0612 }
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631
0632
0633
0634
0635 static int
0636 __ice_vsi_set_outer_port_vlan(struct ice_vsi *vsi, u16 vlan_info, u16 tpid)
0637 {
0638 struct ice_hw *hw = &vsi->back->hw;
0639 struct ice_vsi_ctx *ctxt;
0640 u8 tag_type;
0641 int err;
0642
0643 if (tpid_to_vsi_outer_vlan_type(tpid, &tag_type))
0644 return -EINVAL;
0645
0646 ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);
0647 if (!ctxt)
0648 return -ENOMEM;
0649
0650 ctxt->info = vsi->info;
0651
0652 ctxt->info.sw_flags2 |= ICE_AQ_VSI_SW_FLAG_RX_VLAN_PRUNE_ENA;
0653
0654 ctxt->info.port_based_outer_vlan = cpu_to_le16(vlan_info);
0655 ctxt->info.outer_vlan_flags =
0656 (ICE_AQ_VSI_OUTER_VLAN_EMODE_SHOW <<
0657 ICE_AQ_VSI_OUTER_VLAN_EMODE_S) |
0658 ((tag_type << ICE_AQ_VSI_OUTER_TAG_TYPE_S) &
0659 ICE_AQ_VSI_OUTER_TAG_TYPE_M) |
0660 ICE_AQ_VSI_OUTER_VLAN_BLOCK_TX_DESC |
0661 (ICE_AQ_VSI_OUTER_VLAN_TX_MODE_ACCEPTUNTAGGED <<
0662 ICE_AQ_VSI_OUTER_VLAN_TX_MODE_S) |
0663 ICE_AQ_VSI_OUTER_VLAN_PORT_BASED_INSERT;
0664
0665 ctxt->info.valid_sections =
0666 cpu_to_le16(ICE_AQ_VSI_PROP_OUTER_TAG_VALID |
0667 ICE_AQ_VSI_PROP_SW_VALID);
0668
0669 err = ice_update_vsi(hw, vsi->idx, ctxt, NULL);
0670 if (err) {
0671 dev_err(ice_pf_to_dev(vsi->back), "update VSI for setting outer port based VLAN failed, err %d aq_err %s\n",
0672 err, ice_aq_str(hw->adminq.sq_last_status));
0673 } else {
0674 vsi->info.port_based_outer_vlan = ctxt->info.port_based_outer_vlan;
0675 vsi->info.outer_vlan_flags = ctxt->info.outer_vlan_flags;
0676 vsi->info.sw_flags2 = ctxt->info.sw_flags2;
0677 }
0678
0679 kfree(ctxt);
0680 return err;
0681 }
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697 int ice_vsi_set_outer_port_vlan(struct ice_vsi *vsi, struct ice_vlan *vlan)
0698 {
0699 u16 port_vlan_info;
0700
0701 if (vlan->prio > (VLAN_PRIO_MASK >> VLAN_PRIO_SHIFT))
0702 return -EINVAL;
0703
0704 port_vlan_info = vlan->vid | (vlan->prio << VLAN_PRIO_SHIFT);
0705
0706 return __ice_vsi_set_outer_port_vlan(vsi, port_vlan_info, vlan->tpid);
0707 }