freebsd-dev/sys/arm/lpc/if_lpereg.h
Eitan Adler 7a22215c53 Fix undefined behavior: (1 << 31) is not defined as 1 is an int and this
shifts into the sign bit.  Instead use (1U << 31) which gets the
expected result.

This fix is not ideal as it assumes a 32 bit int, but does fix the issue
for most cases.

A similar change was made in OpenBSD.

Discussed with:	-arch, rdivacky
Reviewed by:	cperciva
2013-11-30 22:17:27 +00:00

209 lines
7.0 KiB
C

/*-
* Copyright (c) 2011 Jakub Wojciech Klama <jceel@FreeBSD.org>
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 THE AUTHOR OR CONTRIBUTORS 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$
*/
#ifndef _ARM_LPC_IF_LPEREG_H
#define _ARM_LPC_IF_LPEREG_H
#define LPE_MAC1 0x000
#define LPE_MAC1_RXENABLE (1 << 0)
#define LPE_MAC1_PASSALL (1 << 1)
#define LPE_MAC1_RXFLOWCTRL (1 << 2)
#define LPE_MAC1_TXFLOWCTRL (1 << 3)
#define LPE_MAC1_LOOPBACK (1 << 4)
#define LPE_MAC1_RESETTX (1 << 8)
#define LPE_MAC1_RESETMCSTX (1 << 9)
#define LPE_MAC1_RESETRX (1 << 10)
#define LPE_MAC1_RESETMCSRX (1 << 11)
#define LPE_MAC1_SIMRESET (1 << 14)
#define LPE_MAC1_SOFTRESET (1 << 15)
#define LPE_MAC2 0x004
#define LPE_MAC2_FULLDUPLEX (1 << 0)
#define LPE_MAC2_FRAMELENCHECK (1 << 1)
#define LPE_MAC2_HUGEFRAME (1 << 2)
#define LPE_MAC2_DELAYEDCRC (1 << 3)
#define LPE_MAC2_CRCENABLE (1 << 4)
#define LPE_MAC2_PADCRCENABLE (1 << 5)
#define LPE_MAC2_VLANPADENABLE (1 << 6)
#define LPE_MAC2_AUTOPADENABLE (1 << 7)
#define LPE_MAC2_PUREPREAMBLE (1 << 8)
#define LPE_MAC2_LONGPREAMBLE (1 << 9)
#define LPE_MAC2_NOBACKOFF (1 << 12)
#define LPE_MAC2_BACKPRESSURE (1 << 13)
#define LPE_MAC2_EXCESSDEFER (1 << 14)
#define LPE_IPGT 0x008
#define LPE_IPGR 0x00c
#define LPE_CLRT 0x010
#define LPE_MAXF 0x014
#define LPE_SUPP 0x018
#define LPE_SUPP_SPEED (1 << 8)
#define LPE_TEST 0x01c
#define LPE_MCFG 0x020
#define LPE_MCFG_SCANINCR (1 << 0)
#define LPE_MCFG_SUPPREAMBLE (1 << 1)
#define LPE_MCFG_CLKSEL(_n) ((_n & 0x7) << 2)
#define LPC_MCFG_RESETMII (1 << 15)
#define LPE_MCMD 0x024
#define LPE_MCMD_READ (1 << 0)
#define LPE_MCMD_WRITE (0 << 0)
#define LPE_MCMD_SCAN (1 << 1)
#define LPE_MADR 0x028
#define LPE_MADR_REGMASK 0x1f
#define LPE_MADR_REGSHIFT 0
#define LPE_MADR_PHYMASK 0x1f
#define LPE_MADR_PHYSHIFT 8
#define LPE_MWTD 0x02c
#define LPE_MWTD_DATAMASK 0xffff
#define LPE_MRDD 0x030
#define LPE_MRDD_DATAMASK 0xffff
#define LPE_MIND 0x034
#define LPE_MIND_BUSY (1 << 0)
#define LPE_MIND_SCANNING (1 << 1)
#define LPE_MIND_INVALID (1 << 2)
#define LPE_MIND_MIIFAIL (1 << 3)
#define LPE_SA0 0x040
#define LPE_SA1 0x044
#define LPE_SA2 0x048
#define LPE_COMMAND 0x100
#define LPE_COMMAND_RXENABLE (1 << 0)
#define LPE_COMMAND_TXENABLE (1 << 1)
#define LPE_COMMAND_REGRESET (1 << 3)
#define LPE_COMMAND_TXRESET (1 << 4)
#define LPE_COMMAND_RXRESET (1 << 5)
#define LPE_COMMAND_PASSRUNTFRAME (1 << 6)
#define LPE_COMMAND_PASSRXFILTER (1 << 7)
#define LPE_COMMAND_TXFLOWCTL (1 << 8)
#define LPE_COMMAND_RMII (1 << 9)
#define LPE_COMMAND_FULLDUPLEX (1 << 10)
#define LPE_STATUS 0x104
#define LPE_STATUS_RXACTIVE (1 << 0)
#define LPE_STATUS_TXACTIVE (1 << 1)
#define LPE_RXDESC 0x108
#define LPE_RXSTATUS 0x10c
#define LPE_RXDESC_NUMBER 0x110
#define LPE_RXDESC_PROD 0x114
#define LPE_RXDESC_CONS 0x118
#define LPE_TXDESC 0x11c
#define LPE_TXSTATUS 0x120
#define LPE_TXDESC_NUMBER 0x124
#define LPE_TXDESC_PROD 0x128
#define LPE_TXDESC_CONS 0x12c
#define LPE_TSV0 0x158
#define LPE_TSV1 0x15c
#define LPE_RSV 0x160
#define LPE_FLOWCONTROL_COUNTER 0x170
#define LPE_FLOWCONTROL_STATUS 0x174
#define LPE_RXFILTER_CTRL 0x200
#define LPE_RXFILTER_UNICAST (1 << 0)
#define LPE_RXFILTER_BROADCAST (1 << 1)
#define LPE_RXFILTER_MULTICAST (1 << 2)
#define LPE_RXFILTER_UNIHASH (1 << 3)
#define LPE_RXFILTER_MULTIHASH (1 << 4)
#define LPE_RXFILTER_PERFECT (1 << 5)
#define LPE_RXFILTER_WOL (1 << 12)
#define LPE_RXFILTER_FILTWOL (1 << 13)
#define LPE_RXFILTER_WOL_STATUS 0x204
#define LPE_RXFILTER_WOL_CLEAR 0x208
#define LPE_HASHFILTER_L 0x210
#define LPE_HASHFILTER_H 0x214
#define LPE_INTSTATUS 0xfe0
#define LPE_INTENABLE 0xfe4
#define LPE_INTCLEAR 0xfe8
#define LPE_INTSET 0xfec
#define LPE_INT_RXOVERRUN (1 << 0)
#define LPE_INT_RXERROR (1 << 1)
#define LPE_INT_RXFINISH (1 << 2)
#define LPE_INT_RXDONE (1 << 3)
#define LPE_INT_TXUNDERRUN (1 << 4)
#define LPE_INT_TXERROR (1 << 5)
#define LPE_INT_TXFINISH (1 << 6)
#define LPE_INT_TXDONE (1 << 7)
#define LPE_INT_SOFTINT (1 << 12)
#define LPE_INTWAKEUPINT (1 << 13)
#define LPE_POWERDOWN 0xff4
#define LPE_DESC_ALIGN 8
#define LPE_TXDESC_NUM 128
#define LPE_RXDESC_NUM 128
#define LPE_TXDESC_SIZE (LPE_TXDESC_NUM * sizeof(struct lpe_hwdesc))
#define LPE_RXDESC_SIZE (LPE_RXDESC_NUM * sizeof(struct lpe_hwdesc))
#define LPE_TXSTATUS_SIZE (LPE_TXDESC_NUM * sizeof(struct lpe_hwstatus))
#define LPE_RXSTATUS_SIZE (LPE_RXDESC_NUM * sizeof(struct lpe_hwstatus))
#define LPE_MAXFRAGS 8
struct lpe_hwdesc {
uint32_t lhr_data;
uint32_t lhr_control;
};
struct lpe_hwstatus {
uint32_t lhs_info;
uint32_t lhs_crc;
};
#define LPE_INC(x, y) (x) = ((x) == ((y)-1)) ? 0 : (x)+1
/* These are valid for both Rx and Tx descriptors */
#define LPE_HWDESC_SIZE_MASK (1 << 10)
#define LPE_HWDESC_INTERRUPT (1U << 31)
/* These are valid for Tx descriptors */
#define LPE_HWDESC_LAST (1 << 30)
#define LPE_HWDESC_CRC (1 << 29)
#define LPE_HWDESC_PAD (1 << 28)
#define LPE_HWDESC_HUGE (1 << 27)
#define LPE_HWDESC_OVERRIDE (1 << 26)
/* These are valid for Tx status descriptors */
#define LPE_HWDESC_COLLISIONS(_n) (((_n) >> 21) & 0x7)
#define LPE_HWDESC_DEFER (1 << 25)
#define LPE_HWDESC_EXCDEFER (1 << 26)
#define LPE_HWDESC_EXCCOLL (1 << 27)
#define LPE_HWDESC_LATECOLL (1 << 28)
#define LPE_HWDESC_UNDERRUN (1 << 29)
#define LPE_HWDESC_TXNODESCR (1 << 30)
#define LPE_HWDESC_ERROR (1U << 31)
/* These are valid for Rx status descriptors */
#define LPE_HWDESC_CONTROL (1 << 18)
#define LPE_HWDESC_VLAN (1 << 19)
#define LPE_HWDESC_FAILFILTER (1 << 20)
#define LPE_HWDESC_MULTICAST (1 << 21)
#define LPE_HWDESC_BROADCAST (1 << 22)
#define LPE_HWDESC_CRCERROR (1 << 23)
#define LPE_HWDESC_SYMBOLERROR (1 << 24)
#define LPE_HWDESC_LENGTHERROR (1 << 25)
#define LPE_HWDESC_RANGEERROR (1 << 26)
#define LPE_HWDESC_ALIGNERROR (1 << 27)
#define LPE_HWDESC_OVERRUN (1 << 28)
#define LPE_HWDESC_RXNODESCR (1 << 29)
#define LPE_HWDESC_LASTFLAG (1 << 30)
#define LPE_HWDESC_ERROR (1U << 31)
#endif /* _ARM_LPC_IF_LPEREG_H */