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 (+3315 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.13"
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;
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
/* Assign Ram Buffer allocation.
629
 * start and end are in units of 4k bytes
630
 * ram registers are in units of 64bit words
631
 */
632
static void sky2_ramset(struct sky2_hw *hw, u16 q, u8 startk, u8 endk)
633
{
634
	u32 start, end;
635
636
	start = startk * 4096/8;
637
	end = (endk * 4096/8) - 1;
638
639
	sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR);
640
	sky2_write32(hw, RB_ADDR(q, RB_START), start);
641
	sky2_write32(hw, RB_ADDR(q, RB_END), end);
642
	sky2_write32(hw, RB_ADDR(q, RB_WP), start);
643
	sky2_write32(hw, RB_ADDR(q, RB_RP), start);
644
645
	if (q == Q_R1 || q == Q_R2) {
646
		u32 space = (endk - startk) * 4096/8;
647
		u32 tp = space - space/4;
648
649
		/* On receive queue's set the thresholds
650
		 * give receiver priority when > 3/4 full
651
		 * send pause when down to 2K
652
		 */
653
		sky2_write32(hw, RB_ADDR(q, RB_RX_UTHP), tp);
654
		sky2_write32(hw, RB_ADDR(q, RB_RX_LTHP), space/2);
655
656
		tp = space - 2048/8;
657
		sky2_write32(hw, RB_ADDR(q, RB_RX_UTPP), tp);
658
		sky2_write32(hw, RB_ADDR(q, RB_RX_LTPP), space/4);
659
	} else {
660
		/* Enable store & forward on Tx queue's because
661
		 * Tx FIFO is only 1K on Yukon
662
		 */
663
		sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_STFWD);
664
	}
665
666
	sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_OP_MD);
667
	sky2_read8(hw, RB_ADDR(q, RB_CTRL));
668
}
669
670
/* Setup Bus Memory Interface */
671
static void sky2_qset(struct sky2_hw *hw, u16 q)
672
{
673
	sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_CLR_RESET);
674
	sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_OPER_INIT);
675
	sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_FIFO_OP_ON);
676
	sky2_write32(hw, Q_ADDR(q, Q_WM),  BMU_WM_DEFAULT);
677
}
678
679
/* Setup prefetch unit registers. This is the interface between
680
 * hardware and driver list elements
681
 */
682
static void sky2_prefetch_init(struct sky2_hw *hw, u32 qaddr,
683
				      u64 addr, u32 last)
684
{
685
	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
686
	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL), PREF_UNIT_RST_CLR);
687
	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_ADDR_HI), addr >> 32);
688
	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_ADDR_LO), (u32) addr);
689
	sky2_write16(hw, Y2_QADDR(qaddr, PREF_UNIT_LAST_IDX), last);
690
	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL), PREF_UNIT_OP_ON);
691
692
	sky2_read32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL));
693
}
694
695
static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2)
696
{
697
	struct sky2_tx_le *le = sky2->tx_le + sky2->tx_prod;
698
699
	sky2->tx_prod = (sky2->tx_prod + 1) % TX_RING_SIZE;
700
	return le;
701
}
702
703
/*
704
 * This is a workaround code taken from SysKonnect sk98lin driver
705
 * to deal with chip bug on Yukon EC rev 0 in the wraparound case.
706
 */
707
static void sky2_put_idx(struct sky2_hw *hw, unsigned q,
708
				u16 idx, u16 *last, u16 size)
709
{
710
	wmb();
711
	if (is_ec_a1(hw) && idx < *last) {
712
		u16 hwget = sky2_read16(hw, Y2_QADDR(q, PREF_UNIT_GET_IDX));
713
714
		if (hwget == 0) {
715
			/* Start prefetching again */
716
			sky2_write8(hw, Y2_QADDR(q, PREF_UNIT_FIFO_WM), 0xe0);
717
			goto setnew;
718
		}
719
720
		if (hwget == size - 1) {
721
			/* set watermark to one list element */
722
			sky2_write8(hw, Y2_QADDR(q, PREF_UNIT_FIFO_WM), 8);
723
724
			/* set put index to first list element */
725
			sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), 0);
726
		} else		/* have hardware go to end of list */
727
			sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX),
728
				     size - 1);
729
	} else {
730
setnew:
731
		sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), idx);
732
	}
733
	*last = idx;
734
	mmiowb();
735
}
736
737
738
static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2)
739
{
740
	struct sky2_rx_le *le = sky2->rx_le + sky2->rx_put;
741
	sky2->rx_put = (sky2->rx_put + 1) % RX_LE_SIZE;
742
	return le;
743
}
744
745
/* Return high part of DMA address (could be 32 or 64 bit) */
746
static inline u32 high32(dma_addr_t a)
747
{
748
	return sizeof(a) > sizeof(u32) ? (a >> 16) >> 16 : 0;
749
}
750
751
/* Build description to hardware about buffer */
752
static void sky2_rx_add(struct sky2_port *sky2, dma_addr_t map)
753
{
754
	struct sky2_rx_le *le;
755
	u32 hi = high32(map);
756
	u16 len = sky2->rx_bufsize;
757
758
	if (sky2->rx_addr64 != hi) {
759
		le = sky2_next_rx(sky2);
760
		le->addr = cpu_to_le32(hi);
761
		le->ctrl = 0;
762
		le->opcode = OP_ADDR64 | HW_OWNER;
763
		sky2->rx_addr64 = high32(map + len);
764
	}
765
766
	le = sky2_next_rx(sky2);
767
	le->addr = cpu_to_le32((u32) map);
768
	le->length = cpu_to_le16(len);
769
	le->ctrl = 0;
770
	le->opcode = OP_PACKET | HW_OWNER;
771
}
772
773
774
/* Tell chip where to start receive checksum.
775
 * Actually has two checksums, but set both same to avoid possible byte
776
 * order problems.
777
 */
778
static void rx_set_checksum(struct sky2_port *sky2)
779
{
780
	struct sky2_rx_le *le;
781
782
	le = sky2_next_rx(sky2);
783
	le->addr = (ETH_HLEN << 16) | ETH_HLEN;
784
	le->ctrl = 0;
785
	le->opcode = OP_TCPSTART | HW_OWNER;
786
787
	sky2_write32(sky2->hw,
788
		     Q_ADDR(rxqaddr[sky2->port], Q_CSR),
789
		     sky2->rx_csum ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
790
791
}
792
793
/*
794
 * The RX Stop command will not work for Yukon-2 if the BMU does not
795
 * reach the end of packet and since we can't make sure that we have
796
 * incoming data, we must reset the BMU while it is not doing a DMA
797
 * transfer. Since it is possible that the RX path is still active,
798
 * the RX RAM buffer will be stopped first, so any possible incoming
799
 * data will not trigger a DMA. After the RAM buffer is stopped, the
800
 * BMU is polled until any DMA in progress is ended and only then it
801
 * will be reset.
802
 */
803
static void sky2_rx_stop(struct sky2_port *sky2)
804
{
805
	struct sky2_hw *hw = sky2->hw;
806
	unsigned rxq = rxqaddr[sky2->port];
807
	int i;
808
809
	/* disable the RAM Buffer receive queue */
810
	sky2_write8(hw, RB_ADDR(rxq, RB_CTRL), RB_DIS_OP_MD);
811
812
	for (i = 0; i < 0xffff; i++)
813
		if (sky2_read8(hw, RB_ADDR(rxq, Q_RSL))
814
		    == sky2_read8(hw, RB_ADDR(rxq, Q_RL)))
815
			goto stopped;
816
817
	printk(KERN_WARNING PFX "%s: receiver stop failed\n",
818
	       sky2->netdev->name);
819
stopped:
820
	sky2_write32(hw, Q_ADDR(rxq, Q_CSR), BMU_RST_SET | BMU_FIFO_RST);
821
822
	/* reset the Rx prefetch unit */
823
	sky2_write32(hw, Y2_QADDR(rxq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
824
}
825
826
/* Clean out receive buffer area, assumes receiver hardware stopped */
827
static void sky2_rx_clean(struct sky2_port *sky2)
828
{
829
	unsigned i;
830
831
	memset(sky2->rx_le, 0, RX_LE_BYTES);
832
	for (i = 0; i < sky2->rx_pending; i++) {
833
		struct ring_info *re = sky2->rx_ring + i;
834
835
		if (re->skb) {
836
			pci_unmap_single(sky2->hw->pdev,
837
					 re->mapaddr, sky2->rx_bufsize,
838
					 PCI_DMA_FROMDEVICE);
839
			kfree_skb(re->skb);
840
			re->skb = NULL;
841
		}
842
	}
843
}
844
845
/* Basic MII support */
846
static int sky2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
847
{
848
	struct mii_ioctl_data *data = if_mii(ifr);
849
	struct sky2_port *sky2 = netdev_priv(dev);
850
	struct sky2_hw *hw = sky2->hw;
851
	int err = -EOPNOTSUPP;
852
853
	if (!netif_running(dev))
854
		return -ENODEV;	/* Phy still in reset */
855
856
	switch(cmd) {
857
	case SIOCGMIIPHY:
858
		data->phy_id = PHY_ADDR_MARV;
859
860
		/* fallthru */
861
	case SIOCGMIIREG: {
862
		u16 val = 0;
863
864
		down(&sky2->phy_sema);
865
		err = __gm_phy_read(hw, sky2->port, data->reg_num & 0x1f, &val);
866
		up(&sky2->phy_sema);
867
868
		data->val_out = val;
869
		break;
870
	}
871
872
	case SIOCSMIIREG:
873
		if (!capable(CAP_NET_ADMIN))
874
			return -EPERM;
875
876
		down(&sky2->phy_sema);
877
		err = gm_phy_write(hw, sky2->port, data->reg_num & 0x1f,
878
				   data->val_in);
879
		up(&sky2->phy_sema);
880
		break;
881
	}
882
	return err;
883
}
884
885
#ifdef SKY2_VLAN_TAG_USED
886
static void sky2_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
887
{
888
	struct sky2_port *sky2 = netdev_priv(dev);
889
	struct sky2_hw *hw = sky2->hw;
890
	u16 port = sky2->port;
891
892
	spin_lock_bh(&sky2->tx_lock);
893
894
	sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_ON);
895
	sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_ON);
896
	sky2->vlgrp = grp;
897
898
	spin_unlock_bh(&sky2->tx_lock);
899
}
900
901
static void sky2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
902
{
903
	struct sky2_port *sky2 = netdev_priv(dev);
904
	struct sky2_hw *hw = sky2->hw;
905
	u16 port = sky2->port;
906
907
	spin_lock_bh(&sky2->tx_lock);
908
909
	sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_OFF);
910
	sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_OFF);
911
	if (sky2->vlgrp)
912
		sky2->vlgrp->vlan_devices[vid] = NULL;
913
914
	spin_unlock_bh(&sky2->tx_lock);
915
}
916
#endif
917
918
/*
919
 * It appears the hardware has a bug in the FIFO logic that
920
 * cause it to hang if the FIFO gets overrun and the receive buffer
921
 * is not aligned. ALso alloc_skb() won't align properly if slab
922
 * debugging is enabled.
923
 */
924
static inline struct sk_buff *sky2_alloc_skb(unsigned int size, gfp_t gfp_mask)
925
{
926
	struct sk_buff *skb;
927
928
	skb = alloc_skb(size + RX_SKB_ALIGN, gfp_mask);
929
	if (likely(skb)) {
930
		unsigned long p	= (unsigned long) skb->data;
931
		skb_reserve(skb,
932
			((p + RX_SKB_ALIGN - 1) & ~(RX_SKB_ALIGN - 1)) - p);
933
	}
934
935
	return skb;
936
}
937
938
/*
939
 * Allocate and setup receiver buffer pool.
940
 * In case of 64 bit dma, there are 2X as many list elements
941
 * available as ring entries
942
 * and need to reserve one list element so we don't wrap around.
943
 */
944
static int sky2_rx_start(struct sky2_port *sky2)
945
{
946
	struct sky2_hw *hw = sky2->hw;
947
	unsigned rxq = rxqaddr[sky2->port];
948
	int i;
949
950
	sky2->rx_put = sky2->rx_next = 0;
951
	sky2_qset(hw, rxq);
952
	sky2_prefetch_init(hw, rxq, sky2->rx_le_map, RX_LE_SIZE - 1);
953
954
	rx_set_checksum(sky2);
955
	for (i = 0; i < sky2->rx_pending; i++) {
956
		struct ring_info *re = sky2->rx_ring + i;
957
958
		re->skb = sky2_alloc_skb(sky2->rx_bufsize, GFP_KERNEL);
959
		if (!re->skb)
960
			goto nomem;
961
962
		re->mapaddr = pci_map_single(hw->pdev, re->skb->data,
963
					     sky2->rx_bufsize, PCI_DMA_FROMDEVICE);
964
		sky2_rx_add(sky2, re->mapaddr);
965
	}
966
967
	/* Tell chip about available buffers */
968
	sky2_write16(hw, Y2_QADDR(rxq, PREF_UNIT_PUT_IDX), sky2->rx_put);
969
	sky2->rx_last_put = sky2_read16(hw, Y2_QADDR(rxq, PREF_UNIT_PUT_IDX));
970
	return 0;
971
nomem:
972
	sky2_rx_clean(sky2);
973
	return -ENOMEM;
974
}
975
976
/* Bring up network interface. */
977
static int sky2_up(struct net_device *dev)
978
{
979
	struct sky2_port *sky2 = netdev_priv(dev);
980
	struct sky2_hw *hw = sky2->hw;
981
	unsigned port = sky2->port;
982
	u32 ramsize, rxspace;
983
	int err = -ENOMEM;
984
985
	if (netif_msg_ifup(sky2))
986
		printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
987
988
	/* must be power of 2 */
989
	sky2->tx_le = pci_alloc_consistent(hw->pdev,
990
					   TX_RING_SIZE *
991
					   sizeof(struct sky2_tx_le),
992
					   &sky2->tx_le_map);
993
	if (!sky2->tx_le)
994
		goto err_out;
995
996
	sky2->tx_ring = kcalloc(TX_RING_SIZE, sizeof(struct tx_ring_info),
997
				GFP_KERNEL);
998
	if (!sky2->tx_ring)
999
		goto err_out;
1000
	sky2->tx_prod = sky2->tx_cons = 0;
1001
1002
	sky2->rx_le = pci_alloc_consistent(hw->pdev, RX_LE_BYTES,
1003
					   &sky2->rx_le_map);
1004
	if (!sky2->rx_le)
1005
		goto err_out;
1006
	memset(sky2->rx_le, 0, RX_LE_BYTES);
1007
1008
	sky2->rx_ring = kcalloc(sky2->rx_pending, sizeof(struct ring_info),
1009
				GFP_KERNEL);
1010
	if (!sky2->rx_ring)
1011
		goto err_out;
1012
1013
	sky2_mac_init(hw, port);
1014
1015
	/* Determine available ram buffer space (in 4K blocks).
1016
	 * Note: not sure about the FE setting below yet
1017
	 */
1018
	if (hw->chip_id == CHIP_ID_YUKON_FE)
1019
		ramsize = 4;
1020
	else
1021
		ramsize = sky2_read8(hw, B2_E_0);
1022
1023
	/* Give transmitter one third (rounded up) */
1024
	rxspace = ramsize - (ramsize + 2) / 3;
1025
1026
	sky2_ramset(hw, rxqaddr[port], 0, rxspace);
1027
	sky2_ramset(hw, txqaddr[port], rxspace, ramsize);
1028
1029
	/* Make sure SyncQ is disabled */
1030
	sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL),
1031
		    RB_RST_SET);
1032
1033
	sky2_qset(hw, txqaddr[port]);
1034
	if (hw->chip_id == CHIP_ID_YUKON_EC_U)
1035
		sky2_write16(hw, Q_ADDR(txqaddr[port], Q_AL), 0x1a0);
1036
1037
1038
	sky2_prefetch_init(hw, txqaddr[port], sky2->tx_le_map,
1039
			   TX_RING_SIZE - 1);
1040
1041
	err = sky2_rx_start(sky2);
1042
	if (err)
1043
		goto err_out;
1044
1045
	/* Enable interrupts from phy/mac for port */
1046
	hw->intr_mask |= (port == 0) ? Y2_IS_PORT_1 : Y2_IS_PORT_2;
1047
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
1048
	return 0;
1049
1050
err_out:
1051
	if (sky2->rx_le) {
1052
		pci_free_consistent(hw->pdev, RX_LE_BYTES,
1053
				    sky2->rx_le, sky2->rx_le_map);
1054
		sky2->rx_le = NULL;
1055
	}
1056
	if (sky2->tx_le) {
1057
		pci_free_consistent(hw->pdev,
1058
				    TX_RING_SIZE * sizeof(struct sky2_tx_le),
1059
				    sky2->tx_le, sky2->tx_le_map);
1060
		sky2->tx_le = NULL;
1061
	}
1062
	kfree(sky2->tx_ring);
1063
	kfree(sky2->rx_ring);
1064
1065
	sky2->tx_ring = NULL;
1066
	sky2->rx_ring = NULL;
1067
	return err;
1068
}
1069
1070
/* Modular subtraction in ring */
1071
static inline int tx_dist(unsigned tail, unsigned head)
1072
{
1073
	return (head - tail) % TX_RING_SIZE;
1074
}
1075
1076
/* Number of list elements available for next tx */
1077
static inline int tx_avail(const struct sky2_port *sky2)
1078
{
1079
	return sky2->tx_pending - tx_dist(sky2->tx_cons, sky2->tx_prod);
1080
}
1081
1082
/* Estimate of number of transmit list elements required */
1083
static unsigned tx_le_req(const struct sk_buff *skb)
1084
{
1085
	unsigned count;
1086
1087
	count = sizeof(dma_addr_t) / sizeof(u32);
1088
	count += skb_shinfo(skb)->nr_frags * count;
1089
1090
	if (skb_shinfo(skb)->tso_size)
1091
		++count;
1092
1093
	if (skb->ip_summed == CHECKSUM_HW)
1094
		++count;
1095
1096
	return count;
1097
}
1098
1099
/*
1100
 * Put one packet in ring for transmit.
1101
 * A single packet can generate multiple list elements, and
1102
 * the number of ring elements will probably be less than the number
1103
 * of list elements used.
1104
 *
1105
 * No BH disabling for tx_lock here (like tg3)
1106
 */
1107
static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
1108
{
1109
	struct sky2_port *sky2 = netdev_priv(dev);
1110
	struct sky2_hw *hw = sky2->hw;
1111
	struct sky2_tx_le *le = NULL;
1112
	struct tx_ring_info *re;
1113
	unsigned i, len;
1114
	dma_addr_t mapping;
1115
	u32 addr64;
1116
	u16 mss;
1117
	u8 ctrl;
1118
1119
	/* No BH disabling for tx_lock here.  We are running in BH disabled
1120
	 * context and TX reclaim runs via poll inside of a software
1121
	 * interrupt, and no related locks in IRQ processing.
1122
	 */
1123
	if (!spin_trylock(&sky2->tx_lock))
1124
		return NETDEV_TX_LOCKED;
1125
1126
	if (unlikely(tx_avail(sky2) < tx_le_req(skb))) {
1127
		/* There is a known but harmless race with lockless tx
1128
		 * and netif_stop_queue.
1129
		 */
1130
		if (!netif_queue_stopped(dev)) {
1131
			netif_stop_queue(dev);
1132
			if (net_ratelimit())
1133
				printk(KERN_WARNING PFX "%s: ring full when queue awake!\n",
1134
				       dev->name);
1135
		}
1136
		spin_unlock(&sky2->tx_lock);
1137
1138
		return NETDEV_TX_BUSY;
1139
	}
1140
1141
	if (unlikely(netif_msg_tx_queued(sky2)))
1142
		printk(KERN_DEBUG "%s: tx queued, slot %u, len %d\n",
1143
		       dev->name, sky2->tx_prod, skb->len);
1144
1145
	len = skb_headlen(skb);
1146
	mapping = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE);
1147
	addr64 = high32(mapping);
1148
1149
	re = sky2->tx_ring + sky2->tx_prod;
1150
1151
	/* Send high bits if changed or crosses boundary */
1152
	if (addr64 != sky2->tx_addr64 || high32(mapping + len) != sky2->tx_addr64) {
1153
		le = get_tx_le(sky2);
1154
		le->tx.addr = cpu_to_le32(addr64);
1155
		le->ctrl = 0;
1156
		le->opcode = OP_ADDR64 | HW_OWNER;
1157
		sky2->tx_addr64 = high32(mapping + len);
1158
	}
1159
1160
	/* Check for TCP Segmentation Offload */
1161
	mss = skb_shinfo(skb)->tso_size;
1162
	if (mss != 0) {
1163
		/* just drop the packet if non-linear expansion fails */
1164
		if (skb_header_cloned(skb) &&
1165
		    pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
1166
			dev_kfree_skb_any(skb);
1167
			goto out_unlock;
1168
		}
1169
1170
		mss += ((skb->h.th->doff - 5) * 4);	/* TCP options */
1171
		mss += (skb->nh.iph->ihl * 4) + sizeof(struct tcphdr);
1172
		mss += ETH_HLEN;
1173
	}
1174
1175
	if (mss != sky2->tx_last_mss) {
1176
		le = get_tx_le(sky2);
1177
		le->tx.tso.size = cpu_to_le16(mss);
1178
		le->tx.tso.rsvd = 0;
1179
		le->opcode = OP_LRGLEN | HW_OWNER;
1180
		le->ctrl = 0;
1181
		sky2->tx_last_mss = mss;
1182
	}
1183
1184
	ctrl = 0;
1185
#ifdef SKY2_VLAN_TAG_USED
1186
	/* Add VLAN tag, can piggyback on LRGLEN or ADDR64 */
1187
	if (sky2->vlgrp && vlan_tx_tag_present(skb)) {
1188
		if (!le) {
1189
			le = get_tx_le(sky2);
1190
			le->tx.addr = 0;
1191
			le->opcode = OP_VLAN|HW_OWNER;
1192
			le->ctrl = 0;
1193
		} else
1194
			le->opcode |= OP_VLAN;
1195
		le->length = cpu_to_be16(vlan_tx_tag_get(skb));
1196
		ctrl |= INS_VLAN;
1197
	}
1198
#endif
1199
1200
	/* Handle TCP checksum offload */
1201
	if (skb->ip_summed == CHECKSUM_HW) {
1202
		u16 hdr = skb->h.raw - skb->data;
1203
		u16 offset = hdr + skb->csum;
1204
1205
		ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM;
1206
		if (skb->nh.iph->protocol == IPPROTO_UDP)
1207
			ctrl |= UDPTCP;
1208
1209
		le = get_tx_le(sky2);
1210
		le->tx.csum.start = cpu_to_le16(hdr);
1211
		le->tx.csum.offset = cpu_to_le16(offset);
1212
		le->length = 0;	/* initial checksum value */
1213
		le->ctrl = 1;	/* one packet */
1214
		le->opcode = OP_TCPLISW | HW_OWNER;
1215
	}
1216
1217
	le = get_tx_le(sky2);
1218
	le->tx.addr = cpu_to_le32((u32) mapping);
1219
	le->length = cpu_to_le16(len);
1220
	le->ctrl = ctrl;
1221
	le->opcode = mss ? (OP_LARGESEND | HW_OWNER) : (OP_PACKET | HW_OWNER);
1222
1223
	/* Record the transmit mapping info */
1224
	re->skb = skb;
1225
	pci_unmap_addr_set(re, mapaddr, mapping);
1226
1227
	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
1228
		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
1229
		struct tx_ring_info *fre;
1230
1231
		mapping = pci_map_page(hw->pdev, frag->page, frag->page_offset,
1232
				       frag->size, PCI_DMA_TODEVICE);
1233
		addr64 = high32(mapping);
1234
		if (addr64 != sky2->tx_addr64) {
1235
			le = get_tx_le(sky2);
1236
			le->tx.addr = cpu_to_le32(addr64);
1237
			le->ctrl = 0;
1238
			le->opcode = OP_ADDR64 | HW_OWNER;
1239
			sky2->tx_addr64 = addr64;
1240
		}
1241
1242
		le = get_tx_le(sky2);
1243
		le->tx.addr = cpu_to_le32((u32) mapping);
1244
		le->length = cpu_to_le16(frag->size);
1245
		le->ctrl = ctrl;
1246
		le->opcode = OP_BUFFER | HW_OWNER;
1247
1248
		fre = sky2->tx_ring
1249
		    + ((re - sky2->tx_ring) + i + 1) % TX_RING_SIZE;
1250
		pci_unmap_addr_set(fre, mapaddr, mapping);
1251
	}
1252
1253
	re->idx = sky2->tx_prod;
1254
	le->ctrl |= EOP;
1255
1256
	sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod,
1257
		     &sky2->tx_last_put, TX_RING_SIZE);
1258
1259
	if (tx_avail(sky2) <= MAX_SKB_TX_LE)
1260
		netif_stop_queue(dev);
1261
1262
out_unlock:
1263
	spin_unlock(&sky2->tx_lock);
1264
1265
	dev->trans_start = jiffies;
1266
	return NETDEV_TX_OK;
1267
}
1268
1269
/*
1270
 * Free ring elements from starting at tx_cons until "done"
1271
 *
1272
 * NB: the hardware will tell us about partial completion of multi-part
1273
 *     buffers; these are deferred until completion.
1274
 */
1275
static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
1276
{
1277
	struct net_device *dev = sky2->netdev;
1278
	struct pci_dev *pdev = sky2->hw->pdev;
1279
	u16 nxt, put;
1280
	unsigned i;
1281
1282
	BUG_ON(done >= TX_RING_SIZE);
1283
1284
	if (unlikely(netif_msg_tx_done(sky2)))
1285
		printk(KERN_DEBUG "%s: tx done, up to %u\n",
1286
		       dev->name, done);
1287
1288
	for (put = sky2->tx_cons; put != done; put = nxt) {
1289
		struct tx_ring_info *re = sky2->tx_ring + put;
1290
		struct sk_buff *skb = re->skb;
1291
1292
  		nxt = re->idx;
1293
		BUG_ON(nxt >= TX_RING_SIZE);
1294
		prefetch(sky2->tx_ring + nxt);
1295
1296
		/* Check for partial status */
1297
		if (tx_dist(put, done) < tx_dist(put, nxt))
1298
			break;
1299
1300
		skb = re->skb;
1301
		pci_unmap_single(pdev, pci_unmap_addr(re, mapaddr),
1302
				 skb_headlen(skb), PCI_DMA_TODEVICE);
1303
1304
		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
1305
			struct tx_ring_info *fre;
1306
			fre = sky2->tx_ring + (put + i + 1) % TX_RING_SIZE;
1307
			pci_unmap_page(pdev, pci_unmap_addr(fre, mapaddr),
1308
  				       skb_shinfo(skb)->frags[i].size,
1309
				       PCI_DMA_TODEVICE);
1310
		}
1311
1312
		dev_kfree_skb_any(skb);
1313
	}
1314
1315
	sky2->tx_cons = put;
1316
	if (netif_queue_stopped(dev) && tx_avail(sky2) > MAX_SKB_TX_LE)
1317
		netif_wake_queue(dev);
1318
}
1319
1320
/* Cleanup all untransmitted buffers, assume transmitter not running */
1321
static void sky2_tx_clean(struct sky2_port *sky2)
1322
{
1323
	spin_lock_bh(&sky2->tx_lock);
1324
	sky2_tx_complete(sky2, sky2->tx_prod);
1325
	spin_unlock_bh(&sky2->tx_lock);
1326
}
1327
1328
/* Network shutdown */
1329
static int sky2_down(struct net_device *dev)
1330
{
1331
	struct sky2_port *sky2 = netdev_priv(dev);
1332
	struct sky2_hw *hw = sky2->hw;
1333
	unsigned port = sky2->port;
1334
	u16 ctrl;
1335
1336
	/* Never really got started! */
1337
	if (!sky2->tx_le)
1338
		return 0;
1339
1340
	if (netif_msg_ifdown(sky2))
1341
		printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);
1342
1343
	/* Stop more packets from being queued */
1344
	netif_stop_queue(dev);
1345
1346
	/* Disable port IRQ */
1347
	local_irq_disable();
1348
	hw->intr_mask &= ~((sky2->port == 0) ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2);
1349
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
1350
	local_irq_enable();
1351
1352
	flush_scheduled_work();
1353
1354
	sky2_phy_reset(hw, port);
1355
1356
	/* Stop transmitter */
1357
	sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR), BMU_STOP);
1358
	sky2_read32(hw, Q_ADDR(txqaddr[port], Q_CSR));
1359
1360
	sky2_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL),
1361
		     RB_RST_SET | RB_DIS_OP_MD);
1362
1363
	ctrl = gma_read16(hw, port, GM_GP_CTRL);
1364
	ctrl &= ~(GM_GPCR_TX_ENA | GM_GPCR_RX_ENA);
1365
	gma_write16(hw, port, GM_GP_CTRL, ctrl);
1366
1367
	sky2_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET);
1368
1369
	/* Workaround shared GMAC reset */
1370
	if (!(hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0
1371
	      && port == 0 && hw->dev[1] && netif_running(hw->dev[1])))
1372
		sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_SET);
1373
1374
	/* Disable Force Sync bit and Enable Alloc bit */
1375
	sky2_write8(hw, SK_REG(port, TXA_CTRL),
1376
		    TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
1377
1378
	/* Stop Interval Timer and Limit Counter of Tx Arbiter */
1379
	sky2_write32(hw, SK_REG(port, TXA_ITI_INI), 0L);
1380
	sky2_write32(hw, SK_REG(port, TXA_LIM_INI), 0L);
1381
1382
	/* Reset the PCI FIFO of the async Tx queue */
1383
	sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR),
1384
		     BMU_RST_SET | BMU_FIFO_RST);
1385
1386
	/* Reset the Tx prefetch units */
1387
	sky2_write32(hw, Y2_QADDR(txqaddr[port], PREF_UNIT_CTRL),
1388
		     PREF_UNIT_RST_SET);
1389
1390
	sky2_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL), RB_RST_SET);
1391
1392
	sky2_rx_stop(sky2);
1393
1394
	sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET);
1395
	sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_SET);
1396
1397
	/* turn off LED's */
1398
	sky2_write16(hw, B0_Y2LED, LED_STAT_OFF);
1399
1400
	synchronize_irq(hw->pdev->irq);
1401
1402
	sky2_tx_clean(sky2);
1403
	sky2_rx_clean(sky2);
1404
1405
	pci_free_consistent(hw->pdev, RX_LE_BYTES,
1406
			    sky2->rx_le, sky2->rx_le_map);
1407
	kfree(sky2->rx_ring);
1408
1409
	pci_free_consistent(hw->pdev,
1410
			    TX_RING_SIZE * sizeof(struct sky2_tx_le),
1411
			    sky2->tx_le, sky2->tx_le_map);
1412
	kfree(sky2->tx_ring);
1413
1414
	sky2->tx_le = NULL;
1415
	sky2->rx_le = NULL;
1416
1417
	sky2->rx_ring = NULL;
1418
	sky2->tx_ring = NULL;
1419
1420
	return 0;
1421
}
1422
1423
static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux)
1424
{
1425
	if (!hw->copper)
1426
		return SPEED_1000;
1427
1428
	if (hw->chip_id == CHIP_ID_YUKON_FE)
1429
		return (aux & PHY_M_PS_SPEED_100) ? SPEED_100 : SPEED_10;
1430
1431
	switch (aux & PHY_M_PS_SPEED_MSK) {
1432
	case PHY_M_PS_SPEED_1000:
1433
		return SPEED_1000;
1434
	case PHY_M_PS_SPEED_100:
1435
		return SPEED_100;
1436
	default:
1437
		return SPEED_10;
1438
	}
1439
}
1440
1441
static void sky2_link_up(struct sky2_port *sky2)
1442
{
1443
	struct sky2_hw *hw = sky2->hw;
1444
	unsigned port = sky2->port;
1445
	u16 reg;
1446
1447
	/* Enable Transmit FIFO Underrun */
1448
	sky2_write8(hw, SK_REG(port, GMAC_IRQ_MSK), GMAC_DEF_MSK);
1449
1450
	reg = gma_read16(hw, port, GM_GP_CTRL);
1451
	if (sky2->duplex == DUPLEX_FULL || sky2->autoneg == AUTONEG_ENABLE)
1452
		reg |= GM_GPCR_DUP_FULL;
1453
1454
	/* enable Rx/Tx */
1455
	reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA;
1456
	gma_write16(hw, port, GM_GP_CTRL, reg);
1457
	gma_read16(hw, port, GM_GP_CTRL);
1458
1459
	gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK);
1460
1461
	netif_carrier_on(sky2->netdev);
1462
	netif_wake_queue(sky2->netdev);
1463
1464
	/* Turn on link LED */
1465
	sky2_write8(hw, SK_REG(port, LNK_LED_REG),
1466
		    LINKLED_ON | LINKLED_BLINK_OFF | LINKLED_LINKSYNC_OFF);
1467
1468
	if (hw->chip_id == CHIP_ID_YUKON_XL) {
1469
		u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
1470
1471
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
1472
		gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, PHY_M_LEDC_LOS_CTRL(1) |	/* LINK/ACT */
1473
			     PHY_M_LEDC_INIT_CTRL(sky2->speed ==
1474
						  SPEED_10 ? 7 : 0) |
1475
			     PHY_M_LEDC_STA1_CTRL(sky2->speed ==
1476
						  SPEED_100 ? 7 : 0) |
1477
			     PHY_M_LEDC_STA0_CTRL(sky2->speed ==
1478
						  SPEED_1000 ? 7 : 0));
1479
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
1480
	}
1481
1482
	if (netif_msg_link(sky2))
1483
		printk(KERN_INFO PFX
1484
		       "%s: Link is up at %d Mbps, %s duplex, flow control %s\n",
1485
		       sky2->netdev->name, sky2->speed,
1486
		       sky2->duplex == DUPLEX_FULL ? "full" : "half",
1487
		       (sky2->tx_pause && sky2->rx_pause) ? "both" :
1488
		       sky2->tx_pause ? "tx" : sky2->rx_pause ? "rx" : "none");
1489
}
1490
1491
static void sky2_link_down(struct sky2_port *sky2)
1492
{
1493
	struct sky2_hw *hw = sky2->hw;
1494
	unsigned port = sky2->port;
1495
	u16 reg;
1496
1497
	gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0);
1498
1499
	reg = gma_read16(hw, port, GM_GP_CTRL);
1500
	reg &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
1501
	gma_write16(hw, port, GM_GP_CTRL, reg);
1502
	gma_read16(hw, port, GM_GP_CTRL);	/* PCI post */
1503
1504
	if (sky2->rx_pause && !sky2->tx_pause) {
1505
		/* restore Asymmetric Pause bit */
1506
		gm_phy_write(hw, port, PHY_MARV_AUNE_ADV,
1507
			     gm_phy_read(hw, port, PHY_MARV_AUNE_ADV)
1508
			     | PHY_M_AN_ASP);
1509
	}
1510
1511
	netif_carrier_off(sky2->netdev);
1512
	netif_stop_queue(sky2->netdev);
1513
1514
	/* Turn on link LED */
1515
	sky2_write8(hw, SK_REG(port, LNK_LED_REG), LINKLED_OFF);
1516
1517
	if (netif_msg_link(sky2))
1518
		printk(KERN_INFO PFX "%s: Link is down.\n", sky2->netdev->name);
1519
	sky2_phy_init(hw, port);
1520
}
1521
1522
static int sky2_autoneg_done(struct sky2_port *sky2, u16 aux)
1523
{
1524
	struct sky2_hw *hw = sky2->hw;
1525
	unsigned port = sky2->port;
1526
	u16 lpa;
1527
1528
	lpa = gm_phy_read(hw, port, PHY_MARV_AUNE_LP);
1529
1530
	if (lpa & PHY_M_AN_RF) {
1531
		printk(KERN_ERR PFX "%s: remote fault", sky2->netdev->name);
1532
		return -1;
1533
	}
1534
1535
	if (hw->chip_id != CHIP_ID_YUKON_FE &&
1536
	    gm_phy_read(hw, port, PHY_MARV_1000T_STAT) & PHY_B_1000S_MSF) {
1537
		printk(KERN_ERR PFX "%s: master/slave fault",
1538
		       sky2->netdev->name);
1539
		return -1;
1540
	}
1541
1542
	if (!(aux & PHY_M_PS_SPDUP_RES)) {
1543
		printk(KERN_ERR PFX "%s: speed/duplex mismatch",
1544
		       sky2->netdev->name);
1545
		return -1;
1546
	}
1547
1548
	sky2->duplex = (aux & PHY_M_PS_FULL_DUP) ? DUPLEX_FULL : DUPLEX_HALF;
1549
1550
	sky2->speed = sky2_phy_speed(hw, aux);
1551
1552
	/* Pause bits are offset (9..8) */
1553
	if (hw->chip_id == CHIP_ID_YUKON_XL)
1554
		aux >>= 6;
1555
1556
	sky2->rx_pause = (aux & PHY_M_PS_RX_P_EN) != 0;
1557
	sky2->tx_pause = (aux & PHY_M_PS_TX_P_EN) != 0;
1558
1559
	if ((sky2->tx_pause || sky2->rx_pause)
1560
	    && !(sky2->speed < SPEED_1000 && sky2->duplex == DUPLEX_HALF))
1561
		sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_ON);
1562
	else
1563
		sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
1564
1565
	return 0;
1566
}
1567
1568
/*
1569
 * Interrupt from PHY are handled outside of interrupt context
1570
 * because accessing phy registers requires spin wait which might
1571
 * cause excess interrupt latency.
1572
 */
1573
static void sky2_phy_task(void *arg)
1574
{
1575
	struct sky2_port *sky2 = arg;
1576
	struct sky2_hw *hw = sky2->hw;
1577
	u16 istatus, phystat;
1578
1579
	down(&sky2->phy_sema);
1580
	istatus = gm_phy_read(hw, sky2->port, PHY_MARV_INT_STAT);
1581
	phystat = gm_phy_read(hw, sky2->port, PHY_MARV_PHY_STAT);
1582
1583
	if (netif_msg_intr(sky2))
1584
		printk(KERN_INFO PFX "%s: phy interrupt status 0x%x 0x%x\n",
1585
		       sky2->netdev->name, istatus, phystat);
1586
1587
	if (istatus & PHY_M_IS_AN_COMPL) {
1588
		if (sky2_autoneg_done(sky2, phystat) == 0)
1589
			sky2_link_up(sky2);
1590
		goto out;
1591
	}
1592
1593
	if (istatus & PHY_M_IS_LSP_CHANGE)
1594
		sky2->speed = sky2_phy_speed(hw, phystat);
1595
1596
	if (istatus & PHY_M_IS_DUP_CHANGE)
1597
		sky2->duplex =
1598
		    (phystat & PHY_M_PS_FULL_DUP) ? DUPLEX_FULL : DUPLEX_HALF;
1599
1600
	if (istatus & PHY_M_IS_LST_CHANGE) {
1601
		if (phystat & PHY_M_PS_LINK_UP)
1602
			sky2_link_up(sky2);
1603
		else
1604
			sky2_link_down(sky2);
1605
	}
1606
out:
1607
	up(&sky2->phy_sema);
1608
1609
	local_irq_disable();
1610
	hw->intr_mask |= (sky2->port == 0) ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2;
1611
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
1612
	local_irq_enable();
1613
}
1614
1615
1616
/* Transmit timeout is only called if we are running, carries is up
1617
 * and tx queue is full (stopped).
1618
 */
1619
static void sky2_tx_timeout(struct net_device *dev)
1620
{
1621
	struct sky2_port *sky2 = netdev_priv(dev);
1622
	struct sky2_hw *hw = sky2->hw;
1623
	unsigned txq = txqaddr[sky2->port];
1624
	u16 ridx;
1625
1626
	/* Maybe we just missed an status interrupt */
1627
	spin_lock(&sky2->tx_lock);
1628
	ridx = sky2_read16(hw,
1629
			   sky2->port == 0 ? STAT_TXA1_RIDX : STAT_TXA2_RIDX);
1630
	sky2_tx_complete(sky2, ridx);
1631
	spin_unlock(&sky2->tx_lock);
1632
1633
	if (!netif_queue_stopped(dev)) {
1634
		if (net_ratelimit())
1635
			pr_info(PFX "transmit interrupt missed? recovered\n");
1636
		return;
1637
	}
1638
1639
	if (netif_msg_timer(sky2))
1640
		printk(KERN_ERR PFX "%s: tx timeout\n", dev->name);
1641
1642
	sky2_write32(hw, Q_ADDR(txq, Q_CSR), BMU_STOP);
1643
	sky2_write32(hw, Y2_QADDR(txq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
1644
1645
	sky2_tx_clean(sky2);
1646
1647
	sky2_qset(hw, txq);
1648
	sky2_prefetch_init(hw, txq, sky2->tx_le_map, TX_RING_SIZE - 1);
1649
}
1650
1651
1652
#define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
1653
/* Want receive buffer size to be multiple of 64 bits, and incl room for vlan */
1654
static inline unsigned sky2_buf_size(int mtu)
1655
{
1656
	return roundup(mtu + ETH_HLEN + 4, 8);
1657
}
1658
1659
static int sky2_change_mtu(struct net_device *dev, int new_mtu)
1660
{
1661
	struct sky2_port *sky2 = netdev_priv(dev);
1662
	struct sky2_hw *hw = sky2->hw;
1663
	int err;
1664
	u16 ctl, mode;
1665
1666
	if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU)
1667
		return -EINVAL;
1668
1669
	if (hw->chip_id == CHIP_ID_YUKON_EC_U && new_mtu > ETH_DATA_LEN)
1670
		return -EINVAL;
1671
1672
	if (!netif_running(dev)) {
1673
		dev->mtu = new_mtu;
1674
		return 0;
1675
	}
1676
1677
	sky2_write32(hw, B0_IMSK, 0);
1678
1679
	dev->trans_start = jiffies;	/* prevent tx timeout */
1680
	netif_stop_queue(dev);
1681
	netif_poll_disable(hw->dev[0]);
1682
1683
	ctl = gma_read16(hw, sky2->port, GM_GP_CTRL);
1684
	gma_write16(hw, sky2->port, GM_GP_CTRL, ctl & ~GM_GPCR_RX_ENA);
1685
	sky2_rx_stop(sky2);
1686
	sky2_rx_clean(sky2);
1687
1688
	dev->mtu = new_mtu;
1689
	sky2->rx_bufsize = sky2_buf_size(new_mtu);
1690
	mode = DATA_BLIND_VAL(DATA_BLIND_DEF) |
1691
		GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
1692
1693
	if (dev->mtu > ETH_DATA_LEN)
1694
		mode |= GM_SMOD_JUMBO_ENA;
1695
1696
	gma_write16(hw, sky2->port, GM_SERIAL_MODE, mode);
1697
1698
	sky2_write8(hw, RB_ADDR(rxqaddr[sky2->port], RB_CTRL), RB_ENA_OP_MD);
1699
1700
	err = sky2_rx_start(sky2);
1701
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
1702
1703
	if (err)
1704
		dev_close(dev);
1705
	else {
1706
		gma_write16(hw, sky2->port, GM_GP_CTRL, ctl);
1707
1708
		netif_poll_enable(hw->dev[0]);
1709
		netif_wake_queue(dev);
1710
	}
1711
1712
	return err;
1713
}
1714
1715
/*
1716
 * Receive one packet.
1717
 * For small packets or errors, just reuse existing skb.
1718
 * For larger packets, get new buffer.
1719
 */
1720
static struct sk_buff *sky2_receive(struct sky2_port *sky2,
1721
				    u16 length, u32 status)
1722
{
1723
	struct ring_info *re = sky2->rx_ring + sky2->rx_next;
1724
	struct sk_buff *skb = NULL;
1725
1726
	if (unlikely(netif_msg_rx_status(sky2)))
1727
		printk(KERN_DEBUG PFX "%s: rx slot %u status 0x%x len %d\n",
1728
		       sky2->netdev->name, sky2->rx_next, status, length);
1729
1730
	sky2->rx_next = (sky2->rx_next + 1) % sky2->rx_pending;
1731
	prefetch(sky2->rx_ring + sky2->rx_next);
1732
1733
	if (status & GMR_FS_ANY_ERR)
1734
		goto error;
1735
1736
	if (!(status & GMR_FS_RX_OK))
1737
		goto resubmit;
1738
1739
	if ((status >> 16) != length || length > sky2->rx_bufsize)
1740
		goto oversize;
1741
1742
	if (length < copybreak) {
1743
		skb = alloc_skb(length + 2, GFP_ATOMIC);
1744
		if (!skb)
1745
			goto resubmit;
1746
1747
		skb_reserve(skb, 2);
1748
		pci_dma_sync_single_for_cpu(sky2->hw->pdev, re->mapaddr,
1749
					    length, PCI_DMA_FROMDEVICE);
1750
		memcpy(skb->data, re->skb->data, length);
1751
		skb->ip_summed = re->skb->ip_summed;
1752
		skb->csum = re->skb->csum;
1753
		pci_dma_sync_single_for_device(sky2->hw->pdev, re->mapaddr,
1754
					       length, PCI_DMA_FROMDEVICE);
1755
	} else {
1756
		struct sk_buff *nskb;
1757
1758
		nskb = sky2_alloc_skb(sky2->rx_bufsize, GFP_ATOMIC);
1759
		if (!nskb)
1760
			goto resubmit;
1761
1762
		skb = re->skb;
1763
		re->skb = nskb;
1764
		pci_unmap_single(sky2->hw->pdev, re->mapaddr,
1765
				 sky2->rx_bufsize, PCI_DMA_FROMDEVICE);
1766
		prefetch(skb->data);
1767
1768
		re->mapaddr = pci_map_single(sky2->hw->pdev, nskb->data,
1769
					     sky2->rx_bufsize, PCI_DMA_FROMDEVICE);
1770
	}
1771
1772
	skb_put(skb, length);
1773
resubmit:
1774
	re->skb->ip_summed = CHECKSUM_NONE;
1775
	sky2_rx_add(sky2, re->mapaddr);
1776
1777
	/* Tell receiver about new buffers. */
1778
	sky2_put_idx(sky2->hw, rxqaddr[sky2->port], sky2->rx_put,
1779
		     &sky2->rx_last_put, RX_LE_SIZE);
1780
1781
	return skb;
1782
1783
oversize:
1784
	++sky2->net_stats.rx_over_errors;
1785
	goto resubmit;
1786
1787
error:
1788
	++sky2->net_stats.rx_errors;
1789
1790
	if (netif_msg_rx_err(sky2) && net_ratelimit())
1791
		printk(KERN_INFO PFX "%s: rx error, status 0x%x length %d\n",
1792
		       sky2->netdev->name, status, length);
1793
1794
	if (status & (GMR_FS_LONG_ERR | GMR_FS_UN_SIZE))
1795
		sky2->net_stats.rx_length_errors++;
1796
	if (status & GMR_FS_FRAGMENT)
1797
		sky2->net_stats.rx_frame_errors++;
1798
	if (status & GMR_FS_CRC_ERR)
1799
		sky2->net_stats.rx_crc_errors++;
1800
	if (status & GMR_FS_RX_FF_OV)
1801
		sky2->net_stats.rx_fifo_errors++;
1802
1803
	goto resubmit;
1804
}
1805
1806
/*
1807
 * Check for transmit complete
1808
 */
1809
#define TX_NO_STATUS	0xffff
1810
1811
static void sky2_tx_check(struct sky2_hw *hw, int port, u16 last)
1812
{
1813
	if (last != TX_NO_STATUS) {
1814
		struct net_device *dev = hw->dev[port];
1815
		if (dev && netif_running(dev)) {
1816
			struct sky2_port *sky2 = netdev_priv(dev);
1817
1818
			spin_lock(&sky2->tx_lock);
1819
			sky2_tx_complete(sky2, last);
1820
			spin_unlock(&sky2->tx_lock);
1821
		}
1822
	}
1823
}
1824
1825
/*
1826
 * Both ports share the same status interrupt, therefore there is only
1827
 * one poll routine.
1828
 */
1829
static int sky2_poll(struct net_device *dev0, int *budget)
1830
{
1831
	struct sky2_hw *hw = ((struct sky2_port *) netdev_priv(dev0))->hw;
1832
	unsigned int to_do = min(dev0->quota, *budget);
1833
	unsigned int work_done = 0;
1834
	u16 hwidx;
1835
	u16 tx_done[2] = { TX_NO_STATUS, TX_NO_STATUS };
1836
1837
	hwidx = sky2_read16(hw, STAT_PUT_IDX);
1838
	BUG_ON(hwidx >= STATUS_RING_SIZE);
1839
	rmb();
1840
1841
	while (hwidx != hw->st_idx) {
1842
		struct sky2_status_le *le  = hw->st_le + hw->st_idx;
1843
		struct net_device *dev;
1844
		struct sky2_port *sky2;
1845
		struct sk_buff *skb;
1846
		u32 status;
1847
		u16 length;
1848
1849
		le = hw->st_le + hw->st_idx;
1850
		hw->st_idx = (hw->st_idx + 1) % STATUS_RING_SIZE;
1851
		prefetch(hw->st_le + hw->st_idx);
1852
1853
		BUG_ON(le->link >= 2);
1854
		dev = hw->dev[le->link];
1855
		if (dev == NULL || !netif_running(dev))
1856
			continue;
1857
1858
		sky2 = netdev_priv(dev);
1859
		status = le32_to_cpu(le->status);
1860
		length = le16_to_cpu(le->length);
1861
1862
		switch (le->opcode & ~HW_OWNER) {
1863
		case OP_RXSTAT:
1864
			skb = sky2_receive(sky2, length, status);
1865
			if (!skb)
1866
				break;
1867
1868
			skb->dev = dev;
1869
			skb->protocol = eth_type_trans(skb, dev);
1870
			dev->last_rx = jiffies;
1871
1872
#ifdef SKY2_VLAN_TAG_USED
1873
			if (sky2->vlgrp && (status & GMR_FS_VLAN)) {
1874
				vlan_hwaccel_receive_skb(skb,
1875
							 sky2->vlgrp,
1876
							 be16_to_cpu(sky2->rx_tag));
1877
			} else
1878
#endif
1879
				netif_receive_skb(skb);
1880
1881
			if (++work_done >= to_do)
1882
				goto exit_loop;
1883
			break;
1884
1885
#ifdef SKY2_VLAN_TAG_USED
1886
		case OP_RXVLAN:
1887
			sky2->rx_tag = length;
1888
			break;
1889
1890
		case OP_RXCHKSVLAN:
1891
			sky2->rx_tag = length;
1892
			/* fall through */
1893
#endif
1894
		case OP_RXCHKS:
1895
			skb = sky2->rx_ring[sky2->rx_next].skb;
1896
			skb->ip_summed = CHECKSUM_HW;
1897
			skb->csum = le16_to_cpu(status);
1898
			break;
1899
1900
		case OP_TXINDEXLE:
1901
			/* TX index reports status for both ports */
1902
			tx_done[0] = status & 0xffff;
1903
			tx_done[1] = ((status >> 24) & 0xff)
1904
				| (u16)(length & 0xf) << 8;
1905
			break;
1906
1907
		default:
1908
			if (net_ratelimit())
1909
				printk(KERN_WARNING PFX
1910
				       "unknown status opcode 0x%x\n", le->opcode);
1911
			break;
1912
		}
1913
	}
1914
1915
exit_loop:
1916
	sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ);
1917
1918
	sky2_tx_check(hw, 0, tx_done[0]);
1919
	sky2_tx_check(hw, 1, tx_done[1]);
1920
1921
	if (sky2_read16(hw, STAT_PUT_IDX) == hw->st_idx) {
1922
		/* need to restart TX timer */
1923
		if (is_ec_a1(hw)) {
1924
			sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP);
1925
			sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
1926
		}
1927
1928
		netif_rx_complete(dev0);
1929
		hw->intr_mask |= Y2_IS_STAT_BMU;
1930
		sky2_write32(hw, B0_IMSK, hw->intr_mask);
1931
		return 0;
1932
	} else {
1933
		*budget -= work_done;
1934
		dev0->quota -= work_done;
1935
		return 1;
1936
	}
1937
}
1938
1939
static void sky2_hw_error(struct sky2_hw *hw, unsigned port, u32 status)
1940
{
1941
	struct net_device *dev = hw->dev[port];
1942
1943
	if (net_ratelimit())
1944
		printk(KERN_INFO PFX "%s: hw error interrupt status 0x%x\n",
1945
		       dev->name, status);
1946
1947
	if (status & Y2_IS_PAR_RD1) {
1948
		if (net_ratelimit())
1949
			printk(KERN_ERR PFX "%s: ram data read parity error\n",
1950
			       dev->name);
1951
		/* Clear IRQ */
1952
		sky2_write16(hw, RAM_BUFFER(port, B3_RI_CTRL), RI_CLR_RD_PERR);
1953
	}
1954
1955
	if (status & Y2_IS_PAR_WR1) {
1956
		if (net_ratelimit())
1957
			printk(KERN_ERR PFX "%s: ram data write parity error\n",
1958
			       dev->name);
1959
1960
		sky2_write16(hw, RAM_BUFFER(port, B3_RI_CTRL), RI_CLR_WR_PERR);
1961
	}
1962
1963
	if (status & Y2_IS_PAR_MAC1) {
1964
		if (net_ratelimit())
1965
			printk(KERN_ERR PFX "%s: MAC parity error\n", dev->name);
1966
		sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_PE);
1967
	}
1968
1969
	if (status & Y2_IS_PAR_RX1) {
1970
		if (net_ratelimit())
1971
			printk(KERN_ERR PFX "%s: RX parity error\n", dev->name);
1972
		sky2_write32(hw, Q_ADDR(rxqaddr[port], Q_CSR), BMU_CLR_IRQ_PAR);
1973
	}
1974
1975
	if (status & Y2_IS_TCP_TXA1) {
1976
		if (net_ratelimit())
1977
			printk(KERN_ERR PFX "%s: TCP segmentation error\n",
1978
			       dev->name);
1979
		sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR), BMU_CLR_IRQ_TCP);
1980
	}
1981
}
1982
1983
static void sky2_hw_intr(struct sky2_hw *hw)
1984
{
1985
	u32 status = sky2_read32(hw, B0_HWE_ISRC);
1986
1987
	if (status & Y2_IS_TIST_OV)
1988
		sky2_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
1989
1990
	if (status & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) {
1991
		u16 pci_err;
1992
1993
		pci_read_config_word(hw->pdev, PCI_STATUS, &pci_err);
1994
		if (net_ratelimit())
1995
			printk(KERN_ERR PFX "%s: pci hw error (0x%x)\n",
1996
			       pci_name(hw->pdev), pci_err);
1997
1998
		sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
1999
		pci_write_config_word(hw->pdev, PCI_STATUS,
2000
				      pci_err | PCI_STATUS_ERROR_BITS);
2001
		sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
2002
	}
2003
2004
	if (status & Y2_IS_PCI_EXP) {
2005
		/* PCI-Express uncorrectable Error occurred */
2006
		u32 pex_err;
2007
2008
		pci_read_config_dword(hw->pdev, PEX_UNC_ERR_STAT, &pex_err);
2009
2010
		if (net_ratelimit())
2011
			printk(KERN_ERR PFX "%s: pci express error (0x%x)\n",
2012
			       pci_name(hw->pdev), pex_err);
2013
2014
		/* clear the interrupt */
2015
		sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
2016
		pci_write_config_dword(hw->pdev, PEX_UNC_ERR_STAT,
2017
				       0xffffffffUL);
2018
		sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
2019
2020
		if (pex_err & PEX_FATAL_ERRORS) {
2021
			u32 hwmsk = sky2_read32(hw, B0_HWE_IMSK);
2022
			hwmsk &= ~Y2_IS_PCI_EXP;
2023
			sky2_write32(hw, B0_HWE_IMSK, hwmsk);
2024
		}
2025
	}
2026
2027
	if (status & Y2_HWE_L1_MASK)
2028
		sky2_hw_error(hw, 0, status);
2029
	status >>= 8;
2030
	if (status & Y2_HWE_L1_MASK)
2031
		sky2_hw_error(hw, 1, status);
2032
}
2033
2034
static void sky2_mac_intr(struct sky2_hw *hw, unsigned port)
2035
{
2036
	struct net_device *dev = hw->dev[port];
2037
	struct sky2_port *sky2 = netdev_priv(dev);
2038
	u8 status = sky2_read8(hw, SK_REG(port, GMAC_IRQ_SRC));
2039
2040
	if (netif_msg_intr(sky2))
2041
		printk(KERN_INFO PFX "%s: mac interrupt status 0x%x\n",
2042
		       dev->name, status);
2043
2044
	if (status & GM_IS_RX_FF_OR) {
2045
		++sky2->net_stats.rx_fifo_errors;
2046
		sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_CLI_RX_FO);
2047
	}
2048
2049
	if (status & GM_IS_TX_FF_UR) {
2050
		++sky2->net_stats.tx_fifo_errors;
2051
		sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_FU);
2052
	}
2053
}
2054
2055
static void sky2_phy_intr(struct sky2_hw *hw, unsigned port)
2056
{
2057
	struct net_device *dev = hw->dev[port];
2058
	struct sky2_port *sky2 = netdev_priv(dev);
2059
2060
	hw->intr_mask &= ~(port == 0 ? Y2_IS_IRQ_PHY1 : Y2_IS_IRQ_PHY2);
2061
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
2062
	schedule_work(&sky2->phy_task);
2063
}
2064
2065
static irqreturn_t sky2_intr(int irq, void *dev_id, struct pt_regs *regs)
2066
{
2067
	struct sky2_hw *hw = dev_id;
2068
	struct net_device *dev0 = hw->dev[0];
2069
	u32 status;
2070
2071
	status = sky2_read32(hw, B0_Y2_SP_ISRC2);
2072
	if (status == 0 || status == ~0)
2073
		return IRQ_NONE;
2074
2075
	if (status & Y2_IS_HW_ERR)
2076
		sky2_hw_intr(hw);
2077
2078
	/* Do NAPI for Rx and Tx status */
2079
	if (status & Y2_IS_STAT_BMU) {
2080
		hw->intr_mask &= ~Y2_IS_STAT_BMU;
2081
		sky2_write32(hw, B0_IMSK, hw->intr_mask);
2082
2083
		if (likely(__netif_rx_schedule_prep(dev0))) {
2084
			prefetch(&hw->st_le[hw->st_idx]);
2085
			__netif_rx_schedule(dev0);
2086
		}
2087
	}
2088
2089
	if (status & Y2_IS_IRQ_PHY1)
2090
		sky2_phy_intr(hw, 0);
2091
2092
	if (status & Y2_IS_IRQ_PHY2)
2093
		sky2_phy_intr(hw, 1);
2094
2095
	if (status & Y2_IS_IRQ_MAC1)
2096
		sky2_mac_intr(hw, 0);
2097
2098
	if (status & Y2_IS_IRQ_MAC2)
2099
		sky2_mac_intr(hw, 1);
2100
2101
	sky2_write32(hw, B0_Y2_SP_ICR, 2);
2102
2103
	sky2_read32(hw, B0_IMSK);
2104
2105
	return IRQ_HANDLED;
2106
}
2107
2108
#ifdef CONFIG_NET_POLL_CONTROLLER
2109
static void sky2_netpoll(struct net_device *dev)
2110
{
2111
	struct sky2_port *sky2 = netdev_priv(dev);
2112
2113
	sky2_intr(sky2->hw->pdev->irq, sky2->hw, NULL);
2114
}
2115
#endif
2116
2117
/* Chip internal frequency for clock calculations */
2118
static inline u32 sky2_mhz(const struct sky2_hw *hw)
2119
{
2120
	switch (hw->chip_id) {
2121
	case CHIP_ID_YUKON_EC:
2122
	case CHIP_ID_YUKON_EC_U:
2123
		return 125;	/* 125 Mhz */
2124
	case CHIP_ID_YUKON_FE:
2125
		return 100;	/* 100 Mhz */
2126
	default:		/* YUKON_XL */
2127
		return 156;	/* 156 Mhz */
2128
	}
2129
}
2130
2131
static inline u32 sky2_us2clk(const struct sky2_hw *hw, u32 us)
2132
{
2133
	return sky2_mhz(hw) * us;
2134
}
2135
2136
static inline u32 sky2_clk2us(const struct sky2_hw *hw, u32 clk)
2137
{
2138
	return clk / sky2_mhz(hw);
2139
}
2140
2141
2142
static int sky2_reset(struct sky2_hw *hw)
2143
{
2144
	u32 ctst;
2145
	u16 status;
2146
	u8 t8, pmd_type;
2147
	int i;
2148
2149
	ctst = sky2_read32(hw, B0_CTST);
2150
2151
	sky2_write8(hw, B0_CTST, CS_RST_CLR);
2152
	hw->chip_id = sky2_read8(hw, B2_CHIP_ID);
2153
	if (hw->chip_id < CHIP_ID_YUKON_XL || hw->chip_id > CHIP_ID_YUKON_FE) {
2154
		printk(KERN_ERR PFX "%s: unsupported chip type 0x%x\n",
2155
		       pci_name(hw->pdev), hw->chip_id);
2156
		return -EOPNOTSUPP;
2157
	}
2158
2159
	/* ring for status responses */
2160
	hw->st_le = pci_alloc_consistent(hw->pdev, STATUS_LE_BYTES,
2161
					 &hw->st_dma);
2162
	if (!hw->st_le)
2163
		return -ENOMEM;
2164
2165
	/* disable ASF */
2166
	if (hw->chip_id <= CHIP_ID_YUKON_EC) {
2167
		sky2_write8(hw, B28_Y2_ASF_STAT_CMD, Y2_ASF_RESET);
2168
		sky2_write16(hw, B0_CTST, Y2_ASF_DISABLE);
2169
	}
2170
2171
	/* do a SW reset */
2172
	sky2_write8(hw, B0_CTST, CS_RST_SET);
2173
	sky2_write8(hw, B0_CTST, CS_RST_CLR);
2174
2175
	/* clear PCI errors, if any */
2176
	pci_read_config_word(hw->pdev, PCI_STATUS, &status);
2177
	sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
2178
	pci_write_config_word(hw->pdev, PCI_STATUS,
2179
			      status | PCI_STATUS_ERROR_BITS);
2180
2181
	sky2_write8(hw, B0_CTST, CS_MRST_CLR);
2182
2183
	/* clear any PEX errors */
2184
	if (is_pciex(hw)) {
2185
		u16 lstat;
2186
		pci_write_config_dword(hw->pdev, PEX_UNC_ERR_STAT,
2187
				       0xffffffffUL);
2188
		pci_read_config_word(hw->pdev, PEX_LNK_STAT, &lstat);
2189
	}
2190
2191
	pmd_type = sky2_read8(hw, B2_PMD_TYP);
2192
	hw->copper = !(pmd_type == 'L' || pmd_type == 'S');
2193
2194
	hw->ports = 1;
2195
	t8 = sky2_read8(hw, B2_Y2_HW_RES);
2196
	if ((t8 & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) {
2197
		if (!(sky2_read8(hw, B2_Y2_CLK_GATE) & Y2_STATUS_LNK2_INAC))
2198
			++hw->ports;
2199
	}
2200
	hw->chip_rev = (sky2_read8(hw, B2_MAC_CFG) & CFG_CHIP_R_MSK) >> 4;
2201
2202
	sky2_set_power_state(hw, PCI_D0);
2203
2204
	for (i = 0; i < hw->ports; i++) {
2205
		sky2_write8(hw, SK_REG(i, GMAC_LINK_CTRL), GMLC_RST_SET);
2206
		sky2_write8(hw, SK_REG(i, GMAC_LINK_CTRL), GMLC_RST_CLR);
2207
	}
2208
2209
	sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
2210
2211
	/* Clear I2C IRQ noise */
2212
	sky2_write32(hw, B2_I2C_IRQ, 1);
2213
2214
	/* turn off hardware timer (unused) */
2215
	sky2_write8(hw, B2_TI_CTRL, TIM_STOP);
2216
	sky2_write8(hw, B2_TI_CTRL, TIM_CLR_IRQ);
2217
2218
	sky2_write8(hw, B0_Y2LED, LED_STAT_ON);
2219
2220
	/* Turn off descriptor polling */
2221
	sky2_write32(hw, B28_DPT_CTRL, DPT_STOP);
2222
2223
	/* Turn off receive timestamp */
2224
	sky2_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_STOP);
2225
	sky2_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
2226
2227
	/* enable the Tx Arbiters */
2228
	for (i = 0; i < hw->ports; i++)
2229
		sky2_write8(hw, SK_REG(i, TXA_CTRL), TXA_ENA_ARB);
2230
2231
	/* Initialize ram interface */
2232
	for (i = 0; i < hw->ports; i++) {
2233
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_CTRL), RI_RST_CLR);
2234
2235
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_R1), SK_RI_TO_53);
2236
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XA1), SK_RI_TO_53);
2237
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XS1), SK_RI_TO_53);
2238
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_R1), SK_RI_TO_53);
2239
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XA1), SK_RI_TO_53);
2240
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XS1), SK_RI_TO_53);
2241
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_R2), SK_RI_TO_53);
2242
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XA2), SK_RI_TO_53);
2243
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_WTO_XS2), SK_RI_TO_53);
2244
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_R2), SK_RI_TO_53);
2245
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XA2), SK_RI_TO_53);
2246
		sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XS2), SK_RI_TO_53);
2247
	}
2248
2249
	sky2_write32(hw, B0_HWE_IMSK, Y2_HWE_ALL_MASK);
2250
2251
	for (i = 0; i < hw->ports; i++)
2252
		sky2_phy_reset(hw, i);
2253
2254
	memset(hw->st_le, 0, STATUS_LE_BYTES);
2255
	hw->st_idx = 0;
2256
2257
	sky2_write32(hw, STAT_CTRL, SC_STAT_RST_SET);
2258
	sky2_write32(hw, STAT_CTRL, SC_STAT_RST_CLR);
2259
2260
	sky2_write32(hw, STAT_LIST_ADDR_LO, hw->st_dma);
2261
	sky2_write32(hw, STAT_LIST_ADDR_HI, (u64) hw->st_dma >> 32);
2262
2263
	/* Set the list last index */
2264
	sky2_write16(hw, STAT_LAST_IDX, STATUS_RING_SIZE - 1);
2265
2266
	/* These status setup values are copied from SysKonnect's driver */
2267
	if (is_ec_a1(hw)) {
2268
		/* WA for dev. #4.3 */
2269
		sky2_write16(hw, STAT_TX_IDX_TH, 0xfff);	/* Tx Threshold */
2270
2271
		/* set Status-FIFO watermark */
2272
		sky2_write8(hw, STAT_FIFO_WM, 0x21);	/* WA for dev. #4.18 */
2273
2274
		/* set Status-FIFO ISR watermark */
2275
		sky2_write8(hw, STAT_FIFO_ISR_WM, 0x07);	/* WA for dev. #4.18 */
2276
		sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 10000));
2277
	} else {
2278
		sky2_write16(hw, STAT_TX_IDX_TH, 10);
2279
		sky2_write8(hw, STAT_FIFO_WM, 16);
2280
2281
		/* set Status-FIFO ISR watermark */
2282
		if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0)
2283
			sky2_write8(hw, STAT_FIFO_ISR_WM, 4);
2284
		else
2285
			sky2_write8(hw, STAT_FIFO_ISR_WM, 16);
2286
2287
		sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 1000));
2288
		sky2_write32(hw, STAT_LEV_TIMER_INI, sky2_us2clk(hw, 100));
2289
		sky2_write32(hw, STAT_ISR_TIMER_INI, sky2_us2clk(hw, 20));
2290
	}
2291
2292
	/* enable status unit */
2293
	sky2_write32(hw, STAT_CTRL, SC_STAT_OP_ON);
2294
2295
	sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
2296
	sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_START);
2297
	sky2_write8(hw, STAT_ISR_TIMER_CTRL, TIM_START);
2298
2299
	return 0;
2300
}
2301
2302
static u32 sky2_supported_modes(const struct sky2_hw *hw)
2303
{
2304
	u32 modes;
2305
	if (hw->copper) {
2306
		modes = SUPPORTED_10baseT_Half
2307
		    | SUPPORTED_10baseT_Full
2308
		    | SUPPORTED_100baseT_Half
2309
		    | SUPPORTED_100baseT_Full
2310
		    | SUPPORTED_Autoneg | SUPPORTED_TP;
2311
2312
		if (hw->chip_id != CHIP_ID_YUKON_FE)
2313
			modes |= SUPPORTED_1000baseT_Half
2314
			    | SUPPORTED_1000baseT_Full;
2315
	} else
2316
		modes = SUPPORTED_1000baseT_Full | SUPPORTED_FIBRE
2317
		    | SUPPORTED_Autoneg;
2318
	return modes;
2319
}
2320
2321
static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
2322
{
2323
	struct sky2_port *sky2 = netdev_priv(dev);
2324
	struct sky2_hw *hw = sky2->hw;
2325
2326
	ecmd->transceiver = XCVR_INTERNAL;
2327
	ecmd->supported = sky2_supported_modes(hw);
2328
	ecmd->phy_address = PHY_ADDR_MARV;
2329
	if (hw->copper) {
2330
		ecmd->supported = SUPPORTED_10baseT_Half
2331
		    | SUPPORTED_10baseT_Full
2332
		    | SUPPORTED_100baseT_Half
2333
		    | SUPPORTED_100baseT_Full
2334
		    | SUPPORTED_1000baseT_Half
2335
		    | SUPPORTED_1000baseT_Full
2336
		    | SUPPORTED_Autoneg | SUPPORTED_TP;
2337
		ecmd->port = PORT_TP;
2338
	} else
2339
		ecmd->port = PORT_FIBRE;
2340
2341
	ecmd->advertising = sky2->advertising;
2342
	ecmd->autoneg = sky2->autoneg;
2343
	ecmd->speed = sky2->speed;
2344
	ecmd->duplex = sky2->duplex;
2345
	return 0;
2346
}
2347
2348
static int sky2_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
2349
{
2350
	struct sky2_port *sky2 = netdev_priv(dev);
2351
	const struct sky2_hw *hw = sky2->hw;
2352
	u32 supported = sky2_supported_modes(hw);
2353
2354
	if (ecmd->autoneg == AUTONEG_ENABLE) {
2355
		ecmd->advertising = supported;
2356
		sky2->duplex = -1;
2357
		sky2->speed = -1;
2358
	} else {
2359
		u32 setting;
2360
2361
		switch (ecmd->speed) {
2362
		case SPEED_1000:
2363
			if (ecmd->duplex == DUPLEX_FULL)
2364
				setting = SUPPORTED_1000baseT_Full;
2365
			else if (ecmd->duplex == DUPLEX_HALF)
2366
				setting = SUPPORTED_1000baseT_Half;
2367
			else
2368
				return -EINVAL;
2369
			break;
2370
		case SPEED_100:
2371
			if (ecmd->duplex == DUPLEX_FULL)
2372
				setting = SUPPORTED_100baseT_Full;
2373
			else if (ecmd->duplex == DUPLEX_HALF)
2374
				setting = SUPPORTED_100baseT_Half;
2375
			else
2376
				return -EINVAL;
2377
			break;
2378
2379
		case SPEED_10:
2380
			if (ecmd->duplex == DUPLEX_FULL)
2381
				setting = SUPPORTED_10baseT_Full;
2382
			else if (ecmd->duplex == DUPLEX_HALF)
2383
				setting = SUPPORTED_10baseT_Half;
2384
			else
2385
				return -EINVAL;
2386
			break;
2387
		default:
2388
			return -EINVAL;
2389
		}
2390
2391
		if ((setting & supported) == 0)
2392
			return -EINVAL;
2393
2394
		sky2->speed = ecmd->speed;
2395
		sky2->duplex = ecmd->duplex;
2396
	}
2397
2398
	sky2->autoneg = ecmd->autoneg;
2399
	sky2->advertising = ecmd->advertising;
2400
2401
	if (netif_running(dev))
2402
		sky2_phy_reinit(sky2);
2403
2404
	return 0;
2405
}
2406
2407
static void sky2_get_drvinfo(struct net_device *dev,
2408
			     struct ethtool_drvinfo *info)
2409
{
2410
	struct sky2_port *sky2 = netdev_priv(dev);
2411
2412
	strcpy(info->driver, DRV_NAME);
2413
	strcpy(info->version, DRV_VERSION);
2414
	strcpy(info->fw_version, "N/A");
2415
	strcpy(info->bus_info, pci_name(sky2->hw->pdev));
2416
}
2417
2418
static const struct sky2_stat {
2419
	char name[ETH_GSTRING_LEN];
2420
	u16 offset;
2421
} sky2_stats[] = {
2422
	{ "tx_bytes",	   GM_TXO_OK_HI },
2423
	{ "rx_bytes",	   GM_RXO_OK_HI },
2424
	{ "tx_broadcast",  GM_TXF_BC_OK },
2425
	{ "rx_broadcast",  GM_RXF_BC_OK },
2426
	{ "tx_multicast",  GM_TXF_MC_OK },
2427
	{ "rx_multicast",  GM_RXF_MC_OK },
2428
	{ "tx_unicast",    GM_TXF_UC_OK },
2429
	{ "rx_unicast",    GM_RXF_UC_OK },
2430
	{ "tx_mac_pause",  GM_TXF_MPAUSE },
2431
	{ "rx_mac_pause",  GM_RXF_MPAUSE },
2432
	{ "collisions",    GM_TXF_SNG_COL },
2433
	{ "late_collision",GM_TXF_LAT_COL },
2434
	{ "aborted", 	   GM_TXF_ABO_COL },
2435
	{ "multi_collisions", GM_TXF_MUL_COL },
2436
	{ "fifo_underrun", GM_TXE_FIFO_UR },
2437
	{ "fifo_overflow", GM_RXE_FIFO_OV },
2438
	{ "rx_toolong",    GM_RXF_LNG_ERR },
2439
	{ "rx_jabber",     GM_RXF_JAB_PKT },
2440
	{ "rx_runt", 	   GM_RXE_FRAG },
2441
	{ "rx_too_long",   GM_RXF_LNG_ERR },
2442
	{ "rx_fcs_error",   GM_RXF_FCS_ERR },
2443
};
2444
2445
static u32 sky2_get_rx_csum(struct net_device *dev)
2446
{
2447
	struct sky2_port *sky2 = netdev_priv(dev);
2448
2449
	return sky2->rx_csum;
2450
}
2451
2452
static int sky2_set_rx_csum(struct net_device *dev, u32 data)
2453
{
2454
	struct sky2_port *sky2 = netdev_priv(dev);
2455
2456
	sky2->rx_csum = data;
2457
2458
	sky2_write32(sky2->hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR),
2459
		     data ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
2460
2461
	return 0;
2462
}
2463
2464
static u32 sky2_get_msglevel(struct net_device *netdev)
2465
{
2466
	struct sky2_port *sky2 = netdev_priv(netdev);
2467
	return sky2->msg_enable;
2468
}
2469
2470
static int sky2_nway_reset(struct net_device *dev)
2471
{
2472
	struct sky2_port *sky2 = netdev_priv(dev);
2473
2474
	if (sky2->autoneg != AUTONEG_ENABLE)
2475
		return -EINVAL;
2476
2477
	sky2_phy_reinit(sky2);
2478
2479
	return 0;
2480
}
2481
2482
static void sky2_phy_stats(struct sky2_port *sky2, u64 * data, unsigned count)
2483
{
2484
	struct sky2_hw *hw = sky2->hw;
2485
	unsigned port = sky2->port;
2486
	int i;
2487
2488
	data[0] = (u64) gma_read32(hw, port, GM_TXO_OK_HI) << 32
2489
	    | (u64) gma_read32(hw, port, GM_TXO_OK_LO);
2490
	data[1] = (u64) gma_read32(hw, port, GM_RXO_OK_HI) << 32
2491
	    | (u64) gma_read32(hw, port, GM_RXO_OK_LO);
2492
2493
	for (i = 2; i < count; i++)
2494
		data[i] = (u64) gma_read32(hw, port, sky2_stats[i].offset);
2495
}
2496
2497
static void sky2_set_msglevel(struct net_device *netdev, u32 value)
2498
{
2499
	struct sky2_port *sky2 = netdev_priv(netdev);
2500
	sky2->msg_enable = value;
2501
}
2502
2503
static int sky2_get_stats_count(struct net_device *dev)
2504
{
2505
	return ARRAY_SIZE(sky2_stats);
2506
}
2507
2508
static void sky2_get_ethtool_stats(struct net_device *dev,
2509
				   struct ethtool_stats *stats, u64 * data)
2510
{
2511
	struct sky2_port *sky2 = netdev_priv(dev);
2512
2513
	sky2_phy_stats(sky2, data, ARRAY_SIZE(sky2_stats));
2514
}
2515
2516
static void sky2_get_strings(struct net_device *dev, u32 stringset, u8 * data)
2517
{
2518
	int i;
2519
2520
	switch (stringset) {
2521
	case ETH_SS_STATS:
2522
		for (i = 0; i < ARRAY_SIZE(sky2_stats); i++)
2523
			memcpy(data + i * ETH_GSTRING_LEN,
2524
			       sky2_stats[i].name, ETH_GSTRING_LEN);
2525
		break;
2526
	}
2527
}
2528
2529
/* Use hardware MIB variables for critical path statistics and
2530
 * transmit feedback not reported at interrupt.
2531
 * Other errors are accounted for in interrupt handler.
2532
 */
2533
static struct net_device_stats *sky2_get_stats(struct net_device *dev)
2534
{
2535
	struct sky2_port *sky2 = netdev_priv(dev);
2536
	u64 data[13];
2537
2538
	sky2_phy_stats(sky2, data, ARRAY_SIZE(data));
2539
2540
	sky2->net_stats.tx_bytes = data[0];
2541
	sky2->net_stats.rx_bytes = data[1];
2542
	sky2->net_stats.tx_packets = data[2] + data[4] + data[6];
2543
	sky2->net_stats.rx_packets = data[3] + data[5] + data[7];
2544
	sky2->net_stats.multicast = data[5] + data[7];
2545
	sky2->net_stats.collisions = data[10];
2546
	sky2->net_stats.tx_aborted_errors = data[12];
2547
2548
	return &sky2->net_stats;
2549
}
2550
2551
static int sky2_set_mac_address(struct net_device *dev, void *p)
2552
{
2553
	struct sky2_port *sky2 = netdev_priv(dev);
2554
	struct sockaddr *addr = p;
2555
2556
	if (!is_valid_ether_addr(addr->sa_data))
2557
		return -EADDRNOTAVAIL;
2558
2559
	memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
2560
	memcpy_toio(sky2->hw->regs + B2_MAC_1 + sky2->port * 8,
2561
		    dev->dev_addr, ETH_ALEN);
2562
	memcpy_toio(sky2->hw->regs + B2_MAC_2 + sky2->port * 8,
2563
		    dev->dev_addr, ETH_ALEN);
2564
2565
	if (netif_running(dev))
2566
		sky2_phy_reinit(sky2);
2567
2568
	return 0;
2569
}
2570
2571
static void sky2_set_multicast(struct net_device *dev)
2572
{
2573
	struct sky2_port *sky2 = netdev_priv(dev);
2574
	struct sky2_hw *hw = sky2->hw;
2575
	unsigned port = sky2->port;
2576
	struct dev_mc_list *list = dev->mc_list;
2577
	u16 reg;
2578
	u8 filter[8];
2579
2580
	memset(filter, 0, sizeof(filter));
2581
2582
	reg = gma_read16(hw, port, GM_RX_CTRL);
2583
	reg |= GM_RXCR_UCF_ENA;
2584
2585
	if (dev->flags & IFF_PROMISC)	/* promiscuous */
2586
		reg &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
2587
	else if ((dev->flags & IFF_ALLMULTI) || dev->mc_count > 16)	/* all multicast */
2588
		memset(filter, 0xff, sizeof(filter));
2589
	else if (dev->mc_count == 0)	/* no multicast */
2590
		reg &= ~GM_RXCR_MCF_ENA;
2591
	else {
2592
		int i;
2593
		reg |= GM_RXCR_MCF_ENA;
2594
2595
		for (i = 0; list && i < dev->mc_count; i++, list = list->next) {
2596
			u32 bit = ether_crc(ETH_ALEN, list->dmi_addr) & 0x3f;
2597
			filter[bit / 8] |= 1 << (bit % 8);
2598
		}
2599
	}
2600
2601
	gma_write16(hw, port, GM_MC_ADDR_H1,
2602
		    (u16) filter[0] | ((u16) filter[1] << 8));
2603
	gma_write16(hw, port, GM_MC_ADDR_H2,
2604
		    (u16) filter[2] | ((u16) filter[3] << 8));
2605
	gma_write16(hw, port, GM_MC_ADDR_H3,
2606
		    (u16) filter[4] | ((u16) filter[5] << 8));
2607
	gma_write16(hw, port, GM_MC_ADDR_H4,
2608
		    (u16) filter[6] | ((u16) filter[7] << 8));
2609
2610
	gma_write16(hw, port, GM_RX_CTRL, reg);
2611
}
2612
2613
/* Can have one global because blinking is controlled by
2614
 * ethtool and that is always under RTNL mutex
2615
 */
2616
static void sky2_led(struct sky2_hw *hw, unsigned port, int on)
2617
{
2618
	u16 pg;
2619
2620
	switch (hw->chip_id) {
2621
	case CHIP_ID_YUKON_XL:
2622
		pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
2623
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
2624
		gm_phy_write(hw, port, PHY_MARV_PHY_CTRL,
2625
			     on ? (PHY_M_LEDC_LOS_CTRL(1) |
2626
				   PHY_M_LEDC_INIT_CTRL(7) |
2627
				   PHY_M_LEDC_STA1_CTRL(7) |
2628
				   PHY_M_LEDC_STA0_CTRL(7))
2629
			     : 0);
2630
2631
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
2632
		break;
2633
2634
	default:
2635
		gm_phy_write(hw, port, PHY_MARV_LED_CTRL, 0);
2636
		gm_phy_write(hw, port, PHY_MARV_LED_OVER,
2637
			     on ? PHY_M_LED_MO_DUP(MO_LED_ON) |
2638
			     PHY_M_LED_MO_10(MO_LED_ON) |
2639
			     PHY_M_LED_MO_100(MO_LED_ON) |
2640
			     PHY_M_LED_MO_1000(MO_LED_ON) |
2641
			     PHY_M_LED_MO_RX(MO_LED_ON)
2642
			     : PHY_M_LED_MO_DUP(MO_LED_OFF) |
2643
			     PHY_M_LED_MO_10(MO_LED_OFF) |
2644
			     PHY_M_LED_MO_100(MO_LED_OFF) |
2645
			     PHY_M_LED_MO_1000(MO_LED_OFF) |
2646
			     PHY_M_LED_MO_RX(MO_LED_OFF));
2647
2648
	}
2649
}
2650
2651
/* blink LED's for finding board */
2652
static int sky2_phys_id(struct net_device *dev, u32 data)
2653
{
2654
	struct sky2_port *sky2 = netdev_priv(dev);
2655
	struct sky2_hw *hw = sky2->hw;
2656
	unsigned port = sky2->port;
2657
	u16 ledctrl, ledover = 0;
2658
	long ms;
2659
	int interrupted;
2660
	int onoff = 1;
2661
2662
	if (!data || data > (u32) (MAX_SCHEDULE_TIMEOUT / HZ))
2663
		ms = jiffies_to_msecs(MAX_SCHEDULE_TIMEOUT);
2664
	else
2665
		ms = data * 1000;
2666
2667
	/* save initial values */
2668
	down(&sky2->phy_sema);
2669
	if (hw->chip_id == CHIP_ID_YUKON_XL) {
2670
		u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
2671
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
2672
		ledctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
2673
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
2674
	} else {
2675
		ledctrl = gm_phy_read(hw, port, PHY_MARV_LED_CTRL);
2676
		ledover = gm_phy_read(hw, port, PHY_MARV_LED_OVER);
2677
	}
2678
2679
	interrupted = 0;
2680
	while (!interrupted && ms > 0) {
2681
		sky2_led(hw, port, onoff);
2682
		onoff = !onoff;
2683
2684
		up(&sky2->phy_sema);
2685
		interrupted = msleep_interruptible(250);
2686
		down(&sky2->phy_sema);
2687
2688
		ms -= 250;
2689
	}
2690
2691
	/* resume regularly scheduled programming */
2692
	if (hw->chip_id == CHIP_ID_YUKON_XL) {
2693
		u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
2694
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 3);
2695
		gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ledctrl);
2696
		gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
2697
	} else {
2698
		gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl);
2699
		gm_phy_write(hw, port, PHY_MARV_LED_OVER, ledover);
2700
	}
2701
	up(&sky2->phy_sema);
2702
2703
	return 0;
2704
}
2705
2706
static void sky2_get_pauseparam(struct net_device *dev,
2707
				struct ethtool_pauseparam *ecmd)
2708
{
2709
	struct sky2_port *sky2 = netdev_priv(dev);
2710
2711
	ecmd->tx_pause = sky2->tx_pause;
2712
	ecmd->rx_pause = sky2->rx_pause;
2713
	ecmd->autoneg = sky2->autoneg;
2714
}
2715
2716
static int sky2_set_pauseparam(struct net_device *dev,
2717
			       struct ethtool_pauseparam *ecmd)
2718
{
2719
	struct sky2_port *sky2 = netdev_priv(dev);
2720
	int err = 0;
2721
2722
	sky2->autoneg = ecmd->autoneg;
2723
	sky2->tx_pause = ecmd->tx_pause != 0;
2724
	sky2->rx_pause = ecmd->rx_pause != 0;
2725
2726
	sky2_phy_reinit(sky2);
2727
2728
	return err;
2729
}
2730
2731
#ifdef CONFIG_PM
2732
static void sky2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
2733
{
2734
	struct sky2_port *sky2 = netdev_priv(dev);
2735
2736
	wol->supported = WAKE_MAGIC;
2737
	wol->wolopts = sky2->wol ? WAKE_MAGIC : 0;
2738
}
2739
2740
static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
2741
{
2742
	struct sky2_port *sky2 = netdev_priv(dev);
2743
	struct sky2_hw *hw = sky2->hw;
2744
2745
	if (wol->wolopts != WAKE_MAGIC && wol->wolopts != 0)
2746
		return -EOPNOTSUPP;
2747
2748
	sky2->wol = wol->wolopts == WAKE_MAGIC;
2749
2750
	if (sky2->wol) {
2751
		memcpy_toio(hw->regs + WOL_MAC_ADDR, dev->dev_addr, ETH_ALEN);
2752
2753
		sky2_write16(hw, WOL_CTRL_STAT,
2754
			     WOL_CTL_ENA_PME_ON_MAGIC_PKT |
2755
			     WOL_CTL_ENA_MAGIC_PKT_UNIT);
2756
	} else
2757
		sky2_write16(hw, WOL_CTRL_STAT, WOL_CTL_DEFAULT);
2758
2759
	return 0;
2760
}
2761
#endif
2762
2763
static int sky2_get_coalesce(struct net_device *dev,
2764
			     struct ethtool_coalesce *ecmd)
2765
{
2766
	struct sky2_port *sky2 = netdev_priv(dev);
2767
	struct sky2_hw *hw = sky2->hw;
2768
2769
	if (sky2_read8(hw, STAT_TX_TIMER_CTRL) == TIM_STOP)
2770
		ecmd->tx_coalesce_usecs = 0;
2771
	else {
2772
		u32 clks = sky2_read32(hw, STAT_TX_TIMER_INI);
2773
		ecmd->tx_coalesce_usecs = sky2_clk2us(hw, clks);
2774
	}
2775
	ecmd->tx_max_coalesced_frames = sky2_read16(hw, STAT_TX_IDX_TH);
2776
2777
	if (sky2_read8(hw, STAT_LEV_TIMER_CTRL) == TIM_STOP)
2778
		ecmd->rx_coalesce_usecs = 0;
2779
	else {
2780
		u32 clks = sky2_read32(hw, STAT_LEV_TIMER_INI);
2781
		ecmd->rx_coalesce_usecs = sky2_clk2us(hw, clks);
2782
	}
2783
	ecmd->rx_max_coalesced_frames = sky2_read8(hw, STAT_FIFO_WM);
2784
2785
	if (sky2_read8(hw, STAT_ISR_TIMER_CTRL) == TIM_STOP)
2786
		ecmd->rx_coalesce_usecs_irq = 0;
2787
	else {
2788
		u32 clks = sky2_read32(hw, STAT_ISR_TIMER_INI);
2789
		ecmd->rx_coalesce_usecs_irq = sky2_clk2us(hw, clks);
2790
	}
2791
2792
	ecmd->rx_max_coalesced_frames_irq = sky2_read8(hw, STAT_FIFO_ISR_WM);
2793
2794
	return 0;
2795
}
2796
2797
/* Note: this affect both ports */
2798
static int sky2_set_coalesce(struct net_device *dev,
2799
			     struct ethtool_coalesce *ecmd)
2800
{
2801
	struct sky2_port *sky2 = netdev_priv(dev);
2802
	struct sky2_hw *hw = sky2->hw;
2803
	const u32 tmin = sky2_clk2us(hw, 1);
2804
	const u32 tmax = 5000;
2805
2806
	if (ecmd->tx_coalesce_usecs != 0 &&
2807
	    (ecmd->tx_coalesce_usecs < tmin || ecmd->tx_coalesce_usecs > tmax))
2808
		return -EINVAL;
2809
2810
	if (ecmd->rx_coalesce_usecs != 0 &&
2811
	    (ecmd->rx_coalesce_usecs < tmin || ecmd->rx_coalesce_usecs > tmax))
2812
		return -EINVAL;
2813
2814
	if (ecmd->rx_coalesce_usecs_irq != 0 &&
2815
	    (ecmd->rx_coalesce_usecs_irq < tmin || ecmd->rx_coalesce_usecs_irq > tmax))
2816
		return -EINVAL;
2817
2818
	if (ecmd->tx_max_coalesced_frames > 0xffff)
2819
		return -EINVAL;
2820
	if (ecmd->rx_max_coalesced_frames > 0xff)
2821
		return -EINVAL;
2822
	if (ecmd->rx_max_coalesced_frames_irq > 0xff)
2823
		return -EINVAL;
2824
2825
	if (ecmd->tx_coalesce_usecs == 0)
2826
		sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP);
2827
	else {
2828
		sky2_write32(hw, STAT_TX_TIMER_INI,
2829
			     sky2_us2clk(hw, ecmd->tx_coalesce_usecs));
2830
		sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
2831
	}
2832
	sky2_write16(hw, STAT_TX_IDX_TH, ecmd->tx_max_coalesced_frames);
2833
2834
	if (ecmd->rx_coalesce_usecs == 0)
2835
		sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_STOP);
2836
	else {
2837
		sky2_write32(hw, STAT_LEV_TIMER_INI,
2838
			     sky2_us2clk(hw, ecmd->rx_coalesce_usecs));
2839
		sky2_write8(hw, STAT_LEV_TIMER_CTRL, TIM_START);
2840
	}
2841
	sky2_write8(hw, STAT_FIFO_WM, ecmd->rx_max_coalesced_frames);
2842
2843
	if (ecmd->rx_coalesce_usecs_irq == 0)
2844
		sky2_write8(hw, STAT_ISR_TIMER_CTRL, TIM_STOP);
2845
	else {
2846
		sky2_write32(hw, STAT_TX_TIMER_INI,
2847
			     sky2_us2clk(hw, ecmd->rx_coalesce_usecs_irq));
2848
		sky2_write8(hw, STAT_ISR_TIMER_CTRL, TIM_START);
2849
	}
2850
	sky2_write8(hw, STAT_FIFO_ISR_WM, ecmd->rx_max_coalesced_frames_irq);
2851
	return 0;
2852
}
2853
2854
static void sky2_get_ringparam(struct net_device *dev,
2855
			       struct ethtool_ringparam *ering)
2856
{
2857
	struct sky2_port *sky2 = netdev_priv(dev);
2858
2859
	ering->rx_max_pending = RX_MAX_PENDING;
2860
	ering->rx_mini_max_pending = 0;
2861
	ering->rx_jumbo_max_pending = 0;
2862
	ering->tx_max_pending = TX_RING_SIZE - 1;
2863
2864
	ering->rx_pending = sky2->rx_pending;
2865
	ering->rx_mini_pending = 0;
2866
	ering->rx_jumbo_pending = 0;
2867
	ering->tx_pending = sky2->tx_pending;
2868
}
2869
2870
static int sky2_set_ringparam(struct net_device *dev,
2871
			      struct ethtool_ringparam *ering)
2872
{
2873
	struct sky2_port *sky2 = netdev_priv(dev);
2874
	int err = 0;
2875
2876
	if (ering->rx_pending > RX_MAX_PENDING ||
2877
	    ering->rx_pending < 8 ||
2878
	    ering->tx_pending < MAX_SKB_TX_LE ||
2879
	    ering->tx_pending > TX_RING_SIZE - 1)
2880
		return -EINVAL;
2881
2882
	if (netif_running(dev))
2883
		sky2_down(dev);
2884
2885
	sky2->rx_pending = ering->rx_pending;
2886
	sky2->tx_pending = ering->tx_pending;
2887
2888
	if (netif_running(dev)) {
2889
		err = sky2_up(dev);
2890
		if (err)
2891
			dev_close(dev);
2892
		else
2893
			sky2_set_multicast(dev);
2894
	}
2895
2896
	return err;
2897
}
2898
2899
static int sky2_get_regs_len(struct net_device *dev)
2900
{
2901
	return 0x4000;
2902
}
2903
2904
/*
2905
 * Returns copy of control register region
2906
 * Note: access to the RAM address register set will cause timeouts.
2907
 */
2908
static void sky2_get_regs(struct net_device *dev, struct ethtool_regs *regs,
2909
			  void *p)
2910
{
2911
	const struct sky2_port *sky2 = netdev_priv(dev);
2912
	const void __iomem *io = sky2->hw->regs;
2913
2914
	BUG_ON(regs->len < B3_RI_WTO_R1);
2915
	regs->version = 1;
2916
	memset(p, 0, regs->len);
2917
2918
	memcpy_fromio(p, io, B3_RAM_ADDR);
2919
2920
	memcpy_fromio(p + B3_RI_WTO_R1,
2921
		      io + B3_RI_WTO_R1,
2922
		      regs->len - B3_RI_WTO_R1);
2923
}
2924
2925
static struct ethtool_ops sky2_ethtool_ops = {
2926
	.get_settings = sky2_get_settings,
2927
	.set_settings = sky2_set_settings,
2928
	.get_drvinfo = sky2_get_drvinfo,
2929
	.get_msglevel = sky2_get_msglevel,
2930
	.set_msglevel = sky2_set_msglevel,
2931
	.nway_reset   = sky2_nway_reset,
2932
	.get_regs_len = sky2_get_regs_len,
2933
	.get_regs = sky2_get_regs,
2934
	.get_link = ethtool_op_get_link,
2935
	.get_sg = ethtool_op_get_sg,
2936
	.set_sg = ethtool_op_set_sg,
2937
	.get_tx_csum = ethtool_op_get_tx_csum,
2938
	.set_tx_csum = ethtool_op_set_tx_csum,
2939
	.get_tso = ethtool_op_get_tso,
2940
	.set_tso = ethtool_op_set_tso,
2941
	.get_rx_csum = sky2_get_rx_csum,
2942
	.set_rx_csum = sky2_set_rx_csum,
2943
	.get_strings = sky2_get_strings,
2944
	.get_coalesce = sky2_get_coalesce,
2945
	.set_coalesce = sky2_set_coalesce,
2946
	.get_ringparam = sky2_get_ringparam,
2947
	.set_ringparam = sky2_set_ringparam,
2948
	.get_pauseparam = sky2_get_pauseparam,
2949
	.set_pauseparam = sky2_set_pauseparam,
2950
#ifdef CONFIG_PM
2951
	.get_wol = sky2_get_wol,
2952
	.set_wol = sky2_set_wol,
2953
#endif
2954
	.phys_id = sky2_phys_id,
2955
	.get_stats_count = sky2_get_stats_count,
2956
	.get_ethtool_stats = sky2_get_ethtool_stats,
2957
	.get_perm_addr	= ethtool_op_get_perm_addr,
2958
};
2959
2960
/* Initialize network device */
2961
static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
2962
						     unsigned port, int highmem)
2963
{
2964
	struct sky2_port *sky2;
2965
	struct net_device *dev = alloc_etherdev(sizeof(*sky2));
2966
2967
	if (!dev) {
2968
		printk(KERN_ERR "sky2 etherdev alloc failed");
2969
		return NULL;
2970
	}
2971
2972
	SET_MODULE_OWNER(dev);
2973
	SET_NETDEV_DEV(dev, &hw->pdev->dev);
2974
	dev->irq = hw->pdev->irq;
2975
	dev->open = sky2_up;
2976
	dev->stop = sky2_down;
2977
	dev->do_ioctl = sky2_ioctl;
2978
	dev->hard_start_xmit = sky2_xmit_frame;
2979
	dev->get_stats = sky2_get_stats;
2980
	dev->set_multicast_list = sky2_set_multicast;
2981
	dev->set_mac_address = sky2_set_mac_address;
2982
	dev->change_mtu = sky2_change_mtu;
2983
	SET_ETHTOOL_OPS(dev, &sky2_ethtool_ops);
2984
	dev->tx_timeout = sky2_tx_timeout;
2985
	dev->watchdog_timeo = TX_WATCHDOG;
2986
	if (port == 0)
2987
		dev->poll = sky2_poll;
2988
	dev->weight = NAPI_WEIGHT;
2989
#ifdef CONFIG_NET_POLL_CONTROLLER
2990
	dev->poll_controller = sky2_netpoll;
2991
#endif
2992
2993
	sky2 = netdev_priv(dev);
2994
	sky2->netdev = dev;
2995
	sky2->hw = hw;
2996
	sky2->msg_enable = netif_msg_init(debug, default_msg);
2997
2998
	spin_lock_init(&sky2->tx_lock);
2999
	/* Auto speed and flow control */
3000
	sky2->autoneg = AUTONEG_ENABLE;
3001
	sky2->tx_pause = 1;
3002
	sky2->rx_pause = 1;
3003
	sky2->duplex = -1;
3004
	sky2->speed = -1;
3005
	sky2->advertising = sky2_supported_modes(hw);
3006
3007
 	/* Receive checksum disabled for Yukon XL
3008
	 * because of observed problems with incorrect
3009
	 * values when multiple packets are received in one interrupt
3010
	 */
3011
	sky2->rx_csum = (hw->chip_id != CHIP_ID_YUKON_XL);
3012
3013
	INIT_WORK(&sky2->phy_task, sky2_phy_task, sky2);
3014
	init_MUTEX(&sky2->phy_sema);
3015
	sky2->tx_pending = TX_DEF_PENDING;
3016
	sky2->rx_pending = is_ec_a1(hw) ? 8 : RX_DEF_PENDING;
3017
	sky2->rx_bufsize = sky2_buf_size(ETH_DATA_LEN);
3018
3019
	hw->dev[port] = dev;
3020
3021
	sky2->port = port;
3022
3023
	dev->features |= NETIF_F_LLTX;
3024
	if (hw->chip_id != CHIP_ID_YUKON_EC_U)
3025
		dev->features |= NETIF_F_TSO;
3026
	if (highmem)
3027
		dev->features |= NETIF_F_HIGHDMA;
3028
	dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
3029
3030
#ifdef SKY2_VLAN_TAG_USED
3031
	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
3032
	dev->vlan_rx_register = sky2_vlan_rx_register;
3033
	dev->vlan_rx_kill_vid = sky2_vlan_rx_kill_vid;
3034
#endif
3035
3036
	/* read the mac address */
3037
	memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN);
3038
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
3039
3040
	/* device is off until link detection */
3041
	netif_carrier_off(dev);
3042
	netif_stop_queue(dev);
3043
3044
	return dev;
3045
}
3046
3047
static void __devinit sky2_show_addr(struct net_device *dev)
3048
{
3049
	const struct sky2_port *sky2 = netdev_priv(dev);
3050
3051
	if (netif_msg_probe(sky2))
3052
		printk(KERN_INFO PFX "%s: addr %02x:%02x:%02x:%02x:%02x:%02x\n",
3053
		       dev->name,
3054
		       dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
3055
		       dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
3056
}
3057
3058
static int __devinit sky2_probe(struct pci_dev *pdev,
3059
				const struct pci_device_id *ent)
3060
{
3061
	struct net_device *dev, *dev1 = NULL;
3062
	struct sky2_hw *hw;
3063
	int err, pm_cap, using_dac = 0;
3064
3065
	err = pci_enable_device(pdev);
3066
	if (err) {
3067
		printk(KERN_ERR PFX "%s cannot enable PCI device\n",
3068
		       pci_name(pdev));
3069
		goto err_out;
3070
	}
3071
3072
	err = pci_request_regions(pdev, DRV_NAME);
3073
	if (err) {
3074
		printk(KERN_ERR PFX "%s cannot obtain PCI resources\n",
3075
		       pci_name(pdev));
3076
		goto err_out;
3077
	}
3078
3079
	pci_set_master(pdev);
3080
3081
	/* Find power-management capability. */
3082
	pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
3083
	if (pm_cap == 0) {
3084
		printk(KERN_ERR PFX "Cannot find PowerManagement capability, "
3085
		       "aborting.\n");
3086
		err = -EIO;
3087
		goto err_out_free_regions;
3088
	}
3089
3090
	if (sizeof(dma_addr_t) > sizeof(u32) &&
3091
	    !(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) {
3092
		using_dac = 1;
3093
		err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
3094
		if (err < 0) {
3095
			printk(KERN_ERR PFX "%s unable to obtain 64 bit DMA "
3096
			       "for consistent allocations\n", pci_name(pdev));
3097
			goto err_out_free_regions;
3098
		}
3099
3100
	} else {
3101
		err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
3102
		if (err) {
3103
			printk(KERN_ERR PFX "%s no usable DMA configuration\n",
3104
			       pci_name(pdev));
3105
			goto err_out_free_regions;
3106
		}
3107
	}
3108
3109
#ifdef __BIG_ENDIAN
3110
	/* byte swap descriptors in hardware */
3111
	{
3112
		u32 reg;
3113
3114
		pci_read_config_dword(pdev, PCI_DEV_REG2, &reg);
3115
		reg |= PCI_REV_DESC;
3116
		pci_write_config_dword(pdev, PCI_DEV_REG2, reg);
3117
	}
3118
#endif
3119
3120
	err = -ENOMEM;
3121
	hw = kzalloc(sizeof(*hw), GFP_KERNEL);
3122
	if (!hw) {
3123
		printk(KERN_ERR PFX "%s: cannot allocate hardware struct\n",
3124
		       pci_name(pdev));
3125
		goto err_out_free_regions;
3126
	}
3127
3128
	hw->pdev = pdev;
3129
3130
	hw->regs = ioremap_nocache(pci_resource_start(pdev, 0), 0x4000);
3131
	if (!hw->regs) {
3132
		printk(KERN_ERR PFX "%s: cannot map device registers\n",
3133
		       pci_name(pdev));
3134
		goto err_out_free_hw;
3135
	}
3136
	hw->pm_cap = pm_cap;
3137
3138
	err = sky2_reset(hw);
3139
	if (err)
3140
		goto err_out_iounmap;
3141
3142
	printk(KERN_INFO PFX "v%s addr 0x%lx irq %d Yukon-%s (0x%x) rev %d\n",
3143
	       DRV_VERSION, pci_resource_start(pdev, 0), pdev->irq,
3144
	       yukon2_name[hw->chip_id - CHIP_ID_YUKON_XL],
3145
	       hw->chip_id, hw->chip_rev);
3146
3147
	dev = sky2_init_netdev(hw, 0, using_dac);
3148
	if (!dev)
3149
		goto err_out_free_pci;
3150
3151
	err = register_netdev(dev);
3152
	if (err) {
3153
		printk(KERN_ERR PFX "%s: cannot register net device\n",
3154
		       pci_name(pdev));
3155
		goto err_out_free_netdev;
3156
	}
3157
3158
	sky2_show_addr(dev);
3159
3160
	if (hw->ports > 1 && (dev1 = sky2_init_netdev(hw, 1, using_dac))) {
3161
		if (register_netdev(dev1) == 0)
3162
			sky2_show_addr(dev1);
3163
		else {
3164
			/* Failure to register second port need not be fatal */
3165
			printk(KERN_WARNING PFX
3166
			       "register of second port failed\n");
3167
			hw->dev[1] = NULL;
3168
			free_netdev(dev1);
3169
		}
3170
	}
3171
3172
	err = request_irq(pdev->irq, sky2_intr, SA_SHIRQ, DRV_NAME, hw);
3173
	if (err) {
3174
		printk(KERN_ERR PFX "%s: cannot assign irq %d\n",
3175
		       pci_name(pdev), pdev->irq);
3176
		goto err_out_unregister;
3177
	}
3178
3179
	hw->intr_mask = Y2_IS_BASE;
3180
	sky2_write32(hw, B0_IMSK, hw->intr_mask);
3181
3182
	pci_set_drvdata(pdev, hw);
3183
3184
	return 0;
3185
3186
err_out_unregister:
3187
	if (dev1) {
3188
		unregister_netdev(dev1);
3189
		free_netdev(dev1);
3190
	}
3191
	unregister_netdev(dev);
3192
err_out_free_netdev:
3193
	free_netdev(dev);
3194
err_out_free_pci:
3195
	sky2_write8(hw, B0_CTST, CS_RST_SET);
3196
	pci_free_consistent(hw->pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma);
3197
err_out_iounmap:
3198
	iounmap(hw->regs);
3199
err_out_free_hw:
3200
	kfree(hw);
3201
err_out_free_regions:
3202
	pci_release_regions(pdev);
3203
	pci_disable_device(pdev);
3204
err_out:
3205
	return err;
3206
}
3207
3208
static void __devexit sky2_remove(struct pci_dev *pdev)
3209
{
3210
	struct sky2_hw *hw = pci_get_drvdata(pdev);
3211
	struct net_device *dev0, *dev1;
3212
3213
	if (!hw)
3214
		return;
3215
3216
	dev0 = hw->dev[0];
3217
	dev1 = hw->dev[1];
3218
	if (dev1)
3219
		unregister_netdev(dev1);
3220
	unregister_netdev(dev0);
3221
3222
	sky2_write32(hw, B0_IMSK, 0);
3223
	sky2_set_power_state(hw, PCI_D3hot);
3224
	sky2_write16(hw, B0_Y2LED, LED_STAT_OFF);
3225
	sky2_write8(hw, B0_CTST, CS_RST_SET);
3226
	sky2_read8(hw, B0_CTST);
3227
3228
	free_irq(pdev->irq, hw);
3229
	pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma);
3230
	pci_release_regions(pdev);
3231
	pci_disable_device(pdev);
3232
3233
	if (dev1)
3234
		free_netdev(dev1);
3235
	free_netdev(dev0);
3236
	iounmap(hw->regs);
3237
	kfree(hw);
3238
3239
	pci_set_drvdata(pdev, NULL);
3240
}
3241
3242
#ifdef CONFIG_PM
3243
static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
3244
{
3245
	struct sky2_hw *hw = pci_get_drvdata(pdev);
3246
	int i;
3247
3248
	for (i = 0; i < 2; i++) {
3249
		struct net_device *dev = hw->dev[i];
3250
3251
		if (dev) {
3252
			if (!netif_running(dev))
3253
				continue;
3254
3255
			sky2_down(dev);
3256
			netif_device_detach(dev);
3257
		}
3258
	}
3259
3260
	return sky2_set_power_state(hw, pci_choose_state(pdev, state));
3261
}
3262
3263
static int sky2_resume(struct pci_dev *pdev)
3264
{
3265
	struct sky2_hw *hw = pci_get_drvdata(pdev);
3266
	int i;
3267
3268
	pci_restore_state(pdev);
3269
	pci_enable_wake(pdev, PCI_D0, 0);
3270
	sky2_set_power_state(hw, PCI_D0);
3271
3272
	sky2_reset(hw);
3273
3274
	for (i = 0; i < 2; i++) {
3275
		struct net_device *dev = hw->dev[i];
3276
		if (dev) {
3277
			if (netif_running(dev)) {
3278
				netif_device_attach(dev);
3279
				if (sky2_up(dev))
3280
					dev_close(dev);
3281
			}
3282
		}
3283
	}
3284
	return 0;
3285
}
3286
#endif
3287
3288
static struct pci_driver sky2_driver = {
3289
	.name = DRV_NAME,
3290
	.id_table = sky2_id_table,
3291
	.probe = sky2_probe,
3292
	.remove = __devexit_p(sky2_remove),
3293
#ifdef CONFIG_PM
3294
	.suspend = sky2_suspend,
3295
	.resume = sky2_resume,
3296
#endif
3297
};
3298
3299
static int __init sky2_init_module(void)
3300
{
3301
	return pci_register_driver(&sky2_driver);
3302
}
3303
3304
static void __exit sky2_cleanup_module(void)
3305
{
3306
	pci_unregister_driver(&sky2_driver);
3307
}
3308
3309
module_init(sky2_init_module);
3310
module_exit(sky2_cleanup_module);
3311
3312
MODULE_DESCRIPTION("Marvell Yukon 2 Gigabit Ethernet driver");
3313
MODULE_AUTHOR("Stephen Hemminger <shemminger@osdl.org>");
3314
MODULE_LICENSE("GPL");
3315
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