0001
0002 #define VERSION "0.23"
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082 #define dprintk(x...) do { } while (0)
0083
0084 #include <linux/module.h>
0085 #include <linux/moduleparam.h>
0086 #include <linux/types.h>
0087 #include <linux/pci.h>
0088 #include <linux/dma-mapping.h>
0089 #include <linux/netdevice.h>
0090 #include <linux/etherdevice.h>
0091 #include <linux/delay.h>
0092 #include <linux/workqueue.h>
0093 #include <linux/init.h>
0094 #include <linux/interrupt.h>
0095 #include <linux/ip.h> /* for iph */
0096 #include <linux/in.h> /* for IPPROTO_... */
0097 #include <linux/compiler.h>
0098 #include <linux/prefetch.h>
0099 #include <linux/ethtool.h>
0100 #include <linux/sched.h>
0101 #include <linux/timer.h>
0102 #include <linux/if_vlan.h>
0103 #include <linux/rtnetlink.h>
0104 #include <linux/jiffies.h>
0105 #include <linux/slab.h>
0106
0107 #include <asm/io.h>
0108 #include <linux/uaccess.h>
0109
0110 #define DRV_NAME "ns83820"
0111
0112
0113 static int ihr = 2;
0114 static int reset_phy = 0;
0115 static int lnksts = 0;
0116
0117
0118 #undef Dprintk
0119 #define Dprintk dprintk
0120
0121
0122 #define RX_BUF_SIZE 1500
0123 #if IS_ENABLED(CONFIG_VLAN_8021Q)
0124 #define NS83820_VLAN_ACCEL_SUPPORT
0125 #endif
0126
0127
0128 #define NR_RX_DESC 64
0129 #define NR_TX_DESC 128
0130
0131
0132 #define REAL_RX_BUF_SIZE (RX_BUF_SIZE + 14)
0133
0134 #define MIN_TX_DESC_FREE 8
0135
0136
0137 #define CFGCS 0x04
0138
0139 #define CR_TXE 0x00000001
0140 #define CR_TXD 0x00000002
0141
0142
0143
0144 #define CR_RXE 0x00000004
0145 #define CR_RXD 0x00000008
0146 #define CR_TXR 0x00000010
0147 #define CR_RXR 0x00000020
0148 #define CR_SWI 0x00000080
0149 #define CR_RST 0x00000100
0150
0151 #define PTSCR_EEBIST_FAIL 0x00000001
0152 #define PTSCR_EEBIST_EN 0x00000002
0153 #define PTSCR_EELOAD_EN 0x00000004
0154 #define PTSCR_RBIST_FAIL 0x000001b8
0155 #define PTSCR_RBIST_DONE 0x00000200
0156 #define PTSCR_RBIST_EN 0x00000400
0157 #define PTSCR_RBIST_RST 0x00002000
0158
0159 #define MEAR_EEDI 0x00000001
0160 #define MEAR_EEDO 0x00000002
0161 #define MEAR_EECLK 0x00000004
0162 #define MEAR_EESEL 0x00000008
0163 #define MEAR_MDIO 0x00000010
0164 #define MEAR_MDDIR 0x00000020
0165 #define MEAR_MDC 0x00000040
0166
0167 #define ISR_TXDESC3 0x40000000
0168 #define ISR_TXDESC2 0x20000000
0169 #define ISR_TXDESC1 0x10000000
0170 #define ISR_TXDESC0 0x08000000
0171 #define ISR_RXDESC3 0x04000000
0172 #define ISR_RXDESC2 0x02000000
0173 #define ISR_RXDESC1 0x01000000
0174 #define ISR_RXDESC0 0x00800000
0175 #define ISR_TXRCMP 0x00400000
0176 #define ISR_RXRCMP 0x00200000
0177 #define ISR_DPERR 0x00100000
0178 #define ISR_SSERR 0x00080000
0179 #define ISR_RMABT 0x00040000
0180 #define ISR_RTABT 0x00020000
0181 #define ISR_RXSOVR 0x00010000
0182 #define ISR_HIBINT 0x00008000
0183 #define ISR_PHY 0x00004000
0184 #define ISR_PME 0x00002000
0185 #define ISR_SWI 0x00001000
0186 #define ISR_MIB 0x00000800
0187 #define ISR_TXURN 0x00000400
0188 #define ISR_TXIDLE 0x00000200
0189 #define ISR_TXERR 0x00000100
0190 #define ISR_TXDESC 0x00000080
0191 #define ISR_TXOK 0x00000040
0192 #define ISR_RXORN 0x00000020
0193 #define ISR_RXIDLE 0x00000010
0194 #define ISR_RXEARLY 0x00000008
0195 #define ISR_RXERR 0x00000004
0196 #define ISR_RXDESC 0x00000002
0197 #define ISR_RXOK 0x00000001
0198
0199 #define TXCFG_CSI 0x80000000
0200 #define TXCFG_HBI 0x40000000
0201 #define TXCFG_MLB 0x20000000
0202 #define TXCFG_ATP 0x10000000
0203 #define TXCFG_ECRETRY 0x00800000
0204 #define TXCFG_BRST_DIS 0x00080000
0205 #define TXCFG_MXDMA1024 0x00000000
0206 #define TXCFG_MXDMA512 0x00700000
0207 #define TXCFG_MXDMA256 0x00600000
0208 #define TXCFG_MXDMA128 0x00500000
0209 #define TXCFG_MXDMA64 0x00400000
0210 #define TXCFG_MXDMA32 0x00300000
0211 #define TXCFG_MXDMA16 0x00200000
0212 #define TXCFG_MXDMA8 0x00100000
0213
0214 #define CFG_LNKSTS 0x80000000
0215 #define CFG_SPDSTS 0x60000000
0216 #define CFG_SPDSTS1 0x40000000
0217 #define CFG_SPDSTS0 0x20000000
0218 #define CFG_DUPSTS 0x10000000
0219 #define CFG_TBI_EN 0x01000000
0220 #define CFG_MODE_1000 0x00400000
0221
0222
0223 #define CFG_AUTO_1000 0x00200000
0224 #define CFG_PINT_CTL 0x001c0000
0225 #define CFG_PINT_DUPSTS 0x00100000
0226 #define CFG_PINT_LNKSTS 0x00080000
0227 #define CFG_PINT_SPDSTS 0x00040000
0228 #define CFG_TMRTEST 0x00020000
0229 #define CFG_MRM_DIS 0x00010000
0230 #define CFG_MWI_DIS 0x00008000
0231 #define CFG_T64ADDR 0x00004000
0232 #define CFG_PCI64_DET 0x00002000
0233 #define CFG_DATA64_EN 0x00001000
0234 #define CFG_M64ADDR 0x00000800
0235 #define CFG_PHY_RST 0x00000400
0236 #define CFG_PHY_DIS 0x00000200
0237 #define CFG_EXTSTS_EN 0x00000100
0238 #define CFG_REQALG 0x00000080
0239 #define CFG_SB 0x00000040
0240 #define CFG_POW 0x00000020
0241 #define CFG_EXD 0x00000010
0242 #define CFG_PESEL 0x00000008
0243 #define CFG_BROM_DIS 0x00000004
0244 #define CFG_EXT_125 0x00000002
0245 #define CFG_BEM 0x00000001
0246
0247 #define EXTSTS_UDPPKT 0x00200000
0248 #define EXTSTS_TCPPKT 0x00080000
0249 #define EXTSTS_IPPKT 0x00020000
0250 #define EXTSTS_VPKT 0x00010000
0251 #define EXTSTS_VTG_MASK 0x0000ffff
0252
0253 #define SPDSTS_POLARITY (CFG_SPDSTS1 | CFG_SPDSTS0 | CFG_DUPSTS | (lnksts ? CFG_LNKSTS : 0))
0254
0255 #define MIBC_MIBS 0x00000008
0256 #define MIBC_ACLR 0x00000004
0257 #define MIBC_FRZ 0x00000002
0258 #define MIBC_WRN 0x00000001
0259
0260 #define PCR_PSEN (1 << 31)
0261 #define PCR_PS_MCAST (1 << 30)
0262 #define PCR_PS_DA (1 << 29)
0263 #define PCR_STHI_8 (3 << 23)
0264 #define PCR_STLO_4 (1 << 23)
0265 #define PCR_FFHI_8K (3 << 21)
0266 #define PCR_FFLO_4K (1 << 21)
0267 #define PCR_PAUSE_CNT 0xFFFE
0268
0269 #define RXCFG_AEP 0x80000000
0270 #define RXCFG_ARP 0x40000000
0271 #define RXCFG_STRIPCRC 0x20000000
0272 #define RXCFG_RX_FD 0x10000000
0273 #define RXCFG_ALP 0x08000000
0274 #define RXCFG_AIRL 0x04000000
0275 #define RXCFG_MXDMA512 0x00700000
0276 #define RXCFG_DRTH 0x0000003e
0277 #define RXCFG_DRTH0 0x00000002
0278
0279 #define RFCR_RFEN 0x80000000
0280 #define RFCR_AAB 0x40000000
0281 #define RFCR_AAM 0x20000000
0282 #define RFCR_AAU 0x10000000
0283 #define RFCR_APM 0x08000000
0284 #define RFCR_APAT 0x07800000
0285 #define RFCR_APAT3 0x04000000
0286 #define RFCR_APAT2 0x02000000
0287 #define RFCR_APAT1 0x01000000
0288 #define RFCR_APAT0 0x00800000
0289 #define RFCR_AARP 0x00400000
0290 #define RFCR_MHEN 0x00200000
0291 #define RFCR_UHEN 0x00100000
0292 #define RFCR_ULM 0x00080000
0293
0294 #define VRCR_RUDPE 0x00000080
0295 #define VRCR_RTCPE 0x00000040
0296 #define VRCR_RIPE 0x00000020
0297 #define VRCR_IPEN 0x00000010
0298 #define VRCR_DUTF 0x00000008
0299 #define VRCR_DVTF 0x00000004
0300 #define VRCR_VTREN 0x00000002
0301 #define VRCR_VTDEN 0x00000001
0302
0303 #define VTCR_PPCHK 0x00000008
0304 #define VTCR_GCHK 0x00000004
0305 #define VTCR_VPPTI 0x00000002
0306 #define VTCR_VGTI 0x00000001
0307
0308 #define CR 0x00
0309 #define CFG 0x04
0310 #define MEAR 0x08
0311 #define PTSCR 0x0c
0312 #define ISR 0x10
0313 #define IMR 0x14
0314 #define IER 0x18
0315 #define IHR 0x1c
0316 #define TXDP 0x20
0317 #define TXDP_HI 0x24
0318 #define TXCFG 0x28
0319 #define GPIOR 0x2c
0320 #define RXDP 0x30
0321 #define RXDP_HI 0x34
0322 #define RXCFG 0x38
0323 #define PQCR 0x3c
0324 #define WCSR 0x40
0325 #define PCR 0x44
0326 #define RFCR 0x48
0327 #define RFDR 0x4c
0328
0329 #define SRR 0x58
0330
0331 #define VRCR 0xbc
0332 #define VTCR 0xc0
0333 #define VDR 0xc4
0334 #define CCSR 0xcc
0335
0336 #define TBICR 0xe0
0337 #define TBISR 0xe4
0338 #define TANAR 0xe8
0339 #define TANLPAR 0xec
0340 #define TANER 0xf0
0341 #define TESR 0xf4
0342
0343 #define TBICR_MR_AN_ENABLE 0x00001000
0344 #define TBICR_MR_RESTART_AN 0x00000200
0345
0346 #define TBISR_MR_LINK_STATUS 0x00000020
0347 #define TBISR_MR_AN_COMPLETE 0x00000004
0348
0349 #define TANAR_PS2 0x00000100
0350 #define TANAR_PS1 0x00000080
0351 #define TANAR_HALF_DUP 0x00000040
0352 #define TANAR_FULL_DUP 0x00000020
0353
0354 #define GPIOR_GP5_OE 0x00000200
0355 #define GPIOR_GP4_OE 0x00000100
0356 #define GPIOR_GP3_OE 0x00000080
0357 #define GPIOR_GP2_OE 0x00000040
0358 #define GPIOR_GP1_OE 0x00000020
0359 #define GPIOR_GP3_OUT 0x00000004
0360 #define GPIOR_GP1_OUT 0x00000001
0361
0362 #define LINK_AUTONEGOTIATE 0x01
0363 #define LINK_DOWN 0x02
0364 #define LINK_UP 0x04
0365
0366 #define HW_ADDR_LEN sizeof(dma_addr_t)
0367 #define desc_addr_set(desc, addr) \
0368 do { \
0369 ((desc)[0] = cpu_to_le32(addr)); \
0370 if (HW_ADDR_LEN == 8) \
0371 (desc)[1] = cpu_to_le32(((u64)addr) >> 32); \
0372 } while(0)
0373 #define desc_addr_get(desc) \
0374 (le32_to_cpu((desc)[0]) | \
0375 (HW_ADDR_LEN == 8 ? ((dma_addr_t)le32_to_cpu((desc)[1]))<<32 : 0))
0376
0377 #define DESC_LINK 0
0378 #define DESC_BUFPTR (DESC_LINK + HW_ADDR_LEN/4)
0379 #define DESC_CMDSTS (DESC_BUFPTR + HW_ADDR_LEN/4)
0380 #define DESC_EXTSTS (DESC_CMDSTS + 4/4)
0381
0382 #define CMDSTS_OWN 0x80000000
0383 #define CMDSTS_MORE 0x40000000
0384 #define CMDSTS_INTR 0x20000000
0385 #define CMDSTS_ERR 0x10000000
0386 #define CMDSTS_OK 0x08000000
0387 #define CMDSTS_RUNT 0x00200000
0388 #define CMDSTS_LEN_MASK 0x0000ffff
0389
0390 #define CMDSTS_DEST_MASK 0x01800000
0391 #define CMDSTS_DEST_SELF 0x00800000
0392 #define CMDSTS_DEST_MULTI 0x01000000
0393
0394 #define DESC_SIZE 8
0395
0396 struct rx_info {
0397 spinlock_t lock;
0398 int up;
0399 unsigned long idle;
0400
0401 struct sk_buff *skbs[NR_RX_DESC];
0402
0403 __le32 *next_rx_desc;
0404 u16 next_rx, next_empty;
0405
0406 __le32 *descs;
0407 dma_addr_t phy_descs;
0408 };
0409
0410
0411 struct ns83820 {
0412 u8 __iomem *base;
0413
0414 struct pci_dev *pci_dev;
0415 struct net_device *ndev;
0416
0417 struct rx_info rx_info;
0418 struct tasklet_struct rx_tasklet;
0419
0420 unsigned ihr;
0421 struct work_struct tq_refill;
0422
0423
0424 spinlock_t misc_lock;
0425
0426 u32 CFG_cache;
0427
0428 u32 MEAR_cache;
0429 u32 IMR_cache;
0430
0431 unsigned linkstate;
0432
0433 spinlock_t tx_lock;
0434
0435 u16 tx_done_idx;
0436 u16 tx_idx;
0437 volatile u16 tx_free_idx;
0438 u16 tx_intr_idx;
0439
0440 atomic_t nr_tx_skbs;
0441 struct sk_buff *tx_skbs[NR_TX_DESC];
0442
0443 char pad[16] __attribute__((aligned(16)));
0444 __le32 *tx_descs;
0445 dma_addr_t tx_phy_descs;
0446
0447 struct timer_list tx_watchdog;
0448 };
0449
0450 static inline struct ns83820 *PRIV(struct net_device *dev)
0451 {
0452 return netdev_priv(dev);
0453 }
0454
0455 #define __kick_rx(dev) writel(CR_RXE, dev->base + CR)
0456
0457 static inline void kick_rx(struct net_device *ndev)
0458 {
0459 struct ns83820 *dev = PRIV(ndev);
0460 dprintk("kick_rx: maybe kicking\n");
0461 if (test_and_clear_bit(0, &dev->rx_info.idle)) {
0462 dprintk("actually kicking\n");
0463 writel(dev->rx_info.phy_descs +
0464 (4 * DESC_SIZE * dev->rx_info.next_rx),
0465 dev->base + RXDP);
0466 if (dev->rx_info.next_rx == dev->rx_info.next_empty)
0467 printk(KERN_DEBUG "%s: uh-oh: next_rx == next_empty???\n",
0468 ndev->name);
0469 __kick_rx(dev);
0470 }
0471 }
0472
0473
0474 #define start_tx_okay(dev) \
0475 (((NR_TX_DESC-2 + dev->tx_done_idx - dev->tx_free_idx) % NR_TX_DESC) > MIN_TX_DESC_FREE)
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490 static inline void build_rx_desc(struct ns83820 *dev, __le32 *desc, dma_addr_t link, dma_addr_t buf, u32 cmdsts, u32 extsts)
0491 {
0492 desc_addr_set(desc + DESC_LINK, link);
0493 desc_addr_set(desc + DESC_BUFPTR, buf);
0494 desc[DESC_EXTSTS] = cpu_to_le32(extsts);
0495 mb();
0496 desc[DESC_CMDSTS] = cpu_to_le32(cmdsts);
0497 }
0498
0499 #define nr_rx_empty(dev) ((NR_RX_DESC-2 + dev->rx_info.next_rx - dev->rx_info.next_empty) % NR_RX_DESC)
0500 static inline int ns83820_add_rx_skb(struct ns83820 *dev, struct sk_buff *skb)
0501 {
0502 unsigned next_empty;
0503 u32 cmdsts;
0504 __le32 *sg;
0505 dma_addr_t buf;
0506
0507 next_empty = dev->rx_info.next_empty;
0508
0509
0510 if (unlikely(nr_rx_empty(dev) <= 2)) {
0511 kfree_skb(skb);
0512 return 1;
0513 }
0514
0515 #if 0
0516 dprintk("next_empty[%d] nr_used[%d] next_rx[%d]\n",
0517 dev->rx_info.next_empty,
0518 dev->rx_info.nr_used,
0519 dev->rx_info.next_rx
0520 );
0521 #endif
0522
0523 sg = dev->rx_info.descs + (next_empty * DESC_SIZE);
0524 BUG_ON(NULL != dev->rx_info.skbs[next_empty]);
0525 dev->rx_info.skbs[next_empty] = skb;
0526
0527 dev->rx_info.next_empty = (next_empty + 1) % NR_RX_DESC;
0528 cmdsts = REAL_RX_BUF_SIZE | CMDSTS_INTR;
0529 buf = dma_map_single(&dev->pci_dev->dev, skb->data, REAL_RX_BUF_SIZE,
0530 DMA_FROM_DEVICE);
0531 build_rx_desc(dev, sg, 0, buf, cmdsts, 0);
0532
0533 if (likely(next_empty != dev->rx_info.next_rx))
0534 dev->rx_info.descs[((NR_RX_DESC + next_empty - 1) % NR_RX_DESC) * DESC_SIZE] = cpu_to_le32(dev->rx_info.phy_descs + (next_empty * DESC_SIZE * 4));
0535
0536 return 0;
0537 }
0538
0539 static inline int rx_refill(struct net_device *ndev, gfp_t gfp)
0540 {
0541 struct ns83820 *dev = PRIV(ndev);
0542 unsigned i;
0543 unsigned long flags = 0;
0544
0545 if (unlikely(nr_rx_empty(dev) <= 2))
0546 return 0;
0547
0548 dprintk("rx_refill(%p)\n", ndev);
0549 if (gfp == GFP_ATOMIC)
0550 spin_lock_irqsave(&dev->rx_info.lock, flags);
0551 for (i=0; i<NR_RX_DESC; i++) {
0552 struct sk_buff *skb;
0553 long res;
0554
0555
0556 skb = __netdev_alloc_skb(ndev, REAL_RX_BUF_SIZE+16, gfp);
0557 if (unlikely(!skb))
0558 break;
0559
0560 skb_reserve(skb, skb->data - PTR_ALIGN(skb->data, 16));
0561 if (gfp != GFP_ATOMIC)
0562 spin_lock_irqsave(&dev->rx_info.lock, flags);
0563 res = ns83820_add_rx_skb(dev, skb);
0564 if (gfp != GFP_ATOMIC)
0565 spin_unlock_irqrestore(&dev->rx_info.lock, flags);
0566 if (res) {
0567 i = 1;
0568 break;
0569 }
0570 }
0571 if (gfp == GFP_ATOMIC)
0572 spin_unlock_irqrestore(&dev->rx_info.lock, flags);
0573
0574 return i ? 0 : -ENOMEM;
0575 }
0576
0577 static void rx_refill_atomic(struct net_device *ndev)
0578 {
0579 rx_refill(ndev, GFP_ATOMIC);
0580 }
0581
0582
0583 static inline void queue_refill(struct work_struct *work)
0584 {
0585 struct ns83820 *dev = container_of(work, struct ns83820, tq_refill);
0586 struct net_device *ndev = dev->ndev;
0587
0588 rx_refill(ndev, GFP_KERNEL);
0589 if (dev->rx_info.up)
0590 kick_rx(ndev);
0591 }
0592
0593 static inline void clear_rx_desc(struct ns83820 *dev, unsigned i)
0594 {
0595 build_rx_desc(dev, dev->rx_info.descs + (DESC_SIZE * i), 0, 0, CMDSTS_OWN, 0);
0596 }
0597
0598 static void phy_intr(struct net_device *ndev)
0599 {
0600 struct ns83820 *dev = PRIV(ndev);
0601 static const char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" };
0602 u32 cfg, new_cfg;
0603 u32 tanar, tanlpar;
0604 int speed, fullduplex, newlinkstate;
0605
0606 cfg = readl(dev->base + CFG) ^ SPDSTS_POLARITY;
0607
0608 if (dev->CFG_cache & CFG_TBI_EN) {
0609 u32 __maybe_unused tbisr;
0610
0611
0612 tbisr = readl(dev->base + TBISR);
0613 tanar = readl(dev->base + TANAR);
0614 tanlpar = readl(dev->base + TANLPAR);
0615 dprintk("phy_intr: tbisr=%08x, tanar=%08x, tanlpar=%08x\n",
0616 tbisr, tanar, tanlpar);
0617
0618 if ( (fullduplex = (tanlpar & TANAR_FULL_DUP) &&
0619 (tanar & TANAR_FULL_DUP)) ) {
0620
0621
0622 writel(readl(dev->base + TXCFG)
0623 | TXCFG_CSI | TXCFG_HBI | TXCFG_ATP,
0624 dev->base + TXCFG);
0625 writel(readl(dev->base + RXCFG) | RXCFG_RX_FD,
0626 dev->base + RXCFG);
0627
0628 writel(readl(dev->base + GPIOR) | GPIOR_GP1_OUT,
0629 dev->base + GPIOR);
0630
0631 } else if (((tanlpar & TANAR_HALF_DUP) &&
0632 (tanar & TANAR_HALF_DUP)) ||
0633 ((tanlpar & TANAR_FULL_DUP) &&
0634 (tanar & TANAR_HALF_DUP)) ||
0635 ((tanlpar & TANAR_HALF_DUP) &&
0636 (tanar & TANAR_FULL_DUP))) {
0637
0638
0639 writel((readl(dev->base + TXCFG)
0640 & ~(TXCFG_CSI | TXCFG_HBI)) | TXCFG_ATP,
0641 dev->base + TXCFG);
0642 writel(readl(dev->base + RXCFG) & ~RXCFG_RX_FD,
0643 dev->base + RXCFG);
0644
0645 writel(readl(dev->base + GPIOR) & ~GPIOR_GP1_OUT,
0646 dev->base + GPIOR);
0647 }
0648
0649 speed = 4;
0650
0651 } else {
0652
0653 new_cfg = dev->CFG_cache & ~(CFG_SB | CFG_MODE_1000 | CFG_SPDSTS);
0654
0655 if (cfg & CFG_SPDSTS1)
0656 new_cfg |= CFG_MODE_1000;
0657 else
0658 new_cfg &= ~CFG_MODE_1000;
0659
0660 speed = ((cfg / CFG_SPDSTS0) & 3);
0661 fullduplex = (cfg & CFG_DUPSTS);
0662
0663 if (fullduplex) {
0664 new_cfg |= CFG_SB;
0665 writel(readl(dev->base + TXCFG)
0666 | TXCFG_CSI | TXCFG_HBI,
0667 dev->base + TXCFG);
0668 writel(readl(dev->base + RXCFG) | RXCFG_RX_FD,
0669 dev->base + RXCFG);
0670 } else {
0671 writel(readl(dev->base + TXCFG)
0672 & ~(TXCFG_CSI | TXCFG_HBI),
0673 dev->base + TXCFG);
0674 writel(readl(dev->base + RXCFG) & ~(RXCFG_RX_FD),
0675 dev->base + RXCFG);
0676 }
0677
0678 if ((cfg & CFG_LNKSTS) &&
0679 ((new_cfg ^ dev->CFG_cache) != 0)) {
0680 writel(new_cfg, dev->base + CFG);
0681 dev->CFG_cache = new_cfg;
0682 }
0683
0684 dev->CFG_cache &= ~CFG_SPDSTS;
0685 dev->CFG_cache |= cfg & CFG_SPDSTS;
0686 }
0687
0688 newlinkstate = (cfg & CFG_LNKSTS) ? LINK_UP : LINK_DOWN;
0689
0690 if (newlinkstate & LINK_UP &&
0691 dev->linkstate != newlinkstate) {
0692 netif_start_queue(ndev);
0693 netif_wake_queue(ndev);
0694 printk(KERN_INFO "%s: link now %s mbps, %s duplex and up.\n",
0695 ndev->name,
0696 speeds[speed],
0697 fullduplex ? "full" : "half");
0698 } else if (newlinkstate & LINK_DOWN &&
0699 dev->linkstate != newlinkstate) {
0700 netif_stop_queue(ndev);
0701 printk(KERN_INFO "%s: link now down.\n", ndev->name);
0702 }
0703
0704 dev->linkstate = newlinkstate;
0705 }
0706
0707 static int ns83820_setup_rx(struct net_device *ndev)
0708 {
0709 struct ns83820 *dev = PRIV(ndev);
0710 unsigned i;
0711 int ret;
0712
0713 dprintk("ns83820_setup_rx(%p)\n", ndev);
0714
0715 dev->rx_info.idle = 1;
0716 dev->rx_info.next_rx = 0;
0717 dev->rx_info.next_rx_desc = dev->rx_info.descs;
0718 dev->rx_info.next_empty = 0;
0719
0720 for (i=0; i<NR_RX_DESC; i++)
0721 clear_rx_desc(dev, i);
0722
0723 writel(0, dev->base + RXDP_HI);
0724 writel(dev->rx_info.phy_descs, dev->base + RXDP);
0725
0726 ret = rx_refill(ndev, GFP_KERNEL);
0727 if (!ret) {
0728 dprintk("starting receiver\n");
0729
0730 spin_lock_irq(&dev->rx_info.lock);
0731
0732 writel(0x0001, dev->base + CCSR);
0733 writel(0, dev->base + RFCR);
0734 writel(0x7fc00000, dev->base + RFCR);
0735 writel(0xffc00000, dev->base + RFCR);
0736
0737 dev->rx_info.up = 1;
0738
0739 phy_intr(ndev);
0740
0741
0742 spin_lock(&dev->misc_lock);
0743 dev->IMR_cache |= ISR_PHY;
0744 dev->IMR_cache |= ISR_RXRCMP;
0745
0746
0747 dev->IMR_cache |= ISR_RXORN;
0748 dev->IMR_cache |= ISR_RXSOVR;
0749 dev->IMR_cache |= ISR_RXDESC;
0750 dev->IMR_cache |= ISR_RXIDLE;
0751 dev->IMR_cache |= ISR_TXDESC;
0752 dev->IMR_cache |= ISR_TXIDLE;
0753
0754 writel(dev->IMR_cache, dev->base + IMR);
0755 writel(1, dev->base + IER);
0756 spin_unlock(&dev->misc_lock);
0757
0758 kick_rx(ndev);
0759
0760 spin_unlock_irq(&dev->rx_info.lock);
0761 }
0762 return ret;
0763 }
0764
0765 static void ns83820_cleanup_rx(struct ns83820 *dev)
0766 {
0767 unsigned i;
0768 unsigned long flags;
0769
0770 dprintk("ns83820_cleanup_rx(%p)\n", dev);
0771
0772
0773 spin_lock_irqsave(&dev->misc_lock, flags);
0774 dev->IMR_cache &= ~(ISR_RXOK | ISR_RXDESC | ISR_RXERR | ISR_RXEARLY | ISR_RXIDLE);
0775 writel(dev->IMR_cache, dev->base + IMR);
0776 spin_unlock_irqrestore(&dev->misc_lock, flags);
0777
0778
0779 dev->rx_info.up = 0;
0780 synchronize_irq(dev->pci_dev->irq);
0781
0782
0783 readl(dev->base + IMR);
0784
0785
0786 writel(0, dev->base + RXDP_HI);
0787 writel(0, dev->base + RXDP);
0788
0789 for (i=0; i<NR_RX_DESC; i++) {
0790 struct sk_buff *skb = dev->rx_info.skbs[i];
0791 dev->rx_info.skbs[i] = NULL;
0792 clear_rx_desc(dev, i);
0793 kfree_skb(skb);
0794 }
0795 }
0796
0797 static void ns83820_rx_kick(struct net_device *ndev)
0798 {
0799 struct ns83820 *dev = PRIV(ndev);
0800 {
0801 if (dev->rx_info.up) {
0802 rx_refill_atomic(ndev);
0803 kick_rx(ndev);
0804 }
0805 }
0806
0807 if (dev->rx_info.up && nr_rx_empty(dev) > NR_RX_DESC*3/4)
0808 schedule_work(&dev->tq_refill);
0809 else
0810 kick_rx(ndev);
0811 if (dev->rx_info.idle)
0812 printk(KERN_DEBUG "%s: BAD\n", ndev->name);
0813 }
0814
0815
0816
0817
0818 static void rx_irq(struct net_device *ndev)
0819 {
0820 struct ns83820 *dev = PRIV(ndev);
0821 struct rx_info *info = &dev->rx_info;
0822 unsigned next_rx;
0823 int rx_rc, len;
0824 u32 cmdsts;
0825 __le32 *desc;
0826 unsigned long flags;
0827 int nr = 0;
0828
0829 dprintk("rx_irq(%p)\n", ndev);
0830 dprintk("rxdp: %08x, descs: %08lx next_rx[%d]: %p next_empty[%d]: %p\n",
0831 readl(dev->base + RXDP),
0832 (long)(dev->rx_info.phy_descs),
0833 (int)dev->rx_info.next_rx,
0834 (dev->rx_info.descs + (DESC_SIZE * dev->rx_info.next_rx)),
0835 (int)dev->rx_info.next_empty,
0836 (dev->rx_info.descs + (DESC_SIZE * dev->rx_info.next_empty))
0837 );
0838
0839 spin_lock_irqsave(&info->lock, flags);
0840 if (!info->up)
0841 goto out;
0842
0843 dprintk("walking descs\n");
0844 next_rx = info->next_rx;
0845 desc = info->next_rx_desc;
0846 while ((CMDSTS_OWN & (cmdsts = le32_to_cpu(desc[DESC_CMDSTS]))) &&
0847 (cmdsts != CMDSTS_OWN)) {
0848 struct sk_buff *skb;
0849 u32 extsts = le32_to_cpu(desc[DESC_EXTSTS]);
0850 dma_addr_t bufptr = desc_addr_get(desc + DESC_BUFPTR);
0851
0852 dprintk("cmdsts: %08x\n", cmdsts);
0853 dprintk("link: %08x\n", cpu_to_le32(desc[DESC_LINK]));
0854 dprintk("extsts: %08x\n", extsts);
0855
0856 skb = info->skbs[next_rx];
0857 info->skbs[next_rx] = NULL;
0858 info->next_rx = (next_rx + 1) % NR_RX_DESC;
0859
0860 mb();
0861 clear_rx_desc(dev, next_rx);
0862
0863 dma_unmap_single(&dev->pci_dev->dev, bufptr, RX_BUF_SIZE,
0864 DMA_FROM_DEVICE);
0865 len = cmdsts & CMDSTS_LEN_MASK;
0866 #ifdef NS83820_VLAN_ACCEL_SUPPORT
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878 if (likely((CMDSTS_OK & cmdsts) ||
0879 ((cmdsts & CMDSTS_RUNT) && len >= 56))) {
0880 #else
0881 if (likely(CMDSTS_OK & cmdsts)) {
0882 #endif
0883 skb_put(skb, len);
0884 if (unlikely(!skb))
0885 goto netdev_mangle_me_harder_failed;
0886 if (cmdsts & CMDSTS_DEST_MULTI)
0887 ndev->stats.multicast++;
0888 ndev->stats.rx_packets++;
0889 ndev->stats.rx_bytes += len;
0890 if ((extsts & 0x002a0000) && !(extsts & 0x00540000)) {
0891 skb->ip_summed = CHECKSUM_UNNECESSARY;
0892 } else {
0893 skb_checksum_none_assert(skb);
0894 }
0895 skb->protocol = eth_type_trans(skb, ndev);
0896 #ifdef NS83820_VLAN_ACCEL_SUPPORT
0897 if(extsts & EXTSTS_VPKT) {
0898 unsigned short tag;
0899
0900 tag = ntohs(extsts & EXTSTS_VTG_MASK);
0901 __vlan_hwaccel_put_tag(skb, htons(ETH_P_IPV6), tag);
0902 }
0903 #endif
0904 rx_rc = netif_rx(skb);
0905 if (NET_RX_DROP == rx_rc) {
0906 netdev_mangle_me_harder_failed:
0907 ndev->stats.rx_dropped++;
0908 }
0909 } else {
0910 dev_kfree_skb_irq(skb);
0911 }
0912
0913 nr++;
0914 next_rx = info->next_rx;
0915 desc = info->descs + (DESC_SIZE * next_rx);
0916 }
0917 info->next_rx = next_rx;
0918 info->next_rx_desc = info->descs + (DESC_SIZE * next_rx);
0919
0920 out:
0921 if (0 && !nr) {
0922 Dprintk("dazed: cmdsts_f: %08x\n", cmdsts);
0923 }
0924
0925 spin_unlock_irqrestore(&info->lock, flags);
0926 }
0927
0928 static void rx_action(struct tasklet_struct *t)
0929 {
0930 struct ns83820 *dev = from_tasklet(dev, t, rx_tasklet);
0931 struct net_device *ndev = dev->ndev;
0932 rx_irq(ndev);
0933 writel(ihr, dev->base + IHR);
0934
0935 spin_lock_irq(&dev->misc_lock);
0936 dev->IMR_cache |= ISR_RXDESC;
0937 writel(dev->IMR_cache, dev->base + IMR);
0938 spin_unlock_irq(&dev->misc_lock);
0939
0940 rx_irq(ndev);
0941 ns83820_rx_kick(ndev);
0942 }
0943
0944
0945
0946 static inline void kick_tx(struct ns83820 *dev)
0947 {
0948 dprintk("kick_tx(%p): tx_idx=%d free_idx=%d\n",
0949 dev, dev->tx_idx, dev->tx_free_idx);
0950 writel(CR_TXE, dev->base + CR);
0951 }
0952
0953
0954
0955
0956 static void do_tx_done(struct net_device *ndev)
0957 {
0958 struct ns83820 *dev = PRIV(ndev);
0959 u32 cmdsts, tx_done_idx;
0960 __le32 *desc;
0961
0962 dprintk("do_tx_done(%p)\n", ndev);
0963 tx_done_idx = dev->tx_done_idx;
0964 desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
0965
0966 dprintk("tx_done_idx=%d free_idx=%d cmdsts=%08x\n",
0967 tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS]));
0968 while ((tx_done_idx != dev->tx_free_idx) &&
0969 !(CMDSTS_OWN & (cmdsts = le32_to_cpu(desc[DESC_CMDSTS]))) ) {
0970 struct sk_buff *skb;
0971 unsigned len;
0972 dma_addr_t addr;
0973
0974 if (cmdsts & CMDSTS_ERR)
0975 ndev->stats.tx_errors++;
0976 if (cmdsts & CMDSTS_OK)
0977 ndev->stats.tx_packets++;
0978 if (cmdsts & CMDSTS_OK)
0979 ndev->stats.tx_bytes += cmdsts & 0xffff;
0980
0981 dprintk("tx_done_idx=%d free_idx=%d cmdsts=%08x\n",
0982 tx_done_idx, dev->tx_free_idx, cmdsts);
0983 skb = dev->tx_skbs[tx_done_idx];
0984 dev->tx_skbs[tx_done_idx] = NULL;
0985 dprintk("done(%p)\n", skb);
0986
0987 len = cmdsts & CMDSTS_LEN_MASK;
0988 addr = desc_addr_get(desc + DESC_BUFPTR);
0989 if (skb) {
0990 dma_unmap_single(&dev->pci_dev->dev, addr, len,
0991 DMA_TO_DEVICE);
0992 dev_consume_skb_irq(skb);
0993 atomic_dec(&dev->nr_tx_skbs);
0994 } else
0995 dma_unmap_page(&dev->pci_dev->dev, addr, len,
0996 DMA_TO_DEVICE);
0997
0998 tx_done_idx = (tx_done_idx + 1) % NR_TX_DESC;
0999 dev->tx_done_idx = tx_done_idx;
1000 desc[DESC_CMDSTS] = cpu_to_le32(0);
1001 mb();
1002 desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
1003 }
1004
1005
1006
1007
1008 if (netif_queue_stopped(ndev) && start_tx_okay(dev)) {
1009 dprintk("start_queue(%p)\n", ndev);
1010 netif_start_queue(ndev);
1011 netif_wake_queue(ndev);
1012 }
1013 }
1014
1015 static void ns83820_cleanup_tx(struct ns83820 *dev)
1016 {
1017 unsigned i;
1018
1019 for (i=0; i<NR_TX_DESC; i++) {
1020 struct sk_buff *skb = dev->tx_skbs[i];
1021 dev->tx_skbs[i] = NULL;
1022 if (skb) {
1023 __le32 *desc = dev->tx_descs + (i * DESC_SIZE);
1024 dma_unmap_single(&dev->pci_dev->dev,
1025 desc_addr_get(desc + DESC_BUFPTR),
1026 le32_to_cpu(desc[DESC_CMDSTS]) & CMDSTS_LEN_MASK,
1027 DMA_TO_DEVICE);
1028 dev_kfree_skb_irq(skb);
1029 atomic_dec(&dev->nr_tx_skbs);
1030 }
1031 }
1032
1033 memset(dev->tx_descs, 0, NR_TX_DESC * DESC_SIZE * 4);
1034 }
1035
1036
1037
1038
1039
1040
1041
1042 static netdev_tx_t ns83820_hard_start_xmit(struct sk_buff *skb,
1043 struct net_device *ndev)
1044 {
1045 struct ns83820 *dev = PRIV(ndev);
1046 u32 free_idx, cmdsts, extsts;
1047 int nr_free, nr_frags;
1048 unsigned tx_done_idx, last_idx;
1049 dma_addr_t buf;
1050 unsigned len;
1051 skb_frag_t *frag;
1052 int stopped = 0;
1053 int do_intr = 0;
1054 volatile __le32 *first_desc;
1055
1056 dprintk("ns83820_hard_start_xmit\n");
1057
1058 nr_frags = skb_shinfo(skb)->nr_frags;
1059 again:
1060 if (unlikely(dev->CFG_cache & CFG_LNKSTS)) {
1061 netif_stop_queue(ndev);
1062 if (unlikely(dev->CFG_cache & CFG_LNKSTS))
1063 return NETDEV_TX_BUSY;
1064 netif_start_queue(ndev);
1065 }
1066
1067 last_idx = free_idx = dev->tx_free_idx;
1068 tx_done_idx = dev->tx_done_idx;
1069 nr_free = (tx_done_idx + NR_TX_DESC-2 - free_idx) % NR_TX_DESC;
1070 nr_free -= 1;
1071 if (nr_free <= nr_frags) {
1072 dprintk("stop_queue - not enough(%p)\n", ndev);
1073 netif_stop_queue(ndev);
1074
1075
1076 if (dev->tx_done_idx != tx_done_idx) {
1077 dprintk("restart queue(%p)\n", ndev);
1078 netif_start_queue(ndev);
1079 goto again;
1080 }
1081 return NETDEV_TX_BUSY;
1082 }
1083
1084 if (free_idx == dev->tx_intr_idx) {
1085 do_intr = 1;
1086 dev->tx_intr_idx = (dev->tx_intr_idx + NR_TX_DESC/4) % NR_TX_DESC;
1087 }
1088
1089 nr_free -= nr_frags;
1090 if (nr_free < MIN_TX_DESC_FREE) {
1091 dprintk("stop_queue - last entry(%p)\n", ndev);
1092 netif_stop_queue(ndev);
1093 stopped = 1;
1094 }
1095
1096 frag = skb_shinfo(skb)->frags;
1097 if (!nr_frags)
1098 frag = NULL;
1099 extsts = 0;
1100 if (skb->ip_summed == CHECKSUM_PARTIAL) {
1101 extsts |= EXTSTS_IPPKT;
1102 if (IPPROTO_TCP == ip_hdr(skb)->protocol)
1103 extsts |= EXTSTS_TCPPKT;
1104 else if (IPPROTO_UDP == ip_hdr(skb)->protocol)
1105 extsts |= EXTSTS_UDPPKT;
1106 }
1107
1108 #ifdef NS83820_VLAN_ACCEL_SUPPORT
1109 if (skb_vlan_tag_present(skb)) {
1110
1111
1112
1113
1114 short tag = skb_vlan_tag_get(skb);
1115 extsts |= (EXTSTS_VPKT | htons(tag));
1116 }
1117 #endif
1118
1119 len = skb->len;
1120 if (nr_frags)
1121 len -= skb->data_len;
1122 buf = dma_map_single(&dev->pci_dev->dev, skb->data, len,
1123 DMA_TO_DEVICE);
1124
1125 first_desc = dev->tx_descs + (free_idx * DESC_SIZE);
1126
1127 for (;;) {
1128 volatile __le32 *desc = dev->tx_descs + (free_idx * DESC_SIZE);
1129
1130 dprintk("frag[%3u]: %4u @ 0x%08Lx\n", free_idx, len,
1131 (unsigned long long)buf);
1132 last_idx = free_idx;
1133 free_idx = (free_idx + 1) % NR_TX_DESC;
1134 desc[DESC_LINK] = cpu_to_le32(dev->tx_phy_descs + (free_idx * DESC_SIZE * 4));
1135 desc_addr_set(desc + DESC_BUFPTR, buf);
1136 desc[DESC_EXTSTS] = cpu_to_le32(extsts);
1137
1138 cmdsts = ((nr_frags) ? CMDSTS_MORE : do_intr ? CMDSTS_INTR : 0);
1139 cmdsts |= (desc == first_desc) ? 0 : CMDSTS_OWN;
1140 cmdsts |= len;
1141 desc[DESC_CMDSTS] = cpu_to_le32(cmdsts);
1142
1143 if (!nr_frags)
1144 break;
1145
1146 buf = skb_frag_dma_map(&dev->pci_dev->dev, frag, 0,
1147 skb_frag_size(frag), DMA_TO_DEVICE);
1148 dprintk("frag: buf=%08Lx page=%08lx offset=%08lx\n",
1149 (long long)buf, (long) page_to_pfn(frag->page),
1150 frag->page_offset);
1151 len = skb_frag_size(frag);
1152 frag++;
1153 nr_frags--;
1154 }
1155 dprintk("done pkt\n");
1156
1157 spin_lock_irq(&dev->tx_lock);
1158 dev->tx_skbs[last_idx] = skb;
1159 first_desc[DESC_CMDSTS] |= cpu_to_le32(CMDSTS_OWN);
1160 dev->tx_free_idx = free_idx;
1161 atomic_inc(&dev->nr_tx_skbs);
1162 spin_unlock_irq(&dev->tx_lock);
1163
1164 kick_tx(dev);
1165
1166
1167 if (stopped && (dev->tx_done_idx != tx_done_idx) && start_tx_okay(dev))
1168 netif_start_queue(ndev);
1169
1170 return NETDEV_TX_OK;
1171 }
1172
1173 static void ns83820_update_stats(struct ns83820 *dev)
1174 {
1175 struct net_device *ndev = dev->ndev;
1176 u8 __iomem *base = dev->base;
1177
1178
1179 ndev->stats.rx_errors += readl(base + 0x60) & 0xffff;
1180 ndev->stats.rx_crc_errors += readl(base + 0x64) & 0xffff;
1181 ndev->stats.rx_missed_errors += readl(base + 0x68) & 0xffff;
1182 ndev->stats.rx_frame_errors += readl(base + 0x6c) & 0xffff;
1183 readl(base + 0x70);
1184 ndev->stats.rx_length_errors += readl(base + 0x74) & 0xffff;
1185 ndev->stats.rx_length_errors += readl(base + 0x78) & 0xffff;
1186 readl(base + 0x7c);
1187 readl(base + 0x80);
1188 readl(base + 0x84);
1189 ndev->stats.tx_carrier_errors += readl(base + 0x88) & 0xff;
1190 }
1191
1192 static struct net_device_stats *ns83820_get_stats(struct net_device *ndev)
1193 {
1194 struct ns83820 *dev = PRIV(ndev);
1195
1196
1197 spin_lock_irq(&dev->misc_lock);
1198 ns83820_update_stats(dev);
1199 spin_unlock_irq(&dev->misc_lock);
1200
1201 return &ndev->stats;
1202 }
1203
1204
1205 static int ns83820_get_link_ksettings(struct net_device *ndev,
1206 struct ethtool_link_ksettings *cmd)
1207 {
1208 struct ns83820 *dev = PRIV(ndev);
1209 u32 cfg, tbicr;
1210 int fullduplex = 0;
1211 u32 supported;
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227 cfg = readl(dev->base + CFG) ^ SPDSTS_POLARITY;
1228 readl(dev->base + TANAR);
1229 tbicr = readl(dev->base + TBICR);
1230
1231 fullduplex = (cfg & CFG_DUPSTS) ? 1 : 0;
1232
1233 supported = SUPPORTED_Autoneg;
1234
1235 if (dev->CFG_cache & CFG_TBI_EN) {
1236
1237 supported |= SUPPORTED_1000baseT_Half |
1238 SUPPORTED_1000baseT_Full |
1239 SUPPORTED_FIBRE;
1240 cmd->base.port = PORT_FIBRE;
1241 } else {
1242
1243 supported |= SUPPORTED_10baseT_Half |
1244 SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half |
1245 SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Half |
1246 SUPPORTED_1000baseT_Full |
1247 SUPPORTED_MII;
1248 cmd->base.port = PORT_MII;
1249 }
1250
1251 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
1252 supported);
1253
1254 cmd->base.duplex = fullduplex ? DUPLEX_FULL : DUPLEX_HALF;
1255 switch (cfg / CFG_SPDSTS0 & 3) {
1256 case 2:
1257 cmd->base.speed = SPEED_1000;
1258 break;
1259 case 1:
1260 cmd->base.speed = SPEED_100;
1261 break;
1262 default:
1263 cmd->base.speed = SPEED_10;
1264 break;
1265 }
1266 cmd->base.autoneg = (tbicr & TBICR_MR_AN_ENABLE)
1267 ? AUTONEG_ENABLE : AUTONEG_DISABLE;
1268 return 0;
1269 }
1270
1271
1272 static int ns83820_set_link_ksettings(struct net_device *ndev,
1273 const struct ethtool_link_ksettings *cmd)
1274 {
1275 struct ns83820 *dev = PRIV(ndev);
1276 u32 cfg, tanar;
1277 int have_optical = 0;
1278 int fullduplex = 0;
1279
1280
1281 cfg = readl(dev->base + CFG) ^ SPDSTS_POLARITY;
1282 tanar = readl(dev->base + TANAR);
1283
1284 if (dev->CFG_cache & CFG_TBI_EN) {
1285
1286 have_optical = 1;
1287 fullduplex = (tanar & TANAR_FULL_DUP);
1288
1289 } else {
1290
1291 fullduplex = cfg & CFG_DUPSTS;
1292 }
1293
1294 spin_lock_irq(&dev->misc_lock);
1295 spin_lock(&dev->tx_lock);
1296
1297
1298 if (cmd->base.duplex != fullduplex) {
1299 if (have_optical) {
1300
1301 if (cmd->base.duplex == DUPLEX_FULL) {
1302
1303 writel(readl(dev->base + TXCFG)
1304 | TXCFG_CSI | TXCFG_HBI | TXCFG_ATP,
1305 dev->base + TXCFG);
1306 writel(readl(dev->base + RXCFG) | RXCFG_RX_FD,
1307 dev->base + RXCFG);
1308
1309 writel(readl(dev->base + GPIOR) | GPIOR_GP1_OUT,
1310 dev->base + GPIOR);
1311 } else {
1312
1313 }
1314
1315 } else {
1316
1317
1318 }
1319 printk(KERN_INFO "%s: Duplex set via ethtool\n",
1320 ndev->name);
1321 }
1322
1323
1324 if (1) {
1325 if (cmd->base.autoneg == AUTONEG_ENABLE) {
1326
1327 writel(TBICR_MR_AN_ENABLE | TBICR_MR_RESTART_AN,
1328 dev->base + TBICR);
1329 writel(TBICR_MR_AN_ENABLE, dev->base + TBICR);
1330 dev->linkstate = LINK_AUTONEGOTIATE;
1331
1332 printk(KERN_INFO "%s: autoneg enabled via ethtool\n",
1333 ndev->name);
1334 } else {
1335
1336 writel(0x00000000, dev->base + TBICR);
1337 }
1338
1339 printk(KERN_INFO "%s: autoneg %s via ethtool\n", ndev->name,
1340 cmd->base.autoneg ? "ENABLED" : "DISABLED");
1341 }
1342
1343 phy_intr(ndev);
1344 spin_unlock(&dev->tx_lock);
1345 spin_unlock_irq(&dev->misc_lock);
1346
1347 return 0;
1348 }
1349
1350
1351 static void ns83820_get_drvinfo(struct net_device *ndev, struct ethtool_drvinfo *info)
1352 {
1353 struct ns83820 *dev = PRIV(ndev);
1354 strlcpy(info->driver, "ns83820", sizeof(info->driver));
1355 strlcpy(info->version, VERSION, sizeof(info->version));
1356 strlcpy(info->bus_info, pci_name(dev->pci_dev), sizeof(info->bus_info));
1357 }
1358
1359 static u32 ns83820_get_link(struct net_device *ndev)
1360 {
1361 struct ns83820 *dev = PRIV(ndev);
1362 u32 cfg = readl(dev->base + CFG) ^ SPDSTS_POLARITY;
1363 return cfg & CFG_LNKSTS ? 1 : 0;
1364 }
1365
1366 static const struct ethtool_ops ops = {
1367 .get_drvinfo = ns83820_get_drvinfo,
1368 .get_link = ns83820_get_link,
1369 .get_link_ksettings = ns83820_get_link_ksettings,
1370 .set_link_ksettings = ns83820_set_link_ksettings,
1371 };
1372
1373 static inline void ns83820_disable_interrupts(struct ns83820 *dev)
1374 {
1375 writel(0, dev->base + IMR);
1376 writel(0, dev->base + IER);
1377 readl(dev->base + IER);
1378 }
1379
1380
1381 static void ns83820_mib_isr(struct ns83820 *dev)
1382 {
1383 unsigned long flags;
1384 spin_lock_irqsave(&dev->misc_lock, flags);
1385 ns83820_update_stats(dev);
1386 spin_unlock_irqrestore(&dev->misc_lock, flags);
1387 }
1388
1389 static void ns83820_do_isr(struct net_device *ndev, u32 isr);
1390 static irqreturn_t ns83820_irq(int foo, void *data)
1391 {
1392 struct net_device *ndev = data;
1393 struct ns83820 *dev = PRIV(ndev);
1394 u32 isr;
1395 dprintk("ns83820_irq(%p)\n", ndev);
1396
1397 dev->ihr = 0;
1398
1399 isr = readl(dev->base + ISR);
1400 dprintk("irq: %08x\n", isr);
1401 ns83820_do_isr(ndev, isr);
1402 return IRQ_HANDLED;
1403 }
1404
1405 static void ns83820_do_isr(struct net_device *ndev, u32 isr)
1406 {
1407 struct ns83820 *dev = PRIV(ndev);
1408 unsigned long flags;
1409
1410 #ifdef DEBUG
1411 if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC))
1412 Dprintk("odd isr? 0x%08x\n", isr);
1413 #endif
1414
1415 if (ISR_RXIDLE & isr) {
1416 dev->rx_info.idle = 1;
1417 Dprintk("oh dear, we are idle\n");
1418 ns83820_rx_kick(ndev);
1419 }
1420
1421 if ((ISR_RXDESC | ISR_RXOK) & isr) {
1422 prefetch(dev->rx_info.next_rx_desc);
1423
1424 spin_lock_irqsave(&dev->misc_lock, flags);
1425 dev->IMR_cache &= ~(ISR_RXDESC | ISR_RXOK);
1426 writel(dev->IMR_cache, dev->base + IMR);
1427 spin_unlock_irqrestore(&dev->misc_lock, flags);
1428
1429 tasklet_schedule(&dev->rx_tasklet);
1430
1431
1432 }
1433
1434 if ((ISR_RXIDLE | ISR_RXORN | ISR_RXDESC | ISR_RXOK | ISR_RXERR) & isr)
1435 ns83820_rx_kick(ndev);
1436
1437 if (unlikely(ISR_RXSOVR & isr)) {
1438
1439 ndev->stats.rx_fifo_errors++;
1440 }
1441
1442 if (unlikely(ISR_RXORN & isr)) {
1443
1444 ndev->stats.rx_fifo_errors++;
1445 }
1446
1447 if ((ISR_RXRCMP & isr) && dev->rx_info.up)
1448 writel(CR_RXE, dev->base + CR);
1449
1450 if (ISR_TXIDLE & isr) {
1451 u32 txdp;
1452 txdp = readl(dev->base + TXDP);
1453 dprintk("txdp: %08x\n", txdp);
1454 txdp -= dev->tx_phy_descs;
1455 dev->tx_idx = txdp / (DESC_SIZE * 4);
1456 if (dev->tx_idx >= NR_TX_DESC) {
1457 printk(KERN_ALERT "%s: BUG -- txdp out of range\n", ndev->name);
1458 dev->tx_idx = 0;
1459 }
1460
1461
1462
1463
1464
1465 if (dev->tx_idx != dev->tx_free_idx)
1466 kick_tx(dev);
1467 }
1468
1469
1470
1471
1472 if ((ISR_TXDESC | ISR_TXIDLE | ISR_TXOK | ISR_TXERR) & isr) {
1473 spin_lock_irqsave(&dev->tx_lock, flags);
1474 do_tx_done(ndev);
1475 spin_unlock_irqrestore(&dev->tx_lock, flags);
1476
1477
1478
1479 if ((dev->tx_done_idx == dev->tx_free_idx) &&
1480 (dev->IMR_cache & ISR_TXOK)) {
1481 spin_lock_irqsave(&dev->misc_lock, flags);
1482 dev->IMR_cache &= ~ISR_TXOK;
1483 writel(dev->IMR_cache, dev->base + IMR);
1484 spin_unlock_irqrestore(&dev->misc_lock, flags);
1485 }
1486 }
1487
1488
1489
1490
1491
1492
1493
1494 if ((ISR_TXIDLE & isr) && (dev->tx_done_idx != dev->tx_free_idx)) {
1495 spin_lock_irqsave(&dev->misc_lock, flags);
1496 dev->IMR_cache |= ISR_TXOK;
1497 writel(dev->IMR_cache, dev->base + IMR);
1498 spin_unlock_irqrestore(&dev->misc_lock, flags);
1499 }
1500
1501
1502 if (unlikely(ISR_MIB & isr))
1503 ns83820_mib_isr(dev);
1504
1505
1506 if (unlikely(ISR_PHY & isr))
1507 phy_intr(ndev);
1508
1509 #if 0
1510 if (dev->ihr)
1511 writel(dev->ihr, dev->base + IHR);
1512 #endif
1513 }
1514
1515 static void ns83820_do_reset(struct ns83820 *dev, u32 which)
1516 {
1517 Dprintk("resetting chip...\n");
1518 writel(which, dev->base + CR);
1519 do {
1520 schedule();
1521 } while (readl(dev->base + CR) & which);
1522 Dprintk("okay!\n");
1523 }
1524
1525 static int ns83820_stop(struct net_device *ndev)
1526 {
1527 struct ns83820 *dev = PRIV(ndev);
1528
1529
1530 del_timer_sync(&dev->tx_watchdog);
1531
1532 ns83820_disable_interrupts(dev);
1533
1534 dev->rx_info.up = 0;
1535 synchronize_irq(dev->pci_dev->irq);
1536
1537 ns83820_do_reset(dev, CR_RST);
1538
1539 synchronize_irq(dev->pci_dev->irq);
1540
1541 spin_lock_irq(&dev->misc_lock);
1542 dev->IMR_cache &= ~(ISR_TXURN | ISR_TXIDLE | ISR_TXERR | ISR_TXDESC | ISR_TXOK);
1543 spin_unlock_irq(&dev->misc_lock);
1544
1545 ns83820_cleanup_rx(dev);
1546 ns83820_cleanup_tx(dev);
1547
1548 return 0;
1549 }
1550
1551 static void ns83820_tx_timeout(struct net_device *ndev, unsigned int txqueue)
1552 {
1553 struct ns83820 *dev = PRIV(ndev);
1554 u32 tx_done_idx;
1555 __le32 *desc;
1556 unsigned long flags;
1557
1558 spin_lock_irqsave(&dev->tx_lock, flags);
1559
1560 tx_done_idx = dev->tx_done_idx;
1561 desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
1562
1563 printk(KERN_INFO "%s: tx_timeout: tx_done_idx=%d free_idx=%d cmdsts=%08x\n",
1564 ndev->name,
1565 tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS]));
1566
1567 #if defined(DEBUG)
1568 {
1569 u32 isr;
1570 isr = readl(dev->base + ISR);
1571 printk("irq: %08x imr: %08x\n", isr, dev->IMR_cache);
1572 ns83820_do_isr(ndev, isr);
1573 }
1574 #endif
1575
1576 do_tx_done(ndev);
1577
1578 tx_done_idx = dev->tx_done_idx;
1579 desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
1580
1581 printk(KERN_INFO "%s: after: tx_done_idx=%d free_idx=%d cmdsts=%08x\n",
1582 ndev->name,
1583 tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS]));
1584
1585 spin_unlock_irqrestore(&dev->tx_lock, flags);
1586 }
1587
1588 static void ns83820_tx_watch(struct timer_list *t)
1589 {
1590 struct ns83820 *dev = from_timer(dev, t, tx_watchdog);
1591 struct net_device *ndev = dev->ndev;
1592
1593 #if defined(DEBUG)
1594 printk("ns83820_tx_watch: %u %u %d\n",
1595 dev->tx_done_idx, dev->tx_free_idx, atomic_read(&dev->nr_tx_skbs)
1596 );
1597 #endif
1598
1599 if (time_after(jiffies, dev_trans_start(ndev) + 1*HZ) &&
1600 dev->tx_done_idx != dev->tx_free_idx) {
1601 printk(KERN_DEBUG "%s: ns83820_tx_watch: %u %u %d\n",
1602 ndev->name,
1603 dev->tx_done_idx, dev->tx_free_idx,
1604 atomic_read(&dev->nr_tx_skbs));
1605 ns83820_tx_timeout(ndev, UINT_MAX);
1606 }
1607
1608 mod_timer(&dev->tx_watchdog, jiffies + 2*HZ);
1609 }
1610
1611 static int ns83820_open(struct net_device *ndev)
1612 {
1613 struct ns83820 *dev = PRIV(ndev);
1614 unsigned i;
1615 u32 desc;
1616 int ret;
1617
1618 dprintk("ns83820_open\n");
1619
1620 writel(0, dev->base + PQCR);
1621
1622 ret = ns83820_setup_rx(ndev);
1623 if (ret)
1624 goto failed;
1625
1626 memset(dev->tx_descs, 0, 4 * NR_TX_DESC * DESC_SIZE);
1627 for (i=0; i<NR_TX_DESC; i++) {
1628 dev->tx_descs[(i * DESC_SIZE) + DESC_LINK]
1629 = cpu_to_le32(
1630 dev->tx_phy_descs
1631 + ((i+1) % NR_TX_DESC) * DESC_SIZE * 4);
1632 }
1633
1634 dev->tx_idx = 0;
1635 dev->tx_done_idx = 0;
1636 desc = dev->tx_phy_descs;
1637 writel(0, dev->base + TXDP_HI);
1638 writel(desc, dev->base + TXDP);
1639
1640 timer_setup(&dev->tx_watchdog, ns83820_tx_watch, 0);
1641 mod_timer(&dev->tx_watchdog, jiffies + 2*HZ);
1642
1643 netif_start_queue(ndev);
1644
1645 return 0;
1646
1647 failed:
1648 ns83820_stop(ndev);
1649 return ret;
1650 }
1651
1652 static void ns83820_getmac(struct ns83820 *dev, struct net_device *ndev)
1653 {
1654 u8 mac[ETH_ALEN];
1655 unsigned i;
1656
1657 for (i=0; i<3; i++) {
1658 u32 data;
1659
1660
1661
1662
1663 writel(i*2, dev->base + RFCR);
1664 data = readl(dev->base + RFDR);
1665
1666 mac[i * 2] = data;
1667 mac[i * 2 + 1] = data >> 8;
1668 }
1669 eth_hw_addr_set(ndev, mac);
1670 }
1671
1672 static void ns83820_set_multicast(struct net_device *ndev)
1673 {
1674 struct ns83820 *dev = PRIV(ndev);
1675 u8 __iomem *rfcr = dev->base + RFCR;
1676 u32 and_mask = 0xffffffff;
1677 u32 or_mask = 0;
1678 u32 val;
1679
1680 if (ndev->flags & IFF_PROMISC)
1681 or_mask |= RFCR_AAU | RFCR_AAM;
1682 else
1683 and_mask &= ~(RFCR_AAU | RFCR_AAM);
1684
1685 if (ndev->flags & IFF_ALLMULTI || netdev_mc_count(ndev))
1686 or_mask |= RFCR_AAM;
1687 else
1688 and_mask &= ~RFCR_AAM;
1689
1690 spin_lock_irq(&dev->misc_lock);
1691 val = (readl(rfcr) & and_mask) | or_mask;
1692
1693 writel(val & ~RFCR_RFEN, rfcr);
1694 writel(val, rfcr);
1695 spin_unlock_irq(&dev->misc_lock);
1696 }
1697
1698 static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enable, u32 done, u32 fail)
1699 {
1700 struct ns83820 *dev = PRIV(ndev);
1701 int timed_out = 0;
1702 unsigned long start;
1703 u32 status;
1704 int loops = 0;
1705
1706 dprintk("%s: start %s\n", ndev->name, name);
1707
1708 start = jiffies;
1709
1710 writel(enable, dev->base + PTSCR);
1711 for (;;) {
1712 loops++;
1713 status = readl(dev->base + PTSCR);
1714 if (!(status & enable))
1715 break;
1716 if (status & done)
1717 break;
1718 if (status & fail)
1719 break;
1720 if (time_after_eq(jiffies, start + HZ)) {
1721 timed_out = 1;
1722 break;
1723 }
1724 schedule_timeout_uninterruptible(1);
1725 }
1726
1727 if (status & fail)
1728 printk(KERN_INFO "%s: %s failed! (0x%08x & 0x%08x)\n",
1729 ndev->name, name, status, fail);
1730 else if (timed_out)
1731 printk(KERN_INFO "%s: run_bist %s timed out! (%08x)\n",
1732 ndev->name, name, status);
1733
1734 dprintk("%s: done %s in %d loops\n", ndev->name, name, loops);
1735 }
1736
1737 #ifdef PHY_CODE_IS_FINISHED
1738 static void ns83820_mii_write_bit(struct ns83820 *dev, int bit)
1739 {
1740
1741 dev->MEAR_cache &= ~MEAR_MDC;
1742 writel(dev->MEAR_cache, dev->base + MEAR);
1743 readl(dev->base + MEAR);
1744
1745
1746 dev->MEAR_cache |= MEAR_MDDIR;
1747 if (bit)
1748 dev->MEAR_cache |= MEAR_MDIO;
1749 else
1750 dev->MEAR_cache &= ~MEAR_MDIO;
1751
1752
1753 writel(dev->MEAR_cache, dev->base + MEAR);
1754 readl(dev->base + MEAR);
1755
1756
1757 udelay(1);
1758
1759
1760 dev->MEAR_cache |= MEAR_MDC;
1761 writel(dev->MEAR_cache, dev->base + MEAR);
1762 readl(dev->base + MEAR);
1763
1764
1765 udelay(1);
1766 }
1767
1768 static int ns83820_mii_read_bit(struct ns83820 *dev)
1769 {
1770 int bit;
1771
1772
1773 dev->MEAR_cache &= ~MEAR_MDC;
1774 dev->MEAR_cache &= ~MEAR_MDDIR;
1775 writel(dev->MEAR_cache, dev->base + MEAR);
1776 readl(dev->base + MEAR);
1777
1778
1779 udelay(1);
1780
1781
1782 bit = (readl(dev->base + MEAR) & MEAR_MDIO) ? 1 : 0;
1783 dev->MEAR_cache |= MEAR_MDC;
1784 writel(dev->MEAR_cache, dev->base + MEAR);
1785
1786
1787 udelay(1);
1788
1789 return bit;
1790 }
1791
1792 static unsigned ns83820_mii_read_reg(struct ns83820 *dev, unsigned phy, unsigned reg)
1793 {
1794 unsigned data = 0;
1795 int i;
1796
1797
1798 for (i=0; i<64; i++)
1799 ns83820_mii_read_bit(dev);
1800
1801 ns83820_mii_write_bit(dev, 0);
1802 ns83820_mii_write_bit(dev, 1);
1803 ns83820_mii_write_bit(dev, 1);
1804 ns83820_mii_write_bit(dev, 0);
1805
1806
1807 for (i=0; i<5; i++)
1808 ns83820_mii_write_bit(dev, phy & (0x10 >> i));
1809
1810
1811 for (i=0; i<5; i++)
1812 ns83820_mii_write_bit(dev, reg & (0x10 >> i));
1813
1814 ns83820_mii_read_bit(dev);
1815 ns83820_mii_read_bit(dev);
1816
1817
1818 for (i=0; i<16; i++) {
1819 data <<= 1;
1820 data |= ns83820_mii_read_bit(dev);
1821 }
1822
1823 return data;
1824 }
1825
1826 static unsigned ns83820_mii_write_reg(struct ns83820 *dev, unsigned phy, unsigned reg, unsigned data)
1827 {
1828 int i;
1829
1830
1831 for (i=0; i<64; i++)
1832 ns83820_mii_read_bit(dev);
1833
1834 ns83820_mii_write_bit(dev, 0);
1835 ns83820_mii_write_bit(dev, 1);
1836 ns83820_mii_write_bit(dev, 0);
1837 ns83820_mii_write_bit(dev, 1);
1838
1839
1840 for (i=0; i<5; i++)
1841 ns83820_mii_write_bit(dev, phy & (0x10 >> i));
1842
1843
1844 for (i=0; i<5; i++)
1845 ns83820_mii_write_bit(dev, reg & (0x10 >> i));
1846
1847 ns83820_mii_read_bit(dev);
1848 ns83820_mii_read_bit(dev);
1849
1850
1851 for (i=0; i<16; i++)
1852 ns83820_mii_write_bit(dev, (data >> (15 - i)) & 1);
1853
1854 return data;
1855 }
1856
1857 static void ns83820_probe_phy(struct net_device *ndev)
1858 {
1859 struct ns83820 *dev = PRIV(ndev);
1860 int j;
1861 unsigned a, b;
1862
1863 for (j = 0; j < 0x16; j += 4) {
1864 dprintk("%s: [0x%02x] %04x %04x %04x %04x\n",
1865 ndev->name, j,
1866 ns83820_mii_read_reg(dev, 1, 0 + j),
1867 ns83820_mii_read_reg(dev, 1, 1 + j),
1868 ns83820_mii_read_reg(dev, 1, 2 + j),
1869 ns83820_mii_read_reg(dev, 1, 3 + j)
1870 );
1871 }
1872
1873
1874 ns83820_mii_write_reg(dev, 1, 0x16, 0x000d);
1875 ns83820_mii_write_reg(dev, 1, 0x1e, 0x810e);
1876 a = ns83820_mii_read_reg(dev, 1, 0x1d);
1877
1878 ns83820_mii_write_reg(dev, 1, 0x16, 0x000d);
1879 ns83820_mii_write_reg(dev, 1, 0x1e, 0x810e);
1880 b = ns83820_mii_read_reg(dev, 1, 0x1d);
1881 dprintk("version: 0x%04x 0x%04x\n", a, b);
1882 }
1883 #endif
1884
1885 static const struct net_device_ops netdev_ops = {
1886 .ndo_open = ns83820_open,
1887 .ndo_stop = ns83820_stop,
1888 .ndo_start_xmit = ns83820_hard_start_xmit,
1889 .ndo_get_stats = ns83820_get_stats,
1890 .ndo_set_rx_mode = ns83820_set_multicast,
1891 .ndo_validate_addr = eth_validate_addr,
1892 .ndo_set_mac_address = eth_mac_addr,
1893 .ndo_tx_timeout = ns83820_tx_timeout,
1894 };
1895
1896 static int ns83820_init_one(struct pci_dev *pci_dev,
1897 const struct pci_device_id *id)
1898 {
1899 struct net_device *ndev;
1900 struct ns83820 *dev;
1901 long addr;
1902 int err;
1903 int using_dac = 0;
1904
1905
1906 if (sizeof(dma_addr_t) == 8 &&
1907 !dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(64))) {
1908 using_dac = 1;
1909 } else if (!dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32))) {
1910 using_dac = 0;
1911 } else {
1912 dev_warn(&pci_dev->dev, "dma_set_mask failed!\n");
1913 return -ENODEV;
1914 }
1915
1916 ndev = alloc_etherdev(sizeof(struct ns83820));
1917 err = -ENOMEM;
1918 if (!ndev)
1919 goto out;
1920
1921 dev = PRIV(ndev);
1922 dev->ndev = ndev;
1923
1924 spin_lock_init(&dev->rx_info.lock);
1925 spin_lock_init(&dev->tx_lock);
1926 spin_lock_init(&dev->misc_lock);
1927 dev->pci_dev = pci_dev;
1928
1929 SET_NETDEV_DEV(ndev, &pci_dev->dev);
1930
1931 INIT_WORK(&dev->tq_refill, queue_refill);
1932 tasklet_setup(&dev->rx_tasklet, rx_action);
1933
1934 err = pci_enable_device(pci_dev);
1935 if (err) {
1936 dev_info(&pci_dev->dev, "pci_enable_dev failed: %d\n", err);
1937 goto out_free;
1938 }
1939
1940 pci_set_master(pci_dev);
1941 addr = pci_resource_start(pci_dev, 1);
1942 dev->base = ioremap(addr, PAGE_SIZE);
1943 dev->tx_descs = dma_alloc_coherent(&pci_dev->dev,
1944 4 * DESC_SIZE * NR_TX_DESC,
1945 &dev->tx_phy_descs, GFP_KERNEL);
1946 dev->rx_info.descs = dma_alloc_coherent(&pci_dev->dev,
1947 4 * DESC_SIZE * NR_RX_DESC,
1948 &dev->rx_info.phy_descs, GFP_KERNEL);
1949 err = -ENOMEM;
1950 if (!dev->base || !dev->tx_descs || !dev->rx_info.descs)
1951 goto out_disable;
1952
1953 dprintk("%p: %08lx %p: %08lx\n",
1954 dev->tx_descs, (long)dev->tx_phy_descs,
1955 dev->rx_info.descs, (long)dev->rx_info.phy_descs);
1956
1957 ns83820_disable_interrupts(dev);
1958
1959 dev->IMR_cache = 0;
1960
1961 err = request_irq(pci_dev->irq, ns83820_irq, IRQF_SHARED,
1962 DRV_NAME, ndev);
1963 if (err) {
1964 dev_info(&pci_dev->dev, "unable to register irq %d, err %d\n",
1965 pci_dev->irq, err);
1966 goto out_disable;
1967 }
1968
1969
1970
1971
1972
1973
1974
1975
1976 rtnl_lock();
1977 err = dev_alloc_name(ndev, ndev->name);
1978 if (err < 0) {
1979 dev_info(&pci_dev->dev, "unable to get netdev name: %d\n", err);
1980 goto out_free_irq;
1981 }
1982
1983 printk("%s: ns83820.c: 0x22c: %08x, subsystem: %04x:%04x\n",
1984 ndev->name, le32_to_cpu(readl(dev->base + 0x22c)),
1985 pci_dev->subsystem_vendor, pci_dev->subsystem_device);
1986
1987 ndev->netdev_ops = &netdev_ops;
1988 ndev->ethtool_ops = &ops;
1989 ndev->watchdog_timeo = 5 * HZ;
1990 pci_set_drvdata(pci_dev, ndev);
1991
1992 ns83820_do_reset(dev, CR_RST);
1993
1994
1995 writel(PTSCR_RBIST_RST, dev->base + PTSCR);
1996 ns83820_run_bist(ndev, "sram bist", PTSCR_RBIST_EN,
1997 PTSCR_RBIST_DONE, PTSCR_RBIST_FAIL);
1998 ns83820_run_bist(ndev, "eeprom bist", PTSCR_EEBIST_EN, 0,
1999 PTSCR_EEBIST_FAIL);
2000 ns83820_run_bist(ndev, "eeprom load", PTSCR_EELOAD_EN, 0, 0);
2001
2002
2003 dev->CFG_cache = readl(dev->base + CFG);
2004
2005 if ((dev->CFG_cache & CFG_PCI64_DET)) {
2006 printk(KERN_INFO "%s: detected 64 bit PCI data bus.\n",
2007 ndev->name);
2008
2009 if (!(dev->CFG_cache & CFG_DATA64_EN))
2010 printk(KERN_INFO "%s: EEPROM did not enable 64 bit bus. Disabled.\n",
2011 ndev->name);
2012 } else
2013 dev->CFG_cache &= ~(CFG_DATA64_EN);
2014
2015 dev->CFG_cache &= (CFG_TBI_EN | CFG_MRM_DIS | CFG_MWI_DIS |
2016 CFG_T64ADDR | CFG_DATA64_EN | CFG_EXT_125 |
2017 CFG_M64ADDR);
2018 dev->CFG_cache |= CFG_PINT_DUPSTS | CFG_PINT_LNKSTS | CFG_PINT_SPDSTS |
2019 CFG_EXTSTS_EN | CFG_EXD | CFG_PESEL;
2020 dev->CFG_cache |= CFG_REQALG;
2021 dev->CFG_cache |= CFG_POW;
2022 dev->CFG_cache |= CFG_TMRTEST;
2023
2024
2025
2026
2027 if (sizeof(dma_addr_t) == 8)
2028 dev->CFG_cache |= CFG_M64ADDR;
2029 if (using_dac)
2030 dev->CFG_cache |= CFG_T64ADDR;
2031
2032
2033 dev->CFG_cache &= ~CFG_BEM;
2034
2035
2036 if (dev->CFG_cache & CFG_TBI_EN) {
2037 printk(KERN_INFO "%s: enabling optical transceiver\n",
2038 ndev->name);
2039 writel(readl(dev->base + GPIOR) | 0x3e8, dev->base + GPIOR);
2040
2041
2042 writel(readl(dev->base + TANAR)
2043 | TANAR_HALF_DUP | TANAR_FULL_DUP,
2044 dev->base + TANAR);
2045
2046
2047 writel(TBICR_MR_AN_ENABLE | TBICR_MR_RESTART_AN,
2048 dev->base + TBICR);
2049 writel(TBICR_MR_AN_ENABLE, dev->base + TBICR);
2050 dev->linkstate = LINK_AUTONEGOTIATE;
2051
2052 dev->CFG_cache |= CFG_MODE_1000;
2053 }
2054
2055 writel(dev->CFG_cache, dev->base + CFG);
2056 dprintk("CFG: %08x\n", dev->CFG_cache);
2057
2058 if (reset_phy) {
2059 printk(KERN_INFO "%s: resetting phy\n", ndev->name);
2060 writel(dev->CFG_cache | CFG_PHY_RST, dev->base + CFG);
2061 msleep(10);
2062 writel(dev->CFG_cache, dev->base + CFG);
2063 }
2064
2065 #if 0
2066
2067
2068 if (readl(dev->base + SRR))
2069 writel(readl(dev->base+0x20c) | 0xfe00, dev->base + 0x20c);
2070 #endif
2071
2072
2073
2074
2075
2076
2077
2078
2079 writel(TXCFG_CSI | TXCFG_HBI | TXCFG_ATP | TXCFG_MXDMA512
2080 | ((1600 / 32) * 0x100),
2081 dev->base + TXCFG);
2082
2083
2084 writel(0x000, dev->base + IHR);
2085 writel(0x100, dev->base + IHR);
2086 writel(0x000, dev->base + IHR);
2087
2088
2089
2090
2091
2092
2093
2094 writel(RXCFG_AEP | RXCFG_ARP | RXCFG_AIRL | RXCFG_RX_FD
2095 | RXCFG_STRIPCRC
2096
2097 | (RXCFG_MXDMA512) | 0, dev->base + RXCFG);
2098
2099
2100 writel(0, dev->base + PQCR);
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115 #ifdef NS83820_VLAN_ACCEL_SUPPORT
2116 #define VRCR_INIT_VALUE (VRCR_IPEN|VRCR_VTDEN|VRCR_VTREN)
2117 #else
2118 #define VRCR_INIT_VALUE (VRCR_IPEN|VRCR_VTDEN)
2119 #endif
2120 writel(VRCR_INIT_VALUE, dev->base + VRCR);
2121
2122
2123
2124
2125
2126 #ifdef NS83820_VLAN_ACCEL_SUPPORT
2127 #define VTCR_INIT_VALUE (VTCR_PPCHK|VTCR_VPPTI)
2128 #else
2129 #define VTCR_INIT_VALUE VTCR_PPCHK
2130 #endif
2131 writel(VTCR_INIT_VALUE, dev->base + VTCR);
2132
2133
2134
2135 writel((PCR_PS_MCAST | PCR_PS_DA | PCR_PSEN | PCR_FFLO_4K |
2136 PCR_FFHI_8K | PCR_STLO_4 | PCR_STHI_8 | PCR_PAUSE_CNT),
2137 dev->base + PCR);
2138
2139
2140 writel(0, dev->base + WCSR);
2141
2142 ns83820_getmac(dev, ndev);
2143
2144
2145 ndev->features |= NETIF_F_SG;
2146 ndev->features |= NETIF_F_IP_CSUM;
2147
2148 ndev->min_mtu = 0;
2149
2150 #ifdef NS83820_VLAN_ACCEL_SUPPORT
2151
2152 ndev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
2153 #endif
2154
2155 if (using_dac) {
2156 printk(KERN_INFO "%s: using 64 bit addressing.\n",
2157 ndev->name);
2158 ndev->features |= NETIF_F_HIGHDMA;
2159 }
2160
2161 printk(KERN_INFO "%s: ns83820 v" VERSION ": DP83820 v%u.%u: %pM io=0x%08lx irq=%d f=%s\n",
2162 ndev->name,
2163 (unsigned)readl(dev->base + SRR) >> 8,
2164 (unsigned)readl(dev->base + SRR) & 0xff,
2165 ndev->dev_addr, addr, pci_dev->irq,
2166 (ndev->features & NETIF_F_HIGHDMA) ? "h,sg" : "sg"
2167 );
2168
2169 #ifdef PHY_CODE_IS_FINISHED
2170 ns83820_probe_phy(ndev);
2171 #endif
2172
2173 err = register_netdevice(ndev);
2174 if (err) {
2175 printk(KERN_INFO "ns83820: unable to register netdev: %d\n", err);
2176 goto out_cleanup;
2177 }
2178 rtnl_unlock();
2179
2180 return 0;
2181
2182 out_cleanup:
2183 ns83820_disable_interrupts(dev);
2184 out_free_irq:
2185 rtnl_unlock();
2186 free_irq(pci_dev->irq, ndev);
2187 out_disable:
2188 if (dev->base)
2189 iounmap(dev->base);
2190 dma_free_coherent(&pci_dev->dev, 4 * DESC_SIZE * NR_TX_DESC,
2191 dev->tx_descs, dev->tx_phy_descs);
2192 dma_free_coherent(&pci_dev->dev, 4 * DESC_SIZE * NR_RX_DESC,
2193 dev->rx_info.descs, dev->rx_info.phy_descs);
2194 pci_disable_device(pci_dev);
2195 out_free:
2196 free_netdev(ndev);
2197 out:
2198 return err;
2199 }
2200
2201 static void ns83820_remove_one(struct pci_dev *pci_dev)
2202 {
2203 struct net_device *ndev = pci_get_drvdata(pci_dev);
2204 struct ns83820 *dev = PRIV(ndev);
2205
2206 if (!ndev)
2207 return;
2208
2209 ns83820_disable_interrupts(dev);
2210
2211 unregister_netdev(ndev);
2212 free_irq(dev->pci_dev->irq, ndev);
2213 iounmap(dev->base);
2214 dma_free_coherent(&dev->pci_dev->dev, 4 * DESC_SIZE * NR_TX_DESC,
2215 dev->tx_descs, dev->tx_phy_descs);
2216 dma_free_coherent(&dev->pci_dev->dev, 4 * DESC_SIZE * NR_RX_DESC,
2217 dev->rx_info.descs, dev->rx_info.phy_descs);
2218 pci_disable_device(dev->pci_dev);
2219 free_netdev(ndev);
2220 }
2221
2222 static const struct pci_device_id ns83820_pci_tbl[] = {
2223 { 0x100b, 0x0022, PCI_ANY_ID, PCI_ANY_ID, 0, .driver_data = 0, },
2224 { 0, },
2225 };
2226
2227 static struct pci_driver driver = {
2228 .name = "ns83820",
2229 .id_table = ns83820_pci_tbl,
2230 .probe = ns83820_init_one,
2231 .remove = ns83820_remove_one,
2232 #if 0
2233 .suspend = ,
2234 .resume = ,
2235 #endif
2236 };
2237
2238
2239 static int __init ns83820_init(void)
2240 {
2241 printk(KERN_INFO "ns83820.c: National Semiconductor DP83820 10/100/1000 driver.\n");
2242 return pci_register_driver(&driver);
2243 }
2244
2245 static void __exit ns83820_exit(void)
2246 {
2247 pci_unregister_driver(&driver);
2248 }
2249
2250 MODULE_AUTHOR("Benjamin LaHaise <bcrl@kvack.org>");
2251 MODULE_DESCRIPTION("National Semiconductor DP83820 10/100/1000 driver");
2252 MODULE_LICENSE("GPL");
2253
2254 MODULE_DEVICE_TABLE(pci, ns83820_pci_tbl);
2255
2256 module_param(lnksts, int, 0);
2257 MODULE_PARM_DESC(lnksts, "Polarity of LNKSTS bit");
2258
2259 module_param(ihr, int, 0);
2260 MODULE_PARM_DESC(ihr, "Time in 100 us increments to delay interrupts (range 0-127)");
2261
2262 module_param(reset_phy, int, 0);
2263 MODULE_PARM_DESC(reset_phy, "Set to 1 to reset the PHY on startup");
2264
2265 module_init(ns83820_init);
2266 module_exit(ns83820_exit);