diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_os.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 380 |
1 files changed, 247 insertions, 133 deletions
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 92376f9dfdd5..c488996cb958 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -265,6 +265,8 @@ qla24xx_pci_info_str(struct scsi_qla_host *ha, char *str) | |||
265 | strcpy(str, "PCIe ("); | 265 | strcpy(str, "PCIe ("); |
266 | if (lspeed == 1) | 266 | if (lspeed == 1) |
267 | strcat(str, "2.5Gb/s "); | 267 | strcat(str, "2.5Gb/s "); |
268 | else if (lspeed == 2) | ||
269 | strcat(str, "5.0Gb/s "); | ||
268 | else | 270 | else |
269 | strcat(str, "<unknown> "); | 271 | strcat(str, "<unknown> "); |
270 | snprintf(lwstr, sizeof(lwstr), "x%d)", lwidth); | 272 | snprintf(lwstr, sizeof(lwstr), "x%d)", lwidth); |
@@ -343,6 +345,12 @@ qla24xx_fw_version_str(struct scsi_qla_host *ha, char *str) | |||
343 | strcat(str, "[IP] "); | 345 | strcat(str, "[IP] "); |
344 | if (ha->fw_attributes & BIT_2) | 346 | if (ha->fw_attributes & BIT_2) |
345 | strcat(str, "[Multi-ID] "); | 347 | strcat(str, "[Multi-ID] "); |
348 | if (ha->fw_attributes & BIT_3) | ||
349 | strcat(str, "[SB-2] "); | ||
350 | if (ha->fw_attributes & BIT_4) | ||
351 | strcat(str, "[T10 CRC] "); | ||
352 | if (ha->fw_attributes & BIT_5) | ||
353 | strcat(str, "[VI] "); | ||
346 | if (ha->fw_attributes & BIT_13) | 354 | if (ha->fw_attributes & BIT_13) |
347 | strcat(str, "[Experimental]"); | 355 | strcat(str, "[Experimental]"); |
348 | return str; | 356 | return str; |
@@ -681,7 +689,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) | |||
681 | DEBUG3(qla2x00_print_scsi_cmd(cmd)); | 689 | DEBUG3(qla2x00_print_scsi_cmd(cmd)); |
682 | 690 | ||
683 | spin_unlock_irqrestore(&pha->hardware_lock, flags); | 691 | spin_unlock_irqrestore(&pha->hardware_lock, flags); |
684 | if (ha->isp_ops.abort_command(ha, sp)) { | 692 | if (ha->isp_ops->abort_command(ha, sp)) { |
685 | DEBUG2(printk("%s(%ld): abort_command " | 693 | DEBUG2(printk("%s(%ld): abort_command " |
686 | "mbx failed.\n", __func__, ha->host_no)); | 694 | "mbx failed.\n", __func__, ha->host_no)); |
687 | } else { | 695 | } else { |
@@ -813,7 +821,7 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd) | |||
813 | #if defined(LOGOUT_AFTER_DEVICE_RESET) | 821 | #if defined(LOGOUT_AFTER_DEVICE_RESET) |
814 | if (ret == SUCCESS) { | 822 | if (ret == SUCCESS) { |
815 | if (fcport->flags & FC_FABRIC_DEVICE) { | 823 | if (fcport->flags & FC_FABRIC_DEVICE) { |
816 | ha->isp_ops.fabric_logout(ha, fcport->loop_id); | 824 | ha->isp_ops->fabric_logout(ha, fcport->loop_id); |
817 | qla2x00_mark_device_lost(ha, fcport, 0, 0); | 825 | qla2x00_mark_device_lost(ha, fcport, 0, 0); |
818 | } | 826 | } |
819 | } | 827 | } |
@@ -1105,7 +1113,7 @@ static int | |||
1105 | qla2x00_device_reset(scsi_qla_host_t *ha, fc_port_t *reset_fcport) | 1113 | qla2x00_device_reset(scsi_qla_host_t *ha, fc_port_t *reset_fcport) |
1106 | { | 1114 | { |
1107 | /* Abort Target command will clear Reservation */ | 1115 | /* Abort Target command will clear Reservation */ |
1108 | return ha->isp_ops.abort_target(reset_fcport); | 1116 | return ha->isp_ops->abort_target(reset_fcport); |
1109 | } | 1117 | } |
1110 | 1118 | ||
1111 | static int | 1119 | static int |
@@ -1184,8 +1192,8 @@ qla2x00_config_dma_addressing(scsi_qla_host_t *ha) | |||
1184 | !pci_set_consistent_dma_mask(ha->pdev, DMA_64BIT_MASK)) { | 1192 | !pci_set_consistent_dma_mask(ha->pdev, DMA_64BIT_MASK)) { |
1185 | /* Ok, a 64bit DMA mask is applicable. */ | 1193 | /* Ok, a 64bit DMA mask is applicable. */ |
1186 | ha->flags.enable_64bit_addressing = 1; | 1194 | ha->flags.enable_64bit_addressing = 1; |
1187 | ha->isp_ops.calc_req_entries = qla2x00_calc_iocbs_64; | 1195 | ha->isp_ops->calc_req_entries = qla2x00_calc_iocbs_64; |
1188 | ha->isp_ops.build_iocbs = qla2x00_build_scsi_iocbs_64; | 1196 | ha->isp_ops->build_iocbs = qla2x00_build_scsi_iocbs_64; |
1189 | return; | 1197 | return; |
1190 | } | 1198 | } |
1191 | } | 1199 | } |
@@ -1194,6 +1202,193 @@ qla2x00_config_dma_addressing(scsi_qla_host_t *ha) | |||
1194 | pci_set_consistent_dma_mask(ha->pdev, DMA_32BIT_MASK); | 1202 | pci_set_consistent_dma_mask(ha->pdev, DMA_32BIT_MASK); |
1195 | } | 1203 | } |
1196 | 1204 | ||
1205 | static void | ||
1206 | qla2x00_enable_intrs(scsi_qla_host_t *ha) | ||
1207 | { | ||
1208 | unsigned long flags = 0; | ||
1209 | struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; | ||
1210 | |||
1211 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1212 | ha->interrupts_on = 1; | ||
1213 | /* enable risc and host interrupts */ | ||
1214 | WRT_REG_WORD(®->ictrl, ICR_EN_INT | ICR_EN_RISC); | ||
1215 | RD_REG_WORD(®->ictrl); | ||
1216 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
1217 | |||
1218 | } | ||
1219 | |||
1220 | static void | ||
1221 | qla2x00_disable_intrs(scsi_qla_host_t *ha) | ||
1222 | { | ||
1223 | unsigned long flags = 0; | ||
1224 | struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; | ||
1225 | |||
1226 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1227 | ha->interrupts_on = 0; | ||
1228 | /* disable risc and host interrupts */ | ||
1229 | WRT_REG_WORD(®->ictrl, 0); | ||
1230 | RD_REG_WORD(®->ictrl); | ||
1231 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
1232 | } | ||
1233 | |||
1234 | static void | ||
1235 | qla24xx_enable_intrs(scsi_qla_host_t *ha) | ||
1236 | { | ||
1237 | unsigned long flags = 0; | ||
1238 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | ||
1239 | |||
1240 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1241 | ha->interrupts_on = 1; | ||
1242 | WRT_REG_DWORD(®->ictrl, ICRX_EN_RISC_INT); | ||
1243 | RD_REG_DWORD(®->ictrl); | ||
1244 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
1245 | } | ||
1246 | |||
1247 | static void | ||
1248 | qla24xx_disable_intrs(scsi_qla_host_t *ha) | ||
1249 | { | ||
1250 | unsigned long flags = 0; | ||
1251 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | ||
1252 | |||
1253 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1254 | ha->interrupts_on = 0; | ||
1255 | WRT_REG_DWORD(®->ictrl, 0); | ||
1256 | RD_REG_DWORD(®->ictrl); | ||
1257 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
1258 | } | ||
1259 | |||
1260 | static struct isp_operations qla2100_isp_ops = { | ||
1261 | .pci_config = qla2100_pci_config, | ||
1262 | .reset_chip = qla2x00_reset_chip, | ||
1263 | .chip_diag = qla2x00_chip_diag, | ||
1264 | .config_rings = qla2x00_config_rings, | ||
1265 | .reset_adapter = qla2x00_reset_adapter, | ||
1266 | .nvram_config = qla2x00_nvram_config, | ||
1267 | .update_fw_options = qla2x00_update_fw_options, | ||
1268 | .load_risc = qla2x00_load_risc, | ||
1269 | .pci_info_str = qla2x00_pci_info_str, | ||
1270 | .fw_version_str = qla2x00_fw_version_str, | ||
1271 | .intr_handler = qla2100_intr_handler, | ||
1272 | .enable_intrs = qla2x00_enable_intrs, | ||
1273 | .disable_intrs = qla2x00_disable_intrs, | ||
1274 | .abort_command = qla2x00_abort_command, | ||
1275 | .abort_target = qla2x00_abort_target, | ||
1276 | .fabric_login = qla2x00_login_fabric, | ||
1277 | .fabric_logout = qla2x00_fabric_logout, | ||
1278 | .calc_req_entries = qla2x00_calc_iocbs_32, | ||
1279 | .build_iocbs = qla2x00_build_scsi_iocbs_32, | ||
1280 | .prep_ms_iocb = qla2x00_prep_ms_iocb, | ||
1281 | .prep_ms_fdmi_iocb = qla2x00_prep_ms_fdmi_iocb, | ||
1282 | .read_nvram = qla2x00_read_nvram_data, | ||
1283 | .write_nvram = qla2x00_write_nvram_data, | ||
1284 | .fw_dump = qla2100_fw_dump, | ||
1285 | .beacon_on = NULL, | ||
1286 | .beacon_off = NULL, | ||
1287 | .beacon_blink = NULL, | ||
1288 | .read_optrom = qla2x00_read_optrom_data, | ||
1289 | .write_optrom = qla2x00_write_optrom_data, | ||
1290 | .get_flash_version = qla2x00_get_flash_version, | ||
1291 | }; | ||
1292 | |||
1293 | static struct isp_operations qla2300_isp_ops = { | ||
1294 | .pci_config = qla2300_pci_config, | ||
1295 | .reset_chip = qla2x00_reset_chip, | ||
1296 | .chip_diag = qla2x00_chip_diag, | ||
1297 | .config_rings = qla2x00_config_rings, | ||
1298 | .reset_adapter = qla2x00_reset_adapter, | ||
1299 | .nvram_config = qla2x00_nvram_config, | ||
1300 | .update_fw_options = qla2x00_update_fw_options, | ||
1301 | .load_risc = qla2x00_load_risc, | ||
1302 | .pci_info_str = qla2x00_pci_info_str, | ||
1303 | .fw_version_str = qla2x00_fw_version_str, | ||
1304 | .intr_handler = qla2300_intr_handler, | ||
1305 | .enable_intrs = qla2x00_enable_intrs, | ||
1306 | .disable_intrs = qla2x00_disable_intrs, | ||
1307 | .abort_command = qla2x00_abort_command, | ||
1308 | .abort_target = qla2x00_abort_target, | ||
1309 | .fabric_login = qla2x00_login_fabric, | ||
1310 | .fabric_logout = qla2x00_fabric_logout, | ||
1311 | .calc_req_entries = qla2x00_calc_iocbs_32, | ||
1312 | .build_iocbs = qla2x00_build_scsi_iocbs_32, | ||
1313 | .prep_ms_iocb = qla2x00_prep_ms_iocb, | ||
1314 | .prep_ms_fdmi_iocb = qla2x00_prep_ms_fdmi_iocb, | ||
1315 | .read_nvram = qla2x00_read_nvram_data, | ||
1316 | .write_nvram = qla2x00_write_nvram_data, | ||
1317 | .fw_dump = qla2300_fw_dump, | ||
1318 | .beacon_on = qla2x00_beacon_on, | ||
1319 | .beacon_off = qla2x00_beacon_off, | ||
1320 | .beacon_blink = qla2x00_beacon_blink, | ||
1321 | .read_optrom = qla2x00_read_optrom_data, | ||
1322 | .write_optrom = qla2x00_write_optrom_data, | ||
1323 | .get_flash_version = qla2x00_get_flash_version, | ||
1324 | }; | ||
1325 | |||
1326 | static struct isp_operations qla24xx_isp_ops = { | ||
1327 | .pci_config = qla24xx_pci_config, | ||
1328 | .reset_chip = qla24xx_reset_chip, | ||
1329 | .chip_diag = qla24xx_chip_diag, | ||
1330 | .config_rings = qla24xx_config_rings, | ||
1331 | .reset_adapter = qla24xx_reset_adapter, | ||
1332 | .nvram_config = qla24xx_nvram_config, | ||
1333 | .update_fw_options = qla24xx_update_fw_options, | ||
1334 | .load_risc = qla24xx_load_risc, | ||
1335 | .pci_info_str = qla24xx_pci_info_str, | ||
1336 | .fw_version_str = qla24xx_fw_version_str, | ||
1337 | .intr_handler = qla24xx_intr_handler, | ||
1338 | .enable_intrs = qla24xx_enable_intrs, | ||
1339 | .disable_intrs = qla24xx_disable_intrs, | ||
1340 | .abort_command = qla24xx_abort_command, | ||
1341 | .abort_target = qla24xx_abort_target, | ||
1342 | .fabric_login = qla24xx_login_fabric, | ||
1343 | .fabric_logout = qla24xx_fabric_logout, | ||
1344 | .calc_req_entries = NULL, | ||
1345 | .build_iocbs = NULL, | ||
1346 | .prep_ms_iocb = qla24xx_prep_ms_iocb, | ||
1347 | .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb, | ||
1348 | .read_nvram = qla24xx_read_nvram_data, | ||
1349 | .write_nvram = qla24xx_write_nvram_data, | ||
1350 | .fw_dump = qla24xx_fw_dump, | ||
1351 | .beacon_on = qla24xx_beacon_on, | ||
1352 | .beacon_off = qla24xx_beacon_off, | ||
1353 | .beacon_blink = qla24xx_beacon_blink, | ||
1354 | .read_optrom = qla24xx_read_optrom_data, | ||
1355 | .write_optrom = qla24xx_write_optrom_data, | ||
1356 | .get_flash_version = qla24xx_get_flash_version, | ||
1357 | }; | ||
1358 | |||
1359 | static struct isp_operations qla25xx_isp_ops = { | ||
1360 | .pci_config = qla25xx_pci_config, | ||
1361 | .reset_chip = qla24xx_reset_chip, | ||
1362 | .chip_diag = qla24xx_chip_diag, | ||
1363 | .config_rings = qla24xx_config_rings, | ||
1364 | .reset_adapter = qla24xx_reset_adapter, | ||
1365 | .nvram_config = qla24xx_nvram_config, | ||
1366 | .update_fw_options = qla24xx_update_fw_options, | ||
1367 | .load_risc = qla24xx_load_risc, | ||
1368 | .pci_info_str = qla24xx_pci_info_str, | ||
1369 | .fw_version_str = qla24xx_fw_version_str, | ||
1370 | .intr_handler = qla24xx_intr_handler, | ||
1371 | .enable_intrs = qla24xx_enable_intrs, | ||
1372 | .disable_intrs = qla24xx_disable_intrs, | ||
1373 | .abort_command = qla24xx_abort_command, | ||
1374 | .abort_target = qla24xx_abort_target, | ||
1375 | .fabric_login = qla24xx_login_fabric, | ||
1376 | .fabric_logout = qla24xx_fabric_logout, | ||
1377 | .calc_req_entries = NULL, | ||
1378 | .build_iocbs = NULL, | ||
1379 | .prep_ms_iocb = qla24xx_prep_ms_iocb, | ||
1380 | .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb, | ||
1381 | .read_nvram = qla25xx_read_nvram_data, | ||
1382 | .write_nvram = qla25xx_write_nvram_data, | ||
1383 | .fw_dump = qla25xx_fw_dump, | ||
1384 | .beacon_on = qla24xx_beacon_on, | ||
1385 | .beacon_off = qla24xx_beacon_off, | ||
1386 | .beacon_blink = qla24xx_beacon_blink, | ||
1387 | .read_optrom = qla24xx_read_optrom_data, | ||
1388 | .write_optrom = qla24xx_write_optrom_data, | ||
1389 | .get_flash_version = qla24xx_get_flash_version, | ||
1390 | }; | ||
1391 | |||
1197 | static inline void | 1392 | static inline void |
1198 | qla2x00_set_isp_flags(scsi_qla_host_t *ha) | 1393 | qla2x00_set_isp_flags(scsi_qla_host_t *ha) |
1199 | { | 1394 | { |
@@ -1238,19 +1433,32 @@ qla2x00_set_isp_flags(scsi_qla_host_t *ha) | |||
1238 | case PCI_DEVICE_ID_QLOGIC_ISP2422: | 1433 | case PCI_DEVICE_ID_QLOGIC_ISP2422: |
1239 | ha->device_type |= DT_ISP2422; | 1434 | ha->device_type |= DT_ISP2422; |
1240 | ha->device_type |= DT_ZIO_SUPPORTED; | 1435 | ha->device_type |= DT_ZIO_SUPPORTED; |
1436 | ha->device_type |= DT_FWI2; | ||
1437 | ha->device_type |= DT_IIDMA; | ||
1241 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | 1438 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; |
1242 | break; | 1439 | break; |
1243 | case PCI_DEVICE_ID_QLOGIC_ISP2432: | 1440 | case PCI_DEVICE_ID_QLOGIC_ISP2432: |
1244 | ha->device_type |= DT_ISP2432; | 1441 | ha->device_type |= DT_ISP2432; |
1245 | ha->device_type |= DT_ZIO_SUPPORTED; | 1442 | ha->device_type |= DT_ZIO_SUPPORTED; |
1443 | ha->device_type |= DT_FWI2; | ||
1444 | ha->device_type |= DT_IIDMA; | ||
1246 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | 1445 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; |
1247 | break; | 1446 | break; |
1248 | case PCI_DEVICE_ID_QLOGIC_ISP5422: | 1447 | case PCI_DEVICE_ID_QLOGIC_ISP5422: |
1249 | ha->device_type |= DT_ISP5422; | 1448 | ha->device_type |= DT_ISP5422; |
1449 | ha->device_type |= DT_FWI2; | ||
1250 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | 1450 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; |
1251 | break; | 1451 | break; |
1252 | case PCI_DEVICE_ID_QLOGIC_ISP5432: | 1452 | case PCI_DEVICE_ID_QLOGIC_ISP5432: |
1253 | ha->device_type |= DT_ISP5432; | 1453 | ha->device_type |= DT_ISP5432; |
1454 | ha->device_type |= DT_FWI2; | ||
1455 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | ||
1456 | break; | ||
1457 | case PCI_DEVICE_ID_QLOGIC_ISP2532: | ||
1458 | ha->device_type |= DT_ISP2532; | ||
1459 | ha->device_type |= DT_ZIO_SUPPORTED; | ||
1460 | ha->device_type |= DT_FWI2; | ||
1461 | ha->device_type |= DT_IIDMA; | ||
1254 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | 1462 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; |
1255 | break; | 1463 | break; |
1256 | } | 1464 | } |
@@ -1323,61 +1531,6 @@ iospace_error_exit: | |||
1323 | } | 1531 | } |
1324 | 1532 | ||
1325 | static void | 1533 | static void |
1326 | qla2x00_enable_intrs(scsi_qla_host_t *ha) | ||
1327 | { | ||
1328 | unsigned long flags = 0; | ||
1329 | struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; | ||
1330 | |||
1331 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1332 | ha->interrupts_on = 1; | ||
1333 | /* enable risc and host interrupts */ | ||
1334 | WRT_REG_WORD(®->ictrl, ICR_EN_INT | ICR_EN_RISC); | ||
1335 | RD_REG_WORD(®->ictrl); | ||
1336 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
1337 | |||
1338 | } | ||
1339 | |||
1340 | static void | ||
1341 | qla2x00_disable_intrs(scsi_qla_host_t *ha) | ||
1342 | { | ||
1343 | unsigned long flags = 0; | ||
1344 | struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; | ||
1345 | |||
1346 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1347 | ha->interrupts_on = 0; | ||
1348 | /* disable risc and host interrupts */ | ||
1349 | WRT_REG_WORD(®->ictrl, 0); | ||
1350 | RD_REG_WORD(®->ictrl); | ||
1351 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
1352 | } | ||
1353 | |||
1354 | static void | ||
1355 | qla24xx_enable_intrs(scsi_qla_host_t *ha) | ||
1356 | { | ||
1357 | unsigned long flags = 0; | ||
1358 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | ||
1359 | |||
1360 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1361 | ha->interrupts_on = 1; | ||
1362 | WRT_REG_DWORD(®->ictrl, ICRX_EN_RISC_INT); | ||
1363 | RD_REG_DWORD(®->ictrl); | ||
1364 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
1365 | } | ||
1366 | |||
1367 | static void | ||
1368 | qla24xx_disable_intrs(scsi_qla_host_t *ha) | ||
1369 | { | ||
1370 | unsigned long flags = 0; | ||
1371 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | ||
1372 | |||
1373 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1374 | ha->interrupts_on = 0; | ||
1375 | WRT_REG_DWORD(®->ictrl, 0); | ||
1376 | RD_REG_DWORD(®->ictrl); | ||
1377 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
1378 | } | ||
1379 | |||
1380 | static void | ||
1381 | qla2xxx_scan_start(struct Scsi_Host *shost) | 1534 | qla2xxx_scan_start(struct Scsi_Host *shost) |
1382 | { | 1535 | { |
1383 | scsi_qla_host_t *ha = (scsi_qla_host_t *)shost->hostdata; | 1536 | scsi_qla_host_t *ha = (scsi_qla_host_t *)shost->hostdata; |
@@ -1422,7 +1575,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1422 | if (pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422 || | 1575 | if (pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422 || |
1423 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432 || | 1576 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432 || |
1424 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5422 || | 1577 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5422 || |
1425 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432) | 1578 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 || |
1579 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532) | ||
1426 | sht = &qla24xx_driver_template; | 1580 | sht = &qla24xx_driver_template; |
1427 | host = scsi_host_alloc(sht, sizeof(scsi_qla_host_t)); | 1581 | host = scsi_host_alloc(sht, sizeof(scsi_qla_host_t)); |
1428 | if (host == NULL) { | 1582 | if (host == NULL) { |
@@ -1466,33 +1620,6 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1466 | ha->max_q_depth = ql2xmaxqdepth; | 1620 | ha->max_q_depth = ql2xmaxqdepth; |
1467 | 1621 | ||
1468 | /* Assign ISP specific operations. */ | 1622 | /* Assign ISP specific operations. */ |
1469 | ha->isp_ops.pci_config = qla2100_pci_config; | ||
1470 | ha->isp_ops.reset_chip = qla2x00_reset_chip; | ||
1471 | ha->isp_ops.chip_diag = qla2x00_chip_diag; | ||
1472 | ha->isp_ops.config_rings = qla2x00_config_rings; | ||
1473 | ha->isp_ops.reset_adapter = qla2x00_reset_adapter; | ||
1474 | ha->isp_ops.nvram_config = qla2x00_nvram_config; | ||
1475 | ha->isp_ops.update_fw_options = qla2x00_update_fw_options; | ||
1476 | ha->isp_ops.load_risc = qla2x00_load_risc; | ||
1477 | ha->isp_ops.pci_info_str = qla2x00_pci_info_str; | ||
1478 | ha->isp_ops.fw_version_str = qla2x00_fw_version_str; | ||
1479 | ha->isp_ops.intr_handler = qla2100_intr_handler; | ||
1480 | ha->isp_ops.enable_intrs = qla2x00_enable_intrs; | ||
1481 | ha->isp_ops.disable_intrs = qla2x00_disable_intrs; | ||
1482 | ha->isp_ops.abort_command = qla2x00_abort_command; | ||
1483 | ha->isp_ops.abort_target = qla2x00_abort_target; | ||
1484 | ha->isp_ops.fabric_login = qla2x00_login_fabric; | ||
1485 | ha->isp_ops.fabric_logout = qla2x00_fabric_logout; | ||
1486 | ha->isp_ops.calc_req_entries = qla2x00_calc_iocbs_32; | ||
1487 | ha->isp_ops.build_iocbs = qla2x00_build_scsi_iocbs_32; | ||
1488 | ha->isp_ops.prep_ms_iocb = qla2x00_prep_ms_iocb; | ||
1489 | ha->isp_ops.prep_ms_fdmi_iocb = qla2x00_prep_ms_fdmi_iocb; | ||
1490 | ha->isp_ops.read_nvram = qla2x00_read_nvram_data; | ||
1491 | ha->isp_ops.write_nvram = qla2x00_write_nvram_data; | ||
1492 | ha->isp_ops.fw_dump = qla2100_fw_dump; | ||
1493 | ha->isp_ops.read_optrom = qla2x00_read_optrom_data; | ||
1494 | ha->isp_ops.write_optrom = qla2x00_write_optrom_data; | ||
1495 | ha->isp_ops.get_flash_version = qla2x00_get_flash_version; | ||
1496 | if (IS_QLA2100(ha)) { | 1623 | if (IS_QLA2100(ha)) { |
1497 | host->max_id = MAX_TARGETS_2100; | 1624 | host->max_id = MAX_TARGETS_2100; |
1498 | ha->mbx_count = MAILBOX_REGISTER_COUNT_2100; | 1625 | ha->mbx_count = MAILBOX_REGISTER_COUNT_2100; |
@@ -1501,6 +1628,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1501 | ha->last_loop_id = SNS_LAST_LOOP_ID_2100; | 1628 | ha->last_loop_id = SNS_LAST_LOOP_ID_2100; |
1502 | host->sg_tablesize = 32; | 1629 | host->sg_tablesize = 32; |
1503 | ha->gid_list_info_size = 4; | 1630 | ha->gid_list_info_size = 4; |
1631 | ha->isp_ops = &qla2100_isp_ops; | ||
1504 | } else if (IS_QLA2200(ha)) { | 1632 | } else if (IS_QLA2200(ha)) { |
1505 | host->max_id = MAX_TARGETS_2200; | 1633 | host->max_id = MAX_TARGETS_2200; |
1506 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1634 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
@@ -1508,21 +1636,17 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1508 | ha->response_q_length = RESPONSE_ENTRY_CNT_2100; | 1636 | ha->response_q_length = RESPONSE_ENTRY_CNT_2100; |
1509 | ha->last_loop_id = SNS_LAST_LOOP_ID_2100; | 1637 | ha->last_loop_id = SNS_LAST_LOOP_ID_2100; |
1510 | ha->gid_list_info_size = 4; | 1638 | ha->gid_list_info_size = 4; |
1639 | ha->isp_ops = &qla2100_isp_ops; | ||
1511 | } else if (IS_QLA23XX(ha)) { | 1640 | } else if (IS_QLA23XX(ha)) { |
1512 | host->max_id = MAX_TARGETS_2200; | 1641 | host->max_id = MAX_TARGETS_2200; |
1513 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1642 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
1514 | ha->request_q_length = REQUEST_ENTRY_CNT_2200; | 1643 | ha->request_q_length = REQUEST_ENTRY_CNT_2200; |
1515 | ha->response_q_length = RESPONSE_ENTRY_CNT_2300; | 1644 | ha->response_q_length = RESPONSE_ENTRY_CNT_2300; |
1516 | ha->last_loop_id = SNS_LAST_LOOP_ID_2300; | 1645 | ha->last_loop_id = SNS_LAST_LOOP_ID_2300; |
1517 | ha->isp_ops.pci_config = qla2300_pci_config; | ||
1518 | ha->isp_ops.intr_handler = qla2300_intr_handler; | ||
1519 | ha->isp_ops.fw_dump = qla2300_fw_dump; | ||
1520 | ha->isp_ops.beacon_on = qla2x00_beacon_on; | ||
1521 | ha->isp_ops.beacon_off = qla2x00_beacon_off; | ||
1522 | ha->isp_ops.beacon_blink = qla2x00_beacon_blink; | ||
1523 | ha->gid_list_info_size = 6; | 1646 | ha->gid_list_info_size = 6; |
1524 | if (IS_QLA2322(ha) || IS_QLA6322(ha)) | 1647 | if (IS_QLA2322(ha) || IS_QLA6322(ha)) |
1525 | ha->optrom_size = OPTROM_SIZE_2322; | 1648 | ha->optrom_size = OPTROM_SIZE_2322; |
1649 | ha->isp_ops = &qla2300_isp_ops; | ||
1526 | } else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { | 1650 | } else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { |
1527 | host->max_id = MAX_TARGETS_2200; | 1651 | host->max_id = MAX_TARGETS_2200; |
1528 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1652 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
@@ -1531,36 +1655,20 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1531 | ha->last_loop_id = SNS_LAST_LOOP_ID_2300; | 1655 | ha->last_loop_id = SNS_LAST_LOOP_ID_2300; |
1532 | ha->init_cb_size = sizeof(struct mid_init_cb_24xx); | 1656 | ha->init_cb_size = sizeof(struct mid_init_cb_24xx); |
1533 | ha->mgmt_svr_loop_id = 10 + ha->vp_idx; | 1657 | ha->mgmt_svr_loop_id = 10 + ha->vp_idx; |
1534 | ha->isp_ops.pci_config = qla24xx_pci_config; | ||
1535 | ha->isp_ops.reset_chip = qla24xx_reset_chip; | ||
1536 | ha->isp_ops.chip_diag = qla24xx_chip_diag; | ||
1537 | ha->isp_ops.config_rings = qla24xx_config_rings; | ||
1538 | ha->isp_ops.reset_adapter = qla24xx_reset_adapter; | ||
1539 | ha->isp_ops.nvram_config = qla24xx_nvram_config; | ||
1540 | ha->isp_ops.update_fw_options = qla24xx_update_fw_options; | ||
1541 | ha->isp_ops.load_risc = qla24xx_load_risc; | ||
1542 | ha->isp_ops.pci_info_str = qla24xx_pci_info_str; | ||
1543 | ha->isp_ops.fw_version_str = qla24xx_fw_version_str; | ||
1544 | ha->isp_ops.intr_handler = qla24xx_intr_handler; | ||
1545 | ha->isp_ops.enable_intrs = qla24xx_enable_intrs; | ||
1546 | ha->isp_ops.disable_intrs = qla24xx_disable_intrs; | ||
1547 | ha->isp_ops.abort_command = qla24xx_abort_command; | ||
1548 | ha->isp_ops.abort_target = qla24xx_abort_target; | ||
1549 | ha->isp_ops.fabric_login = qla24xx_login_fabric; | ||
1550 | ha->isp_ops.fabric_logout = qla24xx_fabric_logout; | ||
1551 | ha->isp_ops.prep_ms_iocb = qla24xx_prep_ms_iocb; | ||
1552 | ha->isp_ops.prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb; | ||
1553 | ha->isp_ops.read_nvram = qla24xx_read_nvram_data; | ||
1554 | ha->isp_ops.write_nvram = qla24xx_write_nvram_data; | ||
1555 | ha->isp_ops.fw_dump = qla24xx_fw_dump; | ||
1556 | ha->isp_ops.read_optrom = qla24xx_read_optrom_data; | ||
1557 | ha->isp_ops.write_optrom = qla24xx_write_optrom_data; | ||
1558 | ha->isp_ops.beacon_on = qla24xx_beacon_on; | ||
1559 | ha->isp_ops.beacon_off = qla24xx_beacon_off; | ||
1560 | ha->isp_ops.beacon_blink = qla24xx_beacon_blink; | ||
1561 | ha->isp_ops.get_flash_version = qla24xx_get_flash_version; | ||
1562 | ha->gid_list_info_size = 8; | 1658 | ha->gid_list_info_size = 8; |
1563 | ha->optrom_size = OPTROM_SIZE_24XX; | 1659 | ha->optrom_size = OPTROM_SIZE_24XX; |
1660 | ha->isp_ops = &qla24xx_isp_ops; | ||
1661 | } else if (IS_QLA25XX(ha)) { | ||
1662 | host->max_id = MAX_TARGETS_2200; | ||
1663 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | ||
1664 | ha->request_q_length = REQUEST_ENTRY_CNT_24XX; | ||
1665 | ha->response_q_length = RESPONSE_ENTRY_CNT_2300; | ||
1666 | ha->last_loop_id = SNS_LAST_LOOP_ID_2300; | ||
1667 | ha->init_cb_size = sizeof(struct mid_init_cb_24xx); | ||
1668 | ha->mgmt_svr_loop_id = 10 + ha->vp_idx; | ||
1669 | ha->gid_list_info_size = 8; | ||
1670 | ha->optrom_size = OPTROM_SIZE_25XX; | ||
1671 | ha->isp_ops = &qla25xx_isp_ops; | ||
1564 | } | 1672 | } |
1565 | host->can_queue = ha->request_q_length + 128; | 1673 | host->can_queue = ha->request_q_length + 128; |
1566 | 1674 | ||
@@ -1628,11 +1736,11 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1628 | DEBUG2(printk("DEBUG: detect hba %ld at address = %p\n", | 1736 | DEBUG2(printk("DEBUG: detect hba %ld at address = %p\n", |
1629 | ha->host_no, ha)); | 1737 | ha->host_no, ha)); |
1630 | 1738 | ||
1631 | ha->isp_ops.disable_intrs(ha); | 1739 | ha->isp_ops->disable_intrs(ha); |
1632 | 1740 | ||
1633 | spin_lock_irqsave(&ha->hardware_lock, flags); | 1741 | spin_lock_irqsave(&ha->hardware_lock, flags); |
1634 | reg = ha->iobase; | 1742 | reg = ha->iobase; |
1635 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { | 1743 | if (IS_FWI2_CAPABLE(ha)) { |
1636 | WRT_REG_DWORD(®->isp24.hccr, HCCRX_CLR_HOST_INT); | 1744 | WRT_REG_DWORD(®->isp24.hccr, HCCRX_CLR_HOST_INT); |
1637 | WRT_REG_DWORD(®->isp24.hccr, HCCRX_CLR_RISC_INT); | 1745 | WRT_REG_DWORD(®->isp24.hccr, HCCRX_CLR_RISC_INT); |
1638 | } else { | 1746 | } else { |
@@ -1654,7 +1762,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1654 | } | 1762 | } |
1655 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1763 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1656 | 1764 | ||
1657 | ha->isp_ops.enable_intrs(ha); | 1765 | ha->isp_ops->enable_intrs(ha); |
1658 | 1766 | ||
1659 | pci_set_drvdata(pdev, ha); | 1767 | pci_set_drvdata(pdev, ha); |
1660 | 1768 | ||
@@ -1679,9 +1787,9 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1679 | " ISP%04X: %s @ %s hdma%c, host#=%ld, fw=%s\n", | 1787 | " ISP%04X: %s @ %s hdma%c, host#=%ld, fw=%s\n", |
1680 | qla2x00_version_str, ha->model_number, | 1788 | qla2x00_version_str, ha->model_number, |
1681 | ha->model_desc ? ha->model_desc: "", pdev->device, | 1789 | ha->model_desc ? ha->model_desc: "", pdev->device, |
1682 | ha->isp_ops.pci_info_str(ha, pci_info), pci_name(pdev), | 1790 | ha->isp_ops->pci_info_str(ha, pci_info), pci_name(pdev), |
1683 | ha->flags.enable_64bit_addressing ? '+': '-', ha->host_no, | 1791 | ha->flags.enable_64bit_addressing ? '+': '-', ha->host_no, |
1684 | ha->isp_ops.fw_version_str(ha, fw_str)); | 1792 | ha->isp_ops->fw_version_str(ha, fw_str)); |
1685 | 1793 | ||
1686 | return 0; | 1794 | return 0; |
1687 | 1795 | ||
@@ -1747,7 +1855,7 @@ qla2x00_free_device(scsi_qla_host_t *ha) | |||
1747 | 1855 | ||
1748 | /* turn-off interrupts on the card */ | 1856 | /* turn-off interrupts on the card */ |
1749 | if (ha->interrupts_on) | 1857 | if (ha->interrupts_on) |
1750 | ha->isp_ops.disable_intrs(ha); | 1858 | ha->isp_ops->disable_intrs(ha); |
1751 | 1859 | ||
1752 | qla2x00_mem_free(ha); | 1860 | qla2x00_mem_free(ha); |
1753 | 1861 | ||
@@ -2025,7 +2133,7 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) | |||
2025 | } | 2133 | } |
2026 | memset(ha->ct_sns, 0, sizeof(struct ct_sns_pkt)); | 2134 | memset(ha->ct_sns, 0, sizeof(struct ct_sns_pkt)); |
2027 | 2135 | ||
2028 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { | 2136 | if (IS_FWI2_CAPABLE(ha)) { |
2029 | /* | 2137 | /* |
2030 | * Get consistent memory allocated for SFP | 2138 | * Get consistent memory allocated for SFP |
2031 | * block. | 2139 | * block. |
@@ -2305,7 +2413,7 @@ qla2x00_do_dpc(void *data) | |||
2305 | if (fcport->flags & FCF_FABRIC_DEVICE) { | 2413 | if (fcport->flags & FCF_FABRIC_DEVICE) { |
2306 | if (fcport->flags & | 2414 | if (fcport->flags & |
2307 | FCF_TAPE_PRESENT) | 2415 | FCF_TAPE_PRESENT) |
2308 | ha->isp_ops.fabric_logout( | 2416 | ha->isp_ops->fabric_logout( |
2309 | ha, fcport->loop_id, | 2417 | ha, fcport->loop_id, |
2310 | fcport->d_id.b.domain, | 2418 | fcport->d_id.b.domain, |
2311 | fcport->d_id.b.area, | 2419 | fcport->d_id.b.area, |
@@ -2385,10 +2493,10 @@ qla2x00_do_dpc(void *data) | |||
2385 | } | 2493 | } |
2386 | 2494 | ||
2387 | if (!ha->interrupts_on) | 2495 | if (!ha->interrupts_on) |
2388 | ha->isp_ops.enable_intrs(ha); | 2496 | ha->isp_ops->enable_intrs(ha); |
2389 | 2497 | ||
2390 | if (test_and_clear_bit(BEACON_BLINK_NEEDED, &ha->dpc_flags)) | 2498 | if (test_and_clear_bit(BEACON_BLINK_NEEDED, &ha->dpc_flags)) |
2391 | ha->isp_ops.beacon_blink(ha); | 2499 | ha->isp_ops->beacon_blink(ha); |
2392 | 2500 | ||
2393 | qla2x00_do_dpc_all_vps(ha); | 2501 | qla2x00_do_dpc_all_vps(ha); |
2394 | 2502 | ||
@@ -2617,18 +2725,20 @@ qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout) | |||
2617 | 2725 | ||
2618 | /* Firmware interface routines. */ | 2726 | /* Firmware interface routines. */ |
2619 | 2727 | ||
2620 | #define FW_BLOBS 5 | 2728 | #define FW_BLOBS 6 |
2621 | #define FW_ISP21XX 0 | 2729 | #define FW_ISP21XX 0 |
2622 | #define FW_ISP22XX 1 | 2730 | #define FW_ISP22XX 1 |
2623 | #define FW_ISP2300 2 | 2731 | #define FW_ISP2300 2 |
2624 | #define FW_ISP2322 3 | 2732 | #define FW_ISP2322 3 |
2625 | #define FW_ISP24XX 4 | 2733 | #define FW_ISP24XX 4 |
2734 | #define FW_ISP25XX 5 | ||
2626 | 2735 | ||
2627 | #define FW_FILE_ISP21XX "ql2100_fw.bin" | 2736 | #define FW_FILE_ISP21XX "ql2100_fw.bin" |
2628 | #define FW_FILE_ISP22XX "ql2200_fw.bin" | 2737 | #define FW_FILE_ISP22XX "ql2200_fw.bin" |
2629 | #define FW_FILE_ISP2300 "ql2300_fw.bin" | 2738 | #define FW_FILE_ISP2300 "ql2300_fw.bin" |
2630 | #define FW_FILE_ISP2322 "ql2322_fw.bin" | 2739 | #define FW_FILE_ISP2322 "ql2322_fw.bin" |
2631 | #define FW_FILE_ISP24XX "ql2400_fw.bin" | 2740 | #define FW_FILE_ISP24XX "ql2400_fw.bin" |
2741 | #define FW_FILE_ISP25XX "ql2500_fw.bin" | ||
2632 | 2742 | ||
2633 | static DECLARE_MUTEX(qla_fw_lock); | 2743 | static DECLARE_MUTEX(qla_fw_lock); |
2634 | 2744 | ||
@@ -2638,6 +2748,7 @@ static struct fw_blob qla_fw_blobs[FW_BLOBS] = { | |||
2638 | { .name = FW_FILE_ISP2300, .segs = { 0x800, 0 }, }, | 2748 | { .name = FW_FILE_ISP2300, .segs = { 0x800, 0 }, }, |
2639 | { .name = FW_FILE_ISP2322, .segs = { 0x800, 0x1c000, 0x1e000, 0 }, }, | 2749 | { .name = FW_FILE_ISP2322, .segs = { 0x800, 0x1c000, 0x1e000, 0 }, }, |
2640 | { .name = FW_FILE_ISP24XX, }, | 2750 | { .name = FW_FILE_ISP24XX, }, |
2751 | { .name = FW_FILE_ISP25XX, }, | ||
2641 | }; | 2752 | }; |
2642 | 2753 | ||
2643 | struct fw_blob * | 2754 | struct fw_blob * |
@@ -2656,6 +2767,8 @@ qla2x00_request_firmware(scsi_qla_host_t *ha) | |||
2656 | blob = &qla_fw_blobs[FW_ISP2322]; | 2767 | blob = &qla_fw_blobs[FW_ISP2322]; |
2657 | } else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { | 2768 | } else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { |
2658 | blob = &qla_fw_blobs[FW_ISP24XX]; | 2769 | blob = &qla_fw_blobs[FW_ISP24XX]; |
2770 | } else if (IS_QLA25XX(ha)) { | ||
2771 | blob = &qla_fw_blobs[FW_ISP25XX]; | ||
2659 | } | 2772 | } |
2660 | 2773 | ||
2661 | down(&qla_fw_lock); | 2774 | down(&qla_fw_lock); |
@@ -2699,6 +2812,7 @@ static struct pci_device_id qla2xxx_pci_tbl[] = { | |||
2699 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2432) }, | 2812 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2432) }, |
2700 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, | 2813 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, |
2701 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, | 2814 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, |
2815 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) }, | ||
2702 | { 0 }, | 2816 | { 0 }, |
2703 | }; | 2817 | }; |
2704 | MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); | 2818 | MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); |