summaryrefslogtreecommitdiffstats
path: root/sys/dev/sk
diff options
context:
space:
mode:
authorjmg <jmg@FreeBSD.org>2006-10-09 16:15:56 +0000
committerjmg <jmg@FreeBSD.org>2006-10-09 16:15:56 +0000
commit6a8dfa76182b17f26de62b30dea11f79111400b7 (patch)
tree1d727b5091a8658d90d11ec0750cf847f4a210f6 /sys/dev/sk
parent03ea52e1daed73beb0329e7b08c841ce9c831f6d (diff)
downloadFreeBSD-src-6a8dfa76182b17f26de62b30dea11f79111400b7.zip
FreeBSD-src-6a8dfa76182b17f26de62b30dea11f79111400b7.tar.gz
provide routines to access VPD data at the PCI layer...
remove sk's own implementation, and use the new calls to get the data... Reviewed by: -arch
Diffstat (limited to 'sys/dev/sk')
-rw-r--r--sys/dev/sk/if_sk.c155
-rw-r--r--sys/dev/sk/if_skreg.h31
2 files changed, 7 insertions, 179 deletions
diff --git a/sys/dev/sk/if_sk.c b/sys/dev/sk/if_sk.c
index dfc0e5e..19c946c 100644
--- a/sys/dev/sk/if_sk.c
+++ b/sys/dev/sk/if_sk.c
@@ -256,9 +256,6 @@ static u_int8_t sk_win_read_1(struct sk_softc *, int);
static void sk_win_write_4(struct sk_softc *, int, u_int32_t);
static void sk_win_write_2(struct sk_softc *, int, u_int32_t);
static void sk_win_write_1(struct sk_softc *, int, u_int32_t);
-static u_int8_t sk_vpd_readbyte(struct sk_softc *, int);
-static void sk_vpd_read_res(struct sk_softc *, struct vpd_res *, int);
-static void sk_vpd_read(struct sk_softc *);
static int sk_miibus_readreg(device_t, int, int);
static int sk_miibus_writereg(device_t, int, int, int);
@@ -472,113 +469,6 @@ sk_win_write_1(sc, reg, val)
return;
}
-/*
- * The VPD EEPROM contains Vital Product Data, as suggested in
- * the PCI 2.1 specification. The VPD data is separared into areas
- * denoted by resource IDs. The SysKonnect VPD contains an ID string
- * resource (the name of the adapter), a read-only area resource
- * containing various key/data fields and a read/write area which
- * can be used to store asset management information or log messages.
- * We read the ID string and read-only into buffers attached to
- * the controller softc structure for later use. At the moment,
- * we only use the ID string during skc_attach().
- */
-static u_int8_t
-sk_vpd_readbyte(sc, addr)
- struct sk_softc *sc;
- int addr;
-{
- int i;
-
- sk_win_write_2(sc, SK_PCI_REG(SK_PCI_VPD_ADDR), addr);
- for (i = 0; i < SK_TIMEOUT; i++) {
- /* ASUS LOM takes a very long time to read VPD. */
- DELAY(100);
- if (sk_win_read_2(sc,
- SK_PCI_REG(SK_PCI_VPD_ADDR)) & SK_VPD_FLAG)
- break;
- }
-
- if (i == SK_TIMEOUT)
- return(0);
-
- return(sk_win_read_1(sc, SK_PCI_REG(SK_PCI_VPD_DATA)));
-}
-
-static void
-sk_vpd_read_res(sc, res, addr)
- struct sk_softc *sc;
- struct vpd_res *res;
- int addr;
-{
- int i;
- u_int8_t *ptr;
-
- ptr = (u_int8_t *)res;
- for (i = 0; i < sizeof(struct vpd_res); i++)
- ptr[i] = sk_vpd_readbyte(sc, i + addr);
-
- return;
-}
-
-static void
-sk_vpd_read(sc)
- struct sk_softc *sc;
-{
- int pos = 0, i;
- struct vpd_res res;
-
- /* Check VPD capability */
- if (sk_win_read_1(sc, SK_PCI_REG(SK_PCI_VPD_CAPID)) != PCIY_VPD)
- return;
- if (sc->sk_vpd_prodname != NULL)
- free(sc->sk_vpd_prodname, M_DEVBUF);
- if (sc->sk_vpd_readonly != NULL)
- free(sc->sk_vpd_readonly, M_DEVBUF);
- sc->sk_vpd_prodname = NULL;
- sc->sk_vpd_readonly = NULL;
- sc->sk_vpd_readonly_len = 0;
-
- sk_vpd_read_res(sc, &res, pos);
-
- /*
- * Bail out quietly if the eeprom appears to be missing or empty.
- */
- if (res.vr_id == 0xff && res.vr_len == 0xff && res.vr_pad == 0xff)
- return;
-
- if (res.vr_id != VPD_RES_ID) {
- device_printf(sc->sk_dev, "bad VPD resource id: expected %x "
- "got %x\n", VPD_RES_ID, res.vr_id);
- return;
- }
-
- pos += sizeof(res);
- sc->sk_vpd_prodname = malloc(res.vr_len + 1, M_DEVBUF, M_NOWAIT);
- if (sc->sk_vpd_prodname != NULL) {
- for (i = 0; i < res.vr_len; i++)
- sc->sk_vpd_prodname[i] = sk_vpd_readbyte(sc, i + pos);
- sc->sk_vpd_prodname[i] = '\0';
- }
- pos += res.vr_len;
-
- sk_vpd_read_res(sc, &res, pos);
-
- if (res.vr_id != VPD_RES_READ) {
- device_printf(sc->sk_dev, "bad VPD resource id: expected %x "
- "got %x\n", VPD_RES_READ, res.vr_id);
- return;
- }
-
- pos += sizeof(res);
- sc->sk_vpd_readonly = malloc(res.vr_len, M_DEVBUF, M_NOWAIT);
- for (i = 0; i < res.vr_len; i++)
- sc->sk_vpd_readonly[i] = sk_vpd_readbyte(sc, i + pos);
- sc->sk_vpd_readonly_len = res.vr_len;
-
- return;
-}
-
static int
sk_miibus_readreg(dev, phy, reg)
device_t dev;
@@ -1690,7 +1580,8 @@ skc_attach(dev)
struct sk_softc *sc;
int error = 0, *port, sk_macs;
uint8_t skrs;
- char *pname, *revstr;
+ const char *pname;
+ char *revstr;
sc = device_get_softc(dev);
sc->sk_dev = dev;
@@ -1757,9 +1648,6 @@ skc_attach(dev)
/* Reset the adapter. */
sk_reset(sc);
- /* Read and save vital product data from EEPROM. */
- sk_vpd_read(sc);
-
skrs = sk_win_read_1(sc, SK_EPROM0);
if (sc->sk_type == SK_GENESIS) {
/* Read and save RAM size and RAMbuffer offset */
@@ -1811,7 +1699,8 @@ skc_attach(dev)
case DEVICEID_DLINK_DGE530T_A1:
case DEVICEID_DLINK_DGE530T_B1:
/* Stay with VPD PN. */
- pname = sc->sk_vpd_prodname;
+ if (pci_get_vpd_ident(dev, &pname))
+ goto vpdfailed;
break;
case DEVICEID_SK_V2:
case DEVICEID_MRVL_4360:
@@ -1821,7 +1710,8 @@ skc_attach(dev)
switch (sc->sk_type) {
case SK_GENESIS:
/* Stay with VPD PN. */
- pname = sc->sk_vpd_prodname;
+ if (pci_get_vpd_ident(dev, &pname))
+ goto vpdfailed;
break;
case SK_YUKON:
pname = "Marvell Yukon Gigabit Ethernet";
@@ -1861,6 +1751,7 @@ skc_attach(dev)
}
break;
default:
+vpdfailed:
device_printf(dev, "unknown device: vendor=%04x, device=%04x, "
"chipver=%02x, rev=%x\n",
pci_get_vendor(dev), pci_get_device(dev),
@@ -1908,33 +1799,6 @@ skc_attach(dev)
pname != NULL ? pname : "<unknown>", revstr, sc->sk_rev);
if (bootverbose) {
- if (sc->sk_vpd_readonly != NULL &&
- sc->sk_vpd_readonly_len != 0) {
- char buf[256];
- char *dp = sc->sk_vpd_readonly;
- uint16_t l, len = sc->sk_vpd_readonly_len;
-
- while (len >= 3) {
- if ((*dp == 'P' && *(dp+1) == 'N') ||
- (*dp == 'E' && *(dp+1) == 'C') ||
- (*dp == 'M' && *(dp+1) == 'N') ||
- (*dp == 'S' && *(dp+1) == 'N')) {
- l = 0;
- while (l < *(dp+2)) {
- buf[l] = *(dp+3+l);
- ++l;
- }
- buf[l] = '\0';
- device_printf(dev, "%c%c: %s\n",
- *dp, *(dp+1), buf);
- len -= (3 + l);
- dp += (3 + l);
- } else {
- len -= (3 + *(dp+2));
- dp += (3 + *(dp+2));
- }
- }
- }
device_printf(dev, "chip ver = 0x%02x\n", sc->sk_type);
device_printf(dev, "chip rev = 0x%02x\n", sc->sk_rev);
device_printf(dev, "SK_EPROM0 = 0x%02x\n", skrs);
@@ -2084,11 +1948,6 @@ skc_detach(dev)
bus_generic_detach(dev);
}
- if (sc->sk_vpd_prodname != NULL)
- free(sc->sk_vpd_prodname, M_DEVBUF);
- if (sc->sk_vpd_readonly != NULL)
- free(sc->sk_vpd_readonly, M_DEVBUF);
-
if (sc->sk_intrhand)
bus_teardown_intr(dev, sc->sk_res[1], sc->sk_intrhand);
bus_release_resources(dev, sc->sk_res_spec, sc->sk_res);
diff --git a/sys/dev/sk/if_skreg.h b/sys/dev/sk/if_skreg.h
index a9fa27c..937c5f7 100644
--- a/sys/dev/sk/if_skreg.h
+++ b/sys/dev/sk/if_skreg.h
@@ -1290,10 +1290,6 @@
#define SK_PCI_PWRMGMTCAP 0x004A /* 16 bits */
#define SK_PCI_PWRMGMTCTRL 0x004C /* 16 bits */
#define SK_PCI_PME_EVENT 0x004F
-#define SK_PCI_VPD_CAPID 0x0050
-#define SK_PCI_VPD_NEXTPTR 0x0051
-#define SK_PCI_VPD_ADDR 0x0052
-#define SK_PCI_VPD_DATA 0x0054
#define SK_PSTATE_MASK 0x0003
#define SK_PSTATE_D0 0x0000
@@ -1303,30 +1299,6 @@
#define SK_PME_EN 0x0010
#define SK_PME_STATUS 0x8000
-/*
- * VPD flag bit. Set to 0 to initiate a read, will become 1 when
- * read is complete. Set to 1 to initiate a write, will become 0
- * when write is finished.
- */
-#define SK_VPD_FLAG 0x8000
-
-/* VPD structures */
-struct vpd_res {
- u_int8_t vr_id;
- u_int8_t vr_len;
- u_int8_t vr_pad;
-};
-
-struct vpd_key {
- char vk_key[2];
- u_int8_t vk_len;
-};
-
-#define VPD_RES_ID 0x82 /* ID string */
-#define VPD_RES_READ 0x90 /* start of read only area */
-#define VPD_RES_WRITE 0x81 /* start of read/write area */
-#define VPD_RES_END 0x78 /* end tag */
-
#define CSR_WRITE_4(sc, reg, val) \
bus_write_4((sc)->sk_res[0], (reg), (val))
#define CSR_WRITE_2(sc, reg, val) \
@@ -1528,9 +1500,6 @@ struct sk_softc {
u_int8_t sk_type;
u_int8_t sk_rev;
u_int8_t spare;
- char *sk_vpd_prodname;
- char *sk_vpd_readonly;
- uint16_t sk_vpd_readonly_len;
u_int32_t sk_rboff; /* RAMbuffer offset */
u_int32_t sk_ramsize; /* amount of RAM on NIC */
u_int32_t sk_pmd; /* physical media type */
OpenPOWER on IntegriCloud