|
@@ -4409,7 +4409,7 @@ static void tg3_tx(struct tg3_napi *tnapi)
|
|
* (to fetch the error flags, vlan tag, checksum, and opaque cookie).
|
|
* (to fetch the error flags, vlan tag, checksum, and opaque cookie).
|
|
*/
|
|
*/
|
|
static int tg3_alloc_rx_skb(struct tg3_napi *tnapi, u32 opaque_key,
|
|
static int tg3_alloc_rx_skb(struct tg3_napi *tnapi, u32 opaque_key,
|
|
- int src_idx, u32 dest_idx_unmasked)
|
|
|
|
|
|
+ u32 dest_idx_unmasked)
|
|
{
|
|
{
|
|
struct tg3 *tp = tnapi->tp;
|
|
struct tg3 *tp = tnapi->tp;
|
|
struct tg3_rx_buffer_desc *desc;
|
|
struct tg3_rx_buffer_desc *desc;
|
|
@@ -4425,8 +4425,6 @@ static int tg3_alloc_rx_skb(struct tg3_napi *tnapi, u32 opaque_key,
|
|
dest_idx = dest_idx_unmasked % TG3_RX_RING_SIZE;
|
|
dest_idx = dest_idx_unmasked % TG3_RX_RING_SIZE;
|
|
desc = &tpr->rx_std[dest_idx];
|
|
desc = &tpr->rx_std[dest_idx];
|
|
map = &tpr->rx_std_buffers[dest_idx];
|
|
map = &tpr->rx_std_buffers[dest_idx];
|
|
- if (src_idx >= 0)
|
|
|
|
- src_map = &tpr->rx_std_buffers[src_idx];
|
|
|
|
skb_size = tp->rx_pkt_map_sz;
|
|
skb_size = tp->rx_pkt_map_sz;
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -4434,8 +4432,6 @@ static int tg3_alloc_rx_skb(struct tg3_napi *tnapi, u32 opaque_key,
|
|
dest_idx = dest_idx_unmasked % TG3_RX_JUMBO_RING_SIZE;
|
|
dest_idx = dest_idx_unmasked % TG3_RX_JUMBO_RING_SIZE;
|
|
desc = &tpr->rx_jmb[dest_idx].std;
|
|
desc = &tpr->rx_jmb[dest_idx].std;
|
|
map = &tpr->rx_jmb_buffers[dest_idx];
|
|
map = &tpr->rx_jmb_buffers[dest_idx];
|
|
- if (src_idx >= 0)
|
|
|
|
- src_map = &tpr->rx_jmb_buffers[src_idx];
|
|
|
|
skb_size = TG3_RX_JMB_MAP_SZ;
|
|
skb_size = TG3_RX_JMB_MAP_SZ;
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -4465,9 +4461,6 @@ static int tg3_alloc_rx_skb(struct tg3_napi *tnapi, u32 opaque_key,
|
|
map->skb = skb;
|
|
map->skb = skb;
|
|
pci_unmap_addr_set(map, mapping, mapping);
|
|
pci_unmap_addr_set(map, mapping, mapping);
|
|
|
|
|
|
- if (src_map != NULL)
|
|
|
|
- src_map->skb = NULL;
|
|
|
|
-
|
|
|
|
desc->addr_hi = ((u64)mapping >> 32);
|
|
desc->addr_hi = ((u64)mapping >> 32);
|
|
desc->addr_lo = ((u64)mapping & 0xffffffff);
|
|
desc->addr_lo = ((u64)mapping & 0xffffffff);
|
|
|
|
|
|
@@ -4559,6 +4552,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
|
|
work_mask = 0;
|
|
work_mask = 0;
|
|
received = 0;
|
|
received = 0;
|
|
while (sw_idx != hw_idx && budget > 0) {
|
|
while (sw_idx != hw_idx && budget > 0) {
|
|
|
|
+ struct ring_info *ri;
|
|
struct tg3_rx_buffer_desc *desc = &tnapi->rx_rcb[sw_idx];
|
|
struct tg3_rx_buffer_desc *desc = &tnapi->rx_rcb[sw_idx];
|
|
unsigned int len;
|
|
unsigned int len;
|
|
struct sk_buff *skb;
|
|
struct sk_buff *skb;
|
|
@@ -4568,13 +4562,13 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
|
|
desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
|
|
desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
|
|
opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
|
|
opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
|
|
if (opaque_key == RXD_OPAQUE_RING_STD) {
|
|
if (opaque_key == RXD_OPAQUE_RING_STD) {
|
|
- struct ring_info *ri = &tpr->rx_std_buffers[desc_idx];
|
|
|
|
|
|
+ ri = &tpr->rx_std_buffers[desc_idx];
|
|
dma_addr = pci_unmap_addr(ri, mapping);
|
|
dma_addr = pci_unmap_addr(ri, mapping);
|
|
skb = ri->skb;
|
|
skb = ri->skb;
|
|
post_ptr = &tpr->rx_std_ptr;
|
|
post_ptr = &tpr->rx_std_ptr;
|
|
rx_std_posted++;
|
|
rx_std_posted++;
|
|
} else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
|
|
} else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
|
|
- struct ring_info *ri = &tpr->rx_jmb_buffers[desc_idx];
|
|
|
|
|
|
+ ri = &tpr->rx_jmb_buffers[desc_idx];
|
|
dma_addr = pci_unmap_addr(ri, mapping);
|
|
dma_addr = pci_unmap_addr(ri, mapping);
|
|
skb = ri->skb;
|
|
skb = ri->skb;
|
|
post_ptr = &tpr->rx_jmb_ptr;
|
|
post_ptr = &tpr->rx_jmb_ptr;
|
|
@@ -4607,10 +4601,12 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
|
|
int skb_size;
|
|
int skb_size;
|
|
|
|
|
|
skb_size = tg3_alloc_rx_skb(tnapi, opaque_key,
|
|
skb_size = tg3_alloc_rx_skb(tnapi, opaque_key,
|
|
- desc_idx, *post_ptr);
|
|
|
|
|
|
+ *post_ptr);
|
|
if (skb_size < 0)
|
|
if (skb_size < 0)
|
|
goto drop_it;
|
|
goto drop_it;
|
|
|
|
|
|
|
|
+ ri->skb = NULL;
|
|
|
|
+
|
|
pci_unmap_single(tp->pdev, dma_addr, skb_size,
|
|
pci_unmap_single(tp->pdev, dma_addr, skb_size,
|
|
PCI_DMA_FROMDEVICE);
|
|
PCI_DMA_FROMDEVICE);
|
|
|
|
|
|
@@ -5774,7 +5770,7 @@ static int tg3_rx_prodring_alloc(struct tg3 *tp,
|
|
|
|
|
|
/* Now allocate fresh SKBs for each rx ring. */
|
|
/* Now allocate fresh SKBs for each rx ring. */
|
|
for (i = 0; i < tp->rx_pending; i++) {
|
|
for (i = 0; i < tp->rx_pending; i++) {
|
|
- if (tg3_alloc_rx_skb(tnapi, RXD_OPAQUE_RING_STD, -1, i) < 0) {
|
|
|
|
|
|
+ if (tg3_alloc_rx_skb(tnapi, RXD_OPAQUE_RING_STD, i) < 0) {
|
|
printk(KERN_WARNING PFX
|
|
printk(KERN_WARNING PFX
|
|
"%s: Using a smaller RX standard ring, "
|
|
"%s: Using a smaller RX standard ring, "
|
|
"only %d out of %d buffers were allocated "
|
|
"only %d out of %d buffers were allocated "
|
|
@@ -5806,7 +5802,7 @@ static int tg3_rx_prodring_alloc(struct tg3 *tp,
|
|
|
|
|
|
for (i = 0; i < tp->rx_jumbo_pending; i++) {
|
|
for (i = 0; i < tp->rx_jumbo_pending; i++) {
|
|
if (tg3_alloc_rx_skb(tnapi, RXD_OPAQUE_RING_JUMBO,
|
|
if (tg3_alloc_rx_skb(tnapi, RXD_OPAQUE_RING_JUMBO,
|
|
- -1, i) < 0) {
|
|
|
|
|
|
+ i) < 0) {
|
|
printk(KERN_WARNING PFX
|
|
printk(KERN_WARNING PFX
|
|
"%s: Using a smaller RX jumbo ring, "
|
|
"%s: Using a smaller RX jumbo ring, "
|
|
"only %d out of %d buffers were "
|
|
"only %d out of %d buffers were "
|