1/*-
2 * Copyright (c) 2011-2012 Stefan Bethke.
3 * Copyright (c) 2014 Adrian Chadd.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 * $FreeBSD$
28 */
29
30#include <sys/param.h>
31#include <sys/bus.h>
32#include <sys/errno.h>
33#include <sys/kernel.h>
34#include <sys/module.h>
35#include <sys/socket.h>
36#include <sys/sockio.h>
37#include <sys/sysctl.h>
38#include <sys/systm.h>
39
40#include <net/if.h>
41#include <net/if_arp.h>
42#include <net/ethernet.h>
43#include <net/if_dl.h>
44#include <net/if_media.h>
45#include <net/if_types.h>
46
47#include <machine/bus.h>
48#include <dev/iicbus/iic.h>
49#include <dev/iicbus/iiconf.h>
50#include <dev/iicbus/iicbus.h>
51#include <dev/mii/mii.h>
52#include <dev/mii/miivar.h>
53#include <dev/mdio/mdio.h>
54
55#include <dev/etherswitch/etherswitch.h>
56
57#include <dev/etherswitch/arswitch/arswitchreg.h>
58#include <dev/etherswitch/arswitch/arswitchvar.h>
59#include <dev/etherswitch/arswitch/arswitch_reg.h>
60#include <dev/etherswitch/arswitch/arswitch_phy.h>
61#include <dev/etherswitch/arswitch/arswitch_vlans.h>
62
63#include <dev/etherswitch/arswitch/arswitch_8327.h>
64
65#include "mdio_if.h"
66#include "miibus_if.h"
67#include "etherswitch_if.h"
68
69/*
70 * AR8327 TODO:
71 *
72 * There should be a default hardware setup hint set for the default
73 * switch config.  Otherwise the default is "all ports in one vlangroup",
74 * which means both CPU ports can see each other and that will quickly
75 * lead to traffic storms/loops.
76 */
77
78static int
79ar8327_vlan_op(struct arswitch_softc *sc, uint32_t op, uint32_t vid,
80    uint32_t data)
81{
82	int err;
83
84	/*
85	 * Wait for the "done" bit to finish.
86	 */
87	if (arswitch_waitreg(sc->sc_dev, AR8327_REG_VTU_FUNC1,
88	    AR8327_VTU_FUNC1_BUSY, 0, 5))
89		return (EBUSY);
90
91	/*
92	 * If it's a "load" operation, then ensure 'data' is loaded
93	 * in first.
94	 */
95	if ((op & AR8327_VTU_FUNC1_OP) == AR8327_VTU_FUNC1_OP_LOAD) {
96		err = arswitch_writereg(sc->sc_dev, AR8327_REG_VTU_FUNC0, data);
97		if (err)
98			return (err);
99	}
100
101	/*
102	 * Set the VID.
103	 */
104	op |= ((vid & 0xfff) << AR8327_VTU_FUNC1_VID_S);
105
106	/*
107	 * Set busy bit to start loading in the command.
108	 */
109	op |= AR8327_VTU_FUNC1_BUSY;
110	arswitch_writereg(sc->sc_dev, AR8327_REG_VTU_FUNC1, op);
111
112	/*
113	 * Finally - wait for it to load.
114	 */
115	if (arswitch_waitreg(sc->sc_dev, AR8327_REG_VTU_FUNC1,
116	    AR8327_VTU_FUNC1_BUSY, 0, 5))
117		return (EBUSY);
118
119	return (0);
120}
121
122static void
123ar8327_phy_fixup(struct arswitch_softc *sc, int phy)
124{
125	if (bootverbose)
126		device_printf(sc->sc_dev,
127		    "%s: called; phy=%d; chiprev=%d\n", __func__,
128		    phy,
129		    sc->chip_rev);
130	switch (sc->chip_rev) {
131	case 1:
132		/* For 100M waveform */
133		arswitch_writedbg(sc->sc_dev, phy, 0, 0x02ea);
134		/* Turn on Gigabit clock */
135		arswitch_writedbg(sc->sc_dev, phy, 0x3d, 0x68a0);
136		break;
137
138	case 2:
139		arswitch_writemmd(sc->sc_dev, phy, 0x7, 0x3c);
140		arswitch_writemmd(sc->sc_dev, phy, 0x4007, 0x0);
141		/* fallthrough */
142	case 4:
143		arswitch_writemmd(sc->sc_dev, phy, 0x3, 0x800d);
144		arswitch_writemmd(sc->sc_dev, phy, 0x4003, 0x803f);
145
146		arswitch_writedbg(sc->sc_dev, phy, 0x3d, 0x6860);
147		arswitch_writedbg(sc->sc_dev, phy, 0x5, 0x2c46);
148		arswitch_writedbg(sc->sc_dev, phy, 0x3c, 0x6000);
149		break;
150	}
151}
152
153static uint32_t
154ar8327_get_pad_cfg(struct ar8327_pad_cfg *cfg)
155{
156	uint32_t t;
157
158	if (!cfg)
159		return (0);
160
161	t = 0;
162	switch (cfg->mode) {
163	case AR8327_PAD_NC:
164		break;
165
166	case AR8327_PAD_MAC2MAC_MII:
167		t = AR8327_PAD_MAC_MII_EN;
168		if (cfg->rxclk_sel)
169			t |= AR8327_PAD_MAC_MII_RXCLK_SEL;
170		if (cfg->txclk_sel)
171			t |= AR8327_PAD_MAC_MII_TXCLK_SEL;
172		break;
173
174	case AR8327_PAD_MAC2MAC_GMII:
175		t = AR8327_PAD_MAC_GMII_EN;
176		if (cfg->rxclk_sel)
177			t |= AR8327_PAD_MAC_GMII_RXCLK_SEL;
178		if (cfg->txclk_sel)
179			t |= AR8327_PAD_MAC_GMII_TXCLK_SEL;
180		break;
181
182	case AR8327_PAD_MAC_SGMII:
183		t = AR8327_PAD_SGMII_EN;
184
185		/*
186		 * WAR for the Qualcomm Atheros AP136 board.
187		 * It seems that RGMII TX/RX delay settings needs to be
188		 * applied for SGMII mode as well, The ethernet is not
189		 * reliable without this.
190		 */
191		t |= cfg->txclk_delay_sel << AR8327_PAD_RGMII_TXCLK_DELAY_SEL_S;
192		t |= cfg->rxclk_delay_sel << AR8327_PAD_RGMII_RXCLK_DELAY_SEL_S;
193		if (cfg->rxclk_delay_en)
194			t |= AR8327_PAD_RGMII_RXCLK_DELAY_EN;
195		if (cfg->txclk_delay_en)
196			t |= AR8327_PAD_RGMII_TXCLK_DELAY_EN;
197
198		if (cfg->sgmii_delay_en)
199			t |= AR8327_PAD_SGMII_DELAY_EN;
200
201		break;
202
203	case AR8327_PAD_MAC2PHY_MII:
204		t = AR8327_PAD_PHY_MII_EN;
205		if (cfg->rxclk_sel)
206			t |= AR8327_PAD_PHY_MII_RXCLK_SEL;
207		if (cfg->txclk_sel)
208			t |= AR8327_PAD_PHY_MII_TXCLK_SEL;
209		break;
210
211	case AR8327_PAD_MAC2PHY_GMII:
212		t = AR8327_PAD_PHY_GMII_EN;
213		if (cfg->pipe_rxclk_sel)
214			t |= AR8327_PAD_PHY_GMII_PIPE_RXCLK_SEL;
215		if (cfg->rxclk_sel)
216			t |= AR8327_PAD_PHY_GMII_RXCLK_SEL;
217		if (cfg->txclk_sel)
218			t |= AR8327_PAD_PHY_GMII_TXCLK_SEL;
219		break;
220
221	case AR8327_PAD_MAC_RGMII:
222		t = AR8327_PAD_RGMII_EN;
223		t |= cfg->txclk_delay_sel << AR8327_PAD_RGMII_TXCLK_DELAY_SEL_S;
224		t |= cfg->rxclk_delay_sel << AR8327_PAD_RGMII_RXCLK_DELAY_SEL_S;
225		if (cfg->rxclk_delay_en)
226			t |= AR8327_PAD_RGMII_RXCLK_DELAY_EN;
227		if (cfg->txclk_delay_en)
228			t |= AR8327_PAD_RGMII_TXCLK_DELAY_EN;
229		break;
230
231	case AR8327_PAD_PHY_GMII:
232		t = AR8327_PAD_PHYX_GMII_EN;
233		break;
234
235	case AR8327_PAD_PHY_RGMII:
236		t = AR8327_PAD_PHYX_RGMII_EN;
237		break;
238
239	case AR8327_PAD_PHY_MII:
240		t = AR8327_PAD_PHYX_MII_EN;
241		break;
242	}
243
244	return (t);
245}
246
247/*
248 * Map the hard-coded port config from the switch setup to
249 * the chipset port config (status, duplex, flow, etc.)
250 */
251static uint32_t
252ar8327_get_port_init_status(struct ar8327_port_cfg *cfg)
253{
254	uint32_t t;
255
256	if (!cfg->force_link)
257		return (AR8X16_PORT_STS_LINK_AUTO);
258
259	t = AR8X16_PORT_STS_TXMAC | AR8X16_PORT_STS_RXMAC;
260	t |= cfg->duplex ? AR8X16_PORT_STS_DUPLEX : 0;
261	t |= cfg->rxpause ? AR8X16_PORT_STS_RXFLOW : 0;
262	t |= cfg->txpause ? AR8X16_PORT_STS_TXFLOW : 0;
263
264	switch (cfg->speed) {
265	case AR8327_PORT_SPEED_10:
266		t |= AR8X16_PORT_STS_SPEED_10;
267		break;
268	case AR8327_PORT_SPEED_100:
269		t |= AR8X16_PORT_STS_SPEED_100;
270		break;
271	case AR8327_PORT_SPEED_1000:
272		t |= AR8X16_PORT_STS_SPEED_1000;
273		break;
274	}
275
276	return (t);
277}
278
279/*
280 * Fetch the port data for the given port.
281 *
282 * This goes and does dirty things with the hints space
283 * to determine what the configuration parameters should be.
284 *
285 * Returns 1 if the structure was successfully parsed and
286 * the contents are valid; 0 otherwise.
287 */
288static int
289ar8327_fetch_pdata_port(struct arswitch_softc *sc,
290    struct ar8327_port_cfg *pcfg,
291    int port)
292{
293	int val;
294	char sbuf[128];
295
296	/* Check if force_link exists */
297	val = 0;
298	snprintf(sbuf, 128, "port.%d.force_link", port);
299	(void) resource_int_value(device_get_name(sc->sc_dev),
300	    device_get_unit(sc->sc_dev),
301	    sbuf, &val);
302	if (val != 1)
303		return (0);
304	pcfg->force_link = 1;
305
306	/* force_link is set; let's parse the rest of the fields */
307	snprintf(sbuf, 128, "port.%d.speed", port);
308	if (resource_int_value(device_get_name(sc->sc_dev),
309	    device_get_unit(sc->sc_dev),
310	    sbuf, &val) == 0) {
311		switch (val) {
312		case 10:
313			pcfg->speed = AR8327_PORT_SPEED_10;
314			break;
315		case 100:
316			pcfg->speed = AR8327_PORT_SPEED_100;
317			break;
318		case 1000:
319			pcfg->speed = AR8327_PORT_SPEED_1000;
320			break;
321		default:
322			device_printf(sc->sc_dev,
323			    "%s: invalid port %d duplex value (%d)\n",
324			    __func__,
325			    port,
326			    val);
327			return (0);
328		}
329	}
330
331	snprintf(sbuf, 128, "port.%d.duplex", port);
332	if (resource_int_value(device_get_name(sc->sc_dev),
333	    device_get_unit(sc->sc_dev),
334	    sbuf, &val) == 0)
335		pcfg->duplex = val;
336
337	snprintf(sbuf, 128, "port.%d.txpause", port);
338	if (resource_int_value(device_get_name(sc->sc_dev),
339	    device_get_unit(sc->sc_dev),
340	    sbuf, &val) == 0)
341		pcfg->txpause = val;
342
343	snprintf(sbuf, 128, "port.%d.rxpause", port);
344	if (resource_int_value(device_get_name(sc->sc_dev),
345	    device_get_unit(sc->sc_dev),
346	    sbuf, &val) == 0)
347		pcfg->rxpause = val;
348
349#if 1
350	device_printf(sc->sc_dev,
351	    "%s: port %d: speed=%d, duplex=%d, txpause=%d, rxpause=%d\n",
352	    __func__,
353	    port,
354	    pcfg->speed,
355	    pcfg->duplex,
356	    pcfg->txpause,
357	    pcfg->rxpause);
358#endif
359
360	return (1);
361}
362
363/*
364 * Parse the pad configuration from the boot hints.
365 *
366 * The (mostly optional) fields are:
367 *
368 * uint32_t mode;
369 * uint32_t rxclk_sel;
370 * uint32_t txclk_sel;
371 * uint32_t txclk_delay_sel;
372 * uint32_t rxclk_delay_sel;
373 * uint32_t txclk_delay_en;
374 * uint32_t rxclk_delay_en;
375 * uint32_t sgmii_delay_en;
376 * uint32_t pipe_rxclk_sel;
377 *
378 * If mode isn't in the hints, 0 is returned.
379 * Else the structure is fleshed out and 1 is returned.
380 */
381static int
382ar8327_fetch_pdata_pad(struct arswitch_softc *sc,
383    struct ar8327_pad_cfg *pc,
384    int pad)
385{
386	int val;
387	char sbuf[128];
388
389	/* Check if mode exists */
390	val = 0;
391	snprintf(sbuf, 128, "pad.%d.mode", pad);
392	if (resource_int_value(device_get_name(sc->sc_dev),
393	    device_get_unit(sc->sc_dev),
394	    sbuf, &val) != 0)
395		return (0);
396
397	/* assume that 'mode' exists and was found */
398	pc->mode = val;
399
400	snprintf(sbuf, 128, "pad.%d.rxclk_sel", pad);
401	if (resource_int_value(device_get_name(sc->sc_dev),
402	    device_get_unit(sc->sc_dev),
403	    sbuf, &val) == 0)
404		pc->rxclk_sel = val;
405
406	snprintf(sbuf, 128, "pad.%d.txclk_sel", pad);
407	if (resource_int_value(device_get_name(sc->sc_dev),
408	    device_get_unit(sc->sc_dev),
409	    sbuf, &val) == 0)
410		pc->txclk_sel = val;
411
412	snprintf(sbuf, 128, "pad.%d.txclk_delay_sel", pad);
413	if (resource_int_value(device_get_name(sc->sc_dev),
414	    device_get_unit(sc->sc_dev),
415	    sbuf, &val) == 0)
416		pc->txclk_delay_sel = val;
417
418	snprintf(sbuf, 128, "pad.%d.rxclk_delay_sel", pad);
419	if (resource_int_value(device_get_name(sc->sc_dev),
420	    device_get_unit(sc->sc_dev),
421	    sbuf, &val) == 0)
422		pc->rxclk_delay_sel = val;
423
424	snprintf(sbuf, 128, "pad.%d.txclk_delay_en", pad);
425	if (resource_int_value(device_get_name(sc->sc_dev),
426	    device_get_unit(sc->sc_dev),
427	    sbuf, &val) == 0)
428		pc->txclk_delay_en = val;
429
430	snprintf(sbuf, 128, "pad.%d.rxclk_delay_en", pad);
431	if (resource_int_value(device_get_name(sc->sc_dev),
432	    device_get_unit(sc->sc_dev),
433	    sbuf, &val) == 0)
434		pc->rxclk_delay_en = val;
435
436	snprintf(sbuf, 128, "pad.%d.sgmii_delay_en", pad);
437	if (resource_int_value(device_get_name(sc->sc_dev),
438	    device_get_unit(sc->sc_dev),
439	    sbuf, &val) == 0)
440		pc->sgmii_delay_en = val;
441
442	snprintf(sbuf, 128, "pad.%d.pipe_rxclk_sel", pad);
443	if (resource_int_value(device_get_name(sc->sc_dev),
444	    device_get_unit(sc->sc_dev),
445	    sbuf, &val) == 0)
446		pc->pipe_rxclk_sel = val;
447
448	if (bootverbose) {
449		device_printf(sc->sc_dev,
450		    "%s: pad %d: mode=%d, rxclk_sel=%d, txclk_sel=%d, "
451		    "txclk_delay_sel=%d, rxclk_delay_sel=%d, txclk_delay_en=%d, "
452		    "rxclk_enable_en=%d, sgmii_delay_en=%d, pipe_rxclk_sel=%d\n",
453		    __func__,
454		    pad,
455		    pc->mode,
456		    pc->rxclk_sel,
457		    pc->txclk_sel,
458		    pc->txclk_delay_sel,
459		    pc->rxclk_delay_sel,
460		    pc->txclk_delay_en,
461		    pc->rxclk_delay_en,
462		    pc->sgmii_delay_en,
463		    pc->pipe_rxclk_sel);
464	}
465
466	return (1);
467}
468
469/*
470 * Fetch the SGMII configuration block from the boot hints.
471 */
472static int
473ar8327_fetch_pdata_sgmii(struct arswitch_softc *sc,
474    struct ar8327_sgmii_cfg *scfg)
475{
476	int val;
477
478	/* sgmii_ctrl */
479	val = 0;
480	if (resource_int_value(device_get_name(sc->sc_dev),
481	    device_get_unit(sc->sc_dev),
482	    "sgmii.ctrl", &val) != 0)
483		return (0);
484	scfg->sgmii_ctrl = val;
485
486	/* serdes_aen */
487	val = 0;
488	if (resource_int_value(device_get_name(sc->sc_dev),
489	    device_get_unit(sc->sc_dev),
490	    "sgmii.serdes_aen", &val) != 0)
491		return (0);
492	scfg->serdes_aen = val;
493
494	return (1);
495}
496
497/*
498 * Fetch the LED configuration from the boot hints.
499 */
500static int
501ar8327_fetch_pdata_led(struct arswitch_softc *sc,
502    struct ar8327_led_cfg *lcfg)
503{
504	int val;
505
506	val = 0;
507	if (resource_int_value(device_get_name(sc->sc_dev),
508	    device_get_unit(sc->sc_dev),
509	    "led.ctrl0", &val) != 0)
510		return (0);
511	lcfg->led_ctrl0 = val;
512
513	val = 0;
514	if (resource_int_value(device_get_name(sc->sc_dev),
515	    device_get_unit(sc->sc_dev),
516	    "led.ctrl1", &val) != 0)
517		return (0);
518	lcfg->led_ctrl1 = val;
519
520	val = 0;
521	if (resource_int_value(device_get_name(sc->sc_dev),
522	    device_get_unit(sc->sc_dev),
523	    "led.ctrl2", &val) != 0)
524		return (0);
525	lcfg->led_ctrl2 = val;
526
527	val = 0;
528	if (resource_int_value(device_get_name(sc->sc_dev),
529	    device_get_unit(sc->sc_dev),
530	    "led.ctrl3", &val) != 0)
531		return (0);
532	lcfg->led_ctrl3 = val;
533
534	val = 0;
535	if (resource_int_value(device_get_name(sc->sc_dev),
536	    device_get_unit(sc->sc_dev),
537	    "led.open_drain", &val) != 0)
538		return (0);
539	lcfg->open_drain = val;
540
541	return (1);
542}
543
544/*
545 * Initialise the ar8327 specific hardware features from
546 * the hints provided in the boot environment.
547 */
548static int
549ar8327_init_pdata(struct arswitch_softc *sc)
550{
551	struct ar8327_pad_cfg pc;
552	struct ar8327_port_cfg port_cfg;
553	struct ar8327_sgmii_cfg scfg;
554	struct ar8327_led_cfg lcfg;
555	uint32_t t, new_pos, pos;
556
557	/* Port 0 */
558	bzero(&port_cfg, sizeof(port_cfg));
559	sc->ar8327.port0_status = 0;
560	if (ar8327_fetch_pdata_port(sc, &port_cfg, 0))
561		sc->ar8327.port0_status = ar8327_get_port_init_status(&port_cfg);
562
563	/* Port 6 */
564	bzero(&port_cfg, sizeof(port_cfg));
565	sc->ar8327.port6_status = 0;
566	if (ar8327_fetch_pdata_port(sc, &port_cfg, 6))
567		sc->ar8327.port6_status = ar8327_get_port_init_status(&port_cfg);
568
569	/* Pad 0 */
570	bzero(&pc, sizeof(pc));
571	t = 0;
572	if (ar8327_fetch_pdata_pad(sc, &pc, 0))
573		t = ar8327_get_pad_cfg(&pc);
574#if 0
575		if (AR8X16_IS_SWITCH(sc, AR8337))
576			t |= AR8337_PAD_MAC06_EXCHANGE_EN;
577#endif
578	arswitch_writereg(sc->sc_dev, AR8327_REG_PAD0_MODE, t);
579
580	/* Pad 5 */
581	bzero(&pc, sizeof(pc));
582	t = 0;
583	if (ar8327_fetch_pdata_pad(sc, &pc, 5))
584		t = ar8327_get_pad_cfg(&pc);
585	arswitch_writereg(sc->sc_dev, AR8327_REG_PAD5_MODE, t);
586
587	/* Pad 6 */
588	bzero(&pc, sizeof(pc));
589	t = 0;
590	if (ar8327_fetch_pdata_pad(sc, &pc, 6))
591		t = ar8327_get_pad_cfg(&pc);
592	arswitch_writereg(sc->sc_dev, AR8327_REG_PAD6_MODE, t);
593
594	pos = arswitch_readreg(sc->sc_dev, AR8327_REG_POWER_ON_STRIP);
595	new_pos = pos;
596
597	/* XXX LED config */
598	bzero(&lcfg, sizeof(lcfg));
599	if (ar8327_fetch_pdata_led(sc, &lcfg)) {
600		if (lcfg.open_drain)
601			new_pos |= AR8327_POWER_ON_STRIP_LED_OPEN_EN;
602		else
603			new_pos &= ~AR8327_POWER_ON_STRIP_LED_OPEN_EN;
604
605		arswitch_writereg(sc->sc_dev, AR8327_REG_LED_CTRL0,
606		    lcfg.led_ctrl0);
607		arswitch_writereg(sc->sc_dev, AR8327_REG_LED_CTRL1,
608		    lcfg.led_ctrl1);
609		arswitch_writereg(sc->sc_dev, AR8327_REG_LED_CTRL2,
610		    lcfg.led_ctrl2);
611		arswitch_writereg(sc->sc_dev, AR8327_REG_LED_CTRL3,
612		    lcfg.led_ctrl3);
613
614		if (new_pos != pos)
615			new_pos |= AR8327_POWER_ON_STRIP_POWER_ON_SEL;
616	}
617
618	/* SGMII config */
619	bzero(&scfg, sizeof(scfg));
620	if (ar8327_fetch_pdata_sgmii(sc, &scfg)) {
621		device_printf(sc->sc_dev, "%s: SGMII cfg?\n", __func__);
622		t = scfg.sgmii_ctrl;
623		if (sc->chip_rev == 1)
624			t |= AR8327_SGMII_CTRL_EN_PLL |
625			    AR8327_SGMII_CTRL_EN_RX |
626			    AR8327_SGMII_CTRL_EN_TX;
627		else
628			t &= ~(AR8327_SGMII_CTRL_EN_PLL |
629			    AR8327_SGMII_CTRL_EN_RX |
630			    AR8327_SGMII_CTRL_EN_TX);
631
632		arswitch_writereg(sc->sc_dev, AR8327_REG_SGMII_CTRL, t);
633
634		if (scfg.serdes_aen)
635			new_pos &= ~AR8327_POWER_ON_STRIP_SERDES_AEN;
636		else
637			new_pos |= AR8327_POWER_ON_STRIP_SERDES_AEN;
638	}
639
640	arswitch_writereg(sc->sc_dev, AR8327_REG_POWER_ON_STRIP, new_pos);
641
642	return (0);
643}
644
645static int
646ar8327_hw_setup(struct arswitch_softc *sc)
647{
648	int i;
649	int err;
650
651	/* pdata fetch and setup */
652	err = ar8327_init_pdata(sc);
653	if (err != 0)
654		return (err);
655
656	/* XXX init leds */
657
658	for (i = 0; i < AR8327_NUM_PHYS; i++) {
659		/* phy fixup */
660		ar8327_phy_fixup(sc, i);
661
662		/* start PHY autonegotiation? */
663		/* XXX is this done as part of the normal PHY setup? */
664
665	}
666
667	/* Let things settle */
668	DELAY(1000);
669
670	return (0);
671}
672
673/*
674 * Initialise other global values, for the AR8327.
675 */
676static int
677ar8327_hw_global_setup(struct arswitch_softc *sc)
678{
679	uint32_t t;
680
681	/* enable CPU port and disable mirror port */
682	t = AR8327_FWD_CTRL0_CPU_PORT_EN |
683	    AR8327_FWD_CTRL0_MIRROR_PORT;
684	arswitch_writereg(sc->sc_dev, AR8327_REG_FWD_CTRL0, t);
685
686	/* forward multicast and broadcast frames to CPU */
687	t = (AR8327_PORTS_ALL << AR8327_FWD_CTRL1_UC_FLOOD_S) |
688	    (AR8327_PORTS_ALL << AR8327_FWD_CTRL1_MC_FLOOD_S) |
689	    (AR8327_PORTS_ALL << AR8327_FWD_CTRL1_BC_FLOOD_S);
690	arswitch_writereg(sc->sc_dev, AR8327_REG_FWD_CTRL1, t);
691
692	/* enable jumbo frames */
693	/* XXX need to macro-shift the value! */
694	arswitch_modifyreg(sc->sc_dev, AR8327_REG_MAX_FRAME_SIZE,
695	    AR8327_MAX_FRAME_SIZE_MTU, 9018 + 8 + 2);
696
697	/* Enable MIB counters */
698	arswitch_modifyreg(sc->sc_dev, AR8327_REG_MODULE_EN,
699	    AR8327_MODULE_EN_MIB, AR8327_MODULE_EN_MIB);
700
701	/* Disable EEE on all ports due to stability issues */
702	t = arswitch_readreg(sc->sc_dev, AR8327_REG_EEE_CTRL);
703	t |= AR8327_EEE_CTRL_DISABLE_PHY(0) |
704	    AR8327_EEE_CTRL_DISABLE_PHY(1) |
705	    AR8327_EEE_CTRL_DISABLE_PHY(2) |
706	    AR8327_EEE_CTRL_DISABLE_PHY(3) |
707	    AR8327_EEE_CTRL_DISABLE_PHY(4);
708	arswitch_writereg(sc->sc_dev, AR8327_REG_EEE_CTRL, t);
709
710	/* Set the right number of ports */
711	/* GMAC0 (CPU), GMAC1..5 (PHYs), GMAC6 (CPU) */
712	sc->info.es_nports = 7;
713
714	return (0);
715}
716
717/*
718 * Port setup.  Called at attach time.
719 */
720static void
721ar8327_port_init(struct arswitch_softc *sc, int port)
722{
723	uint32_t t;
724	int ports;
725
726	/* For now, port can see all other ports */
727	ports = 0x7f;
728
729	if (port == AR8X16_PORT_CPU)
730		t = sc->ar8327.port0_status;
731	else if (port == 6)
732		t = sc->ar8327.port6_status;
733        else
734		t = AR8X16_PORT_STS_LINK_AUTO;
735
736	arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_STATUS(port), t);
737	arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_HEADER(port), 0);
738
739	/*
740	 * Default to 1 port group.
741	 */
742	t = 1 << AR8327_PORT_VLAN0_DEF_SVID_S;
743	t |= 1 << AR8327_PORT_VLAN0_DEF_CVID_S;
744	arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_VLAN0(port), t);
745
746	t = AR8327_PORT_VLAN1_OUT_MODE_UNTOUCH << AR8327_PORT_VLAN1_OUT_MODE_S;
747	arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_VLAN1(port), t);
748
749	/*
750	 * This doesn't configure any ports which this port can "see".
751	 * bits 0-6 control which ports a frame coming into this port
752	 * can be sent out to.
753	 *
754	 * So by doing this, we're making it impossible to send frames out
755	 * to that port.
756	 */
757	t = AR8327_PORT_LOOKUP_LEARN;
758	t |= AR8X16_PORT_CTRL_STATE_FORWARD << AR8327_PORT_LOOKUP_STATE_S;
759
760	/* So this allows traffic to any port except ourselves */
761	t |= (ports & ~(1 << port));
762	arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_LOOKUP(port), t);
763}
764
765static int
766ar8327_port_vlan_setup(struct arswitch_softc *sc, etherswitch_port_t *p)
767{
768
769	/* Check: ADDTAG/STRIPTAG - exclusive */
770
771	ARSWITCH_LOCK(sc);
772
773	/* Set the PVID. */
774	if (p->es_pvid != 0)
775		sc->hal.arswitch_vlan_set_pvid(sc, p->es_port, p->es_pvid);
776
777	/*
778	 * DOUBLE_TAG
779	 * VLAN_MODE_ADD
780	 * VLAN_MODE_STRIP
781	 */
782	ARSWITCH_UNLOCK(sc);
783	return (0);
784}
785
786/*
787 * Get the port VLAN configuration.
788 */
789static int
790ar8327_port_vlan_get(struct arswitch_softc *sc, etherswitch_port_t *p)
791{
792
793	ARSWITCH_LOCK(sc);
794
795	/* Retrieve the PVID */
796	sc->hal.arswitch_vlan_get_pvid(sc, p->es_port, &p->es_pvid);
797
798	/* Retrieve the current port configuration from the VTU */
799	/*
800	 * DOUBLE_TAG
801	 * VLAN_MODE_ADD
802	 * VLAN_MODE_STRIP
803	 */
804
805	ARSWITCH_UNLOCK(sc);
806	return (0);
807}
808
809static void
810ar8327_port_disable_mirror(struct arswitch_softc *sc, int port)
811{
812
813	arswitch_modifyreg(sc->sc_dev,
814	    AR8327_REG_PORT_LOOKUP(port),
815	    AR8327_PORT_LOOKUP_ING_MIRROR_EN,
816	    0);
817	arswitch_modifyreg(sc->sc_dev,
818	    AR8327_REG_PORT_HOL_CTRL1(port),
819	    AR8327_PORT_HOL_CTRL1_EG_MIRROR_EN,
820	    0);
821}
822
823static void
824ar8327_reset_vlans(struct arswitch_softc *sc)
825{
826	int i;
827	uint32_t t;
828	int ports;
829
830	ARSWITCH_LOCK_ASSERT(sc, MA_NOTOWNED);
831	ARSWITCH_LOCK(sc);
832
833	/* Clear the existing VLAN configuration */
834	memset(sc->vid, 0, sizeof(sc->vid));
835
836	/*
837	 * Disable mirroring.
838	 */
839	arswitch_modifyreg(sc->sc_dev, AR8327_REG_FWD_CTRL0,
840	    AR8327_FWD_CTRL0_MIRROR_PORT,
841	    (0xF << AR8327_FWD_CTRL0_MIRROR_PORT_S));
842
843	/*
844	 * XXX TODO: disable any Q-in-Q port configuration,
845	 * tagging, egress filters, etc.
846	 */
847
848	/*
849	 * For now, let's default to one portgroup, just so traffic
850	 * flows.  All ports can see other ports. There are two CPU GMACs
851	 * (GMAC0, GMAC6), GMAC1..GMAC5 are external PHYs.
852	 *
853	 * (ETHERSWITCH_VLAN_PORT)
854	 */
855	ports = 0x7f;
856
857	/*
858	 * XXX TODO: set things up correctly for vlans!
859	 */
860	for (i = 0; i < AR8327_NUM_PORTS; i++) {
861		int egress, ingress;
862
863		if (sc->vlan_mode == ETHERSWITCH_VLAN_PORT) {
864			sc->vid[i] = i | ETHERSWITCH_VID_VALID;
865			/* set egress == out_keep */
866			ingress = AR8X16_PORT_VLAN_MODE_PORT_ONLY;
867			/* in_port_only, forward */
868			egress = AR8327_PORT_VLAN1_OUT_MODE_UNTOUCH;
869		} else if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q) {
870			ingress = AR8X16_PORT_VLAN_MODE_SECURE;
871			egress = AR8327_PORT_VLAN1_OUT_MODE_UNMOD;
872		} else {
873			/* set egress == out_keep */
874			ingress = AR8X16_PORT_VLAN_MODE_PORT_ONLY;
875			/* in_port_only, forward */
876			egress = AR8327_PORT_VLAN1_OUT_MODE_UNTOUCH;
877		}
878
879		/* set pvid = 1; there's only one vlangroup to start with */
880		t = 1 << AR8327_PORT_VLAN0_DEF_SVID_S;
881		t |= 1 << AR8327_PORT_VLAN0_DEF_CVID_S;
882		arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_VLAN0(i), t);
883
884		t = AR8327_PORT_VLAN1_PORT_VLAN_PROP;
885		t |= egress << AR8327_PORT_VLAN1_OUT_MODE_S;
886		arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_VLAN1(i), t);
887
888		/* Ports can see other ports */
889		/* XXX not entirely true for dot1q? */
890		t = (ports & ~(1 << i));	/* all ports besides us */
891		t |= AR8327_PORT_LOOKUP_LEARN;
892
893		t |= ingress << AR8327_PORT_LOOKUP_IN_MODE_S;
894		t |= AR8X16_PORT_CTRL_STATE_FORWARD << AR8327_PORT_LOOKUP_STATE_S;
895		arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_LOOKUP(i), t);
896	}
897
898	/*
899	 * Disable port mirroring entirely.
900	 */
901	for (i = 0; i < AR8327_NUM_PORTS; i++) {
902		ar8327_port_disable_mirror(sc, i);
903	}
904
905	/*
906	 * If dot1q - set pvid; dot1q, etc.
907	 */
908	if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q) {
909		sc->vid[0] = 1;
910		for (i = 0; i < AR8327_NUM_PORTS; i++) {
911			/* Each port - pvid 1 */
912			sc->hal.arswitch_vlan_set_pvid(sc, i, sc->vid[0]);
913		}
914		/* Initialise vlan1 - all ports, untagged */
915		sc->hal.arswitch_set_dot1q_vlan(sc, ports, ports, sc->vid[0]);
916		sc->vid[0] |= ETHERSWITCH_VID_VALID;
917	}
918
919	ARSWITCH_UNLOCK(sc);
920}
921
922static int
923ar8327_vlan_get_port(struct arswitch_softc *sc, uint32_t *ports, int vid)
924{
925	int port;
926	uint32_t reg;
927
928	ARSWITCH_LOCK_ASSERT(sc, MA_OWNED);
929
930	/* For port based vlans the vlanid is the same as the port index. */
931	port = vid & ETHERSWITCH_VID_MASK;
932	reg = arswitch_readreg(sc->sc_dev, AR8327_REG_PORT_LOOKUP(port));
933	*ports = reg & 0x7f;
934	return (0);
935}
936
937static int
938ar8327_vlan_set_port(struct arswitch_softc *sc, uint32_t ports, int vid)
939{
940	int err, port;
941
942	ARSWITCH_LOCK_ASSERT(sc, MA_OWNED);
943
944	/* For port based vlans the vlanid is the same as the port index. */
945	port = vid & ETHERSWITCH_VID_MASK;
946
947	err = arswitch_modifyreg(sc->sc_dev, AR8327_REG_PORT_LOOKUP(port),
948	    0x7f, /* vlan membership mask */
949	    (ports & 0x7f));
950
951	if (err)
952		return (err);
953	return (0);
954}
955
956static int
957ar8327_vlan_getvgroup(struct arswitch_softc *sc, etherswitch_vlangroup_t *vg)
958{
959
960	return (ar8xxx_getvgroup(sc, vg));
961}
962
963static int
964ar8327_vlan_setvgroup(struct arswitch_softc *sc, etherswitch_vlangroup_t *vg)
965{
966
967	return (ar8xxx_setvgroup(sc, vg));
968}
969
970static int
971ar8327_get_pvid(struct arswitch_softc *sc, int port, int *pvid)
972{
973	uint32_t reg;
974
975	ARSWITCH_LOCK_ASSERT(sc, MA_OWNED);
976
977	/*
978	 * XXX for now, assuming it's CVID; likely very wrong!
979	 */
980	port = port & ETHERSWITCH_VID_MASK;
981	reg = arswitch_readreg(sc->sc_dev, AR8327_REG_PORT_VLAN0(port));
982	reg = reg >> AR8327_PORT_VLAN0_DEF_CVID_S;
983	reg = reg & 0xfff;
984
985	*pvid = reg;
986	return (0);
987}
988
989static int
990ar8327_set_pvid(struct arswitch_softc *sc, int port, int pvid)
991{
992	uint32_t t;
993
994	/* Limit pvid to valid values */
995	pvid &= 0x7f;
996
997	t = pvid << AR8327_PORT_VLAN0_DEF_SVID_S;
998	t |= pvid << AR8327_PORT_VLAN0_DEF_CVID_S;
999	arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_VLAN0(port), t);
1000
1001	return (0);
1002}
1003
1004static int
1005ar8327_atu_flush(struct arswitch_softc *sc)
1006{
1007
1008	int ret;
1009
1010	ret = arswitch_waitreg(sc->sc_dev,
1011	    AR8327_REG_ATU_FUNC,
1012	    AR8327_ATU_FUNC_BUSY,
1013	    0,
1014	    1000);
1015
1016	if (ret)
1017		device_printf(sc->sc_dev, "%s: waitreg failed\n", __func__);
1018
1019	if (!ret)
1020		arswitch_writereg(sc->sc_dev,
1021		    AR8327_REG_ATU_FUNC,
1022		    AR8327_ATU_FUNC_OP_FLUSH);
1023	return (ret);
1024}
1025
1026static int
1027ar8327_flush_dot1q_vlan(struct arswitch_softc *sc)
1028{
1029
1030	return (ar8327_vlan_op(sc, AR8327_VTU_FUNC1_OP_FLUSH, 0, 0));
1031}
1032
1033static int
1034ar8327_purge_dot1q_vlan(struct arswitch_softc *sc, int vid)
1035{
1036
1037	return (ar8327_vlan_op(sc, AR8327_VTU_FUNC1_OP_PURGE, vid, 0));
1038}
1039
1040static int
1041ar8327_get_dot1q_vlan(struct arswitch_softc *sc, uint32_t *ports,
1042    uint32_t *untagged_ports, int vid)
1043{
1044	int i, r;
1045	uint32_t op, reg, val;
1046
1047	op = AR8327_VTU_FUNC1_OP_GET_ONE;
1048
1049	/* Filter out the vid flags; only grab the VLAN ID */
1050	vid &= 0xfff;
1051
1052	/* XXX TODO: the VTU here stores egress mode - keep, tag, untagged, none */
1053	r = ar8327_vlan_op(sc, op, vid, 0);
1054	if (r != 0) {
1055		device_printf(sc->sc_dev, "%s: %d: op failed\n", __func__, vid);
1056	}
1057
1058	reg = arswitch_readreg(sc->sc_dev, AR8327_REG_VTU_FUNC0);
1059	DPRINTF(sc->sc_dev, "%s: %d: reg=0x%08x\n", __func__, vid, reg);
1060
1061	/*
1062	 * If any of the bits are set, update the port mask.
1063	 * Worry about the port config itself when getport() is called.
1064	 */
1065	*ports = 0;
1066	for (i = 0; i < AR8327_NUM_PORTS; i++) {
1067		val = reg >> AR8327_VTU_FUNC0_EG_MODE_S(i);
1068		val = val & 0x3;
1069		/* XXX KEEP (unmodified?) */
1070		if (val == AR8327_VTU_FUNC0_EG_MODE_TAG) {
1071			*ports |= (1 << i);
1072		} else if (val == AR8327_VTU_FUNC0_EG_MODE_UNTAG) {
1073			*ports |= (1 << i);
1074			*untagged_ports |= (1 << i);
1075		}
1076	}
1077
1078	return (0);
1079}
1080
1081static int
1082ar8327_set_dot1q_vlan(struct arswitch_softc *sc, uint32_t ports,
1083    uint32_t untagged_ports, int vid)
1084{
1085	int i;
1086	uint32_t op, val, mode;
1087
1088	op = AR8327_VTU_FUNC1_OP_LOAD;
1089	vid &= 0xfff;
1090
1091	DPRINTF(sc->sc_dev,
1092	    "%s: vid: %d, ports=0x%08x, untagged_ports=0x%08x\n",
1093	    __func__,
1094	    vid,
1095	    ports,
1096	    untagged_ports);
1097
1098	/*
1099	 * Mark it as valid; and that it should use per-VLAN MAC table,
1100	 * not VID=0 when doing MAC lookups
1101	 */
1102	val = AR8327_VTU_FUNC0_VALID | AR8327_VTU_FUNC0_IVL;
1103
1104	for (i = 0; i < AR8327_NUM_PORTS; i++) {
1105		if ((ports & BIT(i)) == 0)
1106			mode = AR8327_VTU_FUNC0_EG_MODE_NOT;
1107		else if (untagged_ports & BIT(i))
1108			mode = AR8327_VTU_FUNC0_EG_MODE_UNTAG;
1109		else
1110			mode = AR8327_VTU_FUNC0_EG_MODE_TAG;
1111
1112		val |= mode << AR8327_VTU_FUNC0_EG_MODE_S(i);
1113	}
1114
1115	return (ar8327_vlan_op(sc, op, vid, val));
1116}
1117
1118void
1119ar8327_attach(struct arswitch_softc *sc)
1120{
1121
1122	sc->hal.arswitch_hw_setup = ar8327_hw_setup;
1123	sc->hal.arswitch_hw_global_setup = ar8327_hw_global_setup;
1124
1125	sc->hal.arswitch_port_init = ar8327_port_init;
1126
1127	sc->hal.arswitch_vlan_getvgroup = ar8327_vlan_getvgroup;
1128	sc->hal.arswitch_vlan_setvgroup = ar8327_vlan_setvgroup;
1129	sc->hal.arswitch_port_vlan_setup = ar8327_port_vlan_setup;
1130	sc->hal.arswitch_port_vlan_get = ar8327_port_vlan_get;
1131	sc->hal.arswitch_flush_dot1q_vlan = ar8327_flush_dot1q_vlan;
1132	sc->hal.arswitch_purge_dot1q_vlan = ar8327_purge_dot1q_vlan;
1133	sc->hal.arswitch_set_dot1q_vlan = ar8327_set_dot1q_vlan;
1134	sc->hal.arswitch_get_dot1q_vlan = ar8327_get_dot1q_vlan;
1135
1136	sc->hal.arswitch_vlan_init_hw = ar8327_reset_vlans;
1137	sc->hal.arswitch_vlan_get_pvid = ar8327_get_pvid;
1138	sc->hal.arswitch_vlan_set_pvid = ar8327_set_pvid;
1139
1140	sc->hal.arswitch_get_port_vlan = ar8327_vlan_get_port;
1141	sc->hal.arswitch_set_port_vlan = ar8327_vlan_set_port;
1142
1143	sc->hal.arswitch_atu_flush = ar8327_atu_flush;
1144
1145	/*
1146	 * Reading the PHY via the MDIO interface currently doesn't
1147	 * work correctly.
1148	 *
1149	 * So for now, just go direct to the PHY registers themselves.
1150	 * This has always worked  on external devices, but not internal
1151	 * devices (AR934x, AR724x, AR933x.)
1152	 */
1153	sc->hal.arswitch_phy_read = arswitch_readphy_external;
1154	sc->hal.arswitch_phy_write = arswitch_writephy_external;
1155
1156	/* Set the switch vlan capabilities. */
1157	sc->info.es_vlan_caps = ETHERSWITCH_VLAN_DOT1Q |
1158	    ETHERSWITCH_VLAN_PORT | ETHERSWITCH_VLAN_DOUBLE_TAG;
1159	sc->info.es_nvlangroups = AR8X16_MAX_VLANS;
1160}
1161