diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_sup.c')
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_sup.c | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index 1728ab3ccb20..1bca74474935 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c | |||
| @@ -869,11 +869,9 @@ qla24xx_write_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr, | |||
| 869 | uint32_t i; | 869 | uint32_t i; |
| 870 | uint32_t *dwptr; | 870 | uint32_t *dwptr; |
| 871 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | 871 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; |
| 872 | unsigned long flags; | ||
| 873 | 872 | ||
| 874 | ret = QLA_SUCCESS; | 873 | ret = QLA_SUCCESS; |
| 875 | 874 | ||
| 876 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
| 877 | /* Enable flash write. */ | 875 | /* Enable flash write. */ |
| 878 | WRT_REG_DWORD(®->ctrl_status, | 876 | WRT_REG_DWORD(®->ctrl_status, |
| 879 | RD_REG_DWORD(®->ctrl_status) | CSRX_FLASH_ENABLE); | 877 | RD_REG_DWORD(®->ctrl_status) | CSRX_FLASH_ENABLE); |
| @@ -907,7 +905,6 @@ qla24xx_write_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr, | |||
| 907 | WRT_REG_DWORD(®->ctrl_status, | 905 | WRT_REG_DWORD(®->ctrl_status, |
| 908 | RD_REG_DWORD(®->ctrl_status) & ~CSRX_FLASH_ENABLE); | 906 | RD_REG_DWORD(®->ctrl_status) & ~CSRX_FLASH_ENABLE); |
| 909 | RD_REG_DWORD(®->ctrl_status); /* PCI Posting. */ | 907 | RD_REG_DWORD(®->ctrl_status); /* PCI Posting. */ |
| 910 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
| 911 | 908 | ||
| 912 | return ret; | 909 | return ret; |
| 913 | } | 910 | } |
| @@ -2306,6 +2303,51 @@ qla24xx_get_flash_version(scsi_qla_host_t *ha, void *mbuf) | |||
| 2306 | } | 2303 | } |
| 2307 | 2304 | ||
| 2308 | static int | 2305 | static int |
| 2306 | qla2xxx_is_vpd_valid(uint8_t *pos, uint8_t *end) | ||
| 2307 | { | ||
| 2308 | if (pos >= end || *pos != 0x82) | ||
| 2309 | return 0; | ||
| 2310 | |||
| 2311 | pos += 3 + pos[1]; | ||
| 2312 | if (pos >= end || *pos != 0x90) | ||
| 2313 | return 0; | ||
| 2314 | |||
| 2315 | pos += 3 + pos[1]; | ||
| 2316 | if (pos >= end || *pos != 0x78) | ||
| 2317 | return 0; | ||
| 2318 | |||
| 2319 | return 1; | ||
| 2320 | } | ||
| 2321 | |||
| 2322 | int | ||
| 2323 | qla2xxx_get_vpd_field(scsi_qla_host_t *ha, char *key, char *str, size_t size) | ||
| 2324 | { | ||
| 2325 | uint8_t *pos = ha->vpd; | ||
| 2326 | uint8_t *end = pos + ha->vpd_size; | ||
| 2327 | int len = 0; | ||
| 2328 | |||
| 2329 | if (!IS_FWI2_CAPABLE(ha) || !qla2xxx_is_vpd_valid(pos, end)) | ||
| 2330 | return 0; | ||
| 2331 | |||
| 2332 | while (pos < end && *pos != 0x78) { | ||
| 2333 | len = (*pos == 0x82) ? pos[1] : pos[2]; | ||
| 2334 | |||
| 2335 | if (!strncmp(pos, key, strlen(key))) | ||
| 2336 | break; | ||
| 2337 | |||
| 2338 | if (*pos != 0x90 && *pos != 0x91) | ||
| 2339 | pos += len; | ||
| 2340 | |||
| 2341 | pos += 3; | ||
| 2342 | } | ||
| 2343 | |||
| 2344 | if (pos < end - len && *pos != 0x78) | ||
| 2345 | return snprintf(str, size, "%.*s", len, pos + 3); | ||
| 2346 | |||
| 2347 | return 0; | ||
| 2348 | } | ||
| 2349 | |||
| 2350 | static int | ||
| 2309 | qla2xxx_hw_event_store(scsi_qla_host_t *ha, uint32_t *fdata) | 2351 | qla2xxx_hw_event_store(scsi_qla_host_t *ha, uint32_t *fdata) |
| 2310 | { | 2352 | { |
| 2311 | uint32_t d[2], faddr; | 2353 | uint32_t d[2], faddr; |
