xgbe-desc.c (19769B)
1/* 2 * AMD 10Gb Ethernet driver 3 * 4 * This file is available to you under your choice of the following two 5 * licenses: 6 * 7 * License 1: GPLv2 8 * 9 * Copyright (c) 2014 Advanced Micro Devices, Inc. 10 * 11 * This file is free software; you may copy, redistribute and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation, either version 2 of the License, or (at 14 * your option) any later version. 15 * 16 * This file is distributed in the hope that it will be useful, but 17 * WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with this program. If not, see <http://www.gnu.org/licenses/>. 23 * 24 * This file incorporates work covered by the following copyright and 25 * permission notice: 26 * The Synopsys DWC ETHER XGMAC Software Driver and documentation 27 * (hereinafter "Software") is an unsupported proprietary work of Synopsys, 28 * Inc. unless otherwise expressly agreed to in writing between Synopsys 29 * and you. 30 * 31 * The Software IS NOT an item of Licensed Software or Licensed Product 32 * under any End User Software License Agreement or Agreement for Licensed 33 * Product with Synopsys or any supplement thereto. Permission is hereby 34 * granted, free of charge, to any person obtaining a copy of this software 35 * annotated with this license and the Software, to deal in the Software 36 * without restriction, including without limitation the rights to use, 37 * copy, modify, merge, publish, distribute, sublicense, and/or sell copies 38 * of the Software, and to permit persons to whom the Software is furnished 39 * to do so, subject to the following conditions: 40 * 41 * The above copyright notice and this permission notice shall be included 42 * in all copies or substantial portions of the Software. 43 * 44 * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" 45 * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 46 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 47 * PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 48 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 49 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 50 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 51 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 52 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 53 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 54 * THE POSSIBILITY OF SUCH DAMAGE. 55 * 56 * 57 * License 2: Modified BSD 58 * 59 * Copyright (c) 2014 Advanced Micro Devices, Inc. 60 * All rights reserved. 61 * 62 * Redistribution and use in source and binary forms, with or without 63 * modification, are permitted provided that the following conditions are met: 64 * * Redistributions of source code must retain the above copyright 65 * notice, this list of conditions and the following disclaimer. 66 * * Redistributions in binary form must reproduce the above copyright 67 * notice, this list of conditions and the following disclaimer in the 68 * documentation and/or other materials provided with the distribution. 69 * * Neither the name of Advanced Micro Devices, Inc. nor the 70 * names of its contributors may be used to endorse or promote products 71 * derived from this software without specific prior written permission. 72 * 73 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 74 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 75 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 76 * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY 77 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 78 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 79 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 80 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 81 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 82 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 83 * 84 * This file incorporates work covered by the following copyright and 85 * permission notice: 86 * The Synopsys DWC ETHER XGMAC Software Driver and documentation 87 * (hereinafter "Software") is an unsupported proprietary work of Synopsys, 88 * Inc. unless otherwise expressly agreed to in writing between Synopsys 89 * and you. 90 * 91 * The Software IS NOT an item of Licensed Software or Licensed Product 92 * under any End User Software License Agreement or Agreement for Licensed 93 * Product with Synopsys or any supplement thereto. Permission is hereby 94 * granted, free of charge, to any person obtaining a copy of this software 95 * annotated with this license and the Software, to deal in the Software 96 * without restriction, including without limitation the rights to use, 97 * copy, modify, merge, publish, distribute, sublicense, and/or sell copies 98 * of the Software, and to permit persons to whom the Software is furnished 99 * to do so, subject to the following conditions: 100 * 101 * The above copyright notice and this permission notice shall be included 102 * in all copies or substantial portions of the Software. 103 * 104 * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" 105 * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 106 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 107 * PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 108 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 109 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 110 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 111 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 112 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 113 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 114 * THE POSSIBILITY OF SUCH DAMAGE. 115 */ 116 117#include "xgbe.h" 118#include "xgbe-common.h" 119 120static void xgbe_unmap_rdata(struct xgbe_prv_data *, struct xgbe_ring_data *); 121 122static void xgbe_free_ring(struct xgbe_prv_data *pdata, 123 struct xgbe_ring *ring) 124{ 125 struct xgbe_ring_data *rdata; 126 unsigned int i; 127 128 if (!ring) 129 return; 130 131 if (ring->rdata) { 132 for (i = 0; i < ring->rdesc_count; i++) { 133 rdata = XGBE_GET_DESC_DATA(ring, i); 134 xgbe_unmap_rdata(pdata, rdata); 135 } 136 137 kfree(ring->rdata); 138 ring->rdata = NULL; 139 } 140 141 if (ring->rx_hdr_pa.pages) { 142 dma_unmap_page(pdata->dev, ring->rx_hdr_pa.pages_dma, 143 ring->rx_hdr_pa.pages_len, DMA_FROM_DEVICE); 144 put_page(ring->rx_hdr_pa.pages); 145 146 ring->rx_hdr_pa.pages = NULL; 147 ring->rx_hdr_pa.pages_len = 0; 148 ring->rx_hdr_pa.pages_offset = 0; 149 ring->rx_hdr_pa.pages_dma = 0; 150 } 151 152 if (ring->rx_buf_pa.pages) { 153 dma_unmap_page(pdata->dev, ring->rx_buf_pa.pages_dma, 154 ring->rx_buf_pa.pages_len, DMA_FROM_DEVICE); 155 put_page(ring->rx_buf_pa.pages); 156 157 ring->rx_buf_pa.pages = NULL; 158 ring->rx_buf_pa.pages_len = 0; 159 ring->rx_buf_pa.pages_offset = 0; 160 ring->rx_buf_pa.pages_dma = 0; 161 } 162 163 if (ring->rdesc) { 164 dma_free_coherent(pdata->dev, 165 (sizeof(struct xgbe_ring_desc) * 166 ring->rdesc_count), 167 ring->rdesc, ring->rdesc_dma); 168 ring->rdesc = NULL; 169 } 170} 171 172static void xgbe_free_ring_resources(struct xgbe_prv_data *pdata) 173{ 174 struct xgbe_channel *channel; 175 unsigned int i; 176 177 DBGPR("-->xgbe_free_ring_resources\n"); 178 179 for (i = 0; i < pdata->channel_count; i++) { 180 channel = pdata->channel[i]; 181 xgbe_free_ring(pdata, channel->tx_ring); 182 xgbe_free_ring(pdata, channel->rx_ring); 183 } 184 185 DBGPR("<--xgbe_free_ring_resources\n"); 186} 187 188static void *xgbe_alloc_node(size_t size, int node) 189{ 190 void *mem; 191 192 mem = kzalloc_node(size, GFP_KERNEL, node); 193 if (!mem) 194 mem = kzalloc(size, GFP_KERNEL); 195 196 return mem; 197} 198 199static void *xgbe_dma_alloc_node(struct device *dev, size_t size, 200 dma_addr_t *dma, int node) 201{ 202 void *mem; 203 int cur_node = dev_to_node(dev); 204 205 set_dev_node(dev, node); 206 mem = dma_alloc_coherent(dev, size, dma, GFP_KERNEL); 207 set_dev_node(dev, cur_node); 208 209 if (!mem) 210 mem = dma_alloc_coherent(dev, size, dma, GFP_KERNEL); 211 212 return mem; 213} 214 215static int xgbe_init_ring(struct xgbe_prv_data *pdata, 216 struct xgbe_ring *ring, unsigned int rdesc_count) 217{ 218 size_t size; 219 220 if (!ring) 221 return 0; 222 223 /* Descriptors */ 224 size = rdesc_count * sizeof(struct xgbe_ring_desc); 225 226 ring->rdesc_count = rdesc_count; 227 ring->rdesc = xgbe_dma_alloc_node(pdata->dev, size, &ring->rdesc_dma, 228 ring->node); 229 if (!ring->rdesc) 230 return -ENOMEM; 231 232 /* Descriptor information */ 233 size = rdesc_count * sizeof(struct xgbe_ring_data); 234 235 ring->rdata = xgbe_alloc_node(size, ring->node); 236 if (!ring->rdata) 237 return -ENOMEM; 238 239 netif_dbg(pdata, drv, pdata->netdev, 240 "rdesc=%p, rdesc_dma=%pad, rdata=%p, node=%d\n", 241 ring->rdesc, &ring->rdesc_dma, ring->rdata, ring->node); 242 243 return 0; 244} 245 246static int xgbe_alloc_ring_resources(struct xgbe_prv_data *pdata) 247{ 248 struct xgbe_channel *channel; 249 unsigned int i; 250 int ret; 251 252 for (i = 0; i < pdata->channel_count; i++) { 253 channel = pdata->channel[i]; 254 netif_dbg(pdata, drv, pdata->netdev, "%s - Tx ring:\n", 255 channel->name); 256 257 ret = xgbe_init_ring(pdata, channel->tx_ring, 258 pdata->tx_desc_count); 259 if (ret) { 260 netdev_alert(pdata->netdev, 261 "error initializing Tx ring\n"); 262 goto err_ring; 263 } 264 265 netif_dbg(pdata, drv, pdata->netdev, "%s - Rx ring:\n", 266 channel->name); 267 268 ret = xgbe_init_ring(pdata, channel->rx_ring, 269 pdata->rx_desc_count); 270 if (ret) { 271 netdev_alert(pdata->netdev, 272 "error initializing Rx ring\n"); 273 goto err_ring; 274 } 275 } 276 277 return 0; 278 279err_ring: 280 xgbe_free_ring_resources(pdata); 281 282 return ret; 283} 284 285static int xgbe_alloc_pages(struct xgbe_prv_data *pdata, 286 struct xgbe_page_alloc *pa, int alloc_order, 287 int node) 288{ 289 struct page *pages = NULL; 290 dma_addr_t pages_dma; 291 gfp_t gfp; 292 int order; 293 294again: 295 order = alloc_order; 296 297 /* Try to obtain pages, decreasing order if necessary */ 298 gfp = GFP_ATOMIC | __GFP_COMP | __GFP_NOWARN; 299 while (order >= 0) { 300 pages = alloc_pages_node(node, gfp, order); 301 if (pages) 302 break; 303 304 order--; 305 } 306 307 /* If we couldn't get local pages, try getting from anywhere */ 308 if (!pages && (node != NUMA_NO_NODE)) { 309 node = NUMA_NO_NODE; 310 goto again; 311 } 312 313 if (!pages) 314 return -ENOMEM; 315 316 /* Map the pages */ 317 pages_dma = dma_map_page(pdata->dev, pages, 0, 318 PAGE_SIZE << order, DMA_FROM_DEVICE); 319 if (dma_mapping_error(pdata->dev, pages_dma)) { 320 put_page(pages); 321 return -ENOMEM; 322 } 323 324 pa->pages = pages; 325 pa->pages_len = PAGE_SIZE << order; 326 pa->pages_offset = 0; 327 pa->pages_dma = pages_dma; 328 329 return 0; 330} 331 332static void xgbe_set_buffer_data(struct xgbe_buffer_data *bd, 333 struct xgbe_page_alloc *pa, 334 unsigned int len) 335{ 336 get_page(pa->pages); 337 bd->pa = *pa; 338 339 bd->dma_base = pa->pages_dma; 340 bd->dma_off = pa->pages_offset; 341 bd->dma_len = len; 342 343 pa->pages_offset += len; 344 if ((pa->pages_offset + len) > pa->pages_len) { 345 /* This data descriptor is responsible for unmapping page(s) */ 346 bd->pa_unmap = *pa; 347 348 /* Get a new allocation next time */ 349 pa->pages = NULL; 350 pa->pages_len = 0; 351 pa->pages_offset = 0; 352 pa->pages_dma = 0; 353 } 354} 355 356static int xgbe_map_rx_buffer(struct xgbe_prv_data *pdata, 357 struct xgbe_ring *ring, 358 struct xgbe_ring_data *rdata) 359{ 360 int ret; 361 362 if (!ring->rx_hdr_pa.pages) { 363 ret = xgbe_alloc_pages(pdata, &ring->rx_hdr_pa, 0, ring->node); 364 if (ret) 365 return ret; 366 } 367 368 if (!ring->rx_buf_pa.pages) { 369 ret = xgbe_alloc_pages(pdata, &ring->rx_buf_pa, 370 PAGE_ALLOC_COSTLY_ORDER, ring->node); 371 if (ret) 372 return ret; 373 } 374 375 /* Set up the header page info */ 376 xgbe_set_buffer_data(&rdata->rx.hdr, &ring->rx_hdr_pa, 377 XGBE_SKB_ALLOC_SIZE); 378 379 /* Set up the buffer page info */ 380 xgbe_set_buffer_data(&rdata->rx.buf, &ring->rx_buf_pa, 381 pdata->rx_buf_size); 382 383 return 0; 384} 385 386static void xgbe_wrapper_tx_descriptor_init(struct xgbe_prv_data *pdata) 387{ 388 struct xgbe_hw_if *hw_if = &pdata->hw_if; 389 struct xgbe_channel *channel; 390 struct xgbe_ring *ring; 391 struct xgbe_ring_data *rdata; 392 struct xgbe_ring_desc *rdesc; 393 dma_addr_t rdesc_dma; 394 unsigned int i, j; 395 396 DBGPR("-->xgbe_wrapper_tx_descriptor_init\n"); 397 398 for (i = 0; i < pdata->channel_count; i++) { 399 channel = pdata->channel[i]; 400 ring = channel->tx_ring; 401 if (!ring) 402 break; 403 404 rdesc = ring->rdesc; 405 rdesc_dma = ring->rdesc_dma; 406 407 for (j = 0; j < ring->rdesc_count; j++) { 408 rdata = XGBE_GET_DESC_DATA(ring, j); 409 410 rdata->rdesc = rdesc; 411 rdata->rdesc_dma = rdesc_dma; 412 413 rdesc++; 414 rdesc_dma += sizeof(struct xgbe_ring_desc); 415 } 416 417 ring->cur = 0; 418 ring->dirty = 0; 419 memset(&ring->tx, 0, sizeof(ring->tx)); 420 421 hw_if->tx_desc_init(channel); 422 } 423 424 DBGPR("<--xgbe_wrapper_tx_descriptor_init\n"); 425} 426 427static void xgbe_wrapper_rx_descriptor_init(struct xgbe_prv_data *pdata) 428{ 429 struct xgbe_hw_if *hw_if = &pdata->hw_if; 430 struct xgbe_channel *channel; 431 struct xgbe_ring *ring; 432 struct xgbe_ring_desc *rdesc; 433 struct xgbe_ring_data *rdata; 434 dma_addr_t rdesc_dma; 435 unsigned int i, j; 436 437 DBGPR("-->xgbe_wrapper_rx_descriptor_init\n"); 438 439 for (i = 0; i < pdata->channel_count; i++) { 440 channel = pdata->channel[i]; 441 ring = channel->rx_ring; 442 if (!ring) 443 break; 444 445 rdesc = ring->rdesc; 446 rdesc_dma = ring->rdesc_dma; 447 448 for (j = 0; j < ring->rdesc_count; j++) { 449 rdata = XGBE_GET_DESC_DATA(ring, j); 450 451 rdata->rdesc = rdesc; 452 rdata->rdesc_dma = rdesc_dma; 453 454 if (xgbe_map_rx_buffer(pdata, ring, rdata)) 455 break; 456 457 rdesc++; 458 rdesc_dma += sizeof(struct xgbe_ring_desc); 459 } 460 461 ring->cur = 0; 462 ring->dirty = 0; 463 464 hw_if->rx_desc_init(channel); 465 } 466 467 DBGPR("<--xgbe_wrapper_rx_descriptor_init\n"); 468} 469 470static void xgbe_unmap_rdata(struct xgbe_prv_data *pdata, 471 struct xgbe_ring_data *rdata) 472{ 473 if (rdata->skb_dma) { 474 if (rdata->mapped_as_page) { 475 dma_unmap_page(pdata->dev, rdata->skb_dma, 476 rdata->skb_dma_len, DMA_TO_DEVICE); 477 } else { 478 dma_unmap_single(pdata->dev, rdata->skb_dma, 479 rdata->skb_dma_len, DMA_TO_DEVICE); 480 } 481 rdata->skb_dma = 0; 482 rdata->skb_dma_len = 0; 483 } 484 485 if (rdata->skb) { 486 dev_kfree_skb_any(rdata->skb); 487 rdata->skb = NULL; 488 } 489 490 if (rdata->rx.hdr.pa.pages) 491 put_page(rdata->rx.hdr.pa.pages); 492 493 if (rdata->rx.hdr.pa_unmap.pages) { 494 dma_unmap_page(pdata->dev, rdata->rx.hdr.pa_unmap.pages_dma, 495 rdata->rx.hdr.pa_unmap.pages_len, 496 DMA_FROM_DEVICE); 497 put_page(rdata->rx.hdr.pa_unmap.pages); 498 } 499 500 if (rdata->rx.buf.pa.pages) 501 put_page(rdata->rx.buf.pa.pages); 502 503 if (rdata->rx.buf.pa_unmap.pages) { 504 dma_unmap_page(pdata->dev, rdata->rx.buf.pa_unmap.pages_dma, 505 rdata->rx.buf.pa_unmap.pages_len, 506 DMA_FROM_DEVICE); 507 put_page(rdata->rx.buf.pa_unmap.pages); 508 } 509 510 memset(&rdata->tx, 0, sizeof(rdata->tx)); 511 memset(&rdata->rx, 0, sizeof(rdata->rx)); 512 513 rdata->mapped_as_page = 0; 514 515 if (rdata->state_saved) { 516 rdata->state_saved = 0; 517 rdata->state.skb = NULL; 518 rdata->state.len = 0; 519 rdata->state.error = 0; 520 } 521} 522 523static int xgbe_map_tx_skb(struct xgbe_channel *channel, struct sk_buff *skb) 524{ 525 struct xgbe_prv_data *pdata = channel->pdata; 526 struct xgbe_ring *ring = channel->tx_ring; 527 struct xgbe_ring_data *rdata; 528 struct xgbe_packet_data *packet; 529 skb_frag_t *frag; 530 dma_addr_t skb_dma; 531 unsigned int start_index, cur_index; 532 unsigned int offset, tso, vlan, datalen, len; 533 unsigned int i; 534 535 DBGPR("-->xgbe_map_tx_skb: cur = %d\n", ring->cur); 536 537 offset = 0; 538 start_index = ring->cur; 539 cur_index = ring->cur; 540 541 packet = &ring->packet_data; 542 packet->rdesc_count = 0; 543 packet->length = 0; 544 545 tso = XGMAC_GET_BITS(packet->attributes, TX_PACKET_ATTRIBUTES, 546 TSO_ENABLE); 547 vlan = XGMAC_GET_BITS(packet->attributes, TX_PACKET_ATTRIBUTES, 548 VLAN_CTAG); 549 550 /* Save space for a context descriptor if needed */ 551 if ((tso && (packet->mss != ring->tx.cur_mss)) || 552 (vlan && (packet->vlan_ctag != ring->tx.cur_vlan_ctag))) 553 cur_index++; 554 rdata = XGBE_GET_DESC_DATA(ring, cur_index); 555 556 if (tso) { 557 /* Map the TSO header */ 558 skb_dma = dma_map_single(pdata->dev, skb->data, 559 packet->header_len, DMA_TO_DEVICE); 560 if (dma_mapping_error(pdata->dev, skb_dma)) { 561 netdev_alert(pdata->netdev, "dma_map_single failed\n"); 562 goto err_out; 563 } 564 rdata->skb_dma = skb_dma; 565 rdata->skb_dma_len = packet->header_len; 566 netif_dbg(pdata, tx_queued, pdata->netdev, 567 "skb header: index=%u, dma=%pad, len=%u\n", 568 cur_index, &skb_dma, packet->header_len); 569 570 offset = packet->header_len; 571 572 packet->length += packet->header_len; 573 574 cur_index++; 575 rdata = XGBE_GET_DESC_DATA(ring, cur_index); 576 } 577 578 /* Map the (remainder of the) packet */ 579 for (datalen = skb_headlen(skb) - offset; datalen; ) { 580 len = min_t(unsigned int, datalen, XGBE_TX_MAX_BUF_SIZE); 581 582 skb_dma = dma_map_single(pdata->dev, skb->data + offset, len, 583 DMA_TO_DEVICE); 584 if (dma_mapping_error(pdata->dev, skb_dma)) { 585 netdev_alert(pdata->netdev, "dma_map_single failed\n"); 586 goto err_out; 587 } 588 rdata->skb_dma = skb_dma; 589 rdata->skb_dma_len = len; 590 netif_dbg(pdata, tx_queued, pdata->netdev, 591 "skb data: index=%u, dma=%pad, len=%u\n", 592 cur_index, &skb_dma, len); 593 594 datalen -= len; 595 offset += len; 596 597 packet->length += len; 598 599 cur_index++; 600 rdata = XGBE_GET_DESC_DATA(ring, cur_index); 601 } 602 603 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { 604 netif_dbg(pdata, tx_queued, pdata->netdev, 605 "mapping frag %u\n", i); 606 607 frag = &skb_shinfo(skb)->frags[i]; 608 offset = 0; 609 610 for (datalen = skb_frag_size(frag); datalen; ) { 611 len = min_t(unsigned int, datalen, 612 XGBE_TX_MAX_BUF_SIZE); 613 614 skb_dma = skb_frag_dma_map(pdata->dev, frag, offset, 615 len, DMA_TO_DEVICE); 616 if (dma_mapping_error(pdata->dev, skb_dma)) { 617 netdev_alert(pdata->netdev, 618 "skb_frag_dma_map failed\n"); 619 goto err_out; 620 } 621 rdata->skb_dma = skb_dma; 622 rdata->skb_dma_len = len; 623 rdata->mapped_as_page = 1; 624 netif_dbg(pdata, tx_queued, pdata->netdev, 625 "skb frag: index=%u, dma=%pad, len=%u\n", 626 cur_index, &skb_dma, len); 627 628 datalen -= len; 629 offset += len; 630 631 packet->length += len; 632 633 cur_index++; 634 rdata = XGBE_GET_DESC_DATA(ring, cur_index); 635 } 636 } 637 638 /* Save the skb address in the last entry. We always have some data 639 * that has been mapped so rdata is always advanced past the last 640 * piece of mapped data - use the entry pointed to by cur_index - 1. 641 */ 642 rdata = XGBE_GET_DESC_DATA(ring, cur_index - 1); 643 rdata->skb = skb; 644 645 /* Save the number of descriptor entries used */ 646 packet->rdesc_count = cur_index - start_index; 647 648 DBGPR("<--xgbe_map_tx_skb: count=%u\n", packet->rdesc_count); 649 650 return packet->rdesc_count; 651 652err_out: 653 while (start_index < cur_index) { 654 rdata = XGBE_GET_DESC_DATA(ring, start_index++); 655 xgbe_unmap_rdata(pdata, rdata); 656 } 657 658 DBGPR("<--xgbe_map_tx_skb: count=0\n"); 659 660 return 0; 661} 662 663void xgbe_init_function_ptrs_desc(struct xgbe_desc_if *desc_if) 664{ 665 DBGPR("-->xgbe_init_function_ptrs_desc\n"); 666 667 desc_if->alloc_ring_resources = xgbe_alloc_ring_resources; 668 desc_if->free_ring_resources = xgbe_free_ring_resources; 669 desc_if->map_tx_skb = xgbe_map_tx_skb; 670 desc_if->map_rx_buffer = xgbe_map_rx_buffer; 671 desc_if->unmap_rdata = xgbe_unmap_rdata; 672 desc_if->wrapper_tx_desc_init = xgbe_wrapper_tx_descriptor_init; 673 desc_if->wrapper_rx_desc_init = xgbe_wrapper_rx_descriptor_init; 674 675 DBGPR("<--xgbe_init_function_ptrs_desc\n"); 676}