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