source:
hybrid/branches/releng-9.0-ileiden/nanobsd/misc/patches/backport-axe-to-8.2-release-v2.patch@
10122
Last change on this file since 10122 was 10122, checked in by , 13 years ago | |
---|---|
File size: 17.8 KB |
-
sys/dev/usb/usbdevs
1044 1044 product ASIX AX88178 0x1780 AX88178 1045 1045 product ASIX AX88772 0x7720 AX88772 1046 1046 product ASIX AX88772A 0x772a AX88772A USB 2.0 10/100 Ethernet 1047 product ASIX AX88772B 0x772b AX88772B USB 2.0 10/100 Ethernet 1047 1048 1048 1049 /* ASUS products */ 1049 1050 product ASUS2 USBN11 0x0b05 USB-N11 -
sys/dev/usb/net/if_axereg.h
92 92 #define AXE_CMD_SW_PHY_STATUS 0x0021 93 93 #define AXE_CMD_SW_PHY_SELECT 0x0122 94 94 95 /* AX88772A and AX88772B only. */ 96 #define AXE_CMD_READ_VLAN_CTRL 0x4027 97 #define AXE_CMD_WRITE_VLAN_CTRL 0x4028 98 99 #define AXE_772B_CMD_RXCTL_WRITE_CFG 0x012A 100 95 101 #define AXE_SW_RESET_CLEAR 0x00 96 102 #define AXE_SW_RESET_RR 0x01 97 103 #define AXE_SW_RESET_RT 0x02 … … 128 134 #define AXE_178_RXCMD_KEEP_INVALID_CRC 0x0004 129 135 #define AXE_RXCMD_BROADCAST 0x0008 130 136 #define AXE_RXCMD_MULTICAST 0x0010 137 #define AXE_RXCMD_ACCEPT_RUNT 0x0040 /* AX88772B */ 131 138 #define AXE_RXCMD_ENABLE 0x0080 132 139 #define AXE_178_RXCMD_MFB_MASK 0x0300 133 140 #define AXE_178_RXCMD_MFB_2048 0x0000 134 141 #define AXE_178_RXCMD_MFB_4096 0x0100 135 142 #define AXE_178_RXCMD_MFB_8192 0x0200 136 143 #define AXE_178_RXCMD_MFB_16384 0x0300 144 #define AXE_772B_RXCMD_HDR_TYPE_0 0x0000 145 #define AXE_772B_RXCMD_HDR_TYPE_1 0x0100 146 #define AXE_772B_RXCMD_IPHDR_ALIGN 0x0200 147 #define AXE_772B_RXCMD_ADD_CHKSUM 0x0400 148 #define AXE_RXCMD_LOOPBACK 0x1000 /* AX88772A/AX88772B */ 137 149 138 150 #define AXE_PHY_SEL_PRI 1 139 151 #define AXE_PHY_SEL_SEC 0 … … 172 184 #define AXE_PHY_MODE_REALTEK_8251CL 0x0E 173 185 #define AXE_PHY_MODE_ATTANSIC 0x40 174 186 187 /* AX88772A/AX88772B only. */ 188 #define AXE_SW_PHY_SELECT_EXT 0x0000 189 #define AXE_SW_PHY_SELECT_EMBEDDED 0x0001 190 #define AXE_SW_PHY_SELECT_AUTO 0x0002 191 #define AXE_SW_PHY_SELECT_SS_MII 0x0004 192 #define AXE_SW_PHY_SELECT_SS_RVRS_MII 0x0008 193 #define AXE_SW_PHY_SELECT_SS_RVRS_RMII 0x000C 194 #define AXE_SW_PHY_SELECT_SS_ENB 0x0010 195 196 /* AX88772A/AX88772B VLAN control. */ 197 #define AXE_VLAN_CTRL_ENB 0x00001000 198 #define AXE_VLAN_CTRL_STRIP 0x00002000 199 #define AXE_VLAN_CTRL_VID1_MASK 0x00000FFF 200 #define AXE_VLAN_CTRL_VID2_MASK 0x0FFF0000 201 175 202 #define AXE_BULK_BUF_SIZE 16384 /* bytes */ 176 203 177 204 #define AXE_CTL_READ 0x01 … … 180 207 #define AXE_CONFIG_IDX 0 /* config number 1 */ 181 208 #define AXE_IFACE_IDX 0 182 209 210 /* EEPROM Map. */ 211 #define AXE_EEPROM_772B_NODE_ID 0x04 212 #define AXE_EEPROM_772B_PHY_PWRCFG 0x18 213 214 struct ax88772b_mfb { 215 int byte_cnt; 216 int threshold; 217 int size; 218 }; 219 #define AX88772B_MFB_2K 0 220 #define AX88772B_MFB_4K 1 221 #define AX88772B_MFB_6K 2 222 #define AX88772B_MFB_8K 3 223 #define AX88772B_MFB_16K 4 224 #define AX88772B_MFB_20K 5 225 #define AX88772B_MFB_24K 6 226 #define AX88772B_MFB_32K 7 227 183 228 struct axe_sframe_hdr { 184 229 uint16_t len; 185 230 uint16_t ilen; … … 203 248 int sc_flags; 204 249 #define AXE_FLAG_LINK 0x0001 205 250 #define AXE_FLAG_772 0x1000 /* AX88772 */ 206 #define AXE_FLAG_178 0x2000 /* AX88178 */ 251 #define AXE_FLAG_772A 0x2000 /* AX88772A */ 252 #define AXE_FLAG_772B 0x4000 /* AX88772B */ 253 #define AXE_FLAG_178 0x8000 /* AX88178 */ 207 254 208 255 uint8_t sc_ipgs[3]; 209 256 uint8_t sc_phyaddrs[2]; 257 uint16_t sc_pwrcfg; 258 int sc_tx_bufsz; 210 259 }; 211 260 261 #define AXE_IS_178_FAMILY(sc) \ 262 ((sc)->sc_flags & (AXE_FLAG_772 | AXE_FLAG_772A | AXE_FLAG_772B | \ 263 AXE_FLAG_178)) 264 265 #define AXE_IS_772(sc) \ 266 ((sc)->sc_flags & (AXE_FLAG_772 | AXE_FLAG_772A | AXE_FLAG_772B)) 267 212 268 #define AXE_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) 213 269 #define AXE_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) 214 270 #define AXE_LOCK_ASSERT(_sc, t) mtx_assert(&(_sc)->sc_mtx, t) -
sys/dev/usb/net/if_axe.c
84 84 #include <sys/systm.h> 85 85 #include <sys/kernel.h> 86 86 #include <sys/bus.h> 87 #include <sys/linker_set.h>88 87 #include <sys/module.h> 89 88 #include <sys/lock.h> 90 89 #include <sys/mutex.h> … … 142 141 AXE_DEV(ASIX, AX88172, 0), 143 142 AXE_DEV(ASIX, AX88178, AXE_FLAG_178), 144 143 AXE_DEV(ASIX, AX88772, AXE_FLAG_772), 145 AXE_DEV(ASIX, AX88772A, AXE_FLAG_772), 144 AXE_DEV(ASIX, AX88772A, AXE_FLAG_772A), 145 AXE_DEV(ASIX, AX88772B, AXE_FLAG_772B), 146 146 AXE_DEV(ATEN, UC210T, 0), 147 147 AXE_DEV(BELKIN, F5D5055, AXE_FLAG_178), 148 148 AXE_DEV(BILLIONTON, USB2AR, 0), 149 AXE_DEV(CISCOLINKSYS, USB200MV2, AXE_FLAG_772 ),149 AXE_DEV(CISCOLINKSYS, USB200MV2, AXE_FLAG_772A), 150 150 AXE_DEV(COREGA, FETHER_USB2_TX, 0), 151 151 AXE_DEV(DLINK, DUBE100, 0), 152 152 AXE_DEV(DLINK, DUBE100B1, AXE_FLAG_772), … … 191 191 static int axe_cmd(struct axe_softc *, int, int, int, void *); 192 192 static void axe_ax88178_init(struct axe_softc *); 193 193 static void axe_ax88772_init(struct axe_softc *); 194 static void axe_ax88772_phywake(struct axe_softc *); 195 static void axe_ax88772a_init(struct axe_softc *); 196 static void axe_ax88772b_init(struct axe_softc *); 194 197 static int axe_get_phyno(struct axe_softc *, int); 195 198 196 199 static const struct usb_config axe_config[AXE_N_TRANSFER] = { … … 199 202 .type = UE_BULK, 200 203 .endpoint = UE_ADDR_ANY, 201 204 .direction = UE_DIR_OUT, 202 .bufsize = AXE_BULK_BUF_SIZE, 205 .frames = 16, 206 .bufsize = 16 * MCLBYTES, 203 207 .flags = {.pipe_bof = 1,.force_short_xfer = 1,}, 204 208 .callback = axe_bulk_write_callback, 205 209 .timeout = 10000, /* 10 seconds */ … … 216 220 }, 217 221 }; 218 222 223 static const struct ax88772b_mfb ax88772b_mfb_table[] = { 224 { 0x8000, 0x8001, 2048 }, 225 { 0x8100, 0x8147, 4096}, 226 { 0x8200, 0x81EB, 6144}, 227 { 0x8300, 0x83D7, 8192}, 228 { 0x8400, 0x851E, 16384}, 229 { 0x8500, 0x8666, 20480}, 230 { 0x8600, 0x87AE, 24576}, 231 { 0x8700, 0x8A3D, 32768} 232 }; 233 219 234 static device_method_t axe_methods[] = { 220 235 /* Device interface */ 221 236 DEVMETHOD(device_probe, axe_probe), … … 302 317 axe_cmd(sc, AXE_CMD_MII_OPMODE_HW, 0, 0, NULL); 303 318 304 319 val = le16toh(val); 305 if ( (sc->sc_flags & AXE_FLAG_772) != 0&& reg == MII_BMSR) {320 if (AXE_IS_772(sc) && reg == MII_BMSR) { 306 321 /* 307 322 * BMSR of AX88772 indicates that it supports extended 308 323 * capability but the extended status register is … … 384 399 val = 0; 385 400 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) 386 401 val |= AXE_MEDIA_FULL_DUPLEX; 387 if ( sc->sc_flags & (AXE_FLAG_178 | AXE_FLAG_772)) {402 if (AXE_IS_178_FAMILY(sc)) { 388 403 val |= AXE_178_MEDIA_RX_EN | AXE_178_MEDIA_MAGIC; 389 404 if ((sc->sc_flags & AXE_FLAG_178) != 0) 390 405 val |= AXE_178_MEDIA_ENCK; … … 420 435 421 436 AXE_LOCK_ASSERT(sc, MA_OWNED); 422 437 423 424 438 if (mii->mii_instance) { 439 struct mii_softc *miisc; 425 440 426 427 428 441 LIST_FOREACH(miisc, &mii->mii_phys, mii_list) 442 mii_phy_reset(miisc); 443 } 429 444 error = mii_mediachg(mii); 430 445 return (error); 431 446 } … … 516 531 axe_ax88178_init(struct axe_softc *sc) 517 532 { 518 533 struct usb_ether *ue; 519 int gpio0, phymode;534 int gpio0, ledmode, phymode; 520 535 uint16_t eeprom, val; 521 536 522 537 ue = &sc->sc_ue; … … 530 545 if (eeprom == 0xffff) { 531 546 phymode = AXE_PHY_MODE_MARVELL; 532 547 gpio0 = 1; 548 ledmode = 0; 533 549 } else { 534 550 phymode = eeprom & 0x7f; 535 551 gpio0 = (eeprom & 0x80) ? 0 : 1; 552 ledmode = eeprom >> 8; 536 553 } 537 554 538 555 if (bootverbose) 539 device_printf(sc->sc_ue.ue_dev, "EEPROM data : 0x%04x\n", 540 eeprom); 556 device_printf(sc->sc_ue.ue_dev, 557 "EEPROM data : 0x%04x, phymode : 0x%02x\n", eeprom, 558 phymode); 541 559 /* Program GPIOs depending on PHY hardware. */ 542 560 switch (phymode) { 543 561 case AXE_PHY_MODE_MARVELL: … … 549 567 AXE_GPIO_WRITE(AXE_GPIO0_EN | AXE_GPIO2_EN, hz / 4); 550 568 AXE_GPIO_WRITE(AXE_GPIO0_EN | AXE_GPIO2 | AXE_GPIO2_EN, 551 569 hz / 32); 552 } else 570 } else { 553 571 AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM | AXE_GPIO1 | 554 AXE_GPIO1_EN, hz / 32); 572 AXE_GPIO1_EN, hz / 3); 573 if (ledmode == 1) { 574 AXE_GPIO_WRITE(AXE_GPIO1_EN, hz / 3); 575 AXE_GPIO_WRITE(AXE_GPIO1 | AXE_GPIO1_EN, 576 hz / 3); 577 } else { 578 AXE_GPIO_WRITE(AXE_GPIO1 | AXE_GPIO1_EN | 579 AXE_GPIO2 | AXE_GPIO2_EN, hz / 32); 580 AXE_GPIO_WRITE(AXE_GPIO1 | AXE_GPIO1_EN | 581 AXE_GPIO2_EN, hz / 4); 582 AXE_GPIO_WRITE(AXE_GPIO1 | AXE_GPIO1_EN | 583 AXE_GPIO2 | AXE_GPIO2_EN, hz / 32); 584 } 585 } 555 586 break; 556 587 case AXE_PHY_MODE_CICADA: 588 case AXE_PHY_MODE_CICADA_V2: 589 case AXE_PHY_MODE_CICADA_V2_ASIX: 557 590 if (gpio0 == 1) 558 591 AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM | AXE_GPIO0 | 559 592 AXE_GPIO0_EN, hz / 32); … … 610 643 611 644 axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, 0, NULL); 612 645 } 613 #undef AXE_GPIO_WRITE614 646 615 647 static void 616 648 axe_ax88772_init(struct axe_softc *sc) … … 654 686 } 655 687 656 688 static void 689 axe_ax88772_phywake(struct axe_softc *sc) 690 { 691 struct usb_ether *ue; 692 693 ue = &sc->sc_ue; 694 if (sc->sc_phyno == AXE_772_PHY_NO_EPHY) { 695 /* Manually select internal(embedded) PHY - MAC mode. */ 696 axe_cmd(sc, AXE_CMD_SW_PHY_SELECT, 0, AXE_SW_PHY_SELECT_SS_ENB | 697 AXE_SW_PHY_SELECT_EMBEDDED | AXE_SW_PHY_SELECT_SS_MII, 698 NULL); 699 uether_pause(&sc->sc_ue, hz / 32); 700 } else { 701 /* 702 * Manually select external PHY - MAC mode. 703 * Reverse MII/RMII is for AX88772A PHY mode. 704 */ 705 axe_cmd(sc, AXE_CMD_SW_PHY_SELECT, 0, AXE_SW_PHY_SELECT_SS_ENB | 706 AXE_SW_PHY_SELECT_EXT | AXE_SW_PHY_SELECT_SS_MII, NULL); 707 uether_pause(&sc->sc_ue, hz / 32); 708 } 709 /* Take PHY out of power down. */ 710 axe_cmd(sc, AXE_CMD_SW_RESET_REG, 0, AXE_SW_RESET_IPPD | 711 AXE_SW_RESET_IPRL, NULL); 712 uether_pause(&sc->sc_ue, hz / 4); 713 axe_cmd(sc, AXE_CMD_SW_RESET_REG, 0, AXE_SW_RESET_IPRL, NULL); 714 uether_pause(&sc->sc_ue, hz); 715 axe_cmd(sc, AXE_CMD_SW_RESET_REG, 0, AXE_SW_RESET_CLEAR, NULL); 716 uether_pause(&sc->sc_ue, hz / 32); 717 axe_cmd(sc, AXE_CMD_SW_RESET_REG, 0, AXE_SW_RESET_IPRL, NULL); 718 uether_pause(&sc->sc_ue, hz / 32); 719 } 720 721 static void 722 axe_ax88772a_init(struct axe_softc *sc) 723 { 724 struct usb_ether *ue; 725 726 ue = &sc->sc_ue; 727 /* Reload EEPROM. */ 728 AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM, hz / 32); 729 axe_ax88772_phywake(sc); 730 /* Stop MAC. */ 731 axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, 0, NULL); 732 } 733 734 static void 735 axe_ax88772b_init(struct axe_softc *sc) 736 { 737 struct usb_ether *ue; 738 uint16_t eeprom; 739 uint8_t *eaddr; 740 int i; 741 742 ue = &sc->sc_ue; 743 /* Reload EEPROM. */ 744 AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM, hz / 32); 745 /* 746 * Save PHY power saving configuration(high byte) and 747 * clear EEPROM checksum value(low byte). 748 */ 749 axe_cmd(sc, AXE_CMD_SROM_READ, 0, AXE_EEPROM_772B_PHY_PWRCFG, &eeprom); 750 sc->sc_pwrcfg = le16toh(eeprom) & 0xFF00; 751 752 /* 753 * Auto-loaded default station address from internal ROM is 754 * 00:00:00:00:00:00 such that an explicit access to EEPROM 755 * is required to get real station address. 756 */ 757 eaddr = ue->ue_eaddr; 758 for (i = 0; i < ETHER_ADDR_LEN / 2; i++) { 759 axe_cmd(sc, AXE_CMD_SROM_READ, 0, AXE_EEPROM_772B_NODE_ID + i, 760 &eeprom); 761 eeprom = le16toh(eeprom); 762 *eaddr++ = (uint8_t)(eeprom & 0xFF); 763 *eaddr++ = (uint8_t)((eeprom >> 8) & 0xFF); 764 } 765 /* Wakeup PHY. */ 766 axe_ax88772_phywake(sc); 767 /* Stop MAC. */ 768 axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, 0, NULL); 769 } 770 771 #undef AXE_GPIO_WRITE 772 773 static void 657 774 axe_reset(struct axe_softc *sc) 658 775 { 659 776 struct usb_config_descriptor *cd; … … 668 785 669 786 /* Wait a little while for the chip to get its brains in order. */ 670 787 uether_pause(&sc->sc_ue, hz / 100); 788 789 /* Reinitialize controller to achieve full reset. */ 790 if (sc->sc_flags & AXE_FLAG_178) 791 axe_ax88178_init(sc); 792 else if (sc->sc_flags & AXE_FLAG_772) 793 axe_ax88772_init(sc); 794 else if (sc->sc_flags & AXE_FLAG_772A) 795 axe_ax88772a_init(sc); 796 else if (sc->sc_flags & AXE_FLAG_772B) 797 axe_ax88772b_init(sc); 671 798 } 672 799 673 800 static void … … 691 818 sc->sc_phyno = 0; 692 819 } 693 820 694 if (sc->sc_flags & AXE_FLAG_178) 821 /* Initialize controller and get station address. */ 822 if (sc->sc_flags & AXE_FLAG_178) { 695 823 axe_ax88178_init(sc); 696 else if (sc->sc_flags & AXE_FLAG_772) 824 sc->sc_tx_bufsz = 16 * 1024; 825 axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr); 826 } else if (sc->sc_flags & AXE_FLAG_772) { 697 827 axe_ax88772_init(sc); 698 699 /* 700 * Get station address. 701 */ 702 if (sc->sc_flags & (AXE_FLAG_178 | AXE_FLAG_772)) 828 sc->sc_tx_bufsz = 8 * 1024; 703 829 axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr); 704 else 830 } else if (sc->sc_flags & AXE_FLAG_772A) { 831 axe_ax88772a_init(sc); 832 sc->sc_tx_bufsz = 8 * 1024; 833 axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr); 834 } else if (sc->sc_flags & AXE_FLAG_772B) { 835 axe_ax88772b_init(sc); 836 sc->sc_tx_bufsz = 8 * 1024; 837 } else 705 838 axe_cmd(sc, AXE_172_CMD_READ_NODEID, 0, 0, ue->ue_eaddr); 706 839 707 840 /* 708 841 * Fetch IPG values. 709 842 */ 710 axe_cmd(sc, AXE_CMD_READ_IPG012, 0, 0, sc->sc_ipgs); 843 if (sc->sc_flags & (AXE_FLAG_772A | AXE_FLAG_772B)) { 844 /* Set IPG values. */ 845 sc->sc_ipgs[0] = 0x15; 846 sc->sc_ipgs[1] = 0x16; 847 sc->sc_ipgs[2] = 0x1A; 848 } else 849 axe_cmd(sc, AXE_CMD_READ_IPG012, 0, 0, sc->sc_ipgs); 711 850 } 712 851 713 852 /* … … 810 949 err = 0; 811 950 812 951 pc = usbd_xfer_get_frame(xfer, 0); 813 if ( sc->sc_flags & (AXE_FLAG_772 | AXE_FLAG_178)) {952 if (AXE_IS_178_FAMILY(sc)) { 814 953 while (pos < actlen) { 815 954 if ((pos + sizeof(hdr)) > actlen) { 816 955 /* too little data */ … … 875 1014 struct ifnet *ifp = uether_getifp(&sc->sc_ue); 876 1015 struct usb_page_cache *pc; 877 1016 struct mbuf *m; 878 int pos;1017 int nframes, pos; 879 1018 880 1019 switch (USB_GET_STATE(xfer)) { 881 1020 case USB_ST_TRANSFERRED: … … 892 1031 */ 893 1032 return; 894 1033 } 895 pos = 0;896 pc = usbd_xfer_get_frame(xfer, 0);897 1034 898 while (1) {899 1035 for (nframes = 0; nframes < 16 && 1036 !IFQ_DRV_IS_EMPTY(&ifp->if_snd); nframes++) { 900 1037 IFQ_DRV_DEQUEUE(&ifp->if_snd, m); 901 902 if (m == NULL) { 903 if (pos > 0) 904 break; /* send out data */ 905 return; 906 } 907 if (m->m_pkthdr.len > MCLBYTES) { 908 m->m_pkthdr.len = MCLBYTES; 909 } 910 if (sc->sc_flags & (AXE_FLAG_772 | AXE_FLAG_178)) { 911 1038 if (m == NULL) 1039 break; 1040 usbd_xfer_set_frame_offset(xfer, nframes * MCLBYTES, 1041 nframes); 1042 pos = 0; 1043 pc = usbd_xfer_get_frame(xfer, nframes); 1044 if (AXE_IS_178_FAMILY(sc)) { 912 1045 hdr.len = htole16(m->m_pkthdr.len); 913 1046 hdr.ilen = ~hdr.len; 914 915 1047 usbd_copy_in(pc, pos, &hdr, sizeof(hdr)); 916 917 1048 pos += sizeof(hdr); 918 919 /* 920 * NOTE: Some drivers force a short packet 921 * by appending a dummy header with zero 922 * length at then end of the USB transfer. 923 * This driver uses the 924 * USB_FORCE_SHORT_XFER flag instead. 925 */ 1049 usbd_m_copy_in(pc, pos, m, 0, m->m_pkthdr.len); 1050 pos += m->m_pkthdr.len; 1051 if ((pos % 512) == 0) { 1052 hdr.len = 0; 1053 hdr.ilen = 0xffff; 1054 usbd_copy_in(pc, pos, &hdr, 1055 sizeof(hdr)); 1056 pos += sizeof(hdr); 1057 } 1058 } else { 1059 usbd_m_copy_in(pc, pos, m, 0, m->m_pkthdr.len); 1060 pos += m->m_pkthdr.len; 926 1061 } 927 usbd_m_copy_in(pc, pos, m, 0, m->m_pkthdr.len);928 pos += m->m_pkthdr.len;929 1062 930 1063 /* 931 1064 * XXX … … 946 1079 947 1080 m_freem(m); 948 1081 949 if (sc->sc_flags & (AXE_FLAG_772 | AXE_FLAG_178)) { 950 if (pos > (AXE_BULK_BUF_SIZE - MCLBYTES - sizeof(hdr))) { 951 /* send out frame(s) */ 952 break; 953 } 954 } else { 955 /* send out frame */ 956 break; 957 } 1082 /* Set frame length. */ 1083 usbd_xfer_set_frame_len(xfer, nframes, pos); 958 1084 } 959 960 usbd_xfer_set_frame_len(xfer, 0, pos); 961 usbd_transfer_submit(xfer); 962 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1085 if (nframes != 0) { 1086 usbd_xfer_set_frames(xfer, nframes); 1087 usbd_transfer_submit(xfer); 1088 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1089 } 963 1090 return; 964 1091 /* NOTREACHED */ 965 1092 default: /* Error */ 966 1093 DPRINTFN(11, "transfer error, %s\n", 967 1094 usbd_errstr(error)); … … 1016 1143 1017 1144 AXE_LOCK_ASSERT(sc, MA_OWNED); 1018 1145 1146 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) 1147 return; 1148 1019 1149 /* Cancel pending I/O */ 1020 1150 axe_stop(ue); 1021 1151 1152 axe_reset(sc); 1153 1022 1154 /* Set MAC address. */ 1023 if ( sc->sc_flags & (AXE_FLAG_178 | AXE_FLAG_772))1155 if (AXE_IS_178_FAMILY(sc)) 1024 1156 axe_cmd(sc, AXE_178_CMD_WRITE_NODEID, 0, 0, IF_LLADDR(ifp)); 1025 1157 else 1026 1158 axe_cmd(sc, AXE_172_CMD_WRITE_NODEID, 0, 0, IF_LLADDR(ifp)); 1027 1159 1028 1160 /* Set transmitter IPG values */ 1029 if ( sc->sc_flags & (AXE_FLAG_178 | AXE_FLAG_772)) {1161 if (AXE_IS_178_FAMILY(sc)) 1030 1162 axe_cmd(sc, AXE_178_CMD_WRITE_IPG012, sc->sc_ipgs[2], 1031 1163 (sc->sc_ipgs[1] << 8) | (sc->sc_ipgs[0]), NULL); 1032 }else {1164 else { 1033 1165 axe_cmd(sc, AXE_172_CMD_WRITE_IPG0, 0, sc->sc_ipgs[0], NULL); 1034 1166 axe_cmd(sc, AXE_172_CMD_WRITE_IPG1, 0, sc->sc_ipgs[1], NULL); 1035 1167 axe_cmd(sc, AXE_172_CMD_WRITE_IPG2, 0, sc->sc_ipgs[2], NULL); 1036 1168 } 1037 1169 1038 /* Enable receiver, set RX mode */ 1170 /* AX88772B uses different maximum frame burst configuration. */ 1171 if (sc->sc_flags & AXE_FLAG_772B) 1172 axe_cmd(sc, AXE_772B_CMD_RXCTL_WRITE_CFG, 1173 ax88772b_mfb_table[AX88772B_MFB_16K].threshold, 1174 ax88772b_mfb_table[AX88772B_MFB_16K].byte_cnt, NULL); 1175 1176 /* Enable receiver, set RX mode. */ 1039 1177 rxmode = (AXE_RXCMD_MULTICAST | AXE_RXCMD_ENABLE); 1040 if (sc->sc_flags & (AXE_FLAG_178 | AXE_FLAG_772)) { 1041 #if 0 1042 rxmode |= AXE_178_RXCMD_MFB_2048; /* chip default */ 1043 #else 1044 /* 1045 * Default Rx buffer size is too small to get 1046 * maximum performance. 1047 */ 1048 rxmode |= AXE_178_RXCMD_MFB_16384; 1049 #endif 1178 if (AXE_IS_178_FAMILY(sc)) { 1179 if (sc->sc_flags & AXE_FLAG_772B) { 1180 /* 1181 * Select RX header format type 1. Aligning IP 1182 * header on 4 byte boundary is not needed 1183 * because we always copy the received frame in 1184 * RX handler. 1185 */ 1186 rxmode |= AXE_772B_RXCMD_HDR_TYPE_1; 1187 } else { 1188 /* 1189 * Default Rx buffer size is too small to get 1190 * maximum performance. 1191 */ 1192 rxmode |= AXE_178_RXCMD_MFB_16384; 1193 } 1050 1194 } else { 1051 1195 rxmode |= AXE_172_RXCMD_UNICAST; 1052 1196 } … … 1066 1210 usbd_xfer_set_stall(sc->sc_xfer[AXE_BULK_DT_WR]); 1067 1211 1068 1212 ifp->if_drv_flags |= IFF_DRV_RUNNING; 1213 /* Switch to selected media. */ 1214 axe_ifmedia_upd(ifp); 1069 1215 axe_start(ue); 1070 1216 } 1071 1217 … … 1107 1253 */ 1108 1254 usbd_transfer_stop(sc->sc_xfer[AXE_BULK_DT_WR]); 1109 1255 usbd_transfer_stop(sc->sc_xfer[AXE_BULK_DT_RD]); 1110 1111 axe_reset(sc);1112 1256 }
Note:
See TracBrowser
for help on using the repository browser.