OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [net/] [pcmcia/] [xirc2ps_cs.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/* [xirc2ps_cs.c wk 03.11.99] (1.40 1999/11/18 00:06:03)
2
 * Xircom CreditCard Ethernet Adapter IIps driver
3
 * Xircom Realport 10/100 (RE-100) driver
4
 *
5
 * This driver supports various Xircom CreditCard Ethernet adapters
6
 * including the CE2, CE IIps, RE-10, CEM28, CEM33, CE33, CEM56,
7
 * CE3-100, CE3B, RE-100, REM10BT, and REM56G-100.
8
 *
9
 * 2000-09-24 <psheer@icon.co.za> The Xircom CE3B-100 may not
10
 * autodetect the media properly. In this case use the
11
 * if_port=1 (for 10BaseT) or if_port=4 (for 100BaseT) options
12
 * to force the media type.
13
 *
14
 * Written originally by Werner Koch based on David Hinds' skeleton of the
15
 * PCMCIA driver.
16
 *
17
 * Copyright (c) 1997,1998 Werner Koch (dd9jn)
18
 *
19
 * This driver is free software; you can redistribute it and/or modify
20
 * it under the terms of the GNU General Public License as published by
21
 * the Free Software Foundation; either version 2 of the License, or
22
 * (at your option) any later version.
23
 *
24
 * It is distributed in the hope that it will be useful,
25
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27
 * GNU General Public License for more details.
28
 *
29
 * You should have received a copy of the GNU General Public License
30
 * along with this program; if not, write to the Free Software
31
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
32
 *
33
 *
34
 * ALTERNATIVELY, this driver may be distributed under the terms of
35
 * the following license, in which case the provisions of this license
36
 * are required INSTEAD OF the GNU General Public License.  (This clause
37
 * is necessary due to a potential bad interaction between the GPL and
38
 * the restrictions contained in a BSD-style copyright.)
39
 *
40
 * Redistribution and use in source and binary forms, with or without
41
 * modification, are permitted provided that the following conditions
42
 * are met:
43
 * 1. Redistributions of source code must retain the above copyright
44
 *    notice, and the entire permission notice in its entirety,
45
 *    including the disclaimer of warranties.
46
 * 2. Redistributions in binary form must reproduce the above copyright
47
 *    notice, this list of conditions and the following disclaimer in the
48
 *    documentation and/or other materials provided with the distribution.
49
 * 3. The name of the author may not be used to endorse or promote
50
 *    products derived from this software without specific prior
51
 *    written permission.
52
 *
53
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
54
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
55
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
56
 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
57
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
58
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
59
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
60
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
61
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
62
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
63
 * OF THE POSSIBILITY OF SUCH DAMAGE.
64
 */
65
 
66
#include <linux/module.h>
67
#include <linux/kernel.h>
68
#include <linux/init.h>
69
#include <linux/ptrace.h>
70
#include <linux/slab.h>
71
#include <linux/string.h>
72
#include <linux/timer.h>
73
#include <linux/interrupt.h>
74
#include <linux/in.h>
75
#include <linux/delay.h>
76
#include <linux/ethtool.h>
77
#include <linux/netdevice.h>
78
#include <linux/etherdevice.h>
79
#include <linux/skbuff.h>
80
#include <linux/if_arp.h>
81
#include <linux/ioport.h>
82
#include <linux/bitops.h>
83
 
84
#include <pcmcia/cs_types.h>
85
#include <pcmcia/cs.h>
86
#include <pcmcia/cistpl.h>
87
#include <pcmcia/cisreg.h>
88
#include <pcmcia/ciscode.h>
89
 
90
#include <asm/io.h>
91
#include <asm/system.h>
92
#include <asm/uaccess.h>
93
 
94
#ifndef MANFID_COMPAQ
95
  #define MANFID_COMPAQ            0x0138
96
  #define MANFID_COMPAQ2           0x0183  /* is this correct? */
97
#endif
98
 
99
#include <pcmcia/ds.h>
100
 
101
/* Time in jiffies before concluding Tx hung */
102
#define TX_TIMEOUT      ((400*HZ)/1000)
103
 
104
/****************
105
 * Some constants used to access the hardware
106
 */
107
 
108
/* Register offsets and value constans */
109
#define XIRCREG_CR  0   /* Command register (wr) */
110
enum xirc_cr {
111
    TransmitPacket = 0x01,
112
    SoftReset = 0x02,
113
    EnableIntr = 0x04,
114
    ForceIntr  = 0x08,
115
    ClearTxFIFO = 0x10,
116
    ClearRxOvrun = 0x20,
117
    RestartTx    = 0x40
118
};
119
#define XIRCREG_ESR 0   /* Ethernet status register (rd) */
120
enum xirc_esr {
121
    FullPktRcvd = 0x01, /* full packet in receive buffer */
122
    PktRejected = 0x04, /* a packet has been rejected */
123
    TxPktPend = 0x08,   /* TX Packet Pending */
124
    IncorPolarity = 0x10,
125
    MediaSelect = 0x20  /* set if TP, clear if AUI */
126
};
127
#define XIRCREG_PR  1   /* Page Register select */
128
#define XIRCREG_EDP 4   /* Ethernet Data Port Register */
129
#define XIRCREG_ISR 6   /* Ethernet Interrupt Status Register */
130
enum xirc_isr {
131
    TxBufOvr = 0x01,    /* TX Buffer Overflow */
132
    PktTxed  = 0x02,    /* Packet Transmitted */
133
    MACIntr  = 0x04,    /* MAC Interrupt occurred */
134
    TxResGrant = 0x08,  /* Tx Reservation Granted */
135
    RxFullPkt = 0x20,   /* Rx Full Packet */
136
    RxPktRej  = 0x40,   /* Rx Packet Rejected */
137
    ForcedIntr= 0x80    /* Forced Interrupt */
138
};
139
#define XIRCREG1_IMR0 12 /* Ethernet Interrupt Mask Register (on page 1)*/
140
#define XIRCREG1_IMR1 13
141
#define XIRCREG0_TSO  8  /* Transmit Space Open Register (on page 0)*/
142
#define XIRCREG0_TRS  10 /* Transmit reservation Size Register (page 0)*/
143
#define XIRCREG0_DO   12 /* Data Offset Register (page 0) (wr) */
144
#define XIRCREG0_RSR  12 /* Receive Status Register (page 0) (rd) */
145
enum xirc_rsr {
146
    PhyPkt = 0x01,      /* set:physical packet, clear: multicast packet */
147
    BrdcstPkt = 0x02,   /* set if it is a broadcast packet */
148
    PktTooLong = 0x04,  /* set if packet length > 1518 */
149
    AlignErr = 0x10,    /* incorrect CRC and last octet not complete */
150
    CRCErr = 0x20,      /* incorrect CRC and last octet is complete */
151
    PktRxOk = 0x80      /* received ok */
152
};
153
#define XIRCREG0_PTR 13 /* packets transmitted register (rd) */
154
#define XIRCREG0_RBC 14 /* receive byte count regsister (rd) */
155
#define XIRCREG1_ECR 14 /* ethernet configurationn register */
156
enum xirc_ecr {
157
    FullDuplex = 0x04,  /* enable full duplex mode */
158
    LongTPMode = 0x08,  /* adjust for longer lengths of TP cable */
159
    DisablePolCor = 0x10,/* disable auto polarity correction */
160
    DisableLinkPulse = 0x20, /* disable link pulse generation */
161
    DisableAutoTx = 0x40, /* disable auto-transmit */
162
};
163
#define XIRCREG2_RBS 8  /* receive buffer start register */
164
#define XIRCREG2_LED 10 /* LED Configuration register */
165
/* values for the leds:    Bits 2-0 for led 1
166
 *  0 disabled             Bits 5-3 for led 2
167
 *  1 collision
168
 *  2 noncollision
169
 *  3 link_detected
170
 *  4 incor_polarity
171
 *  5 jabber
172
 *  6 auto_assertion
173
 *  7 rx_tx_activity
174
 */
175
#define XIRCREG2_MSR 12 /* Mohawk specific register */
176
 
177
#define XIRCREG4_GPR0 8 /* General Purpose Register 0 */
178
#define XIRCREG4_GPR1 9 /* General Purpose Register 1 */
179
#define XIRCREG2_GPR2 13 /* General Purpose Register 2 (page2!)*/
180
#define XIRCREG4_BOV 10 /* Bonding Version Register */
181
#define XIRCREG4_LMA 12 /* Local Memory Address Register */
182
#define XIRCREG4_LMD 14 /* Local Memory Data Port */
183
/* MAC register can only by accessed with 8 bit operations */
184
#define XIRCREG40_CMD0 8    /* Command Register (wr) */
185
enum xirc_cmd {             /* Commands */
186
    Transmit = 0x01,
187
    EnableRecv = 0x04,
188
    DisableRecv = 0x08,
189
    Abort = 0x10,
190
    Online = 0x20,
191
    IntrAck = 0x40,
192
    Offline = 0x80
193
};
194
#define XIRCREG5_RHSA0  10  /* Rx Host Start Address */
195
#define XIRCREG40_RXST0 9   /* Receive Status Register */
196
#define XIRCREG40_TXST0 11  /* Transmit Status Register 0 */
197
#define XIRCREG40_TXST1 12  /* Transmit Status Register 10 */
198
#define XIRCREG40_RMASK0 13  /* Receive Mask Register */
199
#define XIRCREG40_TMASK0 14  /* Transmit Mask Register 0 */
200
#define XIRCREG40_TMASK1 15  /* Transmit Mask Register 0 */
201
#define XIRCREG42_SWC0  8   /* Software Configuration 0 */
202
#define XIRCREG42_SWC1  9   /* Software Configuration 1 */
203
#define XIRCREG42_BOC   10  /* Back-Off Configuration */
204
#define XIRCREG44_TDR0  8   /* Time Domain Reflectometry 0 */
205
#define XIRCREG44_TDR1  9   /* Time Domain Reflectometry 1 */
206
#define XIRCREG44_RXBC_LO 10 /* Rx Byte Count 0 (rd) */
207
#define XIRCREG44_RXBC_HI 11 /* Rx Byte Count 1 (rd) */
208
#define XIRCREG45_REV    15 /* Revision Register (rd) */
209
#define XIRCREG50_IA    8   /* Individual Address (8-13) */
210
 
211
static const char *if_names[] = { "Auto", "10BaseT", "10Base2", "AUI", "100BaseT" };
212
 
213
/****************
214
 * All the PCMCIA modules use PCMCIA_DEBUG to control debugging.  If
215
 * you do not define PCMCIA_DEBUG at all, all the debug code will be
216
 * left out.  If you compile with PCMCIA_DEBUG=0, the debug code will
217
 * be present but disabled -- but it can then be enabled for specific
218
 * modules at load time with a 'pc_debug=#' option to insmod.
219
 */
220
#ifdef PCMCIA_DEBUG
221
static int pc_debug = PCMCIA_DEBUG;
222
module_param(pc_debug, int, 0);
223
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KDBG_XIRC args)
224
#else
225
#define DEBUG(n, args...)
226
#endif
227
 
228
#define KDBG_XIRC KERN_DEBUG   "xirc2ps_cs: "
229
#define KERR_XIRC KERN_ERR     "xirc2ps_cs: "
230
#define KWRN_XIRC KERN_WARNING "xirc2ps_cs: "
231
#define KNOT_XIRC KERN_NOTICE  "xirc2ps_cs: "
232
#define KINF_XIRC KERN_INFO    "xirc2ps_cs: "
233
 
234
/* card types */
235
#define XIR_UNKNOWN  0  /* unknown: not supported */
236
#define XIR_CE       1  /* (prodid 1) different hardware: not supported */
237
#define XIR_CE2      2  /* (prodid 2) */
238
#define XIR_CE3      3  /* (prodid 3) */
239
#define XIR_CEM      4  /* (prodid 1) different hardware: not supported */
240
#define XIR_CEM2     5  /* (prodid 2) */
241
#define XIR_CEM3     6  /* (prodid 3) */
242
#define XIR_CEM33    7  /* (prodid 4) */
243
#define XIR_CEM56M   8  /* (prodid 5) */
244
#define XIR_CEM56    9  /* (prodid 6) */
245
#define XIR_CM28    10  /* (prodid 3) modem only: not supported here */
246
#define XIR_CM33    11  /* (prodid 4) modem only: not supported here */
247
#define XIR_CM56    12  /* (prodid 5) modem only: not supported here */
248
#define XIR_CG      13  /* (prodid 1) GSM modem only: not supported */
249
#define XIR_CBE     14  /* (prodid 1) cardbus ethernet: not supported */
250
/*====================================================================*/
251
 
252
/* Module parameters */
253
 
254
MODULE_DESCRIPTION("Xircom PCMCIA ethernet driver");
255
MODULE_LICENSE("Dual MPL/GPL");
256
 
257
#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
258
 
259
INT_MODULE_PARM(if_port,        0);
260
INT_MODULE_PARM(full_duplex,    0);
261
INT_MODULE_PARM(do_sound,       1);
262
INT_MODULE_PARM(lockup_hack,    0);  /* anti lockup hack */
263
 
264
/*====================================================================*/
265
 
266
/* We do not process more than these number of bytes during one
267
 * interrupt. (Of course we receive complete packets, so this is not
268
 * an exact value).
269
 * Something between 2000..22000; first value gives best interrupt latency,
270
 * the second enables the usage of the complete on-chip buffer. We use the
271
 * high value as the initial value.
272
 */
273
static unsigned maxrx_bytes = 22000;
274
 
275
/* MII management prototypes */
276
static void mii_idle(kio_addr_t ioaddr);
277
static void mii_putbit(kio_addr_t ioaddr, unsigned data);
278
static int  mii_getbit(kio_addr_t ioaddr);
279
static void mii_wbits(kio_addr_t ioaddr, unsigned data, int len);
280
static unsigned mii_rd(kio_addr_t ioaddr, u_char phyaddr, u_char phyreg);
281
static void mii_wr(kio_addr_t ioaddr, u_char phyaddr, u_char phyreg,
282
                   unsigned data, int len);
283
 
284
/*
285
 * The event() function is this driver's Card Services event handler.
286
 * It will be called by Card Services when an appropriate card status
287
 * event is received.  The config() and release() entry points are
288
 * used to configure or release a socket, in response to card insertion
289
 * and ejection events.  They are invoked from the event handler.
290
 */
291
 
292
static int has_ce2_string(struct pcmcia_device * link);
293
static int xirc2ps_config(struct pcmcia_device * link);
294
static void xirc2ps_release(struct pcmcia_device * link);
295
 
296
/****************
297
 * The attach() and detach() entry points are used to create and destroy
298
 * "instances" of the driver, where each instance represents everything
299
 * needed to manage one actual PCMCIA card.
300
 */
301
 
302
static void xirc2ps_detach(struct pcmcia_device *p_dev);
303
 
304
/****************
305
 * You'll also need to prototype all the functions that will actually
306
 * be used to talk to your device.  See 'pcmem_cs' for a good example
307
 * of a fully self-sufficient driver; the other drivers rely more or
308
 * less on other parts of the kernel.
309
 */
310
 
311
static irqreturn_t xirc2ps_interrupt(int irq, void *dev_id);
312
 
313
/****************
314
 * A linked list of "instances" of the device.  Each actual
315
 * PCMCIA card corresponds to one device instance, and is described
316
 * by one struct pcmcia_device structure (defined in ds.h).
317
 *
318
 * You may not want to use a linked list for this -- for example, the
319
 * memory card driver uses an array of struct pcmcia_device pointers, where minor
320
 * device numbers are used to derive the corresponding array index.
321
 */
322
 
323
/****************
324
 * A driver needs to provide a dev_node_t structure for each device
325
 * on a card.  In some cases, there is only one device per card (for
326
 * example, ethernet cards, modems).  In other cases, there may be
327
 * many actual or logical devices (SCSI adapters, memory cards with
328
 * multiple partitions).  The dev_node_t structures need to be kept
329
 * in a linked list starting at the 'dev' field of a struct pcmcia_device
330
 * structure.  We allocate them in the card's private data structure,
331
 * because they generally can't be allocated dynamically.
332
 */
333
 
334
typedef struct local_info_t {
335
        struct net_device       *dev;
336
        struct pcmcia_device    *p_dev;
337
    dev_node_t node;
338
    struct net_device_stats stats;
339
    int card_type;
340
    int probe_port;
341
    int silicon; /* silicon revision. 0=old CE2, 1=Scipper, 4=Mohawk */
342
    int mohawk;  /* a CE3 type card */
343
    int dingo;   /* a CEM56 type card */
344
    int new_mii; /* has full 10baseT/100baseT MII */
345
    int modem;   /* is a multi function card (i.e with a modem) */
346
    void __iomem *dingo_ccr; /* only used for CEM56 cards */
347
    unsigned last_ptr_value; /* last packets transmitted value */
348
    const char *manf_str;
349
    struct work_struct tx_timeout_task;
350
} local_info_t;
351
 
352
/****************
353
 * Some more prototypes
354
 */
355
static int do_start_xmit(struct sk_buff *skb, struct net_device *dev);
356
static void do_tx_timeout(struct net_device *dev);
357
static void xirc2ps_tx_timeout_task(struct work_struct *work);
358
static struct net_device_stats *do_get_stats(struct net_device *dev);
359
static void set_addresses(struct net_device *dev);
360
static void set_multicast_list(struct net_device *dev);
361
static int set_card_type(struct pcmcia_device *link, const void *s);
362
static int do_config(struct net_device *dev, struct ifmap *map);
363
static int do_open(struct net_device *dev);
364
static int do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
365
static const struct ethtool_ops netdev_ethtool_ops;
366
static void hardreset(struct net_device *dev);
367
static void do_reset(struct net_device *dev, int full);
368
static int init_mii(struct net_device *dev);
369
static void do_powerdown(struct net_device *dev);
370
static int do_stop(struct net_device *dev);
371
 
372
/*=============== Helper functions =========================*/
373
static int
374
first_tuple(struct pcmcia_device *handle, tuple_t *tuple, cisparse_t *parse)
375
{
376
        int err;
377
 
378
        if ((err = pcmcia_get_first_tuple(handle, tuple)) == 0 &&
379
                        (err = pcmcia_get_tuple_data(handle, tuple)) == 0)
380
                err = pcmcia_parse_tuple(handle, tuple, parse);
381
        return err;
382
}
383
 
384
static int
385
next_tuple(struct pcmcia_device *handle, tuple_t *tuple, cisparse_t *parse)
386
{
387
        int err;
388
 
389
        if ((err = pcmcia_get_next_tuple(handle, tuple)) == 0 &&
390
                        (err = pcmcia_get_tuple_data(handle, tuple)) == 0)
391
                err = pcmcia_parse_tuple(handle, tuple, parse);
392
        return err;
393
}
394
 
395
#define SelectPage(pgnr)   outb((pgnr), ioaddr + XIRCREG_PR)
396
#define GetByte(reg)       ((unsigned)inb(ioaddr + (reg)))
397
#define GetWord(reg)       ((unsigned)inw(ioaddr + (reg)))
398
#define PutByte(reg,value) outb((value), ioaddr+(reg))
399
#define PutWord(reg,value) outw((value), ioaddr+(reg))
400
 
401
/*====== Functions used for debugging =================================*/
402
#if defined(PCMCIA_DEBUG) && 0 /* reading regs may change system status */
403
static void
404
PrintRegisters(struct net_device *dev)
405
{
406
    kio_addr_t ioaddr = dev->base_addr;
407
 
408
    if (pc_debug > 1) {
409
        int i, page;
410
 
411
        printk(KDBG_XIRC "Register  common: ");
412
        for (i = 0; i < 8; i++)
413
            printk(" %2.2x", GetByte(i));
414
        printk("\n");
415
        for (page = 0; page <= 8; page++) {
416
            printk(KDBG_XIRC "Register page %2x: ", page);
417
            SelectPage(page);
418
            for (i = 8; i < 16; i++)
419
                printk(" %2.2x", GetByte(i));
420
            printk("\n");
421
        }
422
        for (page=0x40 ; page <= 0x5f; page++) {
423
            if (page == 0x43 || (page >= 0x46 && page <= 0x4f)
424
                || (page >= 0x51 && page <=0x5e))
425
                continue;
426
            printk(KDBG_XIRC "Register page %2x: ", page);
427
            SelectPage(page);
428
            for (i = 8; i < 16; i++)
429
                printk(" %2.2x", GetByte(i));
430
            printk("\n");
431
        }
432
    }
433
}
434
#endif /* PCMCIA_DEBUG */
435
 
436
/*============== MII Management functions ===============*/
437
 
438
/****************
439
 * Turn around for read
440
 */
441
static void
442
mii_idle(kio_addr_t ioaddr)
443
{
444
    PutByte(XIRCREG2_GPR2, 0x04|0); /* drive MDCK low */
445
    udelay(1);
446
    PutByte(XIRCREG2_GPR2, 0x04|1); /* and drive MDCK high */
447
    udelay(1);
448
}
449
 
450
/****************
451
 * Write a bit to MDI/O
452
 */
453
static void
454
mii_putbit(kio_addr_t ioaddr, unsigned data)
455
{
456
  #if 1
457
    if (data) {
458
        PutByte(XIRCREG2_GPR2, 0x0c|2|0); /* set MDIO */
459
        udelay(1);
460
        PutByte(XIRCREG2_GPR2, 0x0c|2|1); /* and drive MDCK high */
461
        udelay(1);
462
    } else {
463
        PutByte(XIRCREG2_GPR2, 0x0c|0|0); /* clear MDIO */
464
        udelay(1);
465
        PutByte(XIRCREG2_GPR2, 0x0c|0|1); /* and drive MDCK high */
466
        udelay(1);
467
    }
468
  #else
469
    if (data) {
470
        PutWord(XIRCREG2_GPR2-1, 0x0e0e);
471
        udelay(1);
472
        PutWord(XIRCREG2_GPR2-1, 0x0f0f);
473
        udelay(1);
474
    } else {
475
        PutWord(XIRCREG2_GPR2-1, 0x0c0c);
476
        udelay(1);
477
        PutWord(XIRCREG2_GPR2-1, 0x0d0d);
478
        udelay(1);
479
    }
480
  #endif
481
}
482
 
483
/****************
484
 * Get a bit from MDI/O
485
 */
486
static int
487
mii_getbit(kio_addr_t ioaddr)
488
{
489
    unsigned d;
490
 
491
    PutByte(XIRCREG2_GPR2, 4|0); /* drive MDCK low */
492
    udelay(1);
493
    d = GetByte(XIRCREG2_GPR2); /* read MDIO */
494
    PutByte(XIRCREG2_GPR2, 4|1); /* drive MDCK high again */
495
    udelay(1);
496
    return d & 0x20; /* read MDIO */
497
}
498
 
499
static void
500
mii_wbits(kio_addr_t ioaddr, unsigned data, int len)
501
{
502
    unsigned m = 1 << (len-1);
503
    for (; m; m >>= 1)
504
        mii_putbit(ioaddr, data & m);
505
}
506
 
507
static unsigned
508
mii_rd(kio_addr_t ioaddr,       u_char phyaddr, u_char phyreg)
509
{
510
    int i;
511
    unsigned data=0, m;
512
 
513
    SelectPage(2);
514
    for (i=0; i < 32; i++)               /* 32 bit preamble */
515
        mii_putbit(ioaddr, 1);
516
    mii_wbits(ioaddr, 0x06, 4);         /* Start and opcode for read */
517
    mii_wbits(ioaddr, phyaddr, 5);      /* PHY address to be accessed */
518
    mii_wbits(ioaddr, phyreg, 5);       /* PHY register to read */
519
    mii_idle(ioaddr);                   /* turn around */
520
    mii_getbit(ioaddr);
521
 
522
    for (m = 1<<15; m; m >>= 1)
523
        if (mii_getbit(ioaddr))
524
            data |= m;
525
    mii_idle(ioaddr);
526
    return data;
527
}
528
 
529
static void
530
mii_wr(kio_addr_t ioaddr, u_char phyaddr, u_char phyreg, unsigned data, int len)
531
{
532
    int i;
533
 
534
    SelectPage(2);
535
    for (i=0; i < 32; i++)               /* 32 bit preamble */
536
        mii_putbit(ioaddr, 1);
537
    mii_wbits(ioaddr, 0x05, 4);         /* Start and opcode for write */
538
    mii_wbits(ioaddr, phyaddr, 5);      /* PHY address to be accessed */
539
    mii_wbits(ioaddr, phyreg, 5);       /* PHY Register to write */
540
    mii_putbit(ioaddr, 1);              /* turn around */
541
    mii_putbit(ioaddr, 0);
542
    mii_wbits(ioaddr, data, len);       /* And write the data */
543
    mii_idle(ioaddr);
544
}
545
 
546
/*============= Main bulk of functions  =========================*/
547
 
548
/****************
549
 * xirc2ps_attach() creates an "instance" of the driver, allocating
550
 * local data structures for one device.  The device is registered
551
 * with Card Services.
552
 *
553
 * The dev_link structure is initialized, but we don't actually
554
 * configure the card at this point -- we wait until we receive a
555
 * card insertion event.
556
 */
557
 
558
static int
559
xirc2ps_probe(struct pcmcia_device *link)
560
{
561
    struct net_device *dev;
562
    local_info_t *local;
563
 
564
    DEBUG(0, "attach()\n");
565
 
566
    /* Allocate the device structure */
567
    dev = alloc_etherdev(sizeof(local_info_t));
568
    if (!dev)
569
            return -ENOMEM;
570
    local = netdev_priv(dev);
571
    local->dev = dev;
572
    local->p_dev = link;
573
    link->priv = dev;
574
 
575
    /* General socket configuration */
576
    link->conf.Attributes = CONF_ENABLE_IRQ;
577
    link->conf.IntType = INT_MEMORY_AND_IO;
578
    link->conf.ConfigIndex = 1;
579
    link->irq.Handler = xirc2ps_interrupt;
580
    link->irq.Instance = dev;
581
 
582
    /* Fill in card specific entries */
583
    dev->hard_start_xmit = &do_start_xmit;
584
    dev->set_config = &do_config;
585
    dev->get_stats = &do_get_stats;
586
    dev->do_ioctl = &do_ioctl;
587
    SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
588
    dev->set_multicast_list = &set_multicast_list;
589
    dev->open = &do_open;
590
    dev->stop = &do_stop;
591
#ifdef HAVE_TX_TIMEOUT
592
    dev->tx_timeout = do_tx_timeout;
593
    dev->watchdog_timeo = TX_TIMEOUT;
594
    INIT_WORK(&local->tx_timeout_task, xirc2ps_tx_timeout_task);
595
#endif
596
 
597
    return xirc2ps_config(link);
598
} /* xirc2ps_attach */
599
 
600
/****************
601
 *  This deletes a driver "instance".  The device is de-registered
602
 *  with Card Services.  If it has been released, all local data
603
 *  structures are freed.  Otherwise, the structures will be freed
604
 *  when the device is released.
605
 */
606
 
607
static void
608
xirc2ps_detach(struct pcmcia_device *link)
609
{
610
    struct net_device *dev = link->priv;
611
 
612
    DEBUG(0, "detach(0x%p)\n", link);
613
 
614
    if (link->dev_node)
615
        unregister_netdev(dev);
616
 
617
    xirc2ps_release(link);
618
 
619
    free_netdev(dev);
620
} /* xirc2ps_detach */
621
 
622
/****************
623
 * Detect the type of the card. s is the buffer with the data of tuple 0x20
624
 * Returns: 0 := not supported
625
 *                     mediaid=11 and prodid=47
626
 * Media-Id bits:
627
 *  Ethernet        0x01
628
 *  Tokenring       0x02
629
 *  Arcnet          0x04
630
 *  Wireless        0x08
631
 *  Modem           0x10
632
 *  GSM only        0x20
633
 * Prod-Id bits:
634
 *  Pocket          0x10
635
 *  External        0x20
636
 *  Creditcard      0x40
637
 *  Cardbus         0x80
638
 *
639
 */
640
static int
641
set_card_type(struct pcmcia_device *link, const void *s)
642
{
643
    struct net_device *dev = link->priv;
644
    local_info_t *local = netdev_priv(dev);
645
  #ifdef PCMCIA_DEBUG
646
    unsigned cisrev = ((const unsigned char *)s)[2];
647
  #endif
648
    unsigned mediaid= ((const unsigned char *)s)[3];
649
    unsigned prodid = ((const unsigned char *)s)[4];
650
 
651
    DEBUG(0, "cisrev=%02x mediaid=%02x prodid=%02x\n",
652
          cisrev, mediaid, prodid);
653
 
654
    local->mohawk = 0;
655
    local->dingo = 0;
656
    local->modem = 0;
657
    local->card_type = XIR_UNKNOWN;
658
    if (!(prodid & 0x40)) {
659
        printk(KNOT_XIRC "Ooops: Not a creditcard\n");
660
        return 0;
661
    }
662
    if (!(mediaid & 0x01)) {
663
        printk(KNOT_XIRC "Not an Ethernet card\n");
664
        return 0;
665
    }
666
    if (mediaid & 0x10) {
667
        local->modem = 1;
668
        switch(prodid & 15) {
669
          case 1: local->card_type = XIR_CEM   ; break;
670
          case 2: local->card_type = XIR_CEM2  ; break;
671
          case 3: local->card_type = XIR_CEM3  ; break;
672
          case 4: local->card_type = XIR_CEM33 ; break;
673
          case 5: local->card_type = XIR_CEM56M;
674
                  local->mohawk = 1;
675
                  break;
676
          case 6:
677
          case 7: /* 7 is the RealPort 10/56 */
678
                  local->card_type = XIR_CEM56 ;
679
                  local->mohawk = 1;
680
                  local->dingo = 1;
681
                  break;
682
        }
683
    } else {
684
        switch(prodid & 15) {
685
          case 1: local->card_type = has_ce2_string(link)? XIR_CE2 : XIR_CE ;
686
                  break;
687
          case 2: local->card_type = XIR_CE2; break;
688
          case 3: local->card_type = XIR_CE3;
689
                  local->mohawk = 1;
690
                  break;
691
        }
692
    }
693
    if (local->card_type == XIR_CE || local->card_type == XIR_CEM) {
694
        printk(KNOT_XIRC "Sorry, this is an old CE card\n");
695
        return 0;
696
    }
697
    if (local->card_type == XIR_UNKNOWN)
698
        printk(KNOT_XIRC "unknown card (mediaid=%02x prodid=%02x)\n",
699
               mediaid, prodid);
700
 
701
    return 1;
702
}
703
 
704
/****************
705
 * There are some CE2 cards out which claim to be a CE card.
706
 * This function looks for a "CE2" in the 3rd version field.
707
 * Returns: true if this is a CE2
708
 */
709
static int
710
has_ce2_string(struct pcmcia_device * p_dev)
711
{
712
        if (p_dev->prod_id[2] && strstr(p_dev->prod_id[2], "CE2"))
713
                return 1;
714
        return 0;
715
}
716
 
717
/****************
718
 * xirc2ps_config() is scheduled to run after a CARD_INSERTION event
719
 * is received, to configure the PCMCIA socket, and to make the
720
 * ethernet device available to the system.
721
 */
722
static int
723
xirc2ps_config(struct pcmcia_device * link)
724
{
725
    struct net_device *dev = link->priv;
726
    local_info_t *local = netdev_priv(dev);
727
    tuple_t tuple;
728
    cisparse_t parse;
729
    kio_addr_t ioaddr;
730
    int err, i;
731
    u_char buf[64];
732
    cistpl_lan_node_id_t *node_id = (cistpl_lan_node_id_t*)parse.funce.data;
733
    cistpl_cftable_entry_t *cf = &parse.cftable_entry;
734
    DECLARE_MAC_BUF(mac);
735
 
736
    local->dingo_ccr = NULL;
737
 
738
    DEBUG(0, "config(0x%p)\n", link);
739
 
740
    /*
741
     * This reads the card's CONFIG tuple to find its configuration
742
     * registers.
743
     */
744
    tuple.Attributes = 0;
745
    tuple.TupleData = buf;
746
    tuple.TupleDataMax = 64;
747
    tuple.TupleOffset = 0;
748
 
749
    /* Is this a valid  card */
750
    tuple.DesiredTuple = CISTPL_MANFID;
751
    if ((err=first_tuple(link, &tuple, &parse))) {
752
        printk(KNOT_XIRC "manfid not found in CIS\n");
753
        goto failure;
754
    }
755
 
756
    switch(parse.manfid.manf) {
757
      case MANFID_XIRCOM:
758
        local->manf_str = "Xircom";
759
        break;
760
      case MANFID_ACCTON:
761
        local->manf_str = "Accton";
762
        break;
763
      case MANFID_COMPAQ:
764
      case MANFID_COMPAQ2:
765
        local->manf_str = "Compaq";
766
        break;
767
      case MANFID_INTEL:
768
        local->manf_str = "Intel";
769
        break;
770
      case MANFID_TOSHIBA:
771
        local->manf_str = "Toshiba";
772
        break;
773
      default:
774
        printk(KNOT_XIRC "Unknown Card Manufacturer ID: 0x%04x\n",
775
               (unsigned)parse.manfid.manf);
776
        goto failure;
777
    }
778
    DEBUG(0, "found %s card\n", local->manf_str);
779
 
780
    if (!set_card_type(link, buf)) {
781
        printk(KNOT_XIRC "this card is not supported\n");
782
        goto failure;
783
    }
784
 
785
    /* get the ethernet address from the CIS */
786
    tuple.DesiredTuple = CISTPL_FUNCE;
787
    for (err = first_tuple(link, &tuple, &parse); !err;
788
                             err = next_tuple(link, &tuple, &parse)) {
789
        /* Once I saw two CISTPL_FUNCE_LAN_NODE_ID entries:
790
         * the first one with a length of zero the second correct -
791
         * so I skip all entries with length 0 */
792
        if (parse.funce.type == CISTPL_FUNCE_LAN_NODE_ID
793
            && ((cistpl_lan_node_id_t *)parse.funce.data)->nb)
794
            break;
795
    }
796
    if (err) { /* not found: try to get the node-id from tuple 0x89 */
797
        tuple.DesiredTuple = 0x89;  /* data layout looks like tuple 0x22 */
798
        if ((err = pcmcia_get_first_tuple(link, &tuple)) == 0 &&
799
                (err = pcmcia_get_tuple_data(link, &tuple)) == 0) {
800
            if (tuple.TupleDataLen == 8 && *buf == CISTPL_FUNCE_LAN_NODE_ID)
801
                memcpy(&parse, buf, 8);
802
            else
803
                err = -1;
804
        }
805
    }
806
    if (err) { /* another try   (James Lehmer's CE2 version 4.1)*/
807
        tuple.DesiredTuple = CISTPL_FUNCE;
808
        for (err = first_tuple(link, &tuple, &parse); !err;
809
                                 err = next_tuple(link, &tuple, &parse)) {
810
            if (parse.funce.type == 0x02 && parse.funce.data[0] == 1
811
                && parse.funce.data[1] == 6 && tuple.TupleDataLen == 13) {
812
                buf[1] = 4;
813
                memcpy(&parse, buf+1, 8);
814
                break;
815
            }
816
        }
817
    }
818
    if (err) {
819
        printk(KNOT_XIRC "node-id not found in CIS\n");
820
        goto failure;
821
    }
822
    node_id = (cistpl_lan_node_id_t *)parse.funce.data;
823
    if (node_id->nb != 6) {
824
        printk(KNOT_XIRC "malformed node-id in CIS\n");
825
        goto failure;
826
    }
827
    for (i=0; i < 6; i++)
828
        dev->dev_addr[i] = node_id->id[i];
829
 
830
    link->io.IOAddrLines =10;
831
    link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
832
    link->irq.Attributes = IRQ_HANDLE_PRESENT;
833
    link->irq.IRQInfo1 = IRQ_LEVEL_ID;
834
    if (local->modem) {
835
        int pass;
836
 
837
        if (do_sound) {
838
            link->conf.Attributes |= CONF_ENABLE_SPKR;
839
            link->conf.Status |= CCSR_AUDIO_ENA;
840
        }
841
        link->irq.Attributes |= IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED ;
842
        link->io.NumPorts2 = 8;
843
        link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
844
        if (local->dingo) {
845
            /* Take the Modem IO port from the CIS and scan for a free
846
             * Ethernet port */
847
            link->io.NumPorts1 = 16; /* no Mako stuff anymore */
848
            tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
849
            for (err = first_tuple(link, &tuple, &parse); !err;
850
                                 err = next_tuple(link, &tuple, &parse)) {
851
                if (cf->io.nwin > 0  &&  (cf->io.win[0].base & 0xf) == 8) {
852
                    for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
853
                        link->conf.ConfigIndex = cf->index ;
854
                        link->io.BasePort2 = cf->io.win[0].base;
855
                        link->io.BasePort1 = ioaddr;
856
                        if (!(err=pcmcia_request_io(link, &link->io)))
857
                            goto port_found;
858
                    }
859
                }
860
            }
861
        } else {
862
            link->io.NumPorts1 = 18;
863
            /* We do 2 passes here: The first one uses the regular mapping and
864
             * the second tries again, thereby considering that the 32 ports are
865
             * mirrored every 32 bytes. Actually we use a mirrored port for
866
             * the Mako if (on the first pass) the COR bit 5 is set.
867
             */
868
            for (pass=0; pass < 2; pass++) {
869
                tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
870
                for (err = first_tuple(link, &tuple, &parse); !err;
871
                                     err = next_tuple(link, &tuple, &parse)){
872
                    if (cf->io.nwin > 0  &&  (cf->io.win[0].base & 0xf) == 8){
873
                        link->conf.ConfigIndex = cf->index ;
874
                        link->io.BasePort2 = cf->io.win[0].base;
875
                        link->io.BasePort1 = link->io.BasePort2
876
                                    + (pass ? (cf->index & 0x20 ? -24:8)
877
                                            : (cf->index & 0x20 ?   8:-24));
878
                        if (!(err=pcmcia_request_io(link, &link->io)))
879
                            goto port_found;
880
                    }
881
                }
882
            }
883
            /* if special option:
884
             * try to configure as Ethernet only.
885
             * .... */
886
        }
887
        printk(KNOT_XIRC "no ports available\n");
888
    } else {
889
        link->irq.Attributes |= IRQ_TYPE_DYNAMIC_SHARING;
890
        link->io.NumPorts1 = 16;
891
        for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
892
            link->io.BasePort1 = ioaddr;
893
            if (!(err=pcmcia_request_io(link, &link->io)))
894
                goto port_found;
895
        }
896
        link->io.BasePort1 = 0; /* let CS decide */
897
        if ((err=pcmcia_request_io(link, &link->io))) {
898
            cs_error(link, RequestIO, err);
899
            goto config_error;
900
        }
901
    }
902
  port_found:
903
    if (err)
904
         goto config_error;
905
 
906
    /****************
907
     * Now allocate an interrupt line.  Note that this does not
908
     * actually assign a handler to the interrupt.
909
     */
910
    if ((err=pcmcia_request_irq(link, &link->irq))) {
911
        cs_error(link, RequestIRQ, err);
912
        goto config_error;
913
    }
914
 
915
    /****************
916
     * This actually configures the PCMCIA socket -- setting up
917
     * the I/O windows and the interrupt mapping.
918
     */
919
    if ((err=pcmcia_request_configuration(link, &link->conf))) {
920
        cs_error(link, RequestConfiguration, err);
921
        goto config_error;
922
    }
923
 
924
    if (local->dingo) {
925
        conf_reg_t reg;
926
        win_req_t req;
927
        memreq_t mem;
928
 
929
        /* Reset the modem's BAR to the correct value
930
         * This is necessary because in the RequestConfiguration call,
931
         * the base address of the ethernet port (BasePort1) is written
932
         * to the BAR registers of the modem.
933
         */
934
        reg.Action = CS_WRITE;
935
        reg.Offset = CISREG_IOBASE_0;
936
        reg.Value = link->io.BasePort2 & 0xff;
937
        if ((err = pcmcia_access_configuration_register(link, &reg))) {
938
            cs_error(link, AccessConfigurationRegister, err);
939
            goto config_error;
940
        }
941
        reg.Action = CS_WRITE;
942
        reg.Offset = CISREG_IOBASE_1;
943
        reg.Value = (link->io.BasePort2 >> 8) & 0xff;
944
        if ((err = pcmcia_access_configuration_register(link, &reg))) {
945
            cs_error(link, AccessConfigurationRegister, err);
946
            goto config_error;
947
        }
948
 
949
        /* There is no config entry for the Ethernet part which
950
         * is at 0x0800. So we allocate a window into the attribute
951
         * memory and write direct to the CIS registers
952
         */
953
        req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
954
        req.Base = req.Size = 0;
955
        req.AccessSpeed = 0;
956
        if ((err = pcmcia_request_window(&link, &req, &link->win))) {
957
            cs_error(link, RequestWindow, err);
958
            goto config_error;
959
        }
960
        local->dingo_ccr = ioremap(req.Base,0x1000) + 0x0800;
961
        mem.CardOffset = 0x0;
962
        mem.Page = 0;
963
        if ((err = pcmcia_map_mem_page(link->win, &mem))) {
964
            cs_error(link, MapMemPage, err);
965
            goto config_error;
966
        }
967
 
968
        /* Setup the CCRs; there are no infos in the CIS about the Ethernet
969
         * part.
970
         */
971
        writeb(0x47, local->dingo_ccr + CISREG_COR);
972
        ioaddr = link->io.BasePort1;
973
        writeb(ioaddr & 0xff      , local->dingo_ccr + CISREG_IOBASE_0);
974
        writeb((ioaddr >> 8)&0xff , local->dingo_ccr + CISREG_IOBASE_1);
975
 
976
      #if 0
977
        {
978
            u_char tmp;
979
            printk(KERN_INFO "ECOR:");
980
            for (i=0; i < 7; i++) {
981
                tmp = readb(local->dingo_ccr + i*2);
982
                printk(" %02x", tmp);
983
            }
984
            printk("\n");
985
            printk(KERN_INFO "DCOR:");
986
            for (i=0; i < 4; i++) {
987
                tmp = readb(local->dingo_ccr + 0x20 + i*2);
988
                printk(" %02x", tmp);
989
            }
990
            printk("\n");
991
            printk(KERN_INFO "SCOR:");
992
            for (i=0; i < 10; i++) {
993
                tmp = readb(local->dingo_ccr + 0x40 + i*2);
994
                printk(" %02x", tmp);
995
            }
996
            printk("\n");
997
        }
998
      #endif
999
 
1000
        writeb(0x01, local->dingo_ccr + 0x20);
1001
        writeb(0x0c, local->dingo_ccr + 0x22);
1002
        writeb(0x00, local->dingo_ccr + 0x24);
1003
        writeb(0x00, local->dingo_ccr + 0x26);
1004
        writeb(0x00, local->dingo_ccr + 0x28);
1005
    }
1006
 
1007
    /* The if_port symbol can be set when the module is loaded */
1008
    local->probe_port=0;
1009
    if (!if_port) {
1010
        local->probe_port = dev->if_port = 1;
1011
    } else if ((if_port >= 1 && if_port <= 2) ||
1012
               (local->mohawk && if_port==4))
1013
        dev->if_port = if_port;
1014
    else
1015
        printk(KNOT_XIRC "invalid if_port requested\n");
1016
 
1017
    /* we can now register the device with the net subsystem */
1018
    dev->irq = link->irq.AssignedIRQ;
1019
    dev->base_addr = link->io.BasePort1;
1020
 
1021
    if (local->dingo)
1022
        do_reset(dev, 1); /* a kludge to make the cem56 work */
1023
 
1024
    link->dev_node = &local->node;
1025
    SET_NETDEV_DEV(dev, &handle_to_dev(link));
1026
 
1027
    if ((err=register_netdev(dev))) {
1028
        printk(KNOT_XIRC "register_netdev() failed\n");
1029
        link->dev_node = NULL;
1030
        goto config_error;
1031
    }
1032
 
1033
    strcpy(local->node.dev_name, dev->name);
1034
 
1035
    /* give some infos about the hardware */
1036
    printk(KERN_INFO "%s: %s: port %#3lx, irq %d, hwaddr %s\n",
1037
           dev->name, local->manf_str,(u_long)dev->base_addr, (int)dev->irq,
1038
           print_mac(mac, dev->dev_addr));
1039
 
1040
    return 0;
1041
 
1042
  config_error:
1043
    xirc2ps_release(link);
1044
    return -ENODEV;
1045
 
1046
  failure:
1047
    return -ENODEV;
1048
} /* xirc2ps_config */
1049
 
1050
/****************
1051
 * After a card is removed, xirc2ps_release() will unregister the net
1052
 * device, and release the PCMCIA configuration.  If the device is
1053
 * still open, this will be postponed until it is closed.
1054
 */
1055
static void
1056
xirc2ps_release(struct pcmcia_device *link)
1057
{
1058
        DEBUG(0, "release(0x%p)\n", link);
1059
 
1060
        if (link->win) {
1061
                struct net_device *dev = link->priv;
1062
                local_info_t *local = netdev_priv(dev);
1063
                if (local->dingo)
1064
                        iounmap(local->dingo_ccr - 0x0800);
1065
        }
1066
        pcmcia_disable_device(link);
1067
} /* xirc2ps_release */
1068
 
1069
/*====================================================================*/
1070
 
1071
 
1072
static int xirc2ps_suspend(struct pcmcia_device *link)
1073
{
1074
        struct net_device *dev = link->priv;
1075
 
1076
        if (link->open) {
1077
                netif_device_detach(dev);
1078
                do_powerdown(dev);
1079
        }
1080
 
1081
        return 0;
1082
}
1083
 
1084
static int xirc2ps_resume(struct pcmcia_device *link)
1085
{
1086
        struct net_device *dev = link->priv;
1087
 
1088
        if (link->open) {
1089
                do_reset(dev,1);
1090
                netif_device_attach(dev);
1091
        }
1092
 
1093
        return 0;
1094
}
1095
 
1096
 
1097
/*====================================================================*/
1098
 
1099
/****************
1100
 * This is the Interrupt service route.
1101
 */
1102
static irqreturn_t
1103
xirc2ps_interrupt(int irq, void *dev_id)
1104
{
1105
    struct net_device *dev = (struct net_device *)dev_id;
1106
    local_info_t *lp = netdev_priv(dev);
1107
    kio_addr_t ioaddr;
1108
    u_char saved_page;
1109
    unsigned bytes_rcvd;
1110
    unsigned int_status, eth_status, rx_status, tx_status;
1111
    unsigned rsr, pktlen;
1112
    ulong start_ticks = jiffies; /* fixme: jiffies rollover every 497 days
1113
                                  * is this something to worry about?
1114
                                  * -- on a laptop?
1115
                                  */
1116
 
1117
    if (!netif_device_present(dev))
1118
        return IRQ_HANDLED;
1119
 
1120
    ioaddr = dev->base_addr;
1121
    if (lp->mohawk) { /* must disable the interrupt */
1122
        PutByte(XIRCREG_CR, 0);
1123
    }
1124
 
1125
    DEBUG(6, "%s: interrupt %d at %#x.\n", dev->name, irq, ioaddr);
1126
 
1127
    saved_page = GetByte(XIRCREG_PR);
1128
    /* Read the ISR to see whats the cause for the interrupt.
1129
     * This also clears the interrupt flags on CE2 cards
1130
     */
1131
    int_status = GetByte(XIRCREG_ISR);
1132
    bytes_rcvd = 0;
1133
  loop_entry:
1134
    if (int_status == 0xff) { /* card may be ejected */
1135
        DEBUG(3, "%s: interrupt %d for dead card\n", dev->name, irq);
1136
        goto leave;
1137
    }
1138
    eth_status = GetByte(XIRCREG_ESR);
1139
 
1140
    SelectPage(0x40);
1141
    rx_status  = GetByte(XIRCREG40_RXST0);
1142
    PutByte(XIRCREG40_RXST0, (~rx_status & 0xff));
1143
    tx_status = GetByte(XIRCREG40_TXST0);
1144
    tx_status |= GetByte(XIRCREG40_TXST1) << 8;
1145
    PutByte(XIRCREG40_TXST0, 0);
1146
    PutByte(XIRCREG40_TXST1, 0);
1147
 
1148
    DEBUG(3, "%s: ISR=%#2.2x ESR=%#2.2x RSR=%#2.2x TSR=%#4.4x\n",
1149
          dev->name, int_status, eth_status, rx_status, tx_status);
1150
 
1151
    /***** receive section ******/
1152
    SelectPage(0);
1153
    while (eth_status & FullPktRcvd) {
1154
        rsr = GetByte(XIRCREG0_RSR);
1155
        if (bytes_rcvd > maxrx_bytes && (rsr & PktRxOk)) {
1156
            /* too many bytes received during this int, drop the rest of the
1157
             * packets */
1158
            lp->stats.rx_dropped++;
1159
            DEBUG(2, "%s: RX drop, too much done\n", dev->name);
1160
        } else if (rsr & PktRxOk) {
1161
            struct sk_buff *skb;
1162
 
1163
            pktlen = GetWord(XIRCREG0_RBC);
1164
            bytes_rcvd += pktlen;
1165
 
1166
            DEBUG(5, "rsr=%#02x packet_length=%u\n", rsr, pktlen);
1167
 
1168
            skb = dev_alloc_skb(pktlen+3); /* 1 extra so we can use insw */
1169
            if (!skb) {
1170
                printk(KNOT_XIRC "low memory, packet dropped (size=%u)\n",
1171
                       pktlen);
1172
                lp->stats.rx_dropped++;
1173
            } else { /* okay get the packet */
1174
                skb_reserve(skb, 2);
1175
                if (lp->silicon == 0 ) { /* work around a hardware bug */
1176
                    unsigned rhsa; /* receive start address */
1177
 
1178
                    SelectPage(5);
1179
                    rhsa = GetWord(XIRCREG5_RHSA0);
1180
                    SelectPage(0);
1181
                    rhsa += 3; /* skip control infos */
1182
                    if (rhsa >= 0x8000)
1183
                        rhsa = 0;
1184
                    if (rhsa + pktlen > 0x8000) {
1185
                        unsigned i;
1186
                        u_char *buf = skb_put(skb, pktlen);
1187
                        for (i=0; i < pktlen ; i++, rhsa++) {
1188
                            buf[i] = GetByte(XIRCREG_EDP);
1189
                            if (rhsa == 0x8000) {
1190
                                rhsa = 0;
1191
                                i--;
1192
                            }
1193
                        }
1194
                    } else {
1195
                        insw(ioaddr+XIRCREG_EDP,
1196
                                skb_put(skb, pktlen), (pktlen+1)>>1);
1197
                    }
1198
                }
1199
              #if 0
1200
                else if (lp->mohawk) {
1201
                    /* To use this 32 bit access we should use
1202
                     * a manual optimized loop
1203
                     * Also the words are swapped, we can get more
1204
                     * performance by using 32 bit access and swapping
1205
                     * the words in a register. Will need this for cardbus
1206
                     *
1207
                     * Note: don't forget to change the ALLOC_SKB to .. +3
1208
                     */
1209
                    unsigned i;
1210
                    u_long *p = skb_put(skb, pktlen);
1211
                    register u_long a;
1212
                    kio_addr_t edpreg = ioaddr+XIRCREG_EDP-2;
1213
                    for (i=0; i < len ; i += 4, p++) {
1214
                        a = inl(edpreg);
1215
                        __asm__("rorl $16,%0\n\t"
1216
                                :"=q" (a)
1217
                                : "0" (a));
1218
                        *p = a;
1219
                    }
1220
                }
1221
              #endif
1222
                else {
1223
                    insw(ioaddr+XIRCREG_EDP, skb_put(skb, pktlen),
1224
                            (pktlen+1)>>1);
1225
                }
1226
                skb->protocol = eth_type_trans(skb, dev);
1227
                netif_rx(skb);
1228
                dev->last_rx = jiffies;
1229
                lp->stats.rx_packets++;
1230
                lp->stats.rx_bytes += pktlen;
1231
                if (!(rsr & PhyPkt))
1232
                    lp->stats.multicast++;
1233
            }
1234
        } else { /* bad packet */
1235
            DEBUG(5, "rsr=%#02x\n", rsr);
1236
        }
1237
        if (rsr & PktTooLong) {
1238
            lp->stats.rx_frame_errors++;
1239
            DEBUG(3, "%s: Packet too long\n", dev->name);
1240
        }
1241
        if (rsr & CRCErr) {
1242
            lp->stats.rx_crc_errors++;
1243
            DEBUG(3, "%s: CRC error\n", dev->name);
1244
        }
1245
        if (rsr & AlignErr) {
1246
            lp->stats.rx_fifo_errors++; /* okay ? */
1247
            DEBUG(3, "%s: Alignment error\n", dev->name);
1248
        }
1249
 
1250
        /* clear the received/dropped/error packet */
1251
        PutWord(XIRCREG0_DO, 0x8000); /* issue cmd: skip_rx_packet */
1252
 
1253
        /* get the new ethernet status */
1254
        eth_status = GetByte(XIRCREG_ESR);
1255
    }
1256
    if (rx_status & 0x10) { /* Receive overrun */
1257
        lp->stats.rx_over_errors++;
1258
        PutByte(XIRCREG_CR, ClearRxOvrun);
1259
        DEBUG(3, "receive overrun cleared\n");
1260
    }
1261
 
1262
    /***** transmit section ******/
1263
    if (int_status & PktTxed) {
1264
        unsigned n, nn;
1265
 
1266
        n = lp->last_ptr_value;
1267
        nn = GetByte(XIRCREG0_PTR);
1268
        lp->last_ptr_value = nn;
1269
        if (nn < n) /* rollover */
1270
            lp->stats.tx_packets += 256 - n;
1271
        else if (n == nn) { /* happens sometimes - don't know why */
1272
            DEBUG(0, "PTR not changed?\n");
1273
        } else
1274
            lp->stats.tx_packets += lp->last_ptr_value - n;
1275
        netif_wake_queue(dev);
1276
    }
1277
    if (tx_status & 0x0002) {   /* Execessive collissions */
1278
        DEBUG(0, "tx restarted due to execssive collissions\n");
1279
        PutByte(XIRCREG_CR, RestartTx);  /* restart transmitter process */
1280
    }
1281
    if (tx_status & 0x0040)
1282
        lp->stats.tx_aborted_errors++;
1283
 
1284
    /* recalculate our work chunk so that we limit the duration of this
1285
     * ISR to about 1/10 of a second.
1286
     * Calculate only if we received a reasonable amount of bytes.
1287
     */
1288
    if (bytes_rcvd > 1000) {
1289
        u_long duration = jiffies - start_ticks;
1290
 
1291
        if (duration >= HZ/10) { /* if more than about 1/10 second */
1292
            maxrx_bytes = (bytes_rcvd * (HZ/10)) / duration;
1293
            if (maxrx_bytes < 2000)
1294
                maxrx_bytes = 2000;
1295
            else if (maxrx_bytes > 22000)
1296
                maxrx_bytes = 22000;
1297
            DEBUG(1, "set maxrx=%u (rcvd=%u ticks=%lu)\n",
1298
                  maxrx_bytes, bytes_rcvd, duration);
1299
        } else if (!duration && maxrx_bytes < 22000) {
1300
            /* now much faster */
1301
            maxrx_bytes += 2000;
1302
            if (maxrx_bytes > 22000)
1303
                maxrx_bytes = 22000;
1304
            DEBUG(1, "set maxrx=%u\n", maxrx_bytes);
1305
        }
1306
    }
1307
 
1308
  leave:
1309
    if (lockup_hack) {
1310
        if (int_status != 0xff && (int_status = GetByte(XIRCREG_ISR)) != 0)
1311
            goto loop_entry;
1312
    }
1313
    SelectPage(saved_page);
1314
    PutByte(XIRCREG_CR, EnableIntr);  /* re-enable interrupts */
1315
    /* Instead of dropping packets during a receive, we could
1316
     * force an interrupt with this command:
1317
     *    PutByte(XIRCREG_CR, EnableIntr|ForceIntr);
1318
     */
1319
    return IRQ_HANDLED;
1320
} /* xirc2ps_interrupt */
1321
 
1322
/*====================================================================*/
1323
 
1324
static void
1325
xirc2ps_tx_timeout_task(struct work_struct *work)
1326
{
1327
        local_info_t *local =
1328
                container_of(work, local_info_t, tx_timeout_task);
1329
        struct net_device *dev = local->dev;
1330
    /* reset the card */
1331
    do_reset(dev,1);
1332
    dev->trans_start = jiffies;
1333
    netif_wake_queue(dev);
1334
}
1335
 
1336
static void
1337
do_tx_timeout(struct net_device *dev)
1338
{
1339
    local_info_t *lp = netdev_priv(dev);
1340
    lp->stats.tx_errors++;
1341
    printk(KERN_NOTICE "%s: transmit timed out\n", dev->name);
1342
    schedule_work(&lp->tx_timeout_task);
1343
}
1344
 
1345
static int
1346
do_start_xmit(struct sk_buff *skb, struct net_device *dev)
1347
{
1348
    local_info_t *lp = netdev_priv(dev);
1349
    kio_addr_t ioaddr = dev->base_addr;
1350
    int okay;
1351
    unsigned freespace;
1352
    unsigned pktlen = skb->len;
1353
 
1354
    DEBUG(1, "do_start_xmit(skb=%p, dev=%p) len=%u\n",
1355
          skb, dev, pktlen);
1356
 
1357
 
1358
    /* adjust the packet length to min. required
1359
     * and hope that the buffer is large enough
1360
     * to provide some random data.
1361
     * fixme: For Mohawk we can change this by sending
1362
     * a larger packetlen than we actually have; the chip will
1363
     * pad this in his buffer with random bytes
1364
     */
1365
    if (pktlen < ETH_ZLEN)
1366
    {
1367
        if (skb_padto(skb, ETH_ZLEN))
1368
                return 0;
1369
        pktlen = ETH_ZLEN;
1370
    }
1371
 
1372
    netif_stop_queue(dev);
1373
    SelectPage(0);
1374
    PutWord(XIRCREG0_TRS, (u_short)pktlen+2);
1375
    freespace = GetWord(XIRCREG0_TSO);
1376
    okay = freespace & 0x8000;
1377
    freespace &= 0x7fff;
1378
    /* TRS doesn't work - (indeed it is eliminated with sil-rev 1) */
1379
    okay = pktlen +2 < freespace;
1380
    DEBUG(2 + (okay ? 2 : 0), "%s: avail. tx space=%u%s\n",
1381
          dev->name, freespace, okay ? " (okay)":" (not enough)");
1382
    if (!okay) { /* not enough space */
1383
        return 1;  /* upper layer may decide to requeue this packet */
1384
    }
1385
    /* send the packet */
1386
    PutWord(XIRCREG_EDP, (u_short)pktlen);
1387
    outsw(ioaddr+XIRCREG_EDP, skb->data, pktlen>>1);
1388
    if (pktlen & 1)
1389
        PutByte(XIRCREG_EDP, skb->data[pktlen-1]);
1390
 
1391
    if (lp->mohawk)
1392
        PutByte(XIRCREG_CR, TransmitPacket|EnableIntr);
1393
 
1394
    dev_kfree_skb (skb);
1395
    dev->trans_start = jiffies;
1396
    lp->stats.tx_bytes += pktlen;
1397
    netif_start_queue(dev);
1398
    return 0;
1399
}
1400
 
1401
static struct net_device_stats *
1402
do_get_stats(struct net_device *dev)
1403
{
1404
    local_info_t *lp = netdev_priv(dev);
1405
 
1406
    /*  lp->stats.rx_missed_errors = GetByte(?) */
1407
    return &lp->stats;
1408
}
1409
 
1410
/****************
1411
 * Set all addresses: This first one is the individual address,
1412
 * the next 9 addresses are taken from the multicast list and
1413
 * the rest is filled with the individual address.
1414
 */
1415
static void
1416
set_addresses(struct net_device *dev)
1417
{
1418
    kio_addr_t ioaddr = dev->base_addr;
1419
    local_info_t *lp = netdev_priv(dev);
1420
    struct dev_mc_list *dmi = dev->mc_list;
1421
    unsigned char *addr;
1422
    int i,j,k,n;
1423
 
1424
    SelectPage(k=0x50);
1425
    for (i=0,j=8,n=0; ; i++, j++) {
1426
        if (i > 5) {
1427
            if (++n > 9)
1428
                break;
1429
            i = 0;
1430
            if (n > 1 && n <= dev->mc_count && dmi) {
1431
                 dmi = dmi->next;
1432
            }
1433
        }
1434
        if (j > 15) {
1435
            j = 8;
1436
            k++;
1437
            SelectPage(k);
1438
        }
1439
 
1440
        if (n && n <= dev->mc_count && dmi)
1441
            addr = dmi->dmi_addr;
1442
        else
1443
            addr = dev->dev_addr;
1444
 
1445
        if (lp->mohawk)
1446
            PutByte(j, addr[5-i]);
1447
        else
1448
            PutByte(j, addr[i]);
1449
    }
1450
    SelectPage(0);
1451
}
1452
 
1453
/****************
1454
 * Set or clear the multicast filter for this adaptor.
1455
 * We can filter up to 9 addresses, if more are requested we set
1456
 * multicast promiscuous mode.
1457
 */
1458
 
1459
static void
1460
set_multicast_list(struct net_device *dev)
1461
{
1462
    kio_addr_t ioaddr = dev->base_addr;
1463
 
1464
    SelectPage(0x42);
1465
    if (dev->flags & IFF_PROMISC) { /* snoop */
1466
        PutByte(XIRCREG42_SWC1, 0x06); /* set MPE and PME */
1467
    } else if (dev->mc_count > 9 || (dev->flags & IFF_ALLMULTI)) {
1468
        PutByte(XIRCREG42_SWC1, 0x02); /* set MPE */
1469
    } else if (dev->mc_count) {
1470
        /* the chip can filter 9 addresses perfectly */
1471
        PutByte(XIRCREG42_SWC1, 0x01);
1472
        SelectPage(0x40);
1473
        PutByte(XIRCREG40_CMD0, Offline);
1474
        set_addresses(dev);
1475
        SelectPage(0x40);
1476
        PutByte(XIRCREG40_CMD0, EnableRecv | Online);
1477
    } else { /* standard usage */
1478
        PutByte(XIRCREG42_SWC1, 0x00);
1479
    }
1480
    SelectPage(0);
1481
}
1482
 
1483
static int
1484
do_config(struct net_device *dev, struct ifmap *map)
1485
{
1486
    local_info_t *local = netdev_priv(dev);
1487
 
1488
    DEBUG(0, "do_config(%p)\n", dev);
1489
    if (map->port != 255 && map->port != dev->if_port) {
1490
        if (map->port > 4)
1491
            return -EINVAL;
1492
        if (!map->port) {
1493
            local->probe_port = 1;
1494
            dev->if_port = 1;
1495
        } else {
1496
            local->probe_port = 0;
1497
            dev->if_port = map->port;
1498
        }
1499
        printk(KERN_INFO "%s: switching to %s port\n",
1500
               dev->name, if_names[dev->if_port]);
1501
        do_reset(dev,1);  /* not the fine way :-) */
1502
    }
1503
    return 0;
1504
}
1505
 
1506
/****************
1507
 * Open the driver
1508
 */
1509
static int
1510
do_open(struct net_device *dev)
1511
{
1512
    local_info_t *lp = netdev_priv(dev);
1513
    struct pcmcia_device *link = lp->p_dev;
1514
 
1515
    DEBUG(0, "do_open(%p)\n", dev);
1516
 
1517
    /* Check that the PCMCIA card is still here. */
1518
    /* Physical device present signature. */
1519
    if (!pcmcia_dev_present(link))
1520
        return -ENODEV;
1521
 
1522
    /* okay */
1523
    link->open++;
1524
 
1525
    netif_start_queue(dev);
1526
    do_reset(dev,1);
1527
 
1528
    return 0;
1529
}
1530
 
1531
static void netdev_get_drvinfo(struct net_device *dev,
1532
                               struct ethtool_drvinfo *info)
1533
{
1534
        strcpy(info->driver, "xirc2ps_cs");
1535
        sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
1536
}
1537
 
1538
static const struct ethtool_ops netdev_ethtool_ops = {
1539
        .get_drvinfo            = netdev_get_drvinfo,
1540
};
1541
 
1542
static int
1543
do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1544
{
1545
    local_info_t *local = netdev_priv(dev);
1546
    kio_addr_t ioaddr = dev->base_addr;
1547
    u16 *data = (u16 *)&rq->ifr_ifru;
1548
 
1549
    DEBUG(1, "%s: ioctl(%-.6s, %#04x) %04x %04x %04x %04x\n",
1550
          dev->name, rq->ifr_ifrn.ifrn_name, cmd,
1551
          data[0], data[1], data[2], data[3]);
1552
 
1553
    if (!local->mohawk)
1554
        return -EOPNOTSUPP;
1555
 
1556
    switch(cmd) {
1557
      case SIOCGMIIPHY:         /* Get the address of the PHY in use. */
1558
        data[0] = 0;              /* we have only this address */
1559
        /* fall through */
1560
      case SIOCGMIIREG:         /* Read the specified MII register. */
1561
        data[3] = mii_rd(ioaddr, data[0] & 0x1f, data[1] & 0x1f);
1562
        break;
1563
      case SIOCSMIIREG:         /* Write the specified MII register */
1564
        if (!capable(CAP_NET_ADMIN))
1565
            return -EPERM;
1566
        mii_wr(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2], 16);
1567
        break;
1568
      default:
1569
        return -EOPNOTSUPP;
1570
    }
1571
    return 0;
1572
}
1573
 
1574
static void
1575
hardreset(struct net_device *dev)
1576
{
1577
    local_info_t *local = netdev_priv(dev);
1578
    kio_addr_t ioaddr = dev->base_addr;
1579
 
1580
    SelectPage(4);
1581
    udelay(1);
1582
    PutByte(XIRCREG4_GPR1, 0);        /* clear bit 0: power down */
1583
    msleep(40);                              /* wait 40 msec */
1584
    if (local->mohawk)
1585
        PutByte(XIRCREG4_GPR1, 1);       /* set bit 0: power up */
1586
    else
1587
        PutByte(XIRCREG4_GPR1, 1 | 4);   /* set bit 0: power up, bit 2: AIC */
1588
    msleep(20);                      /* wait 20 msec */
1589
}
1590
 
1591
static void
1592
do_reset(struct net_device *dev, int full)
1593
{
1594
    local_info_t *local = netdev_priv(dev);
1595
    kio_addr_t ioaddr = dev->base_addr;
1596
    unsigned value;
1597
 
1598
    DEBUG(0, "%s: do_reset(%p,%d)\n", dev? dev->name:"eth?", dev, full);
1599
 
1600
    hardreset(dev);
1601
    PutByte(XIRCREG_CR, SoftReset); /* set */
1602
    msleep(20);                      /* wait 20 msec */
1603
    PutByte(XIRCREG_CR, 0);           /* clear */
1604
    msleep(40);                      /* wait 40 msec */
1605
    if (local->mohawk) {
1606
        SelectPage(4);
1607
        /* set pin GP1 and GP2 to output  (0x0c)
1608
         * set GP1 to low to power up the ML6692 (0x00)
1609
         * set GP2 to high to power up the 10Mhz chip  (0x02)
1610
         */
1611
        PutByte(XIRCREG4_GPR0, 0x0e);
1612
    }
1613
 
1614
    /* give the circuits some time to power up */
1615
    msleep(500);                        /* about 500ms */
1616
 
1617
    local->last_ptr_value = 0;
1618
    local->silicon = local->mohawk ? (GetByte(XIRCREG4_BOV) & 0x70) >> 4
1619
                                   : (GetByte(XIRCREG4_BOV) & 0x30) >> 4;
1620
 
1621
    if (local->probe_port) {
1622
        if (!local->mohawk) {
1623
            SelectPage(4);
1624
            PutByte(XIRCREG4_GPR0, 4);
1625
            local->probe_port = 0;
1626
        }
1627
    } else if (dev->if_port == 2) { /* enable 10Base2 */
1628
        SelectPage(0x42);
1629
        PutByte(XIRCREG42_SWC1, 0xC0);
1630
    } else { /* enable 10BaseT */
1631
        SelectPage(0x42);
1632
        PutByte(XIRCREG42_SWC1, 0x80);
1633
    }
1634
    msleep(40);                      /* wait 40 msec to let it complete */
1635
 
1636
  #ifdef PCMCIA_DEBUG
1637
    if (pc_debug) {
1638
        SelectPage(0);
1639
        value = GetByte(XIRCREG_ESR);    /* read the ESR */
1640
        printk(KERN_DEBUG "%s: ESR is: %#02x\n", dev->name, value);
1641
    }
1642
  #endif
1643
 
1644
    /* setup the ECR */
1645
    SelectPage(1);
1646
    PutByte(XIRCREG1_IMR0, 0xff); /* allow all ints */
1647
    PutByte(XIRCREG1_IMR1, 1    ); /* and Set TxUnderrunDetect */
1648
    value = GetByte(XIRCREG1_ECR);
1649
  #if 0
1650
    if (local->mohawk)
1651
        value |= DisableLinkPulse;
1652
    PutByte(XIRCREG1_ECR, value);
1653
  #endif
1654
    DEBUG(0, "%s: ECR is: %#02x\n", dev->name, value);
1655
 
1656
    SelectPage(0x42);
1657
    PutByte(XIRCREG42_SWC0, 0x20); /* disable source insertion */
1658
 
1659
    if (local->silicon != 1) {
1660
        /* set the local memory dividing line.
1661
         * The comments in the sample code say that this is only
1662
         * settable with the scipper version 2 which is revision 0.
1663
         * Always for CE3 cards
1664
         */
1665
        SelectPage(2);
1666
        PutWord(XIRCREG2_RBS, 0x2000);
1667
    }
1668
 
1669
    if (full)
1670
        set_addresses(dev);
1671
 
1672
    /* Hardware workaround:
1673
     * The receive byte pointer after reset is off by 1 so we need
1674
     * to move the offset pointer back to 0.
1675
     */
1676
    SelectPage(0);
1677
    PutWord(XIRCREG0_DO, 0x2000); /* change offset command, off=0 */
1678
 
1679
    /* setup MAC IMRs and clear status registers */
1680
    SelectPage(0x40);                /* Bit 7 ... bit 0 */
1681
    PutByte(XIRCREG40_RMASK0, 0xff); /* ROK, RAB, rsv, RO, CRC, AE, PTL, MP */
1682
    PutByte(XIRCREG40_TMASK0, 0xff); /* TOK, TAB, SQE, LL, TU, JAB, EXC, CRS */
1683
    PutByte(XIRCREG40_TMASK1, 0xb0); /* rsv, rsv, PTD, EXT, rsv,rsv,rsv, rsv*/
1684
    PutByte(XIRCREG40_RXST0,  0x00); /* ROK, RAB, REN, RO, CRC, AE, PTL, MP */
1685
    PutByte(XIRCREG40_TXST0,  0x00); /* TOK, TAB, SQE, LL, TU, JAB, EXC, CRS */
1686
    PutByte(XIRCREG40_TXST1,  0x00); /* TEN, rsv, PTD, EXT, retry_counter:4  */
1687
 
1688
    if (full && local->mohawk && init_mii(dev)) {
1689
        if (dev->if_port == 4 || local->dingo || local->new_mii) {
1690
            printk(KERN_INFO "%s: MII selected\n", dev->name);
1691
            SelectPage(2);
1692
            PutByte(XIRCREG2_MSR, GetByte(XIRCREG2_MSR) | 0x08);
1693
            msleep(20);
1694
        } else {
1695
            printk(KERN_INFO "%s: MII detected; using 10mbs\n",
1696
                   dev->name);
1697
            SelectPage(0x42);
1698
            if (dev->if_port == 2) /* enable 10Base2 */
1699
                PutByte(XIRCREG42_SWC1, 0xC0);
1700
            else  /* enable 10BaseT */
1701
                PutByte(XIRCREG42_SWC1, 0x80);
1702
            msleep(40);                 /* wait 40 msec to let it complete */
1703
        }
1704
        if (full_duplex)
1705
            PutByte(XIRCREG1_ECR, GetByte(XIRCREG1_ECR | FullDuplex));
1706
    } else {  /* No MII */
1707
        SelectPage(0);
1708
        value = GetByte(XIRCREG_ESR);    /* read the ESR */
1709
        dev->if_port = (value & MediaSelect) ? 1 : 2;
1710
    }
1711
 
1712
    /* configure the LEDs */
1713
    SelectPage(2);
1714
    if (dev->if_port == 1 || dev->if_port == 4) /* TP: Link and Activity */
1715
        PutByte(XIRCREG2_LED, 0x3b);
1716
    else                              /* Coax: Not-Collision and Activity */
1717
        PutByte(XIRCREG2_LED, 0x3a);
1718
 
1719
    if (local->dingo)
1720
        PutByte(0x0b, 0x04); /* 100 Mbit LED */
1721
 
1722
    /* enable receiver and put the mac online */
1723
    if (full) {
1724
        SelectPage(0x40);
1725
        PutByte(XIRCREG40_CMD0, EnableRecv | Online);
1726
    }
1727
 
1728
    /* setup Ethernet IMR and enable interrupts */
1729
    SelectPage(1);
1730
    PutByte(XIRCREG1_IMR0, 0xff);
1731
    udelay(1);
1732
    SelectPage(0);
1733
    PutByte(XIRCREG_CR, EnableIntr);
1734
    if (local->modem && !local->dingo) { /* do some magic */
1735
        if (!(GetByte(0x10) & 0x01))
1736
            PutByte(0x10, 0x11); /* unmask master-int bit */
1737
    }
1738
 
1739
    if (full)
1740
        printk(KERN_INFO "%s: media %s, silicon revision %d\n",
1741
               dev->name, if_names[dev->if_port], local->silicon);
1742
    /* We should switch back to page 0 to avoid a bug in revision 0
1743
     * where regs with offset below 8 can't be read after an access
1744
     * to the MAC registers */
1745
    SelectPage(0);
1746
}
1747
 
1748
/****************
1749
 * Initialize the Media-Independent-Interface
1750
 * Returns: True if we have a good MII
1751
 */
1752
static int
1753
init_mii(struct net_device *dev)
1754
{
1755
    local_info_t *local = netdev_priv(dev);
1756
    kio_addr_t ioaddr = dev->base_addr;
1757
    unsigned control, status, linkpartner;
1758
    int i;
1759
 
1760
    if (if_port == 4 || if_port == 1) { /* force 100BaseT or 10BaseT */
1761
        dev->if_port = if_port;
1762
        local->probe_port = 0;
1763
        return 1;
1764
    }
1765
 
1766
    status = mii_rd(ioaddr,  0, 1);
1767
    if ((status & 0xff00) != 0x7800)
1768
        return 0; /* No MII */
1769
 
1770
    local->new_mii = (mii_rd(ioaddr, 0, 2) != 0xffff);
1771
 
1772
    if (local->probe_port)
1773
        control = 0x1000; /* auto neg */
1774
    else if (dev->if_port == 4)
1775
        control = 0x2000; /* no auto neg, 100mbs mode */
1776
    else
1777
        control = 0x0000; /* no auto neg, 10mbs mode */
1778
    mii_wr(ioaddr,  0, 0, control, 16);
1779
    udelay(100);
1780
    control = mii_rd(ioaddr, 0, 0);
1781
 
1782
    if (control & 0x0400) {
1783
        printk(KERN_NOTICE "%s can't take PHY out of isolation mode\n",
1784
               dev->name);
1785
        local->probe_port = 0;
1786
        return 0;
1787
    }
1788
 
1789
    if (local->probe_port) {
1790
        /* according to the DP83840A specs the auto negotiation process
1791
         * may take up to 3.5 sec, so we use this also for our ML6692
1792
         * Fixme: Better to use a timer here!
1793
         */
1794
        for (i=0; i < 35; i++) {
1795
            msleep(100);         /* wait 100 msec */
1796
            status = mii_rd(ioaddr,  0, 1);
1797
            if ((status & 0x0020) && (status & 0x0004))
1798
                break;
1799
        }
1800
 
1801
        if (!(status & 0x0020)) {
1802
            printk(KERN_INFO "%s: autonegotiation failed;"
1803
                   " using 10mbs\n", dev->name);
1804
            if (!local->new_mii) {
1805
                control = 0x0000;
1806
                mii_wr(ioaddr,  0, 0, control, 16);
1807
                udelay(100);
1808
                SelectPage(0);
1809
                dev->if_port = (GetByte(XIRCREG_ESR) & MediaSelect) ? 1 : 2;
1810
            }
1811
        } else {
1812
            linkpartner = mii_rd(ioaddr, 0, 5);
1813
            printk(KERN_INFO "%s: MII link partner: %04x\n",
1814
                   dev->name, linkpartner);
1815
            if (linkpartner & 0x0080) {
1816
                dev->if_port = 4;
1817
            } else
1818
                dev->if_port = 1;
1819
        }
1820
    }
1821
 
1822
    return 1;
1823
}
1824
 
1825
static void
1826
do_powerdown(struct net_device *dev)
1827
{
1828
 
1829
    kio_addr_t ioaddr = dev->base_addr;
1830
 
1831
    DEBUG(0, "do_powerdown(%p)\n", dev);
1832
 
1833
    SelectPage(4);
1834
    PutByte(XIRCREG4_GPR1, 0);        /* clear bit 0: power down */
1835
    SelectPage(0);
1836
}
1837
 
1838
static int
1839
do_stop(struct net_device *dev)
1840
{
1841
    kio_addr_t ioaddr = dev->base_addr;
1842
    local_info_t *lp = netdev_priv(dev);
1843
    struct pcmcia_device *link = lp->p_dev;
1844
 
1845
    DEBUG(0, "do_stop(%p)\n", dev);
1846
 
1847
    if (!link)
1848
        return -ENODEV;
1849
 
1850
    netif_stop_queue(dev);
1851
 
1852
    SelectPage(0);
1853
    PutByte(XIRCREG_CR, 0);  /* disable interrupts */
1854
    SelectPage(0x01);
1855
    PutByte(XIRCREG1_IMR0, 0x00); /* forbid all ints */
1856
    SelectPage(4);
1857
    PutByte(XIRCREG4_GPR1, 0);   /* clear bit 0: power down */
1858
    SelectPage(0);
1859
 
1860
    link->open--;
1861
    return 0;
1862
}
1863
 
1864
static struct pcmcia_device_id xirc2ps_ids[] = {
1865
        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0089, 0x110a),
1866
        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0138, 0x110a),
1867
        PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea),
1868
        PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "CEM33", 0x2e3ee845, 0x80609023),
1869
        PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a),
1870
        PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29),
1871
        PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719),
1872
        PCMCIA_PFC_DEVICE_PROD_ID12(0, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),
1873
        PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x010a),
1874
        PCMCIA_DEVICE_PROD_ID13("Toshiba Information Systems", "TPCENET", 0x1b3b94fe, 0xf381c1a2),
1875
        PCMCIA_DEVICE_PROD_ID13("Xircom", "CE3-10/100", 0x2e3ee845, 0x0ec0ac37),
1876
        PCMCIA_DEVICE_PROD_ID13("Xircom", "PS-CE2-10", 0x2e3ee845, 0x947d9073),
1877
        PCMCIA_DEVICE_PROD_ID13("Xircom", "R2E-100BTX", 0x2e3ee845, 0x2464a6e3),
1878
        PCMCIA_DEVICE_PROD_ID13("Xircom", "RE-10", 0x2e3ee845, 0x3e08d609),
1879
        PCMCIA_DEVICE_PROD_ID13("Xircom", "XE2000", 0x2e3ee845, 0xf7188e46),
1880
        PCMCIA_DEVICE_PROD_ID12("Compaq", "Ethernet LAN Card", 0x54f7c49c, 0x9fd2f0a2),
1881
        PCMCIA_DEVICE_PROD_ID12("Compaq", "Netelligent 10/100 PC Card", 0x54f7c49c, 0xefe96769),
1882
        PCMCIA_DEVICE_PROD_ID12("Intel", "EtherExpress(TM) PRO/100 PC Card Mobile Adapter16", 0x816cc815, 0x174397db),
1883
        PCMCIA_DEVICE_PROD_ID12("Toshiba", "10/100 Ethernet PC Card", 0x44a09d9c, 0xb44deecf),
1884
        /* also matches CFE-10 cards! */
1885
        /* PCMCIA_DEVICE_MANF_CARD(0x0105, 0x010a), */
1886
        PCMCIA_DEVICE_NULL,
1887
};
1888
MODULE_DEVICE_TABLE(pcmcia, xirc2ps_ids);
1889
 
1890
 
1891
static struct pcmcia_driver xirc2ps_cs_driver = {
1892
        .owner          = THIS_MODULE,
1893
        .drv            = {
1894
                .name   = "xirc2ps_cs",
1895
        },
1896
        .probe          = xirc2ps_probe,
1897
        .remove         = xirc2ps_detach,
1898
        .id_table       = xirc2ps_ids,
1899
        .suspend        = xirc2ps_suspend,
1900
        .resume         = xirc2ps_resume,
1901
};
1902
 
1903
static int __init
1904
init_xirc2ps_cs(void)
1905
{
1906
        return pcmcia_register_driver(&xirc2ps_cs_driver);
1907
}
1908
 
1909
static void __exit
1910
exit_xirc2ps_cs(void)
1911
{
1912
        pcmcia_unregister_driver(&xirc2ps_cs_driver);
1913
}
1914
 
1915
module_init(init_xirc2ps_cs);
1916
module_exit(exit_xirc2ps_cs);
1917
 
1918
#ifndef MODULE
1919
static int __init setup_xirc2ps_cs(char *str)
1920
{
1921
        /* if_port, full_duplex, do_sound, lockup_hack
1922
         */
1923
        int ints[10] = { -1 };
1924
 
1925
        str = get_options(str, 9, ints);
1926
 
1927
#define MAYBE_SET(X,Y) if (ints[0] >= Y && ints[Y] != -1) { X = ints[Y]; }
1928
        MAYBE_SET(if_port, 3);
1929
        MAYBE_SET(full_duplex, 4);
1930
        MAYBE_SET(do_sound, 5);
1931
        MAYBE_SET(lockup_hack, 6);
1932
#undef  MAYBE_SET
1933
 
1934
        return 1;
1935
}
1936
 
1937
__setup("xirc2ps_cs=", setup_xirc2ps_cs);
1938
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.