uli526x.c 46.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
/*
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

12

13 14
*/

15 16
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
#define DRV_NAME	"uli526x"
#define DRV_VERSION	"0.9.3"
#define DRV_RELDATE	"2005-7-29"

#include <linux/module.h>

#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/ethtool.h>
#include <linux/skbuff.h>
#include <linux/delay.h>
#include <linux/spinlock.h>
37
#include <linux/dma-mapping.h>
J
Jiri Slaby 已提交
38
#include <linux/bitops.h>
39 40 41 42 43 44

#include <asm/processor.h>
#include <asm/io.h>
#include <asm/dma.h>
#include <asm/uaccess.h>

45 46
#define uw32(reg, val)	iowrite32(val, ioaddr + (reg))
#define ur32(reg)	ioread32(ioaddr + (reg))
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

/* Board/System/Debug information/definition ---------------- */
#define PCI_ULI5261_ID  0x526110B9	/* ULi M5261 ID*/
#define PCI_ULI5263_ID  0x526310B9	/* ULi M5263 ID*/

#define ULI526X_IO_SIZE 0x100
#define TX_DESC_CNT     0x20            /* Allocated Tx descriptors */
#define RX_DESC_CNT     0x30            /* Allocated Rx descriptors */
#define TX_FREE_DESC_CNT (TX_DESC_CNT - 2)	/* Max TX packet count */
#define TX_WAKE_DESC_CNT (TX_DESC_CNT - 3)	/* TX wakeup count */
#define DESC_ALL_CNT    (TX_DESC_CNT + RX_DESC_CNT)
#define TX_BUF_ALLOC    0x600
#define RX_ALLOC_SIZE   0x620
#define ULI526X_RESET    1
#define CR0_DEFAULT     0
62
#define CR6_DEFAULT     0x22200000
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
#define CR7_DEFAULT     0x180c1
#define CR15_DEFAULT    0x06            /* TxJabber RxWatchdog */
#define TDES0_ERR_MASK  0x4302          /* TXJT, LC, EC, FUE */
#define MAX_PACKET_SIZE 1514
#define ULI5261_MAX_MULTICAST 14
#define RX_COPY_SIZE	100
#define MAX_CHECK_PACKET 0x8000

#define ULI526X_10MHF      0
#define ULI526X_100MHF     1
#define ULI526X_10MFD      4
#define ULI526X_100MFD     5
#define ULI526X_AUTO       8

#define ULI526X_TXTH_72	0x400000	/* TX TH 72 byte */
#define ULI526X_TXTH_96	0x404000	/* TX TH 96 byte */
#define ULI526X_TXTH_128	0x0000		/* TX TH 128 byte */
#define ULI526X_TXTH_256	0x4000		/* TX TH 256 byte */
#define ULI526X_TXTH_512	0x8000		/* TX TH 512 byte */
#define ULI526X_TXTH_1K	0xC000		/* TX TH 1K  byte */

#define ULI526X_TIMER_WUT  (jiffies + HZ * 1)/* timer wakeup time : 1 second */
#define ULI526X_TX_TIMEOUT ((16*HZ)/2)	/* tx packet time-out time 8 s" */
#define ULI526X_TX_KICK 	(4*HZ/2)	/* tx packet Kick-out time 2 s" */

88 89 90 91 92
#define ULI526X_DBUG(dbug_now, msg, value)			\
do {								\
	if (uli526x_debug || (dbug_now))			\
		pr_err("%s %lx\n", (msg), (long) (value));	\
} while (0)
93

94 95 96 97
#define SHOW_MEDIA_TYPE(mode)					\
	pr_err("Change Speed to %sMhz %s duplex\n",		\
	       mode & 1 ? "100" : "10",				\
	       mode & 4 ? "full" : "half");
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116


/* CR9 definition: SROM/MII */
#define CR9_SROM_READ   0x4800
#define CR9_SRCS        0x1
#define CR9_SRCLK       0x2
#define CR9_CRDOUT      0x8
#define SROM_DATA_0     0x0
#define SROM_DATA_1     0x4
#define PHY_DATA_1      0x20000
#define PHY_DATA_0      0x00000
#define MDCLKH          0x10000

#define PHY_POWER_DOWN	0x800

#define SROM_V41_CODE   0x14

/* Structure/enum declaration ------------------------------- */
struct tx_desc {
A
Al Viro 已提交
117
        __le32 tdes0, tdes1, tdes2, tdes3; /* Data for the card */
118 119 120 121 122
        char *tx_buf_ptr;               /* Data for us */
        struct tx_desc *next_tx_desc;
} __attribute__(( aligned(32) ));

struct rx_desc {
A
Al Viro 已提交
123
	__le32 rdes0, rdes1, rdes2, rdes3; /* Data for the card */
124 125 126 127 128
	struct sk_buff *rx_skb_ptr;	/* Data for us */
	struct rx_desc *next_rx_desc;
} __attribute__(( aligned(32) ));

struct uli526x_board_info {
129 130 131 132
	struct uli_phy_ops {
		void (*write)(struct uli526x_board_info *, u8, u8, u16);
		u16 (*read)(struct uli526x_board_info *, u8, u8);
	} phy;
133
	struct net_device *next_dev;	/* next device */
134 135 136
	struct pci_dev *pdev;		/* PCI device */
	spinlock_t lock;

137
	void __iomem *ioaddr;		/* I/O base address */
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
	u32 cr0_data;
	u32 cr5_data;
	u32 cr6_data;
	u32 cr7_data;
	u32 cr15_data;

	/* pointer for memory physical address */
	dma_addr_t buf_pool_dma_ptr;	/* Tx buffer pool memory */
	dma_addr_t buf_pool_dma_start;	/* Tx buffer pool align dword */
	dma_addr_t desc_pool_dma_ptr;	/* descriptor pool memory */
	dma_addr_t first_tx_desc_dma;
	dma_addr_t first_rx_desc_dma;

	/* descriptor pointer */
	unsigned char *buf_pool_ptr;	/* Tx buffer pool memory */
	unsigned char *buf_pool_start;	/* Tx buffer pool align dword */
	unsigned char *desc_pool_ptr;	/* descriptor pool memory */
	struct tx_desc *first_tx_desc;
	struct tx_desc *tx_insert_ptr;
	struct tx_desc *tx_remove_ptr;
	struct rx_desc *first_rx_desc;
	struct rx_desc *rx_insert_ptr;
	struct rx_desc *rx_ready_ptr;	/* packet come pointer */
	unsigned long tx_packet_cnt;	/* transmitted packet count */
	unsigned long rx_avail_cnt;	/* available rx descriptor count */
	unsigned long interval_rx_cnt;	/* rx packet count a callback time */

	u16 dbug_cnt;
	u16 NIC_capability;		/* NIC media capability */
	u16 PHY_reg4;			/* Saved Phyxcer register 4 value */

	u8 media_mode;			/* user specify media mode */
	u8 op_mode;			/* real work media mode */
	u8 phy_addr;
	u8 link_failed;			/* Ever link failed */
	u8 wait_reset;			/* Hardware failed, need to reset */
	struct timer_list timer;

	/* Driver defined statistic counter */
	unsigned long tx_fifo_underrun;
	unsigned long tx_loss_carrier;
	unsigned long tx_no_carrier;
	unsigned long tx_late_collision;
	unsigned long tx_excessive_collision;
	unsigned long tx_jabber_timeout;
	unsigned long reset_count;
	unsigned long reset_cr8;
	unsigned long reset_fatal;
	unsigned long reset_TXtimeout;

	/* NIC SROM data */
	unsigned char srom[128];
190
	u8 init;
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
};

enum uli526x_offsets {
	DCR0 = 0x00, DCR1 = 0x08, DCR2 = 0x10, DCR3 = 0x18, DCR4 = 0x20,
	DCR5 = 0x28, DCR6 = 0x30, DCR7 = 0x38, DCR8 = 0x40, DCR9 = 0x48,
	DCR10 = 0x50, DCR11 = 0x58, DCR12 = 0x60, DCR13 = 0x68, DCR14 = 0x70,
	DCR15 = 0x78
};

enum uli526x_CR6_bits {
	CR6_RXSC = 0x2, CR6_PBF = 0x8, CR6_PM = 0x40, CR6_PAM = 0x80,
	CR6_FDM = 0x200, CR6_TXSC = 0x2000, CR6_STI = 0x100000,
	CR6_SFT = 0x200000, CR6_RXA = 0x40000000, CR6_NO_PURGE = 0x20000000
};

/* Global variable declaration ----------------------------- */
B
Bill Pemberton 已提交
207 208
static int printed_version;
static const char version[] =
209
	"ULi M5261/M5263 net driver, version " DRV_VERSION " (" DRV_RELDATE ")";
210 211 212 213 214 215 216 217

static int uli526x_debug;
static unsigned char uli526x_media_mode = ULI526X_AUTO;
static u32 uli526x_cr6_user_set;

/* For module input parameter */
static int debug;
static u32 cr6set;
A
Andrew Morton 已提交
218
static int mode = 8;
219 220

/* function declaration ------------------------------------- */
221
static int uli526x_open(struct net_device *);
222 223
static netdev_tx_t uli526x_start_xmit(struct sk_buff *,
					    struct net_device *);
224 225
static int uli526x_stop(struct net_device *);
static void uli526x_set_filter_mode(struct net_device *);
226
static const struct ethtool_ops netdev_ethtool_ops;
227
static u16 read_srom_word(struct uli526x_board_info *, int);
228
static irqreturn_t uli526x_interrupt(int, void *);
229 230 231
#ifdef CONFIG_NET_POLL_CONTROLLER
static void uli526x_poll(struct net_device *dev);
#endif
232
static void uli526x_descriptor_init(struct net_device *, void __iomem *);
233
static void allocate_rx_buffer(struct net_device *);
234
static void update_cr6(u32, void __iomem *);
235
static void send_filter_frame(struct net_device *, int);
236 237 238 239 240 241
static u16 phy_readby_cr9(struct uli526x_board_info *, u8, u8);
static u16 phy_readby_cr10(struct uli526x_board_info *, u8, u8);
static void phy_writeby_cr9(struct uli526x_board_info *, u8, u8, u16);
static void phy_writeby_cr10(struct uli526x_board_info *, u8, u8, u16);
static void phy_write_1bit(struct uli526x_board_info *db, u32);
static u16 phy_read_1bit(struct uli526x_board_info *db);
242 243 244
static u8 uli526x_sense_speed(struct uli526x_board_info *);
static void uli526x_process_mode(struct uli526x_board_info *);
static void uli526x_timer(unsigned long);
245 246
static void uli526x_rx_packet(struct net_device *, struct uli526x_board_info *);
static void uli526x_free_tx_pkt(struct net_device *, struct uli526x_board_info *);
247
static void uli526x_reuse_skb(struct uli526x_board_info *, struct sk_buff *);
248
static void uli526x_dynamic_reset(struct net_device *);
249
static void uli526x_free_rxbuffer(struct uli526x_board_info *);
250
static void uli526x_init(struct net_device *);
251 252
static void uli526x_set_phyxcer(struct uli526x_board_info *);

253 254 255 256 257 258 259 260 261 262 263 264
static void srom_clk_write(struct uli526x_board_info *db, u32 data)
{
	void __iomem *ioaddr = db->ioaddr;

	uw32(DCR9, data | CR9_SROM_READ | CR9_SRCS);
	udelay(5);
	uw32(DCR9, data | CR9_SROM_READ | CR9_SRCS | CR9_SRCLK);
	udelay(5);
	uw32(DCR9, data | CR9_SROM_READ | CR9_SRCS);
	udelay(5);
}

265
/* ULI526X network board routine ---------------------------- */
266

267 268 269 270
static const struct net_device_ops netdev_ops = {
	.ndo_open		= uli526x_open,
	.ndo_stop		= uli526x_stop,
	.ndo_start_xmit		= uli526x_start_xmit,
271
	.ndo_set_rx_mode	= uli526x_set_filter_mode,
272 273 274 275 276 277 278 279
	.ndo_change_mtu		= eth_change_mtu,
	.ndo_set_mac_address	= eth_mac_addr,
	.ndo_validate_addr	= eth_validate_addr,
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller 	= uli526x_poll,
#endif
};

280
/*
281
 *	Search ULI526X board, allocate space and register it
282 283
 */

B
Bill Pemberton 已提交
284 285
static int uli526x_init_one(struct pci_dev *pdev,
			    const struct pci_device_id *ent)
286 287 288
{
	struct uli526x_board_info *db;	/* board information structure */
	struct net_device *dev;
289
	void __iomem *ioaddr;
290
	int i, err;
291

292 293 294
	ULI526X_DBUG(0, "uli526x_init_one()", 0);

	if (!printed_version++)
295
		pr_info("%s\n", version);
296 297 298 299 300 301 302

	/* Init network device */
	dev = alloc_etherdev(sizeof(*db));
	if (dev == NULL)
		return -ENOMEM;
	SET_NETDEV_DEV(dev, &pdev->dev);

303
	if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
304
		pr_warn("32-bit PCI DMA not available\n");
305 306 307 308 309 310 311 312 313 314
		err = -ENODEV;
		goto err_out_free;
	}

	/* Enable Master/IO access, Disable memory access */
	err = pci_enable_device(pdev);
	if (err)
		goto err_out_free;

	if (!pci_resource_start(pdev, 0)) {
315
		pr_err("I/O base is zero\n");
316 317 318 319 320
		err = -ENODEV;
		goto err_out_disable;
	}

	if (pci_resource_len(pdev, 0) < (ULI526X_IO_SIZE) ) {
321
		pr_err("Allocated I/O size too small\n");
322 323 324 325
		err = -ENODEV;
		goto err_out_disable;
	}

326 327
	err = pci_request_regions(pdev, DRV_NAME);
	if (err < 0) {
328
		pr_err("Failed to request PCI regions\n");
329 330 331 332 333 334 335
		goto err_out_disable;
	}

	/* Init system & device */
	db = netdev_priv(dev);

	/* Allocate Tx/Rx descriptor memory */
336 337
	err = -ENOMEM;

338
	db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr);
339 340 341
	if (!db->desc_pool_ptr)
		goto err_out_release;

342
	db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4, &db->buf_pool_dma_ptr);
343 344
	if (!db->buf_pool_ptr)
		goto err_out_free_tx_desc;
345

346 347 348 349 350
	db->first_tx_desc = (struct tx_desc *) db->desc_pool_ptr;
	db->first_tx_desc_dma = db->desc_pool_dma_ptr;
	db->buf_pool_start = db->buf_pool_ptr;
	db->buf_pool_dma_start = db->buf_pool_dma_ptr;

351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
	switch (ent->driver_data) {
	case PCI_ULI5263_ID:
		db->phy.write	= phy_writeby_cr10;
		db->phy.read	= phy_readby_cr10;
		break;
	default:
		db->phy.write	= phy_writeby_cr9;
		db->phy.read	= phy_readby_cr9;
		break;
	}

	/* IO region. */
	ioaddr = pci_iomap(pdev, 0, 0);
	if (!ioaddr)
		goto err_out_free_tx_buf;
366

367
	db->ioaddr = ioaddr;
368 369
	db->pdev = pdev;
	db->init = 1;
370

371
	pci_set_drvdata(pdev, dev);
372

373
	/* Register some necessary functions */
374
	dev->netdev_ops = &netdev_ops;
375
	dev->ethtool_ops = &netdev_ethtool_ops;
376

377 378
	spin_lock_init(&db->lock);

379

380 381
	/* read 64 word srom data */
	for (i = 0; i < 64; i++)
382
		((__le16 *) db->srom)[i] = cpu_to_le16(read_srom_word(db, i));
383 384

	/* Set Node address */
385
	if(((u16 *) db->srom)[0] == 0xffff || ((u16 *) db->srom)[0] == 0)		/* SROM absent, so read MAC address from ID Table */
386
	{
387 388 389 390 391 392 393
		uw32(DCR0, 0x10000);	//Diagnosis mode
		uw32(DCR13, 0x1c0);	//Reset dianostic pointer port
		uw32(DCR14, 0);		//Clear reset port
		uw32(DCR14, 0x10);	//Reset ID Table pointer
		uw32(DCR14, 0);		//Clear reset port
		uw32(DCR13, 0);		//Clear CR13
		uw32(DCR13, 0x1b0);	//Select ID Table access port
394 395
		//Read MAC address from CR14
		for (i = 0; i < 6; i++)
396
			dev->dev_addr[i] = ur32(DCR14);
397
		//Read end
398 399
		uw32(DCR13, 0);		//Clear CR13
		uw32(DCR0, 0);		//Clear CR0
400 401 402 403 404 405 406 407 408
		udelay(10);
	}
	else		/*Exist SROM*/
	{
		for (i = 0; i < 6; i++)
			dev->dev_addr[i] = db->srom[20 + i];
	}
	err = register_netdev (dev);
	if (err)
409
		goto err_out_unmap;
410

411 412
	netdev_info(dev, "ULi M%04lx at pci%s, %pM, irq %d\n",
		    ent->driver_data >> 16, pci_name(pdev),
413
		    dev->dev_addr, pdev->irq);
414 415 416 417 418

	pci_set_master(pdev);

	return 0;

419 420
err_out_unmap:
	pci_iounmap(pdev, db->ioaddr);
421 422 423 424 425 426 427
err_out_free_tx_buf:
	pci_free_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4,
			    db->buf_pool_ptr, db->buf_pool_dma_ptr);
err_out_free_tx_desc:
	pci_free_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20,
			    db->desc_pool_ptr, db->desc_pool_dma_ptr);
err_out_release:
428 429 430 431 432 433 434 435 436 437
	pci_release_regions(pdev);
err_out_disable:
	pci_disable_device(pdev);
err_out_free:
	free_netdev(dev);

	return err;
}


B
Bill Pemberton 已提交
438
static void uli526x_remove_one(struct pci_dev *pdev)
439 440 441 442
{
	struct net_device *dev = pci_get_drvdata(pdev);
	struct uli526x_board_info *db = netdev_priv(dev);

443
	unregister_netdev(dev);
444
	pci_iounmap(pdev, db->ioaddr);
445 446 447 448 449 450 451
	pci_free_consistent(db->pdev, sizeof(struct tx_desc) *
				DESC_ALL_CNT + 0x20, db->desc_pool_ptr,
 				db->desc_pool_dma_ptr);
	pci_free_consistent(db->pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4,
				db->buf_pool_ptr, db->buf_pool_dma_ptr);
	pci_release_regions(pdev);
	pci_disable_device(pdev);
452
	free_netdev(dev);
453 454 455 456 457
}


/*
 *	Open the interface.
458
 *	The interface is opened whenever "ifconfig" activates it.
459 460
 */

461
static int uli526x_open(struct net_device *dev)
462 463 464
{
	int ret;
	struct uli526x_board_info *db = netdev_priv(dev);
465

466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
	ULI526X_DBUG(0, "uli526x_open", 0);

	/* system variable init */
	db->cr6_data = CR6_DEFAULT | uli526x_cr6_user_set;
	db->tx_packet_cnt = 0;
	db->rx_avail_cnt = 0;
	db->link_failed = 1;
	netif_carrier_off(dev);
	db->wait_reset = 0;

	db->NIC_capability = 0xf;	/* All capability*/
	db->PHY_reg4 = 0x1e0;

	/* CR6 operation mode decision */
	db->cr6_data |= ULI526X_TXTH_256;
	db->cr0_data = CR0_DEFAULT;
482

483
	/* Initialize ULI526X board */
484 485
	uli526x_init(dev);

486 487
	ret = request_irq(db->pdev->irq, uli526x_interrupt, IRQF_SHARED,
			  dev->name, dev);
488 489 490
	if (ret)
		return ret;

491 492 493 494 495 496 497
	/* Active System Interface */
	netif_wake_queue(dev);

	/* set and active a timer process */
	init_timer(&db->timer);
	db->timer.expires = ULI526X_TIMER_WUT + HZ * 2;
	db->timer.data = (unsigned long)dev;
498
	db->timer.function = uli526x_timer;
499 500 501 502 503 504
	add_timer(&db->timer);

	return 0;
}


505
/*	Initialize ULI526X board
506
 *	Reset ULI526X board
507
 *	Initialize TX/Rx descriptor chain structure
508 509 510 511
 *	Send the set-up frame
 *	Enable Tx/Rx machine
 */

512
static void uli526x_init(struct net_device *dev)
513 514
{
	struct uli526x_board_info *db = netdev_priv(dev);
515 516
	struct uli_phy_ops *phy = &db->phy;
	void __iomem *ioaddr = db->ioaddr;
517
	u8	phy_tmp;
518
	u8	timeout;
519 520
	u16 phy_reg_reset;

521

522 523 524
	ULI526X_DBUG(0, "uli526x_init()", 0);

	/* Reset M526x MAC controller */
525
	uw32(DCR0, ULI526X_RESET);	/* RESET MAC */
526
	udelay(100);
527
	uw32(DCR0, db->cr0_data);
528 529 530 531
	udelay(5);

	/* Phy addr : In some boards,M5261/M5263 phy address != 1 */
	db->phy_addr = 1;
532 533 534 535 536
	for (phy_tmp = 0; phy_tmp < 32; phy_tmp++) {
		u16 phy_value;

		phy_value = phy->read(db, phy_tmp, 3);	//peer add
		if (phy_value != 0xffff && phy_value != 0) {
537 538 539 540
			db->phy_addr = phy_tmp;
			break;
		}
	}
541 542

	if (phy_tmp == 32)
543
		pr_warn("Can not find the phy address!!!\n");
544 545 546
	/* Parser SROM and media mode */
	db->media_mode = uli526x_media_mode;

547
	/* phyxcer capability setting */
548
	phy_reg_reset = phy->read(db, db->phy_addr, 0);
549
	phy_reg_reset = (phy_reg_reset | 0x8000);
550
	phy->write(db, db->phy_addr, 0, phy_reg_reset);
551 552 553 554

	/* See IEEE 802.3-2002.pdf (Section 2, Chapter "22.2.4 Management
	 * functions") or phy data sheet for details on phy reset
	 */
555
	udelay(500);
556
	timeout = 10;
557 558
	while (timeout-- && phy->read(db, db->phy_addr, 0) & 0x8000)
		udelay(100);
559 560 561 562 563 564

	/* Process Phyxcer Media Mode */
	uli526x_set_phyxcer(db);

	/* Media Mode Process */
	if ( !(db->media_mode & ULI526X_AUTO) )
565
		db->op_mode = db->media_mode;		/* Force Mode */
566

567
	/* Initialize Transmit/Receive decriptor and CR3/4 */
568
	uli526x_descriptor_init(dev, ioaddr);
569 570 571 572 573

	/* Init CR6 to program M526X operation */
	update_cr6(db->cr6_data, ioaddr);

	/* Send setup frame */
574
	send_filter_frame(dev, netdev_mc_count(dev));	/* M5261/M5263 */
575 576 577

	/* Init CR7, interrupt active bit */
	db->cr7_data = CR7_DEFAULT;
578
	uw32(DCR7, db->cr7_data);
579 580

	/* Init CR15, Tx jabber and Rx watchdog timer */
581
	uw32(DCR15, db->cr15_data);
582 583 584 585 586 587 588 589 590 591 592 593

	/* Enable ULI526X Tx/Rx function */
	db->cr6_data |= CR6_RXSC | CR6_TXSC;
	update_cr6(db->cr6_data, ioaddr);
}


/*
 *	Hardware start transmission.
 *	Send a packet to media from the upper layer.
 */

594 595
static netdev_tx_t uli526x_start_xmit(struct sk_buff *skb,
					    struct net_device *dev)
596 597
{
	struct uli526x_board_info *db = netdev_priv(dev);
598
	void __iomem *ioaddr = db->ioaddr;
599 600 601 602 603 604 605 606 607 608
	struct tx_desc *txptr;
	unsigned long flags;

	ULI526X_DBUG(0, "uli526x_start_xmit", 0);

	/* Resource flag check */
	netif_stop_queue(dev);

	/* Too large packet check */
	if (skb->len > MAX_PACKET_SIZE) {
609
		netdev_err(dev, "big packet = %d\n", (u16)skb->len);
610
		dev_kfree_skb(skb);
611
		return NETDEV_TX_OK;
612 613 614 615 616 617 618
	}

	spin_lock_irqsave(&db->lock, flags);

	/* No Tx resource check, it never happen nromally */
	if (db->tx_packet_cnt >= TX_FREE_DESC_CNT) {
		spin_unlock_irqrestore(&db->lock, flags);
619
		netdev_err(dev, "No Tx resource %ld\n", db->tx_packet_cnt);
620
		return NETDEV_TX_BUSY;
621 622 623
	}

	/* Disable NIC interrupt */
624
	uw32(DCR7, 0);
625 626 627

	/* transmit this packet */
	txptr = db->tx_insert_ptr;
628
	skb_copy_from_linear_data(skb, txptr->tx_buf_ptr, skb->len);
629 630 631 632 633 634
	txptr->tdes1 = cpu_to_le32(0xe1000000 | skb->len);

	/* Point to next transmit free descriptor */
	db->tx_insert_ptr = txptr->next_tx_desc;

	/* Transmit Packet Process */
635
	if (db->tx_packet_cnt < TX_DESC_CNT) {
636 637
		txptr->tdes0 = cpu_to_le32(0x80000000);	/* Set owner bit */
		db->tx_packet_cnt++;			/* Ready to send */
638
		uw32(DCR1, 0x1);			/* Issue Tx polling */
639 640 641 642 643 644 645 646 647
		dev->trans_start = jiffies;		/* saved time stamp */
	}

	/* Tx resource check */
	if ( db->tx_packet_cnt < TX_FREE_DESC_CNT )
		netif_wake_queue(dev);

	/* Restore CR7 to enable interrupt */
	spin_unlock_irqrestore(&db->lock, flags);
648
	uw32(DCR7, db->cr7_data);
649

650 651 652
	/* free this SKB */
	dev_kfree_skb(skb);

653
	return NETDEV_TX_OK;
654 655 656 657 658 659 660 661
}


/*
 *	Stop the interface.
 *	The interface is stopped when it is brought.
 */

662
static int uli526x_stop(struct net_device *dev)
663 664
{
	struct uli526x_board_info *db = netdev_priv(dev);
665
	void __iomem *ioaddr = db->ioaddr;
666 667 668 669 670 671 672 673

	/* disable system */
	netif_stop_queue(dev);

	/* deleted timer */
	del_timer_sync(&db->timer);

	/* Reset & stop ULI526X board */
674
	uw32(DCR0, ULI526X_RESET);
675
	udelay(5);
676
	db->phy.write(db, db->phy_addr, 0, 0x8000);
677 678

	/* free interrupt */
679
	free_irq(db->pdev->irq, dev);
680 681 682 683 684 685 686 687 688 689 690 691 692

	/* free allocated rx buffer */
	uli526x_free_rxbuffer(db);

	return 0;
}


/*
 *	M5261/M5263 insterrupt handler
 *	receive the packet to upper layer, free the transmitted packet
 */

693
static irqreturn_t uli526x_interrupt(int irq, void *dev_id)
694
{
695
	struct net_device *dev = dev_id;
696
	struct uli526x_board_info *db = netdev_priv(dev);
697
	void __iomem *ioaddr = db->ioaddr;
698 699 700
	unsigned long flags;

	spin_lock_irqsave(&db->lock, flags);
701
	uw32(DCR7, 0);
702 703

	/* Got ULI526X status */
704 705
	db->cr5_data = ur32(DCR5);
	uw32(DCR5, db->cr5_data);
706
	if ( !(db->cr5_data & 0x180c1) ) {
707
		/* Restore CR7 to enable interrupt mask */
708
		uw32(DCR7, db->cr7_data);
709
		spin_unlock_irqrestore(&db->lock, flags);
710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728
		return IRQ_HANDLED;
	}

	/* Check system status */
	if (db->cr5_data & 0x2000) {
		/* system bus error happen */
		ULI526X_DBUG(1, "System bus error happen. CR5=", db->cr5_data);
		db->reset_fatal++;
		db->wait_reset = 1;	/* Need to RESET */
		spin_unlock_irqrestore(&db->lock, flags);
		return IRQ_HANDLED;
	}

	 /* Received the coming packet */
	if ( (db->cr5_data & 0x40) && db->rx_avail_cnt )
		uli526x_rx_packet(dev, db);

	/* reallocate rx descriptor buffer */
	if (db->rx_avail_cnt<RX_DESC_CNT)
729
		allocate_rx_buffer(dev);
730 731 732 733 734 735

	/* Free the transmitted descriptor */
	if ( db->cr5_data & 0x01)
		uli526x_free_tx_pkt(dev, db);

	/* Restore CR7 to enable interrupt mask */
736
	uw32(DCR7, db->cr7_data);
737 738 739 740 741

	spin_unlock_irqrestore(&db->lock, flags);
	return IRQ_HANDLED;
}

742 743 744
#ifdef CONFIG_NET_POLL_CONTROLLER
static void uli526x_poll(struct net_device *dev)
{
745 746
	struct uli526x_board_info *db = netdev_priv(dev);

747
	/* ISR grabs the irqsave lock, so this should be safe */
748
	uli526x_interrupt(db->pdev->irq, dev);
749 750
}
#endif
751 752 753 754 755

/*
 *	Free TX resource after TX complete
 */

756 757
static void uli526x_free_tx_pkt(struct net_device *dev,
				struct uli526x_board_info * db)
758 759 760 761 762 763 764 765 766 767 768 769
{
	struct tx_desc *txptr;
	u32 tdes0;

	txptr = db->tx_remove_ptr;
	while(db->tx_packet_cnt) {
		tdes0 = le32_to_cpu(txptr->tdes0);
		if (tdes0 & 0x80000000)
			break;

		/* A packet sent completed */
		db->tx_packet_cnt--;
770
		dev->stats.tx_packets++;
771 772 773

		/* Transmit statistic counter */
		if ( tdes0 != 0x7fffffff ) {
774 775
			dev->stats.collisions += (tdes0 >> 3) & 0xf;
			dev->stats.tx_bytes += le32_to_cpu(txptr->tdes1) & 0x7ff;
776
			if (tdes0 & TDES0_ERR_MASK) {
777
				dev->stats.tx_errors++;
778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813
				if (tdes0 & 0x0002) {	/* UnderRun */
					db->tx_fifo_underrun++;
					if ( !(db->cr6_data & CR6_SFT) ) {
						db->cr6_data = db->cr6_data | CR6_SFT;
						update_cr6(db->cr6_data, db->ioaddr);
					}
				}
				if (tdes0 & 0x0100)
					db->tx_excessive_collision++;
				if (tdes0 & 0x0200)
					db->tx_late_collision++;
				if (tdes0 & 0x0400)
					db->tx_no_carrier++;
				if (tdes0 & 0x0800)
					db->tx_loss_carrier++;
				if (tdes0 & 0x4000)
					db->tx_jabber_timeout++;
			}
		}

    		txptr = txptr->next_tx_desc;
	}/* End of while */

	/* Update TX remove pointer to next */
	db->tx_remove_ptr = txptr;

	/* Resource available check */
	if ( db->tx_packet_cnt < TX_WAKE_DESC_CNT )
		netif_wake_queue(dev);	/* Active upper layer, send again */
}


/*
 *	Receive the come packet and pass to upper layer
 */

814
static void uli526x_rx_packet(struct net_device *dev, struct uli526x_board_info * db)
815 816 817 818 819
{
	struct rx_desc *rxptr;
	struct sk_buff *skb;
	int rxlen;
	u32 rdes0;
820

821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845
	rxptr = db->rx_ready_ptr;

	while(db->rx_avail_cnt) {
		rdes0 = le32_to_cpu(rxptr->rdes0);
		if (rdes0 & 0x80000000)	/* packet owner check */
		{
			break;
		}

		db->rx_avail_cnt--;
		db->interval_rx_cnt++;

		pci_unmap_single(db->pdev, le32_to_cpu(rxptr->rdes2), RX_ALLOC_SIZE, PCI_DMA_FROMDEVICE);
		if ( (rdes0 & 0x300) != 0x300) {
			/* A packet without First/Last flag */
			/* reuse this SKB */
			ULI526X_DBUG(0, "Reuse SK buffer, rdes0", rdes0);
			uli526x_reuse_skb(db, rxptr->rx_skb_ptr);
		} else {
			/* A packet with First/Last flag */
			rxlen = ( (rdes0 >> 16) & 0x3fff) - 4;

			/* error summary bit check */
			if (rdes0 & 0x8000) {
				/* This is a error packet */
846
				dev->stats.rx_errors++;
847
				if (rdes0 & 1)
848
					dev->stats.rx_fifo_errors++;
849
				if (rdes0 & 2)
850
					dev->stats.rx_crc_errors++;
851
				if (rdes0 & 0x80)
852
					dev->stats.rx_length_errors++;
853 854 855 856
			}

			if ( !(rdes0 & 0x8000) ||
				((db->cr6_data & CR6_PM) && (rxlen>6)) ) {
857 858
				struct sk_buff *new_skb = NULL;

859
				skb = rxptr->rx_skb_ptr;
860

861 862
				/* Good packet, send to upper layer */
				/* Shorst packet used new SKB */
863
				if ((rxlen < RX_COPY_SIZE) &&
864
				    (((new_skb = netdev_alloc_skb(dev, rxlen + 2)) != NULL))) {
865
					skb = new_skb;
866 867
					/* size less than COPY_SIZE, allocate a rxlen SKB */
					skb_reserve(skb, 2); /* 16byte align */
868 869 870
					memcpy(skb_put(skb, rxlen),
					       skb_tail_pointer(rxptr->rx_skb_ptr),
					       rxlen);
871
					uli526x_reuse_skb(db, rxptr->rx_skb_ptr);
872
				} else
873
					skb_put(skb, rxlen);
874

875 876
				skb->protocol = eth_type_trans(skb, dev);
				netif_rx(skb);
877 878
				dev->stats.rx_packets++;
				dev->stats.rx_bytes += rxlen;
879

880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897
			} else {
				/* Reuse SKB buffer when the packet is error */
				ULI526X_DBUG(0, "Reuse SK buffer, rdes0", rdes0);
				uli526x_reuse_skb(db, rxptr->rx_skb_ptr);
			}
		}

		rxptr = rxptr->next_rx_desc;
	}

	db->rx_ready_ptr = rxptr;
}


/*
 * Set ULI526X multicast address
 */

898
static void uli526x_set_filter_mode(struct net_device * dev)
899
{
900
	struct uli526x_board_info *db = netdev_priv(dev);
901 902 903 904 905 906 907 908 909 910 911 912 913
	unsigned long flags;

	ULI526X_DBUG(0, "uli526x_set_filter_mode()", 0);
	spin_lock_irqsave(&db->lock, flags);

	if (dev->flags & IFF_PROMISC) {
		ULI526X_DBUG(0, "Enable PROM Mode", 0);
		db->cr6_data |= CR6_PM | CR6_PBF;
		update_cr6(db->cr6_data, db->ioaddr);
		spin_unlock_irqrestore(&db->lock, flags);
		return;
	}

914 915 916 917
	if (dev->flags & IFF_ALLMULTI ||
	    netdev_mc_count(dev) > ULI5261_MAX_MULTICAST) {
		ULI526X_DBUG(0, "Pass all multicast address",
			     netdev_mc_count(dev));
918 919 920 921 922 923
		db->cr6_data &= ~(CR6_PM | CR6_PBF);
		db->cr6_data |= CR6_PAM;
		spin_unlock_irqrestore(&db->lock, flags);
		return;
	}

924 925
	ULI526X_DBUG(0, "Set multicast address", netdev_mc_count(dev));
	send_filter_frame(dev, netdev_mc_count(dev)); 	/* M5261/M5263 */
926 927 928 929 930 931
	spin_unlock_irqrestore(&db->lock, flags);
}

static void
ULi_ethtool_gset(struct uli526x_board_info *db, struct ethtool_cmd *ecmd)
{
932 933 934 935 936 937
	ecmd->supported = (SUPPORTED_10baseT_Half |
	                   SUPPORTED_10baseT_Full |
	                   SUPPORTED_100baseT_Half |
	                   SUPPORTED_100baseT_Full |
	                   SUPPORTED_Autoneg |
	                   SUPPORTED_MII);
938

939 940 941 942 943 944
	ecmd->advertising = (ADVERTISED_10baseT_Half |
	                   ADVERTISED_10baseT_Full |
	                   ADVERTISED_100baseT_Half |
	                   ADVERTISED_100baseT_Full |
	                   ADVERTISED_Autoneg |
	                   ADVERTISED_MII);
945 946


947 948
	ecmd->port = PORT_MII;
	ecmd->phy_address = db->phy_addr;
949

950
	ecmd->transceiver = XCVR_EXTERNAL;
951

952
	ethtool_cmd_speed_set(ecmd, SPEED_10);
953
	ecmd->duplex = DUPLEX_HALF;
954

955 956
	if(db->op_mode==ULI526X_100MHF || db->op_mode==ULI526X_100MFD)
	{
957
		ethtool_cmd_speed_set(ecmd, SPEED_100);
958 959 960 961 962 963 964
	}
	if(db->op_mode==ULI526X_10MFD || db->op_mode==ULI526X_100MFD)
	{
		ecmd->duplex = DUPLEX_FULL;
	}
	if(db->link_failed)
	{
965
		ethtool_cmd_speed_set(ecmd, -1);
966
		ecmd->duplex = -1;
967
	}
968

969
	if (db->media_mode & ULI526X_AUTO)
970
	{
971 972 973 974 975 976 977 978 979
		ecmd->autoneg = AUTONEG_ENABLE;
	}
}

static void netdev_get_drvinfo(struct net_device *dev,
			       struct ethtool_drvinfo *info)
{
	struct uli526x_board_info *np = netdev_priv(dev);

980 981
	strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
	strlcpy(info->version, DRV_VERSION, sizeof(info->version));
982
	strlcpy(info->bus_info, pci_name(np->pdev), sizeof(info->bus_info));
983 984 985 986
}

static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) {
	struct uli526x_board_info *np = netdev_priv(dev);
987

988
	ULi_ethtool_gset(np, cmd);
989

990 991 992 993 994
	return 0;
}

static u32 netdev_get_link(struct net_device *dev) {
	struct uli526x_board_info *np = netdev_priv(dev);
995

996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007
	if(np->link_failed)
		return 0;
	else
		return 1;
}

static void uli526x_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
	wol->supported = WAKE_PHY | WAKE_MAGIC;
	wol->wolopts = 0;
}

1008
static const struct ethtool_ops netdev_ethtool_ops = {
1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
	.get_drvinfo		= netdev_get_drvinfo,
	.get_settings		= netdev_get_settings,
	.get_link		= netdev_get_link,
	.get_wol		= uli526x_get_wol,
};

/*
 *	A periodic timer routine
 *	Dynamic media sense, allocate Rx buffer...
 */

static void uli526x_timer(unsigned long data)
{
1022
	struct net_device *dev = (struct net_device *) data;
1023
	struct uli526x_board_info *db = netdev_priv(dev);
1024 1025
	struct uli_phy_ops *phy = &db->phy;
	void __iomem *ioaddr = db->ioaddr;
1026
 	unsigned long flags;
1027 1028
	u8 tmp_cr12 = 0;
	u32 tmp_cr8;
1029

1030 1031 1032
	//ULI526X_DBUG(0, "uli526x_timer()", 0);
	spin_lock_irqsave(&db->lock, flags);

1033

1034
	/* Dynamic reset ULI526X : system error or transmit time-out */
1035
	tmp_cr8 = ur32(DCR8);
1036 1037 1038 1039 1040 1041 1042 1043
	if ( (db->interval_rx_cnt==0) && (tmp_cr8) ) {
		db->reset_cr8++;
		db->wait_reset = 1;
	}
	db->interval_rx_cnt = 0;

	/* TX polling kick monitor */
	if ( db->tx_packet_cnt &&
E
Eric Dumazet 已提交
1044
	     time_after(jiffies, dev_trans_start(dev) + ULI526X_TX_KICK) ) {
1045
		uw32(DCR1, 0x1);   // Tx polling again
1046

1047
		// TX Timeout
E
Eric Dumazet 已提交
1048
		if ( time_after(jiffies, dev_trans_start(dev) + ULI526X_TX_TIMEOUT) ) {
1049 1050
			db->reset_TXtimeout++;
			db->wait_reset = 1;
1051
			netdev_err(dev, " Tx timeout - resetting\n");
1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
		}
	}

	if (db->wait_reset) {
		ULI526X_DBUG(0, "Dynamic Reset device", db->tx_packet_cnt);
		db->reset_count++;
		uli526x_dynamic_reset(dev);
		db->timer.expires = ULI526X_TIMER_WUT;
		add_timer(&db->timer);
		spin_unlock_irqrestore(&db->lock, flags);
		return;
	}

	/* Link status check, Dynamic media type change */
1066
	if ((phy->read(db, db->phy_addr, 5) & 0x01e0)!=0)
1067 1068 1069 1070 1071 1072
		tmp_cr12 = 3;

	if ( !(tmp_cr12 & 0x3) && !db->link_failed ) {
		/* Link Failed */
		ULI526X_DBUG(0, "Link Failed", tmp_cr12);
		netif_carrier_off(dev);
1073
		netdev_info(dev, "NIC Link is Down\n");
1074 1075 1076 1077 1078
		db->link_failed = 1;

		/* For Force 10/100M Half/Full mode: Enable Auto-Nego mode */
		/* AUTO don't need */
		if ( !(db->media_mode & 0x8) )
1079
			phy->write(db, db->phy_addr, 0, 0x1000);
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095

		/* AUTO mode, if INT phyxcer link failed, select EXT device */
		if (db->media_mode & ULI526X_AUTO) {
			db->cr6_data&=~0x00000200;	/* bit9=0, HD mode */
			update_cr6(db->cr6_data, db->ioaddr);
		}
	} else
		if ((tmp_cr12 & 0x3) && db->link_failed) {
			ULI526X_DBUG(0, "Link link OK", tmp_cr12);
			db->link_failed = 0;

			/* Auto Sense Speed */
			if ( (db->media_mode & ULI526X_AUTO) &&
				uli526x_sense_speed(db) )
				db->link_failed = 1;
			uli526x_process_mode(db);
1096

1097 1098
			if(db->link_failed==0)
			{
1099 1100 1101 1102 1103 1104 1105
				netdev_info(dev, "NIC Link is Up %d Mbps %s duplex\n",
					    (db->op_mode == ULI526X_100MHF ||
					     db->op_mode == ULI526X_100MFD)
					    ? 100 : 10,
					    (db->op_mode == ULI526X_10MFD ||
					     db->op_mode == ULI526X_100MFD)
					    ? "Full" : "Half");
1106 1107 1108 1109 1110 1111 1112 1113
				netif_carrier_on(dev);
			}
			/* SHOW_MEDIA_TYPE(db->op_mode); */
		}
		else if(!(tmp_cr12 & 0x3) && db->link_failed)
		{
			if(db->init==1)
			{
1114
				netdev_info(dev, "NIC Link is Down\n");
1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129
				netif_carrier_off(dev);
			}
		}
		db->init=0;

	/* Timer active again */
	db->timer.expires = ULI526X_TIMER_WUT;
	add_timer(&db->timer);
	spin_unlock_irqrestore(&db->lock, flags);
}


/*
 *	Stop ULI526X board
 *	Free Tx/Rx allocated memory
1130
 *	Init system variable
1131 1132
 */

1133
static void uli526x_reset_prepare(struct net_device *dev)
1134 1135
{
	struct uli526x_board_info *db = netdev_priv(dev);
1136
	void __iomem *ioaddr = db->ioaddr;
1137 1138 1139

	/* Sopt MAC controller */
	db->cr6_data &= ~(CR6_RXSC | CR6_TXSC);	/* Disable Tx/Rx */
1140 1141 1142
	update_cr6(db->cr6_data, ioaddr);
	uw32(DCR7, 0);				/* Disable Interrupt */
	uw32(DCR5, ur32(DCR5));
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155

	/* Disable upper layer interface */
	netif_stop_queue(dev);

	/* Free Rx Allocate buffer */
	uli526x_free_rxbuffer(db);

	/* system variable init */
	db->tx_packet_cnt = 0;
	db->rx_avail_cnt = 0;
	db->link_failed = 1;
	db->init=1;
	db->wait_reset = 0;
1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
}


/*
 *	Dynamic reset the ULI526X board
 *	Stop ULI526X board
 *	Free Tx/Rx allocated memory
 *	Reset ULI526X board
 *	Re-initialize ULI526X board
 */

static void uli526x_dynamic_reset(struct net_device *dev)
{
	ULI526X_DBUG(0, "uli526x_dynamic_reset()", 0);

	uli526x_reset_prepare(dev);
1172

1173
	/* Re-initialize ULI526X board */
1174 1175 1176 1177 1178 1179 1180
	uli526x_init(dev);

	/* Restart upper layer interface */
	netif_wake_queue(dev);
}


1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234
#ifdef CONFIG_PM

/*
 *	Suspend the interface.
 */

static int uli526x_suspend(struct pci_dev *pdev, pm_message_t state)
{
	struct net_device *dev = pci_get_drvdata(pdev);
	pci_power_t power_state;
	int err;

	ULI526X_DBUG(0, "uli526x_suspend", 0);

	pci_save_state(pdev);

	if (!netif_running(dev))
		return 0;

	netif_device_detach(dev);
	uli526x_reset_prepare(dev);

	power_state = pci_choose_state(pdev, state);
	pci_enable_wake(pdev, power_state, 0);
	err = pci_set_power_state(pdev, power_state);
	if (err) {
		netif_device_attach(dev);
		/* Re-initialize ULI526X board */
		uli526x_init(dev);
		/* Restart upper layer interface */
		netif_wake_queue(dev);
	}

	return err;
}

/*
 *	Resume the interface.
 */

static int uli526x_resume(struct pci_dev *pdev)
{
	struct net_device *dev = pci_get_drvdata(pdev);
	int err;

	ULI526X_DBUG(0, "uli526x_resume", 0);

	pci_restore_state(pdev);

	if (!netif_running(dev))
		return 0;

	err = pci_set_power_state(pdev, PCI_D0);
	if (err) {
1235
		netdev_warn(dev, "Could not put device into D0\n");
1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255
		return err;
	}

	netif_device_attach(dev);
	/* Re-initialize ULI526X board */
	uli526x_init(dev);
	/* Restart upper layer interface */
	netif_wake_queue(dev);

	return 0;
}

#else /* !CONFIG_PM */

#define uli526x_suspend	NULL
#define uli526x_resume	NULL

#endif /* !CONFIG_PM */


1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282
/*
 *	free all allocated rx buffer
 */

static void uli526x_free_rxbuffer(struct uli526x_board_info * db)
{
	ULI526X_DBUG(0, "uli526x_free_rxbuffer()", 0);

	/* free allocated rx buffer */
	while (db->rx_avail_cnt) {
		dev_kfree_skb(db->rx_ready_ptr->rx_skb_ptr);
		db->rx_ready_ptr = db->rx_ready_ptr->next_rx_desc;
		db->rx_avail_cnt--;
	}
}


/*
 *	Reuse the SK buffer
 */

static void uli526x_reuse_skb(struct uli526x_board_info *db, struct sk_buff * skb)
{
	struct rx_desc *rxptr = db->rx_insert_ptr;

	if (!(rxptr->rdes0 & cpu_to_le32(0x80000000))) {
		rxptr->rx_skb_ptr = skb;
1283 1284 1285 1286
		rxptr->rdes2 = cpu_to_le32(pci_map_single(db->pdev,
							  skb_tail_pointer(skb),
							  RX_ALLOC_SIZE,
							  PCI_DMA_FROMDEVICE));
1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300
		wmb();
		rxptr->rdes0 = cpu_to_le32(0x80000000);
		db->rx_avail_cnt++;
		db->rx_insert_ptr = rxptr->next_rx_desc;
	} else
		ULI526X_DBUG(0, "SK Buffer reuse method error", db->rx_avail_cnt);
}


/*
 *	Initialize transmit/Receive descriptor
 *	Using Chain structure, and allocate Tx/Rx buffer
 */

1301
static void uli526x_descriptor_init(struct net_device *dev, void __iomem *ioaddr)
1302
{
1303
	struct uli526x_board_info *db = netdev_priv(dev);
1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315
	struct tx_desc *tmp_tx;
	struct rx_desc *tmp_rx;
	unsigned char *tmp_buf;
	dma_addr_t tmp_tx_dma, tmp_rx_dma;
	dma_addr_t tmp_buf_dma;
	int i;

	ULI526X_DBUG(0, "uli526x_descriptor_init()", 0);

	/* tx descriptor start pointer */
	db->tx_insert_ptr = db->first_tx_desc;
	db->tx_remove_ptr = db->first_tx_desc;
1316
	uw32(DCR4, db->first_tx_desc_dma);	/* TX DESC address */
1317 1318 1319 1320 1321 1322

	/* rx descriptor start pointer */
	db->first_rx_desc = (void *)db->first_tx_desc + sizeof(struct tx_desc) * TX_DESC_CNT;
	db->first_rx_desc_dma =  db->first_tx_desc_dma + sizeof(struct tx_desc) * TX_DESC_CNT;
	db->rx_insert_ptr = db->first_rx_desc;
	db->rx_ready_ptr = db->first_rx_desc;
1323
	uw32(DCR3, db->first_rx_desc_dma);	/* RX DESC address */
1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355

	/* Init Transmit chain */
	tmp_buf = db->buf_pool_start;
	tmp_buf_dma = db->buf_pool_dma_start;
	tmp_tx_dma = db->first_tx_desc_dma;
	for (tmp_tx = db->first_tx_desc, i = 0; i < TX_DESC_CNT; i++, tmp_tx++) {
		tmp_tx->tx_buf_ptr = tmp_buf;
		tmp_tx->tdes0 = cpu_to_le32(0);
		tmp_tx->tdes1 = cpu_to_le32(0x81000000);	/* IC, chain */
		tmp_tx->tdes2 = cpu_to_le32(tmp_buf_dma);
		tmp_tx_dma += sizeof(struct tx_desc);
		tmp_tx->tdes3 = cpu_to_le32(tmp_tx_dma);
		tmp_tx->next_tx_desc = tmp_tx + 1;
		tmp_buf = tmp_buf + TX_BUF_ALLOC;
		tmp_buf_dma = tmp_buf_dma + TX_BUF_ALLOC;
	}
	(--tmp_tx)->tdes3 = cpu_to_le32(db->first_tx_desc_dma);
	tmp_tx->next_tx_desc = db->first_tx_desc;

	 /* Init Receive descriptor chain */
	tmp_rx_dma=db->first_rx_desc_dma;
	for (tmp_rx = db->first_rx_desc, i = 0; i < RX_DESC_CNT; i++, tmp_rx++) {
		tmp_rx->rdes0 = cpu_to_le32(0);
		tmp_rx->rdes1 = cpu_to_le32(0x01000600);
		tmp_rx_dma += sizeof(struct rx_desc);
		tmp_rx->rdes3 = cpu_to_le32(tmp_rx_dma);
		tmp_rx->next_rx_desc = tmp_rx + 1;
	}
	(--tmp_rx)->rdes3 = cpu_to_le32(db->first_rx_desc_dma);
	tmp_rx->next_rx_desc = db->first_rx_desc;

	/* pre-allocate Rx buffer */
1356
	allocate_rx_buffer(dev);
1357 1358 1359 1360 1361
}


/*
 *	Update CR6 value
1362
 *	Firstly stop ULI526X, then written value and start
1363
 */
1364
static void update_cr6(u32 cr6_data, void __iomem *ioaddr)
1365
{
1366
	uw32(DCR6, cr6_data);
1367 1368 1369 1370 1371 1372
	udelay(5);
}


/*
 *	Send a setup frame for M5261/M5263
1373
 *	This setup frame initialize ULI526X address filter mode
1374 1375
 */

1376 1377 1378 1379 1380 1381
#ifdef __BIG_ENDIAN
#define FLT_SHIFT 16
#else
#define FLT_SHIFT 0
#endif

1382
static void send_filter_frame(struct net_device *dev, int mc_cnt)
1383 1384
{
	struct uli526x_board_info *db = netdev_priv(dev);
1385
	void __iomem *ioaddr = db->ioaddr;
1386
	struct netdev_hw_addr *ha;
1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398
	struct tx_desc *txptr;
	u16 * addrptr;
	u32 * suptr;
	int i;

	ULI526X_DBUG(0, "send_filter_frame()", 0);

	txptr = db->tx_insert_ptr;
	suptr = (u32 *) txptr->tx_buf_ptr;

	/* Node address */
	addrptr = (u16 *) dev->dev_addr;
1399 1400 1401
	*suptr++ = addrptr[0] << FLT_SHIFT;
	*suptr++ = addrptr[1] << FLT_SHIFT;
	*suptr++ = addrptr[2] << FLT_SHIFT;
1402 1403

	/* broadcast address */
1404 1405 1406
	*suptr++ = 0xffff << FLT_SHIFT;
	*suptr++ = 0xffff << FLT_SHIFT;
	*suptr++ = 0xffff << FLT_SHIFT;
1407 1408

	/* fit the multicast address */
1409 1410
	netdev_for_each_mc_addr(ha, dev) {
		addrptr = (u16 *) ha->addr;
1411 1412 1413
		*suptr++ = addrptr[0] << FLT_SHIFT;
		*suptr++ = addrptr[1] << FLT_SHIFT;
		*suptr++ = addrptr[2] << FLT_SHIFT;
1414 1415
	}

1416
	for (i = netdev_mc_count(dev); i < 14; i++) {
1417 1418 1419
		*suptr++ = 0xffff << FLT_SHIFT;
		*suptr++ = 0xffff << FLT_SHIFT;
		*suptr++ = 0xffff << FLT_SHIFT;
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430
	}

	/* prepare the setup frame */
	db->tx_insert_ptr = txptr->next_tx_desc;
	txptr->tdes1 = cpu_to_le32(0x890000c0);

	/* Resource Check and Send the setup packet */
	if (db->tx_packet_cnt < TX_DESC_CNT) {
		/* Resource Empty */
		db->tx_packet_cnt++;
		txptr->tdes0 = cpu_to_le32(0x80000000);
1431 1432 1433
		update_cr6(db->cr6_data | 0x2000, ioaddr);
		uw32(DCR1, 0x1);	/* Issue Tx polling */
		update_cr6(db->cr6_data, ioaddr);
1434 1435
		dev->trans_start = jiffies;
	} else
1436
		netdev_err(dev, "No Tx resource - Send_filter_frame!\n");
1437 1438 1439 1440 1441 1442 1443 1444
}


/*
 *	Allocate rx buffer,
 *	As possible as allocate maxiumn Rx buffer
 */

1445
static void allocate_rx_buffer(struct net_device *dev)
1446
{
1447
	struct uli526x_board_info *db = netdev_priv(dev);
1448 1449 1450 1451 1452 1453
	struct rx_desc *rxptr;
	struct sk_buff *skb;

	rxptr = db->rx_insert_ptr;

	while(db->rx_avail_cnt < RX_DESC_CNT) {
1454 1455
		skb = netdev_alloc_skb(dev, RX_ALLOC_SIZE);
		if (skb == NULL)
1456 1457
			break;
		rxptr->rx_skb_ptr = skb; /* FIXME (?) */
1458 1459 1460 1461
		rxptr->rdes2 = cpu_to_le32(pci_map_single(db->pdev,
							  skb_tail_pointer(skb),
							  RX_ALLOC_SIZE,
							  PCI_DMA_FROMDEVICE));
1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475
		wmb();
		rxptr->rdes0 = cpu_to_le32(0x80000000);
		rxptr = rxptr->next_rx_desc;
		db->rx_avail_cnt++;
	}

	db->rx_insert_ptr = rxptr;
}


/*
 *	Read one word data from the serial ROM
 */

1476
static u16 read_srom_word(struct uli526x_board_info *db, int offset)
1477
{
1478
	void __iomem *ioaddr = db->ioaddr;
1479
	u16 srom_data = 0;
1480
	int i;
1481

1482 1483
	uw32(DCR9, CR9_SROM_READ);
	uw32(DCR9, CR9_SROM_READ | CR9_SRCS);
1484 1485

	/* Send the Read Command 110b */
1486 1487 1488
	srom_clk_write(db, SROM_DATA_1);
	srom_clk_write(db, SROM_DATA_1);
	srom_clk_write(db, SROM_DATA_0);
1489 1490 1491 1492

	/* Send the offset */
	for (i = 5; i >= 0; i--) {
		srom_data = (offset & (1 << i)) ? SROM_DATA_1 : SROM_DATA_0;
1493
		srom_clk_write(db, srom_data);
1494 1495
	}

1496
	uw32(DCR9, CR9_SROM_READ | CR9_SRCS);
1497 1498

	for (i = 16; i > 0; i--) {
1499
		uw32(DCR9, CR9_SROM_READ | CR9_SRCS | CR9_SRCLK);
1500
		udelay(5);
1501 1502 1503
		srom_data = (srom_data << 1) |
			    ((ur32(DCR9) & CR9_CRDOUT) ? 1 : 0);
		uw32(DCR9, CR9_SROM_READ | CR9_SRCS);
1504 1505 1506
		udelay(5);
	}

1507
	uw32(DCR9, CR9_SROM_READ);
1508 1509 1510 1511 1512 1513 1514 1515 1516 1517
	return srom_data;
}


/*
 *	Auto sense the media mode
 */

static u8 uli526x_sense_speed(struct uli526x_board_info * db)
{
1518
	struct uli_phy_ops *phy = &db->phy;
1519 1520 1521
	u8 ErrFlag = 0;
	u16 phy_mode;

1522 1523
	phy_mode = phy->read(db, db->phy_addr, 1);
	phy_mode = phy->read(db, db->phy_addr, 1);
1524 1525

	if ( (phy_mode & 0x24) == 0x24 ) {
1526

1527
		phy_mode = ((phy->read(db, db->phy_addr, 5) & 0x01e0)<<7);
1528 1529 1530 1531 1532 1533 1534 1535
		if(phy_mode&0x8000)
			phy_mode = 0x8000;
		else if(phy_mode&0x4000)
			phy_mode = 0x4000;
		else if(phy_mode&0x2000)
			phy_mode = 0x2000;
		else
			phy_mode = 0x1000;
1536

1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561
		switch (phy_mode) {
		case 0x1000: db->op_mode = ULI526X_10MHF; break;
		case 0x2000: db->op_mode = ULI526X_10MFD; break;
		case 0x4000: db->op_mode = ULI526X_100MHF; break;
		case 0x8000: db->op_mode = ULI526X_100MFD; break;
		default: db->op_mode = ULI526X_10MHF; ErrFlag = 1; break;
		}
	} else {
		db->op_mode = ULI526X_10MHF;
		ULI526X_DBUG(0, "Link Failed :", phy_mode);
		ErrFlag = 1;
	}

	return ErrFlag;
}


/*
 *	Set 10/100 phyxcer capability
 *	AUTO mode : phyxcer register4 is NIC capability
 *	Force mode: phyxcer register4 is the force media
 */

static void uli526x_set_phyxcer(struct uli526x_board_info *db)
{
1562
	struct uli_phy_ops *phy = &db->phy;
1563
	u16 phy_reg;
1564

1565
	/* Phyxcer capability setting */
1566
	phy_reg = phy->read(db, db->phy_addr, 4) & ~0x01e0;
1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578

	if (db->media_mode & ULI526X_AUTO) {
		/* AUTO Mode */
		phy_reg |= db->PHY_reg4;
	} else {
		/* Force Mode */
		switch(db->media_mode) {
		case ULI526X_10MHF: phy_reg |= 0x20; break;
		case ULI526X_10MFD: phy_reg |= 0x40; break;
		case ULI526X_100MHF: phy_reg |= 0x80; break;
		case ULI526X_100MFD: phy_reg |= 0x100; break;
		}
1579

1580 1581 1582 1583 1584 1585 1586
	}

  	/* Write new capability to Phyxcer Reg4 */
	if ( !(phy_reg & 0x01e0)) {
		phy_reg|=db->PHY_reg4;
		db->media_mode|=ULI526X_AUTO;
	}
1587
	phy->write(db, db->phy_addr, 4, phy_reg);
1588 1589

 	/* Restart Auto-Negotiation */
1590
	phy->write(db, db->phy_addr, 0, 0x1200);
1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603
	udelay(50);
}


/*
 *	Process op-mode
 	AUTO mode : PHY controller in Auto-negotiation Mode
 *	Force mode: PHY controller in force mode with HUB
 *			N-way force capability with SWITCH
 */

static void uli526x_process_mode(struct uli526x_board_info *db)
{
1604
	struct uli_phy_ops *phy = &db->phy;
1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615
	u16 phy_reg;

	/* Full Duplex Mode Check */
	if (db->op_mode & 0x4)
		db->cr6_data |= CR6_FDM;	/* Set Full Duplex Bit */
	else
		db->cr6_data &= ~CR6_FDM;	/* Clear Full Duplex Bit */

	update_cr6(db->cr6_data, db->ioaddr);

	/* 10/100M phyxcer force mode need */
1616
	if (!(db->media_mode & 0x8)) {
1617
		/* Forece Mode */
1618 1619
		phy_reg = phy->read(db, db->phy_addr, 6);
		if (!(phy_reg & 0x1)) {
1620 1621 1622 1623 1624 1625 1626 1627
			/* parter without N-Way capability */
			phy_reg = 0x0;
			switch(db->op_mode) {
			case ULI526X_10MHF: phy_reg = 0x0; break;
			case ULI526X_10MFD: phy_reg = 0x100; break;
			case ULI526X_100MHF: phy_reg = 0x2000; break;
			case ULI526X_100MFD: phy_reg = 0x2100; break;
			}
1628
			phy->write(db, db->phy_addr, 0, phy_reg);
1629 1630 1631 1632 1633
		}
	}
}


1634 1635 1636
/* M5261/M5263 Chip */
static void phy_writeby_cr9(struct uli526x_board_info *db, u8 phy_addr,
			    u8 offset, u16 phy_data)
1637 1638 1639 1640 1641
{
	u16 i;

	/* Send 33 synchronization clock to Phy controller */
	for (i = 0; i < 35; i++)
1642
		phy_write_1bit(db, PHY_DATA_1);
1643 1644

	/* Send start command(01) to Phy */
1645 1646
	phy_write_1bit(db, PHY_DATA_0);
	phy_write_1bit(db, PHY_DATA_1);
1647 1648

	/* Send write command(01) to Phy */
1649 1650
	phy_write_1bit(db, PHY_DATA_0);
	phy_write_1bit(db, PHY_DATA_1);
1651 1652 1653

	/* Send Phy address */
	for (i = 0x10; i > 0; i = i >> 1)
1654
		phy_write_1bit(db, phy_addr & i ? PHY_DATA_1 : PHY_DATA_0);
1655 1656 1657

	/* Send register address */
	for (i = 0x10; i > 0; i = i >> 1)
1658
		phy_write_1bit(db, offset & i ? PHY_DATA_1 : PHY_DATA_0);
1659 1660

	/* written trasnition */
1661 1662
	phy_write_1bit(db, PHY_DATA_1);
	phy_write_1bit(db, PHY_DATA_0);
1663 1664

	/* Write a word data to PHY controller */
1665 1666
	for (i = 0x8000; i > 0; i >>= 1)
		phy_write_1bit(db, phy_data & i ? PHY_DATA_1 : PHY_DATA_0);
1667 1668
}

1669
static u16 phy_readby_cr9(struct uli526x_board_info *db, u8 phy_addr, u8 offset)
1670 1671
{
	u16 phy_data;
1672
	int i;
1673

1674 1675
	/* Send 33 synchronization clock to Phy controller */
	for (i = 0; i < 35; i++)
1676
		phy_write_1bit(db, PHY_DATA_1);
1677 1678

	/* Send start command(01) to Phy */
1679 1680
	phy_write_1bit(db, PHY_DATA_0);
	phy_write_1bit(db, PHY_DATA_1);
1681 1682

	/* Send read command(10) to Phy */
1683 1684
	phy_write_1bit(db, PHY_DATA_1);
	phy_write_1bit(db, PHY_DATA_0);
1685 1686 1687

	/* Send Phy address */
	for (i = 0x10; i > 0; i = i >> 1)
1688
		phy_write_1bit(db, phy_addr & i ? PHY_DATA_1 : PHY_DATA_0);
1689 1690 1691

	/* Send register address */
	for (i = 0x10; i > 0; i = i >> 1)
1692
		phy_write_1bit(db, offset & i ? PHY_DATA_1 : PHY_DATA_0);
1693 1694

	/* Skip transition state */
1695
	phy_read_1bit(db);
1696 1697 1698 1699

	/* read 16bit data */
	for (phy_data = 0, i = 0; i < 16; i++) {
		phy_data <<= 1;
1700
		phy_data |= phy_read_1bit(db);
1701 1702 1703 1704 1705
	}

	return phy_data;
}

1706 1707
static u16 phy_readby_cr10(struct uli526x_board_info *db, u8 phy_addr,
			   u8 offset)
1708
{
1709 1710
	void __iomem *ioaddr = db->ioaddr;
	u32 cr10_value = phy_addr;
1711

1712 1713 1714
	cr10_value = (cr10_value <<  5) + offset;
	cr10_value = (cr10_value << 16) + 0x08000000;
	uw32(DCR10, cr10_value);
1715
	udelay(1);
1716 1717 1718
	while (1) {
		cr10_value = ur32(DCR10);
		if (cr10_value & 0x10000000)
1719 1720
			break;
	}
1721
	return cr10_value & 0x0ffff;
1722 1723
}

1724 1725
static void phy_writeby_cr10(struct uli526x_board_info *db, u8 phy_addr,
			     u8 offset, u16 phy_data)
1726
{
1727 1728
	void __iomem *ioaddr = db->ioaddr;
	u32 cr10_value = phy_addr;
1729

1730 1731 1732
	cr10_value = (cr10_value <<  5) + offset;
	cr10_value = (cr10_value << 16) + 0x04000000 + phy_data;
	uw32(DCR10, cr10_value);
1733 1734 1735 1736 1737 1738
	udelay(1);
}
/*
 *	Write one bit data to Phy Controller
 */

1739
static void phy_write_1bit(struct uli526x_board_info *db, u32 data)
1740
{
1741 1742 1743
	void __iomem *ioaddr = db->ioaddr;

	uw32(DCR9, data);		/* MII Clock Low */
1744
	udelay(1);
1745
	uw32(DCR9, data | MDCLKH);	/* MII Clock High */
1746
	udelay(1);
1747
	uw32(DCR9, data);		/* MII Clock Low */
1748 1749 1750 1751 1752 1753 1754 1755
	udelay(1);
}


/*
 *	Read one bit phy data from PHY controller
 */

1756
static u16 phy_read_1bit(struct uli526x_board_info *db)
1757
{
1758
	void __iomem *ioaddr = db->ioaddr;
1759
	u16 phy_data;
1760

1761
	uw32(DCR9, 0x50000);
1762
	udelay(1);
1763 1764
	phy_data = (ur32(DCR9) >> 19) & 0x1;
	uw32(DCR9, 0x40000);
1765 1766 1767 1768 1769 1770
	udelay(1);

	return phy_data;
}


1771
static DEFINE_PCI_DEVICE_TABLE(uli526x_pci_tbl) = {
1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782
	{ 0x10B9, 0x5261, PCI_ANY_ID, PCI_ANY_ID, 0, 0, PCI_ULI5261_ID },
	{ 0x10B9, 0x5263, PCI_ANY_ID, PCI_ANY_ID, 0, 0, PCI_ULI5263_ID },
	{ 0, }
};
MODULE_DEVICE_TABLE(pci, uli526x_pci_tbl);


static struct pci_driver uli526x_driver = {
	.name		= "uli526x",
	.id_table	= uli526x_pci_tbl,
	.probe		= uli526x_init_one,
B
Bill Pemberton 已提交
1783
	.remove		= uli526x_remove_one,
1784 1785
	.suspend	= uli526x_suspend,
	.resume		= uli526x_resume,
1786 1787 1788 1789 1790 1791
};

MODULE_AUTHOR("Peer Chen, peer.chen@uli.com.tw");
MODULE_DESCRIPTION("ULi M5261/M5263 fast ethernet driver");
MODULE_LICENSE("GPL");

1792 1793 1794
module_param(debug, int, 0644);
module_param(mode, int, 0);
module_param(cr6set, int, 0);
1795 1796 1797 1798 1799
MODULE_PARM_DESC(debug, "ULi M5261/M5263 enable debugging (0-1)");
MODULE_PARM_DESC(mode, "ULi M5261/M5263: Bit 0: 10/100Mbps, bit 2: duplex, bit 8: HomePNA");

/*	Description:
 *	when user used insmod to add module, system invoked init_module()
1800
 *	to register the services.
1801 1802 1803 1804 1805
 */

static int __init uli526x_init_module(void)
{

1806
	pr_info("%s\n", version);
1807 1808 1809 1810 1811 1812 1813 1814 1815
	printed_version = 1;

	ULI526X_DBUG(0, "init_module() ", debug);

	if (debug)
		uli526x_debug = debug;	/* set debug flag */
	if (cr6set)
		uli526x_cr6_user_set = cr6set;

1816
 	switch (mode) {
1817 1818 1819 1820 1821 1822
   	case ULI526X_10MHF:
	case ULI526X_100MHF:
	case ULI526X_10MFD:
	case ULI526X_100MFD:
		uli526x_media_mode = mode;
		break;
1823 1824
	default:
		uli526x_media_mode = ULI526X_AUTO;
1825 1826 1827
		break;
	}

1828
	return pci_register_driver(&uli526x_driver);
1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845
}


/*
 *	Description:
 *	when user used rmmod to delete module, system invoked clean_module()
 *	to un-register all registered services.
 */

static void __exit uli526x_cleanup_module(void)
{
	ULI526X_DBUG(0, "uli526x_clean_module() ", debug);
	pci_unregister_driver(&uli526x_driver);
}

module_init(uli526x_init_module);
module_exit(uli526x_cleanup_module);