All of lore.kernel.org
 help / color / mirror / Atom feed
* PATCH [0/5]  qla2xxx: remote port rework...
@ 2005-04-13 19:15 Andrew Vasquez
  2005-04-13 19:18 ` PATCH [1/5] qla2xxx: remove internal queuing Andrew Vasquez
                   ` (6 more replies)
  0 siblings, 7 replies; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-13 19:15 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley; +Cc: Andrew Vasquez


All,

With the remote port patches in the pipeline for 2.6.12, I'd like to
submit the following set of qla2xxx patches which strip many of the
legacy features from the driver.  Again, these 'features' have been
superceded in functionality and simplicity by additions present with
fc_rports.

Here's the breakdown of patches being submitted:

1) Remove internal command queuing.  This entails removal of the
   driver's *_queue lists as well as modifications and removal of
   routines which used them.  With the queuing removed -- the
   driver will be unable to tolerate cable-pulls.  Thus we depend
   on the next patch for support.

2) Add initial support for FC remote port infrastructure.

3) Remove internal lun discovery routines and support structures.
   The mid-layer has a more exhaustive and fully capable set of
   functions for lun discovery.

4) Clean-up DMA mappings -- patch originally submitted by
   Doug Ledford <dledford@redhat.com>.

	Don't use cmd->request->nr_hw_segments as it may not be initialized
	(SG_IO in particular bypasses anything that initializes this and just
	uses scsi_do_req to insert a scsi_request directly on the head of the
	queue) and a bogus value here can trip up the checks to make sure that
	the number of segments will fit in the queue ring buffer, resulting in
	commands that are never completed.

	Fix up several issues with PCI DMA mapping and failure to check return
	values on the mappings.

	Make the check for space in the ring buffer happen after the DMA mapping
	is done since any checks done before the mapping has taken place are
	bogus.

5) Remove /proc support.


Other patches in the queue:

a) Complete fc_host attributes support.

b) Support new queue-depth operations (via change_queue_depth()).

c) additional hardware (ISP) support.

d) Additional dusting and scrubbing: unused functions and structures
   left over from the cleanup.

e) firmware loading via request_firmware() infrastructure.

f) lock simplification and consolidation.


Regards,
Andrew Vasquez
QLogic Corporation

^ permalink raw reply	[flat|nested] 25+ messages in thread

* PATCH [1/5]  qla2xxx: remove internal queuing...
  2005-04-13 19:15 PATCH [0/5] qla2xxx: remote port rework Andrew Vasquez
@ 2005-04-13 19:18 ` Andrew Vasquez
  2005-04-13 19:18 ` PATCH [2/5] qla2xxx: add remote port codes Andrew Vasquez
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-13 19:18 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley; +Cc: Andrew Vasquez

  Remove internal command queuing from the driver.  As is, this
  driver cannot tolerate cable-pulls as I/Os will begin to fail
  by the upper layers.

     o Should be used in conjuction with the
       11-fc_rport_adds_2.diff patch.
     o Removes qla_listops.h file -- no longer needed.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

 drivers/scsi/qla2xxx/qla_def.h     |   22 
 drivers/scsi/qla2xxx/qla_gbl.h     |    6 
 drivers/scsi/qla2xxx/qla_init.c    |  106 --
 drivers/scsi/qla2xxx/qla_iocb.c    |   13 
 drivers/scsi/qla2xxx/qla_isr.c     |  147 --
 drivers/scsi/qla2xxx/qla_listops.h |  351 ------
 drivers/scsi/qla2xxx/qla_os.c      | 1900 +++++--------------------------------
 7 files changed, 269 insertions(+), 2276 deletions(-)

--- a/drivers/scsi/qla2xxx/qla_def.h	2005-04-12 15:18:03.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_def.h	2005-04-13 08:38:23.000000000 -0700
@@ -2175,27 +2175,6 @@ typedef struct scsi_qla_host {
 	uint32_t	current_outstanding_cmd; 
 	srb_t		*status_srb;	/* Status continuation entry. */
 
-	/*
-	 * Need to hold the list_lock with irq's disabled in order to access
-	 * the following list.
-	 *
-	 * This list_lock is of lower priority than the host_lock.
-	 */
-	spinlock_t		list_lock ____cacheline_aligned;
-						/* lock to guard lists which
-						 * hold srb_t's */
-        struct list_head        retry_queue;    /* watchdog queue */
-        struct list_head        done_queue;     /* job on done queue */
-        struct list_head        failover_queue; /* failover list link. */
-	struct list_head        scsi_retry_queue;     /* SCSI retry queue */
-	struct list_head        pending_queue;	/* SCSI command pending queue */
-
-	unsigned long    done_q_cnt;
-	unsigned long    pending_in_q;
-        uint32_t	retry_q_cnt; 
-        uint32_t	scsi_retry_q_cnt; 
-        uint32_t	failover_cnt; 
-
 	unsigned long	last_irq_cpu;	/* cpu where we got our last irq */
 
 	uint16_t           revision;
@@ -2479,7 +2458,6 @@ struct _qla2x00stats  {
 #include "qla_gbl.h"
 #include "qla_dbg.h"
 #include "qla_inline.h"
-#include "qla_listops.h"
 
 /*
 * String arrays
--- a/drivers/scsi/qla2xxx/qla_gbl.h	2005-04-12 15:18:03.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_gbl.h	2005-04-13 08:38:23.000000000 -0700
@@ -74,6 +74,7 @@ extern int ql2xsuspendcount;
 #if defined(MODULE)
 extern char *ql2xopts;
 #endif
+extern void qla2x00_sp_compl(scsi_qla_host_t *, srb_t *);
 
 extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *);
 
@@ -82,17 +83,12 @@ extern void qla2x00_cmd_timeout(srb_t *)
 extern int __qla2x00_suspend_lun(scsi_qla_host_t *, os_lun_t *, int, int, int);
 
 extern void qla2x00_done(scsi_qla_host_t *);
-extern void qla2x00_next(scsi_qla_host_t *);
 extern void qla2x00_flush_failover_q(scsi_qla_host_t *, os_lun_t *);
 extern void qla2x00_reset_lun_fo_counts(scsi_qla_host_t *, os_lun_t *);
 
-extern void qla2x00_extend_timeout(struct scsi_cmnd *, int);
-
 extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int);
 extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *);
 
-extern void qla2x00_abort_queues(scsi_qla_host_t *, uint8_t);
-
 extern void qla2x00_blink_led(scsi_qla_host_t *);
 
 extern int qla2x00_down_timeout(struct semaphore *, unsigned long);
--- a/drivers/scsi/qla2xxx/qla_init.c	2005-04-12 15:18:03.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_init.c	2005-04-13 08:38:23.000000000 -0700
@@ -3146,7 +3146,6 @@ qla2x00_loop_resync(scsi_qla_host_t *ha)
 				wait_time &&
 				(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)));
 		}
-		qla2x00_restart_queues(ha, 1);
 	}
 
 	if (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) {
@@ -3160,87 +3159,6 @@ qla2x00_loop_resync(scsi_qla_host_t *ha)
 	return (rval);
 }
 
-/*
- *  qla2x00_restart_queues
- *	Restart device queues.
- *
- * Input:
- *	ha = adapter block pointer.
- *
- * Context:
- *	Kernel/Interrupt context.
- */
-void
-qla2x00_restart_queues(scsi_qla_host_t *ha, uint8_t flush) 
-{
-	srb_t  		*sp;
-	int		retry_q_cnt = 0;
-	int		pending_q_cnt = 0;
-	struct list_head *list, *temp;
-	unsigned long flags = 0;
-
-	clear_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags);
-
-	/* start pending queue */
-	pending_q_cnt = ha->qthreads;
-	if (flush) {
-		spin_lock_irqsave(&ha->list_lock,flags);
-		list_for_each_safe(list, temp, &ha->pending_queue) {
-			sp = list_entry(list, srb_t, list);
-
-			if ((sp->flags & SRB_TAPE))
-				continue;
-			 
-			/* 
-			 * When time expire return request back to OS as BUSY 
-			 */
-			__del_from_pending_queue(ha, sp);
-			sp->cmd->result = DID_BUS_BUSY << 16;
-			sp->cmd->host_scribble = (unsigned char *)NULL;
-			__add_to_done_queue(ha, sp);
-		}
-		spin_unlock_irqrestore(&ha->list_lock, flags);
-	} else {
-		if (!list_empty(&ha->pending_queue))
-			qla2x00_next(ha);
-	}
-
-	/*
-	 * Clear out our retry queue
-	 */
-	if (flush) {
-		spin_lock_irqsave(&ha->list_lock, flags);
-		retry_q_cnt = ha->retry_q_cnt;
-		list_for_each_safe(list, temp, &ha->retry_queue) {
-			sp = list_entry(list, srb_t, list);
-			/* when time expire return request back to OS as BUSY */
-			__del_from_retry_queue(ha, sp);
-			sp->cmd->result = DID_BUS_BUSY << 16;
-			sp->cmd->host_scribble = (unsigned char *)NULL;
-			__add_to_done_queue(ha, sp);
-		}
-		spin_unlock_irqrestore(&ha->list_lock, flags);
-
-		DEBUG2(printk("%s(%ld): callback %d commands.\n",
-				__func__,
-				ha->host_no,
-				retry_q_cnt);)
-	}
-
-	DEBUG2(printk("%s(%ld): active=%ld, retry=%d, pending=%d, "
-			"done=%ld, scsi retry=%d commands.\n",
-			__func__,
-			ha->host_no,
-			ha->actthreads,
-			ha->retry_q_cnt,
-			pending_q_cnt,
-			ha->done_q_cnt,
-			ha->scsi_retry_q_cnt);)
-
-	if (!list_empty(&ha->done_queue))
-		qla2x00_done(ha);
-}
-
 void
 qla2x00_rescan_fcports(scsi_qla_host_t *ha)
 {
@@ -3699,24 +3617,10 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
 					ha->actthreads--;
 				sp->lun_queue->out_cnt--;
 
-				/*
-				 * Set the cmd host_byte status depending on
-				 * whether the scsi_error_handler is
-				 * active or not.
- 				 */
-				if (sp->flags & SRB_TAPE) {
-					sp->cmd->result = DID_NO_CONNECT << 16;
-				} else {
-					if (ha->host->eh_active != EH_ACTIVE)
-						sp->cmd->result =
-						    DID_BUS_BUSY << 16;
-					else
-						sp->cmd->result =
-						    DID_RESET << 16;
-				}
 				sp->flags = 0;
+				sp->cmd->result = DID_RESET << 16;
 				sp->cmd->host_scribble = (unsigned char *)NULL;
-				add_to_done_queue(ha, sp);
+				qla2x00_sp_compl(ha, sp);
 			}
 		}
 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
@@ -3739,11 +3643,6 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
 			/* Enable ISP interrupts. */
 			qla2x00_enable_intrs(ha);
 
-			/* v2.19.5b6 Return all commands */
-			qla2x00_abort_queues(ha, 1);
-
-			/* Restart queues that may have been stopped. */
-			qla2x00_restart_queues(ha, 1);
 			ha->isp_abort_cnt = 0; 
 			clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags);
 		} else {	/* failed the ISP abort */
@@ -3758,7 +3657,6 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
 					 * completely.
 					 */
 					qla2x00_reset_adapter(ha);
-					qla2x00_abort_queues(ha, 0);
 					ha->flags.online = 0;
 					clear_bit(ISP_ABORT_RETRY,
 					    &ha->dpc_flags);
--- a/drivers/scsi/qla2xxx/qla_iocb.c	2005-04-12 15:18:03.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_iocb.c	2005-04-13 08:38:23.000000000 -0700
@@ -334,7 +334,6 @@ qla2x00_start_scsi(srb_t *sp)
 	uint32_t        index;
 	uint32_t	handle;
 	cmd_entry_t	*cmd_pkt;
-	uint32_t        timeout;
 	struct scatterlist *sg;
 	uint16_t	cnt;
 	uint16_t	req_cnt;
@@ -433,18 +432,6 @@ qla2x00_start_scsi(srb_t *sp)
 		}
 	}
 
-	/*
-	 * Allocate at least 5 (+ QLA_CMD_TIMER_DELTA) seconds for RISC timeout.
-	 */
-	timeout = (uint32_t)(cmd->timeout_per_command / HZ);
-	if (timeout > 65535)
-		cmd_pkt->timeout = __constant_cpu_to_le16(0);
-	else if (timeout > 25)
-		cmd_pkt->timeout = cpu_to_le16((uint16_t)timeout -
-		    (5 + QLA_CMD_TIMER_DELTA));
-	else
-		cmd_pkt->timeout = cpu_to_le16((uint16_t)timeout);
-
 	/* Load SCSI command packet. */
 	memcpy(cmd_pkt->scsi_cdb, cmd->cmnd, cmd->cmd_len);
 	cmd_pkt->byte_count = cpu_to_le32((uint32_t)cmd->request_bufflen);
--- a/drivers/scsi/qla2xxx/qla_isr.c	2005-04-12 15:18:03.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_isr.c	2005-04-13 08:38:23.000000000 -0700
@@ -27,8 +27,6 @@ static void qla2x00_status_cont_entry(sc
 static void qla2x00_error_entry(scsi_qla_host_t *, sts_entry_t *);
 static void qla2x00_ms_entry(scsi_qla_host_t *, ms_iocb_entry_t *);
 
-static int qla2x00_check_sense(struct scsi_cmnd *cp, os_lun_t *);
-
 /**
  * qla2100_intr_handler() - Process interrupts for the ISP2100 and ISP2200.
  * @irq:
@@ -93,7 +91,6 @@ qla2100_intr_handler(int irq, void *dev_
 	}
 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
-	qla2x00_next(ha);
 	ha->last_irq_cpu = _smp_processor_id();
 	ha->total_isr_cnt++;
 
@@ -107,9 +104,6 @@ qla2100_intr_handler(int irq, void *dev_
 		spin_unlock_irqrestore(&ha->mbx_reg_lock, flags);
 	}
 
-	if (!list_empty(&ha->done_queue))
-		qla2x00_done(ha);
-
 	return (IRQ_HANDLED);
 }
 
@@ -206,7 +200,6 @@ qla2300_intr_handler(int irq, void *dev_
 	}
 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
-	qla2x00_next(ha);
 	ha->last_irq_cpu = _smp_processor_id();
 	ha->total_isr_cnt++;
 
@@ -220,9 +213,6 @@ qla2300_intr_handler(int irq, void *dev_
 		spin_unlock_irqrestore(&ha->mbx_reg_lock, flags);
 	}
 
-	if (!list_empty(&ha->done_queue))
-		qla2x00_done(ha);
-
 	return (IRQ_HANDLED);
 }
 
@@ -714,7 +704,7 @@ qla2x00_process_completed_request(struct
 		/* Save ISP completion status */
 		sp->cmd->result = DID_OK << 16;
 		sp->fo_retry_cnt = 0;
-		add_to_done_queue(ha, sp);
+		qla2x00_sp_compl(ha, sp);
 	} else {
 		DEBUG2(printk("scsi(%ld): Invalid ISP SCSI completion handle\n",
 		    ha->host_no));
@@ -914,24 +904,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 	tq = sp->tgt_queue;
 	lq = sp->lun_queue;
 
-	/*
-	 * If loop is in transient state Report DID_BUS_BUSY
-	 */
-	if ((comp_status != CS_COMPLETE || scsi_status != 0)) {
-		if (!(sp->flags & (SRB_IOCTL | SRB_TAPE)) &&
-		    (atomic_read(&ha->loop_down_timer) ||
-			atomic_read(&ha->loop_state) != LOOP_READY)) {
-
-			DEBUG2(printk("scsi(%ld:%d:%d:%d): Loop Not Ready - "
-			    "pid=%lx.\n",
-			    ha->host_no, b, t, l, cp->serial_number));
-
-			qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT);
-			add_to_retry_queue(ha, sp);
-			return;
-		}
-	}
-
 	/* Check for any FCP transport errors. */
 	if (scsi_status & SS_RESPONSE_INFO_LEN_VALID) {
 		rsp_info_len = le16_to_cpu(pkt->rsp_info_len);
@@ -945,7 +917,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 			    pkt->rsp_info[6], pkt->rsp_info[7]));
 
 			cp->result = DID_BUS_BUSY << 16;
-			add_to_done_queue(ha, sp);
+			qla2x00_sp_compl(ha, sp);
 			return;
 		}
 	}
@@ -964,11 +936,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 			cp->resid = resid;
 			CMD_RESID_LEN(cp) = resid;
 		}
-		if (lscsi_status == SS_BUSY_CONDITION) {
-			cp->result = DID_BUS_BUSY << 16 | lscsi_status;
-			break;
-		}
-
 		cp->result = DID_OK << 16 | lscsi_status;
 
 		if (lscsi_status != SS_CHECK_CONDITION)
@@ -1002,14 +969,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 		if (sp->request_sense_length != 0)
 			ha->status_srb = sp;
 
-		if (!(sp->flags & (SRB_IOCTL | SRB_TAPE)) &&
-		    qla2x00_check_sense(cp, lq) == QLA_SUCCESS) {
-			/* Throw away status_cont if any */
-			ha->status_srb = NULL;
-			add_to_scsi_retry_queue(ha, sp);
-			return;
-		}
-
 		DEBUG5(printk("%s(): Check condition Sense data, "
 		    "scsi(%ld:%d:%d:%d) cmd=%p pid=%ld\n",
 		    __func__, ha->host_no, b, t, l, cp,
@@ -1035,12 +994,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 		 * Status.
 		 */
 		if (lscsi_status != 0) {
-			if (lscsi_status == SS_BUSY_CONDITION) {
-				cp->result = DID_BUS_BUSY << 16 |
-				    lscsi_status;
-				break;
-			}
-
 			cp->result = DID_OK << 16 | lscsi_status;
 
 			if (lscsi_status != SS_CHECK_CONDITION)
@@ -1072,12 +1025,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 			if (sp->request_sense_length != 0)
 				ha->status_srb = sp;
 
-			if (!(sp->flags & (SRB_IOCTL | SRB_TAPE)) &&
-			    (qla2x00_check_sense(cp, lq) == QLA_SUCCESS)) {
-				ha->status_srb = NULL;
-				add_to_scsi_retry_queue(ha, sp);
-				return;
-			}
 			DEBUG5(printk("%s(): Check condition Sense data, "
 			    "scsi(%ld:%d:%d:%d) cmd=%p pid=%ld\n",
 			    __func__, ha->host_no, b, t, l, cp,
@@ -1155,24 +1102,10 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 		    ha->host_no, t, l, cp->serial_number, comp_status,
 		    atomic_read(&fcport->state)));
 
-		if ((sp->flags & (SRB_IOCTL | SRB_TAPE)) ||
-		    atomic_read(&fcport->state) == FCS_DEVICE_DEAD) {
-			cp->result = DID_NO_CONNECT << 16;
-			if (atomic_read(&ha->loop_state) == LOOP_DOWN) 
-				sp->err_id = SRB_ERR_LOOP;
-			else
-				sp->err_id = SRB_ERR_PORT;
-			add_to_done_queue(ha, sp);
-		} else {
-			qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT);
-			add_to_retry_queue(ha, sp);
-		}
-
+		cp->result = DID_BUS_BUSY << 16;
 		if (atomic_read(&fcport->state) == FCS_ONLINE) {
 			qla2x00_mark_device_lost(ha, fcport, 1);
 		}
-
-		return;
 		break;
 
 	case CS_RESET:
@@ -1180,13 +1113,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 		    "scsi(%ld): RESET status detected 0x%x-0x%x.\n",
 		    ha->host_no, comp_status, scsi_status));
 
-		if (sp->flags & (SRB_IOCTL | SRB_TAPE)) {
-			cp->result = DID_RESET << 16;
-		} else {
-			qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT);
-			add_to_retry_queue(ha, sp);
-			return;
-		}
+		cp->result = DID_RESET << 16;
 		break;
 
 	case CS_ABORTED:
@@ -1253,7 +1180,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 
 	/* Place command on done queue. */
 	if (ha->status_srb == NULL)
-		add_to_done_queue(ha, sp);
+		qla2x00_sp_compl(ha, sp);
 }
 
 /**
@@ -1298,8 +1225,8 @@ qla2x00_status_cont_entry(scsi_qla_host_
 
 		/* Place command on done queue. */
 		if (sp->request_sense_length == 0) {
-			add_to_done_queue(ha, sp);
 			ha->status_srb = NULL;
+			qla2x00_sp_compl(ha, sp);
 		}
 	}
 }
@@ -1353,8 +1280,7 @@ qla2x00_error_entry(scsi_qla_host_t *ha,
 		} else {
 			sp->cmd->result = DID_ERROR << 16;
 		}
-		/* Place command on done queue. */
-		add_to_done_queue(ha, sp);
+		qla2x00_sp_compl(ha, sp);
 
 	} else if (pkt->entry_type == COMMAND_A64_TYPE ||
 	    pkt->entry_type == COMMAND_TYPE) {
@@ -1403,62 +1329,5 @@ qla2x00_ms_entry(scsi_qla_host_t *ha, ms
 	/* Free outstanding command slot. */
 	ha->outstanding_cmds[pkt->handle1] = NULL;
 
-	add_to_done_queue(ha, sp);
-}
-
-/**
- * qla2x00_check_sense() - Perform any sense data interrogation.
- * @cp: SCSI Command
- * @lq: Lun queue
- *
- * Returns QLA_SUCCESS if the lun queue is suspended, else
- * QLA_FUNCTION_FAILED  (lun queue not suspended).
- */
-static int 
-qla2x00_check_sense(struct scsi_cmnd *cp, os_lun_t *lq)
-{
-	scsi_qla_host_t	*ha;
-	srb_t		*sp;
-	fc_port_t	*fcport;
-
-	ha = (scsi_qla_host_t *) cp->device->host->hostdata;
-	if ((cp->sense_buffer[0] & 0x70) != 0x70) {
-		return (QLA_FUNCTION_FAILED);
-	}
-
-	sp = (srb_t * )CMD_SP(cp);
-	sp->flags |= SRB_GOT_SENSE;
-
-	switch (cp->sense_buffer[2] & 0xf) {
-	case RECOVERED_ERROR:
-		cp->result = DID_OK << 16;
-		cp->sense_buffer[0] = 0;
-		break;
-
-	case NOT_READY:
-		fcport = lq->fclun->fcport;
-
-		/*
-		 * Suspend the lun only for hard disk device type.
-		 */
-		if ((fcport->flags & FCF_TAPE_PRESENT) == 0 &&
-		    lq->q_state != LUN_STATE_TIMEOUT) {
-			/*
-			 * If target is in process of being ready then suspend
-			 * lun for 6 secs and retry all the commands.
-			 */
-			if (cp->sense_buffer[12] == 0x4 &&
-			    cp->sense_buffer[13] == 0x1) {
-
-				/* Suspend the lun for 6 secs */
-				qla2x00_suspend_lun(ha, lq, 6,
-				    ql2xsuspendcount);
-
-				return (QLA_SUCCESS);
-			}
-		}
-		break;
-	}
-
-	return (QLA_FUNCTION_FAILED);
+	qla2x00_sp_compl(ha, sp);
 }
--- a/drivers/scsi/qla2xxx/qla_listops.h	2005-04-12 15:18:04.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_listops.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,351 +0,0 @@
-/******************************************************************************
- *                  QLOGIC LINUX SOFTWARE
- *
- * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003-2004 QLogic Corporation
- * (www.qlogic.com)
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- ******************************************************************************/
-
-/* Management functions for various lists */
-
-/* __add_to_done_queue()
- * 
- * Place SRB command on done queue.
- *
- * Input:
- *      ha           = host pointer
- *      sp           = srb pointer.
- * Locking:
- * 	this function assumes the ha->list_lock is already taken
- */
-static inline void 
-__add_to_done_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-	/*
-        if (sp->state != SRB_NO_QUEUE_STATE && 
-        	sp->state != SRB_ACTIVE_STATE)
-		BUG();
-	*/
-
-        /* Place block on done queue */
-        sp->cmd->host_scribble = (unsigned char *) NULL;
-        sp->state = SRB_DONE_STATE;
-        list_add_tail(&sp->list,&ha->done_queue);
-        ha->done_q_cnt++;
-	sp->ha = ha;
-}
-
-static inline void 
-__add_to_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-	/*
-        if( sp->state != SRB_NO_QUEUE_STATE && 
-        	sp->state != SRB_ACTIVE_STATE)
-		BUG();
-	*/
-
-        /* Place block on retry queue */
-        list_add_tail(&sp->list,&ha->retry_queue);
-        ha->retry_q_cnt++;
-        sp->flags |= SRB_WATCHDOG;
-        sp->state = SRB_RETRY_STATE;
-	sp->ha = ha;
-}
-
-static inline void 
-__add_to_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-	/*
-        if( sp->state != SRB_NO_QUEUE_STATE && 
-        	sp->state != SRB_ACTIVE_STATE)
-		BUG();
-	*/
-
-        /* Place block on retry queue */
-        list_add_tail(&sp->list,&ha->scsi_retry_queue);
-        ha->scsi_retry_q_cnt++;
-        sp->state = SRB_SCSI_RETRY_STATE;
-	sp->ha = ha;
-}
-
-static inline void 
-add_to_done_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-        unsigned long flags;
-
-        spin_lock_irqsave(&ha->list_lock, flags);
-        __add_to_done_queue(ha,sp);
-        spin_unlock_irqrestore(&ha->list_lock, flags);
-}
-
-static inline void 
-add_to_free_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-	mempool_free(sp, ha->srb_mempool);
-}
-
-static inline void 
-add_to_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-        unsigned long flags;
-
-        spin_lock_irqsave(&ha->list_lock, flags);
-        __add_to_retry_queue(ha,sp);
-        spin_unlock_irqrestore(&ha->list_lock, flags);
-}
-
-static inline void 
-add_to_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-        unsigned long flags;
-
-        spin_lock_irqsave(&ha->list_lock, flags);
-        __add_to_scsi_retry_queue(ha,sp);
-        spin_unlock_irqrestore(&ha->list_lock, flags);
-}
-
-/*
- * __del_from_retry_queue
- *      Function used to remove a command block from the
- *      watchdog timer queue.
- *
- *      Note: Must insure that command is on watchdog
- *            list before calling del_from_retry_queue
- *            if (sp->flags & SRB_WATCHDOG)
- *
- * Input: 
- *      ha = adapter block pointer.
- *      sp = srb pointer.
- * Locking:
- *	this function assumes the list_lock is already taken
- */
-static inline void 
-__del_from_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-        list_del_init(&sp->list);
-
-        sp->flags &= ~(SRB_WATCHDOG | SRB_BUSY);
-        sp->state = SRB_NO_QUEUE_STATE;
-        ha->retry_q_cnt--;
-}
-
-/*
- * __del_from_scsi_retry_queue
- *      Function used to remove a command block from the
- *      scsi retry queue.
- *
- * Input: 
- *      ha = adapter block pointer.
- *      sp = srb pointer.
- * Locking:
- *	this function assumes the list_lock is already taken
- */
-static inline void 
-__del_from_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-        list_del_init(&sp->list);
-
-        ha->scsi_retry_q_cnt--;
-        sp->state = SRB_NO_QUEUE_STATE;
-}
-
-/*
- * del_from_retry_queue
- *      Function used to remove a command block from the
- *      watchdog timer queue.
- *
- *      Note: Must insure that command is on watchdog
- *            list before calling del_from_retry_queue
- *            if (sp->flags & SRB_WATCHDOG)
- *
- * Input: 
- *      ha = adapter block pointer.
- *      sp = srb pointer.
- * Locking:
- *	this function takes and releases the list_lock
- */
-static inline void 
-del_from_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-        unsigned long flags;
-
-        /*	if (unlikely(!(sp->flags & SRB_WATCHDOG)))
-        		BUG();*/
-        spin_lock_irqsave(&ha->list_lock, flags);
-
-        /*	if (unlikely(list_empty(&ha->retry_queue)))
-        		BUG();*/
-
-        __del_from_retry_queue(ha,sp);
-
-        spin_unlock_irqrestore(&ha->list_lock, flags);
-}
-/*
- * del_from_scsi_retry_queue
- *      Function used to remove a command block from the
- *      scsi retry queue.
- *
- * Input: 
- *      ha = adapter block pointer.
- *      sp = srb pointer.
- * Locking:
- *	this function takes and releases the list_lock
- */
-static inline void 
-del_from_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-        unsigned long flags;
-
-        spin_lock_irqsave(&ha->list_lock, flags);
-
-        /*	if (unlikely(list_empty(&ha->scsi_retry_queue)))
-        		BUG();*/
-
-        __del_from_scsi_retry_queue(ha,sp);
-
-        spin_unlock_irqrestore(&ha->list_lock, flags);
-}
-
-/*
- * __add_to_pending_queue
- *      Add the standard SCB job to the bottom of standard SCB commands.
- *
- * Input:
- * COMPLETE!!!
- *      q  = SCSI LU pointer.
- *      sp = srb pointer.
- *      SCSI_LU_Q lock must be already obtained.
- */
-static inline int 
-__add_to_pending_queue(struct scsi_qla_host *ha, srb_t * sp)
-{
-	int	empty;
-	/*
-        if( sp->state != SRB_NO_QUEUE_STATE &&
-        	sp->state != SRB_FREE_STATE &&
-        	sp->state != SRB_ACTIVE_STATE)
-		BUG();
-	*/
-
-	empty = list_empty(&ha->pending_queue);
-	list_add_tail(&sp->list, &ha->pending_queue);
-	ha->qthreads++;
-	sp->state = SRB_PENDING_STATE;
-
-	return (empty);
-}
-
-static inline void 
-__add_to_pending_queue_head(struct scsi_qla_host *ha, srb_t * sp)
-{
-	/*
-        if( sp->state != SRB_NO_QUEUE_STATE && 
-        	sp->state != SRB_FREE_STATE &&
-        	sp->state != SRB_ACTIVE_STATE)
-		BUG();
-	*/
-
-	list_add(&sp->list, &ha->pending_queue);
-	ha->qthreads++;
-	sp->state = SRB_PENDING_STATE;
-}
-
-static inline int
-add_to_pending_queue(struct scsi_qla_host *ha, srb_t *sp)
-{
-	int	empty;
-	unsigned long flags;
-
-	spin_lock_irqsave(&ha->list_lock, flags);
-	empty = __add_to_pending_queue(ha, sp);
-	spin_unlock_irqrestore(&ha->list_lock, flags);
-
-	return (empty);
-}
-static inline void
-add_to_pending_queue_head(struct scsi_qla_host *ha, srb_t *sp)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&ha->list_lock, flags);
-	__add_to_pending_queue_head(ha, sp);
-	spin_unlock_irqrestore(&ha->list_lock, flags);
-}
-
-static inline void
-__del_from_pending_queue(struct scsi_qla_host *ha, srb_t *sp)
-{
-	list_del_init(&sp->list);
-	ha->qthreads--;
-	sp->state = SRB_NO_QUEUE_STATE;
-}
-
-/*
- * Failover Stuff.
- */
-static inline void
-__add_to_failover_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-	/*
-        if( sp->state != SRB_NO_QUEUE_STATE && 
-        	sp->state != SRB_ACTIVE_STATE)
-		BUG();
-	*/
-
-        list_add_tail(&sp->list,&ha->failover_queue);
-        ha->failover_cnt++;
-        sp->state = SRB_FAILOVER_STATE;
-	sp->ha = ha;
-}
-
-static inline void add_to_failover_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-        unsigned long flags;
-
-        spin_lock_irqsave(&ha->list_lock, flags);
-
-        __add_to_failover_queue(ha,sp);
-
-        spin_unlock_irqrestore(&ha->list_lock, flags);
-}
-static inline void __del_from_failover_queue(struct scsi_qla_host * ha, srb_t *
-                sp)
-{
-        ha->failover_cnt--;
-        list_del_init(&sp->list);
-        sp->state = SRB_NO_QUEUE_STATE;
-}
-
-static inline void del_from_failover_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-        unsigned long flags;
-
-        spin_lock_irqsave(&ha->list_lock, flags);
-
-        __del_from_failover_queue(ha,sp);
-
-        spin_unlock_irqrestore(&ha->list_lock, flags);
-}
-
-static inline void 
-del_from_pending_queue(struct scsi_qla_host * ha, srb_t * sp)
-{
-        unsigned long flags;
-
-        spin_lock_irqsave(&ha->list_lock, flags);
-
-        __del_from_pending_queue(ha,sp);
-
-        spin_unlock_irqrestore(&ha->list_lock, flags);
-}
--- a/drivers/scsi/qla2xxx/qla_os.c	2005-04-12 15:18:03.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_os.c	2005-04-13 08:38:23.000000000 -0700
@@ -151,6 +151,8 @@ static void qla2x00_config_dma_addressin
  * SCSI host template entry points 
  */
 static int qla2xxx_slave_configure(struct scsi_device * device);
+static int qla2xxx_slave_alloc(struct scsi_device *);
+static void qla2xxx_slave_destroy(struct scsi_device *);
 static int qla2x00_queuecommand(struct scsi_cmnd *cmd,
 		void (*fn)(struct scsi_cmnd *));
 static int qla2xxx_eh_abort(struct scsi_cmnd *);
@@ -177,6 +179,8 @@ static struct scsi_host_template qla2x00
 
 	.slave_configure	= qla2xxx_slave_configure,
 
+	.slave_alloc		= qla2xxx_slave_alloc,
+	.slave_destroy		= qla2xxx_slave_destroy,
 	.this_id		= -1,
 	.cmd_per_lun		= 3,
 	.use_clustering		= ENABLE_CLUSTERING,
@@ -230,168 +234,6 @@ qla2x00_stop_timer(scsi_qla_host_t *ha)
 	ha->timer_active = 0;
 }
 
-void qla2x00_cmd_timeout(srb_t *);
-
-static __inline__ void qla2x00_callback(scsi_qla_host_t *, struct scsi_cmnd *);
-static __inline__ void sp_put(struct scsi_qla_host * ha, srb_t *sp);
-static __inline__ void sp_get(struct scsi_qla_host * ha, srb_t *sp);
-static __inline__ void
-qla2x00_delete_from_done_queue(scsi_qla_host_t *, srb_t *); 
-
-/*
-* qla2x00_callback
-*      Returns the completed SCSI command to LINUX.
-*
-* Input:
-*	ha -- Host adapter structure
-*	cmd -- SCSI mid-level command structure.
-* Returns:
-*      None
-* Note:From failover point of view we always get the sp
-*      from vis_ha pool in queuecommand.So when we put it 
-*      back to the pool it has to be the vis_ha.	 
-*      So rely on struct scsi_cmnd to get the vis_ha and not on sp. 		 	
-*/
-static inline void
-qla2x00_callback(scsi_qla_host_t *ha, struct scsi_cmnd *cmd)
-{
-	srb_t *sp = (srb_t *) CMD_SP(cmd);
-	scsi_qla_host_t *vis_ha;
-	os_lun_t *lq;
-	int got_sense;
-	unsigned long	cpu_flags = 0;
-
-	cmd->host_scribble = (unsigned char *) NULL;
-	vis_ha = (scsi_qla_host_t *) cmd->device->host->hostdata;
-
-	if (sp == NULL) {
-		qla_printk(KERN_INFO, ha,
-			"%s(): **** CMD derives a NULL SP\n",
-			__func__);
-                DEBUG2(BUG();)
-		return;
-	}
-
-	/*
-	 * If command status is not DID_BUS_BUSY then go ahead and freed sp.
-	 */
-	/*
-	 * Cancel command timeout
-	 */
-	qla2x00_delete_timer_from_cmd(sp);
-
-	/*
-	 * Put SP back in the free queue
-	 */
-	sp->cmd   = NULL;
-	CMD_SP(cmd) = NULL;
-	lq = sp->lun_queue;
-	got_sense = (sp->flags & SRB_GOT_SENSE)? 1: 0;
-	add_to_free_queue(vis_ha, sp);
-
-	if (host_byte(cmd->result) == DID_OK) {
-		/* device ok */
-		ha->total_bytes += cmd->bufflen;
-		if (!got_sense) {
-			/* If lun was suspended then clear retry count */
-			spin_lock_irqsave(&lq->q_lock, cpu_flags);
-			if (!test_bit(LUN_EXEC_DELAYED, &lq->q_flag))
-				lq->q_state = LUN_STATE_READY;
-			spin_unlock_irqrestore(&lq->q_lock, cpu_flags);
-		}
-	} else if (host_byte(cmd->result) == DID_ERROR) {
-		/* device error */
-		ha->total_dev_errs++;
-	}
-
-	/* Call the mid-level driver interrupt handler */
-	(*(cmd)->scsi_done)(cmd);
-}
-
-/**************************************************************************
-* sp_put
-*
-* Description:
-*   Decrement reference count and call the callback if we're the last
-*   owner of the specified sp. Will get the host_lock before calling
-*   the callback.
-*
-* Input:
-*   ha - pointer to the scsi_qla_host_t where the callback is to occur.
-*   sp - pointer to srb_t structure to use.
-*
-* Returns:
-*
-**************************************************************************/
-static inline void
-sp_put(struct scsi_qla_host * ha, srb_t *sp)
-{
-        if (atomic_read(&sp->ref_count) == 0) {
-		qla_printk(KERN_INFO, ha,
-			"%s(): **** SP->ref_count not zero\n",
-			__func__);
-                DEBUG2(BUG();)
-
-                return;
-	}
-
-        if (!atomic_dec_and_test(&sp->ref_count)) {
-                return;
-        }
-
-        qla2x00_callback(ha, sp->cmd);
-}
-
-/**************************************************************************
-* sp_get
-*
-* Description:
-*   Increment reference count of the specified sp.
-*
-* Input:
-*   sp - pointer to srb_t structure to use.
-*
-* Returns:
-*
-**************************************************************************/
-static inline void
-sp_get(struct scsi_qla_host * ha, srb_t *sp)
-{
-        atomic_inc(&sp->ref_count);
-
-        if (atomic_read(&sp->ref_count) > 2) {
-		qla_printk(KERN_INFO, ha,
-			"%s(): **** SP->ref_count greater than two\n",
-			__func__);
-                DEBUG2(BUG();)
-
-		return;
-	}
-}
-
-static inline void 
-qla2x00_delete_from_done_queue(scsi_qla_host_t *dest_ha, srb_t *sp) 
-{
-	/* remove command from done list */
-	list_del_init(&sp->list);
-	dest_ha->done_q_cnt--;
-	sp->state = SRB_NO_QUEUE_STATE;
-
-	if (sp->flags & SRB_DMA_VALID) {
-		sp->flags &= ~SRB_DMA_VALID;
-
-		/* Release memory used for this I/O */
-		if (sp->cmd->use_sg) {
-			pci_unmap_sg(dest_ha->pdev, sp->cmd->request_buffer,
-			    sp->cmd->use_sg, sp->cmd->sc_data_direction);
-		} else if (sp->cmd->request_bufflen) {
-			pci_unmap_page(dest_ha->pdev, sp->dma_handle,
-			    sp->cmd->request_bufflen,
-			    sp->cmd->sc_data_direction);
-		}
-	}
-}
-
 static int qla2x00_do_dpc(void *data);
 
 static void qla2x00_rst_aen(scsi_qla_host_t *);
@@ -400,7 +242,9 @@ static uint8_t qla2x00_mem_alloc(scsi_ql
 static void qla2x00_mem_free(scsi_qla_host_t *ha);
 static int qla2x00_allocate_sp_pool( scsi_qla_host_t *ha);
 static void qla2x00_free_sp_pool(scsi_qla_host_t *ha);
-static srb_t *qla2x00_get_new_sp(scsi_qla_host_t *ha);
+static srb_t *qla2x00_get_new_sp(scsi_qla_host_t *);
+static void qla2x00_sp_free_dma(scsi_qla_host_t *, srb_t *);
+void qla2x00_sp_compl(scsi_qla_host_t *ha, srb_t *);
 
 static ssize_t qla2x00_sysfs_read_fw_dump(struct kobject *, char *, loff_t,
     size_t);
@@ -661,210 +505,84 @@ qla2x00_get_fw_version_str(struct scsi_q
 * handling).
 **************************************************************************/
 static int
-qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *))
+qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 {
-	fc_port_t	*fcport;
-	os_lun_t	*lq;
-	os_tgt_t	*tq;
-	scsi_qla_host_t	*ha, *ha2;
-	srb_t		*sp;
-	struct Scsi_Host *host;
-	unsigned int	b, t, l;
-	unsigned long	handle;
-	int		was_empty;
-
+	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;
+	srb_t *sp;
+	int rval;
 
-	host = cmd->device->host;
-	ha = (scsi_qla_host_t *) host->hostdata;
-	was_empty = 1;
+	lq = GET_LU_Q(ha, cmd->device->id, cmd->device->lun);
+	if (!fcport || !lq) {
+		cmd->result = DID_NO_CONNECT << 16;
+		goto qc_fail_command;
+	}
 
-	cmd->scsi_done = fn;
+	if (atomic_read(&fcport->state) != FCS_ONLINE) {
+		if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
+		    atomic_read(&ha->loop_state) == LOOP_DEAD) {
+			cmd->result = DID_NO_CONNECT << 16;
+			goto qc_fail_command;
+		}
+		goto qc_host_busy;
+	}
 
 	spin_unlock_irq(ha->host->host_lock);
 
-	/*
-	 * Allocate a command packet from the "sp" pool.  If we cant get back
-	 * one then let scsi layer come back later.
-	 */
+	/* Allocate a command packet from the "sp" pool. */
 	if ((sp = qla2x00_get_new_sp(ha)) == NULL) {
-		qla_printk(KERN_WARNING, ha,
-		    "Couldn't allocate memory for sp - retried.\n");
-
-		spin_lock_irq(ha->host->host_lock);
-
-		return (1);
+		goto qc_host_busy_lock;
 	}
 
+	sp->ha = ha;
 	sp->cmd = cmd;
-	CMD_SP(cmd) = (void *)sp;
-
-	sp->flags = 0;
-	if (CMD_RESID_LEN(cmd) & SRB_IOCTL) {
-		/* Need to set sp->flags */
-		sp->flags |= SRB_IOCTL;
-		CMD_RESID_LEN(cmd) = 0; /* Clear it since no more use. */
-	}
-
-	sp->fo_retry_cnt = 0;
-	sp->err_id = 0;
-
-	/* Generate LU queue on bus, target, LUN */
-	b = cmd->device->channel;
-	t = cmd->device->id;
-	l = cmd->device->lun;
-
-	/*
-	 * Start Command Timer. Typically it will be 2 seconds less than what
-	 * is requested by the Host such that we can return the IO before
-	 * aborts are called.
-	 */
-	if ((cmd->timeout_per_command / HZ) > QLA_CMD_TIMER_DELTA)
-		qla2x00_add_timer_to_cmd(sp,
-		    (cmd->timeout_per_command / HZ) - QLA_CMD_TIMER_DELTA);
-	else
-		qla2x00_add_timer_to_cmd(sp, cmd->timeout_per_command / HZ);
-
-	if (l >= ha->max_luns) {
-		cmd->result = DID_NO_CONNECT << 16;
-		sp->err_id = SRB_ERR_PORT;
-
-		spin_lock_irq(ha->host->host_lock);
-
-		sp_put(ha, sp);
-
-		return (0);
-	}
-
-	if ((tq = (os_tgt_t *) TGT_Q(ha, t)) != NULL &&
-	    (lq = (os_lun_t *) LUN_Q(ha, t, l)) != NULL) {
-		fcport = lq->fclun->fcport;
-		ha2 = fcport->ha;
-	} else {
-		lq = NULL;
-		fcport = NULL;
-		ha2 = ha;
-	}
-
-	/* Set an invalid handle until we issue the command to ISP */
-	/* then we will set the real handle value.                 */
-	handle = INVALID_HANDLE;
-	cmd->host_scribble = (unsigned char *)handle;
-
-	/* Bookkeeping information */
-	sp->r_start = jiffies;		/* Time the request was recieved. */
-	sp->u_start = 0;
-
-	/* Setup device queue pointers. */
 	sp->tgt_queue = tq;
-	sp->lun_queue = lq;
-
-	/*
-	 * NOTE : q is NULL
-	 *
-	 * 1. When device is added from persistent binding but has not been
-	 *    discovered yet.The state of loopid == PORT_AVAIL.
-	 * 2. When device is never found on the bus.(loopid == UNUSED)
-	 *
-	 * IF Device Queue is not created, or device is not in a valid state
-	 * and link down error reporting is enabled, reject IO.
-	 */
-	if (fcport == NULL) {
-		DEBUG3(printk("scsi(%ld:%2d:%2d): port unavailable\n",
-		    ha->host_no,t,l));
-
-		cmd->result = DID_NO_CONNECT << 16;
-		sp->err_id = SRB_ERR_PORT;
-
-		spin_lock_irq(ha->host->host_lock);
-
-		sp_put(ha, sp);
-
-		return (0);
-	}
-
-	/* Only modify the allowed count if the target is a *non* tape device */
-	if ((fcport->flags & FCF_TAPE_PRESENT) == 0) {
-		sp->flags &= ~SRB_TAPE;
-		if (cmd->allowed < ql2xretrycount) {
-			cmd->allowed = ql2xretrycount;
-		}
-	} else
-		sp->flags |= SRB_TAPE;
-
-	DEBUG5(printk("scsi(%ld:%2d:%2d): (queuecmd) queue sp = %p, "
-	    "flags=0x%x fo retry=%d, pid=%ld\n",
-	    ha->host_no, t, l, sp, sp->flags, sp->fo_retry_cnt,
-	    cmd->serial_number));
-	DEBUG5(qla2x00_print_scsi_cmd(cmd));
 
+	sp->lun_queue = lq;
+	lq->io_cnt++;
 	sp->fclun = lq->fclun;
-	sp->ha = ha2;
 
-	if (cmd->sc_data_direction == DMA_BIDIRECTIONAL &&
-	    cmd->request_bufflen != 0) {
+	sp->flags = 0;
+	sp->err_id = 0;
 
-		DEBUG2(printk(KERN_WARNING
-		    "scsi(%ld): Incorrect data direction - transfer "
-		    "length=%d, direction=%d, pid=%ld, opcode=%x\n",
-		    ha->host_no, cmd->request_bufflen, cmd->sc_data_direction,
-		    cmd->serial_number, cmd->cmnd[0]));
-	}
+	CMD_SP(cmd) = (void *)sp;
+	cmd->scsi_done = done;
 
-	/* Final pre-check :
-	 *
-	 *	Either PORT_DOWN_TIMER OR LINK_DOWN_TIMER Expired.
-	 */
-	if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
-	    atomic_read(&ha2->loop_state) == LOOP_DEAD) {
-		/*
-		 * Add the command to the done-queue for later failover
-		 * processing.
-		 */
-		cmd->result = DID_NO_CONNECT << 16;
-		if (atomic_read(&ha2->loop_state) == LOOP_DOWN) 
-			sp->err_id = SRB_ERR_LOOP;
-		else
-			sp->err_id = SRB_ERR_PORT;
+	rval = qla2x00_start_scsi(sp);
+	if (rval != QLA_SUCCESS)
+		goto qc_host_busy_free_sp;
 
-		add_to_done_queue(ha, sp);
-		qla2x00_done(ha);
+	/* Manage unprocessed RIO/ZIO commands in response queue. */
+	if (ha->flags.online && ha->flags.process_response_queue &&
+	    ha->response_ring_ptr->signature != RESPONSE_PROCESSED) {
+		unsigned long flags;
 
-		spin_lock_irq(ha->host->host_lock);
-		return (0);
+		spin_lock_irqsave(&ha->hardware_lock, flags);
+		qla2x00_process_response_queue(ha);
+		spin_unlock_irqrestore(&ha->hardware_lock, flags);
 	}
 
-	if (tq && test_bit(TQF_SUSPENDED, &tq->flags) &&
-	    (sp->flags & SRB_TAPE) == 0) {
-		/* If target suspended put incoming I/O in retry_q. */
-		qla2x00_extend_timeout(sp->cmd, 10);
-		add_to_scsi_retry_queue(ha, sp);
-	} else
-		was_empty = add_to_pending_queue(ha, sp);
-
-	if ((IS_QLA2100(ha) || IS_QLA2200(ha)) && ha->flags.online) {
-		if (ha->response_ring_ptr->signature != RESPONSE_PROCESSED) {
-			unsigned long flags;
+	spin_lock_irq(ha->host->host_lock);
 
-			spin_lock_irqsave(&ha->hardware_lock, flags);	
-			qla2x00_process_response_queue(ha);
-			spin_unlock_irqrestore(&ha->hardware_lock, flags);
-		}
-	}
+	return 0;
 
-	/* We submit to the hardware if:
-	 *
-	 *	1) we're on the cpu the irq's arrive on or
-	 *	2) there are very few io's outstanding.
-	 *
-	 * In all other cases we'll let an irq pick up our IO and submit it
-	 * to the controller to improve affinity.
-	 */
-	if (_smp_processor_id() == ha->last_irq_cpu || was_empty)
-		qla2x00_next(ha);
+qc_host_busy_free_sp:
+	qla2x00_sp_free_dma(ha, sp);
+	CMD_SP(cmd) = NULL;
+	mempool_free(sp, ha->srb_mempool);
 
+qc_host_busy_lock:
 	spin_lock_irq(ha->host->host_lock);
 
-	return (0);
+qc_host_busy:
+	return SCSI_MLQUEUE_HOST_BUSY;
+
+qc_fail_command:
+	done(cmd);
+
+	return 0;
 }
 
 /*
@@ -886,54 +604,21 @@ static int
 qla2x00_eh_wait_on_command(scsi_qla_host_t *ha, struct scsi_cmnd *cmd)
 {
 #define ABORT_POLLING_PERIOD	HZ
-#define ABORT_WAIT_TIME		((10 * HZ) / (ABORT_POLLING_PERIOD))
-
-	int		found = 0;
-	int		done = 0;
-	srb_t		*rp = NULL;
-	struct list_head *list, *temp;
-	u_long		max_wait_time = ABORT_WAIT_TIME;
-
-	do {
-		/* Check on done queue */
-		spin_lock(&ha->list_lock);
-		list_for_each_safe(list, temp, &ha->done_queue) {
-			rp = list_entry(list, srb_t, list);
-
-			/*
-			 * Found command. Just exit and wait for the cmd sent
-			 * to OS.
-			*/
-			if (cmd == rp->cmd) {
-				found++;
-				DEBUG3(printk("%s: found in done queue.\n",
-				    __func__);)
-				break;
-			}
-		}
-		spin_unlock(&ha->list_lock);
-
-		/* Complete the cmd right away. */
-		if (found) { 
-			qla2x00_delete_from_done_queue(ha, rp);
-			sp_put(ha, rp);
-			done++;
-			break;
-		}
-
-		spin_unlock_irq(ha->host->host_lock);
+#define ABORT_WAIT_ITER		((10 * HZ) / (ABORT_POLLING_PERIOD))
+	unsigned long wait_iter = ABORT_WAIT_ITER;
+	int ret = QLA_SUCCESS;
 
+	while (CMD_SP(cmd)) {
 		set_current_state(TASK_UNINTERRUPTIBLE);
 		schedule_timeout(ABORT_POLLING_PERIOD);
 
-		spin_lock_irq(ha->host->host_lock);
-
-	} while ((max_wait_time--));
-
-	if (done)
-		DEBUG2(printk(KERN_INFO "%s: found cmd=%p.\n", __func__, cmd));
+		if (--wait_iter)
+			break;
+	}
+	if (CMD_SP(cmd))
+		ret = QLA_FUNCTION_FAILED;
 
-	return (done);
+	return ret;
 }
 
 /*
@@ -1032,245 +717,69 @@ qla2x00_wait_for_loop_ready(scsi_qla_hos
 int
 qla2xxx_eh_abort(struct scsi_cmnd *cmd)
 {
-	int		i;
-	int		return_status = FAILED;
-	os_lun_t	*q;
-	scsi_qla_host_t *ha;
-	scsi_qla_host_t *vis_ha;
-	srb_t		*sp;
-	srb_t		*rp;
-	struct list_head *list, *temp;
-	struct Scsi_Host *host;
-	uint8_t		found = 0;
-	unsigned int	b, t, l;
-
-	/* Get the SCSI request ptr */
-	sp = (srb_t *) CMD_SP(cmd);
-
-	/*
-	 * If sp is NULL, command is already returned.
-	 * sp is NULLED just before we call back scsi_done
-	 *
-	 */
-	if ((sp == NULL)) {
-		/* no action - we don't have command */
-		qla_printk(KERN_INFO, to_qla_host(cmd->device->host),
-		    "qla2xxx_eh_abort: cmd already done sp=%p\n", sp);
-		DEBUG(printk("qla2xxx_eh_abort: cmd already done sp=%p\n", sp);)
-		return SUCCESS;
-	}
-	if (sp) {
-		DEBUG(printk("qla2xxx_eh_abort: refcount %i \n",
-		    atomic_read(&sp->ref_count));)
-	}
-
-	vis_ha = (scsi_qla_host_t *) cmd->device->host->hostdata;
-	ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
-
-	host = ha->host;
-
-	/* Generate LU queue on bus, target, LUN */
-	b = cmd->device->channel;
-	t = cmd->device->id;
-	l = cmd->device->lun;
-	q = GET_LU_Q(vis_ha, t, l);
-
-	qla_printk(KERN_INFO, ha, 
-	    "%s scsi(%ld:%d:%d:%d): cmd_timeout_in_sec=0x%x.\n", __func__,
-	    ha->host_no, (int)b, (int)t, (int)l,
-	    cmd->timeout_per_command / HZ);
-
-	/*
-	 * if no LUN queue then something is very wrong!!!
-	 */
-	if (q == NULL) {
-		qla_printk(KERN_WARNING, ha,
-			"qla2x00: (%x:%x:%x) No LUN queue.\n", b, t, l);
+	scsi_qla_host_t *ha = to_qla_host(cmd->device->host);
+	srb_t *sp;
+	int ret, i;
+	unsigned int id, lun;
+	unsigned long serial;
 
-		/* no action - we don't have command */
+	if (!CMD_SP(cmd))
 		return FAILED;
-	}
 
-	DEBUG2(printk("scsi(%ld): ABORTing cmd=%p sp=%p jiffies = 0x%lx, "
-	    "timeout=%x, dpc_flags=%lx, vis_ha->dpc_flags=%lx q->flag=%lx\n",
-	    ha->host_no, cmd, sp, jiffies, cmd->timeout_per_command / HZ,
-	    ha->dpc_flags, vis_ha->dpc_flags, q->q_flag));
-	DEBUG2(qla2x00_print_scsi_cmd(cmd));
+	ret = FAILED;
 
-	spin_unlock_irq(ha->host->host_lock);
-	if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS) {
-		DEBUG2(printk("%s failed:board disabled\n", __func__);)
-		spin_lock_irq(ha->host->host_lock);
-		return FAILED;
-	}
-	spin_lock_irq(ha->host->host_lock);
+	id = cmd->device->id;
+	lun = cmd->device->lun;
+	serial = cmd->serial_number;
 
-	/* Search done queue */
-	spin_lock(&ha->list_lock);
-	list_for_each_safe(list, temp, &ha->done_queue) {
-		rp = list_entry(list, srb_t, list);
+	/* Check active list for command command. */
+	spin_unlock_irq(ha->host->host_lock);
+	spin_lock(&ha->hardware_lock);
+	for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) {
+		sp = ha->outstanding_cmds[i];
 
-		if (cmd != rp->cmd)
+		if (sp == NULL)
 			continue;
 
-		/*
-		 * Found command.Remove it from done list.
-		 * And proceed to post completion to scsi mid layer.
-		 */
-		return_status = SUCCESS;
-		found++;
-		qla2x00_delete_from_done_queue(ha, sp);
-
-		break;
-	} /* list_for_each_safe() */
-	spin_unlock(&ha->list_lock);
-
-	/*
-	 * Return immediately if the aborted command was already in the done
-	 * queue
-	 */
-	if (found) {
-		qla_printk(KERN_INFO, ha,
-		    "qla2xxx_eh_abort: Returning completed command=%p sp=%p\n",
-		    cmd, sp);
-		sp_put(ha, sp);
-		return (return_status);
-	}
-	
-
-	/*
-	 * See if this command is in the retry queue
-	 */
-	DEBUG3(printk("qla2xxx_eh_abort: searching sp %p in retry "
-		    "queue.\n", sp);)
-
-	spin_lock(&ha->list_lock);
-	list_for_each_safe(list, temp, &ha->retry_queue) {
-		rp = list_entry(list, srb_t, list);
-
-		if (cmd != rp->cmd)
+		if (sp->cmd != cmd)
 			continue;
 
+		DEBUG2(printk("%s(%ld): aborting sp %p from RISC. pid=%ld "
+		    "sp->state=%x\n", __func__, ha->host_no, sp, serial,
+		    sp->state));
+		DEBUG3(qla2x00_print_scsi_cmd(cmd);)
 
-		DEBUG2(printk("qla2xxx_eh_abort: found "
-		    "in retry queue. SP=%p\n", sp);)
-
-		__del_from_retry_queue(ha, rp);
-		cmd->result = DID_ABORT << 16;
-		__add_to_done_queue(ha, rp);
-
-		return_status = SUCCESS;
-		found++;
-
-		break;
-
-	} 
-	spin_unlock(&ha->list_lock);
-
-
-	/*
-	 * Our SP pointer points at the command we want to remove from the
-	 * pending queue providing we haven't already sent it to the adapter.
-	 */
-	if (!found) {
-		DEBUG3(printk("qla2xxx_eh_abort: searching sp %p "
-		    "in pending queue.\n", sp);)
-
-		spin_lock(&vis_ha->list_lock);
-		list_for_each_safe(list, temp, &vis_ha->pending_queue) {
-			rp = list_entry(list, srb_t, list);
-
-			if (rp->cmd != cmd)
-				continue;
-
-			/* Remove srb from LUN queue. */
-			rp->flags |=  SRB_ABORTED;
-
-			DEBUG2(printk("qla2xxx_eh_abort: Cmd in pending queue."
-			    " serial_number %ld.\n",
-			    sp->cmd->serial_number);)
-
-			__del_from_pending_queue(vis_ha, rp);
-			cmd->result = DID_ABORT << 16;
-
-			__add_to_done_queue(vis_ha, rp);
-
-			return_status = SUCCESS;
-
-			found++;
-			break;
-		} /* list_for_each_safe() */
-		spin_unlock(&vis_ha->list_lock);
-	} /*End of if !found */
-
-	if (!found) {  /* find the command in our active list */
-		DEBUG3(printk("qla2xxx_eh_abort: searching sp %p "
-		    "in outstanding queue.\n", sp);)
-
-		spin_lock(&ha->hardware_lock);
-		for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) {
-			sp = ha->outstanding_cmds[i];
-
-			if (sp == NULL)
-				continue;
-
-			if (sp->cmd != cmd)
-				continue;
-
-			DEBUG2(printk("qla2xxx_eh_abort(%ld): aborting sp %p "
-			    "from RISC. pid=%ld sp->state=%x q->q_flag=%lx\n",
-			    ha->host_no, sp, sp->cmd->serial_number,
-			    sp->state, q->q_flag);)
-			DEBUG(qla2x00_print_scsi_cmd(cmd);)
-
-			/* Get a reference to the sp and drop the lock.*/
-			sp_get(ha, sp);
-
-			spin_unlock(&ha->hardware_lock);
-			spin_unlock_irq(ha->host->host_lock);
-
-			if (qla2x00_abort_command(ha, sp)) {
-				DEBUG2(printk("qla2xxx_eh_abort: abort_command "
-				    "mbx failed.\n");)
-				return_status = FAILED;
-			} else {
-				DEBUG3(printk("qla2xxx_eh_abort: abort_command "
-				    " mbx success.\n");)
-				return_status = SUCCESS;
-			}
-
-			sp_put(ha,sp);
-
-			spin_lock_irq(ha->host->host_lock);
-			spin_lock(&ha->hardware_lock);
-
-			/*
-			 * Regardless of mailbox command status, go check on
-			 * done queue just in case the sp is already done.
-			 */
-			break;
-
-		}/*End of for loop */
 		spin_unlock(&ha->hardware_lock);
+		if (qla2x00_abort_command(ha, sp)) {
+			DEBUG2(printk("%s(%ld): abort_command "
+			    "mbx failed.\n", __func__, ha->host_no));
+		} else {
+			DEBUG3(printk("%s(%ld): abort_command "
+			    "mbx success.\n", __func__, ha->host_no));
+			ret = SUCCESS;
+		}
+		spin_lock(&ha->hardware_lock);
 
-	} /*End of if !found */
-
-	/* Waiting for our command in done_queue to be returned to OS.*/
-	if (qla2x00_eh_wait_on_command(ha, cmd) != 0) {
-		DEBUG2(printk("qla2xxx_eh_abort: cmd returned back to OS.\n");)
-		return_status = SUCCESS;
+		break;
 	}
 
-	if (return_status == FAILED) {
-		qla_printk(KERN_INFO, ha, 
-			"qla2xxx_eh_abort Exiting: status=Failed\n");
-		return FAILED;
+	/* Wait for the command to be returned. */
+	if (ret == SUCCESS) {
+		spin_unlock(&ha->hardware_lock);
+		if (qla2x00_eh_wait_on_command(ha, cmd) != QLA_SUCCESS) {
+			qla_printk(KERN_ERR, ha, 
+			    "scsi(%ld:%d:%d): Abort handler timed out -- %lx "
+			    "%x.\n", ha->host_no, id, lun, serial, ret);
+		}
+		spin_lock(&ha->hardware_lock);
 	}
+	spin_lock_irq(ha->host->host_lock);
 
-	DEBUG2(printk("qla2xxx_eh_abort: Exiting. return_status=0x%x.\n",
-	    return_status));
+	qla_printk(KERN_INFO, ha, 
+	    "scsi(%ld:%d:%d): Abort command issued -- %lx %x.\n", ha->host_no,
+	    id, lun, serial, ret);
 
-	return return_status;
+	return ret;
 }
 
 /**************************************************************************
@@ -1313,8 +822,7 @@ qla2x00_eh_wait_for_pending_target_comma
 					break;
 				}
 			}
-		}
-		else {
+		} else {
 			spin_unlock(&ha->hardware_lock);
 		}
 	}
@@ -1344,96 +852,45 @@ qla2x00_eh_wait_for_pending_target_comma
 int
 qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
 {
-	int		return_status;
-	unsigned int	b, t, l;
-	scsi_qla_host_t	*ha;
-	os_tgt_t	*tq;
-	os_lun_t	*lq;
-	fc_port_t	*fcport_to_reset;
-	srb_t		*rp;
-	struct list_head *list, *temp;
-
-	return_status = FAILED;
-	if (cmd == NULL) {
-		printk(KERN_INFO
-		    "%s(): **** SCSI mid-layer passing in NULL cmd\n",
-		    __func__);
-
-		return (return_status);
-	}
-
-	b = cmd->device->channel;
-	t = cmd->device->id;
-	l = cmd->device->lun;
-	ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
-
-	tq = TGT_Q(ha, t);
-	if (tq == NULL) {
-		qla_printk(KERN_INFO, ha,
-		    "%s(): **** CMD derives a NULL TGT_Q\n", __func__);
+	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;
+	srb_t *sp;
+	int ret;
+	unsigned int id, lun;
+	unsigned long serial;
 
-		return (return_status);
-	}
-	lq = (os_lun_t *)LUN_Q(ha, t, l);
-	if (lq == NULL) {
-		printk(KERN_INFO
-		    "%s(): **** CMD derives a NULL LUN_Q\n", __func__);
+	ret = FAILED;
 
-		return (return_status);
-	}
-	fcport_to_reset = lq->fclun->fcport;
+	id = cmd->device->id;
+	lun = cmd->device->lun;
+	serial = cmd->serial_number;
 
-	/* If we are coming in from the back-door, stall I/O until complete. */
-	if (!cmd->device->host->eh_active)
-		set_bit(TQF_SUSPENDED, &tq->flags);
+	sp = (srb_t *) CMD_SP(cmd);
+	lq = GET_LU_Q(ha, id, lun);
+	if (!sp || !fcport || !lq)
+		return ret;
 
 	qla_printk(KERN_INFO, ha,
-	    "scsi(%ld:%d:%d:%d): DEVICE RESET ISSUED.\n", ha->host_no, b, t, l);
-
-	DEBUG2(printk(KERN_INFO
-	    "scsi(%ld): DEVICE_RESET cmd=%p jiffies = 0x%lx, timeout=%x, "
-	    "dpc_flags=%lx, status=%x allowed=%d cmd.state=%x\n",
-	    ha->host_no, cmd, jiffies, cmd->timeout_per_command / HZ,
-	    ha->dpc_flags, cmd->result, cmd->allowed, cmd->state));
-
- 	/* Clear commands from the retry queue. */
- 	spin_lock(&ha->list_lock);
- 	list_for_each_safe(list, temp, &ha->retry_queue) {
- 		rp = list_entry(list, srb_t, list);
- 
- 		if (t != rp->cmd->device->id) 
- 			continue;
- 
- 		DEBUG2(printk(KERN_INFO
-		    "qla2xxx_eh_reset: found in retry queue. SP=%p\n", rp));
- 
- 		__del_from_retry_queue(ha, rp);
- 		rp->cmd->result = DID_RESET << 16;
- 		__add_to_done_queue(ha, rp);
- 	}
- 	spin_unlock(&ha->list_lock);
+	    "scsi(%ld:%d:%d): DEVICE RESET ISSUED.\n", ha->host_no, id, lun);
 
 	spin_unlock_irq(ha->host->host_lock);
 
 	if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS) {
-		DEBUG2(printk(KERN_INFO
-		    "%s failed:board disabled\n",__func__));
-
 		spin_lock_irq(ha->host->host_lock);
 		goto eh_dev_reset_done;
 	}
 
 	if (qla2x00_wait_for_loop_ready(ha) == QLA_SUCCESS) {
-		if (qla2x00_device_reset(ha, fcport_to_reset) == 0) {
-			return_status = SUCCESS;
-		}
+		if (qla2x00_device_reset(ha, fcport) == 0)
+			ret = SUCCESS;
 
 #if defined(LOGOUT_AFTER_DEVICE_RESET)
-		if (return_status == SUCCESS) {
-			if (fcport_to_reset->flags & FC_FABRIC_DEVICE) {
-				qla2x00_fabric_logout(ha,
-				    fcport_to_reset->loop_id);
-				qla2x00_mark_device_lost(ha, fcport_to_reset);
+		if (ret == SUCCESS) {
+			if (fcport->flags & FC_FABRIC_DEVICE) {
+				qla2x00_fabric_logout(ha, fcport->loop_id);
+				qla2x00_mark_device_lost(ha, fcport);
 			}
 		}
 #endif
@@ -1442,9 +899,7 @@ qla2xxx_eh_device_reset(struct scsi_cmnd
 		    "%s failed: loop not ready\n",__func__);)
 	}
 
-	spin_lock_irq(ha->host->host_lock);
-
-	if (return_status == FAILED) {
+	if (ret == FAILED) {
 		DEBUG3(printk("%s(%ld): device reset failed\n",
 		    __func__, ha->host_no));
 		qla_printk(KERN_INFO, ha, "%s: device reset failed\n",
@@ -1458,10 +913,10 @@ qla2xxx_eh_device_reset(struct scsi_cmnd
 	 * complete for the device.
 	 */
 	if (cmd->device->host->eh_active) {
-		if (qla2x00_eh_wait_for_pending_target_commands(ha, t))
-			return_status = FAILED;
+		if (qla2x00_eh_wait_for_pending_target_commands(ha, id))
+			ret = FAILED;
 
-		if (return_status == FAILED) {
+		if (ret == FAILED) {
 			DEBUG3(printk("%s(%ld): failed while waiting for "
 			    "commands\n", __func__, ha->host_no));
 			qla_printk(KERN_INFO, ha,
@@ -1473,15 +928,12 @@ qla2xxx_eh_device_reset(struct scsi_cmnd
 	}
 
 	qla_printk(KERN_INFO, ha,
-	    "scsi(%ld:%d:%d:%d): DEVICE RESET SUCCEEDED.\n",
-	    ha->host_no, b, t, l);
+	    "scsi(%ld:%d:%d): DEVICE RESET SUCCEEDED.\n", ha->host_no, id, lun);
 
 eh_dev_reset_done:
+	spin_lock_irq(ha->host->host_lock);
 
-	if (!cmd->device->host->eh_active)
-		clear_bit(TQF_SUSPENDED, &tq->flags);
-
-	return (return_status);
+	return ret;
 }
 
 /**************************************************************************
@@ -1549,44 +1001,55 @@ qla2x00_eh_wait_for_pending_commands(scs
 int
 qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd)
 {
-	scsi_qla_host_t *ha;
+	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;
 	srb_t *sp;
-	int rval = FAILED;
+	int ret;
+	unsigned int id, lun;
+	unsigned long serial;
+
+	ret = FAILED;
+
+	id = cmd->device->id;
+	lun = cmd->device->lun;
+	serial = cmd->serial_number;
 
-	ha = (scsi_qla_host_t *) cmd->device->host->hostdata;
 	sp = (srb_t *) CMD_SP(cmd);
+	lq = GET_LU_Q(ha, id, lun);
+	if (!sp || !fcport || !lq)
+		return ret;
 
 	qla_printk(KERN_INFO, ha,
-	    "scsi(%ld:%d:%d:%d): LOOP RESET ISSUED.\n", ha->host_no,
-	    cmd->device->channel, cmd->device->id, cmd->device->lun);
+	    "scsi(%ld:%d:%d): LOOP RESET ISSUED.\n", ha->host_no, id, lun);
 
 	spin_unlock_irq(ha->host->host_lock);
 
 	if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS) {
 		DEBUG2(printk("%s failed:board disabled\n",__func__));
-		spin_lock_irq(ha->host->host_lock);
-		return FAILED;
+		goto eh_bus_reset_done;
 	}
 
 	if (qla2x00_wait_for_loop_ready(ha) == QLA_SUCCESS) {
-		if (qla2x00_loop_reset(ha) == QLA_SUCCESS) 
-			rval = SUCCESS;
+		if (qla2x00_loop_reset(ha) == QLA_SUCCESS)
+			ret = SUCCESS;
 	}
-
-	spin_lock_irq(ha->host->host_lock);
-	if (rval == FAILED)
-		goto out;
+	if (ret == FAILED)
+		goto eh_bus_reset_done;
 
 	/* Waiting for our command in done_queue to be returned to OS.*/
 	if (cmd->device->host->eh_active)
 		if (!qla2x00_eh_wait_for_pending_commands(ha))
-			rval = FAILED;
+			ret = FAILED;
 
- out:
+eh_bus_reset_done:
 	qla_printk(KERN_INFO, ha, "%s: reset %s\n", __func__,
-			(rval == FAILED) ? "failed" : "succeded");
+	    (ret == FAILED) ? "failed" : "succeded");
 
-	return rval;
+	spin_lock_irq(ha->host->host_lock);
+
+	return ret;
 }
 
 /**************************************************************************
@@ -1607,24 +1070,33 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *c
 int
 qla2xxx_eh_host_reset(struct scsi_cmnd *cmd)
 {
-	scsi_qla_host_t *ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
-	int		rval = SUCCESS;
+	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;
+	srb_t *sp;
+	int ret;
+	unsigned int id, lun;
+	unsigned long serial;
 
-	/* Display which one we're actually resetting for debug. */
-	DEBUG(printk("qla2xxx_eh_host_reset:Resetting scsi(%ld).\n",
-	    ha->host_no));
+	ret = FAILED;
+
+	id = cmd->device->id;
+	lun = cmd->device->lun;
+	serial = cmd->serial_number;
+
+	sp = (srb_t *) CMD_SP(cmd);
+	lq = GET_LU_Q(ha, id, lun);
+	if (!sp || !fcport || !lq)
+		return ret;
 
-	/*
-	 *  Now issue reset.
-	 */
 	qla_printk(KERN_INFO, ha,
-	    "scsi(%ld:%d:%d:%d): ADAPTER RESET issued.\n", ha->host_no,
-	    cmd->device->channel, cmd->device->id, cmd->device->lun);
+	    "scsi(%ld:%d:%d): ADAPTER RESET ISSUED.\n", ha->host_no, id, lun);
 
 	spin_unlock_irq(ha->host->host_lock);
 
 	if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS)
-		goto board_disabled;
+		goto eh_host_reset_lock;
 
 	/*
 	 * Fixme-may be dpc thread is active and processing
@@ -1634,7 +1106,6 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *
 	 * devices as lost kicking of the port_down_timer
 	 * while dpc is stuck for the mailbox to complete.
 	 */
-	/* Blocking call-Does context switching if loop is Not Ready */
 	qla2x00_wait_for_loop_ready(ha);
 	set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
 	if (qla2x00_abort_isp(ha)) {
@@ -1643,32 +1114,22 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *
 		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
 
 		if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS)
-			goto board_disabled;
+			goto eh_host_reset_lock;
 	} 
-
 	clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
 
-	spin_lock_irq(ha->host->host_lock);
-	if (rval == FAILED)
-		goto out;
-
 	/* Waiting for our command in done_queue to be returned to OS.*/
-	if (!qla2x00_eh_wait_for_pending_commands(ha))
-		rval = FAILED;
-
- out:
-	qla_printk(KERN_INFO, ha, "%s: reset %s\n", __func__,
-			(rval == FAILED) ? "failed" : "succeded");
-
-	return rval;
+	if (qla2x00_eh_wait_for_pending_commands(ha))
+		ret = SUCCESS;
 
- board_disabled:
+eh_host_reset_lock:
 	spin_lock_irq(ha->host->host_lock);
 
-	qla_printk(KERN_INFO, ha, "%s: failed:board disabled\n", __func__);
-	return FAILED;
-}
+	qla_printk(KERN_INFO, ha, "%s: reset %s\n", __func__,
+	    (ret == FAILED) ? "failed" : "succeded");
 
+	return ret;
+}
 
 /*
 * qla2x00_loop_reset
@@ -1752,41 +1213,38 @@ qla2x00_device_reset(scsi_qla_host_t *ha
 	return qla2x00_abort_target(reset_fcport);
 }
 
-/**************************************************************************
-* qla2xxx_slave_configure
-*
-* Description:
-**************************************************************************/
-int
-qla2xxx_slave_configure(struct scsi_device *sdev)
+static int
+qla2xxx_slave_alloc(struct scsi_device *sdev)
 {
 	scsi_qla_host_t *ha = to_qla_host(sdev->host);
-	int queue_depth;
+	os_tgt_t *tq;
 
-	if (IS_QLA2100(ha) || IS_QLA2200(ha))
-		queue_depth = 16;
-	else
-		queue_depth = 32;
+	tq = (os_tgt_t *) TGT_Q(ha, sdev->id);
+	if (!tq)
+		return -ENXIO;
+	if (!tq->fcport)
+		return -ENXIO;
 
-	if (sdev->tagged_supported) {
-		if (ql2xmaxqdepth != 0 && ql2xmaxqdepth <= 0xffffU)
-			queue_depth = ql2xmaxqdepth;
+	sdev->hostdata = tq;
 
-		ql2xmaxqdepth = queue_depth;
+	return 0;
+}
 
-		scsi_activate_tcq(sdev, queue_depth);
+static int
+qla2xxx_slave_configure(struct scsi_device *sdev)
+{
+	if (sdev->tagged_supported)
+		scsi_activate_tcq(sdev, 32);
+	else
+		scsi_deactivate_tcq(sdev, 32);
 
-		qla_printk(KERN_INFO, ha,
-		    "scsi(%d:%d:%d:%d): Enabled tagged queuing, queue "
-		    "depth %d.\n",
-		    sdev->host->host_no, sdev->channel, sdev->id, sdev->lun,
-		    sdev->queue_depth);
-	} else {
-		 scsi_adjust_queue_depth(sdev, 0 /* TCQ off */,
-		     sdev->host->hostt->cmd_per_lun /* 3 */);
-	}
+	return 0;
+}
 
-	return (0);
+static void
+qla2xxx_slave_destroy(struct scsi_device *sdev)
+{
+	sdev->hostdata = NULL;
 }
 
 /**
@@ -1993,10 +1451,6 @@ int qla2x00_probe_one(struct pci_dev *pd
 	INIT_LIST_HEAD(&ha->list);
 	INIT_LIST_HEAD(&ha->fcports);
 	INIT_LIST_HEAD(&ha->rscn_fcports);
-	INIT_LIST_HEAD(&ha->done_queue);
-	INIT_LIST_HEAD(&ha->retry_queue);
-	INIT_LIST_HEAD(&ha->scsi_retry_queue);
-	INIT_LIST_HEAD(&ha->pending_queue);
 
 	/*
 	 * These locks are used to prevent more than one CPU
@@ -2005,7 +1459,6 @@ int qla2x00_probe_one(struct pci_dev *pd
 	 * contention for these locks.
 	 */
 	spin_lock_init(&ha->mbx_reg_lock);
-	spin_lock_init(&ha->list_lock);
 
 	ha->dpc_pid = -1;
 	init_completion(&ha->dpc_inited);
@@ -2381,13 +1834,6 @@ qla2x00_proc_info(struct Scsi_Host *shos
 	    "Number of retries for empty slots = %ld\n",
 	    qla2x00_stats.outarray_full);
 
-	copy_info(&info,
-	    "Number of reqs in pending_q= %ld, retry_q= %d, "
-	    "done_q= %ld, scsi_retry_q= %d\n",
-	    ha->qthreads, ha->retry_q_cnt,
-	    ha->done_q_cnt, ha->scsi_retry_q_cnt);
-
-
 	flags = (uint32_t *) &ha->flags;
 
 	if (atomic_read(&ha->loop_state) == LOOP_DOWN) {
@@ -2631,93 +2077,6 @@ qla2x00_display_fc_names(scsi_qla_host_t
 	}
 }
 
-/*
- *  qla2x00_suspend_lun
- *	Suspend lun and start port down timer
- *
- * Input:
- *	ha = visable adapter block pointer.
- *  lq = lun queue
- *  cp = Scsi command pointer 
- *  time = time in seconds
- *  count = number of times to let time expire
- *  delay_lun = non-zero, if lun should be delayed rather than suspended
- *
- * Return:
- *     QLA_SUCCESS  -- suspended lun 
- *     QLA_FUNCTION_FAILED  -- Didn't suspend lun
- *
- * Context:
- *	Interrupt context.
- */
-int
-__qla2x00_suspend_lun(scsi_qla_host_t *ha,
-		os_lun_t *lq, int time, int count, int delay_lun)
-{
-	int	rval;
-	srb_t *sp;
-	struct list_head *list, *temp;
-	unsigned long flags;
-
-	rval = QLA_SUCCESS;
-
-	/* if the lun_q is already suspended then don't do it again */
-	if (lq->q_state == LUN_STATE_READY ||lq->q_state == LUN_STATE_RUN) {
-
-		spin_lock_irqsave(&lq->q_lock, flags);
-		if (lq->q_state == LUN_STATE_READY) {
-			lq->q_max = count;
-			lq->q_count = 0;
-		}
-		/* Set the suspend time usually 6 secs */
-		atomic_set(&lq->q_timer, time);
-
-		/* now suspend the lun */
-		lq->q_state = LUN_STATE_WAIT;
-
-		if (delay_lun) {
-			set_bit(LUN_EXEC_DELAYED, &lq->q_flag);
-			DEBUG(printk(KERN_INFO
-			    "scsi(%ld): Delay lun execution for %d secs, "
-			    "count=%d, max count=%d, state=%d\n",
-			    ha->host_no,
-			    time,
-			    lq->q_count, lq->q_max, lq->q_state));
-		} else {
-			DEBUG(printk(KERN_INFO
-			    "scsi(%ld): Suspend lun for %d secs, count=%d, "
-			    "max count=%d, state=%d\n",
-			    ha->host_no,
-			    time,
-			    lq->q_count, lq->q_max, lq->q_state));
-		}
-		spin_unlock_irqrestore(&lq->q_lock, flags);
-
-		/*
-		 * Remove all pending commands from request queue and  put them
-		 * in the scsi_retry queue.
-		 */
-		spin_lock_irqsave(&ha->list_lock, flags);
-		list_for_each_safe(list, temp, &ha->pending_queue) {
-			sp = list_entry(list, srb_t, list);
-			if (sp->lun_queue != lq)
-				continue;
-
-			__del_from_pending_queue(ha, sp);
-
-			if (sp->cmd->allowed < count)
-				sp->cmd->allowed = count;
-			__add_to_scsi_retry_queue(ha, sp);
-
-		} /* list_for_each_safe */
-		spin_unlock_irqrestore(&ha->list_lock, flags);
-		rval = QLA_SUCCESS;
-	} else {
-		rval = QLA_FUNCTION_FAILED;
-	}
-
-	return (rval);
-}
 
 /*
  * qla2x00_mark_device_lost Updates fcport state when device goes offline.
@@ -3188,16 +2547,8 @@ qla2x00_do_dpc(void *data)
 	DECLARE_MUTEX_LOCKED(sem);
 	scsi_qla_host_t *ha;
 	fc_port_t	*fcport;
-	os_lun_t        *q;
-	srb_t           *sp;
 	uint8_t		status;
-	unsigned long	flags = 0;
-	struct list_head *list, *templist;
-	int	dead_cnt, online_cnt;
-	int	retry_cmds = 0;
 	uint16_t	next_loopid;
-	int t;
-	os_tgt_t *tq;
 
 	ha = (scsi_qla_host_t *)data;
 
@@ -3233,139 +2584,7 @@ qla2x00_do_dpc(void *data)
 
 		ha->dpc_active = 1;
 
-		if (!list_empty(&ha->done_queue))
-			qla2x00_done(ha);
-
-		/* Process commands in retry queue */
-		if (test_and_clear_bit(PORT_RESTART_NEEDED, &ha->dpc_flags)) {
-			DEBUG(printk("scsi(%ld): DPC checking retry_q. "
-			    "total=%d\n",
-			    ha->host_no, ha->retry_q_cnt));
-
-			spin_lock_irqsave(&ha->list_lock, flags);
-			dead_cnt = online_cnt = 0;
-			list_for_each_safe(list, templist, &ha->retry_queue) {
-				sp = list_entry(list, srb_t, list);
-				q = sp->lun_queue;
-				DEBUG3(printk("scsi(%ld): pid=%ld sp=%p, "
-				    "spflags=0x%x, q_flag= 0x%lx\n",
-				    ha->host_no, sp->cmd->serial_number, sp,
-				    sp->flags, q->q_flag));
-
-				if (q == NULL)
-					continue;
-				fcport = q->fclun->fcport;
-
-				if (atomic_read(&fcport->state) ==
-				    FCS_DEVICE_DEAD ||
-				    atomic_read(&fcport->ha->loop_state) == LOOP_DEAD) {
-
-					__del_from_retry_queue(ha, sp);
-					sp->cmd->result = DID_NO_CONNECT << 16;
-					if (atomic_read(&fcport->ha->loop_state) ==
-					    LOOP_DOWN) 
-						sp->err_id = SRB_ERR_LOOP;
-					else
-						sp->err_id = SRB_ERR_PORT;
-					sp->cmd->host_scribble =
-					    (unsigned char *) NULL;
-					__add_to_done_queue(ha, sp);
-					dead_cnt++;
-				} else if (atomic_read(&fcport->state) !=
-				    FCS_DEVICE_LOST) {
-
-					__del_from_retry_queue(ha, sp);
-					sp->cmd->result = DID_BUS_BUSY << 16;
-					sp->cmd->host_scribble =
-					    (unsigned char *) NULL;
-					__add_to_done_queue(ha, sp);
-					online_cnt++;
-				}
-			} /* list_for_each_safe() */
-			spin_unlock_irqrestore(&ha->list_lock, flags);
-
-			DEBUG(printk("scsi(%ld): done processing retry queue "
-			    "- dead=%d, online=%d\n ",
-			    ha->host_no, dead_cnt, online_cnt));
-		}
-
-		/* Process commands in scsi retry queue */
-		if (test_and_clear_bit(SCSI_RESTART_NEEDED, &ha->dpc_flags)) {
-			/*
-			 * Any requests we want to delay for some period is put
-			 * in the scsi retry queue with a delay added. The
-			 * timer will schedule a "scsi_restart_needed" every 
-			 * second as long as there are requests in the scsi
-			 * queue. 
-			 */
-			DEBUG(printk("scsi(%ld): DPC checking scsi "
-			    "retry_q.total=%d\n",
-			    ha->host_no, ha->scsi_retry_q_cnt));
-
-			online_cnt = 0;
-			spin_lock_irqsave(&ha->list_lock, flags);
-			list_for_each_safe(list, templist,
-			    &ha->scsi_retry_queue) {
-
-				sp = list_entry(list, srb_t, list);
-				q = sp->lun_queue;
-				tq = sp->tgt_queue;
-
-				DEBUG3(printk("scsi(%ld): scsi_retry_q: "
-				    "pid=%ld sp=%p, spflags=0x%x, "
-				    "q_flag= 0x%lx,q_state=%d\n",
-				    ha->host_no, sp->cmd->serial_number,
-				    sp, sp->flags, q->q_flag, q->q_state));
-
-				/* Was this lun suspended */
-				if (q->q_state != LUN_STATE_WAIT) {
-					online_cnt++;
-					__del_from_scsi_retry_queue(ha, sp);
-
-					if (test_bit(TQF_RETRY_CMDS,
-					    &tq->flags)) {
-						qla2x00_extend_timeout(sp->cmd,
-						    (sp->cmd->timeout_per_command / HZ) - QLA_CMD_TIMER_DELTA);
-						__add_to_pending_queue(ha, sp);
-						retry_cmds++;
-					} else
-						__add_to_retry_queue(ha, sp);
-				}
-
-				/* Was this command suspended for N secs */
-				if (sp->delay != 0) {
-					sp->delay--;
-					if (sp->delay == 0) {
-						online_cnt++;
-						__del_from_scsi_retry_queue(
-						    ha, sp);
-						__add_to_retry_queue(ha,sp);
-					}
-				}
-			}
-			spin_unlock_irqrestore(&ha->list_lock, flags);
-
-			/* Clear all Target Unsuspended bits */
-			for (t = 0; t < ha->max_targets; t++) {
-				if ((tq = ha->otgt[t]) == NULL)
-					continue;
-
-				if (test_bit(TQF_RETRY_CMDS, &tq->flags))
-					clear_bit(TQF_RETRY_CMDS, &tq->flags);
-			}
-			if (retry_cmds)
-				qla2x00_next(ha);
-
-			DEBUG(if (online_cnt > 0))
-			DEBUG(printk("scsi(%ld): dpc() found scsi reqs to "
-			    "restart= %d\n",
-			    ha->host_no, online_cnt));
-		}
-
 		if (ha->flags.mbox_busy) {
-			if (!list_empty(&ha->done_queue))
-				qla2x00_done(ha);
-
 			ha->dpc_active = 0;
 			continue;
 		}
@@ -3493,28 +2712,6 @@ qla2x00_do_dpc(void *data)
 			    ha->host_no));
 		}
 
-
-		if (test_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags)) {
-			DEBUG(printk("scsi(%ld): qla2x00_restart_queues()\n",
-			    ha->host_no));
-
-			qla2x00_restart_queues(ha, 0);
-
-			DEBUG(printk("scsi(%ld): qla2x00_restart_queues - end\n",
-			    ha->host_no));
-		}
-
-		if (test_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags)) {
-
-			DEBUG(printk("scsi(%ld): qla2x00_abort_queues()\n",
-			    ha->host_no));
-				
-			qla2x00_abort_queues(ha, 0);
-
-			DEBUG(printk("scsi(%ld): qla2x00_abort_queues - end\n",
-			    ha->host_no));
-		}
-
 		if (test_and_clear_bit(FCPORT_RESCAN_NEEDED, &ha->dpc_flags)) {
 
 			DEBUG(printk("scsi(%ld): Rescan flagged fcports...\n",
@@ -3527,13 +2724,9 @@ qla2x00_do_dpc(void *data)
 			    ha->host_no));
 		}
 
-
 		if (!ha->interrupts_on)
 			qla2x00_enable_intrs(ha);
 
-		if (!list_empty(&ha->done_queue))
-			qla2x00_done(ha);
-
 		ha->dpc_active = 0;
 	} /* End of while(1) */
 
@@ -3549,45 +2742,6 @@ qla2x00_do_dpc(void *data)
 }
 
 /*
- *  qla2x00_abort_queues
- *	Abort all commands on queues on device
- *
- * Input:
- *	ha = adapter block pointer.
- *
- * Context:
- *	Interrupt context.
- */
-void
-qla2x00_abort_queues(scsi_qla_host_t *ha, uint8_t doneqflg) 
-{
-
-	srb_t       *sp;
-	struct list_head *list, *temp;
-	unsigned long flags;
-
-	clear_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags);
-
-	/* Return all commands device queues. */
-	spin_lock_irqsave(&ha->list_lock,flags);
-	list_for_each_safe(list, temp, &ha->pending_queue) {
-		sp = list_entry(list, srb_t, list);
-
-		if (sp->flags & SRB_ABORTED)
-			continue;
-
-		/* Remove srb from LUN queue. */
-		__del_from_pending_queue(ha, sp);
-
-		/* Set ending status. */
-		sp->cmd->result = DID_BUS_BUSY << 16;
-
-		__add_to_done_queue(ha, sp);
-	}
-	spin_unlock_irqrestore(&ha->list_lock, flags);
-}
-
-/*
 *  qla2x00_rst_aen
 *      Processes asynchronous reset.
 *
@@ -3632,6 +2786,36 @@ qla2x00_get_new_sp(scsi_qla_host_t *ha)
 	return (sp);
 }
 
+static void
+qla2x00_sp_free_dma(scsi_qla_host_t *ha, srb_t *sp)
+{
+	struct scsi_cmnd *cmd = sp->cmd;
+
+	if (sp->flags & SRB_DMA_VALID) {
+		if (cmd->use_sg) {
+			dma_unmap_sg(&ha->pdev->dev, cmd->request_buffer,
+			    cmd->use_sg, cmd->sc_data_direction);
+		} else if (cmd->request_bufflen) {
+			dma_unmap_single(&ha->pdev->dev, sp->dma_handle,
+			    cmd->request_bufflen, cmd->sc_data_direction);
+		}
+		sp->flags &= ~SRB_DMA_VALID;
+	}
+}
+
+void
+qla2x00_sp_compl(scsi_qla_host_t *ha, srb_t *sp)
+{
+	struct scsi_cmnd *cmd = sp->cmd;
+
+	qla2x00_sp_free_dma(ha, sp);
+
+	CMD_SP(cmd) = NULL;
+	mempool_free(sp, ha->srb_mempool);
+
+	cmd->scsi_done(cmd);
+}
+
 /**************************************************************************
 *   qla2x00_timer
 *
@@ -3643,30 +2827,12 @@ qla2x00_get_new_sp(scsi_qla_host_t *ha)
 static void
 qla2x00_timer(scsi_qla_host_t *ha)
 {
-	int		t,l;
 	unsigned long	cpu_flags = 0;
 	fc_port_t	*fcport;
-	os_lun_t *lq;
-	os_tgt_t *tq;
 	int		start_dpc = 0;
 	int		index;
 	srb_t		*sp;
-
-	/*
-	 * We try and restart any request in the retry queue every second.
-	 */
-	if (!list_empty(&ha->retry_queue)) {
-		set_bit(PORT_RESTART_NEEDED, &ha->dpc_flags);
-		start_dpc++;
-	}
-
-	/*
-	 * We try and restart any request in the scsi_retry queue every second.
-	 */
-	if (!list_empty(&ha->scsi_retry_queue)) {
-		set_bit(SCSI_RESTART_NEEDED, &ha->dpc_flags);
-		start_dpc++;
-	}
+	int		t;
 
 	/*
 	 * Ports - Port down timer.
@@ -3696,59 +2862,6 @@ qla2x00_timer(scsi_qla_host_t *ha)
 		t++;
 	} /* End of for fcport  */
 
-	/*
-	 * LUNS - lun suspend timer.
-	 *
-	 * Whenever, a lun is suspended the timer starts decrementing its
-	 * suspend timer every second until it reaches zero. Once  it reaches
-	 * zero the lun retry count is decremented. 
-	 */
-
-	/*
-	 * FIXME(dg) - Need to convert this linear search of luns into a search
-	 * of a list of suspended luns.
-	 */
-	for (t = 0; t < ha->max_targets; t++) {
-		if ((tq = ha->otgt[t]) == NULL)
-			continue;
-
-		for (l = 0; l < ha->max_luns; l++) {
-			if ((lq = (os_lun_t *) tq->olun[l]) == NULL)
-				continue;
-
-			spin_lock_irqsave(&lq->q_lock, cpu_flags);
-			if (lq->q_state == LUN_STATE_WAIT &&
-				atomic_read(&lq->q_timer) != 0) {
-
-				if (atomic_dec_and_test(&lq->q_timer) != 0) {
-					/*
-					 * A delay should immediately
-					 * transition to a READY state
-					 */
-					if (test_and_clear_bit(LUN_EXEC_DELAYED,
-					    &lq->q_flag)) {
-						lq->q_state = LUN_STATE_READY;
-					}
-					else {
-						lq->q_count++;
-						if (lq->q_count == lq->q_max)
-							lq->q_state =
-							    LUN_STATE_TIMEOUT;
-						else
-							lq->q_state =
-							    LUN_STATE_RUN;
-					}
-				}
-				DEBUG3(printk("scsi(%ld): lun%d - timer %d, "
-				    "count=%d, max=%d, state=%d\n",
-				    ha->host_no,
-				    l,
-				    atomic_read(&lq->q_timer),
-				    lq->q_count, lq->q_max, lq->q_state));
-			}
-			spin_unlock_irqrestore(&lq->q_lock, cpu_flags);
-		} /* End of for luns  */
-	} /* End of for targets  */
 
 	/* Loop down handler. */
 	if (atomic_read(&ha->loop_down_timer) > 0 &&
@@ -3808,19 +2921,12 @@ qla2x00_timer(scsi_qla_host_t *ha)
 		    atomic_read(&ha->loop_down_timer)));
 	}
 
-	/*
-	 * Done Q Handler -- dgFIXME This handler will kick off doneq if we
-	 * haven't process it in 2 seconds.
-	 */
-	if (!list_empty(&ha->done_queue))
-		qla2x00_done(ha);
-
-
 	/* Schedule the DPC routine if needed */
 	if ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) ||
 	    test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) ||
 	    start_dpc ||
 	    test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags) ||
+	    test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) ||
 	    test_bit(RELOGIN_NEEDED, &ha->dpc_flags)) &&
 	    ha->dpc_wait && !ha->dpc_active) {
 
@@ -3830,496 +2936,6 @@ qla2x00_timer(scsi_qla_host_t *ha)
 	qla2x00_restart_timer(ha, WATCH_INTERVAL);
 }
 
-/*
- * qla2x00_extend_timeout
- *      This routine will extend the timeout to the specified value.
- *
- * Input:
- *      cmd = SCSI command structure
- *
- * Returns:
- *      None.
- */
-void 
-qla2x00_extend_timeout(struct scsi_cmnd *cmd, int timeout) 
-{
-	srb_t *sp = (srb_t *) CMD_SP(cmd);
-	u_long our_jiffies = (timeout * HZ) + jiffies;
-
-    	sp->ext_history= 0; 
-	sp->e_start = jiffies;
-	if (cmd->eh_timeout.function) {
-		mod_timer(&cmd->eh_timeout,our_jiffies);
-		sp->ext_history |= 1;
-	}
-	if (sp->timer.function != NULL) {
-		/* 
-		 * Our internal timer should timeout before the midlayer has a
-		 * chance begin the abort process
-		 */
-		mod_timer(&sp->timer,our_jiffies - (QLA_CMD_TIMER_DELTA * HZ));
-
-    	 	sp->ext_history |= 2;
-	}
-}
-
-/**************************************************************************
-*   qla2x00_cmd_timeout
-*
-* Description:
-*       Handles the command if it times out in any state.
-*
-* Input:
-*     sp - pointer to validate
-*
-* Returns:
-* None.
-* Note:Need to add the support for if( sp->state == SRB_FAILOVER_STATE).
-**************************************************************************/
-void
-qla2x00_cmd_timeout(srb_t *sp)
-{
-	int t, l;
-	int processed;
-	scsi_qla_host_t *vis_ha, *dest_ha;
-	struct scsi_cmnd *cmd;
-	unsigned long flags, cpu_flags;
-	fc_port_t *fcport;
-
-	cmd = sp->cmd;
-	vis_ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
-
-	DEBUG3(printk("cmd_timeout: Entering sp->state = %x\n", sp->state));
-
-	t = cmd->device->id;
-	l = cmd->device->lun;
-	fcport = sp->fclun->fcport;
-	dest_ha = sp->ha;
-
-	/*
-	 * If IO is found either in retry Queue 
-	 *    OR in Lun Queue
-	 * Return this IO back to host
-	 */
-	spin_lock_irqsave(&vis_ha->list_lock, flags);
-	processed = 0;
-	if (sp->state == SRB_PENDING_STATE) {
-		__del_from_pending_queue(vis_ha, sp);
-		DEBUG2(printk("scsi(%ld): Found in Pending queue pid %ld, "
-		    "State = %x., fcport state=%d sjiffs=%lx njiffs=%lx\n",
-		    vis_ha->host_no, cmd->serial_number, sp->state,
-		    atomic_read(&fcport->state), sp->r_start, jiffies));
-
-		/*
-		 * If FC_DEVICE is marked as dead return the cmd with
-		 * DID_NO_CONNECT status.  Otherwise set the host_byte to
-		 * DID_BUS_BUSY to let the OS  retry this cmd.
-		 */
-		if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
-		    atomic_read(&fcport->ha->loop_state) == LOOP_DEAD) {
-			cmd->result = DID_NO_CONNECT << 16;
-			if (atomic_read(&fcport->ha->loop_state) == LOOP_DOWN) 
-				sp->err_id = SRB_ERR_LOOP;
-			else
-				sp->err_id = SRB_ERR_PORT;
-		} else {
-			cmd->result = DID_BUS_BUSY << 16;
-		}
-		__add_to_done_queue(vis_ha, sp);
-		processed++;
-	} 
-	spin_unlock_irqrestore(&vis_ha->list_lock, flags);
-
-	if (processed) {
-		qla2x00_done(vis_ha);
-		return;
-	}
-
-	spin_lock_irqsave(&dest_ha->list_lock, flags);
-	if ((sp->state == SRB_RETRY_STATE) ||
-	    (sp->state == SRB_SCSI_RETRY_STATE)) {
-
-		DEBUG2(printk("scsi(%ld): Found in (Scsi) Retry queue or "
-		    "failover Q pid %ld, State = %x., fcport state=%d "
-		    "jiffies=%lx retried=%d\n",
-		    dest_ha->host_no, cmd->serial_number, sp->state,
-		    atomic_read(&fcport->state), jiffies, cmd->retries));
-
-		if ((sp->state == SRB_RETRY_STATE)) {
-			__del_from_retry_queue(dest_ha, sp);
-		} else if ((sp->state == SRB_SCSI_RETRY_STATE)) {
-			__del_from_scsi_retry_queue(dest_ha, sp);
-		} 
-
-		/*
-		 * If FC_DEVICE is marked as dead return the cmd with
-		 * DID_NO_CONNECT status.  Otherwise set the host_byte to
-		 * DID_BUS_BUSY to let the OS  retry this cmd.
-		 */
-		if ((atomic_read(&fcport->state) == FCS_DEVICE_DEAD) ||
-		    atomic_read(&dest_ha->loop_state) == LOOP_DEAD) {
-			qla2x00_extend_timeout(cmd, EXTEND_CMD_TIMEOUT);
-			cmd->result = DID_NO_CONNECT << 16;
-			if (atomic_read(&dest_ha->loop_state) == LOOP_DOWN) 
-				sp->err_id = SRB_ERR_LOOP;
-			else
-				sp->err_id = SRB_ERR_PORT;
-		} else {
-			cmd->result = DID_BUS_BUSY << 16;
-		}
-
-		__add_to_done_queue(dest_ha, sp);
-		processed++;
-	} 
-	spin_unlock_irqrestore(&dest_ha->list_lock, flags);
-
-	if (processed) {
-		qla2x00_done(dest_ha);
-		return;
-	}
-
-	spin_lock_irqsave(&dest_ha->list_lock, cpu_flags);
-	if (sp->state == SRB_DONE_STATE) {
-		/* IO in done_q  -- leave it */
-		DEBUG(printk("scsi(%ld): Found in Done queue pid %ld sp=%p.\n",
-		    dest_ha->host_no, cmd->serial_number, sp));
-	} else if (sp->state == SRB_SUSPENDED_STATE) {
-		DEBUG(printk("scsi(%ld): Found SP %p in suspended state  "
-		    "- pid %ld:\n",
-		    dest_ha->host_no, sp, cmd->serial_number));
-		DEBUG(qla2x00_dump_buffer((uint8_t *)sp, sizeof(srb_t));)
-	} else if (sp->state == SRB_ACTIVE_STATE) {
-		/*
-		 * IO is with ISP find the command in our active list.
-		 */
-		spin_unlock_irqrestore(&dest_ha->list_lock, cpu_flags);
-		spin_lock_irqsave(&dest_ha->hardware_lock, flags);
-		if (sp == dest_ha->outstanding_cmds[
-		    (unsigned long)sp->cmd->host_scribble]) {
-
-			DEBUG(printk("cmd_timeout: Found in ISP \n"));
-
-			if (sp->flags & SRB_TAPE) {
-				/*
-				 * We cannot allow the midlayer error handler
-				 * to wakeup and begin the abort process.
-				 * Extend the timer so that the firmware can
-				 * properly return the IOCB.
-				 */
-				DEBUG(printk("cmd_timeout: Extending timeout "
-				    "of FCP2 tape command!\n"));
-				qla2x00_extend_timeout(sp->cmd,
-				    EXTEND_CMD_TIMEOUT);
-			}
-			sp->state = SRB_ACTIVE_TIMEOUT_STATE;
-			spin_unlock_irqrestore(&dest_ha->hardware_lock, flags);
-		} else {
-			spin_unlock_irqrestore(&dest_ha->hardware_lock, flags);
-			printk(KERN_INFO 
-				"qla_cmd_timeout: State indicates it is with "
-				"ISP, But not in active array\n");
-		}
-		spin_lock_irqsave(&dest_ha->list_lock, cpu_flags);
-	} else if (sp->state == SRB_ACTIVE_TIMEOUT_STATE) {
-		DEBUG(printk("qla2100%ld: Found in Active timeout state"
-				"pid %ld, State = %x., \n",
-				dest_ha->host_no,
-				sp->cmd->serial_number, sp->state);)
-	} else {
-		/* EMPTY */
-		DEBUG2(printk("cmd_timeout%ld: LOST command state = "
-				"0x%x, sp=%p\n",
-				vis_ha->host_no, sp->state,sp);)
-
-		qla_printk(KERN_INFO, vis_ha,
-			"cmd_timeout: LOST command state = 0x%x\n", sp->state);
-	}
-	spin_unlock_irqrestore(&dest_ha->list_lock, cpu_flags);
-
-	DEBUG3(printk("cmd_timeout: Leaving\n");)
-}
-
-/**************************************************************************
-* qla2x00_done
-*      Process completed commands.
-*
-* Input:
-*      old_ha           = adapter block pointer.
-*
-**************************************************************************/
-void
-qla2x00_done(scsi_qla_host_t *old_ha)
-{
-	os_lun_t	*lq;
-	struct scsi_cmnd *cmd;
-	unsigned long	flags = 0;
-	scsi_qla_host_t	*ha;
-	scsi_qla_host_t	*vis_ha;
-	int	send_marker_once = 0;
-	srb_t           *sp, *sptemp;
-	LIST_HEAD(local_sp_list);
-
-	/*
-	 * Get into local queue such that we do not wind up calling done queue
-	 * tasklet for the same IOs from DPC or any other place.
-	 */
-	spin_lock_irqsave(&old_ha->list_lock, flags);
-	list_splice_init(&old_ha->done_queue, &local_sp_list);
-	spin_unlock_irqrestore(&old_ha->list_lock, flags);
-
-	/*
-	 * All done commands are in the local queue, now do the call back.
-	 */
-	list_for_each_entry_safe(sp, sptemp, &local_sp_list, list) {
-		old_ha->done_q_cnt--;
-        	sp->state = SRB_NO_QUEUE_STATE;
-
-		/* remove command from local list */
-		list_del_init(&sp->list);
-
-		cmd = sp->cmd;
-		if (cmd == NULL)
-		 	continue;
-
-		vis_ha = (scsi_qla_host_t *)cmd->device->host->hostdata;
-		lq = sp->lun_queue;
-		ha = sp->ha;
-
-		if (sp->flags & SRB_DMA_VALID) {
-			sp->flags &= ~SRB_DMA_VALID;
-
-			/* Release memory used for this I/O */
-			if (cmd->use_sg) {
-				pci_unmap_sg(ha->pdev, cmd->request_buffer,
-				    cmd->use_sg, cmd->sc_data_direction);
-			} else if (cmd->request_bufflen) {
-				pci_unmap_page(ha->pdev, sp->dma_handle,
-				    cmd->request_bufflen,
-				    cmd->sc_data_direction);
-			}
-		}
-
-
-		switch (host_byte(cmd->result)) {
-			case DID_OK:
-			case DID_ERROR:
-				break;
-
-			case DID_RESET:
-				/*
-				 * Set marker needed, so we don't have to
-				 * send multiple markers
-				 */
-				if (!send_marker_once) {
-					ha->marker_needed = 1;
-					send_marker_once++;
-				}
-
-				/*
-				 * WORKAROUND
-				 *
-				 * A backdoor device-reset requires different
-				 * error handling.  This code differentiates
-				 * between normal error handling and the
-				 * backdoor method.
-				 *
-				 */
-				if (ha->host->eh_active != EH_ACTIVE)
-					cmd->result = DID_BUS_BUSY << 16;
-				break;
-
-
-			case DID_ABORT:
-				sp->flags &= ~SRB_ABORT_PENDING;
-				sp->flags |= SRB_ABORTED;
-
-				if (sp->flags & SRB_TIMEOUT)
-					cmd->result = DID_TIME_OUT << 16;
-
-				break;
-
-			default:
-				DEBUG2(printk("scsi(%ld:%d:%d) %s: did_error "
-				    "= %d, comp-scsi= 0x%x-0x%x pid=%ld.\n",
-				    vis_ha->host_no,
-				    cmd->device->id, cmd->device->lun,
-				    __func__,
-				    host_byte(cmd->result),
-				    CMD_COMPL_STATUS(cmd),
-				    CMD_SCSI_STATUS(cmd), cmd->serial_number));
-				break;
-		}
-
-		/*
-		 * Call the mid-level driver interrupt handler -- via sp_put()
-		 */
-		sp_put(ha, sp);
-	} /* end of while */
-}
-
-/*
- * qla2x00_process_response_queue_in_zio_mode
- *	Process response queue completion as fast as possible
- *	to achieve Zero Interrupt Opertions-ZIO
- *
- * Input:
- *	ha = adapter block pointer.
- *
- * Context:
- *	Kernel context.
- */
-static inline void
-qla2x00_process_response_queue_in_zio_mode(scsi_qla_host_t *ha)
-{
-	unsigned long flags;
-
-	/* Check for unprocessed commands in response queue. */
-	if (!ha->flags.process_response_queue)
-		return;
-	if (!ha->flags.online)
-		return;
-	if (ha->response_ring_ptr->signature == RESPONSE_PROCESSED)
-		return;
-	
-	spin_lock_irqsave(&ha->hardware_lock,flags);
-	qla2x00_process_response_queue(ha);
-	spin_unlock_irqrestore(&ha->hardware_lock, flags);
-}
-
-/*
- * qla2x00_next
- *	Retrieve and process next job in the LUN queue.
- *
- * Input:
- *	tq = SCSI target queue pointer.
- *	lq = SCSI LUN queue pointer.
- *	TGT_LOCK must be already obtained.
- *
- * Output:
- *	Releases TGT_LOCK upon exit.
- *
- * Context:
- *	Kernel/Interrupt context.
- * 
- * Note: This routine will always try to start I/O from visible HBA.
- */
-void
-qla2x00_next(scsi_qla_host_t *vis_ha) 
-{
-	int		rval;
-	unsigned long   flags;
-	scsi_qla_host_t *dest_ha;
-	fc_port_t	*fcport;
-	srb_t           *sp, *sptemp;
-	LIST_HEAD(local_sp_list);
-
-	dest_ha = NULL;
-
-	spin_lock_irqsave(&vis_ha->list_lock, flags);
-	list_splice_init(&vis_ha->pending_queue, &local_sp_list);
-	vis_ha->qthreads = 0;
-	spin_unlock_irqrestore(&vis_ha->list_lock, flags);
-
-	list_for_each_entry_safe(sp, sptemp, &local_sp_list, list) {
-		list_del_init(&sp->list);
-        	sp->state = SRB_NO_QUEUE_STATE;
-
-		fcport = sp->fclun->fcport;
-		dest_ha = fcport->ha;
-
-		/* If device is dead then send request back to OS */
-		if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD) {
-			sp->cmd->result = DID_NO_CONNECT << 16;
-			if (atomic_read(&dest_ha->loop_state) == LOOP_DOWN) 
-				sp->err_id = SRB_ERR_LOOP;
-			else
-				sp->err_id = SRB_ERR_PORT;
-
-			DEBUG3(printk("scsi(%ld): loop/port is down - pid=%ld, "
-			    "sp=%p err_id=%d loopid=0x%x queued to dest HBA "
-			    "scsi%ld.\n", dest_ha->host_no,
-			    sp->cmd->serial_number, sp, sp->err_id,
-			    fcport->loop_id, dest_ha->host_no));
-			/* 
-			 * Initiate a failover - done routine will initiate.
-			 */
-			add_to_done_queue(vis_ha, sp);
-
-			continue;
-		}
-
-		/*
-		 * SCSI Kluge: Whenever, we need to wait for an event such as
-		 * loop down (i.e. loop_down_timer ) or port down (i.e.  LUN
-		 * request qeueue is suspended) then we will recycle new
-		 * commands back to the SCSI layer.  We do this because this is
-		 * normally a temporary condition and we don't want the
-		 * mid-level scsi.c driver to get upset and start aborting
-		 * commands.  The timeout value is extracted from the command
-		 * minus 1-second and put on a retry queue (watchdog). Once the
-		 * command timeout it is returned to the mid-level with a BUSY
-		 * status, so the mid-level will retry it. This process
-		 * continues until the LOOP DOWN time expires or the condition
-		 * goes away.
-		 */
-		if (!(sp->flags & (SRB_IOCTL | SRB_TAPE)) &&
-		    (atomic_read(&fcport->state) != FCS_ONLINE ||
-			test_bit(ABORT_ISP_ACTIVE, &dest_ha->dpc_flags) ||
-			atomic_read(&dest_ha->loop_state) != LOOP_READY)) {
-
-			DEBUG3(printk("scsi(%ld): pid=%ld port=0x%x state=%d "
-			    "loop state=%d, loop counter=0x%x "
-			    "dpc_flags=0x%lx\n", sp->cmd->serial_number,
-			    dest_ha->host_no, fcport->loop_id,
-			    atomic_read(&fcport->state),
-			    atomic_read(&dest_ha->loop_state),
-			    atomic_read(&dest_ha->loop_down_timer),
-			    dest_ha->dpc_flags));
-
-			qla2x00_extend_timeout(sp->cmd, EXTEND_CMD_TIMEOUT);
-			add_to_retry_queue(vis_ha, sp);
-
-			continue;
-		} 
-
-		/*
-		 * If this request's lun is suspended then put the request on
-		 * the  scsi_retry queue. 
-		 */
-	 	if (!(sp->flags & (SRB_IOCTL | SRB_TAPE)) &&
-		    sp->lun_queue->q_state == LUN_STATE_WAIT) {
-			DEBUG3(printk("scsi(%ld): lun wait state - pid=%ld, "
-			    "opcode=%d, allowed=%d, retries=%d\n",
-			    dest_ha->host_no,
-			    sp->cmd->serial_number,
-			    sp->cmd->cmnd[0],
-			    sp->cmd->allowed,
-			    sp->cmd->retries));
-				
-			add_to_scsi_retry_queue(vis_ha, sp);
-
-			continue;
-		}
-
-		sp->lun_queue->io_cnt++;
-
-		rval = qla2x00_start_scsi(sp);
-		if (rval != QLA_SUCCESS) {
-			/* Place request back on top of device queue */
-			/* add to the top of queue */
-			add_to_pending_queue_head(vis_ha, sp);
-
-			sp->lun_queue->io_cnt--;
-		}
-	}
-
-	if (!IS_QLA2100(vis_ha) && !IS_QLA2200(vis_ha)) {
-		/* Process response_queue if ZIO support is enabled*/ 
-		qla2x00_process_response_queue_in_zio_mode(vis_ha);
-
-	}
-}
-
 /* XXX(hch): crude hack to emulate a down_timeout() */
 int
 qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout)
-- 
Andrew Vasquez

^ permalink raw reply	[flat|nested] 25+ messages in thread

* PATCH [2/5]  qla2xxx: add remote port codes...
  2005-04-13 19:15 PATCH [0/5] qla2xxx: remote port rework Andrew Vasquez
  2005-04-13 19:18 ` PATCH [1/5] qla2xxx: remove internal queuing Andrew Vasquez
@ 2005-04-13 19:18 ` Andrew Vasquez
  2005-04-13 21:40   ` Christoph Hellwig
  2005-04-17 15:18   ` James Bottomley
  2005-04-13 19:18 ` PATCH [3/5] qla2xxx: remove lun discovery codes Andrew Vasquez
                   ` (4 subsequent siblings)
  6 siblings, 2 replies; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-13 19:18 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley; +Cc: Andrew Vasquez

  Add initial support for FC remote port infrastructure.

     o Use fc_remote_port...() registration and block/unlock
       functions.
     o Consolidate 'attribute' (fc-remote/sysfs) helpers into
       new qla_attr.c file.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

 drivers/scsi/qla2xxx/Makefile   |    2 
 drivers/scsi/qla2xxx/qla_attr.c |  323 ++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/qla2xxx/qla_def.h  |    3 
 drivers/scsi/qla2xxx/qla_gbl.h  |   12 +
 drivers/scsi/qla2xxx/qla_init.c |   31 +++
 drivers/scsi/qla2xxx/qla_os.c   |  302 ++++---------------------------------
 6 files changed, 403 insertions(+), 270 deletions(-)

--- a/drivers/scsi/qla2xxx/Makefile	2005-04-12 15:56:53.000000000 -0700
+++ b/drivers/scsi/qla2xxx/Makefile	2005-04-13 08:41:21.000000000 -0700
@@ -1,7 +1,7 @@
 EXTRA_CFLAGS += -DUNIQUE_FW_NAME
 
 qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \
-		qla_dbg.o qla_sup.o qla_rscn.o
+		qla_dbg.o qla_sup.o qla_rscn.o qla_attr.o
 
 qla2100-y := ql2100.o ql2100_fw.o
 qla2200-y := ql2200.o ql2200_fw.o
--- a/drivers/scsi/qla2xxx/qla_attr.c	1969-12-31 16:00:00.000000000 -0800
+++ b/drivers/scsi/qla2xxx/qla_attr.c	2005-04-13 08:41:21.000000000 -0700
@@ -0,0 +1,323 @@
+/*
+ *                  QLOGIC LINUX SOFTWARE
+ *
+ * QLogic ISP2x00 device driver for Linux 2.6.x
+ * Copyright (C) 2003-2005 QLogic Corporation
+ * (www.qlogic.com)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ */
+#include "qla_def.h"
+
+#include <linux/version.h>
+#include <scsi/scsi_transport_fc.h>
+
+/* SYSFS attributes --------------------------------------------------------- */
+
+static ssize_t
+qla2x00_sysfs_read_fw_dump(struct kobject *kobj, char *buf, loff_t off,
+    size_t count)
+{
+	struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
+	    struct device, kobj)));
+
+	if (ha->fw_dump_reading == 0)
+		return 0;
+	if (off > ha->fw_dump_buffer_len)
+		return 0;
+	if (off + count > ha->fw_dump_buffer_len)
+		count = ha->fw_dump_buffer_len - off;
+
+	memcpy(buf, &ha->fw_dump_buffer[off], count);
+
+	return (count);
+}
+
+static ssize_t
+qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf, loff_t off,
+    size_t count)
+{
+	struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
+	    struct device, kobj)));
+	int reading;
+	uint32_t dump_size;
+
+	if (off != 0)
+		return (0);
+
+	reading = simple_strtol(buf, NULL, 10);
+	switch (reading) {
+	case 0:
+		if (ha->fw_dump_reading == 1) {
+			qla_printk(KERN_INFO, ha,
+			    "Firmware dump cleared on (%ld).\n",
+			    ha->host_no);
+
+			vfree(ha->fw_dump_buffer);
+			free_pages((unsigned long)ha->fw_dump,
+			    ha->fw_dump_order);
+
+			ha->fw_dump_reading = 0;
+			ha->fw_dump_buffer = NULL;
+			ha->fw_dump = NULL;
+		}
+		break;
+	case 1:
+		if (ha->fw_dump != NULL && !ha->fw_dump_reading) {
+			ha->fw_dump_reading = 1;
+
+			dump_size = FW_DUMP_SIZE_1M;
+			if (ha->fw_memory_size < 0x20000) 
+				dump_size = FW_DUMP_SIZE_128K;
+			else if (ha->fw_memory_size < 0x80000) 
+				dump_size = FW_DUMP_SIZE_512K;
+			ha->fw_dump_buffer = (char *)vmalloc(dump_size);
+			if (ha->fw_dump_buffer == NULL) {
+				qla_printk(KERN_WARNING, ha,
+				    "Unable to allocate memory for firmware "
+				    "dump buffer (%d).\n", dump_size);
+
+				ha->fw_dump_reading = 0;
+				return (count);
+			}
+			qla_printk(KERN_INFO, ha,
+			    "Firmware dump ready for read on (%ld).\n",
+			    ha->host_no);
+			memset(ha->fw_dump_buffer, 0, dump_size);
+			if (IS_QLA2100(ha) || IS_QLA2200(ha))
+ 				qla2100_ascii_fw_dump(ha);
+ 			else
+ 				qla2300_ascii_fw_dump(ha);
+			ha->fw_dump_buffer_len = strlen(ha->fw_dump_buffer);
+		}
+		break;
+	}
+	return (count);
+}
+
+static struct bin_attribute sysfs_fw_dump_attr = {
+	.attr = {
+		.name = "fw_dump",
+		.mode = S_IRUSR | S_IWUSR,
+		.owner = THIS_MODULE,
+	},
+	.size = 0,
+	.read = qla2x00_sysfs_read_fw_dump,
+	.write = qla2x00_sysfs_write_fw_dump,
+};
+
+static ssize_t
+qla2x00_sysfs_read_nvram(struct kobject *kobj, char *buf, loff_t off,
+    size_t count)
+{
+	struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
+	    struct device, kobj)));
+	uint16_t	*witer;
+	unsigned long	flags;
+	uint16_t	cnt;
+
+	if (!capable(CAP_SYS_ADMIN) || off != 0 || count != sizeof(nvram_t))
+		return 0;
+
+	/* Read NVRAM. */
+	spin_lock_irqsave(&ha->hardware_lock, flags);
+	qla2x00_lock_nvram_access(ha);
+ 	witer = (uint16_t *)buf;
+ 	for (cnt = 0; cnt < count / 2; cnt++) {
+		*witer = cpu_to_le16(qla2x00_get_nvram_word(ha,
+		    cnt+ha->nvram_base));
+		witer++;
+ 	}
+	qla2x00_unlock_nvram_access(ha);
+	spin_unlock_irqrestore(&ha->hardware_lock, flags);
+
+	return (count);
+}
+
+static ssize_t
+qla2x00_sysfs_write_nvram(struct kobject *kobj, char *buf, loff_t off,
+    size_t count)
+{
+	struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
+	    struct device, kobj)));
+	uint8_t		*iter;
+	uint16_t	*witer;
+	unsigned long	flags;
+	uint16_t	cnt;
+	uint8_t		chksum;
+
+	if (!capable(CAP_SYS_ADMIN) || off != 0 || count != sizeof(nvram_t))
+		return 0;
+
+	/* Checksum NVRAM. */
+	iter = (uint8_t *)buf;
+	chksum = 0;
+	for (cnt = 0; cnt < count - 1; cnt++)
+		chksum += *iter++;
+	chksum = ~chksum + 1;
+	*iter = chksum;
+
+	/* Write NVRAM. */
+	spin_lock_irqsave(&ha->hardware_lock, flags);
+	qla2x00_lock_nvram_access(ha);
+	qla2x00_release_nvram_protection(ha);
+ 	witer = (uint16_t *)buf;
+	for (cnt = 0; cnt < count / 2; cnt++) {
+		qla2x00_write_nvram_word(ha, cnt+ha->nvram_base,
+		    cpu_to_le16(*witer));
+		witer++;
+	}
+	qla2x00_unlock_nvram_access(ha);
+	spin_unlock_irqrestore(&ha->hardware_lock, flags);
+
+	return (count);
+}
+
+static struct bin_attribute sysfs_nvram_attr = {
+	.attr = {
+		.name = "nvram",
+		.mode = S_IRUSR | S_IWUSR,
+		.owner = THIS_MODULE,
+	},
+	.size = sizeof(nvram_t),
+	.read = qla2x00_sysfs_read_nvram,
+	.write = qla2x00_sysfs_write_nvram,
+};
+
+void
+qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha)
+{
+	struct Scsi_Host *host = ha->host;
+
+	sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr);
+	sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr);
+}
+
+void
+qla2x00_free_sysfs_attr(scsi_qla_host_t *ha)
+{
+	struct Scsi_Host *host = ha->host;
+
+	sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr);
+	sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr);
+}
+
+/* Host attributes. */
+
+static void
+qla2x00_get_host_port_id(struct Scsi_Host *shost)
+{
+	scsi_qla_host_t *ha = to_qla_host(shost);
+
+	fc_host_port_id(shost) = ha->d_id.b.domain << 16 |
+	    ha->d_id.b.area << 8 | ha->d_id.b.al_pa;
+}
+
+static void
+qla2x00_get_starget_node_name(struct scsi_target *starget)
+{
+	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
+	scsi_qla_host_t *ha = to_qla_host(host);
+        os_tgt_t *tq = (os_tgt_t *) TGT_Q(ha, starget->id);
+	uint64_t node_name = 0;
+
+	if (tq->fcport)
+		node_name = be64_to_cpu(*(uint64_t *)tq->fcport->node_name);
+	fc_starget_node_name(starget) = node_name;
+}
+
+static void
+qla2x00_get_starget_port_name(struct scsi_target *starget)
+{
+	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
+	scsi_qla_host_t *ha = to_qla_host(host);
+        os_tgt_t *tq = (os_tgt_t *) TGT_Q(ha, starget->id);
+	uint64_t port_name = 0;
+
+	if (tq->fcport)
+		port_name = be64_to_cpu(*(uint64_t *)tq->fcport->port_name);
+	fc_starget_port_name(starget) = port_name;
+}
+
+static void
+qla2x00_get_starget_port_id(struct scsi_target *starget)
+{
+	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
+	scsi_qla_host_t *ha = to_qla_host(host);
+        os_tgt_t *tq = (os_tgt_t *) TGT_Q(ha, starget->id);
+	uint32_t port_id = 0;
+
+	if (tq->fcport)
+		port_id = tq->fcport->d_id.b.domain << 16 |
+		    tq->fcport->d_id.b.area << 8 | tq->fcport->d_id.b.al_pa;
+	fc_starget_port_id(starget) = port_id;
+}
+
+static void
+qla2x00_get_rport_loss_tmo(struct fc_rport *rport)
+{
+	os_tgt_t *tq = rport->dd_data;
+	scsi_qla_host_t *ha = tq->ha;
+
+	rport->dev_loss_tmo = ha->port_down_retry_count + 5;
+}
+
+static void
+qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
+{
+	os_tgt_t *tq = rport->dd_data;
+	scsi_qla_host_t *ha = tq->ha;
+
+	if (timeout)
+		ha->port_down_retry_count = timeout;
+	else
+		ha->port_down_retry_count = 1;
+
+	rport->dev_loss_tmo = ha->port_down_retry_count + 5;
+}
+
+static struct fc_function_template qla2xxx_transport_functions = {
+
+	.show_host_node_name = 1,
+	.show_host_port_name = 1,
+	.get_host_port_id = qla2x00_get_host_port_id,
+	.show_host_port_id = 1,
+
+	.dd_fcrport_size = sizeof(os_tgt_t *),
+
+	.get_starget_node_name = qla2x00_get_starget_node_name,
+	.show_starget_node_name = 1,
+	.get_starget_port_name = qla2x00_get_starget_port_name,
+	.show_starget_port_name = 1,
+	.get_starget_port_id  = qla2x00_get_starget_port_id,
+	.show_starget_port_id = 1,
+
+	.get_rport_dev_loss_tmo = qla2x00_get_rport_loss_tmo,
+	.set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo,
+	.show_rport_dev_loss_tmo = 1,
+
+};
+
+struct scsi_transport_template *
+qla2x00_alloc_transport_tmpl(void)
+{
+	return (fc_attach_transport(&qla2xxx_transport_functions));
+}
+
+void
+qla2x00_init_host_attr(scsi_qla_host_t *ha)
+{
+	fc_host_node_name(ha->host) =
+	    be64_to_cpu(*(uint64_t *)ha->init_cb->node_name);
+	fc_host_port_name(ha->host) =
+	    be64_to_cpu(*(uint64_t *)ha->init_cb->port_name);
+}
--- a/drivers/scsi/qla2xxx/qla_def.h	2005-04-13 08:38:23.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_def.h	2005-04-13 08:41:21.000000000 -0700
@@ -219,7 +219,7 @@
 /*
  * Timeout timer counts in seconds
  */
-#define PORT_RETRY_TIME			2
+#define PORT_RETRY_TIME			1
 #define LOOP_DOWN_TIMEOUT		60
 #define LOOP_DOWN_TIME			255	/* 240 */
 #define	LOOP_DOWN_RESET			(LOOP_DOWN_TIME - 30)
@@ -1718,6 +1718,7 @@ typedef struct fc_port {
     	uint8_t cur_path;		/* current path id */
 
 	lun_bit_mask_t lun_mask;
+	struct fc_rport *rport;
 } fc_port_t;
 
 /*
--- a/drivers/scsi/qla2xxx/qla_gbl.h	2005-04-13 08:38:23.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_gbl.h	2005-04-13 08:42:33.000000000 -0700
@@ -24,6 +24,7 @@
 #define	__QLA_GBL_H
 
 #include <linux/interrupt.h>
+#include <scsi/scsi_transport.h>
 
 extern void qla2x00_remove_one(struct pci_dev *);
 extern int qla2x00_probe_one(struct pci_dev *, struct qla_board_info *);
@@ -48,6 +49,8 @@ extern void qla2x00_tgt_free(scsi_qla_ho
 
 extern int qla2x00_abort_isp(scsi_qla_host_t *);
 
+extern void qla2x00_reg_remote_port(scsi_qla_host_t *, fc_port_t *);
+
 /*
  * Global Data in qla_os.c source file.
  */
@@ -250,4 +253,13 @@ extern void qla2x00_cancel_io_descriptor
 #define qla2x00_alloc_ioctl_mem(ha)		(0)
 #define qla2x00_free_ioctl_mem(ha)		do { } while (0)
 
+/*
+ * Global Function Prototypes in qla_attr.c source file.
+ */
+extern void qla2x00_alloc_sysfs_attr(scsi_qla_host_t *);
+extern void qla2x00_free_sysfs_attr(scsi_qla_host_t *);
+extern struct scsi_transport_template *qla2x00_alloc_transport_tmpl(void);
+extern void qla2x00_init_host_attr(scsi_qla_host_t *);
+extern void qla2x00_alloc_sysfs_attr(scsi_qla_host_t *);
+extern void qla2x00_free_sysfs_attr(scsi_qla_host_t *);
 #endif /* _QLA_GBL_H */
--- a/drivers/scsi/qla2xxx/qla_init.c	2005-04-13 08:38:23.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_init.c	2005-04-13 08:43:25.000000000 -0700
@@ -19,6 +19,7 @@
 #include "qla_def.h"
 
 #include <linux/delay.h>
+#include <scsi/scsi_transport_fc.h>
 
 #include "qla_devtbl.h"
 
@@ -1927,8 +1928,35 @@ qla2x00_update_fcport(scsi_qla_host_t *h
 		qla2x00_lun_discovery(ha, fcport);
 	}
 	atomic_set(&fcport->state, FCS_ONLINE);
+	if (ha->flags.init_done)
+		qla2x00_reg_remote_port(ha, fcport);
 }
 
+void
+qla2x00_reg_remote_port(scsi_qla_host_t *ha, fc_port_t *fcport)
+{
+	struct fc_rport_identifiers rport_ids;
+
+	if (fcport->rport) {
+		fc_remote_port_unblock(fcport->rport);
+		return;
+	}
+
+	rport_ids.node_name = be64_to_cpu(*(uint64_t *)fcport->node_name);
+	rport_ids.port_name = be64_to_cpu(*(uint64_t *)fcport->port_name);
+	rport_ids.port_id = fcport->d_id.b.domain << 16 |
+	    fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa;
+	rport_ids.roles = FC_RPORT_ROLE_UNKNOWN;
+	if (fcport->port_type == FCT_INITIATOR)
+		rport_ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR;
+	if (fcport->port_type == FCT_TARGET)
+		rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET;
+
+	fcport->rport = fc_remote_port_add(ha->host, 0, &rport_ids);
+	if (!fcport->rport)
+		qla_printk(KERN_WARNING, ha,
+		    "Unable to allocate fc remote port!\n");
+}
 /*
  * qla2x00_lun_discovery
  *	Issue SCSI inquiry command for LUN discovery.
@@ -2895,8 +2923,7 @@ qla2x00_device_resync(scsi_qla_host_t *h
 			if (atomic_read(&fcport->state) == FCS_ONLINE) {
 				if (format != 3 ||
 				    fcport->port_type != FCT_INITIATOR) {
-					atomic_set(&fcport->state,
-					    FCS_DEVICE_LOST);
+					qla2x00_mark_device_lost(ha, fcport, 0);
 				}
 			}
 			fcport->flags &= ~FCF_FARP_DONE;
--- a/drivers/scsi/qla2xxx/qla_os.c	2005-04-13 08:38:23.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_os.c	2005-04-13 08:44:32.000000000 -0700
@@ -63,7 +63,7 @@ module_param(ql2xlogintimeout, int, S_IR
 MODULE_PARM_DESC(ql2xlogintimeout,
 		"Login timeout value in seconds.");
 
-int qlport_down_retry;
+int qlport_down_retry = 30;
 module_param(qlport_down_retry, int, S_IRUGO|S_IRUSR);
 MODULE_PARM_DESC(qlport_down_retry,
 		"Maximum number of command retries to a port that returns"
@@ -246,184 +246,8 @@ static srb_t *qla2x00_get_new_sp(scsi_ql
 static void qla2x00_sp_free_dma(scsi_qla_host_t *, srb_t *);
 void qla2x00_sp_compl(scsi_qla_host_t *ha, srb_t *);
 
-static ssize_t qla2x00_sysfs_read_fw_dump(struct kobject *, char *, loff_t,
-    size_t);
-static ssize_t qla2x00_sysfs_write_fw_dump(struct kobject *, char *, loff_t,
-    size_t);
-static struct bin_attribute sysfs_fw_dump_attr = {
-	.attr = {
-		.name = "fw_dump",
-		.mode = S_IRUSR | S_IWUSR,
-		.owner = THIS_MODULE,
-	},
-	.size = 0,
-	.read = qla2x00_sysfs_read_fw_dump,
-	.write = qla2x00_sysfs_write_fw_dump,
-};
-static ssize_t qla2x00_sysfs_read_nvram(struct kobject *, char *, loff_t,
-    size_t);
-static ssize_t qla2x00_sysfs_write_nvram(struct kobject *, char *, loff_t,
-    size_t);
-static struct bin_attribute sysfs_nvram_attr = {
-	.attr = {
-		.name = "nvram",
-		.mode = S_IRUSR | S_IWUSR,
-		.owner = THIS_MODULE,
-	},
-	.size = sizeof(nvram_t),
-	.read = qla2x00_sysfs_read_nvram,
-	.write = qla2x00_sysfs_write_nvram,
-};
-
 /* -------------------------------------------------------------------------- */
 
-
-/* SysFS attributes. */
-static ssize_t qla2x00_sysfs_read_fw_dump(struct kobject *kobj, char *buf,
-    loff_t off, size_t count)
-{
-	struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
-	    struct device, kobj)));
-
-	if (ha->fw_dump_reading == 0)
-		return 0;
-	if (off > ha->fw_dump_buffer_len)
-		return 0;
-	if (off + count > ha->fw_dump_buffer_len)
-		count = ha->fw_dump_buffer_len - off;
-
-	memcpy(buf, &ha->fw_dump_buffer[off], count);
-
-	return (count);
-}
-
-static ssize_t qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf,
-    loff_t off, size_t count)
-{
-	struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
-	    struct device, kobj)));
-	int reading;
-	uint32_t dump_size;
-
-	if (off != 0)
-		return (0);
-
-	reading = simple_strtol(buf, NULL, 10);
-	switch (reading) {
-	case 0:
-		if (ha->fw_dump_reading == 1) {
-			qla_printk(KERN_INFO, ha,
-			    "Firmware dump cleared on (%ld).\n",
-			    ha->host_no);
-
-			vfree(ha->fw_dump_buffer);
-			free_pages((unsigned long)ha->fw_dump,
-			    ha->fw_dump_order);
-
-			ha->fw_dump_reading = 0;
-			ha->fw_dump_buffer = NULL;
-			ha->fw_dump = NULL;
-		}
-		break;
-	case 1:
-		if (ha->fw_dump != NULL && !ha->fw_dump_reading) {
-			ha->fw_dump_reading = 1;
-
-			dump_size = FW_DUMP_SIZE_1M;
-			if (ha->fw_memory_size < 0x20000) 
-				dump_size = FW_DUMP_SIZE_128K;
-			else if (ha->fw_memory_size < 0x80000) 
-				dump_size = FW_DUMP_SIZE_512K;
-			ha->fw_dump_buffer = (char *)vmalloc(dump_size);
-			if (ha->fw_dump_buffer == NULL) {
-				qla_printk(KERN_WARNING, ha,
-				    "Unable to allocate memory for firmware "
-				    "dump buffer (%d).\n", dump_size);
-
-				ha->fw_dump_reading = 0;
-				return (count);
-			}
-			qla_printk(KERN_INFO, ha,
-			    "Firmware dump ready for read on (%ld).\n",
-			    ha->host_no);
-			memset(ha->fw_dump_buffer, 0, dump_size);
-			if (IS_QLA2100(ha) || IS_QLA2200(ha))
- 				qla2100_ascii_fw_dump(ha);
- 			else
- 				qla2300_ascii_fw_dump(ha);
-			ha->fw_dump_buffer_len = strlen(ha->fw_dump_buffer);
-		}
-		break;
-	}
-	return (count);
-}
-
-static ssize_t qla2x00_sysfs_read_nvram(struct kobject *kobj, char *buf,
-    loff_t off, size_t count)
-{
-	struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
-	    struct device, kobj)));
-	uint16_t	*witer;
-	unsigned long	flags;
-	uint16_t	cnt;
-
-	if (!capable(CAP_SYS_ADMIN) || off != 0 || count != sizeof(nvram_t))
-		return 0;
-
-	/* Read NVRAM. */
-	spin_lock_irqsave(&ha->hardware_lock, flags);
-	qla2x00_lock_nvram_access(ha);
- 	witer = (uint16_t *)buf;
- 	for (cnt = 0; cnt < count / 2; cnt++) {
-		*witer = cpu_to_le16(qla2x00_get_nvram_word(ha,
-		    cnt+ha->nvram_base));
-		witer++;
- 	}
-	qla2x00_unlock_nvram_access(ha);
-	spin_unlock_irqrestore(&ha->hardware_lock, flags);
-
-	return (count);
-}
-
-static ssize_t qla2x00_sysfs_write_nvram(struct kobject *kobj, char *buf,
-    loff_t off, size_t count)
-{
-	struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
-	    struct device, kobj)));
-	uint8_t		*iter;
-	uint16_t	*witer;
-	unsigned long	flags;
-	uint16_t	cnt;
-	uint8_t		chksum;
-
-	if (!capable(CAP_SYS_ADMIN) || off != 0 || count != sizeof(nvram_t))
-		return 0;
-
-	/* Checksum NVRAM. */
-	iter = (uint8_t *)buf;
-	chksum = 0;
-	for (cnt = 0; cnt < count - 1; cnt++)
-		chksum += *iter++;
-	chksum = ~chksum + 1;
-	*iter = chksum;
-
-	/* Write NVRAM. */
-	spin_lock_irqsave(&ha->hardware_lock, flags);
-	qla2x00_lock_nvram_access(ha);
-	qla2x00_release_nvram_protection(ha);
- 	witer = (uint16_t *)buf;
-	for (cnt = 0; cnt < count / 2; cnt++) {
-		qla2x00_write_nvram_word(ha, cnt+ha->nvram_base,
-		    cpu_to_le16(*witer));
-		witer++;
-	}
-	qla2x00_unlock_nvram_access(ha);
-	spin_unlock_irqrestore(&ha->hardware_lock, flags);
-
-	return (count);
-}
-
-/* -------------------------------------------------------------------------- */
 static char *
 qla2x00_get_pci_info_str(struct scsi_qla_host *ha, char *str)
 {
@@ -1233,11 +1057,16 @@ qla2xxx_slave_alloc(struct scsi_device *
 static int
 qla2xxx_slave_configure(struct scsi_device *sdev)
 {
+	scsi_qla_host_t *ha = to_qla_host(sdev->host);
+	struct fc_rport *rport = starget_to_rport(sdev->sdev_target);
+
 	if (sdev->tagged_supported)
 		scsi_activate_tcq(sdev, 32);
 	else
 		scsi_deactivate_tcq(sdev, 32);
 
+	rport->dev_loss_tmo = ha->port_down_retry_count + 5;
+
 	return 0;
 }
 
@@ -1370,6 +1199,7 @@ int qla2x00_probe_one(struct pci_dev *pd
 	unsigned long	wait_switch = 0;
 	char pci_info[20];
 	char fw_str[30];
+	fc_port_t *fcport;
 
 	if (pci_enable_device(pdev))
 		return -1;
@@ -1395,7 +1225,7 @@ int qla2x00_probe_one(struct pci_dev *pd
 	/* Configure PCI I/O space */
 	ret = qla2x00_iospace_config(ha);
 	if (ret != 0) {
-		goto probe_failed;
+		goto probe_alloc_failed;
 	}
 
 	/* Sanitize the information from PCI BIOS. */
@@ -1469,9 +1299,23 @@ int qla2x00_probe_one(struct pci_dev *pd
 		qla_printk(KERN_WARNING, ha,
 		    "[ERROR] Failed to allocate memory for adapter\n");
 
-		goto probe_failed;
+		goto probe_alloc_failed;
 	}
 
+	pci_set_drvdata(pdev, ha);
+	host->this_id = 255;
+	host->cmd_per_lun = 3;
+	host->unique_id = ha->instance;
+	host->max_cmd_len = MAX_CMDSZ;
+	host->max_channel = ha->ports - 1;
+	host->max_id = ha->max_targets;
+	host->max_lun = ha->max_luns;
+	host->transportt = qla2xxx_transport_template;
+	if (scsi_add_host(host, &pdev->dev))
+		goto probe_alloc_failed;
+
+	qla2x00_alloc_sysfs_attr(ha);
+
 	if (qla2x00_initialize_adapter(ha) &&
 	    !(ha->device_flags & DFLG_NO_CABLE)) {
 
@@ -1485,6 +1329,7 @@ int qla2x00_probe_one(struct pci_dev *pd
 		goto probe_failed;
 	}
 
+	qla2x00_init_host_attr(ha);
 	/*
 	 * Startup the kernel thread for this host adapter
 	 */
@@ -1498,16 +1343,6 @@ int qla2x00_probe_one(struct pci_dev *pd
 	}
 	wait_for_completion(&ha->dpc_inited);
 
-	host->this_id = 255;
-	host->cmd_per_lun = 3;
-	host->max_cmd_len = MAX_CMDSZ;
-	host->max_channel = ha->ports - 1;
-	host->max_lun = ha->max_luns;
-	BUG_ON(qla2xxx_transport_template == NULL);
-	host->transportt = qla2xxx_transport_template;
-	host->unique_id = ha->instance;
-	host->max_id = ha->max_targets;
-
 	if (IS_QLA2100(ha) || IS_QLA2200(ha))
 		ret = request_irq(host->irq, qla2100_intr_handler,
 		    SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
@@ -1568,7 +1403,6 @@ int qla2x00_probe_one(struct pci_dev *pd
 		msleep(10);
 	}
 
-	pci_set_drvdata(pdev, ha);
 	ha->flags.init_done = 1;
 	num_hosts++;
 
@@ -1577,12 +1411,6 @@ int qla2x00_probe_one(struct pci_dev *pd
 		qla2x00_display_fc_names(ha);
 	}
 
-	if (scsi_add_host(host, &pdev->dev))
-		goto probe_failed;
-
-	sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr);
-	sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr);
-
 	qla_printk(KERN_INFO, ha, "\n"
 	    " QLogic Fibre Channel HBA Driver: %s\n"
 	    "  QLogic %s - %s\n"
@@ -1592,12 +1420,16 @@ int qla2x00_probe_one(struct pci_dev *pd
 	    pci_name(ha->pdev), ha->flags.enable_64bit_addressing ? '+': '-',
 	    ha->host_no, qla2x00_get_fw_version_str(ha, fw_str));
 
-	if (ql2xdoinitscan)
-		scsi_scan_host(host);
+	/* Go with fc_rport registration. */
+	list_for_each_entry(fcport, &ha->fcports, list)
+		qla2x00_reg_remote_port(ha, fcport);
 
 	return 0;
 
 probe_failed:
+	scsi_remove_host(host);
+
+probe_alloc_failed:
 	qla2x00_free_device(ha);
 
 	scsi_host_put(host);
@@ -1615,9 +1447,7 @@ void qla2x00_remove_one(struct pci_dev *
 
 	ha = pci_get_drvdata(pdev);
 
-	sysfs_remove_bin_file(&ha->host->shost_gendev.kobj,
-	    &sysfs_fw_dump_attr);
-	sysfs_remove_bin_file(&ha->host->shost_gendev.kobj, &sysfs_nvram_attr);
+	qla2x00_free_sysfs_attr(ha);
 
 	scsi_remove_host(ha->host);
 
@@ -2090,6 +1920,8 @@ qla2x00_display_fc_names(scsi_qla_host_t
 void qla2x00_mark_device_lost(scsi_qla_host_t *ha, fc_port_t *fcport,
     int do_login)
 {
+	if (atomic_read(&fcport->state) == FCS_ONLINE && fcport->rport)
+		fc_remote_port_block(fcport->rport);
 	/* 
 	 * We may need to retry the login, so don't change the state of the
 	 * port but do the retries.
@@ -2149,7 +1981,8 @@ qla2x00_mark_all_devices_lost(scsi_qla_h
 		 */
 		if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD)
 			continue;
-
+		if (atomic_read(&fcport->state) == FCS_ONLINE && fcport->rport)
+			fc_remote_port_block(fcport->rport);
 		atomic_set(&fcport->state, FCS_DEVICE_LOST);
 	}
 }
@@ -2815,7 +2648,6 @@ qla2x00_sp_compl(scsi_qla_host_t *ha, sr
 
 	cmd->scsi_done(cmd);
 }
-
 /**************************************************************************
 *   qla2x00_timer
 *
@@ -2953,67 +2785,6 @@ qla2x00_down_timeout(struct semaphore *s
 	return -ETIMEDOUT;
 }
 
-static void
-qla2xxx_get_port_id(struct scsi_target *starget)
-{
-	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-	scsi_qla_host_t *ha = to_qla_host(shost);
-	struct fc_port *fc;
-
-	list_for_each_entry(fc, &ha->fcports, list) {
-		if (fc->os_target_id == starget->id) {
-			fc_starget_port_id(starget) = fc->d_id.b.domain << 16 |
-				fc->d_id.b.area << 8 | 
-				fc->d_id.b.al_pa;
-			return;
-		}
-	}
-	fc_starget_port_id(starget) = -1;
-}
-
-static void
-qla2xxx_get_port_name(struct scsi_target *starget)
-{
-	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-	scsi_qla_host_t *ha = to_qla_host(shost);
-	struct fc_port *fc;
-
-	list_for_each_entry(fc, &ha->fcports, list) {
-		if (fc->os_target_id == starget->id) {
-			fc_starget_port_name(starget) =
-				__be64_to_cpu(*(uint64_t *)fc->port_name);
-			return;
-		}
-	}
-	fc_starget_port_name(starget) = -1;
-}
-
-static void
-qla2xxx_get_node_name(struct scsi_target *starget)
-{
-	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
-	scsi_qla_host_t *ha = to_qla_host(shost);
-	struct fc_port *fc;
-
-	list_for_each_entry(fc, &ha->fcports, list) {
-		if (fc->os_target_id == starget->id) {
-			fc_starget_node_name(starget) =
-				__be64_to_cpu(*(uint64_t *)fc->node_name);
-			return;
-		}
-	}
-	fc_starget_node_name(starget) = -1;
-}
-
-static struct fc_function_template qla2xxx_transport_functions = {
-	.get_starget_port_id = qla2xxx_get_port_id,
-	.show_starget_port_id = 1,
-	.get_starget_port_name = qla2xxx_get_port_name,
-	.show_starget_port_name = 1,
-	.get_starget_node_name = qla2xxx_get_node_name,
-	.show_starget_node_name = 1,
-};
-
 /**
  * qla2x00_module_init - Module initialization.
  **/
@@ -3035,8 +2806,7 @@ qla2x00_module_init(void)
 #if DEBUG_QLA2100
 	strcat(qla2x00_version_str, "-debug");
 #endif
-
-	qla2xxx_transport_template = fc_attach_transport(&qla2xxx_transport_functions);
+	qla2xxx_transport_template = qla2x00_alloc_transport_tmpl();
 	if (!qla2xxx_transport_template)
 		return -ENODEV;
 
-- 
Andrew Vasquez

^ permalink raw reply	[flat|nested] 25+ messages in thread

* PATCH [3/5]  qla2xxx: remove lun discovery codes...
  2005-04-13 19:15 PATCH [0/5] qla2xxx: remote port rework Andrew Vasquez
  2005-04-13 19:18 ` PATCH [1/5] qla2xxx: remove internal queuing Andrew Vasquez
  2005-04-13 19:18 ` PATCH [2/5] qla2xxx: add remote port codes Andrew Vasquez
@ 2005-04-13 19:18 ` Andrew Vasquez
  2005-04-13 19:19 ` PATCH [4/5] qla2xxx: cleanup DMA mappings Andrew Vasquez
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-13 19:18 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley; +Cc: Andrew Vasquez

  Remove internal lun discovery routines and support
  structures.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

 drivers/scsi/qla2xxx/qla_attr.c   |   51 +-
 drivers/scsi/qla2xxx/qla_dbg.c    |    5 
 drivers/scsi/qla2xxx/qla_def.h    |  103 ----
 drivers/scsi/qla2xxx/qla_gbl.h    |   10 
 drivers/scsi/qla2xxx/qla_init.c   |  864 --------------------------------------
 drivers/scsi/qla2xxx/qla_inline.h |   17 
 drivers/scsi/qla2xxx/qla_iocb.c   |   13 
 drivers/scsi/qla2xxx/qla_isr.c    |   37 -
 drivers/scsi/qla2xxx/qla_mbx.c    |   21 
 drivers/scsi/qla2xxx/qla_os.c     |  282 +-----------
 10 files changed, 103 insertions(+), 1300 deletions(-)

--- a/drivers/scsi/qla2xxx/qla_attr.c	2005-04-13 08:41:21.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_attr.c	2005-04-13 08:45:53.000000000 -0700
@@ -227,12 +227,17 @@ qla2x00_get_starget_node_name(struct scs
 {
 	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
 	scsi_qla_host_t *ha = to_qla_host(host);
-        os_tgt_t *tq = (os_tgt_t *) TGT_Q(ha, starget->id);
+	fc_port_t *fcport;
 	uint64_t node_name = 0;
 
-	if (tq->fcport)
-		node_name = be64_to_cpu(*(uint64_t *)tq->fcport->node_name);
-	fc_starget_node_name(starget) = node_name;
+	list_for_each_entry(fcport, &ha->fcports, list) {
+		if (starget->id == fcport->os_target_id) {
+			node_name = *(uint64_t *)fcport->node_name;
+			break;
+		}
+	}
+
+	fc_starget_node_name(starget) = be64_to_cpu(node_name);
 }
 
 static void
@@ -240,12 +245,17 @@ qla2x00_get_starget_port_name(struct scs
 {
 	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
 	scsi_qla_host_t *ha = to_qla_host(host);
-        os_tgt_t *tq = (os_tgt_t *) TGT_Q(ha, starget->id);
+	fc_port_t *fcport;
 	uint64_t port_name = 0;
 
-	if (tq->fcport)
-		port_name = be64_to_cpu(*(uint64_t *)tq->fcport->port_name);
-	fc_starget_port_name(starget) = port_name;
+	list_for_each_entry(fcport, &ha->fcports, list) {
+		if (starget->id == fcport->os_target_id) {
+			port_name = *(uint64_t *)fcport->port_name;
+			break;
+		}
+	}
+
+	fc_starget_port_name(starget) = be64_to_cpu(port_name);
 }
 
 static void
@@ -253,20 +263,25 @@ qla2x00_get_starget_port_id(struct scsi_
 {
 	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);
 	scsi_qla_host_t *ha = to_qla_host(host);
-        os_tgt_t *tq = (os_tgt_t *) TGT_Q(ha, starget->id);
-	uint32_t port_id = 0;
+	fc_port_t *fcport;
+	uint32_t port_id = ~0U;
+
+	list_for_each_entry(fcport, &ha->fcports, list) {
+		if (starget->id == fcport->os_target_id) {
+			port_id = fcport->d_id.b.domain << 16 |
+			    fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa;
+			break;
+		}
+	}
 
-	if (tq->fcport)
-		port_id = tq->fcport->d_id.b.domain << 16 |
-		    tq->fcport->d_id.b.area << 8 | tq->fcport->d_id.b.al_pa;
 	fc_starget_port_id(starget) = port_id;
 }
 
 static void
 qla2x00_get_rport_loss_tmo(struct fc_rport *rport)
 {
-	os_tgt_t *tq = rport->dd_data;
-	scsi_qla_host_t *ha = tq->ha;
+	struct Scsi_Host *host = rport_to_shost(rport);
+	scsi_qla_host_t *ha = to_qla_host(host);
 
 	rport->dev_loss_tmo = ha->port_down_retry_count + 5;
 }
@@ -274,8 +289,8 @@ qla2x00_get_rport_loss_tmo(struct fc_rpo
 static void
 qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
 {
-	os_tgt_t *tq = rport->dd_data;
-	scsi_qla_host_t *ha = tq->ha;
+	struct Scsi_Host *host = rport_to_shost(rport);
+	scsi_qla_host_t *ha = to_qla_host(host);
 
 	if (timeout)
 		ha->port_down_retry_count = timeout;
@@ -292,7 +307,7 @@ static struct fc_function_template qla2x
 	.get_host_port_id = qla2x00_get_host_port_id,
 	.show_host_port_id = 1,
 
-	.dd_fcrport_size = sizeof(os_tgt_t *),
+	.dd_fcrport_size = sizeof(struct fc_port *),
 
 	.get_starget_node_name = qla2x00_get_starget_node_name,
 	.show_starget_node_name = 1,
--- a/drivers/scsi/qla2xxx/qla_dbg.c	2005-04-13 08:40:14.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_dbg.c	2005-04-13 08:45:53.000000000 -0700
@@ -1065,11 +1065,6 @@ qla2x00_print_scsi_cmd(struct scsi_cmnd 
 	printk("  sp flags=0x%x\n", sp->flags);
 	printk("  r_start=0x%lx, u_start=0x%lx, f_start=0x%lx, state=%d\n",
 	    sp->r_start, sp->u_start, sp->f_start, sp->state);
-
-	printk(" e_start= 0x%lx, ext_history=%d, fo retry=%d, loopid=%x, "
-	    "port path=%d\n", sp->e_start, sp->ext_history, sp->fo_retry_cnt,
-	    sp->lun_queue->fclun->fcport->loop_id,
-	    sp->lun_queue->fclun->fcport->cur_path);
 }
 
 #if defined(QL_DEBUG_ROUTINES)
--- a/drivers/scsi/qla2xxx/qla_def.h	2005-04-13 08:41:21.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_def.h	2005-04-13 08:45:53.000000000 -0700
@@ -241,6 +241,7 @@ typedef struct srb {
 	struct list_head list;
 
 	struct scsi_qla_host *ha;	/* HA the SP is queued on */
+	struct fc_port *fcport;
 
 	struct scsi_cmnd *cmd;		/* Linux SCSI command pkt */
 
@@ -251,11 +252,6 @@ typedef struct srb {
 	/* Request state */
 	uint16_t state;
 
-	/* Target/LUN queue pointers. */
-	struct os_tgt *tgt_queue;	/* ptr to visible ha's target */
-	struct os_lun *lun_queue;	/* ptr to visible ha's lun */
-	struct fc_lun *fclun;		/* FC LUN context pointer. */
-
 	/* Timing counts. */
 	unsigned long e_start;		/* Start of extend timeout */
 	unsigned long r_start;		/* Start of request */
@@ -1603,73 +1599,6 @@ typedef struct {
 } rpt_lun_cmd_rsp_t;
 
 /*
- * SCSI Target Queue structure
- */
-typedef struct os_tgt {
-	struct os_lun *olun[MAX_LUNS]; /* LUN context pointer. */
-	struct fc_port *fcport;
-	unsigned long flags;
-	uint8_t port_down_retry_count;
-    	uint32_t down_timer;
-	struct scsi_qla_host *ha;
-
-	/* Persistent binding information */
-	port_id_t d_id;
-	uint8_t node_name[WWN_SIZE];
-	uint8_t port_name[WWN_SIZE];
-} os_tgt_t;
-
-/*
- * SCSI Target Queue flags
- */
-#define TQF_ONLINE		0		/* Device online to OS. */
-#define TQF_SUSPENDED		1
-#define TQF_RETRY_CMDS		2
-
-/*
- * SCSI LUN Queue structure
- */
-typedef struct os_lun {
-	struct fc_lun *fclun;		/* FC LUN context pointer. */
-    	spinlock_t q_lock;		/* Lun Lock */
-
-	unsigned long q_flag;
-#define LUN_MPIO_RESET_CNTS	1	/* Lun */
-#define LUN_MPIO_BUSY		2	/* Lun is changing paths  */
-#define LUN_EXEC_DELAYED	7	/* Lun execution is delayed */
-
-	u_long q_timeout;		/* total command timeouts */
-	atomic_t q_timer;		/* suspend timer */
-	uint32_t q_count;		/* current count */
-	uint32_t q_max;			/* maxmum count lun can be suspended */
-	uint8_t q_state;		/* lun State */
-#define LUN_STATE_READY		1	/* lun is ready for i/o */
-#define LUN_STATE_RUN		2	/* lun has a timer running */
-#define LUN_STATE_WAIT		3	/* lun is suspended */
-#define LUN_STATE_TIMEOUT	4	/* lun has timed out */
-
-	u_long io_cnt;			/* total xfer count since boot */
-	u_long out_cnt;			/* total outstanding IO count */
-	u_long w_cnt;			/* total writes */
-	u_long r_cnt;			/* total reads */
-	u_long avg_time;		/*  */
-} os_lun_t;
-
-
-/* LUN BitMask structure definition, array of 32bit words,
- * 1 bit per lun.  When bit == 1, the lun is masked.
- * Most significant bit of mask[0] is lun 0, bit 24 is lun 7.
- */
-typedef struct lun_bit_mask {
-	/* Must allocate at least enough bits to accomodate all LUNs */
-#if ((MAX_FIBRE_LUNS & 0x7) == 0)
-	uint8_t mask[MAX_FIBRE_LUNS >> 3];
-#else
-	uint8_t mask[(MAX_FIBRE_LUNS + 8) >> 3];
-#endif
-} lun_bit_mask_t;
-
-/*
  * Fibre channel port type.
  */
  typedef enum {
@@ -1686,8 +1615,6 @@ typedef struct lun_bit_mask {
  */
 typedef struct fc_port {
 	struct list_head list;
-	struct list_head fcluns;
-
 	struct scsi_qla_host *ha;
 	struct scsi_qla_host *vis_ha;	/* only used when suspending lun */
 
@@ -1702,8 +1629,7 @@ typedef struct fc_port {
 	atomic_t state;
 	uint32_t flags;
 
-	os_tgt_t *tgt_queue;
-	uint16_t os_target_id;
+	unsigned int os_target_id;
 
 	uint16_t iodesc_idx_sent;
 
@@ -1717,7 +1643,6 @@ typedef struct fc_port {
 	uint8_t mp_byte;		/* multi-path byte (not used) */
     	uint8_t cur_path;		/* current path id */
 
-	lun_bit_mask_t lun_mask;
 	struct fc_rport *rport;
 } fc_port_t;
 
@@ -1765,25 +1690,6 @@ typedef struct fc_port {
 #define FC_NO_LOOP_ID		0x1000
 
 /*
- * Fibre channel LUN structure.
- */
-typedef struct fc_lun {
-        struct list_head list;
-
-	fc_port_t *fcport;
-	fc_port_t *o_fcport;
-	uint16_t lun;
-	atomic_t state;
-	uint8_t device_type;
-
-	uint8_t max_path_retries;
-	uint32_t flags;
-} fc_lun_t;
-
-#define	FLF_VISIBLE_LUN		BIT_0
-#define	FLF_ACTIVE_LUN		BIT_1
-
-/*
  * FC-CT interface
  *
  * NOTE: All structures are big-endian in form.
@@ -2253,9 +2159,6 @@ typedef struct scsi_qla_host {
 	struct io_descriptor	io_descriptors[MAX_IO_DESCRIPTORS];
 	uint16_t		iodesc_signature;
 
-	/* OS target queue pointers. */
-	os_tgt_t		*otgt[MAX_FIBRE_DEVICES];
-
 	/* RSCN queue. */
 	uint32_t rscn_queue[MAX_RSCN_COUNT];
 	uint8_t rscn_in_ptr;
@@ -2400,8 +2303,6 @@ typedef struct scsi_qla_host {
 #define LOOP_RDY(ha)	(!LOOP_NOT_READY(ha))
 
 #define TGT_Q(ha, t) (ha->otgt[t])
-#define LUN_Q(ha, t, l)	(TGT_Q(ha, t)->olun[l])
-#define GET_LU_Q(ha, t, l) ((TGT_Q(ha,t) != NULL)? TGT_Q(ha, t)->olun[l] : NULL)
 
 #define to_qla_host(x)		((scsi_qla_host_t *) (x)->hostdata)
 
--- a/drivers/scsi/qla2xxx/qla_gbl.h	2005-04-13 08:42:33.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_gbl.h	2005-04-13 08:45:53.000000000 -0700
@@ -45,8 +45,6 @@ extern void qla2x00_restart_queues(scsi_
 
 extern void qla2x00_rescan_fcports(scsi_qla_host_t *);
 
-extern void qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t t);
-
 extern int qla2x00_abort_isp(scsi_qla_host_t *);
 
 extern void qla2x00_reg_remote_port(scsi_qla_host_t *, fc_port_t *);
@@ -83,12 +81,6 @@ extern char *qla2x00_get_fw_version_str(
 
 extern void qla2x00_cmd_timeout(srb_t *);
 
-extern int __qla2x00_suspend_lun(scsi_qla_host_t *, os_lun_t *, int, int, int);
-
-extern void qla2x00_done(scsi_qla_host_t *);
-extern void qla2x00_flush_failover_q(scsi_qla_host_t *, os_lun_t *);
-extern void qla2x00_reset_lun_fo_counts(scsi_qla_host_t *, os_lun_t *);
-
 extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int);
 extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *);
 
@@ -149,7 +141,7 @@ qla2x00_abort_target(fc_port_t *fcport);
 #endif
 
 extern int
-qla2x00_target_reset(scsi_qla_host_t *, uint16_t, uint16_t);
+qla2x00_target_reset(scsi_qla_host_t *, struct fc_port *);
 
 extern int
 qla2x00_get_adapter_id(scsi_qla_host_t *, uint16_t *, uint8_t *, uint8_t *,
--- a/drivers/scsi/qla2xxx/qla_init.c	2005-04-13 08:43:25.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_init.c	2005-04-13 08:51:11.000000000 -0700
@@ -45,34 +45,17 @@ static int qla2x00_init_rings(scsi_qla_h
 static int qla2x00_fw_ready(scsi_qla_host_t *);
 static int qla2x00_configure_hba(scsi_qla_host_t *);
 static int qla2x00_nvram_config(scsi_qla_host_t *);
-static void qla2x00_init_tgt_map(scsi_qla_host_t *);
 static int qla2x00_configure_loop(scsi_qla_host_t *);
 static int qla2x00_configure_local_loop(scsi_qla_host_t *);
 static void qla2x00_update_fcport(scsi_qla_host_t *, fc_port_t *);
-static void qla2x00_lun_discovery(scsi_qla_host_t *, fc_port_t *);
-static int qla2x00_rpt_lun_discovery(scsi_qla_host_t *, fc_port_t *,
-    inq_cmd_rsp_t *, dma_addr_t);
-static int qla2x00_report_lun(scsi_qla_host_t *, fc_port_t *);
-static fc_lun_t *qla2x00_cfg_lun(scsi_qla_host_t *, fc_port_t *, uint16_t,
-    inq_cmd_rsp_t *, dma_addr_t);
-static fc_lun_t * qla2x00_add_lun(fc_port_t *, uint16_t);
-static int qla2x00_inquiry(scsi_qla_host_t *, fc_port_t *, uint16_t,
-    inq_cmd_rsp_t *, dma_addr_t);
 static int qla2x00_configure_fabric(scsi_qla_host_t *);
 static int qla2x00_find_all_fabric_devs(scsi_qla_host_t *, struct list_head *);
 static int qla2x00_device_resync(scsi_qla_host_t *);
 static int qla2x00_fabric_dev_login(scsi_qla_host_t *, fc_port_t *,
     uint16_t *);
-static void qla2x00_config_os(scsi_qla_host_t *ha);
-static uint16_t qla2x00_fcport_bind(scsi_qla_host_t *ha, fc_port_t *fcport);
-static os_lun_t * qla2x00_fclun_bind(scsi_qla_host_t *, fc_port_t *,
-    fc_lun_t *);
-static void qla2x00_lun_free(scsi_qla_host_t *, uint16_t, uint16_t);
 
 static int qla2x00_restart_isp(scsi_qla_host_t *);
 static void qla2x00_reset_adapter(scsi_qla_host_t *);
-static os_tgt_t *qla2x00_tgt_alloc(scsi_qla_host_t *, uint16_t);
-static os_lun_t *qla2x00_lun_alloc(scsi_qla_host_t *, uint16_t, uint16_t);
 
 /****************************************************************************/
 /*                QLogic ISP2x00 Hardware Support Functions.                */
@@ -120,9 +103,6 @@ qla2x00_initialize_adapter(scsi_qla_host
 
 	qla2x00_reset_chip(ha);
 
-	/* Initialize target map database. */
-	qla2x00_init_tgt_map(ha);
-
 	qla_printk(KERN_INFO, ha, "Configure NVRAM parameters...\n");
 	qla2x00_nvram_config(ha);
 
@@ -1530,25 +1510,6 @@ qla2x00_nvram_config(scsi_qla_host_t *ha
 	return (rval);
 }
 
-/*
-* qla2x00_init_tgt_map
-*      Initializes target map.
-*
-* Input:
-*      ha = adapter block pointer.
-*
-* Output:
-*      TGT_Q initialized
-*/
-static void
-qla2x00_init_tgt_map(scsi_qla_host_t *ha)
-{
-	uint32_t t;
-
-	for (t = 0; t < MAX_TARGETS; t++)
-		TGT_Q(ha, t) = (os_tgt_t *)NULL;
-}
-
 /**
  * qla2x00_alloc_fcport() - Allocate a generic fcport.
  * @ha: HA context
@@ -1573,7 +1534,6 @@ qla2x00_alloc_fcport(scsi_qla_host_t *ha
 	fcport->iodesc_idx_sent = IODESC_INVALID_INDEX;
 	atomic_set(&fcport->state, FCS_UNCONFIGURED);
 	fcport->flags = FCF_RLC_SUPPORT;
-	INIT_LIST_HEAD(&fcport->fcluns);
 
 	return (fcport);
 }
@@ -1663,7 +1623,6 @@ qla2x00_configure_loop(scsi_qla_host_t *
 		    test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) {
 			rval = QLA_FUNCTION_FAILED;
 		} else {
-			qla2x00_config_os(ha);
 			atomic_set(&ha->loop_state, LOOP_READY);
 
 			DEBUG(printk("scsi(%ld): LOOP READY\n", ha->host_no));
@@ -1908,8 +1867,11 @@ qla2x00_update_fcport(scsi_qla_host_t *h
 	if (fcport->flags & FCF_TAPE_PRESENT) {
 		spin_lock_irqsave(&ha->hardware_lock, flags);
 		for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) {
+			fc_port_t *sfcp;
+
 			if ((sp = ha->outstanding_cmds[index]) != 0) {
-				if (sp->fclun->fcport == fcport) {
+				sfcp = sp->fcport;
+				if (sfcp == fcport) {
 					atomic_set(&fcport->state, FCS_ONLINE);
 					spin_unlock_irqrestore(
 					    &ha->hardware_lock, flags);
@@ -1920,14 +1882,12 @@ qla2x00_update_fcport(scsi_qla_host_t *h
 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
 	}
 
-	/* Do LUN discovery. */
 	if (fcport->port_type == FCT_INITIATOR ||
-	    fcport->port_type == FCT_BROADCAST) {
+	    fcport->port_type == FCT_BROADCAST)
 		fcport->device_type = TYPE_PROCESSOR;
-	} else {
-		qla2x00_lun_discovery(ha, fcport);
-	}
+
 	atomic_set(&fcport->state, FCS_ONLINE);
+
 	if (ha->flags.init_done)
 		qla2x00_reg_remote_port(ha, fcport);
 }
@@ -1936,6 +1896,7 @@ void
 qla2x00_reg_remote_port(scsi_qla_host_t *ha, fc_port_t *fcport)
 {
 	struct fc_rport_identifiers rport_ids;
+	struct fc_rport *rport;
 
 	if (fcport->rport) {
 		fc_remote_port_unblock(fcport->rport);
@@ -1952,418 +1913,17 @@ qla2x00_reg_remote_port(scsi_qla_host_t 
 	if (fcport->port_type == FCT_TARGET)
 		rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET;
 
-	fcport->rport = fc_remote_port_add(ha->host, 0, &rport_ids);
-	if (!fcport->rport)
+	fcport->rport = rport = fc_remote_port_add(ha->host, 0, &rport_ids);
+	if (!rport)
 		qla_printk(KERN_WARNING, ha,
 		    "Unable to allocate fc remote port!\n");
-}
-/*
- * qla2x00_lun_discovery
- *	Issue SCSI inquiry command for LUN discovery.
- *
- * Input:
- *	ha:		adapter state pointer.
- *	fcport:		FC port structure pointer.
- *
- * Context:
- *	Kernel context.
- */
-static void
-qla2x00_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport)
-{
-	inq_cmd_rsp_t	*inq;
-	dma_addr_t	inq_dma;
-	uint16_t	lun;
-
-	inq = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &inq_dma);
-	if (inq == NULL) {
-		qla_printk(KERN_WARNING, ha,
-		    "Memory Allocation failed - INQ\n");
-		return;
-	}
-
-	/* Always add a fc_lun_t structure for lun 0 -- mid-layer requirement */
-	qla2x00_add_lun(fcport, 0);
-
-	/* If report LUN works, exit. */
-	if (qla2x00_rpt_lun_discovery(ha, fcport, inq, inq_dma) !=
-	    QLA_SUCCESS) {
-		for (lun = 0; lun < ha->max_probe_luns; lun++) {
-			/* Configure LUN. */
-			qla2x00_cfg_lun(ha, fcport, lun, inq, inq_dma);
-		}
-	}
-
-	dma_pool_free(ha->s_dma_pool, inq, inq_dma);
-}
-
-/*
- * qla2x00_rpt_lun_discovery
- *	Issue SCSI report LUN command for LUN discovery.
- *
- * Input:
- *	ha:		adapter state pointer.
- *	fcport:		FC port structure pointer.
- *
- * Returns:
- *	qla2x00 local function return status code.
- *
- * Context:
- *	Kernel context.
- */
-static int
-qla2x00_rpt_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport,
-    inq_cmd_rsp_t *inq, dma_addr_t inq_dma)
-{
-	int			rval;
-	uint32_t		len, cnt;
-	uint16_t		lun;
-
-	/* Assume a failed status */
-	rval = QLA_FUNCTION_FAILED;
-
-	/* No point in continuing if the device doesn't support RLC */
-	if ((fcport->flags & FCF_RLC_SUPPORT) == 0)
-		return (rval);
-
-	rval = qla2x00_report_lun(ha, fcport);
-	if (rval != QLA_SUCCESS)
-		return (rval);
-
-	/* Configure LUN list. */
-	len = be32_to_cpu(ha->rlc_rsp->list.hdr.len);
-	len /= 8;
-	for (cnt = 0; cnt < len; cnt++) {
-		lun = CHAR_TO_SHORT(ha->rlc_rsp->list.lst[cnt].lsb,
-		    ha->rlc_rsp->list.lst[cnt].msb.b);
-
-		DEBUG3(printk("scsi(%ld): RLC lun = (%d)\n", ha->host_no, lun));
-
-		/* We only support 0 through MAX_LUNS-1 range */
-		if (lun < MAX_LUNS) {
-			qla2x00_cfg_lun(ha, fcport, lun, inq, inq_dma);
-		}
-	}
-	atomic_set(&fcport->state, FCS_ONLINE);
-
-	return (rval);
-}
-
-/*
- * qla2x00_report_lun
- *	Issue SCSI report LUN command.
- *
- * Input:
- *	ha:		adapter state pointer.
- *	fcport:		FC port structure pointer.
- *
- * Returns:
- *	qla2x00 local function return status code.
- *
- * Context:
- *	Kernel context.
- */
-static int
-qla2x00_report_lun(scsi_qla_host_t *ha, fc_port_t *fcport)
-{
-	int rval;
-	uint16_t retries;
-	uint16_t comp_status;
-	uint16_t scsi_status;
-	rpt_lun_cmd_rsp_t *rlc;
-	dma_addr_t rlc_dma;
-
-	rval = QLA_FUNCTION_FAILED;
-	rlc = ha->rlc_rsp;
-	rlc_dma = ha->rlc_rsp_dma;
-
-	for (retries = 3; retries; retries--) {
-		memset(rlc, 0, sizeof(rpt_lun_cmd_rsp_t));
-		rlc->p.cmd.entry_type = COMMAND_A64_TYPE;
-		rlc->p.cmd.entry_count = 1;
-		SET_TARGET_ID(ha, rlc->p.cmd.target, fcport->loop_id);
-		rlc->p.cmd.control_flags =
-		    __constant_cpu_to_le16(CF_READ | CF_SIMPLE_TAG);
-		rlc->p.cmd.scsi_cdb[0] = REPORT_LUNS;
-		rlc->p.cmd.scsi_cdb[8] = MSB(sizeof(rpt_lun_lst_t));
-		rlc->p.cmd.scsi_cdb[9] = LSB(sizeof(rpt_lun_lst_t));
-		rlc->p.cmd.dseg_count = __constant_cpu_to_le16(1);
-		rlc->p.cmd.timeout = __constant_cpu_to_le16(10);
-		rlc->p.cmd.byte_count =
-		    __constant_cpu_to_le32(sizeof(rpt_lun_lst_t));
-		rlc->p.cmd.dseg_0_address[0] = cpu_to_le32(
-		    LSD(rlc_dma + sizeof(sts_entry_t)));
-		rlc->p.cmd.dseg_0_address[1] = cpu_to_le32(
-		    MSD(rlc_dma + sizeof(sts_entry_t)));
-		rlc->p.cmd.dseg_0_length =
-		    __constant_cpu_to_le32(sizeof(rpt_lun_lst_t));
-
-		rval = qla2x00_issue_iocb(ha, rlc, rlc_dma,
-		    sizeof(rpt_lun_cmd_rsp_t));
-
-		comp_status = le16_to_cpu(rlc->p.rsp.comp_status);
-		scsi_status = le16_to_cpu(rlc->p.rsp.scsi_status);
-
-		if (rval != QLA_SUCCESS || comp_status != CS_COMPLETE ||
-		    scsi_status & SS_CHECK_CONDITION) {
-
-			/* Device underrun, treat as OK. */
-			if (rval == QLA_SUCCESS &&
-			    comp_status == CS_DATA_UNDERRUN &&
-			    scsi_status & SS_RESIDUAL_UNDER) {
-
-				rval = QLA_SUCCESS;
-				break;
-			}
-
-			DEBUG(printk("scsi(%ld): RLC failed to issue iocb! "
-			    "fcport=[%04x/%p] rval=%x cs=%x ss=%x\n",
-			    ha->host_no, fcport->loop_id, fcport, rval,
-			    comp_status, scsi_status));
-
-			rval = QLA_FUNCTION_FAILED;
-			if (scsi_status & SS_CHECK_CONDITION) {
-				DEBUG2(printk("scsi(%ld): RLC "
-				    "SS_CHECK_CONDITION Sense Data "
-				    "%02x %02x %02x %02x %02x %02x %02x %02x\n",
-				    ha->host_no,
-				    rlc->p.rsp.req_sense_data[0],
-				    rlc->p.rsp.req_sense_data[1],
-				    rlc->p.rsp.req_sense_data[2],
-				    rlc->p.rsp.req_sense_data[3],
-				    rlc->p.rsp.req_sense_data[4],
-				    rlc->p.rsp.req_sense_data[5],
-				    rlc->p.rsp.req_sense_data[6],
-				    rlc->p.rsp.req_sense_data[7]));
-				if (rlc->p.rsp.req_sense_data[2] ==
-				    ILLEGAL_REQUEST) {
-					fcport->flags &= ~(FCF_RLC_SUPPORT);
-					break;
-				}
-			}
-		} else {
-			break;
-		}
-	}
-
-	return (rval);
-}
-
-/*
- * qla2x00_cfg_lun
- *	Configures LUN into fcport LUN list.
- *
- * Input:
- *	fcport:		FC port structure pointer.
- *	lun:		LUN number.
- *
- * Context:
- *	Kernel context.
- */
-static fc_lun_t *
-qla2x00_cfg_lun(scsi_qla_host_t *ha, fc_port_t *fcport, uint16_t lun,
-    inq_cmd_rsp_t *inq, dma_addr_t inq_dma) 
-{
-	fc_lun_t *fclun;
-	uint8_t	  device_type;
-
-	/* Bypass LUNs that failed. */
-	if (qla2x00_inquiry(ha, fcport, lun, inq, inq_dma) != QLA_SUCCESS) {
-		DEBUG2(printk("scsi(%ld): Failed inquiry - loop id=0x%04x "
-		    "lun=%d\n", ha->host_no, fcport->loop_id, lun));
-
-		return (NULL);
-	}
-	device_type = (inq->inq[0] & 0x1f);
-	switch (device_type) {
-	case TYPE_DISK:
-	case TYPE_PROCESSOR:
-	case TYPE_WORM:
-	case TYPE_ROM:
-	case TYPE_SCANNER:
-	case TYPE_MOD:
-	case TYPE_MEDIUM_CHANGER:
-	case TYPE_ENCLOSURE:
-	case 0x20:
-	case 0x0C:
-		break;
-	case TYPE_TAPE:
-		fcport->flags |= FCF_TAPE_PRESENT;
-		break;
-	default:
-		DEBUG2(printk("scsi(%ld): Unsupported lun type -- "
-		    "loop id=0x%04x lun=%d type=%x\n",
-		    ha->host_no, fcport->loop_id, lun, device_type));
-		return (NULL);
-	}
-
-	fcport->device_type = device_type;
-	fclun = qla2x00_add_lun(fcport, lun);
-
-	if (fclun != NULL) {
-		atomic_set(&fcport->state, FCS_ONLINE);
-	}
-
-	return (fclun);
-}
-
-/*
- * qla2x00_add_lun
- *	Adds LUN to database
- *
- * Input:
- *	fcport:		FC port structure pointer.
- *	lun:		LUN number.
- *
- * Context:
- *	Kernel context.
- */
-static fc_lun_t *
-qla2x00_add_lun(fc_port_t *fcport, uint16_t lun)
-{
-	int		found;
-	fc_lun_t	*fclun;
-
-	if (fcport == NULL) {
-		DEBUG(printk("scsi: Unable to add lun to NULL port\n"));
-		return (NULL);
-	}
-
-	/* Allocate LUN if not already allocated. */
-	found = 0;
-	list_for_each_entry(fclun, &fcport->fcluns, list) {
-		if (fclun->lun == lun) {
-			found++;
-			break;
-		}
-	}
-	if (found)
-		return (NULL);
-
-	fclun = kmalloc(sizeof(fc_lun_t), GFP_ATOMIC);
-	if (fclun == NULL) {
-		printk(KERN_WARNING
-		    "%s(): Memory Allocation failed - FCLUN\n",
-		    __func__);
-		return (NULL);
-	}
-
-	/* Setup LUN structure. */
-	memset(fclun, 0, sizeof(fc_lun_t));
-	fclun->lun = lun;
-	fclun->fcport = fcport;
-	fclun->o_fcport = fcport;
-	fclun->device_type = fcport->device_type;
-	atomic_set(&fcport->state, FCS_UNCONFIGURED);
-
-	list_add_tail(&fclun->list, &fcport->fcluns);
-
-	return (fclun);
-}
-
-/*
- * qla2x00_inquiry
- *	Issue SCSI inquiry command.
- *
- * Input:
- *	ha = adapter block pointer.
- *	fcport = FC port structure pointer.
- *
- * Return:
- *	0  - Success
- *  BIT_0 - error
- *
- * Context:
- *	Kernel context.
- */
-static int
-qla2x00_inquiry(scsi_qla_host_t *ha,
-    fc_port_t *fcport, uint16_t lun, inq_cmd_rsp_t *inq, dma_addr_t inq_dma)
-{
-	int rval;
-	uint16_t retries;
-	uint16_t comp_status;
-	uint16_t scsi_status;
-
-	rval = QLA_FUNCTION_FAILED;
-
-	for (retries = 3; retries; retries--) {
-		memset(inq, 0, sizeof(inq_cmd_rsp_t));
-		inq->p.cmd.entry_type = COMMAND_A64_TYPE;
-		inq->p.cmd.entry_count = 1;
-		inq->p.cmd.lun = cpu_to_le16(lun);
-		SET_TARGET_ID(ha, inq->p.cmd.target, fcport->loop_id);
-		inq->p.cmd.control_flags =
-		    __constant_cpu_to_le16(CF_READ | CF_SIMPLE_TAG);
-		inq->p.cmd.scsi_cdb[0] = INQUIRY;
-		inq->p.cmd.scsi_cdb[4] = INQ_DATA_SIZE;
-		inq->p.cmd.dseg_count = __constant_cpu_to_le16(1);
-		inq->p.cmd.timeout = __constant_cpu_to_le16(10);
-		inq->p.cmd.byte_count =
-		    __constant_cpu_to_le32(INQ_DATA_SIZE);
-		inq->p.cmd.dseg_0_address[0] = cpu_to_le32(
-		    LSD(inq_dma + sizeof(sts_entry_t)));
-		inq->p.cmd.dseg_0_address[1] = cpu_to_le32(
-		    MSD(inq_dma + sizeof(sts_entry_t)));
-		inq->p.cmd.dseg_0_length =
-		    __constant_cpu_to_le32(INQ_DATA_SIZE);
-
-		DEBUG5(printk("scsi(%ld): Lun Inquiry - fcport=[%04x/%p],"
-		    " lun (%d)\n",
-		    ha->host_no, fcport->loop_id, fcport, lun));
-
-		rval = qla2x00_issue_iocb(ha, inq, inq_dma,
-		    sizeof(inq_cmd_rsp_t));
-
-		comp_status = le16_to_cpu(inq->p.rsp.comp_status);
-		scsi_status = le16_to_cpu(inq->p.rsp.scsi_status);
-
-		DEBUG5(printk("scsi(%ld): lun (%d) inquiry - "
-		    "inq[0]= 0x%x, comp status 0x%x, scsi status 0x%x, "
-		    "rval=%d\n",
-		    ha->host_no, lun, inq->inq[0], comp_status, scsi_status,
-		    rval));
-
-		if (rval != QLA_SUCCESS || comp_status != CS_COMPLETE ||
-		    scsi_status & SS_CHECK_CONDITION) {
-
-			DEBUG(printk("scsi(%ld): INQ failed to issue iocb! "
-			    "fcport=[%04x/%p] rval=%x cs=%x ss=%x\n",
-			    ha->host_no, fcport->loop_id, fcport, rval,
-			    comp_status, scsi_status));
 
-			if (rval == QLA_SUCCESS)
-				rval = QLA_FUNCTION_FAILED;
-
-			if (scsi_status & SS_CHECK_CONDITION) {
-				DEBUG2(printk("scsi(%ld): INQ "
-				    "SS_CHECK_CONDITION Sense Data "
-				    "%02x %02x %02x %02x %02x %02x %02x %02x\n",
-				    ha->host_no,
-				    inq->p.rsp.req_sense_data[0],
-				    inq->p.rsp.req_sense_data[1],
-				    inq->p.rsp.req_sense_data[2],
-				    inq->p.rsp.req_sense_data[3],
-				    inq->p.rsp.req_sense_data[4],
-				    inq->p.rsp.req_sense_data[5],
-				    inq->p.rsp.req_sense_data[6],
-				    inq->p.rsp.req_sense_data[7]));
-			}
-
-			/* Device underrun drop LUN. */
-			if (comp_status == CS_DATA_UNDERRUN &&
-			    scsi_status & SS_RESIDUAL_UNDER) {
-				break;
-			}
-		} else {
-			break;
-		}
-	}
+	if (rport->scsi_target_id != -1 && rport->scsi_target_id < MAX_TARGETS)
+		fcport->os_target_id = rport->scsi_target_id;
 
-	return (rval);
+	rport->dd_data = fcport;
 }
 
-
 /*
  * qla2x00_configure_fabric
  *      Setup SNS devices with loop ID's.
@@ -2514,12 +2074,12 @@ qla2x00_configure_fabric(scsi_qla_host_t
 				break;
 			}
 
-			/* Login and update database */
-			qla2x00_fabric_dev_login(ha, fcport, &next_loopid);
-
 			/* Remove device from the new list and add it to DB */
 			list_del(&fcport->list);
 			list_add_tail(&fcport->list, &ha->fcports);
+
+			/* Login and update database */
+			qla2x00_fabric_dev_login(ha, fcport, &next_loopid);
 		}
 	} while (0);
 
@@ -3203,396 +2763,6 @@ qla2x00_rescan_fcports(scsi_qla_host_t *
 		rescan_done = 1;
 	}
 	qla2x00_probe_for_all_luns(ha); 
-
-	/* Update OS target and lun structures if necessary. */
-	if (rescan_done) {
-		qla2x00_config_os(ha);
-	}
-}
-
-
-/*
- * qla2x00_config_os
- *	Setup OS target and LUN structures.
- *
- * Input:
- *	ha = adapter state pointer.
- *
- * Context:
- *	Kernel context.
- */
-static void
-qla2x00_config_os(scsi_qla_host_t *ha) 
-{
-	fc_port_t	*fcport;
-	fc_lun_t	*fclun;
-	os_tgt_t	*tq;
-	uint16_t	tgt;
-
-
-	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
-		if ((tq = TGT_Q(ha, tgt)) == NULL)
-			continue;
-
-		clear_bit(TQF_ONLINE, &tq->flags);
-	}
-
-	list_for_each_entry(fcport, &ha->fcports, list) {
-		if (atomic_read(&fcport->state) != FCS_ONLINE ||
-		    fcport->port_type == FCT_INITIATOR ||
-		    fcport->port_type == FCT_BROADCAST) {
-			fcport->os_target_id = MAX_TARGETS;
-			continue;
-		}
-
-		if (fcport->flags & FCF_FO_MASKED) {
-			continue;
-		}
-
-		/* Bind FC port to OS target number. */
-		if (qla2x00_fcport_bind(ha, fcport) == MAX_TARGETS) {
-			continue;
-		}
-
-		/* Bind FC LUN to OS LUN number. */
-		list_for_each_entry(fclun, &fcport->fcluns, list) {
-			qla2x00_fclun_bind(ha, fcport, fclun);
-		}
-	}
-}
-
-/*
- * qla2x00_fcport_bind
- *	Locates a target number for FC port.
- *
- * Input:
- *	ha = adapter state pointer.
- *	fcport = FC port structure pointer.
- *
- * Returns:
- *	target number
- *
- * Context:
- *	Kernel context.
- */
-static uint16_t
-qla2x00_fcport_bind(scsi_qla_host_t *ha, fc_port_t *fcport) 
-{
-	int		found;
-	uint16_t	tgt;
-	os_tgt_t	*tq;
-
-	/* Check for persistent binding. */
-	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
-		if ((tq = TGT_Q(ha, tgt)) == NULL)
-			continue;
-
-		found = 0;
-		switch (ha->binding_type) {
-		case BIND_BY_PORT_ID:
-			if (fcport->d_id.b24 == tq->d_id.b24) {
-				memcpy(tq->node_name, fcport->node_name,
-				    WWN_SIZE);
-				memcpy(tq->port_name, fcport->port_name,
-				    WWN_SIZE);
-				found++;
-			}
-			break;
-		case BIND_BY_PORT_NAME:    
-			if (memcmp(fcport->port_name, tq->port_name,
-			    WWN_SIZE) == 0) {
-				/*
-				 * In case of persistent binding, update the
-				 * WWNN.
-				 */
-				memcpy(tq->node_name, fcport->node_name,
-				    WWN_SIZE);
-				found++;
-			}
-			break;
-		}
-		if (found)
-		    break;	
-	}
-
-	/* TODO: honor the ConfigRequired flag */
-	if (tgt == MAX_TARGETS) {
-		/* Check if targetID 0 available. */
-		tgt = 0;
-
-		if (TGT_Q(ha, tgt) != NULL) {
-			/* Locate first free target for device. */
-			for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
-				if (TGT_Q(ha, tgt) == NULL) {
-					break;
-				}
-			}
-		}
-		if (tgt != MAX_TARGETS) {
-			if ((tq = qla2x00_tgt_alloc(ha, tgt)) != NULL) {
-				memcpy(tq->node_name, fcport->node_name,
-				    WWN_SIZE);
-				memcpy(tq->port_name, fcport->port_name,
-				    WWN_SIZE);
-				tq->d_id.b24 = fcport->d_id.b24;
-			}
-		}
-	}
-
-	/* Reset target numbers incase it changed. */
-	fcport->os_target_id = tgt;
-	if (tgt != MAX_TARGETS && tq != NULL) {
-		DEBUG2(printk("scsi(%ld): Assigning target ID=%02d @ %p to "
-		    "loop id=0x%04x, port state=0x%x, port down retry=%d\n",
-		    ha->host_no, tgt, tq, fcport->loop_id,
-		    atomic_read(&fcport->state),
-		    atomic_read(&fcport->port_down_timer)));
-
-		fcport->tgt_queue = tq;
-		fcport->flags |= FCF_PERSISTENT_BOUND;
-		tq->fcport = fcport;
-		set_bit(TQF_ONLINE, &tq->flags);
-		tq->port_down_retry_count = ha->port_down_retry_count;
-	}
-
-	if (tgt == MAX_TARGETS) {
-		qla_printk(KERN_WARNING, ha,
-		    "Unable to bind fcport, loop_id=%x\n", fcport->loop_id);
-	}
-
-	return (tgt);
-}
-
-/*
- * qla2x00_fclun_bind
- *	Binds all FC device LUNS to OS LUNS.
- *
- * Input:
- *	ha:		adapter state pointer.
- *	fcport:		FC port structure pointer.
- *
- * Returns:
- *	target number
- *
- * Context:
- *	Kernel context.
- */
-static os_lun_t *
-qla2x00_fclun_bind(scsi_qla_host_t *ha, fc_port_t *fcport, fc_lun_t *fclun)
-{
-	os_lun_t	*lq;
-	uint16_t	tgt;
-	uint16_t	lun;
-
-	tgt = fcport->os_target_id;
-	lun = fclun->lun;
-
-	/* Allocate LUNs */
-	if (lun >= MAX_LUNS) {
-		DEBUG2(printk("scsi(%ld): Unable to bind lun, invalid "
-		    "lun=(%x).\n", ha->host_no, lun));
-		return (NULL);
-	}
-
-	/* Always alloc LUN 0 so kernel will scan past LUN 0. */
-	if (lun != 0 && (EXT_IS_LUN_BIT_SET(&(fcport->lun_mask), lun))) {
-		return (NULL);
-	}
-
-	if ((lq = qla2x00_lun_alloc(ha, tgt, lun)) == NULL) {
-		qla_printk(KERN_WARNING, ha,
-		    "Unable to bind fclun, loop_id=%x lun=%x\n",
-		    fcport->loop_id, lun);
-		return (NULL);
-	}
-
-	lq->fclun = fclun;
-
-	return (lq);
-}
-
-/*
- * qla2x00_tgt_alloc
- *	Allocate and pre-initialize target queue.
- *
- * Input:
- *	ha = adapter block pointer.
- *	t = SCSI target number.
- *
- * Returns:
- *	NULL = failure
- *
- * Context:
- *	Kernel context.
- */
-static os_tgt_t *
-qla2x00_tgt_alloc(scsi_qla_host_t *ha, uint16_t tgt) 
-{
-	os_tgt_t	*tq;
-
-	/*
-	 * If SCSI addressing OK, allocate TGT queue and lock.
-	 */
-	if (tgt >= MAX_TARGETS) {
-		DEBUG2(printk("scsi(%ld): Unable to allocate target, invalid "
-		    "target number %d.\n", ha->host_no, tgt));
-		return (NULL);
-	}
-
-	tq = TGT_Q(ha, tgt);
-	if (tq == NULL) {
-		tq = kmalloc(sizeof(os_tgt_t), GFP_ATOMIC);
-		if (tq != NULL) {
-			DEBUG2(printk("scsi(%ld): Alloc Target %d @ %p\n",
-			    ha->host_no, tgt, tq));
-
-			memset(tq, 0, sizeof(os_tgt_t));
-			tq->ha = ha;
-
-			TGT_Q(ha, tgt) = tq;
-		}
-	}
-	if (tq != NULL) {
-		tq->port_down_retry_count = ha->port_down_retry_count;
-	} else {
-		qla_printk(KERN_WARNING, ha,
-		    "Unable to allocate target.\n");
-		ha->mem_err++;
-	}
-
-	return (tq);
-}
-
-/*
- * qla2x00_tgt_free
- *	Frees target and LUN queues.
- *
- * Input:
- *	ha = adapter block pointer.
- *	t = SCSI target number.
- *
- * Context:
- *	Kernel context.
- */
-void
-qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t tgt) 
-{
-	os_tgt_t	*tq;
-	uint16_t	lun;
-
-	/*
-	 * If SCSI addressing OK, allocate TGT queue and lock.
-	 */
-	if (tgt >= MAX_TARGETS) {
-		DEBUG2(printk("scsi(%ld): Unable to de-allocate target, "
-		    "invalid target number %d.\n", ha->host_no, tgt));
-
-		return;
-	}
-
-	tq = TGT_Q(ha, tgt);
-	if (tq != NULL) {
-		TGT_Q(ha, tgt) = NULL;
-
-		/* Free LUN structures. */
-		for (lun = 0; lun < MAX_LUNS; lun++)
-			qla2x00_lun_free(ha, tgt, lun);
-
-		kfree(tq);
-	}
-
-	return;
-}
-
-/*
- * qla2x00_lun_alloc
- *	Allocate and initialize LUN queue.
- *
- * Input:
- *	ha = adapter block pointer.
- *	t = SCSI target number.
- *	l = LUN number.
- *
- * Returns:
- *	NULL = failure
- *
- * Context:
- *	Kernel context.
- */
-static os_lun_t *
-qla2x00_lun_alloc(scsi_qla_host_t *ha, uint16_t tgt, uint16_t lun) 
-{
-	os_lun_t	*lq;
-
-	/*
-	 * If SCSI addressing OK, allocate LUN queue.
-	 */
-	if (tgt >= MAX_TARGETS || lun >= MAX_LUNS || TGT_Q(ha, tgt) == NULL) {
-		DEBUG2(printk("scsi(%ld): Unable to allocate lun, invalid "
-		    "parameter.\n", ha->host_no));
-
-		return (NULL);
-	}
-
-	lq = LUN_Q(ha, tgt, lun);
-	if (lq == NULL) {
-		lq = kmalloc(sizeof(os_lun_t), GFP_ATOMIC);
-		if (lq != NULL) {
-			DEBUG2(printk("scsi(%ld): Alloc Lun %d @ tgt %d.\n",
-			    ha->host_no, lun, tgt));
-
-			memset(lq, 0, sizeof(os_lun_t));
-			LUN_Q(ha, tgt, lun) = lq;
-
-			/*
-			 * The following lun queue initialization code
-			 * must be duplicated in alloc_ioctl_mem function
-			 * for ioctl_lq.
-			 */
-			lq->q_state = LUN_STATE_READY;
-			spin_lock_init(&lq->q_lock);
-		}
-	}
-
-	if (lq == NULL) {
-		qla_printk(KERN_WARNING, ha, "Unable to allocate lun.\n");
-	}
-
-	return (lq);
-}
-
-/*
- * qla2x00_lun_free
- *	Frees LUN queue.
- *
- * Input:
- *	ha = adapter block pointer.
- *	t = SCSI target number.
- *
- * Context:
- *	Kernel context.
- */
-static void
-qla2x00_lun_free(scsi_qla_host_t *ha, uint16_t tgt, uint16_t lun) 
-{
-	os_lun_t	*lq;
-
-	/*
-	 * If SCSI addressing OK, allocate TGT queue and lock.
-	 */
-	if (tgt >= MAX_TARGETS || lun >= MAX_LUNS) {
-		DEBUG2(printk("scsi(%ld): Unable to deallocate lun, invalid "
-		    "parameter.\n", ha->host_no));
-
-		return;
-	}
-
-	if (TGT_Q(ha, tgt) != NULL && (lq = LUN_Q(ha, tgt, lun)) != NULL) {
-		LUN_Q(ha, tgt, lun) = NULL;
-		kfree(lq);
-	}
-
-	return;
 }
 
 /*
@@ -3642,8 +2812,6 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
 				ha->outstanding_cmds[cnt] = NULL;
 				if (ha->actthreads)
 					ha->actthreads--;
-				sp->lun_queue->out_cnt--;
-
 				sp->flags = 0;
 				sp->cmd->result = DID_RESET << 16;
 				sp->cmd->host_scribble = (unsigned char *)NULL;
--- a/drivers/scsi/qla2xxx/qla_inline.h	2005-04-13 08:40:14.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_inline.h	2005-04-13 08:45:53.000000000 -0700
@@ -187,23 +187,6 @@ qla2x00_is_wwn_zero(uint8_t *wwn)
 		return (0);
 }
 
-static __inline__ uint8_t
-qla2x00_suspend_lun(scsi_qla_host_t *, os_lun_t *, int, int);
-static __inline__ uint8_t
-qla2x00_delay_lun(scsi_qla_host_t *, os_lun_t *, int);
-
-static __inline__ uint8_t
-qla2x00_suspend_lun(scsi_qla_host_t *ha, os_lun_t *lq, int time, int count)
-{
-	return (__qla2x00_suspend_lun(ha, lq, time, count, 0));
-}
-
-static __inline__ uint8_t
-qla2x00_delay_lun(scsi_qla_host_t *ha, os_lun_t *lq, int time)
-{
-	return (__qla2x00_suspend_lun(ha, lq, time, 1, 1));
-}
-
 static __inline__ void qla2x00_check_fabric_devices(scsi_qla_host_t *);
 /*
  * This routine will wait for fabric devices for
--- a/drivers/scsi/qla2xxx/qla_iocb.c	2005-04-13 08:40:14.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_iocb.c	2005-04-13 08:45:53.000000000 -0700
@@ -328,7 +328,6 @@ qla2x00_start_scsi(srb_t *sp)
 	int		ret;
 	unsigned long   flags;
 	scsi_qla_host_t	*ha;
-	fc_lun_t	*fclun;
 	struct scsi_cmnd *cmd;
 	uint32_t	*clr_ptr;
 	uint32_t        index;
@@ -343,8 +342,7 @@ qla2x00_start_scsi(srb_t *sp)
 
 	/* Setup device pointers. */
 	ret = 0;
-	fclun = sp->lun_queue->fclun;
-	ha = fclun->fcport->ha;
+	ha = sp->ha;
 	reg = ha->iobase;
 	cmd = sp->cmd;
 
@@ -411,11 +409,9 @@ qla2x00_start_scsi(srb_t *sp)
 	memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8);
 	cmd_pkt->dseg_count = cpu_to_le16(tot_dsds);
 
-	/* Set target ID */
-	SET_TARGET_ID(ha, cmd_pkt->target, fclun->fcport->loop_id);
-
-	/* Set LUN number*/
-	cmd_pkt->lun = cpu_to_le16(fclun->lun);
+	/* Set target ID and LUN number*/
+	SET_TARGET_ID(ha, cmd_pkt->target, sp->fcport->loop_id);
+	cmd_pkt->lun = cpu_to_le16(sp->cmd->device->lun);
 
 	/* Update tagged queuing modifier */
 	cmd_pkt->control_flags = __constant_cpu_to_le16(CF_SIMPLE_TAG);
@@ -453,7 +449,6 @@ qla2x00_start_scsi(srb_t *sp)
 
 	ha->actthreads++;
 	ha->total_ios++;
-	sp->lun_queue->out_cnt++;
 	sp->flags |= SRB_DMA_VALID;
 	sp->state = SRB_ACTIVE_STATE;
 	sp->u_start = jiffies;
--- a/drivers/scsi/qla2xxx/qla_isr.c	2005-04-13 08:40:14.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_isr.c	2005-04-13 08:45:53.000000000 -0700
@@ -697,7 +697,6 @@ qla2x00_process_completed_request(struct
 
 		if (ha->actthreads)
 			ha->actthreads--;
-		sp->lun_queue->out_cnt--;
 		CMD_COMPL_STATUS(sp->cmd) = 0L;
 		CMD_SCSI_STATUS(sp->cmd) = 0L;
 
@@ -818,11 +817,8 @@ qla2x00_process_response_queue(struct sc
 static void
 qla2x00_status_entry(scsi_qla_host_t *ha, sts_entry_t *pkt)
 {
-	int		ret;
 	unsigned	b, t, l;
 	srb_t		*sp;
-	os_lun_t	*lq;
-	os_tgt_t	*tq;
 	fc_port_t	*fcport;
 	struct scsi_cmnd *cp;
 	uint16_t	comp_status;
@@ -872,21 +868,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 	if (ha->actthreads)
 		ha->actthreads--;
 
-	if (sp->lun_queue == NULL) {
-		DEBUG2(printk("scsi(%ld): Status Entry invalid lun pointer.\n",
-		    ha->host_no));
-		qla_printk(KERN_WARNING, ha,
-		    "Status Entry invalid lun pointer.\n");
-
-		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
-		if (ha->dpc_wait && !ha->dpc_active) 
-			up(ha->dpc_wait);
-
-		return;
-	}
-
-	sp->lun_queue->out_cnt--;
-
 	comp_status = le16_to_cpu(pkt->comp_status);
 	/* Mask of reserved bits 12-15, before we examine the scsi status */
 	scsi_status = le16_to_cpu(pkt->scsi_status) & SS_MASK;
@@ -901,8 +882,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 	t = cp->device->id;
 	l = cp->device->lun,
 
-	tq = sp->tgt_queue;
-	lq = sp->lun_queue;
+	fcport = sp->fcport;
 
 	/* Check for any FCP transport errors. */
 	if (scsi_status & SS_RESPONSE_INFO_LEN_VALID) {
@@ -1096,7 +1076,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 		 * Target with DID_NO_CONNECT ELSE Queue the IOs in the
 		 * retry_queue.
 		 */
-		fcport = sp->fclun->fcport;
 		DEBUG2(printk("scsi(%ld:%d:%d): status_entry: Port Down "
 		    "pid=%ld, compl status=0x%x, port state=0x%x\n",
 		    ha->host_no, t, l, cp->serial_number, comp_status,
@@ -1137,8 +1116,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 
 		cp->result = DID_BUS_BUSY << 16;
 
-		fcport = lq->fclun->fcport;
-
 		/* Check to see if logout occurred */
 		if ((le16_to_cpu(pkt->status_flags) & SF_LOGOUT_SENT)) {
 			qla2x00_mark_device_lost(ha, fcport, 1);
@@ -1154,16 +1131,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 
 		cp->result = DID_OK << 16 | lscsi_status; 
 
-		/* TODO: ??? */
-		/* Adjust queue depth */
-		ret = scsi_track_queue_full(cp->device,
-		    sp->lun_queue->out_cnt - 1);
-		if (ret) {
-			qla_printk(KERN_INFO, ha,
-			    "scsi(%ld:%d:%d:%d): Queue depth adjusted to %d.\n",
-			    ha->host_no, cp->device->channel, cp->device->id,
-			    cp->device->lun, ret);
-		}
 		break;
 
 	default:
@@ -1268,8 +1235,6 @@ qla2x00_error_entry(scsi_qla_host_t *ha,
 		ha->outstanding_cmds[pkt->handle] = NULL;
 		if (ha->actthreads)
 			ha->actthreads--;
-		sp->lun_queue->out_cnt--;
-
 		/* Bad payload or header */
 		if (pkt->entry_status &
 		    (RF_INV_E_ORDER | RF_INV_E_COUNT |
--- a/drivers/scsi/qla2xxx/qla_mbx.c	2005-04-13 08:40:14.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_mbx.c	2005-04-13 08:45:53.000000000 -0700
@@ -858,8 +858,7 @@ qla2x00_abort_command(scsi_qla_host_t *h
 
 	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;
@@ -884,7 +883,7 @@ qla2x00_abort_command(scsi_qla_host_t *h
 		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;
@@ -980,30 +979,22 @@ qla2x00_abort_target(fc_port_t *fcport)
  *	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 */
-		return 0;
-	}
-	if (atomic_read(&tgt->fcport->state) != FCS_ONLINE) {
-		/* target not online */
+	if (atomic_read(&fcport->state) != FCS_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;
--- a/drivers/scsi/qla2xxx/qla_os.c	2005-04-13 08:44:32.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_os.c	2005-04-13 08:51:25.000000000 -0700
@@ -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
 
 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 *c
 	}
 
 	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
 	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 *c
 	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 *
 	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 *pd
 	}
 
 	qla2x00_init_host_attr(ha);
+
 	/*
 	 * Startup the kernel thread for this host adapter
 	 */
@@ -1406,11 +1383,6 @@ int qla2x00_probe_one(struct pci_dev *pd
 	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 *pd
 	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 *
 
 	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 *shos
 {
 	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 *shos
 	    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, sr
 
 	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);
-- 
Andrew Vasquez

^ permalink raw reply	[flat|nested] 25+ messages in thread

* PATCH [4/5]  qla2xxx: cleanup DMA mappings...
  2005-04-13 19:15 PATCH [0/5] qla2xxx: remote port rework Andrew Vasquez
                   ` (2 preceding siblings ...)
  2005-04-13 19:18 ` PATCH [3/5] qla2xxx: remove lun discovery codes Andrew Vasquez
@ 2005-04-13 19:19 ` Andrew Vasquez
  2005-04-13 21:34   ` Christoph Hellwig
  2005-04-13 19:19 ` PATCH [5/5] qla2xxx: remove /proc interface Andrew Vasquez
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-13 19:19 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley; +Cc: Andrew Vasquez

  Don't use cmd->request->nr_hw_segments as it may not be initialized
  (SG_IO in particular bypasses anything that initializes this and just
  uses scsi_do_req to insert a scsi_request directly on the head of the
  queue) and a bogus value here can trip up the checks to make sure that
  the number of segments will fit in the queue ring buffer, resulting in
  commands that are never completed.

  Fix up several issues with PCI DMA mapping and failure to check return
  values on the mappings.

  Make the check for space in the ring buffer happen after the DMA mapping
  is done since any checks done before the mapping has taken place are
  bogus.

  Doug Ledford <dledford@redhat.com>.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

 drivers/scsi/qla2xxx/qla_iocb.c |   77 +++++++++++++++++++---------------------
 1 files changed, 38 insertions(+), 39 deletions(-)

--- a/drivers/scsi/qla2xxx/qla_iocb.c	2005-04-13 08:45:53.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_iocb.c	2005-04-13 08:56:17.000000000 -0700
@@ -216,18 +216,7 @@ void qla2x00_build_scsi_iocbs_32(srb_t *
 			cur_seg++;
 		}
 	} else {
-		dma_addr_t	req_dma;
-		struct page	*page;
-		unsigned long	offset;
-
-		page = virt_to_page(cmd->request_buffer);
-		offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);
-		req_dma = pci_map_page(ha->pdev, page, offset,
-		    cmd->request_bufflen, cmd->sc_data_direction);
-
-		sp->dma_handle = req_dma;
-
-		*cur_dsd++ = cpu_to_le32(req_dma);
+		*cur_dsd++ = cpu_to_le32(sp->dma_handle);
 		*cur_dsd++ = cpu_to_le32(cmd->request_bufflen);
 	}
 }
@@ -299,19 +288,8 @@ void qla2x00_build_scsi_iocbs_64(srb_t *
 			cur_seg++;
 		}
 	} else {
-		dma_addr_t	req_dma;
-		struct page	*page;
-		unsigned long	offset;
-
-		page = virt_to_page(cmd->request_buffer);
-		offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);
-		req_dma = pci_map_page(ha->pdev, page, offset,
-		    cmd->request_bufflen, cmd->sc_data_direction);
-
-		sp->dma_handle = req_dma;
-
-		*cur_dsd++ = cpu_to_le32(LSD(req_dma));
-		*cur_dsd++ = cpu_to_le32(MSD(req_dma));
+		*cur_dsd++ = cpu_to_le32(LSD(sp->dma_handle));
+		*cur_dsd++ = cpu_to_le32(MSD(sp->dma_handle));
 		*cur_dsd++ = cpu_to_le32(cmd->request_bufflen);
 	}
 }
@@ -345,6 +323,8 @@ qla2x00_start_scsi(srb_t *sp)
 	ha = sp->ha;
 	reg = ha->iobase;
 	cmd = sp->cmd;
+	/* So we know we haven't pci_map'ed anything yet */
+	tot_dsds = 0;
 
 	/* Send marker if required */
 	if (ha->marker_needed != 0) {
@@ -369,8 +349,32 @@ qla2x00_start_scsi(srb_t *sp)
 	if (index == MAX_OUTSTANDING_COMMANDS)
 		goto queuing_error;
 
+	/* Map the sg table so we have an accurate count of sg entries needed */
+	if (cmd->use_sg) {
+		sg = (struct scatterlist *) cmd->request_buffer;
+		tot_dsds = pci_map_sg(ha->pdev, sg, cmd->use_sg,
+		    cmd->sc_data_direction);
+		if (tot_dsds == 0)
+			goto queuing_error;
+	} else if (cmd->request_bufflen) {
+		dma_addr_t	req_dma;
+		struct page	*page;
+		unsigned long	offset;
+
+		page = virt_to_page(cmd->request_buffer);
+		offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);
+		req_dma = pci_map_page(ha->pdev, page, offset,
+		    cmd->request_bufflen, cmd->sc_data_direction);
+
+		if (dma_mapping_error(req_dma))
+			goto queuing_error;
+
+		sp->dma_handle = req_dma;
+		tot_dsds = 1;
+	}
+
 	/* Calculate the number of request entries needed. */
-	req_cnt = (ha->calc_request_entries)(cmd->request->nr_hw_segments);
+	req_cnt = (ha->calc_request_entries)(tot_dsds);
 	if (ha->req_q_cnt < (req_cnt + 2)) {
 		cnt = RD_REG_WORD_RELAXED(ISP_REQ_Q_OUT(ha, reg));
 		if (ha->req_ring_index < cnt)
@@ -382,19 +386,6 @@ qla2x00_start_scsi(srb_t *sp)
 	if (ha->req_q_cnt < (req_cnt + 2))
 		goto queuing_error;
 
-	/* Finally, we have enough space, now perform mappings. */
-	tot_dsds = 0;
-	if (cmd->use_sg) {
-		sg = (struct scatterlist *) cmd->request_buffer;
-		tot_dsds = pci_map_sg(ha->pdev, sg, cmd->use_sg,
-		    cmd->sc_data_direction);
-		if (tot_dsds == 0)
-			goto queuing_error;
-	} else if (cmd->request_bufflen) {
-	    tot_dsds++;
-	}
-	req_cnt = (ha->calc_request_entries)(tot_dsds);
-
 	/* Build command packet */
 	ha->current_outstanding_cmd = handle;
 	ha->outstanding_cmds[handle] = sp;
@@ -461,6 +452,14 @@ qla2x00_start_scsi(srb_t *sp)
 	return (QLA_SUCCESS);
 
 queuing_error:
+	if (cmd->use_sg && tot_dsds) {
+		sg = (struct scatterlist *) cmd->request_buffer;
+		pci_unmap_sg(ha->pdev, sg, cmd->use_sg,
+		    cmd->sc_data_direction);
+	} else if (tot_dsds) {
+		pci_unmap_page(ha->pdev, sp->dma_handle, cmd->request_bufflen,
+			       cmd->sc_data_direction);
+	}
 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
 	return (QLA_FUNCTION_FAILED);
-- 
Andrew Vasquez

^ permalink raw reply	[flat|nested] 25+ messages in thread

* PATCH [5/5]  qla2xxx: remove /proc interface
  2005-04-13 19:15 PATCH [0/5] qla2xxx: remote port rework Andrew Vasquez
                   ` (3 preceding siblings ...)
  2005-04-13 19:19 ` PATCH [4/5] qla2xxx: cleanup DMA mappings Andrew Vasquez
@ 2005-04-13 19:19 ` Andrew Vasquez
  2005-04-13 19:42 ` PATCH [0/5] qla2xxx: remote port rework Matthew Wilcox
  2005-04-13 20:50 ` PATCH [6/5] qla2xxx: update version :) Andrew Vasquez
  6 siblings, 0 replies; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-13 19:19 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley; +Cc: Andrew Vasquez

  Remove /proc support.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

 drivers/scsi/qla2xxx/qla_os.c |  254 ------------------------------------------
 1 files changed, 254 deletions(-)

--- a/drivers/scsi/qla2xxx/qla_os.c	2005-04-13 08:56:07.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_os.c	2005-04-13 08:58:47.000000000 -0700
@@ -119,19 +119,6 @@ module_param(ql2xloginretrycount, int, S
 MODULE_PARM_DESC(ql2xloginretrycount,
 		"Specify an alternate value for the NVRAM login retry count.");
 
-/*
- * Proc structures and functions
- */
-struct info_str {
-	char	*buffer;
-	int	length;
-	off_t	offset;
-	int	pos;
-};
-
-static void copy_mem_info(struct info_str *, char *, int);
-static int copy_info(struct info_str *, char *, ...);
-
 static void qla2x00_free_device(scsi_qla_host_t *);
 
 static void qla2x00_config_dma_addressing(scsi_qla_host_t *ha);
@@ -151,14 +138,9 @@ static int qla2xxx_eh_host_reset(struct 
 static int qla2x00_loop_reset(scsi_qla_host_t *ha);
 static int qla2x00_device_reset(scsi_qla_host_t *, fc_port_t *);
 
-static int qla2x00_proc_info(struct Scsi_Host *, char *, char **,
-    off_t, int, int);
-
 static struct scsi_host_template qla2x00_driver_template = {
 	.module			= THIS_MODULE,
 	.name			= "qla2xxx",
-	.proc_name		= "qla2xxx",
-	.proc_info		= qla2x00_proc_info,
 	.queuecommand		= qla2x00_queuecommand,
 
 	.eh_abort_handler	= qla2xxx_eh_abort,
@@ -1020,7 +1002,6 @@ qla2xxx_slave_alloc(struct scsi_device *
 			found++;
 			break;
 		}
-		
 	}
 	if (!found)
 		return -ENXIO;
@@ -1484,241 +1465,6 @@ qla2x00_free_device(scsi_qla_host_t *ha)
 	pci_disable_device(ha->pdev);
 }
 
-
-/*
- * The following support functions are adopted to handle
- * the re-entrant qla2x00_proc_info correctly.
- */
-static void
-copy_mem_info(struct info_str *info, char *data, int len)
-{
-	if (info->pos + len > info->offset + info->length)
-		len = info->offset + info->length - info->pos;
-
-	if (info->pos + len < info->offset) {
-		info->pos += len;
-		return;
-	}
- 
-	if (info->pos < info->offset) {
-		off_t partial;
- 
-		partial = info->offset - info->pos;
-		data += partial;
-		info->pos += partial;
-		len  -= partial;
-	}
- 
-	if (len > 0) {
-		memcpy(info->buffer, data, len);
-		info->pos += len;
-		info->buffer += len;
-	}
-}
-
-static int
-copy_info(struct info_str *info, char *fmt, ...)
-{
-	va_list args;
-	char buf[256];
-	int len;
- 
-	va_start(args, fmt);
-	len = vsprintf(buf, fmt, args);
-	va_end(args);
- 
-	copy_mem_info(info, buf, len);
-
-	return (len);
-}
-
-/*************************************************************************
-* qla2x00_proc_info
-*
-* Description:
-*   Return information to handle /proc support for the driver.
-*
-* inout : decides the direction of the dataflow and the meaning of the
-*         variables
-* buffer: If inout==0 data is being written to it else read from it
-*         (ptr to a page buffer)
-* *start: If inout==0 start of the valid data in the buffer
-* offset: If inout==0 starting offset from the beginning of all
-*         possible data to return.
-* length: If inout==0 max number of bytes to be written into the buffer
-*         else number of bytes in "buffer"
-* Returns:
-*         < 0:  error. errno value.
-*         >= 0: sizeof data returned.
-*************************************************************************/
-int
-qla2x00_proc_info(struct Scsi_Host *shost, char *buffer,
-    char **start, off_t offset, int length, int inout)
-{
-	struct info_str	info;
-	int             retval = -EINVAL;
-	uint32_t        tmp_sn;
-	uint32_t	*flags;
-	uint8_t		*loop_state;
-	scsi_qla_host_t *ha;
-	char fw_info[30];
- 
-	DEBUG3(printk(KERN_INFO
-	    "Entering proc_info buff_in=%p, offset=0x%lx, length=0x%x\n",
-	    buffer, offset, length);)
-
-	ha = (scsi_qla_host_t *) shost->hostdata;
-
-	if (inout) {
-		/* Has data been written to the file? */
-		DEBUG3(printk(
-		    "%s: has data been written to the file. \n",
-		    __func__);)
-
-		return -ENOSYS;
-	}
-
-	if (start) {
-		*start = buffer;
-	}
-
-	info.buffer = buffer;
-	info.length = length;
-	info.offset = offset;
-	info.pos    = 0;
-
-	/* start building the print buffer */
-	copy_info(&info,
-	    "QLogic PCI to Fibre Channel Host Adapter for %s:\n"
-	    "        Firmware version %s, ",
-	    ha->model_number, qla2x00_get_fw_version_str(ha, fw_info));
-
-	copy_info(&info, "Driver version %s\n", qla2x00_version_str);
-
-	tmp_sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | 
-	    ha->serial1;
-	copy_info(&info, "ISP: %s, Serial# %c%05d\n",
-	    ha->brd_info->isp_name, ('A' + tmp_sn/100000), (tmp_sn%100000));
-
-	copy_info(&info,
-	    "Request Queue = 0x%llx, Response Queue = 0x%llx\n",
-		(unsigned long long)ha->request_dma,
-		(unsigned long long)ha->response_dma);
-
-	copy_info(&info,
-	    "Request Queue count = %d, Response Queue count = %d\n",
-	    ha->request_q_length, ha->response_q_length);
-
-	copy_info(&info,
-	    "Total number of active commands = %ld\n",
-	    ha->actthreads);
-
-	copy_info(&info,
-	    "Total number of interrupts = %ld\n",
-	    (long)ha->total_isr_cnt);
-
-	copy_info(&info,
-	    "    Device queue depth = 0x%x\n",
-	    (ql2xmaxqdepth == 0) ? 16 : ql2xmaxqdepth);
-
-	copy_info(&info,
-	    "Number of free request entries = %d\n", ha->req_q_cnt);
-
-	copy_info(&info,
-	    "Number of mailbox timeouts = %ld\n", ha->total_mbx_timeout);
-
-	copy_info(&info,
-	    "Number of ISP aborts = %ld\n", ha->total_isp_aborts);
-
-	copy_info(&info,
-	    "Number of loop resyncs = %ld\n", ha->total_loop_resync);
-
-	copy_info(&info,
-	    "Number of retries for empty slots = %ld\n",
-	    qla2x00_stats.outarray_full);
-
-	flags = (uint32_t *) &ha->flags;
-
-	if (atomic_read(&ha->loop_state) == LOOP_DOWN) {
-		loop_state = "DOWN";
-	} else if (atomic_read(&ha->loop_state) == LOOP_UP) {
-		loop_state = "UP";
-	} else if (atomic_read(&ha->loop_state) == LOOP_READY) {
-		loop_state = "READY";
-	} else if (atomic_read(&ha->loop_state) == LOOP_TIMEOUT) {
-		loop_state = "TIMEOUT";
-	} else if (atomic_read(&ha->loop_state) == LOOP_UPDATE) {
-		loop_state = "UPDATE";
-	} else {
-		loop_state = "UNKNOWN";
-	}
-
-	copy_info(&info, 
-	    "Host adapter:loop state = <%s>, flags = 0x%lx\n",
-	    loop_state , *flags);
-
-	copy_info(&info, "Dpc flags = 0x%lx\n", ha->dpc_flags);
-
-	copy_info(&info, "MBX flags = 0x%x\n", ha->mbx_flags);
-
-	copy_info(&info, "Link down Timeout = %3.3d\n",
-	    ha->link_down_timeout);
-
-	copy_info(&info, "Port down retry = %3.3d\n",
-	    ha->port_down_retry_count);
-
-	copy_info(&info, "Login retry count = %3.3d\n",
-	    ha->login_retry_count);
-
-	copy_info(&info,
-	    "Commands retried with dropped frame(s) = %d\n",
-	    ha->dropped_frame_error_cnt);
-
-	copy_info(&info,
-	    "Product ID = %04x %04x %04x %04x\n", ha->product_id[0],
-	    ha->product_id[1], ha->product_id[2], ha->product_id[3]);
-
-	copy_info(&info, "\n");
-
-	/* 2.25 node/port display to proc */
-	/* Display the node name for adapter */
-	copy_info(&info, "\nSCSI Device Information:\n");
-	copy_info(&info,
-	    "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 */
-	copy_info(&info,
-	    "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]);
-
-	retval = info.pos > info.offset ? info.pos - info.offset : 0;
-
-	DEBUG3(printk(KERN_INFO 
-	    "Exiting proc_info: info.pos=%d, offset=0x%lx, "
-	    "length=0x%x\n", info.pos, offset, length);)
-
-	return (retval);
-}
-
 /*
  * qla2x00_mark_device_lost Updates fcport state when device goes offline.
  *

-- 
Andrew Vasquez

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [0/5]  qla2xxx: remote port rework...
  2005-04-13 19:15 PATCH [0/5] qla2xxx: remote port rework Andrew Vasquez
                   ` (4 preceding siblings ...)
  2005-04-13 19:19 ` PATCH [5/5] qla2xxx: remove /proc interface Andrew Vasquez
@ 2005-04-13 19:42 ` Matthew Wilcox
  2005-04-13 20:50 ` PATCH [6/5] qla2xxx: update version :) Andrew Vasquez
  6 siblings, 0 replies; 25+ messages in thread
From: Matthew Wilcox @ 2005-04-13 19:42 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley

On Wed, Apr 13, 2005 at 12:15:48PM -0700, Andrew Vasquez wrote:
> 1) Remove internal command queuing.  This entails removal of the
>    driver's *_queue lists as well as modifications and removal of
>    routines which used them.  With the queuing removed -- the
>    driver will be unable to tolerate cable-pulls.  Thus we depend
>    on the next patch for support.

Wow, congratulations.  I'm still struggling to do this to sym2.

-- 
"Next the statesmen will invent cheap lies, putting the blame upon 
the nation that is attacked, and every man will be glad of those
conscience-soothing falsities, and will diligently study them, and refuse
to examine any refutations of them; and thus he will by and by convince 
himself that the war is just, and will thank God for the better sleep 
he enjoys after this process of grotesque self-deception." -- Mark Twain

^ permalink raw reply	[flat|nested] 25+ messages in thread

* PATCH [6/5]  qla2xxx: update version :)
  2005-04-13 19:15 PATCH [0/5] qla2xxx: remote port rework Andrew Vasquez
                   ` (5 preceding siblings ...)
  2005-04-13 19:42 ` PATCH [0/5] qla2xxx: remote port rework Matthew Wilcox
@ 2005-04-13 20:50 ` Andrew Vasquez
  2005-04-13 20:57   ` James Bottomley
  2005-04-13 21:17   ` Christoph Hellwig
  6 siblings, 2 replies; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-13 20:50 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley, Andrew Vasquez

  Update version.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

 drivers/scsi/qla2xxx/qla_version.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

--- a/drivers/scsi/qla2xxx/qla_version.h	2005-04-13 08:56:07.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_version.h	2005-04-13 08:58:47.000000000 -0700
@@ -19,9 +19,9 @@
 /*
  * Driver version 
  */
-#define QLA2XXX_VERSION      "8.00.02b4-k"
+#define QLA2XXX_VERSION      "8.00.02b5-k"
 
 #define QLA_DRIVER_MAJOR_VER	8
 #define QLA_DRIVER_MINOR_VER	0
 #define QLA_DRIVER_PATCH_VER	2
-#define QLA_DRIVER_BETA_VER	4
+#define QLA_DRIVER_BETA_VER	5

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [6/5]  qla2xxx: update version :)
  2005-04-13 20:50 ` PATCH [6/5] qla2xxx: update version :) Andrew Vasquez
@ 2005-04-13 20:57   ` James Bottomley
  2005-04-13 21:24     ` Andrew Vasquez
  2005-04-13 21:17   ` Christoph Hellwig
  1 sibling, 1 reply; 25+ messages in thread
From: James Bottomley @ 2005-04-13 20:57 UTC (permalink / raw)
  To: Andrew Vasquez; +Cc: Linux-SCSI Mailing List

On Wed, 2005-04-13 at 13:50 -0700, Andrew Vasquez wrote:
> -#define QLA2XXX_VERSION      "8.00.02b4-k"
> +#define QLA2XXX_VERSION      "8.00.02b5-k"

so, erm, removing about 4,000 lines of code and embracing a new
transport infrastructure doesn't even warrant a minor minor number
change in the driver ... ?

James



^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [6/5]  qla2xxx: update version :)
  2005-04-13 20:50 ` PATCH [6/5] qla2xxx: update version :) Andrew Vasquez
  2005-04-13 20:57   ` James Bottomley
@ 2005-04-13 21:17   ` Christoph Hellwig
  2005-04-15 17:38     ` Andrew Vasquez
  1 sibling, 1 reply; 25+ messages in thread
From: Christoph Hellwig @ 2005-04-13 21:17 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley

On Wed, Apr 13, 2005 at 01:50:07PM -0700, Andrew Vasquez wrote:
>   Update version.

Btw, Documentation/scsi/qla2xxx.revision.notes hasn't been updated for
ages.  Either scrap it or give it some love, I don't mind too much which
of these you prefer.


^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [6/5]  qla2xxx: update version :)
  2005-04-13 20:57   ` James Bottomley
@ 2005-04-13 21:24     ` Andrew Vasquez
  2005-04-19 21:15       ` Christoph Hellwig
  0 siblings, 1 reply; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-13 21:24 UTC (permalink / raw)
  To: James Bottomley; +Cc: Linux-SCSI Mailing List, Patrick Mansfield

On Wed, 13 Apr 2005, James Bottomley wrote:

> On Wed, 2005-04-13 at 13:50 -0700, Andrew Vasquez wrote:
> > -#define QLA2XXX_VERSION      "8.00.02b4-k"
> > +#define QLA2XXX_VERSION      "8.00.02b5-k"
> 
> so, erm, removing about 4,000 lines of code and embracing a new
> transport infrastructure doesn't even warrant a minor minor number
> change in the driver ... ?
> 

Ok, here's the deal -- QLogic's standard 8.01.00 driver contains the
following major additions:

* support for 4Gb ISPs
* FCIP support

I had considered going to 8.01.00-k or even 8.00.03-k for the upstream
kernel, but decided against it to minimize the potential for confusion
with users expecting comparable features and fixes with the two
drivers -- since there are QLogic standard 8.01.00 and 8.00.03
releases.

Yes, the upstream driver has just undergone some serious rework, and
in all honesty I'm rather ambivalent with respect to what the version
number is.  Nevertheless, this transition is going to be confusing and
had hoped that when the 4Gb support patch is added (after the dust
settled with the latest set of patches) the version number would then
pivot to 8.01.xx-k.

I'll feel fairly comfortable with the 4Gb upstream patches with about
another week of testing.

Anyway, given that, I'm open to suggestions...

--
av

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [4/5]  qla2xxx: cleanup DMA mappings...
  2005-04-13 19:19 ` PATCH [4/5] qla2xxx: cleanup DMA mappings Andrew Vasquez
@ 2005-04-13 21:34   ` Christoph Hellwig
  2005-04-15 18:06     ` Andrew Vasquez
  0 siblings, 1 reply; 25+ messages in thread
From: Christoph Hellwig @ 2005-04-13 21:34 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley

> +		struct page	*page;
> +		unsigned long	offset;
> +
> +		page = virt_to_page(cmd->request_buffer);
> +		offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);
> +		req_dma = pci_map_page(ha->pdev, page, offset,
> +		    cmd->request_bufflen, cmd->sc_data_direction);

Why're you're redoing that code please switch to pci_map_single insted
of these nasty operations to go to the page first, the code will become
a lit simpler too, e.g. the above becomes just:

	req_dma = pci_map_single(ha->pdev, cmd->request_buffer,
			cmd->request_bufflen, cmd->sc_data_direction);


^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [2/5]  qla2xxx: add remote port codes...
  2005-04-13 19:18 ` PATCH [2/5] qla2xxx: add remote port codes Andrew Vasquez
@ 2005-04-13 21:40   ` Christoph Hellwig
  2005-04-19  6:33     ` Andrew Vasquez
  2005-04-19  7:27     ` Andrew Vasquez
  2005-04-17 15:18   ` James Bottomley
  1 sibling, 2 replies; 25+ messages in thread
From: Christoph Hellwig @ 2005-04-13 21:40 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley

> +#include <linux/version.h>

not needed (this is in qla_attr.c)

> +struct scsi_transport_template *
> +qla2x00_alloc_transport_tmpl(void)
> +{
> +	return (fc_attach_transport(&qla2xxx_transport_functions));
> +}

I don't see much of a point in this function vs just making
qla2xxx_transport_functions non-static.

> --- a/drivers/scsi/qla2xxx/qla_gbl.h	2005-04-13 08:38:23.000000000 -0700
> +++ b/drivers/scsi/qla2xxx/qla_gbl.h	2005-04-13 08:42:33.000000000 -0700
> @@ -24,6 +24,7 @@
>  #define	__QLA_GBL_H
>  
>  #include <linux/interrupt.h>
> +#include <scsi/scsi_transport.h>

shouldn't be needed, a simple forward-declaration of
struct scsi_transport_template should do it.

>  	atomic_set(&fcport->state, FCS_ONLINE);
> +	if (ha->flags.init_done)
> +		qla2x00_reg_remote_port(ha, fcport);
>  }

...

> -		goto probe_failed;
> +		goto probe_alloc_failed;
>  	}
>  
> +	pci_set_drvdata(pdev, ha);
> +	host->this_id = 255;
> +	host->cmd_per_lun = 3;
> +	host->unique_id = ha->instance;
> +	host->max_cmd_len = MAX_CMDSZ;
> +	host->max_channel = ha->ports - 1;
> +	host->max_id = ha->max_targets;
> +	host->max_lun = ha->max_luns;
> +	host->transportt = qla2xxx_transport_template;
> +	if (scsi_add_host(host, &pdev->dev))
> +		goto probe_alloc_failed;
> +
> +	qla2x00_alloc_sysfs_attr(ha);
> +
>  	if (qla2x00_initialize_adapter(ha) &&
>  	    !(ha->device_flags & DFLG_NO_CABLE)) {

Now this I don't undersant.  You're moving the host registration earlier,
maybe too earlier but I haven't checked that yet, why do you still need
the special case for delaying registration of the targets?

Also please propagate the full error that scsi_add_host returned.


^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [6/5]  qla2xxx: update version :)
  2005-04-13 21:17   ` Christoph Hellwig
@ 2005-04-15 17:38     ` Andrew Vasquez
  0 siblings, 0 replies; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-15 17:38 UTC (permalink / raw)
  To: James Bottomley; +Cc: Linux-SCSI Mailing List, Christoph Hellwig

On Wed, 13 Apr 2005, Christoph Hellwig wrote:

> On Wed, Apr 13, 2005 at 01:50:07PM -0700, Andrew Vasquez wrote:
> >   Update version.
> 
> Btw, Documentation/scsi/qla2xxx.revision.notes hasn't been updated for
> ages.  Either scrap it or give it some love, I don't mind too much which
> of these you prefer.
> 

I'd prefer to drop it.  

James, please apply the following patch.  Thanks.





  Remove stale revisions file.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

 Documentation/scsi/qla2xxx.revision.notes |  457 ------------------------------
 1 files changed, 457 deletions(-)

--- a/Documentation/scsi/qla2xxx.revision.notes	2005-04-11 09:45:10.000000000 -0700
+++ b/Documentation/scsi/qla2xxx.revision.notes	2005-04-31 16:00:00.000000000 -0800
@@ -1,457 +0,0 @@
-/*
- * QLogic ISP2200 and ISP2300 Linux Driver Revision List File.
- *
- ********************************************************************
- *
- * Revision History
- *
- *  Rev  8.00.00b8	December 5, 2003	AV
- *	- Instruct mid-layer to perform initial scan.
- *
- *  Rev  8.00.00b7	December 5, 2003	AV
- *	- Resync with Linux Kernel 2.6.0-test11.
- *	- Add basic NVRAM parser (extras/qla_nvr).
- *
- *  Rev  8.00.00b7-pre11 December 3, 2003	AV
- *	- Sanitize the scsi_qla_host structure:
- *	  - Purge unused elements.
- *	  - Reorganize high-priority members (cache coherency).
- *	- Add support for NVRAM access via a sysfs binary attribute:
- *	  - Consolidate semaphore locking access.
- *	- Fix more PCI posting issues.
- *	- Add extras directory for dump/NVRAM tools.
- *	- Remove unused qla_vendor.c file.
- *
- *  Rev  8.00.00b7-pre11 November 26, 2003	DG/AV
- *	- Merge several patches from Christoph Hellwig [hch@lst.de]:
- *	  - in Linux 2.6 both pci and the scsi layer use the generic
- *	    dma direction bits, use them directly instead of the scsi
- *	    and pci variants and the (noop) conversion routines.
- *	- Fix _IOXX_BAD() usage for external IOCTL interface.
- *	- Use atomic construct for HA loop_state member.
- *	- Add generic model description text for HBA types.
- *
- *  Rev  8.00.00b7-pre5	November 17, 2003	AV
- *	- Merge several patches from Christoph Hellwig [hch@lst.de]:
- *	  - patch to split the driver into a common qla2xxx.ko and a
- *	    qla2?00.ko for each HBA type - the latter modules are
- *	    only very small wrappers, mostly for the firmware
- *	    images, all the meat is in the common qla2xxx.ko.
- *	  - make the failover code optional.
- *	  - kill useless lock_kernel in dpc thread startup.
- *	  - no need for modversions hacks in 2.6 (or 2.4).
- *	  - kill qla2x00_register_with_Linux.
- *	  - simplify EH code, cmd or it's hostdata can't be NULL, no
- *	    need to search whether the host it's ours, the midlayer
- *	    makes sure it won't call into a driver for some else
- *	    host.
- *	- Merge several patches from Jes Sorensen
- *	  [jes@wildopensource.com]:
- *	  - Call qla2x00_config_dma_addressing() before performing
- *	    any consistent allocations. This is required since the
- *	    dma mask settings will affect the memory
- *	    pci_alloc_consistent() will return.
- *	  - Call pci_set_consistent_dma_mask() to allow for 64 bit
- *	    consistent allocations, required on some platforms such
- *	    as the SN2.
- *	  - Wait 20 usecs (not sure how long is really necessary,
- *	    but this seems safe) after setting CSR_ISP_SOFT_RESET in
- *	    the ctrl_status register as the card doesn't respond to
- *	    PCI reads while in reset state. This causes a machine
- *	    check on some architectures.
- *	  - Flush PCI writes before calling udelay() to ensure the
- *	    write is not sitting idle in-flight for a while before
- *	    hitting the hardware.
- *	  - Include linux/vmalloc.h in qla_os.c since it uses
- *	    vmalloc().
- *	  - Use auto-negotiate link speed when using default
- *	    parameters rather than NVRAM settings. Disable NVRAM
- *	    reading on SN2 since it's not possible to execute the
- *	    HBA's BIOS on an SN2. I suggest doing something similar
- *	    for all architectures that do not provide x86 BIOS
- *	    emulation.
- *	- Clean-up slab-cache allocations:
- *	  - locking.
- *	  - mempool allocations in case of low-memory situations.
- *	- Fallback to GA_NXT scan if GID_PT call returns more than
- *	  MAX_FIBRE_DEVICES.
- *	- Preserve iterating port ID across GA_NXT calls in
- *	  qla2x00_find_all_fabric_devs().
- *	- Pre-calculate ASCII firmware dump length as to not incur the
- *	  cost-to-calculate at each invocation of a read().
- *
- *  Rev  8.00.00b6	November 4, 2003	AV
- *	- Add new 2300 TPX firmware (3.02.18).
- *
- *  Rev  8.00.00b6-pre25 October 20, 2003	RA/AV
- *	- Resync with Linux Kernel 2.6.0-test9.
- *	- Rework firmware dump process:
- *	  - Use binary attribute within sysfs tree.
- *	  - Add user-space tool (gdump.sh) to retrieve formatted
- *	    buffer.
- *	  - Add ISP2100 support.
- *	- Use a slab cache for SRB allocations to reduce memory
- *	  pressure.
- *	- Initial conversion of driver logging methods to a new
- *	  qla_printk() function which uses dev_printk (Daniel
- *	  Stekloff, IBM).
- *	- Further reduce stack usage in qla2x00_configure_local_loop()
- *	  and qla2x00_find_all_fabric_devs().
- *	- Separate port state used for routing of I/O's from port
- *	  mgmt-login retry etc.
- *
- *  Rev  8.00.00b6-pre19 October 13, 2003	AV
- *	- Resync with Linux Kernel 2.6.0-test7-bk5.
- *	- Add intelligent RSCN event handling:
- *	  - reduce scan time during 'port' RSCN events by only
- *	    querying specified port ids.
- *	  - Available on ISP23xx cards only.
- *	- Increase maximum number of recognizable targets from 256
- *	  to 512.
- *	  - Backend changes were previously added to support TPX
- *	    (2K logins) firmware.  Mid-layer can now scan for targets
- *	    (H, B, T, L) where 512 < T >= 0.
- *	- Remove IP support from driver.
- *	  - Switch firmware types from IP->TP for ISP22xx and
- *	    IPX->TPX for ISP23xx cards.
- *	  - Remove files qla_ip.[ch].
- *	- Remove type designations from firmware filenames.
- *
- *  Rev  8.00.00b6-pre11 September 15, 2003	DG/AV
- *	- Resync with 6.06.00.
- *	- Resync with Linux Kernel 2.6.0-test5-bk3.
- *	- Add new 2300 IPX firmware (3.02.15).
- *
- *  Rev  8.00.00b5	July 31, 2003		AV
- *	- Always create an fc_lun_t entry for lun 0 - as the mid-
- *	  layer requires access to this lun for discovery to occur.
- *	- General sanitizing:
- *	  - Add generic firmware option definitions.
- *	  - Generalize retrieval/update of firmware options.
- *	  - Fix compile errors which occur with extended debug.
- *	  - Handle failure cases for scsi_add_host() and
- *	    down_interruptible().
- *	- Host template updates:
- *	  - Use standard bios_param callback function.
- *	  - Disable clustering.
- *	  - Remove unchecked_is_dma entry.
- *
- *  Rev  8.00.00b5-pre5	July 29, 2003		DG/AV
- *	- Resync with 6.06.00b13.
- *	- Resync with Linux Kernel 2.6.0-test2.
- *	- Pass the complete loop_id, not the masked (0xff) value
- *	  while issuing mailbox commands (qla_mbx.c/qla_fo.c/
- *	  qla_iocb.c/qla_init.c).
- *	- Properly handle zero-length return status for an RLC CDB.
- *	- Create an fclun_t structure for 'disconnected' luns,
- *	  peripheral-qualifier of 001b.
- *	- Remove unused LIP-sequence register access during AE 8010.
- *	- Generalize qla2x00_mark_device_lost() to handle forced 
- *	  login request -- modify all direct/indirect invocations 
- *	  with proper flag.
- *	- Save RSCN notification (AE 8015h) data in a proper and 
- *	  consistent format (domain, area, al_pa).
- *	- General sanitizing:
- *	  - scsi_qla_host structure member reordering for cache-line
- *	    coherency.
- *	  - Remove unused SCSI opcodes, endian-swap definitions.
- *	  - Remove CMD_* pre-processor defines.
- *	  - Remove unused SCSIFCHOTSWAP/GAMAP/MULTIHOST codes.
- *	- Backout patch which added a per-scsi_qla_host scsi host
- *	  spinlock, since mid-layer already defines one.
- *	- Add new 2300 IPX firmware (3.02.15).
- *
- *  Rev  8.00.00b4	July 14, 2003		RA/DG/AV
- *	- Resync with 6.06.00b12.
- *	- Resync with Linux Kernel 2.6.0-test1.
- *	- Remove IOCB throttling code -- originally #if'd.
- *	- Remove apidev_*() routines since proc_mknod() has been
- *	  removed -- need alternate IOCTL interface.
- *	- Merge several performance/fix patches from Arjan van de
- *	  Ven:
- *	  - Undefined operation >> 32.
- *	  - No need to acquire mid-layer lock during command
- *	    callback. 
- *	  - Use a per-HBA mid-layer lock.
- *	  - Use a non-locked cycle for setting the count of the
- *	    newly allocated sp (qla2x00_get_new_sp()).
- *	  - Modify semantic behavior of qla2x00_queuecommand():
- *	    - Reduce cacheline bouncing by having I/Os submitted
- *	      by the IRQ handler.
- *	    - Remove extraneous calls to qla2x00_next() during I/O
- *	      queuing.
- *	  - Use list_splice_init() during qla2x00_done() handling
- *	    of commands to reduce list_lock contention.
- *	  - RIO mode support for ISP2200:
- *	    - Implementation differs slightly from original patch.
- *	  - Do not use bottom-half handler (tasklet/work queue)
- *	    for qla2x00_done() processing.
- *
- *  Rev  8.00.00b4-pre22 July 12, 2003		AV
- *	- Check for 'Process Response Queue' requests early during
- *	  the Host Status check.
- *	- General sanitizing:
- *	  - srb_t structure rewrite, removal of unused members.
- *	  - Remove unused fcdev array, fabricid, and PORT_*
- *	    definitions.
- *	  - Remove unused config_reg_t PCI definitions.
- *	- Add new 2200 IP firmware (2.02.06).
- *	- Add new 2300 IPX firmware (3.02.14).
- *
- *  Rev  8.00.00b4-pre19 June 30, 2003		AV
- *	- Resync with Linux Kernel 2.5.73-bk8.
- *	- Rework IOCB command queuing methods:
- *	  - Upper-layer driver *MUST* properly set the direction
- *	    bit of SCSI commands.
- *	  - Generalize 32bit/64bit queuing path functions.
- *	  - Remove costly page-boundary cross check when using
- *	    64bit address capable IOCBs.
- *
- *  Rev  8.00.00b4-pre15 June 19, 2003		AV
- *	- Resync with 6.06.00b11.
- *	- Continue fcport list consolidation work:
- *	  - Updated IOCTL implementations to use new fcports 
- *	    list.
- *	- Modified product ID check to not verify ISP chip
- *	  revision -- ISP2312 v3 (qla2x00_chip_diag()).
- *	- Add new 2300 IPX firmware (3.02.13):
- *
- *  Rev  8.00.00b4-pre13 June 19, 2003		AV
- *	- Fix build process for qla2100 driver -- no support
- *	  for IP.
- *	- SCSI host template modifications:
- *	  - Set sg_tablesize based on the derived DMA mask.
- *	  - Increase max_sectors since only limit within RISC
- *	    is transfer of (((2^32) - 1) >> 9) sectors.
- *
- *  Rev  8.00.00b4-pre12 June 18, 2003		RA, DG, RL, AV
- *	- Resync with 6.06.00b10.
- *	- Resync with Linux Kernel 2.5.72.
- *	- Initial fcport list consolidation work:
- *	  - fcports/fcinitiators/fcdev/fc_ip --> ha->fcports
- *	    list.
- *
- *  Rev  8.00.00b4-pre7	 June 05, 2003		AV
- *	- Properly release PCI resouces in init-failure case.
- *	- Reconcile disparite function return code definitions.
- *
- *  Rev  8.00.00b4-pre4	 June 03, 2003		AV
- *	- Resync with Linux Kernel 2.5.70-bk8:
- *	  - SHT proc_info() changes.
- *	- Restructure SNS Generic Services routines:
- *	  - Add qla_gs.c file to driver distribution.
- *	- Configure PCI latency timer for ISP23xx.
- *
- *  Rev  8.00.00b4-pre3	 June 02, 2003		RA, DG, RL, AV
- *	- Resync with 6.06.00b5.
- *	- Rework (again) PCI I/O space configuration
- *	  (Anton Blanchard):
- *	  - Use pci_set_mwi() routine;
- *	    - Remove uneeded qla2x00_set_cache_line() function.
- *	  - Remove extraneous modification of PCI_COMMAND word.
- *
- *  Rev  8.00.00b3 	 May 29, 2003		AV
- *	- Resync with Linux Kernel 2.5.70.
- *	- Move RISC paused check from ISR fast-path.
- *
- *  Rev  8.00.00b3-pre8 May 26, 2003		AV
- *	- Add new 2300 IPX firmware (3.02.12):
- *	- Rework PCI I/O space configuration.
- *
- *  Rev  8.00.00b3-pre6	May 22, 2003		RA, DG, RL, AV
- *	- Resync with 6.06.00b3.
- *
- *  Rev  8.00.00b3-pre4	May 21 2003		AV
- *	- Add new 2300 IPX firmware (3.02.11):
- *	  - Remove 2300 TPX firmware from distribution.
- *
- *  Rev  8.00.00b3-pre3	May 21 2003		AV
- *	- Properly setup PCI configuation space during
- *	  initialization:
- *	  - Properly configure Memory-Mapped I/O during early
- *	    configuration stage.
- *	- Rework IP functionality to support 2k logins.
- *	- Add new 2300 IPX firmware (3.02.11):
- *	  - Remove 2300 TPX firmware from distribution.
- *
- *  Rev  8.00.00b3-pre2	May ??, 2003		RA, DG, RL, AV
- *	- Resync with 6.06.00b1.
- *
- *  Rev  8.00.00b3-pre1	May ??, 2003		RA, DG, RL, AV
- *	- Resync with 6.05.00.
- *
- *  Rev  8.00.00b2	May 19, 2003		AV
- *	- Simplify dma_addr_t handling during command queuing given
- *	  new block-layer defined restrictions:
- *	  - Physical addresses not spanning 4GB boundaries.
- *	- Firmware versions: 2100 TP (1.19.24), 2200 IP (2.02.05),
- *	  2300 TPX (3.02.10).
- *
- *  Rev  8.00.00b2-pre1	May 13, 2003		AV
- *	- Add support for new 'Hotplug initialization' model. 
- *	- Simplify host template by removing unused callbacks.
- *	- Use scsicam facilities to determine geometry.
- *	- Fix compilation issues for non-ISP23xx builds:
- *	  - Correct register references in qla_dbg.c.
- *	  - Correct Makefile build process.
- *
- *  Rev  8.00.00b1	May 05, 2003		AV
- *	- Resync with Linux Kernel 2.5.69.
- *	- Firmware versions: 2100 TP (1.19.24), 2200 TP (2.02.05),
- *	  2300 TPX (3.02.10).
- *
- *  Rev  8.00.00b1-pre45 April ??, 2003		AV
- *	- Resync with Linux Kernel 2.5.68-bk11:
- *	- Fix improper return-code assignment during fabric
- *	  discovery.
- *	- Remove additional extraneous #defines from
- *	  qla_settings.h.
- *	  - USE_PORTNAME -- FO will always use portname.
- *	- Default queue depth size set to 64.
- *
- *  Rev  8.00.00b1-pre42 April ??, 2003		AV
- *	- Convert bottom-half tasklet to a work_queue.
- *	- Initial basic coding of dynamic queue depth handling
- *	  during QUEUE FULL statuses.
- *	- Fix mailbox interface problem with
- *	  qla2x00_get_retry_cnt().
- *
- *  Rev  8.00.00b1-pre41 April ??, 2003		AV
- *	- Convert build defines qla2[1|2|3]00 macros to
- *	  qla2[1|2|3]xx due to module name stringification clashes.
- *	- Add additional ISP2322 checks during board configuration.
- *
- *  Rev  8.00.00b1-pre40 April ??, 2003		AV
- *	- Resync with Linux Kernel 2.5.68-bk8:
- *	  - Updated IRQ handler interface.
- *	- Add ISP dump code (stub) in case of SYSTEM_ERROR on
- *	  ISP2100.
- *	- Add new 2200 IP firmware (2.02.05).
- *
- *  Rev  8.00.00b1-pre39 April ??, 2003		AV
- *	- Resync with Linux Kernel 2.5.68.
- *	- Add simple build.sh script to aid in external compilation.
- *	- Clean-break with Kernel 2.4 compatibility.
- *	  - Rework DPC routine -- completion routines for signaling.
- *	- Re-add HBAAPI character device node for IOCTL support.
- *	- Remove residual QLA2X_PERFORMANCE defines.
- *	- Allocate SP pool via __get_free_pages() rather than
- *	  individual kmalloc()'s.
- *	- Inform SCSI mid-layer of 16-byte CDB support
- *	  (host->max_cmd_len):
- *	  - Remove unecessary 'more_cdb' handling code from
- *	    qla_iocb.c and qla_xioct.c.
- *	- Reduce duplicate code in fabric scanning logic (MS IOCB
- *	  preparation).
- *	- Add ISP dump code in case of SYSTEM_ERROR.
- *	- Remove 2300 VIX firmware from distribution:
- *	  - Add initial code for IPX support.
- *	- Add new 2300 TPX firmware (3.02.10).
- *
- *  Rev  8.00.00b1-pre34 April ??, 2003		AV
- *	- Resync with Linux Kernel 2.5.67.
- *	- Use domain/area/al_pa fields when displaying PortID 
- *	  values -- addresses endianess issues.
- *	- Rework large case statement to check 'common' CDB commands
- *	  early in qla2x00_get_cmd_direction().
- *
- *  Rev  8.00.00b1-pre31 April ??, 2003		AV
- *	- Update makefile to support PPC64 build.
- *	- Retool NVRAM configuration routine and structures:
- *	  - Consoldate ISP21xx/ISP22xx/ISP23xx configuration
- *	    (struct nvram_t).
- *	  - Remove big/little endian support structures in favor of
- *	    simplified bit-operations within byte fields.
- *	- Fix long-standing 'static' buffer sharing problem in 
- *	  qla2x00_configure_fabric().
- *
- *  Rev  8.00.00b1-pre30 April ??, 2003		AV
- *	- Complete implementation of GID_PT scan.
- *	- Use consistent MS IOCB invocation method to query SNS:
- *	  - Add RNN_ID and RSNN_NN registrations in a fabric.
- *	- Remove unused Mailbox Command 6Eh (Send SNS) support
- *	  structures.
- *	- Use 64bit safe IOCBs while issuing INQUIRY and RLC during
- *	  topology scan.
- *	- Until reimplementation of fcdev_t/fcport list
- *	  consolidation, valid loop_id ranges are still limited from
- *	  0x00 through 0xFF -- enforce this within the code.
- *
- *  Rev  8.00.00b1-pre27 March ??, 2003		AV
- *	- Resync with 6.05.00b9.
- *	- Retool HBA PCI configuration -- qla2x00_pci_config().
- *	- Remove inconsistent use of delay routines (UDELAY/SYS*).
- *	- Continue to teardown/clean/add comments and debug
- *	  routines.
- *	- Properly swap bytes of the device's nodename in
- *	  qla2x00_configure_local_loop().
- *
- *  Rev  8.00.00b1-pre25 March ??, 2003		AV
- *	- Resync with 6.05.00b8.
- *
- *  Rev  8.00.00b1-pre23 March ??, 2003		AV
- *	- Remove (#define) IOCB usage throttling.
- *	- Abstract interrupt polling with qla2x00_poll().
- *	- Modify lun scanning logic:
- *	  - If the device does not support the SCSI Report Luns
- *	    command, the driver will now only scan from 0 to the
- *	    max#-luns as defined in the NVRAM (BIOS), rather than
- *	    blindly scanning from 0 to 255 -- which could result in
- *	    an increase in startup time when running against slow
- *	    (JBOD) devices.
- *	- Rework reset logic in qla2x00_reset_chip() (spec).
- *
- *  Rev  8.00.00b1-pre22 March ??, 2003		AV
- *	- Resync with 6.05.00b7.
- *	- Cleanup (rewrite) ISR handler.
- *	- Rename kmem_zalloc --> qla2x00_kmem_zalloc():
- *	  - This function will eventually be removed.
- *	- Add new 2300 VIX firmware (3.02.09):
- *	  - Support for Tape, Fabric, 2K logins, IP, and VI.
- *
- *  Rev  8.00.00b1-pre18 March ??, 2003		AV
- *	- Support 232x type ISPs.
- *	- Support single firmware for each ISP type:
- *	  - Restructure brd_info/fw_info methods.
- *	  - Streamline firmware load process.
- *	  - Properly query firmware for version information.
- *	- Remove extraneous scsi_qla_host members:
- *	  - device_id ==> pdev->device
- *	- Fix fc4 features (RFF_ID) registration.
- *	- Convert kmem_zalloc --> qla2x00_kmem_zalloc().
- *	- Remove unused/extraneous #defines (USE_PORTNAME).
- *
- *  Rev  8.00.00b1-pre14 March ??, 2003		AV
- *	- Resync with 6.05.00b6.
- *	- Initial source-code restructuring effort.
- *	  - Build procedure.
- *	  - Source file layout -- intuitive component layout.
- *	  - Remove unused #defines (*PERFORMANCE, WORD_FW_LOAD, etc).
- *	- Add support for 2K logins (TPX -- firmware).
- *	- Add module parameter ql2xsuspendcount.
- *	- Add new 2200 IP/TP firmware (2.02.04).
- *
- *  Rev  8.00.00b1-pre9	March ??, 2003	RL/DG/RA/AV
- *	- Use kernel struct list_head for fcport and fclun lists.
- *	- Remove extraneous (L|M)S_64BITS() and QL21_64*() defines.
- *
- *  Rev  8.00.00b1-pre8	February 28, 2003	RL/DG/RA/AV
- *	- Resync with 6.05.00b3.
- *
- *  Rev  8.00.00b1-pre7	February 23, 2003	RL/DG/RA/AV
- *	- Add alternate fabric scanning logic (GID_PT/GNN_ID/GPN_ID).
- *	- Remove use of deprecated function check_region().
- *	- Add new 2300 IP/TP firmware (3.02.08).
- *
- *  Rev  8.00.00b1-pre5	January 28, 2003	RL/DG/RA/AV
- *	- Resync with 6.05.00b3.
- *	- Consolidate device_reg structure definitions for ISP types.
- *	- Add support for new queue-depth selection.
- *	- Add new 2300 IP/TP firmware (3.02.07).
- *
- *  Rev  8.00.00b1-pre1	January 17, 2003	AV
- *	- Initial branch from 6.04.00b8 driver.
- *	- Remove VMWARE specific code.
- *	- Add support for pci_driver interface.
- *
- ********************************************************************/

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [4/5]  qla2xxx: cleanup DMA mappings...
  2005-04-13 21:34   ` Christoph Hellwig
@ 2005-04-15 18:06     ` Andrew Vasquez
  0 siblings, 0 replies; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-15 18:06 UTC (permalink / raw)
  To: James Bottomley
  Cc: Linux-SCSI Mailing List, Christoph Hellwig, Andrew Vasquez

On Wed, 13 Apr 2005, Christoph Hellwig wrote:

> > +		struct page	*page;
> > +		unsigned long	offset;
> > +
> > +		page = virt_to_page(cmd->request_buffer);
> > +		offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);
> > +		req_dma = pci_map_page(ha->pdev, page, offset,
> > +		    cmd->request_bufflen, cmd->sc_data_direction);
> 
> Why're you're redoing that code please switch to pci_map_single insted
> of these nasty operations to go to the page first, the code will become
> a lit simpler too, e.g. the above becomes just:
> 
> 	req_dma = pci_map_single(ha->pdev, cmd->request_buffer,
> 			cmd->request_bufflen, cmd->sc_data_direction);
> 

Ok, how about this as an alternative.



  Don't use cmd->request->nr_hw_segments as it may not be initialized
  (SG_IO in particular bypasses anything that initializes this and just
  uses scsi_do_req to insert a scsi_request directly on the head of the
  queue) and a bogus value here can trip up the checks to make sure that
  the number of segments will fit in the queue ring buffer, resulting in
  commands that are never completed.

  Fix up several issues with PCI DMA mapping and failure to check return
  values on the mappings.

  Make the check for space in the ring buffer happen after the DMA mapping
  is done since any checks done before the mapping has taken place are
  bogus.

  Doug Ledford <dledford@redhat.com>.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

 drivers/scsi/qla2xxx/qla_iocb.c |   72 +++++++++++++++++++++++++++----------------------------------
 1 files changed, 33 insertions(+), 39 deletions(-)

--- a/drivers/scsi/qla2xxx/qla_iocb.c	2005-04-13 08:45:53.000000000 -0700
+++ b/drivers/scsi/qla2xxx/qla_iocb.c	2005-04-15 08:24:01.000000000 -0700
@@ -216,18 +216,7 @@
 			cur_seg++;
 		}
 	} else {
-		dma_addr_t	req_dma;
-		struct page	*page;
-		unsigned long	offset;
-
-		page = virt_to_page(cmd->request_buffer);
-		offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);
-		req_dma = pci_map_page(ha->pdev, page, offset,
-		    cmd->request_bufflen, cmd->sc_data_direction);
-
-		sp->dma_handle = req_dma;
-
-		*cur_dsd++ = cpu_to_le32(req_dma);
+		*cur_dsd++ = cpu_to_le32(sp->dma_handle);
 		*cur_dsd++ = cpu_to_le32(cmd->request_bufflen);
 	}
 }
@@ -299,19 +288,8 @@
 			cur_seg++;
 		}
 	} else {
-		dma_addr_t	req_dma;
-		struct page	*page;
-		unsigned long	offset;
-
-		page = virt_to_page(cmd->request_buffer);
-		offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK);
-		req_dma = pci_map_page(ha->pdev, page, offset,
-		    cmd->request_bufflen, cmd->sc_data_direction);
-
-		sp->dma_handle = req_dma;
-
-		*cur_dsd++ = cpu_to_le32(LSD(req_dma));
-		*cur_dsd++ = cpu_to_le32(MSD(req_dma));
+		*cur_dsd++ = cpu_to_le32(LSD(sp->dma_handle));
+		*cur_dsd++ = cpu_to_le32(MSD(sp->dma_handle));
 		*cur_dsd++ = cpu_to_le32(cmd->request_bufflen);
 	}
 }
@@ -345,6 +323,8 @@
 	ha = sp->ha;
 	reg = ha->iobase;
 	cmd = sp->cmd;
+	/* So we know we haven't pci_map'ed anything yet */
+	tot_dsds = 0;
 
 	/* Send marker if required */
 	if (ha->marker_needed != 0) {
@@ -369,8 +349,27 @@
 	if (index == MAX_OUTSTANDING_COMMANDS)
 		goto queuing_error;
 
+	/* Map the sg table so we have an accurate count of sg entries needed */
+	if (cmd->use_sg) {
+		sg = (struct scatterlist *) cmd->request_buffer;
+		tot_dsds = pci_map_sg(ha->pdev, sg, cmd->use_sg,
+		    cmd->sc_data_direction);
+		if (tot_dsds == 0)
+			goto queuing_error;
+	} else if (cmd->request_bufflen) {
+		dma_addr_t	req_dma;
+
+		req_dma = pci_map_single(ha->pdev, cmd->request_buffer,
+		    cmd->request_bufflen, cmd->sc_data_direction);
+		if (dma_mapping_error(req_dma))
+			goto queuing_error;
+
+		sp->dma_handle = req_dma;
+		tot_dsds = 1;
+	}
+
 	/* Calculate the number of request entries needed. */
-	req_cnt = (ha->calc_request_entries)(cmd->request->nr_hw_segments);
+	req_cnt = (ha->calc_request_entries)(tot_dsds);
 	if (ha->req_q_cnt < (req_cnt + 2)) {
 		cnt = RD_REG_WORD_RELAXED(ISP_REQ_Q_OUT(ha, reg));
 		if (ha->req_ring_index < cnt)
@@ -382,19 +381,6 @@
 	if (ha->req_q_cnt < (req_cnt + 2))
 		goto queuing_error;
 
-	/* Finally, we have enough space, now perform mappings. */
-	tot_dsds = 0;
-	if (cmd->use_sg) {
-		sg = (struct scatterlist *) cmd->request_buffer;
-		tot_dsds = pci_map_sg(ha->pdev, sg, cmd->use_sg,
-		    cmd->sc_data_direction);
-		if (tot_dsds == 0)
-			goto queuing_error;
-	} else if (cmd->request_bufflen) {
-	    tot_dsds++;
-	}
-	req_cnt = (ha->calc_request_entries)(tot_dsds);
-
 	/* Build command packet */
 	ha->current_outstanding_cmd = handle;
 	ha->outstanding_cmds[handle] = sp;
@@ -461,6 +447,14 @@
 	return (QLA_SUCCESS);
 
 queuing_error:
+	if (cmd->use_sg && tot_dsds) {
+		sg = (struct scatterlist *) cmd->request_buffer;
+		pci_unmap_sg(ha->pdev, sg, cmd->use_sg,
+		    cmd->sc_data_direction);
+	} else if (tot_dsds) {
+		pci_unmap_single(ha->pdev, sp->dma_handle,
+		    cmd->request_bufflen, cmd->sc_data_direction);
+	}
 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
 	return (QLA_FUNCTION_FAILED);

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [2/5]  qla2xxx: add remote port codes...
  2005-04-13 19:18 ` PATCH [2/5] qla2xxx: add remote port codes Andrew Vasquez
  2005-04-13 21:40   ` Christoph Hellwig
@ 2005-04-17 15:18   ` James Bottomley
  1 sibling, 0 replies; 25+ messages in thread
From: James Bottomley @ 2005-04-17 15:18 UTC (permalink / raw)
  To: Andrew Vasquez; +Cc: Linux-SCSI Mailing List

On Wed, 2005-04-13 at 12:18 -0700, Andrew Vasquez wrote:
>  drivers/scsi/qla2xxx/qla_attr.c |  323 ++++++++++++++++++++++++++++++++++++++++

This file uses vmalloc but doesn't appear to include linux/vmalloc.h
causing a compiler warning in my build env.  It also includes
linux/version.h, which it doesn't appear to need.

I'll stick this patch in to correct the problem.

James

===== drivers/scsi/qla2xxx/qla_attr.c 1.2 vs edited =====
--- 1.2/drivers/scsi/qla2xxx/qla_attr.c	2005-04-13 10:45:53 -05:00
+++ edited/drivers/scsi/qla2xxx/qla_attr.c	2005-04-17 09:41:13 -05:00
@@ -18,7 +18,7 @@
  */
 #include "qla_def.h"
 
-#include <linux/version.h>
+#include <linux/vmalloc.h>
 #include <scsi/scsi_transport_fc.h>
 
 /* SYSFS attributes --------------------------------------------------------- */



^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [2/5]  qla2xxx: add remote port codes...
  2005-04-13 21:40   ` Christoph Hellwig
@ 2005-04-19  6:33     ` Andrew Vasquez
  2005-04-19  7:27     ` Andrew Vasquez
  1 sibling, 0 replies; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-19  6:33 UTC (permalink / raw)
  To: James Bottomley; +Cc: Linux-SCSI Mailing List, Christoph Hellwig

On Wed, 13 Apr 2005, Christoph Hellwig wrote:

> 
> > +struct scsi_transport_template *
> > +qla2x00_alloc_transport_tmpl(void)
> > +{
> > +	return (fc_attach_transport(&qla2xxx_transport_functions));
> > +}
> 
> I don't see much of a point in this function vs just making
> qla2xxx_transport_functions non-static.
> 
> > --- a/drivers/scsi/qla2xxx/qla_gbl.h	2005-04-13 08:38:23.000000000 -0700
> > +++ b/drivers/scsi/qla2xxx/qla_gbl.h	2005-04-13 08:42:33.000000000 -0700
> > @@ -24,6 +24,7 @@
> >  #define	__QLA_GBL_H
> >  
> >  #include <linux/interrupt.h>
> > +#include <scsi/scsi_transport.h>
> 
> shouldn't be needed, a simple forward-declaration of
> struct scsi_transport_template should do it.
> 

Ok, makes sense.

James, please apply:


Make transport-functions structure non-static.  Replace #include of
scsi_transport.h with a forward declaration.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

 drivers/scsi/qla2xxx/qla_attr.c |    8 +-------
 drivers/scsi/qla2xxx/qla_gbl.h  |    4 ++--
 drivers/scsi/qla2xxx/qla_os.c   |    3 ++-
 3 files changed, 5 insertions(+), 10 deletions(-)

drivers/scsi/qla2xxx/qla_attr.c: fb67d67bee97823d4d209cdbd9b356a5a2370683
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -300,7 +300,7 @@ qla2x00_set_rport_loss_tmo(struct fc_rpo
 	rport->dev_loss_tmo = ha->port_down_retry_count + 5;
 }
 
-static struct fc_function_template qla2xxx_transport_functions = {
+struct fc_function_template qla2xxx_transport_functions = {
 
 	.show_host_node_name = 1,
 	.show_host_port_name = 1,
@@ -322,12 +322,6 @@ static struct fc_function_template qla2x
 
 };
 
-struct scsi_transport_template *
-qla2x00_alloc_transport_tmpl(void)
-{
-	return (fc_attach_transport(&qla2xxx_transport_functions));
-}
-
 void
 qla2x00_init_host_attr(scsi_qla_host_t *ha)
 {
drivers/scsi/qla2xxx/qla_gbl.h: e49d05b0167879a042b09941c240274530784c65
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -24,7 +24,6 @@
 #define	__QLA_GBL_H
 
 #include <linux/interrupt.h>
-#include <scsi/scsi_transport.h>
 
 extern void qla2x00_remove_one(struct pci_dev *);
 extern int qla2x00_probe_one(struct pci_dev *, struct qla_board_info *);
@@ -248,9 +247,10 @@ extern void qla2x00_cancel_io_descriptor
 /*
  * Global Function Prototypes in qla_attr.c source file.
  */
+struct fc_function_template;
+extern struct fc_function_template qla2xxx_transport_functions;
 extern void qla2x00_alloc_sysfs_attr(scsi_qla_host_t *);
 extern void qla2x00_free_sysfs_attr(scsi_qla_host_t *);
-extern struct scsi_transport_template *qla2x00_alloc_transport_tmpl(void);
 extern void qla2x00_init_host_attr(scsi_qla_host_t *);
 extern void qla2x00_alloc_sysfs_attr(scsi_qla_host_t *);
 extern void qla2x00_free_sysfs_attr(scsi_qla_host_t *);
drivers/scsi/qla2xxx/qla_os.c: f949c701ec022d6db1791df0e55ce3e534359a1c
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -2350,7 +2350,8 @@ qla2x00_module_init(void)
 #if DEBUG_QLA2100
 	strcat(qla2x00_version_str, "-debug");
 #endif
-	qla2xxx_transport_template = qla2x00_alloc_transport_tmpl();
+	qla2xxx_transport_template =
+	    fc_attach_transport(&qla2xxx_transport_functions);
 	if (!qla2xxx_transport_template)
 		return -ENODEV;
 

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [2/5]  qla2xxx: add remote port codes...
  2005-04-13 21:40   ` Christoph Hellwig
  2005-04-19  6:33     ` Andrew Vasquez
@ 2005-04-19  7:27     ` Andrew Vasquez
  2005-04-19 21:13       ` Christoph Hellwig
  2005-05-20  6:17       ` Jeremy Higdon
  1 sibling, 2 replies; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-19  7:27 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Linux-SCSI Mailing List, James Bottomley

On Wed, 13 Apr 2005, Christoph Hellwig wrote:

> >  	atomic_set(&fcport->state, FCS_ONLINE);
> > +	if (ha->flags.init_done)
> > +		qla2x00_reg_remote_port(ha, fcport);
> >  }
> 
> ...
> 
> > -		goto probe_failed;
> > +		goto probe_alloc_failed;
> >  	}
> >  
> > +	pci_set_drvdata(pdev, ha);
> > +	host->this_id = 255;
> > +	host->cmd_per_lun = 3;
> > +	host->unique_id = ha->instance;
> > +	host->max_cmd_len = MAX_CMDSZ;
> > +	host->max_channel = ha->ports - 1;
> > +	host->max_id = ha->max_targets;
> > +	host->max_lun = ha->max_luns;
> > +	host->transportt = qla2xxx_transport_template;
> > +	if (scsi_add_host(host, &pdev->dev))
> > +		goto probe_alloc_failed;
> > +
> > +	qla2x00_alloc_sysfs_attr(ha);
> > +
> >  	if (qla2x00_initialize_adapter(ha) &&
> >  	    !(ha->device_flags & DFLG_NO_CABLE)) {
> 
> Now this I don't undersant.  You're moving the host registration earlier,
> maybe too earlier but I haven't checked that yet,
>

Yeah, that hunk is a residual of some other (trashy) changes I made
during early fc_rport integration and really should be reverted back
to the original...

> why do you still need
> the special case for delaying registration of the targets?
> 

Ok, this is actually a concern I have with the current fc_rport
implementation (and yes, I realize I'm a day late) -- the auto-scan
logic employed during the creation of the fc_rport (via
fc_remote_port_add()).

Before I get into that though, let me answer your question -- the
reason I post-register the ports is because the driver is not ready
(during init-time) to process I/O originating from queuecommand().

This topic was discussed briefly during the implementation of
fc_rport -- some suggestions, if I recall correctly, were to either
block the host or post-register the rport at an appropriate time.
Each options has its caveats -- issuing and fc_remote_port_add() while
the host is blocked of course forces the user to perform a manual
rescan at some later time.  Post-registration on the otherhand still
requires some 'external' port structure (fc_port in the case of
qla2xxx) to exist until fc_rport creation and thus negating the
benefits and purpose of fc_rport->dd_data.  And again, since scanning
occurs immediately for 'target-type' (roles) fc_rports, the
fc_rport->dd_data which one would like to use at slave_alloc() time is
unset (NULL).

Perhaps I'm missing something fundamental -- as I've glanced through
lpfc and see slave_alloc() doing linear scans through its known lists
of ports trying to determine the proper lpfc_nodelist, whereas a:

	rport = fc_remote_port_add() -- would create and fc_rport
					given the rport_identifiers.

	rport->dd_data = <internal port data> -- caller populates
						 rport->dd_data with
						 internal driver
						 structure  (i.e. fc_port)

	fc_remote_port_scan(rport) -- initiate scan.

	  qla2xxx_slave_alloc() implementation would be something like:

		struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
		fc_port_t *fcport;

		if (!rport)
			return -ENXIO;
		fcport = (struct fc_port *) rport->dd_data;
		if (!fcport)
			return -ENXIO;
		...

One possibility (as to not break current functionality) is to add an
addition role modifier, say FC_RPORT_ROLE_NO_SCAN and | it into
rport_ids.roles prior to fc_remote_port_add() to indicate no scanning
should take place during the call.  Then once ready, the driver could
issue the corresponding fc_remote_port_scan() on the rport.

Looking ahead, this may also be useful in the case of port
authentication (i.e. FC-SP).

Does this sound like a reasonable extension?  I'll code up something
in the morning if others are interested?

> Also please propagate the full error that scsi_add_host returned.
> 

Sure, I post another set of patches to address this and the early
host-addition code.

Thanks,
AV

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [2/5]  qla2xxx: add remote port codes...
  2005-04-19  7:27     ` Andrew Vasquez
@ 2005-04-19 21:13       ` Christoph Hellwig
  2005-05-20  6:17       ` Jeremy Higdon
  1 sibling, 0 replies; 25+ messages in thread
From: Christoph Hellwig @ 2005-04-19 21:13 UTC (permalink / raw)
  To: andrew.vasquez; +Cc: James.Smart, Linux-SCSI Mailing List, James Bottomley

On Tue, Apr 19, 2005 at 12:27:51AM -0700, Andrew Vasquez wrote:
> > why do you still need
> > the special case for delaying registration of the targets?
> > 
> 
> Ok, this is actually a concern I have with the current fc_rport
> implementation (and yes, I realize I'm a day late) -- the auto-scan
> logic employed during the creation of the fc_rport (via
> fc_remote_port_add()).

Well, we haven't set the inkernel APIs in stone.  And compared to
say the general scsi or networking APIs there's also only very little
drivers to update in case we still want to change it.

> One possibility (as to not break current functionality) is to add an
> addition role modifier, say FC_RPORT_ROLE_NO_SCAN and | it into
> rport_ids.roles prior to fc_remote_port_add() to indicate no scanning
> should take place during the call.  Then once ready, the driver could
> issue the corresponding fc_remote_port_scan() on the rport.

I'd rather keep that in the transport class as much as possible. What
about defererring the scanning if the host is still in SHOST_ADD state
and add a fc_host_scan call that the driver calls just after scsi_host_add
to scan those?  This would also solve a similar issue about registration
time in lpfc.

> Looking ahead, this may also be useful in the case of port
> authentication (i.e. FC-SP).

Just started reading up about it.  Are there any real-life implementations
of FC-SP available?



^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [6/5]  qla2xxx: update version :)
  2005-04-13 21:24     ` Andrew Vasquez
@ 2005-04-19 21:15       ` Christoph Hellwig
  2005-04-22  7:22         ` Andrew Vasquez
  0 siblings, 1 reply; 25+ messages in thread
From: Christoph Hellwig @ 2005-04-19 21:15 UTC (permalink / raw)
  To: James Bottomley, Linux-SCSI Mailing List, Patrick Mansfield

On Wed, Apr 13, 2005 at 02:24:36PM -0700, Andrew Vasquez wrote:
> Ok, here's the deal -- QLogic's standard 8.01.00 driver contains the
> following major additions:
> 
> * support for 4Gb ISPs
> * FCIP support

Btw, any plans to do proper FCIP support integrated with the transport
class code?  (and finally fixing the damn NAA bug violating RFC 2625 ;-))

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [6/5]  qla2xxx: update version :)
  2005-04-19 21:15       ` Christoph Hellwig
@ 2005-04-22  7:22         ` Andrew Vasquez
  2005-04-24 10:53           ` Christoph Hellwig
  0 siblings, 1 reply; 25+ messages in thread
From: Andrew Vasquez @ 2005-04-22  7:22 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: James Bottomley, Linux-SCSI Mailing List

On Tue, 19 Apr 2005, Christoph Hellwig wrote:

> On Wed, Apr 13, 2005 at 02:24:36PM -0700, Andrew Vasquez wrote:
> > Ok, here's the deal -- QLogic's standard 8.01.00 driver contains the
> > following major additions:
> > 
> > * support for 4Gb ISPs
> > * FCIP support
> 
> Btw, any plans to do proper FCIP support integrated with the transport
> class code?
>

Ok, I'll bite (since this is the second time I've heard about FCIP
being 'integrated' with the transport classes) -- what did you have in
mind?  There's already a clear set of mature networking interface with
which a networking card's driver uses to interface with the stack.

Are you looking to generalize those interfaces
(open/hard_xmit/stop/etc.) into helpers transport helpers?

>
> (and finally fixing the damn NAA bug violating RFC 2625 ;-))
> -

Yes, I'll see what I can do from this side on getting this addressed
once and for all.

--
av

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [6/5]  qla2xxx: update version :)
  2005-04-22  7:22         ` Andrew Vasquez
@ 2005-04-24 10:53           ` Christoph Hellwig
  0 siblings, 0 replies; 25+ messages in thread
From: Christoph Hellwig @ 2005-04-24 10:53 UTC (permalink / raw)
  To: James Bottomley, Linux-SCSI Mailing List

On Fri, Apr 22, 2005 at 12:22:00AM -0700, Andrew Vasquez wrote:
> > Btw, any plans to do proper FCIP support integrated with the transport
> > class code?
> >
> 
> Ok, I'll bite (since this is the second time I've heard about FCIP
> being 'integrated' with the transport classes) -- what did you have in
> mind?  There's already a clear set of mature networking interface with
> which a networking card's driver uses to interface with the stack.
> 
> Are you looking to generalize those interfaces
> (open/hard_xmit/stop/etc.) into helpers transport helpers?

First we have a little bit of FC networking common code that's unfortunately
not used a lot in net/802/fc.c.  Some of may need a little updating as it's
been without love for more than five years.  Note that this means the
network device is presented as native fibre channel devices and not like
a fake ethernet device as in the current Qlogic IP driver.  Not faking
ethernet also makes the send and receive code quite a bit simpler.

Putting ->open/->stop into common code doesn't make a lot of sense as
there's very little non-trivial things in there besides poking the hardware.
Of the net_device methods only the noop stubs should go into common code
(net/802/fc.c).

Other candidates for common code are things like qla2x00_convert_to_arp and
qla2x00_get_ip_loopid.  In general I'd prefer the actual FC over IP drivers
to not have to poke into higherlevel (SNAP, ARP, IP) protocol headers at
all, or having to iterate over fc remote port structures themselves.

Actual transport class integration is very little.  First a proper interface
for the IP over FC driver to get called back on IP remote ports instead of
various odd hand crafted methods, second a link in sysfs from the FC remote
to the netdevice to make managment easier.  Also some of the ethtool methods
could probably be implemented ontop of the information we already have in
the transport class.

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [2/5]  qla2xxx: add remote port codes...
  2005-04-19  7:27     ` Andrew Vasquez
  2005-04-19 21:13       ` Christoph Hellwig
@ 2005-05-20  6:17       ` Jeremy Higdon
  2005-05-20 15:15         ` Andrew Vasquez
  1 sibling, 1 reply; 25+ messages in thread
From: Jeremy Higdon @ 2005-05-20  6:17 UTC (permalink / raw)
  To: andrew.vasquez, Linux-SCSI Mailing List

On Tue, Apr 19, 2005 at 12:27:51AM -0700, Andrew Vasquez wrote:
> On Wed, 13 Apr 2005, Christoph Hellwig wrote:
> 
> > >  	atomic_set(&fcport->state, FCS_ONLINE);
> > > +	if (ha->flags.init_done)
> > > +		qla2x00_reg_remote_port(ha, fcport);
> > >  }
> > 
> > ...
> > 
> > > -		goto probe_failed;
> > > +		goto probe_alloc_failed;
> > >  	}
> > >  
> > > +	pci_set_drvdata(pdev, ha);
> > > +	host->this_id = 255;
> > > +	host->cmd_per_lun = 3;
> > > +	host->unique_id = ha->instance;
> > > +	host->max_cmd_len = MAX_CMDSZ;
> > > +	host->max_channel = ha->ports - 1;
> > > +	host->max_id = ha->max_targets;
> > > +	host->max_lun = ha->max_luns;
> > > +	host->transportt = qla2xxx_transport_template;
> > > +	if (scsi_add_host(host, &pdev->dev))
> > > +		goto probe_alloc_failed;
> > > +
> > > +	qla2x00_alloc_sysfs_attr(ha);
> > > +
> > >  	if (qla2x00_initialize_adapter(ha) &&
> > >  	    !(ha->device_flags & DFLG_NO_CABLE)) {
> > 
> > Now this I don't undersant.  You're moving the host registration earlier,
> > maybe too earlier but I haven't checked that yet,
> >
> 
> Yeah, that hunk is a residual of some other (trashy) changes I made
> during early fc_rport integration and really should be reverted back
> to the original...

In fact, it seems to break probing for luns other than zero.

You initialize ha->max_luns in qla2x00_nvram_config(), which is called form
qla2x00_initialize_adapter().  So we're currently seeing messages like
this during ISP2312 initialization:

<4>scsi: host 1 channel 0 id 0 lun1 has a LUN larger than allowed by the host adapter
<4>scsi: host 1 channel 0 id 0 lun2 has a LUN larger than allowed by the host adapter
<4>scsi: host 1 channel 0 id 0 lun3 has a LUN larger than allowed by the host adapter
<4>scsi: host 1 channel 0 id 0 lun4 has a LUN larger than allowed by the host adapter
<4>scsi: host 1 channel 0 id 0 lun5 has a LUN larger than allowed by the host adapter
<4>scsi: host 1 channel 0 id 0 lun6 has a LUN larger than allowed by the host adapter
<4>scsi: host 1 channel 0 id 0 lun7 has a LUN larger than allowed by the host adapter
<4>scsi: host 1 channel 0 id 0 lun8 has a LUN larger than allowed by the host adapter
<4>scsi: host 1 channel 0 id 0 lun9 has a LUN larger than allowed by the host adapter

jeremy

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [2/5]  qla2xxx: add remote port codes...
  2005-05-20  6:17       ` Jeremy Higdon
@ 2005-05-20 15:15         ` Andrew Vasquez
  2005-05-27  7:51           ` Jeremy Higdon
  0 siblings, 1 reply; 25+ messages in thread
From: Andrew Vasquez @ 2005-05-20 15:15 UTC (permalink / raw)
  To: Jeremy Higdon; +Cc: Linux-SCSI Mailing List, James Bottomley

On Thu, 19 May 2005, Jeremy Higdon wrote:

> On Tue, Apr 19, 2005 at 12:27:51AM -0700, Andrew Vasquez wrote:
> > On Wed, 13 Apr 2005, Christoph Hellwig wrote:
> > 
> > > >  	atomic_set(&fcport->state, FCS_ONLINE);
> > > > +	if (ha->flags.init_done)
> > > > +		qla2x00_reg_remote_port(ha, fcport);
> > > >  }
> > > 
> > > ...
> > > 
> > > > -		goto probe_failed;
> > > > +		goto probe_alloc_failed;
> > > >  	}
> > > >  
> > > > +	pci_set_drvdata(pdev, ha);
> > > > +	host->this_id = 255;
> > > > +	host->cmd_per_lun = 3;
> > > > +	host->unique_id = ha->instance;
> > > > +	host->max_cmd_len = MAX_CMDSZ;
> > > > +	host->max_channel = ha->ports - 1;
> > > > +	host->max_id = ha->max_targets;
> > > > +	host->max_lun = ha->max_luns;
> > > > +	host->transportt = qla2xxx_transport_template;
> > > > +	if (scsi_add_host(host, &pdev->dev))
> > > > +		goto probe_alloc_failed;
> > > > +
> > > > +	qla2x00_alloc_sysfs_attr(ha);
> > > > +
> > > >  	if (qla2x00_initialize_adapter(ha) &&
> > > >  	    !(ha->device_flags & DFLG_NO_CABLE)) {
> > > 
> > > Now this I don't undersant.  You're moving the host registration earlier,
> > > maybe too earlier but I haven't checked that yet,
> > >
> > 
> > Yeah, that hunk is a residual of some other (trashy) changes I made
> > during early fc_rport integration and really should be reverted back
> > to the original...
> 
> In fact, it seems to break probing for luns other than zero.
> 
> You initialize ha->max_luns in qla2x00_nvram_config(), which is called form
> qla2x00_initialize_adapter().  So we're currently seeing messages like
> this during ISP2312 initialization:
> 
> <4>scsi: host 1 channel 0 id 0 lun1 has a LUN larger than allowed by the host adapter

Jeremy, could you try this patch out.

James, please apply.


[PATCH] Pull-down scsi-host-addition to follow board initialization.

Return to previous held-logic of calling scsi_add_host() only after
the board has been completely initialized.  Also return pci_*()
error-codes during probe failure paths.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

drivers/scsi/qla2xxx/qla_os.c: 7f8d747bd5e546e3b753ce06e3568f32d0a0ec07
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -1106,7 +1106,7 @@ iospace_error_exit:
  */
 int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
 {
-	int	ret;
+	int	ret = -ENODEV;
 	device_reg_t __iomem *reg;
 	struct Scsi_Host *host;
 	scsi_qla_host_t *ha;
@@ -1117,7 +1117,7 @@ int qla2x00_probe_one(struct pci_dev *pd
 	fc_port_t *fcport;
 
 	if (pci_enable_device(pdev))
-		return -1;
+		goto probe_out;
 
 	host = scsi_host_alloc(&qla2x00_driver_template,
 	    sizeof(scsi_qla_host_t));
@@ -1139,9 +1139,8 @@ int qla2x00_probe_one(struct pci_dev *pd
 
 	/* Configure PCI I/O space */
 	ret = qla2x00_iospace_config(ha);
-	if (ret != 0) {
-		goto probe_alloc_failed;
-	}
+	if (ret)
+		goto probe_failed;
 
 	/* Sanitize the information from PCI BIOS. */
 	host->irq = pdev->irq;
@@ -1204,22 +1203,10 @@ int qla2x00_probe_one(struct pci_dev *pd
 		qla_printk(KERN_WARNING, ha,
 		    "[ERROR] Failed to allocate memory for adapter\n");
 
-		goto probe_alloc_failed;
+		ret = -ENOMEM;
+		goto probe_failed;
 	}
 
-	pci_set_drvdata(pdev, ha);
-	host->this_id = 255;
-	host->cmd_per_lun = 3;
-	host->unique_id = ha->instance;
-	host->max_cmd_len = MAX_CMDSZ;
-	host->max_channel = ha->ports - 1;
-	host->max_lun = MAX_LUNS;
-	host->transportt = qla2xxx_transport_template;
-	if (scsi_add_host(host, &pdev->dev))
-		goto probe_alloc_failed;
-
-	qla2x00_alloc_sysfs_attr(ha);
-
 	if (qla2x00_initialize_adapter(ha) &&
 	    !(ha->device_flags & DFLG_NO_CABLE)) {
 
@@ -1230,11 +1217,10 @@ int qla2x00_probe_one(struct pci_dev *pd
 		    "Adapter flags %x.\n",
 		    ha->host_no, ha->device_flags));
 
+		ret = -ENODEV;
 		goto probe_failed;
 	}
 
-	qla2x00_init_host_attr(ha);
-
 	/*
 	 * Startup the kernel thread for this host adapter
 	 */
@@ -1244,17 +1230,26 @@ int qla2x00_probe_one(struct pci_dev *pd
 		qla_printk(KERN_WARNING, ha,
 		    "Unable to start DPC thread!\n");
 
+		ret = -ENODEV;
 		goto probe_failed;
 	}
 	wait_for_completion(&ha->dpc_inited);
 
+	host->this_id = 255;
+	host->cmd_per_lun = 3;
+	host->unique_id = ha->instance;
+	host->max_cmd_len = MAX_CMDSZ;
+	host->max_channel = ha->ports - 1;
+	host->max_lun = MAX_LUNS;
+	host->transportt = qla2xxx_transport_template;
+
 	if (IS_QLA2100(ha) || IS_QLA2200(ha))
 		ret = request_irq(host->irq, qla2100_intr_handler,
 		    SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
 	else
 		ret = request_irq(host->irq, qla2300_intr_handler,
 		    SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
-	if (ret != 0) {
+	if (ret) {
 		qla_printk(KERN_WARNING, ha,
 		    "Failed to reserve interrupt %d already in use.\n",
 		    host->irq);
@@ -1308,9 +1303,18 @@ int qla2x00_probe_one(struct pci_dev *pd
 		msleep(10);
 	}
 
+	pci_set_drvdata(pdev, ha);
 	ha->flags.init_done = 1;
 	num_hosts++;
 
+	ret = scsi_add_host(host, &pdev->dev);
+	if (ret)
+		goto probe_failed;
+
+	qla2x00_alloc_sysfs_attr(ha);
+
+	qla2x00_init_host_attr(ha);
+
 	qla_printk(KERN_INFO, ha, "\n"
 	    " QLogic Fibre Channel HBA Driver: %s\n"
 	    "  QLogic %s - %s\n"
@@ -1329,9 +1333,6 @@ int qla2x00_probe_one(struct pci_dev *pd
 probe_failed:
 	fc_remove_host(ha->host);
 
-	scsi_remove_host(host);
-
-probe_alloc_failed:
 	qla2x00_free_device(ha);
 
 	scsi_host_put(host);
@@ -1339,7 +1340,8 @@ probe_alloc_failed:
 probe_disable_device:
 	pci_disable_device(pdev);
 
-	return -1;
+probe_out:
+	return ret;
 }
 EXPORT_SYMBOL_GPL(qla2x00_probe_one);
 

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: PATCH [2/5]  qla2xxx: add remote port codes...
  2005-05-20 15:15         ` Andrew Vasquez
@ 2005-05-27  7:51           ` Jeremy Higdon
  0 siblings, 0 replies; 25+ messages in thread
From: Jeremy Higdon @ 2005-05-27  7:51 UTC (permalink / raw)
  To: Linux-SCSI Mailing List, James Bottomley

On Fri, May 20, 2005 at 08:15:42AM -0700, Andrew Vasquez wrote:
> On Thu, 19 May 2005, Jeremy Higdon wrote:
> 
> > On Tue, Apr 19, 2005 at 12:27:51AM -0700, Andrew Vasquez wrote:
> > 
> > In fact, it seems to break probing for luns other than zero.
> > 
> > You initialize ha->max_luns in qla2x00_nvram_config(), which is called form
> > qla2x00_initialize_adapter().  So we're currently seeing messages like
> > this during ISP2312 initialization:
> > 
> > <4>scsi: host 1 channel 0 id 0 lun1 has a LUN larger than allowed by the host adapter
> 
> Jeremy, could you try this patch out.
> 
> James, please apply.
> 
> 
> [PATCH] Pull-down scsi-host-addition to follow board initialization.
> 
> Return to previous held-logic of calling scsi_add_host() only after
> the board has been completely initialized.  Also return pci_*()
> error-codes during probe failure paths.


Thanks Andrew,

This patch took care of the problem.

jeremy

^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2005-05-27  7:51 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-04-13 19:15 PATCH [0/5] qla2xxx: remote port rework Andrew Vasquez
2005-04-13 19:18 ` PATCH [1/5] qla2xxx: remove internal queuing Andrew Vasquez
2005-04-13 19:18 ` PATCH [2/5] qla2xxx: add remote port codes Andrew Vasquez
2005-04-13 21:40   ` Christoph Hellwig
2005-04-19  6:33     ` Andrew Vasquez
2005-04-19  7:27     ` Andrew Vasquez
2005-04-19 21:13       ` Christoph Hellwig
2005-05-20  6:17       ` Jeremy Higdon
2005-05-20 15:15         ` Andrew Vasquez
2005-05-27  7:51           ` Jeremy Higdon
2005-04-17 15:18   ` James Bottomley
2005-04-13 19:18 ` PATCH [3/5] qla2xxx: remove lun discovery codes Andrew Vasquez
2005-04-13 19:19 ` PATCH [4/5] qla2xxx: cleanup DMA mappings Andrew Vasquez
2005-04-13 21:34   ` Christoph Hellwig
2005-04-15 18:06     ` Andrew Vasquez
2005-04-13 19:19 ` PATCH [5/5] qla2xxx: remove /proc interface Andrew Vasquez
2005-04-13 19:42 ` PATCH [0/5] qla2xxx: remote port rework Matthew Wilcox
2005-04-13 20:50 ` PATCH [6/5] qla2xxx: update version :) Andrew Vasquez
2005-04-13 20:57   ` James Bottomley
2005-04-13 21:24     ` Andrew Vasquez
2005-04-19 21:15       ` Christoph Hellwig
2005-04-22  7:22         ` Andrew Vasquez
2005-04-24 10:53           ` Christoph Hellwig
2005-04-13 21:17   ` Christoph Hellwig
2005-04-15 17:38     ` Andrew Vasquez

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.