1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2*4882a593Smuzhiyun /* Copyright (c) 2019-2020 Marvell International Ltd. */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef _QED_FCOE_IF_H 5*4882a593Smuzhiyun #define _QED_FCOE_IF_H 6*4882a593Smuzhiyun #include <linux/types.h> 7*4882a593Smuzhiyun #include <linux/qed/qed_if.h> 8*4882a593Smuzhiyun struct qed_fcoe_stats { 9*4882a593Smuzhiyun u64 fcoe_rx_byte_cnt; 10*4882a593Smuzhiyun u64 fcoe_rx_data_pkt_cnt; 11*4882a593Smuzhiyun u64 fcoe_rx_xfer_pkt_cnt; 12*4882a593Smuzhiyun u64 fcoe_rx_other_pkt_cnt; 13*4882a593Smuzhiyun u32 fcoe_silent_drop_pkt_cmdq_full_cnt; 14*4882a593Smuzhiyun u32 fcoe_silent_drop_pkt_rq_full_cnt; 15*4882a593Smuzhiyun u32 fcoe_silent_drop_pkt_crc_error_cnt; 16*4882a593Smuzhiyun u32 fcoe_silent_drop_pkt_task_invalid_cnt; 17*4882a593Smuzhiyun u32 fcoe_silent_drop_total_pkt_cnt; 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun u64 fcoe_tx_byte_cnt; 20*4882a593Smuzhiyun u64 fcoe_tx_data_pkt_cnt; 21*4882a593Smuzhiyun u64 fcoe_tx_xfer_pkt_cnt; 22*4882a593Smuzhiyun u64 fcoe_tx_other_pkt_cnt; 23*4882a593Smuzhiyun }; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct qed_dev_fcoe_info { 26*4882a593Smuzhiyun struct qed_dev_info common; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun void __iomem *primary_dbq_rq_addr; 29*4882a593Smuzhiyun void __iomem *secondary_bdq_rq_addr; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun u64 wwpn; 32*4882a593Smuzhiyun u64 wwnn; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun u8 num_cqs; 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun struct qed_fcoe_params_offload { 38*4882a593Smuzhiyun dma_addr_t sq_pbl_addr; 39*4882a593Smuzhiyun dma_addr_t sq_curr_page_addr; 40*4882a593Smuzhiyun dma_addr_t sq_next_page_addr; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun u8 src_mac[ETH_ALEN]; 43*4882a593Smuzhiyun u8 dst_mac[ETH_ALEN]; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun u16 tx_max_fc_pay_len; 46*4882a593Smuzhiyun u16 e_d_tov_timer_val; 47*4882a593Smuzhiyun u16 rec_tov_timer_val; 48*4882a593Smuzhiyun u16 rx_max_fc_pay_len; 49*4882a593Smuzhiyun u16 vlan_tag; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct fc_addr_nw s_id; 52*4882a593Smuzhiyun u8 max_conc_seqs_c3; 53*4882a593Smuzhiyun struct fc_addr_nw d_id; 54*4882a593Smuzhiyun u8 flags; 55*4882a593Smuzhiyun u8 def_q_idx; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define MAX_TID_BLOCKS_FCOE (512) 59*4882a593Smuzhiyun struct qed_fcoe_tid { 60*4882a593Smuzhiyun u32 size; /* In bytes per task */ 61*4882a593Smuzhiyun u32 num_tids_per_block; 62*4882a593Smuzhiyun u8 *blocks[MAX_TID_BLOCKS_FCOE]; 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun struct qed_fcoe_cb_ops { 66*4882a593Smuzhiyun struct qed_common_cb_ops common; 67*4882a593Smuzhiyun u32 (*get_login_failures)(void *cookie); 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun void qed_fcoe_set_pf_params(struct qed_dev *cdev, 71*4882a593Smuzhiyun struct qed_fcoe_pf_params *params); 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /** 74*4882a593Smuzhiyun * struct qed_fcoe_ops - qed FCoE operations. 75*4882a593Smuzhiyun * @common: common operations pointer 76*4882a593Smuzhiyun * @fill_dev_info: fills FCoE specific information 77*4882a593Smuzhiyun * @param cdev 78*4882a593Smuzhiyun * @param info 79*4882a593Smuzhiyun * @return 0 on sucesss, otherwise error value. 80*4882a593Smuzhiyun * @register_ops: register FCoE operations 81*4882a593Smuzhiyun * @param cdev 82*4882a593Smuzhiyun * @param ops - specified using qed_iscsi_cb_ops 83*4882a593Smuzhiyun * @param cookie - driver private 84*4882a593Smuzhiyun * @ll2: light L2 operations pointer 85*4882a593Smuzhiyun * @start: fcoe in FW 86*4882a593Smuzhiyun * @param cdev 87*4882a593Smuzhiyun * @param tasks - qed will fill information about tasks 88*4882a593Smuzhiyun * return 0 on success, otherwise error value. 89*4882a593Smuzhiyun * @stop: stops fcoe in FW 90*4882a593Smuzhiyun * @param cdev 91*4882a593Smuzhiyun * return 0 on success, otherwise error value. 92*4882a593Smuzhiyun * @acquire_conn: acquire a new fcoe connection 93*4882a593Smuzhiyun * @param cdev 94*4882a593Smuzhiyun * @param handle - qed will fill handle that should be 95*4882a593Smuzhiyun * used henceforth as identifier of the 96*4882a593Smuzhiyun * connection. 97*4882a593Smuzhiyun * @param p_doorbell - qed will fill the address of the 98*4882a593Smuzhiyun * doorbell. 99*4882a593Smuzhiyun * return 0 on sucesss, otherwise error value. 100*4882a593Smuzhiyun * @release_conn: release a previously acquired fcoe connection 101*4882a593Smuzhiyun * @param cdev 102*4882a593Smuzhiyun * @param handle - the connection handle. 103*4882a593Smuzhiyun * return 0 on success, otherwise error value. 104*4882a593Smuzhiyun * @offload_conn: configures an offloaded connection 105*4882a593Smuzhiyun * @param cdev 106*4882a593Smuzhiyun * @param handle - the connection handle. 107*4882a593Smuzhiyun * @param conn_info - the configuration to use for the 108*4882a593Smuzhiyun * offload. 109*4882a593Smuzhiyun * return 0 on success, otherwise error value. 110*4882a593Smuzhiyun * @destroy_conn: stops an offloaded connection 111*4882a593Smuzhiyun * @param cdev 112*4882a593Smuzhiyun * @param handle - the connection handle. 113*4882a593Smuzhiyun * @param terminate_params 114*4882a593Smuzhiyun * return 0 on success, otherwise error value. 115*4882a593Smuzhiyun * @get_stats: gets FCoE related statistics 116*4882a593Smuzhiyun * @param cdev 117*4882a593Smuzhiyun * @param stats - pointer to struck that would be filled 118*4882a593Smuzhiyun * we stats 119*4882a593Smuzhiyun * return 0 on success, error otherwise. 120*4882a593Smuzhiyun */ 121*4882a593Smuzhiyun struct qed_fcoe_ops { 122*4882a593Smuzhiyun const struct qed_common_ops *common; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun int (*fill_dev_info)(struct qed_dev *cdev, 125*4882a593Smuzhiyun struct qed_dev_fcoe_info *info); 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun void (*register_ops)(struct qed_dev *cdev, 128*4882a593Smuzhiyun struct qed_fcoe_cb_ops *ops, void *cookie); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun const struct qed_ll2_ops *ll2; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun int (*start)(struct qed_dev *cdev, struct qed_fcoe_tid *tasks); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun int (*stop)(struct qed_dev *cdev); 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun int (*acquire_conn)(struct qed_dev *cdev, 137*4882a593Smuzhiyun u32 *handle, 138*4882a593Smuzhiyun u32 *fw_cid, void __iomem **p_doorbell); 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun int (*release_conn)(struct qed_dev *cdev, u32 handle); 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun int (*offload_conn)(struct qed_dev *cdev, 143*4882a593Smuzhiyun u32 handle, 144*4882a593Smuzhiyun struct qed_fcoe_params_offload *conn_info); 145*4882a593Smuzhiyun int (*destroy_conn)(struct qed_dev *cdev, 146*4882a593Smuzhiyun u32 handle, dma_addr_t terminate_params); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun int (*get_stats)(struct qed_dev *cdev, struct qed_fcoe_stats *stats); 149*4882a593Smuzhiyun }; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun const struct qed_fcoe_ops *qed_get_fcoe_ops(void); 152*4882a593Smuzhiyun void qed_put_fcoe_ops(void); 153*4882a593Smuzhiyun #endif 154