Clean up the memory mapped/Programmed I/O stuff so that the driver completely
uses one or the other. This required some changes to the ahc_reset() function, and how early the probes had to allocate their softc. Turn the AHC_IN/OUT* macros into inline functions and lowercase their names to indicate this change. Geting AHC_OUTSB to work as a macro doing conditional memory mapped I/O would have been too gross. Stop setting STPWEN in the main driver and let the PCI front end do it instead. It knows better. Add the clearing of the QOUTQCNT variable during command complete processing in the SCB paging case. Go back to doing unconditional retries for the QUEUE FULL status condition. This is really a kludge, but the code to handle it properly is on the SCSI branch and will not make it into 2.2.
This commit is contained in:
parent
e0582e6561
commit
30136d82b2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=19626
File diff suppressed because it is too large
Load Diff
@ -30,7 +30,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: aic7xxx.h,v 1.31 1996/10/28 06:10:02 gibbs Exp $
|
||||
* $Id: aic7xxx.h,v 1.32 1996/11/05 07:57:29 gibbs Exp $
|
||||
*/
|
||||
|
||||
#ifndef _AIC7XXX_H_
|
||||
@ -56,26 +56,6 @@
|
||||
#define stqe_next sqe_next
|
||||
#endif
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#define AHC_INB(ahc, port) \
|
||||
(((ahc)->maddr != NULL) ? \
|
||||
((ahc)->maddr[port]) : \
|
||||
inb((ahc)->baseport+(port)))
|
||||
#define AHC_OUTB(ahc, port, val) \
|
||||
(((ahc)->maddr != NULL) ? \
|
||||
((ahc)->maddr[port] = (val)) : \
|
||||
outb((ahc)->baseport+(port), val))
|
||||
#define AHC_OUTSB(ahc, port, valp, size) \
|
||||
outsb((ahc)->baseport+(port), valp, size)
|
||||
#elif defined(__NetBSD__)
|
||||
#define AHC_INB(ahc, port) \
|
||||
bus_io_read_1((ahc)->sc_bc, (ahc)->sc_ioh, port)
|
||||
#define AHC_OUTB(ahc, port, val) \
|
||||
bus_io_write_1((ahc)->sc_bc, (ahc)->sc_ioh, port, val)
|
||||
#define AHC_OUTSB(ahc, port, valp, size) \
|
||||
bus_io_write_multi_1((ahc)->sc_bc, (ahc)->sc_ioh, port, valp, size)
|
||||
#endif
|
||||
|
||||
#define AHC_NSEG 256 /* number of dma segments supported */
|
||||
|
||||
#define AHC_SCB_MAX 255 /*
|
||||
@ -312,7 +292,6 @@ extern int ahc_debug; /* Initialized in i386/scsi/aic7xxx.c */
|
||||
|
||||
char *ahc_name __P((struct ahc_softc *ahc));
|
||||
|
||||
void ahc_reset __P((u_int32_t iobase));
|
||||
struct ahc_softc *ahc_alloc __P((int unit, u_int32_t io_base,
|
||||
vm_offset_t maddr, ahc_type type,
|
||||
ahc_flag flags, struct scb_data *scb_data));
|
||||
@ -320,9 +299,9 @@ struct ahc_softc *ahc_alloc __P((int unit, u_int32_t io_base,
|
||||
|
||||
#define ahc_name(ahc) (ahc)->sc_dev.dv_xname
|
||||
|
||||
void ahc_reset __P((char *devname, bus_chipset_tag_t bc, bus_io_handle_t ioh));
|
||||
void ahc_construct __P((struct ahc_softc *ahc, bus_chipset_tag_t bc, bus_io_handle_t ioh, ahc_type type, ahc_flag flags));
|
||||
#endif
|
||||
void ahc_reset __P((struct ahc_softc *ahc));
|
||||
void ahc_free __P((struct ahc_softc *));
|
||||
int ahc_init __P((struct ahc_softc *));
|
||||
int ahc_attach __P((struct ahc_softc *));
|
||||
@ -332,4 +311,63 @@ void ahc_intr __P((void *arg));
|
||||
int ahc_intr __P((void *arg));
|
||||
#endif
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
static __inline u_int8_t ahc_inb __P((struct ahc_softc *ahc, u_int32_t port));
|
||||
static __inline void ahc_outb __P((struct ahc_softc *ahc, u_int32_t port,
|
||||
u_int8_t val));
|
||||
static __inline void ahc_outsb __P((struct ahc_softc *ahc, u_int32_t port,
|
||||
u_int8_t *valp, size_t size));
|
||||
|
||||
static __inline u_int8_t
|
||||
ahc_inb(ahc, port)
|
||||
struct ahc_softc *ahc;
|
||||
u_int32_t port;
|
||||
{
|
||||
if (ahc->maddr != NULL)
|
||||
return ahc->maddr[port];
|
||||
else
|
||||
return inb(ahc->baseport + port);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
ahc_outb(ahc, port, val)
|
||||
struct ahc_softc *ahc;
|
||||
u_int32_t port;
|
||||
u_int8_t val;
|
||||
{
|
||||
if (ahc->maddr != NULL)
|
||||
ahc->maddr[port] = val;
|
||||
else
|
||||
outb(ahc->baseport + port, val);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
ahc_outsb(ahc, port, valp, size)
|
||||
struct ahc_softc *ahc;
|
||||
u_int32_t port;
|
||||
u_int8_t *valp;
|
||||
size_t size;
|
||||
{
|
||||
if (ahc->maddr != NULL) {
|
||||
__asm __volatile("
|
||||
cld;
|
||||
1: lodsb;
|
||||
movb %%al,(%0);
|
||||
loop 1b" :
|
||||
:
|
||||
"r" ((ahc)->maddr + (port)),
|
||||
"S" ((valp)), "c" ((size)) :
|
||||
"%esi", "%ecx", "%eax");
|
||||
} else
|
||||
outsb(ahc->baseport + port, valp, size);
|
||||
}
|
||||
#elif defined(__NetBSD__)
|
||||
#define ahc_inb(ahc, port) \
|
||||
bus_io_read_1((ahc)->sc_bc, (ahc)->sc_ioh, port)
|
||||
#define ahc_outb(ahc, port, val) \
|
||||
bus_io_write_1((ahc)->sc_bc, (ahc)->sc_ioh, port, val)
|
||||
#define ahc_outsb(ahc, port, valp, size) \
|
||||
bus_io_write_multi_1((ahc)->sc_bc, (ahc)->sc_ioh, port, valp, size)
|
||||
#endif
|
||||
|
||||
#endif /* _AIC7XXX_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user