162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci=====================
462306a36Sopenharmony_ciSoftnet Driver Issues
562306a36Sopenharmony_ci=====================
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciProbing guidelines
862306a36Sopenharmony_ci==================
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciAddress validation
1162306a36Sopenharmony_ci------------------
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ciAny hardware layer address you obtain for your device should
1462306a36Sopenharmony_cibe verified.  For example, for ethernet check it with
1562306a36Sopenharmony_cilinux/etherdevice.h:is_valid_ether_addr()
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciClose/stop guidelines
1862306a36Sopenharmony_ci=====================
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciQuiescence
2162306a36Sopenharmony_ci----------
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ciAfter the ndo_stop routine has been called, the hardware must
2462306a36Sopenharmony_cinot receive or transmit any data.  All in flight packets must
2562306a36Sopenharmony_cibe aborted. If necessary, poll or wait for completion of
2662306a36Sopenharmony_ciany reset commands.
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciAuto-close
2962306a36Sopenharmony_ci----------
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ciThe ndo_stop routine will be called by unregister_netdevice
3262306a36Sopenharmony_ciif device is still UP.
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciTransmit path guidelines
3562306a36Sopenharmony_ci========================
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ciStop queues in advance
3862306a36Sopenharmony_ci----------------------
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciThe ndo_start_xmit method must not return NETDEV_TX_BUSY under
4162306a36Sopenharmony_ciany normal circumstances.  It is considered a hard error unless
4262306a36Sopenharmony_cithere is no way your device can tell ahead of time when its
4362306a36Sopenharmony_citransmit function will become busy.
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ciInstead it must maintain the queue properly.  For example,
4662306a36Sopenharmony_cifor a driver implementing scatter-gather this means:
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci.. code-block:: c
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	static u32 drv_tx_avail(struct drv_ring *dr)
5162306a36Sopenharmony_ci	{
5262306a36Sopenharmony_ci		u32 used = READ_ONCE(dr->prod) - READ_ONCE(dr->cons);
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci		return dr->tx_ring_size - (used & bp->tx_ring_mask);
5562306a36Sopenharmony_ci	}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb,
5862306a36Sopenharmony_ci					       struct net_device *dev)
5962306a36Sopenharmony_ci	{
6062306a36Sopenharmony_ci		struct drv *dp = netdev_priv(dev);
6162306a36Sopenharmony_ci		struct netdev_queue *txq;
6262306a36Sopenharmony_ci		struct drv_ring *dr;
6362306a36Sopenharmony_ci		int idx;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci		idx = skb_get_queue_mapping(skb);
6662306a36Sopenharmony_ci		dr = dp->tx_rings[idx];
6762306a36Sopenharmony_ci		txq = netdev_get_tx_queue(dev, idx);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci		//...
7062306a36Sopenharmony_ci		/* This should be a very rare race - log it. */
7162306a36Sopenharmony_ci		if (drv_tx_avail(dr) <= skb_shinfo(skb)->nr_frags + 1) {
7262306a36Sopenharmony_ci			netif_stop_queue(dev);
7362306a36Sopenharmony_ci			netdev_warn(dev, "Tx Ring full when queue awake!\n");
7462306a36Sopenharmony_ci			return NETDEV_TX_BUSY;
7562306a36Sopenharmony_ci		}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci		//... queue packet to card ...
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci		netdev_tx_sent_queue(txq, skb->len);
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci		//... update tx producer index using WRITE_ONCE() ...
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci		if (!netif_txq_maybe_stop(txq, drv_tx_avail(dr),
8462306a36Sopenharmony_ci					  MAX_SKB_FRAGS + 1, 2 * MAX_SKB_FRAGS))
8562306a36Sopenharmony_ci			dr->stats.stopped++;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci		//...
8862306a36Sopenharmony_ci		return NETDEV_TX_OK;
8962306a36Sopenharmony_ci	}
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ciAnd then at the end of your TX reclamation event handling:
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci.. code-block:: c
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	//... update tx consumer index using WRITE_ONCE() ...
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	netif_txq_completed_wake(txq, cmpl_pkts, cmpl_bytes,
9862306a36Sopenharmony_ci				 drv_tx_avail(dr), 2 * MAX_SKB_FRAGS);
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ciLockless queue stop / wake helper macros
10162306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci.. kernel-doc:: include/net/netdev_queues.h
10462306a36Sopenharmony_ci   :doc: Lockless queue stopping / waking helpers.
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ciNo exclusive ownership
10762306a36Sopenharmony_ci----------------------
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ciAn ndo_start_xmit method must not modify the shared parts of a
11062306a36Sopenharmony_cicloned SKB.
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ciTimely completions
11362306a36Sopenharmony_ci------------------
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ciDo not forget that once you return NETDEV_TX_OK from your
11662306a36Sopenharmony_cindo_start_xmit method, it is your driver's responsibility to free
11762306a36Sopenharmony_ciup the SKB and in some finite amount of time.
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ciFor example, this means that it is not allowed for your TX
12062306a36Sopenharmony_cimitigation scheme to let TX packets "hang out" in the TX
12162306a36Sopenharmony_ciring unreclaimed forever if no new TX packets are sent.
12262306a36Sopenharmony_ciThis error can deadlock sockets waiting for send buffer room
12362306a36Sopenharmony_cito be freed up.
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ciIf you return NETDEV_TX_BUSY from the ndo_start_xmit method, you
12662306a36Sopenharmony_cimust not keep any reference to that SKB and you must not attempt
12762306a36Sopenharmony_cito free it up.
128