linux/drivers/scsi/NCR_D700.c
<<
>>
Prefs
   1/* -*- mode: c; c-basic-offset: 8 -*- */
   2
   3/* NCR Dual 700 MCA SCSI Driver
   4 *
   5 * Copyright (C) 2001 by James.Bottomley@HansenPartnership.com
   6**-----------------------------------------------------------------------------
   7**  
   8**  This program is free software; you can redistribute it and/or modify
   9**  it under the terms of the GNU General Public License as published by
  10**  the Free Software Foundation; either version 2 of the License, or
  11**  (at your option) any later version.
  12**
  13**  This program is distributed in the hope that it will be useful,
  14**  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16**  GNU General Public License for more details.
  17**
  18**  You should have received a copy of the GNU General Public License
  19**  along with this program; if not, write to the Free Software
  20**  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21**
  22**-----------------------------------------------------------------------------
  23 */
  24
  25/* Notes:
  26 *
  27 * Most of the work is done in the chip specific module, 53c700.o
  28 *
  29 * TODO List:
  30 *
  31 * 1. Extract the SCSI ID from the voyager CMOS table (necessary to
  32 *    support multi-host environments.
  33 *
  34 * */
  35
  36
  37/* CHANGELOG 
  38 *
  39 * Version 2/2
  40 *
  41 * Added mca_set_adapter_name().
  42 *
  43 * Version 2/1
  44 *
  45 * Modularise the driver into a Board piece (this file) and a chip
  46 * piece 53c700.[ch] and 53c700.scr, added module options.  You can
  47 * now specify the scsi id by the parameters
  48 *
  49 * NCR_D700=slot:<n> [siop:<n>] id:<n> ....
  50 *
  51 * They need to be comma separated if compiled into the kernel
  52 *
  53 * Version 2/0
  54 *
  55 * Initial implementation of TCQ (Tag Command Queueing).  TCQ is full
  56 * featured and uses the clock algorithm to keep track of outstanding
  57 * tags and guard against individual tag starvation.  Also fixed a bug
  58 * in all of the 1.x versions where the D700_data_residue() function
  59 * was returning results off by 32 bytes (and thus causing the same 32
  60 * bytes to be written twice corrupting the data block).  It turns out
  61 * the 53c700 only has a 6 bit DBC and DFIFO registers not 7 bit ones
  62 * like the 53c710 (The 710 is the only data manual still available,
  63 * which I'd been using to program the 700).
  64 *
  65 * Version 1/2
  66 *
  67 * Much improved message handling engine
  68 *
  69 * Version 1/1
  70 *
  71 * Add code to handle selection reasonably correctly.  By the time we
  72 * get the selection interrupt, we've already responded, but drop off the
  73 * bus and hope the selector will go away.
  74 *
  75 * Version 1/0:
  76 *
  77 *   Initial release.  Fully functional except for procfs and tag
  78 * command queueing.  Has only been tested on cards with 53c700-66
  79 * chips and only single ended. Features are
  80 *
  81 * 1. Synchronous data transfers to offset 8 (limit of 700-66) and
  82 *    100ns (10MHz) limit of SCSI-2
  83 *
  84 * 2. Disconnection and reselection
  85 *
  86 * Testing:
  87 * 
  88 *  I've only really tested this with the 700-66 chip, but have done
  89 * soak tests in multi-device environments to verify that
  90 * disconnections and reselections are being processed correctly.
  91 * */
  92
  93#define NCR_D700_VERSION "2.2"
  94
  95#include <linux/blkdev.h>
  96#include <linux/interrupt.h>
  97#include <linux/kernel.h>
  98#include <linux/module.h>
  99#include <linux/mca.h>
 100#include <linux/slab.h>
 101#include <asm/io.h>
 102#include <scsi/scsi_host.h>
 103#include <scsi/scsi_device.h>
 104#include <scsi/scsi_transport.h>
 105#include <scsi/scsi_transport_spi.h>
 106
 107#include "53c700.h"
 108#include "NCR_D700.h"
 109
 110static char *NCR_D700;          /* command line from insmod */
 111
 112MODULE_AUTHOR("James Bottomley");
 113MODULE_DESCRIPTION("NCR Dual700 SCSI Driver");
 114MODULE_LICENSE("GPL");
 115module_param(NCR_D700, charp, 0);
 116
 117static __u8 id_array[2*(MCA_MAX_SLOT_NR + 1)] =
 118        { [0 ... 2*(MCA_MAX_SLOT_NR + 1)-1] = 7 };
 119
 120#ifdef MODULE
 121#define ARG_SEP ' '
 122#else
 123#define ARG_SEP ','
 124#endif
 125
 126static int __init
 127param_setup(char *string)
 128{
 129        char *pos = string, *next;
 130        int slot = -1, siop = -1;
 131
 132        while(pos != NULL && (next = strchr(pos, ':')) != NULL) {
 133                int val = (int)simple_strtoul(++next, NULL, 0);
 134
 135                if(!strncmp(pos, "slot:", 5))
 136                        slot = val;
 137                else if(!strncmp(pos, "siop:", 5))
 138                        siop = val;
 139                else if(!strncmp(pos, "id:", 3)) {
 140                        if(slot == -1) {
 141                                printk(KERN_WARNING "NCR D700: Must specify slot for id parameter\n");
 142                        } else if(slot > MCA_MAX_SLOT_NR) {
 143                                printk(KERN_WARNING "NCR D700: Illegal slot %d for id %d\n", slot, val);
 144                        } else {
 145                                if(siop != 0 && siop != 1) {
 146                                        id_array[slot*2] = val;
 147                                        id_array[slot*2 + 1] =val;
 148                                } else {
 149                                        id_array[slot*2 + siop] = val;
 150                                }
 151                        }
 152                }
 153                if((pos = strchr(pos, ARG_SEP)) != NULL)
 154                        pos++;
 155        }
 156        return 1;
 157}
 158
 159/* Host template.  The 53c700 routine NCR_700_detect will
 160 * fill in all of the missing routines */
 161static struct scsi_host_template NCR_D700_driver_template = {
 162        .module                 = THIS_MODULE,
 163        .name                   = "NCR Dual 700 MCA",
 164        .proc_name              = "NCR_D700",
 165        .this_id                = 7,
 166};
 167
 168/* We needs this helper because we have two hosts per struct device */
 169struct NCR_D700_private {
 170        struct device           *dev;
 171        struct Scsi_Host        *hosts[2];
 172        char                    name[30];
 173        char                    pad;
  75  76  17 {
 {
NCR_D700_private {
d;
siop] =   78slot = -1,   79  80 span[2];
  81Scsi_Host        *[2];
  82  83  84[2];
[2];
[2];
  85  86printk("NCR D700: Illegal slot %SIOPpan>, : Fanel  87"NCR D700: Illegal off,siop] =   18  89  90  91"id:",pan>,
  92
printk("NCR D700: Illegal slot %Fanel,x  93#defi1ne   94
  95#incl1ude &19                    igo(thintk" class="srit oon_fanel  96#incl1ude &196            s/scsi/NCR_D700.c#L158" id="L158" clas="line" 1name="L97">  97#incl1ude &19                     /scsi/NCR_D700.c#L158" id="L158" clas="line" nname="L98">  98#incl1ude &19             ent">/* We needs this helF missin>

  99#incl1ude &199ref="+code=ps" class="sref"href offsts[2];
 100#inc2ude &200ref="+code=ps" class="sref"href offsts[2];
;
siop] =  101#inc2ude &201ref="+code=ps" class="sref"href offsts[2];
[2];
 {
 {
 102#inc2ude &202ref="+code=ps" class="sref"href offsts[2];
 103#inc2ude &20"comm/scsi/NCR_D700.c#L1718Cegal slot ss="line"2name="L104"> 104#inc2ude &204            ent">/* We needs this helare be ones 105#inc2ude &205ref="+code=ps" class="sref"hrefsts[2];
 span>
 span>
NCR_D700_driver_template = {
;
 106
 107#inc2ude &20                     ot" class="srefrefsts[2];
 108#inc2ude &20                    }go(thintk" class="sr>

 109
 110stat2c cha21"comm/scsi/NCR_D700.c#L158" id="L158" cl2ss="line"2name="L111"> 111
d;
hosts[2];
siop] = [2];
 112/* We needs this helFIXME:is w00-66 cpan>
SUSf="drivers/scsi/NCR_D700.c#L24" id="L24" classss="line"2name="L113"> 113[2];
this_id                = THIS_MODULE" clasfref">id_array[slot*2 + siop] =  114[2];
[[ 115[2];
 116
scan_hrefsts[2];
scan_hrefde=KERN_WARNING" clahrefsts[2];
 117stat2c  118    2   { 20 ... 2*( 119
 120#ifd2f 
 121#def2ne  122#els2
 123#def2ne [2];
 124#end2f
 125
 126stat2c int2 127 128{
[2];
 129    2   ch2r *(offsts[2];
 130    2   in2  131
NCR_D700_private {
d;
NCR_D700_private {
offsts[2];
 132    2   wh23             e=slot" class="srefi_array[ 133    2     23"comm/scsi/NCR_D700.c#L1718Cegal slot ss="line"2name="L134"> 134
[ 135    2     2     if(!d;
hosts[2];
[ 136    2     2              spaninttrchr(d;
hosts[2];
[[ 137    2     2     else if(! 138    2     23ivers/scsi/NCR_D700.c#L159" id="L159" cl2ss="line"2name="L139"> 139    2     2     else if(!="driveot" class="sreffoun[,
IRQ_NONHivers/scsi/NCR_D700.c#L1718Cegal slot ss="line"2name="L140"> 140    2     2      s/scsi/NCR_D700.c#L158" id="L158" cl2ss="line"2name="L141"> 141    2     24ivers/scsi/NCR_D700.c#L132" id="L132" cl2ss="line"2name="L142"> 142    2     24"comment"> *    100ns (10MH/* D
 143    2     24"comment"> * bus and hope the /spahiiva the electec 144    2     24"comment"> * 2. Disconnection (thsinterrm re asruct se f="drivers/scsi/NCR_D700.c#L89" id="L89" clas2ss="line"2name="L145"> 145    2     24"comment"> * Version 1/0:nelef="drivers/scsi/NCR_D700.c#L161" id="L161" cl2ss="line"2name="L146"> 146    2     24a href="+code=_/scsi/NCR_D700.c#L126" id="L126" cl2ss="line"2name="L147"> 147    2     24de=param_setup" clas/a> {
 {
device           *dev;
 148    2     24rivers/scsi/NCR_D700.c#L129" id="L129" cl2ss="line"2name="L149"> 149    2     2              code=Scsi_Host" class= class="sref">NCR_D700_private {
d;
 150    2     2              e=slot" class="srefdifferthiival;
 151    2     25ct netrchr(netiver+cors/scsi/NCR_D700.c#L157" id="L157" cl2ss="line"2name="L152"> 152    2     2     }
device       mca_ef">deriveros" class="sref"mca_ef"vice       mca_ef"iver=THIS_MODULE" clasto_mca_ef">device       to_mca_ef">dede=KEot" class="srefddev;
 153    2     2     if((slot = -1,        mca_ef"iver-de=Ms" class="sref"">slot = -1,  154    2     2              155    2   }
2a href="drivere=slot" class="srefirq_array[[ 156    2   re2urn 1;
os3rintk(os3fsts[2];
os3fivers RN_WARNING" cla>os3bsts[2];
os3bivers RN_WARNING" cla>os4sts[2];
os4ivers/scsi/NCR_D700.c#L1718Cegal slot ss="line"2name="L157"> 157}
( 158
 159 *    100ns (10MH/* enable bo66< t;
 160os4sts[2];
os4ivercods" class="sref"mca_ef">de_s w0_>pos++;
de_s w0_>pode=KEot" class="srefmca_ef"vice       mca_ef"iver, 4rs/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L161"> 161stat2c str261ref="+code=ps" class="sref">os4sts[2];
os4iverc|co0x4s/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L162"> 162    2   .<262ref="+code=ps" class="sref"mca_ef">de_write_>pos++;
de_write_>pode=KEot" class="srefmca_ef"vice       mca_ef"iver, 4s RN_WARNING" cla>os4sts[2];
os4iverrs/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L163"> 163    2   .<26"comm/scsi/NCR_D700.c#L1718Cegal slot ss="line"2name="L164"> 164    2   .<26href="+code=ps" class="sref"mca_ef">de_write_>pos++;
de_write_>pode=KEot" class="srefmca_ef"vice       mca_ef"iver, 6, 9rs/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L165"> 165    2   .<265ref="+code=ps" class="sref"pos3jd;
de_s w0_>pos++;
de_s w0_>pode=KEot" class="srefmca_ef"vice       mca_ef"iver, 3rs/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L166"> 166};
<2 href266ref="+code=ps" class="sref"mca_ef">de_write_>pos++;
de_write_>pode=KEot" class="srefmca_ef"vice       mca_ef"iver, 6, 1rrs/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L167"> 167
os3rintk(de_s w0_>pos++;
de_s w0_>pode=KEot" class="srefmca_ef"vice       mca_ef"iver, 3rs/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L168"> 168de_write_>pos++;
de_write_>pode=KEot" class="srefmca_ef"vice       mca_ef"iver, 6, rrs/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L169"> 169stru2t os3fsts[2];
os3fivercods" class="sref"mca_ef">de_s w0_>pos++;
de_s w0_>pode=KEot" class="srefmca_ef"vice       mca_ef"iver, 3rs/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L170"> 170    2   st270ref="+code=ps" class="sref"mca_ef">de_write_>pos++;
de_write_>pode=KEot" class="srefmca_ef"vice       mca_ef"iver, 6, 1rs/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L171"> 171    2   st271ref="+code=ps" class="sref">os3bsts[2];
os3bivercods" class="sref"mca_ef">de_s w0_>pos++;
de_s w0_>pode=KEot" class="srefmca_ef"vice       mca_ef"iver, 3rs/scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L172"> 172    2   ch2r     /scsi/NCR_D700.c#L144" id="L144" cl2ss="line"2name="L173"> 173    2   ch273ref="+code=ps" class="sref"basC_addtrchr(;
os3rintk(,     2([2];
os3fivercude/ig=i 8) |!RN_WARNING" cla>os3bsts[2];
os3biverr ode=si0xffffff70s/scsi/NCR_D700.c#L1718Cegal slot s="line"2name="L75">  75  76[[2];
os4ivercode=si0x3)coders/scsi/NCR_D700.c#L157" id="L157" cl2s="line" 2aame="L17">  17  78  79netrchr(netiverers/scsi/NCR_D700.c#L140" id="L140" cl2s="line" 2name="L80">  80printk("NCR D700: Illegal slot %D700.c V.c#oon  href="+code=csi_Host" class= class="sVERS>MODULE_DESCRIPTIO class="sVERS>MO("NCR D700: Illegal  81"NCR D700: Illegal slot % Copyright (c)&2001 by uot;<.span>);
<@HansenPartnetship.com  82"NCR D700: Illegal slot 
  83netrchr(netiver+co0s/scsi/NCR_D700.c#L1718Cegal slot s;d for i2name="L84">  84  85 *    100ns (10MH/* now dthhm tselereref=d transformef="drivers/scsi/NCR_D700.c#L161" id="L161" cl2s="line" 2name="L86">  86[de_transform_irq_array[de_transform_irqde=KEot" class="srefmca_ef"vice       mca_ef"iver, s" class="sref"irq_array[  87(de_transform_i="
[de_transform_i="
       mca_ef"iver, s" class="sref"basC_addtrchr(  18(de_transform_i="
[de_transform_i="
       mca_ef"iver, s" class="sref"f 700-_addtrchr(  89  90f">printk("NCR D700: Illegal slot %foun,xslot = -1, (  91  92
/* We needs this heoutb(BOARD_RESET, b"sC_addt);="drivers/scsi/NCR_D700.c#L161" id="L161" cl2ss="line"2name="L93">  93#defi2ne   94
 *    100ns (10MH/* clear any pre  95#incl2ude &29             (voidimple_strtoul" cinbsts[2];
(  96#incl2ude &296            snt"> *    100ns (10MH/* get modctl, us=d ref=rpuot;00-tspandiff bieef="drivers/scsi/NCR_D700.c#L161" id="L161" cl2s="line" 2name="L97">  97#incl2ude &29             switchEot" class="srefdifferthiival;
[2];
(  98#incl2ude &29             c"sC+0x00:/scsi/NCR_D700.c#L120" id="L120" cl2s="line" 2name="L99">  99#incl2ude &29                     snt"> *    100ns (10MH/* only7SIOP1 differthiivaf="drivers/scsi/NCR_D700.c#L161" id="L161" cl3ss="line"3name="L100"> 100#inc3ude &30                    }s" class="sref"differthiival;
 101#inc3ude &30ct   92
 103#inc3ude &30                     *    100ns (10MH/* spah7SIOPs differthiivaf="drivers/scsi/NCR_D700.c#L161" id="L161" cl3s4"line" 3name="L94">  94
;
  95#incl3ude &30    if(!  96#incl3ref="306            c"sC+0x03:/scsi/NCR_D700.c#L120" id="L120" cl3s7"line" 3name="L97">  97#incl3ude &30                     ont"> *    100ns (10MH/* No7SIOPs differthiivaf="drivers/scsi/NCR_D700.c#L161" id="L161" cl3s8"line" 3name="L98">  98#incl3ude &30                    }s" class="sref"differthiival;
 109
 110stat3c cha31             default:/scsi/NCR_D700.c#L120" id="L120" cl3ss="line"3name="L111"> 111
f">printk("NCR D700: Illegalt %UNEXPECTED DIFFERENTIAL RESULTo0xpan>,02x 112;
 113 114 115 116
 117stat3c intk([2];
intk( 118    3   { 30 ... 2*( 119
 120#ifd3f  121#def3ne d;
;
dev;
 122#els3
d;
#d;
#ivers cizeof(RN_WARNING" cla>d;
#d;
#iver)ring">"id:",L171(pan>,s) href="+code=slot" class="sref"drf">proc_name    "drf">prde=KERN_WARNING" claddev;
 123#def3ne [[([d;
#d;
#ivers rncmp" class="s>intk( 124#end3f
f">printk("NCR D700: Illegalt %itque h_irq fanel<
 125
intk( 126stat3c int32             127 128{
/* We needs this helplumbssinbpah7 �-gle e="drivers/scsi/NCR_D700.c#L161" id="L161" cl3s="line" 3name="L129"> 129    3   ch32             uot;ERN_WARNING" clai_array[ 130    3   in33                    }e=slot" class="srefertrchr( 131
 132    3   wh33            } else ife=;EERN_WARNING" claertrchr( {
 {
intk([slot = -1,  133    3     33                    ([ 134
;
 135    3     3     if(!f">printk("NCR D700: Illegalt %SIOPpan>, : hrobe fanel<, ertot;co7;d\n& 136    3     3             [ 137    3     3     else if(! 138    3     33                    } el"+cods" class="sref"foun 139    3     33             s/scsi/NCR_D700.c#L158" id="L158" cl3ss="line"3name="L140"> 140    3     34"comm/scsi/NCR_D700.c#L158" id="L158" cl3ss="line"3name="L141"> 141    3     341ref="+code=tif strncmp" class="sfoun 142    3     34    }
intk( 143    3     34                    <="drive-ot" class="srefENODEVop] =  144    3     34href="+code=ps/scsi/NCR_D700.c#L158" id="L158" cl3ss="line"3name="L145"> 145    3     34ivers/scsi/NCR_D700.c#L126" id="L126" cl3ss="line"3name="L146"> 146    3     346ref="+code=ps" class="sref"mca_ef">de_00-_="Lim_array[de_00-_="Limde=KEot" class="srefmca_ef"vice       mca_ef"iver, 1rs/scsi/NCR_D700.c#L144" id="L144" cl3ss="line"3name="L147"> 147    3     34    else if(!RN_WARNING" clamca_ef">de_00-_/a>#d;
de_00-_/a>#de=KEot" class="srefmca_ef"vice       mca_ef"iver, ng">"id:",pan>,
 148    3     348ref="+code=ps" class="sref""drf00-_drv>offsts[2];
offde=KERN_WARNING" claddev;
 149    3     34    else if(!="drive0s/scsi/NCR_D700.c#L1718Cegal slot ss="line"3name="L150"> 150    3     35     s/scsi/NCR_D700.c#L158" id="L158" cl3ss="line"3name="L151"> 151    3     35ivers/scsi/NCR_D700.c#L132" id="L132" cl3ss="line"3name="L152"> 152    3     3     }co"+codvoid/scsi/NCR_D700.c#L132" id="L132" cl3ss="line"3name="L153"> 153    3     3     iIS_MODULE" clas/a> {
 {
Scsi_Host        *[2];
 154    3     3      s/scsi/NCR_D700.c#L140" id="L140" cl3ss="line"3name="L155"> 155    3   }
355ref="+code=ps" class="sref"140" remove_hrefsts[2];
remove_hrefde=KERN_WARNING" clahrefsts[2];
 156    3   re356ref="+code=ps" class="sref"egal
 
[2];
 157}
[2];
[2];
 158
[[2];
[ 159[2];
 160 161stat3c str36ivers/scsi/NCR_D700.c#L132" id="L132" cl3ss="line"3name="L162"> 162    3   .<36    }co"+code=_/scsi/NCR_D700.c#L126" id="L126" cl3ss="line"3name="L163"> 163    3   .<36    iIS_MODULE" clas/a> {
 {
device           *dev;
 164    3   .<36     s/scsi/NCR_D700.c#L140" id="L140" cl3ss="line"3name="L165"> 165    3   .<365ref="+code=pcode=Scsi_Host" class= class="sref">NCR_D700_private {
d;
offsts[2];
offde=KERN_WARNING" claddev;
 166};
<3 href366ref="+code=pe=slot" class="srefi_array[ 167
 168[ 169stru3t  {
 {
d;
hosts[2];
[ 170    3   st37"comm/scsi/NCR_D700.c#L158" id="L158" cl3ss="line"3name="L171"> 171    3   st371ref="+code=ps" class="sref"kfreCR_D700_privateintk( 172    3   ch37    }
 173    3   ch373ref=s/scsi/NCR_D700.c#L158" id="L158" cl37;d for i3 %d\n&quoE,     3  75([  76  17       mca_e700.c"strini_Host" class= class="se700.cvice        class="se700.civer+cos/scsi/NCR_D700.c#L140" id="L140" cl3s="line" 3name="L78">  78( {
(  79       e700.civer+cos/scsi/NCR_D700.c#L140" id="L140" cl3s="line" 3name="L80">  80#d;
#iver          }= ng">"id:",pan>,
  81[2];
  82 {
 {
  83 {
 {
  84  85  86  87[2];
  18  89[2];
  90  91  92
  93#defi3ne   94
        class="se700.civer)s/scsi/NCR_D700.c#L1718Cegal slot ss="line"3name="L95">  95#incl3ude &39     s/scsi/NCR_D700.c#L158" id="L158" cl3s="line" 3name="L96">  96#incl3ude &396ref=/scsi/NCR_D700.c#L158" id="L158" cl3s="line" 3name="L97">  97#incl3ude &39    eco"+codvoiddot" class="sref__exifsts[2];
[2];
  98#incl3ude &39rivers/scsi/NCR_D700.c#L129" id="L129" cl3s="line" 3name="L99">  99#incl3ude &399ref="+code=ps" class="sref"mca_unit oster_e700.cvice       mca_unit oster_e700.cde=KEode=sR_D700_driver_t class="se700.cvice        class="se700.civer)s/scsi/NCR_D700.c#L1718Cegal slot ss="line"4name="L100"> 100#inc4ude &40     s/scsi/NCR_D700.c#L158" id="L158" cl4s="line" 4name="L101"> 101#inc4ude &40ivers/scsi/NCR_D700.c#L132" id="L132" cl4s2"line" 4name="L92">  92
[2];
  93#defi4ude &40    iIS_MODULE" clasmodulesexifsts[2];
  94
  95#incl4ude &40    iot" class="sref__a hreR_D700_private<__a hrede=KERg">"id:",pan>,
  96#incl4ref="406    
footer"> The original LXR software by hm tscsi/NCR_http://sourceforge.net/projects/lxr">LXR eds unifyiverARthmantxperi thial 0.c#oon by scsi/NCR_mailto:lxr@ 9ux.no">lxr@ 9ux.noiver.
subfooter"> lxr. 9ux.no kindly devied by scsi/NCR_http://www.redpill- 9pro.no">Redpill L 9pro ASiverARprovidersutiL 9uxhe esultspanand oper"+c es ser *