tree: https://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-queue.git master head: db494b13c593e578fed58a6e41f4c9df619180d8 commit: f758f47f8a1fbf1908c6dcbd6ec1fe8dfd8f5261 [2/4] net: ti: icssg-prueth: Fix signedness bug in prueth_init_rx_chns() :::::: branch date: 13 hours ago :::::: commit date: 13 hours ago config: arm64-defconfig (attached as .config) compiler: aarch64-linux-gcc (GCC) 15.1.0 reproduce (this is a W=1 build): (attached as reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot | Closes: https://lore.kernel.org/oe-kbuild-all/202507090230.YPj6gQq3-lkp@intel.com/ All error/warnings (new ones prefixed by >>): >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:55:13: error: static declaration of 'prueth_cleanup_rx_chns' follows non-static declaration 55 | static void prueth_cleanup_rx_chns(struct prueth_emac *emac, | ^~~~~~~~~~~~~~~~~~~~~~ In file included from drivers/net/ethernet/ti/icssg/icssg_prueth.c:34: drivers/net/ethernet/ti/icssg/icssg_prueth.h:447:6: note: previous declaration of 'prueth_cleanup_rx_chns' with type 'void(struct prueth_emac *, struct prueth_rx_chn *, int)' 447 | void prueth_cleanup_rx_chns(struct prueth_emac *emac, | ^~~~~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:66:13: error: static declaration of 'prueth_cleanup_tx_chns' follows non-static declaration 66 | static void prueth_cleanup_tx_chns(struct prueth_emac *emac) | ^~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/ti/icssg/icssg_prueth.h:450:6: note: previous declaration of 'prueth_cleanup_tx_chns' with type 'void(struct prueth_emac *)' 450 | void prueth_cleanup_tx_chns(struct prueth_emac *emac); | ^~~~~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:86:13: error: static declaration of 'prueth_ndev_del_tx_napi' follows non-static declaration 86 | static void prueth_ndev_del_tx_napi(struct prueth_emac *emac, int num) | ^~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/ti/icssg/icssg_prueth.h:451:6: note: previous declaration of 'prueth_ndev_del_tx_napi' with type 'void(struct prueth_emac *, int)' 451 | void prueth_ndev_del_tx_napi(struct prueth_emac *emac, int num); | ^~~~~~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:99:13: error: static declaration of 'prueth_xmit_free' follows non-static declaration 99 | static void prueth_xmit_free(struct prueth_tx_chn *tx_chn, | ^~~~~~~~~~~~~~~~ drivers/net/ethernet/ti/icssg/icssg_prueth.h:452:6: note: previous declaration of 'prueth_xmit_free' with type 'void(struct prueth_tx_chn *, struct cppi5_host_desc_t *)' 452 | void prueth_xmit_free(struct prueth_tx_chn *tx_chn, | ^~~~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:135:12: error: conflicting types for 'emac_tx_complete_packets'; have 'int(struct prueth_emac *, int, int)' 135 | static int emac_tx_complete_packets(struct prueth_emac *emac, int chn, | ^~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/ti/icssg/icssg_prueth.h:454:5: note: previous declaration of 'emac_tx_complete_packets' with type 'int(struct prueth_emac *, int, int, bool *)' {aka 'int(struct prueth_emac *, int, int, _Bool *)'} 454 | int emac_tx_complete_packets(struct prueth_emac *emac, int chn, | ^~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:225:12: error: static declaration of 'prueth_ndev_add_tx_napi' follows non-static declaration 225 | static int prueth_ndev_add_tx_napi(struct prueth_emac *emac) | ^~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/ti/icssg/icssg_prueth.h:456:5: note: previous declaration of 'prueth_ndev_add_tx_napi' with type 'int(struct prueth_emac *)' 456 | int prueth_ndev_add_tx_napi(struct prueth_emac *emac); | ^~~~~~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:251:12: error: static declaration of 'prueth_init_tx_chns' follows non-static declaration 251 | static int prueth_init_tx_chns(struct prueth_emac *emac) | ^~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/ti/icssg/icssg_prueth.h:457:5: note: previous declaration of 'prueth_init_tx_chns' with type 'int(struct prueth_emac *)' 457 | int prueth_init_tx_chns(struct prueth_emac *emac); | ^~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:331:12: error: static declaration of 'prueth_init_rx_chns' follows non-static declaration 331 | static int prueth_init_rx_chns(struct prueth_emac *emac, | ^~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/ti/icssg/icssg_prueth.h:458:5: note: previous declaration of 'prueth_init_rx_chns' with type 'int(struct prueth_emac *, struct prueth_rx_chn *, char *, u32, u32)' {aka 'int(struct prueth_emac *, struct prueth_rx_chn *, char *, unsigned int, unsigned int)'} 458 | int prueth_init_rx_chns(struct prueth_emac *emac, | ^~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:472:12: error: static declaration of 'icssg_ts_to_ns' follows non-static declaration 472 | static u64 icssg_ts_to_ns(u32 hi_sw, u32 hi, u32 lo, u32 cycle_time_ns) | ^~~~~~~~~~~~~~ drivers/net/ethernet/ti/icssg/icssg_prueth.h:493:5: note: previous declaration of 'icssg_ts_to_ns' with type 'u64(u32, u32, u32, u32)' {aka 'long long unsigned int(unsigned int, unsigned int, unsigned int, unsigned int)'} 493 | u64 icssg_ts_to_ns(u32 hi_sw, u32 hi, u32 lo, u32 cycle_time_ns); | ^~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:487:13: error: static declaration of 'emac_rx_timestamp' follows non-static declaration 487 | static void emac_rx_timestamp(struct prueth_emac *emac, | ^~~~~~~~~~~~~~~~~ drivers/net/ethernet/ti/icssg/icssg_prueth.h:466:6: note: previous declaration of 'emac_rx_timestamp' with type 'void(struct prueth_emac *, struct sk_buff *, u32 *)' {aka 'void(struct prueth_emac *, struct sk_buff *, unsigned int *)'} 466 | void emac_rx_timestamp(struct prueth_emac *emac, | ^~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:573:13: warning: 'prueth_rx_cleanup' defined but not used [-Wunused-function] 573 | static void prueth_rx_cleanup(void *data, dma_addr_t desc_dma) | ^~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/ti/icssg/icssg_prueth.c:503:12: warning: 'emac_rx_packet' defined but not used [-Wunused-function] 503 | static int emac_rx_packet(struct prueth_emac *emac, u32 flow_id) | ^~~~~~~~~~~~~~ vim +/prueth_cleanup_rx_chns +55 drivers/net/ethernet/ti/icssg/icssg_prueth.c f758f47f8a1fbf Dan Carpenter 2024-04-23 54 f758f47f8a1fbf Dan Carpenter 2024-04-23 @55 static void prueth_cleanup_rx_chns(struct prueth_emac *emac, f758f47f8a1fbf Dan Carpenter 2024-04-23 56 struct prueth_rx_chn *rx_chn, f758f47f8a1fbf Dan Carpenter 2024-04-23 57 int max_rflows) f758f47f8a1fbf Dan Carpenter 2024-04-23 58 { f758f47f8a1fbf Dan Carpenter 2024-04-23 59 if (rx_chn->desc_pool) f758f47f8a1fbf Dan Carpenter 2024-04-23 60 k3_cppi_desc_pool_destroy(rx_chn->desc_pool); f758f47f8a1fbf Dan Carpenter 2024-04-23 61 f758f47f8a1fbf Dan Carpenter 2024-04-23 62 if (rx_chn->rx_chn) f758f47f8a1fbf Dan Carpenter 2024-04-23 63 k3_udma_glue_release_rx_chn(rx_chn->rx_chn); f758f47f8a1fbf Dan Carpenter 2024-04-23 64 } f758f47f8a1fbf Dan Carpenter 2024-04-23 65 f758f47f8a1fbf Dan Carpenter 2024-04-23 @66 static void prueth_cleanup_tx_chns(struct prueth_emac *emac) f758f47f8a1fbf Dan Carpenter 2024-04-23 67 { f758f47f8a1fbf Dan Carpenter 2024-04-23 68 int i; f758f47f8a1fbf Dan Carpenter 2024-04-23 69 f758f47f8a1fbf Dan Carpenter 2024-04-23 70 for (i = 0; i < emac->tx_ch_num; i++) { f758f47f8a1fbf Dan Carpenter 2024-04-23 71 struct prueth_tx_chn *tx_chn = &emac->tx_chns[i]; f758f47f8a1fbf Dan Carpenter 2024-04-23 72 f758f47f8a1fbf Dan Carpenter 2024-04-23 73 if (tx_chn->desc_pool) f758f47f8a1fbf Dan Carpenter 2024-04-23 74 k3_cppi_desc_pool_destroy(tx_chn->desc_pool); f758f47f8a1fbf Dan Carpenter 2024-04-23 75 f758f47f8a1fbf Dan Carpenter 2024-04-23 76 if (tx_chn->tx_chn) f758f47f8a1fbf Dan Carpenter 2024-04-23 77 k3_udma_glue_release_tx_chn(tx_chn->tx_chn); f758f47f8a1fbf Dan Carpenter 2024-04-23 78 f758f47f8a1fbf Dan Carpenter 2024-04-23 79 /* Assume prueth_cleanup_tx_chns() is called at the f758f47f8a1fbf Dan Carpenter 2024-04-23 80 * end after all channel resources are freed f758f47f8a1fbf Dan Carpenter 2024-04-23 81 */ f758f47f8a1fbf Dan Carpenter 2024-04-23 82 memset(tx_chn, 0, sizeof(*tx_chn)); f758f47f8a1fbf Dan Carpenter 2024-04-23 83 } f758f47f8a1fbf Dan Carpenter 2024-04-23 84 } f758f47f8a1fbf Dan Carpenter 2024-04-23 85 f758f47f8a1fbf Dan Carpenter 2024-04-23 @86 static void prueth_ndev_del_tx_napi(struct prueth_emac *emac, int num) f758f47f8a1fbf Dan Carpenter 2024-04-23 87 { f758f47f8a1fbf Dan Carpenter 2024-04-23 88 int i; f758f47f8a1fbf Dan Carpenter 2024-04-23 89 f758f47f8a1fbf Dan Carpenter 2024-04-23 90 for (i = 0; i < num; i++) { f758f47f8a1fbf Dan Carpenter 2024-04-23 91 struct prueth_tx_chn *tx_chn = &emac->tx_chns[i]; f758f47f8a1fbf Dan Carpenter 2024-04-23 92 f758f47f8a1fbf Dan Carpenter 2024-04-23 93 if (tx_chn->irq) f758f47f8a1fbf Dan Carpenter 2024-04-23 94 free_irq(tx_chn->irq, tx_chn); f758f47f8a1fbf Dan Carpenter 2024-04-23 95 netif_napi_del(&tx_chn->napi_tx); f758f47f8a1fbf Dan Carpenter 2024-04-23 96 } f758f47f8a1fbf Dan Carpenter 2024-04-23 97 } f758f47f8a1fbf Dan Carpenter 2024-04-23 98 f758f47f8a1fbf Dan Carpenter 2024-04-23 @99 static void prueth_xmit_free(struct prueth_tx_chn *tx_chn, f758f47f8a1fbf Dan Carpenter 2024-04-23 100 struct cppi5_host_desc_t *desc) f758f47f8a1fbf Dan Carpenter 2024-04-23 101 { f758f47f8a1fbf Dan Carpenter 2024-04-23 102 struct cppi5_host_desc_t *first_desc, *next_desc; f758f47f8a1fbf Dan Carpenter 2024-04-23 103 dma_addr_t buf_dma, next_desc_dma; f758f47f8a1fbf Dan Carpenter 2024-04-23 104 u32 buf_dma_len; f758f47f8a1fbf Dan Carpenter 2024-04-23 105 f758f47f8a1fbf Dan Carpenter 2024-04-23 106 first_desc = desc; f758f47f8a1fbf Dan Carpenter 2024-04-23 107 next_desc = first_desc; f758f47f8a1fbf Dan Carpenter 2024-04-23 108 f758f47f8a1fbf Dan Carpenter 2024-04-23 109 cppi5_hdesc_get_obuf(first_desc, &buf_dma, &buf_dma_len); f758f47f8a1fbf Dan Carpenter 2024-04-23 110 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &buf_dma); f758f47f8a1fbf Dan Carpenter 2024-04-23 111 f758f47f8a1fbf Dan Carpenter 2024-04-23 112 dma_unmap_single(tx_chn->dma_dev, buf_dma, buf_dma_len, f758f47f8a1fbf Dan Carpenter 2024-04-23 113 DMA_TO_DEVICE); f758f47f8a1fbf Dan Carpenter 2024-04-23 114 f758f47f8a1fbf Dan Carpenter 2024-04-23 115 next_desc_dma = cppi5_hdesc_get_next_hbdesc(first_desc); f758f47f8a1fbf Dan Carpenter 2024-04-23 116 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &next_desc_dma); f758f47f8a1fbf Dan Carpenter 2024-04-23 117 while (next_desc_dma) { f758f47f8a1fbf Dan Carpenter 2024-04-23 118 next_desc = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, f758f47f8a1fbf Dan Carpenter 2024-04-23 119 next_desc_dma); f758f47f8a1fbf Dan Carpenter 2024-04-23 120 cppi5_hdesc_get_obuf(next_desc, &buf_dma, &buf_dma_len); f758f47f8a1fbf Dan Carpenter 2024-04-23 121 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &buf_dma); f758f47f8a1fbf Dan Carpenter 2024-04-23 122 f758f47f8a1fbf Dan Carpenter 2024-04-23 123 dma_unmap_page(tx_chn->dma_dev, buf_dma, buf_dma_len, f758f47f8a1fbf Dan Carpenter 2024-04-23 124 DMA_TO_DEVICE); f758f47f8a1fbf Dan Carpenter 2024-04-23 125 f758f47f8a1fbf Dan Carpenter 2024-04-23 126 next_desc_dma = cppi5_hdesc_get_next_hbdesc(next_desc); f758f47f8a1fbf Dan Carpenter 2024-04-23 127 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &next_desc_dma); f758f47f8a1fbf Dan Carpenter 2024-04-23 128 f758f47f8a1fbf Dan Carpenter 2024-04-23 129 k3_cppi_desc_pool_free(tx_chn->desc_pool, next_desc); f758f47f8a1fbf Dan Carpenter 2024-04-23 130 } f758f47f8a1fbf Dan Carpenter 2024-04-23 131 f758f47f8a1fbf Dan Carpenter 2024-04-23 132 k3_cppi_desc_pool_free(tx_chn->desc_pool, first_desc); f758f47f8a1fbf Dan Carpenter 2024-04-23 133 } f758f47f8a1fbf Dan Carpenter 2024-04-23 134 f758f47f8a1fbf Dan Carpenter 2024-04-23 @135 static int emac_tx_complete_packets(struct prueth_emac *emac, int chn, f758f47f8a1fbf Dan Carpenter 2024-04-23 136 int budget) f758f47f8a1fbf Dan Carpenter 2024-04-23 137 { f758f47f8a1fbf Dan Carpenter 2024-04-23 138 struct net_device *ndev = emac->ndev; f758f47f8a1fbf Dan Carpenter 2024-04-23 139 struct cppi5_host_desc_t *desc_tx; f758f47f8a1fbf Dan Carpenter 2024-04-23 140 struct netdev_queue *netif_txq; f758f47f8a1fbf Dan Carpenter 2024-04-23 141 struct prueth_tx_chn *tx_chn; f758f47f8a1fbf Dan Carpenter 2024-04-23 142 unsigned int total_bytes = 0; f758f47f8a1fbf Dan Carpenter 2024-04-23 143 struct sk_buff *skb; f758f47f8a1fbf Dan Carpenter 2024-04-23 144 dma_addr_t desc_dma; f758f47f8a1fbf Dan Carpenter 2024-04-23 145 int res, num_tx = 0; f758f47f8a1fbf Dan Carpenter 2024-04-23 146 void **swdata; f758f47f8a1fbf Dan Carpenter 2024-04-23 147 f758f47f8a1fbf Dan Carpenter 2024-04-23 148 tx_chn = &emac->tx_chns[chn]; f758f47f8a1fbf Dan Carpenter 2024-04-23 149 f758f47f8a1fbf Dan Carpenter 2024-04-23 150 while (true) { f758f47f8a1fbf Dan Carpenter 2024-04-23 151 res = k3_udma_glue_pop_tx_chn(tx_chn->tx_chn, &desc_dma); f758f47f8a1fbf Dan Carpenter 2024-04-23 152 if (res == -ENODATA) f758f47f8a1fbf Dan Carpenter 2024-04-23 153 break; f758f47f8a1fbf Dan Carpenter 2024-04-23 154 f758f47f8a1fbf Dan Carpenter 2024-04-23 155 /* teardown completion */ f758f47f8a1fbf Dan Carpenter 2024-04-23 156 if (cppi5_desc_is_tdcm(desc_dma)) { f758f47f8a1fbf Dan Carpenter 2024-04-23 157 if (atomic_dec_and_test(&emac->tdown_cnt)) f758f47f8a1fbf Dan Carpenter 2024-04-23 158 complete(&emac->tdown_complete); f758f47f8a1fbf Dan Carpenter 2024-04-23 159 break; f758f47f8a1fbf Dan Carpenter 2024-04-23 160 } f758f47f8a1fbf Dan Carpenter 2024-04-23 161 f758f47f8a1fbf Dan Carpenter 2024-04-23 162 desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, f758f47f8a1fbf Dan Carpenter 2024-04-23 163 desc_dma); f758f47f8a1fbf Dan Carpenter 2024-04-23 164 swdata = cppi5_hdesc_get_swdata(desc_tx); f758f47f8a1fbf Dan Carpenter 2024-04-23 165 f758f47f8a1fbf Dan Carpenter 2024-04-23 166 skb = *(swdata); f758f47f8a1fbf Dan Carpenter 2024-04-23 167 prueth_xmit_free(tx_chn, desc_tx); f758f47f8a1fbf Dan Carpenter 2024-04-23 168 f758f47f8a1fbf Dan Carpenter 2024-04-23 169 ndev = skb->dev; f758f47f8a1fbf Dan Carpenter 2024-04-23 170 ndev->stats.tx_packets++; f758f47f8a1fbf Dan Carpenter 2024-04-23 171 ndev->stats.tx_bytes += skb->len; f758f47f8a1fbf Dan Carpenter 2024-04-23 172 total_bytes += skb->len; f758f47f8a1fbf Dan Carpenter 2024-04-23 173 napi_consume_skb(skb, budget); f758f47f8a1fbf Dan Carpenter 2024-04-23 174 num_tx++; f758f47f8a1fbf Dan Carpenter 2024-04-23 175 } f758f47f8a1fbf Dan Carpenter 2024-04-23 176 f758f47f8a1fbf Dan Carpenter 2024-04-23 177 if (!num_tx) f758f47f8a1fbf Dan Carpenter 2024-04-23 178 return 0; f758f47f8a1fbf Dan Carpenter 2024-04-23 179 f758f47f8a1fbf Dan Carpenter 2024-04-23 180 netif_txq = netdev_get_tx_queue(ndev, chn); f758f47f8a1fbf Dan Carpenter 2024-04-23 181 netdev_tx_completed_queue(netif_txq, num_tx, total_bytes); f758f47f8a1fbf Dan Carpenter 2024-04-23 182 f758f47f8a1fbf Dan Carpenter 2024-04-23 183 if (netif_tx_queue_stopped(netif_txq)) { f758f47f8a1fbf Dan Carpenter 2024-04-23 184 /* If the TX queue was stopped, wake it now f758f47f8a1fbf Dan Carpenter 2024-04-23 185 * if we have enough room. f758f47f8a1fbf Dan Carpenter 2024-04-23 186 */ f758f47f8a1fbf Dan Carpenter 2024-04-23 187 __netif_tx_lock(netif_txq, smp_processor_id()); f758f47f8a1fbf Dan Carpenter 2024-04-23 188 if (netif_running(ndev) && f758f47f8a1fbf Dan Carpenter 2024-04-23 189 (k3_cppi_desc_pool_avail(tx_chn->desc_pool) >= f758f47f8a1fbf Dan Carpenter 2024-04-23 190 MAX_SKB_FRAGS)) f758f47f8a1fbf Dan Carpenter 2024-04-23 191 netif_tx_wake_queue(netif_txq); f758f47f8a1fbf Dan Carpenter 2024-04-23 192 __netif_tx_unlock(netif_txq); f758f47f8a1fbf Dan Carpenter 2024-04-23 193 } f758f47f8a1fbf Dan Carpenter 2024-04-23 194 f758f47f8a1fbf Dan Carpenter 2024-04-23 195 return num_tx; f758f47f8a1fbf Dan Carpenter 2024-04-23 196 } f758f47f8a1fbf Dan Carpenter 2024-04-23 197 f758f47f8a1fbf Dan Carpenter 2024-04-23 198 static int emac_napi_tx_poll(struct napi_struct *napi_tx, int budget) f758f47f8a1fbf Dan Carpenter 2024-04-23 199 { f758f47f8a1fbf Dan Carpenter 2024-04-23 200 struct prueth_tx_chn *tx_chn = prueth_napi_to_tx_chn(napi_tx); f758f47f8a1fbf Dan Carpenter 2024-04-23 201 struct prueth_emac *emac = tx_chn->emac; f758f47f8a1fbf Dan Carpenter 2024-04-23 202 int num_tx_packets; f758f47f8a1fbf Dan Carpenter 2024-04-23 203 f758f47f8a1fbf Dan Carpenter 2024-04-23 204 num_tx_packets = emac_tx_complete_packets(emac, tx_chn->id, budget); f758f47f8a1fbf Dan Carpenter 2024-04-23 205 f758f47f8a1fbf Dan Carpenter 2024-04-23 206 if (num_tx_packets >= budget) f758f47f8a1fbf Dan Carpenter 2024-04-23 207 return budget; f758f47f8a1fbf Dan Carpenter 2024-04-23 208 f758f47f8a1fbf Dan Carpenter 2024-04-23 209 if (napi_complete_done(napi_tx, num_tx_packets)) f758f47f8a1fbf Dan Carpenter 2024-04-23 210 enable_irq(tx_chn->irq); f758f47f8a1fbf Dan Carpenter 2024-04-23 211 f758f47f8a1fbf Dan Carpenter 2024-04-23 212 return num_tx_packets; f758f47f8a1fbf Dan Carpenter 2024-04-23 213 } f758f47f8a1fbf Dan Carpenter 2024-04-23 214 f758f47f8a1fbf Dan Carpenter 2024-04-23 215 static irqreturn_t prueth_tx_irq(int irq, void *dev_id) f758f47f8a1fbf Dan Carpenter 2024-04-23 216 { f758f47f8a1fbf Dan Carpenter 2024-04-23 217 struct prueth_tx_chn *tx_chn = dev_id; f758f47f8a1fbf Dan Carpenter 2024-04-23 218 f758f47f8a1fbf Dan Carpenter 2024-04-23 219 disable_irq_nosync(irq); f758f47f8a1fbf Dan Carpenter 2024-04-23 220 napi_schedule(&tx_chn->napi_tx); f758f47f8a1fbf Dan Carpenter 2024-04-23 221 f758f47f8a1fbf Dan Carpenter 2024-04-23 222 return IRQ_HANDLED; f758f47f8a1fbf Dan Carpenter 2024-04-23 223 } f758f47f8a1fbf Dan Carpenter 2024-04-23 224 f758f47f8a1fbf Dan Carpenter 2024-04-23 @225 static int prueth_ndev_add_tx_napi(struct prueth_emac *emac) f758f47f8a1fbf Dan Carpenter 2024-04-23 226 { f758f47f8a1fbf Dan Carpenter 2024-04-23 227 struct prueth *prueth = emac->prueth; f758f47f8a1fbf Dan Carpenter 2024-04-23 228 int i, ret; f758f47f8a1fbf Dan Carpenter 2024-04-23 229 f758f47f8a1fbf Dan Carpenter 2024-04-23 230 for (i = 0; i < emac->tx_ch_num; i++) { f758f47f8a1fbf Dan Carpenter 2024-04-23 231 struct prueth_tx_chn *tx_chn = &emac->tx_chns[i]; f758f47f8a1fbf Dan Carpenter 2024-04-23 232 f758f47f8a1fbf Dan Carpenter 2024-04-23 233 netif_napi_add_tx(emac->ndev, &tx_chn->napi_tx, emac_napi_tx_poll); f758f47f8a1fbf Dan Carpenter 2024-04-23 234 ret = request_irq(tx_chn->irq, prueth_tx_irq, f758f47f8a1fbf Dan Carpenter 2024-04-23 235 IRQF_TRIGGER_HIGH, tx_chn->name, f758f47f8a1fbf Dan Carpenter 2024-04-23 236 tx_chn); f758f47f8a1fbf Dan Carpenter 2024-04-23 237 if (ret) { f758f47f8a1fbf Dan Carpenter 2024-04-23 238 netif_napi_del(&tx_chn->napi_tx); f758f47f8a1fbf Dan Carpenter 2024-04-23 239 dev_err(prueth->dev, "unable to request TX IRQ %d\n", f758f47f8a1fbf Dan Carpenter 2024-04-23 240 tx_chn->irq); f758f47f8a1fbf Dan Carpenter 2024-04-23 241 goto fail; f758f47f8a1fbf Dan Carpenter 2024-04-23 242 } f758f47f8a1fbf Dan Carpenter 2024-04-23 243 } f758f47f8a1fbf Dan Carpenter 2024-04-23 244 f758f47f8a1fbf Dan Carpenter 2024-04-23 245 return 0; f758f47f8a1fbf Dan Carpenter 2024-04-23 246 fail: f758f47f8a1fbf Dan Carpenter 2024-04-23 247 prueth_ndev_del_tx_napi(emac, i); f758f47f8a1fbf Dan Carpenter 2024-04-23 248 return ret; f758f47f8a1fbf Dan Carpenter 2024-04-23 249 } f758f47f8a1fbf Dan Carpenter 2024-04-23 250 f758f47f8a1fbf Dan Carpenter 2024-04-23 @251 static int prueth_init_tx_chns(struct prueth_emac *emac) f758f47f8a1fbf Dan Carpenter 2024-04-23 252 { f758f47f8a1fbf Dan Carpenter 2024-04-23 253 static const struct k3_ring_cfg ring_cfg = { f758f47f8a1fbf Dan Carpenter 2024-04-23 254 .elm_size = K3_RINGACC_RING_ELSIZE_8, f758f47f8a1fbf Dan Carpenter 2024-04-23 255 .mode = K3_RINGACC_RING_MODE_RING, f758f47f8a1fbf Dan Carpenter 2024-04-23 256 .flags = 0, f758f47f8a1fbf Dan Carpenter 2024-04-23 257 .size = PRUETH_MAX_TX_DESC, f758f47f8a1fbf Dan Carpenter 2024-04-23 258 }; f758f47f8a1fbf Dan Carpenter 2024-04-23 259 struct k3_udma_glue_tx_channel_cfg tx_cfg; f758f47f8a1fbf Dan Carpenter 2024-04-23 260 struct device *dev = emac->prueth->dev; f758f47f8a1fbf Dan Carpenter 2024-04-23 261 struct net_device *ndev = emac->ndev; f758f47f8a1fbf Dan Carpenter 2024-04-23 262 int ret, slice, i; f758f47f8a1fbf Dan Carpenter 2024-04-23 263 u32 hdesc_size; f758f47f8a1fbf Dan Carpenter 2024-04-23 264 f758f47f8a1fbf Dan Carpenter 2024-04-23 265 slice = prueth_emac_slice(emac); f758f47f8a1fbf Dan Carpenter 2024-04-23 266 if (slice < 0) f758f47f8a1fbf Dan Carpenter 2024-04-23 267 return slice; f758f47f8a1fbf Dan Carpenter 2024-04-23 268 f758f47f8a1fbf Dan Carpenter 2024-04-23 269 init_completion(&emac->tdown_complete); f758f47f8a1fbf Dan Carpenter 2024-04-23 270 f758f47f8a1fbf Dan Carpenter 2024-04-23 271 hdesc_size = cppi5_hdesc_calc_size(true, PRUETH_NAV_PS_DATA_SIZE, f758f47f8a1fbf Dan Carpenter 2024-04-23 272 PRUETH_NAV_SW_DATA_SIZE); f758f47f8a1fbf Dan Carpenter 2024-04-23 273 memset(&tx_cfg, 0, sizeof(tx_cfg)); f758f47f8a1fbf Dan Carpenter 2024-04-23 274 tx_cfg.swdata_size = PRUETH_NAV_SW_DATA_SIZE; f758f47f8a1fbf Dan Carpenter 2024-04-23 275 tx_cfg.tx_cfg = ring_cfg; f758f47f8a1fbf Dan Carpenter 2024-04-23 276 tx_cfg.txcq_cfg = ring_cfg; f758f47f8a1fbf Dan Carpenter 2024-04-23 277 f758f47f8a1fbf Dan Carpenter 2024-04-23 278 for (i = 0; i < emac->tx_ch_num; i++) { f758f47f8a1fbf Dan Carpenter 2024-04-23 279 struct prueth_tx_chn *tx_chn = &emac->tx_chns[i]; f758f47f8a1fbf Dan Carpenter 2024-04-23 280 f758f47f8a1fbf Dan Carpenter 2024-04-23 281 /* To differentiate channels for SLICE0 vs SLICE1 */ f758f47f8a1fbf Dan Carpenter 2024-04-23 282 snprintf(tx_chn->name, sizeof(tx_chn->name), f758f47f8a1fbf Dan Carpenter 2024-04-23 283 "tx%d-%d", slice, i); f758f47f8a1fbf Dan Carpenter 2024-04-23 284 f758f47f8a1fbf Dan Carpenter 2024-04-23 285 tx_chn->emac = emac; f758f47f8a1fbf Dan Carpenter 2024-04-23 286 tx_chn->id = i; f758f47f8a1fbf Dan Carpenter 2024-04-23 287 tx_chn->descs_num = PRUETH_MAX_TX_DESC; f758f47f8a1fbf Dan Carpenter 2024-04-23 288 f758f47f8a1fbf Dan Carpenter 2024-04-23 289 tx_chn->tx_chn = f758f47f8a1fbf Dan Carpenter 2024-04-23 290 k3_udma_glue_request_tx_chn(dev, tx_chn->name, f758f47f8a1fbf Dan Carpenter 2024-04-23 291 &tx_cfg); f758f47f8a1fbf Dan Carpenter 2024-04-23 292 if (IS_ERR(tx_chn->tx_chn)) { f758f47f8a1fbf Dan Carpenter 2024-04-23 293 ret = PTR_ERR(tx_chn->tx_chn); f758f47f8a1fbf Dan Carpenter 2024-04-23 294 tx_chn->tx_chn = NULL; f758f47f8a1fbf Dan Carpenter 2024-04-23 295 netdev_err(ndev, f758f47f8a1fbf Dan Carpenter 2024-04-23 296 "Failed to request tx dma ch: %d\n", ret); f758f47f8a1fbf Dan Carpenter 2024-04-23 297 goto fail; f758f47f8a1fbf Dan Carpenter 2024-04-23 298 } f758f47f8a1fbf Dan Carpenter 2024-04-23 299 f758f47f8a1fbf Dan Carpenter 2024-04-23 300 tx_chn->dma_dev = k3_udma_glue_tx_get_dma_device(tx_chn->tx_chn); f758f47f8a1fbf Dan Carpenter 2024-04-23 301 tx_chn->desc_pool = f758f47f8a1fbf Dan Carpenter 2024-04-23 302 k3_cppi_desc_pool_create_name(tx_chn->dma_dev, f758f47f8a1fbf Dan Carpenter 2024-04-23 303 tx_chn->descs_num, f758f47f8a1fbf Dan Carpenter 2024-04-23 304 hdesc_size, f758f47f8a1fbf Dan Carpenter 2024-04-23 305 tx_chn->name); f758f47f8a1fbf Dan Carpenter 2024-04-23 306 if (IS_ERR(tx_chn->desc_pool)) { f758f47f8a1fbf Dan Carpenter 2024-04-23 307 ret = PTR_ERR(tx_chn->desc_pool); f758f47f8a1fbf Dan Carpenter 2024-04-23 308 tx_chn->desc_pool = NULL; f758f47f8a1fbf Dan Carpenter 2024-04-23 309 netdev_err(ndev, "Failed to create tx pool: %d\n", ret); f758f47f8a1fbf Dan Carpenter 2024-04-23 310 goto fail; f758f47f8a1fbf Dan Carpenter 2024-04-23 311 } f758f47f8a1fbf Dan Carpenter 2024-04-23 312 f758f47f8a1fbf Dan Carpenter 2024-04-23 313 ret = k3_udma_glue_tx_get_irq(tx_chn->tx_chn); f758f47f8a1fbf Dan Carpenter 2024-04-23 314 if (ret < 0) { f758f47f8a1fbf Dan Carpenter 2024-04-23 315 netdev_err(ndev, "failed to get tx irq\n"); f758f47f8a1fbf Dan Carpenter 2024-04-23 316 goto fail; f758f47f8a1fbf Dan Carpenter 2024-04-23 317 } f758f47f8a1fbf Dan Carpenter 2024-04-23 318 tx_chn->irq = ret; f758f47f8a1fbf Dan Carpenter 2024-04-23 319 f758f47f8a1fbf Dan Carpenter 2024-04-23 320 snprintf(tx_chn->name, sizeof(tx_chn->name), "%s-tx%d", f758f47f8a1fbf Dan Carpenter 2024-04-23 321 dev_name(dev), tx_chn->id); f758f47f8a1fbf Dan Carpenter 2024-04-23 322 } f758f47f8a1fbf Dan Carpenter 2024-04-23 323 f758f47f8a1fbf Dan Carpenter 2024-04-23 324 return 0; f758f47f8a1fbf Dan Carpenter 2024-04-23 325 f758f47f8a1fbf Dan Carpenter 2024-04-23 326 fail: f758f47f8a1fbf Dan Carpenter 2024-04-23 327 prueth_cleanup_tx_chns(emac); f758f47f8a1fbf Dan Carpenter 2024-04-23 328 return ret; f758f47f8a1fbf Dan Carpenter 2024-04-23 329 } f758f47f8a1fbf Dan Carpenter 2024-04-23 330 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki