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 7da4f0f82SJakub KicinskiProbing guidelines 8da4f0f82SJakub Kicinski================== 9da4f0f82SJakub Kicinski 10da4f0f82SJakub KicinskiAddress validation 11da4f0f82SJakub Kicinski------------------ 12da4f0f82SJakub Kicinski 13da4f0f82SJakub KicinskiAny hardware layer address you obtain for your device should 14da4f0f82SJakub Kicinskibe verified. For example, for ethernet check it with 15da4f0f82SJakub Kicinskilinux/etherdevice.h:is_valid_ether_addr() 16da4f0f82SJakub Kicinski 17da4f0f82SJakub KicinskiClose/stop guidelines 18da4f0f82SJakub Kicinski===================== 19da4f0f82SJakub Kicinski 20da4f0f82SJakub KicinskiQuiescence 21da4f0f82SJakub Kicinski---------- 22da4f0f82SJakub Kicinski 23da4f0f82SJakub KicinskiAfter the ndo_stop routine has been called, the hardware must 24da4f0f82SJakub Kicinskinot receive or transmit any data. All in flight packets must 25da4f0f82SJakub Kicinskibe aborted. If necessary, poll or wait for completion of 26da4f0f82SJakub Kicinskiany reset commands. 27da4f0f82SJakub Kicinski 28da4f0f82SJakub KicinskiAuto-close 29da4f0f82SJakub Kicinski---------- 30da4f0f82SJakub Kicinski 31da4f0f82SJakub KicinskiThe ndo_stop routine will be called by unregister_netdevice 32da4f0f82SJakub Kicinskiif device is still UP. 33da4f0f82SJakub 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, 4683364625SJakub Kicinskifor a driver implementing scatter-gather this means: 4783364625SJakub Kicinski 4883364625SJakub Kicinski.. code-block:: c 4928d23311SMauro Carvalho Chehab 5028d23311SMauro Carvalho Chehab static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb, 5128d23311SMauro Carvalho Chehab struct net_device *dev) 5228d23311SMauro Carvalho Chehab { 5328d23311SMauro Carvalho Chehab struct drv *dp = netdev_priv(dev); 5428d23311SMauro Carvalho Chehab 5528d23311SMauro Carvalho Chehab lock_tx(dp); 5683364625SJakub Kicinski //... 5728d23311SMauro Carvalho Chehab /* This is a hard error log it. */ 5828d23311SMauro Carvalho Chehab if (TX_BUFFS_AVAIL(dp) <= (skb_shinfo(skb)->nr_frags + 1)) { 5928d23311SMauro Carvalho Chehab netif_stop_queue(dev); 6028d23311SMauro Carvalho Chehab unlock_tx(dp); 6128d23311SMauro Carvalho Chehab printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n", 6228d23311SMauro Carvalho Chehab dev->name); 6328d23311SMauro Carvalho Chehab return NETDEV_TX_BUSY; 6428d23311SMauro Carvalho Chehab } 6528d23311SMauro Carvalho Chehab 6683364625SJakub Kicinski //... queue packet to card ... 6783364625SJakub Kicinski //... update tx consumer index ... 6828d23311SMauro Carvalho Chehab 6928d23311SMauro Carvalho Chehab if (TX_BUFFS_AVAIL(dp) <= (MAX_SKB_FRAGS + 1)) 7028d23311SMauro Carvalho Chehab netif_stop_queue(dev); 7128d23311SMauro Carvalho Chehab 7283364625SJakub Kicinski //... 7328d23311SMauro Carvalho Chehab unlock_tx(dp); 7483364625SJakub Kicinski //... 7528d23311SMauro Carvalho Chehab return NETDEV_TX_OK; 7628d23311SMauro Carvalho Chehab } 7728d23311SMauro Carvalho Chehab 7883364625SJakub KicinskiAnd then at the end of your TX reclamation event handling: 7983364625SJakub Kicinski 8083364625SJakub Kicinski.. code-block:: c 8128d23311SMauro Carvalho Chehab 8228d23311SMauro Carvalho Chehab if (netif_queue_stopped(dp->dev) && 8328d23311SMauro Carvalho Chehab TX_BUFFS_AVAIL(dp) > (MAX_SKB_FRAGS + 1)) 8428d23311SMauro Carvalho Chehab netif_wake_queue(dp->dev); 8528d23311SMauro Carvalho Chehab 8683364625SJakub KicinskiFor a non-scatter-gather supporting card, the three tests simply become: 8783364625SJakub Kicinski 8883364625SJakub Kicinski.. code-block:: c 8928d23311SMauro Carvalho Chehab 9028d23311SMauro Carvalho Chehab /* This is a hard error log it. */ 9128d23311SMauro Carvalho Chehab if (TX_BUFFS_AVAIL(dp) <= 0) 9228d23311SMauro Carvalho Chehab 9383364625SJakub Kicinskiand: 9483364625SJakub Kicinski 9583364625SJakub Kicinski.. code-block:: c 9628d23311SMauro Carvalho Chehab 9728d23311SMauro Carvalho Chehab if (TX_BUFFS_AVAIL(dp) == 0) 9828d23311SMauro Carvalho Chehab 9983364625SJakub Kicinskiand: 10083364625SJakub Kicinski 10183364625SJakub Kicinski.. code-block:: c 10228d23311SMauro Carvalho Chehab 10328d23311SMauro Carvalho Chehab if (netif_queue_stopped(dp->dev) && 10428d23311SMauro Carvalho Chehab TX_BUFFS_AVAIL(dp) > 0) 10528d23311SMauro Carvalho Chehab netif_wake_queue(dp->dev); 10628d23311SMauro Carvalho Chehab 107*c91c46deSJakub KicinskiLockless queue stop / wake helper macros 108*c91c46deSJakub Kicinski~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109*c91c46deSJakub Kicinski 110*c91c46deSJakub Kicinski.. kernel-doc:: include/net/netdev_queues.h 111*c91c46deSJakub Kicinski :doc: Lockless queue stopping / waking helpers. 112*c91c46deSJakub Kicinski 113d2f5c68eSJakub KicinskiNo exclusive ownership 114d2f5c68eSJakub Kicinski---------------------- 115d2f5c68eSJakub Kicinski 116d2f5c68eSJakub KicinskiAn ndo_start_xmit method must not modify the shared parts of a 11728d23311SMauro Carvalho Chehabcloned SKB. 11828d23311SMauro Carvalho Chehab 119d2f5c68eSJakub KicinskiTimely completions 120d2f5c68eSJakub Kicinski------------------ 121d2f5c68eSJakub Kicinski 122d2f5c68eSJakub KicinskiDo not forget that once you return NETDEV_TX_OK from your 12328d23311SMauro Carvalho Chehabndo_start_xmit method, it is your driver's responsibility to free 12428d23311SMauro Carvalho Chehabup the SKB and in some finite amount of time. 12528d23311SMauro Carvalho Chehab 12628d23311SMauro Carvalho ChehabFor example, this means that it is not allowed for your TX 12728d23311SMauro Carvalho Chehabmitigation scheme to let TX packets "hang out" in the TX 12828d23311SMauro Carvalho Chehabring unreclaimed forever if no new TX packets are sent. 12928d23311SMauro Carvalho ChehabThis error can deadlock sockets waiting for send buffer room 13028d23311SMauro Carvalho Chehabto be freed up. 13128d23311SMauro Carvalho Chehab 13228d23311SMauro Carvalho ChehabIf you return NETDEV_TX_BUSY from the ndo_start_xmit method, you 13328d23311SMauro Carvalho Chehabmust not keep any reference to that SKB and you must not attempt 13428d23311SMauro Carvalho Chehabto free it up. 135