root/dev/usb/if_axereg.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: if_axereg.h,v 1.18 2007/06/10 10:15:35 mbalmer Exp $  */
    2 
    3 /*
    4  * Copyright (c) 1997, 1998, 1999, 2000-2003
    5  *      Bill Paul <wpaul@windriver.com>.  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, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. All advertising materials mentioning features or use of this software
   16  *    must display the following acknowledgement:
   17  *      This product includes software developed by Bill Paul.
   18  * 4. Neither the name of the author nor the names of any co-contributors
   19  *    may be used to endorse or promote products derived from this software
   20  *    without specific prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
   23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   25  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
   26  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
   32  * THE POSSIBILITY OF SUCH DAMAGE.
   33  *
   34  * $FreeBSD: src/sys/dev/usb/if_axereg.h,v 1.2 2003/06/15 21:45:43 wpaul Exp $
   35  */
   36 
   37 /*
   38  * Definitions for the ASIX Electronics AX88172 to ethernet controller.
   39  */
   40 
   41 
   42 /*
   43  * Vendor specific commands
   44  * ASIX conveniently doesn't document the 'set NODEID' command in their
   45  * datasheet (thanks a lot guys).
   46  * To make handling these commands easier, I added some extra data
   47  * which is decided by the axe_cmd() routine. Commands are encoded
   48  * in 16 bites, with the format: LDCC. L and D are both nibbles in
   49  * the high byte. L represents the data length (0 to 15) and D
   50  * represents the direction (0 for vendor read, 1 for vendor write).
   51  * CC is the command byte, as specified in the manual.
   52  */
   53 
   54 #define AXE_CMD_LEN(x)  (((x) & 0xF000) >> 12)
   55 #define AXE_CMD_DIR(x)  (((x) & 0x0F00) >> 8)
   56 #define AXE_CMD_CMD(x)   ((x) & 0x00FF)
   57 
   58 #define AXE_172_CMD_READ_RXTX_SRAM              0x2002
   59 #define AXE_182_CMD_READ_RXTX_SRAM              0x8002
   60 #define AXE_172_CMD_WRITE_RX_SRAM               0x0103
   61 #define AXE_172_CMD_WRITE_TX_SRAM               0x0104
   62 #define AXE_182_CMD_WRITE_RXTX_SRAM             0x8103
   63 #define AXE_CMD_MII_OPMODE_SW                   0x0106
   64 #define AXE_CMD_MII_READ_REG                    0x2007
   65 #define AXE_CMD_MII_WRITE_REG                   0x2108
   66 #define AXE_CMD_MII_READ_OPMODE                 0x1009
   67 #define AXE_CMD_MII_OPMODE_HW                   0x010A
   68 #define AXE_CMD_SROM_READ                       0x200B
   69 #define AXE_CMD_SROM_WRITE                      0x010C
   70 #define AXE_CMD_SROM_WR_ENABLE                  0x010D
   71 #define AXE_CMD_SROM_WR_DISABLE                 0x010E
   72 #define AXE_CMD_RXCTL_READ                      0x200F
   73 #define AXE_CMD_RXCTL_WRITE                     0x0110
   74 #define AXE_CMD_READ_IPG012                     0x3011
   75 #define AXE_172_CMD_WRITE_IPG0                  0x0112
   76 #define AXE_172_CMD_WRITE_IPG1                  0x0113
   77 #define AXE_172_CMD_WRITE_IPG2                  0x0114
   78 #define AXE_178_CMD_WRITE_IPG012                0x0112
   79 #define AXE_CMD_READ_MCAST                      0x8015
   80 #define AXE_CMD_WRITE_MCAST                     0x8116
   81 #define AXE_172_CMD_READ_NODEID                 0x6017
   82 #define AXE_172_CMD_WRITE_NODEID                0x6118
   83 #define AXE_178_CMD_READ_NODEID                 0x6013
   84 #define AXE_178_CMD_WRITE_NODEID                0x6114
   85 #define AXE_CMD_READ_PHYID                      0x2019
   86 #define AXE_172_CMD_READ_MEDIA                  0x101A
   87 #define AXE_178_CMD_READ_MEDIA                  0x201A
   88 #define AXE_CMD_WRITE_MEDIA                     0x011B
   89 #define AXE_CMD_READ_MONITOR_MODE               0x101C
   90 #define AXE_CMD_WRITE_MONITOR_MODE              0x011D
   91 #define AXE_CMD_READ_GPIO                       0x101E
   92 #define AXE_CMD_WRITE_GPIO                      0x011F
   93 #define AXE_CMD_SW_RESET_REG                    0x0120
   94 #define AXE_CMD_SW_PHY_STATUS                   0x0021
   95 #define AXE_CMD_SW_PHY_SELECT                   0x0122
   96 
   97 #define AXE_SW_RESET_CLEAR                      0x00
   98 #define AXE_SW_RESET_RR                         0x01
   99 #define AXE_SW_RESET_RT                         0x02
  100 #define AXE_SW_RESET_PRTE                       0x04
  101 #define AXE_SW_RESET_PRL                        0x08
  102 #define AXE_SW_RESET_BZ                         0x10
  103 #define AXE_SW_RESET_IPRL                       0x20
  104 #define AXE_SW_RESET_IPPD                       0x40
  105 
  106 /* AX88178 documentation says to always write this bit... */
  107 #define AXE_178_RESET_MAGIC                     0x40
  108 
  109 #define AXE_178_MEDIA_GMII                      0x0001
  110 #define AXE_MEDIA_FULL_DUPLEX                   0x0002
  111 #define AXE_172_MEDIA_TX_ABORT_ALLOW            0x0004
  112 /* AX88178 documentation says to always write 1 to reserved bit... */
  113 #define AXE_178_MEDIA_MAGIC                     0x0004
  114 #define AXE_178_MEDIA_ENCK                      0x0008
  115 #define AXE_172_MEDIA_FLOW_CONTROL_EN           0x0010
  116 #define AXE_178_MEDIA_RXFLOW_CONTROL_EN         0x0010
  117 #define AXE_178_MEDIA_TXFLOW_CONTROL_EN         0x0020
  118 #define AXE_178_MEDIA_JUMBO_EN                  0x0040
  119 #define AXE_178_MEDIA_LTPF_ONLY                 0x0080
  120 #define AXE_178_MEDIA_RX_EN                     0x0100
  121 #define AXE_178_MEDIA_100TX                     0x0200
  122 #define AXE_178_MEDIA_SBP                       0x0800
  123 #define AXE_178_MEDIA_SUPERMAC                  0x1000
  124 
  125 #define AXE_RXCMD_PROMISC                       0x0001
  126 #define AXE_RXCMD_ALLMULTI                      0x0002
  127 #define AXE_172_RXCMD_UNICAST                   0x0004
  128 #define AXE_178_RXCMD_KEEP_INVALID_CRC          0x0004
  129 #define AXE_RXCMD_BROADCAST                     0x0008
  130 #define AXE_RXCMD_MULTICAST                     0x0010
  131 #define AXE_RXCMD_ENABLE                        0x0080
  132 #define AXE_178_RXCMD_MFB                       0x0300
  133 
  134 #define AXE_NOPHY                               0xE0
  135 #define AXE_INTPHY                              0x10
  136 
  137 #define AXE_TIMEOUT             1000
  138 #define AXE_172_BUFSZ           1536
  139 #define AXE_178_MIN_BUFSZ       2048
  140 #define AXE_178_MAX_BUFSZ       16384
  141 
  142 #define AXE_RX_LIST_CNT         1
  143 #define AXE_TX_LIST_CNT         1
  144 
  145 #define AXE_CTL_READ            0x01
  146 #define AXE_CTL_WRITE           0x02
  147 
  148 #define AXE_CONFIG_NO           1
  149 #define AXE_IFACE_IDX           0
  150 
  151 /*
  152  * The interrupt endpoint is currently unused
  153  * by the ASIX part.
  154  */
  155 #define AXE_ENDPT_RX            0x0
  156 #define AXE_ENDPT_TX            0x1
  157 #define AXE_ENDPT_INTR          0x2
  158 #define AXE_ENDPT_MAX           0x3
  159 
  160 struct axe_type {
  161         struct usb_devno        axe_dev;
  162         u_int16_t               axe_flags;
  163 #define AX178   0x0001          /* AX88178 */
  164 #define AX772   0x0002          /* AX88772 */
  165 };
  166 
  167 struct axe_softc;
  168 
  169 struct axe_chain {
  170         struct axe_softc        *axe_sc;
  171         usbd_xfer_handle        axe_xfer;
  172         char                    *axe_buf;
  173         struct mbuf             *axe_mbuf;
  174         int                     axe_accum;
  175         int                     axe_idx;
  176 };
  177 
  178 struct axe_cdata {
  179         struct axe_chain        axe_tx_chain[AXE_TX_LIST_CNT];
  180         struct axe_chain        axe_rx_chain[AXE_RX_LIST_CNT];
  181         int                     axe_tx_prod;
  182         int                     axe_tx_cons;
  183         int                     axe_tx_cnt;
  184         int                     axe_rx_prod;
  185 };
  186 
  187 struct axe_sframe_hdr {
  188         u_int16_t               len;
  189         u_int16_t               ilen;
  190 } __packed;
  191 
  192 struct axe_softc {
  193         struct device           axe_dev;
  194 #define GET_MII(sc) (&(sc)->axe_mii)
  195         struct arpcom           arpcom;
  196 #define GET_IFP(sc) (&(sc)->arpcom.ac_if)
  197         struct mii_data         axe_mii;
  198         usbd_device_handle      axe_udev;
  199         usbd_interface_handle   axe_iface;
  200 
  201         u_int16_t               axe_vendor;
  202         u_int16_t               axe_product;
  203 
  204         u_int16_t               axe_flags;
  205 
  206         int                     axe_ed[AXE_ENDPT_MAX];
  207         usbd_pipe_handle        axe_ep[AXE_ENDPT_MAX];
  208         int                     axe_unit;
  209         int                     axe_if_flags;
  210         struct axe_cdata        axe_cdata;
  211         struct timeout          axe_stat_ch;
  212 
  213         int                     axe_refcnt;
  214         char                    axe_dying;
  215         char                    axe_attached;
  216 
  217         struct usb_task         axe_tick_task;
  218         struct usb_task         axe_stop_task;
  219 
  220         struct rwlock           axe_mii_lock;
  221 
  222         int                     axe_link;
  223         unsigned char           axe_ipgs[3];
  224         unsigned char           axe_phyaddrs[2];
  225         struct timeval          axe_rx_notice;
  226         u_int                   axe_bufsz;
  227 };

/* [<][>][^][v][top][bottom][index][help] */