2005-01-06 01:43:34 +00:00
|
|
|
/*-
|
1999-09-26 06:42:36 +00:00
|
|
|
* Copyright (c) 1993 Herb Peyerl (hpeyerl@novatel.ca) All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are
|
|
|
|
* met: 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer. 2. The name
|
|
|
|
* of the author may not be used to endorse or promote products derived from
|
|
|
|
* this software without specific prior written permission
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
|
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
|
|
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*/
|
|
|
|
|
1999-10-27 06:25:16 +00:00
|
|
|
struct ep_board {
|
2003-07-17 19:37:56 +00:00
|
|
|
u_short prod_id; /* product ID */
|
|
|
|
int cmd_off; /* command offset (bit shift) */
|
|
|
|
int mii_trans; /* activate MII transiever */
|
|
|
|
u_short res_cfg; /* resource configuration */
|
1999-10-27 06:25:16 +00:00
|
|
|
};
|
|
|
|
|
1999-09-26 06:42:36 +00:00
|
|
|
/*
|
|
|
|
* Ethernet software status per interface.
|
|
|
|
*/
|
|
|
|
struct ep_softc {
|
2005-06-10 16:49:24 +00:00
|
|
|
struct ifnet *ifp;
|
2003-07-17 19:37:56 +00:00
|
|
|
struct ifmedia ifmedia; /* media info */
|
|
|
|
device_t dev;
|
1999-10-27 06:25:16 +00:00
|
|
|
|
2003-10-25 04:09:49 +00:00
|
|
|
struct mtx sc_mtx;
|
2003-07-17 19:37:56 +00:00
|
|
|
struct resource *iobase;
|
|
|
|
struct resource *irq;
|
1999-10-27 06:25:16 +00:00
|
|
|
|
2003-10-19 00:03:10 +00:00
|
|
|
bus_space_handle_t bsh;
|
|
|
|
bus_space_tag_t bst;
|
2003-07-17 19:37:56 +00:00
|
|
|
void *ep_intrhand;
|
1999-10-27 06:25:16 +00:00
|
|
|
|
2009-11-19 22:06:40 +00:00
|
|
|
struct callout watchdog_timer;
|
|
|
|
int tx_timer;
|
|
|
|
|
2003-07-17 19:37:56 +00:00
|
|
|
u_short ep_connectors; /* Connectors on this card. */
|
|
|
|
u_char ep_connector; /* Configured connector. */
|
1999-09-26 06:42:36 +00:00
|
|
|
|
2003-07-17 19:37:56 +00:00
|
|
|
struct mbuf *top;
|
|
|
|
struct mbuf *mcur;
|
|
|
|
short cur_len;
|
1999-10-27 06:25:16 +00:00
|
|
|
|
2003-07-17 19:37:56 +00:00
|
|
|
int stat; /* some flags */
|
1999-10-27 06:25:16 +00:00
|
|
|
#define F_RX_FIRST 0x001
|
Minor cleanup of ep driver and pccard attachment:
o Grab the MAC address out of the CIS if the card has the special
3Com 0x88 tuple. Most 3Com cards don't have this tuple, but we
prefer it to the eeprom since it only appears to be present when
the eeprom doesn't have the info. So far, I've only observed this
on my 3C362 and 3C362B cards, but the NetBSD driver implies that
the 3C362C also has this tuple, and that some 3C574 cards do too (none
of mine do). ep_pccard_mac was written after looking at the NetBSD
code.
o Store the enet addr in the softc for this device, so we can use the
overridden MAC to set the station address.
o Create a routine to set the station address and use it where we need it.
o setup the cmd shitfs and such before we call ep_alloc(), and remove
setting up the cmd shift value there. It initializes to 0, and those
attachments that need to frob it do so before calling ep_alloc.
o Remove some obsolete comments
o No longer a need to export ep_get_macaddr, so make it static
o ep_alloc already grabs the EEPROM id, so we don't need to grab it again
in ep_pccard_attach.
o eliminate unit, it isn't needed, fix some printfs to be device_printf
instead.
# All my pccards except the 3C1 work now. Didn't test ISA or cbus cards
# that I have: 3C509B-TP or 3C569B-J-TPO
Tested on: 3C589B, 3C589C, 3C589D, 3C589D-TP, 3C562, 3C562B/3C563B,
3C562D/3C563D, 3CCFE574BT, 3CXEM556, 3CCSH572BT, 3C574-TX,
3CCE589EC, 3CXE589EC, 3CCFEM556, 3C1
Approved by: re (scottl)
2005-07-01 04:23:32 +00:00
|
|
|
#define F_ENADDR_SKIP 0x002
|
1999-10-27 06:25:16 +00:00
|
|
|
#define F_PROMISC 0x008
|
1999-09-26 06:42:36 +00:00
|
|
|
#define F_ACCESS_32_BITS 0x100
|
2009-04-11 04:30:38 +00:00
|
|
|
#define F_HAS_TX_PLL 0x200
|
1999-09-26 06:42:36 +00:00
|
|
|
|
2003-07-17 19:37:56 +00:00
|
|
|
int gone; /* adapter is not present (for PCCARD) */
|
|
|
|
struct ep_board epb;
|
Minor cleanup of ep driver and pccard attachment:
o Grab the MAC address out of the CIS if the card has the special
3Com 0x88 tuple. Most 3Com cards don't have this tuple, but we
prefer it to the eeprom since it only appears to be present when
the eeprom doesn't have the info. So far, I've only observed this
on my 3C362 and 3C362B cards, but the NetBSD driver implies that
the 3C362C also has this tuple, and that some 3C574 cards do too (none
of mine do). ep_pccard_mac was written after looking at the NetBSD
code.
o Store the enet addr in the softc for this device, so we can use the
overridden MAC to set the station address.
o Create a routine to set the station address and use it where we need it.
o setup the cmd shitfs and such before we call ep_alloc(), and remove
setting up the cmd shift value there. It initializes to 0, and those
attachments that need to frob it do so before calling ep_alloc.
o Remove some obsolete comments
o No longer a need to export ep_get_macaddr, so make it static
o ep_alloc already grabs the EEPROM id, so we don't need to grab it again
in ep_pccard_attach.
o eliminate unit, it isn't needed, fix some printfs to be device_printf
instead.
# All my pccards except the 3C1 work now. Didn't test ISA or cbus cards
# that I have: 3C509B-TP or 3C569B-J-TPO
Tested on: 3C589B, 3C589C, 3C589D, 3C589D-TP, 3C562, 3C562B/3C563B,
3C562D/3C563D, 3CCFE574BT, 3CXEM556, 3CCSH572BT, 3C574-TX,
3CCE589EC, 3CXE589EC, 3CCFEM556, 3C1
Approved by: re (scottl)
2005-07-01 04:23:32 +00:00
|
|
|
uint8_t eaddr[6];
|
1999-09-26 06:42:36 +00:00
|
|
|
|
|
|
|
#ifdef EP_LOCAL_STATS
|
2003-07-17 19:37:56 +00:00
|
|
|
short tx_underrun;
|
|
|
|
short rx_no_first;
|
|
|
|
short rx_no_mbuf;
|
|
|
|
short rx_overrunf;
|
|
|
|
short rx_overrunl;
|
1999-09-26 06:42:36 +00:00
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
2003-07-17 19:37:56 +00:00
|
|
|
int ep_alloc(device_t);
|
|
|
|
void ep_free(device_t);
|
|
|
|
int ep_detach(device_t);
|
|
|
|
void ep_get_media(struct ep_softc *);
|
|
|
|
int ep_attach(struct ep_softc *);
|
|
|
|
void ep_intr(void *);
|
2005-06-26 04:19:45 +00:00
|
|
|
int ep_get_e(struct ep_softc *, uint16_t, uint16_t *);
|
2003-10-18 15:22:43 +00:00
|
|
|
|
2003-10-25 04:09:49 +00:00
|
|
|
#define CSR_READ_1(sc, off) (bus_space_read_1((sc)->bst, (sc)->bsh, off))
|
|
|
|
#define CSR_READ_2(sc, off) (bus_space_read_2((sc)->bst, (sc)->bsh, off))
|
|
|
|
#define CSR_WRITE_1(sc, off, val) \
|
2003-10-19 17:38:04 +00:00
|
|
|
bus_space_write_1(sc->bst, sc->bsh, off, val)
|
2003-10-25 04:09:49 +00:00
|
|
|
#define CSR_WRITE_2(sc, off, val) \
|
2003-10-19 17:38:04 +00:00
|
|
|
bus_space_write_2(sc->bst, sc->bsh, off, val)
|
2003-10-25 04:09:49 +00:00
|
|
|
#define CSR_WRITE_MULTI_1(sc, off, addr, count) \
|
2003-10-19 17:38:04 +00:00
|
|
|
bus_space_write_multi_1(sc->bst, sc->bsh, off, addr, count)
|
2003-10-25 04:09:49 +00:00
|
|
|
#define CSR_WRITE_MULTI_2(sc, off, addr, count) \
|
2003-10-19 17:38:04 +00:00
|
|
|
bus_space_write_multi_2(sc->bst, sc->bsh, off, addr, count)
|
2003-10-25 04:09:49 +00:00
|
|
|
#define CSR_WRITE_MULTI_4(sc, off, addr, count) \
|
2003-10-19 17:38:04 +00:00
|
|
|
bus_space_write_multi_4(sc->bst, sc->bsh, off, addr, count)
|
2003-10-25 04:09:49 +00:00
|
|
|
#define CSR_READ_MULTI_1(sc, off, addr, count) \
|
2003-10-19 17:38:04 +00:00
|
|
|
bus_space_read_multi_1(sc->bst, sc->bsh, off, addr, count)
|
2003-10-25 04:09:49 +00:00
|
|
|
#define CSR_READ_MULTI_2(sc, off, addr, count) \
|
2003-10-19 17:38:04 +00:00
|
|
|
bus_space_read_multi_2(sc->bst, sc->bsh, off, addr, count)
|
2003-10-25 04:09:49 +00:00
|
|
|
#define CSR_READ_MULTI_4(sc, off, addr, count) \
|
2003-10-19 17:38:04 +00:00
|
|
|
bus_space_read_multi_4(sc->bst, sc->bsh, off, addr, count)
|
2003-10-25 04:09:49 +00:00
|
|
|
|
|
|
|
#define EP_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
|
|
|
|
#define EP_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
|
2003-10-25 21:28:40 +00:00
|
|
|
#define EP_LOCK_INIT(_sc) \
|
|
|
|
mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->dev), \
|
|
|
|
MTX_NETWORK_LOCK, MTX_DEF)
|
2005-07-19 22:26:44 +00:00
|
|
|
#define EP_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx);
|
2003-10-25 21:28:40 +00:00
|
|
|
#define EP_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED);
|
|
|
|
#define EP_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED);
|