Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b05a1f0 authored by Marcus Barrow's avatar Marcus Barrow Committed by James Bottomley
Browse files

[SCSI] qla2xxx: Use completion routines.



Instead of abusing the semaphore interfaces for mailbox command
completions.

Additional cleanups and
Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent a4722cf2
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2413,9 +2413,9 @@ typedef struct scsi_qla_host {
#define MBX_INTR_WAIT	2
#define MBX_UPDATE_FLASH_ACTIVE	3

	struct semaphore mbx_cmd_sem;	/* Serialialize mbx access */
	struct semaphore vport_sem;	/* Virtual port synchronization */
	struct semaphore mbx_intr_sem;  /* Used for completion notification */
	struct completion mbx_cmd_comp;	/* Serialize mbx access */
	struct completion mbx_intr_comp;  /* Used for completion notification */

	uint32_t	mbx_flags;
#define  MBX_IN_PROGRESS	BIT_0
+0 −2
Original line number Diff line number Diff line
@@ -105,8 +105,6 @@ extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *);
extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int);
extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *, int);

extern int qla2x00_down_timeout(struct semaphore *, unsigned long);

extern struct fw_blob *qla2x00_request_firmware(scsi_qla_host_t *);

extern int qla2x00_wait_for_hba_online(scsi_qla_host_t *);
+4 −4
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ qla2100_intr_handler(int irq, void *dev_id)
	if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
	    (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
		set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
		up(&ha->mbx_intr_sem);
		complete(&ha->mbx_intr_comp);
	}

	return (IRQ_HANDLED);
@@ -216,7 +216,7 @@ qla2300_intr_handler(int irq, void *dev_id)
	if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
	    (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
		set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
		up(&ha->mbx_intr_sem);
		complete(&ha->mbx_intr_comp);
	}

	return (IRQ_HANDLED);
@@ -1597,7 +1597,7 @@ qla24xx_intr_handler(int irq, void *dev_id)
	if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
	    (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
		set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
		up(&ha->mbx_intr_sem);
		complete(&ha->mbx_intr_comp);
	}

	return IRQ_HANDLED;
@@ -1734,7 +1734,7 @@ qla24xx_msix_default(int irq, void *dev_id)
	if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
	    (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
		set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
		up(&ha->mbx_intr_sem);
		complete(&ha->mbx_intr_comp);
	}

	return IRQ_HANDLED;
+4 −40
Original line number Diff line number Diff line
@@ -8,19 +8,6 @@

#include <linux/delay.h>

static void
qla2x00_mbx_sem_timeout(unsigned long data)
{
	struct semaphore	*sem_ptr = (struct semaphore *)data;

	DEBUG11(printk("qla2x00_sem_timeout: entered.\n"));

	if (sem_ptr != NULL) {
		up(sem_ptr);
	}

	DEBUG11(printk("qla2x00_mbx_sem_timeout: exiting.\n"));
}

/*
 * qla2x00_mailbox_command
@@ -47,7 +34,6 @@ qla2x00_mailbox_command(scsi_qla_host_t *pvha, mbx_cmd_t *mcp)
	int		rval;
	unsigned long    flags = 0;
	device_reg_t __iomem *reg;
	struct timer_list	tmp_intr_timer;
	uint8_t		abort_active;
	uint8_t		io_lock_on;
	uint16_t	command;
@@ -72,7 +58,8 @@ qla2x00_mailbox_command(scsi_qla_host_t *pvha, mbx_cmd_t *mcp)
	 * non ISP abort time.
	 */
	if (!abort_active) {
		if (qla2x00_down_timeout(&ha->mbx_cmd_sem, mcp->tov * HZ)) {
		if (!wait_for_completion_timeout(&ha->mbx_cmd_comp,
		    mcp->tov * HZ)) {
			/* Timeout occurred. Return error. */
			DEBUG2_3_11(printk("%s(%ld): cmd access timeout. "
			    "Exiting.\n", __func__, ha->host_no));
@@ -135,22 +122,6 @@ qla2x00_mailbox_command(scsi_qla_host_t *pvha, mbx_cmd_t *mcp)
	/* Wait for mbx cmd completion until timeout */

	if (!abort_active && io_lock_on) {
		/* sleep on completion semaphore */
		DEBUG11(printk("%s(%ld): INTERRUPT MODE. Initializing timer.\n",
		    __func__, ha->host_no));

		init_timer(&tmp_intr_timer);
		tmp_intr_timer.data = (unsigned long)&ha->mbx_intr_sem;
		tmp_intr_timer.expires = jiffies + mcp->tov * HZ;
		tmp_intr_timer.function =
		    (void (*)(unsigned long))qla2x00_mbx_sem_timeout;

		DEBUG11(printk("%s(%ld): Adding timer.\n", __func__,
		    ha->host_no));
		add_timer(&tmp_intr_timer);

		DEBUG11(printk("%s(%ld): going to unlock & sleep. "
		    "time=0x%lx.\n", __func__, ha->host_no, jiffies));

		set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);

@@ -160,17 +131,10 @@ qla2x00_mailbox_command(scsi_qla_host_t *pvha, mbx_cmd_t *mcp)
			WRT_REG_WORD(&reg->isp.hccr, HCCR_SET_HOST_INT);
		spin_unlock_irqrestore(&ha->hardware_lock, flags);

		/* Wait for either the timer to expire
		 * or the mbox completion interrupt
		 */
		down(&ha->mbx_intr_sem);
		wait_for_completion_timeout(&ha->mbx_intr_comp, mcp->tov * HZ);

		DEBUG11(printk("%s(%ld): waking up. time=0x%lx\n", __func__,
		    ha->host_no, jiffies));
		clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);

		/* delete the timer */
		del_timer(&tmp_intr_timer);
	} else {
		DEBUG3_11(printk("%s(%ld): cmd=%x POLLING MODE.\n", __func__,
		    ha->host_no, command));
@@ -299,7 +263,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *pvha, mbx_cmd_t *mcp)

	/* Allow next mbx cmd to come in. */
	if (!abort_active)
		up(&ha->mbx_cmd_sem);
		complete(&ha->mbx_cmd_comp);

	if (rval) {
		DEBUG2_3_11(printk("%s(%ld): **** FAILED. mbx0=%x, mbx1=%x, "
+3 −2
Original line number Diff line number Diff line
@@ -403,8 +403,9 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
	}
	vha->mgmt_svr_loop_id = 10 + vha->vp_idx;

	init_MUTEX(&vha->mbx_cmd_sem);
	init_MUTEX_LOCKED(&vha->mbx_intr_sem);
	init_completion(&vha->mbx_cmd_comp);
	complete(&vha->mbx_cmd_comp);
	init_completion(&vha->mbx_intr_comp);

	INIT_LIST_HEAD(&vha->list);
	INIT_LIST_HEAD(&vha->fcports);
Loading