be2iscsi: Enabling msix, mcc_rings and Ringmode WRB V3
Subsystems (2)
Hi
I am sending two patches.
1) The first patch enables msix for be2iscsi. It also enables use of mcc_rings for fw commands.
2) The second patch enables RIng Mode WRB support
The patch was built on latest Linus tree pulled today. I request that these patches be applied to the next release
Thanks
Jay
Signed-off-by Jayamohan Kallickal <[email protected]>
--- drivers/scsi/be2iscsi/be.h | 24 +- drivers/scsi/be2iscsi/be_cmds.c | 263 ++++++++++-- drivers/scsi/be2iscsi/be_cmds.h | 37 ++- drivers/scsi/be2iscsi/be_iscsi.c | 23 +- drivers/scsi/be2iscsi/be_main.c | 888 ++++++++++++++++++++++++++++---------- drivers/scsi/be2iscsi/be_main.h | 49 ++- drivers/scsi/be2iscsi/be_mgmt.c | 69 +++- drivers/scsi/be2iscsi/be_mgmt.h | 8 +- 8 files changed, 1030 insertions(+), 331 deletions(-)
drivers/scsi/be2iscsi/be.h +9 -15
@@ -20,8 +20,10 @@#include <linux/pci.h> #include <linux/if_vlan.h> - -#define FW_VER_LEN 32 +#include <linux/blk-iopoll.h> +#define FW_VER_LEN 32 +#define MCC_Q_LEN 128 +#define MCC_CQ_LEN 256struct be_dma_mem {void *va;
@@ -74,18 +76,14 @@ static inline void queue_tail_inc(struct be_queue_info *q)struct be_eq_obj {struct be_queue_info q; -char desc[32 ]; - -/* Adaptive interrupt coalescing (AIC) info */ -bool enable_aic; -u16 min_eqd;/* in usecs */ -u16 max_eqd;/* in usecs */ -u16 cur_eqd;/* in usecs */ +struct beiscsi_hba *phba; +struct be_queue_info *cq; +struct blk_iopoll iopoll; };struct be_mcc_obj { -struct be_queue_info *q; -struct be_queue_info *cq; +struct be_queue_info q; +struct be_queue_info cq; };struct be_ctrl_info {
@@ -176,8 +174,4 @@ static inline void swap_dws(void *wrb, int len) } while (len);#endif /* __BIG_ENDIAN */ } - -extern void beiscsi_cq_notify (struct be_ctrl_info *ctrl,u16 qid,bool arm, -u16 num_popped); -#endif /* BEISCSI_H */
drivers/scsi/be2iscsi/be_cmds.c +234 -29
359 lines not on this page · raw message
drivers/scsi/be2iscsi/be_cmds.h +31 -6
@@ -47,6 +47,8 @@ struct be_mcc_wrb {#define CQE_FLAGS_VALID_MASK (1 << 31)#define CQE_FLAGS_ASYNC_MASK (1 << 30) +#define CQE_FLAGS_COMPLETED_MASK (1 << 28) +#define CQE_FLAGS_CONSUMED_MASK (1 << 27)/* Completion Status */ #define MCC_STATUS_SUCCESS 0x0
@@ -173,7 +175,7 @@ struct be_cmd_req_hdr {u8 domain;/* dword 0 */ u32 timeout;/* dword 1 */ u32 request_length;/* dword 2 */ -u32 rsvd;/* dword 3 */ +u32 rsvd0;/* dword 3 */ };struct be_cmd_resp_hdr {
@@ -382,7 +384,6 @@ struct be_cmd_req_modify_eq_delay {#define ETH_ALEN 6 -struct be_cmd_req_get_mac_addr {struct be_cmd_req_hdr hdr;u32 nic_port_count;
@@ -417,14 +418,21 @@ int beiscsi_cmd_cq_create(struct be_ctrl_info *ctrl,int beiscsi_cmd_q_destroy (struct be_ctrl_info *ctrl,struct be_queue_info *q,int type); +int be_cmd_mccq_create (struct beiscsi_hba *phba, +struct be_queue_info *mccq, +struct be_queue_info *cq); +int be_poll_mcc (struct be_ctrl_info *ctrl); -unsigned char mgmt_check_supported_fw (struct be_ctrl_info *ctrl); -int be_cmd_get_mac_addr (struct be_ctrl_info *ctrl,u8 *mac_addr); +unsigned char mgmt_check_supported_fw (struct be_ctrl_info *ctrl, +struct beiscsi_hba *phba); +int be_cmd_get_mac_addr (struct beiscsi_hba *phba,u8 *mac_addr);/*ISCSI Functuions */ int be_cmd_fw_initialize (struct be_ctrl_info *ctrl);struct be_mcc_wrb *wrb_from_mbox (struct be_dma_mem *mbox_mem); +struct be_mcc_wrb *wrb_from_mccq (struct beiscsi_hba *phba); +int be_mcc_notify_wait (struct beiscsi_hba *phba);int be_mbox_notify (struct be_ctrl_info *ctrl);
@@ -531,6 +539,23 @@ struct amap_sol_cqe {u8 valid;/* dword 3 */ } __packed; +#define SOL_ICD_INDEX_MASK 0x0003FFC0 +struct amap_sol_cqe_ring { +u8 hw_sts[8 ];/* dword 0 */ +u8 i_sts[8 ];/* dword 0 */ +u8 i_resp[8 ];/* dword 0 */ +u8 i_flags[7 ];/* dword 0 */ +u8 s;/* dword 0 */ +u8 i_exp_cmd_sn[32 ];/* dword 1 */ +u8 code[6 ];/* dword 2 */ +u8 icd_index[12 ];/* dword 2 */ +u8 rsvd[6 ];/* dword 2 */ +u8 i_cmd_wnd[8 ];/* dword 2 */ +u8 i_res_cnt[31 ];/* dword 3 */ +u8 valid;/* dword 3 */ +} __packed; + +/** * Post WRB Queue Doorbell Register used by the host Storage
@@ -664,8 +689,8 @@ struct be_fw_cfg {#define OPCODE_COMMON_TCP_UPLOAD 56#define OPCODE_COMMON_ISCSI_ERROR_RECOVERY_INVALIDATE_COMMANDS 1/* --- CMD_ISCSI_INVALIDATE_CONNECTION_TYPE --- */ -#define CMD_ISCSI_CONNECTION_INVALIDATE 1 -#define CMD_ISCSI_CONNECTION_ISSUE_TCP_RST 2 +#define CMD_ISCSI_CONNECTION_INVALIDATE 0x8001 +#define CMD_ISCSI_CONNECTION_ISSUE_TCP_RST 0x8002#define OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION 42#define INI_WR_CMD 1/* Initiator write command */
drivers/scsi/be2iscsi/be_iscsi.c +13 -10
@@ -67,11 +67,11 @@ struct iscsi_cls_session *beiscsi_session_create(struct iscsi_endpoint *ep, cmds_max = beiscsi_ep->phba->params.wrbs_per_cxn; } - cls_session =iscsi_session_setup (&beiscsi_iscsi_transport, - shost, cmds_max, -sizeof (*beiscsi_sess), -sizeof (*io_task), - initial_cmdsn,ISCSI_MAX_TARGET ); + cls_session =iscsi_session_setup (&beiscsi_iscsi_transport, + shost, cmds_max, +sizeof (*beiscsi_sess), +sizeof (*io_task), + initial_cmdsn,ISCSI_MAX_TARGET );if (!cls_session)return NULL ; sess = cls_session->dd_data;
@@ -297,7 +297,7 @@ int beiscsi_get_host_param(struct Scsi_Host *shost,switch (param) {case ISCSI_HOST_PARAM_HWADDRESS : -be_cmd_get_mac_addr (&phba->ctrl, phba->mac_address); +be_cmd_get_mac_addr (phba, phba->mac_address); len =sysfs_format_mac (buf, phba->mac_address,ETH_ALEN );break ;default :
@@ -377,16 +377,12 @@ int beiscsi_conn_start(struct iscsi_cls_conn *cls_conn)struct beiscsi_conn *beiscsi_conn = conn->dd_data;struct beiscsi_endpoint *beiscsi_ep;struct beiscsi_offload_params params; -struct iscsi_session *session = conn->session; -struct Scsi_Host *shost =iscsi_session_to_shost (session->cls_session); -struct beiscsi_hba *phba =iscsi_host_priv (shost);memset (¶ms,0 ,sizeof (struct beiscsi_offload_params )); beiscsi_ep = beiscsi_conn->ep;if (!beiscsi_ep)SE_DEBUG (DBG_LVL_1 ,"In beiscsi_conn_start , no beiscsi_ep\n" ); -free_mgmt_sgl_handle (phba, beiscsi_conn->plogin_sgl_handle); beiscsi_conn->login_in_progress =0 ;beiscsi_set_params_for_offld (beiscsi_conn, ¶ms);beiscsi_offload_connection (beiscsi_conn, ¶ms);
@@ -498,6 +494,13 @@ beiscsi_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,SE_DEBUG (DBG_LVL_1 ,"shost is NULL \n" );return ERR_PTR (ret); } + +if (phba->state) { + ret = -EBUSY ; +SE_DEBUG (DBG_LVL_1 ,"The Adapet state is Not UP \n" ); +return ERR_PTR (ret); + } + ep =iscsi_create_endpoint (sizeof (struct beiscsi_endpoint ));if (!ep) { ret = -ENOMEM ;
drivers/scsi/be2iscsi/be_main.c +656 -232
1,527 lines not on this page · raw message
drivers/scsi/be2iscsi/be_main.h +28 -21
152 lines not on this page · raw message
drivers/scsi/be2iscsi/be_mgmt.c +52 -17
180 lines not on this page · raw message
drivers/scsi/be2iscsi/be_mgmt.h +7 -1
@@ -175,7 +175,9 @@ struct mgmt_hba_attributes {u8 phy_port;u32 firmware_post_status;u32 hba_mtu[8 ]; -u32 future_u32[4 ]; +u8 iscsi_features; +u8 future_u8[3 ]; +u32 future_u32[3 ]; } __packed;struct mgmt_controller_attributes {
@@ -246,4 +248,8 @@ unsigned char mgmt_invalidate_connection(struct beiscsi_hba *phba,unsigned short cid, unsigned short issue_reset, unsigned short savecfg_flag); + +unsigned char mgmt_fw_cmd (struct be_ctrl_info *ctrl, +struct beiscsi_hba *phba, +char *buf,unsigned int len);#endif
Signature · 1 line
1.6.4