aic7xxx_linux.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:79k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Adaptec AIC7xxx device driver for Linux.
  3.  *
  4.  * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_linux.c#79 $
  5.  *
  6.  * Copyright (c) 1994 John Aycock
  7.  *   The University of Calgary Department of Computer Science.
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2, or (at your option)
  12.  * any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  *
  23.  * Sources include the Adaptec 1740 driver (aha1740.c), the Ultrastor 24F
  24.  * driver (ultrastor.c), various Linux kernel source, the Adaptec EISA
  25.  * config file (!adp7771.cfg), the Adaptec AHA-2740A Series User's Guide,
  26.  * the Linux Kernel Hacker's Guide, Writing a SCSI Device Driver for Linux,
  27.  * the Adaptec 1542 driver (aha1542.c), the Adaptec EISA overlay file
  28.  * (adp7770.ovl), the Adaptec AHA-2740 Series Technical Reference Manual,
  29.  * the Adaptec AIC-7770 Data Book, the ANSI SCSI specification, the
  30.  * ANSI SCSI-2 specification (draft 10c), ...
  31.  *
  32.  * --------------------------------------------------------------------------
  33.  *
  34.  *  Modifications by Daniel M. Eischen (deischen@iworks.InterWorks.org):
  35.  *
  36.  *  Substantially modified to include support for wide and twin bus
  37.  *  adapters, DMAing of SCBs, tagged queueing, IRQ sharing, bug fixes,
  38.  *  SCB paging, and other rework of the code.
  39.  *
  40.  * --------------------------------------------------------------------------
  41.  * Copyright (c) 1994-2000 Justin T. Gibbs.
  42.  * Copyright (c) 2000-2001 Adaptec Inc.
  43.  * All rights reserved.
  44.  *
  45.  * Redistribution and use in source and binary forms, with or without
  46.  * modification, are permitted provided that the following conditions
  47.  * are met:
  48.  * 1. Redistributions of source code must retain the above copyright
  49.  *    notice, this list of conditions, and the following disclaimer,
  50.  *    without modification.
  51.  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  52.  *    substantially similar to the "NO WARRANTY" disclaimer below
  53.  *    ("Disclaimer") and any redistribution must be conditioned upon
  54.  *    including a substantially similar Disclaimer requirement for further
  55.  *    binary redistribution.
  56.  * 3. Neither the names of the above-listed copyright holders nor the names
  57.  *    of any contributors may be used to endorse or promote products derived
  58.  *    from this software without specific prior written permission.
  59.  *
  60.  * Alternatively, this software may be distributed under the terms of the
  61.  * GNU General Public License ("GPL") version 2 as published by the Free
  62.  * Software Foundation.
  63.  *
  64.  * NO WARRANTY
  65.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  66.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  67.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  68.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  69.  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  70.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  71.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  72.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  73.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  74.  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  75.  * POSSIBILITY OF SUCH DAMAGES.
  76.  *
  77.  *---------------------------------------------------------------------------
  78.  *
  79.  *  Thanks also go to (in alphabetical order) the following:
  80.  *
  81.  *    Rory Bolt     - Sequencer bug fixes
  82.  *    Jay Estabrook - Initial DEC Alpha support
  83.  *    Doug Ledford  - Much needed abort/reset bug fixes
  84.  *    Kai Makisara  - DMAing of SCBs
  85.  *
  86.  *  A Boot time option was also added for not resetting the scsi bus.
  87.  *
  88.  *    Form:  aic7xxx=extended
  89.  *           aic7xxx=no_reset
  90.  *           aic7xxx=verbose
  91.  *
  92.  *  Daniel M. Eischen, deischen@iworks.InterWorks.org, 1/23/97
  93.  *
  94.  *  Id: aic7xxx.c,v 4.1 1997/06/12 08:23:42 deang Exp
  95.  */
  96. /*
  97.  * Further driver modifications made by Doug Ledford <dledford@redhat.com>
  98.  *
  99.  * Copyright (c) 1997-1999 Doug Ledford
  100.  *
  101.  * These changes are released under the same licensing terms as the FreeBSD
  102.  * driver written by Justin Gibbs.  Please see his Copyright notice above
  103.  * for the exact terms and conditions covering my changes as well as the
  104.  * warranty statement.
  105.  *
  106.  * Modifications made to the aic7xxx.c,v 4.1 driver from Dan Eischen include
  107.  * but are not limited to:
  108.  *
  109.  *  1: Import of the latest FreeBSD sequencer code for this driver
  110.  *  2: Modification of kernel code to accomodate different sequencer semantics
  111.  *  3: Extensive changes throughout kernel portion of driver to improve
  112.  *     abort/reset processing and error hanndling
  113.  *  4: Other work contributed by various people on the Internet
  114.  *  5: Changes to printk information and verbosity selection code
  115.  *  6: General reliability related changes, especially in IRQ management
  116.  *  7: Modifications to the default probe/attach order for supported cards
  117.  *  8: SMP friendliness has been improved
  118.  *
  119.  */
  120. #include "aic7xxx_osm.h"
  121. #include "aic7xxx_inline.h"
  122. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
  123. #include <linux/init.h> /* __setup */
  124. #endif
  125. #include "../sd.h" /* For geometry detection */
  126. #include <linux/mm.h> /* For fetching system memory size */
  127. #include <linux/blk.h>
  128. /*
  129.  * To generate the correct addresses for the controller to issue
  130.  * on the bus.  Originally added for DEC Alpha support.
  131.  */
  132. #define VIRT_TO_BUS(a) (uint32_t)virt_to_bus((void *)(a))
  133. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
  134. struct proc_dir_entry proc_scsi_aic7xxx = {
  135. PROC_SCSI_AIC7XXX, 7, "aic7xxx",
  136. S_IFDIR | S_IRUGO | S_IXUGO, 2,
  137. 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL
  138. };
  139. #endif
  140. /*
  141.  * Set this to the delay in seconds after SCSI bus reset.
  142.  * Note, we honor this only for the initial bus reset.
  143.  * The scsi error recovery code performs its own bus settle
  144.  * delay handling for error recovery actions.
  145.  */
  146. #ifdef CONFIG_AIC7XXX_RESET_DELAY_MS
  147. #define AIC7XXX_RESET_DELAY CONFIG_AIC7XXX_RESET_DELAY_MS
  148. #else
  149. #define AIC7XXX_RESET_DELAY 5000
  150. #endif
  151. /*
  152.  * Control collection of SCSI transfer statistics for the /proc filesystem.
  153.  *
  154.  * NOTE: Do NOT enable this when running on kernels version 1.2.x and below.
  155.  * NOTE: This does affect performance since it has to maintain statistics.
  156.  */
  157. #ifdef CONFIG_AIC7XXX_PROC_STATS
  158. #define AIC7XXX_PROC_STATS
  159. #endif
  160. /*
  161.  * To change the default number of tagged transactions allowed per-device,
  162.  * add a line to the lilo.conf file like:
  163.  * append="aic7xxx=verbose,tag_info:{{32,32,32,32},{32,32,32,32}}"
  164.  * which will result in the first four devices on the first two
  165.  * controllers being set to a tagged queue depth of 32.
  166.  *
  167.  * The tag_commands is an array of 16 to allow for wide and twin adapters.
  168.  * Twin adapters will use indexes 0-7 for channel 0, and indexes 8-15
  169.  * for channel 1.
  170.  */
  171. typedef struct {
  172. uint8_t tag_commands[16]; /* Allow for wide/twin adapters. */
  173. } adapter_tag_info_t;
  174. /*
  175.  * Modify this as you see fit for your system.
  176.  *
  177.  * 0 tagged queuing disabled
  178.  * 1 <= n <= 253 n == max tags ever dispatched.
  179.  *
  180.  * The driver will throttle the number of commands dispatched to a
  181.  * device if it returns queue full.  For devices with a fixed maximum
  182.  * queue depth, the driver will eventually determine this depth and
  183.  * lock it in (a console message is printed to indicate that a lock
  184.  * has occurred).  On some devices, queue full is returned for a temporary
  185.  * resource shortage.  These devices will return queue full at varying
  186.  * depths.  The driver will throttle back when the queue fulls occur and
  187.  * attempt to slowly increase the depth over time as the device recovers
  188.  * from the resource shortage.
  189.  *
  190.  * In this example, the first line will disable tagged queueing for all
  191.  * the devices on the first probed aic7xxx adapter.
  192.  *
  193.  * The second line enables tagged queueing with 4 commands/LUN for IDs
  194.  * (0, 2-11, 13-15), disables tagged queueing for ID 12, and tells the
  195.  * driver to attempt to use up to 64 tags for ID 1.
  196.  *
  197.  * The third line is the same as the first line.
  198.  *
  199.  * The fourth line disables tagged queueing for devices 0 and 3.  It
  200.  * enables tagged queueing for the other IDs, with 16 commands/LUN
  201.  * for IDs 1 and 4, 127 commands/LUN for ID 8, and 4 commands/LUN for
  202.  * IDs 2, 5-7, and 9-15.
  203.  */
  204. /*
  205.  * NOTE: The below structure is for reference only, the actual structure
  206.  *       to modify in order to change things is just below this comment block.
  207. adapter_tag_info_t aic7xxx_tag_info[] =
  208. {
  209. {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
  210. {{4, 64, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4}},
  211. {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
  212. {{0, 16, 4, 0, 16, 4, 4, 4, 127, 4, 4, 4, 4, 4, 4, 4}}
  213. };
  214. */
  215. #ifdef CONFIG_AIC7XXX_CMDS_PER_DEVICE
  216. #define AIC7XXX_CMDS_PER_DEVICE CONFIG_AIC7XXX_CMDS_PER_DEVICE
  217. #else
  218. #define AIC7XXX_CMDS_PER_DEVICE AHC_MAX_QUEUE
  219. #endif
  220. #define AIC7XXX_CONFIGED_TAG_COMMANDS {
  221. AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,
  222. AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,
  223. AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,
  224. AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,
  225. AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,
  226. AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,
  227. AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE,
  228. AIC7XXX_CMDS_PER_DEVICE, AIC7XXX_CMDS_PER_DEVICE
  229. }
  230. /*
  231.  * By default, use the number of commands specified by
  232.  * the users kernel configuration.
  233.  */
  234. static adapter_tag_info_t aic7xxx_tag_info[] =
  235. {
  236. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  237. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  238. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  239. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  240. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  241. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  242. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  243. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  244. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  245. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  246. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  247. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  248. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  249. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  250. {AIC7XXX_CONFIGED_TAG_COMMANDS},
  251. {AIC7XXX_CONFIGED_TAG_COMMANDS}
  252. };
  253. /*
  254.  * There should be a specific return value for this in scsi.h, but
  255.  * it seems that most drivers ignore it.
  256.  */
  257. #define DID_UNDERFLOW   DID_ERROR
  258. void
  259. ahc_print_path(struct ahc_softc *ahc, struct scb *scb)
  260. {
  261. printk("(scsi%d:%c:%d:%d): ",
  262.        ahc->platform_data->host->host_no,
  263.        scb != NULL ? SCB_GET_CHANNEL(ahc, scb) : 'X',
  264.        scb != NULL ? SCB_GET_TARGET(ahc, scb) : -1,
  265.        scb != NULL ? SCB_GET_LUN(scb) : -1);
  266. }
  267. /*
  268.  * XXX - these options apply unilaterally to _all_ 274x/284x/294x
  269.  *       cards in the system.  This should be fixed.  Exceptions to this
  270.  *       rule are noted in the comments.
  271.  */
  272. /*
  273.  * Skip the scsi bus reset.  Non 0 make us skip the reset at startup.  This
  274.  * has no effect on any later resets that might occur due to things like
  275.  * SCSI bus timeouts.
  276.  */
  277. static uint32_t aic7xxx_no_reset;
  278. /*
  279.  * Certain PCI motherboards will scan PCI devices from highest to lowest,
  280.  * others scan from lowest to highest, and they tend to do all kinds of
  281.  * strange things when they come into contact with PCI bridge chips.  The
  282.  * net result of all this is that the PCI card that is actually used to boot
  283.  * the machine is very hard to detect.  Most motherboards go from lowest
  284.  * PCI slot number to highest, and the first SCSI controller found is the
  285.  * one you boot from.  The only exceptions to this are when a controller
  286.  * has its BIOS disabled.  So, we by default sort all of our SCSI controllers
  287.  * from lowest PCI slot number to highest PCI slot number.  We also force
  288.  * all controllers with their BIOS disabled to the end of the list.  This
  289.  * works on *almost* all computers.  Where it doesn't work, we have this
  290.  * option.  Setting this option to non-0 will reverse the order of the sort
  291.  * to highest first, then lowest, but will still leave cards with their BIOS
  292.  * disabled at the very end.  That should fix everyone up unless there are
  293.  * really strange cirumstances.
  294.  */
  295. static int aic7xxx_reverse_scan = 0;
  296. /*
  297.  * Should we force EXTENDED translation on a controller.
  298.  *     0 == Use whatever is in the SEEPROM or default to off
  299.  *     1 == Use whatever is in the SEEPROM or default to on
  300.  */
  301. static uint32_t aic7xxx_extended = 0;
  302. /*
  303.  * PCI bus parity checking of the Adaptec controllers.  This is somewhat
  304.  * dubious at best.  To my knowledge, this option has never actually
  305.  * solved a PCI parity problem, but on certain machines with broken PCI
  306.  * chipset configurations, it can generate tons of false error messages.
  307.  * It's included in the driver for completeness.
  308.  *   0 = Shut off PCI parity check
  309.  *  -1 = Normal polarity pci parity checking
  310.  *   1 = reverse polarity pci parity checking
  311.  *
  312.  * NOTE: you can't actually pass -1 on the lilo prompt.  So, to set this
  313.  * variable to -1 you would actually want to simply pass the variable
  314.  * name without a number.  That will invert the 0 which will result in
  315.  * -1.
  316.  */
  317. static int aic7xxx_pci_parity = 0;
  318. /*
  319.  * Certain newer motherboards have put new PCI based devices into the
  320.  * IO spaces that used to typically be occupied by VLB or EISA cards.
  321.  * This overlap can cause these newer motherboards to lock up when scanned
  322.  * for older EISA and VLB devices.  Setting this option to non-0 will
  323.  * cause the driver to skip scanning for any VLB or EISA controllers and
  324.  * only support the PCI controllers.  NOTE: this means that if the kernel
  325.  * os compiled with PCI support disabled, then setting this to non-0
  326.  * would result in never finding any devices :)
  327.  */
  328. int aic7xxx_no_probe;
  329. /*
  330.  * aic7xxx_detect() has been run, so register all device arrivals
  331.  * immediately with the system rather than deferring to the sorted
  332.  * attachment performed by aic7xxx_detect().
  333.  */
  334. int aic7xxx_detect_complete;
  335. /*
  336.  * So that we can set how long each device is given as a selection timeout.
  337.  * The table of values goes like this:
  338.  *   0 - 256ms
  339.  *   1 - 128ms
  340.  *   2 - 64ms
  341.  *   3 - 32ms
  342.  * We default to 256ms because some older devices need a longer time
  343.  * to respond to initial selection.
  344.  */
  345. static int aic7xxx_seltime = 0x00;
  346. /*
  347.  * Certain devices do not perform any aging on commands.  Should the
  348.  * device be saturated by commands in one portion of the disk, it is
  349.  * possible for transactions on far away sectors to never be serviced.
  350.  * To handle these devices, we can periodically send an ordered tag to
  351.  * force all outstanding transactions to be serviced prior to a new
  352.  * transaction.
  353.  */
  354. int aic7xxx_periodic_otag;
  355. /*
  356.  * Module information and settable options.
  357.  */
  358. #ifdef MODULE
  359. static char *aic7xxx = NULL;
  360. /*
  361.  * Just in case someone uses commas to separate items on the insmod
  362.  * command line, we define a dummy buffer here to avoid having insmod
  363.  * write wild stuff into our code segment
  364.  */
  365. static char dummy_buffer[60] = "Please don't trounce on me insmod!!n";
  366. MODULE_AUTHOR("Maintainer: Justin T. Gibbs <gibbs@scsiguy.com>");
  367. MODULE_DESCRIPTION("Adaptec Aic77XX/78XX SCSI Host Bus Adapter driver");
  368. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,10)
  369. MODULE_LICENSE("Dual BSD/GPL");
  370. #endif
  371. MODULE_PARM(aic7xxx, "s");
  372. MODULE_PARM_DESC(aic7xxx, "period delimited, options string.
  373. verbose Enable verbose/diagnostic logging
  374. no_probe Disable EISA/VLB controller probing
  375. no_reset Supress initial bus resets
  376. extended Enable extended geometry on all controllers
  377. periodic_otag Send an ordered tagged transaction periodically
  378. to prevent tag starvation.  This may be
  379. required by some older disk drives/RAID arrays. 
  380. reverse_scan Sort PCI devices highest Bus/Slot to lowest
  381. tag_info:<tag_str> Set per-target tag depth
  382. seltime:<int> Selection Timeout(0/256ms,1/128ms,2/64ms,3/32ms)
  383. Sample /etc/modules.conf line:
  384. Enable verbose logging
  385. Disable EISA/VLB probing
  386. Set tag depth on Controller 2/Target 2 to 10 tags
  387. Shorten the selection timeout to 128ms from its default of 256
  388. options aic7xxx='"verbose.no_probe.tag_info:{{}.{}.{..10}}.seltime:1"'
  389. ");
  390. #endif
  391. static void ahc_linux_handle_scsi_status(struct ahc_softc *,
  392.  struct ahc_linux_device *,
  393.  struct scb *);
  394. static void ahc_linux_filter_command(struct ahc_softc*, Scsi_Cmnd*,
  395.      struct scb*);
  396. static void ahc_linux_sem_timeout(u_long arg);
  397. static void ahc_linux_freeze_sim_queue(struct ahc_softc *ahc);
  398. static void ahc_linux_release_sim_queue(u_long arg);
  399. static int  ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag);
  400. static void ahc_linux_initialize_scsi_bus(struct ahc_softc *ahc);
  401. static void ahc_linux_select_queue_depth(struct Scsi_Host *host,
  402.  Scsi_Device *scsi_devs);
  403. static void ahc_linux_device_queue_depth(struct ahc_softc *ahc,
  404.  Scsi_Device *device);
  405. static struct ahc_linux_target* ahc_linux_alloc_target(struct ahc_softc*,
  406.        u_int, u_int);
  407. static void ahc_linux_free_target(struct ahc_softc*,
  408.       struct ahc_linux_target*);
  409. static struct ahc_linux_device* ahc_linux_alloc_device(struct ahc_softc*,
  410.        struct ahc_linux_target*,
  411.        u_int);
  412. static void ahc_linux_free_device(struct ahc_softc*,
  413.       struct ahc_linux_device*);
  414. static void ahc_linux_run_device_queue(struct ahc_softc*,
  415.        struct ahc_linux_device*);
  416. static void ahc_linux_setup_tag_info(char *p, char *end);
  417. static int ahc_linux_next_unit(void);
  418. static int ahc_linux_halt(struct notifier_block *nb, u_long event, void *buf);
  419. static __inline struct ahc_linux_device*
  420.      ahc_linux_get_device(struct ahc_softc *ahc, u_int channel,
  421.   u_int target, u_int lun, int alloc);
  422. static __inline void ahc_linux_queue_cmd_complete(struct ahc_softc *ahc,
  423.   Scsi_Cmnd *cmd);
  424. static __inline void ahc_linux_run_complete_queue(struct ahc_softc *ahc,
  425.   struct ahc_cmd *acmd);
  426. static __inline void ahc_linux_check_device_queue(struct ahc_softc *ahc,
  427.   struct ahc_linux_device *dev);
  428. static __inline void ahc_linux_sniff_command(struct ahc_softc*, Scsi_Cmnd*,
  429.      struct scb*);
  430. static __inline void ahc_linux_unmap_scb(struct ahc_softc*, struct scb*);
  431. static __inline int ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
  432.         struct ahc_dma_seg *sg,
  433.       bus_addr_t addr, bus_size_t len);
  434. static __inline struct ahc_linux_device*
  435. ahc_linux_get_device(struct ahc_softc *ahc, u_int channel, u_int target,
  436.        u_int lun, int alloc)
  437. {
  438. struct ahc_linux_target *targ;
  439. struct ahc_linux_device *dev;
  440. u_int target_offset;
  441. target_offset = target;
  442. if (channel != 0)
  443. target_offset += 8;
  444. targ = ahc->platform_data->targets[target_offset];
  445. if (targ == NULL) {
  446. if (alloc != 0) {
  447. targ = ahc_linux_alloc_target(ahc, channel, target);
  448. if (targ == NULL)
  449. return (NULL);
  450. } else
  451. return (NULL);
  452. }
  453. dev = targ->devices[lun];
  454. if (dev == NULL && alloc != 0)
  455. dev = ahc_linux_alloc_device(ahc, targ, lun);
  456. return (dev);
  457. }
  458. static __inline void
  459. ahc_linux_queue_cmd_complete(struct ahc_softc *ahc, Scsi_Cmnd *cmd)
  460. {
  461. /*
  462.  * Typically, the complete queue has very few entries
  463.  * queued to it before the queue is emptied by
  464.  * ahc_linux_run_complete_queue, so sorting the entries
  465.  * by generation number should be inexpensive.
  466.  * We perform the sort so that commands that complete
  467.  * with an error are retuned in the order origionally
  468.  * queued to the controller so that any subsequent retries
  469.  * are performed in order.  The underlying ahc routines do
  470.  * not guarantee the order that aborted commands will be
  471.  * returned to us.
  472.  */
  473. struct ahc_completeq *completeq;
  474. struct ahc_cmd *list_cmd;
  475. struct ahc_cmd *acmd;
  476. /*
  477.  * If we want the request requeued, make sure there
  478.  * are sufficent retries.  In the old scsi error code,
  479.  * we used to be able to specify a result code that
  480.  * bypassed the retry count.  Now we must use this
  481.  * hack.
  482.  */
  483. if (cmd->result == (CAM_REQUEUE_REQ << 16))
  484. cmd->retries--;
  485. completeq = &ahc->platform_data->completeq;
  486. list_cmd = TAILQ_FIRST(completeq);
  487. acmd = (struct ahc_cmd *)cmd;
  488. while (list_cmd != NULL
  489.     && acmd_scsi_cmd(list_cmd).serial_number
  490.      < acmd_scsi_cmd(acmd).serial_number)
  491. list_cmd = TAILQ_NEXT(list_cmd, acmd_links.tqe);
  492. if (list_cmd != NULL)
  493. TAILQ_INSERT_BEFORE(list_cmd, acmd, acmd_links.tqe);
  494. else
  495. TAILQ_INSERT_TAIL(completeq, acmd, acmd_links.tqe);
  496. }
  497. static __inline void
  498. ahc_linux_run_complete_queue(struct ahc_softc *ahc, struct ahc_cmd *acmd)
  499. {
  500. u_long done_flags;
  501. ahc_done_lock(ahc, &done_flags);
  502. while (acmd != NULL) {
  503. Scsi_Cmnd *cmd;
  504. cmd = &acmd_scsi_cmd(acmd);
  505. acmd = TAILQ_NEXT(acmd, acmd_links.tqe);
  506. cmd->host_scribble = NULL;
  507. cmd->scsi_done(cmd);
  508. }
  509. ahc_done_unlock(ahc, &done_flags);
  510. }
  511. static __inline void
  512. ahc_linux_check_device_queue(struct ahc_softc *ahc,
  513.      struct ahc_linux_device *dev)
  514. {
  515. if ((dev->flags & AHC_DEV_FREEZE_TIL_EMPTY) != 0
  516.  && dev->active == 0) {
  517. dev->flags &= ~AHC_DEV_FREEZE_TIL_EMPTY;
  518. dev->qfrozen--;
  519. }
  520. if (TAILQ_FIRST(&dev->busyq) == NULL
  521.  || dev->openings == 0 || dev->qfrozen != 0)
  522. return;
  523. ahc_linux_run_device_queue(ahc, dev);
  524. }
  525. static __inline void
  526. ahc_linux_run_device_queues(struct ahc_softc *ahc)
  527. {
  528. struct ahc_linux_device *dev;
  529. while ((ahc->flags & AHC_RESOURCE_SHORTAGE) == 0
  530.     && ahc->platform_data->qfrozen == 0
  531.     && (dev = TAILQ_FIRST(&ahc->platform_data->device_runq)) != NULL) {
  532. TAILQ_REMOVE(&ahc->platform_data->device_runq, dev, links);
  533. dev->flags &= ~AHC_DEV_ON_RUN_LIST;
  534. ahc_linux_check_device_queue(ahc, dev);
  535. }
  536. }
  537. static __inline void
  538. ahc_linux_sniff_command(struct ahc_softc *ahc, Scsi_Cmnd *cmd, struct scb *scb)
  539. {
  540. /*
  541.  * Determine whether we care to filter
  542.  * information out of this command.  If so,
  543.  * pass it on to ahc_linux_filter_command() for more
  544.  * heavy weight processing.
  545.  */
  546. if (cmd->cmnd[0] == INQUIRY)
  547. ahc_linux_filter_command(ahc, cmd, scb);
  548. }
  549. static __inline void
  550. ahc_linux_unmap_scb(struct ahc_softc *ahc, struct scb *scb)
  551. {
  552. Scsi_Cmnd *cmd;
  553. cmd = scb->io_ctx;
  554. ahc_sync_sglist(ahc, scb, BUS_DMASYNC_POSTWRITE);
  555. if (cmd->use_sg != 0) {
  556. struct scatterlist *sg;
  557. sg = (struct scatterlist *)cmd->request_buffer;
  558. pci_unmap_sg(ahc->dev_softc, sg, cmd->use_sg,
  559.      scsi_to_pci_dma_dir(cmd->sc_data_direction));
  560. } else if (cmd->request_bufflen != 0) {
  561. u_int32_t high_addr;
  562. high_addr = ahc_le32toh(scb->sg_list[0].len)
  563.   & AHC_SG_HIGH_ADDR_MASK;
  564. pci_unmap_single(ahc->dev_softc,
  565.  ahc_le32toh(scb->sg_list[0].addr)
  566.         | (((dma_addr_t)high_addr) << 8),
  567.  cmd->request_bufflen,
  568.  scsi_to_pci_dma_dir(cmd->sc_data_direction));
  569. }
  570. }
  571. static __inline int
  572. ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
  573.   struct ahc_dma_seg *sg, bus_addr_t addr, bus_size_t len)
  574. {
  575. int  consumed;
  576. if ((scb->sg_count + 1) > AHC_NSEG)
  577. panic("Too few segs for dma mapping.  "
  578.       "Increase AHC_NSEGn");
  579. consumed = 1;
  580. sg->addr = ahc_htole32(addr & 0xFFFFFFFF);
  581. scb->platform_data->xfer_len += len;
  582. if (sizeof(bus_addr_t) > 4
  583.  && (ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
  584. /*
  585.  * Due to DAC restrictions, we can't
  586.  * cross a 4GB boundary.
  587.  */
  588. if ((addr ^ (addr + len - 1)) & ~0xFFFFFFFF) {
  589. struct  ahc_dma_seg *next_sg;
  590. uint32_t next_len;
  591. printf("Crossed Segn");
  592. if ((scb->sg_count + 2) > AHC_NSEG)
  593. panic("Too few segs for dma mapping.  "
  594.       "Increase AHC_NSEGn");
  595. consumed++;
  596. next_sg = sg + 1;
  597. next_sg->addr = 0;
  598. next_len = 0x100000000 - (addr & 0xFFFFFFFF);
  599. len -= next_len;
  600. next_len |= ((addr >> 8) + 0x1000000) & 0x7F000000;
  601. next_sg->len = ahc_htole32(next_len);
  602. }
  603. len |= (addr >> 8) & 0x7F000000;
  604. }
  605. sg->len = ahc_htole32(len);
  606. return (consumed);
  607. }
  608. /************************ Shutdown/halt/reboot hook ***************************/
  609. #include <linux/notifier.h>
  610. #include <linux/reboot.h>
  611. static struct notifier_block ahc_linux_notifier = {
  612. ahc_linux_halt, NULL, 0
  613. };
  614. static int ahc_linux_halt(struct notifier_block *nb, u_long event, void *buf)
  615. {
  616. struct ahc_softc *ahc;
  617. if (event == SYS_DOWN || event == SYS_HALT) {
  618. TAILQ_FOREACH(ahc, &ahc_tailq, links) {
  619. ahc_shutdown(ahc);
  620. }
  621. }
  622. return (NOTIFY_OK);
  623. }
  624. /******************************** Macros **************************************/
  625. #define BUILD_SCSIID(ahc, cmd)
  626. ((((cmd)->target << TID_SHIFT) & TID)
  627. | (((cmd)->channel == 0) ? (ahc)->our_id : (ahc)->our_id_b)
  628. | (((cmd)->channel == 0) ? 0 : TWIN_CHNLB))
  629. /******************************** Bus DMA *************************************/
  630. int
  631. ahc_dma_tag_create(struct ahc_softc *ahc, bus_dma_tag_t parent,
  632.    bus_size_t alignment, bus_size_t boundary,
  633.    bus_addr_t lowaddr, bus_addr_t highaddr,
  634.    bus_dma_filter_t *filter, void *filterarg,
  635.    bus_size_t maxsize, int nsegments,
  636.    bus_size_t maxsegsz, int flags, bus_dma_tag_t *ret_tag)
  637. {
  638. bus_dma_tag_t dmat;
  639. dmat = malloc(sizeof(*dmat), M_DEVBUF, M_NOWAIT);
  640. if (dmat == NULL)
  641. return (ENOMEM);
  642. /*
  643.  * Linux is very simplistic about DMA memory.  For now don't
  644.  * maintain all specification information.  Once Linux supplies
  645.  * better facilities for doing these operations, or the
  646.  * needs of this particular driver change, we might need to do
  647.  * more here.
  648.  */
  649. dmat->alignment = alignment;
  650. dmat->boundary = boundary;
  651. dmat->maxsize = maxsize;
  652. *ret_tag = dmat;
  653. return (0);
  654. }
  655. void
  656. ahc_dma_tag_destroy(struct ahc_softc *ahc, bus_dma_tag_t dmat)
  657. {
  658. free(dmat, M_DEVBUF);
  659. }
  660. int
  661. ahc_dmamem_alloc(struct ahc_softc *ahc, bus_dma_tag_t dmat, void** vaddr,
  662.  int flags, bus_dmamap_t *mapp)
  663. {
  664. bus_dmamap_t map;
  665. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
  666. map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT);
  667. if (map == NULL)
  668. return (ENOMEM);
  669. /*
  670.  * Although we can dma data above 4GB, our
  671.  * "consistent" memory is below 4GB for
  672.  * space efficiency reasons (only need a 4byte
  673.  * address).  For this reason, we have to reset
  674.  * our dma mask when doing allocations.
  675.  */
  676. if(ahc->dev_softc)
  677. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
  678. pci_set_dma_mask(ahc->dev_softc, 0xFFFFFFFF);
  679. #else
  680. ahc->dev_softc->dma_mask = 0xFFFFFFFF;
  681. #endif
  682. *vaddr = pci_alloc_consistent(ahc->dev_softc,
  683.       dmat->maxsize, &map->bus_addr);
  684. if (ahc->dev_softc)
  685. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
  686. pci_set_dma_mask(ahc->dev_softc, ahc->platform_data->hw_dma_mask);
  687. #else
  688. ahc->dev_softc->dma_mask = ahc->platform_data->hw_dma_mask;
  689. #endif
  690. #else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) */
  691. /*
  692.  * At least in 2.2.14, malloc is a slab allocator so all
  693.  * allocations are aligned.  We assume for these kernel versions
  694.  * that all allocations will be bellow 4Gig, physically contiguous,
  695.  * and accessable via DMA by the controller.
  696.  */
  697. map = NULL; /* No additional information to store */
  698. *vaddr = malloc(dmat->maxsize, M_DEVBUF, M_NOWAIT);
  699. #endif
  700. if (*vaddr == NULL)
  701. return (ENOMEM);
  702. *mapp = map;
  703. return(0);
  704. }
  705. void
  706. ahc_dmamem_free(struct ahc_softc *ahc, bus_dma_tag_t dmat,
  707. void* vaddr, bus_dmamap_t map)
  708. {
  709. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
  710. pci_free_consistent(ahc->dev_softc, dmat->maxsize,
  711.     vaddr, map->bus_addr);
  712. #else
  713. free(vaddr, M_DEVBUF);
  714. #endif
  715. }
  716. int
  717. ahc_dmamap_load(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map,
  718. void *buf, bus_size_t buflen, bus_dmamap_callback_t *cb,
  719. void *cb_arg, int flags)
  720. {
  721. /*
  722.  * Assume for now that this will only be used during
  723.  * initialization and not for per-transaction buffer mapping.
  724.  */
  725. bus_dma_segment_t stack_sg;
  726. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
  727. stack_sg.ds_addr = map->bus_addr;
  728. #else
  729. stack_sg.ds_addr = VIRT_TO_BUS(buf);
  730. #endif
  731. stack_sg.ds_len = dmat->maxsize;
  732. cb(cb_arg, &stack_sg, /*nseg*/1, /*error*/0);
  733. return (0);
  734. }
  735. void
  736. ahc_dmamap_destroy(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map)
  737. {
  738. /*
  739.  * The map may is NULL in our < 2.3.X implementation.
  740.  */
  741. if (map != NULL)
  742. free(map, M_DEVBUF);
  743. }
  744. int
  745. ahc_dmamap_unload(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map)
  746. {
  747. /* Nothing to do */
  748. return (0);
  749. }
  750. /********************* Platform Dependent Functions ***************************/
  751. int
  752. ahc_softc_comp(struct ahc_softc *lahc, struct ahc_softc *rahc)
  753. {
  754. int value;
  755. int rvalue;
  756. int lvalue;
  757. /*
  758.  * Under Linux, cards are ordered as follows:
  759.  * 1) VLB/EISA BIOS enabled devices sorted by BIOS address.
  760.  * 2) PCI devices with BIOS enabled sorted by bus/slot/func.
  761.  * 3) All remaining VLB/EISA devices sorted by ioport.
  762.  * 4) All remaining PCI devices sorted by bus/slot/func.
  763.  */
  764. value = (lahc->flags & AHC_BIOS_ENABLED)
  765.       - (rahc->flags & AHC_BIOS_ENABLED);
  766. if (value != 0)
  767. /* Controllers with BIOS enabled have a *higher* priority */
  768. return (-value);
  769. /*
  770.  * Same BIOS setting, now sort based on bus type.
  771.  * EISA and VL controllers sort together.  EISA/VL
  772.  * have higher priority than PCI.
  773.  */
  774. rvalue = (rahc->chip & AHC_BUS_MASK);
  775.   if (rvalue == AHC_VL)
  776. rvalue = AHC_EISA;
  777. lvalue = (lahc->chip & AHC_BUS_MASK);
  778.   if (lvalue == AHC_VL)
  779. lvalue = AHC_EISA;
  780. value = lvalue - rvalue;
  781. if (value != 0)
  782. return (value);
  783. /* Still equal.  Sort by BIOS address, ioport, or bus/slot/func. */
  784. switch (rvalue) {
  785. case AHC_PCI:
  786. {
  787. char primary_channel;
  788. if (aic7xxx_reverse_scan != 0)
  789. value = ahc_get_pci_bus(rahc->dev_softc)
  790.       - ahc_get_pci_bus(lahc->dev_softc);
  791. else
  792. value = ahc_get_pci_bus(lahc->dev_softc)
  793.       - ahc_get_pci_bus(rahc->dev_softc);
  794. if (value != 0)
  795. break;
  796. if (aic7xxx_reverse_scan != 0)
  797. value = ahc_get_pci_slot(rahc->dev_softc)
  798.       - ahc_get_pci_slot(lahc->dev_softc);
  799. else
  800. value = ahc_get_pci_slot(lahc->dev_softc)
  801.       - ahc_get_pci_slot(rahc->dev_softc);
  802. if (value != 0)
  803. break;
  804. /*
  805.  * On multi-function devices, the user can choose
  806.  * to have function 1 probed before function 0.
  807.  * Give whichever channel is the primary channel
  808.  * the lowest priority.
  809.  */
  810. primary_channel = (lahc->flags & AHC_PRIMARY_CHANNEL) + 'A';
  811. value = 1;
  812. if (lahc->channel == primary_channel)
  813. value = -1;
  814. break;
  815. }
  816. case AHC_EISA:
  817. if ((rahc->flags & AHC_BIOS_ENABLED) != 0) {
  818. value = lahc->platform_data->bios_address
  819.       - rahc->platform_data->bios_address; 
  820. } else {
  821. value = lahc->bsh.ioport
  822.       - rahc->bsh.ioport; 
  823. }
  824. break;
  825. default:
  826. panic("ahc_softc_sort: invalid bus type");
  827. }
  828. return (value);
  829. }
  830. static void
  831. ahc_linux_setup_tag_info(char *p, char *end)
  832. {
  833. char *base;
  834. char *tok;
  835. char *tok_end;
  836. char *tok_end2;
  837. int      i;
  838. int      instance;
  839. int  targ;
  840. int  done;
  841. char  tok_list[] = {'.', ',', '{', '}', ''};
  842. if (*p != ':')
  843. return;
  844. instance = -1;
  845. targ = -1;
  846. done = FALSE;
  847. base = p;
  848. /* Forward us just past the ':' */
  849. tok = base + 1;
  850. tok_end = strchr(tok, '');
  851. if (tok_end < end)
  852. *tok_end = ',';
  853. while (!done) {
  854. switch (*tok) {
  855. case '{':
  856. if (instance == -1)
  857. instance = 0;
  858. else if (targ == -1)
  859. targ = 0;
  860. tok++;
  861. break;
  862. case '}':
  863. if (targ != -1)
  864. targ = -1;
  865. else if (instance != -1)
  866. instance = -1;
  867. tok++;
  868. break;
  869. case ',':
  870. case '.':
  871. if (instance == -1)
  872. done = TRUE;
  873. else if (targ >= 0)
  874. targ++;
  875. else if (instance >= 0)
  876. instance++;
  877. if ((targ >= AHC_NUM_TARGETS) ||
  878.     (instance >= NUM_ELEMENTS(aic7xxx_tag_info)))
  879. done = TRUE;
  880. tok++;
  881. if (!done) {
  882. base = tok;
  883. }
  884. break;
  885. case '':
  886. done = TRUE;
  887. break;
  888. default:
  889. done = TRUE;
  890. tok_end = strchr(tok, '');
  891. for (i = 0; tok_list[i]; i++) {
  892. tok_end2 = strchr(tok, tok_list[i]);
  893. if ((tok_end2) && (tok_end2 < tok_end)) {
  894. tok_end = tok_end2;
  895. done = FALSE;
  896. }
  897. }
  898. if ((instance >= 0) && (targ >= 0)
  899.  && (instance < NUM_ELEMENTS(aic7xxx_tag_info))
  900.  && (targ < AHC_NUM_TARGETS)) {
  901. aic7xxx_tag_info[instance].tag_commands[targ] =
  902.     simple_strtoul(tok, NULL, 0) & 0xff;
  903. }
  904. tok = tok_end;
  905. break;
  906. }
  907. }
  908. while ((p != base) && (p != NULL))
  909. p = strtok(NULL, ",.");
  910. }
  911. /*
  912.  * Handle Linux boot parameters. This routine allows for assigning a value
  913.  * to a parameter with a ':' between the parameter and the value.
  914.  * ie. aic7xxx=stpwlev:1,extended
  915.  */
  916. int
  917. aic7xxx_setup(char *s)
  918. {
  919. int i, n;
  920. char   *p;
  921. char   *end;
  922. static struct {
  923. const char *name;
  924. uint32_t *flag;
  925. } options[] = {
  926. { "extended", &aic7xxx_extended },
  927. { "no_reset", &aic7xxx_no_reset },
  928. { "verbose", &aic7xxx_verbose },
  929. { "reverse_scan", &aic7xxx_reverse_scan },
  930. { "no_probe", &aic7xxx_no_probe },
  931. { "periodic_otag", &aic7xxx_periodic_otag },
  932. { "pci_parity", &aic7xxx_pci_parity },
  933. { "seltime", &aic7xxx_seltime },
  934. { "tag_info", NULL }
  935. };
  936. end = strchr(s, '');
  937. for (p = strtok(s, ",."); p; p = strtok(NULL, ",.")) {
  938. for (i = 0; i < NUM_ELEMENTS(options); i++) {
  939. n = strlen(options[i].name);
  940. if (strncmp(options[i].name, p, n) != 0)
  941. continue;
  942. if (strncmp(p, "tag_info", n) == 0) {
  943. ahc_linux_setup_tag_info(p + n, end);
  944. } else if (p[n] == ':') {
  945. *(options[i].flag) =
  946.     simple_strtoul(p + n + 1, NULL, 0);
  947. } else if (!strncmp(p, "verbose", n)) {
  948. *(options[i].flag) = 1;
  949. } else {
  950. *(options[i].flag) = ~(*(options[i].flag));
  951. }
  952. break;
  953. }
  954. }
  955. register_reboot_notifier(&ahc_linux_notifier);
  956. return 1;
  957. }
  958. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
  959. __setup("aic7xxx=", aic7xxx_setup);
  960. #endif
  961. int aic7xxx_verbose;
  962. /*
  963.  * Try to detect an Adaptec 7XXX controller.
  964.  */
  965. int
  966. ahc_linux_detect(Scsi_Host_Template *template)
  967. {
  968. struct ahc_softc *ahc;
  969. int     found;
  970. /*
  971.  * Sanity checking of Linux SCSI data structures so
  972.  * that some of our hacks^H^H^H^H^Hassumptions aren't
  973.  * violated.
  974.  */
  975. if (offsetof(struct ahc_cmd_internal, end)
  976.   > offsetof(struct scsi_cmnd, host_scribble)) {
  977. printf("ahc_linux_detect: SCSI data structures changed.n");
  978. printf("ahc_linux_detect: Unable to attachn");
  979. return (0);
  980. }
  981. #ifdef MODULE
  982. /*
  983.  * If we've been passed any parameters, process them now.
  984.  */
  985. if (aic7xxx)
  986. aic7xxx_setup(aic7xxx);
  987. if (dummy_buffer[0] != 'P')
  988. printk(KERN_WARNING
  989. "aic7xxx: Please read the file /usr/src/linux/drivers/scsi/README.aic7xxxn"
  990. "aic7xxx: to see the proper way to specify options to the aic7xxx modulen"
  991. "aic7xxx: Specifically, don't use any commas when passing arguments ton"
  992. "aic7xxx: insmod or else it might trash certain memory areas.n");
  993. #endif
  994. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
  995. template->proc_name = "aic7xxx";
  996. #else
  997. template->proc_dir = &proc_scsi_aic7xxx;
  998. #endif
  999. template->sg_tablesize = AHC_NSEG;
  1000. #ifdef CONFIG_PCI
  1001. ahc_linux_pci_probe(template);
  1002. #endif
  1003. if (aic7xxx_no_probe == 0)
  1004. aic7770_linux_probe(template);
  1005. /*
  1006.  * Register with the SCSI layer all
  1007.  * controllers we've found.
  1008.  */
  1009. found = 0;
  1010. TAILQ_FOREACH(ahc, &ahc_tailq, links) {
  1011. if (ahc_linux_register_host(ahc, template) == 0)
  1012. found++;
  1013. }
  1014. aic7xxx_detect_complete++;
  1015. return (found);
  1016. }
  1017. int
  1018. ahc_linux_register_host(struct ahc_softc *ahc, Scsi_Host_Template *template)
  1019. {
  1020. char  buf[80];
  1021. struct Scsi_Host *host;
  1022. char *new_name;
  1023. u_long s;
  1024. template->name = ahc->description;
  1025. host = scsi_register(template, sizeof(struct ahc_softc *));
  1026. if (host == NULL)
  1027. return (ENOMEM);
  1028. ahc_lock(ahc, &s);
  1029. *((struct ahc_softc **)host->hostdata) = ahc;
  1030. ahc->platform_data->host = host;
  1031. host->can_queue = AHC_MAX_QUEUE;
  1032. host->cmd_per_lun = 2;
  1033. host->sg_tablesize = AHC_NSEG;
  1034. host->select_queue_depths = ahc_linux_select_queue_depth;
  1035. /* XXX No way to communicate the ID for multiple channels */
  1036. host->this_id = ahc->our_id;
  1037. host->irq = ahc->platform_data->irq;
  1038. host->max_id = (ahc->features & AHC_WIDE) ? 16 : 8;
  1039. host->max_lun = AHC_NUM_LUNS;
  1040. host->max_channel = (ahc->features & AHC_TWIN) ? 1 : 0;
  1041. ahc_set_unit(ahc, ahc_linux_next_unit());
  1042. sprintf(buf, "scsi%d", host->host_no);
  1043. new_name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
  1044. if (new_name != NULL) {
  1045. strcpy(new_name, buf);
  1046. ahc_set_name(ahc, new_name);
  1047. }
  1048. host->unique_id = ahc->unit;
  1049. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4)
  1050. scsi_set_pci_device(host, ahc->dev_softc);
  1051. #endif
  1052. ahc_linux_initialize_scsi_bus(ahc);
  1053. ahc_unlock(ahc, &s);
  1054. return (0);
  1055. }
  1056. uint64_t
  1057. ahc_linux_get_memsize()
  1058. {
  1059. struct sysinfo si;
  1060. si_meminfo(&si);
  1061. return (si.totalram << PAGE_SHIFT);
  1062. }
  1063. /*
  1064.  * Find the smallest available unit number to use
  1065.  * for a new device.  We don't just use a static
  1066.  * count to handle the "repeated hot-(un)plug"
  1067.  * scenario.
  1068.  */
  1069. static int
  1070. ahc_linux_next_unit()
  1071. {
  1072. struct ahc_softc *ahc;
  1073. int unit;
  1074. unit = 0;
  1075. retry:
  1076. TAILQ_FOREACH(ahc, &ahc_tailq, links) {
  1077. if (ahc->unit == unit) {
  1078. unit++;
  1079. goto retry;
  1080. }
  1081. }
  1082. return (unit);
  1083. }
  1084. /*
  1085.  * Place the SCSI bus into a known state by either resetting it,
  1086.  * or forcing transfer negotiations on the next command to any
  1087.  * target.
  1088.  */
  1089. void
  1090. ahc_linux_initialize_scsi_bus(struct ahc_softc *ahc)
  1091. {
  1092. int i;
  1093. int numtarg;
  1094. i = 0;
  1095. numtarg = 0;
  1096. if (aic7xxx_no_reset != 0)
  1097. ahc->flags &= ~(AHC_RESET_BUS_A|AHC_RESET_BUS_B);
  1098. if ((ahc->flags & AHC_RESET_BUS_A) != 0)
  1099. ahc_reset_channel(ahc, 'A', /*initiate_reset*/TRUE);
  1100. else
  1101. numtarg = (ahc->features & AHC_WIDE) ? 16 : 8;
  1102. if ((ahc->features & AHC_TWIN) != 0) {
  1103. if ((ahc->flags & AHC_RESET_BUS_B) != 0) {
  1104. ahc_reset_channel(ahc, 'B', /*initiate_reset*/TRUE);
  1105. } else {
  1106. if (numtarg == 0)
  1107. i = 8;
  1108. numtarg += 8;
  1109. }
  1110. }
  1111. for (; i < numtarg; i++) {
  1112. struct ahc_devinfo devinfo;
  1113. struct ahc_initiator_tinfo *tinfo;
  1114. struct ahc_tmode_tstate *tstate;
  1115. u_int our_id;
  1116. u_int target_id;
  1117. char channel;
  1118. channel = 'A';
  1119. our_id = ahc->our_id;
  1120. target_id = i;
  1121. if (i > 7 && (ahc->features & AHC_TWIN) != 0) {
  1122. channel = 'B';
  1123. our_id = ahc->our_id_b;
  1124. target_id = i % 8;
  1125. }
  1126. tinfo = ahc_fetch_transinfo(ahc, channel, our_id,
  1127.     target_id, &tstate);
  1128. tinfo->goal = tinfo->user;
  1129. /*
  1130.  * Don't try negotiations that require PPR messages
  1131.  * until we successfully retrieve Inquiry data.
  1132.  */
  1133. tinfo->goal.ppr_options = 0;
  1134. if (tinfo->goal.transport_version > SCSI_REV_2)
  1135. tinfo->goal.transport_version = SCSI_REV_2;
  1136. ahc_compile_devinfo(&devinfo, our_id, target_id,
  1137.    CAM_LUN_WILDCARD, channel, ROLE_INITIATOR);
  1138. ahc_update_neg_request(ahc, &devinfo, tstate,
  1139.        tinfo, /*force*/FALSE);
  1140. }
  1141. /* Give the bus some time to recover */
  1142. if ((ahc->flags & (AHC_RESET_BUS_A|AHC_RESET_BUS_B)) != 0) {
  1143. ahc_linux_freeze_sim_queue(ahc);
  1144. init_timer(&ahc->platform_data->reset_timer);
  1145. ahc->platform_data->reset_timer.data = (u_long)ahc;
  1146. ahc->platform_data->reset_timer.expires =
  1147.     jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000;
  1148. ahc->platform_data->reset_timer.function =
  1149.     ahc_linux_release_sim_queue;
  1150. add_timer(&ahc->platform_data->reset_timer);
  1151. }
  1152. }
  1153. int
  1154. ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg)
  1155. {
  1156. ahc->platform_data =
  1157.     malloc(sizeof(struct ahc_platform_data), M_DEVBUF, M_NOWAIT);
  1158. if (ahc->platform_data == NULL)
  1159. return (ENOMEM);
  1160. memset(ahc->platform_data, 0, sizeof(struct ahc_platform_data));
  1161. TAILQ_INIT(&ahc->platform_data->completeq);
  1162. TAILQ_INIT(&ahc->platform_data->device_runq);
  1163. ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
  1164. ahc_lockinit(ahc);
  1165. ahc_done_lockinit(ahc);
  1166. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
  1167. init_MUTEX_LOCKED(&ahc->platform_data->eh_sem);
  1168. #else
  1169. ahc->platform_data->eh_sem = MUTEX_LOCKED;
  1170. #endif
  1171. ahc->seltime = (aic7xxx_seltime & 0x3) << 4;
  1172. ahc->seltime_b = (aic7xxx_seltime & 0x3) << 4;
  1173. return (0);
  1174. }
  1175. void
  1176. ahc_platform_free(struct ahc_softc *ahc)
  1177. {
  1178. if (ahc->platform_data != NULL) {
  1179. if (ahc->platform_data->host != NULL)
  1180. scsi_unregister(ahc->platform_data->host);
  1181. if (ahc->platform_data->irq)
  1182. free_irq(ahc->platform_data->irq, ahc);
  1183. if (ahc->tag == BUS_SPACE_PIO
  1184.  && ahc->bsh.ioport != 0)
  1185. release_region(ahc->bsh.ioport, 256);
  1186. if (ahc->tag == BUS_SPACE_MEMIO
  1187.  && ahc->bsh.maddr != NULL) {
  1188. u_long base_addr;
  1189. base_addr = (u_long)ahc->bsh.maddr;
  1190. base_addr &= PAGE_MASK;
  1191. iounmap((void *)base_addr);
  1192. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1193. release_mem_region(ahc->platform_data->mem_busaddr,
  1194.    0x1000);
  1195. #endif
  1196. }
  1197. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1198. /* XXX Need an instance detach in the PCI code */
  1199. if (ahc->dev_softc != NULL)
  1200. ahc->dev_softc->driver = NULL;
  1201. #endif
  1202. free(ahc->platform_data, M_DEVBUF);
  1203. }
  1204. }
  1205. void
  1206. ahc_platform_freeze_devq(struct ahc_softc *ahc, struct scb *scb)
  1207. {
  1208. ahc_platform_abort_scbs(ahc, SCB_GET_TARGET(ahc, scb),
  1209. SCB_GET_CHANNEL(ahc, scb),
  1210. SCB_GET_LUN(scb), SCB_LIST_NULL,
  1211. ROLE_UNKNOWN, CAM_REQUEUE_REQ);
  1212. }
  1213. void
  1214. ahc_platform_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
  1215.       ahc_queue_alg alg)
  1216. {
  1217. struct ahc_linux_device *dev;
  1218. int was_queuing;
  1219. int now_queuing;
  1220. dev = ahc_linux_get_device(ahc, devinfo->channel - 'A',
  1221.    devinfo->target,
  1222.    devinfo->lun, /*alloc*/FALSE);
  1223. if (dev == NULL)
  1224. return;
  1225. was_queuing = dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED);
  1226. now_queuing = alg != AHC_QUEUE_NONE;
  1227. if ((dev->flags & AHC_DEV_FREEZE_TIL_EMPTY) == 0
  1228.  && (was_queuing != now_queuing)
  1229.  && (dev->active != 0)) {
  1230. dev->flags |= AHC_DEV_FREEZE_TIL_EMPTY;
  1231. dev->qfrozen++;
  1232. }
  1233. dev->flags &= ~(AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED|AHC_DEV_PERIODIC_OTAG);
  1234. if (now_queuing) {
  1235. if (!was_queuing) {
  1236. /*
  1237.  * Start out agressively and allow our
  1238.  * dynamic queue depth algorithm to take
  1239.  * care of the rest.
  1240.  */
  1241. dev->maxtags = AHC_MAX_QUEUE;
  1242. dev->openings = dev->maxtags - dev->active;
  1243. }
  1244. if (alg == AHC_QUEUE_TAGGED) {
  1245. dev->flags |= AHC_DEV_Q_TAGGED;
  1246. if (aic7xxx_periodic_otag != 0)
  1247. dev->flags |= AHC_DEV_PERIODIC_OTAG;
  1248. } else
  1249. dev->flags |= AHC_DEV_Q_BASIC;
  1250. } else {
  1251. /* We can only have one opening */
  1252. dev->maxtags = 0;
  1253. dev->openings =  1 - dev->active;
  1254. }
  1255. }
  1256. int
  1257. ahc_platform_abort_scbs(struct ahc_softc *ahc, int target, char channel,
  1258. int lun, u_int tag, role_t role, uint32_t status)
  1259. {
  1260. int chan;
  1261. int maxchan;
  1262. int targ;
  1263. int maxtarg;
  1264. int clun;
  1265. int maxlun;
  1266. int count;
  1267. if (tag != SCB_LIST_NULL)
  1268. return (0);
  1269. chan = 0;
  1270. if (channel != ALL_CHANNELS) {
  1271. chan = channel - 'A';
  1272. maxchan = chan + 1;
  1273. } else {
  1274. maxchan = (ahc->features & AHC_TWIN) ? 2 : 1;
  1275. }
  1276. targ = 0;
  1277. if (target != CAM_TARGET_WILDCARD) {
  1278. targ = target;
  1279. maxtarg = targ + 1;
  1280. } else {
  1281. maxtarg = (ahc->features & AHC_WIDE) ? 16 : 8;
  1282. }
  1283. clun = 0;
  1284. if (lun != CAM_LUN_WILDCARD) {
  1285. clun = lun;
  1286. maxlun = clun + 1;
  1287. } else {
  1288. maxlun = 16;
  1289. }
  1290. count = 0;
  1291. for (; chan < maxchan; chan++) {
  1292. for (; targ < maxtarg; targ++) {
  1293. for (; clun < maxlun; clun++) {
  1294. struct ahc_linux_device *dev;
  1295. struct ahc_busyq *busyq;
  1296. struct ahc_cmd *acmd;
  1297. dev = ahc_linux_get_device(ahc, chan,
  1298.    targ, clun,
  1299.    /*alloc*/FALSE);
  1300. if (dev == NULL)
  1301. continue;
  1302. busyq = &dev->busyq;
  1303. while ((acmd = TAILQ_FIRST(busyq)) != NULL) {
  1304. Scsi_Cmnd *cmd;
  1305. cmd = &acmd_scsi_cmd(acmd);
  1306. TAILQ_REMOVE(busyq, acmd,
  1307.      acmd_links.tqe);
  1308. count++;
  1309. cmd->result = status << 16;
  1310. ahc_linux_queue_cmd_complete(ahc, cmd);
  1311. }
  1312. }
  1313. }
  1314. }
  1315. return (count);
  1316. }
  1317. /*
  1318.  * Sets the queue depth for each SCSI device hanging
  1319.  * off the input host adapter.
  1320.  */
  1321. static void
  1322. ahc_linux_select_queue_depth(struct Scsi_Host * host,
  1323.      Scsi_Device * scsi_devs)
  1324. {
  1325. Scsi_Device *device;
  1326. struct ahc_softc *ahc;
  1327. u_long flags;
  1328. int scbnum;
  1329. ahc = *((struct ahc_softc **)host->hostdata);
  1330. ahc_lock(ahc, &flags);
  1331. scbnum = 0;
  1332. for (device = scsi_devs; device != NULL; device = device->next) {
  1333. if (device->host == host) {
  1334. ahc_linux_device_queue_depth(ahc, device);
  1335. scbnum += device->queue_depth;
  1336. }
  1337. }
  1338. ahc_unlock(ahc, &flags);
  1339. }
  1340. /*
  1341.  * Determines the queue depth for a given device.
  1342.  */
  1343. static void
  1344. ahc_linux_device_queue_depth(struct ahc_softc *ahc, Scsi_Device * device)
  1345. {
  1346. struct ahc_devinfo devinfo;
  1347. struct ahc_initiator_tinfo *targ_info;
  1348. struct ahc_tmode_tstate *tstate;
  1349. uint8_t tags;
  1350. ahc_compile_devinfo(&devinfo,
  1351.     device->channel == 0 ? ahc->our_id : ahc->our_id_b,
  1352.     device->id, device->lun,
  1353.     device->channel == 0 ? 'A' : 'B',
  1354.     ROLE_INITIATOR);
  1355. targ_info = ahc_fetch_transinfo(ahc, devinfo.channel,
  1356. devinfo.our_scsiid,
  1357. devinfo.target, &tstate);
  1358. tags = 0;
  1359. if (device->tagged_supported != 0
  1360.  && (ahc->user_discenable & devinfo.target_mask) != 0) {
  1361. if (ahc->unit >= NUM_ELEMENTS(aic7xxx_tag_info)) {
  1362. printf("aic7xxx: WARNING, insufficient "
  1363.        "tag_info instances for installed "
  1364.        "controllers. Using defaultsn");
  1365. printf("aic7xxx: Please update the "
  1366.        "aic7xxx_tag_info array in the "
  1367.        "aic7xxx.c source file.n");
  1368. tags = AHC_MAX_QUEUE;
  1369. } else {
  1370. adapter_tag_info_t *tag_info;
  1371. tag_info = &aic7xxx_tag_info[ahc->unit];
  1372. tags = tag_info->tag_commands[devinfo.target_offset];
  1373. if (tags > AHC_MAX_QUEUE)
  1374. tags = AHC_MAX_QUEUE;
  1375. }
  1376. }
  1377. if (tags != 0) {
  1378. device->queue_depth = tags;
  1379. ahc_set_tags(ahc, &devinfo, AHC_QUEUE_TAGGED);
  1380. printf("scsi%d:%c:%d:%d: Tagged Queuing enabled.  Depth %dn",
  1381.                ahc->platform_data->host->host_no, device->channel + 'A',
  1382.        device->id, device->lun, tags);
  1383. } else {
  1384. /*
  1385.  * We allow the OS to queue 2 untagged transactions to
  1386.  * us at any time even though we can only execute them
  1387.  * serially on the controller/device.  This should remove
  1388.  * some latency.
  1389.  */
  1390. device->queue_depth = 2;
  1391. }
  1392. }
  1393. /*
  1394.  * Queue an SCB to the controller.
  1395.  */
  1396. int
  1397. ahc_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
  1398. {
  1399. struct  ahc_softc *ahc;
  1400. struct  ahc_linux_device *dev;
  1401. u_long  flags;
  1402. ahc = *(struct ahc_softc **)cmd->host->hostdata;
  1403. /*
  1404.  * Save the callback on completion function.
  1405.  */
  1406. cmd->scsi_done = scsi_done;
  1407. ahc_lock(ahc, &flags);
  1408. dev = ahc_linux_get_device(ahc, cmd->channel, cmd->target,
  1409.    cmd->lun, /*alloc*/TRUE);
  1410. if (dev == NULL) {
  1411. ahc_unlock(ahc, &flags);
  1412. printf("aic7xxx_linux_queue: Unable to allocate device!n");
  1413. return (-ENOMEM);
  1414. }
  1415. cmd->result = CAM_REQ_INPROG << 16;
  1416. TAILQ_INSERT_TAIL(&dev->busyq, (struct ahc_cmd *)cmd, acmd_links.tqe);
  1417. if ((dev->flags & AHC_DEV_ON_RUN_LIST) == 0) {
  1418. TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
  1419. dev->flags |= AHC_DEV_ON_RUN_LIST;
  1420. ahc_linux_run_device_queues(ahc);
  1421. }
  1422. ahc_unlock(ahc, &flags);
  1423. return (0);
  1424. }
  1425. static void
  1426. ahc_linux_run_device_queue(struct ahc_softc *ahc, struct ahc_linux_device *dev)
  1427. {
  1428. struct  ahc_cmd *acmd;
  1429. struct  scsi_cmnd *cmd;
  1430. struct  scb *scb;
  1431. struct  hardware_scb *hscb;
  1432. struct  ahc_initiator_tinfo *tinfo;
  1433. struct  ahc_tmode_tstate *tstate;
  1434. uint16_t mask;
  1435. if ((dev->flags & AHC_DEV_ON_RUN_LIST) != 0)
  1436. panic("running device on run list");
  1437. while ((acmd = TAILQ_FIRST(&dev->busyq)) != NULL
  1438.     && dev->openings > 0 && dev->qfrozen == 0) {
  1439. /*
  1440.  * Schedule us to run later.  The only reason we are not
  1441.  * running is because the whole controller Q is frozen.
  1442.  */
  1443. if (ahc->platform_data->qfrozen != 0) {
  1444. TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq,
  1445.   dev, links);
  1446. dev->flags |= AHC_DEV_ON_RUN_LIST;
  1447. return;
  1448. }
  1449. /*
  1450.  * Get an scb to use.
  1451.  */
  1452. if ((scb = ahc_get_scb(ahc)) == NULL) {
  1453. TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq,
  1454.  dev, links);
  1455. dev->flags |= AHC_DEV_ON_RUN_LIST;
  1456. ahc->flags |= AHC_RESOURCE_SHORTAGE;
  1457. return;
  1458. }
  1459. TAILQ_REMOVE(&dev->busyq, acmd, acmd_links.tqe);
  1460. cmd = &acmd_scsi_cmd(acmd);
  1461. scb->io_ctx = cmd;
  1462. scb->platform_data->dev = dev;
  1463. hscb = scb->hscb;
  1464. cmd->host_scribble = (char *)scb;
  1465. /*
  1466.  * Fill out basics of the HSCB.
  1467.  */
  1468. hscb->control = 0;
  1469. hscb->scsiid = BUILD_SCSIID(ahc, cmd);
  1470. hscb->lun = cmd->lun;
  1471. mask = SCB_GET_TARGET_MASK(ahc, scb);
  1472. tinfo = ahc_fetch_transinfo(ahc, SCB_GET_CHANNEL(ahc, scb),
  1473.     SCB_GET_OUR_ID(scb),
  1474.     SCB_GET_TARGET(ahc, scb), &tstate);
  1475. hscb->scsirate = tinfo->scsirate;
  1476. hscb->scsioffset = tinfo->curr.offset;
  1477. if ((tstate->ultraenb & mask) != 0)
  1478. hscb->control |= ULTRAENB;
  1479. if ((ahc->user_discenable & mask) != 0)
  1480. hscb->control |= DISCENB;
  1481. if ((tstate->auto_negotiate & mask) != 0) {
  1482. scb->flags |= SCB_AUTO_NEGOTIATE;
  1483. scb->hscb->control |= MK_MESSAGE;
  1484. }
  1485. if ((dev->flags & (AHC_DEV_Q_TAGGED|AHC_DEV_Q_BASIC)) != 0) {
  1486. if (dev->commands_since_idle_or_otag == AHC_OTAG_THRESH
  1487.  && (dev->flags & AHC_DEV_Q_TAGGED) != 0) {
  1488. hscb->control |= MSG_ORDERED_TASK;
  1489. dev->commands_since_idle_or_otag = 0;
  1490. } else {
  1491. hscb->control |= MSG_SIMPLE_TASK;
  1492. }
  1493. }
  1494. hscb->cdb_len = cmd->cmd_len;
  1495. if (hscb->cdb_len <= 12) {
  1496. memcpy(hscb->shared_data.cdb, cmd->cmnd, hscb->cdb_len);
  1497. } else {
  1498. memcpy(hscb->cdb32, cmd->cmnd, hscb->cdb_len);
  1499. scb->flags |= SCB_CDB32_PTR;
  1500. }
  1501. scb->platform_data->xfer_len = 0;
  1502. ahc_set_residual(scb, 0);
  1503. ahc_set_sense_residual(scb, 0);
  1504. if (cmd->use_sg != 0) {
  1505. struct ahc_dma_seg *sg;
  1506. struct scatterlist *cur_seg;
  1507. struct scatterlist *end_seg;
  1508. int nseg;
  1509. cur_seg = (struct scatterlist *)cmd->request_buffer;
  1510. nseg = pci_map_sg(ahc->dev_softc, cur_seg, cmd->use_sg,
  1511.  scsi_to_pci_dma_dir(cmd ->sc_data_direction));
  1512. end_seg = cur_seg + nseg;
  1513. /* Copy the segments into the SG list. */
  1514. sg = scb->sg_list;
  1515. /*
  1516.  * The sg_count may be larger than nseg if
  1517.  * a transfer crosses a 32bit page.
  1518.  */ 
  1519. scb->sg_count = 0;
  1520. while(cur_seg < end_seg) {
  1521. bus_addr_t addr;
  1522. bus_size_t len;
  1523. int consumed;
  1524. addr = sg_dma_address(cur_seg);
  1525. len = sg_dma_len(cur_seg);
  1526. consumed = ahc_linux_map_seg(ahc, scb,
  1527.      sg, addr, len);
  1528. sg += consumed;
  1529. scb->sg_count += consumed;
  1530. cur_seg++;
  1531. }
  1532. sg--;
  1533. sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
  1534. /*
  1535.  * Reset the sg list pointer.
  1536.  */
  1537. scb->hscb->sgptr =
  1538.     ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
  1539. /*
  1540.  * Copy the first SG into the "current"
  1541.  * data pointer area.
  1542.  */
  1543. scb->hscb->dataptr = scb->sg_list->addr;
  1544. scb->hscb->datacnt = scb->sg_list->len;
  1545. } else if (cmd->request_bufflen != 0) {
  1546. struct  ahc_dma_seg *sg;
  1547. bus_addr_t addr;
  1548. sg = scb->sg_list;
  1549. addr = pci_map_single(ahc->dev_softc,
  1550.        cmd->request_buffer,
  1551.        cmd->request_bufflen,
  1552.        scsi_to_pci_dma_dir(cmd->sc_data_direction));
  1553. scb->sg_count = 0;
  1554. scb->sg_count = ahc_linux_map_seg(ahc, scb,
  1555.   sg, addr,
  1556.   cmd->request_bufflen);
  1557. sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
  1558. /*
  1559.  * Reset the sg list pointer.
  1560.  */
  1561. scb->hscb->sgptr =
  1562.     ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
  1563. /*
  1564.  * Copy the first SG into the "current"
  1565.  * data pointer area.
  1566.  */
  1567. scb->hscb->dataptr = sg->addr;
  1568. scb->hscb->datacnt = sg->len;
  1569. } else {
  1570. scb->hscb->sgptr = ahc_htole32(SG_LIST_NULL);
  1571. scb->hscb->dataptr = 0;
  1572. scb->hscb->datacnt = 0;
  1573. scb->sg_count = 0;
  1574. }
  1575. ahc_sync_sglist(ahc, scb, BUS_DMASYNC_PREWRITE);
  1576. LIST_INSERT_HEAD(&ahc->pending_scbs, scb, pending_links);
  1577. dev->openings--;
  1578. dev->active++;
  1579. dev->commands_issued++;
  1580. if ((dev->flags & AHC_DEV_PERIODIC_OTAG) != 0)
  1581. dev->commands_since_idle_or_otag++;
  1582. /*
  1583.  * We only allow one untagged transaction
  1584.  * per target in the initiator role unless
  1585.  * we are storing a full busy target *lun*
  1586.  * table in SCB space.
  1587.  */
  1588. if ((scb->hscb->control & (TARGET_SCB|TAG_ENB)) == 0
  1589.  && (ahc->features & AHC_SCB_BTT) == 0) {
  1590. struct scb_tailq *untagged_q;
  1591. int target_offset;
  1592. target_offset = SCB_GET_TARGET_OFFSET(ahc, scb);
  1593. untagged_q = &(ahc->untagged_queues[target_offset]);
  1594. TAILQ_INSERT_TAIL(untagged_q, scb, links.tqe);
  1595. scb->flags |= SCB_UNTAGGEDQ;
  1596. if (TAILQ_FIRST(untagged_q) != scb)
  1597. continue;
  1598. }
  1599. scb->flags |= SCB_ACTIVE;
  1600. ahc_queue_scb(ahc, scb);
  1601. }
  1602. }
  1603. /*
  1604.  * SCSI controller interrupt handler.
  1605.  */
  1606. void
  1607. ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs)
  1608. {
  1609. struct ahc_softc *ahc;
  1610. struct ahc_cmd *acmd;
  1611. u_long flags;
  1612. ahc = (struct ahc_softc *) dev_id;
  1613. ahc_lock(ahc, &flags); 
  1614. ahc_intr(ahc);
  1615. /*
  1616.  * It would be nice to run the device queues from a
  1617.  * bottom half handler, but as there is no way to
  1618.  * dynamically register one, we'll have to postpone
  1619.  * that until we get integrated into the kernel.
  1620.  */
  1621. ahc_linux_run_device_queues(ahc);
  1622. acmd = TAILQ_FIRST(&ahc->platform_data->completeq);
  1623. TAILQ_INIT(&ahc->platform_data->completeq);
  1624. ahc_unlock(ahc, &flags);
  1625. if (acmd != NULL)
  1626. ahc_linux_run_complete_queue(ahc, acmd);
  1627. }
  1628. void
  1629. ahc_platform_flushwork(struct ahc_softc *ahc)
  1630. {
  1631. struct ahc_cmd *acmd;
  1632. acmd = TAILQ_FIRST(&ahc->platform_data->completeq);
  1633. TAILQ_INIT(&ahc->platform_data->completeq);
  1634. if (acmd != NULL)
  1635. ahc_linux_run_complete_queue(ahc, acmd);
  1636. }
  1637. static struct ahc_linux_target*
  1638. ahc_linux_alloc_target(struct ahc_softc *ahc, u_int channel, u_int target)
  1639. {
  1640. struct ahc_linux_target *targ;
  1641. u_int target_offset;
  1642. targ = malloc(sizeof(*targ), M_DEVBUG, M_NOWAIT);
  1643. if (targ == NULL)
  1644. return (NULL);
  1645. memset(targ, 0, sizeof(*targ));
  1646. targ->channel = channel;
  1647. targ->target = target;
  1648. target_offset = target;
  1649. if (channel != 0)
  1650. target_offset += 8;
  1651. ahc->platform_data->targets[target_offset] = targ;
  1652. return (targ);
  1653. }
  1654. static void
  1655. ahc_linux_free_target(struct ahc_softc *ahc, struct ahc_linux_target *targ)
  1656. {
  1657. u_int target_offset;
  1658. target_offset = targ->target;
  1659. if (targ->channel != 0)
  1660. target_offset += 8;
  1661. ahc->platform_data->targets[target_offset] = NULL;
  1662. free(targ, M_DEVBUF);
  1663. }
  1664. static struct ahc_linux_device*
  1665. ahc_linux_alloc_device(struct ahc_softc *ahc,
  1666.  struct ahc_linux_target *targ, u_int lun)
  1667. {
  1668. struct ahc_linux_device *dev;
  1669. dev = malloc(sizeof(*dev), M_DEVBUG, M_NOWAIT);
  1670. if (dev == NULL)
  1671. return (NULL);
  1672. memset(dev, 0, sizeof(*dev));
  1673. TAILQ_INIT(&dev->busyq);
  1674. dev->flags = AHC_DEV_UNCONFIGURED;
  1675. dev->lun = lun;
  1676. dev->target = targ;
  1677. /*
  1678.  * We start out life using untagged
  1679.  * transactions of which we allow one.
  1680.  */
  1681. dev->openings = 1;
  1682. /*
  1683.  * Set maxtags to 0.  This will be changed if we
  1684.  * later determine that we are dealing with
  1685.  * a tagged queuing capable device.
  1686.  */
  1687. dev->maxtags = 0;
  1688. targ->refcount++;
  1689. targ->devices[lun] = dev;
  1690. return (dev);
  1691. }
  1692. static void
  1693. ahc_linux_free_device(struct ahc_softc *ahc, struct ahc_linux_device *dev)
  1694. {
  1695. struct ahc_linux_target *targ;
  1696. targ = dev->target;
  1697. targ->devices[dev->lun] = NULL;
  1698. free(dev, M_DEVBUF);
  1699. targ->refcount--;
  1700. if (targ->refcount == 0)
  1701. ahc_linux_free_target(ahc, targ);
  1702. }
  1703. /*
  1704.  * Return a string describing the driver.
  1705.  */
  1706. const char *
  1707. ahc_linux_info(struct Scsi_Host *host)
  1708. {
  1709. static char buffer[512];
  1710. char ahc_info[256];
  1711. char   *bp;
  1712. struct ahc_softc *ahc;
  1713. bp = &buffer[0];
  1714. ahc = *(struct ahc_softc **)host->hostdata;
  1715. memset(bp, 0, sizeof(buffer));
  1716. strcpy(bp, "Adaptec AIC7XXX EISA/VLB/PCI SCSI HBA DRIVER, Rev ");
  1717. strcat(bp, AIC7XXX_DRIVER_VERSION);
  1718. strcat(bp, "n");
  1719. strcat(bp, "        <");
  1720. strcat(bp, ahc->description);
  1721. strcat(bp, ">n");
  1722. strcat(bp, "        ");
  1723. ahc_controller_info(ahc, ahc_info);
  1724. strcat(bp, ahc_info);
  1725. strcat(bp, "n");
  1726. return (bp);
  1727. }
  1728. void
  1729. ahc_send_async(struct ahc_softc *ahc, char channel,
  1730.        u_int target, u_int lun, ac_code code, void *arg)
  1731. {
  1732. switch (code) {
  1733. case AC_TRANSFER_NEG:
  1734. {
  1735. char buf[80];
  1736. struct ahc_linux_target *targ;
  1737. struct info_str info;
  1738. struct ahc_initiator_tinfo *tinfo;
  1739. struct ahc_tmode_tstate *tstate;
  1740. int target_offset;
  1741. info.buffer = buf;
  1742. info.length = sizeof(buf);
  1743. info.offset = 0;
  1744. info.pos = 0;
  1745. tinfo = ahc_fetch_transinfo(ahc, channel,
  1746. channel == 'A' ? ahc->our_id
  1747.        : ahc->our_id_b,
  1748. target, &tstate);
  1749. /*
  1750.  * Don't bother reporting results while
  1751.  * negotiations are still pending.
  1752.  */
  1753. if (tinfo->curr.period != tinfo->goal.period
  1754.  || tinfo->curr.width != tinfo->goal.width
  1755.  || tinfo->curr.offset != tinfo->goal.offset
  1756.  || tinfo->curr.ppr_options != tinfo->goal.ppr_options)
  1757. if (bootverbose == 0)
  1758. break;
  1759. /*
  1760.  * Don't bother reporting results that
  1761.  * are identical to those last reported.
  1762.  */
  1763. target_offset = target;
  1764. if (channel == 'B')
  1765. target_offset += 8;
  1766. targ = ahc->platform_data->targets[target_offset];
  1767. if (targ != NULL
  1768.  && tinfo->curr.period == targ->last_tinfo.period
  1769.  && tinfo->curr.width == targ->last_tinfo.width
  1770.  && tinfo->curr.offset == targ->last_tinfo.offset
  1771.  && tinfo->curr.ppr_options == targ->last_tinfo.ppr_options)
  1772. if (bootverbose == 0)
  1773. break;
  1774. targ->last_tinfo.period = tinfo->curr.period;
  1775. targ->last_tinfo.width = tinfo->curr.width;
  1776. targ->last_tinfo.offset = tinfo->curr.offset;
  1777. targ->last_tinfo.ppr_options = tinfo->curr.ppr_options;
  1778. printf("(%s:%c:", ahc_name(ahc), channel);
  1779. if (target == CAM_TARGET_WILDCARD)
  1780. printf("*): ");
  1781. else
  1782. printf("%d): ", target);
  1783. ahc_format_transinfo(&info, &tinfo->curr);
  1784. if (info.pos < info.length)
  1785. *info.buffer = '';
  1786. else
  1787. buf[info.length - 1] = '';
  1788. printf("%s", buf);
  1789. break;
  1790. }
  1791.         case AC_SENT_BDR:
  1792. break;
  1793.         case AC_BUS_RESET:
  1794. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
  1795. if (ahc->platform_data->host != NULL) {
  1796. scsi_report_bus_reset(ahc->platform_data->host,
  1797.       channel - 'A');
  1798. }
  1799. #endif
  1800.                 break;
  1801.         default:
  1802.                 panic("ahc_send_async: Unexpected async event");
  1803.         }
  1804. }
  1805. /*
  1806.  * Calls the higher level scsi done function and frees the scb.
  1807.  */
  1808. void
  1809. ahc_done(struct ahc_softc *ahc, struct scb * scb)
  1810. {
  1811. Scsi_Cmnd *cmd;
  1812. struct ahc_linux_device *dev;
  1813. LIST_REMOVE(scb, pending_links);
  1814. if ((scb->flags & SCB_UNTAGGEDQ) != 0) {
  1815. struct scb_tailq *untagged_q;
  1816. int target_offset;
  1817. target_offset = SCB_GET_TARGET_OFFSET(ahc, scb);
  1818. untagged_q = &(ahc->untagged_queues[target_offset]);
  1819. TAILQ_REMOVE(untagged_q, scb, links.tqe);
  1820. ahc_run_untagged_queue(ahc, untagged_q);
  1821. }
  1822. if ((scb->flags & SCB_ACTIVE) == 0) {
  1823. printf("SCB %d done'd twicen", scb->hscb->tag);
  1824. ahc_dump_card_state(ahc);
  1825. panic("Stopping for safety");
  1826. }
  1827. cmd = scb->io_ctx;
  1828. dev = scb->platform_data->dev;
  1829. dev->active--;
  1830. dev->openings++;
  1831. ahc_linux_unmap_scb(ahc, scb);
  1832. if (scb->flags & SCB_SENSE) {
  1833. memcpy(cmd->sense_buffer, ahc_get_sense_buf(ahc, scb),
  1834.        MIN(sizeof(struct scsi_sense_data),
  1835.    sizeof(cmd->sense_buffer)));
  1836. cmd->result |= (DRIVER_SENSE << 24);
  1837. } else {
  1838. /*
  1839.  * Guard against stale sense data.
  1840.  * The Linux mid-layer assumes that sense
  1841.  * was retrieved anytime the first byte of
  1842.  * the sense buffer looks "sane".
  1843.  */
  1844. cmd->sense_buffer[0] = 0;
  1845. }
  1846. if (ahc_get_transaction_status(scb) == CAM_REQ_INPROG) {
  1847. uint32_t amount_xferred;
  1848. amount_xferred =
  1849.     ahc_get_transfer_length(scb) - ahc_get_residual(scb);
  1850. if (amount_xferred < scb->io_ctx->underflow) {
  1851. printf("Saw underflow (%ld of %ld bytes). "
  1852.        "Treated as errorn",
  1853. ahc_get_residual(scb),
  1854. ahc_get_transfer_length(scb));
  1855. ahc_set_transaction_status(scb, CAM_DATA_RUN_ERR);
  1856. } else {
  1857. ahc_set_transaction_status(scb, CAM_REQ_CMP);
  1858. ahc_linux_sniff_command(ahc, cmd, scb);
  1859. }
  1860. } else if (ahc_get_transaction_status(scb) == DID_OK) {
  1861. ahc_linux_handle_scsi_status(ahc, dev, scb);
  1862. } else if (ahc_get_transaction_status(scb) == DID_NO_CONNECT) {
  1863. /*
  1864.  * Should a selection timeout kill the device?
  1865.  * That depends on whether the selection timeout
  1866.  * is persistent.  Since we have no guarantee that
  1867.  * the mid-layer will issue an inquiry for this device
  1868.  * again, we can't just kill it off.
  1869. dev->flags |= AHC_DEV_UNCONFIGURED;
  1870.  */
  1871. }
  1872. if (dev->openings == 1
  1873.  && ahc_get_transaction_status(scb) == CAM_REQ_CMP
  1874.  && ahc_get_scsi_status(scb) != SCSI_STATUS_QUEUE_FULL)
  1875. dev->tag_success_count++;
  1876. /*
  1877.  * Some devices deal with temporary internal resource
  1878.  * shortages by returning queue full.  When the queue
  1879.  * full occurrs, we throttle back.  Slowly try to get
  1880.  * back to our previous queue depth.
  1881.  */
  1882. if ((dev->openings + dev->active) < dev->maxtags
  1883.  && dev->tag_success_count > AHC_TAG_SUCCESS_INTERVAL) {
  1884. dev->tag_success_count = 0;
  1885. dev->openings++;
  1886. }
  1887. if (dev->active == 0)
  1888. dev->commands_since_idle_or_otag = 0;
  1889. if (TAILQ_EMPTY(&dev->busyq)) {
  1890. if ((dev->flags & AHC_DEV_UNCONFIGURED) != 0
  1891.  && dev->active == 0)
  1892. ahc_linux_free_device(ahc, dev);
  1893. } else if ((dev->flags & AHC_DEV_ON_RUN_LIST) == 0) {
  1894. TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
  1895. dev->flags |= AHC_DEV_ON_RUN_LIST;
  1896. }
  1897. if ((scb->flags & SCB_RECOVERY_SCB) != 0) {
  1898. printf("Recovery SCB completesn");
  1899. up(&ahc->platform_data->eh_sem);
  1900. }
  1901. ahc_free_scb(ahc, scb);
  1902. ahc_linux_queue_cmd_complete(ahc, cmd);
  1903. }
  1904. static void
  1905. ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
  1906.      struct ahc_linux_device *dev, struct scb *scb)
  1907. {
  1908. /*
  1909.  * We don't currently trust the mid-layer to
  1910.  * properly deal with queue full or busy.  So,
  1911.  * when one occurs, we tell the mid-layer to
  1912.  * unconditionally requeue the command to us
  1913.  * so that we can retry it ourselves.  We also
  1914.  * implement our own throttling mechanism so
  1915.  * we don't clobber the device with too many
  1916.  * commands.
  1917.  */
  1918. switch (ahc_get_scsi_status(scb)) {
  1919. default:
  1920. break;
  1921. case SCSI_STATUS_QUEUE_FULL:
  1922. {
  1923. /*
  1924.  * By the time the core driver has returned this
  1925.  * command, all other commands that were queued
  1926.  * to us but not the device have been returned.
  1927.  * This ensures that dev->active is equal to
  1928.  * the number of commands actually queued to
  1929.  * the device.
  1930.  */
  1931. dev->tag_success_count = 0;
  1932. if (dev->active != 0) {
  1933. /*
  1934.  * Drop our opening count to the number
  1935.  * of commands currently outstanding.
  1936.  */
  1937. dev->openings = 0;
  1938. /*
  1939. ahc_print_path(ahc, scb);
  1940. printf("Dropping tag count to %dn", dev->active);
  1941.  */
  1942. if (dev->active == dev->tags_on_last_queuefull) {
  1943. dev->last_queuefull_same_count++;
  1944. /*
  1945.  * If we repeatedly see a queue full
  1946.  * at the same queue depth, this
  1947.  * device has a fixed number of tag
  1948.  * slots.  Lock in this tag depth
  1949.  * so we stop seeing queue fulls from
  1950.  * this device.
  1951.  */
  1952. if (dev->last_queuefull_same_count
  1953.  == AHC_LOCK_TAGS_COUNT) {
  1954. dev->maxtags = dev->active;
  1955. ahc_print_path(ahc, scb);
  1956. printf("Locking max tag count at %dn",
  1957.        dev->active);
  1958. }
  1959. } else {
  1960. dev->tags_on_last_queuefull = dev->active;
  1961. dev->last_queuefull_same_count = 0;
  1962. }
  1963. ahc_set_transaction_status(scb, CAM_REQUEUE_REQ);
  1964. ahc_set_scsi_status(scb, SCSI_STATUS_OK);
  1965. break;
  1966. }
  1967. /*
  1968.  * Drop down to a single opening, and treat this
  1969.  * as if the target return BUSY SCSI status.
  1970.  */
  1971. dev->openings = 1;
  1972. /* FALLTHROUGH */
  1973. }
  1974. case SCSI_STATUS_BUSY:
  1975. /*
  1976.  * XXX Set a timer and handle ourselves????
  1977.  * For now we pray that the mid-layer does something
  1978.  * sane for devices that are busy.
  1979.  */
  1980. ahc_set_scsi_status(scb, SCSI_STATUS_BUSY);
  1981. break;
  1982. }
  1983. }
  1984. static void
  1985. ahc_linux_filter_command(struct ahc_softc *ahc, Scsi_Cmnd *cmd, struct scb *scb)
  1986. {
  1987. switch (cmd->cmnd[0]) {
  1988. case INQUIRY:
  1989. {
  1990. struct ahc_devinfo devinfo;
  1991. struct scsi_inquiry *inq;
  1992. struct scsi_inquiry_data *sid;
  1993. struct ahc_initiator_tinfo *targ_info;
  1994. struct ahc_tmode_tstate *tstate;
  1995. struct ahc_syncrate *syncrate;
  1996. struct ahc_linux_device *dev;
  1997. u_int scsiid;
  1998. u_int maxsync;
  1999. int transferred_len;
  2000. int minlen;
  2001. u_int width;
  2002. u_int period;
  2003. u_int offset;
  2004. u_int ppr_options;
  2005.  /*
  2006.   * Validate the command.  We only want to filter
  2007.   * standard inquiry commands, not those querying
  2008.   * Vital Product Data.
  2009.   */
  2010. inq = (struct scsi_inquiry *)cmd->cmnd;
  2011. if ((inq->byte2 & SI_EVPD) != 0
  2012.  || inq->page_code != 0)
  2013. break;
  2014. if (cmd->use_sg != 0) {
  2015. printf("%s: SG Inquiry response ignoredn",
  2016.        ahc_name(ahc));
  2017. break;
  2018. }
  2019. transferred_len = ahc_get_transfer_length(scb)
  2020. - ahc_get_residual(scb);
  2021. sid = (struct scsi_inquiry_data *)cmd->request_buffer;
  2022. /*
  2023.  * Determine if this lun actually exists.  If so,
  2024.  * hold on to its corresponding device structure.
  2025.  * If not, make sure we release the device and
  2026.  * don't bother processing the rest of this inquiry
  2027.  * command.
  2028.  */
  2029. dev = ahc_linux_get_device(ahc, cmd->channel,
  2030.    cmd->target, cmd->lun,
  2031.    /*alloc*/FALSE);
  2032. if (transferred_len >= 1
  2033.  && SID_QUAL(sid) == SID_QUAL_LU_CONNECTED) {
  2034. dev->flags &= ~AHC_DEV_UNCONFIGURED;
  2035. } else {
  2036. dev->flags |= AHC_DEV_UNCONFIGURED;
  2037. break;
  2038. }
  2039. /*
  2040.  * Update our notion of this device's transfer
  2041.  * negotiation capabilities.
  2042.  */
  2043. scsiid = BUILD_SCSIID(ahc, cmd);
  2044. ahc_compile_devinfo(&devinfo, SCSIID_OUR_ID(scsiid),
  2045.     cmd->target, cmd->lun,
  2046.     SCSIID_CHANNEL(ahc, scsiid),
  2047.     ROLE_INITIATOR);
  2048. targ_info = ahc_fetch_transinfo(ahc, devinfo.channel,
  2049. devinfo.our_scsiid,
  2050. devinfo.target, &tstate);
  2051. width = targ_info->user.width;
  2052. period = targ_info->user.period;
  2053. offset = targ_info->user.offset;
  2054. ppr_options = targ_info->user.ppr_options;
  2055. minlen = offsetof(struct scsi_inquiry_data, version) + 1;
  2056. if (transferred_len >= minlen) {
  2057. targ_info->curr.protocol_version = SID_ANSI_REV(sid);
  2058. /*
  2059.  * Only attempt SPI3 once we've verified that
  2060.  * the device claims to support SPI3 features.
  2061.  */
  2062. if (targ_info->curr.protocol_version < SCSI_REV_2)
  2063. targ_info->curr.transport_version =
  2064.     SID_ANSI_REV(sid);
  2065. else
  2066. targ_info->curr.transport_version =
  2067.      SCSI_REV_2;
  2068. }
  2069. minlen = offsetof(struct scsi_inquiry_data, flags) + 1;
  2070. if (transferred_len >= minlen
  2071.  && (sid->additional_length + 4) >= minlen) {
  2072. if ((sid->flags & SID_WBus16) == 0)
  2073. width = MSG_EXT_WDTR_BUS_8_BIT;
  2074. if ((sid->flags & SID_Sync) == 0) {
  2075. period = 0;
  2076. offset = 0;
  2077. ppr_options = 0;
  2078. }
  2079. } else {
  2080. /* Keep current settings */
  2081. break;
  2082. }
  2083. minlen = offsetof(struct scsi_inquiry_data, spi3data) + 1;
  2084. /*
  2085.  * This is a kludge to deal with inquiry requests that
  2086.  * are not large enough for us to pull the spi3 bits.
  2087.  * In this case, we assume that a device that tells us
  2088.  * they can provide inquiry data that spans the SPI3
  2089.  * bits and says its SCSI3 can handle a PPR request.
  2090.  * If the inquiry request has sufficient buffer space to
  2091.  * cover these bits, we check them to see if any ppr options
  2092.  * are available.
  2093.  */
  2094. if ((sid->additional_length + 4) >= minlen) {
  2095. if (transferred_len >= minlen
  2096.  && (sid->spi3data & SID_SPI_CLOCK_DT) == 0)
  2097. ppr_options = 0;
  2098. if (targ_info->curr.protocol_version > SCSI_REV_2)
  2099. targ_info->curr.transport_version = 3;
  2100. else
  2101. ppr_options = 0;
  2102. } else {
  2103. ppr_options = 0;
  2104. }
  2105. ahc_validate_width(ahc, /*tinfo limit*/NULL, &width,
  2106.    ROLE_UNKNOWN);
  2107. if ((ahc->features & AHC_ULTRA2) != 0)
  2108. maxsync = AHC_SYNCRATE_DT;
  2109. else if ((ahc->features & AHC_ULTRA) != 0)
  2110. maxsync = AHC_SYNCRATE_ULTRA;
  2111. else
  2112. maxsync = AHC_SYNCRATE_FAST;
  2113. syncrate = ahc_find_syncrate(ahc, &period,
  2114.      &ppr_options, maxsync);
  2115. ahc_validate_offset(ahc, /*tinfo limit*/NULL, syncrate,
  2116.     &offset, width, ROLE_UNKNOWN);
  2117. if (offset == 0 || period == 0) {
  2118. period = 0;
  2119. offset = 0;
  2120. ppr_options = 0;
  2121. }
  2122. /* Apply our filtered user settings. */
  2123. ahc_set_width(ahc, &devinfo, width,
  2124.       AHC_TRANS_GOAL, /*paused*/FALSE);
  2125. ahc_set_syncrate(ahc, &devinfo, syncrate, period,
  2126.  offset, ppr_options, AHC_TRANS_GOAL,
  2127.  /*paused*/FALSE);
  2128. break;
  2129. }
  2130. default:
  2131. panic("ahc_linux_filter_command: Unexpected Command type  %xn",
  2132.       cmd->cmnd[0]);
  2133. break;
  2134. }
  2135. }
  2136. static void
  2137. ahc_linux_sem_timeout(u_long arg)
  2138. {
  2139. struct semaphore *sem;
  2140. sem = (struct semaphore *)arg;
  2141. up(sem);
  2142. }
  2143. static void
  2144. ahc_linux_freeze_sim_queue(struct ahc_softc *ahc)
  2145. {
  2146. ahc->platform_data->qfrozen++;
  2147. if (ahc->platform_data->qfrozen == 1)
  2148. scsi_block_requests(ahc->platform_data->host);
  2149. }
  2150. static void
  2151. ahc_linux_release_sim_queue(u_long arg)
  2152. {
  2153. struct ahc_softc *ahc;
  2154. u_long s;
  2155. int    unblock_reqs;
  2156. ahc = (struct ahc_softc *)arg;
  2157. unblock_reqs = 0;
  2158. ahc_lock(ahc, &s);
  2159. if (ahc->platform_data->qfrozen > 0)
  2160. ahc->platform_data->qfrozen--;
  2161. if (ahc->platform_data->qfrozen == 0) {
  2162. unblock_reqs = 1;
  2163. ahc_linux_run_device_queues(ahc);
  2164. }
  2165. ahc_unlock(ahc, &s);
  2166. /*
  2167.  * There is still a race here.  The mid-layer
  2168.  * should keep its own freeze count and use
  2169.  * a bottom half handler to run the queues
  2170.  * so we can unblock with our own lock held.
  2171.  */
  2172. if (unblock_reqs)
  2173. scsi_unblock_requests(ahc->platform_data->host);
  2174. }
  2175. static int
  2176. ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag)
  2177. {
  2178. struct ahc_softc *ahc;
  2179. struct ahc_cmd *acmd;
  2180. struct ahc_cmd *list_acmd;
  2181. struct ahc_linux_device *dev;
  2182. struct scb *pending_scb;
  2183. u_long s;
  2184. u_int  saved_scbptr;
  2185. u_int  active_scb_index;
  2186. u_int  last_phase;
  2187. int    retval;
  2188. int    paused;
  2189. int    wait;
  2190. int    disconnected;
  2191. paused = FALSE;
  2192. wait = FALSE;
  2193. ahc = *(struct ahc_softc **)cmd->host->hostdata;
  2194. acmd = (struct ahc_cmd *)cmd;
  2195. printf("%s:%d:%d:%d: Attempting to queue a%s messagen",
  2196.        ahc_name(ahc), cmd->channel, cmd->target, cmd->lun,
  2197.        flag == SCB_ABORT ? "n ABORT" : " TARGET RESET");
  2198. /*
  2199.  * It is a bug that the upper layer takes
  2200.  * this lock just prior to calling us.
  2201.  */
  2202. spin_unlock_irq(&io_request_lock);
  2203. ahc_lock(ahc, &s);
  2204. /*
  2205.  * First determine if we currently own this command.
  2206.  * Start by searching the device queue.  If not found
  2207.  * there, check the pending_scb list.  If not found
  2208.  * at all, and the system wanted us to just abort the
  2209.  * command return success.
  2210.  */
  2211. dev = ahc_linux_get_device(ahc, cmd->channel, cmd->target,
  2212.    cmd->lun, /*alloc*/FALSE);
  2213. if (dev == NULL) {
  2214. /*
  2215.  * No target device for this command exists,
  2216.  * so we must not still own the command.
  2217.  */
  2218. printf("%s:%d:%d:%d: Is not an active devicen",
  2219.        ahc_name(ahc), cmd->channel, cmd->target, cmd->lun);
  2220. retval = SUCCESS;
  2221. goto no_cmd;
  2222. }
  2223. TAILQ_FOREACH(list_acmd, &dev->busyq, acmd_links.tqe) {
  2224. if (list_acmd == acmd)
  2225. break;
  2226. }
  2227. if (list_acmd != NULL) {
  2228. printf("%s:%d:%d:%d: Command found on device queuen",
  2229.        ahc_name(ahc), cmd->channel, cmd->target, cmd->lun);
  2230. if (flag == SCB_ABORT) {
  2231. TAILQ_REMOVE(&dev->busyq, list_acmd, acmd_links.tqe);
  2232. cmd->result = DID_ABORT << 16;
  2233. ahc_linux_queue_cmd_complete(ahc, cmd);
  2234. retval = SUCCESS;
  2235. goto done;
  2236. }
  2237. }
  2238. /*
  2239.  * See if we can find a matching cmd in the pending list.
  2240.  */
  2241. LIST_FOREACH(pending_scb, &ahc->pending_scbs, pending_links) {
  2242. if (pending_scb->io_ctx == cmd)
  2243. break;
  2244. }
  2245. if (pending_scb == NULL && flag == SCB_DEVICE_RESET) {
  2246. /* Any SCB for this device will do for a target reset */
  2247. LIST_FOREACH(pending_scb, &ahc->pending_scbs, pending_links) {
  2248.    if (ahc_match_scb(ahc, pending_scb, cmd->target,
  2249.   cmd->channel, CAM_LUN_WILDCARD,
  2250.   SCB_LIST_NULL, ROLE_INITIATOR) == 0)
  2251. break;
  2252. }
  2253. }
  2254. if (pending_scb == NULL) {
  2255. printf("%s:%d:%d:%d: Command not foundn",
  2256.        ahc_name(ahc), cmd->channel, cmd->target, cmd->lun);
  2257. goto no_cmd;
  2258. }
  2259. if ((pending_scb->flags & SCB_RECOVERY_SCB) != 0) {
  2260. /*
  2261.  * We can't queue two recovery actions using the same SCB
  2262.  */
  2263. retval = FAILED;
  2264. goto  done;
  2265. }
  2266. /*
  2267.  * Ensure that the card doesn't do anything
  2268.  * behind our back.  Also make sure that we
  2269.  * didn't "just" miss an interrupt that would
  2270.  * affect this cmd.
  2271.  */
  2272. ahc->flags |= AHC_ALL_INTERRUPTS;
  2273. do {
  2274. ahc_intr(ahc);
  2275. ahc_pause(ahc);
  2276. ahc_clear_critical_section(ahc);
  2277. } while (ahc_inb(ahc, INTSTAT) & INT_PEND);
  2278. ahc->flags &= ~AHC_ALL_INTERRUPTS;
  2279. paused = TRUE;
  2280. ahc_dump_card_state(ahc);
  2281. if ((pending_scb->flags & SCB_ACTIVE) == 0) {
  2282. printf("%s:%d:%d:%d: Command already completedn",
  2283.        ahc_name(ahc), cmd->channel, cmd->target, cmd->lun);
  2284. goto no_cmd;
  2285. }
  2286. disconnected = TRUE;
  2287. if (flag == SCB_ABORT) {
  2288. if (ahc_search_qinfifo(ahc, cmd->target, cmd->channel + 'A',
  2289.        cmd->lun, pending_scb->hscb->tag,
  2290.        ROLE_INITIATOR, CAM_REQ_ABORTED,
  2291.        SEARCH_COMPLETE) > 0) {
  2292. printf("%s:%d:%d:%d: Cmd aborted from QINFIFOn",
  2293.        ahc_name(ahc), cmd->channel, cmd->target,
  2294. cmd->lun);
  2295. retval = SUCCESS;
  2296. goto done;
  2297. }
  2298. } else if (ahc_search_qinfifo(ahc, cmd->target, cmd->channel + 'A',
  2299.       cmd->lun, pending_scb->hscb->tag,
  2300.       ROLE_INITIATOR, /*status*/0,
  2301.       SEARCH_COUNT) > 0) {
  2302. disconnected = FALSE;
  2303. }
  2304. /*
  2305.  * At this point, pending_scb is the scb associated with the
  2306.  * passed in command.  That command is currently active on the
  2307.  * bus, is in the disconnected state, or we're hoping to find
  2308.  * a command for the same target active on the bus to abuse to
  2309.  * send a BDR.  Queue the appropriate message based on which of
  2310.  * these states we are in.
  2311.  */
  2312. last_phase = ahc_inb(ahc, LASTPHASE);
  2313. saved_scbptr = ahc_inb(ahc, SCBPTR);
  2314. active_scb_index = ahc_inb(ahc, SCB_TAG);
  2315. if (last_phase != P_BUSFREE
  2316.  && (pending_scb->hscb->tag == active_scb_index
  2317.   || (flag == SCB_DEVICE_RESET
  2318.    && SCSIID_TARGET(ahc, ahc_inb(ahc, SAVED_SCSIID)) == cmd->target))) {
  2319. /*
  2320.  * We're active on the bus, so assert ATN
  2321.  * and hope that the target responds.
  2322.  */
  2323. pending_scb = ahc_lookup_scb(ahc, active_scb_index);
  2324. pending_scb->flags |= SCB_RECOVERY_SCB|flag;
  2325. ahc_outb(ahc, MSG_OUT, HOST_MSG);
  2326. ahc_outb(ahc, SCSISIGO, last_phase|ATNO);
  2327. printf("%s:%d:%d:%d: Device is active, asserting ATNn",
  2328.        ahc_name(ahc), cmd->channel, cmd->target, cmd->lun);
  2329. wait = TRUE;
  2330. } else if (disconnected) {
  2331. /*
  2332.  * Actually re-queue this SCB in an attempt
  2333.  * to select the device before it reconnects.
  2334.  * In either case (selection or reselection),
  2335.  * we will now issue the approprate message
  2336.  * to the timed-out device.
  2337.  *
  2338.  * Set the MK_MESSAGE control bit indicating
  2339.  * that we desire to send a message.  We
  2340.  * also set the disconnected flag since
  2341.  * in the paging case there is no guarantee
  2342.  * that our SCB control byte matches the
  2343.  * version on the card.  We don't want the
  2344.  * sequencer to abort the command thinking
  2345.  * an unsolicited reselection occurred.
  2346.  */
  2347. pending_scb->hscb->control |= MK_MESSAGE|DISCONNECTED;
  2348. pending_scb->flags |= SCB_RECOVERY_SCB|flag;
  2349. /*
  2350.  * Remove any cached copy of this SCB in the
  2351.  * disconnected list in preparation for the
  2352.  * queuing of our abort SCB.  We use the
  2353.  * same element in the SCB, SCB_NEXT, for
  2354.  * both the qinfifo and the disconnected list.
  2355.  */
  2356. ahc_search_disc_list(ahc, cmd->target, cmd->channel + 'A',
  2357.      cmd->lun, pending_scb->hscb->tag,
  2358.      /*stop_on_first*/TRUE,
  2359.      /*remove*/TRUE,
  2360.      /*save_state*/FALSE);
  2361. /*
  2362.  * In the non-paging case, the sequencer will
  2363.  * never re-reference the in-core SCB.
  2364.  * To make sure we are notified during
  2365.  * reslection, set the MK_MESSAGE flag in
  2366.  * the card's copy of the SCB.
  2367.  */
  2368. if ((ahc->flags & AHC_PAGESCBS) == 0) {
  2369. ahc_outb(ahc, SCBPTR, pending_scb->hscb->tag);
  2370. ahc_outb(ahc, SCB_CONTROL,
  2371.  ahc_inb(ahc, SCB_CONTROL)|MK_MESSAGE);
  2372. }
  2373. /*
  2374.  * Clear out any entries in the QINFIFO first
  2375.  * so we are the next SCB for this target
  2376.  * to run.
  2377.  */
  2378. ahc_search_qinfifo(ahc, cmd->target, cmd->channel + 'A',
  2379.    cmd->lun, SCB_LIST_NULL, ROLE_INITIATOR,
  2380.    CAM_REQUEUE_REQ, SEARCH_COMPLETE);
  2381. ahc_print_path(ahc, pending_scb);
  2382. printf("Queuing a recovery SCBn");
  2383. ahc_qinfifo_requeue_tail(ahc, pending_scb);
  2384. ahc_outb(ahc, SCBPTR, saved_scbptr);
  2385. printf("%s:%d:%d:%d: Device is disconnected, re-queuing SCBn",
  2386.        ahc_name(ahc), cmd->channel, cmd->target, cmd->lun);
  2387. wait = TRUE;
  2388. } else {
  2389. printf("%s:%d:%d:%d: Unable to deliver messagen",
  2390.        ahc_name(ahc), cmd->channel, cmd->target, cmd->lun);
  2391. retval = FAILED;
  2392. goto done;
  2393. }
  2394. no_cmd:
  2395. /*
  2396.  * Our assumption is that if we don't have the command, no
  2397.  * recovery action was required, so we return success.  Again,
  2398.  * the semantics of the mid-layer recovery engine are not
  2399.  * well defined, so this may change in time.
  2400.  */
  2401. retval = SUCCESS;
  2402. done:
  2403. if (paused)
  2404. ahc_unpause(ahc);
  2405. if (wait) {
  2406. struct timer_list timer;
  2407. int ret;
  2408. ahc_unlock(ahc, &s);
  2409. init_timer(&timer);
  2410. timer.data = (u_long)&ahc->platform_data->eh_sem;
  2411. timer.expires = jiffies + (5 * HZ);
  2412. timer.function = ahc_linux_sem_timeout;
  2413. add_timer(&timer);
  2414. printf("Recovery code sleepingn");
  2415. down(&ahc->platform_data->eh_sem);
  2416. printf("Recovery code awaken");
  2417.          ret = del_timer(&timer);
  2418. if (ret == 0) {
  2419. printf("Timer Expiredn");
  2420. retval = FAILED;
  2421. }
  2422. ahc_lock(ahc, &s);
  2423. }
  2424. ahc_linux_run_device_queues(ahc);
  2425. acmd = TAILQ_FIRST(&ahc->platform_data->completeq);
  2426. TAILQ_INIT(&ahc->platform_data->completeq);
  2427. ahc_unlock(ahc, &s);
  2428. if (acmd != NULL)
  2429. ahc_linux_run_complete_queue(ahc, acmd);
  2430. spin_lock_irq(&io_request_lock);
  2431. return (retval);
  2432. }
  2433. /*
  2434.  * Abort the current SCSI command(s).
  2435.  */
  2436. int
  2437. ahc_linux_abort(Scsi_Cmnd *cmd)
  2438. {
  2439. int error;
  2440. error = ahc_linux_queue_recovery_cmd(cmd, SCB_ABORT);
  2441. if (error != 0)
  2442. printf("aic7xxx_abort returns 0x%xn", error);
  2443. return (error);
  2444. }
  2445. /*
  2446.  * Attempt to send a target reset message to the device that timed out.
  2447.  */
  2448. int
  2449. ahc_linux_dev_reset(Scsi_Cmnd *cmd)
  2450. {
  2451. int error;
  2452. error = ahc_linux_queue_recovery_cmd(cmd, SCB_DEVICE_RESET);
  2453. if (error != 0)
  2454. printf("aic7xxx_dev_reset returns 0x%xn", error);
  2455. return (error);
  2456. }
  2457. /*
  2458.  * Reset the SCSI bus.
  2459.  */
  2460. int
  2461. ahc_linux_bus_reset(Scsi_Cmnd *cmd)
  2462. {
  2463. struct ahc_softc *ahc;
  2464. struct ahc_cmd *acmd;
  2465. u_long s;
  2466. int    found;
  2467. /*
  2468.  * It is a bug that the upper layer takes
  2469.  * this lock just prior to calling us.
  2470.  */
  2471. spin_unlock_irq(&io_request_lock);
  2472. ahc = *(struct ahc_softc **)cmd->host->hostdata;
  2473. ahc_lock(ahc, &s);
  2474. found = ahc_reset_channel(ahc, cmd->channel + 'A',
  2475.   /*initiate reset*/TRUE);
  2476. acmd = TAILQ_FIRST(&ahc->platform_data->completeq);
  2477. TAILQ_INIT(&ahc->platform_data->completeq);
  2478. ahc_unlock(ahc, &s);
  2479. if (bootverbose)
  2480. printf("%s: SCSI bus reset delivered. "
  2481.        "%d SCBs aborted.n", ahc_name(ahc), found);
  2482. if (acmd != NULL)
  2483. ahc_linux_run_complete_queue(ahc, acmd);
  2484. spin_lock_irq(&io_request_lock);
  2485. return SUCCESS;
  2486. }
  2487. /*
  2488.  * Return the disk geometry for the given SCSI device.
  2489.  */
  2490. int
  2491. ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
  2492. {
  2493. int heads;
  2494. int sectors;
  2495. int cylinders;
  2496. int ret;
  2497. int extended;
  2498. struct ahc_softc *ahc;
  2499. struct buffer_head *bh;
  2500. ahc = *((struct ahc_softc **)disk->device->host->hostdata);
  2501. bh = bread(MKDEV(MAJOR(dev), MINOR(dev) & ~0xf), 0, block_size(dev));
  2502. if (bh) {
  2503. ret = scsi_partsize(bh, disk->capacity,
  2504.     &geom[2], &geom[0], &geom[1]);
  2505. brelse(bh);
  2506. if (ret != -1)
  2507. return (ret);
  2508. }
  2509. heads = 64;
  2510. sectors = 32;
  2511. cylinders = disk->capacity / (heads * sectors);
  2512. if (aic7xxx_extended != 0)
  2513. extended = 1;
  2514. else if (disk->device->channel == 0)
  2515. extended = (ahc->flags & AHC_EXTENDED_TRANS_A) != 0;
  2516. else
  2517. extended = (ahc->flags & AHC_EXTENDED_TRANS_B) != 0;
  2518. if (extended && cylinders >= 1024) {
  2519. heads = 255;
  2520. sectors = 63;
  2521. cylinders = disk->capacity / (heads * sectors);
  2522. }
  2523. geom[0] = heads;
  2524. geom[1] = sectors;
  2525. geom[2] = cylinders;
  2526. return (0);
  2527. }
  2528. /*
  2529.  * Free the passed in Scsi_Host memory structures prior to unloading the
  2530.  * module.
  2531.  */
  2532. int
  2533. ahc_linux_release(struct Scsi_Host * host)
  2534. {
  2535. struct ahc_softc *ahc;
  2536. if (host != NULL) {
  2537. ahc = *(struct ahc_softc **)host->hostdata;
  2538. ahc_free(ahc);
  2539. }
  2540. if (TAILQ_EMPTY(&ahc_tailq)) {
  2541. unregister_reboot_notifier(&ahc_linux_notifier);
  2542. #ifdef CONFIG_PCI
  2543. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  2544. pci_unregister_driver(&aic7xxx_pci_driver);
  2545. #endif
  2546. #endif
  2547. }
  2548. return (0);
  2549. }
  2550. void
  2551. ahc_platform_dump_card_state(struct ahc_softc *ahc)
  2552. {
  2553. struct ahc_linux_device *dev;
  2554. int channel;
  2555. int maxchannel;
  2556. int target;
  2557. int maxtarget;
  2558. int lun;
  2559. int i;
  2560. maxchannel = (ahc->features & AHC_TWIN) ? 1 : 0;
  2561. maxtarget = (ahc->features & AHC_WIDE) ? 15 : 7;
  2562. for (channel = 0; channel <= maxchannel; channel++) {
  2563. for (target = 0; target <=maxtarget; target++) {
  2564. for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
  2565. struct ahc_cmd *acmd;
  2566. dev = ahc_linux_get_device(ahc, channel, target,
  2567.    lun, /*alloc*/FALSE);
  2568. if (dev == NULL)
  2569. continue;
  2570. printf("DevQ(%d:%d:%d): ",
  2571.        channel, target, lun);
  2572. i = 0;
  2573. TAILQ_FOREACH(acmd, &dev->busyq,
  2574.       acmd_links.tqe) {
  2575. if (i++ > 256)
  2576. break;
  2577. }
  2578. printf("%d waitingn", i);
  2579. }
  2580. }
  2581. }
  2582. }
  2583. #if defined(MODULE) || LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  2584. static Scsi_Host_Template driver_template = AIC7XXX;
  2585. Scsi_Host_Template *aic7xxx_driver_template = &driver_template;
  2586. #include "../scsi_module.c"
  2587. #endif