Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0+ */
0002 /*  FDDI network adapter driver for DEC FDDIcontroller 700/700-C devices.
0003  *
0004  *  Copyright (c) 2018  Maciej W. Rozycki
0005  *
0006  *  This program is free software; you can redistribute it and/or
0007  *  modify it under the terms of the GNU General Public License
0008  *  as published by the Free Software Foundation; either version
0009  *  2 of the License, or (at your option) any later version.
0010  *
0011  *  References:
0012  *
0013  *  Dave Sawyer & Phil Weeks & Frank Itkowsky,
0014  *  "DEC FDDIcontroller 700 Port Specification",
0015  *  Revision 1.1, Digital Equipment Corporation
0016  */
0017 
0018 #include <linux/compiler.h>
0019 #include <linux/if_fddi.h>
0020 #include <linux/spinlock.h>
0021 #include <linux/timer.h>
0022 #include <linux/types.h>
0023 
0024 /* IOmem register offsets. */
0025 #define FZA_REG_BASE        0x100000    /* register base address */
0026 #define FZA_REG_RESET       0x100200    /* reset, r/w */
0027 #define FZA_REG_INT_EVENT   0x100400    /* interrupt event, r/w1c */
0028 #define FZA_REG_STATUS      0x100402    /* status, r/o */
0029 #define FZA_REG_INT_MASK    0x100404    /* interrupt mask, r/w */
0030 #define FZA_REG_CONTROL_A   0x100500    /* control A, r/w1s */
0031 #define FZA_REG_CONTROL_B   0x100502    /* control B, r/w */
0032 
0033 /* Reset register constants.  Bits 1:0 are r/w, others are fixed at 0. */
0034 #define FZA_RESET_DLU   0x0002  /* OR with INIT to blast flash memory */
0035 #define FZA_RESET_INIT  0x0001  /* switch into the reset state */
0036 #define FZA_RESET_CLR   0x0000  /* run self-test and return to work */
0037 
0038 /* Interrupt event register constants.  All bits are r/w1c. */
0039 #define FZA_EVENT_DLU_DONE  0x0800  /* flash memory write complete */
0040 #define FZA_EVENT_FLUSH_TX  0x0400  /* transmit ring flush request */
0041 #define FZA_EVENT_PM_PARITY_ERR 0x0200  /* onboard packet memory parity err */
0042 #define FZA_EVENT_HB_PARITY_ERR 0x0100  /* host bus parity error */
0043 #define FZA_EVENT_NXM_ERR   0x0080  /* non-existent memory access error;
0044                      * also raised for unaligned and
0045                      * unsupported partial-word accesses
0046                      */
0047 #define FZA_EVENT_LINK_ST_CHG   0x0040  /* link status change */
0048 #define FZA_EVENT_STATE_CHG 0x0020  /* adapter state change */
0049 #define FZA_EVENT_UNS_POLL  0x0010  /* unsolicited event service request */
0050 #define FZA_EVENT_CMD_DONE  0x0008  /* command done ack */
0051 #define FZA_EVENT_SMT_TX_POLL   0x0004  /* SMT frame transmit request */
0052 #define FZA_EVENT_RX_POLL   0x0002  /* receive request (packet avail.) */
0053 #define FZA_EVENT_TX_DONE   0x0001  /* RMC transmit done ack */
0054 
0055 /* Status register constants.  All bits are r/o. */
0056 #define FZA_STATUS_DLU_SHIFT    0xc /* down line upgrade status bits */
0057 #define FZA_STATUS_DLU_MASK 0x03
0058 #define FZA_STATUS_LINK_SHIFT   0xb /* link status bits */
0059 #define FZA_STATUS_LINK_MASK    0x01
0060 #define FZA_STATUS_STATE_SHIFT  0x8 /* adapter state bits */
0061 #define FZA_STATUS_STATE_MASK   0x07
0062 #define FZA_STATUS_HALT_SHIFT   0x0 /* halt reason bits */
0063 #define FZA_STATUS_HALT_MASK    0xff
0064 #define FZA_STATUS_TEST_SHIFT   0x0 /* test failure bits */
0065 #define FZA_STATUS_TEST_MASK    0xff
0066 
0067 #define FZA_STATUS_GET_DLU(x)   (((x) >> FZA_STATUS_DLU_SHIFT) &    \
0068                  FZA_STATUS_DLU_MASK)
0069 #define FZA_STATUS_GET_LINK(x)  (((x) >> FZA_STATUS_LINK_SHIFT) &   \
0070                  FZA_STATUS_LINK_MASK)
0071 #define FZA_STATUS_GET_STATE(x) (((x) >> FZA_STATUS_STATE_SHIFT) &  \
0072                  FZA_STATUS_STATE_MASK)
0073 #define FZA_STATUS_GET_HALT(x)  (((x) >> FZA_STATUS_HALT_SHIFT) &   \
0074                  FZA_STATUS_HALT_MASK)
0075 #define FZA_STATUS_GET_TEST(x)  (((x) >> FZA_STATUS_TEST_SHIFT) &   \
0076                  FZA_STATUS_TEST_MASK)
0077 
0078 #define FZA_DLU_FAILURE     0x0 /* DLU catastrophic error; brain dead */
0079 #define FZA_DLU_ERROR       0x1 /* DLU error; old firmware intact */
0080 #define FZA_DLU_SUCCESS     0x2 /* DLU OK; new firmware loaded */
0081 
0082 #define FZA_LINK_OFF        0x0 /* link unavailable */
0083 #define FZA_LINK_ON     0x1 /* link available */
0084 
0085 #define FZA_STATE_RESET     0x0 /* resetting */
0086 #define FZA_STATE_UNINITIALIZED 0x1 /* after a reset */
0087 #define FZA_STATE_INITIALIZED   0x2 /* initialized */
0088 #define FZA_STATE_RUNNING   0x3 /* running (link active) */
0089 #define FZA_STATE_MAINTENANCE   0x4 /* running (link looped back) */
0090 #define FZA_STATE_HALTED    0x5 /* halted (error condition) */
0091 
0092 #define FZA_HALT_UNKNOWN    0x00    /* unknown reason */
0093 #define FZA_HALT_HOST       0x01    /* host-directed HALT */
0094 #define FZA_HALT_HB_PARITY  0x02    /* host bus parity error */
0095 #define FZA_HALT_NXM        0x03    /* adapter non-existent memory ref. */
0096 #define FZA_HALT_SW     0x04    /* adapter software fault */
0097 #define FZA_HALT_HW     0x05    /* adapter hardware fault */
0098 #define FZA_HALT_PC_TRACE   0x06    /* PC Trace path test */
0099 #define FZA_HALT_DLSW       0x07    /* data link software fault */
0100 #define FZA_HALT_DLHW       0x08    /* data link hardware fault */
0101 
0102 #define FZA_TEST_FATAL      0x00    /* self-test catastrophic failure */
0103 #define FZA_TEST_68K        0x01    /* 68000 CPU */
0104 #define FZA_TEST_SRAM_BWADDR    0x02    /* SRAM byte/word address */
0105 #define FZA_TEST_SRAM_DBUS  0x03    /* SRAM data bus */
0106 #define FZA_TEST_SRAM_STUCK1    0x04    /* SRAM stuck-at range 1 */
0107 #define FZA_TEST_SRAM_STUCK2    0x05    /* SRAM stuck-at range 2 */
0108 #define FZA_TEST_SRAM_COUPL1    0x06    /* SRAM coupling range 1 */
0109 #define FZA_TEST_SRAM_COUPL2    0x07    /* SRAM coupling */
0110 #define FZA_TEST_FLASH_CRC  0x08    /* Flash CRC */
0111 #define FZA_TEST_ROM        0x09    /* option ROM */
0112 #define FZA_TEST_PHY_CSR    0x0a    /* PHY CSR */
0113 #define FZA_TEST_MAC_BIST   0x0b    /* MAC BiST */
0114 #define FZA_TEST_MAC_CSR    0x0c    /* MAC CSR */
0115 #define FZA_TEST_MAC_ADDR_UNIQ  0x0d    /* MAC unique address */
0116 #define FZA_TEST_ELM_BIST   0x0e    /* ELM BiST */
0117 #define FZA_TEST_ELM_CSR    0x0f    /* ELM CSR */
0118 #define FZA_TEST_ELM_ADDR_UNIQ  0x10    /* ELM unique address */
0119 #define FZA_TEST_CAM        0x11    /* CAM */
0120 #define FZA_TEST_NIROM      0x12    /* NI ROM checksum */
0121 #define FZA_TEST_SC_LOOP    0x13    /* SC loopback packet */
0122 #define FZA_TEST_LM_LOOP    0x14    /* LM loopback packet */
0123 #define FZA_TEST_EB_LOOP    0x15    /* EB loopback packet */
0124 #define FZA_TEST_SC_LOOP_BYPS   0x16    /* SC bypass loopback packet */
0125 #define FZA_TEST_LM_LOOP_LOCAL  0x17    /* LM local loopback packet */
0126 #define FZA_TEST_EB_LOOP_LOCAL  0x18    /* EB local loopback packet */
0127 #define FZA_TEST_CDC_LOOP   0x19    /* CDC loopback packet */
0128 #define FZA_TEST_FIBER_LOOP 0x1A    /* FIBER loopback packet */
0129 #define FZA_TEST_CAM_MATCH_LOOP 0x1B    /* CAM match packet loopback */
0130 #define FZA_TEST_68K_IRQ_STUCK  0x1C    /* 68000 interrupt line stuck-at */
0131 #define FZA_TEST_IRQ_PRESENT    0x1D    /* interrupt present register */
0132 #define FZA_TEST_RMC_BIST   0x1E    /* RMC BiST */
0133 #define FZA_TEST_RMC_CSR    0x1F    /* RMC CSR */
0134 #define FZA_TEST_RMC_ADDR_UNIQ  0x20    /* RMC unique address */
0135 #define FZA_TEST_PM_DPATH   0x21    /* packet memory data path */
0136 #define FZA_TEST_PM_ADDR    0x22    /* packet memory address */
0137 #define FZA_TEST_RES_23     0x23    /* reserved */
0138 #define FZA_TEST_PM_DESC    0x24    /* packet memory descriptor */
0139 #define FZA_TEST_PM_OWN     0x25    /* packet memory own bit */
0140 #define FZA_TEST_PM_PARITY  0x26    /* packet memory parity */
0141 #define FZA_TEST_PM_BSWAP   0x27    /* packet memory byte swap */
0142 #define FZA_TEST_PM_WSWAP   0x28    /* packet memory word swap */
0143 #define FZA_TEST_PM_REF     0x29    /* packet memory refresh */
0144 #define FZA_TEST_PM_CSR     0x2A    /* PM CSR */
0145 #define FZA_TEST_PORT_STATUS    0x2B    /* port status register */
0146 #define FZA_TEST_HOST_IRQMASK   0x2C    /* host interrupt mask */
0147 #define FZA_TEST_TIMER_IRQ1 0x2D    /* RTOS timer */
0148 #define FZA_TEST_FORCE_IRQ1 0x2E    /* force RTOS IRQ1 */
0149 #define FZA_TEST_TIMER_IRQ5 0x2F    /* IRQ5 backoff timer */
0150 #define FZA_TEST_FORCE_IRQ5 0x30    /* force IRQ5 */
0151 #define FZA_TEST_RES_31     0x31    /* reserved */
0152 #define FZA_TEST_IC_PRIO    0x32    /* interrupt controller priority */
0153 #define FZA_TEST_PM_FULL    0x33    /* full packet memory */
0154 #define FZA_TEST_PMI_DMA    0x34    /* PMI DMA */
0155 
0156 /* Interrupt mask register constants.  All bits are r/w. */
0157 #define FZA_MASK_RESERVED   0xf000  /* unused */
0158 #define FZA_MASK_DLU_DONE   0x0800  /* flash memory write complete */
0159 #define FZA_MASK_FLUSH_TX   0x0400  /* transmit ring flush request */
0160 #define FZA_MASK_PM_PARITY_ERR  0x0200  /* onboard packet memory parity error
0161                      */
0162 #define FZA_MASK_HB_PARITY_ERR  0x0100  /* host bus parity error */
0163 #define FZA_MASK_NXM_ERR    0x0080  /* adapter non-existent memory
0164                      * reference
0165                      */
0166 #define FZA_MASK_LINK_ST_CHG    0x0040  /* link status change */
0167 #define FZA_MASK_STATE_CHG  0x0020  /* adapter state change */
0168 #define FZA_MASK_UNS_POLL   0x0010  /* unsolicited event service request */
0169 #define FZA_MASK_CMD_DONE   0x0008  /* command ring entry processed */
0170 #define FZA_MASK_SMT_TX_POLL    0x0004  /* SMT frame transmit request */
0171 #define FZA_MASK_RCV_POLL   0x0002  /* receive request (packet available)
0172                      */
0173 #define FZA_MASK_TX_DONE    0x0001  /* RMC transmit done acknowledge */
0174 
0175 /* Which interrupts to receive: 0/1 is mask/unmask. */
0176 #define FZA_MASK_NONE       0x0000
0177 #define FZA_MASK_NORMAL                         \
0178         ((~(FZA_MASK_RESERVED | FZA_MASK_DLU_DONE |     \
0179             FZA_MASK_PM_PARITY_ERR | FZA_MASK_HB_PARITY_ERR |   \
0180             FZA_MASK_NXM_ERR)) & 0xffff)
0181 
0182 /* Control A register constants. */
0183 #define FZA_CONTROL_A_HB_PARITY_ERR 0x8000  /* host bus parity error */
0184 #define FZA_CONTROL_A_NXM_ERR       0x4000  /* adapter non-existent memory
0185                          * reference
0186                          */
0187 #define FZA_CONTROL_A_SMT_RX_OVFL   0x0040  /* SMT receive overflow */
0188 #define FZA_CONTROL_A_FLUSH_DONE    0x0020  /* flush tx request complete */
0189 #define FZA_CONTROL_A_SHUT      0x0010  /* turn the interface off */
0190 #define FZA_CONTROL_A_HALT      0x0008  /* halt the controller */
0191 #define FZA_CONTROL_A_CMD_POLL      0x0004  /* command ring poll */
0192 #define FZA_CONTROL_A_SMT_RX_POLL   0x0002  /* SMT receive ring poll */
0193 #define FZA_CONTROL_A_TX_POLL       0x0001  /* transmit poll */
0194 
0195 /* Control B register constants.  All bits are r/w.
0196  *
0197  * Possible values:
0198  *  0x0000 after booting into REX,
0199  *  0x0003 after issuing `boot #/mop'.
0200  */
0201 #define FZA_CONTROL_B_CONSOLE   0x0002  /* OR with DRIVER for console
0202                      * (TC firmware) mode
0203                      */
0204 #define FZA_CONTROL_B_DRIVER    0x0001  /* driver mode */
0205 #define FZA_CONTROL_B_IDLE  0x0000  /* no driver installed */
0206 
0207 #define FZA_RESET_PAD                           \
0208         (FZA_REG_RESET - FZA_REG_BASE)
0209 #define FZA_INT_EVENT_PAD                       \
0210         (FZA_REG_INT_EVENT - FZA_REG_RESET - sizeof(u16))
0211 #define FZA_CONTROL_A_PAD                       \
0212         (FZA_REG_CONTROL_A - FZA_REG_INT_MASK - sizeof(u16))
0213 
0214 /* Layout of registers. */
0215 struct fza_regs {
0216     u8  pad0[FZA_RESET_PAD];
0217     u16 reset;              /* reset register */
0218     u8  pad1[FZA_INT_EVENT_PAD];
0219     u16 int_event;              /* interrupt event register */
0220     u16 status;             /* status register */
0221     u16 int_mask;               /* interrupt mask register */
0222     u8  pad2[FZA_CONTROL_A_PAD];
0223     u16 control_a;              /* control A register */
0224     u16 control_b;              /* control B register */
0225 };
0226 
0227 /* Command descriptor ring entry. */
0228 struct fza_ring_cmd {
0229     u32 cmd_own;        /* bit 31: ownership, bits [30:0]: command */
0230     u32 stat;       /* command status */
0231     u32 buffer;     /* address of the buffer in the FZA space */
0232     u32 pad0;
0233 };
0234 
0235 #define FZA_RING_CMD        0x200400    /* command ring address */
0236 #define FZA_RING_CMD_SIZE   0x40        /* command descriptor ring
0237                          * size
0238                          */
0239 /* Command constants. */
0240 #define FZA_RING_CMD_MASK   0x7fffffff
0241 #define FZA_RING_CMD_NOP    0x00000000  /* nop */
0242 #define FZA_RING_CMD_INIT   0x00000001  /* initialize */
0243 #define FZA_RING_CMD_MODCAM 0x00000002  /* modify CAM */
0244 #define FZA_RING_CMD_PARAM  0x00000003  /* set system parameters */
0245 #define FZA_RING_CMD_MODPROM    0x00000004  /* modify promiscuous mode */
0246 #define FZA_RING_CMD_SETCHAR    0x00000005  /* set link characteristics */
0247 #define FZA_RING_CMD_RDCNTR 0x00000006  /* read counters */
0248 #define FZA_RING_CMD_STATUS 0x00000007  /* get link status */
0249 #define FZA_RING_CMD_RDCAM  0x00000008  /* read CAM */
0250 
0251 /* Command status constants. */
0252 #define FZA_RING_STAT_SUCCESS   0x00000000
0253 
0254 /* Unsolicited event descriptor ring entry. */
0255 struct fza_ring_uns {
0256     u32 own;        /* bit 31: ownership, bits [30:0]: reserved */
0257     u32 id;         /* event ID */
0258     u32 buffer;     /* address of the buffer in the FZA space */
0259     u32 pad0;       /* reserved */
0260 };
0261 
0262 #define FZA_RING_UNS        0x200800    /* unsolicited ring address */
0263 #define FZA_RING_UNS_SIZE   0x40        /* unsolicited descriptor ring
0264                          * size
0265                          */
0266 /* Unsolicited event constants. */
0267 #define FZA_RING_UNS_UND    0x00000000  /* undefined event ID */
0268 #define FZA_RING_UNS_INIT_IN    0x00000001  /* ring init initiated */
0269 #define FZA_RING_UNS_INIT_RX    0x00000002  /* ring init received */
0270 #define FZA_RING_UNS_BEAC_IN    0x00000003  /* ring beaconing initiated */
0271 #define FZA_RING_UNS_DUP_ADDR   0x00000004  /* duplicate address detected */
0272 #define FZA_RING_UNS_DUP_TOK    0x00000005  /* duplicate token detected */
0273 #define FZA_RING_UNS_PURG_ERR   0x00000006  /* ring purger error */
0274 #define FZA_RING_UNS_STRIP_ERR  0x00000007  /* bridge strip error */
0275 #define FZA_RING_UNS_OP_OSC 0x00000008  /* ring op oscillation */
0276 #define FZA_RING_UNS_BEAC_RX    0x00000009  /* directed beacon received */
0277 #define FZA_RING_UNS_PCT_IN 0x0000000a  /* PC trace initiated */
0278 #define FZA_RING_UNS_PCT_RX 0x0000000b  /* PC trace received */
0279 #define FZA_RING_UNS_TX_UNDER   0x0000000c  /* transmit underrun */
0280 #define FZA_RING_UNS_TX_FAIL    0x0000000d  /* transmit failure */
0281 #define FZA_RING_UNS_RX_OVER    0x0000000e  /* receive overrun */
0282 
0283 /* RMC (Ring Memory Control) transmit descriptor ring entry. */
0284 struct fza_ring_rmc_tx {
0285     u32 rmc;        /* RMC information */
0286     u32 avl;        /* available for host (unused by RMC) */
0287     u32 own;        /* bit 31: ownership, bits [30:0]: reserved */
0288     u32 pad0;       /* reserved */
0289 };
0290 
0291 #define FZA_TX_BUFFER_ADDR(x)   (0x200000 | (((x) & 0xffff) << 5))
0292 #define FZA_TX_BUFFER_SIZE  512
0293 struct fza_buffer_tx {
0294     u32 data[FZA_TX_BUFFER_SIZE / sizeof(u32)];
0295 };
0296 
0297 /* Transmit ring RMC constants. */
0298 #define FZA_RING_TX_SOP     0x80000000  /* start of packet */
0299 #define FZA_RING_TX_EOP     0x40000000  /* end of packet */
0300 #define FZA_RING_TX_DTP     0x20000000  /* discard this packet */
0301 #define FZA_RING_TX_VBC     0x10000000  /* valid buffer byte count */
0302 #define FZA_RING_TX_DCC_MASK    0x0f000000  /* DMA completion code */
0303 #define FZA_RING_TX_DCC_SUCCESS 0x01000000  /* transmit succeeded */
0304 #define FZA_RING_TX_DCC_DTP_SOP 0x02000000  /* DTP set at SOP */
0305 #define FZA_RING_TX_DCC_DTP 0x04000000  /* DTP set within packet */
0306 #define FZA_RING_TX_DCC_ABORT   0x05000000  /* MAC-requested abort */
0307 #define FZA_RING_TX_DCC_PARITY  0x06000000  /* xmit data parity error */
0308 #define FZA_RING_TX_DCC_UNDRRUN 0x07000000  /* transmit underrun */
0309 #define FZA_RING_TX_XPO_MASK    0x003fe000  /* transmit packet offset */
0310 
0311 /* Host receive descriptor ring entry. */
0312 struct fza_ring_hst_rx {
0313     u32 buf0_own;       /* bit 31: ownership, bits [30:23]: unused,
0314                  * bits [22:0]: right-shifted address of the
0315                  * buffer in system memory (low buffer)
0316                  */
0317     u32 buffer1;        /* bits [31:23]: unused,
0318                  * bits [22:0]: right-shifted address of the
0319                  * buffer in system memory (high buffer)
0320                  */
0321     u32 rmc;        /* RMC information */
0322     u32 pad0;
0323 };
0324 
0325 #define FZA_RX_BUFFER_SIZE  (4096 + 512)    /* buffer length */
0326 
0327 /* Receive ring RMC constants. */
0328 #define FZA_RING_RX_SOP     0x80000000  /* start of packet */
0329 #define FZA_RING_RX_EOP     0x40000000  /* end of packet */
0330 #define FZA_RING_RX_FSC_MASK    0x38000000  /* # of frame status bits */
0331 #define FZA_RING_RX_FSB_MASK    0x07c00000  /* frame status bits */
0332 #define FZA_RING_RX_FSB_ERR 0x04000000  /* error detected */
0333 #define FZA_RING_RX_FSB_ADDR    0x02000000  /* address recognized */
0334 #define FZA_RING_RX_FSB_COP 0x01000000  /* frame copied */
0335 #define FZA_RING_RX_FSB_F0  0x00800000  /* first additional flag */
0336 #define FZA_RING_RX_FSB_F1  0x00400000  /* second additional flag */
0337 #define FZA_RING_RX_BAD     0x00200000  /* bad packet */
0338 #define FZA_RING_RX_CRC     0x00100000  /* CRC error */
0339 #define FZA_RING_RX_RRR_MASK    0x000e0000  /* MAC receive status bits */
0340 #define FZA_RING_RX_RRR_OK  0x00000000  /* receive OK */
0341 #define FZA_RING_RX_RRR_SADDR   0x00020000  /* source address matched */
0342 #define FZA_RING_RX_RRR_DADDR   0x00040000  /* dest address not matched */
0343 #define FZA_RING_RX_RRR_ABORT   0x00060000  /* RMC abort */
0344 #define FZA_RING_RX_RRR_LENGTH  0x00080000  /* invalid length */
0345 #define FZA_RING_RX_RRR_FRAG    0x000a0000  /* fragment */
0346 #define FZA_RING_RX_RRR_FORMAT  0x000c0000  /* format error */
0347 #define FZA_RING_RX_RRR_RESET   0x000e0000  /* MAC reset */
0348 #define FZA_RING_RX_DA_MASK 0x00018000  /* daddr match status bits */
0349 #define FZA_RING_RX_DA_NONE 0x00000000  /* no match */
0350 #define FZA_RING_RX_DA_PROM 0x00008000  /* promiscuous match */
0351 #define FZA_RING_RX_DA_CAM  0x00010000  /* CAM entry match */
0352 #define FZA_RING_RX_DA_LOCAL    0x00018000  /* link addr or LLC bcast */
0353 #define FZA_RING_RX_SA_MASK 0x00006000  /* saddr match status bits */
0354 #define FZA_RING_RX_SA_NONE 0x00000000  /* no match */
0355 #define FZA_RING_RX_SA_ALIAS    0x00002000  /* alias address match */
0356 #define FZA_RING_RX_SA_CAM  0x00004000  /* CAM entry match */
0357 #define FZA_RING_RX_SA_LOCAL    0x00006000  /* link address match */
0358 
0359 /* SMT (Station Management) transmit/receive descriptor ring entry. */
0360 struct fza_ring_smt {
0361     u32 own;        /* bit 31: ownership, bits [30:0]: unused */
0362     u32 rmc;        /* RMC information */
0363     u32 buffer;     /* address of the buffer */
0364     u32 pad0;       /* reserved */
0365 };
0366 
0367 /* Ownership constants.
0368  *
0369  * Only an owner is permitted to process a given ring entry.
0370  * RMC transmit ring meanings are reversed.
0371  */
0372 #define FZA_RING_OWN_MASK   0x80000000
0373 #define FZA_RING_OWN_FZA    0x00000000  /* permit FZA, forbid host */
0374 #define FZA_RING_OWN_HOST   0x80000000  /* permit host, forbid FZA */
0375 #define FZA_RING_TX_OWN_RMC 0x80000000  /* permit RMC, forbid host */
0376 #define FZA_RING_TX_OWN_HOST    0x00000000  /* permit host, forbid RMC */
0377 
0378 /* RMC constants. */
0379 #define FZA_RING_PBC_MASK   0x00001fff  /* frame length */
0380 
0381 /* Layout of counter buffers. */
0382 
0383 struct fza_counter {
0384     u32 msw;
0385     u32 lsw;
0386 };
0387 
0388 struct fza_counters {
0389     struct fza_counter sys_buf; /* system buffer unavailable */
0390     struct fza_counter tx_under;    /* transmit underruns */
0391     struct fza_counter tx_fail; /* transmit failures */
0392     struct fza_counter rx_over; /* receive data overruns */
0393     struct fza_counter frame_cnt;   /* frame count */
0394     struct fza_counter error_cnt;   /* error count */
0395     struct fza_counter lost_cnt;    /* lost count */
0396     struct fza_counter rinit_in;    /* ring initialization initiated */
0397     struct fza_counter rinit_rx;    /* ring initialization received */
0398     struct fza_counter beac_in; /* ring beacon initiated */
0399     struct fza_counter dup_addr;    /* duplicate address test failures */
0400     struct fza_counter dup_tok; /* duplicate token detected */
0401     struct fza_counter purg_err;    /* ring purge errors */
0402     struct fza_counter strip_err;   /* bridge strip errors */
0403     struct fza_counter pct_in;  /* traces initiated */
0404     struct fza_counter pct_rx;  /* traces received */
0405     struct fza_counter lem_rej; /* LEM rejects */
0406     struct fza_counter tne_rej; /* TNE expiry rejects */
0407     struct fza_counter lem_event;   /* LEM events */
0408     struct fza_counter lct_rej; /* LCT rejects */
0409     struct fza_counter conn_cmpl;   /* connections completed */
0410     struct fza_counter el_buf;  /* elasticity buffer errors */
0411 };
0412 
0413 /* Layout of command buffers. */
0414 
0415 /* INIT command buffer.
0416  *
0417  * Values of default link parameters given are as obtained from a
0418  * DEFZA-AA rev. C03 board.  The board counts time in units of 80ns.
0419  */
0420 struct fza_cmd_init {
0421     u32 tx_mode;            /* transmit mode */
0422     u32 hst_rx_size;        /* host receive ring entries */
0423 
0424     struct fza_counters counters;   /* counters */
0425 
0426     u8 rmc_rev[4];          /* RMC revision */
0427     u8 rom_rev[4];          /* ROM revision */
0428     u8 fw_rev[4];           /* firmware revision */
0429 
0430     u32 mop_type;           /* MOP device type */
0431 
0432     u32 hst_rx;         /* base of host rx descriptor ring */
0433     u32 rmc_tx;         /* base of RMC tx descriptor ring */
0434     u32 rmc_tx_size;        /* size of RMC tx descriptor ring */
0435     u32 smt_tx;         /* base of SMT tx descriptor ring */
0436     u32 smt_tx_size;        /* size of SMT tx descriptor ring */
0437     u32 smt_rx;         /* base of SMT rx descriptor ring */
0438     u32 smt_rx_size;        /* size of SMT rx descriptor ring */
0439 
0440     u32 hw_addr[2];         /* link address */
0441 
0442     u32 def_t_req;          /* default Requested TTRT (T_REQ) --
0443                      * C03: 100000 [80ns]
0444                      */
0445     u32 def_tvx;            /* default Valid Transmission Time
0446                      * (TVX) -- C03: 32768 [80ns]
0447                      */
0448     u32 def_t_max;          /* default Maximum TTRT (T_MAX) --
0449                      * C03: 2162688 [80ns]
0450                      */
0451     u32 lem_threshold;      /* default LEM threshold -- C03: 8 */
0452     u32 def_station_id[2];      /* default station ID */
0453 
0454     u32 pmd_type_alt;       /* alternative PMD type code */
0455 
0456     u32 smt_ver;            /* SMT version */
0457 
0458     u32 rtoken_timeout;     /* default restricted token timeout
0459                      * -- C03: 12500000 [80ns]
0460                      */
0461     u32 ring_purger;        /* default ring purger enable --
0462                      * C03: 1
0463                      */
0464 
0465     u32 smt_ver_max;        /* max SMT version ID */
0466     u32 smt_ver_min;        /* min SMT version ID */
0467     u32 pmd_type;           /* PMD type code */
0468 };
0469 
0470 /* INIT command PMD type codes. */
0471 #define FZA_PMD_TYPE_MMF      0 /* Multimode fiber */
0472 #define FZA_PMD_TYPE_TW     101 /* ThinWire */
0473 #define FZA_PMD_TYPE_STP    102 /* STP */
0474 
0475 /* MODCAM/RDCAM command buffer. */
0476 #define FZA_CMD_CAM_SIZE    64      /* CAM address entry count */
0477 struct fza_cmd_cam {
0478     u32 hw_addr[FZA_CMD_CAM_SIZE][2];   /* CAM address entries */
0479 };
0480 
0481 /* PARAM command buffer.
0482  *
0483  * Permitted ranges given are as defined by the spec and obtained from a
0484  * DEFZA-AA rev. C03 board, respectively.  The rtoken_timeout field is
0485  * erroneously interpreted in units of ms.
0486  */
0487 struct fza_cmd_param {
0488     u32 loop_mode;          /* loopback mode */
0489     u32 t_max;          /* Maximum TTRT (T_MAX)
0490                      * def: ??? [80ns]
0491                      * C03: [t_req+1,4294967295] [80ns]
0492                      */
0493     u32 t_req;          /* Requested TTRT (T_REQ)
0494                      * def: [50000,2097151] [80ns]
0495                      * C03: [50001,t_max-1] [80ns]
0496                      */
0497     u32 tvx;            /* Valid Transmission Time (TVX)
0498                      * def: [29375,65280] [80ns]
0499                      * C03: [29376,65279] [80ns]
0500                      */
0501     u32 lem_threshold;      /* LEM threshold */
0502     u32 station_id[2];      /* station ID */
0503     u32 rtoken_timeout;     /* restricted token timeout
0504                      * def: [0,125000000] [80ns]
0505                      * C03: [0,9999] [ms]
0506                      */
0507     u32 ring_purger;        /* ring purger enable: 0|1 */
0508 };
0509 
0510 /* Loopback modes for the PARAM command. */
0511 #define FZA_LOOP_NORMAL     0
0512 #define FZA_LOOP_INTERN     1
0513 #define FZA_LOOP_EXTERN     2
0514 
0515 /* MODPROM command buffer. */
0516 struct fza_cmd_modprom {
0517     u32 llc_prom;           /* LLC promiscuous enable */
0518     u32 smt_prom;           /* SMT promiscuous enable */
0519     u32 llc_multi;          /* LLC multicast promiscuous enable */
0520     u32 llc_bcast;          /* LLC broadcast promiscuous enable */
0521 };
0522 
0523 /* SETCHAR command buffer.
0524  *
0525  * Permitted ranges are as for the PARAM command.
0526  */
0527 struct fza_cmd_setchar {
0528     u32 t_max;          /* Maximum TTRT (T_MAX) */
0529     u32 t_req;          /* Requested TTRT (T_REQ) */
0530     u32 tvx;            /* Valid Transmission Time (TVX) */
0531     u32 lem_threshold;      /* LEM threshold */
0532     u32 rtoken_timeout;     /* restricted token timeout */
0533     u32 ring_purger;        /* ring purger enable */
0534 };
0535 
0536 /* RDCNTR command buffer. */
0537 struct fza_cmd_rdcntr {
0538     struct fza_counters counters;   /* counters */
0539 };
0540 
0541 /* STATUS command buffer. */
0542 struct fza_cmd_status {
0543     u32 led_state;          /* LED state */
0544     u32 rmt_state;          /* ring management state */
0545     u32 link_state;         /* link state */
0546     u32 dup_addr;           /* duplicate address flag */
0547     u32 ring_purger;        /* ring purger state */
0548     u32 t_neg;          /* negotiated TTRT [80ns] */
0549     u32 una[2];         /* upstream neighbour address */
0550     u32 una_timeout;        /* UNA timed out */
0551     u32 strip_mode;         /* frame strip mode */
0552     u32 yield_mode;         /* claim token yield mode */
0553     u32 phy_state;          /* PHY state */
0554     u32 neigh_phy;          /* neighbour PHY type */
0555     u32 reject;         /* reject reason */
0556     u32 phy_lee;            /* PHY link error estimate [-log10] */
0557     u32 una_old[2];         /* old upstream neighbour address */
0558     u32 rmt_mac;            /* remote MAC indicated */
0559     u32 ring_err;           /* ring error reason */
0560     u32 beac_rx[2];         /* sender of last directed beacon */
0561     u32 un_dup_addr;        /* upstream neighbr dup address flag */
0562     u32 dna[2];         /* downstream neighbour address */
0563     u32 dna_old[2];         /* old downstream neighbour address */
0564 };
0565 
0566 /* Common command buffer. */
0567 union fza_cmd_buf {
0568     struct fza_cmd_init init;
0569     struct fza_cmd_cam cam;
0570     struct fza_cmd_param param;
0571     struct fza_cmd_modprom modprom;
0572     struct fza_cmd_setchar setchar;
0573     struct fza_cmd_rdcntr rdcntr;
0574     struct fza_cmd_status status;
0575 };
0576 
0577 /* MAC (Media Access Controller) chip packet request header constants. */
0578 
0579 /* Packet request header byte #0. */
0580 #define FZA_PRH0_FMT_TYPE_MASK  0xc0    /* type of packet, always zero */
0581 #define FZA_PRH0_TOK_TYPE_MASK  0x30    /* type of token required
0582                      * to send this frame
0583                      */
0584 #define FZA_PRH0_TKN_TYPE_ANY   0x30    /* use either token type */
0585 #define FZA_PRH0_TKN_TYPE_UNR   0x20    /* use an unrestricted token */
0586 #define FZA_PRH0_TKN_TYPE_RST   0x10    /* use a restricted token */
0587 #define FZA_PRH0_TKN_TYPE_IMM   0x00    /* send immediately, no token required
0588                      */
0589 #define FZA_PRH0_FRAME_MASK 0x08    /* type of frame to send */
0590 #define FZA_PRH0_FRAME_SYNC 0x08    /* send a synchronous frame */
0591 #define FZA_PRH0_FRAME_ASYNC    0x00    /* send an asynchronous frame */
0592 #define FZA_PRH0_MODE_MASK  0x04    /* send mode */
0593 #define FZA_PRH0_MODE_IMMED 0x04    /* an immediate mode, send regardless
0594                      * of the ring operational state
0595                      */
0596 #define FZA_PRH0_MODE_NORMAL    0x00    /* a normal mode, send only if ring
0597                      * operational
0598                      */
0599 #define FZA_PRH0_SF_MASK    0x02    /* send frame first */
0600 #define FZA_PRH0_SF_FIRST   0x02    /* send this frame first
0601                      * with this token capture
0602                      */
0603 #define FZA_PRH0_SF_NORMAL  0x00    /* treat this frame normally */
0604 #define FZA_PRH0_BCN_MASK   0x01    /* beacon frame */
0605 #define FZA_PRH0_BCN_BEACON 0x01    /* send the frame only
0606                      * if in the beacon state
0607                      */
0608 #define FZA_PRH0_BCN_DATA   0x01    /* send the frame only
0609                      * if in the data state
0610                      */
0611 /* Packet request header byte #1. */
0612                     /* bit 7 always zero */
0613 #define FZA_PRH1_SL_MASK    0x40    /* send frame last */
0614 #define FZA_PRH1_SL_LAST    0x40    /* send this frame last, releasing
0615                      * the token afterwards
0616                      */
0617 #define FZA_PRH1_SL_NORMAL  0x00    /* treat this frame normally */
0618 #define FZA_PRH1_CRC_MASK   0x20    /* CRC append */
0619 #define FZA_PRH1_CRC_NORMAL 0x20    /* calculate the CRC and append it
0620                      * as the FCS field to the frame
0621                      */
0622 #define FZA_PRH1_CRC_SKIP   0x00    /* leave the frame as is */
0623 #define FZA_PRH1_TKN_SEND_MASK  0x18    /* type of token to send after the
0624                      * frame if this is the last frame
0625                      */
0626 #define FZA_PRH1_TKN_SEND_ORIG  0x18    /* send a token of the same type as the
0627                      * originally captured one
0628                      */
0629 #define FZA_PRH1_TKN_SEND_RST   0x10    /* send a restricted token */
0630 #define FZA_PRH1_TKN_SEND_UNR   0x08    /* send an unrestricted token */
0631 #define FZA_PRH1_TKN_SEND_NONE  0x00    /* send no token */
0632 #define FZA_PRH1_EXTRA_FS_MASK  0x07    /* send extra frame status indicators
0633                      */
0634 #define FZA_PRH1_EXTRA_FS_ST    0x07    /* TR RR ST II */
0635 #define FZA_PRH1_EXTRA_FS_SS    0x06    /* TR RR SS II */
0636 #define FZA_PRH1_EXTRA_FS_SR    0x05    /* TR RR SR II */
0637 #define FZA_PRH1_EXTRA_FS_NONE1 0x04    /* TR RR II II */
0638 #define FZA_PRH1_EXTRA_FS_RT    0x03    /* TR RR RT II */
0639 #define FZA_PRH1_EXTRA_FS_RS    0x02    /* TR RR RS II */
0640 #define FZA_PRH1_EXTRA_FS_RR    0x01    /* TR RR RR II */
0641 #define FZA_PRH1_EXTRA_FS_NONE  0x00    /* TR RR II II */
0642 /* Packet request header byte #2. */
0643 #define FZA_PRH2_NORMAL     0x00    /* always zero */
0644 
0645 /* PRH used for LLC frames. */
0646 #define FZA_PRH0_LLC        (FZA_PRH0_TKN_TYPE_UNR)
0647 #define FZA_PRH1_LLC        (FZA_PRH1_CRC_NORMAL | FZA_PRH1_TKN_SEND_UNR)
0648 #define FZA_PRH2_LLC        (FZA_PRH2_NORMAL)
0649 
0650 /* PRH used for SMT frames. */
0651 #define FZA_PRH0_SMT        (FZA_PRH0_TKN_TYPE_UNR)
0652 #define FZA_PRH1_SMT        (FZA_PRH1_CRC_NORMAL | FZA_PRH1_TKN_SEND_UNR)
0653 #define FZA_PRH2_SMT        (FZA_PRH2_NORMAL)
0654 
0655 #if ((FZA_RING_RX_SIZE) < 2) || ((FZA_RING_RX_SIZE) > 256)
0656 # error FZA_RING_RX_SIZE has to be from 2 up to 256
0657 #endif
0658 #if ((FZA_RING_TX_MODE) != 0) && ((FZA_RING_TX_MODE) != 1)
0659 # error FZA_RING_TX_MODE has to be either 0 or 1
0660 #endif
0661 
0662 #define FZA_RING_TX_SIZE (512 << (FZA_RING_TX_MODE))
0663 
0664 struct fza_private {
0665     struct device *bdev;        /* pointer to the bus device */
0666     const char *name;       /* printable device name */
0667     void __iomem *mmio;     /* MMIO ioremap cookie */
0668     struct fza_regs __iomem *regs;  /* pointer to FZA registers */
0669 
0670     struct sk_buff *rx_skbuff[FZA_RING_RX_SIZE];
0671                     /* all skbs assigned to the host
0672                      * receive descriptors
0673                      */
0674     dma_addr_t rx_dma[FZA_RING_RX_SIZE];
0675                     /* their corresponding DMA addresses */
0676 
0677     struct fza_ring_cmd __iomem *ring_cmd;
0678                     /* pointer to the command descriptor
0679                      * ring
0680                      */
0681     int ring_cmd_index;     /* index to the command descriptor ring
0682                      * for the next command
0683                      */
0684     struct fza_ring_uns __iomem *ring_uns;
0685                     /* pointer to the unsolicited
0686                      * descriptor ring
0687                      */
0688     int ring_uns_index;     /* index to the unsolicited descriptor
0689                      * ring for the next event
0690                      */
0691 
0692     struct fza_ring_rmc_tx __iomem *ring_rmc_tx;
0693                     /* pointer to the RMC transmit
0694                      * descriptor ring (obtained from the
0695                      * INIT command)
0696                      */
0697     int ring_rmc_tx_size;       /* number of entries in the RMC
0698                      * transmit descriptor ring (obtained
0699                      * from the INIT command)
0700                      */
0701     int ring_rmc_tx_index;      /* index to the RMC transmit descriptor
0702                      * ring for the next transmission
0703                      */
0704     int ring_rmc_txd_index;     /* index to the RMC transmit descriptor
0705                      * ring for the next transmit done
0706                      * acknowledge
0707                      */
0708 
0709     struct fza_ring_hst_rx __iomem *ring_hst_rx;
0710                     /* pointer to the host receive
0711                      * descriptor ring (obtained from the
0712                      * INIT command)
0713                      */
0714     int ring_hst_rx_size;       /* number of entries in the host
0715                      * receive descriptor ring (set by the
0716                      * INIT command)
0717                      */
0718     int ring_hst_rx_index;      /* index to the host receive descriptor
0719                      * ring for the next transmission
0720                      */
0721 
0722     struct fza_ring_smt __iomem *ring_smt_tx;
0723                     /* pointer to the SMT transmit
0724                      * descriptor ring (obtained from the
0725                      * INIT command)
0726                      */
0727     int ring_smt_tx_size;       /* number of entries in the SMT
0728                      * transmit descriptor ring (obtained
0729                      * from the INIT command)
0730                      */
0731     int ring_smt_tx_index;      /* index to the SMT transmit descriptor
0732                      * ring for the next transmission
0733                      */
0734 
0735     struct fza_ring_smt __iomem *ring_smt_rx;
0736                     /* pointer to the SMT transmit
0737                      * descriptor ring (obtained from the
0738                      * INIT command)
0739                      */
0740     int ring_smt_rx_size;       /* number of entries in the SMT
0741                      * receive descriptor ring (obtained
0742                      * from the INIT command)
0743                      */
0744     int ring_smt_rx_index;      /* index to the SMT receive descriptor
0745                      * ring for the next transmission
0746                      */
0747 
0748     struct fza_buffer_tx __iomem *buffer_tx;
0749                     /* pointer to the RMC transmit buffers
0750                      */
0751 
0752     uint state;         /* adapter expected state */
0753 
0754     spinlock_t lock;        /* for device & private data access */
0755     uint int_mask;          /* interrupt source selector */
0756 
0757     int cmd_done_flag;      /* command completion trigger */
0758     wait_queue_head_t cmd_done_wait;
0759 
0760     int state_chg_flag;     /* state change trigger */
0761     wait_queue_head_t state_chg_wait;
0762 
0763     struct timer_list reset_timer;  /* RESET time-out trigger */
0764     int timer_state;        /* RESET trigger state */
0765 
0766     int queue_active;       /* whether to enable queueing */
0767 
0768     struct net_device_stats stats;
0769 
0770     uint irq_count_flush_tx;    /* transmit flush irqs */
0771     uint irq_count_uns_poll;    /* unsolicited event irqs */
0772     uint irq_count_smt_tx_poll; /* SMT transmit irqs */
0773     uint irq_count_rx_poll;     /* host receive irqs */
0774     uint irq_count_tx_done;     /* transmit done irqs */
0775     uint irq_count_cmd_done;    /* command done irqs */
0776     uint irq_count_state_chg;   /* state change irqs */
0777     uint irq_count_link_st_chg; /* link status change irqs */
0778 
0779     uint t_max;         /* T_MAX */
0780     uint t_req;         /* T_REQ */
0781     uint tvx;           /* TVX */
0782     uint lem_threshold;     /* LEM threshold */
0783     uint station_id[2];     /* station ID */
0784     uint rtoken_timeout;        /* restricted token timeout */
0785     uint ring_purger;       /* ring purger enable flag */
0786 };
0787 
0788 struct fza_fddihdr {
0789     u8 pa[2];           /* preamble */
0790     u8 sd;              /* starting delimiter */
0791     struct fddihdr hdr;
0792 } __packed;