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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0066
0067 #include <linux/module.h>
0068 #include <linux/kernel.h>
0069 #include <linux/init.h>
0070 #include <linux/ptrace.h>
0071 #include <linux/slab.h>
0072 #include <linux/string.h>
0073 #include <linux/timer.h>
0074 #include <linux/interrupt.h>
0075 #include <linux/in.h>
0076 #include <linux/delay.h>
0077 #include <linux/ethtool.h>
0078 #include <linux/netdevice.h>
0079 #include <linux/etherdevice.h>
0080 #include <linux/skbuff.h>
0081 #include <linux/if_arp.h>
0082 #include <linux/ioport.h>
0083 #include <linux/bitops.h>
0084 #include <linux/mii.h>
0085
0086 #include <pcmcia/cistpl.h>
0087 #include <pcmcia/cisreg.h>
0088 #include <pcmcia/ciscode.h>
0089
0090 #include <asm/io.h>
0091 #include <linux/uaccess.h>
0092
0093 #ifndef MANFID_COMPAQ
0094 #define MANFID_COMPAQ 0x0138
0095 #define MANFID_COMPAQ2 0x0183
0096 #endif
0097
0098 #include <pcmcia/ds.h>
0099
0100
0101 #define TX_TIMEOUT ((400*HZ)/1000)
0102
0103
0104
0105
0106
0107
0108 #define XIRCREG_CR 0
0109 enum xirc_cr {
0110 TransmitPacket = 0x01,
0111 SoftReset = 0x02,
0112 EnableIntr = 0x04,
0113 ForceIntr = 0x08,
0114 ClearTxFIFO = 0x10,
0115 ClearRxOvrun = 0x20,
0116 RestartTx = 0x40
0117 };
0118 #define XIRCREG_ESR 0
0119 enum xirc_esr {
0120 FullPktRcvd = 0x01,
0121 PktRejected = 0x04,
0122 TxPktPend = 0x08,
0123 IncorPolarity = 0x10,
0124 MediaSelect = 0x20
0125 };
0126 #define XIRCREG_PR 1
0127 #define XIRCREG_EDP 4
0128 #define XIRCREG_ISR 6
0129 enum xirc_isr {
0130 TxBufOvr = 0x01,
0131 PktTxed = 0x02,
0132 MACIntr = 0x04,
0133 TxResGrant = 0x08,
0134 RxFullPkt = 0x20,
0135 RxPktRej = 0x40,
0136 ForcedIntr= 0x80
0137 };
0138 #define XIRCREG1_IMR0 12
0139 #define XIRCREG1_IMR1 13
0140 #define XIRCREG0_TSO 8
0141 #define XIRCREG0_TRS 10
0142 #define XIRCREG0_DO 12
0143 #define XIRCREG0_RSR 12
0144 enum xirc_rsr {
0145 PhyPkt = 0x01,
0146 BrdcstPkt = 0x02,
0147 PktTooLong = 0x04,
0148 AlignErr = 0x10,
0149 CRCErr = 0x20,
0150 PktRxOk = 0x80
0151 };
0152 #define XIRCREG0_PTR 13
0153 #define XIRCREG0_RBC 14
0154 #define XIRCREG1_ECR 14
0155 enum xirc_ecr {
0156 FullDuplex = 0x04,
0157 LongTPMode = 0x08,
0158 DisablePolCor = 0x10,
0159 DisableLinkPulse = 0x20,
0160 DisableAutoTx = 0x40,
0161 };
0162 #define XIRCREG2_RBS 8
0163 #define XIRCREG2_LED 10
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174 #define XIRCREG2_MSR 12
0175
0176 #define XIRCREG4_GPR0 8
0177 #define XIRCREG4_GPR1 9
0178 #define XIRCREG2_GPR2 13
0179 #define XIRCREG4_BOV 10
0180 #define XIRCREG4_LMA 12
0181 #define XIRCREG4_LMD 14
0182
0183 #define XIRCREG40_CMD0 8
0184 enum xirc_cmd {
0185 Transmit = 0x01,
0186 EnableRecv = 0x04,
0187 DisableRecv = 0x08,
0188 Abort = 0x10,
0189 Online = 0x20,
0190 IntrAck = 0x40,
0191 Offline = 0x80
0192 };
0193 #define XIRCREG5_RHSA0 10
0194 #define XIRCREG40_RXST0 9
0195 #define XIRCREG40_TXST0 11
0196 #define XIRCREG40_TXST1 12
0197 #define XIRCREG40_RMASK0 13
0198 #define XIRCREG40_TMASK0 14
0199 #define XIRCREG40_TMASK1 15
0200 #define XIRCREG42_SWC0 8
0201 #define XIRCREG42_SWC1 9
0202 #define XIRCREG42_BOC 10
0203 #define XIRCREG44_TDR0 8
0204 #define XIRCREG44_TDR1 9
0205 #define XIRCREG44_RXBC_LO 10
0206 #define XIRCREG44_RXBC_HI 11
0207 #define XIRCREG45_REV 15
0208 #define XIRCREG50_IA 8
0209
0210 static const char *if_names[] = { "Auto", "10BaseT", "10Base2", "AUI", "100BaseT" };
0211
0212
0213 #define XIR_UNKNOWN 0
0214 #define XIR_CE 1
0215 #define XIR_CE2 2
0216 #define XIR_CE3 3
0217 #define XIR_CEM 4
0218 #define XIR_CEM2 5
0219 #define XIR_CEM3 6
0220 #define XIR_CEM33 7
0221 #define XIR_CEM56M 8
0222 #define XIR_CEM56 9
0223 #define XIR_CM28 10
0224 #define XIR_CM33 11
0225 #define XIR_CM56 12
0226 #define XIR_CG 13
0227 #define XIR_CBE 14
0228
0229
0230
0231
0232 MODULE_DESCRIPTION("Xircom PCMCIA ethernet driver");
0233 MODULE_LICENSE("Dual MPL/GPL");
0234
0235 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
0236
0237 INT_MODULE_PARM(if_port, 0);
0238 INT_MODULE_PARM(full_duplex, 0);
0239 INT_MODULE_PARM(do_sound, 1);
0240 INT_MODULE_PARM(lockup_hack, 0);
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251 static unsigned maxrx_bytes = 22000;
0252
0253
0254 static void mii_idle(unsigned int ioaddr);
0255 static void mii_putbit(unsigned int ioaddr, unsigned data);
0256 static int mii_getbit(unsigned int ioaddr);
0257 static void mii_wbits(unsigned int ioaddr, unsigned data, int len);
0258 static unsigned mii_rd(unsigned int ioaddr, u_char phyaddr, u_char phyreg);
0259 static void mii_wr(unsigned int ioaddr, u_char phyaddr, u_char phyreg,
0260 unsigned data, int len);
0261
0262 static int has_ce2_string(struct pcmcia_device * link);
0263 static int xirc2ps_config(struct pcmcia_device * link);
0264 static void xirc2ps_release(struct pcmcia_device * link);
0265 static void xirc2ps_detach(struct pcmcia_device *p_dev);
0266
0267 static irqreturn_t xirc2ps_interrupt(int irq, void *dev_id);
0268
0269 struct local_info {
0270 struct net_device *dev;
0271 struct pcmcia_device *p_dev;
0272
0273 int card_type;
0274 int probe_port;
0275 int silicon;
0276 int mohawk;
0277 int dingo;
0278 int new_mii;
0279 int modem;
0280 void __iomem *dingo_ccr;
0281 unsigned last_ptr_value;
0282 const char *manf_str;
0283 struct work_struct tx_timeout_task;
0284 };
0285
0286
0287
0288
0289 static netdev_tx_t do_start_xmit(struct sk_buff *skb,
0290 struct net_device *dev);
0291 static void xirc_tx_timeout(struct net_device *dev, unsigned int txqueue);
0292 static void xirc2ps_tx_timeout_task(struct work_struct *work);
0293 static void set_addresses(struct net_device *dev);
0294 static void set_multicast_list(struct net_device *dev);
0295 static int set_card_type(struct pcmcia_device *link);
0296 static int do_config(struct net_device *dev, struct ifmap *map);
0297 static int do_open(struct net_device *dev);
0298 static int do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
0299 static const struct ethtool_ops netdev_ethtool_ops;
0300 static void hardreset(struct net_device *dev);
0301 static void do_reset(struct net_device *dev, int full);
0302 static int init_mii(struct net_device *dev);
0303 static void do_powerdown(struct net_device *dev);
0304 static int do_stop(struct net_device *dev);
0305
0306
0307 #define SelectPage(pgnr) outb((pgnr), ioaddr + XIRCREG_PR)
0308 #define GetByte(reg) ((unsigned)inb(ioaddr + (reg)))
0309 #define GetWord(reg) ((unsigned)inw(ioaddr + (reg)))
0310 #define PutByte(reg,value) outb((value), ioaddr+(reg))
0311 #define PutWord(reg,value) outw((value), ioaddr+(reg))
0312
0313
0314 #if 0
0315 static void
0316 PrintRegisters(struct net_device *dev)
0317 {
0318 unsigned int ioaddr = dev->base_addr;
0319
0320 if (pc_debug > 1) {
0321 int i, page;
0322
0323 printk(KERN_DEBUG pr_fmt("Register common: "));
0324 for (i = 0; i < 8; i++)
0325 pr_cont(" %2.2x", GetByte(i));
0326 pr_cont("\n");
0327 for (page = 0; page <= 8; page++) {
0328 printk(KERN_DEBUG pr_fmt("Register page %2x: "), page);
0329 SelectPage(page);
0330 for (i = 8; i < 16; i++)
0331 pr_cont(" %2.2x", GetByte(i));
0332 pr_cont("\n");
0333 }
0334 for (page=0x40 ; page <= 0x5f; page++) {
0335 if (page == 0x43 || (page >= 0x46 && page <= 0x4f) ||
0336 (page >= 0x51 && page <=0x5e))
0337 continue;
0338 printk(KERN_DEBUG pr_fmt("Register page %2x: "), page);
0339 SelectPage(page);
0340 for (i = 8; i < 16; i++)
0341 pr_cont(" %2.2x", GetByte(i));
0342 pr_cont("\n");
0343 }
0344 }
0345 }
0346 #endif
0347
0348
0349
0350
0351
0352
0353 static void
0354 mii_idle(unsigned int ioaddr)
0355 {
0356 PutByte(XIRCREG2_GPR2, 0x04|0);
0357 udelay(1);
0358 PutByte(XIRCREG2_GPR2, 0x04|1);
0359 udelay(1);
0360 }
0361
0362
0363
0364
0365 static void
0366 mii_putbit(unsigned int ioaddr, unsigned data)
0367 {
0368 #if 1
0369 if (data) {
0370 PutByte(XIRCREG2_GPR2, 0x0c|2|0);
0371 udelay(1);
0372 PutByte(XIRCREG2_GPR2, 0x0c|2|1);
0373 udelay(1);
0374 } else {
0375 PutByte(XIRCREG2_GPR2, 0x0c|0|0);
0376 udelay(1);
0377 PutByte(XIRCREG2_GPR2, 0x0c|0|1);
0378 udelay(1);
0379 }
0380 #else
0381 if (data) {
0382 PutWord(XIRCREG2_GPR2-1, 0x0e0e);
0383 udelay(1);
0384 PutWord(XIRCREG2_GPR2-1, 0x0f0f);
0385 udelay(1);
0386 } else {
0387 PutWord(XIRCREG2_GPR2-1, 0x0c0c);
0388 udelay(1);
0389 PutWord(XIRCREG2_GPR2-1, 0x0d0d);
0390 udelay(1);
0391 }
0392 #endif
0393 }
0394
0395
0396
0397
0398 static int
0399 mii_getbit(unsigned int ioaddr)
0400 {
0401 unsigned d;
0402
0403 PutByte(XIRCREG2_GPR2, 4|0);
0404 udelay(1);
0405 d = GetByte(XIRCREG2_GPR2);
0406 PutByte(XIRCREG2_GPR2, 4|1);
0407 udelay(1);
0408 return d & 0x20;
0409 }
0410
0411 static void
0412 mii_wbits(unsigned int ioaddr, unsigned data, int len)
0413 {
0414 unsigned m = 1 << (len-1);
0415 for (; m; m >>= 1)
0416 mii_putbit(ioaddr, data & m);
0417 }
0418
0419 static unsigned
0420 mii_rd(unsigned int ioaddr, u_char phyaddr, u_char phyreg)
0421 {
0422 int i;
0423 unsigned data=0, m;
0424
0425 SelectPage(2);
0426 for (i=0; i < 32; i++)
0427 mii_putbit(ioaddr, 1);
0428 mii_wbits(ioaddr, 0x06, 4);
0429 mii_wbits(ioaddr, phyaddr, 5);
0430 mii_wbits(ioaddr, phyreg, 5);
0431 mii_idle(ioaddr);
0432 mii_getbit(ioaddr);
0433
0434 for (m = 1<<15; m; m >>= 1)
0435 if (mii_getbit(ioaddr))
0436 data |= m;
0437 mii_idle(ioaddr);
0438 return data;
0439 }
0440
0441 static void
0442 mii_wr(unsigned int ioaddr, u_char phyaddr, u_char phyreg, unsigned data,
0443 int len)
0444 {
0445 int i;
0446
0447 SelectPage(2);
0448 for (i=0; i < 32; i++)
0449 mii_putbit(ioaddr, 1);
0450 mii_wbits(ioaddr, 0x05, 4);
0451 mii_wbits(ioaddr, phyaddr, 5);
0452 mii_wbits(ioaddr, phyreg, 5);
0453 mii_putbit(ioaddr, 1);
0454 mii_putbit(ioaddr, 0);
0455 mii_wbits(ioaddr, data, len);
0456 mii_idle(ioaddr);
0457 }
0458
0459
0460
0461 static const struct net_device_ops netdev_ops = {
0462 .ndo_open = do_open,
0463 .ndo_stop = do_stop,
0464 .ndo_start_xmit = do_start_xmit,
0465 .ndo_tx_timeout = xirc_tx_timeout,
0466 .ndo_set_config = do_config,
0467 .ndo_eth_ioctl = do_ioctl,
0468 .ndo_set_rx_mode = set_multicast_list,
0469 .ndo_set_mac_address = eth_mac_addr,
0470 .ndo_validate_addr = eth_validate_addr,
0471 };
0472
0473 static int
0474 xirc2ps_probe(struct pcmcia_device *link)
0475 {
0476 struct net_device *dev;
0477 struct local_info *local;
0478
0479 dev_dbg(&link->dev, "attach()\n");
0480
0481
0482 dev = alloc_etherdev(sizeof(struct local_info));
0483 if (!dev)
0484 return -ENOMEM;
0485 local = netdev_priv(dev);
0486 local->dev = dev;
0487 local->p_dev = link;
0488 link->priv = dev;
0489
0490
0491 link->config_index = 1;
0492
0493
0494 dev->netdev_ops = &netdev_ops;
0495 dev->ethtool_ops = &netdev_ethtool_ops;
0496 dev->watchdog_timeo = TX_TIMEOUT;
0497 INIT_WORK(&local->tx_timeout_task, xirc2ps_tx_timeout_task);
0498
0499 return xirc2ps_config(link);
0500 }
0501
0502 static void
0503 xirc2ps_detach(struct pcmcia_device *link)
0504 {
0505 struct net_device *dev = link->priv;
0506
0507 dev_dbg(&link->dev, "detach\n");
0508
0509 unregister_netdev(dev);
0510
0511 xirc2ps_release(link);
0512
0513 free_netdev(dev);
0514 }
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534 static int
0535 set_card_type(struct pcmcia_device *link)
0536 {
0537 struct net_device *dev = link->priv;
0538 struct local_info *local = netdev_priv(dev);
0539 u8 *buf;
0540 unsigned int cisrev, mediaid, prodid;
0541 size_t len;
0542
0543 len = pcmcia_get_tuple(link, CISTPL_MANFID, &buf);
0544 if (len < 5) {
0545 dev_err(&link->dev, "invalid CIS -- sorry\n");
0546 return 0;
0547 }
0548
0549 cisrev = buf[2];
0550 mediaid = buf[3];
0551 prodid = buf[4];
0552
0553 dev_dbg(&link->dev, "cisrev=%02x mediaid=%02x prodid=%02x\n",
0554 cisrev, mediaid, prodid);
0555
0556 local->mohawk = 0;
0557 local->dingo = 0;
0558 local->modem = 0;
0559 local->card_type = XIR_UNKNOWN;
0560 if (!(prodid & 0x40)) {
0561 pr_notice("Oops: Not a creditcard\n");
0562 return 0;
0563 }
0564 if (!(mediaid & 0x01)) {
0565 pr_notice("Not an Ethernet card\n");
0566 return 0;
0567 }
0568 if (mediaid & 0x10) {
0569 local->modem = 1;
0570 switch(prodid & 15) {
0571 case 1: local->card_type = XIR_CEM ; break;
0572 case 2: local->card_type = XIR_CEM2 ; break;
0573 case 3: local->card_type = XIR_CEM3 ; break;
0574 case 4: local->card_type = XIR_CEM33 ; break;
0575 case 5: local->card_type = XIR_CEM56M;
0576 local->mohawk = 1;
0577 break;
0578 case 6:
0579 case 7:
0580 local->card_type = XIR_CEM56 ;
0581 local->mohawk = 1;
0582 local->dingo = 1;
0583 break;
0584 }
0585 } else {
0586 switch(prodid & 15) {
0587 case 1: local->card_type = has_ce2_string(link)? XIR_CE2 : XIR_CE ;
0588 break;
0589 case 2: local->card_type = XIR_CE2; break;
0590 case 3: local->card_type = XIR_CE3;
0591 local->mohawk = 1;
0592 break;
0593 }
0594 }
0595 if (local->card_type == XIR_CE || local->card_type == XIR_CEM) {
0596 pr_notice("Sorry, this is an old CE card\n");
0597 return 0;
0598 }
0599 if (local->card_type == XIR_UNKNOWN)
0600 pr_notice("unknown card (mediaid=%02x prodid=%02x)\n", mediaid, prodid);
0601
0602 return 1;
0603 }
0604
0605
0606
0607
0608
0609
0610 static int
0611 has_ce2_string(struct pcmcia_device * p_dev)
0612 {
0613 if (p_dev->prod_id[2] && strstr(p_dev->prod_id[2], "CE2"))
0614 return 1;
0615 return 0;
0616 }
0617
0618 static int
0619 xirc2ps_config_modem(struct pcmcia_device *p_dev, void *priv_data)
0620 {
0621 unsigned int ioaddr;
0622
0623 if ((p_dev->resource[0]->start & 0xf) == 8)
0624 return -ENODEV;
0625
0626 p_dev->resource[0]->end = 16;
0627 p_dev->resource[1]->end = 8;
0628 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
0629 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
0630 p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
0631 p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
0632 p_dev->io_lines = 10;
0633
0634 p_dev->resource[1]->start = p_dev->resource[0]->start;
0635 for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
0636 p_dev->resource[0]->start = ioaddr;
0637 if (!pcmcia_request_io(p_dev))
0638 return 0;
0639 }
0640 return -ENODEV;
0641 }
0642
0643 static int
0644 xirc2ps_config_check(struct pcmcia_device *p_dev, void *priv_data)
0645 {
0646 int *pass = priv_data;
0647 resource_size_t tmp = p_dev->resource[1]->start;
0648
0649 tmp += (*pass ? (p_dev->config_index & 0x20 ? -24 : 8)
0650 : (p_dev->config_index & 0x20 ? 8 : -24));
0651
0652 if ((p_dev->resource[0]->start & 0xf) == 8)
0653 return -ENODEV;
0654
0655 p_dev->resource[0]->end = 18;
0656 p_dev->resource[1]->end = 8;
0657 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
0658 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
0659 p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
0660 p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
0661 p_dev->io_lines = 10;
0662
0663 p_dev->resource[1]->start = p_dev->resource[0]->start;
0664 p_dev->resource[0]->start = tmp;
0665 return pcmcia_request_io(p_dev);
0666 }
0667
0668
0669 static int pcmcia_get_mac_ce(struct pcmcia_device *p_dev,
0670 tuple_t *tuple,
0671 void *priv)
0672 {
0673 struct net_device *dev = priv;
0674
0675 if (tuple->TupleDataLen != 13)
0676 return -EINVAL;
0677 if ((tuple->TupleData[0] != 2) || (tuple->TupleData[1] != 1) ||
0678 (tuple->TupleData[2] != 6))
0679 return -EINVAL;
0680
0681 dev_addr_mod(dev, 2, &tuple->TupleData[2], 4);
0682 return 0;
0683 };
0684
0685
0686 static int
0687 xirc2ps_config(struct pcmcia_device * link)
0688 {
0689 struct net_device *dev = link->priv;
0690 struct local_info *local = netdev_priv(dev);
0691 unsigned int ioaddr;
0692 int err;
0693 u8 *buf;
0694 size_t len;
0695
0696 local->dingo_ccr = NULL;
0697
0698 dev_dbg(&link->dev, "config\n");
0699
0700
0701 if (link->has_manf_id == 0) {
0702 pr_notice("manfid not found in CIS\n");
0703 goto failure;
0704 }
0705
0706 switch (link->manf_id) {
0707 case MANFID_XIRCOM:
0708 local->manf_str = "Xircom";
0709 break;
0710 case MANFID_ACCTON:
0711 local->manf_str = "Accton";
0712 break;
0713 case MANFID_COMPAQ:
0714 case MANFID_COMPAQ2:
0715 local->manf_str = "Compaq";
0716 break;
0717 case MANFID_INTEL:
0718 local->manf_str = "Intel";
0719 break;
0720 case MANFID_TOSHIBA:
0721 local->manf_str = "Toshiba";
0722 break;
0723 default:
0724 pr_notice("Unknown Card Manufacturer ID: 0x%04x\n",
0725 (unsigned)link->manf_id);
0726 goto failure;
0727 }
0728 dev_dbg(&link->dev, "found %s card\n", local->manf_str);
0729
0730 if (!set_card_type(link)) {
0731 pr_notice("this card is not supported\n");
0732 goto failure;
0733 }
0734
0735
0736 err = pcmcia_get_mac_from_cis(link, dev);
0737
0738
0739 if (err) {
0740 len = pcmcia_get_tuple(link, 0x89, &buf);
0741
0742 if (buf && len == 8) {
0743 if (*buf == CISTPL_FUNCE_LAN_NODE_ID)
0744 dev_addr_mod(dev, 2, &buf[2], 4);
0745 else
0746 err = -1;
0747 }
0748 kfree(buf);
0749 }
0750
0751 if (err)
0752 err = pcmcia_loop_tuple(link, CISTPL_FUNCE, pcmcia_get_mac_ce, dev);
0753
0754 if (err) {
0755 pr_notice("node-id not found in CIS\n");
0756 goto failure;
0757 }
0758
0759 if (local->modem) {
0760 int pass;
0761 link->config_flags |= CONF_AUTO_SET_IO;
0762
0763 if (local->dingo) {
0764
0765
0766 if (!pcmcia_loop_config(link, xirc2ps_config_modem, NULL))
0767 goto port_found;
0768 } else {
0769
0770
0771
0772
0773
0774 for (pass=0; pass < 2; pass++)
0775 if (!pcmcia_loop_config(link, xirc2ps_config_check,
0776 &pass))
0777 goto port_found;
0778
0779
0780
0781 }
0782 pr_notice("no ports available\n");
0783 } else {
0784 link->io_lines = 10;
0785 link->resource[0]->end = 16;
0786 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
0787 for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
0788 link->resource[0]->start = ioaddr;
0789 if (!(err = pcmcia_request_io(link)))
0790 goto port_found;
0791 }
0792 link->resource[0]->start = 0;
0793 if ((err = pcmcia_request_io(link)))
0794 goto config_error;
0795 }
0796 port_found:
0797
0798
0799
0800
0801
0802 if ((err=pcmcia_request_irq(link, xirc2ps_interrupt)))
0803 goto config_error;
0804
0805 link->config_flags |= CONF_ENABLE_IRQ;
0806 if (do_sound)
0807 link->config_flags |= CONF_ENABLE_SPKR;
0808
0809 if ((err = pcmcia_enable_device(link)))
0810 goto config_error;
0811
0812 if (local->dingo) {
0813
0814
0815
0816
0817
0818 err = pcmcia_write_config_byte(link, CISREG_IOBASE_0, (u8)
0819 link->resource[1]->start & 0xff);
0820 if (err)
0821 goto config_error;
0822
0823 err = pcmcia_write_config_byte(link, CISREG_IOBASE_1,
0824 (link->resource[1]->start >> 8) & 0xff);
0825 if (err)
0826 goto config_error;
0827
0828
0829
0830
0831
0832 link->resource[2]->flags = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_AM |
0833 WIN_ENABLE;
0834 link->resource[2]->start = link->resource[2]->end = 0;
0835 if ((err = pcmcia_request_window(link, link->resource[2], 0)))
0836 goto config_error;
0837
0838 local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800;
0839 if ((err = pcmcia_map_mem_page(link, link->resource[2], 0)))
0840 goto config_error;
0841
0842
0843
0844
0845 writeb(0x47, local->dingo_ccr + CISREG_COR);
0846 ioaddr = link->resource[0]->start;
0847 writeb(ioaddr & 0xff , local->dingo_ccr + CISREG_IOBASE_0);
0848 writeb((ioaddr >> 8)&0xff , local->dingo_ccr + CISREG_IOBASE_1);
0849
0850 #if 0
0851 {
0852 u_char tmp;
0853 pr_info("ECOR:");
0854 for (i=0; i < 7; i++) {
0855 tmp = readb(local->dingo_ccr + i*2);
0856 pr_cont(" %02x", tmp);
0857 }
0858 pr_cont("\n");
0859 pr_info("DCOR:");
0860 for (i=0; i < 4; i++) {
0861 tmp = readb(local->dingo_ccr + 0x20 + i*2);
0862 pr_cont(" %02x", tmp);
0863 }
0864 pr_cont("\n");
0865 pr_info("SCOR:");
0866 for (i=0; i < 10; i++) {
0867 tmp = readb(local->dingo_ccr + 0x40 + i*2);
0868 pr_cont(" %02x", tmp);
0869 }
0870 pr_cont("\n");
0871 }
0872 #endif
0873
0874 writeb(0x01, local->dingo_ccr + 0x20);
0875 writeb(0x0c, local->dingo_ccr + 0x22);
0876 writeb(0x00, local->dingo_ccr + 0x24);
0877 writeb(0x00, local->dingo_ccr + 0x26);
0878 writeb(0x00, local->dingo_ccr + 0x28);
0879 }
0880
0881
0882 local->probe_port=0;
0883 if (!if_port) {
0884 local->probe_port = dev->if_port = 1;
0885 } else if ((if_port >= 1 && if_port <= 2) ||
0886 (local->mohawk && if_port==4))
0887 dev->if_port = if_port;
0888 else
0889 pr_notice("invalid if_port requested\n");
0890
0891
0892 dev->irq = link->irq;
0893 dev->base_addr = link->resource[0]->start;
0894
0895 if (local->dingo)
0896 do_reset(dev, 1);
0897
0898 SET_NETDEV_DEV(dev, &link->dev);
0899
0900 if ((err=register_netdev(dev))) {
0901 pr_notice("register_netdev() failed\n");
0902 goto config_error;
0903 }
0904
0905
0906 netdev_info(dev, "%s: port %#3lx, irq %d, hwaddr %pM\n",
0907 local->manf_str, (u_long)dev->base_addr, (int)dev->irq,
0908 dev->dev_addr);
0909
0910 return 0;
0911
0912 config_error:
0913 xirc2ps_release(link);
0914 return -ENODEV;
0915
0916 failure:
0917 return -ENODEV;
0918 }
0919
0920 static void
0921 xirc2ps_release(struct pcmcia_device *link)
0922 {
0923 dev_dbg(&link->dev, "release\n");
0924
0925 if (link->resource[2]->end) {
0926 struct net_device *dev = link->priv;
0927 struct local_info *local = netdev_priv(dev);
0928 if (local->dingo)
0929 iounmap(local->dingo_ccr - 0x0800);
0930 }
0931 pcmcia_disable_device(link);
0932 }
0933
0934
0935
0936
0937 static int xirc2ps_suspend(struct pcmcia_device *link)
0938 {
0939 struct net_device *dev = link->priv;
0940
0941 if (link->open) {
0942 netif_device_detach(dev);
0943 do_powerdown(dev);
0944 }
0945
0946 return 0;
0947 }
0948
0949 static int xirc2ps_resume(struct pcmcia_device *link)
0950 {
0951 struct net_device *dev = link->priv;
0952
0953 if (link->open) {
0954 do_reset(dev,1);
0955 netif_device_attach(dev);
0956 }
0957
0958 return 0;
0959 }
0960
0961
0962
0963
0964
0965
0966
0967 static irqreturn_t
0968 xirc2ps_interrupt(int irq, void *dev_id)
0969 {
0970 struct net_device *dev = (struct net_device *)dev_id;
0971 struct local_info *lp = netdev_priv(dev);
0972 unsigned int ioaddr;
0973 u_char saved_page;
0974 unsigned bytes_rcvd;
0975 unsigned int_status, eth_status, rx_status, tx_status;
0976 unsigned rsr, pktlen;
0977 ulong start_ticks = jiffies;
0978
0979
0980
0981
0982 if (!netif_device_present(dev))
0983 return IRQ_HANDLED;
0984
0985 ioaddr = dev->base_addr;
0986 if (lp->mohawk) {
0987 PutByte(XIRCREG_CR, 0);
0988 }
0989
0990 pr_debug("%s: interrupt %d at %#x.\n", dev->name, irq, ioaddr);
0991
0992 saved_page = GetByte(XIRCREG_PR);
0993
0994
0995
0996 int_status = GetByte(XIRCREG_ISR);
0997 bytes_rcvd = 0;
0998 loop_entry:
0999 if (int_status == 0xff) {
1000 pr_debug("%s: interrupt %d for dead card\n", dev->name, irq);
1001 goto leave;
1002 }
1003 eth_status = GetByte(XIRCREG_ESR);
1004
1005 SelectPage(0x40);
1006 rx_status = GetByte(XIRCREG40_RXST0);
1007 PutByte(XIRCREG40_RXST0, (~rx_status & 0xff));
1008 tx_status = GetByte(XIRCREG40_TXST0);
1009 tx_status |= GetByte(XIRCREG40_TXST1) << 8;
1010 PutByte(XIRCREG40_TXST0, 0);
1011 PutByte(XIRCREG40_TXST1, 0);
1012
1013 pr_debug("%s: ISR=%#2.2x ESR=%#2.2x RSR=%#2.2x TSR=%#4.4x\n",
1014 dev->name, int_status, eth_status, rx_status, tx_status);
1015
1016
1017 SelectPage(0);
1018 while (eth_status & FullPktRcvd) {
1019 rsr = GetByte(XIRCREG0_RSR);
1020 if (bytes_rcvd > maxrx_bytes && (rsr & PktRxOk)) {
1021
1022
1023 dev->stats.rx_dropped++;
1024 pr_debug("%s: RX drop, too much done\n", dev->name);
1025 } else if (rsr & PktRxOk) {
1026 struct sk_buff *skb;
1027
1028 pktlen = GetWord(XIRCREG0_RBC);
1029 bytes_rcvd += pktlen;
1030
1031 pr_debug("rsr=%#02x packet_length=%u\n", rsr, pktlen);
1032
1033
1034 skb = netdev_alloc_skb(dev, pktlen + 3);
1035 if (!skb) {
1036 dev->stats.rx_dropped++;
1037 } else {
1038 skb_reserve(skb, 2);
1039 if (lp->silicon == 0 ) {
1040 unsigned rhsa;
1041
1042 SelectPage(5);
1043 rhsa = GetWord(XIRCREG5_RHSA0);
1044 SelectPage(0);
1045 rhsa += 3;
1046 if (rhsa >= 0x8000)
1047 rhsa = 0;
1048 if (rhsa + pktlen > 0x8000) {
1049 unsigned i;
1050 u_char *buf = skb_put(skb, pktlen);
1051 for (i=0; i < pktlen ; i++, rhsa++) {
1052 buf[i] = GetByte(XIRCREG_EDP);
1053 if (rhsa == 0x8000) {
1054 rhsa = 0;
1055 i--;
1056 }
1057 }
1058 } else {
1059 insw(ioaddr+XIRCREG_EDP,
1060 skb_put(skb, pktlen), (pktlen+1)>>1);
1061 }
1062 }
1063 #if 0
1064 else if (lp->mohawk) {
1065
1066
1067
1068
1069
1070
1071
1072
1073 unsigned i;
1074 u_long *p = skb_put(skb, pktlen);
1075 register u_long a;
1076 unsigned int edpreg = ioaddr+XIRCREG_EDP-2;
1077 for (i=0; i < len ; i += 4, p++) {
1078 a = inl(edpreg);
1079 __asm__("rorl $16,%0\n\t"
1080 :"=q" (a)
1081 : "0" (a));
1082 *p = a;
1083 }
1084 }
1085 #endif
1086 else {
1087 insw(ioaddr+XIRCREG_EDP, skb_put(skb, pktlen),
1088 (pktlen+1)>>1);
1089 }
1090 skb->protocol = eth_type_trans(skb, dev);
1091 netif_rx(skb);
1092 dev->stats.rx_packets++;
1093 dev->stats.rx_bytes += pktlen;
1094 if (!(rsr & PhyPkt))
1095 dev->stats.multicast++;
1096 }
1097 } else {
1098 pr_debug("rsr=%#02x\n", rsr);
1099 }
1100 if (rsr & PktTooLong) {
1101 dev->stats.rx_frame_errors++;
1102 pr_debug("%s: Packet too long\n", dev->name);
1103 }
1104 if (rsr & CRCErr) {
1105 dev->stats.rx_crc_errors++;
1106 pr_debug("%s: CRC error\n", dev->name);
1107 }
1108 if (rsr & AlignErr) {
1109 dev->stats.rx_fifo_errors++;
1110 pr_debug("%s: Alignment error\n", dev->name);
1111 }
1112
1113
1114 PutWord(XIRCREG0_DO, 0x8000);
1115
1116
1117 eth_status = GetByte(XIRCREG_ESR);
1118 }
1119 if (rx_status & 0x10) {
1120 dev->stats.rx_over_errors++;
1121 PutByte(XIRCREG_CR, ClearRxOvrun);
1122 pr_debug("receive overrun cleared\n");
1123 }
1124
1125
1126 if (int_status & PktTxed) {
1127 unsigned n, nn;
1128
1129 n = lp->last_ptr_value;
1130 nn = GetByte(XIRCREG0_PTR);
1131 lp->last_ptr_value = nn;
1132 if (nn < n)
1133 dev->stats.tx_packets += 256 - n;
1134 else if (n == nn) {
1135 pr_debug("PTR not changed?\n");
1136 } else
1137 dev->stats.tx_packets += lp->last_ptr_value - n;
1138 netif_wake_queue(dev);
1139 }
1140 if (tx_status & 0x0002) {
1141 pr_debug("tx restarted due to excessive collisions\n");
1142 PutByte(XIRCREG_CR, RestartTx);
1143 }
1144 if (tx_status & 0x0040)
1145 dev->stats.tx_aborted_errors++;
1146
1147
1148
1149
1150
1151 if (bytes_rcvd > 1000) {
1152 u_long duration = jiffies - start_ticks;
1153
1154 if (duration >= HZ/10) {
1155 maxrx_bytes = (bytes_rcvd * (HZ/10)) / duration;
1156 if (maxrx_bytes < 2000)
1157 maxrx_bytes = 2000;
1158 else if (maxrx_bytes > 22000)
1159 maxrx_bytes = 22000;
1160 pr_debug("set maxrx=%u (rcvd=%u ticks=%lu)\n",
1161 maxrx_bytes, bytes_rcvd, duration);
1162 } else if (!duration && maxrx_bytes < 22000) {
1163
1164 maxrx_bytes += 2000;
1165 if (maxrx_bytes > 22000)
1166 maxrx_bytes = 22000;
1167 pr_debug("set maxrx=%u\n", maxrx_bytes);
1168 }
1169 }
1170
1171 leave:
1172 if (lockup_hack) {
1173 if (int_status != 0xff && (int_status = GetByte(XIRCREG_ISR)) != 0)
1174 goto loop_entry;
1175 }
1176 SelectPage(saved_page);
1177 PutByte(XIRCREG_CR, EnableIntr);
1178
1179
1180
1181
1182 return IRQ_HANDLED;
1183 }
1184
1185
1186
1187 static void
1188 xirc2ps_tx_timeout_task(struct work_struct *work)
1189 {
1190 struct local_info *local =
1191 container_of(work, struct local_info, tx_timeout_task);
1192 struct net_device *dev = local->dev;
1193
1194 do_reset(dev,1);
1195 netif_trans_update(dev);
1196 netif_wake_queue(dev);
1197 }
1198
1199 static void
1200 xirc_tx_timeout(struct net_device *dev, unsigned int txqueue)
1201 {
1202 struct local_info *lp = netdev_priv(dev);
1203 dev->stats.tx_errors++;
1204 netdev_notice(dev, "transmit timed out\n");
1205 schedule_work(&lp->tx_timeout_task);
1206 }
1207
1208 static netdev_tx_t
1209 do_start_xmit(struct sk_buff *skb, struct net_device *dev)
1210 {
1211 struct local_info *lp = netdev_priv(dev);
1212 unsigned int ioaddr = dev->base_addr;
1213 int okay;
1214 unsigned freespace;
1215 unsigned pktlen = skb->len;
1216
1217 pr_debug("do_start_xmit(skb=%p, dev=%p) len=%u\n",
1218 skb, dev, pktlen);
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228 if (pktlen < ETH_ZLEN)
1229 {
1230 if (skb_padto(skb, ETH_ZLEN))
1231 return NETDEV_TX_OK;
1232 pktlen = ETH_ZLEN;
1233 }
1234
1235 netif_stop_queue(dev);
1236 SelectPage(0);
1237 PutWord(XIRCREG0_TRS, (u_short)pktlen+2);
1238 freespace = GetWord(XIRCREG0_TSO);
1239 okay = freespace & 0x8000;
1240 freespace &= 0x7fff;
1241
1242 okay = pktlen +2 < freespace;
1243 pr_debug("%s: avail. tx space=%u%s\n",
1244 dev->name, freespace, okay ? " (okay)":" (not enough)");
1245 if (!okay) {
1246 return NETDEV_TX_BUSY;
1247 }
1248
1249 PutWord(XIRCREG_EDP, (u_short)pktlen);
1250 outsw(ioaddr+XIRCREG_EDP, skb->data, pktlen>>1);
1251 if (pktlen & 1)
1252 PutByte(XIRCREG_EDP, skb->data[pktlen-1]);
1253
1254 if (lp->mohawk)
1255 PutByte(XIRCREG_CR, TransmitPacket|EnableIntr);
1256
1257 dev_kfree_skb (skb);
1258 dev->stats.tx_bytes += pktlen;
1259 netif_start_queue(dev);
1260 return NETDEV_TX_OK;
1261 }
1262
1263 struct set_address_info {
1264 int reg_nr;
1265 int page_nr;
1266 int mohawk;
1267 unsigned int ioaddr;
1268 };
1269
1270 static void set_address(struct set_address_info *sa_info, const char *addr)
1271 {
1272 unsigned int ioaddr = sa_info->ioaddr;
1273 int i;
1274
1275 for (i = 0; i < 6; i++) {
1276 if (sa_info->reg_nr > 15) {
1277 sa_info->reg_nr = 8;
1278 sa_info->page_nr++;
1279 SelectPage(sa_info->page_nr);
1280 }
1281 if (sa_info->mohawk)
1282 PutByte(sa_info->reg_nr++, addr[5 - i]);
1283 else
1284 PutByte(sa_info->reg_nr++, addr[i]);
1285 }
1286 }
1287
1288
1289
1290
1291
1292
1293 static void set_addresses(struct net_device *dev)
1294 {
1295 unsigned int ioaddr = dev->base_addr;
1296 struct local_info *lp = netdev_priv(dev);
1297 struct netdev_hw_addr *ha;
1298 struct set_address_info sa_info;
1299 int i;
1300
1301
1302
1303
1304
1305 sa_info.reg_nr = 15 + 1;
1306 sa_info.page_nr = 0x50 - 1;
1307 sa_info.mohawk = lp->mohawk;
1308 sa_info.ioaddr = ioaddr;
1309
1310 set_address(&sa_info, dev->dev_addr);
1311 i = 0;
1312 netdev_for_each_mc_addr(ha, dev) {
1313 if (i++ == 9)
1314 break;
1315 set_address(&sa_info, ha->addr);
1316 }
1317 while (i++ < 9)
1318 set_address(&sa_info, dev->dev_addr);
1319 SelectPage(0);
1320 }
1321
1322
1323
1324
1325
1326
1327
1328 static void
1329 set_multicast_list(struct net_device *dev)
1330 {
1331 unsigned int ioaddr = dev->base_addr;
1332 unsigned value;
1333
1334 SelectPage(0x42);
1335 value = GetByte(XIRCREG42_SWC1) & 0xC0;
1336
1337 if (dev->flags & IFF_PROMISC) {
1338 PutByte(XIRCREG42_SWC1, value | 0x06);
1339 } else if (netdev_mc_count(dev) > 9 || (dev->flags & IFF_ALLMULTI)) {
1340 PutByte(XIRCREG42_SWC1, value | 0x02);
1341 } else if (!netdev_mc_empty(dev)) {
1342
1343 PutByte(XIRCREG42_SWC1, value | 0x01);
1344 SelectPage(0x40);
1345 PutByte(XIRCREG40_CMD0, Offline);
1346 set_addresses(dev);
1347 SelectPage(0x40);
1348 PutByte(XIRCREG40_CMD0, EnableRecv | Online);
1349 } else {
1350 PutByte(XIRCREG42_SWC1, value | 0x00);
1351 }
1352 SelectPage(0);
1353 }
1354
1355 static int
1356 do_config(struct net_device *dev, struct ifmap *map)
1357 {
1358 struct local_info *local = netdev_priv(dev);
1359
1360 pr_debug("do_config(%p)\n", dev);
1361 if (map->port != 255 && map->port != dev->if_port) {
1362 if (map->port > 4)
1363 return -EINVAL;
1364 if (!map->port) {
1365 local->probe_port = 1;
1366 dev->if_port = 1;
1367 } else {
1368 local->probe_port = 0;
1369 dev->if_port = map->port;
1370 }
1371 netdev_info(dev, "switching to %s port\n", if_names[dev->if_port]);
1372 do_reset(dev,1);
1373 }
1374 return 0;
1375 }
1376
1377
1378
1379
1380 static int
1381 do_open(struct net_device *dev)
1382 {
1383 struct local_info *lp = netdev_priv(dev);
1384 struct pcmcia_device *link = lp->p_dev;
1385
1386 dev_dbg(&link->dev, "do_open(%p)\n", dev);
1387
1388
1389
1390 if (!pcmcia_dev_present(link))
1391 return -ENODEV;
1392
1393
1394 link->open++;
1395
1396 netif_start_queue(dev);
1397 do_reset(dev,1);
1398
1399 return 0;
1400 }
1401
1402 static void netdev_get_drvinfo(struct net_device *dev,
1403 struct ethtool_drvinfo *info)
1404 {
1405 strlcpy(info->driver, "xirc2ps_cs", sizeof(info->driver));
1406 snprintf(info->bus_info, sizeof(info->bus_info), "PCMCIA 0x%lx",
1407 dev->base_addr);
1408 }
1409
1410 static const struct ethtool_ops netdev_ethtool_ops = {
1411 .get_drvinfo = netdev_get_drvinfo,
1412 };
1413
1414 static int
1415 do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1416 {
1417 struct local_info *local = netdev_priv(dev);
1418 unsigned int ioaddr = dev->base_addr;
1419 struct mii_ioctl_data *data = if_mii(rq);
1420
1421 pr_debug("%s: ioctl(%-.6s, %#04x) %04x %04x %04x %04x\n",
1422 dev->name, rq->ifr_ifrn.ifrn_name, cmd,
1423 data->phy_id, data->reg_num, data->val_in, data->val_out);
1424
1425 if (!local->mohawk)
1426 return -EOPNOTSUPP;
1427
1428 switch(cmd) {
1429 case SIOCGMIIPHY:
1430 data->phy_id = 0;
1431 fallthrough;
1432 case SIOCGMIIREG:
1433 data->val_out = mii_rd(ioaddr, data->phy_id & 0x1f,
1434 data->reg_num & 0x1f);
1435 break;
1436 case SIOCSMIIREG:
1437 mii_wr(ioaddr, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in,
1438 16);
1439 break;
1440 default:
1441 return -EOPNOTSUPP;
1442 }
1443 return 0;
1444 }
1445
1446 static void
1447 hardreset(struct net_device *dev)
1448 {
1449 struct local_info *local = netdev_priv(dev);
1450 unsigned int ioaddr = dev->base_addr;
1451
1452 SelectPage(4);
1453 udelay(1);
1454 PutByte(XIRCREG4_GPR1, 0);
1455 msleep(40);
1456 if (local->mohawk)
1457 PutByte(XIRCREG4_GPR1, 1);
1458 else
1459 PutByte(XIRCREG4_GPR1, 1 | 4);
1460 msleep(20);
1461 }
1462
1463 static void
1464 do_reset(struct net_device *dev, int full)
1465 {
1466 struct local_info *local = netdev_priv(dev);
1467 unsigned int ioaddr = dev->base_addr;
1468 unsigned value;
1469
1470 pr_debug("%s: do_reset(%p,%d)\n", dev->name, dev, full);
1471
1472 hardreset(dev);
1473 PutByte(XIRCREG_CR, SoftReset);
1474 msleep(20);
1475 PutByte(XIRCREG_CR, 0);
1476 msleep(40);
1477 if (local->mohawk) {
1478 SelectPage(4);
1479
1480
1481
1482
1483 PutByte(XIRCREG4_GPR0, 0x0e);
1484 }
1485
1486
1487 msleep(500);
1488
1489 local->last_ptr_value = 0;
1490 local->silicon = local->mohawk ? (GetByte(XIRCREG4_BOV) & 0x70) >> 4
1491 : (GetByte(XIRCREG4_BOV) & 0x30) >> 4;
1492
1493 if (local->probe_port) {
1494 if (!local->mohawk) {
1495 SelectPage(4);
1496 PutByte(XIRCREG4_GPR0, 4);
1497 local->probe_port = 0;
1498 }
1499 } else if (dev->if_port == 2) {
1500 SelectPage(0x42);
1501 PutByte(XIRCREG42_SWC1, 0xC0);
1502 } else {
1503 SelectPage(0x42);
1504 PutByte(XIRCREG42_SWC1, 0x80);
1505 }
1506 msleep(40);
1507
1508 #if 0
1509 {
1510 SelectPage(0);
1511 value = GetByte(XIRCREG_ESR);
1512 pr_debug("%s: ESR is: %#02x\n", dev->name, value);
1513 }
1514 #endif
1515
1516
1517 SelectPage(1);
1518 PutByte(XIRCREG1_IMR0, 0xff);
1519 PutByte(XIRCREG1_IMR1, 1 );
1520 value = GetByte(XIRCREG1_ECR);
1521 #if 0
1522 if (local->mohawk)
1523 value |= DisableLinkPulse;
1524 PutByte(XIRCREG1_ECR, value);
1525 #endif
1526 pr_debug("%s: ECR is: %#02x\n", dev->name, value);
1527
1528 SelectPage(0x42);
1529 PutByte(XIRCREG42_SWC0, 0x20);
1530
1531 if (local->silicon != 1) {
1532
1533
1534
1535
1536
1537 SelectPage(2);
1538 PutWord(XIRCREG2_RBS, 0x2000);
1539 }
1540
1541 if (full)
1542 set_addresses(dev);
1543
1544
1545
1546
1547
1548 SelectPage(0);
1549 PutWord(XIRCREG0_DO, 0x2000);
1550
1551
1552 SelectPage(0x40);
1553 PutByte(XIRCREG40_RMASK0, 0xff);
1554 PutByte(XIRCREG40_TMASK0, 0xff);
1555 PutByte(XIRCREG40_TMASK1, 0xb0);
1556 PutByte(XIRCREG40_RXST0, 0x00);
1557 PutByte(XIRCREG40_TXST0, 0x00);
1558 PutByte(XIRCREG40_TXST1, 0x00);
1559
1560 if (full && local->mohawk && init_mii(dev)) {
1561 if (dev->if_port == 4 || local->dingo || local->new_mii) {
1562 netdev_info(dev, "MII selected\n");
1563 SelectPage(2);
1564 PutByte(XIRCREG2_MSR, GetByte(XIRCREG2_MSR) | 0x08);
1565 msleep(20);
1566 } else {
1567 netdev_info(dev, "MII detected; using 10mbs\n");
1568 SelectPage(0x42);
1569 if (dev->if_port == 2)
1570 PutByte(XIRCREG42_SWC1, 0xC0);
1571 else
1572 PutByte(XIRCREG42_SWC1, 0x80);
1573 msleep(40);
1574 }
1575 if (full_duplex)
1576 PutByte(XIRCREG1_ECR, GetByte(XIRCREG1_ECR | FullDuplex));
1577 } else {
1578 SelectPage(0);
1579 value = GetByte(XIRCREG_ESR);
1580 dev->if_port = (value & MediaSelect) ? 1 : 2;
1581 }
1582
1583
1584 SelectPage(2);
1585 if (dev->if_port == 1 || dev->if_port == 4)
1586 PutByte(XIRCREG2_LED, 0x3b);
1587 else
1588 PutByte(XIRCREG2_LED, 0x3a);
1589
1590 if (local->dingo)
1591 PutByte(0x0b, 0x04);
1592
1593
1594 if (full) {
1595 set_multicast_list(dev);
1596 SelectPage(0x40);
1597 PutByte(XIRCREG40_CMD0, EnableRecv | Online);
1598 }
1599
1600
1601 SelectPage(1);
1602 PutByte(XIRCREG1_IMR0, 0xff);
1603 udelay(1);
1604 SelectPage(0);
1605 PutByte(XIRCREG_CR, EnableIntr);
1606 if (local->modem && !local->dingo) {
1607 if (!(GetByte(0x10) & 0x01))
1608 PutByte(0x10, 0x11);
1609 }
1610
1611 if (full)
1612 netdev_info(dev, "media %s, silicon revision %d\n",
1613 if_names[dev->if_port], local->silicon);
1614
1615
1616
1617 SelectPage(0);
1618 }
1619
1620
1621
1622
1623
1624 static int
1625 init_mii(struct net_device *dev)
1626 {
1627 struct local_info *local = netdev_priv(dev);
1628 unsigned int ioaddr = dev->base_addr;
1629 unsigned control, status, linkpartner;
1630 int i;
1631
1632 if (if_port == 4 || if_port == 1) {
1633 dev->if_port = if_port;
1634 local->probe_port = 0;
1635 return 1;
1636 }
1637
1638 status = mii_rd(ioaddr, 0, 1);
1639 if ((status & 0xff00) != 0x7800)
1640 return 0;
1641
1642 local->new_mii = (mii_rd(ioaddr, 0, 2) != 0xffff);
1643
1644 if (local->probe_port)
1645 control = 0x1000;
1646 else if (dev->if_port == 4)
1647 control = 0x2000;
1648 else
1649 control = 0x0000;
1650 mii_wr(ioaddr, 0, 0, control, 16);
1651 udelay(100);
1652 control = mii_rd(ioaddr, 0, 0);
1653
1654 if (control & 0x0400) {
1655 netdev_notice(dev, "can't take PHY out of isolation mode\n");
1656 local->probe_port = 0;
1657 return 0;
1658 }
1659
1660 if (local->probe_port) {
1661
1662
1663
1664
1665 for (i=0; i < 35; i++) {
1666 msleep(100);
1667 status = mii_rd(ioaddr, 0, 1);
1668 if ((status & 0x0020) && (status & 0x0004))
1669 break;
1670 }
1671
1672 if (!(status & 0x0020)) {
1673 netdev_info(dev, "autonegotiation failed; using 10mbs\n");
1674 if (!local->new_mii) {
1675 control = 0x0000;
1676 mii_wr(ioaddr, 0, 0, control, 16);
1677 udelay(100);
1678 SelectPage(0);
1679 dev->if_port = (GetByte(XIRCREG_ESR) & MediaSelect) ? 1 : 2;
1680 }
1681 } else {
1682 linkpartner = mii_rd(ioaddr, 0, 5);
1683 netdev_info(dev, "MII link partner: %04x\n", linkpartner);
1684 if (linkpartner & 0x0080) {
1685 dev->if_port = 4;
1686 } else
1687 dev->if_port = 1;
1688 }
1689 }
1690
1691 return 1;
1692 }
1693
1694 static void
1695 do_powerdown(struct net_device *dev)
1696 {
1697
1698 unsigned int ioaddr = dev->base_addr;
1699
1700 pr_debug("do_powerdown(%p)\n", dev);
1701
1702 SelectPage(4);
1703 PutByte(XIRCREG4_GPR1, 0);
1704 SelectPage(0);
1705 }
1706
1707 static int
1708 do_stop(struct net_device *dev)
1709 {
1710 unsigned int ioaddr = dev->base_addr;
1711 struct local_info *lp = netdev_priv(dev);
1712 struct pcmcia_device *link = lp->p_dev;
1713
1714 dev_dbg(&link->dev, "do_stop(%p)\n", dev);
1715
1716 if (!link)
1717 return -ENODEV;
1718
1719 netif_stop_queue(dev);
1720
1721 SelectPage(0);
1722 PutByte(XIRCREG_CR, 0);
1723 SelectPage(0x01);
1724 PutByte(XIRCREG1_IMR0, 0x00);
1725 SelectPage(4);
1726 PutByte(XIRCREG4_GPR1, 0);
1727 SelectPage(0);
1728
1729 link->open--;
1730 return 0;
1731 }
1732
1733 static const struct pcmcia_device_id xirc2ps_ids[] = {
1734 PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0089, 0x110a),
1735 PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0138, 0x110a),
1736 PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea),
1737 PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "CEM33", 0x2e3ee845, 0x80609023),
1738 PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a),
1739 PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29),
1740 PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719),
1741 PCMCIA_PFC_DEVICE_PROD_ID12(0, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),
1742 PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x010a),
1743 PCMCIA_DEVICE_PROD_ID13("Toshiba Information Systems", "TPCENET", 0x1b3b94fe, 0xf381c1a2),
1744 PCMCIA_DEVICE_PROD_ID13("Xircom", "CE3-10/100", 0x2e3ee845, 0x0ec0ac37),
1745 PCMCIA_DEVICE_PROD_ID13("Xircom", "PS-CE2-10", 0x2e3ee845, 0x947d9073),
1746 PCMCIA_DEVICE_PROD_ID13("Xircom", "R2E-100BTX", 0x2e3ee845, 0x2464a6e3),
1747 PCMCIA_DEVICE_PROD_ID13("Xircom", "RE-10", 0x2e3ee845, 0x3e08d609),
1748 PCMCIA_DEVICE_PROD_ID13("Xircom", "XE2000", 0x2e3ee845, 0xf7188e46),
1749 PCMCIA_DEVICE_PROD_ID12("Compaq", "Ethernet LAN Card", 0x54f7c49c, 0x9fd2f0a2),
1750 PCMCIA_DEVICE_PROD_ID12("Compaq", "Netelligent 10/100 PC Card", 0x54f7c49c, 0xefe96769),
1751 PCMCIA_DEVICE_PROD_ID12("Intel", "EtherExpress(TM) PRO/100 PC Card Mobile Adapter16", 0x816cc815, 0x174397db),
1752 PCMCIA_DEVICE_PROD_ID12("Toshiba", "10/100 Ethernet PC Card", 0x44a09d9c, 0xb44deecf),
1753
1754
1755 PCMCIA_DEVICE_NULL,
1756 };
1757 MODULE_DEVICE_TABLE(pcmcia, xirc2ps_ids);
1758
1759
1760 static struct pcmcia_driver xirc2ps_cs_driver = {
1761 .owner = THIS_MODULE,
1762 .name = "xirc2ps_cs",
1763 .probe = xirc2ps_probe,
1764 .remove = xirc2ps_detach,
1765 .id_table = xirc2ps_ids,
1766 .suspend = xirc2ps_suspend,
1767 .resume = xirc2ps_resume,
1768 };
1769 module_pcmcia_driver(xirc2ps_cs_driver);
1770
1771 #ifndef MODULE
1772 static int __init setup_xirc2ps_cs(char *str)
1773 {
1774
1775
1776 int ints[10] = { -1 };
1777
1778 str = get_options(str, ARRAY_SIZE(ints), ints);
1779
1780 #define MAYBE_SET(X,Y) if (ints[0] >= Y && ints[Y] != -1) { X = ints[Y]; }
1781 MAYBE_SET(if_port, 3);
1782 MAYBE_SET(full_duplex, 4);
1783 MAYBE_SET(do_sound, 5);
1784 MAYBE_SET(lockup_hack, 6);
1785 #undef MAYBE_SET
1786
1787 return 1;
1788 }
1789
1790 __setup("xirc2ps_cs=", setup_xirc2ps_cs);
1791 #endif