| 479 | } |
| 480 | |
| 481 | static int |
| 482 | ixgbe_vf_set_multicast(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) |
| 483 | { |
| 484 | struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); |
| 485 | struct ixgbe_vf_info *vfinfo = |
| 486 | *(IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private)); |
| 487 | int nb_entries = (msgbuf[0] & IXGBE_VT_MSGINFO_MASK) >> |
| 488 | IXGBE_VT_MSGINFO_SHIFT; |
| 489 | uint16_t *hash_list = (uint16_t *)&msgbuf[1]; |
| 490 | uint32_t mta_idx; |
| 491 | uint32_t mta_shift; |
| 492 | const uint32_t IXGBE_MTA_INDEX_MASK = 0x7F; |
| 493 | const uint32_t IXGBE_MTA_BIT_SHIFT = 5; |
| 494 | const uint32_t IXGBE_MTA_BIT_MASK = (0x1 << IXGBE_MTA_BIT_SHIFT) - 1; |
| 495 | uint32_t reg_val; |
| 496 | int i; |
| 497 | u32 vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf)); |
| 498 | |
| 499 | /* Disable multicast promiscuous first */ |
| 500 | ixgbe_disable_vf_mc_promisc(dev, vf); |
| 501 | |
| 502 | /* only so many hash values supported */ |
| 503 | nb_entries = RTE_MIN(nb_entries, IXGBE_MAX_VF_MC_ENTRIES); |
| 504 | |
| 505 | /* store the mc entries */ |
| 506 | vfinfo->num_vf_mc_hashes = (uint16_t)nb_entries; |
| 507 | for (i = 0; i < nb_entries; i++) { |
| 508 | vfinfo->vf_mc_hashes[i] = hash_list[i]; |
| 509 | } |
| 510 | |
| 511 | if (nb_entries == 0) { |
| 512 | vmolr &= ~IXGBE_VMOLR_ROMPE; |
| 513 | IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr); |
| 514 | return 0; |
| 515 | } |
| 516 | |
| 517 | for (i = 0; i < vfinfo->num_vf_mc_hashes; i++) { |
| 518 | mta_idx = (vfinfo->vf_mc_hashes[i] >> IXGBE_MTA_BIT_SHIFT) |
| 519 | & IXGBE_MTA_INDEX_MASK; |
| 520 | mta_shift = vfinfo->vf_mc_hashes[i] & IXGBE_MTA_BIT_MASK; |
| 521 | reg_val = IXGBE_READ_REG(hw, IXGBE_MTA(mta_idx)); |
| 522 | reg_val |= (1 << mta_shift); |
| 523 | IXGBE_WRITE_REG(hw, IXGBE_MTA(mta_idx), reg_val); |
| 524 | } |
| 525 | |
| 526 | vmolr |= IXGBE_VMOLR_ROMPE; |
| 527 | IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr); |
| 528 | |
| 529 | return 0; |
| 530 | } |
| 531 | |
| 532 | static int |
| 533 | ixgbe_vf_set_vlan(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) |
no test coverage detected