94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
Document about softnet driver issues
 | 
						|
 | 
						|
Transmit path guidelines:
 | 
						|
 | 
						|
1) The ndo_start_xmit method must not return NETDEV_TX_BUSY under
 | 
						|
   any normal circumstances.  It is considered a hard error unless
 | 
						|
   there is no way your device can tell ahead of time when it's
 | 
						|
   transmit function will become busy.
 | 
						|
 | 
						|
   Instead it must maintain the queue properly.  For example,
 | 
						|
   for a driver implementing scatter-gather this means:
 | 
						|
 | 
						|
	static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb,
 | 
						|
					       struct net_device *dev)
 | 
						|
	{
 | 
						|
		struct drv *dp = netdev_priv(dev);
 | 
						|
 | 
						|
		lock_tx(dp);
 | 
						|
		...
 | 
						|
		/* This is a hard error log it. */
 | 
						|
		if (TX_BUFFS_AVAIL(dp) <= (skb_shinfo(skb)->nr_frags + 1)) {
 | 
						|
			netif_stop_queue(dev);
 | 
						|
			unlock_tx(dp);
 | 
						|
			printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n",
 | 
						|
			       dev->name);
 | 
						|
			return NETDEV_TX_BUSY;
 | 
						|
		}
 | 
						|
 | 
						|
		... queue packet to card ...
 | 
						|
		... update tx consumer index ...
 | 
						|
 | 
						|
		if (TX_BUFFS_AVAIL(dp) <= (MAX_SKB_FRAGS + 1))
 | 
						|
			netif_stop_queue(dev);
 | 
						|
 | 
						|
		...
 | 
						|
		unlock_tx(dp);
 | 
						|
		...
 | 
						|
		return NETDEV_TX_OK;
 | 
						|
	}
 | 
						|
 | 
						|
   And then at the end of your TX reclamation event handling:
 | 
						|
 | 
						|
	if (netif_queue_stopped(dp->dev) &&
 | 
						|
            TX_BUFFS_AVAIL(dp) > (MAX_SKB_FRAGS + 1))
 | 
						|
		netif_wake_queue(dp->dev);
 | 
						|
 | 
						|
   For a non-scatter-gather supporting card, the three tests simply become:
 | 
						|
 | 
						|
		/* This is a hard error log it. */
 | 
						|
		if (TX_BUFFS_AVAIL(dp) <= 0)
 | 
						|
 | 
						|
   and:
 | 
						|
 | 
						|
		if (TX_BUFFS_AVAIL(dp) == 0)
 | 
						|
 | 
						|
   and:
 | 
						|
 | 
						|
	if (netif_queue_stopped(dp->dev) &&
 | 
						|
            TX_BUFFS_AVAIL(dp) > 0)
 | 
						|
		netif_wake_queue(dp->dev);
 | 
						|
 | 
						|
2) An ndo_start_xmit method must not modify the shared parts of a
 | 
						|
   cloned SKB.
 | 
						|
 | 
						|
3) Do not forget that once you return NETDEV_TX_OK from your
 | 
						|
   ndo_start_xmit method, it is your driver's responsibility to free
 | 
						|
   up the SKB and in some finite amount of time.
 | 
						|
 | 
						|
   For example, this means that it is not allowed for your TX
 | 
						|
   mitigation scheme to let TX packets "hang out" in the TX
 | 
						|
   ring unreclaimed forever if no new TX packets are sent.
 | 
						|
   This error can deadlock sockets waiting for send buffer room
 | 
						|
   to be freed up.
 | 
						|
 | 
						|
   If you return NETDEV_TX_BUSY from the ndo_start_xmit method, you
 | 
						|
   must not keep any reference to that SKB and you must not attempt
 | 
						|
   to free it up.
 | 
						|
 | 
						|
Probing guidelines:
 | 
						|
 | 
						|
1) Any hardware layer address you obtain for your device should
 | 
						|
   be verified.  For example, for ethernet check it with
 | 
						|
   linux/etherdevice.h:is_valid_ether_addr()
 | 
						|
 | 
						|
Close/stop guidelines:
 | 
						|
 | 
						|
1) After the ndo_stop routine has been called, the hardware must
 | 
						|
   not receive or transmit any data.  All in flight packets must
 | 
						|
   be aborted. If necessary, poll or wait for completion of 
 | 
						|
   any reset commands.
 | 
						|
 | 
						|
2) The ndo_stop routine will be called by unregister_netdevice
 | 
						|
   if device is still UP.
 |