162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci===================== 462306a36Sopenharmony_ciSoftnet Driver Issues 562306a36Sopenharmony_ci===================== 662306a36Sopenharmony_ci 762306a36Sopenharmony_ciProbing guidelines 862306a36Sopenharmony_ci================== 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciAddress validation 1162306a36Sopenharmony_ci------------------ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciAny hardware layer address you obtain for your device should 1462306a36Sopenharmony_cibe verified. For example, for ethernet check it with 1562306a36Sopenharmony_cilinux/etherdevice.h:is_valid_ether_addr() 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ciClose/stop guidelines 1862306a36Sopenharmony_ci===================== 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciQuiescence 2162306a36Sopenharmony_ci---------- 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ciAfter the ndo_stop routine has been called, the hardware must 2462306a36Sopenharmony_cinot receive or transmit any data. All in flight packets must 2562306a36Sopenharmony_cibe aborted. If necessary, poll or wait for completion of 2662306a36Sopenharmony_ciany reset commands. 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ciAuto-close 2962306a36Sopenharmony_ci---------- 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ciThe ndo_stop routine will be called by unregister_netdevice 3262306a36Sopenharmony_ciif device is still UP. 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ciTransmit path guidelines 3562306a36Sopenharmony_ci======================== 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciStop queues in advance 3862306a36Sopenharmony_ci---------------------- 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciThe ndo_start_xmit method must not return NETDEV_TX_BUSY under 4162306a36Sopenharmony_ciany normal circumstances. It is considered a hard error unless 4262306a36Sopenharmony_cithere is no way your device can tell ahead of time when its 4362306a36Sopenharmony_citransmit function will become busy. 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ciInstead it must maintain the queue properly. For example, 4662306a36Sopenharmony_cifor a driver implementing scatter-gather this means: 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci.. code-block:: c 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci static u32 drv_tx_avail(struct drv_ring *dr) 5162306a36Sopenharmony_ci { 5262306a36Sopenharmony_ci u32 used = READ_ONCE(dr->prod) - READ_ONCE(dr->cons); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci return dr->tx_ring_size - (used & bp->tx_ring_mask); 5562306a36Sopenharmony_ci } 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb, 5862306a36Sopenharmony_ci struct net_device *dev) 5962306a36Sopenharmony_ci { 6062306a36Sopenharmony_ci struct drv *dp = netdev_priv(dev); 6162306a36Sopenharmony_ci struct netdev_queue *txq; 6262306a36Sopenharmony_ci struct drv_ring *dr; 6362306a36Sopenharmony_ci int idx; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci idx = skb_get_queue_mapping(skb); 6662306a36Sopenharmony_ci dr = dp->tx_rings[idx]; 6762306a36Sopenharmony_ci txq = netdev_get_tx_queue(dev, idx); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci //... 7062306a36Sopenharmony_ci /* This should be a very rare race - log it. */ 7162306a36Sopenharmony_ci if (drv_tx_avail(dr) <= skb_shinfo(skb)->nr_frags + 1) { 7262306a36Sopenharmony_ci netif_stop_queue(dev); 7362306a36Sopenharmony_ci netdev_warn(dev, "Tx Ring full when queue awake!\n"); 7462306a36Sopenharmony_ci return NETDEV_TX_BUSY; 7562306a36Sopenharmony_ci } 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci //... queue packet to card ... 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci netdev_tx_sent_queue(txq, skb->len); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci //... update tx producer index using WRITE_ONCE() ... 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci if (!netif_txq_maybe_stop(txq, drv_tx_avail(dr), 8462306a36Sopenharmony_ci MAX_SKB_FRAGS + 1, 2 * MAX_SKB_FRAGS)) 8562306a36Sopenharmony_ci dr->stats.stopped++; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci //... 8862306a36Sopenharmony_ci return NETDEV_TX_OK; 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciAnd then at the end of your TX reclamation event handling: 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci.. code-block:: c 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci //... update tx consumer index using WRITE_ONCE() ... 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci netif_txq_completed_wake(txq, cmpl_pkts, cmpl_bytes, 9862306a36Sopenharmony_ci drv_tx_avail(dr), 2 * MAX_SKB_FRAGS); 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ciLockless queue stop / wake helper macros 10162306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci.. kernel-doc:: include/net/netdev_queues.h 10462306a36Sopenharmony_ci :doc: Lockless queue stopping / waking helpers. 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ciNo exclusive ownership 10762306a36Sopenharmony_ci---------------------- 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ciAn ndo_start_xmit method must not modify the shared parts of a 11062306a36Sopenharmony_cicloned SKB. 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ciTimely completions 11362306a36Sopenharmony_ci------------------ 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ciDo not forget that once you return NETDEV_TX_OK from your 11662306a36Sopenharmony_cindo_start_xmit method, it is your driver's responsibility to free 11762306a36Sopenharmony_ciup the SKB and in some finite amount of time. 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ciFor example, this means that it is not allowed for your TX 12062306a36Sopenharmony_cimitigation scheme to let TX packets "hang out" in the TX 12162306a36Sopenharmony_ciring unreclaimed forever if no new TX packets are sent. 12262306a36Sopenharmony_ciThis error can deadlock sockets waiting for send buffer room 12362306a36Sopenharmony_cito be freed up. 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ciIf you return NETDEV_TX_BUSY from the ndo_start_xmit method, you 12662306a36Sopenharmony_cimust not keep any reference to that SKB and you must not attempt 12762306a36Sopenharmony_cito free it up. 128