1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 27 #include <sys/types.h> 28 #include <sys/sunddi.h> 29 #include <sys/policy.h> 30 #include <sys/sdt.h> 31 #include "dmfe_impl.h" 32 33 /* 34 * This is the string displayed by modinfo, etc. 35 */ 36 static char dmfe_ident[] = "Davicom DM9102 Ethernet"; 37 38 39 /* 40 * NOTES: 41 * 42 * #defines: 43 * 44 * DMFE_PCI_RNUMBER is the register-set number to use for the operating 45 * registers. On an OBP-based machine, regset 0 refers to CONFIG space, 46 * regset 1 will be the operating registers in I/O space, and regset 2 47 * will be the operating registers in MEMORY space (preferred). If an 48 * expansion ROM is fitted, it may appear as a further register set. 49 * 50 * DMFE_SLOP defines the amount by which the chip may read beyond 51 * the end of a buffer or descriptor, apparently 6-8 dwords :( 52 * We have to make sure this doesn't cause it to access unallocated 53 * or unmapped memory. 54 * 55 * DMFE_BUF_SIZE must be at least (ETHERMAX + ETHERFCSL + DMFE_SLOP) 56 * rounded up to a multiple of 4. Here we choose a power of two for 57 * speed & simplicity at the cost of a bit more memory. 58 * 59 * However, the buffer length field in the TX/RX descriptors is only 60 * eleven bits, so even though we allocate DMFE_BUF_SIZE (2048) bytes 61 * per buffer, we tell the chip that they're only DMFE_BUF_SIZE_1 62 * (2000) bytes each. 63 * 64 * DMFE_DMA_MODE defines the mode (STREAMING/CONSISTENT) used for 65 * the data buffers. The descriptors are always set up in CONSISTENT 66 * mode. 67 * 68 * DMFE_HEADROOM defines how much space we'll leave in allocated 69 * mblks before the first valid data byte. This should be chosen 70 * to be 2 modulo 4, so that once the ethernet header (14 bytes) 71 * has been stripped off, the packet data will be 4-byte aligned. 72 * The remaining space can be used by upstream modules to prepend 73 * any headers required. 74 * 75 * Patchable globals: 76 * 77 * dmfe_bus_modes: the bus mode bits to be put into CSR0. 78 * Setting READ_MULTIPLE in this register seems to cause 79 * the chip to generate a READ LINE command with a parity 80 * error! Don't do it! 81 * 82 * dmfe_setup_desc1: the value to be put into descriptor word 1 83 * when sending a SETUP packet. 84 * 85 * Setting TX_LAST_DESC in desc1 in a setup packet seems 86 * to make the chip spontaneously reset internally - it 87 * attempts to give back the setup packet descriptor by 88 * writing to PCI address 00000000 - which may or may not 89 * get a MASTER ABORT - after which most of its registers 90 * seem to have either default values or garbage! 91 * 92 * TX_FIRST_DESC doesn't seem to have the same effect but 93 * it isn't needed on a setup packet so we'll leave it out 94 * too, just in case it has some other wierd side-effect. 95 * 96 * The default hardware packet filtering mode is now 97 * HASH_AND_PERFECT (imperfect filtering of multicast 98 * packets and perfect filtering of unicast packets). 99 * If this is found not to work reliably, setting the 100 * TX_FILTER_TYPE1 bit will cause a switchover to using 101 * HASH_ONLY mode (imperfect filtering of *all* packets). 102 * Software will then perform the additional filtering 103 * as required. 104 */ 105 106 #define DMFE_PCI_RNUMBER 2 107 #define DMFE_SLOP (8*sizeof (uint32_t)) 108 #define DMFE_BUF_SIZE 2048 109 #define DMFE_BUF_SIZE_1 2000 110 #define DMFE_DMA_MODE DDI_DMA_STREAMING 111 #define DMFE_HEADROOM 34 112 113 static uint32_t dmfe_bus_modes = TX_POLL_INTVL | CACHE_ALIGN; 114 static uint32_t dmfe_setup_desc1 = TX_SETUP_PACKET | SETUPBUF_SIZE | 115 TX_FILTER_TYPE0; 116 117 /* 118 * Some tunable parameters ... 119 * Number of RX/TX ring entries (128/128) 120 * Minimum number of TX ring slots to keep free (1) 121 * Low-water mark at which to try to reclaim TX ring slots (1) 122 * How often to take a TX-done interrupt (twice per ring cycle) 123 * Whether to reclaim TX ring entries on a TX-done interrupt (no) 124 */ 125 126 #define DMFE_TX_DESC 128 /* Should be a multiple of 4 <= 256 */ 127 #define DMFE_RX_DESC 128 /* Should be a multiple of 4 <= 256 */ 128 129 static uint32_t dmfe_rx_desc = DMFE_RX_DESC; 130 static uint32_t dmfe_tx_desc = DMFE_TX_DESC; 131 static uint32_t dmfe_tx_min_free = 1; 132 static uint32_t dmfe_tx_reclaim_level = 1; 133 static uint32_t dmfe_tx_int_factor = (DMFE_TX_DESC / 2) - 1; 134 static boolean_t dmfe_reclaim_on_done = B_FALSE; 135 136 /* 137 * Time-related parameters: 138 * 139 * We use a cyclic to provide a periodic callback; this is then used 140 * to check for TX-stall and poll the link status register. 141 * 142 * DMFE_TICK is the interval between cyclic callbacks, in microseconds. 143 * 144 * TX_STALL_TIME_100 is the timeout in microseconds between passing 145 * a packet to the chip for transmission and seeing that it's gone, 146 * when running at 100Mb/s. If we haven't reclaimed at least one 147 * descriptor in this time we assume the transmitter has stalled 148 * and reset the chip. 149 * 150 * TX_STALL_TIME_10 is the equivalent timeout when running at 10Mb/s. 151 * 152 * Patchable globals: 153 * 154 * dmfe_tick_us: DMFE_TICK 155 * dmfe_tx100_stall_us: TX_STALL_TIME_100 156 * dmfe_tx10_stall_us: TX_STALL_TIME_10 157 * 158 * These are then used in _init() to calculate: 159 * 160 * stall_100_tix[]: number of consecutive cyclic callbacks without a 161 * reclaim before the TX process is considered stalled, 162 * when running at 100Mb/s. The elements are indexed 163 * by transmit-engine-state. 164 * stall_10_tix[]: number of consecutive cyclic callbacks without a 165 * reclaim before the TX process is considered stalled, 166 * when running at 10Mb/s. The elements are indexed 167 * by transmit-engine-state. 168 */ 169 170 #define DMFE_TICK 25000 /* microseconds */ 171 #define TX_STALL_TIME_100 50000 /* microseconds */ 172 #define TX_STALL_TIME_10 200000 /* microseconds */ 173 174 static uint32_t dmfe_tick_us = DMFE_TICK; 175 static uint32_t dmfe_tx100_stall_us = TX_STALL_TIME_100; 176 static uint32_t dmfe_tx10_stall_us = TX_STALL_TIME_10; 177 178 /* 179 * Calculated from above in _init() 180 */ 181 182 static uint32_t stall_100_tix[TX_PROCESS_MAX_STATE+1]; 183 static uint32_t stall_10_tix[TX_PROCESS_MAX_STATE+1]; 184 185 /* 186 * Property names 187 */ 188 static char localmac_propname[] = "local-mac-address"; 189 static char opmode_propname[] = "opmode-reg-value"; 190 191 static int dmfe_m_start(void *); 192 static void dmfe_m_stop(void *); 193 static int dmfe_m_promisc(void *, boolean_t); 194 static int dmfe_m_multicst(void *, boolean_t, const uint8_t *); 195 static int dmfe_m_unicst(void *, const uint8_t *); 196 static void dmfe_m_ioctl(void *, queue_t *, mblk_t *); 197 static mblk_t *dmfe_m_tx(void *, mblk_t *); 198 static int dmfe_m_stat(void *, uint_t, uint64_t *); 199 static int dmfe_m_getprop(void *, const char *, mac_prop_id_t, 200 uint_t, void *); 201 static int dmfe_m_setprop(void *, const char *, mac_prop_id_t, 202 uint_t, const void *); 203 static void dmfe_m_propinfo(void *, const char *, mac_prop_id_t, 204 mac_prop_info_handle_t); 205 206 static mac_callbacks_t dmfe_m_callbacks = { 207 MC_IOCTL | MC_SETPROP | MC_GETPROP | MC_PROPINFO, 208 dmfe_m_stat, 209 dmfe_m_start, 210 dmfe_m_stop, 211 dmfe_m_promisc, 212 dmfe_m_multicst, 213 dmfe_m_unicst, 214 dmfe_m_tx, 215 NULL, 216 dmfe_m_ioctl, 217 NULL, /* getcapab */ 218 NULL, /* open */ 219 NULL, /* close */ 220 dmfe_m_setprop, 221 dmfe_m_getprop, 222 dmfe_m_propinfo 223 }; 224 225 226 /* 227 * Describes the chip's DMA engine 228 */ 229 static ddi_dma_attr_t dma_attr = { 230 DMA_ATTR_V0, /* dma_attr version */ 231 0, /* dma_attr_addr_lo */ 232 (uint32_t)0xFFFFFFFF, /* dma_attr_addr_hi */ 233 0x0FFFFFF, /* dma_attr_count_max */ 234 0x20, /* dma_attr_align */ 235 0x7F, /* dma_attr_burstsizes */ 236 1, /* dma_attr_minxfer */ 237 (uint32_t)0xFFFFFFFF, /* dma_attr_maxxfer */ 238 (uint32_t)0xFFFFFFFF, /* dma_attr_seg */ 239 1, /* dma_attr_sgllen */ 240 1, /* dma_attr_granular */ 241 0 /* dma_attr_flags */ 242 }; 243 244 /* 245 * DMA access attributes for registers and descriptors 246 */ 247 static ddi_device_acc_attr_t dmfe_reg_accattr = { 248 DDI_DEVICE_ATTR_V0, 249 DDI_STRUCTURE_LE_ACC, 250 DDI_STRICTORDER_ACC 251 }; 252 253 /* 254 * DMA access attributes for data: NOT to be byte swapped. 255 */ 256 static ddi_device_acc_attr_t dmfe_data_accattr = { 257 DDI_DEVICE_ATTR_V0, 258 DDI_NEVERSWAP_ACC, 259 DDI_STRICTORDER_ACC 260 }; 261 262 static uchar_t dmfe_broadcast_addr[ETHERADDRL] = { 263 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 264 }; 265 266 267 /* 268 * ========== Lowest-level chip register & ring access routines ========== 269 */ 270 271 /* 272 * I/O register get/put routines 273 */ 274 uint32_t 275 dmfe_chip_get32(dmfe_t *dmfep, off_t offset) 276 { 277 uint32_t *addr; 278 279 addr = (void *)(dmfep->io_reg + offset); 280 return (ddi_get32(dmfep->io_handle, addr)); 281 } 282 283 void 284 dmfe_chip_put32(dmfe_t *dmfep, off_t offset, uint32_t value) 285 { 286 uint32_t *addr; 287 288 addr = (void *)(dmfep->io_reg + offset); 289 ddi_put32(dmfep->io_handle, addr, value); 290 } 291 292 /* 293 * TX/RX ring get/put routines 294 */ 295 static uint32_t 296 dmfe_ring_get32(dma_area_t *dma_p, uint_t index, uint_t offset) 297 { 298 uint32_t *addr; 299 300 addr = (void *)dma_p->mem_va; 301 return (ddi_get32(dma_p->acc_hdl, addr + index*DESC_SIZE + offset)); 302 } 303 304 static void 305 dmfe_ring_put32(dma_area_t *dma_p, uint_t index, uint_t offset, uint32_t value) 306 { 307 uint32_t *addr; 308 309 addr = (void *)dma_p->mem_va; 310 ddi_put32(dma_p->acc_hdl, addr + index*DESC_SIZE + offset, value); 311 } 312 313 /* 314 * Setup buffer get/put routines 315 */ 316 static uint32_t 317 dmfe_setup_get32(dma_area_t *dma_p, uint_t index) 318 { 319 uint32_t *addr; 320 321 addr = (void *)dma_p->setup_va; 322 return (ddi_get32(dma_p->acc_hdl, addr + index)); 323 } 324 325 static void 326 dmfe_setup_put32(dma_area_t *dma_p, uint_t index, uint32_t value) 327 { 328 uint32_t *addr; 329 330 addr = (void *)dma_p->setup_va; 331 ddi_put32(dma_p->acc_hdl, addr + index, value); 332 } 333 334 335 /* 336 * ========== Low-level chip & ring buffer manipulation ========== 337 */ 338 339 /* 340 * dmfe_set_opmode() -- function to set operating mode 341 */ 342 static void 343 dmfe_set_opmode(dmfe_t *dmfep) 344 { 345 ASSERT(mutex_owned(dmfep->oplock)); 346 347 dmfe_chip_put32(dmfep, OPN_MODE_REG, dmfep->opmode); 348 drv_usecwait(10); 349 } 350 351 /* 352 * dmfe_stop_chip() -- stop all chip processing & optionally reset the h/w 353 */ 354 static void 355 dmfe_stop_chip(dmfe_t *dmfep, enum chip_state newstate) 356 { 357 ASSERT(mutex_owned(dmfep->oplock)); 358 359 /* 360 * Stop the chip: 361 * disable all interrupts 362 * stop TX/RX processes 363 * clear the status bits for TX/RX stopped 364 * If required, reset the chip 365 * Record the new state 366 */ 367 dmfe_chip_put32(dmfep, INT_MASK_REG, 0); 368 dmfep->opmode &= ~(START_TRANSMIT | START_RECEIVE); 369 dmfe_set_opmode(dmfep); 370 dmfe_chip_put32(dmfep, STATUS_REG, TX_STOPPED_INT | RX_STOPPED_INT); 371 372 switch (newstate) { 373 default: 374 ASSERT(!"can't get here"); 375 return; 376 377 case CHIP_STOPPED: 378 case CHIP_ERROR: 379 break; 380 381 case CHIP_RESET: 382 dmfe_chip_put32(dmfep, BUS_MODE_REG, SW_RESET); 383 drv_usecwait(10); 384 dmfe_chip_put32(dmfep, BUS_MODE_REG, 0); 385 drv_usecwait(10); 386 dmfe_chip_put32(dmfep, BUS_MODE_REG, dmfe_bus_modes); 387 break; 388 } 389 390 dmfep->chip_state = newstate; 391 } 392 393 /* 394 * Initialize transmit and receive descriptor rings, and 395 * set the chip to point to the first entry in each ring 396 */ 397 static void 398 dmfe_init_rings(dmfe_t *dmfep) 399 { 400 dma_area_t *descp; 401 uint32_t pstart; 402 uint32_t pnext; 403 uint32_t pbuff; 404 uint32_t desc1; 405 int i; 406 407 /* 408 * You need all the locks in order to rewrite the descriptor rings 409 */ 410 ASSERT(mutex_owned(dmfep->oplock)); 411 ASSERT(mutex_owned(dmfep->rxlock)); 412 ASSERT(mutex_owned(dmfep->txlock)); 413 414 /* 415 * Program the RX ring entries 416 */ 417 descp = &dmfep->rx_desc; 418 pstart = descp->mem_dvma; 419 pnext = pstart + sizeof (struct rx_desc_type); 420 pbuff = dmfep->rx_buff.mem_dvma; 421 desc1 = RX_CHAINING | DMFE_BUF_SIZE_1; 422 423 for (i = 0; i < dmfep->rx.n_desc; ++i) { 424 dmfe_ring_put32(descp, i, RD_NEXT, pnext); 425 dmfe_ring_put32(descp, i, BUFFER1, pbuff); 426 dmfe_ring_put32(descp, i, DESC1, desc1); 427 dmfe_ring_put32(descp, i, DESC0, RX_OWN); 428 429 pnext += sizeof (struct rx_desc_type); 430 pbuff += DMFE_BUF_SIZE; 431 } 432 433 /* 434 * Fix up last entry & sync 435 */ 436 dmfe_ring_put32(descp, --i, RD_NEXT, pstart); 437 DMA_SYNC(descp, DDI_DMA_SYNC_FORDEV); 438 dmfep->rx.next_free = 0; 439 440 /* 441 * Set the base address of the RX descriptor list in CSR3 442 */ 443 dmfe_chip_put32(dmfep, RX_BASE_ADDR_REG, descp->mem_dvma); 444 445 /* 446 * Program the TX ring entries 447 */ 448 descp = &dmfep->tx_desc; 449 pstart = descp->mem_dvma; 450 pnext = pstart + sizeof (struct tx_desc_type); 451 pbuff = dmfep->tx_buff.mem_dvma; 452 desc1 = TX_CHAINING; 453 454 for (i = 0; i < dmfep->tx.n_desc; ++i) { 455 dmfe_ring_put32(descp, i, TD_NEXT, pnext); 456 dmfe_ring_put32(descp, i, BUFFER1, pbuff); 457 dmfe_ring_put32(descp, i, DESC1, desc1); 458 dmfe_ring_put32(descp, i, DESC0, 0); 459 460 pnext += sizeof (struct tx_desc_type); 461 pbuff += DMFE_BUF_SIZE; 462 } 463 464 /* 465 * Fix up last entry & sync 466 */ 467 dmfe_ring_put32(descp, --i, TD_NEXT, pstart); 468 DMA_SYNC(descp, DDI_DMA_SYNC_FORDEV); 469 dmfep->tx.n_free = dmfep->tx.n_desc; 470 dmfep->tx.next_free = dmfep->tx.next_busy = 0; 471 472 /* 473 * Set the base address of the TX descrptor list in CSR4 474 */ 475 dmfe_chip_put32(dmfep, TX_BASE_ADDR_REG, descp->mem_dvma); 476 } 477 478 /* 479 * dmfe_start_chip() -- start the chip transmitting and/or receiving 480 */ 481 static void 482 dmfe_start_chip(dmfe_t *dmfep, int mode) 483 { 484 ASSERT(mutex_owned(dmfep->oplock)); 485 486 dmfep->opmode |= mode; 487 dmfe_set_opmode(dmfep); 488 489 dmfe_chip_put32(dmfep, W_J_TIMER_REG, 0); 490 /* 491 * Enable VLAN length mode (allows packets to be 4 bytes Longer). 492 */ 493 dmfe_chip_put32(dmfep, W_J_TIMER_REG, VLAN_ENABLE); 494 495 /* 496 * Clear any pending process-stopped interrupts 497 */ 498 dmfe_chip_put32(dmfep, STATUS_REG, TX_STOPPED_INT | RX_STOPPED_INT); 499 dmfep->chip_state = mode & START_RECEIVE ? CHIP_TX_RX : 500 mode & START_TRANSMIT ? CHIP_TX_ONLY : CHIP_STOPPED; 501 } 502 503 /* 504 * dmfe_enable_interrupts() -- enable our favourite set of interrupts. 505 * 506 * Normal interrupts: 507 * We always enable: 508 * RX_PKTDONE_INT (packet received) 509 * TX_PKTDONE_INT (TX complete) 510 * We never enable: 511 * TX_ALLDONE_INT (next TX buffer not ready) 512 * 513 * Abnormal interrupts: 514 * We always enable: 515 * RX_STOPPED_INT 516 * TX_STOPPED_INT 517 * SYSTEM_ERR_INT 518 * RX_UNAVAIL_INT 519 * We never enable: 520 * RX_EARLY_INT 521 * RX_WATCHDOG_INT 522 * TX_JABBER_INT 523 * TX_EARLY_INT 524 * TX_UNDERFLOW_INT 525 * GP_TIMER_INT (not valid in -9 chips) 526 * LINK_STATUS_INT (not valid in -9 chips) 527 */ 528 static void 529 dmfe_enable_interrupts(dmfe_t *dmfep) 530 { 531 ASSERT(mutex_owned(dmfep->oplock)); 532 533 /* 534 * Put 'the standard set of interrupts' in the interrupt mask register 535 */ 536 dmfep->imask = RX_PKTDONE_INT | TX_PKTDONE_INT | 537 RX_STOPPED_INT | TX_STOPPED_INT | RX_UNAVAIL_INT | SYSTEM_ERR_INT; 538 539 dmfe_chip_put32(dmfep, INT_MASK_REG, 540 NORMAL_SUMMARY_INT | ABNORMAL_SUMMARY_INT | dmfep->imask); 541 dmfep->chip_state = CHIP_RUNNING; 542 } 543 544 /* 545 * ========== RX side routines ========== 546 */ 547 548 /* 549 * Function to update receive statistics on various errors 550 */ 551 static void 552 dmfe_update_rx_stats(dmfe_t *dmfep, uint32_t desc0) 553 { 554 ASSERT(mutex_owned(dmfep->rxlock)); 555 556 /* 557 * The error summary bit and the error bits that it summarises 558 * are only valid if this is the last fragment. Therefore, a 559 * fragment only contributes to the error statistics if both 560 * the last-fragment and error summary bits are set. 561 */ 562 if (((RX_LAST_DESC | RX_ERR_SUMMARY) & ~desc0) == 0) { 563 dmfep->rx_stats_ierrors += 1; 564 565 /* 566 * There are some other error bits in the descriptor for 567 * which there don't seem to be appropriate MAC statistics, 568 * notably RX_COLLISION and perhaps RX_DESC_ERR. The 569 * latter may not be possible if it is supposed to indicate 570 * that one buffer has been filled with a partial packet 571 * and the next buffer required for the rest of the packet 572 * was not available, as all our buffers are more than large 573 * enough for a whole packet without fragmenting. 574 */ 575 576 if (desc0 & RX_OVERFLOW) { 577 dmfep->rx_stats_overflow += 1; 578 579 } else if (desc0 & RX_RUNT_FRAME) 580 dmfep->rx_stats_short += 1; 581 582 if (desc0 & RX_CRC) 583 dmfep->rx_stats_fcs += 1; 584 585 if (desc0 & RX_FRAME2LONG) 586 dmfep->rx_stats_toolong += 1; 587 } 588 589 /* 590 * A receive watchdog timeout is counted as a MAC-level receive 591 * error. Strangely, it doesn't set the packet error summary bit, 592 * according to the chip data sheet :-? 593 */ 594 if (desc0 & RX_RCV_WD_TO) 595 dmfep->rx_stats_macrcv_errors += 1; 596 597 if (desc0 & RX_DRIBBLING) 598 dmfep->rx_stats_align += 1; 599 600 if (desc0 & RX_MII_ERR) 601 dmfep->rx_stats_macrcv_errors += 1; 602 } 603 604 /* 605 * Receive incoming packet(s) and pass them up ... 606 */ 607 static mblk_t * 608 dmfe_getp(dmfe_t *dmfep) 609 { 610 dma_area_t *descp; 611 mblk_t **tail; 612 mblk_t *head; 613 mblk_t *mp; 614 char *rxb; 615 uchar_t *dp; 616 uint32_t desc0; 617 uint32_t misses; 618 int packet_length; 619 int index; 620 621 mutex_enter(dmfep->rxlock); 622 623 /* 624 * Update the missed frame statistic from the on-chip counter. 625 */ 626 misses = dmfe_chip_get32(dmfep, MISSED_FRAME_REG); 627 dmfep->rx_stats_norcvbuf += (misses & MISSED_FRAME_MASK); 628 629 /* 630 * sync (all) receive descriptors before inspecting them 631 */ 632 descp = &dmfep->rx_desc; 633 DMA_SYNC(descp, DDI_DMA_SYNC_FORKERNEL); 634 635 /* 636 * We should own at least one RX entry, since we've had a 637 * receive interrupt, but let's not be dogmatic about it. 638 */ 639 index = dmfep->rx.next_free; 640 desc0 = dmfe_ring_get32(descp, index, DESC0); 641 642 DTRACE_PROBE1(rx__start, uint32_t, desc0); 643 for (head = NULL, tail = &head; (desc0 & RX_OWN) == 0; ) { 644 /* 645 * Maintain statistics for every descriptor returned 646 * to us by the chip ... 647 */ 648 dmfe_update_rx_stats(dmfep, desc0); 649 650 /* 651 * Check that the entry has both "packet start" and 652 * "packet end" flags. We really shouldn't get packet 653 * fragments, 'cos all the RX buffers are bigger than 654 * the largest valid packet. So we'll just drop any 655 * fragments we find & skip on to the next entry. 656 */ 657 if (((RX_FIRST_DESC | RX_LAST_DESC) & ~desc0) != 0) { 658 DTRACE_PROBE1(rx__frag, uint32_t, desc0); 659 goto skip; 660 } 661 662 /* 663 * A whole packet in one buffer. We have to check error 664 * status and packet length before forwarding it upstream. 665 */ 666 if (desc0 & RX_ERR_SUMMARY) { 667 DTRACE_PROBE1(rx__err, uint32_t, desc0); 668 goto skip; 669 } 670 671 packet_length = (desc0 >> 16) & 0x3fff; 672 if (packet_length > DMFE_MAX_PKT_SIZE) { 673 DTRACE_PROBE1(rx__toobig, int, packet_length); 674 goto skip; 675 } else if (packet_length < ETHERMIN) { 676 /* 677 * Note that VLAN packet would be even larger, 678 * but we don't worry about dropping runt VLAN 679 * frames. 680 * 681 * This check is probably redundant, as well, 682 * since the hardware should drop RUNT frames. 683 */ 684 DTRACE_PROBE1(rx__runt, int, packet_length); 685 goto skip; 686 } 687 688 /* 689 * Sync the data, so we can examine it; then check that 690 * the packet is really intended for us (remember that 691 * if we're using Imperfect Filtering, then the chip will 692 * receive unicast packets sent to stations whose addresses 693 * just happen to hash to the same value as our own; we 694 * discard these here so they don't get sent upstream ...) 695 */ 696 (void) ddi_dma_sync(dmfep->rx_buff.dma_hdl, 697 index * DMFE_BUF_SIZE, DMFE_BUF_SIZE, 698 DDI_DMA_SYNC_FORKERNEL); 699 rxb = &dmfep->rx_buff.mem_va[index*DMFE_BUF_SIZE]; 700 701 702 /* 703 * We do not bother to check that the packet is really for 704 * us, we let the MAC framework make that check instead. 705 * This is especially important if we ever want to support 706 * multiple MAC addresses. 707 */ 708 709 /* 710 * Packet looks good; get a buffer to copy it into. We 711 * allow some space at the front of the allocated buffer 712 * (HEADROOM) in case any upstream modules want to prepend 713 * some sort of header. The value has been carefully chosen 714 * So that it also has the side-effect of making the packet 715 * *contents* 4-byte aligned, as required by NCA! 716 */ 717 mp = allocb(DMFE_HEADROOM + packet_length, 0); 718 if (mp == NULL) { 719 DTRACE_PROBE(rx__no__buf); 720 dmfep->rx_stats_norcvbuf += 1; 721 goto skip; 722 } 723 724 /* 725 * Account for statistics of good packets. 726 */ 727 dmfep->rx_stats_ipackets += 1; 728 dmfep->rx_stats_rbytes += packet_length; 729 if (desc0 & RX_MULTI_FRAME) { 730 if (bcmp(rxb, dmfe_broadcast_addr, ETHERADDRL)) { 731 dmfep->rx_stats_multi += 1; 732 } else { 733 dmfep->rx_stats_bcast += 1; 734 } 735 } 736 737 /* 738 * Copy the packet into the STREAMS buffer 739 */ 740 dp = mp->b_rptr += DMFE_HEADROOM; 741 mp->b_cont = mp->b_next = NULL; 742 743 /* 744 * Don't worry about stripping the vlan tag, the MAC 745 * layer will take care of that for us. 746 */ 747 bcopy(rxb, dp, packet_length); 748 749 /* 750 * Fix up the packet length, and link it to the chain 751 */ 752 mp->b_wptr = mp->b_rptr + packet_length - ETHERFCSL; 753 *tail = mp; 754 tail = &mp->b_next; 755 756 skip: 757 /* 758 * Return ownership of ring entry & advance to next 759 */ 760 dmfe_ring_put32(descp, index, DESC0, RX_OWN); 761 index = NEXT(index, dmfep->rx.n_desc); 762 desc0 = dmfe_ring_get32(descp, index, DESC0); 763 } 764 765 /* 766 * Remember where to start looking next time ... 767 */ 768 dmfep->rx.next_free = index; 769 770 /* 771 * sync the receive descriptors that we've given back 772 * (actually, we sync all of them for simplicity), and 773 * wake the chip in case it had suspended receive 774 */ 775 DMA_SYNC(descp, DDI_DMA_SYNC_FORDEV); 776 dmfe_chip_put32(dmfep, RX_POLL_REG, 0); 777 778 mutex_exit(dmfep->rxlock); 779 return (head); 780 } 781 782 /* 783 * ========== Primary TX side routines ========== 784 */ 785 786 /* 787 * TX ring management: 788 * 789 * There are <tx.n_desc> entries in the ring, of which those from 790 * <tx.next_free> round to but not including <tx.next_busy> must 791 * be owned by the CPU. The number of such entries should equal 792 * <tx.n_free>; but there may also be some more entries which the 793 * chip has given back but which we haven't yet accounted for. 794 * The routine dmfe_reclaim_tx_desc() adjusts the indexes & counts 795 * as it discovers such entries. 796 * 797 * Initially, or when the ring is entirely free: 798 * C = Owned by CPU 799 * D = Owned by Davicom (DMFE) chip 800 * 801 * tx.next_free tx.n_desc = 16 802 * | 803 * v 804 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 805 * | C | C | C | C | C | C | C | C | C | C | C | C | C | C | C | C | 806 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 807 * ^ 808 * | 809 * tx.next_busy tx.n_free = 16 810 * 811 * On entry to reclaim() during normal use: 812 * 813 * tx.next_free tx.n_desc = 16 814 * | 815 * v 816 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 817 * | C | C | C | C | C | C | D | D | D | C | C | C | C | C | C | C | 818 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 819 * ^ 820 * | 821 * tx.next_busy tx.n_free = 9 822 * 823 * On exit from reclaim(): 824 * 825 * tx.next_free tx.n_desc = 16 826 * | 827 * v 828 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 829 * | C | C | C | C | C | C | D | D | D | C | C | C | C | C | C | C | 830 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 831 * ^ 832 * | 833 * tx.next_busy tx.n_free = 13 834 * 835 * The ring is considered "full" when only one entry is owned by 836 * the CPU; thus <tx.n_free> should always be >= 1. 837 * 838 * tx.next_free tx.n_desc = 16 839 * | 840 * v 841 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 842 * | D | D | D | D | D | C | D | D | D | D | D | D | D | D | D | D | 843 * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 844 * ^ 845 * | 846 * tx.next_busy tx.n_free = 1 847 */ 848 849 /* 850 * Function to update transmit statistics on various errors 851 */ 852 static void 853 dmfe_update_tx_stats(dmfe_t *dmfep, int index, uint32_t desc0, uint32_t desc1) 854 { 855 uint32_t collisions; 856 uint32_t errbits; 857 uint32_t errsum; 858 859 ASSERT(mutex_owned(dmfep->txlock)); 860 861 collisions = ((desc0 >> 3) & 0x0f); 862 errsum = desc0 & TX_ERR_SUMMARY; 863 errbits = desc0 & (TX_UNDERFLOW | TX_LATE_COLL | TX_CARRIER_LOSS | 864 TX_NO_CARRIER | TX_EXCESS_COLL | TX_JABBER_TO); 865 if ((errsum == 0) != (errbits == 0)) { 866 dmfe_log(dmfep, "dubious TX error status 0x%x", desc0); 867 desc0 |= TX_ERR_SUMMARY; 868 } 869 870 if (desc0 & TX_ERR_SUMMARY) { 871 dmfep->tx_stats_oerrors += 1; 872 873 /* 874 * If we ever see a transmit jabber timeout, we count it 875 * as a MAC-level transmit error; but we probably won't 876 * see it as it causes an Abnormal interrupt and we reset 877 * the chip in order to recover 878 */ 879 if (desc0 & TX_JABBER_TO) { 880 dmfep->tx_stats_macxmt_errors += 1; 881 dmfep->tx_stats_jabber += 1; 882 } 883 884 if (desc0 & TX_UNDERFLOW) 885 dmfep->tx_stats_underflow += 1; 886 else if (desc0 & TX_LATE_COLL) 887 dmfep->tx_stats_xmtlatecoll += 1; 888 889 if (desc0 & (TX_CARRIER_LOSS | TX_NO_CARRIER)) 890 dmfep->tx_stats_nocarrier += 1; 891 892 if (desc0 & TX_EXCESS_COLL) { 893 dmfep->tx_stats_excoll += 1; 894 collisions = 16; 895 } 896 } else { 897 int bit = index % NBBY; 898 int byt = index / NBBY; 899 900 if (dmfep->tx_mcast[byt] & bit) { 901 dmfep->tx_mcast[byt] &= ~bit; 902 dmfep->tx_stats_multi += 1; 903 904 } else if (dmfep->tx_bcast[byt] & bit) { 905 dmfep->tx_bcast[byt] &= ~bit; 906 dmfep->tx_stats_bcast += 1; 907 } 908 909 dmfep->tx_stats_opackets += 1; 910 dmfep->tx_stats_obytes += desc1 & TX_BUFFER_SIZE1; 911 } 912 913 if (collisions == 1) 914 dmfep->tx_stats_first_coll += 1; 915 else if (collisions != 0) 916 dmfep->tx_stats_multi_coll += 1; 917 dmfep->tx_stats_collisions += collisions; 918 919 if (desc0 & TX_DEFERRED) 920 dmfep->tx_stats_defer += 1; 921 } 922 923 /* 924 * Reclaim all the ring entries that the chip has returned to us ... 925 * 926 * Returns B_FALSE if no entries could be reclaimed. Otherwise, reclaims 927 * as many as possible, restarts the TX stall timeout, and returns B_TRUE. 928 */ 929 static boolean_t 930 dmfe_reclaim_tx_desc(dmfe_t *dmfep) 931 { 932 dma_area_t *descp; 933 uint32_t desc0; 934 uint32_t desc1; 935 int i; 936 937 ASSERT(mutex_owned(dmfep->txlock)); 938 939 /* 940 * sync transmit descriptor ring before looking at it 941 */ 942 descp = &dmfep->tx_desc; 943 DMA_SYNC(descp, DDI_DMA_SYNC_FORKERNEL); 944 945 /* 946 * Early exit if there are no descriptors to reclaim, either 947 * because they're all reclaimed already, or because the next 948 * one is still owned by the chip ... 949 */ 950 i = dmfep->tx.next_busy; 951 if (i == dmfep->tx.next_free) 952 return (B_FALSE); 953 desc0 = dmfe_ring_get32(descp, i, DESC0); 954 if (desc0 & TX_OWN) 955 return (B_FALSE); 956 957 /* 958 * Reclaim as many descriptors as possible ... 959 */ 960 for (;;) { 961 desc1 = dmfe_ring_get32(descp, i, DESC1); 962 ASSERT((desc1 & (TX_SETUP_PACKET | TX_LAST_DESC)) != 0); 963 964 if ((desc1 & TX_SETUP_PACKET) == 0) { 965 /* 966 * Regular packet - just update stats 967 */ 968 dmfe_update_tx_stats(dmfep, i, desc0, desc1); 969 } 970 971 /* 972 * Update count & index; we're all done if the ring is 973 * now fully reclaimed, or the next entry if still owned 974 * by the chip ... 975 */ 976 dmfep->tx.n_free += 1; 977 i = NEXT(i, dmfep->tx.n_desc); 978 if (i == dmfep->tx.next_free) 979 break; 980 desc0 = dmfe_ring_get32(descp, i, DESC0); 981 if (desc0 & TX_OWN) 982 break; 983 } 984 985 dmfep->tx.next_busy = i; 986 dmfep->tx_pending_tix = 0; 987 return (B_TRUE); 988 } 989 990 /* 991 * Send the message in the message block chain <mp>. 992 * 993 * The message is freed if and only if its contents are successfully copied 994 * and queued for transmission (so that the return value is B_TRUE). 995 * If we can't queue the message, the return value is B_FALSE and 996 * the message is *not* freed. 997 * 998 * This routine handles the special case of <mp> == NULL, which indicates 999 * that we want to "send" the special "setup packet" allocated during 1000 * startup. We have to use some different flags in the packet descriptor 1001 * to say its a setup packet (from the global <dmfe_setup_desc1>), and the 1002 * setup packet *isn't* freed after use. 1003 */ 1004 static boolean_t 1005 dmfe_send_msg(dmfe_t *dmfep, mblk_t *mp) 1006 { 1007 dma_area_t *descp; 1008 mblk_t *bp; 1009 char *txb; 1010 uint32_t desc1; 1011 uint32_t index; 1012 size_t totlen; 1013 size_t mblen; 1014 uint32_t paddr; 1015 1016 /* 1017 * If the number of free slots is below the reclaim threshold 1018 * (soft limit), we'll try to reclaim some. If we fail, and 1019 * the number of free slots is also below the minimum required 1020 * (the hard limit, usually 1), then we can't send the packet. 1021 */ 1022 mutex_enter(dmfep->txlock); 1023 if (dmfep->suspended) 1024 return (B_FALSE); 1025 1026 if (dmfep->tx.n_free <= dmfe_tx_reclaim_level && 1027 dmfe_reclaim_tx_desc(dmfep) == B_FALSE && 1028 dmfep->tx.n_free <= dmfe_tx_min_free) { 1029 /* 1030 * Resource shortage - return B_FALSE so the packet 1031 * will be queued for retry after the next TX-done 1032 * interrupt. 1033 */ 1034 mutex_exit(dmfep->txlock); 1035 DTRACE_PROBE(tx__no__desc); 1036 return (B_FALSE); 1037 } 1038 1039 /* 1040 * There's a slot available, so claim it by incrementing 1041 * the next-free index and decrementing the free count. 1042 * If the ring is currently empty, we also restart the 1043 * stall-detect timer. The ASSERTions check that our 1044 * invariants still hold: 1045 * the next-free index must not match the next-busy index 1046 * there must still be at least one free entry 1047 * After this, we now have exclusive ownership of the ring 1048 * entry (and matching buffer) indicated by <index>, so we 1049 * don't need to hold the TX lock any longer 1050 */ 1051 index = dmfep->tx.next_free; 1052 dmfep->tx.next_free = NEXT(index, dmfep->tx.n_desc); 1053 ASSERT(dmfep->tx.next_free != dmfep->tx.next_busy); 1054 if (dmfep->tx.n_free-- == dmfep->tx.n_desc) 1055 dmfep->tx_pending_tix = 0; 1056 ASSERT(dmfep->tx.n_free >= 1); 1057 mutex_exit(dmfep->txlock); 1058 1059 /* 1060 * Check the ownership of the ring entry ... 1061 */ 1062 descp = &dmfep->tx_desc; 1063 ASSERT((dmfe_ring_get32(descp, index, DESC0) & TX_OWN) == 0); 1064 1065 if (mp == NULL) { 1066 /* 1067 * Indicates we should send a SETUP packet, which we do by 1068 * temporarily switching the BUFFER1 pointer in the ring 1069 * entry. The reclaim routine will restore BUFFER1 to its 1070 * usual value. 1071 * 1072 * Note that as the setup packet is tagged on the end of 1073 * the TX ring, when we sync the descriptor we're also 1074 * implicitly syncing the setup packet - hence, we don't 1075 * need a separate ddi_dma_sync() call here. 1076 */ 1077 desc1 = dmfe_setup_desc1; 1078 paddr = descp->setup_dvma; 1079 } else { 1080 /* 1081 * A regular packet; we copy the data into a pre-mapped 1082 * buffer, which avoids the overhead (and complication) 1083 * of mapping/unmapping STREAMS buffers and keeping hold 1084 * of them until the DMA has completed. 1085 * 1086 * Because all buffers are the same size, and larger 1087 * than the longest single valid message, we don't have 1088 * to bother about splitting the message across multiple 1089 * buffers. 1090 */ 1091 txb = &dmfep->tx_buff.mem_va[index*DMFE_BUF_SIZE]; 1092 totlen = 0; 1093 bp = mp; 1094 1095 /* 1096 * Copy all (remaining) mblks in the message ... 1097 */ 1098 for (; bp != NULL; bp = bp->b_cont) { 1099 mblen = MBLKL(bp); 1100 if ((totlen += mblen) <= DMFE_MAX_PKT_SIZE) { 1101 bcopy(bp->b_rptr, txb, mblen); 1102 txb += mblen; 1103 } 1104 } 1105 1106 /* 1107 * Is this a multicast or broadcast packet? We do 1108 * this so that we can track statistics accurately 1109 * when we reclaim it. 1110 */ 1111 txb = &dmfep->tx_buff.mem_va[index*DMFE_BUF_SIZE]; 1112 if (txb[0] & 0x1) { 1113 if (bcmp(txb, dmfe_broadcast_addr, ETHERADDRL) == 0) { 1114 dmfep->tx_bcast[index / NBBY] |= 1115 (1 << (index % NBBY)); 1116 } else { 1117 dmfep->tx_mcast[index / NBBY] |= 1118 (1 << (index % NBBY)); 1119 } 1120 } 1121 1122 /* 1123 * We'e reached the end of the chain; and we should have 1124 * collected no more than DMFE_MAX_PKT_SIZE bytes into our 1125 * buffer. Note that the <size> field in the descriptor is 1126 * only 11 bits, so bigger packets would be a problem! 1127 */ 1128 ASSERT(bp == NULL); 1129 ASSERT(totlen <= DMFE_MAX_PKT_SIZE); 1130 totlen &= TX_BUFFER_SIZE1; 1131 desc1 = TX_FIRST_DESC | TX_LAST_DESC | totlen; 1132 paddr = dmfep->tx_buff.mem_dvma + index*DMFE_BUF_SIZE; 1133 1134 (void) ddi_dma_sync(dmfep->tx_buff.dma_hdl, 1135 index * DMFE_BUF_SIZE, DMFE_BUF_SIZE, DDI_DMA_SYNC_FORDEV); 1136 } 1137 1138 /* 1139 * Update ring descriptor entries, sync them, and wake up the 1140 * transmit process 1141 */ 1142 if ((index & dmfe_tx_int_factor) == 0) 1143 desc1 |= TX_INT_ON_COMP; 1144 desc1 |= TX_CHAINING; 1145 dmfe_ring_put32(descp, index, BUFFER1, paddr); 1146 dmfe_ring_put32(descp, index, DESC1, desc1); 1147 dmfe_ring_put32(descp, index, DESC0, TX_OWN); 1148 DMA_SYNC(descp, DDI_DMA_SYNC_FORDEV); 1149 dmfe_chip_put32(dmfep, TX_POLL_REG, 0); 1150 1151 /* 1152 * Finally, free the message & return success 1153 */ 1154 if (mp) 1155 freemsg(mp); 1156 return (B_TRUE); 1157 } 1158 1159 /* 1160 * dmfe_m_tx() -- send a chain of packets 1161 * 1162 * Called when packet(s) are ready to be transmitted. A pointer to an 1163 * M_DATA message that contains the packet is passed to this routine. 1164 * The complete LLC header is contained in the message's first message 1165 * block, and the remainder of the packet is contained within 1166 * additional M_DATA message blocks linked to the first message block. 1167 * 1168 * Additional messages may be passed by linking with b_next. 1169 */ 1170 static mblk_t * 1171 dmfe_m_tx(void *arg, mblk_t *mp) 1172 { 1173 dmfe_t *dmfep = arg; /* private device info */ 1174 mblk_t *next; 1175 1176 ASSERT(mp != NULL); 1177 ASSERT(dmfep->mac_state == DMFE_MAC_STARTED); 1178 1179 if (dmfep->chip_state != CHIP_RUNNING) 1180 return (mp); 1181 1182 while (mp != NULL) { 1183 next = mp->b_next; 1184 mp->b_next = NULL; 1185 if (!dmfe_send_msg(dmfep, mp)) { 1186 mp->b_next = next; 1187 break; 1188 } 1189 mp = next; 1190 } 1191 1192 return (mp); 1193 } 1194 1195 /* 1196 * ========== Address-setting routines (TX-side) ========== 1197 */ 1198 1199 /* 1200 * Find the index of the relevant bit in the setup packet. 1201 * This must mirror the way the hardware will actually calculate it! 1202 */ 1203 static uint32_t 1204 dmfe_hash_index(const uint8_t *address) 1205 { 1206 uint32_t const POLY = HASH_POLY; 1207 uint32_t crc = HASH_CRC; 1208 uint32_t index; 1209 uint32_t msb; 1210 uchar_t currentbyte; 1211 int byteslength; 1212 int shift; 1213 int bit; 1214 1215 for (byteslength = 0; byteslength < ETHERADDRL; ++byteslength) { 1216 currentbyte = address[byteslength]; 1217 for (bit = 0; bit < 8; ++bit) { 1218 msb = crc >> 31; 1219 crc <<= 1; 1220 if (msb ^ (currentbyte & 1)) { 1221 crc ^= POLY; 1222 crc |= 0x00000001; 1223 } 1224 currentbyte >>= 1; 1225 } 1226 } 1227 1228 for (index = 0, bit = 23, shift = 8; shift >= 0; ++bit, --shift) 1229 index |= (((crc >> bit) & 1) << shift); 1230 1231 return (index); 1232 } 1233 1234 /* 1235 * Find and set/clear the relevant bit in the setup packet hash table 1236 * This must mirror the way the hardware will actually interpret it! 1237 */ 1238 static void 1239 dmfe_update_hash(dmfe_t *dmfep, uint32_t index, boolean_t val) 1240 { 1241 dma_area_t *descp; 1242 uint32_t tmp; 1243 1244 ASSERT(mutex_owned(dmfep->oplock)); 1245 1246 descp = &dmfep->tx_desc; 1247 tmp = dmfe_setup_get32(descp, index/16); 1248 if (val) 1249 tmp |= 1 << (index%16); 1250 else 1251 tmp &= ~(1 << (index%16)); 1252 dmfe_setup_put32(descp, index/16, tmp); 1253 } 1254 1255 /* 1256 * Update the refcount for the bit in the setup packet corresponding 1257 * to the specified address; if it changes between zero & nonzero, 1258 * also update the bitmap itself & return B_TRUE, so that the caller 1259 * knows to re-send the setup packet. Otherwise (only the refcount 1260 * changed), return B_FALSE 1261 */ 1262 static boolean_t 1263 dmfe_update_mcast(dmfe_t *dmfep, const uint8_t *mca, boolean_t val) 1264 { 1265 uint32_t index; 1266 uint8_t *refp; 1267 boolean_t change; 1268 1269 index = dmfe_hash_index(mca); 1270 refp = &dmfep->mcast_refs[index]; 1271 change = (val ? (*refp)++ : --(*refp)) == 0; 1272 1273 if (change) 1274 dmfe_update_hash(dmfep, index, val); 1275 1276 return (change); 1277 } 1278 1279 /* 1280 * "Transmit" the (possibly updated) magic setup packet 1281 */ 1282 static int 1283 dmfe_send_setup(dmfe_t *dmfep) 1284 { 1285 int status; 1286 1287 ASSERT(mutex_owned(dmfep->oplock)); 1288 1289 if (dmfep->suspended) 1290 return (0); 1291 1292 /* 1293 * If the chip isn't running, we can't really send the setup frame 1294 * now but it doesn't matter, 'cos it will be sent when the transmit 1295 * process is restarted (see dmfe_start()). 1296 */ 1297 if ((dmfep->opmode & START_TRANSMIT) == 0) 1298 return (0); 1299 1300 /* 1301 * "Send" the setup frame. If it fails (e.g. no resources), 1302 * set a flag; then the factotum will retry the "send". Once 1303 * it works, we can clear the flag no matter how many attempts 1304 * had previously failed. We tell the caller that it worked 1305 * whether it did or not; after all, it *will* work eventually. 1306 */ 1307 status = dmfe_send_msg(dmfep, NULL); 1308 dmfep->need_setup = status ? B_FALSE : B_TRUE; 1309 return (0); 1310 } 1311 1312 /* 1313 * dmfe_m_unicst() -- set the physical network address 1314 */ 1315 static int 1316 dmfe_m_unicst(void *arg, const uint8_t *macaddr) 1317 { 1318 dmfe_t *dmfep = arg; 1319 int status; 1320 int index; 1321 1322 /* 1323 * Update our current address and send out a new setup packet 1324 * 1325 * Here we accommodate the use of HASH_ONLY or HASH_AND_PERFECT 1326 * filtering modes (we don't support PERFECT_ONLY or INVERSE modes). 1327 * 1328 * It is said that there is a bug in the 21140 where it fails to 1329 * receive packes addresses to the specified perfect filter address. 1330 * If the same bug is present in the DM9102A, the TX_FILTER_TYPE1 1331 * bit should be set in the module variable dmfe_setup_desc1. 1332 * 1333 * If TX_FILTER_TYPE1 is set, we will use HASH_ONLY filtering. 1334 * In this mode, *all* incoming addresses are hashed and looked 1335 * up in the bitmap described by the setup packet. Therefore, 1336 * the bit representing the station address has to be added to 1337 * the table before sending it out. If the address is changed, 1338 * the old entry should be removed before the new entry is made. 1339 * 1340 * NOTE: in this mode, unicast packets that are not intended for 1341 * this station may be received; it is up to software to filter 1342 * them out afterwards! 1343 * 1344 * If TX_FILTER_TYPE1 is *not* set, we will use HASH_AND_PERFECT 1345 * filtering. In this mode, multicast addresses are hashed and 1346 * checked against the bitmap, while unicast addresses are simply 1347 * matched against the one physical address specified in the setup 1348 * packet. This means that we shouldn't receive unicast packets 1349 * that aren't intended for us (but software still has to filter 1350 * multicast packets just the same). 1351 * 1352 * Whichever mode we're using, we have to enter the broadcast 1353 * address into the multicast filter map too, so we do this on 1354 * the first time through after attach or reset. 1355 */ 1356 mutex_enter(dmfep->oplock); 1357 1358 if (dmfep->addr_set && dmfe_setup_desc1 & TX_FILTER_TYPE1) 1359 (void) dmfe_update_mcast(dmfep, dmfep->curr_addr, B_FALSE); 1360 if (dmfe_setup_desc1 & TX_FILTER_TYPE1) 1361 (void) dmfe_update_mcast(dmfep, macaddr, B_TRUE); 1362 if (!dmfep->addr_set) 1363 (void) dmfe_update_mcast(dmfep, dmfe_broadcast_addr, B_TRUE); 1364 1365 /* 1366 * Remember the new current address 1367 */ 1368 ethaddr_copy(macaddr, dmfep->curr_addr); 1369 dmfep->addr_set = B_TRUE; 1370 1371 /* 1372 * Install the new physical address into the proper position in 1373 * the setup frame; this is only used if we select hash+perfect 1374 * filtering, but we'll put it in anyway. The ugliness here is 1375 * down to the usual war of the egg :( 1376 */ 1377 for (index = 0; index < ETHERADDRL; index += 2) 1378 dmfe_setup_put32(&dmfep->tx_desc, SETUPBUF_PHYS+index/2, 1379 (macaddr[index+1] << 8) | macaddr[index]); 1380 1381 /* 1382 * Finally, we're ready to "transmit" the setup frame 1383 */ 1384 status = dmfe_send_setup(dmfep); 1385 mutex_exit(dmfep->oplock); 1386 1387 return (status); 1388 } 1389 1390 /* 1391 * dmfe_m_multicst() -- enable or disable a multicast address 1392 * 1393 * Program the hardware to enable/disable the multicast address 1394 * in "mca" (enable if add is true, otherwise disable it.) 1395 * We keep a refcount for each bit in the map, so that it still 1396 * works out properly if multiple addresses hash to the same bit. 1397 * dmfe_update_mcast() tells us whether the map actually changed; 1398 * if so, we have to re-"transmit" the magic setup packet. 1399 */ 1400 static int 1401 dmfe_m_multicst(void *arg, boolean_t add, const uint8_t *mca) 1402 { 1403 dmfe_t *dmfep = arg; /* private device info */ 1404 int status = 0; 1405 1406 mutex_enter(dmfep->oplock); 1407 if (dmfe_update_mcast(dmfep, mca, add)) 1408 status = dmfe_send_setup(dmfep); 1409 mutex_exit(dmfep->oplock); 1410 1411 return (status); 1412 } 1413 1414 1415 /* 1416 * ========== Internal state management entry points ========== 1417 */ 1418 1419 /* 1420 * These routines provide all the functionality required by the 1421 * corresponding MAC layer entry points, but don't update the MAC layer state 1422 * so they can be called internally without disturbing our record 1423 * of what MAC layer thinks we should be doing ... 1424 */ 1425 1426 /* 1427 * dmfe_stop() -- stop processing, don't reset h/w or rings 1428 */ 1429 static void 1430 dmfe_stop(dmfe_t *dmfep) 1431 { 1432 ASSERT(mutex_owned(dmfep->oplock)); 1433 1434 dmfe_stop_chip(dmfep, CHIP_STOPPED); 1435 } 1436 1437 /* 1438 * dmfe_reset() -- stop processing, reset h/w & rings to initial state 1439 */ 1440 static void 1441 dmfe_reset(dmfe_t *dmfep) 1442 { 1443 ASSERT(mutex_owned(dmfep->oplock)); 1444 ASSERT(mutex_owned(dmfep->rxlock)); 1445 ASSERT(mutex_owned(dmfep->txlock)); 1446 1447 dmfe_stop_chip(dmfep, CHIP_RESET); 1448 dmfe_init_rings(dmfep); 1449 } 1450 1451 /* 1452 * dmfe_start() -- start transmitting/receiving 1453 */ 1454 static void 1455 dmfe_start(dmfe_t *dmfep) 1456 { 1457 uint32_t gpsr; 1458 1459 ASSERT(mutex_owned(dmfep->oplock)); 1460 1461 ASSERT(dmfep->chip_state == CHIP_RESET || 1462 dmfep->chip_state == CHIP_STOPPED); 1463 1464 /* 1465 * Make opmode consistent with PHY duplex setting 1466 */ 1467 gpsr = dmfe_chip_get32(dmfep, PHY_STATUS_REG); 1468 if (gpsr & GPS_FULL_DUPLEX) 1469 dmfep->opmode |= FULL_DUPLEX; 1470 else 1471 dmfep->opmode &= ~FULL_DUPLEX; 1472 1473 /* 1474 * Start transmit processing 1475 * Set up the address filters 1476 * Start receive processing 1477 * Enable interrupts 1478 */ 1479 dmfe_start_chip(dmfep, START_TRANSMIT); 1480 (void) dmfe_send_setup(dmfep); 1481 drv_usecwait(10); 1482 dmfe_start_chip(dmfep, START_RECEIVE); 1483 dmfe_enable_interrupts(dmfep); 1484 } 1485 1486 /* 1487 * dmfe_restart - restart transmitting/receiving after error or suspend 1488 */ 1489 static void 1490 dmfe_restart(dmfe_t *dmfep) 1491 { 1492 ASSERT(mutex_owned(dmfep->oplock)); 1493 1494 /* 1495 * You need not only <oplock>, but also <rxlock> AND <txlock> 1496 * in order to reset the rings, but then <txlock> *mustn't* 1497 * be held across the call to dmfe_start() 1498 */ 1499 mutex_enter(dmfep->rxlock); 1500 mutex_enter(dmfep->txlock); 1501 dmfe_reset(dmfep); 1502 mutex_exit(dmfep->txlock); 1503 mutex_exit(dmfep->rxlock); 1504 if (dmfep->mac_state == DMFE_MAC_STARTED) { 1505 dmfe_start(dmfep); 1506 } 1507 } 1508 1509 1510 /* 1511 * ========== MAC-required management entry points ========== 1512 */ 1513 1514 /* 1515 * dmfe_m_stop() -- stop transmitting/receiving 1516 */ 1517 static void 1518 dmfe_m_stop(void *arg) 1519 { 1520 dmfe_t *dmfep = arg; /* private device info */ 1521 1522 /* 1523 * Just stop processing, then record new MAC state 1524 */ 1525 mii_stop(dmfep->mii); 1526 1527 mutex_enter(dmfep->oplock); 1528 if (!dmfep->suspended) 1529 dmfe_stop(dmfep); 1530 dmfep->mac_state = DMFE_MAC_STOPPED; 1531 mutex_exit(dmfep->oplock); 1532 } 1533 1534 /* 1535 * dmfe_m_start() -- start transmitting/receiving 1536 */ 1537 static int 1538 dmfe_m_start(void *arg) 1539 { 1540 dmfe_t *dmfep = arg; /* private device info */ 1541 1542 /* 1543 * Start processing and record new MAC state 1544 */ 1545 mutex_enter(dmfep->oplock); 1546 if (!dmfep->suspended) 1547 dmfe_start(dmfep); 1548 dmfep->mac_state = DMFE_MAC_STARTED; 1549 mutex_exit(dmfep->oplock); 1550 1551 mii_start(dmfep->mii); 1552 1553 return (0); 1554 } 1555 1556 /* 1557 * dmfe_m_promisc() -- set or reset promiscuous mode on the board 1558 * 1559 * Program the hardware to enable/disable promiscuous and/or 1560 * receive-all-multicast modes. Davicom don't document this 1561 * clearly, but it looks like we can do this on-the-fly (i.e. 1562 * without stopping & restarting the TX/RX processes). 1563 */ 1564 static int 1565 dmfe_m_promisc(void *arg, boolean_t on) 1566 { 1567 dmfe_t *dmfep = arg; 1568 1569 mutex_enter(dmfep->oplock); 1570 dmfep->opmode &= ~(PROMISC_MODE | PASS_MULTICAST); 1571 if (on) 1572 dmfep->opmode |= PROMISC_MODE; 1573 if (!dmfep->suspended) 1574 dmfe_set_opmode(dmfep); 1575 mutex_exit(dmfep->oplock); 1576 1577 return (0); 1578 } 1579 1580 /* 1581 * ========== Factotum, implemented as a softint handler ========== 1582 */ 1583 1584 /* 1585 * The factotum is woken up when there's something to do that we'd rather 1586 * not do from inside a (high-level?) hardware interrupt handler. Its 1587 * two main tasks are: 1588 * reset & restart the chip after an error 1589 * update & restart the chip after a link status change 1590 */ 1591 static uint_t 1592 dmfe_factotum(caddr_t arg) 1593 { 1594 dmfe_t *dmfep; 1595 1596 dmfep = (void *)arg; 1597 ASSERT(dmfep->dmfe_guard == DMFE_GUARD); 1598 1599 mutex_enter(dmfep->oplock); 1600 if (dmfep->suspended) { 1601 mutex_exit(dmfep->oplock); 1602 return (DDI_INTR_CLAIMED); 1603 } 1604 1605 dmfep->factotum_flag = 0; 1606 DRV_KS_INC(dmfep, KS_FACTOTUM_RUN); 1607 1608 /* 1609 * Check for chip error ... 1610 */ 1611 if (dmfep->chip_state == CHIP_ERROR) { 1612 /* 1613 * Error recovery required: reset the chip and the rings, 1614 * then, if it's supposed to be running, kick it off again. 1615 */ 1616 DRV_KS_INC(dmfep, KS_RECOVERY); 1617 dmfe_restart(dmfep); 1618 mutex_exit(dmfep->oplock); 1619 1620 mii_reset(dmfep->mii); 1621 1622 } else if (dmfep->need_setup) { 1623 (void) dmfe_send_setup(dmfep); 1624 mutex_exit(dmfep->oplock); 1625 } 1626 1627 return (DDI_INTR_CLAIMED); 1628 } 1629 1630 static void 1631 dmfe_wake_factotum(dmfe_t *dmfep, int ks_id, const char *why) 1632 { 1633 _NOTE(ARGUNUSED(why)); 1634 ASSERT(mutex_owned(dmfep->oplock)); 1635 DRV_KS_INC(dmfep, ks_id); 1636 1637 if (dmfep->factotum_flag++ == 0) 1638 ddi_trigger_softintr(dmfep->factotum_id); 1639 } 1640 1641 1642 /* 1643 * ========== Periodic Tasks (Cyclic handler & friends) ========== 1644 */ 1645 1646 /* 1647 * Periodic tick tasks, run from the cyclic handler 1648 * 1649 * Check for TX stall; flag an error and wake the factotum if so. 1650 */ 1651 static void 1652 dmfe_tick_stall_check(dmfe_t *dmfep, uint32_t gpsr, uint32_t istat) 1653 { 1654 boolean_t tx_stall; 1655 uint32_t tx_state; 1656 uint32_t limit; 1657 1658 ASSERT(mutex_owned(dmfep->oplock)); 1659 1660 /* 1661 * Check for transmit stall ... 1662 * 1663 * IF there's at least one packet in the ring, AND the timeout 1664 * has elapsed, AND we can't reclaim any descriptors, THEN we've 1665 * stalled; we return B_TRUE to trigger a reset-and-recover cycle. 1666 * 1667 * Note that the timeout limit is based on the transmit engine 1668 * state; we allow the transmitter longer to make progress in 1669 * some states than in others, based on observations of this 1670 * chip's actual behaviour in the lab. 1671 * 1672 * By observation, we find that on about 1 in 10000 passes through 1673 * here, the TX lock is already held. In that case, we'll skip 1674 * the check on this pass rather than wait. Most likely, the send 1675 * routine was holding the lock when the interrupt happened, and 1676 * we'll succeed next time through. In the event of a real stall, 1677 * the TX ring will fill up, after which the send routine won't be 1678 * called any more and then we're sure to get in. 1679 */ 1680 tx_stall = B_FALSE; 1681 if (mutex_tryenter(dmfep->txlock)) { 1682 if (dmfep->tx.n_free < dmfep->tx.n_desc) { 1683 tx_state = TX_PROCESS_STATE(istat); 1684 if (gpsr & GPS_LINK_100) 1685 limit = stall_100_tix[tx_state]; 1686 else 1687 limit = stall_10_tix[tx_state]; 1688 if (++dmfep->tx_pending_tix >= limit && 1689 dmfe_reclaim_tx_desc(dmfep) == B_FALSE) { 1690 dmfe_log(dmfep, "TX stall detected " 1691 "after %d ticks in state %d; " 1692 "automatic recovery initiated", 1693 dmfep->tx_pending_tix, tx_state); 1694 tx_stall = B_TRUE; 1695 } 1696 } 1697 mutex_exit(dmfep->txlock); 1698 } 1699 1700 if (tx_stall) { 1701 dmfe_stop_chip(dmfep, CHIP_ERROR); 1702 dmfe_wake_factotum(dmfep, KS_TX_STALL, "tick (TX stall)"); 1703 } 1704 } 1705 1706 /* 1707 * Cyclic callback handler 1708 */ 1709 static void 1710 dmfe_cyclic(void *arg) 1711 { 1712 dmfe_t *dmfep = arg; /* private device info */ 1713 uint32_t istat; 1714 uint32_t gpsr; 1715 1716 /* 1717 * If the chip's not RUNNING, there's nothing to do. 1718 * If we can't get the mutex straight away, we'll just 1719 * skip this pass; we'll back back soon enough anyway. 1720 */ 1721 if (mutex_tryenter(dmfep->oplock) == 0) 1722 return; 1723 if ((dmfep->suspended) || (dmfep->chip_state != CHIP_RUNNING)) { 1724 mutex_exit(dmfep->oplock); 1725 return; 1726 } 1727 1728 /* 1729 * Recheck chip state (it might have been stopped since we 1730 * checked above). If still running, call each of the *tick* 1731 * tasks. They will check for link change, TX stall, etc ... 1732 */ 1733 if (dmfep->chip_state == CHIP_RUNNING) { 1734 istat = dmfe_chip_get32(dmfep, STATUS_REG); 1735 gpsr = dmfe_chip_get32(dmfep, PHY_STATUS_REG); 1736 dmfe_tick_stall_check(dmfep, gpsr, istat); 1737 } 1738 1739 DRV_KS_INC(dmfep, KS_CYCLIC_RUN); 1740 mutex_exit(dmfep->oplock); 1741 } 1742 1743 /* 1744 * ========== Hardware interrupt handler ========== 1745 */ 1746 1747 /* 1748 * dmfe_interrupt() -- handle chip interrupts 1749 */ 1750 static uint_t 1751 dmfe_interrupt(caddr_t arg) 1752 { 1753 dmfe_t *dmfep; /* private device info */ 1754 uint32_t interrupts; 1755 uint32_t istat; 1756 const char *msg; 1757 mblk_t *mp; 1758 boolean_t warning_msg = B_TRUE; 1759 1760 dmfep = (void *)arg; 1761 1762 mutex_enter(dmfep->oplock); 1763 if (dmfep->suspended) { 1764 mutex_exit(dmfep->oplock); 1765 return (DDI_INTR_UNCLAIMED); 1766 } 1767 1768 /* 1769 * A quick check as to whether the interrupt was from this 1770 * device, before we even finish setting up all our local 1771 * variables. Note that reading the interrupt status register 1772 * doesn't have any unpleasant side effects such as clearing 1773 * the bits read, so it's quite OK to re-read it once we have 1774 * determined that we are going to service this interrupt and 1775 * grabbed the mutexen. 1776 */ 1777 istat = dmfe_chip_get32(dmfep, STATUS_REG); 1778 if ((istat & (NORMAL_SUMMARY_INT | ABNORMAL_SUMMARY_INT)) == 0) { 1779 1780 mutex_exit(dmfep->oplock); 1781 return (DDI_INTR_UNCLAIMED); 1782 } 1783 1784 DRV_KS_INC(dmfep, KS_INTERRUPT); 1785 1786 /* 1787 * Identify bits that represent enabled interrupts ... 1788 */ 1789 istat |= dmfe_chip_get32(dmfep, STATUS_REG); 1790 interrupts = istat & dmfep->imask; 1791 ASSERT(interrupts != 0); 1792 1793 DTRACE_PROBE1(intr, uint32_t, istat); 1794 1795 /* 1796 * Check for any interrupts other than TX/RX done. 1797 * If there are any, they are considered Abnormal 1798 * and will cause the chip to be reset. 1799 */ 1800 if (interrupts & ~(RX_PKTDONE_INT | TX_PKTDONE_INT)) { 1801 if (istat & ABNORMAL_SUMMARY_INT) { 1802 /* 1803 * Any Abnormal interrupts will lead to us 1804 * resetting the chip, so we don't bother 1805 * to clear each interrupt individually. 1806 * 1807 * Our main task here is to identify the problem, 1808 * by pointing out the most significant unexpected 1809 * bit. Additional bits may well be consequences 1810 * of the first problem, so we consider the possible 1811 * causes in order of severity. 1812 */ 1813 if (interrupts & SYSTEM_ERR_INT) { 1814 switch (istat & SYSTEM_ERR_BITS) { 1815 case SYSTEM_ERR_M_ABORT: 1816 msg = "Bus Master Abort"; 1817 break; 1818 1819 case SYSTEM_ERR_T_ABORT: 1820 msg = "Bus Target Abort"; 1821 break; 1822 1823 case SYSTEM_ERR_PARITY: 1824 msg = "Parity Error"; 1825 break; 1826 1827 default: 1828 msg = "Unknown System Bus Error"; 1829 break; 1830 } 1831 } else if (interrupts & RX_STOPPED_INT) { 1832 msg = "RX process stopped"; 1833 } else if (interrupts & RX_UNAVAIL_INT) { 1834 msg = "RX buffer unavailable"; 1835 warning_msg = B_FALSE; 1836 } else if (interrupts & RX_WATCHDOG_INT) { 1837 msg = "RX watchdog timeout?"; 1838 } else if (interrupts & RX_EARLY_INT) { 1839 msg = "RX early interrupt?"; 1840 } else if (interrupts & TX_STOPPED_INT) { 1841 msg = "TX process stopped"; 1842 } else if (interrupts & TX_JABBER_INT) { 1843 msg = "TX jabber timeout"; 1844 } else if (interrupts & TX_UNDERFLOW_INT) { 1845 msg = "TX underflow?"; 1846 } else if (interrupts & TX_EARLY_INT) { 1847 msg = "TX early interrupt?"; 1848 1849 } else if (interrupts & LINK_STATUS_INT) { 1850 msg = "Link status change?"; 1851 } else if (interrupts & GP_TIMER_INT) { 1852 msg = "Timer expired?"; 1853 } 1854 1855 if (warning_msg) 1856 dmfe_warning(dmfep, "abnormal interrupt, " 1857 "status 0x%x: %s", istat, msg); 1858 1859 /* 1860 * We don't want to run the entire reinitialisation 1861 * code out of this (high-level?) interrupt, so we 1862 * simply STOP the chip, and wake up the factotum 1863 * to reinitalise it ... 1864 */ 1865 dmfe_stop_chip(dmfep, CHIP_ERROR); 1866 dmfe_wake_factotum(dmfep, KS_CHIP_ERROR, 1867 "interrupt (error)"); 1868 } else { 1869 /* 1870 * We shouldn't really get here (it would mean 1871 * there were some unprocessed enabled bits but 1872 * they weren't Abnormal?), but we'll check just 1873 * in case ... 1874 */ 1875 DTRACE_PROBE1(intr__unexpected, uint32_t, istat); 1876 } 1877 } 1878 1879 /* 1880 * Acknowledge all the original bits - except in the case of an 1881 * error, when we leave them unacknowledged so that the recovery 1882 * code can see what was going on when the problem occurred ... 1883 */ 1884 if (dmfep->chip_state != CHIP_ERROR) { 1885 (void) dmfe_chip_put32(dmfep, STATUS_REG, istat); 1886 /* 1887 * Read-after-write forces completion on PCI bus. 1888 * 1889 */ 1890 (void) dmfe_chip_get32(dmfep, STATUS_REG); 1891 } 1892 1893 1894 /* 1895 * We've finished talking to the chip, so we can drop <oplock> 1896 * before handling the normal interrupts, which only involve 1897 * manipulation of descriptors ... 1898 */ 1899 mutex_exit(dmfep->oplock); 1900 1901 if (interrupts & RX_PKTDONE_INT) 1902 if ((mp = dmfe_getp(dmfep)) != NULL) 1903 mac_rx(dmfep->mh, NULL, mp); 1904 1905 if (interrupts & TX_PKTDONE_INT) { 1906 /* 1907 * The only reason for taking this interrupt is to give 1908 * MAC a chance to schedule queued packets after a 1909 * ring-full condition. To minimise the number of 1910 * redundant TX-Done interrupts, we only mark two of the 1911 * ring descriptors as 'interrupt-on-complete' - all the 1912 * others are simply handed back without an interrupt. 1913 */ 1914 if (dmfe_reclaim_on_done && mutex_tryenter(dmfep->txlock)) { 1915 (void) dmfe_reclaim_tx_desc(dmfep); 1916 mutex_exit(dmfep->txlock); 1917 } 1918 mac_tx_update(dmfep->mh); 1919 } 1920 1921 return (DDI_INTR_CLAIMED); 1922 } 1923 1924 /* 1925 * ========== Statistics update handler ========== 1926 */ 1927 1928 static int 1929 dmfe_m_stat(void *arg, uint_t stat, uint64_t *val) 1930 { 1931 dmfe_t *dmfep = arg; 1932 int rv = 0; 1933 1934 /* Let MII handle its own stats. */ 1935 if (mii_m_getstat(dmfep->mii, stat, val) == 0) { 1936 return (0); 1937 } 1938 1939 mutex_enter(dmfep->oplock); 1940 mutex_enter(dmfep->rxlock); 1941 mutex_enter(dmfep->txlock); 1942 1943 /* make sure we have all the stats collected */ 1944 (void) dmfe_reclaim_tx_desc(dmfep); 1945 1946 switch (stat) { 1947 1948 case MAC_STAT_IPACKETS: 1949 *val = dmfep->rx_stats_ipackets; 1950 break; 1951 1952 case MAC_STAT_MULTIRCV: 1953 *val = dmfep->rx_stats_multi; 1954 break; 1955 1956 case MAC_STAT_BRDCSTRCV: 1957 *val = dmfep->rx_stats_bcast; 1958 break; 1959 1960 case MAC_STAT_RBYTES: 1961 *val = dmfep->rx_stats_rbytes; 1962 break; 1963 1964 case MAC_STAT_IERRORS: 1965 *val = dmfep->rx_stats_ierrors; 1966 break; 1967 1968 case MAC_STAT_NORCVBUF: 1969 *val = dmfep->rx_stats_norcvbuf; 1970 break; 1971 1972 case MAC_STAT_COLLISIONS: 1973 *val = dmfep->tx_stats_collisions; 1974 break; 1975 1976 case MAC_STAT_OERRORS: 1977 *val = dmfep->tx_stats_oerrors; 1978 break; 1979 1980 case MAC_STAT_OPACKETS: 1981 *val = dmfep->tx_stats_opackets; 1982 break; 1983 1984 case MAC_STAT_MULTIXMT: 1985 *val = dmfep->tx_stats_multi; 1986 break; 1987 1988 case MAC_STAT_BRDCSTXMT: 1989 *val = dmfep->tx_stats_bcast; 1990 break; 1991 1992 case MAC_STAT_OBYTES: 1993 *val = dmfep->tx_stats_obytes; 1994 break; 1995 1996 case MAC_STAT_OVERFLOWS: 1997 *val = dmfep->rx_stats_overflow; 1998 break; 1999 2000 case MAC_STAT_UNDERFLOWS: 2001 *val = dmfep->tx_stats_underflow; 2002 break; 2003 2004 case ETHER_STAT_ALIGN_ERRORS: 2005 *val = dmfep->rx_stats_align; 2006 break; 2007 2008 case ETHER_STAT_FCS_ERRORS: 2009 *val = dmfep->rx_stats_fcs; 2010 break; 2011 2012 case ETHER_STAT_TOOLONG_ERRORS: 2013 *val = dmfep->rx_stats_toolong; 2014 break; 2015 2016 case ETHER_STAT_TOOSHORT_ERRORS: 2017 *val = dmfep->rx_stats_short; 2018 break; 2019 2020 case ETHER_STAT_MACRCV_ERRORS: 2021 *val = dmfep->rx_stats_macrcv_errors; 2022 break; 2023 2024 case ETHER_STAT_MACXMT_ERRORS: 2025 *val = dmfep->tx_stats_macxmt_errors; 2026 break; 2027 2028 case ETHER_STAT_JABBER_ERRORS: 2029 *val = dmfep->tx_stats_jabber; 2030 break; 2031 2032 case ETHER_STAT_CARRIER_ERRORS: 2033 *val = dmfep->tx_stats_nocarrier; 2034 break; 2035 2036 case ETHER_STAT_TX_LATE_COLLISIONS: 2037 *val = dmfep->tx_stats_xmtlatecoll; 2038 break; 2039 2040 case ETHER_STAT_EX_COLLISIONS: 2041 *val = dmfep->tx_stats_excoll; 2042 break; 2043 2044 case ETHER_STAT_DEFER_XMTS: 2045 *val = dmfep->tx_stats_defer; 2046 break; 2047 2048 case ETHER_STAT_FIRST_COLLISIONS: 2049 *val = dmfep->tx_stats_first_coll; 2050 break; 2051 2052 case ETHER_STAT_MULTI_COLLISIONS: 2053 *val = dmfep->tx_stats_multi_coll; 2054 break; 2055 2056 default: 2057 rv = ENOTSUP; 2058 } 2059 2060 mutex_exit(dmfep->txlock); 2061 mutex_exit(dmfep->rxlock); 2062 mutex_exit(dmfep->oplock); 2063 2064 return (rv); 2065 } 2066 2067 /* 2068 * ========== Ioctl handler & subfunctions ========== 2069 */ 2070 2071 static lb_property_t dmfe_loopmodes[] = { 2072 { normal, "normal", 0 }, 2073 { internal, "Internal", 1 }, 2074 { external, "External", 2 }, 2075 }; 2076 2077 /* 2078 * Specific dmfe IOCTLs, the mac module handles the generic ones. 2079 * Unfortunately, the DM9102 doesn't seem to work well with MII based 2080 * loopback, so we have to do something special for it. 2081 */ 2082 2083 static void 2084 dmfe_m_ioctl(void *arg, queue_t *wq, mblk_t *mp) 2085 { 2086 dmfe_t *dmfep = arg; 2087 struct iocblk *iocp; 2088 int rv = 0; 2089 lb_info_sz_t sz; 2090 int cmd; 2091 uint32_t mode; 2092 2093 iocp = (void *)mp->b_rptr; 2094 cmd = iocp->ioc_cmd; 2095 2096 if (mp->b_cont == NULL) { 2097 /* 2098 * All of these ioctls need data! 2099 */ 2100 miocnak(wq, mp, 0, EINVAL); 2101 return; 2102 } 2103 2104 switch (cmd) { 2105 case LB_GET_INFO_SIZE: 2106 if (iocp->ioc_count != sizeof (sz)) { 2107 rv = EINVAL; 2108 } else { 2109 sz = sizeof (dmfe_loopmodes); 2110 bcopy(&sz, mp->b_cont->b_rptr, sizeof (sz)); 2111 } 2112 break; 2113 2114 case LB_GET_INFO: 2115 if (iocp->ioc_count != sizeof (dmfe_loopmodes)) { 2116 rv = EINVAL; 2117 } else { 2118 bcopy(dmfe_loopmodes, mp->b_cont->b_rptr, 2119 iocp->ioc_count); 2120 } 2121 break; 2122 2123 case LB_GET_MODE: 2124 if (iocp->ioc_count != sizeof (mode)) { 2125 rv = EINVAL; 2126 } else { 2127 mutex_enter(dmfep->oplock); 2128 switch (dmfep->opmode & LOOPBACK_MODE_MASK) { 2129 case LOOPBACK_OFF: 2130 mode = 0; 2131 break; 2132 case LOOPBACK_INTERNAL: 2133 mode = 1; 2134 break; 2135 default: 2136 mode = 2; 2137 break; 2138 } 2139 mutex_exit(dmfep->oplock); 2140 bcopy(&mode, mp->b_cont->b_rptr, sizeof (mode)); 2141 } 2142 break; 2143 2144 case LB_SET_MODE: 2145 rv = secpolicy_net_config(iocp->ioc_cr, B_FALSE); 2146 if (rv != 0) 2147 break; 2148 if (iocp->ioc_count != sizeof (mode)) { 2149 rv = EINVAL; 2150 break; 2151 } 2152 bcopy(mp->b_cont->b_rptr, &mode, sizeof (mode)); 2153 2154 mutex_enter(dmfep->oplock); 2155 dmfep->opmode &= ~LOOPBACK_MODE_MASK; 2156 switch (mode) { 2157 case 2: 2158 dmfep->opmode |= LOOPBACK_PHY_D; 2159 break; 2160 case 1: 2161 dmfep->opmode |= LOOPBACK_INTERNAL; 2162 break; 2163 default: 2164 break; 2165 } 2166 if (!dmfep->suspended) { 2167 dmfe_restart(dmfep); 2168 } 2169 mutex_exit(dmfep->oplock); 2170 break; 2171 2172 default: 2173 rv = EINVAL; 2174 break; 2175 } 2176 2177 if (rv == 0) { 2178 miocack(wq, mp, iocp->ioc_count, 0); 2179 } else { 2180 miocnak(wq, mp, 0, rv); 2181 } 2182 } 2183 2184 int 2185 dmfe_m_getprop(void *arg, const char *name, mac_prop_id_t num, uint_t sz, 2186 void *val) 2187 { 2188 dmfe_t *dmfep = arg; 2189 2190 return (mii_m_getprop(dmfep->mii, name, num, sz, val)); 2191 } 2192 2193 int 2194 dmfe_m_setprop(void *arg, const char *name, mac_prop_id_t num, uint_t sz, 2195 const void *val) 2196 { 2197 dmfe_t *dmfep = arg; 2198 2199 return (mii_m_setprop(dmfep->mii, name, num, sz, val)); 2200 } 2201 2202 static void 2203 dmfe_m_propinfo(void *arg, const char *name, mac_prop_id_t num, 2204 mac_prop_info_handle_t mph) 2205 { 2206 dmfe_t *dmfep = arg; 2207 2208 mii_m_propinfo(dmfep->mii, name, num, mph); 2209 } 2210 2211 /* 2212 * ========== Per-instance setup/teardown code ========== 2213 */ 2214 2215 /* 2216 * Determine local MAC address & broadcast address for this interface 2217 */ 2218 static void 2219 dmfe_find_mac_address(dmfe_t *dmfep) 2220 { 2221 uchar_t *prop; 2222 uint_t propsize; 2223 int err; 2224 2225 /* 2226 * We have to find the "vendor's factory-set address". This is 2227 * the value of the property "local-mac-address", as set by OBP 2228 * (or a .conf file!) 2229 * 2230 * If the property is not there, then we try to find the factory 2231 * mac address from the devices serial EEPROM. 2232 */ 2233 bzero(dmfep->curr_addr, sizeof (dmfep->curr_addr)); 2234 err = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, dmfep->devinfo, 2235 DDI_PROP_DONTPASS, localmac_propname, &prop, &propsize); 2236 if (err == DDI_PROP_SUCCESS) { 2237 if (propsize == ETHERADDRL) 2238 ethaddr_copy(prop, dmfep->curr_addr); 2239 ddi_prop_free(prop); 2240 } else { 2241 /* no property set... check eeprom */ 2242 dmfe_read_eeprom(dmfep, EEPROM_EN_ADDR, dmfep->curr_addr, 2243 ETHERADDRL); 2244 } 2245 } 2246 2247 static int 2248 dmfe_alloc_dma_mem(dmfe_t *dmfep, size_t memsize, 2249 size_t setup, size_t slop, ddi_device_acc_attr_t *attr_p, 2250 uint_t dma_flags, dma_area_t *dma_p) 2251 { 2252 ddi_dma_cookie_t dma_cookie; 2253 uint_t ncookies; 2254 int err; 2255 2256 /* 2257 * Allocate handle 2258 */ 2259 err = ddi_dma_alloc_handle(dmfep->devinfo, &dma_attr, 2260 DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl); 2261 if (err != DDI_SUCCESS) { 2262 dmfe_error(dmfep, "DMA handle allocation failed"); 2263 return (DDI_FAILURE); 2264 } 2265 2266 /* 2267 * Allocate memory 2268 */ 2269 err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize + setup + slop, 2270 attr_p, dma_flags & (DDI_DMA_CONSISTENT | DDI_DMA_STREAMING), 2271 DDI_DMA_SLEEP, NULL, 2272 &dma_p->mem_va, &dma_p->alength, &dma_p->acc_hdl); 2273 if (err != DDI_SUCCESS) { 2274 dmfe_error(dmfep, "DMA memory allocation failed: %d", err); 2275 return (DDI_FAILURE); 2276 } 2277 2278 /* 2279 * Bind the two together 2280 */ 2281 err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL, 2282 dma_p->mem_va, dma_p->alength, dma_flags, 2283 DDI_DMA_SLEEP, NULL, &dma_cookie, &ncookies); 2284 if (err != DDI_DMA_MAPPED) { 2285 dmfe_error(dmfep, "DMA mapping failed: %d", err); 2286 return (DDI_FAILURE); 2287 } 2288 if ((dma_p->ncookies = ncookies) != 1) { 2289 dmfe_error(dmfep, "Too many DMA cookeis: %d", ncookies); 2290 return (DDI_FAILURE); 2291 } 2292 2293 dma_p->mem_dvma = dma_cookie.dmac_address; 2294 if (setup > 0) { 2295 dma_p->setup_dvma = dma_p->mem_dvma + memsize; 2296 dma_p->setup_va = dma_p->mem_va + memsize; 2297 } else { 2298 dma_p->setup_dvma = 0; 2299 dma_p->setup_va = NULL; 2300 } 2301 2302 return (DDI_SUCCESS); 2303 } 2304 2305 /* 2306 * This function allocates the transmit and receive buffers and descriptors. 2307 */ 2308 static int 2309 dmfe_alloc_bufs(dmfe_t *dmfep) 2310 { 2311 size_t memsize; 2312 int err; 2313 2314 /* 2315 * Allocate memory & handles for TX descriptor ring 2316 */ 2317 memsize = dmfep->tx.n_desc * sizeof (struct tx_desc_type); 2318 err = dmfe_alloc_dma_mem(dmfep, memsize, SETUPBUF_SIZE, DMFE_SLOP, 2319 &dmfe_reg_accattr, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 2320 &dmfep->tx_desc); 2321 if (err != DDI_SUCCESS) { 2322 dmfe_error(dmfep, "TX descriptor allocation failed"); 2323 return (DDI_FAILURE); 2324 } 2325 2326 /* 2327 * Allocate memory & handles for TX buffers 2328 */ 2329 memsize = dmfep->tx.n_desc * DMFE_BUF_SIZE; 2330 err = dmfe_alloc_dma_mem(dmfep, memsize, 0, 0, 2331 &dmfe_data_accattr, DDI_DMA_WRITE | DMFE_DMA_MODE, 2332 &dmfep->tx_buff); 2333 if (err != DDI_SUCCESS) { 2334 dmfe_error(dmfep, "TX buffer allocation failed"); 2335 return (DDI_FAILURE); 2336 } 2337 2338 /* 2339 * Allocate memory & handles for RX descriptor ring 2340 */ 2341 memsize = dmfep->rx.n_desc * sizeof (struct rx_desc_type); 2342 err = dmfe_alloc_dma_mem(dmfep, memsize, 0, DMFE_SLOP, 2343 &dmfe_reg_accattr, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 2344 &dmfep->rx_desc); 2345 if (err != DDI_SUCCESS) { 2346 dmfe_error(dmfep, "RX descriptor allocation failed"); 2347 return (DDI_FAILURE); 2348 } 2349 2350 /* 2351 * Allocate memory & handles for RX buffers 2352 */ 2353 memsize = dmfep->rx.n_desc * DMFE_BUF_SIZE; 2354 err = dmfe_alloc_dma_mem(dmfep, memsize, 0, 0, 2355 &dmfe_data_accattr, DDI_DMA_READ | DMFE_DMA_MODE, &dmfep->rx_buff); 2356 if (err != DDI_SUCCESS) { 2357 dmfe_error(dmfep, "RX buffer allocation failed"); 2358 return (DDI_FAILURE); 2359 } 2360 2361 /* 2362 * Allocate bitmasks for tx packet type tracking 2363 */ 2364 dmfep->tx_mcast = kmem_zalloc(dmfep->tx.n_desc / NBBY, KM_SLEEP); 2365 dmfep->tx_bcast = kmem_zalloc(dmfep->tx.n_desc / NBBY, KM_SLEEP); 2366 2367 return (DDI_SUCCESS); 2368 } 2369 2370 static void 2371 dmfe_free_dma_mem(dma_area_t *dma_p) 2372 { 2373 if (dma_p->dma_hdl != NULL) { 2374 if (dma_p->ncookies) { 2375 (void) ddi_dma_unbind_handle(dma_p->dma_hdl); 2376 dma_p->ncookies = 0; 2377 } 2378 ddi_dma_free_handle(&dma_p->dma_hdl); 2379 dma_p->dma_hdl = NULL; 2380 dma_p->mem_dvma = 0; 2381 dma_p->setup_dvma = 0; 2382 } 2383 2384 if (dma_p->acc_hdl != NULL) { 2385 ddi_dma_mem_free(&dma_p->acc_hdl); 2386 dma_p->acc_hdl = NULL; 2387 dma_p->mem_va = NULL; 2388 dma_p->setup_va = NULL; 2389 } 2390 } 2391 2392 /* 2393 * This routine frees the transmit and receive buffers and descriptors. 2394 * Make sure the chip is stopped before calling it! 2395 */ 2396 static void 2397 dmfe_free_bufs(dmfe_t *dmfep) 2398 { 2399 dmfe_free_dma_mem(&dmfep->rx_buff); 2400 dmfe_free_dma_mem(&dmfep->rx_desc); 2401 dmfe_free_dma_mem(&dmfep->tx_buff); 2402 dmfe_free_dma_mem(&dmfep->tx_desc); 2403 if (dmfep->tx_mcast) 2404 kmem_free(dmfep->tx_mcast, dmfep->tx.n_desc / NBBY); 2405 if (dmfep->tx_bcast) 2406 kmem_free(dmfep->tx_bcast, dmfep->tx.n_desc / NBBY); 2407 } 2408 2409 static void 2410 dmfe_unattach(dmfe_t *dmfep) 2411 { 2412 /* 2413 * Clean up and free all DMFE data structures 2414 */ 2415 if (dmfep->cycid != NULL) { 2416 ddi_periodic_delete(dmfep->cycid); 2417 dmfep->cycid = NULL; 2418 } 2419 2420 if (dmfep->ksp_drv != NULL) 2421 kstat_delete(dmfep->ksp_drv); 2422 if (dmfep->progress & PROGRESS_HWINT) { 2423 ddi_remove_intr(dmfep->devinfo, 0, dmfep->iblk); 2424 } 2425 if (dmfep->progress & PROGRESS_SOFTINT) 2426 ddi_remove_softintr(dmfep->factotum_id); 2427 if (dmfep->mii != NULL) 2428 mii_free(dmfep->mii); 2429 if (dmfep->progress & PROGRESS_MUTEX) { 2430 mutex_destroy(dmfep->txlock); 2431 mutex_destroy(dmfep->rxlock); 2432 mutex_destroy(dmfep->oplock); 2433 } 2434 dmfe_free_bufs(dmfep); 2435 if (dmfep->io_handle != NULL) 2436 ddi_regs_map_free(&dmfep->io_handle); 2437 2438 kmem_free(dmfep, sizeof (*dmfep)); 2439 } 2440 2441 static int 2442 dmfe_config_init(dmfe_t *dmfep, chip_id_t *idp) 2443 { 2444 ddi_acc_handle_t handle; 2445 uint32_t regval; 2446 2447 if (pci_config_setup(dmfep->devinfo, &handle) != DDI_SUCCESS) 2448 return (DDI_FAILURE); 2449 2450 /* 2451 * Get vendor/device/revision. We expect (but don't check) that 2452 * (vendorid == DAVICOM_VENDOR_ID) && (deviceid == DEVICE_ID_9102) 2453 */ 2454 idp->vendor = pci_config_get16(handle, PCI_CONF_VENID); 2455 idp->device = pci_config_get16(handle, PCI_CONF_DEVID); 2456 idp->revision = pci_config_get8(handle, PCI_CONF_REVID); 2457 2458 /* 2459 * Turn on Bus Master Enable bit and ensure the device is not asleep 2460 */ 2461 regval = pci_config_get32(handle, PCI_CONF_COMM); 2462 pci_config_put32(handle, PCI_CONF_COMM, (regval | PCI_COMM_ME)); 2463 2464 regval = pci_config_get32(handle, PCI_DMFE_CONF_CFDD); 2465 pci_config_put32(handle, PCI_DMFE_CONF_CFDD, 2466 regval & ~(CFDD_SLEEP | CFDD_SNOOZE)); 2467 2468 pci_config_teardown(&handle); 2469 return (DDI_SUCCESS); 2470 } 2471 2472 struct ks_index { 2473 int index; 2474 char *name; 2475 }; 2476 2477 static const struct ks_index ks_drv_names[] = { 2478 { KS_INTERRUPT, "intr" }, 2479 { KS_CYCLIC_RUN, "cyclic_run" }, 2480 2481 { KS_TX_STALL, "tx_stall_detect" }, 2482 { KS_CHIP_ERROR, "chip_error_interrupt" }, 2483 2484 { KS_FACTOTUM_RUN, "factotum_run" }, 2485 { KS_RECOVERY, "factotum_recover" }, 2486 2487 { -1, NULL } 2488 }; 2489 2490 static void 2491 dmfe_init_kstats(dmfe_t *dmfep, int instance) 2492 { 2493 kstat_t *ksp; 2494 kstat_named_t *knp; 2495 const struct ks_index *ksip; 2496 2497 /* no need to create MII stats, the mac module already does it */ 2498 2499 /* Create and initialise driver-defined kstats */ 2500 ksp = kstat_create(DRIVER_NAME, instance, "dmfe_events", "net", 2501 KSTAT_TYPE_NAMED, KS_DRV_COUNT, KSTAT_FLAG_PERSISTENT); 2502 if (ksp != NULL) { 2503 for (knp = ksp->ks_data, ksip = ks_drv_names; 2504 ksip->name != NULL; ++ksip) { 2505 kstat_named_init(&knp[ksip->index], ksip->name, 2506 KSTAT_DATA_UINT64); 2507 } 2508 dmfep->ksp_drv = ksp; 2509 dmfep->knp_drv = knp; 2510 kstat_install(ksp); 2511 } else { 2512 dmfe_error(dmfep, "kstat_create() for dmfe_events failed"); 2513 } 2514 } 2515 2516 static int 2517 dmfe_resume(dev_info_t *devinfo) 2518 { 2519 dmfe_t *dmfep; /* Our private data */ 2520 chip_id_t chipid; 2521 boolean_t restart = B_FALSE; 2522 2523 dmfep = ddi_get_driver_private(devinfo); 2524 if (dmfep == NULL) 2525 return (DDI_FAILURE); 2526 2527 /* 2528 * Refuse to resume if the data structures aren't consistent 2529 */ 2530 if (dmfep->devinfo != devinfo) 2531 return (DDI_FAILURE); 2532 2533 /* 2534 * Refuse to resume if the chip's changed its identity (*boggle*) 2535 */ 2536 if (dmfe_config_init(dmfep, &chipid) != DDI_SUCCESS) 2537 return (DDI_FAILURE); 2538 if (chipid.vendor != dmfep->chipid.vendor) 2539 return (DDI_FAILURE); 2540 if (chipid.device != dmfep->chipid.device) 2541 return (DDI_FAILURE); 2542 if (chipid.revision != dmfep->chipid.revision) 2543 return (DDI_FAILURE); 2544 2545 mutex_enter(dmfep->oplock); 2546 mutex_enter(dmfep->txlock); 2547 dmfep->suspended = B_FALSE; 2548 mutex_exit(dmfep->txlock); 2549 2550 /* 2551 * All OK, reinitialise h/w & kick off MAC scheduling 2552 */ 2553 if (dmfep->mac_state == DMFE_MAC_STARTED) { 2554 dmfe_restart(dmfep); 2555 restart = B_TRUE; 2556 } 2557 mutex_exit(dmfep->oplock); 2558 2559 if (restart) { 2560 mii_resume(dmfep->mii); 2561 mac_tx_update(dmfep->mh); 2562 } 2563 return (DDI_SUCCESS); 2564 } 2565 2566 /* 2567 * attach(9E) -- Attach a device to the system 2568 * 2569 * Called once for each board successfully probed. 2570 */ 2571 static int 2572 dmfe_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd) 2573 { 2574 mac_register_t *macp; 2575 dmfe_t *dmfep; /* Our private data */ 2576 uint32_t csr6; 2577 int instance; 2578 int err; 2579 2580 instance = ddi_get_instance(devinfo); 2581 2582 switch (cmd) { 2583 default: 2584 return (DDI_FAILURE); 2585 2586 case DDI_RESUME: 2587 return (dmfe_resume(devinfo)); 2588 2589 case DDI_ATTACH: 2590 break; 2591 } 2592 2593 dmfep = kmem_zalloc(sizeof (*dmfep), KM_SLEEP); 2594 ddi_set_driver_private(devinfo, dmfep); 2595 dmfep->devinfo = devinfo; 2596 dmfep->dmfe_guard = DMFE_GUARD; 2597 2598 /* 2599 * Initialize more fields in DMFE private data 2600 * Determine the local MAC address 2601 */ 2602 #if DMFEDEBUG 2603 dmfep->debug = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, 0, 2604 debug_propname, dmfe_debug); 2605 #endif /* DMFEDEBUG */ 2606 dmfep->cycid = NULL; 2607 (void) snprintf(dmfep->ifname, sizeof (dmfep->ifname), "dmfe%d", 2608 instance); 2609 2610 /* 2611 * Check for custom "opmode-reg-value" property; 2612 * if none, use the defaults below for CSR6 ... 2613 */ 2614 csr6 = TX_THRESHOLD_HI | STORE_AND_FORWARD | EXT_MII_IF | OPN_25_MB1; 2615 dmfep->opmode = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, 2616 DDI_PROP_DONTPASS, opmode_propname, csr6); 2617 2618 /* 2619 * Read chip ID & set up config space command register(s) 2620 */ 2621 if (dmfe_config_init(dmfep, &dmfep->chipid) != DDI_SUCCESS) { 2622 dmfe_error(dmfep, "dmfe_config_init() failed"); 2623 goto attach_fail; 2624 } 2625 2626 /* 2627 * Map operating registers 2628 */ 2629 err = ddi_regs_map_setup(devinfo, DMFE_PCI_RNUMBER, 2630 &dmfep->io_reg, 0, 0, &dmfe_reg_accattr, &dmfep->io_handle); 2631 if (err != DDI_SUCCESS) { 2632 dmfe_error(dmfep, "ddi_regs_map_setup() failed"); 2633 goto attach_fail; 2634 } 2635 2636 /* 2637 * Get our MAC address. 2638 */ 2639 dmfe_find_mac_address(dmfep); 2640 2641 /* 2642 * Allocate the TX and RX descriptors/buffers. 2643 */ 2644 dmfep->tx.n_desc = dmfe_tx_desc; 2645 dmfep->rx.n_desc = dmfe_rx_desc; 2646 err = dmfe_alloc_bufs(dmfep); 2647 if (err != DDI_SUCCESS) { 2648 goto attach_fail; 2649 } 2650 2651 /* 2652 * Add the softint handler 2653 */ 2654 if (ddi_add_softintr(devinfo, DDI_SOFTINT_LOW, &dmfep->factotum_id, 2655 NULL, NULL, dmfe_factotum, (caddr_t)dmfep) != DDI_SUCCESS) { 2656 dmfe_error(dmfep, "ddi_add_softintr() failed"); 2657 goto attach_fail; 2658 } 2659 dmfep->progress |= PROGRESS_SOFTINT; 2660 2661 /* 2662 * Add the h/w interrupt handler & initialise mutexen 2663 */ 2664 if (ddi_get_iblock_cookie(devinfo, 0, &dmfep->iblk) != DDI_SUCCESS) { 2665 dmfe_error(dmfep, "ddi_get_iblock_cookie() failed"); 2666 goto attach_fail; 2667 } 2668 2669 mutex_init(dmfep->milock, NULL, MUTEX_DRIVER, NULL); 2670 mutex_init(dmfep->oplock, NULL, MUTEX_DRIVER, dmfep->iblk); 2671 mutex_init(dmfep->rxlock, NULL, MUTEX_DRIVER, dmfep->iblk); 2672 mutex_init(dmfep->txlock, NULL, MUTEX_DRIVER, dmfep->iblk); 2673 dmfep->progress |= PROGRESS_MUTEX; 2674 2675 if (ddi_add_intr(devinfo, 0, NULL, NULL, 2676 dmfe_interrupt, (caddr_t)dmfep) != DDI_SUCCESS) { 2677 dmfe_error(dmfep, "ddi_add_intr() failed"); 2678 goto attach_fail; 2679 } 2680 dmfep->progress |= PROGRESS_HWINT; 2681 2682 /* 2683 * Create & initialise named kstats 2684 */ 2685 dmfe_init_kstats(dmfep, instance); 2686 2687 /* 2688 * Reset & initialise the chip and the ring buffers 2689 * Initialise the (internal) PHY 2690 */ 2691 mutex_enter(dmfep->oplock); 2692 mutex_enter(dmfep->rxlock); 2693 mutex_enter(dmfep->txlock); 2694 2695 dmfe_reset(dmfep); 2696 2697 /* 2698 * Prepare the setup packet 2699 */ 2700 bzero(dmfep->tx_desc.setup_va, SETUPBUF_SIZE); 2701 bzero(dmfep->mcast_refs, MCASTBUF_SIZE); 2702 dmfep->addr_set = B_FALSE; 2703 dmfep->opmode &= ~(PROMISC_MODE | PASS_MULTICAST); 2704 dmfep->mac_state = DMFE_MAC_RESET; 2705 2706 mutex_exit(dmfep->txlock); 2707 mutex_exit(dmfep->rxlock); 2708 mutex_exit(dmfep->oplock); 2709 2710 if (dmfe_init_phy(dmfep) != B_TRUE) 2711 goto attach_fail; 2712 2713 /* 2714 * Send a reasonable setup frame. This configures our starting 2715 * address and the broadcast address. 2716 */ 2717 (void) dmfe_m_unicst(dmfep, dmfep->curr_addr); 2718 2719 /* 2720 * Initialize pointers to device specific functions which 2721 * will be used by the generic layer. 2722 */ 2723 if ((macp = mac_alloc(MAC_VERSION)) == NULL) 2724 goto attach_fail; 2725 macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER; 2726 macp->m_driver = dmfep; 2727 macp->m_dip = devinfo; 2728 macp->m_src_addr = dmfep->curr_addr; 2729 macp->m_callbacks = &dmfe_m_callbacks; 2730 macp->m_min_sdu = 0; 2731 macp->m_max_sdu = ETHERMTU; 2732 macp->m_margin = VLAN_TAGSZ; 2733 2734 /* 2735 * Finally, we're ready to register ourselves with the MAC layer 2736 * interface; if this succeeds, we're all ready to start() 2737 */ 2738 err = mac_register(macp, &dmfep->mh); 2739 mac_free(macp); 2740 if (err != 0) 2741 goto attach_fail; 2742 ASSERT(dmfep->dmfe_guard == DMFE_GUARD); 2743 2744 /* 2745 * Install the cyclic callback that we use to check for link 2746 * status, transmit stall, etc. The cyclic callback (dmfe_cyclic()) 2747 * is invoked in kernel context then. 2748 */ 2749 ASSERT(dmfep->cycid == NULL); 2750 dmfep->cycid = ddi_periodic_add(dmfe_cyclic, dmfep, 2751 dmfe_tick_us * 1000, DDI_IPL_0); 2752 return (DDI_SUCCESS); 2753 2754 attach_fail: 2755 dmfe_unattach(dmfep); 2756 return (DDI_FAILURE); 2757 } 2758 2759 /* 2760 * dmfe_suspend() -- suspend transmit/receive for powerdown 2761 */ 2762 static int 2763 dmfe_suspend(dmfe_t *dmfep) 2764 { 2765 /* 2766 * Just stop processing ... 2767 */ 2768 mii_suspend(dmfep->mii); 2769 mutex_enter(dmfep->oplock); 2770 dmfe_stop(dmfep); 2771 2772 mutex_enter(dmfep->txlock); 2773 dmfep->suspended = B_TRUE; 2774 mutex_exit(dmfep->txlock); 2775 mutex_exit(dmfep->oplock); 2776 2777 return (DDI_SUCCESS); 2778 } 2779 2780 /* 2781 * detach(9E) -- Detach a device from the system 2782 */ 2783 static int 2784 dmfe_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd) 2785 { 2786 dmfe_t *dmfep; 2787 2788 dmfep = ddi_get_driver_private(devinfo); 2789 2790 switch (cmd) { 2791 default: 2792 return (DDI_FAILURE); 2793 2794 case DDI_SUSPEND: 2795 return (dmfe_suspend(dmfep)); 2796 2797 case DDI_DETACH: 2798 break; 2799 } 2800 2801 /* 2802 * Unregister from the MAC subsystem. This can fail, in 2803 * particular if there are DLPI style-2 streams still open - 2804 * in which case we just return failure without shutting 2805 * down chip operations. 2806 */ 2807 if (mac_unregister(dmfep->mh) != DDI_SUCCESS) 2808 return (DDI_FAILURE); 2809 2810 /* 2811 * All activity stopped, so we can clean up & exit 2812 */ 2813 dmfe_unattach(dmfep); 2814 return (DDI_SUCCESS); 2815 } 2816 2817 2818 /* 2819 * ========== Module Loading Data & Entry Points ========== 2820 */ 2821 2822 DDI_DEFINE_STREAM_OPS(dmfe_dev_ops, nulldev, nulldev, dmfe_attach, dmfe_detach, 2823 nodev, NULL, D_MP, NULL, ddi_quiesce_not_supported); 2824 2825 static struct modldrv dmfe_modldrv = { 2826 &mod_driverops, /* Type of module. This one is a driver */ 2827 dmfe_ident, /* short description */ 2828 &dmfe_dev_ops /* driver specific ops */ 2829 }; 2830 2831 static struct modlinkage modlinkage = { 2832 MODREV_1, { (void *)&dmfe_modldrv, NULL } 2833 }; 2834 2835 int 2836 _info(struct modinfo *modinfop) 2837 { 2838 return (mod_info(&modlinkage, modinfop)); 2839 } 2840 2841 int 2842 _init(void) 2843 { 2844 uint32_t tmp100; 2845 uint32_t tmp10; 2846 int i; 2847 int status; 2848 2849 /* Calculate global timing parameters */ 2850 tmp100 = (dmfe_tx100_stall_us+dmfe_tick_us-1)/dmfe_tick_us; 2851 tmp10 = (dmfe_tx10_stall_us+dmfe_tick_us-1)/dmfe_tick_us; 2852 2853 for (i = 0; i <= TX_PROCESS_MAX_STATE; ++i) { 2854 switch (i) { 2855 case TX_PROCESS_STATE(TX_PROCESS_FETCH_DATA): 2856 case TX_PROCESS_STATE(TX_PROCESS_WAIT_END): 2857 /* 2858 * The chip doesn't spontaneously recover from 2859 * a stall in these states, so we reset early 2860 */ 2861 stall_100_tix[i] = tmp100; 2862 stall_10_tix[i] = tmp10; 2863 break; 2864 2865 case TX_PROCESS_STATE(TX_PROCESS_SUSPEND): 2866 default: 2867 /* 2868 * The chip has been seen to spontaneously recover 2869 * after an apparent stall in the SUSPEND state, 2870 * so we'll allow it rather longer to do so. As 2871 * stalls in other states have not been observed, 2872 * we'll use long timeouts for them too ... 2873 */ 2874 stall_100_tix[i] = tmp100 * 20; 2875 stall_10_tix[i] = tmp10 * 20; 2876 break; 2877 } 2878 } 2879 2880 mac_init_ops(&dmfe_dev_ops, "dmfe"); 2881 status = mod_install(&modlinkage); 2882 if (status == DDI_SUCCESS) 2883 dmfe_log_init(); 2884 2885 return (status); 2886 } 2887 2888 int 2889 _fini(void) 2890 { 2891 int status; 2892 2893 status = mod_remove(&modlinkage); 2894 if (status == DDI_SUCCESS) { 2895 mac_fini_ops(&dmfe_dev_ops); 2896 dmfe_log_fini(); 2897 } 2898 2899 return (status); 2900 }