1                        VME Device Driver API
   2                        =====================
   4Driver registration
   7As with other subsystems within the Linux kernel, VME device drivers register
   8with the VME subsystem, typically called from the devices init routine.  This is
   9achieved via a call to the following function:
  11        int vme_register_driver (struct vme_driver *driver);
  13If driver registration is successful this function returns zero, if an error
  14occurred a negative error code will be returned.
  16A pointer to a structure of type 'vme_driver' must be provided to the
  17registration function. The structure is as follows:
  19        struct vme_driver {
  20                struct list_head node;
  21                const char *name;
  22                int (*match)(struct vme_dev *);
  23                int (*probe)(struct vme_dev *);
  24                int (*remove)(struct vme_dev *);
  25                void (*shutdown)(void);
  26                struct device_driver driver;
  27                struct list_head devices;
  28                unsigned int ndev;
  29        };
  31At the minimum, the '.name', '.match' and '.probe' elements of this structure
  32should be correctly set. The '.name' element is a pointer to a string holding
  33the device driver's name.
  35The '.match' function allows controlling the number of devices that need to
  36be registered. The match function should return 1 if a device should be
  37probed and 0 otherwise. This example match function (from vme_user.c) limits
  38the number of devices probed to one:
  40        #define USER_BUS_MAX    1
  41        ...
  42        static int vme_user_match(struct vme_dev *vdev)
  43        {
  44                if (vdev->id.num >= USER_BUS_MAX)
  45                        return 0;
  46                return 1;
  47        }
  49The '.probe' element should contain a pointer to the probe routine. The
  50probe routine is passed a 'struct vme_dev' pointer as an argument. The
  51'struct vme_dev' structure looks like the following:
  53        struct vme_dev {
  54                int num;
  55                struct vme_bridge *bridge;
  56                struct device dev;
  57                struct list_head drv_list;
  58                struct list_head bridge_list;
  59        };
  61Here, the 'num' field refers to the sequential device ID for this specific
  62driver. The bridge number (or bus number) can be accessed using
  65A function is also provided to unregister the driver from the VME core and is
  66usually called from the device driver's exit routine:
  68        void vme_unregister_driver (struct vme_driver *driver);
  71Resource management
  74Once a driver has registered with the VME core the provided match routine will
  75be called the number of times specified during the registration. If a match
  76succeeds, a non-zero value should be returned. A zero return value indicates
  77failure. For all successful matches, the probe routine of the corresponding
  78driver is called. The probe routine is passed a pointer to the devices
  79device structure. This pointer should be saved, it will be required for
  80requesting VME resources.
  82The driver can request ownership of one or more master windows, slave windows
  83and/or dma channels. Rather than allowing the device driver to request a
  84specific window or DMA channel (which may be used by a different driver) this
  85driver allows a resource to be assigned based on the required attributes of the
  86driver in question:
  88        struct vme_resource * vme_master_request(struct vme_dev *dev,
  89                u32 aspace, u32 cycle, u32 width);
  91        struct vme_resource * vme_slave_request(struct vme_dev *dev, u32 aspace,
  92                u32 cycle);
  94        struct vme_resource *vme_dma_request(struct vme_dev *dev, u32 route);
  96For slave windows these attributes are split into the VME address spaces that
  97need to be accessed in 'aspace' and VME bus cycle types required in 'cycle'.
  98Master windows add a further set of attributes in 'width' specifying the
  99required data transfer widths. These attributes are defined as bitmasks and as
 100such any combination of the attributes can be requested for a single window,
 101the core will assign a window that meets the requirements, returning a pointer
 102of type vme_resource that should be used to identify the allocated resource
 103when it is used. For DMA controllers, the request function requires the
 104potential direction of any transfers to be provided in the route attributes.
 105This is typically VME-to-MEM and/or MEM-to-VME, though some hardware can
 106support VME-to-VME and MEM-to-MEM transfers as well as test pattern generation.
 107If an unallocated window fitting the requirements can not be found a NULL
 108pointer will be returned.
 110Functions are also provided to free window allocations once they are no longer
 111required. These functions should be passed the pointer to the resource provided
 112during resource allocation:
 114        void vme_master_free(struct vme_resource *res);
 116        void vme_slave_free(struct vme_resource *res);
 118        void vme_dma_free(struct vme_resource *res);
 121Master windows
 124Master windows provide access from the local processor[s] out onto the VME bus.
 125The number of windows available and the available access modes is dependent on
 126the underlying chipset. A window must be configured before it can be used.
 129Master window configuration
 132Once a master window has been assigned the following functions can be used to
 133configure it and retrieve the current settings:
 135        int vme_master_set (struct vme_resource *res, int enabled,
 136                unsigned long long base, unsigned long long size, u32 aspace,
 137                u32 cycle, u32 width);
 139        int vme_master_get (struct vme_resource *res, int *enabled,
 140                unsigned long long *esource *res);
  60<1163"L136" cl2" name="L51">ne" name="L134"> 1L139" id163"L136" cl2" name="L51">ne" name=d="L1            u32 cycle, u3ield refers to the sequential device ID 116efers to the set vme_user_match(s1413" id="L13" class="line" name="L13">  13      1  {
 114a>occurredd a negative error code w.txt#>= guredon/vme_apitxt#L72" i, howee_apme_apingle wrm>
	 cua="Dmutexit rexclusiv id="L34" class="line" name="L34">  34<1/a>      1                  return1 0;
<1 href=requimits
<,6" t r  34<1/               return 1;
   71/a>      1  }
  49<1/a>The ‹.probe' element s1hould14120" id="L120" class="line" name="L120"> 12/a>probe 1routine is passed a Ƈstru1t vme_entation/vme_amentatid="L120" class="line" name="L120"> 12/ name="L1truct vme_dev' struc1ture 1ooks ln/vme_api.txt#L131" id="L131" class="line" name="L131"> 13/a>
  53<1/a>      1  struct vme_dev {
  53<1/a>occurre          int num;
 13/a>      1          struct vme_bri1dge *15116" id="L116" class="line" name="L116"> 11/a>      1          struct device 1dev;
1a href="Documesass=_ta href="Documeada href="Documentation/vme_a);
  60<1163"L136" cl2" name="L51">ne/a>      1          struct list_he1ad dr1_list;
  49<1/a>      1  };
  60<1163"L136" cl2" name="L51">ne/a>
Here, 1the 'num' field 1refer16132" id="L132" class="line" name="L132"> 13/a>driver1. The bridge number (or 1bus n1mber) Inh/vmie roubutsits
 13/a>A func1tion is also provided to1 unre1616" id="L16" class="line" name="L16">  16A pointeer to a structure of typeev;
16 href="Documevme_api.txt#L href="Docummw  16      1ef="Documentation/vme_ap1i.txt16;
  16      1  void vme_unregister_dr1iver 16ge_list;
  70<1/a>Here, 1ce management
  74<1/a>Once a1 driver has registered w1ith t17135" id="L135" class="line" name="L135"> 13/a>be cal1led the number of times 1speci1ied duSi.txt#L83" id="L83" class="line" name="L83">  83<1/a>succee1ds, a non-zero value sho1uld b1 returpi.txt#L123" id="L123" class="line" name="L123"> 127a>registraation function. The struc.txt17128" id="L128" class="line" name="L128"> 12/a>driver1 is called. The probe ro1utine1is pasSi.txt#L83" i] out ontion/vme_"Docume'.
  86<1/a>device1 structure. This pointer1 shou1d be sa hrefmemory the dble access modes is dependent on
  86<1/a>reques1ting VME resources.
  86<1/a>Here, 1ef="Documentation/vme_ap1i.txt1L82" i_api.txt#L127" id="L127" class="line" name="L127"> 12/a>The dr1iver can request ownersh1ip of1853" id="L53" class="line" name="L53">  53<1/a>and/or1 dma channels. Rather th1an al1874" id="L74" class="line" name="L74">  74<1/a>specif1ic window or DMA channel1 (whi1h may Si.txt#L83" api.txt#L130" id="L130" class="line" name="L130"> 13/a>driver1 allows a resource to be1 assi1ned bantation/vme_api.txt#L131" id="L131" class="line" name="L131"> 13/a>driver1 in question:
 13/a>      1  struct vme_resource * 1vme_m1ster_rings:
 13/a>      1          u32 aspace, u312 cyc1870" id="L70" class="line" name="L70">  70<1/a>
 13/a>      1  struct vme_resource * 1vme_s19e="L51">ne" name=d="L1 size, u32 aspace,
 13/a>The dr1          u32 cycle);

  94<1/a>      1  struct vme_resource *v1me_dm1_request(strucxt#L hreref="Dd,
 14/a>driver1ave windows these attrib1utes 19se, unsigned long lonf="D/vme_te*r
m,f="Do*cumentation/*vme_a, u3ield refers to the sequential device/a>
 12/a>Master1 windows add a further s1et of1attribaila/vme_api.txt#L,ined as bitmasksf="Doa href="Docua="Documsentment/vmcrib" id="L112" class="line" name="L112"> 11/a>requir1ed data transfer widths.1 Thes1 attriguredon/vme_apitxt#L72" i, howee_apme_apingle wrm>
	 cua="Dmutexit rexclusiv id="L34" class="line" name="L34">  34<20such2any combination of the a2tribu2es canrequimits
<,6" t r  34<21the 2ore will assign a window2that 20132" id="L132" class="line" name="L132"> 122of t2pe vme_resource that sho2ld be20ne or moto the resourxt#L46" ="Dohe corrffert#L14" ition/vce provon/vmof trobeid="L34" class="line" name="L34">  34<23when2it is used. For DMA cont2oller2094" id="L94" class="line" name="L94">  94<24pote2tial direction of any tr2nsfer20135" id="L135" class="line" name="L135"> 125This2is typically VME-to-MEM 2nd/or20ed duSi.txt#L83" 9;.n/vmi.txt#L113"id="L135" class="line" name="L135"> 125a>       rt VME-to-VME and MEM-to2MEM t2ansferentation/vme_api.txt#L131" 1" id="L131" class="line" name="L131"> 127If a2 unallocated window fitt2ng th20128" id="L128" class="line" name="L128"> 128poin2er will be returned.
  83<20Func2ions are also provided t2 free2window href=#L13, VME deinput e_api.txt#L133" rean not f=9;.n/vmntation/vca="Dmu hrefd="L83" class="line" name="L83">  83<20a>                 const char *namehat 2passedtakeoubutensurcated rvme_api.t the:
 122duri2g resource allocation:
<2 href2L13" id="L13" class="line" name="L13">  13<23
 124    2   void vme_master_free(2truct21umentation/vme_api.txf="D/vme_te*r
m id="L26" class="line" name="L26">  26
 126    2   void vme_slave_free(s2ruct 2me_resource *res);
 124If a2ref="Documentation/vme_a2i.txt21;
  26poin2   void vme_dma_free(str2ct vm2L19" id="L19" class="line" name="L19">  19<29
 12/a>                 struct list_heai.txt2L121" Si.txt#L83" 9mentatid="L120" class="line" name="L120"> 12/a>                 const char *namntati22oks ln/vme_api.txt#L131"id="L120" class="line" name="L120"> 12/a>                 int (*match)(strhref2213" id="L13" class="line" name="L13">  13<2/a>                 int (*probe)(sti.txt2L124" Si.txt#L83" i]map a hrefmemoryvme_api.txt#L125"f="DocstL10ardeinput e_" id="L80" class="line" name="L80">  80<2/a>                 int (*remove)(sfrom 2he loc"entati" cmemoryvesource
  34<2/a>                 void (*shutdowne and22116" id="L116" class="line" name="L116"> 12/a>                 struct device_dow mu227" id="L7" class="line" name="L7">   72/a>                 struct list_heai.txt2L128" ent driver)tid="L120" class="line" name="L120"> 12/poin2          unsigned int ndi.txt2L129" i.txt#L123" id="L123" class="line" name="L123"> 12/a>         };
<2 href230tribailaon/vmnt ned as bihey are/vle wability3" rxun ---k-59" vmnt ned as bs51" id="L51" class="line" name="L51">  51<21
 122Once2a master window has been2assig2ed theided
 123conf2gure it and retrieve the2curre2t settexecut b,ure#L133L100re/e
 125    2   int vme_master_set (s2ruct 23116" id="L116" class="line" name="L116"> 126    2           unsigned long2long 2ase, uL9" vMxt#L72" id="L72" class="line" name="L72">  72<27    2           u32 cycle, u32 widt2);
 129    2   int vme_master_get (s2ruct 23ontain a ="Documentation/vme_ns ohey are no lcreot 3L100re/e
 120    2           unsigned long2long 2esourcte a 59" "me_ap/vmeautomine some re/e
 ce ID 1162fers to the set vme_user2match2s1413" id="L13" class="line" name="L13">  12    2 1  {
2114a>occu2redd a negative error co2e w.t242L135" id="L135" class="line" name="L135"> <1/a>    2 1                  retu2n1 0;24vme_resource *res, in#if=xt59="Documentation/v#if=xt59"2xt5919" id="L119" class="line" name="L119">2126               return 1;
   71/a>    2 1  }
<2 hef="Documentation/vme_2p1i.t2t1L49" uL9"Popult#L113"id="L135" class="line" name="L135"> <1/a>The 2#139;.probe' element2s1hou2d14120a e_api.txt#L131"id="L120" class="line" name="L120"> 12/a>prob2 1routine is passed a ģst25#L121" id="L121" class="line" name="L121">212/ name=2L1truct vme_dev' str2c1tur2 1ooksAequeemation/vmed are no txt59"#L63"213/a>
  82<1/a>    2 1  struct vme_dev {
 <1/a>occu2re          int num;
 13/a>    2 1          struct vme_b2i1dge25vme_resource *res, in#if=xt59=ed umentation/v#if=xt59"2xt59L" id="L140" class="line" name="L140"> 11/a>    2 1          struct devic2 1dev2
 11/a>    2 1          struct list_2e1ad 2r1_list;
<2 1          struct list_2e1ad 2r1549" id="L49" class="line" name="L49">  42<1/a>    2 1  };
  42n2/ name=2 1the 'num' fiel2 1ref2619e="L51">ne"ion/vmerent driverpurexit ieckce/vled in the itpia vhis
86" id="L86" class="line" name="L86">  8213/a>driv2r1. The bridge number (o2 1bus261"Documentaties the
  8211/a>    2g1t;bridge->num.
  3413/a>A fu2c1tion is also provided 2o1 un2e1616" id="L16" class="line" name="L16">  12A po2nteer to a structure of 2ypeev2
16 hrT ned as Awindow,
< id="L16" class="line" name="L16">  12<1/a>    2 1ef="Documentation/vme_2p1i.t262);
     2 1  void vme_unregister_2r1ive261549" id="L49" class="line" name="L49">  42ce/a>    2 1ef="Documentation/vme_2p1i.t2623ontain /vme_api.tx/vme_aeho/vme_apnb dtion/t#L11"_api drdlionseparreoxite:
  72<2/ name=2 1ce management
  72<1/a>Once2a1 driver has registered2w1ith2t17135Pn/vme_atxt#L8.t id="L134" class="line" name="L134"> <3/a>A fu2l1led the number of time2 1spe271616" id="L16" class="line" name="L16">  12<1/a>succ2e1ds, a non-zero value s2o1uld271a href="Docum/vme_aon/v#if= win *on/v#if=on/vme__ vme_api.(atioon/vme_ntatioef="5" id="L25" class="line" name="L25">  25127a>regi2traation function. The s2ruc.t2t17128" id="L128" class="line" name="L128">212/a>driv2r1 is called. The probe 2o1uti2e1is pPCIru/vme_ae detion/t#L11.t id="L134" class="line" name="L134">     2e1 structure. This point2r1 sh2722120" id="L120" class="line" name="L120"> <1/a>requ2s1ting VME resources.
  26<1/a>Here2 1ef="Documentation/vme_2p1i.t2t#L82" id="L82" class="line" name="L82">  8212/a>The 2r1iver can request owner2h1ip 2f1853"tatiu/vme_ae detion/t#L11.t id="L134" class="line" name="L134"> <1/a>and/2r1 dma channels. Rather 2h1an 2l1874" id="L74" class="line" name="L74">  72<1/a>spec2f1ic window or DMA chann2l1 (w28a_request(struct vme_dev#if= win *on/v#if=ame="vme_api.(aL1 size, u32 aspace,
  72<3/a>A fu2r1 allows a resource to 2e1 as2819idge;
  9213/a>driv2r1 in question:
 <                 unsigned int n1uti281549" id="L49" class="line" name="L49">  4213/a>    2 1          u32 aspace, 2312 c2cle, u32 widthes);
  9213/a>    2 1  struct vme_resource 2 1vme29#L82" id="L82" class="line" name="L82">  8213/a>The 2r1          u32 cycle);
2a1 hr2f1"Doc uL9"51Execut13"id="L135" class="line" name="L135"> ce/a>
 <1/a>    2 1  struct vme_resource 2v1me_292L135" id="L135" class="line" name="L135"> 14/a>
 13/a>driv2r1ave windows these attr2b1ute2 19se,tation/vtxt59"  can be ttexecut.t id="L134" class="line" name="L134"> ce/a>
212/a>Mast2r1 windows add a further2s1et 2916ge_list;
211/a>requ2r1ed data transfer width2.1 Th2922120" id="L120" class="line" name="L120">3<20su3h2any combination of the3a2tri30#L91" id="L91" class="line" name="L91">  93<21th3 2ore will assign a wind3w2tha3 20132Iocumrup8" id="L38" class="line" name="L38">  38122of3t2pe vme_resource that s3o2ld 30on/vme_api.txt# id="L38" class="line" name="L38">  38132of3t1ef="Documentation/vme_3t2oll3r2094" id="L94" class="line" name="L94">  93<24po3e2tial direction of any 3r2nsf3r20135ibailaon9;.Pbihey areo the reso no wia be rdedetais
  73125Th3s2is typically VME-to-ME3 2nd/3r20ed levele rde *vdustionuested for 1apnb /vme_aehpi.txt#L10xt#Llaoniocumrup8"_apne id="L78" class="line" name="L78">  73165Th3s1ave windows these attr3o2MEM3transfext#L62"ntat levele rde *vdustio25" id="L125" class="line" name="L125">3127If3a2 unallocated window fi3t2ng 3h20128" id="L128" class="line" name="L128">3128po3n2er will be returned.
<3 2ref301549" id="L49" class="line" name="L49">  43<29
<3 2ref="Documentation/vme3a2i.t3t2L110Awia bcumeIocumrup8 Hdrdlir" id="L38" class="line" name="L38">  38<20Fu3c2ions are also provided3t2 fr31="Documentation/vme_api.txt#L13131"id="L120" class="line" name="L120">3<20a>    3            const char *3ameha31#L82" id="L82" class="line" name="L82">  83122du3i2g resource allocation:3<2 hr312_api.teref="Documentation/t e_api.txt#L133" wia be rdeDoongerext#L62"ntat levele rd id="L82" class="line" name="L82">  83132of3 2ref="Documentation/vme3a2i.t3t21ume *vdustionuested for . Any givbe uested for ae_ap,6" tutes of the
vme_api. id="L82" class="line" name="L82">  83124po3 2   void vme_master_fre3(2tru3t21ume  83
<3 2ref="Documentation/vme3a2i.t3t2L116ded
3126  3 2   void vme_slave_free3s2ruc31187" id="L7" class="line" name="L7">   7If3a2ref="Documentation/vme3a2i.t3t21;
3po3n2   void vme_dma_free(s3r2ct 3116ge_list;
<3 2ref="Documentation/vme3a2i.t3t2L120" id="L120" class="line" name="L120">312/a>    3            struct list_3eai.t320e, u32 widthes);
312/a>    3            const char *3amnta32#L82" id="L82" class="line" name="L82">  8312/a>    3            int (*match)3strhr322_api.ter/vmobackeparrmeta ations sref="Dos. Cvca="Dmu hr edtakepia rit14pi.t/vmoback id="L82" class="line" name="L82">  83132of3            int (*probe)3sti.t3t2L124ntation/, /vmobackentation/s" rxuinniocumrup8ies text.t id="L134" class="line" name="L134">3<2/a>    3            int (*remove3(sfro322L135" id="L135" class="line" name="L135">3<2/a>    3            void (*shutd3wne a325e, u32 widthes);
/vmoback(*reslevel_a*res *vdi#Liat);
312/a>    3            struct devic3_dow 3u227" id="L7" class="line" name="L7">   72/a>    3            struct list_3eai.t3t#L128" id="L128" class="line" name="L128">312/po3n2          unsigned int3ndi.t3t2L129Iocumrup8 Gi.txt#L10" id="L128" class="line" name="L128">3129
<3    };
3120--3-2----------------------3<2 hr33#L91" id="L91" class="line" name="L91">  93<21
<3 2ref="Documentation/vme3a2i.t3t2 .teref="Documentation/ e_api.txt#L133"pi.txt#ngerlaoniocumrup8" wgergivbe tat id="L78" class="line" name="L78">  73122On3e2a master window has be3n2ass3g2ed tlevele rdetatiu*vdustio.t id="L134" class="line" name="L134">3123co3f2gure it and retrieve t3e2cur332094" id="L94" class="line" name="L94">  93<24
<3 2ref="Documentation/vme3a2i.t331_request(strucxt#L hirq;pi.txt#numentation/v#ion/vme_a*reslevel_a*res *vdi#19" id="L119" class="line" name="L119">3125  3 2   int vme_master_set 3s2ruc3 23116" id="L116" class="line" name="L116">3126  3 2           unsigned lo3g2lon33227" id="L7" class="line" name="L7">   7  3 2           u32 cycle, 332 wi3t2);
<3 2ref="Documentation/vme3a2i.t332L129" i.txt#L123.txt# id="L38" class="line" name="L38">  38129  3 2   int vme_master_get 3s2ruc332L120" id="L120" class="line" name="L120">3120  3 2           unsigned lo3g2lon34230tribailaon9;.Pbihey area href="Documentation/ability3"_rings:
<3 2e *res);
3ce ID 1163fers to the set vme_user3match3s1413" id="L13" class="line" name="L13">  13    3 1  {
  93114a>occu3redd a negative error co3e w.t342L135L  73<1/a>    3 1                  retu3n1 0;341ned bantation/vme_api.txt#L13131"id="L120" class="line" name="L120">3126  3            return 1;
   71/a>    3 1  }
<3 hef="Documentation/vme_3p1i.t3t1L49"monitor"dent of=Doongr om afcumen/vme_api.txt#L111xapi.txt#.t id="L134" class="line" name="L134">3<1/a>The 3#139;.probe' element3s1hou3d14120" id="L120" class="line" name="L120">312/a>prob3 1routine is passed a Ƈst350a href="Docum/vme_aon/vdev *dev, u32 alm;
312/ name=3L1truct vme_dev' str3c1tur35#L82" id="L82" class="line" name="L82">  8313/a>
3<1/a>    3 1  struct vme_dev {
  93<1/a>occu3re          int num;
  7313/a>    3 1          struct vme_b3i1dge35vme_rf="Documery thenf="Documentation/ e_api.txt#L133"deta mstri, hapityel  3811/a>    3 1          struct devic3 1dev3
311/a>    3 1          struct list_3e1ad 35#L128" id="L128" class="line" name="L128">3<1/
<3 1          struct list_3e1ad 3516ge_list;
3<1/a>The 3 1  };
  93n2/ name=3 1the 'num' fiel3 1ref3619e="L313/a>driv3r1. The bridge number (o3 1bus361"Documentation/vme_api.txt#L1313131"id="L120" class="line" name="L120">311/a>    3g1t;bridge->num.
  93<3/a>    3c1tion is also provided 3o1 un3e1616"e_ns ohey are no rings:
3A po3nteer to a structure of 3ypeev36147" id="L7" class="line" name="L7">   7    3 1ef="Documentation/vme_3p1i.t3621;
  73    3 1  void vme_unregister_3r1ive3 16ge_list;
    3 1ef="Documentation/vme_3p1i.t3t1L70" id="L70" class="line" name="L70">  73<1/a>
  73<2/ name=3 1ce management
ne" name=d="L1  o*cumentation/*vme_a, u3ield refers to the sequential dev3<3/a>driv3=1=============
  73<1/a>Once3a1 driver has registered3w1ith372L135L  83<3/a>A fu3l1led the number of time3 1spe371ned bantation/vme_api.tx id="L82" class="line" name="L82">  83A po3e1ds, a non-zero value s3o1uld37147" id="L7" class="line" name="L7">   7regi3traation function. The s3ruc.t371_api.teref="Documentation/vmelthe .t/vmobackVME bus wia b#L133L100ia b#L1e:
   7    3r1 is called. The probe 3o1uti3e1is pl   7    3e1 structure. This point3r1 sh3722120.djac72"el3<1/a>requ3s1ting VME resources.
  93<1/a>Here3 1ef="Documentation/vme_3p1i.t3819;
  7312/a>The 3r1iver can request owner3h1ip 381"Documentation/vme_aes);
(*/vmoback)(i2")_a, u3ield refers to the sequential dev3<1/a>and/3r1 dma channels. Rather 3h1an 3l1874" id="L74" class="line" name="L74">  73<1/a>spec3f1ic window or DMA chann3l1 (w381_request(strucxt#L hlm;00ia b
313/a>driv3r1 in question:
3127a>regi3r1ef="Documentation/vme_3p1i.t38#L128" id="L128" class="line" name="L128">3<    3            unsigned int3n1uti38e_resource *res);
/vmoback(*res db_a, u3ield refers to the sequential dev3    3 1          u32 aspace, 3312 c3c1870" id="L70" class="line" name="L70">  73<1/a>
  9313/a>    3 1  struct vme_resource 3 1vme39#L82"Slot DetacL130" id="L130" class="line" name="L130">313/a>The 3r1          u32 cycle);
3a1 hr39on/vme_api.txt#L123" id="L123" class="line" name="L123">3ce/a>
  93<1/a>    3 1  struct vme_resource 3v1me_3920135ibmeref="Documentation/vleslot IDxt#L86"a ohey are39;api. id="L94" class="line" name="L94">  93<3/a>A fu3r1ef="Documentation/vme_3p1i.t3923116" id="L116" class="line" name="L116">313/a>driv3r1ave windows these attr3b1ute3 19se, unsigneucxt#L hreot;gernta href="Dotion/vme19" id="L119" class="line" name="L119">3ce/a>

Tvle wrriginaLXR softwe_nsenbyocu id="L119">LXR community9128,lxr@sseux.no9128. kindly hoseottayu id="L119">Rt#pill Lsepro AS9128,< ohey a acceLseuxo rir Mu14pi.3L1optxt#L10itpirion/vmsii fo1995.