Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /* drivers/net/ethernet/micrel/ks8851.h
0003  *
0004  * Copyright 2009 Simtec Electronics
0005  *      Ben Dooks <ben@simtec.co.uk>
0006  *
0007  * KS8851 register definitions
0008 */
0009 
0010 #ifndef __KS8851_H__
0011 #define __KS8851_H__
0012 
0013 #include <linux/eeprom_93cx6.h>
0014 
0015 #define KS_CCR                  0x08
0016 #define CCR_LE                  (1 << 10)   /* KSZ8851-16MLL */
0017 #define CCR_EEPROM              (1 << 9)
0018 #define CCR_SPI                 (1 << 8)    /* KSZ8851SNL    */
0019 #define CCR_8BIT                (1 << 7)    /* KSZ8851-16MLL */
0020 #define CCR_16BIT               (1 << 6)    /* KSZ8851-16MLL */
0021 #define CCR_32BIT               (1 << 5)    /* KSZ8851-16MLL */
0022 #define CCR_SHARED              (1 << 4)    /* KSZ8851-16MLL */
0023 #define CCR_48PIN               (1 << 1)    /* KSZ8851-16MLL */
0024 #define CCR_32PIN               (1 << 0)    /* KSZ8851SNL    */
0025 
0026 /* MAC address registers */
0027 #define KS_MAR(_m)              (0x14 - (_m))
0028 #define KS_MARL                 0x10
0029 #define KS_MARM                 0x12
0030 #define KS_MARH                 0x14
0031 
0032 #define KS_OBCR                 0x20
0033 #define OBCR_ODS_16mA               (1 << 6)
0034 
0035 #define KS_EEPCR                0x22
0036 #define EEPCR_EESRWA                (1 << 5)
0037 #define EEPCR_EESA              (1 << 4)
0038 #define EEPCR_EESB              (1 << 3)
0039 #define EEPCR_EEDO              (1 << 2)
0040 #define EEPCR_EESCK             (1 << 1)
0041 #define EEPCR_EECS              (1 << 0)
0042 
0043 #define KS_MBIR                 0x24
0044 #define MBIR_TXMBF              (1 << 12)
0045 #define MBIR_TXMBFA             (1 << 11)
0046 #define MBIR_RXMBF              (1 << 4)
0047 #define MBIR_RXMBFA             (1 << 3)
0048 
0049 #define KS_GRR                  0x26
0050 #define GRR_QMU                 (1 << 1)
0051 #define GRR_GSR                 (1 << 0)
0052 
0053 #define KS_WFCR                 0x2A
0054 #define WFCR_MPRXE              (1 << 7)
0055 #define WFCR_WF3E               (1 << 3)
0056 #define WFCR_WF2E               (1 << 2)
0057 #define WFCR_WF1E               (1 << 1)
0058 #define WFCR_WF0E               (1 << 0)
0059 
0060 #define KS_WF0CRC0              0x30
0061 #define KS_WF0CRC1              0x32
0062 #define KS_WF0BM0               0x34
0063 #define KS_WF0BM1               0x36
0064 #define KS_WF0BM2               0x38
0065 #define KS_WF0BM3               0x3A
0066 
0067 #define KS_WF1CRC0              0x40
0068 #define KS_WF1CRC1              0x42
0069 #define KS_WF1BM0               0x44
0070 #define KS_WF1BM1               0x46
0071 #define KS_WF1BM2               0x48
0072 #define KS_WF1BM3               0x4A
0073 
0074 #define KS_WF2CRC0              0x50
0075 #define KS_WF2CRC1              0x52
0076 #define KS_WF2BM0               0x54
0077 #define KS_WF2BM1               0x56
0078 #define KS_WF2BM2               0x58
0079 #define KS_WF2BM3               0x5A
0080 
0081 #define KS_WF3CRC0              0x60
0082 #define KS_WF3CRC1              0x62
0083 #define KS_WF3BM0               0x64
0084 #define KS_WF3BM1               0x66
0085 #define KS_WF3BM2               0x68
0086 #define KS_WF3BM3               0x6A
0087 
0088 #define KS_TXCR                 0x70
0089 #define TXCR_TCGICMP                (1 << 8)
0090 #define TXCR_TCGUDP             (1 << 7)
0091 #define TXCR_TCGTCP             (1 << 6)
0092 #define TXCR_TCGIP              (1 << 5)
0093 #define TXCR_FTXQ               (1 << 4)
0094 #define TXCR_TXFCE              (1 << 3)
0095 #define TXCR_TXPE               (1 << 2)
0096 #define TXCR_TXCRC              (1 << 1)
0097 #define TXCR_TXE                (1 << 0)
0098 
0099 #define KS_TXSR                 0x72
0100 #define TXSR_TXLC               (1 << 13)
0101 #define TXSR_TXMC               (1 << 12)
0102 #define TXSR_TXFID_MASK             (0x3f << 0)
0103 #define TXSR_TXFID_SHIFT            (0)
0104 #define TXSR_TXFID_GET(_v)          (((_v) >> 0) & 0x3f)
0105 
0106 #define KS_RXCR1                0x74
0107 #define RXCR1_FRXQ              (1 << 15)
0108 #define RXCR1_RXUDPFCC              (1 << 14)
0109 #define RXCR1_RXTCPFCC              (1 << 13)
0110 #define RXCR1_RXIPFCC               (1 << 12)
0111 #define RXCR1_RXPAFMA               (1 << 11)
0112 #define RXCR1_RXFCE             (1 << 10)
0113 #define RXCR1_RXEFE             (1 << 9)
0114 #define RXCR1_RXMAFMA               (1 << 8)
0115 #define RXCR1_RXBE              (1 << 7)
0116 #define RXCR1_RXME              (1 << 6)
0117 #define RXCR1_RXUE              (1 << 5)
0118 #define RXCR1_RXAE              (1 << 4)
0119 #define RXCR1_RXINVF                (1 << 1)
0120 #define RXCR1_RXE               (1 << 0)
0121 
0122 #define KS_RXCR2                0x76
0123 #define RXCR2_SRDBL_MASK            (0x7 << 5)  /* KSZ8851SNL    */
0124 #define RXCR2_SRDBL_SHIFT           (5)     /* KSZ8851SNL    */
0125 #define RXCR2_SRDBL_4B              (0x0 << 5)  /* KSZ8851SNL    */
0126 #define RXCR2_SRDBL_8B              (0x1 << 5)  /* KSZ8851SNL    */
0127 #define RXCR2_SRDBL_16B             (0x2 << 5)  /* KSZ8851SNL    */
0128 #define RXCR2_SRDBL_32B             (0x3 << 5)  /* KSZ8851SNL    */
0129 #define RXCR2_SRDBL_FRAME           (0x4 << 5)  /* KSZ8851SNL    */
0130 #define RXCR2_IUFFP             (1 << 4)
0131 #define RXCR2_RXIUFCEZ              (1 << 3)
0132 #define RXCR2_UDPLFE                (1 << 2)
0133 #define RXCR2_RXICMPFCC             (1 << 1)
0134 #define RXCR2_RXSAF             (1 << 0)
0135 
0136 #define KS_TXMIR                0x78
0137 
0138 #define KS_RXFHSR               0x7C
0139 #define RXFSHR_RXFV             (1 << 15)
0140 #define RXFSHR_RXICMPFCS            (1 << 13)
0141 #define RXFSHR_RXIPFCS              (1 << 12)
0142 #define RXFSHR_RXTCPFCS             (1 << 11)
0143 #define RXFSHR_RXUDPFCS             (1 << 10)
0144 #define RXFSHR_RXBF             (1 << 7)
0145 #define RXFSHR_RXMF             (1 << 6)
0146 #define RXFSHR_RXUF             (1 << 5)
0147 #define RXFSHR_RXMR             (1 << 4)
0148 #define RXFSHR_RXFT             (1 << 3)
0149 #define RXFSHR_RXFTL                (1 << 2)
0150 #define RXFSHR_RXRF             (1 << 1)
0151 #define RXFSHR_RXCE             (1 << 0)
0152 
0153 #define KS_RXFHBCR              0x7E
0154 #define RXFHBCR_CNT_MASK            (0xfff << 0)
0155 
0156 #define KS_TXQCR                0x80
0157 #define TXQCR_AETFE             (1 << 2)    /* KSZ8851SNL    */
0158 #define TXQCR_TXQMAM                (1 << 1)
0159 #define TXQCR_METFE             (1 << 0)
0160 
0161 #define KS_RXQCR                0x82
0162 #define RXQCR_RXDTTS                (1 << 12)
0163 #define RXQCR_RXDBCTS               (1 << 11)
0164 #define RXQCR_RXFCTS                (1 << 10)
0165 #define RXQCR_RXIPHTOE              (1 << 9)
0166 #define RXQCR_RXDTTE                (1 << 7)
0167 #define RXQCR_RXDBCTE               (1 << 6)
0168 #define RXQCR_RXFCTE                (1 << 5)
0169 #define RXQCR_ADRFE             (1 << 4)
0170 #define RXQCR_SDA               (1 << 3)
0171 #define RXQCR_RRXEF             (1 << 0)
0172 
0173 #define KS_TXFDPR               0x84
0174 #define TXFDPR_TXFPAI               (1 << 14)
0175 #define TXFDPR_TXFP_MASK            (0x7ff << 0)
0176 #define TXFDPR_TXFP_SHIFT           (0)
0177 
0178 #define KS_RXFDPR               0x86
0179 #define RXFDPR_RXFPAI               (1 << 14)
0180 #define RXFDPR_WST              (1 << 12)   /* KSZ8851-16MLL */
0181 #define RXFDPR_EMS              (1 << 11)   /* KSZ8851-16MLL */
0182 #define RXFDPR_RXFP_MASK            (0x7ff << 0)
0183 #define RXFDPR_RXFP_SHIFT           (0)
0184 
0185 #define KS_RXDTTR               0x8C
0186 #define KS_RXDBCTR              0x8E
0187 
0188 #define KS_IER                  0x90
0189 #define KS_ISR                  0x92
0190 #define IRQ_LCI                 (1 << 15)
0191 #define IRQ_TXI                 (1 << 14)
0192 #define IRQ_RXI                 (1 << 13)
0193 #define IRQ_RXOI                (1 << 11)
0194 #define IRQ_TXPSI               (1 << 9)
0195 #define IRQ_RXPSI               (1 << 8)
0196 #define IRQ_TXSAI               (1 << 6)
0197 #define IRQ_RXWFDI              (1 << 5)
0198 #define IRQ_RXMPDI              (1 << 4)
0199 #define IRQ_LDI                 (1 << 3)
0200 #define IRQ_EDI                 (1 << 2)
0201 #define IRQ_SPIBEI              (1 << 1)    /* KSZ8851SNL    */
0202 #define IRQ_DEDI                (1 << 0)
0203 
0204 #define KS_RXFCTR               0x9C
0205 #define KS_RXFC                 0x9D
0206 #define RXFCTR_RXFC_MASK            (0xff << 8)
0207 #define RXFCTR_RXFC_SHIFT           (8)
0208 #define RXFCTR_RXFC_GET(_v)         (((_v) >> 8) & 0xff)
0209 #define RXFCTR_RXFCT_MASK           (0xff << 0)
0210 #define RXFCTR_RXFCT_SHIFT          (0)
0211 
0212 #define KS_TXNTFSR              0x9E
0213 
0214 #define KS_MAHTR0               0xA0
0215 #define KS_MAHTR1               0xA2
0216 #define KS_MAHTR2               0xA4
0217 #define KS_MAHTR3               0xA6
0218 
0219 #define KS_FCLWR                0xB0
0220 #define KS_FCHWR                0xB2
0221 #define KS_FCOWR                0xB4
0222 
0223 #define KS_CIDER                0xC0
0224 #define CIDER_ID                0x8870
0225 #define CIDER_REV_MASK              (0x7 << 1)
0226 #define CIDER_REV_SHIFT             (1)
0227 #define CIDER_REV_GET(_v)           (((_v) >> 1) & 0x7)
0228 
0229 #define KS_CGCR                 0xC6
0230 
0231 #define KS_IACR                 0xC8
0232 #define IACR_RDEN               (1 << 12)
0233 #define IACR_TSEL_MASK              (0x3 << 10)
0234 #define IACR_TSEL_SHIFT             (10)
0235 #define IACR_TSEL_MIB               (0x3 << 10)
0236 #define IACR_ADDR_MASK              (0x1f << 0)
0237 #define IACR_ADDR_SHIFT             (0)
0238 
0239 #define KS_IADLR                0xD0
0240 #define KS_IAHDR                0xD2
0241 
0242 #define KS_PMECR                0xD4
0243 #define PMECR_PME_DELAY             (1 << 14)
0244 #define PMECR_PME_POL               (1 << 12)
0245 #define PMECR_WOL_WAKEUP            (1 << 11)
0246 #define PMECR_WOL_MAGICPKT          (1 << 10)
0247 #define PMECR_WOL_LINKUP            (1 << 9)
0248 #define PMECR_WOL_ENERGY            (1 << 8)
0249 #define PMECR_AUTO_WAKE_EN          (1 << 7)
0250 #define PMECR_WAKEUP_NORMAL         (1 << 6)
0251 #define PMECR_WKEVT_MASK            (0xf << 2)
0252 #define PMECR_WKEVT_SHIFT           (2)
0253 #define PMECR_WKEVT_GET(_v)         (((_v) >> 2) & 0xf)
0254 #define PMECR_WKEVT_ENERGY          (0x1 << 2)
0255 #define PMECR_WKEVT_LINK            (0x2 << 2)
0256 #define PMECR_WKEVT_MAGICPKT            (0x4 << 2)
0257 #define PMECR_WKEVT_FRAME           (0x8 << 2)
0258 #define PMECR_PM_MASK               (0x3 << 0)
0259 #define PMECR_PM_SHIFT              (0)
0260 #define PMECR_PM_NORMAL             (0x0 << 0)
0261 #define PMECR_PM_ENERGY             (0x1 << 0)
0262 #define PMECR_PM_SOFTDOWN           (0x2 << 0)
0263 #define PMECR_PM_POWERSAVE          (0x3 << 0)
0264 
0265 /* Standard MII PHY data */
0266 #define KS_P1MBCR               0xE4
0267 #define KS_P1MBSR               0xE6
0268 #define KS_PHY1ILR              0xE8
0269 #define KS_PHY1IHR              0xEA
0270 #define KS_P1ANAR               0xEC
0271 #define KS_P1ANLPR              0xEE
0272 
0273 #define KS_P1SCLMD              0xF4
0274 
0275 #define KS_P1CR                 0xF6
0276 #define P1CR_LEDOFF             (1 << 15)
0277 #define P1CR_TXIDS              (1 << 14)
0278 #define P1CR_RESTARTAN              (1 << 13)
0279 #define P1CR_DISAUTOMDIX            (1 << 10)
0280 #define P1CR_FORCEMDIX              (1 << 9)
0281 #define P1CR_AUTONEGEN              (1 << 7)
0282 #define P1CR_FORCE100               (1 << 6)
0283 #define P1CR_FORCEFDX               (1 << 5)
0284 #define P1CR_ADV_FLOW               (1 << 4)
0285 #define P1CR_ADV_100BT_FDX          (1 << 3)
0286 #define P1CR_ADV_100BT_HDX          (1 << 2)
0287 #define P1CR_ADV_10BT_FDX           (1 << 1)
0288 #define P1CR_ADV_10BT_HDX           (1 << 0)
0289 
0290 #define KS_P1SR                 0xF8
0291 #define P1SR_HP_MDIX                (1 << 15)
0292 #define P1SR_REV_POL                (1 << 13)
0293 #define P1SR_OP_100M                (1 << 10)
0294 #define P1SR_OP_FDX             (1 << 9)
0295 #define P1SR_OP_MDI             (1 << 7)
0296 #define P1SR_AN_DONE                (1 << 6)
0297 #define P1SR_LINK_GOOD              (1 << 5)
0298 #define P1SR_PNTR_FLOW              (1 << 4)
0299 #define P1SR_PNTR_100BT_FDX         (1 << 3)
0300 #define P1SR_PNTR_100BT_HDX         (1 << 2)
0301 #define P1SR_PNTR_10BT_FDX          (1 << 1)
0302 #define P1SR_PNTR_10BT_HDX          (1 << 0)
0303 
0304 /* TX Frame control */
0305 #define TXFR_TXIC               (1 << 15)
0306 #define TXFR_TXFID_MASK             (0x3f << 0)
0307 #define TXFR_TXFID_SHIFT            (0)
0308 
0309 /**
0310  * struct ks8851_rxctrl - KS8851 driver rx control
0311  * @mchash: Multicast hash-table data.
0312  * @rxcr1: KS_RXCR1 register setting
0313  * @rxcr2: KS_RXCR2 register setting
0314  *
0315  * Representation of the settings needs to control the receive filtering
0316  * such as the multicast hash-filter and the receive register settings. This
0317  * is used to make the job of working out if the receive settings change and
0318  * then issuing the new settings to the worker that will send the necessary
0319  * commands.
0320  */
0321 struct ks8851_rxctrl {
0322     u16 mchash[4];
0323     u16 rxcr1;
0324     u16 rxcr2;
0325 };
0326 
0327 /**
0328  * union ks8851_tx_hdr - tx header data
0329  * @txb: The header as bytes
0330  * @txw: The header as 16bit, little-endian words
0331  *
0332  * A dual representation of the tx header data to allow
0333  * access to individual bytes, and to allow 16bit accesses
0334  * with 16bit alignment.
0335  */
0336 union ks8851_tx_hdr {
0337     u8  txb[6];
0338     __le16  txw[3];
0339 };
0340 
0341 /**
0342  * struct ks8851_net - KS8851 driver private data
0343  * @netdev: The network device we're bound to
0344  * @statelock: Lock on this structure for tx list.
0345  * @mii: The MII state information for the mii calls.
0346  * @rxctrl: RX settings for @rxctrl_work.
0347  * @rxctrl_work: Work queue for updating RX mode and multicast lists
0348  * @txq: Queue of packets for transmission.
0349  * @txh: Space for generating packet TX header in DMA-able data
0350  * @rxd: Space for receiving SPI data, in DMA-able space.
0351  * @txd: Space for transmitting SPI data, in DMA-able space.
0352  * @msg_enable: The message flags controlling driver output (see ethtool).
0353  * @fid: Incrementing frame id tag.
0354  * @rc_ier: Cached copy of KS_IER.
0355  * @rc_ccr: Cached copy of KS_CCR.
0356  * @rc_rxqcr: Cached copy of KS_RXQCR.
0357  * @eeprom: 93CX6 EEPROM state for accessing on-board EEPROM.
0358  * @vdd_reg:    Optional regulator supplying the chip
0359  * @vdd_io: Optional digital power supply for IO
0360  * @gpio: Optional reset_n gpio
0361  * @mii_bus: Pointer to MII bus structure
0362  * @lock: Bus access lock callback
0363  * @unlock: Bus access unlock callback
0364  * @rdreg16: 16bit register read callback
0365  * @wrreg16: 16bit register write callback
0366  * @rdfifo: FIFO read callback
0367  * @wrfifo: FIFO write callback
0368  * @start_xmit: start_xmit() implementation callback
0369  * @rx_skb: rx_skb() implementation callback
0370  * @flush_tx_work: flush_tx_work() implementation callback
0371  *
0372  * The @statelock is used to protect information in the structure which may
0373  * need to be accessed via several sources, such as the network driver layer
0374  * or one of the work queues.
0375  *
0376  * We align the buffers we may use for rx/tx to ensure that if the SPI driver
0377  * wants to DMA map them, it will not have any problems with data the driver
0378  * modifies.
0379  */
0380 struct ks8851_net {
0381     struct net_device   *netdev;
0382     spinlock_t      statelock;
0383 
0384     union ks8851_tx_hdr txh ____cacheline_aligned;
0385     u8          rxd[8];
0386     u8          txd[8];
0387 
0388     u32         msg_enable ____cacheline_aligned;
0389     u16         tx_space;
0390     u8          fid;
0391 
0392     u16         rc_ier;
0393     u16         rc_rxqcr;
0394     u16         rc_ccr;
0395 
0396     struct mii_if_info  mii;
0397     struct ks8851_rxctrl    rxctrl;
0398 
0399     struct work_struct  rxctrl_work;
0400 
0401     struct sk_buff_head txq;
0402 
0403     struct eeprom_93cx6 eeprom;
0404     struct regulator    *vdd_reg;
0405     struct regulator    *vdd_io;
0406     int         gpio;
0407     struct mii_bus      *mii_bus;
0408 
0409     void            (*lock)(struct ks8851_net *ks,
0410                     unsigned long *flags);
0411     void            (*unlock)(struct ks8851_net *ks,
0412                       unsigned long *flags);
0413     unsigned int        (*rdreg16)(struct ks8851_net *ks,
0414                        unsigned int reg);
0415     void            (*wrreg16)(struct ks8851_net *ks,
0416                        unsigned int reg, unsigned int val);
0417     void            (*rdfifo)(struct ks8851_net *ks, u8 *buff,
0418                       unsigned int len);
0419     void            (*wrfifo)(struct ks8851_net *ks,
0420                       struct sk_buff *txp, bool irq);
0421     netdev_tx_t     (*start_xmit)(struct sk_buff *skb,
0422                           struct net_device *dev);
0423     void            (*rx_skb)(struct ks8851_net *ks,
0424                       struct sk_buff *skb);
0425     void            (*flush_tx_work)(struct ks8851_net *ks);
0426 };
0427 
0428 int ks8851_probe_common(struct net_device *netdev, struct device *dev,
0429             int msg_en);
0430 void ks8851_remove_common(struct device *dev);
0431 int ks8851_suspend(struct device *dev);
0432 int ks8851_resume(struct device *dev);
0433 
0434 static __maybe_unused SIMPLE_DEV_PM_OPS(ks8851_pm_ops,
0435                     ks8851_suspend, ks8851_resume);
0436 
0437 /**
0438  * ks8851_done_tx - update and then free skbuff after transmitting
0439  * @ks: The device state
0440  * @txb: The buffer transmitted
0441  */
0442 static void __maybe_unused ks8851_done_tx(struct ks8851_net *ks,
0443                       struct sk_buff *txb)
0444 {
0445     struct net_device *dev = ks->netdev;
0446 
0447     dev->stats.tx_bytes += txb->len;
0448     dev->stats.tx_packets++;
0449 
0450     dev_kfree_skb(txb);
0451 }
0452 
0453 #endif /* __KS8851_H__ */