~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise-security

« back to all changes in this revision

Viewing changes to drivers/net/tulip/dmfe.c

  • Committer: Package Import Robot
  • Author(s): Paolo Pisati, Paolo Pisati
  • Date: 2011-12-06 15:56:07 UTC
  • Revision ID: package-import@ubuntu.com-20111206155607-pcf44kv5fmhk564f
Tags: 3.2.0-1401.1
[ Paolo Pisati ]

* Rebased on top of Ubuntu-3.2.0-3.8
* Tilt-tracking @ ef2487af4bb15bdd0689631774b5a5e3a59f74e2
* Delete debian.ti-omap4/control, it shoudln't be tracked
* Fix architecture spelling (s/armel/armhf/)
* [Config] Update configs following 3.2 import
* [Config] Fix compilation: disable CODA and ARCH_OMAP3
* [Config] Fix compilation: disable Ethernet Faraday
* Update series to precise

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
    A Davicom DM9102/DM9102A/DM9102A+DM9801/DM9102A+DM9802 NIC fast
3
 
    ethernet driver for Linux.
4
 
    Copyright (C) 1997  Sten Wang
5
 
 
6
 
    This program is free software; you can redistribute it and/or
7
 
    modify it under the terms of the GNU General Public License
8
 
    as published by the Free Software Foundation; either version 2
9
 
    of the License, or (at your option) any later version.
10
 
 
11
 
    This program is distributed in the hope that it will be useful,
12
 
    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
    GNU General Public License for more details.
15
 
 
16
 
    DAVICOM Web-Site: www.davicom.com.tw
17
 
 
18
 
    Author: Sten Wang, 886-3-5798797-8517, E-mail: sten_wang@davicom.com.tw
19
 
    Maintainer: Tobias Ringstrom <tori@unhappy.mine.nu>
20
 
 
21
 
    (C)Copyright 1997-1998 DAVICOM Semiconductor,Inc. All Rights Reserved.
22
 
 
23
 
    Marcelo Tosatti <marcelo@conectiva.com.br> :
24
 
    Made it compile in 2.3 (device to net_device)
25
 
 
26
 
    Alan Cox <alan@lxorguk.ukuu.org.uk> :
27
 
    Cleaned up for kernel merge.
28
 
    Removed the back compatibility support
29
 
    Reformatted, fixing spelling etc as I went
30
 
    Removed IRQ 0-15 assumption
31
 
 
32
 
    Jeff Garzik <jgarzik@pobox.com> :
33
 
    Updated to use new PCI driver API.
34
 
    Resource usage cleanups.
35
 
    Report driver version to user.
36
 
 
37
 
    Tobias Ringstrom <tori@unhappy.mine.nu> :
38
 
    Cleaned up and added SMP safety.  Thanks go to Jeff Garzik,
39
 
    Andrew Morton and Frank Davis for the SMP safety fixes.
40
 
 
41
 
    Vojtech Pavlik <vojtech@suse.cz> :
42
 
    Cleaned up pointer arithmetics.
43
 
    Fixed a lot of 64bit issues.
44
 
    Cleaned up printk()s a bit.
45
 
    Fixed some obvious big endian problems.
46
 
 
47
 
    Tobias Ringstrom <tori@unhappy.mine.nu> :
48
 
    Use time_after for jiffies calculation.  Added ethtool
49
 
    support.  Updated PCI resource allocation.  Do not
50
 
    forget to unmap PCI mapped skbs.
51
 
 
52
 
    Alan Cox <alan@lxorguk.ukuu.org.uk>
53
 
    Added new PCI identifiers provided by Clear Zhang at ALi
54
 
    for their 1563 ethernet device.
55
 
 
56
 
    TODO
57
 
 
58
 
    Check on 64 bit boxes.
59
 
    Check and fix on big endian boxes.
60
 
 
61
 
    Test and make sure PCI latency is now correct for all cases.
62
 
*/
63
 
 
64
 
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
65
 
 
66
 
#define DRV_NAME        "dmfe"
67
 
#define DRV_VERSION     "1.36.4"
68
 
#define DRV_RELDATE     "2002-01-17"
69
 
 
70
 
#include <linux/module.h>
71
 
#include <linux/kernel.h>
72
 
#include <linux/string.h>
73
 
#include <linux/timer.h>
74
 
#include <linux/ptrace.h>
75
 
#include <linux/errno.h>
76
 
#include <linux/ioport.h>
77
 
#include <linux/interrupt.h>
78
 
#include <linux/pci.h>
79
 
#include <linux/dma-mapping.h>
80
 
#include <linux/init.h>
81
 
#include <linux/netdevice.h>
82
 
#include <linux/etherdevice.h>
83
 
#include <linux/ethtool.h>
84
 
#include <linux/skbuff.h>
85
 
#include <linux/delay.h>
86
 
#include <linux/spinlock.h>
87
 
#include <linux/crc32.h>
88
 
#include <linux/bitops.h>
89
 
 
90
 
#include <asm/processor.h>
91
 
#include <asm/io.h>
92
 
#include <asm/dma.h>
93
 
#include <asm/uaccess.h>
94
 
#include <asm/irq.h>
95
 
 
96
 
#ifdef CONFIG_TULIP_DM910X
97
 
#include <linux/of.h>
98
 
#endif
99
 
 
100
 
 
101
 
/* Board/System/Debug information/definition ---------------- */
102
 
#define PCI_DM9132_ID   0x91321282      /* Davicom DM9132 ID */
103
 
#define PCI_DM9102_ID   0x91021282      /* Davicom DM9102 ID */
104
 
#define PCI_DM9100_ID   0x91001282      /* Davicom DM9100 ID */
105
 
#define PCI_DM9009_ID   0x90091282      /* Davicom DM9009 ID */
106
 
 
107
 
#define DM9102_IO_SIZE  0x80
108
 
#define DM9102A_IO_SIZE 0x100
109
 
#define TX_MAX_SEND_CNT 0x1             /* Maximum tx packet per time */
110
 
#define TX_DESC_CNT     0x10            /* Allocated Tx descriptors */
111
 
#define RX_DESC_CNT     0x20            /* Allocated Rx descriptors */
112
 
#define TX_FREE_DESC_CNT (TX_DESC_CNT - 2)      /* Max TX packet count */
113
 
#define TX_WAKE_DESC_CNT (TX_DESC_CNT - 3)      /* TX wakeup count */
114
 
#define DESC_ALL_CNT    (TX_DESC_CNT + RX_DESC_CNT)
115
 
#define TX_BUF_ALLOC    0x600
116
 
#define RX_ALLOC_SIZE   0x620
117
 
#define DM910X_RESET    1
118
 
#define CR0_DEFAULT     0x00E00000      /* TX & RX burst mode */
119
 
#define CR6_DEFAULT     0x00080000      /* HD */
120
 
#define CR7_DEFAULT     0x180c1
121
 
#define CR15_DEFAULT    0x06            /* TxJabber RxWatchdog */
122
 
#define TDES0_ERR_MASK  0x4302          /* TXJT, LC, EC, FUE */
123
 
#define MAX_PACKET_SIZE 1514
124
 
#define DMFE_MAX_MULTICAST 14
125
 
#define RX_COPY_SIZE    100
126
 
#define MAX_CHECK_PACKET 0x8000
127
 
#define DM9801_NOISE_FLOOR 8
128
 
#define DM9802_NOISE_FLOOR 5
129
 
 
130
 
#define DMFE_WOL_LINKCHANGE     0x20000000
131
 
#define DMFE_WOL_SAMPLEPACKET   0x10000000
132
 
#define DMFE_WOL_MAGICPACKET    0x08000000
133
 
 
134
 
 
135
 
#define DMFE_10MHF      0
136
 
#define DMFE_100MHF     1
137
 
#define DMFE_10MFD      4
138
 
#define DMFE_100MFD     5
139
 
#define DMFE_AUTO       8
140
 
#define DMFE_1M_HPNA    0x10
141
 
 
142
 
#define DMFE_TXTH_72    0x400000        /* TX TH 72 byte */
143
 
#define DMFE_TXTH_96    0x404000        /* TX TH 96 byte */
144
 
#define DMFE_TXTH_128   0x0000          /* TX TH 128 byte */
145
 
#define DMFE_TXTH_256   0x4000          /* TX TH 256 byte */
146
 
#define DMFE_TXTH_512   0x8000          /* TX TH 512 byte */
147
 
#define DMFE_TXTH_1K    0xC000          /* TX TH 1K  byte */
148
 
 
149
 
#define DMFE_TIMER_WUT  (jiffies + HZ * 1)/* timer wakeup time : 1 second */
150
 
#define DMFE_TX_TIMEOUT ((3*HZ)/2)      /* tx packet time-out time 1.5 s" */
151
 
#define DMFE_TX_KICK    (HZ/2)  /* tx packet Kick-out time 0.5 s" */
152
 
 
153
 
#define DMFE_DBUG(dbug_now, msg, value)                 \
154
 
        do {                                            \
155
 
                if (dmfe_debug || (dbug_now))           \
156
 
                        pr_err("%s %lx\n",              \
157
 
                               (msg), (long) (value));  \
158
 
        } while (0)
159
 
 
160
 
#define SHOW_MEDIA_TYPE(mode)                           \
161
 
        pr_info("Change Speed to %sMhz %s duplex\n" ,   \
162
 
                (mode & 1) ? "100":"10",                \
163
 
                (mode & 4) ? "full":"half");
164
 
 
165
 
 
166
 
/* CR9 definition: SROM/MII */
167
 
#define CR9_SROM_READ   0x4800
168
 
#define CR9_SRCS        0x1
169
 
#define CR9_SRCLK       0x2
170
 
#define CR9_CRDOUT      0x8
171
 
#define SROM_DATA_0     0x0
172
 
#define SROM_DATA_1     0x4
173
 
#define PHY_DATA_1      0x20000
174
 
#define PHY_DATA_0      0x00000
175
 
#define MDCLKH          0x10000
176
 
 
177
 
#define PHY_POWER_DOWN  0x800
178
 
 
179
 
#define SROM_V41_CODE   0x14
180
 
 
181
 
#define SROM_CLK_WRITE(data, ioaddr) \
182
 
        outl(data|CR9_SROM_READ|CR9_SRCS,ioaddr); \
183
 
        udelay(5); \
184
 
        outl(data|CR9_SROM_READ|CR9_SRCS|CR9_SRCLK,ioaddr); \
185
 
        udelay(5); \
186
 
        outl(data|CR9_SROM_READ|CR9_SRCS,ioaddr); \
187
 
        udelay(5);
188
 
 
189
 
#define __CHK_IO_SIZE(pci_id, dev_rev) \
190
 
 (( ((pci_id)==PCI_DM9132_ID) || ((dev_rev) >= 0x30) ) ? \
191
 
        DM9102A_IO_SIZE: DM9102_IO_SIZE)
192
 
 
193
 
#define CHK_IO_SIZE(pci_dev) \
194
 
        (__CHK_IO_SIZE(((pci_dev)->device << 16) | (pci_dev)->vendor, \
195
 
        (pci_dev)->revision))
196
 
 
197
 
/* Sten Check */
198
 
#define DEVICE net_device
199
 
 
200
 
/* Structure/enum declaration ------------------------------- */
201
 
struct tx_desc {
202
 
        __le32 tdes0, tdes1, tdes2, tdes3; /* Data for the card */
203
 
        char *tx_buf_ptr;               /* Data for us */
204
 
        struct tx_desc *next_tx_desc;
205
 
} __attribute__(( aligned(32) ));
206
 
 
207
 
struct rx_desc {
208
 
        __le32 rdes0, rdes1, rdes2, rdes3; /* Data for the card */
209
 
        struct sk_buff *rx_skb_ptr;     /* Data for us */
210
 
        struct rx_desc *next_rx_desc;
211
 
} __attribute__(( aligned(32) ));
212
 
 
213
 
struct dmfe_board_info {
214
 
        u32 chip_id;                    /* Chip vendor/Device ID */
215
 
        u8 chip_revision;               /* Chip revision */
216
 
        struct DEVICE *next_dev;        /* next device */
217
 
        struct pci_dev *pdev;           /* PCI device */
218
 
        spinlock_t lock;
219
 
 
220
 
        long ioaddr;                    /* I/O base address */
221
 
        u32 cr0_data;
222
 
        u32 cr5_data;
223
 
        u32 cr6_data;
224
 
        u32 cr7_data;
225
 
        u32 cr15_data;
226
 
 
227
 
        /* pointer for memory physical address */
228
 
        dma_addr_t buf_pool_dma_ptr;    /* Tx buffer pool memory */
229
 
        dma_addr_t buf_pool_dma_start;  /* Tx buffer pool align dword */
230
 
        dma_addr_t desc_pool_dma_ptr;   /* descriptor pool memory */
231
 
        dma_addr_t first_tx_desc_dma;
232
 
        dma_addr_t first_rx_desc_dma;
233
 
 
234
 
        /* descriptor pointer */
235
 
        unsigned char *buf_pool_ptr;    /* Tx buffer pool memory */
236
 
        unsigned char *buf_pool_start;  /* Tx buffer pool align dword */
237
 
        unsigned char *desc_pool_ptr;   /* descriptor pool memory */
238
 
        struct tx_desc *first_tx_desc;
239
 
        struct tx_desc *tx_insert_ptr;
240
 
        struct tx_desc *tx_remove_ptr;
241
 
        struct rx_desc *first_rx_desc;
242
 
        struct rx_desc *rx_insert_ptr;
243
 
        struct rx_desc *rx_ready_ptr;   /* packet come pointer */
244
 
        unsigned long tx_packet_cnt;    /* transmitted packet count */
245
 
        unsigned long tx_queue_cnt;     /* wait to send packet count */
246
 
        unsigned long rx_avail_cnt;     /* available rx descriptor count */
247
 
        unsigned long interval_rx_cnt;  /* rx packet count a callback time */
248
 
 
249
 
        u16 HPNA_command;               /* For HPNA register 16 */
250
 
        u16 HPNA_timer;                 /* For HPNA remote device check */
251
 
        u16 dbug_cnt;
252
 
        u16 NIC_capability;             /* NIC media capability */
253
 
        u16 PHY_reg4;                   /* Saved Phyxcer register 4 value */
254
 
 
255
 
        u8 HPNA_present;                /* 0:none, 1:DM9801, 2:DM9802 */
256
 
        u8 chip_type;                   /* Keep DM9102A chip type */
257
 
        u8 media_mode;                  /* user specify media mode */
258
 
        u8 op_mode;                     /* real work media mode */
259
 
        u8 phy_addr;
260
 
        u8 wait_reset;                  /* Hardware failed, need to reset */
261
 
        u8 dm910x_chk_mode;             /* Operating mode check */
262
 
        u8 first_in_callback;           /* Flag to record state */
263
 
        u8 wol_mode;                    /* user WOL settings */
264
 
        struct timer_list timer;
265
 
 
266
 
        /* Driver defined statistic counter */
267
 
        unsigned long tx_fifo_underrun;
268
 
        unsigned long tx_loss_carrier;
269
 
        unsigned long tx_no_carrier;
270
 
        unsigned long tx_late_collision;
271
 
        unsigned long tx_excessive_collision;
272
 
        unsigned long tx_jabber_timeout;
273
 
        unsigned long reset_count;
274
 
        unsigned long reset_cr8;
275
 
        unsigned long reset_fatal;
276
 
        unsigned long reset_TXtimeout;
277
 
 
278
 
        /* NIC SROM data */
279
 
        unsigned char srom[128];
280
 
};
281
 
 
282
 
enum dmfe_offsets {
283
 
        DCR0 = 0x00, DCR1 = 0x08, DCR2 = 0x10, DCR3 = 0x18, DCR4 = 0x20,
284
 
        DCR5 = 0x28, DCR6 = 0x30, DCR7 = 0x38, DCR8 = 0x40, DCR9 = 0x48,
285
 
        DCR10 = 0x50, DCR11 = 0x58, DCR12 = 0x60, DCR13 = 0x68, DCR14 = 0x70,
286
 
        DCR15 = 0x78
287
 
};
288
 
 
289
 
enum dmfe_CR6_bits {
290
 
        CR6_RXSC = 0x2, CR6_PBF = 0x8, CR6_PM = 0x40, CR6_PAM = 0x80,
291
 
        CR6_FDM = 0x200, CR6_TXSC = 0x2000, CR6_STI = 0x100000,
292
 
        CR6_SFT = 0x200000, CR6_RXA = 0x40000000, CR6_NO_PURGE = 0x20000000
293
 
};
294
 
 
295
 
/* Global variable declaration ----------------------------- */
296
 
static int __devinitdata printed_version;
297
 
static const char version[] __devinitconst =
298
 
        "Davicom DM9xxx net driver, version " DRV_VERSION " (" DRV_RELDATE ")";
299
 
 
300
 
static int dmfe_debug;
301
 
static unsigned char dmfe_media_mode = DMFE_AUTO;
302
 
static u32 dmfe_cr6_user_set;
303
 
 
304
 
/* For module input parameter */
305
 
static int debug;
306
 
static u32 cr6set;
307
 
static unsigned char mode = 8;
308
 
static u8 chkmode = 1;
309
 
static u8 HPNA_mode;            /* Default: Low Power/High Speed */
310
 
static u8 HPNA_rx_cmd;          /* Default: Disable Rx remote command */
311
 
static u8 HPNA_tx_cmd;          /* Default: Don't issue remote command */
312
 
static u8 HPNA_NoiseFloor;      /* Default: HPNA NoiseFloor */
313
 
static u8 SF_mode;              /* Special Function: 1:VLAN, 2:RX Flow Control
314
 
                                   4: TX pause packet */
315
 
 
316
 
 
317
 
/* function declaration ------------------------------------- */
318
 
static int dmfe_open(struct DEVICE *);
319
 
static netdev_tx_t dmfe_start_xmit(struct sk_buff *, struct DEVICE *);
320
 
static int dmfe_stop(struct DEVICE *);
321
 
static void dmfe_set_filter_mode(struct DEVICE *);
322
 
static const struct ethtool_ops netdev_ethtool_ops;
323
 
static u16 read_srom_word(long ,int);
324
 
static irqreturn_t dmfe_interrupt(int , void *);
325
 
#ifdef CONFIG_NET_POLL_CONTROLLER
326
 
static void poll_dmfe (struct net_device *dev);
327
 
#endif
328
 
static void dmfe_descriptor_init(struct dmfe_board_info *, unsigned long);
329
 
static void allocate_rx_buffer(struct dmfe_board_info *);
330
 
static void update_cr6(u32, unsigned long);
331
 
static void send_filter_frame(struct DEVICE *);
332
 
static void dm9132_id_table(struct DEVICE *);
333
 
static u16 phy_read(unsigned long, u8, u8, u32);
334
 
static void phy_write(unsigned long, u8, u8, u16, u32);
335
 
static void phy_write_1bit(unsigned long, u32);
336
 
static u16 phy_read_1bit(unsigned long);
337
 
static u8 dmfe_sense_speed(struct dmfe_board_info *);
338
 
static void dmfe_process_mode(struct dmfe_board_info *);
339
 
static void dmfe_timer(unsigned long);
340
 
static inline u32 cal_CRC(unsigned char *, unsigned int, u8);
341
 
static void dmfe_rx_packet(struct DEVICE *, struct dmfe_board_info *);
342
 
static void dmfe_free_tx_pkt(struct DEVICE *, struct dmfe_board_info *);
343
 
static void dmfe_reuse_skb(struct dmfe_board_info *, struct sk_buff *);
344
 
static void dmfe_dynamic_reset(struct DEVICE *);
345
 
static void dmfe_free_rxbuffer(struct dmfe_board_info *);
346
 
static void dmfe_init_dm910x(struct DEVICE *);
347
 
static void dmfe_parse_srom(struct dmfe_board_info *);
348
 
static void dmfe_program_DM9801(struct dmfe_board_info *, int);
349
 
static void dmfe_program_DM9802(struct dmfe_board_info *);
350
 
static void dmfe_HPNA_remote_cmd_chk(struct dmfe_board_info * );
351
 
static void dmfe_set_phyxcer(struct dmfe_board_info *);
352
 
 
353
 
/* DM910X network board routine ---------------------------- */
354
 
 
355
 
static const struct net_device_ops netdev_ops = {
356
 
        .ndo_open               = dmfe_open,
357
 
        .ndo_stop               = dmfe_stop,
358
 
        .ndo_start_xmit         = dmfe_start_xmit,
359
 
        .ndo_set_multicast_list = dmfe_set_filter_mode,
360
 
        .ndo_change_mtu         = eth_change_mtu,
361
 
        .ndo_set_mac_address    = eth_mac_addr,
362
 
        .ndo_validate_addr      = eth_validate_addr,
363
 
#ifdef CONFIG_NET_POLL_CONTROLLER
364
 
        .ndo_poll_controller    = poll_dmfe,
365
 
#endif
366
 
};
367
 
 
368
 
/*
369
 
 *      Search DM910X board ,allocate space and register it
370
 
 */
371
 
 
372
 
static int __devinit dmfe_init_one (struct pci_dev *pdev,
373
 
                                    const struct pci_device_id *ent)
374
 
{
375
 
        struct dmfe_board_info *db;     /* board information structure */
376
 
        struct net_device *dev;
377
 
        u32 pci_pmr;
378
 
        int i, err;
379
 
 
380
 
        DMFE_DBUG(0, "dmfe_init_one()", 0);
381
 
 
382
 
        if (!printed_version++)
383
 
                pr_info("%s\n", version);
384
 
 
385
 
        /*
386
 
         *      SPARC on-board DM910x chips should be handled by the main
387
 
         *      tulip driver, except for early DM9100s.
388
 
         */
389
 
#ifdef CONFIG_TULIP_DM910X
390
 
        if ((ent->driver_data == PCI_DM9100_ID && pdev->revision >= 0x30) ||
391
 
            ent->driver_data == PCI_DM9102_ID) {
392
 
                struct device_node *dp = pci_device_to_OF_node(pdev);
393
 
 
394
 
                if (dp && of_get_property(dp, "local-mac-address", NULL)) {
395
 
                        pr_info("skipping on-board DM910x (use tulip)\n");
396
 
                        return -ENODEV;
397
 
                }
398
 
        }
399
 
#endif
400
 
 
401
 
        /* Init network device */
402
 
        dev = alloc_etherdev(sizeof(*db));
403
 
        if (dev == NULL)
404
 
                return -ENOMEM;
405
 
        SET_NETDEV_DEV(dev, &pdev->dev);
406
 
 
407
 
        if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
408
 
                pr_warn("32-bit PCI DMA not available\n");
409
 
                err = -ENODEV;
410
 
                goto err_out_free;
411
 
        }
412
 
 
413
 
        /* Enable Master/IO access, Disable memory access */
414
 
        err = pci_enable_device(pdev);
415
 
        if (err)
416
 
                goto err_out_free;
417
 
 
418
 
        if (!pci_resource_start(pdev, 0)) {
419
 
                pr_err("I/O base is zero\n");
420
 
                err = -ENODEV;
421
 
                goto err_out_disable;
422
 
        }
423
 
 
424
 
        if (pci_resource_len(pdev, 0) < (CHK_IO_SIZE(pdev)) ) {
425
 
                pr_err("Allocated I/O size too small\n");
426
 
                err = -ENODEV;
427
 
                goto err_out_disable;
428
 
        }
429
 
 
430
 
#if 0   /* pci_{enable_device,set_master} sets minimum latency for us now */
431
 
 
432
 
        /* Set Latency Timer 80h */
433
 
        /* FIXME: setting values > 32 breaks some SiS 559x stuff.
434
 
           Need a PCI quirk.. */
435
 
 
436
 
        pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x80);
437
 
#endif
438
 
 
439
 
        if (pci_request_regions(pdev, DRV_NAME)) {
440
 
                pr_err("Failed to request PCI regions\n");
441
 
                err = -ENODEV;
442
 
                goto err_out_disable;
443
 
        }
444
 
 
445
 
        /* Init system & device */
446
 
        db = netdev_priv(dev);
447
 
 
448
 
        /* Allocate Tx/Rx descriptor memory */
449
 
        db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) *
450
 
                        DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr);
451
 
        if (!db->desc_pool_ptr)
452
 
                goto err_out_res;
453
 
 
454
 
        db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC *
455
 
                        TX_DESC_CNT + 4, &db->buf_pool_dma_ptr);
456
 
        if (!db->buf_pool_ptr)
457
 
                goto err_out_free_desc;
458
 
 
459
 
        db->first_tx_desc = (struct tx_desc *) db->desc_pool_ptr;
460
 
        db->first_tx_desc_dma = db->desc_pool_dma_ptr;
461
 
        db->buf_pool_start = db->buf_pool_ptr;
462
 
        db->buf_pool_dma_start = db->buf_pool_dma_ptr;
463
 
 
464
 
        db->chip_id = ent->driver_data;
465
 
        db->ioaddr = pci_resource_start(pdev, 0);
466
 
        db->chip_revision = pdev->revision;
467
 
        db->wol_mode = 0;
468
 
 
469
 
        db->pdev = pdev;
470
 
 
471
 
        dev->base_addr = db->ioaddr;
472
 
        dev->irq = pdev->irq;
473
 
        pci_set_drvdata(pdev, dev);
474
 
        dev->netdev_ops = &netdev_ops;
475
 
        dev->ethtool_ops = &netdev_ethtool_ops;
476
 
        netif_carrier_off(dev);
477
 
        spin_lock_init(&db->lock);
478
 
 
479
 
        pci_read_config_dword(pdev, 0x50, &pci_pmr);
480
 
        pci_pmr &= 0x70000;
481
 
        if ( (pci_pmr == 0x10000) && (db->chip_revision == 0x31) )
482
 
                db->chip_type = 1;      /* DM9102A E3 */
483
 
        else
484
 
                db->chip_type = 0;
485
 
 
486
 
        /* read 64 word srom data */
487
 
        for (i = 0; i < 64; i++)
488
 
                ((__le16 *) db->srom)[i] =
489
 
                        cpu_to_le16(read_srom_word(db->ioaddr, i));
490
 
 
491
 
        /* Set Node address */
492
 
        for (i = 0; i < 6; i++)
493
 
                dev->dev_addr[i] = db->srom[20 + i];
494
 
 
495
 
        err = register_netdev (dev);
496
 
        if (err)
497
 
                goto err_out_free_buf;
498
 
 
499
 
        dev_info(&dev->dev, "Davicom DM%04lx at pci%s, %pM, irq %d\n",
500
 
                 ent->driver_data >> 16,
501
 
                 pci_name(pdev), dev->dev_addr, dev->irq);
502
 
 
503
 
        pci_set_master(pdev);
504
 
 
505
 
        return 0;
506
 
 
507
 
err_out_free_buf:
508
 
        pci_free_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4,
509
 
                            db->buf_pool_ptr, db->buf_pool_dma_ptr);
510
 
err_out_free_desc:
511
 
        pci_free_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20,
512
 
                            db->desc_pool_ptr, db->desc_pool_dma_ptr);
513
 
err_out_res:
514
 
        pci_release_regions(pdev);
515
 
err_out_disable:
516
 
        pci_disable_device(pdev);
517
 
err_out_free:
518
 
        pci_set_drvdata(pdev, NULL);
519
 
        free_netdev(dev);
520
 
 
521
 
        return err;
522
 
}
523
 
 
524
 
 
525
 
static void __devexit dmfe_remove_one (struct pci_dev *pdev)
526
 
{
527
 
        struct net_device *dev = pci_get_drvdata(pdev);
528
 
        struct dmfe_board_info *db = netdev_priv(dev);
529
 
 
530
 
        DMFE_DBUG(0, "dmfe_remove_one()", 0);
531
 
 
532
 
        if (dev) {
533
 
 
534
 
                unregister_netdev(dev);
535
 
 
536
 
                pci_free_consistent(db->pdev, sizeof(struct tx_desc) *
537
 
                                        DESC_ALL_CNT + 0x20, db->desc_pool_ptr,
538
 
                                        db->desc_pool_dma_ptr);
539
 
                pci_free_consistent(db->pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4,
540
 
                                        db->buf_pool_ptr, db->buf_pool_dma_ptr);
541
 
                pci_release_regions(pdev);
542
 
                free_netdev(dev);       /* free board information */
543
 
 
544
 
                pci_set_drvdata(pdev, NULL);
545
 
        }
546
 
 
547
 
        DMFE_DBUG(0, "dmfe_remove_one() exit", 0);
548
 
}
549
 
 
550
 
 
551
 
/*
552
 
 *      Open the interface.
553
 
 *      The interface is opened whenever "ifconfig" actives it.
554
 
 */
555
 
 
556
 
static int dmfe_open(struct DEVICE *dev)
557
 
{
558
 
        int ret;
559
 
        struct dmfe_board_info *db = netdev_priv(dev);
560
 
 
561
 
        DMFE_DBUG(0, "dmfe_open", 0);
562
 
 
563
 
        ret = request_irq(dev->irq, dmfe_interrupt,
564
 
                          IRQF_SHARED, dev->name, dev);
565
 
        if (ret)
566
 
                return ret;
567
 
 
568
 
        /* system variable init */
569
 
        db->cr6_data = CR6_DEFAULT | dmfe_cr6_user_set;
570
 
        db->tx_packet_cnt = 0;
571
 
        db->tx_queue_cnt = 0;
572
 
        db->rx_avail_cnt = 0;
573
 
        db->wait_reset = 0;
574
 
 
575
 
        db->first_in_callback = 0;
576
 
        db->NIC_capability = 0xf;       /* All capability*/
577
 
        db->PHY_reg4 = 0x1e0;
578
 
 
579
 
        /* CR6 operation mode decision */
580
 
        if ( !chkmode || (db->chip_id == PCI_DM9132_ID) ||
581
 
                (db->chip_revision >= 0x30) ) {
582
 
                db->cr6_data |= DMFE_TXTH_256;
583
 
                db->cr0_data = CR0_DEFAULT;
584
 
                db->dm910x_chk_mode=4;          /* Enter the normal mode */
585
 
        } else {
586
 
                db->cr6_data |= CR6_SFT;        /* Store & Forward mode */
587
 
                db->cr0_data = 0;
588
 
                db->dm910x_chk_mode = 1;        /* Enter the check mode */
589
 
        }
590
 
 
591
 
        /* Initialize DM910X board */
592
 
        dmfe_init_dm910x(dev);
593
 
 
594
 
        /* Active System Interface */
595
 
        netif_wake_queue(dev);
596
 
 
597
 
        /* set and active a timer process */
598
 
        init_timer(&db->timer);
599
 
        db->timer.expires = DMFE_TIMER_WUT + HZ * 2;
600
 
        db->timer.data = (unsigned long)dev;
601
 
        db->timer.function = dmfe_timer;
602
 
        add_timer(&db->timer);
603
 
 
604
 
        return 0;
605
 
}
606
 
 
607
 
 
608
 
/*      Initialize DM910X board
609
 
 *      Reset DM910X board
610
 
 *      Initialize TX/Rx descriptor chain structure
611
 
 *      Send the set-up frame
612
 
 *      Enable Tx/Rx machine
613
 
 */
614
 
 
615
 
static void dmfe_init_dm910x(struct DEVICE *dev)
616
 
{
617
 
        struct dmfe_board_info *db = netdev_priv(dev);
618
 
        unsigned long ioaddr = db->ioaddr;
619
 
 
620
 
        DMFE_DBUG(0, "dmfe_init_dm910x()", 0);
621
 
 
622
 
        /* Reset DM910x MAC controller */
623
 
        outl(DM910X_RESET, ioaddr + DCR0);      /* RESET MAC */
624
 
        udelay(100);
625
 
        outl(db->cr0_data, ioaddr + DCR0);
626
 
        udelay(5);
627
 
 
628
 
        /* Phy addr : DM910(A)2/DM9132/9801, phy address = 1 */
629
 
        db->phy_addr = 1;
630
 
 
631
 
        /* Parser SROM and media mode */
632
 
        dmfe_parse_srom(db);
633
 
        db->media_mode = dmfe_media_mode;
634
 
 
635
 
        /* RESET Phyxcer Chip by GPR port bit 7 */
636
 
        outl(0x180, ioaddr + DCR12);            /* Let bit 7 output port */
637
 
        if (db->chip_id == PCI_DM9009_ID) {
638
 
                outl(0x80, ioaddr + DCR12);     /* Issue RESET signal */
639
 
                mdelay(300);                    /* Delay 300 ms */
640
 
        }
641
 
        outl(0x0, ioaddr + DCR12);      /* Clear RESET signal */
642
 
 
643
 
        /* Process Phyxcer Media Mode */
644
 
        if ( !(db->media_mode & 0x10) ) /* Force 1M mode */
645
 
                dmfe_set_phyxcer(db);
646
 
 
647
 
        /* Media Mode Process */
648
 
        if ( !(db->media_mode & DMFE_AUTO) )
649
 
                db->op_mode = db->media_mode;   /* Force Mode */
650
 
 
651
 
        /* Initialize Transmit/Receive decriptor and CR3/4 */
652
 
        dmfe_descriptor_init(db, ioaddr);
653
 
 
654
 
        /* Init CR6 to program DM910x operation */
655
 
        update_cr6(db->cr6_data, ioaddr);
656
 
 
657
 
        /* Send setup frame */
658
 
        if (db->chip_id == PCI_DM9132_ID)
659
 
                dm9132_id_table(dev);   /* DM9132 */
660
 
        else
661
 
                send_filter_frame(dev); /* DM9102/DM9102A */
662
 
 
663
 
        /* Init CR7, interrupt active bit */
664
 
        db->cr7_data = CR7_DEFAULT;
665
 
        outl(db->cr7_data, ioaddr + DCR7);
666
 
 
667
 
        /* Init CR15, Tx jabber and Rx watchdog timer */
668
 
        outl(db->cr15_data, ioaddr + DCR15);
669
 
 
670
 
        /* Enable DM910X Tx/Rx function */
671
 
        db->cr6_data |= CR6_RXSC | CR6_TXSC | 0x40000;
672
 
        update_cr6(db->cr6_data, ioaddr);
673
 
}
674
 
 
675
 
 
676
 
/*
677
 
 *      Hardware start transmission.
678
 
 *      Send a packet to media from the upper layer.
679
 
 */
680
 
 
681
 
static netdev_tx_t dmfe_start_xmit(struct sk_buff *skb,
682
 
                                         struct DEVICE *dev)
683
 
{
684
 
        struct dmfe_board_info *db = netdev_priv(dev);
685
 
        struct tx_desc *txptr;
686
 
        unsigned long flags;
687
 
 
688
 
        DMFE_DBUG(0, "dmfe_start_xmit", 0);
689
 
 
690
 
        /* Too large packet check */
691
 
        if (skb->len > MAX_PACKET_SIZE) {
692
 
                pr_err("big packet = %d\n", (u16)skb->len);
693
 
                dev_kfree_skb(skb);
694
 
                return NETDEV_TX_OK;
695
 
        }
696
 
 
697
 
        /* Resource flag check */
698
 
        netif_stop_queue(dev);
699
 
 
700
 
        spin_lock_irqsave(&db->lock, flags);
701
 
 
702
 
        /* No Tx resource check, it never happen nromally */
703
 
        if (db->tx_queue_cnt >= TX_FREE_DESC_CNT) {
704
 
                spin_unlock_irqrestore(&db->lock, flags);
705
 
                pr_err("No Tx resource %ld\n", db->tx_queue_cnt);
706
 
                return NETDEV_TX_BUSY;
707
 
        }
708
 
 
709
 
        /* Disable NIC interrupt */
710
 
        outl(0, dev->base_addr + DCR7);
711
 
 
712
 
        /* transmit this packet */
713
 
        txptr = db->tx_insert_ptr;
714
 
        skb_copy_from_linear_data(skb, txptr->tx_buf_ptr, skb->len);
715
 
        txptr->tdes1 = cpu_to_le32(0xe1000000 | skb->len);
716
 
 
717
 
        /* Point to next transmit free descriptor */
718
 
        db->tx_insert_ptr = txptr->next_tx_desc;
719
 
 
720
 
        /* Transmit Packet Process */
721
 
        if ( (!db->tx_queue_cnt) && (db->tx_packet_cnt < TX_MAX_SEND_CNT) ) {
722
 
                txptr->tdes0 = cpu_to_le32(0x80000000); /* Set owner bit */
723
 
                db->tx_packet_cnt++;                    /* Ready to send */
724
 
                outl(0x1, dev->base_addr + DCR1);       /* Issue Tx polling */
725
 
                dev->trans_start = jiffies;             /* saved time stamp */
726
 
        } else {
727
 
                db->tx_queue_cnt++;                     /* queue TX packet */
728
 
                outl(0x1, dev->base_addr + DCR1);       /* Issue Tx polling */
729
 
        }
730
 
 
731
 
        /* Tx resource check */
732
 
        if ( db->tx_queue_cnt < TX_FREE_DESC_CNT )
733
 
                netif_wake_queue(dev);
734
 
 
735
 
        /* Restore CR7 to enable interrupt */
736
 
        spin_unlock_irqrestore(&db->lock, flags);
737
 
        outl(db->cr7_data, dev->base_addr + DCR7);
738
 
 
739
 
        /* free this SKB */
740
 
        dev_kfree_skb(skb);
741
 
 
742
 
        return NETDEV_TX_OK;
743
 
}
744
 
 
745
 
 
746
 
/*
747
 
 *      Stop the interface.
748
 
 *      The interface is stopped when it is brought.
749
 
 */
750
 
 
751
 
static int dmfe_stop(struct DEVICE *dev)
752
 
{
753
 
        struct dmfe_board_info *db = netdev_priv(dev);
754
 
        unsigned long ioaddr = dev->base_addr;
755
 
 
756
 
        DMFE_DBUG(0, "dmfe_stop", 0);
757
 
 
758
 
        /* disable system */
759
 
        netif_stop_queue(dev);
760
 
 
761
 
        /* deleted timer */
762
 
        del_timer_sync(&db->timer);
763
 
 
764
 
        /* Reset & stop DM910X board */
765
 
        outl(DM910X_RESET, ioaddr + DCR0);
766
 
        udelay(5);
767
 
        phy_write(db->ioaddr, db->phy_addr, 0, 0x8000, db->chip_id);
768
 
 
769
 
        /* free interrupt */
770
 
        free_irq(dev->irq, dev);
771
 
 
772
 
        /* free allocated rx buffer */
773
 
        dmfe_free_rxbuffer(db);
774
 
 
775
 
#if 0
776
 
        /* show statistic counter */
777
 
        printk("FU:%lx EC:%lx LC:%lx NC:%lx LOC:%lx TXJT:%lx RESET:%lx RCR8:%lx FAL:%lx TT:%lx\n",
778
 
               db->tx_fifo_underrun, db->tx_excessive_collision,
779
 
               db->tx_late_collision, db->tx_no_carrier, db->tx_loss_carrier,
780
 
               db->tx_jabber_timeout, db->reset_count, db->reset_cr8,
781
 
               db->reset_fatal, db->reset_TXtimeout);
782
 
#endif
783
 
 
784
 
        return 0;
785
 
}
786
 
 
787
 
 
788
 
/*
789
 
 *      DM9102 insterrupt handler
790
 
 *      receive the packet to upper layer, free the transmitted packet
791
 
 */
792
 
 
793
 
static irqreturn_t dmfe_interrupt(int irq, void *dev_id)
794
 
{
795
 
        struct DEVICE *dev = dev_id;
796
 
        struct dmfe_board_info *db = netdev_priv(dev);
797
 
        unsigned long ioaddr = dev->base_addr;
798
 
        unsigned long flags;
799
 
 
800
 
        DMFE_DBUG(0, "dmfe_interrupt()", 0);
801
 
 
802
 
        spin_lock_irqsave(&db->lock, flags);
803
 
 
804
 
        /* Got DM910X status */
805
 
        db->cr5_data = inl(ioaddr + DCR5);
806
 
        outl(db->cr5_data, ioaddr + DCR5);
807
 
        if ( !(db->cr5_data & 0xc1) ) {
808
 
                spin_unlock_irqrestore(&db->lock, flags);
809
 
                return IRQ_HANDLED;
810
 
        }
811
 
 
812
 
        /* Disable all interrupt in CR7 to solve the interrupt edge problem */
813
 
        outl(0, ioaddr + DCR7);
814
 
 
815
 
        /* Check system status */
816
 
        if (db->cr5_data & 0x2000) {
817
 
                /* system bus error happen */
818
 
                DMFE_DBUG(1, "System bus error happen. CR5=", db->cr5_data);
819
 
                db->reset_fatal++;
820
 
                db->wait_reset = 1;     /* Need to RESET */
821
 
                spin_unlock_irqrestore(&db->lock, flags);
822
 
                return IRQ_HANDLED;
823
 
        }
824
 
 
825
 
         /* Received the coming packet */
826
 
        if ( (db->cr5_data & 0x40) && db->rx_avail_cnt )
827
 
                dmfe_rx_packet(dev, db);
828
 
 
829
 
        /* reallocate rx descriptor buffer */
830
 
        if (db->rx_avail_cnt<RX_DESC_CNT)
831
 
                allocate_rx_buffer(db);
832
 
 
833
 
        /* Free the transmitted descriptor */
834
 
        if ( db->cr5_data & 0x01)
835
 
                dmfe_free_tx_pkt(dev, db);
836
 
 
837
 
        /* Mode Check */
838
 
        if (db->dm910x_chk_mode & 0x2) {
839
 
                db->dm910x_chk_mode = 0x4;
840
 
                db->cr6_data |= 0x100;
841
 
                update_cr6(db->cr6_data, db->ioaddr);
842
 
        }
843
 
 
844
 
        /* Restore CR7 to enable interrupt mask */
845
 
        outl(db->cr7_data, ioaddr + DCR7);
846
 
 
847
 
        spin_unlock_irqrestore(&db->lock, flags);
848
 
        return IRQ_HANDLED;
849
 
}
850
 
 
851
 
 
852
 
#ifdef CONFIG_NET_POLL_CONTROLLER
853
 
/*
854
 
 * Polling 'interrupt' - used by things like netconsole to send skbs
855
 
 * without having to re-enable interrupts. It's not called while
856
 
 * the interrupt routine is executing.
857
 
 */
858
 
 
859
 
static void poll_dmfe (struct net_device *dev)
860
 
{
861
 
        /* disable_irq here is not very nice, but with the lockless
862
 
           interrupt handler we have no other choice. */
863
 
        disable_irq(dev->irq);
864
 
        dmfe_interrupt (dev->irq, dev);
865
 
        enable_irq(dev->irq);
866
 
}
867
 
#endif
868
 
 
869
 
/*
870
 
 *      Free TX resource after TX complete
871
 
 */
872
 
 
873
 
static void dmfe_free_tx_pkt(struct DEVICE *dev, struct dmfe_board_info * db)
874
 
{
875
 
        struct tx_desc *txptr;
876
 
        unsigned long ioaddr = dev->base_addr;
877
 
        u32 tdes0;
878
 
 
879
 
        txptr = db->tx_remove_ptr;
880
 
        while(db->tx_packet_cnt) {
881
 
                tdes0 = le32_to_cpu(txptr->tdes0);
882
 
                if (tdes0 & 0x80000000)
883
 
                        break;
884
 
 
885
 
                /* A packet sent completed */
886
 
                db->tx_packet_cnt--;
887
 
                dev->stats.tx_packets++;
888
 
 
889
 
                /* Transmit statistic counter */
890
 
                if ( tdes0 != 0x7fffffff ) {
891
 
                        dev->stats.collisions += (tdes0 >> 3) & 0xf;
892
 
                        dev->stats.tx_bytes += le32_to_cpu(txptr->tdes1) & 0x7ff;
893
 
                        if (tdes0 & TDES0_ERR_MASK) {
894
 
                                dev->stats.tx_errors++;
895
 
 
896
 
                                if (tdes0 & 0x0002) {   /* UnderRun */
897
 
                                        db->tx_fifo_underrun++;
898
 
                                        if ( !(db->cr6_data & CR6_SFT) ) {
899
 
                                                db->cr6_data = db->cr6_data | CR6_SFT;
900
 
                                                update_cr6(db->cr6_data, db->ioaddr);
901
 
                                        }
902
 
                                }
903
 
                                if (tdes0 & 0x0100)
904
 
                                        db->tx_excessive_collision++;
905
 
                                if (tdes0 & 0x0200)
906
 
                                        db->tx_late_collision++;
907
 
                                if (tdes0 & 0x0400)
908
 
                                        db->tx_no_carrier++;
909
 
                                if (tdes0 & 0x0800)
910
 
                                        db->tx_loss_carrier++;
911
 
                                if (tdes0 & 0x4000)
912
 
                                        db->tx_jabber_timeout++;
913
 
                        }
914
 
                }
915
 
 
916
 
                txptr = txptr->next_tx_desc;
917
 
        }/* End of while */
918
 
 
919
 
        /* Update TX remove pointer to next */
920
 
        db->tx_remove_ptr = txptr;
921
 
 
922
 
        /* Send the Tx packet in queue */
923
 
        if ( (db->tx_packet_cnt < TX_MAX_SEND_CNT) && db->tx_queue_cnt ) {
924
 
                txptr->tdes0 = cpu_to_le32(0x80000000); /* Set owner bit */
925
 
                db->tx_packet_cnt++;                    /* Ready to send */
926
 
                db->tx_queue_cnt--;
927
 
                outl(0x1, ioaddr + DCR1);               /* Issue Tx polling */
928
 
                dev->trans_start = jiffies;             /* saved time stamp */
929
 
        }
930
 
 
931
 
        /* Resource available check */
932
 
        if ( db->tx_queue_cnt < TX_WAKE_DESC_CNT )
933
 
                netif_wake_queue(dev);  /* Active upper layer, send again */
934
 
}
935
 
 
936
 
 
937
 
/*
938
 
 *      Calculate the CRC valude of the Rx packet
939
 
 *      flag =  1 : return the reverse CRC (for the received packet CRC)
940
 
 *              0 : return the normal CRC (for Hash Table index)
941
 
 */
942
 
 
943
 
static inline u32 cal_CRC(unsigned char * Data, unsigned int Len, u8 flag)
944
 
{
945
 
        u32 crc = crc32(~0, Data, Len);
946
 
        if (flag) crc = ~crc;
947
 
        return crc;
948
 
}
949
 
 
950
 
 
951
 
/*
952
 
 *      Receive the come packet and pass to upper layer
953
 
 */
954
 
 
955
 
static void dmfe_rx_packet(struct DEVICE *dev, struct dmfe_board_info * db)
956
 
{
957
 
        struct rx_desc *rxptr;
958
 
        struct sk_buff *skb, *newskb;
959
 
        int rxlen;
960
 
        u32 rdes0;
961
 
 
962
 
        rxptr = db->rx_ready_ptr;
963
 
 
964
 
        while(db->rx_avail_cnt) {
965
 
                rdes0 = le32_to_cpu(rxptr->rdes0);
966
 
                if (rdes0 & 0x80000000) /* packet owner check */
967
 
                        break;
968
 
 
969
 
                db->rx_avail_cnt--;
970
 
                db->interval_rx_cnt++;
971
 
 
972
 
                pci_unmap_single(db->pdev, le32_to_cpu(rxptr->rdes2),
973
 
                                 RX_ALLOC_SIZE, PCI_DMA_FROMDEVICE);
974
 
 
975
 
                if ( (rdes0 & 0x300) != 0x300) {
976
 
                        /* A packet without First/Last flag */
977
 
                        /* reuse this SKB */
978
 
                        DMFE_DBUG(0, "Reuse SK buffer, rdes0", rdes0);
979
 
                        dmfe_reuse_skb(db, rxptr->rx_skb_ptr);
980
 
                } else {
981
 
                        /* A packet with First/Last flag */
982
 
                        rxlen = ( (rdes0 >> 16) & 0x3fff) - 4;
983
 
 
984
 
                        /* error summary bit check */
985
 
                        if (rdes0 & 0x8000) {
986
 
                                /* This is a error packet */
987
 
                                dev->stats.rx_errors++;
988
 
                                if (rdes0 & 1)
989
 
                                        dev->stats.rx_fifo_errors++;
990
 
                                if (rdes0 & 2)
991
 
                                        dev->stats.rx_crc_errors++;
992
 
                                if (rdes0 & 0x80)
993
 
                                        dev->stats.rx_length_errors++;
994
 
                        }
995
 
 
996
 
                        if ( !(rdes0 & 0x8000) ||
997
 
                                ((db->cr6_data & CR6_PM) && (rxlen>6)) ) {
998
 
                                skb = rxptr->rx_skb_ptr;
999
 
 
1000
 
                                /* Received Packet CRC check need or not */
1001
 
                                if ( (db->dm910x_chk_mode & 1) &&
1002
 
                                        (cal_CRC(skb->data, rxlen, 1) !=
1003
 
                                        (*(u32 *) (skb->data+rxlen) ))) { /* FIXME (?) */
1004
 
                                        /* Found a error received packet */
1005
 
                                        dmfe_reuse_skb(db, rxptr->rx_skb_ptr);
1006
 
                                        db->dm910x_chk_mode = 3;
1007
 
                                } else {
1008
 
                                        /* Good packet, send to upper layer */
1009
 
                                        /* Shorst packet used new SKB */
1010
 
                                        if ((rxlen < RX_COPY_SIZE) &&
1011
 
                                                ((newskb = dev_alloc_skb(rxlen + 2))
1012
 
                                                != NULL)) {
1013
 
 
1014
 
                                                skb = newskb;
1015
 
                                                /* size less than COPY_SIZE, allocate a rxlen SKB */
1016
 
                                                skb_reserve(skb, 2); /* 16byte align */
1017
 
                                                skb_copy_from_linear_data(rxptr->rx_skb_ptr,
1018
 
                                                          skb_put(skb, rxlen),
1019
 
                                                                          rxlen);
1020
 
                                                dmfe_reuse_skb(db, rxptr->rx_skb_ptr);
1021
 
                                        } else
1022
 
                                                skb_put(skb, rxlen);
1023
 
 
1024
 
                                        skb->protocol = eth_type_trans(skb, dev);
1025
 
                                        netif_rx(skb);
1026
 
                                        dev->stats.rx_packets++;
1027
 
                                        dev->stats.rx_bytes += rxlen;
1028
 
                                }
1029
 
                        } else {
1030
 
                                /* Reuse SKB buffer when the packet is error */
1031
 
                                DMFE_DBUG(0, "Reuse SK buffer, rdes0", rdes0);
1032
 
                                dmfe_reuse_skb(db, rxptr->rx_skb_ptr);
1033
 
                        }
1034
 
                }
1035
 
 
1036
 
                rxptr = rxptr->next_rx_desc;
1037
 
        }
1038
 
 
1039
 
        db->rx_ready_ptr = rxptr;
1040
 
}
1041
 
 
1042
 
/*
1043
 
 * Set DM910X multicast address
1044
 
 */
1045
 
 
1046
 
static void dmfe_set_filter_mode(struct DEVICE * dev)
1047
 
{
1048
 
        struct dmfe_board_info *db = netdev_priv(dev);
1049
 
        unsigned long flags;
1050
 
        int mc_count = netdev_mc_count(dev);
1051
 
 
1052
 
        DMFE_DBUG(0, "dmfe_set_filter_mode()", 0);
1053
 
        spin_lock_irqsave(&db->lock, flags);
1054
 
 
1055
 
        if (dev->flags & IFF_PROMISC) {
1056
 
                DMFE_DBUG(0, "Enable PROM Mode", 0);
1057
 
                db->cr6_data |= CR6_PM | CR6_PBF;
1058
 
                update_cr6(db->cr6_data, db->ioaddr);
1059
 
                spin_unlock_irqrestore(&db->lock, flags);
1060
 
                return;
1061
 
        }
1062
 
 
1063
 
        if (dev->flags & IFF_ALLMULTI || mc_count > DMFE_MAX_MULTICAST) {
1064
 
                DMFE_DBUG(0, "Pass all multicast address", mc_count);
1065
 
                db->cr6_data &= ~(CR6_PM | CR6_PBF);
1066
 
                db->cr6_data |= CR6_PAM;
1067
 
                spin_unlock_irqrestore(&db->lock, flags);
1068
 
                return;
1069
 
        }
1070
 
 
1071
 
        DMFE_DBUG(0, "Set multicast address", mc_count);
1072
 
        if (db->chip_id == PCI_DM9132_ID)
1073
 
                dm9132_id_table(dev);   /* DM9132 */
1074
 
        else
1075
 
                send_filter_frame(dev); /* DM9102/DM9102A */
1076
 
        spin_unlock_irqrestore(&db->lock, flags);
1077
 
}
1078
 
 
1079
 
/*
1080
 
 *      Ethtool interace
1081
 
 */
1082
 
 
1083
 
static void dmfe_ethtool_get_drvinfo(struct net_device *dev,
1084
 
                               struct ethtool_drvinfo *info)
1085
 
{
1086
 
        struct dmfe_board_info *np = netdev_priv(dev);
1087
 
 
1088
 
        strcpy(info->driver, DRV_NAME);
1089
 
        strcpy(info->version, DRV_VERSION);
1090
 
        if (np->pdev)
1091
 
                strcpy(info->bus_info, pci_name(np->pdev));
1092
 
        else
1093
 
                sprintf(info->bus_info, "EISA 0x%lx %d",
1094
 
                        dev->base_addr, dev->irq);
1095
 
}
1096
 
 
1097
 
static int dmfe_ethtool_set_wol(struct net_device *dev,
1098
 
                                struct ethtool_wolinfo *wolinfo)
1099
 
{
1100
 
        struct dmfe_board_info *db = netdev_priv(dev);
1101
 
 
1102
 
        if (wolinfo->wolopts & (WAKE_UCAST | WAKE_MCAST | WAKE_BCAST |
1103
 
                                WAKE_ARP | WAKE_MAGICSECURE))
1104
 
                   return -EOPNOTSUPP;
1105
 
 
1106
 
        db->wol_mode = wolinfo->wolopts;
1107
 
        return 0;
1108
 
}
1109
 
 
1110
 
static void dmfe_ethtool_get_wol(struct net_device *dev,
1111
 
                                 struct ethtool_wolinfo *wolinfo)
1112
 
{
1113
 
        struct dmfe_board_info *db = netdev_priv(dev);
1114
 
 
1115
 
        wolinfo->supported = WAKE_PHY | WAKE_MAGIC;
1116
 
        wolinfo->wolopts = db->wol_mode;
1117
 
}
1118
 
 
1119
 
 
1120
 
static const struct ethtool_ops netdev_ethtool_ops = {
1121
 
        .get_drvinfo            = dmfe_ethtool_get_drvinfo,
1122
 
        .get_link               = ethtool_op_get_link,
1123
 
        .set_wol                = dmfe_ethtool_set_wol,
1124
 
        .get_wol                = dmfe_ethtool_get_wol,
1125
 
};
1126
 
 
1127
 
/*
1128
 
 *      A periodic timer routine
1129
 
 *      Dynamic media sense, allocate Rx buffer...
1130
 
 */
1131
 
 
1132
 
static void dmfe_timer(unsigned long data)
1133
 
{
1134
 
        u32 tmp_cr8;
1135
 
        unsigned char tmp_cr12;
1136
 
        struct DEVICE *dev = (struct DEVICE *) data;
1137
 
        struct dmfe_board_info *db = netdev_priv(dev);
1138
 
        unsigned long flags;
1139
 
 
1140
 
        int link_ok, link_ok_phy;
1141
 
 
1142
 
        DMFE_DBUG(0, "dmfe_timer()", 0);
1143
 
        spin_lock_irqsave(&db->lock, flags);
1144
 
 
1145
 
        /* Media mode process when Link OK before enter this route */
1146
 
        if (db->first_in_callback == 0) {
1147
 
                db->first_in_callback = 1;
1148
 
                if (db->chip_type && (db->chip_id==PCI_DM9102_ID)) {
1149
 
                        db->cr6_data &= ~0x40000;
1150
 
                        update_cr6(db->cr6_data, db->ioaddr);
1151
 
                        phy_write(db->ioaddr,
1152
 
                                  db->phy_addr, 0, 0x1000, db->chip_id);
1153
 
                        db->cr6_data |= 0x40000;
1154
 
                        update_cr6(db->cr6_data, db->ioaddr);
1155
 
                        db->timer.expires = DMFE_TIMER_WUT + HZ * 2;
1156
 
                        add_timer(&db->timer);
1157
 
                        spin_unlock_irqrestore(&db->lock, flags);
1158
 
                        return;
1159
 
                }
1160
 
        }
1161
 
 
1162
 
 
1163
 
        /* Operating Mode Check */
1164
 
        if ( (db->dm910x_chk_mode & 0x1) &&
1165
 
                (dev->stats.rx_packets > MAX_CHECK_PACKET) )
1166
 
                db->dm910x_chk_mode = 0x4;
1167
 
 
1168
 
        /* Dynamic reset DM910X : system error or transmit time-out */
1169
 
        tmp_cr8 = inl(db->ioaddr + DCR8);
1170
 
        if ( (db->interval_rx_cnt==0) && (tmp_cr8) ) {
1171
 
                db->reset_cr8++;
1172
 
                db->wait_reset = 1;
1173
 
        }
1174
 
        db->interval_rx_cnt = 0;
1175
 
 
1176
 
        /* TX polling kick monitor */
1177
 
        if ( db->tx_packet_cnt &&
1178
 
             time_after(jiffies, dev_trans_start(dev) + DMFE_TX_KICK) ) {
1179
 
                outl(0x1, dev->base_addr + DCR1);   /* Tx polling again */
1180
 
 
1181
 
                /* TX Timeout */
1182
 
                if (time_after(jiffies, dev_trans_start(dev) + DMFE_TX_TIMEOUT) ) {
1183
 
                        db->reset_TXtimeout++;
1184
 
                        db->wait_reset = 1;
1185
 
                        dev_warn(&dev->dev, "Tx timeout - resetting\n");
1186
 
                }
1187
 
        }
1188
 
 
1189
 
        if (db->wait_reset) {
1190
 
                DMFE_DBUG(0, "Dynamic Reset device", db->tx_packet_cnt);
1191
 
                db->reset_count++;
1192
 
                dmfe_dynamic_reset(dev);
1193
 
                db->first_in_callback = 0;
1194
 
                db->timer.expires = DMFE_TIMER_WUT;
1195
 
                add_timer(&db->timer);
1196
 
                spin_unlock_irqrestore(&db->lock, flags);
1197
 
                return;
1198
 
        }
1199
 
 
1200
 
        /* Link status check, Dynamic media type change */
1201
 
        if (db->chip_id == PCI_DM9132_ID)
1202
 
                tmp_cr12 = inb(db->ioaddr + DCR9 + 3);  /* DM9132 */
1203
 
        else
1204
 
                tmp_cr12 = inb(db->ioaddr + DCR12);     /* DM9102/DM9102A */
1205
 
 
1206
 
        if ( ((db->chip_id == PCI_DM9102_ID) &&
1207
 
                (db->chip_revision == 0x30)) ||
1208
 
                ((db->chip_id == PCI_DM9132_ID) &&
1209
 
                (db->chip_revision == 0x10)) ) {
1210
 
                /* DM9102A Chip */
1211
 
                if (tmp_cr12 & 2)
1212
 
                        link_ok = 0;
1213
 
                else
1214
 
                        link_ok = 1;
1215
 
        }
1216
 
        else
1217
 
                /*0x43 is used instead of 0x3 because bit 6 should represent
1218
 
                        link status of external PHY */
1219
 
                link_ok = (tmp_cr12 & 0x43) ? 1 : 0;
1220
 
 
1221
 
 
1222
 
        /* If chip reports that link is failed it could be because external
1223
 
                PHY link status pin is not connected correctly to chip
1224
 
                To be sure ask PHY too.
1225
 
        */
1226
 
 
1227
 
        /* need a dummy read because of PHY's register latch*/
1228
 
        phy_read (db->ioaddr, db->phy_addr, 1, db->chip_id);
1229
 
        link_ok_phy = (phy_read (db->ioaddr,
1230
 
                       db->phy_addr, 1, db->chip_id) & 0x4) ? 1 : 0;
1231
 
 
1232
 
        if (link_ok_phy != link_ok) {
1233
 
                DMFE_DBUG (0, "PHY and chip report different link status", 0);
1234
 
                link_ok = link_ok | link_ok_phy;
1235
 
        }
1236
 
 
1237
 
        if ( !link_ok && netif_carrier_ok(dev)) {
1238
 
                /* Link Failed */
1239
 
                DMFE_DBUG(0, "Link Failed", tmp_cr12);
1240
 
                netif_carrier_off(dev);
1241
 
 
1242
 
                /* For Force 10/100M Half/Full mode: Enable Auto-Nego mode */
1243
 
                /* AUTO or force 1M Homerun/Longrun don't need */
1244
 
                if ( !(db->media_mode & 0x38) )
1245
 
                        phy_write(db->ioaddr, db->phy_addr,
1246
 
                                  0, 0x1000, db->chip_id);
1247
 
 
1248
 
                /* AUTO mode, if INT phyxcer link failed, select EXT device */
1249
 
                if (db->media_mode & DMFE_AUTO) {
1250
 
                        /* 10/100M link failed, used 1M Home-Net */
1251
 
                        db->cr6_data|=0x00040000;       /* bit18=1, MII */
1252
 
                        db->cr6_data&=~0x00000200;      /* bit9=0, HD mode */
1253
 
                        update_cr6(db->cr6_data, db->ioaddr);
1254
 
                }
1255
 
        } else if (!netif_carrier_ok(dev)) {
1256
 
 
1257
 
                DMFE_DBUG(0, "Link link OK", tmp_cr12);
1258
 
 
1259
 
                /* Auto Sense Speed */
1260
 
                if ( !(db->media_mode & DMFE_AUTO) || !dmfe_sense_speed(db)) {
1261
 
                        netif_carrier_on(dev);
1262
 
                        SHOW_MEDIA_TYPE(db->op_mode);
1263
 
                }
1264
 
 
1265
 
                dmfe_process_mode(db);
1266
 
        }
1267
 
 
1268
 
        /* HPNA remote command check */
1269
 
        if (db->HPNA_command & 0xf00) {
1270
 
                db->HPNA_timer--;
1271
 
                if (!db->HPNA_timer)
1272
 
                        dmfe_HPNA_remote_cmd_chk(db);
1273
 
        }
1274
 
 
1275
 
        /* Timer active again */
1276
 
        db->timer.expires = DMFE_TIMER_WUT;
1277
 
        add_timer(&db->timer);
1278
 
        spin_unlock_irqrestore(&db->lock, flags);
1279
 
}
1280
 
 
1281
 
 
1282
 
/*
1283
 
 *      Dynamic reset the DM910X board
1284
 
 *      Stop DM910X board
1285
 
 *      Free Tx/Rx allocated memory
1286
 
 *      Reset DM910X board
1287
 
 *      Re-initialize DM910X board
1288
 
 */
1289
 
 
1290
 
static void dmfe_dynamic_reset(struct DEVICE *dev)
1291
 
{
1292
 
        struct dmfe_board_info *db = netdev_priv(dev);
1293
 
 
1294
 
        DMFE_DBUG(0, "dmfe_dynamic_reset()", 0);
1295
 
 
1296
 
        /* Sopt MAC controller */
1297
 
        db->cr6_data &= ~(CR6_RXSC | CR6_TXSC); /* Disable Tx/Rx */
1298
 
        update_cr6(db->cr6_data, dev->base_addr);
1299
 
        outl(0, dev->base_addr + DCR7);         /* Disable Interrupt */
1300
 
        outl(inl(dev->base_addr + DCR5), dev->base_addr + DCR5);
1301
 
 
1302
 
        /* Disable upper layer interface */
1303
 
        netif_stop_queue(dev);
1304
 
 
1305
 
        /* Free Rx Allocate buffer */
1306
 
        dmfe_free_rxbuffer(db);
1307
 
 
1308
 
        /* system variable init */
1309
 
        db->tx_packet_cnt = 0;
1310
 
        db->tx_queue_cnt = 0;
1311
 
        db->rx_avail_cnt = 0;
1312
 
        netif_carrier_off(dev);
1313
 
        db->wait_reset = 0;
1314
 
 
1315
 
        /* Re-initialize DM910X board */
1316
 
        dmfe_init_dm910x(dev);
1317
 
 
1318
 
        /* Restart upper layer interface */
1319
 
        netif_wake_queue(dev);
1320
 
}
1321
 
 
1322
 
 
1323
 
/*
1324
 
 *      free all allocated rx buffer
1325
 
 */
1326
 
 
1327
 
static void dmfe_free_rxbuffer(struct dmfe_board_info * db)
1328
 
{
1329
 
        DMFE_DBUG(0, "dmfe_free_rxbuffer()", 0);
1330
 
 
1331
 
        /* free allocated rx buffer */
1332
 
        while (db->rx_avail_cnt) {
1333
 
                dev_kfree_skb(db->rx_ready_ptr->rx_skb_ptr);
1334
 
                db->rx_ready_ptr = db->rx_ready_ptr->next_rx_desc;
1335
 
                db->rx_avail_cnt--;
1336
 
        }
1337
 
}
1338
 
 
1339
 
 
1340
 
/*
1341
 
 *      Reuse the SK buffer
1342
 
 */
1343
 
 
1344
 
static void dmfe_reuse_skb(struct dmfe_board_info *db, struct sk_buff * skb)
1345
 
{
1346
 
        struct rx_desc *rxptr = db->rx_insert_ptr;
1347
 
 
1348
 
        if (!(rxptr->rdes0 & cpu_to_le32(0x80000000))) {
1349
 
                rxptr->rx_skb_ptr = skb;
1350
 
                rxptr->rdes2 = cpu_to_le32( pci_map_single(db->pdev,
1351
 
                            skb->data, RX_ALLOC_SIZE, PCI_DMA_FROMDEVICE) );
1352
 
                wmb();
1353
 
                rxptr->rdes0 = cpu_to_le32(0x80000000);
1354
 
                db->rx_avail_cnt++;
1355
 
                db->rx_insert_ptr = rxptr->next_rx_desc;
1356
 
        } else
1357
 
                DMFE_DBUG(0, "SK Buffer reuse method error", db->rx_avail_cnt);
1358
 
}
1359
 
 
1360
 
 
1361
 
/*
1362
 
 *      Initialize transmit/Receive descriptor
1363
 
 *      Using Chain structure, and allocate Tx/Rx buffer
1364
 
 */
1365
 
 
1366
 
static void dmfe_descriptor_init(struct dmfe_board_info *db, unsigned long ioaddr)
1367
 
{
1368
 
        struct tx_desc *tmp_tx;
1369
 
        struct rx_desc *tmp_rx;
1370
 
        unsigned char *tmp_buf;
1371
 
        dma_addr_t tmp_tx_dma, tmp_rx_dma;
1372
 
        dma_addr_t tmp_buf_dma;
1373
 
        int i;
1374
 
 
1375
 
        DMFE_DBUG(0, "dmfe_descriptor_init()", 0);
1376
 
 
1377
 
        /* tx descriptor start pointer */
1378
 
        db->tx_insert_ptr = db->first_tx_desc;
1379
 
        db->tx_remove_ptr = db->first_tx_desc;
1380
 
        outl(db->first_tx_desc_dma, ioaddr + DCR4);     /* TX DESC address */
1381
 
 
1382
 
        /* rx descriptor start pointer */
1383
 
        db->first_rx_desc = (void *)db->first_tx_desc +
1384
 
                        sizeof(struct tx_desc) * TX_DESC_CNT;
1385
 
 
1386
 
        db->first_rx_desc_dma =  db->first_tx_desc_dma +
1387
 
                        sizeof(struct tx_desc) * TX_DESC_CNT;
1388
 
        db->rx_insert_ptr = db->first_rx_desc;
1389
 
        db->rx_ready_ptr = db->first_rx_desc;
1390
 
        outl(db->first_rx_desc_dma, ioaddr + DCR3);     /* RX DESC address */
1391
 
 
1392
 
        /* Init Transmit chain */
1393
 
        tmp_buf = db->buf_pool_start;
1394
 
        tmp_buf_dma = db->buf_pool_dma_start;
1395
 
        tmp_tx_dma = db->first_tx_desc_dma;
1396
 
        for (tmp_tx = db->first_tx_desc, i = 0; i < TX_DESC_CNT; i++, tmp_tx++) {
1397
 
                tmp_tx->tx_buf_ptr = tmp_buf;
1398
 
                tmp_tx->tdes0 = cpu_to_le32(0);
1399
 
                tmp_tx->tdes1 = cpu_to_le32(0x81000000);        /* IC, chain */
1400
 
                tmp_tx->tdes2 = cpu_to_le32(tmp_buf_dma);
1401
 
                tmp_tx_dma += sizeof(struct tx_desc);
1402
 
                tmp_tx->tdes3 = cpu_to_le32(tmp_tx_dma);
1403
 
                tmp_tx->next_tx_desc = tmp_tx + 1;
1404
 
                tmp_buf = tmp_buf + TX_BUF_ALLOC;
1405
 
                tmp_buf_dma = tmp_buf_dma + TX_BUF_ALLOC;
1406
 
        }
1407
 
        (--tmp_tx)->tdes3 = cpu_to_le32(db->first_tx_desc_dma);
1408
 
        tmp_tx->next_tx_desc = db->first_tx_desc;
1409
 
 
1410
 
         /* Init Receive descriptor chain */
1411
 
        tmp_rx_dma=db->first_rx_desc_dma;
1412
 
        for (tmp_rx = db->first_rx_desc, i = 0; i < RX_DESC_CNT; i++, tmp_rx++) {
1413
 
                tmp_rx->rdes0 = cpu_to_le32(0);
1414
 
                tmp_rx->rdes1 = cpu_to_le32(0x01000600);
1415
 
                tmp_rx_dma += sizeof(struct rx_desc);
1416
 
                tmp_rx->rdes3 = cpu_to_le32(tmp_rx_dma);
1417
 
                tmp_rx->next_rx_desc = tmp_rx + 1;
1418
 
        }
1419
 
        (--tmp_rx)->rdes3 = cpu_to_le32(db->first_rx_desc_dma);
1420
 
        tmp_rx->next_rx_desc = db->first_rx_desc;
1421
 
 
1422
 
        /* pre-allocate Rx buffer */
1423
 
        allocate_rx_buffer(db);
1424
 
}
1425
 
 
1426
 
 
1427
 
/*
1428
 
 *      Update CR6 value
1429
 
 *      Firstly stop DM910X , then written value and start
1430
 
 */
1431
 
 
1432
 
static void update_cr6(u32 cr6_data, unsigned long ioaddr)
1433
 
{
1434
 
        u32 cr6_tmp;
1435
 
 
1436
 
        cr6_tmp = cr6_data & ~0x2002;           /* stop Tx/Rx */
1437
 
        outl(cr6_tmp, ioaddr + DCR6);
1438
 
        udelay(5);
1439
 
        outl(cr6_data, ioaddr + DCR6);
1440
 
        udelay(5);
1441
 
}
1442
 
 
1443
 
 
1444
 
/*
1445
 
 *      Send a setup frame for DM9132
1446
 
 *      This setup frame initialize DM910X address filter mode
1447
 
*/
1448
 
 
1449
 
static void dm9132_id_table(struct DEVICE *dev)
1450
 
{
1451
 
        struct netdev_hw_addr *ha;
1452
 
        u16 * addrptr;
1453
 
        unsigned long ioaddr = dev->base_addr+0xc0;             /* ID Table */
1454
 
        u32 hash_val;
1455
 
        u16 i, hash_table[4];
1456
 
 
1457
 
        DMFE_DBUG(0, "dm9132_id_table()", 0);
1458
 
 
1459
 
        /* Node address */
1460
 
        addrptr = (u16 *) dev->dev_addr;
1461
 
        outw(addrptr[0], ioaddr);
1462
 
        ioaddr += 4;
1463
 
        outw(addrptr[1], ioaddr);
1464
 
        ioaddr += 4;
1465
 
        outw(addrptr[2], ioaddr);
1466
 
        ioaddr += 4;
1467
 
 
1468
 
        /* Clear Hash Table */
1469
 
        memset(hash_table, 0, sizeof(hash_table));
1470
 
 
1471
 
        /* broadcast address */
1472
 
        hash_table[3] = 0x8000;
1473
 
 
1474
 
        /* the multicast address in Hash Table : 64 bits */
1475
 
        netdev_for_each_mc_addr(ha, dev) {
1476
 
                hash_val = cal_CRC((char *) ha->addr, 6, 0) & 0x3f;
1477
 
                hash_table[hash_val / 16] |= (u16) 1 << (hash_val % 16);
1478
 
        }
1479
 
 
1480
 
        /* Write the hash table to MAC MD table */
1481
 
        for (i = 0; i < 4; i++, ioaddr += 4)
1482
 
                outw(hash_table[i], ioaddr);
1483
 
}
1484
 
 
1485
 
 
1486
 
/*
1487
 
 *      Send a setup frame for DM9102/DM9102A
1488
 
 *      This setup frame initialize DM910X address filter mode
1489
 
 */
1490
 
 
1491
 
static void send_filter_frame(struct DEVICE *dev)
1492
 
{
1493
 
        struct dmfe_board_info *db = netdev_priv(dev);
1494
 
        struct netdev_hw_addr *ha;
1495
 
        struct tx_desc *txptr;
1496
 
        u16 * addrptr;
1497
 
        u32 * suptr;
1498
 
        int i;
1499
 
 
1500
 
        DMFE_DBUG(0, "send_filter_frame()", 0);
1501
 
 
1502
 
        txptr = db->tx_insert_ptr;
1503
 
        suptr = (u32 *) txptr->tx_buf_ptr;
1504
 
 
1505
 
        /* Node address */
1506
 
        addrptr = (u16 *) dev->dev_addr;
1507
 
        *suptr++ = addrptr[0];
1508
 
        *suptr++ = addrptr[1];
1509
 
        *suptr++ = addrptr[2];
1510
 
 
1511
 
        /* broadcast address */
1512
 
        *suptr++ = 0xffff;
1513
 
        *suptr++ = 0xffff;
1514
 
        *suptr++ = 0xffff;
1515
 
 
1516
 
        /* fit the multicast address */
1517
 
        netdev_for_each_mc_addr(ha, dev) {
1518
 
                addrptr = (u16 *) ha->addr;
1519
 
                *suptr++ = addrptr[0];
1520
 
                *suptr++ = addrptr[1];
1521
 
                *suptr++ = addrptr[2];
1522
 
        }
1523
 
 
1524
 
        for (i = netdev_mc_count(dev); i < 14; i++) {
1525
 
                *suptr++ = 0xffff;
1526
 
                *suptr++ = 0xffff;
1527
 
                *suptr++ = 0xffff;
1528
 
        }
1529
 
 
1530
 
        /* prepare the setup frame */
1531
 
        db->tx_insert_ptr = txptr->next_tx_desc;
1532
 
        txptr->tdes1 = cpu_to_le32(0x890000c0);
1533
 
 
1534
 
        /* Resource Check and Send the setup packet */
1535
 
        if (!db->tx_packet_cnt) {
1536
 
                /* Resource Empty */
1537
 
                db->tx_packet_cnt++;
1538
 
                txptr->tdes0 = cpu_to_le32(0x80000000);
1539
 
                update_cr6(db->cr6_data | 0x2000, dev->base_addr);
1540
 
                outl(0x1, dev->base_addr + DCR1);       /* Issue Tx polling */
1541
 
                update_cr6(db->cr6_data, dev->base_addr);
1542
 
                dev->trans_start = jiffies;
1543
 
        } else
1544
 
                db->tx_queue_cnt++;     /* Put in TX queue */
1545
 
}
1546
 
 
1547
 
 
1548
 
/*
1549
 
 *      Allocate rx buffer,
1550
 
 *      As possible as allocate maxiumn Rx buffer
1551
 
 */
1552
 
 
1553
 
static void allocate_rx_buffer(struct dmfe_board_info *db)
1554
 
{
1555
 
        struct rx_desc *rxptr;
1556
 
        struct sk_buff *skb;
1557
 
 
1558
 
        rxptr = db->rx_insert_ptr;
1559
 
 
1560
 
        while(db->rx_avail_cnt < RX_DESC_CNT) {
1561
 
                if ( ( skb = dev_alloc_skb(RX_ALLOC_SIZE) ) == NULL )
1562
 
                        break;
1563
 
                rxptr->rx_skb_ptr = skb; /* FIXME (?) */
1564
 
                rxptr->rdes2 = cpu_to_le32( pci_map_single(db->pdev, skb->data,
1565
 
                                    RX_ALLOC_SIZE, PCI_DMA_FROMDEVICE) );
1566
 
                wmb();
1567
 
                rxptr->rdes0 = cpu_to_le32(0x80000000);
1568
 
                rxptr = rxptr->next_rx_desc;
1569
 
                db->rx_avail_cnt++;
1570
 
        }
1571
 
 
1572
 
        db->rx_insert_ptr = rxptr;
1573
 
}
1574
 
 
1575
 
 
1576
 
/*
1577
 
 *      Read one word data from the serial ROM
1578
 
 */
1579
 
 
1580
 
static u16 read_srom_word(long ioaddr, int offset)
1581
 
{
1582
 
        int i;
1583
 
        u16 srom_data = 0;
1584
 
        long cr9_ioaddr = ioaddr + DCR9;
1585
 
 
1586
 
        outl(CR9_SROM_READ, cr9_ioaddr);
1587
 
        outl(CR9_SROM_READ | CR9_SRCS, cr9_ioaddr);
1588
 
 
1589
 
        /* Send the Read Command 110b */
1590
 
        SROM_CLK_WRITE(SROM_DATA_1, cr9_ioaddr);
1591
 
        SROM_CLK_WRITE(SROM_DATA_1, cr9_ioaddr);
1592
 
        SROM_CLK_WRITE(SROM_DATA_0, cr9_ioaddr);
1593
 
 
1594
 
        /* Send the offset */
1595
 
        for (i = 5; i >= 0; i--) {
1596
 
                srom_data = (offset & (1 << i)) ? SROM_DATA_1 : SROM_DATA_0;
1597
 
                SROM_CLK_WRITE(srom_data, cr9_ioaddr);
1598
 
        }
1599
 
 
1600
 
        outl(CR9_SROM_READ | CR9_SRCS, cr9_ioaddr);
1601
 
 
1602
 
        for (i = 16; i > 0; i--) {
1603
 
                outl(CR9_SROM_READ | CR9_SRCS | CR9_SRCLK, cr9_ioaddr);
1604
 
                udelay(5);
1605
 
                srom_data = (srom_data << 1) |
1606
 
                                ((inl(cr9_ioaddr) & CR9_CRDOUT) ? 1 : 0);
1607
 
                outl(CR9_SROM_READ | CR9_SRCS, cr9_ioaddr);
1608
 
                udelay(5);
1609
 
        }
1610
 
 
1611
 
        outl(CR9_SROM_READ, cr9_ioaddr);
1612
 
        return srom_data;
1613
 
}
1614
 
 
1615
 
 
1616
 
/*
1617
 
 *      Auto sense the media mode
1618
 
 */
1619
 
 
1620
 
static u8 dmfe_sense_speed(struct dmfe_board_info * db)
1621
 
{
1622
 
        u8 ErrFlag = 0;
1623
 
        u16 phy_mode;
1624
 
 
1625
 
        /* CR6 bit18=0, select 10/100M */
1626
 
        update_cr6( (db->cr6_data & ~0x40000), db->ioaddr);
1627
 
 
1628
 
        phy_mode = phy_read(db->ioaddr, db->phy_addr, 1, db->chip_id);
1629
 
        phy_mode = phy_read(db->ioaddr, db->phy_addr, 1, db->chip_id);
1630
 
 
1631
 
        if ( (phy_mode & 0x24) == 0x24 ) {
1632
 
                if (db->chip_id == PCI_DM9132_ID)       /* DM9132 */
1633
 
                        phy_mode = phy_read(db->ioaddr,
1634
 
                                    db->phy_addr, 7, db->chip_id) & 0xf000;
1635
 
                else                            /* DM9102/DM9102A */
1636
 
                        phy_mode = phy_read(db->ioaddr,
1637
 
                                    db->phy_addr, 17, db->chip_id) & 0xf000;
1638
 
                switch (phy_mode) {
1639
 
                case 0x1000: db->op_mode = DMFE_10MHF; break;
1640
 
                case 0x2000: db->op_mode = DMFE_10MFD; break;
1641
 
                case 0x4000: db->op_mode = DMFE_100MHF; break;
1642
 
                case 0x8000: db->op_mode = DMFE_100MFD; break;
1643
 
                default: db->op_mode = DMFE_10MHF;
1644
 
                        ErrFlag = 1;
1645
 
                        break;
1646
 
                }
1647
 
        } else {
1648
 
                db->op_mode = DMFE_10MHF;
1649
 
                DMFE_DBUG(0, "Link Failed :", phy_mode);
1650
 
                ErrFlag = 1;
1651
 
        }
1652
 
 
1653
 
        return ErrFlag;
1654
 
}
1655
 
 
1656
 
 
1657
 
/*
1658
 
 *      Set 10/100 phyxcer capability
1659
 
 *      AUTO mode : phyxcer register4 is NIC capability
1660
 
 *      Force mode: phyxcer register4 is the force media
1661
 
 */
1662
 
 
1663
 
static void dmfe_set_phyxcer(struct dmfe_board_info *db)
1664
 
{
1665
 
        u16 phy_reg;
1666
 
 
1667
 
        /* Select 10/100M phyxcer */
1668
 
        db->cr6_data &= ~0x40000;
1669
 
        update_cr6(db->cr6_data, db->ioaddr);
1670
 
 
1671
 
        /* DM9009 Chip: Phyxcer reg18 bit12=0 */
1672
 
        if (db->chip_id == PCI_DM9009_ID) {
1673
 
                phy_reg = phy_read(db->ioaddr,
1674
 
                                   db->phy_addr, 18, db->chip_id) & ~0x1000;
1675
 
 
1676
 
                phy_write(db->ioaddr,
1677
 
                          db->phy_addr, 18, phy_reg, db->chip_id);
1678
 
        }
1679
 
 
1680
 
        /* Phyxcer capability setting */
1681
 
        phy_reg = phy_read(db->ioaddr, db->phy_addr, 4, db->chip_id) & ~0x01e0;
1682
 
 
1683
 
        if (db->media_mode & DMFE_AUTO) {
1684
 
                /* AUTO Mode */
1685
 
                phy_reg |= db->PHY_reg4;
1686
 
        } else {
1687
 
                /* Force Mode */
1688
 
                switch(db->media_mode) {
1689
 
                case DMFE_10MHF: phy_reg |= 0x20; break;
1690
 
                case DMFE_10MFD: phy_reg |= 0x40; break;
1691
 
                case DMFE_100MHF: phy_reg |= 0x80; break;
1692
 
                case DMFE_100MFD: phy_reg |= 0x100; break;
1693
 
                }
1694
 
                if (db->chip_id == PCI_DM9009_ID) phy_reg &= 0x61;
1695
 
        }
1696
 
 
1697
 
        /* Write new capability to Phyxcer Reg4 */
1698
 
        if ( !(phy_reg & 0x01e0)) {
1699
 
                phy_reg|=db->PHY_reg4;
1700
 
                db->media_mode|=DMFE_AUTO;
1701
 
        }
1702
 
        phy_write(db->ioaddr, db->phy_addr, 4, phy_reg, db->chip_id);
1703
 
 
1704
 
        /* Restart Auto-Negotiation */
1705
 
        if ( db->chip_type && (db->chip_id == PCI_DM9102_ID) )
1706
 
                phy_write(db->ioaddr, db->phy_addr, 0, 0x1800, db->chip_id);
1707
 
        if ( !db->chip_type )
1708
 
                phy_write(db->ioaddr, db->phy_addr, 0, 0x1200, db->chip_id);
1709
 
}
1710
 
 
1711
 
 
1712
 
/*
1713
 
 *      Process op-mode
1714
 
 *      AUTO mode : PHY controller in Auto-negotiation Mode
1715
 
 *      Force mode: PHY controller in force mode with HUB
1716
 
 *                      N-way force capability with SWITCH
1717
 
 */
1718
 
 
1719
 
static void dmfe_process_mode(struct dmfe_board_info *db)
1720
 
{
1721
 
        u16 phy_reg;
1722
 
 
1723
 
        /* Full Duplex Mode Check */
1724
 
        if (db->op_mode & 0x4)
1725
 
                db->cr6_data |= CR6_FDM;        /* Set Full Duplex Bit */
1726
 
        else
1727
 
                db->cr6_data &= ~CR6_FDM;       /* Clear Full Duplex Bit */
1728
 
 
1729
 
        /* Transciver Selection */
1730
 
        if (db->op_mode & 0x10)         /* 1M HomePNA */
1731
 
                db->cr6_data |= 0x40000;/* External MII select */
1732
 
        else
1733
 
                db->cr6_data &= ~0x40000;/* Internal 10/100 transciver */
1734
 
 
1735
 
        update_cr6(db->cr6_data, db->ioaddr);
1736
 
 
1737
 
        /* 10/100M phyxcer force mode need */
1738
 
        if ( !(db->media_mode & 0x18)) {
1739
 
                /* Forece Mode */
1740
 
                phy_reg = phy_read(db->ioaddr, db->phy_addr, 6, db->chip_id);
1741
 
                if ( !(phy_reg & 0x1) ) {
1742
 
                        /* parter without N-Way capability */
1743
 
                        phy_reg = 0x0;
1744
 
                        switch(db->op_mode) {
1745
 
                        case DMFE_10MHF: phy_reg = 0x0; break;
1746
 
                        case DMFE_10MFD: phy_reg = 0x100; break;
1747
 
                        case DMFE_100MHF: phy_reg = 0x2000; break;
1748
 
                        case DMFE_100MFD: phy_reg = 0x2100; break;
1749
 
                        }
1750
 
                        phy_write(db->ioaddr,
1751
 
                                  db->phy_addr, 0, phy_reg, db->chip_id);
1752
 
                        if ( db->chip_type && (db->chip_id == PCI_DM9102_ID) )
1753
 
                                mdelay(20);
1754
 
                        phy_write(db->ioaddr,
1755
 
                                  db->phy_addr, 0, phy_reg, db->chip_id);
1756
 
                }
1757
 
        }
1758
 
}
1759
 
 
1760
 
 
1761
 
/*
1762
 
 *      Write a word to Phy register
1763
 
 */
1764
 
 
1765
 
static void phy_write(unsigned long iobase, u8 phy_addr, u8 offset,
1766
 
                      u16 phy_data, u32 chip_id)
1767
 
{
1768
 
        u16 i;
1769
 
        unsigned long ioaddr;
1770
 
 
1771
 
        if (chip_id == PCI_DM9132_ID) {
1772
 
                ioaddr = iobase + 0x80 + offset * 4;
1773
 
                outw(phy_data, ioaddr);
1774
 
        } else {
1775
 
                /* DM9102/DM9102A Chip */
1776
 
                ioaddr = iobase + DCR9;
1777
 
 
1778
 
                /* Send 33 synchronization clock to Phy controller */
1779
 
                for (i = 0; i < 35; i++)
1780
 
                        phy_write_1bit(ioaddr, PHY_DATA_1);
1781
 
 
1782
 
                /* Send start command(01) to Phy */
1783
 
                phy_write_1bit(ioaddr, PHY_DATA_0);
1784
 
                phy_write_1bit(ioaddr, PHY_DATA_1);
1785
 
 
1786
 
                /* Send write command(01) to Phy */
1787
 
                phy_write_1bit(ioaddr, PHY_DATA_0);
1788
 
                phy_write_1bit(ioaddr, PHY_DATA_1);
1789
 
 
1790
 
                /* Send Phy address */
1791
 
                for (i = 0x10; i > 0; i = i >> 1)
1792
 
                        phy_write_1bit(ioaddr,
1793
 
                                       phy_addr & i ? PHY_DATA_1 : PHY_DATA_0);
1794
 
 
1795
 
                /* Send register address */
1796
 
                for (i = 0x10; i > 0; i = i >> 1)
1797
 
                        phy_write_1bit(ioaddr,
1798
 
                                       offset & i ? PHY_DATA_1 : PHY_DATA_0);
1799
 
 
1800
 
                /* written trasnition */
1801
 
                phy_write_1bit(ioaddr, PHY_DATA_1);
1802
 
                phy_write_1bit(ioaddr, PHY_DATA_0);
1803
 
 
1804
 
                /* Write a word data to PHY controller */
1805
 
                for ( i = 0x8000; i > 0; i >>= 1)
1806
 
                        phy_write_1bit(ioaddr,
1807
 
                                       phy_data & i ? PHY_DATA_1 : PHY_DATA_0);
1808
 
        }
1809
 
}
1810
 
 
1811
 
 
1812
 
/*
1813
 
 *      Read a word data from phy register
1814
 
 */
1815
 
 
1816
 
static u16 phy_read(unsigned long iobase, u8 phy_addr, u8 offset, u32 chip_id)
1817
 
{
1818
 
        int i;
1819
 
        u16 phy_data;
1820
 
        unsigned long ioaddr;
1821
 
 
1822
 
        if (chip_id == PCI_DM9132_ID) {
1823
 
                /* DM9132 Chip */
1824
 
                ioaddr = iobase + 0x80 + offset * 4;
1825
 
                phy_data = inw(ioaddr);
1826
 
        } else {
1827
 
                /* DM9102/DM9102A Chip */
1828
 
                ioaddr = iobase + DCR9;
1829
 
 
1830
 
                /* Send 33 synchronization clock to Phy controller */
1831
 
                for (i = 0; i < 35; i++)
1832
 
                        phy_write_1bit(ioaddr, PHY_DATA_1);
1833
 
 
1834
 
                /* Send start command(01) to Phy */
1835
 
                phy_write_1bit(ioaddr, PHY_DATA_0);
1836
 
                phy_write_1bit(ioaddr, PHY_DATA_1);
1837
 
 
1838
 
                /* Send read command(10) to Phy */
1839
 
                phy_write_1bit(ioaddr, PHY_DATA_1);
1840
 
                phy_write_1bit(ioaddr, PHY_DATA_0);
1841
 
 
1842
 
                /* Send Phy address */
1843
 
                for (i = 0x10; i > 0; i = i >> 1)
1844
 
                        phy_write_1bit(ioaddr,
1845
 
                                       phy_addr & i ? PHY_DATA_1 : PHY_DATA_0);
1846
 
 
1847
 
                /* Send register address */
1848
 
                for (i = 0x10; i > 0; i = i >> 1)
1849
 
                        phy_write_1bit(ioaddr,
1850
 
                                       offset & i ? PHY_DATA_1 : PHY_DATA_0);
1851
 
 
1852
 
                /* Skip transition state */
1853
 
                phy_read_1bit(ioaddr);
1854
 
 
1855
 
                /* read 16bit data */
1856
 
                for (phy_data = 0, i = 0; i < 16; i++) {
1857
 
                        phy_data <<= 1;
1858
 
                        phy_data |= phy_read_1bit(ioaddr);
1859
 
                }
1860
 
        }
1861
 
 
1862
 
        return phy_data;
1863
 
}
1864
 
 
1865
 
 
1866
 
/*
1867
 
 *      Write one bit data to Phy Controller
1868
 
 */
1869
 
 
1870
 
static void phy_write_1bit(unsigned long ioaddr, u32 phy_data)
1871
 
{
1872
 
        outl(phy_data, ioaddr);                 /* MII Clock Low */
1873
 
        udelay(1);
1874
 
        outl(phy_data | MDCLKH, ioaddr);        /* MII Clock High */
1875
 
        udelay(1);
1876
 
        outl(phy_data, ioaddr);                 /* MII Clock Low */
1877
 
        udelay(1);
1878
 
}
1879
 
 
1880
 
 
1881
 
/*
1882
 
 *      Read one bit phy data from PHY controller
1883
 
 */
1884
 
 
1885
 
static u16 phy_read_1bit(unsigned long ioaddr)
1886
 
{
1887
 
        u16 phy_data;
1888
 
 
1889
 
        outl(0x50000, ioaddr);
1890
 
        udelay(1);
1891
 
        phy_data = ( inl(ioaddr) >> 19 ) & 0x1;
1892
 
        outl(0x40000, ioaddr);
1893
 
        udelay(1);
1894
 
 
1895
 
        return phy_data;
1896
 
}
1897
 
 
1898
 
 
1899
 
/*
1900
 
 *      Parser SROM and media mode
1901
 
 */
1902
 
 
1903
 
static void dmfe_parse_srom(struct dmfe_board_info * db)
1904
 
{
1905
 
        char * srom = db->srom;
1906
 
        int dmfe_mode, tmp_reg;
1907
 
 
1908
 
        DMFE_DBUG(0, "dmfe_parse_srom() ", 0);
1909
 
 
1910
 
        /* Init CR15 */
1911
 
        db->cr15_data = CR15_DEFAULT;
1912
 
 
1913
 
        /* Check SROM Version */
1914
 
        if ( ( (int) srom[18] & 0xff) == SROM_V41_CODE) {
1915
 
                /* SROM V4.01 */
1916
 
                /* Get NIC support media mode */
1917
 
                db->NIC_capability = le16_to_cpup((__le16 *) (srom + 34));
1918
 
                db->PHY_reg4 = 0;
1919
 
                for (tmp_reg = 1; tmp_reg < 0x10; tmp_reg <<= 1) {
1920
 
                        switch( db->NIC_capability & tmp_reg ) {
1921
 
                        case 0x1: db->PHY_reg4 |= 0x0020; break;
1922
 
                        case 0x2: db->PHY_reg4 |= 0x0040; break;
1923
 
                        case 0x4: db->PHY_reg4 |= 0x0080; break;
1924
 
                        case 0x8: db->PHY_reg4 |= 0x0100; break;
1925
 
                        }
1926
 
                }
1927
 
 
1928
 
                /* Media Mode Force or not check */
1929
 
                dmfe_mode = (le32_to_cpup((__le32 *) (srom + 34)) &
1930
 
                             le32_to_cpup((__le32 *) (srom + 36)));
1931
 
                switch(dmfe_mode) {
1932
 
                case 0x4: dmfe_media_mode = DMFE_100MHF; break; /* 100MHF */
1933
 
                case 0x2: dmfe_media_mode = DMFE_10MFD; break;  /* 10MFD */
1934
 
                case 0x8: dmfe_media_mode = DMFE_100MFD; break; /* 100MFD */
1935
 
                case 0x100:
1936
 
                case 0x200: dmfe_media_mode = DMFE_1M_HPNA; break;/* HomePNA */
1937
 
                }
1938
 
 
1939
 
                /* Special Function setting */
1940
 
                /* VLAN function */
1941
 
                if ( (SF_mode & 0x1) || (srom[43] & 0x80) )
1942
 
                        db->cr15_data |= 0x40;
1943
 
 
1944
 
                /* Flow Control */
1945
 
                if ( (SF_mode & 0x2) || (srom[40] & 0x1) )
1946
 
                        db->cr15_data |= 0x400;
1947
 
 
1948
 
                /* TX pause packet */
1949
 
                if ( (SF_mode & 0x4) || (srom[40] & 0xe) )
1950
 
                        db->cr15_data |= 0x9800;
1951
 
        }
1952
 
 
1953
 
        /* Parse HPNA parameter */
1954
 
        db->HPNA_command = 1;
1955
 
 
1956
 
        /* Accept remote command or not */
1957
 
        if (HPNA_rx_cmd == 0)
1958
 
                db->HPNA_command |= 0x8000;
1959
 
 
1960
 
         /* Issue remote command & operation mode */
1961
 
        if (HPNA_tx_cmd == 1)
1962
 
                switch(HPNA_mode) {     /* Issue Remote Command */
1963
 
                case 0: db->HPNA_command |= 0x0904; break;
1964
 
                case 1: db->HPNA_command |= 0x0a00; break;
1965
 
                case 2: db->HPNA_command |= 0x0506; break;
1966
 
                case 3: db->HPNA_command |= 0x0602; break;
1967
 
                }
1968
 
        else
1969
 
                switch(HPNA_mode) {     /* Don't Issue */
1970
 
                case 0: db->HPNA_command |= 0x0004; break;
1971
 
                case 1: db->HPNA_command |= 0x0000; break;
1972
 
                case 2: db->HPNA_command |= 0x0006; break;
1973
 
                case 3: db->HPNA_command |= 0x0002; break;
1974
 
                }
1975
 
 
1976
 
        /* Check DM9801 or DM9802 present or not */
1977
 
        db->HPNA_present = 0;
1978
 
        update_cr6(db->cr6_data|0x40000, db->ioaddr);
1979
 
        tmp_reg = phy_read(db->ioaddr, db->phy_addr, 3, db->chip_id);
1980
 
        if ( ( tmp_reg & 0xfff0 ) == 0xb900 ) {
1981
 
                /* DM9801 or DM9802 present */
1982
 
                db->HPNA_timer = 8;
1983
 
                if ( phy_read(db->ioaddr, db->phy_addr, 31, db->chip_id) == 0x4404) {
1984
 
                        /* DM9801 HomeRun */
1985
 
                        db->HPNA_present = 1;
1986
 
                        dmfe_program_DM9801(db, tmp_reg);
1987
 
                } else {
1988
 
                        /* DM9802 LongRun */
1989
 
                        db->HPNA_present = 2;
1990
 
                        dmfe_program_DM9802(db);
1991
 
                }
1992
 
        }
1993
 
 
1994
 
}
1995
 
 
1996
 
 
1997
 
/*
1998
 
 *      Init HomeRun DM9801
1999
 
 */
2000
 
 
2001
 
static void dmfe_program_DM9801(struct dmfe_board_info * db, int HPNA_rev)
2002
 
{
2003
 
        uint reg17, reg25;
2004
 
 
2005
 
        if ( !HPNA_NoiseFloor ) HPNA_NoiseFloor = DM9801_NOISE_FLOOR;
2006
 
        switch(HPNA_rev) {
2007
 
        case 0xb900: /* DM9801 E3 */
2008
 
                db->HPNA_command |= 0x1000;
2009
 
                reg25 = phy_read(db->ioaddr, db->phy_addr, 24, db->chip_id);
2010
 
                reg25 = ( (reg25 + HPNA_NoiseFloor) & 0xff) | 0xf000;
2011
 
                reg17 = phy_read(db->ioaddr, db->phy_addr, 17, db->chip_id);
2012
 
                break;
2013
 
        case 0xb901: /* DM9801 E4 */
2014
 
                reg25 = phy_read(db->ioaddr, db->phy_addr, 25, db->chip_id);
2015
 
                reg25 = (reg25 & 0xff00) + HPNA_NoiseFloor;
2016
 
                reg17 = phy_read(db->ioaddr, db->phy_addr, 17, db->chip_id);
2017
 
                reg17 = (reg17 & 0xfff0) + HPNA_NoiseFloor + 3;
2018
 
                break;
2019
 
        case 0xb902: /* DM9801 E5 */
2020
 
        case 0xb903: /* DM9801 E6 */
2021
 
        default:
2022
 
                db->HPNA_command |= 0x1000;
2023
 
                reg25 = phy_read(db->ioaddr, db->phy_addr, 25, db->chip_id);
2024
 
                reg25 = (reg25 & 0xff00) + HPNA_NoiseFloor - 5;
2025
 
                reg17 = phy_read(db->ioaddr, db->phy_addr, 17, db->chip_id);
2026
 
                reg17 = (reg17 & 0xfff0) + HPNA_NoiseFloor;
2027
 
                break;
2028
 
        }
2029
 
        phy_write(db->ioaddr, db->phy_addr, 16, db->HPNA_command, db->chip_id);
2030
 
        phy_write(db->ioaddr, db->phy_addr, 17, reg17, db->chip_id);
2031
 
        phy_write(db->ioaddr, db->phy_addr, 25, reg25, db->chip_id);
2032
 
}
2033
 
 
2034
 
 
2035
 
/*
2036
 
 *      Init HomeRun DM9802
2037
 
 */
2038
 
 
2039
 
static void dmfe_program_DM9802(struct dmfe_board_info * db)
2040
 
{
2041
 
        uint phy_reg;
2042
 
 
2043
 
        if ( !HPNA_NoiseFloor ) HPNA_NoiseFloor = DM9802_NOISE_FLOOR;
2044
 
        phy_write(db->ioaddr, db->phy_addr, 16, db->HPNA_command, db->chip_id);
2045
 
        phy_reg = phy_read(db->ioaddr, db->phy_addr, 25, db->chip_id);
2046
 
        phy_reg = ( phy_reg & 0xff00) + HPNA_NoiseFloor;
2047
 
        phy_write(db->ioaddr, db->phy_addr, 25, phy_reg, db->chip_id);
2048
 
}
2049
 
 
2050
 
 
2051
 
/*
2052
 
 *      Check remote HPNA power and speed status. If not correct,
2053
 
 *      issue command again.
2054
 
*/
2055
 
 
2056
 
static void dmfe_HPNA_remote_cmd_chk(struct dmfe_board_info * db)
2057
 
{
2058
 
        uint phy_reg;
2059
 
 
2060
 
        /* Got remote device status */
2061
 
        phy_reg = phy_read(db->ioaddr, db->phy_addr, 17, db->chip_id) & 0x60;
2062
 
        switch(phy_reg) {
2063
 
        case 0x00: phy_reg = 0x0a00;break; /* LP/LS */
2064
 
        case 0x20: phy_reg = 0x0900;break; /* LP/HS */
2065
 
        case 0x40: phy_reg = 0x0600;break; /* HP/LS */
2066
 
        case 0x60: phy_reg = 0x0500;break; /* HP/HS */
2067
 
        }
2068
 
 
2069
 
        /* Check remote device status match our setting ot not */
2070
 
        if ( phy_reg != (db->HPNA_command & 0x0f00) ) {
2071
 
                phy_write(db->ioaddr, db->phy_addr, 16, db->HPNA_command,
2072
 
                          db->chip_id);
2073
 
                db->HPNA_timer=8;
2074
 
        } else
2075
 
                db->HPNA_timer=600;     /* Match, every 10 minutes, check */
2076
 
}
2077
 
 
2078
 
 
2079
 
 
2080
 
static DEFINE_PCI_DEVICE_TABLE(dmfe_pci_tbl) = {
2081
 
        { 0x1282, 0x9132, PCI_ANY_ID, PCI_ANY_ID, 0, 0, PCI_DM9132_ID },
2082
 
        { 0x1282, 0x9102, PCI_ANY_ID, PCI_ANY_ID, 0, 0, PCI_DM9102_ID },
2083
 
        { 0x1282, 0x9100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, PCI_DM9100_ID },
2084
 
        { 0x1282, 0x9009, PCI_ANY_ID, PCI_ANY_ID, 0, 0, PCI_DM9009_ID },
2085
 
        { 0, }
2086
 
};
2087
 
MODULE_DEVICE_TABLE(pci, dmfe_pci_tbl);
2088
 
 
2089
 
 
2090
 
#ifdef CONFIG_PM
2091
 
static int dmfe_suspend(struct pci_dev *pci_dev, pm_message_t state)
2092
 
{
2093
 
        struct net_device *dev = pci_get_drvdata(pci_dev);
2094
 
        struct dmfe_board_info *db = netdev_priv(dev);
2095
 
        u32 tmp;
2096
 
 
2097
 
        /* Disable upper layer interface */
2098
 
        netif_device_detach(dev);
2099
 
 
2100
 
        /* Disable Tx/Rx */
2101
 
        db->cr6_data &= ~(CR6_RXSC | CR6_TXSC);
2102
 
        update_cr6(db->cr6_data, dev->base_addr);
2103
 
 
2104
 
        /* Disable Interrupt */
2105
 
        outl(0, dev->base_addr + DCR7);
2106
 
        outl(inl (dev->base_addr + DCR5), dev->base_addr + DCR5);
2107
 
 
2108
 
        /* Fre RX buffers */
2109
 
        dmfe_free_rxbuffer(db);
2110
 
 
2111
 
        /* Enable WOL */
2112
 
        pci_read_config_dword(pci_dev, 0x40, &tmp);
2113
 
        tmp &= ~(DMFE_WOL_LINKCHANGE|DMFE_WOL_MAGICPACKET);
2114
 
 
2115
 
        if (db->wol_mode & WAKE_PHY)
2116
 
                tmp |= DMFE_WOL_LINKCHANGE;
2117
 
        if (db->wol_mode & WAKE_MAGIC)
2118
 
                tmp |= DMFE_WOL_MAGICPACKET;
2119
 
 
2120
 
        pci_write_config_dword(pci_dev, 0x40, tmp);
2121
 
 
2122
 
        pci_enable_wake(pci_dev, PCI_D3hot, 1);
2123
 
        pci_enable_wake(pci_dev, PCI_D3cold, 1);
2124
 
 
2125
 
        /* Power down device*/
2126
 
        pci_save_state(pci_dev);
2127
 
        pci_set_power_state(pci_dev, pci_choose_state (pci_dev, state));
2128
 
 
2129
 
        return 0;
2130
 
}
2131
 
 
2132
 
static int dmfe_resume(struct pci_dev *pci_dev)
2133
 
{
2134
 
        struct net_device *dev = pci_get_drvdata(pci_dev);
2135
 
        u32 tmp;
2136
 
 
2137
 
        pci_set_power_state(pci_dev, PCI_D0);
2138
 
        pci_restore_state(pci_dev);
2139
 
 
2140
 
        /* Re-initialize DM910X board */
2141
 
        dmfe_init_dm910x(dev);
2142
 
 
2143
 
        /* Disable WOL */
2144
 
        pci_read_config_dword(pci_dev, 0x40, &tmp);
2145
 
 
2146
 
        tmp &= ~(DMFE_WOL_LINKCHANGE | DMFE_WOL_MAGICPACKET);
2147
 
        pci_write_config_dword(pci_dev, 0x40, tmp);
2148
 
 
2149
 
        pci_enable_wake(pci_dev, PCI_D3hot, 0);
2150
 
        pci_enable_wake(pci_dev, PCI_D3cold, 0);
2151
 
 
2152
 
        /* Restart upper layer interface */
2153
 
        netif_device_attach(dev);
2154
 
 
2155
 
        return 0;
2156
 
}
2157
 
#else
2158
 
#define dmfe_suspend NULL
2159
 
#define dmfe_resume NULL
2160
 
#endif
2161
 
 
2162
 
static struct pci_driver dmfe_driver = {
2163
 
        .name           = "dmfe",
2164
 
        .id_table       = dmfe_pci_tbl,
2165
 
        .probe          = dmfe_init_one,
2166
 
        .remove         = __devexit_p(dmfe_remove_one),
2167
 
        .suspend        = dmfe_suspend,
2168
 
        .resume         = dmfe_resume
2169
 
};
2170
 
 
2171
 
MODULE_AUTHOR("Sten Wang, sten_wang@davicom.com.tw");
2172
 
MODULE_DESCRIPTION("Davicom DM910X fast ethernet driver");
2173
 
MODULE_LICENSE("GPL");
2174
 
MODULE_VERSION(DRV_VERSION);
2175
 
 
2176
 
module_param(debug, int, 0);
2177
 
module_param(mode, byte, 0);
2178
 
module_param(cr6set, int, 0);
2179
 
module_param(chkmode, byte, 0);
2180
 
module_param(HPNA_mode, byte, 0);
2181
 
module_param(HPNA_rx_cmd, byte, 0);
2182
 
module_param(HPNA_tx_cmd, byte, 0);
2183
 
module_param(HPNA_NoiseFloor, byte, 0);
2184
 
module_param(SF_mode, byte, 0);
2185
 
MODULE_PARM_DESC(debug, "Davicom DM9xxx enable debugging (0-1)");
2186
 
MODULE_PARM_DESC(mode, "Davicom DM9xxx: "
2187
 
                "Bit 0: 10/100Mbps, bit 2: duplex, bit 8: HomePNA");
2188
 
 
2189
 
MODULE_PARM_DESC(SF_mode, "Davicom DM9xxx special function "
2190
 
                "(bit 0: VLAN, bit 1 Flow Control, bit 2: TX pause packet)");
2191
 
 
2192
 
/*      Description:
2193
 
 *      when user used insmod to add module, system invoked init_module()
2194
 
 *      to initialize and register.
2195
 
 */
2196
 
 
2197
 
static int __init dmfe_init_module(void)
2198
 
{
2199
 
        int rc;
2200
 
 
2201
 
        pr_info("%s\n", version);
2202
 
        printed_version = 1;
2203
 
 
2204
 
        DMFE_DBUG(0, "init_module() ", debug);
2205
 
 
2206
 
        if (debug)
2207
 
                dmfe_debug = debug;     /* set debug flag */
2208
 
        if (cr6set)
2209
 
                dmfe_cr6_user_set = cr6set;
2210
 
 
2211
 
        switch(mode) {
2212
 
        case DMFE_10MHF:
2213
 
        case DMFE_100MHF:
2214
 
        case DMFE_10MFD:
2215
 
        case DMFE_100MFD:
2216
 
        case DMFE_1M_HPNA:
2217
 
                dmfe_media_mode = mode;
2218
 
                break;
2219
 
        default:dmfe_media_mode = DMFE_AUTO;
2220
 
                break;
2221
 
        }
2222
 
 
2223
 
        if (HPNA_mode > 4)
2224
 
                HPNA_mode = 0;          /* Default: LP/HS */
2225
 
        if (HPNA_rx_cmd > 1)
2226
 
                HPNA_rx_cmd = 0;        /* Default: Ignored remote cmd */
2227
 
        if (HPNA_tx_cmd > 1)
2228
 
                HPNA_tx_cmd = 0;        /* Default: Don't issue remote cmd */
2229
 
        if (HPNA_NoiseFloor > 15)
2230
 
                HPNA_NoiseFloor = 0;
2231
 
 
2232
 
        rc = pci_register_driver(&dmfe_driver);
2233
 
        if (rc < 0)
2234
 
                return rc;
2235
 
 
2236
 
        return 0;
2237
 
}
2238
 
 
2239
 
 
2240
 
/*
2241
 
 *      Description:
2242
 
 *      when user used rmmod to delete module, system invoked clean_module()
2243
 
 *      to un-register all registered services.
2244
 
 */
2245
 
 
2246
 
static void __exit dmfe_cleanup_module(void)
2247
 
{
2248
 
        DMFE_DBUG(0, "dmfe_clean_module() ", debug);
2249
 
        pci_unregister_driver(&dmfe_driver);
2250
 
}
2251
 
 
2252
 
module_init(dmfe_init_module);
2253
 
module_exit(dmfe_cleanup_module);