0001
0002
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
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0115
0116 #define DRV_NAME "nmclan_cs"
0117
0118
0119
0120
0121
0122 #define MULTI_TX 0
0123 #define RESET_ON_TIMEOUT 1
0124 #define TX_INTERRUPTABLE 1
0125 #define RESET_XILINX 0
0126
0127
0128
0129
0130
0131 #include <linux/module.h>
0132 #include <linux/kernel.h>
0133 #include <linux/ptrace.h>
0134 #include <linux/slab.h>
0135 #include <linux/string.h>
0136 #include <linux/timer.h>
0137 #include <linux/interrupt.h>
0138 #include <linux/in.h>
0139 #include <linux/delay.h>
0140 #include <linux/ethtool.h>
0141 #include <linux/netdevice.h>
0142 #include <linux/etherdevice.h>
0143 #include <linux/skbuff.h>
0144 #include <linux/if_arp.h>
0145 #include <linux/ioport.h>
0146 #include <linux/bitops.h>
0147
0148 #include <pcmcia/cisreg.h>
0149 #include <pcmcia/cistpl.h>
0150 #include <pcmcia/ds.h>
0151
0152 #include <linux/uaccess.h>
0153 #include <asm/io.h>
0154
0155
0156
0157
0158
0159 #define MACE_LADRF_LEN 8
0160
0161
0162
0163 #define MACE_MAX_IR_ITERATIONS 10
0164 #define MACE_MAX_RX_ITERATIONS 12
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180 #define AM2150_MAX_TX_FRAMES 4
0181 #define AM2150_MAX_RX_FRAMES 12
0182
0183
0184 #define AM2150_RCV 0x00
0185 #define AM2150_XMT 0x04
0186 #define AM2150_XMT_SKIP 0x09
0187 #define AM2150_RCV_NEXT 0x0A
0188 #define AM2150_RCV_FRAME_COUNT 0x0B
0189 #define AM2150_MACE_BANK 0x0C
0190 #define AM2150_MACE_BASE 0x10
0191
0192
0193 #define MACE_RCVFIFO 0
0194 #define MACE_XMTFIFO 1
0195 #define MACE_XMTFC 2
0196 #define MACE_XMTFS 3
0197 #define MACE_XMTRC 4
0198 #define MACE_RCVFC 5
0199 #define MACE_RCVFS 6
0200 #define MACE_FIFOFC 7
0201 #define MACE_IR 8
0202 #define MACE_IMR 9
0203 #define MACE_PR 10
0204 #define MACE_BIUCC 11
0205 #define MACE_FIFOCC 12
0206 #define MACE_MACCC 13
0207 #define MACE_PLSCC 14
0208 #define MACE_PHYCC 15
0209 #define MACE_CHIPIDL 16
0210 #define MACE_CHIPIDH 17
0211 #define MACE_IAC 18
0212
0213 #define MACE_LADRF 20
0214 #define MACE_PADR 21
0215
0216
0217 #define MACE_MPC 24
0218
0219 #define MACE_RNTPC 26
0220 #define MACE_RCVCC 27
0221
0222 #define MACE_UTR 29
0223 #define MACE_RTR1 30
0224 #define MACE_RTR2 31
0225
0226
0227 #define MACE_XMTRC_EXDEF 0x80
0228 #define MACE_XMTRC_XMTRC 0x0F
0229
0230 #define MACE_XMTFS_XMTSV 0x80
0231 #define MACE_XMTFS_UFLO 0x40
0232 #define MACE_XMTFS_LCOL 0x20
0233 #define MACE_XMTFS_MORE 0x10
0234 #define MACE_XMTFS_ONE 0x08
0235 #define MACE_XMTFS_DEFER 0x04
0236 #define MACE_XMTFS_LCAR 0x02
0237 #define MACE_XMTFS_RTRY 0x01
0238
0239 #define MACE_RCVFS_RCVSTS 0xF000
0240 #define MACE_RCVFS_OFLO 0x8000
0241 #define MACE_RCVFS_CLSN 0x4000
0242 #define MACE_RCVFS_FRAM 0x2000
0243 #define MACE_RCVFS_FCS 0x1000
0244
0245 #define MACE_FIFOFC_RCVFC 0xF0
0246 #define MACE_FIFOFC_XMTFC 0x0F
0247
0248 #define MACE_IR_JAB 0x80
0249 #define MACE_IR_BABL 0x40
0250 #define MACE_IR_CERR 0x20
0251 #define MACE_IR_RCVCCO 0x10
0252 #define MACE_IR_RNTPCO 0x08
0253 #define MACE_IR_MPCO 0x04
0254 #define MACE_IR_RCVINT 0x02
0255 #define MACE_IR_XMTINT 0x01
0256
0257 #define MACE_MACCC_PROM 0x80
0258 #define MACE_MACCC_DXMT2PD 0x40
0259 #define MACE_MACCC_EMBA 0x20
0260 #define MACE_MACCC_RESERVED 0x10
0261 #define MACE_MACCC_DRCVPA 0x08
0262 #define MACE_MACCC_DRCVBC 0x04
0263 #define MACE_MACCC_ENXMT 0x02
0264 #define MACE_MACCC_ENRCV 0x01
0265
0266 #define MACE_PHYCC_LNKFL 0x80
0267 #define MACE_PHYCC_DLNKTST 0x40
0268 #define MACE_PHYCC_REVPOL 0x20
0269 #define MACE_PHYCC_DAPC 0x10
0270 #define MACE_PHYCC_LRT 0x08
0271 #define MACE_PHYCC_ASEL 0x04
0272 #define MACE_PHYCC_RWAKE 0x02
0273 #define MACE_PHYCC_AWAKE 0x01
0274
0275 #define MACE_IAC_ADDRCHG 0x80
0276 #define MACE_IAC_PHYADDR 0x04
0277 #define MACE_IAC_LOGADDR 0x02
0278
0279 #define MACE_UTR_RTRE 0x80
0280 #define MACE_UTR_RTRD 0x40
0281 #define MACE_UTR_RPA 0x20
0282 #define MACE_UTR_FCOLL 0x10
0283 #define MACE_UTR_RCVFCSE 0x08
0284 #define MACE_UTR_LOOP_INCL_MENDEC 0x06
0285 #define MACE_UTR_LOOP_NO_MENDEC 0x04
0286 #define MACE_UTR_LOOP_EXTERNAL 0x02
0287 #define MACE_UTR_LOOP_NONE 0x00
0288 #define MACE_UTR_RESERVED 0x01
0289
0290
0291 #define MACEBANK(win_num) outb((win_num), ioaddr + AM2150_MACE_BANK)
0292
0293 #define MACE_IMR_DEFAULT \
0294 (0xFF - \
0295 ( \
0296 MACE_IR_CERR | \
0297 MACE_IR_RCVCCO | \
0298 MACE_IR_RNTPCO | \
0299 MACE_IR_MPCO | \
0300 MACE_IR_RCVINT | \
0301 MACE_IR_XMTINT \
0302 ) \
0303 )
0304 #undef MACE_IMR_DEFAULT
0305 #define MACE_IMR_DEFAULT 0x00
0306
0307 #define TX_TIMEOUT ((400*HZ)/1000)
0308
0309
0310
0311
0312
0313 typedef struct _mace_statistics {
0314
0315 int xmtsv;
0316 int uflo;
0317 int lcol;
0318 int more;
0319 int one;
0320 int defer;
0321 int lcar;
0322 int rtry;
0323
0324
0325 int exdef;
0326 int xmtrc;
0327
0328
0329 int oflo;
0330 int clsn;
0331 int fram;
0332 int fcs;
0333
0334
0335 int rfs_rntpc;
0336
0337
0338 int rfs_rcvcc;
0339
0340
0341 int jab;
0342 int babl;
0343 int cerr;
0344 int rcvcco;
0345 int rntpco;
0346 int mpco;
0347
0348
0349 int mpc;
0350
0351
0352 int rntpc;
0353
0354
0355 int rcvcc;
0356 } mace_statistics;
0357
0358 typedef struct _mace_private {
0359 struct pcmcia_device *p_dev;
0360 mace_statistics mace_stats;
0361
0362
0363 int multicast_ladrf[MACE_LADRF_LEN];
0364 int multicast_num_addrs;
0365
0366 char tx_free_frames;
0367 char tx_irq_disabled;
0368
0369 spinlock_t bank_lock;
0370 } mace_private;
0371
0372
0373
0374
0375
0376 static const char *if_names[]={
0377 "Auto", "10baseT", "BNC",
0378 };
0379
0380
0381
0382
0383
0384
0385
0386 MODULE_DESCRIPTION("New Media PCMCIA ethernet driver");
0387 MODULE_LICENSE("GPL");
0388
0389 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
0390
0391
0392 INT_MODULE_PARM(if_port, 0);
0393
0394
0395
0396
0397
0398
0399 static int nmclan_config(struct pcmcia_device *link);
0400 static void nmclan_release(struct pcmcia_device *link);
0401
0402 static void nmclan_reset(struct net_device *dev);
0403 static int mace_config(struct net_device *dev, struct ifmap *map);
0404 static int mace_open(struct net_device *dev);
0405 static int mace_close(struct net_device *dev);
0406 static netdev_tx_t mace_start_xmit(struct sk_buff *skb,
0407 struct net_device *dev);
0408 static void mace_tx_timeout(struct net_device *dev, unsigned int txqueue);
0409 static irqreturn_t mace_interrupt(int irq, void *dev_id);
0410 static struct net_device_stats *mace_get_stats(struct net_device *dev);
0411 static int mace_rx(struct net_device *dev, unsigned char RxCnt);
0412 static void restore_multicast_list(struct net_device *dev);
0413 static void set_multicast_list(struct net_device *dev);
0414 static const struct ethtool_ops netdev_ethtool_ops;
0415
0416
0417 static void nmclan_detach(struct pcmcia_device *p_dev);
0418
0419 static const struct net_device_ops mace_netdev_ops = {
0420 .ndo_open = mace_open,
0421 .ndo_stop = mace_close,
0422 .ndo_start_xmit = mace_start_xmit,
0423 .ndo_tx_timeout = mace_tx_timeout,
0424 .ndo_set_config = mace_config,
0425 .ndo_get_stats = mace_get_stats,
0426 .ndo_set_rx_mode = set_multicast_list,
0427 .ndo_set_mac_address = eth_mac_addr,
0428 .ndo_validate_addr = eth_validate_addr,
0429 };
0430
0431 static int nmclan_probe(struct pcmcia_device *link)
0432 {
0433 mace_private *lp;
0434 struct net_device *dev;
0435
0436 dev_dbg(&link->dev, "nmclan_attach()\n");
0437
0438
0439 dev = alloc_etherdev(sizeof(mace_private));
0440 if (!dev)
0441 return -ENOMEM;
0442 lp = netdev_priv(dev);
0443 lp->p_dev = link;
0444 link->priv = dev;
0445
0446 spin_lock_init(&lp->bank_lock);
0447 link->resource[0]->end = 32;
0448 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
0449 link->config_flags |= CONF_ENABLE_IRQ;
0450 link->config_index = 1;
0451 link->config_regs = PRESENT_OPTION;
0452
0453 lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
0454
0455 dev->netdev_ops = &mace_netdev_ops;
0456 dev->ethtool_ops = &netdev_ethtool_ops;
0457 dev->watchdog_timeo = TX_TIMEOUT;
0458
0459 return nmclan_config(link);
0460 }
0461
0462 static void nmclan_detach(struct pcmcia_device *link)
0463 {
0464 struct net_device *dev = link->priv;
0465
0466 dev_dbg(&link->dev, "nmclan_detach\n");
0467
0468 unregister_netdev(dev);
0469
0470 nmclan_release(link);
0471
0472 free_netdev(dev);
0473 }
0474
0475
0476
0477
0478
0479
0480
0481
0482 static int mace_read(mace_private *lp, unsigned int ioaddr, int reg)
0483 {
0484 int data = 0xFF;
0485 unsigned long flags;
0486
0487 switch (reg >> 4) {
0488 case 0:
0489 data = inb(ioaddr + AM2150_MACE_BASE + reg);
0490 break;
0491 case 1:
0492 spin_lock_irqsave(&lp->bank_lock, flags);
0493 MACEBANK(1);
0494 data = inb(ioaddr + AM2150_MACE_BASE + (reg & 0x0F));
0495 MACEBANK(0);
0496 spin_unlock_irqrestore(&lp->bank_lock, flags);
0497 break;
0498 }
0499 return data & 0xFF;
0500 }
0501
0502
0503
0504
0505
0506
0507
0508
0509 static void mace_write(mace_private *lp, unsigned int ioaddr, int reg,
0510 int data)
0511 {
0512 unsigned long flags;
0513
0514 switch (reg >> 4) {
0515 case 0:
0516 outb(data & 0xFF, ioaddr + AM2150_MACE_BASE + reg);
0517 break;
0518 case 1:
0519 spin_lock_irqsave(&lp->bank_lock, flags);
0520 MACEBANK(1);
0521 outb(data & 0xFF, ioaddr + AM2150_MACE_BASE + (reg & 0x0F));
0522 MACEBANK(0);
0523 spin_unlock_irqrestore(&lp->bank_lock, flags);
0524 break;
0525 }
0526 }
0527
0528
0529
0530
0531
0532 static int mace_init(mace_private *lp, unsigned int ioaddr,
0533 const char *enet_addr)
0534 {
0535 int i;
0536 int ct = 0;
0537
0538
0539 mace_write(lp, ioaddr, MACE_BIUCC, 1);
0540 while (mace_read(lp, ioaddr, MACE_BIUCC) & 0x01) {
0541 ;
0542 if(++ct > 500)
0543 {
0544 pr_err("reset failed, card removed?\n");
0545 return -1;
0546 }
0547 udelay(1);
0548 }
0549 mace_write(lp, ioaddr, MACE_BIUCC, 0);
0550
0551
0552 mace_write(lp, ioaddr, MACE_FIFOCC, 0x0F);
0553
0554 mace_write(lp,ioaddr, MACE_RCVFC, 0);
0555 mace_write(lp, ioaddr, MACE_IMR, 0xFF);
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569 switch (if_port) {
0570 case 1:
0571 mace_write(lp, ioaddr, MACE_PLSCC, 0x02);
0572 break;
0573 case 2:
0574 mace_write(lp, ioaddr, MACE_PLSCC, 0x00);
0575 break;
0576 default:
0577 mace_write(lp, ioaddr, MACE_PHYCC, 4);
0578
0579
0580
0581 break;
0582 }
0583
0584 mace_write(lp, ioaddr, MACE_IAC, MACE_IAC_ADDRCHG | MACE_IAC_PHYADDR);
0585
0586 ct = 0;
0587 while (mace_read(lp, ioaddr, MACE_IAC) & MACE_IAC_ADDRCHG)
0588 {
0589 if(++ ct > 500)
0590 {
0591 pr_err("ADDRCHG timeout, card removed?\n");
0592 return -1;
0593 }
0594 }
0595
0596 for (i = 0; i < ETH_ALEN; i++)
0597 mace_write(lp, ioaddr, MACE_PADR, enet_addr[i]);
0598
0599
0600
0601
0602 mace_write(lp, ioaddr, MACE_MACCC, 0x00);
0603 return 0;
0604 }
0605
0606 static int nmclan_config(struct pcmcia_device *link)
0607 {
0608 struct net_device *dev = link->priv;
0609 mace_private *lp = netdev_priv(dev);
0610 u8 *buf;
0611 size_t len;
0612 int i, ret;
0613 unsigned int ioaddr;
0614
0615 dev_dbg(&link->dev, "nmclan_config\n");
0616
0617 link->io_lines = 5;
0618 ret = pcmcia_request_io(link);
0619 if (ret)
0620 goto failed;
0621 ret = pcmcia_request_irq(link, mace_interrupt);
0622 if (ret)
0623 goto failed;
0624 ret = pcmcia_enable_device(link);
0625 if (ret)
0626 goto failed;
0627
0628 dev->irq = link->irq;
0629 dev->base_addr = link->resource[0]->start;
0630
0631 ioaddr = dev->base_addr;
0632
0633
0634 len = pcmcia_get_tuple(link, 0x80, &buf);
0635 if (!buf || len < ETH_ALEN) {
0636 kfree(buf);
0637 goto failed;
0638 }
0639 eth_hw_addr_set(dev, buf);
0640 kfree(buf);
0641
0642
0643 {
0644 char sig[2];
0645
0646 sig[0] = mace_read(lp, ioaddr, MACE_CHIPIDL);
0647 sig[1] = mace_read(lp, ioaddr, MACE_CHIPIDH);
0648 if ((sig[0] == 0x40) && ((sig[1] & 0x0F) == 0x09)) {
0649 dev_dbg(&link->dev, "nmclan_cs configured: mace id=%x %x\n",
0650 sig[0], sig[1]);
0651 } else {
0652 pr_notice("mace id not found: %x %x should be 0x40 0x?9\n",
0653 sig[0], sig[1]);
0654 return -ENODEV;
0655 }
0656 }
0657
0658 if(mace_init(lp, ioaddr, dev->dev_addr) == -1)
0659 goto failed;
0660
0661
0662 if (if_port <= 2)
0663 dev->if_port = if_port;
0664 else
0665 pr_notice("invalid if_port requested\n");
0666
0667 SET_NETDEV_DEV(dev, &link->dev);
0668
0669 i = register_netdev(dev);
0670 if (i != 0) {
0671 pr_notice("register_netdev() failed\n");
0672 goto failed;
0673 }
0674
0675 netdev_info(dev, "nmclan: port %#3lx, irq %d, %s port, hw_addr %pM\n",
0676 dev->base_addr, dev->irq, if_names[dev->if_port], dev->dev_addr);
0677 return 0;
0678
0679 failed:
0680 nmclan_release(link);
0681 return -ENODEV;
0682 }
0683
0684 static void nmclan_release(struct pcmcia_device *link)
0685 {
0686 dev_dbg(&link->dev, "nmclan_release\n");
0687 pcmcia_disable_device(link);
0688 }
0689
0690 static int nmclan_suspend(struct pcmcia_device *link)
0691 {
0692 struct net_device *dev = link->priv;
0693
0694 if (link->open)
0695 netif_device_detach(dev);
0696
0697 return 0;
0698 }
0699
0700 static int nmclan_resume(struct pcmcia_device *link)
0701 {
0702 struct net_device *dev = link->priv;
0703
0704 if (link->open) {
0705 nmclan_reset(dev);
0706 netif_device_attach(dev);
0707 }
0708
0709 return 0;
0710 }
0711
0712
0713
0714
0715
0716
0717 static void nmclan_reset(struct net_device *dev)
0718 {
0719 mace_private *lp = netdev_priv(dev);
0720
0721 #if RESET_XILINX
0722 struct pcmcia_device *link = &lp->link;
0723 u8 OrigCorValue;
0724
0725
0726 pcmcia_read_config_byte(link, CISREG_COR, &OrigCorValue);
0727
0728
0729 dev_dbg(&link->dev, "nmclan_reset: OrigCorValue=0x%x, resetting...\n",
0730 OrigCorValue);
0731 pcmcia_write_config_byte(link, CISREG_COR, COR_SOFT_RESET);
0732
0733
0734
0735 pcmcia_write_config_byte(link, CISREG_COR,
0736 (COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK)));
0737
0738 lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
0739
0740 #endif
0741
0742
0743 lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
0744
0745
0746 mace_init(lp, dev->base_addr, dev->dev_addr);
0747 mace_write(lp, dev->base_addr, MACE_IMR, MACE_IMR_DEFAULT);
0748
0749
0750 restore_multicast_list(dev);
0751 }
0752
0753
0754
0755
0756
0757
0758
0759 static int mace_config(struct net_device *dev, struct ifmap *map)
0760 {
0761 if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
0762 if (map->port <= 2) {
0763 dev->if_port = map->port;
0764 netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
0765 } else
0766 return -EINVAL;
0767 }
0768 return 0;
0769 }
0770
0771
0772
0773
0774
0775 static int mace_open(struct net_device *dev)
0776 {
0777 unsigned int ioaddr = dev->base_addr;
0778 mace_private *lp = netdev_priv(dev);
0779 struct pcmcia_device *link = lp->p_dev;
0780
0781 if (!pcmcia_dev_present(link))
0782 return -ENODEV;
0783
0784 link->open++;
0785
0786 MACEBANK(0);
0787
0788 netif_start_queue(dev);
0789 nmclan_reset(dev);
0790
0791 return 0;
0792 }
0793
0794
0795
0796
0797
0798 static int mace_close(struct net_device *dev)
0799 {
0800 unsigned int ioaddr = dev->base_addr;
0801 mace_private *lp = netdev_priv(dev);
0802 struct pcmcia_device *link = lp->p_dev;
0803
0804 dev_dbg(&link->dev, "%s: shutting down ethercard.\n", dev->name);
0805
0806
0807 outb(0xFF, ioaddr + AM2150_MACE_BASE + MACE_IMR);
0808
0809 link->open--;
0810 netif_stop_queue(dev);
0811
0812 return 0;
0813 }
0814
0815 static void netdev_get_drvinfo(struct net_device *dev,
0816 struct ethtool_drvinfo *info)
0817 {
0818 strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
0819 snprintf(info->bus_info, sizeof(info->bus_info),
0820 "PCMCIA 0x%lx", dev->base_addr);
0821 }
0822
0823 static const struct ethtool_ops netdev_ethtool_ops = {
0824 .get_drvinfo = netdev_get_drvinfo,
0825 };
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838 static void mace_tx_timeout(struct net_device *dev, unsigned int txqueue)
0839 {
0840 mace_private *lp = netdev_priv(dev);
0841 struct pcmcia_device *link = lp->p_dev;
0842
0843 netdev_notice(dev, "transmit timed out -- ");
0844 #if RESET_ON_TIMEOUT
0845 pr_cont("resetting card\n");
0846 pcmcia_reset_card(link->socket);
0847 #else
0848 pr_cont("NOT resetting card\n");
0849 #endif
0850 netif_trans_update(dev);
0851 netif_wake_queue(dev);
0852 }
0853
0854 static netdev_tx_t mace_start_xmit(struct sk_buff *skb,
0855 struct net_device *dev)
0856 {
0857 mace_private *lp = netdev_priv(dev);
0858 unsigned int ioaddr = dev->base_addr;
0859
0860 netif_stop_queue(dev);
0861
0862 pr_debug("%s: mace_start_xmit(length = %ld) called.\n",
0863 dev->name, (long)skb->len);
0864
0865 #if (!TX_INTERRUPTABLE)
0866
0867 outb(MACE_IMR_DEFAULT | MACE_IR_XMTINT,
0868 ioaddr + AM2150_MACE_BASE + MACE_IMR);
0869 lp->tx_irq_disabled=1;
0870 #endif
0871
0872 {
0873
0874
0875
0876
0877
0878
0879 dev->stats.tx_bytes += skb->len;
0880 lp->tx_free_frames--;
0881
0882
0883
0884 outw(skb->len, ioaddr + AM2150_XMT);
0885
0886 outsw(ioaddr + AM2150_XMT, skb->data, skb->len >> 1);
0887 if (skb->len & 1) {
0888
0889 outb(skb->data[skb->len-1], ioaddr + AM2150_XMT);
0890 }
0891
0892 #if MULTI_TX
0893 if (lp->tx_free_frames > 0)
0894 netif_start_queue(dev);
0895 #endif
0896 }
0897
0898 #if (!TX_INTERRUPTABLE)
0899
0900 lp->tx_irq_disabled=0;
0901 outb(MACE_IMR_DEFAULT, ioaddr + AM2150_MACE_BASE + MACE_IMR);
0902 #endif
0903
0904 dev_kfree_skb(skb);
0905
0906 return NETDEV_TX_OK;
0907 }
0908
0909
0910
0911
0912
0913 static irqreturn_t mace_interrupt(int irq, void *dev_id)
0914 {
0915 struct net_device *dev = (struct net_device *) dev_id;
0916 mace_private *lp = netdev_priv(dev);
0917 unsigned int ioaddr;
0918 int status;
0919 int IntrCnt = MACE_MAX_IR_ITERATIONS;
0920
0921 if (dev == NULL) {
0922 pr_debug("mace_interrupt(): irq 0x%X for unknown device.\n",
0923 irq);
0924 return IRQ_NONE;
0925 }
0926
0927 ioaddr = dev->base_addr;
0928
0929 if (lp->tx_irq_disabled) {
0930 const char *msg;
0931 if (lp->tx_irq_disabled)
0932 msg = "Interrupt with tx_irq_disabled";
0933 else
0934 msg = "Re-entering the interrupt handler";
0935 netdev_notice(dev, "%s [isr=%02X, imr=%02X]\n",
0936 msg,
0937 inb(ioaddr + AM2150_MACE_BASE + MACE_IR),
0938 inb(ioaddr + AM2150_MACE_BASE + MACE_IMR));
0939
0940 return IRQ_NONE;
0941 }
0942
0943 if (!netif_device_present(dev)) {
0944 netdev_dbg(dev, "interrupt from dead card\n");
0945 return IRQ_NONE;
0946 }
0947
0948 do {
0949
0950 status = inb(ioaddr + AM2150_MACE_BASE + MACE_IR);
0951 if (!(status & ~MACE_IMR_DEFAULT) && IntrCnt == MACE_MAX_IR_ITERATIONS)
0952 return IRQ_NONE;
0953
0954 pr_debug("mace_interrupt: irq 0x%X status 0x%X.\n", irq, status);
0955
0956 if (status & MACE_IR_RCVINT) {
0957 mace_rx(dev, MACE_MAX_RX_ITERATIONS);
0958 }
0959
0960 if (status & MACE_IR_XMTINT) {
0961 unsigned char fifofc;
0962 unsigned char xmtrc;
0963 unsigned char xmtfs;
0964
0965 fifofc = inb(ioaddr + AM2150_MACE_BASE + MACE_FIFOFC);
0966 if ((fifofc & MACE_FIFOFC_XMTFC)==0) {
0967 dev->stats.tx_errors++;
0968 outb(0xFF, ioaddr + AM2150_XMT_SKIP);
0969 }
0970
0971
0972 xmtrc = inb(ioaddr + AM2150_MACE_BASE + MACE_XMTRC);
0973 if (xmtrc & MACE_XMTRC_EXDEF) lp->mace_stats.exdef++;
0974 lp->mace_stats.xmtrc += (xmtrc & MACE_XMTRC_XMTRC);
0975
0976 if (
0977 (xmtfs = inb(ioaddr + AM2150_MACE_BASE + MACE_XMTFS)) &
0978 MACE_XMTFS_XMTSV
0979 ) {
0980 lp->mace_stats.xmtsv++;
0981
0982 if (xmtfs & ~MACE_XMTFS_XMTSV) {
0983 if (xmtfs & MACE_XMTFS_UFLO) {
0984
0985
0986 lp->mace_stats.uflo++;
0987 }
0988 if (xmtfs & MACE_XMTFS_LCOL) {
0989
0990 lp->mace_stats.lcol++;
0991 }
0992 if (xmtfs & MACE_XMTFS_MORE) {
0993
0994 lp->mace_stats.more++;
0995 }
0996 if (xmtfs & MACE_XMTFS_ONE) {
0997
0998 lp->mace_stats.one++;
0999 }
1000 if (xmtfs & MACE_XMTFS_DEFER) {
1001
1002 lp->mace_stats.defer++;
1003 }
1004 if (xmtfs & MACE_XMTFS_LCAR) {
1005
1006 lp->mace_stats.lcar++;
1007 }
1008 if (xmtfs & MACE_XMTFS_RTRY) {
1009
1010 lp->mace_stats.rtry++;
1011 }
1012 }
1013
1014 }
1015
1016 dev->stats.tx_packets++;
1017 lp->tx_free_frames++;
1018 netif_wake_queue(dev);
1019 }
1020
1021 if (status & ~MACE_IMR_DEFAULT & ~MACE_IR_RCVINT & ~MACE_IR_XMTINT) {
1022 if (status & MACE_IR_JAB) {
1023
1024 lp->mace_stats.jab++;
1025 }
1026 if (status & MACE_IR_BABL) {
1027
1028 lp->mace_stats.babl++;
1029 }
1030 if (status & MACE_IR_CERR) {
1031
1032
1033
1034 lp->mace_stats.cerr++;
1035 }
1036 if (status & MACE_IR_RCVCCO) {
1037
1038 lp->mace_stats.rcvcco++;
1039 }
1040 if (status & MACE_IR_RNTPCO) {
1041
1042 lp->mace_stats.rntpco++;
1043 }
1044 if (status & MACE_IR_MPCO) {
1045
1046 lp->mace_stats.mpco++;
1047 }
1048 }
1049
1050 } while ((status & ~MACE_IMR_DEFAULT) && (--IntrCnt));
1051
1052 return IRQ_HANDLED;
1053 }
1054
1055
1056
1057
1058
1059 static int mace_rx(struct net_device *dev, unsigned char RxCnt)
1060 {
1061 mace_private *lp = netdev_priv(dev);
1062 unsigned int ioaddr = dev->base_addr;
1063 unsigned char rx_framecnt;
1064 unsigned short rx_status;
1065
1066 while (
1067 ((rx_framecnt = inb(ioaddr + AM2150_RCV_FRAME_COUNT)) > 0) &&
1068 (rx_framecnt <= 12) &&
1069 (RxCnt--)
1070 ) {
1071 rx_status = inw(ioaddr + AM2150_RCV);
1072
1073 pr_debug("%s: in mace_rx(), framecnt 0x%X, rx_status"
1074 " 0x%X.\n", dev->name, rx_framecnt, rx_status);
1075
1076 if (rx_status & MACE_RCVFS_RCVSTS) {
1077 dev->stats.rx_errors++;
1078 if (rx_status & MACE_RCVFS_OFLO) {
1079 lp->mace_stats.oflo++;
1080 }
1081 if (rx_status & MACE_RCVFS_CLSN) {
1082 lp->mace_stats.clsn++;
1083 }
1084 if (rx_status & MACE_RCVFS_FRAM) {
1085 lp->mace_stats.fram++;
1086 }
1087 if (rx_status & MACE_RCVFS_FCS) {
1088 lp->mace_stats.fcs++;
1089 }
1090 } else {
1091 short pkt_len = (rx_status & ~MACE_RCVFS_RCVSTS) - 4;
1092
1093 struct sk_buff *skb;
1094
1095 lp->mace_stats.rfs_rntpc += inb(ioaddr + AM2150_RCV);
1096
1097 lp->mace_stats.rfs_rcvcc += inb(ioaddr + AM2150_RCV);
1098
1099
1100 pr_debug(" receiving packet size 0x%X rx_status"
1101 " 0x%X.\n", pkt_len, rx_status);
1102
1103 skb = netdev_alloc_skb(dev, pkt_len + 2);
1104
1105 if (skb != NULL) {
1106 skb_reserve(skb, 2);
1107 insw(ioaddr + AM2150_RCV, skb_put(skb, pkt_len), pkt_len>>1);
1108 if (pkt_len & 1)
1109 *(skb_tail_pointer(skb) - 1) = inb(ioaddr + AM2150_RCV);
1110 skb->protocol = eth_type_trans(skb, dev);
1111
1112 netif_rx(skb);
1113
1114 dev->stats.rx_packets++;
1115 dev->stats.rx_bytes += pkt_len;
1116 outb(0xFF, ioaddr + AM2150_RCV_NEXT);
1117 continue;
1118 } else {
1119 pr_debug("%s: couldn't allocate a sk_buff of size"
1120 " %d.\n", dev->name, pkt_len);
1121 dev->stats.rx_dropped++;
1122 }
1123 }
1124 outb(0xFF, ioaddr + AM2150_RCV_NEXT);
1125 }
1126
1127 return 0;
1128 }
1129
1130
1131
1132
1133 static void pr_linux_stats(struct net_device_stats *pstats)
1134 {
1135 pr_debug("pr_linux_stats\n");
1136 pr_debug(" rx_packets=%-7ld tx_packets=%ld\n",
1137 (long)pstats->rx_packets, (long)pstats->tx_packets);
1138 pr_debug(" rx_errors=%-7ld tx_errors=%ld\n",
1139 (long)pstats->rx_errors, (long)pstats->tx_errors);
1140 pr_debug(" rx_dropped=%-7ld tx_dropped=%ld\n",
1141 (long)pstats->rx_dropped, (long)pstats->tx_dropped);
1142 pr_debug(" multicast=%-7ld collisions=%ld\n",
1143 (long)pstats->multicast, (long)pstats->collisions);
1144
1145 pr_debug(" rx_length_errors=%-7ld rx_over_errors=%ld\n",
1146 (long)pstats->rx_length_errors, (long)pstats->rx_over_errors);
1147 pr_debug(" rx_crc_errors=%-7ld rx_frame_errors=%ld\n",
1148 (long)pstats->rx_crc_errors, (long)pstats->rx_frame_errors);
1149 pr_debug(" rx_fifo_errors=%-7ld rx_missed_errors=%ld\n",
1150 (long)pstats->rx_fifo_errors, (long)pstats->rx_missed_errors);
1151
1152 pr_debug(" tx_aborted_errors=%-7ld tx_carrier_errors=%ld\n",
1153 (long)pstats->tx_aborted_errors, (long)pstats->tx_carrier_errors);
1154 pr_debug(" tx_fifo_errors=%-7ld tx_heartbeat_errors=%ld\n",
1155 (long)pstats->tx_fifo_errors, (long)pstats->tx_heartbeat_errors);
1156 pr_debug(" tx_window_errors=%ld\n",
1157 (long)pstats->tx_window_errors);
1158 }
1159
1160
1161
1162
1163 static void pr_mace_stats(mace_statistics *pstats)
1164 {
1165 pr_debug("pr_mace_stats\n");
1166
1167 pr_debug(" xmtsv=%-7d uflo=%d\n",
1168 pstats->xmtsv, pstats->uflo);
1169 pr_debug(" lcol=%-7d more=%d\n",
1170 pstats->lcol, pstats->more);
1171 pr_debug(" one=%-7d defer=%d\n",
1172 pstats->one, pstats->defer);
1173 pr_debug(" lcar=%-7d rtry=%d\n",
1174 pstats->lcar, pstats->rtry);
1175
1176
1177 pr_debug(" exdef=%-7d xmtrc=%d\n",
1178 pstats->exdef, pstats->xmtrc);
1179
1180
1181 pr_debug(" oflo=%-7d clsn=%d\n",
1182 pstats->oflo, pstats->clsn);
1183 pr_debug(" fram=%-7d fcs=%d\n",
1184 pstats->fram, pstats->fcs);
1185
1186
1187
1188 pr_debug(" rfs_rntpc=%-7d rfs_rcvcc=%d\n",
1189 pstats->rfs_rntpc, pstats->rfs_rcvcc);
1190
1191
1192 pr_debug(" jab=%-7d babl=%d\n",
1193 pstats->jab, pstats->babl);
1194 pr_debug(" cerr=%-7d rcvcco=%d\n",
1195 pstats->cerr, pstats->rcvcco);
1196 pr_debug(" rntpco=%-7d mpco=%d\n",
1197 pstats->rntpco, pstats->mpco);
1198
1199
1200 pr_debug(" mpc=%d\n", pstats->mpc);
1201
1202
1203 pr_debug(" rntpc=%d\n", pstats->rntpc);
1204
1205
1206 pr_debug(" rcvcc=%d\n", pstats->rcvcc);
1207
1208 }
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223 static void update_stats(unsigned int ioaddr, struct net_device *dev)
1224 {
1225 mace_private *lp = netdev_priv(dev);
1226
1227 lp->mace_stats.rcvcc += mace_read(lp, ioaddr, MACE_RCVCC);
1228 lp->mace_stats.rntpc += mace_read(lp, ioaddr, MACE_RNTPC);
1229 lp->mace_stats.mpc += mace_read(lp, ioaddr, MACE_MPC);
1230
1231
1232
1233
1234
1235
1236
1237 dev->stats.collisions =
1238 lp->mace_stats.rcvcco * 256 + lp->mace_stats.rcvcc;
1239
1240
1241
1242
1243
1244
1245 dev->stats.rx_length_errors =
1246 lp->mace_stats.rntpco * 256 + lp->mace_stats.rntpc;
1247
1248 dev->stats.rx_crc_errors = lp->mace_stats.fcs;
1249 dev->stats.rx_frame_errors = lp->mace_stats.fram;
1250 dev->stats.rx_fifo_errors = lp->mace_stats.oflo;
1251 dev->stats.rx_missed_errors =
1252 lp->mace_stats.mpco * 256 + lp->mace_stats.mpc;
1253
1254
1255 dev->stats.tx_aborted_errors = lp->mace_stats.rtry;
1256 dev->stats.tx_carrier_errors = lp->mace_stats.lcar;
1257
1258 dev->stats.tx_fifo_errors = lp->mace_stats.uflo;
1259 dev->stats.tx_heartbeat_errors = lp->mace_stats.cerr;
1260
1261 }
1262
1263
1264
1265
1266
1267 static struct net_device_stats *mace_get_stats(struct net_device *dev)
1268 {
1269 mace_private *lp = netdev_priv(dev);
1270
1271 update_stats(dev->base_addr, dev);
1272
1273 pr_debug("%s: updating the statistics.\n", dev->name);
1274 pr_linux_stats(&dev->stats);
1275 pr_mace_stats(&lp->mace_stats);
1276
1277 return &dev->stats;
1278 }
1279
1280
1281
1282
1283
1284
1285 #ifdef BROKEN_MULTICAST
1286
1287 static void updateCRC(int *CRC, int bit)
1288 {
1289 static const int poly[]={
1290 1,1,1,0, 1,1,0,1,
1291 1,0,1,1, 1,0,0,0,
1292 1,0,0,0, 0,0,1,1,
1293 0,0,1,0, 0,0,0,0
1294 };
1295
1296
1297 int j;
1298
1299
1300 for (j = 32; j > 0; j--)
1301 CRC[j] = CRC[j-1];
1302 CRC[0] = 0;
1303
1304
1305 if (bit ^ CRC[32])
1306 for (j = 0; j < 32; j++)
1307 CRC[j] ^= poly[j];
1308 }
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319 static void BuildLAF(int *ladrf, int *adr)
1320 {
1321 int CRC[33]={1};
1322
1323 int i, byte;
1324 int hashcode;
1325
1326 CRC[32]=0;
1327
1328 for (byte = 0; byte < 6; byte++)
1329 for (i = 0; i < 8; i++)
1330 updateCRC(CRC, (adr[byte] >> i) & 1);
1331
1332 hashcode = 0;
1333 for (i = 0; i < 6; i++)
1334 hashcode = (hashcode << 1) + CRC[i];
1335
1336 byte = hashcode >> 3;
1337 ladrf[byte] |= (1 << (hashcode & 7));
1338
1339 #ifdef PCMCIA_DEBUG
1340 if (0)
1341 printk(KERN_DEBUG " adr =%pM\n", adr);
1342 printk(KERN_DEBUG " hashcode = %d(decimal), ladrf[0:63] =", hashcode);
1343 for (i = 0; i < 8; i++)
1344 pr_cont(" %02X", ladrf[i]);
1345 pr_cont("\n");
1346 #endif
1347 }
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358 static void restore_multicast_list(struct net_device *dev)
1359 {
1360 mace_private *lp = netdev_priv(dev);
1361 int num_addrs = lp->multicast_num_addrs;
1362 int *ladrf = lp->multicast_ladrf;
1363 unsigned int ioaddr = dev->base_addr;
1364 int i;
1365
1366 pr_debug("%s: restoring Rx mode to %d addresses.\n",
1367 dev->name, num_addrs);
1368
1369 if (num_addrs > 0) {
1370
1371 pr_debug("Attempt to restore multicast list detected.\n");
1372
1373 mace_write(lp, ioaddr, MACE_IAC, MACE_IAC_ADDRCHG | MACE_IAC_LOGADDR);
1374
1375 while (mace_read(lp, ioaddr, MACE_IAC) & MACE_IAC_ADDRCHG)
1376 ;
1377
1378 for (i = 0; i < MACE_LADRF_LEN; i++)
1379 mace_write(lp, ioaddr, MACE_LADRF, ladrf[i]);
1380
1381 mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_RCVFCSE | MACE_UTR_LOOP_EXTERNAL);
1382 mace_write(lp, ioaddr, MACE_MACCC, MACE_MACCC_ENXMT | MACE_MACCC_ENRCV);
1383
1384 } else if (num_addrs < 0) {
1385
1386
1387 mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1388 mace_write(lp, ioaddr, MACE_MACCC,
1389 MACE_MACCC_PROM | MACE_MACCC_ENXMT | MACE_MACCC_ENRCV
1390 );
1391
1392 } else {
1393
1394
1395 mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1396 mace_write(lp, ioaddr, MACE_MACCC, MACE_MACCC_ENXMT | MACE_MACCC_ENRCV);
1397
1398 }
1399 }
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415 static void set_multicast_list(struct net_device *dev)
1416 {
1417 mace_private *lp = netdev_priv(dev);
1418 int adr[ETH_ALEN] = {0};
1419 struct netdev_hw_addr *ha;
1420
1421 #ifdef PCMCIA_DEBUG
1422 {
1423 static int old;
1424 if (netdev_mc_count(dev) != old) {
1425 old = netdev_mc_count(dev);
1426 pr_debug("%s: setting Rx mode to %d addresses.\n",
1427 dev->name, old);
1428 }
1429 }
1430 #endif
1431
1432
1433 lp->multicast_num_addrs = netdev_mc_count(dev);
1434
1435
1436 if (num_addrs > 0) {
1437
1438 memset(lp->multicast_ladrf, 0, MACE_LADRF_LEN);
1439 netdev_for_each_mc_addr(ha, dev) {
1440 memcpy(adr, ha->addr, ETH_ALEN);
1441 BuildLAF(lp->multicast_ladrf, adr);
1442 }
1443 }
1444
1445 restore_multicast_list(dev);
1446
1447 }
1448
1449 #endif
1450
1451 static void restore_multicast_list(struct net_device *dev)
1452 {
1453 unsigned int ioaddr = dev->base_addr;
1454 mace_private *lp = netdev_priv(dev);
1455
1456 pr_debug("%s: restoring Rx mode to %d addresses.\n", dev->name,
1457 lp->multicast_num_addrs);
1458
1459 if (dev->flags & IFF_PROMISC) {
1460
1461 mace_write(lp,ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1462 mace_write(lp, ioaddr, MACE_MACCC,
1463 MACE_MACCC_PROM | MACE_MACCC_ENXMT | MACE_MACCC_ENRCV
1464 );
1465 } else {
1466
1467 mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1468 mace_write(lp, ioaddr, MACE_MACCC, MACE_MACCC_ENXMT | MACE_MACCC_ENRCV);
1469 }
1470 }
1471
1472 static void set_multicast_list(struct net_device *dev)
1473 {
1474 mace_private *lp = netdev_priv(dev);
1475
1476 #ifdef PCMCIA_DEBUG
1477 {
1478 static int old;
1479 if (netdev_mc_count(dev) != old) {
1480 old = netdev_mc_count(dev);
1481 pr_debug("%s: setting Rx mode to %d addresses.\n",
1482 dev->name, old);
1483 }
1484 }
1485 #endif
1486
1487 lp->multicast_num_addrs = netdev_mc_count(dev);
1488 restore_multicast_list(dev);
1489
1490 }
1491
1492 static const struct pcmcia_device_id nmclan_ids[] = {
1493 PCMCIA_DEVICE_PROD_ID12("New Media Corporation", "Ethernet", 0x085a850b, 0x00b2e941),
1494 PCMCIA_DEVICE_PROD_ID12("Portable Add-ons", "Ethernet+", 0xebf1d60, 0xad673aaf),
1495 PCMCIA_DEVICE_NULL,
1496 };
1497 MODULE_DEVICE_TABLE(pcmcia, nmclan_ids);
1498
1499 static struct pcmcia_driver nmclan_cs_driver = {
1500 .owner = THIS_MODULE,
1501 .name = "nmclan_cs",
1502 .probe = nmclan_probe,
1503 .remove = nmclan_detach,
1504 .id_table = nmclan_ids,
1505 .suspend = nmclan_suspend,
1506 .resume = nmclan_resume,
1507 };
1508 module_pcmcia_driver(nmclan_cs_driver);