[BACK]Return to if_iwireg.h CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/if_iwireg.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: if_iwireg.h,v 1.25 2006/08/19 11:07:45 damien Exp $   */
                      2:
                      3: /*-
                      4:  * Copyright (c) 2004-2006
                      5:  *      Damien Bergamini <damien.bergamini@free.fr>. All rights reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice unmodified, this list of conditions, and the following
                     12:  *    disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  *
                     17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     18:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     19:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     20:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     21:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     22:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     23:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     24:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     25:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     26:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     27:  * SUCH DAMAGE.
                     28:  */
                     29:
                     30: #define IWI_CMD_RING_COUNT     16
                     31: #define IWI_TX_RING_COUNT      64
                     32: #define IWI_RX_RING_COUNT      32
                     33:
                     34: #define IWI_CSR_INTR           0x0008
                     35: #define IWI_CSR_INTR_MASK      0x000c
                     36: #define IWI_CSR_INDIRECT_ADDR  0x0010
                     37: #define IWI_CSR_INDIRECT_DATA  0x0014
                     38: #define IWI_CSR_AUTOINC_ADDR   0x0018
                     39: #define IWI_CSR_AUTOINC_DATA   0x001c
                     40: #define IWI_CSR_RST            0x0020
                     41: #define IWI_CSR_CTL            0x0024
                     42: #define IWI_CSR_IO             0x0030
                     43: #define IWI_CSR_CMD_BASE       0x0200
                     44: #define IWI_CSR_CMD_SIZE       0x0204
                     45: #define IWI_CSR_TX1_BASE       0x0208
                     46: #define IWI_CSR_TX1_SIZE       0x020c
                     47: #define IWI_CSR_TX2_BASE       0x0210
                     48: #define IWI_CSR_TX2_SIZE       0x0214
                     49: #define IWI_CSR_TX3_BASE       0x0218
                     50: #define IWI_CSR_TX3_SIZE       0x021c
                     51: #define IWI_CSR_TX4_BASE       0x0220
                     52: #define IWI_CSR_TX4_SIZE       0x0224
                     53: #define IWI_CSR_CMD_RIDX       0x0280
                     54: #define IWI_CSR_TX1_RIDX       0x0284
                     55: #define IWI_CSR_TX2_RIDX       0x0288
                     56: #define IWI_CSR_TX3_RIDX       0x028c
                     57: #define IWI_CSR_TX4_RIDX       0x0290
                     58: #define IWI_CSR_RX_RIDX                0x02a0
                     59: #define IWI_CSR_RX_BASE                0x0500
                     60: #define IWI_CSR_TABLE0_SIZE    0x0700
                     61: #define IWI_CSR_TABLE0_BASE    0x0704
                     62: #define IWI_CSR_NODE_BASE      0x0c0c
                     63: #define IWI_CSR_CMD_WIDX       0x0f80
                     64: #define IWI_CSR_TX1_WIDX       0x0f84
                     65: #define IWI_CSR_TX2_WIDX       0x0f88
                     66: #define IWI_CSR_TX3_WIDX       0x0f8c
                     67: #define IWI_CSR_TX4_WIDX       0x0f90
                     68: #define IWI_CSR_RX_WIDX                0x0fa0
                     69: #define IWI_CSR_READ_INT       0x0ff4
                     70:
                     71: /* aliases */
                     72: #define IWI_CSR_CURRENT_TX_RATE        IWI_CSR_TABLE0_BASE
                     73:
                     74: /* possible flags for IWI_CSR_INTR */
                     75: #define IWI_INTR_RX_DONE       0x00000002
                     76: #define IWI_INTR_CMD_DONE      0x00000800
                     77: #define IWI_INTR_TX1_DONE      0x00001000
                     78: #define IWI_INTR_TX2_DONE      0x00002000
                     79: #define IWI_INTR_TX3_DONE      0x00004000
                     80: #define IWI_INTR_TX4_DONE      0x00008000
                     81: #define IWI_INTR_FW_INITED     0x01000000
                     82: #define IWI_INTR_RADIO_OFF     0x04000000
                     83: #define IWI_INTR_FATAL_ERROR   0x40000000
                     84: #define IWI_INTR_PARITY_ERROR  0x80000000
                     85:
                     86: #define IWI_INTR_MASK                                                  \
                     87:        (IWI_INTR_RX_DONE | IWI_INTR_CMD_DONE | IWI_INTR_TX1_DONE |     \
                     88:         IWI_INTR_TX2_DONE | IWI_INTR_TX3_DONE | IWI_INTR_TX4_DONE |    \
                     89:         IWI_INTR_FW_INITED | IWI_INTR_RADIO_OFF |                      \
                     90:         IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)
                     91:
                     92: /* possible flags for register IWI_CSR_RST */
                     93: #define IWI_RST_PRINCETON_RESET        0x00000001
                     94: #define IWI_RST_SW_RESET       0x00000080
                     95: #define IWI_RST_MASTER_DISABLED        0x00000100
                     96: #define IWI_RST_STOP_MASTER    0x00000200
                     97:
                     98: /* possible flags for register IWI_CSR_CTL */
                     99: #define IWI_CTL_CLOCK_READY    0x00000001
                    100: #define IWI_CTL_ALLOW_STANDBY  0x00000002
                    101: #define IWI_CTL_INIT           0x00000004
                    102:
                    103: /* possible flags for register IWI_CSR_IO */
                    104: #define IWI_IO_RADIO_ENABLED   0x00010000
                    105:
                    106: /* possible flags for IWI_CSR_READ_INT */
                    107: #define IWI_READ_INT_INIT_HOST 0x20000000
                    108:
                    109: /* constants for command blocks */
                    110: #define IWI_CB_DEFAULT_CTL     0x8cea0000
                    111: #define IWI_CB_MAXDATALEN      8191
                    112:
                    113: /* firmware binary image header */
                    114: struct iwi_firmware_hdr {
                    115:        uint8_t         oldvermaj;
                    116:        uint8_t         oldvermin;
                    117:        uint8_t         vermaj;
                    118:        uint8_t         vermin;
                    119:        uint32_t        bootsz;
                    120:        uint32_t        ucodesz;
                    121:        uint32_t        mainsz;
                    122: } __packed;
                    123:
                    124: struct iwi_hdr {
                    125:        uint8_t type;
                    126: #define IWI_HDR_TYPE_DATA      0
                    127: #define IWI_HDR_TYPE_COMMAND   1
                    128: #define IWI_HDR_TYPE_NOTIF     3
                    129: #define IWI_HDR_TYPE_FRAME     9
                    130:
                    131:        uint8_t seq;
                    132:        uint8_t flags;
                    133: #define IWI_HDR_FLAG_IRQ       0x04
                    134:
                    135:        uint8_t reserved;
                    136: } __packed;
                    137:
                    138: struct iwi_notif {
                    139:        uint32_t        reserved[2];
                    140:        uint8_t         type;
                    141: #define IWI_NOTIF_TYPE_ASSOCIATION     10
                    142: #define IWI_NOTIF_TYPE_AUTHENTICATION  11
                    143: #define IWI_NOTIF_TYPE_SCAN_CHANNEL    12
                    144: #define IWI_NOTIF_TYPE_SCAN_COMPLETE   13
                    145: #define IWI_NOTIF_TYPE_BAD_LINK                15
                    146: #define IWI_NOTIF_TYPE_BEACON          17
                    147: #define IWI_NOTIF_TYPE_CALIBRATION     20
                    148: #define IWI_NOTIF_TYPE_NOISE           25
                    149:
                    150:        uint8_t         flags;
                    151:        uint16_t        len;
                    152: } __packed;
                    153:
                    154: /* structure for notification IWI_NOTIF_TYPE_AUTHENTICATION */
                    155: struct iwi_notif_authentication {
                    156:        uint8_t state;
                    157: #define IWI_DEAUTHENTICATED    0
                    158: #define IWI_AUTHENTICATED      9
                    159: } __packed;
                    160:
                    161: /* structure for notification IWI_NOTIF_TYPE_ASSOCIATION */
                    162: struct iwi_notif_association {
                    163:        uint8_t                 state;
                    164: #define IWI_DEASSOCIATED       0
                    165: #define IWI_ASSOCIATED         12
                    166:
                    167:        struct ieee80211_frame  frame;
                    168:        uint16_t                capinfo;
                    169:        uint16_t                status;
                    170:        uint16_t                associd;
                    171: } __packed;
                    172:
                    173: /* structure for notification IWI_NOTIF_TYPE_SCAN_CHANNEL */
                    174: struct iwi_notif_scan_channel {
                    175:        uint8_t nchan;
                    176:        uint8_t reserved[47];
                    177: } __packed;
                    178:
                    179: /* structure for notification IWI_NOTIF_TYPE_SCAN_COMPLETE */
                    180: struct iwi_notif_scan_complete {
                    181:        uint8_t type;
                    182:        uint8_t nchan;
                    183:        uint8_t status;
                    184:        uint8_t reserved;
                    185: } __packed;
                    186:
                    187: /* structure for notification IWI_NOTIF_TYPE_BEACON */
                    188: struct iwi_notif_beacon {
                    189:        uint32_t        status;
                    190: #define IWI_BEACON_MISSED      1
                    191:
                    192:        uint32_t        count;
                    193: };
                    194:
                    195: /* received frame header */
                    196: struct iwi_frame {
                    197:        uint32_t        reserved1[2];
                    198:        uint8_t         chan;
                    199:        uint8_t         status;
                    200:        uint8_t         rate;
                    201:        uint8_t         rssi;   /* receiver signal strength indicator */
                    202:        uint8_t         agc;    /* automatic gain control */
                    203:        uint8_t         rssi_dbm;
                    204:        uint16_t        signal;
                    205:        uint16_t        noise;
                    206:        uint8_t         antenna;
                    207:        uint8_t         control;
                    208:        uint8_t         reserved2[2];
                    209:        uint16_t        len;
                    210: } __packed;
                    211:
                    212: /* header for transmission */
                    213: struct iwi_tx_desc {
                    214:        struct iwi_hdr  hdr;
                    215:        uint32_t        reserved1;
                    216:        uint8_t         station;
                    217:        uint8_t         reserved2[3];
                    218:        uint8_t         cmd;
                    219: #define IWI_DATA_CMD_TX        0x0b
                    220:
                    221:        uint8_t         seq;
                    222:        uint16_t        len;
                    223:        uint8_t         priority;
                    224:        uint8_t         flags;
                    225: #define IWI_DATA_FLAG_SHPREAMBLE       (1 << 2)
                    226: #define IWI_DATA_FLAG_NO_WEP           (1 << 5)
                    227: #define IWI_DATA_FLAG_NEED_ACK         (1 << 7)
                    228:
                    229:        uint8_t         xflags;
                    230: #define IWI_DATA_XFLAG_CCK     (1 << 0)
                    231:
                    232:        uint8_t         wep_txkey;
                    233: #define IWI_DATA_KEY_WEP40     (1 << 6)
                    234: #define IWI_DATA_KEY_WEP104    (1 << 7)
                    235:
                    236:        uint8_t         wepkey[IEEE80211_KEYBUF_SIZE];
                    237:        uint8_t         rate;
                    238:        uint8_t         antenna;
                    239:        uint8_t         reserved3[10];
                    240:
                    241:        struct ieee80211_qosframe_addr4 wh;
                    242:        uint32_t        iv[2];
                    243:
                    244:        uint32_t        nseg;
                    245: #define IWI_MAX_NSEG   6
                    246: #define IWI_MAX_SCATTER        (IWI_MAX_NSEG - 2)
                    247:
                    248:        uint32_t        seg_addr[IWI_MAX_NSEG];
                    249:        uint16_t        seg_len[IWI_MAX_NSEG];
                    250: } __packed;
                    251:
                    252: /* command */
                    253: struct iwi_cmd_desc {
                    254:        struct iwi_hdr  hdr;
                    255:        uint8_t         type;
                    256: #define IWI_CMD_ENABLE                 2
                    257: #define IWI_CMD_SET_CONFIG             6
                    258: #define IWI_CMD_SET_ESSID              8
                    259: #define IWI_CMD_SET_MAC_ADDRESS                11
                    260: #define IWI_CMD_SET_RTS_THRESHOLD      15
                    261: #define IWI_CMD_SET_FRAG_THRESHOLD     16
                    262: #define IWI_CMD_SET_POWER_MODE         17
                    263: #define IWI_CMD_SET_WEP_KEY            18
                    264: #define IWI_CMD_ASSOCIATE              21
                    265: #define IWI_CMD_SET_RATES              22
                    266: #define IWI_CMD_SCAN                   26
                    267: #define IWI_CMD_DISABLE                        33
                    268: #define IWI_CMD_SET_IV                 34
                    269: #define IWI_CMD_SET_TX_POWER           35
                    270: #define IWI_CMD_SET_SENSITIVITY                42
                    271:
                    272:        uint8_t         len;
                    273:        uint16_t        reserved;
                    274:        uint8_t         data[120];
                    275: } __packed;
                    276:
                    277: /* node information (IBSS) */
                    278: struct iwi_node {
                    279:        uint8_t bssid[IEEE80211_ADDR_LEN];
                    280:        uint8_t reserved[2];
                    281: } __packed;
                    282:
                    283: /* constants for 'mode' fields */
                    284: #define IWI_MODE_11A   0
                    285: #define IWI_MODE_11B   1
                    286: #define IWI_MODE_11G   2
                    287:
                    288: /* possible values for command IWI_CMD_SET_POWER_MODE */
                    289: #define IWI_POWER_MODE_CAM     0
                    290:
                    291: /* structure for command IWI_CMD_SET_RATES */
                    292: struct iwi_rateset {
                    293:        uint8_t mode;
                    294:        uint8_t nrates;
                    295:        uint8_t type;
                    296: #define IWI_RATESET_TYPE_NEGOTIATED    0
                    297: #define IWI_RATESET_TYPE_SUPPORTED     1
                    298:
                    299:        uint8_t reserved;
                    300:        uint8_t rates[12];
                    301: } __packed;
                    302:
                    303: /* structure for command IWI_CMD_SET_TX_POWER */
                    304: struct iwi_txpower {
                    305:        uint8_t nchan;
                    306:        uint8_t mode;
                    307:        struct {
                    308:                uint8_t chan;
                    309:                uint8_t power;
                    310: #define IWI_TXPOWER_MAX                20
                    311: #define IWI_TXPOWER_RATIO      (IEEE80211_TXPOWER_MAX / IWI_TXPOWER_MAX)
                    312:        } __packed chan[37];
                    313: } __packed;
                    314:
                    315: /* structure for command IWI_CMD_ASSOCIATE */
                    316: struct iwi_associate {
                    317:        uint8_t         chan;
                    318:        uint8_t         auth;
                    319: #define IWI_AUTH_OPEN  0
                    320: #define IWI_AUTH_SHARED        1
                    321: #define IWI_AUTH_NONE  3
                    322:
                    323:        uint8_t         type;
                    324: #define IWI_ASSOC_ASSOCIATE    0
                    325: #define IWI_ASSOC_REASSOCIATE  1
                    326: #define IWI_ASSOC_DISASSOCIATE 2
                    327: #define IWI_ASSOC_SIBSS                3
                    328:
                    329:        uint8_t         reserved1;
                    330:        uint16_t        reserved2;
                    331:        uint8_t         plen;
                    332: #define IWI_ASSOC_SHPREAMBLE   (1 << 2)
                    333:
                    334:        uint8_t         mode;
                    335:        uint8_t         bssid[IEEE80211_ADDR_LEN];
                    336:        uint8_t         tstamp[8];
                    337:        uint16_t        capinfo;
                    338:        uint16_t        lintval;
                    339:        uint16_t        intval;
                    340:        uint8_t         dst[IEEE80211_ADDR_LEN];
                    341:        uint32_t        reserved3;
                    342:        uint16_t        reserved4;
                    343: } __packed;
                    344:
                    345: /* structure for command IWI_CMD_SCAN */
                    346: struct iwi_scan {
                    347:        uint32_t        index;
                    348:        uint8_t         channels[54];
                    349: #define IWI_CHAN_5GHZ  (0 << 6)
                    350: #define IWI_CHAN_2GHZ  (1 << 6)
                    351:
                    352:        uint8_t         type[27];
                    353: #define IWI_SCAN_TYPE_PASSIVE  0x11
                    354: #define IWI_SCAN_TYPE_DIRECTED 0x22
                    355: #define IWI_SCAN_TYPE_BROADCAST        0x33
                    356: #define IWI_SCAN_TYPE_BDIRECTED        0x44
                    357:
                    358:        uint8_t         reserved1;
                    359:        uint16_t        reserved2;
                    360:        uint16_t        passive;        /* dwell time */
                    361:        uint16_t        directed;       /* dwell time */
                    362:        uint16_t        broadcast;      /* dwell time */
                    363:        uint16_t        bdirected;      /* dwell time */
                    364: } __packed;
                    365:
                    366: /* structure for command IWI_CMD_SET_CONFIGURATION */
                    367: struct iwi_configuration {
                    368:        uint8_t bluetooth_coexistence;
                    369:        uint8_t reserved1;
                    370:        uint8_t answer_pbreq;
                    371:        uint8_t allow_invalid_frames;
                    372:        uint8_t multicast_enabled;
                    373:        uint8_t exclude_unicast_unencrypted;
                    374:        uint8_t disable_unicast_decryption;
                    375:        uint8_t exclude_multicast_unencrypted;
                    376:        uint8_t disable_multicast_decryption;
                    377:        uint8_t antenna;
                    378:        uint8_t reserved2;
                    379:        uint8_t bg_autodetection;
                    380:        uint8_t reserved3;
                    381:        uint8_t enable_multicast_filtering;
                    382:        uint8_t bluetooth_threshold;
                    383:        uint8_t silence_threshold;
                    384:        uint8_t allow_beacon_and_probe_resp;
                    385:        uint8_t allow_mgt;
                    386:        uint8_t report_noise;
                    387:        uint8_t reserved5;
                    388: } __packed;
                    389:
                    390: /* structure for command IWI_CMD_SET_WEP_KEY */
                    391: struct iwi_wep_key {
                    392:        uint8_t cmd;
                    393: #define IWI_WEP_KEY_CMD_SETKEY 0x08
                    394:
                    395:        uint8_t seq;
                    396:        uint8_t idx;
                    397:        uint8_t len;
                    398:        uint8_t key[IEEE80211_KEYBUF_SIZE];
                    399: } __packed;
                    400:
                    401: #define IWI_MEM_EEPROM_CTL     0x00300040
                    402: #define IWI_MEM_EVENT_CTL      0x00300004
                    403:
                    404: /* possible flags for register IWI_MEM_EVENT */
                    405: #define IWI_LED_ASSOC  (1 << 5)
                    406: #define IWI_LED_MASK   0xd9fffffb
                    407:
                    408: /* EEPROM = Electrically Erasable Programmable Read-Only Memory */
                    409:
                    410: #define IWI_EEPROM_MAC 0x21
                    411:
                    412: #define IWI_EEPROM_DELAY       1       /* minimum hold time (microsecond) */
                    413:
                    414: #define IWI_EEPROM_C   (1 << 0)        /* Serial Clock */
                    415: #define IWI_EEPROM_S   (1 << 1)        /* Chip Select */
                    416: #define IWI_EEPROM_D   (1 << 2)        /* Serial data input */
                    417: #define IWI_EEPROM_Q   (1 << 4)        /* Serial data output */
                    418:
                    419: #define IWI_EEPROM_SHIFT_D     2
                    420: #define IWI_EEPROM_SHIFT_Q     4
                    421:
                    422: /*
                    423:  * control and status registers access macros
                    424:  */
                    425: #define CSR_READ_1(sc, reg)                                            \
                    426:        bus_space_read_1((sc)->sc_st, (sc)->sc_sh, (reg))
                    427:
                    428: #define CSR_READ_2(sc, reg)                                            \
                    429:        bus_space_read_2((sc)->sc_st, (sc)->sc_sh, (reg))
                    430:
                    431: #define CSR_READ_4(sc, reg)                                            \
                    432:        bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
                    433:
                    434: #define CSR_READ_REGION_4(sc, offset, datap, count)                    \
                    435:        bus_space_read_region_4((sc)->sc_st, (sc)->sc_sh, (offset),     \
                    436:            (datap), (count))
                    437:
                    438: #define CSR_WRITE_1(sc, reg, val)                                      \
                    439:        bus_space_write_1((sc)->sc_st, (sc)->sc_sh, (reg), (val))
                    440:
                    441: #define CSR_WRITE_2(sc, reg, val)                                      \
                    442:        bus_space_write_2((sc)->sc_st, (sc)->sc_sh, (reg), (val))
                    443:
                    444: #define CSR_WRITE_4(sc, reg, val)                                      \
                    445:        bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
                    446:
                    447: #define CSR_WRITE_REGION_1(sc, offset, datap, count)                   \
                    448:        bus_space_write_region_1((sc)->sc_st, (sc)->sc_sh, (offset),    \
                    449:            (datap), (count))
                    450: /*
                    451:  * indirect memory space access macros
                    452:  */
                    453: #define MEM_WRITE_1(sc, addr, val) do {                                        \
                    454:        CSR_WRITE_4((sc), IWI_CSR_INDIRECT_ADDR, (addr));               \
                    455:        CSR_WRITE_1((sc), IWI_CSR_INDIRECT_DATA, (val));                \
                    456: } while (/* CONSTCOND */0)
                    457:
                    458: #define MEM_WRITE_2(sc, addr, val) do {                                        \
                    459:        CSR_WRITE_4((sc), IWI_CSR_INDIRECT_ADDR, (addr));               \
                    460:        CSR_WRITE_2((sc), IWI_CSR_INDIRECT_DATA, (val));                \
                    461: } while (/* CONSTCOND */0)
                    462:
                    463: #define MEM_WRITE_4(sc, addr, val) do {                                        \
                    464:        CSR_WRITE_4((sc), IWI_CSR_INDIRECT_ADDR, (addr));               \
                    465:        CSR_WRITE_4((sc), IWI_CSR_INDIRECT_DATA, (val));                \
                    466: } while (/* CONSTCOND */0)
                    467:
                    468: #define MEM_WRITE_MULTI_1(sc, addr, buf, len) do {                     \
                    469:        CSR_WRITE_4((sc), IWI_CSR_INDIRECT_ADDR, (addr));               \
                    470:        CSR_WRITE_MULTI_1((sc), IWI_CSR_INDIRECT_DATA, (buf), (len));   \
                    471: } while (/* CONSTCOND */0)
                    472:
                    473: /*
                    474:  * EEPROM access macro
                    475:  */
                    476: #define IWI_EEPROM_CTL(sc, val) do {                                   \
                    477:        MEM_WRITE_4((sc), IWI_MEM_EEPROM_CTL, (val));                   \
                    478:        DELAY(IWI_EEPROM_DELAY);                                        \
                    479: } while (/* CONSTCOND */0)

CVSweb