* Context:
* Kernel context.
*/
-int
+static int
qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
{
int rval;
return rval;
}
-/*
- * qla2x00_read_ram_word
- *
- * Input:
- * ha = adapter block pointer.
- *
- * Returns:
- * qla2x00 local function return status code.
- *
- * Context:
- * Kernel context.
- */
-int
-qla2x00_read_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t *data)
-{
- int rval;
- mbx_cmd_t mc;
- mbx_cmd_t *mcp = &mc;
-
- DEBUG11(printk("qla2x00_read_ram_word(%ld): entered.\n", ha->host_no);)
-
- mcp->mb[0] = MBC_READ_RAM_WORD;
- mcp->mb[1] = addr;
- mcp->out_mb = MBX_1|MBX_0;
- mcp->in_mb = MBX_0|MBX_2;
- mcp->tov = 30;
- mcp->flags = 0;
- rval = qla2x00_mailbox_command(ha, mcp);
-
- if (rval != QLA_SUCCESS) {
- /*EMPTY*/
- DEBUG2_3_11(printk("qla2x00_read_ram_word(%ld): failed=%x.\n",
- ha->host_no, rval);)
- } else {
- *data = mcp->mb[2];
- DEBUG11(printk("qla2x00_read_ram_word(%ld): done.\n",
- ha->host_no);)
- }
-
- return rval;
-}
-
-/*
- * qla2x00_write_ram_word
- *
- * Input:
- * ha = adapter block pointer.
- *
- * Returns:
- * qla2x00 local function return status code.
- *
- * Context:
- * Kernel context.
- */
-int
-qla2x00_write_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t data)
-{
- int rval;
- mbx_cmd_t mc;
- mbx_cmd_t *mcp = &mc;
-
- DEBUG11(printk("qla2x00_write_ram_word(%ld): entered.\n",
- ha->host_no);)
-
- mcp->mb[0] = MBC_WRITE_RAM_WORD;
- mcp->mb[1] = addr;
- mcp->mb[2] = data;
- mcp->out_mb = MBX_2|MBX_1|MBX_0;
- mcp->in_mb = MBX_0;
- mcp->tov = 30;
- mcp->flags = 0;
- rval = qla2x00_mailbox_command(ha, mcp);
-
- if (rval != QLA_SUCCESS) {
- /*EMPTY*/
- DEBUG2_3_11(printk("qla2x00_write_ram_word(%ld): failed=%x.\n",
- ha->host_no, rval);)
- } else {
- /*EMPTY*/
- DEBUG11(printk("qla2x00_write_ram_word(%ld): done.\n",
- ha->host_no);)
- }
-
- return rval;
-}
-
-/*
- * qla2x00_write_ram_word_ext
- *
- * Input:
- * ha = adapter block pointer.
- *
- * Returns:
- * qla2x00 local function return status code.
- *
- * Context:
- * Kernel context.
- */
-int
-qla2x00_write_ram_word_ext(scsi_qla_host_t *ha, uint32_t addr, uint16_t data)
-{
- int rval;
- mbx_cmd_t mc;
- mbx_cmd_t *mcp = &mc;
-
- DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
-
- mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED;
- mcp->mb[1] = LSW(addr);
- mcp->mb[2] = data;
- mcp->mb[8] = MSW(addr);
- mcp->out_mb = MBX_8|MBX_2|MBX_1|MBX_0;
- mcp->in_mb = MBX_0;
- mcp->tov = 30;
- mcp->flags = 0;
- rval = qla2x00_mailbox_command(ha, mcp);
-
- if (rval != QLA_SUCCESS) {
- /*EMPTY*/
- DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
- ha->host_no, rval));
- } else {
- /*EMPTY*/
- DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
- }
-
- return rval;
-}
-
/*
* qla2x00_mbx_reg_test
* Mailbox register wrap test.
DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ha->host_no);)
- fcport = sp->fclun->fcport;
-
+ fcport = sp->fcport;
if (atomic_read(&ha->loop_state) == LOOP_DOWN ||
atomic_read(&fcport->state) == FCS_DEVICE_LOST) {
return 1;
mcp->mb[1] = fcport->loop_id << 8;
mcp->mb[2] = (uint16_t)handle;
mcp->mb[3] = (uint16_t)(handle >> 16);
- mcp->mb[6] = (uint16_t)sp->fclun->lun;
+ mcp->mb[6] = (uint16_t)sp->cmd->device->lun;
mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
mcp->in_mb = MBX_0;
mcp->tov = 30;
return rval;
}
-/*
- * qla2x00_abort_device
- *
- * Input:
- * ha = adapter block pointer.
- * loop_id = FC loop ID
- * lun = SCSI LUN.
- *
- * Returns:
- * qla2x00 local function return status code.
- *
- * Context:
- * Kernel context.
- */
-int
-qla2x00_abort_device(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun)
-{
- int rval;
- mbx_cmd_t mc;
- mbx_cmd_t *mcp = &mc;
-
- DEBUG11(printk("qla2x00_abort_device(%ld): entered.\n", ha->host_no);)
-
- mcp->mb[0] = MBC_ABORT_DEVICE;
- if (HAS_EXTENDED_IDS(ha))
- mcp->mb[1] = loop_id;
- else
- mcp->mb[1] = loop_id << 8;
- mcp->mb[2] = lun;
- mcp->out_mb = MBX_2|MBX_1|MBX_0;
- mcp->in_mb = MBX_0;
- mcp->tov = 30;
- mcp->flags = 0;
- rval = qla2x00_mailbox_command(ha, mcp);
-
- /* Issue marker command. */
- qla2x00_marker(ha, loop_id, lun, MK_SYNC_ID_LUN);
-
- if (rval != QLA_SUCCESS) {
- qla_printk(KERN_WARNING, ha,
- "Failed Abort Device Mailbox command. Scheduling ISP "
- "abort.\n");
- set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
- if (ha->dpc_wait && !ha->dpc_active)
- up(ha->dpc_wait);
- DEBUG2_3_11(printk("qla2x00_abort_device(%ld): failed=%x.\n",
- ha->host_no, rval);)
- } else {
- /*EMPTY*/
- DEBUG11(printk("qla2x00_abort_device(%ld): done.\n",
- ha->host_no);)
- }
-
- return rval;
-}
-
#if USE_ABORT_TGT
/*
* qla2x00_abort_target
* Kernel context.
*/
int
-qla2x00_target_reset(scsi_qla_host_t *ha, uint16_t b, uint16_t t)
+qla2x00_target_reset(scsi_qla_host_t *ha, struct fc_port *fcport)
{
int rval;
mbx_cmd_t mc;
mbx_cmd_t *mcp = &mc;
- os_tgt_t *tgt;
DEBUG11(printk("qla2x00_target_reset(%ld): entered.\n", ha->host_no);)
- tgt = TGT_Q(ha, t);
- if (tgt->fcport == NULL) {
- /* no target to abort */
+ if (atomic_read(&fcport->state) != FCS_ONLINE)
return 0;
- }
- if (atomic_read(&tgt->fcport->state) != FCS_ONLINE) {
- /* target not online */
- return 0;
- }
mcp->mb[0] = MBC_TARGET_RESET;
if (HAS_EXTENDED_IDS(ha))
- mcp->mb[1] = tgt->fcport->loop_id;
+ mcp->mb[1] = fcport->loop_id;
else
- mcp->mb[1] = tgt->fcport->loop_id << 8;
+ mcp->mb[1] = fcport->loop_id << 8;
mcp->mb[2] = ha->loop_reset_delay;
mcp->out_mb = MBX_2|MBX_1|MBX_0;
mcp->in_mb = MBX_0;
return rval;
}
-/*
- * qla2x00_get_link_status
- *
- * Input:
- * ha = adapter block pointer.
- * loop_id = device loop ID.
- * ret_buf = pointer to link status return buffer.
- *
- * Returns:
- * 0 = success.
- * BIT_0 = mem alloc error.
- * BIT_1 = mailbox error.
- */
-uint8_t
-qla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id,
- link_stat_t *ret_buf, uint16_t *status)
-{
- int rval;
- mbx_cmd_t mc;
- mbx_cmd_t *mcp = &mc;
- link_stat_t *stat_buf;
- dma_addr_t stat_buf_dma;
-
- DEBUG11(printk("qla2x00_get_link_status(%ld): entered.\n",
- ha->host_no);)
-
- stat_buf = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &stat_buf_dma);
- if (stat_buf == NULL) {
- DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): Failed to "
- "allocate memory.\n", ha->host_no));
- return BIT_0;
- }
- memset(stat_buf, 0, sizeof(link_stat_t));
-
- mcp->mb[0] = MBC_GET_LINK_STATUS;
- mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
- if (HAS_EXTENDED_IDS(ha)) {
- mcp->mb[1] = loop_id;
- mcp->mb[10] = 0;
- mcp->out_mb |= MBX_10;
- } else {
- mcp->mb[1] = loop_id << 8;
- }
- mcp->mb[2] = MSW(stat_buf_dma);
- mcp->mb[3] = LSW(stat_buf_dma);
- mcp->mb[6] = MSW(MSD(stat_buf_dma));
- mcp->mb[7] = LSW(MSD(stat_buf_dma));
-
- mcp->in_mb = MBX_0;
- mcp->tov = 30;
- mcp->flags = IOCTL_CMD;
- rval = qla2x00_mailbox_command(ha, mcp);
-
- if (rval == QLA_SUCCESS) {
- if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {
- DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): cmd "
- "failed. mbx0=%x.\n", ha->host_no, mcp->mb[0]);)
- status[0] = mcp->mb[0];
- rval = BIT_1;
- } else {
- /* copy over data -- firmware data is LE. */
- ret_buf->link_fail_cnt =
- le32_to_cpu(stat_buf->link_fail_cnt);
- ret_buf->loss_sync_cnt =
- le32_to_cpu(stat_buf->loss_sync_cnt);
- ret_buf->loss_sig_cnt =
- le32_to_cpu(stat_buf->loss_sig_cnt);
- ret_buf->prim_seq_err_cnt =
- le32_to_cpu(stat_buf->prim_seq_err_cnt);
- ret_buf->inval_xmit_word_cnt =
- le32_to_cpu(stat_buf->inval_xmit_word_cnt);
- ret_buf->inval_crc_cnt =
- le32_to_cpu(stat_buf->inval_crc_cnt);
-
- DEBUG11(printk("qla2x00_get_link_status(%ld): stat "
- "dump: fail_cnt=%d loss_sync=%d loss_sig=%d "
- "seq_err=%d inval_xmt_word=%d inval_crc=%d.\n",
- ha->host_no,
- stat_buf->link_fail_cnt, stat_buf->loss_sync_cnt,
- stat_buf->loss_sig_cnt, stat_buf->prim_seq_err_cnt,
- stat_buf->inval_xmit_word_cnt,
- stat_buf->inval_crc_cnt);)
- }
- } else {
- /* Failed. */
- DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): failed=%x.\n",
- ha->host_no, rval);)
- rval = BIT_1;
- }
-
- dma_pool_free(ha->s_dma_pool, stat_buf, stat_buf_dma);
-
- return rval;
-}
-
/*
* qla2x00_lip_reset
* Issue LIP reset mailbox command.
return rval;
}
-/*
- * qla2x00_lun_reset
- * Issue lun reset mailbox command.
- *
- * Input:
- * ha = adapter block pointer.
- * loop_id = device loop ID.
- * lun = lun to be reset.
- * TARGET_QUEUE_LOCK must be released.
- * ADAPTER_STATE_LOCK must be released.
- *
- * Returns:
- * qla2x00 local function return status code.
- *
- * Context:
- * Kernel context.
- */
-int
-qla2x00_lun_reset(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun)
-{
- int rval;
- mbx_cmd_t mc;
- mbx_cmd_t *mcp = &mc;
-
- mcp->mb[0] = MBC_LUN_RESET;
- if (HAS_EXTENDED_IDS(ha))
- mcp->mb[1] = loop_id;
- else
- mcp->mb[1] = loop_id << 8;
- mcp->mb[2] = lun;
- mcp->out_mb = MBX_2|MBX_1|MBX_0;
- mcp->in_mb = MBX_0;
- mcp->tov = 30;
- mcp->flags = 0;
- rval = qla2x00_mailbox_command(ha, mcp);
-
- if (rval != QLA_SUCCESS) {
- /*EMPTY*/
- printk(KERN_WARNING "qla2x00_lun_reset(%d): failed = %d",
- (int)ha->instance, rval);
- } else {
- /*EMPTY*/
- }
-
- return rval;
-}
-
-/*
- * qla2x00_send_rnid_mbx
- * Issue RNID ELS using mailbox command
- *
- * Input:
- * ha = adapter state pointer.
- * loop_id = loop ID of the target device.
- * data_fmt = currently supports only 0xDF.
- * buffer = buffer pointer.
- * buf_size = size of buffer.
- * mb_reg = pointer to return mailbox registers.
- *
- * Returns:
- * qla2x00 local function return status code.
- *
- * Context:
- * Kernel context.
- */
-int
-qla2x00_send_rnid_mbx(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t data_fmt,
- dma_addr_t buf_phys_addr, size_t buf_size, uint16_t *mb_reg)
-{
- int rval;
- mbx_cmd_t mc;
- mbx_cmd_t *mcp = &mc;
-
- DEBUG11(printk("qla2x00_send_rnid_mbx(%ld): entered.\n",
- ha->host_no);)
-
- mcp->mb[0] = MBC_SEND_RNID_ELS;
- mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
- if (HAS_EXTENDED_IDS(ha)) {
- mcp->mb[1] = loop_id;
- mcp->mb[10] = data_fmt;
- mcp->out_mb |= MBX_10;
- } else {
- mcp->mb[1] = (loop_id << 8) | data_fmt;
- }
- mcp->mb[2] = MSW(buf_phys_addr);
- mcp->mb[3] = LSW(buf_phys_addr);
- mcp->mb[6] = MSW(MSD(buf_phys_addr));
- mcp->mb[7] = LSW(MSD(buf_phys_addr));
-
- mcp->in_mb = MBX_1|MBX_0;
- mcp->buf_size = buf_size;
- mcp->flags = MBX_DMA_IN;
- mcp->tov = 30;
- rval = qla2x00_mailbox_command(ha, mcp);
-
- if (rval != QLA_SUCCESS) {
- memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */
-
- DEBUG2_3_11(printk("qla2x00_send_rnid_mbx(%ld): failed=%x "
- "mb[1]=%x.\n",
- ha->host_no, mcp->mb[0], mcp->mb[1]);)
- } else {
- /*EMPTY*/
- DEBUG11(printk("qla2x00_send_rnid_mbx(%ld): done.\n",
- ha->host_no);)
- }
-
- return (rval);
-}
-
-/*
- * qla2x00_set_rnid_params_mbx
- * Set RNID parameters using mailbox command
- *
- * Input:
- * ha = adapter state pointer.
- * buffer = buffer pointer.
- * buf_size = size of buffer.
- * mb_reg = pointer to return mailbox registers.
- *
- * Returns:
- * qla2x00 local function return status code.
- *
- * Context:
- * Kernel context.
- */
-int
-qla2x00_set_rnid_params_mbx(scsi_qla_host_t *ha, dma_addr_t buf_phys_addr,
- size_t buf_size, uint16_t *mb_reg)
-{
- int rval;
- mbx_cmd_t mc;
- mbx_cmd_t *mcp = &mc;
-
- DEBUG11(printk("qla2x00_set_rnid_params_mbx(%ld): entered.\n",
- ha->host_no);)
-
- mcp->mb[0] = MBC_SET_RNID_PARAMS;
- mcp->mb[1] = 0;
- mcp->mb[2] = MSW(buf_phys_addr);
- mcp->mb[3] = LSW(buf_phys_addr);
- mcp->mb[6] = MSW(MSD(buf_phys_addr));
- mcp->mb[7] = LSW(MSD(buf_phys_addr));
- mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
- mcp->in_mb = MBX_1|MBX_0;
- mcp->buf_size = buf_size;
- mcp->flags = MBX_DMA_OUT;
- mcp->tov = 30;
- rval = qla2x00_mailbox_command(ha, mcp);
-
- if (rval != QLA_SUCCESS) {
- memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */
-
- DEBUG2_3_11(printk("qla2x00_set_rnid_params_mbx(%ld): "
- "failed=%x mb[1]=%x.\n", ha->host_no, mcp->mb[0],
- mcp->mb[1]);)
- } else {
- /*EMPTY*/
- DEBUG11(printk("qla2x00_set_rnid_params_mbx(%ld): done.\n",
- ha->host_no);)
- }
-
- return (rval);
-}
-
-/*
- * qla2x00_get_rnid_params_mbx
- * Get RNID parameters using mailbox command
- *
- * Input:
- * ha = adapter state pointer.
- * buffer = buffer pointer.
- * buf_size = size of buffer.
- * mb_reg = pointer to return mailbox registers.
- *
- * Returns:
- * qla2x00 local function return status code.
- *
- * Context:
- * Kernel context.
- */
-int
-qla2x00_get_rnid_params_mbx(scsi_qla_host_t *ha, dma_addr_t buf_phys_addr,
- size_t buf_size, uint16_t *mb_reg)
-{
- int rval;
- mbx_cmd_t mc;
- mbx_cmd_t *mcp = &mc;
-
- DEBUG11(printk("qla2x00_get_rnid_params_mbx(%ld): entered.\n",
- ha->host_no);)
-
- mcp->mb[0] = MBC_GET_RNID_PARAMS;
- mcp->mb[1] = 0;
- mcp->mb[2] = MSW(buf_phys_addr);
- mcp->mb[3] = LSW(buf_phys_addr);
- mcp->mb[6] = MSW(MSD(buf_phys_addr));
- mcp->mb[7] = LSW(MSD(buf_phys_addr));
- mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
- mcp->in_mb = MBX_1|MBX_0;
- mcp->buf_size = buf_size;
- mcp->flags = MBX_DMA_IN;
- mcp->tov = 30;
- rval = qla2x00_mailbox_command(ha, mcp);
-
- if (rval != QLA_SUCCESS) {
- memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */
-
- DEBUG2_3_11(printk("qla2x00_get_rnid_params_mbx(%ld): "
- "failed=%x mb[1]=%x.\n", ha->host_no, mcp->mb[0],
- mcp->mb[1]);)
- } else {
- /*EMPTY*/
- DEBUG11(printk("qla2x00_get_rnid_params_mbx(%ld): done.\n",
- ha->host_no);)
- }
-
- return (rval);
-}
-
/*
* qla2x00_get_resource_cnts
* Get current firmware resource counts.