xref: /openbmc/linux/Documentation/networking/driver.rst (revision da4f0f82ee9d5a128b48c959e8db7f41b59848c8)
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
7*da4f0f82SJakub KicinskiProbing guidelines
8*da4f0f82SJakub Kicinski==================
9*da4f0f82SJakub Kicinski
10*da4f0f82SJakub KicinskiAddress validation
11*da4f0f82SJakub Kicinski------------------
12*da4f0f82SJakub Kicinski
13*da4f0f82SJakub KicinskiAny hardware layer address you obtain for your device should
14*da4f0f82SJakub Kicinskibe verified.  For example, for ethernet check it with
15*da4f0f82SJakub Kicinskilinux/etherdevice.h:is_valid_ether_addr()
16*da4f0f82SJakub Kicinski
17*da4f0f82SJakub KicinskiClose/stop guidelines
18*da4f0f82SJakub Kicinski=====================
19*da4f0f82SJakub Kicinski
20*da4f0f82SJakub KicinskiQuiescence
21*da4f0f82SJakub Kicinski----------
22*da4f0f82SJakub Kicinski
23*da4f0f82SJakub KicinskiAfter the ndo_stop routine has been called, the hardware must
24*da4f0f82SJakub Kicinskinot receive or transmit any data.  All in flight packets must
25*da4f0f82SJakub Kicinskibe aborted. If necessary, poll or wait for completion of
26*da4f0f82SJakub Kicinskiany reset commands.
27*da4f0f82SJakub Kicinski
28*da4f0f82SJakub KicinskiAuto-close
29*da4f0f82SJakub Kicinski----------
30*da4f0f82SJakub Kicinski
31*da4f0f82SJakub KicinskiThe ndo_stop routine will be called by unregister_netdevice
32*da4f0f82SJakub Kicinskiif device is still UP.
33*da4f0f82SJakub Kicinski
34d2f5c68eSJakub KicinskiTransmit path guidelines
35d2f5c68eSJakub Kicinski========================
3628d23311SMauro Carvalho Chehab
37d2f5c68eSJakub KicinskiStop queues in advance
38d2f5c68eSJakub Kicinski----------------------
39d2f5c68eSJakub Kicinski
40d2f5c68eSJakub KicinskiThe ndo_start_xmit method must not return NETDEV_TX_BUSY under
4128d23311SMauro Carvalho Chehabany normal circumstances.  It is considered a hard error unless
42404a5ad7SRandy Dunlapthere is no way your device can tell ahead of time when its
4328d23311SMauro Carvalho Chehabtransmit function will become busy.
4428d23311SMauro Carvalho Chehab
4528d23311SMauro Carvalho ChehabInstead it must maintain the queue properly.  For example,
4628d23311SMauro Carvalho Chehabfor a driver implementing scatter-gather this means::
4728d23311SMauro Carvalho Chehab
4828d23311SMauro Carvalho Chehab	static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb,
4928d23311SMauro Carvalho Chehab					       struct net_device *dev)
5028d23311SMauro Carvalho Chehab	{
5128d23311SMauro Carvalho Chehab		struct drv *dp = netdev_priv(dev);
5228d23311SMauro Carvalho Chehab
5328d23311SMauro Carvalho Chehab		lock_tx(dp);
5428d23311SMauro Carvalho Chehab		...
5528d23311SMauro Carvalho Chehab		/* This is a hard error log it. */
5628d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) <= (skb_shinfo(skb)->nr_frags + 1)) {
5728d23311SMauro Carvalho Chehab			netif_stop_queue(dev);
5828d23311SMauro Carvalho Chehab			unlock_tx(dp);
5928d23311SMauro Carvalho Chehab			printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n",
6028d23311SMauro Carvalho Chehab			       dev->name);
6128d23311SMauro Carvalho Chehab			return NETDEV_TX_BUSY;
6228d23311SMauro Carvalho Chehab		}
6328d23311SMauro Carvalho Chehab
6428d23311SMauro Carvalho Chehab		... queue packet to card ...
6528d23311SMauro Carvalho Chehab		... update tx consumer index ...
6628d23311SMauro Carvalho Chehab
6728d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) <= (MAX_SKB_FRAGS + 1))
6828d23311SMauro Carvalho Chehab			netif_stop_queue(dev);
6928d23311SMauro Carvalho Chehab
7028d23311SMauro Carvalho Chehab		...
7128d23311SMauro Carvalho Chehab		unlock_tx(dp);
7228d23311SMauro Carvalho Chehab		...
7328d23311SMauro Carvalho Chehab		return NETDEV_TX_OK;
7428d23311SMauro Carvalho Chehab	}
7528d23311SMauro Carvalho Chehab
7628d23311SMauro Carvalho ChehabAnd then at the end of your TX reclamation event handling::
7728d23311SMauro Carvalho Chehab
7828d23311SMauro Carvalho Chehab	if (netif_queue_stopped(dp->dev) &&
7928d23311SMauro Carvalho Chehab	    TX_BUFFS_AVAIL(dp) > (MAX_SKB_FRAGS + 1))
8028d23311SMauro Carvalho Chehab		netif_wake_queue(dp->dev);
8128d23311SMauro Carvalho Chehab
8228d23311SMauro Carvalho ChehabFor a non-scatter-gather supporting card, the three tests simply become::
8328d23311SMauro Carvalho Chehab
8428d23311SMauro Carvalho Chehab		/* This is a hard error log it. */
8528d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) <= 0)
8628d23311SMauro Carvalho Chehab
8728d23311SMauro Carvalho Chehaband::
8828d23311SMauro Carvalho Chehab
8928d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) == 0)
9028d23311SMauro Carvalho Chehab
9128d23311SMauro Carvalho Chehaband::
9228d23311SMauro Carvalho Chehab
9328d23311SMauro Carvalho Chehab	if (netif_queue_stopped(dp->dev) &&
9428d23311SMauro Carvalho Chehab	    TX_BUFFS_AVAIL(dp) > 0)
9528d23311SMauro Carvalho Chehab		netif_wake_queue(dp->dev);
9628d23311SMauro Carvalho Chehab
97d2f5c68eSJakub KicinskiNo exclusive ownership
98d2f5c68eSJakub Kicinski----------------------
99d2f5c68eSJakub Kicinski
100d2f5c68eSJakub KicinskiAn ndo_start_xmit method must not modify the shared parts of a
10128d23311SMauro Carvalho Chehabcloned SKB.
10228d23311SMauro Carvalho Chehab
103d2f5c68eSJakub KicinskiTimely completions
104d2f5c68eSJakub Kicinski------------------
105d2f5c68eSJakub Kicinski
106d2f5c68eSJakub KicinskiDo not forget that once you return NETDEV_TX_OK from your
10728d23311SMauro Carvalho Chehabndo_start_xmit method, it is your driver's responsibility to free
10828d23311SMauro Carvalho Chehabup the SKB and in some finite amount of time.
10928d23311SMauro Carvalho Chehab
11028d23311SMauro Carvalho ChehabFor example, this means that it is not allowed for your TX
11128d23311SMauro Carvalho Chehabmitigation scheme to let TX packets "hang out" in the TX
11228d23311SMauro Carvalho Chehabring unreclaimed forever if no new TX packets are sent.
11328d23311SMauro Carvalho ChehabThis error can deadlock sockets waiting for send buffer room
11428d23311SMauro Carvalho Chehabto be freed up.
11528d23311SMauro Carvalho Chehab
11628d23311SMauro Carvalho ChehabIf you return NETDEV_TX_BUSY from the ndo_start_xmit method, you
11728d23311SMauro Carvalho Chehabmust not keep any reference to that SKB and you must not attempt
11828d23311SMauro Carvalho Chehabto free it up.
119