be2iscsi: Fix to process 25G link speed info from FW
authorJitendra Bhivare <jitendra.bhivare@avagotech.com>
Wed, 20 Jan 2016 08:40:58 +0000 (14:10 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 24 Feb 2016 02:27:02 +0000 (21:27 -0500)
Async link event provides port_speed info. Cache the port_speed info
and use the same to report in ISCSI_HOST_PARAM_PORT_SPEED query.

Removed link status query IOCTL used to do the same.

Signed-off-by: Jitendra Bhivare <jitendra.bhivare@avagotech.com>
Reviewed-by: Hannes Reinicke <hare@suse.de>
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_iscsi.c
drivers/scsi/be2iscsi/be_main.h
drivers/scsi/be2iscsi/be_mgmt.c

index 14a1c718222747ce1cdba7e6213dc4a2aef8f6ea..ce82f4d68745a294e9859b5090384b89c85d45e2 100644 (file)
@@ -408,6 +408,7 @@ void beiscsi_fail_session(struct iscsi_cls_session *cls_session)
 static void beiscsi_async_link_state_process(struct beiscsi_hba *phba,
                struct be_async_event_link_state *evt)
 {
+       phba->port_speed = evt->port_speed;
        if ((evt->port_link_status == ASYNC_EVENT_LINK_DOWN) ||
            ((evt->port_link_status & ASYNC_EVENT_LOGICAL) &&
             (evt->port_fault != BEISCSI_PHY_LINK_FAULT_NONE))) {
index 724974eca5a3d9d1e291e8d0a2d0870eadb41d5f..a194066e5ab8b330b2d4c9b04831e6f9931ccf7c 100644 (file)
@@ -153,12 +153,21 @@ struct be_async_event_link_state {
        u8 physical_port;
        u8 port_link_status;
        u8 port_duplex;
+/* BE2ISCSI_LINK_SPEED_ZERO    0x00 - no link */
+#define BE2ISCSI_LINK_SPEED_10MBPS     0x01
+#define BE2ISCSI_LINK_SPEED_100MBPS    0x02
+#define BE2ISCSI_LINK_SPEED_1GBPS      0x03
+#define BE2ISCSI_LINK_SPEED_10GBPS     0x04
+#define BE2ISCSI_LINK_SPEED_25GBPS     0x06
+#define BE2ISCSI_LINK_SPEED_40GBPS     0x07
        u8 port_speed;
 #define BEISCSI_PHY_LINK_FAULT_NONE    0x00
 #define BEISCSI_PHY_LINK_FAULT_LOCAL   0x01
 #define BEISCSI_PHY_LINK_FAULT_REMOTE  0x02
        u8 port_fault;
-       u8 rsvd0[7];
+       u8 event_reason;
+       u16 qos_link_speed;
+       u32 event_tag;
        struct be_async_event_trailer trailer;
 } __packed;
 
@@ -711,29 +720,6 @@ struct be_cmd_hba_name {
        u8 initiator_alias[BEISCSI_ALIAS_LEN];
 } __packed;
 
-struct be_cmd_ntwk_link_status_req {
-       struct be_cmd_req_hdr hdr;
-       u32 rsvd0;
-} __packed;
-
-/*** Port Speed Values ***/
-#define BE2ISCSI_LINK_SPEED_ZERO       0x00
-#define BE2ISCSI_LINK_SPEED_10MBPS     0x01
-#define BE2ISCSI_LINK_SPEED_100MBPS    0x02
-#define BE2ISCSI_LINK_SPEED_1GBPS      0x03
-#define BE2ISCSI_LINK_SPEED_10GBPS     0x04
-struct be_cmd_ntwk_link_status_resp {
-       struct be_cmd_resp_hdr hdr;
-       u8 phys_port;
-       u8 mac_duplex;
-       u8 mac_speed;
-       u8 mac_fault;
-       u8 mgmt_mac_duplex;
-       u8 mgmt_mac_speed;
-       u16 qos_link_speed;
-       u32 logical_link_speed;
-} __packed;
-
 int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl,
                          struct be_queue_info *eq, int eq_delay);
 
@@ -752,7 +738,6 @@ int be_poll_mcc(struct be_ctrl_info *ctrl);
 int mgmt_check_supported_fw(struct be_ctrl_info *ctrl,
                                      struct beiscsi_hba *phba);
 unsigned int be_cmd_get_initname(struct beiscsi_hba *phba);
-unsigned int be_cmd_get_port_speed(struct beiscsi_hba *phba);
 
 void free_mcc_tag(struct be_ctrl_info *ctrl, unsigned int tag);
 
index 8bf7379b06ad25ef4d2d4e017e764ab596079a22..128f7dbdbe4dfffea409e5a542d2f751f8f36c29 100644 (file)
@@ -766,34 +766,13 @@ static void beiscsi_get_port_state(struct Scsi_Host *shost)
  * beiscsi_get_port_speed  - Get the Port Speed from Adapter
  * @shost : pointer to scsi_host structure
  *
- * returns Success/Failure
  */
-static int beiscsi_get_port_speed(struct Scsi_Host *shost)
+static void beiscsi_get_port_speed(struct Scsi_Host *shost)
 {
-       int rc;
-       unsigned int tag;
-       struct be_mcc_wrb *wrb;
-       struct be_cmd_ntwk_link_status_resp *resp;
        struct beiscsi_hba *phba = iscsi_host_priv(shost);
        struct iscsi_cls_host *ihost = shost->shost_data;
 
-       tag = be_cmd_get_port_speed(phba);
-       if (!tag) {
-               beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
-                           "BS_%d : Getting Port Speed Failed\n");
-
-                return -EBUSY;
-       }
-       rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
-       if (rc) {
-               beiscsi_log(phba, KERN_ERR,
-                           BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
-                           "BS_%d : Port Speed MBX Failed\n");
-               return rc;
-       }
-       resp = embedded_payload(wrb);
-
-       switch (resp->mac_speed) {
+       switch (phba->port_speed) {
        case BE2ISCSI_LINK_SPEED_10MBPS:
                ihost->port_speed = ISCSI_PORT_SPEED_10MBPS;
                break;
@@ -806,10 +785,15 @@ static int beiscsi_get_port_speed(struct Scsi_Host *shost)
        case BE2ISCSI_LINK_SPEED_10GBPS:
                ihost->port_speed = ISCSI_PORT_SPEED_10GBPS;
                break;
+       case BE2ISCSI_LINK_SPEED_25GBPS:
+               ihost->port_speed = ISCSI_PORT_SPEED_25GBPS;
+               break;
+       case BE2ISCSI_LINK_SPEED_40GBPS:
+               ihost->port_speed = ISCSI_PORT_SPEED_40GBPS;
+               break;
        default:
                ihost->port_speed = ISCSI_PORT_SPEED_UNKNOWN;
        }
-       return 0;
 }
 
 /**
@@ -859,12 +843,7 @@ int beiscsi_get_host_param(struct Scsi_Host *shost,
                status = sprintf(buf, "%s\n", iscsi_get_port_state_name(shost));
                break;
        case ISCSI_HOST_PARAM_PORT_SPEED:
-               status = beiscsi_get_port_speed(shost);
-               if (status) {
-                       beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
-                                   "BS_%d : Retreiving Port Speed Failed\n");
-                       return status;
-               }
+               beiscsi_get_port_speed(shost);
                status = sprintf(buf, "%s\n", iscsi_get_port_speed_name(shost));
                break;
        default:
index fabade3e6607e9176fa491ac4cc517eb80e96712..41c708ce5b426c581e5b3d9aeae595dc4684979d 100644 (file)
@@ -427,6 +427,7 @@ struct beiscsi_hba {
        bool mac_addr_set;
        u8 mac_address[ETH_ALEN];
        u8 port_name;
+       u8 port_speed;
        char fw_ver_str[BEISCSI_VER_STRLEN];
        char wq_name[20];
        struct workqueue_struct *wq;    /* The actuak work queue */
index 3eea8b884310c845c4ed894aeb77863f1e7140ad..da040e79cbd02ef3075bb6a6647ce27c28bab2f5 100644 (file)
@@ -1393,34 +1393,6 @@ unsigned int be_cmd_get_initname(struct beiscsi_hba *phba)
        return tag;
 }
 
-unsigned int be_cmd_get_port_speed(struct beiscsi_hba *phba)
-{
-       unsigned int tag = 0;
-       struct be_mcc_wrb *wrb;
-       struct be_cmd_ntwk_link_status_req *req;
-       struct be_ctrl_info *ctrl = &phba->ctrl;
-
-       if (mutex_lock_interruptible(&ctrl->mbox_lock))
-               return 0;
-       tag = alloc_mcc_tag(phba);
-       if (!tag) {
-               mutex_unlock(&ctrl->mbox_lock);
-               return tag;
-       }
-
-       wrb = wrb_from_mccq(phba);
-       req = embedded_payload(wrb);
-       wrb->tag0 |= tag;
-       be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
-       be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
-                       OPCODE_COMMON_NTWK_LINK_STATUS_QUERY,
-                       sizeof(*req));
-
-       be_mcc_notify(phba, tag);
-       mutex_unlock(&ctrl->mbox_lock);
-       return tag;
-}
-
 /**
  * be_mgmt_get_boot_shandle()- Get the session handle
  * @phba: device priv structure instance