mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-17 07:54:54 +08:00
[SCSI] qla4xxx: use CRB Register for Request Queue in-pointer
Switching from doorbell mechanism to CRB register based Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com> Signed-off-by: Shyam Sundar <shyam.sundar@qlogic.com> Signed-off-by: Ravi Anand <ravi.anand@qlogic.com> Reviewed-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
91a772a4b1
commit
2657c800db
@ -448,6 +448,7 @@ struct addr_ctrl_blk {
|
|||||||
#define FWOPT_SESSION_MODE 0x0040
|
#define FWOPT_SESSION_MODE 0x0040
|
||||||
#define FWOPT_INITIATOR_MODE 0x0020
|
#define FWOPT_INITIATOR_MODE 0x0020
|
||||||
#define FWOPT_TARGET_MODE 0x0010
|
#define FWOPT_TARGET_MODE 0x0010
|
||||||
|
#define FWOPT_ENABLE_CRBDB 0x8000
|
||||||
|
|
||||||
uint16_t exec_throttle; /* 04-05 */
|
uint16_t exec_throttle; /* 04-05 */
|
||||||
uint8_t zio_count; /* 06 */
|
uint8_t zio_count; /* 06 */
|
||||||
|
@ -202,19 +202,11 @@ static void qla4xxx_build_scsi_iocbs(struct srb *srb,
|
|||||||
void qla4_8xxx_queue_iocb(struct scsi_qla_host *ha)
|
void qla4_8xxx_queue_iocb(struct scsi_qla_host *ha)
|
||||||
{
|
{
|
||||||
uint32_t dbval = 0;
|
uint32_t dbval = 0;
|
||||||
unsigned long wtime;
|
|
||||||
|
|
||||||
dbval = 0x14 | (ha->func_num << 5);
|
dbval = 0x14 | (ha->func_num << 5);
|
||||||
dbval = dbval | (0 << 8) | (ha->request_in << 16);
|
dbval = dbval | (0 << 8) | (ha->request_in << 16);
|
||||||
writel(dbval, (unsigned long __iomem *)ha->nx_db_wr_ptr);
|
|
||||||
wmb();
|
|
||||||
|
|
||||||
wtime = jiffies + (2 * HZ);
|
qla4_8xxx_wr_32(ha, ha->nx_db_wr_ptr, ha->request_in);
|
||||||
while (readl((void __iomem *)ha->nx_db_rd_ptr) != dbval &&
|
|
||||||
!time_after_eq(jiffies, wtime)) {
|
|
||||||
writel(dbval, (unsigned long __iomem *)ha->nx_db_wr_ptr);
|
|
||||||
wmb();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -299,6 +299,10 @@ qla4xxx_set_ifcb(struct scsi_qla_host *ha, uint32_t *mbox_cmd,
|
|||||||
{
|
{
|
||||||
memset(mbox_cmd, 0, sizeof(mbox_cmd[0]) * MBOX_REG_COUNT);
|
memset(mbox_cmd, 0, sizeof(mbox_cmd[0]) * MBOX_REG_COUNT);
|
||||||
memset(mbox_sts, 0, sizeof(mbox_sts[0]) * MBOX_REG_COUNT);
|
memset(mbox_sts, 0, sizeof(mbox_sts[0]) * MBOX_REG_COUNT);
|
||||||
|
|
||||||
|
if (is_qla8022(ha))
|
||||||
|
qla4_8xxx_wr_32(ha, ha->nx_db_wr_ptr, 0);
|
||||||
|
|
||||||
mbox_cmd[0] = MBOX_CMD_INITIALIZE_FIRMWARE;
|
mbox_cmd[0] = MBOX_CMD_INITIALIZE_FIRMWARE;
|
||||||
mbox_cmd[1] = 0;
|
mbox_cmd[1] = 0;
|
||||||
mbox_cmd[2] = LSDW(init_fw_cb_dma);
|
mbox_cmd[2] = LSDW(init_fw_cb_dma);
|
||||||
@ -472,6 +476,11 @@ int qla4xxx_initialize_fw_cb(struct scsi_qla_host * ha)
|
|||||||
init_fw_cb->fw_options |=
|
init_fw_cb->fw_options |=
|
||||||
__constant_cpu_to_le16(FWOPT_SESSION_MODE |
|
__constant_cpu_to_le16(FWOPT_SESSION_MODE |
|
||||||
FWOPT_INITIATOR_MODE);
|
FWOPT_INITIATOR_MODE);
|
||||||
|
|
||||||
|
if (is_qla8022(ha))
|
||||||
|
init_fw_cb->fw_options |=
|
||||||
|
__constant_cpu_to_le16(FWOPT_ENABLE_CRBDB);
|
||||||
|
|
||||||
init_fw_cb->fw_options &= __constant_cpu_to_le16(~FWOPT_TARGET_MODE);
|
init_fw_cb->fw_options &= __constant_cpu_to_le16(~FWOPT_TARGET_MODE);
|
||||||
|
|
||||||
if (qla4xxx_set_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma)
|
if (qla4xxx_set_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma)
|
||||||
|
@ -535,6 +535,8 @@
|
|||||||
#define QLA82XX_PEG_HALT_STATUS1 (QLA82XX_CAM_RAM(0xa8))
|
#define QLA82XX_PEG_HALT_STATUS1 (QLA82XX_CAM_RAM(0xa8))
|
||||||
#define QLA82XX_PEG_HALT_STATUS2 (QLA82XX_CAM_RAM(0xac))
|
#define QLA82XX_PEG_HALT_STATUS2 (QLA82XX_CAM_RAM(0xac))
|
||||||
#define QLA82XX_PEG_ALIVE_COUNTER (QLA82XX_CAM_RAM(0xb0))
|
#define QLA82XX_PEG_ALIVE_COUNTER (QLA82XX_CAM_RAM(0xb0))
|
||||||
|
#define QLA82XX_CAM_RAM_DB1 (QLA82XX_CAM_RAM(0x1b0))
|
||||||
|
#define QLA82XX_CAM_RAM_DB2 (QLA82XX_CAM_RAM(0x1b4))
|
||||||
|
|
||||||
#define HALT_STATUS_UNRECOVERABLE 0x80000000
|
#define HALT_STATUS_UNRECOVERABLE 0x80000000
|
||||||
#define HALT_STATUS_RECOVERABLE 0x40000000
|
#define HALT_STATUS_RECOVERABLE 0x40000000
|
||||||
|
@ -571,10 +571,6 @@ static void qla4xxx_mem_free(struct scsi_qla_host *ha)
|
|||||||
if (ha->nx_pcibase)
|
if (ha->nx_pcibase)
|
||||||
iounmap(
|
iounmap(
|
||||||
(struct device_reg_82xx __iomem *)ha->nx_pcibase);
|
(struct device_reg_82xx __iomem *)ha->nx_pcibase);
|
||||||
|
|
||||||
if (ha->nx_db_wr_ptr)
|
|
||||||
iounmap(
|
|
||||||
(struct device_reg_82xx __iomem *)ha->nx_db_wr_ptr);
|
|
||||||
} else if (ha->reg)
|
} else if (ha->reg)
|
||||||
iounmap(ha->reg);
|
iounmap(ha->reg);
|
||||||
pci_release_regions(ha->pdev);
|
pci_release_regions(ha->pdev);
|
||||||
@ -1476,24 +1472,10 @@ int qla4_8xxx_iospace_config(struct scsi_qla_host *ha)
|
|||||||
db_base = pci_resource_start(pdev, 4); /* doorbell is on bar 4 */
|
db_base = pci_resource_start(pdev, 4); /* doorbell is on bar 4 */
|
||||||
db_len = pci_resource_len(pdev, 4);
|
db_len = pci_resource_len(pdev, 4);
|
||||||
|
|
||||||
/* mapping of doorbell write pointer */
|
ha->nx_db_wr_ptr = (ha->pdev->devfn == 4 ? QLA82XX_CAM_RAM_DB1 :
|
||||||
ha->nx_db_wr_ptr = (unsigned long)ioremap(db_base +
|
QLA82XX_CAM_RAM_DB2);
|
||||||
(ha->pdev->devfn << 12), 4);
|
|
||||||
if (!ha->nx_db_wr_ptr) {
|
|
||||||
printk(KERN_ERR
|
|
||||||
"cannot remap MMIO doorbell-write (%s), aborting\n",
|
|
||||||
pci_name(pdev));
|
|
||||||
goto iospace_error_exit;
|
|
||||||
}
|
|
||||||
/* mapping of doorbell read pointer */
|
|
||||||
ha->nx_db_rd_ptr = (uint8_t *) ha->nx_pcibase + (512 * 1024) +
|
|
||||||
(ha->pdev->devfn * 8);
|
|
||||||
if (!ha->nx_db_rd_ptr)
|
|
||||||
printk(KERN_ERR
|
|
||||||
"cannot remap MMIO doorbell-read (%s), aborting\n",
|
|
||||||
pci_name(pdev));
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
iospace_error_exit:
|
iospace_error_exit:
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user