提交 cf370066 编写于 作者: V Viswas G 提交者: James Bottomley

[SCSI] pm80xx: Fixed return value issue

pm80xx_get_gsm_dump() was returning "1" in error case
instead of negative error value.
Signed-off-by: NViswas G <Viswas.G@pmcs.com>
Reviewed-by: NJack Wang <jinpu.wang@profitbricks.com>
Reviewed-by: NTomas Henzl <thenzl@redhat.com>
Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
上级 859b5d10
...@@ -452,7 +452,7 @@ static DEVICE_ATTR(iop_log, S_IRUGO, pm8001_ctl_iop_log_show, NULL); ...@@ -452,7 +452,7 @@ static DEVICE_ATTR(iop_log, S_IRUGO, pm8001_ctl_iop_log_show, NULL);
static ssize_t pm8001_ctl_fatal_log_show(struct device *cdev, static ssize_t pm8001_ctl_fatal_log_show(struct device *cdev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
u32 count; ssize_t count;
count = pm80xx_get_fatal_dump(cdev, attr, buf); count = pm80xx_get_fatal_dump(cdev, attr, buf);
return count; return count;
...@@ -470,7 +470,7 @@ static DEVICE_ATTR(fatal_log, S_IRUGO, pm8001_ctl_fatal_log_show, NULL); ...@@ -470,7 +470,7 @@ static DEVICE_ATTR(fatal_log, S_IRUGO, pm8001_ctl_fatal_log_show, NULL);
static ssize_t pm8001_ctl_gsm_log_show(struct device *cdev, static ssize_t pm8001_ctl_gsm_log_show(struct device *cdev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
u32 count; ssize_t count;
count = pm8001_get_gsm_dump(cdev, SYSFS_OFFSET, buf); count = pm8001_get_gsm_dump(cdev, SYSFS_OFFSET, buf);
return count; return count;
......
...@@ -5020,7 +5020,7 @@ pm8001_get_gsm_dump(struct device *cdev, u32 length, char *buf) ...@@ -5020,7 +5020,7 @@ pm8001_get_gsm_dump(struct device *cdev, u32 length, char *buf)
/* check max is 1 Mbytes */ /* check max is 1 Mbytes */
if ((length > 0x100000) || (gsm_dump_offset & 3) || if ((length > 0x100000) || (gsm_dump_offset & 3) ||
((gsm_dump_offset + length) > 0x1000000)) ((gsm_dump_offset + length) > 0x1000000))
return 1; return -EINVAL;
if (pm8001_ha->chip_id == chip_8001) if (pm8001_ha->chip_id == chip_8001)
bar = 2; bar = 2;
...@@ -5048,12 +5048,12 @@ pm8001_get_gsm_dump(struct device *cdev, u32 length, char *buf) ...@@ -5048,12 +5048,12 @@ pm8001_get_gsm_dump(struct device *cdev, u32 length, char *buf)
gsm_base = GSM_BASE; gsm_base = GSM_BASE;
if (-1 == pm8001_bar4_shift(pm8001_ha, if (-1 == pm8001_bar4_shift(pm8001_ha,
(gsm_base + shift_value))) (gsm_base + shift_value)))
return 1; return -EIO;
} else { } else {
gsm_base = 0; gsm_base = 0;
if (-1 == pm80xx_bar4_shift(pm8001_ha, if (-1 == pm80xx_bar4_shift(pm8001_ha,
(gsm_base + shift_value))) (gsm_base + shift_value)))
return 1; return -EIO;
} }
gsm_dump_offset = (gsm_dump_offset + offset) & gsm_dump_offset = (gsm_dump_offset + offset) &
0xFFFF0000; 0xFFFF0000;
...@@ -5073,7 +5073,7 @@ pm8001_get_gsm_dump(struct device *cdev, u32 length, char *buf) ...@@ -5073,7 +5073,7 @@ pm8001_get_gsm_dump(struct device *cdev, u32 length, char *buf)
} }
/* Shift back to BAR4 original address */ /* Shift back to BAR4 original address */
if (-1 == pm8001_bar4_shift(pm8001_ha, 0)) if (-1 == pm8001_bar4_shift(pm8001_ha, 0))
return 1; return -EIO;
pm8001_ha->fatal_forensic_shift_offset += 1024; pm8001_ha->fatal_forensic_shift_offset += 1024;
if (pm8001_ha->fatal_forensic_shift_offset >= 0x100000) if (pm8001_ha->fatal_forensic_shift_offset >= 0x100000)
......
...@@ -91,7 +91,6 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev, ...@@ -91,7 +91,6 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost); struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
struct pm8001_hba_info *pm8001_ha = sha->lldd_ha; struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
void __iomem *fatal_table_address = pm8001_ha->fatal_tbl_addr; void __iomem *fatal_table_address = pm8001_ha->fatal_tbl_addr;
u32 status = 1;
u32 accum_len , reg_val, index, *temp; u32 accum_len , reg_val, index, *temp;
unsigned long start; unsigned long start;
u8 *direct_data; u8 *direct_data;
...@@ -111,13 +110,10 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev, ...@@ -111,13 +110,10 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
direct_data = (u8 *)fatal_error_data; direct_data = (u8 *)fatal_error_data;
pm8001_ha->forensic_info.data_type = TYPE_NON_FATAL; pm8001_ha->forensic_info.data_type = TYPE_NON_FATAL;
pm8001_ha->forensic_info.data_buf.direct_len = SYSFS_OFFSET; pm8001_ha->forensic_info.data_buf.direct_len = SYSFS_OFFSET;
pm8001_ha->forensic_info.data_buf.direct_offset = 0;
pm8001_ha->forensic_info.data_buf.read_len = 0; pm8001_ha->forensic_info.data_buf.read_len = 0;
pm8001_ha->forensic_info.data_buf.direct_data = direct_data; pm8001_ha->forensic_info.data_buf.direct_data = direct_data;
}
if (pm8001_ha->forensic_info.data_buf.direct_offset == 0) {
/* start to get data */ /* start to get data */
/* Program the MEMBASE II Shifting Register with 0x00.*/ /* Program the MEMBASE II Shifting Register with 0x00.*/
pm8001_cw32(pm8001_ha, 0, MEMBASE_II_SHIFT_REGISTER, pm8001_cw32(pm8001_ha, 0, MEMBASE_II_SHIFT_REGISTER,
...@@ -126,6 +122,7 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev, ...@@ -126,6 +122,7 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
pm8001_ha->forensic_fatal_step = 0; pm8001_ha->forensic_fatal_step = 0;
pm8001_ha->fatal_bar_loc = 0; pm8001_ha->fatal_bar_loc = 0;
} }
/* Read until accum_len is retrived */ /* Read until accum_len is retrived */
accum_len = pm8001_mr32(fatal_table_address, accum_len = pm8001_mr32(fatal_table_address,
MPI_FATAL_EDUMP_TABLE_ACCUM_LEN); MPI_FATAL_EDUMP_TABLE_ACCUM_LEN);
...@@ -135,7 +132,7 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev, ...@@ -135,7 +132,7 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
PM8001_IO_DBG(pm8001_ha, PM8001_IO_DBG(pm8001_ha,
pm8001_printk("Possible PCI issue 0x%x not expected\n", pm8001_printk("Possible PCI issue 0x%x not expected\n",
accum_len)); accum_len));
return status; return -EIO;
} }
if (accum_len == 0 || accum_len >= 0x100000) { if (accum_len == 0 || accum_len >= 0x100000) {
pm8001_ha->forensic_info.data_buf.direct_data += pm8001_ha->forensic_info.data_buf.direct_data +=
...@@ -178,7 +175,6 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev, ...@@ -178,7 +175,6 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
pm8001_ha->forensic_fatal_step = 1; pm8001_ha->forensic_fatal_step = 1;
pm8001_ha->fatal_forensic_shift_offset = 0; pm8001_ha->fatal_forensic_shift_offset = 0;
pm8001_ha->forensic_last_offset = 0; pm8001_ha->forensic_last_offset = 0;
status = 0;
return (char *)pm8001_ha-> return (char *)pm8001_ha->
forensic_info.data_buf.direct_data - forensic_info.data_buf.direct_data -
(char *)buf; (char *)buf;
...@@ -194,7 +190,6 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev, ...@@ -194,7 +190,6 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
forensic_info.data_buf.direct_data, forensic_info.data_buf.direct_data,
"%08x ", *(temp + index)); "%08x ", *(temp + index));
} }
status = 0;
return (char *)pm8001_ha-> return (char *)pm8001_ha->
forensic_info.data_buf.direct_data - forensic_info.data_buf.direct_data -
(char *)buf; (char *)buf;
...@@ -214,7 +209,6 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev, ...@@ -214,7 +209,6 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
pm8001_cw32(pm8001_ha, 0, MEMBASE_II_SHIFT_REGISTER, pm8001_cw32(pm8001_ha, 0, MEMBASE_II_SHIFT_REGISTER,
pm8001_ha->fatal_forensic_shift_offset); pm8001_ha->fatal_forensic_shift_offset);
pm8001_ha->fatal_bar_loc = 0; pm8001_ha->fatal_bar_loc = 0;
status = 0;
return (char *)pm8001_ha->forensic_info.data_buf.direct_data - return (char *)pm8001_ha->forensic_info.data_buf.direct_data -
(char *)buf; (char *)buf;
} }
...@@ -239,7 +233,7 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev, ...@@ -239,7 +233,7 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
PM8001_FAIL_DBG(pm8001_ha, PM8001_FAIL_DBG(pm8001_ha,
pm8001_printk("TIMEOUT:MEMBASE_II_SHIFT_REGISTER" pm8001_printk("TIMEOUT:MEMBASE_II_SHIFT_REGISTER"
" = 0x%x\n", reg_val)); " = 0x%x\n", reg_val));
return -1; return -EIO;
} }
/* Read the next 64K of the debug data. */ /* Read the next 64K of the debug data. */
...@@ -259,7 +253,6 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev, ...@@ -259,7 +253,6 @@ ssize_t pm80xx_get_fatal_dump(struct device *cdev,
pm8001_ha->forensic_info.data_buf.direct_len = 0; pm8001_ha->forensic_info.data_buf.direct_len = 0;
pm8001_ha->forensic_info.data_buf.direct_offset = 0; pm8001_ha->forensic_info.data_buf.direct_offset = 0;
pm8001_ha->forensic_info.data_buf.read_len = 0; pm8001_ha->forensic_info.data_buf.read_len = 0;
status = 0;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册