diff --git a/quectel_MHI/src/controllers/mhi_qti.c b/quectel_MHI/src/controllers/mhi_qti.c index ce508a4..735df9e 100644 --- a/quectel_MHI/src/controllers/mhi_qti.c +++ b/quectel_MHI/src/controllers/mhi_qti.c @@ -177,11 +177,16 @@ static int mhi_init_pci_dev(struct mhi_controller *mhi_cntrl) #if 1 //some SOC like rpi_4b need next codes ret = -EIO; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + if((ret = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64)))) + ret = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32)); +#else if (!pci_set_dma_mask(pci_dev, DMA_BIT_MASK(64))) { ret = pci_set_consistent_dma_mask(pci_dev, DMA_BIT_MASK(64)); } else if (!pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32))) { ret = pci_set_consistent_dma_mask(pci_dev, DMA_BIT_MASK(32)); } +#endif if (ret) { MHI_ERR("Error dma mask\n"); } diff --git a/quectel_MHI/src/core/mhi_boot.c b/quectel_MHI/src/core/mhi_boot.c index 30436c1..ebd7c99 100644 --- a/quectel_MHI/src/core/mhi_boot.c +++ b/quectel_MHI/src/core/mhi_boot.c @@ -200,8 +200,11 @@ static int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl) lower_32_bits(mhi_buf->dma_addr)); mhi_write_reg(mhi_cntrl, base, BHIE_RXVECSIZE_OFFS, mhi_buf->len); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + sequence_id = get_random_u32() & BHIE_RXVECSTATUS_SEQNUM_BMSK; +#else sequence_id = prandom_u32() & BHIE_RXVECSTATUS_SEQNUM_BMSK; - +#endif if (unlikely(!sequence_id)) sequence_id = 1; @@ -312,8 +315,11 @@ int mhi_download_rddm_img(struct mhi_controller *mhi_cntrl, bool in_panic) lower_32_bits(mhi_buf->dma_addr)); mhi_write_reg(mhi_cntrl, base, BHIE_RXVECSIZE_OFFS, mhi_buf->len); - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + sequence_id = get_random_u32() & BHIE_RXVECSTATUS_SEQNUM_BMSK; +#else sequence_id = prandom_u32() & BHIE_RXVECSTATUS_SEQNUM_BMSK; +#endif mhi_write_reg_field(mhi_cntrl, base, BHIE_RXVECDB_OFFS, BHIE_RXVECDB_SEQNUM_BMSK, BHIE_RXVECDB_SEQNUM_SHFT, sequence_id); @@ -364,8 +370,12 @@ static int mhi_fw_load_amss(struct mhi_controller *mhi_cntrl, lower_32_bits(mhi_buf->dma_addr)); mhi_write_reg(mhi_cntrl, base, BHIE_TXVECSIZE_OFFS, mhi_buf->len); - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + mhi_cntrl->sequence_id = get_random_u32() & BHIE_TXVECSTATUS_SEQNUM_BMSK; +#else mhi_cntrl->sequence_id = prandom_u32() & BHIE_TXVECSTATUS_SEQNUM_BMSK; +#endif + mhi_write_reg_field(mhi_cntrl, base, BHIE_TXVECDB_OFFS, BHIE_TXVECDB_SEQNUM_BMSK, BHIE_TXVECDB_SEQNUM_SHFT, mhi_cntrl->sequence_id); diff --git a/quectel_MHI/src/devices/mhi_netdev_quectel.c b/quectel_MHI/src/devices/mhi_netdev_quectel.c index dbf3d6d..5d7e6e8 100644 --- a/quectel_MHI/src/devices/mhi_netdev_quectel.c +++ b/quectel_MHI/src/devices/mhi_netdev_quectel.c @@ -449,8 +449,11 @@ static int bridge_arp_reply(struct net_device *net, struct sk_buff *skb, uint br __skb_pull(reply, skb_network_offset(reply)); reply->ip_summed = CHECKSUM_UNNECESSARY; reply->pkt_type = PACKET_HOST; - +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0) netif_rx_ni(reply); +#else + netif_rx(reply); +#endif } return 1; } @@ -840,8 +843,13 @@ static void rmnet_vnd_upate_rx_stats(struct net_device *net, struct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64); u64_stats_update_begin(&stats64->syncp); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0) stats64->rx_packets += rx_packets; stats64->rx_bytes += rx_bytes; +#else + u64_stats_add(&stats64->rx_packets, rx_packets); + u64_stats_add(&stats64->rx_bytes,rx_bytes); +#endif u64_stats_update_end(&stats64->syncp); #else priv->self_dev->stats.rx_packets += rx_packets; @@ -856,8 +864,13 @@ static void rmnet_vnd_upate_tx_stats(struct net_device *net, struct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64); u64_stats_update_begin(&stats64->syncp); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0) stats64->tx_packets += tx_packets; stats64->tx_bytes += tx_bytes; +#else + u64_stats_add(&stats64->tx_packets, tx_packets); + u64_stats_add(&stats64->tx_bytes,tx_bytes); +#endif u64_stats_update_end(&stats64->syncp); #else net->stats.rx_packets += tx_packets; @@ -888,10 +901,17 @@ static struct rtnl_link_stats64 *_rmnet_vnd_get_stats64(struct net_device *net, do { start = u64_stats_fetch_begin_irq(&stats64->syncp); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0) rx_packets = stats64->rx_packets; rx_bytes = stats64->rx_bytes; tx_packets = stats64->tx_packets; tx_bytes = stats64->tx_bytes; +#else + rx_packets = u64_stats_read(&stats64->rx_packets); + rx_bytes = u64_stats_read(&stats64->rx_bytes); + tx_packets = u64_stats_read(&stats64->tx_packets); + tx_bytes = u64_stats_read(&stats64->tx_bytes); +#endif } while (u64_stats_fetch_retry_irq(&stats64->syncp, start)); stats->rx_packets += rx_packets; @@ -1485,7 +1505,7 @@ static struct net_device * rmnet_vnd_register_device(struct mhi_netdev *pQmapDev struct qmap_priv *priv; int err; int use_qca_nss = !!nss_cb; - + u8 maddr[ETH_ALEN]; qmap_net = alloc_etherdev(sizeof(*priv)); if (!qmap_net) return NULL; @@ -1499,8 +1519,9 @@ static struct net_device * rmnet_vnd_register_device(struct mhi_netdev *pQmapDev priv->qmap_version = pQmapDev->qmap_version; priv->mux_id = mux_id; sprintf(qmap_net->name, "%s.%d", real_dev->name, offset_id + 1); - memcpy (qmap_net->dev_addr, real_dev->dev_addr, ETH_ALEN); - qmap_net->dev_addr[5] = offset_id + 1; + ether_addr_copy(maddr, real_dev->dev_addr); + maddr[5]= offset_id + 1; + ether_addr_copy((u8*)qmap_net->dev_addr, maddr); //eth_random_addr(qmap_net->dev_addr); #if defined(MHI_NETDEV_STATUS64) priv->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); @@ -1705,8 +1726,14 @@ static void mhi_netdev_upate_rx_stats(struct mhi_netdev *mhi_netdev, struct pcpu_sw_netstats *stats64 = this_cpu_ptr(mhi_netdev->stats64); u64_stats_update_begin(&stats64->syncp); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0) stats64->rx_packets += rx_packets; stats64->rx_bytes += rx_bytes; +#else + u64_stats_add(&stats64->rx_packets, rx_packets); + u64_stats_add(&stats64->rx_bytes,rx_bytes); +#endif + u64_stats_update_begin(&stats64->syncp); #else mhi_netdev->ndev->stats.rx_packets += rx_packets; @@ -1720,8 +1747,14 @@ static void mhi_netdev_upate_tx_stats(struct mhi_netdev *mhi_netdev, struct pcpu_sw_netstats *stats64 = this_cpu_ptr(mhi_netdev->stats64); u64_stats_update_begin(&stats64->syncp); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0) stats64->tx_packets += tx_packets; stats64->tx_bytes += tx_bytes; +#else + u64_stats_add(&stats64->tx_packets, tx_packets); + u64_stats_add(&stats64->tx_bytes,tx_bytes); +#endif + u64_stats_update_begin(&stats64->syncp); #else mhi_netdev->ndev->stats.tx_packets += tx_packets; @@ -2064,10 +2097,17 @@ static struct rtnl_link_stats64 * _mhi_netdev_get_stats64(struct net_device *nde do { start = u64_stats_fetch_begin_irq(&stats64->syncp); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0) rx_packets = stats64->rx_packets; rx_bytes = stats64->rx_bytes; tx_packets = stats64->tx_packets; tx_bytes = stats64->tx_bytes; +#else + rx_packets = u64_stats_read(&stats64->rx_packets); + rx_bytes = u64_stats_read(&stats64->rx_bytes); + tx_packets = u64_stats_read(&stats64->tx_packets); + tx_bytes = u64_stats_read(&stats64->tx_bytes); +#endif } while (u64_stats_fetch_retry_irq(&stats64->syncp, start)); stats->rx_packets += rx_packets; @@ -2269,8 +2309,11 @@ static int mhi_netdev_enable_iface(struct mhi_netdev *mhi_netdev) mhi_netdev->ndev->mtu = mhi_netdev->mru; } rtnl_unlock(); - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + netif_napi_add_weight(mhi_netdev->ndev, &mhi_netdev->napi, mhi_netdev_poll, poll_weight); +#else netif_napi_add(mhi_netdev->ndev, &mhi_netdev->napi, mhi_netdev_poll, poll_weight); +#endif ret = register_netdev(mhi_netdev->ndev); if (ret) { MSG_ERR("Network device registration failed\n"); diff --git a/quectel_MHI/src/devices/mhi_uci.c b/quectel_MHI/src/devices/mhi_uci.c index 01a846b..dde90b2 100644 --- a/quectel_MHI/src/devices/mhi_uci.c +++ b/quectel_MHI/src/devices/mhi_uci.c @@ -8,6 +8,8 @@ #include #include #include +#include + #if 1 static inline void *ipc_log_context_create(int max_num_pages, const char *modname, uint16_t user_version) @@ -158,7 +160,20 @@ static int mhi_queue_inbound(struct uci_dev *uci_dev) return ret; } - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) +#ifdef TCGETS2 +static int kernel_termios_to_user_termios_1(struct termios __user *u, + struct ktermios *k) +{ + return copy_to_user(u, k, sizeof(struct termios)); +} +static int user_termios_to_kernel_termios_1(struct ktermios *k, + struct termios __user *u) +{ + return copy_from_user(k, u, sizeof(struct termios)); +} +#endif +#endif static long mhi_uci_ioctl(struct file *file, unsigned int cmd, unsigned long arg)