1 /* 2 * This file is provided under a CDDLv1 license. When using or 3 * redistributing this file, you may do so under this license. 4 * In redistributing this file this license must be included 5 * and no other modification of this header file is permitted. 6 * 7 * CDDL LICENSE SUMMARY 8 * 9 * Copyright(c) 1999 - 2009 Intel Corporation. All rights reserved. 10 * 11 * The contents of this file are subject to the terms of Version 12 * 1.0 of the Common Development and Distribution License (the "License"). 13 * 14 * You should have received a copy of the License with this software. 15 * You can obtain a copy of the License at 16 * http://www.opensolaris.org/os/licensing. 17 * See the License for the specific language governing permissions 18 * and limitations under the License. 19 */ 20 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* 27 * ********************************************************************** 28 * Module Name: * 29 * e1000g_alloc.c * 30 * * 31 * Abstract: * 32 * This file contains some routines that take care of * 33 * memory allocation for descriptors and buffers. * 34 * * 35 * ********************************************************************** 36 */ 37 38 #include "e1000g_sw.h" 39 #include "e1000g_debug.h" 40 41 #define TX_SW_PKT_AREA_SZ \ 42 (sizeof (tx_sw_packet_t) * Adapter->tx_freelist_num) 43 44 static int e1000g_alloc_tx_descriptors(e1000g_tx_ring_t *); 45 static int e1000g_alloc_rx_descriptors(e1000g_rx_data_t *); 46 static void e1000g_free_tx_descriptors(e1000g_tx_ring_t *); 47 static void e1000g_free_rx_descriptors(e1000g_rx_data_t *); 48 static int e1000g_alloc_tx_packets(e1000g_tx_ring_t *); 49 static int e1000g_alloc_rx_packets(e1000g_rx_data_t *); 50 static void e1000g_free_tx_packets(e1000g_tx_ring_t *); 51 static void e1000g_free_rx_packets(e1000g_rx_data_t *); 52 static int e1000g_alloc_dma_buffer(struct e1000g *, 53 dma_buffer_t *, size_t, ddi_dma_attr_t *p_dma_attr); 54 55 /* 56 * In order to avoid address error crossing 64KB boundary 57 * during PCI-X packets receving, e1000g_alloc_dma_buffer_82546 58 * is used by some necessary adapter types. 59 */ 60 static int e1000g_alloc_dma_buffer_82546(struct e1000g *, 61 dma_buffer_t *, size_t, ddi_dma_attr_t *p_dma_attr); 62 static int e1000g_dma_mem_alloc_82546(dma_buffer_t *buf, 63 size_t size, size_t *len); 64 static boolean_t e1000g_cross_64k_bound(void *, uintptr_t); 65 66 static void e1000g_free_dma_buffer(dma_buffer_t *); 67 #ifdef __sparc 68 static int e1000g_alloc_dvma_buffer(struct e1000g *, dma_buffer_t *, size_t); 69 static void e1000g_free_dvma_buffer(dma_buffer_t *); 70 #endif 71 static int e1000g_alloc_descriptors(struct e1000g *Adapter); 72 static void e1000g_free_descriptors(struct e1000g *Adapter); 73 static int e1000g_alloc_packets(struct e1000g *Adapter); 74 static void e1000g_free_packets(struct e1000g *Adapter); 75 static p_rx_sw_packet_t e1000g_alloc_rx_sw_packet(e1000g_rx_data_t *, 76 ddi_dma_attr_t *p_dma_attr); 77 78 /* DMA access attributes for descriptors <Little Endian> */ 79 static ddi_device_acc_attr_t e1000g_desc_acc_attr = { 80 DDI_DEVICE_ATTR_V0, 81 DDI_STRUCTURE_LE_ACC, 82 DDI_STRICTORDER_ACC 83 }; 84 85 /* DMA access attributes for DMA buffers */ 86 #ifdef __sparc 87 static ddi_device_acc_attr_t e1000g_buf_acc_attr = { 88 DDI_DEVICE_ATTR_V0, 89 DDI_STRUCTURE_BE_ACC, 90 DDI_STRICTORDER_ACC, 91 }; 92 #else 93 static ddi_device_acc_attr_t e1000g_buf_acc_attr = { 94 DDI_DEVICE_ATTR_V0, 95 DDI_STRUCTURE_LE_ACC, 96 DDI_STRICTORDER_ACC, 97 }; 98 #endif 99 100 /* DMA attributes for tx mblk buffers */ 101 static ddi_dma_attr_t e1000g_tx_dma_attr = { 102 DMA_ATTR_V0, /* version of this structure */ 103 0, /* lowest usable address */ 104 0xffffffffffffffffULL, /* highest usable address */ 105 0x7fffffff, /* maximum DMAable byte count */ 106 1, /* alignment in bytes */ 107 0x7ff, /* burst sizes (any?) */ 108 1, /* minimum transfer */ 109 0xffffffffU, /* maximum transfer */ 110 0xffffffffffffffffULL, /* maximum segment length */ 111 MAX_COOKIES, /* maximum number of segments */ 112 1, /* granularity */ 113 DDI_DMA_FLAGERR, /* dma_attr_flags */ 114 }; 115 116 /* DMA attributes for pre-allocated rx/tx buffers */ 117 static ddi_dma_attr_t e1000g_buf_dma_attr = { 118 DMA_ATTR_V0, /* version of this structure */ 119 0, /* lowest usable address */ 120 0xffffffffffffffffULL, /* highest usable address */ 121 0x7fffffff, /* maximum DMAable byte count */ 122 1, /* alignment in bytes */ 123 0x7ff, /* burst sizes (any?) */ 124 1, /* minimum transfer */ 125 0xffffffffU, /* maximum transfer */ 126 0xffffffffffffffffULL, /* maximum segment length */ 127 1, /* maximum number of segments */ 128 1, /* granularity */ 129 DDI_DMA_FLAGERR, /* dma_attr_flags */ 130 }; 131 132 /* DMA attributes for rx/tx descriptors */ 133 static ddi_dma_attr_t e1000g_desc_dma_attr = { 134 DMA_ATTR_V0, /* version of this structure */ 135 0, /* lowest usable address */ 136 0xffffffffffffffffULL, /* highest usable address */ 137 0x7fffffff, /* maximum DMAable byte count */ 138 E1000_MDALIGN, /* default alignment is 4k but can be changed */ 139 0x7ff, /* burst sizes (any?) */ 140 1, /* minimum transfer */ 141 0xffffffffU, /* maximum transfer */ 142 0xffffffffffffffffULL, /* maximum segment length */ 143 1, /* maximum number of segments */ 144 1, /* granularity */ 145 DDI_DMA_FLAGERR, /* dma_attr_flags */ 146 }; 147 148 #ifdef __sparc 149 static ddi_dma_lim_t e1000g_dma_limits = { 150 (uint_t)0, /* dlim_addr_lo */ 151 (uint_t)0xffffffff, /* dlim_addr_hi */ 152 (uint_t)0xffffffff, /* dlim_cntr_max */ 153 (uint_t)0xfc00fc, /* dlim_burstsizes for 32 and 64 bit xfers */ 154 0x1, /* dlim_minxfer */ 155 1024 /* dlim_speed */ 156 }; 157 #endif 158 159 #ifdef __sparc 160 static dma_type_t e1000g_dma_type = USE_DVMA; 161 #else 162 static dma_type_t e1000g_dma_type = USE_DMA; 163 #endif 164 165 extern krwlock_t e1000g_dma_type_lock; 166 167 168 int 169 e1000g_alloc_dma_resources(struct e1000g *Adapter) 170 { 171 int result; 172 173 result = DDI_FAILURE; 174 175 while ((result != DDI_SUCCESS) && 176 (Adapter->tx_desc_num >= MIN_NUM_TX_DESCRIPTOR) && 177 (Adapter->rx_desc_num >= MIN_NUM_RX_DESCRIPTOR) && 178 (Adapter->tx_freelist_num >= MIN_NUM_TX_FREELIST) && 179 (Adapter->rx_freelist_num >= MIN_NUM_RX_FREELIST)) { 180 181 result = e1000g_alloc_descriptors(Adapter); 182 183 if (result == DDI_SUCCESS) { 184 result = e1000g_alloc_packets(Adapter); 185 186 if (result != DDI_SUCCESS) 187 e1000g_free_descriptors(Adapter); 188 } 189 190 /* 191 * If the allocation fails due to resource shortage, 192 * we'll reduce the numbers of descriptors/buffers by 193 * half, and try the allocation again. 194 */ 195 if (result != DDI_SUCCESS) { 196 /* 197 * We must ensure the number of descriptors 198 * is always a multiple of 8. 199 */ 200 Adapter->tx_desc_num = 201 (Adapter->tx_desc_num >> 4) << 3; 202 Adapter->rx_desc_num = 203 (Adapter->rx_desc_num >> 4) << 3; 204 205 Adapter->tx_freelist_num >>= 1; 206 Adapter->rx_freelist_num >>= 1; 207 } 208 } 209 210 return (result); 211 } 212 213 /* 214 * e1000g_alloc_descriptors - allocate DMA buffers for descriptors 215 * 216 * This routine allocates neccesary DMA buffers for 217 * Transmit Descriptor Area 218 * Receive Descrpitor Area 219 */ 220 static int 221 e1000g_alloc_descriptors(struct e1000g *Adapter) 222 { 223 int result; 224 e1000g_tx_ring_t *tx_ring; 225 e1000g_rx_data_t *rx_data; 226 227 if (Adapter->mem_workaround_82546 && 228 ((Adapter->shared.mac.type == e1000_82545) || 229 (Adapter->shared.mac.type == e1000_82546) || 230 (Adapter->shared.mac.type == e1000_82546_rev_3))) { 231 /* Align on a 64k boundary for these adapter types */ 232 Adapter->desc_align = E1000_MDALIGN_82546; 233 } else { 234 /* Align on a 4k boundary for all other adapter types */ 235 Adapter->desc_align = E1000_MDALIGN; 236 } 237 238 tx_ring = Adapter->tx_ring; 239 240 result = e1000g_alloc_tx_descriptors(tx_ring); 241 if (result != DDI_SUCCESS) 242 return (DDI_FAILURE); 243 244 rx_data = Adapter->rx_ring->rx_data; 245 246 result = e1000g_alloc_rx_descriptors(rx_data); 247 if (result != DDI_SUCCESS) { 248 e1000g_free_tx_descriptors(tx_ring); 249 return (DDI_FAILURE); 250 } 251 252 return (DDI_SUCCESS); 253 } 254 255 static void 256 e1000g_free_descriptors(struct e1000g *Adapter) 257 { 258 e1000g_tx_ring_t *tx_ring; 259 e1000g_rx_data_t *rx_data; 260 261 tx_ring = Adapter->tx_ring; 262 rx_data = Adapter->rx_ring->rx_data; 263 264 e1000g_free_tx_descriptors(tx_ring); 265 e1000g_free_rx_descriptors(rx_data); 266 } 267 268 static int 269 e1000g_alloc_tx_descriptors(e1000g_tx_ring_t *tx_ring) 270 { 271 int mystat; 272 boolean_t alloc_flag; 273 size_t size; 274 size_t len; 275 uintptr_t templong; 276 uint_t cookie_count; 277 dev_info_t *devinfo; 278 ddi_dma_cookie_t cookie; 279 struct e1000g *Adapter; 280 ddi_dma_attr_t dma_attr; 281 282 Adapter = tx_ring->adapter; 283 devinfo = Adapter->dip; 284 285 alloc_flag = B_FALSE; 286 dma_attr = e1000g_desc_dma_attr; 287 288 /* 289 * Solaris 7 has a problem with allocating physically contiguous memory 290 * that is aligned on a 4K boundary. The transmit and rx descriptors 291 * need to aligned on a 4kbyte boundary. We first try to allocate the 292 * memory with DMA attributes set to 4K alignment and also no scatter/ 293 * gather mechanism specified. In most cases, this does not allocate 294 * memory aligned at a 4Kbyte boundary. We then try asking for memory 295 * aligned on 4K boundary with scatter/gather set to 2. This works when 296 * the amount of memory is less than 4k i.e a page size. If neither of 297 * these options work or if the number of descriptors is greater than 298 * 4K, ie more than 256 descriptors, we allocate 4k extra memory and 299 * and then align the memory at a 4k boundary. 300 */ 301 size = sizeof (struct e1000_tx_desc) * Adapter->tx_desc_num; 302 303 /* 304 * Memory allocation for the transmit buffer descriptors. 305 */ 306 dma_attr.dma_attr_sgllen = 1; 307 dma_attr.dma_attr_align = Adapter->desc_align; 308 309 /* 310 * Allocate a new DMA handle for the transmit descriptor 311 * memory area. 312 */ 313 mystat = ddi_dma_alloc_handle(devinfo, &dma_attr, 314 DDI_DMA_DONTWAIT, 0, 315 &tx_ring->tbd_dma_handle); 316 317 if (mystat != DDI_SUCCESS) { 318 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 319 "Could not allocate tbd dma handle: %d", mystat); 320 tx_ring->tbd_dma_handle = NULL; 321 return (DDI_FAILURE); 322 } 323 324 /* 325 * Allocate memory to DMA data to and from the transmit 326 * descriptors. 327 */ 328 mystat = ddi_dma_mem_alloc(tx_ring->tbd_dma_handle, 329 size, 330 &e1000g_desc_acc_attr, DDI_DMA_CONSISTENT, 331 DDI_DMA_DONTWAIT, 0, 332 (caddr_t *)&tx_ring->tbd_area, 333 &len, &tx_ring->tbd_acc_handle); 334 335 if ((mystat != DDI_SUCCESS) || 336 ((uintptr_t)tx_ring->tbd_area & (Adapter->desc_align - 1))) { 337 if (mystat == DDI_SUCCESS) { 338 ddi_dma_mem_free(&tx_ring->tbd_acc_handle); 339 tx_ring->tbd_acc_handle = NULL; 340 tx_ring->tbd_area = NULL; 341 } 342 if (tx_ring->tbd_dma_handle != NULL) { 343 ddi_dma_free_handle(&tx_ring->tbd_dma_handle); 344 tx_ring->tbd_dma_handle = NULL; 345 } 346 alloc_flag = B_FALSE; 347 } else 348 alloc_flag = B_TRUE; 349 350 /* 351 * Initialize the entire transmit buffer descriptor area to zero 352 */ 353 if (alloc_flag) 354 bzero(tx_ring->tbd_area, len); 355 356 /* 357 * If the previous DMA attributes setting could not give us contiguous 358 * memory or the number of descriptors is greater than the page size, 359 * we allocate extra memory and then align it at appropriate boundary. 360 */ 361 if (!alloc_flag) { 362 size = size + Adapter->desc_align; 363 364 /* 365 * DMA attributes set to no scatter/gather and 16 bit alignment 366 */ 367 dma_attr.dma_attr_align = 1; 368 dma_attr.dma_attr_sgllen = 1; 369 370 /* 371 * Allocate a new DMA handle for the transmit descriptor memory 372 * area. 373 */ 374 mystat = ddi_dma_alloc_handle(devinfo, &dma_attr, 375 DDI_DMA_DONTWAIT, 0, 376 &tx_ring->tbd_dma_handle); 377 378 if (mystat != DDI_SUCCESS) { 379 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 380 "Could not re-allocate tbd dma handle: %d", mystat); 381 tx_ring->tbd_dma_handle = NULL; 382 return (DDI_FAILURE); 383 } 384 385 /* 386 * Allocate memory to DMA data to and from the transmit 387 * descriptors. 388 */ 389 mystat = ddi_dma_mem_alloc(tx_ring->tbd_dma_handle, 390 size, 391 &e1000g_desc_acc_attr, DDI_DMA_CONSISTENT, 392 DDI_DMA_DONTWAIT, 0, 393 (caddr_t *)&tx_ring->tbd_area, 394 &len, &tx_ring->tbd_acc_handle); 395 396 if (mystat != DDI_SUCCESS) { 397 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 398 "Could not allocate tbd dma memory: %d", mystat); 399 tx_ring->tbd_acc_handle = NULL; 400 tx_ring->tbd_area = NULL; 401 if (tx_ring->tbd_dma_handle != NULL) { 402 ddi_dma_free_handle(&tx_ring->tbd_dma_handle); 403 tx_ring->tbd_dma_handle = NULL; 404 } 405 return (DDI_FAILURE); 406 } else 407 alloc_flag = B_TRUE; 408 409 /* 410 * Initialize the entire transmit buffer descriptor area to zero 411 */ 412 bzero(tx_ring->tbd_area, len); 413 /* 414 * Memory has been allocated with the ddi_dma_mem_alloc call, 415 * but has not been aligned. 416 * We now align it on the appropriate boundary. 417 */ 418 templong = P2NPHASE((uintptr_t)tx_ring->tbd_area, 419 Adapter->desc_align); 420 len = size - templong; 421 templong += (uintptr_t)tx_ring->tbd_area; 422 tx_ring->tbd_area = (struct e1000_tx_desc *)templong; 423 } /* alignment workaround */ 424 425 /* 426 * Transmit buffer descriptor memory allocation succeeded 427 */ 428 ASSERT(alloc_flag); 429 430 /* 431 * Allocates DMA resources for the memory that was allocated by 432 * the ddi_dma_mem_alloc call. The DMA resources then get bound to the 433 * the memory address 434 */ 435 mystat = ddi_dma_addr_bind_handle(tx_ring->tbd_dma_handle, 436 (struct as *)NULL, (caddr_t)tx_ring->tbd_area, 437 len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 438 DDI_DMA_DONTWAIT, 0, &cookie, &cookie_count); 439 440 if (mystat != DDI_SUCCESS) { 441 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 442 "Could not bind tbd dma resource: %d", mystat); 443 if (tx_ring->tbd_acc_handle != NULL) { 444 ddi_dma_mem_free(&tx_ring->tbd_acc_handle); 445 tx_ring->tbd_acc_handle = NULL; 446 tx_ring->tbd_area = NULL; 447 } 448 if (tx_ring->tbd_dma_handle != NULL) { 449 ddi_dma_free_handle(&tx_ring->tbd_dma_handle); 450 tx_ring->tbd_dma_handle = NULL; 451 } 452 return (DDI_FAILURE); 453 } 454 455 ASSERT(cookie_count == 1); /* 1 cookie */ 456 457 if (cookie_count != 1) { 458 E1000G_DEBUGLOG_2(Adapter, E1000G_WARN_LEVEL, 459 "Could not bind tbd dma resource in a single frag. " 460 "Count - %d Len - %d", cookie_count, len); 461 e1000g_free_tx_descriptors(tx_ring); 462 return (DDI_FAILURE); 463 } 464 465 tx_ring->tbd_dma_addr = cookie.dmac_laddress; 466 tx_ring->tbd_first = tx_ring->tbd_area; 467 tx_ring->tbd_last = tx_ring->tbd_first + 468 (Adapter->tx_desc_num - 1); 469 470 return (DDI_SUCCESS); 471 } 472 473 static int 474 e1000g_alloc_rx_descriptors(e1000g_rx_data_t *rx_data) 475 { 476 int mystat; 477 boolean_t alloc_flag; 478 size_t size; 479 size_t len; 480 uintptr_t templong; 481 uint_t cookie_count; 482 dev_info_t *devinfo; 483 ddi_dma_cookie_t cookie; 484 struct e1000g *Adapter; 485 ddi_dma_attr_t dma_attr; 486 487 Adapter = rx_data->rx_ring->adapter; 488 devinfo = Adapter->dip; 489 490 alloc_flag = B_FALSE; 491 dma_attr = e1000g_desc_dma_attr; 492 493 /* 494 * Memory allocation for the receive buffer descriptors. 495 */ 496 size = (sizeof (struct e1000_rx_desc)) * Adapter->rx_desc_num; 497 498 /* 499 * Asking for aligned memory with DMA attributes set for suitable value 500 */ 501 dma_attr.dma_attr_sgllen = 1; 502 dma_attr.dma_attr_align = Adapter->desc_align; 503 504 /* 505 * Allocate a new DMA handle for the receive descriptors 506 */ 507 mystat = ddi_dma_alloc_handle(devinfo, &dma_attr, 508 DDI_DMA_DONTWAIT, 0, 509 &rx_data->rbd_dma_handle); 510 511 if (mystat != DDI_SUCCESS) { 512 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 513 "Could not allocate rbd dma handle: %d", mystat); 514 rx_data->rbd_dma_handle = NULL; 515 return (DDI_FAILURE); 516 } 517 /* 518 * Allocate memory to DMA data to and from the receive 519 * descriptors. 520 */ 521 mystat = ddi_dma_mem_alloc(rx_data->rbd_dma_handle, 522 size, 523 &e1000g_desc_acc_attr, DDI_DMA_CONSISTENT, 524 DDI_DMA_DONTWAIT, 0, 525 (caddr_t *)&rx_data->rbd_area, 526 &len, &rx_data->rbd_acc_handle); 527 528 /* 529 * Check if memory allocation succeeded and also if the 530 * allocated memory is aligned correctly. 531 */ 532 if ((mystat != DDI_SUCCESS) || 533 ((uintptr_t)rx_data->rbd_area & (Adapter->desc_align - 1))) { 534 if (mystat == DDI_SUCCESS) { 535 ddi_dma_mem_free(&rx_data->rbd_acc_handle); 536 rx_data->rbd_acc_handle = NULL; 537 rx_data->rbd_area = NULL; 538 } 539 if (rx_data->rbd_dma_handle != NULL) { 540 ddi_dma_free_handle(&rx_data->rbd_dma_handle); 541 rx_data->rbd_dma_handle = NULL; 542 } 543 alloc_flag = B_FALSE; 544 } else 545 alloc_flag = B_TRUE; 546 547 /* 548 * Initialize the allocated receive descriptor memory to zero. 549 */ 550 if (alloc_flag) 551 bzero((caddr_t)rx_data->rbd_area, len); 552 553 /* 554 * If memory allocation did not succeed, do the alignment ourselves 555 */ 556 if (!alloc_flag) { 557 dma_attr.dma_attr_align = 1; 558 dma_attr.dma_attr_sgllen = 1; 559 size = size + Adapter->desc_align; 560 /* 561 * Allocate a new DMA handle for the receive descriptor. 562 */ 563 mystat = ddi_dma_alloc_handle(devinfo, &dma_attr, 564 DDI_DMA_DONTWAIT, 0, 565 &rx_data->rbd_dma_handle); 566 567 if (mystat != DDI_SUCCESS) { 568 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 569 "Could not re-allocate rbd dma handle: %d", mystat); 570 rx_data->rbd_dma_handle = NULL; 571 return (DDI_FAILURE); 572 } 573 /* 574 * Allocate memory to DMA data to and from the receive 575 * descriptors. 576 */ 577 mystat = ddi_dma_mem_alloc(rx_data->rbd_dma_handle, 578 size, 579 &e1000g_desc_acc_attr, DDI_DMA_CONSISTENT, 580 DDI_DMA_DONTWAIT, 0, 581 (caddr_t *)&rx_data->rbd_area, 582 &len, &rx_data->rbd_acc_handle); 583 584 if (mystat != DDI_SUCCESS) { 585 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 586 "Could not allocate rbd dma memory: %d", mystat); 587 rx_data->rbd_acc_handle = NULL; 588 rx_data->rbd_area = NULL; 589 if (rx_data->rbd_dma_handle != NULL) { 590 ddi_dma_free_handle(&rx_data->rbd_dma_handle); 591 rx_data->rbd_dma_handle = NULL; 592 } 593 return (DDI_FAILURE); 594 } else 595 alloc_flag = B_TRUE; 596 597 /* 598 * Initialize the allocated receive descriptor memory to zero. 599 */ 600 bzero((caddr_t)rx_data->rbd_area, len); 601 templong = P2NPHASE((uintptr_t)rx_data->rbd_area, 602 Adapter->desc_align); 603 len = size - templong; 604 templong += (uintptr_t)rx_data->rbd_area; 605 rx_data->rbd_area = (struct e1000_rx_desc *)templong; 606 } /* alignment workaround */ 607 608 /* 609 * The memory allocation of the receive descriptors succeeded 610 */ 611 ASSERT(alloc_flag); 612 613 /* 614 * Allocates DMA resources for the memory that was allocated by 615 * the ddi_dma_mem_alloc call. 616 */ 617 mystat = ddi_dma_addr_bind_handle(rx_data->rbd_dma_handle, 618 (struct as *)NULL, (caddr_t)rx_data->rbd_area, 619 len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 620 DDI_DMA_DONTWAIT, 0, &cookie, &cookie_count); 621 622 if (mystat != DDI_SUCCESS) { 623 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 624 "Could not bind rbd dma resource: %d", mystat); 625 if (rx_data->rbd_acc_handle != NULL) { 626 ddi_dma_mem_free(&rx_data->rbd_acc_handle); 627 rx_data->rbd_acc_handle = NULL; 628 rx_data->rbd_area = NULL; 629 } 630 if (rx_data->rbd_dma_handle != NULL) { 631 ddi_dma_free_handle(&rx_data->rbd_dma_handle); 632 rx_data->rbd_dma_handle = NULL; 633 } 634 return (DDI_FAILURE); 635 } 636 637 ASSERT(cookie_count == 1); 638 if (cookie_count != 1) { 639 E1000G_DEBUGLOG_2(Adapter, E1000G_WARN_LEVEL, 640 "Could not bind rbd dma resource in a single frag. " 641 "Count - %d Len - %d", cookie_count, len); 642 e1000g_free_rx_descriptors(rx_data); 643 return (DDI_FAILURE); 644 } 645 646 rx_data->rbd_dma_addr = cookie.dmac_laddress; 647 rx_data->rbd_first = rx_data->rbd_area; 648 rx_data->rbd_last = rx_data->rbd_first + 649 (Adapter->rx_desc_num - 1); 650 651 return (DDI_SUCCESS); 652 } 653 654 static void 655 e1000g_free_rx_descriptors(e1000g_rx_data_t *rx_data) 656 { 657 if (rx_data->rbd_dma_handle != NULL) { 658 (void) ddi_dma_unbind_handle(rx_data->rbd_dma_handle); 659 } 660 if (rx_data->rbd_acc_handle != NULL) { 661 ddi_dma_mem_free(&rx_data->rbd_acc_handle); 662 rx_data->rbd_acc_handle = NULL; 663 rx_data->rbd_area = NULL; 664 } 665 if (rx_data->rbd_dma_handle != NULL) { 666 ddi_dma_free_handle(&rx_data->rbd_dma_handle); 667 rx_data->rbd_dma_handle = NULL; 668 } 669 rx_data->rbd_dma_addr = NULL; 670 rx_data->rbd_first = NULL; 671 rx_data->rbd_last = NULL; 672 } 673 674 static void 675 e1000g_free_tx_descriptors(e1000g_tx_ring_t *tx_ring) 676 { 677 if (tx_ring->tbd_dma_handle != NULL) { 678 (void) ddi_dma_unbind_handle(tx_ring->tbd_dma_handle); 679 } 680 if (tx_ring->tbd_acc_handle != NULL) { 681 ddi_dma_mem_free(&tx_ring->tbd_acc_handle); 682 tx_ring->tbd_acc_handle = NULL; 683 tx_ring->tbd_area = NULL; 684 } 685 if (tx_ring->tbd_dma_handle != NULL) { 686 ddi_dma_free_handle(&tx_ring->tbd_dma_handle); 687 tx_ring->tbd_dma_handle = NULL; 688 } 689 tx_ring->tbd_dma_addr = NULL; 690 tx_ring->tbd_first = NULL; 691 tx_ring->tbd_last = NULL; 692 } 693 694 695 /* 696 * e1000g_alloc_packets - allocate DMA buffers for rx/tx 697 * 698 * This routine allocates neccesary buffers for 699 * Transmit sw packet structure 700 * DMA handle for Transmit 701 * DMA buffer for Transmit 702 * Receive sw packet structure 703 * DMA buffer for Receive 704 */ 705 static int 706 e1000g_alloc_packets(struct e1000g *Adapter) 707 { 708 int result; 709 e1000g_tx_ring_t *tx_ring; 710 e1000g_rx_data_t *rx_data; 711 712 tx_ring = Adapter->tx_ring; 713 rx_data = Adapter->rx_ring->rx_data; 714 715 again: 716 rw_enter(&e1000g_dma_type_lock, RW_READER); 717 718 result = e1000g_alloc_tx_packets(tx_ring); 719 if (result != DDI_SUCCESS) { 720 if (e1000g_dma_type == USE_DVMA) { 721 rw_exit(&e1000g_dma_type_lock); 722 723 rw_enter(&e1000g_dma_type_lock, RW_WRITER); 724 e1000g_dma_type = USE_DMA; 725 rw_exit(&e1000g_dma_type_lock); 726 727 E1000G_DEBUGLOG_0(Adapter, E1000G_INFO_LEVEL, 728 "No enough dvma resource for Tx packets, " 729 "trying to allocate dma buffers...\n"); 730 goto again; 731 } 732 rw_exit(&e1000g_dma_type_lock); 733 734 E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL, 735 "Failed to allocate dma buffers for Tx packets\n"); 736 return (DDI_FAILURE); 737 } 738 739 result = e1000g_alloc_rx_packets(rx_data); 740 if (result != DDI_SUCCESS) { 741 e1000g_free_tx_packets(tx_ring); 742 if (e1000g_dma_type == USE_DVMA) { 743 rw_exit(&e1000g_dma_type_lock); 744 745 rw_enter(&e1000g_dma_type_lock, RW_WRITER); 746 e1000g_dma_type = USE_DMA; 747 rw_exit(&e1000g_dma_type_lock); 748 749 E1000G_DEBUGLOG_0(Adapter, E1000G_INFO_LEVEL, 750 "No enough dvma resource for Rx packets, " 751 "trying to allocate dma buffers...\n"); 752 goto again; 753 } 754 rw_exit(&e1000g_dma_type_lock); 755 756 E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL, 757 "Failed to allocate dma buffers for Rx packets\n"); 758 return (DDI_FAILURE); 759 } 760 761 rw_exit(&e1000g_dma_type_lock); 762 763 return (DDI_SUCCESS); 764 } 765 766 static void 767 e1000g_free_packets(struct e1000g *Adapter) 768 { 769 e1000g_tx_ring_t *tx_ring; 770 e1000g_rx_data_t *rx_data; 771 772 tx_ring = Adapter->tx_ring; 773 rx_data = Adapter->rx_ring->rx_data; 774 775 e1000g_free_tx_packets(tx_ring); 776 e1000g_free_rx_packets(rx_data); 777 } 778 779 #ifdef __sparc 780 static int 781 e1000g_alloc_dvma_buffer(struct e1000g *Adapter, 782 dma_buffer_t *buf, size_t size) 783 { 784 int mystat; 785 dev_info_t *devinfo; 786 ddi_dma_cookie_t cookie; 787 788 if (e1000g_force_detach) 789 devinfo = Adapter->priv_dip; 790 else 791 devinfo = Adapter->dip; 792 793 mystat = dvma_reserve(devinfo, 794 &e1000g_dma_limits, 795 Adapter->dvma_page_num, 796 &buf->dma_handle); 797 798 if (mystat != DDI_SUCCESS) { 799 buf->dma_handle = NULL; 800 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 801 "Could not allocate dvma buffer handle: %d\n", mystat); 802 return (DDI_FAILURE); 803 } 804 805 buf->address = kmem_alloc(size, KM_NOSLEEP); 806 807 if (buf->address == NULL) { 808 if (buf->dma_handle != NULL) { 809 dvma_release(buf->dma_handle); 810 buf->dma_handle = NULL; 811 } 812 E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL, 813 "Could not allocate dvma buffer memory\n"); 814 return (DDI_FAILURE); 815 } 816 817 dvma_kaddr_load(buf->dma_handle, 818 buf->address, size, 0, &cookie); 819 820 buf->dma_address = cookie.dmac_laddress; 821 buf->size = size; 822 buf->len = 0; 823 824 return (DDI_SUCCESS); 825 } 826 827 static void 828 e1000g_free_dvma_buffer(dma_buffer_t *buf) 829 { 830 if (buf->dma_handle != NULL) { 831 dvma_unload(buf->dma_handle, 0, -1); 832 } else { 833 return; 834 } 835 836 buf->dma_address = NULL; 837 838 if (buf->address != NULL) { 839 kmem_free(buf->address, buf->size); 840 buf->address = NULL; 841 } 842 843 if (buf->dma_handle != NULL) { 844 dvma_release(buf->dma_handle); 845 buf->dma_handle = NULL; 846 } 847 848 buf->size = 0; 849 buf->len = 0; 850 } 851 #endif 852 853 static int 854 e1000g_alloc_dma_buffer(struct e1000g *Adapter, 855 dma_buffer_t *buf, size_t size, ddi_dma_attr_t *p_dma_attr) 856 { 857 int mystat; 858 dev_info_t *devinfo; 859 ddi_dma_cookie_t cookie; 860 size_t len; 861 uint_t count; 862 863 if (e1000g_force_detach) 864 devinfo = Adapter->priv_dip; 865 else 866 devinfo = Adapter->dip; 867 868 mystat = ddi_dma_alloc_handle(devinfo, 869 p_dma_attr, 870 DDI_DMA_DONTWAIT, 0, 871 &buf->dma_handle); 872 873 if (mystat != DDI_SUCCESS) { 874 buf->dma_handle = NULL; 875 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 876 "Could not allocate dma buffer handle: %d\n", mystat); 877 return (DDI_FAILURE); 878 } 879 880 mystat = ddi_dma_mem_alloc(buf->dma_handle, 881 size, &e1000g_buf_acc_attr, DDI_DMA_STREAMING, 882 DDI_DMA_DONTWAIT, 0, 883 &buf->address, 884 &len, &buf->acc_handle); 885 886 if (mystat != DDI_SUCCESS) { 887 buf->acc_handle = NULL; 888 buf->address = NULL; 889 if (buf->dma_handle != NULL) { 890 ddi_dma_free_handle(&buf->dma_handle); 891 buf->dma_handle = NULL; 892 } 893 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 894 "Could not allocate dma buffer memory: %d\n", mystat); 895 return (DDI_FAILURE); 896 } 897 898 mystat = ddi_dma_addr_bind_handle(buf->dma_handle, 899 (struct as *)NULL, 900 buf->address, 901 len, DDI_DMA_RDWR | DDI_DMA_STREAMING, 902 DDI_DMA_DONTWAIT, 0, &cookie, &count); 903 904 if (mystat != DDI_SUCCESS) { 905 if (buf->acc_handle != NULL) { 906 ddi_dma_mem_free(&buf->acc_handle); 907 buf->acc_handle = NULL; 908 buf->address = NULL; 909 } 910 if (buf->dma_handle != NULL) { 911 ddi_dma_free_handle(&buf->dma_handle); 912 buf->dma_handle = NULL; 913 } 914 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 915 "Could not bind buffer dma handle: %d\n", mystat); 916 return (DDI_FAILURE); 917 } 918 919 ASSERT(count == 1); 920 if (count != 1) { 921 if (buf->dma_handle != NULL) { 922 (void) ddi_dma_unbind_handle(buf->dma_handle); 923 } 924 if (buf->acc_handle != NULL) { 925 ddi_dma_mem_free(&buf->acc_handle); 926 buf->acc_handle = NULL; 927 buf->address = NULL; 928 } 929 if (buf->dma_handle != NULL) { 930 ddi_dma_free_handle(&buf->dma_handle); 931 buf->dma_handle = NULL; 932 } 933 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 934 "Could not bind buffer as a single frag. " 935 "Count = %d\n", count); 936 return (DDI_FAILURE); 937 } 938 939 buf->dma_address = cookie.dmac_laddress; 940 buf->size = len; 941 buf->len = 0; 942 943 return (DDI_SUCCESS); 944 } 945 946 /* 947 * e1000g_alloc_dma_buffer_82546 - allocate a dma buffer along with all 948 * necessary handles. Same as e1000g_alloc_dma_buffer() except ensure 949 * that buffer that doesn't cross a 64k boundary. 950 */ 951 static int 952 e1000g_alloc_dma_buffer_82546(struct e1000g *Adapter, 953 dma_buffer_t *buf, size_t size, ddi_dma_attr_t *p_dma_attr) 954 { 955 int mystat; 956 dev_info_t *devinfo; 957 ddi_dma_cookie_t cookie; 958 size_t len; 959 uint_t count; 960 961 if (e1000g_force_detach) 962 devinfo = Adapter->priv_dip; 963 else 964 devinfo = Adapter->dip; 965 966 mystat = ddi_dma_alloc_handle(devinfo, 967 p_dma_attr, 968 DDI_DMA_DONTWAIT, 0, 969 &buf->dma_handle); 970 971 if (mystat != DDI_SUCCESS) { 972 buf->dma_handle = NULL; 973 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 974 "Could not allocate dma buffer handle: %d\n", mystat); 975 return (DDI_FAILURE); 976 } 977 978 mystat = e1000g_dma_mem_alloc_82546(buf, size, &len); 979 if (mystat != DDI_SUCCESS) { 980 buf->acc_handle = NULL; 981 buf->address = NULL; 982 if (buf->dma_handle != NULL) { 983 ddi_dma_free_handle(&buf->dma_handle); 984 buf->dma_handle = NULL; 985 } 986 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 987 "Could not allocate dma buffer memory: %d\n", mystat); 988 return (DDI_FAILURE); 989 } 990 991 mystat = ddi_dma_addr_bind_handle(buf->dma_handle, 992 (struct as *)NULL, 993 buf->address, 994 len, DDI_DMA_READ | DDI_DMA_STREAMING, 995 DDI_DMA_DONTWAIT, 0, &cookie, &count); 996 997 if (mystat != DDI_SUCCESS) { 998 if (buf->acc_handle != NULL) { 999 ddi_dma_mem_free(&buf->acc_handle); 1000 buf->acc_handle = NULL; 1001 buf->address = NULL; 1002 } 1003 if (buf->dma_handle != NULL) { 1004 ddi_dma_free_handle(&buf->dma_handle); 1005 buf->dma_handle = NULL; 1006 } 1007 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 1008 "Could not bind buffer dma handle: %d\n", mystat); 1009 return (DDI_FAILURE); 1010 } 1011 1012 ASSERT(count == 1); 1013 if (count != 1) { 1014 if (buf->dma_handle != NULL) { 1015 (void) ddi_dma_unbind_handle(buf->dma_handle); 1016 } 1017 if (buf->acc_handle != NULL) { 1018 ddi_dma_mem_free(&buf->acc_handle); 1019 buf->acc_handle = NULL; 1020 buf->address = NULL; 1021 } 1022 if (buf->dma_handle != NULL) { 1023 ddi_dma_free_handle(&buf->dma_handle); 1024 buf->dma_handle = NULL; 1025 } 1026 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 1027 "Could not bind buffer as a single frag. " 1028 "Count = %d\n", count); 1029 return (DDI_FAILURE); 1030 } 1031 1032 buf->dma_address = cookie.dmac_laddress; 1033 buf->size = len; 1034 buf->len = 0; 1035 1036 return (DDI_SUCCESS); 1037 } 1038 1039 /* 1040 * e1000g_dma_mem_alloc_82546 - allocate a dma buffer, making up to 1041 * ALLOC_RETRY attempts to get a buffer that doesn't cross a 64k boundary. 1042 */ 1043 static int 1044 e1000g_dma_mem_alloc_82546(dma_buffer_t *buf, size_t size, size_t *len) 1045 { 1046 #define ALLOC_RETRY 10 1047 int stat; 1048 int cnt = 0; 1049 ddi_acc_handle_t hold[ALLOC_RETRY]; 1050 1051 while (cnt < ALLOC_RETRY) { 1052 hold[cnt] = NULL; 1053 1054 /* allocate memory */ 1055 stat = ddi_dma_mem_alloc(buf->dma_handle, size, 1056 &e1000g_buf_acc_attr, DDI_DMA_STREAMING, DDI_DMA_DONTWAIT, 1057 0, &buf->address, len, &buf->acc_handle); 1058 1059 if (stat != DDI_SUCCESS) { 1060 break; 1061 } 1062 1063 /* 1064 * Check 64k bounday: 1065 * if it is bad, hold it and retry 1066 * if it is good, exit loop 1067 */ 1068 if (e1000g_cross_64k_bound(buf->address, *len)) { 1069 hold[cnt] = buf->acc_handle; 1070 stat = DDI_FAILURE; 1071 } else { 1072 break; 1073 } 1074 1075 cnt++; 1076 } 1077 1078 /* Release any held buffers crossing 64k bounday */ 1079 for (--cnt; cnt >= 0; cnt--) { 1080 if (hold[cnt]) 1081 ddi_dma_mem_free(&hold[cnt]); 1082 } 1083 1084 return (stat); 1085 } 1086 1087 /* 1088 * e1000g_cross_64k_bound - If starting and ending address cross a 64k boundary 1089 * return true; otherwise return false 1090 */ 1091 static boolean_t 1092 e1000g_cross_64k_bound(void *addr, uintptr_t len) 1093 { 1094 uintptr_t start = (uintptr_t)addr; 1095 uintptr_t end = start + len - 1; 1096 1097 return (((start ^ end) >> 16) == 0 ? B_FALSE : B_TRUE); 1098 } 1099 1100 static void 1101 e1000g_free_dma_buffer(dma_buffer_t *buf) 1102 { 1103 if (buf->dma_handle != NULL) { 1104 (void) ddi_dma_unbind_handle(buf->dma_handle); 1105 } else { 1106 return; 1107 } 1108 1109 buf->dma_address = NULL; 1110 1111 if (buf->acc_handle != NULL) { 1112 ddi_dma_mem_free(&buf->acc_handle); 1113 buf->acc_handle = NULL; 1114 buf->address = NULL; 1115 } 1116 1117 if (buf->dma_handle != NULL) { 1118 ddi_dma_free_handle(&buf->dma_handle); 1119 buf->dma_handle = NULL; 1120 } 1121 1122 buf->size = 0; 1123 buf->len = 0; 1124 } 1125 1126 static int 1127 e1000g_alloc_tx_packets(e1000g_tx_ring_t *tx_ring) 1128 { 1129 int j; 1130 p_tx_sw_packet_t packet; 1131 int mystat; 1132 dma_buffer_t *tx_buf; 1133 struct e1000g *Adapter; 1134 dev_info_t *devinfo; 1135 ddi_dma_attr_t dma_attr; 1136 1137 Adapter = tx_ring->adapter; 1138 devinfo = Adapter->dip; 1139 dma_attr = e1000g_buf_dma_attr; 1140 1141 /* 1142 * Memory allocation for the Transmit software structure, the transmit 1143 * software packet. This structure stores all the relevant information 1144 * for transmitting a single packet. 1145 */ 1146 tx_ring->packet_area = 1147 kmem_zalloc(TX_SW_PKT_AREA_SZ, KM_NOSLEEP); 1148 1149 if (tx_ring->packet_area == NULL) 1150 return (DDI_FAILURE); 1151 1152 for (j = 0, packet = tx_ring->packet_area; 1153 j < Adapter->tx_freelist_num; j++, packet++) { 1154 1155 ASSERT(packet != NULL); 1156 1157 /* 1158 * Pre-allocate dma handles for transmit. These dma handles 1159 * will be dynamically bound to the data buffers passed down 1160 * from the upper layers at the time of transmitting. The 1161 * dynamic binding only applies for the packets that are larger 1162 * than the tx_bcopy_thresh. 1163 */ 1164 switch (e1000g_dma_type) { 1165 #ifdef __sparc 1166 case USE_DVMA: 1167 mystat = dvma_reserve(devinfo, 1168 &e1000g_dma_limits, 1169 Adapter->dvma_page_num, 1170 &packet->tx_dma_handle); 1171 break; 1172 #endif 1173 case USE_DMA: 1174 mystat = ddi_dma_alloc_handle(devinfo, 1175 &e1000g_tx_dma_attr, 1176 DDI_DMA_DONTWAIT, 0, 1177 &packet->tx_dma_handle); 1178 break; 1179 default: 1180 ASSERT(B_FALSE); 1181 break; 1182 } 1183 if (mystat != DDI_SUCCESS) { 1184 packet->tx_dma_handle = NULL; 1185 E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL, 1186 "Could not allocate tx dma handle: %d\n", mystat); 1187 goto tx_pkt_fail; 1188 } 1189 1190 /* 1191 * Pre-allocate transmit buffers for small packets that the 1192 * size is less than tx_bcopy_thresh. The data of those small 1193 * packets will be bcopy() to the transmit buffers instead of 1194 * using dynamical DMA binding. For small packets, bcopy will 1195 * bring better performance than DMA binding. 1196 */ 1197 tx_buf = packet->tx_buf; 1198 1199 switch (e1000g_dma_type) { 1200 #ifdef __sparc 1201 case USE_DVMA: 1202 mystat = e1000g_alloc_dvma_buffer(Adapter, 1203 tx_buf, Adapter->tx_buffer_size); 1204 break; 1205 #endif 1206 case USE_DMA: 1207 mystat = e1000g_alloc_dma_buffer(Adapter, 1208 tx_buf, Adapter->tx_buffer_size, &dma_attr); 1209 break; 1210 default: 1211 ASSERT(B_FALSE); 1212 break; 1213 } 1214 if (mystat != DDI_SUCCESS) { 1215 ASSERT(packet->tx_dma_handle != NULL); 1216 switch (e1000g_dma_type) { 1217 #ifdef __sparc 1218 case USE_DVMA: 1219 dvma_release(packet->tx_dma_handle); 1220 break; 1221 #endif 1222 case USE_DMA: 1223 ddi_dma_free_handle(&packet->tx_dma_handle); 1224 break; 1225 default: 1226 ASSERT(B_FALSE); 1227 break; 1228 } 1229 packet->tx_dma_handle = NULL; 1230 E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL, 1231 "Allocate Tx buffer fail\n"); 1232 goto tx_pkt_fail; 1233 } 1234 1235 packet->dma_type = e1000g_dma_type; 1236 } /* for */ 1237 1238 return (DDI_SUCCESS); 1239 1240 tx_pkt_fail: 1241 e1000g_free_tx_packets(tx_ring); 1242 1243 return (DDI_FAILURE); 1244 } 1245 1246 static int 1247 e1000g_alloc_rx_packets(e1000g_rx_data_t *rx_data) 1248 { 1249 int i; 1250 p_rx_sw_packet_t packet; 1251 struct e1000g *Adapter; 1252 uint32_t packet_num; 1253 ddi_dma_attr_t dma_attr; 1254 1255 Adapter = rx_data->rx_ring->adapter; 1256 dma_attr = e1000g_buf_dma_attr; 1257 dma_attr.dma_attr_align = Adapter->rx_buf_align; 1258 1259 /* 1260 * Allocate memory for the rx_sw_packet structures. Each one of these 1261 * structures will contain a virtual and physical address to an actual 1262 * receive buffer in host memory. Since we use one rx_sw_packet per 1263 * received packet, the maximum number of rx_sw_packet that we'll 1264 * need is equal to the number of receive descriptors plus the freelist 1265 * size. 1266 */ 1267 packet_num = Adapter->rx_desc_num + Adapter->rx_freelist_num; 1268 rx_data->packet_area = NULL; 1269 1270 for (i = 0; i < packet_num; i++) { 1271 packet = e1000g_alloc_rx_sw_packet(rx_data, &dma_attr); 1272 if (packet == NULL) 1273 goto rx_pkt_fail; 1274 1275 packet->next = rx_data->packet_area; 1276 rx_data->packet_area = packet; 1277 } 1278 1279 return (DDI_SUCCESS); 1280 1281 rx_pkt_fail: 1282 e1000g_free_rx_packets(rx_data); 1283 1284 return (DDI_FAILURE); 1285 } 1286 1287 static p_rx_sw_packet_t 1288 e1000g_alloc_rx_sw_packet(e1000g_rx_data_t *rx_data, ddi_dma_attr_t *p_dma_attr) 1289 { 1290 int mystat; 1291 p_rx_sw_packet_t packet; 1292 dma_buffer_t *rx_buf; 1293 struct e1000g *Adapter; 1294 1295 Adapter = rx_data->rx_ring->adapter; 1296 1297 packet = kmem_zalloc(sizeof (rx_sw_packet_t), KM_NOSLEEP); 1298 if (packet == NULL) { 1299 E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL, 1300 "Cound not allocate memory for Rx SwPacket\n"); 1301 return (NULL); 1302 } 1303 1304 rx_buf = packet->rx_buf; 1305 1306 switch (e1000g_dma_type) { 1307 #ifdef __sparc 1308 case USE_DVMA: 1309 mystat = e1000g_alloc_dvma_buffer(Adapter, 1310 rx_buf, Adapter->rx_buffer_size); 1311 break; 1312 #endif 1313 case USE_DMA: 1314 if (Adapter->mem_workaround_82546 && 1315 ((Adapter->shared.mac.type == e1000_82545) || 1316 (Adapter->shared.mac.type == e1000_82546) || 1317 (Adapter->shared.mac.type == e1000_82546_rev_3))) { 1318 mystat = e1000g_alloc_dma_buffer_82546(Adapter, 1319 rx_buf, Adapter->rx_buffer_size, p_dma_attr); 1320 } else { 1321 mystat = e1000g_alloc_dma_buffer(Adapter, 1322 rx_buf, Adapter->rx_buffer_size, p_dma_attr); 1323 } 1324 break; 1325 default: 1326 ASSERT(B_FALSE); 1327 break; 1328 } 1329 1330 if (mystat != DDI_SUCCESS) { 1331 if (packet != NULL) 1332 kmem_free(packet, sizeof (rx_sw_packet_t)); 1333 1334 E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL, 1335 "Failed to allocate Rx buffer\n"); 1336 return (NULL); 1337 } 1338 1339 rx_buf->size -= E1000G_IPALIGNROOM; 1340 rx_buf->address += E1000G_IPALIGNROOM; 1341 rx_buf->dma_address += E1000G_IPALIGNROOM; 1342 1343 packet->rx_data = (caddr_t)rx_data; 1344 packet->free_rtn.free_func = e1000g_rxfree_func; 1345 packet->free_rtn.free_arg = (char *)packet; 1346 /* 1347 * esballoc is changed to desballoc which 1348 * is undocumented call but as per sun, 1349 * we can use it. It gives better efficiency. 1350 */ 1351 packet->mp = desballoc((unsigned char *) 1352 rx_buf->address, 1353 rx_buf->size, 1354 BPRI_MED, &packet->free_rtn); 1355 1356 packet->dma_type = e1000g_dma_type; 1357 packet->ref_cnt = 1; 1358 1359 return (packet); 1360 } 1361 1362 void 1363 e1000g_free_rx_sw_packet(p_rx_sw_packet_t packet, boolean_t full_release) 1364 { 1365 dma_buffer_t *rx_buf; 1366 1367 if (packet->mp != NULL) { 1368 freemsg(packet->mp); 1369 packet->mp = NULL; 1370 } 1371 1372 rx_buf = packet->rx_buf; 1373 1374 switch (packet->dma_type) { 1375 #ifdef __sparc 1376 case USE_DVMA: 1377 if (rx_buf->address != NULL) { 1378 rx_buf->size += E1000G_IPALIGNROOM; 1379 rx_buf->address -= E1000G_IPALIGNROOM; 1380 } 1381 e1000g_free_dvma_buffer(rx_buf); 1382 break; 1383 #endif 1384 case USE_DMA: 1385 e1000g_free_dma_buffer(rx_buf); 1386 break; 1387 default: 1388 break; 1389 } 1390 1391 packet->dma_type = USE_NONE; 1392 1393 if (!full_release) 1394 return; 1395 1396 kmem_free(packet, sizeof (rx_sw_packet_t)); 1397 } 1398 1399 static void 1400 e1000g_free_rx_packets(e1000g_rx_data_t *rx_data) 1401 { 1402 p_rx_sw_packet_t packet, next_packet; 1403 uint32_t ref_cnt; 1404 1405 mutex_enter(&e1000g_rx_detach_lock); 1406 1407 packet = rx_data->packet_area; 1408 while (packet != NULL) { 1409 next_packet = packet->next; 1410 1411 ref_cnt = atomic_dec_32_nv(&packet->ref_cnt); 1412 if (ref_cnt > 0) { 1413 atomic_inc_32(&rx_data->pending_count); 1414 atomic_inc_32(&e1000g_mblks_pending); 1415 } else { 1416 e1000g_free_rx_sw_packet(packet, B_FALSE); 1417 } 1418 1419 packet = next_packet; 1420 } 1421 1422 mutex_exit(&e1000g_rx_detach_lock); 1423 } 1424 1425 1426 static void 1427 e1000g_free_tx_packets(e1000g_tx_ring_t *tx_ring) 1428 { 1429 int j; 1430 struct e1000g *Adapter; 1431 p_tx_sw_packet_t packet; 1432 dma_buffer_t *tx_buf; 1433 1434 Adapter = tx_ring->adapter; 1435 1436 for (j = 0, packet = tx_ring->packet_area; 1437 j < Adapter->tx_freelist_num; j++, packet++) { 1438 1439 if (packet == NULL) 1440 break; 1441 1442 /* Free the Tx DMA handle for dynamical binding */ 1443 if (packet->tx_dma_handle != NULL) { 1444 switch (packet->dma_type) { 1445 #ifdef __sparc 1446 case USE_DVMA: 1447 dvma_release(packet->tx_dma_handle); 1448 break; 1449 #endif 1450 case USE_DMA: 1451 ddi_dma_free_handle(&packet->tx_dma_handle); 1452 break; 1453 default: 1454 ASSERT(B_FALSE); 1455 break; 1456 } 1457 packet->tx_dma_handle = NULL; 1458 } else { 1459 /* 1460 * If the dma handle is NULL, then we don't 1461 * need to check the packets left. For they 1462 * have not been initialized or have been freed. 1463 */ 1464 break; 1465 } 1466 1467 tx_buf = packet->tx_buf; 1468 1469 switch (packet->dma_type) { 1470 #ifdef __sparc 1471 case USE_DVMA: 1472 e1000g_free_dvma_buffer(tx_buf); 1473 break; 1474 #endif 1475 case USE_DMA: 1476 e1000g_free_dma_buffer(tx_buf); 1477 break; 1478 default: 1479 ASSERT(B_FALSE); 1480 break; 1481 } 1482 1483 packet->dma_type = USE_NONE; 1484 } 1485 if (tx_ring->packet_area != NULL) { 1486 kmem_free(tx_ring->packet_area, TX_SW_PKT_AREA_SZ); 1487 tx_ring->packet_area = NULL; 1488 } 1489 } 1490 1491 /* 1492 * e1000g_release_dma_resources - release allocated DMA resources 1493 * 1494 * This function releases any pending buffers that has been 1495 * previously allocated 1496 */ 1497 void 1498 e1000g_release_dma_resources(struct e1000g *Adapter) 1499 { 1500 e1000g_free_descriptors(Adapter); 1501 e1000g_free_packets(Adapter); 1502 } 1503 1504 /* ARGSUSED */ 1505 void 1506 e1000g_set_fma_flags(int dma_flag) 1507 { 1508 if (dma_flag) { 1509 e1000g_tx_dma_attr.dma_attr_flags = DDI_DMA_FLAGERR; 1510 e1000g_buf_dma_attr.dma_attr_flags = DDI_DMA_FLAGERR; 1511 e1000g_desc_dma_attr.dma_attr_flags = DDI_DMA_FLAGERR; 1512 } else { 1513 e1000g_tx_dma_attr.dma_attr_flags = 0; 1514 e1000g_buf_dma_attr.dma_attr_flags = 0; 1515 e1000g_desc_dma_attr.dma_attr_flags = 0; 1516 } 1517 } 1518