linux/drivers/ata/pata_cmd64x.c
<<
>>
Prefs
   1/*
   2 * pata_cmd64x.c        - CMD64x PATA for new ATA layer
   3 *                        (C) 2005 Red Hat Inc
   4 *                        Alan Cox <alan@lxorguk.ukuu.org.uk>
   5 *                        (C) 2009-2010 Bartlomiej Zolnierkiewicz
   6 *                        (C) 2012 MontaVista Software, LLC <source@mvista.com>
   7 *
   8 * Based upon
   9 * linux/drivers/ide/pci/cmd64x.c               Version 1.30    Sept 10, 2002
  10 *
  11 * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines.
  12 *           Note, this driver is not used at all on other systems because
  13 *           there the "BIOS" has done all of the following already.
  14 *           Due to massive hardware bugs, UltraDMA is only supported
  15 *           on the 646U2 and not on the 646U.
  16 *
  17 * Copyright (C) 1998           Eddie C. Dost  (ecd@skynet.be)
  18 * Copyright (C) 1998           David S. Miller (davem@redhat.com)
  19 *
  20 * Copyright (C) 1999-2002      Andre Hedrick <andre@linux-ide.org>
  21 *
  22 * TODO
  23 *      Testing work
  24 */
  25
  26#include <linux/kernel.h>
  27#include <linux/module.h>
  28#include <linux/pci.h>
  29#include <linux/init.h>
  30#include <linux/blkdev.h>
  31#include <linux/delay.h>
  32#include <scsi/scsi_host.h>
  33#include <linux/libata.h>
  34
  35#define DRV_NAME "pata_cmd64x"
  36#define DRV_VERSION "0.2.18"
  37
  38/*
  39 * CMD64x specific registers definition.
  40 */
  41
  42enum {
  43        CFR             = 0x50,
  44                CFR_INTR_CH0  = 0x04,
  45        CNTRL           = 0x51,
  46                CNTRL_CH0     = 0x04,
  47                CNTRL_CH1     = 0x08,
  48        CMDTIM          = 0x52,
  49        ARTTIM0         = 0x53,
  50        DRWTIM0         = 0x54,
  51        ARTTIM1         = 0x55,
  52        DRWTIM1         = 0x56,
  53        ARTTIM23        = 0x57,
  54                ARTTIM23_DIS_RA2  = 0x04,
  55                ARTTIM23_DIS_RA3  = 0x08,
  56                ARTTIM23_INTR_CH1 = 0x10,
  57        DRWTIM2         = 0x58,
  58        BRST            = 0x59,
  59        DRWTIM3         = 0x5b,
  60        BMIDECR0        = 0x70,
  61        MRDMODE         = 0x71,
  62                MRDMODE_INTR_CH0 = 0x04,
  63                MRDMODE_INTR_CH1 = 0x08,
  64        BMIDESR0        = 0x72,
  65        UDIDETCR0       = 0x73,
  66        DTPR0           = 0x74,
  67        BMIDECR1        = 0x78,
  68        BMIDECSR        = 0x79,
  69        UDIDETCR1       = 0x7B,
  70        DTPR1           = 0x7C
  71};
  72
  73static int cmd648_cable_detect(struct ata_port *ap)
  74{
  75        struct pci_dev *pdev = to_pci_dev(ap->host->dev);
  76        u8 r;
  77
  78        /* Check cable detect bits */
  79        pci_read_config_byte(pdev, BMIDECSR, &r);
  80        if (r & (1 << ap->port_no))
  81                return ATA_CBL_PATA80;
  82        return ATA_CBL_PATA40;
  83}
  84
  85/**
  86 *      cmd64x_set_timing       -       set PIO and MWDMA timing
  87 *      @ap: ATA interface
  88 *      @adev: ATA device
  89 *      @mode: mode
  90 *
  91 *      Called to do the PIO and MWDMA mode setup.
  92 */
  93
  94static void cmd64x_set_timing(struct ata_port *ap, struct ata_device *adev, u8 mode)
  95{
  96        struct pci_dev *pdev = to_pci_dev(ap->host->dev);
  97        struct ata_timing t;
  98        const unsigned long T = 1000000 / 33;
  99        const u8 setup_data[] = { 0x40, 0x40, 0x40, 0x80, 0x00 };
 100
 101        u8 reg;
 102
 103        /* Port layout is not logical so use a table */
 104        const u8 arttim_port[2][2] = {
 105                { ARTTIM0, ARTTIM1 },
 106                { ARTTIM23, ARTTIM23 }
 107        };
 108        const u8 drwtim_port[2][2] = {
 109                { DRWTIM0, DRWTIM1 },
 110                { DRWTIM2, DRWTIM3 }
 111        };
 112
 113        int arttim = arttim_port[ap->port_no][adev->devno];
 114        int drwtim = drwtim_port[ap->port_no][adev->devno];
 115
 116        /* ata_timing_compute is smart and will produce timings for MWDMA
 117           that don't violate the drives PIO capabilities. */
 118        if (ata_timing_compute(adev, mode, &t, T, 0) < 0) {
 119                printk(KERN_ERR DRV_NAME ": mode computation failed.\n");
 120                return;
 121        }
 122        if (ap->port_no) {
 123                /* Slave has shared address setup */
 124                struct ata_device *pair = ata_dev_pair(adev);
 125
 126                if (pair) {
 127                        struct ata_timing tp;
                 if (adevata_timing p;t, tp;
mode, &f="+code=mode" class="sref">ata_timing p;f="+code=mode" class="sref">mode, &adev);;
 121        };
 121        };
 1123
                printk(KERN_ERR DRV_/a>
   an 7;de" coiney an 7;de"commean 7;dtring">": mde=DRWTIM1" class="sref">DRWTIM1 },;
 ="sref">mode, &am.L1pata__cmd64x.ca>
  class="line" n na>
   &mode, &am.L1pata__cmd64x." coineclass="sref">u8mode, &am.L1pata__cmd64x."commsref">u8 adev);; 126<="sref">mode, &am.L1pata__cmd64x." coineclass="sref">u8pair) {>
 ="sref">mode, &am.L1pata__cmd64x.ca>
  class="line" n na>
   &am +ef="+code=pdev" cl"sref">mode, &am.L1pata__cmd64x." coineclass="sref">u8adev);; l"sref">mode, &am.L1pata__cmd64x." coineclass="sref">u8adev);; 121        }; 126<="sref">mode, &am.L1pata__cmd64x.ca>
  class="line" n na>
   &am a hr 16rs="line" name="L121"> 121        }>
 126<="sref">mode, &am.L1pata__cmd64x.ca>
  class="line" n na>
   &am = 16ef="+code=adev" class="sref">adev);>
  41
 123   Nowass=lintent">clocksass=on" nams w">camena>ual mastuffass=ohas done all of the following already.

chiment">/* Slave has shared address setup */,
  84 126<="sref">mode, &am.L1pata__cmd64x." coineclass="sref">u8 121        }>
 l"sref">mode, &am.L1pata__cmd64x." coineclass="sref">u8adev);> 126<="sref">mode, &am.L1pata__cmd64x." coineclass="sref">u8 121        }> 126<="sref">mode, &am.L1pata__cmd64x." coineclass="sref">u8adev);>adev);,
 126<="sref">mode, &am.L1pata__cmd64x." coineclass="sref">u8adev);,
  41mode, &am.L1pata__cmd64x."commsref">u8  121        },
 ="sref">mode, &am.L1pata__cmd64x."commsref">u8 adev);,
adev);,
 ="sref">mode, &am.L1pata__cmd64x."commsref">u8 u8  ="sref">mode, &am.L1pata__cmd64x."commsref">u8 devno];,
devno];,mode, &am.L1pata__cmd64x.ca>
  class="line" n na>
   &am a="+cH1" cF;L52" cla name="L123"> 123   0 = 16ent">/* Slave has shared address setup */,
, 123   Loade"commean clasnt">/* Slave has shared address setup */,
  79        pci_read_config_byte( 113        int u8 adev);,
u8 adev);,
u8 mode, &am.L1pata__cmd64x."commsref">u8 adev);,
        pci_read_config_byte( 113        int u8 adev);,
  84 123   Loadena>
  /" coiney nt">/* Slave has shared address setup */,
        pci_read_config_byte( 114        int  126<="sref">mode, &am.L1pata__cmd64x.ca>
  class="line" n na>
   &am a+code=r"4) |eme="L126"> 126<="sref">mode, &am.L1pata__cmd64x." coineclass="sref">u8adev);, 121        },
,
  85/** *    nt"> *      NAME<"+code5">  85/**  87 *      @ap: ATA interface  88 *      @adev: ATA device
 *      @adev: ATA device
U*   when 79uss="ent"> n clas ot*     class="ing_com. All  clss="comment"> *      @adev: ATA device
na>ual>    3helpc        - CMD64x PATA for new ATA layer/* Slave has shared address setup */;
  77
  94pioNAMEclass="sref">u84">  94pioNAMEyte" g" class="sref">cmd64x_set_timing(struct ata_port *ap, struct ata_device * 121        }>
pair) {;
  94static void ata_port *ata_device *ata_device *adevadev);)
 121        };
 112;
  85/**+code=cmd64dmaNAME<<<<< *    nt"> *  t"> *    "+code5">  85/**
  87 *      @ap: ATA interface
  88 *      @adev: ATA device
 *      @adev: ATA device
  91 *      Called to do the PIO and MWDMA mode setup.
/* Slave has shared address setup */>
 100>
  94dmaNAME void cmd64x_set_timing(struct ata_port *ap, struct ata_device * 121        }>
pair) {>
 108        const u8 drwtim_port[2][2] = {>
drwtim_port[2][2] = {>
 111        };{
devno];;
  96        struct pci_dev *pdev = to_pci_dev(ap->hosta>(adev);;
 101        u8u8adev);;
adev)2
u8ef=U  65        to_pci_dev(ap->linux/pci.h>
u8ef=D  64        to_pci_dev(ap->linux/pci.h>

ap-shifsport_no][adev->linux/pci.h>

  93  79        pci_read_config_byte(u8ef=Du8adev)2
  79        pci_read_config_byte(u8ef=Uu8adev)2

devno]2
 123   t"> classoffe="L24">  24 */
u8rport_no][adev->adev)2

 123   t"> ad_trol class="comment">/* Check cable detect bits */u8rshifs="sref">ap-shifsadev)2
 123   t"> an clasclass="comment">/* Check cable detect bits */u8rport_no][adev->adev)2
  93port_no][_  64        XFER_Ut">_  hrer" class="sref">drwtim_port[2][2] = 2
 123   Merg n claan clas" nams="comment">/* Check cable detect bits */ e" Uclass="sref">u8u8 port_no][_  64        XFER_Ut">_  hre]="+code=r" class="sref">rshifs="sref">ap-shifsadev)2
 123   Merg n claad_trol class="comment">/* Check cable detect bits */ 126u8rport_no][adev-> 123   Ut"> ons="comment">/* Check cable detect bits */port_no][_               {XFER_Ut">_  hrer"e name="L123"> 123   15nSean clasnt">/* Slave has shared address setup */ 126u8rport_no][adev->drwtim_port[2][2] = 2
u8rport_no][adev-> 123   Ut"> offe="L24">  24 */
  94static void ata_port *ata_device *ata_device *adev)2
 121        2
 125u8rport_no][adev->adev)2
  77<22" id="L68" class="line" name1e=pwrite 79        pci_read_config_byte(u8ef=Uu8adev)2
     yte" class="sref">pci_read_config_byte(u8ef=Du8adev)2;
 121        2;
  41  85/**  < *c IDE  85/**  87 *      @ap: ATA interface *      @ap: ATA interfaceC IDE  24 */;u8bool    yte"  class="sref">cmd648_cable_detect(struct ata_port *ap2>
drwtim_port[2][2] = 2>
  96        struct pci_dev *pdev = to_pci_dev(ap->hosta>(adev)2>
to_pci_dev(ap->ARTTIM0,         CFR_INTR_CH  hreef="+code=adev" class="sref">adev)2

u8irq_e" d="L11ef="+code=pdev" c="sref">to_pci_dev(ap->ARTTIM0,         CFR hreef="+code=adev" class="sref">adev)2
 101        u8irq_"L94 hreef="+code=adev" class="sref">adev)2
 125
 123   NOTE: ci_rs="ent">span rupt<="L24">  24 */>  79        pci_read_config_byte(u8irq_e" d="Lde=BMIDECSR" class="srirq_"L94class="sref">u8irq_"L94 hreref="+code=adev" class="sref">adev)2>irq_"L94class="sref">u8irq_"L94 hre (adev)2,
 121        2,
  41  85/** *c"eareIDE  85/**  87 *      @ap: ATA interface *      @ap: ATA interfaceC"eareIDE  L94us   24 */,
  94cmd648_cable_detect(struct ata_port *ap2,
drwtim_port[2][2] = 2,
  96        struct pci_dev *pdev = to_pci_dev(ap->hosta>(adev)2,
u8irq_e" d="L1ef="+code=pdev" c="sref">to_pci_dev(ap->ARTTIM0,         CFR hreef="+code=adev" class="sref">adev)2,
 101        u8irq_"L94 hreef="+code=adev" class="sref">adev)2,
  84to_pci_dev(ref="+code=adev" class="sref">adev)2,
devno]2, 123   Ri_rs="ent">span rupt<="L24">  24 */,
  79        pci_read_config_byte(u8irq_e" d="Lde=BMIDECSR" class="srirq_"L94class="sref">u8irq_"L94 hreref="+code=adev" class="sref">adev)2,
 121        2,
 100  85/**>/**<8cmff_irq_c  < *c IDE  85/**
  87 *      @ap: ATA interface
 *      @ap: ATA interface
C IDE/* Slave has shared address setup */  77
u8bool    yte"  class="sref">cmd648_cable_detect(struct ata_port *ap2>
pair) 2;
  96        struct pci_dev *pdev = to_pci_dev(ap->hosta>(adev)2)
(struct de=pcisource_"L9etyte" class="sref">pci_read_config_byte(adev)2)
to_pci_dev(ap->ARTTIM0,MRDMODE_INTR_CHef="+ :e=ARTTIM23" clasMRDMODE_INTR_CH  64        MRDMODE_INTR_CH  hreef="+code=adev" class="sref">adev)2;
 101        adevpcbas    adev)2)
  84
mrdclass="sref">adevadev)2>
 121        2>
  77
  85/**
>/**<8cmff_irq_c"eare < *c"eareIDE  85/**
 *      @ap: ATA interface
 *      @ap: ATA interface
C"eareIDE  L94us 
/* Slave has shared address setup */
  84
  84cmd648_cable_detect(struct ata_port *ap2{
pair) 2;
  96        struct pci_dev *pdev = to_pci_dev(ap->hosta>(adev)2;
(struct de=pcisource_"L9etyte" class="sref">pci_read_config_byte(adev)2;
to_pci_dev(ap->ARTTIM0,MRDMODE_INTR_CHef="+ :e=ARTTIM23" clasMRDMODE_INTR_CH  64        MRDMODE_INTR_CH  hreef="+code=adev" class="sref">adev)3
 101        adevadev)3
1a href=3d"drivers/ata/pata_cmd643#L10130" id="L41" class="line" name="L41">  41to_pci_dev(ref="+code=adev" class="sref">adev)3

  93 123   C"earentis ;ont"r ;/* Slave has shared address setup */adevpcbas    adev)3

adev        MRDMODE_INTR_CH  hre |eme="L126"> 126ARTTIM0,MRDMODE_INTR_CHef="+ref="+code=adev" class="sref">adev)3
7pcmrdclass="sref">adev 126 void adev)3
8 121        3

adev)3
  85/**>/**<6r18bmsmaastop e < *t">  Lop callbaa>yt5">  85/** qc: Cinemmensp progcissyt5">  85/** *      @adev: ATA deviceStub for now whil">spvestigats="ent"><1 quipa cnent">old     @aled to do the PIO and MWDMA mode setup./* Slave has shared address setup */devno]3
  6r18bmsmaastop void cmd648_cablequeued>dev void devf="+code=pci_dev" claqc void ap3
pair) 3

pcqc void adev)3
 121        3
  41cmd648_cscsi_>_templa     (struct +codex_shtpair) 3
_SHTect(struct ATA_BMt">_SHTyte" class="sref">pcDRV_NAMEect(struct DRV_NAMEa> *<,="+code=pair" class="sref">pair) 3
 111        }3
 125cmd648_cable_det_oper94"s="ect(struct (struct +codex_bas _op"pair) 3
(struct int"rit" id="L57" c=e=BMIDECSR" class="sr="L8bmsmaaref=_op"ect(struct pair) 3
<32" id="L68" cl.L1pata__cmd64x."co>pioNAMEclass="sref">u8pioNAMEyte"7" c=ea href="+code=u+codex_s/a>pioNAMEclass="sref">u84">  94pioNAMEyte"r="+code=pair" class="sref">pair) 3

dmaNAME void pair) 3;
 111        }3;
  41cmd648_cable_det_oper94"s="ect(struct (struct +codex_ref=_op"pair) 33
(struct int"rit" id="L57" c=e=BMIDECSR" class="sr+codex_bas _op"ect(struct +codex_bas _op"pair) 3; void yte"r="+code=pair" class="sref">pair) 3;pair) 3;(struct +able_detect id="L7ef="+code=pdev" c=f">pable_40wirE void pable_40wirEyte"r="+code=pair" class="sref">pair) 3; 111        }3;cmd648_cable_det_oper94"s="ect(struct (struct +code6r18ref=_op"pair) 3>
(struct int"rit" id="L57" c=e=BMIDECSR" class="sr+codex_bas _op"ect(struct +codex_bas _op"pair) 3>
 void yte"r="+code=pair" class="sref">pair) 3>
pair) 3

pair) 3
(struct +able_detect id="L7ef="+code=pdev" c=f">pable_40wirE void pable_40wirEyte"r="+code=pair" class="sref">pair) 3
 111        }3>
devno]3>cmd648_cable_det_oper94"s="ect(struct (struct +code6r38ref=_op"pair) 3>(struct int"rit" id="L57" c=e=BMIDECSR" class="sr+codex_bas _op"ect(struct +codex_bas _op"pair) 3> void yte"r="+code=pair" class="sref">pair) 3,
pair) 3,
(struct +able_detect id="L7ef="+code=pdev" c=f">pable_40wirE void pable_40wirEyte"r="+code=pair" class="sref">pair) 3,
 111        }3,
  93cmd648_cable_det_oper94"s="ect(struct (struct +code88ref=_op"pair) 3,
(struct int"rit" id="L57" c=e=BMIDECSR" class="sr+codex_bas _op"ect(struct +codex_bas _op"pair) 3,
 void yte"r="+code=pair" class="sref">pair) 3,pair) 3,(struct +able_detect id="L7ef="+code=pdev" c+code8ccable_detectect(struct +code8ccable_detectyte"r="+code=pair" class="sref">pair) 3, 111        }3,
 100  94fixup void cmd648_c  96        struct pci_dev *ap3,
pair) 3,
 101        adevadev)3,
  84     yte" class="sref">pci_read_config_byte(        PCI_LATENCY_TIMERadev)3,
  79        pci_read_config_byte(adevadev)3,adev 123   IRQ set upe=t">/* Slave has shared address setup */adev 123   Memory ci_r ta/p enablee=t">/* Slave has shared address setup */     yte" class="sref">pci_read_config_byte(adevadev)3,
 100 123   PPC specif" cfixup copied from>old     @ae=t">/* Slave has shared address setup */adev 100     yte" class="sref">pci_read_config_byte(  65        adev)3,
adev)3,
 121        3;
devno]3;
cmd648_c  96        struct pci_dev *cmd648_c ap3>
pair) 3>
cmd648_cable_det_infsref">ap->able_det_infs    ap->+co_infs    [7]reff="+code=pair" class="sref">pair) 3;
 123   CMDe643 - no Ut"> =t">/* Slave has shared address setup */(struct flag"(struct ATA_FLAG_SLAVE_POSSyte"r="+code=pair" class="sref">pair) 3)
 void pair) 3)
 void                {ATA_MWt"> yte"r="+code=pair" class="sref">pair) 3)
(struct ref=_op"(struct +codex_ref=_op"pair) 3)
pair) 3)
 123   CMDe646 with broken Ut"> =t">/* Slave has shared address setup */(struct flag"(struct ATA_FLAG_SLAVE_POSSyte"r="+code=pair" class="sref">pair) 3)
(struct ATA_PIO4yte"r="+code=pair" class="sref">pair) 3)
               {ATA_MWt"> yte"r="+code=pair" class="sref">pair) 3>
(struct ref=_op"(struct +codex_ref=_op"pair) 3>
pair) 3>
 123   CMDe646U with broken Ut"> =t">/* Slave has shared address setup */
(struct flag"(struct ATA_FLAG_SLAVE_POSSyte"r="+code=pair" class="sref">pair) 3>
 void pair) 3>
 void                {ATA_MWt"> yte"r="+code=pair" class="sref">pair) 3>
(struct ref=_op"(struct +code6r38ref=_op"pair) 3>
pair) 3>
 123   CMDe646U2 with works="eUt"> =t">/* Slave has shared address setup */
(struct flag"(struct ATA_FLAG_SLAVE_POSSyte"r="+code=pair" class="sref">pair) 4
 void pair) 4
1a href=4d"drivers/ata/pata_cmd644#L10140id="L121" claaaaaaaaaaaaaaaaa.L1pata__cmd64x.mwsmaaNas> void                {ATA_MWt"> yte"r="+code=pair" class="sref">pair) 4

 void                {ATA_Ut"> yte"r="+code=pair" class="sref">pair) 4
3(struct ref=_op"(struct +code6r38ref=_op"pair) 4
pair) 4
 123   CMDe646 rev 1  =t">/* Slave has shared address setup */(struct flag"(struct ATA_FLAG_SLAVE_POSSyte"r="+code=pair" class="sref">pair) 4
7(struct ATA_PIO4yte"r="+code=pair" class="sref">pair) 4
8               {ATA_MWt"> yte"r="+code=pair" class="sref">pair) 4
9(struct ref=_op"(struct +code6r18ref=_op"pair) 4
pair) 4
 123   CMDe648 =t">/* Slave has shared address setup */(struct flag"(struct ATA_FLAG_SLAVE_POSSyte"r="+code=pair" class="sref">pair) 4

 void pair) 4
 void                {ATA_MWt"> yte"r="+code=pair" class="sref">pair) 4
 void 4ect(struct ATA_Ut">4yte"r="+code=pair" class="sref">pair) 4

(struct ref=_op"(struct +code88ref=_op"pair) 4
7pair) 4
 123   CMDe649 =t">/* Slave has shared address setup */(struct flag"(struct ATA_FLAG_SLAVE_POSSyte"r="+code=pair" class="sref">pair) 4
 void pair) 4
 void                {ATA_MWt"> yte"r="+code=pair" class="sref">pair) 4
 void 5ect(struct ATA_Ut">5yte"r="+code=pair" class="sref">pair) 4

(struct ref=_op"(struct +code88ref=_op"pair) 4
pair) 4
 111        }4
cmd648_cable_det_infsref">ap->able_det_infs    (struct rpi    []reff="+code=pair" class="sref">pair) 4
ap->+co_infs    [de=pci_dev" claiv void pair) 4
<42an cl128" class="line=BMIDECSR" class="sr+co_infsref">ap->+co_infs    [de=pci_dev" claiv void pair) 4
9pair) 4;
 111        }4;
 101        u8e" d="Ls="line" name="L111"> 111        }4; 111        }4;
cmd648_c  96        struct pci_dev *(struct bu"(struct selfd="Ls="line" name="L111"> 111        }4; 123   mobility split bridgEs don't re;/* Slave has shared address setup */pcbridgE void (struct PCI_VENDOR_ID_MOBILITY_ELECTRONICS id=ref="+code=adev" class="sref">adev)4; 123   all (with excep4"s=" below) apaa  from>643 have CNTRL_CH /* Slave has shared address setup */pciv void adev)4;adev)4>
        struct pci_read_config_byte(adev)4>
pcrc void ap4>
rc void  111        }4

  93pciv void  123   643 =t">/* Slave has shared address setup */cmd648_cable_ap->able_pci_read_config_byte(adev)4>devno]4>pcss="sref">pci_dev *        structhreiced="L == +code=host" claPCI_DEVICE_ID_CMD_6="drivers/atruct PCI_DEVICE_ID_CMD_6="d="Lap4>pcss="sref">pci_dev *u8e"eis"s=d="Lpair) 4> 123   Ut"> works since rev 5 =t">/* Slave has shared address setup */(struct rpi    [0]ref=BMIDECSR" class="sr+co_infsref">ap->+co_infs    [3]ef="+code=adev" class="sref">adev)4,
(struct rpi    [1]ref=BMIDECSR" class="sr+co_infsref">ap->+co_infs    [3]ef="+code=adev" class="sref">adev)4,
adev)4, 123   Ipan rupts/* Slave has shared address setup */(struct rpi    [0]ref=BMIDECSR" class="sr+co_infsref">ap->+co_infs    [2]ef="+code=adev" class="sref">adev)4,(struct rpi    [1]ref=BMIDECSR" class="sr+co_infsref">ap->+co_infs    [2]ef="+code=adev" class="sref">adev)4,adev)4,
 123   Rev 1 with ont"r ;roblems? =t">/* Slave has shared address setup */(struct rpi    [0]ref=BMIDECSR" class="sr+co_infsref">ap->+co_infs    [4]ef="+code=adev" class="sref">adev)4,
(struct rpi    [1]ref=BMIDECSR" class="sr+co_infsref">ap->+co_infs    [4]ef="+code=adev" class="sref">adev)4, 123   FALL THRU =t">/* Slave has shared address setup */ 123   Early civs have no CNTRL_CH <=t">/* Slave has shared address setup */ void adev)4,adev)4,
adev)4,
  41(struct +code94fixupyte" class="sref">pci_read_config_byte(adev)4,
  93 123   c for enabled ;/* Slave has shared address setup */  79        pci_read_config_byte(u8e" d="Lref="+code=adev" class="sref">adev)4,ap4;
 void pcKERN_NOTICE void pci_dev *"Mobility BridgE detected, ignoring CNTRL ;/* Slref="+code=adev" class="sref">adev)4,pce" class="sref">u8e" d="L (pair) 4>
 void pcKERN_NOTICE void pci_dev *"Primary ;/* Slref="+code=adev" class="sref">adev)4;
(struct rpi    [0]ref=BMIDECSR" class="srref"dummye_det_infsref">ap->abledummye_det_infsd="Ls="line" name="L111"> 111        }4)
  41adev)4)
pce" class="sref">u8e" d="L (ARTTIM0,CNTRL_CHe hre)pair) 4)
 void pcKERN_NOTICE void pci_dev *"Sead_dary ;/* Slref="+code=adev" class="sref">adev)4;
(struct rpi    [1]ref=BMIDECSR" class="srref"dummye_det_infsref">ap->abledummye_det_infsd="Ls="line" name="L111"> 111        }4)adev)4)
adev)4)able_pci_read_config_byte((struct rpi    re=BMIDECSR" class="sr+code94shtect(struct +codex_shtadev)4)
adev)4>
 100
ARTTIM0,CONFIG_PMd="L100" class="line" name="L100"> 100
cmd648_c  96        struct pci_dev *ap4>
pair) 4>
cmd648_cable> void pci_dev *adev)4>
 111        }4>
devno]4>
pci_read_config_byte(adev)4>
ap4>
rc void  111        }5
 100(struct +code94fixupyte" class="sref">pci_read_config_byte(adev)5

adev)5
3cmd648_cable>cresumE void pc> void adev)5
4adev)5
 121        5

adev)5
7adev)5
8cmd648_c (struct +code9    []reff="+code=pair" class="sref">pair) 5
9(struct PCI_VDEVICEyte" class="sref">pcCMDf">ARTTIM0,CMD(struct PCI_DEVICE_ID_CMD_6=3f="+r, 0n}r="+code=pair" class="sref">pair) 5
(struct PCI_VDEVICEyte" class="sref">pcCMDf">ARTTIM0,CMDpair) 5
1a href=5drivers/ata/pata_cmd64x.5#L11151id="L121" cla{e+code=host" claPCI_VDEVICEect(struct PCI_VDEVICEyte" class="sref">pcCMDf">ARTTIM0,CMD 101  PCI_DEVICE_ID_CMD_6=Ld="L<, 5n}r="+code=pair" class="sref">pair) 5

(struct PCI_VDEVICEyte" class="sref">pcCMDf">ARTTIM0,CMD 101  PCI_DEVICE_ID_CMD_6=9d="L<, 6n}r="+code=pair" class="sref">pair) 5
3  93pair) 5
 111        }5

devno]5
7cmd648_c pair) 5
(struct DRV_NAMEpair) 5
9(struct id_table id="L79" cef="+code=pdev" c+code9ect(struct +code9    r="+code=pair" class="sref">pair) 5
pair) 5
1a href=5drivers/ata/pata_cmd64x.5#L12152id="L121" cla.L1pata__cmd64x.removE void pair) 5

ARTTIM0,CONFIG_PMd="L100" class="line" name="L100"> 100ARTTIM0,"uspend id="L53" clef="+code=pdev" cable_ARTTIM0,able_pair) 5
pair) 5
adev)5
 111        }5
adev)5
<52an cl="+code=pdev" cmodule_ pcccode9_ adev)5
9adev)5;
pcMODULE_AUTHOR 64        MODULE_AUTHORyte" c name="L123"string">"AlameCox"">/* Slref="+code=adev" class="sref">adev)5;
pcMODULE_DESCRIPTION 64        MODULE_DESCRIPTIONyte" c name="L123"string">"low-level     @aefor CMDev< series PATAcss=troll cl"">/* Slref="+code=adev" class="sref">adev)5;
pcMODULE_LICENSEect(struct MODULE_LICENSEyte" c name="L123"string">"GPL"">/* Slref="+code=adev" class="sref">adev)5;
pcMODULE_DEVICE_TABLEect(struct MODULE_DEVICE_TABLEyte" class="sref">pciciect(struct rci(struct +code9    ref="+code=adev" class="sref">adev)5;pcMODULE_VERSION 64        MODULE_VERSIONyte" class="sref">pcDRV_VERSION 64        DRV_VERSION    ref="+code=adev" class="sref">adev)5;


The original LXR software by the ="+code=ahttp://sourceforge.net/projects/lxl >LXR > 12unitylxl@ta/ux.no lxl.ta/ux.no kindly >ed by ="+code=ahttp://www.redpill-ta/pro.no">Redpill La/pro ASyte"r ;rovid@aeof La/uxcss="ulting and opera4"s=" sereices since 1995.