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); |