bgmac.c (eb64e2923a886441c7b322f138b36029f3fa6a36) | bgmac.c (4b62dce450e2447146ff6924a1ce8ad1a6592107) |
---|---|
1/* 2 * Driver for (BCM4706)? GBit MAC core on BCMA bus. 3 * 4 * Copyright (C) 2012 Rafał Miłecki <zajec5@gmail.com> 5 * 6 * Licensed under the GNU/GPL. See COPYING for details. 7 */ 8 --- 332 unchanged lines hidden (view full) --- 341 void *buf; 342 343 /* Alloc skb */ 344 buf = netdev_alloc_frag(BGMAC_RX_ALLOC_SIZE); 345 if (!buf) 346 return -ENOMEM; 347 348 /* Poison - if everything goes fine, hardware will overwrite it */ | 1/* 2 * Driver for (BCM4706)? GBit MAC core on BCMA bus. 3 * 4 * Copyright (C) 2012 Rafał Miłecki <zajec5@gmail.com> 5 * 6 * Licensed under the GNU/GPL. See COPYING for details. 7 */ 8 --- 332 unchanged lines hidden (view full) --- 341 void *buf; 342 343 /* Alloc skb */ 344 buf = netdev_alloc_frag(BGMAC_RX_ALLOC_SIZE); 345 if (!buf) 346 return -ENOMEM; 347 348 /* Poison - if everything goes fine, hardware will overwrite it */ |
349 rx = buf; | 349 rx = buf + BGMAC_RX_BUF_OFFSET; |
350 rx->len = cpu_to_le16(0xdead); 351 rx->flags = cpu_to_le16(0xbeef); 352 353 /* Map skb for the DMA */ | 350 rx->len = cpu_to_le16(0xdead); 351 rx->flags = cpu_to_le16(0xbeef); 352 353 /* Map skb for the DMA */ |
354 dma_addr = dma_map_single(dma_dev, buf, BGMAC_RX_BUF_SIZE, 355 DMA_FROM_DEVICE); | 354 dma_addr = dma_map_single(dma_dev, buf + BGMAC_RX_BUF_OFFSET, 355 BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE); |
356 if (dma_mapping_error(dma_dev, dma_addr)) { 357 bgmac_err(bgmac, "DMA mapping error\n"); 358 put_page(virt_to_head_page(buf)); 359 return -ENOMEM; 360 } 361 362 /* Update the slot */ 363 slot->buf = buf; --- 34 unchanged lines hidden (view full) --- 398 end_slot &= BGMAC_DMA_RX_STATDPTR; 399 end_slot /= sizeof(struct bgmac_dma_desc); 400 401 ring->end = end_slot; 402 403 while (ring->start != ring->end) { 404 struct device *dma_dev = bgmac->core->dma_dev; 405 struct bgmac_slot_info *slot = &ring->slots[ring->start]; | 356 if (dma_mapping_error(dma_dev, dma_addr)) { 357 bgmac_err(bgmac, "DMA mapping error\n"); 358 put_page(virt_to_head_page(buf)); 359 return -ENOMEM; 360 } 361 362 /* Update the slot */ 363 slot->buf = buf; --- 34 unchanged lines hidden (view full) --- 398 end_slot &= BGMAC_DMA_RX_STATDPTR; 399 end_slot /= sizeof(struct bgmac_dma_desc); 400 401 ring->end = end_slot; 402 403 while (ring->start != ring->end) { 404 struct device *dma_dev = bgmac->core->dma_dev; 405 struct bgmac_slot_info *slot = &ring->slots[ring->start]; |
406 struct bgmac_rx_header *rx = slot->buf; | 406 struct bgmac_rx_header *rx = slot->buf + BGMAC_RX_BUF_OFFSET; |
407 struct sk_buff *skb; 408 void *buf = slot->buf; 409 u16 len, flags; 410 411 /* Unmap buffer to make it accessible to the CPU */ 412 dma_sync_single_for_cpu(dma_dev, slot->dma_addr, 413 BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE); 414 --- 34 unchanged lines hidden (view full) --- 449 } 450 bgmac_dma_rx_setup_desc(bgmac, ring, ring->start); 451 452 /* Unmap old skb, we'll pass it to the netfif */ 453 dma_unmap_single(dma_dev, old_dma_addr, 454 BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE); 455 456 skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE); | 407 struct sk_buff *skb; 408 void *buf = slot->buf; 409 u16 len, flags; 410 411 /* Unmap buffer to make it accessible to the CPU */ 412 dma_sync_single_for_cpu(dma_dev, slot->dma_addr, 413 BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE); 414 --- 34 unchanged lines hidden (view full) --- 449 } 450 bgmac_dma_rx_setup_desc(bgmac, ring, ring->start); 451 452 /* Unmap old skb, we'll pass it to the netfif */ 453 dma_unmap_single(dma_dev, old_dma_addr, 454 BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE); 455 456 skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE); |
457 skb_put(skb, BGMAC_RX_FRAME_OFFSET + len); 458 skb_pull(skb, BGMAC_RX_FRAME_OFFSET); | 457 skb_put(skb, BGMAC_RX_FRAME_OFFSET + 458 BGMAC_RX_BUF_OFFSET + len); 459 skb_pull(skb, BGMAC_RX_FRAME_OFFSET + 460 BGMAC_RX_BUF_OFFSET); |
459 460 skb_checksum_none_assert(skb); 461 skb->protocol = eth_type_trans(skb, bgmac->net_dev); 462 napi_gro_receive(&bgmac->napi, skb); 463 handled++; 464 } while (0); 465 466 if (++ring->start >= BGMAC_RX_RING_SLOTS) --- 1243 unchanged lines hidden --- | 461 462 skb_checksum_none_assert(skb); 463 skb->protocol = eth_type_trans(skb, bgmac->net_dev); 464 napi_gro_receive(&bgmac->napi, skb); 465 handled++; 466 } while (0); 467 468 if (++ring->start >= BGMAC_RX_RING_SLOTS) --- 1243 unchanged lines hidden --- |