linux/drivers/firewire/core-card.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2005-2007  Kristian Hoegsberg <krh@bitplanet.net>
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License as published by
   6 * the Free Software Foundation; either version 2 of the License, or
   7 * (at your option) any later version.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write to the Free Software Foundation,
  16 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17 */
  18
  19#include <linux/bug.h>
  20#include <linux/completion.h>
  21#include <linux/crc-itu-t.h>
  22#include <linux/device.h>
  23#include <linux/errno.h>
  24#include <linux/firewire.h>
  25#include <linux/firewire-constants.h>
  26#include <linux/jiffies.h>
  27#include <linux/kernel.h>
  28#include <linux/kref.h>
  29#include <linux/list.h>
  30#include <linux/module.h>
  31#include <linux/mutex.h>
  32#include <linux/spinlock.h>
  33#include <linux/workqueue.h>
  34
  35#include <linux/atomic.h>
  36#include <asm/byteorder.h>
  37
  38#include "core.h"
  39
  40#define define_fw_printk_level(func, kern_level)                \
  41void func(const struct fw_card *card, const char *fmt, ...)     \
  42{                                                               \
  43        struct va_format vaf;                                   \
  44        va_list args;                                           \
  45                                                                \
  46        va_start(args, fmt);                                    \
  47        vaf.fmt = fmt;                                          \
  48        vaf.va = &args;                                         \
  49        printk(kern_level KBUILD_MODNAME " %s: %pV",            \
  50               dev_name(card->device), &vaf);                   \
  51        va_end(args);                                           \
  52}
  53define_fw_printk_level(fw_err, KERN_ERR);
  54define_fw_printk_level(fw_notice, KERN_NOTICE);
  55
  56int fw_compute_block_crc(__be32 *block)
  57{
  58        int length;
  59        u16 crc;
  60
  61        length = (be32_to_cpu(block[0]) >> 16) & 0xff;
  62        crc = crc_itu_t(0, (u8 *)&block[1], length * 4);
  63        *block |= cpu_to_be32(crc);
  64
  65        return length;
  66}
  67
  68static DEFINE_MUTEX(card_mutex);
  69static LIST_HEAD(card_list);
  70
  71static LIST_HEAD(descriptor_list);
  72static int descriptor_count;
  73
  74static __be32 tmp_config_rom[256];
  75/* ROM header, bus info block, root dir header, capabilities = 7 quadlets */
  76static size_t config_rom_length = 1 + 4 + 1 + 1;
  77
  78#define BIB_CRC(v)              ((v) <<  0)
  79#define BIB_CRC_LENGTH(v)       ((v) << 16)
  80#define BIB_INFO_LENGTH(v)      ((v) << 24)
  81#define BIB_BUS_NAME            0x31333934 /* "1394" */
  82#define BIB_LINK_SPEED(v)       ((v) <<  0)
  83#define BIB_GENERATION(v)       ((v) <<  4)
  84#define BIB_MAX_ROM(v)          ((v) <<  8)
  85#define BIB_MAX_RECEIVE(v)      ((v) << 12)
  86#define BIB_CYC_CLK_ACC(v)      ((v) << 16)
  87#define BIB_PMC                 ((1) << 27)
  88#define BIB_BMC                 ((1) << 28)
  89#define BIB_ISC                 ((1) << 29)
  90#define BIB_CMC                 ((1) << 30)
  91#define BIB_IRMC                ((1) << 31)
  92#define NODE_CAPABILITIES       0x0c0083c0 /* per IEEE 1394 clause 8.3.2.6.5.2 */
  93
  94/*
  95 * IEEE-1394 specifies a default SPLIT_TIMEOUT value of 800 cycles (100 ms),
  96 * but we have to make it longer because there are many devices whose firmware
  97 * is just too slow for that.
  98 */
  99#define DEFAULT_SPLIT_TIMEOUT   (2 * 8000)
 100
 101#define CANON_OUI               0x000085
 102
 103static void generate_config_rom(struct fw_card *card, __be32 *config_rom)
 104{
 105        struct __be32 *  46>static int card, card, card, length;
  77
  48  94/*
   9  10  11
  12 * crainfoent"to means"> *> * Youhavetonty of
  13
  14  15 */

  47        config[0]>crc = cpu_to_b/
       >#define BIB_CRC_LEN4) |>#define BIB_INFO_LEN4) |>#define BIB_0)list);
  59        config[1]>crc = cpu_to_b#define BIB_BUS_list);
  59        config[2]>crc = cpu_to_b/
       >#define BIB_LINK_SPEED(card->
       >#define BIB_GENERATION(card->con="sref"herm_length" class="sref">con="sref"heref">++ % 1> = 2f"|/
       >#define BIB_MAX_2f"|/
       >#define BIB_MAX_RECEIVE(card->
  45        #define BIB_|>#define BIB_|>#define BIB_|>#define BIB_list);
  46        config[3]>crc = cpu_to_b#define card-> /a>[0]) &32list);
  47        config[4]>crc = cpu_to_b#define card->list);
  18
  59 0083c0 o block, ec o,y.omment"> */
  59        config[6]>crc = cpu_to_b#define NODE_CAPABILIlist);
  61        biliist);
  62        bilit+atic int descriptor_count;
  93
  59 0083c0 o block, ec o,y ss=r4 spoo s="sref">des.omment"> */
  62         HEAD(descriptor_card, {
  46>>>>>>>>if HEAD(or_count" classilasdif">46"> /a>[lt;<  0)
  46>>>>>>>>  59        config[        ++]>crc = cpu_to_b#define or_count" classilasdif">46">list);
       >#define config[        ]>crc = cpu_to_b#define BIB_|>b#define b->        )list);
       >#define ++ist);
  50       >        b+crc = length;
  61  66}
 102
  43 0083c0 o block, ec o,y ="sref.omment"> */
  44        config[5]>crc = cpu_to_bb#define b- 5b- 1f">v) <ngth;
  55
  46 0083c0 des.omment"> */
  47         HEAD(descriptor_card, {
       >oo sintk(>cr0;ard, ">v = lenard, ++;<  0)
       >       >#define config[        t+atic int ]>crc = cpu_to_b#define ];ngth;
  50       >        b+crc = length;
  61  66}
 102
  43 0083c0 co.  Toistonty of
  14  15  96 */
  47oo sintk(bil0;ard, b>v = ;ard, b+crc = len+ t;< 31)
       >#define lengt#define fw_compute_block_crc(configt+atic int )ngth;
  39
  59        (b!crc = config_rom_le)ngth;
  66}
 102
 103static void generate_cocode=args" classupdf">generate_coclock_>sta;< 31)
 104{
 105        struct fw_card *ngth;

  47         HEAD(cae), &card_card, {
       >#define generate_config_EAD(caEAD(tmp_config)ngth;
       >#define card->card->(caEAD(tmp_config,gth;
  50       >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>c = config_rom_le)ngth;
  61  66}
  52}
  73
  74static size_t =fw_notice" classrequrs/d_t">=fnfig_        struct __be32 * 104{
  46 0083c0 >stoo block, r+ op"heralpilasdif">ass=ry>mment"> */
  47        return le = 1 + HEAD(or_count" classilasdif">46"> /a>[lt ? 1 : 0)ngth;
  52}
  39
  56int __be32 * 104{
  62        size_t ngth;
  43  56int ;
  64
  46 0083c0  */
  96 */
  97 */
  98   9 */
  59        bil0;/
  61whilesintk(b>v = le;< 31)
       >#define b+crb#define ]>/a>[0]) >&+ 4 + 1 + 1;
  93
  44if HEAD(b!crc = le;< 31)
  45               -/a>->;

  47        ca_"+code=block" classf">ca_"+config_e), &card_mutex);
  18
  44if HEAD(config_rom_len+atic int =fw_notice" classrequrs/d_t">=fnfig_be32 *{
  50       >        ->;
  61  else" 104{
       >#define ), &), &descriptor_utex);
       >#define config_rom_len+crc = =fw_notice" classrequrs/d_t">=fnfig_be32 *       >#define descriptor_c++ist);
  45        if HEAD(or_count" classilasdif">46"> /a>[lt;<  0)
  46>>>>>>>>       >#define descriptor_c++ist);
  46>>>>>>>>ic void generate_cocode=args" classupdf">generate_coclock_;tex);
       >#define 
  44  52}
 100
  61        ca_un"+code=block" classf">ca_un"+config_e), &card_mutex);
 102
        return ;
  52}
 a>-> *);

>static void __be32 *{
  59        ca_"+code=block" classf">ca_"+config_e), &card_mutex);
 100
  61        ), &);
  62        config_rom_len-crc = =fw_notice" classrequrs/d_t">=fnfig_be32 *#define descriptor_c--tex);
  44if HEAD(or_count" classilasdif">46"> /a>[lt;<  0)
  45        #define descriptor_c--tex);
  46        generate_cocode=args" classupdf">generate_coclock_;tex);
  77
  59        ca_un"+code=block" classf">ca_un"+config_e), &card_mutex);
  52}
 a>-> *);
ex);
  72static int fw_card *caEAD(size_t  104{
  59>static int    62>static int   SHORT_RESET_TIMEOUT" classPHYref">SHORT_RESETor_c : e_t RESET_TIMEOUT" classPHYref">RESETor_c + 1 + 1;

  47        return card->card->gphy_regode=args" classupdf">gphy_regnfig_be32 *caEAD(();
  52}
  39
>static void fw_card *caEAD(size_t caEAD(size_t  104{
  62 0083c0  */
#define card-> );
  64
  46 0083c0  */
  46         *utex);
  47if H!be32 * *), &card->);
       >  45        #define  ? e_t  *       >         *utex);
  52}
 a>-> *);
 102
 103static void fw_card * 104{
 105        struct fw_card *>crc =         struct fw_caEAD( *);

  47 0083c0 /* per IEEE 1394 c2.1.omment"> */
if HEAD(card->e/
    /a>-> *(card->be32 *{
  50       >if H!be32 * *), &card->be32 *{
       >       >         *utex);
       >      tex);
  52}
  64
  62         *caEAD(caEAD(card->iex);
  46>>>>>>>>       >/a>        utex);
  47         *caEAD(card->);
  59         *utex);
  52}
 100
 103static void gbroadcgbroadcfw_card *ca>static int f104{
 104{
  43  56int (>cr0;/
  64
  62>f H!be32 *card->code=card" classbroadccef">f" 104{
  46>>>>>>>> struct  *caEAD(i 1ULL">v) &31iex);
  46>>>>>>>>  59>>>>>>>>>>>>>>>e), &), &caEAD(utex);
       >if HEAD({
       >       >#define  *caE0083c0 "failect, wallocf"> broadc *utex);
  50       >>>>>>>>>      tex);
       >  52}
       >#define card->code=card" classbroadccef">>crc = tex);
  52}
  64
  62         *card->ca_>sta *)(make)/a>->iex);
  46>>>>>>>>       >/a>  >#define utex);
  52}
  18
 103([]>cr 104{
  5963, 5, 7, 8ic10ic13, 16, 18ic21ic24ic26, 29, 32, 35, 37, 40104{
}tex);
 102
>static void fw_card *caunsignectmake #define f104{
 104{
  62         *utex);
  46>f H!be32 *), &card->(ff104{
  46>>>>>>>>ic void  *utex);
  52}
  39
 103static void fw_card * 104{
        struct fw_card *>crc =         struct figcaEAD( *);
        struct figcaard *tex);
        struct fw_card *tex);
  62>static int figcaEAD(figcaEAD(figcaEAD(figcaEAD(tex);
  46>static int caEAD(i EAD(=fw_notice" class=r>=fef">i EAD(tex);
  47        size_t >crc = tex);
  59        size_t tex);
  59        size_t tex);
  59        size_t tex);
  61        size_t tex);
  62        cpu_to_rc = [2]tex);
  93
  62        ), &card->);
ex);
  46>f H), &card->>ccrc = f" 104{
  46>>>>>>>>ic void ), &card->);
       >goto>ic void tex);
  44  52}
 100
  61        >crc = card->tex);
 102
#define >crc = card->tex);
  62         *;tex);
  62        fig>crc = card->);
  46        >crc = fig>ee/
  46>>>>>>>>  59c = ), &figcard->or_count" classstf">ef">f"ccrc = );
  59        >crc = fig>eerc = figcard->tex);
  39
  59        >crc = card->card->);
  61        >crc = >eerc = card->tmp_config>ee/
       >>>>>>>>>HEAD(card->tmp_config[2]>e 0x000000f0f"ccr0;/
  93
  59 0083c0  */
  62        >crc = >eerc = card->tmp_config>ee/
  46>>>>>>>>       >#define card->tmp_config[3]>/a>[0]) &8"ccrc = );
  77
  59        fig >crc = card->);
  59        fig  >crc = card->card->);
  59        >crc = card->card->);
ex);
  62        =fw_notice" class=r>=fef">>crc =  *);
       >>>>>>       >#define card->-> *);
  64
  46>f HHEAD( *i EAD(card->f"ee/
  46>>>>>!be32 *card->or_count" classbm_abdicf">ef">f"||/
  46>>>>H), &card->b!crc = >eerc = =fw_notice" class=r>=fef">)f" 104{
       > 0083c0  */
   9 */
   9 */
   9 */
   9 */
   9 */
   9 */
   9 */
 */
   9 */
 */
  39
  50       >if H!be32 *card->card->f" 104{
       >       >        fig>crc = tex);
       >       >         *caE0083c0 "%s, making locflcnhre (%02x)o blo\n"ent"> *cex);
       >>>>>>       >    > 0083c0 "IRM has lclk off"ent"> *c>        fig;tex);
       >>>>>>>>>goto>ic void tex);
  62>>>>>>>>  52}

  46>>>>>>>>>f H), &>eer!be32 *f" 104{
       >  45        fig>crc = tex);
       >       >#define  *caE0083c0 "%s, making locflcnhre (%02x)o blo\n"ent"> *cex);
  50       >>>>>>>>>    >    > 0083c0 "IRM is_notoer Iaw clpliant"ent"> *c>        fig;tex);
       >       >goto>ic void tex);
       >  52}
  93
       >c = [0]>crc = );
  62>>>>>>>>c = [1]>crc =  = ;tex);

  46>>>>>>>>/a>->), &card->);
  18
       >/a>->>crc =  *caEe32 *c  18
  50       >>>>>>>>>       >/a>->figcaEAD(i EAD(c  18
       >>>>>>>>>       >/a>->->MANAGER_IINK_SPEED" classCSR_ef">MANAGER_IIef">c  18
       >  62>>>>>>>>c = ic8)tex);
  93
       >>f H), &>ccrc = 
  62>>>>>>>>>>>>>>>>c0083c0  */
  46>>>>>>>>       >goto>ic void );
  77
       > a>->fig>crc =  *[0])tex);
  39
  50       >/a>->), &card->);
       >>f H), &>ccrc = >eerc = >ccrc = card->;  93
       >       >        card->>c  93
       >>>>>>        a>->fig>c= 0x3f ? e_t >: 0xffc0 |  a>->figtex);
       >c = ), &card->);
ex);
  46>>>>>>>>>f H), &>ccrc = >eerc = fig>!= 0x3ff" 104{
  46>>>>>>>>       >c0083c0  */
       >  45>f H), &>ccrc = fig;  93
       >       >       >c = gbroadcgbroadc *caEe32 *;tex);
 100
       >       >goto>ic void );
       >  52}
  93
       >>f H), &>ccrc = f" 104{
  62>>>>>>>>>>>>>>>>c0083c0  */
 */
   9 */
 */
   9 */
  50       >>>>>>>>>c =  *caEe32 * *);
       >       >goto>ic void );
       >  52}
  93
       >c = ), &card->);
ex);
  46>>>>>>>>>f H), &>!crc = >eer!be32 *f" 104{
  46>>>>>>>>       >c0083c0  */
 */
   9 */
   9 */
   9 */
   9 */
       >>>>>>           fig>crc = tex);
       >>>>>>            *caE0083c0 "BM_"+co failect(%s), making locflcnhre (%02x)o blo\n"ent"> *cex);
  62>>>>>>>>>>>>>>>> >>>>>>            *)c>        fig;tex);
  46>>>>>>>>       >goto>ic void tex);
  46>>>>>>>>  52}
  59} else if H), &card->b!crc = f" 104{
       >/0083c0  */
   9 */
   9 */
   9 */
       >c = ), &card->);
       >c =  *caEe32 * *);
  62>>>>>>>>goto>ic void );
  46  52}
  77
  59 0083c0  */
   9 */
   9 */
   9 */
   9 */
#define card->bcrc = tex);
  64
  46>f Hbe32 *fig>ccrc = f" 104{
  46>>>>>/a> 0083c0  */
   9 */
tm rom.  In either case, pick another  blo."st"> */
   9 */
  50       >/a>->fig>crc = tex);
} else if H!be32 *f" 104{
       > 0083c0  */
   9 */
   9 */
   9 */
  46>>>>>/a>  = ), &card->);
  46>>>>>>>>goto>ic void );
  59} else if H), &f" 104{
       >/0083c0  */
   9 */
   9 */
   9 */
       >/a>->fig>crc = figtex);
} else  104{
  62>>>>>>>>/0083c0  */
 */
   9tm rom, bu7 it's notent"> */
 */
   9 */
  50       >/a>->fig>crc = tex);
  52}
 102
>ic void : 102
/0083c0  */
   9 */
 */
   9 */
  59if H!be32 *card->>ee/
    c = card->>elt>rc =  *f;  93
  50       >be32 *bcrc = [c = card->]tex);
elseex);
       >be32 *bcr63tex);
  93
/0083c0  */
   9 */
 */
   9 */
 */
  39
  50if H), &card->++>elt>r5>ee/
    H), &card->b!crc = b||  a>->fig>!crc = figf;  93
       >c = bcrc = tex);
  93
  = ), &card->);
ex);
  46if H), &f" 104{
  46>>>>>>>>c =  *caE0083c0 "phy ef">tm: new  blo=%x, =ap_cript=%d\n"ent"> *cex);
       >  45 >/a>->figcaEe32 *;tex);
       >c = tmde=block" class idsend_phy_ef">tmnfig_be32 *caEe32 *figcaEe32 *i EAD(;tex);
  50       >be32 * *caEe32 *;tex);
       >c0083c0  broadc */
       >goto>ic void );
  52}
  64
  46>f Hbe32 *f" 104{
  46>>>>>/a> 0083c0  */
   9 */
 */
       >c = [0]>crc =  = ;tex);
  50       >be32 *>crc =  *caEe32 *cex);
       >       >       >be32 *figcaEAD(i EAD(c  18
       >       >       >be32 *->c  18
       >>>>>>       >   c = , 4;tex);
       >>f H), &>ccrc = 
  62>>>>>>>>>>>>>>>>goto>ic void );
  46  52}
  77
  59if Hc = >ccrc = fig;  93
       >c = gbroadcgbroadc *caEe32 *;tex);
 100
>ic void 
c =  *;tex);
>ic void   =  *;tex);
  52}

void>  =   =  *c/
       >  45const struct>  =  *
       >>>>>>>>>struct>  = fig>*be32 *fig;  93
 104{
stf"hc>c = >ic void >crc = );
 102
#define card->>crc = ), &;tex);
  = card->crc = );
  62  = card->fig>crc = figtex);
  46  = card->fig>cr0tex);
  46  = card->fig>cr0tex);
  59  = card->fig>crc = fig>/ 8000tex);
  59  = card->fig>cr_be32 *fig>% 8000)>elt>elt>r19tex);
  59  = card->fig>crc = figtex);
  59  = card->fig>cex);
       >       >         *fig>*>        );
#define card->fig>cr0tex);
  = card->gbroadc);
ex);
  46  = ), &card->;tex);
  46  = card->;tex);
  59  = ), &card->;tex);
  59  = ), &card->;tex);
  59  = ), &card->);
);
c = card->f" );
  93
  = ), &card->caEe32 *caEx);
  62  = ), &card-> *);
  42}
  42 * *);
  5/a>);
 =   =  *c/
  50       >be32 * 1032 * * 1032 * * *
   4{
c = );
  93
  = card->);
  62  = card-> = );
  46  = card-> = );
  77
  59  = ), &);
  39
  59  = tmnfi_ro_level" classkeeref"here">tmnfi_ro_g_be32 *caEe32 *tmnfi_ro_level" classkeetmp">tmnfi_ro_g_stx);
  59  =  = card->crd-> *caEe32 *tmnfi_ro_level" classkeetmp">tmnfi_ro_g_ste32 *);
c
       >/a>->), &card->), &);
  64
  62  = ), &);

  46  = );
  52}
 * *);
 100
   9 */
   9  59  =   f="driis usedrd.c#La a hrefss="line"4 n58158">   9  fshut="L8wnore-id="L80/coreis ">cawsivers58">  f=oe yeanly stx   9 */
 */*/fir">c IOf=oevers/firvers/fbL86"nd
  efss="line"4 n58158">   9   9 */
  fbe href48"anymcla.c#L105"" i5ummy 58">  efss="line"4 n58158">   9card5/a>-&59 blocpacket for toisent"> */* .trueL642"5id="()fis ne>  fhref48"si.c#L10es/firv40" aken="driof hrL74" classs="line"508me=508ANON   9 */car5-59ript op=imizf"her."st"> */  class="line"508me=508ANON   9  59  =        >c = s/firewir5/core-4card.c#L844" id="594" c5ass="line"4 name494ANON_OUI  = caEe325ummy_irew_L540"5s*c/
   4{
c = f"5104{
  52}
 * = tmde=block"5class5idsendefindexfirewire/core-5a6dd5ummy_upd *caEe325ummy_upd *c/
  50       >be32 *   4{
 bro6dcc = );
  52}
 *  46>f Hbe32 *<6 hr blo+c6v  = 5ummy_> *caEe325ummy_> *c/


   4{
c = ), &

);
tmnfi_ro_g_ste32 *card<55" idCANCELLEaass="line"4 n5me48L58"> 100
 */
<6 href60ass="line"4 n5me4795NON_OU2 *  59  = >crc6/a> = efindexnfig_struct>  = 5ummy_> * *c/


   4{
c = b632 *

);
tmnfi_ro_g_ste32 *card<55" idCANCELLEaass="line"4 n5me48L56ON_OUIc =  *61ss="line"5name=50546">  46>f Hbe32 *<6goto>ic v6id 
c/


   4{
c =   52}
>c61ass="line"4 n5me4795NON_OU2 *gbroadc  59  = c/
  59  = b6outor_c: 102
figcaEAD();
ass="sref"heref">i>);
asss="lxfirewire/core-5a6ddwire/core-5card.c#L250" id="L20" class="ine"4 n5me47L57">  59  = b6e=size_t" classfw_node_p6tnfig6be32c =   52}
 *  46  = caEe32
caEe32c/
  59  =  * *>crc =  *  59  =   = c =  = fig>*rs/firewire/core-5a6ddERR_Pewire/core-5ard.cERR_Pew*c =  *c = "" i  59  = card6><63de=va" class=ransac"her_df""L9">> * * *  59  = card6><6 hrefaline"4 n5me46156ON_OUIc = card6><6 hrefaov  52}
card6><63ass="line"4 n5me45756">  42 *card6><63ss="line"4 n5me46856">  59  = card6><6 hrefsefindexfirewire/core-5a6dd5ummy_5et"iso_Afi0ADCrewire/core-5crd5ummy_5et"iso_Afi0ADCr*  59  = card6><6 hrefsline"4 n5me46156ON_OUIc = card6><6 hrefspli=_timrs/fire-  52}
card6><6 hrefsline"4 n5me45756">  42 *#define card6><6 hrefcefindexfirewire/core-5a6dd5ummy_queue

  59  = card6><6 hrefallocf">ggggggggggggggggggggr="+code=card" class="sreiso_buffssa hrefANONc/  59  = c = {
  52}
 * =   = 5ummy_flush_queue  59  = stf"hc>c = 6s/firewir6/core-4ca5dc#L1052" id="652" c65hrefsline"4 n5me45756">  42 *card6><65ss="line"5 name533ANON_OUI#define   59  = c =   52}
  42 *  59  =  *
  46>>>>>/a> 0083c06/c_a hads6ze_t" class idre/cANOhad6g_str65scovfig>*.wire/core-5a6ddirew_L540"5ss="sref">caEe32irew_L540"5s*caEe325ummy_irew_L540"5s*  59  =  1632caEe32upd *caEe325ummy_upd *  59  =  *caEe32> * *caEe325ummy_> *  59  =  *  59  = 

  59  = card6><6 hrefall_hopre.wire/core-5a6dd"stmp"aL54s_dmwire/core-5a4d.c"stmp"aL54s_dmw*  59  = card6><6 hrefaovk_erts.wire/core-5a6dd">caEe32
caEe32caEe32
caEe32  59  = card6><6 hrefcurrufw_c.wire/core-5a6dd>"" i"" i"" i  59  =  t"iso_Afi0ADCrewire/core-5crd5ummy_5et"iso_Afi0ADCr*  59  = ), &  59  = fig>*.wire/core-5a6ddflush_queue  59  = tmnfi_ro_level" classk6eref"67*  59  =  =6  52}
#define   = #define c = ), &r="+code=card" class="sref">c/
c/
  46  =   46  = 6a hreffw_6fw_card" classdo_re_ctex6/a>);67hreftlabin_masode=block" clasNt;;tex);
  59  =  * *);_GPl*  59  =    9 */<6span>
c/
c*c/
#define c = ), &r="+code=card" class="sref">c" classa hrefANONc/
  59  =  */
  46>f Hbe32 *<6/+mutex_+6inally, drgure ou7 if we6shoul68hrefaovfig>crc = caEe32upd *tmnfi_ro_g_ste32  59  = tmnfi_ro_PHY_LINK_ACTIVErefcu|ci_ro_level" claPHY_CONTENDEwire/core-5ard.cPHY_CONTENDEwe32#define 
tmnfi_ro_g_ste32  59  =  */
 = ), &);
  39
card6/a>-&69re">tmnfi_ro_g_be32 *-&gdel" class="sref">card-&gdel" cla*;tex);
  39
 */<6e=card" class="sref">car6-69=pu_ode=card" class="sref">c_mutex=card" class="sref"_mutexg_stx);

#define        >c =6pin_un"+c6_irqde=block" classspin_6n"+co69hrefall_hoprecef="_be32" cla5ummy_href="#L1058" id="L48"ummy_href="ss=".wire/core-5a6ddfre2
fig>crc = 

fig>crc = 
f"69hrefcurrufw_card" classirmrufwg;  c = 
  59  = /a>->6), &tmnfi_ro_g_ste32<"line"4 n5me47s57f"/
tmde=block"6class69ss="line"4 n5me47L57">  59  =  *za7da href="d5id="L82" c Wait ="L6">c us7">, especi">cy 6" cla " clqueue job>, to f clsh.efclass="line"509me=509ANON_OUI       >c =7 bro7dccpan>

tmnfi_ro_g_ste32<"line"4 n5me47s57f"/
cardwait_="L_e=card" cl*;tex);
  59  =   = card-&gempty*;tex);
  59  =  *);*c/
c*  59  = 


"+reoriginal LXR softwaef=byiversne"4 n5mehttp://sourcefclge.net/projects/lxr">LXR 5id=uclaye32"L4=byine"4 n5memailto:lxr@e_tux.nod axr.e_tux.no kindcy hosr48"byine"4 n5mehttp://www.redpill-e_tpro.nod