}
 }
 
+static void zfcp_get_host_port_state(struct Scsi_Host *shost)
+{
+       struct zfcp_adapter *adapter =
+               (struct zfcp_adapter *)shost->hostdata[0];
+       int status = atomic_read(&adapter->status);
+
+       if ((status & ZFCP_STATUS_COMMON_RUNNING) &&
+           !(status & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED))
+               fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
+       else if (status & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED)
+               fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
+       else if (status & ZFCP_STATUS_COMMON_ERP_FAILED)
+               fc_host_port_state(shost) = FC_PORTSTATE_ERROR;
+       else
+               fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
+}
+
 static void zfcp_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout)
 {
        rport->dev_loss_tmo = timeout;
        .get_fc_host_stats = zfcp_get_fc_host_stats,
        .reset_fc_host_stats = zfcp_reset_fc_host_stats,
        .set_rport_dev_loss_tmo = zfcp_set_rport_dev_loss_tmo,
+       .get_host_port_state = zfcp_get_host_port_state,
+       .show_host_port_state = 1,
        /* no functions registered for following dynamic attributes but
           directly set by LLDD */
        .show_host_port_type = 1,