diff options
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 26 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 462 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.h | 40 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 33 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dfs.c | 3 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_fw.h | 294 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 10 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gs.c | 9 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 295 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_iocb.c | 12 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 82 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 41 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mid.c | 4 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 139 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_sup.c | 263 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_version.h | 6 |
16 files changed, 1345 insertions, 374 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index cd53627cc761..c7acef50d5da 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -303,7 +303,7 @@ qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj, | |||
303 | else if (start == (ha->flt_region_boot * 4) || | 303 | else if (start == (ha->flt_region_boot * 4) || |
304 | start == (ha->flt_region_fw * 4)) | 304 | start == (ha->flt_region_fw * 4)) |
305 | valid = 1; | 305 | valid = 1; |
306 | else if (IS_QLA25XX(ha) && | 306 | else if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && |
307 | start == (ha->flt_region_vpd_nvram * 4)) | 307 | start == (ha->flt_region_vpd_nvram * 4)) |
308 | valid = 1; | 308 | valid = 1; |
309 | if (!valid) { | 309 | if (!valid) { |
@@ -815,6 +815,21 @@ qla2x00_total_isp_aborts_show(struct device *dev, | |||
815 | ha->qla_stats.total_isp_aborts); | 815 | ha->qla_stats.total_isp_aborts); |
816 | } | 816 | } |
817 | 817 | ||
818 | static ssize_t | ||
819 | qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr, | ||
820 | char *buf) | ||
821 | { | ||
822 | scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); | ||
823 | struct qla_hw_data *ha = vha->hw; | ||
824 | |||
825 | if (!IS_QLA81XX(ha)) | ||
826 | return snprintf(buf, PAGE_SIZE, "\n"); | ||
827 | |||
828 | return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x.%02x (%x)\n", | ||
829 | ha->mpi_version[0], ha->mpi_version[1], ha->mpi_version[2], | ||
830 | ha->mpi_version[3], ha->mpi_capabilities); | ||
831 | } | ||
832 | |||
818 | static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL); | 833 | static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL); |
819 | static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); | 834 | static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); |
820 | static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL); | 835 | static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL); |
@@ -839,6 +854,7 @@ static DEVICE_ATTR(optrom_fw_version, S_IRUGO, qla2x00_optrom_fw_version_show, | |||
839 | NULL); | 854 | NULL); |
840 | static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show, | 855 | static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show, |
841 | NULL); | 856 | NULL); |
857 | static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL); | ||
842 | 858 | ||
843 | struct device_attribute *qla2x00_host_attrs[] = { | 859 | struct device_attribute *qla2x00_host_attrs[] = { |
844 | &dev_attr_driver_version, | 860 | &dev_attr_driver_version, |
@@ -858,6 +874,7 @@ struct device_attribute *qla2x00_host_attrs[] = { | |||
858 | &dev_attr_optrom_fcode_version, | 874 | &dev_attr_optrom_fcode_version, |
859 | &dev_attr_optrom_fw_version, | 875 | &dev_attr_optrom_fw_version, |
860 | &dev_attr_total_isp_aborts, | 876 | &dev_attr_total_isp_aborts, |
877 | &dev_attr_mpi_version, | ||
861 | NULL, | 878 | NULL, |
862 | }; | 879 | }; |
863 | 880 | ||
@@ -892,6 +909,9 @@ qla2x00_get_host_speed(struct Scsi_Host *shost) | |||
892 | case PORT_SPEED_8GB: | 909 | case PORT_SPEED_8GB: |
893 | speed = FC_PORTSPEED_8GBIT; | 910 | speed = FC_PORTSPEED_8GBIT; |
894 | break; | 911 | break; |
912 | case PORT_SPEED_10GB: | ||
913 | speed = FC_PORTSPEED_10GBIT; | ||
914 | break; | ||
895 | } | 915 | } |
896 | fc_host_speed(shost) = speed; | 916 | fc_host_speed(shost) = speed; |
897 | } | 917 | } |
@@ -1382,7 +1402,9 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha) | |||
1382 | fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports; | 1402 | fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports; |
1383 | fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count; | 1403 | fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count; |
1384 | 1404 | ||
1385 | if (IS_QLA25XX(ha)) | 1405 | if (IS_QLA81XX(ha)) |
1406 | speed = FC_PORTSPEED_10GBIT; | ||
1407 | else if (IS_QLA25XX(ha)) | ||
1386 | speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | | 1408 | speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | |
1387 | FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; | 1409 | FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; |
1388 | else if (IS_QLA24XX_TYPE(ha)) | 1410 | else if (IS_QLA24XX_TYPE(ha)) |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 1cf77772623b..34760f8d4f17 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -310,6 +310,76 @@ qla2xxx_read_window(struct device_reg_2xxx __iomem *reg, uint32_t count, | |||
310 | *buf++ = htons(RD_REG_WORD(dmp_reg++)); | 310 | *buf++ = htons(RD_REG_WORD(dmp_reg++)); |
311 | } | 311 | } |
312 | 312 | ||
313 | static inline void * | ||
314 | qla24xx_copy_eft(struct qla_hw_data *ha, void *ptr) | ||
315 | { | ||
316 | if (!ha->eft) | ||
317 | return ptr; | ||
318 | |||
319 | memcpy(ptr, ha->eft, ntohl(ha->fw_dump->eft_size)); | ||
320 | return ptr + ntohl(ha->fw_dump->eft_size); | ||
321 | } | ||
322 | |||
323 | static inline void * | ||
324 | qla25xx_copy_fce(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) | ||
325 | { | ||
326 | uint32_t cnt; | ||
327 | uint32_t *iter_reg; | ||
328 | struct qla2xxx_fce_chain *fcec = ptr; | ||
329 | |||
330 | if (!ha->fce) | ||
331 | return ptr; | ||
332 | |||
333 | *last_chain = &fcec->type; | ||
334 | fcec->type = __constant_htonl(DUMP_CHAIN_FCE); | ||
335 | fcec->chain_size = htonl(sizeof(struct qla2xxx_fce_chain) + | ||
336 | fce_calc_size(ha->fce_bufs)); | ||
337 | fcec->size = htonl(fce_calc_size(ha->fce_bufs)); | ||
338 | fcec->addr_l = htonl(LSD(ha->fce_dma)); | ||
339 | fcec->addr_h = htonl(MSD(ha->fce_dma)); | ||
340 | |||
341 | iter_reg = fcec->eregs; | ||
342 | for (cnt = 0; cnt < 8; cnt++) | ||
343 | *iter_reg++ = htonl(ha->fce_mb[cnt]); | ||
344 | |||
345 | memcpy(iter_reg, ha->fce, ntohl(fcec->size)); | ||
346 | |||
347 | return iter_reg; | ||
348 | } | ||
349 | |||
350 | static inline void * | ||
351 | qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) | ||
352 | { | ||
353 | uint32_t cnt, que_idx; | ||
354 | uint8_t req_cnt, rsp_cnt, que_cnt; | ||
355 | struct qla2xxx_mq_chain *mq = ptr; | ||
356 | struct device_reg_25xxmq __iomem *reg; | ||
357 | |||
358 | if (!ha->mqenable) | ||
359 | return ptr; | ||
360 | |||
361 | mq = ptr; | ||
362 | *last_chain = &mq->type; | ||
363 | mq->type = __constant_htonl(DUMP_CHAIN_MQ); | ||
364 | mq->chain_size = __constant_htonl(sizeof(struct qla2xxx_mq_chain)); | ||
365 | |||
366 | req_cnt = find_first_zero_bit(ha->req_qid_map, ha->max_queues); | ||
367 | rsp_cnt = find_first_zero_bit(ha->rsp_qid_map, ha->max_queues); | ||
368 | que_cnt = req_cnt > rsp_cnt ? req_cnt : rsp_cnt; | ||
369 | mq->count = htonl(que_cnt); | ||
370 | for (cnt = 0; cnt < que_cnt; cnt++) { | ||
371 | reg = (struct device_reg_25xxmq *) ((void *) | ||
372 | ha->mqiobase + cnt * QLA_QUE_PAGE); | ||
373 | que_idx = cnt * 4; | ||
374 | mq->qregs[que_idx] = htonl(RD_REG_DWORD(®->req_q_in)); | ||
375 | mq->qregs[que_idx+1] = htonl(RD_REG_DWORD(®->req_q_out)); | ||
376 | mq->qregs[que_idx+2] = htonl(RD_REG_DWORD(®->rsp_q_in)); | ||
377 | mq->qregs[que_idx+3] = htonl(RD_REG_DWORD(®->rsp_q_out)); | ||
378 | } | ||
379 | |||
380 | return ptr + sizeof(struct qla2xxx_mq_chain); | ||
381 | } | ||
382 | |||
313 | /** | 383 | /** |
314 | * qla2300_fw_dump() - Dumps binary data from the 2300 firmware. | 384 | * qla2300_fw_dump() - Dumps binary data from the 2300 firmware. |
315 | * @ha: HA context | 385 | * @ha: HA context |
@@ -913,8 +983,8 @@ qla24xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | |||
913 | goto qla24xx_fw_dump_failed_0; | 983 | goto qla24xx_fw_dump_failed_0; |
914 | 984 | ||
915 | nxt = qla2xxx_copy_queues(ha, nxt); | 985 | nxt = qla2xxx_copy_queues(ha, nxt); |
916 | if (ha->eft) | 986 | |
917 | memcpy(nxt, ha->eft, ntohl(ha->fw_dump->eft_size)); | 987 | qla24xx_copy_eft(ha, nxt); |
918 | 988 | ||
919 | qla24xx_fw_dump_failed_0: | 989 | qla24xx_fw_dump_failed_0: |
920 | if (rval != QLA_SUCCESS) { | 990 | if (rval != QLA_SUCCESS) { |
@@ -942,19 +1012,14 @@ qla25xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | |||
942 | uint32_t risc_address; | 1012 | uint32_t risc_address; |
943 | struct qla_hw_data *ha = vha->hw; | 1013 | struct qla_hw_data *ha = vha->hw; |
944 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | 1014 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; |
945 | struct device_reg_25xxmq __iomem *reg25; | ||
946 | uint32_t __iomem *dmp_reg; | 1015 | uint32_t __iomem *dmp_reg; |
947 | uint32_t *iter_reg; | 1016 | uint32_t *iter_reg; |
948 | uint16_t __iomem *mbx_reg; | 1017 | uint16_t __iomem *mbx_reg; |
949 | unsigned long flags; | 1018 | unsigned long flags; |
950 | struct qla25xx_fw_dump *fw; | 1019 | struct qla25xx_fw_dump *fw; |
951 | uint32_t ext_mem_cnt; | 1020 | uint32_t ext_mem_cnt; |
952 | void *nxt; | 1021 | void *nxt, *nxt_chain; |
953 | struct qla2xxx_fce_chain *fcec; | 1022 | uint32_t *last_chain = NULL; |
954 | struct qla2xxx_mq_chain *mq = NULL; | ||
955 | uint32_t qreg_size; | ||
956 | uint8_t req_cnt, rsp_cnt, que_cnt; | ||
957 | uint32_t que_idx; | ||
958 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); | 1023 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); |
959 | 1024 | ||
960 | risc_address = ext_mem_cnt = 0; | 1025 | risc_address = ext_mem_cnt = 0; |
@@ -1001,28 +1066,6 @@ qla25xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | |||
1001 | fw->pcie_regs[2] = htonl(RD_REG_DWORD(dmp_reg)); | 1066 | fw->pcie_regs[2] = htonl(RD_REG_DWORD(dmp_reg)); |
1002 | fw->pcie_regs[3] = htonl(RD_REG_DWORD(®->iobase_window)); | 1067 | fw->pcie_regs[3] = htonl(RD_REG_DWORD(®->iobase_window)); |
1003 | 1068 | ||
1004 | /* Multi queue registers */ | ||
1005 | if (ha->mqenable) { | ||
1006 | qreg_size = sizeof(struct qla2xxx_mq_chain); | ||
1007 | mq = kzalloc(qreg_size, GFP_KERNEL); | ||
1008 | if (!mq) | ||
1009 | goto qla25xx_fw_dump_failed_0; | ||
1010 | req_cnt = find_first_zero_bit(ha->req_qid_map, ha->max_queues); | ||
1011 | rsp_cnt = find_first_zero_bit(ha->rsp_qid_map, ha->max_queues); | ||
1012 | que_cnt = req_cnt > rsp_cnt ? req_cnt : rsp_cnt; | ||
1013 | mq->count = htonl(que_cnt); | ||
1014 | mq->chain_size = htonl(qreg_size); | ||
1015 | mq->type = __constant_htonl(DUMP_CHAIN_MQ); | ||
1016 | for (cnt = 0; cnt < que_cnt; cnt++) { | ||
1017 | reg25 = (struct device_reg_25xxmq *) ((void *) | ||
1018 | ha->mqiobase + cnt * QLA_QUE_PAGE); | ||
1019 | que_idx = cnt * 4; | ||
1020 | mq->qregs[que_idx] = htonl(reg25->req_q_in); | ||
1021 | mq->qregs[que_idx+1] = htonl(reg25->req_q_out); | ||
1022 | mq->qregs[que_idx+2] = htonl(reg25->rsp_q_in); | ||
1023 | mq->qregs[que_idx+3] = htonl(reg25->rsp_q_out); | ||
1024 | } | ||
1025 | } | ||
1026 | WRT_REG_DWORD(®->iobase_window, 0x00); | 1069 | WRT_REG_DWORD(®->iobase_window, 0x00); |
1027 | RD_REG_DWORD(®->iobase_window); | 1070 | RD_REG_DWORD(®->iobase_window); |
1028 | 1071 | ||
@@ -1240,6 +1283,10 @@ qla25xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | |||
1240 | iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg); | 1283 | iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg); |
1241 | qla24xx_read_window(reg, 0x6F00, 16, iter_reg); | 1284 | qla24xx_read_window(reg, 0x6F00, 16, iter_reg); |
1242 | 1285 | ||
1286 | /* Multi queue registers */ | ||
1287 | nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset, | ||
1288 | &last_chain); | ||
1289 | |||
1243 | rval = qla24xx_soft_reset(ha); | 1290 | rval = qla24xx_soft_reset(ha); |
1244 | if (rval != QLA_SUCCESS) | 1291 | if (rval != QLA_SUCCESS) |
1245 | goto qla25xx_fw_dump_failed_0; | 1292 | goto qla25xx_fw_dump_failed_0; |
@@ -1249,39 +1296,341 @@ qla25xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | |||
1249 | if (rval != QLA_SUCCESS) | 1296 | if (rval != QLA_SUCCESS) |
1250 | goto qla25xx_fw_dump_failed_0; | 1297 | goto qla25xx_fw_dump_failed_0; |
1251 | 1298 | ||
1252 | /* Fibre Channel Trace Buffer. */ | ||
1253 | nxt = qla2xxx_copy_queues(ha, nxt); | 1299 | nxt = qla2xxx_copy_queues(ha, nxt); |
1254 | if (ha->eft) | ||
1255 | memcpy(nxt, ha->eft, ntohl(ha->fw_dump->eft_size)); | ||
1256 | 1300 | ||
1257 | /* Fibre Channel Event Buffer. */ | 1301 | nxt = qla24xx_copy_eft(ha, nxt); |
1258 | if (!ha->fce) | 1302 | |
1259 | goto qla25xx_fw_dump_failed_0; | 1303 | /* Chain entries -- started with MQ. */ |
1304 | qla25xx_copy_fce(ha, nxt_chain, &last_chain); | ||
1305 | if (last_chain) { | ||
1306 | ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); | ||
1307 | *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); | ||
1308 | } | ||
1260 | 1309 | ||
1261 | ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); | 1310 | qla25xx_fw_dump_failed_0: |
1311 | if (rval != QLA_SUCCESS) { | ||
1312 | qla_printk(KERN_WARNING, ha, | ||
1313 | "Failed to dump firmware (%x)!!!\n", rval); | ||
1314 | ha->fw_dumped = 0; | ||
1262 | 1315 | ||
1263 | if (ha->mqenable) { | ||
1264 | nxt = nxt + ntohl(ha->fw_dump->eft_size); | ||
1265 | memcpy(nxt, mq, qreg_size); | ||
1266 | kfree(mq); | ||
1267 | fcec = nxt + qreg_size; | ||
1268 | } else { | 1316 | } else { |
1269 | fcec = nxt + ntohl(ha->fw_dump->eft_size); | 1317 | qla_printk(KERN_INFO, ha, |
1318 | "Firmware dump saved to temp buffer (%ld/%p).\n", | ||
1319 | base_vha->host_no, ha->fw_dump); | ||
1320 | ha->fw_dumped = 1; | ||
1270 | } | 1321 | } |
1271 | fcec->type = __constant_htonl(DUMP_CHAIN_FCE | DUMP_CHAIN_LAST); | ||
1272 | fcec->chain_size = htonl(sizeof(struct qla2xxx_fce_chain) + | ||
1273 | fce_calc_size(ha->fce_bufs)); | ||
1274 | fcec->size = htonl(fce_calc_size(ha->fce_bufs)); | ||
1275 | fcec->addr_l = htonl(LSD(ha->fce_dma)); | ||
1276 | fcec->addr_h = htonl(MSD(ha->fce_dma)); | ||
1277 | 1322 | ||
1278 | iter_reg = fcec->eregs; | 1323 | qla25xx_fw_dump_failed: |
1279 | for (cnt = 0; cnt < 8; cnt++) | 1324 | if (!hardware_locked) |
1280 | *iter_reg++ = htonl(ha->fce_mb[cnt]); | 1325 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1326 | } | ||
1281 | 1327 | ||
1282 | memcpy(iter_reg, ha->fce, ntohl(fcec->size)); | 1328 | void |
1329 | qla81xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | ||
1330 | { | ||
1331 | int rval; | ||
1332 | uint32_t cnt; | ||
1333 | uint32_t risc_address; | ||
1334 | struct qla_hw_data *ha = vha->hw; | ||
1335 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | ||
1336 | uint32_t __iomem *dmp_reg; | ||
1337 | uint32_t *iter_reg; | ||
1338 | uint16_t __iomem *mbx_reg; | ||
1339 | unsigned long flags; | ||
1340 | struct qla81xx_fw_dump *fw; | ||
1341 | uint32_t ext_mem_cnt; | ||
1342 | void *nxt, *nxt_chain; | ||
1343 | uint32_t *last_chain = NULL; | ||
1344 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); | ||
1283 | 1345 | ||
1284 | qla25xx_fw_dump_failed_0: | 1346 | risc_address = ext_mem_cnt = 0; |
1347 | flags = 0; | ||
1348 | |||
1349 | if (!hardware_locked) | ||
1350 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1351 | |||
1352 | if (!ha->fw_dump) { | ||
1353 | qla_printk(KERN_WARNING, ha, | ||
1354 | "No buffer available for dump!!!\n"); | ||
1355 | goto qla81xx_fw_dump_failed; | ||
1356 | } | ||
1357 | |||
1358 | if (ha->fw_dumped) { | ||
1359 | qla_printk(KERN_WARNING, ha, | ||
1360 | "Firmware has been previously dumped (%p) -- ignoring " | ||
1361 | "request...\n", ha->fw_dump); | ||
1362 | goto qla81xx_fw_dump_failed; | ||
1363 | } | ||
1364 | fw = &ha->fw_dump->isp.isp81; | ||
1365 | qla2xxx_prep_dump(ha, ha->fw_dump); | ||
1366 | |||
1367 | fw->host_status = htonl(RD_REG_DWORD(®->host_status)); | ||
1368 | |||
1369 | /* Pause RISC. */ | ||
1370 | rval = qla24xx_pause_risc(reg); | ||
1371 | if (rval != QLA_SUCCESS) | ||
1372 | goto qla81xx_fw_dump_failed_0; | ||
1373 | |||
1374 | /* Host/Risc registers. */ | ||
1375 | iter_reg = fw->host_risc_reg; | ||
1376 | iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg); | ||
1377 | qla24xx_read_window(reg, 0x7010, 16, iter_reg); | ||
1378 | |||
1379 | /* PCIe registers. */ | ||
1380 | WRT_REG_DWORD(®->iobase_addr, 0x7C00); | ||
1381 | RD_REG_DWORD(®->iobase_addr); | ||
1382 | WRT_REG_DWORD(®->iobase_window, 0x01); | ||
1383 | dmp_reg = ®->iobase_c4; | ||
1384 | fw->pcie_regs[0] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1385 | fw->pcie_regs[1] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1386 | fw->pcie_regs[2] = htonl(RD_REG_DWORD(dmp_reg)); | ||
1387 | fw->pcie_regs[3] = htonl(RD_REG_DWORD(®->iobase_window)); | ||
1388 | |||
1389 | WRT_REG_DWORD(®->iobase_window, 0x00); | ||
1390 | RD_REG_DWORD(®->iobase_window); | ||
1391 | |||
1392 | /* Host interface registers. */ | ||
1393 | dmp_reg = ®->flash_addr; | ||
1394 | for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) | ||
1395 | fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1396 | |||
1397 | /* Disable interrupts. */ | ||
1398 | WRT_REG_DWORD(®->ictrl, 0); | ||
1399 | RD_REG_DWORD(®->ictrl); | ||
1400 | |||
1401 | /* Shadow registers. */ | ||
1402 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); | ||
1403 | RD_REG_DWORD(®->iobase_addr); | ||
1404 | WRT_REG_DWORD(®->iobase_select, 0xB0000000); | ||
1405 | fw->shadow_reg[0] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1406 | |||
1407 | WRT_REG_DWORD(®->iobase_select, 0xB0100000); | ||
1408 | fw->shadow_reg[1] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1409 | |||
1410 | WRT_REG_DWORD(®->iobase_select, 0xB0200000); | ||
1411 | fw->shadow_reg[2] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1412 | |||
1413 | WRT_REG_DWORD(®->iobase_select, 0xB0300000); | ||
1414 | fw->shadow_reg[3] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1415 | |||
1416 | WRT_REG_DWORD(®->iobase_select, 0xB0400000); | ||
1417 | fw->shadow_reg[4] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1418 | |||
1419 | WRT_REG_DWORD(®->iobase_select, 0xB0500000); | ||
1420 | fw->shadow_reg[5] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1421 | |||
1422 | WRT_REG_DWORD(®->iobase_select, 0xB0600000); | ||
1423 | fw->shadow_reg[6] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1424 | |||
1425 | WRT_REG_DWORD(®->iobase_select, 0xB0700000); | ||
1426 | fw->shadow_reg[7] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1427 | |||
1428 | WRT_REG_DWORD(®->iobase_select, 0xB0800000); | ||
1429 | fw->shadow_reg[8] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1430 | |||
1431 | WRT_REG_DWORD(®->iobase_select, 0xB0900000); | ||
1432 | fw->shadow_reg[9] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1433 | |||
1434 | WRT_REG_DWORD(®->iobase_select, 0xB0A00000); | ||
1435 | fw->shadow_reg[10] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1436 | |||
1437 | /* RISC I/O register. */ | ||
1438 | WRT_REG_DWORD(®->iobase_addr, 0x0010); | ||
1439 | fw->risc_io_reg = htonl(RD_REG_DWORD(®->iobase_window)); | ||
1440 | |||
1441 | /* Mailbox registers. */ | ||
1442 | mbx_reg = ®->mailbox0; | ||
1443 | for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) | ||
1444 | fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++)); | ||
1445 | |||
1446 | /* Transfer sequence registers. */ | ||
1447 | iter_reg = fw->xseq_gp_reg; | ||
1448 | iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg); | ||
1449 | iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg); | ||
1450 | iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg); | ||
1451 | iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg); | ||
1452 | iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg); | ||
1453 | iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg); | ||
1454 | iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg); | ||
1455 | qla24xx_read_window(reg, 0xBF70, 16, iter_reg); | ||
1456 | |||
1457 | iter_reg = fw->xseq_0_reg; | ||
1458 | iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg); | ||
1459 | iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg); | ||
1460 | qla24xx_read_window(reg, 0xBFE0, 16, iter_reg); | ||
1461 | |||
1462 | qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg); | ||
1463 | |||
1464 | /* Receive sequence registers. */ | ||
1465 | iter_reg = fw->rseq_gp_reg; | ||
1466 | iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg); | ||
1467 | iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg); | ||
1468 | iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg); | ||
1469 | iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg); | ||
1470 | iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg); | ||
1471 | iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg); | ||
1472 | iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg); | ||
1473 | qla24xx_read_window(reg, 0xFF70, 16, iter_reg); | ||
1474 | |||
1475 | iter_reg = fw->rseq_0_reg; | ||
1476 | iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg); | ||
1477 | qla24xx_read_window(reg, 0xFFD0, 16, iter_reg); | ||
1478 | |||
1479 | qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg); | ||
1480 | qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg); | ||
1481 | |||
1482 | /* Auxiliary sequence registers. */ | ||
1483 | iter_reg = fw->aseq_gp_reg; | ||
1484 | iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg); | ||
1485 | iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg); | ||
1486 | iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg); | ||
1487 | iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg); | ||
1488 | iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg); | ||
1489 | iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg); | ||
1490 | iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg); | ||
1491 | qla24xx_read_window(reg, 0xB070, 16, iter_reg); | ||
1492 | |||
1493 | iter_reg = fw->aseq_0_reg; | ||
1494 | iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg); | ||
1495 | qla24xx_read_window(reg, 0xB0D0, 16, iter_reg); | ||
1496 | |||
1497 | qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg); | ||
1498 | qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg); | ||
1499 | |||
1500 | /* Command DMA registers. */ | ||
1501 | qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg); | ||
1502 | |||
1503 | /* Queues. */ | ||
1504 | iter_reg = fw->req0_dma_reg; | ||
1505 | iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg); | ||
1506 | dmp_reg = ®->iobase_q; | ||
1507 | for (cnt = 0; cnt < 7; cnt++) | ||
1508 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1509 | |||
1510 | iter_reg = fw->resp0_dma_reg; | ||
1511 | iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg); | ||
1512 | dmp_reg = ®->iobase_q; | ||
1513 | for (cnt = 0; cnt < 7; cnt++) | ||
1514 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1515 | |||
1516 | iter_reg = fw->req1_dma_reg; | ||
1517 | iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg); | ||
1518 | dmp_reg = ®->iobase_q; | ||
1519 | for (cnt = 0; cnt < 7; cnt++) | ||
1520 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1521 | |||
1522 | /* Transmit DMA registers. */ | ||
1523 | iter_reg = fw->xmt0_dma_reg; | ||
1524 | iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg); | ||
1525 | qla24xx_read_window(reg, 0x7610, 16, iter_reg); | ||
1526 | |||
1527 | iter_reg = fw->xmt1_dma_reg; | ||
1528 | iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg); | ||
1529 | qla24xx_read_window(reg, 0x7630, 16, iter_reg); | ||
1530 | |||
1531 | iter_reg = fw->xmt2_dma_reg; | ||
1532 | iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg); | ||
1533 | qla24xx_read_window(reg, 0x7650, 16, iter_reg); | ||
1534 | |||
1535 | iter_reg = fw->xmt3_dma_reg; | ||
1536 | iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg); | ||
1537 | qla24xx_read_window(reg, 0x7670, 16, iter_reg); | ||
1538 | |||
1539 | iter_reg = fw->xmt4_dma_reg; | ||
1540 | iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg); | ||
1541 | qla24xx_read_window(reg, 0x7690, 16, iter_reg); | ||
1542 | |||
1543 | qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg); | ||
1544 | |||
1545 | /* Receive DMA registers. */ | ||
1546 | iter_reg = fw->rcvt0_data_dma_reg; | ||
1547 | iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg); | ||
1548 | qla24xx_read_window(reg, 0x7710, 16, iter_reg); | ||
1549 | |||
1550 | iter_reg = fw->rcvt1_data_dma_reg; | ||
1551 | iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg); | ||
1552 | qla24xx_read_window(reg, 0x7730, 16, iter_reg); | ||
1553 | |||
1554 | /* RISC registers. */ | ||
1555 | iter_reg = fw->risc_gp_reg; | ||
1556 | iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg); | ||
1557 | iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg); | ||
1558 | iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg); | ||
1559 | iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg); | ||
1560 | iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg); | ||
1561 | iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg); | ||
1562 | iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg); | ||
1563 | qla24xx_read_window(reg, 0x0F70, 16, iter_reg); | ||
1564 | |||
1565 | /* Local memory controller registers. */ | ||
1566 | iter_reg = fw->lmc_reg; | ||
1567 | iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg); | ||
1568 | iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg); | ||
1569 | iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg); | ||
1570 | iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg); | ||
1571 | iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg); | ||
1572 | iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg); | ||
1573 | iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg); | ||
1574 | qla24xx_read_window(reg, 0x3070, 16, iter_reg); | ||
1575 | |||
1576 | /* Fibre Protocol Module registers. */ | ||
1577 | iter_reg = fw->fpm_hdw_reg; | ||
1578 | iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg); | ||
1579 | iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg); | ||
1580 | iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg); | ||
1581 | iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg); | ||
1582 | iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg); | ||
1583 | iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg); | ||
1584 | iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg); | ||
1585 | iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg); | ||
1586 | iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg); | ||
1587 | iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg); | ||
1588 | iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg); | ||
1589 | iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg); | ||
1590 | iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg); | ||
1591 | qla24xx_read_window(reg, 0x40D0, 16, iter_reg); | ||
1592 | |||
1593 | /* Frame Buffer registers. */ | ||
1594 | iter_reg = fw->fb_hdw_reg; | ||
1595 | iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg); | ||
1596 | iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg); | ||
1597 | iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg); | ||
1598 | iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg); | ||
1599 | iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg); | ||
1600 | iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg); | ||
1601 | iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg); | ||
1602 | iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg); | ||
1603 | iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg); | ||
1604 | iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg); | ||
1605 | iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg); | ||
1606 | iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg); | ||
1607 | qla24xx_read_window(reg, 0x6F00, 16, iter_reg); | ||
1608 | |||
1609 | /* Multi queue registers */ | ||
1610 | nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset, | ||
1611 | &last_chain); | ||
1612 | |||
1613 | rval = qla24xx_soft_reset(ha); | ||
1614 | if (rval != QLA_SUCCESS) | ||
1615 | goto qla81xx_fw_dump_failed_0; | ||
1616 | |||
1617 | rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram), | ||
1618 | &nxt); | ||
1619 | if (rval != QLA_SUCCESS) | ||
1620 | goto qla81xx_fw_dump_failed_0; | ||
1621 | |||
1622 | nxt = qla2xxx_copy_queues(ha, nxt); | ||
1623 | |||
1624 | nxt = qla24xx_copy_eft(ha, nxt); | ||
1625 | |||
1626 | /* Chain entries -- started with MQ. */ | ||
1627 | qla25xx_copy_fce(ha, nxt_chain, &last_chain); | ||
1628 | if (last_chain) { | ||
1629 | ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); | ||
1630 | *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); | ||
1631 | } | ||
1632 | |||
1633 | qla81xx_fw_dump_failed_0: | ||
1285 | if (rval != QLA_SUCCESS) { | 1634 | if (rval != QLA_SUCCESS) { |
1286 | qla_printk(KERN_WARNING, ha, | 1635 | qla_printk(KERN_WARNING, ha, |
1287 | "Failed to dump firmware (%x)!!!\n", rval); | 1636 | "Failed to dump firmware (%x)!!!\n", rval); |
@@ -1294,10 +1643,11 @@ qla25xx_fw_dump_failed_0: | |||
1294 | ha->fw_dumped = 1; | 1643 | ha->fw_dumped = 1; |
1295 | } | 1644 | } |
1296 | 1645 | ||
1297 | qla25xx_fw_dump_failed: | 1646 | qla81xx_fw_dump_failed: |
1298 | if (!hardware_locked) | 1647 | if (!hardware_locked) |
1299 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1648 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1300 | } | 1649 | } |
1650 | |||
1301 | /****************************************************************************/ | 1651 | /****************************************************************************/ |
1302 | /* Driver Debug Functions. */ | 1652 | /* Driver Debug Functions. */ |
1303 | /****************************************************************************/ | 1653 | /****************************************************************************/ |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h index c1794a70a45f..f660dd70b72e 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.h +++ b/drivers/scsi/qla2xxx/qla_dbg.h | |||
@@ -251,6 +251,45 @@ struct qla25xx_fw_dump { | |||
251 | uint32_t ext_mem[1]; | 251 | uint32_t ext_mem[1]; |
252 | }; | 252 | }; |
253 | 253 | ||
254 | struct qla81xx_fw_dump { | ||
255 | uint32_t host_status; | ||
256 | uint32_t host_risc_reg[32]; | ||
257 | uint32_t pcie_regs[4]; | ||
258 | uint32_t host_reg[32]; | ||
259 | uint32_t shadow_reg[11]; | ||
260 | uint32_t risc_io_reg; | ||
261 | uint16_t mailbox_reg[32]; | ||
262 | uint32_t xseq_gp_reg[128]; | ||
263 | uint32_t xseq_0_reg[48]; | ||
264 | uint32_t xseq_1_reg[16]; | ||
265 | uint32_t rseq_gp_reg[128]; | ||
266 | uint32_t rseq_0_reg[32]; | ||
267 | uint32_t rseq_1_reg[16]; | ||
268 | uint32_t rseq_2_reg[16]; | ||
269 | uint32_t aseq_gp_reg[128]; | ||
270 | uint32_t aseq_0_reg[32]; | ||
271 | uint32_t aseq_1_reg[16]; | ||
272 | uint32_t aseq_2_reg[16]; | ||
273 | uint32_t cmd_dma_reg[16]; | ||
274 | uint32_t req0_dma_reg[15]; | ||
275 | uint32_t resp0_dma_reg[15]; | ||
276 | uint32_t req1_dma_reg[15]; | ||
277 | uint32_t xmt0_dma_reg[32]; | ||
278 | uint32_t xmt1_dma_reg[32]; | ||
279 | uint32_t xmt2_dma_reg[32]; | ||
280 | uint32_t xmt3_dma_reg[32]; | ||
281 | uint32_t xmt4_dma_reg[32]; | ||
282 | uint32_t xmt_data_dma_reg[16]; | ||
283 | uint32_t rcvt0_data_dma_reg[32]; | ||
284 | uint32_t rcvt1_data_dma_reg[32]; | ||
285 | uint32_t risc_gp_reg[128]; | ||
286 | uint32_t lmc_reg[128]; | ||
287 | uint32_t fpm_hdw_reg[224]; | ||
288 | uint32_t fb_hdw_reg[208]; | ||
289 | uint32_t code_ram[0x2000]; | ||
290 | uint32_t ext_mem[1]; | ||
291 | }; | ||
292 | |||
254 | #define EFT_NUM_BUFFERS 4 | 293 | #define EFT_NUM_BUFFERS 4 |
255 | #define EFT_BYTES_PER_BUFFER 0x4000 | 294 | #define EFT_BYTES_PER_BUFFER 0x4000 |
256 | #define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS)) | 295 | #define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS)) |
@@ -313,5 +352,6 @@ struct qla2xxx_fw_dump { | |||
313 | struct qla2300_fw_dump isp23; | 352 | struct qla2300_fw_dump isp23; |
314 | struct qla24xx_fw_dump isp24; | 353 | struct qla24xx_fw_dump isp24; |
315 | struct qla25xx_fw_dump isp25; | 354 | struct qla25xx_fw_dump isp25; |
355 | struct qla81xx_fw_dump isp81; | ||
316 | } isp; | 356 | } isp; |
317 | }; | 357 | }; |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index a29c95204975..023ee77fb027 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -187,7 +187,6 @@ struct req_que; | |||
187 | * SCSI Request Block | 187 | * SCSI Request Block |
188 | */ | 188 | */ |
189 | typedef struct srb { | 189 | typedef struct srb { |
190 | struct scsi_qla_host *vha; /* HA the SP is queued on */ | ||
191 | struct req_que *que; | 190 | struct req_que *que; |
192 | struct fc_port *fcport; | 191 | struct fc_port *fcport; |
193 | 192 | ||
@@ -2136,7 +2135,6 @@ struct qla_msix_entry { | |||
2136 | /* Work events. */ | 2135 | /* Work events. */ |
2137 | enum qla_work_type { | 2136 | enum qla_work_type { |
2138 | QLA_EVT_AEN, | 2137 | QLA_EVT_AEN, |
2139 | QLA_EVT_HWE_LOG, | ||
2140 | }; | 2138 | }; |
2141 | 2139 | ||
2142 | 2140 | ||
@@ -2151,10 +2149,6 @@ struct qla_work_evt { | |||
2151 | enum fc_host_event_code code; | 2149 | enum fc_host_event_code code; |
2152 | u32 data; | 2150 | u32 data; |
2153 | } aen; | 2151 | } aen; |
2154 | struct { | ||
2155 | uint16_t code; | ||
2156 | uint16_t d1, d2, d3; | ||
2157 | } hwe; | ||
2158 | } u; | 2152 | } u; |
2159 | }; | 2153 | }; |
2160 | 2154 | ||
@@ -2309,6 +2303,7 @@ struct qla_hw_data { | |||
2309 | #define PORT_SPEED_2GB 0x01 | 2303 | #define PORT_SPEED_2GB 0x01 |
2310 | #define PORT_SPEED_4GB 0x03 | 2304 | #define PORT_SPEED_4GB 0x03 |
2311 | #define PORT_SPEED_8GB 0x04 | 2305 | #define PORT_SPEED_8GB 0x04 |
2306 | #define PORT_SPEED_10GB 0x13 | ||
2312 | uint16_t link_data_rate; /* F/W operating speed */ | 2307 | uint16_t link_data_rate; /* F/W operating speed */ |
2313 | 2308 | ||
2314 | uint8_t current_topology; | 2309 | uint8_t current_topology; |
@@ -2328,6 +2323,7 @@ struct qla_hw_data { | |||
2328 | 2323 | ||
2329 | #define PCI_DEVICE_ID_QLOGIC_ISP2532 0x2532 | 2324 | #define PCI_DEVICE_ID_QLOGIC_ISP2532 0x2532 |
2330 | #define PCI_DEVICE_ID_QLOGIC_ISP8432 0x8432 | 2325 | #define PCI_DEVICE_ID_QLOGIC_ISP8432 0x8432 |
2326 | #define PCI_DEVICE_ID_QLOGIC_ISP8001 0x8001 | ||
2331 | uint32_t device_type; | 2327 | uint32_t device_type; |
2332 | #define DT_ISP2100 BIT_0 | 2328 | #define DT_ISP2100 BIT_0 |
2333 | #define DT_ISP2200 BIT_1 | 2329 | #define DT_ISP2200 BIT_1 |
@@ -2342,7 +2338,8 @@ struct qla_hw_data { | |||
2342 | #define DT_ISP5432 BIT_10 | 2338 | #define DT_ISP5432 BIT_10 |
2343 | #define DT_ISP2532 BIT_11 | 2339 | #define DT_ISP2532 BIT_11 |
2344 | #define DT_ISP8432 BIT_12 | 2340 | #define DT_ISP8432 BIT_12 |
2345 | #define DT_ISP_LAST (DT_ISP8432 << 1) | 2341 | #define DT_ISP8001 BIT_13 |
2342 | #define DT_ISP_LAST (DT_ISP8001 << 1) | ||
2346 | 2343 | ||
2347 | #define DT_IIDMA BIT_26 | 2344 | #define DT_IIDMA BIT_26 |
2348 | #define DT_FWI2 BIT_27 | 2345 | #define DT_FWI2 BIT_27 |
@@ -2364,6 +2361,7 @@ struct qla_hw_data { | |||
2364 | #define IS_QLA5432(ha) (DT_MASK(ha) & DT_ISP5432) | 2361 | #define IS_QLA5432(ha) (DT_MASK(ha) & DT_ISP5432) |
2365 | #define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532) | 2362 | #define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532) |
2366 | #define IS_QLA8432(ha) (DT_MASK(ha) & DT_ISP8432) | 2363 | #define IS_QLA8432(ha) (DT_MASK(ha) & DT_ISP8432) |
2364 | #define IS_QLA8001(ha) (DT_MASK(ha) & DT_ISP8001) | ||
2367 | 2365 | ||
2368 | #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ | 2366 | #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ |
2369 | IS_QLA6312(ha) || IS_QLA6322(ha)) | 2367 | IS_QLA6312(ha) || IS_QLA6322(ha)) |
@@ -2373,8 +2371,11 @@ struct qla_hw_data { | |||
2373 | #define IS_QLA84XX(ha) (IS_QLA8432(ha)) | 2371 | #define IS_QLA84XX(ha) (IS_QLA8432(ha)) |
2374 | #define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \ | 2372 | #define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \ |
2375 | IS_QLA84XX(ha)) | 2373 | IS_QLA84XX(ha)) |
2374 | #define IS_QLA81XX(ha) (IS_QLA8001(ha)) | ||
2376 | #define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \ | 2375 | #define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \ |
2377 | IS_QLA25XX(ha)) | 2376 | IS_QLA25XX(ha) || IS_QLA81XX(ha)) |
2377 | #define IS_NOPOLLING_TYPE(ha) ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && \ | ||
2378 | (ha)->flags.msix_enabled) | ||
2378 | 2379 | ||
2379 | #define IS_IIDMA_CAPABLE(ha) ((ha)->device_type & DT_IIDMA) | 2380 | #define IS_IIDMA_CAPABLE(ha) ((ha)->device_type & DT_IIDMA) |
2380 | #define IS_FWI2_CAPABLE(ha) ((ha)->device_type & DT_FWI2) | 2381 | #define IS_FWI2_CAPABLE(ha) ((ha)->device_type & DT_FWI2) |
@@ -2472,6 +2473,9 @@ struct qla_hw_data { | |||
2472 | uint8_t fw_seriallink_options[4]; | 2473 | uint8_t fw_seriallink_options[4]; |
2473 | uint16_t fw_seriallink_options24[4]; | 2474 | uint16_t fw_seriallink_options24[4]; |
2474 | 2475 | ||
2476 | uint8_t mpi_version[4]; | ||
2477 | uint32_t mpi_capabilities; | ||
2478 | |||
2475 | /* Firmware dump information. */ | 2479 | /* Firmware dump information. */ |
2476 | struct qla2xxx_fw_dump *fw_dump; | 2480 | struct qla2xxx_fw_dump *fw_dump; |
2477 | uint32_t fw_dump_len; | 2481 | uint32_t fw_dump_len; |
@@ -2480,6 +2484,7 @@ struct qla_hw_data { | |||
2480 | dma_addr_t eft_dma; | 2484 | dma_addr_t eft_dma; |
2481 | void *eft; | 2485 | void *eft; |
2482 | 2486 | ||
2487 | uint32_t chain_offset; | ||
2483 | struct dentry *dfs_dir; | 2488 | struct dentry *dfs_dir; |
2484 | struct dentry *dfs_fce; | 2489 | struct dentry *dfs_fce; |
2485 | dma_addr_t fce_dma; | 2490 | dma_addr_t fce_dma; |
@@ -2489,10 +2494,6 @@ struct qla_hw_data { | |||
2489 | uint64_t fce_wr, fce_rd; | 2494 | uint64_t fce_wr, fce_rd; |
2490 | struct mutex fce_mutex; | 2495 | struct mutex fce_mutex; |
2491 | 2496 | ||
2492 | uint32_t hw_event_start; | ||
2493 | uint32_t hw_event_ptr; | ||
2494 | uint32_t hw_event_pause_errors; | ||
2495 | |||
2496 | uint32_t pci_attr; | 2497 | uint32_t pci_attr; |
2497 | uint16_t chip_revision; | 2498 | uint16_t chip_revision; |
2498 | 2499 | ||
@@ -2522,6 +2523,12 @@ struct qla_hw_data { | |||
2522 | uint8_t fcode_revision[16]; | 2523 | uint8_t fcode_revision[16]; |
2523 | uint32_t fw_revision[4]; | 2524 | uint32_t fw_revision[4]; |
2524 | 2525 | ||
2526 | /* Offsets for flash/nvram access (set to ~0 if not used). */ | ||
2527 | uint32_t flash_conf_off; | ||
2528 | uint32_t flash_data_off; | ||
2529 | uint32_t nvram_conf_off; | ||
2530 | uint32_t nvram_data_off; | ||
2531 | |||
2525 | uint32_t fdt_wrt_disable; | 2532 | uint32_t fdt_wrt_disable; |
2526 | uint32_t fdt_erase_cmd; | 2533 | uint32_t fdt_erase_cmd; |
2527 | uint32_t fdt_block_size; | 2534 | uint32_t fdt_block_size; |
@@ -2533,7 +2540,6 @@ struct qla_hw_data { | |||
2533 | uint32_t flt_region_boot; | 2540 | uint32_t flt_region_boot; |
2534 | uint32_t flt_region_fw; | 2541 | uint32_t flt_region_fw; |
2535 | uint32_t flt_region_vpd_nvram; | 2542 | uint32_t flt_region_vpd_nvram; |
2536 | uint32_t flt_region_hw_event; | ||
2537 | uint32_t flt_region_npiv_conf; | 2543 | uint32_t flt_region_npiv_conf; |
2538 | 2544 | ||
2539 | /* Needed for BEACON */ | 2545 | /* Needed for BEACON */ |
@@ -2737,6 +2743,7 @@ typedef struct scsi_qla_host { | |||
2737 | #define OPTROM_SIZE_2322 0x100000 | 2743 | #define OPTROM_SIZE_2322 0x100000 |
2738 | #define OPTROM_SIZE_24XX 0x100000 | 2744 | #define OPTROM_SIZE_24XX 0x100000 |
2739 | #define OPTROM_SIZE_25XX 0x200000 | 2745 | #define OPTROM_SIZE_25XX 0x200000 |
2746 | #define OPTROM_SIZE_81XX 0x400000 | ||
2740 | 2747 | ||
2741 | #include "qla_gbl.h" | 2748 | #include "qla_gbl.h" |
2742 | #include "qla_dbg.h" | 2749 | #include "qla_dbg.h" |
diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c index 0e366a1b44b3..c66036da7d2b 100644 --- a/drivers/scsi/qla2xxx/qla_dfs.c +++ b/drivers/scsi/qla2xxx/qla_dfs.c | |||
@@ -113,7 +113,8 @@ int | |||
113 | qla2x00_dfs_setup(scsi_qla_host_t *vha) | 113 | qla2x00_dfs_setup(scsi_qla_host_t *vha) |
114 | { | 114 | { |
115 | struct qla_hw_data *ha = vha->hw; | 115 | struct qla_hw_data *ha = vha->hw; |
116 | if (!IS_QLA25XX(ha)) | 116 | |
117 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) | ||
117 | goto out; | 118 | goto out; |
118 | if (!ha->fce) | 119 | if (!ha->fce) |
119 | goto out; | 120 | goto out; |
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index ee1f1e794c2d..7abb045a0410 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h | |||
@@ -1215,9 +1215,10 @@ struct qla_fdt_layout { | |||
1215 | 1215 | ||
1216 | struct qla_flt_location { | 1216 | struct qla_flt_location { |
1217 | uint8_t sig[4]; | 1217 | uint8_t sig[4]; |
1218 | uint32_t start_lo; | 1218 | uint16_t start_lo; |
1219 | uint32_t start_hi; | 1219 | uint16_t start_hi; |
1220 | uint16_t unused; | 1220 | uint8_t version; |
1221 | uint8_t unused[5]; | ||
1221 | uint16_t checksum; | 1222 | uint16_t checksum; |
1222 | }; | 1223 | }; |
1223 | 1224 | ||
@@ -1390,4 +1391,291 @@ struct access_chip_rsp_84xx { | |||
1390 | 1391 | ||
1391 | uint32_t reserved[12]; | 1392 | uint32_t reserved[12]; |
1392 | }; | 1393 | }; |
1394 | |||
1395 | /* 81XX Support **************************************************************/ | ||
1396 | |||
1397 | #define MBA_DCBX_START 0x8016 | ||
1398 | #define MBA_DCBX_COMPLETE 0x8030 | ||
1399 | #define MBA_FCF_CONF_ERR 0x8031 | ||
1400 | #define MBA_DCBX_PARAM_UPDATE 0x8032 | ||
1401 | #define MBA_IDC_COMPLETE 0x8100 | ||
1402 | #define MBA_IDC_NOTIFY 0x8101 | ||
1403 | #define MBA_IDC_TIME_EXT 0x8102 | ||
1404 | |||
1405 | struct nvram_81xx { | ||
1406 | /* NVRAM header. */ | ||
1407 | uint8_t id[4]; | ||
1408 | uint16_t nvram_version; | ||
1409 | uint16_t reserved_0; | ||
1410 | |||
1411 | /* Firmware Initialization Control Block. */ | ||
1412 | uint16_t version; | ||
1413 | uint16_t reserved_1; | ||
1414 | uint16_t frame_payload_size; | ||
1415 | uint16_t execution_throttle; | ||
1416 | uint16_t exchange_count; | ||
1417 | uint16_t reserved_2; | ||
1418 | |||
1419 | uint8_t port_name[WWN_SIZE]; | ||
1420 | uint8_t node_name[WWN_SIZE]; | ||
1421 | |||
1422 | uint16_t login_retry_count; | ||
1423 | uint16_t reserved_3; | ||
1424 | uint16_t interrupt_delay_timer; | ||
1425 | uint16_t login_timeout; | ||
1426 | |||
1427 | uint32_t firmware_options_1; | ||
1428 | uint32_t firmware_options_2; | ||
1429 | uint32_t firmware_options_3; | ||
1430 | |||
1431 | uint16_t reserved_4[4]; | ||
1432 | |||
1433 | /* Offset 64. */ | ||
1434 | uint8_t enode_mac[6]; | ||
1435 | uint16_t reserved_5[5]; | ||
1436 | |||
1437 | /* Offset 80. */ | ||
1438 | uint16_t reserved_6[24]; | ||
1439 | |||
1440 | /* Offset 128. */ | ||
1441 | uint16_t reserved_7[64]; | ||
1442 | |||
1443 | /* | ||
1444 | * BIT 0 = Enable spinup delay | ||
1445 | * BIT 1 = Disable BIOS | ||
1446 | * BIT 2 = Enable Memory Map BIOS | ||
1447 | * BIT 3 = Enable Selectable Boot | ||
1448 | * BIT 4 = Disable RISC code load | ||
1449 | * BIT 5 = Disable Serdes | ||
1450 | * BIT 6 = Opt boot mode | ||
1451 | * BIT 7 = Interrupt enable | ||
1452 | * | ||
1453 | * BIT 8 = EV Control enable | ||
1454 | * BIT 9 = Enable lip reset | ||
1455 | * BIT 10 = Enable lip full login | ||
1456 | * BIT 11 = Enable target reset | ||
1457 | * BIT 12 = Stop firmware | ||
1458 | * BIT 13 = Enable nodename option | ||
1459 | * BIT 14 = Default WWPN valid | ||
1460 | * BIT 15 = Enable alternate WWN | ||
1461 | * | ||
1462 | * BIT 16 = CLP LUN string | ||
1463 | * BIT 17 = CLP Target string | ||
1464 | * BIT 18 = CLP BIOS enable string | ||
1465 | * BIT 19 = CLP Serdes string | ||
1466 | * BIT 20 = CLP WWPN string | ||
1467 | * BIT 21 = CLP WWNN string | ||
1468 | * BIT 22 = | ||
1469 | * BIT 23 = | ||
1470 | * BIT 24 = Keep WWPN | ||
1471 | * BIT 25 = Temp WWPN | ||
1472 | * BIT 26-31 = | ||
1473 | */ | ||
1474 | uint32_t host_p; | ||
1475 | |||
1476 | uint8_t alternate_port_name[WWN_SIZE]; | ||
1477 | uint8_t alternate_node_name[WWN_SIZE]; | ||
1478 | |||
1479 | uint8_t boot_port_name[WWN_SIZE]; | ||
1480 | uint16_t boot_lun_number; | ||
1481 | uint16_t reserved_8; | ||
1482 | |||
1483 | uint8_t alt1_boot_port_name[WWN_SIZE]; | ||
1484 | uint16_t alt1_boot_lun_number; | ||
1485 | uint16_t reserved_9; | ||
1486 | |||
1487 | uint8_t alt2_boot_port_name[WWN_SIZE]; | ||
1488 | uint16_t alt2_boot_lun_number; | ||
1489 | uint16_t reserved_10; | ||
1490 | |||
1491 | uint8_t alt3_boot_port_name[WWN_SIZE]; | ||
1492 | uint16_t alt3_boot_lun_number; | ||
1493 | uint16_t reserved_11; | ||
1494 | |||
1495 | /* | ||
1496 | * BIT 0 = Selective Login | ||
1497 | * BIT 1 = Alt-Boot Enable | ||
1498 | * BIT 2 = Reserved | ||
1499 | * BIT 3 = Boot Order List | ||
1500 | * BIT 4 = Reserved | ||
1501 | * BIT 5 = Selective LUN | ||
1502 | * BIT 6 = Reserved | ||
1503 | * BIT 7-31 = | ||
1504 | */ | ||
1505 | uint32_t efi_parameters; | ||
1506 | |||
1507 | uint8_t reset_delay; | ||
1508 | uint8_t reserved_12; | ||
1509 | uint16_t reserved_13; | ||
1510 | |||
1511 | uint16_t boot_id_number; | ||
1512 | uint16_t reserved_14; | ||
1513 | |||
1514 | uint16_t max_luns_per_target; | ||
1515 | uint16_t reserved_15; | ||
1516 | |||
1517 | uint16_t port_down_retry_count; | ||
1518 | uint16_t link_down_timeout; | ||
1519 | |||
1520 | /* FCode parameters. */ | ||
1521 | uint16_t fcode_parameter; | ||
1522 | |||
1523 | uint16_t reserved_16[3]; | ||
1524 | |||
1525 | /* Offset 352. */ | ||
1526 | uint8_t reserved_17[4]; | ||
1527 | uint16_t reserved_18[5]; | ||
1528 | uint8_t reserved_19[2]; | ||
1529 | uint16_t reserved_20[8]; | ||
1530 | |||
1531 | /* Offset 384. */ | ||
1532 | uint8_t reserved_21[16]; | ||
1533 | uint16_t reserved_22[8]; | ||
1534 | |||
1535 | /* Offset 416. */ | ||
1536 | uint16_t reserved_23[32]; | ||
1537 | |||
1538 | /* Offset 480. */ | ||
1539 | uint8_t model_name[16]; | ||
1540 | |||
1541 | /* Offset 496. */ | ||
1542 | uint16_t feature_mask_l; | ||
1543 | uint16_t feature_mask_h; | ||
1544 | uint16_t reserved_24[2]; | ||
1545 | |||
1546 | uint16_t subsystem_vendor_id; | ||
1547 | uint16_t subsystem_device_id; | ||
1548 | |||
1549 | uint32_t checksum; | ||
1550 | }; | ||
1551 | |||
1552 | /* | ||
1553 | * ISP Initialization Control Block. | ||
1554 | * Little endian except where noted. | ||
1555 | */ | ||
1556 | #define ICB_VERSION 1 | ||
1557 | struct init_cb_81xx { | ||
1558 | uint16_t version; | ||
1559 | uint16_t reserved_1; | ||
1560 | |||
1561 | uint16_t frame_payload_size; | ||
1562 | uint16_t execution_throttle; | ||
1563 | uint16_t exchange_count; | ||
1564 | |||
1565 | uint16_t reserved_2; | ||
1566 | |||
1567 | uint8_t port_name[WWN_SIZE]; /* Big endian. */ | ||
1568 | uint8_t node_name[WWN_SIZE]; /* Big endian. */ | ||
1569 | |||
1570 | uint16_t response_q_inpointer; | ||
1571 | uint16_t request_q_outpointer; | ||
1572 | |||
1573 | uint16_t login_retry_count; | ||
1574 | |||
1575 | uint16_t prio_request_q_outpointer; | ||
1576 | |||
1577 | uint16_t response_q_length; | ||
1578 | uint16_t request_q_length; | ||
1579 | |||
1580 | uint16_t reserved_3; | ||
1581 | |||
1582 | uint16_t prio_request_q_length; | ||
1583 | |||
1584 | uint32_t request_q_address[2]; | ||
1585 | uint32_t response_q_address[2]; | ||
1586 | uint32_t prio_request_q_address[2]; | ||
1587 | |||
1588 | uint8_t reserved_4[8]; | ||
1589 | |||
1590 | uint16_t atio_q_inpointer; | ||
1591 | uint16_t atio_q_length; | ||
1592 | uint32_t atio_q_address[2]; | ||
1593 | |||
1594 | uint16_t interrupt_delay_timer; /* 100us increments. */ | ||
1595 | uint16_t login_timeout; | ||
1596 | |||
1597 | /* | ||
1598 | * BIT 0-3 = Reserved | ||
1599 | * BIT 4 = Enable Target Mode | ||
1600 | * BIT 5 = Disable Initiator Mode | ||
1601 | * BIT 6 = Reserved | ||
1602 | * BIT 7 = Reserved | ||
1603 | * | ||
1604 | * BIT 8-13 = Reserved | ||
1605 | * BIT 14 = Node Name Option | ||
1606 | * BIT 15-31 = Reserved | ||
1607 | */ | ||
1608 | uint32_t firmware_options_1; | ||
1609 | |||
1610 | /* | ||
1611 | * BIT 0 = Operation Mode bit 0 | ||
1612 | * BIT 1 = Operation Mode bit 1 | ||
1613 | * BIT 2 = Operation Mode bit 2 | ||
1614 | * BIT 3 = Operation Mode bit 3 | ||
1615 | * BIT 4-7 = Reserved | ||
1616 | * | ||
1617 | * BIT 8 = Enable Class 2 | ||
1618 | * BIT 9 = Enable ACK0 | ||
1619 | * BIT 10 = Reserved | ||
1620 | * BIT 11 = Enable FC-SP Security | ||
1621 | * BIT 12 = FC Tape Enable | ||
1622 | * BIT 13 = Reserved | ||
1623 | * BIT 14 = Enable Target PRLI Control | ||
1624 | * BIT 15-31 = Reserved | ||
1625 | */ | ||
1626 | uint32_t firmware_options_2; | ||
1627 | |||
1628 | /* | ||
1629 | * BIT 0-3 = Reserved | ||
1630 | * BIT 4 = FCP RSP Payload bit 0 | ||
1631 | * BIT 5 = FCP RSP Payload bit 1 | ||
1632 | * BIT 6 = Enable Receive Out-of-Order data frame handling | ||
1633 | * BIT 7 = Reserved | ||
1634 | * | ||
1635 | * BIT 8 = Reserved | ||
1636 | * BIT 9 = Enable Out-of-Order FCP_XFER_RDY relative offset handling | ||
1637 | * BIT 10-16 = Reserved | ||
1638 | * BIT 17 = Enable multiple FCFs | ||
1639 | * BIT 18-20 = MAC addressing mode | ||
1640 | * BIT 21-25 = Ethernet data rate | ||
1641 | * BIT 26 = Enable ethernet header rx IOCB for ATIO q | ||
1642 | * BIT 27 = Enable ethernet header rx IOCB for response q | ||
1643 | * BIT 28 = SPMA selection bit 0 | ||
1644 | * BIT 28 = SPMA selection bit 1 | ||
1645 | * BIT 30-31 = Reserved | ||
1646 | */ | ||
1647 | uint32_t firmware_options_3; | ||
1648 | |||
1649 | uint8_t reserved_5[8]; | ||
1650 | |||
1651 | uint8_t enode_mac[6]; | ||
1652 | |||
1653 | uint8_t reserved_6[10]; | ||
1654 | }; | ||
1655 | |||
1656 | struct mid_init_cb_81xx { | ||
1657 | struct init_cb_81xx init_cb; | ||
1658 | |||
1659 | uint16_t count; | ||
1660 | uint16_t options; | ||
1661 | |||
1662 | struct mid_conf_entry_24xx entries[MAX_MULTI_ID_FABRIC]; | ||
1663 | }; | ||
1664 | |||
1665 | #define FARX_ACCESS_FLASH_CONF_81XX 0x7FFD0000 | ||
1666 | #define FARX_ACCESS_FLASH_DATA_81XX 0x7F800000 | ||
1667 | |||
1668 | /* 81XX Flash locations -- occupies second 2MB region. */ | ||
1669 | #define FA_BOOT_CODE_ADDR_81 0x80000 | ||
1670 | #define FA_RISC_CODE_ADDR_81 0xA0000 | ||
1671 | #define FA_FW_AREA_ADDR_81 0xC0000 | ||
1672 | #define FA_VPD_NVRAM_ADDR_81 0xD0000 | ||
1673 | #define FA_FEATURE_ADDR_81 0xD4000 | ||
1674 | #define FA_FLASH_DESCR_ADDR_81 0xD8000 | ||
1675 | #define FA_FLASH_LAYOUT_ADDR_81 0xD8400 | ||
1676 | #define FA_HW_EVENT0_ADDR_81 0xDC000 | ||
1677 | #define FA_HW_EVENT1_ADDR_81 0xDC400 | ||
1678 | #define FA_NPIV_CONF0_ADDR_81 0xD1000 | ||
1679 | #define FA_NPIV_CONF1_ADDR_81 0xD2000 | ||
1680 | |||
1393 | #endif | 1681 | #endif |
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 0011e31205db..ba4913353752 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -28,8 +28,10 @@ extern void qla2x00_reset_adapter(struct scsi_qla_host *); | |||
28 | extern void qla24xx_reset_adapter(struct scsi_qla_host *); | 28 | extern void qla24xx_reset_adapter(struct scsi_qla_host *); |
29 | extern int qla2x00_nvram_config(struct scsi_qla_host *); | 29 | extern int qla2x00_nvram_config(struct scsi_qla_host *); |
30 | extern int qla24xx_nvram_config(struct scsi_qla_host *); | 30 | extern int qla24xx_nvram_config(struct scsi_qla_host *); |
31 | extern int qla81xx_nvram_config(struct scsi_qla_host *); | ||
31 | extern void qla2x00_update_fw_options(struct scsi_qla_host *); | 32 | extern void qla2x00_update_fw_options(struct scsi_qla_host *); |
32 | extern void qla24xx_update_fw_options(scsi_qla_host_t *); | 33 | extern void qla24xx_update_fw_options(scsi_qla_host_t *); |
34 | extern void qla81xx_update_fw_options(scsi_qla_host_t *); | ||
33 | extern int qla2x00_load_risc(struct scsi_qla_host *, uint32_t *); | 35 | extern int qla2x00_load_risc(struct scsi_qla_host *, uint32_t *); |
34 | extern int qla24xx_load_risc(scsi_qla_host_t *, uint32_t *); | 36 | extern int qla24xx_load_risc(scsi_qla_host_t *, uint32_t *); |
35 | 37 | ||
@@ -69,8 +71,6 @@ extern int qla2x00_loop_reset(scsi_qla_host_t *); | |||
69 | extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int); | 71 | extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int); |
70 | extern int qla2x00_post_aen_work(struct scsi_qla_host *, enum | 72 | extern int qla2x00_post_aen_work(struct scsi_qla_host *, enum |
71 | fc_host_event_code, u32); | 73 | fc_host_event_code, u32); |
72 | extern int qla2x00_post_hwe_work(struct scsi_qla_host *, uint16_t , uint16_t, | ||
73 | uint16_t, uint16_t); | ||
74 | 74 | ||
75 | extern void qla2x00_abort_fcport_cmds(fc_port_t *); | 75 | extern void qla2x00_abort_fcport_cmds(fc_port_t *); |
76 | extern struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *, | 76 | extern struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *, |
@@ -143,7 +143,7 @@ qla2x00_execute_fw(scsi_qla_host_t *, uint32_t); | |||
143 | 143 | ||
144 | extern void | 144 | extern void |
145 | qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *, | 145 | qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *, |
146 | uint16_t *, uint16_t *, uint16_t *, uint32_t *); | 146 | uint16_t *, uint16_t *, uint16_t *, uint32_t *, uint8_t *, uint32_t *); |
147 | 147 | ||
148 | extern int | 148 | extern int |
149 | qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *); | 149 | qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *); |
@@ -317,9 +317,6 @@ extern uint8_t *qla25xx_read_optrom_data(struct scsi_qla_host *, uint8_t *, | |||
317 | extern int qla2x00_get_flash_version(scsi_qla_host_t *, void *); | 317 | extern int qla2x00_get_flash_version(scsi_qla_host_t *, void *); |
318 | extern int qla24xx_get_flash_version(scsi_qla_host_t *, void *); | 318 | extern int qla24xx_get_flash_version(scsi_qla_host_t *, void *); |
319 | 319 | ||
320 | extern int qla2xxx_hw_event_log(scsi_qla_host_t *, uint16_t , uint16_t, | ||
321 | uint16_t, uint16_t); | ||
322 | |||
323 | extern int qla2xxx_get_flash_info(scsi_qla_host_t *); | 320 | extern int qla2xxx_get_flash_info(scsi_qla_host_t *); |
324 | extern int qla2xxx_get_vpd_field(scsi_qla_host_t *, char *, char *, size_t); | 321 | extern int qla2xxx_get_vpd_field(scsi_qla_host_t *, char *, char *, size_t); |
325 | 322 | ||
@@ -332,6 +329,7 @@ extern void qla2100_fw_dump(scsi_qla_host_t *, int); | |||
332 | extern void qla2300_fw_dump(scsi_qla_host_t *, int); | 329 | extern void qla2300_fw_dump(scsi_qla_host_t *, int); |
333 | extern void qla24xx_fw_dump(scsi_qla_host_t *, int); | 330 | extern void qla24xx_fw_dump(scsi_qla_host_t *, int); |
334 | extern void qla25xx_fw_dump(scsi_qla_host_t *, int); | 331 | extern void qla25xx_fw_dump(scsi_qla_host_t *, int); |
332 | extern void qla81xx_fw_dump(scsi_qla_host_t *, int); | ||
335 | extern void qla2x00_dump_regs(scsi_qla_host_t *); | 333 | extern void qla2x00_dump_regs(scsi_qla_host_t *); |
336 | extern void qla2x00_dump_buffer(uint8_t *, uint32_t); | 334 | extern void qla2x00_dump_buffer(uint8_t *, uint32_t); |
337 | 335 | ||
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index 0a6f72973996..557f58d5bf88 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c | |||
@@ -1535,7 +1535,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha) | |||
1535 | eiter = (struct ct_fdmi_port_attr *) (entries + size); | 1535 | eiter = (struct ct_fdmi_port_attr *) (entries + size); |
1536 | eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); | 1536 | eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); |
1537 | eiter->len = __constant_cpu_to_be16(4 + 4); | 1537 | eiter->len = __constant_cpu_to_be16(4 + 4); |
1538 | if (IS_QLA25XX(ha)) | 1538 | if (IS_QLA81XX(ha)) |
1539 | eiter->a.sup_speed = __constant_cpu_to_be32( | ||
1540 | FDMI_PORT_SPEED_10GB); | ||
1541 | else if (IS_QLA25XX(ha)) | ||
1539 | eiter->a.sup_speed = __constant_cpu_to_be32( | 1542 | eiter->a.sup_speed = __constant_cpu_to_be32( |
1540 | FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB| | 1543 | FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB| |
1541 | FDMI_PORT_SPEED_4GB|FDMI_PORT_SPEED_8GB); | 1544 | FDMI_PORT_SPEED_4GB|FDMI_PORT_SPEED_8GB); |
@@ -1575,6 +1578,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha) | |||
1575 | eiter->a.cur_speed = | 1578 | eiter->a.cur_speed = |
1576 | __constant_cpu_to_be32(FDMI_PORT_SPEED_8GB); | 1579 | __constant_cpu_to_be32(FDMI_PORT_SPEED_8GB); |
1577 | break; | 1580 | break; |
1581 | case PORT_SPEED_10GB: | ||
1582 | eiter->a.cur_speed = | ||
1583 | __constant_cpu_to_be32(FDMI_PORT_SPEED_10GB); | ||
1584 | break; | ||
1578 | default: | 1585 | default: |
1579 | eiter->a.cur_speed = | 1586 | eiter->a.cur_speed = |
1580 | __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN); | 1587 | __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN); |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 52ed56ecf195..2d4f32b4df5c 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -552,10 +552,6 @@ qla24xx_reset_risc(scsi_qla_host_t *vha) | |||
552 | d2 = RD_REG_DWORD(®->ctrl_status); | 552 | d2 = RD_REG_DWORD(®->ctrl_status); |
553 | barrier(); | 553 | barrier(); |
554 | } | 554 | } |
555 | if (cnt == 0 || hw_evt) | ||
556 | qla2xxx_hw_event_log(vha, HW_EVENT_RESET_ERR, | ||
557 | RD_REG_WORD(®->mailbox1), RD_REG_WORD(®->mailbox2), | ||
558 | RD_REG_WORD(®->mailbox3)); | ||
559 | 555 | ||
560 | WRT_REG_DWORD(®->hccr, HCCRX_SET_RISC_RESET); | 556 | WRT_REG_DWORD(®->hccr, HCCRX_SET_RISC_RESET); |
561 | RD_REG_DWORD(®->hccr); | 557 | RD_REG_DWORD(®->hccr); |
@@ -574,6 +570,9 @@ qla24xx_reset_risc(scsi_qla_host_t *vha) | |||
574 | } | 570 | } |
575 | 571 | ||
576 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 572 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
573 | |||
574 | if (IS_NOPOLLING_TYPE(ha)) | ||
575 | ha->isp_ops->enable_intrs(ha); | ||
577 | } | 576 | } |
578 | 577 | ||
579 | /** | 578 | /** |
@@ -779,16 +778,19 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha) | |||
779 | mem_size = (ha->fw_memory_size - 0x11000 + 1) * | 778 | mem_size = (ha->fw_memory_size - 0x11000 + 1) * |
780 | sizeof(uint16_t); | 779 | sizeof(uint16_t); |
781 | } else if (IS_FWI2_CAPABLE(ha)) { | 780 | } else if (IS_FWI2_CAPABLE(ha)) { |
782 | fixed_size = IS_QLA25XX(ha) ? | 781 | if (IS_QLA81XX(ha)) |
783 | offsetof(struct qla25xx_fw_dump, ext_mem) : | 782 | fixed_size = offsetof(struct qla81xx_fw_dump, ext_mem); |
784 | offsetof(struct qla24xx_fw_dump, ext_mem); | 783 | else if (IS_QLA25XX(ha)) |
784 | fixed_size = offsetof(struct qla25xx_fw_dump, ext_mem); | ||
785 | else | ||
786 | fixed_size = offsetof(struct qla24xx_fw_dump, ext_mem); | ||
785 | mem_size = (ha->fw_memory_size - 0x100000 + 1) * | 787 | mem_size = (ha->fw_memory_size - 0x100000 + 1) * |
786 | sizeof(uint32_t); | 788 | sizeof(uint32_t); |
787 | if (ha->mqenable) | 789 | if (ha->mqenable) |
788 | mq_size = sizeof(struct qla2xxx_mq_chain); | 790 | mq_size = sizeof(struct qla2xxx_mq_chain); |
789 | 791 | ||
790 | /* Allocate memory for Fibre Channel Event Buffer. */ | 792 | /* Allocate memory for Fibre Channel Event Buffer. */ |
791 | if (!IS_QLA25XX(ha)) | 793 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) |
792 | goto try_eft; | 794 | goto try_eft; |
793 | 795 | ||
794 | tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma, | 796 | tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma, |
@@ -851,7 +853,9 @@ cont_alloc: | |||
851 | 853 | ||
852 | dump_size = offsetof(struct qla2xxx_fw_dump, isp); | 854 | dump_size = offsetof(struct qla2xxx_fw_dump, isp); |
853 | dump_size += fixed_size + mem_size + req_q_size + rsp_q_size + | 855 | dump_size += fixed_size + mem_size + req_q_size + rsp_q_size + |
854 | mq_size + eft_size + fce_size; | 856 | eft_size; |
857 | ha->chain_offset = dump_size; | ||
858 | dump_size += mq_size + fce_size; | ||
855 | 859 | ||
856 | ha->fw_dump = vmalloc(dump_size); | 860 | ha->fw_dump = vmalloc(dump_size); |
857 | if (!ha->fw_dump) { | 861 | if (!ha->fw_dump) { |
@@ -987,7 +991,8 @@ qla2x00_setup_chip(scsi_qla_host_t *vha) | |||
987 | &ha->fw_major_version, | 991 | &ha->fw_major_version, |
988 | &ha->fw_minor_version, | 992 | &ha->fw_minor_version, |
989 | &ha->fw_subminor_version, | 993 | &ha->fw_subminor_version, |
990 | &ha->fw_attributes, &ha->fw_memory_size); | 994 | &ha->fw_attributes, &ha->fw_memory_size, |
995 | ha->mpi_version, &ha->mpi_capabilities); | ||
991 | ha->flags.npiv_supported = 0; | 996 | ha->flags.npiv_supported = 0; |
992 | if (IS_QLA2XXX_MIDTYPE(ha) && | 997 | if (IS_QLA2XXX_MIDTYPE(ha) && |
993 | (ha->fw_attributes & BIT_2)) { | 998 | (ha->fw_attributes & BIT_2)) { |
@@ -1665,10 +1670,6 @@ qla2x00_nvram_config(scsi_qla_host_t *vha) | |||
1665 | qla_printk(KERN_WARNING, ha, "Falling back to functioning (yet " | 1670 | qla_printk(KERN_WARNING, ha, "Falling back to functioning (yet " |
1666 | "invalid -- WWPN) defaults.\n"); | 1671 | "invalid -- WWPN) defaults.\n"); |
1667 | 1672 | ||
1668 | if (chksum) | ||
1669 | qla2xxx_hw_event_log(vha, HW_EVENT_NVRAM_CHKSUM_ERR, 0, | ||
1670 | MSW(chksum), LSW(chksum)); | ||
1671 | |||
1672 | /* | 1673 | /* |
1673 | * Set default initialization control block. | 1674 | * Set default initialization control block. |
1674 | */ | 1675 | */ |
@@ -4255,3 +4256,269 @@ qla84xx_init_chip(scsi_qla_host_t *vha) | |||
4255 | return rval != QLA_SUCCESS || status[0] ? QLA_FUNCTION_FAILED: | 4256 | return rval != QLA_SUCCESS || status[0] ? QLA_FUNCTION_FAILED: |
4256 | QLA_SUCCESS; | 4257 | QLA_SUCCESS; |
4257 | } | 4258 | } |
4259 | |||
4260 | /* 81XX Support **************************************************************/ | ||
4261 | |||
4262 | int | ||
4263 | qla81xx_nvram_config(scsi_qla_host_t *vha) | ||
4264 | { | ||
4265 | int rval; | ||
4266 | struct init_cb_81xx *icb; | ||
4267 | struct nvram_81xx *nv; | ||
4268 | uint32_t *dptr; | ||
4269 | uint8_t *dptr1, *dptr2; | ||
4270 | uint32_t chksum; | ||
4271 | uint16_t cnt; | ||
4272 | struct qla_hw_data *ha = vha->hw; | ||
4273 | |||
4274 | rval = QLA_SUCCESS; | ||
4275 | icb = (struct init_cb_81xx *)ha->init_cb; | ||
4276 | nv = ha->nvram; | ||
4277 | |||
4278 | /* Determine NVRAM starting address. */ | ||
4279 | ha->nvram_size = sizeof(struct nvram_81xx); | ||
4280 | ha->nvram_base = FA_NVRAM_FUNC0_ADDR; | ||
4281 | ha->vpd_size = FA_NVRAM_VPD_SIZE; | ||
4282 | ha->vpd_base = FA_NVRAM_VPD0_ADDR; | ||
4283 | if (PCI_FUNC(ha->pdev->devfn) & 1) { | ||
4284 | ha->nvram_base = FA_NVRAM_FUNC1_ADDR; | ||
4285 | ha->vpd_base = FA_NVRAM_VPD1_ADDR; | ||
4286 | } | ||
4287 | |||
4288 | /* Get VPD data into cache */ | ||
4289 | ha->vpd = ha->nvram + VPD_OFFSET; | ||
4290 | ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd, | ||
4291 | ha->nvram_base - FA_NVRAM_FUNC0_ADDR, FA_NVRAM_VPD_SIZE * 4); | ||
4292 | |||
4293 | /* Get NVRAM data into cache and calculate checksum. */ | ||
4294 | dptr = (uint32_t *)nv; | ||
4295 | ha->isp_ops->read_nvram(vha, (uint8_t *)dptr, ha->nvram_base, | ||
4296 | ha->nvram_size); | ||
4297 | for (cnt = 0, chksum = 0; cnt < ha->nvram_size >> 2; cnt++) | ||
4298 | chksum += le32_to_cpu(*dptr++); | ||
4299 | |||
4300 | DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no)); | ||
4301 | DEBUG5(qla2x00_dump_buffer((uint8_t *)nv, ha->nvram_size)); | ||
4302 | |||
4303 | /* Bad NVRAM data, set defaults parameters. */ | ||
4304 | if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P' | ||
4305 | || nv->id[3] != ' ' || | ||
4306 | nv->nvram_version < __constant_cpu_to_le16(ICB_VERSION)) { | ||
4307 | /* Reset NVRAM data. */ | ||
4308 | qla_printk(KERN_WARNING, ha, "Inconsistent NVRAM detected: " | ||
4309 | "checksum=0x%x id=%c version=0x%x.\n", chksum, nv->id[0], | ||
4310 | le16_to_cpu(nv->nvram_version)); | ||
4311 | qla_printk(KERN_WARNING, ha, "Falling back to functioning (yet " | ||
4312 | "invalid -- WWPN) defaults.\n"); | ||
4313 | |||
4314 | /* | ||
4315 | * Set default initialization control block. | ||
4316 | */ | ||
4317 | memset(nv, 0, ha->nvram_size); | ||
4318 | nv->nvram_version = __constant_cpu_to_le16(ICB_VERSION); | ||
4319 | nv->version = __constant_cpu_to_le16(ICB_VERSION); | ||
4320 | nv->frame_payload_size = __constant_cpu_to_le16(2048); | ||
4321 | nv->execution_throttle = __constant_cpu_to_le16(0xFFFF); | ||
4322 | nv->exchange_count = __constant_cpu_to_le16(0); | ||
4323 | nv->port_name[0] = 0x21; | ||
4324 | nv->port_name[1] = 0x00 + PCI_FUNC(ha->pdev->devfn); | ||
4325 | nv->port_name[2] = 0x00; | ||
4326 | nv->port_name[3] = 0xe0; | ||
4327 | nv->port_name[4] = 0x8b; | ||
4328 | nv->port_name[5] = 0x1c; | ||
4329 | nv->port_name[6] = 0x55; | ||
4330 | nv->port_name[7] = 0x86; | ||
4331 | nv->node_name[0] = 0x20; | ||
4332 | nv->node_name[1] = 0x00; | ||
4333 | nv->node_name[2] = 0x00; | ||
4334 | nv->node_name[3] = 0xe0; | ||
4335 | nv->node_name[4] = 0x8b; | ||
4336 | nv->node_name[5] = 0x1c; | ||
4337 | nv->node_name[6] = 0x55; | ||
4338 | nv->node_name[7] = 0x86; | ||
4339 | nv->login_retry_count = __constant_cpu_to_le16(8); | ||
4340 | nv->interrupt_delay_timer = __constant_cpu_to_le16(0); | ||
4341 | nv->login_timeout = __constant_cpu_to_le16(0); | ||
4342 | nv->firmware_options_1 = | ||
4343 | __constant_cpu_to_le32(BIT_14|BIT_13|BIT_2|BIT_1); | ||
4344 | nv->firmware_options_2 = __constant_cpu_to_le32(2 << 4); | ||
4345 | nv->firmware_options_2 |= __constant_cpu_to_le32(BIT_12); | ||
4346 | nv->firmware_options_3 = __constant_cpu_to_le32(2 << 13); | ||
4347 | nv->host_p = __constant_cpu_to_le32(BIT_11|BIT_10); | ||
4348 | nv->efi_parameters = __constant_cpu_to_le32(0); | ||
4349 | nv->reset_delay = 5; | ||
4350 | nv->max_luns_per_target = __constant_cpu_to_le16(128); | ||
4351 | nv->port_down_retry_count = __constant_cpu_to_le16(30); | ||
4352 | nv->link_down_timeout = __constant_cpu_to_le16(30); | ||
4353 | nv->enode_mac[0] = 0x01; | ||
4354 | nv->enode_mac[1] = 0x02; | ||
4355 | nv->enode_mac[2] = 0x03; | ||
4356 | nv->enode_mac[3] = 0x04; | ||
4357 | nv->enode_mac[4] = 0x05; | ||
4358 | nv->enode_mac[5] = 0x06 + PCI_FUNC(ha->pdev->devfn); | ||
4359 | |||
4360 | rval = 1; | ||
4361 | } | ||
4362 | |||
4363 | /* Reset Initialization control block */ | ||
4364 | memset(icb, 0, sizeof(struct init_cb_81xx)); | ||
4365 | |||
4366 | /* Copy 1st segment. */ | ||
4367 | dptr1 = (uint8_t *)icb; | ||
4368 | dptr2 = (uint8_t *)&nv->version; | ||
4369 | cnt = (uint8_t *)&icb->response_q_inpointer - (uint8_t *)&icb->version; | ||
4370 | while (cnt--) | ||
4371 | *dptr1++ = *dptr2++; | ||
4372 | |||
4373 | icb->login_retry_count = nv->login_retry_count; | ||
4374 | |||
4375 | /* Copy 2nd segment. */ | ||
4376 | dptr1 = (uint8_t *)&icb->interrupt_delay_timer; | ||
4377 | dptr2 = (uint8_t *)&nv->interrupt_delay_timer; | ||
4378 | cnt = (uint8_t *)&icb->reserved_5 - | ||
4379 | (uint8_t *)&icb->interrupt_delay_timer; | ||
4380 | while (cnt--) | ||
4381 | *dptr1++ = *dptr2++; | ||
4382 | |||
4383 | memcpy(icb->enode_mac, nv->enode_mac, sizeof(icb->enode_mac)); | ||
4384 | /* Some boards (with valid NVRAMs) still have NULL enode_mac!! */ | ||
4385 | if (!memcmp(icb->enode_mac, "\0\0\0\0\0\0", sizeof(icb->enode_mac))) { | ||
4386 | icb->enode_mac[0] = 0x01; | ||
4387 | icb->enode_mac[1] = 0x02; | ||
4388 | icb->enode_mac[2] = 0x03; | ||
4389 | icb->enode_mac[3] = 0x04; | ||
4390 | icb->enode_mac[4] = 0x05; | ||
4391 | icb->enode_mac[5] = 0x06 + PCI_FUNC(ha->pdev->devfn); | ||
4392 | } | ||
4393 | |||
4394 | /* | ||
4395 | * Setup driver NVRAM options. | ||
4396 | */ | ||
4397 | qla2x00_set_model_info(vha, nv->model_name, sizeof(nv->model_name), | ||
4398 | "QLE81XX"); | ||
4399 | |||
4400 | /* Use alternate WWN? */ | ||
4401 | if (nv->host_p & __constant_cpu_to_le32(BIT_15)) { | ||
4402 | memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE); | ||
4403 | memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE); | ||
4404 | } | ||
4405 | |||
4406 | /* Prepare nodename */ | ||
4407 | if ((icb->firmware_options_1 & __constant_cpu_to_le32(BIT_14)) == 0) { | ||
4408 | /* | ||
4409 | * Firmware will apply the following mask if the nodename was | ||
4410 | * not provided. | ||
4411 | */ | ||
4412 | memcpy(icb->node_name, icb->port_name, WWN_SIZE); | ||
4413 | icb->node_name[0] &= 0xF0; | ||
4414 | } | ||
4415 | |||
4416 | /* Set host adapter parameters. */ | ||
4417 | ha->flags.disable_risc_code_load = 0; | ||
4418 | ha->flags.enable_lip_reset = 0; | ||
4419 | ha->flags.enable_lip_full_login = | ||
4420 | le32_to_cpu(nv->host_p) & BIT_10 ? 1: 0; | ||
4421 | ha->flags.enable_target_reset = | ||
4422 | le32_to_cpu(nv->host_p) & BIT_11 ? 1: 0; | ||
4423 | ha->flags.enable_led_scheme = 0; | ||
4424 | ha->flags.disable_serdes = le32_to_cpu(nv->host_p) & BIT_5 ? 1: 0; | ||
4425 | |||
4426 | ha->operating_mode = (le32_to_cpu(icb->firmware_options_2) & | ||
4427 | (BIT_6 | BIT_5 | BIT_4)) >> 4; | ||
4428 | |||
4429 | /* save HBA serial number */ | ||
4430 | ha->serial0 = icb->port_name[5]; | ||
4431 | ha->serial1 = icb->port_name[6]; | ||
4432 | ha->serial2 = icb->port_name[7]; | ||
4433 | memcpy(vha->node_name, icb->node_name, WWN_SIZE); | ||
4434 | memcpy(vha->port_name, icb->port_name, WWN_SIZE); | ||
4435 | |||
4436 | icb->execution_throttle = __constant_cpu_to_le16(0xFFFF); | ||
4437 | |||
4438 | ha->retry_count = le16_to_cpu(nv->login_retry_count); | ||
4439 | |||
4440 | /* Set minimum login_timeout to 4 seconds. */ | ||
4441 | if (le16_to_cpu(nv->login_timeout) < ql2xlogintimeout) | ||
4442 | nv->login_timeout = cpu_to_le16(ql2xlogintimeout); | ||
4443 | if (le16_to_cpu(nv->login_timeout) < 4) | ||
4444 | nv->login_timeout = __constant_cpu_to_le16(4); | ||
4445 | ha->login_timeout = le16_to_cpu(nv->login_timeout); | ||
4446 | icb->login_timeout = nv->login_timeout; | ||
4447 | |||
4448 | /* Set minimum RATOV to 100 tenths of a second. */ | ||
4449 | ha->r_a_tov = 100; | ||
4450 | |||
4451 | ha->loop_reset_delay = nv->reset_delay; | ||
4452 | |||
4453 | /* Link Down Timeout = 0: | ||
4454 | * | ||
4455 | * When Port Down timer expires we will start returning | ||
4456 | * I/O's to OS with "DID_NO_CONNECT". | ||
4457 | * | ||
4458 | * Link Down Timeout != 0: | ||
4459 | * | ||
4460 | * The driver waits for the link to come up after link down | ||
4461 | * before returning I/Os to OS with "DID_NO_CONNECT". | ||
4462 | */ | ||
4463 | if (le16_to_cpu(nv->link_down_timeout) == 0) { | ||
4464 | ha->loop_down_abort_time = | ||
4465 | (LOOP_DOWN_TIME - LOOP_DOWN_TIMEOUT); | ||
4466 | } else { | ||
4467 | ha->link_down_timeout = le16_to_cpu(nv->link_down_timeout); | ||
4468 | ha->loop_down_abort_time = | ||
4469 | (LOOP_DOWN_TIME - ha->link_down_timeout); | ||
4470 | } | ||
4471 | |||
4472 | /* Need enough time to try and get the port back. */ | ||
4473 | ha->port_down_retry_count = le16_to_cpu(nv->port_down_retry_count); | ||
4474 | if (qlport_down_retry) | ||
4475 | ha->port_down_retry_count = qlport_down_retry; | ||
4476 | |||
4477 | /* Set login_retry_count */ | ||
4478 | ha->login_retry_count = le16_to_cpu(nv->login_retry_count); | ||
4479 | if (ha->port_down_retry_count == | ||
4480 | le16_to_cpu(nv->port_down_retry_count) && | ||
4481 | ha->port_down_retry_count > 3) | ||
4482 | ha->login_retry_count = ha->port_down_retry_count; | ||
4483 | else if (ha->port_down_retry_count > (int)ha->login_retry_count) | ||
4484 | ha->login_retry_count = ha->port_down_retry_count; | ||
4485 | if (ql2xloginretrycount) | ||
4486 | ha->login_retry_count = ql2xloginretrycount; | ||
4487 | |||
4488 | /* Enable ZIO. */ | ||
4489 | if (!vha->flags.init_done) { | ||
4490 | ha->zio_mode = le32_to_cpu(icb->firmware_options_2) & | ||
4491 | (BIT_3 | BIT_2 | BIT_1 | BIT_0); | ||
4492 | ha->zio_timer = le16_to_cpu(icb->interrupt_delay_timer) ? | ||
4493 | le16_to_cpu(icb->interrupt_delay_timer): 2; | ||
4494 | } | ||
4495 | icb->firmware_options_2 &= __constant_cpu_to_le32( | ||
4496 | ~(BIT_3 | BIT_2 | BIT_1 | BIT_0)); | ||
4497 | vha->flags.process_response_queue = 0; | ||
4498 | if (ha->zio_mode != QLA_ZIO_DISABLED) { | ||
4499 | ha->zio_mode = QLA_ZIO_MODE_6; | ||
4500 | |||
4501 | DEBUG2(printk("scsi(%ld): ZIO mode %d enabled; timer delay " | ||
4502 | "(%d us).\n", vha->host_no, ha->zio_mode, | ||
4503 | ha->zio_timer * 100)); | ||
4504 | qla_printk(KERN_INFO, ha, | ||
4505 | "ZIO mode %d enabled; timer delay (%d us).\n", | ||
4506 | ha->zio_mode, ha->zio_timer * 100); | ||
4507 | |||
4508 | icb->firmware_options_2 |= cpu_to_le32( | ||
4509 | (uint32_t)ha->zio_mode); | ||
4510 | icb->interrupt_delay_timer = cpu_to_le16(ha->zio_timer); | ||
4511 | vha->flags.process_response_queue = 1; | ||
4512 | } | ||
4513 | |||
4514 | if (rval) { | ||
4515 | DEBUG2_3(printk(KERN_WARNING | ||
4516 | "scsi(%ld): NVRAM configuration failed!\n", vha->host_no)); | ||
4517 | } | ||
4518 | return (rval); | ||
4519 | } | ||
4520 | |||
4521 | void | ||
4522 | qla81xx_update_fw_options(scsi_qla_host_t *ha) | ||
4523 | { | ||
4524 | } | ||
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c index 5bedc9d05942..2258152b1f41 100644 --- a/drivers/scsi/qla2xxx/qla_iocb.c +++ b/drivers/scsi/qla2xxx/qla_iocb.c | |||
@@ -173,7 +173,7 @@ void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt, | |||
173 | return; | 173 | return; |
174 | } | 174 | } |
175 | 175 | ||
176 | vha = sp->vha; | 176 | vha = sp->fcport->vha; |
177 | req = sp->que; | 177 | req = sp->que; |
178 | 178 | ||
179 | cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp)); | 179 | cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp)); |
@@ -234,7 +234,7 @@ void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt, | |||
234 | return; | 234 | return; |
235 | } | 235 | } |
236 | 236 | ||
237 | vha = sp->vha; | 237 | vha = sp->fcport->vha; |
238 | req = sp->que; | 238 | req = sp->que; |
239 | 239 | ||
240 | cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp)); | 240 | cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp)); |
@@ -294,7 +294,7 @@ qla2x00_start_scsi(srb_t *sp) | |||
294 | 294 | ||
295 | /* Setup device pointers. */ | 295 | /* Setup device pointers. */ |
296 | ret = 0; | 296 | ret = 0; |
297 | vha = sp->vha; | 297 | vha = sp->fcport->vha; |
298 | ha = vha->hw; | 298 | ha = vha->hw; |
299 | reg = &ha->iobase->isp; | 299 | reg = &ha->iobase->isp; |
300 | cmd = sp->cmd; | 300 | cmd = sp->cmd; |
@@ -353,7 +353,6 @@ qla2x00_start_scsi(srb_t *sp) | |||
353 | /* Build command packet */ | 353 | /* Build command packet */ |
354 | req->current_outstanding_cmd = handle; | 354 | req->current_outstanding_cmd = handle; |
355 | req->outstanding_cmds[handle] = sp; | 355 | req->outstanding_cmds[handle] = sp; |
356 | sp->vha = vha; | ||
357 | sp->que = req; | 356 | sp->que = req; |
358 | sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; | 357 | sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; |
359 | req->cnt -= req_cnt; | 358 | req->cnt -= req_cnt; |
@@ -656,7 +655,7 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt, | |||
656 | return; | 655 | return; |
657 | } | 656 | } |
658 | 657 | ||
659 | vha = sp->vha; | 658 | vha = sp->fcport->vha; |
660 | req = sp->que; | 659 | req = sp->que; |
661 | 660 | ||
662 | /* Set transfer direction */ | 661 | /* Set transfer direction */ |
@@ -723,7 +722,7 @@ qla24xx_start_scsi(srb_t *sp) | |||
723 | struct req_que *req = NULL; | 722 | struct req_que *req = NULL; |
724 | struct rsp_que *rsp = NULL; | 723 | struct rsp_que *rsp = NULL; |
725 | struct scsi_cmnd *cmd = sp->cmd; | 724 | struct scsi_cmnd *cmd = sp->cmd; |
726 | struct scsi_qla_host *vha = sp->vha; | 725 | struct scsi_qla_host *vha = sp->fcport->vha; |
727 | struct qla_hw_data *ha = vha->hw; | 726 | struct qla_hw_data *ha = vha->hw; |
728 | uint16_t que_id; | 727 | uint16_t que_id; |
729 | 728 | ||
@@ -791,7 +790,6 @@ qla24xx_start_scsi(srb_t *sp) | |||
791 | /* Build command packet. */ | 790 | /* Build command packet. */ |
792 | req->current_outstanding_cmd = handle; | 791 | req->current_outstanding_cmd = handle; |
793 | req->outstanding_cmds[handle] = sp; | 792 | req->outstanding_cmds[handle] = sp; |
794 | sp->vha = vha; | ||
795 | sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; | 793 | sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; |
796 | req->cnt -= req_cnt; | 794 | req->cnt -= req_cnt; |
797 | 795 | ||
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index d5fb79a88001..789fc576f222 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -275,7 +275,7 @@ void | |||
275 | qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | 275 | qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) |
276 | { | 276 | { |
277 | #define LS_UNKNOWN 2 | 277 | #define LS_UNKNOWN 2 |
278 | static char *link_speeds[5] = { "1", "2", "?", "4", "8" }; | 278 | static char *link_speeds[] = { "1", "2", "?", "4", "8", "10" }; |
279 | char *link_speed; | 279 | char *link_speed; |
280 | uint16_t handle_cnt; | 280 | uint16_t handle_cnt; |
281 | uint16_t cnt; | 281 | uint16_t cnt; |
@@ -288,6 +288,8 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
288 | 288 | ||
289 | /* Setup to process RIO completion. */ | 289 | /* Setup to process RIO completion. */ |
290 | handle_cnt = 0; | 290 | handle_cnt = 0; |
291 | if (IS_QLA81XX(ha)) | ||
292 | goto skip_rio; | ||
291 | switch (mb[0]) { | 293 | switch (mb[0]) { |
292 | case MBA_SCSI_COMPLETION: | 294 | case MBA_SCSI_COMPLETION: |
293 | handles[0] = le32_to_cpu((uint32_t)((mb[2] << 16) | mb[1])); | 295 | handles[0] = le32_to_cpu((uint32_t)((mb[2] << 16) | mb[1])); |
@@ -339,7 +341,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
339 | default: | 341 | default: |
340 | break; | 342 | break; |
341 | } | 343 | } |
342 | 344 | skip_rio: | |
343 | switch (mb[0]) { | 345 | switch (mb[0]) { |
344 | case MBA_SCSI_COMPLETION: /* Fast Post */ | 346 | case MBA_SCSI_COMPLETION: /* Fast Post */ |
345 | if (!vha->flags.online) | 347 | if (!vha->flags.online) |
@@ -362,7 +364,6 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
362 | "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh.\n", | 364 | "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh.\n", |
363 | mb[1], mb[2], mb[3]); | 365 | mb[1], mb[2], mb[3]); |
364 | 366 | ||
365 | qla2x00_post_hwe_work(vha, mb[0], mb[1], mb[2], mb[3]); | ||
366 | ha->isp_ops->fw_dump(vha, 1); | 367 | ha->isp_ops->fw_dump(vha, 1); |
367 | 368 | ||
368 | if (IS_FWI2_CAPABLE(ha)) { | 369 | if (IS_FWI2_CAPABLE(ha)) { |
@@ -387,7 +388,6 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
387 | vha->host_no)); | 388 | vha->host_no)); |
388 | qla_printk(KERN_WARNING, ha, "ISP Request Transfer Error.\n"); | 389 | qla_printk(KERN_WARNING, ha, "ISP Request Transfer Error.\n"); |
389 | 390 | ||
390 | qla2x00_post_hwe_work(vha, mb[0], mb[1], mb[2], mb[3]); | ||
391 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); | 391 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); |
392 | break; | 392 | break; |
393 | 393 | ||
@@ -396,7 +396,6 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
396 | vha->host_no)); | 396 | vha->host_no)); |
397 | qla_printk(KERN_WARNING, ha, "ISP Response Transfer Error.\n"); | 397 | qla_printk(KERN_WARNING, ha, "ISP Response Transfer Error.\n"); |
398 | 398 | ||
399 | qla2x00_post_hwe_work(vha, mb[0], mb[1], mb[2], mb[3]); | ||
400 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); | 399 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); |
401 | break; | 400 | break; |
402 | 401 | ||
@@ -436,6 +435,8 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
436 | link_speed = link_speeds[LS_UNKNOWN]; | 435 | link_speed = link_speeds[LS_UNKNOWN]; |
437 | if (mb[1] < 5) | 436 | if (mb[1] < 5) |
438 | link_speed = link_speeds[mb[1]]; | 437 | link_speed = link_speeds[mb[1]]; |
438 | else if (mb[1] == 0x13) | ||
439 | link_speed = link_speeds[5]; | ||
439 | ha->link_data_rate = mb[1]; | 440 | ha->link_data_rate = mb[1]; |
440 | } | 441 | } |
441 | 442 | ||
@@ -495,12 +496,17 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
495 | qla2x00_post_aen_work(vha, FCH_EVT_LIPRESET, mb[1]); | 496 | qla2x00_post_aen_work(vha, FCH_EVT_LIPRESET, mb[1]); |
496 | break; | 497 | break; |
497 | 498 | ||
499 | /* case MBA_DCBX_COMPLETE: */ | ||
498 | case MBA_POINT_TO_POINT: /* Point-to-Point */ | 500 | case MBA_POINT_TO_POINT: /* Point-to-Point */ |
499 | if (IS_QLA2100(ha)) | 501 | if (IS_QLA2100(ha)) |
500 | break; | 502 | break; |
501 | 503 | ||
502 | DEBUG2(printk("scsi(%ld): Asynchronous P2P MODE received.\n", | 504 | if (IS_QLA81XX(ha)) |
503 | vha->host_no)); | 505 | DEBUG2(printk("scsi(%ld): DCBX Completed -- %04x %04x " |
506 | "%04x\n", vha->host_no, mb[1], mb[2], mb[3])); | ||
507 | else | ||
508 | DEBUG2(printk("scsi(%ld): Asynchronous P2P MODE " | ||
509 | "received.\n", vha->host_no)); | ||
504 | 510 | ||
505 | /* | 511 | /* |
506 | * Until there's a transition from loop down to loop up, treat | 512 | * Until there's a transition from loop down to loop up, treat |
@@ -641,10 +647,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
641 | 647 | ||
642 | /* case MBA_RIO_RESPONSE: */ | 648 | /* case MBA_RIO_RESPONSE: */ |
643 | case MBA_ZIO_RESPONSE: | 649 | case MBA_ZIO_RESPONSE: |
644 | DEBUG2(printk("scsi(%ld): [R|Z]IO update completion.\n", | 650 | DEBUG3(printk("scsi(%ld): [R|Z]IO update completion.\n", |
645 | vha->host_no)); | ||
646 | DEBUG(printk(KERN_INFO | ||
647 | "scsi(%ld): [R|Z]IO update completion.\n", | ||
648 | vha->host_no)); | 651 | vha->host_no)); |
649 | 652 | ||
650 | if (IS_FWI2_CAPABLE(ha)) | 653 | if (IS_FWI2_CAPABLE(ha)) |
@@ -698,6 +701,35 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
698 | } | 701 | } |
699 | spin_unlock_irqrestore(&ha->cs84xx->access_lock, flags); | 702 | spin_unlock_irqrestore(&ha->cs84xx->access_lock, flags); |
700 | break; | 703 | break; |
704 | case MBA_DCBX_START: | ||
705 | DEBUG2(printk("scsi(%ld): DCBX Started -- %04x %04x %04x\n", | ||
706 | vha->host_no, mb[1], mb[2], mb[3])); | ||
707 | break; | ||
708 | case MBA_DCBX_PARAM_UPDATE: | ||
709 | DEBUG2(printk("scsi(%ld): DCBX Parameters Updated -- " | ||
710 | "%04x %04x %04x\n", vha->host_no, mb[1], mb[2], mb[3])); | ||
711 | break; | ||
712 | case MBA_FCF_CONF_ERR: | ||
713 | DEBUG2(printk("scsi(%ld): FCF Configuration Error -- " | ||
714 | "%04x %04x %04x\n", vha->host_no, mb[1], mb[2], mb[3])); | ||
715 | break; | ||
716 | case MBA_IDC_COMPLETE: | ||
717 | DEBUG2(printk("scsi(%ld): Inter-Driver Commucation " | ||
718 | "Complete -- %04x %04x %04x\n", vha->host_no, mb[1], mb[2], | ||
719 | mb[3])); | ||
720 | break; | ||
721 | case MBA_IDC_NOTIFY: | ||
722 | DEBUG2(printk("scsi(%ld): Inter-Driver Commucation " | ||
723 | "Request Notification -- %04x %04x %04x\n", vha->host_no, | ||
724 | mb[1], mb[2], mb[3])); | ||
725 | /**** Mailbox registers 4 - 7 valid!!! */ | ||
726 | break; | ||
727 | case MBA_IDC_TIME_EXT: | ||
728 | DEBUG2(printk("scsi(%ld): Inter-Driver Commucation " | ||
729 | "Time Extension -- %04x %04x %04x\n", vha->host_no, mb[1], | ||
730 | mb[2], mb[3])); | ||
731 | /**** Mailbox registers 4 - 7 valid!!! */ | ||
732 | break; | ||
701 | } | 733 | } |
702 | 734 | ||
703 | if (!vha->vp_idx && ha->num_vhosts) | 735 | if (!vha->vp_idx && ha->num_vhosts) |
@@ -1510,7 +1542,7 @@ qla2xxx_check_risc_status(scsi_qla_host_t *vha) | |||
1510 | struct qla_hw_data *ha = vha->hw; | 1542 | struct qla_hw_data *ha = vha->hw; |
1511 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | 1543 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; |
1512 | 1544 | ||
1513 | if (!IS_QLA25XX(ha)) | 1545 | if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) |
1514 | return; | 1546 | return; |
1515 | 1547 | ||
1516 | rval = QLA_SUCCESS; | 1548 | rval = QLA_SUCCESS; |
@@ -1590,12 +1622,6 @@ qla24xx_intr_handler(int irq, void *dev_id) | |||
1590 | if (pci_channel_offline(ha->pdev)) | 1622 | if (pci_channel_offline(ha->pdev)) |
1591 | break; | 1623 | break; |
1592 | 1624 | ||
1593 | if (ha->hw_event_pause_errors == 0) | ||
1594 | qla2x00_post_hwe_work(vha, HW_EVENT_PARITY_ERR, | ||
1595 | 0, MSW(stat), LSW(stat)); | ||
1596 | else if (ha->hw_event_pause_errors < 0xffffffff) | ||
1597 | ha->hw_event_pause_errors++; | ||
1598 | |||
1599 | hccr = RD_REG_DWORD(®->hccr); | 1625 | hccr = RD_REG_DWORD(®->hccr); |
1600 | 1626 | ||
1601 | qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, " | 1627 | qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, " |
@@ -1740,12 +1766,6 @@ qla24xx_msix_default(int irq, void *dev_id) | |||
1740 | if (pci_channel_offline(ha->pdev)) | 1766 | if (pci_channel_offline(ha->pdev)) |
1741 | break; | 1767 | break; |
1742 | 1768 | ||
1743 | if (ha->hw_event_pause_errors == 0) | ||
1744 | qla2x00_post_hwe_work(vha, HW_EVENT_PARITY_ERR, | ||
1745 | 0, MSW(stat), LSW(stat)); | ||
1746 | else if (ha->hw_event_pause_errors < 0xffffffff) | ||
1747 | ha->hw_event_pause_errors++; | ||
1748 | |||
1749 | hccr = RD_REG_DWORD(®->hccr); | 1769 | hccr = RD_REG_DWORD(®->hccr); |
1750 | 1770 | ||
1751 | qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, " | 1771 | qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, " |
@@ -1944,7 +1964,8 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp) | |||
1944 | device_reg_t __iomem *reg = ha->iobase; | 1964 | device_reg_t __iomem *reg = ha->iobase; |
1945 | 1965 | ||
1946 | /* If possible, enable MSI-X. */ | 1966 | /* If possible, enable MSI-X. */ |
1947 | if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha)) | 1967 | if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && |
1968 | !IS_QLA8432(ha) && !IS_QLA8001(ha)) | ||
1948 | goto skip_msix; | 1969 | goto skip_msix; |
1949 | 1970 | ||
1950 | if (IS_QLA2432(ha) && (ha->pdev->revision < QLA_MSIX_CHIP_REV_24XX || | 1971 | if (IS_QLA2432(ha) && (ha->pdev->revision < QLA_MSIX_CHIP_REV_24XX || |
@@ -1979,7 +2000,8 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp) | |||
1979 | "MSI-X: Falling back-to INTa mode -- %d.\n", ret); | 2000 | "MSI-X: Falling back-to INTa mode -- %d.\n", ret); |
1980 | skip_msix: | 2001 | skip_msix: |
1981 | 2002 | ||
1982 | if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha)) | 2003 | if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) && |
2004 | !IS_QLA8001(ha)) | ||
1983 | goto skip_msi; | 2005 | goto skip_msi; |
1984 | 2006 | ||
1985 | ret = pci_enable_msi(ha->pdev); | 2007 | ret = pci_enable_msi(ha->pdev); |
@@ -2000,6 +2022,12 @@ skip_msi: | |||
2000 | ha->flags.inta_enabled = 1; | 2022 | ha->flags.inta_enabled = 1; |
2001 | clear_risc_ints: | 2023 | clear_risc_ints: |
2002 | 2024 | ||
2025 | /* | ||
2026 | * FIXME: Noted that 8014s were being dropped during NK testing. | ||
2027 | * Timing deltas during MSI-X/INTa transitions? | ||
2028 | */ | ||
2029 | if (IS_QLA81XX(ha)) | ||
2030 | goto fail; | ||
2003 | spin_lock_irq(&ha->hardware_lock); | 2031 | spin_lock_irq(&ha->hardware_lock); |
2004 | if (IS_FWI2_CAPABLE(ha)) { | 2032 | if (IS_FWI2_CAPABLE(ha)) { |
2005 | WRT_REG_DWORD(®->isp24.hccr, HCCRX_CLR_HOST_INT); | 2033 | WRT_REG_DWORD(®->isp24.hccr, HCCRX_CLR_HOST_INT); |
@@ -2044,7 +2072,7 @@ qla2x00_get_rsp_host(struct rsp_que *rsp) | |||
2044 | if (pkt && pkt->handle < MAX_OUTSTANDING_COMMANDS) { | 2072 | if (pkt && pkt->handle < MAX_OUTSTANDING_COMMANDS) { |
2045 | sp = req->outstanding_cmds[pkt->handle]; | 2073 | sp = req->outstanding_cmds[pkt->handle]; |
2046 | if (sp) | 2074 | if (sp) |
2047 | vha = sp->vha; | 2075 | vha = sp->fcport->vha; |
2048 | } | 2076 | } |
2049 | } | 2077 | } |
2050 | if (!vha) | 2078 | if (!vha) |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index a99976f5fabd..db4df45234a5 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -123,8 +123,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
123 | 123 | ||
124 | /* Wait for mbx cmd completion until timeout */ | 124 | /* Wait for mbx cmd completion until timeout */ |
125 | 125 | ||
126 | if (!abort_active && io_lock_on) { | 126 | if ((!abort_active && io_lock_on) || IS_NOPOLLING_TYPE(ha)) { |
127 | |||
128 | set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); | 127 | set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); |
129 | 128 | ||
130 | if (IS_FWI2_CAPABLE(ha)) | 129 | if (IS_FWI2_CAPABLE(ha)) |
@@ -218,7 +217,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
218 | /* Clean up */ | 217 | /* Clean up */ |
219 | ha->mcp = NULL; | 218 | ha->mcp = NULL; |
220 | 219 | ||
221 | if (abort_active || !io_lock_on) { | 220 | if ((abort_active || !io_lock_on) && !IS_NOPOLLING_TYPE(ha)) { |
222 | DEBUG11(printk("%s(%ld): checking for additional resp " | 221 | DEBUG11(printk("%s(%ld): checking for additional resp " |
223 | "interrupt.\n", __func__, base_vha->host_no)); | 222 | "interrupt.\n", __func__, base_vha->host_no)); |
224 | 223 | ||
@@ -412,7 +411,8 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) | |||
412 | */ | 411 | */ |
413 | void | 412 | void |
414 | qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | 413 | qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, |
415 | uint16_t *subminor, uint16_t *attributes, uint32_t *memory) | 414 | uint16_t *subminor, uint16_t *attributes, uint32_t *memory, uint8_t *mpi, |
415 | uint32_t *mpi_caps) | ||
416 | { | 416 | { |
417 | int rval; | 417 | int rval; |
418 | mbx_cmd_t mc; | 418 | mbx_cmd_t mc; |
@@ -423,6 +423,8 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | |||
423 | mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; | 423 | mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; |
424 | mcp->out_mb = MBX_0; | 424 | mcp->out_mb = MBX_0; |
425 | mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; | 425 | mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; |
426 | if (IS_QLA81XX(vha->hw)) | ||
427 | mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10; | ||
426 | mcp->flags = 0; | 428 | mcp->flags = 0; |
427 | mcp->tov = MBX_TOV_SECONDS; | 429 | mcp->tov = MBX_TOV_SECONDS; |
428 | rval = qla2x00_mailbox_command(vha, mcp); | 430 | rval = qla2x00_mailbox_command(vha, mcp); |
@@ -436,6 +438,13 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | |||
436 | *memory = 0x1FFFF; /* Defaults to 128KB. */ | 438 | *memory = 0x1FFFF; /* Defaults to 128KB. */ |
437 | else | 439 | else |
438 | *memory = (mcp->mb[5] << 16) | mcp->mb[4]; | 440 | *memory = (mcp->mb[5] << 16) | mcp->mb[4]; |
441 | if (IS_QLA81XX(vha->hw)) { | ||
442 | mpi[0] = mcp->mb[10] >> 8; | ||
443 | mpi[1] = mcp->mb[10] & 0xff; | ||
444 | mpi[2] = mcp->mb[11] >> 8; | ||
445 | mpi[3] = mcp->mb[11] & 0xff; | ||
446 | *mpi_caps = (mcp->mb[12] << 16) | mcp->mb[13]; | ||
447 | } | ||
439 | 448 | ||
440 | if (rval != QLA_SUCCESS) { | 449 | if (rval != QLA_SUCCESS) { |
441 | /*EMPTY*/ | 450 | /*EMPTY*/ |
@@ -568,7 +577,6 @@ int | |||
568 | qla2x00_mbx_reg_test(scsi_qla_host_t *vha) | 577 | qla2x00_mbx_reg_test(scsi_qla_host_t *vha) |
569 | { | 578 | { |
570 | int rval; | 579 | int rval; |
571 | struct qla_hw_data *ha = vha->hw; | ||
572 | mbx_cmd_t mc; | 580 | mbx_cmd_t mc; |
573 | mbx_cmd_t *mcp = &mc; | 581 | mbx_cmd_t *mcp = &mc; |
574 | 582 | ||
@@ -595,14 +603,6 @@ qla2x00_mbx_reg_test(scsi_qla_host_t *vha) | |||
595 | if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A || | 603 | if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A || |
596 | mcp->mb[7] != 0x2525) | 604 | mcp->mb[7] != 0x2525) |
597 | rval = QLA_FUNCTION_FAILED; | 605 | rval = QLA_FUNCTION_FAILED; |
598 | if (rval == QLA_FUNCTION_FAILED) { | ||
599 | struct device_reg_24xx __iomem *reg = | ||
600 | &ha->iobase->isp24; | ||
601 | |||
602 | qla2xxx_hw_event_log(vha, HW_EVENT_ISP_ERR, 0, | ||
603 | LSW(RD_REG_DWORD(®->hccr)), | ||
604 | LSW(RD_REG_DWORD(®->istatus))); | ||
605 | } | ||
606 | } | 606 | } |
607 | 607 | ||
608 | if (rval != QLA_SUCCESS) { | 608 | if (rval != QLA_SUCCESS) { |
@@ -1363,7 +1363,13 @@ qla2x00_lip_reset(scsi_qla_host_t *vha) | |||
1363 | 1363 | ||
1364 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 1364 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
1365 | 1365 | ||
1366 | if (IS_FWI2_CAPABLE(vha->hw)) { | 1366 | if (IS_QLA81XX(vha->hw)) { |
1367 | /* Logout across all FCFs. */ | ||
1368 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; | ||
1369 | mcp->mb[1] = BIT_1; | ||
1370 | mcp->mb[2] = 0; | ||
1371 | mcp->out_mb = MBX_2|MBX_1|MBX_0; | ||
1372 | } else if (IS_FWI2_CAPABLE(vha->hw)) { | ||
1367 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; | 1373 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; |
1368 | mcp->mb[1] = BIT_6; | 1374 | mcp->mb[1] = BIT_6; |
1369 | mcp->mb[2] = 0; | 1375 | mcp->mb[2] = 0; |
@@ -1853,6 +1859,9 @@ qla2x00_full_login_lip(scsi_qla_host_t *vha) | |||
1853 | mbx_cmd_t mc; | 1859 | mbx_cmd_t mc; |
1854 | mbx_cmd_t *mcp = &mc; | 1860 | mbx_cmd_t *mcp = &mc; |
1855 | 1861 | ||
1862 | if (IS_QLA81XX(vha->hw)) | ||
1863 | return QLA_SUCCESS; | ||
1864 | |||
1856 | DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", | 1865 | DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", |
1857 | vha->host_no)); | 1866 | vha->host_no)); |
1858 | 1867 | ||
@@ -2512,7 +2521,7 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma, | |||
2512 | mbx_cmd_t mc; | 2521 | mbx_cmd_t mc; |
2513 | mbx_cmd_t *mcp = &mc; | 2522 | mbx_cmd_t *mcp = &mc; |
2514 | 2523 | ||
2515 | if (!IS_QLA25XX(vha->hw)) | 2524 | if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw)) |
2516 | return QLA_FUNCTION_FAILED; | 2525 | return QLA_FUNCTION_FAILED; |
2517 | 2526 | ||
2518 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 2527 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
@@ -3155,7 +3164,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp, | |||
3155 | mcp->mb[7] = LSW(MSD(rsp->dma)); | 3164 | mcp->mb[7] = LSW(MSD(rsp->dma)); |
3156 | mcp->mb[5] = rsp->length; | 3165 | mcp->mb[5] = rsp->length; |
3157 | mcp->mb[11] = rsp->vp_idx; | 3166 | mcp->mb[11] = rsp->vp_idx; |
3158 | mcp->mb[14] = rsp->msix->vector; | 3167 | mcp->mb[14] = rsp->msix->entry; |
3159 | mcp->mb[13] = rsp->rid; | 3168 | mcp->mb[13] = rsp->rid; |
3160 | 3169 | ||
3161 | reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + | 3170 | reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + |
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index 386ffeae5b5a..886323130fcc 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
@@ -614,8 +614,10 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options, | |||
614 | req->vp_idx = vp_idx; | 614 | req->vp_idx = vp_idx; |
615 | req->qos = qos; | 615 | req->qos = qos; |
616 | 616 | ||
617 | if (ha->rsp_q_map[rsp_que]) | 617 | if (ha->rsp_q_map[rsp_que]) { |
618 | req->rsp = ha->rsp_q_map[rsp_que]; | 618 | req->rsp = ha->rsp_q_map[rsp_que]; |
619 | req->rsp->req = req; | ||
620 | } | ||
619 | /* Use alternate PCI bus number */ | 621 | /* Use alternate PCI bus number */ |
620 | if (MSB(req->rid)) | 622 | if (MSB(req->rid)) |
621 | options |= BIT_4; | 623 | options |= BIT_4; |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 8ea927788b3f..4a71f522f925 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -404,26 +404,9 @@ static char * | |||
404 | qla24xx_fw_version_str(struct scsi_qla_host *vha, char *str) | 404 | qla24xx_fw_version_str(struct scsi_qla_host *vha, char *str) |
405 | { | 405 | { |
406 | struct qla_hw_data *ha = vha->hw; | 406 | struct qla_hw_data *ha = vha->hw; |
407 | sprintf(str, "%d.%02d.%02d ", ha->fw_major_version, | ||
408 | ha->fw_minor_version, | ||
409 | ha->fw_subminor_version); | ||
410 | 407 | ||
411 | if (ha->fw_attributes & BIT_0) | 408 | sprintf(str, "%d.%02d.%02d (%x)", ha->fw_major_version, |
412 | strcat(str, "[Class 2] "); | 409 | ha->fw_minor_version, ha->fw_subminor_version, ha->fw_attributes); |
413 | if (ha->fw_attributes & BIT_1) | ||
414 | strcat(str, "[IP] "); | ||
415 | if (ha->fw_attributes & BIT_2) | ||
416 | strcat(str, "[Multi-ID] "); | ||
417 | if (ha->fw_attributes & BIT_3) | ||
418 | strcat(str, "[SB-2] "); | ||
419 | if (ha->fw_attributes & BIT_4) | ||
420 | strcat(str, "[T10 CRC] "); | ||
421 | if (ha->fw_attributes & BIT_5) | ||
422 | strcat(str, "[VI] "); | ||
423 | if (ha->fw_attributes & BIT_10) | ||
424 | strcat(str, "[84XX] "); | ||
425 | if (ha->fw_attributes & BIT_13) | ||
426 | strcat(str, "[Experimental]"); | ||
427 | return str; | 410 | return str; |
428 | } | 411 | } |
429 | 412 | ||
@@ -438,7 +421,6 @@ qla2x00_get_new_sp(scsi_qla_host_t *vha, fc_port_t *fcport, | |||
438 | if (!sp) | 421 | if (!sp) |
439 | return sp; | 422 | return sp; |
440 | 423 | ||
441 | sp->vha = vha; | ||
442 | sp->fcport = fcport; | 424 | sp->fcport = fcport; |
443 | sp->cmd = cmd; | 425 | sp->cmd = cmd; |
444 | sp->que = ha->req_q_map[0]; | 426 | sp->que = ha->req_q_map[0]; |
@@ -1182,7 +1164,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res) | |||
1182 | continue; | 1164 | continue; |
1183 | for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { | 1165 | for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { |
1184 | sp = req->outstanding_cmds[cnt]; | 1166 | sp = req->outstanding_cmds[cnt]; |
1185 | if (sp && sp->vha == vha) { | 1167 | if (sp && sp->fcport->vha == vha) { |
1186 | req->outstanding_cmds[cnt] = NULL; | 1168 | req->outstanding_cmds[cnt] = NULL; |
1187 | sp->cmd->result = res; | 1169 | sp->cmd->result = res; |
1188 | qla2x00_sp_compl(ha, sp); | 1170 | qla2x00_sp_compl(ha, sp); |
@@ -1329,6 +1311,8 @@ qla24xx_disable_intrs(struct qla_hw_data *ha) | |||
1329 | unsigned long flags = 0; | 1311 | unsigned long flags = 0; |
1330 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | 1312 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; |
1331 | 1313 | ||
1314 | if (IS_NOPOLLING_TYPE(ha)) | ||
1315 | return; | ||
1332 | spin_lock_irqsave(&ha->hardware_lock, flags); | 1316 | spin_lock_irqsave(&ha->hardware_lock, flags); |
1333 | ha->interrupts_on = 0; | 1317 | ha->interrupts_on = 0; |
1334 | WRT_REG_DWORD(®->ictrl, 0); | 1318 | WRT_REG_DWORD(®->ictrl, 0); |
@@ -1488,6 +1472,44 @@ static struct isp_operations qla25xx_isp_ops = { | |||
1488 | .rd_req_reg = qla24xx_rd_req_reg, | 1472 | .rd_req_reg = qla24xx_rd_req_reg, |
1489 | }; | 1473 | }; |
1490 | 1474 | ||
1475 | static struct isp_operations qla81xx_isp_ops = { | ||
1476 | .pci_config = qla25xx_pci_config, | ||
1477 | .reset_chip = qla24xx_reset_chip, | ||
1478 | .chip_diag = qla24xx_chip_diag, | ||
1479 | .config_rings = qla24xx_config_rings, | ||
1480 | .reset_adapter = qla24xx_reset_adapter, | ||
1481 | .nvram_config = qla81xx_nvram_config, | ||
1482 | .update_fw_options = qla81xx_update_fw_options, | ||
1483 | .load_risc = qla24xx_load_risc, | ||
1484 | .pci_info_str = qla24xx_pci_info_str, | ||
1485 | .fw_version_str = qla24xx_fw_version_str, | ||
1486 | .intr_handler = qla24xx_intr_handler, | ||
1487 | .enable_intrs = qla24xx_enable_intrs, | ||
1488 | .disable_intrs = qla24xx_disable_intrs, | ||
1489 | .abort_command = qla24xx_abort_command, | ||
1490 | .target_reset = qla24xx_abort_target, | ||
1491 | .lun_reset = qla24xx_lun_reset, | ||
1492 | .fabric_login = qla24xx_login_fabric, | ||
1493 | .fabric_logout = qla24xx_fabric_logout, | ||
1494 | .calc_req_entries = NULL, | ||
1495 | .build_iocbs = NULL, | ||
1496 | .prep_ms_iocb = qla24xx_prep_ms_iocb, | ||
1497 | .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb, | ||
1498 | .read_nvram = qla25xx_read_nvram_data, | ||
1499 | .write_nvram = qla25xx_write_nvram_data, | ||
1500 | .fw_dump = qla81xx_fw_dump, | ||
1501 | .beacon_on = qla24xx_beacon_on, | ||
1502 | .beacon_off = qla24xx_beacon_off, | ||
1503 | .beacon_blink = qla24xx_beacon_blink, | ||
1504 | .read_optrom = qla25xx_read_optrom_data, | ||
1505 | .write_optrom = qla24xx_write_optrom_data, | ||
1506 | .get_flash_version = qla24xx_get_flash_version, | ||
1507 | .start_scsi = qla24xx_start_scsi, | ||
1508 | .wrt_req_reg = qla24xx_wrt_req_reg, | ||
1509 | .wrt_rsp_reg = qla24xx_wrt_rsp_reg, | ||
1510 | .rd_req_reg = qla24xx_rd_req_reg, | ||
1511 | }; | ||
1512 | |||
1491 | static inline void | 1513 | static inline void |
1492 | qla2x00_set_isp_flags(struct qla_hw_data *ha) | 1514 | qla2x00_set_isp_flags(struct qla_hw_data *ha) |
1493 | { | 1515 | { |
@@ -1567,6 +1589,13 @@ qla2x00_set_isp_flags(struct qla_hw_data *ha) | |||
1567 | ha->device_type |= DT_IIDMA; | 1589 | ha->device_type |= DT_IIDMA; |
1568 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | 1590 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; |
1569 | break; | 1591 | break; |
1592 | case PCI_DEVICE_ID_QLOGIC_ISP8001: | ||
1593 | ha->device_type |= DT_ISP8001; | ||
1594 | ha->device_type |= DT_ZIO_SUPPORTED; | ||
1595 | ha->device_type |= DT_FWI2; | ||
1596 | ha->device_type |= DT_IIDMA; | ||
1597 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | ||
1598 | break; | ||
1570 | } | 1599 | } |
1571 | } | 1600 | } |
1572 | 1601 | ||
@@ -1629,7 +1658,7 @@ skip_pio: | |||
1629 | 1658 | ||
1630 | /* Determine queue resources */ | 1659 | /* Determine queue resources */ |
1631 | ha->max_queues = 1; | 1660 | ha->max_queues = 1; |
1632 | if (ql2xmaxqueues <= 1 || !IS_QLA25XX(ha)) | 1661 | if (ql2xmaxqueues <= 1 || (!IS_QLA25XX(ha) && !IS_QLA81XX(ha))) |
1633 | goto mqiobase_exit; | 1662 | goto mqiobase_exit; |
1634 | ha->mqiobase = ioremap(pci_resource_start(ha->pdev, 3), | 1663 | ha->mqiobase = ioremap(pci_resource_start(ha->pdev, 3), |
1635 | pci_resource_len(ha->pdev, 3)); | 1664 | pci_resource_len(ha->pdev, 3)); |
@@ -1706,7 +1735,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1706 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8432 || | 1735 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8432 || |
1707 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5422 || | 1736 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5422 || |
1708 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 || | 1737 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 || |
1709 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532) { | 1738 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532 || |
1739 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8001) { | ||
1710 | bars = pci_select_bars(pdev, IORESOURCE_MEM); | 1740 | bars = pci_select_bars(pdev, IORESOURCE_MEM); |
1711 | sht = &qla24xx_driver_template; | 1741 | sht = &qla24xx_driver_template; |
1712 | mem_only = 1; | 1742 | mem_only = 1; |
@@ -1760,6 +1790,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1760 | rsp_length = RESPONSE_ENTRY_CNT_2100; | 1790 | rsp_length = RESPONSE_ENTRY_CNT_2100; |
1761 | ha->max_loop_id = SNS_LAST_LOOP_ID_2100; | 1791 | ha->max_loop_id = SNS_LAST_LOOP_ID_2100; |
1762 | ha->gid_list_info_size = 4; | 1792 | ha->gid_list_info_size = 4; |
1793 | ha->flash_conf_off = ~0; | ||
1794 | ha->flash_data_off = ~0; | ||
1795 | ha->nvram_conf_off = ~0; | ||
1796 | ha->nvram_data_off = ~0; | ||
1763 | ha->isp_ops = &qla2100_isp_ops; | 1797 | ha->isp_ops = &qla2100_isp_ops; |
1764 | } else if (IS_QLA2200(ha)) { | 1798 | } else if (IS_QLA2200(ha)) { |
1765 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1799 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
@@ -1767,6 +1801,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1767 | rsp_length = RESPONSE_ENTRY_CNT_2100; | 1801 | rsp_length = RESPONSE_ENTRY_CNT_2100; |
1768 | ha->max_loop_id = SNS_LAST_LOOP_ID_2100; | 1802 | ha->max_loop_id = SNS_LAST_LOOP_ID_2100; |
1769 | ha->gid_list_info_size = 4; | 1803 | ha->gid_list_info_size = 4; |
1804 | ha->flash_conf_off = ~0; | ||
1805 | ha->flash_data_off = ~0; | ||
1806 | ha->nvram_conf_off = ~0; | ||
1807 | ha->nvram_data_off = ~0; | ||
1770 | ha->isp_ops = &qla2100_isp_ops; | 1808 | ha->isp_ops = &qla2100_isp_ops; |
1771 | } else if (IS_QLA23XX(ha)) { | 1809 | } else if (IS_QLA23XX(ha)) { |
1772 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1810 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
@@ -1776,6 +1814,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1776 | ha->gid_list_info_size = 6; | 1814 | ha->gid_list_info_size = 6; |
1777 | if (IS_QLA2322(ha) || IS_QLA6322(ha)) | 1815 | if (IS_QLA2322(ha) || IS_QLA6322(ha)) |
1778 | ha->optrom_size = OPTROM_SIZE_2322; | 1816 | ha->optrom_size = OPTROM_SIZE_2322; |
1817 | ha->flash_conf_off = ~0; | ||
1818 | ha->flash_data_off = ~0; | ||
1819 | ha->nvram_conf_off = ~0; | ||
1820 | ha->nvram_data_off = ~0; | ||
1779 | ha->isp_ops = &qla2300_isp_ops; | 1821 | ha->isp_ops = &qla2300_isp_ops; |
1780 | } else if (IS_QLA24XX_TYPE(ha)) { | 1822 | } else if (IS_QLA24XX_TYPE(ha)) { |
1781 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1823 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
@@ -1787,6 +1829,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1787 | ha->optrom_size = OPTROM_SIZE_24XX; | 1829 | ha->optrom_size = OPTROM_SIZE_24XX; |
1788 | ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA24XX; | 1830 | ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA24XX; |
1789 | ha->isp_ops = &qla24xx_isp_ops; | 1831 | ha->isp_ops = &qla24xx_isp_ops; |
1832 | ha->flash_conf_off = FARX_ACCESS_FLASH_CONF; | ||
1833 | ha->flash_data_off = FARX_ACCESS_FLASH_DATA; | ||
1834 | ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; | ||
1835 | ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; | ||
1790 | } else if (IS_QLA25XX(ha)) { | 1836 | } else if (IS_QLA25XX(ha)) { |
1791 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1837 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
1792 | req_length = REQUEST_ENTRY_CNT_24XX; | 1838 | req_length = REQUEST_ENTRY_CNT_24XX; |
@@ -1797,6 +1843,23 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1797 | ha->optrom_size = OPTROM_SIZE_25XX; | 1843 | ha->optrom_size = OPTROM_SIZE_25XX; |
1798 | ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX; | 1844 | ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX; |
1799 | ha->isp_ops = &qla25xx_isp_ops; | 1845 | ha->isp_ops = &qla25xx_isp_ops; |
1846 | ha->flash_conf_off = FARX_ACCESS_FLASH_CONF; | ||
1847 | ha->flash_data_off = FARX_ACCESS_FLASH_DATA; | ||
1848 | ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; | ||
1849 | ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; | ||
1850 | } else if (IS_QLA81XX(ha)) { | ||
1851 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | ||
1852 | req_length = REQUEST_ENTRY_CNT_24XX; | ||
1853 | rsp_length = RESPONSE_ENTRY_CNT_2300; | ||
1854 | ha->max_loop_id = SNS_LAST_LOOP_ID_2300; | ||
1855 | ha->init_cb_size = sizeof(struct mid_init_cb_81xx); | ||
1856 | ha->gid_list_info_size = 8; | ||
1857 | ha->optrom_size = OPTROM_SIZE_81XX; | ||
1858 | ha->isp_ops = &qla81xx_isp_ops; | ||
1859 | ha->flash_conf_off = FARX_ACCESS_FLASH_CONF_81XX; | ||
1860 | ha->flash_data_off = FARX_ACCESS_FLASH_DATA_81XX; | ||
1861 | ha->nvram_conf_off = ~0; | ||
1862 | ha->nvram_data_off = ~0; | ||
1800 | } | 1863 | } |
1801 | 1864 | ||
1802 | mutex_init(&ha->vport_lock); | 1865 | mutex_init(&ha->vport_lock); |
@@ -2458,23 +2521,6 @@ qla2x00_post_aen_work(struct scsi_qla_host *vha, enum fc_host_event_code code, | |||
2458 | return qla2x00_post_work(vha, e, 1); | 2521 | return qla2x00_post_work(vha, e, 1); |
2459 | } | 2522 | } |
2460 | 2523 | ||
2461 | int | ||
2462 | qla2x00_post_hwe_work(struct scsi_qla_host *vha, uint16_t code, uint16_t d1, | ||
2463 | uint16_t d2, uint16_t d3) | ||
2464 | { | ||
2465 | struct qla_work_evt *e; | ||
2466 | |||
2467 | e = qla2x00_alloc_work(vha, QLA_EVT_HWE_LOG, 1); | ||
2468 | if (!e) | ||
2469 | return QLA_FUNCTION_FAILED; | ||
2470 | |||
2471 | e->u.hwe.code = code; | ||
2472 | e->u.hwe.d1 = d1; | ||
2473 | e->u.hwe.d2 = d2; | ||
2474 | e->u.hwe.d3 = d3; | ||
2475 | return qla2x00_post_work(vha, e, 1); | ||
2476 | } | ||
2477 | |||
2478 | static void | 2524 | static void |
2479 | qla2x00_do_work(struct scsi_qla_host *vha) | 2525 | qla2x00_do_work(struct scsi_qla_host *vha) |
2480 | { | 2526 | { |
@@ -2492,10 +2538,6 @@ qla2x00_do_work(struct scsi_qla_host *vha) | |||
2492 | fc_host_post_event(vha->host, fc_get_event_number(), | 2538 | fc_host_post_event(vha->host, fc_get_event_number(), |
2493 | e->u.aen.code, e->u.aen.data); | 2539 | e->u.aen.code, e->u.aen.data); |
2494 | break; | 2540 | break; |
2495 | case QLA_EVT_HWE_LOG: | ||
2496 | qla2xxx_hw_event_log(vha, e->u.hwe.code, e->u.hwe.d1, | ||
2497 | e->u.hwe.d2, e->u.hwe.d3); | ||
2498 | break; | ||
2499 | } | 2541 | } |
2500 | if (e->flags & QLA_EVT_FLAG_FREE) | 2542 | if (e->flags & QLA_EVT_FLAG_FREE) |
2501 | kfree(e); | 2543 | kfree(e); |
@@ -2914,13 +2956,14 @@ qla2x00_timer(scsi_qla_host_t *vha) | |||
2914 | 2956 | ||
2915 | /* Firmware interface routines. */ | 2957 | /* Firmware interface routines. */ |
2916 | 2958 | ||
2917 | #define FW_BLOBS 6 | 2959 | #define FW_BLOBS 7 |
2918 | #define FW_ISP21XX 0 | 2960 | #define FW_ISP21XX 0 |
2919 | #define FW_ISP22XX 1 | 2961 | #define FW_ISP22XX 1 |
2920 | #define FW_ISP2300 2 | 2962 | #define FW_ISP2300 2 |
2921 | #define FW_ISP2322 3 | 2963 | #define FW_ISP2322 3 |
2922 | #define FW_ISP24XX 4 | 2964 | #define FW_ISP24XX 4 |
2923 | #define FW_ISP25XX 5 | 2965 | #define FW_ISP25XX 5 |
2966 | #define FW_ISP81XX 6 | ||
2924 | 2967 | ||
2925 | #define FW_FILE_ISP21XX "ql2100_fw.bin" | 2968 | #define FW_FILE_ISP21XX "ql2100_fw.bin" |
2926 | #define FW_FILE_ISP22XX "ql2200_fw.bin" | 2969 | #define FW_FILE_ISP22XX "ql2200_fw.bin" |
@@ -2928,6 +2971,7 @@ qla2x00_timer(scsi_qla_host_t *vha) | |||
2928 | #define FW_FILE_ISP2322 "ql2322_fw.bin" | 2971 | #define FW_FILE_ISP2322 "ql2322_fw.bin" |
2929 | #define FW_FILE_ISP24XX "ql2400_fw.bin" | 2972 | #define FW_FILE_ISP24XX "ql2400_fw.bin" |
2930 | #define FW_FILE_ISP25XX "ql2500_fw.bin" | 2973 | #define FW_FILE_ISP25XX "ql2500_fw.bin" |
2974 | #define FW_FILE_ISP81XX "ql8100_fw.bin" | ||
2931 | 2975 | ||
2932 | static DEFINE_MUTEX(qla_fw_lock); | 2976 | static DEFINE_MUTEX(qla_fw_lock); |
2933 | 2977 | ||
@@ -2938,6 +2982,7 @@ static struct fw_blob qla_fw_blobs[FW_BLOBS] = { | |||
2938 | { .name = FW_FILE_ISP2322, .segs = { 0x800, 0x1c000, 0x1e000, 0 }, }, | 2982 | { .name = FW_FILE_ISP2322, .segs = { 0x800, 0x1c000, 0x1e000, 0 }, }, |
2939 | { .name = FW_FILE_ISP24XX, }, | 2983 | { .name = FW_FILE_ISP24XX, }, |
2940 | { .name = FW_FILE_ISP25XX, }, | 2984 | { .name = FW_FILE_ISP25XX, }, |
2985 | { .name = FW_FILE_ISP81XX, }, | ||
2941 | }; | 2986 | }; |
2942 | 2987 | ||
2943 | struct fw_blob * | 2988 | struct fw_blob * |
@@ -2959,6 +3004,8 @@ qla2x00_request_firmware(scsi_qla_host_t *vha) | |||
2959 | blob = &qla_fw_blobs[FW_ISP24XX]; | 3004 | blob = &qla_fw_blobs[FW_ISP24XX]; |
2960 | } else if (IS_QLA25XX(ha)) { | 3005 | } else if (IS_QLA25XX(ha)) { |
2961 | blob = &qla_fw_blobs[FW_ISP25XX]; | 3006 | blob = &qla_fw_blobs[FW_ISP25XX]; |
3007 | } else if (IS_QLA81XX(ha)) { | ||
3008 | blob = &qla_fw_blobs[FW_ISP81XX]; | ||
2962 | } | 3009 | } |
2963 | 3010 | ||
2964 | mutex_lock(&qla_fw_lock); | 3011 | mutex_lock(&qla_fw_lock); |
@@ -3112,6 +3159,7 @@ static struct pci_device_id qla2xxx_pci_tbl[] = { | |||
3112 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, | 3159 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, |
3113 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, | 3160 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, |
3114 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) }, | 3161 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) }, |
3162 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8001) }, | ||
3115 | { 0 }, | 3163 | { 0 }, |
3116 | }; | 3164 | }; |
3117 | MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); | 3165 | MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); |
@@ -3200,3 +3248,4 @@ MODULE_FIRMWARE(FW_FILE_ISP2300); | |||
3200 | MODULE_FIRMWARE(FW_FILE_ISP2322); | 3248 | MODULE_FIRMWARE(FW_FILE_ISP2322); |
3201 | MODULE_FIRMWARE(FW_FILE_ISP24XX); | 3249 | MODULE_FIRMWARE(FW_FILE_ISP24XX); |
3202 | MODULE_FIRMWARE(FW_FILE_ISP25XX); | 3250 | MODULE_FIRMWARE(FW_FILE_ISP25XX); |
3251 | MODULE_FIRMWARE(FW_FILE_ISP81XX); | ||
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index c538ee1b1a31..303f8ee11f25 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c | |||
@@ -425,27 +425,27 @@ qla2x00_set_nvram_protection(struct qla_hw_data *ha, int stat) | |||
425 | #define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4) | 425 | #define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4) |
426 | 426 | ||
427 | static inline uint32_t | 427 | static inline uint32_t |
428 | flash_conf_to_access_addr(uint32_t faddr) | 428 | flash_conf_addr(struct qla_hw_data *ha, uint32_t faddr) |
429 | { | 429 | { |
430 | return FARX_ACCESS_FLASH_CONF | faddr; | 430 | return ha->flash_conf_off | faddr; |
431 | } | 431 | } |
432 | 432 | ||
433 | static inline uint32_t | 433 | static inline uint32_t |
434 | flash_data_to_access_addr(uint32_t faddr) | 434 | flash_data_addr(struct qla_hw_data *ha, uint32_t faddr) |
435 | { | 435 | { |
436 | return FARX_ACCESS_FLASH_DATA | faddr; | 436 | return ha->flash_data_off | faddr; |
437 | } | 437 | } |
438 | 438 | ||
439 | static inline uint32_t | 439 | static inline uint32_t |
440 | nvram_conf_to_access_addr(uint32_t naddr) | 440 | nvram_conf_addr(struct qla_hw_data *ha, uint32_t naddr) |
441 | { | 441 | { |
442 | return FARX_ACCESS_NVRAM_CONF | naddr; | 442 | return ha->nvram_conf_off | naddr; |
443 | } | 443 | } |
444 | 444 | ||
445 | static inline uint32_t | 445 | static inline uint32_t |
446 | nvram_data_to_access_addr(uint32_t naddr) | 446 | nvram_data_addr(struct qla_hw_data *ha, uint32_t naddr) |
447 | { | 447 | { |
448 | return FARX_ACCESS_NVRAM_DATA | naddr; | 448 | return ha->nvram_data_off | naddr; |
449 | } | 449 | } |
450 | 450 | ||
451 | static uint32_t | 451 | static uint32_t |
@@ -481,10 +481,12 @@ qla24xx_read_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
481 | uint32_t dwords) | 481 | uint32_t dwords) |
482 | { | 482 | { |
483 | uint32_t i; | 483 | uint32_t i; |
484 | struct qla_hw_data *ha = vha->hw; | ||
485 | |||
484 | /* Dword reads to flash. */ | 486 | /* Dword reads to flash. */ |
485 | for (i = 0; i < dwords; i++, faddr++) | 487 | for (i = 0; i < dwords; i++, faddr++) |
486 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(vha->hw, | 488 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, |
487 | flash_data_to_access_addr(faddr))); | 489 | flash_data_addr(ha, faddr))); |
488 | 490 | ||
489 | return dwptr; | 491 | return dwptr; |
490 | } | 492 | } |
@@ -518,7 +520,7 @@ qla24xx_get_flash_manufacturer(struct qla_hw_data *ha, uint8_t *man_id, | |||
518 | { | 520 | { |
519 | uint32_t ids; | 521 | uint32_t ids; |
520 | 522 | ||
521 | ids = qla24xx_read_flash_dword(ha, flash_data_to_access_addr(0xd03ab)); | 523 | ids = qla24xx_read_flash_dword(ha, flash_conf_addr(ha, 0x03ab)); |
522 | *man_id = LSB(ids); | 524 | *man_id = LSB(ids); |
523 | *flash_id = MSB(ids); | 525 | *flash_id = MSB(ids); |
524 | 526 | ||
@@ -530,8 +532,7 @@ qla24xx_get_flash_manufacturer(struct qla_hw_data *ha, uint8_t *man_id, | |||
530 | * Example: ATMEL 0x00 01 45 1F | 532 | * Example: ATMEL 0x00 01 45 1F |
531 | * Extract MFG and Dev ID from last two bytes. | 533 | * Extract MFG and Dev ID from last two bytes. |
532 | */ | 534 | */ |
533 | ids = qla24xx_read_flash_dword(ha, | 535 | ids = qla24xx_read_flash_dword(ha, flash_conf_addr(ha, 0x009f)); |
534 | flash_data_to_access_addr(0xd009f)); | ||
535 | *man_id = LSB(ids); | 536 | *man_id = LSB(ids); |
536 | *flash_id = MSB(ids); | 537 | *flash_id = MSB(ids); |
537 | } | 538 | } |
@@ -555,9 +556,13 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start) | |||
555 | 556 | ||
556 | /* Begin with sane defaults. */ | 557 | /* Begin with sane defaults. */ |
557 | loc = locations[0]; | 558 | loc = locations[0]; |
558 | *start = IS_QLA24XX_TYPE(ha) ? FA_FLASH_LAYOUT_ADDR_24: | 559 | *start = 0; |
559 | FA_FLASH_LAYOUT_ADDR; | 560 | if (IS_QLA24XX_TYPE(ha)) |
560 | 561 | *start = FA_FLASH_LAYOUT_ADDR_24; | |
562 | else if (IS_QLA25XX(ha)) | ||
563 | *start = FA_FLASH_LAYOUT_ADDR; | ||
564 | else if (IS_QLA81XX(ha)) | ||
565 | *start = FA_FLASH_LAYOUT_ADDR_81; | ||
561 | /* Begin with first PCI expansion ROM header. */ | 566 | /* Begin with first PCI expansion ROM header. */ |
562 | buf = (uint8_t *)req->ring; | 567 | buf = (uint8_t *)req->ring; |
563 | dcode = (uint32_t *)req->ring; | 568 | dcode = (uint32_t *)req->ring; |
@@ -618,6 +623,22 @@ static void | |||
618 | qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) | 623 | qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) |
619 | { | 624 | { |
620 | const char *loc, *locations[] = { "DEF", "FLT" }; | 625 | const char *loc, *locations[] = { "DEF", "FLT" }; |
626 | const uint32_t def_fw[] = | ||
627 | { FA_RISC_CODE_ADDR, FA_RISC_CODE_ADDR, FA_RISC_CODE_ADDR_81 }; | ||
628 | const uint32_t def_boot[] = | ||
629 | { FA_BOOT_CODE_ADDR, FA_BOOT_CODE_ADDR, FA_BOOT_CODE_ADDR_81 }; | ||
630 | const uint32_t def_vpd_nvram[] = | ||
631 | { FA_VPD_NVRAM_ADDR, FA_VPD_NVRAM_ADDR, FA_VPD_NVRAM_ADDR_81 }; | ||
632 | const uint32_t def_fdt[] = | ||
633 | { FA_FLASH_DESCR_ADDR_24, FA_FLASH_DESCR_ADDR, | ||
634 | FA_FLASH_DESCR_ADDR_81 }; | ||
635 | const uint32_t def_npiv_conf0[] = | ||
636 | { FA_NPIV_CONF0_ADDR_24, FA_NPIV_CONF0_ADDR, | ||
637 | FA_NPIV_CONF0_ADDR_81 }; | ||
638 | const uint32_t def_npiv_conf1[] = | ||
639 | { FA_NPIV_CONF1_ADDR_24, FA_NPIV_CONF1_ADDR, | ||
640 | FA_NPIV_CONF1_ADDR_81 }; | ||
641 | uint32_t def; | ||
621 | uint16_t *wptr; | 642 | uint16_t *wptr; |
622 | uint16_t cnt, chksum; | 643 | uint16_t cnt, chksum; |
623 | uint32_t start; | 644 | uint32_t start; |
@@ -676,20 +697,12 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) | |||
676 | case FLT_REG_FDT: | 697 | case FLT_REG_FDT: |
677 | ha->flt_region_fdt = start; | 698 | ha->flt_region_fdt = start; |
678 | break; | 699 | break; |
679 | case FLT_REG_HW_EVENT_0: | ||
680 | if (!PCI_FUNC(ha->pdev->devfn)) | ||
681 | ha->flt_region_hw_event = start; | ||
682 | break; | ||
683 | case FLT_REG_HW_EVENT_1: | ||
684 | if (PCI_FUNC(ha->pdev->devfn)) | ||
685 | ha->flt_region_hw_event = start; | ||
686 | break; | ||
687 | case FLT_REG_NPIV_CONF_0: | 700 | case FLT_REG_NPIV_CONF_0: |
688 | if (!PCI_FUNC(ha->pdev->devfn)) | 701 | if (!(PCI_FUNC(ha->pdev->devfn) & 1)) |
689 | ha->flt_region_npiv_conf = start; | 702 | ha->flt_region_npiv_conf = start; |
690 | break; | 703 | break; |
691 | case FLT_REG_NPIV_CONF_1: | 704 | case FLT_REG_NPIV_CONF_1: |
692 | if (PCI_FUNC(ha->pdev->devfn)) | 705 | if (PCI_FUNC(ha->pdev->devfn) & 1) |
693 | ha->flt_region_npiv_conf = start; | 706 | ha->flt_region_npiv_conf = start; |
694 | break; | 707 | break; |
695 | } | 708 | } |
@@ -699,22 +712,24 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) | |||
699 | no_flash_data: | 712 | no_flash_data: |
700 | /* Use hardcoded defaults. */ | 713 | /* Use hardcoded defaults. */ |
701 | loc = locations[0]; | 714 | loc = locations[0]; |
702 | ha->flt_region_fw = FA_RISC_CODE_ADDR; | 715 | def = 0; |
703 | ha->flt_region_boot = FA_BOOT_CODE_ADDR; | 716 | if (IS_QLA24XX_TYPE(ha)) |
704 | ha->flt_region_vpd_nvram = FA_VPD_NVRAM_ADDR; | 717 | def = 0; |
705 | ha->flt_region_fdt = IS_QLA24XX_TYPE(ha) ? FA_FLASH_DESCR_ADDR_24: | 718 | else if (IS_QLA25XX(ha)) |
706 | FA_FLASH_DESCR_ADDR; | 719 | def = 1; |
707 | ha->flt_region_hw_event = !PCI_FUNC(ha->pdev->devfn) ? | 720 | else if (IS_QLA81XX(ha)) |
708 | FA_HW_EVENT0_ADDR: FA_HW_EVENT1_ADDR; | 721 | def = 2; |
709 | ha->flt_region_npiv_conf = !PCI_FUNC(ha->pdev->devfn) ? | 722 | ha->flt_region_fw = def_fw[def]; |
710 | (IS_QLA24XX_TYPE(ha) ? FA_NPIV_CONF0_ADDR_24: FA_NPIV_CONF0_ADDR): | 723 | ha->flt_region_boot = def_boot[def]; |
711 | (IS_QLA24XX_TYPE(ha) ? FA_NPIV_CONF1_ADDR_24: FA_NPIV_CONF1_ADDR); | 724 | ha->flt_region_vpd_nvram = def_vpd_nvram[def]; |
725 | ha->flt_region_fdt = def_fdt[def]; | ||
726 | ha->flt_region_npiv_conf = !(PCI_FUNC(ha->pdev->devfn) & 1) ? | ||
727 | def_npiv_conf0[def]: def_npiv_conf1[def]; | ||
712 | done: | 728 | done: |
713 | DEBUG2(qla_printk(KERN_DEBUG, ha, "FLT[%s]: boot=0x%x fw=0x%x " | 729 | DEBUG2(qla_printk(KERN_DEBUG, ha, "FLT[%s]: boot=0x%x fw=0x%x " |
714 | "vpd_nvram=0x%x fdt=0x%x flt=0x%x hwe=0x%x npiv=0x%x.\n", loc, | 730 | "vpd_nvram=0x%x fdt=0x%x flt=0x%x npiv=0x%x.\n", loc, |
715 | ha->flt_region_boot, ha->flt_region_fw, ha->flt_region_vpd_nvram, | 731 | ha->flt_region_boot, ha->flt_region_fw, ha->flt_region_vpd_nvram, |
716 | ha->flt_region_fdt, ha->flt_region_flt, ha->flt_region_hw_event, | 732 | ha->flt_region_fdt, ha->flt_region_flt, ha->flt_region_npiv_conf)); |
717 | ha->flt_region_npiv_conf)); | ||
718 | } | 733 | } |
719 | 734 | ||
720 | static void | 735 | static void |
@@ -757,14 +772,14 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha) | |||
757 | mid = le16_to_cpu(fdt->man_id); | 772 | mid = le16_to_cpu(fdt->man_id); |
758 | fid = le16_to_cpu(fdt->id); | 773 | fid = le16_to_cpu(fdt->id); |
759 | ha->fdt_wrt_disable = fdt->wrt_disable_bits; | 774 | ha->fdt_wrt_disable = fdt->wrt_disable_bits; |
760 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0300 | fdt->erase_cmd); | 775 | ha->fdt_erase_cmd = flash_conf_addr(ha, 0x0300 | fdt->erase_cmd); |
761 | ha->fdt_block_size = le32_to_cpu(fdt->block_size); | 776 | ha->fdt_block_size = le32_to_cpu(fdt->block_size); |
762 | if (fdt->unprotect_sec_cmd) { | 777 | if (fdt->unprotect_sec_cmd) { |
763 | ha->fdt_unprotect_sec_cmd = flash_conf_to_access_addr(0x0300 | | 778 | ha->fdt_unprotect_sec_cmd = flash_conf_addr(ha, 0x0300 | |
764 | fdt->unprotect_sec_cmd); | 779 | fdt->unprotect_sec_cmd); |
765 | ha->fdt_protect_sec_cmd = fdt->protect_sec_cmd ? | 780 | ha->fdt_protect_sec_cmd = fdt->protect_sec_cmd ? |
766 | flash_conf_to_access_addr(0x0300 | fdt->protect_sec_cmd): | 781 | flash_conf_addr(ha, 0x0300 | fdt->protect_sec_cmd): |
767 | flash_conf_to_access_addr(0x0336); | 782 | flash_conf_addr(ha, 0x0336); |
768 | } | 783 | } |
769 | goto done; | 784 | goto done; |
770 | no_flash_data: | 785 | no_flash_data: |
@@ -773,7 +788,7 @@ no_flash_data: | |||
773 | mid = man_id; | 788 | mid = man_id; |
774 | fid = flash_id; | 789 | fid = flash_id; |
775 | ha->fdt_wrt_disable = 0x9c; | 790 | ha->fdt_wrt_disable = 0x9c; |
776 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x03d8); | 791 | ha->fdt_erase_cmd = flash_conf_addr(ha, 0x03d8); |
777 | switch (man_id) { | 792 | switch (man_id) { |
778 | case 0xbf: /* STT flash. */ | 793 | case 0xbf: /* STT flash. */ |
779 | if (flash_id == 0x8e) | 794 | if (flash_id == 0x8e) |
@@ -782,16 +797,16 @@ no_flash_data: | |||
782 | ha->fdt_block_size = FLASH_BLK_SIZE_32K; | 797 | ha->fdt_block_size = FLASH_BLK_SIZE_32K; |
783 | 798 | ||
784 | if (flash_id == 0x80) | 799 | if (flash_id == 0x80) |
785 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0352); | 800 | ha->fdt_erase_cmd = flash_conf_addr(ha, 0x0352); |
786 | break; | 801 | break; |
787 | case 0x13: /* ST M25P80. */ | 802 | case 0x13: /* ST M25P80. */ |
788 | ha->fdt_block_size = FLASH_BLK_SIZE_64K; | 803 | ha->fdt_block_size = FLASH_BLK_SIZE_64K; |
789 | break; | 804 | break; |
790 | case 0x1f: /* Atmel 26DF081A. */ | 805 | case 0x1f: /* Atmel 26DF081A. */ |
791 | ha->fdt_block_size = FLASH_BLK_SIZE_4K; | 806 | ha->fdt_block_size = FLASH_BLK_SIZE_4K; |
792 | ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0320); | 807 | ha->fdt_erase_cmd = flash_conf_addr(ha, 0x0320); |
793 | ha->fdt_unprotect_sec_cmd = flash_conf_to_access_addr(0x0339); | 808 | ha->fdt_unprotect_sec_cmd = flash_conf_addr(ha, 0x0339); |
794 | ha->fdt_protect_sec_cmd = flash_conf_to_access_addr(0x0336); | 809 | ha->fdt_protect_sec_cmd = flash_conf_addr(ha, 0x0336); |
795 | break; | 810 | break; |
796 | default: | 811 | default: |
797 | /* Default to 64 kb sector size. */ | 812 | /* Default to 64 kb sector size. */ |
@@ -813,7 +828,7 @@ qla2xxx_get_flash_info(scsi_qla_host_t *vha) | |||
813 | uint32_t flt_addr; | 828 | uint32_t flt_addr; |
814 | struct qla_hw_data *ha = vha->hw; | 829 | struct qla_hw_data *ha = vha->hw; |
815 | 830 | ||
816 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha)) | 831 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA81XX(ha)) |
817 | return QLA_SUCCESS; | 832 | return QLA_SUCCESS; |
818 | 833 | ||
819 | ret = qla2xxx_find_flt_start(vha, &flt_addr); | 834 | ret = qla2xxx_find_flt_start(vha, &flt_addr); |
@@ -838,7 +853,7 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) | |||
838 | struct qla_npiv_entry *entry; | 853 | struct qla_npiv_entry *entry; |
839 | struct qla_hw_data *ha = vha->hw; | 854 | struct qla_hw_data *ha = vha->hw; |
840 | 855 | ||
841 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha)) | 856 | if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA81XX(ha)) |
842 | return; | 857 | return; |
843 | 858 | ||
844 | ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr, | 859 | ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr, |
@@ -930,9 +945,9 @@ qla24xx_unprotect_flash(struct qla_hw_data *ha) | |||
930 | return; | 945 | return; |
931 | 946 | ||
932 | /* Disable flash write-protection. */ | 947 | /* Disable flash write-protection. */ |
933 | qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), 0); | 948 | qla24xx_write_flash_dword(ha, flash_conf_addr(ha, 0x101), 0); |
934 | /* Some flash parts need an additional zero-write to clear bits.*/ | 949 | /* Some flash parts need an additional zero-write to clear bits.*/ |
935 | qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), 0); | 950 | qla24xx_write_flash_dword(ha, flash_conf_addr(ha, 0x101), 0); |
936 | } | 951 | } |
937 | 952 | ||
938 | static void | 953 | static void |
@@ -945,11 +960,10 @@ qla24xx_protect_flash(struct qla_hw_data *ha) | |||
945 | goto skip_wrt_protect; | 960 | goto skip_wrt_protect; |
946 | 961 | ||
947 | /* Enable flash write-protection and wait for completion. */ | 962 | /* Enable flash write-protection and wait for completion. */ |
948 | qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), | 963 | qla24xx_write_flash_dword(ha, flash_conf_addr(ha, 0x101), |
949 | ha->fdt_wrt_disable); | 964 | ha->fdt_wrt_disable); |
950 | for (cnt = 300; cnt && | 965 | for (cnt = 300; cnt && |
951 | qla24xx_read_flash_dword(ha, | 966 | qla24xx_read_flash_dword(ha, flash_conf_addr(ha, 0x005)) & BIT_0; |
952 | flash_conf_to_access_addr(0x005)) & BIT_0; | ||
953 | cnt--) { | 967 | cnt--) { |
954 | udelay(10); | 968 | udelay(10); |
955 | } | 969 | } |
@@ -977,7 +991,7 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
977 | ret = QLA_SUCCESS; | 991 | ret = QLA_SUCCESS; |
978 | 992 | ||
979 | /* Prepare burst-capable write on supported ISPs. */ | 993 | /* Prepare burst-capable write on supported ISPs. */ |
980 | if (IS_QLA25XX(ha) && !(faddr & 0xfff) && | 994 | if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && !(faddr & 0xfff) && |
981 | dwords > OPTROM_BURST_DWORDS) { | 995 | dwords > OPTROM_BURST_DWORDS) { |
982 | optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, | 996 | optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, |
983 | &optrom_dma, GFP_KERNEL); | 997 | &optrom_dma, GFP_KERNEL); |
@@ -989,7 +1003,7 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
989 | } | 1003 | } |
990 | 1004 | ||
991 | rest_addr = (ha->fdt_block_size >> 2) - 1; | 1005 | rest_addr = (ha->fdt_block_size >> 2) - 1; |
992 | sec_mask = 0x80000 - (ha->fdt_block_size >> 2); | 1006 | sec_mask = (ha->optrom_size >> 2) - (ha->fdt_block_size >> 2); |
993 | 1007 | ||
994 | qla24xx_unprotect_flash(ha); | 1008 | qla24xx_unprotect_flash(ha); |
995 | 1009 | ||
@@ -1024,13 +1038,13 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
1024 | *s = cpu_to_le32(*d); | 1038 | *s = cpu_to_le32(*d); |
1025 | 1039 | ||
1026 | ret = qla2x00_load_ram(vha, optrom_dma, | 1040 | ret = qla2x00_load_ram(vha, optrom_dma, |
1027 | flash_data_to_access_addr(faddr), | 1041 | flash_data_addr(ha, faddr), |
1028 | OPTROM_BURST_DWORDS); | 1042 | OPTROM_BURST_DWORDS); |
1029 | if (ret != QLA_SUCCESS) { | 1043 | if (ret != QLA_SUCCESS) { |
1030 | qla_printk(KERN_WARNING, ha, | 1044 | qla_printk(KERN_WARNING, ha, |
1031 | "Unable to burst-write optrom segment " | 1045 | "Unable to burst-write optrom segment " |
1032 | "(%x/%x/%llx).\n", ret, | 1046 | "(%x/%x/%llx).\n", ret, |
1033 | flash_data_to_access_addr(faddr), | 1047 | flash_data_addr(ha, faddr), |
1034 | (unsigned long long)optrom_dma); | 1048 | (unsigned long long)optrom_dma); |
1035 | qla_printk(KERN_WARNING, ha, | 1049 | qla_printk(KERN_WARNING, ha, |
1036 | "Reverting to slow-write.\n"); | 1050 | "Reverting to slow-write.\n"); |
@@ -1047,7 +1061,7 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, | |||
1047 | } | 1061 | } |
1048 | 1062 | ||
1049 | ret = qla24xx_write_flash_dword(ha, | 1063 | ret = qla24xx_write_flash_dword(ha, |
1050 | flash_data_to_access_addr(faddr), cpu_to_le32(*dwptr)); | 1064 | flash_data_addr(ha, faddr), cpu_to_le32(*dwptr)); |
1051 | if (ret != QLA_SUCCESS) { | 1065 | if (ret != QLA_SUCCESS) { |
1052 | DEBUG9(printk("%s(%ld) Unable to program flash " | 1066 | DEBUG9(printk("%s(%ld) Unable to program flash " |
1053 | "address=%x data=%x.\n", __func__, | 1067 | "address=%x data=%x.\n", __func__, |
@@ -1098,12 +1112,13 @@ qla24xx_read_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, | |||
1098 | { | 1112 | { |
1099 | uint32_t i; | 1113 | uint32_t i; |
1100 | uint32_t *dwptr; | 1114 | uint32_t *dwptr; |
1115 | struct qla_hw_data *ha = vha->hw; | ||
1101 | 1116 | ||
1102 | /* Dword reads to flash. */ | 1117 | /* Dword reads to flash. */ |
1103 | dwptr = (uint32_t *)buf; | 1118 | dwptr = (uint32_t *)buf; |
1104 | for (i = 0; i < bytes >> 2; i++, naddr++) | 1119 | for (i = 0; i < bytes >> 2; i++, naddr++) |
1105 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(vha->hw, | 1120 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, |
1106 | nvram_data_to_access_addr(naddr))); | 1121 | nvram_data_addr(ha, naddr))); |
1107 | 1122 | ||
1108 | return buf; | 1123 | return buf; |
1109 | } | 1124 | } |
@@ -1160,17 +1175,14 @@ qla24xx_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, | |||
1160 | RD_REG_DWORD(®->ctrl_status); /* PCI Posting. */ | 1175 | RD_REG_DWORD(®->ctrl_status); /* PCI Posting. */ |
1161 | 1176 | ||
1162 | /* Disable NVRAM write-protection. */ | 1177 | /* Disable NVRAM write-protection. */ |
1163 | qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101), | 1178 | qla24xx_write_flash_dword(ha, nvram_conf_addr(ha, 0x101), 0); |
1164 | 0); | 1179 | qla24xx_write_flash_dword(ha, nvram_conf_addr(ha, 0x101), 0); |
1165 | qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101), | ||
1166 | 0); | ||
1167 | 1180 | ||
1168 | /* Dword writes to flash. */ | 1181 | /* Dword writes to flash. */ |
1169 | dwptr = (uint32_t *)buf; | 1182 | dwptr = (uint32_t *)buf; |
1170 | for (i = 0; i < bytes >> 2; i++, naddr++, dwptr++) { | 1183 | for (i = 0; i < bytes >> 2; i++, naddr++, dwptr++) { |
1171 | ret = qla24xx_write_flash_dword(ha, | 1184 | ret = qla24xx_write_flash_dword(ha, |
1172 | nvram_data_to_access_addr(naddr), | 1185 | nvram_data_addr(ha, naddr), cpu_to_le32(*dwptr)); |
1173 | cpu_to_le32(*dwptr)); | ||
1174 | if (ret != QLA_SUCCESS) { | 1186 | if (ret != QLA_SUCCESS) { |
1175 | DEBUG9(qla_printk("Unable to program nvram address=%x " | 1187 | DEBUG9(qla_printk("Unable to program nvram address=%x " |
1176 | "data=%x.\n", naddr, *dwptr)); | 1188 | "data=%x.\n", naddr, *dwptr)); |
@@ -1179,8 +1191,7 @@ qla24xx_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, | |||
1179 | } | 1191 | } |
1180 | 1192 | ||
1181 | /* Enable NVRAM write-protection. */ | 1193 | /* Enable NVRAM write-protection. */ |
1182 | qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101), | 1194 | qla24xx_write_flash_dword(ha, nvram_conf_addr(ha, 0x101), 0x8c); |
1183 | 0x8c); | ||
1184 | 1195 | ||
1185 | /* Disable flash write. */ | 1196 | /* Disable flash write. */ |
1186 | WRT_REG_DWORD(®->ctrl_status, | 1197 | WRT_REG_DWORD(®->ctrl_status, |
@@ -1202,8 +1213,7 @@ qla25xx_read_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr, | |||
1202 | dwptr = (uint32_t *)buf; | 1213 | dwptr = (uint32_t *)buf; |
1203 | for (i = 0; i < bytes >> 2; i++, naddr++) | 1214 | for (i = 0; i < bytes >> 2; i++, naddr++) |
1204 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, | 1215 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, |
1205 | flash_data_to_access_addr(ha->flt_region_vpd_nvram | | 1216 | flash_data_addr(ha, ha->flt_region_vpd_nvram | naddr))); |
1206 | naddr))); | ||
1207 | 1217 | ||
1208 | return buf; | 1218 | return buf; |
1209 | } | 1219 | } |
@@ -2246,12 +2256,12 @@ qla25xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, | |||
2246 | burst = left; | 2256 | burst = left; |
2247 | 2257 | ||
2248 | rval = qla2x00_dump_ram(vha, optrom_dma, | 2258 | rval = qla2x00_dump_ram(vha, optrom_dma, |
2249 | flash_data_to_access_addr(faddr), burst); | 2259 | flash_data_addr(ha, faddr), burst); |
2250 | if (rval) { | 2260 | if (rval) { |
2251 | qla_printk(KERN_WARNING, ha, | 2261 | qla_printk(KERN_WARNING, ha, |
2252 | "Unable to burst-read optrom segment " | 2262 | "Unable to burst-read optrom segment " |
2253 | "(%x/%x/%llx).\n", rval, | 2263 | "(%x/%x/%llx).\n", rval, |
2254 | flash_data_to_access_addr(faddr), | 2264 | flash_data_addr(ha, faddr), |
2255 | (unsigned long long)optrom_dma); | 2265 | (unsigned long long)optrom_dma); |
2256 | qla_printk(KERN_WARNING, ha, | 2266 | qla_printk(KERN_WARNING, ha, |
2257 | "Reverting to slow-read.\n"); | 2267 | "Reverting to slow-read.\n"); |
@@ -2648,108 +2658,3 @@ qla2xxx_get_vpd_field(scsi_qla_host_t *vha, char *key, char *str, size_t size) | |||
2648 | 2658 | ||
2649 | return 0; | 2659 | return 0; |
2650 | } | 2660 | } |
2651 | |||
2652 | static int | ||
2653 | qla2xxx_hw_event_store(scsi_qla_host_t *vha, uint32_t *fdata) | ||
2654 | { | ||
2655 | uint32_t d[2], faddr; | ||
2656 | struct qla_hw_data *ha = vha->hw; | ||
2657 | |||
2658 | /* Locate first empty entry. */ | ||
2659 | for (;;) { | ||
2660 | if (ha->hw_event_ptr >= | ||
2661 | ha->flt_region_hw_event + FA_HW_EVENT_SIZE) { | ||
2662 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
2663 | "HW event -- Log Full!\n")); | ||
2664 | return QLA_MEMORY_ALLOC_FAILED; | ||
2665 | } | ||
2666 | |||
2667 | qla24xx_read_flash_data(vha, d, ha->hw_event_ptr, 2); | ||
2668 | faddr = flash_data_to_access_addr(ha->hw_event_ptr); | ||
2669 | ha->hw_event_ptr += FA_HW_EVENT_ENTRY_SIZE; | ||
2670 | if (d[0] == __constant_cpu_to_le32(0xffffffff) && | ||
2671 | d[1] == __constant_cpu_to_le32(0xffffffff)) { | ||
2672 | qla24xx_unprotect_flash(ha); | ||
2673 | |||
2674 | qla24xx_write_flash_dword(ha, faddr++, | ||
2675 | cpu_to_le32(jiffies)); | ||
2676 | qla24xx_write_flash_dword(ha, faddr++, 0); | ||
2677 | qla24xx_write_flash_dword(ha, faddr++, *fdata++); | ||
2678 | qla24xx_write_flash_dword(ha, faddr++, *fdata); | ||
2679 | |||
2680 | qla24xx_protect_flash(ha); | ||
2681 | break; | ||
2682 | } | ||
2683 | } | ||
2684 | return QLA_SUCCESS; | ||
2685 | } | ||
2686 | |||
2687 | int | ||
2688 | qla2xxx_hw_event_log(scsi_qla_host_t *vha, uint16_t code, uint16_t d1, | ||
2689 | uint16_t d2, uint16_t d3) | ||
2690 | { | ||
2691 | #define QMARK(a, b, c, d) \ | ||
2692 | cpu_to_le32(LSB(a) << 24 | LSB(b) << 16 | LSB(c) << 8 | LSB(d)) | ||
2693 | struct qla_hw_data *ha = vha->hw; | ||
2694 | int rval; | ||
2695 | uint32_t marker[2], fdata[4]; | ||
2696 | |||
2697 | if (ha->flt_region_hw_event == 0) | ||
2698 | return QLA_FUNCTION_FAILED; | ||
2699 | |||
2700 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
2701 | "HW event -- code=%x, d1=%x, d2=%x, d3=%x.\n", code, d1, d2, d3)); | ||
2702 | |||
2703 | /* If marker not already found, locate or write. */ | ||
2704 | if (!ha->flags.hw_event_marker_found) { | ||
2705 | /* Create marker. */ | ||
2706 | marker[0] = QMARK('L', ha->fw_major_version, | ||
2707 | ha->fw_minor_version, ha->fw_subminor_version); | ||
2708 | marker[1] = QMARK(QLA_DRIVER_MAJOR_VER, QLA_DRIVER_MINOR_VER, | ||
2709 | QLA_DRIVER_PATCH_VER, QLA_DRIVER_BETA_VER); | ||
2710 | |||
2711 | /* Locate marker. */ | ||
2712 | ha->hw_event_ptr = ha->flt_region_hw_event; | ||
2713 | for (;;) { | ||
2714 | qla24xx_read_flash_data(vha, fdata, ha->hw_event_ptr, | ||
2715 | 4); | ||
2716 | if (fdata[0] == __constant_cpu_to_le32(0xffffffff) && | ||
2717 | fdata[1] == __constant_cpu_to_le32(0xffffffff)) | ||
2718 | break; | ||
2719 | ha->hw_event_ptr += FA_HW_EVENT_ENTRY_SIZE; | ||
2720 | if (ha->hw_event_ptr >= | ||
2721 | ha->flt_region_hw_event + FA_HW_EVENT_SIZE) { | ||
2722 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
2723 | "HW event -- Log Full!\n")); | ||
2724 | return QLA_MEMORY_ALLOC_FAILED; | ||
2725 | } | ||
2726 | if (fdata[2] == marker[0] && fdata[3] == marker[1]) { | ||
2727 | ha->flags.hw_event_marker_found = 1; | ||
2728 | break; | ||
2729 | } | ||
2730 | } | ||
2731 | /* No marker, write it. */ | ||
2732 | if (!ha->flags.hw_event_marker_found) { | ||
2733 | rval = qla2xxx_hw_event_store(vha, marker); | ||
2734 | if (rval != QLA_SUCCESS) { | ||
2735 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
2736 | "HW event -- Failed marker write=%x.!\n", | ||
2737 | rval)); | ||
2738 | return rval; | ||
2739 | } | ||
2740 | ha->flags.hw_event_marker_found = 1; | ||
2741 | } | ||
2742 | } | ||
2743 | |||
2744 | /* Store error. */ | ||
2745 | fdata[0] = cpu_to_le32(code << 16 | d1); | ||
2746 | fdata[1] = cpu_to_le32(d2 << 16 | d3); | ||
2747 | rval = qla2xxx_hw_event_store(vha, fdata); | ||
2748 | if (rval != QLA_SUCCESS) { | ||
2749 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
2750 | "HW event -- Failed error write=%x.!\n", | ||
2751 | rval)); | ||
2752 | } | ||
2753 | |||
2754 | return rval; | ||
2755 | } | ||
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index be22f3a09f8d..808bab6ef06b 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
@@ -7,9 +7,9 @@ | |||
7 | /* | 7 | /* |
8 | * Driver version | 8 | * Driver version |
9 | */ | 9 | */ |
10 | #define QLA2XXX_VERSION "8.02.03-k1" | 10 | #define QLA2XXX_VERSION "8.03.00-k1" |
11 | 11 | ||
12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
13 | #define QLA_DRIVER_MINOR_VER 2 | 13 | #define QLA_DRIVER_MINOR_VER 3 |
14 | #define QLA_DRIVER_PATCH_VER 3 | 14 | #define QLA_DRIVER_PATCH_VER 0 |
15 | #define QLA_DRIVER_BETA_VER 0 | 15 | #define QLA_DRIVER_BETA_VER 0 |