4250 buffer_info->length, |
4250 buffer_info->length, |
4251 PCI_DMA_FROMDEVICE); |
4251 PCI_DMA_FROMDEVICE); |
4252 |
4252 |
4253 length = le16_to_cpu(rx_desc->length); |
4253 length = le16_to_cpu(rx_desc->length); |
4254 /* !EOP means multiple descriptors were used to store a single |
4254 /* !EOP means multiple descriptors were used to store a single |
4255 * packet, if thats the case we need to toss it. In fact, we |
4255 * packet, also make sure the frame isn't just CRC only */ |
4256 * to toss every packet with the EOP bit clear and the next |
4256 if (unlikely(!(status & E1000_RXD_STAT_EOP) || (length <= 4))) { |
4257 * frame that _does_ have the EOP bit set, as it is by |
|
4258 * definition only a frame fragment |
|
4259 */ |
|
4260 if (unlikely(!(status & E1000_RXD_STAT_EOP))) |
|
4261 set_bit(__E1000_DISCARDING, &adapter->flags); |
|
4262 |
|
4263 if (test_bit(__E1000_DISCARDING, &adapter->flags)) { |
|
4264 /* All receives must fit into a single buffer */ |
4257 /* All receives must fit into a single buffer */ |
4265 E1000_DBG("%s: Receive packet consumed multiple" |
4258 E1000_DBG("%s: Receive packet consumed multiple" |
4266 " buffers\n", netdev->name); |
4259 " buffers\n", netdev->name); |
4267 /* recycle */ |
4260 /* recycle */ |
4268 buffer_info->skb = skb; |
4261 buffer_info->skb = skb; |
4269 if (status & E1000_RXD_STAT_EOP) |
|
4270 clear_bit(__E1000_DISCARDING, &adapter->flags); |
|
4271 goto next_desc; |
4262 goto next_desc; |
4272 } |
4263 } |
4273 |
4264 |
4274 if (!adapter->ecdev && |
4265 if (!adapter->ecdev && |
4275 unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) { |
4266 unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) { |
4483 if (!length) |
4474 if (!length) |
4484 break; |
4475 break; |
4485 pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j], |
4476 pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j], |
4486 PAGE_SIZE, PCI_DMA_FROMDEVICE); |
4477 PAGE_SIZE, PCI_DMA_FROMDEVICE); |
4487 ps_page_dma->ps_page_dma[j] = 0; |
4478 ps_page_dma->ps_page_dma[j] = 0; |
4488 skb_add_rx_frag(skb, j, ps_page->ps_page[j], 0, length); |
4479 skb_fill_page_desc(skb, j, ps_page->ps_page[j], 0, |
|
4480 length); |
4489 ps_page->ps_page[j] = NULL; |
4481 ps_page->ps_page[j] = NULL; |
|
4482 skb->len += length; |
|
4483 skb->data_len += length; |
|
4484 skb->truesize += length; |
4490 } |
4485 } |
4491 |
4486 |
4492 /* strip the ethernet crc, problem is we're using pages now so |
4487 /* strip the ethernet crc, problem is we're using pages now so |
4493 * this whole operation can get a little cpu intensive */ |
4488 * this whole operation can get a little cpu intensive */ |
4494 pskb_trim(skb, skb->len - 4); |
4489 pskb_trim(skb, skb->len - 4); |
4689 |
4684 |
4690 for (j = 0; j < PS_PAGE_BUFFERS; j++) { |
4685 for (j = 0; j < PS_PAGE_BUFFERS; j++) { |
4691 if (j < adapter->rx_ps_pages) { |
4686 if (j < adapter->rx_ps_pages) { |
4692 if (likely(!ps_page->ps_page[j])) { |
4687 if (likely(!ps_page->ps_page[j])) { |
4693 ps_page->ps_page[j] = |
4688 ps_page->ps_page[j] = |
4694 netdev_alloc_page(netdev); |
4689 alloc_page(GFP_ATOMIC); |
4695 if (unlikely(!ps_page->ps_page[j])) { |
4690 if (unlikely(!ps_page->ps_page[j])) { |
4696 adapter->alloc_rx_buff_failed++; |
4691 adapter->alloc_rx_buff_failed++; |
4697 goto no_buffers; |
4692 goto no_buffers; |
4698 } |
4693 } |
4699 ps_page_dma->ps_page_dma[j] = |
4694 ps_page_dma->ps_page_dma[j] = |
5312 struct net_device *netdev = pci_get_drvdata(pdev); |
5307 struct net_device *netdev = pci_get_drvdata(pdev); |
5313 struct e1000_adapter *adapter = netdev->priv; |
5308 struct e1000_adapter *adapter = netdev->priv; |
5314 |
5309 |
5315 netif_device_detach(netdev); |
5310 netif_device_detach(netdev); |
5316 |
5311 |
5317 if (state == pci_channel_io_perm_failure) |
|
5318 return PCI_ERS_RESULT_DISCONNECT; |
|
5319 |
|
5320 if (netif_running(netdev)) |
5312 if (netif_running(netdev)) |
5321 e1000_down(adapter); |
5313 e1000_down(adapter); |
5322 pci_disable_device(pdev); |
5314 pci_disable_device(pdev); |
5323 |
5315 |
5324 /* Request a slot slot reset. */ |
5316 /* Request a slot slot reset. */ |