mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
[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: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
6bcac508fb
commit
bd43a42b7e
3 changed files with 20 additions and 2 deletions
|
@ -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)
|
||||||
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)
|
||||||
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 @@
|
||||||
#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 {
|
||||||
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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue