Annotation of qemu/roms/ipxe/src/drivers/net/ath5k/desc.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2004-2008 Reyk Floeter <[email protected]>
        !             3:  * Copyright (c) 2006-2008 Nick Kossifidis <[email protected]>
        !             4:  *
        !             5:  * Permission to use, copy, modify, and distribute this software for any
        !             6:  * purpose with or without fee is hereby granted, provided that the above
        !             7:  * copyright notice and this permission notice appear in all copies.
        !             8:  *
        !             9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            16:  *
        !            17:  */
        !            18: 
        !            19: /*
        !            20:  * Internal RX/TX descriptor structures
        !            21:  * (rX: reserved fields possibily used by future versions of the ar5k chipset)
        !            22:  */
        !            23: 
        !            24: /*
        !            25:  * common hardware RX control descriptor
        !            26:  */
        !            27: struct ath5k_hw_rx_ctl {
        !            28:        u32     rx_control_0; /* RX control word 0 */
        !            29:        u32     rx_control_1; /* RX control word 1 */
        !            30: } __attribute__ ((packed));
        !            31: 
        !            32: /* RX control word 0 field/sflags */
        !            33: #define AR5K_DESC_RX_CTL0                      0x00000000
        !            34: 
        !            35: /* RX control word 1 fields/flags */
        !            36: #define AR5K_DESC_RX_CTL1_BUF_LEN              0x00000fff
        !            37: #define AR5K_DESC_RX_CTL1_INTREQ               0x00002000
        !            38: 
        !            39: /*
        !            40:  * common hardware RX status descriptor
        !            41:  * 5210/11 and 5212 differ only in the flags defined below
        !            42:  */
        !            43: struct ath5k_hw_rx_status {
        !            44:        u32     rx_status_0; /* RX status word 0 */
        !            45:        u32     rx_status_1; /* RX status word 1 */
        !            46: } __attribute__ ((packed));
        !            47: 
        !            48: /* 5210/5211 */
        !            49: /* RX status word 0 fields/flags */
        !            50: #define AR5K_5210_RX_DESC_STATUS0_DATA_LEN             0x00000fff
        !            51: #define AR5K_5210_RX_DESC_STATUS0_MORE                 0x00001000
        !            52: #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_RATE         0x00078000
        !            53: #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_RATE_S       15
        !            54: #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_SIGNAL       0x07f80000
        !            55: #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_SIGNAL_S     19
        !            56: #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_ANTENNA      0x38000000
        !            57: #define AR5K_5210_RX_DESC_STATUS0_RECEIVE_ANTENNA_S    27
        !            58: 
        !            59: /* RX status word 1 fields/flags */
        !            60: #define AR5K_5210_RX_DESC_STATUS1_DONE                 0x00000001
        !            61: #define AR5K_5210_RX_DESC_STATUS1_FRAME_RECEIVE_OK     0x00000002
        !            62: #define AR5K_5210_RX_DESC_STATUS1_CRC_ERROR            0x00000004
        !            63: #define AR5K_5210_RX_DESC_STATUS1_FIFO_OVERRUN         0x00000008
        !            64: #define AR5K_5210_RX_DESC_STATUS1_DECRYPT_CRC_ERROR    0x00000010
        !            65: #define AR5K_5210_RX_DESC_STATUS1_PHY_ERROR            0x000000e0
        !            66: #define AR5K_5210_RX_DESC_STATUS1_PHY_ERROR_S          5
        !            67: #define AR5K_5210_RX_DESC_STATUS1_KEY_INDEX_VALID      0x00000100
        !            68: #define AR5K_5210_RX_DESC_STATUS1_KEY_INDEX            0x00007e00
        !            69: #define AR5K_5210_RX_DESC_STATUS1_KEY_INDEX_S          9
        !            70: #define AR5K_5210_RX_DESC_STATUS1_RECEIVE_TIMESTAMP    0x0fff8000
        !            71: #define AR5K_5210_RX_DESC_STATUS1_RECEIVE_TIMESTAMP_S  15
        !            72: #define AR5K_5210_RX_DESC_STATUS1_KEY_CACHE_MISS       0x10000000
        !            73: 
        !            74: /* 5212 */
        !            75: /* RX status word 0 fields/flags */
        !            76: #define AR5K_5212_RX_DESC_STATUS0_DATA_LEN             0x00000fff
        !            77: #define AR5K_5212_RX_DESC_STATUS0_MORE                 0x00001000
        !            78: #define AR5K_5212_RX_DESC_STATUS0_DECOMP_CRC_ERROR     0x00002000
        !            79: #define AR5K_5212_RX_DESC_STATUS0_RECEIVE_RATE         0x000f8000
        !            80: #define AR5K_5212_RX_DESC_STATUS0_RECEIVE_RATE_S       15
        !            81: #define AR5K_5212_RX_DESC_STATUS0_RECEIVE_SIGNAL       0x0ff00000
        !            82: #define AR5K_5212_RX_DESC_STATUS0_RECEIVE_SIGNAL_S     20
        !            83: #define AR5K_5212_RX_DESC_STATUS0_RECEIVE_ANTENNA      0xf0000000
        !            84: #define AR5K_5212_RX_DESC_STATUS0_RECEIVE_ANTENNA_S    28
        !            85: 
        !            86: /* RX status word 1 fields/flags */
        !            87: #define AR5K_5212_RX_DESC_STATUS1_DONE                 0x00000001
        !            88: #define AR5K_5212_RX_DESC_STATUS1_FRAME_RECEIVE_OK     0x00000002
        !            89: #define AR5K_5212_RX_DESC_STATUS1_CRC_ERROR            0x00000004
        !            90: #define AR5K_5212_RX_DESC_STATUS1_DECRYPT_CRC_ERROR    0x00000008
        !            91: #define AR5K_5212_RX_DESC_STATUS1_PHY_ERROR            0x00000010
        !            92: #define AR5K_5212_RX_DESC_STATUS1_MIC_ERROR            0x00000020
        !            93: #define AR5K_5212_RX_DESC_STATUS1_KEY_INDEX_VALID      0x00000100
        !            94: #define AR5K_5212_RX_DESC_STATUS1_KEY_INDEX            0x0000fe00
        !            95: #define AR5K_5212_RX_DESC_STATUS1_KEY_INDEX_S          9
        !            96: #define AR5K_5212_RX_DESC_STATUS1_RECEIVE_TIMESTAMP    0x7fff0000
        !            97: #define AR5K_5212_RX_DESC_STATUS1_RECEIVE_TIMESTAMP_S  16
        !            98: #define AR5K_5212_RX_DESC_STATUS1_KEY_CACHE_MISS       0x80000000
        !            99: 
        !           100: /*
        !           101:  * common hardware RX error descriptor
        !           102:  */
        !           103: struct ath5k_hw_rx_error {
        !           104:        u32     rx_error_0; /* RX status word 0 */
        !           105:        u32     rx_error_1; /* RX status word 1 */
        !           106: } __attribute__ ((packed));
        !           107: 
        !           108: /* RX error word 0 fields/flags */
        !           109: #define AR5K_RX_DESC_ERROR0                    0x00000000
        !           110: 
        !           111: /* RX error word 1 fields/flags */
        !           112: #define AR5K_RX_DESC_ERROR1_PHY_ERROR_CODE     0x0000ff00
        !           113: #define AR5K_RX_DESC_ERROR1_PHY_ERROR_CODE_S   8
        !           114: 
        !           115: /* PHY Error codes */
        !           116: #define AR5K_DESC_RX_PHY_ERROR_NONE            0x00
        !           117: #define AR5K_DESC_RX_PHY_ERROR_TIMING          0x20
        !           118: #define AR5K_DESC_RX_PHY_ERROR_PARITY          0x40
        !           119: #define AR5K_DESC_RX_PHY_ERROR_RATE            0x60
        !           120: #define AR5K_DESC_RX_PHY_ERROR_LENGTH          0x80
        !           121: #define AR5K_DESC_RX_PHY_ERROR_64QAM           0xa0
        !           122: #define AR5K_DESC_RX_PHY_ERROR_SERVICE         0xc0
        !           123: #define AR5K_DESC_RX_PHY_ERROR_TRANSMITOVR     0xe0
        !           124: 
        !           125: /*
        !           126:  * 5210/5211 hardware 2-word TX control descriptor
        !           127:  */
        !           128: struct ath5k_hw_2w_tx_ctl {
        !           129:        u32     tx_control_0; /* TX control word 0 */
        !           130:        u32     tx_control_1; /* TX control word 1 */
        !           131: } __attribute__ ((packed));
        !           132: 
        !           133: /* TX control word 0 fields/flags */
        !           134: #define AR5K_2W_TX_DESC_CTL0_FRAME_LEN         0x00000fff
        !           135: #define AR5K_2W_TX_DESC_CTL0_HEADER_LEN                0x0003f000 /*[5210 ?]*/
        !           136: #define AR5K_2W_TX_DESC_CTL0_HEADER_LEN_S      12
        !           137: #define AR5K_2W_TX_DESC_CTL0_XMIT_RATE         0x003c0000
        !           138: #define AR5K_2W_TX_DESC_CTL0_XMIT_RATE_S       18
        !           139: #define AR5K_2W_TX_DESC_CTL0_RTSENA            0x00400000
        !           140: #define AR5K_2W_TX_DESC_CTL0_CLRDMASK          0x01000000
        !           141: #define AR5K_2W_TX_DESC_CTL0_LONG_PACKET       0x00800000 /*[5210]*/
        !           142: #define AR5K_2W_TX_DESC_CTL0_VEOL              0x00800000 /*[5211]*/
        !           143: #define AR5K_2W_TX_DESC_CTL0_FRAME_TYPE                0x1c000000 /*[5210]*/
        !           144: #define AR5K_2W_TX_DESC_CTL0_FRAME_TYPE_S      26
        !           145: #define AR5K_2W_TX_DESC_CTL0_ANT_MODE_XMIT_5210        0x02000000
        !           146: #define AR5K_2W_TX_DESC_CTL0_ANT_MODE_XMIT_5211        0x1e000000
        !           147: 
        !           148: #define AR5K_2W_TX_DESC_CTL0_ANT_MODE_XMIT                     \
        !           149:                (ah->ah_version == AR5K_AR5210 ?                \
        !           150:                AR5K_2W_TX_DESC_CTL0_ANT_MODE_XMIT_5210 :       \
        !           151:                AR5K_2W_TX_DESC_CTL0_ANT_MODE_XMIT_5211)
        !           152: 
        !           153: #define AR5K_2W_TX_DESC_CTL0_ANT_MODE_XMIT_S   25
        !           154: #define AR5K_2W_TX_DESC_CTL0_INTREQ            0x20000000
        !           155: #define AR5K_2W_TX_DESC_CTL0_ENCRYPT_KEY_VALID 0x40000000
        !           156: 
        !           157: /* TX control word 1 fields/flags */
        !           158: #define AR5K_2W_TX_DESC_CTL1_BUF_LEN           0x00000fff
        !           159: #define AR5K_2W_TX_DESC_CTL1_MORE              0x00001000
        !           160: #define AR5K_2W_TX_DESC_CTL1_ENCRYPT_KEY_INDEX_5210    0x0007e000
        !           161: #define AR5K_2W_TX_DESC_CTL1_ENCRYPT_KEY_INDEX_5211    0x000fe000
        !           162: 
        !           163: #define AR5K_2W_TX_DESC_CTL1_ENCRYPT_KEY_INDEX                         \
        !           164:                        (ah->ah_version == AR5K_AR5210 ?                \
        !           165:                        AR5K_2W_TX_DESC_CTL1_ENCRYPT_KEY_INDEX_5210 :   \
        !           166:                        AR5K_2W_TX_DESC_CTL1_ENCRYPT_KEY_INDEX_5211)
        !           167: 
        !           168: #define AR5K_2W_TX_DESC_CTL1_ENCRYPT_KEY_INDEX_S       13
        !           169: #define AR5K_2W_TX_DESC_CTL1_FRAME_TYPE                0x00700000 /*[5211]*/
        !           170: #define AR5K_2W_TX_DESC_CTL1_FRAME_TYPE_S      20
        !           171: #define AR5K_2W_TX_DESC_CTL1_NOACK             0x00800000 /*[5211]*/
        !           172: #define AR5K_2W_TX_DESC_CTL1_RTS_DURATION      0xfff80000 /*[5210 ?]*/
        !           173: 
        !           174: /* Frame types */
        !           175: #define AR5K_AR5210_TX_DESC_FRAME_TYPE_NORMAL   0x00
        !           176: #define AR5K_AR5210_TX_DESC_FRAME_TYPE_ATIM     0x04
        !           177: #define AR5K_AR5210_TX_DESC_FRAME_TYPE_PSPOLL   0x08
        !           178: #define AR5K_AR5210_TX_DESC_FRAME_TYPE_NO_DELAY 0x0c
        !           179: #define AR5K_AR5210_TX_DESC_FRAME_TYPE_PIFS     0x10
        !           180: 
        !           181: /*
        !           182:  * 5212 hardware 4-word TX control descriptor
        !           183:  */
        !           184: struct ath5k_hw_4w_tx_ctl {
        !           185:        u32     tx_control_0; /* TX control word 0 */
        !           186: 
        !           187: #define AR5K_4W_TX_DESC_CTL0_FRAME_LEN         0x00000fff
        !           188: #define AR5K_4W_TX_DESC_CTL0_XMIT_POWER                0x003f0000
        !           189: #define AR5K_4W_TX_DESC_CTL0_XMIT_POWER_S      16
        !           190: #define AR5K_4W_TX_DESC_CTL0_RTSENA            0x00400000
        !           191: #define AR5K_4W_TX_DESC_CTL0_VEOL              0x00800000
        !           192: #define AR5K_4W_TX_DESC_CTL0_CLRDMASK          0x01000000
        !           193: #define AR5K_4W_TX_DESC_CTL0_ANT_MODE_XMIT     0x1e000000
        !           194: #define AR5K_4W_TX_DESC_CTL0_ANT_MODE_XMIT_S   25
        !           195: #define AR5K_4W_TX_DESC_CTL0_INTREQ            0x20000000
        !           196: #define AR5K_4W_TX_DESC_CTL0_ENCRYPT_KEY_VALID 0x40000000
        !           197: #define AR5K_4W_TX_DESC_CTL0_CTSENA            0x80000000
        !           198: 
        !           199:        u32     tx_control_1; /* TX control word 1 */
        !           200: 
        !           201: #define AR5K_4W_TX_DESC_CTL1_BUF_LEN           0x00000fff
        !           202: #define AR5K_4W_TX_DESC_CTL1_MORE              0x00001000
        !           203: #define AR5K_4W_TX_DESC_CTL1_ENCRYPT_KEY_INDEX 0x000fe000
        !           204: #define AR5K_4W_TX_DESC_CTL1_ENCRYPT_KEY_INDEX_S       13
        !           205: #define AR5K_4W_TX_DESC_CTL1_FRAME_TYPE                0x00f00000
        !           206: #define AR5K_4W_TX_DESC_CTL1_FRAME_TYPE_S      20
        !           207: #define AR5K_4W_TX_DESC_CTL1_NOACK             0x01000000
        !           208: #define AR5K_4W_TX_DESC_CTL1_COMP_PROC         0x06000000
        !           209: #define AR5K_4W_TX_DESC_CTL1_COMP_PROC_S       25
        !           210: #define AR5K_4W_TX_DESC_CTL1_COMP_IV_LEN       0x18000000
        !           211: #define AR5K_4W_TX_DESC_CTL1_COMP_IV_LEN_S     27
        !           212: #define AR5K_4W_TX_DESC_CTL1_COMP_ICV_LEN      0x60000000
        !           213: #define AR5K_4W_TX_DESC_CTL1_COMP_ICV_LEN_S    29
        !           214: 
        !           215:        u32     tx_control_2; /* TX control word 2 */
        !           216: 
        !           217: #define AR5K_4W_TX_DESC_CTL2_RTS_DURATION              0x00007fff
        !           218: #define AR5K_4W_TX_DESC_CTL2_DURATION_UPDATE_ENABLE    0x00008000
        !           219: #define AR5K_4W_TX_DESC_CTL2_XMIT_TRIES0               0x000f0000
        !           220: #define AR5K_4W_TX_DESC_CTL2_XMIT_TRIES0_S             16
        !           221: #define AR5K_4W_TX_DESC_CTL2_XMIT_TRIES1               0x00f00000
        !           222: #define AR5K_4W_TX_DESC_CTL2_XMIT_TRIES1_S             20
        !           223: #define AR5K_4W_TX_DESC_CTL2_XMIT_TRIES2               0x0f000000
        !           224: #define AR5K_4W_TX_DESC_CTL2_XMIT_TRIES2_S             24
        !           225: #define AR5K_4W_TX_DESC_CTL2_XMIT_TRIES3               0xf0000000
        !           226: #define AR5K_4W_TX_DESC_CTL2_XMIT_TRIES3_S             28
        !           227: 
        !           228:        u32     tx_control_3; /* TX control word 3 */
        !           229: 
        !           230: #define AR5K_4W_TX_DESC_CTL3_XMIT_RATE0                0x0000001f
        !           231: #define AR5K_4W_TX_DESC_CTL3_XMIT_RATE1                0x000003e0
        !           232: #define AR5K_4W_TX_DESC_CTL3_XMIT_RATE1_S      5
        !           233: #define AR5K_4W_TX_DESC_CTL3_XMIT_RATE2                0x00007c00
        !           234: #define AR5K_4W_TX_DESC_CTL3_XMIT_RATE2_S      10
        !           235: #define AR5K_4W_TX_DESC_CTL3_XMIT_RATE3                0x000f8000
        !           236: #define AR5K_4W_TX_DESC_CTL3_XMIT_RATE3_S      15
        !           237: #define AR5K_4W_TX_DESC_CTL3_RTS_CTS_RATE      0x01f00000
        !           238: #define AR5K_4W_TX_DESC_CTL3_RTS_CTS_RATE_S    20
        !           239: } __attribute__ ((packed));
        !           240: 
        !           241: /*
        !           242:  * Common TX status descriptor
        !           243:  */
        !           244: struct ath5k_hw_tx_status {
        !           245:        u32     tx_status_0; /* TX status word 0 */
        !           246:        u32     tx_status_1; /* TX status word 1 */
        !           247: } __attribute__ ((packed));
        !           248: 
        !           249: /* TX status word 0 fields/flags */
        !           250: #define AR5K_DESC_TX_STATUS0_FRAME_XMIT_OK     0x00000001
        !           251: #define AR5K_DESC_TX_STATUS0_EXCESSIVE_RETRIES 0x00000002
        !           252: #define AR5K_DESC_TX_STATUS0_FIFO_UNDERRUN     0x00000004
        !           253: #define AR5K_DESC_TX_STATUS0_FILTERED          0x00000008
        !           254: /*???
        !           255: #define AR5K_DESC_TX_STATUS0_RTS_FAIL_COUNT    0x000000f0
        !           256: #define AR5K_DESC_TX_STATUS0_RTS_FAIL_COUNT_S  4
        !           257: */
        !           258: #define AR5K_DESC_TX_STATUS0_SHORT_RETRY_COUNT 0x000000f0
        !           259: #define AR5K_DESC_TX_STATUS0_SHORT_RETRY_COUNT_S       4
        !           260: /*???
        !           261: #define AR5K_DESC_TX_STATUS0_DATA_FAIL_COUNT   0x00000f00
        !           262: #define AR5K_DESC_TX_STATUS0_DATA_FAIL_COUNT_S 8
        !           263: */
        !           264: #define AR5K_DESC_TX_STATUS0_LONG_RETRY_COUNT  0x00000f00
        !           265: #define AR5K_DESC_TX_STATUS0_LONG_RETRY_COUNT_S        8
        !           266: #define AR5K_DESC_TX_STATUS0_VIRT_COLL_COUNT   0x0000f000
        !           267: #define AR5K_DESC_TX_STATUS0_VIRT_COLL_COUNT_S 12
        !           268: #define AR5K_DESC_TX_STATUS0_SEND_TIMESTAMP    0xffff0000
        !           269: #define AR5K_DESC_TX_STATUS0_SEND_TIMESTAMP_S  16
        !           270: 
        !           271: /* TX status word 1 fields/flags */
        !           272: #define AR5K_DESC_TX_STATUS1_DONE              0x00000001
        !           273: #define AR5K_DESC_TX_STATUS1_SEQ_NUM           0x00001ffe
        !           274: #define AR5K_DESC_TX_STATUS1_SEQ_NUM_S         1
        !           275: #define AR5K_DESC_TX_STATUS1_ACK_SIG_STRENGTH  0x001fe000
        !           276: #define AR5K_DESC_TX_STATUS1_ACK_SIG_STRENGTH_S        13
        !           277: #define AR5K_DESC_TX_STATUS1_FINAL_TS_INDEX    0x00600000
        !           278: #define AR5K_DESC_TX_STATUS1_FINAL_TS_INDEX_S  21
        !           279: #define AR5K_DESC_TX_STATUS1_COMP_SUCCESS      0x00800000
        !           280: #define AR5K_DESC_TX_STATUS1_XMIT_ANTENNA      0x01000000
        !           281: 
        !           282: /*
        !           283:  * 5210/5211 hardware TX descriptor
        !           284:  */
        !           285: struct ath5k_hw_5210_tx_desc {
        !           286:        struct ath5k_hw_2w_tx_ctl       tx_ctl;
        !           287:        struct ath5k_hw_tx_status       tx_stat;
        !           288: } __attribute__ ((packed));
        !           289: 
        !           290: /*
        !           291:  * 5212 hardware TX descriptor
        !           292:  */
        !           293: struct ath5k_hw_5212_tx_desc {
        !           294:        struct ath5k_hw_4w_tx_ctl       tx_ctl;
        !           295:        struct ath5k_hw_tx_status       tx_stat;
        !           296: } __attribute__ ((packed));
        !           297: 
        !           298: /*
        !           299:  * common hardware RX descriptor
        !           300:  */
        !           301: struct ath5k_hw_all_rx_desc {
        !           302:        struct ath5k_hw_rx_ctl                  rx_ctl;
        !           303:        union {
        !           304:                struct ath5k_hw_rx_status       rx_stat;
        !           305:                struct ath5k_hw_rx_error        rx_err;
        !           306:        } u;
        !           307: } __attribute__ ((packed));
        !           308: 
        !           309: /*
        !           310:  * Atheros hardware descriptor
        !           311:  * This is read and written to by the hardware
        !           312:  */
        !           313: struct ath5k_desc {
        !           314:        u32     ds_link;        /* physical address of the next descriptor */
        !           315:        u32     ds_data;        /* physical address of data buffer (skb) */
        !           316: 
        !           317:        union {
        !           318:                struct ath5k_hw_5210_tx_desc    ds_tx5210;
        !           319:                struct ath5k_hw_5212_tx_desc    ds_tx5212;
        !           320:                struct ath5k_hw_all_rx_desc     ds_rx;
        !           321:        } ud;
        !           322: } __attribute__ ((packed));
        !           323: 
        !           324: #define AR5K_RXDESC_INTREQ     0x0020
        !           325: 
        !           326: #define AR5K_TXDESC_CLRDMASK   0x0001
        !           327: #define AR5K_TXDESC_NOACK      0x0002  /*[5211+]*/
        !           328: #define AR5K_TXDESC_RTSENA     0x0004
        !           329: #define AR5K_TXDESC_CTSENA     0x0008
        !           330: #define AR5K_TXDESC_INTREQ     0x0010
        !           331: #define AR5K_TXDESC_VEOL       0x0020  /*[5211+]*/
        !           332: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.