summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/pci/if_sis.c289
1 files changed, 113 insertions, 176 deletions
diff --git a/sys/dev/pci/if_sis.c b/sys/dev/pci/if_sis.c
index 7ba76e81c97..3256c103d48 100644
--- a/sys/dev/pci/if_sis.c
+++ b/sys/dev/pci/if_sis.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_sis.c,v 1.63 2006/03/25 03:21:56 brad Exp $ */
+/* $OpenBSD: if_sis.c,v 1.64 2006/03/25 05:00:28 brad Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
* Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved.
@@ -59,7 +59,6 @@
*/
#include "bpfilter.h"
-#include "vlan.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -105,6 +104,15 @@
int sis_probe(struct device *, void *, void *);
void sis_attach(struct device *, struct device *, void *);
+
+struct cfattach sis_ca = {
+ sizeof(struct sis_softc), sis_probe, sis_attach
+};
+
+struct cfdriver sis_cd = {
+ 0, "sis", DV_IFNET
+};
+
int sis_intr(void *);
void sis_shutdown(void *);
int sis_newbuf(struct sis_softc *, struct sis_desc *,
@@ -163,34 +171,38 @@ int sis_ring_init(struct sis_softc *);
#define SIO_CLR(x) \
CSR_WRITE_4(sc, SIS_EECTL, CSR_READ_4(sc, SIS_EECTL) & ~x)
+const struct pci_matchid sis_devices[] = {
+ { PCI_VENDOR_SIS, PCI_PRODUCT_SIS_900 },
+ { PCI_VENDOR_SIS, PCI_PRODUCT_SIS_7016 },
+ { PCI_VENDOR_NS, PCI_PRODUCT_NS_DP83815 }
+};
+
/*
* Routine to reverse the bits in a word. Stolen almost
* verbatim from /usr/games/fortune.
*/
-u_int16_t sis_reverse(n)
- u_int16_t n;
+u_int16_t
+sis_reverse(u_int16_t n)
{
n = ((n >> 1) & 0x5555) | ((n << 1) & 0xaaaa);
n = ((n >> 2) & 0x3333) | ((n << 2) & 0xcccc);
n = ((n >> 4) & 0x0f0f) | ((n << 4) & 0xf0f0);
n = ((n >> 8) & 0x00ff) | ((n << 8) & 0xff00);
- return(n);
+ return (n);
}
-void sis_delay(sc)
- struct sis_softc *sc;
+void
+sis_delay(struct sis_softc *sc)
{
int idx;
for (idx = (300 / 33) + 1; idx > 0; idx--)
CSR_READ_4(sc, SIS_CSR);
-
- return;
}
-void sis_eeprom_idle(sc)
- struct sis_softc *sc;
+void
+sis_eeprom_idle(struct sis_softc *sc)
{
int i;
@@ -211,16 +223,13 @@ void sis_eeprom_idle(sc)
SIO_CLR(SIS_EECTL_CSEL);
sis_delay(sc);
CSR_WRITE_4(sc, SIS_EECTL, 0x00000000);
-
- return;
}
/*
* Send a read command and address to the EEPROM, check for ACK.
*/
-void sis_eeprom_putbyte(sc, addr)
- struct sis_softc *sc;
- int addr;
+void
+sis_eeprom_putbyte(struct sis_softc *sc, int addr)
{
int d, i;
@@ -230,28 +239,23 @@ void sis_eeprom_putbyte(sc, addr)
* Feed in each bit and strobe the clock.
*/
for (i = 0x400; i; i >>= 1) {
- if (d & i) {
+ if (d & i)
SIO_SET(SIS_EECTL_DIN);
- } else {
+ else
SIO_CLR(SIS_EECTL_DIN);
- }
sis_delay(sc);
SIO_SET(SIS_EECTL_CLK);
sis_delay(sc);
SIO_CLR(SIS_EECTL_CLK);
sis_delay(sc);
}
-
- return;
}
/*
* Read a word of data stored in the EEPROM at address 'addr.'
*/
-void sis_eeprom_getword(sc, addr, dest)
- struct sis_softc *sc;
- int addr;
- u_int16_t *dest;
+void
+sis_eeprom_getword(struct sis_softc *sc, int addr, u_int16_t *dest)
{
int i;
u_int16_t word = 0;
@@ -288,19 +292,14 @@ void sis_eeprom_getword(sc, addr, dest)
sis_eeprom_idle(sc);
*dest = word;
-
- return;
}
/*
* Read a sequence of words from the EEPROM.
*/
-void sis_read_eeprom(sc, dest, off, cnt, swap)
- struct sis_softc *sc;
- caddr_t dest;
- int off;
- int cnt;
- int swap;
+void
+sis_read_eeprom(struct sis_softc *sc, caddr_t dest,
+ int off, int cnt, int swap)
{
int i;
u_int16_t word = 0, *ptr;
@@ -313,16 +312,12 @@ void sis_read_eeprom(sc, dest, off, cnt, swap)
else
*ptr = word;
}
-
- return;
}
#if defined(__amd64__) || defined(__i386__)
-void sis_read_cmos(sc, pa, dest, off, cnt)
- struct sis_softc *sc;
- struct pci_attach_args *pa;
- caddr_t dest;
- int off, cnt;
+void
+sis_read_cmos(struct sis_softc *sc, struct pci_attach_args *pa,
+ caddr_t dest, int off, int cnt)
{
bus_space_tag_t btag;
u_int32_t reg;
@@ -346,9 +341,8 @@ void sis_read_cmos(sc, pa, dest, off, cnt)
}
#endif
-void sis_read_mac(sc, pa)
- struct sis_softc *sc;
- struct pci_attach_args *pa;
+void
+sis_read_mac(struct sis_softc *sc, struct pci_attach_args *pa)
{
u_int16_t *enaddr = (u_int16_t *) &sc->arpcom.ac_enaddr;
@@ -367,8 +361,8 @@ void sis_read_mac(sc, pa)
SIS_SETBIT(sc, SIS_RXFILT_CTL, SIS_RXFILTCTL_ENABLE);
}
-void sis_read96x_mac(sc)
- struct sis_softc *sc;
+void
+sis_read96x_mac(struct sis_softc *sc)
{
int i;
@@ -389,8 +383,8 @@ void sis_read96x_mac(sc)
/*
* Sync the PHYs by setting data bit and strobing the clock 32 times.
*/
-void sis_mii_sync(sc)
- struct sis_softc *sc;
+void
+sis_mii_sync(struct sis_softc *sc)
{
int i;
@@ -402,28 +396,23 @@ void sis_mii_sync(sc)
SIO_CLR(SIS_MII_CLK);
DELAY(1);
}
-
- return;
}
/*
* Clock a series of bits through the MII.
*/
-void sis_mii_send(sc, bits, cnt)
- struct sis_softc *sc;
- u_int32_t bits;
- int cnt;
+void
+sis_mii_send(struct sis_softc *sc, u_int32_t bits, int cnt)
{
int i;
SIO_CLR(SIS_MII_CLK);
for (i = (0x1 << (cnt - 1)); i; i >>= 1) {
- if (bits & i) {
+ if (bits & i)
SIO_SET(SIS_MII_DATA);
- } else {
+ else
SIO_CLR(SIS_MII_DATA);
- }
DELAY(1);
SIO_CLR(SIS_MII_CLK);
DELAY(1);
@@ -434,10 +423,8 @@ void sis_mii_send(sc, bits, cnt)
/*
* Read an PHY register through the MII.
*/
-int sis_mii_readreg(sc, frame)
- struct sis_softc *sc;
- struct sis_mii_frame *frame;
-
+int
+sis_mii_readreg(struct sis_softc *sc, struct sis_mii_frame *frame)
{
int i, ack, s;
@@ -518,17 +505,15 @@ fail:
splx(s);
if (ack)
- return(1);
- return(0);
+ return (1);
+ return (0);
}
/*
* Write to a PHY register through the MII.
*/
-int sis_mii_writereg(sc, frame)
- struct sis_softc *sc;
- struct sis_mii_frame *frame;
-
+int
+sis_mii_writereg(struct sis_softc *sc, struct sis_mii_frame *frame)
{
int s;
@@ -568,19 +553,18 @@ int sis_mii_writereg(sc, frame)
splx(s);
- return(0);
+ return (0);
}
-int sis_miibus_readreg(self, phy, reg)
- struct device *self;
- int phy, reg;
+int
+sis_miibus_readreg(struct device *self, int phy, int reg)
{
struct sis_softc *sc = (struct sis_softc *)self;
struct sis_mii_frame frame;
if (sc->sis_type == SIS_TYPE_83815) {
if (phy != 0)
- return(0);
+ return (0);
/*
* The NatSemi chip can take a while after
* a reset to come ready, during which the BMSR
@@ -606,7 +590,7 @@ int sis_miibus_readreg(self, phy, reg)
int i, val = 0;
if (phy != 0)
- return(0);
+ return (0);
CSR_WRITE_4(sc, SIS_PHYCTL,
(phy << 11) | (reg << 6) | SIS_PHYOP_READ);
@@ -620,15 +604,15 @@ int sis_miibus_readreg(self, phy, reg)
if (i == SIS_TIMEOUT) {
printf("%s: PHY failed to come ready\n",
sc->sc_dev.dv_xname);
- return(0);
+ return (0);
}
val = (CSR_READ_4(sc, SIS_PHYCTL) >> 16) & 0xFFFF;
if (val == 0xFFFF)
- return(0);
+ return (0);
- return(val);
+ return (val);
} else {
bzero((char *)&frame, sizeof(frame));
@@ -636,14 +620,12 @@ int sis_miibus_readreg(self, phy, reg)
frame.mii_regaddr = reg;
sis_mii_readreg(sc, &frame);
- return(frame.mii_data);
+ return (frame.mii_data);
}
}
-
-void sis_miibus_writereg(self, phy, reg, data)
- struct device *self;
- int phy, reg, data;
+void
+sis_miibus_writereg(struct device *self, int phy, int reg, int data)
{
struct sis_softc *sc = (struct sis_softc *)self;
struct sis_mii_frame frame;
@@ -687,18 +669,14 @@ void sis_miibus_writereg(self, phy, reg, data)
frame.mii_data = data;
sis_mii_writereg(sc, &frame);
}
- return;
}
void
-sis_miibus_statchg(self)
- struct device *self;
+sis_miibus_statchg(struct device *self)
{
struct sis_softc *sc = (struct sis_softc *)self;
sis_init(sc);
-
- return;
}
u_int32_t
@@ -849,8 +827,8 @@ allmulti:
CSR_WRITE_4(sc, SIS_RXFILT_CTL, ctl);
}
-void sis_reset(sc)
- struct sis_softc *sc;
+void
+sis_reset(struct sis_softc *sc)
{
int i;
@@ -875,24 +853,14 @@ void sis_reset(sc)
CSR_WRITE_4(sc, NS_CLKRUN, NS_CLKRUN_PMESTS);
CSR_WRITE_4(sc, NS_CLKRUN, 0);
}
-
- return;
}
-const struct pci_matchid sis_devices[] = {
- { PCI_VENDOR_SIS, PCI_PRODUCT_SIS_900 },
- { PCI_VENDOR_SIS, PCI_PRODUCT_SIS_7016 },
- { PCI_VENDOR_NS, PCI_PRODUCT_NS_DP83815 },
-};
-
/*
* Probe for an SiS chip. Check the PCI vendor and device
* IDs against our list and return a device name if we find a match.
*/
-int sis_probe(parent, match, aux)
- struct device *parent;
- void *match;
- void *aux;
+int
+sis_probe(struct device *parent, void *match, void *aux)
{
return (pci_matchbyid((struct pci_attach_args *)aux, sis_devices,
sizeof(sis_devices)/sizeof(sis_devices[0])));
@@ -902,9 +870,8 @@ int sis_probe(parent, match, aux)
* Attach the interface. Allocate softc structures, do ifmedia
* setup and ethernet/BPF attach.
*/
-void sis_attach(parent, self, aux)
- struct device *parent, *self;
- void *aux;
+void
+sis_attach(struct device *parent, struct device *self, void *aux)
{
int i;
const char *intrstr = NULL;
@@ -1158,7 +1125,7 @@ void sis_attach(parent, self, aux)
IFQ_SET_READY(&ifp->if_snd);
bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
- ifp->if_capabilities |= IFCAP_VLAN_MTU;
+ ifp->if_capabilities = IFCAP_VLAN_MTU;
sc->sc_mii.mii_ifp = ifp;
sc->sc_mii.mii_readreg = sis_miibus_readreg;
@@ -1194,8 +1161,8 @@ fail_1:
* we arrange the descriptors in a closed ring, so that the last descriptor
* points back to the first.
*/
-int sis_ring_init(sc)
- struct sis_softc *sc;
+int
+sis_ring_init(struct sis_softc *sc)
{
struct sis_list_data *ld;
struct sis_ring_data *cd;
@@ -1256,10 +1223,8 @@ int sis_ring_init(sc)
/*
* Initialize an RX descriptor and attach an MBUF cluster.
*/
-int sis_newbuf(sc, c, m)
- struct sis_softc *sc;
- struct sis_desc *c;
- struct mbuf *m;
+int
+sis_newbuf(struct sis_softc *sc, struct sis_desc*c, struct mbuf *m)
{
struct mbuf *m_new = NULL;
bus_dmamap_t map;
@@ -1314,8 +1279,8 @@ int sis_newbuf(sc, c, m)
* A frame has been uploaded: pass the resulting mbuf chain up to
* the higher level protocols.
*/
-void sis_rxeof(sc)
- struct sis_softc *sc;
+void
+sis_rxeof(struct sis_softc *sc)
{
struct mbuf *m;
struct ifnet *ifp;
@@ -1397,12 +1362,11 @@ void sis_rxeof(sc)
sc->sis_cdata.sis_rx_pdsc = cur_rx;
}
-void sis_rxeoc(sc)
- struct sis_softc *sc;
+void
+sis_rxeoc(struct sis_softc *sc)
{
sis_rxeof(sc);
sis_init(sc);
- return;
}
/*
@@ -1410,8 +1374,8 @@ void sis_rxeoc(sc)
* the list buffers.
*/
-void sis_txeof(sc)
- struct sis_softc *sc;
+void
+sis_txeof(struct sis_softc *sc)
{
struct ifnet *ifp;
u_int32_t idx;
@@ -1471,8 +1435,8 @@ void sis_txeof(sc)
ifp->if_timer = (sc->sis_cdata.sis_tx_cnt == 0) ? 0 : 5;
}
-void sis_tick(xsc)
- void *xsc;
+void
+sis_tick(void *xsc)
{
struct sis_softc *sc = (struct sis_softc *)xsc;
struct mii_data *mii;
@@ -1495,12 +1459,10 @@ void sis_tick(xsc)
timeout_add(&sc->sis_timeout, hz);
splx(s);
-
- return;
}
-int sis_intr(arg)
- void *arg;
+int
+sis_intr(void *arg)
{
struct sis_softc *sc;
struct ifnet *ifp;
@@ -1511,7 +1473,7 @@ int sis_intr(arg)
ifp = &sc->arpcom.ac_if;
if (sc->sis_stopped) /* Most likely shared interrupt */
- return claimed;
+ return (claimed);
/* Disable interrupts. */
CSR_WRITE_4(sc, SIS_IER, 0);
@@ -1553,17 +1515,15 @@ int sis_intr(arg)
if (!IFQ_IS_EMPTY(&ifp->if_snd))
sis_start(ifp);
- return claimed;
+ return (claimed);
}
/*
* Encapsulate an mbuf chain in a descriptor by coupling the mbuf data
* pointers to the fragment pointers.
*/
-int sis_encap(sc, m_head, txidx)
- struct sis_softc *sc;
- struct mbuf *m_head;
- u_int32_t *txidx;
+int
+sis_encap(struct sis_softc *sc, struct mbuf *m_head, u_int32_t *txidx)
{
struct sis_desc *f = NULL;
int frag, cur, i;
@@ -1607,7 +1567,7 @@ int sis_encap(sc, m_head, txidx)
sizeof(struct sis_desc) * SIS_TX_LIST_CNT,
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
- return(0);
+ return (0);
}
/*
@@ -1617,8 +1577,8 @@ int sis_encap(sc, m_head, txidx)
* physical addresses.
*/
-void sis_start(ifp)
- struct ifnet *ifp;
+void
+sis_start(struct ifnet *ifp)
{
struct sis_softc *sc;
struct mbuf *m_head = NULL;
@@ -1669,12 +1629,10 @@ void sis_start(ifp)
*/
ifp->if_timer = 5;
}
-
- return;
}
-void sis_init(xsc)
- void *xsc;
+void
+sis_init(void *xsc)
{
struct sis_softc *sc = (struct sis_softc *)xsc;
struct ifnet *ifp = &sc->arpcom.ac_if;
@@ -1756,20 +1714,18 @@ void sis_init(xsc)
}
/* If we want promiscuous mode, set the allframes bit. */
- if (ifp->if_flags & IFF_PROMISC) {
+ if (ifp->if_flags & IFF_PROMISC)
SIS_SETBIT(sc, SIS_RXFILT_CTL, SIS_RXFILTCTL_ALLPHYS);
- } else {
+ else
SIS_CLRBIT(sc, SIS_RXFILT_CTL, SIS_RXFILTCTL_ALLPHYS);
- }
/*
* Set the capture broadcast bit to capture broadcast frames.
*/
- if (ifp->if_flags & IFF_BROADCAST) {
+ if (ifp->if_flags & IFF_BROADCAST)
SIS_SETBIT(sc, SIS_RXFILT_CTL, SIS_RXFILTCTL_BROAD);
- } else {
+ else
SIS_CLRBIT(sc, SIS_RXFILT_CTL, SIS_RXFILTCTL_BROAD);
- }
/*
* Load the multicast filter.
@@ -1791,11 +1747,10 @@ void sis_init(xsc)
* the PCI bus. When this bit is set, the Max DMA Burst Size
* for TX/RX DMA should be no larger than 16 double words.
*/
- if (CSR_READ_4(sc, SIS_CFG) & SIS_CFG_EDB_MASTER_EN) {
+ if (CSR_READ_4(sc, SIS_CFG) & SIS_CFG_EDB_MASTER_EN)
CSR_WRITE_4(sc, SIS_RX_CFG, SIS_RXCFG64);
- } else {
+ else
CSR_WRITE_4(sc, SIS_RX_CFG, SIS_RXCFG256);
- }
/* Accept Long Packets for VLAN support */
SIS_SETBIT(sc, SIS_RX_CFG, SIS_RXCFG_RX_JABBER);
@@ -1870,15 +1825,13 @@ void sis_init(xsc)
timeout_set(&sc->sis_timeout, sis_tick, sc);
timeout_add(&sc->sis_timeout, hz);
-
- return;
}
/*
* Set media options.
*/
-int sis_ifmedia_upd(ifp)
- struct ifnet *ifp;
+int
+sis_ifmedia_upd(struct ifnet *ifp)
{
struct sis_softc *sc;
struct mii_data *mii;
@@ -1894,15 +1847,14 @@ int sis_ifmedia_upd(ifp)
}
mii_mediachg(mii);
- return(0);
+ return (0);
}
/*
* Report current media status.
*/
-void sis_ifmedia_sts(ifp, ifmr)
- struct ifnet *ifp;
- struct ifmediareq *ifmr;
+void
+sis_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
{
struct sis_softc *sc;
struct mii_data *mii;
@@ -1913,14 +1865,10 @@ void sis_ifmedia_sts(ifp, ifmr)
mii_pollstat(mii);
ifmr->ifm_active = mii->mii_media_active;
ifmr->ifm_status = mii->mii_media_status;
-
- return;
}
-int sis_ioctl(ifp, command, data)
- struct ifnet *ifp;
- u_long command;
- caddr_t data;
+int
+sis_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
{
struct sis_softc *sc = ifp->if_softc;
struct ifreq *ifr = (struct ifreq *) data;
@@ -2008,17 +1956,16 @@ int sis_ioctl(ifp, command, data)
return(error);
}
-void sis_watchdog(ifp)
- struct ifnet *ifp;
+void
+sis_watchdog(struct ifnet *ifp)
{
struct sis_softc *sc;
int s;
sc = ifp->if_softc;
- if (sc->sis_stopped) {
+ if (sc->sis_stopped)
return;
- }
ifp->if_oerrors++;
printf("%s: watchdog timeout\n", sc->sc_dev.dv_xname);
@@ -2032,15 +1979,14 @@ void sis_watchdog(ifp)
sis_start(ifp);
splx(s);
- return;
}
/*
* Stop the adapter and free any mbufs allocated to the
* RX and TX lists.
*/
-void sis_stop(sc)
- struct sis_softc *sc;
+void
+sis_stop(struct sis_softc *sc)
{
int i;
struct ifnet *ifp;
@@ -2109,19 +2055,10 @@ void sis_stop(sc)
* Stop all chip I/O so that the kernel's probe routines don't
* get confused by errant DMAs when rebooting.
*/
-void sis_shutdown(v)
- void *v;
+void
+sis_shutdown(void *v)
{
struct sis_softc *sc = (struct sis_softc *)v;
sis_stop(sc);
}
-
-struct cfattach sis_ca = {
- sizeof(struct sis_softc), sis_probe, sis_attach
-};
-
-struct cfdriver sis_cd = {
- 0, "sis", DV_IFNET
-};
-