Deleted Added
full compact
if_ed_pccard.c (257176) if_ed_pccard.c (260050)
1/*-
2 * Copyright (c) 2005, M. Warner Losh
3 * Copyright (c) 1995, David Greenman
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:

--- 11 unchanged lines hidden (view full) ---

20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
1/*-
2 * Copyright (c) 2005, M. Warner Losh
3 * Copyright (c) 1995, David Greenman
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:

--- 11 unchanged lines hidden (view full) ---

20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD: head/sys/dev/ed/if_ed_pccard.c 257176 2013-10-26 17:58:36Z glebius $
28 * $FreeBSD: head/sys/dev/ed/if_ed_pccard.c 260050 2013-12-29 19:21:59Z marius $
29 */
30
31/*
32 * Notes for adding media support. Each chipset is somewhat different
33 * from the others. Linux has a table of OIDs that it uses to see what
34 * supports the misc register of the NS83903. But a sampling of datasheets
35 * I could dig up on cards I own paints a different picture.
36 *

--- 33 unchanged lines hidden (view full) ---

70 * Other chips?
71 * NetBSD supports RTL8019, but none have surfaced that I can see
72 */
73
74#include <sys/param.h>
75#include <sys/systm.h>
76#include <sys/socket.h>
77#include <sys/kernel.h>
29 */
30
31/*
32 * Notes for adding media support. Each chipset is somewhat different
33 * from the others. Linux has a table of OIDs that it uses to see what
34 * supports the misc register of the NS83903. But a sampling of datasheets
35 * I could dig up on cards I own paints a different picture.
36 *

--- 33 unchanged lines hidden (view full) ---

70 * Other chips?
71 * NetBSD supports RTL8019, but none have surfaced that I can see
72 */
73
74#include <sys/param.h>
75#include <sys/systm.h>
76#include <sys/socket.h>
77#include <sys/kernel.h>
78#include <sys/conf.h>
79#include <sys/uio.h>
80
81#include <sys/module.h>
82#include <sys/bus.h>
83#include <machine/bus.h>
84#include <sys/rman.h>
85#include <machine/resource.h>
86
87#include <net/ethernet.h>
88#include <net/if.h>

--- 153 unchanged lines hidden (view full) ---

242 { PCMCIA_CARD(TELECOMDEVICE, TCD_HPC100), NE2000DVF_AX88X90},
243 { PCMCIA_CARD(TJ, PTJ_LAN_T), 0 },
244 { PCMCIA_CARD(TOSHIBA2, LANCT00A), NE2000DVF_ANYFUNC | NE2000DVF_TOSHIBA},
245 { PCMCIA_CARD(ZONET, ZEN), 0},
246 { { NULL } }
247};
248
249/*
78#include <sys/module.h>
79#include <sys/bus.h>
80#include <machine/bus.h>
81#include <sys/rman.h>
82#include <machine/resource.h>
83
84#include <net/ethernet.h>
85#include <net/if.h>

--- 153 unchanged lines hidden (view full) ---

239 { PCMCIA_CARD(TELECOMDEVICE, TCD_HPC100), NE2000DVF_AX88X90},
240 { PCMCIA_CARD(TJ, PTJ_LAN_T), 0 },
241 { PCMCIA_CARD(TOSHIBA2, LANCT00A), NE2000DVF_ANYFUNC | NE2000DVF_TOSHIBA},
242 { PCMCIA_CARD(ZONET, ZEN), 0},
243 { { NULL } }
244};
245
246/*
247 * MII bit-bang glue
248 */
249static uint32_t ed_pccard_dl100xx_mii_bitbang_read(device_t dev);
250static void ed_pccard_dl100xx_mii_bitbang_write(device_t dev, uint32_t val);
251
252static const struct mii_bitbang_ops ed_pccard_dl100xx_mii_bitbang_ops = {
253 ed_pccard_dl100xx_mii_bitbang_read,
254 ed_pccard_dl100xx_mii_bitbang_write,
255 {
256 ED_DL100XX_MII_DATAOUT, /* MII_BIT_MDO */
257 ED_DL100XX_MII_DATAIN, /* MII_BIT_MDI */
258 ED_DL100XX_MII_CLK, /* MII_BIT_MDC */
259 ED_DL100XX_MII_DIROUT, /* MII_BIT_DIR_HOST_PHY */
260 0 /* MII_BIT_DIR_PHY_HOST */
261 }
262};
263
264static uint32_t ed_pccard_ax88x90_mii_bitbang_read(device_t dev);
265static void ed_pccard_ax88x90_mii_bitbang_write(device_t dev, uint32_t val);
266
267static const struct mii_bitbang_ops ed_pccard_ax88x90_mii_bitbang_ops = {
268 ed_pccard_ax88x90_mii_bitbang_read,
269 ed_pccard_ax88x90_mii_bitbang_write,
270 {
271 ED_AX88X90_MII_DATAOUT, /* MII_BIT_MDO */
272 ED_AX88X90_MII_DATAIN, /* MII_BIT_MDI */
273 ED_AX88X90_MII_CLK, /* MII_BIT_MDC */
274 0, /* MII_BIT_DIR_HOST_PHY */
275 ED_AX88X90_MII_DIRIN /* MII_BIT_DIR_PHY_HOST */
276 }
277};
278
279static uint32_t ed_pccard_tc5299j_mii_bitbang_read(device_t dev);
280static void ed_pccard_tc5299j_mii_bitbang_write(device_t dev, uint32_t val);
281
282static const struct mii_bitbang_ops ed_pccard_tc5299j_mii_bitbang_ops = {
283 ed_pccard_tc5299j_mii_bitbang_read,
284 ed_pccard_tc5299j_mii_bitbang_write,
285 {
286 ED_TC5299J_MII_DATAOUT, /* MII_BIT_MDO */
287 ED_TC5299J_MII_DATAIN, /* MII_BIT_MDI */
288 ED_TC5299J_MII_CLK, /* MII_BIT_MDC */
289 0, /* MII_BIT_DIR_HOST_PHY */
290 ED_AX88X90_MII_DIRIN /* MII_BIT_DIR_PHY_HOST */
291 }
292};
293
294/*
250 * PC Card (PCMCIA) specific code.
251 */
252static int ed_pccard_probe(device_t);
253static int ed_pccard_attach(device_t);
254static void ed_pccard_tick(struct ed_softc *);
255
256static int ed_pccard_dl100xx(device_t dev, const struct ed_product *);
257static void ed_pccard_dl100xx_mii_reset(struct ed_softc *sc);
295 * PC Card (PCMCIA) specific code.
296 */
297static int ed_pccard_probe(device_t);
298static int ed_pccard_attach(device_t);
299static void ed_pccard_tick(struct ed_softc *);
300
301static int ed_pccard_dl100xx(device_t dev, const struct ed_product *);
302static void ed_pccard_dl100xx_mii_reset(struct ed_softc *sc);
258static u_int ed_pccard_dl100xx_mii_readbits(struct ed_softc *sc, int nbits);
259static void ed_pccard_dl100xx_mii_writebits(struct ed_softc *sc, u_int val,
260 int nbits);
261
262static int ed_pccard_ax88x90(device_t dev, const struct ed_product *);
303
304static int ed_pccard_ax88x90(device_t dev, const struct ed_product *);
263static u_int ed_pccard_ax88x90_mii_readbits(struct ed_softc *sc, int nbits);
264static void ed_pccard_ax88x90_mii_writebits(struct ed_softc *sc, u_int val,
265 int nbits);
266
267static int ed_miibus_readreg(device_t dev, int phy, int reg);
268static int ed_ifmedia_upd(struct ifnet *);
269static void ed_ifmedia_sts(struct ifnet *, struct ifmediareq *);
270
271static int ed_pccard_tc5299j(device_t dev, const struct ed_product *);
305
306static int ed_miibus_readreg(device_t dev, int phy, int reg);
307static int ed_ifmedia_upd(struct ifnet *);
308static void ed_ifmedia_sts(struct ifnet *, struct ifmediareq *);
309
310static int ed_pccard_tc5299j(device_t dev, const struct ed_product *);
272static u_int ed_pccard_tc5299j_mii_readbits(struct ed_softc *sc, int nbits);
273static void ed_pccard_tc5299j_mii_writebits(struct ed_softc *sc, u_int val,
274 int nbits);
275
276static void
277ed_pccard_print_entry(const struct ed_product *pp)
278{
279 int i;
280
281 printf("Product entry: ");
282 if (pp->prod.pp_name)

--- 214 unchanged lines hidden (view full) ---

497 if (error != 0)
498 error = ed_pccard_dl100xx(dev, pp);
499 if (error != 0)
500 error = ed_pccard_ax88x90(dev, pp);
501 if (error != 0)
502 error = ed_pccard_tc5299j(dev, pp);
503 if (error != 0) {
504 error = ed_probe_Novell_generic(dev, flags);
311
312static void
313ed_pccard_print_entry(const struct ed_product *pp)
314{
315 int i;
316
317 printf("Product entry: ");
318 if (pp->prod.pp_name)

--- 214 unchanged lines hidden (view full) ---

533 if (error != 0)
534 error = ed_pccard_dl100xx(dev, pp);
535 if (error != 0)
536 error = ed_pccard_ax88x90(dev, pp);
537 if (error != 0)
538 error = ed_pccard_tc5299j(dev, pp);
539 if (error != 0) {
540 error = ed_probe_Novell_generic(dev, flags);
505 printf("Novell probe generic %d\n", error);
541 printf("Novell generic probe failed: %d\n", error);
506 }
507 if (error != 0 && (pp->flags & NE2000DVF_TOSHIBA)) {
508 flags |= ED_FLAGS_TOSH_ETHER;
509 flags |= ED_FLAGS_PCCARD;
510 sc->asic_offset = ED_WD_ASIC_OFFSET;
511 sc->nic_offset = ED_WD_NIC_OFFSET;
512 error = ed_probe_WD80x3_generic(dev, flags, intr_vals);
513 }

--- 108 unchanged lines hidden (view full) ---

622 u_char sum;
623 uint8_t id;
624 u_int memsize;
625 int i, error;
626
627 if (!(pp->flags & NE2000DVF_DL100XX))
628 return (ENXIO);
629 if (bootverbose)
542 }
543 if (error != 0 && (pp->flags & NE2000DVF_TOSHIBA)) {
544 flags |= ED_FLAGS_TOSH_ETHER;
545 flags |= ED_FLAGS_PCCARD;
546 sc->asic_offset = ED_WD_ASIC_OFFSET;
547 sc->nic_offset = ED_WD_NIC_OFFSET;
548 error = ed_probe_WD80x3_generic(dev, flags, intr_vals);
549 }

--- 108 unchanged lines hidden (view full) ---

658 u_char sum;
659 uint8_t id;
660 u_int memsize;
661 int i, error;
662
663 if (!(pp->flags & NE2000DVF_DL100XX))
664 return (ENXIO);
665 if (bootverbose)
630 device_printf(dev, "Trying DL100xx probing\n");
666 device_printf(dev, "Trying DL100xx\n");
631 error = ed_probe_Novell_generic(dev, device_get_flags(dev));
632 if (bootverbose && error)
633 device_printf(dev, "Novell generic probe failed: %d\n", error);
634 if (error != 0)
635 return (error);
636
637 /*
638 * Linksys registers(offset from ASIC base)

--- 34 unchanged lines hidden (view full) ---

673 sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
674
675 ed_nic_outb(sc, ED_P0_PSTART, sc->mem_start / ED_PAGE_SIZE);
676 ed_nic_outb(sc, ED_P0_PSTOP, sc->mem_end / ED_PAGE_SIZE);
677 sc->vendor = ED_VENDOR_NOVELL;
678 sc->chip_type = (id & 0x90) == 0x90 ?
679 ED_CHIP_TYPE_DL10022 : ED_CHIP_TYPE_DL10019;
680 sc->type_str = ((id & 0x90) == 0x90) ? "DL10022" : "DL10019";
667 error = ed_probe_Novell_generic(dev, device_get_flags(dev));
668 if (bootverbose && error)
669 device_printf(dev, "Novell generic probe failed: %d\n", error);
670 if (error != 0)
671 return (error);
672
673 /*
674 * Linksys registers(offset from ASIC base)

--- 34 unchanged lines hidden (view full) ---

709 sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
710
711 ed_nic_outb(sc, ED_P0_PSTART, sc->mem_start / ED_PAGE_SIZE);
712 ed_nic_outb(sc, ED_P0_PSTOP, sc->mem_end / ED_PAGE_SIZE);
713 sc->vendor = ED_VENDOR_NOVELL;
714 sc->chip_type = (id & 0x90) == 0x90 ?
715 ED_CHIP_TYPE_DL10022 : ED_CHIP_TYPE_DL10019;
716 sc->type_str = ((id & 0x90) == 0x90) ? "DL10022" : "DL10019";
681 sc->mii_readbits = ed_pccard_dl100xx_mii_readbits;
682 sc->mii_writebits = ed_pccard_dl100xx_mii_writebits;
717 sc->mii_bitbang_ops = &ed_pccard_dl100xx_mii_bitbang_ops;
683 return (0);
684}
685
686/* MII bit-twiddling routines for cards using Dlink chipset */
718 return (0);
719}
720
721/* MII bit-twiddling routines for cards using Dlink chipset */
687#define DL100XX_MIISET(sc, x) ed_asic_outb(sc, ED_DL100XX_MIIBUS, \
688 ed_asic_inb(sc, ED_DL100XX_MIIBUS) | (x))
689#define DL100XX_MIICLR(sc, x) ed_asic_outb(sc, ED_DL100XX_MIIBUS, \
690 ed_asic_inb(sc, ED_DL100XX_MIIBUS) & ~(x))
691
692static void
693ed_pccard_dl100xx_mii_reset(struct ed_softc *sc)
694{
695 if (sc->chip_type != ED_CHIP_TYPE_DL10022)
696 return;
697
698 ed_asic_outb(sc, ED_DL100XX_MIIBUS, ED_DL10022_MII_RESET2);

--- 5 unchanged lines hidden (view full) ---

704 DELAY(10);
705 ed_asic_outb(sc, ED_DL100XX_MIIBUS,
706 ED_DL10022_MII_RESET2 | ED_DL10022_MII_RESET1);
707 DELAY(10);
708 ed_asic_outb(sc, ED_DL100XX_MIIBUS, 0);
709}
710
711static void
722
723static void
724ed_pccard_dl100xx_mii_reset(struct ed_softc *sc)
725{
726 if (sc->chip_type != ED_CHIP_TYPE_DL10022)
727 return;
728
729 ed_asic_outb(sc, ED_DL100XX_MIIBUS, ED_DL10022_MII_RESET2);

--- 5 unchanged lines hidden (view full) ---

735 DELAY(10);
736 ed_asic_outb(sc, ED_DL100XX_MIIBUS,
737 ED_DL10022_MII_RESET2 | ED_DL10022_MII_RESET1);
738 DELAY(10);
739 ed_asic_outb(sc, ED_DL100XX_MIIBUS, 0);
740}
741
742static void
712ed_pccard_dl100xx_mii_writebits(struct ed_softc *sc, u_int val, int nbits)
743ed_pccard_dl100xx_mii_bitbang_write(device_t dev, uint32_t val)
713{
744{
714 int i;
745 struct ed_softc *sc;
715
746
716 DL100XX_MIISET(sc, ED_DL100XX_MII_DIROUT);
717 for (i = nbits - 1; i >= 0; i--) {
718 if ((val >> i) & 1)
719 DL100XX_MIISET(sc, ED_DL100XX_MII_DATAOUT);
720 else
721 DL100XX_MIICLR(sc, ED_DL100XX_MII_DATAOUT);
722 DL100XX_MIISET(sc, ED_DL100XX_MII_CLK);
723 DL100XX_MIICLR(sc, ED_DL100XX_MII_CLK);
724 }
747 sc = device_get_softc(dev);
748
749 ed_asic_outb(sc, ED_DL100XX_MIIBUS, val);
750 ed_asic_barrier(sc, ED_DL100XX_MIIBUS, 1,
751 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
725}
726
752}
753
727static u_int
728ed_pccard_dl100xx_mii_readbits(struct ed_softc *sc, int nbits)
754static uint32_t
755ed_pccard_dl100xx_mii_bitbang_read(device_t dev)
729{
756{
730 int i;
731 u_int val = 0;
757 struct ed_softc *sc;
758 uint32_t val;
732
759
733 DL100XX_MIICLR(sc, ED_DL100XX_MII_DIROUT);
734 for (i = nbits - 1; i >= 0; i--) {
735 DL100XX_MIISET(sc, ED_DL100XX_MII_CLK);
736 val <<= 1;
737 if (ed_asic_inb(sc, ED_DL100XX_MIIBUS) & ED_DL100XX_MII_DATAIN)
738 val++;
739 DL100XX_MIICLR(sc, ED_DL100XX_MII_CLK);
740 }
741 return val;
760 sc = device_get_softc(dev);
761
762 val = ed_asic_inb(sc, ED_DL100XX_MIIBUS);
763 ed_asic_barrier(sc, ED_DL100XX_MIIBUS, 1,
764 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
765 return (val);
742}
743
744static void
745ed_pccard_ax88x90_reset(struct ed_softc *sc)
746{
747 int i;
748
749 /* Reset Card */
766}
767
768static void
769ed_pccard_ax88x90_reset(struct ed_softc *sc)
770{
771 int i;
772
773 /* Reset Card */
774 ed_nic_barrier(sc, ED_P0_CR, 1,
775 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
750 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP | ED_CR_PAGE_0);
776 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP | ED_CR_PAGE_0);
777 ed_nic_barrier(sc, ED_P0_CR, 1,
778 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
751 ed_asic_outb(sc, ED_NOVELL_RESET, ed_asic_inb(sc, ED_NOVELL_RESET));
752
753 /* Wait for the RST bit to assert, but cap it at 10ms */
754 for (i = 10000; !(ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RST) && i > 0;
755 i--)
756 continue;
757 ed_nic_outb(sc, ED_P0_ISR, ED_ISR_RST); /* ACK INTR */
758 if (i == 0)

--- 116 unchanged lines hidden (view full) ---

875 break;
876 }
877 /*
878 * Still no joy? We're AFU, punt.
879 */
880 if (i == 32)
881 return (ENXIO);
882 return (0);
779 ed_asic_outb(sc, ED_NOVELL_RESET, ed_asic_inb(sc, ED_NOVELL_RESET));
780
781 /* Wait for the RST bit to assert, but cap it at 10ms */
782 for (i = 10000; !(ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RST) && i > 0;
783 i--)
784 continue;
785 ed_nic_outb(sc, ED_P0_ISR, ED_ISR_RST); /* ACK INTR */
786 if (i == 0)

--- 116 unchanged lines hidden (view full) ---

903 break;
904 }
905 /*
906 * Still no joy? We're AFU, punt.
907 */
908 if (i == 32)
909 return (ENXIO);
910 return (0);
883
884}
885
886/*
887 * Special setup for AX88[17]90
888 */
889static int
890ed_pccard_ax88x90(device_t dev, const struct ed_product *pp)
891{

--- 13 unchanged lines hidden (view full) ---

905 * We write the address the card is at, on the off chance that this
906 * card is not MFC.
907 * XXX I'm not sure that this is still needed...
908 */
909 iobase = rman_get_start(sc->port_res);
910 pccard_ccr_write_1(dev, PCCARD_CCR_IOBASE0, iobase & 0xff);
911 pccard_ccr_write_1(dev, PCCARD_CCR_IOBASE1, (iobase >> 8) & 0xff);
912
911}
912
913/*
914 * Special setup for AX88[17]90
915 */
916static int
917ed_pccard_ax88x90(device_t dev, const struct ed_product *pp)
918{

--- 13 unchanged lines hidden (view full) ---

932 * We write the address the card is at, on the off chance that this
933 * card is not MFC.
934 * XXX I'm not sure that this is still needed...
935 */
936 iobase = rman_get_start(sc->port_res);
937 pccard_ccr_write_1(dev, PCCARD_CCR_IOBASE0, iobase & 0xff);
938 pccard_ccr_write_1(dev, PCCARD_CCR_IOBASE1, (iobase >> 8) & 0xff);
939
913 sc->mii_readbits = ed_pccard_ax88x90_mii_readbits;
914 sc->mii_writebits = ed_pccard_ax88x90_mii_writebits;
915 error = ed_probe_ax88x90_generic(dev, device_get_flags(dev));
916 if (error) {
917 if (bootverbose)
918 device_printf(dev, "probe ax88x90 failed %d\n",
919 error);
940 error = ed_probe_ax88x90_generic(dev, device_get_flags(dev));
941 if (error) {
942 if (bootverbose)
943 device_printf(dev, "probe ax88x90 failed %d\n",
944 error);
920 goto fail;
945 return (error);
921 }
946 }
947 sc->mii_bitbang_ops = &ed_pccard_ax88x90_mii_bitbang_ops;
922 error = ed_pccard_ax88x90_check_mii(dev, sc);
923 if (error)
948 error = ed_pccard_ax88x90_check_mii(dev, sc);
949 if (error)
924 goto fail;
950 return (error);
925 sc->vendor = ED_VENDOR_NOVELL;
926 sc->type = ED_TYPE_NE2000;
927 if (sc->chip_type == ED_CHIP_TYPE_AX88190)
928 sc->type_str = "AX88190";
929 else
930 sc->type_str = "AX88790";
931 return (0);
951 sc->vendor = ED_VENDOR_NOVELL;
952 sc->type = ED_TYPE_NE2000;
953 if (sc->chip_type == ED_CHIP_TYPE_AX88190)
954 sc->type_str = "AX88190";
955 else
956 sc->type_str = "AX88790";
957 return (0);
932fail:;
933 sc->mii_readbits = 0;
934 sc->mii_writebits = 0;
935 return (error);
936}
937
938static void
958}
959
960static void
939ed_pccard_ax88x90_mii_writebits(struct ed_softc *sc, u_int val, int nbits)
961ed_pccard_ax88x90_mii_bitbang_write(device_t dev, uint32_t val)
940{
962{
941 int i, data;
963 struct ed_softc *sc;
942
964
943 for (i = nbits - 1; i >= 0; i--) {
944 data = (val >> i) & 1 ? ED_AX88X90_MII_DATAOUT : 0;
945 ed_asic_outb(sc, ED_AX88X90_MIIBUS, data);
946 ed_asic_outb(sc, ED_AX88X90_MIIBUS, data | ED_AX88X90_MII_CLK);
947 }
965 sc = device_get_softc(dev);
966
967 ed_asic_outb(sc, ED_AX88X90_MIIBUS, val);
968 ed_asic_barrier(sc, ED_AX88X90_MIIBUS, 1,
969 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
948}
949
970}
971
950static u_int
951ed_pccard_ax88x90_mii_readbits(struct ed_softc *sc, int nbits)
972static uint32_t
973ed_pccard_ax88x90_mii_bitbang_read(device_t dev)
952{
974{
953 int i;
954 u_int val = 0;
955 uint8_t mdio;
975 struct ed_softc *sc;
976 uint32_t val;
956
977
957 mdio = ED_AX88X90_MII_DIRIN;
958 for (i = nbits - 1; i >= 0; i--) {
959 ed_asic_outb(sc, ED_AX88X90_MIIBUS, mdio);
960 val <<= 1;
961 if (ed_asic_inb(sc, ED_AX88X90_MIIBUS) & ED_AX88X90_MII_DATAIN)
962 val++;
963 ed_asic_outb(sc, ED_AX88X90_MIIBUS, mdio | ED_AX88X90_MII_CLK);
964 }
965 return val;
978 sc = device_get_softc(dev);
979
980 val = ed_asic_inb(sc, ED_AX88X90_MIIBUS);
981 ed_asic_barrier(sc, ED_AX88X90_MIIBUS, 1,
982 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
983 return (val);
966}
967
968/*
969 * Special setup for TC5299J
970 */
971static int
972ed_pccard_tc5299j(device_t dev, const struct ed_product *pp)
973{

--- 4 unchanged lines hidden (view full) ---

978 if (!(pp->flags & NE2000DVF_TC5299J))
979 return (ENXIO);
980
981 if (bootverbose)
982 device_printf(dev, "Checking Tc5299j\n");
983
984 error = ed_probe_Novell_generic(dev, device_get_flags(dev));
985 if (bootverbose)
984}
985
986/*
987 * Special setup for TC5299J
988 */
989static int
990ed_pccard_tc5299j(device_t dev, const struct ed_product *pp)
991{

--- 4 unchanged lines hidden (view full) ---

996 if (!(pp->flags & NE2000DVF_TC5299J))
997 return (ENXIO);
998
999 if (bootverbose)
1000 device_printf(dev, "Checking Tc5299j\n");
1001
1002 error = ed_probe_Novell_generic(dev, device_get_flags(dev));
1003 if (bootverbose)
986 device_printf(dev, "probe novel returns %d\n", error);
1004 device_printf(dev, "Novell generic probe failed: %d\n", error);
987 if (error != 0)
988 return (error);
989
990 /*
991 * Check to see if we have a MII PHY ID at any address. All TC5299J
992 * devices have MII and a PHY, so we use this to weed out chips that
993 * would otherwise make it through the tests we have after this point.
994 */
1005 if (error != 0)
1006 return (error);
1007
1008 /*
1009 * Check to see if we have a MII PHY ID at any address. All TC5299J
1010 * devices have MII and a PHY, so we use this to weed out chips that
1011 * would otherwise make it through the tests we have after this point.
1012 */
995 sc->mii_readbits = ed_pccard_tc5299j_mii_readbits;
996 sc->mii_writebits = ed_pccard_tc5299j_mii_writebits;
1013 sc->mii_bitbang_ops = &ed_pccard_tc5299j_mii_bitbang_ops;
997 for (i = 0; i < 32; i++) {
998 id = ed_miibus_readreg(dev, i, MII_PHYIDR1);
999 if (id != 0 && id != 0xffff)
1000 break;
1001 }
1014 for (i = 0; i < 32; i++) {
1015 id = ed_miibus_readreg(dev, i, MII_PHYIDR1);
1016 if (id != 0 && id != 0xffff)
1017 break;
1018 }
1002 if (i == 32) {
1003 sc->mii_readbits = 0;
1004 sc->mii_writebits = 0;
1019 if (i == 32)
1005 return (ENXIO);
1020 return (ENXIO);
1006 }
1007 ts = "TC5299J";
1021 ts = "TC5299J";
1008 if (ed_pccard_rom_mac(dev, sc->enaddr) == 0) {
1009 sc->mii_readbits = 0;
1010 sc->mii_writebits = 0;
1022 if (ed_pccard_rom_mac(dev, sc->enaddr) == 0)
1011 return (ENXIO);
1023 return (ENXIO);
1012 }
1013 sc->vendor = ED_VENDOR_NOVELL;
1014 sc->type = ED_TYPE_NE2000;
1015 sc->chip_type = ED_CHIP_TYPE_TC5299J;
1016 sc->type_str = ts;
1017 return (0);
1018}
1019
1020static void
1024 sc->vendor = ED_VENDOR_NOVELL;
1025 sc->type = ED_TYPE_NE2000;
1026 sc->chip_type = ED_CHIP_TYPE_TC5299J;
1027 sc->type_str = ts;
1028 return (0);
1029}
1030
1031static void
1021ed_pccard_tc5299j_mii_writebits(struct ed_softc *sc, u_int val, int nbits)
1032ed_pccard_tc5299j_mii_bitbang_write(device_t dev, uint32_t val)
1022{
1033{
1023 int i;
1024 uint8_t cr, data;
1034 struct ed_softc *sc;
1025
1035
1026 /* Select page 3 */
1027 cr = ed_nic_inb(sc, ED_P0_CR);
1028 ed_nic_outb(sc, ED_P0_CR, cr | ED_CR_PAGE_3);
1036 sc = device_get_softc(dev);
1029
1037
1030 for (i = nbits - 1; i >= 0; i--) {
1031 data = (val >> i) & 1 ? ED_TC5299J_MII_DATAOUT : 0;
1032 ed_nic_outb(sc, ED_TC5299J_MIIBUS, data);
1033 ed_nic_outb(sc, ED_TC5299J_MIIBUS, data | ED_TC5299J_MII_CLK);
1034 }
1035 ed_nic_outb(sc, ED_TC5299J_MIIBUS, 0);
1036
1037 /* Restore prior page */
1038 ed_nic_outb(sc, ED_P0_CR, cr);
1038 /* We are already on page 3. */
1039 ed_nic_outb(sc, ED_TC5299J_MIIBUS, val);
1040 ed_nic_barrier(sc, ED_TC5299J_MIIBUS, 1,
1041 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1039}
1040
1042}
1043
1041static u_int
1042ed_pccard_tc5299j_mii_readbits(struct ed_softc *sc, int nbits)
1044static uint32_t
1045ed_pccard_tc5299j_mii_bitbang_read(device_t dev)
1043{
1046{
1044 int i;
1045 u_int val = 0;
1046 uint8_t cr;
1047 struct ed_softc *sc;
1048 uint32_t val;
1047
1049
1048 /* Select page 3 */
1049 cr = ed_nic_inb(sc, ED_P0_CR);
1050 ed_nic_outb(sc, ED_P0_CR, cr | ED_CR_PAGE_3);
1050 sc = device_get_softc(dev);
1051
1051
1052 ed_asic_outb(sc, ED_TC5299J_MIIBUS, ED_TC5299J_MII_DIROUT);
1053 for (i = nbits - 1; i >= 0; i--) {
1054 ed_nic_outb(sc, ED_TC5299J_MIIBUS,
1055 ED_TC5299J_MII_CLK | ED_TC5299J_MII_DIROUT);
1056 val <<= 1;
1057 if (ed_nic_inb(sc, ED_TC5299J_MIIBUS) & ED_TC5299J_MII_DATAIN)
1058 val++;
1059 ed_nic_outb(sc, ED_TC5299J_MIIBUS, ED_TC5299J_MII_DIROUT);
1060 }
1061
1062 /* Restore prior page */
1063 ed_nic_outb(sc, ED_P0_CR, cr);
1064 return val;
1052 /* We are already on page 3. */
1053 val = ed_asic_inb(sc, ED_TC5299J_MIIBUS);
1054 ed_nic_barrier(sc, ED_TC5299J_MIIBUS, 1,
1055 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1056 return (val);
1065}
1066
1067/*
1068 * MII bus support routines.
1069 */
1070static int
1071ed_miibus_readreg(device_t dev, int phy, int reg)
1072{
1073 struct ed_softc *sc;
1057}
1058
1059/*
1060 * MII bus support routines.
1061 */
1062static int
1063ed_miibus_readreg(device_t dev, int phy, int reg)
1064{
1065 struct ed_softc *sc;
1074 int failed, val;
1066 int val;
1067 uint8_t cr = 0;
1075
1076 sc = device_get_softc(dev);
1077 /*
1078 * The AX88790 has an interesting quirk. It has an internal phy that
1079 * needs a special bit set to access, but can also have additional
1080 * external PHYs set for things like HomeNET media. When accessing
1081 * the internal PHY, a bit has to be set, when accessing the external
1082 * PHYs, it must be clear. See Errata 1, page 51, in the AX88790
1083 * datasheet for more details.
1084 *
1085 * Also, PHYs above 16 appear to be phantoms on some cards, but not
1086 * others. Registers read for this are often the same as prior values
1087 * read. Filter all register requests to 17-31.
1068
1069 sc = device_get_softc(dev);
1070 /*
1071 * The AX88790 has an interesting quirk. It has an internal phy that
1072 * needs a special bit set to access, but can also have additional
1073 * external PHYs set for things like HomeNET media. When accessing
1074 * the internal PHY, a bit has to be set, when accessing the external
1075 * PHYs, it must be clear. See Errata 1, page 51, in the AX88790
1076 * datasheet for more details.
1077 *
1078 * Also, PHYs above 16 appear to be phantoms on some cards, but not
1079 * others. Registers read for this are often the same as prior values
1080 * read. Filter all register requests to 17-31.
1088 *
1089 * I can't explain it, since I don't have the DL100xx data sheets, but
1090 * the DL100xx chips do 13-bits before the 'ACK' but, but the AX88x90
1091 * chips have 14. The linux pcnet and axnet drivers confirm this.
1092 */
1093 if (sc->chip_type == ED_CHIP_TYPE_AX88790) {
1094 if (phy > 0x10)
1095 return (0);
1096 if (phy == 0x10)
1097 ed_asic_outb(sc, ED_AX88X90_GPIO,
1098 ED_AX88X90_GPIO_INT_PHY);
1099 else
1100 ed_asic_outb(sc, ED_AX88X90_GPIO, 0);
1081 */
1082 if (sc->chip_type == ED_CHIP_TYPE_AX88790) {
1083 if (phy > 0x10)
1084 return (0);
1085 if (phy == 0x10)
1086 ed_asic_outb(sc, ED_AX88X90_GPIO,
1087 ED_AX88X90_GPIO_INT_PHY);
1088 else
1089 ed_asic_outb(sc, ED_AX88X90_GPIO, 0);
1090 ed_asic_barrier(sc, ED_AX88X90_GPIO, 1,
1091 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1092 } else if (sc->chip_type == ED_CHIP_TYPE_TC5299J) {
1093 /* Select page 3. */
1094 ed_nic_barrier(sc, ED_P0_CR, 1,
1095 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1096 cr = ed_nic_inb(sc, ED_P0_CR);
1097 ed_nic_outb(sc, ED_P0_CR, cr | ED_CR_PAGE_3);
1098 ed_nic_barrier(sc, ED_P0_CR, 1,
1099 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1101 }
1100 }
1102
1103 (*sc->mii_writebits)(sc, 0xffffffff, 32);
1104 (*sc->mii_writebits)(sc, ED_MII_STARTDELIM, ED_MII_STARTDELIM_BITS);
1105 (*sc->mii_writebits)(sc, ED_MII_READOP, ED_MII_OP_BITS);
1106 (*sc->mii_writebits)(sc, phy, ED_MII_PHY_BITS);
1107 (*sc->mii_writebits)(sc, reg, ED_MII_REG_BITS);
1108 if (sc->chip_type == ED_CHIP_TYPE_AX88790 ||
1109 sc->chip_type == ED_CHIP_TYPE_AX88190)
1110 (*sc->mii_readbits)(sc, ED_MII_ACK_BITS);
1111 failed = (*sc->mii_readbits)(sc, ED_MII_ACK_BITS);
1112 val = (*sc->mii_readbits)(sc, ED_MII_DATA_BITS);
1113 (*sc->mii_writebits)(sc, ED_MII_IDLE, ED_MII_IDLE_BITS);
1114/* printf("Reading phy %d reg %#x returning %#x (valid %d)\n", phy, reg, val, !failed); */
1115 return (failed ? 0 : val);
1101 val = mii_bitbang_readreg(dev, sc->mii_bitbang_ops, phy, reg);
1102 if (sc->chip_type == ED_CHIP_TYPE_TC5299J) {
1103 /* Restore prior page. */
1104 ed_nic_outb(sc, ED_P0_CR, cr);
1105 ed_nic_barrier(sc, ED_P0_CR, 1,
1106 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1107 }
1108 return (val);
1116}
1117
1118static int
1119ed_miibus_writereg(device_t dev, int phy, int reg, int data)
1120{
1121 struct ed_softc *sc;
1109}
1110
1111static int
1112ed_miibus_writereg(device_t dev, int phy, int reg, int data)
1113{
1114 struct ed_softc *sc;
1115 uint8_t cr = 0;
1122
1116
1123/* printf("Writing phy %d reg %#x data %#x\n", phy, reg, data); */
1124 sc = device_get_softc(dev);
1125 /* See ed_miibus_readreg for details */
1126 if (sc->chip_type == ED_CHIP_TYPE_AX88790) {
1127 if (phy > 0x10)
1128 return (0);
1129 if (phy == 0x10)
1130 ed_asic_outb(sc, ED_AX88X90_GPIO,
1131 ED_AX88X90_GPIO_INT_PHY);
1132 else
1133 ed_asic_outb(sc, ED_AX88X90_GPIO, 0);
1117 sc = device_get_softc(dev);
1118 /* See ed_miibus_readreg for details */
1119 if (sc->chip_type == ED_CHIP_TYPE_AX88790) {
1120 if (phy > 0x10)
1121 return (0);
1122 if (phy == 0x10)
1123 ed_asic_outb(sc, ED_AX88X90_GPIO,
1124 ED_AX88X90_GPIO_INT_PHY);
1125 else
1126 ed_asic_outb(sc, ED_AX88X90_GPIO, 0);
1127 ed_asic_barrier(sc, ED_AX88X90_GPIO, 1,
1128 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1129 } else if (sc->chip_type == ED_CHIP_TYPE_TC5299J) {
1130 /* Select page 3. */
1131 ed_nic_barrier(sc, ED_P0_CR, 1,
1132 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1133 cr = ed_nic_inb(sc, ED_P0_CR);
1134 ed_nic_outb(sc, ED_P0_CR, cr | ED_CR_PAGE_3);
1135 ed_nic_barrier(sc, ED_P0_CR, 1,
1136 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1134 }
1137 }
1135 (*sc->mii_writebits)(sc, 0xffffffff, 32);
1136 (*sc->mii_writebits)(sc, ED_MII_STARTDELIM, ED_MII_STARTDELIM_BITS);
1137 (*sc->mii_writebits)(sc, ED_MII_WRITEOP, ED_MII_OP_BITS);
1138 (*sc->mii_writebits)(sc, phy, ED_MII_PHY_BITS);
1139 (*sc->mii_writebits)(sc, reg, ED_MII_REG_BITS);
1140 (*sc->mii_writebits)(sc, ED_MII_TURNAROUND, ED_MII_TURNAROUND_BITS);
1141 (*sc->mii_writebits)(sc, data, ED_MII_DATA_BITS);
1142 (*sc->mii_writebits)(sc, ED_MII_IDLE, ED_MII_IDLE_BITS);
1138 mii_bitbang_writereg(dev, sc->mii_bitbang_ops, phy, reg, data);
1139 if (sc->chip_type == ED_CHIP_TYPE_TC5299J) {
1140 /* Restore prior page. */
1141 ed_nic_outb(sc, ED_P0_CR, cr);
1142 ed_nic_barrier(sc, ED_P0_CR, 1,
1143 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1144 }
1143 return (0);
1144}
1145
1146static int
1147ed_ifmedia_upd(struct ifnet *ifp)
1148{
1149 struct ed_softc *sc;
1150 int error;
1151
1152 sc = ifp->if_softc;
1145 return (0);
1146}
1147
1148static int
1149ed_ifmedia_upd(struct ifnet *ifp)
1150{
1151 struct ed_softc *sc;
1152 int error;
1153
1154 sc = ifp->if_softc;
1153 if (sc->miibus == NULL)
1154 return (ENXIO);
1155 ED_LOCK(sc);
1155 ED_LOCK(sc);
1156 if (sc->miibus == NULL) {
1157 ED_UNLOCK(sc);
1158 return (ENXIO);
1159 }
1160
1156 error = ed_pccard_kick_phy(sc);
1157 ED_UNLOCK(sc);
1158 return (error);
1159}
1160
1161static void
1162ed_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
1163{
1164 struct ed_softc *sc;
1165 struct mii_data *mii;
1166
1167 sc = ifp->if_softc;
1161 error = ed_pccard_kick_phy(sc);
1162 ED_UNLOCK(sc);
1163 return (error);
1164}
1165
1166static void
1167ed_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
1168{
1169 struct ed_softc *sc;
1170 struct mii_data *mii;
1171
1172 sc = ifp->if_softc;
1168 if (sc->miibus == NULL)
1173 ED_LOCK(sc);
1174 if (sc->miibus == NULL) {
1169 return;
1175 return;
1176 ED_UNLOCK(sc);
1177 }
1170
1171 mii = device_get_softc(sc->miibus);
1172 mii_pollstat(mii);
1173 ifmr->ifm_active = mii->mii_media_active;
1174 ifmr->ifm_status = mii->mii_media_status;
1178
1179 mii = device_get_softc(sc->miibus);
1180 mii_pollstat(mii);
1181 ifmr->ifm_active = mii->mii_media_active;
1182 ifmr->ifm_status = mii->mii_media_status;
1183 ED_UNLOCK(sc);
1175}
1176
1177static void
1178ed_child_detached(device_t dev, device_t child)
1179{
1180 struct ed_softc *sc;
1181
1182 sc = device_get_softc(dev);

--- 38 unchanged lines hidden (view full) ---

1221
1222 /* Bus interface */
1223 DEVMETHOD(bus_child_detached, ed_child_detached),
1224
1225 /* MII interface */
1226 DEVMETHOD(miibus_readreg, ed_miibus_readreg),
1227 DEVMETHOD(miibus_writereg, ed_miibus_writereg),
1228
1184}
1185
1186static void
1187ed_child_detached(device_t dev, device_t child)
1188{
1189 struct ed_softc *sc;
1190
1191 sc = device_get_softc(dev);

--- 38 unchanged lines hidden (view full) ---

1230
1231 /* Bus interface */
1232 DEVMETHOD(bus_child_detached, ed_child_detached),
1233
1234 /* MII interface */
1235 DEVMETHOD(miibus_readreg, ed_miibus_readreg),
1236 DEVMETHOD(miibus_writereg, ed_miibus_writereg),
1237
1229 { 0, 0 }
1238 DEVMETHOD_END
1230};
1231
1232static driver_t ed_pccard_driver = {
1233 "ed",
1234 ed_pccard_methods,
1235 sizeof(struct ed_softc)
1236};
1237
1239};
1240
1241static driver_t ed_pccard_driver = {
1242 "ed",
1243 ed_pccard_methods,
1244 sizeof(struct ed_softc)
1245};
1246
1238DRIVER_MODULE(ed, pccard, ed_pccard_driver, ed_devclass, 0, 0);
1239DRIVER_MODULE(miibus, ed, miibus_driver, miibus_devclass, 0, 0);
1247DRIVER_MODULE(ed, pccard, ed_pccard_driver, ed_devclass, 0, NULL);
1248DRIVER_MODULE(miibus, ed, miibus_driver, miibus_devclass, 0, NULL);
1240MODULE_DEPEND(ed, miibus, 1, 1, 1);
1241MODULE_DEPEND(ed, ether, 1, 1, 1);
1249MODULE_DEPEND(ed, miibus, 1, 1, 1);
1250MODULE_DEPEND(ed, ether, 1, 1, 1);