summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_os.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_os.c')
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c282
1 files changed, 40 insertions, 242 deletions
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index d0aa1883154..2b6104daacb 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -75,11 +75,6 @@ MODULE_PARM_DESC(ql2xretrycount,
"Maximum number of mid-layer retries allowed for a command. "
"Default value is 20, ");
-int displayConfig;
-module_param(displayConfig, int, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(displayConfig,
- "If 1 then display the configuration used in /etc/modprobe.conf.");
-
int ql2xplogiabsentdevice;
module_param(ql2xplogiabsentdevice, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(ql2xplogiabsentdevice,
@@ -119,12 +114,6 @@ MODULE_PARM_DESC(ql2xsuspendcount,
"target returns a <NOT READY> status. Default is 10 "
"iterations.");
-int ql2xdoinitscan = 1;
-module_param(ql2xdoinitscan, int, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(ql2xdoinitscan,
- "Signal mid-layer to perform scan after driver load: 0 -- no "
- "signal sent to mid-layer.");
-
int ql2xloginretrycount = 0;
module_param(ql2xloginretrycount, int, S_IRUGO|S_IRUSR);
MODULE_PARM_DESC(ql2xloginretrycount,
@@ -195,8 +184,6 @@ static struct scsi_host_template qla2x00_driver_template = {
static struct scsi_transport_template *qla2xxx_transport_template = NULL;
-static void qla2x00_display_fc_names(scsi_qla_host_t *);
-
/* TODO Convert to inlines
*
* Timer routines
@@ -332,14 +319,11 @@ static int
qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
{
scsi_qla_host_t *ha = to_qla_host(cmd->device->host);
- os_tgt_t *tq = (os_tgt_t *) cmd->device->hostdata;
- fc_port_t *fcport = tq->fcport;
- os_lun_t *lq;
+ fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata;
srb_t *sp;
int rval;
- lq = GET_LU_Q(ha, cmd->device->id, cmd->device->lun);
- if (!fcport || !lq) {
+ if (!fcport) {
cmd->result = DID_NO_CONNECT << 16;
goto qc_fail_command;
}
@@ -361,13 +345,8 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
}
sp->ha = ha;
+ sp->fcport = fcport;
sp->cmd = cmd;
- sp->tgt_queue = tq;
-
- sp->lun_queue = lq;
- lq->io_cnt++;
- sp->fclun = lq->fclun;
-
sp->flags = 0;
sp->err_id = 0;
@@ -677,9 +656,7 @@ int
qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
{
scsi_qla_host_t *ha = to_qla_host(cmd->device->host);
- os_tgt_t *tq = (os_tgt_t *) cmd->device->hostdata;
- fc_port_t *fcport = tq->fcport;
- os_lun_t *lq;
+ fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata;
srb_t *sp;
int ret;
unsigned int id, lun;
@@ -692,8 +669,7 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
serial = cmd->serial_number;
sp = (srb_t *) CMD_SP(cmd);
- lq = GET_LU_Q(ha, id, lun);
- if (!sp || !fcport || !lq)
+ if (!sp || !fcport)
return ret;
qla_printk(KERN_INFO, ha,
@@ -826,9 +802,7 @@ int
qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd)
{
scsi_qla_host_t *ha = to_qla_host(cmd->device->host);
- os_tgt_t *tq = (os_tgt_t *) cmd->device->hostdata;
- fc_port_t *fcport = tq->fcport;
- os_lun_t *lq;
+ fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata;
srb_t *sp;
int ret;
unsigned int id, lun;
@@ -841,8 +815,7 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd)
serial = cmd->serial_number;
sp = (srb_t *) CMD_SP(cmd);
- lq = GET_LU_Q(ha, id, lun);
- if (!sp || !fcport || !lq)
+ if (!sp || !fcport)
return ret;
qla_printk(KERN_INFO, ha,
@@ -895,9 +868,7 @@ int
qla2xxx_eh_host_reset(struct scsi_cmnd *cmd)
{
scsi_qla_host_t *ha = to_qla_host(cmd->device->host);
- os_tgt_t *tq = (os_tgt_t *) cmd->device->hostdata;
- fc_port_t *fcport = tq->fcport;
- os_lun_t *lq;
+ fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata;
srb_t *sp;
int ret;
unsigned int id, lun;
@@ -910,8 +881,7 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd)
serial = cmd->serial_number;
sp = (srb_t *) CMD_SP(cmd);
- lq = GET_LU_Q(ha, id, lun);
- if (!sp || !fcport || !lq)
+ if (!sp || !fcport)
return ret;
qla_printk(KERN_INFO, ha,
@@ -969,25 +939,20 @@ static int
qla2x00_loop_reset(scsi_qla_host_t *ha)
{
int status = QLA_SUCCESS;
- uint16_t t;
- os_tgt_t *tq;
+ struct fc_port *fcport;
if (ha->flags.enable_lip_reset) {
status = qla2x00_lip_reset(ha);
}
if (status == QLA_SUCCESS && ha->flags.enable_target_reset) {
- for (t = 0; t < MAX_FIBRE_DEVICES; t++) {
- if ((tq = TGT_Q(ha, t)) == NULL)
- continue;
-
- if (tq->fcport == NULL)
+ list_for_each_entry(fcport, &ha->fcports, list) {
+ if (fcport->port_type != FCT_TARGET)
continue;
- status = qla2x00_target_reset(ha, 0, t);
- if (status != QLA_SUCCESS) {
+ status = qla2x00_target_reset(ha, fcport);
+ if (status != QLA_SUCCESS)
break;
- }
}
}
@@ -1041,15 +1006,26 @@ static int
qla2xxx_slave_alloc(struct scsi_device *sdev)
{
scsi_qla_host_t *ha = to_qla_host(sdev->host);
- os_tgt_t *tq;
+ struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
+ fc_port_t *fcport;
+ int found;
- tq = (os_tgt_t *) TGT_Q(ha, sdev->id);
- if (!tq)
+ if (!rport)
return -ENXIO;
- if (!tq->fcport)
+
+ found = 0;
+ list_for_each_entry(fcport, &ha->fcports, list) {
+ if (rport->port_name ==
+ be64_to_cpu(*(uint64_t *)fcport->port_name)) {
+ found++;
+ break;
+ }
+
+ }
+ if (!found)
return -ENXIO;
- sdev->hostdata = tq;
+ sdev->hostdata = fcport;
return 0;
}
@@ -1330,6 +1306,7 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
}
qla2x00_init_host_attr(ha);
+
/*
* Startup the kernel thread for this host adapter
*/
@@ -1406,11 +1383,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
ha->flags.init_done = 1;
num_hosts++;
- /* List the target we have found */
- if (displayConfig) {
- qla2x00_display_fc_names(ha);
- }
-
qla_printk(KERN_INFO, ha, "\n"
" QLogic Fibre Channel HBA Driver: %s\n"
" QLogic %s - %s\n"
@@ -1427,6 +1399,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
return 0;
probe_failed:
+ fc_remove_host(ha->host);
+
scsi_remove_host(host);
probe_alloc_failed:
@@ -1449,6 +1423,8 @@ void qla2x00_remove_one(struct pci_dev *pdev)
qla2x00_free_sysfs_attr(ha);
+ fc_remove_host(ha->host);
+
scsi_remove_host(ha->host);
qla2x00_free_device(ha);
@@ -1581,9 +1557,6 @@ qla2x00_proc_info(struct Scsi_Host *shost, char *buffer,
{
struct info_str info;
int retval = -EINVAL;
- os_lun_t *up;
- os_tgt_t *tq;
- unsigned int t, l;
uint32_t tmp_sn;
uint32_t *flags;
uint8_t *loop_state;
@@ -1737,79 +1710,6 @@ qla2x00_proc_info(struct Scsi_Host *shost, char *buffer,
ha->init_cb->port_name[6],
ha->init_cb->port_name[7]);
- /* Print out device port names */
- for (t = 0; t < MAX_FIBRE_DEVICES; t++) {
- if ((tq = TGT_Q(ha, t)) == NULL)
- continue;
-
- copy_info(&info,
- "scsi-qla%d-target-%d="
- "%02x%02x%02x%02x%02x%02x%02x%02x;\n",
- (int)ha->instance, t,
- tq->port_name[0], tq->port_name[1],
- tq->port_name[2], tq->port_name[3],
- tq->port_name[4], tq->port_name[5],
- tq->port_name[6], tq->port_name[7]);
- }
-
- copy_info(&info, "\nSCSI LUN Information:\n");
- copy_info(&info,
- "(Id:Lun) * - indicates lun is not registered with the OS.\n");
-
- /* scan for all equipment stats */
- for (t = 0; t < MAX_FIBRE_DEVICES; t++) {
- /* scan all luns */
- for (l = 0; l < ha->max_luns; l++) {
- up = (os_lun_t *) GET_LU_Q(ha, t, l);
-
- if (up == NULL) {
- continue;
- }
- if (up->fclun == NULL) {
- continue;
- }
-
- copy_info(&info,
- "(%2d:%2d): Total reqs %ld,",
- t,l,up->io_cnt);
-
- copy_info(&info,
- " Pending reqs %ld,",
- up->out_cnt);
-
- if (up->io_cnt < 4) {
- copy_info(&info,
- " flags 0x%x*,",
- (int)up->q_flag);
- } else {
- copy_info(&info,
- " flags 0x%x,",
- (int)up->q_flag);
- }
-
- copy_info(&info,
- " %ld:%d:%02x %02x",
- up->fclun->fcport->ha->instance,
- up->fclun->fcport->cur_path,
- up->fclun->fcport->loop_id,
- up->fclun->device_type);
-
- copy_info(&info, "\n");
-
- if (info.pos >= info.offset + info.length) {
- /* No need to continue */
- goto profile_stop;
- }
- }
-
- if (info.pos >= info.offset + info.length) {
- /* No need to continue */
- break;
- }
- }
-
-profile_stop:
-
retval = info.pos > info.offset ? info.pos - info.offset : 0;
DEBUG3(printk(KERN_INFO
@@ -1820,95 +1720,6 @@ profile_stop:
}
/*
-* qla2x00_display_fc_names
-* This routine will the node names of the different devices found
-* after port inquiry.
-*
-* Input:
-* cmd = SCSI command structure
-*
-* Returns:
-* None.
-*/
-static void
-qla2x00_display_fc_names(scsi_qla_host_t *ha)
-{
- uint16_t tgt;
- os_tgt_t *tq;
-
- /* Display the node name for adapter */
- qla_printk(KERN_INFO, ha,
- "scsi-qla%d-adapter-node=%02x%02x%02x%02x%02x%02x%02x%02x\\;\n",
- (int)ha->instance,
- ha->init_cb->node_name[0],
- ha->init_cb->node_name[1],
- ha->init_cb->node_name[2],
- ha->init_cb->node_name[3],
- ha->init_cb->node_name[4],
- ha->init_cb->node_name[5],
- ha->init_cb->node_name[6],
- ha->init_cb->node_name[7]);
-
- /* display the port name for adapter */
- qla_printk(KERN_INFO, ha,
- "scsi-qla%d-adapter-port=%02x%02x%02x%02x%02x%02x%02x%02x\\;\n",
- (int)ha->instance,
- ha->init_cb->port_name[0],
- ha->init_cb->port_name[1],
- ha->init_cb->port_name[2],
- ha->init_cb->port_name[3],
- ha->init_cb->port_name[4],
- ha->init_cb->port_name[5],
- ha->init_cb->port_name[6],
- ha->init_cb->port_name[7]);
-
- /* Print out device port names */
- for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
- if ((tq = ha->otgt[tgt]) == NULL)
- continue;
-
- if (tq->fcport == NULL)
- continue;
-
- switch (ha->binding_type) {
- case BIND_BY_PORT_NAME:
- qla_printk(KERN_INFO, ha,
- "scsi-qla%d-tgt-%d-di-0-port="
- "%02x%02x%02x%02x%02x%02x%02x%02x\\;\n",
- (int)ha->instance,
- tgt,
- tq->port_name[0],
- tq->port_name[1],
- tq->port_name[2],
- tq->port_name[3],
- tq->port_name[4],
- tq->port_name[5],
- tq->port_name[6],
- tq->port_name[7]);
-
- break;
-
- case BIND_BY_PORT_ID:
- qla_printk(KERN_INFO, ha,
- "scsi-qla%d-tgt-%d-di-0-pid="
- "%02x%02x%02x\\;\n",
- (int)ha->instance,
- tgt,
- tq->d_id.b.domain,
- tq->d_id.b.area,
- tq->d_id.b.al_pa);
- break;
- }
-
-#if VSA
- qla_printk(KERN_INFO, ha,
- "scsi-qla%d-target-%d-vsa=01;\n", (int)ha->instance, tgt);
-#endif
- }
-}
-
-
-/*
* qla2x00_mark_device_lost Updates fcport state when device goes offline.
*
* Input: ha = adapter block pointer. fcport = port structure pointer.
@@ -2199,11 +2010,8 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha)
static void
qla2x00_mem_free(scsi_qla_host_t *ha)
{
- uint32_t t;
struct list_head *fcpl, *fcptemp;
fc_port_t *fcport;
- struct list_head *fcll, *fcltemp;
- fc_lun_t *fclun;
unsigned long wtime;/* max wait time if mbx cmd is busy. */
if (ha == NULL) {
@@ -2212,11 +2020,6 @@ qla2x00_mem_free(scsi_qla_host_t *ha)
return;
}
- /* Free the target queues */
- for (t = 0; t < MAX_TARGETS; t++) {
- qla2x00_tgt_free(ha, t);
- }
-
/* Make sure all other threads are stopped. */
wtime = 60 * HZ;
while (ha->dpc_wait && wtime) {
@@ -2295,14 +2098,6 @@ qla2x00_mem_free(scsi_qla_host_t *ha)
list_for_each_safe(fcpl, fcptemp, &ha->fcports) {
fcport = list_entry(fcpl, fc_port_t, list);
- /* fc luns */
- list_for_each_safe(fcll, fcltemp, &fcport->fcluns) {
- fclun = list_entry(fcll, fc_lun_t, list);
-
- list_del_init(&fclun->list);
- kfree(fclun);
- }
-
/* fc ports */
list_del_init(&fcport->list);
kfree(fcport);
@@ -2648,6 +2443,7 @@ qla2x00_sp_compl(scsi_qla_host_t *ha, srb_t *sp)
cmd->scsi_done(cmd);
}
+
/**************************************************************************
* qla2x00_timer
*
@@ -2713,11 +2509,13 @@ qla2x00_timer(scsi_qla_host_t *ha)
spin_lock_irqsave(&ha->hardware_lock, cpu_flags);
for (index = 1; index < MAX_OUTSTANDING_COMMANDS;
index++) {
+ fc_port_t *sfcp;
+
sp = ha->outstanding_cmds[index];
if (!sp)
continue;
- if (!(sp->fclun->fcport->flags &
- FCF_TAPE_PRESENT))
+ sfcp = sp->fcport;
+ if (!(sfcp->flags & FCF_TAPE_PRESENT))
continue;
set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);