diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice.h | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_adminq_cmd.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_common.c | 22 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_controlq.c | 46 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_controlq.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_hw_autogen.h | 21 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 47 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_type.h | 7 |
8 files changed, 151 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h index 0b269c470343..639d45d1da49 100644 --- a/drivers/net/ethernet/intel/ice/ice.h +++ b/drivers/net/ethernet/intel/ice/ice.h | |||
| @@ -46,6 +46,7 @@ extern const char ice_drv_ver[]; | |||
| 46 | #define ICE_INT_NAME_STR_LEN (IFNAMSIZ + 16) | 46 | #define ICE_INT_NAME_STR_LEN (IFNAMSIZ + 16) |
| 47 | #define ICE_ETHTOOL_FWVER_LEN 32 | 47 | #define ICE_ETHTOOL_FWVER_LEN 32 |
| 48 | #define ICE_AQ_LEN 64 | 48 | #define ICE_AQ_LEN 64 |
| 49 | #define ICE_MBXQ_LEN 64 | ||
| 49 | #define ICE_MIN_MSIX 2 | 50 | #define ICE_MIN_MSIX 2 |
| 50 | #define ICE_NO_VSI 0xffff | 51 | #define ICE_NO_VSI 0xffff |
| 51 | #define ICE_MAX_VSI_ALLOC 130 | 52 | #define ICE_MAX_VSI_ALLOC 130 |
| @@ -63,6 +64,7 @@ extern const char ice_drv_ver[]; | |||
| 63 | #define ICE_RES_MISC_VEC_ID (ICE_RES_VALID_BIT - 1) | 64 | #define ICE_RES_MISC_VEC_ID (ICE_RES_VALID_BIT - 1) |
| 64 | #define ICE_INVAL_Q_INDEX 0xffff | 65 | #define ICE_INVAL_Q_INDEX 0xffff |
| 65 | #define ICE_INVAL_VFID 256 | 66 | #define ICE_INVAL_VFID 256 |
| 67 | #define ICE_MAX_VF_COUNT 256 | ||
| 66 | 68 | ||
| 67 | #define ICE_VSIQF_HKEY_ARRAY_SIZE ((VSIQF_HKEY_MAX_INDEX + 1) * 4) | 69 | #define ICE_VSIQF_HKEY_ARRAY_SIZE ((VSIQF_HKEY_MAX_INDEX + 1) * 4) |
| 68 | 70 | ||
| @@ -134,6 +136,7 @@ enum ice_state { | |||
| 134 | __ICE_SUSPENDED, /* set on module remove path */ | 136 | __ICE_SUSPENDED, /* set on module remove path */ |
| 135 | __ICE_RESET_FAILED, /* set by reset/rebuild */ | 137 | __ICE_RESET_FAILED, /* set by reset/rebuild */ |
| 136 | __ICE_ADMINQ_EVENT_PENDING, | 138 | __ICE_ADMINQ_EVENT_PENDING, |
| 139 | __ICE_MAILBOXQ_EVENT_PENDING, | ||
| 137 | __ICE_MDD_EVENT_PENDING, | 140 | __ICE_MDD_EVENT_PENDING, |
| 138 | __ICE_FLTR_OVERFLOW_PROMISC, | 141 | __ICE_FLTR_OVERFLOW_PROMISC, |
| 139 | __ICE_CFG_BUSY, | 142 | __ICE_CFG_BUSY, |
| @@ -240,6 +243,7 @@ enum ice_pf_flags { | |||
| 240 | ICE_FLAG_MSIX_ENA, | 243 | ICE_FLAG_MSIX_ENA, |
| 241 | ICE_FLAG_FLTR_SYNC, | 244 | ICE_FLAG_FLTR_SYNC, |
| 242 | ICE_FLAG_RSS_ENA, | 245 | ICE_FLAG_RSS_ENA, |
| 246 | ICE_FLAG_SRIOV_CAPABLE, | ||
| 243 | ICE_PF_FLAGS_NBITS /* must be last */ | 247 | ICE_PF_FLAGS_NBITS /* must be last */ |
| 244 | }; | 248 | }; |
| 245 | 249 | ||
| @@ -255,6 +259,7 @@ struct ice_pf { | |||
| 255 | 259 | ||
| 256 | struct ice_vsi **vsi; /* VSIs created by the driver */ | 260 | struct ice_vsi **vsi; /* VSIs created by the driver */ |
| 257 | struct ice_sw *first_sw; /* first switch created by firmware */ | 261 | struct ice_sw *first_sw; /* first switch created by firmware */ |
| 262 | u16 num_vfs_supported; /* num VFs supported for this PF */ | ||
| 258 | DECLARE_BITMAP(state, __ICE_STATE_NBITS); | 263 | DECLARE_BITMAP(state, __ICE_STATE_NBITS); |
| 259 | DECLARE_BITMAP(avail_txqs, ICE_MAX_TXQS); | 264 | DECLARE_BITMAP(avail_txqs, ICE_MAX_TXQS); |
| 260 | DECLARE_BITMAP(avail_rxqs, ICE_MAX_RXQS); | 265 | DECLARE_BITMAP(avail_rxqs, ICE_MAX_RXQS); |
diff --git a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h index c100b4bda195..7d793cc96a18 100644 --- a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h +++ b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h | |||
| @@ -87,6 +87,8 @@ struct ice_aqc_list_caps { | |||
| 87 | /* Device/Function buffer entry, repeated per reported capability */ | 87 | /* Device/Function buffer entry, repeated per reported capability */ |
| 88 | struct ice_aqc_list_caps_elem { | 88 | struct ice_aqc_list_caps_elem { |
| 89 | __le16 cap; | 89 | __le16 cap; |
| 90 | #define ICE_AQC_CAPS_SRIOV 0x0012 | ||
| 91 | #define ICE_AQC_CAPS_VF 0x0013 | ||
| 90 | #define ICE_AQC_CAPS_VSI 0x0017 | 92 | #define ICE_AQC_CAPS_VSI 0x0017 |
| 91 | #define ICE_AQC_CAPS_RSS 0x0040 | 93 | #define ICE_AQC_CAPS_RSS 0x0040 |
| 92 | #define ICE_AQC_CAPS_RXQS 0x0041 | 94 | #define ICE_AQC_CAPS_RXQS 0x0041 |
diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c index 68fbbb92d504..0fe054e4bfb8 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.c +++ b/drivers/net/ethernet/intel/ice/ice_common.c | |||
| @@ -1406,6 +1406,28 @@ ice_parse_caps(struct ice_hw *hw, void *buf, u32 cap_count, | |||
| 1406 | u16 cap = le16_to_cpu(cap_resp->cap); | 1406 | u16 cap = le16_to_cpu(cap_resp->cap); |
| 1407 | 1407 | ||
| 1408 | switch (cap) { | 1408 | switch (cap) { |
| 1409 | case ICE_AQC_CAPS_SRIOV: | ||
| 1410 | caps->sr_iov_1_1 = (number == 1); | ||
| 1411 | ice_debug(hw, ICE_DBG_INIT, | ||
| 1412 | "HW caps: SR-IOV = %d\n", caps->sr_iov_1_1); | ||
| 1413 | break; | ||
| 1414 | case ICE_AQC_CAPS_VF: | ||
| 1415 | if (dev_p) { | ||
| 1416 | dev_p->num_vfs_exposed = number; | ||
| 1417 | ice_debug(hw, ICE_DBG_INIT, | ||
| 1418 | "HW caps: VFs exposed = %d\n", | ||
| 1419 | dev_p->num_vfs_exposed); | ||
| 1420 | } else if (func_p) { | ||
| 1421 | func_p->num_allocd_vfs = number; | ||
| 1422 | func_p->vf_base_id = logical_id; | ||
| 1423 | ice_debug(hw, ICE_DBG_INIT, | ||
| 1424 | "HW caps: VFs allocated = %d\n", | ||
| 1425 | func_p->num_allocd_vfs); | ||
| 1426 | ice_debug(hw, ICE_DBG_INIT, | ||
| 1427 | "HW caps: VF base_id = %d\n", | ||
| 1428 | func_p->vf_base_id); | ||
| 1429 | } | ||
| 1430 | break; | ||
| 1409 | case ICE_AQC_CAPS_VSI: | 1431 | case ICE_AQC_CAPS_VSI: |
| 1410 | if (dev_p) { | 1432 | if (dev_p) { |
| 1411 | dev_p->num_vsi_allocd_to_host = number; | 1433 | dev_p->num_vsi_allocd_to_host = number; |
diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.c b/drivers/net/ethernet/intel/ice/ice_controlq.c index b25ce4f587f5..84c967294eaf 100644 --- a/drivers/net/ethernet/intel/ice/ice_controlq.c +++ b/drivers/net/ethernet/intel/ice/ice_controlq.c | |||
| @@ -33,6 +33,36 @@ static void ice_adminq_init_regs(struct ice_hw *hw) | |||
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | /** | 35 | /** |
| 36 | * ice_mailbox_init_regs - Initialize Mailbox registers | ||
| 37 | * @hw: pointer to the hardware structure | ||
| 38 | * | ||
| 39 | * This assumes the alloc_sq and alloc_rq functions have already been called | ||
| 40 | */ | ||
| 41 | static void ice_mailbox_init_regs(struct ice_hw *hw) | ||
| 42 | { | ||
| 43 | struct ice_ctl_q_info *cq = &hw->mailboxq; | ||
| 44 | |||
| 45 | /* set head and tail registers in our local struct */ | ||
| 46 | cq->sq.head = PF_MBX_ATQH; | ||
| 47 | cq->sq.tail = PF_MBX_ATQT; | ||
| 48 | cq->sq.len = PF_MBX_ATQLEN; | ||
| 49 | cq->sq.bah = PF_MBX_ATQBAH; | ||
| 50 | cq->sq.bal = PF_MBX_ATQBAL; | ||
| 51 | cq->sq.len_mask = PF_MBX_ATQLEN_ATQLEN_M; | ||
| 52 | cq->sq.len_ena_mask = PF_MBX_ATQLEN_ATQENABLE_M; | ||
| 53 | cq->sq.head_mask = PF_MBX_ATQH_ATQH_M; | ||
| 54 | |||
| 55 | cq->rq.head = PF_MBX_ARQH; | ||
| 56 | cq->rq.tail = PF_MBX_ARQT; | ||
| 57 | cq->rq.len = PF_MBX_ARQLEN; | ||
| 58 | cq->rq.bah = PF_MBX_ARQBAH; | ||
| 59 | cq->rq.bal = PF_MBX_ARQBAL; | ||
| 60 | cq->rq.len_mask = PF_MBX_ARQLEN_ARQLEN_M; | ||
| 61 | cq->rq.len_ena_mask = PF_MBX_ARQLEN_ARQENABLE_M; | ||
| 62 | cq->rq.head_mask = PF_MBX_ARQH_ARQH_M; | ||
| 63 | } | ||
| 64 | |||
| 65 | /** | ||
| 36 | * ice_check_sq_alive | 66 | * ice_check_sq_alive |
| 37 | * @hw: pointer to the hw struct | 67 | * @hw: pointer to the hw struct |
| 38 | * @cq: pointer to the specific Control queue | 68 | * @cq: pointer to the specific Control queue |
| @@ -639,6 +669,10 @@ static enum ice_status ice_init_ctrlq(struct ice_hw *hw, enum ice_ctl_q q_type) | |||
| 639 | ice_adminq_init_regs(hw); | 669 | ice_adminq_init_regs(hw); |
| 640 | cq = &hw->adminq; | 670 | cq = &hw->adminq; |
| 641 | break; | 671 | break; |
| 672 | case ICE_CTL_Q_MAILBOX: | ||
| 673 | ice_mailbox_init_regs(hw); | ||
| 674 | cq = &hw->mailboxq; | ||
| 675 | break; | ||
| 642 | default: | 676 | default: |
| 643 | return ICE_ERR_PARAM; | 677 | return ICE_ERR_PARAM; |
| 644 | } | 678 | } |
| @@ -696,7 +730,12 @@ enum ice_status ice_init_all_ctrlq(struct ice_hw *hw) | |||
| 696 | if (ret_code) | 730 | if (ret_code) |
| 697 | return ret_code; | 731 | return ret_code; |
| 698 | 732 | ||
| 699 | return ice_init_check_adminq(hw); | 733 | ret_code = ice_init_check_adminq(hw); |
| 734 | if (ret_code) | ||
| 735 | return ret_code; | ||
| 736 | |||
| 737 | /* Init Mailbox queue */ | ||
| 738 | return ice_init_ctrlq(hw, ICE_CTL_Q_MAILBOX); | ||
| 700 | } | 739 | } |
| 701 | 740 | ||
| 702 | /** | 741 | /** |
| @@ -714,6 +753,9 @@ static void ice_shutdown_ctrlq(struct ice_hw *hw, enum ice_ctl_q q_type) | |||
| 714 | if (ice_check_sq_alive(hw, cq)) | 753 | if (ice_check_sq_alive(hw, cq)) |
| 715 | ice_aq_q_shutdown(hw, true); | 754 | ice_aq_q_shutdown(hw, true); |
| 716 | break; | 755 | break; |
| 756 | case ICE_CTL_Q_MAILBOX: | ||
| 757 | cq = &hw->mailboxq; | ||
| 758 | break; | ||
| 717 | default: | 759 | default: |
| 718 | return; | 760 | return; |
| 719 | } | 761 | } |
| @@ -736,6 +778,8 @@ void ice_shutdown_all_ctrlq(struct ice_hw *hw) | |||
| 736 | { | 778 | { |
| 737 | /* Shutdown FW admin queue */ | 779 | /* Shutdown FW admin queue */ |
| 738 | ice_shutdown_ctrlq(hw, ICE_CTL_Q_ADMIN); | 780 | ice_shutdown_ctrlq(hw, ICE_CTL_Q_ADMIN); |
| 781 | /* Shutdown PF-VF Mailbox */ | ||
| 782 | ice_shutdown_ctrlq(hw, ICE_CTL_Q_MAILBOX); | ||
| 739 | } | 783 | } |
| 740 | 784 | ||
| 741 | /** | 785 | /** |
diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.h b/drivers/net/ethernet/intel/ice/ice_controlq.h index ea02b89243e2..437f832fd7c4 100644 --- a/drivers/net/ethernet/intel/ice/ice_controlq.h +++ b/drivers/net/ethernet/intel/ice/ice_controlq.h | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | 8 | ||
| 9 | /* Maximum buffer lengths for all control queue types */ | 9 | /* Maximum buffer lengths for all control queue types */ |
| 10 | #define ICE_AQ_MAX_BUF_LEN 4096 | 10 | #define ICE_AQ_MAX_BUF_LEN 4096 |
| 11 | #define ICE_MBXQ_MAX_BUF_LEN 4096 | ||
| 11 | 12 | ||
| 12 | #define ICE_CTL_Q_DESC(R, i) \ | 13 | #define ICE_CTL_Q_DESC(R, i) \ |
| 13 | (&(((struct ice_aq_desc *)((R).desc_buf.va))[i])) | 14 | (&(((struct ice_aq_desc *)((R).desc_buf.va))[i])) |
| @@ -28,6 +29,7 @@ | |||
| 28 | enum ice_ctl_q { | 29 | enum ice_ctl_q { |
| 29 | ICE_CTL_Q_UNKNOWN = 0, | 30 | ICE_CTL_Q_UNKNOWN = 0, |
| 30 | ICE_CTL_Q_ADMIN, | 31 | ICE_CTL_Q_ADMIN, |
| 32 | ICE_CTL_Q_MAILBOX, | ||
| 31 | }; | 33 | }; |
| 32 | 34 | ||
| 33 | /* Control Queue default settings */ | 35 | /* Control Queue default settings */ |
diff --git a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h index 9a78d83eaa3e..c2d867b756ef 100644 --- a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h +++ b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h | |||
| @@ -29,6 +29,22 @@ | |||
| 29 | #define PF_FW_ATQLEN_ATQCRIT_M BIT(30) | 29 | #define PF_FW_ATQLEN_ATQCRIT_M BIT(30) |
| 30 | #define PF_FW_ATQLEN_ATQENABLE_M BIT(31) | 30 | #define PF_FW_ATQLEN_ATQENABLE_M BIT(31) |
| 31 | #define PF_FW_ATQT 0x00080400 | 31 | #define PF_FW_ATQT 0x00080400 |
| 32 | #define PF_MBX_ARQBAH 0x0022E400 | ||
| 33 | #define PF_MBX_ARQBAL 0x0022E380 | ||
| 34 | #define PF_MBX_ARQH 0x0022E500 | ||
| 35 | #define PF_MBX_ARQH_ARQH_M ICE_M(0x3FF, 0) | ||
| 36 | #define PF_MBX_ARQLEN 0x0022E480 | ||
| 37 | #define PF_MBX_ARQLEN_ARQLEN_M ICE_M(0x3FF, 0) | ||
| 38 | #define PF_MBX_ARQLEN_ARQENABLE_M BIT(31) | ||
| 39 | #define PF_MBX_ARQT 0x0022E580 | ||
| 40 | #define PF_MBX_ATQBAH 0x0022E180 | ||
| 41 | #define PF_MBX_ATQBAL 0x0022E100 | ||
| 42 | #define PF_MBX_ATQH 0x0022E280 | ||
| 43 | #define PF_MBX_ATQH_ATQH_M ICE_M(0x3FF, 0) | ||
| 44 | #define PF_MBX_ATQLEN 0x0022E200 | ||
| 45 | #define PF_MBX_ATQLEN_ATQLEN_M ICE_M(0x3FF, 0) | ||
| 46 | #define PF_MBX_ATQLEN_ATQENABLE_M BIT(31) | ||
| 47 | #define PF_MBX_ATQT 0x0022E300 | ||
| 32 | #define GLFLXP_RXDID_FLAGS(_i, _j) (0x0045D000 + ((_i) * 4 + (_j) * 256)) | 48 | #define GLFLXP_RXDID_FLAGS(_i, _j) (0x0045D000 + ((_i) * 4 + (_j) * 256)) |
| 33 | #define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_S 0 | 49 | #define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_S 0 |
| 34 | #define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_M ICE_M(0x3F, 0) | 50 | #define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_M ICE_M(0x3F, 0) |
| @@ -95,6 +111,11 @@ | |||
| 95 | #define PFINT_FW_CTL_ITR_INDX_S 11 | 111 | #define PFINT_FW_CTL_ITR_INDX_S 11 |
| 96 | #define PFINT_FW_CTL_ITR_INDX_M ICE_M(0x3, 11) | 112 | #define PFINT_FW_CTL_ITR_INDX_M ICE_M(0x3, 11) |
| 97 | #define PFINT_FW_CTL_CAUSE_ENA_M BIT(30) | 113 | #define PFINT_FW_CTL_CAUSE_ENA_M BIT(30) |
| 114 | #define PFINT_MBX_CTL 0x0016B280 | ||
| 115 | #define PFINT_MBX_CTL_MSIX_INDX_M ICE_M(0x7FF, 0) | ||
| 116 | #define PFINT_MBX_CTL_ITR_INDX_S 11 | ||
| 117 | #define PFINT_MBX_CTL_ITR_INDX_M ICE_M(0x3, 11) | ||
| 118 | #define PFINT_MBX_CTL_CAUSE_ENA_M BIT(30) | ||
| 98 | #define PFINT_OICR 0x0016CA00 | 119 | #define PFINT_OICR 0x0016CA00 |
| 99 | #define PFINT_OICR_ECC_ERR_M BIT(16) | 120 | #define PFINT_OICR_ECC_ERR_M BIT(16) |
| 100 | #define PFINT_OICR_MAL_DETECT_M BIT(19) | 121 | #define PFINT_OICR_MAL_DETECT_M BIT(19) |
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index 46ccf265c218..3fd3bb783707 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c | |||
| @@ -711,6 +711,10 @@ static int __ice_clean_ctrlq(struct ice_pf *pf, enum ice_ctl_q q_type) | |||
| 711 | cq = &hw->adminq; | 711 | cq = &hw->adminq; |
| 712 | qtype = "Admin"; | 712 | qtype = "Admin"; |
| 713 | break; | 713 | break; |
| 714 | case ICE_CTL_Q_MAILBOX: | ||
| 715 | cq = &hw->mailboxq; | ||
| 716 | qtype = "Mailbox"; | ||
| 717 | break; | ||
| 714 | default: | 718 | default: |
| 715 | dev_warn(&pf->pdev->dev, "Unknown control queue type 0x%x\n", | 719 | dev_warn(&pf->pdev->dev, "Unknown control queue type 0x%x\n", |
| 716 | q_type); | 720 | q_type); |
| @@ -851,6 +855,28 @@ static void ice_clean_adminq_subtask(struct ice_pf *pf) | |||
| 851 | } | 855 | } |
| 852 | 856 | ||
| 853 | /** | 857 | /** |
| 858 | * ice_clean_mailboxq_subtask - clean the MailboxQ rings | ||
| 859 | * @pf: board private structure | ||
| 860 | */ | ||
| 861 | static void ice_clean_mailboxq_subtask(struct ice_pf *pf) | ||
| 862 | { | ||
| 863 | struct ice_hw *hw = &pf->hw; | ||
| 864 | |||
| 865 | if (!test_bit(__ICE_MAILBOXQ_EVENT_PENDING, pf->state)) | ||
| 866 | return; | ||
| 867 | |||
| 868 | if (__ice_clean_ctrlq(pf, ICE_CTL_Q_MAILBOX)) | ||
| 869 | return; | ||
| 870 | |||
| 871 | clear_bit(__ICE_MAILBOXQ_EVENT_PENDING, pf->state); | ||
| 872 | |||
| 873 | if (ice_ctrlq_pending(hw, &hw->mailboxq)) | ||
| 874 | __ice_clean_ctrlq(pf, ICE_CTL_Q_MAILBOX); | ||
| 875 | |||
| 876 | ice_flush(hw); | ||
| 877 | } | ||
| 878 | |||
| 879 | /** | ||
| 854 | * ice_service_task_schedule - schedule the service task to wake up | 880 | * ice_service_task_schedule - schedule the service task to wake up |
| 855 | * @pf: board private structure | 881 | * @pf: board private structure |
| 856 | * | 882 | * |
| @@ -1040,6 +1066,7 @@ static void ice_service_task(struct work_struct *work) | |||
| 1040 | ice_handle_mdd_event(pf); | 1066 | ice_handle_mdd_event(pf); |
| 1041 | ice_watchdog_subtask(pf); | 1067 | ice_watchdog_subtask(pf); |
| 1042 | ice_clean_adminq_subtask(pf); | 1068 | ice_clean_adminq_subtask(pf); |
| 1069 | ice_clean_mailboxq_subtask(pf); | ||
| 1043 | 1070 | ||
| 1044 | /* Clear __ICE_SERVICE_SCHED flag to allow scheduling next event */ | 1071 | /* Clear __ICE_SERVICE_SCHED flag to allow scheduling next event */ |
| 1045 | ice_service_task_complete(pf); | 1072 | ice_service_task_complete(pf); |
| @@ -1050,6 +1077,7 @@ static void ice_service_task(struct work_struct *work) | |||
| 1050 | */ | 1077 | */ |
| 1051 | if (time_after(jiffies, (start_time + pf->serv_tmr_period)) || | 1078 | if (time_after(jiffies, (start_time + pf->serv_tmr_period)) || |
| 1052 | test_bit(__ICE_MDD_EVENT_PENDING, pf->state) || | 1079 | test_bit(__ICE_MDD_EVENT_PENDING, pf->state) || |
| 1080 | test_bit(__ICE_MAILBOXQ_EVENT_PENDING, pf->state) || | ||
| 1053 | test_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state)) | 1081 | test_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state)) |
| 1054 | mod_timer(&pf->serv_tmr, jiffies); | 1082 | mod_timer(&pf->serv_tmr, jiffies); |
| 1055 | } | 1083 | } |
| @@ -1064,6 +1092,10 @@ static void ice_set_ctrlq_len(struct ice_hw *hw) | |||
| 1064 | hw->adminq.num_sq_entries = ICE_AQ_LEN; | 1092 | hw->adminq.num_sq_entries = ICE_AQ_LEN; |
| 1065 | hw->adminq.rq_buf_size = ICE_AQ_MAX_BUF_LEN; | 1093 | hw->adminq.rq_buf_size = ICE_AQ_MAX_BUF_LEN; |
| 1066 | hw->adminq.sq_buf_size = ICE_AQ_MAX_BUF_LEN; | 1094 | hw->adminq.sq_buf_size = ICE_AQ_MAX_BUF_LEN; |
| 1095 | hw->mailboxq.num_rq_entries = ICE_MBXQ_LEN; | ||
| 1096 | hw->mailboxq.num_sq_entries = ICE_MBXQ_LEN; | ||
| 1097 | hw->mailboxq.rq_buf_size = ICE_MBXQ_MAX_BUF_LEN; | ||
| 1098 | hw->mailboxq.sq_buf_size = ICE_MBXQ_MAX_BUF_LEN; | ||
| 1067 | } | 1099 | } |
| 1068 | 1100 | ||
| 1069 | /** | 1101 | /** |
| @@ -1220,6 +1252,7 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data) | |||
| 1220 | u32 oicr, ena_mask; | 1252 | u32 oicr, ena_mask; |
| 1221 | 1253 | ||
| 1222 | set_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state); | 1254 | set_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state); |
| 1255 | set_bit(__ICE_MAILBOXQ_EVENT_PENDING, pf->state); | ||
| 1223 | 1256 | ||
| 1224 | oicr = rd32(hw, PFINT_OICR); | 1257 | oicr = rd32(hw, PFINT_OICR); |
| 1225 | ena_mask = rd32(hw, PFINT_OICR_ENA); | 1258 | ena_mask = rd32(hw, PFINT_OICR_ENA); |
| @@ -1406,6 +1439,11 @@ skip_req_irq: | |||
| 1406 | PFINT_FW_CTL_CAUSE_ENA_M); | 1439 | PFINT_FW_CTL_CAUSE_ENA_M); |
| 1407 | wr32(hw, PFINT_FW_CTL, val); | 1440 | wr32(hw, PFINT_FW_CTL, val); |
| 1408 | 1441 | ||
| 1442 | /* This enables Mailbox queue Interrupt causes */ | ||
| 1443 | val = ((pf->hw_oicr_idx & PFINT_MBX_CTL_MSIX_INDX_M) | | ||
| 1444 | PFINT_MBX_CTL_CAUSE_ENA_M); | ||
| 1445 | wr32(hw, PFINT_MBX_CTL, val); | ||
| 1446 | |||
| 1409 | itr_gran = hw->itr_gran; | 1447 | itr_gran = hw->itr_gran; |
| 1410 | 1448 | ||
| 1411 | wr32(hw, GLINT_ITR(ICE_RX_ITR, pf->hw_oicr_idx), | 1449 | wr32(hw, GLINT_ITR(ICE_RX_ITR, pf->hw_oicr_idx), |
| @@ -1775,6 +1813,15 @@ static void ice_init_pf(struct ice_pf *pf) | |||
| 1775 | { | 1813 | { |
| 1776 | bitmap_zero(pf->flags, ICE_PF_FLAGS_NBITS); | 1814 | bitmap_zero(pf->flags, ICE_PF_FLAGS_NBITS); |
| 1777 | set_bit(ICE_FLAG_MSIX_ENA, pf->flags); | 1815 | set_bit(ICE_FLAG_MSIX_ENA, pf->flags); |
| 1816 | #ifdef CONFIG_PCI_IOV | ||
| 1817 | if (pf->hw.func_caps.common_cap.sr_iov_1_1) { | ||
| 1818 | struct ice_hw *hw = &pf->hw; | ||
| 1819 | |||
| 1820 | set_bit(ICE_FLAG_SRIOV_CAPABLE, pf->flags); | ||
| 1821 | pf->num_vfs_supported = min_t(int, hw->func_caps.num_allocd_vfs, | ||
| 1822 | ICE_MAX_VF_COUNT); | ||
| 1823 | } | ||
| 1824 | #endif /* CONFIG_PCI_IOV */ | ||
| 1778 | 1825 | ||
| 1779 | mutex_init(&pf->sw_mutex); | 1826 | mutex_init(&pf->sw_mutex); |
| 1780 | mutex_init(&pf->avail_q_mutex); | 1827 | mutex_init(&pf->avail_q_mutex); |
diff --git a/drivers/net/ethernet/intel/ice/ice_type.h b/drivers/net/ethernet/intel/ice/ice_type.h index f5c8de0ed0eb..6d053fb5f941 100644 --- a/drivers/net/ethernet/intel/ice/ice_type.h +++ b/drivers/net/ethernet/intel/ice/ice_type.h | |||
| @@ -84,6 +84,7 @@ enum ice_media_type { | |||
| 84 | 84 | ||
| 85 | enum ice_vsi_type { | 85 | enum ice_vsi_type { |
| 86 | ICE_VSI_PF = 0, | 86 | ICE_VSI_PF = 0, |
| 87 | ICE_VSI_VF, | ||
| 87 | }; | 88 | }; |
| 88 | 89 | ||
| 89 | struct ice_link_status { | 90 | struct ice_link_status { |
| @@ -127,6 +128,8 @@ struct ice_hw_common_caps { | |||
| 127 | /* Max MTU for function or device */ | 128 | /* Max MTU for function or device */ |
| 128 | u16 max_mtu; | 129 | u16 max_mtu; |
| 129 | 130 | ||
| 131 | /* Virtualization support */ | ||
| 132 | u8 sr_iov_1_1; /* SR-IOV enabled */ | ||
| 130 | /* RSS related capabilities */ | 133 | /* RSS related capabilities */ |
| 131 | u16 rss_table_size; /* 512 for PFs and 64 for VFs */ | 134 | u16 rss_table_size; /* 512 for PFs and 64 for VFs */ |
| 132 | u8 rss_table_entry_width; /* RSS Entry width in bits */ | 135 | u8 rss_table_entry_width; /* RSS Entry width in bits */ |
| @@ -135,12 +138,15 @@ struct ice_hw_common_caps { | |||
| 135 | /* Function specific capabilities */ | 138 | /* Function specific capabilities */ |
| 136 | struct ice_hw_func_caps { | 139 | struct ice_hw_func_caps { |
| 137 | struct ice_hw_common_caps common_cap; | 140 | struct ice_hw_common_caps common_cap; |
| 141 | u32 num_allocd_vfs; /* Number of allocated VFs */ | ||
| 142 | u32 vf_base_id; /* Logical ID of the first VF */ | ||
| 138 | u32 guaranteed_num_vsi; | 143 | u32 guaranteed_num_vsi; |
| 139 | }; | 144 | }; |
| 140 | 145 | ||
| 141 | /* Device wide capabilities */ | 146 | /* Device wide capabilities */ |
| 142 | struct ice_hw_dev_caps { | 147 | struct ice_hw_dev_caps { |
| 143 | struct ice_hw_common_caps common_cap; | 148 | struct ice_hw_common_caps common_cap; |
| 149 | u32 num_vfs_exposed; /* Total number of VFs exposed */ | ||
| 144 | u32 num_vsi_allocd_to_host; /* Excluding EMP VSI */ | 150 | u32 num_vsi_allocd_to_host; /* Excluding EMP VSI */ |
| 145 | }; | 151 | }; |
| 146 | 152 | ||
| @@ -321,6 +327,7 @@ struct ice_hw { | |||
| 321 | 327 | ||
| 322 | /* Control Queue info */ | 328 | /* Control Queue info */ |
| 323 | struct ice_ctl_q_info adminq; | 329 | struct ice_ctl_q_info adminq; |
| 330 | struct ice_ctl_q_info mailboxq; | ||
| 324 | 331 | ||
| 325 | u8 api_branch; /* API branch version */ | 332 | u8 api_branch; /* API branch version */ |
| 326 | u8 api_maj_ver; /* API major version */ | 333 | u8 api_maj_ver; /* API major version */ |
