diff options
Diffstat (limited to 'drivers/net/ethernet/chelsio/cxgb4/t4_hw.c')
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c index 9903a66b7bad..a3964753935c 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | |||
@@ -3682,6 +3682,109 @@ int t4_prep_adapter(struct adapter *adapter) | |||
3682 | return 0; | 3682 | return 0; |
3683 | } | 3683 | } |
3684 | 3684 | ||
3685 | /** | ||
3686 | * t4_init_tp_params - initialize adap->params.tp | ||
3687 | * @adap: the adapter | ||
3688 | * | ||
3689 | * Initialize various fields of the adapter's TP Parameters structure. | ||
3690 | */ | ||
3691 | int t4_init_tp_params(struct adapter *adap) | ||
3692 | { | ||
3693 | int chan; | ||
3694 | u32 v; | ||
3695 | |||
3696 | v = t4_read_reg(adap, TP_TIMER_RESOLUTION); | ||
3697 | adap->params.tp.tre = TIMERRESOLUTION_GET(v); | ||
3698 | adap->params.tp.dack_re = DELAYEDACKRESOLUTION_GET(v); | ||
3699 | |||
3700 | /* MODQ_REQ_MAP defaults to setting queues 0-3 to chan 0-3 */ | ||
3701 | for (chan = 0; chan < NCHAN; chan++) | ||
3702 | adap->params.tp.tx_modq[chan] = chan; | ||
3703 | |||
3704 | /* Cache the adapter's Compressed Filter Mode and global Incress | ||
3705 | * Configuration. | ||
3706 | */ | ||
3707 | t4_read_indirect(adap, TP_PIO_ADDR, TP_PIO_DATA, | ||
3708 | &adap->params.tp.vlan_pri_map, 1, | ||
3709 | TP_VLAN_PRI_MAP); | ||
3710 | t4_read_indirect(adap, TP_PIO_ADDR, TP_PIO_DATA, | ||
3711 | &adap->params.tp.ingress_config, 1, | ||
3712 | TP_INGRESS_CONFIG); | ||
3713 | |||
3714 | /* Now that we have TP_VLAN_PRI_MAP cached, we can calculate the field | ||
3715 | * shift positions of several elements of the Compressed Filter Tuple | ||
3716 | * for this adapter which we need frequently ... | ||
3717 | */ | ||
3718 | adap->params.tp.vlan_shift = t4_filter_field_shift(adap, F_VLAN); | ||
3719 | adap->params.tp.vnic_shift = t4_filter_field_shift(adap, F_VNIC_ID); | ||
3720 | adap->params.tp.port_shift = t4_filter_field_shift(adap, F_PORT); | ||
3721 | adap->params.tp.protocol_shift = t4_filter_field_shift(adap, | ||
3722 | F_PROTOCOL); | ||
3723 | |||
3724 | /* If TP_INGRESS_CONFIG.VNID == 0, then TP_VLAN_PRI_MAP.VNIC_ID | ||
3725 | * represents the presense of an Outer VLAN instead of a VNIC ID. | ||
3726 | */ | ||
3727 | if ((adap->params.tp.ingress_config & F_VNIC) == 0) | ||
3728 | adap->params.tp.vnic_shift = -1; | ||
3729 | |||
3730 | return 0; | ||
3731 | } | ||
3732 | |||
3733 | /** | ||
3734 | * t4_filter_field_shift - calculate filter field shift | ||
3735 | * @adap: the adapter | ||
3736 | * @filter_sel: the desired field (from TP_VLAN_PRI_MAP bits) | ||
3737 | * | ||
3738 | * Return the shift position of a filter field within the Compressed | ||
3739 | * Filter Tuple. The filter field is specified via its selection bit | ||
3740 | * within TP_VLAN_PRI_MAL (filter mode). E.g. F_VLAN. | ||
3741 | */ | ||
3742 | int t4_filter_field_shift(const struct adapter *adap, int filter_sel) | ||
3743 | { | ||
3744 | unsigned int filter_mode = adap->params.tp.vlan_pri_map; | ||
3745 | unsigned int sel; | ||
3746 | int field_shift; | ||
3747 | |||
3748 | if ((filter_mode & filter_sel) == 0) | ||
3749 | return -1; | ||
3750 | |||
3751 | for (sel = 1, field_shift = 0; sel < filter_sel; sel <<= 1) { | ||
3752 | switch (filter_mode & sel) { | ||
3753 | case F_FCOE: | ||
3754 | field_shift += W_FT_FCOE; | ||
3755 | break; | ||
3756 | case F_PORT: | ||
3757 | field_shift += W_FT_PORT; | ||
3758 | break; | ||
3759 | case F_VNIC_ID: | ||
3760 | field_shift += W_FT_VNIC_ID; | ||
3761 | break; | ||
3762 | case F_VLAN: | ||
3763 | field_shift += W_FT_VLAN; | ||
3764 | break; | ||
3765 | case F_TOS: | ||
3766 | field_shift += W_FT_TOS; | ||
3767 | break; | ||
3768 | case F_PROTOCOL: | ||
3769 | field_shift += W_FT_PROTOCOL; | ||
3770 | break; | ||
3771 | case F_ETHERTYPE: | ||
3772 | field_shift += W_FT_ETHERTYPE; | ||
3773 | break; | ||
3774 | case F_MACMATCH: | ||
3775 | field_shift += W_FT_MACMATCH; | ||
3776 | break; | ||
3777 | case F_MPSHITTYPE: | ||
3778 | field_shift += W_FT_MPSHITTYPE; | ||
3779 | break; | ||
3780 | case F_FRAGMENTATION: | ||
3781 | field_shift += W_FT_FRAGMENTATION; | ||
3782 | break; | ||
3783 | } | ||
3784 | } | ||
3785 | return field_shift; | ||
3786 | } | ||
3787 | |||
3685 | int t4_port_init(struct adapter *adap, int mbox, int pf, int vf) | 3788 | int t4_port_init(struct adapter *adap, int mbox, int pf, int vf) |
3686 | { | 3789 | { |
3687 | u8 addr[6]; | 3790 | u8 addr[6]; |