devices/e1000/e1000_main-2.6.27-ethercat.c
branchredundancy
changeset 2343 0d2e24f2e1b2
parent 2050 a3e59f2a8589
child 2421 bc2d4bf9cbe5
child 2589 2b9c78543663
equal deleted inserted replaced
2342:4033d0d394ec 2343:0d2e24f2e1b2
  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. */