2000-01-05 04:27:24 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 1997, 1998, 1999, 2000
|
|
|
|
* Bill Paul <wpaul@ee.columbia.edu>. 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. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* This product includes software developed by Bill Paul.
|
|
|
|
* 4. Neither the name of the author nor the names of any co-contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``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 Bill Paul OR THE VOICES IN HIS HEAD
|
|
|
|
* 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$
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Definitions for the KLSI KL5KUSB101B USB to ethernet controller.
|
|
|
|
* The KLSI part is controlled via vendor control requests, the structure
|
|
|
|
* of which depend a bit on the firmware running on the internal
|
|
|
|
* microcontroller. The one exception is the 'send scan data' command,
|
|
|
|
* which is used to load the firmware.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define KUE_CMD_GET_ETHER_DESCRIPTOR 0x00
|
|
|
|
#define KUE_CMD_SET_MCAST_FILTERS 0x01
|
|
|
|
#define KUE_CMD_SET_PKT_FILTER 0x02
|
|
|
|
#define KUE_CMD_GET_ETHERSTATS 0x03
|
|
|
|
#define KUE_CMD_GET_GPIO 0x04
|
|
|
|
#define KUE_CMD_SET_GPIO 0x05
|
|
|
|
#define KUE_CMD_SET_MAC 0x06
|
|
|
|
#define KUE_CMD_GET_MAC 0x07
|
|
|
|
#define KUE_CMD_SET_URB_SIZE 0x08
|
|
|
|
#define KUE_CMD_SET_SOFS 0x09
|
|
|
|
#define KUE_CMD_SET_EVEN_PKTS 0x0A
|
|
|
|
#define KUE_CMD_SEND_SCAN 0xFF
|
|
|
|
|
|
|
|
struct kue_ether_desc {
|
|
|
|
u_int8_t kue_len;
|
|
|
|
u_int8_t kue_rsvd0;
|
|
|
|
u_int8_t kue_rsvd1;
|
|
|
|
u_int8_t kue_macaddr[ETHER_ADDR_LEN];
|
|
|
|
u_int8_t kue_etherstats[4];
|
|
|
|
u_int8_t kue_maxseg[2];
|
|
|
|
u_int8_t kue_mcastfilt[2];
|
|
|
|
u_int8_t kue_rsvd2;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define KUE_ETHERSTATS(x) \
|
|
|
|
(*(u_int32_t *)&(x)->kue_desc.kue_etherstats)
|
|
|
|
#define KUE_MAXSEG(x) \
|
|
|
|
(*(u_int16_t *)&(x)->kue_desc.kue_maxseg)
|
|
|
|
#define KUE_MCFILTCNT(x) \
|
|
|
|
((*(u_int16_t *)&(x)->kue_desc.kue_mcastfilt) & 0x7FFF)
|
|
|
|
#define KUE_MCFILT(x, y) \
|
|
|
|
(char *)&(sc->kue_mcfilters[y * ETHER_ADDR_LEN])
|
|
|
|
|
|
|
|
#define KUE_STAT_TX_OK 0x00000001
|
|
|
|
#define KUE_STAT_RX_OK 0x00000002
|
|
|
|
#define KUE_STAT_TX_ERR 0x00000004
|
|
|
|
#define KUE_STAT_RX_ERR 0x00000008
|
|
|
|
#define KUE_STAT_RX_NOBUF 0x00000010
|
|
|
|
#define KUE_STAT_TX_UCAST_BYTES 0x00000020
|
|
|
|
#define KUE_STAT_TX_UCAST_FRAMES 0x00000040
|
|
|
|
#define KUE_STAT_TX_MCAST_BYTES 0x00000080
|
|
|
|
#define KUE_STAT_TX_MCAST_FRAMES 0x00000100
|
|
|
|
#define KUE_STAT_TX_BCAST_BYTES 0x00000200
|
|
|
|
#define KUE_STAT_TX_BCAST_FRAMES 0x00000400
|
|
|
|
#define KUE_STAT_RX_UCAST_BYTES 0x00000800
|
|
|
|
#define KUE_STAT_RX_UCAST_FRAMES 0x00001000
|
|
|
|
#define KUE_STAT_RX_MCAST_BYTES 0x00002000
|
|
|
|
#define KUE_STAT_RX_MCAST_FRAMES 0x00004000
|
|
|
|
#define KUE_STAT_RX_BCAST_BYTES 0x00008000
|
|
|
|
#define KUE_STAT_RX_BCAST_FRAMES 0x00010000
|
|
|
|
#define KUE_STAT_RX_CRCERR 0x00020000
|
|
|
|
#define KUE_STAT_TX_QUEUE_LENGTH 0x00040000
|
|
|
|
#define KUE_STAT_RX_ALIGNERR 0x00080000
|
|
|
|
#define KUE_STAT_TX_SINGLECOLL 0x00100000
|
|
|
|
#define KUE_STAT_TX_MULTICOLL 0x00200000
|
|
|
|
#define KUE_STAT_TX_DEFERRED 0x00400000
|
|
|
|
#define KUE_STAT_TX_MAXCOLLS 0x00800000
|
|
|
|
#define KUE_STAT_RX_OVERRUN 0x01000000
|
|
|
|
#define KUE_STAT_TX_UNDERRUN 0x02000000
|
|
|
|
#define KUE_STAT_TX_SQE_ERR 0x04000000
|
|
|
|
#define KUE_STAT_TX_CARRLOSS 0x08000000
|
|
|
|
#define KUE_STAT_RX_LATECOLL 0x10000000
|
|
|
|
|
|
|
|
#define KUE_RXFILT_PROMISC 0x0001
|
|
|
|
#define KUE_RXFILT_ALLMULTI 0x0002
|
|
|
|
#define KUE_RXFILT_UNICAST 0x0004
|
|
|
|
#define KUE_RXFILT_BROADCAST 0x0008
|
|
|
|
#define KUE_RXFILT_MULTICAST 0x0010
|
|
|
|
|
|
|
|
#define KUE_TIMEOUT 1000
|
|
|
|
#define ETHER_ALIGN 2
|
|
|
|
#define KUE_BUFSZ 1536
|
|
|
|
#define KUE_MIN_FRAMELEN 60
|
|
|
|
|
|
|
|
#define KUE_RX_LIST_CNT 1
|
|
|
|
#define KUE_TX_LIST_CNT 1
|
|
|
|
|
|
|
|
#define KUE_CTL_READ 0x01
|
|
|
|
#define KUE_CTL_WRITE 0x02
|
|
|
|
|
2000-01-16 22:45:07 +00:00
|
|
|
#define KUE_CONFIG_NO 1
|
|
|
|
|
2000-01-05 04:27:24 +00:00
|
|
|
/*
|
|
|
|
* The interrupt endpoint is currently unused
|
|
|
|
* by the KLSI part.
|
|
|
|
*/
|
|
|
|
#define KUE_ENDPT_RX 0x0
|
|
|
|
#define KUE_ENDPT_TX 0x1
|
|
|
|
#define KUE_ENDPT_INTR 0x2
|
|
|
|
#define KUE_ENDPT_MAX 0x3
|
|
|
|
|
|
|
|
struct kue_type {
|
|
|
|
u_int16_t kue_vid;
|
|
|
|
u_int16_t kue_did;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct kue_softc;
|
|
|
|
|
|
|
|
struct kue_chain {
|
|
|
|
struct kue_softc *kue_sc;
|
|
|
|
usbd_xfer_handle kue_xfer;
|
|
|
|
char *kue_buf;
|
|
|
|
struct mbuf *kue_mbuf;
|
|
|
|
int kue_idx;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct kue_cdata {
|
|
|
|
struct kue_chain kue_tx_chain[KUE_TX_LIST_CNT];
|
|
|
|
struct kue_chain kue_rx_chain[KUE_RX_LIST_CNT];
|
|
|
|
int kue_tx_prod;
|
|
|
|
int kue_tx_cons;
|
|
|
|
int kue_tx_cnt;
|
|
|
|
int kue_rx_prod;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define KUE_INC(x, y) (x) = (x + 1) % y
|
|
|
|
|
|
|
|
struct kue_softc {
|
|
|
|
struct arpcom arpcom;
|
|
|
|
usbd_device_handle kue_udev;
|
|
|
|
usbd_interface_handle kue_iface;
|
|
|
|
struct kue_ether_desc kue_desc;
|
|
|
|
int kue_ed[KUE_ENDPT_MAX];
|
|
|
|
usbd_pipe_handle kue_ep[KUE_ENDPT_MAX];
|
|
|
|
int kue_unit;
|
|
|
|
int kue_if_flags;
|
More USB ethernet tweaks:
- Sync ohci, uhci and usbdi modules with NetBSD in order to obtain the
following improvements:
o New USBD_NO_TSLEEP flag can be used in place of UQ_NO_TSLEEP
quirk. This allows drivers to specify busy waiting only for
certain transfers (namely control transfers for reading/writing
registers and stuff).
o New USBD_FORCE_SHORT_XFER flag can be used to deal with
devices like the ADMtek Pegasus that sense the end of bulk OUT
transfers in a special way (if a transfer is exactly a multiple
of 64 bytes in size, you need to send an extra empty packet
to terminate the transfer).
o usbd_open_pipe_intr() now accepts an interval argument which
can be used to change the rate at which the interrupt callback
routine is invoked. Specifying USBD_DEFAULT_INTERVAL uses the
value specified in the device's config data, but drivers can
override it if needed.
- Change if_aue to use USBD_FORCE_SHORT_XFER for packet transmissions.
- Change if_aue, if_kue and if_cue to use USBD_NO_TSLEEP for all
control transfers. We no longer force the non-tsleep hack for
bulk transfers since these are done asynchronously anyway.
- Removed quirk entry fiddling from if_aue and if_kue since we don't
need it anymore now that we have the USBD_NO_TSLEEP flag.
- Tweak ulpt, uhid, ums and ukbd drivers to use the new arg to
usbd_open_pipe_intr().
- Add a flag to the softc struct in the ethernet drivers to indicate
when a device has been detached, and use this flag to perform
tests to prevent the drivers from trying to do control transfers
if this is the case. This is necessary because calling if_detach()
with INET6 enabled will eventually result in a call to the driver's
ioctl() routine to delete the multicast groups on the interface,
which will result in attempts to perform control transfers. (It's
possible this also happens even without INET6 support enabled.) This
is pointless since we know that if the detach method has been called,
the hardware has been unplugged.
- Changed watchdog timeout routines to just call the driver init routines
to initialize the device states without trying to close and re-open the
pipes. This is partly because we don't want to frob things at interrupt
context, but also because this doesn't seem to work right and I don't
want to panic the system just because a USB device may have stopped
responding.
- Fix aue_rxeof() to be a little smarter about detecting when a double
transfer is needed. Unfortunately, the design of the chip makes it hard
to get this exactly right. Hopefully, this will go away once either
Nick or Lennart finds the bug in the uhci driver that makes this ugly
hack necessary.
- Also sync usbdevs with NetBSD.
2000-01-20 07:38:33 +00:00
|
|
|
u_int8_t kue_gone;
|
2000-01-05 04:27:24 +00:00
|
|
|
u_int16_t kue_rxfilt;
|
|
|
|
u_int8_t *kue_mcfilters;
|
|
|
|
struct kue_cdata kue_cdata;
|
2000-10-24 22:38:54 +00:00
|
|
|
struct mtx kue_mtx;
|
2000-01-05 04:27:24 +00:00
|
|
|
};
|
2000-10-24 22:38:54 +00:00
|
|
|
|
2001-02-27 01:05:25 +00:00
|
|
|
#if 0
|
Change and clean the mutex lock interface.
mtx_enter(lock, type) becomes:
mtx_lock(lock) for sleep locks (MTX_DEF-initialized locks)
mtx_lock_spin(lock) for spin locks (MTX_SPIN-initialized)
similarily, for releasing a lock, we now have:
mtx_unlock(lock) for MTX_DEF and mtx_unlock_spin(lock) for MTX_SPIN.
We change the caller interface for the two different types of locks
because the semantics are entirely different for each case, and this
makes it explicitly clear and, at the same time, it rids us of the
extra `type' argument.
The enter->lock and exit->unlock change has been made with the idea
that we're "locking data" and not "entering locked code" in mind.
Further, remove all additional "flags" previously passed to the
lock acquire/release routines with the exception of two:
MTX_QUIET and MTX_NOSWITCH
The functionality of these flags is preserved and they can be passed
to the lock/unlock routines by calling the corresponding wrappers:
mtx_{lock, unlock}_flags(lock, flag(s)) and
mtx_{lock, unlock}_spin_flags(lock, flag(s)) for MTX_DEF and MTX_SPIN
locks, respectively.
Re-inline some lock acq/rel code; in the sleep lock case, we only
inline the _obtain_lock()s in order to ensure that the inlined code
fits into a cache line. In the spin lock case, we inline recursion and
actually only perform a function call if we need to spin. This change
has been made with the idea that we generally tend to avoid spin locks
and that also the spin locks that we do have and are heavily used
(i.e. sched_lock) do recurse, and therefore in an effort to reduce
function call overhead for some architectures (such as alpha), we
inline recursion for this case.
Create a new malloc type for the witness code and retire from using
the M_DEV type. The new type is called M_WITNESS and is only declared
if WITNESS is enabled.
Begin cleaning up some machdep/mutex.h code - specifically updated the
"optimized" inlined code in alpha/mutex.h and wrote MTX_LOCK_SPIN
and MTX_UNLOCK_SPIN asm macros for the i386/mutex.h as we presently
need those.
Finally, caught up to the interface changes in all sys code.
Contributors: jake, jhb, jasone (in no particular order)
2001-02-09 06:11:45 +00:00
|
|
|
#define KUE_LOCK(_sc) mtx_lock(&(_sc)->kue_mtx)
|
|
|
|
#define KUE_UNLOCK(_sc) mtx_unlock(&(_sc)->kue_mtx)
|
2001-02-27 01:05:25 +00:00
|
|
|
#else
|
|
|
|
#define KUE_LOCK(_sc)
|
|
|
|
#define KUE_UNLOCK(_sc)
|
|
|
|
#endif
|