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 2009 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/mii.h> 50 #include <sys/miiregs.h> 51 #include <sys/mac.h> 52 #include <sys/mac_ether.h> 53 #include <sys/ddi.h> 54 #include <sys/sunddi.h> 55 #include <sys/vlan.h> 56 57 #include "afe.h" 58 #include "afeimpl.h" 59 60 /* 61 * Driver globals. 62 */ 63 64 /* table of supported devices */ 65 static afe_card_t afe_cards[] = { 66 67 /* 68 * ADMtek Centaur and Comet 69 */ 70 { 0x1317, 0x0981, "ADMtek AL981", MODEL_COMET }, 71 { 0x1317, 0x0985, "ADMtek AN983", MODEL_CENTAUR }, 72 { 0x1317, 0x1985, "ADMtek AN985", MODEL_CENTAUR }, 73 { 0x1317, 0x9511, "ADMtek ADM9511", MODEL_CENTAUR }, 74 { 0x1317, 0x9513, "ADMtek ADM9513", MODEL_CENTAUR }, 75 /* 76 * Accton just relabels other companies' controllers 77 */ 78 { 0x1113, 0x1216, "Accton EN5251", MODEL_CENTAUR }, 79 /* 80 * Models listed here. 81 */ 82 { 0x10b7, 0x9300, "3Com 3CSOHO100B-TX", MODEL_CENTAUR }, 83 { 0x1113, 0xec02, "SMC SMC1244TX", MODEL_CENTAUR }, 84 { 0x10b8, 0x1255, "SMC SMC1255TX", MODEL_CENTAUR }, 85 { 0x111a, 0x1020, "Siemens SpeedStream PCI 10/100", MODEL_CENTAUR }, 86 { 0x1113, 0x1207, "Accton EN1207F", MODEL_CENTAUR }, 87 { 0x1113, 0x2242, "Accton EN2242", MODEL_CENTAUR }, 88 { 0x1113, 0x2220, "Accton EN2220", MODEL_CENTAUR }, 89 { 0x1113, 0x9216, "3M VOL-N100VF+TX", MODEL_CENTAUR }, 90 { 0x1317, 0x0574, "Linksys LNE100TX", MODEL_CENTAUR }, 91 { 0x1317, 0x0570, "Linksys NC100", MODEL_CENTAUR }, 92 { 0x1385, 0x511a, "Netgear FA511", MODEL_CENTAUR }, 93 { 0x13d1, 0xab02, "AboCom FE2500", MODEL_CENTAUR }, 94 { 0x13d1, 0xab03, "AboCom PCM200", MODEL_CENTAUR }, 95 { 0x13d1, 0xab08, "AboCom FE2500MX", MODEL_CENTAUR }, 96 { 0x1414, 0x0001, "Microsoft MN-120", MODEL_CENTAUR }, 97 { 0x16ec, 0x00ed, "U.S. Robotics USR997900", MODEL_CENTAUR }, 98 { 0x1734, 0x100c, "Fujitsu-Siemens D1961", MODEL_CENTAUR }, 99 { 0x1737, 0xab08, "Linksys PCMPC200", MODEL_CENTAUR }, 100 { 0x1737, 0xab09, "Linksys PCM200", MODEL_CENTAUR }, 101 { 0x17b3, 0xab08, "Hawking PN672TX", MODEL_CENTAUR }, 102 }; 103 104 #define ETHERVLANMTU (ETHERMAX + 4) 105 106 /* 107 * Function prototypes 108 */ 109 static int afe_attach(dev_info_t *, ddi_attach_cmd_t); 110 static int afe_detach(dev_info_t *, ddi_detach_cmd_t); 111 static int afe_resume(dev_info_t *); 112 static int afe_quiesce(dev_info_t *); 113 static int afe_m_unicst(void *, const uint8_t *); 114 static int afe_m_multicst(void *, boolean_t, const uint8_t *); 115 static int afe_m_promisc(void *, boolean_t); 116 static mblk_t *afe_m_tx(void *, mblk_t *); 117 static void afe_m_ioctl(void *, queue_t *, mblk_t *); 118 static int afe_m_stat(void *, uint_t, uint64_t *); 119 static int afe_m_start(void *); 120 static void afe_m_stop(void *); 121 static int afe_m_getprop(void *, const char *, mac_prop_id_t, uint_t, 122 uint_t, void *, uint_t *); 123 static int afe_m_setprop(void *, const char *, mac_prop_id_t, uint_t, 124 const void *); 125 static unsigned afe_intr(caddr_t); 126 static void afe_startmac(afe_t *); 127 static void afe_stopmac(afe_t *); 128 static void afe_resetrings(afe_t *); 129 static boolean_t afe_initialize(afe_t *); 130 static void afe_startall(afe_t *); 131 static void afe_stopall(afe_t *); 132 static void afe_resetall(afe_t *); 133 static afe_txbuf_t *afe_alloctxbuf(afe_t *); 134 static void afe_destroytxbuf(afe_txbuf_t *); 135 static afe_rxbuf_t *afe_allocrxbuf(afe_t *); 136 static void afe_destroyrxbuf(afe_rxbuf_t *); 137 static boolean_t afe_send(afe_t *, mblk_t *); 138 static int afe_allocrxring(afe_t *); 139 static void afe_freerxring(afe_t *); 140 static int afe_alloctxring(afe_t *); 141 static void afe_freetxring(afe_t *); 142 static void afe_error(dev_info_t *, char *, ...); 143 static void afe_setrxfilt(afe_t *); 144 static int afe_watchdog(afe_t *); 145 static uint8_t afe_sromwidth(afe_t *); 146 static uint16_t afe_readsromword(afe_t *, unsigned); 147 static void afe_readsrom(afe_t *, unsigned, unsigned, char *); 148 static void afe_getfactaddr(afe_t *, uchar_t *); 149 static uint8_t afe_miireadbit(afe_t *); 150 static void afe_miiwritebit(afe_t *, uint8_t); 151 static void afe_miitristate(afe_t *); 152 static uint16_t afe_miireadgeneral(afe_t *, uint8_t, uint8_t); 153 static void afe_miiwritegeneral(afe_t *, uint8_t, uint8_t, uint16_t); 154 static uint16_t afe_miireadcomet(afe_t *, uint8_t, uint8_t); 155 static void afe_miiwritecomet(afe_t *, uint8_t, uint8_t, uint16_t); 156 static uint16_t afe_mii_read(void *, uint8_t, uint8_t); 157 static void afe_mii_write(void *, uint8_t, uint8_t, uint16_t); 158 static void afe_mii_notify(void *, link_state_t); 159 static void afe_mii_reset(void *); 160 static void afe_disableinterrupts(afe_t *); 161 static void afe_enableinterrupts(afe_t *); 162 static void afe_reclaim(afe_t *); 163 static mblk_t *afe_receive(afe_t *); 164 165 #define KIOIP KSTAT_INTR_PTR(afep->afe_intrstat) 166 167 static mii_ops_t afe_mii_ops = { 168 MII_OPS_VERSION, 169 afe_mii_read, 170 afe_mii_write, 171 afe_mii_notify, 172 afe_mii_reset 173 }; 174 175 static mac_callbacks_t afe_m_callbacks = { 176 MC_IOCTL | MC_SETPROP | MC_GETPROP, 177 afe_m_stat, 178 afe_m_start, 179 afe_m_stop, 180 afe_m_promisc, 181 afe_m_multicst, 182 afe_m_unicst, 183 afe_m_tx, 184 afe_m_ioctl, /* mc_ioctl */ 185 NULL, /* mc_getcapab */ 186 NULL, /* mc_open */ 187 NULL, /* mc_close */ 188 afe_m_setprop, 189 afe_m_getprop, 190 }; 191 192 193 /* 194 * Stream information 195 */ 196 DDI_DEFINE_STREAM_OPS(afe_devops, nulldev, nulldev, afe_attach, afe_detach, 197 nodev, NULL, D_MP, NULL, afe_quiesce); 198 199 /* 200 * Module linkage information. 201 */ 202 203 static struct modldrv afe_modldrv = { 204 &mod_driverops, /* drv_modops */ 205 "ADMtek Fast Ethernet", /* drv_linkinfo */ 206 &afe_devops /* drv_dev_ops */ 207 }; 208 209 static struct modlinkage afe_modlinkage = { 210 MODREV_1, /* ml_rev */ 211 { &afe_modldrv, NULL } /* ml_linkage */ 212 }; 213 214 /* 215 * Device attributes. 216 */ 217 static ddi_device_acc_attr_t afe_devattr = { 218 DDI_DEVICE_ATTR_V0, 219 DDI_STRUCTURE_LE_ACC, 220 DDI_STRICTORDER_ACC 221 }; 222 223 static ddi_device_acc_attr_t afe_bufattr = { 224 DDI_DEVICE_ATTR_V0, 225 DDI_NEVERSWAP_ACC, 226 DDI_STRICTORDER_ACC 227 }; 228 229 static ddi_dma_attr_t afe_dma_attr = { 230 DMA_ATTR_V0, /* dma_attr_version */ 231 0, /* dma_attr_addr_lo */ 232 0xFFFFFFFFU, /* dma_attr_addr_hi */ 233 0x7FFFFFFFU, /* dma_attr_count_max */ 234 4, /* dma_attr_align */ 235 0x3F, /* dma_attr_burstsizes */ 236 1, /* dma_attr_minxfer */ 237 0xFFFFFFFFU, /* dma_attr_maxxfer */ 238 0xFFFFFFFFU, /* dma_attr_seg */ 239 1, /* dma_attr_sgllen */ 240 1, /* dma_attr_granular */ 241 0 /* dma_attr_flags */ 242 }; 243 244 /* 245 * Tx buffers can be arbitrarily aligned. Additionally, they can 246 * cross a page boundary, so we use the two buffer addresses of the 247 * chip to provide a two-entry scatter-gather list. 248 */ 249 static ddi_dma_attr_t afe_dma_txattr = { 250 DMA_ATTR_V0, /* dma_attr_version */ 251 0, /* dma_attr_addr_lo */ 252 0xFFFFFFFFU, /* dma_attr_addr_hi */ 253 0x7FFFFFFFU, /* dma_attr_count_max */ 254 1, /* dma_attr_align */ 255 0x3F, /* dma_attr_burstsizes */ 256 1, /* dma_attr_minxfer */ 257 0xFFFFFFFFU, /* dma_attr_maxxfer */ 258 0xFFFFFFFFU, /* dma_attr_seg */ 259 2, /* dma_attr_sgllen */ 260 1, /* dma_attr_granular */ 261 0 /* dma_attr_flags */ 262 }; 263 264 /* 265 * Ethernet addresses. 266 */ 267 static uchar_t afe_broadcast[ETHERADDRL] = { 268 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 269 }; 270 271 /* 272 * DDI entry points. 273 */ 274 int 275 _init(void) 276 { 277 int rv; 278 mac_init_ops(&afe_devops, "afe"); 279 if ((rv = mod_install(&afe_modlinkage)) != DDI_SUCCESS) { 280 mac_fini_ops(&afe_devops); 281 } 282 return (rv); 283 } 284 285 int 286 _fini(void) 287 { 288 int rv; 289 if ((rv = mod_remove(&afe_modlinkage)) == DDI_SUCCESS) { 290 mac_fini_ops(&afe_devops); 291 } 292 return (rv); 293 } 294 295 int 296 _info(struct modinfo *modinfop) 297 { 298 return (mod_info(&afe_modlinkage, modinfop)); 299 } 300 301 int 302 afe_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 303 { 304 afe_t *afep; 305 mac_register_t *macp; 306 int inst = ddi_get_instance(dip); 307 ddi_acc_handle_t pci; 308 uint16_t venid; 309 uint16_t devid; 310 uint16_t svid; 311 uint16_t ssid; 312 uint16_t cachesize; 313 afe_card_t *cardp; 314 int i; 315 316 switch (cmd) { 317 case DDI_RESUME: 318 return (afe_resume(dip)); 319 320 case DDI_ATTACH: 321 break; 322 323 default: 324 return (DDI_FAILURE); 325 } 326 327 /* this card is a bus master, reject any slave-only slot */ 328 if (ddi_slaveonly(dip) == DDI_SUCCESS) { 329 afe_error(dip, "slot does not support PCI bus-master"); 330 return (DDI_FAILURE); 331 } 332 /* PCI devices shouldn't generate hilevel interrupts */ 333 if (ddi_intr_hilevel(dip, 0) != 0) { 334 afe_error(dip, "hilevel interrupts not supported"); 335 return (DDI_FAILURE); 336 } 337 if (pci_config_setup(dip, &pci) != DDI_SUCCESS) { 338 afe_error(dip, "unable to setup PCI config handle"); 339 return (DDI_FAILURE); 340 } 341 342 venid = pci_config_get16(pci, PCI_VID); 343 devid = pci_config_get16(pci, PCI_DID); 344 svid = pci_config_get16(pci, PCI_SVID); 345 ssid = pci_config_get16(pci, PCI_SSID); 346 347 /* 348 * Note: ADMtek boards seem to misprogram themselves with bogus 349 * timings, which do not seem to work properly on SPARC. We 350 * reprogram them zero (but only if they appear to be broken), 351 * which seems to at least work. Its unclear that this is a 352 * legal or wise practice to me, but it certainly works better 353 * than the original values. (I would love to hear 354 * suggestions for better values, or a better strategy.) 355 */ 356 if ((pci_config_get8(pci, PCI_MINGNT) == 0xff) && 357 (pci_config_get8(pci, PCI_MAXLAT) == 0xff)) { 358 pci_config_put8(pci, PCI_MINGNT, 0); 359 pci_config_put8(pci, PCI_MAXLAT, 0); 360 } 361 362 /* 363 * the last entry in the card table matches every possible 364 * card, so the for-loop always terminates properly. 365 */ 366 cardp = NULL; 367 for (i = 0; i < (sizeof (afe_cards) / sizeof (afe_card_t)); i++) { 368 if ((venid == afe_cards[i].card_venid) && 369 (devid == afe_cards[i].card_devid)) { 370 cardp = &afe_cards[i]; 371 } 372 if ((svid == afe_cards[i].card_venid) && 373 (ssid == afe_cards[i].card_devid)) { 374 cardp = &afe_cards[i]; 375 break; 376 } 377 } 378 379 if (cardp == NULL) { 380 pci_config_teardown(&pci); 381 afe_error(dip, "Unable to identify PCI card"); 382 return (DDI_FAILURE); 383 } 384 385 if (ddi_prop_update_string(DDI_DEV_T_NONE, dip, "model", 386 cardp->card_cardname) != DDI_PROP_SUCCESS) { 387 pci_config_teardown(&pci); 388 afe_error(dip, "Unable to create model property"); 389 return (DDI_FAILURE); 390 } 391 392 /* 393 * Grab the PCI cachesize -- we use this to program the 394 * cache-optimization bus access bits. 395 */ 396 cachesize = pci_config_get8(pci, PCI_CLS); 397 398 /* this cannot fail */ 399 afep = kmem_zalloc(sizeof (afe_t), KM_SLEEP); 400 ddi_set_driver_private(dip, afep); 401 402 /* get the interrupt block cookie */ 403 if (ddi_get_iblock_cookie(dip, 0, &afep->afe_icookie) != DDI_SUCCESS) { 404 afe_error(dip, "ddi_get_iblock_cookie failed"); 405 pci_config_teardown(&pci); 406 kmem_free(afep, sizeof (afe_t)); 407 return (DDI_FAILURE); 408 } 409 410 afep->afe_dip = dip; 411 afep->afe_cardp = cardp; 412 afep->afe_phyaddr = -1; 413 afep->afe_cachesize = cachesize; 414 415 afep->afe_forcefiber = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 416 "fiber", 0); 417 418 mutex_init(&afep->afe_xmtlock, NULL, MUTEX_DRIVER, afep->afe_icookie); 419 mutex_init(&afep->afe_intrlock, NULL, MUTEX_DRIVER, afep->afe_icookie); 420 421 /* 422 * Enable bus master, IO space, and memory space accesses. 423 */ 424 pci_config_put16(pci, PCI_CMD, 425 pci_config_get16(pci, PCI_CMD) | PCI_CMD_BME | PCI_CMD_MAE); 426 427 /* we're done with this now, drop it */ 428 pci_config_teardown(&pci); 429 430 /* 431 * Initialize interrupt kstat. This should not normally fail, since 432 * we don't use a persistent stat. We do it this way to avoid having 433 * to test for it at run time on the hot path. 434 */ 435 afep->afe_intrstat = kstat_create("afe", inst, "intr", "controller", 436 KSTAT_TYPE_INTR, 1, 0); 437 if (afep->afe_intrstat == NULL) { 438 afe_error(dip, "kstat_create failed"); 439 goto failed; 440 } 441 kstat_install(afep->afe_intrstat); 442 443 /* 444 * Set up the MII. 445 */ 446 if ((afep->afe_mii = mii_alloc(afep, dip, &afe_mii_ops)) == NULL) { 447 goto failed; 448 } 449 450 /* 451 * Centaur can support PAUSE, but Comet can't. 452 */ 453 if (AFE_MODEL(afep) == MODEL_CENTAUR) { 454 mii_set_pauseable(afep->afe_mii, B_TRUE, B_FALSE); 455 } else { 456 mii_set_pauseable(afep->afe_mii, B_FALSE, B_FALSE); 457 } 458 459 /* 460 * Map in the device registers. 461 */ 462 if (ddi_regs_map_setup(dip, 1, (caddr_t *)&afep->afe_regs, 463 0, 0, &afe_devattr, &afep->afe_regshandle)) { 464 afe_error(dip, "ddi_regs_map_setup failed"); 465 goto failed; 466 } 467 468 /* 469 * Allocate DMA resources (descriptor rings and buffers). 470 */ 471 if ((afe_allocrxring(afep) != DDI_SUCCESS) || 472 (afe_alloctxring(afep) != DDI_SUCCESS)) { 473 afe_error(dip, "unable to allocate DMA resources"); 474 goto failed; 475 } 476 477 /* Initialize the chip. */ 478 mutex_enter(&afep->afe_intrlock); 479 mutex_enter(&afep->afe_xmtlock); 480 if (!afe_initialize(afep)) { 481 mutex_exit(&afep->afe_xmtlock); 482 mutex_exit(&afep->afe_intrlock); 483 goto failed; 484 } 485 mutex_exit(&afep->afe_xmtlock); 486 mutex_exit(&afep->afe_intrlock); 487 488 /* Determine the number of address bits to our EEPROM. */ 489 afep->afe_sromwidth = afe_sromwidth(afep); 490 491 /* 492 * Get the factory ethernet address. This becomes the current 493 * ethernet address (it can be overridden later via ifconfig). 494 */ 495 afe_getfactaddr(afep, afep->afe_curraddr); 496 afep->afe_promisc = B_FALSE; 497 498 /* make sure we add configure the initial filter */ 499 (void) afe_m_unicst(afep, afep->afe_curraddr); 500 (void) afe_m_multicst(afep, B_TRUE, afe_broadcast); 501 502 /* 503 * Establish interrupt handler. 504 */ 505 if (ddi_add_intr(dip, 0, NULL, NULL, afe_intr, (caddr_t)afep) != 506 DDI_SUCCESS) { 507 afe_error(dip, "unable to add interrupt"); 508 goto failed; 509 } 510 511 /* TODO: do the power management stuff */ 512 513 if ((macp = mac_alloc(MAC_VERSION)) == NULL) { 514 afe_error(dip, "mac_alloc failed"); 515 goto failed; 516 } 517 518 macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER; 519 macp->m_driver = afep; 520 macp->m_dip = dip; 521 macp->m_src_addr = afep->afe_curraddr; 522 macp->m_callbacks = &afe_m_callbacks; 523 macp->m_min_sdu = 0; 524 macp->m_max_sdu = ETHERMTU; 525 macp->m_margin = VLAN_TAGSZ; 526 527 if (mac_register(macp, &afep->afe_mh) == DDI_SUCCESS) { 528 mac_free(macp); 529 return (DDI_SUCCESS); 530 } 531 532 /* failed to register with MAC */ 533 mac_free(macp); 534 failed: 535 if (afep->afe_icookie != NULL) { 536 ddi_remove_intr(dip, 0, afep->afe_icookie); 537 } 538 if (afep->afe_intrstat) { 539 kstat_delete(afep->afe_intrstat); 540 } 541 mutex_destroy(&afep->afe_intrlock); 542 mutex_destroy(&afep->afe_xmtlock); 543 544 afe_freerxring(afep); 545 afe_freetxring(afep); 546 547 if (afep->afe_regshandle != NULL) { 548 ddi_regs_map_free(&afep->afe_regshandle); 549 } 550 kmem_free(afep, sizeof (afe_t)); 551 return (DDI_FAILURE); 552 } 553 554 int 555 afe_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 556 { 557 afe_t *afep; 558 559 afep = ddi_get_driver_private(dip); 560 if (afep == NULL) { 561 afe_error(dip, "no soft state in detach!"); 562 return (DDI_FAILURE); 563 } 564 565 switch (cmd) { 566 case DDI_DETACH: 567 568 if (mac_unregister(afep->afe_mh) != 0) { 569 return (DDI_FAILURE); 570 } 571 572 /* make sure hardware is quiesced */ 573 mutex_enter(&afep->afe_intrlock); 574 mutex_enter(&afep->afe_xmtlock); 575 afep->afe_flags &= ~AFE_RUNNING; 576 afe_stopall(afep); 577 mutex_exit(&afep->afe_xmtlock); 578 mutex_exit(&afep->afe_intrlock); 579 580 /* clean up and shut down device */ 581 ddi_remove_intr(dip, 0, afep->afe_icookie); 582 583 /* clean up MII layer */ 584 mii_free(afep->afe_mii); 585 586 /* clean up kstats */ 587 kstat_delete(afep->afe_intrstat); 588 589 ddi_prop_remove_all(dip); 590 591 /* free up any left over buffers or DMA resources */ 592 afe_freerxring(afep); 593 afe_freetxring(afep); 594 595 ddi_regs_map_free(&afep->afe_regshandle); 596 mutex_destroy(&afep->afe_intrlock); 597 mutex_destroy(&afep->afe_xmtlock); 598 599 kmem_free(afep, sizeof (afe_t)); 600 return (DDI_SUCCESS); 601 602 case DDI_SUSPEND: 603 /* stop MII monitoring */ 604 mii_suspend(afep->afe_mii); 605 606 /* quiesce the hardware */ 607 mutex_enter(&afep->afe_intrlock); 608 mutex_enter(&afep->afe_xmtlock); 609 afep->afe_flags |= AFE_SUSPENDED; 610 afe_stopall(afep); 611 mutex_exit(&afep->afe_xmtlock); 612 mutex_exit(&afep->afe_intrlock); 613 return (DDI_SUCCESS); 614 default: 615 return (DDI_FAILURE); 616 } 617 } 618 619 int 620 afe_resume(dev_info_t *dip) 621 { 622 afe_t *afep; 623 624 if ((afep = ddi_get_driver_private(dip)) == NULL) { 625 return (DDI_FAILURE); 626 } 627 628 mutex_enter(&afep->afe_intrlock); 629 mutex_enter(&afep->afe_xmtlock); 630 631 afep->afe_flags &= ~AFE_SUSPENDED; 632 633 /* re-initialize chip */ 634 if (!afe_initialize(afep)) { 635 afe_error(afep->afe_dip, "unable to resume chip!"); 636 afep->afe_flags |= AFE_SUSPENDED; 637 mutex_exit(&afep->afe_intrlock); 638 mutex_exit(&afep->afe_xmtlock); 639 return (DDI_SUCCESS); 640 } 641 642 /* start the chip */ 643 if (afep->afe_flags & AFE_RUNNING) { 644 afe_startall(afep); 645 } 646 647 /* drop locks */ 648 mutex_exit(&afep->afe_xmtlock); 649 mutex_exit(&afep->afe_intrlock); 650 651 mii_resume(afep->afe_mii); 652 653 return (DDI_SUCCESS); 654 } 655 656 int 657 afe_quiesce(dev_info_t *dip) 658 { 659 afe_t *afep; 660 661 if ((afep = ddi_get_driver_private(dip)) == NULL) { 662 return (DDI_FAILURE); 663 } 664 665 SETBIT(afep, CSR_PAR, PAR_RESET); 666 /* 667 * At 66 MHz it is 16 nsec per access or more (always more) 668 * So we need 3,333 times to retry for 50 usec. We just 669 * round up to 5000 times. Unless the hardware is horked, 670 * it will always terminate *well* before that anyway. 671 */ 672 for (int i = 0; i < 5000; i++) { 673 if ((GETCSR(afep, CSR_PAR) & PAR_RESET) == 0) { 674 return (DDI_SUCCESS); 675 } 676 } 677 678 /* hardware didn't quiesce - force a full reboot (PCI reset) */ 679 return (DDI_FAILURE); 680 } 681 682 void 683 afe_setrxfilt(afe_t *afep) 684 { 685 unsigned rxen, pa0, pa1; 686 687 if (afep->afe_flags & AFE_SUSPENDED) { 688 /* don't touch a suspended interface */ 689 return; 690 } 691 692 rxen = GETCSR(afep, CSR_NAR) & NAR_RX_ENABLE; 693 694 /* stop receiver */ 695 if (rxen) { 696 afe_stopmac(afep); 697 } 698 699 /* program promiscuous mode */ 700 if (afep->afe_promisc) 701 SETBIT(afep, CSR_NAR, NAR_RX_PROMISC); 702 else 703 CLRBIT(afep, CSR_NAR, NAR_RX_PROMISC); 704 705 /* program mac address */ 706 pa0 = (afep->afe_curraddr[3] << 24) | (afep->afe_curraddr[2] << 16) | 707 (afep->afe_curraddr[1] << 8) | afep->afe_curraddr[0]; 708 pa1 = (afep->afe_curraddr[5] << 8) | afep->afe_curraddr[4]; 709 710 PUTCSR(afep, CSR_PAR0, pa0); 711 PUTCSR(afep, CSR_PAR1, pa1); 712 if (rxen) { 713 SETBIT(afep, CSR_NAR, rxen); 714 } 715 716 /* program multicast filter */ 717 if (AFE_MODEL(afep) == MODEL_COMET) { 718 if (afep->afe_mctab[0] || afep->afe_mctab[1]) { 719 SETBIT(afep, CSR_NAR, NAR_RX_MULTI); 720 } else { 721 CLRBIT(afep, CSR_NAR, NAR_RX_MULTI); 722 } 723 } else { 724 CLRBIT(afep, CSR_NAR, NAR_RX_MULTI); 725 PUTCSR(afep, CSR_MAR0, afep->afe_mctab[0]); 726 PUTCSR(afep, CSR_MAR1, afep->afe_mctab[1]); 727 } 728 729 /* restart receiver */ 730 if (rxen) { 731 afe_startmac(afep); 732 } 733 } 734 735 int 736 afe_watchdog(afe_t *afep) 737 { 738 if ((afep->afe_txstall_time != 0) && 739 (gethrtime() > afep->afe_txstall_time) && 740 (afep->afe_txavail != AFE_TXRING)) { 741 afep->afe_txstall_time = 0; 742 afe_error(afep->afe_dip, "TX stall detected!"); 743 return (DDI_FAILURE); 744 } else { 745 return (DDI_SUCCESS); 746 } 747 } 748 749 int 750 afe_m_multicst(void *arg, boolean_t add, const uint8_t *macaddr) 751 { 752 afe_t *afep = arg; 753 int index; 754 uint32_t crc; 755 uint32_t bit; 756 uint32_t newval, oldval; 757 758 CRC32(crc, macaddr, ETHERADDRL, -1U, crc32_table); 759 crc %= AFE_MCHASH; 760 761 /* bit within a 32-bit word */ 762 index = crc / 32; 763 bit = (1 << (crc % 32)); 764 765 mutex_enter(&afep->afe_intrlock); 766 mutex_enter(&afep->afe_xmtlock); 767 newval = oldval = afep->afe_mctab[index]; 768 769 if (add) { 770 afep->afe_mccount[crc]++; 771 if (afep->afe_mccount[crc] == 1) 772 newval |= bit; 773 } else { 774 afep->afe_mccount[crc]--; 775 if (afep->afe_mccount[crc] == 0) 776 newval &= ~bit; 777 } 778 if (newval != oldval) { 779 afep->afe_mctab[index] = newval; 780 afe_setrxfilt(afep); 781 } 782 783 mutex_exit(&afep->afe_xmtlock); 784 mutex_exit(&afep->afe_intrlock); 785 786 return (0); 787 } 788 789 int 790 afe_m_promisc(void *arg, boolean_t on) 791 { 792 afe_t *afep = arg; 793 794 /* exclusive access to the card while we reprogram it */ 795 mutex_enter(&afep->afe_intrlock); 796 mutex_enter(&afep->afe_xmtlock); 797 /* save current promiscuous mode state for replay in resume */ 798 afep->afe_promisc = on; 799 800 afe_setrxfilt(afep); 801 mutex_exit(&afep->afe_xmtlock); 802 mutex_exit(&afep->afe_intrlock); 803 804 return (0); 805 } 806 807 int 808 afe_m_unicst(void *arg, const uint8_t *macaddr) 809 { 810 afe_t *afep = arg; 811 812 /* exclusive access to the card while we reprogram it */ 813 mutex_enter(&afep->afe_intrlock); 814 mutex_enter(&afep->afe_xmtlock); 815 816 bcopy(macaddr, afep->afe_curraddr, ETHERADDRL); 817 afe_setrxfilt(afep); 818 819 mutex_exit(&afep->afe_xmtlock); 820 mutex_exit(&afep->afe_intrlock); 821 822 return (0); 823 } 824 825 mblk_t * 826 afe_m_tx(void *arg, mblk_t *mp) 827 { 828 afe_t *afep = arg; 829 mblk_t *nmp; 830 831 mutex_enter(&afep->afe_xmtlock); 832 833 if (afep->afe_flags & AFE_SUSPENDED) { 834 while ((nmp = mp) != NULL) { 835 afep->afe_carrier_errors++; 836 mp = mp->b_next; 837 freemsg(nmp); 838 } 839 mutex_exit(&afep->afe_xmtlock); 840 return (NULL); 841 } 842 843 while (mp != NULL) { 844 nmp = mp->b_next; 845 mp->b_next = NULL; 846 847 if (!afe_send(afep, mp)) { 848 mp->b_next = nmp; 849 break; 850 } 851 mp = nmp; 852 } 853 mutex_exit(&afep->afe_xmtlock); 854 855 return (mp); 856 } 857 858 void 859 afe_m_ioctl(void *arg, queue_t *wq, mblk_t *mp) 860 { 861 afe_t *afep = arg; 862 863 if (mii_m_loop_ioctl(afep->afe_mii, wq, mp)) 864 return; 865 866 miocnak(wq, mp, 0, EINVAL); 867 } 868 869 /* 870 * Hardware management. 871 */ 872 static boolean_t 873 afe_initialize(afe_t *afep) 874 { 875 int i; 876 unsigned val; 877 uint32_t par, nar; 878 879 ASSERT(mutex_owned(&afep->afe_intrlock)); 880 ASSERT(mutex_owned(&afep->afe_xmtlock)); 881 882 SETBIT(afep, CSR_PAR, PAR_RESET); 883 for (i = 1; i < 10; i++) { 884 drv_usecwait(5); 885 val = GETCSR(afep, CSR_PAR); 886 if (!(val & PAR_RESET)) { 887 break; 888 } 889 } 890 if (i == 10) { 891 afe_error(afep->afe_dip, "timed out waiting for reset!"); 892 return (B_FALSE); 893 } 894 895 /* 896 * Updated Centaur data sheets show that the Comet and Centaur are 897 * alike here (contrary to earlier versions of the data sheet). 898 */ 899 /* XXX:? chip problems */ 900 /* par = PAR_MRLE | PAR_MRME | PAR_MWIE; */ 901 par = 0; 902 switch (afep->afe_cachesize) { 903 case 8: 904 par |= PAR_CALIGN_8 | PAR_BURST_8; 905 break; 906 case 16: 907 par |= PAR_CALIGN_16 | PAR_BURST_16; 908 break; 909 case 32: 910 par |= PAR_CALIGN_32 | PAR_BURST_32; 911 break; 912 default: 913 par |= PAR_BURST_32; 914 par &= ~(PAR_MWIE | PAR_MRLE | PAR_MRME); 915 break; 916 917 } 918 919 PUTCSR(afep, CSR_PAR, par); 920 921 /* enable transmit underrun auto-recovery */ 922 SETBIT(afep, CSR_CR, CR_TXURAUTOR); 923 924 afe_resetrings(afep); 925 926 /* clear the lost packet counter (cleared on read) */ 927 (void) GETCSR(afep, CSR_LPC); 928 929 nar = GETCSR(afep, CSR_NAR); 930 nar &= ~NAR_TR; /* clear tx threshold */ 931 nar |= NAR_SF; /* store-and-forward */ 932 nar |= NAR_HBD; /* disable SQE test */ 933 PUTCSR(afep, CSR_NAR, nar); 934 935 afe_setrxfilt(afep); 936 937 return (B_TRUE); 938 } 939 940 /* 941 * Serial EEPROM access - inspired by the FreeBSD implementation. 942 */ 943 944 uint8_t 945 afe_sromwidth(afe_t *afep) 946 { 947 int i; 948 uint32_t eeread; 949 uint8_t addrlen = 8; 950 951 eeread = SPR_SROM_READ | SPR_SROM_SEL | SPR_SROM_CHIP; 952 953 PUTCSR(afep, CSR_SPR, eeread & ~SPR_SROM_CHIP); 954 drv_usecwait(1); 955 PUTCSR(afep, CSR_SPR, eeread); 956 957 /* command bits first */ 958 for (i = 4; i != 0; i >>= 1) { 959 unsigned val = (SROM_READCMD & i) ? SPR_SROM_DIN : 0; 960 961 PUTCSR(afep, CSR_SPR, eeread | val); 962 drv_usecwait(1); 963 PUTCSR(afep, CSR_SPR, eeread | val | SPR_SROM_CLOCK); 964 drv_usecwait(1); 965 } 966 967 PUTCSR(afep, CSR_SPR, eeread); 968 969 for (addrlen = 1; addrlen <= 12; addrlen++) { 970 PUTCSR(afep, CSR_SPR, eeread | SPR_SROM_CLOCK); 971 drv_usecwait(1); 972 if (!(GETCSR(afep, CSR_SPR) & SPR_SROM_DOUT)) { 973 PUTCSR(afep, CSR_SPR, eeread); 974 drv_usecwait(1); 975 break; 976 } 977 PUTCSR(afep, CSR_SPR, eeread); 978 drv_usecwait(1); 979 } 980 981 /* turn off accesses to the EEPROM */ 982 PUTCSR(afep, CSR_SPR, eeread &~ SPR_SROM_CHIP); 983 984 return ((addrlen < 4 || addrlen > 12) ? 6 : addrlen); 985 } 986 987 /* 988 * The words in EEPROM are stored in little endian order. We 989 * shift bits out in big endian order, though. This requires 990 * a byte swap on some platforms. 991 */ 992 uint16_t 993 afe_readsromword(afe_t *afep, unsigned romaddr) 994 { 995 int i; 996 uint16_t word = 0; 997 uint16_t retval; 998 int eeread; 999 uint8_t addrlen; 1000 int readcmd; 1001 uchar_t *ptr; 1002 1003 eeread = SPR_SROM_READ | SPR_SROM_SEL | SPR_SROM_CHIP; 1004 addrlen = afep->afe_sromwidth; 1005 readcmd = (SROM_READCMD << addrlen) | romaddr; 1006 1007 if (romaddr >= (1 << addrlen)) { 1008 /* too big to fit! */ 1009 return (0); 1010 } 1011 1012 PUTCSR(afep, CSR_SPR, eeread & ~SPR_SROM_CHIP); 1013 PUTCSR(afep, CSR_SPR, eeread); 1014 1015 /* command and address bits */ 1016 for (i = 4 + addrlen; i >= 0; i--) { 1017 short val = (readcmd & (1 << i)) ? SPR_SROM_DIN : 0; 1018 1019 PUTCSR(afep, CSR_SPR, eeread | val); 1020 drv_usecwait(1); 1021 PUTCSR(afep, CSR_SPR, eeread | val | SPR_SROM_CLOCK); 1022 drv_usecwait(1); 1023 } 1024 1025 PUTCSR(afep, CSR_SPR, eeread); 1026 1027 for (i = 0; i < 16; i++) { 1028 PUTCSR(afep, CSR_SPR, eeread | SPR_SROM_CLOCK); 1029 drv_usecwait(1); 1030 word <<= 1; 1031 if (GETCSR(afep, CSR_SPR) & SPR_SROM_DOUT) { 1032 word |= 1; 1033 } 1034 PUTCSR(afep, CSR_SPR, eeread); 1035 drv_usecwait(1); 1036 } 1037 1038 /* turn off accesses to the EEPROM */ 1039 PUTCSR(afep, CSR_SPR, eeread &~ SPR_SROM_CHIP); 1040 1041 /* 1042 * Fix up the endianness thing. Note that the values 1043 * are stored in little endian format on the SROM. 1044 */ 1045 ptr = (uchar_t *)&word; 1046 retval = (ptr[1] << 8) | ptr[0]; 1047 return (retval); 1048 } 1049 1050 void 1051 afe_readsrom(afe_t *afep, unsigned romaddr, unsigned len, char *dest) 1052 { 1053 int i; 1054 uint16_t word; 1055 uint16_t *ptr = (uint16_t *)((void *)dest); 1056 for (i = 0; i < len; i++) { 1057 word = afe_readsromword(afep, romaddr + i); 1058 *ptr = word; 1059 ptr++; 1060 } 1061 } 1062 1063 void 1064 afe_getfactaddr(afe_t *afep, uchar_t *eaddr) 1065 { 1066 afe_readsrom(afep, SROM_ENADDR, ETHERADDRL / 2, (char *)eaddr); 1067 } 1068 1069 1070 1071 /* 1072 * MII management. 1073 */ 1074 void 1075 afe_mii_reset(void *arg) 1076 { 1077 afe_t *afep = arg; 1078 int fiber; 1079 uint16_t mcr; 1080 uint16_t pilr; 1081 uint8_t phyaddr; 1082 1083 /* 1084 * Its entirely possible that this belongs as a PHY specific 1085 * override. 1086 */ 1087 if ((mii_get_id(afep->afe_mii) & 0xfffffff0) != 0x225410) { 1088 /* if its not an AN983B, we don't care */ 1089 return; 1090 } 1091 1092 phyaddr = mii_get_addr(afep->afe_mii); 1093 1094 fiber = 0; 1095 1096 switch (afep->afe_forcefiber) { 1097 case 0: 1098 /* UTP Port */ 1099 fiber = 0; 1100 break; 1101 case 1: 1102 /* Fiber Port */ 1103 fiber = 1; 1104 break; 1105 } 1106 1107 mcr = afe_mii_read(afep, phyaddr, PHY_MCR); 1108 switch (fiber) { 1109 case 0: 1110 mcr &= ~MCR_FIBER; 1111 break; 1112 1113 case 1: 1114 mcr |= MCR_FIBER; 1115 break; 1116 } 1117 afe_mii_write(afep, phyaddr, PHY_MCR, mcr); 1118 drv_usecwait(500); 1119 1120 /* 1121 * work around for errata 983B_0416 -- duplex light flashes 1122 * in 10 HDX. we just disable SQE testing on the device. 1123 */ 1124 pilr = afe_mii_read(afep, phyaddr, PHY_PILR); 1125 pilr |= PILR_NOSQE; 1126 afe_mii_write(afep, phyaddr, PHY_PILR, pilr); 1127 } 1128 1129 void 1130 afe_mii_notify(void *arg, link_state_t link) 1131 { 1132 afe_t *afep = arg; 1133 1134 if (AFE_MODEL(afep) == MODEL_CENTAUR) { 1135 if (mii_get_flowctrl(afep->afe_mii) == LINK_FLOWCTRL_BI) { 1136 SETBIT(afep, CSR_CR, CR_PAUSE); 1137 } else { 1138 CLRBIT(afep, CSR_CR, CR_PAUSE); 1139 } 1140 } 1141 mac_link_update(afep->afe_mh, link); 1142 } 1143 1144 void 1145 afe_miitristate(afe_t *afep) 1146 { 1147 uint32_t val = SPR_SROM_WRITE | SPR_MII_CTRL; 1148 1149 PUTCSR(afep, CSR_SPR, val); 1150 drv_usecwait(1); 1151 PUTCSR(afep, CSR_SPR, val | SPR_MII_CLOCK); 1152 drv_usecwait(1); 1153 } 1154 1155 void 1156 afe_miiwritebit(afe_t *afep, uint8_t bit) 1157 { 1158 uint32_t val = bit ? SPR_MII_DOUT : 0; 1159 1160 PUTCSR(afep, CSR_SPR, val); 1161 drv_usecwait(1); 1162 PUTCSR(afep, CSR_SPR, val | SPR_MII_CLOCK); 1163 drv_usecwait(1); 1164 } 1165 1166 uint8_t 1167 afe_miireadbit(afe_t *afep) 1168 { 1169 uint32_t val = SPR_MII_CTRL | SPR_SROM_READ; 1170 uint8_t bit; 1171 1172 PUTCSR(afep, CSR_SPR, val); 1173 drv_usecwait(1); 1174 bit = (GETCSR(afep, CSR_SPR) & SPR_MII_DIN) ? 1 : 0; 1175 PUTCSR(afep, CSR_SPR, val | SPR_MII_CLOCK); 1176 drv_usecwait(1); 1177 return (bit); 1178 } 1179 1180 uint16_t 1181 afe_mii_read(void *arg, uint8_t phy, uint8_t reg) 1182 { 1183 afe_t *afep = arg; 1184 /* 1185 * ADMtek bugs ignore address decode bits -- they only 1186 * support PHY at 1. 1187 */ 1188 if (phy != 1) { 1189 return (0xffff); 1190 } 1191 switch (AFE_MODEL(afep)) { 1192 case MODEL_COMET: 1193 return (afe_miireadcomet(afep, phy, reg)); 1194 case MODEL_CENTAUR: 1195 return (afe_miireadgeneral(afep, phy, reg)); 1196 } 1197 return (0xffff); 1198 } 1199 1200 uint16_t 1201 afe_miireadgeneral(afe_t *afep, uint8_t phy, uint8_t reg) 1202 { 1203 uint16_t value = 0; 1204 int i; 1205 1206 /* send the 32 bit preamble */ 1207 for (i = 0; i < 32; i++) { 1208 afe_miiwritebit(afep, 1); 1209 } 1210 1211 /* send the start code - 01b */ 1212 afe_miiwritebit(afep, 0); 1213 afe_miiwritebit(afep, 1); 1214 1215 /* send the opcode for read, - 10b */ 1216 afe_miiwritebit(afep, 1); 1217 afe_miiwritebit(afep, 0); 1218 1219 /* next we send the 5 bit phy address */ 1220 for (i = 0x10; i > 0; i >>= 1) { 1221 afe_miiwritebit(afep, (phy & i) ? 1 : 0); 1222 } 1223 1224 /* the 5 bit register address goes next */ 1225 for (i = 0x10; i > 0; i >>= 1) { 1226 afe_miiwritebit(afep, (reg & i) ? 1 : 0); 1227 } 1228 1229 /* turnaround - tristate followed by logic 0 */ 1230 afe_miitristate(afep); 1231 afe_miiwritebit(afep, 0); 1232 1233 /* read the 16 bit register value */ 1234 for (i = 0x8000; i > 0; i >>= 1) { 1235 value <<= 1; 1236 value |= afe_miireadbit(afep); 1237 } 1238 afe_miitristate(afep); 1239 return (value); 1240 } 1241 1242 uint16_t 1243 afe_miireadcomet(afe_t *afep, uint8_t phy, uint8_t reg) 1244 { 1245 if (phy != 1) { 1246 return (0xffff); 1247 } 1248 switch (reg) { 1249 case MII_CONTROL: 1250 reg = CSR_BMCR; 1251 break; 1252 case MII_STATUS: 1253 reg = CSR_BMSR; 1254 break; 1255 case MII_PHYIDH: 1256 reg = CSR_PHYIDR1; 1257 break; 1258 case MII_PHYIDL: 1259 reg = CSR_PHYIDR2; 1260 break; 1261 case MII_AN_ADVERT: 1262 reg = CSR_ANAR; 1263 break; 1264 case MII_AN_LPABLE: 1265 reg = CSR_ANLPAR; 1266 break; 1267 case MII_AN_EXPANSION: 1268 reg = CSR_ANER; 1269 break; 1270 default: 1271 return (0); 1272 } 1273 return (GETCSR16(afep, reg) & 0xFFFF); 1274 } 1275 1276 void 1277 afe_mii_write(void *arg, uint8_t phy, uint8_t reg, uint16_t val) 1278 { 1279 afe_t *afep = arg; 1280 1281 /* 1282 * ADMtek bugs ignore address decode bits -- they only 1283 * support PHY at 1. 1284 */ 1285 if (phy != 1) { 1286 return; 1287 } 1288 switch (AFE_MODEL(afep)) { 1289 case MODEL_COMET: 1290 afe_miiwritecomet(afep, phy, reg, val); 1291 break; 1292 case MODEL_CENTAUR: 1293 afe_miiwritegeneral(afep, phy, reg, val); 1294 break; 1295 } 1296 } 1297 1298 void 1299 afe_miiwritegeneral(afe_t *afep, uint8_t phy, uint8_t reg, uint16_t val) 1300 { 1301 int i; 1302 1303 /* send the 32 bit preamble */ 1304 for (i = 0; i < 32; i++) { 1305 afe_miiwritebit(afep, 1); 1306 } 1307 1308 /* send the start code - 01b */ 1309 afe_miiwritebit(afep, 0); 1310 afe_miiwritebit(afep, 1); 1311 1312 /* send the opcode for write, - 01b */ 1313 afe_miiwritebit(afep, 0); 1314 afe_miiwritebit(afep, 1); 1315 1316 /* next we send the 5 bit phy address */ 1317 for (i = 0x10; i > 0; i >>= 1) { 1318 afe_miiwritebit(afep, (phy & i) ? 1 : 0); 1319 } 1320 1321 /* the 5 bit register address goes next */ 1322 for (i = 0x10; i > 0; i >>= 1) { 1323 afe_miiwritebit(afep, (reg & i) ? 1 : 0); 1324 } 1325 1326 /* turnaround - 1 bit followed by logic 0 */ 1327 afe_miiwritebit(afep, 1); 1328 afe_miiwritebit(afep, 0); 1329 1330 /* now write out our data (16 bits) */ 1331 for (i = 0x8000; i > 0; i >>= 1) { 1332 afe_miiwritebit(afep, (val & i) ? 1 : 0); 1333 } 1334 1335 /* idle mode */ 1336 afe_miitristate(afep); 1337 } 1338 1339 void 1340 afe_miiwritecomet(afe_t *afep, uint8_t phy, uint8_t reg, uint16_t val) 1341 { 1342 if (phy != 1) { 1343 return; 1344 } 1345 switch (reg) { 1346 case MII_CONTROL: 1347 reg = CSR_BMCR; 1348 break; 1349 case MII_STATUS: 1350 reg = CSR_BMSR; 1351 break; 1352 case MII_PHYIDH: 1353 reg = CSR_PHYIDR1; 1354 break; 1355 case MII_PHYIDL: 1356 reg = CSR_PHYIDR2; 1357 break; 1358 case MII_AN_ADVERT: 1359 reg = CSR_ANAR; 1360 break; 1361 case MII_AN_LPABLE: 1362 reg = CSR_ANLPAR; 1363 break; 1364 case MII_AN_EXPANSION: 1365 reg = CSR_ANER; 1366 break; 1367 default: 1368 return; 1369 } 1370 PUTCSR16(afep, reg, val); 1371 } 1372 1373 int 1374 afe_m_start(void *arg) 1375 { 1376 afe_t *afep = arg; 1377 1378 /* grab exclusive access to the card */ 1379 mutex_enter(&afep->afe_intrlock); 1380 mutex_enter(&afep->afe_xmtlock); 1381 1382 afe_startall(afep); 1383 afep->afe_flags |= AFE_RUNNING; 1384 1385 mutex_exit(&afep->afe_xmtlock); 1386 mutex_exit(&afep->afe_intrlock); 1387 1388 mii_start(afep->afe_mii); 1389 1390 return (0); 1391 } 1392 1393 void 1394 afe_m_stop(void *arg) 1395 { 1396 afe_t *afep = arg; 1397 1398 mii_stop(afep->afe_mii); 1399 1400 /* exclusive access to the hardware! */ 1401 mutex_enter(&afep->afe_intrlock); 1402 mutex_enter(&afep->afe_xmtlock); 1403 1404 afe_stopall(afep); 1405 afep->afe_flags &= ~AFE_RUNNING; 1406 1407 mutex_exit(&afep->afe_xmtlock); 1408 mutex_exit(&afep->afe_intrlock); 1409 } 1410 1411 void 1412 afe_startmac(afe_t *afep) 1413 { 1414 /* verify exclusive access to the card */ 1415 ASSERT(mutex_owned(&afep->afe_intrlock)); 1416 ASSERT(mutex_owned(&afep->afe_xmtlock)); 1417 1418 /* start the card */ 1419 SETBIT(afep, CSR_NAR, NAR_TX_ENABLE | NAR_RX_ENABLE); 1420 1421 if (afep->afe_txavail != AFE_TXRING) 1422 PUTCSR(afep, CSR_TDR, 0); 1423 1424 /* tell the mac that we are ready to go! */ 1425 if (afep->afe_flags & AFE_RUNNING) 1426 mac_tx_update(afep->afe_mh); 1427 1428 /* start watchdog timer */ 1429 PUTCSR(afep, CSR_TIMER, TIMER_LOOP | 1430 (AFE_WDOGTIMER * 1000 / TIMER_USEC)); 1431 } 1432 1433 void 1434 afe_stopmac(afe_t *afep) 1435 { 1436 int i; 1437 1438 /* exclusive access to the hardware! */ 1439 ASSERT(mutex_owned(&afep->afe_intrlock)); 1440 ASSERT(mutex_owned(&afep->afe_xmtlock)); 1441 1442 CLRBIT(afep, CSR_NAR, NAR_TX_ENABLE | NAR_RX_ENABLE); 1443 1444 /* 1445 * A 1518 byte frame at 10Mbps takes about 1.2 msec to drain. 1446 * We just add up to the nearest msec (2), which should be 1447 * plenty to complete. 1448 * 1449 * Note that some chips never seem to indicate the transition to 1450 * the stopped state properly. Experience shows that we can safely 1451 * proceed anyway, after waiting the requisite timeout. 1452 */ 1453 for (i = 2000; i != 0; i -= 10) { 1454 if ((GETCSR(afep, CSR_SR) & (SR_TX_STATE | SR_RX_STATE)) == 0) 1455 break; 1456 drv_usecwait(10); 1457 } 1458 1459 /* prevent an interrupt */ 1460 PUTCSR(afep, CSR_SR2, INT_RXSTOPPED | INT_TXSTOPPED); 1461 1462 /* stop the watchdog timer */ 1463 PUTCSR(afep, CSR_TIMER, 0); 1464 } 1465 1466 void 1467 afe_resetrings(afe_t *afep) 1468 { 1469 int i; 1470 1471 /* now we need to reset the pointers... */ 1472 PUTCSR(afep, CSR_RDB, 0); 1473 PUTCSR(afep, CSR_TDB, 0); 1474 1475 /* reset the descriptor ring pointers */ 1476 afep->afe_rxhead = 0; 1477 afep->afe_txreclaim = 0; 1478 afep->afe_txsend = 0; 1479 afep->afe_txavail = AFE_TXRING; 1480 1481 /* set up transmit descriptor ring */ 1482 for (i = 0; i < AFE_TXRING; i++) { 1483 afe_desc_t *tmdp = &afep->afe_txdescp[i]; 1484 unsigned control = 0; 1485 if (i == (AFE_TXRING - 1)) { 1486 control |= TXCTL_ENDRING; 1487 } 1488 PUTTXDESC(afep, tmdp->desc_status, 0); 1489 PUTTXDESC(afep, tmdp->desc_control, control); 1490 PUTTXDESC(afep, tmdp->desc_buffer1, 0); 1491 PUTTXDESC(afep, tmdp->desc_buffer2, 0); 1492 SYNCTXDESC(afep, i, DDI_DMA_SYNC_FORDEV); 1493 } 1494 PUTCSR(afep, CSR_TDB, afep->afe_txdesc_paddr); 1495 1496 /* make the receive buffers available */ 1497 for (i = 0; i < AFE_RXRING; i++) { 1498 afe_rxbuf_t *rxb = afep->afe_rxbufs[i]; 1499 afe_desc_t *rmdp = &afep->afe_rxdescp[i]; 1500 unsigned control; 1501 1502 control = AFE_BUFSZ & RXCTL_BUFLEN1; 1503 if (i == (AFE_RXRING - 1)) { 1504 control |= RXCTL_ENDRING; 1505 } 1506 PUTRXDESC(afep, rmdp->desc_buffer1, rxb->rxb_paddr); 1507 PUTRXDESC(afep, rmdp->desc_buffer2, 0); 1508 PUTRXDESC(afep, rmdp->desc_control, control); 1509 PUTRXDESC(afep, rmdp->desc_status, RXSTAT_OWN); 1510 SYNCRXDESC(afep, i, DDI_DMA_SYNC_FORDEV); 1511 } 1512 PUTCSR(afep, CSR_RDB, afep->afe_rxdesc_paddr); 1513 } 1514 1515 void 1516 afe_stopall(afe_t *afep) 1517 { 1518 afe_disableinterrupts(afep); 1519 afe_stopmac(afep); 1520 } 1521 1522 void 1523 afe_startall(afe_t *afep) 1524 { 1525 ASSERT(mutex_owned(&afep->afe_intrlock)); 1526 ASSERT(mutex_owned(&afep->afe_xmtlock)); 1527 1528 /* make sure interrupts are disabled to begin */ 1529 afe_disableinterrupts(afep); 1530 1531 /* initialize the chip */ 1532 (void) afe_initialize(afep); 1533 1534 /* now we can enable interrupts */ 1535 afe_enableinterrupts(afep); 1536 1537 /* start up the mac */ 1538 afe_startmac(afep); 1539 } 1540 1541 void 1542 afe_resetall(afe_t *afep) 1543 { 1544 afe_stopall(afep); 1545 afe_startall(afep); 1546 } 1547 1548 afe_txbuf_t * 1549 afe_alloctxbuf(afe_t *afep) 1550 { 1551 ddi_dma_cookie_t dmac; 1552 unsigned ncookies; 1553 afe_txbuf_t *txb; 1554 size_t len; 1555 1556 txb = kmem_zalloc(sizeof (*txb), KM_SLEEP); 1557 1558 if (ddi_dma_alloc_handle(afep->afe_dip, &afe_dma_txattr, 1559 DDI_DMA_SLEEP, NULL, &txb->txb_dmah) != DDI_SUCCESS) { 1560 return (NULL); 1561 } 1562 1563 if (ddi_dma_mem_alloc(txb->txb_dmah, AFE_BUFSZ, &afe_bufattr, 1564 DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &txb->txb_buf, &len, 1565 &txb->txb_acch) != DDI_SUCCESS) { 1566 return (NULL); 1567 } 1568 if (ddi_dma_addr_bind_handle(txb->txb_dmah, NULL, txb->txb_buf, 1569 len, DDI_DMA_WRITE | DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, 1570 &dmac, &ncookies) != DDI_DMA_MAPPED) { 1571 return (NULL); 1572 } 1573 txb->txb_paddr = dmac.dmac_address; 1574 1575 return (txb); 1576 } 1577 1578 void 1579 afe_destroytxbuf(afe_txbuf_t *txb) 1580 { 1581 if (txb != NULL) { 1582 if (txb->txb_paddr) 1583 (void) ddi_dma_unbind_handle(txb->txb_dmah); 1584 if (txb->txb_acch) 1585 ddi_dma_mem_free(&txb->txb_acch); 1586 if (txb->txb_dmah) 1587 ddi_dma_free_handle(&txb->txb_dmah); 1588 kmem_free(txb, sizeof (*txb)); 1589 } 1590 } 1591 1592 afe_rxbuf_t * 1593 afe_allocrxbuf(afe_t *afep) 1594 { 1595 afe_rxbuf_t *rxb; 1596 size_t len; 1597 unsigned ccnt; 1598 ddi_dma_cookie_t dmac; 1599 1600 rxb = kmem_zalloc(sizeof (*rxb), KM_SLEEP); 1601 1602 if (ddi_dma_alloc_handle(afep->afe_dip, &afe_dma_attr, 1603 DDI_DMA_SLEEP, NULL, &rxb->rxb_dmah) != DDI_SUCCESS) { 1604 kmem_free(rxb, sizeof (*rxb)); 1605 return (NULL); 1606 } 1607 if (ddi_dma_mem_alloc(rxb->rxb_dmah, AFE_BUFSZ, &afe_bufattr, 1608 DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &rxb->rxb_buf, &len, 1609 &rxb->rxb_acch) != DDI_SUCCESS) { 1610 ddi_dma_free_handle(&rxb->rxb_dmah); 1611 kmem_free(rxb, sizeof (*rxb)); 1612 return (NULL); 1613 } 1614 if (ddi_dma_addr_bind_handle(rxb->rxb_dmah, NULL, rxb->rxb_buf, len, 1615 DDI_DMA_READ | DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &dmac, 1616 &ccnt) != DDI_DMA_MAPPED) { 1617 ddi_dma_mem_free(&rxb->rxb_acch); 1618 ddi_dma_free_handle(&rxb->rxb_dmah); 1619 kmem_free(rxb, sizeof (*rxb)); 1620 return (NULL); 1621 } 1622 rxb->rxb_paddr = dmac.dmac_address; 1623 1624 return (rxb); 1625 } 1626 1627 void 1628 afe_destroyrxbuf(afe_rxbuf_t *rxb) 1629 { 1630 if (rxb) { 1631 (void) ddi_dma_unbind_handle(rxb->rxb_dmah); 1632 ddi_dma_mem_free(&rxb->rxb_acch); 1633 ddi_dma_free_handle(&rxb->rxb_dmah); 1634 kmem_free(rxb, sizeof (*rxb)); 1635 } 1636 } 1637 1638 /* 1639 * Allocate receive resources. 1640 */ 1641 int 1642 afe_allocrxring(afe_t *afep) 1643 { 1644 int rval; 1645 int i; 1646 size_t size; 1647 size_t len; 1648 ddi_dma_cookie_t dmac; 1649 unsigned ncookies; 1650 caddr_t kaddr; 1651 1652 size = AFE_RXRING * sizeof (afe_desc_t); 1653 1654 rval = ddi_dma_alloc_handle(afep->afe_dip, &afe_dma_attr, 1655 DDI_DMA_SLEEP, NULL, &afep->afe_rxdesc_dmah); 1656 if (rval != DDI_SUCCESS) { 1657 afe_error(afep->afe_dip, 1658 "unable to allocate DMA handle for rx descriptors"); 1659 return (DDI_FAILURE); 1660 } 1661 1662 rval = ddi_dma_mem_alloc(afep->afe_rxdesc_dmah, size, &afe_devattr, 1663 DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &kaddr, &len, 1664 &afep->afe_rxdesc_acch); 1665 if (rval != DDI_SUCCESS) { 1666 afe_error(afep->afe_dip, 1667 "unable to allocate DMA memory for rx descriptors"); 1668 return (DDI_FAILURE); 1669 } 1670 1671 rval = ddi_dma_addr_bind_handle(afep->afe_rxdesc_dmah, NULL, kaddr, 1672 size, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 1673 &dmac, &ncookies); 1674 if (rval != DDI_DMA_MAPPED) { 1675 afe_error(afep->afe_dip, 1676 "unable to bind DMA for rx descriptors"); 1677 return (DDI_FAILURE); 1678 } 1679 1680 /* because of afe_dma_attr */ 1681 ASSERT(ncookies == 1); 1682 1683 /* we take the 32-bit physical address out of the cookie */ 1684 afep->afe_rxdesc_paddr = dmac.dmac_address; 1685 afep->afe_rxdescp = (void *)kaddr; 1686 1687 /* allocate buffer pointers (not the buffers themselves, yet) */ 1688 afep->afe_rxbufs = kmem_zalloc(AFE_RXRING * sizeof (afe_rxbuf_t *), 1689 KM_SLEEP); 1690 1691 /* now allocate rx buffers */ 1692 for (i = 0; i < AFE_RXRING; i++) { 1693 afe_rxbuf_t *rxb = afe_allocrxbuf(afep); 1694 if (rxb == NULL) 1695 return (DDI_FAILURE); 1696 afep->afe_rxbufs[i] = rxb; 1697 } 1698 1699 return (DDI_SUCCESS); 1700 } 1701 1702 /* 1703 * Allocate transmit resources. 1704 */ 1705 int 1706 afe_alloctxring(afe_t *afep) 1707 { 1708 int rval; 1709 int i; 1710 size_t size; 1711 size_t len; 1712 ddi_dma_cookie_t dmac; 1713 unsigned ncookies; 1714 caddr_t kaddr; 1715 1716 size = AFE_TXRING * sizeof (afe_desc_t); 1717 1718 rval = ddi_dma_alloc_handle(afep->afe_dip, &afe_dma_attr, 1719 DDI_DMA_SLEEP, NULL, &afep->afe_txdesc_dmah); 1720 if (rval != DDI_SUCCESS) { 1721 afe_error(afep->afe_dip, 1722 "unable to allocate DMA handle for tx descriptors"); 1723 return (DDI_FAILURE); 1724 } 1725 1726 rval = ddi_dma_mem_alloc(afep->afe_txdesc_dmah, size, &afe_devattr, 1727 DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &kaddr, &len, 1728 &afep->afe_txdesc_acch); 1729 if (rval != DDI_SUCCESS) { 1730 afe_error(afep->afe_dip, 1731 "unable to allocate DMA memory for tx descriptors"); 1732 return (DDI_FAILURE); 1733 } 1734 1735 rval = ddi_dma_addr_bind_handle(afep->afe_txdesc_dmah, NULL, kaddr, 1736 size, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 1737 &dmac, &ncookies); 1738 if (rval != DDI_DMA_MAPPED) { 1739 afe_error(afep->afe_dip, 1740 "unable to bind DMA for tx descriptors"); 1741 return (DDI_FAILURE); 1742 } 1743 1744 /* because of afe_dma_attr */ 1745 ASSERT(ncookies == 1); 1746 1747 /* we take the 32-bit physical address out of the cookie */ 1748 afep->afe_txdesc_paddr = dmac.dmac_address; 1749 afep->afe_txdescp = (void *)kaddr; 1750 1751 /* allocate buffer pointers (not the buffers themselves, yet) */ 1752 afep->afe_txbufs = kmem_zalloc(AFE_TXRING * sizeof (afe_txbuf_t *), 1753 KM_SLEEP); 1754 1755 /* now allocate tx buffers */ 1756 for (i = 0; i < AFE_TXRING; i++) { 1757 afe_txbuf_t *txb = afe_alloctxbuf(afep); 1758 if (txb == NULL) 1759 return (DDI_FAILURE); 1760 afep->afe_txbufs[i] = txb; 1761 } 1762 1763 return (DDI_SUCCESS); 1764 } 1765 1766 void 1767 afe_freerxring(afe_t *afep) 1768 { 1769 int i; 1770 1771 for (i = 0; i < AFE_RXRING; i++) { 1772 afe_destroyrxbuf(afep->afe_rxbufs[i]); 1773 } 1774 1775 if (afep->afe_rxbufs) { 1776 kmem_free(afep->afe_rxbufs, 1777 AFE_RXRING * sizeof (afe_rxbuf_t *)); 1778 } 1779 1780 if (afep->afe_rxdesc_paddr) 1781 (void) ddi_dma_unbind_handle(afep->afe_rxdesc_dmah); 1782 if (afep->afe_rxdesc_acch) 1783 ddi_dma_mem_free(&afep->afe_rxdesc_acch); 1784 if (afep->afe_rxdesc_dmah) 1785 ddi_dma_free_handle(&afep->afe_rxdesc_dmah); 1786 } 1787 1788 void 1789 afe_freetxring(afe_t *afep) 1790 { 1791 int i; 1792 1793 for (i = 0; i < AFE_TXRING; i++) { 1794 afe_destroytxbuf(afep->afe_txbufs[i]); 1795 } 1796 1797 if (afep->afe_txbufs) { 1798 kmem_free(afep->afe_txbufs, 1799 AFE_TXRING * sizeof (afe_txbuf_t *)); 1800 } 1801 if (afep->afe_txdesc_paddr) 1802 (void) ddi_dma_unbind_handle(afep->afe_txdesc_dmah); 1803 if (afep->afe_txdesc_acch) 1804 ddi_dma_mem_free(&afep->afe_txdesc_acch); 1805 if (afep->afe_txdesc_dmah) 1806 ddi_dma_free_handle(&afep->afe_txdesc_dmah); 1807 } 1808 1809 /* 1810 * Interrupt service routine. 1811 */ 1812 unsigned 1813 afe_intr(caddr_t arg) 1814 { 1815 afe_t *afep = (void *)arg; 1816 uint32_t status; 1817 mblk_t *mp = NULL; 1818 boolean_t doreset = B_FALSE; 1819 1820 mutex_enter(&afep->afe_intrlock); 1821 1822 if (afep->afe_flags & AFE_SUSPENDED) { 1823 /* we cannot receive interrupts! */ 1824 mutex_exit(&afep->afe_intrlock); 1825 return (DDI_INTR_UNCLAIMED); 1826 } 1827 1828 /* check interrupt status bits, did we interrupt? */ 1829 status = GETCSR(afep, CSR_SR2) & INT_ALL; 1830 1831 if (status == 0) { 1832 KIOIP->intrs[KSTAT_INTR_SPURIOUS]++; 1833 mutex_exit(&afep->afe_intrlock); 1834 return (DDI_INTR_UNCLAIMED); 1835 } 1836 /* ack the interrupt */ 1837 PUTCSR(afep, CSR_SR2, status); 1838 KIOIP->intrs[KSTAT_INTR_HARD]++; 1839 1840 if (!(afep->afe_flags & AFE_RUNNING)) { 1841 /* not running, don't touch anything */ 1842 mutex_exit(&afep->afe_intrlock); 1843 return (DDI_INTR_CLAIMED); 1844 } 1845 1846 if (status & (INT_RXOK|INT_RXNOBUF)) { 1847 /* receive packets */ 1848 mp = afe_receive(afep); 1849 if (status & INT_RXNOBUF) 1850 PUTCSR(afep, CSR_RDR, 0); /* wake up chip */ 1851 } 1852 1853 if (status & INT_TXOK) { 1854 /* transmit completed */ 1855 mutex_enter(&afep->afe_xmtlock); 1856 afe_reclaim(afep); 1857 mutex_exit(&afep->afe_xmtlock); 1858 } 1859 1860 if ((status & INT_TIMER) && (afe_watchdog(afep) != DDI_SUCCESS)) { 1861 doreset = B_TRUE; 1862 } 1863 1864 if (status & (INT_RXSTOPPED|INT_TXSTOPPED| 1865 INT_RXJABBER|INT_TXJABBER|INT_TXUNDERFLOW)) { 1866 1867 if (status & (INT_RXJABBER | INT_TXJABBER)) { 1868 afep->afe_jabber++; 1869 } 1870 doreset = B_TRUE; 1871 } 1872 1873 if (status & INT_BUSERR) { 1874 switch (GETCSR(afep, CSR_SR) & SR_BERR_TYPE) { 1875 case SR_BERR_PARITY: 1876 afe_error(afep->afe_dip, "PCI parity error"); 1877 break; 1878 case SR_BERR_TARGET_ABORT: 1879 afe_error(afep->afe_dip, "PCI target abort"); 1880 break; 1881 case SR_BERR_MASTER_ABORT: 1882 afe_error(afep->afe_dip, "PCI master abort"); 1883 break; 1884 default: 1885 afe_error(afep->afe_dip, "Unknown PCI error"); 1886 break; 1887 } 1888 1889 /* reset the chip in an attempt to fix things */ 1890 doreset = B_TRUE; 1891 } 1892 1893 1894 if (doreset) { 1895 mutex_enter(&afep->afe_xmtlock); 1896 afe_resetall(afep); 1897 mutex_exit(&afep->afe_xmtlock); 1898 mutex_exit(&afep->afe_intrlock); 1899 1900 mii_reset(afep->afe_mii); 1901 } else { 1902 mutex_exit(&afep->afe_intrlock); 1903 } 1904 1905 if (status & INT_LINKCHG) { 1906 mii_check(afep->afe_mii); 1907 } 1908 1909 /* 1910 * Send up packets. We do this outside of the intrlock. 1911 */ 1912 if (mp) { 1913 mac_rx(afep->afe_mh, NULL, mp); 1914 } 1915 1916 return (DDI_INTR_CLAIMED); 1917 } 1918 1919 void 1920 afe_enableinterrupts(afe_t *afep) 1921 { 1922 unsigned mask = INT_WANTED; 1923 1924 if (afep->afe_wantw) 1925 mask |= INT_TXOK; 1926 1927 PUTCSR(afep, CSR_IER2, mask); 1928 1929 if (AFE_MODEL(afep) == MODEL_COMET) { 1930 /* 1931 * On the Comet, this is the internal transceiver 1932 * interrupt. We program the Comet's built-in PHY to 1933 * enable certain interrupts. 1934 */ 1935 PUTCSR16(afep, CSR_XIE, XIE_LDE | XIE_ANCE); 1936 } 1937 } 1938 1939 void 1940 afe_disableinterrupts(afe_t *afep) 1941 { 1942 /* disable further interrupts */ 1943 PUTCSR(afep, CSR_IER2, INT_NONE); 1944 1945 /* clear any pending interrupts */ 1946 PUTCSR(afep, CSR_SR2, INT_ALL); 1947 } 1948 1949 boolean_t 1950 afe_send(afe_t *afep, mblk_t *mp) 1951 { 1952 size_t len; 1953 afe_txbuf_t *txb; 1954 afe_desc_t *tmd; 1955 uint32_t control; 1956 int txsend; 1957 1958 ASSERT(mutex_owned(&afep->afe_xmtlock)); 1959 ASSERT(mp != NULL); 1960 1961 len = msgsize(mp); 1962 if (len > ETHERVLANMTU) { 1963 afep->afe_macxmt_errors++; 1964 freemsg(mp); 1965 return (B_TRUE); 1966 } 1967 1968 if (afep->afe_txavail < AFE_TXRECLAIM) 1969 afe_reclaim(afep); 1970 1971 if (afep->afe_txavail == 0) { 1972 /* no more tmds */ 1973 afep->afe_wantw = B_TRUE; 1974 /* enable TX interrupt */ 1975 afe_enableinterrupts(afep); 1976 return (B_FALSE); 1977 } 1978 1979 txsend = afep->afe_txsend; 1980 1981 /* 1982 * For simplicity, we just do a copy into a preallocated 1983 * DMA buffer. 1984 */ 1985 1986 txb = afep->afe_txbufs[txsend]; 1987 mcopymsg(mp, txb->txb_buf); /* frees mp! */ 1988 1989 /* 1990 * Statistics. 1991 */ 1992 afep->afe_opackets++; 1993 afep->afe_obytes += len; 1994 if (txb->txb_buf[0] & 0x1) { 1995 if (bcmp(txb->txb_buf, afe_broadcast, ETHERADDRL) != 0) 1996 afep->afe_multixmt++; 1997 else 1998 afep->afe_brdcstxmt++; 1999 } 2000 2001 /* note len is already known to be a small unsigned */ 2002 control = len | TXCTL_FIRST | TXCTL_LAST | TXCTL_INTCMPLTE; 2003 2004 if (txsend == (AFE_TXRING - 1)) 2005 control |= TXCTL_ENDRING; 2006 2007 tmd = &afep->afe_txdescp[txsend]; 2008 2009 SYNCTXBUF(txb, len, DDI_DMA_SYNC_FORDEV); 2010 PUTTXDESC(afep, tmd->desc_control, control); 2011 PUTTXDESC(afep, tmd->desc_buffer1, txb->txb_paddr); 2012 PUTTXDESC(afep, tmd->desc_buffer2, 0); 2013 PUTTXDESC(afep, tmd->desc_status, TXSTAT_OWN); 2014 /* sync the descriptor out to the device */ 2015 SYNCTXDESC(afep, txsend, DDI_DMA_SYNC_FORDEV); 2016 2017 /* 2018 * Note the new values of txavail and txsend. 2019 */ 2020 afep->afe_txavail--; 2021 afep->afe_txsend = (txsend + 1) % AFE_TXRING; 2022 2023 /* 2024 * It should never, ever take more than 5 seconds to drain 2025 * the ring. If it happens, then we are stuck! 2026 */ 2027 afep->afe_txstall_time = gethrtime() + (5 * 1000000000ULL); 2028 2029 /* 2030 * wake up the chip ... inside the lock to protect against DR suspend, 2031 * etc. 2032 */ 2033 PUTCSR(afep, CSR_TDR, 0); 2034 2035 return (B_TRUE); 2036 } 2037 2038 /* 2039 * Reclaim buffers that have completed transmission. 2040 */ 2041 void 2042 afe_reclaim(afe_t *afep) 2043 { 2044 afe_desc_t *tmdp; 2045 2046 while (afep->afe_txavail != AFE_TXRING) { 2047 uint32_t status; 2048 uint32_t control; 2049 int index = afep->afe_txreclaim; 2050 2051 tmdp = &afep->afe_txdescp[index]; 2052 2053 /* sync it before we read it */ 2054 SYNCTXDESC(afep, index, DDI_DMA_SYNC_FORKERNEL); 2055 2056 control = GETTXDESC(afep, tmdp->desc_control); 2057 status = GETTXDESC(afep, tmdp->desc_status); 2058 2059 if (status & TXSTAT_OWN) { 2060 /* chip is still working on it, we're done */ 2061 break; 2062 } 2063 2064 afep->afe_txavail++; 2065 afep->afe_txreclaim = (index + 1) % AFE_TXRING; 2066 2067 /* in the most common successful case, all bits are clear */ 2068 if (status == 0) 2069 continue; 2070 2071 if ((control & TXCTL_LAST) == 0) 2072 continue; 2073 2074 if (status & TXSTAT_TXERR) { 2075 afep->afe_errxmt++; 2076 2077 if (status & TXSTAT_JABBER) { 2078 /* transmit jabber timeout */ 2079 afep->afe_macxmt_errors++; 2080 } 2081 if (status & 2082 (TXSTAT_CARRLOST | TXSTAT_NOCARR)) { 2083 afep->afe_carrier_errors++; 2084 } 2085 if (status & TXSTAT_UFLOW) { 2086 afep->afe_underflow++; 2087 } 2088 if (status & TXSTAT_LATECOL) { 2089 afep->afe_tx_late_collisions++; 2090 } 2091 if (status & TXSTAT_EXCOLL) { 2092 afep->afe_ex_collisions++; 2093 afep->afe_collisions += 16; 2094 } 2095 } 2096 2097 if (status & TXSTAT_DEFER) { 2098 afep->afe_defer_xmts++; 2099 } 2100 2101 /* collision counting */ 2102 if (TXCOLLCNT(status) == 1) { 2103 afep->afe_collisions++; 2104 afep->afe_first_collisions++; 2105 } else if (TXCOLLCNT(status)) { 2106 afep->afe_collisions += TXCOLLCNT(status); 2107 afep->afe_multi_collisions += TXCOLLCNT(status); 2108 } 2109 } 2110 2111 if (afep->afe_txavail >= AFE_TXRESCHED) { 2112 if (afep->afe_wantw) { 2113 /* 2114 * we were able to reclaim some packets, so 2115 * disable tx interrupts 2116 */ 2117 afep->afe_wantw = B_FALSE; 2118 afe_enableinterrupts(afep); 2119 mac_tx_update(afep->afe_mh); 2120 } 2121 } 2122 } 2123 2124 mblk_t * 2125 afe_receive(afe_t *afep) 2126 { 2127 unsigned len; 2128 afe_rxbuf_t *rxb; 2129 afe_desc_t *rmd; 2130 uint32_t status; 2131 mblk_t *mpchain, **mpp, *mp; 2132 int head, cnt; 2133 2134 mpchain = NULL; 2135 mpp = &mpchain; 2136 head = afep->afe_rxhead; 2137 2138 /* limit the number of packets we process to a half ring size */ 2139 for (cnt = 0; cnt < AFE_RXRING / 2; cnt++) { 2140 2141 rmd = &afep->afe_rxdescp[head]; 2142 rxb = afep->afe_rxbufs[head]; 2143 2144 SYNCRXDESC(afep, head, DDI_DMA_SYNC_FORKERNEL); 2145 status = GETRXDESC(afep, rmd->desc_status); 2146 if (status & RXSTAT_OWN) { 2147 /* chip is still chewing on it */ 2148 break; 2149 } 2150 2151 /* discard the ethernet frame checksum */ 2152 len = RXLENGTH(status) - ETHERFCSL; 2153 2154 if ((status & (RXSTAT_ERRS | RXSTAT_FIRST | RXSTAT_LAST)) != 2155 (RXSTAT_FIRST | RXSTAT_LAST)) { 2156 2157 afep->afe_errrcv++; 2158 2159 /* 2160 * Abnormal status bits detected, analyze further. 2161 */ 2162 if ((status & (RXSTAT_LAST|RXSTAT_FIRST)) != 2163 (RXSTAT_LAST|RXSTAT_FIRST)) { 2164 2165 if (status & RXSTAT_FIRST) { 2166 afep->afe_toolong_errors++; 2167 } 2168 } else if (status & RXSTAT_DESCERR) { 2169 afep->afe_macrcv_errors++; 2170 2171 } else if (status & RXSTAT_RUNT) { 2172 afep->afe_runt++; 2173 2174 } else if (status & RXSTAT_COLLSEEN) { 2175 /* this should really be rx_late_collisions */ 2176 afep->afe_macrcv_errors++; 2177 2178 } else if (status & RXSTAT_DRIBBLE) { 2179 afep->afe_align_errors++; 2180 2181 } else if (status & RXSTAT_CRCERR) { 2182 afep->afe_fcs_errors++; 2183 2184 } else if (status & RXSTAT_OFLOW) { 2185 afep->afe_overflow++; 2186 } 2187 } 2188 2189 else if (len > ETHERVLANMTU) { 2190 afep->afe_errrcv++; 2191 afep->afe_toolong_errors++; 2192 } 2193 2194 /* 2195 * At this point, the chip thinks the packet is OK. 2196 */ 2197 else { 2198 mp = allocb(len + AFE_HEADROOM, 0); 2199 if (mp == NULL) { 2200 afep->afe_errrcv++; 2201 afep->afe_norcvbuf++; 2202 goto skip; 2203 } 2204 2205 /* sync the buffer before we look at it */ 2206 SYNCRXBUF(rxb, len, DDI_DMA_SYNC_FORKERNEL); 2207 mp->b_rptr += AFE_HEADROOM; 2208 mp->b_wptr = mp->b_rptr + len; 2209 bcopy((char *)rxb->rxb_buf, mp->b_rptr, len); 2210 2211 afep->afe_ipackets++; 2212 afep->afe_rbytes += len; 2213 if (status & RXSTAT_GROUP) { 2214 if (bcmp(mp->b_rptr, afe_broadcast, 2215 ETHERADDRL) == 0) 2216 afep->afe_brdcstrcv++; 2217 else 2218 afep->afe_multircv++; 2219 } 2220 *mpp = mp; 2221 mpp = &mp->b_next; 2222 } 2223 2224 skip: 2225 /* return ring entry to the hardware */ 2226 PUTRXDESC(afep, rmd->desc_status, RXSTAT_OWN); 2227 SYNCRXDESC(afep, head, DDI_DMA_SYNC_FORDEV); 2228 2229 /* advance to next RMD */ 2230 head = (head + 1) % AFE_RXRING; 2231 } 2232 2233 afep->afe_rxhead = head; 2234 2235 return (mpchain); 2236 } 2237 2238 int 2239 afe_m_stat(void *arg, uint_t stat, uint64_t *val) 2240 { 2241 afe_t *afep = arg; 2242 2243 mutex_enter(&afep->afe_xmtlock); 2244 if ((afep->afe_flags & (AFE_RUNNING|AFE_SUSPENDED)) == AFE_RUNNING) 2245 afe_reclaim(afep); 2246 mutex_exit(&afep->afe_xmtlock); 2247 2248 if (mii_m_getstat(afep->afe_mii, stat, val) == 0) { 2249 return (0); 2250 } 2251 switch (stat) { 2252 case MAC_STAT_MULTIRCV: 2253 *val = afep->afe_multircv; 2254 break; 2255 2256 case MAC_STAT_BRDCSTRCV: 2257 *val = afep->afe_brdcstrcv; 2258 break; 2259 2260 case MAC_STAT_MULTIXMT: 2261 *val = afep->afe_multixmt; 2262 break; 2263 2264 case MAC_STAT_BRDCSTXMT: 2265 *val = afep->afe_brdcstxmt; 2266 break; 2267 2268 case MAC_STAT_IPACKETS: 2269 *val = afep->afe_ipackets; 2270 break; 2271 2272 case MAC_STAT_RBYTES: 2273 *val = afep->afe_rbytes; 2274 break; 2275 2276 case MAC_STAT_OPACKETS: 2277 *val = afep->afe_opackets; 2278 break; 2279 2280 case MAC_STAT_OBYTES: 2281 *val = afep->afe_obytes; 2282 break; 2283 2284 case MAC_STAT_NORCVBUF: 2285 *val = afep->afe_norcvbuf; 2286 break; 2287 2288 case MAC_STAT_NOXMTBUF: 2289 *val = 0; 2290 break; 2291 2292 case MAC_STAT_COLLISIONS: 2293 *val = afep->afe_collisions; 2294 break; 2295 2296 case MAC_STAT_IERRORS: 2297 *val = afep->afe_errrcv; 2298 break; 2299 2300 case MAC_STAT_OERRORS: 2301 *val = afep->afe_errxmt; 2302 break; 2303 2304 case ETHER_STAT_ALIGN_ERRORS: 2305 *val = afep->afe_align_errors; 2306 break; 2307 2308 case ETHER_STAT_FCS_ERRORS: 2309 *val = afep->afe_fcs_errors; 2310 break; 2311 2312 case ETHER_STAT_SQE_ERRORS: 2313 *val = afep->afe_sqe_errors; 2314 break; 2315 2316 case ETHER_STAT_DEFER_XMTS: 2317 *val = afep->afe_defer_xmts; 2318 break; 2319 2320 case ETHER_STAT_FIRST_COLLISIONS: 2321 *val = afep->afe_first_collisions; 2322 break; 2323 2324 case ETHER_STAT_MULTI_COLLISIONS: 2325 *val = afep->afe_multi_collisions; 2326 break; 2327 2328 case ETHER_STAT_TX_LATE_COLLISIONS: 2329 *val = afep->afe_tx_late_collisions; 2330 break; 2331 2332 case ETHER_STAT_EX_COLLISIONS: 2333 *val = afep->afe_ex_collisions; 2334 break; 2335 2336 case ETHER_STAT_MACXMT_ERRORS: 2337 *val = afep->afe_macxmt_errors; 2338 break; 2339 2340 case ETHER_STAT_CARRIER_ERRORS: 2341 *val = afep->afe_carrier_errors; 2342 break; 2343 2344 case ETHER_STAT_TOOLONG_ERRORS: 2345 *val = afep->afe_toolong_errors; 2346 break; 2347 2348 case ETHER_STAT_MACRCV_ERRORS: 2349 *val = afep->afe_macrcv_errors; 2350 break; 2351 2352 case MAC_STAT_OVERFLOWS: 2353 *val = afep->afe_overflow; 2354 break; 2355 2356 case MAC_STAT_UNDERFLOWS: 2357 *val = afep->afe_underflow; 2358 break; 2359 2360 case ETHER_STAT_TOOSHORT_ERRORS: 2361 *val = afep->afe_runt; 2362 break; 2363 2364 case ETHER_STAT_JABBER_ERRORS: 2365 *val = afep->afe_jabber; 2366 break; 2367 2368 default: 2369 return (ENOTSUP); 2370 } 2371 return (0); 2372 } 2373 2374 int 2375 afe_m_getprop(void *arg, const char *name, mac_prop_id_t num, uint_t flags, 2376 uint_t sz, void *val, uint_t *perm) 2377 { 2378 afe_t *afep = arg; 2379 2380 return (mii_m_getprop(afep->afe_mii, name, num, flags, sz, val, perm)); 2381 } 2382 2383 int 2384 afe_m_setprop(void *arg, const char *name, mac_prop_id_t num, uint_t sz, 2385 const void *val) 2386 { 2387 afe_t *afep = arg; 2388 2389 return (mii_m_setprop(afep->afe_mii, name, num, sz, val)); 2390 } 2391 2392 /* 2393 * Debugging and error reporting. 2394 */ 2395 void 2396 afe_error(dev_info_t *dip, char *fmt, ...) 2397 { 2398 va_list ap; 2399 char buf[256]; 2400 2401 va_start(ap, fmt); 2402 (void) vsnprintf(buf, sizeof (buf), fmt, ap); 2403 va_end(ap); 2404 2405 if (dip) { 2406 cmn_err(CE_WARN, "%s%d: %s", 2407 ddi_driver_name(dip), ddi_get_instance(dip), buf); 2408 } else { 2409 cmn_err(CE_WARN, "afe: %s", buf); 2410 } 2411 } 2412