Document about softnet driver issues

Transmit path guidelines:

1) The hard_start_xmit method must never return '1' 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 int drv_hard_start_xmit(struct sk_buff *skb,
		   		       struct net_device *dev)
	{
		struct drv *dp = dev->priv;

		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 1;
		}

		... queue packet to card ...
		... update tx consumer index ...

		if (TX_BUFFS_AVAIL(dp) <= (MAX_SKB_FRAGS + 1))
			netif_stop_queue(dev);

		...
		unlock_tx(dp);
		...
	}

   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) Do not forget to update netdev->trans_start to jiffies after
   each new tx packet is given to the hardware.

3) Do not forget that once you return 0 from your hard_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 1 from the hard_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 dev->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 dev->stop routine will be called by unregister_netdevice
   if device is still UP.
