xref: /openbmc/linux/Documentation/networking/driver.rst (revision 404a5ad72011f5bd2bb90f0a035be7635e2bd839)
128d23311SMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0
228d23311SMauro Carvalho Chehab
328d23311SMauro Carvalho Chehab=====================
428d23311SMauro Carvalho ChehabSoftnet Driver Issues
528d23311SMauro Carvalho Chehab=====================
628d23311SMauro Carvalho Chehab
728d23311SMauro Carvalho ChehabTransmit path guidelines:
828d23311SMauro Carvalho Chehab
928d23311SMauro Carvalho Chehab1) The ndo_start_xmit method must not return NETDEV_TX_BUSY under
1028d23311SMauro Carvalho Chehab   any normal circumstances.  It is considered a hard error unless
11*404a5ad7SRandy Dunlap   there is no way your device can tell ahead of time when its
1228d23311SMauro Carvalho Chehab   transmit function will become busy.
1328d23311SMauro Carvalho Chehab
1428d23311SMauro Carvalho Chehab   Instead it must maintain the queue properly.  For example,
1528d23311SMauro Carvalho Chehab   for a driver implementing scatter-gather this means::
1628d23311SMauro Carvalho Chehab
1728d23311SMauro Carvalho Chehab	static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb,
1828d23311SMauro Carvalho Chehab					       struct net_device *dev)
1928d23311SMauro Carvalho Chehab	{
2028d23311SMauro Carvalho Chehab		struct drv *dp = netdev_priv(dev);
2128d23311SMauro Carvalho Chehab
2228d23311SMauro Carvalho Chehab		lock_tx(dp);
2328d23311SMauro Carvalho Chehab		...
2428d23311SMauro Carvalho Chehab		/* This is a hard error log it. */
2528d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) <= (skb_shinfo(skb)->nr_frags + 1)) {
2628d23311SMauro Carvalho Chehab			netif_stop_queue(dev);
2728d23311SMauro Carvalho Chehab			unlock_tx(dp);
2828d23311SMauro Carvalho Chehab			printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n",
2928d23311SMauro Carvalho Chehab			       dev->name);
3028d23311SMauro Carvalho Chehab			return NETDEV_TX_BUSY;
3128d23311SMauro Carvalho Chehab		}
3228d23311SMauro Carvalho Chehab
3328d23311SMauro Carvalho Chehab		... queue packet to card ...
3428d23311SMauro Carvalho Chehab		... update tx consumer index ...
3528d23311SMauro Carvalho Chehab
3628d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) <= (MAX_SKB_FRAGS + 1))
3728d23311SMauro Carvalho Chehab			netif_stop_queue(dev);
3828d23311SMauro Carvalho Chehab
3928d23311SMauro Carvalho Chehab		...
4028d23311SMauro Carvalho Chehab		unlock_tx(dp);
4128d23311SMauro Carvalho Chehab		...
4228d23311SMauro Carvalho Chehab		return NETDEV_TX_OK;
4328d23311SMauro Carvalho Chehab	}
4428d23311SMauro Carvalho Chehab
4528d23311SMauro Carvalho Chehab   And then at the end of your TX reclamation event handling::
4628d23311SMauro Carvalho Chehab
4728d23311SMauro Carvalho Chehab	if (netif_queue_stopped(dp->dev) &&
4828d23311SMauro Carvalho Chehab	    TX_BUFFS_AVAIL(dp) > (MAX_SKB_FRAGS + 1))
4928d23311SMauro Carvalho Chehab		netif_wake_queue(dp->dev);
5028d23311SMauro Carvalho Chehab
5128d23311SMauro Carvalho Chehab   For a non-scatter-gather supporting card, the three tests simply become::
5228d23311SMauro Carvalho Chehab
5328d23311SMauro Carvalho Chehab		/* This is a hard error log it. */
5428d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) <= 0)
5528d23311SMauro Carvalho Chehab
5628d23311SMauro Carvalho Chehab   and::
5728d23311SMauro Carvalho Chehab
5828d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) == 0)
5928d23311SMauro Carvalho Chehab
6028d23311SMauro Carvalho Chehab   and::
6128d23311SMauro Carvalho Chehab
6228d23311SMauro Carvalho Chehab	if (netif_queue_stopped(dp->dev) &&
6328d23311SMauro Carvalho Chehab	    TX_BUFFS_AVAIL(dp) > 0)
6428d23311SMauro Carvalho Chehab		netif_wake_queue(dp->dev);
6528d23311SMauro Carvalho Chehab
6628d23311SMauro Carvalho Chehab2) An ndo_start_xmit method must not modify the shared parts of a
6728d23311SMauro Carvalho Chehab   cloned SKB.
6828d23311SMauro Carvalho Chehab
6928d23311SMauro Carvalho Chehab3) Do not forget that once you return NETDEV_TX_OK from your
7028d23311SMauro Carvalho Chehab   ndo_start_xmit method, it is your driver's responsibility to free
7128d23311SMauro Carvalho Chehab   up the SKB and in some finite amount of time.
7228d23311SMauro Carvalho Chehab
7328d23311SMauro Carvalho Chehab   For example, this means that it is not allowed for your TX
7428d23311SMauro Carvalho Chehab   mitigation scheme to let TX packets "hang out" in the TX
7528d23311SMauro Carvalho Chehab   ring unreclaimed forever if no new TX packets are sent.
7628d23311SMauro Carvalho Chehab   This error can deadlock sockets waiting for send buffer room
7728d23311SMauro Carvalho Chehab   to be freed up.
7828d23311SMauro Carvalho Chehab
7928d23311SMauro Carvalho Chehab   If you return NETDEV_TX_BUSY from the ndo_start_xmit method, you
8028d23311SMauro Carvalho Chehab   must not keep any reference to that SKB and you must not attempt
8128d23311SMauro Carvalho Chehab   to free it up.
8228d23311SMauro Carvalho Chehab
8328d23311SMauro Carvalho ChehabProbing guidelines:
8428d23311SMauro Carvalho Chehab
8528d23311SMauro Carvalho Chehab1) Any hardware layer address you obtain for your device should
8628d23311SMauro Carvalho Chehab   be verified.  For example, for ethernet check it with
8728d23311SMauro Carvalho Chehab   linux/etherdevice.h:is_valid_ether_addr()
8828d23311SMauro Carvalho Chehab
8928d23311SMauro Carvalho ChehabClose/stop guidelines:
9028d23311SMauro Carvalho Chehab
9128d23311SMauro Carvalho Chehab1) After the ndo_stop routine has been called, the hardware must
9228d23311SMauro Carvalho Chehab   not receive or transmit any data.  All in flight packets must
9328d23311SMauro Carvalho Chehab   be aborted. If necessary, poll or wait for completion of
9428d23311SMauro Carvalho Chehab   any reset commands.
9528d23311SMauro Carvalho Chehab
9628d23311SMauro Carvalho Chehab2) The ndo_stop routine will be called by unregister_netdevice
9728d23311SMauro Carvalho Chehab   if device is still UP.
98