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 ---