[xilinx-xlnx:xlnx_rebase_v5.15_LTS 1089/1091] drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c:479:43: warning: cast to pointer from integer of different size
kernel test robot
lkp at intel.com
Thu Apr 7 17:20:06 PDT 2022
tree: https://github.com/Xilinx/linux-xlnx xlnx_rebase_v5.15_LTS
head: 031eb9ce665429a9574c95f89bcc488fd0ba0ec1
commit: 8c6910de988070200e93c242ced7187754c4020d [1089/1091] net: xilinx: Move Xilinx TSN to staging
config: arc-allyesconfig (https://download.01.org/0day-ci/archive/20220408/202204080825.xp9Sa2Hw-lkp@intel.com/config)
compiler: arceb-elf-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/Xilinx/linux-xlnx/commit/8c6910de988070200e93c242ced7187754c4020d
git remote add xilinx-xlnx https://github.com/Xilinx/linux-xlnx
git fetch --no-tags xilinx-xlnx xlnx_rebase_v5.15_LTS
git checkout 8c6910de988070200e93c242ced7187754c4020d
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arc SHELL=/bin/bash drivers/staging/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp at intel.com>
All warnings (new ones prefixed by >>):
In file included from drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c:49:
drivers/staging/xilinx-tsn/xilinx_axienet_tsn.h: In function 'axienet_dma_bdout':
drivers/staging/xilinx-tsn/xilinx_axienet_tsn.h:1185:9: error: implicit declaration of function 'writeq'; did you mean 'writeb'? [-Werror=implicit-function-declaration]
1185 | writeq(value, (q->dma_regs + reg));
| ^~~~~~
| writeb
drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c: In function 'axienet_start_xmit_done_tsn':
>> drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c:479:43: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
479 | dev_kfree_skb_irq((struct sk_buff *)cur_p->tx_skb);
| ^
drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c: In function 'axienet_queue_xmit_tsn':
>> drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c:602:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
602 | (((phys_addr_t)skb->data & 0x3) || num_frag > 0)) {
| ^
drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c:641:25: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
641 | cur_p->tx_skb = (phys_addr_t)skb;
| ^
drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c:642:25: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
642 | cur_p->tx_skb = (phys_addr_t)skb;
| ^
drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c: In function 'axienet_recv':
drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c:702:23: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
702 | skb = (struct sk_buff *)(cur_p->sw_id_offset);
| ^
drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c:787:39: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
787 | cur_p->sw_id_offset = (phys_addr_t)new_skb;
| ^
cc1: some warnings being treated as errors
--
In file included from drivers/staging/xilinx-tsn/xilinx_axienet_mcdma_tsn.c:23:
drivers/staging/xilinx-tsn/xilinx_axienet_tsn.h: In function 'axienet_dma_bdout':
drivers/staging/xilinx-tsn/xilinx_axienet_tsn.h:1185:9: error: implicit declaration of function 'writeq'; did you mean 'writeb'? [-Werror=implicit-function-declaration]
1185 | writeq(value, (q->dma_regs + reg));
| ^~~~~~
| writeb
In file included from include/linux/netlink.h:7,
from include/linux/ethtool.h:18,
from include/linux/phy.h:16,
from include/linux/of_mdio.h:12,
from drivers/staging/xilinx-tsn/xilinx_axienet_mcdma_tsn.c:17:
drivers/staging/xilinx-tsn/xilinx_axienet_mcdma_tsn.c: In function 'axienet_mcdma_rx_bd_free_tsn':
>> drivers/staging/xilinx-tsn/xilinx_axienet_mcdma_tsn.c:160:31: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
160 | dev_kfree_skb((struct sk_buff *)
| ^
include/linux/skbuff.h:1214:45: note: in definition of macro 'dev_kfree_skb'
1214 | #define dev_kfree_skb(a) consume_skb(a)
| ^
drivers/staging/xilinx-tsn/xilinx_axienet_mcdma_tsn.c: In function 'axienet_mcdma_rx_q_init_tsn':
>> drivers/staging/xilinx-tsn/xilinx_axienet_mcdma_tsn.c:294:47: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
294 | q->rxq_bd_v[i].sw_id_offset = (phys_addr_t)skb;
| ^
drivers/staging/xilinx-tsn/xilinx_axienet_mcdma_tsn.c: In function 'axienet_mcdma_err_handler_tsn':
drivers/staging/xilinx-tsn/xilinx_axienet_mcdma_tsn.c:686:43: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
686 | dev_kfree_skb_irq((struct sk_buff *)cur_p->tx_skb);
| ^
cc1: some warnings being treated as errors
--
In file included from drivers/staging/xilinx-tsn/xilinx_tsn_tadma.c:24:
drivers/staging/xilinx-tsn/xilinx_axienet_tsn.h: In function 'axienet_dma_bdout':
drivers/staging/xilinx-tsn/xilinx_axienet_tsn.h:1185:9: error: implicit declaration of function 'writeq'; did you mean 'writeb'? [-Werror=implicit-function-declaration]
1185 | writeq(value, (q->dma_regs + reg));
| ^~~~~~
| writeb
drivers/staging/xilinx-tsn/xilinx_tsn_tadma.c: In function 'tadma_xmit_done':
>> drivers/staging/xilinx-tsn/xilinx_tsn_tadma.c:136:43: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
136 | dev_kfree_skb_irq((struct sk_buff *)
| ^
drivers/staging/xilinx-tsn/xilinx_tsn_tadma.c: In function 'axienet_tadma_xmit':
>> drivers/staging/xilinx-tsn/xilinx_tsn_tadma.c:517:62: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
517 | lp->tx_bd[sid][lp->tx_bd_head[sid]].tx_skb = (phys_addr_t)skb;
| ^
drivers/staging/xilinx-tsn/xilinx_tsn_tadma.c:550:57: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
550 | (phys_addr_t)skb;
| ^
cc1: some warnings being treated as errors
vim +479 drivers/staging/xilinx-tsn/xilinx_axienet_main_tsn.c
443
444 /**
445 * axienet_start_xmit_done_tsn - Invoked once a transmit is completed by the
446 * Axi DMA Tx channel.
447 * @ndev: Pointer to the net_device structure
448 * @q: Pointer to DMA queue structure
449 *
450 * This function is invoked from the Axi DMA Tx isr to notify the completion
451 * of transmit operation. It clears fields in the corresponding Tx BDs and
452 * unmaps the corresponding buffer so that CPU can regain ownership of the
453 * buffer. It finally invokes "netif_wake_queue" to restart transmission if
454 * required.
455 */
456 void axienet_start_xmit_done_tsn(struct net_device *ndev,
457 struct axienet_dma_q *q)
458 {
459 u32 size = 0;
460 u32 packets = 0;
461 struct axienet_local *lp = netdev_priv(ndev);
462 struct aximcdma_bd *cur_p;
463 unsigned int status = 0;
464
465 cur_p = &q->txq_bd_v[q->tx_bd_ci];
466 status = cur_p->sband_stats;
467 while (status & XAXIDMA_BD_STS_COMPLETE_MASK) {
468 if (cur_p->tx_desc_mapping == DESC_DMA_MAP_PAGE)
469 dma_unmap_page(ndev->dev.parent, cur_p->phys,
470 cur_p->cntrl &
471 XAXIDMA_BD_CTRL_LENGTH_MASK,
472 DMA_TO_DEVICE);
473 else
474 dma_unmap_single(ndev->dev.parent, cur_p->phys,
475 cur_p->cntrl &
476 XAXIDMA_BD_CTRL_LENGTH_MASK,
477 DMA_TO_DEVICE);
478 if (cur_p->tx_skb)
> 479 dev_kfree_skb_irq((struct sk_buff *)cur_p->tx_skb);
480 /*cur_p->phys = 0;*/
481 cur_p->app0 = 0;
482 cur_p->app1 = 0;
483 cur_p->app2 = 0;
484 cur_p->app4 = 0;
485 cur_p->status = 0;
486 cur_p->tx_skb = 0;
487 cur_p->sband_stats = 0;
488
489 size += status & XAXIDMA_BD_STS_ACTUAL_LEN_MASK;
490 packets++;
491
492 if (++q->tx_bd_ci >= lp->tx_bd_num)
493 q->tx_bd_ci = 0;
494 cur_p = &q->txq_bd_v[q->tx_bd_ci];
495 status = cur_p->sband_stats;
496 }
497
498 ndev->stats.tx_packets += packets;
499 ndev->stats.tx_bytes += size;
500 q->tx_packets += packets;
501 q->tx_bytes += size;
502
503 /* Matches barrier in axienet_start_xmit */
504 smp_mb();
505
506 /* Fixme: With the existing multiqueue implementation
507 * in the driver it is difficult to get the exact queue info.
508 * We should wake only the particular queue
509 * instead of waking all ndev queues.
510 */
511 netif_tx_wake_all_queues(ndev);
512 }
513
514 /**
515 * axienet_check_tx_bd_space - Checks if a BD/group of BDs are currently busy
516 * @q: Pointer to DMA queue structure
517 * @num_frag: The number of BDs to check for
518 *
519 * Return: 0, on success
520 * NETDEV_TX_BUSY, if any of the descriptors are not free
521 *
522 * This function is invoked before BDs are allocated and transmission starts.
523 * This function returns 0 if a BD or group of BDs can be allocated for
524 * transmission. If the BD or any of the BDs are not free the function
525 * returns a busy status. This is invoked from axienet_start_xmit.
526 */
527 static inline int axienet_check_tx_bd_space(struct axienet_dma_q *q,
528 int num_frag)
529 {
530 struct axienet_local *lp = q->lp;
531 struct aximcdma_bd *cur_p;
532
533 if (CIRC_SPACE(q->tx_bd_tail, q->tx_bd_ci, lp->tx_bd_num) < (num_frag + 1))
534 return NETDEV_TX_BUSY;
535
536 cur_p = &q->txq_bd_v[(q->tx_bd_tail + num_frag) % lp->tx_bd_num];
537 if (cur_p->sband_stats & XMCDMA_BD_STS_ALL_MASK)
538 return NETDEV_TX_BUSY;
539 return 0;
540 }
541
542 int axienet_queue_xmit_tsn(struct sk_buff *skb,
543 struct net_device *ndev, u16 map)
544 {
545 u32 ii;
546 u32 num_frag;
547 u32 csum_start_off;
548 u32 csum_index_off;
549 dma_addr_t tail_p;
550 struct axienet_local *lp = netdev_priv(ndev);
551 struct aximcdma_bd *cur_p;
552 unsigned long flags;
553 struct axienet_dma_q *q;
554
555 num_frag = skb_shinfo(skb)->nr_frags;
556
557 q = lp->dq[map];
558
559 cur_p = &q->txq_bd_v[q->tx_bd_tail];
560 spin_lock_irqsave(&q->tx_lock, flags);
561 if (axienet_check_tx_bd_space(q, num_frag)) {
562 if (netif_queue_stopped(ndev)) {
563 spin_unlock_irqrestore(&q->tx_lock, flags);
564 return NETDEV_TX_BUSY;
565 }
566
567 netif_stop_queue(ndev);
568
569 /* Matches barrier in axienet_start_xmit_done_tsn */
570 smp_mb();
571
572 /* Space might have just been freed - check again */
573 if (axienet_check_tx_bd_space(q, num_frag)) {
574 spin_unlock_irqrestore(&q->tx_lock, flags);
575 return NETDEV_TX_BUSY;
576 }
577
578 netif_wake_queue(ndev);
579 }
580
581 if (skb->ip_summed == CHECKSUM_PARTIAL && !lp->eth_hasnobuf &&
582 lp->axienet_config->mactype == XAXIENET_1G) {
583 if (lp->features & XAE_FEATURE_FULL_TX_CSUM) {
584 /* Tx Full Checksum Offload Enabled */
585 cur_p->app0 |= 2;
586 } else if (lp->features & XAE_FEATURE_PARTIAL_RX_CSUM) {
587 csum_start_off = skb_transport_offset(skb);
588 csum_index_off = csum_start_off + skb->csum_offset;
589 /* Tx Partial Checksum Offload Enabled */
590 cur_p->app0 |= 1;
591 cur_p->app1 = (csum_start_off << 16) | csum_index_off;
592 }
593 } else if (skb->ip_summed == CHECKSUM_UNNECESSARY &&
594 !lp->eth_hasnobuf &&
595 (lp->axienet_config->mactype == XAXIENET_1G)) {
596 cur_p->app0 |= 2; /* Tx Full Checksum Offload Enabled */
597 }
598
599 cur_p->cntrl = (skb_headlen(skb) | XMCDMA_BD_CTRL_TXSOF_MASK);
600
601 if (!q->eth_hasdre &&
> 602 (((phys_addr_t)skb->data & 0x3) || num_frag > 0)) {
603 skb_copy_and_csum_dev(skb, q->tx_buf[q->tx_bd_tail]);
604
605 cur_p->phys = q->tx_bufs_dma +
606 (q->tx_buf[q->tx_bd_tail] - q->tx_bufs);
607
608 cur_p->cntrl = skb_pagelen(skb) | XMCDMA_BD_CTRL_TXSOF_MASK;
609 goto out;
610 } else {
611 cur_p->phys = dma_map_single(ndev->dev.parent, skb->data,
612 skb_headlen(skb), DMA_TO_DEVICE);
613 if (unlikely(dma_mapping_error(ndev->dev.parent, cur_p->phys))) {
614 cur_p->phys = 0;
615 spin_unlock_irqrestore(&q->tx_lock, flags);
616 dev_err(&ndev->dev, "TX buffer map failed\n");
617 return NETDEV_TX_BUSY;
618 }
619 }
620 cur_p->tx_desc_mapping = DESC_DMA_MAP_SINGLE;
621
622 for (ii = 0; ii < num_frag; ii++) {
623 u32 len;
624 skb_frag_t *frag;
625
626 if (++q->tx_bd_tail >= lp->tx_bd_num)
627 q->tx_bd_tail = 0;
628
629 cur_p = &q->txq_bd_v[q->tx_bd_tail];
630 frag = &skb_shinfo(skb)->frags[ii];
631 len = skb_frag_size(frag);
632 cur_p->phys = skb_frag_dma_map(ndev->dev.parent, frag, 0, len,
633 DMA_TO_DEVICE);
634 cur_p->cntrl = len;
635 cur_p->tx_desc_mapping = DESC_DMA_MAP_PAGE;
636 }
637
638 out:
639 cur_p->cntrl |= XMCDMA_BD_CTRL_TXEOF_MASK;
640 tail_p = q->tx_bd_p + sizeof(*q->txq_bd_v) * q->tx_bd_tail;
641 cur_p->tx_skb = (phys_addr_t)skb;
642 cur_p->tx_skb = (phys_addr_t)skb;
643
644 tail_p = q->tx_bd_p + sizeof(*q->tx_bd_v) * q->tx_bd_tail;
645 /* Ensure BD write before starting transfer */
646 wmb();
647
648 /* Start the transfer */
649 axienet_dma_bdout(q, XMCDMA_CHAN_TAILDESC_OFFSET(q->chan_id),
650 tail_p);
651 if (++q->tx_bd_tail >= lp->tx_bd_num)
652 q->tx_bd_tail = 0;
653
654 spin_unlock_irqrestore(&q->tx_lock, flags);
655
656 return NETDEV_TX_OK;
657 }
658
--
0-DAY CI Kernel Test Service
https://01.org/lkp
More information about the linux-arm-kernel
mailing list