summaryrefslogtreecommitdiff
path: root/cleopatre/linux-2.6.25.10-spc300
diff options
context:
space:
mode:
Diffstat (limited to 'cleopatre/linux-2.6.25.10-spc300')
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/arch/arm/Makefile9
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/arch/arm/boot/Makefile5
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/arch/arm/configs/spc300_defconfig941
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/Kconfig16
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/drivers/net/arm/synop3504.c340
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/drivers/net/phy/icplus.c1463
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/drivers/net/phy/icplus.h212
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/include/linux/ethtool.h124
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/include/linux/phy.h36
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/net/bridge/br_forward.c15
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/net/core/ethtool.c18
11 files changed, 2730 insertions, 449 deletions
diff --git a/cleopatre/linux-2.6.25.10-spc300/arch/arm/Makefile b/cleopatre/linux-2.6.25.10-spc300/arch/arm/Makefile
index bada6a0f39..fbbd72ec7c 100644
--- a/cleopatre/linux-2.6.25.10-spc300/arch/arm/Makefile
+++ b/cleopatre/linux-2.6.25.10-spc300/arch/arm/Makefile
@@ -206,6 +206,7 @@ endif
all: $(KBUILD_IMAGE)
boot := arch/arm/boot
+CONFIG_MAIN := ../buildroot/.config
# Update machine arch and proc symlinks if something which affects
# them changed. We use .arch to indicate when they were updated
@@ -231,10 +232,10 @@ maketools: include/linux/version.h include/asm-arm/.arch FORCE
bzImage: zImage
zImage Image xipImage bootpImage uImage sImage: vmlinux
- $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
+ $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) CONFIG_MAIN=$(CONFIG_MAIN) $(boot)/$@
zinstall install: vmlinux
- $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
+ $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) CONFIG_MAIN=$(CONFIG_MAIN) $@
CLEAN_FILES += include/asm-arm/mach-types.h \
include/asm-arm/arch include/asm-arm/.arch
@@ -244,8 +245,8 @@ archclean:
$(Q)$(MAKE) $(clean)=$(boot)
# My testing targets (bypasses dependencies)
-bp:; $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/bootpImage
-i zi:; $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
+bp:; $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) CONFIG_MAIN=$(CONFIG_MAIN) $(boot)/bootpImage
+i zi:; $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) CONFIG_MAIN=$(CONFIG_MAIN) $@
define archhelp
diff --git a/cleopatre/linux-2.6.25.10-spc300/arch/arm/boot/Makefile b/cleopatre/linux-2.6.25.10-spc300/arch/arm/boot/Makefile
index 30b43df923..04bab3b7b1 100644
--- a/cleopatre/linux-2.6.25.10-spc300/arch/arm/boot/Makefile
+++ b/cleopatre/linux-2.6.25.10-spc300/arch/arm/boot/Makefile
@@ -72,11 +72,12 @@ $(obj)/uImage: $(obj)/zImage FORCE
quiet_cmd_simage = SIMAGE $@
cmd_simage = $(MKSIMAGE) --image 300 \
--desc "SPC300 image" \
- --ver "$(if $(IMG_VERSION),$(IMG_VERSION),$(shell date +%F\ %R))" \
+ --ver "$(IMG_VERSION)" \
--size "$(shell du -sb $< | awk '{ print $$1 }')" \
--md5 "$(shell md5sum $< | awk '{ print $$1 }')" \
+ --plc-ram "$(PLC_MEM_SIZE_MB)" \
--sysclk "$(if $(CONFIG_SYSCLK_SPEED),$(CONFIG_SYSCLK_SPEED),0)" \
- --plc-ram "$(PLC_MEM_SIZE_MB)" > $@ ; \
+ --brd "$(shell grep BR2_HOSTNAME $(CONFIG_MAIN) | awk '{ print $$1 }')" > $@ ; \
cat $< >> $@
$(obj)/sImage: $(obj)/zImage FORCE
diff --git a/cleopatre/linux-2.6.25.10-spc300/arch/arm/configs/spc300_defconfig b/cleopatre/linux-2.6.25.10-spc300/arch/arm/configs/spc300_defconfig
new file mode 100644
index 0000000000..14fcf6b8fb
--- /dev/null
+++ b/cleopatre/linux-2.6.25.10-spc300/arch/arm/configs/spc300_defconfig
@@ -0,0 +1,941 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.25.10
+# Wed Aug 20 11:50:09 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+# CONFIG_GENERIC_GPIO is not set
+# CONFIG_GENERIC_TIME is not set
+# CONFIG_GENERIC_CLOCKEVENTS is not set
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ARCH_SUPPORTS_AOUT=y
+CONFIG_ZONE_DMA=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_CGROUPS is not set
+CONFIG_GROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+# CONFIG_RT_GROUP_SCHED is not set
+CONFIG_USER_SCHED=y
+# CONFIG_CGROUP_SCHED is not set
+CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE="/home/save/Cleopatre/undergit/cleopatre/buildroot/binaries/arizona/rootfs.arm.initramfs_list"
+CONFIG_INITRAMFS_ROOT_UID=0
+CONFIG_INITRAMFS_ROOT_GID=0
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_COMPAT_BRK=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS is not set
+CONFIG_HAVE_OPROFILE=y
+CONFIG_KPROBES=y
+CONFIG_KRETPROBES=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+CONFIG_CLASSIC_RCU=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+CONFIG_ARCH_SPC300=y
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_ORION is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_MSM7X00A is not set
+
+#
+# Boot options
+#
+
+#
+# Power management
+#
+
+#
+# SPC300 platform type
+#
+# CONFIG_MACH_ARIZONA is not set
+CONFIG_MACH_SPK300G=y
+# CONFIG_MACH_SPK310 is not set
+# CONFIG_MACH_SCR310 is not set
+# CONFIG_MACH_SCR300 is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+# CONFIG_ARM_THUMB is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+# CONFIG_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+CONFIG_ARM_AMBA=y
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_TICK_ONESHOT is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=100
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttyS0,115200n8"
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_ARTHUR is not set
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_XFRM_STATISTICS is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IP_VS is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETLABEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_ADVANCED=y
+CONFIG_BRIDGE_NETFILTER=y
+
+#
+# Core Netfilter Configuration
+#
+CONFIG_NETFILTER_NETLINK=y
+CONFIG_NETFILTER_NETLINK_QUEUE=y
+CONFIG_NETFILTER_NETLINK_LOG=y
+# CONFIG_NF_CONNTRACK is not set
+# CONFIG_NETFILTER_XTABLES is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# Bridge: Netfilter Configuration
+#
+CONFIG_BRIDGE_NF_EBTABLES=y
+CONFIG_BRIDGE_EBT_BROUTE=y
+CONFIG_BRIDGE_EBT_T_FILTER=y
+CONFIG_BRIDGE_EBT_T_NAT=y
+CONFIG_BRIDGE_EBT_802_3=y
+CONFIG_BRIDGE_EBT_AMONG=y
+CONFIG_BRIDGE_EBT_ARP=y
+CONFIG_BRIDGE_EBT_IP=y
+CONFIG_BRIDGE_EBT_LIMIT=y
+CONFIG_BRIDGE_EBT_MARK=y
+CONFIG_BRIDGE_EBT_PKTTYPE=y
+CONFIG_BRIDGE_EBT_STP=y
+CONFIG_BRIDGE_EBT_VLAN=y
+CONFIG_BRIDGE_EBT_ARPREPLY=y
+CONFIG_BRIDGE_EBT_DNAT=y
+CONFIG_BRIDGE_EBT_MARK_T=y
+CONFIG_BRIDGE_EBT_REDIRECT=y
+CONFIG_BRIDGE_EBT_SNAT=y
+CONFIG_BRIDGE_EBT_LOG=y
+# CONFIG_BRIDGE_EBT_ULOG is not set
+# CONFIG_IP_DCCP is not set
+CONFIG_IP_SCTP=y
+# CONFIG_SCTP_DBG_MSG is not set
+# CONFIG_SCTP_DBG_OBJCNT is not set
+# CONFIG_SCTP_HMAC_NONE is not set
+# CONFIG_SCTP_HMAC_SHA1 is not set
+CONFIG_SCTP_HMAC_MD5=y
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+CONFIG_BRIDGE=y
+CONFIG_VLAN_8021Q=y
+# CONFIG_DECNET is not set
+CONFIG_LLC=y
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NET_TCPPROBE is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_STANDALONE is not set
+# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+# CONFIG_FW_LOADER is not set
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+# CONFIG_MTD_OOPS is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+CONFIG_MTD_SPC300_NOR=y
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_DATAFLASH is not set
+CONFIG_MTD_M25P80=y
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=15360
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+CONFIG_MISC_DEVICES=y
+CONFIG_EEPROM_93CX6=y
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_HAVE_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_VETH is not set
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+CONFIG_DAVICOM_PHY=y
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+CONFIG_ICPLUS_PHY=y
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_FIXED_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+CONFIG_SYNOP3504=y
+# CONFIG_AX88796 is not set
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_ENC28J60 is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_B44 is not set
+CONFIG_NETDEV_1000=y
+# CONFIG_E1000E_ENABLED is not set
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=240
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_AMBA_PL010 is not set
+# CONFIG_SERIAL_AMBA_PL011 is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=16
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+CONFIG_AD9865=y
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_SPC300=y
+# CONFIG_SPI_BITBANG is not set
+
+#
+# SPI Protocol Masters
+#
+CONFIG_SPI_AT25=y
+# CONFIG_SPI_SPIDEV is not set
+# CONFIG_SPI_TLE62X0 is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+CONFIG_WATCHDOG=y
+CONFIG_WATCHDOG_NOWAYOUT=y
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+
+#
+# Sonics Silicon Backplane
+#
+CONFIG_SSB_POSSIBLE=y
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+# CONFIG_HID_SUPPORT is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_NEW_LEDS is not set
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_CONFIGFS_FS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# CONFIG_JFFS2_FS_WRITEBUFFER is not set
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+# CONFIG_JFFS2_LZO is not set
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_NETWORK_FILESYSTEMS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_NLS is not set
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_KPROBES_SANITY_TEST is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_LKDTM is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_SAMPLES is not set
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+CONFIG_SECURITY=y
+# CONFIG_SECURITY_NETWORK is not set
+CONFIG_SECURITY_CAPABILITIES=y
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+# CONFIG_CRYPTO_SEQIV is not set
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_HMAC=y
+# CONFIG_CRYPTO_XCBC is not set
+CONFIG_CRYPTO_NULL=y
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA256=y
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_ECB is not set
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_PCBC is not set
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_XTS is not set
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+# CONFIG_CRYPTO_LZO is not set
+CONFIG_CRYPTO_HW=y
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC16=y
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+CONFIG_LIBCRC32C=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/Kconfig b/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/Kconfig
index 4d34d8bd80..079094eca2 100644
--- a/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/Kconfig
+++ b/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/Kconfig
@@ -1,6 +1,22 @@
menu "SPC300 platform type"
depends on ARCH_SPC300
+# Board subtype
+# =============
+#
+# Each Board should select its subtype
+choice
+ prompt "SPC300 EoC board subtype"
+ default MACH_MASTER
+
+config MACH_MASTER
+ bool "Master board"
+
+config MACH_SLAVE
+ bool "Slave board"
+
+endchoice
+
# Board types (MACH_*)
# ====================
#
diff --git a/cleopatre/linux-2.6.25.10-spc300/drivers/net/arm/synop3504.c b/cleopatre/linux-2.6.25.10-spc300/drivers/net/arm/synop3504.c
index 3aa558712c..3bfa882d42 100644
--- a/cleopatre/linux-2.6.25.10-spc300/drivers/net/arm/synop3504.c
+++ b/cleopatre/linux-2.6.25.10-spc300/drivers/net/arm/synop3504.c
@@ -55,6 +55,7 @@
#endif
#include <linux/dma-mapping.h>
#include <linux/kthread.h>
+#include <linux/if_ether.h>
#include <net/seq_check.h>
#include <linux/if_vlan.h>
#include <asm/arch/ips/ahb2miu.h>
@@ -139,6 +140,7 @@ struct net_priv
unsigned int link;
unsigned int speed;
unsigned int duplex;
+ unsigned int service_type;
uint8_t mac_id;
#ifdef CONFIG_SEQ_CHECK
@@ -238,12 +240,12 @@ static int synop3504_gsettings(struct net_device *dev, struct ethtool_cmd *cmd)
*/
static void synop3504_gdrvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo)
{
- strcpy(drvinfo->driver, DRV_NAME);
- strcpy(drvinfo->version, DRV_VERSION);
- strcpy(drvinfo->fw_version, "N/A");
- strcpy(drvinfo->bus_info, "N/A");
- drvinfo->regdump_len = 0;
- drvinfo->eedump_len = 0;
+ strcpy(drvinfo->driver, DRV_NAME);
+ strcpy(drvinfo->version, DRV_VERSION);
+ strcpy(drvinfo->fw_version, "N/A");
+ strcpy(drvinfo->bus_info, "N/A");
+ drvinfo->regdump_len = 0;
+ drvinfo->eedump_len = 0;
}
static void synop3504_ethtool_get_pauseparam(struct net_device *netdev,
@@ -275,27 +277,29 @@ static int synop3504_ethtool_set_pauseparam(struct net_device *netdev,
/** Ethtool functions */
const struct ethtool_ops synop3504_ethtool_ops = {
- .get_settings = synop3504_gsettings,
- .set_settings = synop3504_ssettings,
- .get_drvinfo = synop3504_gdrvinfo,
- .get_link = ethtool_op_get_link,
- .get_pauseparam = synop3504_ethtool_get_pauseparam,
- .set_pauseparam = synop3504_ethtool_set_pauseparam,
-/* .get_regs_len = synop3504_reglen,
- .get_regs = synop3504_get_regs,
- .get_coalesce = synop3504_gcoalesce,
- .set_coalesce = synop3504_scoalesce,
- .get_ringparam = synop3504_gringparam,
- .set_ringparam = synop3504_sringparam,
- .get_strings = synop3504_gstrings,
- .get_sset_count = synop3504_sset_count,
- .get_ethtool_stats = synop3504_fill_stats,
- .get_rx_csum = synop3504_get_rx_csum,
- .get_tx_csum = synop3504_get_tx_csum,
- .set_rx_csum = synop3504_set_rx_csum,
- .set_tx_csum = synop3504_set_tx_csum,
- .get_msglevel = synop3504_get_msglevel,
- .set_msglevel = synop3504_set_msglevel,*/
+ .get_settings = synop3504_gsettings,
+ .set_settings = synop3504_ssettings,
+ .get_drvinfo = synop3504_gdrvinfo,
+ .get_link = ethtool_op_get_link,
+ .get_pauseparam = synop3504_ethtool_get_pauseparam,
+ .set_pauseparam = synop3504_ethtool_set_pauseparam,
+#if 0
+ .get_regs_len = synop3504_reglen,
+ .get_regs = synop3504_get_regs,
+ .get_coalesce = synop3504_gcoalesce,
+ .set_coalesce = synop3504_scoalesce,
+ .get_ringparam = synop3504_gringparam,
+ .set_ringparam = synop3504_sringparam,
+ .get_strings = synop3504_gstrings,
+ .get_sset_count = synop3504_sset_count,
+ .get_ethtool_stats = synop3504_fill_stats,
+ .get_rx_csum = synop3504_get_rx_csum,
+ .get_tx_csum = synop3504_get_tx_csum,
+ .set_rx_csum = synop3504_set_rx_csum,
+ .set_tx_csum = synop3504_set_tx_csum,
+ .get_msglevel = synop3504_get_msglevel,
+ .set_msglevel = synop3504_set_msglevel,
+#endif
};
#ifdef CONFIG_CHIP_FEATURE_NO_MDIO
@@ -701,27 +705,171 @@ static int synop3504_ethtool_ioctl(struct net_device *dev, void *useraddr)
}
case ETHTOOL_RVLAN_TABLE:
{
- struct ethtool_vlanparam ecmd;
+ struct ethtool_vlanparam ecmd;
- if (priv->phydev->drv->read_vlan_table (priv->phydev, &ecmd))
+ if (priv->phydev->drv->read_vlan_table (priv->phydev, &ecmd))
return -EFAULT;
- if(copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
+ if(copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
return -EFAULT;
- return 0;
+ return 0;
}
case ETHTOOL_SVLAN_TABLE:
{
- struct ethtool_vlanparam ecmd;
+ struct ethtool_vlanparam ecmd;
+
+ if(copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
+ return -EFAULT;
+
+ if (priv->phydev->drv->write_vlan_table (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_RPORT_PHY:
+ {
+ struct ethtool_phyparam ecmd;
+
+ if (priv->phydev->drv->read_port_phy (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ if (copy_to_user (useraddr, &ecmd, sizeof (ecmd)))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_SPORT_PHY:
+ {
+ struct ethtool_phyparam ecmd;
+
+ if (copy_from_user (&ecmd, useraddr, sizeof (ecmd)))
+ return -EFAULT;
+
+ if (priv->phydev->drv->write_port_phy (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_RSTM_CTL:
+ {
+ struct ethtool_stmparam ecmd;
+
+ if (priv->phydev->drv->read_stm_ctl (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ if (copy_to_user (useraddr, &ecmd, sizeof (ecmd)))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_SSTM_CTL:
+ {
+ struct ethtool_stmparam ecmd;
+
+ if (copy_from_user (&ecmd, useraddr, sizeof (ecmd)))
+ return -EFAULT;
+
+ if (priv->phydev->drv->write_stm_ctl (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_RQOSRATE:
+ {
+ struct ethtool_qosrateparam ecmd;
+
+ if (priv->phydev->drv->read_qosrate (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ if (copy_to_user (useraddr, &ecmd, sizeof (ecmd)))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_SQOSRATE:
+ {
+ struct ethtool_qosrateparam ecmd;
+
+ if (copy_from_user (&ecmd, useraddr, sizeof (ecmd)))
+ return -EFAULT;
+
+ if (priv->phydev->drv->write_qosrate (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_RMIRROR:
+ {
+ struct ethtool_mirror ecmd;
+
+ if (priv->phydev->drv->read_mirror (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ if (copy_to_user (useraddr, &ecmd, sizeof (ecmd)))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_SMIRROR:
+ {
+ struct ethtool_mirror ecmd;
+
+ if (copy_from_user (&ecmd, useraddr, sizeof (ecmd)))
+ return -EFAULT;
+
+ if (priv->phydev->drv->write_mirror (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_RFAT:
+ {
+ struct ethtool_fat ecmd;
+
+ if (priv->phydev->drv->read_fat (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ if (copy_to_user (useraddr, &ecmd, sizeof (ecmd)))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_SFAT:
+ {
+ struct ethtool_fat ecmd;
- if(copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
- return -EFAULT;
+ if (copy_from_user (&ecmd, useraddr, sizeof (ecmd)))
+ return -EFAULT;
- if (priv->phydev->drv->write_vlan_table (priv->phydev, &ecmd))
- return -EFAULT;
+ if (priv->phydev->drv->write_fat (priv->phydev, &ecmd))
+ return -EFAULT;
- return 0;
+ return 0;
+ }
+ case ETHTOOL_RIGMP:
+ {
+ struct ethtool_igmp ecmd;
+
+ if (priv->phydev->drv->read_igmp (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ if (copy_to_user (useraddr, &ecmd, sizeof (ecmd)))
+ return -EFAULT;
+
+ return 0;
+ }
+ case ETHTOOL_SIGMP:
+ {
+ struct ethtool_igmp ecmd;
+
+ if (copy_from_user (&ecmd, useraddr, sizeof (ecmd)))
+ return -EFAULT;
+
+ if (priv->phydev->drv->write_igmp (priv->phydev, &ecmd))
+ return -EFAULT;
+
+ return 0;
}
default:
break;
@@ -760,7 +908,7 @@ static int synop3504_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
case SIOCGMIIPHY:
case SIOCGMIIREG:
- case SIOCSMIIREG:
+ case SIOCSMIIREG:
{
priv = dev->priv;
return generic_mii_ioctl (&priv->mii_if,
@@ -769,7 +917,7 @@ static int synop3504_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
break;
}
default:
- return -EOPNOTSUPP;
+ return -EOPNOTSUPP;
}
#endif
return 0;
@@ -849,6 +997,22 @@ static int synop3504_tx(struct sk_buff *skb, struct net_device *dev)
}// synop3504_tx
/**
+ * Get Ethernet Type
+ * \param eth_frame Ethernet frame pointer.
+ * \return Ethernet Type
+ */
+uint16_t get_eth_type(uint8_t* eth_frame)
+{
+ struct ethhdr *eth = (struct ethhdr *) eth_frame;
+ uint16_t result;
+ result = htons (eth->h_proto);
+ return result;
+}// get_eth_type
+
+#define VLAN_VID(tci) (tci & VLAN_VID_MASK)
+#define VLAN_VPRIO(tci) ((tci >> 13) & 0x7 )
+
+/**
* receive frame procedure.
* \param dev device structure.
* \param budget allocated budget.
@@ -861,6 +1025,7 @@ static void synop3504_rx(struct net_device *dev, int *budget)
struct net_priv *priv = (struct net_priv*)dev->priv;
struct dma_rx *rx = (struct dma_rx*)&priv->rx;
uint32_t n;
+ uint32_t service_mark = 0;
if(*budget == 0)
return;
@@ -918,14 +1083,14 @@ static void synop3504_rx(struct net_device *dev, int *budget)
goto reuse_buffer;
}
- //Pre-allocate a new buffer
+ //Pre-allocate a new buffer
if((new_skb = dev_alloc_skb(PKT_BUF_SZ)) == NULL)
{
//Cannot allocate a new buffer re-use the same and drop the
//current frame
priv->stats.rx_dropped++;
goto reuse_buffer;
- }
+ }
skb = rx->skbs[n];
BUG_ON(!skb);
@@ -939,6 +1104,27 @@ static void synop3504_rx(struct net_device *dev, int *budget)
//Update the skbuff
skb_put(skb, rxsize);
skb->dev = dev;
+ // Set mark in skbuff according to service_type, for bw limit
+ switch(priv->service_type)
+ {
+ case 1:
+ // LIBSPID_SERVICE_TYPE_VID
+ if (get_eth_type((uint8_t*)skb->data) == ETH_P_8021Q)
+ service_mark = (uint32_t)VLAN_VID(htons(((struct vlan_ethhdr*)skb->data)->h_vlan_TCI));
+ break;
+
+ case 2:
+ // LIBSPID_SERVICE_TYPE_PRIO
+ if (get_eth_type((uint8_t*)skb->data) == ETH_P_8021Q)
+ service_mark = (uint32_t)VLAN_VPRIO(htons(((struct vlan_ethhdr*)skb->data)->h_vlan_TCI));
+ break;
+
+ default:
+ // nothing to do
+ break;
+ }
+ skb->mark = service_mark;
+
skb->protocol = eth_type_trans(skb, dev);
dev->last_rx = jiffies;
@@ -951,7 +1137,7 @@ static void synop3504_rx(struct net_device *dev, int *budget)
priv->stats.rx_packets++;
priv->stats.rx_bytes += rxsize;
- //Update the current buffer descriptor with new buffer
+ //Update the current buffer descriptor with new buffer
rx->ring[n].addr1 = (uint32_t)dma_map_single(NULL, new_skb->data, PKT_BUF_SZ, DMA_FROM_DEVICE);
rx->skbs[n] = new_skb;
@@ -1214,6 +1400,28 @@ static int mdiobus_write(struct mii_bus *bus, int phy_id, int regnum, u16 val)
return 0;
}
+static int synop3504_readproc_service_type(char *buf, char **start, off_t offset, int count, int *eof, void *data)
+{
+ unsigned int *service_type = (unsigned int *)data;
+ char *p = buf;
+
+ p += sprintf(p, "ETH_MARK 0x%x\n", *service_type);
+
+ *eof = 1;
+ return p-buf+1;
+}
+
+static int synop3504_writeproc_service_type(struct file *file, const char *buffer, unsigned long count, void *data)
+{
+ unsigned int *service_type = (unsigned int *)data;
+ int value;
+
+ if(sscanf(buffer,"ETH_MARK %i", &value) == 1)
+ *service_type = value;
+
+ return count;
+}
+
/**
* Read the PHY MII registers by /proc.
*
@@ -1262,7 +1470,7 @@ static int synop3504_writeproc_mii(struct file *file, const char *buffer, unsign
if(sscanf(buffer,"REG%u %i", &reg, &value) == 2)
{
- mdiobus_write(phydev->bus, phydev->addr, reg, value);
+ mdiobus_write(phydev->bus, phydev->addr, reg, value);
printk("Sent PHY%d REG%d 0x%04x\n", phydev->addr, reg, value);
}
@@ -1292,11 +1500,11 @@ static void synop3504_handle_link_change(struct net_device *dev)
return;
phydev = priv->phydev;
if (phydev == NULL)
- return;
+ return;
- if (phydev->link)
+ if (phydev->link)
{
- if ((priv->speed != phydev->speed) || (priv->duplex != phydev->duplex))
+ if ((priv->speed != phydev->speed) || (priv->duplex != phydev->duplex))
{
SynopsysSetMiiClkCap(synop, phydev->speed);
SynopsysSetSpeedDuplex(synop, phydev->speed, phydev->duplex);
@@ -1308,7 +1516,7 @@ static void synop3504_handle_link_change(struct net_device *dev)
}
//link change
- if (phydev->link != priv->link)
+ if (phydev->link != priv->link)
{
if (!phydev->link)
{
@@ -1332,7 +1540,7 @@ static void synop3504_handle_link_change(struct net_device *dev)
status_change = 1;
}
- if (status_change)
+ if (status_change)
{
if (phydev->link)
printk(KERN_ERR DRV_NAME": %s: link up (%d/%s)\n", dev->name, phydev->speed, DUPLEX_FULL == phydev->duplex ? "Full":"Half");
@@ -1456,7 +1664,7 @@ static int synop3504_mii_init(struct net_device *dev)
priv->mii_bus->dev = &priv->dev->dev;
priv->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
- if (NULL == priv->mii_bus->irq)
+ if (NULL == priv->mii_bus->irq)
{
err = -ENOMEM;
goto err_out_free_mdio_bus;
@@ -1507,10 +1715,13 @@ static int synop3504_open(struct net_device *dev)
if(synop == NULL)
return -1;
if (!priv->phydev)
- return -EAGAIN;
+ return -EAGAIN;
TRACE("%s: open\n", dev->name);
+ //Initialise service type for bw limitation (vlanid by default)
+ priv->service_type = 1;
+
//Reset synopsys hardware
SynopsysReset(synop);
@@ -1676,13 +1887,15 @@ static int synop3504_init(struct net_device *dev)
//Check MAC address for Linux
if(!is_valid_ether_addr(dev->dev_addr))
{
- printk(KERN_ERR DRV_NAME": %s: Error with MAC address %02X:%02X:%02X:%02X:%02X:%02X\n", dev->name,
- dev->dev_addr[0],
- dev->dev_addr[1],
- dev->dev_addr[2],
- dev->dev_addr[3],
- dev->dev_addr[4],
- dev->dev_addr[5]);
+ printk (KERN_ERR DRV_NAME": %s: Error with MAC address "
+ "%02X:%02X:%02X:%02X:%02X:%02X\n",
+ dev->name,
+ dev->dev_addr[0],
+ dev->dev_addr[1],
+ dev->dev_addr[2],
+ dev->dev_addr[3],
+ dev->dev_addr[4],
+ dev->dev_addr[5]);
return -1;
}
@@ -1895,7 +2108,7 @@ static int __init synop3504_module_probe(struct platform_device *pdev)
if (synop3504_mii_init(dev) != 0)
{
- goto err_out_unregister_netdev;
+ goto err_out_unregister_netdev;
}
#ifndef CONFIG_CHIP_FEATURE_NO_MDIO
@@ -1921,6 +2134,15 @@ static int __init synop3504_module_probe(struct platform_device *pdev)
}
}
+ if (!device_cnt)
+ {
+ sprintf(buf, "set_mark");
+ entry = create_proc_entry(buf, 0, init_net.proc_net);
+ entry->read_proc = synop3504_readproc_service_type;
+ entry->write_proc = synop3504_writeproc_service_type;
+ entry->data = &(priv->service_type);
+ }
+
device_cnt++;
#endif
platform_set_drvdata(pdev, dev);
@@ -1961,7 +2183,7 @@ static void __exit synop3504_module_remove(struct platform_device *pdev)
priv = netdev_priv(dev);
#ifndef CONFIG_CHIP_FEATURE_NO_MDIO
if (priv->phydev)
- phy_disconnect(priv->phydev);
+ phy_disconnect(priv->phydev);
mdiobus_unregister(priv->mii_bus);
#endif
kfree(priv->mii_bus->irq);
diff --git a/cleopatre/linux-2.6.25.10-spc300/drivers/net/phy/icplus.c b/cleopatre/linux-2.6.25.10-spc300/drivers/net/phy/icplus.c
index b7feecd0a2..cfa7c03ada 100644
--- a/cleopatre/linux-2.6.25.10-spc300/drivers/net/phy/icplus.c
+++ b/cleopatre/linux-2.6.25.10-spc300/drivers/net/phy/icplus.c
@@ -42,396 +42,1247 @@
#include "icplus.h"
-//#define TRACE(...) printk(DRV_NAME": " __VA_ARGS__)
-#define TRACE(...)
-
MODULE_DESCRIPTION("ICPlus ip175C/D PHY driver");
MODULE_AUTHOR("SPiDCOM Technologies");
MODULE_LICENSE("GPL");
-
-/** Private structure for our phy device */
+/** Private structure for our phy device. */
struct ip175x_priv
{
struct phy_device *phydev;
uint32_t model;
- uint16_t vlan_valid;
};
-
-int ip175x_read_vlan_table (struct phy_device *phydev, struct ethtool_vlanparam *ecmd)
+int
+ip175x_read_vlan_table (struct phy_device *phydev,
+ struct ethtool_vlanparam *ecmd)
{
struct ip175x_priv *priv = phydev->priv;
u16 reg;
int port;
- switch(priv->model)
+ switch (priv->model)
{
- case ICPLUS_MODEL_IP175D:
- // Read VLAN_MODE[5:0] field in PHY22, MII0.
- reg = phydev->bus->read(phydev->bus,
- IP175D_VLAN_CLS_REG_PHY,
- IP175D_VLAN_CLS_REG_NUM);
- TRACE ("IP175D_VLAN_CLS_REG (%d:%d)= %x\n",IP175D_VLAN_CLS_REG_PHY, IP175D_VLAN_CLS_REG_NUM, reg);
- for (port = 0; port < MAX_VLAN_SUPPORTED; port++)
- {
- ecmd->vlan_table[port].state = (reg & (1 << port)) != 0 ? VLAN_ON : VLAN_OFF;
- ecmd->vlan_table[port].vlan = phydev->bus->read(phydev->bus,
- IP175D_VLAN_INFO_REG_PHY,
- IP175D_VLAN_INFO_REG_NUM(port));
- TRACE("IP175D_VLAN_INFO_REG (%d:%d) =%x\n", IP175D_VLAN_INFO_REG_PHY, IP175D_VLAN_INFO_REG_NUM(port), ecmd->vlan_table[port].vlan);
- }
- break;
+ case ICPLUS_MODEL_IP175D:
+ /* Read VLAN_MODE[5:0] field in PHY22, MII0. */
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_CLS_REG_NUM);
- default :
- // Feature not supported
- return -EOPNOTSUPP;
+ for (port = 0; port < MAX_VLAN_SUPPORTED; port++)
+ {
+ unsigned int vid = 0;
+ unsigned int vprio = 0;
+
+ ecmd->vlan_table[port].state = ((reg & (1 << port)) != 0 ?
+ VLAN_ON : VLAN_OFF);
+ vid = phydev->bus->read (phydev->bus,
+ IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_INFO_REG_NUM (port));
+ vprio = phydev->bus->read (phydev->bus,
+ IP175D_VLAN_MEMBER_REG_PHY,
+ IP175D_VLAN_MISC_REG_NUM (port));
+
+ if (((port + 1) % 2) == 0)
+ /* vprio is on bit 15-13. */
+ vprio = (vprio >> (IP175D_REW_VLAN_PRIO + 8));
+ else
+ /* vprio is on bit 7-5. */
+ vprio = (vprio >> (IP175D_REW_VLAN_PRIO + 0));
+
+ ecmd->vlan_table[port].vlan = ((vprio & 0x7) << 13)
+ | ((vid & 0xFFF) << 0);
+ }
+ break;
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
}
return 0;
}
-int ip175x_write_vlan_table (struct phy_device *phydev, struct ethtool_vlanparam *ecmd)
+int
+ip175x_write_vlan_table (struct phy_device *phydev,
+ struct ethtool_vlanparam *ecmd)
{
struct ip175x_priv *priv = phydev->priv;
uint8_t add_tag[IP175D_VLAN_TABLE_SIZE];
uint8_t remove_tag[IP175D_VLAN_TABLE_SIZE];
uint8_t vlan_member[IP175D_VLAN_TABLE_SIZE];
+ uint8_t vlan_misc[IP175D_VLAN_TABLE_SIZE];
+ uint8_t no_vlan_member = 0;
+ uint16_t vlan_valid = 0;
+ int i, j;
- memset(add_tag, 0, sizeof(add_tag));
- memset(remove_tag, 0, sizeof(remove_tag));
- memset(vlan_member, 0, sizeof(vlan_member));
+ memset (add_tag, 0, sizeof (add_tag));
+ memset (remove_tag, 0, sizeof (remove_tag));
+ memset (vlan_member, 0, sizeof (vlan_member));
+ memset (vlan_misc, 0, sizeof (vlan_misc));
- switch(priv->model)
+ switch (priv->model)
{
- case ICPLUS_MODEL_IP175D:
- {
- int i, j;
+ case ICPLUS_MODEL_IP175D:
+ /* Entry from 0 to 4 are reserved for port-based or tag-based. */
+ for (i = 0; i < MAX_VLAN_SUPPORTED; i++)
+ {
+ /* Write VLAN_INFO_x ( PVID ). */
+ phydev->bus->write (phydev->bus,
+ IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_INFO_REG_NUM (i),
+ (ecmd->vlan_table[i].vlan & 0xFFF));
+
+ /* Write the VLAN_ID_x. */
+ phydev->bus->write (phydev->bus,
+ IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_ID_REG_NUM (i),
+ (ecmd->vlan_table[i].vlan & 0xFFF));
+
+ if (ecmd->vlan_table[i].state == VLAN_ON)
+ /* Tag-based mode. */
+ SETBIT (vlan_valid, i);
+ else
+ /* Port-based mode. */
+ CLEARBIT (vlan_valid, i);
+ }
- // entry from 0 to 4 are reserved for port-based or tag-based.
- for (i=0; i < MAX_VLAN_SUPPORTED; i++)
+ /* Entry 5, is connected to spc300. special entry. */
+ SETBIT (vlan_valid, IP175D_VLAN_TABLE_CPU_ENTRY);
+ SETBIT (no_vlan_member, IP175D_VLAN_TABLE_CPU_ENTRY);
+ /* Write VLAN_INFO_5 ( PVID ). */
+ phydev->bus->write (
+ phydev->bus, IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_INFO_REG_NUM (IP175D_VLAN_TABLE_CPU_ENTRY), 0);
+
+ /*****************
+ The entry 6, is used for ports without VLAN.
+ It's the unique line activated with VID egal at 0.
+ Packets which come from CPU will use this entry.
+ *****************/
+ SETBIT (vlan_valid, IP175D_VLAN_TABLE_NO_TAG_LINE);
+ SETBIT (no_vlan_member, IP175D_VLAN_TABLE_NO_TAG_LINE);
+ phydev->bus->write (
+ phydev->bus, IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_ID_REG_NUM (IP175D_VLAN_TABLE_NO_TAG_LINE), 0);
+
+ /* VID = PVID_5. */
+ /* Write the VLAN_Mode for all ports
+ * VID and port are not dynamic ! PVID used so. */
+ phydev->bus->write (phydev->bus,
+ IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_CLS_REG_NUM,
+ UNVID_MODE_FLOOD_PACKET
+ | PVID_USED_INSTEAD_VID
+ | (vlan_valid & 0x3F));
+
+ /* Activate Vlan on Vlan from client to master (upload)
+ * To avoid a pirate guy to send packets to a server behind
+ * the master. */
+ phydev->bus->write (phydev->bus,
+ IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_EGRESS_RULE_REG_NUM,
+ VLAN_ON_VLAN_FOR_UPLOAD);
+
+ /* Enable entries in the VLAN Table. */
+ phydev->bus->write (phydev->bus,
+ IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_VALID_REG_NUM,
+ vlan_valid);
+
+ /* Enable Vlan prio rewriting on upload (0x1F). */
+ phydev->bus->write (phydev->bus,
+ IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_REW_VLAN_PRIO_REG_NUM,
+ ((1 << MAX_VLAN_SUPPORTED) - 1));
+
+ for (i = 0; i < MAX_VLAN_SUPPORTED; i++)
+ {
+ if (ecmd->vlan_table[i].state == VLAN_ON)
+ {
+ /* Add tag from outside to spc300. */
+ SETBIT (add_tag[i], IP175D_VLAN_TABLE_CPU_ENTRY);
+ /* Remove tag from spc300 to outside and from other port
+ * also. */
+ remove_tag[i] = 0x1F;
+ SETBIT (vlan_member[i], IP175D_VLAN_TABLE_CPU_ENTRY);
+ SETBIT (vlan_member[i], i);
+
+ for (j = i + 1; j < MAX_VLAN_SUPPORTED; j++)
{
- // Write VLAN_INFO_x ( PVID )
- phydev->bus->write( phydev->bus,
- IP175D_VLAN_INFO_REG_PHY,
- IP175D_VLAN_INFO_REG_NUM(i),
- (ecmd->vlan_table[i].vlan & 0xFFF));
- TRACE("IP175D_VLAN_INFO_REG w%d:%d=%x\n", IP175D_VLAN_INFO_REG_PHY, IP175D_VLAN_INFO_REG_NUM(i), (ecmd->vlan_table[i].vlan & 0xFFF));
-
- // Write the VID_x
- phydev->bus->write( phydev->bus,
- IP175D_VLAN_ID_REG_PHY,
- IP175D_VLAN_ID_REG_NUM(i),
- (ecmd->vlan_table[i].vlan & 0xFFF));
- TRACE("IP175D_VLAN_ID_REG w%d:%d=%x\n", IP175D_VLAN_ID_REG_PHY, IP175D_VLAN_ID_REG_NUM(i), (ecmd->vlan_table[i].vlan & 0xFFF));
-
- if (ecmd->vlan_table[i].state == VLAN_ON)
- SETBIT(priv->vlan_valid,i);
- else
- CLEARBIT(priv->vlan_valid,i);
- }
+ unsigned int vid1 = ecmd->vlan_table[i].vlan & 0xFFF;
+ unsigned int vid2 = ecmd->vlan_table[j].vlan & 0xFFF;
- // entry 5, is connected to spc300. special entry. always in tag mode.
- SETBIT(priv->vlan_valid,IP175D_VLAN_TABLE_COMMON_PHY);
- vlan_member[IP175D_VLAN_TABLE_COMMON_PHY] = 0x3F; // Maybe this line is not usefull.
- phydev->bus->write(phydev->bus,
- IP175D_VLAN_INFO_REG_PHY,
- IP175D_VLAN_INFO_REG_NUM(IP175D_VLAN_TABLE_COMMON_PHY),
- 0); // PVID_5 = 0
-
- // entry 6.
- SETBIT(priv->vlan_valid,IP175D_VLAN_TABLE_NO_TAG_LINE);
- SETBIT(vlan_member[IP175D_VLAN_TABLE_NO_TAG_LINE],IP175D_VLAN_TABLE_COMMON_PHY);
- phydev->bus->write(phydev->bus,
- IP175D_VLAN_ID_REG_PHY,
- IP175D_VLAN_ID_REG_NUM(IP175D_VLAN_TABLE_NO_TAG_LINE),
- 0); // Write the PVID_6 (= PVID_5)
-
- for (i=0; i < MAX_VLAN_SUPPORTED; i++)
- {
- if (ecmd->vlan_table[i].state == VLAN_ON)
+ /* The same VID can forward the packet between them. */
+ if ((vid1 == vid2)
+ && (ecmd->vlan_table[j].state == VLAN_ON))
{
- SETBIT(add_tag[i],IP175D_VLAN_TABLE_COMMON_PHY); // Add tag from outside to spc300.
- remove_tag[i] = 0x1F; // Remove tag from spc300 to outside and from other port also.
- SETBIT(vlan_member[i],IP175D_VLAN_TABLE_COMMON_PHY);
- SETBIT(vlan_member[i],i);
-
- for (j=i+1; j < MAX_VLAN_SUPPORTED; j++)
- {
- // The same VID can forward the packet between them.
- if ((ecmd->vlan_table[i].vlan == ecmd->vlan_table[j].vlan) &&
- (ecmd->vlan_table[j].state == VLAN_ON)
- )
- {
- SETBIT(vlan_member[i],j);
- SETBIT(vlan_member[j],i);
- }
- }
- }
- else
- {
- // The no-VID can forward the packet between them.
- SETBIT(vlan_member[IP175D_VLAN_TABLE_NO_TAG_LINE], i);
+ SETBIT (vlan_member[i], j);
+ SETBIT (vlan_member[j], i);
}
}
- for (i=0; i < MAX_VLAN_SUPPORTED; i++)
+ /* 3 bits of VPRIO, and only that. */
+ vlan_misc[i] = (((ecmd->vlan_table[i].vlan >> 13) & 0x7)
+ << IP175D_REW_VLAN_PRIO);
+ }
+ else
+ {
+ /* The no-VID can forward the packet between them. */
+ SETBIT (no_vlan_member, i);
+ }
+ }
+
+ for (i = 0; i < MAX_VLAN_SUPPORTED; i++)
+ {
+ if (ecmd->vlan_table[i].state == VLAN_OFF)
+ {
+ /* The no-VID have the same forward rules. */
+ vlan_member[i] = no_vlan_member;
+ }
+ }
+
+ /* CPU is linked with all ports. */
+ vlan_member[IP175D_VLAN_TABLE_CPU_ENTRY] = 0x3F;
+
+ /* The no-VID have the same forward rules. */
+ vlan_member[IP175D_VLAN_TABLE_NO_TAG_LINE] = no_vlan_member;
+
+ for (i = 0; i < IP175D_VLAN_TABLE_SIZE; i += 2)
+ {
+ uint16_t reg;
+
+ reg = ((vlan_member[i+1] << 8) & 0xFF00)
+ + (vlan_member[i+0] & 0x00FF);
+ phydev->bus->write (phydev->bus,
+ IP175D_VLAN_MEMBER_REG_PHY,
+ IP175D_VLAN_MEMBER_REG_NUM (i),
+ reg);
+
+ reg = ((add_tag[i+1] << 8) & 0xFF00)
+ + (add_tag[i+0] & 0x00FF);
+ phydev->bus->write (phydev->bus,
+ IP175D_VLAN_MEMBER_REG_PHY,
+ IP175D_ADD_TAG_REG_NUM (i),
+ reg);
+
+ reg = ((remove_tag[i+1] << 8) & 0xFF00)
+ + (remove_tag[i+0] & 0x00FF);
+ phydev->bus->write (phydev->bus,
+ IP175D_VLAN_MEMBER_REG_PHY,
+ IP175D_REMOVE_TAG_REG_NUM (i),
+ reg);
+
+ reg = ((vlan_misc[i+1] << 8) & 0xFF00)
+ + (vlan_misc[i+0] & 0x00FF);
+ phydev->bus->write (phydev->bus,
+ IP175D_VLAN_MEMBER_REG_PHY,
+ IP175D_VLAN_MISC_REG_NUM (i),
+ reg);
+ }
+ break;
+
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+ }
+ return 0;
+}
+
+int
+ip175x_read_port_phy (struct phy_device *phydev,
+ struct ethtool_phyparam *ecmd)
+{
+ struct ip175x_priv *priv = phydev->priv;
+ u16 reg;
+ int port;
+
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ for (port = 0; port < MAX_PORT_NUM; port++)
+ {
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_PORT_PHY_REG_PHY (port),
+ IP175D_PHY_CONTROL_REG_NUM);
+
+ ecmd->port[port].aneg = GETBIT (reg, IP175D_AUTO_NEGOTIATION_BIT);
+ ecmd->port[port].speed = GETBIT (reg, IP175D_SPEED_MODE_BIT);
+ ecmd->port[port].duplex = GETBIT (reg, IP175D_DUPLEX_MODE_BIT);
+ }
+ break;
+
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+
+ }
+
+ return 0;
+}
+
+int
+ip175x_write_port_phy (struct phy_device *phydev,
+ struct ethtool_phyparam *ecmd)
+{
+ struct ip175x_priv *priv = phydev->priv;
+ u16 reg;
+ int port;
+
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ for (port = 0; port < MAX_PORT_NUM; port++)
+ {
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_PORT_PHY_REG_PHY (port),
+ IP175D_PHY_CONTROL_REG_NUM);
+
+ if (0 == ecmd->port[port].aneg)
+ CLEARBIT (reg, IP175D_AUTO_NEGOTIATION_BIT);
+ else
+ {
+ SETBIT (reg, IP175D_AUTO_NEGOTIATION_BIT);
+ SETBIT (reg, IP175D_AUTO_NEGOTIATION_RESTART_BIT);
+ }
+
+ if (0 == ecmd->port[port].speed)
+ CLEARBIT (reg, IP175D_SPEED_MODE_BIT);
+ else
+ SETBIT (reg, IP175D_SPEED_MODE_BIT);
+
+ if (0 == ecmd->port[port].duplex)
+ CLEARBIT (reg, IP175D_DUPLEX_MODE_BIT);
+ else
+ SETBIT (reg, IP175D_DUPLEX_MODE_BIT);
+
+ phydev->bus->write (phydev->bus,
+ IP175D_PORT_PHY_REG_PHY (port),
+ IP175D_PHY_CONTROL_REG_NUM,
+ reg);
+ }
+ break;
+
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+
+ }
+
+ return 0;
+}
+
+int
+ip175x_read_port_stm (struct phy_device *phydev,
+ struct ethtool_stmparam *ecmd)
+{
+ struct ip175x_priv *priv = phydev->priv;
+ int port;
+ u16 reg;
+ u16 val;
+ u16 tmp;
+
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_STM_EN_REG_NUM);
+
+ /* Get storm protection state per port. */
+ for (port = 0; port < MAX_PORT_NUM; port++)
+ {
+ ecmd->port[port].bcast_state =
+ GETBIT (reg, IP175D_BF_STM_EN (port));
+
+ /* Datasheet : IP175D, around page 84.
+ *
+ * Multicast broadcast storm protection disable.
+ * 1 : "Broadcast storm protection" does not include multicast
+ * packets. IP175D drops the packets with DA equals to
+ * 0xFFFFFFFF only when the broadcast threshold is reached.
+ *
+ * 0 : "Broadcast storm protection" include multicast packets.
+ * */
+ ecmd->port[port].mcast_state =
+ GETBIT (reg, IP175D_BF_FFFF_DIS (port));
+ ecmd->port[port].mcast_state = ((~ecmd->port[port].mcast_state)
+ & 0x1);
+ }
+
+ /* Get threshold storm protection per port. */
+ for (port = 0; port < MAX_PORT_NUM; port += 2)
+ {
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_STM_THR_REG_NUM (port));
+ /* Datasheet : IP175D, around page 87.
+ *
+ * Threshold setting range is from 1 to 255 packets/10ms for
+ * 100Mbps connection or 1 to 255 packets/100ms for 10Mbps
+ * connection.
+ *
+ * Notice: here converted unit to packet / s for 100Mbps
+ * just now.
+ * */
+
+ /* Speed Selection
+ * 1 = 100Mbps
+ * 0 = 10Mbps
+ * */
+ val = phydev->bus->read (phydev->bus,
+ IP175D_PORT_PHY_REG_PHY (port),
+ IP175D_PHY_CONTROL_REG_NUM);
+ if (0 == GETBIT (val, IP175D_SPEED_MODE_BIT))
+ tmp = SPEED_10M;
+ else
+ tmp = SPEED_100M;
+ ecmd->port[port].thrshold = THRESHOLD_MSTOS ((reg & 0xff), tmp);
+ if ((port + 1) < MAX_PORT_NUM)
+ {
+ val = phydev->bus->read (phydev->bus,
+ IP175D_PORT_PHY_REG_PHY (port + 1),
+ IP175D_PHY_CONTROL_REG_NUM);
+ if (0 == GETBIT (val, IP175D_SPEED_MODE_BIT))
+ tmp = SPEED_10M;
+ else
+ tmp = SPEED_100M;
+ ecmd->port[port + 1].thrshold =
+ THRESHOLD_MSTOS ((reg >> 8), tmp);
+ }
+ }
+ break;
+
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+ }
+
+ return 0;
+}
+
+int
+ip175x_write_port_stm (struct phy_device *phydev,
+ struct ethtool_stmparam *ecmd)
+{
+ struct ip175x_priv *priv = phydev->priv;
+ int port;
+ u16 reg;
+ u16 val;
+ u16 tmp;
+ u16 temp;
+
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ /* Set storm protection state per port. */
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_STM_EN_REG_NUM);
+
+ for (port = 0; port < MAX_PORT_NUM; port++)
+ {
+ if (0 == ecmd->port[port].bcast_state)
+ CLEARBIT (reg, IP175D_BF_STM_EN (port));
+ else
+ SETBIT (reg, IP175D_BF_STM_EN (port));
+
+ if (0 == ecmd->port[port].mcast_state)
+ SETBIT (reg, IP175D_BF_FFFF_DIS (port));
+ else
+ CLEARBIT (reg, IP175D_BF_FFFF_DIS (port));
+ }
+
+ phydev->bus->write (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_STM_EN_REG_NUM,
+ reg);
+
+ /* Set threshold storm protection per port. */
+ for (port = 0; port < MAX_PORT_NUM; port += 2)
+ {
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_STM_THR_REG_NUM (port));
+
+
+ if ((port + 1) < MAX_PORT_NUM)
+ {
+ val = phydev->bus->read (phydev->bus,
+ IP175D_PORT_PHY_REG_PHY (port),
+ IP175D_PHY_CONTROL_REG_NUM);
+ if (0 == GETBIT (val, IP175D_SPEED_MODE_BIT))
+ tmp = SPEED_10M;
+ else
+ tmp = SPEED_100M;
+ val = phydev->bus->read (phydev->bus,
+ IP175D_PORT_PHY_REG_PHY (port + 1),
+ IP175D_PHY_CONTROL_REG_NUM);
+ if (0 == GETBIT (val, IP175D_SPEED_MODE_BIT))
+ temp = SPEED_10M;
+ else
+ temp = SPEED_100M;
+ reg = ((THRESHOLD_STOMS (ecmd->port[port].thrshold, tmp) & 0x00FF)
+ | (THRESHOLD_STOMS (ecmd->port[port + 1].thrshold, temp) << 8));
+ }
+ else
+ {
+ val = phydev->bus->read (phydev->bus,
+ IP175D_PORT_PHY_REG_PHY (port),
+ IP175D_PHY_CONTROL_REG_NUM);
+ if (0 == GETBIT (val, IP175D_SPEED_MODE_BIT))
+ tmp = SPEED_10M;
+ else
+ tmp = SPEED_100M;
+ reg = ((THRESHOLD_STOMS (ecmd->port[port].thrshold, tmp) & 0x00FF)
+ | (reg & 0xFF00));
+ }
+
+ phydev->bus->write (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_STM_THR_REG_NUM (port),
+ reg);
+ }
+ break;
+
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+
+ }
+
+ return 0;
+}
+
+int
+ip175x_read_port_qosrate (struct phy_device *phydev,
+ struct ethtool_qosrateparam *ecmd)
+{
+ struct ip175x_priv *priv = phydev->priv;
+ u16 reg_map;
+ u16 reg_rate;
+ int port;
+ u8 qos;
+ u8 prio;
+
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ reg_map = phydev->bus->read (phydev->bus,
+ IP175D_QOS_REG_PHY,
+ IP175D_PRIO_MAP_REG_NUM);
+
+ for (port = 0; port < MAX_PORT_NUM; port++)
+ {
+ prio = GET2BITS (reg_map, port);
+ switch (prio)
+ {
+ case IP175D_PACKETS_ASSIGNED_TO_QUEUE_0:
+ qos = ETHTOOL_QOS_0;
+ break;
+
+ case IP175D_PACKETS_ASSIGNED_TO_QUEUE_1:
+ qos = ETHTOOL_QOS_2;
+ break;
+
+ case IP175D_PACKETS_ASSIGNED_TO_QUEUE_2:
+ qos = ETHTOOL_QOS_4;
+ break;
+
+ default:
+ case IP175D_PACKETS_ASSIGNED_TO_QUEUE_3:
+ qos = ETHTOOL_QOS_6;
+ break;
+ }
+ ecmd->port[port].qos = qos;
+
+ phydev->bus->write (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_PORT_IOE_REG_NUM,
+ (IP175D_BW_RATE_SETTING_PORT (port)
+ | IP175D_BW_RATE_SETTING_EGRESS
+ | IP175D_BW_RATE_SETTING_READ
+ | IP175D_BW_RATE_SETTING_START));
+
+ reg_rate = phydev->bus->read (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_CREDIT_REG_NUM);
+
+ ecmd->port[port].txrate = reg_rate;
+
+ phydev->bus->write (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_PORT_IOE_REG_NUM,
+ (IP175D_BW_RATE_SETTING_PORT (port)
+ | IP175D_BW_RATE_SETTING_INGRESS
+ | IP175D_BW_RATE_SETTING_READ
+ | IP175D_BW_RATE_SETTING_START));
+
+ reg_rate = phydev->bus->read (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_CREDIT_REG_NUM);
+
+ ecmd->port[port].rxrate = reg_rate;
+ }
+ break;
+
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+
+ }
+
+ return 0;
+}
+
+int
+ip175x_write_port_qosrate (struct phy_device *phydev,
+ struct ethtool_qosrateparam *ecmd)
+{
+ struct ip175x_priv *priv = phydev->priv;
+ u16 reg_map = 0;
+ int port;
+ u8 qos;
+ u16 txrate;
+ u16 rxrate;
+ int left_shift;
+
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ for (port = 0; port < MAX_PORT_NUM; port++)
+ {
+ qos = ecmd->port[port].qos;
+ txrate = ecmd->port[port].txrate;
+ rxrate = ecmd->port[port].rxrate;
+
+ left_shift = port * 2;
+ switch (qos)
+ {
+ case ETHTOOL_QOS_0:
+ case ETHTOOL_QOS_1:
+ /* IP175D_PACKETS_ASSIGNED_TO_QUEUE_0 set on the port.
+ * No bit to set. */
+ break;
+
+ case ETHTOOL_QOS_2:
+ case ETHTOOL_QOS_3:
+ /* IP175D_PACKETS_ASSIGNED_TO_QUEUE_1 set on the port. */
+ SETBIT (reg_map, left_shift);
+ break;
+
+ case ETHTOOL_QOS_4:
+ case ETHTOOL_QOS_5:
+ /* IP175D_PACKETS_ASSIGNED_TO_QUEUE_2 set on the port. */
+ SETBIT (reg_map, left_shift + 1);
+ break;
+
+ case ETHTOOL_QOS_6:
+ case ETHTOOL_QOS_7:
+ /* IP175D_PACKETS_ASSIGNED_TO_QUEUE_3 set on the port. */
+ SETBIT (reg_map, left_shift);
+ SETBIT (reg_map, left_shift + 1);
+ break;
+ }
+
+ phydev->bus->write (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_TI_REG_NUM,
+ IP175D_BW_TI_DEFAULT_VAL);
+ phydev->bus->write (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_MBS_REG_NUM,
+ IP175D_BW_MBS_VAL (txrate));
+ phydev->bus->write (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_CREDIT_REG_NUM,
+ txrate);
+ phydev->bus->write (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_PORT_IOE_REG_NUM,
+ (IP175D_BW_RATE_SETTING_PORT (port)
+ | IP175D_BW_RATE_SETTING_EGRESS
+ | IP175D_BW_RATE_SETTING_WRITE
+ | IP175D_BW_RATE_SETTING_START));
+ phydev->bus->write (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_TI_REG_NUM,
+ IP175D_BW_TI_DEFAULT_VAL);
+ phydev->bus->write (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_MBS_REG_NUM,
+ IP175D_BW_MBS_VAL (rxrate));
+ phydev->bus->write (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_CREDIT_REG_NUM,
+ rxrate);
+ phydev->bus->write (phydev->bus,
+ IP175D_RATE_REG_PHY,
+ IP175D_BW_PORT_IOE_REG_NUM,
+ (IP175D_BW_RATE_SETTING_PORT (port)
+ | IP175D_BW_RATE_SETTING_INGRESS
+ | IP175D_BW_RATE_SETTING_WRITE
+ | IP175D_BW_RATE_SETTING_START));
+ }
+ phydev->bus->write (phydev->bus,
+ IP175D_QOS_REG_PHY,
+ IP175D_PRIO_MAP_REG_NUM,
+ reg_map);
+ break;
+
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+
+ }
+
+ return 0;
+}
+
+int
+ip175x_read_port_mirror (struct phy_device *phydev,
+ struct ethtool_mirror *ecmd)
+{
+ struct ip175x_priv *priv = phydev->priv;
+ u16 reg;
+ u8 port;
+ u8 i;
+
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_MIRROR_EN_MODE_REG_NUM);
+
+ ecmd->state = GETBIT (reg, IP175D_MIRROR_EN_OFFSET);
+
+ switch (GETBITS (reg, IP175D_MIRROR_MODE_OFFSET, 2))
+ {
+ case IP175D_MIRROR_MODE_RX:
+ ecmd->type = ETHTOOL_MIRROR_MODE_RX;
+ break;
+ case IP175D_MIRROR_MODE_TX:
+ ecmd->type = ETHTOOL_MIRROR_MODE_TX;
+ break;
+ case IP175D_MIRROR_MODE_DIFF_RXTX:
+ case IP175D_MIRROR_MODE_SAME_RXTX:
+ ecmd->type = ETHTOOL_MIRROR_MODE_RXTX;
+ break;
+ default:
+ ecmd->type = ETHTOOL_MIRROR_MODE_NB;
+ }
+
+ port = GETBITS (reg, IP175D_MIRRORED_RX_PORT_OFFSET, 6);
+ ecmd->rport = ETHTOOL_MIRROR_PORT_NONE;
+ for (i = 0 ; i <= MAX_PORT_NUM; i++)
+ {
+ if (port & ( 1 << i ))
+ {
+ if (ecmd->rport == ETHTOOL_MIRROR_PORT_NONE)
+ ecmd->rport = i;
+ else
{
- if (ecmd->vlan_table[i].state == VLAN_OFF)
- {
- // The no-VID have the same forward rules.
- vlan_member[i] = vlan_member[IP175D_VLAN_TABLE_NO_TAG_LINE];
- }
+ ecmd->rport = ETHTOOL_MIRROR_PORT_MANY;
+ break;
}
+ }
+ }
- for (i=0; i < IP175D_VLAN_TABLE_SIZE; i+=2)
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_MIRROR_PORT_REG_NUM);
+
+ port = GETBITS(reg, IP175D_MIRRORED_TX_PORT_OFFSET, 6);
+ ecmd->tport = ETHTOOL_MIRROR_PORT_NONE;
+ for (i = 0 ; i <= MAX_PORT_NUM; i++)
+ {
+ if (port & ( 1 << i ))
+ {
+ if (ecmd->tport == ETHTOOL_MIRROR_PORT_NONE)
+ ecmd->tport = i;
+ else
{
- uint16_t reg;
-
- reg = ((vlan_member[i+1] << 8) & 0xFF00) + (vlan_member[i+0] & 0x00FF);
- phydev->bus->write( phydev->bus,
- IP175D_VLAN_MEMBER_REG_PHY,
- IP175D_VLAN_MEMBER_REG_NUM(i),
- reg); // VLAN_MEMBER
-
- reg = ((add_tag[i+1] << 8) & 0xFF00) + (add_tag[i+0] & 0x00FF);
- phydev->bus->write( phydev->bus,
- IP175D_ADD_TAG_REG_PHY,
- IP175D_ADD_TAG_REG_NUM(i),
- reg); // ADD_TAG
-
- reg = ((remove_tag[i+1] << 8) & 0xFF00) + (remove_tag[i+0] & 0x00FF);
- phydev->bus->write( phydev->bus,
- IP175D_REMOVE_TAG_REG_PHY,
- IP175D_REMOVE_TAG_REG_NUM(i),
- reg); // REMOVE_TAG
+ ecmd->tport = ETHTOOL_MIRROR_PORT_MANY;
+ break;
}
+ }
+ }
+ ecmd->dport = GETBITS (reg, IP175D_MIRROR_PORT_OFFSET, 3);
- // Global register
- phydev->bus->write(phydev->bus,
- IP175D_VLAN_CLS_REG_PHY,
- IP175D_VLAN_CLS_REG_NUM,
- UNVID_MODE_FORWARD_TO_CPU | (priv->vlan_valid & 0x3F)); // Write the VLAN_Mode (TAGGED BASED)
+ break;
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+ }
+ return 0;
+}
- phydev->bus->write(phydev->bus,
- IP175D_VLAN_VALID_REG_PHY,
- IP175D_VLAN_VALID_REG_NUM,
- priv->vlan_valid); // Write the VLAN_VALID
- }
- break;
+int
+ip175x_write_port_mirror (struct phy_device *phydev,
+ struct ethtool_mirror *ecmd)
+{
+ struct ip175x_priv *priv = phydev->priv;
+ u16 reg;
+ u16 val;
+
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ reg = 0;
+ if (ecmd->type > ETHTOOL_MIRROR_MODE_NB
+ || ecmd->state > ETHTOOL_MIRROR_STATE_NB
+ || ecmd->rport > ETHTOOL_MIRROR_PORT_MANY
+ || ecmd->tport > ETHTOOL_MIRROR_PORT_MANY
+ || ecmd->dport > MAX_PORT_NUM)
+ return EINVAL;
+
+ if (ecmd->state == ETHTOOL_MIRROR_STATE_ON)
+ SETBIT (reg, IP175D_MIRROR_EN_OFFSET);
+
+ if (ecmd->type != ETHTOOL_MIRROR_MODE_RXTX)
+ reg = SETBITS (reg, IP175D_MIRROR_MODE_OFFSET, 2, ecmd->type);
+ else
+ {
+ if (ecmd->rport == ecmd->tport)
+ reg = SETBITS (reg, IP175D_MIRROR_MODE_OFFSET,
+ 2, IP175D_MIRROR_MODE_SAME_RXTX);
+ else
+ reg = SETBITS (reg, IP175D_MIRROR_MODE_OFFSET,
+ 2, IP175D_MIRROR_MODE_DIFF_RXTX);
+ }
+
+ if (ecmd->rport < ETHTOOL_MIRROR_PORT_NONE)
+ {
+ val = (1 << ecmd->rport);
+ reg = SETBITS (reg, IP175D_MIRRORED_RX_PORT_OFFSET, 6, val);
+ }
+ phydev->bus->write (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_MIRROR_EN_MODE_REG_NUM,
+ reg);
+
+ reg = 0;
+ reg = SETBITS (reg, IP175D_MIRROR_PORT_OFFSET, 3, ecmd->dport);
+ if (ecmd->tport < ETHTOOL_MIRROR_PORT_NONE)
+ {
+ val = (1 << ecmd->tport);
+ reg = SETBITS (reg, IP175D_MIRRORED_TX_PORT_OFFSET, 6, val);
+ }
+ phydev->bus->write (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_MIRROR_PORT_REG_NUM,
+ reg);
+ break;
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
- default :
- // Feature not supported
- return -EOPNOTSUPP;
}
+
return 0;
}
+int
+ip175x_read_fat (struct phy_device *phydev,
+ struct ethtool_fat *ecmd)
+{
+ struct ip175x_priv *priv = phydev->priv;
+ u16 reg;
+
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_8023X_FLOW_REG_NUM);
+
+ ecmd->flow = GETBIT (reg, IP175D_8023X_FLOW_EN_OFFSET);
+
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_AGETIME_VAL_REG_NUM);
+ ecmd->atime = GETBITS (reg, IP175D_AGETIME_VAL_OFFSET, 5);
+ switch (GETBITS (reg, IP175D_AGETIME_UNIT_OFFSET, 2))
+ {
+ case IP175D_AGE_TIME_M:
+ ecmd->atime = TIME_M_TO_S (ecmd->atime);
+ break;
+ case IP175D_AGE_TIME_S:
+ break;
+ case IP175D_AGE_TIME_MS:
+ ecmd->atime = TIME_10MS_TO_S (ecmd->atime);
+ break;
+ case IP175D_AGE_TIME_FAST:
+ ecmd->atime = 0;
+ break;
+ }
+ break;
+
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+
+ }
+
+ return 0;
+}
-static int ip175x_get_model(struct phy_device *phydev)
+int
+ip175x_write_fat (struct phy_device *phydev,
+ struct ethtool_fat *ecmd)
{
- struct ip175x_priv *priv;
- priv = (struct ip175x_priv *)phydev->priv;
+ struct ip175x_priv *priv = phydev->priv;
+ u16 reg;
+ u16 val;
- if (!phydev)
- {
- printk (KERN_ERR "%s: no PHY found\n", DRV_NAME);
- return -EINVAL;
- }
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_8023X_FLOW_REG_NUM);
+
+ if (ecmd->flow == ETHTOOL_FLOW_STATE_ON)
+ SETBIT (reg, IP175D_8023X_FLOW_EN_OFFSET);
+ else
+ CLEARBIT (reg, IP175D_8023X_FLOW_EN_OFFSET);
- if(0x175D == phydev->bus->read(phydev->bus, 20, 0))
+ phydev->bus->write (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_8023X_FLOW_REG_NUM,
+ reg);
+
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_AGETIME_VAL_REG_NUM);
+
+ if (ecmd->atime <= IP175D_AGETIME_VAL_MAX)
{
- priv->model = ICPLUS_MODEL_IP175D;
- TRACE("PHY model is IC+ IP175D \n");
+ reg = SETBITS (reg, IP175D_AGETIME_UNIT_OFFSET, 2, IP175D_AGE_TIME_S);
+ reg = SETBITS (reg, IP175D_AGETIME_VAL_OFFSET, 5, ecmd->atime);
}
- else
+ else if (ecmd->atime <= IP175D_AGETIME_MAX)
{
- priv->model = ICPLUS_MODEL_IP175C;
- TRACE("PHY model is IC+ ip175C \n");
+ val = TIME_S_TO_M (ecmd->atime);
+ reg = SETBITS (reg, IP175D_AGETIME_UNIT_OFFSET, 2, IP175D_AGE_TIME_M);
+ reg = SETBITS (reg, IP175D_AGETIME_VAL_OFFSET, 5, val);
}
- return 0;
+ else
+ return EINVAL;
+
+ phydev->bus->write (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_AGETIME_VAL_REG_NUM,
+ reg);
+ break;
+
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+
+ }
+
+ return 0;
}
-static int ip175x_probe(struct phy_device *phydev)
+int
+ip175x_read_igmp (struct phy_device *phydev,
+ struct ethtool_igmp *ecmd)
{
- struct ip175x_priv *priv;
- int err;
+ struct ip175x_priv *priv = phydev->priv;
+ u16 reg;
- priv = kzalloc(sizeof(*priv), GFP_KERNEL);
- if (!priv)
- return -ENOMEM;
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_TRAP_IGMP_REG_NUM);
+
+ ecmd->tigmp = GETBITS (reg, IP175D_TRAP_IGMP_OFFSET, 2);
+ break;
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+ }
+ return 0;
+}
+
+int
+ip175x_write_igmp (struct phy_device *phydev,
+ struct ethtool_igmp *ecmd)
+{
+ struct ip175x_priv *priv = phydev->priv;
+ u16 reg;
- phydev->priv = priv;
- priv->phydev = phydev;
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175D:
+ if (ecmd->tigmp >= ETHTOOL_IGMP_RESERVE)
+ return EINVAL;
+
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_TRAP_IGMP_REG_NUM);
+ reg = SETBITS (reg, IP175D_TRAP_IGMP_OFFSET, 2, ecmd->tigmp);
+
+ phydev->bus->write (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_TRAP_IGMP_REG_NUM,
+ reg);
+ break;
+ default :
+ /* Feature not supported. */
+ return -EOPNOTSUPP;
+ }
+ return 0;
+}
- err = ip175x_get_model(phydev);
- if (err < 0)
- goto error;
+static int
+ip175x_get_model (struct phy_device *phydev)
+{
+ struct ip175x_priv *priv;
+ priv = (struct ip175x_priv *)phydev->priv;
- return 0;
+ if (!phydev)
+ {
+ printk (KERN_ERR "%s: no PHY found\n", DRV_NAME);
+ return -EINVAL;
+ }
-error:
- kfree(priv);
- return err;
+ if (0x175D == phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY, 0))
+ {
+ priv->model = ICPLUS_MODEL_IP175D;
+ }
+ else
+ {
+ priv->model = ICPLUS_MODEL_IP175C;
+ }
+ return 0;
}
+static int
+ip175x_probe (struct phy_device *phydev)
+{
+ struct ip175x_priv *priv;
+ int err;
+
+ priv = kzalloc (sizeof (*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+ phydev->priv = priv;
+ priv->phydev = phydev;
+
+ err = ip175x_get_model (phydev);
+ if (err < 0)
+ goto error;
+
+ return 0;
-static int ip175x_config_init(struct phy_device *phydev)
+error:
+ kfree (priv);
+ return err;
+}
+
+static int
+ip175x_config_init (struct phy_device *phydev)
{
- int err, i;
- struct ip175x_priv *priv;
- static int full_reset_performed = 0;
-
- priv = (struct ip175x_priv *)phydev->priv;
-
- printk("ICPlus ip175x : Driver Initialization - PHY addr = %d\n", phydev->addr);
-
- if (full_reset_performed == 0) {
-
- if (priv->model == ICPLUS_MODEL_IP175C){
- /* master reset */
- err = phydev->bus->write(phydev->bus, 30, 0, IP175C_RESET_VAL);
- if (err < 0)
- return err;
-
- /* ensure no bus delays overlap reset period */
- err = phydev->bus->read(phydev->bus, 30, 0);
- if (err < 0)
- return err;
-
- /* data sheet specifies reset period is 2 msec */
- mdelay(2);
-
- /* enable ip175x mode */
- err = phydev->bus->write(phydev->bus, 29, 31, IP175C_RESET_VAL);
- if (err < 0)
- return err;
-
- /* Set MII0 speed and duplex (in PHY mode) */
- err = phydev->bus->write(phydev->bus, 29, 22, 0x420);
- if (err < 0)
- return err;
- }
- else if (priv->model == ICPLUS_MODEL_IP175D)
- {
- // Reset the Switch
- err = phydev->bus->write(phydev->bus,
- IP175D_SOFT_RESET_REG_PHY,
- IP175D_SOFT_RESET_REG_NUM,
- IP175D_RESET_VAL);
- if (err < 0)
- return err;
- mdelay(2);
-
- // Reset Vlan Table. PHY22 MII0, MSB.
- err = phydev->bus->write(phydev->bus, IP175D_VLAN_CLS_REG_PHY,
- IP175D_VLAN_CLS_REG_NUM,
- VLAN_TABLE_CLR);
- if (err < 0)
- return err;
-
- // SET TPID Vlan. Ox8100.
- err = phydev->bus->write(phydev->bus,
- IP175D_VLAN_TPID_VAL_REG_PHY,
- IP175D_VLAN_TPID_VAL_REG_NUM,
- 0x8100);
- if (err < 0)
- return err;
- }
-
- /* reset switch ports */
- for (i = 0; i < 5; i++) {
- err = phydev->bus->write(phydev->bus, i, MII_BMCR, BMCR_RESET);
- if (err < 0)
- return err;
- }
-
- for (i = 0; i < 5; i++)
- err = phydev->bus->read(phydev->bus, i, MII_BMCR);
-
- mdelay(2);
-
- full_reset_performed = 1;
- }
-
- if (phydev->addr != 4) {
- phydev->state = PHY_RUNNING;
- phydev->speed = SPEED_100;
- phydev->duplex = DUPLEX_FULL;
- phydev->link = 1;
- netif_carrier_on(phydev->attached_dev);
- }
-
- return 0;
+ int err, i;
+ struct ip175x_priv *priv;
+ static int full_reset_performed = 0;
+ u16 reg = 0;
+
+ priv = (struct ip175x_priv *)phydev->priv;
+
+ printk ("ICPlus ip175x : Driver Initialization - PHY addr = %d\n",
+ phydev->addr);
+
+ if (full_reset_performed == 0)
+ {
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175C:
+ /* Master reset. */
+ err = phydev->bus->write (phydev->bus, 30, 0,
+ IP175C_RESET_VAL);
+ if (err < 0)
+ return err;
+
+ /* Ensure no bus delays overlap reset period. */
+ err = phydev->bus->read (phydev->bus, 30, 0);
+ if (err < 0)
+ return err;
+
+ /* Data sheet specifies reset period is 2 msec. */
+ mdelay (2);
+
+ /* Enable ip175x mode. */
+ err = phydev->bus->write (phydev->bus, 29, 31,
+ IP175C_RESET_VAL);
+ if (err < 0)
+ return err;
+
+ /* Set MII0 speed and duplex (in PHY mode). */
+ err = phydev->bus->write (phydev->bus, 29, 22, 0x420);
+ if (err < 0)
+ return err;
+ break;
+
+ case ICPLUS_MODEL_IP175D:
+ /* Reset the Switch. */
+ err = phydev->bus->write (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_SOFT_RESET_REG_NUM,
+ IP175D_RESET_VAL);
+ if (err < 0)
+ return err;
+ mdelay (2);
+
+ /* Reset Vlan Table. PHY22 MII0, MSB. */
+ err = phydev->bus->write (phydev->bus,
+ IP175D_VLAN_GROUP_CONTROL_REG_PHY,
+ IP175D_VLAN_CLS_REG_NUM,
+ VLAN_TABLE_CLR);
+ if (err < 0)
+ return err;
+
+ /* Port base priority function enable control registers
+ * enable for all ports. */
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_QOS_REG_PHY,
+ IP175D_PRIO_EN_REG_NUM);
+
+ /* If MAX_PORT_NUM = 5, the mask is 0x1F. */
+ reg |= ((1 << MAX_PORT_NUM) - 1);
+ phydev->bus->write (phydev->bus,
+ IP175D_QOS_REG_PHY,
+ IP175D_PRIO_EN_REG_NUM,
+ reg);
+
+ /* disable MAC_X_EN for egress bandwith limit. */
+ reg = phydev->bus->read (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_CONGES_CTL_REG_NUM);
+
+ CLEARBIT (reg, IP175D_MAC_X_EN_OFFSET);
+ phydev->bus->write (phydev->bus,
+ IP175D_SWITCH_CONTROL_REG_PHY,
+ IP175D_CONGES_CTL_REG_NUM,
+ reg);
+
+ break;
+ }
+
+ /* Reset switch ports. */
+ for (i = 0; i < MAX_VLAN_SUPPORTED; i++)
+ {
+ err = phydev->bus->write (phydev->bus, i, MII_BMCR, BMCR_RESET);
+ if (err < 0)
+ return err;
+ }
+
+ for (i = 0; i < MAX_VLAN_SUPPORTED; i++)
+ err = phydev->bus->read (phydev->bus, i, MII_BMCR);
+
+ mdelay (2);
+
+ full_reset_performed = 1;
+ }
+
+ if (phydev->addr != 4)
+ {
+ phydev->state = PHY_RUNNING;
+ phydev->speed = SPEED_100;
+ phydev->duplex = DUPLEX_FULL;
+ phydev->link = 1;
+ netif_carrier_on (phydev->attached_dev);
+ }
+
+ return 0;
}
-static int ip175x_read_status(struct phy_device *phydev)
+static int
+ip175x_read_status (struct phy_device *phydev)
{
- int i, status;
-
- if (phydev->addr == 4) /* WAN port */
- genphy_read_status(phydev);
-
- if (phydev->addr == 5) /* MAC 5 */
- {
- /* Read all links status */
- phydev->link = 0;
- for (i = 0; i < 5; i++) {
- /* Do a fake read */
- status = phydev->bus->read(phydev->bus, i, MII_BMSR);
- if (status < 0)
- return status;
- /* Read link and autonegotiation status */
- status = phydev->bus->read(phydev->bus, i, MII_BMSR);
- if (status < 0)
- return status;
- if ((status & BMSR_LSTATUS) != 0)
- phydev->link = 1;
- }
- }
- return 0;
+ struct ip175x_priv *priv = phydev->priv;
+
+ switch (priv->model)
+ {
+ case ICPLUS_MODEL_IP175C:
+ case ICPLUS_MODEL_IP175D:
+ /* Link always up.
+ * Feedback from spc200x about STB and CNCR. Dhcp packets were
+ * drop on boot. */
+ phydev->link = 1;
+ break;
+
+ default:
+ genphy_read_status (phydev);
+ break;
+ }
+ return 0;
}
-static int ip175x_config_aneg(struct phy_device *phydev)
+static int
+ip175x_config_aneg (struct phy_device *phydev)
{
- if (phydev->addr == 5) /* MAC 5 */
- {
- phydev->autoneg = AUTONEG_DISABLE;
- phydev->speed = SPEED_100;
- phydev->duplex = DUPLEX_FULL;
- genphy_config_aneg(phydev);
- }
- if (phydev->addr == 4) /* WAN port */
- genphy_config_aneg(phydev);
-
- return 0;
+ /* MAC 5. */
+ if (phydev->addr == 5)
+ {
+ phydev->autoneg = AUTONEG_DISABLE;
+ phydev->speed = SPEED_100;
+ phydev->duplex = DUPLEX_FULL;
+ genphy_config_aneg(phydev);
+ }
+ /* WAN port. */
+ if (phydev->addr == 4)
+ genphy_config_aneg(phydev);
+
+ return 0;
}
-static struct phy_driver ip175x_driver = {
- .phy_id = 0x02430d80,
- .name = "ICPlus ip175x",
- .phy_id_mask = 0x0ffffff0,
- .features = PHY_BASIC_FEATURES,
- .config_init = &ip175x_config_init,
- .probe = &ip175x_probe,
- .config_aneg = &ip175x_config_aneg,
- .read_status = &ip175x_read_status,
- .driver = { .owner = THIS_MODULE,},
- .read_vlan_table = &ip175x_read_vlan_table,
- .write_vlan_table = &ip175x_write_vlan_table,
+static struct phy_driver ip175x_driver =
+{
+ .phy_id = 0x02430d80,
+ .name = "ICPlus ip175x",
+ .phy_id_mask = 0x0ffffff0,
+ .features = PHY_BASIC_FEATURES,
+ .config_init = &ip175x_config_init,
+ .probe = &ip175x_probe,
+ .config_aneg = &ip175x_config_aneg,
+ .read_status = &ip175x_read_status,
+ .driver = { .owner = THIS_MODULE,},
+ .read_vlan_table = &ip175x_read_vlan_table,
+ .write_vlan_table = &ip175x_write_vlan_table,
+ .read_port_phy = &ip175x_read_port_phy,
+ .write_port_phy = &ip175x_write_port_phy,
+ .read_stm_ctl = &ip175x_read_port_stm,
+ .write_stm_ctl = &ip175x_write_port_stm,
+ .read_qosrate = &ip175x_read_port_qosrate,
+ .write_qosrate = &ip175x_write_port_qosrate,
+ .read_mirror = &ip175x_read_port_mirror,
+ .write_mirror = &ip175x_write_port_mirror,
+ .read_fat = &ip175x_read_fat,
+ .write_fat = &ip175x_write_fat,
+ .read_igmp = &ip175x_read_igmp,
+ .write_igmp = &ip175x_write_igmp,
};
-static int __init ip175x_init(void)
+static int __init
+ip175x_init (void)
{
- return phy_driver_register(&ip175x_driver);
+ return phy_driver_register (&ip175x_driver);
}
-static void __exit ip175x_exit(void)
+static void __exit
+ip175x_exit(void)
{
- phy_driver_unregister(&ip175x_driver);
+ phy_driver_unregister (&ip175x_driver);
}
-module_init(ip175x_init);
-module_exit(ip175x_exit);
+module_init (ip175x_init);
+module_exit (ip175x_exit);
diff --git a/cleopatre/linux-2.6.25.10-spc300/drivers/net/phy/icplus.h b/cleopatre/linux-2.6.25.10-spc300/drivers/net/phy/icplus.h
index b902e81251..a3094c4a7d 100644
--- a/cleopatre/linux-2.6.25.10-spc300/drivers/net/phy/icplus.h
+++ b/cleopatre/linux-2.6.25.10-spc300/drivers/net/phy/icplus.h
@@ -1,91 +1,179 @@
#ifndef _IP175_H
#define _IP175_H
-#define DRV_NAME "ICPlus_IP175"
-#define DRV_VERSION "1.1"
-#define DRV_RELDATE "Sep 20th, 2010"
+#define DRV_NAME "ICPlus_IP175"
+#define DRV_VERSION "1.1"
+#define DRV_RELDATE "Sep 20th, 2010"
+
+/*****************************************************/
+/***************** COMMON **************************/
+/*****************************************************/
+#define SETBIT(x,y) ((x) |= (1 << (y)))
+#define CLEARBIT(x,y) ((x) &= (~(1 << (y))))
+#define GETBIT(x,y) (((x) >> (y)) & 0x1)
+#define GET2BITS(x,y) (((x) >> ((y) * 2)) & 0x3)
+
+#define CREATMASK(x) ((1 << (x)) - 1)
+#define GETBITS(x,y,z) (((x) >> (y)) & CREATMASK(z))
+#define CLEARBITS(x,y,z) ((x) & (~(CREATMASK(z) << (y))))
+#define SETBITS(x,y,z,w) (CLEARBITS (x,y,z) | ((w) << (y)))
+
+#define TIME_S_TO_M(x) (((x) + 59) / 60)
+#define TIME_M_TO_S(x) ((x) * 60)
+#define TIME_10MS_TO_S(x) ((x) / 100)
+
+enum {
+ ICPLUS_MODEL_IP175C = 0,
+ ICPLUS_MODEL_IP175D = 1,
+};
+
+enum {
+ SPEED_10M = 10,
+ SPEED_100M = 100,
+};
+
+/*****************************************************/
+/***************** ICPLUS_IP175C *******************/
+/*****************************************************/
+#define IP175C_RESET_VAL 0x175C
/*****************************************************/
/***************** ICPLUS_IP175D *******************/
/*****************************************************/
#define IP175D_VLAN_TABLE_SIZE 16
-#define IP175D_VLAN_TABLE_COMMON_PHY 5
+#define IP175D_VLAN_TABLE_CPU_ENTRY 5
#define IP175D_VLAN_TABLE_NO_TAG_LINE 6
+#define IP175D_RESET_VAL 0x175D
+
+enum ip175d_prio_queue {
+ IP175D_PACKETS_ASSIGNED_TO_QUEUE_0 = 0x0,
+ IP175D_PACKETS_ASSIGNED_TO_QUEUE_1 = 0x1,
+ IP175D_PACKETS_ASSIGNED_TO_QUEUE_2 = 0x2,
+ IP175D_PACKETS_ASSIGNED_TO_QUEUE_3 = 0x3,
+ IP175D_PACKETS_ASSIGNED_TO_QUEUE_NB = 4
+};
-#define IP175D_RESET_VAL 0x175D
-#define IP175C_RESET_VAL 0x175C
-
+enum ip175d_mirror_mode {
+ IP175D_MIRROR_MODE_RX = 0x0,
+ IP175D_MIRROR_MODE_TX = 0x1,
+ IP175D_MIRROR_MODE_DIFF_RXTX = 0x2,
+ IP175D_MIRROR_MODE_SAME_RXTX = 0x3,
+};
-#define SETBIT(x,y) ((x) |= (1<<(y)))
-#define CLEARBIT(x,y) ((x) &= (~(1<<(y))))
+enum ip175d_age_time_unit {
+ IP175D_AGE_TIME_M = 0x0,
+ IP175D_AGE_TIME_S = 0x1,
+ IP175D_AGE_TIME_MS = 0x2,
+ IP175D_AGE_TIME_FAST = 3,
+};
/************************************
- VLAN Group Control Register
+ PHY declaration
************************************/
-
-#define IP175D_SOFT_RESET_REG_PHY 20
-#define IP175D_SOFT_RESET_REG_NUM 2
-
-#define IP175D_VLAN_CLS_REG_PHY 22
-#define IP175D_VLAN_CLS_REG_NUM 0
-
-#define VLAN_TABLE_CLR 0x8000
-#define UNVID_MODE_DISCARD 0x0000
-#define UNVID_MODE_FORWARD_TO_CPU 0x1000
-#define UNVID_MODE_FLOOD_PACKET 0x2000
-#define UNVID_MODE_RESERVED 0x3000
-#define VLAN_CLS_USE_VID(p) (0)
-#define VLAN_CLS_USE_PVID(p) (1<(6+p))
-#define VLAN_MODE_PORT_BASED(p) (0)
-#define VLAN_MODE_TAGGED_BASED(p) (1<p)
-
-#define IP175D_VLAN_INGRESS_RULE_REG_PHY 22
-#define IP175D_VLAN_INGRESS_RULE_REG_NUM 1
-#define IP175D_VLAN_EGRESS_RULE_REG_PHY 22
-#define IP175D_VLAN_EGRESS_RULE_REG_NUM 2
-#define IP175D_VLAN_TPID_VAL_REG_PHY 22
-#define IP175D_VLAN_TPID_VAL_REG_NUM 3
-#define IP175D_VLAN_INFO_REG_PHY 22
-#define IP175D_VLAN_INFO_REG_NUM(p) (4+p)
+#define IP175D_PORT_PHY_REG_PHY(i) (i)
+#define IP175D_QOS_REG_PHY 25
+#define IP175D_RATE_REG_PHY 21
+#define IP175D_SWITCH_CONTROL_REG_PHY 20
+#define IP175D_VLAN_GROUP_CONTROL_REG_PHY 22
+#define IP175D_VLAN_MEMBER_REG_PHY 23
/************************************
- VLAN TABLE REGISTER
+PHY 0-4 : Phy Control Register
************************************/
-#define IP175D_VLAN_VALID_REG_PHY 22
-#define IP175D_VLAN_VALID_REG_NUM 10
-
-#define IP175D_QU_NUM_EN_REG_PHY 22
-#define IP175D_QU_NUM_EN_REG_NUM 11
-
-#define IP175D_STP_IDX_EN_REG_PHY 22
-#define IP175D_STP_IDX_EN_REG_NUM 12
-
-#define IP175D_REW_VLAN_PRI_EN_REG_PHY 22
-#define IP175D_REW_VLAN_PRI_EN_REG_NUM 13
+#define IP175D_PHY_CONTROL_REG_NUM 0
+#define IP175D_DUPLEX_MODE_BIT 8
+#define IP175D_AUTO_NEGOTIATION_RESTART_BIT 9
+#define IP175D_AUTO_NEGOTIATION_BIT 12
+#define IP175D_SPEED_MODE_BIT 13
-#define IP175D_VLAN_ID_REG_PHY 22
-#define IP175D_VLAN_ID_REG_NUM(i) (14+i)
+/************************************
+PHY 20 : Switch Control Register
+************************************/
+#define IP175D_SOFT_RESET_REG_NUM 2
+#define IP175D_CONGES_CTL_REG_NUM 5
+#define IP175D_STM_EN_REG_NUM 16
+#define IP175D_STM_THR_REG_NUM(p) (17 + (p / 2))
+
+#define IP175D_BF_STM_EN_OFFSET 8
+#define IP175D_BF_STM_EN(i) (IP175D_BF_STM_EN_OFFSET + (i))
+#define IP175D_BF_FFFF_DIS_OFFSET 0
+#define IP175D_BF_FFFF_DIS(i) (IP175D_BF_FFFF_DIS_OFFSET + (i))
+#define THRESHOLD_MSTOS(x,y) ((x) * (y))
+#define THRESHOLD_STOMS(x,y) (((x) + (y) - 1) / (y))
+#define IP175D_MAC_X_EN_OFFSET 0
+
+#define IP175D_MIRROR_EN_MODE_REG_NUM 20
+#define IP175D_MIRROR_PORT_REG_NUM 21
+#define IP175D_MIRROR_EN_OFFSET 15
+#define IP175D_MIRROR_MODE_OFFSET 13
+#define IP175D_MIRRORED_RX_PORT_OFFSET 0
+#define IP175D_MIRROR_PORT_OFFSET 12
+#define IP175D_MIRRORED_TX_PORT_OFFSET 0
+
+#define IP175D_8023X_FLOW_REG_NUM 5
+#define IP175D_AGETIME_VAL_REG_NUM 14
+#define IP175D_8023X_FLOW_EN_OFFSET 1
+#define IP175D_AGETIME_VAL_OFFSET 0
+#define IP175D_AGETIME_UNIT_OFFSET 5
+#define IP175D_AGETIME_VAL_MAX 31
+#define IP175D_AGETIME_MAX TIME_M_TO_S(IP175D_AGETIME_VAL_MAX)
+
+#define IP175D_TRAP_IGMP_REG_NUM 10
+#define IP175D_TRAP_IGMP_OFFSET 4
-#define IP175D_VLAN_MEMBER_REG_PHY 23
-#define IP175D_VLAN_MEMBER_REG_NUM(i) (i/2)
-#define IP175D_ADD_TAG_REG_PHY 23
-#define IP175D_ADD_TAG_REG_NUM(i) (8+(i/2))
+/************************************
+PHY 21 : Rate Control Register
+************************************/
+#define IP175D_BW_TI_REG_NUM 8
+#define IP175D_BW_MBS_REG_NUM 9
+#define IP175D_BW_CREDIT_REG_NUM 10
+#define IP175D_BW_PORT_IOE_REG_NUM 12
+
+#define IP175D_BW_RATE_SETTING_PORT(p) ((p) & 0x7)
+#define IP175D_BW_RATE_SETTING_INGRESS (0 << 3)
+#define IP175D_BW_RATE_SETTING_EGRESS (1 << 3)
+#define IP175D_BW_RATE_SETTING_READ (0 << 8)
+#define IP175D_BW_RATE_SETTING_WRITE (1 << 8)
+#define IP175D_BW_RATE_SETTING_START (1 << 9)
+#define IP175D_BW_TI_DEFAULT_VAL 0x1
+#define IP175D_BW_MBS_VAL(x) (((x) < 0x700) ? 0x700 : ((x) + 0x100))
-#define IP175D_REMOVE_TAG_REG_PHY 23
-#define IP175D_REMOVE_TAG_REG_NUM(i) (16+(i/2))
+/************************************
+PHY 22 : VLAN Group Control Register
+************************************/
+#define IP175D_VLAN_CLS_REG_NUM 0
+#define IP175D_VLAN_INGRESS_RULE_REG_NUM 1
+#define IP175D_VLAN_EGRESS_RULE_REG_NUM 2
+#define IP175D_VLAN_TPID_VAL_REG_NUM 3
+#define IP175D_VLAN_INFO_REG_NUM(p) (4 + (p))
+#define IP175D_VLAN_VALID_REG_NUM 10
+#define IP175D_VLAN_REW_VLAN_PRIO_REG_NUM 13
+#define IP175D_VLAN_ID_REG_NUM(i) (14 + (i))
+
+#define VLAN_TABLE_CLR 0x8000
+#define UNVID_MODE_DISCARD 0x0000
+#define UNVID_MODE_FORWARD_TO_CPU 0x1000
+#define UNVID_MODE_FLOOD_PACKET 0x2000
+#define UNVID_MODE_RESERVED 0x3000
+#define PVID_USED_INSTEAD_VID 0x07C0
+#define VLAN_ON_VLAN_FOR_UPLOAD 0x0020
-#define IP175D_VLAN_MISC_REG_PHY 23
-#define IP175D_VLAN_MISC_REG_NUM(i) (24+(i/2))
+/************************************
+PHY 23 : VLAN Table
+************************************/
+#define IP175D_VLAN_MEMBER_REG_NUM(i) ((i) / 2)
+#define IP175D_ADD_TAG_REG_NUM(i) (8 + ((i) / 2))
+#define IP175D_REMOVE_TAG_REG_NUM(i) (16 + ((i) / 2))
+#define IP175D_VLAN_MISC_REG_NUM(i) (24 + ((i) / 2))
+#define IP175D_REW_VLAN_PRIO 5
/************************************
+PHY 25 : QOS
************************************/
-
-enum {
- ICPLUS_MODEL_IP175C = 0,
- ICPLUS_MODEL_IP175D = 1,
-};
+#define IP175D_PRIO_EN_REG_NUM 0
+#define IP175D_PRIO_MAP_REG_NUM 1
#endif /* _IP175_H */
diff --git a/cleopatre/linux-2.6.25.10-spc300/include/linux/ethtool.h b/cleopatre/linux-2.6.25.10-spc300/include/linux/ethtool.h
index 5766b81ec0..b9d18f93e2 100644
--- a/cleopatre/linux-2.6.25.10-spc300/include/linux/ethtool.h
+++ b/cleopatre/linux-2.6.25.10-spc300/include/linux/ethtool.h
@@ -231,12 +231,99 @@ enum ethtool_stringset {
struct ethtool_vlanparam {
u32 cmd; /* ETHTOOL_RVLAN_TABLE, ETHTOOL_SVLAN_TABLE*/
- struct {
- u8 state;
- u16 vlan;
- }vlan_table[MAX_VLAN_SUPPORTED];
+ struct {
+ u8 state;
+ u16 vlan;
+ }vlan_table[MAX_VLAN_SUPPORTED];
};
+enum {
+ ETHTOOL_QOS_0 = 0,
+ ETHTOOL_QOS_1 = 1,
+ ETHTOOL_QOS_2 = 2,
+ ETHTOOL_QOS_3 = 3,
+ ETHTOOL_QOS_4 = 4,
+ ETHTOOL_QOS_5 = 5,
+ ETHTOOL_QOS_6 = 6,
+ ETHTOOL_QOS_7 = 7,
+};
+#define STORM_THR_MIN 100
+#define STORM_THR_MAX 2550
+#define MAX_PORT_NUM MAX_VLAN_SUPPORTED
+struct ethtool_phyparam {
+ u32 cmd; /*ETHTOOL_RPORT_PHY, ETHTOOL_SPORT_PHY*/
+
+ struct {
+ u8 aneg;
+ u8 speed;
+ u8 duplex;
+ }port[MAX_PORT_NUM];
+};
+
+struct ethtool_stmparam {
+ u32 cmd; /*ETHTOOL_RSTM_CTL, ETHTOOL_SSTM_CTL*/
+
+ struct {
+ u8 bcast_state;
+ u16 thrshold;
+ u8 mcast_state;
+ }port[MAX_PORT_NUM];
+};
+
+struct ethtool_qosrateparam {
+ u32 cmd; /*ETHTOOL_RQOSRATE, ETHTOOL_SQOSRATE*/
+
+ struct {
+ u8 qos;
+ u16 txrate;
+ u16 rxrate;
+ }port[MAX_PORT_NUM];
+};
+
+enum {
+ ETHTOOL_MIRROR_MODE_RX,
+ ETHTOOL_MIRROR_MODE_TX,
+ ETHTOOL_MIRROR_MODE_RXTX,
+ ETHTOOL_MIRROR_MODE_NB,
+};
+enum {
+ ETHTOOL_MIRROR_STATE_OFF,
+ ETHTOOL_MIRROR_STATE_ON,
+ ETHTOOL_MIRROR_STATE_NB,
+};
+enum {
+ ETHTOOL_FLOW_STATE_OFF,
+ ETHTOOL_FLOW_STATE_ON,
+ ETHTOOL_FLOW_STATE_NB,
+};
+enum {
+ ETHTOOL_IGMP_FORWARD,
+ ETHTOOL_IGMP_FTOCPU,
+ ETHTOOL_IGMP_DISCARD,
+ ETHTOOL_IGMP_RESERVE,
+ ETHTOOL_IGMP_NB,
+};
+#define ETHTOOL_MIRROR_PORT_NONE (MAX_PORT_NUM + 1)
+#define ETHTOOL_MIRROR_PORT_MANY (MAX_PORT_NUM + 2)
+struct ethtool_mirror {
+ u32 cmd; /*ETHTOOL_RMIRROR, ETHTOOL_SMIRROR*/
+ u8 state;
+ u8 type;
+ u8 rport;
+ u8 tport;
+ u8 dport;
+};
+
+struct ethtool_fat {
+ u32 cmd; /*ETHTOOL_RFAT, ETHTOOL_SFAT*/
+ u8 flow;
+ u16 atime;
+};
+
+struct ethtool_igmp {
+ u32 cmd; /* ETHTOOL_RIGMP, ETHTOOL_SIGMP */
+ u8 tigmp;
+};
/* for passing string sets for data tagging */
struct ethtool_gstrings {
@@ -336,12 +423,12 @@ int ethtool_op_set_flags(struct net_device *dev, u32 data);
* get_ufo: Report whether UDP fragmentation offload is enabled
* set_ufo: Turn UDP fragmentation offload on or off
* self_test: Run specified self-tests
- * get_strings: Return a set of strings that describe the requested objects
+ * get_strings: Return a set of strings that describe the requested objects
* phys_id: Identify the device
* get_stats: Return statistics about the device
* get_flags: get 32-bit flags bitmap
* set_flags: set 32-bit flags bitmap
- *
+ *
* Description:
*
* get_settings:
@@ -399,12 +486,12 @@ struct ethtool_ops {
void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *);
int (*begin)(struct net_device *);
void (*complete)(struct net_device *);
- u32 (*get_ufo)(struct net_device *);
- int (*set_ufo)(struct net_device *, u32);
- u32 (*get_flags)(struct net_device *);
- int (*set_flags)(struct net_device *, u32);
- u32 (*get_priv_flags)(struct net_device *);
- int (*set_priv_flags)(struct net_device *, u32);
+ u32 (*get_ufo)(struct net_device *);
+ int (*set_ufo)(struct net_device *, u32);
+ u32 (*get_flags)(struct net_device *);
+ int (*set_flags)(struct net_device *, u32);
+ u32 (*get_priv_flags)(struct net_device *);
+ int (*set_priv_flags)(struct net_device *, u32);
int (*get_sset_count)(struct net_device *, int);
/* the following hooks are obsolete */
@@ -457,7 +544,18 @@ struct ethtool_ops {
#define ETHTOOL_SPFLAGS 0x00000028 /* Set driver-private flags bitmap */
#define ETHTOOL_RVLAN_TABLE 0x00000029 /* Read VLAN Table (SPIDCOM Code) */
#define ETHTOOL_SVLAN_TABLE 0x0000002a /* WriteVLAN Table (SPIDCOM Code) */
-
+#define ETHTOOL_RPORT_PHY 0x0000002b /*Read Port PHY (MStar Code)*/
+#define ETHTOOL_SPORT_PHY 0x0000002c /*Write Port PHY (MStar Code)*/
+#define ETHTOOL_RSTM_CTL 0x0000002e /*Read Storm Protect (MStar Code)*/
+#define ETHTOOL_SSTM_CTL 0x0000002f /*Write Storm Protect (MStar Code)*/
+#define ETHTOOL_RQOSRATE 0x00000030 /*Read Qos and Port Rate (MStar Code)*/
+#define ETHTOOL_SQOSRATE 0x00000031 /*Write Qos and Port Rate (MStar Code)*/
+#define ETHTOOL_RMIRROR 0x00000032 /*Read Port Mirror (MStar Code)*/
+#define ETHTOOL_SMIRROR 0x00000033 /*Write Port Mirror (MStar Code)*/
+#define ETHTOOL_RFAT 0x00000034 /*Read Flow and Aging Time (MStar Code)*/
+#define ETHTOOL_SFAT 0x00000035 /*Write Flow and Aging Time (MStar Code)*/
+#define ETHTOOL_RIGMP 0x00000036 /*Read Trap IGMP (MStar Code)*/
+#define ETHTOOL_SIGMP 0x00000037 /*Write Trap IGMP (MStar Code)*/
/* compatibility with older code */
#define SPARC_ETH_GSET ETHTOOL_GSET
diff --git a/cleopatre/linux-2.6.25.10-spc300/include/linux/phy.h b/cleopatre/linux-2.6.25.10-spc300/include/linux/phy.h
index f26e273ee3..fc9b228b07 100644
--- a/cleopatre/linux-2.6.25.10-spc300/include/linux/phy.h
+++ b/cleopatre/linux-2.6.25.10-spc300/include/linux/phy.h
@@ -362,6 +362,42 @@ struct phy_driver {
/* Write VLAN Table */
int (*write_vlan_table)(struct phy_device *phydev, struct ethtool_vlanparam *ecmd);
+
+ /* Read Port PHY */
+ int (*read_port_phy)(struct phy_device *phydev, struct ethtool_phyparam *ecmd);
+
+ /* Write Port PHY */
+ int (*write_port_phy)(struct phy_device *phydev, struct ethtool_phyparam *ecmd);
+
+ /* Read Storm Control */
+ int (*read_stm_ctl)(struct phy_device *phydev, struct ethtool_stmparam *ecmd);
+
+ /* Write Storm Control */
+ int (*write_stm_ctl)(struct phy_device *phydev, struct ethtool_stmparam *ecmd);
+
+ /* Read Qos and Rate Control */
+ int (*read_qosrate)(struct phy_device *phydev, struct ethtool_qosrateparam *ecmd);
+
+ /* Write Qos and Rate Control */
+ int (*write_qosrate)(struct phy_device *phydev, struct ethtool_qosrateparam *ecmd);
+
+ /* Read Port Mirror */
+ int (*read_mirror)(struct phy_device *phydev, struct ethtool_mirror *ecmd);
+
+ /* Write Port Mirror */
+ int (*write_mirror)(struct phy_device *phydev, struct ethtool_mirror *ecmd);
+
+ /* Read Flow And Aging Time */
+ int (*read_fat)(struct phy_device *phydev, struct ethtool_fat *ecmd);
+
+ /* Write Flow And Aging Time */
+ int (*write_fat)(struct phy_device *phydev, struct ethtool_fat *ecmd);
+
+ /* Read Trap_IGMP */
+ int (*read_igmp)(struct phy_device *phydev, struct ethtool_igmp *ecmd);
+
+ /* Write Trap_IGMP */
+ int (*write_igmp)(struct phy_device *phydev, struct ethtool_igmp *ecmd);
};
#define to_phy_driver(d) container_of(d, struct phy_driver, driver)
diff --git a/cleopatre/linux-2.6.25.10-spc300/net/bridge/br_forward.c b/cleopatre/linux-2.6.25.10-spc300/net/bridge/br_forward.c
index 4ea606aa4b..c1bea09afd 100644
--- a/cleopatre/linux-2.6.25.10-spc300/net/bridge/br_forward.c
+++ b/cleopatre/linux-2.6.25.10-spc300/net/bridge/br_forward.c
@@ -159,5 +159,20 @@ void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb)
/* called under bridge lock */
void br_flood_forward(struct net_bridge *br, struct sk_buff *skb)
{
+ /* Mark packet if it's destination MAC address is not present in the
+ * bridge table. */
+ if (skb)
+ {
+ switch (skb->pkt_type)
+ {
+ case PACKET_BROADCAST:
+ skb->mark = 0xFFFFFFFF;
+ break;
+
+ default:
+ skb->mark = 0xFFFFFFFE;
+ break;
+ }
+ }
br_flood(br, skb, __br_forward);
}
diff --git a/cleopatre/linux-2.6.25.10-spc300/net/core/ethtool.c b/cleopatre/linux-2.6.25.10-spc300/net/core/ethtool.c
index cfab496f1f..f17be8d43f 100644
--- a/cleopatre/linux-2.6.25.10-spc300/net/core/ethtool.c
+++ b/cleopatre/linux-2.6.25.10-spc300/net/core/ethtool.c
@@ -797,9 +797,21 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
return -EFAULT;
- if((ethcmd == ETHTOOL_RVLAN_TABLE)||
- (ethcmd == ETHTOOL_SVLAN_TABLE))
- return dev->do_ioctl(dev, ifr, SIOCETHTOOL);
+ if ((ethcmd == ETHTOOL_RVLAN_TABLE)
+ || (ethcmd == ETHTOOL_SVLAN_TABLE)
+ || (ethcmd == ETHTOOL_RPORT_PHY)
+ || (ethcmd == ETHTOOL_SPORT_PHY)
+ || (ethcmd == ETHTOOL_RSTM_CTL)
+ || (ethcmd == ETHTOOL_SSTM_CTL)
+ || (ethcmd == ETHTOOL_RQOSRATE)
+ || (ethcmd == ETHTOOL_SQOSRATE)
+ || (ethcmd == ETHTOOL_RMIRROR)
+ || (ethcmd == ETHTOOL_SMIRROR)
+ || (ethcmd == ETHTOOL_RFAT)
+ || (ethcmd == ETHTOOL_SFAT)
+ || (ethcmd == ETHTOOL_RIGMP)
+ || (ethcmd == ETHTOOL_SIGMP))
+ return dev->do_ioctl(dev, ifr, SIOCETHTOOL);
/* Allow some commands to be done by anyone */
switch(ethcmd) {