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 #include "rge.h" 27 28 /* 29 * This is the string displayed by modinfo, etc. 30 * Make sure you keep the version ID up to date! 31 */ 32 static char rge_ident[] = "Realtek 1Gb Ethernet"; 33 34 /* 35 * Used for buffers allocated by ddi_dma_mem_alloc() 36 */ 37 static ddi_dma_attr_t dma_attr_buf = { 38 DMA_ATTR_V0, /* dma_attr version */ 39 (uint32_t)0, /* dma_attr_addr_lo */ 40 (uint32_t)0xFFFFFFFF, /* dma_attr_addr_hi */ 41 (uint32_t)0xFFFFFFFF, /* dma_attr_count_max */ 42 (uint32_t)16, /* dma_attr_align */ 43 0xFFFFFFFF, /* dma_attr_burstsizes */ 44 1, /* dma_attr_minxfer */ 45 (uint32_t)0xFFFFFFFF, /* dma_attr_maxxfer */ 46 (uint32_t)0xFFFFFFFF, /* dma_attr_seg */ 47 1, /* dma_attr_sgllen */ 48 1, /* dma_attr_granular */ 49 0, /* dma_attr_flags */ 50 }; 51 52 /* 53 * Used for BDs allocated by ddi_dma_mem_alloc() 54 */ 55 static ddi_dma_attr_t dma_attr_desc = { 56 DMA_ATTR_V0, /* dma_attr version */ 57 (uint32_t)0, /* dma_attr_addr_lo */ 58 (uint32_t)0xFFFFFFFF, /* dma_attr_addr_hi */ 59 (uint32_t)0xFFFFFFFF, /* dma_attr_count_max */ 60 (uint32_t)256, /* dma_attr_align */ 61 0xFFFFFFFF, /* dma_attr_burstsizes */ 62 1, /* dma_attr_minxfer */ 63 (uint32_t)0xFFFFFFFF, /* dma_attr_maxxfer */ 64 (uint32_t)0xFFFFFFFF, /* dma_attr_seg */ 65 1, /* dma_attr_sgllen */ 66 1, /* dma_attr_granular */ 67 0, /* dma_attr_flags */ 68 }; 69 70 /* 71 * PIO access attributes for registers 72 */ 73 static ddi_device_acc_attr_t rge_reg_accattr = { 74 DDI_DEVICE_ATTR_V0, 75 DDI_STRUCTURE_LE_ACC, 76 DDI_STRICTORDER_ACC, 77 DDI_DEFAULT_ACC 78 }; 79 80 /* 81 * DMA access attributes for descriptors 82 */ 83 static ddi_device_acc_attr_t rge_desc_accattr = { 84 DDI_DEVICE_ATTR_V0, 85 DDI_NEVERSWAP_ACC, 86 DDI_STRICTORDER_ACC, 87 DDI_DEFAULT_ACC 88 }; 89 90 /* 91 * DMA access attributes for data 92 */ 93 static ddi_device_acc_attr_t rge_buf_accattr = { 94 DDI_DEVICE_ATTR_V0, 95 DDI_NEVERSWAP_ACC, 96 DDI_STRICTORDER_ACC, 97 DDI_DEFAULT_ACC 98 }; 99 100 /* 101 * Property names 102 */ 103 static char debug_propname[] = "rge_debug_flags"; 104 static char mtu_propname[] = "default_mtu"; 105 static char msi_propname[] = "msi_enable"; 106 107 static int rge_m_start(void *); 108 static void rge_m_stop(void *); 109 static int rge_m_promisc(void *, boolean_t); 110 static int rge_m_multicst(void *, boolean_t, const uint8_t *); 111 static int rge_m_unicst(void *, const uint8_t *); 112 static void rge_m_ioctl(void *, queue_t *, mblk_t *); 113 static boolean_t rge_m_getcapab(void *, mac_capab_t, void *); 114 115 #define RGE_M_CALLBACK_FLAGS (MC_IOCTL | MC_GETCAPAB) 116 117 static mac_callbacks_t rge_m_callbacks = { 118 RGE_M_CALLBACK_FLAGS, 119 rge_m_stat, 120 rge_m_start, 121 rge_m_stop, 122 rge_m_promisc, 123 rge_m_multicst, 124 rge_m_unicst, 125 rge_m_tx, 126 NULL, 127 rge_m_ioctl, 128 rge_m_getcapab 129 }; 130 131 /* 132 * Allocate an area of memory and a DMA handle for accessing it 133 */ 134 static int 135 rge_alloc_dma_mem(rge_t *rgep, size_t memsize, ddi_dma_attr_t *dma_attr_p, 136 ddi_device_acc_attr_t *acc_attr_p, uint_t dma_flags, dma_area_t *dma_p) 137 { 138 caddr_t vaddr; 139 int err; 140 141 /* 142 * Allocate handle 143 */ 144 err = ddi_dma_alloc_handle(rgep->devinfo, dma_attr_p, 145 DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl); 146 if (err != DDI_SUCCESS) { 147 dma_p->dma_hdl = NULL; 148 return (DDI_FAILURE); 149 } 150 151 /* 152 * Allocate memory 153 */ 154 err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize, acc_attr_p, 155 dma_flags & (DDI_DMA_CONSISTENT | DDI_DMA_STREAMING), 156 DDI_DMA_SLEEP, NULL, &vaddr, &dma_p->alength, &dma_p->acc_hdl); 157 if (err != DDI_SUCCESS) { 158 ddi_dma_free_handle(&dma_p->dma_hdl); 159 dma_p->dma_hdl = NULL; 160 dma_p->acc_hdl = NULL; 161 return (DDI_FAILURE); 162 } 163 164 /* 165 * Bind the two together 166 */ 167 dma_p->mem_va = vaddr; 168 err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL, 169 vaddr, dma_p->alength, dma_flags, DDI_DMA_SLEEP, NULL, 170 &dma_p->cookie, &dma_p->ncookies); 171 if (err != DDI_DMA_MAPPED || dma_p->ncookies != 1) { 172 ddi_dma_mem_free(&dma_p->acc_hdl); 173 ddi_dma_free_handle(&dma_p->dma_hdl); 174 dma_p->acc_hdl = NULL; 175 dma_p->dma_hdl = NULL; 176 return (DDI_FAILURE); 177 } 178 179 dma_p->nslots = ~0U; 180 dma_p->size = ~0U; 181 dma_p->token = ~0U; 182 dma_p->offset = 0; 183 return (DDI_SUCCESS); 184 } 185 186 /* 187 * Free one allocated area of DMAable memory 188 */ 189 static void 190 rge_free_dma_mem(dma_area_t *dma_p) 191 { 192 if (dma_p->dma_hdl != NULL) { 193 if (dma_p->ncookies) { 194 (void) ddi_dma_unbind_handle(dma_p->dma_hdl); 195 dma_p->ncookies = 0; 196 } 197 ddi_dma_free_handle(&dma_p->dma_hdl); 198 dma_p->dma_hdl = NULL; 199 } 200 201 if (dma_p->acc_hdl != NULL) { 202 ddi_dma_mem_free(&dma_p->acc_hdl); 203 dma_p->acc_hdl = NULL; 204 } 205 } 206 207 /* 208 * Utility routine to carve a slice off a chunk of allocated memory, 209 * updating the chunk descriptor accordingly. The size of the slice 210 * is given by the product of the <qty> and <size> parameters. 211 */ 212 static void 213 rge_slice_chunk(dma_area_t *slice, dma_area_t *chunk, 214 uint32_t qty, uint32_t size) 215 { 216 static uint32_t sequence = 0xbcd5704a; 217 size_t totsize; 218 219 totsize = qty*size; 220 ASSERT(totsize <= chunk->alength); 221 222 *slice = *chunk; 223 slice->nslots = qty; 224 slice->size = size; 225 slice->alength = totsize; 226 slice->token = ++sequence; 227 228 chunk->mem_va = (caddr_t)chunk->mem_va + totsize; 229 chunk->alength -= totsize; 230 chunk->offset += totsize; 231 chunk->cookie.dmac_laddress += totsize; 232 chunk->cookie.dmac_size -= totsize; 233 } 234 235 static int 236 rge_alloc_bufs(rge_t *rgep) 237 { 238 size_t txdescsize; 239 size_t rxdescsize; 240 int err; 241 242 /* 243 * Allocate memory & handle for packet statistics 244 */ 245 err = rge_alloc_dma_mem(rgep, 246 RGE_STATS_DUMP_SIZE, 247 &dma_attr_desc, 248 &rge_desc_accattr, 249 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 250 &rgep->dma_area_stats); 251 if (err != DDI_SUCCESS) 252 return (DDI_FAILURE); 253 rgep->hw_stats = DMA_VPTR(rgep->dma_area_stats); 254 255 /* 256 * Allocate memory & handle for Tx descriptor ring 257 */ 258 txdescsize = RGE_SEND_SLOTS * sizeof (rge_bd_t); 259 err = rge_alloc_dma_mem(rgep, 260 txdescsize, 261 &dma_attr_desc, 262 &rge_desc_accattr, 263 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 264 &rgep->dma_area_txdesc); 265 if (err != DDI_SUCCESS) 266 return (DDI_FAILURE); 267 268 /* 269 * Allocate memory & handle for Rx descriptor ring 270 */ 271 rxdescsize = RGE_RECV_SLOTS * sizeof (rge_bd_t); 272 err = rge_alloc_dma_mem(rgep, 273 rxdescsize, 274 &dma_attr_desc, 275 &rge_desc_accattr, 276 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 277 &rgep->dma_area_rxdesc); 278 if (err != DDI_SUCCESS) 279 return (DDI_FAILURE); 280 281 return (DDI_SUCCESS); 282 } 283 284 /* 285 * rge_free_bufs() -- free descriptors/buffers allocated for this 286 * device instance. 287 */ 288 static void 289 rge_free_bufs(rge_t *rgep) 290 { 291 rge_free_dma_mem(&rgep->dma_area_stats); 292 rge_free_dma_mem(&rgep->dma_area_txdesc); 293 rge_free_dma_mem(&rgep->dma_area_rxdesc); 294 } 295 296 /* 297 * ========== Transmit and receive ring reinitialisation ========== 298 */ 299 300 /* 301 * These <reinit> routines each reset the rx/tx rings to an initial 302 * state, assuming that the corresponding <init> routine has already 303 * been called exactly once. 304 */ 305 static void 306 rge_reinit_send_ring(rge_t *rgep) 307 { 308 sw_sbd_t *ssbdp; 309 rge_bd_t *bdp; 310 uint32_t slot; 311 312 /* 313 * re-init send ring 314 */ 315 DMA_ZERO(rgep->tx_desc); 316 ssbdp = rgep->sw_sbds; 317 bdp = rgep->tx_ring; 318 for (slot = 0; slot < RGE_SEND_SLOTS; slot++) { 319 bdp->host_buf_addr = 320 RGE_BSWAP_32(ssbdp->pbuf.cookie.dmac_laddress); 321 bdp->host_buf_addr_hi = 322 RGE_BSWAP_32(ssbdp->pbuf.cookie.dmac_laddress >> 32); 323 /* last BD in Tx ring */ 324 if (slot == (RGE_SEND_SLOTS - 1)) 325 bdp->flags_len = RGE_BSWAP_32(BD_FLAG_EOR); 326 ssbdp++; 327 bdp++; 328 } 329 DMA_SYNC(rgep->tx_desc, DDI_DMA_SYNC_FORDEV); 330 rgep->tx_next = 0; 331 rgep->tc_next = 0; 332 rgep->tc_tail = 0; 333 rgep->tx_flow = 0; 334 rgep->tx_free = RGE_SEND_SLOTS; 335 } 336 337 static void 338 rge_reinit_recv_ring(rge_t *rgep) 339 { 340 rge_bd_t *bdp; 341 sw_rbd_t *srbdp; 342 dma_area_t *pbuf; 343 uint32_t slot; 344 345 /* 346 * re-init receive ring 347 */ 348 DMA_ZERO(rgep->rx_desc); 349 srbdp = rgep->sw_rbds; 350 bdp = rgep->rx_ring; 351 for (slot = 0; slot < RGE_RECV_SLOTS; slot++) { 352 pbuf = &srbdp->rx_buf->pbuf; 353 bdp->host_buf_addr = 354 RGE_BSWAP_32(pbuf->cookie.dmac_laddress + rgep->head_room); 355 bdp->host_buf_addr_hi = 356 RGE_BSWAP_32(pbuf->cookie.dmac_laddress >> 32); 357 bdp->flags_len = RGE_BSWAP_32(BD_FLAG_HW_OWN | 358 (rgep->rxbuf_size - rgep->head_room)); 359 /* last BD in Tx ring */ 360 if (slot == (RGE_RECV_SLOTS - 1)) 361 bdp->flags_len |= RGE_BSWAP_32(BD_FLAG_EOR); 362 srbdp++; 363 bdp++; 364 } 365 DMA_SYNC(rgep->rx_desc, DDI_DMA_SYNC_FORDEV); 366 rgep->watchdog = 0; 367 rgep->rx_next = 0; 368 } 369 370 static void 371 rge_reinit_buf_ring(rge_t *rgep) 372 { 373 374 if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY) 375 return; 376 377 /* 378 * If all the up-sending buffers haven't been returned to driver, 379 * use bcopy() only in rx process. 380 */ 381 if (rgep->rx_free != RGE_BUF_SLOTS) 382 rgep->rx_bcopy = B_TRUE; 383 } 384 385 static void 386 rge_reinit_rings(rge_t *rgep) 387 { 388 rge_reinit_send_ring(rgep); 389 rge_reinit_recv_ring(rgep); 390 rge_reinit_buf_ring(rgep); 391 } 392 393 static void 394 rge_fini_send_ring(rge_t *rgep) 395 { 396 sw_sbd_t *ssbdp; 397 uint32_t slot; 398 399 ssbdp = rgep->sw_sbds; 400 for (slot = 0; slot < RGE_SEND_SLOTS; ++slot) { 401 rge_free_dma_mem(&ssbdp->pbuf); 402 ssbdp++; 403 } 404 405 kmem_free(rgep->sw_sbds, RGE_SEND_SLOTS * sizeof (sw_sbd_t)); 406 rgep->sw_sbds = NULL; 407 } 408 409 static void 410 rge_fini_recv_ring(rge_t *rgep) 411 { 412 sw_rbd_t *srbdp; 413 uint32_t slot; 414 415 srbdp = rgep->sw_rbds; 416 for (slot = 0; slot < RGE_RECV_SLOTS; ++srbdp, ++slot) { 417 if (srbdp->rx_buf) { 418 if (srbdp->rx_buf->mp != NULL) { 419 freemsg(srbdp->rx_buf->mp); 420 srbdp->rx_buf->mp = NULL; 421 } 422 rge_free_dma_mem(&srbdp->rx_buf->pbuf); 423 kmem_free(srbdp->rx_buf, sizeof (dma_buf_t)); 424 srbdp->rx_buf = NULL; 425 } 426 } 427 428 kmem_free(rgep->sw_rbds, RGE_RECV_SLOTS * sizeof (sw_rbd_t)); 429 rgep->sw_rbds = NULL; 430 } 431 432 static void 433 rge_fini_buf_ring(rge_t *rgep) 434 { 435 sw_rbd_t *srbdp; 436 uint32_t slot; 437 438 if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY) 439 return; 440 441 ASSERT(rgep->rx_free == RGE_BUF_SLOTS); 442 443 srbdp = rgep->free_srbds; 444 for (slot = 0; slot < RGE_BUF_SLOTS; ++srbdp, ++slot) { 445 if (srbdp->rx_buf != NULL) { 446 if (srbdp->rx_buf->mp != NULL) { 447 freemsg(srbdp->rx_buf->mp); 448 srbdp->rx_buf->mp = NULL; 449 } 450 rge_free_dma_mem(&srbdp->rx_buf->pbuf); 451 kmem_free(srbdp->rx_buf, sizeof (dma_buf_t)); 452 srbdp->rx_buf = NULL; 453 } 454 } 455 456 kmem_free(rgep->free_srbds, RGE_BUF_SLOTS * sizeof (sw_rbd_t)); 457 rgep->free_srbds = NULL; 458 } 459 460 static void 461 rge_fini_rings(rge_t *rgep) 462 { 463 rge_fini_send_ring(rgep); 464 rge_fini_recv_ring(rgep); 465 rge_fini_buf_ring(rgep); 466 } 467 468 static int 469 rge_init_send_ring(rge_t *rgep) 470 { 471 uint32_t slot; 472 sw_sbd_t *ssbdp; 473 dma_area_t *pbuf; 474 dma_area_t desc; 475 int err; 476 477 /* 478 * Allocate the array of s/w Tx Buffer Descriptors 479 */ 480 ssbdp = kmem_zalloc(RGE_SEND_SLOTS*sizeof (*ssbdp), KM_SLEEP); 481 rgep->sw_sbds = ssbdp; 482 483 /* 484 * Init send ring 485 */ 486 rgep->tx_desc = rgep->dma_area_txdesc; 487 DMA_ZERO(rgep->tx_desc); 488 rgep->tx_ring = rgep->tx_desc.mem_va; 489 490 desc = rgep->tx_desc; 491 for (slot = 0; slot < RGE_SEND_SLOTS; slot++) { 492 rge_slice_chunk(&ssbdp->desc, &desc, 1, sizeof (rge_bd_t)); 493 494 /* 495 * Allocate memory & handle for Tx buffers 496 */ 497 pbuf = &ssbdp->pbuf; 498 err = rge_alloc_dma_mem(rgep, rgep->txbuf_size, 499 &dma_attr_buf, &rge_buf_accattr, 500 DDI_DMA_WRITE | DDI_DMA_STREAMING, pbuf); 501 if (err != DDI_SUCCESS) { 502 rge_error(rgep, 503 "rge_init_send_ring: alloc tx buffer failed"); 504 rge_fini_send_ring(rgep); 505 return (DDI_FAILURE); 506 } 507 ssbdp++; 508 } 509 ASSERT(desc.alength == 0); 510 511 DMA_SYNC(rgep->tx_desc, DDI_DMA_SYNC_FORDEV); 512 return (DDI_SUCCESS); 513 } 514 515 static int 516 rge_init_recv_ring(rge_t *rgep) 517 { 518 uint32_t slot; 519 sw_rbd_t *srbdp; 520 dma_buf_t *rx_buf; 521 dma_area_t *pbuf; 522 int err; 523 524 /* 525 * Allocate the array of s/w Rx Buffer Descriptors 526 */ 527 srbdp = kmem_zalloc(RGE_RECV_SLOTS*sizeof (*srbdp), KM_SLEEP); 528 rgep->sw_rbds = srbdp; 529 530 /* 531 * Init receive ring 532 */ 533 rgep->rx_next = 0; 534 rgep->rx_desc = rgep->dma_area_rxdesc; 535 DMA_ZERO(rgep->rx_desc); 536 rgep->rx_ring = rgep->rx_desc.mem_va; 537 538 for (slot = 0; slot < RGE_RECV_SLOTS; slot++) { 539 srbdp->rx_buf = rx_buf = 540 kmem_zalloc(sizeof (dma_buf_t), KM_SLEEP); 541 542 /* 543 * Allocate memory & handle for Rx buffers 544 */ 545 pbuf = &rx_buf->pbuf; 546 err = rge_alloc_dma_mem(rgep, rgep->rxbuf_size, 547 &dma_attr_buf, &rge_buf_accattr, 548 DDI_DMA_READ | DDI_DMA_STREAMING, pbuf); 549 if (err != DDI_SUCCESS) { 550 rge_fini_recv_ring(rgep); 551 rge_error(rgep, 552 "rge_init_recv_ring: alloc rx buffer failed"); 553 return (DDI_FAILURE); 554 } 555 556 pbuf->alength -= rgep->head_room; 557 pbuf->offset += rgep->head_room; 558 if (!(rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY)) { 559 rx_buf->rx_recycle.free_func = rge_rx_recycle; 560 rx_buf->rx_recycle.free_arg = (caddr_t)rx_buf; 561 rx_buf->private = (caddr_t)rgep; 562 rx_buf->mp = desballoc(DMA_VPTR(rx_buf->pbuf), 563 rgep->rxbuf_size, 0, &rx_buf->rx_recycle); 564 if (rx_buf->mp == NULL) { 565 rge_fini_recv_ring(rgep); 566 rge_problem(rgep, 567 "rge_init_recv_ring: desballoc() failed"); 568 return (DDI_FAILURE); 569 } 570 } 571 srbdp++; 572 } 573 DMA_SYNC(rgep->rx_desc, DDI_DMA_SYNC_FORDEV); 574 return (DDI_SUCCESS); 575 } 576 577 static int 578 rge_init_buf_ring(rge_t *rgep) 579 { 580 uint32_t slot; 581 sw_rbd_t *free_srbdp; 582 dma_buf_t *rx_buf; 583 dma_area_t *pbuf; 584 int err; 585 586 if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY) { 587 rgep->rx_bcopy = B_TRUE; 588 return (DDI_SUCCESS); 589 } 590 591 /* 592 * Allocate the array of s/w free Buffer Descriptors 593 */ 594 free_srbdp = kmem_zalloc(RGE_BUF_SLOTS*sizeof (*free_srbdp), KM_SLEEP); 595 rgep->free_srbds = free_srbdp; 596 597 /* 598 * Init free buffer ring 599 */ 600 rgep->rc_next = 0; 601 rgep->rf_next = 0; 602 rgep->rx_bcopy = B_FALSE; 603 rgep->rx_free = RGE_BUF_SLOTS; 604 for (slot = 0; slot < RGE_BUF_SLOTS; slot++) { 605 free_srbdp->rx_buf = rx_buf = 606 kmem_zalloc(sizeof (dma_buf_t), KM_SLEEP); 607 608 /* 609 * Allocate memory & handle for free Rx buffers 610 */ 611 pbuf = &rx_buf->pbuf; 612 err = rge_alloc_dma_mem(rgep, rgep->rxbuf_size, 613 &dma_attr_buf, &rge_buf_accattr, 614 DDI_DMA_READ | DDI_DMA_STREAMING, pbuf); 615 if (err != DDI_SUCCESS) { 616 rge_fini_buf_ring(rgep); 617 rge_error(rgep, 618 "rge_init_buf_ring: alloc rx free buffer failed"); 619 return (DDI_FAILURE); 620 } 621 pbuf->alength -= rgep->head_room; 622 pbuf->offset += rgep->head_room; 623 rx_buf->rx_recycle.free_func = rge_rx_recycle; 624 rx_buf->rx_recycle.free_arg = (caddr_t)rx_buf; 625 rx_buf->private = (caddr_t)rgep; 626 rx_buf->mp = desballoc(DMA_VPTR(rx_buf->pbuf), 627 rgep->rxbuf_size, 0, &rx_buf->rx_recycle); 628 if (rx_buf->mp == NULL) { 629 rge_fini_buf_ring(rgep); 630 rge_problem(rgep, 631 "rge_init_buf_ring: desballoc() failed"); 632 return (DDI_FAILURE); 633 } 634 free_srbdp++; 635 } 636 return (DDI_SUCCESS); 637 } 638 639 static int 640 rge_init_rings(rge_t *rgep) 641 { 642 int err; 643 644 err = rge_init_send_ring(rgep); 645 if (err != DDI_SUCCESS) 646 return (DDI_FAILURE); 647 648 err = rge_init_recv_ring(rgep); 649 if (err != DDI_SUCCESS) { 650 rge_fini_send_ring(rgep); 651 return (DDI_FAILURE); 652 } 653 654 err = rge_init_buf_ring(rgep); 655 if (err != DDI_SUCCESS) { 656 rge_fini_send_ring(rgep); 657 rge_fini_recv_ring(rgep); 658 return (DDI_FAILURE); 659 } 660 661 return (DDI_SUCCESS); 662 } 663 664 /* 665 * ========== Internal state management entry points ========== 666 */ 667 668 #undef RGE_DBG 669 #define RGE_DBG RGE_DBG_NEMO /* debug flag for this code */ 670 671 /* 672 * These routines provide all the functionality required by the 673 * corresponding MAC layer entry points, but don't update the 674 * MAC state so they can be called internally without disturbing 675 * our record of what NEMO thinks we should be doing ... 676 */ 677 678 /* 679 * rge_reset() -- reset h/w & rings to initial state 680 */ 681 static void 682 rge_reset(rge_t *rgep) 683 { 684 ASSERT(mutex_owned(rgep->genlock)); 685 686 /* 687 * Grab all the other mutexes in the world (this should 688 * ensure no other threads are manipulating driver state) 689 */ 690 mutex_enter(rgep->rx_lock); 691 mutex_enter(rgep->rc_lock); 692 rw_enter(rgep->errlock, RW_WRITER); 693 694 (void) rge_chip_reset(rgep); 695 rge_reinit_rings(rgep); 696 rge_chip_init(rgep); 697 698 /* 699 * Free the world ... 700 */ 701 rw_exit(rgep->errlock); 702 mutex_exit(rgep->rc_lock); 703 mutex_exit(rgep->rx_lock); 704 705 rgep->stats.rpackets = 0; 706 rgep->stats.rbytes = 0; 707 rgep->stats.opackets = 0; 708 rgep->stats.obytes = 0; 709 rgep->stats.tx_pre_ismax = B_FALSE; 710 rgep->stats.tx_cur_ismax = B_FALSE; 711 712 RGE_DEBUG(("rge_reset($%p) done", (void *)rgep)); 713 } 714 715 /* 716 * rge_stop() -- stop processing, don't reset h/w or rings 717 */ 718 static void 719 rge_stop(rge_t *rgep) 720 { 721 ASSERT(mutex_owned(rgep->genlock)); 722 723 rge_chip_stop(rgep, B_FALSE); 724 725 RGE_DEBUG(("rge_stop($%p) done", (void *)rgep)); 726 } 727 728 /* 729 * rge_start() -- start transmitting/receiving 730 */ 731 static void 732 rge_start(rge_t *rgep) 733 { 734 ASSERT(mutex_owned(rgep->genlock)); 735 736 /* 737 * Start chip processing, including enabling interrupts 738 */ 739 rge_chip_start(rgep); 740 rgep->watchdog = 0; 741 } 742 743 /* 744 * rge_restart - restart transmitting/receiving after error or suspend 745 */ 746 void 747 rge_restart(rge_t *rgep) 748 { 749 uint32_t i; 750 751 ASSERT(mutex_owned(rgep->genlock)); 752 /* 753 * Wait for posted buffer to be freed... 754 */ 755 if (!rgep->rx_bcopy) { 756 for (i = 0; i < RXBUFF_FREE_LOOP; i++) { 757 if (rgep->rx_free == RGE_BUF_SLOTS) 758 break; 759 drv_usecwait(1000); 760 RGE_DEBUG(("rge_restart: waiting for rx buf free...")); 761 } 762 } 763 rge_reset(rgep); 764 rgep->stats.chip_reset++; 765 if (rgep->rge_mac_state == RGE_MAC_STARTED) { 766 rge_start(rgep); 767 rgep->resched_needed = B_TRUE; 768 (void) ddi_intr_trigger_softint(rgep->resched_hdl, NULL); 769 } 770 } 771 772 773 /* 774 * ========== Nemo-required management entry points ========== 775 */ 776 777 #undef RGE_DBG 778 #define RGE_DBG RGE_DBG_NEMO /* debug flag for this code */ 779 780 /* 781 * rge_m_stop() -- stop transmitting/receiving 782 */ 783 static void 784 rge_m_stop(void *arg) 785 { 786 rge_t *rgep = arg; /* private device info */ 787 uint32_t i; 788 789 /* 790 * Just stop processing, then record new MAC state 791 */ 792 mutex_enter(rgep->genlock); 793 if (rgep->suspended) { 794 ASSERT(rgep->rge_mac_state == RGE_MAC_STOPPED); 795 mutex_exit(rgep->genlock); 796 return; 797 } 798 rge_stop(rgep); 799 /* 800 * Wait for posted buffer to be freed... 801 */ 802 if (!rgep->rx_bcopy) { 803 for (i = 0; i < RXBUFF_FREE_LOOP; i++) { 804 if (rgep->rx_free == RGE_BUF_SLOTS) 805 break; 806 drv_usecwait(1000); 807 RGE_DEBUG(("rge_m_stop: waiting for rx buf free...")); 808 } 809 } 810 rgep->rge_mac_state = RGE_MAC_STOPPED; 811 RGE_DEBUG(("rge_m_stop($%p) done", arg)); 812 mutex_exit(rgep->genlock); 813 } 814 815 /* 816 * rge_m_start() -- start transmitting/receiving 817 */ 818 static int 819 rge_m_start(void *arg) 820 { 821 rge_t *rgep = arg; /* private device info */ 822 823 mutex_enter(rgep->genlock); 824 if (rgep->suspended) { 825 mutex_exit(rgep->genlock); 826 return (DDI_FAILURE); 827 } 828 /* 829 * Clear hw/sw statistics 830 */ 831 DMA_ZERO(rgep->dma_area_stats); 832 bzero(&rgep->stats, sizeof (rge_stats_t)); 833 834 /* 835 * Start processing and record new MAC state 836 */ 837 rge_reset(rgep); 838 rge_start(rgep); 839 rgep->rge_mac_state = RGE_MAC_STARTED; 840 RGE_DEBUG(("rge_m_start($%p) done", arg)); 841 842 mutex_exit(rgep->genlock); 843 844 return (0); 845 } 846 847 /* 848 * rge_m_unicst_set() -- set the physical network address 849 */ 850 static int 851 rge_m_unicst(void *arg, const uint8_t *macaddr) 852 { 853 rge_t *rgep = arg; /* private device info */ 854 855 /* 856 * Remember the new current address in the driver state 857 * Sync the chip's idea of the address too ... 858 */ 859 mutex_enter(rgep->genlock); 860 bcopy(macaddr, rgep->netaddr, ETHERADDRL); 861 862 if (rgep->suspended) { 863 mutex_exit(rgep->genlock); 864 return (DDI_SUCCESS); 865 } 866 867 rge_chip_sync(rgep, RGE_SET_MAC); 868 mutex_exit(rgep->genlock); 869 870 return (0); 871 } 872 873 /* 874 * Compute the index of the required bit in the multicast hash map. 875 * This must mirror the way the hardware actually does it! 876 */ 877 static uint32_t 878 rge_hash_index(const uint8_t *mca) 879 { 880 uint32_t crc = (uint32_t)RGE_HASH_CRC; 881 uint32_t const POLY = RGE_HASH_POLY; 882 uint32_t msb; 883 int bytes; 884 uchar_t currentbyte; 885 uint32_t index; 886 int bit; 887 888 for (bytes = 0; bytes < ETHERADDRL; bytes++) { 889 currentbyte = mca[bytes]; 890 for (bit = 0; bit < 8; bit++) { 891 msb = crc >> 31; 892 crc <<= 1; 893 if (msb ^ (currentbyte & 1)) 894 crc ^= POLY; 895 currentbyte >>= 1; 896 } 897 } 898 index = crc >> 26; 899 /* the index value is between 0 and 63(0x3f) */ 900 901 return (index); 902 } 903 904 /* 905 * rge_m_multicst_add() -- enable/disable a multicast address 906 */ 907 static int 908 rge_m_multicst(void *arg, boolean_t add, const uint8_t *mca) 909 { 910 rge_t *rgep = arg; /* private device info */ 911 struct ether_addr *addr; 912 uint32_t index; 913 uint32_t reg; 914 uint8_t *hashp; 915 916 mutex_enter(rgep->genlock); 917 hashp = rgep->mcast_hash; 918 addr = (struct ether_addr *)mca; 919 /* 920 * Calculate the Multicast address hash index value 921 * Normally, the position of MAR0-MAR7 is 922 * MAR0: offset 0x08, ..., MAR7: offset 0x0F. 923 * 924 * For pcie chipset, the position of MAR0-MAR7 is 925 * different from others: 926 * MAR0: offset 0x0F, ..., MAR7: offset 0x08. 927 */ 928 index = rge_hash_index(addr->ether_addr_octet); 929 if (rgep->chipid.is_pcie) 930 reg = (~(index / RGE_MCAST_NUM)) & 0x7; 931 else 932 reg = index / RGE_MCAST_NUM; 933 934 if (add) { 935 if (rgep->mcast_refs[index]++) { 936 mutex_exit(rgep->genlock); 937 return (0); 938 } 939 hashp[reg] |= 1 << (index % RGE_MCAST_NUM); 940 } else { 941 if (--rgep->mcast_refs[index]) { 942 mutex_exit(rgep->genlock); 943 return (0); 944 } 945 hashp[reg] &= ~ (1 << (index % RGE_MCAST_NUM)); 946 } 947 948 if (rgep->suspended) { 949 mutex_exit(rgep->genlock); 950 return (DDI_SUCCESS); 951 } 952 953 /* 954 * Set multicast register 955 */ 956 rge_chip_sync(rgep, RGE_SET_MUL); 957 958 mutex_exit(rgep->genlock); 959 return (0); 960 } 961 962 /* 963 * rge_m_promisc() -- set or reset promiscuous mode on the board 964 * 965 * Program the hardware to enable/disable promiscuous and/or 966 * receive-all-multicast modes. 967 */ 968 static int 969 rge_m_promisc(void *arg, boolean_t on) 970 { 971 rge_t *rgep = arg; 972 973 /* 974 * Store MAC layer specified mode and pass to chip layer to update h/w 975 */ 976 mutex_enter(rgep->genlock); 977 978 if (rgep->promisc == on) { 979 mutex_exit(rgep->genlock); 980 return (0); 981 } 982 rgep->promisc = on; 983 984 if (rgep->suspended) { 985 mutex_exit(rgep->genlock); 986 return (DDI_SUCCESS); 987 } 988 989 rge_chip_sync(rgep, RGE_SET_PROMISC); 990 RGE_DEBUG(("rge_m_promisc_set($%p) done", arg)); 991 mutex_exit(rgep->genlock); 992 return (0); 993 } 994 995 /* 996 * Loopback ioctl code 997 */ 998 999 static lb_property_t loopmodes[] = { 1000 { normal, "normal", RGE_LOOP_NONE }, 1001 { internal, "PHY", RGE_LOOP_INTERNAL_PHY }, 1002 { internal, "MAC", RGE_LOOP_INTERNAL_MAC } 1003 }; 1004 1005 static enum ioc_reply 1006 rge_set_loop_mode(rge_t *rgep, uint32_t mode) 1007 { 1008 /* 1009 * If the mode isn't being changed, there's nothing to do ... 1010 */ 1011 if (mode == rgep->param_loop_mode) 1012 return (IOC_ACK); 1013 1014 /* 1015 * Validate the requested mode and prepare a suitable message 1016 * to explain the link down/up cycle that the change will 1017 * probably induce ... 1018 */ 1019 switch (mode) { 1020 default: 1021 return (IOC_INVAL); 1022 1023 case RGE_LOOP_NONE: 1024 case RGE_LOOP_INTERNAL_PHY: 1025 case RGE_LOOP_INTERNAL_MAC: 1026 break; 1027 } 1028 1029 /* 1030 * All OK; tell the caller to reprogram 1031 * the PHY and/or MAC for the new mode ... 1032 */ 1033 rgep->param_loop_mode = mode; 1034 return (IOC_RESTART_ACK); 1035 } 1036 1037 static enum ioc_reply 1038 rge_loop_ioctl(rge_t *rgep, queue_t *wq, mblk_t *mp, struct iocblk *iocp) 1039 { 1040 lb_info_sz_t *lbsp; 1041 lb_property_t *lbpp; 1042 uint32_t *lbmp; 1043 int cmd; 1044 1045 _NOTE(ARGUNUSED(wq)) 1046 1047 /* 1048 * Validate format of ioctl 1049 */ 1050 if (mp->b_cont == NULL) 1051 return (IOC_INVAL); 1052 1053 cmd = iocp->ioc_cmd; 1054 switch (cmd) { 1055 default: 1056 /* NOTREACHED */ 1057 rge_error(rgep, "rge_loop_ioctl: invalid cmd 0x%x", cmd); 1058 return (IOC_INVAL); 1059 1060 case LB_GET_INFO_SIZE: 1061 if (iocp->ioc_count != sizeof (lb_info_sz_t)) 1062 return (IOC_INVAL); 1063 lbsp = (lb_info_sz_t *)mp->b_cont->b_rptr; 1064 *lbsp = sizeof (loopmodes); 1065 return (IOC_REPLY); 1066 1067 case LB_GET_INFO: 1068 if (iocp->ioc_count != sizeof (loopmodes)) 1069 return (IOC_INVAL); 1070 lbpp = (lb_property_t *)mp->b_cont->b_rptr; 1071 bcopy(loopmodes, lbpp, sizeof (loopmodes)); 1072 return (IOC_REPLY); 1073 1074 case LB_GET_MODE: 1075 if (iocp->ioc_count != sizeof (uint32_t)) 1076 return (IOC_INVAL); 1077 lbmp = (uint32_t *)mp->b_cont->b_rptr; 1078 *lbmp = rgep->param_loop_mode; 1079 return (IOC_REPLY); 1080 1081 case LB_SET_MODE: 1082 if (iocp->ioc_count != sizeof (uint32_t)) 1083 return (IOC_INVAL); 1084 lbmp = (uint32_t *)mp->b_cont->b_rptr; 1085 return (rge_set_loop_mode(rgep, *lbmp)); 1086 } 1087 } 1088 1089 /* 1090 * Specific rge IOCTLs, the MAC layer handles the generic ones. 1091 */ 1092 static void 1093 rge_m_ioctl(void *arg, queue_t *wq, mblk_t *mp) 1094 { 1095 rge_t *rgep = arg; 1096 struct iocblk *iocp; 1097 enum ioc_reply status; 1098 boolean_t need_privilege; 1099 int err; 1100 int cmd; 1101 1102 /* 1103 * If suspended, we might actually be able to do some of 1104 * these ioctls, but it is harder to make sure they occur 1105 * without actually putting the hardware in an undesireable 1106 * state. So just NAK it. 1107 */ 1108 mutex_enter(rgep->genlock); 1109 if (rgep->suspended) { 1110 miocnak(wq, mp, 0, EINVAL); 1111 mutex_exit(rgep->genlock); 1112 return; 1113 } 1114 mutex_exit(rgep->genlock); 1115 1116 /* 1117 * Validate the command before bothering with the mutex ... 1118 */ 1119 iocp = (struct iocblk *)mp->b_rptr; 1120 iocp->ioc_error = 0; 1121 need_privilege = B_TRUE; 1122 cmd = iocp->ioc_cmd; 1123 switch (cmd) { 1124 default: 1125 miocnak(wq, mp, 0, EINVAL); 1126 return; 1127 1128 case RGE_MII_READ: 1129 case RGE_MII_WRITE: 1130 case RGE_DIAG: 1131 case RGE_PEEK: 1132 case RGE_POKE: 1133 case RGE_PHY_RESET: 1134 case RGE_SOFT_RESET: 1135 case RGE_HARD_RESET: 1136 break; 1137 1138 case LB_GET_INFO_SIZE: 1139 case LB_GET_INFO: 1140 case LB_GET_MODE: 1141 need_privilege = B_FALSE; 1142 /* FALLTHRU */ 1143 case LB_SET_MODE: 1144 break; 1145 1146 case ND_GET: 1147 need_privilege = B_FALSE; 1148 /* FALLTHRU */ 1149 case ND_SET: 1150 break; 1151 } 1152 1153 if (need_privilege) { 1154 /* 1155 * Check for specific net_config privilege 1156 */ 1157 err = secpolicy_net_config(iocp->ioc_cr, B_FALSE); 1158 if (err != 0) { 1159 miocnak(wq, mp, 0, err); 1160 return; 1161 } 1162 } 1163 1164 mutex_enter(rgep->genlock); 1165 1166 switch (cmd) { 1167 default: 1168 _NOTE(NOTREACHED) 1169 status = IOC_INVAL; 1170 break; 1171 1172 case RGE_MII_READ: 1173 case RGE_MII_WRITE: 1174 case RGE_DIAG: 1175 case RGE_PEEK: 1176 case RGE_POKE: 1177 case RGE_PHY_RESET: 1178 case RGE_SOFT_RESET: 1179 case RGE_HARD_RESET: 1180 status = rge_chip_ioctl(rgep, wq, mp, iocp); 1181 break; 1182 1183 case LB_GET_INFO_SIZE: 1184 case LB_GET_INFO: 1185 case LB_GET_MODE: 1186 case LB_SET_MODE: 1187 status = rge_loop_ioctl(rgep, wq, mp, iocp); 1188 break; 1189 1190 case ND_GET: 1191 case ND_SET: 1192 status = rge_nd_ioctl(rgep, wq, mp, iocp); 1193 break; 1194 } 1195 1196 /* 1197 * Do we need to reprogram the PHY and/or the MAC? 1198 * Do it now, while we still have the mutex. 1199 * 1200 * Note: update the PHY first, 'cos it controls the 1201 * speed/duplex parameters that the MAC code uses. 1202 */ 1203 switch (status) { 1204 case IOC_RESTART_REPLY: 1205 case IOC_RESTART_ACK: 1206 rge_phy_update(rgep); 1207 break; 1208 } 1209 1210 mutex_exit(rgep->genlock); 1211 1212 /* 1213 * Finally, decide how to reply 1214 */ 1215 switch (status) { 1216 default: 1217 case IOC_INVAL: 1218 /* 1219 * Error, reply with a NAK and EINVAL or the specified error 1220 */ 1221 miocnak(wq, mp, 0, iocp->ioc_error == 0 ? 1222 EINVAL : iocp->ioc_error); 1223 break; 1224 1225 case IOC_DONE: 1226 /* 1227 * OK, reply already sent 1228 */ 1229 break; 1230 1231 case IOC_RESTART_ACK: 1232 case IOC_ACK: 1233 /* 1234 * OK, reply with an ACK 1235 */ 1236 miocack(wq, mp, 0, 0); 1237 break; 1238 1239 case IOC_RESTART_REPLY: 1240 case IOC_REPLY: 1241 /* 1242 * OK, send prepared reply as ACK or NAK 1243 */ 1244 mp->b_datap->db_type = iocp->ioc_error == 0 ? 1245 M_IOCACK : M_IOCNAK; 1246 qreply(wq, mp); 1247 break; 1248 } 1249 } 1250 1251 /* ARGSUSED */ 1252 static boolean_t 1253 rge_m_getcapab(void *arg, mac_capab_t cap, void *cap_data) 1254 { 1255 rge_t *rgep = arg; 1256 1257 switch (cap) { 1258 case MAC_CAPAB_HCKSUM: { 1259 uint32_t *hcksum_txflags = cap_data; 1260 switch (rgep->chipid.mac_ver) { 1261 case MAC_VER_8169: 1262 case MAC_VER_8169S_D: 1263 case MAC_VER_8169S_E: 1264 case MAC_VER_8169SB: 1265 case MAC_VER_8169SC: 1266 case MAC_VER_8168: 1267 case MAC_VER_8168B_B: 1268 case MAC_VER_8168B_C: 1269 case MAC_VER_8101E: 1270 *hcksum_txflags = HCKSUM_INET_FULL_V4 | 1271 HCKSUM_IPHDRCKSUM; 1272 break; 1273 case MAC_VER_8168C: 1274 case MAC_VER_8101E_B: 1275 case MAC_VER_8101E_C: 1276 default: 1277 *hcksum_txflags = 0; 1278 break; 1279 } 1280 break; 1281 } 1282 default: 1283 return (B_FALSE); 1284 } 1285 return (B_TRUE); 1286 } 1287 1288 /* 1289 * ============ Init MSI/Fixed Interrupt routines ============== 1290 */ 1291 1292 /* 1293 * rge_add_intrs: 1294 * 1295 * Register FIXED or MSI interrupts. 1296 */ 1297 static int 1298 rge_add_intrs(rge_t *rgep, int intr_type) 1299 { 1300 dev_info_t *dip = rgep->devinfo; 1301 int avail; 1302 int actual; 1303 int intr_size; 1304 int count; 1305 int i, j; 1306 int ret; 1307 1308 /* Get number of interrupts */ 1309 ret = ddi_intr_get_nintrs(dip, intr_type, &count); 1310 if ((ret != DDI_SUCCESS) || (count == 0)) { 1311 rge_error(rgep, "ddi_intr_get_nintrs() failure, ret: %d, " 1312 "count: %d", ret, count); 1313 return (DDI_FAILURE); 1314 } 1315 1316 /* Get number of available interrupts */ 1317 ret = ddi_intr_get_navail(dip, intr_type, &avail); 1318 if ((ret != DDI_SUCCESS) || (avail == 0)) { 1319 rge_error(rgep, "ddi_intr_get_navail() failure, " 1320 "ret: %d, avail: %d\n", ret, avail); 1321 return (DDI_FAILURE); 1322 } 1323 1324 /* Allocate an array of interrupt handles */ 1325 intr_size = count * sizeof (ddi_intr_handle_t); 1326 rgep->htable = kmem_alloc(intr_size, KM_SLEEP); 1327 rgep->intr_rqst = count; 1328 1329 /* Call ddi_intr_alloc() */ 1330 ret = ddi_intr_alloc(dip, rgep->htable, intr_type, 0, 1331 count, &actual, DDI_INTR_ALLOC_NORMAL); 1332 if (ret != DDI_SUCCESS || actual == 0) { 1333 rge_error(rgep, "ddi_intr_alloc() failed %d\n", ret); 1334 kmem_free(rgep->htable, intr_size); 1335 return (DDI_FAILURE); 1336 } 1337 if (actual < count) { 1338 rge_log(rgep, "ddi_intr_alloc() Requested: %d, Received: %d\n", 1339 count, actual); 1340 } 1341 rgep->intr_cnt = actual; 1342 1343 /* 1344 * Get priority for first msi, assume remaining are all the same 1345 */ 1346 if ((ret = ddi_intr_get_pri(rgep->htable[0], &rgep->intr_pri)) != 1347 DDI_SUCCESS) { 1348 rge_error(rgep, "ddi_intr_get_pri() failed %d\n", ret); 1349 /* Free already allocated intr */ 1350 for (i = 0; i < actual; i++) { 1351 (void) ddi_intr_free(rgep->htable[i]); 1352 } 1353 kmem_free(rgep->htable, intr_size); 1354 return (DDI_FAILURE); 1355 } 1356 1357 /* Test for high level mutex */ 1358 if (rgep->intr_pri >= ddi_intr_get_hilevel_pri()) { 1359 rge_error(rgep, "rge_add_intrs:" 1360 "Hi level interrupt not supported"); 1361 for (i = 0; i < actual; i++) 1362 (void) ddi_intr_free(rgep->htable[i]); 1363 kmem_free(rgep->htable, intr_size); 1364 return (DDI_FAILURE); 1365 } 1366 1367 /* Call ddi_intr_add_handler() */ 1368 for (i = 0; i < actual; i++) { 1369 if ((ret = ddi_intr_add_handler(rgep->htable[i], rge_intr, 1370 (caddr_t)rgep, (caddr_t)(uintptr_t)i)) != DDI_SUCCESS) { 1371 rge_error(rgep, "ddi_intr_add_handler() " 1372 "failed %d\n", ret); 1373 /* Remove already added intr */ 1374 for (j = 0; j < i; j++) 1375 (void) ddi_intr_remove_handler(rgep->htable[j]); 1376 /* Free already allocated intr */ 1377 for (i = 0; i < actual; i++) { 1378 (void) ddi_intr_free(rgep->htable[i]); 1379 } 1380 kmem_free(rgep->htable, intr_size); 1381 return (DDI_FAILURE); 1382 } 1383 } 1384 1385 if ((ret = ddi_intr_get_cap(rgep->htable[0], &rgep->intr_cap)) 1386 != DDI_SUCCESS) { 1387 rge_error(rgep, "ddi_intr_get_cap() failed %d\n", ret); 1388 for (i = 0; i < actual; i++) { 1389 (void) ddi_intr_remove_handler(rgep->htable[i]); 1390 (void) ddi_intr_free(rgep->htable[i]); 1391 } 1392 kmem_free(rgep->htable, intr_size); 1393 return (DDI_FAILURE); 1394 } 1395 1396 return (DDI_SUCCESS); 1397 } 1398 1399 /* 1400 * rge_rem_intrs: 1401 * 1402 * Unregister FIXED or MSI interrupts 1403 */ 1404 static void 1405 rge_rem_intrs(rge_t *rgep) 1406 { 1407 int i; 1408 1409 /* Disable all interrupts */ 1410 if (rgep->intr_cap & DDI_INTR_FLAG_BLOCK) { 1411 /* Call ddi_intr_block_disable() */ 1412 (void) ddi_intr_block_disable(rgep->htable, rgep->intr_cnt); 1413 } else { 1414 for (i = 0; i < rgep->intr_cnt; i++) { 1415 (void) ddi_intr_disable(rgep->htable[i]); 1416 } 1417 } 1418 1419 /* Call ddi_intr_remove_handler() */ 1420 for (i = 0; i < rgep->intr_cnt; i++) { 1421 (void) ddi_intr_remove_handler(rgep->htable[i]); 1422 (void) ddi_intr_free(rgep->htable[i]); 1423 } 1424 1425 kmem_free(rgep->htable, rgep->intr_rqst * sizeof (ddi_intr_handle_t)); 1426 } 1427 1428 /* 1429 * ========== Per-instance setup/teardown code ========== 1430 */ 1431 1432 #undef RGE_DBG 1433 #define RGE_DBG RGE_DBG_INIT /* debug flag for this code */ 1434 1435 static void 1436 rge_unattach(rge_t *rgep) 1437 { 1438 /* 1439 * Flag that no more activity may be initiated 1440 */ 1441 rgep->progress &= ~PROGRESS_READY; 1442 rgep->rge_mac_state = RGE_MAC_UNATTACH; 1443 1444 /* 1445 * Quiesce the PHY and MAC (leave it reset but still powered). 1446 * Clean up and free all RGE data structures 1447 */ 1448 if (rgep->periodic_id != NULL) { 1449 ddi_periodic_delete(rgep->periodic_id); 1450 rgep->periodic_id = NULL; 1451 } 1452 1453 if (rgep->progress & PROGRESS_KSTATS) 1454 rge_fini_kstats(rgep); 1455 1456 if (rgep->progress & PROGRESS_PHY) 1457 (void) rge_phy_reset(rgep); 1458 1459 if (rgep->progress & PROGRESS_INIT) { 1460 mutex_enter(rgep->genlock); 1461 (void) rge_chip_reset(rgep); 1462 mutex_exit(rgep->genlock); 1463 rge_fini_rings(rgep); 1464 } 1465 1466 if (rgep->progress & PROGRESS_INTR) { 1467 rge_rem_intrs(rgep); 1468 mutex_destroy(rgep->rc_lock); 1469 mutex_destroy(rgep->rx_lock); 1470 mutex_destroy(rgep->tc_lock); 1471 mutex_destroy(rgep->tx_lock); 1472 rw_destroy(rgep->errlock); 1473 mutex_destroy(rgep->genlock); 1474 } 1475 1476 if (rgep->progress & PROGRESS_FACTOTUM) 1477 (void) ddi_intr_remove_softint(rgep->factotum_hdl); 1478 1479 if (rgep->progress & PROGRESS_RESCHED) 1480 (void) ddi_intr_remove_softint(rgep->resched_hdl); 1481 1482 if (rgep->progress & PROGRESS_NDD) 1483 rge_nd_cleanup(rgep); 1484 1485 rge_free_bufs(rgep); 1486 1487 if (rgep->progress & PROGRESS_REGS) 1488 ddi_regs_map_free(&rgep->io_handle); 1489 1490 if (rgep->progress & PROGRESS_CFG) 1491 pci_config_teardown(&rgep->cfg_handle); 1492 1493 ddi_remove_minor_node(rgep->devinfo, NULL); 1494 kmem_free(rgep, sizeof (*rgep)); 1495 } 1496 1497 static int 1498 rge_resume(dev_info_t *devinfo) 1499 { 1500 rge_t *rgep; /* Our private data */ 1501 chip_id_t *cidp; 1502 chip_id_t chipid; 1503 1504 rgep = ddi_get_driver_private(devinfo); 1505 1506 /* 1507 * If there are state inconsistancies, this is bad. Returning 1508 * DDI_FAILURE here will eventually cause the machine to panic, 1509 * so it is best done here so that there is a possibility of 1510 * debugging the problem. 1511 */ 1512 if (rgep == NULL) 1513 cmn_err(CE_PANIC, 1514 "rge: ngep returned from ddi_get_driver_private was NULL"); 1515 1516 /* 1517 * Refuse to resume if the data structures aren't consistent 1518 */ 1519 if (rgep->devinfo != devinfo) 1520 cmn_err(CE_PANIC, 1521 "rge: passed devinfo not the same as saved devinfo"); 1522 1523 /* 1524 * Read chip ID & set up config space command register(s) 1525 * Refuse to resume if the chip has changed its identity! 1526 */ 1527 cidp = &rgep->chipid; 1528 rge_chip_cfg_init(rgep, &chipid); 1529 if (chipid.vendor != cidp->vendor) 1530 return (DDI_FAILURE); 1531 if (chipid.device != cidp->device) 1532 return (DDI_FAILURE); 1533 if (chipid.revision != cidp->revision) 1534 return (DDI_FAILURE); 1535 1536 mutex_enter(rgep->genlock); 1537 1538 /* 1539 * Only in one case, this conditional branch can be executed: the port 1540 * hasn't been plumbed. 1541 */ 1542 if (rgep->suspended == B_FALSE) { 1543 mutex_exit(rgep->genlock); 1544 return (DDI_SUCCESS); 1545 } 1546 rgep->rge_mac_state = RGE_MAC_STARTED; 1547 /* 1548 * All OK, reinitialise h/w & kick off NEMO scheduling 1549 */ 1550 rge_restart(rgep); 1551 rgep->suspended = B_FALSE; 1552 1553 mutex_exit(rgep->genlock); 1554 1555 return (DDI_SUCCESS); 1556 } 1557 1558 1559 /* 1560 * attach(9E) -- Attach a device to the system 1561 * 1562 * Called once for each board successfully probed. 1563 */ 1564 static int 1565 rge_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd) 1566 { 1567 rge_t *rgep; /* Our private data */ 1568 mac_register_t *macp; 1569 chip_id_t *cidp; 1570 int intr_types; 1571 caddr_t regs; 1572 int instance; 1573 int i; 1574 int err; 1575 1576 /* 1577 * we don't support high level interrupts in the driver 1578 */ 1579 if (ddi_intr_hilevel(devinfo, 0) != 0) { 1580 cmn_err(CE_WARN, 1581 "rge_attach -- unsupported high level interrupt"); 1582 return (DDI_FAILURE); 1583 } 1584 1585 instance = ddi_get_instance(devinfo); 1586 RGE_GTRACE(("rge_attach($%p, %d) instance %d", 1587 (void *)devinfo, cmd, instance)); 1588 RGE_BRKPT(NULL, "rge_attach"); 1589 1590 switch (cmd) { 1591 default: 1592 return (DDI_FAILURE); 1593 1594 case DDI_RESUME: 1595 return (rge_resume(devinfo)); 1596 1597 case DDI_ATTACH: 1598 break; 1599 } 1600 1601 rgep = kmem_zalloc(sizeof (*rgep), KM_SLEEP); 1602 ddi_set_driver_private(devinfo, rgep); 1603 rgep->devinfo = devinfo; 1604 1605 /* 1606 * Initialize more fields in RGE private data 1607 */ 1608 rgep->rge_mac_state = RGE_MAC_ATTACH; 1609 rgep->debug = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, 1610 DDI_PROP_DONTPASS, debug_propname, rge_debug); 1611 rgep->default_mtu = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, 1612 DDI_PROP_DONTPASS, mtu_propname, ETHERMTU); 1613 rgep->msi_enable = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, 1614 DDI_PROP_DONTPASS, msi_propname, B_TRUE); 1615 (void) snprintf(rgep->ifname, sizeof (rgep->ifname), "%s%d", 1616 RGE_DRIVER_NAME, instance); 1617 1618 /* 1619 * Map config space registers 1620 * Read chip ID & set up config space command register(s) 1621 * 1622 * Note: this leaves the chip accessible by Memory Space 1623 * accesses, but with interrupts and Bus Mastering off. 1624 * This should ensure that nothing untoward will happen 1625 * if it has been left active by the (net-)bootloader. 1626 * We'll re-enable Bus Mastering once we've reset the chip, 1627 * and allow interrupts only when everything else is set up. 1628 */ 1629 err = pci_config_setup(devinfo, &rgep->cfg_handle); 1630 if (err != DDI_SUCCESS) { 1631 rge_problem(rgep, "pci_config_setup() failed"); 1632 goto attach_fail; 1633 } 1634 rgep->progress |= PROGRESS_CFG; 1635 cidp = &rgep->chipid; 1636 bzero(cidp, sizeof (*cidp)); 1637 rge_chip_cfg_init(rgep, cidp); 1638 1639 /* 1640 * Map operating registers 1641 */ 1642 err = ddi_regs_map_setup(devinfo, 2, ®s, 1643 0, 0, &rge_reg_accattr, &rgep->io_handle); 1644 1645 /* 1646 * MMIO map will fail if the assigned address is bigger than 4G 1647 * then choose I/O map 1648 */ 1649 if (err != DDI_SUCCESS) { 1650 err = ddi_regs_map_setup(devinfo, 1, ®s, 1651 0, 0, &rge_reg_accattr, &rgep->io_handle); 1652 } 1653 if (err != DDI_SUCCESS) { 1654 rge_problem(rgep, "ddi_regs_map_setup() failed"); 1655 goto attach_fail; 1656 } 1657 rgep->io_regs = regs; 1658 rgep->progress |= PROGRESS_REGS; 1659 1660 /* 1661 * Characterise the device, so we know its requirements. 1662 * Then allocate the appropriate TX and RX descriptors & buffers. 1663 */ 1664 rge_chip_ident(rgep); 1665 err = rge_alloc_bufs(rgep); 1666 if (err != DDI_SUCCESS) { 1667 rge_problem(rgep, "DMA buffer allocation failed"); 1668 goto attach_fail; 1669 } 1670 1671 /* 1672 * Register NDD-tweakable parameters 1673 */ 1674 if (rge_nd_init(rgep)) { 1675 rge_problem(rgep, "rge_nd_init() failed"); 1676 goto attach_fail; 1677 } 1678 rgep->progress |= PROGRESS_NDD; 1679 1680 /* 1681 * Add the softint handlers: 1682 * 1683 * Both of these handlers are used to avoid restrictions on the 1684 * context and/or mutexes required for some operations. In 1685 * particular, the hardware interrupt handler and its subfunctions 1686 * can detect a number of conditions that we don't want to handle 1687 * in that context or with that set of mutexes held. So, these 1688 * softints are triggered instead: 1689 * 1690 * the <resched> softint is triggered if if we have previously 1691 * had to refuse to send a packet because of resource shortage 1692 * (we've run out of transmit buffers), but the send completion 1693 * interrupt handler has now detected that more buffers have 1694 * become available. 1695 * 1696 * the <factotum> is triggered if the h/w interrupt handler 1697 * sees the <link state changed> or <error> bits in the status 1698 * block. It's also triggered periodically to poll the link 1699 * state, just in case we aren't getting link status change 1700 * interrupts ... 1701 */ 1702 err = ddi_intr_add_softint(devinfo, &rgep->resched_hdl, 1703 DDI_INTR_SOFTPRI_MIN, rge_reschedule, (caddr_t)rgep); 1704 if (err != DDI_SUCCESS) { 1705 rge_problem(rgep, "ddi_intr_add_softint() failed"); 1706 goto attach_fail; 1707 } 1708 rgep->progress |= PROGRESS_RESCHED; 1709 err = ddi_intr_add_softint(devinfo, &rgep->factotum_hdl, 1710 DDI_INTR_SOFTPRI_MIN, rge_chip_factotum, (caddr_t)rgep); 1711 if (err != DDI_SUCCESS) { 1712 rge_problem(rgep, "ddi_intr_add_softint() failed"); 1713 goto attach_fail; 1714 } 1715 rgep->progress |= PROGRESS_FACTOTUM; 1716 1717 /* 1718 * Get supported interrupt types 1719 */ 1720 if (ddi_intr_get_supported_types(devinfo, &intr_types) 1721 != DDI_SUCCESS) { 1722 rge_error(rgep, "ddi_intr_get_supported_types failed\n"); 1723 goto attach_fail; 1724 } 1725 1726 /* 1727 * Add the h/w interrupt handler and initialise mutexes 1728 * RTL8101E is observed to have MSI invalidation issue after S/R. 1729 * So the FIXED interrupt is used instead. 1730 */ 1731 if (rgep->chipid.mac_ver == MAC_VER_8101E) 1732 rgep->msi_enable = B_FALSE; 1733 if ((intr_types & DDI_INTR_TYPE_MSI) && rgep->msi_enable) { 1734 if (rge_add_intrs(rgep, DDI_INTR_TYPE_MSI) != DDI_SUCCESS) { 1735 rge_error(rgep, "MSI registration failed, " 1736 "trying FIXED interrupt type\n"); 1737 } else { 1738 rge_log(rgep, "Using MSI interrupt type\n"); 1739 rgep->intr_type = DDI_INTR_TYPE_MSI; 1740 rgep->progress |= PROGRESS_INTR; 1741 } 1742 } 1743 if (!(rgep->progress & PROGRESS_INTR) && 1744 (intr_types & DDI_INTR_TYPE_FIXED)) { 1745 if (rge_add_intrs(rgep, DDI_INTR_TYPE_FIXED) != DDI_SUCCESS) { 1746 rge_error(rgep, "FIXED interrupt " 1747 "registration failed\n"); 1748 goto attach_fail; 1749 } 1750 rge_log(rgep, "Using FIXED interrupt type\n"); 1751 rgep->intr_type = DDI_INTR_TYPE_FIXED; 1752 rgep->progress |= PROGRESS_INTR; 1753 } 1754 if (!(rgep->progress & PROGRESS_INTR)) { 1755 rge_error(rgep, "No interrupts registered\n"); 1756 goto attach_fail; 1757 } 1758 mutex_init(rgep->genlock, NULL, MUTEX_DRIVER, 1759 DDI_INTR_PRI(rgep->intr_pri)); 1760 rw_init(rgep->errlock, NULL, RW_DRIVER, 1761 DDI_INTR_PRI(rgep->intr_pri)); 1762 mutex_init(rgep->tx_lock, NULL, MUTEX_DRIVER, 1763 DDI_INTR_PRI(rgep->intr_pri)); 1764 mutex_init(rgep->tc_lock, NULL, MUTEX_DRIVER, 1765 DDI_INTR_PRI(rgep->intr_pri)); 1766 mutex_init(rgep->rx_lock, NULL, MUTEX_DRIVER, 1767 DDI_INTR_PRI(rgep->intr_pri)); 1768 mutex_init(rgep->rc_lock, NULL, MUTEX_DRIVER, 1769 DDI_INTR_PRI(rgep->intr_pri)); 1770 1771 /* 1772 * Initialize rings 1773 */ 1774 err = rge_init_rings(rgep); 1775 if (err != DDI_SUCCESS) { 1776 rge_problem(rgep, "rge_init_rings() failed"); 1777 goto attach_fail; 1778 } 1779 rgep->progress |= PROGRESS_INIT; 1780 1781 /* 1782 * Now that mutex locks are initialized, enable interrupts. 1783 */ 1784 if (rgep->intr_cap & DDI_INTR_FLAG_BLOCK) { 1785 /* Call ddi_intr_block_enable() for MSI interrupts */ 1786 (void) ddi_intr_block_enable(rgep->htable, rgep->intr_cnt); 1787 } else { 1788 /* Call ddi_intr_enable for MSI or FIXED interrupts */ 1789 for (i = 0; i < rgep->intr_cnt; i++) { 1790 (void) ddi_intr_enable(rgep->htable[i]); 1791 } 1792 } 1793 1794 /* 1795 * Initialise link state variables 1796 * Stop, reset & reinitialise the chip. 1797 * Initialise the (internal) PHY. 1798 */ 1799 rgep->param_link_up = LINK_STATE_UNKNOWN; 1800 1801 /* 1802 * Reset chip & rings to initial state; also reset address 1803 * filtering, promiscuity, loopback mode. 1804 */ 1805 mutex_enter(rgep->genlock); 1806 (void) rge_chip_reset(rgep); 1807 rge_chip_sync(rgep, RGE_GET_MAC); 1808 bzero(rgep->mcast_hash, sizeof (rgep->mcast_hash)); 1809 bzero(rgep->mcast_refs, sizeof (rgep->mcast_refs)); 1810 rgep->promisc = B_FALSE; 1811 rgep->param_loop_mode = RGE_LOOP_NONE; 1812 mutex_exit(rgep->genlock); 1813 rge_phy_init(rgep); 1814 rgep->progress |= PROGRESS_PHY; 1815 1816 /* 1817 * Create & initialise named kstats 1818 */ 1819 rge_init_kstats(rgep, instance); 1820 rgep->progress |= PROGRESS_KSTATS; 1821 1822 if ((macp = mac_alloc(MAC_VERSION)) == NULL) 1823 goto attach_fail; 1824 macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER; 1825 macp->m_driver = rgep; 1826 macp->m_dip = devinfo; 1827 macp->m_src_addr = rgep->netaddr; 1828 macp->m_callbacks = &rge_m_callbacks; 1829 macp->m_min_sdu = 0; 1830 macp->m_max_sdu = rgep->default_mtu; 1831 macp->m_margin = VLAN_TAGSZ; 1832 1833 /* 1834 * Finally, we're ready to register ourselves with the MAC layer 1835 * interface; if this succeeds, we're all ready to start() 1836 */ 1837 err = mac_register(macp, &rgep->mh); 1838 mac_free(macp); 1839 if (err != 0) 1840 goto attach_fail; 1841 1842 /* 1843 * Register a periodical handler. 1844 * reg_chip_cyclic() is invoked in kernel context. 1845 */ 1846 rgep->periodic_id = ddi_periodic_add(rge_chip_cyclic, rgep, 1847 RGE_CYCLIC_PERIOD, DDI_IPL_0); 1848 1849 rgep->progress |= PROGRESS_READY; 1850 return (DDI_SUCCESS); 1851 1852 attach_fail: 1853 rge_unattach(rgep); 1854 return (DDI_FAILURE); 1855 } 1856 1857 /* 1858 * rge_suspend() -- suspend transmit/receive for powerdown 1859 */ 1860 static int 1861 rge_suspend(rge_t *rgep) 1862 { 1863 /* 1864 * Stop processing and idle (powerdown) the PHY ... 1865 */ 1866 mutex_enter(rgep->genlock); 1867 rw_enter(rgep->errlock, RW_WRITER); 1868 1869 if (rgep->rge_mac_state != RGE_MAC_STARTED) { 1870 rw_exit(rgep->errlock); 1871 mutex_exit(rgep->genlock); 1872 return (DDI_SUCCESS); 1873 } 1874 1875 rgep->suspended = B_TRUE; 1876 rge_stop(rgep); 1877 rgep->rge_mac_state = RGE_MAC_STOPPED; 1878 1879 rw_exit(rgep->errlock); 1880 mutex_exit(rgep->genlock); 1881 1882 return (DDI_SUCCESS); 1883 } 1884 1885 /* 1886 * quiesce(9E) entry point. 1887 * 1888 * This function is called when the system is single-threaded at high 1889 * PIL with preemption disabled. Therefore, this function must not be 1890 * blocked. 1891 * 1892 * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure. 1893 * DDI_FAILURE indicates an error condition and should almost never happen. 1894 */ 1895 static int 1896 rge_quiesce(dev_info_t *devinfo) 1897 { 1898 rge_t *rgep = ddi_get_driver_private(devinfo); 1899 1900 if (rgep == NULL) 1901 return (DDI_FAILURE); 1902 1903 /* 1904 * Turn off debugging 1905 */ 1906 rge_debug = 0; 1907 rgep->debug = 0; 1908 1909 /* Stop the chip */ 1910 rge_chip_stop(rgep, B_FALSE); 1911 1912 return (DDI_SUCCESS); 1913 } 1914 1915 /* 1916 * detach(9E) -- Detach a device from the system 1917 */ 1918 static int 1919 rge_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd) 1920 { 1921 rge_t *rgep; 1922 1923 RGE_GTRACE(("rge_detach($%p, %d)", (void *)devinfo, cmd)); 1924 1925 rgep = ddi_get_driver_private(devinfo); 1926 1927 switch (cmd) { 1928 default: 1929 return (DDI_FAILURE); 1930 1931 case DDI_SUSPEND: 1932 return (rge_suspend(rgep)); 1933 1934 case DDI_DETACH: 1935 break; 1936 } 1937 1938 /* 1939 * If there is any posted buffer, the driver should reject to be 1940 * detached. Need notice upper layer to release them. 1941 */ 1942 if (!(rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY) && 1943 rgep->rx_free != RGE_BUF_SLOTS) 1944 return (DDI_FAILURE); 1945 1946 /* 1947 * Unregister from the MAC layer subsystem. This can fail, in 1948 * particular if there are DLPI style-2 streams still open - 1949 * in which case we just return failure without shutting 1950 * down chip operations. 1951 */ 1952 if (mac_unregister(rgep->mh) != 0) 1953 return (DDI_FAILURE); 1954 1955 /* 1956 * All activity stopped, so we can clean up & exit 1957 */ 1958 rge_unattach(rgep); 1959 return (DDI_SUCCESS); 1960 } 1961 1962 1963 /* 1964 * ========== Module Loading Data & Entry Points ========== 1965 */ 1966 1967 #undef RGE_DBG 1968 #define RGE_DBG RGE_DBG_INIT /* debug flag for this code */ 1969 DDI_DEFINE_STREAM_OPS(rge_dev_ops, nulldev, nulldev, rge_attach, rge_detach, 1970 nodev, NULL, D_MP, NULL, rge_quiesce); 1971 1972 static struct modldrv rge_modldrv = { 1973 &mod_driverops, /* Type of module. This one is a driver */ 1974 rge_ident, /* short description */ 1975 &rge_dev_ops /* driver specific ops */ 1976 }; 1977 1978 static struct modlinkage modlinkage = { 1979 MODREV_1, { (void *)&rge_modldrv, NULL } 1980 }; 1981 1982 1983 int 1984 _info(struct modinfo *modinfop) 1985 { 1986 return (mod_info(&modlinkage, modinfop)); 1987 } 1988 1989 int 1990 _init(void) 1991 { 1992 int status; 1993 1994 mac_init_ops(&rge_dev_ops, "rge"); 1995 status = mod_install(&modlinkage); 1996 if (status == DDI_SUCCESS) 1997 mutex_init(rge_log_mutex, NULL, MUTEX_DRIVER, NULL); 1998 else 1999 mac_fini_ops(&rge_dev_ops); 2000 2001 return (status); 2002 } 2003 2004 int 2005 _fini(void) 2006 { 2007 int status; 2008 2009 status = mod_remove(&modlinkage); 2010 if (status == DDI_SUCCESS) { 2011 mac_fini_ops(&rge_dev_ops); 2012 mutex_destroy(rge_log_mutex); 2013 } 2014 return (status); 2015 }