xref: /openbmc/linux/Documentation/networking/driver.rst (revision 28d23311ff35ac97ff20608f47c84c95d6389c33)
1*28d23311SMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0
2*28d23311SMauro Carvalho Chehab
3*28d23311SMauro Carvalho Chehab=====================
4*28d23311SMauro Carvalho ChehabSoftnet Driver Issues
5*28d23311SMauro Carvalho Chehab=====================
6*28d23311SMauro Carvalho Chehab
7*28d23311SMauro Carvalho ChehabTransmit path guidelines:
8*28d23311SMauro Carvalho Chehab
9*28d23311SMauro Carvalho Chehab1) The ndo_start_xmit method must not return NETDEV_TX_BUSY under
10*28d23311SMauro Carvalho Chehab   any normal circumstances.  It is considered a hard error unless
11*28d23311SMauro Carvalho Chehab   there is no way your device can tell ahead of time when it's
12*28d23311SMauro Carvalho Chehab   transmit function will become busy.
13*28d23311SMauro Carvalho Chehab
14*28d23311SMauro Carvalho Chehab   Instead it must maintain the queue properly.  For example,
15*28d23311SMauro Carvalho Chehab   for a driver implementing scatter-gather this means::
16*28d23311SMauro Carvalho Chehab
17*28d23311SMauro Carvalho Chehab	static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb,
18*28d23311SMauro Carvalho Chehab					       struct net_device *dev)
19*28d23311SMauro Carvalho Chehab	{
20*28d23311SMauro Carvalho Chehab		struct drv *dp = netdev_priv(dev);
21*28d23311SMauro Carvalho Chehab
22*28d23311SMauro Carvalho Chehab		lock_tx(dp);
23*28d23311SMauro Carvalho Chehab		...
24*28d23311SMauro Carvalho Chehab		/* This is a hard error log it. */
25*28d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) <= (skb_shinfo(skb)->nr_frags + 1)) {
26*28d23311SMauro Carvalho Chehab			netif_stop_queue(dev);
27*28d23311SMauro Carvalho Chehab			unlock_tx(dp);
28*28d23311SMauro Carvalho Chehab			printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n",
29*28d23311SMauro Carvalho Chehab			       dev->name);
30*28d23311SMauro Carvalho Chehab			return NETDEV_TX_BUSY;
31*28d23311SMauro Carvalho Chehab		}
32*28d23311SMauro Carvalho Chehab
33*28d23311SMauro Carvalho Chehab		... queue packet to card ...
34*28d23311SMauro Carvalho Chehab		... update tx consumer index ...
35*28d23311SMauro Carvalho Chehab
36*28d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) <= (MAX_SKB_FRAGS + 1))
37*28d23311SMauro Carvalho Chehab			netif_stop_queue(dev);
38*28d23311SMauro Carvalho Chehab
39*28d23311SMauro Carvalho Chehab		...
40*28d23311SMauro Carvalho Chehab		unlock_tx(dp);
41*28d23311SMauro Carvalho Chehab		...
42*28d23311SMauro Carvalho Chehab		return NETDEV_TX_OK;
43*28d23311SMauro Carvalho Chehab	}
44*28d23311SMauro Carvalho Chehab
45*28d23311SMauro Carvalho Chehab   And then at the end of your TX reclamation event handling::
46*28d23311SMauro Carvalho Chehab
47*28d23311SMauro Carvalho Chehab	if (netif_queue_stopped(dp->dev) &&
48*28d23311SMauro Carvalho Chehab	    TX_BUFFS_AVAIL(dp) > (MAX_SKB_FRAGS + 1))
49*28d23311SMauro Carvalho Chehab		netif_wake_queue(dp->dev);
50*28d23311SMauro Carvalho Chehab
51*28d23311SMauro Carvalho Chehab   For a non-scatter-gather supporting card, the three tests simply become::
52*28d23311SMauro Carvalho Chehab
53*28d23311SMauro Carvalho Chehab		/* This is a hard error log it. */
54*28d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) <= 0)
55*28d23311SMauro Carvalho Chehab
56*28d23311SMauro Carvalho Chehab   and::
57*28d23311SMauro Carvalho Chehab
58*28d23311SMauro Carvalho Chehab		if (TX_BUFFS_AVAIL(dp) == 0)
59*28d23311SMauro Carvalho Chehab
60*28d23311SMauro Carvalho Chehab   and::
61*28d23311SMauro Carvalho Chehab
62*28d23311SMauro Carvalho Chehab	if (netif_queue_stopped(dp->dev) &&
63*28d23311SMauro Carvalho Chehab	    TX_BUFFS_AVAIL(dp) > 0)
64*28d23311SMauro Carvalho Chehab		netif_wake_queue(dp->dev);
65*28d23311SMauro Carvalho Chehab
66*28d23311SMauro Carvalho Chehab2) An ndo_start_xmit method must not modify the shared parts of a
67*28d23311SMauro Carvalho Chehab   cloned SKB.
68*28d23311SMauro Carvalho Chehab
69*28d23311SMauro Carvalho Chehab3) Do not forget that once you return NETDEV_TX_OK from your
70*28d23311SMauro Carvalho Chehab   ndo_start_xmit method, it is your driver's responsibility to free
71*28d23311SMauro Carvalho Chehab   up the SKB and in some finite amount of time.
72*28d23311SMauro Carvalho Chehab
73*28d23311SMauro Carvalho Chehab   For example, this means that it is not allowed for your TX
74*28d23311SMauro Carvalho Chehab   mitigation scheme to let TX packets "hang out" in the TX
75*28d23311SMauro Carvalho Chehab   ring unreclaimed forever if no new TX packets are sent.
76*28d23311SMauro Carvalho Chehab   This error can deadlock sockets waiting for send buffer room
77*28d23311SMauro Carvalho Chehab   to be freed up.
78*28d23311SMauro Carvalho Chehab
79*28d23311SMauro Carvalho Chehab   If you return NETDEV_TX_BUSY from the ndo_start_xmit method, you
80*28d23311SMauro Carvalho Chehab   must not keep any reference to that SKB and you must not attempt
81*28d23311SMauro Carvalho Chehab   to free it up.
82*28d23311SMauro Carvalho Chehab
83*28d23311SMauro Carvalho ChehabProbing guidelines:
84*28d23311SMauro Carvalho Chehab
85*28d23311SMauro Carvalho Chehab1) Any hardware layer address you obtain for your device should
86*28d23311SMauro Carvalho Chehab   be verified.  For example, for ethernet check it with
87*28d23311SMauro Carvalho Chehab   linux/etherdevice.h:is_valid_ether_addr()
88*28d23311SMauro Carvalho Chehab
89*28d23311SMauro Carvalho ChehabClose/stop guidelines:
90*28d23311SMauro Carvalho Chehab
91*28d23311SMauro Carvalho Chehab1) After the ndo_stop routine has been called, the hardware must
92*28d23311SMauro Carvalho Chehab   not receive or transmit any data.  All in flight packets must
93*28d23311SMauro Carvalho Chehab   be aborted. If necessary, poll or wait for completion of
94*28d23311SMauro Carvalho Chehab   any reset commands.
95*28d23311SMauro Carvalho Chehab
96*28d23311SMauro Carvalho Chehab2) The ndo_stop routine will be called by unregister_netdevice
97*28d23311SMauro Carvalho Chehab   if device is still UP.
98