RE: [PATCH 2.4.31 1/1] scsi/megaraid2: add 64-bit application sup port

From: Ju, Seokmann (sju_at_lsil.com)
Date: 08/02/05

  • Next message: Dmitry Torokhov: "Re: Touchpad errors"
    To: "'Marcelo Tosatti'" <marcelo.tosatti@cyclades.com>
    Date:	Tue, 2 Aug 2005 16:29:04 -0400 
    
    
    

    Hi Marcelo,

    I've made changes that reflect your comments.

    On Tuesday, July 26, 2005 4:33 AM, Marcelo Tosatti wrote:
    > vary_io has never been part of mainline. How come did you add it
    > here?
    Has removed '.vary_io'.
    > There is no CONFIG_COMPAT on v2.4... thanks James and Christoph
    > for reviewing.
    Has removed 'CONFIG_COMPAT'.

    Thank you.

    Signed-off-by: Seokmann Ju <seokmann.ju@lsil.com>

    ---
    diff -Naur old/drivers/scsi/megaraid2.c new/drivers/scsi/megaraid2.c
    --- old/drivers/scsi/megaraid2.c	2005-07-15 07:52:27.000000000 -0400
    +++ new/drivers/scsi/megaraid2.c	2005-07-15 07:52:18.000000000 -0400
    @@ -14,7 +14,7 @@
      *	  - speed-ups (list handling fixes, issued_list, optimizations.)
      *	  - lots of cleanups.
      *
    - * Version : v2.10.8.2 (July 26, 2004)
    + * Version : v2.10.10.1 (January 27, 2005)
      *
      * Authors:	Atul Mukker <Atul.Mukker@lsil.com>
      *		Sreenivas Bagalkote <Sreenivas.Bagalkote@lsil.com>
    @@ -46,7 +46,7 @@
     
     #include "megaraid2.h"
     
    -#if defined(__x86_64__)
    +#ifdef LSI_CONFIG_COMPAT
     #include <asm/ioctl32.h>
     #endif
     
    @@ -233,7 +233,7 @@
     				"MegaRAID Shutdown routine not
    registered!!\n");
     		}
     
    -#if defined(__x86_64__)
    +#ifdef LSI_CONFIG_COMPAT
     		/*
     		 * Register the 32-bit ioctl conversion
     		 */
    @@ -341,6 +341,7 @@
     				(subsysvid != INTEL_SUBSYS_VID) &&
     				(subsysvid != FSC_SUBSYS_VID) &&
     				(subsysvid != ACER_SUBSYS_VID) &&
    +				(subsysvid != NEC_SUBSYS_VID) &&
     				(subsysvid != LSI_SUBSYS_VID) ) continue;
     
     
    @@ -989,268 +990,6 @@
     }
     
     
    -/**
    - * issue_scb()
    - * @adapter - pointer to our soft state
    - * @scb - scsi control block
    - *
    - * Post a command to the card if the mailbox is available, otherwise return
    - * busy. We also take the scb from the pending list if the mailbox is
    - * available.
    - */
    -static inline int
    -issue_scb(adapter_t *adapter, scb_t *scb)
    -{
    -	volatile mbox64_t	*mbox64 = adapter->mbox64;
    -	volatile mbox_t		*mbox = adapter->mbox;
    -	unsigned int	i = 0;
    -
    -	if(unlikely(mbox->busy)) {
    -		do {
    -			udelay(1);
    -			i++;
    -		} while( mbox->busy && (i < max_mbox_busy_wait) );
    -
    -		if(mbox->busy) return -1;
    -	}
    -
    -	/* Copy mailbox data into host structure */
    -	memcpy((char *)mbox, (char *)scb->raw_mbox, 16);
    -
    -	mbox->cmdid = scb->idx;	/* Set cmdid */
    -	mbox->busy = 1;		/* Set busy */
    -
    -
    -	/*
    -	 * Increment the pending queue counter
    -	 */
    -	atomic_inc(&adapter->pend_cmds);
    -
    -	switch (mbox->cmd) {
    -	case MEGA_MBOXCMD_EXTPTHRU:
    -		if( !adapter->has_64bit_addr ) break;
    -		// else fall through
    -	case MEGA_MBOXCMD_LREAD64:
    -	case MEGA_MBOXCMD_LWRITE64:
    -	case MEGA_MBOXCMD_PASSTHRU64:
    -		mbox64->xfer_segment_lo = mbox->xferaddr;
    -		mbox64->xfer_segment_hi = 0;
    -		mbox->xferaddr = 0xFFFFFFFF;
    -		break;
    -	default:
    -		mbox64->xfer_segment_lo = 0;
    -		mbox64->xfer_segment_hi = 0;
    -	}
    -
    -	/*
    -	 * post the command
    -	 */
    -	scb->state |= SCB_ISSUED;
    -
    -	if( likely(adapter->flag & BOARD_MEMMAP) ) {
    -		mbox->poll = 0;
    -		mbox->ack = 0;
    -		WRINDOOR(adapter, adapter->mbox_dma | 0x1);
    -	}
    -	else {
    -		irq_enable(adapter);
    -		issue_command(adapter);
    -	}
    -
    -	return 0;
    -}
    -
    -
    -/**
    - * mega_runpendq()
    - * @adapter - pointer to our soft state
    - *
    - * Runs through the list of pending requests.
    - */
    -static inline void
    -mega_runpendq(adapter_t *adapter)
    -{
    -	if(!list_empty(&adapter->pending_list))
    -		__mega_runpendq(adapter);
    -}
    -
    -
    -static void
    -__mega_runpendq(adapter_t *adapter)
    -{
    -	scb_t *scb;
    -	struct list_head *pos, *next;
    -
    -	/* Issue any pending commands to the card */
    -	list_for_each_safe(pos, next, &adapter->pending_list) {
    -
    -		scb = list_entry(pos, scb_t, list);
    -
    -		if( !(scb->state & SCB_ISSUED) ) {
    -
    -			if( issue_scb(adapter, scb) != 0 )
    -				return;
    -		}
    -	}
    -
    -	return;
    -}
    -
    -
    -/**
    - * mega_allocate_scb()
    - * @adapter - pointer to our soft state
    - * @cmd - scsi command from the mid-layer
    - *
    - * Allocate a SCB structure. This is the central structure for controller
    - * commands.
    - */
    -static inline scb_t *
    -mega_allocate_scb(adapter_t *adapter, Scsi_Cmnd *cmd)
    -{
    -	struct list_head *head = &adapter->free_list;
    -	scb_t	*scb;
    -
    -	/* Unlink command from Free List */
    -	if( !list_empty(head) ) {
    -
    -		scb = list_entry(head->next, scb_t, list);
    -
    -		list_del_init(head->next);
    -
    -		scb->state = SCB_ACTIVE;
    -		scb->cmd = cmd;
    -		scb->dma_type = MEGA_DMA_TYPE_NONE;
    -
    -		return scb;
    -	}
    -
    -	return NULL;
    -}
    -
    -
    -/**
    - * mega_get_ldrv_num()
    - * @adapter - pointer to our soft state
    - * @cmd - scsi mid layer command
    - * @channel - channel on the controller
    - *
    - * Calculate the logical drive number based on the information in scsi
    command
    - * and the channel number.
    - */
    -static inline int
    -mega_get_ldrv_num(adapter_t *adapter, Scsi_Cmnd *cmd, int channel)
    -{
    -	int		tgt;
    -	int		ldrv_num;
    -
    -	tgt = cmd->target;
    -
    -	if ( tgt > adapter->this_id )
    -		tgt--;	/* we do not get inquires for initiator id */
    -
    -	ldrv_num = (channel * 15) + tgt;
    -
    -
    -	/*
    -	 * If we have a logical drive with boot enabled, project it first
    -	 */
    -	if( adapter->boot_ldrv_enabled ) {
    -		if( ldrv_num == 0 ) {
    -			ldrv_num = adapter->boot_ldrv;
    -		}
    -		else {
    -			if( ldrv_num <= adapter->boot_ldrv ) {
    -				ldrv_num--;
    -			}
    -		}
    -	}
    -
    -	/*
    -	 * If "delete logical drive" feature is enabled on this controller,
    -	 * the value returned should be 0x80+logical drive id.
    -	 */
    -	if (adapter->support_random_del)
    -		ldrv_num += 0x80;
    -
    -	return ldrv_num;
    -}
    -
    -/*
    - * Wait until the controller's mailbox is available
    - */
    -static inline int
    -mega_busywait_mbox (adapter_t *adapter)
    -{
    -	if (adapter->mbox->busy)
    -		return __mega_busywait_mbox(adapter);
    -	return 0;
    -}
    -
    -
    -/**
    - * megaraid_iombox_ack_sequence - interrupt ack sequence for IO mapped HBAs
    - * @adapter	- controller's soft state
    - *
    - * Interrupt ackrowledgement sequence for IO mapped HBAs
    - */
    -static inline void
    -megaraid_iombox_ack_sequence(adapter_t *adapter)
    -{
    -	u8	status;
    -	u8	nstatus;
    -	u8	completed[MAX_FIRMWARE_STATUS];
    -	u8	byte;
    -	int	i;
    -
    -
    -	/*
    -	 * loop till F/W has more commands for us to complete.
    -	 */
    -	do {
    -		/* Check if a valid interrupt is pending */
    -		byte = irq_state(adapter);
    -		if( (byte & VALID_INTR_BYTE) == 0 ) {
    -			return;
    -		}
    -		set_irq_state(adapter, byte);
    -
    -		while ((nstatus = adapter->mbox->numstatus) == 0xFF) {
    -			cpu_relax();
    -		}
    -		adapter->mbox->numstatus = 0xFF;
    -
    -		for (i = 0; i < nstatus; i++) {
    -			while ((completed[i] = adapter->mbox->completed[i])
    -					== 0xFF) {
    -				cpu_relax();
    -			}
    -
    -			adapter->mbox->completed[i] = 0xFF;
    -		}
    -
    -		// we must read the valid status now
    -		if ((status = adapter->mbox->status) == 0xFF) {
    -			printk(KERN_WARNING
    -			"megaraid critical: status 0xFF from firmware.\n");
    -		}
    -		adapter->mbox->status = 0xFF;
    -
    -		/*
    -		 * decrement the pending queue counter
    -		 */
    -		atomic_sub(nstatus, &adapter->pend_cmds);
    -
    -		/* Acknowledge interrupt */
    -		irq_ack(adapter);
    -
    -		mega_cmd_done(adapter, completed, nstatus, status);
    -
    -	} while(1);
    -}
    -
    -
    -
     /*
      * megaraid_queue()
      * @scmd - Issue this scsi command
    @@ -1755,8 +1494,8 @@
     	pthru = scb->pthru;
     	memset(pthru, 0, sizeof (mega_passthru));
     
    -	/* 0=6sec/1=60sec/2=10min/3=3hrs */
    -	pthru->timeout = 2;
    +	/* 0=6sec/1=60sec/2=10min/3=3hrs/4=NO timeout */
    +	pthru->timeout = 4;
     
     	pthru->ars = 1;
     	pthru->reqsenselen = 14;
    @@ -1819,8 +1558,8 @@
     	epthru = scb->epthru;
     	memset(epthru, 0, sizeof(mega_ext_passthru));
     
    -	/* 0=6sec/1=60sec/2=10min/3=3hrs */
    -	epthru->timeout = 2;
    +	/* 0=6sec/1=60sec/2=10min/3=3hrs/4=NO timeout */
    +	epthru->timeout = 4;
     
     	epthru->ars = 1;
     	epthru->reqsenselen = 14;
    @@ -1863,6 +1602,145 @@
     
     
     /**
    + * mega_allocate_scb()
    + * @adapter - pointer to our soft state
    + * @cmd - scsi command from the mid-layer
    + *
    + * Allocate a SCB structure. This is the central structure for controller
    + * commands.
    + */
    +static inline scb_t *
    +mega_allocate_scb(adapter_t *adapter, Scsi_Cmnd *cmd)
    +{
    +	struct list_head *head = &adapter->free_list;
    +	scb_t	*scb;
    +
    +	/* Unlink command from Free List */
    +	if( !list_empty(head) ) {
    +
    +		scb = list_entry(head->next, scb_t, list);
    +
    +		list_del_init(head->next);
    +
    +		scb->state = SCB_ACTIVE;
    +		scb->cmd = cmd;
    +		scb->dma_type = MEGA_DMA_TYPE_NONE;
    +
    +		return scb;
    +	}
    +
    +	return NULL;
    +}
    +
    +
    +/**
    + * mega_runpendq()
    + * @adapter - pointer to our soft state
    + *
    + * Runs through the list of pending requests.
    + */
    +static inline void
    +mega_runpendq(adapter_t *adapter)
    +{
    +	if(!list_empty(&adapter->pending_list))
    +		__mega_runpendq(adapter);
    +}
    +
    +static void
    +__mega_runpendq(adapter_t *adapter)
    +{
    +	scb_t *scb;
    +	struct list_head *pos, *next;
    +
    +	/* Issue any pending commands to the card */
    +	list_for_each_safe(pos, next, &adapter->pending_list) {
    +
    +		scb = list_entry(pos, scb_t, list);
    +
    +		if( !(scb->state & SCB_ISSUED) ) {
    +
    +			if( issue_scb(adapter, scb) != 0 )
    +				return;
    +		}
    +	}
    +
    +	return;
    +}
    +
    +
    +/**
    + * issue_scb()
    + * @adapter - pointer to our soft state
    + * @scb - scsi control block
    + *
    + * Post a command to the card if the mailbox is available, otherwise return
    + * busy. We also take the scb from the pending list if the mailbox is
    + * available.
    + */
    +static inline int
    +issue_scb(adapter_t *adapter, scb_t *scb)
    +{
    +	volatile mbox64_t	*mbox64 = adapter->mbox64;
    +	volatile mbox_t		*mbox = adapter->mbox;
    +	unsigned int	i = 0;
    +
    +	if(unlikely(mbox->busy)) {
    +		do {
    +			udelay(1);
    +			i++;
    +		} while( mbox->busy && (i < max_mbox_busy_wait) );
    +
    +		if(mbox->busy) return -1;
    +	}
    +
    +	/* Copy mailbox data into host structure */
    +	memcpy((char *)mbox, (char *)scb->raw_mbox, 16);
    +
    +	mbox->cmdid = scb->idx;	/* Set cmdid */
    +	mbox->busy = 1;		/* Set busy */
    +
    +
    +	/*
    +	 * Increment the pending queue counter
    +	 */
    +	atomic_inc(&adapter->pend_cmds);
    +
    +	switch (mbox->cmd) {
    +	case MEGA_MBOXCMD_EXTPTHRU:
    +		if( !adapter->has_64bit_addr ) break;
    +		// else fall through
    +	case MEGA_MBOXCMD_LREAD64:
    +	case MEGA_MBOXCMD_LWRITE64:
    +	case MEGA_MBOXCMD_PASSTHRU64:
    +		mbox64->xfer_segment_lo = mbox->xferaddr;
    +		mbox64->xfer_segment_hi = 0;
    +		mbox->xferaddr = 0xFFFFFFFF;
    +		break;
    +	default:
    +		mbox64->xfer_segment_lo = 0;
    +		mbox64->xfer_segment_hi = 0;
    +	}
    +
    +	/*
    +	 * post the command
    +	 */
    +	scb->state |= SCB_ISSUED;
    +
    +	if( likely(adapter->flag & BOARD_MEMMAP) ) {
    +		mbox->poll = 0;
    +		mbox->ack = 0;
    +		WRINDOOR(adapter, adapter->mbox_dma | 0x1);
    +	}
    +	else {
    +		irq_enable(adapter);
    +		issue_command(adapter);
    +	}
    +
    +	return 0;
    +}
    +
    +
    +/**
      * issue_scb_block()
      * @adapter - pointer to our soft state
      * @raw_mbox - the mailbox
    @@ -1979,7 +1857,6 @@
     	adapter_t	*adapter = devp;
     	unsigned long	flags;
     
    -
     	spin_lock_irqsave(adapter->host_lock, flags);
     
     	megaraid_iombox_ack_sequence(adapter);
    @@ -1996,6 +1873,99 @@
     
     
     /**
    + * megaraid_iombox_ack_sequence - interrupt ack sequence for IO mapped HBAs
    + * @adapter	- controller's soft state
    + *
    + * Interrupt ackrowledgement sequence for IO mapped HBAs
    + */
    +static inline void
    +megaraid_iombox_ack_sequence(adapter_t *adapter)
    +{
    +	u8	status;
    +	int	nstatus;
    +	u8	completed[MAX_FIRMWARE_STATUS];
    +	u8	byte;
    +	int	i;
    +
    +
    +	/*
    +	 * loop till F/W has more commands for us to complete.
    +	 */
    +	do {
    +		/* Check if a valid interrupt is pending */
    +		byte = irq_state(adapter);
    +		if( (byte & VALID_INTR_BYTE) == 0 ) {
    +			return;
    +		}
    +		set_irq_state(adapter, byte);
    +
    +		while ((nstatus = adapter->mbox->numstatus) == 0xFF) {
    +			cpu_relax();
    +		}
    +		adapter->mbox->numstatus = 0xFF;
    +
    +		for (i = 0; i < nstatus; i++) {
    +			while ((completed[i] = adapter->mbox->completed[i])
    +					== 0xFF) {
    +				cpu_relax();
    +			}
    +
    +			adapter->mbox->completed[i] = 0xFF;
    +		}
    +
    +		// we must read the valid status now
    +		if ((status = adapter->mbox->status) == 0xFF) {
    +			printk(KERN_WARNING
    +			"megaraid critical: status 0xFF from firmware.\n");
    +		}
    +		adapter->mbox->status = 0xFF;
    +
    +		/*
    +		 * decrement the pending queue counter
    +		 */
    +		atomic_sub(nstatus, &adapter->pend_cmds);
    +
    +		/* Acknowledge interrupt */
    +		irq_ack(adapter);
    +
    +		mega_cmd_done(adapter, completed, nstatus, status);
    +
    +	} while(1);
    +}
    +
    +
    +/**
    + * megaraid_isr_memmapped()
    + * @irq - irq
    + * @devp - pointer to our soft state
    + * @regs - unused
    + *
    + * Interrupt service routine for memory-mapped controllers.
    + * Find out if our device is interrupting. If yes, acknowledge the
    interrupt
    + * and service the completed commands.
    + */
    +static void
    +megaraid_isr_memmapped(int irq, void *devp, struct pt_regs *regs)
    +{
    +	adapter_t	*adapter = devp;
    +	unsigned long	flags;
    +
    +	spin_lock_irqsave(adapter->host_lock, flags);
    +
    +	megaraid_memmbox_ack_sequence(adapter);
    +
    +	/* Loop through any pending requests */
    +	if(atomic_read(&adapter->quiescent) == 0) {
    +		mega_runpendq(adapter);
    +	}
    +
    +	spin_unlock_irqrestore(adapter->host_lock, flags);
    +
    +	return;
    +}
    +
    +
    +/**
      * megaraid_memmbox_ack_sequence - interrupt ack sequence for memory mapped
    HBAs
      * @adapter	- controller's soft state
      *
    @@ -2006,7 +1976,7 @@
     {
     	u8	status;
     	u32	dword = 0;
    -	u8	nstatus;
    +	int	nstatus;
     	u8	completed[MAX_FIRMWARE_STATUS];
     	int	i;
     
    @@ -2063,37 +2033,6 @@
     
     
     /**
    - * megaraid_isr_memmapped()
    - * @irq - irq
    - * @devp - pointer to our soft state
    - * @regs - unused
    - *
    - * Interrupt service routine for memory-mapped controllers.
    - * Find out if our device is interrupting. If yes, acknowledge the
    interrupt
    - * and service the completed commands.
    - */
    -static void
    -megaraid_isr_memmapped(int irq, void *devp, struct pt_regs *regs)
    -{
    -	adapter_t	*adapter = devp;
    -	unsigned long	flags;
    -
    -
    -	spin_lock_irqsave(adapter->host_lock, flags);
    -
    -	megaraid_memmbox_ack_sequence(adapter);
    -
    -	/* Loop through any pending requests */
    -	if(atomic_read(&adapter->quiescent) == 0) {
    -		mega_runpendq(adapter);
    -	}
    -
    -	spin_unlock_irqrestore(adapter->host_lock, flags);
    -
    -	return;
    -}
    -
    -/**
      * mega_cmd_done()
      * @adapter - pointer to our soft state
      * @completed - array of ids of completed commands
    @@ -2102,7 +2041,7 @@
      *
      * Complete the comamnds and call the scsi mid-layer callback hooks.
      */
    -static void
    +static inline void
     mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status)
     {
     	mega_ext_passthru	*epthru = NULL;
    @@ -2404,6 +2343,18 @@
     	list_add(&scb->list, &adapter->free_list);
     }
     
    +
    +/*
    + * Wait until the controller's mailbox is available
    + */
    +static inline int
    +mega_busywait_mbox (adapter_t *adapter)
    +{
    +	if (adapter->mbox->busy)
    +		return __mega_busywait_mbox(adapter);
    +	return 0;
    +}
    +
     static int
     __mega_busywait_mbox (adapter_t *adapter)
     {
    @@ -2434,7 +2385,7 @@
     
     	cmd = scb->cmd;
     
    -	/* return 0 elements if no data transfer */
    +	// return 0 elements if no data transfer
     	if (!cmd->request_buffer || !cmd->request_bufflen)
     		return 0;
     
    @@ -2561,43 +2512,6 @@
     		enquiry3->pdrv_state[i] = inquiry->pdrv_info.pdrv_state[i];
     }
     
    -static inline void
    -mega_free_sgl(adapter_t *adapter)
    -{
    -	scb_t	*scb;
    -	int	i;
    -
    -	for(i = 0; i < adapter->max_cmds; i++) {
    -
    -		scb = &adapter->scb_list[i];
    -
    -		if( scb->sgl64 ) {
    -			pci_free_consistent(adapter->dev,
    -				sizeof(mega_sgl64) * adapter->sglen,
    -				scb->sgl64,
    -				scb->sgl_dma_addr);
    -
    -			scb->sgl64 = NULL;
    -		}
    -
    -		if( scb->pthru ) {
    -			pci_free_consistent(adapter->dev,
    sizeof(mega_passthru),
    -				scb->pthru, scb->pthru_dma_addr);
    -
    -			scb->pthru = NULL;
    -		}
    -
    -		if( scb->epthru ) {
    -			pci_free_consistent(adapter->dev,
    -				sizeof(mega_ext_passthru),
    -				scb->epthru, scb->epthru_dma_addr);
    -
    -			scb->epthru = NULL;
    -		}
    -
    -	}
    -}
    -
     
     /*
      * Release the controller's resources
    @@ -2726,7 +2640,7 @@
     	 */
     	scsi_unregister(host);
     
    -#if defined(__x86_64__)
    +#ifdef LSI_CONFIG_COMPAT
     	unregister_ioctl32_conversion(MEGAIOCCMD);
     #endif
     
    @@ -2735,6 +2649,44 @@
     	return 0;
     }
     
    +static inline void
    +mega_free_sgl(adapter_t *adapter)
    +{
    +	scb_t	*scb;
    +	int	i;
    +
    +	for(i = 0; i < adapter->max_cmds; i++) {
    +
    +		scb = &adapter->scb_list[i];
    +
    +		if( scb->sgl64 ) {
    +			pci_free_consistent(adapter->dev,
    +				sizeof(mega_sgl64) * adapter->sglen,
    +				scb->sgl64,
    +				scb->sgl_dma_addr);
    +
    +			scb->sgl64 = NULL;
    +		}
    +
    +		if( scb->pthru ) {
    +			pci_free_consistent(adapter->dev,
    sizeof(mega_passthru),
    +				scb->pthru, scb->pthru_dma_addr);
    +
    +			scb->pthru = NULL;
    +		}
    +
    +		if( scb->epthru ) {
    +			pci_free_consistent(adapter->dev,
    +				sizeof(mega_ext_passthru),
    +				scb->epthru, scb->epthru_dma_addr);
    +
    +			scb->epthru = NULL;
    +		}
    +
    +	}
    +}
    +
    +
     /*
      * Get information about the card/driver
      */
    @@ -2835,7 +2787,6 @@
     	return SUCCESS;
     }
     
    -
     static int
     megaraid_reset(Scsi_Cmnd *cmd)
     {
    @@ -2903,12 +2854,10 @@
     		/*
     		 * Perform the ack sequence, since interrupts are
    unavailable
     		 */
    -		if( adapter->flag & BOARD_MEMMAP ) {
    +		if (adapter->flag & BOARD_MEMMAP)
     			megaraid_memmbox_ack_sequence(adapter);
    -		}
    -		else {
    +		else
     			megaraid_iombox_ack_sequence(adapter);
    -		}
     
     		spin_unlock(adapter->host_lock);
     
    @@ -2941,7 +2890,6 @@
     	return rval;
     }
     
    -
     #ifdef CONFIG_PROC_FS
     /* Following code handles /proc fs  */
     
    @@ -3200,26 +3148,6 @@
     	return len;
     }
     
    -/**
    - * mega_allocate_inquiry()
    - * @dma_handle - handle returned for dma address
    - * @pdev - handle to pci device
    - *
    - * allocates memory for inquiry structure
    - */
    -static inline caddr_t
    -mega_allocate_inquiry(dma_addr_t *dma_handle, struct pci_dev *pdev)
    -{
    -	return pci_alloc_consistent(pdev, sizeof(mega_inquiry3),
    dma_handle);
    -}
    -
    -
    -static inline void
    -mega_free_inquiry(caddr_t inquiry, dma_addr_t dma_handle, struct pci_dev
    *pdev)
    -{
    -	pci_free_consistent(pdev, sizeof(mega_inquiry3), inquiry,
    dma_handle);
    -}
    -
     
     /**
      * proc_rebuild_rate()
    @@ -4172,7 +4100,7 @@
     }
     
     
    -#if defined(__x86_64__)
    +#ifdef LSI_CONFIG_COMPAT
     static int
     megadev_compat_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg,
     		struct file *filep)
    @@ -4221,7 +4149,7 @@
     	megacmd_t	mc;
     	megastat_t	*ustats;
     	int		num_ldrv;
    -	u32		uxferaddr = 0;
    +	caddr_t		uxferaddr=NULL;
     	struct pci_dev	*pdev;
     
     	ustats = NULL; /* avoid compilation warnings */
    @@ -4251,13 +4179,13 @@
     	switch( uioc.opcode ) {
     
     	case GET_DRIVER_VER:
    -		if( put_user(driver_ver, (u32 *)uioc.uioc_uaddr) )
    +		if( put_user(driver_ver, (u32 *)uioc.u_dataaddr) )
     			return (-EFAULT);
     
     		break;
     
     	case GET_N_ADAP:
    -		if( put_user(hba_count, (u32 *)uioc.uioc_uaddr) )
    +		if( put_user(hba_count, (u32 *)uioc.u_dataaddr) )
     			return (-EFAULT);
     
     		/*
    @@ -4275,7 +4203,7 @@
     		if( (adapno = GETADAP(uioc.adapno)) >= hba_count )
     			return (-ENODEV);
     
    -		if( copy_to_user(uioc.uioc_uaddr, mcontroller+adapno,
    +		if( copy_to_user(uioc.u_dataaddr, mcontroller+adapno,
     				sizeof(struct mcontroller)) )
     			return (-EFAULT);
     		break;
    @@ -4291,7 +4219,7 @@
     
     		adapter = hba_soft_state[adapno];
     
    -		ustats = (megastat_t *)uioc.uioc_uaddr;
    +		ustats = (megastat_t *)uioc.u_dataaddr;
     
     		if( copy_from_user(&num_ldrv, &ustats->num_ldrv,
    sizeof(int)) )
     			return (-EFAULT);
    @@ -4333,7 +4261,7 @@
     		/*
     		 * Which adapter
     		 */
    -		if( (adapno = GETADAP(uioc.adapno)) >= hba_count ) 
    +		if( (adapno = GETADAP(uioc.adapno)) >= hba_count )
     			return (-ENODEV);
     
     		adapter = hba_soft_state[adapno];
    @@ -4342,37 +4270,37 @@
     		 * Deletion of logical drive is a special case. The adapter
     		 * should be quiescent before this command is issued.
     		 */
    -		if( uioc.uioc_rmbox[0] == FC_DEL_LOGDRV &&
    -				uioc.uioc_rmbox[2] == OP_DEL_LOGDRV ) {
    +		if( RMBOX(uioc)[0] == FC_DEL_LOGDRV ) {
    +			if ( RMBOX(uioc)[2] == OP_DEL_LOGDRV ) {
    +				/*
    +				 * Do we support this feature
    +				 */
    +				if( !adapter->support_random_del ) {
    +					printk(KERN_WARNING "megaraid:
    logdrv ");
    +					printk("delete on non-supporting
    F/W.\n");
     
    -			/*
    -			 * Do we support this feature
    -			 */
    -			if( !adapter->support_random_del ) {
    -				printk(KERN_WARNING "megaraid: logdrv ");
    -				printk("delete on non-supporting F/W.\n");
    +					return (-EINVAL);
    +				}
     
    -				return (-EINVAL);
    -			}
    +				rval = mega_del_logdrv( adapter,
    RMBOX(uioc)[3] );
     
    -			rval = mega_del_logdrv( adapter, uioc.uioc_rmbox[3]
    );
    +				if( rval == 0 ) {
    +					memset(&mc, 0, sizeof(megacmd_t));
     
    -			if( rval == 0 ) {
    -				memset(&mc, 0, sizeof(megacmd_t));
    +					mc.status = rval;
     
    -				mc.status = rval;
    +					rval = mega_n_to_m((void *)arg,
    &mc);
    +				}
     
    -				rval = mega_n_to_m((void *)arg, &mc);
    +				return rval;
     			}
    -
    -			return rval;
     		}
     		/*
     		 * This interface only support the regular passthru
    commands.
     		 * Reject extended passthru and 64-bit passthru
     		 */
    -		if( uioc.uioc_rmbox[0] == MEGA_MBOXCMD_PASSTHRU64 ||
    -			uioc.uioc_rmbox[0] == MEGA_MBOXCMD_EXTPTHRU ) {
    +		if( RMBOX(uioc)[0] == MEGA_MBOXCMD_PASSTHRU64 ||
    +			RMBOX(uioc)[0] == MEGA_MBOXCMD_EXTPTHRU ) {
     
     			printk(KERN_WARNING "megaraid: rejected
    passthru.\n");
     
    @@ -4386,7 +4314,7 @@
     		pdev = adapter->dev;
     
     		/* Is it a passthru command or a DCMD */
    -		if( uioc.uioc_rmbox[0] == MEGA_MBOXCMD_PASSTHRU ) {
    +		if( RMBOX(uioc)[0] == MEGA_MBOXCMD_PASSTHRU ) {
     			/* Passthru commands */
     
     			pthru = adapter->int_pthru;
    @@ -4394,20 +4322,12 @@
     			/*
     			 * The user passthru structure
     			 */
    -			upthru = (mega_passthru *)
    -					((ulong)(MBOX(uioc)->xferaddr));
    -			/*
    -			 * Copy in the user passthru here.
    -			 */
    -			if( copy_from_user(pthru, (char *)upthru,
    -						sizeof(mega_passthru)) ) {
    -				return (-EFAULT);
    -			}
    -
    +			 upthru = &uioc.pthru;
    +			 memcpy(pthru, (char
    *)upthru,sizeof(mega_passthru));
     			/*
     			 * Is there a data transfer; If the data transfer
    -			 * length is <= INT_MEMBLK_SZ, usr the buffer 
    -			 * allocated at the load time. Otherwise, allocate
    it 
    +			 * length is <= INT_MEMBLK_SZ, usr the buffer
    +			 * allocated at the load time. Otherwise, allocate
    it
     			 * here.
     			 */
     			if (pthru->dataxferlen) {
    @@ -4417,8 +4337,9 @@
     							pthru->dataxferlen,
     							&data_dma_hndl );
     
    -					if (data == NULL)
    +					if (data == NULL) {
     						return (-ENOMEM);
    +					}
     				}
     				else {
     					data = adapter->int_data;
    @@ -4428,11 +4349,11 @@
     				 * Save the user address and point the
    kernel
     				 * address at just allocated memory
     				 */
    -				uxferaddr = pthru->dataxferaddr;
    +				uxferaddr = (caddr_t) uioc.u_dataaddr;
     				if (data_dma_hndl)
     					pthru->dataxferaddr = data_dma_hndl;
     				else
    -					pthru->dataxferaddr = 
    +					pthru->dataxferaddr =
     						adapter->int_data_dma_hndl;
     			}
     
    @@ -4440,12 +4361,12 @@
     			/*
     			 * Is data coming down-stream
     			 */
    -			if( pthru->dataxferlen && (uioc.flags & UIOC_WR) ) {
    +			if(pthru->dataxferlen  && (uioc.flags & UIOC_WR) ) {
     				/*
     				 * Get the user data
     				 */
     				if( copy_from_user(data,
    -						(char *)((ulong)uxferaddr),
    +						(char *)uxferaddr,
     						pthru->dataxferlen) ) {
     					rval = (-EFAULT);
     					goto freedata_and_return;
    @@ -4471,7 +4392,7 @@
     			 * Is data going up-stream
     			 */
     			if( pthru->dataxferlen && (uioc.flags & UIOC_RD) ) {
    -				if( copy_to_user((char *)((ulong)uxferaddr),
    +				if( copy_to_user((char *)uxferaddr,
     						data, pthru->dataxferlen) )
    {
     					rval = (-EFAULT);
     				}
    @@ -4511,7 +4432,7 @@
     				else {
     					data = adapter->int_data;
     				}
    -				uxferaddr = MBOX(uioc)->xferaddr;
    +				uxferaddr = uioc.u_dataaddr;
     			}
     
     			/*
    @@ -4559,7 +4480,7 @@
     			 * Is data going up-stream
     			 */
     			if( uioc.xferlen && (uioc.flags & UIOC_RD) ) {
    -				if( copy_to_user((char *)((ulong)uxferaddr),
    +				if( copy_to_user((char *)uxferaddr,
     						data, uioc.xferlen) ) {
     
     					rval = (-EFAULT);
    @@ -4648,18 +4569,18 @@
     
     		case MEGAIOC_QDRVRVER:	/* Query driver version */
     			uioc->opcode = GET_DRIVER_VER;
    -			uioc->uioc_uaddr = uioc_mimd.data;
    +			uioc->u_dataaddr = uioc_mimd.data;
     			break;
     
     		case MEGAIOC_QNADAP:	/* Get # of adapters */
     			uioc->opcode = GET_N_ADAP;
    -			uioc->uioc_uaddr = uioc_mimd.data;
    +			uioc->u_dataaddr = uioc_mimd.data;
     			break;
     
     		case MEGAIOC_QADAPINFO:	/* Get adapter information */
     			uioc->opcode = GET_ADAP_INFO;
     			uioc->adapno = uioc_mimd.ui.fcs.adapno;
    -			uioc->uioc_uaddr = uioc_mimd.data;
    +			uioc->u_dataaddr = uioc_mimd.data;
     			break;
     
     		default:
    @@ -4674,9 +4595,16 @@
     		uioc->opcode = MBOX_CMD;
     		uioc->adapno = uioc_mimd.ui.fcs.adapno;
     
    -		memcpy(uioc->uioc_rmbox, uioc_mimd.mbox, 18);
    +		memcpy(&uioc->u_mbox, uioc_mimd.mbox, 18);
     
     		uioc->xferlen = uioc_mimd.ui.fcs.length;
    +		uioc->u_dataaddr = uioc_mimd.ui.fcs.buffer;
    +
    +		if (uioc_mimd.mbox[0] == MEGA_MBOXCMD_PASSTHRU ) {
    +			memcpy(&uioc->pthru,&uioc_mimd.pthru,
    +				sizeof(mega_passthru));
    +
    +		}
     
     		if( uioc_mimd.outlen ) uioc->flags = UIOC_RD;
     		if( uioc_mimd.inlen ) uioc->flags |= UIOC_WR;
    @@ -4688,13 +4616,20 @@
     		uioc->opcode = MBOX_CMD;
     		uioc->adapno = uioc_mimd.ui.fcs.adapno;
     
    -		memcpy(uioc->uioc_rmbox, uioc_mimd.mbox, 18);
    +		memcpy(&uioc->u_mbox, uioc_mimd.mbox, 18);
     
     		/*
     		 * Choose the xferlen bigger of input and output data
     		 */
     		uioc->xferlen = uioc_mimd.outlen > uioc_mimd.inlen ?
     			uioc_mimd.outlen : uioc_mimd.inlen;
    +		uioc->u_dataaddr = uioc_mimd.data;
    +
    +		if (uioc_mimd.mbox[0] == MEGA_MBOXCMD_PASSTHRU ) {
    +			memcpy(&uioc->pthru,&uioc_mimd.pthru,
    +				sizeof(mega_passthru));
    +
    +		}
     
     		if( uioc_mimd.outlen ) uioc->flags = UIOC_RD;
     		if( uioc_mimd.inlen ) uioc->flags |= UIOC_WR;
    @@ -4735,20 +4670,14 @@
     
     	if( memcmp(signature, "MEGANIT", 7) == 0 ) {
     
    -		uiocp = (nitioctl_t *)arg;
    -
    -		if( put_user(mc->status, (u8 *)&MBOX_P(uiocp)->status) )
    -			return (-EFAULT);
    -
    -		if( mc->cmd == MEGA_MBOXCMD_PASSTHRU ) {
    -
    -			umc = MBOX_P(uiocp);
    -
    -			upthru = (mega_passthru *)((ulong)(umc->xferaddr));
     
    -			if( put_user(mc->status, (u8 *)&upthru->scsistatus)
    )
    -				return (-EFAULT);
    -		}
    +		/*
    +		 * NOTE: The nit ioctl is still under flux because of
    +		 * change of mailbox definition, in HPE. No applications yet
    +		 * use this interface and let's not have applications use
    this
    +		 * interface till the new specifitions are in place.
    +		 */
    +		return -EINVAL;
     	}
     	else {
     		uioc_mimd = (struct uioctl_t *)arg;
    @@ -4763,8 +4692,7 @@
     			if (copy_from_user(&kmc, umc, sizeof(megacmd_t))) {
     				return -EFAULT;
     			}
    -
    -			upthru = (mega_passthru *)((ulong)kmc.xferaddr);
    +			upthru = (mega_passthru
    *)((ulong)&uioc_mimd->pthru);
     
     			if( put_user(mc->status, (u8 *)&upthru->scsistatus)
    ){
     				return (-EFAULT);
    @@ -5179,6 +5107,55 @@
     }
     
     
    +
    +/**
    + * mega_get_ldrv_num()
    + * @adapter - pointer to our soft state
    + * @cmd - scsi mid layer command
    + * @channel - channel on the controller
    + *
    + * Calculate the logical drive number based on the information in scsi
    command
    + * and the channel number.
    + */
    +static inline int
    +mega_get_ldrv_num(adapter_t *adapter, Scsi_Cmnd *cmd, int channel)
    +{
    +	int		tgt;
    +	int		ldrv_num;
    +
    +	tgt = cmd->target;
    +
    +	if ( tgt > adapter->this_id )
    +		tgt--;	/* we do not get inquires for initiator id */
    +
    +	ldrv_num = (channel * 15) + tgt;
    +
    +
    +	/*
    +	 * If we have a logical drive with boot enabled, project it first
    +	 */
    +	if( adapter->boot_ldrv_enabled ) {
    +		if( ldrv_num == 0 ) {
    +			ldrv_num = adapter->boot_ldrv;
    +		}
    +		else {
    +			if( ldrv_num <= adapter->boot_ldrv ) {
    +				ldrv_num--;
    +			}
    +		}
    +	}
    +
    +	/*
    +	 * If "delete logical drive" feature is enabled on this controller,
    +	 * the value returned should be 0x80+logical drive id.
    +	 */
    +	if (adapter->support_random_del)
    +		ldrv_num += 0x80;
    +
    +	return ldrv_num;
    +}
    +
    +
     /**
      * mega_reorder_hosts()
      *
    @@ -5393,6 +5370,26 @@
     }
     
     
    +/**
    + * mega_allocate_inquiry()
    + * @dma_handle - handle returned for dma address
    + * @pdev - handle to pci device
    + *
    + * allocates memory for inquiry structure
    + */
    +static inline caddr_t
    +mega_allocate_inquiry(dma_addr_t *dma_handle, struct pci_dev *pdev)
    +{
    +	return pci_alloc_consistent(pdev, sizeof(mega_inquiry3),
    dma_handle);
    +}
    +
    +
    +static inline void
    +mega_free_inquiry(caddr_t inquiry, dma_addr_t dma_handle, struct pci_dev
    *pdev)
    +{
    +	pci_free_consistent(pdev, sizeof(mega_inquiry3), inquiry,
    dma_handle);
    +}
    +
     
     /** mega_internal_dev_inquiry()
      * @adapter - pointer to our soft state
    diff -Naur old/drivers/scsi/megaraid2.h new/drivers/scsi/megaraid2.h
    --- old/drivers/scsi/megaraid2.h	2005-07-15 07:52:27.000000000 -0400
    +++ new/drivers/scsi/megaraid2.h	2005-08-02 13:10:04.759465328 -0400
    @@ -6,7 +6,7 @@
     
     
     #define MEGARAID_VERSION	\
    -	"v2.10.8.2 (Release Date: Mon Jul 26 12:15:51 EDT 2004)\n"
    +	"v2.10.10.1 (Release Date: Thu Jan 27 16:19:44 EDT 2005)\n"
     
     /*
      * Driver features - change the values to enable or disable features in the
    @@ -83,6 +83,7 @@
     #define INTEL_SUBSYS_VID		0x8086
     #define FSC_SUBSYS_VID			0x1734
     #define ACER_SUBSYS_VID			0x1025
    +#define NEC_SUBSYS_VID			0x1033
     
     #define HBA_SIGNATURE	      		0x3344
     #define HBA_SIGNATURE_471	  	0xCCCC
    @@ -707,15 +708,15 @@
     	char		signature[8];	/* Must contain "MEGANIT" */
     	u32		opcode;		/* opcode for the command */
     	u32		adapno;		/* adapter number */
    -	union {
    -		u8	__raw_mbox[18];
    -		caddr_t	__uaddr; /* xferaddr for non-mbox cmds */
    -	}__ua;
    -
    -#define uioc_rmbox	__ua.__raw_mbox
    -#define MBOX(uioc)	((megacmd_t *)&((uioc).__ua.__raw_mbox[0]))
    -#define MBOX_P(uioc)	((megacmd_t *)&((uioc)->__ua.__raw_mbox[0]))
    -#define uioc_uaddr	__ua.__uaddr
    +	mbox_t  	u_mbox;		/* user mailbox */
    +	caddr_t		u_dataaddr;	/* xferaddr for DCMD and non-mbox
    +					   commands */
    +	mega_passthru	pthru;
    +
    +#define RMBOX(uioc) 	((u8 *)&(uioc).u_mbox)
    +#define MBOX(uioc)	((megacmd_t *)&(uioc).u_mbox)
    +#define MBOX_P(uioc) 	((megacmd_t *)&(uioc)->u_mbox)
    +
     
     	u32		xferlen;	/* xferlen for DCMD and non-mbox
     					   commands */
    @@ -1128,7 +1129,7 @@
     			      u32 *buffer, u32 *length);
     static inline int mega_busywait_mbox (adapter_t *);
     static int __mega_busywait_mbox (adapter_t *);
    -static void mega_cmd_done(adapter_t *, u8 [], int, int);
    +static inline void mega_cmd_done(adapter_t *, u8 [], int, int);
     static inline void mega_free_sgl (adapter_t *adapter);
     static void mega_8_to_40ld (mraid_inquiry *inquiry,
     		mega_inquiry3 *enquiry3, mega_product_info *);
    @@ -1137,7 +1138,14 @@
     				   unsigned long, void *);
     static int megadev_open (struct inode *, struct file *);
     
    -#if defined(__x86_64__)
    +#if defined( __x86_64__) || defined(IA32_EMULATION)
    +#ifndef __ia64__
    +#define LSI_CONFIG_COMPAT
    +#endif
    +#endif
    +
    +
    +#ifdef LSI_CONFIG_COMPAT
     static int megadev_compat_ioctl(unsigned int, unsigned int, unsigned long,
     	struct file *);
     #endif
    ---
    
    

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/



  • Next message: Dmitry Torokhov: "Re: Touchpad errors"

    Relevant Pages