summaryrefslogtreecommitdiff
path: root/drivers/s390
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/block/dasd.c64
-rw-r--r--drivers/s390/block/dasd_devmap.c3
-rw-r--r--drivers/s390/block/dasd_eckd.c8
-rw-r--r--drivers/s390/block/dasd_genhd.c80
-rw-r--r--drivers/s390/net/ctcm_fsms.c14
-rw-r--r--drivers/s390/net/qeth_core_main.c2
-rw-r--r--drivers/s390/net/qeth_core_mpc.c247
-rw-r--r--drivers/s390/net/qeth_core_mpc.h20
-rw-r--r--drivers/s390/net/smsgiucv_app.c7
9 files changed, 300 insertions, 145 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index 9a5c6a73511f..35031357ac4d 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -207,19 +207,6 @@ static int dasd_state_known_to_new(struct dasd_device *device)
return 0;
}
-static struct dentry *dasd_debugfs_setup(const char *name,
- struct dentry *base_dentry)
-{
- struct dentry *pde;
-
- if (!base_dentry)
- return NULL;
- pde = debugfs_create_dir(name, base_dentry);
- if (!pde || IS_ERR(pde))
- return NULL;
- return pde;
-}
-
/*
* Request the irq line for the device.
*/
@@ -234,14 +221,14 @@ static int dasd_state_known_to_basic(struct dasd_device *device)
if (rc)
return rc;
block->debugfs_dentry =
- dasd_debugfs_setup(block->gdp->disk_name,
+ debugfs_create_dir(block->gdp->disk_name,
dasd_debugfs_root_entry);
dasd_profile_init(&block->profile, block->debugfs_dentry);
if (dasd_global_profile_level == DASD_PROFILE_ON)
dasd_profile_on(&device->block->profile);
}
device->debugfs_dentry =
- dasd_debugfs_setup(dev_name(&device->cdev->dev),
+ debugfs_create_dir(dev_name(&device->cdev->dev),
dasd_debugfs_root_entry);
dasd_profile_init(&device->profile, device->debugfs_dentry);
dasd_hosts_init(device->debugfs_dentry, device);
@@ -1057,19 +1044,9 @@ static const struct file_operations dasd_stats_raw_fops = {
static void dasd_profile_init(struct dasd_profile *profile,
struct dentry *base_dentry)
{
- umode_t mode;
- struct dentry *pde;
-
- if (!base_dentry)
- return;
- profile->dentry = NULL;
profile->data = NULL;
- mode = (S_IRUSR | S_IWUSR | S_IFREG);
- pde = debugfs_create_file("statistics", mode, base_dentry,
- profile, &dasd_stats_raw_fops);
- if (pde && !IS_ERR(pde))
- profile->dentry = pde;
- return;
+ profile->dentry = debugfs_create_file("statistics", 0600, base_dentry,
+ profile, &dasd_stats_raw_fops);
}
static void dasd_profile_exit(struct dasd_profile *profile)
@@ -1089,25 +1066,9 @@ static void dasd_statistics_removeroot(void)
static void dasd_statistics_createroot(void)
{
- struct dentry *pde;
-
- dasd_debugfs_root_entry = NULL;
- pde = debugfs_create_dir("dasd", NULL);
- if (!pde || IS_ERR(pde))
- goto error;
- dasd_debugfs_root_entry = pde;
- pde = debugfs_create_dir("global", dasd_debugfs_root_entry);
- if (!pde || IS_ERR(pde))
- goto error;
- dasd_debugfs_global_entry = pde;
+ dasd_debugfs_root_entry = debugfs_create_dir("dasd", NULL);
+ dasd_debugfs_global_entry = debugfs_create_dir("global", dasd_debugfs_root_entry);
dasd_profile_init(&dasd_global_profile, dasd_debugfs_global_entry);
- return;
-
-error:
- DBF_EVENT(DBF_ERR, "%s",
- "Creation of the dasd debugfs interface failed");
- dasd_statistics_removeroot();
- return;
}
#else
@@ -1168,17 +1129,8 @@ static void dasd_hosts_exit(struct dasd_device *device)
static void dasd_hosts_init(struct dentry *base_dentry,
struct dasd_device *device)
{
- struct dentry *pde;
- umode_t mode;
-
- if (!base_dentry)
- return;
-
- mode = S_IRUSR | S_IFREG;
- pde = debugfs_create_file("host_access_list", mode, base_dentry,
- device, &dasd_hosts_fops);
- if (pde && !IS_ERR(pde))
- device->hosts_dentry = pde;
+ device->hosts_dentry = debugfs_create_file("host_access_list", 0400, base_dentry,
+ device, &dasd_hosts_fops);
}
struct dasd_ccw_req *dasd_smalloc_request(int magic, int cplength, int datasize,
diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c
index ddbdf1f85d44..73972900fc55 100644
--- a/drivers/s390/block/dasd_devmap.c
+++ b/drivers/s390/block/dasd_devmap.c
@@ -355,7 +355,8 @@ static int __init dasd_parse_range(const char *range)
/* each device in dasd= parameter should be set initially online */
features |= DASD_FEATURE_INITIAL_ONLINE;
while (from <= to) {
- sprintf(bus_id, "%01x.%01x.%04x", from_id0, from_id1, from++);
+ scnprintf(bus_id, sizeof(bus_id),
+ "%01x.%01x.%04x", from_id0, from_id1, from++);
devmap = dasd_add_busid(bus_id, features);
if (IS_ERR(devmap)) {
rc = PTR_ERR(devmap);
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c
index 687396703788..b08e900687f3 100644
--- a/drivers/s390/block/dasd_eckd.c
+++ b/drivers/s390/block/dasd_eckd.c
@@ -6139,6 +6139,7 @@ static int dasd_eckd_copy_pair_swap(struct dasd_device *device, char *prim_busid
struct dasd_copy_relation *copy;
struct dasd_block *block;
struct gendisk *gdp;
+ int rc;
copy = device->copy;
if (!copy)
@@ -6173,6 +6174,13 @@ static int dasd_eckd_copy_pair_swap(struct dasd_device *device, char *prim_busid
/* swap blocklayer device link */
gdp = block->gdp;
dasd_add_link_to_gendisk(gdp, secondary);
+ rc = device_move(disk_to_dev(gdp), &secondary->cdev->dev, DPM_ORDER_NONE);
+ if (rc) {
+ dev_err(&primary->cdev->dev,
+ "copy_pair_swap: moving blockdevice parent %s->%s failed (%d)\n",
+ dev_name(&primary->cdev->dev),
+ dev_name(&secondary->cdev->dev), rc);
+ }
/* re-enable device */
dasd_device_remove_stop_bits(primary, DASD_STOPPED_PPRC);
diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c
index 28e92fad0ca1..6ee3d952412e 100644
--- a/drivers/s390/block/dasd_genhd.c
+++ b/drivers/s390/block/dasd_genhd.c
@@ -22,6 +22,7 @@
static unsigned int queue_depth = 32;
static unsigned int nr_hw_queues = 4;
+static void dasd_gd_free(struct gendisk *gdp);
module_param(queue_depth, uint, 0444);
MODULE_PARM_DESC(queue_depth, "Default queue depth for new DASD devices");
@@ -30,6 +31,37 @@ module_param(nr_hw_queues, uint, 0444);
MODULE_PARM_DESC(nr_hw_queues, "Default number of hardware queues for new DASD devices");
/*
+ * Set device name.
+ * dasda - dasdz : 26 devices
+ * dasdaa - dasdzz : 676 devices, added up = 702
+ * dasdaaa - dasdzzz : 17576 devices, added up = 18278
+ * dasdaaaa - dasdzzzz : 456976 devices, added up = 475252
+ */
+static int dasd_name_format(char *prefix, int index, char *buf, int buflen)
+{
+ const int base = 'z' - 'a' + 1;
+ char *begin = buf + strlen(prefix);
+ char *end = buf + buflen;
+ char *p;
+ int unit;
+
+ p = end - 1;
+ *p = '\0';
+ unit = base;
+ do {
+ if (p == begin)
+ return -EINVAL;
+ *--p = 'a' + (index % unit);
+ index = (index / unit) - 1;
+ } while (index >= 0);
+
+ memmove(begin, p, end - p);
+ memcpy(buf, prefix, strlen(prefix));
+
+ return 0;
+}
+
+/*
* Allocate and register gendisk structure for device.
*/
int dasd_gendisk_alloc(struct dasd_block *block)
@@ -45,11 +77,13 @@ int dasd_gendisk_alloc(struct dasd_block *block)
};
struct gendisk *gdp;
struct dasd_device *base;
- int len, rc;
+ unsigned int devindex;
+ int rc;
/* Make sure the minor for this device exists. */
base = block->base;
- if (base->devindex >= DASD_PER_MAJOR)
+ devindex = base->devindex;
+ if (devindex >= DASD_PER_MAJOR)
return -EBUSY;
block->tag_set.ops = &dasd_mq_ops;
@@ -69,31 +103,17 @@ int dasd_gendisk_alloc(struct dasd_block *block)
/* Initialize gendisk structure. */
gdp->major = DASD_MAJOR;
- gdp->first_minor = base->devindex << DASD_PARTN_BITS;
+ gdp->first_minor = devindex << DASD_PARTN_BITS;
gdp->minors = 1 << DASD_PARTN_BITS;
gdp->fops = &dasd_device_operations;
- /*
- * Set device name.
- * dasda - dasdz : 26 devices
- * dasdaa - dasdzz : 676 devices, added up = 702
- * dasdaaa - dasdzzz : 17576 devices, added up = 18278
- * dasdaaaa - dasdzzzz : 456976 devices, added up = 475252
- */
- len = sprintf(gdp->disk_name, "dasd");
- if (base->devindex > 25) {
- if (base->devindex > 701) {
- if (base->devindex > 18277)
- len += sprintf(gdp->disk_name + len, "%c",
- 'a'+(((base->devindex-18278)
- /17576)%26));
- len += sprintf(gdp->disk_name + len, "%c",
- 'a'+(((base->devindex-702)/676)%26));
- }
- len += sprintf(gdp->disk_name + len, "%c",
- 'a'+(((base->devindex-26)/26)%26));
+ rc = dasd_name_format("dasd", devindex, gdp->disk_name, sizeof(gdp->disk_name));
+ if (rc) {
+ DBF_DEV_EVENT(DBF_ERR, block->base,
+ "setting disk name failed, rc %d", rc);
+ dasd_gd_free(gdp);
+ return rc;
}
- len += sprintf(gdp->disk_name + len, "%c", 'a'+(base->devindex%26));
if (base->features & DASD_FEATURE_READONLY ||
test_bit(DASD_FLAG_DEVICE_RO, &base->flags))
@@ -112,14 +132,22 @@ int dasd_gendisk_alloc(struct dasd_block *block)
}
/*
+ * Free gendisk structure
+ */
+static void dasd_gd_free(struct gendisk *gd)
+{
+ del_gendisk(gd);
+ gd->private_data = NULL;
+ put_disk(gd);
+}
+
+/*
* Unregister and free gendisk structure for device.
*/
void dasd_gendisk_free(struct dasd_block *block)
{
if (block->gdp) {
- del_gendisk(block->gdp);
- block->gdp->private_data = NULL;
- put_disk(block->gdp);
+ dasd_gd_free(block->gdp);
block->gdp = NULL;
blk_mq_free_tag_set(&block->tag_set);
}
diff --git a/drivers/s390/net/ctcm_fsms.c b/drivers/s390/net/ctcm_fsms.c
index e221687a9858..bf917f426453 100644
--- a/drivers/s390/net/ctcm_fsms.c
+++ b/drivers/s390/net/ctcm_fsms.c
@@ -881,6 +881,13 @@ static void ctcm_chx_rxiniterr(fsm_instance *fi, int event, void *arg)
fsm_newstate(fi, CTC_STATE_RXERR);
fsm_event(priv->fsm, DEV_EVENT_RXDOWN, dev);
}
+ } else if (event == CTC_EVENT_UC_RCRESET) {
+ CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
+ "%s(%s): %s in %s", CTCM_FUNTAIL, ch->id,
+ ctc_ch_event_names[event], fsm_getstate_str(fi));
+
+ dev_info(&dev->dev,
+ "Init handshake not received, peer not ready yet\n");
} else {
CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
"%s(%s): %s in %s", CTCM_FUNTAIL, ch->id,
@@ -966,6 +973,13 @@ static void ctcm_chx_txiniterr(fsm_instance *fi, int event, void *arg)
fsm_newstate(fi, CTC_STATE_TXERR);
fsm_event(priv->fsm, DEV_EVENT_TXDOWN, dev);
}
+ } else if (event == CTC_EVENT_UC_RCRESET) {
+ CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
+ "%s(%s): %s in %s", CTCM_FUNTAIL, ch->id,
+ ctc_ch_event_names[event], fsm_getstate_str(fi));
+
+ dev_info(&dev->dev,
+ "Init handshake not sent, peer not ready yet\n");
} else {
CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
"%s(%s): %s in %s", CTCM_FUNTAIL, ch->id,
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 64d45285651d..1c80e8ca67b5 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -759,7 +759,7 @@ static void qeth_issue_ipa_msg(struct qeth_ipa_cmd *cmd, int rc,
if (rc)
QETH_DBF_MESSAGE(2, "IPA: %s(%#x) for device %x returned %#x \"%s\"\n",
ipa_name, com, CARD_DEVID(card), rc,
- qeth_get_ipa_msg(rc));
+ qeth_get_ipa_msg(com, rc));
else
QETH_DBF_MESSAGE(5, "IPA: %s(%#x) for device %x succeeded\n",
ipa_name, com, CARD_DEVID(card));
diff --git a/drivers/s390/net/qeth_core_mpc.c b/drivers/s390/net/qeth_core_mpc.c
index d9266f7d8187..1add124e033b 100644
--- a/drivers/s390/net/qeth_core_mpc.c
+++ b/drivers/s390/net/qeth_core_mpc.c
@@ -139,82 +139,237 @@ struct ipa_rc_msg {
const char *msg;
};
-static const struct ipa_rc_msg qeth_ipa_rc_msg[] = {
+static const struct ipa_rc_msg qeth_ipa_rc_def_msg[] = {
{IPA_RC_SUCCESS, "success"},
{IPA_RC_NOTSUPP, "Command not supported"},
- {IPA_RC_IP_TABLE_FULL, "Add Addr IP Table Full - ipv6"},
- {IPA_RC_UNKNOWN_ERROR, "IPA command failed - reason unknown"},
{IPA_RC_UNSUPPORTED_COMMAND, "Command not supported"},
- {IPA_RC_VNICC_OOSEQ, "Command issued out of sequence"},
- {IPA_RC_INVALID_FORMAT, "invalid format or length"},
{IPA_RC_DUP_IPV6_REMOTE, "ipv6 address already registered remote"},
- {IPA_RC_SBP_IQD_NOT_CONFIGURED, "Not configured for bridgeport"},
{IPA_RC_DUP_IPV6_HOME, "ipv6 address already registered"},
{IPA_RC_UNREGISTERED_ADDR, "Address not registered"},
- {IPA_RC_NO_ID_AVAILABLE, "No identifiers available"},
{IPA_RC_ID_NOT_FOUND, "Identifier not found"},
- {IPA_RC_SBP_IQD_ANO_DEV_PRIMARY, "Primary bridgeport exists already"},
- {IPA_RC_SBP_IQD_CURRENT_SECOND, "Bridgeport is currently secondary"},
- {IPA_RC_SBP_IQD_LIMIT_SECOND, "Limit of secondary bridgeports reached"},
- {IPA_RC_INVALID_IP_VERSION, "IP version incorrect"},
- {IPA_RC_SBP_IQD_CURRENT_PRIMARY, "Bridgeport is currently primary"},
{IPA_RC_LAN_FRAME_MISMATCH, "LAN and frame mismatch"},
- {IPA_RC_SBP_IQD_NO_QDIO_QUEUES, "QDIO queues not established"},
{IPA_RC_L2_UNSUPPORTED_CMD, "Unsupported layer 2 command"},
- {IPA_RC_L2_DUP_MAC, "Duplicate MAC address"},
{IPA_RC_L2_ADDR_TABLE_FULL, "Layer2 address table full"},
- {IPA_RC_L2_DUP_LAYER3_MAC, "Duplicate with layer 3 MAC"},
- {IPA_RC_L2_GMAC_NOT_FOUND, "GMAC not found"},
- {IPA_RC_L2_MAC_NOT_AUTH_BY_HYP, "L2 mac not authorized by hypervisor"},
{IPA_RC_L2_MAC_NOT_AUTH_BY_ADP, "L2 mac not authorized by adapter"},
- {IPA_RC_L2_MAC_NOT_FOUND, "L2 mac address not found"},
- {IPA_RC_L2_INVALID_VLAN_ID, "L2 invalid vlan id"},
- {IPA_RC_L2_DUP_VLAN_ID, "L2 duplicate vlan id"},
- {IPA_RC_L2_VLAN_ID_NOT_FOUND, "L2 vlan id not found"},
- {IPA_RC_VNICC_VNICBP, "VNIC is BridgePort"},
- {IPA_RC_SBP_OSA_NOT_CONFIGURED, "Not configured for bridgeport"},
- {IPA_RC_SBP_OSA_OS_MISMATCH, "OS mismatch"},
- {IPA_RC_SBP_OSA_ANO_DEV_PRIMARY, "Primary bridgeport exists already"},
- {IPA_RC_SBP_OSA_CURRENT_SECOND, "Bridgeport is currently secondary"},
- {IPA_RC_SBP_OSA_LIMIT_SECOND, "Limit of secondary bridgeports reached"},
- {IPA_RC_SBP_OSA_NOT_AUTHD_BY_ZMAN, "Not authorized by zManager"},
- {IPA_RC_SBP_OSA_CURRENT_PRIMARY, "Bridgeport is currently primary"},
- {IPA_RC_SBP_OSA_NO_QDIO_QUEUES, "QDIO queues not established"},
{IPA_RC_DATA_MISMATCH, "Data field mismatch (v4/v6 mixed)"},
{IPA_RC_INVALID_MTU_SIZE, "Invalid MTU size"},
{IPA_RC_INVALID_LANTYPE, "Invalid LAN type"},
{IPA_RC_INVALID_LANNUM, "Invalid LAN num"},
- {IPA_RC_DUPLICATE_IP_ADDRESS, "Address already registered"},
- {IPA_RC_IP_ADDR_TABLE_FULL, "IP address table full"},
{IPA_RC_LAN_PORT_STATE_ERROR, "LAN port state error"},
{IPA_RC_SETIP_NO_STARTLAN, "Setip no startlan received"},
{IPA_RC_SETIP_ALREADY_RECEIVED, "Setip already received"},
- {IPA_RC_IP_ADDR_ALREADY_USED, "IP address already in use on LAN"},
- {IPA_RC_MC_ADDR_NOT_FOUND, "Multicast address not found"},
{IPA_RC_SETIP_INVALID_VERSION, "SETIP invalid IP version"},
{IPA_RC_UNSUPPORTED_SUBCMD, "Unsupported assist subcommand"},
{IPA_RC_ARP_ASSIST_NO_ENABLE, "Only partial success, no enable"},
- {IPA_RC_PRIMARY_ALREADY_DEFINED, "Primary already defined"},
- {IPA_RC_SECOND_ALREADY_DEFINED, "Secondary already defined"},
- {IPA_RC_INVALID_SETRTG_INDICATOR, "Invalid SETRTG indicator"},
- {IPA_RC_MC_ADDR_ALREADY_DEFINED, "Multicast address already defined"},
- {IPA_RC_LAN_OFFLINE, "STRTLAN_LAN_DISABLED - LAN offline"},
- {IPA_RC_VEPA_TO_VEB_TRANSITION, "Adj. switch disabled port mode RR"},
{IPA_RC_INVALID_IP_VERSION2, "Invalid IP version"},
/* default for qeth_get_ipa_msg(): */
{IPA_RC_FFFF, "Unknown Error"}
};
-const char *qeth_get_ipa_msg(enum qeth_ipa_return_codes rc)
+static const struct ipa_rc_msg qeth_ipa_rc_adp_parms_msg[] = {
+ {IPA_RC_IP_TABLE_FULL, "Add Addr IP Table Full - ipv6"}
+};
+
+static const struct ipa_rc_msg qeth_ipa_rc_diag_ass_msg[] = {
+ {IPA_RC_INVALID_FORMAT, "invalid format or length"}
+};
+
+static const struct ipa_rc_msg qeth_ipa_rc_addr_msg[] = {
+ {IPA_RC_UNKNOWN_ERROR, "IPA command failed - reason unknown"},
+ {IPA_RC_NO_ID_AVAILABLE, "No identifiers available"},
+ {IPA_RC_INVALID_IP_VERSION, "IP version incorrect"}
+};
+
+static const struct ipa_rc_msg qeth_ipa_rc_vnicc_msg[] = {
+ {IPA_RC_VNICC_OOSEQ, "Command issued out of sequence"},
+ {IPA_RC_VNICC_VNICBP, "VNIC is BridgePort"}
+};
+
+static const struct ipa_rc_msg qeth_ipa_rc_sbp_iqd_msg[] = {
+ {IPA_RC_SBP_IQD_NOT_CONFIGURED, "Not configured for bridgeport"},
+ {IPA_RC_SBP_IQD_OS_MISMATCH, "OS mismatch"},
+ {IPA_RC_SBP_IQD_ANO_DEV_PRIMARY, "Primary bridgeport exists already"},
+ {IPA_RC_SBP_IQD_CURRENT_SECOND, "Bridgeport is currently secondary"},
+ {IPA_RC_SBP_IQD_LIMIT_SECOND, "Limit of secondary bridgeports reached"},
+ {IPA_RC_SBP_IQD_NOT_AUTHD_BY_ZMAN, "Not authorized by zManager"},
+ {IPA_RC_SBP_IQD_CURRENT_PRIMARY, "Bridgeport is currently primary"},
+ {IPA_RC_SBP_IQD_NO_QDIO_QUEUES, "QDIO queues not established"}
+};
+
+static const struct ipa_rc_msg qeth_ipa_rc_sbp_osa_msg[] = {
+ {IPA_RC_SBP_OSA_NOT_CONFIGURED, "Not configured for bridgeport"},
+ {IPA_RC_SBP_OSA_OS_MISMATCH, "OS mismatch"},
+ {IPA_RC_SBP_OSA_ANO_DEV_PRIMARY, "Primary bridgeport exists already"},
+ {IPA_RC_SBP_OSA_CURRENT_SECOND, "Bridgeport is currently secondary"},
+ {IPA_RC_SBP_OSA_LIMIT_SECOND, "Limit of secondary bridgeports reached"},
+ {IPA_RC_SBP_OSA_NOT_AUTHD_BY_ZMAN, "Not authorized by zManager"},
+ {IPA_RC_SBP_OSA_CURRENT_PRIMARY, "Bridgeport is currently primary"},
+ {IPA_RC_SBP_OSA_NO_QDIO_QUEUES, "QDIO queues not established"}
+};
+
+static const struct ipa_rc_msg qeth_ipa_rc_mac_msg[] = {
+ {IPA_RC_L2_DUP_MAC, "Duplicate MAC address"},
+ {IPA_RC_L2_DUP_LAYER3_MAC, "Duplicate with layer 3 MAC"},
+ {IPA_RC_L2_GMAC_NOT_FOUND, "GMAC not found"},
+ {IPA_RC_L2_MAC_NOT_AUTH_BY_HYP, "L2 mac not authorized by hypervisor"},
+ {IPA_RC_L2_MAC_NOT_FOUND, "L2 mac address not found"}
+};
+
+static const struct ipa_rc_msg qeth_ipa_rc_ip_msg[] = {
+ {IPA_RC_DUPLICATE_IP_ADDRESS, "Address already registered"},
+ {IPA_RC_IP_ADDR_TABLE_FULL, "IP address table full"},
+ {IPA_RC_IP_ADDR_ALREADY_USED, "IP address already in use on LAN"},
+ {IPA_RC_MC_ADDR_NOT_FOUND, "Multicast address not found"}
+};
+
+static const struct ipa_rc_msg qeth_ipa_rc_lan_msg[] = {
+ {IPA_RC_LAN_OFFLINE, "STRTLAN_LAN_DISABLED - LAN offline"},
+ {IPA_RC_VEPA_TO_VEB_TRANSITION, "Adj. switch disabled port mode RR"},
+};
+
+static const struct ipa_rc_msg qeth_ipa_rc_vlan_msg[] = {
+ {IPA_RC_L2_INVALID_VLAN_ID, "L2 invalid vlan id"},
+ {IPA_RC_L2_DUP_VLAN_ID, "L2 duplicate vlan id"},
+ {IPA_RC_L2_VLAN_ID_NOT_FOUND, "L2 vlan id not found"}
+};
+
+static const struct ipa_rc_msg qeth_ipa_rc_rtg_msg[] = {
+ {IPA_RC_PRIMARY_ALREADY_DEFINED, "Primary already defined"},
+ {IPA_RC_SECOND_ALREADY_DEFINED, "Secondary already defined"},
+ {IPA_RC_INVALID_SETRTG_INDICATOR, "Invalid SETRTG indicator"},
+ {IPA_RC_MC_ADDR_ALREADY_DEFINED, "Multicast address already defined"}
+};
+
+struct ipa_cmd_rc_map {
+ enum qeth_ipa_cmds cmd;
+ const struct ipa_rc_msg *msg_arr;
+ const size_t arr_len;
+};
+
+static const struct ipa_cmd_rc_map qeth_ipa_cmd_rc_map[] = {
+ {
+ .cmd = IPA_CMD_SETADAPTERPARMS,
+ .msg_arr = qeth_ipa_rc_adp_parms_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_adp_parms_msg)
+ },
+ {
+ .cmd = IPA_CMD_SET_DIAG_ASS,
+ .msg_arr = qeth_ipa_rc_diag_ass_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_diag_ass_msg)
+ },
+ {
+ .cmd = IPA_CMD_CREATE_ADDR,
+ .msg_arr = qeth_ipa_rc_addr_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_addr_msg)
+ },
+ {
+ .cmd = IPA_CMD_DESTROY_ADDR,
+ .msg_arr = qeth_ipa_rc_addr_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_addr_msg)
+ },
+ {
+ .cmd = IPA_CMD_VNICC,
+ .msg_arr = qeth_ipa_rc_vnicc_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_vnicc_msg)
+ },
+ {
+ .cmd = IPA_CMD_SETBRIDGEPORT_IQD,
+ .msg_arr = qeth_ipa_rc_sbp_iqd_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_sbp_iqd_msg)
+ },
+ {
+ .cmd = IPA_CMD_SETBRIDGEPORT_OSA,
+ .msg_arr = qeth_ipa_rc_sbp_osa_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_sbp_osa_msg)
+ },
+ {
+ .cmd = IPA_CMD_SETVMAC,
+ .msg_arr = qeth_ipa_rc_mac_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_mac_msg)
+ },
+ {
+ .cmd = IPA_CMD_DELVMAC,
+ .msg_arr = qeth_ipa_rc_mac_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_mac_msg)
+ },
+ {
+ .cmd = IPA_CMD_SETGMAC,
+ .msg_arr = qeth_ipa_rc_mac_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_mac_msg)
+ },
+ {
+ .cmd = IPA_CMD_DELGMAC,
+ .msg_arr = qeth_ipa_rc_mac_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_mac_msg)
+ },
+ {
+ .cmd = IPA_CMD_SETIP,
+ .msg_arr = qeth_ipa_rc_ip_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_ip_msg)
+ },
+ {
+ .cmd = IPA_CMD_SETIPM,
+ .msg_arr = qeth_ipa_rc_ip_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_ip_msg)
+ },
+ {
+ .cmd = IPA_CMD_DELIPM,
+ .msg_arr = qeth_ipa_rc_ip_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_ip_msg)
+ },
+ {
+ .cmd = IPA_CMD_STARTLAN,
+ .msg_arr = qeth_ipa_rc_lan_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_lan_msg)
+ },
+ {
+ .cmd = IPA_CMD_STOPLAN,
+ .msg_arr = qeth_ipa_rc_lan_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_lan_msg)
+ },
+ {
+ .cmd = IPA_CMD_SETVLAN,
+ .msg_arr = qeth_ipa_rc_vlan_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_vlan_msg)
+ },
+ {
+ .cmd = IPA_CMD_DELVLAN,
+ .msg_arr = qeth_ipa_rc_vlan_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_vlan_msg)
+ },
+ {
+ .cmd = IPA_CMD_SETRTG,
+ .msg_arr = qeth_ipa_rc_rtg_msg,
+ .arr_len = ARRAY_SIZE(qeth_ipa_rc_rtg_msg)
+ }
+};
+
+const char *qeth_get_ipa_msg(enum qeth_ipa_cmds cmd,
+ enum qeth_ipa_return_codes rc)
{
int x;
+ const struct ipa_rc_msg *msg_arr = NULL;
+ size_t arr_len = 0;
- for (x = 0; x < ARRAY_SIZE(qeth_ipa_rc_msg) - 1; x++)
- if (qeth_ipa_rc_msg[x].rc == rc)
- return qeth_ipa_rc_msg[x].msg;
- return qeth_ipa_rc_msg[x].msg;
-}
+ for (x = 0; x < ARRAY_SIZE(qeth_ipa_cmd_rc_map); x++) {
+ if (qeth_ipa_cmd_rc_map[x].cmd == cmd) {
+ msg_arr = qeth_ipa_cmd_rc_map[x].msg_arr;
+ arr_len = qeth_ipa_cmd_rc_map[x].arr_len;
+ break;
+ }
+ }
+ for (x = 0; x < arr_len; x++) {
+ if (msg_arr[x].rc == rc)
+ return msg_arr[x].msg;
+ }
+
+ for (x = 0; x < ARRAY_SIZE(qeth_ipa_rc_def_msg) - 1; x++) {
+ if (qeth_ipa_rc_def_msg[x].rc == rc)
+ return qeth_ipa_rc_def_msg[x].msg;
+ }
+ return qeth_ipa_rc_def_msg[x].msg;
+}
struct ipa_cmd_names {
enum qeth_ipa_cmds cmd;
diff --git a/drivers/s390/net/qeth_core_mpc.h b/drivers/s390/net/qeth_core_mpc.h
index 6257f00786b3..252fc84e6eca 100644
--- a/drivers/s390/net/qeth_core_mpc.h
+++ b/drivers/s390/net/qeth_core_mpc.h
@@ -159,13 +159,17 @@ enum qeth_ipa_return_codes {
IPA_RC_SUCCESS = 0x0000,
IPA_RC_NOTSUPP = 0x0001,
IPA_RC_IP_TABLE_FULL = 0x0002,
+ IPA_RC_INVALID_SUBCMD = 0x0002,
IPA_RC_UNKNOWN_ERROR = 0x0003,
+ IPA_RC_HARDWARE_AUTH_ERROR = 0x0003,
IPA_RC_UNSUPPORTED_COMMAND = 0x0004,
IPA_RC_TRACE_ALREADY_ACTIVE = 0x0005,
+ IPA_RC_VNICC_OOSEQ = 0x0005,
IPA_RC_INVALID_FORMAT = 0x0006,
IPA_RC_DUP_IPV6_REMOTE = 0x0008,
IPA_RC_SBP_IQD_NOT_CONFIGURED = 0x000C,
IPA_RC_DUP_IPV6_HOME = 0x0010,
+ IPA_RC_SBP_IQD_OS_MISMATCH = 0x0010,
IPA_RC_UNREGISTERED_ADDR = 0x0011,
IPA_RC_NO_ID_AVAILABLE = 0x0012,
IPA_RC_ID_NOT_FOUND = 0x0013,
@@ -173,6 +177,7 @@ enum qeth_ipa_return_codes {
IPA_RC_SBP_IQD_CURRENT_SECOND = 0x0018,
IPA_RC_SBP_IQD_LIMIT_SECOND = 0x001C,
IPA_RC_INVALID_IP_VERSION = 0x0020,
+ IPA_RC_SBP_IQD_NOT_AUTHD_BY_ZMAN = 0x0020,
IPA_RC_SBP_IQD_CURRENT_PRIMARY = 0x0024,
IPA_RC_LAN_FRAME_MISMATCH = 0x0040,
IPA_RC_SBP_IQD_NO_QDIO_QUEUES = 0x00EB,
@@ -220,16 +225,6 @@ enum qeth_ipa_return_codes {
IPA_RC_INVALID_IP_VERSION2 = 0xf001,
IPA_RC_FFFF = 0xffff
};
-/* for VNIC Characteristics */
-#define IPA_RC_VNICC_OOSEQ 0x0005
-
-/* for SET_DIAGNOSTIC_ASSIST */
-#define IPA_RC_INVALID_SUBCMD IPA_RC_IP_TABLE_FULL
-#define IPA_RC_HARDWARE_AUTH_ERROR IPA_RC_UNKNOWN_ERROR
-
-/* for SETBRIDGEPORT (double occupancies) */
-#define IPA_RC_SBP_IQD_OS_MISMATCH IPA_RC_DUP_IPV6_HOME
-#define IPA_RC_SBP_IQD_NOT_AUTHD_BY_ZMAN IPA_RC_INVALID_IP_VERSION
/* IPA function flags; each flag marks availability of respective function */
enum qeth_ipa_funcs {
@@ -862,8 +857,9 @@ enum qeth_ipa_arp_return_codes {
QETH_IPA_ARP_RC_Q_NO_DATA = 0x0008,
};
-extern const char *qeth_get_ipa_msg(enum qeth_ipa_return_codes rc);
-extern const char *qeth_get_ipa_cmd_name(enum qeth_ipa_cmds cmd);
+const char *qeth_get_ipa_msg(enum qeth_ipa_cmds cmd,
+ enum qeth_ipa_return_codes rc);
+const char *qeth_get_ipa_cmd_name(enum qeth_ipa_cmds cmd);
/* Helper functions */
#define IS_IPA_REPLY(cmd) ((cmd)->hdr.initiator == IPA_CMD_INITIATOR_HOST)
diff --git a/drivers/s390/net/smsgiucv_app.c b/drivers/s390/net/smsgiucv_app.c
index 7041c1dca1e8..1bd0370460cd 100644
--- a/drivers/s390/net/smsgiucv_app.c
+++ b/drivers/s390/net/smsgiucv_app.c
@@ -87,9 +87,10 @@ static struct smsg_app_event *smsg_app_event_alloc(const char *from,
ev->envp[3] = NULL;
/* setting up environment: sender, prefix name, and message text */
- snprintf(ev->envp[0], ENV_SENDER_LEN, ENV_SENDER_STR "%s", from);
- snprintf(ev->envp[1], ENV_PREFIX_LEN, ENV_PREFIX_STR "%s", SMSG_PREFIX);
- snprintf(ev->envp[2], ENV_TEXT_LEN(msg), ENV_TEXT_STR "%s", msg);
+ scnprintf(ev->envp[0], ENV_SENDER_LEN, ENV_SENDER_STR "%s", from);
+ scnprintf(ev->envp[1], ENV_PREFIX_LEN, ENV_PREFIX_STR "%s",
+ SMSG_PREFIX);
+ scnprintf(ev->envp[2], ENV_TEXT_LEN(msg), ENV_TEXT_STR "%s", msg);
return ev;
}