diff mbox

[OpenWrt-Devel] AR8334 switch support

Message ID 553E297E.10509@m3hlis.de
State RFC
Headers show

Commit Message

Christian Mehlis April 27, 2015, 12:20 p.m. UTC
Am 24.04.2015 um 20:05 schrieb Heiner Kallweit:
> Could you please test this patch and provide the dmesg output?

I tried your patch - dmesg is attached.

After the first run without success:
[    0.890000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: Detected 
AR8337 switch

I tweaked your patch a bit to print out more (attached).

############################################################

I also changed:
+	for (i = 0; i < AR8XXX_NUM_PHYS; i++) {
to
+	for (i = 0; i < AR8327_NUM_PORTS; i++) {

with this change we get:

[    0.850000] switch0: Atheros AR833X rev. 2 switch registered on 
ag71xx-mdio.0
[    0.860000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 0 
available
[    0.860000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 1 
available
[    0.870000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 2 
available
[    0.880000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 3 
available
[    0.890000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 4 
available
[    0.890000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 5 
available
[    0.900000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 6 
available
[    0.910000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: Detected 
AR8337 switch

#############################################################

It seems, that your phy based test is not working on ar8334...

Can we test other registers? I'll give it a try.

Best
Christian
# dmesg 
[    0.000000] Linux version 3.18.11 (c@black) (gcc version 4.8.3 (OpenWrt/Linaro GCC 4.8-2014.04 r45458) ) #1 Mon Apr 27 13:42:01 CEST 2015
[    0.000000] MyLoader: sysp=cc7dbb0c, boardp=e9f041c4, parts=cbc748d9
[    0.000000] bootconsole [early0] enabled
[    0.000000] CPU0 revision is: 0001974c (MIPS 74Kc)
[    0.000000] SoC: Atheros AR9344 rev 2
[    0.000000] Determined physical RAM map:
[    0.000000]  memory: 08000000 @ 00000000 (usable)
[    0.000000] Initrd not found or empty - disabling initrd
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x00000000-0x07ffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x00000000-0x07ffffff]
[    0.000000] Initmem setup node 0 [mem 0x00000000-0x07ffffff]
[    0.000000] On node 0 totalpages: 32768
[    0.000000] free_area_init_node: node 0, pgdat 803560f0, node_mem_map 81000000
[    0.000000]   Normal zone: 256 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 32768 pages, LIFO batch:7
[    0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
[    0.000000] Primary data cache 32kB, 4-way, VIPT, cache aliases, linesize 32 bytes
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
[    0.000000] Kernel command line:  board=WPJ344 console=ttyS0,115200 mtdparts=spi0.0:192k(u-boot)ro,16128k(firmware),64k(art)ro rootfstype=squashfs,jffs2 noinitrd
[    0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.000000] Writing ErrCtl register=00000000
[    0.000000] Readback ErrCtl register=00000000
[    0.000000] Memory: 125920K/131072K available (2471K kernel code, 123K rwdata, 528K rodata, 260K init, 188K bss, 5152K reserved)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS:51
[    0.000000] Clocks: CPU:560.000MHz, DDR:450.000MHz, AHB:225.000MHz, Ref:40.000MHz
[    0.000000] Calibrating delay loop... 278.93 BogoMIPS (lpj=1394688)
[    0.070000] pid_max: default: 32768 minimum: 301
[    0.070000] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.080000] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.080000] NET: Registered protocol family 16
[    0.090000] MIPS: machine is Compex WPJ344
[    0.100000] ar724x-pci ar724x-pci: PCIe link is down
[    0.100000] registering PCI controller with io_map_base unset
[    0.110000] ar71xx: using random MAC address for eth0
[    0.330000] ar71xx: using random MAC address for eth1
[    0.550000] PCI host bridge to bus 0000:00
[    0.560000] pci_bus 0000:00: root bus resource [mem 0x10000000-0x13ffffff]
[    0.560000] pci_bus 0000:00: root bus resource [io  0x0000]
[    0.570000] pci_bus 0000:00: No busn resource found for root bus, will use [bus 00-ff]
[    0.570000] pci_bus 0000:00: busn_res: [bus 00-ff] end is updated to 00
[    0.570000] Switched to clocksource MIPS
[    0.580000] NET: Registered protocol family 2
[    0.580000] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[    0.580000] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[    0.590000] TCP: Hash tables configured (established 1024 bind 1024)
[    0.590000] TCP: reno registered
[    0.600000] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    0.600000] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    0.610000] NET: Registered protocol family 1
[    0.610000] PCI: CLS 0 bytes, default 32
[    0.610000] futex hash table entries: 256 (order: -1, 3072 bytes)
[    0.630000] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.630000] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
[    0.640000] msgmni has been set to 245
[    0.660000] io scheduler noop registered
[    0.660000] io scheduler deadline registered (default)
[    0.660000] Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
[    0.670000] console [ttyS0] disabled
[    0.690000] serial8250.0: ttyS0 at MMIO 0x18020000 (irq = 11, base_baud = 2500000) is a 16550A
[    0.700000] console [ttyS0] enabled
[    0.710000] bootconsole [early0] disabled
[    0.720000] m25p80 spi0.0: found mx25l12805d, expected m25p80
[    0.730000] m25p80 spi0.0: mx25l12805d (16384 Kbytes)
[    0.730000] 3 cmdlinepart partitions found on MTD device spi0.0
[    0.740000] Creating 3 MTD partitions on "spi0.0":
[    0.740000] 0x000000000000-0x000000030000 : "u-boot"
[    0.750000] 0x000000030000-0x000000ff0000 : "firmware"
[    0.790000] 2 uimage-fw partitions found on MTD device firmware
[    0.790000] 0x000000030000-0x000000150000 : "kernel"
[    0.800000] 0x000000150000-0x000000ff0000 : "rootfs"
[    0.800000] mtd: device 3 (rootfs) set to be root filesystem
[    0.810000] 1 squashfs-split partitions found on MTD device rootfs
[    0.820000] 0x0000003c0000-0x000000ff0000 : "rootfs_data"
[    0.820000] 0x000000ff0000-0x000001000000 : "art"
[    0.840000] libphy: ag71xx_mdio: probed
[    0.850000] switch0: Atheros AR833X rev. 2 switch registered on ag71xx-mdio.0
[    0.860000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 0 available
[    0.860000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 1 available
[    0.870000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 2 available
[    0.880000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 3 available
[    0.890000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 4 available
[    0.890000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: Detected AR8337 switch
[    0.960000] libphy: ag71xx_mdio: probed
[    1.560000] ag71xx ag71xx.0: connected to PHY at ag71xx-mdio.0:00 [uid=004dd036, driver=Atheros AR8216/AR8236/AR8316]
[    1.570000] eth0: Atheros AG71xx at 0xb9000000, irq 4, mode:RGMII
[    2.160000] ag71xx-mdio.1: Found an AR934X built-in switch
[    2.200000] eth1: Atheros AG71xx at 0xba000000, irq 5, mode:GMII
[    2.210000] TCP: cubic registered
[    2.210000] NET: Registered protocol family 17
[    2.210000] bridge: automatic filtering via arp/ip/ip6tables has been deprecated. Update your scripts to load br_netfilter if you need this.
[    2.230000] 8021q: 802.1Q VLAN Support v1.8
[    2.240000] VFS: Mounted root (squashfs filesystem) readonly on device 31:3.
[    2.250000] Freeing unused kernel memory: 260K (8036f000 - 803b0000)
[    3.270000] init: failed to symlink /tmp -> /var
[    3.270000] init: Console is alive
[    3.270000] init: - watchdog -
[    4.460000] usbcore: registered new interface driver usbfs
[    4.460000] usbcore: registered new interface driver hub
[    4.470000] usbcore: registered new device driver usb
[    4.480000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    4.480000] ehci-platform: EHCI generic platform driver
[    4.490000] ehci-platform ehci-platform: EHCI Host Controller
[    4.500000] ehci-platform ehci-platform: new USB bus registered, assigned bus number 1
[    4.510000] ehci-platform ehci-platform: irq 3, io mem 0x1b000000
[    4.530000] ehci-platform ehci-platform: USB 2.0 started, EHCI 1.00
[    4.530000] hub 1-0:1.0: USB hub found
[    4.540000] hub 1-0:1.0: 1 port detected
[    4.540000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    4.550000] ohci-platform: OHCI generic platform driver
[    5.280000] init: - preinit -
[    6.030000] random: procd urandom read with 9 bits of entropy available
[    7.730000] eth0: link up (1000Mbps/Full duplex)
[    9.290000] mount_root: jffs2 not ready yet, using temporary tmpfs overlay
[    9.330000] eth0: link down
[    9.340000] procd: - early -
[    9.340000] procd: - watchdog -
[    9.960000] procd: - ubus -
[   10.980000] procd: - init -
[   11.710000] NET: Registered protocol family 10
[   11.720000] ip6_tables: (C) 2000-2006 Netfilter Core Team
[   11.740000] Loading modules backported from Linux version master-2015-03-09-0-g141f155
[   11.750000] Backport generated by backports.git backports-20150129-0-gdd4a670
[   11.780000] cfg80211: Calling CRDA to update world regulatory domain
[   11.780000] cfg80211: World regulatory domain updated:
[   11.790000] cfg80211:  DFS Master region: unset
[   11.790000] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)
[   11.800000] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[   11.810000] cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[   11.820000] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm), (N/A)
[   11.830000] cfg80211:   (5170000 KHz - 5250000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[   11.840000] cfg80211:   (5250000 KHz - 5330000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2000 mBm), (0 s)
[   11.840000] cfg80211:   (5490000 KHz - 5730000 KHz @ 160000 KHz), (N/A, 2000 mBm), (0 s)
[   11.850000] cfg80211:   (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[   11.860000] cfg80211:   (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)
[   11.970000] ip_tables: (C) 2000-2006 Netfilter Core Team
[   11.980000] nf_conntrack version 0.5.0 (1971 buckets, 7884 max)
[   12.020000] xt_time: kernel timezone is -0000
[   12.040000] PPP generic driver version 2.4.2
[   12.050000] NET: Registered protocol family 24
[   12.070000] ath: EEPROM regdomain: 0x0
[   12.070000] ath: EEPROM indicates default country code should be used
[   12.070000] ath: doing EEPROM country->regdmn map search
[   12.070000] ath: country maps to regdmn code: 0x3a
[   12.070000] ath: Country alpha2 being used: US
[   12.070000] ath: Regpair used: 0x3a
[   12.080000] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[   12.080000] ieee80211 phy0: Atheros AR9340 Rev:2 mem=0xb8100000, irq=47
[   12.090000] cfg80211: Calling CRDA for country: US
[   12.110000] cfg80211: Regulatory domain changed to country: US
[   12.110000] cfg80211:  DFS Master region: FCC
[   12.120000] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)
[   12.130000] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 3000 mBm), (N/A)
[   12.130000] cfg80211:   (5170000 KHz - 5250000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 1700 mBm), (N/A)
[   12.140000] cfg80211:   (5250000 KHz - 5330000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2300 mBm), (0 s)
[   12.150000] cfg80211:   (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 3000 mBm), (N/A)
[   12.160000] cfg80211:   (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 4000 mBm), (N/A)
[   18.860000] jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
[   18.880000] jffs2_build_filesystem(): unlocking the mtd device... done.
[   18.880000] jffs2_build_filesystem(): erasing all blocks after the end marker... 
[   22.700000] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[   22.750000] device eth0.1 entered promiscuous mode
[   22.750000] device eth0 entered promiscuous mode
[   22.790000] IPv6: ADDRCONF(NETDEV_UP): br-lan: link is not ready
[   22.830000] IPv6: ADDRCONF(NETDEV_UP): eth0.2: link is not ready
[   23.880000] eth0: link up (1000Mbps/Full duplex)
[   23.880000] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[   23.940000] br-lan: port 1(eth0.1) entered forwarding state
[   23.940000] br-lan: port 1(eth0.1) entered forwarding state
[   23.950000] IPv6: ADDRCONF(NETDEV_CHANGE): eth0.2: link becomes ready
[   23.950000] IPv6: ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready
[   25.920000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: Port 3 is up
[   25.940000] br-lan: port 1(eth0.1) entered forwarding state
[   78.810000] done.
[   78.810000] jffs2: notice: (922) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
[   80.610000] random: nonblocking pool is initialized

Comments

Heiner Kallweit April 27, 2015, 1:06 p.m. UTC | #1
Here comes a slight modification / extension to display the return
value of the BMSR read command.
Maybe the read command returns an error instead of 0 for non-existent PHY's.
There is no AR8XXX chip with a PHY 5 or PHY 6.
Could you please provide te dmesg output of this patch version?

Thanks.


for (i = 0; i < AR8327_NUM_PORTS; i++) {
        int bmsr = mdiobus_read(priv->mii_bus, i, MII_BMSR);
        /* certain bits are always set if the PHY exists */
        if (!bmsr) {
            priv->unavailable_phys[i] = true;
            priv->num_unavailable_phys++;
            dev_info(&priv->phy->dev, "PHY %d not available\n", i);
        } else {
            dev_info(&priv->phy->dev, "PHY %d available, BMSR =
0x%x\n", i, bmsr);
        }

On Mon, Apr 27, 2015 at 2:20 PM, Christian Mehlis <christian@m3hlis.de> wrote:
> Am 24.04.2015 um 20:05 schrieb Heiner Kallweit:
>>
>> Could you please test this patch and provide the dmesg output?
>
>
> I tried your patch - dmesg is attached.
>
> After the first run without success:
> [    0.890000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: Detected
> AR8337 switch
>
> I tweaked your patch a bit to print out more (attached).
>
> ############################################################
>
> I also changed:
> +       for (i = 0; i < AR8XXX_NUM_PHYS; i++) {
> to
> +       for (i = 0; i < AR8327_NUM_PORTS; i++) {
>
> with this change we get:
>
> [    0.850000] switch0: Atheros AR833X rev. 2 switch registered on
> ag71xx-mdio.0
> [    0.860000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 0
> available
> [    0.860000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 1
> available
> [    0.870000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 2
> available
> [    0.880000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 3
> available
> [    0.890000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 4
> available
> [    0.890000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 5
> available
> [    0.900000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 6
> available
> [    0.910000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: Detected
> AR8337 switch
>
> #############################################################
>
> It seems, that your phy based test is not working on ar8334...
>
> Can we test other registers? I'll give it a try.
>
> Best
> Christian
Christian Mehlis April 27, 2015, 3:47 p.m. UTC | #2
Am 27.04.2015 um 15:06 schrieb Heiner Kallweit:
> Could you please provide te dmesg output of this patch version?

[    0.850000] switch0: Atheros AR833X rev. 2 switch registered on 
ag71xx-mdio.0
[    0.860000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 0 
available, BMSR = 0x7949
[    0.870000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 1 
available, BMSR = 0x7949
[    0.870000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 2 
available, BMSR = 0x7969
[    0.880000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 3 
available, BMSR = 0x7949
[    0.890000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 4 
available, BMSR = 0x7949
[    0.900000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 5 
available, BMSR = 0xffff
[    0.910000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: PHY 6 
available, BMSR = 0xffff
[    0.920000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: Detected 
AR8337 switch

Best
Christian
diff mbox

Patch

This patch tries to identify an AR8334/AR8335 by checking for non-existent PHYs.
I have systems with AR8327 only, the patch doesn't do any harm on them at least.
Could you please test this patch and provide the dmesg output?

Rgds, Heiner

---
 target/linux/generic/files/drivers/net/phy/ar8216.c |  8 ++++----
 target/linux/generic/files/drivers/net/phy/ar8216.h | 21 +++++++++++++++++++--
 target/linux/generic/files/drivers/net/phy/ar8327.c | 17 ++++++++++++++---
 3 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c
index e39d540..25bbfc2 100644
--- a/target/linux/generic/files/drivers/net/phy/ar8216.c
+++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
@@ -38,7 +38,7 @@ 
 #include "ar8216.h"
 
 extern const struct ar8xxx_chip ar8327_chip;
-extern const struct ar8xxx_chip ar8337_chip;
+extern const struct ar8xxx_chip ar833x_chip;
 
 #define AR8XXX_MIB_WORK_DELAY	2000 /* msecs */
 
@@ -1576,8 +1576,8 @@  ar8xxx_id_chip(struct ar8xxx_priv *priv)
 	case AR8XXX_VER_AR8327:
 		priv->chip = &ar8327_chip;
 		break;
-	case AR8XXX_VER_AR8337:
-		priv->chip = &ar8337_chip;
+	case AR8XXX_VER_AR833X:
+		priv->chip = &ar833x_chip;
 		break;
 	default:
 		pr_err("ar8216: Unknown Atheros device [ver=%d, rev=%d]\n",
@@ -1856,7 +1856,7 @@  ar8xxx_phy_config_aneg(struct phy_device *phydev)
 static const u32 ar8xxx_phy_ids[] = {
 	0x004dd033,
 	0x004dd034, /* AR8327 */
-	0x004dd036, /* AR8337 */
+	0x004dd036, /* AR833X */
 	0x004dd041,
 	0x004dd042,
 	0x004dd043, /* AR8236 */
diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.h b/target/linux/generic/files/drivers/net/phy/ar8216.h
--- a/target/linux/generic/files/drivers/net/phy/ar8216.h
+++ b/target/linux/generic/files/drivers/net/phy/ar8216.h
@@ -334,7 +334,7 @@  enum {
 	AR8XXX_VER_AR8236 = 0x03,
 	AR8XXX_VER_AR8316 = 0x10,
 	AR8XXX_VER_AR8327 = 0x12,
-	AR8XXX_VER_AR8337 = 0x13,
+	AR8XXX_VER_AR833X = 0x13,
 };
 
 #define AR8XXX_NUM_ARL_RECORDS	100
@@ -409,6 +409,8 @@  struct ar8xxx_priv {
 	void *chip_data;
 	bool initialized;
 	bool port4_phy;
+	bool unavailable_phys[AR8XXX_NUM_PHYS];
+	int num_unavailable_phys;
 	char buf[2048];
 	struct arl_entry arl_table[AR8XXX_NUM_ARL_RECORDS];
 	char arl_buf[AR8XXX_NUM_ARL_RECORDS * 32 + 256];
@@ -562,9 +564,24 @@  static inline bool chip_is_ar8327(struct ar8xxx_priv *priv)
 	return priv->chip_ver == AR8XXX_VER_AR8327;
 }
 
+static inline bool chip_is_ar833x(struct ar8xxx_priv *priv)
+{
+	return priv->chip_ver == AR8XXX_VER_AR833X;
+}
+
+static inline bool chip_is_ar8334(struct ar8xxx_priv *priv)
+{
+	return chip_is_ar833x(priv) && priv->num_unavailable_phys == 3;
+}
+
+static inline bool chip_is_ar8335(struct ar8xxx_priv *priv)
+{
+	return chip_is_ar833x(priv) && priv->num_unavailable_phys == 2;
+}
+
 static inline bool chip_is_ar8337(struct ar8xxx_priv *priv)
 {
-	return priv->chip_ver == AR8XXX_VER_AR8337;
+	return chip_is_ar833x(priv) && priv->num_unavailable_phys == 0;
 }
 
 static inline void
diff --git a/target/linux/generic/files/drivers/net/phy/ar8327.c b/target/linux/generic/files/drivers/net/phy/ar8327.c
--- a/target/linux/generic/files/drivers/net/phy/ar8327.c
+++ b/target/linux/generic/files/drivers/net/phy/ar8327.c
@@ -620,7 +620,21 @@  ar8327_hw_config_of(struct ar8xxx_priv *priv, struct device_node *np)
 static int
 ar8327_hw_init(struct ar8xxx_priv *priv)
 {
-	int ret;
+	int i, ret;
+
+	for (i = 0; i < AR8327_NUM_PORTS; i++) {
+		/* certain bits are always set if the PHY exists */
+		if (!mdiobus_read(priv->mii_bus, i, MII_BMSR)) {
+			priv->unavailable_phys[i] = true;
+			priv->num_unavailable_phys++;
+			dev_info(&priv->phy->dev, "PHY %d not available\n", i);
+		} else {
+			dev_info(&priv->phy->dev, "PHY %d available\n", i);
+		}
+	}
+	if (chip_is_ar833x(priv))
+                dev_info(&priv->phy->dev, "Detected AR833%d switch\n",
+                         AR8327_NUM_PORTS - priv->num_unavailable_phys);
 
 	priv->chip_data = kzalloc(sizeof(struct ar8327_data), GFP_KERNEL);
 	if (!priv->chip_data)
@@ -1201,12 +1215,12 @@  const struct ar8xxx_chip ar8327_chip = {
 	.mib_func = AR8327_REG_MIB_FUNC
 };
 
-const struct ar8xxx_chip ar8337_chip = {
+const struct ar8xxx_chip ar833x_chip = {
 	.caps = AR8XXX_CAP_GIGE | AR8XXX_CAP_MIB_COUNTERS,
 	.config_at_probe = true,
 	.mii_lo_first = true,
 
-	.name = "Atheros AR8337",
+	.name = "Atheros AR833X",
 	.ports = AR8327_NUM_PORTS,
 	.vlans = AR8X16_MAX_VLANS,
 	.swops = &ar8327_sw_ops,
-- 2.3.5