Commit 81ebcc6d authored by Justin T. Gibbs's avatar Justin T. Gibbs

Aic7xxx and Aic79xx Driver Updates

 o Adapt to new IRQ handler declaration/behavior for 2.5.X
parent 412e802d
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#45 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#46 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -805,7 +805,7 @@ ahd_get_sense_bufaddr(struct ahd_softc *ahd, struct scb *scb) ...@@ -805,7 +805,7 @@ ahd_get_sense_bufaddr(struct ahd_softc *ahd, struct scb *scb)
static __inline void ahd_sync_qoutfifo(struct ahd_softc *ahd, int op); static __inline void ahd_sync_qoutfifo(struct ahd_softc *ahd, int op);
static __inline void ahd_sync_tqinfifo(struct ahd_softc *ahd, int op); static __inline void ahd_sync_tqinfifo(struct ahd_softc *ahd, int op);
static __inline u_int ahd_check_cmdcmpltqueues(struct ahd_softc *ahd); static __inline u_int ahd_check_cmdcmpltqueues(struct ahd_softc *ahd);
static __inline void ahd_intr(struct ahd_softc *ahd); static __inline int ahd_intr(struct ahd_softc *ahd);
static __inline void static __inline void
ahd_sync_qoutfifo(struct ahd_softc *ahd, int op) ahd_sync_qoutfifo(struct ahd_softc *ahd, int op)
...@@ -864,7 +864,7 @@ ahd_check_cmdcmpltqueues(struct ahd_softc *ahd) ...@@ -864,7 +864,7 @@ ahd_check_cmdcmpltqueues(struct ahd_softc *ahd)
/* /*
* Catch an interrupt from the adapter * Catch an interrupt from the adapter
*/ */
static __inline void static __inline int
ahd_intr(struct ahd_softc *ahd) ahd_intr(struct ahd_softc *ahd)
{ {
u_int intstat; u_int intstat;
...@@ -876,7 +876,7 @@ ahd_intr(struct ahd_softc *ahd) ...@@ -876,7 +876,7 @@ ahd_intr(struct ahd_softc *ahd)
* so just return. This is likely just a shared * so just return. This is likely just a shared
* interrupt. * interrupt.
*/ */
return; return (0);
} }
/* /*
...@@ -924,28 +924,28 @@ ahd_intr(struct ahd_softc *ahd) ...@@ -924,28 +924,28 @@ ahd_intr(struct ahd_softc *ahd)
#endif #endif
} }
if (intstat == 0xFF && (ahd->features & AHD_REMOVABLE) != 0)
/* Hot eject */
return;
if ((intstat & INT_PEND) == 0) if ((intstat & INT_PEND) == 0)
return; return (0);
if (intstat & HWERRINT) { /*
* Handle statuses that may invalidate our cached
* copy of INTSTAT separately.
*/
if (intstat == 0xFF && (ahd->features & AHD_REMOVABLE) != 0) {
/* Hot eject. Do nothing */
} else if (intstat & HWERRINT) {
ahd_handle_hwerrint(ahd); ahd_handle_hwerrint(ahd);
return; } else if ((intstat & (PCIINT|SPLTINT)) != 0) {
}
if ((intstat & (PCIINT|SPLTINT)) != 0) {
ahd->bus_intr(ahd); ahd->bus_intr(ahd);
return; } else {
}
if ((intstat & SEQINT) != 0) if ((intstat & SEQINT) != 0)
ahd_handle_seqint(ahd, intstat); ahd_handle_seqint(ahd, intstat);
if ((intstat & SCSIINT) != 0) if ((intstat & SCSIINT) != 0)
ahd_handle_scsiint(ahd, intstat); ahd_handle_scsiint(ahd, intstat);
}
return (1);
} }
#endif /* _AIC79XX_INLINE_H_ */ #endif /* _AIC79XX_INLINE_H_ */
/* /*
* Adaptec AIC79xx device driver for Linux. * Adaptec AIC79xx device driver for Linux.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#156 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#157 $
* *
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Copyright (c) 1994-2000 Justin T. Gibbs. * Copyright (c) 1994-2000 Justin T. Gibbs.
...@@ -4206,19 +4206,21 @@ ahd_linux_run_device_queue(struct ahd_softc *ahd, struct ahd_linux_device *dev) ...@@ -4206,19 +4206,21 @@ ahd_linux_run_device_queue(struct ahd_softc *ahd, struct ahd_linux_device *dev)
/* /*
* SCSI controller interrupt handler. * SCSI controller interrupt handler.
*/ */
void AIC_LINUX_IRQRETURN_T
ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs) ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs)
{ {
struct ahd_softc *ahd; struct ahd_softc *ahd;
u_long flags; u_long flags;
int ours;
ahd = (struct ahd_softc *) dev_id; ahd = (struct ahd_softc *) dev_id;
ahd_lock(ahd, &flags); ahd_lock(ahd, &flags);
ahd_intr(ahd); ours = ahd_intr(ahd);
if (ahd_linux_next_device_to_run(ahd) != NULL) if (ahd_linux_next_device_to_run(ahd) != NULL)
ahd_schedule_runq(ahd); ahd_schedule_runq(ahd);
ahd_linux_run_complete_queue(ahd); ahd_linux_run_complete_queue(ahd);
ahd_unlock(ahd, &flags); ahd_unlock(ahd, &flags);
AIC_LINUX_IRQRETURN(ours);
} }
void void
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#128 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#129 $
* *
*/ */
#ifndef _AIC79XX_LINUX_H_ #ifndef _AIC79XX_LINUX_H_
...@@ -1211,7 +1211,8 @@ void ahd_platform_set_tags(struct ahd_softc *ahd, ...@@ -1211,7 +1211,8 @@ void ahd_platform_set_tags(struct ahd_softc *ahd,
int ahd_platform_abort_scbs(struct ahd_softc *ahd, int target, int ahd_platform_abort_scbs(struct ahd_softc *ahd, int target,
char channel, int lun, u_int tag, char channel, int lun, u_int tag,
role_t role, uint32_t status); role_t role, uint32_t status);
void ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs); AIC_LINUX_IRQRETURN_T
ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs);
void ahd_platform_flushwork(struct ahd_softc *ahd); void ahd_platform_flushwork(struct ahd_softc *ahd);
int ahd_softc_comp(struct ahd_softc *, struct ahd_softc *); int ahd_softc_comp(struct ahd_softc *, struct ahd_softc *);
void ahd_done(struct ahd_softc*, struct scb*); void ahd_done(struct ahd_softc*, struct scb*);
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic7xxx_inline.h#40 $ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_inline.h#41 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -500,7 +500,7 @@ ahc_get_sense_bufaddr(struct ahc_softc *ahc, struct scb *scb) ...@@ -500,7 +500,7 @@ ahc_get_sense_bufaddr(struct ahc_softc *ahc, struct scb *scb)
static __inline void ahc_sync_qoutfifo(struct ahc_softc *ahc, int op); static __inline void ahc_sync_qoutfifo(struct ahc_softc *ahc, int op);
static __inline void ahc_sync_tqinfifo(struct ahc_softc *ahc, int op); static __inline void ahc_sync_tqinfifo(struct ahc_softc *ahc, int op);
static __inline u_int ahc_check_cmdcmpltqueues(struct ahc_softc *ahc); static __inline u_int ahc_check_cmdcmpltqueues(struct ahc_softc *ahc);
static __inline void ahc_intr(struct ahc_softc *ahc); static __inline int ahc_intr(struct ahc_softc *ahc);
static __inline void static __inline void
ahc_sync_qoutfifo(struct ahc_softc *ahc, int op) ahc_sync_qoutfifo(struct ahc_softc *ahc, int op)
...@@ -558,7 +558,7 @@ ahc_check_cmdcmpltqueues(struct ahc_softc *ahc) ...@@ -558,7 +558,7 @@ ahc_check_cmdcmpltqueues(struct ahc_softc *ahc)
/* /*
* Catch an interrupt from the adapter * Catch an interrupt from the adapter
*/ */
static __inline void static __inline int
ahc_intr(struct ahc_softc *ahc) ahc_intr(struct ahc_softc *ahc)
{ {
u_int intstat; u_int intstat;
...@@ -570,7 +570,7 @@ ahc_intr(struct ahc_softc *ahc) ...@@ -570,7 +570,7 @@ ahc_intr(struct ahc_softc *ahc)
* so just return. This is likely just a shared * so just return. This is likely just a shared
* interrupt. * interrupt.
*/ */
return; return (0);
} }
/* /*
* Instead of directly reading the interrupt status register, * Instead of directly reading the interrupt status register,
...@@ -604,10 +604,6 @@ ahc_intr(struct ahc_softc *ahc) ...@@ -604,10 +604,6 @@ ahc_intr(struct ahc_softc *ahc)
#endif #endif
} }
if (intstat == 0xFF && (ahc->features & AHC_REMOVABLE) != 0)
/* Hot eject */
return;
if ((intstat & INT_PEND) == 0) { if ((intstat & INT_PEND) == 0) {
#if AHC_PCI_CONFIG > 0 #if AHC_PCI_CONFIG > 0
if (ahc->unsolicited_ints > 500) { if (ahc->unsolicited_ints > 500) {
...@@ -618,24 +614,29 @@ ahc_intr(struct ahc_softc *ahc) ...@@ -618,24 +614,29 @@ ahc_intr(struct ahc_softc *ahc)
} }
#endif #endif
ahc->unsolicited_ints++; ahc->unsolicited_ints++;
return; return (0);
} }
ahc->unsolicited_ints = 0; ahc->unsolicited_ints = 0;
if (intstat & BRKADRINT) { /*
* Handle statuses that may invalidate our cached
* copy of INTSTAT separately.
*/
if (intstat == 0xFF && (ahc->features & AHC_REMOVABLE) != 0) {
/* Hot eject. Do nothing */
} else if (intstat & BRKADRINT) {
ahc_handle_brkadrint(ahc); ahc_handle_brkadrint(ahc);
/* Fatal error, no more interrupts to handle. */ } else if ((intstat & (SEQINT|SCSIINT)) != 0) {
return;
}
if ((intstat & (SEQINT|SCSIINT)) != 0)
ahc_pause_bug_fix(ahc); ahc_pause_bug_fix(ahc);
if ((intstat & SEQINT) != 0) if ((intstat & SEQINT) != 0)
ahc_handle_seqint(ahc, intstat); ahc_handle_seqint(ahc, intstat);
if ((intstat & SCSIINT) != 0) if ((intstat & SCSIINT) != 0)
ahc_handle_scsiint(ahc, intstat); ahc_handle_scsiint(ahc, intstat);
}
return (1);
} }
#endif /* _AIC7XXX_INLINE_H_ */ #endif /* _AIC7XXX_INLINE_H_ */
/* /*
* Adaptec AIC7xxx device driver for Linux. * Adaptec AIC7xxx device driver for Linux.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#217 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#218 $
* *
* Copyright (c) 1994 John Aycock * Copyright (c) 1994 John Aycock
* The University of Calgary Department of Computer Science. * The University of Calgary Department of Computer Science.
...@@ -3877,21 +3877,21 @@ ahc_linux_run_device_queue(struct ahc_softc *ahc, struct ahc_linux_device *dev) ...@@ -3877,21 +3877,21 @@ ahc_linux_run_device_queue(struct ahc_softc *ahc, struct ahc_linux_device *dev)
/* /*
* SCSI controller interrupt handler. * SCSI controller interrupt handler.
*/ */
irqreturn_t AIC_LINUX_IRQRETURN_T
ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs) ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs)
{ {
struct ahc_softc *ahc; struct ahc_softc *ahc;
u_long flags; u_long flags;
int ours;
ahc = (struct ahc_softc *) dev_id; ahc = (struct ahc_softc *) dev_id;
ahc_lock(ahc, &flags); ahc_lock(ahc, &flags);
ahc_intr(ahc); ours = ahc_intr(ahc);
if (ahc_linux_next_device_to_run(ahc) != NULL) if (ahc_linux_next_device_to_run(ahc) != NULL)
ahc_schedule_runq(ahc); ahc_schedule_runq(ahc);
ahc_linux_run_complete_queue(ahc); ahc_linux_run_complete_queue(ahc);
ahc_unlock(ahc, &flags); ahc_unlock(ahc, &flags);
/* FIXME! Was it really ours? */ AIC_LINUX_IRQRETURN(ours);
return IRQ_HANDLED;
} }
void void
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#138 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#139 $
* *
*/ */
#ifndef _AIC7XXX_LINUX_H_ #ifndef _AIC7XXX_LINUX_H_
...@@ -1163,7 +1163,8 @@ void ahc_platform_set_tags(struct ahc_softc *ahc, ...@@ -1163,7 +1163,8 @@ void ahc_platform_set_tags(struct ahc_softc *ahc,
int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target, int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target,
char channel, int lun, u_int tag, char channel, int lun, u_int tag,
role_t role, uint32_t status); role_t role, uint32_t status);
irqreturn_t ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs); AIC_LINUX_IRQRETURN_T
ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs);
void ahc_platform_flushwork(struct ahc_softc *ahc); void ahc_platform_flushwork(struct ahc_softc *ahc);
int ahc_softc_comp(struct ahc_softc *, struct ahc_softc *); int ahc_softc_comp(struct ahc_softc *, struct ahc_softc *);
void ahc_done(struct ahc_softc*, struct scb*); void ahc_done(struct ahc_softc*, struct scb*);
......
...@@ -15,15 +15,58 @@ ...@@ -15,15 +15,58 @@
* Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
* *
* $FreeBSD: src/sys/cam/scsi/scsi_all.h,v 1.21 2002/10/08 17:12:44 ken Exp $ * $FreeBSD: src/sys/cam/scsi/scsi_all.h,v 1.21 2002/10/08 17:12:44 ken Exp $
*
* Copyright (c) 2003 Adaptec Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
* substantially similar to the "NO WARRANTY" disclaimer below
* ("Disclaimer") and any redistribution must be conditioned upon
* including a substantially similar Disclaimer requirement for further
* binary redistribution.
* 3. Neither the names of the above-listed copyright holders nor the names
* of any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* NO WARRANTY
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* $Id$ * $Id$
*/ */
#ifndef _AICLIB_H
#define _AICLIB_H
/* /*
* SCSI general interface description * Linux Interrupt Support.
*/ */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
#ifndef _SCSI_SCSI_ALL_H #define AIC_LINUX_IRQRETURN_T irqreturn_t
#define _SCSI_SCSI_ALL_H 1 #define AIC_LINUX_IRQRETURN(ours) return (IRQ_RETVAL(ours))
#else
#define AIC_LINUX_IRQRETURN_T void
#define AIC_LINUX_IRQRETURN(ours) return
#endif
/* /*
* SCSI command format * SCSI command format
...@@ -1003,4 +1046,4 @@ scsi_4btoul(uint8_t *bytes) ...@@ -1003,4 +1046,4 @@ scsi_4btoul(uint8_t *bytes)
return (rv); return (rv);
} }
#endif /*_SCSI_SCSI_ALL_H*/ #endif /*_AICLIB_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment