summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/pci/if_wm.c88
1 files changed, 55 insertions, 33 deletions
diff --git a/sys/dev/pci/if_wm.c b/sys/dev/pci/if_wm.c
index e4e87bd4cb3..b0538d6f2a0 100644
--- a/sys/dev/pci/if_wm.c
+++ b/sys/dev/pci/if_wm.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_wm.c,v 1.177 2009/07/14 00:00:44 msaitoh Exp $ */
+/* $NetBSD: if_wm.c,v 1.178 2009/07/30 03:46:48 msaitoh Exp $ */
/*
* Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
@@ -76,7 +76,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.177 2009/07/14 00:00:44 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.178 2009/07/30 03:46:48 msaitoh Exp $");
#include "bpfilter.h"
#include "rnd.h"
@@ -566,8 +566,8 @@ static void wm_gmii_mediainit(struct wm_softc *);
static int wm_gmii_mediachange(struct ifnet *);
static void wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *);
-static int wm_kmrn_i80003_readreg(struct wm_softc *, int);
-static void wm_kmrn_i80003_writereg(struct wm_softc *, int, int);
+static int wm_kmrn_readreg(struct wm_softc *, int);
+static void wm_kmrn_writereg(struct wm_softc *, int, int);
static int wm_match(device_t, cfdata_t, void *);
static void wm_attach(device_t, device_t, void *);
@@ -3308,12 +3308,12 @@ wm_init(struct ifnet *ifp)
* polling the phy; this fixes erroneous timeouts at
* 10Mbps.
*/
- wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS,
+ wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS,
0xFFFF);
- val = wm_kmrn_i80003_readreg(sc,
+ val = wm_kmrn_readreg(sc,
KUMCTRLSTA_OFFSET_INB_PARAM);
val |= 0x3F;
- wm_kmrn_i80003_writereg(sc,
+ wm_kmrn_writereg(sc,
KUMCTRLSTA_OFFSET_INB_PARAM, val);
break;
default:
@@ -3326,11 +3326,11 @@ wm_init(struct ifnet *ifp)
CSR_WRITE(sc, WMREG_CTRL_EXT, val);
/* Bypass RX and TX FIFO's */
- wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL,
+ wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL,
KUMCTRLSTA_FIFO_CTRL_RX_BYPASS |
KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
- wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL,
+ wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL,
KUMCTRLSTA_INB_CTRL_DIS_PADDING |
KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT);
}
@@ -3407,12 +3407,11 @@ wm_init(struct ifnet *ifp)
* a collision distance suitable for FDX, but update it whe
* we resolve the media type.
*/
- sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_CT(TX_COLLISION_THRESHOLD) |
- TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
+ sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_RTLC
+ | TCTL_CT(TX_COLLISION_THRESHOLD)
+ | TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
if (sc->sc_type >= WM_T_82571)
sc->sc_tctl |= TCTL_MULR;
- if (sc->sc_type >= WM_T_80003)
- sc->sc_tctl |= TCTL_RTLC;
CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
if (sc->sc_type == WM_T_80003) {
@@ -5001,15 +5000,15 @@ wm_gmii_statchg(device_t self)
CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? WMREG_OLD_FCRTL
: WMREG_FCRTL, sc->sc_fcrtl);
- if (sc->sc_type >= WM_T_80003) {
+ if (sc->sc_type == WM_T_80003) {
switch(IFM_SUBTYPE(sc->sc_mii.mii_media_active)) {
case IFM_1000_T:
- wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
+ wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
KUMCTRLSTA_HD_CTRL_1000_DEFAULT);
sc->sc_tipg = TIPG_1000T_80003_DFLT;
break;
default:
- wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
+ wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
KUMCTRLSTA_HD_CTRL_10_100_DEFAULT);
sc->sc_tipg = TIPG_10_100_80003_DFLT;
break;
@@ -5019,20 +5018,27 @@ wm_gmii_statchg(device_t self)
}
/*
- * wm_kmrn_i80003_readreg:
+ * wm_kmrn_readreg:
*
* Read a kumeran register
*/
static int
-wm_kmrn_i80003_readreg(struct wm_softc *sc, int reg)
+wm_kmrn_readreg(struct wm_softc *sc, int reg)
{
- int func = ((CSR_READ(sc, WMREG_STATUS) >> STATUS_FUNCID_SHIFT) & 1);
int rv;
- if (wm_get_swfw_semaphore(sc, func ? SWFW_PHY1_SM : SWFW_PHY0_SM)) {
- aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
- __func__);
- return 0;
+ if (sc->sc_flags == WM_F_SWFW_SYNC) {
+ if (wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM)) {
+ aprint_error_dev(sc->sc_dev,
+ "%s: failed to get semaphore\n", __func__);
+ return 0;
+ }
+ } else if (sc->sc_flags == WM_F_SWFWHW_SYNC) {
+ if (wm_get_swfwhw_semaphore(sc)) {
+ aprint_error_dev(sc->sc_dev,
+ "%s: failed to get semaphore\n", __func__);
+ return 0;
+ }
}
CSR_WRITE(sc, WMREG_KUMCTRLSTA,
@@ -5041,30 +5047,46 @@ wm_kmrn_i80003_readreg(struct wm_softc *sc, int reg)
delay(2);
rv = CSR_READ(sc, WMREG_KUMCTRLSTA) & KUMCTRLSTA_MASK;
- wm_put_swfw_semaphore(sc, func ? SWFW_PHY1_SM : SWFW_PHY0_SM);
+
+ if (sc->sc_flags == WM_F_SWFW_SYNC)
+ wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
+ else if (sc->sc_flags == WM_F_SWFWHW_SYNC)
+ wm_put_swfwhw_semaphore(sc);
+
return (rv);
}
/*
- * wm_kmrn_i80003_writereg:
+ * wm_kmrn_writereg:
*
* Write a kumeran register
*/
static void
-wm_kmrn_i80003_writereg(struct wm_softc *sc, int reg, int val)
+wm_kmrn_writereg(struct wm_softc *sc, int reg, int val)
{
- int func = ((CSR_READ(sc, WMREG_STATUS) >> STATUS_FUNCID_SHIFT) & 1);
- if (wm_get_swfw_semaphore(sc, func ? SWFW_PHY1_SM : SWFW_PHY0_SM)) {
- aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
- __func__);
- return;
+ if (sc->sc_flags == WM_F_SWFW_SYNC) {
+ if (wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM)) {
+ aprint_error_dev(sc->sc_dev,
+ "%s: failed to get semaphore\n", __func__);
+ return;
+ }
+ } else if (sc->sc_flags == WM_F_SWFWHW_SYNC) {
+ if (wm_get_swfwhw_semaphore(sc)) {
+ aprint_error_dev(sc->sc_dev,
+ "%s: failed to get semaphore\n", __func__);
+ return;
+ }
}
CSR_WRITE(sc, WMREG_KUMCTRLSTA,
((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) |
(val & KUMCTRLSTA_MASK));
- wm_put_swfw_semaphore(sc, func ? SWFW_PHY1_SM : SWFW_PHY0_SM);
+
+ if (sc->sc_flags == WM_F_SWFW_SYNC)
+ wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
+ else if (sc->sc_flags == WM_F_SWFWHW_SYNC)
+ wm_put_swfwhw_semaphore(sc);
}
static int
@@ -5192,7 +5214,7 @@ wm_get_swfwhw_semaphore(struct wm_softc *sc)
return 0;
delay(5000);
}
- printf("%s: failed to get swfwgw semaphore ext_ctrl 0x%x\n",
+ printf("%s: failed to get swfwhw semaphore ext_ctrl 0x%x\n",
device_xname(sc->sc_dev), ext_ctrl);
return 1;
}