[SCSI] advansys: fix regression with request_firmware change
On newer kernels users of advansys module are reporting system hang when trying to load it without firmware files present. After looking closely at description on https://qa.mandriva.com/show_bug.cgi?id=53220, I think this is related to commit "[SCSI] advansys: use request_firmware". The problem is that after switch to request_firmware, asc_dvc->err_code isn't being set when firmware files aren't found or loading fails. err_code is used by the driver to judge if there was a fatal error or not, as can be seen for example on advansys_board_found, which will only return -ENODEV when err_code is set. Because err_code isn't being set when request_firmware fails, this is a change of behaviour of the code before request_firmware addition, making it continue to load and it fails later as the firmware wasn't really loaded. Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
Родитель
89162e9c21
Коммит
cf7474451c
|
@ -4781,12 +4781,14 @@ static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
|
|||
if (err) {
|
||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
||||
fwname, err);
|
||||
asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
|
||||
return err;
|
||||
}
|
||||
if (fw->size < 4) {
|
||||
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
||||
fw->size, fwname);
|
||||
release_firmware(fw);
|
||||
asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
|
||||
return -EINVAL;
|
||||
}
|
||||
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
||||
|
@ -5110,12 +5112,14 @@ static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
|
|||
if (err) {
|
||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
||||
fwname, err);
|
||||
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||
return err;
|
||||
}
|
||||
if (fw->size < 4) {
|
||||
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
||||
fw->size, fwname);
|
||||
release_firmware(fw);
|
||||
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||
return -EINVAL;
|
||||
}
|
||||
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
||||
|
@ -5624,12 +5628,14 @@ static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
|
|||
if (err) {
|
||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
||||
fwname, err);
|
||||
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||
return err;
|
||||
}
|
||||
if (fw->size < 4) {
|
||||
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
||||
fw->size, fwname);
|
||||
release_firmware(fw);
|
||||
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||
return -EINVAL;
|
||||
}
|
||||
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
||||
|
@ -6124,12 +6130,14 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
|
|||
if (err) {
|
||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
||||
fwname, err);
|
||||
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||
return err;
|
||||
}
|
||||
if (fw->size < 4) {
|
||||
printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
|
||||
fw->size, fwname);
|
||||
release_firmware(fw);
|
||||
asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
|
||||
return -EINVAL;
|
||||
}
|
||||
chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
|
||||
|
|
Загрузка…
Ссылка в новой задаче