Commit 68d1e5f0 authored by Stefan Weinhuber's avatar Stefan Weinhuber Committed by Martin Schwidefsky

[S390] dasd: tolerate devices that have no feature codes

The DASD device driver reads the feature codes of a device during
device initialization. These codes are later used to determine the
availability of advanced features like PAV or High Performance FICON.
Some very old devices do not support the command to read feature
codes and the initialization routine fails.
As the feature codes are not necessary for basic DASD operations, we
can support such devices by just ignoring missing feature codes.
Signed-off-by: default avatarStefan Weinhuber <wein@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 5314af69
...@@ -935,6 +935,7 @@ static int dasd_eckd_read_features(struct dasd_device *device) ...@@ -935,6 +935,7 @@ static int dasd_eckd_read_features(struct dasd_device *device)
struct dasd_eckd_private *private; struct dasd_eckd_private *private;
private = (struct dasd_eckd_private *) device->private; private = (struct dasd_eckd_private *) device->private;
memset(&private->features, 0, sizeof(struct dasd_rssd_features));
cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */ + 1 /* RSSD */, cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */ + 1 /* RSSD */,
(sizeof(struct dasd_psf_prssd_data) + (sizeof(struct dasd_psf_prssd_data) +
sizeof(struct dasd_rssd_features)), sizeof(struct dasd_rssd_features)),
...@@ -982,7 +983,9 @@ static int dasd_eckd_read_features(struct dasd_device *device) ...@@ -982,7 +983,9 @@ static int dasd_eckd_read_features(struct dasd_device *device)
features = (struct dasd_rssd_features *) (prssdp + 1); features = (struct dasd_rssd_features *) (prssdp + 1);
memcpy(&private->features, features, memcpy(&private->features, features,
sizeof(struct dasd_rssd_features)); sizeof(struct dasd_rssd_features));
} } else
dev_warn(&device->cdev->dev, "Reading device feature codes"
" failed with rc=%d\n", rc);
dasd_sfree_request(cqr, cqr->memdev); dasd_sfree_request(cqr, cqr->memdev);
return rc; return rc;
} }
...@@ -1144,9 +1147,7 @@ dasd_eckd_check_characteristics(struct dasd_device *device) ...@@ -1144,9 +1147,7 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
} }
/* Read Feature Codes */ /* Read Feature Codes */
rc = dasd_eckd_read_features(device); dasd_eckd_read_features(device);
if (rc)
goto out_err3;
/* Read Device Characteristics */ /* Read Device Characteristics */
rc = dasd_generic_read_dev_chars(device, DASD_ECKD_MAGIC, rc = dasd_generic_read_dev_chars(device, DASD_ECKD_MAGIC,
...@@ -3241,9 +3242,7 @@ int dasd_eckd_restore_device(struct dasd_device *device) ...@@ -3241,9 +3242,7 @@ int dasd_eckd_restore_device(struct dasd_device *device)
} }
/* Read Feature Codes */ /* Read Feature Codes */
rc = dasd_eckd_read_features(device); dasd_eckd_read_features(device);
if (rc)
goto out_err;
/* Read Device Characteristics */ /* Read Device Characteristics */
memset(&private->rdc_data, 0, sizeof(private->rdc_data)); memset(&private->rdc_data, 0, sizeof(private->rdc_data));
......
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