- add netmap (FreeBSD header files need to be updated with this) - move prototype perl scripts to prototype/ folder - create basic structure for sipcap app (no code yet)
		
			
				
	
	
		
			114 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| diff --git a/ixgbe/ixgbe_main.c b/ixgbe/ixgbe_main.c
 | |
| index 08e8e25..8070930 100644
 | |
| --- a/ixgbe/ixgbe_main.c
 | |
| +++ b/ixgbe/ixgbe_main.c
 | |
| @@ -247,6 +247,22 @@ static const struct ixgbe_reg_info ixgbe_reg_info_tbl[] = {
 | |
|  	{}
 | |
|  };
 | |
|  
 | |
| +#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
 | |
| +/*
 | |
| + * The #ifdef DEV_NETMAP / #endif blocks in this file are meant to
 | |
| + * be a reference on how to implement netmap support in a driver.
 | |
| + * Additional comments are in ixgbe_netmap_linux.h .
 | |
| + *
 | |
| + * The code is originally developed on FreeBSD and in the interest
 | |
| + * of maintainability we try to limit differences between the two systems.
 | |
| + *
 | |
| + * <ixgbe_netmap_linux.h> contains functions for netmap support
 | |
| + * that extend the standard driver.
 | |
| + * It also defines DEV_NETMAP so further conditional sections use
 | |
| + * that instead of CONFIG_NETMAP
 | |
| + */
 | |
| +#include <ixgbe_netmap_linux.h>
 | |
| +#endif
 | |
|  
 | |
|  /*
 | |
|   * ixgbe_regdump - register printout routine
 | |
| @@ -864,6 +880,16 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
 | |
|  	unsigned int total_bytes = 0, total_packets = 0;
 | |
|  	u16 i, eop, count = 0;
 | |
|  
 | |
| +#ifdef DEV_NETMAP
 | |
| +	/*
 | |
| +	 * In netmap mode, all the work is done in the context
 | |
| +	 * of the client thread. Interrupt handlers only wake up
 | |
| +	 * clients, which may be sleeping on individual rings
 | |
| +	 * or on a global resource for all rings.
 | |
| +	 */
 | |
| +	if (netmap_tx_irq(adapter->netdev, tx_ring->queue_index))
 | |
| +		return 1; /* seems to be ignored */
 | |
| +#endif /* DEV_NETMAP */
 | |
|  	i = tx_ring->next_to_clean;
 | |
|  	eop = tx_ring->tx_buffer_info[i].next_to_watch;
 | |
|  	eop_desc = IXGBE_TX_DESC_ADV(tx_ring, eop);
 | |
| @@ -1348,6 +1374,13 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
 | |
|  	u16 cleaned_count = 0;
 | |
|  	bool pkt_is_rsc = false;
 | |
|  
 | |
| +#ifdef DEV_NETMAP
 | |
| +	/*
 | |
| +	 * Same as the txeof routine: only wakeup clients on intr.
 | |
| +	 */
 | |
| +	if (netmap_rx_irq(adapter->netdev, rx_ring->queue_index, work_done))
 | |
| +		return;
 | |
| +#endif /* DEV_NETMAP */
 | |
|  	i = rx_ring->next_to_clean;
 | |
|  	rx_desc = IXGBE_RX_DESC_ADV(rx_ring, i);
 | |
|  	staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
 | |
| @@ -2808,6 +2841,9 @@ void ixgbe_configure_tx_ring(struct ixgbe_adapter *adapter,
 | |
|  	} while (--wait_loop && !(txdctl & IXGBE_TXDCTL_ENABLE));
 | |
|  	if (!wait_loop)
 | |
|  		e_err(drv, "Could not enable Tx Queue %d\n", reg_idx);
 | |
| +#ifdef DEV_NETMAP
 | |
| +	ixgbe_netmap_configure_tx_ring(adapter, reg_idx);
 | |
| +#endif /* DEV_NETMAP */
 | |
|  }
 | |
|  
 | |
|  static void ixgbe_setup_mtqc(struct ixgbe_adapter *adapter)
 | |
| @@ -3183,6 +3219,10 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,
 | |
|  	IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(reg_idx), rxdctl);
 | |
|  
 | |
|  	ixgbe_rx_desc_queue_enable(adapter, ring);
 | |
| +#ifdef DEV_NETMAP
 | |
| +	if (ixgbe_netmap_configure_rx_ring(adapter, reg_idx))
 | |
| +		return;
 | |
| +#endif /* DEV_NETMAP */
 | |
|  	ixgbe_alloc_rx_buffers(ring, IXGBE_DESC_UNUSED(ring));
 | |
|  }
 | |
|  
 | |
| @@ -3976,6 +4016,10 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)
 | |
|  	/* enable transmits */
 | |
|  	netif_tx_start_all_queues(adapter->netdev);
 | |
|  
 | |
| +#ifdef DEV_NETMAP
 | |
| +	netmap_enable_all_rings(adapter->netdev);
 | |
| +#endif
 | |
| +
 | |
|  	/* bring the link up in the watchdog, this could race with our first
 | |
|  	 * link up interrupt but shouldn't be a problem */
 | |
|  	adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;
 | |
| @@ -4212,6 +4256,10 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
 | |
|  
 | |
|  	ixgbe_napi_disable_all(adapter);
 | |
|  
 | |
| +#ifdef DEV_NETMAP
 | |
| +	netmap_disable_all_rings(netdev);
 | |
| +#endif
 | |
| +
 | |
|  	adapter->flags2 &= ~(IXGBE_FLAG2_FDIR_REQUIRES_REINIT |
 | |
|  			     IXGBE_FLAG2_RESET_REQUESTED);
 | |
|  	adapter->flags &= ~IXGBE_FLAG_NEED_LINK_UPDATE;
 | |
| @@ -7683,6 +7731,11 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
 | |
|  
 | |
|  	e_dev_info("Intel(R) 10 Gigabit Network Connection\n");
 | |
|  	cards_found++;
 | |
| +
 | |
| +#ifdef DEV_NETMAP
 | |
| +	ixgbe_netmap_attach(adapter);
 | |
| +#endif /* DEV_NETMAP */
 | |
| +
 | |
|  	return 0;
 | |
|  
 | |
|  err_register:
 |