Add support for SK-9521 V2.0 and 3COM 3C940.

Tested at 100Mbit only, using Asus P4P800 onboard 3C940.
The -stable version of this patch I have in use for ~2 weeks now, and works
just fine for me.

Based on: Nathan L. Binkert's patch for OpenBSD
Patch submitted by and thanks to: Jung-uk Kim <jkim@niksun.com>
MFC after: 2 weeks
This commit is contained in:
Wilko Bulte 2003-09-20 10:53:08 +00:00
parent f9547841bc
commit 59ce78fef1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=120281
7 changed files with 1736 additions and 404 deletions

View file

@ -36,6 +36,13 @@ __FBSDID("$FreeBSD$");
* driver for the Marvell 88E1000 series external 1000/100/10-BT PHY.
*/
/*
* Support added for the Marvell 88E1011 (Alaska) 1000/100/10baseTX and
* 1000baseSX PHY.
* Nathan Binkert <nate@openbsd.org>
* Jung-uk Kim <jkim@niksun.com>
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@ -88,8 +95,9 @@ e1000phy_probe(device_t dev)
ma = device_get_ivars(dev);
id = ((ma->mii_id1 << 16) | ma->mii_id2) & E1000_ID_MASK;
if (id != E1000_ID_88E1000 && id != E1000_ID_88E1000S) {
if (id != E1000_ID_88E1000
&& id != E1000_ID_88E1000S
&& id != E1000_ID_88E1011) {
return ENXIO;
}
@ -103,6 +111,7 @@ e1000phy_attach(device_t dev)
struct mii_softc *sc;
struct mii_attach_args *ma;
struct mii_data *mii;
u_int32_t id;
getenv_int("e1000phy_debug", &e1000phy_debug);
@ -116,39 +125,49 @@ e1000phy_attach(device_t dev)
sc->mii_phy = ma->mii_phyno;
sc->mii_service = e1000phy_service;
sc->mii_pdata = mii;
sc->mii_flags |= MIIF_NOISOLATE;
id = ((ma->mii_id1 << 16) | ma->mii_id2) & E1000_ID_MASK;
if (id == E1000_ID_88E1011
&& (PHY_READ(sc, E1000_ESSR) & E1000_ESSR_FIBER_LINK))
sc->mii_flags |= MIIF_HAVEFIBER;
mii->mii_instance++;
e1000phy_reset(sc);
device_printf(dev, " ");
#define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL)
/*
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst),
E1000_CR_ISOLATE);
*/
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, sc->mii_inst),
E1000_CR_SPEED_10);
printf("10baseT, ");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, sc->mii_inst),
E1000_CR_SPEED_10 | E1000_CR_FULL_DUPLEX);
printf("10baseT-FDX, ");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst),
E1000_CR_SPEED_100);
printf("100baseTX, ");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, sc->mii_inst),
E1000_CR_SPEED_100 | E1000_CR_FULL_DUPLEX);
printf("100baseTX-FDX, ");
/*
* 1000BT-simplex not supported; driver must ignore this entry,
* but it must be present in order to manually set full-duplex.
*/
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0, sc->mii_inst),
E1000_CR_SPEED_1000);
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, IFM_FDX, sc->mii_inst),
E1000_CR_SPEED_1000 | E1000_CR_FULL_DUPLEX);
printf("1000baseTX-FDX, ");
if ((sc->mii_flags & MIIF_HAVEFIBER) == 0) {
#if 0
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst),
E1000_CR_ISOLATE);
#endif
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, sc->mii_inst),
E1000_CR_SPEED_10);
printf("10baseT, ");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, sc->mii_inst),
E1000_CR_SPEED_10 | E1000_CR_FULL_DUPLEX);
printf("10baseT-FDX, ");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst),
E1000_CR_SPEED_100);
printf("100baseTX, ");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, sc->mii_inst),
E1000_CR_SPEED_100 | E1000_CR_FULL_DUPLEX);
printf("100baseTX-FDX, ");
/*
* 1000BT-simplex not supported; driver must ignore this entry,
* but it must be present in order to manually set full-duplex.
*/
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0, sc->mii_inst),
E1000_CR_SPEED_1000);
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, IFM_FDX, sc->mii_inst),
E1000_CR_SPEED_1000 | E1000_CR_FULL_DUPLEX);
printf("1000baseTX-FDX, ");
} else {
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX, sc->mii_inst),
E1000_CR_SPEED_1000 | E1000_CR_FULL_DUPLEX);
printf("1000baseSX-FDX, ");
}
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst), 0);
printf("auto\n");
#undef ADD
@ -242,6 +261,14 @@ e1000phy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
(void)e1000phy_mii_phy_auto(sc);
break;
case IFM_1000_SX:
e1000phy_reset(sc);
PHY_WRITE(sc, E1000_CR,
E1000_CR_FULL_DUPLEX | E1000_CR_SPEED_1000);
PHY_WRITE(sc, E1000_AR, E1000_FA_1000X_FD);
break;
case IFM_100_TX:
e1000phy_reset(sc);
@ -353,27 +380,34 @@ e1000phy_status(struct mii_softc *sc)
return;
}
if (ssr & E1000_SSR_1000MBS)
mii->mii_media_active |= IFM_1000_T;
else if (ssr & E1000_SSR_100MBS)
mii->mii_media_active |= IFM_100_TX;
else
mii->mii_media_active |= IFM_10_T;
if ((sc->mii_flags & MIIF_HAVEFIBER) == 0) {
if (ssr & E1000_SSR_1000MBS)
mii->mii_media_active |= IFM_1000_T;
else if (ssr & E1000_SSR_100MBS)
mii->mii_media_active |= IFM_100_TX;
else
mii->mii_media_active |= IFM_10_T;
} else {
if (ssr & E1000_SSR_1000MBS)
mii->mii_media_active |= IFM_1000_SX;
}
if (ssr & E1000_SSR_DUPLEX)
mii->mii_media_active |= IFM_FDX;
else
mii->mii_media_active |= IFM_HDX;
/* FLAG0==rx-flow-control FLAG1==tx-flow-control */
if ((ar & E1000_AR_PAUSE) && (lpar & E1000_LPAR_PAUSE)) {
mii->mii_media_active |= IFM_FLAG0 | IFM_FLAG1;
} else if (!(ar & E1000_AR_PAUSE) && (ar & E1000_AR_ASM_DIR) &&
(lpar & E1000_LPAR_PAUSE) && (lpar & E1000_LPAR_ASM_DIR)) {
mii->mii_media_active |= IFM_FLAG1;
} else if ((ar & E1000_AR_PAUSE) && (ar & E1000_AR_ASM_DIR) &&
!(lpar & E1000_LPAR_PAUSE) && (lpar & E1000_LPAR_ASM_DIR)) {
mii->mii_media_active |= IFM_FLAG0;
if ((sc->mii_flags & MIIF_HAVEFIBER) == 0) {
/* FLAG0==rx-flow-control FLAG1==tx-flow-control */
if ((ar & E1000_AR_PAUSE) && (lpar & E1000_LPAR_PAUSE)) {
mii->mii_media_active |= IFM_FLAG0 | IFM_FLAG1;
} else if (!(ar & E1000_AR_PAUSE) && (ar & E1000_AR_ASM_DIR) &&
(lpar & E1000_LPAR_PAUSE) && (lpar & E1000_LPAR_ASM_DIR)) {
mii->mii_media_active |= IFM_FLAG1;
} else if ((ar & E1000_AR_PAUSE) && (ar & E1000_AR_ASM_DIR) &&
!(lpar & E1000_LPAR_PAUSE) && (lpar & E1000_LPAR_ASM_DIR)) {
mii->mii_media_active |= IFM_FLAG0;
}
}
}
@ -381,12 +415,14 @@ static int
e1000phy_mii_phy_auto(struct mii_softc *mii)
{
PHY_WRITE(mii, E1000_AR, E1000_AR_10T | E1000_AR_10T_FD |
E1000_AR_100TX | E1000_AR_100TX_FD |
E1000_AR_PAUSE | E1000_AR_ASM_DIR);
PHY_WRITE(mii, E1000_1GCR, E1000_1GCR_1000T_FD);
PHY_WRITE(mii, E1000_CR,
E1000_CR_AUTO_NEG_ENABLE | E1000_CR_RESTART_AUTO_NEG);
if ((mii->mii_flags & MIIF_HAVEFIBER) == 0) {
PHY_WRITE(mii, E1000_AR, E1000_AR_10T | E1000_AR_10T_FD |
E1000_AR_100TX | E1000_AR_100TX_FD |
E1000_AR_PAUSE | E1000_AR_ASM_DIR);
PHY_WRITE(mii, E1000_1GCR, E1000_1GCR_1000T_FD);
PHY_WRITE(mii, E1000_CR,
E1000_CR_AUTO_NEG_ENABLE | E1000_CR_RESTART_AUTO_NEG);
}
return (EJUSTRETURN);
}

View file

@ -107,6 +107,7 @@
#define E1000_ID2 0x03 /* ID register 2 */
#define E1000_ID_88E1000 0x01410C50
#define E1000_ID_88E1000S 0x01410C40
#define E1000_ID_88E1011 0x01410C20
#define E1000_ID_MASK 0xFFFFFFF0
#define E1000_AR 0x04 /* autonegotiation advertise reg */
@ -122,6 +123,15 @@
#define E1000_AR_NEXT_PAGE 0x8000
#define E1000_AR_SPEED_MASK 0x01E0
/* Autonegotiation register bits for fiber cards (Alaska Only!) */
#define E1000_FA_1000X_FD 0x0020
#define E1000_FA_1000X 0x0040
#define E1000_FA_SYM_PAUSE 0x0080
#define E1000_FA_ASYM_PAUSE 0x0100
#define E1000_FA_FAULT1 0x1000
#define E1000_FA_FAULT2 0x2000
#define E1000_FA_NEXT_PAGE 0x8000
#define E1000_LPAR 0x05 /* autoneg link partner abilities reg */
#define E1000_LPAR_SELECTOR_FIELD 0x0001
#define E1000_LPAR_10T 0x0020
@ -135,6 +145,16 @@
#define E1000_LPAR_ACKNOWLEDGE 0x4000
#define E1000_LPAR_NEXT_PAGE 0x8000
/* autoneg link partner ability register bits for fiber cards (Alaska Only!) */
#define E1000_FPAR_1000X_FD 0x0020
#define E1000_FPAR_1000X 0x0040
#define E1000_FPAR_SYM_PAUSE 0x0080
#define E1000_FPAR_ASYM_PAUSE 0x0100
#define E1000_FPAR_FAULT1 0x1000
#define E1000_FPAR_FAULT2 0x2000
#define E1000_FPAR_ACK 0x4000
#define E1000_FPAR_NEXT_PAGE 0x8000
#define E1000_ER 0x06 /* autoneg expansion reg */
#define E1000_ER_LP_NWAY 0x0001
#define E1000_ER_PAGE_RXD 0x0002
@ -284,3 +304,11 @@
#define E1000_LCR_PULSE_340_670MS 0x5000
#define E1000_LCR_PULSE_670_13S 0x6000
#define E1000_LCR_PULSE_13_26S 0x7000
/* The following register is found only on the 88E1011 Alaska PHY */
#define E1000_ESSR 0x1B /* Extended PHY specific sts */
#define E1000_ESSR_FIBER_LINK 0x2000
#define E1000_ESSR_GMII_COPPER 0x000f
#define E1000_ESSR_GMII_FIBER 0x0007
#define E1000_ESSR_TBI_COPPER 0x000d
#define E1000_ESSR_TBI_FIBER 0x0005

View file

@ -172,5 +172,5 @@ model XAQTI XMACII 0x0000 XaQti Corp. XMAC II gigabit interface
/* Marvell Semiconductor PHYs */
model MARVELL E1000 0x0000 Marvell 88E1000 Gigabit PHY
model MARVELL E1011 0x0002 Marvell 88E1011 Gigabit PHY
model xxMARVELL E1000 0x0005 Marvell 88E1000 Gigabit PHY

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,5 @@
/* $OpenBSD: if_skreg.h,v 1.10 2003/08/12 05:23:06 nate Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000
* Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved.
@ -33,14 +35,45 @@
*/
/*
* SysKonnect PCI vendor ID
* Copyright (c) 2003 Nathan L. Binkert <binkertn@umich.edu>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#define SK_VENDORID 0x1148
/* Values to keep the different chip revisions apart */
#define SK_GENESIS 0
#define SK_YUKON 1
/*
* SK-NET gigabit ethernet device ID
* SysKonnect PCI vendor ID
*/
#define SK_DEVICEID_GE 0x4300
#define VENDORID_SK 0x1148
/*
* SK-NET gigabit ethernet device IDs
*/
#define DEVICEID_SK_V1 0x4300
#define DEVICEID_SK_V2 0x4320
/*
* 3Com PCI vendor ID
*/
#define VENDORID_3COM 0x10b7
/*
* 3Com gigabit ethernet device ID
*/
#define DEVICEID_3COM_3C940 0x1700
/*
* GEnesis registers. The GEnesis chip has a 256-byte I/O window
@ -328,6 +361,8 @@
#define SK_PHYTYPE_BCOM 1 /* Broadcom BCM5400 */
#define SK_PHYTYPE_LONE 2 /* Level One LXT1000 */
#define SK_PHYTYPE_NAT 3 /* National DP83891 */
#define SK_PHYTYPE_MARV_COPPER 4 /* Marvell 88E1011S */
#define SK_PHYTYPE_MARV_FIBER 5 /* Marvell 88E1011S (fiber) */
/*
* PHY addresses.
@ -336,6 +371,7 @@
#define SK_PHYADDR_BCOM 0x1
#define SK_PHYADDR_LONE 0x3
#define SK_PHYADDR_NAT 0x0
#define SK_PHYADDR_MARV 0x0
#define SK_CONFIG_SINGLEMAC 0x01
#define SK_CONFIG_DIS_DSL_CLK 0x02
@ -805,6 +841,28 @@
#define SK_FIFO_END 0x3F
/* Receive MAC FIFO 1 (Yukon Only) */
#define SK_RXMF1_END 0x0C40
#define SK_RXMF1_THRESHOLD 0x0C44
#define SK_RXMF1_CTRL_TEST 0x0C48
#define SK_RXMF1_WRITE_PTR 0x0C60
#define SK_RXMF1_WRITE_LEVEL 0x0C68
#define SK_RXMF1_READ_PTR 0x0C70
#define SK_RXMF1_READ_LEVEL 0x0C78
#define SK_RFCTL_WR_PTR_TST_ON 0x00004000 /* Write pointer test on*/
#define SK_RFCTL_WR_PTR_TST_OFF 0x00002000 /* Write pointer test off */
#define SK_RFCTL_WR_PTR_STEP 0x00001000 /* Write pointer increment */
#define SK_RFCTL_RD_PTR_TST_ON 0x00000400 /* Read pointer test on */
#define SK_RFCTL_RD_PTR_TST_OFF 0x00000200 /* Read pointer test off */
#define SK_RFCTL_RD_PTR_STEP 0x00000100 /* Read pointer increment */
#define SK_RFCTL_RX_FIFO_OVER 0x00000040 /* Clear IRQ RX FIFO Overrun */
#define SK_RFCTL_FRAME_RX_DONE 0x00000010 /* Clear IRQ Frame RX Done */
#define SK_RFCTL_OPERATION_ON 0x00000008 /* Operational mode on */
#define SK_RFCTL_OPERATION_OFF 0x00000004 /* Operational mode off */
#define SK_RFCTL_RESET_CLEAR 0x00000002 /* MAC FIFO Reset Clear */
#define SK_RFCTL_RESET_SET 0x00000001 /* MAC FIFO Reset Set */
/* Block 25 -- RX MAC FIFO 2 regisrers and LINK_SYNC counter */
#define SK_RXF2_END 0x0C80
#define SK_RXF2_WPTR 0x0C84
@ -864,6 +922,31 @@
#define SK_TXLED1_CTL 0x0D28
#define SK_TXLED1_TST 0x0D29
/* Receive MAC FIFO 1 (Yukon Only) */
#define SK_TXMF1_END 0x0D40
#define SK_TXMF1_THRESHOLD 0x0D44
#define SK_TXMF1_CTRL_TEST 0x0D48
#define SK_TXMF1_WRITE_PTR 0x0D60
#define SK_TXMF1_WRITE_SHADOW 0x0D64
#define SK_TXMF1_WRITE_LEVEL 0x0D68
#define SK_TXMF1_READ_PTR 0x0D70
#define SK_TXMF1_RESTART_PTR 0x0D74
#define SK_TXMF1_READ_LEVEL 0x0D78
#define SK_TFCTL_WR_PTR_TST_ON 0x00004000 /* Write pointer test on*/
#define SK_TFCTL_WR_PTR_TST_OFF 0x00002000 /* Write pointer test off */
#define SK_TFCTL_WR_PTR_STEP 0x00001000 /* Write pointer increment */
#define SK_TFCTL_RD_PTR_TST_ON 0x00000400 /* Read pointer test on */
#define SK_TFCTL_RD_PTR_TST_OFF 0x00000200 /* Read pointer test off */
#define SK_TFCTL_RD_PTR_STEP 0x00000100 /* Read pointer increment */
#define SK_TFCTL_TX_FIFO_UNDER 0x00000040 /* Clear IRQ TX FIFO Under */
#define SK_TFCTL_FRAME_TX_DONE 0x00000020 /* Clear IRQ Frame TX Done */
#define SK_TFCTL_IRQ_PARITY_ER 0x00000010 /* Clear IRQ Parity Error */
#define SK_TFCTL_OPERATION_ON 0x00000008 /* Operational mode on */
#define SK_TFCTL_OPERATION_OFF 0x00000004 /* Operational mode off */
#define SK_TFCTL_RESET_CLEAR 0x00000002 /* MAC FIFO Reset Clear */
#define SK_TFCTL_RESET_SET 0x00000001 /* MAC FIFO Reset Set */
/* Block 27 -- TX MAC FIFO 2 regisrers */
#define SK_TXF2_END 0x0D80
#define SK_TXF2_WPTR 0x0D84
@ -903,35 +986,148 @@
#define SK_FIFO_OFF 0x00000004
#define SK_FIFO_ON 0x00000008
/* Block 28 -- Descriptor Poll Timer */
#define SK_DPT_INIT 0x0e00 /* Initial value 24 bits */
#define SK_DPT_TIMER 0x0e04 /* Mul of 78.12MHz clk (24b) */
#define SK_DPT_TIMER_CTRL 0x0e08 /* Timer Control 16 bits */
#define SK_DPT_TCTL_STOP 0x0001 /* Stop Timer */
#define SK_DPT_TCTL_START 0x0002 /* Start Timer */
#define SK_DPT_TIMER_TEST 0x0e0a /* Timer Test 16 bits */
#define SK_DPT_TTEST_STEP 0x0001 /* Timer Decrement */
#define SK_DPT_TTEST_OFF 0x0002 /* Test Mode Off */
#define SK_DPT_TTEST_ON 0x0004 /* Test Mode On */
/* Block 29 -- reserved */
/* Block 30 -- GMAC/GPHY Control Registers (Yukon Only)*/
#define SK_GMAC_CTRL 0x0f00 /* GMAC Control Register */
#define SK_GPHY_CTRL 0x0f04 /* GPHY Control Register */
#define SK_GMAC_ISR 0x0f08 /* GMAC Interrupt Source Register */
#define SK_GMAC_IMR 0x0f08 /* GMAC Interrupt Mask Register */
#define SK_LINK_CTRL 0x0f10 /* Link Control Register (LCR) */
#define SK_WOL_CTRL 0x0f20 /* Wake on LAN Control Register */
#define SK_MAC_ADDR_LOW 0x0f24 /* Mack Address Registers LOW */
#define SK_MAC_ADDR_HIGH 0x0f28 /* Mack Address Registers HIGH */
#define SK_PAT_READ_PTR 0x0f2c /* Pattern Read Pointer Register */
#define SK_PAT_LEN_REG0 0x0f30 /* Pattern Length Register 0 */
#define SK_PAT_LEN0 0x0f30 /* Pattern Length 0 */
#define SK_PAT_LEN1 0x0f31 /* Pattern Length 1 */
#define SK_PAT_LEN2 0x0f32 /* Pattern Length 2 */
#define SK_PAT_LEN3 0x0f33 /* Pattern Length 3 */
#define SK_PAT_LEN_REG1 0x0f34 /* Pattern Length Register 1 */
#define SK_PAT_LEN4 0x0f34 /* Pattern Length 4 */
#define SK_PAT_LEN5 0x0f35 /* Pattern Length 5 */
#define SK_PAT_LEN6 0x0f36 /* Pattern Length 6 */
#define SK_PAT_LEN7 0x0f37 /* Pattern Length 7 */
#define SK_PAT_CTR_REG0 0x0f38 /* Pattern Counter Register 0 */
#define SK_PAT_CTR0 0x0f38 /* Pattern Counter 0 */
#define SK_PAT_CTR1 0x0f39 /* Pattern Counter 1 */
#define SK_PAT_CTR2 0x0f3a /* Pattern Counter 2 */
#define SK_PAT_CTR3 0x0f3b /* Pattern Counter 3 */
#define SK_PAT_CTR_REG1 0x0f3c /* Pattern Counter Register 1 */
#define SK_PAT_CTR4 0x0f3c /* Pattern Counter 4 */
#define SK_PAT_CTR5 0x0f3d /* Pattern Counter 5 */
#define SK_PAT_CTR6 0x0f3e /* Pattern Counter 6 */
#define SK_PAT_CTR7 0x0f3f /* Pattern Counter 7 */
#define SK_GMAC_LOOP_ON 0x00000020 /* Loopback mode for testing */
#define SK_GMAC_LOOP_OFF 0x00000010 /* purposes */
#define SK_GMAC_PAUSE_ON 0x00000008 /* enable forward of pause */
#define SK_GMAC_PAUSE_OFF 0x00000004 /* signal to GMAC */
#define SK_GMAC_RESET_CLEAR 0x00000002 /* Clear GMAC Reset */
#define SK_GMAC_RESET_SET 0x00000001 /* Set GMAC Reset */
#define SK_GPHY_SEL_BDT 0x10000000 /* Select Bidirectional xfer */
#define SK_GPHY_INT_POL_HI 0x08000000 /* IRQ Polarity Active */
#define SK_GPHY_75_OHM 0x04000000 /* Use 75 Ohm Termination */
#define SK_GPHY_DIS_FC 0x02000000 /* Disable Auto Fiber/Copper */
#define SK_GPHY_DIS_SLEEP 0x01000000 /* Disable Energy Detect */
#define SK_GPHY_HWCFG_M_3 0x00800000 /* HWCFG_MODE[3] */
#define SK_GPHY_HWCFG_M_2 0x00400000 /* HWCFG_MODE[2] */
#define SK_GPHY_HWCFG_M_1 0x00200000 /* HWCFG_MODE[1] */
#define SK_GPHY_HWCFG_M_0 0x00100000 /* HWCFG_MODE[0] */
#define SK_GPHY_ANEG_0 0x00080000 /* ANEG[0] */
#define SK_GPHY_ENA_XC 0x00040000 /* Enable MDI Crossover */
#define SK_GPHY_DIS_125 0x00020000 /* Disable 125MHz Clock */
#define SK_GPHY_ANEG_3 0x00010000 /* ANEG[3] */
#define SK_GPHY_ANEG_2 0x00008000 /* ANEG[2] */
#define SK_GPHY_ANEG_1 0x00004000 /* ANEG[1] */
#define SK_GPHY_ENA_PAUSE 0x00002000 /* Enable Pause */
#define SK_GPHY_PHYADDR_4 0x00001000 /* Bit 4 of Phy Addr */
#define SK_GPHY_PHYADDR_3 0x00000800 /* Bit 3 of Phy Addr */
#define SK_GPHY_PHYADDR_2 0x00000400 /* Bit 2 of Phy Addr */
#define SK_GPHY_PHYADDR_1 0x00000200 /* Bit 1 of Phy Addr */
#define SK_GPHY_PHYADDR_0 0x00000100 /* Bit 0 of Phy Addr */
#define SK_GPHY_RESET_CLEAR 0x00000002 /* Clear GPHY Reset */
#define SK_GPHY_RESET_SET 0x00000001 /* Set GPHY Reset */
#define SK_GPHY_COPPER (SK_GPHY_HWCFG_M_0 | SK_GPHY_HWCFG_M_1 | \
SK_GPHY_HWCFG_M_2 | SK_GPHY_HWCFG_M_3 )
#define SK_GPHY_FIBER (SK_GPHY_HWCFG_M_0 | SK_GPHY_HWCFG_M_1 | \
SK_GPHY_HWCFG_M_2 )
#define SK_GPHY_ANEG_ALL (SK_GPHY_ANEG_0 | SK_GPHY_ANEG_1 | \
SK_GPHY_ANEG_2 | SK_GPHY_ANEG_3 )
#define SK_GMAC_INT_TX_OFLOW 0x20 /* Transmit Counter Overflow */
#define SK_GMAC_INT_RX_OFLOW 0x10 /* Receiver Overflow */
#define SK_GMAC_INT_TX_UNDER 0x08 /* Transmit FIFO Underrun */
#define SK_GMAC_INT_TX_DONE 0x04 /* Transmit Complete */
#define SK_GMAC_INT_RX_OVER 0x02 /* Receive FIFO Overrun */
#define SK_GMAC_INT_RX_DONE 0x01 /* Receive Complete */
#define SK_LINK_RESET_CLEAR 0x0002 /* Link Reset Clear */
#define SK_LINK_RESET_SET 0x0001 /* Link Reset Set */
/* Block 31 -- reserved */
/* Block 32-33 -- Pattern Ram */
#define SK_WOL_PRAM 0x1000
/* Block 0x22 - 0x3f -- reserved */
/* Block 0x40 to 0x4F -- XMAC 1 registers */
#define SK_XMAC1_BASE 0x2000
#define SK_XMAC1_END 0x23FF
/* Block 0x50 to 0x5F -- MARV 1 registers */
#define SK_MARV1_BASE 0x2800
/* Block 0x60 to 0x6F -- XMAC 2 registers */
#define SK_XMAC2_BASE 0x3000
#define SK_XMAC2_END 0x33FF
/* Block 0x70 to 0x7F -- MARV 2 registers */
#define SK_MARV2_BASE 0x3800
/* Compute relative offset of an XMAC register in the XMAC window(s). */
#define SK_XMAC_REG(reg, mac) (((reg) * 2) + SK_XMAC1_BASE + \
(mac * (SK_XMAC2_BASE - SK_XMAC1_BASE)))
#define SK_XMAC_REG(sc, reg) (((reg) * 2) + SK_XMAC1_BASE + \
(((sc)->sk_port) * (SK_XMAC2_BASE - SK_XMAC1_BASE)))
#define SK_XM_READ_4(sc, reg) \
(sk_win_read_2(sc->sk_softc, \
SK_XMAC_REG(reg, sc->sk_port)) & 0xFFFF) | \
((sk_win_read_2(sc->sk_softc, \
SK_XMAC_REG(reg + 2, sc->sk_port)) << 16) & 0xFFFF0000)
#if 0
#define SK_XM_READ_4(sc, reg) \
((sk_win_read_2(sc->sk_softc, \
SK_XMAC_REG(sc, reg)) & 0xFFFF) | \
((sk_win_read_2(sc->sk_softc, \
SK_XMAC_REG(sc, reg + 2)) & 0xFFFF) << 16))
#define SK_XM_WRITE_4(sc, reg, val) \
sk_win_write_2(sc->sk_softc, \
SK_XMAC_REG(reg, sc->sk_port), ((val) & 0xFFFF)); \
sk_win_write_2(sc->sk_softc, \
SK_XMAC_REG(reg + 2, sc->sk_port), ((val) >> 16) & 0xFFFF);
#define SK_XM_WRITE_4(sc, reg, val) \
sk_win_write_2(sc->sk_softc, SK_XMAC_REG(sc, reg), \
((val) & 0xFFFF)); \
sk_win_write_2(sc->sk_softc, SK_XMAC_REG(sc, reg + 2), \
((val) >> 16) & 0xFFFF)
#else
#define SK_XM_READ_4(sc, reg) \
sk_win_read_4(sc->sk_softc, SK_XMAC_REG(sc, reg))
#define SK_XM_READ_2(sc, reg) \
sk_win_read_2(sc->sk_softc, SK_XMAC_REG(reg, sc->sk_port))
#define SK_XM_WRITE_4(sc, reg, val) \
sk_win_write_4(sc->sk_softc, SK_XMAC_REG(sc, reg), (val))
#endif
#define SK_XM_WRITE_2(sc, reg, val) \
sk_win_write_2(sc->sk_softc, SK_XMAC_REG(reg, sc->sk_port), val)
#define SK_XM_READ_2(sc, reg) \
sk_win_read_2(sc->sk_softc, SK_XMAC_REG(sc, reg))
#define SK_XM_WRITE_2(sc, reg, val) \
sk_win_write_2(sc->sk_softc, SK_XMAC_REG(sc, reg), val)
#define SK_XM_SETBIT_4(sc, reg, x) \
SK_XM_WRITE_4(sc, reg, (SK_XM_READ_4(sc, reg)) | (x))
@ -945,6 +1141,34 @@
#define SK_XM_CLRBIT_2(sc, reg, x) \
SK_XM_WRITE_2(sc, reg, (SK_XM_READ_2(sc, reg)) & ~(x))
/* Compute relative offset of an MARV register in the MARV window(s). */
#define SK_YU_REG(sc, reg) \
((reg) + SK_MARV1_BASE + \
(((sc)->sk_port) * (SK_MARV2_BASE - SK_MARV1_BASE)))
#define SK_YU_READ_4(sc, reg) \
sk_win_read_4((sc)->sk_softc, SK_YU_REG((sc), (reg)))
#define SK_YU_READ_2(sc, reg) \
sk_win_read_2((sc)->sk_softc, SK_YU_REG((sc), (reg)))
#define SK_YU_WRITE_4(sc, reg, val) \
sk_win_write_4((sc)->sk_softc, SK_YU_REG((sc), (reg)), (val))
#define SK_YU_WRITE_2(sc, reg, val) \
sk_win_write_2((sc)->sk_softc, SK_YU_REG((sc), (reg)), (val))
#define SK_YU_SETBIT_4(sc, reg, x) \
SK_YU_WRITE_4(sc, reg, (SK_YU_READ_4(sc, reg)) | (x))
#define SK_YU_CLRBIT_4(sc, reg, x) \
SK_YU_WRITE_4(sc, reg, (SK_YU_READ_4(sc, reg)) & ~(x))
#define SK_YU_SETBIT_2(sc, reg, x) \
SK_YU_WRITE_2(sc, reg, (SK_YU_READ_2(sc, reg)) | (x))
#define SK_YU_CLRBIT_2(sc, reg, x) \
SK_YU_WRITE_2(sc, reg, (SK_YU_READ_2(sc, reg)) & ~(x))
/*
* The default FIFO threshold on the XMAC II is 4 bytes. On
@ -1018,18 +1242,18 @@ struct vpd_key {
#define VPD_RES_END 0x78 /* end tag */
#define CSR_WRITE_4(sc, reg, val) \
bus_space_write_4(sc->sk_btag, sc->sk_bhandle, reg, val)
bus_space_write_4((sc)->sk_btag, (sc)->sk_bhandle, (reg), (val))
#define CSR_WRITE_2(sc, reg, val) \
bus_space_write_2(sc->sk_btag, sc->sk_bhandle, reg, val)
bus_space_write_2((sc)->sk_btag, (sc)->sk_bhandle, (reg), (val))
#define CSR_WRITE_1(sc, reg, val) \
bus_space_write_1(sc->sk_btag, sc->sk_bhandle, reg, val)
bus_space_write_1((sc)->sk_btag, (sc)->sk_bhandle, (reg), (val))
#define CSR_READ_4(sc, reg) \
bus_space_read_4(sc->sk_btag, sc->sk_bhandle, reg)
bus_space_read_4((sc)->sk_btag, (sc)->sk_bhandle, (reg))
#define CSR_READ_2(sc, reg) \
bus_space_read_2(sc->sk_btag, sc->sk_bhandle, reg)
bus_space_read_2((sc)->sk_btag, (sc)->sk_bhandle, (reg))
#define CSR_READ_1(sc, reg) \
bus_space_read_1(sc->sk_btag, sc->sk_bhandle, reg)
bus_space_read_1((sc)->sk_btag, (sc)->sk_bhandle, (reg))
struct sk_type {
u_int16_t sk_vid;

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,5 @@
/* $OpenBSD: if_skreg.h,v 1.10 2003/08/12 05:23:06 nate Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000
* Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved.
@ -33,14 +35,45 @@
*/
/*
* SysKonnect PCI vendor ID
* Copyright (c) 2003 Nathan L. Binkert <binkertn@umich.edu>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#define SK_VENDORID 0x1148
/* Values to keep the different chip revisions apart */
#define SK_GENESIS 0
#define SK_YUKON 1
/*
* SK-NET gigabit ethernet device ID
* SysKonnect PCI vendor ID
*/
#define SK_DEVICEID_GE 0x4300
#define VENDORID_SK 0x1148
/*
* SK-NET gigabit ethernet device IDs
*/
#define DEVICEID_SK_V1 0x4300
#define DEVICEID_SK_V2 0x4320
/*
* 3Com PCI vendor ID
*/
#define VENDORID_3COM 0x10b7
/*
* 3Com gigabit ethernet device ID
*/
#define DEVICEID_3COM_3C940 0x1700
/*
* GEnesis registers. The GEnesis chip has a 256-byte I/O window
@ -328,6 +361,8 @@
#define SK_PHYTYPE_BCOM 1 /* Broadcom BCM5400 */
#define SK_PHYTYPE_LONE 2 /* Level One LXT1000 */
#define SK_PHYTYPE_NAT 3 /* National DP83891 */
#define SK_PHYTYPE_MARV_COPPER 4 /* Marvell 88E1011S */
#define SK_PHYTYPE_MARV_FIBER 5 /* Marvell 88E1011S (fiber) */
/*
* PHY addresses.
@ -336,6 +371,7 @@
#define SK_PHYADDR_BCOM 0x1
#define SK_PHYADDR_LONE 0x3
#define SK_PHYADDR_NAT 0x0
#define SK_PHYADDR_MARV 0x0
#define SK_CONFIG_SINGLEMAC 0x01
#define SK_CONFIG_DIS_DSL_CLK 0x02
@ -805,6 +841,28 @@
#define SK_FIFO_END 0x3F
/* Receive MAC FIFO 1 (Yukon Only) */
#define SK_RXMF1_END 0x0C40
#define SK_RXMF1_THRESHOLD 0x0C44
#define SK_RXMF1_CTRL_TEST 0x0C48
#define SK_RXMF1_WRITE_PTR 0x0C60
#define SK_RXMF1_WRITE_LEVEL 0x0C68
#define SK_RXMF1_READ_PTR 0x0C70
#define SK_RXMF1_READ_LEVEL 0x0C78
#define SK_RFCTL_WR_PTR_TST_ON 0x00004000 /* Write pointer test on*/
#define SK_RFCTL_WR_PTR_TST_OFF 0x00002000 /* Write pointer test off */
#define SK_RFCTL_WR_PTR_STEP 0x00001000 /* Write pointer increment */
#define SK_RFCTL_RD_PTR_TST_ON 0x00000400 /* Read pointer test on */
#define SK_RFCTL_RD_PTR_TST_OFF 0x00000200 /* Read pointer test off */
#define SK_RFCTL_RD_PTR_STEP 0x00000100 /* Read pointer increment */
#define SK_RFCTL_RX_FIFO_OVER 0x00000040 /* Clear IRQ RX FIFO Overrun */
#define SK_RFCTL_FRAME_RX_DONE 0x00000010 /* Clear IRQ Frame RX Done */
#define SK_RFCTL_OPERATION_ON 0x00000008 /* Operational mode on */
#define SK_RFCTL_OPERATION_OFF 0x00000004 /* Operational mode off */
#define SK_RFCTL_RESET_CLEAR 0x00000002 /* MAC FIFO Reset Clear */
#define SK_RFCTL_RESET_SET 0x00000001 /* MAC FIFO Reset Set */
/* Block 25 -- RX MAC FIFO 2 regisrers and LINK_SYNC counter */
#define SK_RXF2_END 0x0C80
#define SK_RXF2_WPTR 0x0C84
@ -864,6 +922,31 @@
#define SK_TXLED1_CTL 0x0D28
#define SK_TXLED1_TST 0x0D29
/* Receive MAC FIFO 1 (Yukon Only) */
#define SK_TXMF1_END 0x0D40
#define SK_TXMF1_THRESHOLD 0x0D44
#define SK_TXMF1_CTRL_TEST 0x0D48
#define SK_TXMF1_WRITE_PTR 0x0D60
#define SK_TXMF1_WRITE_SHADOW 0x0D64
#define SK_TXMF1_WRITE_LEVEL 0x0D68
#define SK_TXMF1_READ_PTR 0x0D70
#define SK_TXMF1_RESTART_PTR 0x0D74
#define SK_TXMF1_READ_LEVEL 0x0D78
#define SK_TFCTL_WR_PTR_TST_ON 0x00004000 /* Write pointer test on*/
#define SK_TFCTL_WR_PTR_TST_OFF 0x00002000 /* Write pointer test off */
#define SK_TFCTL_WR_PTR_STEP 0x00001000 /* Write pointer increment */
#define SK_TFCTL_RD_PTR_TST_ON 0x00000400 /* Read pointer test on */
#define SK_TFCTL_RD_PTR_TST_OFF 0x00000200 /* Read pointer test off */
#define SK_TFCTL_RD_PTR_STEP 0x00000100 /* Read pointer increment */
#define SK_TFCTL_TX_FIFO_UNDER 0x00000040 /* Clear IRQ TX FIFO Under */
#define SK_TFCTL_FRAME_TX_DONE 0x00000020 /* Clear IRQ Frame TX Done */
#define SK_TFCTL_IRQ_PARITY_ER 0x00000010 /* Clear IRQ Parity Error */
#define SK_TFCTL_OPERATION_ON 0x00000008 /* Operational mode on */
#define SK_TFCTL_OPERATION_OFF 0x00000004 /* Operational mode off */
#define SK_TFCTL_RESET_CLEAR 0x00000002 /* MAC FIFO Reset Clear */
#define SK_TFCTL_RESET_SET 0x00000001 /* MAC FIFO Reset Set */
/* Block 27 -- TX MAC FIFO 2 regisrers */
#define SK_TXF2_END 0x0D80
#define SK_TXF2_WPTR 0x0D84
@ -903,35 +986,148 @@
#define SK_FIFO_OFF 0x00000004
#define SK_FIFO_ON 0x00000008
/* Block 28 -- Descriptor Poll Timer */
#define SK_DPT_INIT 0x0e00 /* Initial value 24 bits */
#define SK_DPT_TIMER 0x0e04 /* Mul of 78.12MHz clk (24b) */
#define SK_DPT_TIMER_CTRL 0x0e08 /* Timer Control 16 bits */
#define SK_DPT_TCTL_STOP 0x0001 /* Stop Timer */
#define SK_DPT_TCTL_START 0x0002 /* Start Timer */
#define SK_DPT_TIMER_TEST 0x0e0a /* Timer Test 16 bits */
#define SK_DPT_TTEST_STEP 0x0001 /* Timer Decrement */
#define SK_DPT_TTEST_OFF 0x0002 /* Test Mode Off */
#define SK_DPT_TTEST_ON 0x0004 /* Test Mode On */
/* Block 29 -- reserved */
/* Block 30 -- GMAC/GPHY Control Registers (Yukon Only)*/
#define SK_GMAC_CTRL 0x0f00 /* GMAC Control Register */
#define SK_GPHY_CTRL 0x0f04 /* GPHY Control Register */
#define SK_GMAC_ISR 0x0f08 /* GMAC Interrupt Source Register */
#define SK_GMAC_IMR 0x0f08 /* GMAC Interrupt Mask Register */
#define SK_LINK_CTRL 0x0f10 /* Link Control Register (LCR) */
#define SK_WOL_CTRL 0x0f20 /* Wake on LAN Control Register */
#define SK_MAC_ADDR_LOW 0x0f24 /* Mack Address Registers LOW */
#define SK_MAC_ADDR_HIGH 0x0f28 /* Mack Address Registers HIGH */
#define SK_PAT_READ_PTR 0x0f2c /* Pattern Read Pointer Register */
#define SK_PAT_LEN_REG0 0x0f30 /* Pattern Length Register 0 */
#define SK_PAT_LEN0 0x0f30 /* Pattern Length 0 */
#define SK_PAT_LEN1 0x0f31 /* Pattern Length 1 */
#define SK_PAT_LEN2 0x0f32 /* Pattern Length 2 */
#define SK_PAT_LEN3 0x0f33 /* Pattern Length 3 */
#define SK_PAT_LEN_REG1 0x0f34 /* Pattern Length Register 1 */
#define SK_PAT_LEN4 0x0f34 /* Pattern Length 4 */
#define SK_PAT_LEN5 0x0f35 /* Pattern Length 5 */
#define SK_PAT_LEN6 0x0f36 /* Pattern Length 6 */
#define SK_PAT_LEN7 0x0f37 /* Pattern Length 7 */
#define SK_PAT_CTR_REG0 0x0f38 /* Pattern Counter Register 0 */
#define SK_PAT_CTR0 0x0f38 /* Pattern Counter 0 */
#define SK_PAT_CTR1 0x0f39 /* Pattern Counter 1 */
#define SK_PAT_CTR2 0x0f3a /* Pattern Counter 2 */
#define SK_PAT_CTR3 0x0f3b /* Pattern Counter 3 */
#define SK_PAT_CTR_REG1 0x0f3c /* Pattern Counter Register 1 */
#define SK_PAT_CTR4 0x0f3c /* Pattern Counter 4 */
#define SK_PAT_CTR5 0x0f3d /* Pattern Counter 5 */
#define SK_PAT_CTR6 0x0f3e /* Pattern Counter 6 */
#define SK_PAT_CTR7 0x0f3f /* Pattern Counter 7 */
#define SK_GMAC_LOOP_ON 0x00000020 /* Loopback mode for testing */
#define SK_GMAC_LOOP_OFF 0x00000010 /* purposes */
#define SK_GMAC_PAUSE_ON 0x00000008 /* enable forward of pause */
#define SK_GMAC_PAUSE_OFF 0x00000004 /* signal to GMAC */
#define SK_GMAC_RESET_CLEAR 0x00000002 /* Clear GMAC Reset */
#define SK_GMAC_RESET_SET 0x00000001 /* Set GMAC Reset */
#define SK_GPHY_SEL_BDT 0x10000000 /* Select Bidirectional xfer */
#define SK_GPHY_INT_POL_HI 0x08000000 /* IRQ Polarity Active */
#define SK_GPHY_75_OHM 0x04000000 /* Use 75 Ohm Termination */
#define SK_GPHY_DIS_FC 0x02000000 /* Disable Auto Fiber/Copper */
#define SK_GPHY_DIS_SLEEP 0x01000000 /* Disable Energy Detect */
#define SK_GPHY_HWCFG_M_3 0x00800000 /* HWCFG_MODE[3] */
#define SK_GPHY_HWCFG_M_2 0x00400000 /* HWCFG_MODE[2] */
#define SK_GPHY_HWCFG_M_1 0x00200000 /* HWCFG_MODE[1] */
#define SK_GPHY_HWCFG_M_0 0x00100000 /* HWCFG_MODE[0] */
#define SK_GPHY_ANEG_0 0x00080000 /* ANEG[0] */
#define SK_GPHY_ENA_XC 0x00040000 /* Enable MDI Crossover */
#define SK_GPHY_DIS_125 0x00020000 /* Disable 125MHz Clock */
#define SK_GPHY_ANEG_3 0x00010000 /* ANEG[3] */
#define SK_GPHY_ANEG_2 0x00008000 /* ANEG[2] */
#define SK_GPHY_ANEG_1 0x00004000 /* ANEG[1] */
#define SK_GPHY_ENA_PAUSE 0x00002000 /* Enable Pause */
#define SK_GPHY_PHYADDR_4 0x00001000 /* Bit 4 of Phy Addr */
#define SK_GPHY_PHYADDR_3 0x00000800 /* Bit 3 of Phy Addr */
#define SK_GPHY_PHYADDR_2 0x00000400 /* Bit 2 of Phy Addr */
#define SK_GPHY_PHYADDR_1 0x00000200 /* Bit 1 of Phy Addr */
#define SK_GPHY_PHYADDR_0 0x00000100 /* Bit 0 of Phy Addr */
#define SK_GPHY_RESET_CLEAR 0x00000002 /* Clear GPHY Reset */
#define SK_GPHY_RESET_SET 0x00000001 /* Set GPHY Reset */
#define SK_GPHY_COPPER (SK_GPHY_HWCFG_M_0 | SK_GPHY_HWCFG_M_1 | \
SK_GPHY_HWCFG_M_2 | SK_GPHY_HWCFG_M_3 )
#define SK_GPHY_FIBER (SK_GPHY_HWCFG_M_0 | SK_GPHY_HWCFG_M_1 | \
SK_GPHY_HWCFG_M_2 )
#define SK_GPHY_ANEG_ALL (SK_GPHY_ANEG_0 | SK_GPHY_ANEG_1 | \
SK_GPHY_ANEG_2 | SK_GPHY_ANEG_3 )
#define SK_GMAC_INT_TX_OFLOW 0x20 /* Transmit Counter Overflow */
#define SK_GMAC_INT_RX_OFLOW 0x10 /* Receiver Overflow */
#define SK_GMAC_INT_TX_UNDER 0x08 /* Transmit FIFO Underrun */
#define SK_GMAC_INT_TX_DONE 0x04 /* Transmit Complete */
#define SK_GMAC_INT_RX_OVER 0x02 /* Receive FIFO Overrun */
#define SK_GMAC_INT_RX_DONE 0x01 /* Receive Complete */
#define SK_LINK_RESET_CLEAR 0x0002 /* Link Reset Clear */
#define SK_LINK_RESET_SET 0x0001 /* Link Reset Set */
/* Block 31 -- reserved */
/* Block 32-33 -- Pattern Ram */
#define SK_WOL_PRAM 0x1000
/* Block 0x22 - 0x3f -- reserved */
/* Block 0x40 to 0x4F -- XMAC 1 registers */
#define SK_XMAC1_BASE 0x2000
#define SK_XMAC1_END 0x23FF
/* Block 0x50 to 0x5F -- MARV 1 registers */
#define SK_MARV1_BASE 0x2800
/* Block 0x60 to 0x6F -- XMAC 2 registers */
#define SK_XMAC2_BASE 0x3000
#define SK_XMAC2_END 0x33FF
/* Block 0x70 to 0x7F -- MARV 2 registers */
#define SK_MARV2_BASE 0x3800
/* Compute relative offset of an XMAC register in the XMAC window(s). */
#define SK_XMAC_REG(reg, mac) (((reg) * 2) + SK_XMAC1_BASE + \
(mac * (SK_XMAC2_BASE - SK_XMAC1_BASE)))
#define SK_XMAC_REG(sc, reg) (((reg) * 2) + SK_XMAC1_BASE + \
(((sc)->sk_port) * (SK_XMAC2_BASE - SK_XMAC1_BASE)))
#define SK_XM_READ_4(sc, reg) \
(sk_win_read_2(sc->sk_softc, \
SK_XMAC_REG(reg, sc->sk_port)) & 0xFFFF) | \
((sk_win_read_2(sc->sk_softc, \
SK_XMAC_REG(reg + 2, sc->sk_port)) << 16) & 0xFFFF0000)
#if 0
#define SK_XM_READ_4(sc, reg) \
((sk_win_read_2(sc->sk_softc, \
SK_XMAC_REG(sc, reg)) & 0xFFFF) | \
((sk_win_read_2(sc->sk_softc, \
SK_XMAC_REG(sc, reg + 2)) & 0xFFFF) << 16))
#define SK_XM_WRITE_4(sc, reg, val) \
sk_win_write_2(sc->sk_softc, \
SK_XMAC_REG(reg, sc->sk_port), ((val) & 0xFFFF)); \
sk_win_write_2(sc->sk_softc, \
SK_XMAC_REG(reg + 2, sc->sk_port), ((val) >> 16) & 0xFFFF);
#define SK_XM_WRITE_4(sc, reg, val) \
sk_win_write_2(sc->sk_softc, SK_XMAC_REG(sc, reg), \
((val) & 0xFFFF)); \
sk_win_write_2(sc->sk_softc, SK_XMAC_REG(sc, reg + 2), \
((val) >> 16) & 0xFFFF)
#else
#define SK_XM_READ_4(sc, reg) \
sk_win_read_4(sc->sk_softc, SK_XMAC_REG(sc, reg))
#define SK_XM_READ_2(sc, reg) \
sk_win_read_2(sc->sk_softc, SK_XMAC_REG(reg, sc->sk_port))
#define SK_XM_WRITE_4(sc, reg, val) \
sk_win_write_4(sc->sk_softc, SK_XMAC_REG(sc, reg), (val))
#endif
#define SK_XM_WRITE_2(sc, reg, val) \
sk_win_write_2(sc->sk_softc, SK_XMAC_REG(reg, sc->sk_port), val)
#define SK_XM_READ_2(sc, reg) \
sk_win_read_2(sc->sk_softc, SK_XMAC_REG(sc, reg))
#define SK_XM_WRITE_2(sc, reg, val) \
sk_win_write_2(sc->sk_softc, SK_XMAC_REG(sc, reg), val)
#define SK_XM_SETBIT_4(sc, reg, x) \
SK_XM_WRITE_4(sc, reg, (SK_XM_READ_4(sc, reg)) | (x))
@ -945,6 +1141,34 @@
#define SK_XM_CLRBIT_2(sc, reg, x) \
SK_XM_WRITE_2(sc, reg, (SK_XM_READ_2(sc, reg)) & ~(x))
/* Compute relative offset of an MARV register in the MARV window(s). */
#define SK_YU_REG(sc, reg) \
((reg) + SK_MARV1_BASE + \
(((sc)->sk_port) * (SK_MARV2_BASE - SK_MARV1_BASE)))
#define SK_YU_READ_4(sc, reg) \
sk_win_read_4((sc)->sk_softc, SK_YU_REG((sc), (reg)))
#define SK_YU_READ_2(sc, reg) \
sk_win_read_2((sc)->sk_softc, SK_YU_REG((sc), (reg)))
#define SK_YU_WRITE_4(sc, reg, val) \
sk_win_write_4((sc)->sk_softc, SK_YU_REG((sc), (reg)), (val))
#define SK_YU_WRITE_2(sc, reg, val) \
sk_win_write_2((sc)->sk_softc, SK_YU_REG((sc), (reg)), (val))
#define SK_YU_SETBIT_4(sc, reg, x) \
SK_YU_WRITE_4(sc, reg, (SK_YU_READ_4(sc, reg)) | (x))
#define SK_YU_CLRBIT_4(sc, reg, x) \
SK_YU_WRITE_4(sc, reg, (SK_YU_READ_4(sc, reg)) & ~(x))
#define SK_YU_SETBIT_2(sc, reg, x) \
SK_YU_WRITE_2(sc, reg, (SK_YU_READ_2(sc, reg)) | (x))
#define SK_YU_CLRBIT_2(sc, reg, x) \
SK_YU_WRITE_2(sc, reg, (SK_YU_READ_2(sc, reg)) & ~(x))
/*
* The default FIFO threshold on the XMAC II is 4 bytes. On
@ -1018,18 +1242,18 @@ struct vpd_key {
#define VPD_RES_END 0x78 /* end tag */
#define CSR_WRITE_4(sc, reg, val) \
bus_space_write_4(sc->sk_btag, sc->sk_bhandle, reg, val)
bus_space_write_4((sc)->sk_btag, (sc)->sk_bhandle, (reg), (val))
#define CSR_WRITE_2(sc, reg, val) \
bus_space_write_2(sc->sk_btag, sc->sk_bhandle, reg, val)
bus_space_write_2((sc)->sk_btag, (sc)->sk_bhandle, (reg), (val))
#define CSR_WRITE_1(sc, reg, val) \
bus_space_write_1(sc->sk_btag, sc->sk_bhandle, reg, val)
bus_space_write_1((sc)->sk_btag, (sc)->sk_bhandle, (reg), (val))
#define CSR_READ_4(sc, reg) \
bus_space_read_4(sc->sk_btag, sc->sk_bhandle, reg)
bus_space_read_4((sc)->sk_btag, (sc)->sk_bhandle, (reg))
#define CSR_READ_2(sc, reg) \
bus_space_read_2(sc->sk_btag, sc->sk_bhandle, reg)
bus_space_read_2((sc)->sk_btag, (sc)->sk_bhandle, (reg))
#define CSR_READ_1(sc, reg) \
bus_space_read_1(sc->sk_btag, sc->sk_bhandle, reg)
bus_space_read_1((sc)->sk_btag, (sc)->sk_bhandle, (reg))
struct sk_type {
u_int16_t sk_vid;