diff options
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_dbg.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_def.h | 105 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_fw.h | 7 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_glbl.h | 2 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_init.c | 45 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_inline.h | 4 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_iocb.c | 6 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_isr.c | 1 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_nvram.c | 6 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_nvram.h | 4 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_os.c | 75 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_version.h | 2 |
12 files changed, 98 insertions, 163 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_dbg.c b/drivers/scsi/qla4xxx/ql4_dbg.c index 752031fadfef..7b4e077a39c1 100644 --- a/drivers/scsi/qla4xxx/ql4_dbg.c +++ b/drivers/scsi/qla4xxx/ql4_dbg.c | |||
| @@ -71,7 +71,7 @@ void __dump_registers(struct scsi_qla_host *ha) | |||
| 71 | readw(&ha->reg->u1.isp4010.nvram)); | 71 | readw(&ha->reg->u1.isp4010.nvram)); |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | else if (is_qla4022(ha)) { | 74 | else if (is_qla4022(ha) | is_qla4032(ha)) { |
| 75 | printk(KERN_INFO "0x%02X intr_mask = 0x%08X\n", | 75 | printk(KERN_INFO "0x%02X intr_mask = 0x%08X\n", |
| 76 | (uint8_t) offsetof(struct isp_reg, | 76 | (uint8_t) offsetof(struct isp_reg, |
| 77 | u1.isp4022.intr_mask), | 77 | u1.isp4022.intr_mask), |
| @@ -119,7 +119,7 @@ void __dump_registers(struct scsi_qla_host *ha) | |||
| 119 | readw(&ha->reg->u2.isp4010.port_err_status)); | 119 | readw(&ha->reg->u2.isp4010.port_err_status)); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | else if (is_qla4022(ha)) { | 122 | else if (is_qla4022(ha) | is_qla4032(ha)) { |
| 123 | printk(KERN_INFO "Page 0 Registers:\n"); | 123 | printk(KERN_INFO "Page 0 Registers:\n"); |
| 124 | printk(KERN_INFO "0x%02X ext_hw_conf = 0x%08X\n", | 124 | printk(KERN_INFO "0x%02X ext_hw_conf = 0x%08X\n", |
| 125 | (uint8_t) offsetof(struct isp_reg, | 125 | (uint8_t) offsetof(struct isp_reg, |
diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h index a7f6c7b1c590..4249e52a5592 100644 --- a/drivers/scsi/qla4xxx/ql4_def.h +++ b/drivers/scsi/qla4xxx/ql4_def.h | |||
| @@ -40,7 +40,11 @@ | |||
| 40 | 40 | ||
| 41 | #ifndef PCI_DEVICE_ID_QLOGIC_ISP4022 | 41 | #ifndef PCI_DEVICE_ID_QLOGIC_ISP4022 |
| 42 | #define PCI_DEVICE_ID_QLOGIC_ISP4022 0x4022 | 42 | #define PCI_DEVICE_ID_QLOGIC_ISP4022 0x4022 |
| 43 | #endif /* */ | 43 | #endif |
| 44 | |||
| 45 | #ifndef PCI_DEVICE_ID_QLOGIC_ISP4032 | ||
| 46 | #define PCI_DEVICE_ID_QLOGIC_ISP4032 0x4032 | ||
| 47 | #endif | ||
| 44 | 48 | ||
| 45 | #define QLA_SUCCESS 0 | 49 | #define QLA_SUCCESS 0 |
| 46 | #define QLA_ERROR 1 | 50 | #define QLA_ERROR 1 |
| @@ -277,7 +281,6 @@ struct scsi_qla_host { | |||
| 277 | #define AF_INTERRUPTS_ON 6 /* 0x00000040 Not Used */ | 281 | #define AF_INTERRUPTS_ON 6 /* 0x00000040 Not Used */ |
| 278 | #define AF_GET_CRASH_RECORD 7 /* 0x00000080 */ | 282 | #define AF_GET_CRASH_RECORD 7 /* 0x00000080 */ |
| 279 | #define AF_LINK_UP 8 /* 0x00000100 */ | 283 | #define AF_LINK_UP 8 /* 0x00000100 */ |
| 280 | #define AF_TOPCAT_CHIP_PRESENT 9 /* 0x00000200 */ | ||
| 281 | #define AF_IRQ_ATTACHED 10 /* 0x00000400 */ | 284 | #define AF_IRQ_ATTACHED 10 /* 0x00000400 */ |
| 282 | #define AF_ISNS_CMD_IN_PROCESS 12 /* 0x00001000 */ | 285 | #define AF_ISNS_CMD_IN_PROCESS 12 /* 0x00001000 */ |
| 283 | #define AF_ISNS_CMD_DONE 13 /* 0x00002000 */ | 286 | #define AF_ISNS_CMD_DONE 13 /* 0x00002000 */ |
| @@ -317,16 +320,17 @@ struct scsi_qla_host { | |||
| 317 | /* NVRAM registers */ | 320 | /* NVRAM registers */ |
| 318 | struct eeprom_data *nvram; | 321 | struct eeprom_data *nvram; |
| 319 | spinlock_t hardware_lock ____cacheline_aligned; | 322 | spinlock_t hardware_lock ____cacheline_aligned; |
| 320 | spinlock_t list_lock; | ||
| 321 | uint32_t eeprom_cmd_data; | 323 | uint32_t eeprom_cmd_data; |
| 322 | 324 | ||
| 323 | /* Counters for general statistics */ | 325 | /* Counters for general statistics */ |
| 326 | uint64_t isr_count; | ||
| 324 | uint64_t adapter_error_count; | 327 | uint64_t adapter_error_count; |
| 325 | uint64_t device_error_count; | 328 | uint64_t device_error_count; |
| 326 | uint64_t total_io_count; | 329 | uint64_t total_io_count; |
| 327 | uint64_t total_mbytes_xferred; | 330 | uint64_t total_mbytes_xferred; |
| 328 | uint64_t link_failure_count; | 331 | uint64_t link_failure_count; |
| 329 | uint64_t invalid_crc_count; | 332 | uint64_t invalid_crc_count; |
| 333 | uint32_t bytes_xfered; | ||
| 330 | uint32_t spurious_int_count; | 334 | uint32_t spurious_int_count; |
| 331 | uint32_t aborted_io_count; | 335 | uint32_t aborted_io_count; |
| 332 | uint32_t io_timeout_count; | 336 | uint32_t io_timeout_count; |
| @@ -438,6 +442,11 @@ static inline int is_qla4022(struct scsi_qla_host *ha) | |||
| 438 | return ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP4022; | 442 | return ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP4022; |
| 439 | } | 443 | } |
| 440 | 444 | ||
| 445 | static inline int is_qla4032(struct scsi_qla_host *ha) | ||
| 446 | { | ||
| 447 | return ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP4032; | ||
| 448 | } | ||
| 449 | |||
| 441 | static inline int adapter_up(struct scsi_qla_host *ha) | 450 | static inline int adapter_up(struct scsi_qla_host *ha) |
| 442 | { | 451 | { |
| 443 | return (test_bit(AF_ONLINE, &ha->flags) != 0) && | 452 | return (test_bit(AF_ONLINE, &ha->flags) != 0) && |
| @@ -451,58 +460,58 @@ static inline struct scsi_qla_host* to_qla_host(struct Scsi_Host *shost) | |||
| 451 | 460 | ||
| 452 | static inline void __iomem* isp_semaphore(struct scsi_qla_host *ha) | 461 | static inline void __iomem* isp_semaphore(struct scsi_qla_host *ha) |
| 453 | { | 462 | { |
| 454 | return (is_qla4022(ha) ? | 463 | return (is_qla4010(ha) ? |
| 455 | &ha->reg->u1.isp4022.semaphore : | 464 | &ha->reg->u1.isp4010.nvram : |
| 456 | &ha->reg->u1.isp4010.nvram); | 465 | &ha->reg->u1.isp4022.semaphore); |
| 457 | } | 466 | } |
| 458 | 467 | ||
| 459 | static inline void __iomem* isp_nvram(struct scsi_qla_host *ha) | 468 | static inline void __iomem* isp_nvram(struct scsi_qla_host *ha) |
| 460 | { | 469 | { |
| 461 | return (is_qla4022(ha) ? | 470 | return (is_qla4010(ha) ? |
| 462 | &ha->reg->u1.isp4022.nvram : | 471 | &ha->reg->u1.isp4010.nvram : |
| 463 | &ha->reg->u1.isp4010.nvram); | 472 | &ha->reg->u1.isp4022.nvram); |
| 464 | } | 473 | } |
| 465 | 474 | ||
| 466 | static inline void __iomem* isp_ext_hw_conf(struct scsi_qla_host *ha) | 475 | static inline void __iomem* isp_ext_hw_conf(struct scsi_qla_host *ha) |
| 467 | { | 476 | { |
| 468 | return (is_qla4022(ha) ? | 477 | return (is_qla4010(ha) ? |
| 469 | &ha->reg->u2.isp4022.p0.ext_hw_conf : | 478 | &ha->reg->u2.isp4010.ext_hw_conf : |
| 470 | &ha->reg->u2.isp4010.ext_hw_conf); | 479 | &ha->reg->u2.isp4022.p0.ext_hw_conf); |
| 471 | } | 480 | } |
| 472 | 481 | ||
| 473 | static inline void __iomem* isp_port_status(struct scsi_qla_host *ha) | 482 | static inline void __iomem* isp_port_status(struct scsi_qla_host *ha) |
| 474 | { | 483 | { |
| 475 | return (is_qla4022(ha) ? | 484 | return (is_qla4010(ha) ? |
| 476 | &ha->reg->u2.isp4022.p0.port_status : | 485 | &ha->reg->u2.isp4010.port_status : |
| 477 | &ha->reg->u2.isp4010.port_status); | 486 | &ha->reg->u2.isp4022.p0.port_status); |
| 478 | } | 487 | } |
| 479 | 488 | ||
| 480 | static inline void __iomem* isp_port_ctrl(struct scsi_qla_host *ha) | 489 | static inline void __iomem* isp_port_ctrl(struct scsi_qla_host *ha) |
| 481 | { | 490 | { |
| 482 | return (is_qla4022(ha) ? | 491 | return (is_qla4010(ha) ? |
| 483 | &ha->reg->u2.isp4022.p0.port_ctrl : | 492 | &ha->reg->u2.isp4010.port_ctrl : |
| 484 | &ha->reg->u2.isp4010.port_ctrl); | 493 | &ha->reg->u2.isp4022.p0.port_ctrl); |
| 485 | } | 494 | } |
| 486 | 495 | ||
| 487 | static inline void __iomem* isp_port_error_status(struct scsi_qla_host *ha) | 496 | static inline void __iomem* isp_port_error_status(struct scsi_qla_host *ha) |
| 488 | { | 497 | { |
| 489 | return (is_qla4022(ha) ? | 498 | return (is_qla4010(ha) ? |
| 490 | &ha->reg->u2.isp4022.p0.port_err_status : | 499 | &ha->reg->u2.isp4010.port_err_status : |
| 491 | &ha->reg->u2.isp4010.port_err_status); | 500 | &ha->reg->u2.isp4022.p0.port_err_status); |
| 492 | } | 501 | } |
| 493 | 502 | ||
| 494 | static inline void __iomem * isp_gp_out(struct scsi_qla_host *ha) | 503 | static inline void __iomem * isp_gp_out(struct scsi_qla_host *ha) |
| 495 | { | 504 | { |
| 496 | return (is_qla4022(ha) ? | 505 | return (is_qla4010(ha) ? |
| 497 | &ha->reg->u2.isp4022.p0.gp_out : | 506 | &ha->reg->u2.isp4010.gp_out : |
| 498 | &ha->reg->u2.isp4010.gp_out); | 507 | &ha->reg->u2.isp4022.p0.gp_out); |
| 499 | } | 508 | } |
| 500 | 509 | ||
| 501 | static inline int eeprom_ext_hw_conf_offset(struct scsi_qla_host *ha) | 510 | static inline int eeprom_ext_hw_conf_offset(struct scsi_qla_host *ha) |
| 502 | { | 511 | { |
| 503 | return (is_qla4022(ha) ? | 512 | return (is_qla4010(ha) ? |
| 504 | offsetof(struct eeprom_data, isp4022.ext_hw_conf) / 2 : | 513 | offsetof(struct eeprom_data, isp4010.ext_hw_conf) / 2 : |
| 505 | offsetof(struct eeprom_data, isp4010.ext_hw_conf) / 2); | 514 | offsetof(struct eeprom_data, isp4022.ext_hw_conf) / 2); |
| 506 | } | 515 | } |
| 507 | 516 | ||
| 508 | int ql4xxx_sem_spinlock(struct scsi_qla_host * ha, u32 sem_mask, u32 sem_bits); | 517 | int ql4xxx_sem_spinlock(struct scsi_qla_host * ha, u32 sem_mask, u32 sem_bits); |
| @@ -511,59 +520,59 @@ int ql4xxx_sem_lock(struct scsi_qla_host * ha, u32 sem_mask, u32 sem_bits); | |||
| 511 | 520 | ||
| 512 | static inline int ql4xxx_lock_flash(struct scsi_qla_host *a) | 521 | static inline int ql4xxx_lock_flash(struct scsi_qla_host *a) |
| 513 | { | 522 | { |
| 514 | if (is_qla4022(a)) | 523 | if (is_qla4010(a)) |
| 524 | return ql4xxx_sem_spinlock(a, QL4010_FLASH_SEM_MASK, | ||
| 525 | QL4010_FLASH_SEM_BITS); | ||
| 526 | else | ||
| 515 | return ql4xxx_sem_spinlock(a, QL4022_FLASH_SEM_MASK, | 527 | return ql4xxx_sem_spinlock(a, QL4022_FLASH_SEM_MASK, |
| 516 | (QL4022_RESOURCE_BITS_BASE_CODE | | 528 | (QL4022_RESOURCE_BITS_BASE_CODE | |
| 517 | (a->mac_index)) << 13); | 529 | (a->mac_index)) << 13); |
| 518 | else | ||
| 519 | return ql4xxx_sem_spinlock(a, QL4010_FLASH_SEM_MASK, | ||
| 520 | QL4010_FLASH_SEM_BITS); | ||
| 521 | } | 530 | } |
| 522 | 531 | ||
| 523 | static inline void ql4xxx_unlock_flash(struct scsi_qla_host *a) | 532 | static inline void ql4xxx_unlock_flash(struct scsi_qla_host *a) |
| 524 | { | 533 | { |
| 525 | if (is_qla4022(a)) | 534 | if (is_qla4010(a)) |
| 526 | ql4xxx_sem_unlock(a, QL4022_FLASH_SEM_MASK); | ||
| 527 | else | ||
| 528 | ql4xxx_sem_unlock(a, QL4010_FLASH_SEM_MASK); | 535 | ql4xxx_sem_unlock(a, QL4010_FLASH_SEM_MASK); |
| 536 | else | ||
| 537 | ql4xxx_sem_unlock(a, QL4022_FLASH_SEM_MASK); | ||
| 529 | } | 538 | } |
| 530 | 539 | ||
| 531 | static inline int ql4xxx_lock_nvram(struct scsi_qla_host *a) | 540 | static inline int ql4xxx_lock_nvram(struct scsi_qla_host *a) |
| 532 | { | 541 | { |
| 533 | if (is_qla4022(a)) | 542 | if (is_qla4010(a)) |
| 543 | return ql4xxx_sem_spinlock(a, QL4010_NVRAM_SEM_MASK, | ||
| 544 | QL4010_NVRAM_SEM_BITS); | ||
| 545 | else | ||
| 534 | return ql4xxx_sem_spinlock(a, QL4022_NVRAM_SEM_MASK, | 546 | return ql4xxx_sem_spinlock(a, QL4022_NVRAM_SEM_MASK, |
| 535 | (QL4022_RESOURCE_BITS_BASE_CODE | | 547 | (QL4022_RESOURCE_BITS_BASE_CODE | |
| 536 | (a->mac_index)) << 10); | 548 | (a->mac_index)) << 10); |
| 537 | else | ||
| 538 | return ql4xxx_sem_spinlock(a, QL4010_NVRAM_SEM_MASK, | ||
| 539 | QL4010_NVRAM_SEM_BITS); | ||
| 540 | } | 549 | } |
| 541 | 550 | ||
| 542 | static inline void ql4xxx_unlock_nvram(struct scsi_qla_host *a) | 551 | static inline void ql4xxx_unlock_nvram(struct scsi_qla_host *a) |
| 543 | { | 552 | { |
| 544 | if (is_qla4022(a)) | 553 | if (is_qla4010(a)) |
| 545 | ql4xxx_sem_unlock(a, QL4022_NVRAM_SEM_MASK); | ||
| 546 | else | ||
| 547 | ql4xxx_sem_unlock(a, QL4010_NVRAM_SEM_MASK); | 554 | ql4xxx_sem_unlock(a, QL4010_NVRAM_SEM_MASK); |
| 555 | else | ||
| 556 | ql4xxx_sem_unlock(a, QL4022_NVRAM_SEM_MASK); | ||
| 548 | } | 557 | } |
| 549 | 558 | ||
| 550 | static inline int ql4xxx_lock_drvr(struct scsi_qla_host *a) | 559 | static inline int ql4xxx_lock_drvr(struct scsi_qla_host *a) |
| 551 | { | 560 | { |
| 552 | if (is_qla4022(a)) | 561 | if (is_qla4010(a)) |
| 562 | return ql4xxx_sem_lock(a, QL4010_DRVR_SEM_MASK, | ||
| 563 | QL4010_DRVR_SEM_BITS); | ||
| 564 | else | ||
| 553 | return ql4xxx_sem_lock(a, QL4022_DRVR_SEM_MASK, | 565 | return ql4xxx_sem_lock(a, QL4022_DRVR_SEM_MASK, |
| 554 | (QL4022_RESOURCE_BITS_BASE_CODE | | 566 | (QL4022_RESOURCE_BITS_BASE_CODE | |
| 555 | (a->mac_index)) << 1); | 567 | (a->mac_index)) << 1); |
| 556 | else | ||
| 557 | return ql4xxx_sem_lock(a, QL4010_DRVR_SEM_MASK, | ||
| 558 | QL4010_DRVR_SEM_BITS); | ||
| 559 | } | 568 | } |
| 560 | 569 | ||
| 561 | static inline void ql4xxx_unlock_drvr(struct scsi_qla_host *a) | 570 | static inline void ql4xxx_unlock_drvr(struct scsi_qla_host *a) |
| 562 | { | 571 | { |
| 563 | if (is_qla4022(a)) | 572 | if (is_qla4010(a)) |
| 564 | ql4xxx_sem_unlock(a, QL4022_DRVR_SEM_MASK); | ||
| 565 | else | ||
| 566 | ql4xxx_sem_unlock(a, QL4010_DRVR_SEM_MASK); | 573 | ql4xxx_sem_unlock(a, QL4010_DRVR_SEM_MASK); |
| 574 | else | ||
| 575 | ql4xxx_sem_unlock(a, QL4022_DRVR_SEM_MASK); | ||
| 567 | } | 576 | } |
| 568 | 577 | ||
| 569 | /*---------------------------------------------------------------------------*/ | 578 | /*---------------------------------------------------------------------------*/ |
diff --git a/drivers/scsi/qla4xxx/ql4_fw.h b/drivers/scsi/qla4xxx/ql4_fw.h index 427489de64bc..4eea8c571916 100644 --- a/drivers/scsi/qla4xxx/ql4_fw.h +++ b/drivers/scsi/qla4xxx/ql4_fw.h | |||
| @@ -296,7 +296,6 @@ static inline uint32_t clr_rmask(uint32_t val) | |||
| 296 | /* ISP Semaphore definitions */ | 296 | /* ISP Semaphore definitions */ |
| 297 | 297 | ||
| 298 | /* ISP General Purpose Output definitions */ | 298 | /* ISP General Purpose Output definitions */ |
| 299 | #define GPOR_TOPCAT_RESET 0x00000004 | ||
| 300 | 299 | ||
| 301 | /* shadow registers (DMA'd from HA to system memory. read only) */ | 300 | /* shadow registers (DMA'd from HA to system memory. read only) */ |
| 302 | struct shadow_regs { | 301 | struct shadow_regs { |
| @@ -339,10 +338,13 @@ union external_hw_config_reg { | |||
| 339 | /* Mailbox command definitions */ | 338 | /* Mailbox command definitions */ |
| 340 | #define MBOX_CMD_ABOUT_FW 0x0009 | 339 | #define MBOX_CMD_ABOUT_FW 0x0009 |
| 341 | #define MBOX_CMD_LUN_RESET 0x0016 | 340 | #define MBOX_CMD_LUN_RESET 0x0016 |
| 341 | #define MBOX_CMD_GET_MANAGEMENT_DATA 0x001E | ||
| 342 | #define MBOX_CMD_GET_FW_STATUS 0x001F | 342 | #define MBOX_CMD_GET_FW_STATUS 0x001F |
| 343 | #define MBOX_CMD_SET_ISNS_SERVICE 0x0021 | 343 | #define MBOX_CMD_SET_ISNS_SERVICE 0x0021 |
| 344 | #define ISNS_DISABLE 0 | 344 | #define ISNS_DISABLE 0 |
| 345 | #define ISNS_ENABLE 1 | 345 | #define ISNS_ENABLE 1 |
| 346 | #define MBOX_CMD_COPY_FLASH 0x0024 | ||
| 347 | #define MBOX_CMD_WRITE_FLASH 0x0025 | ||
| 346 | #define MBOX_CMD_READ_FLASH 0x0026 | 348 | #define MBOX_CMD_READ_FLASH 0x0026 |
| 347 | #define MBOX_CMD_CLEAR_DATABASE_ENTRY 0x0031 | 349 | #define MBOX_CMD_CLEAR_DATABASE_ENTRY 0x0031 |
| 348 | #define MBOX_CMD_CONN_CLOSE_SESS_LOGOUT 0x0056 | 350 | #define MBOX_CMD_CONN_CLOSE_SESS_LOGOUT 0x0056 |
| @@ -360,10 +362,13 @@ union external_hw_config_reg { | |||
| 360 | #define DDB_DS_SESSION_FAILED 0x06 | 362 | #define DDB_DS_SESSION_FAILED 0x06 |
| 361 | #define DDB_DS_LOGIN_IN_PROCESS 0x07 | 363 | #define DDB_DS_LOGIN_IN_PROCESS 0x07 |
| 362 | #define MBOX_CMD_GET_FW_STATE 0x0069 | 364 | #define MBOX_CMD_GET_FW_STATE 0x0069 |
| 365 | #define MBOX_CMD_GET_INIT_FW_CTRL_BLOCK_DEFAULTS 0x006A | ||
| 366 | #define MBOX_CMD_RESTORE_FACTORY_DEFAULTS 0x0087 | ||
| 363 | 367 | ||
| 364 | /* Mailbox 1 */ | 368 | /* Mailbox 1 */ |
| 365 | #define FW_STATE_READY 0x0000 | 369 | #define FW_STATE_READY 0x0000 |
| 366 | #define FW_STATE_CONFIG_WAIT 0x0001 | 370 | #define FW_STATE_CONFIG_WAIT 0x0001 |
| 371 | #define FW_STATE_WAIT_LOGIN 0x0002 | ||
| 367 | #define FW_STATE_ERROR 0x0004 | 372 | #define FW_STATE_ERROR 0x0004 |
| 368 | #define FW_STATE_DHCP_IN_PROGRESS 0x0008 | 373 | #define FW_STATE_DHCP_IN_PROGRESS 0x0008 |
| 369 | 374 | ||
diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h index eeefdcb1edb5..2122967bbf0b 100644 --- a/drivers/scsi/qla4xxx/ql4_glbl.h +++ b/drivers/scsi/qla4xxx/ql4_glbl.h | |||
| @@ -76,4 +76,4 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host * ha, | |||
| 76 | extern int ql4xextended_error_logging; | 76 | extern int ql4xextended_error_logging; |
| 77 | extern int ql4xdiscoverywait; | 77 | extern int ql4xdiscoverywait; |
| 78 | extern int ql4xdontresethba; | 78 | extern int ql4xdontresethba; |
| 79 | #endif /* _QLA4x_GBL_H */ | 79 | #endif /* _QLA4x_GBL_H */ |
diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c index 9e81b810dc88..cc210f297a78 100644 --- a/drivers/scsi/qla4xxx/ql4_init.c +++ b/drivers/scsi/qla4xxx/ql4_init.c | |||
| @@ -259,10 +259,16 @@ static int qla4xxx_fw_ready(struct scsi_qla_host *ha) | |||
| 259 | "seconds expired= %d\n", ha->host_no, __func__, | 259 | "seconds expired= %d\n", ha->host_no, __func__, |
| 260 | ha->firmware_state, ha->addl_fw_state, | 260 | ha->firmware_state, ha->addl_fw_state, |
| 261 | timeout_count)); | 261 | timeout_count)); |
| 262 | if (is_qla4032(ha) && | ||
| 263 | !(ha->addl_fw_state & FW_ADDSTATE_LINK_UP) && | ||
| 264 | (timeout_count < ADAPTER_INIT_TOV - 5)) { | ||
| 265 | break; | ||
| 266 | } | ||
| 267 | |||
| 262 | msleep(1000); | 268 | msleep(1000); |
| 263 | } /* end of for */ | 269 | } /* end of for */ |
| 264 | 270 | ||
| 265 | if (timeout_count <= 0) | 271 | if (timeout_count == 0) |
| 266 | DEBUG2(printk("scsi%ld: %s: FW Initialization timed out!\n", | 272 | DEBUG2(printk("scsi%ld: %s: FW Initialization timed out!\n", |
| 267 | ha->host_no, __func__)); | 273 | ha->host_no, __func__)); |
| 268 | 274 | ||
| @@ -806,32 +812,6 @@ int qla4xxx_relogin_device(struct scsi_qla_host *ha, | |||
| 806 | return QLA_SUCCESS; | 812 | return QLA_SUCCESS; |
| 807 | } | 813 | } |
| 808 | 814 | ||
| 809 | /** | ||
| 810 | * qla4010_get_topcat_presence - check if it is QLA4040 TopCat Chip | ||
| 811 | * @ha: Pointer to host adapter structure. | ||
| 812 | * | ||
| 813 | **/ | ||
| 814 | static int qla4010_get_topcat_presence(struct scsi_qla_host *ha) | ||
| 815 | { | ||
| 816 | unsigned long flags; | ||
| 817 | uint16_t topcat; | ||
| 818 | |||
| 819 | if (ql4xxx_lock_nvram(ha) != QLA_SUCCESS) | ||
| 820 | return QLA_ERROR; | ||
| 821 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
| 822 | topcat = rd_nvram_word(ha, offsetof(struct eeprom_data, | ||
| 823 | isp4010.topcat)); | ||
| 824 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
| 825 | |||
| 826 | if ((topcat & TOPCAT_MASK) == TOPCAT_PRESENT) | ||
| 827 | set_bit(AF_TOPCAT_CHIP_PRESENT, &ha->flags); | ||
| 828 | else | ||
| 829 | clear_bit(AF_TOPCAT_CHIP_PRESENT, &ha->flags); | ||
| 830 | ql4xxx_unlock_nvram(ha); | ||
| 831 | return QLA_SUCCESS; | ||
| 832 | } | ||
| 833 | |||
| 834 | |||
| 835 | static int qla4xxx_config_nvram(struct scsi_qla_host *ha) | 815 | static int qla4xxx_config_nvram(struct scsi_qla_host *ha) |
| 836 | { | 816 | { |
| 837 | unsigned long flags; | 817 | unsigned long flags; |
| @@ -866,7 +846,7 @@ static int qla4xxx_config_nvram(struct scsi_qla_host *ha) | |||
| 866 | /* set defaults */ | 846 | /* set defaults */ |
| 867 | if (is_qla4010(ha)) | 847 | if (is_qla4010(ha)) |
| 868 | extHwConfig.Asuint32_t = 0x1912; | 848 | extHwConfig.Asuint32_t = 0x1912; |
| 869 | else if (is_qla4022(ha)) | 849 | else if (is_qla4022(ha) | is_qla4032(ha)) |
| 870 | extHwConfig.Asuint32_t = 0x0023; | 850 | extHwConfig.Asuint32_t = 0x0023; |
| 871 | } | 851 | } |
| 872 | DEBUG(printk("scsi%ld: %s: Setting extHwConfig to 0xFFFF%04x\n", | 852 | DEBUG(printk("scsi%ld: %s: Setting extHwConfig to 0xFFFF%04x\n", |
| @@ -927,7 +907,7 @@ static int qla4xxx_start_firmware_from_flash(struct scsi_qla_host *ha) | |||
| 927 | 907 | ||
| 928 | spin_lock_irqsave(&ha->hardware_lock, flags); | 908 | spin_lock_irqsave(&ha->hardware_lock, flags); |
| 929 | writel(jiffies, &ha->reg->mailbox[7]); | 909 | writel(jiffies, &ha->reg->mailbox[7]); |
| 930 | if (is_qla4022(ha)) | 910 | if (is_qla4022(ha) | is_qla4032(ha)) |
| 931 | writel(set_rmask(NVR_WRITE_ENABLE), | 911 | writel(set_rmask(NVR_WRITE_ENABLE), |
| 932 | &ha->reg->u1.isp4022.nvram); | 912 | &ha->reg->u1.isp4022.nvram); |
| 933 | 913 | ||
| @@ -1018,12 +998,7 @@ static int qla4xxx_start_firmware(struct scsi_qla_host *ha) | |||
| 1018 | int soft_reset = 1; | 998 | int soft_reset = 1; |
| 1019 | int config_chip = 0; | 999 | int config_chip = 0; |
| 1020 | 1000 | ||
| 1021 | if (is_qla4010(ha)){ | 1001 | if (is_qla4022(ha) | is_qla4032(ha)) |
| 1022 | if (qla4010_get_topcat_presence(ha) != QLA_SUCCESS) | ||
| 1023 | return QLA_ERROR; | ||
| 1024 | } | ||
| 1025 | |||
| 1026 | if (is_qla4022(ha)) | ||
| 1027 | ql4xxx_set_mac_number(ha); | 1002 | ql4xxx_set_mac_number(ha); |
| 1028 | 1003 | ||
| 1029 | if (ql4xxx_lock_drvr_wait(ha) != QLA_SUCCESS) | 1004 | if (ql4xxx_lock_drvr_wait(ha) != QLA_SUCCESS) |
diff --git a/drivers/scsi/qla4xxx/ql4_inline.h b/drivers/scsi/qla4xxx/ql4_inline.h index 0d61797af7da..6375eb017dd3 100644 --- a/drivers/scsi/qla4xxx/ql4_inline.h +++ b/drivers/scsi/qla4xxx/ql4_inline.h | |||
| @@ -38,7 +38,7 @@ qla4xxx_lookup_ddb_by_fw_index(struct scsi_qla_host *ha, uint32_t fw_ddb_index) | |||
| 38 | static inline void | 38 | static inline void |
| 39 | __qla4xxx_enable_intrs(struct scsi_qla_host *ha) | 39 | __qla4xxx_enable_intrs(struct scsi_qla_host *ha) |
| 40 | { | 40 | { |
| 41 | if (is_qla4022(ha)) { | 41 | if (is_qla4022(ha) | is_qla4032(ha)) { |
| 42 | writel(set_rmask(IMR_SCSI_INTR_ENABLE), | 42 | writel(set_rmask(IMR_SCSI_INTR_ENABLE), |
| 43 | &ha->reg->u1.isp4022.intr_mask); | 43 | &ha->reg->u1.isp4022.intr_mask); |
| 44 | readl(&ha->reg->u1.isp4022.intr_mask); | 44 | readl(&ha->reg->u1.isp4022.intr_mask); |
| @@ -52,7 +52,7 @@ __qla4xxx_enable_intrs(struct scsi_qla_host *ha) | |||
| 52 | static inline void | 52 | static inline void |
| 53 | __qla4xxx_disable_intrs(struct scsi_qla_host *ha) | 53 | __qla4xxx_disable_intrs(struct scsi_qla_host *ha) |
| 54 | { | 54 | { |
| 55 | if (is_qla4022(ha)) { | 55 | if (is_qla4022(ha) | is_qla4032(ha)) { |
| 56 | writel(clr_rmask(IMR_SCSI_INTR_ENABLE), | 56 | writel(clr_rmask(IMR_SCSI_INTR_ENABLE), |
| 57 | &ha->reg->u1.isp4022.intr_mask); | 57 | &ha->reg->u1.isp4022.intr_mask); |
| 58 | readl(&ha->reg->u1.isp4022.intr_mask); | 58 | readl(&ha->reg->u1.isp4022.intr_mask); |
diff --git a/drivers/scsi/qla4xxx/ql4_iocb.c b/drivers/scsi/qla4xxx/ql4_iocb.c index c0a254b89a30..d41ce380eedc 100644 --- a/drivers/scsi/qla4xxx/ql4_iocb.c +++ b/drivers/scsi/qla4xxx/ql4_iocb.c | |||
| @@ -294,6 +294,12 @@ int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb) | |||
| 294 | cmd_entry->control_flags = CF_WRITE; | 294 | cmd_entry->control_flags = CF_WRITE; |
| 295 | else if (cmd->sc_data_direction == DMA_FROM_DEVICE) | 295 | else if (cmd->sc_data_direction == DMA_FROM_DEVICE) |
| 296 | cmd_entry->control_flags = CF_READ; | 296 | cmd_entry->control_flags = CF_READ; |
| 297 | |||
| 298 | ha->bytes_xfered += cmd->request_bufflen; | ||
| 299 | if (ha->bytes_xfered & ~0xFFFFF){ | ||
| 300 | ha->total_mbytes_xferred += ha->bytes_xfered >> 20; | ||
| 301 | ha->bytes_xfered &= 0xFFFFF; | ||
| 302 | } | ||
| 297 | } | 303 | } |
| 298 | 304 | ||
| 299 | /* Set tagged queueing control flags */ | 305 | /* Set tagged queueing control flags */ |
diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c index 1e283321a59d..ef975e0dc87f 100644 --- a/drivers/scsi/qla4xxx/ql4_isr.c +++ b/drivers/scsi/qla4xxx/ql4_isr.c | |||
| @@ -627,6 +627,7 @@ irqreturn_t qla4xxx_intr_handler(int irq, void *dev_id) | |||
| 627 | 627 | ||
| 628 | spin_lock_irqsave(&ha->hardware_lock, flags); | 628 | spin_lock_irqsave(&ha->hardware_lock, flags); |
| 629 | 629 | ||
| 630 | ha->isr_count++; | ||
| 630 | /* | 631 | /* |
| 631 | * Repeatedly service interrupts up to a maximum of | 632 | * Repeatedly service interrupts up to a maximum of |
| 632 | * MAX_REQS_SERVICED_PER_INTR | 633 | * MAX_REQS_SERVICED_PER_INTR |
diff --git a/drivers/scsi/qla4xxx/ql4_nvram.c b/drivers/scsi/qla4xxx/ql4_nvram.c index e3957ca5b645..fc5020395407 100644 --- a/drivers/scsi/qla4xxx/ql4_nvram.c +++ b/drivers/scsi/qla4xxx/ql4_nvram.c | |||
| @@ -9,13 +9,13 @@ | |||
| 9 | 9 | ||
| 10 | static inline int eeprom_size(struct scsi_qla_host *ha) | 10 | static inline int eeprom_size(struct scsi_qla_host *ha) |
| 11 | { | 11 | { |
| 12 | return is_qla4022(ha) ? FM93C86A_SIZE_16 : FM93C66A_SIZE_16; | 12 | return is_qla4010(ha) ? FM93C66A_SIZE_16 : FM93C86A_SIZE_16; |
| 13 | } | 13 | } |
| 14 | 14 | ||
| 15 | static inline int eeprom_no_addr_bits(struct scsi_qla_host *ha) | 15 | static inline int eeprom_no_addr_bits(struct scsi_qla_host *ha) |
| 16 | { | 16 | { |
| 17 | return is_qla4022(ha) ? FM93C86A_NO_ADDR_BITS_16 : | 17 | return is_qla4010(ha) ? FM93C56A_NO_ADDR_BITS_16 : |
| 18 | FM93C56A_NO_ADDR_BITS_16; | 18 | FM93C86A_NO_ADDR_BITS_16 ; |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | static inline int eeprom_no_data_bits(struct scsi_qla_host *ha) | 21 | static inline int eeprom_no_data_bits(struct scsi_qla_host *ha) |
diff --git a/drivers/scsi/qla4xxx/ql4_nvram.h b/drivers/scsi/qla4xxx/ql4_nvram.h index 08e2aed8c6cc..b47b4fc59d83 100644 --- a/drivers/scsi/qla4xxx/ql4_nvram.h +++ b/drivers/scsi/qla4xxx/ql4_nvram.h | |||
| @@ -134,9 +134,7 @@ struct eeprom_data { | |||
| 134 | u16 phyConfig; /* x36 */ | 134 | u16 phyConfig; /* x36 */ |
| 135 | #define PHY_CONFIG_PHY_ADDR_MASK 0x1f | 135 | #define PHY_CONFIG_PHY_ADDR_MASK 0x1f |
| 136 | #define PHY_CONFIG_ENABLE_FW_MANAGEMENT_MASK 0x20 | 136 | #define PHY_CONFIG_ENABLE_FW_MANAGEMENT_MASK 0x20 |
| 137 | u16 topcat; /* x38 */ | 137 | u16 reserved_56; /* x38 */ |
| 138 | #define TOPCAT_PRESENT 0x0100 | ||
| 139 | #define TOPCAT_MASK 0xFF00 | ||
| 140 | 138 | ||
| 141 | #define EEPROM_UNUSED_1_SIZE 2 | 139 | #define EEPROM_UNUSED_1_SIZE 2 |
| 142 | u8 unused_1[EEPROM_UNUSED_1_SIZE]; /* x3A */ | 140 | u8 unused_1[EEPROM_UNUSED_1_SIZE]; /* x3A */ |
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index bab434ee774b..db9d88e7bee7 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c | |||
| @@ -708,10 +708,10 @@ static int qla4xxx_cmd_wait(struct scsi_qla_host *ha) | |||
| 708 | } | 708 | } |
| 709 | 709 | ||
| 710 | /** | 710 | /** |
| 711 | * qla4010_soft_reset - performs soft reset. | 711 | * qla4xxx_soft_reset - performs soft reset. |
| 712 | * @ha: Pointer to host adapter structure. | 712 | * @ha: Pointer to host adapter structure. |
| 713 | **/ | 713 | **/ |
| 714 | static int qla4010_soft_reset(struct scsi_qla_host *ha) | 714 | int qla4xxx_soft_reset(struct scsi_qla_host *ha) |
| 715 | { | 715 | { |
| 716 | uint32_t max_wait_time; | 716 | uint32_t max_wait_time; |
| 717 | unsigned long flags = 0; | 717 | unsigned long flags = 0; |
| @@ -817,29 +817,6 @@ static int qla4010_soft_reset(struct scsi_qla_host *ha) | |||
| 817 | } | 817 | } |
| 818 | 818 | ||
| 819 | /** | 819 | /** |
| 820 | * qla4xxx_topcat_reset - performs hard reset of TopCat Chip. | ||
| 821 | * @ha: Pointer to host adapter structure. | ||
| 822 | **/ | ||
| 823 | static int qla4xxx_topcat_reset(struct scsi_qla_host *ha) | ||
| 824 | { | ||
| 825 | unsigned long flags; | ||
| 826 | |||
| 827 | ql4xxx_lock_nvram(ha); | ||
| 828 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
| 829 | writel(set_rmask(GPOR_TOPCAT_RESET), isp_gp_out(ha)); | ||
| 830 | readl(isp_gp_out(ha)); | ||
| 831 | mdelay(1); | ||
| 832 | |||
| 833 | writel(clr_rmask(GPOR_TOPCAT_RESET), isp_gp_out(ha)); | ||
| 834 | readl(isp_gp_out(ha)); | ||
| 835 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
| 836 | mdelay(2523); | ||
| 837 | |||
| 838 | ql4xxx_unlock_nvram(ha); | ||
| 839 | return QLA_SUCCESS; | ||
| 840 | } | ||
| 841 | |||
| 842 | /** | ||
| 843 | * qla4xxx_flush_active_srbs - returns all outstanding i/o requests to O.S. | 820 | * qla4xxx_flush_active_srbs - returns all outstanding i/o requests to O.S. |
| 844 | * @ha: Pointer to host adapter structure. | 821 | * @ha: Pointer to host adapter structure. |
| 845 | * | 822 | * |
| @@ -867,26 +844,6 @@ static void qla4xxx_flush_active_srbs(struct scsi_qla_host *ha) | |||
| 867 | } | 844 | } |
| 868 | 845 | ||
| 869 | /** | 846 | /** |
| 870 | * qla4xxx_hard_reset - performs HBA Hard Reset | ||
| 871 | * @ha: Pointer to host adapter structure. | ||
| 872 | **/ | ||
| 873 | static int qla4xxx_hard_reset(struct scsi_qla_host *ha) | ||
| 874 | { | ||
| 875 | /* The QLA4010 really doesn't have an equivalent to a hard reset */ | ||
| 876 | qla4xxx_flush_active_srbs(ha); | ||
| 877 | if (test_bit(AF_TOPCAT_CHIP_PRESENT, &ha->flags)) { | ||
| 878 | int status = QLA_ERROR; | ||
| 879 | |||
| 880 | if ((qla4010_soft_reset(ha) == QLA_SUCCESS) && | ||
| 881 | (qla4xxx_topcat_reset(ha) == QLA_SUCCESS) && | ||
| 882 | (qla4010_soft_reset(ha) == QLA_SUCCESS)) | ||
| 883 | status = QLA_SUCCESS; | ||
| 884 | return status; | ||
| 885 | } else | ||
| 886 | return qla4010_soft_reset(ha); | ||
| 887 | } | ||
| 888 | |||
| 889 | /** | ||
| 890 | * qla4xxx_recover_adapter - recovers adapter after a fatal error | 847 | * qla4xxx_recover_adapter - recovers adapter after a fatal error |
| 891 | * @ha: Pointer to host adapter structure. | 848 | * @ha: Pointer to host adapter structure. |
| 892 | * @renew_ddb_list: Indicates what to do with the adapter's ddb list | 849 | * @renew_ddb_list: Indicates what to do with the adapter's ddb list |
| @@ -1243,7 +1200,6 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
| 1243 | init_waitqueue_head(&ha->mailbox_wait_queue); | 1200 | init_waitqueue_head(&ha->mailbox_wait_queue); |
| 1244 | 1201 | ||
| 1245 | spin_lock_init(&ha->hardware_lock); | 1202 | spin_lock_init(&ha->hardware_lock); |
| 1246 | spin_lock_init(&ha->list_lock); | ||
| 1247 | 1203 | ||
| 1248 | /* Allocate dma buffers */ | 1204 | /* Allocate dma buffers */ |
| 1249 | if (qla4xxx_mem_alloc(ha)) { | 1205 | if (qla4xxx_mem_alloc(ha)) { |
| @@ -1450,27 +1406,6 @@ struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha, uint32_t in | |||
| 1450 | } | 1406 | } |
| 1451 | 1407 | ||
| 1452 | /** | 1408 | /** |
| 1453 | * qla4xxx_soft_reset - performs a SOFT RESET of hba. | ||
| 1454 | * @ha: Pointer to host adapter structure. | ||
| 1455 | **/ | ||
| 1456 | int qla4xxx_soft_reset(struct scsi_qla_host *ha) | ||
| 1457 | { | ||
| 1458 | |||
| 1459 | DEBUG2(printk(KERN_WARNING "scsi%ld: %s: chip reset!\n", ha->host_no, | ||
| 1460 | __func__)); | ||
| 1461 | if (test_bit(AF_TOPCAT_CHIP_PRESENT, &ha->flags)) { | ||
| 1462 | int status = QLA_ERROR; | ||
| 1463 | |||
| 1464 | if ((qla4010_soft_reset(ha) == QLA_SUCCESS) && | ||
| 1465 | (qla4xxx_topcat_reset(ha) == QLA_SUCCESS) && | ||
| 1466 | (qla4010_soft_reset(ha) == QLA_SUCCESS) ) | ||
| 1467 | status = QLA_SUCCESS; | ||
| 1468 | return status; | ||
| 1469 | } else | ||
| 1470 | return qla4010_soft_reset(ha); | ||
| 1471 | } | ||
| 1472 | |||
| 1473 | /** | ||
| 1474 | * qla4xxx_eh_wait_on_command - waits for command to be returned by firmware | 1409 | * qla4xxx_eh_wait_on_command - waits for command to be returned by firmware |
| 1475 | * @ha: actual ha whose done queue will contain the comd returned by firmware. | 1410 | * @ha: actual ha whose done queue will contain the comd returned by firmware. |
| 1476 | * @cmd: Scsi Command to wait on. | 1411 | * @cmd: Scsi Command to wait on. |
| @@ -1668,6 +1603,12 @@ static struct pci_device_id qla4xxx_pci_tbl[] = { | |||
| 1668 | .subvendor = PCI_ANY_ID, | 1603 | .subvendor = PCI_ANY_ID, |
| 1669 | .subdevice = PCI_ANY_ID, | 1604 | .subdevice = PCI_ANY_ID, |
| 1670 | }, | 1605 | }, |
| 1606 | { | ||
| 1607 | .vendor = PCI_VENDOR_ID_QLOGIC, | ||
| 1608 | .device = PCI_DEVICE_ID_QLOGIC_ISP4032, | ||
| 1609 | .subvendor = PCI_ANY_ID, | ||
| 1610 | .subdevice = PCI_ANY_ID, | ||
| 1611 | }, | ||
| 1671 | {0, 0}, | 1612 | {0, 0}, |
| 1672 | }; | 1613 | }; |
| 1673 | MODULE_DEVICE_TABLE(pci, qla4xxx_pci_tbl); | 1614 | MODULE_DEVICE_TABLE(pci, qla4xxx_pci_tbl); |
diff --git a/drivers/scsi/qla4xxx/ql4_version.h b/drivers/scsi/qla4xxx/ql4_version.h index d05048b4e88a..454e19c8ad68 100644 --- a/drivers/scsi/qla4xxx/ql4_version.h +++ b/drivers/scsi/qla4xxx/ql4_version.h | |||
| @@ -5,4 +5,4 @@ | |||
| 5 | * See LICENSE.qla4xxx for copyright and licensing details. | 5 | * See LICENSE.qla4xxx for copyright and licensing details. |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #define QLA4XXX_DRIVER_VERSION "5.00.06-k" | 8 | #define QLA4XXX_DRIVER_VERSION "5.00.07-k" |
