scsi: be2iscsi: Add V1 of EPFW cleanup IOCTL
authorJitendra Bhivare <jitendra.bhivare@broadcom.com>
Fri, 19 Aug 2016 09:50:17 +0000 (15:20 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 24 Aug 2016 02:42:44 +0000 (22:42 -0400)
mgmt_epfw_cleanup does not implement v1 of OPCODE_COMMON_ISCSI_CLEANUP
IOCTL for SkyHawk.

Replace use of MCCQ with BMBX for issuing the IOCTL.
Remove be_mcc_compl_poll which is no longer needed.

Signed-off-by: Jitendra Bhivare <jitendra.bhivare@broadcom.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/be2iscsi/be_cmds.c
drivers/scsi/be2iscsi/be_cmds.h
drivers/scsi/be2iscsi/be_main.c
drivers/scsi/be2iscsi/be_mgmt.c
drivers/scsi/be2iscsi/be_mgmt.h

index 771670c0682b2ca4a6f51ea34fded4b990a003e4..6f3cd82c429564a7c6756be2c6d756982fdbda67 100644 (file)
@@ -478,53 +478,6 @@ int beiscsi_process_mcc_compl(struct be_ctrl_info *ctrl,
        return 0;
 }
 
-/*
- * be_mcc_compl_poll()- Wait for MBX completion
- * @phba: driver private structure
- *
- * Wait till no more pending mcc requests are present
- *
- * return
- * Success: 0
- * Failure: Non-Zero
- *
- **/
-int be_mcc_compl_poll(struct beiscsi_hba *phba, unsigned int tag)
-{
-       struct be_ctrl_info *ctrl = &phba->ctrl;
-       int i;
-
-       if (!test_bit(MCC_TAG_STATE_RUNNING,
-                     &ctrl->ptag_state[tag].tag_state)) {
-               beiscsi_log(phba, KERN_ERR,
-                           BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
-                           "BC_%d: tag %u state not running\n", tag);
-               return 0;
-       }
-       for (i = 0; i < mcc_timeout; i++) {
-               if (beiscsi_hba_in_error(phba))
-                       return -EIO;
-
-               beiscsi_process_mcc_cq(phba);
-               /* after polling, wrb and tag need to be released */
-               if (!test_bit(MCC_TAG_STATE_RUNNING,
-                             &ctrl->ptag_state[tag].tag_state)) {
-                       free_mcc_wrb(ctrl, tag);
-                       break;
-               }
-               udelay(100);
-       }
-
-       if (i < mcc_timeout)
-               return 0;
-
-       beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
-                   "BC_%d : FW Timed Out\n");
-       set_bit(BEISCSI_HBA_FW_TIMEOUT, &phba->state);
-       beiscsi_ue_detect(phba);
-       return -EBUSY;
-}
-
 void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag)
 {
        struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
@@ -1645,3 +1598,52 @@ int beiscsi_init_sliport(struct beiscsi_hba *phba)
        /* indicate driver is loading */
        return beiscsi_cmd_special_wrb(&phba->ctrl, 1);
 }
+
+/**
+ * beiscsi_cmd_iscsi_cleanup()- Inform FW to cleanup EP data structures.
+ * @phba: pointer to dev priv structure
+ * @ulp: ULP number.
+ *
+ * return
+ *     Success: 0
+ *     Failure: Non-Zero Value
+ **/
+int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp)
+{
+       struct be_ctrl_info *ctrl = &phba->ctrl;
+       struct iscsi_cleanup_req_v1 *req_v1;
+       struct iscsi_cleanup_req *req;
+       struct be_mcc_wrb *wrb;
+       int status;
+
+       mutex_lock(&ctrl->mbox_lock);
+       wrb = wrb_from_mbox(&ctrl->mbox_mem);
+       req = embedded_payload(wrb);
+       be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+       be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
+                          OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req));
+
+       /**
+       * TODO: Check with FW folks the chute value to be set.
+       * For now, use the ULP_MASK as the chute value.
+       */
+       if (is_chip_be2_be3r(phba)) {
+               req->chute = (1 << ulp);
+               req->hdr_ring_id = HWI_GET_DEF_HDRQ_ID(phba, ulp);
+               req->data_ring_id = HWI_GET_DEF_BUFQ_ID(phba, ulp);
+       } else {
+               req_v1 = (struct iscsi_cleanup_req_v1 *)req;
+               req_v1->hdr.version = 1;
+               req_v1->hdr_ring_id = cpu_to_le16(HWI_GET_DEF_HDRQ_ID(phba,
+                                                                     ulp));
+               req_v1->data_ring_id = cpu_to_le16(HWI_GET_DEF_BUFQ_ID(phba,
+                                                                      ulp));
+       }
+
+       status = be_mbox_notify(ctrl);
+       if (status)
+               beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT,
+                           "BG_%d : %s failed %d\n", __func__, ulp);
+       mutex_unlock(&ctrl->mbox_lock);
+       return status;
+}
index 47b7197f17a2b77d98888805b4f845bb02ded642..cf4239987acf2ff4164696bb34c58cd195faaa15 100644 (file)
@@ -768,6 +768,8 @@ int beiscsi_check_fw_rdy(struct beiscsi_hba *phba);
 
 int beiscsi_init_sliport(struct beiscsi_hba *phba);
 
+int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num);
+
 int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl,
                          struct be_queue_info *eq, int eq_delay);
 
@@ -782,8 +784,6 @@ int beiscsi_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 int be_cmd_get_initname(struct beiscsi_hba *phba);
 
 void free_mcc_wrb(struct be_ctrl_info *ctrl, unsigned int tag);
@@ -798,9 +798,7 @@ int __beiscsi_mcc_compl_status(struct beiscsi_hba *phba,
                               unsigned int tag,
                               struct be_mcc_wrb **wrb,
                               struct be_dma_mem *mbx_cmd_mem);
-/*ISCSI Functuions */
 struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem);
-int be_mcc_compl_poll(struct beiscsi_hba *phba, unsigned int tag);
 void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag);
 struct be_mcc_wrb *alloc_mcc_wrb(struct beiscsi_hba *phba,
                                 unsigned int *ref_tag);
@@ -1063,7 +1061,16 @@ struct iscsi_cleanup_req {
        u16 chute;
        u8 hdr_ring_id;
        u8 data_ring_id;
+} __packed;
 
+struct iscsi_cleanup_req_v1 {
+       struct be_cmd_req_hdr hdr;
+       u16 chute;
+       u16 rsvd1;
+       u16 hdr_ring_id;
+       u16 rsvd2;
+       u16 data_ring_id;
+       u16 rsvd3;
 } __packed;
 
 struct eq_delay {
index b4e6fc222d6013afc4a41df9d1104b515faec220..e7741072995add29dc6cde4e79489b4e5c156d7f 100644 (file)
@@ -3249,7 +3249,6 @@ beiscsi_create_def_hdr(struct beiscsi_hba *phba,
                    "BM_%d : iscsi hdr def pdu id for ULP : %d is %d\n",
                    ulp_num,
                    phwi_context->be_def_hdrq[ulp_num].id);
-       hwi_post_async_buffers(phba, BEISCSI_DEFQ_HDR, ulp_num);
        return 0;
 }
 
@@ -3304,11 +3303,9 @@ beiscsi_create_def_data(struct beiscsi_hba *phba,
                    ulp_num,
                    phwi_context->be_def_dataq[ulp_num].id);
 
-       hwi_post_async_buffers(phba, BEISCSI_DEFQ_DATA, ulp_num);
        beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
                    "BM_%d : DEFAULT PDU DATA RING CREATED"
                    "on ULP : %d\n", ulp_num);
-
        return 0;
 }
 
@@ -3757,6 +3754,15 @@ static int hwi_init_port(struct beiscsi_hba *phba)
                                            ulp_num);
                                goto error;
                        }
+                       /**
+                        * Now that the default PDU rings have been created,
+                        * let EP know about it.
+                        * Call beiscsi_cmd_iscsi_cleanup before posting?
+                        */
+                       hwi_post_async_buffers(phba, BEISCSI_DEFQ_HDR,
+                                              ulp_num);
+                       hwi_post_async_buffers(phba, BEISCSI_DEFQ_DATA,
+                                              ulp_num);
                }
        }
 
@@ -4235,19 +4241,12 @@ static void hwi_purge_eq(struct beiscsi_hba *phba)
 
 static void beiscsi_cleanup_port(struct beiscsi_hba *phba)
 {
-       int mgmt_status, ulp_num;
        struct ulp_cid_info *ptr_cid_info = NULL;
+       int ulp_num;
 
-       for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) {
-               if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) {
-                       mgmt_status = mgmt_epfw_cleanup(phba, ulp_num);
-                       if (mgmt_status)
-                               beiscsi_log(phba, KERN_WARNING,
-                                           BEISCSI_LOG_INIT,
-                                           "BM_%d : mgmt_epfw_cleanup FAILED"
-                                           " for ULP_%d\n", ulp_num);
-               }
-       }
+       for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++)
+               if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported))
+                       beiscsi_cmd_iscsi_cleanup(phba, ulp_num);
 
        hwi_purge_eq(phba);
        hwi_cleanup_port(phba);
index 706a817b8313e16633931c20e74893152d14736d..a844299ea9798f6e82a9e6cb043167fed2d791d3 100644 (file)
@@ -256,48 +256,6 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
        return tag;
 }
 
-/**
- * mgmt_epfw_cleanup()- Inform FW to cleanup data structures.
- * @phba: pointer to dev priv structure
- * @ulp_num: ULP number.
- *
- * return
- *     Success: 0
- *     Failure: Non-Zero Value
- **/
-int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num)
-{
-       struct be_ctrl_info *ctrl = &phba->ctrl;
-       struct be_mcc_wrb *wrb;
-       struct iscsi_cleanup_req *req;
-       unsigned int tag;
-       int status;
-
-       mutex_lock(&ctrl->mbox_lock);
-       wrb = alloc_mcc_wrb(phba, &tag);
-       if (!wrb) {
-               mutex_unlock(&ctrl->mbox_lock);
-               return -EBUSY;
-       }
-
-       req = embedded_payload(wrb);
-       be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
-       be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
-                          OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req));
-
-       req->chute = (1 << ulp_num);
-       req->hdr_ring_id = cpu_to_le16(HWI_GET_DEF_HDRQ_ID(phba, ulp_num));
-       req->data_ring_id = cpu_to_le16(HWI_GET_DEF_BUFQ_ID(phba, ulp_num));
-
-       be_mcc_notify(phba, tag);
-       status = be_mcc_compl_poll(phba, tag);
-       if (status)
-               beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT,
-                           "BG_%d : mgmt_epfw_cleanup , FAILED\n");
-       mutex_unlock(&ctrl->mbox_lock);
-       return status;
-}
-
 unsigned int  mgmt_invalidate_icds(struct beiscsi_hba *phba,
                                struct invalidate_command_table *inv_tbl,
                                unsigned int num_invalidate, unsigned int cid,
index f8d27783f207bf9aac075c0b784ccfb14b304670..dab128fb2ce3ff9e0c75f475b505fe1ef58cf693 100644 (file)
@@ -96,7 +96,6 @@ struct mcc_wrb {
        struct mcc_wrb_payload payload;
 };
 
-int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short chute);
 int mgmt_open_connection(struct beiscsi_hba *phba,
                         struct sockaddr *dst_addr,
                         struct beiscsi_endpoint *beiscsi_ep,