linux/drivers/net/ethernet/dlink/dl2k.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*  D-Link DL2000-based Gigabit Ethernet Adapter Linux driver */
   3/*
   4    Copyright (c) 2001, 2002 by D-Link Corporation
   5    Written by Edward Peng.<edward_peng@dlink.com.tw>
   6    Created 03-May-2001, base on Linux' sundance.c.
   7
   8*/
   9
  10#ifndef __DL2K_H__
  11#define __DL2K_H__
  12
  13#include <linux/module.h>
  14#include <linux/kernel.h>
  15#include <linux/string.h>
  16#include <linux/timer.h>
  17#include <linux/errno.h>
  18#include <linux/ioport.h>
  19#include <linux/slab.h>
  20#include <linux/interrupt.h>
  21#include <linux/pci.h>
  22#include <linux/netdevice.h>
  23#include <linux/etherdevice.h>
  24#include <linux/skbuff.h>
  25#include <linux/crc32.h>
  26#include <linux/ethtool.h>
  27#include <linux/mii.h>
  28#include <linux/bitops.h>
  29#include <asm/processor.h>      /* Processor type for cache alignment. */
  30#include <asm/io.h>
  31#include <linux/uaccess.h>
  32#include <linux/delay.h>
  33#include <linux/spinlock.h>
  34#include <linux/time.h>
  35#define TX_RING_SIZE    256
  36#define TX_QUEUE_LEN    (TX_RING_SIZE - 1) /* Limit ring entries actually used.*/
  37#define RX_RING_SIZE    256
  38#define TX_TOTAL_SIZE   TX_RING_SIZE*sizeof(struct netdev_desc)
  39#define RX_TOTAL_SIZE   RX_RING_SIZE*sizeof(struct netdev_desc)
  40
  41/* Offsets to the device registers.
  42   Unlike software-only systems, device drivers interact with complex hardware.
  43   It's not useful to define symbolic names for every register bit in the
  44   device.  The name can only partially document the semantics and make
  45   the driver longer and more difficult to read.
  46   In general, only the important configuration values or bits changed
  47   multiple times should be defined symbolically.
  48*/
  49enum dl2x_offsets {
  50        /* I/O register offsets */
  51        DMACtrl = 0x00,
  52        RxDMAStatus = 0x08,
  53        TFDListPtr0 = 0x10,
  54        TFDListPtr1 = 0x14,
  55        TxDMABurstThresh = 0x18,
  56        TxDMAUrgentThresh = 0x19,
  57        TxDMAPollPeriod = 0x1a,
  58        RFDListPtr0 = 0x1c,
  59        RFDListPtr1 = 0x20,
  60        RxDMABurstThresh = 0x24,
  61        RxDMAUrgentThresh = 0x25,
  62        RxDMAPollPeriod = 0x26,
  63        RxDMAIntCtrl = 0x28,
  64        DebugCtrl = 0x2c,
  65        ASICCtrl = 0x30,
  66        FifoCtrl = 0x38,
  67        RxEarlyThresh = 0x3a,
  68        FlowOffThresh = 0x3c,
  69        FlowOnThresh = 0x3e,
  70        TxStartThresh = 0x44,
  71        EepromData = 0x48,
  72        EepromCtrl = 0x4a,
  73        ExpromAddr = 0x4c,
  74        Exprodata = 0x50,
  75        WakeEvent = 0x51,
  76        CountDown = 0x54,
  77        IntStatusAck = 0x5a,
  78        IntEnable = 0x5c,
  79        IntStatus = 0x5e,
  80        TxStatus = 0x60,
  81        MACCtrl = 0x6c,
  82        VLANTag = 0x70,
  83        PhyCtrl = 0x76,
  84        StationAddr0 = 0x78,
  85        StationAddr1 = 0x7a,
  86        StationAddr2 = 0x7c,
  87        VLANId = 0x80,
  88        MaxFrameSize = 0x86,
  89        ReceiveMode = 0x88,
  90        HashTable0 = 0x8c,
  91        HashTable1 = 0x90,
  92        RmonStatMask = 0x98,
  93        StatMask = 0x9c,
  94        RxJumboFrames = 0xbc,
  95        TCPCheckSumErrors = 0xc0,
  96        IPCheckSumErrors = 0xc2,
  97        UDPCheckSumErrors = 0xc4,
  98        TxJumboFrames = 0xf4,
  99        /* Ethernet MIB statistic register offsets */
 100        OctetRcvOk = 0xa8,
 101        McstOctetRcvOk = 0xac,
 102        BcstOctetRcvOk = 0xb0,
 103        FramesRcvOk = 0xb4,
 104        McstFramesRcvdOk = 0xb8,
 105        BcstFramesRcvdOk = 0xbe,
 106        MacControlFramesRcvd = 0xc6,
 107        FrameTooLongErrors = 0xc8,
 108        InRangeLengthErrors = 0xca,
 109        FramesCheckSeqErrors = 0xcc,
 110        FramesLostRxErrors = 0xce,
 111        OctetXmtOk = 0xd0,
 112        McstOctetXmtOk = 0xd4,
 113        BcstOctetXmtOk = 0xd8,
 114        FramesXmtOk = 0xdc,
 115        McstFramesXmtdOk = 0xe0,
 116        FramesWDeferredXmt = 0xe4,
 117        LateCollisions = 0xe8,
 118        MultiColFrames = 0xec,
 119        SingleColFrames = 0xf0,
 120        BcstFramesXmtdOk = 0xf6,
 121        CarrierSenseErrors = 0xf8,
 122        MacControlFramesXmtd = 0xfa,
 123        FramesAbortXSColls = 0xfc,
 124        FramesWEXDeferal = 0xfe,
 125        /* RMON statistic register offsets */
 126        EtherStatsCollisions = 0x100,
 127        EtherStatsOctetsTransmit = 0x104,
 128        EtherStatsPktsTransmit = 0x108,
 129        EtherStatsPkts64OctetTransmit = 0x10c,
 130        EtherStats65to127OctetsTransmit = 0x110,
 131        EtherStatsPkts128to255OctetsTransmit = 0x114,
 132        EtherStatsPkts256to511OctetsTransmit = 0x118,
 133        EtherStatsPkts512to1023OctetsTransmit = 0x11c,
 134        EtherStatsPkts1024to1518OctetsTransmit = 0x120,
 135        EtherStatsCRCAlignErrors = 0x124,
 136        EtherStatsUndersizePkts = 0x128,
 137        EtherStatsFragments = 0x12c,
 138        EtherStatsJabbers = 0x130,
 139        EtherStatsOctets = 0x134,
 140        EtherStatsPkts = 0x138,
 141        EtherStats64Octets = 0x13c,
 142        EtherStatsPkts65to127Octets = 0x140,
 143        EtherStatsPkts128to255Octets = 0x144,
 144        EtherStatsPkts256to511Octets = 0x148,
 145        EtherStatsPkts512to1023Octets = 0x14c,
 146        EtherStatsPkts1024to1518Octets = 0x150,
 147};
 148
 149/* Bits in the interrupt status/mask registers. */
 150enum IntStatus_bits {
 151        InterruptStatus = 0x0001,
 152        HostError = 0x0002,
 153        MACCtrlFrame = 0x0008,
 154        TxComplete = 0x0004,
 155        RxComplete = 0x0010,
 156        RxEarly = 0x0020,
 157        IntRequested = 0x0040,
 158        UpdateStats = 0x0080,
 159        LinkEvent = 0x0100,
 160        TxDMAComplete = 0x0200,
 161        RxDMAComplete = 0x0400,
 162        RFDListEnd = 0x0800,
 163        RxDMAPriority = 0x1000,
 164};
 165
 166/* Bits in the ReceiveMode register. */
 167enum ReceiveMode_bits {
 168        ReceiveUnicast = 0x0001,
 169        ReceiveMulticast = 0x0002,
 170        ReceiveBroadcast = 0x0004,
 171        ReceiveAllFrames = 0x0008,
 172        ReceiveMulticastHash = 0x0010,
 173        ReceiveIPMulticast = 0x0020,
 174        ReceiveVLANMatch = 0x0100,
 175        ReceiveVLANHash = 0x0200,
 176};
 177/* Bits in MACCtrl. */
 178enum MACCtrl_bits {
 179        DuplexSelect = 0x20,
 180        TxFlowControlEnable = 0x80,
 181        RxFlowControlEnable = 0x0100,
 182        RcvFCS = 0x200,
 183        AutoVLANtagging = 0x1000,
 184        AutoVLANuntagging = 0x2000,
 185        StatsEnable = 0x00200000,
 186        StatsDisable = 0x00400000,
 187        StatsEnabled = 0x00800000,
 188        TxEnable = 0x01000000,
 189        TxDisable = 0x02000000,
 190        TxEnabled = 0x04000000,
 191        RxEnable = 0x08000000,
 192        RxDisable = 0x10000000,
 193        RxEnabled = 0x20000000,
 194};
 195
 196enum ASICCtrl_LoWord_bits {
 197        PhyMedia = 0x0080,
 198};
 199
 200enum ASICCtrl_HiWord_bits {
 201        GlobalReset = 0x0001,
 202        RxReset = 0x0002,
 203        TxReset = 0x0004,
 204        DMAReset = 0x0008,
 205        FIFOReset = 0x0010,
 206        NetworkReset = 0x0020,
 207        HostReset = 0x0040,
 208        ResetBusy = 0x0400,
 209};
 210
 211#define IPG_AC_LED_MODE         BIT(14)
 212#define IPG_AC_LED_SPEED        BIT(27)
 213#define IPG_AC_LED_MODE_BIT_1   BIT(29)
 214
 215/* Transmit Frame Control bits */
 216enum TFC_bits {
 217        DwordAlign = 0x00000000,
 218        WordAlignDisable = 0x00030000,
 219        WordAlign = 0x00020000,
 220        TCPChecksumEnable = 0x00040000,
 221        UDPChecksumEnable = 0x00080000,
 222        IPChecksumEnable = 0x00100000,
 223        FCSAppendDisable = 0x00200000,
 224        TxIndicate = 0x00400000,
 225        TxDMAIndicate = 0x00800000,
 226        FragCountShift = 24,
 227        VLANTagInsert = 0x0000000010000000,
 228        TFDDone = 0x80000000,
 229        VIDShift = 32,
 230        UsePriorityShift = 48,
 231};
 232
 233/* Receive Frames Status bits */
 234enum RFS_bits {
 235        RxFIFOOverrun = 0x00010000,
 236        RxRuntFrame = 0x00020000,
 237        RxAlignmentError = 0x00040000,
 238        RxFCSError = 0x00080000,
 239        RxOverSizedFrame = 0x00100000,
 240        RxLengthError = 0x00200000,
 241        VLANDetected = 0x00400000,
 242        TCPDetected = 0x00800000,
 243        TCPError = 0x01000000,
 244        UDPDetected = 0x02000000,
 245        UDPError = 0x04000000,
 246        IPDetected = 0x08000000,
 247        IPError = 0x10000000,
 248        FrameStart = 0x20000000,
 249        FrameEnd = 0x40000000,
 250        RFDDone = 0x80000000,
 251        TCIShift = 32,
 252        RFS_Errors = 0x003f0000,
 253};
 254
 255#define MII_RESET_TIME_OUT              10000
 256/* MII register */
 257enum _mii_reg {
 258        MII_PHY_SCR = 16,
 259};
 260
 261/* PCS register */
 262enum _pcs_reg {
 263        PCS_BMCR = 0,
 264        PCS_BMSR = 1,
 265        PCS_ANAR = 4,
 266        PCS_ANLPAR = 5,
 267        PCS_ANER = 6,
 268        PCS_ANNPT = 7,
 269        PCS_ANLPRNP = 8,
 270        PCS_ESR = 15,
 271};
 272
 273/* IEEE Extened Status Register */
 274enum _mii_esr {
 275        MII_ESR_1000BX_FD = 0x8000,
 276        MII_ESR_1000BX_HD = 0x4000,
 277        MII_ESR_1000BT_FD = 0x2000,
 278        MII_ESR_1000BT_HD = 0x1000,
 279};
 280/* PHY Specific Control Register */
 281#if 0
 282typedef union t_MII_PHY_SCR {
 283        u16 image;
 284        struct {
 285                u16 disable_jabber:1;   // bit 0
 286                u16 polarity_reversal:1;        // bit 1
 287                u16 SEQ_test:1; // bit 2
 288                u16 _bit_3:1;   // bit 3
 289                u16 disable_CLK125:1;   // bit 4
 290                u16 mdi_crossover_mode:2;       // bit 6:5
 291                u16 enable_ext_dist:1;  // bit 7
 292                u16 _bit_8_9:2; // bit 9:8
 293                u16 force_link:1;       // bit 10
 294                u16 assert_CRS:1;       // bit 11
 295                u16 rcv_fifo_depth:2;   // bit 13:12
 296                u16 xmit_fifo_depth:2;  // bit 15:14
 297        } bits;
 298} PHY_SCR_t, *PPHY_SCR_t;
 299#endif
 300
 301typedef enum t_MII_ADMIN_STATUS {
 302        adm_reset,
 303        adm_operational,
 304        adm_loopback,
 305        adm_power_down,
 306        adm_isolate
 307} MII_ADMIN_t, *PMII_ADMIN_t;
 308
 309/* Physical Coding Sublayer Management (PCS) */
 310/* PCS control and status registers bitmap as the same as MII */
 311/* PCS Extended Status register bitmap as the same as MII */
 312/* PCS ANAR */
 313enum _pcs_anar {
 314        PCS_ANAR_NEXT_PAGE = 0x8000,
 315        PCS_ANAR_REMOTE_FAULT = 0x3000,
 316        PCS_ANAR_ASYMMETRIC = 0x0100,
 317        PCS_ANAR_PAUSE = 0x0080,
 318        PCS_ANAR_HALF_DUPLEX = 0x0040,
 319        PCS_ANAR_FULL_DUPLEX = 0x0020,
 320};
 321/* PCS ANLPAR */
 322enum _pcs_anlpar {
 323        PCS_ANLPAR_NEXT_PAGE = PCS_ANAR_NEXT_PAGE,
 324        PCS_ANLPAR_REMOTE_FAULT = PCS_ANAR_REMOTE_FAULT,
 325        PCS_ANLPAR_ASYMMETRIC = PCS_ANAR_ASYMMETRIC,
 326        PCS_ANLPAR_PAUSE = PCS_ANAR_PAUSE,
 327        PCS_ANLPAR_HALF_DUPLEX = PCS_ANAR_HALF_DUPLEX,
 328        PCS_ANLPAR_FULL_DUPLEX = PCS_ANAR_FULL_DUPLEX,
 329};
 330
 331typedef struct t_SROM {
 332        u16 config_param;       /* 0x00 */
 333        u16 asic_ctrl;          /* 0x02 */
 334        u16 sub_vendor_id;      /* 0x04 */
 335        u16 sub_system_id;      /* 0x06 */
 336        u16 pci_base_1;         /* 0x08 (IP1000A only) */
 337        u16 pci_base_2;         /* 0x0a (IP1000A only) */
 338        u16 led_mode;           /* 0x0c (IP1000A only) */
 339        u16 reserved1[9];       /* 0x0e-0x1f */
 340        u8 mac_addr[6];         /* 0x20-0x25 */
 341        u8 reserved2[10];       /* 0x26-0x2f */
 342        u8 sib[204];            /* 0x30-0xfb */
 343        u32 crc;                /* 0xfc-0xff */
 344} SROM_t, *PSROM_t;
 345
 346/* Ioctl custom data */
 347struct ioctl_data {
 348        char signature[10];
 349        int cmd;
 350        int len;
 351        char *data;
 352};
 353
 354/* The Rx and Tx buffer descriptors. */
 355struct netdev_desc {
 356        __le64 next_desc;
 357        __le64 status;
 358        __le64 fraginfo;
 359};
 360
 361#define PRIV_ALIGN      15      /* Required alignment mask */
 362/* Use  __attribute__((aligned (L1_CACHE_BYTES)))  to maintain alignment
 363   within the structure. */
 364struct netdev_private {
 365        /* Descriptor rings first for alignment. */
 366        struct netdev_desc *rx_ring;
 367        struct netdev_desc *tx_ring;
 368        struct sk_buff *rx_skbuff[RX_RING_SIZE];
 369        struct sk_buff *tx_skbuff[TX_RING_SIZE];
 370        dma_addr_t tx_ring_dma;
 371        dma_addr_t rx_ring_dma;
 372        struct pci_dev *pdev;
 373        void __iomem *ioaddr;
 374        void __iomem *eeprom_addr;
 375        spinlock_t tx_lock;
 376        spinlock_t rx_lock;
 377        unsigned int rx_buf_sz;         /* Based on MTU+slack. */
 378        unsigned int speed;             /* Operating speed */
 379        unsigned int vlan;              /* VLAN Id */
 380        unsigned int chip_id;           /* PCI table chip id */
 381        unsigned int rx_coalesce;       /* Maximum frames each RxDMAComplete intr */
 382        unsigned int rx_timeout;        /* Wait time between RxDMAComplete intr */
 383        unsigned int tx_coalesce;       /* Maximum frames each tx interrupt */
 384        unsigned int full_duplex:1;     /* Full-duplex operation requested. */
 385        unsigned int an_enable:2;       /* Auto-Negotiated Enable */
 386        unsigned int jumbo:1;           /* Jumbo frame enable */
 387        unsigned int coalesce:1;        /* Rx coalescing enable */
 388        unsigned int tx_flow:1;         /* Tx flow control enable */
 389        unsigned int rx_flow:1;         /* Rx flow control enable */
 390        unsigned int phy_media:1;       /* 1: fiber, 0: copper */
 391        unsigned int link_status:1;     /* Current link status */
 392        struct netdev_desc *last_tx;    /* Last Tx descriptor used. */
 393        unsigned long cur_rx, old_rx;   /* Producer/consumer ring indices */
 394        unsigned long cur_tx, old_tx;
 395        struct timer_list timer;
 396        int wake_polarity;
 397        char name[256];         /* net device description */
 398        u8 duplex_polarity;
 399        u16 mcast_filter[4];
 400        u16 advertising;        /* NWay media advertisement */
 401        u16 negotiate;          /* Negotiated media */
 402        int phy_addr;           /* PHY addresses. */
 403        u16 led_mode;           /* LED mode read from EEPROM (IP1000A only) */
 404};
 405
 406/* The station address location in the EEPROM. */
 407/* The struct pci_device_id consist of:
 408        vendor, device          Vendor and device ID to match (or PCI_ANY_ID)
 409        subvendor, subdevice    Subsystem vendor and device ID to match (or PCI_ANY_ID)
 410        class                   Device class to match. The class_mask tells which bits
 411        class_mask              of the class are honored during the comparison.
 412        driver_data             Data private to the driver.
 413*/
 414#define CHIP_IP1000A    1
 415
 416static const struct pci_device_id rio_pci_tbl[] = {
 417        {0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, },
 418        {0x13f0, 0x1021, PCI_ANY_ID, PCI_ANY_ID, },
 419        { PCI_VDEVICE(SUNDANCE, 0x1023), CHIP_IP1000A },
 420        { PCI_VDEVICE(SUNDANCE, 0x2021), CHIP_IP1000A },
 421        { PCI_VDEVICE(DLINK,    0x9021), CHIP_IP1000A },
 422        { PCI_VDEVICE(DLINK,    0x4020), CHIP_IP1000A },
 423        { }
 424};
 425MODULE_DEVICE_TABLE (pci, rio_pci_tbl);
 426#define TX_TIMEOUT  (4*HZ)
 427#define PACKET_SIZE             1536
 428#define MAX_JUMBO               8000
 429#define RIO_IO_SIZE             340
 430#define DEFAULT_RXC             5
 431#define DEFAULT_RXT             750
 432#define DEFAULT_TXC             1
 433#define MAX_TXC                 8
 434#endif                          /* __DL2K_H__ */
 435