summaryrefslogtreecommitdiffstats
path: root/sys/dev/aic7xxx
Commit message (Collapse)AuthorAgeFilesLines
* Coverity: initialize some variables before potential use.mjacob2006-09-051-0/+2
|
* add a newbus method for obtaining the bus's bus_dma_tag_t... This isjmg2006-09-034-8/+8
| | | | | | | | | | | | | required by arches like sparc64 (not yet implemented) and sun4v where there are seperate IOMMU's for each PCI bus... For all other arches, it will end up returning NULL, which makes it a no-op... Convert a few drivers (the ones we've been working w/ on sun4v) to the new convection... Eventually all drivers will need to replace the parent tag of NULL, w/ bus_get_dma_tag(dev), though dev is usually different for each driver, and will require hand inspection... Reviewed by: scottl (earlier version)
* Since DELAY() was moved, most <machine/clock.h> #includes have beenphk2006-05-162-2/+0
| | | | unnecessary.
* Clean up the way we handle auxiliary commands for a given ddb commandjhb2006-03-071-1/+1
| | | | | | | | | | | | | | | | table. Previously, the ddb code knew of each linker set of auxiliary commands and which explicit command list they were tied to. These changes add a simple command_table struct that contains both the static list of commands and the pointers for any auxiliary linker set of additional commands. This also makes it possible for other arbitrary command tables to be defined in other parts of the kernel w/o having to edit ddb itself. The DB_SET macro has also been trimmed down to just creating an entry in a linker set. A new DB_FUNC macro does what the old DB_SET did which is to not only add an entry to the linker set but also to include a function prototype for the function being added. With these changes, it's now also possible to create aliases for ddb functions using DB_SET() directly if desired.
* Fix -Wundef warnings from compiling GENERIC and LINT kernels ofru2005-12-061-1/+1
| | | | all architectures.
* Fix -Wundef warnings found when compiling i386 LINT, GENERIC andru2005-12-051-1/+1
| | | | custom kernels.
* Fix -Wundef.ru2005-12-045-13/+13
|
* Fix mysterious build failures (with parallel make) early inru2005-11-211-1/+1
| | | | | | | | buildkernel: provide a real but dummy name to ${DEPENDFILE} so that the relevant exists() check in bsd.prog.mk fails and ensures that ${GENHDRS} are built before any other objects. MFC after: 3 days
* Use the AHC_DISABLE_PCI_PERR flag to silence parity error reporting ongibbs2005-09-221-8/+15
| | | | | | chips where setting the FAILDIS bit is not effective. While here, try again to make it clear that reported parity errors indicate a failure of some PCI device *other than* the aic7xxx controller.
* Enhance diagnostic printfs for the chains of free lists used togibbs2005-09-221-1/+3
| | | | avoid SCB ID collissions to non-packetized targets.
* Correct bug that caused the completed "recovery" scb to have itsgibbs2005-09-222-2/+4
| | | | | | timer reset rather than the timer of an SCB still pending on the controller after recovery completed. This should correct timeout loops seen in the field.
* Set allow_memio to 1 if fetching the allow_memio hint fails. Thisgibbs2005-09-221-0/+1
| | | | | is the default behavior according the the bootverbose printf in the failure case.
* Back out change accidentally committed as Makefile:1.21 -- a localrwatson2005-08-031-1/+0
| | | | | | tweak to let the 6.x/7.x kernel series build on a 5.x userland. Pointed out by: njl
* Modify device drivers supporting multicast addresses to lock if_addr_mtxrwatson2005-08-031-0/+1
| | | | | | | | over iteration of their multicast address lists when synchronizing the hardware address filter with the network stack-maintained list. Problem reported by: Ed Maste (emaste at phaedrus dot sandvine dot ca> MFC after: 1 week
* Remove bus_{mem,p}io.h and related code for a micro-optimization on i386nyan2005-05-292-4/+0
| | | | | | and amd64. The optimization is a trivial on recent machines. Reviewed by: -arch (imp, marcel, dfr)
* remove useless ptr check; cur_column can never be nullsam2005-03-311-1/+1
| | | | Noticed by: Coverity Prevent analysis tool
* Use BUS_PROBE_DEFAULT for pci probe return valueimp2005-03-052-2/+2
|
* aic79xx.c:gibbs2005-02-162-5/+16
| | | | | | | | | | | aic7xxx.c: Allow print_reg() to be called with a NULL column. aic79xx.c: Correct new usage of SCB_GET_TAG(). aic7xxx.c: Fix stray ahd that snuck in here.
* On Rev. B silicon, we disabled the enhanced busfree detection logic togibbs2005-02-161-3/+3
| | | | | | | | | | | close holes in detecting busfrees that occur after a packetized target transitions to a non-packetized phase. The most common case where this occurs is when a target is externally reset so the controller believes a packetzied negotiation agreement is still in effect. Unfortunately, disabling this feature seems to cause problems for the 7901B. Re-enable ehanced busfree detection for this part until I can get my hands on a samble to figure out if the old workaround is necessary and, if so, how to make it work correctly.
* MF5S: Explicitly initialize timedout_scb lists, use SCB_TAG for all accessgibbs2005-02-163-4/+9
| | | | | to the hardware_scb->tag field, limit max lun reported to CAM to 63, return after a panic to silence a warning.
* Make this compile from the last commitscottl2005-01-061-1/+1
|
* Start each of the license/copyright comments with /*-, minor shuffle of linesimp2005-01-0634-34/+34
|
* Start the dreaded NOFOO -> NO_FOO conversion.ru2004-12-211-1/+1
| | | | OK'ed by: core
* Add some useful target mode diagnostics for incoming commandsgibbs2004-11-181-7/+11
| | | | under the AHC_SHOW_TQIN debug flag.
* Revert to basing all timeout/timer values in ms rather than us. The switchgibbs2004-11-184-16/+26
| | | | | | | | | to us was to help out the Linux port, but really just invited overflow. In fact, the request sense timer was overflowing prior to this change making it much shorter than intended. aic_osm_lib.h: Be more careful about overflow in all timer/timeout primitives.
* For variables that are only checked with defined(), don't provideru2004-10-241-1/+1
| | | | any fake value.
* aic7xxx.h:gibbs2004-10-192-14/+91
| | | | | | | | | | | | | | | Add constants for SPI protocol delays that are needed for target mode. aic7xxx.c: Correct a target mode issue that caused an occassional spurious REQ to be seen on the bus when performing manual message processing (e.g. transfer rate negotiation). Enforce phase change bus settle rules with explicit delays when performing manual message processing in target mode. The sequencer already did this for "fast-path", target mode message processing.
* Skip probe attempts for ISA PnP devices.gibbs2004-10-151-1/+5
| | | | Pointed out by: imp
* Correct a typo in a comment: alloated->allocatedgibbs2004-08-301-1/+1
| | | | Reported by: Jens Schweikhardt <schweikh@schweikhardt.net>
* In the PCI error interrupt handler, specify the width of the PCI configurationgibbs2004-08-221-6/+7
| | | | | | cycle using the correct argument. The location and width were reversed. MFC in: 2 days
* Set AHD_BUSFREEREV_BUG in the bug field for Rev B chips, not thegibbs2004-08-221-3/+3
| | | | | | | feature field. Reported by: Ken Westerback <krw@openbsd.org> MFC in: 2 days
* Initialize iobase from the resource allocated by bus_alloc_resource_any()gibbs2004-08-181-2/+2
| | | | | | rather than with isa_get_port(). This value is only used in diagnostics, but the value we want to print is the value in our resource, not in any hint.
* Invert the polarity of two tests in the recovery code that could causegibbs2004-08-181-2/+2
| | | | | | | | the driver to issue a bus reset more quickly than intended. We want to *wait* if we find another SCB that could be the cause of this timeout, not proceed to a bus reset. Noticed by: kan
* Remove spurious EISA definitions left over from the initial port of thegibbs2004-08-181-13/+0
| | | | aic7xxx driver to U320 hardware.
* Remove ISA attachments dependence on eisaconf.hgibbs2004-08-182-3/+3
| | | | Noticed by: Takahashi Yoshihiro <nyan@jp.FreeBSD.org>
* Add ISA attachement files for the aic7xxx driver.gibbs2004-08-171-0/+299
| | | | | Approved by: re Reminded by: obrien
* Add an ISA attachement to the aic7xxx driver to handle 284X controllers.gibbs2004-08-1711-150/+127
| | | | | | | | | | | | | | | | | | | | | The ISA probe uses an identify routine to probe all slot locations from 1 to 14 that do not conflict with other allocated resources. This required making aic7770.c part of the driver core when compiled as a module. aic7xxx.c: aic79xx.c: aic_osm_lib.c: Use aic_scb_timer_start() consistently to start the watchdog timer. This removes a few places that verbatum copied the code in aic_scb_timer_start(). During recovery processing, allow commands to still be queued to the controller. The only requirement we have is that our recovery command be queued first - something the code already guaranteed. The only other change required to make this work is to prevent timers from being started for these newly queued commands. Approved by: re
* Extend critical section protection around portions of selection processinggibbs2004-08-131-1/+5
| | | | | that cannot tolerate changes to the waiting for selection queue by the host or the host canceling an active selection.
* Fix an off by one in the critical section clearing code. Thegibbs2004-08-131-2/+0
| | | | | | code was adjusting twice for the instruction pointer indicating the *next* instruction to execute. The aic79xx driver had a similar bug, but was fixed some time ago.
* Correct a very rare case where command ordering could be compromisedgibbs2004-08-047-110/+358
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | by a transaction performing a driver handled message sequence (an scb with the MK_MESSAGE flag set). SCBs that perform host managed messaging must always be at the head of their per-target selection queue so that the firmware knows to manually assert ATN if the current negotiation agreement is packetized. In the past we guaranteed this by queuing these SCBs separarately in the execution queue. This exposes the system to potential command reordering in two cases: 1) Another SCB for the same ITL nexus is queued that does not have the MK_MESSAGE flag set. This SCB will be queued to the per-target list which can be serviced before the MK_MESSAGE scb that preceeded it. 2) If the target cannot accept all of the commands in the per-target selection queue in one selection, the remainder is queued to the tail of the selection queues so as to effect round-robin scheduling. This could allow the MK_MESSAGE scb to be sent to the target before the requeued commands. This commit changes the firmware policy to defer queuing MK_MESSAGE SCBs into the selection queues until this can be done without affecting order. This means that the target's selection queue is either empty, or the last SCB on the execution queue is also a MK_MESSAGE SCB. During any wait, the firmware halts the download of new SCBs so only a single "holding location" is required. Luckily, MK_MESSAGE SCBs are rare and typically occur only during CAM's bus probe where only one command is outstanding at a time. However, during some recovery scenarios, the reordering *could* occur. aic79xx.c: Update ahd_search_qinfifo() and helper routines to search for pending MK_MESSAGE scbs and properly restitch the execution queue if either the MK_MESSAGE SCB is being aborted, or the MK_MESSAGE SCB can be queued due to the execution queue draining due to aborts. Enable LQOBUSFREE status to assert an interrupt. This should be redundant since a BUSFREE interrupt should always occur along with an LQOBUSFREE event, but on the Rev A, this doesn't seem to be guaranteed. When a PPR request is rejected when a previously existing packetized agreement is in place, assume that the target has been reset without our knowledge and revert to async/narrow transfers. This corrects two issues: the stale ENATNO setting that was used to send the PPR is cleared so the firmware is not confused by a future packetized selection with ATN asserted but no MK_MESSAGE flag in the SCB and it speeds up recovery by aborting any pending packetized transactions that by definition are now dead. When re-queueing SCBs after a failed negotiation attempt, ensure command ordering by freezing the device queue first. Traverse the list of pending SCBs rather than the whole SCB array on the controller when pushing MK_MESSAGE flag changes out to the controller. The original code was optimized for the aic7xxx controllers where there are fewer controller slots then pending SCBs and the firmware picks SCB slots. For the U320 controller, the hope is that we have fewer pending SCBs then the 512 slots on the controller. Enhance some diagnostics. Factor out some common code. aic79xx.h: Add prototype for new ahd_done_with_status() that is used to factor out some commone code. aic79xx.reg: Add definisions for the pending MK_MESSAGE SCB. aic79xx.seq: Defer MK_MESSAGE SCB queing to the execution queue so as to preserve command ordering. Re-arrange some of the selection processing code so the above change had no performance impact on the common code path. Close a few critical section holes. When entering a non-packetized phase, manually enable busfree interrupts, since the controller hardware does not do this automatically. aic79xx_inline.h: Enhance logging for queued SCBs. aic79xx_osm.c: Add new a new DDB ahd command, ahd_dump, which invokes the ahd_dump_card_state() routine on the unit specified with the ahd_sunit DDB command. aic79xx_pci.c: Turn on the BUSFREEREV bug for the Rev B. controller. This is required to close the busfree during non-packetized phase hole.
* Do a pass over all modules in the kernel and make them return EOPNOTSUPPphk2004-07-152-0/+2
| | | | | | | | for unknown events. A number of modules return EINVAL in this instance, and I have left those alone for now and instead taught MOD_QUIESCE to accept this as "didn't do anything".
* Remove erroneous semicolons.stefanf2004-07-131-1/+1
|
* Add missing <sys/module.h> includesphk2004-05-302-0/+2
|
* aic79xx.c:gibbs2004-05-116-75/+153
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Allow 500us between pauses in ahd_pause_and_flushwork(). The maximum we will wait is now 500ms. In the same routine, remove any attempt to clear ENSELO. Let the firmware do it once the current selection has completed. This avoids some race conditions having to do with non-packetized completions and the auto-clearing of ENSELO on packetized completions. Also avoid attempts to clear critical sections when interrups are pending. We are going to loop again anyway, so clearing critical sections is a waste of time. It also may not be possible to clear a critical section if the source of the interrupt was a SEQINT. aic79xx_pci.c: Use the Generic 9005 mask when looking for generic 7901B parts. This allows the driver to attach to 7901B parts on motherboards using a non-Adaptec subvendor ID. aic79xx_inline.h: Test for the SCBRAM_RD_BUG against the bugs field, not the flags field in the softc. aic79xx.c: Cancel pending transactions on devices that respond with a selection timeout. This decreases the duration of timeout recovery when a device disappears. aic79xx.c: Don't bother forcing renegotiation on a selection timeout now that we use the device reset handler to abort any pending commands on the target. The device reset handler already takes us down to async narrow and forces a renegotiation. In the device reset handlers, only send a BDR sent async event if the status is not CAM_SEL_TIMEOUT. This avoids sending this event in the selection timeout case aic79xx.c: Modify the Core timeout handler to verify that another command has the potential to timeout before passing off a command timeout as due to some other command. This safety measure is added in response to a timeout recovery failure on H2B where it appears that incoming reselection status was lost during a drive pull test. In that case, the recovery handler continued to wait for the command that was active on the bus indefinetly. While the root cause of the above issue is still being determined seems a prudent safeguard. aic79xx_pci.c: Add a specific probe entry for the Dell OEM 39320(B). aic79xx.c: aic79xx.h: aic79xx.reg: aic79xx.seq: Modify the aic79xx firmware to never cross a cacheline or ADB boundary when DMA'ing completion entries to the host. In PCI mode, at least in 32/33 configurations, the SCB DMA engine may lose its place in the data-stream should the target force a retry on something other than an 8byte aligned boundary. In PCI-X mode, we do this to avoid split transactions since many chipsets seem to be unable to format proper split completions to continue the data transfer. The above change allows us to drop our completion entries from 8 bytes to 4. We were using 8 byte entries to ensure that PCI retries could only occur on an 8byte aligned boundary. Now that the sequencer guarantees this by splitting up completions, we can safely drop the size to 4 bytes (2 byte tag, one byte SG_RESID, one byte pad). Both the split-completion and PCI retry problems only show up under high tag load when interrupt coalescing is being especially effective. The switch from a 2byte completion entry to an 8 byte entry to solve the PCI problem increased the chance of incurring a split in PCI-X mode when multiple transactions were completed at once. Dropping the completion size to 4 bytes also means that we can complete more commands in a single DMA (128byte FIFO -> 32 commands instead of 16). aic79xx.c: Modify the SCSIINT handler to defer clearing sequencer critical sections to the individual interrupt handlers. This allows us to immediately disable any outgoing selections in the case of an unexpected busfree so we don't inadvertantly clear ENSELO *after* a new selection has started. Doing so may cause the sequencer to miss a successful selection. In ahd_update_pending_scbs(), only clear ENSELO if the bus is currently busy and a selection is not already in progress or the sequencer has yet to handle a pending selection. While we want to ensure that the selection for the SCB at the head of the selection queue is restarted so that any change in negotiation request can take effect, we can't clobber pending selection state without confusing the sequencer into missing a selection.
* o When restarting the sequencer, clear any pendinggibbs2004-05-111-26/+88
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | sequencer interrupt codes. These codes are only relevant to the code that was last being executed and that context is cleared when we reset the program counter. This addresses a race condition between a sequencer interrupt and any SCSI event that causes us to restart the sequencer. o When running the untagged-Q, we must start the timer for any transaction we queue. o Give the firmware half a millisecond between pauses to flush work out. This should give us around half a second of total delay before flagging an issue with pausing and flushing controller work. Only attempt to clear critical sections if there are no pending interrupts in the pause and flush loop. If the sequencer has issued an INTSTAT, we may not be able to step out of the critical section. o Cancel pending transactions on devices that respond with a selection timeout. This decreases the duration of timeout recovery when a device disappears. Don't bother forcing renegotiation on a selection timeout now that we use the device reset handler to abort any pending commands on the target. The device reset handler already takes us down to async narrow and forces a renegotiation. o In the device reset handlers, only send a BDR sent async event if the status is not CAM_SEL_TIMEOUT. This avoids sending this event in the selection timeout case. o Modify the Core timeout handler to verify that another command has the potential to timeout before passing off a command timeout as due to some other command.
* Add aic_scb_timer_start() which will be used in the aic7xxx driver togibbs2004-05-111-2/+17
| | | | | | | start the timer on SCBs queued in the untagged SCB queue. The core treats timeouts in usecs to satisfy Linux requirements. Multiply accordingly.
* Convert callers to the new bus_alloc_resource_any(9) API.njl2004-03-173-20/+19
| | | | | Submitted by: Mark Santcroos <marks@ripe.net> Reviewed by: imp, dfr, bde
* These are changes to allow to use the Intel C/C++ compiler (lang/icc)trhodes2004-03-121-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | to build the kernel. It doesn't affect the operation if gcc. Most of the changes are just adding __INTEL_COMPILER to #ifdef's, as icc v8 may define __GNUC__ some parts may look strange but are necessary. Additional changes: - in_cksum.[ch]: * use a generic C version instead of the assembly version in the !gcc case (ASM code breaks with the optimizations icc does) -> no bad checksums with an icc compiled kernel Help from: andre, grehan, das Stolen from: alpha version via ppc version The entire checksum code should IMHO be replaced with the DragonFly version (because it isn't guaranteed future revisions of gcc will include similar optimizations) as in: ---snip--- Revision Changes Path 1.12 +1 -0 src/sys/conf/files.i386 1.4 +142 -558 src/sys/i386/i386/in_cksum.c 1.5 +33 -69 src/sys/i386/include/in_cksum.h 1.5 +2 -0 src/sys/netinet/igmp.c 1.6 +0 -1 src/sys/netinet/in.h 1.6 +2 -0 src/sys/netinet/ip_icmp.c 1.4 +3 -4 src/contrib/ipfilter/ip_compat.h 1.3 +1 -2 src/sbin/natd/icmp.c 1.4 +0 -1 src/sbin/natd/natd.c 1.48 +1 -0 src/sys/conf/files 1.2 +0 -1 src/sys/conf/files.amd64 1.13 +0 -1 src/sys/conf/files.i386 1.5 +0 -1 src/sys/conf/files.pc98 1.7 +1 -1 src/sys/contrib/ipfilter/netinet/fil.c 1.10 +2 -3 src/sys/contrib/ipfilter/netinet/ip_compat.h 1.10 +1 -1 src/sys/contrib/ipfilter/netinet/ip_fil.c 1.7 +1 -1 src/sys/dev/netif/txp/if_txp.c 1.7 +1 -1 src/sys/net/ip_mroute/ip_mroute.c 1.7 +1 -2 src/sys/net/ipfw/ip_fw2.c 1.6 +1 -2 src/sys/netinet/igmp.c 1.4 +158 -116 src/sys/netinet/in_cksum.c 1.6 +1 -1 src/sys/netinet/ip_gre.c 1.7 +1 -2 src/sys/netinet/ip_icmp.c 1.10 +1 -1 src/sys/netinet/ip_input.c 1.10 +1 -2 src/sys/netinet/ip_output.c 1.13 +1 -2 src/sys/netinet/tcp_input.c 1.9 +1 -2 src/sys/netinet/tcp_output.c 1.10 +1 -1 src/sys/netinet/tcp_subr.c 1.10 +1 -1 src/sys/netinet/tcp_syncache.c 1.9 +1 -2 src/sys/netinet/udp_usrreq.c 1.5 +1 -2 src/sys/netinet6/ipsec.c 1.5 +1 -2 src/sys/netproto/ipsec/ipsec.c 1.5 +1 -1 src/sys/netproto/ipsec/ipsec_input.c 1.4 +1 -2 src/sys/netproto/ipsec/ipsec_output.c and finally remove sys/i386/i386 in_cksum.c sys/i386/include in_cksum.h ---snip--- - endian.h: * DTRT in C++ mode - quad.h: * we don't use gcc v1 anymore, remove support for it Suggested by: bde (long ago) - assym.h: * avoid zero-length arrays (remove dependency on a gcc specific feature) This change changes the contents of the object file, but as it's only used to generate some values for a header, and the generator knows how to handle this, there's no impact in the gcc case. Explained by: bde Submitted by: Marius Strobl <marius@alchemy.franken.de> - aicasm.c: * minor change to teach it about the way icc spells "-nostdinc" Not approved by: gibbs (no reply to my mail) - bump __FreeBSD_version (lang/icc needs to know about the changes) Incarnations of this patch survive gcc compiles since a loooong time, I use it on my desktop. An icc compiled kernel works since Nov. 2003 (exceptions: snd_* if used as modules), it survives a build of the entire ports collection with icc. Parts of this commit contains suggestions or submissions from Marius Strobl <marius@alchemy.franken.de>. Reviewed by: -arch Submitted by: netchild
* This are the build infrastructure changes to allow to use thetrhodes2004-03-121-1/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Intel C/C++ compiler (lang/icc) to build the kernel. The icc CPUTYPE CFLAGS use icc v7 syntax, icc v8 moans about them, but doesn't abort. They also produce CPU specific code (new instructions of the CPU, not only CPU specific scheduling), so if you get coredumps with signal 4 (SIGILL, illegal instruction) you've used the wrong CPUTYPE. Incarnations of this patch survive gcc compiles and my make universe. I use it on my desktop. To use it update share/mk, add /usr/local/intel/compiler70/ia32/bin (icc v7, works) or /usr/local/intel_cc_80/bin (icc v8, doesn't work) to your PATH, make sure you have a new kernel compile directory (e.g. MYKERNEL_icc) and run CFLAGS="-O2 -ip" CC=icc make depend CFLAGS="-O2 -ip" CC=icc make in it. Don't compile with -ipo, the build infrastructure uses ld directly to link the kernel and the modules, but -ipo needs the link step to be performed with Intel's linker. Problems with icc v8: - panic: npx0 cannot be emulated on an SMP system - UP: first start of /bin/sh results in a FP exception Parts of this commit contains suggestions or submissions from Marius Strobl <marius@alchemy.franken.de>. Reviewed by: silence on -arch Submitted by: netchild
* Fixed style of DPADD and LDADD assignments as per style.Makefile(5).ru2004-02-051-2/+2
|
OpenPOWER on IntegriCloud