Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 119771 | Differences between
and this patch

Collapse All | Expand All

(-)linux-2.6.15/drivers/net/sky2.c (+3283 lines)
Line 0 Link Here
1
/*
2
 * New driver for Marvell Yukon 2 chipset.
3
 * Based on earlier sk98lin, and skge driver.
4
 *
5
 * This driver intentionally does not support all the features
6
 * of the original driver such as link fail-over and link management because
7
 * those should be done at higher levels.
8
 *
9
 * Copyright (C) 2005 Stephen Hemminger <shemminger@osdl.org>
10
 *
11
 * This program is free software; you can redistribute it and/or modify
12
 * it under the terms of the GNU General Public License as published by
13
 * the Free Software Foundation; either version 2 of the License, or
14
 * (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
 * GNU General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program; if not, write to the Free Software
23
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24
 */
25
26
/*
27
 * TOTEST
28
 *	- speed setting
29
 *	- suspend/resume
30
 */
31
32
#include <linux/config.h>
33
#include <linux/crc32.h>
34
#include <linux/kernel.h>
35
#include <linux/version.h>
36
#include <linux/module.h>
37
#include <linux/netdevice.h>
38
#include <linux/dma-mapping.h>
39
#include <linux/etherdevice.h>
40
#include <linux/ethtool.h>
41
#include <linux/pci.h>
42
#include <linux/ip.h>
43
#include <linux/tcp.h>
44
#include <linux/in.h>
45
#include <linux/delay.h>
46
#include <linux/workqueue.h>
47
#include <linux/if_vlan.h>
48
#include <linux/prefetch.h>
49
#include <linux/mii.h>
50
51
#include <asm/irq.h>
52
53
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
54
#define SKY2_VLAN_TAG_USED 1
55
#endif
56
57
#include "sky2.h"
58
59
#define DRV_NAME		"sky2"
60
#define DRV_VERSION		"0.12"
61
#define PFX			DRV_NAME " "
62
63
/*
64
 * The Yukon II chipset takes 64 bit command blocks (called list elements)
65
 * that are organized into three (receive, transmit, status) different rings
66
 * similar to Tigon3. A transmit can require several elements;
67
 * a receive requires one (or two if using 64 bit dma).
68
 */
69
70
#define is_ec_a1(hw) \
71
	unlikely((hw)->chip_id == CHIP_ID_YUKON_EC && \
72
		 (hw)->chip_rev == CHIP_REV_YU_EC_A1)
73
74
#define RX_LE_SIZE	    	512
75
#define RX_LE_BYTES		(RX_LE_SIZE*sizeof(struct sky2_rx_le))
76
#define RX_MAX_PENDING		(RX_LE_SIZE/2 - 2)
77
#define RX_DEF_PENDING		RX_MAX_PENDING
78
#define RX_SKB_ALIGN		8
79
80
#define TX_RING_SIZE		512
81
#define TX_DEF_PENDING		(TX_RING_SIZE - 1)
82
#define TX_MIN_PENDING		64
83
#define MAX_SKB_TX_LE		(4 + 2*MAX_SKB_FRAGS)
84
85
#define STATUS_RING_SIZE	2048	/* 2 ports * (TX + 2*RX) */
86
#define STATUS_LE_BYTES		(STATUS_RING_SIZE*sizeof(struct sky2_status_le))
87
#define ETH_JUMBO_MTU		9000
88
#define TX_WATCHDOG		(5 * HZ)
89
#define NAPI_WEIGHT		64
90
#define PHY_RETRIES		1000
91
92
static const u32 default_msg =
93
    NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK
94
    | NETIF_MSG_TIMER | NETIF_MSG_TX_ERR | NETIF_MSG_RX_ERR
95
    | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN | NETIF_MSG_INTR;
96
97
static int debug = -1;		/* defaults above */
98
module_param(debug, int, 0);
99
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
100
101
static int copybreak __read_mostly = 256;
102
module_param(copybreak, int, 0);
103
MODULE_PARM_DESC(copybreak, "Receive copy threshold");
104
105
static const struct pci_device_id sky2_id_table[] = {
106
	{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) },
107
	{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) },
108
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b00) },
109
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b01) },
110
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4340) },
111
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4341) },
112
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4342) },
113
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4343) },
114
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4344) },
115
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4345) },
116
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4346) },
117
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4347) },
118
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4350) },
119
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4351) },
120
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4352) },
121
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4360) },
122
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4361) },
123
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4362) },
124
	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4363) },
125
	{ 0 }
126
};
127
128
MODULE_DEVICE_TABLE(pci, sky2_id_table);
129
130
/* Avoid conditionals by using array */
131
static const unsigned txqaddr[] = { Q_XA1, Q_XA2 };
132
static const unsigned rxqaddr[] = { Q_R1, Q_R2 };
133
134
/* This driver supports yukon2 chipset only */
135
static const char *yukon2_name[] = {
136
	"XL",		/* 0xb3 */
137
	"EC Ultra", 	/* 0xb4 */
138
	"UNKNOWN",	/* 0xb5 */
139
	"EC",		/* 0xb6 */
140
	"FE",		/* 0xb7 */
141
};
142
143
/* Access to external PHY */
144
static int gm_phy_write(struct sky2_hw *hw, unsigned port, u16 reg, u16 val)
145
{
146
	int i;
147
148
	gma_write16(hw, port, GM_SMI_DATA, val);
149
	gma_write16(hw, port, GM_SMI_CTRL,
150
		    GM_SMI_CT_PHY_AD(PHY_ADDR_MARV) | GM_SMI_CT_REG_AD(reg));
151
152
	for (i = 0; i < PHY_RETRIES; i++) {
153
		if (!(gma_read16(hw, port, GM_SMI_CTRL) & GM_SMI_CT_BUSY))
154
			return 0;
155
		udelay(1);
156
	}
157
158
	printk(KERN_WARNING PFX "%s: phy write timeout\n", hw->dev[port]->name);
159
	return -ETIMEDOUT;
160
}
161
162
static int __gm_phy_read(struct sky2_hw *hw, unsigned port, u16 reg, u16 *val)
163
{
164
	int i;
165
166
	gma_write16(hw, port, GM_SMI_CTRL, GM_SMI_CT_PHY_AD(PHY_ADDR_MARV)
167
		    | GM_SMI_CT_REG_AD(reg) | GM_SMI_CT_OP_RD);
168
169
	for (i = 0; i < PHY_RETRIES; i++) {
170
		if (gma_read16(hw, port, GM_SMI_CTRL) & GM_SMI_CT_RD_VAL) {
171
			*val = gma_read16(hw, port, GM_SMI_DATA);
172
			return 0;
173
		}
174
175
		udelay(1);
176
	}
177
178
	return -ETIMEDOUT;
179
}
180
181
static u16 gm_phy_read(struct sky2_hw *hw, unsigned port, u16 reg)
182
{
183
	u16 v;
184
185
	if (__gm_phy_read(hw, port, reg, &v) != 0)
186
		printk(KERN_WARNING PFX "%s: phy read timeout\n", hw->dev[port]->name);
187
	return v;
188
}
189
190
static int sky2_set_power_state(struct sky2_hw *hw, pci_power_t state)
191
{
192
	u16 power_control;
193
	u32 reg1;
194
	int vaux;
195
	int ret = 0;
196
197
	pr_debug("sky2_set_power_state %d\n", state);
198
	sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
199
200
	pci_read_config_word(hw->pdev, hw->pm_cap + PCI_PM_PMC, &power_control);
201
	vaux = (sky2_read8(hw, B0_CTST) & Y2_VAUX_AVAIL) &&
202
		(power_control & PCI_PM_CAP_PME_D3cold);
203
204
	pci_read_config_word(hw->pdev, hw->pm_cap + PCI_PM_CTRL, &power_control);
205
206
	power_control |= PCI_PM_CTRL_PME_STATUS;
207
	power_control &= ~(PCI_PM_CTRL_STATE_MASK);
208
209
	switch (state) {
210
	case PCI_D0:
211
		/* switch power to VCC (WA for VAUX problem) */
212
		sky2_write8(hw, B0_POWER_CTRL,
213
			    PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_OFF | PC_VCC_ON);
214
215
		/* disable Core Clock Division, */
216
		sky2_write32(hw, B2_Y2_CLK_CTRL, Y2_CLK_DIV_DIS);
217
218
		if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1)
219
			/* enable bits are inverted */
220
			sky2_write8(hw, B2_Y2_CLK_GATE,
221
				    Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS |
222
				    Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS |
223
				    Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS);
224
		else
225
			sky2_write8(hw, B2_Y2_CLK_GATE, 0);
226
227
		/* Turn off phy power saving */
228
		pci_read_config_dword(hw->pdev, PCI_DEV_REG1, &reg1);
229
		reg1 &= ~(PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD);
230
231
		/* looks like this XL is back asswards .. */
232
		if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1) {
233
			reg1 |= PCI_Y2_PHY1_COMA;
234
			if (hw->ports > 1)
235
				reg1 |= PCI_Y2_PHY2_COMA;
236
		}
237
		pci_write_config_dword(hw->pdev, PCI_DEV_REG1, reg1);
238
		break;
239
240
	case PCI_D3hot:
241
	case PCI_D3cold:
242
		/* Turn on phy power saving */
243
		pci_read_config_dword(hw->pdev, PCI_DEV_REG1, &reg1);
244
		if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1)
245
			reg1 &= ~(PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD);
246
		else
247
			reg1 |= (PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD);
248
		pci_write_config_dword(hw->pdev, PCI_DEV_REG1, reg1);
249
250
		if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1)
251
			sky2_write8(hw, B2_Y2_CLK_GATE, 0);
252
		else
253
			/* enable bits are inverted */
254
			sky2_write8(hw, B2_Y2_CLK_GATE,
255
				    Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS |
256
				    Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS |
257
				    Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS);
258
259
		/* switch power to VAUX */
260
		if (vaux && state != PCI_D3cold)
261
			sky2_write8(hw, B0_POWER_CTRL,
262
				    (PC_VAUX_ENA | PC_VCC_ENA |
263
				     PC_VAUX_ON | PC_VCC_OFF));
264
		break;
265
	default:
266
		printk(KERN_ERR PFX "Unknown power state %d\n", state);
267
		ret = -1;
268
	}
269
270
	pci_write_config_byte(hw->pdev, hw->pm_cap + PCI_PM_CTRL, power_control);
271
	sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
272
	return ret;
273
}
274
275
static void sky2_phy_reset(struct sky2_hw *hw, unsigned port)
276
{
277
	u16 reg;
278
279
	/* disable all GMAC IRQ's */
280
	sky2_write8(hw, SK_REG(port, GMAC_IRQ_MSK), 0);
281
	/* disable PHY IRQs */
282
	gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0);
283
284
	gma_write16(hw, port, GM_MC_ADDR_H1, 0);	/* clear MC hash */
285
	gma_write16(hw, port, GM_MC_ADDR_H2, 0);
286
	gma_write16(hw, port, GM_MC_ADDR_H3, 0);
287
	gma_write16(hw, port, GM_MC_ADDR_H4, 0);
288
289
	reg = gma_read16(hw, port, GM_RX_CTRL);
290
	reg |= GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA;
291
	gma_write16(hw, port, GM_RX_CTRL, reg);
292
}
293
294
static void sky2_phy_init(struct sky2_hw *hw, unsigned port)
295
{
296
	struct sky2_port *sky2 = netdev_priv(hw->dev[port]);
297
	u16 ctrl, ct1000, adv, pg, ledctrl, ledover;
298
299
	if (sky2->autoneg == AUTONEG_ENABLE && hw->chip_id != CHIP_ID_YUKON_XL) {
300
		u16 ectrl = gm_phy_read(hw, port, PHY_MARV_EXT_CTRL);
301
302
		ectrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK |
303
			   PHY_M_EC_MAC_S_MSK);
304
		ectrl |= PHY_M_EC_MAC_S(MAC_TX_CLK_25_MHZ);
305
306
		if (hw->chip_id == CHIP_ID_YUKON_EC)
307
			ectrl |= PHY_M_EC_DSC_2(2) | PHY_M_EC_DOWN_S_ENA;
308
		else
309
			ectrl |= PHY_M_EC_M_DSC(2) | PHY_M_EC_S_DSC(3);
310
311
		gm_phy_write(hw, port, PHY_MARV_EXT_CTRL, ectrl);
312
	}
313
314
	ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
315
	if (hw->copper) {
316
		if (hw->chip_id == CHIP_ID_YUKON_FE) {
317
			/* enable automatic crossover */
318
			ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1;
319
		} else {
320
			/* disable energy detect */
321
			ctrl &= ~PHY_M_PC_EN_DET_MSK;
322
323
			/* enable automatic crossover */
324
			ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO);
325
326
			if (sky2->autoneg == AUTONEG_ENABLE &&
327
			    hw->chip_id == CHIP_ID_YUKON_XL) {
328
				ctrl &= ~PHY_M_PC_DSC_MSK;
329
				ctrl |= PHY_M_PC_DSC(2) | PHY_M_PC_DOWN_S_ENA;
330
			}
331
		}
332
		gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
333
	} else {
334
		/* workaround for deviation #4.88 (CRC errors) */
335
		/* disable Automatic Crossover */
336
337
		ctrl &= ~PHY_M_PC_MDIX_MSK;
338
		gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
339
340
		if (hw->chip_id == CHIP_ID_YUKON_XL) {
341
			/* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */
342
			gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 2);
343
			ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
344
			ctrl &= ~PHY_M_MAC_MD_MSK;
345
			ctrl |= PHY_M_MAC_MODE_SEL(PHY_M_MAC_MD_1000BX);
346
			gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
347
348
			/* select page 1 to access Fiber registers */
349
			gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 1);
350
		}
351
	}
352
353
	ctrl = gm_phy_read(hw, port, PHY_MARV_CTRL);
354
	if (sky2->autoneg == AUTONEG_DISABLE)
355
		ctrl &= ~PHY_CT_ANE;
356
	else
357
		ctrl |= PHY_CT_ANE;
358
359
	ctrl |= PHY_CT_RESET;
360
	gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl);
361
362
	ctrl = 0;
363
	ct1000 = 0;
364
	adv = PHY_AN_CSMA;
365
366
	if (sky2->autoneg == AUTONEG_ENABLE) {
367
		if (hw->copper) {
368
			if (sky2->advertising & ADVERTISED_1000baseT_Full)
369
				ct1000 |= PHY_M_1000C_AFD;
370
			if (sky2->advertising & ADVERTISED_1000baseT_Half)
371
				ct1000 |= PHY_M_1000C_AHD;
372
			if (sky2->advertising & ADVERTISED_100baseT_Full)
373
				adv |= PHY_M_AN_100_FD;
374
			if (sky2->advertising & ADVERTISED_100baseT_Half)
375
				adv |= PHY_M_AN_100_HD;
376
			if (sky2->advertising & ADVERTISED_10baseT_Full)
377
				adv |= PHY_M_AN_10_FD;
378
			if (sky2->advertising & ADVERTISED_10baseT_Half)
379
				adv |= PHY_M_AN_10_HD;
380
		} else		/* special defines for FIBER (88E1011S only) */
381
			adv |= PHY_M_AN_1000X_AHD | PHY_M_AN_1000X_AFD;
382
383
		/* Set Flow-control capabilities */
384
		if (sky2->tx_pause && sky2->rx_pause)
385
			adv |= PHY_AN_PAUSE_CAP;	/* symmetric */
386
		else if (sky2->rx_pause && !sky2->tx_pause)
387
			adv |= PHY_AN_PAUSE_ASYM | PHY_AN_PAUSE_CAP;
388
		else if (!sky2->rx_pause && sky2->tx_pause)
389
			adv |= PHY_AN_PAUSE_ASYM;	/* local */
390
391
		/* Restart Auto-negotiation */
392
		ctrl |= PHY_CT_ANE | PHY_CT_RE_CFG;
393
	} else {
394
		/* forced speed/duplex settings */
395
		ct1000 = PHY_M_1000C_MSE;
396
397
		if (sky2->duplex == DUPLEX_FULL)
398
			ctrl |= PHY_CT_DUP_MD;
399
400
		switch (sky2->speed) {
401
		case SPEED_1000:
402
			ctrl |= PHY_CT_SP1000;
403
			break;
404
		case SPEED_100:
405
			ctrl |= PHY_CT_SP100;
406
			break;
407
		}
408
409
		ctrl |= PHY_CT_RESET;
410
	}
411
412
	if (hw->chip_id != CHIP_ID_YUKON_FE)
413
		gm_phy_write(hw, port, PHY_MARV_1000T_CTRL, ct1000);
414
415
	gm_phy_write(hw, port, PHY_MARV_AUNE_ADV, adv);
416
	gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl);
417
418
	/* Setup Phy LED's */
419
	ledctrl = PHY_M_LED_PULS_DUR(PULS_170MS);
420
	ledover = 0;
421
422
	switch (hw->chip_id) {
423
	case CHIP_ID_YUKON_FE:
424
		/* on 88E3082 these bits are at 11..9 (shifted left) */
425
		ledctrl |= PHY_M_LED_BLINK_RT(BLINK_84MS) << 1;
426
427
		ctrl = gm_phy_read(hw, port, PHY_MARV_FE_LED_PAR);
428
429
		/* delete ACT LED control bits */
430
		ctrl &= ~PHY_M_FELP_LED1_MSK;
431
		/* change ACT LED control to blink mode */
432
		ctrl |= PHY_M_FELP_LED1_CTRL(LED_PAR_CTRL_ACT_BL);
433
		gm_phy_write(hw, port, PHY_MARV_FE_LED_PAR, ctrl);
434
		break;
435
436
	case CHIP_ID_YUKON_XL:
437
		pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
438
439
		/* select page 3 to access LED control register */
440
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
441
442
		/* set LED Function Control register */
443
		gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, (PHY_M_LEDC_LOS_CTRL(1) |	/* LINK/ACT */
444
							   PHY_M_LEDC_INIT_CTRL(7) |	/* 10 Mbps */
445
							   PHY_M_LEDC_STA1_CTRL(7) |	/* 100 Mbps */
446
							   PHY_M_LEDC_STA0_CTRL(7)));	/* 1000 Mbps */
447
448
		/* set Polarity Control register */
449
		gm_phy_write(hw, port, PHY_MARV_PHY_STAT,
450
			     (PHY_M_POLC_LS1_P_MIX(4) |
451
			      PHY_M_POLC_IS0_P_MIX(4) |
452
			      PHY_M_POLC_LOS_CTRL(2) |
453
			      PHY_M_POLC_INIT_CTRL(2) |
454
			      PHY_M_POLC_STA1_CTRL(2) |
455
			      PHY_M_POLC_STA0_CTRL(2)));
456
457
		/* restore page register */
458
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
459
		break;
460
461
	default:
462
		/* set Tx LED (LED_TX) to blink mode on Rx OR Tx activity */
463
		ledctrl |= PHY_M_LED_BLINK_RT(BLINK_84MS) | PHY_M_LEDC_TX_CTRL;
464
		/* turn off the Rx LED (LED_RX) */
465
		ledover |= PHY_M_LED_MO_RX(MO_LED_OFF);
466
	}
467
468
	gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl);
469
470
	if (sky2->autoneg == AUTONEG_DISABLE || sky2->speed == SPEED_100) {
471
		/* turn on 100 Mbps LED (LED_LINK100) */
472
		ledover |= PHY_M_LED_MO_100(MO_LED_ON);
473
	}
474
475
	if (ledover)
476
		gm_phy_write(hw, port, PHY_MARV_LED_OVER, ledover);
477
478
	/* Enable phy interrupt on auto-negotiation complete (or link up) */
479
	if (sky2->autoneg == AUTONEG_ENABLE)
480
		gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_IS_AN_COMPL);
481
	else
482
		gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK);
483
}
484
485
/* Force a renegotiation */
486
static void sky2_phy_reinit(struct sky2_port *sky2)
487
{
488
	down(&sky2->phy_sema);
489
	sky2_phy_init(sky2->hw, sky2->port);
490
	up(&sky2->phy_sema);
491
}
492
493
static void sky2_mac_init(struct sky2_hw *hw, unsigned port)
494
{
495
	struct sky2_port *sky2 = netdev_priv(hw->dev[port]);
496
	u16 reg;
497
	int i;
498
	const u8 *addr = hw->dev[port]->dev_addr;
499
500
	sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET);
501
	sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR|GPC_ENA_PAUSE);
502
503
	sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR);
504
505
	if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0 && port == 1) {
506
		/* WA DEV_472 -- looks like crossed wires on port 2 */
507
		/* clear GMAC 1 Control reset */
508
		sky2_write8(hw, SK_REG(0, GMAC_CTRL), GMC_RST_CLR);
509
		do {
510
			sky2_write8(hw, SK_REG(1, GMAC_CTRL), GMC_RST_SET);
511
			sky2_write8(hw, SK_REG(1, GMAC_CTRL), GMC_RST_CLR);
512
		} while (gm_phy_read(hw, 1, PHY_MARV_ID0) != PHY_MARV_ID0_VAL ||
513
			 gm_phy_read(hw, 1, PHY_MARV_ID1) != PHY_MARV_ID1_Y2 ||
514
			 gm_phy_read(hw, 1, PHY_MARV_INT_MASK) != 0);
515
	}
516
517
	if (sky2->autoneg == AUTONEG_DISABLE) {
518
		reg = gma_read16(hw, port, GM_GP_CTRL);
519
		reg |= GM_GPCR_AU_ALL_DIS;
520
		gma_write16(hw, port, GM_GP_CTRL, reg);
521
		gma_read16(hw, port, GM_GP_CTRL);
522
523
		switch (sky2->speed) {
524
		case SPEED_1000:
525
			reg |= GM_GPCR_SPEED_1000;
526
			/* fallthru */
527
		case SPEED_100:
528
			reg |= GM_GPCR_SPEED_100;
529
		}
530
531
		if (sky2->duplex == DUPLEX_FULL)
532
			reg |= GM_GPCR_DUP_FULL;
533
	} else
534
		reg = GM_GPCR_SPEED_1000 | GM_GPCR_SPEED_100 | GM_GPCR_DUP_FULL;
535
536
	if (!sky2->tx_pause && !sky2->rx_pause) {
537
		sky2_write32(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
538
		reg |=
539
		    GM_GPCR_FC_TX_DIS | GM_GPCR_FC_RX_DIS | GM_GPCR_AU_FCT_DIS;
540
	} else if (sky2->tx_pause && !sky2->rx_pause) {
541
		/* disable Rx flow-control */
542
		reg |= GM_GPCR_FC_RX_DIS | GM_GPCR_AU_FCT_DIS;
543
	}
544
545
	gma_write16(hw, port, GM_GP_CTRL, reg);
546
547
	sky2_read16(hw, SK_REG(port, GMAC_IRQ_SRC));
548
549
	down(&sky2->phy_sema);
550
	sky2_phy_init(hw, port);
551
	up(&sky2->phy_sema);
552
553
	/* MIB clear */
554
	reg = gma_read16(hw, port, GM_PHY_ADDR);
555
	gma_write16(hw, port, GM_PHY_ADDR, reg | GM_PAR_MIB_CLR);
556
557
	for (i = 0; i < GM_MIB_CNT_SIZE; i++)
558
		gma_read16(hw, port, GM_MIB_CNT_BASE + 8 * i);
559
	gma_write16(hw, port, GM_PHY_ADDR, reg);
560
561
	/* transmit control */
562
	gma_write16(hw, port, GM_TX_CTRL, TX_COL_THR(TX_COL_DEF));
563
564
	/* receive control reg: unicast + multicast + no FCS  */
565
	gma_write16(hw, port, GM_RX_CTRL,
566
		    GM_RXCR_UCF_ENA | GM_RXCR_CRC_DIS | GM_RXCR_MCF_ENA);
567
568
	/* transmit flow control */
569
	gma_write16(hw, port, GM_TX_FLOW_CTRL, 0xffff);
570
571
	/* transmit parameter */
572
	gma_write16(hw, port, GM_TX_PARAM,
573
		    TX_JAM_LEN_VAL(TX_JAM_LEN_DEF) |
574
		    TX_JAM_IPG_VAL(TX_JAM_IPG_DEF) |
575
		    TX_IPG_JAM_DATA(TX_IPG_JAM_DEF) |
576
		    TX_BACK_OFF_LIM(TX_BOF_LIM_DEF));
577
578
	/* serial mode register */
579
	reg = DATA_BLIND_VAL(DATA_BLIND_DEF) |
580
		GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
581
582
	if (hw->dev[port]->mtu > ETH_DATA_LEN)
583
		reg |= GM_SMOD_JUMBO_ENA;
584
585
	gma_write16(hw, port, GM_SERIAL_MODE, reg);
586
587
	/* virtual address for data */
588
	gma_set_addr(hw, port, GM_SRC_ADDR_2L, addr);
589
590
	/* physical address: used for pause frames */
591
	gma_set_addr(hw, port, GM_SRC_ADDR_1L, addr);
592
593
	/* ignore counter overflows */
594
	gma_write16(hw, port, GM_TX_IRQ_MSK, 0);
595
	gma_write16(hw, port, GM_RX_IRQ_MSK, 0);
596
	gma_write16(hw, port, GM_TR_IRQ_MSK, 0);
597
598
	/* Configure Rx MAC FIFO */
599
	sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_CLR);
600
	sky2_write16(hw, SK_REG(port, RX_GMF_CTRL_T),
601
		     GMF_RX_CTRL_DEF);
602
603
	/* Flush Rx MAC FIFO on any flow control or error */
604
	sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR);
605
606
	/* Set threshold to 0xa (64 bytes)
607
	 *  ASF disabled so no need to do WA dev #4.30
608
	 */
609
	sky2_write16(hw, SK_REG(port, RX_GMF_FL_THR), RX_GMF_FL_THR_DEF);
610
611
	/* Configure Tx MAC FIFO */
612
	sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_CLR);
613
	sky2_write16(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_OPER_ON);
614
615
	if (hw->chip_id == CHIP_ID_YUKON_EC_U) {
616
		sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8);
617
		sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8);
618
		if (hw->dev[port]->mtu > ETH_DATA_LEN) {
619
			/* set Tx GMAC FIFO Almost Empty Threshold */
620
			sky2_write32(hw, SK_REG(port, TX_GMF_AE_THR), 0x180);
621
			/* Disable Store & Forward mode for TX */
622
			sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_STFW_DIS);
623
		}
624
	}
625
626
}
627
628
static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, size_t len)
629
{
630
	u32 end;
631
632
	start /= 8;
633
	len /= 8;
634
	end = start + len - 1;
635
636
	sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR);
637
	sky2_write32(hw, RB_ADDR(q, RB_START), start);
638
	sky2_write32(hw, RB_ADDR(q, RB_END), end);
639
	sky2_write32(hw, RB_ADDR(q, RB_WP), start);
640
	sky2_write32(hw, RB_ADDR(q, RB_RP), start);
641
642
	if (q == Q_R1 || q == Q_R2) {
643
		u32 rxup, rxlo;
644
645
		rxlo = len/2;
646
		rxup = rxlo + len/4;
647
648
		/* Set thresholds on receive queue's */
649
		sky2_write32(hw, RB_ADDR(q, RB_RX_UTPP), rxup);
650
		sky2_write32(hw, RB_ADDR(q, RB_RX_LTPP), rxlo);
651
	} else {
652
		/* Enable store & forward on Tx queue's because
653
		 * Tx FIFO is only 1K on Yukon
654
		 */
655
		sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_STFWD);
656
	}
657
658
	sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_OP_MD);
659
	sky2_read8(hw, RB_ADDR(q, RB_CTRL));
660
}
661
662
/* Setup Bus Memory Interface */
663
static void sky2_qset(struct sky2_hw *hw, u16 q)
664
{
665
	sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_CLR_RESET);
666
	sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_OPER_INIT);
667
	sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_FIFO_OP_ON);
668
	sky2_write32(hw, Q_ADDR(q, Q_WM),  BMU_WM_DEFAULT);
669
}
670
671
/* Setup prefetch unit registers. This is the interface between
672
 * hardware and driver list elements
673
 */
674
static void sky2_prefetch_init(struct sky2_hw *hw, u32 qaddr,
675
				      u64 addr, u32 last)
676
{
677
	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
678
	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL), PREF_UNIT_RST_CLR);
679
	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_ADDR_HI), addr >> 32);
680
	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_ADDR_LO), (u32) addr);
681
	sky2_write16(hw, Y2_QADDR(qaddr, PREF_UNIT_LAST_IDX), last);
682
	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL), PREF_UNIT_OP_ON);
683
684
	sky2_read32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL));
685
}
686
687
static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2)
688
{
689
	struct sky2_tx_le *le = sky2->tx_le + sky2->tx_prod;
690
691
	sky2->tx_prod = (sky2->tx_prod + 1) % TX_RING_SIZE;
692
	return le;
693
}
694
695
/*
696
 * This is a workaround code taken from SysKonnect sk98lin driver
697
 * to deal with chip bug on Yukon EC rev 0 in the wraparound case.
698
 */
699
static inline void sky2_put_idx(struct sky2_hw *hw, unsigned q,
700
				u16 idx, u16 *last, u16 size)
701
{
702
	if (is_ec_a1(hw) && idx < *last) {
703
		u16 hwget = sky2_read16(hw, Y2_QADDR(q, PREF_UNIT_GET_IDX));
704
705
		if (hwget == 0) {
706
			/* Start prefetching again */
707
			sky2_write8(hw, Y2_QADDR(q, PREF_UNIT_FIFO_WM), 0xe0);
708
			goto setnew;
709
		}
710
711
		if (hwget == size - 1) {
712
			/* set watermark to one list element */
713
			sky2_write8(hw, Y2_QADDR(q, PREF_UNIT_FIFO_WM), 8);
714
715
			/* set put index to first list element */
716
			sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), 0);
717
		} else		/* have hardware go to end of list */
718
			sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX),
719
				     size - 1);
720
	} else {
721
setnew:
722
		sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), idx);
723
	}
724
	*last = idx;
725
}
726
727
728
static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2)
729
{
730
	struct sky2_rx_le *le = sky2->rx_le + sky2->rx_put;
731
	sky2->rx_put = (sky2->rx_put + 1) % RX_LE_SIZE;
732
	return le;
733
}
734
735
/* Return high part of DMA address (could be 32 or 64 bit) */
736
static inline u32 high32(dma_addr_t a)
737
{
738
	return (a >> 16) >> 16;
739
}
740
741
/* Build description to hardware about buffer */
742
static inline void sky2_rx_add(struct sky2_port *sky2, dma_addr_t map)
743
{
744
	struct sky2_rx_le *le;
745
	u32 hi = high32(map);
746
	u16 len = sky2->rx_bufsize;
747
748
	if (sky2->rx_addr64 != hi) {
749
		le = sky2_next_rx(sky2);
750
		le->addr = cpu_to_le32(hi);
751
		le->ctrl = 0;
752
		le->opcode = OP_ADDR64 | HW_OWNER;
753
		sky2->rx_addr64 = high32(map + len);
754
	}
755
756
	le = sky2_next_rx(sky2);
757
	le->addr = cpu_to_le32((u32) map);
758
	le->length = cpu_to_le16(len);
759
	le->ctrl = 0;
760
	le->opcode = OP_PACKET | HW_OWNER;
761
}
762
763
764
/* Tell chip where to start receive checksum.
765
 * Actually has two checksums, but set both same to avoid possible byte
766
 * order problems.
767
 */
768
static void rx_set_checksum(struct sky2_port *sky2)
769
{
770
	struct sky2_rx_le *le;
771
772
	le = sky2_next_rx(sky2);
773
	le->addr = (ETH_HLEN << 16) | ETH_HLEN;
774
	le->ctrl = 0;
775
	le->opcode = OP_TCPSTART | HW_OWNER;
776
777
	sky2_write32(sky2->hw,
778
		     Q_ADDR(rxqaddr[sky2->port], Q_CSR),
779
		     sky2->rx_csum ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
780
781
}
782
783
/*
784
 * The RX Stop command will not work for Yukon-2 if the BMU does not
785
 * reach the end of packet and since we can't make sure that we have
786
 * incoming data, we must reset the BMU while it is not doing a DMA
787
 * transfer. Since it is possible that the RX path is still active,
788
 * the RX RAM buffer will be stopped first, so any possible incoming
789
 * data will not trigger a DMA. After the RAM buffer is stopped, the
790
 * BMU is polled until any DMA in progress is ended and only then it
791
 * will be reset.
792
 */
793
static void sky2_rx_stop(struct sky2_port *sky2)
794
{
795
	struct sky2_hw *hw = sky2->hw;
796
	unsigned rxq = rxqaddr[sky2->port];
797
	int i;
798
799
	/* disable the RAM Buffer receive queue */
800
	sky2_write8(hw, RB_ADDR(rxq, RB_CTRL), RB_DIS_OP_MD);
801
802
	for (i = 0; i < 0xffff; i++)
803
		if (sky2_read8(hw, RB_ADDR(rxq, Q_RSL))
804
		    == sky2_read8(hw, RB_ADDR(rxq, Q_RL)))
805
			goto stopped;
806
807
	printk(KERN_WARNING PFX "%s: receiver stop failed\n",
808
	       sky2->netdev->name);
809
stopped:
810
	sky2_write32(hw, Q_ADDR(rxq, Q_CSR), BMU_RST_SET | BMU_FIFO_RST);
811
812
	/* reset the Rx prefetch unit */
813
	sky2_write32(hw, Y2_QADDR(rxq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
814
}
815
816
/* Clean out receive buffer area, assumes receiver hardware stopped */
817
static void sky2_rx_clean(struct sky2_port *sky2)
818
{
819
	unsigned i;
820
821
	memset(sky2->rx_le, 0, RX_LE_BYTES);
822
	for (i = 0; i < sky2->rx_pending; i++) {
823
		struct ring_info *re = sky2->rx_ring + i;
824
825
		if (re->skb) {
826
			pci_unmap_single(sky2->hw->pdev,
827
					 re->mapaddr, sky2->rx_bufsize,
828
					 PCI_DMA_FROMDEVICE);
829
			kfree_skb(re->skb);
830
			re->skb = NULL;
831
		}
832
	}
833
}
834
835
/* Basic MII support */
836
static int sky2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
837
{
838
	struct mii_ioctl_data *data = if_mii(ifr);
839
	struct sky2_port *sky2 = netdev_priv(dev);
840
	struct sky2_hw *hw = sky2->hw;
841
	int err = -EOPNOTSUPP;
842
843
	if (!netif_running(dev))
844
		return -ENODEV;	/* Phy still in reset */
845
846
	switch(cmd) {
847
	case SIOCGMIIPHY:
848
		data->phy_id = PHY_ADDR_MARV;
849
850
		/* fallthru */
851
	case SIOCGMIIREG: {
852
		u16 val = 0;
853
854
		down(&sky2->phy_sema);
855
		err = __gm_phy_read(hw, sky2->port, data->reg_num & 0x1f, &val);
856
		up(&sky2->phy_sema);
857
858
		data->val_out = val;
859
		break;
860
	}
861
862
	case SIOCSMIIREG:
863
		if (!capable(CAP_NET_ADMIN))
864
			return -EPERM;
865
866
		down(&sky2->phy_sema);
867
		err = gm_phy_write(hw, sky2->port, data->reg_num & 0x1f,
868
				   data->val_in);
869
		up(&sky2->phy_sema);
870
		break;
871
	}
872
	return err;
873
}
874
875
#ifdef SKY2_VLAN_TAG_USED
876
static void sky2_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
877
{
878
	struct sky2_port *sky2 = netdev_priv(dev);
879
	struct sky2_hw *hw = sky2->hw;
880
	u16 port = sky2->port;
881
882
	spin_lock(&sky2->tx_lock);
883
884
	sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_ON);
885
	sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_ON);
886
	sky2->vlgrp = grp;
887
888
	spin_unlock(&sky2->tx_lock);
889
}
890
891
static void sky2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
892
{
893
	struct sky2_port *sky2 = netdev_priv(dev);
894
	struct sky2_hw *hw = sky2->hw;
895
	u16 port = sky2->port;
896
897
	spin_lock(&sky2->tx_lock);
898
899
	sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_OFF);
900
	sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_OFF);
901
	if (sky2->vlgrp)
902
		sky2->vlgrp->vlan_devices[vid] = NULL;
903
904
	spin_unlock(&sky2->tx_lock);
905
}
906
#endif
907
908
/*
909
 * It appears the hardware has a bug in the FIFO logic that
910
 * cause it to hang if the FIFO gets overrun and the receive buffer
911
 * is not aligned. ALso alloc_skb() won't align properly if slab
912
 * debugging is enabled.
913
 */
914
static inline struct sk_buff *sky2_alloc_skb(unsigned int size, gfp_t gfp_mask)
915
{
916
	struct sk_buff *skb;
917
918
	skb = alloc_skb(size + RX_SKB_ALIGN, gfp_mask);
919
	if (likely(skb)) {
920
		unsigned long p	= (unsigned long) skb->data;
921
		skb_reserve(skb,
922
			((p + RX_SKB_ALIGN - 1) & ~(RX_SKB_ALIGN - 1)) - p);
923
	}
924
925
	return skb;
926
}
927
928
/*
929
 * Allocate and setup receiver buffer pool.
930
 * In case of 64 bit dma, there are 2X as many list elements
931
 * available as ring entries
932
 * and need to reserve one list element so we don't wrap around.
933
 */
934
static int sky2_rx_start(struct sky2_port *sky2)
935
{
936
	struct sky2_hw *hw = sky2->hw;
937
	unsigned rxq = rxqaddr[sky2->port];
938
	int i;
939
940
	sky2->rx_put = sky2->rx_next = 0;
941
	sky2_qset(hw, rxq);
942
	sky2_prefetch_init(hw, rxq, sky2->rx_le_map, RX_LE_SIZE - 1);
943
944
	rx_set_checksum(sky2);
945
	for (i = 0; i < sky2->rx_pending; i++) {
946
		struct ring_info *re = sky2->rx_ring + i;
947
948
		re->skb = sky2_alloc_skb(sky2->rx_bufsize, GFP_KERNEL);
949
		if (!re->skb)
950
			goto nomem;
951
952
		re->mapaddr = pci_map_single(hw->pdev, re->skb->data,
953
					     sky2->rx_bufsize, PCI_DMA_FROMDEVICE);
954
		sky2_rx_add(sky2, re->mapaddr);
955
	}
956
957
	/* Tell chip about available buffers */
958
	sky2_write16(hw, Y2_QADDR(rxq, PREF_UNIT_PUT_IDX), sky2->rx_put);
959
	sky2->rx_last_put = sky2_read16(hw, Y2_QADDR(rxq, PREF_UNIT_PUT_IDX));
960
	return 0;
961
nomem:
962
	sky2_rx_clean(sky2);
963
	return -ENOMEM;
964
}
965
966
/* Bring up network interface. */
967
static int sky2_up(struct net_device *dev)
968
{
969
	struct sky2_port *sky2 = netdev_priv(dev);
970
	struct sky2_hw *hw = sky2->hw;
971
	unsigned port = sky2->port;
972
	u32 ramsize, rxspace;
973
	int err = -ENOMEM;
974
975
	if (netif_msg_ifup(sky2))
976
		printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
977
978
	/* must be power of 2 */
979
	sky2->tx_le = pci_alloc_consistent(hw->pdev,
980
					   TX_RING_SIZE *
981
					   sizeof(struct sky2_tx_le),
982
					   &sky2->tx_le_map);
983
	if (!sky2->tx_le)
984
		goto err_out;
985
986
	sky2->tx_ring = kcalloc(TX_RING_SIZE, sizeof(struct tx_ring_info),
987
				GFP_KERNEL);
988
	if (!sky2->tx_ring)
989
		goto err_out;
990
	sky2->tx_prod = sky2->tx_cons = 0;
991
992
	sky2->rx_le = pci_alloc_consistent(hw->pdev, RX_LE_BYTES,
993
					   &sky2->rx_le_map);
994
	if (!sky2->rx_le)
995
		goto err_out;
996
	memset(sky2->rx_le, 0, RX_LE_BYTES);
997
998
	sky2->rx_ring = kcalloc(sky2->rx_pending, sizeof(struct ring_info),
999
				GFP_KERNEL);
1000
	if (!sky2->rx_ring)
1001
		goto err_out;
1002
1003
	sky2_mac_init(hw, port);
1004
1005
	/* Configure RAM buffers */
1006
	if (hw->chip_id == CHIP_ID_YUKON_FE ||
1007
	    (hw->chip_id == CHIP_ID_YUKON_EC && hw->chip_rev == 2))
1008
		ramsize = 4096;
1009
	else {
1010
		u8 e0 = sky2_read8(hw, B2_E_0);
1011
		ramsize = (e0 == 0) ? (128 * 1024) : (e0 * 4096);
1012
	}
1013
1014
	/* 2/3 for Rx */
1015
	rxspace = (2 * ramsize) / 3;
1016
	sky2_ramset(hw, rxqaddr[port], 0, rxspace);
1017
	sky2_ramset(hw, txqaddr[port], rxspace, ramsize - rxspace);
1018
1019
	/* Make sure SyncQ is disabled */
1020
	sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL),
1021
		    RB_RST_SET);
1022
1023
	sky2_qset(hw, txqaddr[port]);
1024
	if (hw->chip_id == CHIP_ID_YUKON_EC_U)
1025
		sky2_write16(hw, Q_ADDR(txqaddr[port], Q_AL), 0x1a0);
1026
1027
1028
	sky2_prefetch_init(hw, txqaddr[port], sky2->tx_le_map,
1029
			   TX_RING_SIZE - 1);
1030
1031
	err = sky2_rx_start(sky2);
1032
	if (err)
1033
		goto err_out;
1034
1035
	/* Enable interrupts from phy/mac for port */
1036
	hw->intr_mask |= (port == 0) ? Y2_IS_PORT_1 : Y2_IS_PORT_2;
1037
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
1038
	return 0;
1039
1040
err_out:
1041
	if (sky2->rx_le) {
1042
		pci_free_consistent(hw->pdev, RX_LE_BYTES,
1043
				    sky2->rx_le, sky2->rx_le_map);
1044
		sky2->rx_le = NULL;
1045
	}
1046
	if (sky2->tx_le) {
1047
		pci_free_consistent(hw->pdev,
1048
				    TX_RING_SIZE * sizeof(struct sky2_tx_le),
1049
				    sky2->tx_le, sky2->tx_le_map);
1050
		sky2->tx_le = NULL;
1051
	}
1052
	kfree(sky2->tx_ring);
1053
	kfree(sky2->rx_ring);
1054
1055
	sky2->tx_ring = NULL;
1056
	sky2->rx_ring = NULL;
1057
	return err;
1058
}
1059
1060
/* Modular subtraction in ring */
1061
static inline int tx_dist(unsigned tail, unsigned head)
1062
{
1063
	return (head - tail) % TX_RING_SIZE;
1064
}
1065
1066
/* Number of list elements available for next tx */
1067
static inline int tx_avail(const struct sky2_port *sky2)
1068
{
1069
	return sky2->tx_pending - tx_dist(sky2->tx_cons, sky2->tx_prod);
1070
}
1071
1072
/* Estimate of number of transmit list elements required */
1073
static inline unsigned tx_le_req(const struct sk_buff *skb)
1074
{
1075
	unsigned count;
1076
1077
	count = sizeof(dma_addr_t) / sizeof(u32);
1078
	count += skb_shinfo(skb)->nr_frags * count;
1079
1080
	if (skb_shinfo(skb)->tso_size)
1081
		++count;
1082
1083
	if (skb->ip_summed == CHECKSUM_HW)
1084
		++count;
1085
1086
	return count;
1087
}
1088
1089
/*
1090
 * Put one packet in ring for transmit.
1091
 * A single packet can generate multiple list elements, and
1092
 * the number of ring elements will probably be less than the number
1093
 * of list elements used.
1094
 *
1095
 * No BH disabling for tx_lock here (like tg3)
1096
 */
1097
static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
1098
{
1099
	struct sky2_port *sky2 = netdev_priv(dev);
1100
	struct sky2_hw *hw = sky2->hw;
1101
	struct sky2_tx_le *le = NULL;
1102
	struct tx_ring_info *re;
1103
	unsigned i, len;
1104
	dma_addr_t mapping;
1105
	u32 addr64;
1106
	u16 mss;
1107
	u8 ctrl;
1108
1109
	if (!spin_trylock(&sky2->tx_lock))
1110
		return NETDEV_TX_LOCKED;
1111
1112
	if (unlikely(tx_avail(sky2) < tx_le_req(skb))) {
1113
		/* There is a known but harmless race with lockless tx
1114
		 * and netif_stop_queue.
1115
		 */
1116
		if (!netif_queue_stopped(dev)) {
1117
			netif_stop_queue(dev);
1118
			printk(KERN_WARNING PFX "%s: ring full when queue awake!\n",
1119
			       dev->name);
1120
		}
1121
		spin_unlock(&sky2->tx_lock);
1122
1123
		return NETDEV_TX_BUSY;
1124
	}
1125
1126
	if (unlikely(netif_msg_tx_queued(sky2)))
1127
		printk(KERN_DEBUG "%s: tx queued, slot %u, len %d\n",
1128
		       dev->name, sky2->tx_prod, skb->len);
1129
1130
	len = skb_headlen(skb);
1131
	mapping = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE);
1132
	addr64 = high32(mapping);
1133
1134
	re = sky2->tx_ring + sky2->tx_prod;
1135
1136
	/* Send high bits if changed or crosses boundary */
1137
	if (addr64 != sky2->tx_addr64 || high32(mapping + len) != sky2->tx_addr64) {
1138
		le = get_tx_le(sky2);
1139
		le->tx.addr = cpu_to_le32(addr64);
1140
		le->ctrl = 0;
1141
		le->opcode = OP_ADDR64 | HW_OWNER;
1142
		sky2->tx_addr64 = high32(mapping + len);
1143
	}
1144
1145
	/* Check for TCP Segmentation Offload */
1146
	mss = skb_shinfo(skb)->tso_size;
1147
	if (mss != 0) {
1148
		/* just drop the packet if non-linear expansion fails */
1149
		if (skb_header_cloned(skb) &&
1150
		    pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
1151
			dev_kfree_skb_any(skb);
1152
			goto out_unlock;
1153
		}
1154
1155
		mss += ((skb->h.th->doff - 5) * 4);	/* TCP options */
1156
		mss += (skb->nh.iph->ihl * 4) + sizeof(struct tcphdr);
1157
		mss += ETH_HLEN;
1158
	}
1159
1160
	if (mss != sky2->tx_last_mss) {
1161
		le = get_tx_le(sky2);
1162
		le->tx.tso.size = cpu_to_le16(mss);
1163
		le->tx.tso.rsvd = 0;
1164
		le->opcode = OP_LRGLEN | HW_OWNER;
1165
		le->ctrl = 0;
1166
		sky2->tx_last_mss = mss;
1167
	}
1168
1169
	ctrl = 0;
1170
#ifdef SKY2_VLAN_TAG_USED
1171
	/* Add VLAN tag, can piggyback on LRGLEN or ADDR64 */
1172
	if (sky2->vlgrp && vlan_tx_tag_present(skb)) {
1173
		if (!le) {
1174
			le = get_tx_le(sky2);
1175
			le->tx.addr = 0;
1176
			le->opcode = OP_VLAN|HW_OWNER;
1177
			le->ctrl = 0;
1178
		} else
1179
			le->opcode |= OP_VLAN;
1180
		le->length = cpu_to_be16(vlan_tx_tag_get(skb));
1181
		ctrl |= INS_VLAN;
1182
	}
1183
#endif
1184
1185
	/* Handle TCP checksum offload */
1186
	if (skb->ip_summed == CHECKSUM_HW) {
1187
		u16 hdr = skb->h.raw - skb->data;
1188
		u16 offset = hdr + skb->csum;
1189
1190
		ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM;
1191
		if (skb->nh.iph->protocol == IPPROTO_UDP)
1192
			ctrl |= UDPTCP;
1193
1194
		le = get_tx_le(sky2);
1195
		le->tx.csum.start = cpu_to_le16(hdr);
1196
		le->tx.csum.offset = cpu_to_le16(offset);
1197
		le->length = 0;	/* initial checksum value */
1198
		le->ctrl = 1;	/* one packet */
1199
		le->opcode = OP_TCPLISW | HW_OWNER;
1200
	}
1201
1202
	le = get_tx_le(sky2);
1203
	le->tx.addr = cpu_to_le32((u32) mapping);
1204
	le->length = cpu_to_le16(len);
1205
	le->ctrl = ctrl;
1206
	le->opcode = mss ? (OP_LARGESEND | HW_OWNER) : (OP_PACKET | HW_OWNER);
1207
1208
	/* Record the transmit mapping info */
1209
	re->skb = skb;
1210
	pci_unmap_addr_set(re, mapaddr, mapping);
1211
1212
	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
1213
		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
1214
		struct tx_ring_info *fre;
1215
1216
		mapping = pci_map_page(hw->pdev, frag->page, frag->page_offset,
1217
				       frag->size, PCI_DMA_TODEVICE);
1218
		addr64 = (mapping >> 16) >> 16;
1219
		if (addr64 != sky2->tx_addr64) {
1220
			le = get_tx_le(sky2);
1221
			le->tx.addr = cpu_to_le32(addr64);
1222
			le->ctrl = 0;
1223
			le->opcode = OP_ADDR64 | HW_OWNER;
1224
			sky2->tx_addr64 = addr64;
1225
		}
1226
1227
		le = get_tx_le(sky2);
1228
		le->tx.addr = cpu_to_le32((u32) mapping);
1229
		le->length = cpu_to_le16(frag->size);
1230
		le->ctrl = ctrl;
1231
		le->opcode = OP_BUFFER | HW_OWNER;
1232
1233
		fre = sky2->tx_ring
1234
		    + ((re - sky2->tx_ring) + i + 1) % TX_RING_SIZE;
1235
		pci_unmap_addr_set(fre, mapaddr, mapping);
1236
	}
1237
1238
	re->idx = sky2->tx_prod;
1239
	le->ctrl |= EOP;
1240
1241
	sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod,
1242
		     &sky2->tx_last_put, TX_RING_SIZE);
1243
1244
	if (tx_avail(sky2) <= MAX_SKB_TX_LE)
1245
		netif_stop_queue(dev);
1246
1247
out_unlock:
1248
	mmiowb();
1249
	spin_unlock(&sky2->tx_lock);
1250
1251
	dev->trans_start = jiffies;
1252
	return NETDEV_TX_OK;
1253
}
1254
1255
/*
1256
 * Free ring elements from starting at tx_cons until "done"
1257
 *
1258
 * NB: the hardware will tell us about partial completion of multi-part
1259
 *     buffers; these are deferred until completion.
1260
 */
1261
static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
1262
{
1263
	struct net_device *dev = sky2->netdev;
1264
	struct pci_dev *pdev = sky2->hw->pdev;
1265
	u16 nxt, put;
1266
	unsigned i;
1267
1268
	BUG_ON(done >= TX_RING_SIZE);
1269
1270
	if (unlikely(netif_msg_tx_done(sky2)))
1271
		printk(KERN_DEBUG "%s: tx done, up to %u\n",
1272
		       dev->name, done);
1273
1274
	for (put = sky2->tx_cons; put != done; put = nxt) {
1275
		struct tx_ring_info *re = sky2->tx_ring + put;
1276
		struct sk_buff *skb = re->skb;
1277
1278
  		nxt = re->idx;
1279
		BUG_ON(nxt >= TX_RING_SIZE);
1280
		prefetch(sky2->tx_ring + nxt);
1281
1282
		/* Check for partial status */
1283
		if (tx_dist(put, done) < tx_dist(put, nxt))
1284
			break;
1285
1286
		skb = re->skb;
1287
		pci_unmap_single(pdev, pci_unmap_addr(re, mapaddr),
1288
				 skb_headlen(skb), PCI_DMA_TODEVICE);
1289
1290
		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
1291
			struct tx_ring_info *fre;
1292
			fre = sky2->tx_ring + (put + i + 1) % TX_RING_SIZE;
1293
			pci_unmap_page(pdev, pci_unmap_addr(fre, mapaddr),
1294
  				       skb_shinfo(skb)->frags[i].size,
1295
				       PCI_DMA_TODEVICE);
1296
		}
1297
1298
		dev_kfree_skb_any(skb);
1299
	}
1300
1301
	spin_lock(&sky2->tx_lock);
1302
	sky2->tx_cons = put;
1303
	if (netif_queue_stopped(dev) && tx_avail(sky2) > MAX_SKB_TX_LE)
1304
		netif_wake_queue(dev);
1305
	spin_unlock(&sky2->tx_lock);
1306
}
1307
1308
/* Cleanup all untransmitted buffers, assume transmitter not running */
1309
static void sky2_tx_clean(struct sky2_port *sky2)
1310
{
1311
	sky2_tx_complete(sky2, sky2->tx_prod);
1312
}
1313
1314
/* Network shutdown */
1315
static int sky2_down(struct net_device *dev)
1316
{
1317
	struct sky2_port *sky2 = netdev_priv(dev);
1318
	struct sky2_hw *hw = sky2->hw;
1319
	unsigned port = sky2->port;
1320
	u16 ctrl;
1321
1322
	/* Never really got started! */
1323
	if (!sky2->tx_le)
1324
		return 0;
1325
1326
	if (netif_msg_ifdown(sky2))
1327
		printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);
1328
1329
	/* Stop more packets from being queued */
1330
	netif_stop_queue(dev);
1331
1332
	/* Disable port IRQ */
1333
	local_irq_disable();
1334
	hw->intr_mask &= ~((sky2->port == 0) ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2);
1335
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
1336
	local_irq_enable();
1337
1338
	flush_scheduled_work();
1339
1340
	sky2_phy_reset(hw, port);
1341
1342
	/* Stop transmitter */
1343
	sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR), BMU_STOP);
1344
	sky2_read32(hw, Q_ADDR(txqaddr[port], Q_CSR));
1345
1346
	sky2_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL),
1347
		     RB_RST_SET | RB_DIS_OP_MD);
1348
1349
	ctrl = gma_read16(hw, port, GM_GP_CTRL);
1350
	ctrl &= ~(GM_GPCR_TX_ENA | GM_GPCR_RX_ENA);
1351
	gma_write16(hw, port, GM_GP_CTRL, ctrl);
1352
1353
	sky2_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET);
1354
1355
	/* Workaround shared GMAC reset */
1356
	if (!(hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0
1357
	      && port == 0 && hw->dev[1] && netif_running(hw->dev[1])))
1358
		sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_SET);
1359
1360
	/* Disable Force Sync bit and Enable Alloc bit */
1361
	sky2_write8(hw, SK_REG(port, TXA_CTRL),
1362
		    TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
1363
1364
	/* Stop Interval Timer and Limit Counter of Tx Arbiter */
1365
	sky2_write32(hw, SK_REG(port, TXA_ITI_INI), 0L);
1366
	sky2_write32(hw, SK_REG(port, TXA_LIM_INI), 0L);
1367
1368
	/* Reset the PCI FIFO of the async Tx queue */
1369
	sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR),
1370
		     BMU_RST_SET | BMU_FIFO_RST);
1371
1372
	/* Reset the Tx prefetch units */
1373
	sky2_write32(hw, Y2_QADDR(txqaddr[port], PREF_UNIT_CTRL),
1374
		     PREF_UNIT_RST_SET);
1375
1376
	sky2_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL), RB_RST_SET);
1377
1378
	sky2_rx_stop(sky2);
1379
1380
	sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET);
1381
	sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_SET);
1382
1383
	/* turn off LED's */
1384
	sky2_write16(hw, B0_Y2LED, LED_STAT_OFF);
1385
1386
	synchronize_irq(hw->pdev->irq);
1387
1388
	sky2_tx_clean(sky2);
1389
	sky2_rx_clean(sky2);
1390
1391
	pci_free_consistent(hw->pdev, RX_LE_BYTES,
1392
			    sky2->rx_le, sky2->rx_le_map);
1393
	kfree(sky2->rx_ring);
1394
1395
	pci_free_consistent(hw->pdev,
1396
			    TX_RING_SIZE * sizeof(struct sky2_tx_le),
1397
			    sky2->tx_le, sky2->tx_le_map);
1398
	kfree(sky2->tx_ring);
1399
1400
	sky2->tx_le = NULL;
1401
	sky2->rx_le = NULL;
1402
1403
	sky2->rx_ring = NULL;
1404
	sky2->tx_ring = NULL;
1405
1406
	return 0;
1407
}
1408
1409
static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux)
1410
{
1411
	if (!hw->copper)
1412
		return SPEED_1000;
1413
1414
	if (hw->chip_id == CHIP_ID_YUKON_FE)
1415
		return (aux & PHY_M_PS_SPEED_100) ? SPEED_100 : SPEED_10;
1416
1417
	switch (aux & PHY_M_PS_SPEED_MSK) {
1418
	case PHY_M_PS_SPEED_1000:
1419
		return SPEED_1000;
1420
	case PHY_M_PS_SPEED_100:
1421
		return SPEED_100;
1422
	default:
1423
		return SPEED_10;
1424
	}
1425
}
1426
1427
static void sky2_link_up(struct sky2_port *sky2)
1428
{
1429
	struct sky2_hw *hw = sky2->hw;
1430
	unsigned port = sky2->port;
1431
	u16 reg;
1432
1433
	/* Enable Transmit FIFO Underrun */
1434
	sky2_write8(hw, SK_REG(port, GMAC_IRQ_MSK), GMAC_DEF_MSK);
1435
1436
	reg = gma_read16(hw, port, GM_GP_CTRL);
1437
	if (sky2->duplex == DUPLEX_FULL || sky2->autoneg == AUTONEG_ENABLE)
1438
		reg |= GM_GPCR_DUP_FULL;
1439
1440
	/* enable Rx/Tx */
1441
	reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA;
1442
	gma_write16(hw, port, GM_GP_CTRL, reg);
1443
	gma_read16(hw, port, GM_GP_CTRL);
1444
1445
	gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK);
1446
1447
	netif_carrier_on(sky2->netdev);
1448
	netif_wake_queue(sky2->netdev);
1449
1450
	/* Turn on link LED */
1451
	sky2_write8(hw, SK_REG(port, LNK_LED_REG),
1452
		    LINKLED_ON | LINKLED_BLINK_OFF | LINKLED_LINKSYNC_OFF);
1453
1454
	if (hw->chip_id == CHIP_ID_YUKON_XL) {
1455
		u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
1456
1457
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
1458
		gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, PHY_M_LEDC_LOS_CTRL(1) |	/* LINK/ACT */
1459
			     PHY_M_LEDC_INIT_CTRL(sky2->speed ==
1460
						  SPEED_10 ? 7 : 0) |
1461
			     PHY_M_LEDC_STA1_CTRL(sky2->speed ==
1462
						  SPEED_100 ? 7 : 0) |
1463
			     PHY_M_LEDC_STA0_CTRL(sky2->speed ==
1464
						  SPEED_1000 ? 7 : 0));
1465
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
1466
	}
1467
1468
	if (netif_msg_link(sky2))
1469
		printk(KERN_INFO PFX
1470
		       "%s: Link is up at %d Mbps, %s duplex, flow control %s\n",
1471
		       sky2->netdev->name, sky2->speed,
1472
		       sky2->duplex == DUPLEX_FULL ? "full" : "half",
1473
		       (sky2->tx_pause && sky2->rx_pause) ? "both" :
1474
		       sky2->tx_pause ? "tx" : sky2->rx_pause ? "rx" : "none");
1475
}
1476
1477
static void sky2_link_down(struct sky2_port *sky2)
1478
{
1479
	struct sky2_hw *hw = sky2->hw;
1480
	unsigned port = sky2->port;
1481
	u16 reg;
1482
1483
	gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0);
1484
1485
	reg = gma_read16(hw, port, GM_GP_CTRL);
1486
	reg &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
1487
	gma_write16(hw, port, GM_GP_CTRL, reg);
1488
	gma_read16(hw, port, GM_GP_CTRL);	/* PCI post */
1489
1490
	if (sky2->rx_pause && !sky2->tx_pause) {
1491
		/* restore Asymmetric Pause bit */
1492
		gm_phy_write(hw, port, PHY_MARV_AUNE_ADV,
1493
			     gm_phy_read(hw, port, PHY_MARV_AUNE_ADV)
1494
			     | PHY_M_AN_ASP);
1495
	}
1496
1497
	netif_carrier_off(sky2->netdev);
1498
	netif_stop_queue(sky2->netdev);
1499
1500
	/* Turn on link LED */
1501
	sky2_write8(hw, SK_REG(port, LNK_LED_REG), LINKLED_OFF);
1502
1503
	if (netif_msg_link(sky2))
1504
		printk(KERN_INFO PFX "%s: Link is down.\n", sky2->netdev->name);
1505
	sky2_phy_init(hw, port);
1506
}
1507
1508
static int sky2_autoneg_done(struct sky2_port *sky2, u16 aux)
1509
{
1510
	struct sky2_hw *hw = sky2->hw;
1511
	unsigned port = sky2->port;
1512
	u16 lpa;
1513
1514
	lpa = gm_phy_read(hw, port, PHY_MARV_AUNE_LP);
1515
1516
	if (lpa & PHY_M_AN_RF) {
1517
		printk(KERN_ERR PFX "%s: remote fault", sky2->netdev->name);
1518
		return -1;
1519
	}
1520
1521
	if (hw->chip_id != CHIP_ID_YUKON_FE &&
1522
	    gm_phy_read(hw, port, PHY_MARV_1000T_STAT) & PHY_B_1000S_MSF) {
1523
		printk(KERN_ERR PFX "%s: master/slave fault",
1524
		       sky2->netdev->name);
1525
		return -1;
1526
	}
1527
1528
	if (!(aux & PHY_M_PS_SPDUP_RES)) {
1529
		printk(KERN_ERR PFX "%s: speed/duplex mismatch",
1530
		       sky2->netdev->name);
1531
		return -1;
1532
	}
1533
1534
	sky2->duplex = (aux & PHY_M_PS_FULL_DUP) ? DUPLEX_FULL : DUPLEX_HALF;
1535
1536
	sky2->speed = sky2_phy_speed(hw, aux);
1537
1538
	/* Pause bits are offset (9..8) */
1539
	if (hw->chip_id == CHIP_ID_YUKON_XL)
1540
		aux >>= 6;
1541
1542
	sky2->rx_pause = (aux & PHY_M_PS_RX_P_EN) != 0;
1543
	sky2->tx_pause = (aux & PHY_M_PS_TX_P_EN) != 0;
1544
1545
	if ((sky2->tx_pause || sky2->rx_pause)
1546
	    && !(sky2->speed < SPEED_1000 && sky2->duplex == DUPLEX_HALF))
1547
		sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_ON);
1548
	else
1549
		sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
1550
1551
	return 0;
1552
}
1553
1554
/*
1555
 * Interrupt from PHY are handled outside of interrupt context
1556
 * because accessing phy registers requires spin wait which might
1557
 * cause excess interrupt latency.
1558
 */
1559
static void sky2_phy_task(void *arg)
1560
{
1561
	struct sky2_port *sky2 = arg;
1562
	struct sky2_hw *hw = sky2->hw;
1563
	u16 istatus, phystat;
1564
1565
	down(&sky2->phy_sema);
1566
	istatus = gm_phy_read(hw, sky2->port, PHY_MARV_INT_STAT);
1567
	phystat = gm_phy_read(hw, sky2->port, PHY_MARV_PHY_STAT);
1568
1569
	if (netif_msg_intr(sky2))
1570
		printk(KERN_INFO PFX "%s: phy interrupt status 0x%x 0x%x\n",
1571
		       sky2->netdev->name, istatus, phystat);
1572
1573
	if (istatus & PHY_M_IS_AN_COMPL) {
1574
		if (sky2_autoneg_done(sky2, phystat) == 0)
1575
			sky2_link_up(sky2);
1576
		goto out;
1577
	}
1578
1579
	if (istatus & PHY_M_IS_LSP_CHANGE)
1580
		sky2->speed = sky2_phy_speed(hw, phystat);
1581
1582
	if (istatus & PHY_M_IS_DUP_CHANGE)
1583
		sky2->duplex =
1584
		    (phystat & PHY_M_PS_FULL_DUP) ? DUPLEX_FULL : DUPLEX_HALF;
1585
1586
	if (istatus & PHY_M_IS_LST_CHANGE) {
1587
		if (phystat & PHY_M_PS_LINK_UP)
1588
			sky2_link_up(sky2);
1589
		else
1590
			sky2_link_down(sky2);
1591
	}
1592
out:
1593
	up(&sky2->phy_sema);
1594
1595
	local_irq_disable();
1596
	hw->intr_mask |= (sky2->port == 0) ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2;
1597
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
1598
	local_irq_enable();
1599
}
1600
1601
static void sky2_tx_timeout(struct net_device *dev)
1602
{
1603
	struct sky2_port *sky2 = netdev_priv(dev);
1604
	struct sky2_hw *hw = sky2->hw;
1605
	unsigned txq = txqaddr[sky2->port];
1606
1607
	if (netif_msg_timer(sky2))
1608
		printk(KERN_ERR PFX "%s: tx timeout\n", dev->name);
1609
1610
	netif_stop_queue(dev);
1611
1612
	sky2_write32(hw, Q_ADDR(txq, Q_CSR), BMU_STOP);
1613
	sky2_read32(hw, Q_ADDR(txq, Q_CSR));
1614
1615
	sky2_write32(hw, Y2_QADDR(txq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
1616
1617
	sky2_tx_clean(sky2);
1618
1619
	sky2_qset(hw, txq);
1620
	sky2_prefetch_init(hw, txq, sky2->tx_le_map, TX_RING_SIZE - 1);
1621
1622
	netif_wake_queue(dev);
1623
}
1624
1625
1626
#define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
1627
/* Want receive buffer size to be multiple of 64 bits, and incl room for vlan */
1628
static inline unsigned sky2_buf_size(int mtu)
1629
{
1630
	return roundup(mtu + ETH_HLEN + 4, 8);
1631
}
1632
1633
static int sky2_change_mtu(struct net_device *dev, int new_mtu)
1634
{
1635
	struct sky2_port *sky2 = netdev_priv(dev);
1636
	struct sky2_hw *hw = sky2->hw;
1637
	int err;
1638
	u16 ctl, mode;
1639
1640
	if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU)
1641
		return -EINVAL;
1642
1643
	if (hw->chip_id == CHIP_ID_YUKON_EC_U && new_mtu > ETH_DATA_LEN)
1644
		return -EINVAL;
1645
1646
	if (!netif_running(dev)) {
1647
		dev->mtu = new_mtu;
1648
		return 0;
1649
	}
1650
1651
	sky2_write32(hw, B0_IMSK, 0);
1652
1653
	dev->trans_start = jiffies;	/* prevent tx timeout */
1654
	netif_stop_queue(dev);
1655
	netif_poll_disable(hw->dev[0]);
1656
1657
	ctl = gma_read16(hw, sky2->port, GM_GP_CTRL);
1658
	gma_write16(hw, sky2->port, GM_GP_CTRL, ctl & ~GM_GPCR_RX_ENA);
1659
	sky2_rx_stop(sky2);
1660
	sky2_rx_clean(sky2);
1661
1662
	dev->mtu = new_mtu;
1663
	sky2->rx_bufsize = sky2_buf_size(new_mtu);
1664
	mode = DATA_BLIND_VAL(DATA_BLIND_DEF) |
1665
		GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
1666
1667
	if (dev->mtu > ETH_DATA_LEN)
1668
		mode |= GM_SMOD_JUMBO_ENA;
1669
1670
	gma_write16(hw, sky2->port, GM_SERIAL_MODE, mode);
1671
1672
	sky2_write8(hw, RB_ADDR(rxqaddr[sky2->port], RB_CTRL), RB_ENA_OP_MD);
1673
1674
	err = sky2_rx_start(sky2);
1675
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
1676
1677
	if (err)
1678
		dev_close(dev);
1679
	else {
1680
		gma_write16(hw, sky2->port, GM_GP_CTRL, ctl);
1681
1682
		netif_poll_enable(hw->dev[0]);
1683
		netif_wake_queue(dev);
1684
	}
1685
1686
	return err;
1687
}
1688
1689
/*
1690
 * Receive one packet.
1691
 * For small packets or errors, just reuse existing skb.
1692
 * For larger packets, get new buffer.
1693
 */
1694
static struct sk_buff *sky2_receive(struct sky2_port *sky2,
1695
				    u16 length, u32 status)
1696
{
1697
	struct ring_info *re = sky2->rx_ring + sky2->rx_next;
1698
	struct sk_buff *skb = NULL;
1699
1700
	if (unlikely(netif_msg_rx_status(sky2)))
1701
		printk(KERN_DEBUG PFX "%s: rx slot %u status 0x%x len %d\n",
1702
		       sky2->netdev->name, sky2->rx_next, status, length);
1703
1704
	sky2->rx_next = (sky2->rx_next + 1) % sky2->rx_pending;
1705
	prefetch(sky2->rx_ring + sky2->rx_next);
1706
1707
	if (status & GMR_FS_ANY_ERR)
1708
		goto error;
1709
1710
	if (!(status & GMR_FS_RX_OK))
1711
		goto resubmit;
1712
1713
	if ((status >> 16) != length || length > sky2->rx_bufsize)
1714
		goto oversize;
1715
1716
	if (length < copybreak) {
1717
		skb = alloc_skb(length + 2, GFP_ATOMIC);
1718
		if (!skb)
1719
			goto resubmit;
1720
1721
		skb_reserve(skb, 2);
1722
		pci_dma_sync_single_for_cpu(sky2->hw->pdev, re->mapaddr,
1723
					    length, PCI_DMA_FROMDEVICE);
1724
		memcpy(skb->data, re->skb->data, length);
1725
		skb->ip_summed = re->skb->ip_summed;
1726
		skb->csum = re->skb->csum;
1727
		pci_dma_sync_single_for_device(sky2->hw->pdev, re->mapaddr,
1728
					       length, PCI_DMA_FROMDEVICE);
1729
	} else {
1730
		struct sk_buff *nskb;
1731
1732
		nskb = sky2_alloc_skb(sky2->rx_bufsize, GFP_ATOMIC);
1733
		if (!nskb)
1734
			goto resubmit;
1735
1736
		skb = re->skb;
1737
		re->skb = nskb;
1738
		pci_unmap_single(sky2->hw->pdev, re->mapaddr,
1739
				 sky2->rx_bufsize, PCI_DMA_FROMDEVICE);
1740
		prefetch(skb->data);
1741
1742
		re->mapaddr = pci_map_single(sky2->hw->pdev, nskb->data,
1743
					     sky2->rx_bufsize, PCI_DMA_FROMDEVICE);
1744
	}
1745
1746
	skb_put(skb, length);
1747
resubmit:
1748
	re->skb->ip_summed = CHECKSUM_NONE;
1749
	sky2_rx_add(sky2, re->mapaddr);
1750
1751
	/* Tell receiver about new buffers. */
1752
	sky2_put_idx(sky2->hw, rxqaddr[sky2->port], sky2->rx_put,
1753
		     &sky2->rx_last_put, RX_LE_SIZE);
1754
1755
	return skb;
1756
1757
oversize:
1758
	++sky2->net_stats.rx_over_errors;
1759
	goto resubmit;
1760
1761
error:
1762
	++sky2->net_stats.rx_errors;
1763
1764
	if (netif_msg_rx_err(sky2))
1765
		printk(KERN_INFO PFX "%s: rx error, status 0x%x length %d\n",
1766
		       sky2->netdev->name, status, length);
1767
1768
	if (status & (GMR_FS_LONG_ERR | GMR_FS_UN_SIZE))
1769
		sky2->net_stats.rx_length_errors++;
1770
	if (status & GMR_FS_FRAGMENT)
1771
		sky2->net_stats.rx_frame_errors++;
1772
	if (status & GMR_FS_CRC_ERR)
1773
		sky2->net_stats.rx_crc_errors++;
1774
	if (status & GMR_FS_RX_FF_OV)
1775
		sky2->net_stats.rx_fifo_errors++;
1776
1777
	goto resubmit;
1778
}
1779
1780
/*
1781
 * Check for transmit complete
1782
 */
1783
#define TX_NO_STATUS	0xffff
1784
1785
static inline void sky2_tx_check(struct sky2_hw *hw, int port, u16 last)
1786
{
1787
	if (last != TX_NO_STATUS) {
1788
		struct net_device *dev = hw->dev[port];
1789
		if (dev && netif_running(dev)) {
1790
			struct sky2_port *sky2 = netdev_priv(dev);
1791
			sky2_tx_complete(sky2, last);
1792
		}
1793
	}
1794
}
1795
1796
/*
1797
 * Both ports share the same status interrupt, therefore there is only
1798
 * one poll routine.
1799
 */
1800
static int sky2_poll(struct net_device *dev0, int *budget)
1801
{
1802
	struct sky2_hw *hw = ((struct sky2_port *) netdev_priv(dev0))->hw;
1803
	unsigned int to_do = min(dev0->quota, *budget);
1804
	unsigned int work_done = 0;
1805
	u16 hwidx;
1806
	u16 tx_done[2] = { TX_NO_STATUS, TX_NO_STATUS };
1807
1808
	hwidx = sky2_read16(hw, STAT_PUT_IDX);
1809
	BUG_ON(hwidx >= STATUS_RING_SIZE);
1810
	rmb();
1811
1812
	while (hwidx != hw->st_idx) {
1813
		struct sky2_status_le *le  = hw->st_le + hw->st_idx;
1814
		struct net_device *dev;
1815
		struct sky2_port *sky2;
1816
		struct sk_buff *skb;
1817
		u32 status;
1818
		u16 length;
1819
		u8 op;
1820
1821
		le = hw->st_le + hw->st_idx;
1822
		hw->st_idx = (hw->st_idx + 1) % STATUS_RING_SIZE;
1823
		prefetch(hw->st_le + hw->st_idx);
1824
1825
		BUG_ON(le->link >= 2);
1826
		dev = hw->dev[le->link];
1827
		if (dev == NULL || !netif_running(dev))
1828
			continue;
1829
1830
		sky2 = netdev_priv(dev);
1831
		status = le32_to_cpu(le->status);
1832
		length = le16_to_cpu(le->length);
1833
		op = le->opcode & ~HW_OWNER;
1834
		le->opcode = 0;
1835
1836
		switch (op) {
1837
		case OP_RXSTAT:
1838
			skb = sky2_receive(sky2, length, status);
1839
			if (!skb)
1840
				break;
1841
1842
			skb->dev = dev;
1843
			skb->protocol = eth_type_trans(skb, dev);
1844
			dev->last_rx = jiffies;
1845
1846
#ifdef SKY2_VLAN_TAG_USED
1847
			if (sky2->vlgrp && (status & GMR_FS_VLAN)) {
1848
				vlan_hwaccel_receive_skb(skb,
1849
							 sky2->vlgrp,
1850
							 be16_to_cpu(sky2->rx_tag));
1851
			} else
1852
#endif
1853
				netif_receive_skb(skb);
1854
1855
			if (++work_done >= to_do)
1856
				goto exit_loop;
1857
			break;
1858
1859
#ifdef SKY2_VLAN_TAG_USED
1860
		case OP_RXVLAN:
1861
			sky2->rx_tag = length;
1862
			break;
1863
1864
		case OP_RXCHKSVLAN:
1865
			sky2->rx_tag = length;
1866
			/* fall through */
1867
#endif
1868
		case OP_RXCHKS:
1869
			skb = sky2->rx_ring[sky2->rx_next].skb;
1870
			skb->ip_summed = CHECKSUM_HW;
1871
			skb->csum = le16_to_cpu(status);
1872
			break;
1873
1874
		case OP_TXINDEXLE:
1875
			/* TX index reports status for both ports */
1876
			tx_done[0] = status & 0xffff;
1877
			tx_done[1] = ((status >> 24) & 0xff)
1878
				| (u16)(length & 0xf) << 8;
1879
			break;
1880
1881
		default:
1882
			if (net_ratelimit())
1883
				printk(KERN_WARNING PFX
1884
				       "unknown status opcode 0x%x\n", op);
1885
			break;
1886
		}
1887
	}
1888
1889
exit_loop:
1890
	sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ);
1891
	mmiowb();
1892
1893
	sky2_tx_check(hw, 0, tx_done[0]);
1894
	sky2_tx_check(hw, 1, tx_done[1]);
1895
1896
	if (sky2_read16(hw, STAT_PUT_IDX) == hw->st_idx) {
1897
		/* need to restart TX timer */
1898
		if (is_ec_a1(hw)) {
1899
			sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP);
1900
			sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
1901
		}
1902
1903
		netif_rx_complete(dev0);
1904
		hw->intr_mask |= Y2_IS_STAT_BMU;
1905
		sky2_write32(hw, B0_IMSK, hw->intr_mask);
1906
		mmiowb();
1907
		return 0;
1908
	} else {
1909
		*budget -= work_done;
1910
		dev0->quota -= work_done;
1911
		return 1;
1912
	}
1913
}
1914
1915
static void sky2_hw_error(struct sky2_hw *hw, unsigned port, u32 status)
1916
{
1917
	struct net_device *dev = hw->dev[port];
1918
1919
	printk(KERN_INFO PFX "%s: hw error interrupt status 0x%x\n",
1920
	       dev->name, status);
1921
1922
	if (status & Y2_IS_PAR_RD1) {
1923
		printk(KERN_ERR PFX "%s: ram data read parity error\n",
1924
		       dev->name);
1925
		/* Clear IRQ */
1926
		sky2_write16(hw, RAM_BUFFER(port, B3_RI_CTRL), RI_CLR_RD_PERR);
1927
	}
1928
1929
	if (status & Y2_IS_PAR_WR1) {
1930
		printk(KERN_ERR PFX "%s: ram data write parity error\n",
1931
		       dev->name);
1932
1933
		sky2_write16(hw, RAM_BUFFER(port, B3_RI_CTRL), RI_CLR_WR_PERR);
1934
	}
1935
1936
	if (status & Y2_IS_PAR_MAC1) {
1937
		printk(KERN_ERR PFX "%s: MAC parity error\n", dev->name);
1938
		sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_PE);
1939
	}
1940
1941
	if (status & Y2_IS_PAR_RX1) {
1942
		printk(KERN_ERR PFX "%s: RX parity error\n", dev->name);
1943
		sky2_write32(hw, Q_ADDR(rxqaddr[port], Q_CSR), BMU_CLR_IRQ_PAR);
1944
	}
1945
1946
	if (status & Y2_IS_TCP_TXA1) {
1947
		printk(KERN_ERR PFX "%s: TCP segmentation error\n", dev->name);
1948
		sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR), BMU_CLR_IRQ_TCP);
1949
	}
1950
}
1951
1952
static void sky2_hw_intr(struct sky2_hw *hw)
1953
{
1954
	u32 status = sky2_read32(hw, B0_HWE_ISRC);
1955
1956
	if (status & Y2_IS_TIST_OV)
1957
		sky2_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
1958
1959
	if (status & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) {
1960
		u16 pci_err;
1961
1962
		pci_read_config_word(hw->pdev, PCI_STATUS, &pci_err);
1963
		printk(KERN_ERR PFX "%s: pci hw error (0x%x)\n",
1964
		       pci_name(hw->pdev), pci_err);
1965
1966
		sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
1967
		pci_write_config_word(hw->pdev, PCI_STATUS,
1968
				      pci_err | PCI_STATUS_ERROR_BITS);
1969
		sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
1970
	}
1971
1972
	if (status & Y2_IS_PCI_EXP) {
1973
		/* PCI-Express uncorrectable Error occurred */
1974
		u32 pex_err;
1975
1976
		pci_read_config_dword(hw->pdev, PEX_UNC_ERR_STAT, &pex_err);
1977
1978
		printk(KERN_ERR PFX "%s: pci express error (0x%x)\n",
1979
		       pci_name(hw->pdev), pex_err);
1980
1981
		/* clear the interrupt */
1982
		sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
1983
		pci_write_config_dword(hw->pdev, PEX_UNC_ERR_STAT,
1984
				       0xffffffffUL);
1985
		sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
1986
1987
		if (pex_err & PEX_FATAL_ERRORS) {
1988
			u32 hwmsk = sky2_read32(hw, B0_HWE_IMSK);
1989
			hwmsk &= ~Y2_IS_PCI_EXP;
1990
			sky2_write32(hw, B0_HWE_IMSK, hwmsk);
1991
		}
1992
	}
1993
1994
	if (status & Y2_HWE_L1_MASK)
1995
		sky2_hw_error(hw, 0, status);
1996
	status >>= 8;
1997
	if (status & Y2_HWE_L1_MASK)
1998
		sky2_hw_error(hw, 1, status);
1999
}
2000
2001
static void sky2_mac_intr(struct sky2_hw *hw, unsigned port)
2002
{
2003
	struct net_device *dev = hw->dev[port];
2004
	struct sky2_port *sky2 = netdev_priv(dev);
2005
	u8 status = sky2_read8(hw, SK_REG(port, GMAC_IRQ_SRC));
2006
2007
	if (netif_msg_intr(sky2))
2008
		printk(KERN_INFO PFX "%s: mac interrupt status 0x%x\n",
2009
		       dev->name, status);
2010
2011
	if (status & GM_IS_RX_FF_OR) {
2012
		++sky2->net_stats.rx_fifo_errors;
2013
		sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_CLI_RX_FO);
2014
	}
2015
2016
	if (status & GM_IS_TX_FF_UR) {
2017
		++sky2->net_stats.tx_fifo_errors;
2018
		sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_FU);
2019
	}
2020
}
2021
2022
static void sky2_phy_intr(struct sky2_hw *hw, unsigned port)
2023
{
2024
	struct net_device *dev = hw->dev[port];
2025
	struct sky2_port *sky2 = netdev_priv(dev);
2026
2027
	hw->intr_mask &= ~(port == 0 ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2);
2028
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
2029
	schedule_work(&sky2->phy_task);
2030
}
2031
2032
static irqreturn_t sky2_intr(int irq, void *dev_id, struct pt_regs *regs)
2033
{
2034
	struct sky2_hw *hw = dev_id;
2035
	struct net_device *dev0 = hw->dev[0];
2036
	u32 status;
2037
2038
	status = sky2_read32(hw, B0_Y2_SP_ISRC2);
2039
	if (status == 0 || status == ~0)
2040
		return IRQ_NONE;
2041
2042
	if (status & Y2_IS_HW_ERR)
2043
		sky2_hw_intr(hw);
2044
2045
	/* Do NAPI for Rx and Tx status */
2046
	if (status & Y2_IS_STAT_BMU) {
2047
		hw->intr_mask &= ~Y2_IS_STAT_BMU;
2048
		sky2_write32(hw, B0_IMSK, hw->intr_mask);
2049
2050
		if (likely(__netif_rx_schedule_prep(dev0))) {
2051
			prefetch(&hw->st_le[hw->st_idx]);
2052
			__netif_rx_schedule(dev0);
2053
		}
2054
	}
2055
2056
	if (status & Y2_IS_IRQ_PHY1)
2057
		sky2_phy_intr(hw, 0);
2058
2059
	if (status & Y2_IS_IRQ_PHY2)
2060
		sky2_phy_intr(hw, 1);
2061
2062
	if (status & Y2_IS_IRQ_MAC1)
2063
		sky2_mac_intr(hw, 0);
2064
2065
	if (status & Y2_IS_IRQ_MAC2)
2066
		sky2_mac_intr(hw, 1);
2067
2068
	sky2_write32(hw, B0_Y2_SP_ICR, 2);
2069
2070
	sky2_read32(hw, B0_IMSK);
2071
2072
	return IRQ_HANDLED;
2073
}
2074
2075
#ifdef CONFIG_NET_POLL_CONTROLLER
2076
static void sky2_netpoll(struct net_device *dev)
2077
{
2078
	struct sky2_port *sky2 = netdev_priv(dev);
2079
2080
	sky2_intr(sky2->hw->pdev->irq, sky2->hw, NULL);
2081
}
2082
#endif
2083
2084
/* Chip internal frequency for clock calculations */
2085
static inline u32 sky2_mhz(const struct sky2_hw *hw)
2086
{
2087
	switch (hw->chip_id) {
2088
	case CHIP_ID_YUKON_EC:
2089
	case CHIP_ID_YUKON_EC_U:
2090
		return 125;	/* 125 Mhz */
2091
	case CHIP_ID_YUKON_FE:
2092
		return 100;	/* 100 Mhz */
2093
	default:		/* YUKON_XL */
2094
		return 156;	/* 156 Mhz */
2095
	}
2096
}
2097
2098
static inline u32 sky2_us2clk(const struct sky2_hw *hw, u32 us)
2099
{
2100
	return sky2_mhz(hw) * us;
2101
}
2102
2103
static inline u32 sky2_clk2us(const struct sky2_hw *hw, u32 clk)
2104
{
2105
	return clk / sky2_mhz(hw);
2106
}
2107
2108
2109
static int sky2_reset(struct sky2_hw *hw)
2110
{
2111
	u32 ctst;
2112
	u16 status;
2113
	u8 t8, pmd_type;
2114
	int i;
2115
2116
	ctst = sky2_read32(hw, B0_CTST);
2117
2118
	sky2_write8(hw, B0_CTST, CS_RST_CLR);
2119
	hw->chip_id = sky2_read8(hw, B2_CHIP_ID);
2120
	if (hw->chip_id < CHIP_ID_YUKON_XL || hw->chip_id > CHIP_ID_YUKON_FE) {
2121
		printk(KERN_ERR PFX "%s: unsupported chip type 0x%x\n",
2122
		       pci_name(hw->pdev), hw->chip_id);
2123
		return -EOPNOTSUPP;
2124
	}
2125
2126
	/* ring for status responses */
2127
	hw->st_le = pci_alloc_consistent(hw->pdev, STATUS_LE_BYTES,
2128
					 &hw->st_dma);
2129
	if (!hw->st_le)
2130
		return -ENOMEM;
2131
2132
	/* disable ASF */
2133
	if (hw->chip_id <= CHIP_ID_YUKON_EC) {
2134
		sky2_write8(hw, B28_Y2_ASF_STAT_CMD, Y2_ASF_RESET);
2135
		sky2_write16(hw, B0_CTST, Y2_ASF_DISABLE);
2136
	}
2137
2138
	/* do a SW reset */
2139
	sky2_write8(hw, B0_CTST, CS_RST_SET);
2140
	sky2_write8(hw, B0_CTST, CS_RST_CLR);
2141
2142
	/* clear PCI errors, if any */
2143
	pci_read_config_word(hw->pdev, PCI_STATUS, &status);
2144
	sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
2145
	pci_write_config_word(hw->pdev, PCI_STATUS,
2146
			      status | PCI_STATUS_ERROR_BITS);
2147
2148
	sky2_write8(hw, B0_CTST, CS_MRST_CLR);
2149
2150
	/* clear any PEX errors */
2151
	if (is_pciex(hw)) {
2152
		u16 lstat;
2153
		pci_write_config_dword(hw->pdev, PEX_UNC_ERR_STAT,
2154
				       0xffffffffUL);
2155
		pci_read_config_word(hw->pdev, PEX_LNK_STAT, &lstat);
2156
	}
2157
2158
	pmd_type = sky2_read8(hw, B2_PMD_TYP);
2159
	hw->copper = !(pmd_type == 'L' || pmd_type == 'S');
2160
2161
	hw->ports = 1;
2162
	t8 = sky2_read8(hw, B2_Y2_HW_RES);
2163
	if ((t8 & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) {
2164
		if (!(sky2_read8(hw, B2_Y2_CLK_GATE) & Y2_STATUS_LNK2_INAC))
2165
			++hw->ports;
2166
	}
2167
	hw->chip_rev = (sky2_read8(hw, B2_MAC_CFG) & CFG_CHIP_R_MSK) >> 4;
2168
2169
	sky2_set_power_state(hw, PCI_D0);
2170
2171
	for (i = 0; i < hw->ports; i++) {
2172
		sky2_write8(hw, SK_REG(i, GMAC_LINK_CTRL), GMLC_RST_SET);
2173
		sky2_write8(hw, SK_REG(i, GMAC_LINK_CTRL), GMLC_RST_CLR);
2174
	}
2175
2176
	sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
2177
2178
	/* Clear I2C IRQ noise */
2179
	sky2_write32(hw, B2_I2C_IRQ, 1);
2180
2181
	/* turn off hardware timer (unused) */
2182
	sky2_write8(hw, B2_TI_CTRL, TIM_STOP);
2183
	sky2_write8(hw, B2_TI_CTRL, TIM_CLR_IRQ);
2184
2185
	sky2_write8(hw, B0_Y2LED, LED_STAT_ON);
2186
2187
	/* Turn off descriptor polling */
2188
	sky2_write32(hw, B28_DPT_CTRL, DPT_STOP);
2189
2190
	/* Turn off receive timestamp */
2191
	sky2_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_STOP);
2192
	sky2_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
2193
2194
	/* enable the Tx Arbiters */
2195
	for (i = 0; i < hw->ports; i++)
2196
		sky2_write8(hw, SK_REG(i, TXA_CTRL), TXA_ENA_ARB);
2197
2198
	/* Initialize ram interface */
2199
	for (i = 0; i < hw->ports; i++) {
2200
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_CTRL), RI_RST_CLR);
2201
2202
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_R1), SK_RI_TO_53);
2203
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XA1), SK_RI_TO_53);
2204
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XS1), SK_RI_TO_53);
2205
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_R1), SK_RI_TO_53);
2206
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XA1), SK_RI_TO_53);
2207
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XS1), SK_RI_TO_53);
2208
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_R2), SK_RI_TO_53);
2209
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XA2), SK_RI_TO_53);
2210
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XS2), SK_RI_TO_53);
2211
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_R2), SK_RI_TO_53);
2212
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XA2), SK_RI_TO_53);
2213
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XS2), SK_RI_TO_53);
2214
	}
2215
2216
	sky2_write32(hw, B0_HWE_IMSK, Y2_HWE_ALL_MASK);
2217
2218
	for (i = 0; i < hw->ports; i++)
2219
		sky2_phy_reset(hw, i);
2220
2221
	memset(hw->st_le, 0, STATUS_LE_BYTES);
2222
	hw->st_idx = 0;
2223
2224
	sky2_write32(hw, STAT_CTRL, SC_STAT_RST_SET);
2225
	sky2_write32(hw, STAT_CTRL, SC_STAT_RST_CLR);
2226
2227
	sky2_write32(hw, STAT_LIST_ADDR_LO, hw->st_dma);
2228
	sky2_write32(hw, STAT_LIST_ADDR_HI, (u64) hw->st_dma >> 32);
2229
2230
	/* Set the list last index */
2231
	sky2_write16(hw, STAT_LAST_IDX, STATUS_RING_SIZE - 1);
2232
2233
	/* These status setup values are copied from SysKonnect's driver */
2234
	if (is_ec_a1(hw)) {
2235
		/* WA for dev. #4.3 */
2236
		sky2_write16(hw, STAT_TX_IDX_TH, 0xfff);	/* Tx Threshold */
2237
2238
		/* set Status-FIFO watermark */
2239
		sky2_write8(hw, STAT_FIFO_WM, 0x21);	/* WA for dev. #4.18 */
2240
2241
		/* set Status-FIFO ISR watermark */
2242
		sky2_write8(hw, STAT_FIFO_ISR_WM, 0x07);	/* WA for dev. #4.18 */
2243
		sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 10000));
2244
	} else {
2245
		sky2_write16(hw, STAT_TX_IDX_TH, 10);
2246
		sky2_write8(hw, STAT_FIFO_WM, 16);
2247
2248
		/* set Status-FIFO ISR watermark */
2249
		if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0)
2250
			sky2_write8(hw, STAT_FIFO_ISR_WM, 4);
2251
		else
2252
			sky2_write8(hw, STAT_FIFO_ISR_WM, 16);
2253
2254
		sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 1000));
2255
		sky2_write32(hw, STAT_LEV_TIMER_INI, sky2_us2clk(hw, 100));
2256
		sky2_write32(hw, STAT_ISR_TIMER_INI, sky2_us2clk(hw, 20));
2257
	}
2258
2259
	/* enable status unit */
2260
	sky2_write32(hw, STAT_CTRL, SC_STAT_OP_ON);
2261
2262
	sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
2263
	sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_START);
2264
	sky2_write8(hw, STAT_ISR_TIMER_CTRL, TIM_START);
2265
2266
	return 0;
2267
}
2268
2269
static inline u32 sky2_supported_modes(const struct sky2_hw *hw)
2270
{
2271
	u32 modes;
2272
	if (hw->copper) {
2273
		modes = SUPPORTED_10baseT_Half
2274
		    | SUPPORTED_10baseT_Full
2275
		    | SUPPORTED_100baseT_Half
2276
		    | SUPPORTED_100baseT_Full
2277
		    | SUPPORTED_Autoneg | SUPPORTED_TP;
2278
2279
		if (hw->chip_id != CHIP_ID_YUKON_FE)
2280
			modes |= SUPPORTED_1000baseT_Half
2281
			    | SUPPORTED_1000baseT_Full;
2282
	} else
2283
		modes = SUPPORTED_1000baseT_Full | SUPPORTED_FIBRE
2284
		    | SUPPORTED_Autoneg;
2285
	return modes;
2286
}
2287
2288
static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
2289
{
2290
	struct sky2_port *sky2 = netdev_priv(dev);
2291
	struct sky2_hw *hw = sky2->hw;
2292
2293
	ecmd->transceiver = XCVR_INTERNAL;
2294
	ecmd->supported = sky2_supported_modes(hw);
2295
	ecmd->phy_address = PHY_ADDR_MARV;
2296
	if (hw->copper) {
2297
		ecmd->supported = SUPPORTED_10baseT_Half
2298
		    | SUPPORTED_10baseT_Full
2299
		    | SUPPORTED_100baseT_Half
2300
		    | SUPPORTED_100baseT_Full
2301
		    | SUPPORTED_1000baseT_Half
2302
		    | SUPPORTED_1000baseT_Full
2303
		    | SUPPORTED_Autoneg | SUPPORTED_TP;
2304
		ecmd->port = PORT_TP;
2305
	} else
2306
		ecmd->port = PORT_FIBRE;
2307
2308
	ecmd->advertising = sky2->advertising;
2309
	ecmd->autoneg = sky2->autoneg;
2310
	ecmd->speed = sky2->speed;
2311
	ecmd->duplex = sky2->duplex;
2312
	return 0;
2313
}
2314
2315
static int sky2_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
2316
{
2317
	struct sky2_port *sky2 = netdev_priv(dev);
2318
	const struct sky2_hw *hw = sky2->hw;
2319
	u32 supported = sky2_supported_modes(hw);
2320
2321
	if (ecmd->autoneg == AUTONEG_ENABLE) {
2322
		ecmd->advertising = supported;
2323
		sky2->duplex = -1;
2324
		sky2->speed = -1;
2325
	} else {
2326
		u32 setting;
2327
2328
		switch (ecmd->speed) {
2329
		case SPEED_1000:
2330
			if (ecmd->duplex == DUPLEX_FULL)
2331
				setting = SUPPORTED_1000baseT_Full;
2332
			else if (ecmd->duplex == DUPLEX_HALF)
2333
				setting = SUPPORTED_1000baseT_Half;
2334
			else
2335
				return -EINVAL;
2336
			break;
2337
		case SPEED_100:
2338
			if (ecmd->duplex == DUPLEX_FULL)
2339
				setting = SUPPORTED_100baseT_Full;
2340
			else if (ecmd->duplex == DUPLEX_HALF)
2341
				setting = SUPPORTED_100baseT_Half;
2342
			else
2343
				return -EINVAL;
2344
			break;
2345
2346
		case SPEED_10:
2347
			if (ecmd->duplex == DUPLEX_FULL)
2348
				setting = SUPPORTED_10baseT_Full;
2349
			else if (ecmd->duplex == DUPLEX_HALF)
2350
				setting = SUPPORTED_10baseT_Half;
2351
			else
2352
				return -EINVAL;
2353
			break;
2354
		default:
2355
			return -EINVAL;
2356
		}
2357
2358
		if ((setting & supported) == 0)
2359
			return -EINVAL;
2360
2361
		sky2->speed = ecmd->speed;
2362
		sky2->duplex = ecmd->duplex;
2363
	}
2364
2365
	sky2->autoneg = ecmd->autoneg;
2366
	sky2->advertising = ecmd->advertising;
2367
2368
	if (netif_running(dev))
2369
		sky2_phy_reinit(sky2);
2370
2371
	return 0;
2372
}
2373
2374
static void sky2_get_drvinfo(struct net_device *dev,
2375
			     struct ethtool_drvinfo *info)
2376
{
2377
	struct sky2_port *sky2 = netdev_priv(dev);
2378
2379
	strcpy(info->driver, DRV_NAME);
2380
	strcpy(info->version, DRV_VERSION);
2381
	strcpy(info->fw_version, "N/A");
2382
	strcpy(info->bus_info, pci_name(sky2->hw->pdev));
2383
}
2384
2385
static const struct sky2_stat {
2386
	char name[ETH_GSTRING_LEN];
2387
	u16 offset;
2388
} sky2_stats[] = {
2389
	{ "tx_bytes",	   GM_TXO_OK_HI },
2390
	{ "rx_bytes",	   GM_RXO_OK_HI },
2391
	{ "tx_broadcast",  GM_TXF_BC_OK },
2392
	{ "rx_broadcast",  GM_RXF_BC_OK },
2393
	{ "tx_multicast",  GM_TXF_MC_OK },
2394
	{ "rx_multicast",  GM_RXF_MC_OK },
2395
	{ "tx_unicast",    GM_TXF_UC_OK },
2396
	{ "rx_unicast",    GM_RXF_UC_OK },
2397
	{ "tx_mac_pause",  GM_TXF_MPAUSE },
2398
	{ "rx_mac_pause",  GM_RXF_MPAUSE },
2399
	{ "collisions",    GM_TXF_SNG_COL },
2400
	{ "late_collision",GM_TXF_LAT_COL },
2401
	{ "aborted", 	   GM_TXF_ABO_COL },
2402
	{ "multi_collisions", GM_TXF_MUL_COL },
2403
	{ "fifo_underrun", GM_TXE_FIFO_UR },
2404
	{ "fifo_overflow", GM_RXE_FIFO_OV },
2405
	{ "rx_toolong",    GM_RXF_LNG_ERR },
2406
	{ "rx_jabber",     GM_RXF_JAB_PKT },
2407
	{ "rx_runt", 	   GM_RXE_FRAG },
2408
	{ "rx_too_long",   GM_RXF_LNG_ERR },
2409
	{ "rx_fcs_error",   GM_RXF_FCS_ERR },
2410
};
2411
2412
static u32 sky2_get_rx_csum(struct net_device *dev)
2413
{
2414
	struct sky2_port *sky2 = netdev_priv(dev);
2415
2416
	return sky2->rx_csum;
2417
}
2418
2419
static int sky2_set_rx_csum(struct net_device *dev, u32 data)
2420
{
2421
	struct sky2_port *sky2 = netdev_priv(dev);
2422
2423
	sky2->rx_csum = data;
2424
2425
	sky2_write32(sky2->hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR),
2426
		     data ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
2427
2428
	return 0;
2429
}
2430
2431
static u32 sky2_get_msglevel(struct net_device *netdev)
2432
{
2433
	struct sky2_port *sky2 = netdev_priv(netdev);
2434
	return sky2->msg_enable;
2435
}
2436
2437
static int sky2_nway_reset(struct net_device *dev)
2438
{
2439
	struct sky2_port *sky2 = netdev_priv(dev);
2440
2441
	if (sky2->autoneg != AUTONEG_ENABLE)
2442
		return -EINVAL;
2443
2444
	sky2_phy_reinit(sky2);
2445
2446
	return 0;
2447
}
2448
2449
static void sky2_phy_stats(struct sky2_port *sky2, u64 * data, unsigned count)
2450
{
2451
	struct sky2_hw *hw = sky2->hw;
2452
	unsigned port = sky2->port;
2453
	int i;
2454
2455
	data[0] = (u64) gma_read32(hw, port, GM_TXO_OK_HI) << 32
2456
	    | (u64) gma_read32(hw, port, GM_TXO_OK_LO);
2457
	data[1] = (u64) gma_read32(hw, port, GM_RXO_OK_HI) << 32
2458
	    | (u64) gma_read32(hw, port, GM_RXO_OK_LO);
2459
2460
	for (i = 2; i < count; i++)
2461
		data[i] = (u64) gma_read32(hw, port, sky2_stats[i].offset);
2462
}
2463
2464
static void sky2_set_msglevel(struct net_device *netdev, u32 value)
2465
{
2466
	struct sky2_port *sky2 = netdev_priv(netdev);
2467
	sky2->msg_enable = value;
2468
}
2469
2470
static int sky2_get_stats_count(struct net_device *dev)
2471
{
2472
	return ARRAY_SIZE(sky2_stats);
2473
}
2474
2475
static void sky2_get_ethtool_stats(struct net_device *dev,
2476
				   struct ethtool_stats *stats, u64 * data)
2477
{
2478
	struct sky2_port *sky2 = netdev_priv(dev);
2479
2480
	sky2_phy_stats(sky2, data, ARRAY_SIZE(sky2_stats));
2481
}
2482
2483
static void sky2_get_strings(struct net_device *dev, u32 stringset, u8 * data)
2484
{
2485
	int i;
2486
2487
	switch (stringset) {
2488
	case ETH_SS_STATS:
2489
		for (i = 0; i < ARRAY_SIZE(sky2_stats); i++)
2490
			memcpy(data + i * ETH_GSTRING_LEN,
2491
			       sky2_stats[i].name, ETH_GSTRING_LEN);
2492
		break;
2493
	}
2494
}
2495
2496
/* Use hardware MIB variables for critical path statistics and
2497
 * transmit feedback not reported at interrupt.
2498
 * Other errors are accounted for in interrupt handler.
2499
 */
2500
static struct net_device_stats *sky2_get_stats(struct net_device *dev)
2501
{
2502
	struct sky2_port *sky2 = netdev_priv(dev);
2503
	u64 data[13];
2504
2505
	sky2_phy_stats(sky2, data, ARRAY_SIZE(data));
2506
2507
	sky2->net_stats.tx_bytes = data[0];
2508
	sky2->net_stats.rx_bytes = data[1];
2509
	sky2->net_stats.tx_packets = data[2] + data[4] + data[6];
2510
	sky2->net_stats.rx_packets = data[3] + data[5] + data[7];
2511
	sky2->net_stats.multicast = data[5] + data[7];
2512
	sky2->net_stats.collisions = data[10];
2513
	sky2->net_stats.tx_aborted_errors = data[12];
2514
2515
	return &sky2->net_stats;
2516
}
2517
2518
static int sky2_set_mac_address(struct net_device *dev, void *p)
2519
{
2520
	struct sky2_port *sky2 = netdev_priv(dev);
2521
	struct sockaddr *addr = p;
2522
2523
	if (!is_valid_ether_addr(addr->sa_data))
2524
		return -EADDRNOTAVAIL;
2525
2526
	memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
2527
	memcpy_toio(sky2->hw->regs + B2_MAC_1 + sky2->port * 8,
2528
		    dev->dev_addr, ETH_ALEN);
2529
	memcpy_toio(sky2->hw->regs + B2_MAC_2 + sky2->port * 8,
2530
		    dev->dev_addr, ETH_ALEN);
2531
2532
	if (netif_running(dev))
2533
		sky2_phy_reinit(sky2);
2534
2535
	return 0;
2536
}
2537
2538
static void sky2_set_multicast(struct net_device *dev)
2539
{
2540
	struct sky2_port *sky2 = netdev_priv(dev);
2541
	struct sky2_hw *hw = sky2->hw;
2542
	unsigned port = sky2->port;
2543
	struct dev_mc_list *list = dev->mc_list;
2544
	u16 reg;
2545
	u8 filter[8];
2546
2547
	memset(filter, 0, sizeof(filter));
2548
2549
	reg = gma_read16(hw, port, GM_RX_CTRL);
2550
	reg |= GM_RXCR_UCF_ENA;
2551
2552
	if (dev->flags & IFF_PROMISC)	/* promiscuous */
2553
		reg &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
2554
	else if ((dev->flags & IFF_ALLMULTI) || dev->mc_count > 16)	/* all multicast */
2555
		memset(filter, 0xff, sizeof(filter));
2556
	else if (dev->mc_count == 0)	/* no multicast */
2557
		reg &= ~GM_RXCR_MCF_ENA;
2558
	else {
2559
		int i;
2560
		reg |= GM_RXCR_MCF_ENA;
2561
2562
		for (i = 0; list && i < dev->mc_count; i++, list = list->next) {
2563
			u32 bit = ether_crc(ETH_ALEN, list->dmi_addr) & 0x3f;
2564
			filter[bit / 8] |= 1 << (bit % 8);
2565
		}
2566
	}
2567
2568
	gma_write16(hw, port, GM_MC_ADDR_H1,
2569
		    (u16) filter[0] | ((u16) filter[1] << 8));
2570
	gma_write16(hw, port, GM_MC_ADDR_H2,
2571
		    (u16) filter[2] | ((u16) filter[3] << 8));
2572
	gma_write16(hw, port, GM_MC_ADDR_H3,
2573
		    (u16) filter[4] | ((u16) filter[5] << 8));
2574
	gma_write16(hw, port, GM_MC_ADDR_H4,
2575
		    (u16) filter[6] | ((u16) filter[7] << 8));
2576
2577
	gma_write16(hw, port, GM_RX_CTRL, reg);
2578
}
2579
2580
/* Can have one global because blinking is controlled by
2581
 * ethtool and that is always under RTNL mutex
2582
 */
2583
static void sky2_led(struct sky2_hw *hw, unsigned port, int on)
2584
{
2585
	u16 pg;
2586
2587
	switch (hw->chip_id) {
2588
	case CHIP_ID_YUKON_XL:
2589
		pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
2590
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
2591
		gm_phy_write(hw, port, PHY_MARV_PHY_CTRL,
2592
			     on ? (PHY_M_LEDC_LOS_CTRL(1) |
2593
				   PHY_M_LEDC_INIT_CTRL(7) |
2594
				   PHY_M_LEDC_STA1_CTRL(7) |
2595
				   PHY_M_LEDC_STA0_CTRL(7))
2596
			     : 0);
2597
2598
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
2599
		break;
2600
2601
	default:
2602
		gm_phy_write(hw, port, PHY_MARV_LED_CTRL, 0);
2603
		gm_phy_write(hw, port, PHY_MARV_LED_OVER,
2604
			     on ? PHY_M_LED_MO_DUP(MO_LED_ON) |
2605
			     PHY_M_LED_MO_10(MO_LED_ON) |
2606
			     PHY_M_LED_MO_100(MO_LED_ON) |
2607
			     PHY_M_LED_MO_1000(MO_LED_ON) |
2608
			     PHY_M_LED_MO_RX(MO_LED_ON)
2609
			     : PHY_M_LED_MO_DUP(MO_LED_OFF) |
2610
			     PHY_M_LED_MO_10(MO_LED_OFF) |
2611
			     PHY_M_LED_MO_100(MO_LED_OFF) |
2612
			     PHY_M_LED_MO_1000(MO_LED_OFF) |
2613
			     PHY_M_LED_MO_RX(MO_LED_OFF));
2614
2615
	}
2616
}
2617
2618
/* blink LED's for finding board */
2619
static int sky2_phys_id(struct net_device *dev, u32 data)
2620
{
2621
	struct sky2_port *sky2 = netdev_priv(dev);
2622
	struct sky2_hw *hw = sky2->hw;
2623
	unsigned port = sky2->port;
2624
	u16 ledctrl, ledover = 0;
2625
	long ms;
2626
	int interrupted;
2627
	int onoff = 1;
2628
2629
	if (!data || data > (u32) (MAX_SCHEDULE_TIMEOUT / HZ))
2630
		ms = jiffies_to_msecs(MAX_SCHEDULE_TIMEOUT);
2631
	else
2632
		ms = data * 1000;
2633
2634
	/* save initial values */
2635
	down(&sky2->phy_sema);
2636
	if (hw->chip_id == CHIP_ID_YUKON_XL) {
2637
		u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
2638
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
2639
		ledctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
2640
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
2641
	} else {
2642
		ledctrl = gm_phy_read(hw, port, PHY_MARV_LED_CTRL);
2643
		ledover = gm_phy_read(hw, port, PHY_MARV_LED_OVER);
2644
	}
2645
2646
	interrupted = 0;
2647
	while (!interrupted && ms > 0) {
2648
		sky2_led(hw, port, onoff);
2649
		onoff = !onoff;
2650
2651
		up(&sky2->phy_sema);
2652
		interrupted = msleep_interruptible(250);
2653
		down(&sky2->phy_sema);
2654
2655
		ms -= 250;
2656
	}
2657
2658
	/* resume regularly scheduled programming */
2659
	if (hw->chip_id == CHIP_ID_YUKON_XL) {
2660
		u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
2661
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
2662
		gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ledctrl);
2663
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
2664
	} else {
2665
		gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl);
2666
		gm_phy_write(hw, port, PHY_MARV_LED_OVER, ledover);
2667
	}
2668
	up(&sky2->phy_sema);
2669
2670
	return 0;
2671
}
2672
2673
static void sky2_get_pauseparam(struct net_device *dev,
2674
				struct ethtool_pauseparam *ecmd)
2675
{
2676
	struct sky2_port *sky2 = netdev_priv(dev);
2677
2678
	ecmd->tx_pause = sky2->tx_pause;
2679
	ecmd->rx_pause = sky2->rx_pause;
2680
	ecmd->autoneg = sky2->autoneg;
2681
}
2682
2683
static int sky2_set_pauseparam(struct net_device *dev,
2684
			       struct ethtool_pauseparam *ecmd)
2685
{
2686
	struct sky2_port *sky2 = netdev_priv(dev);
2687
	int err = 0;
2688
2689
	sky2->autoneg = ecmd->autoneg;
2690
	sky2->tx_pause = ecmd->tx_pause != 0;
2691
	sky2->rx_pause = ecmd->rx_pause != 0;
2692
2693
	sky2_phy_reinit(sky2);
2694
2695
	return err;
2696
}
2697
2698
#ifdef CONFIG_PM
2699
static void sky2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
2700
{
2701
	struct sky2_port *sky2 = netdev_priv(dev);
2702
2703
	wol->supported = WAKE_MAGIC;
2704
	wol->wolopts = sky2->wol ? WAKE_MAGIC : 0;
2705
}
2706
2707
static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
2708
{
2709
	struct sky2_port *sky2 = netdev_priv(dev);
2710
	struct sky2_hw *hw = sky2->hw;
2711
2712
	if (wol->wolopts != WAKE_MAGIC && wol->wolopts != 0)
2713
		return -EOPNOTSUPP;
2714
2715
	sky2->wol = wol->wolopts == WAKE_MAGIC;
2716
2717
	if (sky2->wol) {
2718
		memcpy_toio(hw->regs + WOL_MAC_ADDR, dev->dev_addr, ETH_ALEN);
2719
2720
		sky2_write16(hw, WOL_CTRL_STAT,
2721
			     WOL_CTL_ENA_PME_ON_MAGIC_PKT |
2722
			     WOL_CTL_ENA_MAGIC_PKT_UNIT);
2723
	} else
2724
		sky2_write16(hw, WOL_CTRL_STAT, WOL_CTL_DEFAULT);
2725
2726
	return 0;
2727
}
2728
#endif
2729
2730
static int sky2_get_coalesce(struct net_device *dev,
2731
			     struct ethtool_coalesce *ecmd)
2732
{
2733
	struct sky2_port *sky2 = netdev_priv(dev);
2734
	struct sky2_hw *hw = sky2->hw;
2735
2736
	if (sky2_read8(hw, STAT_TX_TIMER_CTRL) == TIM_STOP)
2737
		ecmd->tx_coalesce_usecs = 0;
2738
	else {
2739
		u32 clks = sky2_read32(hw, STAT_TX_TIMER_INI);
2740
		ecmd->tx_coalesce_usecs = sky2_clk2us(hw, clks);
2741
	}
2742
	ecmd->tx_max_coalesced_frames = sky2_read16(hw, STAT_TX_IDX_TH);
2743
2744
	if (sky2_read8(hw, STAT_LEV_TIMER_CTRL) == TIM_STOP)
2745
		ecmd->rx_coalesce_usecs = 0;
2746
	else {
2747
		u32 clks = sky2_read32(hw, STAT_LEV_TIMER_INI);
2748
		ecmd->rx_coalesce_usecs = sky2_clk2us(hw, clks);
2749
	}
2750
	ecmd->rx_max_coalesced_frames = sky2_read8(hw, STAT_FIFO_WM);
2751
2752
	if (sky2_read8(hw, STAT_ISR_TIMER_CTRL) == TIM_STOP)
2753
		ecmd->rx_coalesce_usecs_irq = 0;
2754
	else {
2755
		u32 clks = sky2_read32(hw, STAT_ISR_TIMER_INI);
2756
		ecmd->rx_coalesce_usecs_irq = sky2_clk2us(hw, clks);
2757
	}
2758
2759
	ecmd->rx_max_coalesced_frames_irq = sky2_read8(hw, STAT_FIFO_ISR_WM);
2760
2761
	return 0;
2762
}
2763
2764
/* Note: this affect both ports */
2765
static int sky2_set_coalesce(struct net_device *dev,
2766
			     struct ethtool_coalesce *ecmd)
2767
{
2768
	struct sky2_port *sky2 = netdev_priv(dev);
2769
	struct sky2_hw *hw = sky2->hw;
2770
	const u32 tmin = sky2_clk2us(hw, 1);
2771
	const u32 tmax = 5000;
2772
2773
	if (ecmd->tx_coalesce_usecs != 0 &&
2774
	    (ecmd->tx_coalesce_usecs < tmin || ecmd->tx_coalesce_usecs > tmax))
2775
		return -EINVAL;
2776
2777
	if (ecmd->rx_coalesce_usecs != 0 &&
2778
	    (ecmd->rx_coalesce_usecs < tmin || ecmd->rx_coalesce_usecs > tmax))
2779
		return -EINVAL;
2780
2781
	if (ecmd->rx_coalesce_usecs_irq != 0 &&
2782
	    (ecmd->rx_coalesce_usecs_irq < tmin || ecmd->rx_coalesce_usecs_irq > tmax))
2783
		return -EINVAL;
2784
2785
	if (ecmd->tx_max_coalesced_frames > 0xffff)
2786
		return -EINVAL;
2787
	if (ecmd->rx_max_coalesced_frames > 0xff)
2788
		return -EINVAL;
2789
	if (ecmd->rx_max_coalesced_frames_irq > 0xff)
2790
		return -EINVAL;
2791
2792
	if (ecmd->tx_coalesce_usecs == 0)
2793
		sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP);
2794
	else {
2795
		sky2_write32(hw, STAT_TX_TIMER_INI,
2796
			     sky2_us2clk(hw, ecmd->tx_coalesce_usecs));
2797
		sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
2798
	}
2799
	sky2_write16(hw, STAT_TX_IDX_TH, ecmd->tx_max_coalesced_frames);
2800
2801
	if (ecmd->rx_coalesce_usecs == 0)
2802
		sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_STOP);
2803
	else {
2804
		sky2_write32(hw, STAT_LEV_TIMER_INI,
2805
			     sky2_us2clk(hw, ecmd->rx_coalesce_usecs));
2806
		sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_START);
2807
	}
2808
	sky2_write8(hw, STAT_FIFO_WM, ecmd->rx_max_coalesced_frames);
2809
2810
	if (ecmd->rx_coalesce_usecs_irq == 0)
2811
		sky2_write8(hw, STAT_ISR_TIMER_CTRL, TIM_STOP);
2812
	else {
2813
		sky2_write32(hw, STAT_TX_TIMER_INI,
2814
			     sky2_us2clk(hw, ecmd->rx_coalesce_usecs_irq));
2815
		sky2_write8(hw, STAT_ISR_TIMER_CTRL, TIM_START);
2816
	}
2817
	sky2_write8(hw, STAT_FIFO_ISR_WM, ecmd->rx_max_coalesced_frames_irq);
2818
	return 0;
2819
}
2820
2821
static void sky2_get_ringparam(struct net_device *dev,
2822
			       struct ethtool_ringparam *ering)
2823
{
2824
	struct sky2_port *sky2 = netdev_priv(dev);
2825
2826
	ering->rx_max_pending = RX_MAX_PENDING;
2827
	ering->rx_mini_max_pending = 0;
2828
	ering->rx_jumbo_max_pending = 0;
2829
	ering->tx_max_pending = TX_RING_SIZE - 1;
2830
2831
	ering->rx_pending = sky2->rx_pending;
2832
	ering->rx_mini_pending = 0;
2833
	ering->rx_jumbo_pending = 0;
2834
	ering->tx_pending = sky2->tx_pending;
2835
}
2836
2837
static int sky2_set_ringparam(struct net_device *dev,
2838
			      struct ethtool_ringparam *ering)
2839
{
2840
	struct sky2_port *sky2 = netdev_priv(dev);
2841
	int err = 0;
2842
2843
	if (ering->rx_pending > RX_MAX_PENDING ||
2844
	    ering->rx_pending < 8 ||
2845
	    ering->tx_pending < MAX_SKB_TX_LE ||
2846
	    ering->tx_pending > TX_RING_SIZE - 1)
2847
		return -EINVAL;
2848
2849
	if (netif_running(dev))
2850
		sky2_down(dev);
2851
2852
	sky2->rx_pending = ering->rx_pending;
2853
	sky2->tx_pending = ering->tx_pending;
2854
2855
	if (netif_running(dev)) {
2856
		err = sky2_up(dev);
2857
		if (err)
2858
			dev_close(dev);
2859
		else
2860
			sky2_set_multicast(dev);
2861
	}
2862
2863
	return err;
2864
}
2865
2866
static int sky2_get_regs_len(struct net_device *dev)
2867
{
2868
	return 0x4000;
2869
}
2870
2871
/*
2872
 * Returns copy of control register region
2873
 * Note: access to the RAM address register set will cause timeouts.
2874
 */
2875
static void sky2_get_regs(struct net_device *dev, struct ethtool_regs *regs,
2876
			  void *p)
2877
{
2878
	const struct sky2_port *sky2 = netdev_priv(dev);
2879
	const void __iomem *io = sky2->hw->regs;
2880
2881
	BUG_ON(regs->len < B3_RI_WTO_R1);
2882
	regs->version = 1;
2883
	memset(p, 0, regs->len);
2884
2885
	memcpy_fromio(p, io, B3_RAM_ADDR);
2886
2887
	memcpy_fromio(p + B3_RI_WTO_R1,
2888
		      io + B3_RI_WTO_R1,
2889
		      regs->len - B3_RI_WTO_R1);
2890
}
2891
2892
static struct ethtool_ops sky2_ethtool_ops = {
2893
	.get_settings = sky2_get_settings,
2894
	.set_settings = sky2_set_settings,
2895
	.get_drvinfo = sky2_get_drvinfo,
2896
	.get_msglevel = sky2_get_msglevel,
2897
	.set_msglevel = sky2_set_msglevel,
2898
	.nway_reset   = sky2_nway_reset,
2899
	.get_regs_len = sky2_get_regs_len,
2900
	.get_regs = sky2_get_regs,
2901
	.get_link = ethtool_op_get_link,
2902
	.get_sg = ethtool_op_get_sg,
2903
	.set_sg = ethtool_op_set_sg,
2904
	.get_tx_csum = ethtool_op_get_tx_csum,
2905
	.set_tx_csum = ethtool_op_set_tx_csum,
2906
	.get_tso = ethtool_op_get_tso,
2907
	.set_tso = ethtool_op_set_tso,
2908
	.get_rx_csum = sky2_get_rx_csum,
2909
	.set_rx_csum = sky2_set_rx_csum,
2910
	.get_strings = sky2_get_strings,
2911
	.get_coalesce = sky2_get_coalesce,
2912
	.set_coalesce = sky2_set_coalesce,
2913
	.get_ringparam = sky2_get_ringparam,
2914
	.set_ringparam = sky2_set_ringparam,
2915
	.get_pauseparam = sky2_get_pauseparam,
2916
	.set_pauseparam = sky2_set_pauseparam,
2917
#ifdef CONFIG_PM
2918
	.get_wol = sky2_get_wol,
2919
	.set_wol = sky2_set_wol,
2920
#endif
2921
	.phys_id = sky2_phys_id,
2922
	.get_stats_count = sky2_get_stats_count,
2923
	.get_ethtool_stats = sky2_get_ethtool_stats,
2924
	.get_perm_addr	= ethtool_op_get_perm_addr,
2925
};
2926
2927
/* Initialize network device */
2928
static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
2929
						     unsigned port, int highmem)
2930
{
2931
	struct sky2_port *sky2;
2932
	struct net_device *dev = alloc_etherdev(sizeof(*sky2));
2933
2934
	if (!dev) {
2935
		printk(KERN_ERR "sky2 etherdev alloc failed");
2936
		return NULL;
2937
	}
2938
2939
	SET_MODULE_OWNER(dev);
2940
	SET_NETDEV_DEV(dev, &hw->pdev->dev);
2941
	dev->irq = hw->pdev->irq;
2942
	dev->open = sky2_up;
2943
	dev->stop = sky2_down;
2944
	dev->do_ioctl = sky2_ioctl;
2945
	dev->hard_start_xmit = sky2_xmit_frame;
2946
	dev->get_stats = sky2_get_stats;
2947
	dev->set_multicast_list = sky2_set_multicast;
2948
	dev->set_mac_address = sky2_set_mac_address;
2949
	dev->change_mtu = sky2_change_mtu;
2950
	SET_ETHTOOL_OPS(dev, &sky2_ethtool_ops);
2951
	dev->tx_timeout = sky2_tx_timeout;
2952
	dev->watchdog_timeo = TX_WATCHDOG;
2953
	if (port == 0)
2954
		dev->poll = sky2_poll;
2955
	dev->weight = NAPI_WEIGHT;
2956
#ifdef CONFIG_NET_POLL_CONTROLLER
2957
	dev->poll_controller = sky2_netpoll;
2958
#endif
2959
2960
	sky2 = netdev_priv(dev);
2961
	sky2->netdev = dev;
2962
	sky2->hw = hw;
2963
	sky2->msg_enable = netif_msg_init(debug, default_msg);
2964
2965
	spin_lock_init(&sky2->tx_lock);
2966
	/* Auto speed and flow control */
2967
	sky2->autoneg = AUTONEG_ENABLE;
2968
	sky2->tx_pause = 1;
2969
	sky2->rx_pause = 1;
2970
	sky2->duplex = -1;
2971
	sky2->speed = -1;
2972
	sky2->advertising = sky2_supported_modes(hw);
2973
2974
 	/* Receive checksum disabled for Yukon XL
2975
	 * because of observed problems with incorrect
2976
	 * values when multiple packets are received in one interrupt
2977
	 */
2978
	sky2->rx_csum = (hw->chip_id != CHIP_ID_YUKON_XL);
2979
2980
	INIT_WORK(&sky2->phy_task, sky2_phy_task, sky2);
2981
	init_MUTEX(&sky2->phy_sema);
2982
	sky2->tx_pending = TX_DEF_PENDING;
2983
	sky2->rx_pending = is_ec_a1(hw) ? 8 : RX_DEF_PENDING;
2984
	sky2->rx_bufsize = sky2_buf_size(ETH_DATA_LEN);
2985
2986
	hw->dev[port] = dev;
2987
2988
	sky2->port = port;
2989
2990
	dev->features |= NETIF_F_LLTX;
2991
	if (hw->chip_id != CHIP_ID_YUKON_EC_U)
2992
		dev->features |= NETIF_F_TSO;
2993
	if (highmem)
2994
		dev->features |= NETIF_F_HIGHDMA;
2995
	dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
2996
2997
#ifdef SKY2_VLAN_TAG_USED
2998
	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
2999
	dev->vlan_rx_register = sky2_vlan_rx_register;
3000
	dev->vlan_rx_kill_vid = sky2_vlan_rx_kill_vid;
3001
#endif
3002
3003
	/* read the mac address */
3004
	memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN);
3005
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
3006
3007
	/* device is off until link detection */
3008
	netif_carrier_off(dev);
3009
	netif_stop_queue(dev);
3010
3011
	return dev;
3012
}
3013
3014
static inline void sky2_show_addr(struct net_device *dev)
3015
{
3016
	const struct sky2_port *sky2 = netdev_priv(dev);
3017
3018
	if (netif_msg_probe(sky2))
3019
		printk(KERN_INFO PFX "%s: addr %02x:%02x:%02x:%02x:%02x:%02x\n",
3020
		       dev->name,
3021
		       dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
3022
		       dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
3023
}
3024
3025
static int __devinit sky2_probe(struct pci_dev *pdev,
3026
				const struct pci_device_id *ent)
3027
{
3028
	struct net_device *dev, *dev1 = NULL;
3029
	struct sky2_hw *hw;
3030
	int err, pm_cap, using_dac = 0;
3031
3032
	err = pci_enable_device(pdev);
3033
	if (err) {
3034
		printk(KERN_ERR PFX "%s cannot enable PCI device\n",
3035
		       pci_name(pdev));
3036
		goto err_out;
3037
	}
3038
3039
	err = pci_request_regions(pdev, DRV_NAME);
3040
	if (err) {
3041
		printk(KERN_ERR PFX "%s cannot obtain PCI resources\n",
3042
		       pci_name(pdev));
3043
		goto err_out;
3044
	}
3045
3046
	pci_set_master(pdev);
3047
3048
	/* Find power-management capability. */
3049
	pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
3050
	if (pm_cap == 0) {
3051
		printk(KERN_ERR PFX "Cannot find PowerManagement capability, "
3052
		       "aborting.\n");
3053
		err = -EIO;
3054
		goto err_out_free_regions;
3055
	}
3056
3057
	if (sizeof(dma_addr_t) > sizeof(u32) &&
3058
	    !(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) {
3059
		using_dac = 1;
3060
		err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
3061
		if (err < 0) {
3062
			printk(KERN_ERR PFX "%s unable to obtain 64 bit DMA "
3063
			       "for consistent allocations\n", pci_name(pdev));
3064
			goto err_out_free_regions;
3065
		}
3066
3067
	} else {
3068
		err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
3069
		if (err) {
3070
			printk(KERN_ERR PFX "%s no usable DMA configuration\n",
3071
			       pci_name(pdev));
3072
			goto err_out_free_regions;
3073
		}
3074
	}
3075
3076
#ifdef __BIG_ENDIAN
3077
	/* byte swap descriptors in hardware */
3078
	{
3079
		u32 reg;
3080
3081
		pci_read_config_dword(pdev, PCI_DEV_REG2, &reg);
3082
		reg |= PCI_REV_DESC;
3083
		pci_write_config_dword(pdev, PCI_DEV_REG2, reg);
3084
	}
3085
#endif
3086
3087
	err = -ENOMEM;
3088
	hw = kmalloc(sizeof(*hw), GFP_KERNEL);
3089
	if (!hw) {
3090
		printk(KERN_ERR PFX "%s: cannot allocate hardware struct\n",
3091
		       pci_name(pdev));
3092
		goto err_out_free_regions;
3093
	}
3094
3095
	memset(hw, 0, sizeof(*hw));
3096
	hw->pdev = pdev;
3097
3098
	hw->regs = ioremap_nocache(pci_resource_start(pdev, 0), 0x4000);
3099
	if (!hw->regs) {
3100
		printk(KERN_ERR PFX "%s: cannot map device registers\n",
3101
		       pci_name(pdev));
3102
		goto err_out_free_hw;
3103
	}
3104
	hw->pm_cap = pm_cap;
3105
3106
	err = sky2_reset(hw);
3107
	if (err)
3108
		goto err_out_iounmap;
3109
3110
	printk(KERN_INFO PFX "v%s addr 0x%lx irq %d Yukon-%s (0x%x) rev %d\n",
3111
	       DRV_VERSION, pci_resource_start(pdev, 0), pdev->irq,
3112
	       yukon2_name[hw->chip_id - CHIP_ID_YUKON_XL],
3113
	       hw->chip_id, hw->chip_rev);
3114
3115
	dev = sky2_init_netdev(hw, 0, using_dac);
3116
	if (!dev)
3117
		goto err_out_free_pci;
3118
3119
	err = register_netdev(dev);
3120
	if (err) {
3121
		printk(KERN_ERR PFX "%s: cannot register net device\n",
3122
		       pci_name(pdev));
3123
		goto err_out_free_netdev;
3124
	}
3125
3126
	sky2_show_addr(dev);
3127
3128
	if (hw->ports > 1 && (dev1 = sky2_init_netdev(hw, 1, using_dac))) {
3129
		if (register_netdev(dev1) == 0)
3130
			sky2_show_addr(dev1);
3131
		else {
3132
			/* Failure to register second port need not be fatal */
3133
			printk(KERN_WARNING PFX
3134
			       "register of second port failed\n");
3135
			hw->dev[1] = NULL;
3136
			free_netdev(dev1);
3137
		}
3138
	}
3139
3140
	err = request_irq(pdev->irq, sky2_intr, SA_SHIRQ, DRV_NAME, hw);
3141
	if (err) {
3142
		printk(KERN_ERR PFX "%s: cannot assign irq %d\n",
3143
		       pci_name(pdev), pdev->irq);
3144
		goto err_out_unregister;
3145
	}
3146
3147
	hw->intr_mask = Y2_IS_BASE;
3148
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
3149
3150
	pci_set_drvdata(pdev, hw);
3151
3152
	return 0;
3153
3154
err_out_unregister:
3155
	if (dev1) {
3156
		unregister_netdev(dev1);
3157
		free_netdev(dev1);
3158
	}
3159
	unregister_netdev(dev);
3160
err_out_free_netdev:
3161
	free_netdev(dev);
3162
err_out_free_pci:
3163
	sky2_write8(hw, B0_CTST, CS_RST_SET);
3164
	pci_free_consistent(hw->pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma);
3165
err_out_iounmap:
3166
	iounmap(hw->regs);
3167
err_out_free_hw:
3168
	kfree(hw);
3169
err_out_free_regions:
3170
	pci_release_regions(pdev);
3171
	pci_disable_device(pdev);
3172
err_out:
3173
	return err;
3174
}
3175
3176
static void __devexit sky2_remove(struct pci_dev *pdev)
3177
{
3178
	struct sky2_hw *hw = pci_get_drvdata(pdev);
3179
	struct net_device *dev0, *dev1;
3180
3181
	if (!hw)
3182
		return;
3183
3184
	dev0 = hw->dev[0];
3185
	dev1 = hw->dev[1];
3186
	if (dev1)
3187
		unregister_netdev(dev1);
3188
	unregister_netdev(dev0);
3189
3190
	sky2_write32(hw, B0_IMSK, 0);
3191
	sky2_set_power_state(hw, PCI_D3hot);
3192
	sky2_write16(hw, B0_Y2LED, LED_STAT_OFF);
3193
	sky2_write8(hw, B0_CTST, CS_RST_SET);
3194
	sky2_read8(hw, B0_CTST);
3195
3196
	free_irq(pdev->irq, hw);
3197
	pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma);
3198
	pci_release_regions(pdev);
3199
	pci_disable_device(pdev);
3200
3201
	if (dev1)
3202
		free_netdev(dev1);
3203
	free_netdev(dev0);
3204
	iounmap(hw->regs);
3205
	kfree(hw);
3206
3207
	pci_set_drvdata(pdev, NULL);
3208
}
3209
3210
#ifdef CONFIG_PM
3211
static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
3212
{
3213
	struct sky2_hw *hw = pci_get_drvdata(pdev);
3214
	int i;
3215
3216
	for (i = 0; i < 2; i++) {
3217
		struct net_device *dev = hw->dev[i];
3218
3219
		if (dev) {
3220
			if (!netif_running(dev))
3221
				continue;
3222
3223
			sky2_down(dev);
3224
			netif_device_detach(dev);
3225
		}
3226
	}
3227
3228
	return sky2_set_power_state(hw, pci_choose_state(pdev, state));
3229
}
3230
3231
static int sky2_resume(struct pci_dev *pdev)
3232
{
3233
	struct sky2_hw *hw = pci_get_drvdata(pdev);
3234
	int i;
3235
3236
	pci_restore_state(pdev);
3237
	pci_enable_wake(pdev, PCI_D0, 0);
3238
	sky2_set_power_state(hw, PCI_D0);
3239
3240
	sky2_reset(hw);
3241
3242
	for (i = 0; i < 2; i++) {
3243
		struct net_device *dev = hw->dev[i];
3244
		if (dev) {
3245
			if (netif_running(dev)) {
3246
				netif_device_attach(dev);
3247
				if (sky2_up(dev))
3248
					dev_close(dev);
3249
			}
3250
		}
3251
	}
3252
	return 0;
3253
}
3254
#endif
3255
3256
static struct pci_driver sky2_driver = {
3257
	.name = DRV_NAME,
3258
	.id_table = sky2_id_table,
3259
	.probe = sky2_probe,
3260
	.remove = __devexit_p(sky2_remove),
3261
#ifdef CONFIG_PM
3262
	.suspend = sky2_suspend,
3263
	.resume = sky2_resume,
3264
#endif
3265
};
3266
3267
static int __init sky2_init_module(void)
3268
{
3269
	return pci_register_driver(&sky2_driver);
3270
}
3271
3272
static void __exit sky2_cleanup_module(void)
3273
{
3274
	pci_unregister_driver(&sky2_driver);
3275
}
3276
3277
module_init(sky2_init_module);
3278
module_exit(sky2_cleanup_module);
3279
3280
MODULE_DESCRIPTION("Marvell Yukon 2 Gigabit Ethernet driver");
3281
MODULE_AUTHOR("Stephen Hemminger <shemminger@osdl.org>");
3282
MODULE_LICENSE("GPL");
3283
MODULE_VERSION(DRV_VERSION);
(-)linux-2.6.15/drivers/net/sky2.h (+1922 lines)
Line 0 Link Here
1
/*
2
 * Definitions for the new Marvell Yukon 2 driver.
3
 */
4
#ifndef _SKY2_H
5
#define _SKY2_H
6
7
/* PCI config registers */
8
#define PCI_DEV_REG1	0x40
9
#define PCI_DEV_REG2	0x44
10
#define PCI_DEV_STATUS  0x7c
11
#define PCI_OS_PCI_X    (1<<26)
12
13
#define PEX_LNK_STAT	0xf2
14
#define PEX_UNC_ERR_STAT 0x104
15
#define PEX_DEV_CTRL	0xe8
16
17
/* Yukon-2 */
18
enum pci_dev_reg_1 {
19
	PCI_Y2_PIG_ENA	 = 1<<31, /* Enable Plug-in-Go (YUKON-2) */
20
	PCI_Y2_DLL_DIS	 = 1<<30, /* Disable PCI DLL (YUKON-2) */
21
	PCI_Y2_PHY2_COMA = 1<<29, /* Set PHY 2 to Coma Mode (YUKON-2) */
22
	PCI_Y2_PHY1_COMA = 1<<28, /* Set PHY 1 to Coma Mode (YUKON-2) */
23
	PCI_Y2_PHY2_POWD = 1<<27, /* Set PHY 2 to Power Down (YUKON-2) */
24
	PCI_Y2_PHY1_POWD = 1<<26, /* Set PHY 1 to Power Down (YUKON-2) */
25
};
26
27
enum pci_dev_reg_2 {
28
	PCI_VPD_WR_THR	= 0xffL<<24,	/* Bit 31..24:	VPD Write Threshold */
29
	PCI_DEV_SEL	= 0x7fL<<17,	/* Bit 23..17:	EEPROM Device Select */
30
	PCI_VPD_ROM_SZ	= 7L<<14,	/* Bit 16..14:	VPD ROM Size	*/
31
32
	PCI_PATCH_DIR	= 0xfL<<8,	/* Bit 11.. 8:	Ext Patches dir 3..0 */
33
	PCI_EXT_PATCHS	= 0xfL<<4,	/* Bit	7.. 4:	Extended Patches 3..0 */
34
	PCI_EN_DUMMY_RD	= 1<<3,		/* Enable Dummy Read */
35
	PCI_REV_DESC	= 1<<2,		/* Reverse Desc. Bytes */
36
37
	PCI_USEDATA64	= 1<<0,		/* Use 64Bit Data bus ext */
38
};
39
40
41
#define PCI_STATUS_ERROR_BITS (PCI_STATUS_DETECTED_PARITY | \
42
			       PCI_STATUS_SIG_SYSTEM_ERROR | \
43
			       PCI_STATUS_REC_MASTER_ABORT | \
44
			       PCI_STATUS_REC_TARGET_ABORT | \
45
			       PCI_STATUS_PARITY)
46
47
enum pex_dev_ctrl {
48
	PEX_DC_MAX_RRS_MSK	= 7<<12, /* Bit 14..12:	Max. Read Request Size */
49
	PEX_DC_EN_NO_SNOOP	= 1<<11,/* Enable No Snoop */
50
	PEX_DC_EN_AUX_POW	= 1<<10,/* Enable AUX Power */
51
	PEX_DC_EN_PHANTOM	= 1<<9,	/* Enable Phantom Functions */
52
	PEX_DC_EN_EXT_TAG	= 1<<8,	/* Enable Extended Tag Field */
53
	PEX_DC_MAX_PLS_MSK	= 7<<5,	/* Bit  7.. 5:	Max. Payload Size Mask */
54
	PEX_DC_EN_REL_ORD	= 1<<4,	/* Enable Relaxed Ordering */
55
	PEX_DC_EN_UNS_RQ_RP	= 1<<3,	/* Enable Unsupported Request Reporting */
56
	PEX_DC_EN_FAT_ER_RP	= 1<<2,	/* Enable Fatal Error Reporting */
57
	PEX_DC_EN_NFA_ER_RP	= 1<<1,	/* Enable Non-Fatal Error Reporting */
58
	PEX_DC_EN_COR_ER_RP	= 1<<0,	/* Enable Correctable Error Reporting */
59
};
60
#define  PEX_DC_MAX_RD_RQ_SIZE(x) (((x)<<12) & PEX_DC_MAX_RRS_MSK)
61
62
/* PEX_UNC_ERR_STAT	 PEX Uncorrectable Errors Status Register (Yukon-2) */
63
enum pex_err {
64
	PEX_UNSUP_REQ 	= 1<<20, /* Unsupported Request Error */
65
66
	PEX_MALFOR_TLP	= 1<<18, /* Malformed TLP */
67
68
	PEX_UNEXP_COMP	= 1<<16, /* Unexpected Completion */
69
70
	PEX_COMP_TO	= 1<<14, /* Completion Timeout */
71
	PEX_FLOW_CTRL_P	= 1<<13, /* Flow Control Protocol Error */
72
	PEX_POIS_TLP	= 1<<12, /* Poisoned TLP */
73
74
	PEX_DATA_LINK_P = 1<<4,	/* Data Link Protocol Error */
75
	PEX_FATAL_ERRORS= (PEX_MALFOR_TLP | PEX_FLOW_CTRL_P | PEX_DATA_LINK_P),
76
};
77
78
79
enum csr_regs {
80
	B0_RAP		= 0x0000,
81
	B0_CTST		= 0x0004,
82
	B0_Y2LED	= 0x0005,
83
	B0_POWER_CTRL	= 0x0007,
84
	B0_ISRC		= 0x0008,
85
	B0_IMSK		= 0x000c,
86
	B0_HWE_ISRC	= 0x0010,
87
	B0_HWE_IMSK	= 0x0014,
88
89
	/* Special ISR registers (Yukon-2 only) */
90
	B0_Y2_SP_ISRC2	= 0x001c,
91
	B0_Y2_SP_ISRC3	= 0x0020,
92
	B0_Y2_SP_EISR	= 0x0024,
93
	B0_Y2_SP_LISR	= 0x0028,
94
	B0_Y2_SP_ICR	= 0x002c,
95
96
	B2_MAC_1	= 0x0100,
97
	B2_MAC_2	= 0x0108,
98
	B2_MAC_3	= 0x0110,
99
	B2_CONN_TYP	= 0x0118,
100
	B2_PMD_TYP	= 0x0119,
101
	B2_MAC_CFG	= 0x011a,
102
	B2_CHIP_ID	= 0x011b,
103
	B2_E_0		= 0x011c,
104
105
	B2_Y2_CLK_GATE  = 0x011d,
106
	B2_Y2_HW_RES	= 0x011e,
107
	B2_E_3		= 0x011f,
108
	B2_Y2_CLK_CTRL	= 0x0120,
109
110
	B2_TI_INI	= 0x0130,
111
	B2_TI_VAL	= 0x0134,
112
	B2_TI_CTRL	= 0x0138,
113
	B2_TI_TEST	= 0x0139,
114
115
	B2_TST_CTRL1	= 0x0158,
116
	B2_TST_CTRL2	= 0x0159,
117
	B2_GP_IO	= 0x015c,
118
119
	B2_I2C_CTRL	= 0x0160,
120
	B2_I2C_DATA	= 0x0164,
121
	B2_I2C_IRQ	= 0x0168,
122
	B2_I2C_SW	= 0x016c,
123
124
	B3_RAM_ADDR	= 0x0180,
125
	B3_RAM_DATA_LO	= 0x0184,
126
	B3_RAM_DATA_HI	= 0x0188,
127
128
/* RAM Interface Registers */
129
/* Yukon-2: use RAM_BUFFER() to access the RAM buffer */
130
/*
131
 * The HW-Spec. calls this registers Timeout Value 0..11. But this names are
132
 * not usable in SW. Please notice these are NOT real timeouts, these are
133
 * the number of qWords transferred continuously.
134
 */
135
#define RAM_BUFFER(port, reg)	(reg | (port <<6))
136
137
	B3_RI_WTO_R1	= 0x0190,
138
	B3_RI_WTO_XA1	= 0x0191,
139
	B3_RI_WTO_XS1	= 0x0192,
140
	B3_RI_RTO_R1	= 0x0193,
141
	B3_RI_RTO_XA1	= 0x0194,
142
	B3_RI_RTO_XS1	= 0x0195,
143
	B3_RI_WTO_R2	= 0x0196,
144
	B3_RI_WTO_XA2	= 0x0197,
145
	B3_RI_WTO_XS2	= 0x0198,
146
	B3_RI_RTO_R2	= 0x0199,
147
	B3_RI_RTO_XA2	= 0x019a,
148
	B3_RI_RTO_XS2	= 0x019b,
149
	B3_RI_TO_VAL	= 0x019c,
150
	B3_RI_CTRL	= 0x01a0,
151
	B3_RI_TEST	= 0x01a2,
152
	B3_MA_TOINI_RX1	= 0x01b0,
153
	B3_MA_TOINI_RX2	= 0x01b1,
154
	B3_MA_TOINI_TX1	= 0x01b2,
155
	B3_MA_TOINI_TX2	= 0x01b3,
156
	B3_MA_TOVAL_RX1	= 0x01b4,
157
	B3_MA_TOVAL_RX2	= 0x01b5,
158
	B3_MA_TOVAL_TX1	= 0x01b6,
159
	B3_MA_TOVAL_TX2	= 0x01b7,
160
	B3_MA_TO_CTRL	= 0x01b8,
161
	B3_MA_TO_TEST	= 0x01ba,
162
	B3_MA_RCINI_RX1	= 0x01c0,
163
	B3_MA_RCINI_RX2	= 0x01c1,
164
	B3_MA_RCINI_TX1	= 0x01c2,
165
	B3_MA_RCINI_TX2	= 0x01c3,
166
	B3_MA_RCVAL_RX1	= 0x01c4,
167
	B3_MA_RCVAL_RX2	= 0x01c5,
168
	B3_MA_RCVAL_TX1	= 0x01c6,
169
	B3_MA_RCVAL_TX2	= 0x01c7,
170
	B3_MA_RC_CTRL	= 0x01c8,
171
	B3_MA_RC_TEST	= 0x01ca,
172
	B3_PA_TOINI_RX1	= 0x01d0,
173
	B3_PA_TOINI_RX2	= 0x01d4,
174
	B3_PA_TOINI_TX1	= 0x01d8,
175
	B3_PA_TOINI_TX2	= 0x01dc,
176
	B3_PA_TOVAL_RX1	= 0x01e0,
177
	B3_PA_TOVAL_RX2	= 0x01e4,
178
	B3_PA_TOVAL_TX1	= 0x01e8,
179
	B3_PA_TOVAL_TX2	= 0x01ec,
180
	B3_PA_CTRL	= 0x01f0,
181
	B3_PA_TEST	= 0x01f2,
182
183
	Y2_CFG_SPC	= 0x1c00,
184
};
185
186
/*	B0_CTST			16 bit	Control/Status register */
187
enum {
188
	Y2_VMAIN_AVAIL	= 1<<17,/* VMAIN available (YUKON-2 only) */
189
	Y2_VAUX_AVAIL	= 1<<16,/* VAUX available (YUKON-2 only) */
190
	Y2_ASF_ENABLE	= 1<<13,/* ASF Unit Enable (YUKON-2 only) */
191
	Y2_ASF_DISABLE	= 1<<12,/* ASF Unit Disable (YUKON-2 only) */
192
	Y2_CLK_RUN_ENA	= 1<<11,/* CLK_RUN Enable  (YUKON-2 only) */
193
	Y2_CLK_RUN_DIS	= 1<<10,/* CLK_RUN Disable (YUKON-2 only) */
194
	Y2_LED_STAT_ON	= 1<<9, /* Status LED On  (YUKON-2 only) */
195
	Y2_LED_STAT_OFF	= 1<<8, /* Status LED Off (YUKON-2 only) */
196
197
	CS_ST_SW_IRQ	= 1<<7,	/* Set IRQ SW Request */
198
	CS_CL_SW_IRQ	= 1<<6,	/* Clear IRQ SW Request */
199
	CS_STOP_DONE	= 1<<5,	/* Stop Master is finished */
200
	CS_STOP_MAST	= 1<<4,	/* Command Bit to stop the master */
201
	CS_MRST_CLR	= 1<<3,	/* Clear Master reset	*/
202
	CS_MRST_SET	= 1<<2,	/* Set Master reset	*/
203
	CS_RST_CLR	= 1<<1,	/* Clear Software reset	*/
204
	CS_RST_SET	= 1,	/* Set   Software reset	*/
205
};
206
207
/*	B0_LED			 8 Bit	LED register */
208
enum {
209
/* Bit  7.. 2:	reserved */
210
	LED_STAT_ON	= 1<<1,	/* Status LED on	*/
211
	LED_STAT_OFF	= 1,	/* Status LED off	*/
212
};
213
214
/*	B0_POWER_CTRL	 8 Bit	Power Control reg (YUKON only) */
215
enum {
216
	PC_VAUX_ENA	= 1<<7,	/* Switch VAUX Enable  */
217
	PC_VAUX_DIS	= 1<<6,	/* Switch VAUX Disable */
218
	PC_VCC_ENA	= 1<<5,	/* Switch VCC Enable  */
219
	PC_VCC_DIS	= 1<<4,	/* Switch VCC Disable */
220
	PC_VAUX_ON	= 1<<3,	/* Switch VAUX On  */
221
	PC_VAUX_OFF	= 1<<2,	/* Switch VAUX Off */
222
	PC_VCC_ON	= 1<<1,	/* Switch VCC On  */
223
	PC_VCC_OFF	= 1<<0,	/* Switch VCC Off */
224
};
225
226
/*	B2_IRQM_MSK 	32 bit	IRQ Moderation Mask */
227
228
/*	B0_Y2_SP_ISRC2	32 bit	Special Interrupt Source Reg 2 */
229
/*	B0_Y2_SP_ISRC3	32 bit	Special Interrupt Source Reg 3 */
230
/*	B0_Y2_SP_EISR	32 bit	Enter ISR Reg */
231
/*	B0_Y2_SP_LISR	32 bit	Leave ISR Reg */
232
enum {
233
	Y2_IS_HW_ERR	= 1<<31,	/* Interrupt HW Error */
234
	Y2_IS_STAT_BMU	= 1<<30,	/* Status BMU Interrupt */
235
	Y2_IS_ASF	= 1<<29,	/* ASF subsystem Interrupt */
236
237
	Y2_IS_POLL_CHK	= 1<<27,	/* Check IRQ from polling unit */
238
	Y2_IS_TWSI_RDY	= 1<<26,	/* IRQ on end of TWSI Tx */
239
	Y2_IS_IRQ_SW	= 1<<25,	/* SW forced IRQ	*/
240
	Y2_IS_TIMINT	= 1<<24,	/* IRQ from Timer	*/
241
242
	Y2_IS_IRQ_PHY2	= 1<<12,	/* Interrupt from PHY 2 */
243
	Y2_IS_IRQ_MAC2	= 1<<11,	/* Interrupt from MAC 2 */
244
	Y2_IS_CHK_RX2	= 1<<10,	/* Descriptor error Rx 2 */
245
	Y2_IS_CHK_TXS2	= 1<<9,		/* Descriptor error TXS 2 */
246
	Y2_IS_CHK_TXA2	= 1<<8,		/* Descriptor error TXA 2 */
247
248
	Y2_IS_IRQ_PHY1	= 1<<4,		/* Interrupt from PHY 1 */
249
	Y2_IS_IRQ_MAC1	= 1<<3,		/* Interrupt from MAC 1 */
250
	Y2_IS_CHK_RX1	= 1<<2,		/* Descriptor error Rx 1 */
251
	Y2_IS_CHK_TXS1	= 1<<1,		/* Descriptor error TXS 1 */
252
	Y2_IS_CHK_TXA1	= 1<<0,		/* Descriptor error TXA 1 */
253
254
	Y2_IS_BASE	= Y2_IS_HW_ERR | Y2_IS_STAT_BMU |
255
			  Y2_IS_POLL_CHK | Y2_IS_TWSI_RDY |
256
			  Y2_IS_IRQ_SW | Y2_IS_TIMINT,
257
	Y2_IS_PORT_1	= Y2_IS_IRQ_PHY1 | Y2_IS_IRQ_MAC1 |
258
			  Y2_IS_CHK_RX1 | Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXS1,
259
	Y2_IS_PORT_2	= Y2_IS_IRQ_PHY2 | Y2_IS_IRQ_MAC2 |
260
			  Y2_IS_CHK_RX2 | Y2_IS_CHK_TXA2 | Y2_IS_CHK_TXS2,
261
};
262
263
/*	B2_IRQM_HWE_MSK	32 bit	IRQ Moderation HW Error Mask */
264
enum {
265
	IS_ERR_MSK	= 0x00003fff,/* 		All Error bits */
266
267
	IS_IRQ_TIST_OV	= 1<<13, /* Time Stamp Timer Overflow (YUKON only) */
268
	IS_IRQ_SENSOR	= 1<<12, /* IRQ from Sensor (YUKON only) */
269
	IS_IRQ_MST_ERR	= 1<<11, /* IRQ master error detected */
270
	IS_IRQ_STAT	= 1<<10, /* IRQ status exception */
271
	IS_NO_STAT_M1	= 1<<9,	/* No Rx Status from MAC 1 */
272
	IS_NO_STAT_M2	= 1<<8,	/* No Rx Status from MAC 2 */
273
	IS_NO_TIST_M1	= 1<<7,	/* No Time Stamp from MAC 1 */
274
	IS_NO_TIST_M2	= 1<<6,	/* No Time Stamp from MAC 2 */
275
	IS_RAM_RD_PAR	= 1<<5,	/* RAM Read  Parity Error */
276
	IS_RAM_WR_PAR	= 1<<4,	/* RAM Write Parity Error */
277
	IS_M1_PAR_ERR	= 1<<3,	/* MAC 1 Parity Error */
278
	IS_M2_PAR_ERR	= 1<<2,	/* MAC 2 Parity Error */
279
	IS_R1_PAR_ERR	= 1<<1,	/* Queue R1 Parity Error */
280
	IS_R2_PAR_ERR	= 1<<0,	/* Queue R2 Parity Error */
281
};
282
283
/* Hardware error interrupt mask for Yukon 2 */
284
enum {
285
	Y2_IS_TIST_OV	= 1<<29,/* Time Stamp Timer overflow interrupt */
286
	Y2_IS_SENSOR	= 1<<28, /* Sensor interrupt */
287
	Y2_IS_MST_ERR	= 1<<27, /* Master error interrupt */
288
	Y2_IS_IRQ_STAT	= 1<<26, /* Status exception interrupt */
289
	Y2_IS_PCI_EXP	= 1<<25, /* PCI-Express interrupt */
290
	Y2_IS_PCI_NEXP	= 1<<24, /* PCI-Express error similar to PCI error */
291
						/* Link 2 */
292
	Y2_IS_PAR_RD2	= 1<<13, /* Read RAM parity error interrupt */
293
	Y2_IS_PAR_WR2	= 1<<12, /* Write RAM parity error interrupt */
294
	Y2_IS_PAR_MAC2	= 1<<11, /* MAC hardware fault interrupt */
295
	Y2_IS_PAR_RX2	= 1<<10, /* Parity Error Rx Queue 2 */
296
	Y2_IS_TCP_TXS2	= 1<<9, /* TCP length mismatch sync Tx queue IRQ */
297
	Y2_IS_TCP_TXA2	= 1<<8, /* TCP length mismatch async Tx queue IRQ */
298
						/* Link 1 */
299
	Y2_IS_PAR_RD1	= 1<<5, /* Read RAM parity error interrupt */
300
	Y2_IS_PAR_WR1	= 1<<4, /* Write RAM parity error interrupt */
301
	Y2_IS_PAR_MAC1	= 1<<3, /* MAC hardware fault interrupt */
302
	Y2_IS_PAR_RX1	= 1<<2, /* Parity Error Rx Queue 1 */
303
	Y2_IS_TCP_TXS1	= 1<<1, /* TCP length mismatch sync Tx queue IRQ */
304
	Y2_IS_TCP_TXA1	= 1<<0, /* TCP length mismatch async Tx queue IRQ */
305
306
	Y2_HWE_L1_MASK	= Y2_IS_PAR_RD1 | Y2_IS_PAR_WR1 | Y2_IS_PAR_MAC1 |
307
			  Y2_IS_PAR_RX1 | Y2_IS_TCP_TXS1| Y2_IS_TCP_TXA1,
308
	Y2_HWE_L2_MASK	= Y2_IS_PAR_RD2 | Y2_IS_PAR_WR2 | Y2_IS_PAR_MAC2 |
309
			  Y2_IS_PAR_RX2 | Y2_IS_TCP_TXS2| Y2_IS_TCP_TXA2,
310
311
	Y2_HWE_ALL_MASK	= Y2_IS_TIST_OV | Y2_IS_MST_ERR | Y2_IS_IRQ_STAT |
312
			  Y2_IS_PCI_EXP |
313
			  Y2_HWE_L1_MASK | Y2_HWE_L2_MASK,
314
};
315
316
/*	B28_DPT_CTRL	 8 bit	Descriptor Poll Timer Ctrl Reg */
317
enum {
318
	DPT_START	= 1<<1,
319
	DPT_STOP	= 1<<0,
320
};
321
322
/*	B2_TST_CTRL1	 8 bit	Test Control Register 1 */
323
enum {
324
	TST_FRC_DPERR_MR = 1<<7, /* force DATAPERR on MST RD */
325
	TST_FRC_DPERR_MW = 1<<6, /* force DATAPERR on MST WR */
326
	TST_FRC_DPERR_TR = 1<<5, /* force DATAPERR on TRG RD */
327
	TST_FRC_DPERR_TW = 1<<4, /* force DATAPERR on TRG WR */
328
	TST_FRC_APERR_M	 = 1<<3, /* force ADDRPERR on MST */
329
	TST_FRC_APERR_T	 = 1<<2, /* force ADDRPERR on TRG */
330
	TST_CFG_WRITE_ON = 1<<1, /* Enable  Config Reg WR */
331
	TST_CFG_WRITE_OFF= 1<<0, /* Disable Config Reg WR */
332
};
333
334
/*	B2_MAC_CFG		 8 bit	MAC Configuration / Chip Revision */
335
enum {
336
	CFG_CHIP_R_MSK	  = 0xf<<4,	/* Bit 7.. 4: Chip Revision */
337
					/* Bit 3.. 2:	reserved */
338
	CFG_DIS_M2_CLK	  = 1<<1,	/* Disable Clock for 2nd MAC */
339
	CFG_SNG_MAC	  = 1<<0,	/* MAC Config: 0=2 MACs / 1=1 MAC*/
340
};
341
342
/*	B2_CHIP_ID		 8 bit 	Chip Identification Number */
343
enum {
344
	CHIP_ID_GENESIS	   = 0x0a, /* Chip ID for GENESIS */
345
	CHIP_ID_YUKON	   = 0xb0, /* Chip ID for YUKON */
346
	CHIP_ID_YUKON_LITE = 0xb1, /* Chip ID for YUKON-Lite (Rev. A1-A3) */
347
	CHIP_ID_YUKON_LP   = 0xb2, /* Chip ID for YUKON-LP */
348
	CHIP_ID_YUKON_XL   = 0xb3, /* Chip ID for YUKON-2 XL */
349
	CHIP_ID_YUKON_EC_U = 0xb4, /* Chip ID for YUKON-2 EC Ultra */
350
	CHIP_ID_YUKON_EC   = 0xb6, /* Chip ID for YUKON-2 EC */
351
 	CHIP_ID_YUKON_FE   = 0xb7, /* Chip ID for YUKON-2 FE */
352
353
	CHIP_REV_YU_EC_A1    = 0,  /* Chip Rev. for Yukon-EC A1/A0 */
354
	CHIP_REV_YU_EC_A2    = 1,  /* Chip Rev. for Yukon-EC A2 */
355
	CHIP_REV_YU_EC_A3    = 2,  /* Chip Rev. for Yukon-EC A3 */
356
};
357
358
/*	B2_Y2_CLK_GATE	 8 bit	Clock Gating (Yukon-2 only) */
359
enum {
360
	Y2_STATUS_LNK2_INAC	= 1<<7, /* Status Link 2 inactive (0 = active) */
361
	Y2_CLK_GAT_LNK2_DIS	= 1<<6, /* Disable clock gating Link 2 */
362
	Y2_COR_CLK_LNK2_DIS	= 1<<5, /* Disable Core clock Link 2 */
363
	Y2_PCI_CLK_LNK2_DIS	= 1<<4, /* Disable PCI clock Link 2 */
364
	Y2_STATUS_LNK1_INAC	= 1<<3, /* Status Link 1 inactive (0 = active) */
365
	Y2_CLK_GAT_LNK1_DIS	= 1<<2, /* Disable clock gating Link 1 */
366
	Y2_COR_CLK_LNK1_DIS	= 1<<1, /* Disable Core clock Link 1 */
367
	Y2_PCI_CLK_LNK1_DIS	= 1<<0, /* Disable PCI clock Link 1 */
368
};
369
370
/*	B2_Y2_HW_RES	8 bit	HW Resources (Yukon-2 only) */
371
enum {
372
	CFG_LED_MODE_MSK	= 7<<2,	/* Bit  4.. 2:	LED Mode Mask */
373
	CFG_LINK_2_AVAIL	= 1<<1,	/* Link 2 available */
374
	CFG_LINK_1_AVAIL	= 1<<0,	/* Link 1 available */
375
};
376
#define CFG_LED_MODE(x)		(((x) & CFG_LED_MODE_MSK) >> 2)
377
#define CFG_DUAL_MAC_MSK	(CFG_LINK_2_AVAIL | CFG_LINK_1_AVAIL)
378
379
380
/* B2_Y2_CLK_CTRL	32 bit	Clock Frequency Control Register (Yukon-2/EC) */
381
enum {
382
	Y2_CLK_DIV_VAL_MSK	= 0xff<<16,/* Bit 23..16: Clock Divisor Value */
383
#define	Y2_CLK_DIV_VAL(x)	(((x)<<16) & Y2_CLK_DIV_VAL_MSK)
384
	Y2_CLK_DIV_VAL2_MSK	= 7<<21,   /* Bit 23..21: Clock Divisor Value */
385
	Y2_CLK_SELECT2_MSK	= 0x1f<<16,/* Bit 20..16: Clock Select */
386
#define Y2_CLK_DIV_VAL_2(x)	(((x)<<21) & Y2_CLK_DIV_VAL2_MSK)
387
#define Y2_CLK_SEL_VAL_2(x)	(((x)<<16) & Y2_CLK_SELECT2_MSK)
388
	Y2_CLK_DIV_ENA		= 1<<1, /* Enable  Core Clock Division */
389
	Y2_CLK_DIV_DIS		= 1<<0,	/* Disable Core Clock Division */
390
};
391
392
/*	B2_TI_CTRL		 8 bit	Timer control */
393
/*	B2_IRQM_CTRL	 8 bit	IRQ Moderation Timer Control */
394
enum {
395
	TIM_START	= 1<<2,	/* Start Timer */
396
	TIM_STOP	= 1<<1,	/* Stop  Timer */
397
	TIM_CLR_IRQ	= 1<<0,	/* Clear Timer IRQ (!IRQM) */
398
};
399
400
/*	B2_TI_TEST		 8 Bit	Timer Test */
401
/*	B2_IRQM_TEST	 8 bit	IRQ Moderation Timer Test */
402
/*	B28_DPT_TST		 8 bit	Descriptor Poll Timer Test Reg */
403
enum {
404
	TIM_T_ON	= 1<<2,	/* Test mode on */
405
	TIM_T_OFF	= 1<<1,	/* Test mode off */
406
	TIM_T_STEP	= 1<<0,	/* Test step */
407
};
408
409
/*	B3_RAM_ADDR		32 bit	RAM Address, to read or write */
410
					/* Bit 31..19:	reserved */
411
#define RAM_ADR_RAN	0x0007ffffL	/* Bit 18.. 0:	RAM Address Range */
412
/* RAM Interface Registers */
413
414
/*	B3_RI_CTRL		16 bit	RAM Interface Control Register */
415
enum {
416
	RI_CLR_RD_PERR	= 1<<9,	/* Clear IRQ RAM Read Parity Err */
417
	RI_CLR_WR_PERR	= 1<<8,	/* Clear IRQ RAM Write Parity Err*/
418
419
	RI_RST_CLR	= 1<<1,	/* Clear RAM Interface Reset */
420
	RI_RST_SET	= 1<<0,	/* Set   RAM Interface Reset */
421
};
422
423
#define SK_RI_TO_53	36		/* RAM interface timeout */
424
425
426
/* Port related registers FIFO, and Arbiter */
427
#define SK_REG(port,reg)	(((port)<<7)+(reg))
428
429
/* Transmit Arbiter Registers MAC 1 and 2, use SK_REG() to access */
430
/*	TXA_ITI_INI		32 bit	Tx Arb Interval Timer Init Val */
431
/*	TXA_ITI_VAL		32 bit	Tx Arb Interval Timer Value */
432
/*	TXA_LIM_INI		32 bit	Tx Arb Limit Counter Init Val */
433
/*	TXA_LIM_VAL		32 bit	Tx Arb Limit Counter Value */
434
435
#define TXA_MAX_VAL	0x00ffffffUL	/* Bit 23.. 0:	Max TXA Timer/Cnt Val */
436
437
/*	TXA_CTRL		 8 bit	Tx Arbiter Control Register */
438
enum {
439
	TXA_ENA_FSYNC	= 1<<7,	/* Enable  force of sync Tx queue */
440
	TXA_DIS_FSYNC	= 1<<6,	/* Disable force of sync Tx queue */
441
	TXA_ENA_ALLOC	= 1<<5,	/* Enable  alloc of free bandwidth */
442
	TXA_DIS_ALLOC	= 1<<4,	/* Disable alloc of free bandwidth */
443
	TXA_START_RC	= 1<<3,	/* Start sync Rate Control */
444
	TXA_STOP_RC	= 1<<2,	/* Stop  sync Rate Control */
445
	TXA_ENA_ARB	= 1<<1,	/* Enable  Tx Arbiter */
446
	TXA_DIS_ARB	= 1<<0,	/* Disable Tx Arbiter */
447
};
448
449
/*
450
 *	Bank 4 - 5
451
 */
452
/* Transmit Arbiter Registers MAC 1 and 2, use SK_REG() to access */
453
enum {
454
	TXA_ITI_INI	= 0x0200,/* 32 bit	Tx Arb Interval Timer Init Val*/
455
	TXA_ITI_VAL	= 0x0204,/* 32 bit	Tx Arb Interval Timer Value */
456
	TXA_LIM_INI	= 0x0208,/* 32 bit	Tx Arb Limit Counter Init Val */
457
	TXA_LIM_VAL	= 0x020c,/* 32 bit	Tx Arb Limit Counter Value */
458
	TXA_CTRL	= 0x0210,/*  8 bit	Tx Arbiter Control Register */
459
	TXA_TEST	= 0x0211,/*  8 bit	Tx Arbiter Test Register */
460
	TXA_STAT	= 0x0212,/*  8 bit	Tx Arbiter Status Register */
461
};
462
463
464
enum {
465
	B6_EXT_REG	= 0x0300,/* External registers (GENESIS only) */
466
	B7_CFG_SPC	= 0x0380,/* copy of the Configuration register */
467
	B8_RQ1_REGS	= 0x0400,/* Receive Queue 1 */
468
	B8_RQ2_REGS	= 0x0480,/* Receive Queue 2 */
469
	B8_TS1_REGS	= 0x0600,/* Transmit sync queue 1 */
470
	B8_TA1_REGS	= 0x0680,/* Transmit async queue 1 */
471
	B8_TS2_REGS	= 0x0700,/* Transmit sync queue 2 */
472
	B8_TA2_REGS	= 0x0780,/* Transmit sync queue 2 */
473
	B16_RAM_REGS	= 0x0800,/* RAM Buffer Registers */
474
};
475
476
/* Queue Register Offsets, use Q_ADDR() to access */
477
enum {
478
	B8_Q_REGS = 0x0400, /* base of Queue registers */
479
	Q_D	= 0x00,	/* 8*32	bit	Current Descriptor */
480
	Q_DA_L	= 0x20,	/* 32 bit	Current Descriptor Address Low dWord */
481
	Q_DA_H	= 0x24,	/* 32 bit	Current Descriptor Address High dWord */
482
	Q_AC_L	= 0x28,	/* 32 bit	Current Address Counter Low dWord */
483
	Q_AC_H	= 0x2c,	/* 32 bit	Current Address Counter High dWord */
484
	Q_BC	= 0x30,	/* 32 bit	Current Byte Counter */
485
	Q_CSR	= 0x34,	/* 32 bit	BMU Control/Status Register */
486
	Q_F	= 0x38,	/* 32 bit	Flag Register */
487
	Q_T1	= 0x3c,	/* 32 bit	Test Register 1 */
488
	Q_T1_TR	= 0x3c,	/*  8 bit	Test Register 1 Transfer SM */
489
	Q_T1_WR	= 0x3d,	/*  8 bit	Test Register 1 Write Descriptor SM */
490
	Q_T1_RD	= 0x3e,	/*  8 bit	Test Register 1 Read Descriptor SM */
491
	Q_T1_SV	= 0x3f,	/*  8 bit	Test Register 1 Supervisor SM */
492
	Q_T2	= 0x40,	/* 32 bit	Test Register 2	*/
493
	Q_T3	= 0x44,	/* 32 bit	Test Register 3	*/
494
495
/* Yukon-2 */
496
	Q_DONE	= 0x24,	/* 16 bit	Done Index 		(Yukon-2 only) */
497
	Q_WM	= 0x40,	/* 16 bit	FIFO Watermark */
498
	Q_AL	= 0x42,	/*  8 bit	FIFO Alignment */
499
	Q_RSP	= 0x44,	/* 16 bit	FIFO Read Shadow Pointer */
500
	Q_RSL	= 0x46,	/*  8 bit	FIFO Read Shadow Level */
501
	Q_RP	= 0x48,	/*  8 bit	FIFO Read Pointer */
502
	Q_RL	= 0x4a,	/*  8 bit	FIFO Read Level */
503
	Q_WP	= 0x4c,	/*  8 bit	FIFO Write Pointer */
504
	Q_WSP	= 0x4d,	/*  8 bit	FIFO Write Shadow Pointer */
505
	Q_WL	= 0x4e,	/*  8 bit	FIFO Write Level */
506
	Q_WSL	= 0x4f,	/*  8 bit	FIFO Write Shadow Level */
507
};
508
#define Q_ADDR(reg, offs) (B8_Q_REGS + (reg) + (offs))
509
510
511
/* Queue Prefetch Unit Offsets, use Y2_QADDR() to address (Yukon-2 only)*/
512
enum {
513
	Y2_B8_PREF_REGS		= 0x0450,
514
515
	PREF_UNIT_CTRL		= 0x00,	/* 32 bit	Control register */
516
	PREF_UNIT_LAST_IDX	= 0x04,	/* 16 bit	Last Index */
517
	PREF_UNIT_ADDR_LO	= 0x08,	/* 32 bit	List start addr, low part */
518
	PREF_UNIT_ADDR_HI	= 0x0c,	/* 32 bit	List start addr, high part*/
519
	PREF_UNIT_GET_IDX	= 0x10,	/* 16 bit	Get Index */
520
	PREF_UNIT_PUT_IDX	= 0x14,	/* 16 bit	Put Index */
521
	PREF_UNIT_FIFO_WP	= 0x20,	/*  8 bit	FIFO write pointer */
522
	PREF_UNIT_FIFO_RP	= 0x24,	/*  8 bit	FIFO read pointer */
523
	PREF_UNIT_FIFO_WM	= 0x28,	/*  8 bit	FIFO watermark */
524
	PREF_UNIT_FIFO_LEV	= 0x2c,	/*  8 bit	FIFO level */
525
526
	PREF_UNIT_MASK_IDX	= 0x0fff,
527
};
528
#define Y2_QADDR(q,reg)		(Y2_B8_PREF_REGS + (q) + (reg))
529
530
/* RAM Buffer Register Offsets */
531
enum {
532
533
	RB_START	= 0x00,/* 32 bit	RAM Buffer Start Address */
534
	RB_END	= 0x04,/* 32 bit	RAM Buffer End Address */
535
	RB_WP	= 0x08,/* 32 bit	RAM Buffer Write Pointer */
536
	RB_RP	= 0x0c,/* 32 bit	RAM Buffer Read Pointer */
537
	RB_RX_UTPP	= 0x10,/* 32 bit	Rx Upper Threshold, Pause Packet */
538
	RB_RX_LTPP	= 0x14,/* 32 bit	Rx Lower Threshold, Pause Packet */
539
	RB_RX_UTHP	= 0x18,/* 32 bit	Rx Upper Threshold, High Prio */
540
	RB_RX_LTHP	= 0x1c,/* 32 bit	Rx Lower Threshold, High Prio */
541
	/* 0x10 - 0x1f:	reserved at Tx RAM Buffer Registers */
542
	RB_PC	= 0x20,/* 32 bit	RAM Buffer Packet Counter */
543
	RB_LEV	= 0x24,/* 32 bit	RAM Buffer Level Register */
544
	RB_CTRL	= 0x28,/* 32 bit	RAM Buffer Control Register */
545
	RB_TST1	= 0x29,/*  8 bit	RAM Buffer Test Register 1 */
546
	RB_TST2	= 0x2a,/*  8 bit	RAM Buffer Test Register 2 */
547
};
548
549
/* Receive and Transmit Queues */
550
enum {
551
	Q_R1	= 0x0000,	/* Receive Queue 1 */
552
	Q_R2	= 0x0080,	/* Receive Queue 2 */
553
	Q_XS1	= 0x0200,	/* Synchronous Transmit Queue 1 */
554
	Q_XA1	= 0x0280,	/* Asynchronous Transmit Queue 1 */
555
	Q_XS2	= 0x0300,	/* Synchronous Transmit Queue 2 */
556
	Q_XA2	= 0x0380,	/* Asynchronous Transmit Queue 2 */
557
};
558
559
/* Different PHY Types */
560
enum {
561
	PHY_ADDR_MARV	= 0,
562
};
563
564
#define RB_ADDR(offs, queue) (B16_RAM_REGS + (queue) + (offs))
565
566
567
enum {
568
	LNK_SYNC_INI	= 0x0c30,/* 32 bit	Link Sync Cnt Init Value */
569
	LNK_SYNC_VAL	= 0x0c34,/* 32 bit	Link Sync Cnt Current Value */
570
	LNK_SYNC_CTRL	= 0x0c38,/*  8 bit	Link Sync Cnt Control Register */
571
	LNK_SYNC_TST	= 0x0c39,/*  8 bit	Link Sync Cnt Test Register */
572
573
	LNK_LED_REG	= 0x0c3c,/*  8 bit	Link LED Register */
574
575
/* Receive GMAC FIFO (YUKON and Yukon-2) */
576
577
	RX_GMF_EA	= 0x0c40,/* 32 bit	Rx GMAC FIFO End Address */
578
	RX_GMF_AF_THR	= 0x0c44,/* 32 bit	Rx GMAC FIFO Almost Full Thresh. */
579
	RX_GMF_CTRL_T	= 0x0c48,/* 32 bit	Rx GMAC FIFO Control/Test */
580
	RX_GMF_FL_MSK	= 0x0c4c,/* 32 bit	Rx GMAC FIFO Flush Mask */
581
	RX_GMF_FL_THR	= 0x0c50,/* 32 bit	Rx GMAC FIFO Flush Threshold */
582
	RX_GMF_TR_THR	= 0x0c54,/* 32 bit	Rx Truncation Threshold (Yukon-2) */
583
	RX_GMF_UP_THR	= 0x0c58,/*  8 bit	Rx Upper Pause Thr (Yukon-EC_U) */
584
	RX_GMF_LP_THR	= 0x0c5a,/*  8 bit	Rx Lower Pause Thr (Yukon-EC_U) */
585
	RX_GMF_VLAN	= 0x0c5c,/* 32 bit	Rx VLAN Type Register (Yukon-2) */
586
	RX_GMF_WP	= 0x0c60,/* 32 bit	Rx GMAC FIFO Write Pointer */
587
588
	RX_GMF_WLEV	= 0x0c68,/* 32 bit	Rx GMAC FIFO Write Level */
589
590
	RX_GMF_RP	= 0x0c70,/* 32 bit	Rx GMAC FIFO Read Pointer */
591
592
	RX_GMF_RLEV	= 0x0c78,/* 32 bit	Rx GMAC FIFO Read Level */
593
};
594
595
596
/*	Q_BC			32 bit	Current Byte Counter */
597
598
/* BMU Control Status Registers */
599
/*	B0_R1_CSR		32 bit	BMU Ctrl/Stat Rx Queue 1 */
600
/*	B0_R2_CSR		32 bit	BMU Ctrl/Stat Rx Queue 2 */
601
/*	B0_XA1_CSR		32 bit	BMU Ctrl/Stat Sync Tx Queue 1 */
602
/*	B0_XS1_CSR		32 bit	BMU Ctrl/Stat Async Tx Queue 1 */
603
/*	B0_XA2_CSR		32 bit	BMU Ctrl/Stat Sync Tx Queue 2 */
604
/*	B0_XS2_CSR		32 bit	BMU Ctrl/Stat Async Tx Queue 2 */
605
/*	Q_CSR			32 bit	BMU Control/Status Register */
606
607
/* Rx BMU Control / Status Registers (Yukon-2) */
608
enum {
609
	BMU_IDLE	= 1<<31, /* BMU Idle State */
610
	BMU_RX_TCP_PKT	= 1<<30, /* Rx TCP Packet (when RSS Hash enabled) */
611
	BMU_RX_IP_PKT	= 1<<29, /* Rx IP  Packet (when RSS Hash enabled) */
612
613
	BMU_ENA_RX_RSS_HASH = 1<<15, /* Enable  Rx RSS Hash */
614
	BMU_DIS_RX_RSS_HASH = 1<<14, /* Disable Rx RSS Hash */
615
	BMU_ENA_RX_CHKSUM = 1<<13, /* Enable  Rx TCP/IP Checksum Check */
616
	BMU_DIS_RX_CHKSUM = 1<<12, /* Disable Rx TCP/IP Checksum Check */
617
	BMU_CLR_IRQ_PAR	= 1<<11, /* Clear IRQ on Parity errors (Rx) */
618
	BMU_CLR_IRQ_TCP	= 1<<11, /* Clear IRQ on TCP segment. error (Tx) */
619
	BMU_CLR_IRQ_CHK	= 1<<10, /* Clear IRQ Check */
620
	BMU_STOP	= 1<<9, /* Stop  Rx/Tx Queue */
621
	BMU_START	= 1<<8, /* Start Rx/Tx Queue */
622
	BMU_FIFO_OP_ON	= 1<<7, /* FIFO Operational On */
623
	BMU_FIFO_OP_OFF	= 1<<6, /* FIFO Operational Off */
624
	BMU_FIFO_ENA	= 1<<5, /* Enable FIFO */
625
	BMU_FIFO_RST	= 1<<4, /* Reset  FIFO */
626
	BMU_OP_ON	= 1<<3, /* BMU Operational On */
627
	BMU_OP_OFF	= 1<<2, /* BMU Operational Off */
628
	BMU_RST_CLR	= 1<<1, /* Clear BMU Reset (Enable) */
629
	BMU_RST_SET	= 1<<0, /* Set   BMU Reset */
630
631
	BMU_CLR_RESET	= BMU_FIFO_RST | BMU_OP_OFF | BMU_RST_CLR,
632
	BMU_OPER_INIT	= BMU_CLR_IRQ_PAR | BMU_CLR_IRQ_CHK | BMU_START |
633
			  BMU_FIFO_ENA | BMU_OP_ON,
634
635
	BMU_WM_DEFAULT = 0x600,
636
};
637
638
/* Tx BMU Control / Status Registers (Yukon-2) */
639
								/* Bit 31: same as for Rx */
640
enum {
641
	BMU_TX_IPIDINCR_ON	= 1<<13, /* Enable  IP ID Increment */
642
	BMU_TX_IPIDINCR_OFF	= 1<<12, /* Disable IP ID Increment */
643
	BMU_TX_CLR_IRQ_TCP	= 1<<11, /* Clear IRQ on TCP segment length mismatch */
644
};
645
646
/* Queue Prefetch Unit Offsets, use Y2_QADDR() to address (Yukon-2 only)*/
647
/* PREF_UNIT_CTRL	32 bit	Prefetch Control register */
648
enum {
649
	PREF_UNIT_OP_ON		= 1<<3,	/* prefetch unit operational */
650
	PREF_UNIT_OP_OFF	= 1<<2,	/* prefetch unit not operational */
651
	PREF_UNIT_RST_CLR	= 1<<1,	/* Clear Prefetch Unit Reset */
652
	PREF_UNIT_RST_SET	= 1<<0,	/* Set   Prefetch Unit Reset */
653
};
654
655
/* RAM Buffer Register Offsets, use RB_ADDR(Queue, Offs) to access */
656
/*	RB_START		32 bit	RAM Buffer Start Address */
657
/*	RB_END			32 bit	RAM Buffer End Address */
658
/*	RB_WP			32 bit	RAM Buffer Write Pointer */
659
/*	RB_RP			32 bit	RAM Buffer Read Pointer */
660
/*	RB_RX_UTPP		32 bit	Rx Upper Threshold, Pause Pack */
661
/*	RB_RX_LTPP		32 bit	Rx Lower Threshold, Pause Pack */
662
/*	RB_RX_UTHP		32 bit	Rx Upper Threshold, High Prio */
663
/*	RB_RX_LTHP		32 bit	Rx Lower Threshold, High Prio */
664
/*	RB_PC			32 bit	RAM Buffer Packet Counter */
665
/*	RB_LEV			32 bit	RAM Buffer Level Register */
666
667
#define RB_MSK	0x0007ffff	/* Bit 18.. 0:	RAM Buffer Pointer Bits */
668
/*	RB_TST2			 8 bit	RAM Buffer Test Register 2 */
669
/*	RB_TST1			 8 bit	RAM Buffer Test Register 1 */
670
671
/*	RB_CTRL			 8 bit	RAM Buffer Control Register */
672
enum {
673
	RB_ENA_STFWD	= 1<<5,	/* Enable  Store & Forward */
674
	RB_DIS_STFWD	= 1<<4,	/* Disable Store & Forward */
675
	RB_ENA_OP_MD	= 1<<3,	/* Enable  Operation Mode */
676
	RB_DIS_OP_MD	= 1<<2,	/* Disable Operation Mode */
677
	RB_RST_CLR	= 1<<1,	/* Clear RAM Buf STM Reset */
678
	RB_RST_SET	= 1<<0,	/* Set   RAM Buf STM Reset */
679
};
680
681
682
/* Transmit GMAC FIFO (YUKON only) */
683
enum {
684
	TX_GMF_EA	= 0x0d40,/* 32 bit	Tx GMAC FIFO End Address */
685
	TX_GMF_AE_THR	= 0x0d44,/* 32 bit	Tx GMAC FIFO Almost Empty Thresh.*/
686
	TX_GMF_CTRL_T	= 0x0d48,/* 32 bit	Tx GMAC FIFO Control/Test */
687
688
	TX_GMF_WP	= 0x0d60,/* 32 bit 	Tx GMAC FIFO Write Pointer */
689
	TX_GMF_WSP	= 0x0d64,/* 32 bit 	Tx GMAC FIFO Write Shadow Ptr. */
690
	TX_GMF_WLEV	= 0x0d68,/* 32 bit 	Tx GMAC FIFO Write Level */
691
692
	TX_GMF_RP	= 0x0d70,/* 32 bit 	Tx GMAC FIFO Read Pointer */
693
	TX_GMF_RSTP	= 0x0d74,/* 32 bit 	Tx GMAC FIFO Restart Pointer */
694
	TX_GMF_RLEV	= 0x0d78,/* 32 bit 	Tx GMAC FIFO Read Level */
695
};
696
697
/* Descriptor Poll Timer Registers */
698
enum {
699
	B28_DPT_INI	= 0x0e00,/* 24 bit	Descriptor Poll Timer Init Val */
700
	B28_DPT_VAL	= 0x0e04,/* 24 bit	Descriptor Poll Timer Curr Val */
701
	B28_DPT_CTRL	= 0x0e08,/*  8 bit	Descriptor Poll Timer Ctrl Reg */
702
703
	B28_DPT_TST	= 0x0e0a,/*  8 bit	Descriptor Poll Timer Test Reg */
704
};
705
706
/* Time Stamp Timer Registers (YUKON only) */
707
enum {
708
	GMAC_TI_ST_VAL	= 0x0e14,/* 32 bit	Time Stamp Timer Curr Val */
709
	GMAC_TI_ST_CTRL	= 0x0e18,/*  8 bit	Time Stamp Timer Ctrl Reg */
710
	GMAC_TI_ST_TST	= 0x0e1a,/*  8 bit	Time Stamp Timer Test Reg */
711
};
712
713
/* Polling Unit Registers (Yukon-2 only) */
714
enum {
715
	POLL_CTRL	= 0x0e20, /* 32 bit	Polling Unit Control Reg */
716
	POLL_LAST_IDX	= 0x0e24,/* 16 bit	Polling Unit List Last Index */
717
718
	POLL_LIST_ADDR_LO= 0x0e28,/* 32 bit	Poll. List Start Addr (low) */
719
	POLL_LIST_ADDR_HI= 0x0e2c,/* 32 bit	Poll. List Start Addr (high) */
720
};
721
722
/* ASF Subsystem Registers (Yukon-2 only) */
723
enum {
724
	B28_Y2_SMB_CONFIG  = 0x0e40,/* 32 bit	ASF SMBus Config Register */
725
	B28_Y2_SMB_CSD_REG = 0x0e44,/* 32 bit	ASF SMB Control/Status/Data */
726
	B28_Y2_ASF_IRQ_V_BASE=0x0e60,/* 32 bit	ASF IRQ Vector Base */
727
728
	B28_Y2_ASF_STAT_CMD= 0x0e68,/* 32 bit	ASF Status and Command Reg */
729
	B28_Y2_ASF_HOST_COM= 0x0e6c,/* 32 bit	ASF Host Communication Reg */
730
	B28_Y2_DATA_REG_1  = 0x0e70,/* 32 bit	ASF/Host Data Register 1 */
731
	B28_Y2_DATA_REG_2  = 0x0e74,/* 32 bit	ASF/Host Data Register 2 */
732
	B28_Y2_DATA_REG_3  = 0x0e78,/* 32 bit	ASF/Host Data Register 3 */
733
	B28_Y2_DATA_REG_4  = 0x0e7c,/* 32 bit	ASF/Host Data Register 4 */
734
};
735
736
/* Status BMU Registers (Yukon-2 only)*/
737
enum {
738
	STAT_CTRL	= 0x0e80,/* 32 bit	Status BMU Control Reg */
739
	STAT_LAST_IDX	= 0x0e84,/* 16 bit	Status BMU Last Index */
740
741
	STAT_LIST_ADDR_LO= 0x0e88,/* 32 bit	Status List Start Addr (low) */
742
	STAT_LIST_ADDR_HI= 0x0e8c,/* 32 bit	Status List Start Addr (high) */
743
	STAT_TXA1_RIDX	= 0x0e90,/* 16 bit	Status TxA1 Report Index Reg */
744
	STAT_TXS1_RIDX	= 0x0e92,/* 16 bit	Status TxS1 Report Index Reg */
745
	STAT_TXA2_RIDX	= 0x0e94,/* 16 bit	Status TxA2 Report Index Reg */
746
	STAT_TXS2_RIDX	= 0x0e96,/* 16 bit	Status TxS2 Report Index Reg */
747
	STAT_TX_IDX_TH	= 0x0e98,/* 16 bit	Status Tx Index Threshold Reg */
748
	STAT_PUT_IDX	= 0x0e9c,/* 16 bit	Status Put Index Reg */
749
750
/* FIFO Control/Status Registers (Yukon-2 only)*/
751
	STAT_FIFO_WP	= 0x0ea0,/*  8 bit	Status FIFO Write Pointer Reg */
752
	STAT_FIFO_RP	= 0x0ea4,/*  8 bit	Status FIFO Read Pointer Reg */
753
	STAT_FIFO_RSP	= 0x0ea6,/*  8 bit	Status FIFO Read Shadow Ptr */
754
	STAT_FIFO_LEVEL	= 0x0ea8,/*  8 bit	Status FIFO Level Reg */
755
	STAT_FIFO_SHLVL	= 0x0eaa,/*  8 bit	Status FIFO Shadow Level Reg */
756
	STAT_FIFO_WM	= 0x0eac,/*  8 bit	Status FIFO Watermark Reg */
757
	STAT_FIFO_ISR_WM= 0x0ead,/*  8 bit	Status FIFO ISR Watermark Reg */
758
759
/* Level and ISR Timer Registers (Yukon-2 only)*/
760
	STAT_LEV_TIMER_INI= 0x0eb0,/* 32 bit	Level Timer Init. Value Reg */
761
	STAT_LEV_TIMER_CNT= 0x0eb4,/* 32 bit	Level Timer Counter Reg */
762
	STAT_LEV_TIMER_CTRL= 0x0eb8,/*  8 bit	Level Timer Control Reg */
763
	STAT_LEV_TIMER_TEST= 0x0eb9,/*  8 bit	Level Timer Test Reg */
764
	STAT_TX_TIMER_INI  = 0x0ec0,/* 32 bit	Tx Timer Init. Value Reg */
765
	STAT_TX_TIMER_CNT  = 0x0ec4,/* 32 bit	Tx Timer Counter Reg */
766
	STAT_TX_TIMER_CTRL = 0x0ec8,/*  8 bit	Tx Timer Control Reg */
767
	STAT_TX_TIMER_TEST = 0x0ec9,/*  8 bit	Tx Timer Test Reg */
768
	STAT_ISR_TIMER_INI = 0x0ed0,/* 32 bit	ISR Timer Init. Value Reg */
769
	STAT_ISR_TIMER_CNT = 0x0ed4,/* 32 bit	ISR Timer Counter Reg */
770
	STAT_ISR_TIMER_CTRL= 0x0ed8,/*  8 bit	ISR Timer Control Reg */
771
	STAT_ISR_TIMER_TEST= 0x0ed9,/*  8 bit	ISR Timer Test Reg */
772
};
773
774
enum {
775
	LINKLED_OFF 	     = 0x01,
776
	LINKLED_ON  	     = 0x02,
777
	LINKLED_LINKSYNC_OFF = 0x04,
778
	LINKLED_LINKSYNC_ON  = 0x08,
779
	LINKLED_BLINK_OFF    = 0x10,
780
	LINKLED_BLINK_ON     = 0x20,
781
};
782
783
/* GMAC and GPHY Control Registers (YUKON only) */
784
enum {
785
	GMAC_CTRL	= 0x0f00,/* 32 bit	GMAC Control Reg */
786
	GPHY_CTRL	= 0x0f04,/* 32 bit	GPHY Control Reg */
787
	GMAC_IRQ_SRC	= 0x0f08,/*  8 bit	GMAC Interrupt Source Reg */
788
	GMAC_IRQ_MSK	= 0x0f0c,/*  8 bit	GMAC Interrupt Mask Reg */
789
	GMAC_LINK_CTRL	= 0x0f10,/* 16 bit	Link Control Reg */
790
791
/* Wake-up Frame Pattern Match Control Registers (YUKON only) */
792
793
	WOL_REG_OFFS	= 0x20,/* HW-Bug: Address is + 0x20 against spec. */
794
795
	WOL_CTRL_STAT	= 0x0f20,/* 16 bit	WOL Control/Status Reg */
796
	WOL_MATCH_CTL	= 0x0f22,/*  8 bit	WOL Match Control Reg */
797
	WOL_MATCH_RES	= 0x0f23,/*  8 bit	WOL Match Result Reg */
798
	WOL_MAC_ADDR	= 0x0f24,/* 32 bit	WOL MAC Address */
799
	WOL_PATT_PME	= 0x0f2a,/*  8 bit	WOL PME Match Enable (Yukon-2) */
800
	WOL_PATT_ASFM	= 0x0f2b,/*  8 bit	WOL ASF Match Enable (Yukon-2) */
801
	WOL_PATT_RPTR	= 0x0f2c,/*  8 bit	WOL Pattern Read Pointer */
802
803
/* WOL Pattern Length Registers (YUKON only) */
804
805
	WOL_PATT_LEN_LO	= 0x0f30,/* 32 bit	WOL Pattern Length 3..0 */
806
	WOL_PATT_LEN_HI	= 0x0f34,/* 24 bit	WOL Pattern Length 6..4 */
807
808
/* WOL Pattern Counter Registers (YUKON only) */
809
810
811
	WOL_PATT_CNT_0	= 0x0f38,/* 32 bit	WOL Pattern Counter 3..0 */
812
	WOL_PATT_CNT_4	= 0x0f3c,/* 24 bit	WOL Pattern Counter 6..4 */
813
};
814
815
enum {
816
	WOL_PATT_RAM_1	= 0x1000,/*  WOL Pattern RAM Link 1 */
817
	WOL_PATT_RAM_2	= 0x1400,/*  WOL Pattern RAM Link 2 */
818
};
819
820
enum {
821
	BASE_GMAC_1	= 0x2800,/* GMAC 1 registers */
822
	BASE_GMAC_2	= 0x3800,/* GMAC 2 registers */
823
};
824
825
/*
826
 * Marvel-PHY Registers, indirect addressed over GMAC
827
 */
828
enum {
829
	PHY_MARV_CTRL		= 0x00,/* 16 bit r/w	PHY Control Register */
830
	PHY_MARV_STAT		= 0x01,/* 16 bit r/o	PHY Status Register */
831
	PHY_MARV_ID0		= 0x02,/* 16 bit r/o	PHY ID0 Register */
832
	PHY_MARV_ID1		= 0x03,/* 16 bit r/o	PHY ID1 Register */
833
	PHY_MARV_AUNE_ADV	= 0x04,/* 16 bit r/w	Auto-Neg. Advertisement */
834
	PHY_MARV_AUNE_LP	= 0x05,/* 16 bit r/o	Link Part Ability Reg */
835
	PHY_MARV_AUNE_EXP	= 0x06,/* 16 bit r/o	Auto-Neg. Expansion Reg */
836
	PHY_MARV_NEPG		= 0x07,/* 16 bit r/w	Next Page Register */
837
	PHY_MARV_NEPG_LP	= 0x08,/* 16 bit r/o	Next Page Link Partner */
838
	/* Marvel-specific registers */
839
	PHY_MARV_1000T_CTRL	= 0x09,/* 16 bit r/w	1000Base-T Control Reg */
840
	PHY_MARV_1000T_STAT	= 0x0a,/* 16 bit r/o	1000Base-T Status Reg */
841
	PHY_MARV_EXT_STAT	= 0x0f,/* 16 bit r/o	Extended Status Reg */
842
	PHY_MARV_PHY_CTRL	= 0x10,/* 16 bit r/w	PHY Specific Ctrl Reg */
843
	PHY_MARV_PHY_STAT	= 0x11,/* 16 bit r/o	PHY Specific Stat Reg */
844
	PHY_MARV_INT_MASK	= 0x12,/* 16 bit r/w	Interrupt Mask Reg */
845
	PHY_MARV_INT_STAT	= 0x13,/* 16 bit r/o	Interrupt Status Reg */
846
	PHY_MARV_EXT_CTRL	= 0x14,/* 16 bit r/w	Ext. PHY Specific Ctrl */
847
	PHY_MARV_RXE_CNT	= 0x15,/* 16 bit r/w	Receive Error Counter */
848
	PHY_MARV_EXT_ADR	= 0x16,/* 16 bit r/w	Ext. Ad. for Cable Diag. */
849
	PHY_MARV_PORT_IRQ	= 0x17,/* 16 bit r/o	Port 0 IRQ (88E1111 only) */
850
	PHY_MARV_LED_CTRL	= 0x18,/* 16 bit r/w	LED Control Reg */
851
	PHY_MARV_LED_OVER	= 0x19,/* 16 bit r/w	Manual LED Override Reg */
852
	PHY_MARV_EXT_CTRL_2	= 0x1a,/* 16 bit r/w	Ext. PHY Specific Ctrl 2 */
853
	PHY_MARV_EXT_P_STAT	= 0x1b,/* 16 bit r/w	Ext. PHY Spec. Stat Reg */
854
	PHY_MARV_CABLE_DIAG	= 0x1c,/* 16 bit r/o	Cable Diagnostic Reg */
855
	PHY_MARV_PAGE_ADDR	= 0x1d,/* 16 bit r/w	Extended Page Address Reg */
856
	PHY_MARV_PAGE_DATA	= 0x1e,/* 16 bit r/w	Extended Page Data Reg */
857
858
/* for 10/100 Fast Ethernet PHY (88E3082 only) */
859
	PHY_MARV_FE_LED_PAR	= 0x16,/* 16 bit r/w	LED Parallel Select Reg. */
860
	PHY_MARV_FE_LED_SER	= 0x17,/* 16 bit r/w	LED Stream Select S. LED */
861
	PHY_MARV_FE_VCT_TX	= 0x1a,/* 16 bit r/w	VCT Reg. for TXP/N Pins */
862
	PHY_MARV_FE_VCT_RX	= 0x1b,/* 16 bit r/o	VCT Reg. for RXP/N Pins */
863
	PHY_MARV_FE_SPEC_2	= 0x1c,/* 16 bit r/w	Specific Control Reg. 2 */
864
};
865
866
enum {
867
	PHY_CT_RESET	= 1<<15, /* Bit 15: (sc)	clear all PHY related regs */
868
	PHY_CT_LOOP	= 1<<14, /* Bit 14:	enable Loopback over PHY */
869
	PHY_CT_SPS_LSB	= 1<<13, /* Bit 13:	Speed select, lower bit */
870
	PHY_CT_ANE	= 1<<12, /* Bit 12:	Auto-Negotiation Enabled */
871
	PHY_CT_PDOWN	= 1<<11, /* Bit 11:	Power Down Mode */
872
	PHY_CT_ISOL	= 1<<10, /* Bit 10:	Isolate Mode */
873
	PHY_CT_RE_CFG	= 1<<9, /* Bit  9:	(sc) Restart Auto-Negotiation */
874
	PHY_CT_DUP_MD	= 1<<8, /* Bit  8:	Duplex Mode */
875
	PHY_CT_COL_TST	= 1<<7, /* Bit  7:	Collision Test enabled */
876
	PHY_CT_SPS_MSB	= 1<<6, /* Bit  6:	Speed select, upper bit */
877
};
878
879
enum {
880
	PHY_CT_SP1000	= PHY_CT_SPS_MSB, /* enable speed of 1000 Mbps */
881
	PHY_CT_SP100	= PHY_CT_SPS_LSB, /* enable speed of  100 Mbps */
882
	PHY_CT_SP10	= 0,		  /* enable speed of   10 Mbps */
883
};
884
885
enum {
886
	PHY_ST_EXT_ST	= 1<<8, /* Bit  8:	Extended Status Present */
887
888
	PHY_ST_PRE_SUP	= 1<<6, /* Bit  6:	Preamble Suppression */
889
	PHY_ST_AN_OVER	= 1<<5, /* Bit  5:	Auto-Negotiation Over */
890
	PHY_ST_REM_FLT	= 1<<4, /* Bit  4:	Remote Fault Condition Occured */
891
	PHY_ST_AN_CAP	= 1<<3, /* Bit  3:	Auto-Negotiation Capability */
892
	PHY_ST_LSYNC	= 1<<2, /* Bit  2:	Link Synchronized */
893
	PHY_ST_JAB_DET	= 1<<1, /* Bit  1:	Jabber Detected */
894
	PHY_ST_EXT_REG	= 1<<0, /* Bit  0:	Extended Register available */
895
};
896
897
enum {
898
	PHY_I1_OUI_MSK	= 0x3f<<10, /* Bit 15..10:	Organization Unique ID */
899
	PHY_I1_MOD_NUM	= 0x3f<<4, /* Bit  9.. 4:	Model Number */
900
	PHY_I1_REV_MSK	= 0xf, /* Bit  3.. 0:	Revision Number */
901
};
902
903
/* different Marvell PHY Ids */
904
enum {
905
	PHY_MARV_ID0_VAL= 0x0141, /* Marvell Unique Identifier */
906
907
	PHY_BCOM_ID1_A1	= 0x6041,
908
	PHY_BCOM_ID1_B2	= 0x6043,
909
	PHY_BCOM_ID1_C0	= 0x6044,
910
	PHY_BCOM_ID1_C5	= 0x6047,
911
912
	PHY_MARV_ID1_B0	= 0x0C23, /* Yukon (PHY 88E1011) */
913
	PHY_MARV_ID1_B2	= 0x0C25, /* Yukon-Plus (PHY 88E1011) */
914
	PHY_MARV_ID1_C2	= 0x0CC2, /* Yukon-EC (PHY 88E1111) */
915
	PHY_MARV_ID1_Y2	= 0x0C91, /* Yukon-2 (PHY 88E1112) */
916
};
917
918
/* Advertisement register bits */
919
enum {
920
	PHY_AN_NXT_PG	= 1<<15, /* Bit 15:	Request Next Page */
921
	PHY_AN_ACK	= 1<<14, /* Bit 14:	(ro) Acknowledge Received */
922
	PHY_AN_RF	= 1<<13, /* Bit 13:	Remote Fault Bits */
923
924
	PHY_AN_PAUSE_ASYM = 1<<11,/* Bit 11:	Try for asymmetric */
925
	PHY_AN_PAUSE_CAP = 1<<10, /* Bit 10:	Try for pause */
926
	PHY_AN_100BASE4	= 1<<9, /* Bit 9:	Try for 100mbps 4k packets */
927
	PHY_AN_100FULL	= 1<<8, /* Bit 8:	Try for 100mbps full-duplex */
928
	PHY_AN_100HALF	= 1<<7, /* Bit 7:	Try for 100mbps half-duplex */
929
	PHY_AN_10FULL	= 1<<6, /* Bit 6:	Try for 10mbps full-duplex */
930
	PHY_AN_10HALF	= 1<<5, /* Bit 5:	Try for 10mbps half-duplex */
931
	PHY_AN_CSMA	= 1<<0, /* Bit 0:	Only selector supported */
932
	PHY_AN_SEL	= 0x1f, /* Bit 4..0:	Selector Field, 00001=Ethernet*/
933
	PHY_AN_FULL	= PHY_AN_100FULL | PHY_AN_10FULL | PHY_AN_CSMA,
934
	PHY_AN_ALL	= PHY_AN_10HALF | PHY_AN_10FULL |
935
		  	  PHY_AN_100HALF | PHY_AN_100FULL,
936
};
937
938
/*****  PHY_BCOM_1000T_STAT	16 bit r/o	1000Base-T Status Reg *****/
939
/*****  PHY_MARV_1000T_STAT	16 bit r/o	1000Base-T Status Reg *****/
940
enum {
941
	PHY_B_1000S_MSF	= 1<<15, /* Bit 15:	Master/Slave Fault */
942
	PHY_B_1000S_MSR	= 1<<14, /* Bit 14:	Master/Slave Result */
943
	PHY_B_1000S_LRS	= 1<<13, /* Bit 13:	Local Receiver Status */
944
	PHY_B_1000S_RRS	= 1<<12, /* Bit 12:	Remote Receiver Status */
945
	PHY_B_1000S_LP_FD	= 1<<11, /* Bit 11:	Link Partner can FD */
946
	PHY_B_1000S_LP_HD	= 1<<10, /* Bit 10:	Link Partner can HD */
947
									/* Bit  9..8:	reserved */
948
	PHY_B_1000S_IEC	= 0xff, /* Bit  7..0:	Idle Error Count */
949
};
950
951
/** Marvell-Specific */
952
enum {
953
	PHY_M_AN_NXT_PG	= 1<<15, /* Request Next Page */
954
	PHY_M_AN_ACK	= 1<<14, /* (ro)	Acknowledge Received */
955
	PHY_M_AN_RF	= 1<<13, /* Remote Fault */
956
957
	PHY_M_AN_ASP	= 1<<11, /* Asymmetric Pause */
958
	PHY_M_AN_PC	= 1<<10, /* MAC Pause implemented */
959
	PHY_M_AN_100_T4	= 1<<9, /* Not cap. 100Base-T4 (always 0) */
960
	PHY_M_AN_100_FD	= 1<<8, /* Advertise 100Base-TX Full Duplex */
961
	PHY_M_AN_100_HD	= 1<<7, /* Advertise 100Base-TX Half Duplex */
962
	PHY_M_AN_10_FD	= 1<<6, /* Advertise 10Base-TX Full Duplex */
963
	PHY_M_AN_10_HD	= 1<<5, /* Advertise 10Base-TX Half Duplex */
964
	PHY_M_AN_SEL_MSK =0x1f<<4,	/* Bit  4.. 0: Selector Field Mask */
965
};
966
967
/* special defines for FIBER (88E1011S only) */
968
enum {
969
	PHY_M_AN_ASP_X	= 1<<8, /* Asymmetric Pause */
970
	PHY_M_AN_PC_X	= 1<<7, /* MAC Pause implemented */
971
	PHY_M_AN_1000X_AHD	= 1<<6, /* Advertise 10000Base-X Half Duplex */
972
	PHY_M_AN_1000X_AFD	= 1<<5, /* Advertise 10000Base-X Full Duplex */
973
};
974
975
/* Pause Bits (PHY_M_AN_ASP_X and PHY_M_AN_PC_X) encoding */
976
enum {
977
	PHY_M_P_NO_PAUSE_X	= 0<<7,/* Bit  8.. 7:	no Pause Mode */
978
	PHY_M_P_SYM_MD_X	= 1<<7, /* Bit  8.. 7:	symmetric Pause Mode */
979
	PHY_M_P_ASYM_MD_X	= 2<<7,/* Bit  8.. 7:	asymmetric Pause Mode */
980
	PHY_M_P_BOTH_MD_X	= 3<<7,/* Bit  8.. 7:	both Pause Mode */
981
};
982
983
/*****  PHY_MARV_1000T_CTRL	16 bit r/w	1000Base-T Control Reg *****/
984
enum {
985
	PHY_M_1000C_TEST	= 7<<13,/* Bit 15..13:	Test Modes */
986
	PHY_M_1000C_MSE	= 1<<12, /* Manual Master/Slave Enable */
987
	PHY_M_1000C_MSC	= 1<<11, /* M/S Configuration (1=Master) */
988
	PHY_M_1000C_MPD	= 1<<10, /* Multi-Port Device */
989
	PHY_M_1000C_AFD	= 1<<9, /* Advertise Full Duplex */
990
	PHY_M_1000C_AHD	= 1<<8, /* Advertise Half Duplex */
991
};
992
993
/*****  PHY_MARV_PHY_CTRL	16 bit r/w	PHY Specific Ctrl Reg *****/
994
enum {
995
	PHY_M_PC_TX_FFD_MSK	= 3<<14,/* Bit 15..14: Tx FIFO Depth Mask */
996
	PHY_M_PC_RX_FFD_MSK	= 3<<12,/* Bit 13..12: Rx FIFO Depth Mask */
997
	PHY_M_PC_ASS_CRS_TX	= 1<<11, /* Assert CRS on Transmit */
998
	PHY_M_PC_FL_GOOD	= 1<<10, /* Force Link Good */
999
	PHY_M_PC_EN_DET_MSK	= 3<<8,/* Bit  9.. 8: Energy Detect Mask */
1000
	PHY_M_PC_ENA_EXT_D	= 1<<7, /* Enable Ext. Distance (10BT) */
1001
	PHY_M_PC_MDIX_MSK	= 3<<5,/* Bit  6.. 5: MDI/MDIX Config. Mask */
1002
	PHY_M_PC_DIS_125CLK	= 1<<4, /* Disable 125 CLK */
1003
	PHY_M_PC_MAC_POW_UP	= 1<<3, /* MAC Power up */
1004
	PHY_M_PC_SQE_T_ENA	= 1<<2, /* SQE Test Enabled */
1005
	PHY_M_PC_POL_R_DIS	= 1<<1, /* Polarity Reversal Disabled */
1006
	PHY_M_PC_DIS_JABBER	= 1<<0, /* Disable Jabber */
1007
};
1008
1009
enum {
1010
	PHY_M_PC_EN_DET		= 2<<8,	/* Energy Detect (Mode 1) */
1011
	PHY_M_PC_EN_DET_PLUS	= 3<<8, /* Energy Detect Plus (Mode 2) */
1012
};
1013
1014
#define PHY_M_PC_MDI_XMODE(x)	(((x)<<5) & PHY_M_PC_MDIX_MSK)
1015
1016
enum {
1017
	PHY_M_PC_MAN_MDI	= 0, /* 00 = Manual MDI configuration */
1018
	PHY_M_PC_MAN_MDIX	= 1, /* 01 = Manual MDIX configuration */
1019
	PHY_M_PC_ENA_AUTO	= 3, /* 11 = Enable Automatic Crossover */
1020
};
1021
1022
/* for 10/100 Fast Ethernet PHY (88E3082 only) */
1023
enum {
1024
	PHY_M_PC_ENA_DTE_DT	= 1<<15, /* Enable Data Terminal Equ. (DTE) Detect */
1025
	PHY_M_PC_ENA_ENE_DT	= 1<<14, /* Enable Energy Detect (sense & pulse) */
1026
	PHY_M_PC_DIS_NLP_CK	= 1<<13, /* Disable Normal Link Puls (NLP) Check */
1027
	PHY_M_PC_ENA_LIP_NP	= 1<<12, /* Enable Link Partner Next Page Reg. */
1028
	PHY_M_PC_DIS_NLP_GN	= 1<<11, /* Disable Normal Link Puls Generation */
1029
1030
	PHY_M_PC_DIS_SCRAMB	= 1<<9, /* Disable Scrambler */
1031
	PHY_M_PC_DIS_FEFI	= 1<<8, /* Disable Far End Fault Indic. (FEFI) */
1032
1033
	PHY_M_PC_SH_TP_SEL	= 1<<6, /* Shielded Twisted Pair Select */
1034
	PHY_M_PC_RX_FD_MSK	= 3<<2,/* Bit  3.. 2: Rx FIFO Depth Mask */
1035
};
1036
1037
/*****  PHY_MARV_PHY_STAT	16 bit r/o	PHY Specific Status Reg *****/
1038
enum {
1039
	PHY_M_PS_SPEED_MSK	= 3<<14, /* Bit 15..14: Speed Mask */
1040
	PHY_M_PS_SPEED_1000	= 1<<15, /*		10 = 1000 Mbps */
1041
	PHY_M_PS_SPEED_100	= 1<<14, /*		01 =  100 Mbps */
1042
	PHY_M_PS_SPEED_10	= 0,	 /*		00 =   10 Mbps */
1043
	PHY_M_PS_FULL_DUP	= 1<<13, /* Full Duplex */
1044
	PHY_M_PS_PAGE_REC	= 1<<12, /* Page Received */
1045
	PHY_M_PS_SPDUP_RES	= 1<<11, /* Speed & Duplex Resolved */
1046
	PHY_M_PS_LINK_UP	= 1<<10, /* Link Up */
1047
	PHY_M_PS_CABLE_MSK	= 7<<7,  /* Bit  9.. 7: Cable Length Mask */
1048
	PHY_M_PS_MDI_X_STAT	= 1<<6,  /* MDI Crossover Stat (1=MDIX) */
1049
	PHY_M_PS_DOWNS_STAT	= 1<<5,  /* Downshift Status (1=downsh.) */
1050
	PHY_M_PS_ENDET_STAT	= 1<<4,  /* Energy Detect Status (1=act) */
1051
	PHY_M_PS_TX_P_EN	= 1<<3,  /* Tx Pause Enabled */
1052
	PHY_M_PS_RX_P_EN	= 1<<2,  /* Rx Pause Enabled */
1053
	PHY_M_PS_POL_REV	= 1<<1,  /* Polarity Reversed */
1054
	PHY_M_PS_JABBER		= 1<<0,  /* Jabber */
1055
};
1056
1057
#define PHY_M_PS_PAUSE_MSK	(PHY_M_PS_TX_P_EN | PHY_M_PS_RX_P_EN)
1058
1059
/* for 10/100 Fast Ethernet PHY (88E3082 only) */
1060
enum {
1061
	PHY_M_PS_DTE_DETECT	= 1<<15, /* Data Terminal Equipment (DTE) Detected */
1062
	PHY_M_PS_RES_SPEED	= 1<<14, /* Resolved Speed (1=100 Mbps, 0=10 Mbps */
1063
};
1064
1065
enum {
1066
	PHY_M_IS_AN_ERROR	= 1<<15, /* Auto-Negotiation Error */
1067
	PHY_M_IS_LSP_CHANGE	= 1<<14, /* Link Speed Changed */
1068
	PHY_M_IS_DUP_CHANGE	= 1<<13, /* Duplex Mode Changed */
1069
	PHY_M_IS_AN_PR		= 1<<12, /* Page Received */
1070
	PHY_M_IS_AN_COMPL	= 1<<11, /* Auto-Negotiation Completed */
1071
	PHY_M_IS_LST_CHANGE	= 1<<10, /* Link Status Changed */
1072
	PHY_M_IS_SYMB_ERROR	= 1<<9, /* Symbol Error */
1073
	PHY_M_IS_FALSE_CARR	= 1<<8, /* False Carrier */
1074
	PHY_M_IS_FIFO_ERROR	= 1<<7, /* FIFO Overflow/Underrun Error */
1075
	PHY_M_IS_MDI_CHANGE	= 1<<6, /* MDI Crossover Changed */
1076
	PHY_M_IS_DOWNSH_DET	= 1<<5, /* Downshift Detected */
1077
	PHY_M_IS_END_CHANGE	= 1<<4, /* Energy Detect Changed */
1078
1079
	PHY_M_IS_DTE_CHANGE	= 1<<2, /* DTE Power Det. Status Changed */
1080
	PHY_M_IS_POL_CHANGE	= 1<<1, /* Polarity Changed */
1081
	PHY_M_IS_JABBER		= 1<<0, /* Jabber */
1082
1083
	PHY_M_DEF_MSK		= PHY_M_IS_LSP_CHANGE | PHY_M_IS_LST_CHANGE
1084
				 | PHY_M_IS_FIFO_ERROR,
1085
	PHY_M_AN_MSK	       = PHY_M_IS_AN_ERROR | PHY_M_IS_AN_COMPL,
1086
};
1087
1088
1089
/*****  PHY_MARV_EXT_CTRL	16 bit r/w	Ext. PHY Specific Ctrl *****/
1090
enum {
1091
	PHY_M_EC_ENA_BC_EXT = 1<<15, /* Enable Block Carr. Ext. (88E1111 only) */
1092
	PHY_M_EC_ENA_LIN_LB = 1<<14, /* Enable Line Loopback (88E1111 only) */
1093
1094
	PHY_M_EC_DIS_LINK_P = 1<<12, /* Disable Link Pulses (88E1111 only) */
1095
	PHY_M_EC_M_DSC_MSK  = 3<<10, /* Bit 11..10:	Master Downshift Counter */
1096
					/* (88E1011 only) */
1097
	PHY_M_EC_S_DSC_MSK  = 3<<8,/* Bit  9.. 8:	Slave  Downshift Counter */
1098
				       /* (88E1011 only) */
1099
	PHY_M_EC_M_DSC_MSK2 = 7<<9,/* Bit 11.. 9:	Master Downshift Counter */
1100
					/* (88E1111 only) */
1101
	PHY_M_EC_DOWN_S_ENA = 1<<8, /* Downshift Enable (88E1111 only) */
1102
					/* !!! Errata in spec. (1 = disable) */
1103
	PHY_M_EC_RX_TIM_CT  = 1<<7, /* RGMII Rx Timing Control*/
1104
	PHY_M_EC_MAC_S_MSK  = 7<<4,/* Bit  6.. 4:	Def. MAC interface speed */
1105
	PHY_M_EC_FIB_AN_ENA = 1<<3, /* Fiber Auto-Neg. Enable (88E1011S only) */
1106
	PHY_M_EC_DTE_D_ENA  = 1<<2, /* DTE Detect Enable (88E1111 only) */
1107
	PHY_M_EC_TX_TIM_CT  = 1<<1, /* RGMII Tx Timing Control */
1108
	PHY_M_EC_TRANS_DIS  = 1<<0, /* Transmitter Disable (88E1111 only) */};
1109
1110
#define PHY_M_EC_M_DSC(x)	((x)<<10 & PHY_M_EC_M_DSC_MSK)
1111
					/* 00=1x; 01=2x; 10=3x; 11=4x */
1112
#define PHY_M_EC_S_DSC(x)	((x)<<8 & PHY_M_EC_S_DSC_MSK)
1113
					/* 00=dis; 01=1x; 10=2x; 11=3x */
1114
#define PHY_M_EC_DSC_2(x)	((x)<<9 & PHY_M_EC_M_DSC_MSK2)
1115
					/* 000=1x; 001=2x; 010=3x; 011=4x */
1116
#define PHY_M_EC_MAC_S(x)	((x)<<4 & PHY_M_EC_MAC_S_MSK)
1117
					/* 01X=0; 110=2.5; 111=25 (MHz) */
1118
1119
/* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */
1120
enum {
1121
	PHY_M_PC_DIS_LINK_Pa	= 1<<15,/* Disable Link Pulses */
1122
	PHY_M_PC_DSC_MSK	= 7<<12,/* Bit 14..12:	Downshift Counter */
1123
	PHY_M_PC_DOWN_S_ENA	= 1<<11,/* Downshift Enable */
1124
};
1125
/* !!! Errata in spec. (1 = disable) */
1126
1127
#define PHY_M_PC_DSC(x)			(((x)<<12) & PHY_M_PC_DSC_MSK)
1128
											/* 100=5x; 101=6x; 110=7x; 111=8x */
1129
enum {
1130
	MAC_TX_CLK_0_MHZ	= 2,
1131
	MAC_TX_CLK_2_5_MHZ	= 6,
1132
	MAC_TX_CLK_25_MHZ 	= 7,
1133
};
1134
1135
/*****  PHY_MARV_LED_CTRL	16 bit r/w	LED Control Reg *****/
1136
enum {
1137
	PHY_M_LEDC_DIS_LED	= 1<<15, /* Disable LED */
1138
	PHY_M_LEDC_PULS_MSK	= 7<<12,/* Bit 14..12: Pulse Stretch Mask */
1139
	PHY_M_LEDC_F_INT	= 1<<11, /* Force Interrupt */
1140
	PHY_M_LEDC_BL_R_MSK	= 7<<8,/* Bit 10.. 8: Blink Rate Mask */
1141
	PHY_M_LEDC_DP_C_LSB	= 1<<7, /* Duplex Control (LSB, 88E1111 only) */
1142
	PHY_M_LEDC_TX_C_LSB	= 1<<6, /* Tx Control (LSB, 88E1111 only) */
1143
	PHY_M_LEDC_LK_C_MSK	= 7<<3,/* Bit  5.. 3: Link Control Mask */
1144
					/* (88E1111 only) */
1145
};
1146
1147
enum {
1148
	PHY_M_LEDC_LINK_MSK	= 3<<3,/* Bit  4.. 3: Link Control Mask */
1149
									/* (88E1011 only) */
1150
	PHY_M_LEDC_DP_CTRL	= 1<<2, /* Duplex Control */
1151
	PHY_M_LEDC_DP_C_MSB	= 1<<2, /* Duplex Control (MSB, 88E1111 only) */
1152
	PHY_M_LEDC_RX_CTRL	= 1<<1, /* Rx Activity / Link */
1153
	PHY_M_LEDC_TX_CTRL	= 1<<0, /* Tx Activity / Link */
1154
	PHY_M_LEDC_TX_C_MSB	= 1<<0, /* Tx Control (MSB, 88E1111 only) */
1155
};
1156
1157
#define PHY_M_LED_PULS_DUR(x)	(((x)<<12) & PHY_M_LEDC_PULS_MSK)
1158
1159
/*****  PHY_MARV_PHY_STAT (page 3)16 bit r/w	Polarity Control Reg. *****/
1160
enum {
1161
	PHY_M_POLC_LS1M_MSK	= 0xf<<12, /* Bit 15..12: LOS,STAT1 Mix % Mask */
1162
	PHY_M_POLC_IS0M_MSK	= 0xf<<8,  /* Bit 11.. 8: INIT,STAT0 Mix % Mask */
1163
	PHY_M_POLC_LOS_MSK	= 0x3<<6,  /* Bit  7.. 6: LOS Pol. Ctrl. Mask */
1164
	PHY_M_POLC_INIT_MSK	= 0x3<<4,  /* Bit  5.. 4: INIT Pol. Ctrl. Mask */
1165
	PHY_M_POLC_STA1_MSK	= 0x3<<2,  /* Bit  3.. 2: STAT1 Pol. Ctrl. Mask */
1166
	PHY_M_POLC_STA0_MSK	= 0x3,     /* Bit  1.. 0: STAT0 Pol. Ctrl. Mask */
1167
};
1168
1169
#define PHY_M_POLC_LS1_P_MIX(x)	(((x)<<12) & PHY_M_POLC_LS1M_MSK)
1170
#define PHY_M_POLC_IS0_P_MIX(x)	(((x)<<8) & PHY_M_POLC_IS0M_MSK)
1171
#define PHY_M_POLC_LOS_CTRL(x)	(((x)<<6) & PHY_M_POLC_LOS_MSK)
1172
#define PHY_M_POLC_INIT_CTRL(x)	(((x)<<4) & PHY_M_POLC_INIT_MSK)
1173
#define PHY_M_POLC_STA1_CTRL(x)	(((x)<<2) & PHY_M_POLC_STA1_MSK)
1174
#define PHY_M_POLC_STA0_CTRL(x)	(((x)<<0) & PHY_M_POLC_STA0_MSK)
1175
1176
enum {
1177
	PULS_NO_STR	= 0,/* no pulse stretching */
1178
	PULS_21MS	= 1,/* 21 ms to 42 ms */
1179
	PULS_42MS	= 2,/* 42 ms to 84 ms */
1180
	PULS_84MS	= 3,/* 84 ms to 170 ms */
1181
	PULS_170MS	= 4,/* 170 ms to 340 ms */
1182
	PULS_340MS	= 5,/* 340 ms to 670 ms */
1183
	PULS_670MS	= 6,/* 670 ms to 1.3 s */
1184
	PULS_1300MS	= 7,/* 1.3 s to 2.7 s */
1185
};
1186
1187
#define PHY_M_LED_BLINK_RT(x)	(((x)<<8) & PHY_M_LEDC_BL_R_MSK)
1188
1189
enum {
1190
	BLINK_42MS	= 0,/* 42 ms */
1191
	BLINK_84MS	= 1,/* 84 ms */
1192
	BLINK_170MS	= 2,/* 170 ms */
1193
	BLINK_340MS	= 3,/* 340 ms */
1194
	BLINK_670MS	= 4,/* 670 ms */
1195
};
1196
1197
/*****  PHY_MARV_LED_OVER	16 bit r/w	Manual LED Override Reg *****/
1198
#define PHY_M_LED_MO_SGMII(x)	((x)<<14) /* Bit 15..14:  SGMII AN Timer */
1199
										/* Bit 13..12:	reserved */
1200
#define PHY_M_LED_MO_DUP(x)	((x)<<10) /* Bit 11..10:  Duplex */
1201
#define PHY_M_LED_MO_10(x)	((x)<<8) /* Bit  9.. 8:  Link 10 */
1202
#define PHY_M_LED_MO_100(x)	((x)<<6) /* Bit  7.. 6:  Link 100 */
1203
#define PHY_M_LED_MO_1000(x)	((x)<<4) /* Bit  5.. 4:  Link 1000 */
1204
#define PHY_M_LED_MO_RX(x)	((x)<<2) /* Bit  3.. 2:  Rx */
1205
#define PHY_M_LED_MO_TX(x)	((x)<<0) /* Bit  1.. 0:  Tx */
1206
1207
enum {
1208
	MO_LED_NORM	= 0,
1209
	MO_LED_BLINK	= 1,
1210
	MO_LED_OFF	= 2,
1211
	MO_LED_ON	= 3,
1212
};
1213
1214
/*****  PHY_MARV_EXT_CTRL_2	16 bit r/w	Ext. PHY Specific Ctrl 2 *****/
1215
enum {
1216
	PHY_M_EC2_FI_IMPED	= 1<<6, /* Fiber Input  Impedance */
1217
	PHY_M_EC2_FO_IMPED	= 1<<5, /* Fiber Output Impedance */
1218
	PHY_M_EC2_FO_M_CLK	= 1<<4, /* Fiber Mode Clock Enable */
1219
	PHY_M_EC2_FO_BOOST	= 1<<3, /* Fiber Output Boost */
1220
	PHY_M_EC2_FO_AM_MSK	= 7,/* Bit  2.. 0:	Fiber Output Amplitude */
1221
};
1222
1223
/*****  PHY_MARV_EXT_P_STAT 16 bit r/w	Ext. PHY Specific Status *****/
1224
enum {
1225
	PHY_M_FC_AUTO_SEL	= 1<<15, /* Fiber/Copper Auto Sel. Dis. */
1226
	PHY_M_FC_AN_REG_ACC	= 1<<14, /* Fiber/Copper AN Reg. Access */
1227
	PHY_M_FC_RESOLUTION	= 1<<13, /* Fiber/Copper Resolution */
1228
	PHY_M_SER_IF_AN_BP	= 1<<12, /* Ser. IF AN Bypass Enable */
1229
	PHY_M_SER_IF_BP_ST	= 1<<11, /* Ser. IF AN Bypass Status */
1230
	PHY_M_IRQ_POLARITY	= 1<<10, /* IRQ polarity */
1231
	PHY_M_DIS_AUT_MED	= 1<<9, /* Disable Aut. Medium Reg. Selection */
1232
	/* (88E1111 only) */
1233
1234
	PHY_M_UNDOC1		= 1<<7, /* undocumented bit !! */
1235
	PHY_M_DTE_POW_STAT	= 1<<4, /* DTE Power Status (88E1111 only) */
1236
	PHY_M_MODE_MASK	= 0xf, /* Bit  3.. 0: copy of HWCFG MODE[3:0] */
1237
};
1238
1239
/* for 10/100 Fast Ethernet PHY (88E3082 only) */
1240
/*****  PHY_MARV_FE_LED_PAR		16 bit r/w	LED Parallel Select Reg. *****/
1241
									/* Bit 15..12: reserved (used internally) */
1242
enum {
1243
	PHY_M_FELP_LED2_MSK = 0xf<<8,	/* Bit 11.. 8: LED2 Mask (LINK) */
1244
	PHY_M_FELP_LED1_MSK = 0xf<<4,	/* Bit  7.. 4: LED1 Mask (ACT) */
1245
	PHY_M_FELP_LED0_MSK = 0xf, /* Bit  3.. 0: LED0 Mask (SPEED) */
1246
};
1247
1248
#define PHY_M_FELP_LED2_CTRL(x)	(((x)<<8) & PHY_M_FELP_LED2_MSK)
1249
#define PHY_M_FELP_LED1_CTRL(x)	(((x)<<4) & PHY_M_FELP_LED1_MSK)
1250
#define PHY_M_FELP_LED0_CTRL(x)	(((x)<<0) & PHY_M_FELP_LED0_MSK)
1251
1252
enum {
1253
	LED_PAR_CTRL_COLX	= 0x00,
1254
	LED_PAR_CTRL_ERROR	= 0x01,
1255
	LED_PAR_CTRL_DUPLEX	= 0x02,
1256
	LED_PAR_CTRL_DP_COL	= 0x03,
1257
	LED_PAR_CTRL_SPEED	= 0x04,
1258
	LED_PAR_CTRL_LINK	= 0x05,
1259
	LED_PAR_CTRL_TX		= 0x06,
1260
	LED_PAR_CTRL_RX		= 0x07,
1261
	LED_PAR_CTRL_ACT	= 0x08,
1262
	LED_PAR_CTRL_LNK_RX	= 0x09,
1263
	LED_PAR_CTRL_LNK_AC	= 0x0a,
1264
	LED_PAR_CTRL_ACT_BL	= 0x0b,
1265
	LED_PAR_CTRL_TX_BL	= 0x0c,
1266
	LED_PAR_CTRL_RX_BL	= 0x0d,
1267
	LED_PAR_CTRL_COL_BL	= 0x0e,
1268
	LED_PAR_CTRL_INACT	= 0x0f
1269
};
1270
1271
/*****,PHY_MARV_FE_SPEC_2		16 bit r/w	Specific Control Reg. 2 *****/
1272
enum {
1273
	PHY_M_FESC_DIS_WAIT	= 1<<2, /* Disable TDR Waiting Period */
1274
	PHY_M_FESC_ENA_MCLK	= 1<<1, /* Enable MAC Rx Clock in sleep mode */
1275
	PHY_M_FESC_SEL_CL_A	= 1<<0, /* Select Class A driver (100B-TX) */
1276
};
1277
1278
/* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */
1279
/*****  PHY_MARV_PHY_CTRL (page 2)		16 bit r/w	MAC Specific Ctrl *****/
1280
enum {
1281
	PHY_M_MAC_MD_MSK	= 7<<7, /* Bit  9.. 7: Mode Select Mask */
1282
	PHY_M_MAC_MD_AUTO	= 3,/* Auto Copper/1000Base-X */
1283
	PHY_M_MAC_MD_COPPER	= 5,/* Copper only */
1284
	PHY_M_MAC_MD_1000BX	= 7,/* 1000Base-X only */
1285
};
1286
#define PHY_M_MAC_MODE_SEL(x)	(((x)<<7) & PHY_M_MAC_MD_MSK)
1287
1288
/*****  PHY_MARV_PHY_CTRL (page 3)		16 bit r/w	LED Control Reg. *****/
1289
enum {
1290
	PHY_M_LEDC_LOS_MSK	= 0xf<<12,/* Bit 15..12: LOS LED Ctrl. Mask */
1291
	PHY_M_LEDC_INIT_MSK	= 0xf<<8, /* Bit 11.. 8: INIT LED Ctrl. Mask */
1292
	PHY_M_LEDC_STA1_MSK	= 0xf<<4,/* Bit  7.. 4: STAT1 LED Ctrl. Mask */
1293
	PHY_M_LEDC_STA0_MSK	= 0xf, /* Bit  3.. 0: STAT0 LED Ctrl. Mask */
1294
};
1295
1296
#define PHY_M_LEDC_LOS_CTRL(x)	(((x)<<12) & PHY_M_LEDC_LOS_MSK)
1297
#define PHY_M_LEDC_INIT_CTRL(x)	(((x)<<8) & PHY_M_LEDC_INIT_MSK)
1298
#define PHY_M_LEDC_STA1_CTRL(x)	(((x)<<4) & PHY_M_LEDC_STA1_MSK)
1299
#define PHY_M_LEDC_STA0_CTRL(x)	(((x)<<0) & PHY_M_LEDC_STA0_MSK)
1300
1301
/* GMAC registers  */
1302
/* Port Registers */
1303
enum {
1304
	GM_GP_STAT	= 0x0000,	/* 16 bit r/o	General Purpose Status */
1305
	GM_GP_CTRL	= 0x0004,	/* 16 bit r/w	General Purpose Control */
1306
	GM_TX_CTRL	= 0x0008,	/* 16 bit r/w	Transmit Control Reg. */
1307
	GM_RX_CTRL	= 0x000c,	/* 16 bit r/w	Receive Control Reg. */
1308
	GM_TX_FLOW_CTRL	= 0x0010,	/* 16 bit r/w	Transmit Flow-Control */
1309
	GM_TX_PARAM	= 0x0014,	/* 16 bit r/w	Transmit Parameter Reg. */
1310
	GM_SERIAL_MODE	= 0x0018,	/* 16 bit r/w	Serial Mode Register */
1311
/* Source Address Registers */
1312
	GM_SRC_ADDR_1L	= 0x001c,	/* 16 bit r/w	Source Address 1 (low) */
1313
	GM_SRC_ADDR_1M	= 0x0020,	/* 16 bit r/w	Source Address 1 (middle) */
1314
	GM_SRC_ADDR_1H	= 0x0024,	/* 16 bit r/w	Source Address 1 (high) */
1315
	GM_SRC_ADDR_2L	= 0x0028,	/* 16 bit r/w	Source Address 2 (low) */
1316
	GM_SRC_ADDR_2M	= 0x002c,	/* 16 bit r/w	Source Address 2 (middle) */
1317
	GM_SRC_ADDR_2H	= 0x0030,	/* 16 bit r/w	Source Address 2 (high) */
1318
1319
/* Multicast Address Hash Registers */
1320
	GM_MC_ADDR_H1	= 0x0034,	/* 16 bit r/w	Multicast Address Hash 1 */
1321
	GM_MC_ADDR_H2	= 0x0038,	/* 16 bit r/w	Multicast Address Hash 2 */
1322
	GM_MC_ADDR_H3	= 0x003c,	/* 16 bit r/w	Multicast Address Hash 3 */
1323
	GM_MC_ADDR_H4	= 0x0040,	/* 16 bit r/w	Multicast Address Hash 4 */
1324
1325
/* Interrupt Source Registers */
1326
	GM_TX_IRQ_SRC	= 0x0044,	/* 16 bit r/o	Tx Overflow IRQ Source */
1327
	GM_RX_IRQ_SRC	= 0x0048,	/* 16 bit r/o	Rx Overflow IRQ Source */
1328
	GM_TR_IRQ_SRC	= 0x004c,	/* 16 bit r/o	Tx/Rx Over. IRQ Source */
1329
1330
/* Interrupt Mask Registers */
1331
	GM_TX_IRQ_MSK	= 0x0050,	/* 16 bit r/w	Tx Overflow IRQ Mask */
1332
	GM_RX_IRQ_MSK	= 0x0054,	/* 16 bit r/w	Rx Overflow IRQ Mask */
1333
	GM_TR_IRQ_MSK	= 0x0058,	/* 16 bit r/w	Tx/Rx Over. IRQ Mask */
1334
1335
/* Serial Management Interface (SMI) Registers */
1336
	GM_SMI_CTRL	= 0x0080,	/* 16 bit r/w	SMI Control Register */
1337
	GM_SMI_DATA	= 0x0084,	/* 16 bit r/w	SMI Data Register */
1338
	GM_PHY_ADDR	= 0x0088,	/* 16 bit r/w	GPHY Address Register */
1339
};
1340
1341
/* MIB Counters */
1342
#define GM_MIB_CNT_BASE	0x0100		/* Base Address of MIB Counters */
1343
#define GM_MIB_CNT_SIZE	44		/* Number of MIB Counters */
1344
1345
/*
1346
 * MIB Counters base address definitions (low word) -
1347
 * use offset 4 for access to high word	(32 bit r/o)
1348
 */
1349
enum {
1350
	GM_RXF_UC_OK  = GM_MIB_CNT_BASE + 0,	/* Unicast Frames Received OK */
1351
	GM_RXF_BC_OK	= GM_MIB_CNT_BASE + 8,	/* Broadcast Frames Received OK */
1352
	GM_RXF_MPAUSE	= GM_MIB_CNT_BASE + 16,	/* Pause MAC Ctrl Frames Received */
1353
	GM_RXF_MC_OK	= GM_MIB_CNT_BASE + 24,	/* Multicast Frames Received OK */
1354
	GM_RXF_FCS_ERR	= GM_MIB_CNT_BASE + 32,	/* Rx Frame Check Seq. Error */
1355
	/* GM_MIB_CNT_BASE + 40:	reserved */
1356
	GM_RXO_OK_LO	= GM_MIB_CNT_BASE + 48,	/* Octets Received OK Low */
1357
	GM_RXO_OK_HI	= GM_MIB_CNT_BASE + 56,	/* Octets Received OK High */
1358
	GM_RXO_ERR_LO	= GM_MIB_CNT_BASE + 64,	/* Octets Received Invalid Low */
1359
	GM_RXO_ERR_HI	= GM_MIB_CNT_BASE + 72,	/* Octets Received Invalid High */
1360
	GM_RXF_SHT	= GM_MIB_CNT_BASE + 80,	/* Frames <64 Byte Received OK */
1361
	GM_RXE_FRAG	= GM_MIB_CNT_BASE + 88,	/* Frames <64 Byte Received with FCS Err */
1362
	GM_RXF_64B	= GM_MIB_CNT_BASE + 96,	/* 64 Byte Rx Frame */
1363
	GM_RXF_127B	= GM_MIB_CNT_BASE + 104,	/* 65-127 Byte Rx Frame */
1364
	GM_RXF_255B	= GM_MIB_CNT_BASE + 112,	/* 128-255 Byte Rx Frame */
1365
	GM_RXF_511B	= GM_MIB_CNT_BASE + 120,	/* 256-511 Byte Rx Frame */
1366
	GM_RXF_1023B	= GM_MIB_CNT_BASE + 128,	/* 512-1023 Byte Rx Frame */
1367
	GM_RXF_1518B	= GM_MIB_CNT_BASE + 136,	/* 1024-1518 Byte Rx Frame */
1368
	GM_RXF_MAX_SZ	= GM_MIB_CNT_BASE + 144,	/* 1519-MaxSize Byte Rx Frame */
1369
	GM_RXF_LNG_ERR	= GM_MIB_CNT_BASE + 152,	/* Rx Frame too Long Error */
1370
	GM_RXF_JAB_PKT	= GM_MIB_CNT_BASE + 160,	/* Rx Jabber Packet Frame */
1371
	/* GM_MIB_CNT_BASE + 168:	reserved */
1372
	GM_RXE_FIFO_OV	= GM_MIB_CNT_BASE + 176,	/* Rx FIFO overflow Event */
1373
	/* GM_MIB_CNT_BASE + 184:	reserved */
1374
	GM_TXF_UC_OK	= GM_MIB_CNT_BASE + 192,	/* Unicast Frames Xmitted OK */
1375
	GM_TXF_BC_OK	= GM_MIB_CNT_BASE + 200,	/* Broadcast Frames Xmitted OK */
1376
	GM_TXF_MPAUSE	= GM_MIB_CNT_BASE + 208,	/* Pause MAC Ctrl Frames Xmitted */
1377
	GM_TXF_MC_OK	= GM_MIB_CNT_BASE + 216,	/* Multicast Frames Xmitted OK */
1378
	GM_TXO_OK_LO	= GM_MIB_CNT_BASE + 224,	/* Octets Transmitted OK Low */
1379
	GM_TXO_OK_HI	= GM_MIB_CNT_BASE + 232,	/* Octets Transmitted OK High */
1380
	GM_TXF_64B	= GM_MIB_CNT_BASE + 240,	/* 64 Byte Tx Frame */
1381
	GM_TXF_127B	= GM_MIB_CNT_BASE + 248,	/* 65-127 Byte Tx Frame */
1382
	GM_TXF_255B	= GM_MIB_CNT_BASE + 256,	/* 128-255 Byte Tx Frame */
1383
	GM_TXF_511B	= GM_MIB_CNT_BASE + 264,	/* 256-511 Byte Tx Frame */
1384
	GM_TXF_1023B	= GM_MIB_CNT_BASE + 272,	/* 512-1023 Byte Tx Frame */
1385
	GM_TXF_1518B	= GM_MIB_CNT_BASE + 280,	/* 1024-1518 Byte Tx Frame */
1386
	GM_TXF_MAX_SZ	= GM_MIB_CNT_BASE + 288,	/* 1519-MaxSize Byte Tx Frame */
1387
1388
	GM_TXF_COL	= GM_MIB_CNT_BASE + 304,	/* Tx Collision */
1389
	GM_TXF_LAT_COL	= GM_MIB_CNT_BASE + 312,	/* Tx Late Collision */
1390
	GM_TXF_ABO_COL	= GM_MIB_CNT_BASE + 320,	/* Tx aborted due to Exces. Col. */
1391
	GM_TXF_MUL_COL	= GM_MIB_CNT_BASE + 328,	/* Tx Multiple Collision */
1392
	GM_TXF_SNG_COL	= GM_MIB_CNT_BASE + 336,	/* Tx Single Collision */
1393
	GM_TXE_FIFO_UR	= GM_MIB_CNT_BASE + 344,	/* Tx FIFO Underrun Event */
1394
};
1395
1396
/* GMAC Bit Definitions */
1397
/*	GM_GP_STAT	16 bit r/o	General Purpose Status Register */
1398
enum {
1399
	GM_GPSR_SPEED		= 1<<15, /* Bit 15:	Port Speed (1 = 100 Mbps) */
1400
	GM_GPSR_DUPLEX		= 1<<14, /* Bit 14:	Duplex Mode (1 = Full) */
1401
	GM_GPSR_FC_TX_DIS	= 1<<13, /* Bit 13:	Tx Flow-Control Mode Disabled */
1402
	GM_GPSR_LINK_UP		= 1<<12, /* Bit 12:	Link Up Status */
1403
	GM_GPSR_PAUSE		= 1<<11, /* Bit 11:	Pause State */
1404
	GM_GPSR_TX_ACTIVE	= 1<<10, /* Bit 10:	Tx in Progress */
1405
	GM_GPSR_EXC_COL		= 1<<9,	/* Bit  9:	Excessive Collisions Occured */
1406
	GM_GPSR_LAT_COL		= 1<<8,	/* Bit  8:	Late Collisions Occured */
1407
1408
	GM_GPSR_PHY_ST_CH	= 1<<5,	/* Bit  5:	PHY Status Change */
1409
	GM_GPSR_GIG_SPEED	= 1<<4,	/* Bit  4:	Gigabit Speed (1 = 1000 Mbps) */
1410
	GM_GPSR_PART_MODE	= 1<<3,	/* Bit  3:	Partition mode */
1411
	GM_GPSR_FC_RX_DIS	= 1<<2,	/* Bit  2:	Rx Flow-Control Mode Disabled */
1412
	GM_GPSR_PROM_EN		= 1<<1,	/* Bit  1:	Promiscuous Mode Enabled */
1413
};
1414
1415
/*	GM_GP_CTRL	16 bit r/w	General Purpose Control Register */
1416
enum {
1417
	GM_GPCR_PROM_ENA	= 1<<14,	/* Bit 14:	Enable Promiscuous Mode */
1418
	GM_GPCR_FC_TX_DIS	= 1<<13, /* Bit 13:	Disable Tx Flow-Control Mode */
1419
	GM_GPCR_TX_ENA		= 1<<12, /* Bit 12:	Enable Transmit */
1420
	GM_GPCR_RX_ENA		= 1<<11, /* Bit 11:	Enable Receive */
1421
	GM_GPCR_BURST_ENA	= 1<<10, /* Bit 10:	Enable Burst Mode */
1422
	GM_GPCR_LOOP_ENA	= 1<<9,	/* Bit  9:	Enable MAC Loopback Mode */
1423
	GM_GPCR_PART_ENA	= 1<<8,	/* Bit  8:	Enable Partition Mode */
1424
	GM_GPCR_GIGS_ENA	= 1<<7,	/* Bit  7:	Gigabit Speed (1000 Mbps) */
1425
	GM_GPCR_FL_PASS		= 1<<6,	/* Bit  6:	Force Link Pass */
1426
	GM_GPCR_DUP_FULL	= 1<<5,	/* Bit  5:	Full Duplex Mode */
1427
	GM_GPCR_FC_RX_DIS	= 1<<4,	/* Bit  4:	Disable Rx Flow-Control Mode */
1428
	GM_GPCR_SPEED_100	= 1<<3,   /* Bit  3:	Port Speed 100 Mbps */
1429
	GM_GPCR_AU_DUP_DIS	= 1<<2,	/* Bit  2:	Disable Auto-Update Duplex */
1430
	GM_GPCR_AU_FCT_DIS	= 1<<1,	/* Bit  1:	Disable Auto-Update Flow-C. */
1431
	GM_GPCR_AU_SPD_DIS	= 1<<0,	/* Bit  0:	Disable Auto-Update Speed */
1432
};
1433
1434
#define GM_GPCR_SPEED_1000	(GM_GPCR_GIGS_ENA | GM_GPCR_SPEED_100)
1435
#define GM_GPCR_AU_ALL_DIS	(GM_GPCR_AU_DUP_DIS | GM_GPCR_AU_FCT_DIS|GM_GPCR_AU_SPD_DIS)
1436
1437
/*	GM_TX_CTRL			16 bit r/w	Transmit Control Register */
1438
enum {
1439
	GM_TXCR_FORCE_JAM	= 1<<15, /* Bit 15:	Force Jam / Flow-Control */
1440
	GM_TXCR_CRC_DIS		= 1<<14, /* Bit 14:	Disable insertion of CRC */
1441
	GM_TXCR_PAD_DIS		= 1<<13, /* Bit 13:	Disable padding of packets */
1442
	GM_TXCR_COL_THR_MSK	= 1<<10, /* Bit 12..10:	Collision Threshold */
1443
};
1444
1445
#define TX_COL_THR(x)		(((x)<<10) & GM_TXCR_COL_THR_MSK)
1446
#define TX_COL_DEF		0x04
1447
1448
/*	GM_RX_CTRL			16 bit r/w	Receive Control Register */
1449
enum {
1450
	GM_RXCR_UCF_ENA	= 1<<15, /* Bit 15:	Enable Unicast filtering */
1451
	GM_RXCR_MCF_ENA	= 1<<14, /* Bit 14:	Enable Multicast filtering */
1452
	GM_RXCR_CRC_DIS	= 1<<13, /* Bit 13:	Remove 4-byte CRC */
1453
	GM_RXCR_PASS_FC	= 1<<12, /* Bit 12:	Pass FC packets to FIFO */
1454
};
1455
1456
/*	GM_TX_PARAM		16 bit r/w	Transmit Parameter Register */
1457
enum {
1458
	GM_TXPA_JAMLEN_MSK	= 0x03<<14,	/* Bit 15..14:	Jam Length */
1459
	GM_TXPA_JAMIPG_MSK	= 0x1f<<9,	/* Bit 13..9:	Jam IPG */
1460
	GM_TXPA_JAMDAT_MSK	= 0x1f<<4,	/* Bit  8..4:	IPG Jam to Data */
1461
	GM_TXPA_BO_LIM_MSK	= 0x0f,		/* Bit  3.. 0: Backoff Limit Mask */
1462
1463
	TX_JAM_LEN_DEF		= 0x03,
1464
	TX_JAM_IPG_DEF		= 0x0b,
1465
	TX_IPG_JAM_DEF		= 0x1c,
1466
	TX_BOF_LIM_DEF		= 0x04,
1467
};
1468
1469
#define TX_JAM_LEN_VAL(x)	(((x)<<14) & GM_TXPA_JAMLEN_MSK)
1470
#define TX_JAM_IPG_VAL(x)	(((x)<<9)  & GM_TXPA_JAMIPG_MSK)
1471
#define TX_IPG_JAM_DATA(x)	(((x)<<4)  & GM_TXPA_JAMDAT_MSK)
1472
#define TX_BACK_OFF_LIM(x)	((x) & GM_TXPA_BO_LIM_MSK)
1473
1474
1475
/*	GM_SERIAL_MODE			16 bit r/w	Serial Mode Register */
1476
enum {
1477
	GM_SMOD_DATABL_MSK	= 0x1f<<11, /* Bit 15..11:	Data Blinder (r/o) */
1478
	GM_SMOD_LIMIT_4		= 1<<10, /* Bit 10:	4 consecutive Tx trials */
1479
	GM_SMOD_VLAN_ENA	= 1<<9,	/* Bit  9:	Enable VLAN  (Max. Frame Len) */
1480
	GM_SMOD_JUMBO_ENA	= 1<<8,	/* Bit  8:	Enable Jumbo (Max. Frame Len) */
1481
	 GM_SMOD_IPG_MSK	= 0x1f	/* Bit 4..0:	Inter-Packet Gap (IPG) */
1482
};
1483
1484
#define DATA_BLIND_VAL(x)	(((x)<<11) & GM_SMOD_DATABL_MSK)
1485
#define DATA_BLIND_DEF		0x04
1486
1487
#define IPG_DATA_VAL(x)		(x & GM_SMOD_IPG_MSK)
1488
#define IPG_DATA_DEF		0x1e
1489
1490
/*	GM_SMI_CTRL			16 bit r/w	SMI Control Register */
1491
enum {
1492
	GM_SMI_CT_PHY_A_MSK	= 0x1f<<11,/* Bit 15..11:	PHY Device Address */
1493
	GM_SMI_CT_REG_A_MSK	= 0x1f<<6,/* Bit 10.. 6:	PHY Register Address */
1494
	GM_SMI_CT_OP_RD		= 1<<5,	/* Bit  5:	OpCode Read (0=Write)*/
1495
	GM_SMI_CT_RD_VAL	= 1<<4,	/* Bit  4:	Read Valid (Read completed) */
1496
	GM_SMI_CT_BUSY		= 1<<3,	/* Bit  3:	Busy (Operation in progress) */
1497
};
1498
1499
#define GM_SMI_CT_PHY_AD(x)	(((x)<<11) & GM_SMI_CT_PHY_A_MSK)
1500
#define GM_SMI_CT_REG_AD(x)	(((x)<<6) & GM_SMI_CT_REG_A_MSK)
1501
1502
/*	GM_PHY_ADDR				16 bit r/w	GPHY Address Register */
1503
enum {
1504
	GM_PAR_MIB_CLR	= 1<<5,	/* Bit  5:	Set MIB Clear Counter Mode */
1505
	GM_PAR_MIB_TST	= 1<<4,	/* Bit  4:	MIB Load Counter (Test Mode) */
1506
};
1507
1508
/* Receive Frame Status Encoding */
1509
enum {
1510
	GMR_FS_LEN	= 0xffff<<16, /* Bit 31..16:	Rx Frame Length */
1511
	GMR_FS_VLAN	= 1<<13, /* VLAN Packet */
1512
	GMR_FS_JABBER	= 1<<12, /* Jabber Packet */
1513
	GMR_FS_UN_SIZE	= 1<<11, /* Undersize Packet */
1514
	GMR_FS_MC	= 1<<10, /* Multicast Packet */
1515
	GMR_FS_BC	= 1<<9,  /* Broadcast Packet */
1516
	GMR_FS_RX_OK	= 1<<8,  /* Receive OK (Good Packet) */
1517
	GMR_FS_GOOD_FC	= 1<<7,  /* Good Flow-Control Packet */
1518
	GMR_FS_BAD_FC	= 1<<6,  /* Bad  Flow-Control Packet */
1519
	GMR_FS_MII_ERR	= 1<<5,  /* MII Error */
1520
	GMR_FS_LONG_ERR	= 1<<4,  /* Too Long Packet */
1521
	GMR_FS_FRAGMENT	= 1<<3,  /* Fragment */
1522
1523
	GMR_FS_CRC_ERR	= 1<<1,  /* CRC Error */
1524
	GMR_FS_RX_FF_OV	= 1<<0,  /* Rx FIFO Overflow */
1525
1526
	GMR_FS_ANY_ERR	= GMR_FS_RX_FF_OV | GMR_FS_CRC_ERR |
1527
			  GMR_FS_FRAGMENT | GMR_FS_LONG_ERR |
1528
		  	  GMR_FS_MII_ERR | GMR_FS_BAD_FC | GMR_FS_GOOD_FC |
1529
			  GMR_FS_UN_SIZE | GMR_FS_JABBER,
1530
};
1531
1532
/*	RX_GMF_CTRL_T	32 bit	Rx GMAC FIFO Control/Test */
1533
enum {
1534
	RX_TRUNC_ON	= 1<<27,  	/* enable  packet truncation */
1535
	RX_TRUNC_OFF	= 1<<26, 	/* disable packet truncation */
1536
	RX_VLAN_STRIP_ON = 1<<25,	/* enable  VLAN stripping */
1537
	RX_VLAN_STRIP_OFF = 1<<24,	/* disable VLAN stripping */
1538
1539
	GMF_WP_TST_ON	= 1<<14,	/* Write Pointer Test On */
1540
	GMF_WP_TST_OFF	= 1<<13,	/* Write Pointer Test Off */
1541
	GMF_WP_STEP	= 1<<12,	/* Write Pointer Step/Increment */
1542
1543
	GMF_RP_TST_ON	= 1<<10,	/* Read Pointer Test On */
1544
	GMF_RP_TST_OFF	= 1<<9,		/* Read Pointer Test Off */
1545
	GMF_RP_STEP	= 1<<8,		/* Read Pointer Step/Increment */
1546
	GMF_RX_F_FL_ON	= 1<<7,		/* Rx FIFO Flush Mode On */
1547
	GMF_RX_F_FL_OFF	= 1<<6,		/* Rx FIFO Flush Mode Off */
1548
	GMF_CLI_RX_FO	= 1<<5,		/* Clear IRQ Rx FIFO Overrun */
1549
	GMF_CLI_RX_C	= 1<<4,		/* Clear IRQ Rx Frame Complete */
1550
1551
	GMF_OPER_ON	= 1<<3,		/* Operational Mode On */
1552
	GMF_OPER_OFF	= 1<<2,		/* Operational Mode Off */
1553
	GMF_RST_CLR	= 1<<1,		/* Clear GMAC FIFO Reset */
1554
	GMF_RST_SET	= 1<<0,		/* Set   GMAC FIFO Reset */
1555
1556
	RX_GMF_FL_THR_DEF = 0xa,	/* flush threshold (default) */
1557
1558
	GMF_RX_CTRL_DEF	= GMF_OPER_ON | GMF_RX_F_FL_ON,
1559
};
1560
1561
1562
/*	TX_GMF_CTRL_T	32 bit	Tx GMAC FIFO Control/Test */
1563
enum {
1564
	TX_STFW_DIS	= 1<<31,/* Disable Store & Forward (Yukon-EC Ultra) */
1565
	TX_STFW_ENA	= 1<<30,/* Enable  Store & Forward (Yukon-EC Ultra) */
1566
1567
	TX_VLAN_TAG_ON	= 1<<25,/* enable  VLAN tagging */
1568
	TX_VLAN_TAG_OFF	= 1<<24,/* disable VLAN tagging */
1569
1570
	GMF_WSP_TST_ON	= 1<<18,/* Write Shadow Pointer Test On */
1571
	GMF_WSP_TST_OFF	= 1<<17,/* Write Shadow Pointer Test Off */
1572
	GMF_WSP_STEP	= 1<<16,/* Write Shadow Pointer Step/Increment */
1573
1574
	GMF_CLI_TX_FU	= 1<<6,	/* Clear IRQ Tx FIFO Underrun */
1575
	GMF_CLI_TX_FC	= 1<<5,	/* Clear IRQ Tx Frame Complete */
1576
	GMF_CLI_TX_PE	= 1<<4,	/* Clear IRQ Tx Parity Error */
1577
};
1578
1579
/*	GMAC_TI_ST_CTRL	 8 bit	Time Stamp Timer Ctrl Reg (YUKON only) */
1580
enum {
1581
	GMT_ST_START	= 1<<2,	/* Start Time Stamp Timer */
1582
	GMT_ST_STOP	= 1<<1,	/* Stop  Time Stamp Timer */
1583
	GMT_ST_CLR_IRQ	= 1<<0,	/* Clear Time Stamp Timer IRQ */
1584
};
1585
1586
/* B28_Y2_ASF_STAT_CMD		32 bit	ASF Status and Command Reg */
1587
enum {
1588
	Y2_ASF_OS_PRES	= 1<<4,	/* ASF operation system present */
1589
	Y2_ASF_RESET	= 1<<3,	/* ASF system in reset state */
1590
	Y2_ASF_RUNNING	= 1<<2,	/* ASF system operational */
1591
	Y2_ASF_CLR_HSTI = 1<<1,	/* Clear ASF IRQ */
1592
	Y2_ASF_IRQ	= 1<<0,	/* Issue an IRQ to ASF system */
1593
1594
	Y2_ASF_UC_STATE = 3<<2,	/* ASF uC State */
1595
	Y2_ASF_CLK_HALT	= 0,	/* ASF system clock stopped */
1596
};
1597
1598
/* B28_Y2_ASF_HOST_COM	32 bit	ASF Host Communication Reg */
1599
enum {
1600
	Y2_ASF_CLR_ASFI = 1<<1,	/* Clear host IRQ */
1601
	Y2_ASF_HOST_IRQ = 1<<0,	/* Issue an IRQ to HOST system */
1602
};
1603
1604
/*	STAT_CTRL		32 bit	Status BMU control register (Yukon-2 only) */
1605
enum {
1606
	SC_STAT_CLR_IRQ	= 1<<4,	/* Status Burst IRQ clear */
1607
	SC_STAT_OP_ON	= 1<<3,	/* Operational Mode On */
1608
	SC_STAT_OP_OFF	= 1<<2,	/* Operational Mode Off */
1609
	SC_STAT_RST_CLR	= 1<<1,	/* Clear Status Unit Reset (Enable) */
1610
	SC_STAT_RST_SET	= 1<<0,	/* Set   Status Unit Reset */
1611
};
1612
1613
/*	GMAC_CTRL		32 bit	GMAC Control Reg (YUKON only) */
1614
enum {
1615
	GMC_H_BURST_ON	= 1<<7,	/* Half Duplex Burst Mode On */
1616
	GMC_H_BURST_OFF	= 1<<6,	/* Half Duplex Burst Mode Off */
1617
	GMC_F_LOOPB_ON	= 1<<5,	/* FIFO Loopback On */
1618
	GMC_F_LOOPB_OFF	= 1<<4,	/* FIFO Loopback Off */
1619
	GMC_PAUSE_ON	= 1<<3,	/* Pause On */
1620
	GMC_PAUSE_OFF	= 1<<2,	/* Pause Off */
1621
	GMC_RST_CLR	= 1<<1,	/* Clear GMAC Reset */
1622
	GMC_RST_SET	= 1<<0,	/* Set   GMAC Reset */
1623
};
1624
1625
/*	GPHY_CTRL		32 bit	GPHY Control Reg (YUKON only) */
1626
enum {
1627
	GPC_SEL_BDT	= 1<<28, /* Select Bi-Dir. Transfer for MDC/MDIO */
1628
	GPC_INT_POL_HI	= 1<<27, /* IRQ Polarity is Active HIGH */
1629
	GPC_75_OHM	= 1<<26, /* Use 75 Ohm Termination instead of 50 */
1630
	GPC_DIS_FC	= 1<<25, /* Disable Automatic Fiber/Copper Detection */
1631
	GPC_DIS_SLEEP	= 1<<24, /* Disable Energy Detect */
1632
	GPC_HWCFG_M_3	= 1<<23, /* HWCFG_MODE[3] */
1633
	GPC_HWCFG_M_2	= 1<<22, /* HWCFG_MODE[2] */
1634
	GPC_HWCFG_M_1	= 1<<21, /* HWCFG_MODE[1] */
1635
	GPC_HWCFG_M_0	= 1<<20, /* HWCFG_MODE[0] */
1636
	GPC_ANEG_0	= 1<<19, /* ANEG[0] */
1637
	GPC_ENA_XC	= 1<<18, /* Enable MDI crossover */
1638
	GPC_DIS_125	= 1<<17, /* Disable 125 MHz clock */
1639
	GPC_ANEG_3	= 1<<16, /* ANEG[3] */
1640
	GPC_ANEG_2	= 1<<15, /* ANEG[2] */
1641
	GPC_ANEG_1	= 1<<14, /* ANEG[1] */
1642
	GPC_ENA_PAUSE	= 1<<13, /* Enable Pause (SYM_OR_REM) */
1643
	GPC_PHYADDR_4	= 1<<12, /* Bit 4 of Phy Addr */
1644
	GPC_PHYADDR_3	= 1<<11, /* Bit 3 of Phy Addr */
1645
	GPC_PHYADDR_2	= 1<<10, /* Bit 2 of Phy Addr */
1646
	GPC_PHYADDR_1	= 1<<9,	 /* Bit 1 of Phy Addr */
1647
	GPC_PHYADDR_0	= 1<<8,	 /* Bit 0 of Phy Addr */
1648
						/* Bits  7..2:	reserved */
1649
	GPC_RST_CLR	= 1<<1,	/* Clear GPHY Reset */
1650
	GPC_RST_SET	= 1<<0,	/* Set   GPHY Reset */
1651
};
1652
1653
/*	GMAC_IRQ_SRC	 8 bit	GMAC Interrupt Source Reg (YUKON only) */
1654
/*	GMAC_IRQ_MSK	 8 bit	GMAC Interrupt Mask   Reg (YUKON only) */
1655
enum {
1656
	GM_IS_TX_CO_OV	= 1<<5,	/* Transmit Counter Overflow IRQ */
1657
	GM_IS_RX_CO_OV	= 1<<4,	/* Receive Counter Overflow IRQ */
1658
	GM_IS_TX_FF_UR	= 1<<3,	/* Transmit FIFO Underrun */
1659
	GM_IS_TX_COMPL	= 1<<2,	/* Frame Transmission Complete */
1660
	GM_IS_RX_FF_OR	= 1<<1,	/* Receive FIFO Overrun */
1661
	GM_IS_RX_COMPL	= 1<<0,	/* Frame Reception Complete */
1662
1663
#define GMAC_DEF_MSK     GM_IS_TX_FF_UR
1664
1665
/*	GMAC_LINK_CTRL	16 bit	GMAC Link Control Reg (YUKON only) */
1666
						/* Bits 15.. 2:	reserved */
1667
	GMLC_RST_CLR	= 1<<1,	/* Clear GMAC Link Reset */
1668
	GMLC_RST_SET	= 1<<0,	/* Set   GMAC Link Reset */
1669
1670
1671
/*	WOL_CTRL_STAT	16 bit	WOL Control/Status Reg */
1672
	WOL_CTL_LINK_CHG_OCC		= 1<<15,
1673
	WOL_CTL_MAGIC_PKT_OCC		= 1<<14,
1674
	WOL_CTL_PATTERN_OCC		= 1<<13,
1675
	WOL_CTL_CLEAR_RESULT		= 1<<12,
1676
	WOL_CTL_ENA_PME_ON_LINK_CHG	= 1<<11,
1677
	WOL_CTL_DIS_PME_ON_LINK_CHG	= 1<<10,
1678
	WOL_CTL_ENA_PME_ON_MAGIC_PKT	= 1<<9,
1679
	WOL_CTL_DIS_PME_ON_MAGIC_PKT	= 1<<8,
1680
	WOL_CTL_ENA_PME_ON_PATTERN	= 1<<7,
1681
	WOL_CTL_DIS_PME_ON_PATTERN	= 1<<6,
1682
	WOL_CTL_ENA_LINK_CHG_UNIT	= 1<<5,
1683
	WOL_CTL_DIS_LINK_CHG_UNIT	= 1<<4,
1684
	WOL_CTL_ENA_MAGIC_PKT_UNIT	= 1<<3,
1685
	WOL_CTL_DIS_MAGIC_PKT_UNIT	= 1<<2,
1686
	WOL_CTL_ENA_PATTERN_UNIT	= 1<<1,
1687
	WOL_CTL_DIS_PATTERN_UNIT	= 1<<0,
1688
};
1689
1690
#define WOL_CTL_DEFAULT				\
1691
	(WOL_CTL_DIS_PME_ON_LINK_CHG |	\
1692
	WOL_CTL_DIS_PME_ON_PATTERN |	\
1693
	WOL_CTL_DIS_PME_ON_MAGIC_PKT |	\
1694
	WOL_CTL_DIS_LINK_CHG_UNIT |		\
1695
	WOL_CTL_DIS_PATTERN_UNIT |		\
1696
	WOL_CTL_DIS_MAGIC_PKT_UNIT)
1697
1698
/*	WOL_MATCH_CTL	 8 bit	WOL Match Control Reg */
1699
#define WOL_CTL_PATT_ENA(x)	(1 << (x))
1700
1701
1702
/* Control flags */
1703
enum {
1704
	UDPTCP	= 1<<0,
1705
	CALSUM	= 1<<1,
1706
	WR_SUM	= 1<<2,
1707
	INIT_SUM= 1<<3,
1708
	LOCK_SUM= 1<<4,
1709
	INS_VLAN= 1<<5,
1710
	FRC_STAT= 1<<6,
1711
	EOP	= 1<<7,
1712
};
1713
1714
enum {
1715
	HW_OWNER 	= 1<<7,
1716
	OP_TCPWRITE	= 0x11,
1717
	OP_TCPSTART	= 0x12,
1718
	OP_TCPINIT	= 0x14,
1719
	OP_TCPLCK	= 0x18,
1720
	OP_TCPCHKSUM	= OP_TCPSTART,
1721
	OP_TCPIS	= OP_TCPINIT | OP_TCPSTART,
1722
	OP_TCPLW	= OP_TCPLCK | OP_TCPWRITE,
1723
	OP_TCPLSW	= OP_TCPLCK | OP_TCPSTART | OP_TCPWRITE,
1724
	OP_TCPLISW	= OP_TCPLCK | OP_TCPINIT | OP_TCPSTART | OP_TCPWRITE,
1725
1726
	OP_ADDR64	= 0x21,
1727
	OP_VLAN		= 0x22,
1728
	OP_ADDR64VLAN	= OP_ADDR64 | OP_VLAN,
1729
	OP_LRGLEN	= 0x24,
1730
	OP_LRGLENVLAN	= OP_LRGLEN | OP_VLAN,
1731
	OP_BUFFER	= 0x40,
1732
	OP_PACKET	= 0x41,
1733
	OP_LARGESEND	= 0x43,
1734
1735
/* YUKON-2 STATUS opcodes defines */
1736
	OP_RXSTAT	= 0x60,
1737
	OP_RXTIMESTAMP	= 0x61,
1738
	OP_RXVLAN	= 0x62,
1739
	OP_RXCHKS	= 0x64,
1740
	OP_RXCHKSVLAN	= OP_RXCHKS | OP_RXVLAN,
1741
	OP_RXTIMEVLAN	= OP_RXTIMESTAMP | OP_RXVLAN,
1742
	OP_RSS_HASH	= 0x65,
1743
	OP_TXINDEXLE	= 0x68,
1744
};
1745
1746
/* Yukon 2 hardware interface
1747
 * Not tested on big endian
1748
 */
1749
struct sky2_tx_le {
1750
	union {
1751
		__le32	addr;
1752
		struct {
1753
			__le16	offset;
1754
			__le16	start;
1755
		} csum  __attribute((packed));
1756
		struct {
1757
			__le16	size;
1758
			__le16	rsvd;
1759
		} tso  __attribute((packed));
1760
	} tx;
1761
	__le16	length;	/* also vlan tag or checksum start */
1762
	u8	ctrl;
1763
	u8	opcode;
1764
} __attribute((packed));
1765
1766
struct sky2_rx_le {
1767
	__le32	addr;
1768
	__le16	length;
1769
	u8	ctrl;
1770
	u8	opcode;
1771
} __attribute((packed));;
1772
1773
struct sky2_status_le {
1774
	__le32	status;	/* also checksum */
1775
	__le16	length;	/* also vlan tag */
1776
	u8	link;
1777
	u8	opcode;
1778
} __attribute((packed));
1779
1780
struct tx_ring_info {
1781
	struct sk_buff	*skb;
1782
	DECLARE_PCI_UNMAP_ADDR(mapaddr);
1783
	u16		idx;
1784
};
1785
1786
struct ring_info {
1787
	struct sk_buff	*skb;
1788
	dma_addr_t	mapaddr;
1789
};
1790
1791
struct sky2_port {
1792
	struct sky2_hw	     *hw;
1793
	struct net_device    *netdev;
1794
	unsigned	     port;
1795
	u32		     msg_enable;
1796
1797
	spinlock_t	     tx_lock  ____cacheline_aligned_in_smp;
1798
	struct tx_ring_info  *tx_ring;
1799
	struct sky2_tx_le    *tx_le;
1800
	u16		     tx_cons;		/* next le to check */
1801
	u16		     tx_prod;		/* next le to use */
1802
	u32		     tx_addr64;
1803
	u16		     tx_pending;
1804
	u16		     tx_last_put;
1805
	u16		     tx_last_mss;
1806
1807
	struct ring_info     *rx_ring ____cacheline_aligned_in_smp;
1808
	struct sky2_rx_le    *rx_le;
1809
	u32		     rx_addr64;
1810
	u16		     rx_next;		/* next re to check */
1811
	u16		     rx_put;		/* next le index to use */
1812
	u16		     rx_pending;
1813
	u16		     rx_last_put;
1814
	u16		     rx_bufsize;
1815
#ifdef SKY2_VLAN_TAG_USED
1816
	u16		     rx_tag;
1817
	struct vlan_group    *vlgrp;
1818
#endif
1819
1820
	dma_addr_t	     rx_le_map;
1821
	dma_addr_t	     tx_le_map;
1822
	u32		     advertising;	/* ADVERTISED_ bits */
1823
	u16		     speed;	/* SPEED_1000, SPEED_100, ... */
1824
	u8		     autoneg;	/* AUTONEG_ENABLE, AUTONEG_DISABLE */
1825
	u8		     duplex;	/* DUPLEX_HALF, DUPLEX_FULL */
1826
	u8		     rx_pause;
1827
	u8		     tx_pause;
1828
	u8		     rx_csum;
1829
	u8		     wol;
1830
1831
	struct net_device_stats net_stats;
1832
1833
	struct work_struct   phy_task;
1834
	struct semaphore     phy_sema;
1835
};
1836
1837
struct sky2_hw {
1838
	void __iomem  	     *regs;
1839
	struct pci_dev	     *pdev;
1840
	u32		     intr_mask;
1841
	struct net_device    *dev[2];
1842
1843
	int		     pm_cap;
1844
	u8	     	     chip_id;
1845
	u8		     chip_rev;
1846
	u8		     copper;
1847
	u8		     ports;
1848
1849
	struct sky2_status_le *st_le;
1850
	u32		     st_idx;
1851
	dma_addr_t   	     st_dma;
1852
};
1853
1854
/* Register accessor for memory mapped device */
1855
static inline u32 sky2_read32(const struct sky2_hw *hw, unsigned reg)
1856
{
1857
	return readl(hw->regs + reg);
1858
}
1859
1860
static inline u16 sky2_read16(const struct sky2_hw *hw, unsigned reg)
1861
{
1862
	return readw(hw->regs + reg);
1863
}
1864
1865
static inline u8 sky2_read8(const struct sky2_hw *hw, unsigned reg)
1866
{
1867
	return readb(hw->regs + reg);
1868
}
1869
1870
/* This should probably go away, bus based tweeks suck */
1871
static inline int is_pciex(const struct sky2_hw *hw)
1872
{
1873
	u32 status;
1874
	pci_read_config_dword(hw->pdev, PCI_DEV_STATUS, &status);
1875
	return (status & PCI_OS_PCI_X) == 0;
1876
}
1877
1878
static inline void sky2_write32(const struct sky2_hw *hw, unsigned reg, u32 val)
1879
{
1880
	writel(val, hw->regs + reg);
1881
}
1882
1883
static inline void sky2_write16(const struct sky2_hw *hw, unsigned reg, u16 val)
1884
{
1885
	writew(val, hw->regs + reg);
1886
}
1887
1888
static inline void sky2_write8(const struct sky2_hw *hw, unsigned reg, u8 val)
1889
{
1890
	writeb(val, hw->regs + reg);
1891
}
1892
1893
/* Yukon PHY related registers */
1894
#define SK_GMAC_REG(port,reg) \
1895
	(BASE_GMAC_1 + (port) * (BASE_GMAC_2-BASE_GMAC_1) + (reg))
1896
#define GM_PHY_RETRIES	100
1897
1898
static inline u16 gma_read16(const struct sky2_hw *hw, unsigned port, unsigned reg)
1899
{
1900
	return sky2_read16(hw, SK_GMAC_REG(port,reg));
1901
}
1902
1903
static inline u32 gma_read32(struct sky2_hw *hw, unsigned port, unsigned reg)
1904
{
1905
	unsigned base = SK_GMAC_REG(port, reg);
1906
	return (u32) sky2_read16(hw, base)
1907
		| (u32) sky2_read16(hw, base+4) << 16;
1908
}
1909
1910
static inline void gma_write16(const struct sky2_hw *hw, unsigned port, int r, u16 v)
1911
{
1912
	sky2_write16(hw, SK_GMAC_REG(port,r), v);
1913
}
1914
1915
static inline void gma_set_addr(struct sky2_hw *hw, unsigned port, unsigned reg,
1916
				    const u8 *addr)
1917
{
1918
	gma_write16(hw, port, reg,  (u16) addr[0] | ((u16) addr[1] << 8));
1919
	gma_write16(hw, port, reg+4,(u16) addr[2] | ((u16) addr[3] << 8));
1920
	gma_write16(hw, port, reg+8,(u16) addr[4] | ((u16) addr[5] << 8));
1921
}
1922
#endif
(-)linux-2.6.15/drivers/net/Makefile (+1 lines)
Lines 59-64 spidernet-y += spider_net.o spider_net_e Link Here
59
obj-$(CONFIG_SPIDER_NET) += spidernet.o
59
obj-$(CONFIG_SPIDER_NET) += spidernet.o
60
obj-$(CONFIG_TC35815) += tc35815.o
60
obj-$(CONFIG_TC35815) += tc35815.o
61
obj-$(CONFIG_SKGE) += skge.o
61
obj-$(CONFIG_SKGE) += skge.o
62
obj-$(CONFIG_SKY2) += sky2.o
62
obj-$(CONFIG_SK98LIN) += sk98lin/
63
obj-$(CONFIG_SK98LIN) += sk98lin/
63
obj-$(CONFIG_SKFP) += skfp/
64
obj-$(CONFIG_SKFP) += skfp/
64
obj-$(CONFIG_VIA_RHINE) += via-rhine.o
65
obj-$(CONFIG_VIA_RHINE) += via-rhine.o
(-)linux-2.6.15/drivers/net/Kconfig (-1 / +11 lines)
Lines 2008-2014 config SKGE Link Here
2008
2008
2009
	  It does not support the link failover and network management 
2009
	  It does not support the link failover and network management 
2010
	  features that "portable" vendor supplied sk98lin driver does.
2010
	  features that "portable" vendor supplied sk98lin driver does.
2011
	
2011
2012
config SKY2
2013
	tristate "SysKonnect Yukon2 support (EXPERIMENTAL)"
2014
	depends on PCI && EXPERIMENTAL
2015
	select CRC32
2016
	---help---
2017
	  This driver support the Marvell Yukon 2 Gigabit Ethernet adapter.
2018
2019
	  To compile this driver as a module, choose M here: the module
2020
	  will be called sky2.  This is recommended.
2021
2012
config SK98LIN
2022
config SK98LIN
2013
	tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support"
2023
	tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support"
2014
	depends on PCI
2024
	depends on PCI
(-)linux-2.6.15/include/linux/netdevice.h (-3 / +7 lines)
Lines 801-812 static inline u32 netif_msg_init(int deb Link Here
801
	return (1 << debug_value) - 1;
801
	return (1 << debug_value) - 1;
802
}
802
}
803
803
804
/* Schedule rx intr now? */
804
/* Test if receive needs to be scheduled */
805
static inline int __netif_rx_schedule_prep(struct net_device *dev)
806
{
807
	return !test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state);
808
}
805
809
810
/* Test if receive needs to be scheduled but only if up */
806
static inline int netif_rx_schedule_prep(struct net_device *dev)
811
static inline int netif_rx_schedule_prep(struct net_device *dev)
807
{
812
{
808
	return netif_running(dev) &&
813
	return netif_running(dev) && __netif_rx_schedule_prep(dev);
809
		!test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state);
810
}
814
}
811
815
812
/* Add interface to tail of rx poll list. This assumes that _prep has
816
/* Add interface to tail of rx poll list. This assumes that _prep has

Return to bug 119771