@@ -4057,6 +4057,26 @@ static void e1000_tbi_adjust_stats(struct e1000_hw *hw,
40574057 }
40584058}
40594059
4060+ static bool e1000_tbi_should_accept (struct e1000_adapter * adapter ,
4061+ u8 status , u8 errors ,
4062+ u32 length , const u8 * data )
4063+ {
4064+ struct e1000_hw * hw = & adapter -> hw ;
4065+ u8 last_byte = * (data + length - 1 );
4066+
4067+ if (TBI_ACCEPT (hw , status , errors , length , last_byte )) {
4068+ unsigned long irq_flags ;
4069+
4070+ spin_lock_irqsave (& adapter -> stats_lock , irq_flags );
4071+ e1000_tbi_adjust_stats (hw , & adapter -> stats , length , data );
4072+ spin_unlock_irqrestore (& adapter -> stats_lock , irq_flags );
4073+
4074+ return true;
4075+ }
4076+
4077+ return false;
4078+ }
4079+
40604080/**
40614081 * e1000_clean_jumbo_rx_irq - Send received data up the network stack; legacy
40624082 * @adapter: board private structure
@@ -4071,12 +4091,10 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
40714091 struct e1000_rx_ring * rx_ring ,
40724092 int * work_done , int work_to_do )
40734093{
4074- struct e1000_hw * hw = & adapter -> hw ;
40754094 struct net_device * netdev = adapter -> netdev ;
40764095 struct pci_dev * pdev = adapter -> pdev ;
40774096 struct e1000_rx_desc * rx_desc , * next_rxd ;
40784097 struct e1000_buffer * buffer_info , * next_buffer ;
4079- unsigned long irq_flags ;
40804098 u32 length ;
40814099 unsigned int i ;
40824100 int cleaned_count = 0 ;
@@ -4117,23 +4135,15 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
41174135 /* errors is only valid for DD + EOP descriptors */
41184136 if (unlikely ((status & E1000_RXD_STAT_EOP ) &&
41194137 (rx_desc -> errors & E1000_RXD_ERR_FRAME_ERR_MASK ))) {
4120- u8 * mapped ;
4121- u8 last_byte ;
4122-
4123- mapped = page_address (buffer_info -> page );
4124- last_byte = * (mapped + length - 1 );
4125- if (TBI_ACCEPT (hw , status , rx_desc -> errors , length ,
4126- last_byte )) {
4127- spin_lock_irqsave (& adapter -> stats_lock ,
4128- irq_flags );
4129- e1000_tbi_adjust_stats (hw , & adapter -> stats ,
4130- length , mapped );
4131- spin_unlock_irqrestore (& adapter -> stats_lock ,
4132- irq_flags );
4138+ u8 * mapped = page_address (buffer_info -> page );
4139+
4140+ if (e1000_tbi_should_accept (adapter , status ,
4141+ rx_desc -> errors ,
4142+ length , mapped )) {
41334143 length -- ;
4144+ } else if (netdev -> features & NETIF_F_RXALL ) {
4145+ goto process_skb ;
41344146 } else {
4135- if (netdev -> features & NETIF_F_RXALL )
4136- goto process_skb ;
41374147 /* recycle both page and skb */
41384148 buffer_info -> skb = skb ;
41394149 /* an error means any chain goes out the window
@@ -4284,12 +4294,10 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
42844294 struct e1000_rx_ring * rx_ring ,
42854295 int * work_done , int work_to_do )
42864296{
4287- struct e1000_hw * hw = & adapter -> hw ;
42884297 struct net_device * netdev = adapter -> netdev ;
42894298 struct pci_dev * pdev = adapter -> pdev ;
42904299 struct e1000_rx_desc * rx_desc , * next_rxd ;
42914300 struct e1000_buffer * buffer_info , * next_buffer ;
4292- unsigned long flags ;
42934301 u32 length ;
42944302 unsigned int i ;
42954303 int cleaned_count = 0 ;
@@ -4339,7 +4347,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
43394347
43404348 if (adapter -> discarding ) {
43414349 /* All receives must fit into a single buffer */
4342- e_dbg ( "Receive packet consumed multiple buffers\n" );
4350+ netdev_dbg ( netdev , "Receive packet consumed multiple buffers\n" );
43434351 /* recycle */
43444352 buffer_info -> skb = skb ;
43454353 if (status & E1000_RXD_STAT_EOP )
@@ -4348,18 +4356,13 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
43484356 }
43494357
43504358 if (unlikely (rx_desc -> errors & E1000_RXD_ERR_FRAME_ERR_MASK )) {
4351- u8 last_byte = * (skb -> data + length - 1 );
4352- if (TBI_ACCEPT (hw , status , rx_desc -> errors , length ,
4353- last_byte )) {
4354- spin_lock_irqsave (& adapter -> stats_lock , flags );
4355- e1000_tbi_adjust_stats (hw , & adapter -> stats ,
4356- length , skb -> data );
4357- spin_unlock_irqrestore (& adapter -> stats_lock ,
4358- flags );
4359+ if (e1000_tbi_should_accept (adapter , status ,
4360+ rx_desc -> errors ,
4361+ length , skb -> data )) {
43594362 length -- ;
4363+ } else if (netdev -> features & NETIF_F_RXALL ) {
4364+ goto process_skb ;
43604365 } else {
4361- if (netdev -> features & NETIF_F_RXALL )
4362- goto process_skb ;
43634366 /* recycle */
43644367 buffer_info -> skb = skb ;
43654368 goto next_desc ;
0 commit comments