Commit b5482d47 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
  [SCSI] qla2xxx: Update version number to 8.03.00-k3.
  [SCSI] qla2xxx: Mask out 'reserved' bits while processing FLT regions.
  [SCSI] qla2xxx: Correct slab-error overwrite during vport creation and deletion.
  [SCSI] qla2xxx: Properly acknowledge IDC notification messages.
  [SCSI] qla2xxx: Remove interrupt request bit check in the response processing path in multiq mode.
  [SCSI] lpfc: introduce missing kfree
  [SCSI] libiscsi: Fix scsi command timeout oops in iscsi_eh_timed_out
  [SCSI] qla2xxx: fix Kernel Panic with Qlogic 2472 Card.
  [SCSI] ibmvfc: Increase cancel timeout
  [SCSI] ibmvfc: Fix rport relogin
  [SCSI] ibmvfc: Fix command timeout errors
  [SCSI] sg: fix device number in blktrace data
  [SCSI] scsi_scan: add missing interim SDEV_DEL state if slave_alloc fails
  [SCSI] ibmvscsi: Correct DMA mapping leak
parents 264b2990 822c05b6
...@@ -1573,9 +1573,6 @@ static int ibmvfc_queuecommand(struct scsi_cmnd *cmnd, ...@@ -1573,9 +1573,6 @@ static int ibmvfc_queuecommand(struct scsi_cmnd *cmnd,
vfc_cmd->resp_len = sizeof(vfc_cmd->rsp); vfc_cmd->resp_len = sizeof(vfc_cmd->rsp);
vfc_cmd->cancel_key = (unsigned long)cmnd->device->hostdata; vfc_cmd->cancel_key = (unsigned long)cmnd->device->hostdata;
vfc_cmd->tgt_scsi_id = rport->port_id; vfc_cmd->tgt_scsi_id = rport->port_id;
if ((rport->supported_classes & FC_COS_CLASS3) &&
(fc_host_supported_classes(vhost->host) & FC_COS_CLASS3))
vfc_cmd->flags = IBMVFC_CLASS_3_ERR;
vfc_cmd->iu.xfer_len = scsi_bufflen(cmnd); vfc_cmd->iu.xfer_len = scsi_bufflen(cmnd);
int_to_scsilun(cmnd->device->lun, &vfc_cmd->iu.lun); int_to_scsilun(cmnd->device->lun, &vfc_cmd->iu.lun);
memcpy(vfc_cmd->iu.cdb, cmnd->cmnd, cmnd->cmd_len); memcpy(vfc_cmd->iu.cdb, cmnd->cmnd, cmnd->cmd_len);
...@@ -3266,6 +3263,7 @@ static int ibmvfc_alloc_target(struct ibmvfc_host *vhost, u64 scsi_id) ...@@ -3266,6 +3263,7 @@ static int ibmvfc_alloc_target(struct ibmvfc_host *vhost, u64 scsi_id)
return -ENOMEM; return -ENOMEM;
} }
memset(tgt, 0, sizeof(*tgt));
tgt->scsi_id = scsi_id; tgt->scsi_id = scsi_id;
tgt->new_scsi_id = scsi_id; tgt->new_scsi_id = scsi_id;
tgt->vhost = vhost; tgt->vhost = vhost;
...@@ -3576,9 +3574,18 @@ static void ibmvfc_log_ae(struct ibmvfc_host *vhost, int events) ...@@ -3576,9 +3574,18 @@ static void ibmvfc_log_ae(struct ibmvfc_host *vhost, int events)
static void ibmvfc_tgt_add_rport(struct ibmvfc_target *tgt) static void ibmvfc_tgt_add_rport(struct ibmvfc_target *tgt)
{ {
struct ibmvfc_host *vhost = tgt->vhost; struct ibmvfc_host *vhost = tgt->vhost;
struct fc_rport *rport; struct fc_rport *rport = tgt->rport;
unsigned long flags; unsigned long flags;
if (rport) {
tgt_dbg(tgt, "Setting rport roles\n");
fc_remote_port_rolechg(rport, tgt->ids.roles);
spin_lock_irqsave(vhost->host->host_lock, flags);
ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
spin_unlock_irqrestore(vhost->host->host_lock, flags);
return;
}
tgt_dbg(tgt, "Adding rport\n"); tgt_dbg(tgt, "Adding rport\n");
rport = fc_remote_port_add(vhost->host, 0, &tgt->ids); rport = fc_remote_port_add(vhost->host, 0, &tgt->ids);
spin_lock_irqsave(vhost->host->host_lock, flags); spin_lock_irqsave(vhost->host->host_lock, flags);
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#define IBMVFC_DRIVER_VERSION "1.0.4" #define IBMVFC_DRIVER_VERSION "1.0.4"
#define IBMVFC_DRIVER_DATE "(November 14, 2008)" #define IBMVFC_DRIVER_DATE "(November 14, 2008)"
#define IBMVFC_DEFAULT_TIMEOUT 15 #define IBMVFC_DEFAULT_TIMEOUT 60
#define IBMVFC_INIT_TIMEOUT 120 #define IBMVFC_INIT_TIMEOUT 120
#define IBMVFC_MAX_REQUESTS_DEFAULT 100 #define IBMVFC_MAX_REQUESTS_DEFAULT 100
......
...@@ -432,6 +432,7 @@ static int map_sg_data(struct scsi_cmnd *cmd, ...@@ -432,6 +432,7 @@ static int map_sg_data(struct scsi_cmnd *cmd,
sdev_printk(KERN_ERR, cmd->device, sdev_printk(KERN_ERR, cmd->device,
"Can't allocate memory " "Can't allocate memory "
"for indirect table\n"); "for indirect table\n");
scsi_dma_unmap(cmd);
return 0; return 0;
} }
} }
......
...@@ -1998,6 +1998,8 @@ int iscsi_host_add(struct Scsi_Host *shost, struct device *pdev) ...@@ -1998,6 +1998,8 @@ int iscsi_host_add(struct Scsi_Host *shost, struct device *pdev)
if (!shost->can_queue) if (!shost->can_queue)
shost->can_queue = ISCSI_DEF_XMIT_CMDS_MAX; shost->can_queue = ISCSI_DEF_XMIT_CMDS_MAX;
if (!shost->transportt->eh_timed_out)
shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out;
return scsi_add_host(shost, pdev); return scsi_add_host(shost, pdev);
} }
EXPORT_SYMBOL_GPL(iscsi_host_add); EXPORT_SYMBOL_GPL(iscsi_host_add);
...@@ -2020,7 +2022,6 @@ struct Scsi_Host *iscsi_host_alloc(struct scsi_host_template *sht, ...@@ -2020,7 +2022,6 @@ struct Scsi_Host *iscsi_host_alloc(struct scsi_host_template *sht,
shost = scsi_host_alloc(sht, sizeof(struct iscsi_host) + dd_data_size); shost = scsi_host_alloc(sht, sizeof(struct iscsi_host) + dd_data_size);
if (!shost) if (!shost)
return NULL; return NULL;
shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out;
if (qdepth > ISCSI_MAX_CMD_PER_LUN || qdepth < 1) { if (qdepth > ISCSI_MAX_CMD_PER_LUN || qdepth < 1) {
if (qdepth != 0) if (qdepth != 0)
......
...@@ -5258,6 +5258,7 @@ lpfc_send_els_event(struct lpfc_vport *vport, ...@@ -5258,6 +5258,7 @@ lpfc_send_els_event(struct lpfc_vport *vport,
sizeof(struct lpfc_name)); sizeof(struct lpfc_name));
break; break;
default: default:
kfree(els_data);
return; return;
} }
memcpy(els_data->wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name)); memcpy(els_data->wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name));
......
...@@ -1265,13 +1265,6 @@ qla24xx_vport_delete(struct fc_vport *fc_vport) ...@@ -1265,13 +1265,6 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)
test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags)) test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags))
msleep(1000); msleep(1000);
if (ha->mqenable) {
if (qla25xx_delete_queues(vha, 0) != QLA_SUCCESS)
qla_printk(KERN_WARNING, ha,
"Queue delete failed.\n");
vha->req_ques[0] = ha->req_q_map[0]->id;
}
qla24xx_disable_vp(vha); qla24xx_disable_vp(vha);
fc_remove_host(vha->host); fc_remove_host(vha->host);
...@@ -1293,6 +1286,12 @@ qla24xx_vport_delete(struct fc_vport *fc_vport) ...@@ -1293,6 +1286,12 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)
vha->host_no, vha->vp_idx, vha)); vha->host_no, vha->vp_idx, vha));
} }
if (ha->mqenable) {
if (qla25xx_delete_queues(vha, 0) != QLA_SUCCESS)
qla_printk(KERN_WARNING, ha,
"Queue delete failed.\n");
}
scsi_host_put(vha->host); scsi_host_put(vha->host);
qla_printk(KERN_INFO, ha, "vport %d deleted\n", id); qla_printk(KERN_INFO, ha, "vport %d deleted\n", id);
return 0; return 0;
......
...@@ -2135,6 +2135,7 @@ struct qla_msix_entry { ...@@ -2135,6 +2135,7 @@ struct qla_msix_entry {
/* Work events. */ /* Work events. */
enum qla_work_type { enum qla_work_type {
QLA_EVT_AEN, QLA_EVT_AEN,
QLA_EVT_IDC_ACK,
}; };
...@@ -2149,6 +2150,10 @@ struct qla_work_evt { ...@@ -2149,6 +2150,10 @@ struct qla_work_evt {
enum fc_host_event_code code; enum fc_host_event_code code;
u32 data; u32 data;
} aen; } aen;
struct {
#define QLA_IDC_ACK_REGS 7
uint16_t mb[QLA_IDC_ACK_REGS];
} idc_ack;
} u; } u;
}; };
......
...@@ -72,7 +72,7 @@ static char *qla2x00_model_name[QLA_MODEL_NAMES*2] = { ...@@ -72,7 +72,7 @@ static char *qla2x00_model_name[QLA_MODEL_NAMES*2] = {
"QLA2462", "Sun PCI-X 2.0 to 4Gb FC, Dual Channel", /* 0x141 */ "QLA2462", "Sun PCI-X 2.0 to 4Gb FC, Dual Channel", /* 0x141 */
"QLE2460", "Sun PCI-Express to 2Gb FC, Single Channel", /* 0x142 */ "QLE2460", "Sun PCI-Express to 2Gb FC, Single Channel", /* 0x142 */
"QLE2462", "Sun PCI-Express to 4Gb FC, Single Channel", /* 0x143 */ "QLE2462", "Sun PCI-Express to 4Gb FC, Single Channel", /* 0x143 */
"QEM2462" "Server I/O Module 4Gb FC, Dual Channel", /* 0x144 */ "QEM2462", "Server I/O Module 4Gb FC, Dual Channel", /* 0x144 */
"QLE2440", "PCI-Express to 4Gb FC, Single Channel", /* 0x145 */ "QLE2440", "PCI-Express to 4Gb FC, Single Channel", /* 0x145 */
"QLE2464", "PCI-Express to 4Gb FC, Quad Channel", /* 0x146 */ "QLE2464", "PCI-Express to 4Gb FC, Quad Channel", /* 0x146 */
"QLA2440", "PCI-X 2.0 to 4Gb FC, Single Channel", /* 0x147 */ "QLA2440", "PCI-X 2.0 to 4Gb FC, Single Channel", /* 0x147 */
......
...@@ -1402,6 +1402,8 @@ struct access_chip_rsp_84xx { ...@@ -1402,6 +1402,8 @@ struct access_chip_rsp_84xx {
#define MBA_IDC_NOTIFY 0x8101 #define MBA_IDC_NOTIFY 0x8101
#define MBA_IDC_TIME_EXT 0x8102 #define MBA_IDC_TIME_EXT 0x8102
#define MBC_IDC_ACK 0x101
struct nvram_81xx { struct nvram_81xx {
/* NVRAM header. */ /* NVRAM header. */
uint8_t id[4]; uint8_t id[4];
......
...@@ -72,6 +72,7 @@ extern int qla2x00_loop_reset(scsi_qla_host_t *); ...@@ -72,6 +72,7 @@ extern int qla2x00_loop_reset(scsi_qla_host_t *);
extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int); extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int);
extern int qla2x00_post_aen_work(struct scsi_qla_host *, enum extern int qla2x00_post_aen_work(struct scsi_qla_host *, enum
fc_host_event_code, u32); fc_host_event_code, u32);
extern int qla2x00_post_idc_ack_work(struct scsi_qla_host *, uint16_t *);
extern void qla2x00_abort_fcport_cmds(fc_port_t *); extern void qla2x00_abort_fcport_cmds(fc_port_t *);
extern struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *, extern struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *,
...@@ -266,6 +267,8 @@ qla2x00_set_idma_speed(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t *); ...@@ -266,6 +267,8 @@ qla2x00_set_idma_speed(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t *);
extern int qla84xx_verify_chip(struct scsi_qla_host *, uint16_t *); extern int qla84xx_verify_chip(struct scsi_qla_host *, uint16_t *);
extern int qla81xx_idc_ack(scsi_qla_host_t *, uint16_t *);
/* /*
* Global Function Prototypes in qla_isr.c source file. * Global Function Prototypes in qla_isr.c source file.
*/ */
...@@ -376,10 +379,8 @@ extern int qla2x00_dfs_remove(scsi_qla_host_t *); ...@@ -376,10 +379,8 @@ extern int qla2x00_dfs_remove(scsi_qla_host_t *);
/* Globa function prototypes for multi-q */ /* Globa function prototypes for multi-q */
extern int qla25xx_request_irq(struct rsp_que *); extern int qla25xx_request_irq(struct rsp_que *);
extern int qla25xx_init_req_que(struct scsi_qla_host *, struct req_que *, extern int qla25xx_init_req_que(struct scsi_qla_host *, struct req_que *);
uint8_t); extern int qla25xx_init_rsp_que(struct scsi_qla_host *, struct rsp_que *);
extern int qla25xx_init_rsp_que(struct scsi_qla_host *, struct rsp_que *,
uint8_t);
extern int qla25xx_create_req_que(struct qla_hw_data *, uint16_t, uint8_t, extern int qla25xx_create_req_que(struct qla_hw_data *, uint16_t, uint8_t,
uint16_t, uint8_t, uint8_t); uint16_t, uint8_t, uint8_t);
extern int qla25xx_create_rsp_que(struct qla_hw_data *, uint16_t, uint8_t, extern int qla25xx_create_rsp_que(struct qla_hw_data *, uint16_t, uint8_t,
......
...@@ -1226,9 +1226,8 @@ qla24xx_config_rings(struct scsi_qla_host *vha) ...@@ -1226,9 +1226,8 @@ qla24xx_config_rings(struct scsi_qla_host *vha)
icb->firmware_options_2 |= icb->firmware_options_2 |=
__constant_cpu_to_le32(BIT_18); __constant_cpu_to_le32(BIT_18);
icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_22); icb->firmware_options_2 &= __constant_cpu_to_le32(~BIT_22);
icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_23); icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_23);
ha->rsp_q_map[0]->options = icb->firmware_options_2;
WRT_REG_DWORD(&reg->isp25mq.req_q_in, 0); WRT_REG_DWORD(&reg->isp25mq.req_q_in, 0);
WRT_REG_DWORD(&reg->isp25mq.req_q_out, 0); WRT_REG_DWORD(&reg->isp25mq.req_q_out, 0);
...@@ -3493,7 +3492,7 @@ qla25xx_init_queues(struct qla_hw_data *ha) ...@@ -3493,7 +3492,7 @@ qla25xx_init_queues(struct qla_hw_data *ha)
rsp = ha->rsp_q_map[i]; rsp = ha->rsp_q_map[i];
if (rsp) { if (rsp) {
rsp->options &= ~BIT_0; rsp->options &= ~BIT_0;
ret = qla25xx_init_rsp_que(base_vha, rsp, rsp->options); ret = qla25xx_init_rsp_que(base_vha, rsp);
if (ret != QLA_SUCCESS) if (ret != QLA_SUCCESS)
DEBUG2_17(printk(KERN_WARNING DEBUG2_17(printk(KERN_WARNING
"%s Rsp que:%d init failed\n", __func__, "%s Rsp que:%d init failed\n", __func__,
...@@ -3507,7 +3506,7 @@ qla25xx_init_queues(struct qla_hw_data *ha) ...@@ -3507,7 +3506,7 @@ qla25xx_init_queues(struct qla_hw_data *ha)
if (req) { if (req) {
/* Clear outstanding commands array. */ /* Clear outstanding commands array. */
req->options &= ~BIT_0; req->options &= ~BIT_0;
ret = qla25xx_init_req_que(base_vha, req, req->options); ret = qla25xx_init_req_que(base_vha, req);
if (ret != QLA_SUCCESS) if (ret != QLA_SUCCESS)
DEBUG2_17(printk(KERN_WARNING DEBUG2_17(printk(KERN_WARNING
"%s Req que:%d init failed\n", __func__, "%s Req que:%d init failed\n", __func__,
......
...@@ -266,6 +266,40 @@ qla2x00_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0) ...@@ -266,6 +266,40 @@ qla2x00_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
} }
} }
static void
qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr)
{
static char *event[] =
{ "Complete", "Request Notification", "Time Extension" };
int rval;
struct device_reg_24xx __iomem *reg24 = &vha->hw->iobase->isp24;
uint16_t __iomem *wptr;
uint16_t cnt, timeout, mb[QLA_IDC_ACK_REGS];
/* Seed data -- mailbox1 -> mailbox7. */
wptr = (uint16_t __iomem *)&reg24->mailbox1;
for (cnt = 0; cnt < QLA_IDC_ACK_REGS; cnt++, wptr++)
mb[cnt] = RD_REG_WORD(wptr);
DEBUG2(printk("scsi(%ld): Inter-Driver Commucation %s -- "
"%04x %04x %04x %04x %04x %04x %04x.\n", vha->host_no,
event[aen & 0xff],
mb[0], mb[1], mb[2], mb[3], mb[4], mb[5], mb[6]));
/* Acknowledgement needed? [Notify && non-zero timeout]. */
timeout = (descr >> 8) & 0xf;
if (aen != MBA_IDC_NOTIFY || !timeout)
return;
DEBUG2(printk("scsi(%ld): Inter-Driver Commucation %s -- "
"ACK timeout=%d.\n", vha->host_no, event[aen & 0xff], timeout));
rval = qla2x00_post_idc_ack_work(vha, mb);
if (rval != QLA_SUCCESS)
qla_printk(KERN_WARNING, vha->hw,
"IDC failed to post ACK.\n");
}
/** /**
* qla2x00_async_event() - Process aynchronous events. * qla2x00_async_event() - Process aynchronous events.
* @ha: SCSI driver HA context * @ha: SCSI driver HA context
...@@ -714,21 +748,9 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) ...@@ -714,21 +748,9 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
"%04x %04x %04x\n", vha->host_no, mb[1], mb[2], mb[3])); "%04x %04x %04x\n", vha->host_no, mb[1], mb[2], mb[3]));
break; break;
case MBA_IDC_COMPLETE: case MBA_IDC_COMPLETE:
DEBUG2(printk("scsi(%ld): Inter-Driver Commucation "
"Complete -- %04x %04x %04x\n", vha->host_no, mb[1], mb[2],
mb[3]));
break;
case MBA_IDC_NOTIFY: case MBA_IDC_NOTIFY:
DEBUG2(printk("scsi(%ld): Inter-Driver Commucation "
"Request Notification -- %04x %04x %04x\n", vha->host_no,
mb[1], mb[2], mb[3]));
/**** Mailbox registers 4 - 7 valid!!! */
break;
case MBA_IDC_TIME_EXT: case MBA_IDC_TIME_EXT:
DEBUG2(printk("scsi(%ld): Inter-Driver Commucation " qla81xx_idc_event(vha, mb[0], mb[1]);
"Time Extension -- %04x %04x %04x\n", vha->host_no, mb[1],
mb[2], mb[3]));
/**** Mailbox registers 4 - 7 valid!!! */
break; break;
} }
...@@ -1707,7 +1729,6 @@ qla25xx_msix_rsp_q(int irq, void *dev_id) ...@@ -1707,7 +1729,6 @@ qla25xx_msix_rsp_q(int irq, void *dev_id)
struct qla_hw_data *ha; struct qla_hw_data *ha;
struct rsp_que *rsp; struct rsp_que *rsp;
struct device_reg_24xx __iomem *reg; struct device_reg_24xx __iomem *reg;
uint16_t msix_disabled_hccr = 0;
rsp = (struct rsp_que *) dev_id; rsp = (struct rsp_que *) dev_id;
if (!rsp) { if (!rsp) {
...@@ -1720,17 +1741,8 @@ qla25xx_msix_rsp_q(int irq, void *dev_id) ...@@ -1720,17 +1741,8 @@ qla25xx_msix_rsp_q(int irq, void *dev_id)
spin_lock_irq(&ha->hardware_lock); spin_lock_irq(&ha->hardware_lock);
msix_disabled_hccr = rsp->options;
if (!rsp->id)
msix_disabled_hccr &= __constant_cpu_to_le32(BIT_22);
else
msix_disabled_hccr &= __constant_cpu_to_le32(BIT_6);
qla24xx_process_response_queue(rsp); qla24xx_process_response_queue(rsp);
if (!msix_disabled_hccr)
WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
spin_unlock_irq(&ha->hardware_lock); spin_unlock_irq(&ha->hardware_lock);
return IRQ_HANDLED; return IRQ_HANDLED;
......
...@@ -3090,8 +3090,7 @@ qla84xx_verify_chip(struct scsi_qla_host *vha, uint16_t *status) ...@@ -3090,8 +3090,7 @@ qla84xx_verify_chip(struct scsi_qla_host *vha, uint16_t *status)
} }
int int
qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req, qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
uint8_t options)
{ {
int rval; int rval;
unsigned long flags; unsigned long flags;
...@@ -3101,7 +3100,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req, ...@@ -3101,7 +3100,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req,
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
mcp->mb[0] = MBC_INITIALIZE_MULTIQ; mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
mcp->mb[1] = options; mcp->mb[1] = req->options;
mcp->mb[2] = MSW(LSD(req->dma)); mcp->mb[2] = MSW(LSD(req->dma));
mcp->mb[3] = LSW(LSD(req->dma)); mcp->mb[3] = LSW(LSD(req->dma));
mcp->mb[6] = MSW(MSD(req->dma)); mcp->mb[6] = MSW(MSD(req->dma));
...@@ -3128,7 +3127,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req, ...@@ -3128,7 +3127,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req,
mcp->tov = 60; mcp->tov = 60;
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
if (!(options & BIT_0)) { if (!(req->options & BIT_0)) {
WRT_REG_DWORD(&reg->req_q_in, 0); WRT_REG_DWORD(&reg->req_q_in, 0);
WRT_REG_DWORD(&reg->req_q_out, 0); WRT_REG_DWORD(&reg->req_q_out, 0);
} }
...@@ -3142,8 +3141,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req, ...@@ -3142,8 +3141,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req,
} }
int int
qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp, qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
uint8_t options)
{ {
int rval; int rval;
unsigned long flags; unsigned long flags;
...@@ -3153,7 +3151,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp, ...@@ -3153,7 +3151,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp,
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
mcp->mb[0] = MBC_INITIALIZE_MULTIQ; mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
mcp->mb[1] = options; mcp->mb[1] = rsp->options;
mcp->mb[2] = MSW(LSD(rsp->dma)); mcp->mb[2] = MSW(LSD(rsp->dma));
mcp->mb[3] = LSW(LSD(rsp->dma)); mcp->mb[3] = LSW(LSD(rsp->dma));
mcp->mb[6] = MSW(MSD(rsp->dma)); mcp->mb[6] = MSW(MSD(rsp->dma));
...@@ -3178,7 +3176,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp, ...@@ -3178,7 +3176,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp,
mcp->tov = 60; mcp->tov = 60;
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
if (!(options & BIT_0)) { if (!(rsp->options & BIT_0)) {
WRT_REG_DWORD(&reg->rsp_q_out, 0); WRT_REG_DWORD(&reg->rsp_q_out, 0);
WRT_REG_DWORD(&reg->rsp_q_in, 0); WRT_REG_DWORD(&reg->rsp_q_in, 0);
} }
...@@ -3193,3 +3191,29 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp, ...@@ -3193,3 +3191,29 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp,
return rval; return rval;
} }
int
qla81xx_idc_ack(scsi_qla_host_t *vha, uint16_t *mb)
{
int rval;
mbx_cmd_t mc;
mbx_cmd_t *mcp = &mc;
DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
mcp->mb[0] = MBC_IDC_ACK;
memcpy(&mcp->mb[1], mb, QLA_IDC_ACK_REGS * sizeof(uint16_t));
mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
mcp->in_mb = MBX_0;
mcp->tov = MBX_TOV_SECONDS;
mcp->flags = 0;
rval = qla2x00_mailbox_command(vha, mcp);
if (rval != QLA_SUCCESS) {
DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__,
vha->host_no, rval, mcp->mb[0]));
} else {
DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no));
}
return rval;
}
...@@ -396,7 +396,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport) ...@@ -396,7 +396,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
qla2x00_start_timer(vha, qla2x00_timer, WATCH_INTERVAL); qla2x00_start_timer(vha, qla2x00_timer, WATCH_INTERVAL);
memset(vha->req_ques, 0, sizeof(vha->req_ques) * QLA_MAX_HOST_QUES); memset(vha->req_ques, 0, sizeof(vha->req_ques));
vha->req_ques[0] = ha->req_q_map[0]->id; vha->req_ques[0] = ha->req_q_map[0]->id;
host->can_queue = ha->req_q_map[0]->length + 128; host->can_queue = ha->req_q_map[0]->length + 128;
host->this_id = 255; host->this_id = 255;
...@@ -471,7 +471,7 @@ qla25xx_delete_req_que(struct scsi_qla_host *vha, struct req_que *req) ...@@ -471,7 +471,7 @@ qla25xx_delete_req_que(struct scsi_qla_host *vha, struct req_que *req)
if (req) { if (req) {
req->options |= BIT_0; req->options |= BIT_0;
ret = qla25xx_init_req_que(vha, req, req->options); ret = qla25xx_init_req_que(vha, req);
} }
if (ret == QLA_SUCCESS) if (ret == QLA_SUCCESS)
qla25xx_free_req_que(vha, req); qla25xx_free_req_que(vha, req);
...@@ -486,7 +486,7 @@ qla25xx_delete_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) ...@@ -486,7 +486,7 @@ qla25xx_delete_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
if (rsp) { if (rsp) {
rsp->options |= BIT_0; rsp->options |= BIT_0;
ret = qla25xx_init_rsp_que(vha, rsp, rsp->options); ret = qla25xx_init_rsp_que(vha, rsp);
} }
if (ret == QLA_SUCCESS) if (ret == QLA_SUCCESS)
qla25xx_free_rsp_que(vha, rsp); qla25xx_free_rsp_que(vha, rsp);
...@@ -502,7 +502,7 @@ int qla25xx_update_req_que(struct scsi_qla_host *vha, uint8_t que, uint8_t qos) ...@@ -502,7 +502,7 @@ int qla25xx_update_req_que(struct scsi_qla_host *vha, uint8_t que, uint8_t qos)
req->options |= BIT_3; req->options |= BIT_3;
req->qos = qos; req->qos = qos;
ret = qla25xx_init_req_que(vha, req, req->options); ret = qla25xx_init_req_que(vha, req);
if (ret != QLA_SUCCESS) if (ret != QLA_SUCCESS)
DEBUG2_17(printk(KERN_WARNING "%s failed\n", __func__)); DEBUG2_17(printk(KERN_WARNING "%s failed\n", __func__));
/* restore options bit */ /* restore options bit */
...@@ -632,7 +632,7 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options, ...@@ -632,7 +632,7 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options,
req->max_q_depth = ha->req_q_map[0]->max_q_depth; req->max_q_depth = ha->req_q_map[0]->max_q_depth;
mutex_unlock(&ha->vport_lock); mutex_unlock(&ha->vport_lock);
ret = qla25xx_init_req_que(base_vha, req, options); ret = qla25xx_init_req_que(base_vha, req);
if (ret != QLA_SUCCESS) { if (ret != QLA_SUCCESS) {
qla_printk(KERN_WARNING, ha, "%s failed\n", __func__); qla_printk(KERN_WARNING, ha, "%s failed\n", __func__);
mutex_lock(&ha->vport_lock); mutex_lock(&ha->vport_lock);
...@@ -710,7 +710,7 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options, ...@@ -710,7 +710,7 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options,
if (ret) if (ret)
goto que_failed; goto que_failed;
ret = qla25xx_init_rsp_que(base_vha, rsp, options); ret = qla25xx_init_rsp_que(base_vha, rsp);
if (ret != QLA_SUCCESS) { if (ret != QLA_SUCCESS) {
qla_printk(KERN_WARNING, ha, "%s failed\n", __func__); qla_printk(KERN_WARNING, ha, "%s failed\n", __func__);
mutex_lock(&ha->vport_lock); mutex_lock(&ha->vport_lock);
......
...@@ -2522,6 +2522,19 @@ qla2x00_post_aen_work(struct scsi_qla_host *vha, enum fc_host_event_code code, ...@@ -2522,6 +2522,19 @@ qla2x00_post_aen_work(struct scsi_qla_host *vha, enum fc_host_event_code code,
return qla2x00_post_work(vha, e, 1); return qla2x00_post_work(vha, e, 1);
} }
int
qla2x00_post_idc_ack_work(struct scsi_qla_host *vha, uint16_t *mb)
{
struct qla_work_evt *e;
e = qla2x00_alloc_work(vha, QLA_EVT_IDC_ACK, 1);
if (!e)
return QLA_FUNCTION_FAILED;
memcpy(e->u.idc_ack.mb, mb, QLA_IDC_ACK_REGS * sizeof(uint16_t));
return qla2x00_post_work(vha, e, 1);
}
static void static void
qla2x00_do_work(struct scsi_qla_host *vha) qla2x00_do_work(struct scsi_qla_host *vha)
{ {
...@@ -2539,6 +2552,9 @@ qla2x00_do_work(struct scsi_qla_host *vha) ...@@ -2539,6 +2552,9 @@ qla2x00_do_work(struct scsi_qla_host *vha)
fc_host_post_event(vha->host, fc_get_event_number(), fc_host_post_event(vha->host, fc_get_event_number(),
e->u.aen.code, e->u.aen.data); e->u.aen.code, e->u.aen.data);
break; break;
case QLA_EVT_IDC_ACK:
qla81xx_idc_ack(vha, e->u.idc_ack.mb);
break;
} }
if (e->flags & QLA_EVT_FLAG_FREE) if (e->flags & QLA_EVT_FLAG_FREE)
kfree(e); kfree(e);
......
...@@ -684,7 +684,7 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) ...@@ -684,7 +684,7 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
"end=0x%x size=0x%x.\n", le32_to_cpu(region->code), start, "end=0x%x size=0x%x.\n", le32_to_cpu(region->code), start,
le32_to_cpu(region->end) >> 2, le32_to_cpu(region->size))); le32_to_cpu(region->end) >> 2, le32_to_cpu(region->size)));
switch (le32_to_cpu(region->code)) { switch (le32_to_cpu(region->code) & 0xff) {
case FLT_REG_FW: case FLT_REG_FW:
ha->flt_region_fw = start; ha->flt_region_fw = start;
break; break;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
/* /*
* Driver version * Driver version
*/ */
#define QLA2XXX_VERSION "8.03.00-k2" #define QLA2XXX_VERSION "8.03.00-k3"
#define QLA_DRIVER_MAJOR_VER 8 #define QLA_DRIVER_MAJOR_VER 8
#define QLA_DRIVER_MINOR_VER 3 #define QLA_DRIVER_MINOR_VER 3
......
...@@ -317,6 +317,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, ...@@ -317,6 +317,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
return sdev; return sdev;
out_device_destroy: out_device_destroy:
scsi_device_set_state(sdev, SDEV_DEL);
transport_destroy_device(&sdev->sdev_gendev); transport_destroy_device(&sdev->sdev_gendev);
put_device(&sdev->sdev_gendev); put_device(&sdev->sdev_gendev);
out: out:
......
...@@ -1078,7 +1078,7 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -1078,7 +1078,7 @@ sg_ioctl(struct inode *inode, struct file *filp,
case BLKTRACESETUP: case BLKTRACESETUP:
return blk_trace_setup(sdp->device->request_queue, return blk_trace_setup(sdp->device->request_queue,
sdp->disk->disk_name, sdp->disk->disk_name,
sdp->device->sdev_gendev.devt, MKDEV(SCSI_GENERIC_MAJOR, sdp->index),
(char *)arg); (char *)arg);
case BLKTRACESTART: case BLKTRACESTART:
return blk_trace_startstop(sdp->device->request_queue, 1); return blk_trace_startstop(sdp->device->request_queue, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment