1 /* 2 * Solaris driver for ethernet cards based on the ADMtek Centaur 3 * 4 * Copyright (c) 2007 by Garrett D'Amore <garrett@damore.org>. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the author nor the names of any co-contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' 20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 /* 32 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 33 * Use is subject to license terms. 34 */ 35 36 37 #include <sys/varargs.h> 38 #include <sys/types.h> 39 #include <sys/modctl.h> 40 #include <sys/conf.h> 41 #include <sys/devops.h> 42 #include <sys/stream.h> 43 #include <sys/strsun.h> 44 #include <sys/cmn_err.h> 45 #include <sys/ethernet.h> 46 #include <sys/kmem.h> 47 #include <sys/time.h> 48 #include <sys/crc32.h> 49 #include <sys/miiregs.h> 50 #include <sys/mac.h> 51 #include <sys/mac_ether.h> 52 #include <sys/ddi.h> 53 #include <sys/sunddi.h> 54 #include <sys/vlan.h> 55 56 #include "afe.h" 57 #include "afeimpl.h" 58 59 /* 60 * Driver globals. 61 */ 62 63 /* patchable debug flag ... must not be static! */ 64 #ifdef DEBUG 65 unsigned afe_debug = DWARN; 66 #endif 67 68 /* table of supported devices */ 69 static afe_card_t afe_cards[] = { 70 71 /* 72 * ADMtek Centaur and Comet 73 */ 74 { 0x1317, 0x0981, "ADMtek AL981", MODEL_COMET }, 75 { 0x1317, 0x0985, "ADMtek AN983", MODEL_CENTAUR }, 76 { 0x1317, 0x1985, "ADMtek AN985", MODEL_CENTAUR }, 77 { 0x1317, 0x9511, "ADMtek ADM9511", MODEL_CENTAUR }, 78 { 0x1317, 0x9513, "ADMtek ADM9513", MODEL_CENTAUR }, 79 /* 80 * Accton just relabels other companies' controllers 81 */ 82 { 0x1113, 0x1216, "Accton EN5251", MODEL_CENTAUR }, 83 /* 84 * Models listed here. 85 */ 86 { 0x10b7, 0x9300, "3Com 3CSOHO100B-TX", MODEL_CENTAUR }, 87 { 0x1113, 0xec02, "SMC SMC1244TX", MODEL_CENTAUR }, 88 { 0x10b8, 0x1255, "SMC SMC1255TX", MODEL_CENTAUR }, 89 { 0x111a, 0x1020, "Siemens SpeedStream PCI 10/100", MODEL_CENTAUR }, 90 { 0x1113, 0x1207, "Accton EN1207F", MODEL_CENTAUR }, 91 { 0x1113, 0x2242, "Accton EN2242", MODEL_CENTAUR }, 92 { 0x1113, 0x2220, "Accton EN2220", MODEL_CENTAUR }, 93 { 0x1113, 0x9216, "3M VOL-N100VF+TX", MODEL_CENTAUR }, 94 { 0x1317, 0x0574, "Linksys LNE100TX", MODEL_CENTAUR }, 95 { 0x1317, 0x0570, "Linksys NC100", MODEL_CENTAUR }, 96 { 0x1385, 0x511a, "Netgear FA511", MODEL_CENTAUR }, 97 { 0x13d1, 0xab02, "AboCom FE2500", MODEL_CENTAUR }, 98 { 0x13d1, 0xab03, "AboCom PCM200", MODEL_CENTAUR }, 99 { 0x13d1, 0xab08, "AboCom FE2500MX", MODEL_CENTAUR }, 100 { 0x1414, 0x0001, "Microsoft MN-120", MODEL_CENTAUR }, 101 { 0x16ec, 0x00ed, "U.S. Robotics USR997900", MODEL_CENTAUR }, 102 { 0x1734, 0x100c, "Fujitsu-Siemens D1961", MODEL_CENTAUR }, 103 { 0x1737, 0xab08, "Linksys PCMPC200", MODEL_CENTAUR }, 104 { 0x1737, 0xab09, "Linksys PCM200", MODEL_CENTAUR }, 105 { 0x17b3, 0xab08, "Hawking PN672TX", MODEL_CENTAUR }, 106 }; 107 108 #define ETHERVLANMTU (ETHERMAX + 4) 109 110 /* 111 * Function prototypes 112 */ 113 static int afe_attach(dev_info_t *, ddi_attach_cmd_t); 114 static int afe_detach(dev_info_t *, ddi_detach_cmd_t); 115 static int afe_resume(dev_info_t *); 116 static int afe_m_unicst(void *, const uint8_t *); 117 static int afe_m_multicst(void *, boolean_t, const uint8_t *); 118 static int afe_m_promisc(void *, boolean_t); 119 static mblk_t *afe_m_tx(void *, mblk_t *); 120 static int afe_m_stat(void *, uint_t, uint64_t *); 121 static int afe_m_start(void *); 122 static void afe_m_stop(void *); 123 static int afe_m_getprop(void *, const char *, mac_prop_id_t, uint_t, 124 uint_t, void *, uint_t *); 125 static int afe_m_setprop(void *, const char *, mac_prop_id_t, uint_t, 126 const void *); 127 static unsigned afe_intr(caddr_t); 128 static void afe_startmac(afe_t *); 129 static void afe_stopmac(afe_t *); 130 static void afe_resetrings(afe_t *); 131 static boolean_t afe_initialize(afe_t *); 132 static void afe_startall(afe_t *); 133 static void afe_stopall(afe_t *); 134 static void afe_resetall(afe_t *); 135 static afe_txbuf_t *afe_alloctxbuf(afe_t *); 136 static void afe_destroytxbuf(afe_txbuf_t *); 137 static afe_rxbuf_t *afe_allocrxbuf(afe_t *); 138 static void afe_destroyrxbuf(afe_rxbuf_t *); 139 static boolean_t afe_send(afe_t *, mblk_t *); 140 static int afe_allocrxring(afe_t *); 141 static void afe_freerxring(afe_t *); 142 static int afe_alloctxring(afe_t *); 143 static void afe_freetxring(afe_t *); 144 static void afe_error(dev_info_t *, char *, ...); 145 static void afe_setrxfilt(afe_t *); 146 static uint8_t afe_sromwidth(afe_t *); 147 static uint16_t afe_readsromword(afe_t *, unsigned); 148 static void afe_readsrom(afe_t *, unsigned, unsigned, char *); 149 static void afe_getfactaddr(afe_t *, uchar_t *); 150 static uint8_t afe_miireadbit(afe_t *); 151 static void afe_miiwritebit(afe_t *, uint8_t); 152 static void afe_miitristate(afe_t *); 153 static uint16_t afe_miiread(afe_t *, int, int); 154 static void afe_miiwrite(afe_t *, int, int, uint16_t); 155 static uint16_t afe_miireadgeneral(afe_t *, int, int); 156 static void afe_miiwritegeneral(afe_t *, int, int, uint16_t); 157 static uint16_t afe_miireadcomet(afe_t *, int, int); 158 static void afe_miiwritecomet(afe_t *, int, int, uint16_t); 159 static int afe_getmiibit(afe_t *, uint16_t, uint16_t); 160 static void afe_startphy(afe_t *); 161 static void afe_stopphy(afe_t *); 162 static void afe_reportlink(afe_t *); 163 static void afe_checklink(afe_t *); 164 static void afe_checklinkcomet(afe_t *); 165 static void afe_checklinkcentaur(afe_t *); 166 static void afe_checklinkmii(afe_t *); 167 static void afe_disableinterrupts(afe_t *); 168 static void afe_enableinterrupts(afe_t *); 169 static void afe_reclaim(afe_t *); 170 static mblk_t *afe_receive(afe_t *); 171 172 #ifdef DEBUG 173 static void afe_dprintf(afe_t *, const char *, int, char *, ...); 174 #endif 175 176 #define KIOIP KSTAT_INTR_PTR(afep->afe_intrstat) 177 178 static mac_callbacks_t afe_m_callbacks = { 179 MC_SETPROP | MC_GETPROP, 180 afe_m_stat, 181 afe_m_start, 182 afe_m_stop, 183 afe_m_promisc, 184 afe_m_multicst, 185 afe_m_unicst, 186 afe_m_tx, 187 NULL, /* mc_resources */ 188 NULL, /* mc_ioctl */ 189 NULL, /* mc_getcapab */ 190 NULL, /* mc_open */ 191 NULL, /* mc_close */ 192 afe_m_setprop, 193 afe_m_getprop, 194 }; 195 196 197 /* 198 * Stream information 199 */ 200 DDI_DEFINE_STREAM_OPS(afe_devops, nulldev, nulldev, afe_attach, afe_detach, 201 nodev, NULL, D_MP, NULL, ddi_quiesce_not_supported); 202 203 /* 204 * Module linkage information. 205 */ 206 207 static struct modldrv afe_modldrv = { 208 &mod_driverops, /* drv_modops */ 209 "ADMtek Fast Ethernet", /* drv_linkinfo */ 210 &afe_devops /* drv_dev_ops */ 211 }; 212 213 static struct modlinkage afe_modlinkage = { 214 MODREV_1, /* ml_rev */ 215 { &afe_modldrv, NULL } /* ml_linkage */ 216 }; 217 218 /* 219 * Device attributes. 220 */ 221 static ddi_device_acc_attr_t afe_devattr = { 222 DDI_DEVICE_ATTR_V0, 223 DDI_STRUCTURE_LE_ACC, 224 DDI_STRICTORDER_ACC 225 }; 226 227 static ddi_device_acc_attr_t afe_bufattr = { 228 DDI_DEVICE_ATTR_V0, 229 DDI_NEVERSWAP_ACC, 230 DDI_STRICTORDER_ACC 231 }; 232 233 static ddi_dma_attr_t afe_dma_attr = { 234 DMA_ATTR_V0, /* dma_attr_version */ 235 0, /* dma_attr_addr_lo */ 236 0xFFFFFFFFU, /* dma_attr_addr_hi */ 237 0x7FFFFFFFU, /* dma_attr_count_max */ 238 4, /* dma_attr_align */ 239 0x3F, /* dma_attr_burstsizes */ 240 1, /* dma_attr_minxfer */ 241 0xFFFFFFFFU, /* dma_attr_maxxfer */ 242 0xFFFFFFFFU, /* dma_attr_seg */ 243 1, /* dma_attr_sgllen */ 244 1, /* dma_attr_granular */ 245 0 /* dma_attr_flags */ 246 }; 247 248 /* 249 * Tx buffers can be arbitrarily aligned. Additionally, they can 250 * cross a page boundary, so we use the two buffer addresses of the 251 * chip to provide a two-entry scatter-gather list. 252 */ 253 static ddi_dma_attr_t afe_dma_txattr = { 254 DMA_ATTR_V0, /* dma_attr_version */ 255 0, /* dma_attr_addr_lo */ 256 0xFFFFFFFFU, /* dma_attr_addr_hi */ 257 0x7FFFFFFFU, /* dma_attr_count_max */ 258 1, /* dma_attr_align */ 259 0x3F, /* dma_attr_burstsizes */ 260 1, /* dma_attr_minxfer */ 261 0xFFFFFFFFU, /* dma_attr_maxxfer */ 262 0xFFFFFFFFU, /* dma_attr_seg */ 263 2, /* dma_attr_sgllen */ 264 1, /* dma_attr_granular */ 265 0 /* dma_attr_flags */ 266 }; 267 268 /* 269 * Ethernet addresses. 270 */ 271 static uchar_t afe_broadcast[ETHERADDRL] = { 272 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 273 }; 274 275 /* 276 * DDI entry points. 277 */ 278 int 279 _init(void) 280 { 281 int rv; 282 mac_init_ops(&afe_devops, "afe"); 283 if ((rv = mod_install(&afe_modlinkage)) != DDI_SUCCESS) { 284 mac_fini_ops(&afe_devops); 285 } 286 return (rv); 287 } 288 289 int 290 _fini(void) 291 { 292 int rv; 293 if ((rv = mod_remove(&afe_modlinkage)) == DDI_SUCCESS) { 294 mac_fini_ops(&afe_devops); 295 } 296 return (rv); 297 } 298 299 int 300 _info(struct modinfo *modinfop) 301 { 302 return (mod_info(&afe_modlinkage, modinfop)); 303 } 304 305 int 306 afe_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 307 { 308 afe_t *afep; 309 mac_register_t *macp; 310 int inst = ddi_get_instance(dip); 311 ddi_acc_handle_t pci; 312 uint16_t venid; 313 uint16_t devid; 314 uint16_t svid; 315 uint16_t ssid; 316 uint16_t cachesize; 317 afe_card_t *cardp; 318 int i; 319 320 switch (cmd) { 321 case DDI_RESUME: 322 return (afe_resume(dip)); 323 324 case DDI_ATTACH: 325 break; 326 327 default: 328 return (DDI_FAILURE); 329 } 330 331 /* this card is a bus master, reject any slave-only slot */ 332 if (ddi_slaveonly(dip) == DDI_SUCCESS) { 333 afe_error(dip, "slot does not support PCI bus-master"); 334 return (DDI_FAILURE); 335 } 336 /* PCI devices shouldn't generate hilevel interrupts */ 337 if (ddi_intr_hilevel(dip, 0) != 0) { 338 afe_error(dip, "hilevel interrupts not supported"); 339 return (DDI_FAILURE); 340 } 341 if (pci_config_setup(dip, &pci) != DDI_SUCCESS) { 342 afe_error(dip, "unable to setup PCI config handle"); 343 return (DDI_FAILURE); 344 } 345 346 venid = pci_config_get16(pci, PCI_VID); 347 devid = pci_config_get16(pci, PCI_DID); 348 svid = pci_config_get16(pci, PCI_SVID); 349 ssid = pci_config_get16(pci, PCI_SSID); 350 351 /* 352 * Note: ADMtek boards seem to misprogram themselves with bogus 353 * timings, which do not seem to work properly on SPARC. We 354 * reprogram them zero (but only if they appear to be broken), 355 * which seems to at least work. Its unclear that this is a 356 * legal or wise practice to me, but it certainly works better 357 * than the original values. (I would love to hear 358 * suggestions for better values, or a better strategy.) 359 */ 360 if ((pci_config_get8(pci, PCI_MINGNT) == 0xff) && 361 (pci_config_get8(pci, PCI_MAXLAT) == 0xff)) { 362 pci_config_put8(pci, PCI_MINGNT, 0); 363 pci_config_put8(pci, PCI_MAXLAT, 0); 364 } 365 366 /* 367 * the last entry in the card table matches every possible 368 * card, so the for-loop always terminates properly. 369 */ 370 cardp = NULL; 371 for (i = 0; i < (sizeof (afe_cards) / sizeof (afe_card_t)); i++) { 372 if ((venid == afe_cards[i].card_venid) && 373 (devid == afe_cards[i].card_devid)) { 374 cardp = &afe_cards[i]; 375 } 376 if ((svid == afe_cards[i].card_venid) && 377 (ssid == afe_cards[i].card_devid)) { 378 cardp = &afe_cards[i]; 379 break; 380 } 381 } 382 383 if (cardp == NULL) { 384 pci_config_teardown(&pci); 385 afe_error(dip, "Unable to identify PCI card"); 386 return (DDI_FAILURE); 387 } 388 389 if (ddi_prop_update_string(DDI_DEV_T_NONE, dip, "model", 390 cardp->card_cardname) != DDI_PROP_SUCCESS) { 391 pci_config_teardown(&pci); 392 afe_error(dip, "Unable to create model property"); 393 return (DDI_FAILURE); 394 } 395 396 /* 397 * Grab the PCI cachesize -- we use this to program the 398 * cache-optimization bus access bits. 399 */ 400 cachesize = pci_config_get8(pci, PCI_CLS); 401 402 /* this cannot fail */ 403 afep = kmem_zalloc(sizeof (afe_t), KM_SLEEP); 404 ddi_set_driver_private(dip, afep); 405 406 /* get the interrupt block cookie */ 407 if (ddi_get_iblock_cookie(dip, 0, &afep->afe_icookie) != DDI_SUCCESS) { 408 afe_error(dip, "ddi_get_iblock_cookie failed"); 409 pci_config_teardown(&pci); 410 kmem_free(afep, sizeof (afe_t)); 411 return (DDI_FAILURE); 412 } 413 414 afep->afe_dip = dip; 415 afep->afe_cardp = cardp; 416 afep->afe_phyaddr = -1; 417 afep->afe_cachesize = cachesize; 418 419 /* default properties */ 420 afep->afe_adv_aneg = !!ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 421 "adv_autoneg_cap", 1); 422 afep->afe_adv_100T4 = !!ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 423 "adv_100T4_cap", 1); 424 afep->afe_adv_100fdx = !!ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 425 "adv_100fdx_cap", 1); 426 afep->afe_adv_100hdx = !!ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 427 "adv_100hdx_cap", 1); 428 afep->afe_adv_10fdx = !!ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 429 "adv_10fdx_cap", 1); 430 afep->afe_adv_10hdx = !!ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 431 "adv_10hdx_cap", 1); 432 433 afep->afe_forcefiber = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 434 "fiber", 0); 435 436 DBG(DPCI, "PCI vendor id = %x", venid); 437 DBG(DPCI, "PCI device id = %x", devid); 438 DBG(DPCI, "PCI cachesize = %d", cachesize); 439 DBG(DPCI, "PCI COMM = %x", pci_config_get8(pci, PCI_CMD)); 440 DBG(DPCI, "PCI STAT = %x", pci_config_get8(pci, PCI_STAT)); 441 442 mutex_init(&afep->afe_xmtlock, NULL, MUTEX_DRIVER, afep->afe_icookie); 443 mutex_init(&afep->afe_intrlock, NULL, MUTEX_DRIVER, afep->afe_icookie); 444 445 /* 446 * Enable bus master, IO space, and memory space accesses. 447 */ 448 pci_config_put16(pci, PCI_CMD, 449 pci_config_get16(pci, PCI_CMD) | PCI_CMD_BME | PCI_CMD_MAE); 450 451 /* we're done with this now, drop it */ 452 pci_config_teardown(&pci); 453 454 /* 455 * Initialize interrupt kstat. This should not normally fail, since 456 * we don't use a persistent stat. We do it this way to avoid having 457 * to test for it at run time on the hot path. 458 */ 459 afep->afe_intrstat = kstat_create("afe", inst, "intr", "controller", 460 KSTAT_TYPE_INTR, 1, 0); 461 if (afep->afe_intrstat == NULL) { 462 afe_error(dip, "kstat_create failed"); 463 goto failed; 464 } 465 kstat_install(afep->afe_intrstat); 466 467 /* 468 * Map in the device registers. 469 */ 470 if (ddi_regs_map_setup(dip, 1, (caddr_t *)&afep->afe_regs, 471 0, 0, &afe_devattr, &afep->afe_regshandle)) { 472 afe_error(dip, "ddi_regs_map_setup failed"); 473 goto failed; 474 } 475 476 /* 477 * Allocate DMA resources (descriptor rings and buffers). 478 */ 479 if ((afe_allocrxring(afep) != DDI_SUCCESS) || 480 (afe_alloctxring(afep) != DDI_SUCCESS)) { 481 afe_error(dip, "unable to allocate DMA resources"); 482 goto failed; 483 } 484 485 /* Initialize the chip. */ 486 mutex_enter(&afep->afe_intrlock); 487 mutex_enter(&afep->afe_xmtlock); 488 if (!afe_initialize(afep)) { 489 mutex_exit(&afep->afe_xmtlock); 490 mutex_exit(&afep->afe_intrlock); 491 goto failed; 492 } 493 mutex_exit(&afep->afe_xmtlock); 494 mutex_exit(&afep->afe_intrlock); 495 496 /* Determine the number of address bits to our EEPROM. */ 497 afep->afe_sromwidth = afe_sromwidth(afep); 498 499 /* 500 * Get the factory ethernet address. This becomes the current 501 * ethernet address (it can be overridden later via ifconfig). 502 */ 503 afe_getfactaddr(afep, afep->afe_curraddr); 504 afep->afe_promisc = B_FALSE; 505 506 /* make sure we add configure the initial filter */ 507 (void) afe_m_unicst(afep, afep->afe_curraddr); 508 (void) afe_m_multicst(afep, B_TRUE, afe_broadcast); 509 510 /* 511 * Establish interrupt handler. 512 */ 513 if (ddi_add_intr(dip, 0, NULL, NULL, afe_intr, (caddr_t)afep) != 514 DDI_SUCCESS) { 515 afe_error(dip, "unable to add interrupt"); 516 goto failed; 517 } 518 519 /* TODO: do the power management stuff */ 520 521 if ((macp = mac_alloc(MAC_VERSION)) == NULL) { 522 afe_error(dip, "mac_alloc failed"); 523 goto failed; 524 } 525 526 macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER; 527 macp->m_driver = afep; 528 macp->m_dip = dip; 529 macp->m_src_addr = afep->afe_curraddr; 530 macp->m_callbacks = &afe_m_callbacks; 531 macp->m_min_sdu = 0; 532 macp->m_max_sdu = ETHERMTU; 533 macp->m_margin = VLAN_TAGSZ; 534 535 if (mac_register(macp, &afep->afe_mh) == DDI_SUCCESS) { 536 mac_free(macp); 537 return (DDI_SUCCESS); 538 } 539 540 /* failed to register with MAC */ 541 mac_free(macp); 542 failed: 543 if (afep->afe_icookie != NULL) { 544 ddi_remove_intr(dip, 0, afep->afe_icookie); 545 } 546 if (afep->afe_intrstat) { 547 kstat_delete(afep->afe_intrstat); 548 } 549 mutex_destroy(&afep->afe_intrlock); 550 mutex_destroy(&afep->afe_xmtlock); 551 552 afe_freerxring(afep); 553 afe_freetxring(afep); 554 555 if (afep->afe_regshandle != NULL) { 556 ddi_regs_map_free(&afep->afe_regshandle); 557 } 558 kmem_free(afep, sizeof (afe_t)); 559 return (DDI_FAILURE); 560 } 561 562 int 563 afe_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 564 { 565 afe_t *afep; 566 567 afep = ddi_get_driver_private(dip); 568 if (afep == NULL) { 569 afe_error(dip, "no soft state in detach!"); 570 return (DDI_FAILURE); 571 } 572 573 switch (cmd) { 574 case DDI_DETACH: 575 576 if (mac_unregister(afep->afe_mh) != 0) { 577 return (DDI_FAILURE); 578 } 579 580 /* make sure hardware is quiesced */ 581 mutex_enter(&afep->afe_intrlock); 582 mutex_enter(&afep->afe_xmtlock); 583 afep->afe_flags &= ~AFE_RUNNING; 584 afe_stopall(afep); 585 mutex_exit(&afep->afe_xmtlock); 586 mutex_exit(&afep->afe_intrlock); 587 588 /* clean up and shut down device */ 589 ddi_remove_intr(dip, 0, afep->afe_icookie); 590 591 /* clean up kstats */ 592 kstat_delete(afep->afe_intrstat); 593 594 ddi_prop_remove_all(dip); 595 596 /* free up any left over buffers or DMA resources */ 597 afe_freerxring(afep); 598 afe_freetxring(afep); 599 600 ddi_regs_map_free(&afep->afe_regshandle); 601 mutex_destroy(&afep->afe_intrlock); 602 mutex_destroy(&afep->afe_xmtlock); 603 604 kmem_free(afep, sizeof (afe_t)); 605 return (DDI_SUCCESS); 606 607 case DDI_SUSPEND: 608 /* quiesce the hardware */ 609 mutex_enter(&afep->afe_intrlock); 610 mutex_enter(&afep->afe_xmtlock); 611 afep->afe_flags |= AFE_SUSPENDED; 612 afe_stopall(afep); 613 mutex_exit(&afep->afe_xmtlock); 614 mutex_exit(&afep->afe_intrlock); 615 return (DDI_SUCCESS); 616 default: 617 return (DDI_FAILURE); 618 } 619 } 620 621 int 622 afe_resume(dev_info_t *dip) 623 { 624 afe_t *afep; 625 626 if ((afep = ddi_get_driver_private(dip)) == NULL) { 627 return (DDI_FAILURE); 628 } 629 630 mutex_enter(&afep->afe_intrlock); 631 mutex_enter(&afep->afe_xmtlock); 632 633 afep->afe_flags &= ~AFE_SUSPENDED; 634 635 /* re-initialize chip */ 636 if (!afe_initialize(afep)) { 637 afe_error(afep->afe_dip, "unable to resume chip!"); 638 afep->afe_flags |= AFE_SUSPENDED; 639 mutex_exit(&afep->afe_intrlock); 640 mutex_exit(&afep->afe_xmtlock); 641 return (DDI_SUCCESS); 642 } 643 644 /* start the chip */ 645 if (afep->afe_flags & AFE_RUNNING) { 646 afe_startall(afep); 647 } 648 649 /* drop locks */ 650 mutex_exit(&afep->afe_xmtlock); 651 mutex_exit(&afep->afe_intrlock); 652 653 return (DDI_SUCCESS); 654 } 655 656 void 657 afe_setrxfilt(afe_t *afep) 658 { 659 unsigned rxen, pa0, pa1; 660 661 if (afep->afe_flags & AFE_SUSPENDED) { 662 /* don't touch a suspended interface */ 663 return; 664 } 665 666 rxen = GETCSR(afep, CSR_NAR) & NAR_RX_ENABLE; 667 668 /* stop receiver */ 669 if (rxen) { 670 afe_stopmac(afep); 671 } 672 673 /* program promiscuous mode */ 674 if (afep->afe_promisc) 675 SETBIT(afep, CSR_NAR, NAR_RX_PROMISC); 676 else 677 CLRBIT(afep, CSR_NAR, NAR_RX_PROMISC); 678 679 /* program mac address */ 680 pa0 = (afep->afe_curraddr[3] << 24) | (afep->afe_curraddr[2] << 16) | 681 (afep->afe_curraddr[1] << 8) | afep->afe_curraddr[0]; 682 pa1 = (afep->afe_curraddr[5] << 8) | afep->afe_curraddr[4]; 683 684 DBG(DMACID, "programming PAR0 with %x", pa0); 685 DBG(DMACID, "programming PAR1 with %x", pa1); 686 PUTCSR(afep, CSR_PAR0, pa0); 687 PUTCSR(afep, CSR_PAR1, pa1); 688 if (rxen) { 689 SETBIT(afep, CSR_NAR, rxen); 690 } 691 692 DBG(DMACID, "programming MAR0 = %x", afep->afe_mctab[0]); 693 DBG(DMACID, "programming MAR1 = %x", afep->afe_mctab[1]); 694 695 /* program multicast filter */ 696 if (AFE_MODEL(afep) == MODEL_COMET) { 697 if (afep->afe_mctab[0] || afep->afe_mctab[1]) { 698 SETBIT(afep, CSR_NAR, NAR_RX_MULTI); 699 } else { 700 CLRBIT(afep, CSR_NAR, NAR_RX_MULTI); 701 } 702 } else { 703 CLRBIT(afep, CSR_NAR, NAR_RX_MULTI); 704 PUTCSR(afep, CSR_MAR0, afep->afe_mctab[0]); 705 PUTCSR(afep, CSR_MAR1, afep->afe_mctab[1]); 706 } 707 708 /* restart receiver */ 709 if (rxen) { 710 afe_startmac(afep); 711 } 712 } 713 714 int 715 afe_m_multicst(void *arg, boolean_t add, const uint8_t *macaddr) 716 { 717 afe_t *afep = arg; 718 int index; 719 uint32_t crc; 720 uint32_t bit; 721 uint32_t newval, oldval; 722 723 CRC32(crc, macaddr, ETHERADDRL, -1U, crc32_table); 724 crc %= AFE_MCHASH; 725 726 /* bit within a 32-bit word */ 727 index = crc / 32; 728 bit = (1 << (crc % 32)); 729 730 mutex_enter(&afep->afe_intrlock); 731 mutex_enter(&afep->afe_xmtlock); 732 newval = oldval = afep->afe_mctab[index]; 733 734 if (add) { 735 afep->afe_mccount[crc]++; 736 if (afep->afe_mccount[crc] == 1) 737 newval |= bit; 738 } else { 739 afep->afe_mccount[crc]--; 740 if (afep->afe_mccount[crc] == 0) 741 newval &= ~bit; 742 } 743 if (newval != oldval) { 744 afep->afe_mctab[index] = newval; 745 afe_setrxfilt(afep); 746 } 747 748 mutex_exit(&afep->afe_xmtlock); 749 mutex_exit(&afep->afe_intrlock); 750 751 return (0); 752 } 753 754 int 755 afe_m_promisc(void *arg, boolean_t on) 756 { 757 afe_t *afep = arg; 758 759 /* exclusive access to the card while we reprogram it */ 760 mutex_enter(&afep->afe_intrlock); 761 mutex_enter(&afep->afe_xmtlock); 762 /* save current promiscuous mode state for replay in resume */ 763 afep->afe_promisc = on; 764 765 afe_setrxfilt(afep); 766 mutex_exit(&afep->afe_xmtlock); 767 mutex_exit(&afep->afe_intrlock); 768 769 return (0); 770 } 771 772 int 773 afe_m_unicst(void *arg, const uint8_t *macaddr) 774 { 775 afe_t *afep = arg; 776 777 /* exclusive access to the card while we reprogram it */ 778 mutex_enter(&afep->afe_intrlock); 779 mutex_enter(&afep->afe_xmtlock); 780 781 bcopy(macaddr, afep->afe_curraddr, ETHERADDRL); 782 afe_setrxfilt(afep); 783 784 mutex_exit(&afep->afe_xmtlock); 785 mutex_exit(&afep->afe_intrlock); 786 787 return (0); 788 } 789 790 mblk_t * 791 afe_m_tx(void *arg, mblk_t *mp) 792 { 793 afe_t *afep = arg; 794 mblk_t *nmp; 795 796 mutex_enter(&afep->afe_xmtlock); 797 798 if (afep->afe_flags & AFE_SUSPENDED) { 799 while ((nmp = mp) != NULL) { 800 afep->afe_carrier_errors++; 801 mp = mp->b_next; 802 freemsg(nmp); 803 } 804 mutex_exit(&afep->afe_xmtlock); 805 return (NULL); 806 } 807 808 while (mp != NULL) { 809 nmp = mp->b_next; 810 mp->b_next = NULL; 811 812 if (!afe_send(afep, mp)) { 813 mp->b_next = nmp; 814 break; 815 } 816 mp = nmp; 817 } 818 mutex_exit(&afep->afe_xmtlock); 819 820 return (mp); 821 } 822 823 /* 824 * Hardware management. 825 */ 826 static boolean_t 827 afe_initialize(afe_t *afep) 828 { 829 int i; 830 unsigned val; 831 uint32_t par, nar; 832 833 ASSERT(mutex_owned(&afep->afe_intrlock)); 834 ASSERT(mutex_owned(&afep->afe_xmtlock)); 835 836 DBG(DCHATTY, "resetting!"); 837 SETBIT(afep, CSR_PAR, PAR_RESET); 838 for (i = 1; i < 10; i++) { 839 drv_usecwait(5); 840 val = GETCSR(afep, CSR_PAR); 841 if (!(val & PAR_RESET)) { 842 break; 843 } 844 } 845 if (i == 10) { 846 afe_error(afep->afe_dip, "timed out waiting for reset!"); 847 return (B_FALSE); 848 } 849 850 /* 851 * Updated Centaur data sheets show that the Comet and Centaur are 852 * alike here (contrary to earlier versions of the data sheet). 853 */ 854 /* XXX:? chip problems */ 855 /* par = PAR_MRLE | PAR_MRME | PAR_MWIE; */ 856 par = 0; 857 switch (afep->afe_cachesize) { 858 case 8: 859 par |= PAR_CALIGN_8 | PAR_BURST_8; 860 break; 861 case 16: 862 par |= PAR_CALIGN_16 | PAR_BURST_16; 863 break; 864 case 32: 865 par |= PAR_CALIGN_32 | PAR_BURST_32; 866 break; 867 default: 868 par |= PAR_BURST_32; 869 par &= ~(PAR_MWIE | PAR_MRLE | PAR_MRME); 870 break; 871 872 } 873 874 PUTCSR(afep, CSR_PAR, par); 875 876 /* enable transmit underrun auto-recovery */ 877 SETBIT(afep, CSR_CR, CR_TXURAUTOR); 878 879 afe_resetrings(afep); 880 881 /* clear the lost packet counter (cleared on read) */ 882 (void) GETCSR(afep, CSR_LPC); 883 884 nar = GETCSR(afep, CSR_NAR); 885 nar &= ~NAR_TR; /* clear tx threshold */ 886 nar |= NAR_SF; /* store-and-forward */ 887 nar |= NAR_HBD; /* disable SQE test */ 888 PUTCSR(afep, CSR_NAR, nar); 889 890 afe_setrxfilt(afep); 891 892 return (B_TRUE); 893 } 894 895 /* 896 * Serial EEPROM access - inspired by the FreeBSD implementation. 897 */ 898 899 uint8_t 900 afe_sromwidth(afe_t *afep) 901 { 902 int i; 903 uint32_t eeread; 904 uint8_t addrlen = 8; 905 906 eeread = SPR_SROM_READ | SPR_SROM_SEL | SPR_SROM_CHIP; 907 908 PUTCSR(afep, CSR_SPR, eeread & ~SPR_SROM_CHIP); 909 drv_usecwait(1); 910 PUTCSR(afep, CSR_SPR, eeread); 911 912 /* command bits first */ 913 for (i = 4; i != 0; i >>= 1) { 914 unsigned val = (SROM_READCMD & i) ? SPR_SROM_DIN : 0; 915 916 PUTCSR(afep, CSR_SPR, eeread | val); 917 drv_usecwait(1); 918 PUTCSR(afep, CSR_SPR, eeread | val | SPR_SROM_CLOCK); 919 drv_usecwait(1); 920 } 921 922 PUTCSR(afep, CSR_SPR, eeread); 923 924 for (addrlen = 1; addrlen <= 12; addrlen++) { 925 PUTCSR(afep, CSR_SPR, eeread | SPR_SROM_CLOCK); 926 drv_usecwait(1); 927 if (!(GETCSR(afep, CSR_SPR) & SPR_SROM_DOUT)) { 928 PUTCSR(afep, CSR_SPR, eeread); 929 drv_usecwait(1); 930 break; 931 } 932 PUTCSR(afep, CSR_SPR, eeread); 933 drv_usecwait(1); 934 } 935 936 /* turn off accesses to the EEPROM */ 937 PUTCSR(afep, CSR_SPR, eeread &~ SPR_SROM_CHIP); 938 939 DBG(DSROM, "detected srom width = %d bits", addrlen); 940 941 return ((addrlen < 4 || addrlen > 12) ? 6 : addrlen); 942 } 943 944 /* 945 * The words in EEPROM are stored in little endian order. We 946 * shift bits out in big endian order, though. This requires 947 * a byte swap on some platforms. 948 */ 949 uint16_t 950 afe_readsromword(afe_t *afep, unsigned romaddr) 951 { 952 int i; 953 uint16_t word = 0; 954 uint16_t retval; 955 int eeread; 956 uint8_t addrlen; 957 int readcmd; 958 uchar_t *ptr; 959 960 eeread = SPR_SROM_READ | SPR_SROM_SEL | SPR_SROM_CHIP; 961 addrlen = afep->afe_sromwidth; 962 readcmd = (SROM_READCMD << addrlen) | romaddr; 963 964 if (romaddr >= (1 << addrlen)) { 965 /* too big to fit! */ 966 return (0); 967 } 968 969 PUTCSR(afep, CSR_SPR, eeread & ~SPR_SROM_CHIP); 970 PUTCSR(afep, CSR_SPR, eeread); 971 972 /* command and address bits */ 973 for (i = 4 + addrlen; i >= 0; i--) { 974 short val = (readcmd & (1 << i)) ? SPR_SROM_DIN : 0; 975 976 PUTCSR(afep, CSR_SPR, eeread | val); 977 drv_usecwait(1); 978 PUTCSR(afep, CSR_SPR, eeread | val | SPR_SROM_CLOCK); 979 drv_usecwait(1); 980 } 981 982 PUTCSR(afep, CSR_SPR, eeread); 983 984 for (i = 0; i < 16; i++) { 985 PUTCSR(afep, CSR_SPR, eeread | SPR_SROM_CLOCK); 986 drv_usecwait(1); 987 word <<= 1; 988 if (GETCSR(afep, CSR_SPR) & SPR_SROM_DOUT) { 989 word |= 1; 990 } 991 PUTCSR(afep, CSR_SPR, eeread); 992 drv_usecwait(1); 993 } 994 995 /* turn off accesses to the EEPROM */ 996 PUTCSR(afep, CSR_SPR, eeread &~ SPR_SROM_CHIP); 997 998 /* 999 * Fix up the endianness thing. Note that the values 1000 * are stored in little endian format on the SROM. 1001 */ 1002 ptr = (uchar_t *)&word; 1003 retval = (ptr[1] << 8) | ptr[0]; 1004 return (retval); 1005 } 1006 1007 void 1008 afe_readsrom(afe_t *afep, unsigned romaddr, unsigned len, char *dest) 1009 { 1010 int i; 1011 uint16_t word; 1012 uint16_t *ptr = (uint16_t *)((void *)dest); 1013 for (i = 0; i < len; i++) { 1014 word = afe_readsromword(afep, romaddr + i); 1015 *ptr = word; 1016 ptr++; 1017 } 1018 } 1019 1020 void 1021 afe_getfactaddr(afe_t *afep, uchar_t *eaddr) 1022 { 1023 afe_readsrom(afep, SROM_ENADDR, ETHERADDRL / 2, (char *)eaddr); 1024 1025 DBG(DMACID, 1026 "factory ethernet address = %02x:%02x:%02x:%02x:%02x:%02x", 1027 eaddr[0], eaddr[1], eaddr[2], eaddr[3], eaddr[4], eaddr[5]); 1028 } 1029 1030 /* 1031 * MII management. 1032 */ 1033 void 1034 afe_startphy(afe_t *afep) 1035 { 1036 unsigned phyaddr; 1037 unsigned bmcr; 1038 unsigned bmsr; 1039 unsigned anar; 1040 unsigned phyidr1; 1041 unsigned phyidr2; 1042 unsigned nosqe = 0; 1043 int retries; 1044 int fiber; 1045 int cnt; 1046 1047 /* ADMtek devices just use the PHY at address 1 */ 1048 afep->afe_phyaddr = phyaddr = 1; 1049 1050 phyidr1 = afe_miiread(afep, phyaddr, MII_PHYIDH); 1051 phyidr2 = afe_miiread(afep, phyaddr, MII_PHYIDL); 1052 if ((phyidr1 == 0x0022) && 1053 ((phyidr2 & 0xfff0) == 0x5410)) { 1054 nosqe = 1; 1055 /* only 983B has fiber support */ 1056 afep->afe_flags |= AFE_HASFIBER; 1057 } 1058 afep->afe_phyid = (phyidr1 << 16) | phyidr2; 1059 1060 DBG(DPHY, "phy at %d: %x,%x", phyaddr, phyidr1, phyidr2); 1061 DBG(DPHY, "bmsr = %x", afe_miiread(afep, 1062 afep->afe_phyaddr, MII_STATUS)); 1063 DBG(DPHY, "anar = %x", afe_miiread(afep, 1064 afep->afe_phyaddr, MII_AN_ADVERT)); 1065 DBG(DPHY, "anlpar = %x", afe_miiread(afep, 1066 afep->afe_phyaddr, MII_AN_LPABLE)); 1067 DBG(DPHY, "aner = %x", afe_miiread(afep, 1068 afep->afe_phyaddr, MII_AN_EXPANSION)); 1069 1070 DBG(DPHY, "resetting phy"); 1071 1072 /* we reset the phy block */ 1073 afe_miiwrite(afep, phyaddr, MII_CONTROL, MII_CONTROL_RESET); 1074 /* 1075 * wait for it to complete -- 500usec is still to short to 1076 * bother getting the system clock involved. 1077 */ 1078 drv_usecwait(500); 1079 for (retries = 0; retries < 10; retries++) { 1080 if (afe_miiread(afep, phyaddr, MII_CONTROL) & 1081 MII_CONTROL_RESET) { 1082 drv_usecwait(500); 1083 continue; 1084 } 1085 break; 1086 } 1087 if (retries == 100) { 1088 afe_error(afep->afe_dip, "timeout waiting on phy to reset"); 1089 return; 1090 } 1091 1092 DBG(DPHY, "phy reset complete"); 1093 1094 bmsr = afe_miiread(afep, phyaddr, MII_STATUS); 1095 anar = afe_miiread(afep, phyaddr, MII_AN_ADVERT); 1096 1097 anar &= ~(MII_ABILITY_100BASE_T4 | 1098 MII_ABILITY_100BASE_TX_FD | MII_ABILITY_100BASE_TX | 1099 MII_ABILITY_10BASE_T_FD | MII_ABILITY_10BASE_T); 1100 1101 fiber = 0; 1102 1103 /* if fiber is being forced, and device supports fiber... */ 1104 if (afep->afe_flags & AFE_HASFIBER) { 1105 1106 uint16_t mcr; 1107 1108 DBG(DPHY, "device supports 100BaseFX"); 1109 mcr = afe_miiread(afep, phyaddr, PHY_MCR); 1110 switch (afep->afe_forcefiber) { 1111 case 0: 1112 /* UTP Port */ 1113 DBG(DPHY, "forcing twpair"); 1114 mcr &= ~MCR_FIBER; 1115 fiber = 0; 1116 break; 1117 case 1: 1118 /* Fiber Port */ 1119 DBG(DPHY, "forcing 100BaseFX"); 1120 mcr |= MCR_FIBER; 1121 bmcr = (MII_CONTROL_100MB | MII_CONTROL_FDUPLEX); 1122 fiber = 1; 1123 break; 1124 default: 1125 DBG(DPHY, "checking for 100BaseFX link"); 1126 /* fiber is 100 Mb FDX */ 1127 afe_miiwrite(afep, phyaddr, MII_CONTROL, 1128 MII_CONTROL_100MB | MII_CONTROL_FDUPLEX); 1129 drv_usecwait(50); 1130 1131 mcr = afe_miiread(afep, phyaddr, PHY_MCR); 1132 mcr |= MCR_FIBER; 1133 afe_miiwrite(afep, phyaddr, PHY_MCR, mcr); 1134 drv_usecwait(500); 1135 1136 /* if fiber is active, use it */ 1137 if ((afe_miiread(afep, phyaddr, MII_STATUS) & 1138 MII_STATUS_LINKUP)) { 1139 bmcr = MII_CONTROL_100MB | MII_CONTROL_FDUPLEX; 1140 fiber = 1; 1141 } else { 1142 mcr &= ~MCR_FIBER; 1143 fiber = 0; 1144 } 1145 break; 1146 } 1147 afe_miiwrite(afep, phyaddr, PHY_MCR, mcr); 1148 drv_usecwait(500); 1149 } 1150 1151 if (fiber) { 1152 /* fiber only supports 100FDX(?) */ 1153 bmsr &= ~(MII_STATUS_100_BASE_T4 | 1154 MII_STATUS_100_BASEX | MII_STATUS_10_FD | MII_STATUS_10); 1155 bmsr |= MII_STATUS_100_BASEX_FD; 1156 } 1157 1158 /* assume full support for everything to start */ 1159 afep->afe_cap_aneg = afep->afe_cap_100T4 = 1160 afep->afe_cap_100fdx = afep->afe_cap_100hdx = 1161 afep->afe_cap_10fdx = afep->afe_cap_10hdx = 1; 1162 1163 /* disable modes not supported in hardware */ 1164 if (!(bmsr & MII_STATUS_100_BASEX_FD)) { 1165 afep->afe_adv_100fdx = 0; 1166 afep->afe_cap_100fdx = 0; 1167 } 1168 if (!(bmsr & MII_STATUS_100_BASE_T4)) { 1169 afep->afe_adv_100T4 = 0; 1170 afep->afe_cap_100T4 = 0; 1171 } 1172 if (!(bmsr & MII_STATUS_100_BASEX)) { 1173 afep->afe_adv_100hdx = 0; 1174 afep->afe_cap_100hdx = 0; 1175 } 1176 if (!(bmsr & MII_STATUS_10_FD)) { 1177 afep->afe_adv_10fdx = 0; 1178 afep->afe_cap_10fdx = 0; 1179 } 1180 if (!(bmsr & MII_STATUS_10)) { 1181 afep->afe_adv_10hdx = 0; 1182 afep->afe_cap_10hdx = 0; 1183 } 1184 if (!(bmsr & MII_STATUS_CANAUTONEG)) { 1185 afep->afe_adv_aneg = 0; 1186 afep->afe_cap_aneg = 0; 1187 } 1188 1189 cnt = 0; 1190 if (afep->afe_adv_100fdx) { 1191 anar |= MII_ABILITY_100BASE_TX_FD; 1192 cnt++; 1193 } 1194 if (afep->afe_adv_100T4) { 1195 anar |= MII_ABILITY_100BASE_T4; 1196 cnt++; 1197 } 1198 if (afep->afe_adv_100hdx) { 1199 anar |= MII_ABILITY_100BASE_TX; 1200 cnt++; 1201 } 1202 if (afep->afe_adv_10fdx) { 1203 anar |= MII_ABILITY_10BASE_T_FD; 1204 cnt++; 1205 } 1206 if (afep->afe_adv_10hdx) { 1207 anar |= MII_ABILITY_10BASE_T; 1208 cnt++; 1209 } 1210 1211 /* 1212 * Make certain at least one valid link mode is selected. 1213 */ 1214 if (!cnt) { 1215 afe_error(afep->afe_dip, "No valid link mode selected."); 1216 afe_error(afep->afe_dip, "Powering down PHY."); 1217 afe_stopphy(afep); 1218 afep->afe_linkup = LINK_STATE_DOWN; 1219 if (afep->afe_flags & AFE_RUNNING) 1220 afe_reportlink(afep); 1221 return; 1222 } 1223 1224 if (fiber) { 1225 bmcr = MII_CONTROL_100MB | MII_CONTROL_FDUPLEX; 1226 } else if ((afep->afe_adv_aneg) && (bmsr & MII_STATUS_CANAUTONEG)) { 1227 DBG(DPHY, "using autoneg mode"); 1228 bmcr = (MII_CONTROL_ANE | MII_CONTROL_RSAN); 1229 } else { 1230 DBG(DPHY, "using forced mode"); 1231 if (afep->afe_adv_100fdx) { 1232 bmcr = (MII_CONTROL_100MB | MII_CONTROL_FDUPLEX); 1233 } else if (afep->afe_adv_100hdx) { 1234 bmcr = MII_CONTROL_100MB; 1235 } else if (afep->afe_adv_10fdx) { 1236 bmcr = MII_CONTROL_FDUPLEX; 1237 } else { 1238 /* 10HDX */ 1239 bmcr = 0; 1240 } 1241 } 1242 1243 DBG(DPHY, "programming anar to 0x%x", anar); 1244 afe_miiwrite(afep, phyaddr, MII_AN_ADVERT, anar); 1245 DBG(DPHY, "programming bmcr to 0x%x", bmcr); 1246 afe_miiwrite(afep, phyaddr, MII_CONTROL, bmcr); 1247 1248 if (nosqe) { 1249 uint16_t pilr; 1250 /* 1251 * work around for errata 983B_0416 -- duplex light flashes 1252 * in 10 HDX. we just disable SQE testing on the device. 1253 */ 1254 pilr = afe_miiread(afep, phyaddr, PHY_PILR); 1255 pilr |= PILR_NOSQE; 1256 afe_miiwrite(afep, phyaddr, PHY_PILR, pilr); 1257 } 1258 1259 /* 1260 * schedule a query of the link status 1261 */ 1262 PUTCSR(afep, CSR_TIMER, TIMER_LOOP | 1263 (AFE_LINKTIMER * 1000 / TIMER_USEC)); 1264 } 1265 1266 void 1267 afe_stopphy(afe_t *afep) 1268 { 1269 /* stop the phy timer */ 1270 PUTCSR(afep, CSR_TIMER, 0); 1271 1272 /* 1273 * phy in isolate & powerdown mode... 1274 */ 1275 afe_miiwrite(afep, afep->afe_phyaddr, MII_CONTROL, 1276 MII_CONTROL_PWRDN | MII_CONTROL_ISOLATE); 1277 1278 /* 1279 * mark the link state unknown 1280 */ 1281 if (!afep->afe_resetting) { 1282 afep->afe_linkup = LINK_STATE_UNKNOWN; 1283 afep->afe_ifspeed = 0; 1284 afep->afe_duplex = LINK_DUPLEX_UNKNOWN; 1285 if (afep->afe_flags & AFE_RUNNING) 1286 afe_reportlink(afep); 1287 } 1288 } 1289 1290 void 1291 afe_reportlink(afe_t *afep) 1292 { 1293 int changed = 0; 1294 1295 if (afep->afe_ifspeed != afep->afe_lastifspeed) { 1296 afep->afe_lastifspeed = afep->afe_ifspeed; 1297 changed++; 1298 } 1299 if (afep->afe_duplex != afep->afe_lastduplex) { 1300 afep->afe_lastduplex = afep->afe_duplex; 1301 changed++; 1302 } 1303 if (changed) 1304 mac_link_update(afep->afe_mh, afep->afe_linkup); 1305 } 1306 1307 void 1308 afe_checklink(afe_t *afep) 1309 { 1310 if ((afep->afe_flags & AFE_RUNNING) == 0) 1311 return; 1312 1313 if ((afep->afe_txstall_time != 0) && 1314 (gethrtime() > afep->afe_txstall_time) && 1315 (afep->afe_txavail != AFE_TXRING)) { 1316 afep->afe_txstall_time = 0; 1317 afe_error(afep->afe_dip, "TX stall detected!"); 1318 afe_resetall(afep); 1319 return; 1320 } 1321 1322 switch (AFE_MODEL(afep)) { 1323 case MODEL_COMET: 1324 afe_checklinkcomet(afep); 1325 break; 1326 case MODEL_CENTAUR: 1327 afe_checklinkcentaur(afep); 1328 break; 1329 } 1330 } 1331 1332 void 1333 afe_checklinkcomet(afe_t *afep) 1334 { 1335 uint16_t xciis; 1336 int reinit = 0; 1337 1338 xciis = GETCSR16(afep, CSR_XCIIS); 1339 if (xciis & XCIIS_PDF) { 1340 afe_error(afep->afe_dip, "Parallel detection fault detected!"); 1341 } 1342 if (xciis & XCIIS_RF) { 1343 afe_error(afep->afe_dip, "Remote fault detected."); 1344 } 1345 if (xciis & XCIIS_LFAIL) { 1346 if (afep->afe_linkup == LINK_STATE_UP) { 1347 reinit++; 1348 } 1349 afep->afe_ifspeed = 0; 1350 afep->afe_linkup = LINK_STATE_DOWN; 1351 afep->afe_duplex = LINK_DUPLEX_UNKNOWN; 1352 afe_reportlink(afep); 1353 if (reinit) { 1354 afe_startphy(afep); 1355 } 1356 return; 1357 } 1358 1359 afep->afe_linkup = LINK_STATE_UP; 1360 afep->afe_ifspeed = (xciis & XCIIS_SPEED) ? 100000000 : 10000000; 1361 if (xciis & XCIIS_DUPLEX) { 1362 afep->afe_duplex = LINK_DUPLEX_FULL; 1363 } else { 1364 afep->afe_duplex = LINK_DUPLEX_HALF; 1365 } 1366 1367 afe_reportlink(afep); 1368 } 1369 1370 void 1371 afe_checklinkcentaur(afe_t *afep) 1372 { 1373 unsigned opmode; 1374 int reinit = 0; 1375 1376 opmode = GETCSR(afep, CSR_OPM); 1377 if ((opmode & OPM_MODE) == OPM_MACONLY) { 1378 DBG(DPHY, "Centaur running in MAC-only mode"); 1379 afe_checklinkmii(afep); 1380 return; 1381 } 1382 DBG(DPHY, "Centaur running in single chip mode"); 1383 if ((opmode & OPM_LINK) == 0) { 1384 if (afep->afe_linkup == LINK_STATE_UP) { 1385 reinit++; 1386 } 1387 afep->afe_ifspeed = 0; 1388 afep->afe_duplex = LINK_DUPLEX_UNKNOWN; 1389 afep->afe_linkup = LINK_STATE_DOWN; 1390 afe_reportlink(afep); 1391 if (reinit) { 1392 afe_startphy(afep); 1393 } 1394 return; 1395 } 1396 1397 afep->afe_linkup = LINK_STATE_UP; 1398 afep->afe_ifspeed = (opmode & OPM_SPEED) ? 100000000 : 10000000; 1399 if (opmode & OPM_DUPLEX) { 1400 afep->afe_duplex = LINK_DUPLEX_FULL; 1401 } else { 1402 afep->afe_duplex = LINK_DUPLEX_HALF; 1403 } 1404 afe_reportlink(afep); 1405 } 1406 1407 void 1408 afe_checklinkmii(afe_t *afep) 1409 { 1410 /* read MII state registers */ 1411 uint16_t bmsr; 1412 uint16_t bmcr; 1413 uint16_t anar; 1414 uint16_t anlpar; 1415 int reinit = 0; 1416 1417 /* read this twice, to clear latched link state */ 1418 bmsr = afe_miiread(afep, afep->afe_phyaddr, MII_STATUS); 1419 bmsr = afe_miiread(afep, afep->afe_phyaddr, MII_STATUS); 1420 bmcr = afe_miiread(afep, afep->afe_phyaddr, MII_CONTROL); 1421 anar = afe_miiread(afep, afep->afe_phyaddr, MII_AN_ADVERT); 1422 anlpar = afe_miiread(afep, afep->afe_phyaddr, MII_AN_LPABLE); 1423 1424 if (bmsr & MII_STATUS_REMFAULT) { 1425 afe_error(afep->afe_dip, "Remote fault detected."); 1426 } 1427 if (bmsr & MII_STATUS_JABBERING) { 1428 afe_error(afep->afe_dip, "Jabber condition detected."); 1429 } 1430 if ((bmsr & MII_STATUS_LINKUP) == 0) { 1431 /* no link */ 1432 if (afep->afe_linkup == LINK_STATE_UP) { 1433 reinit = 1; 1434 } 1435 afep->afe_ifspeed = 0; 1436 afep->afe_duplex = LINK_DUPLEX_UNKNOWN; 1437 afep->afe_linkup = LINK_STATE_DOWN; 1438 afe_reportlink(afep); 1439 if (reinit) { 1440 afe_startphy(afep); 1441 } 1442 return; 1443 } 1444 1445 DBG(DCHATTY, "link up!"); 1446 afep->afe_linkup = LINK_STATE_UP; 1447 1448 if (!(bmcr & MII_CONTROL_ANE)) { 1449 /* forced mode */ 1450 if (bmcr & MII_CONTROL_100MB) { 1451 afep->afe_ifspeed = 100000000; 1452 } else { 1453 afep->afe_ifspeed = 10000000; 1454 } 1455 if (bmcr & MII_CONTROL_FDUPLEX) { 1456 afep->afe_duplex = LINK_DUPLEX_FULL; 1457 } else { 1458 afep->afe_duplex = LINK_DUPLEX_HALF; 1459 } 1460 } else if ((!(bmsr & MII_STATUS_CANAUTONEG)) || 1461 (!(bmsr & MII_STATUS_ANDONE))) { 1462 afep->afe_ifspeed = 0; 1463 afep->afe_duplex = LINK_DUPLEX_UNKNOWN; 1464 } else if (anar & anlpar & MII_ABILITY_100BASE_TX_FD) { 1465 afep->afe_ifspeed = 100000000; 1466 afep->afe_duplex = LINK_DUPLEX_FULL; 1467 } else if (anar & anlpar & MII_ABILITY_100BASE_T4) { 1468 afep->afe_ifspeed = 100000000; 1469 afep->afe_duplex = LINK_DUPLEX_HALF; 1470 } else if (anar & anlpar & MII_ABILITY_100BASE_TX) { 1471 afep->afe_ifspeed = 100000000; 1472 afep->afe_duplex = LINK_DUPLEX_HALF; 1473 } else if (anar & anlpar & MII_ABILITY_10BASE_T_FD) { 1474 afep->afe_ifspeed = 10000000; 1475 afep->afe_duplex = LINK_DUPLEX_FULL; 1476 } else if (anar & anlpar & MII_ABILITY_10BASE_T) { 1477 afep->afe_ifspeed = 10000000; 1478 afep->afe_duplex = LINK_DUPLEX_HALF; 1479 } else { 1480 afep->afe_ifspeed = 0; 1481 afep->afe_duplex = LINK_DUPLEX_UNKNOWN; 1482 } 1483 1484 afe_reportlink(afep); 1485 } 1486 1487 void 1488 afe_miitristate(afe_t *afep) 1489 { 1490 uint32_t val = SPR_SROM_WRITE | SPR_MII_CTRL; 1491 1492 PUTCSR(afep, CSR_SPR, val); 1493 drv_usecwait(1); 1494 PUTCSR(afep, CSR_SPR, val | SPR_MII_CLOCK); 1495 drv_usecwait(1); 1496 } 1497 1498 void 1499 afe_miiwritebit(afe_t *afep, uint8_t bit) 1500 { 1501 uint32_t val = bit ? SPR_MII_DOUT : 0; 1502 1503 PUTCSR(afep, CSR_SPR, val); 1504 drv_usecwait(1); 1505 PUTCSR(afep, CSR_SPR, val | SPR_MII_CLOCK); 1506 drv_usecwait(1); 1507 } 1508 1509 uint8_t 1510 afe_miireadbit(afe_t *afep) 1511 { 1512 uint32_t val = SPR_MII_CTRL | SPR_SROM_READ; 1513 uint8_t bit; 1514 1515 PUTCSR(afep, CSR_SPR, val); 1516 drv_usecwait(1); 1517 bit = (GETCSR(afep, CSR_SPR) & SPR_MII_DIN) ? 1 : 0; 1518 PUTCSR(afep, CSR_SPR, val | SPR_MII_CLOCK); 1519 drv_usecwait(1); 1520 return (bit); 1521 } 1522 1523 uint16_t 1524 afe_miiread(afe_t *afep, int phy, int reg) 1525 { 1526 /* 1527 * ADMtek bugs ignore address decode bits -- they only 1528 * support PHY at 1. 1529 */ 1530 if (phy != 1) { 1531 return (0xffff); 1532 } 1533 switch (AFE_MODEL(afep)) { 1534 case MODEL_COMET: 1535 return (afe_miireadcomet(afep, phy, reg)); 1536 case MODEL_CENTAUR: 1537 return (afe_miireadgeneral(afep, phy, reg)); 1538 } 1539 return (0xffff); 1540 } 1541 1542 uint16_t 1543 afe_miireadgeneral(afe_t *afep, int phy, int reg) 1544 { 1545 uint16_t value = 0; 1546 int i; 1547 1548 /* send the 32 bit preamble */ 1549 for (i = 0; i < 32; i++) { 1550 afe_miiwritebit(afep, 1); 1551 } 1552 1553 /* send the start code - 01b */ 1554 afe_miiwritebit(afep, 0); 1555 afe_miiwritebit(afep, 1); 1556 1557 /* send the opcode for read, - 10b */ 1558 afe_miiwritebit(afep, 1); 1559 afe_miiwritebit(afep, 0); 1560 1561 /* next we send the 5 bit phy address */ 1562 for (i = 0x10; i > 0; i >>= 1) { 1563 afe_miiwritebit(afep, (phy & i) ? 1 : 0); 1564 } 1565 1566 /* the 5 bit register address goes next */ 1567 for (i = 0x10; i > 0; i >>= 1) { 1568 afe_miiwritebit(afep, (reg & i) ? 1 : 0); 1569 } 1570 1571 /* turnaround - tristate followed by logic 0 */ 1572 afe_miitristate(afep); 1573 afe_miiwritebit(afep, 0); 1574 1575 /* read the 16 bit register value */ 1576 for (i = 0x8000; i > 0; i >>= 1) { 1577 value <<= 1; 1578 value |= afe_miireadbit(afep); 1579 } 1580 afe_miitristate(afep); 1581 return (value); 1582 } 1583 1584 uint16_t 1585 afe_miireadcomet(afe_t *afep, int phy, int reg) 1586 { 1587 if (phy != 1) { 1588 return (0xffff); 1589 } 1590 switch (reg) { 1591 case MII_CONTROL: 1592 reg = CSR_BMCR; 1593 break; 1594 case MII_STATUS: 1595 reg = CSR_BMSR; 1596 break; 1597 case MII_PHYIDH: 1598 reg = CSR_PHYIDR1; 1599 break; 1600 case MII_PHYIDL: 1601 reg = CSR_PHYIDR2; 1602 break; 1603 case MII_AN_ADVERT: 1604 reg = CSR_ANAR; 1605 break; 1606 case MII_AN_LPABLE: 1607 reg = CSR_ANLPAR; 1608 break; 1609 case MII_AN_EXPANSION: 1610 reg = CSR_ANER; 1611 break; 1612 default: 1613 return (0); 1614 } 1615 return (GETCSR16(afep, reg) & 0xFFFF); 1616 } 1617 1618 void 1619 afe_miiwrite(afe_t *afep, int phy, int reg, uint16_t val) 1620 { 1621 /* 1622 * ADMtek bugs ignore address decode bits -- they only 1623 * support PHY at 1. 1624 */ 1625 if (phy != 1) { 1626 return; 1627 } 1628 switch (AFE_MODEL(afep)) { 1629 case MODEL_COMET: 1630 afe_miiwritecomet(afep, phy, reg, val); 1631 break; 1632 case MODEL_CENTAUR: 1633 afe_miiwritegeneral(afep, phy, reg, val); 1634 break; 1635 } 1636 } 1637 1638 void 1639 afe_miiwritegeneral(afe_t *afep, int phy, int reg, uint16_t val) 1640 { 1641 int i; 1642 1643 /* send the 32 bit preamble */ 1644 for (i = 0; i < 32; i++) { 1645 afe_miiwritebit(afep, 1); 1646 } 1647 1648 /* send the start code - 01b */ 1649 afe_miiwritebit(afep, 0); 1650 afe_miiwritebit(afep, 1); 1651 1652 /* send the opcode for write, - 01b */ 1653 afe_miiwritebit(afep, 0); 1654 afe_miiwritebit(afep, 1); 1655 1656 /* next we send the 5 bit phy address */ 1657 for (i = 0x10; i > 0; i >>= 1) { 1658 afe_miiwritebit(afep, (phy & i) ? 1 : 0); 1659 } 1660 1661 /* the 5 bit register address goes next */ 1662 for (i = 0x10; i > 0; i >>= 1) { 1663 afe_miiwritebit(afep, (reg & i) ? 1 : 0); 1664 } 1665 1666 /* turnaround - tristate followed by logic 0 */ 1667 afe_miitristate(afep); 1668 afe_miiwritebit(afep, 0); 1669 1670 /* now write out our data (16 bits) */ 1671 for (i = 0x8000; i > 0; i >>= 1) { 1672 afe_miiwritebit(afep, (val & i) ? 1 : 0); 1673 } 1674 1675 /* idle mode */ 1676 afe_miitristate(afep); 1677 } 1678 1679 void 1680 afe_miiwritecomet(afe_t *afep, int phy, int reg, uint16_t val) 1681 { 1682 if (phy != 1) { 1683 return; 1684 } 1685 switch (reg) { 1686 case MII_CONTROL: 1687 reg = CSR_BMCR; 1688 break; 1689 case MII_STATUS: 1690 reg = CSR_BMSR; 1691 break; 1692 case MII_PHYIDH: 1693 reg = CSR_PHYIDR1; 1694 break; 1695 case MII_PHYIDL: 1696 reg = CSR_PHYIDR2; 1697 break; 1698 case MII_AN_ADVERT: 1699 reg = CSR_ANAR; 1700 break; 1701 case MII_AN_LPABLE: 1702 reg = CSR_ANLPAR; 1703 break; 1704 case MII_AN_EXPANSION: 1705 reg = CSR_ANER; 1706 break; 1707 default: 1708 return; 1709 } 1710 PUTCSR16(afep, reg, val); 1711 } 1712 1713 int 1714 afe_m_start(void *arg) 1715 { 1716 afe_t *afep = arg; 1717 1718 /* grab exclusive access to the card */ 1719 mutex_enter(&afep->afe_intrlock); 1720 mutex_enter(&afep->afe_xmtlock); 1721 1722 afe_startall(afep); 1723 afep->afe_flags |= AFE_RUNNING; 1724 1725 mutex_exit(&afep->afe_xmtlock); 1726 mutex_exit(&afep->afe_intrlock); 1727 return (0); 1728 } 1729 1730 void 1731 afe_m_stop(void *arg) 1732 { 1733 afe_t *afep = arg; 1734 1735 /* exclusive access to the hardware! */ 1736 mutex_enter(&afep->afe_intrlock); 1737 mutex_enter(&afep->afe_xmtlock); 1738 1739 afe_stopall(afep); 1740 afep->afe_flags &= ~AFE_RUNNING; 1741 1742 mutex_exit(&afep->afe_xmtlock); 1743 mutex_exit(&afep->afe_intrlock); 1744 } 1745 1746 void 1747 afe_startmac(afe_t *afep) 1748 { 1749 /* verify exclusive access to the card */ 1750 ASSERT(mutex_owned(&afep->afe_intrlock)); 1751 ASSERT(mutex_owned(&afep->afe_xmtlock)); 1752 1753 /* start the card */ 1754 SETBIT(afep, CSR_NAR, NAR_TX_ENABLE | NAR_RX_ENABLE); 1755 1756 if (afep->afe_txavail != AFE_TXRING) 1757 PUTCSR(afep, CSR_TDR, 0); 1758 1759 /* tell the mac that we are ready to go! */ 1760 if (afep->afe_flags & AFE_RUNNING) 1761 mac_tx_update(afep->afe_mh); 1762 } 1763 1764 void 1765 afe_stopmac(afe_t *afep) 1766 { 1767 int i; 1768 1769 /* exclusive access to the hardware! */ 1770 ASSERT(mutex_owned(&afep->afe_intrlock)); 1771 ASSERT(mutex_owned(&afep->afe_xmtlock)); 1772 1773 CLRBIT(afep, CSR_NAR, NAR_TX_ENABLE | NAR_RX_ENABLE); 1774 1775 /* 1776 * A 1518 byte frame at 10Mbps takes about 1.2 msec to drain. 1777 * We just add up to the nearest msec (2), which should be 1778 * plenty to complete. 1779 * 1780 * Note that some chips never seem to indicate the transition to 1781 * the stopped state properly. Experience shows that we can safely 1782 * proceed anyway, after waiting the requisite timeout. 1783 */ 1784 for (i = 2000; i != 0; i -= 10) { 1785 if ((GETCSR(afep, CSR_SR) & (SR_TX_STATE | SR_RX_STATE)) == 0) 1786 break; 1787 drv_usecwait(10); 1788 } 1789 1790 /* prevent an interrupt */ 1791 PUTCSR(afep, CSR_SR2, INT_RXSTOPPED | INT_TXSTOPPED); 1792 } 1793 1794 void 1795 afe_resetrings(afe_t *afep) 1796 { 1797 int i; 1798 1799 /* now we need to reset the pointers... */ 1800 PUTCSR(afep, CSR_RDB, 0); 1801 PUTCSR(afep, CSR_TDB, 0); 1802 1803 /* reset the descriptor ring pointers */ 1804 afep->afe_rxhead = 0; 1805 afep->afe_txreclaim = 0; 1806 afep->afe_txsend = 0; 1807 afep->afe_txavail = AFE_TXRING; 1808 1809 /* set up transmit descriptor ring */ 1810 for (i = 0; i < AFE_TXRING; i++) { 1811 afe_desc_t *tmdp = &afep->afe_txdescp[i]; 1812 unsigned control = 0; 1813 if (i == (AFE_TXRING - 1)) { 1814 control |= TXCTL_ENDRING; 1815 } 1816 PUTTXDESC(afep, tmdp->desc_status, 0); 1817 PUTTXDESC(afep, tmdp->desc_control, control); 1818 PUTTXDESC(afep, tmdp->desc_buffer1, 0); 1819 PUTTXDESC(afep, tmdp->desc_buffer2, 0); 1820 SYNCTXDESC(afep, i, DDI_DMA_SYNC_FORDEV); 1821 } 1822 PUTCSR(afep, CSR_TDB, afep->afe_txdesc_paddr); 1823 1824 /* make the receive buffers available */ 1825 for (i = 0; i < AFE_RXRING; i++) { 1826 afe_rxbuf_t *rxb = afep->afe_rxbufs[i]; 1827 afe_desc_t *rmdp = &afep->afe_rxdescp[i]; 1828 unsigned control; 1829 1830 control = AFE_BUFSZ & RXCTL_BUFLEN1; 1831 if (i == (AFE_RXRING - 1)) { 1832 control |= RXCTL_ENDRING; 1833 } 1834 PUTRXDESC(afep, rmdp->desc_buffer1, rxb->rxb_paddr); 1835 PUTRXDESC(afep, rmdp->desc_buffer2, 0); 1836 PUTRXDESC(afep, rmdp->desc_control, control); 1837 PUTRXDESC(afep, rmdp->desc_status, RXSTAT_OWN); 1838 SYNCRXDESC(afep, i, DDI_DMA_SYNC_FORDEV); 1839 } 1840 PUTCSR(afep, CSR_RDB, afep->afe_rxdesc_paddr); 1841 } 1842 1843 void 1844 afe_stopall(afe_t *afep) 1845 { 1846 afe_disableinterrupts(afep); 1847 1848 afe_stopmac(afep); 1849 1850 /* stop the phy */ 1851 afe_stopphy(afep); 1852 } 1853 1854 void 1855 afe_startall(afe_t *afep) 1856 { 1857 ASSERT(mutex_owned(&afep->afe_intrlock)); 1858 ASSERT(mutex_owned(&afep->afe_xmtlock)); 1859 1860 /* make sure interrupts are disabled to begin */ 1861 afe_disableinterrupts(afep); 1862 1863 /* initialize the chip */ 1864 (void) afe_initialize(afep); 1865 1866 /* now we can enable interrupts */ 1867 afe_enableinterrupts(afep); 1868 1869 /* start up the phy */ 1870 afe_startphy(afep); 1871 1872 /* start up the mac */ 1873 afe_startmac(afep); 1874 } 1875 1876 void 1877 afe_resetall(afe_t *afep) 1878 { 1879 afep->afe_resetting = B_TRUE; 1880 afe_stopall(afep); 1881 afep->afe_resetting = B_FALSE; 1882 afe_startall(afep); 1883 } 1884 1885 afe_txbuf_t * 1886 afe_alloctxbuf(afe_t *afep) 1887 { 1888 ddi_dma_cookie_t dmac; 1889 unsigned ncookies; 1890 afe_txbuf_t *txb; 1891 size_t len; 1892 1893 txb = kmem_zalloc(sizeof (*txb), KM_SLEEP); 1894 1895 if (ddi_dma_alloc_handle(afep->afe_dip, &afe_dma_txattr, 1896 DDI_DMA_SLEEP, NULL, &txb->txb_dmah) != DDI_SUCCESS) { 1897 return (NULL); 1898 } 1899 1900 if (ddi_dma_mem_alloc(txb->txb_dmah, AFE_BUFSZ, &afe_bufattr, 1901 DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &txb->txb_buf, &len, 1902 &txb->txb_acch) != DDI_SUCCESS) { 1903 return (NULL); 1904 } 1905 if (ddi_dma_addr_bind_handle(txb->txb_dmah, NULL, txb->txb_buf, 1906 len, DDI_DMA_WRITE | DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, 1907 &dmac, &ncookies) != DDI_DMA_MAPPED) { 1908 return (NULL); 1909 } 1910 txb->txb_paddr = dmac.dmac_address; 1911 1912 return (txb); 1913 } 1914 1915 void 1916 afe_destroytxbuf(afe_txbuf_t *txb) 1917 { 1918 if (txb != NULL) { 1919 if (txb->txb_paddr) 1920 (void) ddi_dma_unbind_handle(txb->txb_dmah); 1921 if (txb->txb_acch) 1922 ddi_dma_mem_free(&txb->txb_acch); 1923 if (txb->txb_dmah) 1924 ddi_dma_free_handle(&txb->txb_dmah); 1925 kmem_free(txb, sizeof (*txb)); 1926 } 1927 } 1928 1929 afe_rxbuf_t * 1930 afe_allocrxbuf(afe_t *afep) 1931 { 1932 afe_rxbuf_t *rxb; 1933 size_t len; 1934 unsigned ccnt; 1935 ddi_dma_cookie_t dmac; 1936 1937 rxb = kmem_zalloc(sizeof (*rxb), KM_SLEEP); 1938 1939 if (ddi_dma_alloc_handle(afep->afe_dip, &afe_dma_attr, 1940 DDI_DMA_SLEEP, NULL, &rxb->rxb_dmah) != DDI_SUCCESS) { 1941 kmem_free(rxb, sizeof (*rxb)); 1942 return (NULL); 1943 } 1944 if (ddi_dma_mem_alloc(rxb->rxb_dmah, AFE_BUFSZ, &afe_bufattr, 1945 DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &rxb->rxb_buf, &len, 1946 &rxb->rxb_acch) != DDI_SUCCESS) { 1947 ddi_dma_free_handle(&rxb->rxb_dmah); 1948 kmem_free(rxb, sizeof (*rxb)); 1949 return (NULL); 1950 } 1951 if (ddi_dma_addr_bind_handle(rxb->rxb_dmah, NULL, rxb->rxb_buf, len, 1952 DDI_DMA_READ | DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &dmac, 1953 &ccnt) != DDI_DMA_MAPPED) { 1954 ddi_dma_mem_free(&rxb->rxb_acch); 1955 ddi_dma_free_handle(&rxb->rxb_dmah); 1956 kmem_free(rxb, sizeof (*rxb)); 1957 return (NULL); 1958 } 1959 rxb->rxb_paddr = dmac.dmac_address; 1960 1961 return (rxb); 1962 } 1963 1964 void 1965 afe_destroyrxbuf(afe_rxbuf_t *rxb) 1966 { 1967 if (rxb) { 1968 (void) ddi_dma_unbind_handle(rxb->rxb_dmah); 1969 ddi_dma_mem_free(&rxb->rxb_acch); 1970 ddi_dma_free_handle(&rxb->rxb_dmah); 1971 kmem_free(rxb, sizeof (*rxb)); 1972 } 1973 } 1974 1975 /* 1976 * Allocate receive resources. 1977 */ 1978 int 1979 afe_allocrxring(afe_t *afep) 1980 { 1981 int rval; 1982 int i; 1983 size_t size; 1984 size_t len; 1985 ddi_dma_cookie_t dmac; 1986 unsigned ncookies; 1987 caddr_t kaddr; 1988 1989 size = AFE_RXRING * sizeof (afe_desc_t); 1990 1991 rval = ddi_dma_alloc_handle(afep->afe_dip, &afe_dma_attr, 1992 DDI_DMA_SLEEP, NULL, &afep->afe_rxdesc_dmah); 1993 if (rval != DDI_SUCCESS) { 1994 afe_error(afep->afe_dip, 1995 "unable to allocate DMA handle for rx descriptors"); 1996 return (DDI_FAILURE); 1997 } 1998 1999 rval = ddi_dma_mem_alloc(afep->afe_rxdesc_dmah, size, &afe_devattr, 2000 DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &kaddr, &len, 2001 &afep->afe_rxdesc_acch); 2002 if (rval != DDI_SUCCESS) { 2003 afe_error(afep->afe_dip, 2004 "unable to allocate DMA memory for rx descriptors"); 2005 return (DDI_FAILURE); 2006 } 2007 2008 rval = ddi_dma_addr_bind_handle(afep->afe_rxdesc_dmah, NULL, kaddr, 2009 size, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 2010 &dmac, &ncookies); 2011 if (rval != DDI_DMA_MAPPED) { 2012 afe_error(afep->afe_dip, 2013 "unable to bind DMA for rx descriptors"); 2014 return (DDI_FAILURE); 2015 } 2016 2017 /* because of afe_dma_attr */ 2018 ASSERT(ncookies == 1); 2019 2020 /* we take the 32-bit physical address out of the cookie */ 2021 afep->afe_rxdesc_paddr = dmac.dmac_address; 2022 afep->afe_rxdescp = (void *)kaddr; 2023 2024 /* allocate buffer pointers (not the buffers themselves, yet) */ 2025 afep->afe_rxbufs = kmem_zalloc(AFE_RXRING * sizeof (afe_rxbuf_t *), 2026 KM_SLEEP); 2027 2028 /* now allocate rx buffers */ 2029 for (i = 0; i < AFE_RXRING; i++) { 2030 afe_rxbuf_t *rxb = afe_allocrxbuf(afep); 2031 if (rxb == NULL) 2032 return (DDI_FAILURE); 2033 afep->afe_rxbufs[i] = rxb; 2034 } 2035 2036 return (DDI_SUCCESS); 2037 } 2038 2039 /* 2040 * Allocate transmit resources. 2041 */ 2042 int 2043 afe_alloctxring(afe_t *afep) 2044 { 2045 int rval; 2046 int i; 2047 size_t size; 2048 size_t len; 2049 ddi_dma_cookie_t dmac; 2050 unsigned ncookies; 2051 caddr_t kaddr; 2052 2053 size = AFE_TXRING * sizeof (afe_desc_t); 2054 2055 rval = ddi_dma_alloc_handle(afep->afe_dip, &afe_dma_attr, 2056 DDI_DMA_SLEEP, NULL, &afep->afe_txdesc_dmah); 2057 if (rval != DDI_SUCCESS) { 2058 afe_error(afep->afe_dip, 2059 "unable to allocate DMA handle for tx descriptors"); 2060 return (DDI_FAILURE); 2061 } 2062 2063 rval = ddi_dma_mem_alloc(afep->afe_txdesc_dmah, size, &afe_devattr, 2064 DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &kaddr, &len, 2065 &afep->afe_txdesc_acch); 2066 if (rval != DDI_SUCCESS) { 2067 afe_error(afep->afe_dip, 2068 "unable to allocate DMA memory for tx descriptors"); 2069 return (DDI_FAILURE); 2070 } 2071 2072 rval = ddi_dma_addr_bind_handle(afep->afe_txdesc_dmah, NULL, kaddr, 2073 size, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 2074 &dmac, &ncookies); 2075 if (rval != DDI_DMA_MAPPED) { 2076 afe_error(afep->afe_dip, 2077 "unable to bind DMA for tx descriptors"); 2078 return (DDI_FAILURE); 2079 } 2080 2081 /* because of afe_dma_attr */ 2082 ASSERT(ncookies == 1); 2083 2084 /* we take the 32-bit physical address out of the cookie */ 2085 afep->afe_txdesc_paddr = dmac.dmac_address; 2086 afep->afe_txdescp = (void *)kaddr; 2087 2088 /* allocate buffer pointers (not the buffers themselves, yet) */ 2089 afep->afe_txbufs = kmem_zalloc(AFE_TXRING * sizeof (afe_txbuf_t *), 2090 KM_SLEEP); 2091 2092 /* now allocate tx buffers */ 2093 for (i = 0; i < AFE_TXRING; i++) { 2094 afe_txbuf_t *txb = afe_alloctxbuf(afep); 2095 if (txb == NULL) 2096 return (DDI_FAILURE); 2097 afep->afe_txbufs[i] = txb; 2098 } 2099 2100 return (DDI_SUCCESS); 2101 } 2102 2103 void 2104 afe_freerxring(afe_t *afep) 2105 { 2106 int i; 2107 2108 for (i = 0; i < AFE_RXRING; i++) { 2109 afe_destroyrxbuf(afep->afe_rxbufs[i]); 2110 } 2111 2112 if (afep->afe_rxbufs) { 2113 kmem_free(afep->afe_rxbufs, 2114 AFE_RXRING * sizeof (afe_rxbuf_t *)); 2115 } 2116 2117 if (afep->afe_rxdesc_paddr) 2118 (void) ddi_dma_unbind_handle(afep->afe_rxdesc_dmah); 2119 if (afep->afe_rxdesc_acch) 2120 ddi_dma_mem_free(&afep->afe_rxdesc_acch); 2121 if (afep->afe_rxdesc_dmah) 2122 ddi_dma_free_handle(&afep->afe_rxdesc_dmah); 2123 } 2124 2125 void 2126 afe_freetxring(afe_t *afep) 2127 { 2128 int i; 2129 2130 for (i = 0; i < AFE_TXRING; i++) { 2131 afe_destroytxbuf(afep->afe_txbufs[i]); 2132 } 2133 2134 if (afep->afe_txbufs) { 2135 kmem_free(afep->afe_txbufs, 2136 AFE_TXRING * sizeof (afe_txbuf_t *)); 2137 } 2138 if (afep->afe_txdesc_paddr) 2139 (void) ddi_dma_unbind_handle(afep->afe_txdesc_dmah); 2140 if (afep->afe_txdesc_acch) 2141 ddi_dma_mem_free(&afep->afe_txdesc_acch); 2142 if (afep->afe_txdesc_dmah) 2143 ddi_dma_free_handle(&afep->afe_txdesc_dmah); 2144 } 2145 2146 /* 2147 * Interrupt service routine. 2148 */ 2149 unsigned 2150 afe_intr(caddr_t arg) 2151 { 2152 afe_t *afep = (void *)arg; 2153 uint32_t status; 2154 mblk_t *mp = NULL; 2155 2156 mutex_enter(&afep->afe_intrlock); 2157 2158 if (afep->afe_flags & AFE_SUSPENDED) { 2159 /* we cannot receive interrupts! */ 2160 mutex_exit(&afep->afe_intrlock); 2161 return (DDI_INTR_UNCLAIMED); 2162 } 2163 2164 /* check interrupt status bits, did we interrupt? */ 2165 status = GETCSR(afep, CSR_SR2) & INT_ALL; 2166 2167 if (status == 0) { 2168 KIOIP->intrs[KSTAT_INTR_SPURIOUS]++; 2169 mutex_exit(&afep->afe_intrlock); 2170 return (DDI_INTR_UNCLAIMED); 2171 } 2172 /* ack the interrupt */ 2173 PUTCSR(afep, CSR_SR2, status); 2174 KIOIP->intrs[KSTAT_INTR_HARD]++; 2175 2176 if (!(afep->afe_flags & AFE_RUNNING)) { 2177 /* not running, don't touch anything */ 2178 mutex_exit(&afep->afe_intrlock); 2179 return (DDI_INTR_CLAIMED); 2180 } 2181 2182 if (status & (INT_RXOK|INT_RXNOBUF)) { 2183 /* receive packets */ 2184 mp = afe_receive(afep); 2185 if (status & INT_RXNOBUF) 2186 PUTCSR(afep, CSR_RDR, 0); /* wake up chip */ 2187 } 2188 2189 if (status & INT_TXOK) { 2190 /* transmit completed */ 2191 mutex_enter(&afep->afe_xmtlock); 2192 afe_reclaim(afep); 2193 mutex_exit(&afep->afe_xmtlock); 2194 } 2195 2196 if (status & (INT_LINKCHG|INT_TIMER)) { 2197 mutex_enter(&afep->afe_xmtlock); 2198 afe_checklink(afep); 2199 mutex_exit(&afep->afe_xmtlock); 2200 } 2201 2202 if (status & (INT_RXSTOPPED|INT_TXSTOPPED| 2203 INT_RXJABBER|INT_TXJABBER|INT_TXUNDERFLOW)) { 2204 2205 if (status & (INT_RXJABBER | INT_TXJABBER)) { 2206 afep->afe_jabber++; 2207 } 2208 DBG(DWARN, "resetting mac, status %x", status); 2209 mutex_enter(&afep->afe_xmtlock); 2210 afe_resetall(afep); 2211 mutex_exit(&afep->afe_xmtlock); 2212 } 2213 2214 if (status & INT_BUSERR) { 2215 switch (GETCSR(afep, CSR_SR) & SR_BERR_TYPE) { 2216 case SR_BERR_PARITY: 2217 afe_error(afep->afe_dip, "PCI parity error"); 2218 break; 2219 case SR_BERR_TARGET_ABORT: 2220 afe_error(afep->afe_dip, "PCI target abort"); 2221 break; 2222 case SR_BERR_MASTER_ABORT: 2223 afe_error(afep->afe_dip, "PCI master abort"); 2224 break; 2225 default: 2226 afe_error(afep->afe_dip, "Unknown PCI error"); 2227 break; 2228 } 2229 2230 /* reset the chip in an attempt to fix things */ 2231 mutex_enter(&afep->afe_xmtlock); 2232 afe_resetall(afep); 2233 mutex_exit(&afep->afe_xmtlock); 2234 } 2235 2236 mutex_exit(&afep->afe_intrlock); 2237 2238 /* 2239 * Send up packets. We do this outside of the intrlock. 2240 */ 2241 if (mp) { 2242 mac_rx(afep->afe_mh, NULL, mp); 2243 } 2244 2245 return (DDI_INTR_CLAIMED); 2246 } 2247 2248 void 2249 afe_enableinterrupts(afe_t *afep) 2250 { 2251 unsigned mask = INT_WANTED; 2252 2253 if (afep->afe_wantw) 2254 mask |= INT_TXOK; 2255 2256 PUTCSR(afep, CSR_IER2, mask); 2257 2258 if (AFE_MODEL(afep) == MODEL_COMET) { 2259 /* 2260 * On the Comet, this is the internal transceiver 2261 * interrupt. We program the Comet's built-in PHY to 2262 * enable certain interrupts. 2263 */ 2264 PUTCSR16(afep, CSR_XIE, XIE_LDE | XIE_ANCE); 2265 } 2266 } 2267 2268 void 2269 afe_disableinterrupts(afe_t *afep) 2270 { 2271 /* disable further interrupts */ 2272 PUTCSR(afep, CSR_IER2, INT_NONE); 2273 2274 /* clear any pending interrupts */ 2275 PUTCSR(afep, CSR_SR2, INT_ALL); 2276 } 2277 2278 boolean_t 2279 afe_send(afe_t *afep, mblk_t *mp) 2280 { 2281 size_t len; 2282 afe_txbuf_t *txb; 2283 afe_desc_t *tmd; 2284 uint32_t control; 2285 int txsend; 2286 2287 ASSERT(mutex_owned(&afep->afe_xmtlock)); 2288 ASSERT(mp != NULL); 2289 2290 len = msgsize(mp); 2291 if (len > ETHERVLANMTU) { 2292 DBG(DXMIT, "frame too long: %d", len); 2293 afep->afe_macxmt_errors++; 2294 freemsg(mp); 2295 return (B_TRUE); 2296 } 2297 2298 if (afep->afe_txavail < AFE_TXRECLAIM) 2299 afe_reclaim(afep); 2300 2301 if (afep->afe_txavail == 0) { 2302 /* no more tmds */ 2303 afep->afe_wantw = B_TRUE; 2304 /* enable TX interrupt */ 2305 afe_enableinterrupts(afep); 2306 return (B_FALSE); 2307 } 2308 2309 txsend = afep->afe_txsend; 2310 2311 /* 2312 * For simplicity, we just do a copy into a preallocated 2313 * DMA buffer. 2314 */ 2315 2316 txb = afep->afe_txbufs[txsend]; 2317 mcopymsg(mp, txb->txb_buf); /* frees mp! */ 2318 2319 /* 2320 * Statistics. 2321 */ 2322 afep->afe_opackets++; 2323 afep->afe_obytes += len; 2324 if (txb->txb_buf[0] & 0x1) { 2325 if (bcmp(txb->txb_buf, afe_broadcast, ETHERADDRL) != 0) 2326 afep->afe_multixmt++; 2327 else 2328 afep->afe_brdcstxmt++; 2329 } 2330 2331 /* note len is already known to be a small unsigned */ 2332 control = len | TXCTL_FIRST | TXCTL_LAST | TXCTL_INTCMPLTE; 2333 2334 if (txsend == (AFE_TXRING - 1)) 2335 control |= TXCTL_ENDRING; 2336 2337 tmd = &afep->afe_txdescp[txsend]; 2338 2339 SYNCTXBUF(txb, len, DDI_DMA_SYNC_FORDEV); 2340 PUTTXDESC(afep, tmd->desc_control, control); 2341 PUTTXDESC(afep, tmd->desc_buffer1, txb->txb_paddr); 2342 PUTTXDESC(afep, tmd->desc_buffer2, 0); 2343 PUTTXDESC(afep, tmd->desc_status, TXSTAT_OWN); 2344 /* sync the descriptor out to the device */ 2345 SYNCTXDESC(afep, txsend, DDI_DMA_SYNC_FORDEV); 2346 2347 /* 2348 * Note the new values of txavail and txsend. 2349 */ 2350 afep->afe_txavail--; 2351 afep->afe_txsend = (txsend + 1) % AFE_TXRING; 2352 2353 /* 2354 * It should never, ever take more than 5 seconds to drain 2355 * the ring. If it happens, then we are stuck! 2356 */ 2357 afep->afe_txstall_time = gethrtime() + (5 * 1000000000ULL); 2358 2359 /* 2360 * wake up the chip ... inside the lock to protect against DR suspend, 2361 * etc. 2362 */ 2363 PUTCSR(afep, CSR_TDR, 0); 2364 2365 return (B_TRUE); 2366 } 2367 2368 /* 2369 * Reclaim buffers that have completed transmission. 2370 */ 2371 void 2372 afe_reclaim(afe_t *afep) 2373 { 2374 afe_desc_t *tmdp; 2375 2376 while (afep->afe_txavail != AFE_TXRING) { 2377 uint32_t status; 2378 uint32_t control; 2379 int index = afep->afe_txreclaim; 2380 2381 tmdp = &afep->afe_txdescp[index]; 2382 2383 /* sync it before we read it */ 2384 SYNCTXDESC(afep, index, DDI_DMA_SYNC_FORKERNEL); 2385 2386 control = GETTXDESC(afep, tmdp->desc_control); 2387 status = GETTXDESC(afep, tmdp->desc_status); 2388 2389 if (status & TXSTAT_OWN) { 2390 /* chip is still working on it, we're done */ 2391 break; 2392 } 2393 2394 afep->afe_txavail++; 2395 afep->afe_txreclaim = (index + 1) % AFE_TXRING; 2396 2397 /* in the most common successful case, all bits are clear */ 2398 if (status == 0) 2399 continue; 2400 2401 if ((control & TXCTL_LAST) == 0) 2402 continue; 2403 2404 if (status & TXSTAT_TXERR) { 2405 afep->afe_errxmt++; 2406 2407 if (status & TXSTAT_JABBER) { 2408 /* transmit jabber timeout */ 2409 afep->afe_macxmt_errors++; 2410 } 2411 if (status & 2412 (TXSTAT_CARRLOST | TXSTAT_NOCARR)) { 2413 afep->afe_carrier_errors++; 2414 } 2415 if (status & TXSTAT_UFLOW) { 2416 afep->afe_underflow++; 2417 } 2418 if (status & TXSTAT_LATECOL) { 2419 afep->afe_tx_late_collisions++; 2420 } 2421 if (status & TXSTAT_EXCOLL) { 2422 afep->afe_ex_collisions++; 2423 afep->afe_collisions += 16; 2424 } 2425 } 2426 2427 if (status & TXSTAT_DEFER) { 2428 afep->afe_defer_xmts++; 2429 } 2430 2431 /* collision counting */ 2432 if (TXCOLLCNT(status) == 1) { 2433 afep->afe_collisions++; 2434 afep->afe_first_collisions++; 2435 } else if (TXCOLLCNT(status)) { 2436 afep->afe_collisions += TXCOLLCNT(status); 2437 afep->afe_multi_collisions += TXCOLLCNT(status); 2438 } 2439 } 2440 2441 if (afep->afe_txavail >= AFE_TXRESCHED) { 2442 if (afep->afe_wantw) { 2443 /* 2444 * we were able to reclaim some packets, so 2445 * disable tx interrupts 2446 */ 2447 afep->afe_wantw = B_FALSE; 2448 afe_enableinterrupts(afep); 2449 mac_tx_update(afep->afe_mh); 2450 } 2451 } 2452 } 2453 2454 mblk_t * 2455 afe_receive(afe_t *afep) 2456 { 2457 unsigned len; 2458 afe_rxbuf_t *rxb; 2459 afe_desc_t *rmd; 2460 uint32_t status; 2461 mblk_t *mpchain, **mpp, *mp; 2462 int head, cnt; 2463 2464 mpchain = NULL; 2465 mpp = &mpchain; 2466 head = afep->afe_rxhead; 2467 2468 /* limit the number of packets we process to a half ring size */ 2469 for (cnt = 0; cnt < AFE_RXRING / 2; cnt++) { 2470 2471 DBG(DRECV, "receive at index %d", head); 2472 2473 rmd = &afep->afe_rxdescp[head]; 2474 rxb = afep->afe_rxbufs[head]; 2475 2476 SYNCRXDESC(afep, head, DDI_DMA_SYNC_FORKERNEL); 2477 status = GETRXDESC(afep, rmd->desc_status); 2478 if (status & RXSTAT_OWN) { 2479 /* chip is still chewing on it */ 2480 break; 2481 } 2482 2483 /* discard the ethernet frame checksum */ 2484 len = RXLENGTH(status) - ETHERFCSL; 2485 2486 DBG(DRECV, "recv length %d, status %x", len, status); 2487 2488 if ((status & (RXSTAT_ERRS | RXSTAT_FIRST | RXSTAT_LAST)) != 2489 (RXSTAT_FIRST | RXSTAT_LAST)) { 2490 2491 afep->afe_errrcv++; 2492 2493 /* 2494 * Abnormal status bits detected, analyze further. 2495 */ 2496 if ((status & (RXSTAT_LAST|RXSTAT_FIRST)) != 2497 (RXSTAT_LAST|RXSTAT_FIRST)) { 2498 DBG(DRECV, "rx packet overspill"); 2499 if (status & RXSTAT_FIRST) { 2500 afep->afe_toolong_errors++; 2501 } 2502 } else if (status & RXSTAT_DESCERR) { 2503 afep->afe_macrcv_errors++; 2504 2505 } else if (status & RXSTAT_RUNT) { 2506 afep->afe_runt++; 2507 2508 } else if (status & RXSTAT_COLLSEEN) { 2509 /* this should really be rx_late_collisions */ 2510 afep->afe_macrcv_errors++; 2511 2512 } else if (status & RXSTAT_DRIBBLE) { 2513 afep->afe_align_errors++; 2514 2515 } else if (status & RXSTAT_CRCERR) { 2516 afep->afe_fcs_errors++; 2517 2518 } else if (status & RXSTAT_OFLOW) { 2519 afep->afe_overflow++; 2520 } 2521 } 2522 2523 else if (len > ETHERVLANMTU) { 2524 afep->afe_errrcv++; 2525 afep->afe_toolong_errors++; 2526 } 2527 2528 /* 2529 * At this point, the chip thinks the packet is OK. 2530 */ 2531 else { 2532 mp = allocb(len + AFE_HEADROOM, 0); 2533 if (mp == NULL) { 2534 afep->afe_errrcv++; 2535 afep->afe_norcvbuf++; 2536 goto skip; 2537 } 2538 2539 /* sync the buffer before we look at it */ 2540 SYNCRXBUF(rxb, len, DDI_DMA_SYNC_FORKERNEL); 2541 mp->b_rptr += AFE_HEADROOM; 2542 mp->b_wptr = mp->b_rptr + len; 2543 bcopy((char *)rxb->rxb_buf, mp->b_rptr, len); 2544 2545 afep->afe_ipackets++; 2546 afep->afe_rbytes += len; 2547 if (status & RXSTAT_GROUP) { 2548 if (bcmp(mp->b_rptr, afe_broadcast, 2549 ETHERADDRL) == 0) 2550 afep->afe_brdcstrcv++; 2551 else 2552 afep->afe_multircv++; 2553 } 2554 *mpp = mp; 2555 mpp = &mp->b_next; 2556 } 2557 2558 skip: 2559 /* return ring entry to the hardware */ 2560 PUTRXDESC(afep, rmd->desc_status, RXSTAT_OWN); 2561 SYNCRXDESC(afep, head, DDI_DMA_SYNC_FORDEV); 2562 2563 /* advance to next RMD */ 2564 head = (head + 1) % AFE_RXRING; 2565 } 2566 2567 afep->afe_rxhead = head; 2568 2569 return (mpchain); 2570 } 2571 2572 int 2573 afe_getmiibit(afe_t *afep, uint16_t reg, uint16_t bit) 2574 { 2575 unsigned val; 2576 2577 mutex_enter(&afep->afe_xmtlock); 2578 if (afep->afe_flags & AFE_SUSPENDED) { 2579 mutex_exit(&afep->afe_xmtlock); 2580 /* device is suspended */ 2581 return (0); 2582 } 2583 val = afe_miiread(afep, afep->afe_phyaddr, reg); 2584 mutex_exit(&afep->afe_xmtlock); 2585 2586 return (val & bit ? 1 : 0); 2587 } 2588 #define GETMIIBIT(reg, bit) afe_getmiibit(afep, reg, bit) 2589 2590 int 2591 afe_m_stat(void *arg, uint_t stat, uint64_t *val) 2592 { 2593 afe_t *afep = arg; 2594 2595 mutex_enter(&afep->afe_xmtlock); 2596 if ((afep->afe_flags & (AFE_RUNNING|AFE_SUSPENDED)) == AFE_RUNNING) 2597 afe_reclaim(afep); 2598 mutex_exit(&afep->afe_xmtlock); 2599 2600 switch (stat) { 2601 case MAC_STAT_IFSPEED: 2602 *val = afep->afe_ifspeed; 2603 break; 2604 2605 case MAC_STAT_MULTIRCV: 2606 *val = afep->afe_multircv; 2607 break; 2608 2609 case MAC_STAT_BRDCSTRCV: 2610 *val = afep->afe_brdcstrcv; 2611 break; 2612 2613 case MAC_STAT_MULTIXMT: 2614 *val = afep->afe_multixmt; 2615 break; 2616 2617 case MAC_STAT_BRDCSTXMT: 2618 *val = afep->afe_brdcstxmt; 2619 break; 2620 2621 case MAC_STAT_IPACKETS: 2622 *val = afep->afe_ipackets; 2623 break; 2624 2625 case MAC_STAT_RBYTES: 2626 *val = afep->afe_rbytes; 2627 break; 2628 2629 case MAC_STAT_OPACKETS: 2630 *val = afep->afe_opackets; 2631 break; 2632 2633 case MAC_STAT_OBYTES: 2634 *val = afep->afe_obytes; 2635 break; 2636 2637 case MAC_STAT_NORCVBUF: 2638 *val = afep->afe_norcvbuf; 2639 break; 2640 2641 case MAC_STAT_NOXMTBUF: 2642 *val = 0; 2643 break; 2644 2645 case MAC_STAT_COLLISIONS: 2646 *val = afep->afe_collisions; 2647 break; 2648 2649 case MAC_STAT_IERRORS: 2650 *val = afep->afe_errrcv; 2651 break; 2652 2653 case MAC_STAT_OERRORS: 2654 *val = afep->afe_errxmt; 2655 break; 2656 2657 case ETHER_STAT_LINK_DUPLEX: 2658 *val = afep->afe_duplex; 2659 break; 2660 2661 case ETHER_STAT_ALIGN_ERRORS: 2662 *val = afep->afe_align_errors; 2663 break; 2664 2665 case ETHER_STAT_FCS_ERRORS: 2666 *val = afep->afe_fcs_errors; 2667 break; 2668 2669 case ETHER_STAT_SQE_ERRORS: 2670 *val = afep->afe_sqe_errors; 2671 break; 2672 2673 case ETHER_STAT_DEFER_XMTS: 2674 *val = afep->afe_defer_xmts; 2675 break; 2676 2677 case ETHER_STAT_FIRST_COLLISIONS: 2678 *val = afep->afe_first_collisions; 2679 break; 2680 2681 case ETHER_STAT_MULTI_COLLISIONS: 2682 *val = afep->afe_multi_collisions; 2683 break; 2684 2685 case ETHER_STAT_TX_LATE_COLLISIONS: 2686 *val = afep->afe_tx_late_collisions; 2687 break; 2688 2689 case ETHER_STAT_EX_COLLISIONS: 2690 *val = afep->afe_ex_collisions; 2691 break; 2692 2693 case ETHER_STAT_MACXMT_ERRORS: 2694 *val = afep->afe_macxmt_errors; 2695 break; 2696 2697 case ETHER_STAT_CARRIER_ERRORS: 2698 *val = afep->afe_carrier_errors; 2699 break; 2700 2701 case ETHER_STAT_TOOLONG_ERRORS: 2702 *val = afep->afe_toolong_errors; 2703 break; 2704 2705 case ETHER_STAT_MACRCV_ERRORS: 2706 *val = afep->afe_macrcv_errors; 2707 break; 2708 2709 case MAC_STAT_OVERFLOWS: 2710 *val = afep->afe_overflow; 2711 break; 2712 2713 case MAC_STAT_UNDERFLOWS: 2714 *val = afep->afe_underflow; 2715 break; 2716 2717 case ETHER_STAT_TOOSHORT_ERRORS: 2718 *val = afep->afe_runt; 2719 break; 2720 2721 case ETHER_STAT_JABBER_ERRORS: 2722 *val = afep->afe_jabber; 2723 break; 2724 2725 case ETHER_STAT_CAP_100T4: 2726 *val = afep->afe_cap_100T4; 2727 break; 2728 2729 case ETHER_STAT_CAP_100FDX: 2730 *val = afep->afe_cap_100fdx; 2731 break; 2732 2733 case ETHER_STAT_CAP_100HDX: 2734 *val = afep->afe_cap_100hdx; 2735 break; 2736 2737 case ETHER_STAT_CAP_10FDX: 2738 *val = afep->afe_cap_10fdx; 2739 break; 2740 2741 case ETHER_STAT_CAP_10HDX: 2742 *val = afep->afe_cap_10hdx; 2743 break; 2744 2745 case ETHER_STAT_CAP_AUTONEG: 2746 *val = afep->afe_cap_aneg; 2747 break; 2748 2749 case ETHER_STAT_LINK_AUTONEG: 2750 *val = ((afep->afe_adv_aneg != 0) && 2751 (GETMIIBIT(MII_AN_LPABLE, MII_AN_EXP_LPCANAN) != 0)); 2752 break; 2753 2754 case ETHER_STAT_ADV_CAP_100T4: 2755 *val = afep->afe_adv_100T4; 2756 break; 2757 2758 case ETHER_STAT_ADV_CAP_100FDX: 2759 *val = afep->afe_adv_100fdx; 2760 break; 2761 2762 case ETHER_STAT_ADV_CAP_100HDX: 2763 *val = afep->afe_adv_100hdx; 2764 break; 2765 2766 case ETHER_STAT_ADV_CAP_10FDX: 2767 *val = afep->afe_adv_10fdx; 2768 break; 2769 2770 case ETHER_STAT_ADV_CAP_10HDX: 2771 *val = afep->afe_adv_10hdx; 2772 break; 2773 2774 case ETHER_STAT_ADV_CAP_AUTONEG: 2775 *val = afep->afe_adv_aneg; 2776 break; 2777 2778 case ETHER_STAT_LP_CAP_100T4: 2779 *val = GETMIIBIT(MII_AN_LPABLE, MII_ABILITY_100BASE_T4); 2780 break; 2781 2782 case ETHER_STAT_LP_CAP_100FDX: 2783 *val = GETMIIBIT(MII_AN_LPABLE, MII_ABILITY_100BASE_TX_FD); 2784 break; 2785 2786 case ETHER_STAT_LP_CAP_100HDX: 2787 *val = GETMIIBIT(MII_AN_LPABLE, MII_ABILITY_100BASE_TX); 2788 break; 2789 2790 case ETHER_STAT_LP_CAP_10FDX: 2791 *val = GETMIIBIT(MII_AN_LPABLE, MII_ABILITY_10BASE_T_FD); 2792 break; 2793 2794 case ETHER_STAT_LP_CAP_10HDX: 2795 *val = GETMIIBIT(MII_AN_LPABLE, MII_ABILITY_10BASE_T); 2796 break; 2797 2798 case ETHER_STAT_LP_CAP_AUTONEG: 2799 *val = GETMIIBIT(MII_AN_EXPANSION, MII_AN_EXP_LPCANAN); 2800 break; 2801 2802 case ETHER_STAT_XCVR_ADDR: 2803 *val = afep->afe_phyaddr; 2804 break; 2805 2806 case ETHER_STAT_XCVR_ID: 2807 *val = afep->afe_phyid; 2808 break; 2809 2810 default: 2811 return (ENOTSUP); 2812 } 2813 return (0); 2814 } 2815 2816 /*ARGSUSED*/ 2817 int 2818 afe_m_getprop(void *arg, const char *name, mac_prop_id_t num, uint_t flags, 2819 uint_t sz, void *val, uint_t *perm) 2820 { 2821 afe_t *afep = arg; 2822 int err = 0; 2823 boolean_t dfl = flags & MAC_PROP_DEFAULT; 2824 2825 if (sz == 0) 2826 return (EINVAL); 2827 2828 *perm = MAC_PROP_PERM_RW; 2829 switch (num) { 2830 case MAC_PROP_DUPLEX: 2831 *perm = MAC_PROP_PERM_READ; 2832 if (sz >= sizeof (link_duplex_t)) { 2833 bcopy(&afep->afe_duplex, val, sizeof (link_duplex_t)); 2834 } else { 2835 err = EINVAL; 2836 } 2837 break; 2838 2839 case MAC_PROP_SPEED: 2840 *perm = MAC_PROP_PERM_READ; 2841 if (sz >= sizeof (uint64_t)) { 2842 bcopy(&afep->afe_ifspeed, val, sizeof (uint64_t)); 2843 } else { 2844 err = EINVAL; 2845 } 2846 break; 2847 2848 case MAC_PROP_AUTONEG: 2849 *(uint8_t *)val = 2850 dfl ? afep->afe_cap_aneg : afep->afe_adv_aneg; 2851 break; 2852 2853 #if 0 2854 case MAC_PROP_ADV_1000FDX_CAP: 2855 case MAC_PROP_EN_1000FDX_CAP: 2856 case MAC_PROP_ADV_1000HDX_CAP: 2857 case MAC_PROP_EN_1000HDX_CAP: 2858 /* We don't support gigabit! */ 2859 *(uint8_t *)val = 0; 2860 break; 2861 #endif 2862 2863 case MAC_PROP_ADV_100FDX_CAP: 2864 *perm = MAC_PROP_PERM_READ; 2865 *(uint8_t *)val = 2866 dfl ? afep->afe_cap_100fdx : afep->afe_adv_100fdx; 2867 break; 2868 case MAC_PROP_EN_100FDX_CAP: 2869 *(uint8_t *)val = 2870 dfl ? afep->afe_cap_100fdx : afep->afe_adv_100fdx; 2871 break; 2872 2873 case MAC_PROP_ADV_100HDX_CAP: 2874 *perm = MAC_PROP_PERM_READ; 2875 *(uint8_t *)val = 2876 dfl ? afep->afe_cap_100hdx : afep->afe_adv_100hdx; 2877 break; 2878 case MAC_PROP_EN_100HDX_CAP: 2879 *(uint8_t *)val = 2880 dfl ? afep->afe_cap_100hdx : afep->afe_adv_100hdx; 2881 break; 2882 2883 case MAC_PROP_ADV_10FDX_CAP: 2884 *perm = MAC_PROP_PERM_READ; 2885 *(uint8_t *)val = 2886 dfl ? afep->afe_cap_10fdx : afep->afe_adv_10fdx; 2887 break; 2888 case MAC_PROP_EN_10FDX_CAP: 2889 *(uint8_t *)val = 2890 dfl ? afep->afe_cap_10fdx : afep->afe_adv_10fdx; 2891 break; 2892 2893 case MAC_PROP_ADV_10HDX_CAP: 2894 *perm = MAC_PROP_PERM_READ; 2895 *(uint8_t *)val = 2896 dfl ? afep->afe_cap_10hdx : afep->afe_adv_10hdx; 2897 break; 2898 case MAC_PROP_EN_10HDX_CAP: 2899 *(uint8_t *)val = 2900 dfl ? afep->afe_cap_10hdx : afep->afe_adv_10hdx; 2901 break; 2902 2903 case MAC_PROP_ADV_100T4_CAP: 2904 *perm = MAC_PROP_PERM_READ; 2905 *(uint8_t *)val = 2906 dfl ? afep->afe_cap_100T4 : afep->afe_adv_100T4; 2907 break; 2908 case MAC_PROP_EN_100T4_CAP: 2909 *(uint8_t *)val = 2910 dfl ? afep->afe_cap_100T4 : afep->afe_adv_100T4; 2911 break; 2912 2913 default: 2914 err = ENOTSUP; 2915 } 2916 2917 return (err); 2918 } 2919 2920 /*ARGSUSED*/ 2921 int 2922 afe_m_setprop(void *arg, const char *name, mac_prop_id_t num, uint_t sz, 2923 const void *val) 2924 { 2925 afe_t *afep = arg; 2926 uint8_t *advp; 2927 uint8_t *capp; 2928 2929 switch (num) { 2930 case MAC_PROP_EN_100FDX_CAP: 2931 advp = &afep->afe_adv_100fdx; 2932 capp = &afep->afe_cap_100fdx; 2933 break; 2934 2935 case MAC_PROP_EN_100HDX_CAP: 2936 advp = &afep->afe_adv_100hdx; 2937 capp = &afep->afe_cap_100hdx; 2938 break; 2939 2940 case MAC_PROP_EN_10FDX_CAP: 2941 advp = &afep->afe_adv_10fdx; 2942 capp = &afep->afe_cap_10fdx; 2943 break; 2944 2945 case MAC_PROP_EN_10HDX_CAP: 2946 advp = &afep->afe_adv_10hdx; 2947 capp = &afep->afe_cap_10hdx; 2948 break; 2949 2950 case MAC_PROP_EN_100T4_CAP: 2951 advp = &afep->afe_adv_100T4; 2952 capp = &afep->afe_cap_100T4; 2953 break; 2954 2955 case MAC_PROP_AUTONEG: 2956 advp = &afep->afe_adv_aneg; 2957 capp = &afep->afe_cap_aneg; 2958 break; 2959 2960 default: 2961 return (ENOTSUP); 2962 } 2963 2964 if (*capp == 0) /* ensure phy can support value */ 2965 return (ENOTSUP); 2966 2967 mutex_enter(&afep->afe_intrlock); 2968 mutex_enter(&afep->afe_xmtlock); 2969 2970 if (*advp != *(const uint8_t *)val) { 2971 *advp = *(const uint8_t *)val; 2972 2973 if ((afep->afe_flags & (AFE_RUNNING|AFE_SUSPENDED)) == 2974 AFE_RUNNING) { 2975 /* 2976 * This re-initializes the phy, but it also 2977 * restarts transmit and receive rings. 2978 * Needless to say, changing the link 2979 * parameters is destructive to traffic in 2980 * progress. 2981 */ 2982 afe_resetall(afep); 2983 } 2984 } 2985 mutex_exit(&afep->afe_xmtlock); 2986 mutex_exit(&afep->afe_intrlock); 2987 2988 return (0); 2989 } 2990 2991 /* 2992 * Debugging and error reporting. 2993 */ 2994 void 2995 afe_error(dev_info_t *dip, char *fmt, ...) 2996 { 2997 va_list ap; 2998 char buf[256]; 2999 3000 va_start(ap, fmt); 3001 (void) vsnprintf(buf, sizeof (buf), fmt, ap); 3002 va_end(ap); 3003 3004 if (dip) { 3005 cmn_err(CE_WARN, "%s%d: %s", 3006 ddi_driver_name(dip), ddi_get_instance(dip), buf); 3007 } else { 3008 cmn_err(CE_WARN, "afe: %s", buf); 3009 } 3010 } 3011 3012 #ifdef DEBUG 3013 3014 void 3015 afe_dprintf(afe_t *afep, const char *func, int level, char *fmt, ...) 3016 { 3017 va_list ap; 3018 3019 va_start(ap, fmt); 3020 if (afe_debug & level) { 3021 char tag[64]; 3022 char buf[256]; 3023 3024 if (afep && afep->afe_dip) { 3025 (void) snprintf(tag, sizeof (tag), "%s%d", 3026 ddi_driver_name(afep->afe_dip), 3027 ddi_get_instance(afep->afe_dip)); 3028 } else { 3029 (void) snprintf(tag, sizeof (tag), "afe"); 3030 } 3031 3032 (void) snprintf(buf, sizeof (buf), "%s: %s: %s\n", 3033 tag, func, fmt); 3034 3035 vcmn_err(CE_CONT, buf, ap); 3036 } 3037 va_end(ap); 3038 } 3039 3040 #endif 3041