0001
0002
0003
0004
0005
0006
0007
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)
0017 #define CCR_EEPROM (1 << 9)
0018 #define CCR_SPI (1 << 8)
0019 #define CCR_8BIT (1 << 7)
0020 #define CCR_16BIT (1 << 6)
0021 #define CCR_32BIT (1 << 5)
0022 #define CCR_SHARED (1 << 4)
0023 #define CCR_48PIN (1 << 1)
0024 #define CCR_32PIN (1 << 0)
0025
0026
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)
0124 #define RXCR2_SRDBL_SHIFT (5)
0125 #define RXCR2_SRDBL_4B (0x0 << 5)
0126 #define RXCR2_SRDBL_8B (0x1 << 5)
0127 #define RXCR2_SRDBL_16B (0x2 << 5)
0128 #define RXCR2_SRDBL_32B (0x3 << 5)
0129 #define RXCR2_SRDBL_FRAME (0x4 << 5)
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)
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)
0181 #define RXFDPR_EMS (1 << 11)
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)
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
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
0305 #define TXFR_TXIC (1 << 15)
0306 #define TXFR_TXFID_MASK (0x3f << 0)
0307 #define TXFR_TXFID_SHIFT (0)
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321 struct ks8851_rxctrl {
0322 u16 mchash[4];
0323 u16 rxcr1;
0324 u16 rxcr2;
0325 };
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336 union ks8851_tx_hdr {
0337 u8 txb[6];
0338 __le16 txw[3];
0339 };
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
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
0439
0440
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