Commit bd43a42b authored by Christof Schmitt's avatar Christof Schmitt Committed by Martin Schwidefsky

[S390] zfcp: Report microcode level through service level interface

Register zfcp with the new /proc/service_level interface to report the
FCP microcode level. When the adapter goes offline or a channel path
disappears, zfcp unregisters, since the microcode version might change
and zfcp does not know about it.
Signed-off-by: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 6bcac508
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
*/ */
#include <linux/miscdevice.h> #include <linux/miscdevice.h>
#include <linux/seq_file.h>
#include "zfcp_ext.h" #include "zfcp_ext.h"
static char *device; static char *device;
...@@ -436,6 +437,16 @@ static void _zfcp_status_read_scheduler(struct work_struct *work) ...@@ -436,6 +437,16 @@ static void _zfcp_status_read_scheduler(struct work_struct *work)
stat_work)); stat_work));
} }
static void zfcp_print_sl(struct seq_file *m, struct service_level *sl)
{
struct zfcp_adapter *adapter =
container_of(sl, struct zfcp_adapter, service_level);
seq_printf(m, "zfcp: %s microcode level %x\n",
dev_name(&adapter->ccw_device->dev),
adapter->fsf_lic_version);
}
/** /**
* zfcp_adapter_enqueue - enqueue a new adapter to the list * zfcp_adapter_enqueue - enqueue a new adapter to the list
* @ccw_device: pointer to the struct cc_device * @ccw_device: pointer to the struct cc_device
...@@ -500,6 +511,8 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device) ...@@ -500,6 +511,8 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
INIT_WORK(&adapter->stat_work, _zfcp_status_read_scheduler); INIT_WORK(&adapter->stat_work, _zfcp_status_read_scheduler);
INIT_WORK(&adapter->scan_work, _zfcp_scan_ports_later); INIT_WORK(&adapter->scan_work, _zfcp_scan_ports_later);
adapter->service_level.seq_print = zfcp_print_sl;
/* mark adapter unusable as long as sysfs registration is not complete */ /* mark adapter unusable as long as sysfs registration is not complete */
atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <asm/qdio.h> #include <asm/qdio.h>
#include <asm/debug.h> #include <asm/debug.h>
#include <asm/ebcdic.h> #include <asm/ebcdic.h>
#include <asm/sysinfo.h>
#include "zfcp_dbf.h" #include "zfcp_dbf.h"
#include "zfcp_fsf.h" #include "zfcp_fsf.h"
...@@ -515,6 +516,7 @@ struct zfcp_adapter { ...@@ -515,6 +516,7 @@ struct zfcp_adapter {
struct fsf_qtcb_bottom_port *stats_reset_data; struct fsf_qtcb_bottom_port *stats_reset_data;
unsigned long stats_reset; unsigned long stats_reset;
struct work_struct scan_work; struct work_struct scan_work;
struct service_level service_level;
atomic_t qdio_outb_full; /* queue full incidents */ atomic_t qdio_outb_full; /* queue full incidents */
}; };
......
...@@ -1281,10 +1281,13 @@ static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result) ...@@ -1281,10 +1281,13 @@ static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
break; break;
case ZFCP_ERP_ACTION_REOPEN_ADAPTER: case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
if (result != ZFCP_ERP_SUCCEEDED) if (result != ZFCP_ERP_SUCCEEDED) {
unregister_service_level(&adapter->service_level);
zfcp_erp_rports_del(adapter); zfcp_erp_rports_del(adapter);
else } else {
register_service_level(&adapter->service_level);
schedule_work(&adapter->scan_work); schedule_work(&adapter->scan_work);
}
zfcp_adapter_put(adapter); zfcp_adapter_put(adapter);
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment