.. | .. |
---|
100 | 100 | DP(NETIF_MSG_HW, "write 0x%08x to IGU(via GRC) addr 0x%x\n", |
---|
101 | 101 | cmd_data.sb_id_and_flags, igu_addr_data); |
---|
102 | 102 | REG_WR(bp, igu_addr_data, cmd_data.sb_id_and_flags); |
---|
103 | | - mmiowb(); |
---|
104 | 103 | barrier(); |
---|
105 | 104 | |
---|
106 | 105 | DP(NETIF_MSG_HW, "write 0x%08x to IGU(via GRC) addr 0x%x\n", |
---|
107 | 106 | ctl, igu_addr_ctl); |
---|
108 | 107 | REG_WR(bp, igu_addr_ctl, ctl); |
---|
109 | | - mmiowb(); |
---|
110 | 108 | barrier(); |
---|
111 | 109 | } |
---|
112 | 110 | |
---|
.. | .. |
---|
209 | 207 | */ |
---|
210 | 208 | __set_bit(BNX2X_Q_FLG_TX_SWITCH, &setup_p->flags); |
---|
211 | 209 | __set_bit(BNX2X_Q_FLG_TX_SEC, &setup_p->flags); |
---|
212 | | - __set_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags); |
---|
| 210 | + if (vf->spoofchk) |
---|
| 211 | + __set_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags); |
---|
| 212 | + else |
---|
| 213 | + __clear_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags); |
---|
213 | 214 | |
---|
214 | 215 | /* Setup-op rx parameters */ |
---|
215 | 216 | if (test_bit(BNX2X_Q_TYPE_HAS_RX, &q_type)) { |
---|
.. | .. |
---|
328 | 329 | ++vf->sb_count; |
---|
329 | 330 | } |
---|
330 | 331 | BP_VFDB(bp)->vf_sbs_pool++; |
---|
331 | | -} |
---|
332 | | - |
---|
333 | | -static inline void bnx2x_vf_vlan_credit(struct bnx2x *bp, |
---|
334 | | - struct bnx2x_vlan_mac_obj *obj, |
---|
335 | | - atomic_t *counter) |
---|
336 | | -{ |
---|
337 | | - struct list_head *pos; |
---|
338 | | - int read_lock; |
---|
339 | | - int cnt = 0; |
---|
340 | | - |
---|
341 | | - read_lock = bnx2x_vlan_mac_h_read_lock(bp, obj); |
---|
342 | | - if (read_lock) |
---|
343 | | - DP(BNX2X_MSG_SP, "Failed to take vlan mac read head; continuing anyway\n"); |
---|
344 | | - |
---|
345 | | - list_for_each(pos, &obj->head) |
---|
346 | | - cnt++; |
---|
347 | | - |
---|
348 | | - if (!read_lock) |
---|
349 | | - bnx2x_vlan_mac_h_read_unlock(bp, obj); |
---|
350 | | - |
---|
351 | | - atomic_set(counter, cnt); |
---|
352 | 332 | } |
---|
353 | 333 | |
---|
354 | 334 | static int bnx2x_vf_vlan_mac_clear(struct bnx2x *bp, struct bnx2x_virtf *vf, |
---|
.. | .. |
---|
778 | 758 | |
---|
779 | 759 | void bnx2x_vf_enable_access(struct bnx2x *bp, u8 abs_vfid) |
---|
780 | 760 | { |
---|
| 761 | + u16 abs_fid; |
---|
| 762 | + |
---|
| 763 | + abs_fid = FW_VF_HANDLE(abs_vfid); |
---|
| 764 | + |
---|
781 | 765 | /* set the VF-PF association in the FW */ |
---|
782 | | - storm_memset_vf_to_pf(bp, FW_VF_HANDLE(abs_vfid), BP_FUNC(bp)); |
---|
783 | | - storm_memset_func_en(bp, FW_VF_HANDLE(abs_vfid), 1); |
---|
| 766 | + storm_memset_vf_to_pf(bp, abs_fid, BP_FUNC(bp)); |
---|
| 767 | + storm_memset_func_en(bp, abs_fid, 1); |
---|
| 768 | + |
---|
| 769 | + /* Invalidate fp_hsi version for vfs */ |
---|
| 770 | + if (bp->fw_cap & FW_CAP_INVALIDATE_VF_FP_HSI) |
---|
| 771 | + REG_WR8(bp, BAR_XSTRORM_INTMEM + |
---|
| 772 | + XSTORM_ETH_FUNCTION_INFO_FP_HSI_VALID_E2_OFFSET(abs_fid), 0); |
---|
784 | 773 | |
---|
785 | 774 | /* clear vf errors*/ |
---|
786 | 775 | bnx2x_vf_semi_clear_err(bp, abs_vfid); |
---|
.. | .. |
---|
806 | 795 | |
---|
807 | 796 | static u8 bnx2x_vf_is_pcie_pending(struct bnx2x *bp, u8 abs_vfid) |
---|
808 | 797 | { |
---|
809 | | - struct pci_dev *dev; |
---|
810 | 798 | struct bnx2x_virtf *vf = bnx2x_vf_by_abs_fid(bp, abs_vfid); |
---|
| 799 | + struct pci_dev *dev; |
---|
| 800 | + bool pending; |
---|
811 | 801 | |
---|
812 | 802 | if (!vf) |
---|
813 | 803 | return false; |
---|
814 | 804 | |
---|
815 | 805 | dev = pci_get_domain_bus_and_slot(vf->domain, vf->bus, vf->devfn); |
---|
816 | | - if (dev) |
---|
817 | | - return bnx2x_is_pcie_pending(dev); |
---|
818 | | - return false; |
---|
| 806 | + if (!dev) |
---|
| 807 | + return false; |
---|
| 808 | + pending = bnx2x_is_pcie_pending(dev); |
---|
| 809 | + pci_dev_put(dev); |
---|
| 810 | + |
---|
| 811 | + return pending; |
---|
819 | 812 | } |
---|
820 | 813 | |
---|
821 | 814 | int bnx2x_vf_flr_clnup_epilog(struct bnx2x *bp, u8 abs_vfid) |
---|
.. | .. |
---|
1271 | 1264 | bnx2x_vf(bp, i, state) = VF_FREE; |
---|
1272 | 1265 | mutex_init(&bnx2x_vf(bp, i, op_mutex)); |
---|
1273 | 1266 | bnx2x_vf(bp, i, op_current) = CHANNEL_TLV_NONE; |
---|
| 1267 | + /* enable spoofchk by default */ |
---|
| 1268 | + bnx2x_vf(bp, i, spoofchk) = 1; |
---|
1274 | 1269 | } |
---|
1275 | 1270 | |
---|
1276 | 1271 | /* re-read the IGU CAM for VFs - index and abs_vfid must be set */ |
---|
.. | .. |
---|
1829 | 1824 | DP(BNX2X_MSG_IOV, "got VF [%d:%d] RSS update ramrod\n", |
---|
1830 | 1825 | vf->abs_vfid, qidx); |
---|
1831 | 1826 | bnx2x_vf_handle_rss_update_eqe(bp, vf); |
---|
1832 | | - /* fall through */ |
---|
| 1827 | + fallthrough; |
---|
1833 | 1828 | case EVENT_RING_OPCODE_VF_FLR: |
---|
1834 | 1829 | /* Do nothing for now */ |
---|
1835 | 1830 | return 0; |
---|
.. | .. |
---|
2227 | 2222 | rc = bnx2x_vf_close(bp, vf); |
---|
2228 | 2223 | if (rc) |
---|
2229 | 2224 | goto op_err; |
---|
2230 | | - /* Fallthrough to release resources */ |
---|
| 2225 | + fallthrough; /* to release resources */ |
---|
2231 | 2226 | case VF_ACQUIRED: |
---|
2232 | 2227 | DP(BNX2X_MSG_IOV, "about to free resources\n"); |
---|
2233 | 2228 | bnx2x_vf_free_resc(bp, vf); |
---|
.. | .. |
---|
2640 | 2635 | ivi->qos = 0; |
---|
2641 | 2636 | ivi->max_tx_rate = 10000; /* always 10G. TBA take from link struct */ |
---|
2642 | 2637 | ivi->min_tx_rate = 0; |
---|
2643 | | - ivi->spoofchk = 1; /*always enabled */ |
---|
| 2638 | + ivi->spoofchk = vf->spoofchk ? 1 : 0; |
---|
| 2639 | + ivi->linkstate = vf->link_cfg; |
---|
2644 | 2640 | if (vf->state == VF_ENABLED) { |
---|
2645 | 2641 | /* mac and vlan are in vlan_mac objects */ |
---|
2646 | 2642 | if (bnx2x_validate_vf_sp_objs(bp, vf, false)) { |
---|
.. | .. |
---|
2958 | 2954 | return rc; |
---|
2959 | 2955 | } |
---|
2960 | 2956 | |
---|
| 2957 | +int bnx2x_set_vf_spoofchk(struct net_device *dev, int idx, bool val) |
---|
| 2958 | +{ |
---|
| 2959 | + struct bnx2x *bp = netdev_priv(dev); |
---|
| 2960 | + struct bnx2x_virtf *vf; |
---|
| 2961 | + int i, rc = 0; |
---|
| 2962 | + |
---|
| 2963 | + vf = BP_VF(bp, idx); |
---|
| 2964 | + if (!vf) |
---|
| 2965 | + return -EINVAL; |
---|
| 2966 | + |
---|
| 2967 | + /* nothing to do */ |
---|
| 2968 | + if (vf->spoofchk == val) |
---|
| 2969 | + return 0; |
---|
| 2970 | + |
---|
| 2971 | + vf->spoofchk = val ? 1 : 0; |
---|
| 2972 | + |
---|
| 2973 | + DP(BNX2X_MSG_IOV, "%s spoofchk for VF %d\n", |
---|
| 2974 | + val ? "enabling" : "disabling", idx); |
---|
| 2975 | + |
---|
| 2976 | + /* is vf initialized and queue set up? */ |
---|
| 2977 | + if (vf->state != VF_ENABLED || |
---|
| 2978 | + bnx2x_get_q_logical_state(bp, &bnx2x_leading_vfq(vf, sp_obj)) != |
---|
| 2979 | + BNX2X_Q_LOGICAL_STATE_ACTIVE) |
---|
| 2980 | + return rc; |
---|
| 2981 | + |
---|
| 2982 | + /* User should be able to see error in system logs */ |
---|
| 2983 | + if (!bnx2x_validate_vf_sp_objs(bp, vf, true)) |
---|
| 2984 | + return -EINVAL; |
---|
| 2985 | + |
---|
| 2986 | + /* send queue update ramrods to configure spoofchk */ |
---|
| 2987 | + for_each_vfq(vf, i) { |
---|
| 2988 | + struct bnx2x_queue_state_params q_params = {NULL}; |
---|
| 2989 | + struct bnx2x_queue_update_params *update_params; |
---|
| 2990 | + |
---|
| 2991 | + q_params.q_obj = &bnx2x_vfq(vf, i, sp_obj); |
---|
| 2992 | + |
---|
| 2993 | + /* validate the Q is UP */ |
---|
| 2994 | + if (bnx2x_get_q_logical_state(bp, q_params.q_obj) != |
---|
| 2995 | + BNX2X_Q_LOGICAL_STATE_ACTIVE) |
---|
| 2996 | + continue; |
---|
| 2997 | + |
---|
| 2998 | + __set_bit(RAMROD_COMP_WAIT, &q_params.ramrod_flags); |
---|
| 2999 | + q_params.cmd = BNX2X_Q_CMD_UPDATE; |
---|
| 3000 | + update_params = &q_params.params.update; |
---|
| 3001 | + __set_bit(BNX2X_Q_UPDATE_ANTI_SPOOF_CHNG, |
---|
| 3002 | + &update_params->update_flags); |
---|
| 3003 | + if (val) { |
---|
| 3004 | + __set_bit(BNX2X_Q_UPDATE_ANTI_SPOOF, |
---|
| 3005 | + &update_params->update_flags); |
---|
| 3006 | + } else { |
---|
| 3007 | + __clear_bit(BNX2X_Q_UPDATE_ANTI_SPOOF, |
---|
| 3008 | + &update_params->update_flags); |
---|
| 3009 | + } |
---|
| 3010 | + |
---|
| 3011 | + /* Update the Queue state */ |
---|
| 3012 | + rc = bnx2x_queue_state_change(bp, &q_params); |
---|
| 3013 | + if (rc) { |
---|
| 3014 | + BNX2X_ERR("Failed to %s spoofchk on VF %d - vfq %d\n", |
---|
| 3015 | + val ? "enable" : "disable", idx, i); |
---|
| 3016 | + goto out; |
---|
| 3017 | + } |
---|
| 3018 | + } |
---|
| 3019 | +out: |
---|
| 3020 | + if (!rc) |
---|
| 3021 | + DP(BNX2X_MSG_IOV, |
---|
| 3022 | + "%s spoofchk for VF[%d]\n", val ? "Enabled" : "Disabled", |
---|
| 3023 | + idx); |
---|
| 3024 | + |
---|
| 3025 | + return rc; |
---|
| 3026 | +} |
---|
| 3027 | + |
---|
2961 | 3028 | /* crc is the first field in the bulletin board. Compute the crc over the |
---|
2962 | 3029 | * entire bulletin board excluding the crc field itself. Use the length field |
---|
2963 | 3030 | * as the Bulletin Board was posted by a PF with possibly a different version |
---|