Merge Official Source

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
Tianling Shen 2023-03-30 03:11:44 +08:00
commit 7f80550d5f
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
26 changed files with 2155 additions and 170 deletions

View File

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=comgt
PKG_VERSION:=0.32
PKG_RELEASE:=34
PKG_RELEASE:=35
PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tgz
PKG_SOURCE_URL:=@SF/comgt
@ -79,6 +79,7 @@ define Package/comgt/install
$(INSTALL_DATA) ./files/getcarrier.gcom $(1)/etc/gcom/getcarrier.gcom
$(INSTALL_DATA) ./files/getcnum.gcom $(1)/etc/gcom/getcnum.gcom
$(INSTALL_DATA) ./files/getimsi.gcom $(1)/etc/gcom/getimsi.gcom
$(INSTALL_DATA) ./files/runcommand.gcom $(1)/etc/gcom/runcommand.gcom
$(INSTALL_DIR) $(1)/etc/hotplug.d/tty
$(INSTALL_CONF) ./files/3g.usb $(1)/etc/hotplug.d/tty/30-3g
$(INSTALL_DIR) $(1)/lib/netifd/proto
@ -96,7 +97,6 @@ endef
define Package/comgt-ncm/install
$(INSTALL_DIR) $(1)/etc/gcom
$(INSTALL_DATA) ./files/ncm.json $(1)/etc/gcom/ncm.json
$(INSTALL_DATA) ./files/runcommand.gcom $(1)/etc/gcom/runcommand.gcom
$(INSTALL_DIR) $(1)/lib/netifd/proto
$(INSTALL_BIN) ./files/ncm.sh $(1)/lib/netifd/proto/ncm.sh
endef

View File

@ -72,6 +72,8 @@ proto_3g_setup() {
*) CODE="2,2";;
esac
export MODE="AT^SYSCFG=${CODE},3FFFFFFF,2,4"
elif echo "$cardinfo" | grep -q "MikroTik"; then
COMMAND="AT+CFUN=1" gcom -d "$device" -s /etc/gcom/runcommand.gcom || return 1
fi
if [ -n "$pincode" ]; then

View File

@ -112,5 +112,17 @@
],
"connect": "AT+ZGACT=1,${profile}",
"disconnect": "AT+ZGACT=0,${profile}"
},
"\"mikrotik\"": {
"configure": [
"AT+CFUN=4",
"AT+ZGDCONT=${profile},\\\"${pdptype}\\\",\\\"${apn}\\\",0",
"AT+ZDHCPLEASE=10",
"AT+CFUN=1"
],
"waitforconnect": "\\\"+ZCONSTAT: 1,${context_type}\\\",\\\"+ZGIPDNS: ${context_type}\\\"",
"connect": "AT+ZGACT=1,${context_type}",
"finalize": "AT+ZDHCPLEASE=0",
"disconnect": "AT+ZGACT=0,1"
}
}

View File

@ -86,10 +86,25 @@ proto_ncm_setup() {
return 1
}
[ -n "$delay" ] && sleep "$delay"
manufacturer=$(gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk 'NF && $0 !~ /AT\+CGMI/ { sub(/\+CGMI: /,""); print tolower($1); exit; }')
[ $? -ne 0 -o -z "$manufacturer" ] && {
start=$(date +%s)
while true; do
manufacturer=$(gcom -d "$device" -s /etc/gcom/getcardinfo.gcom | awk 'NF && $0 !~ /AT\+CGMI/ { sub(/\+CGMI: /,""); print tolower($1); exit; }')
[ "$manufacturer" = "error" ] && {
manufacturer=""
}
[ -n "$manufacturer" ] && {
break
}
[ -z "$delay" ] && {
break
}
sleep 1
elapsed=$(($(date +%s) - start))
[ "$elapsed" -gt "$delay" ] && {
break
}
done
[ -z "$manufacturer" ] && {
echo "Failed to get modem information"
proto_notify_error "$interface" GETINFO_FAILED
return 1

View File

@ -10,6 +10,7 @@ CONFIG_B53_MMAP_DRIVER=y
CONFIG_B53_SPI_DRIVER=y
CONFIG_BCM6345_EXT_IRQ=y
CONFIG_BCM6345_L1_IRQ=y
CONFIG_BCM6348_ENET=y
CONFIG_BCM6368_ENETSW=y
CONFIG_BCM63XX_POWER=y
CONFIG_BCM7038_WDT=y

View File

@ -140,6 +140,24 @@
status = "okay";
};
&ethernet1 {
status = "okay";
nvmem-cells = <&macaddr_cfe_6a0>;
nvmem-cell-names = "mac-address";
phy-mode = "mii";
fixed-link {
speed = <100>;
full-duplex;
};
};
&iudma {
status = "okay";
};
&ohci {
status = "okay";
};

View File

@ -346,5 +346,84 @@
status = "disabled";
};
ethernet0: ethernet@fffe4000 {
compatible = "brcm,bcm6358-emac";
reg = <0xfffe4000 0x2dc>;
clocks = <&periph_clk BCM6358_CLK_ENET0>;
interrupt-parent = <&periph_intc>;
interrupts = <BCM6358_IRQ_EMAC0>,
<BCM6358_IRQ_EMAC0_RX_DMA>,
<BCM6358_IRQ_EMAC0_TX_DMA>;
interrupt-names = "emac",
"rx",
"tx";
brcm,iudma = <&iudma>;
dma-rx = <0>;
dma-tx = <1>;
status = "disabled";
mdio0: mdio {
#address-cells = <1>;
#size-cells = <0>;
};
};
ethernet1: ethernet@fffe4800 {
compatible = "brcm,bcm6358-emac";
reg = <0xfffe4800 0x2dc>;
clocks = <&periph_clk BCM6358_CLK_ENET1>;
interrupt-parent = <&periph_intc>;
interrupts = <BCM6358_IRQ_EMAC1>,
<BCM6358_IRQ_EMAC1_RX_DMA>,
<BCM6358_IRQ_EMAC1_TX_DMA>;
interrupt-names = "emac",
"rx",
"tx";
brcm,iudma = <&iudma>;
brcm,external-mii;
dma-rx = <2>;
dma-tx = <3>;
status = "disabled";
mdio1: mdio {
#address-cells = <1>;
#size-cells = <0>;
};
};
iudma: dma@fffe5000 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "brcm,bcm6358-iudma";
reg = <0xfffe5000 0x24>,
<0xfffe5100 0x80>,
<0xfffe5200 0x80>;
reg-names = "dma",
"dma-channels",
"dma-sram";
dma-channels = <8>;
clocks = <&periph_clk BCM6358_CLK_EMUSB>,
<&periph_clk BCM6358_CLK_USBSU>,
<&periph_clk BCM6358_CLK_EPHY>,
<&periph_clk BCM6358_CLK_ENET>;
resets = <&periph_rst BCM6358_RST_ENET>,
<&periph_rst BCM6358_RST_EPHY>;
status = "disabled";
};
};
};

File diff suppressed because it is too large Load Diff

View File

@ -194,9 +194,6 @@ struct bcm6368_enetsw {
/* number of dma desc in tx ring */
int tx_ring_size;
/* maximum dma burst size */
int dma_maxburst;
/* cpu view of rx dma ring */
struct bcm6368_enetsw_desc *tx_desc_cpu;
@ -220,15 +217,6 @@ struct bcm6368_enetsw {
/* platform device reference */
struct platform_device *pdev;
/* dma channel enable mask */
u32 dma_chan_en_mask;
/* dma channel interrupt mask */
u32 dma_chan_int_mask;
/* dma channel width */
unsigned int dma_chan_width;
};
static inline void dma_writel(struct bcm6368_enetsw *priv, u32 val, u32 off)
@ -238,27 +226,29 @@ static inline void dma_writel(struct bcm6368_enetsw *priv, u32 val, u32 off)
static inline u32 dma_readl(struct bcm6368_enetsw *priv, u32 off, int chan)
{
return __raw_readl(priv->dma_chan + off + chan * priv->dma_chan_width);
return __raw_readl(priv->dma_chan + off + chan * DMA_CHAN_WIDTH);
}
static inline void dmac_writel(struct bcm6368_enetsw *priv, u32 val,
u32 off, int chan)
static inline void dmac_writel(struct bcm6368_enetsw *priv, u32 val, u32 off,
int chan)
{
__raw_writel(val, priv->dma_chan + off + chan * priv->dma_chan_width);
__raw_writel(val, priv->dma_chan + off + chan * DMA_CHAN_WIDTH);
}
static inline void dmas_writel(struct bcm6368_enetsw *priv, u32 val,
u32 off, int chan)
{
__raw_writel(val, priv->dma_sram + off + chan * priv->dma_chan_width);
__raw_writel(val, priv->dma_sram + off + chan * DMA_CHAN_WIDTH);
}
/*
* refill rx queue
*/
static int bcm6368_enetsw_refill_rx(struct net_device *dev, bool napi_mode)
static int bcm6368_enetsw_refill_rx(struct net_device *ndev, bool napi_mode)
{
struct bcm6368_enetsw *priv = netdev_priv(dev);
struct bcm6368_enetsw *priv = netdev_priv(ndev);
struct platform_device *pdev = priv->pdev;
struct device *dev = &pdev->dev;
while (priv->rx_desc_count < priv->rx_ring_size) {
struct bcm6368_enetsw_desc *desc;
@ -280,9 +270,9 @@ static int bcm6368_enetsw_refill_rx(struct net_device *dev, bool napi_mode)
if (unlikely(!buf))
break;
p = dma_map_single(&priv->pdev->dev, buf + NET_SKB_PAD,
p = dma_map_single(dev, buf + NET_SKB_PAD,
priv->rx_buf_size, DMA_FROM_DEVICE);
if (unlikely(dma_mapping_error(&priv->pdev->dev, p))) {
if (unlikely(dma_mapping_error(dev, p))) {
skb_free_frag(buf);
break;
}
@ -310,8 +300,8 @@ static int bcm6368_enetsw_refill_rx(struct net_device *dev, bool napi_mode)
/* If rx ring is still empty, set a timer to try allocating
* again at a later time. */
if (priv->rx_desc_count == 0 && netif_running(dev)) {
dev_warn(&priv->pdev->dev, "unable to refill rx ring\n");
if (priv->rx_desc_count == 0 && netif_running(ndev)) {
dev_warn(dev, "unable to refill rx ring\n");
priv->rx_timeout.expires = jiffies + HZ;
add_timer(&priv->rx_timeout);
}
@ -325,20 +315,21 @@ static int bcm6368_enetsw_refill_rx(struct net_device *dev, bool napi_mode)
static void bcm6368_enetsw_refill_rx_timer(struct timer_list *t)
{
struct bcm6368_enetsw *priv = from_timer(priv, t, rx_timeout);
struct net_device *dev = priv->net_dev;
struct net_device *ndev = priv->net_dev;
spin_lock(&priv->rx_lock);
bcm6368_enetsw_refill_rx(dev, false);
bcm6368_enetsw_refill_rx(ndev, false);
spin_unlock(&priv->rx_lock);
}
/*
* extract packet from rx queue
*/
static int bcm6368_enetsw_receive_queue(struct net_device *dev, int budget)
static int bcm6368_enetsw_receive_queue(struct net_device *ndev, int budget)
{
struct bcm6368_enetsw *priv = netdev_priv(dev);
struct device *kdev = &priv->pdev->dev;
struct bcm6368_enetsw *priv = netdev_priv(ndev);
struct platform_device *pdev = priv->pdev;
struct device *dev = &pdev->dev;
struct list_head rx_list;
struct sk_buff *skb;
int processed = 0;
@ -379,7 +370,7 @@ static int bcm6368_enetsw_receive_queue(struct net_device *dev, int budget)
/* if the packet does not have start of packet _and_
* end of packet flag set, then just recycle it */
if ((len_stat & DMADESC_ESOP_MASK) != DMADESC_ESOP_MASK) {
dev->stats.rx_dropped++;
ndev->stats.rx_dropped++;
continue;
}
@ -396,19 +387,19 @@ static int bcm6368_enetsw_receive_queue(struct net_device *dev, int budget)
if (unlikely(!nbuf)) {
/* forget packet, just rearm desc */
dev->stats.rx_dropped++;
ndev->stats.rx_dropped++;
continue;
}
dma_sync_single_for_cpu(kdev, desc->address,
dma_sync_single_for_cpu(dev, desc->address,
len, DMA_FROM_DEVICE);
memcpy(nbuf + NET_SKB_PAD, buf + NET_SKB_PAD, len);
dma_sync_single_for_device(kdev, desc->address,
dma_sync_single_for_device(dev, desc->address,
len, DMA_FROM_DEVICE);
buf = nbuf;
frag_size = nfrag_size;
} else {
dma_unmap_single(kdev, desc->address,
dma_unmap_single(dev, desc->address,
priv->rx_buf_size, DMA_FROM_DEVICE);
priv->rx_buf[desc_idx] = NULL;
frag_size = priv->rx_frag_size;
@ -417,27 +408,27 @@ static int bcm6368_enetsw_receive_queue(struct net_device *dev, int budget)
skb = napi_build_skb(buf, frag_size);
if (unlikely(!skb)) {
skb_free_frag(buf);
dev->stats.rx_dropped++;
ndev->stats.rx_dropped++;
continue;
}
skb_reserve(skb, NET_SKB_PAD);
skb_put(skb, len);
dev->stats.rx_packets++;
dev->stats.rx_bytes += len;
ndev->stats.rx_packets++;
ndev->stats.rx_bytes += len;
list_add_tail(&skb->list, &rx_list);
} while (processed < budget);
list_for_each_entry(skb, &rx_list, list)
skb->protocol = eth_type_trans(skb, dev);
skb->protocol = eth_type_trans(skb, ndev);
netif_receive_skb_list(&rx_list);
priv->rx_desc_count -= processed;
if (processed || !priv->rx_desc_count) {
bcm6368_enetsw_refill_rx(dev, true);
bcm6368_enetsw_refill_rx(ndev, true);
/* kick rx dma */
dmac_writel(priv, priv->dma_chan_en_mask,
dmac_writel(priv, DMAC_CHANCFG_EN_MASK,
DMAC_CHANCFG_REG, priv->rx_chan);
}
@ -447,10 +438,12 @@ static int bcm6368_enetsw_receive_queue(struct net_device *dev, int budget)
/*
* try to or force reclaim of transmitted buffers
*/
static int bcm6368_enetsw_tx_reclaim(struct net_device *dev, int force,
static int bcm6368_enetsw_tx_reclaim(struct net_device *ndev, int force,
int budget)
{
struct bcm6368_enetsw *priv = netdev_priv(dev);
struct bcm6368_enetsw *priv = netdev_priv(ndev);
struct platform_device *pdev = priv->pdev;
struct device *dev = &pdev->dev;
unsigned int bytes = 0;
int released = 0;
@ -475,7 +468,7 @@ static int bcm6368_enetsw_tx_reclaim(struct net_device *dev, int force,
skb = priv->tx_skb[priv->tx_dirty_desc];
priv->tx_skb[priv->tx_dirty_desc] = NULL;
dma_unmap_single(&priv->pdev->dev, desc->address, skb->len,
dma_unmap_single(dev, desc->address, skb->len,
DMA_TO_DEVICE);
priv->tx_dirty_desc++;
@ -486,17 +479,17 @@ static int bcm6368_enetsw_tx_reclaim(struct net_device *dev, int force,
spin_unlock(&priv->tx_lock);
if (desc->len_stat & DMADESC_UNDER_MASK)
dev->stats.tx_errors++;
ndev->stats.tx_errors++;
bytes += skb->len;
napi_consume_skb(skb, budget);
released++;
}
netdev_completed_queue(dev, released, bytes);
netdev_completed_queue(ndev, released, bytes);
if (netif_queue_stopped(dev) && released)
netif_wake_queue(dev);
if (netif_queue_stopped(ndev) && released)
netif_wake_queue(ndev);
return released;
}
@ -507,20 +500,20 @@ static int bcm6368_enetsw_tx_reclaim(struct net_device *dev, int force,
static int bcm6368_enetsw_poll(struct napi_struct *napi, int budget)
{
struct bcm6368_enetsw *priv = container_of(napi, struct bcm6368_enetsw, napi);
struct net_device *dev = priv->net_dev;
struct net_device *ndev = priv->net_dev;
int rx_work_done;
/* ack interrupts */
dmac_writel(priv, priv->dma_chan_int_mask,
dmac_writel(priv, DMAC_IR_PKTDONE_MASK,
DMAC_IR_REG, priv->rx_chan);
dmac_writel(priv, priv->dma_chan_int_mask,
dmac_writel(priv, DMAC_IR_PKTDONE_MASK,
DMAC_IR_REG, priv->tx_chan);
/* reclaim sent skb */
bcm6368_enetsw_tx_reclaim(dev, 0, budget);
bcm6368_enetsw_tx_reclaim(ndev, 0, budget);
spin_lock(&priv->rx_lock);
rx_work_done = bcm6368_enetsw_receive_queue(dev, budget);
rx_work_done = bcm6368_enetsw_receive_queue(ndev, budget);
spin_unlock(&priv->rx_lock);
if (rx_work_done >= budget) {
@ -533,10 +526,10 @@ static int bcm6368_enetsw_poll(struct napi_struct *napi, int budget)
napi_complete_done(napi, rx_work_done);
/* restore rx/tx interrupt */
dmac_writel(priv, priv->dma_chan_int_mask,
DMAC_IRMASK_REG, priv->rx_chan);
dmac_writel(priv, priv->dma_chan_int_mask,
DMAC_IRMASK_REG, priv->tx_chan);
dmac_writel(priv, DMAC_IR_PKTDONE_MASK,
DMAC_IRMASK_REG, priv->rx_chan);
dmac_writel(priv, DMAC_IR_PKTDONE_MASK,
DMAC_IRMASK_REG, priv->tx_chan);
return rx_work_done;
}
@ -546,8 +539,8 @@ static int bcm6368_enetsw_poll(struct napi_struct *napi, int budget)
*/
static irqreturn_t bcm6368_enetsw_isr_dma(int irq, void *dev_id)
{
struct net_device *dev = dev_id;
struct bcm6368_enetsw *priv = netdev_priv(dev);
struct net_device *ndev = dev_id;
struct bcm6368_enetsw *priv = netdev_priv(ndev);
/* mask rx/tx interrupts */
dmac_writel(priv, 0, DMAC_IRMASK_REG, priv->rx_chan);
@ -562,9 +555,11 @@ static irqreturn_t bcm6368_enetsw_isr_dma(int irq, void *dev_id)
* tx request callback
*/
static netdev_tx_t
bcm6368_enetsw_start_xmit(struct sk_buff *skb, struct net_device *dev)
bcm6368_enetsw_start_xmit(struct sk_buff *skb, struct net_device *ndev)
{
struct bcm6368_enetsw *priv = netdev_priv(dev);
struct bcm6368_enetsw *priv = netdev_priv(ndev);
struct platform_device *pdev = priv->pdev;
struct device *dev = &pdev->dev;
struct bcm6368_enetsw_desc *desc;
u32 len_stat;
netdev_tx_t ret;
@ -576,9 +571,8 @@ bcm6368_enetsw_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* make sure the tx hw queue is not full, should not happen
* since we stop queue before it's the case */
if (unlikely(!priv->tx_desc_count)) {
netif_stop_queue(dev);
dev_err(&priv->pdev->dev, "xmit called with no tx desc "
"available?\n");
netif_stop_queue(ndev);
dev_err(dev, "xmit called with no tx desc available?\n");
ret = NETDEV_TX_BUSY;
goto out_unlock;
}
@ -604,9 +598,8 @@ bcm6368_enetsw_start_xmit(struct sk_buff *skb, struct net_device *dev)
}
/* fill descriptor */
p = dma_map_single(&priv->pdev->dev, skb->data, skb->len,
DMA_TO_DEVICE);
if (unlikely(dma_mapping_error(&priv->pdev->dev, p))) {
p = dma_map_single(dev, skb->data, skb->len, DMA_TO_DEVICE);
if (unlikely(dma_mapping_error(dev, p))) {
dev_kfree_skb(skb);
ret = NETDEV_TX_OK;
goto out_unlock;
@ -634,18 +627,18 @@ bcm6368_enetsw_start_xmit(struct sk_buff *skb, struct net_device *dev)
desc->len_stat = len_stat;
wmb();
netdev_sent_queue(dev, skb->len);
netdev_sent_queue(ndev, skb->len);
/* kick tx dma */
dmac_writel(priv, priv->dma_chan_en_mask, DMAC_CHANCFG_REG,
dmac_writel(priv, DMAC_CHANCFG_EN_MASK, DMAC_CHANCFG_REG,
priv->tx_chan);
/* stop queue if no more desc available */
if (!priv->tx_desc_count)
netif_stop_queue(dev);
netif_stop_queue(ndev);
dev->stats.tx_bytes += skb->len;
dev->stats.tx_packets++;
ndev->stats.tx_bytes += skb->len;
ndev->stats.tx_packets++;
ret = NETDEV_TX_OK;
out_unlock:
@ -673,10 +666,11 @@ static void bcm6368_enetsw_disable_dma(struct bcm6368_enetsw *priv, int chan)
} while (limit--);
}
static int bcm6368_enetsw_open(struct net_device *dev)
static int bcm6368_enetsw_open(struct net_device *ndev)
{
struct bcm6368_enetsw *priv = netdev_priv(dev);
struct device *kdev = &priv->pdev->dev;
struct bcm6368_enetsw *priv = netdev_priv(ndev);
struct platform_device *pdev = priv->pdev;
struct device *dev = &pdev->dev;
int i, ret;
unsigned int size;
void *p;
@ -687,22 +681,22 @@ static int bcm6368_enetsw_open(struct net_device *dev)
dmac_writel(priv, 0, DMAC_IRMASK_REG, priv->tx_chan);
ret = request_irq(priv->irq_rx, bcm6368_enetsw_isr_dma,
0, dev->name, dev);
0, ndev->name, ndev);
if (ret)
goto out_freeirq;
if (priv->irq_tx != -1) {
ret = request_irq(priv->irq_tx, bcm6368_enetsw_isr_dma,
0, dev->name, dev);
0, ndev->name, ndev);
if (ret)
goto out_freeirq_rx;
}
/* allocate rx dma ring */
size = priv->rx_ring_size * sizeof(struct bcm6368_enetsw_desc);
p = dma_alloc_coherent(kdev, size, &priv->rx_desc_dma, GFP_KERNEL);
p = dma_alloc_coherent(dev, size, &priv->rx_desc_dma, GFP_KERNEL);
if (!p) {
dev_err(kdev, "cannot allocate rx ring %u\n", size);
dev_err(dev, "cannot allocate rx ring %u\n", size);
ret = -ENOMEM;
goto out_freeirq_tx;
}
@ -713,9 +707,9 @@ static int bcm6368_enetsw_open(struct net_device *dev)
/* allocate tx dma ring */
size = priv->tx_ring_size * sizeof(struct bcm6368_enetsw_desc);
p = dma_alloc_coherent(kdev, size, &priv->tx_desc_dma, GFP_KERNEL);
p = dma_alloc_coherent(dev, size, &priv->tx_desc_dma, GFP_KERNEL);
if (!p) {
dev_err(kdev, "cannot allocate tx ring\n");
dev_err(dev, "cannot allocate tx ring\n");
ret = -ENOMEM;
goto out_free_rx_ring;
}
@ -727,7 +721,7 @@ static int bcm6368_enetsw_open(struct net_device *dev)
priv->tx_skb = kzalloc(sizeof(struct sk_buff *) * priv->tx_ring_size,
GFP_KERNEL);
if (!priv->tx_skb) {
dev_err(kdev, "cannot allocate tx skb queue\n");
dev_err(dev, "cannot allocate tx skb queue\n");
ret = -ENOMEM;
goto out_free_tx_ring;
}
@ -741,7 +735,7 @@ static int bcm6368_enetsw_open(struct net_device *dev)
priv->rx_buf = kzalloc(sizeof(unsigned char *) * priv->rx_ring_size,
GFP_KERNEL);
if (!priv->rx_buf) {
dev_err(kdev, "cannot allocate rx buffer queue\n");
dev_err(dev, "cannot allocate rx buffer queue\n");
ret = -ENOMEM;
goto out_free_tx_skb;
}
@ -754,8 +748,8 @@ static int bcm6368_enetsw_open(struct net_device *dev)
dma_writel(priv, DMA_BUFALLOC_FORCE_MASK | 0,
DMA_BUFALLOC_REG(priv->rx_chan));
if (bcm6368_enetsw_refill_rx(dev, false)) {
dev_err(kdev, "cannot allocate rx buffer queue\n");
if (bcm6368_enetsw_refill_rx(ndev, false)) {
dev_err(dev, "cannot allocate rx buffer queue\n");
ret = -ENOMEM;
goto out;
}
@ -775,9 +769,9 @@ static int bcm6368_enetsw_open(struct net_device *dev)
dmas_writel(priv, 0, DMAS_SRAM4_REG, priv->tx_chan);
/* set dma maximum burst len */
dmac_writel(priv, priv->dma_maxburst,
dmac_writel(priv, ENETSW_DMA_MAXBURST,
DMAC_MAXBURST_REG, priv->rx_chan);
dmac_writel(priv, priv->dma_maxburst,
dmac_writel(priv, ENETSW_DMA_MAXBURST,
DMAC_MAXBURST_REG, priv->tx_chan);
/* set flow control low/high threshold to 1/3 / 2/3 */
@ -808,8 +802,8 @@ static int bcm6368_enetsw_open(struct net_device *dev)
dmac_writel(priv, DMAC_IR_PKTDONE_MASK,
DMAC_IRMASK_REG, priv->tx_chan);
netif_carrier_on(dev);
netif_start_queue(dev);
netif_carrier_on(ndev);
netif_start_queue(ndev);
return 0;
@ -821,7 +815,7 @@ out:
continue;
desc = &priv->rx_desc_cpu[i];
dma_unmap_single(kdev, desc->address, priv->rx_buf_size,
dma_unmap_single(dev, desc->address, priv->rx_buf_size,
DMA_FROM_DEVICE);
skb_free_frag(priv->rx_buf[i]);
}
@ -831,31 +825,32 @@ out_free_tx_skb:
kfree(priv->tx_skb);
out_free_tx_ring:
dma_free_coherent(kdev, priv->tx_desc_alloc_size,
dma_free_coherent(dev, priv->tx_desc_alloc_size,
priv->tx_desc_cpu, priv->tx_desc_dma);
out_free_rx_ring:
dma_free_coherent(kdev, priv->rx_desc_alloc_size,
dma_free_coherent(dev, priv->rx_desc_alloc_size,
priv->rx_desc_cpu, priv->rx_desc_dma);
out_freeirq_tx:
if (priv->irq_tx != -1)
free_irq(priv->irq_tx, dev);
free_irq(priv->irq_tx, ndev);
out_freeirq_rx:
free_irq(priv->irq_rx, dev);
free_irq(priv->irq_rx, ndev);
out_freeirq:
return ret;
}
static int bcm6368_enetsw_stop(struct net_device *dev)
static int bcm6368_enetsw_stop(struct net_device *ndev)
{
struct bcm6368_enetsw *priv = netdev_priv(dev);
struct device *kdev = &priv->pdev->dev;
struct bcm6368_enetsw *priv = netdev_priv(ndev);
struct platform_device *pdev = priv->pdev;
struct device *dev = &pdev->dev;
int i;
netif_stop_queue(dev);
netif_stop_queue(ndev);
napi_disable(&priv->napi);
del_timer_sync(&priv->rx_timeout);
@ -868,7 +863,7 @@ static int bcm6368_enetsw_stop(struct net_device *dev)
bcm6368_enetsw_disable_dma(priv, priv->rx_chan);
/* force reclaim of all tx buffers */
bcm6368_enetsw_tx_reclaim(dev, 1, 0);
bcm6368_enetsw_tx_reclaim(ndev, 1, 0);
/* free the rx buffer ring */
for (i = 0; i < priv->rx_ring_size; i++) {
@ -878,7 +873,7 @@ static int bcm6368_enetsw_stop(struct net_device *dev)
continue;
desc = &priv->rx_desc_cpu[i];
dma_unmap_single_attrs(kdev, desc->address, priv->rx_buf_size,
dma_unmap_single_attrs(dev, desc->address, priv->rx_buf_size,
DMA_FROM_DEVICE,
DMA_ATTR_SKIP_CPU_SYNC);
skb_free_frag(priv->rx_buf[i]);
@ -887,15 +882,15 @@ static int bcm6368_enetsw_stop(struct net_device *dev)
/* free remaining allocated memory */
kfree(priv->rx_buf);
kfree(priv->tx_skb);
dma_free_coherent(kdev, priv->rx_desc_alloc_size,
dma_free_coherent(dev, priv->rx_desc_alloc_size,
priv->rx_desc_cpu, priv->rx_desc_dma);
dma_free_coherent(kdev, priv->tx_desc_alloc_size,
dma_free_coherent(dev, priv->tx_desc_alloc_size,
priv->tx_desc_cpu, priv->tx_desc_dma);
if (priv->irq_tx != -1)
free_irq(priv->irq_tx, dev);
free_irq(priv->irq_rx, dev);
free_irq(priv->irq_tx, ndev);
free_irq(priv->irq_rx, ndev);
netdev_reset_queue(dev);
netdev_reset_queue(ndev);
return 0;
}
@ -908,19 +903,25 @@ static const struct net_device_ops bcm6368_enetsw_ops = {
static int bcm6368_enetsw_probe(struct platform_device *pdev)
{
struct bcm6368_enetsw *priv;
struct device *dev = &pdev->dev;
struct device_node *node = dev->of_node;
struct bcm6368_enetsw *priv;
struct net_device *ndev;
struct resource *res;
unsigned i;
int num_resets;
int ret;
ndev = alloc_etherdev(sizeof(*priv));
ndev = devm_alloc_etherdev(dev, sizeof(*priv));
if (!ndev)
return -ENOMEM;
platform_set_drvdata(pdev, ndev);
SET_NETDEV_DEV(ndev, dev);
priv = netdev_priv(ndev);
priv->pdev = pdev;
priv->net_dev = ndev;
priv->num_pms = of_count_phandle_with_args(node, "power-domains",
"#power-domain-cells");
@ -960,18 +961,18 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dma");
priv->dma_base = devm_ioremap_resource(dev, res);
if (IS_ERR(priv->dma_base))
if (IS_ERR_OR_NULL(priv->dma_base))
return PTR_ERR(priv->dma_base);
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
"dma-channels");
priv->dma_chan = devm_ioremap_resource(dev, res);
if (IS_ERR(priv->dma_chan))
if (IS_ERR_OR_NULL(priv->dma_chan))
return PTR_ERR(priv->dma_chan);
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dma-sram");
priv->dma_sram = devm_ioremap_resource(dev, res);
if (IS_ERR(priv->dma_sram))
if (IS_ERR_OR_NULL(priv->dma_sram))
return PTR_ERR(priv->dma_sram);
priv->irq_rx = platform_get_irq_byname(pdev, "rx");
@ -992,15 +993,8 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
priv->rx_ring_size = ENETSW_DEF_RX_DESC;
priv->tx_ring_size = ENETSW_DEF_TX_DESC;
priv->dma_maxburst = ENETSW_DMA_MAXBURST;
priv->copybreak = ENETSW_DEF_CPY_BREAK;
priv->dma_chan_en_mask = DMAC_CHANCFG_EN_MASK;
priv->dma_chan_int_mask = DMAC_IR_PKTDONE_MASK;
priv->dma_chan_width = DMA_CHAN_WIDTH;
of_get_mac_address(node, ndev->dev_addr);
if (is_valid_ether_addr(ndev->dev_addr)) {
dev_info(dev, "mtd mac %pM\n", ndev->dev_addr);
@ -1010,7 +1004,7 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
}
priv->rx_buf_size = ALIGN(ndev->mtu + ENETSW_MTU_OVERHEAD,
priv->dma_maxburst * 4);
ENETSW_DMA_MAXBURST * 4);
priv->rx_frag_size = ENETSW_FRAG_SIZE(priv->rx_buf_size);
@ -1018,14 +1012,14 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
if (priv->num_clocks) {
priv->clock = devm_kcalloc(dev, priv->num_clocks,
sizeof(struct clk *), GFP_KERNEL);
if (!priv->clock)
return -ENOMEM;
if (IS_ERR_OR_NULL(priv->clock))
return PTR_ERR(priv->clock);
}
for (i = 0; i < priv->num_clocks; i++) {
priv->clock[i] = of_clk_get(node, i);
if (IS_ERR(priv->clock[i])) {
dev_err(dev, "error getting clock %d\n", i);
return -EINVAL;
return PTR_ERR(priv->clock[i]);
}
ret = clk_prepare_enable(priv->clock[i]);
@ -1035,20 +1029,24 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
}
}
priv->num_resets = of_count_phandle_with_args(node, "resets",
"#reset-cells");
num_resets = of_count_phandle_with_args(node, "resets",
"#reset-cells");
if (num_resets > 0)
priv->num_resets = num_resets;
else
priv->num_resets = 0;
if (priv->num_resets) {
priv->reset = devm_kcalloc(dev, priv->num_resets,
sizeof(struct reset_control *),
GFP_KERNEL);
if (!priv->reset)
return -ENOMEM;
if (IS_ERR_OR_NULL(priv->reset))
return PTR_ERR(priv->reset);
}
for (i = 0; i < priv->num_resets; i++) {
priv->reset[i] = devm_reset_control_get_by_index(dev, i);
if (IS_ERR(priv->reset[i])) {
dev_err(dev, "error getting reset %d\n", i);
return -EINVAL;
return PTR_ERR(priv->reset[i]);
}
ret = reset_control_reset(priv->reset[i]);
@ -1068,16 +1066,16 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
ndev->mtu = ETH_DATA_LEN + ENETSW_TAG_SIZE;
ndev->max_mtu = ETH_DATA_LEN + ENETSW_TAG_SIZE;
netif_napi_add(ndev, &priv->napi, bcm6368_enetsw_poll, 16);
SET_NETDEV_DEV(ndev, dev);
ret = register_netdev(ndev);
if (ret)
ret = devm_register_netdev(dev, ndev);
if (ret) {
netif_napi_del(&priv->napi);
goto out_disable_clk;
}
netif_carrier_off(ndev);
platform_set_drvdata(pdev, ndev);
priv->pdev = pdev;
priv->net_dev = ndev;
dev_info(dev, "%s at 0x%px, IRQ %d\n", ndev->name, priv->dma_base, ndev->irq);
return 0;
@ -1098,8 +1096,6 @@ static int bcm6368_enetsw_remove(struct platform_device *pdev)
struct bcm6368_enetsw *priv = netdev_priv(ndev);
unsigned int i;
unregister_netdev(ndev);
pm_runtime_put_sync(dev);
for (i = 0; priv->pm && i < priv->num_pms; i++) {
dev_pm_domain_detach(priv->pm[i], true);
@ -1112,8 +1108,6 @@ static int bcm6368_enetsw_remove(struct platform_device *pdev)
for (i = 0; i < priv->num_clocks; i++)
clk_disable_unprepare(priv->clock[i]);
free_netdev(ndev);
return 0;
}

View File

@ -11,6 +11,9 @@ comtrend,vr-3025u)
ucidef_set_bridge_device switch
ucidef_set_interface_lan "lan1 lan2 lan3 lan4"
;;
huawei,hg556a-b)
ucidef_set_interface_lan "eth0"
;;
esac
board_config_flush

View File

@ -0,0 +1,16 @@
# SPDX-License-Identifier: GPL-2.0-or-later
. /lib/functions/uci-defaults.sh
board_config_update
case "$(board_name)" in
sercomm,h500-s-lowi |\
sercomm,h500-s-vfes)
ucidef_add_gpio_switch "qtn_power" "Quantenna Module Power" "480" "1"
;;
esac
board_config_flush
exit 0

View File

@ -0,0 +1,44 @@
From 590b60fb08cb1e70fe02d3f407c6b3dbe9ad06ff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
Date: Mon, 1 Mar 2021 07:34:39 +0100
Subject: [PATCH] net: broadcom: add BCM6348 enetsw controller driver
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This controller is present on BCM6338, BCM6348 and BCM6358 SoCs.
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/ethernet/broadcom/Kconfig | 8 +
drivers/net/ethernet/broadcom/Makefile | 1 +
3 files changed, 1120 insertions(+)
create mode 100644 drivers/net/ethernet/broadcom/bcm6368-enetsw.c
--- a/drivers/net/ethernet/broadcom/Kconfig
+++ b/drivers/net/ethernet/broadcom/Kconfig
@@ -68,6 +68,14 @@ config BCM63XX_ENET
This driver supports the ethernet MACs in the Broadcom 63xx
MIPS chipset family (BCM63XX).
+config BCM6348_ENET
+ tristate "Broadcom BCM6348 internal mac support"
+ depends on BMIPS_GENERIC || COMPILE_TEST
+ default y
+ help
+ This driver supports Ethernet controller integrated into Broadcom
+ BCM6348 family SoCs.
+
config BCM6368_ENETSW
tristate "Broadcom BCM6368 internal mac support"
depends on BMIPS_GENERIC || COMPILE_TEST
--- a/drivers/net/ethernet/broadcom/Makefile
+++ b/drivers/net/ethernet/broadcom/Makefile
@@ -6,6 +6,7 @@
obj-$(CONFIG_B44) += b44.o
obj-$(CONFIG_BCM4908_ENET) += bcm4908_enet.o
obj-$(CONFIG_BCM63XX_ENET) += bcm63xx_enet.o
+obj-$(CONFIG_BCM6348_ENET) += bcm6348-enet.o
obj-$(CONFIG_BCM6368_ENETSW) += bcm6368-enetsw.o
obj-$(CONFIG_BCMGENET) += genet/
obj-$(CONFIG_BNX2) += bnx2.o

View File

@ -0,0 +1,31 @@
From: Felix Fietkau <nbd@nbd.name>
Date: Fri, 24 Mar 2023 14:56:58 +0100
Subject: [PATCH] net: ethernet: mtk_eth_soc: fix tx throughput regression with
direct 1G links
Using the QDMA tx scheduler to throttle tx to line speed works fine for
switch ports, but apparently caused a regression on non-switch ports.
Based on a number of tests, it seems that this throttling can be safely
dropped without re-introducing the issues on switch ports that the
tx scheduling changes resolved.
Link: https://lore.kernel.org/netdev/trinity-92c3826f-c2c8-40af-8339-bc6d0d3ffea4-1678213958520@3c-app-gmx-bs16/
Fixes: f63959c7eec3 ("net: ethernet: mtk_eth_soc: implement multi-queue support for per-port queues")
Reported-by: Frank Wunderlich <frank-w@public-files.de>
Reported-by: Daniel Golle <daniel@makrotopia.org>
Tested-by: Daniel Golle <daniel@makrotopia.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -676,8 +676,6 @@ static void mtk_mac_link_up(struct phyli
break;
}
- mtk_set_queue_speed(mac->hw, mac->id, speed);
-
/* Configure duplex */
if (duplex == DUPLEX_FULL)
mcr |= MAC_MCR_FORCE_DPX;

View File

@ -34,7 +34,7 @@
mtk_eth_path_name(path), __func__, updated);
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -4757,6 +4757,26 @@ static const struct mtk_soc_data mt7629_
@@ -4755,6 +4755,26 @@ static const struct mtk_soc_data mt7629_
},
};
@ -61,7 +61,7 @@
static const struct mtk_soc_data mt7986_data = {
.reg_map = &mt7986_reg_map,
.ana_rgc3 = 0x128,
@@ -4799,6 +4819,7 @@ const struct of_device_id of_mtk_match[]
@@ -4797,6 +4817,7 @@ const struct of_device_id of_mtk_match[]
{ .compatible = "mediatek,mt7622-eth", .data = &mt7622_data},
{ .compatible = "mediatek,mt7623-eth", .data = &mt7623_data},
{ .compatible = "mediatek,mt7629-eth", .data = &mt7629_data},

View File

@ -21,7 +21,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -704,8 +704,10 @@ static const struct phylink_mac_ops mtk_
@@ -702,8 +702,10 @@ static const struct phylink_mac_ops mtk_
static int mtk_mdio_init(struct mtk_eth *eth)
{
@ -32,7 +32,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
mii_np = of_get_child_by_name(eth->dev->of_node, "mdio-bus");
if (!mii_np) {
@@ -731,6 +733,25 @@ static int mtk_mdio_init(struct mtk_eth
@@ -729,6 +731,25 @@ static int mtk_mdio_init(struct mtk_eth
eth->mii_bus->parent = eth->dev;
snprintf(eth->mii_bus->id, MII_BUS_ID_SIZE, "%pOFn", mii_np);

View File

@ -60,7 +60,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
return NULL;
@@ -3979,8 +3980,17 @@ static int mtk_unreg_dev(struct mtk_eth
@@ -3977,8 +3978,17 @@ static int mtk_unreg_dev(struct mtk_eth
return 0;
}
@ -78,7 +78,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
mtk_unreg_dev(eth);
mtk_free_dev(eth);
cancel_work_sync(&eth->pending_work);
@@ -4410,6 +4420,36 @@ void mtk_eth_set_dma_device(struct mtk_e
@@ -4408,6 +4418,36 @@ void mtk_eth_set_dma_device(struct mtk_e
rtnl_unlock();
}
@ -115,7 +115,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
static int mtk_probe(struct platform_device *pdev)
{
struct resource *res = NULL;
@@ -4473,13 +4513,7 @@ static int mtk_probe(struct platform_dev
@@ -4471,13 +4511,7 @@ static int mtk_probe(struct platform_dev
}
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII)) {
@ -130,7 +130,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (err)
return err;
@@ -4490,14 +4524,17 @@ static int mtk_probe(struct platform_dev
@@ -4488,14 +4522,17 @@ static int mtk_probe(struct platform_dev
"mediatek,pctl");
if (IS_ERR(eth->pctl)) {
dev_err(&pdev->dev, "no pctl regmap found\n");
@ -151,7 +151,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
if (eth->soc->offload_version) {
@@ -4657,6 +4694,8 @@ err_deinit_hw:
@@ -4655,6 +4692,8 @@ err_deinit_hw:
mtk_hw_deinit(eth);
err_wed_exit:
mtk_wed_exit();

View File

@ -9,6 +9,7 @@ CONFIG_CLANG_VERSION=.*
# CONFIG_INLINE_.* is not set
# CONFIG_LD_.* is not set
CONFIG_LLD_VERSION=.*
CONFIG_PAHOLE_VERSION=.*
CONFIG_PLUGIN_HOSTCC=".*"
# CONFIG_SET_FS is not set
# CONFIG_TASKS_.* is not set

View File

@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -2994,8 +2994,8 @@ static irqreturn_t mtk_handle_irq_rx(int
@@ -2992,8 +2992,8 @@ static irqreturn_t mtk_handle_irq_rx(int
eth->rx_events++;
if (likely(napi_schedule_prep(&eth->rx_napi))) {
@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
}
return IRQ_HANDLED;
@@ -3007,8 +3007,8 @@ static irqreturn_t mtk_handle_irq_tx(int
@@ -3005,8 +3005,8 @@ static irqreturn_t mtk_handle_irq_tx(int
eth->tx_events++;
if (likely(napi_schedule_prep(&eth->tx_napi))) {
@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
}
return IRQ_HANDLED;
@@ -4675,6 +4675,8 @@ static int mtk_probe(struct platform_dev
@@ -4673,6 +4673,8 @@ static int mtk_probe(struct platform_dev
* for NAPI to work
*/
init_dummy_netdev(&eth->dummy_dev);

View File

@ -53,7 +53,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -4644,8 +4644,8 @@ static int mtk_probe(struct platform_dev
@@ -4642,8 +4642,8 @@ static int mtk_probe(struct platform_dev
for (i = 0; i < num_ppe; i++) {
u32 ppe_addr = eth->soc->reg_map->ppe_base + i * 0x400;
@ -64,7 +64,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
if (!eth->ppe[i]) {
err = -ENOMEM;
goto err_free_dev;
@@ -4772,6 +4772,7 @@ static const struct mtk_soc_data mt7622_
@@ -4770,6 +4770,7 @@ static const struct mtk_soc_data mt7622_
.required_pctl = false,
.offload_version = 2,
.hash_offset = 2,
@ -72,7 +72,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
.foe_entry_size = sizeof(struct mtk_foe_entry) - 16,
.txrx = {
.txd_size = sizeof(struct mtk_tx_dma),
@@ -4809,6 +4810,7 @@ static const struct mtk_soc_data mt7629_
@@ -4807,6 +4808,7 @@ static const struct mtk_soc_data mt7629_
.hw_features = MTK_HW_FEATURES,
.required_clks = MT7629_CLKS_BITMAP,
.required_pctl = false,
@ -80,7 +80,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
.txrx = {
.txd_size = sizeof(struct mtk_tx_dma),
.rxd_size = sizeof(struct mtk_rx_dma),
@@ -4829,6 +4831,7 @@ static const struct mtk_soc_data mt7981_
@@ -4827,6 +4829,7 @@ static const struct mtk_soc_data mt7981_
.offload_version = 2,
.hash_offset = 4,
.foe_entry_size = sizeof(struct mtk_foe_entry),

View File

@ -17,7 +17,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -1852,9 +1852,7 @@ static int mtk_poll_rx(struct napi_struc
@@ -1850,9 +1850,7 @@ static int mtk_poll_rx(struct napi_struc
while (done < budget) {
unsigned int pktlen, *rxdcsum;
@ -27,7 +27,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
dma_addr_t dma_addr;
u32 hash, reason;
int mac = 0;
@@ -1989,36 +1987,21 @@ static int mtk_poll_rx(struct napi_struc
@@ -1987,36 +1985,21 @@ static int mtk_poll_rx(struct napi_struc
skb_checksum_none_assert(skb);
skb->protocol = eth_type_trans(skb, netdev);
@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
skb_record_rx_queue(skb, 0);
napi_gro_receive(napi, skb);
@@ -2833,29 +2816,11 @@ static netdev_features_t mtk_fix_feature
@@ -2831,29 +2814,11 @@ static netdev_features_t mtk_fix_feature
static int mtk_set_features(struct net_device *dev, netdev_features_t features)
{
@ -100,7 +100,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
return 0;
}
@@ -3169,30 +3134,6 @@ static int mtk_open(struct net_device *d
@@ -3167,30 +3132,6 @@ static int mtk_open(struct net_device *d
struct mtk_eth *eth = mac->hw;
int i, err;
@ -131,7 +131,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0);
if (err) {
netdev_err(dev, "%s: could not attach PHY: %d\n", __func__,
@@ -3233,6 +3174,35 @@ static int mtk_open(struct net_device *d
@@ -3231,6 +3172,35 @@ static int mtk_open(struct net_device *d
phylink_start(mac->phylink);
netif_tx_start_all_queues(dev);
@ -167,7 +167,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
return 0;
}
@@ -3717,10 +3687,9 @@ static int mtk_hw_init(struct mtk_eth *e
@@ -3715,10 +3685,9 @@ static int mtk_hw_init(struct mtk_eth *e
if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) {
val = mtk_r32(eth, MTK_CDMP_IG_CTRL);
mtk_w32(eth, val | MTK_CDMP_STAG_EN, MTK_CDMP_IG_CTRL);
@ -180,7 +180,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* set interrupt delays based on current Net DIM sample */
mtk_dim_rx(&eth->rx_dim.work);
@@ -4367,7 +4336,7 @@ static int mtk_add_mac(struct mtk_eth *e
@@ -4365,7 +4334,7 @@ static int mtk_add_mac(struct mtk_eth *e
eth->netdev[id]->hw_features |= NETIF_F_LRO;
eth->netdev[id]->vlan_features = eth->soc->hw_features &

View File

@ -16,7 +16,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -1425,12 +1425,28 @@ static void mtk_wake_queue(struct mtk_et
@@ -1423,12 +1423,28 @@ static void mtk_wake_queue(struct mtk_et
}
}
@ -45,7 +45,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
bool gso = false;
int tx_num;
@@ -1452,6 +1468,18 @@ static netdev_tx_t mtk_start_xmit(struct
@@ -1450,6 +1466,18 @@ static netdev_tx_t mtk_start_xmit(struct
return NETDEV_TX_BUSY;
}
@ -64,7 +64,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* TSO: fill MSS info in tcp checksum field */
if (skb_is_gso(skb)) {
if (skb_cow_head(skb, 0)) {
@@ -1467,8 +1495,14 @@ static netdev_tx_t mtk_start_xmit(struct
@@ -1465,8 +1493,14 @@ static netdev_tx_t mtk_start_xmit(struct
}
}

View File

@ -0,0 +1,42 @@
From: Felix Fietkau <nbd@nbd.name>
Date: Wed, 29 Mar 2023 16:02:54 +0200
Subject: [PATCH] net: ethernet: mtk_eth_soc: fix remaining throughput
regression
Based on further tests, it seems that the QDMA shaper is not able to
perform shaping close to the MAC link rate without throughput loss.
This cannot be compensated by increasing the shaping rate, so it seems
to be an internal limit.
Fix the remaining throughput regression by detecting that condition and
limiting shaping to ports with lower link speed.
This patch intentionally ignores link speed gain from TRGMII, because
even on such links, shaping to 1000 Mbit/s incurs some throughput
degradation.
Fixes: f63959c7eec3 ("net: ethernet: mtk_eth_soc: implement multi-queue support for per-port queues")
Reported-by: Frank Wunderlich <frank-w@public-files.de>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -667,6 +667,7 @@ static void mtk_mac_link_up(struct phyli
MAC_MCR_FORCE_RX_FC);
/* Configure speed */
+ mac->speed = speed;
switch (speed) {
case SPEED_2500:
case SPEED_1000:
@@ -3145,6 +3146,9 @@ found:
if (dp->index >= MTK_QDMA_NUM_QUEUES)
return NOTIFY_DONE;
+ if (mac->speed > 0 && mac->speed <= s.base.speed)
+ s.base.speed = 0;
+
mtk_set_queue_speed(eth, dp->index + 3, s.base.speed);
return NOTIFY_DONE;

View File

@ -172,6 +172,14 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#ifdef CONFIG_RPS
remsd = oldsd->rps_ipi_list;
oldsd->rps_ipi_list = NULL;
@@ -11706,6 +11784,7 @@ static int __init net_dev_init(void)
sd->cpu = i;
#endif
+ INIT_LIST_HEAD(&sd->backlog.poll_list);
init_gro_hash(&sd->backlog);
sd->backlog.poll = process_backlog;
sd->backlog.weight = weight_p;
--- a/net/core/sysctl_net_core.c
+++ b/net/core/sysctl_net_core.c
@@ -28,6 +28,7 @@ static int int_3600 = 3600;

View File

@ -44,7 +44,7 @@ define Device/asus_tuf-ax4200
DEVICE_DTS := mt7986a-asus-tuf-ax4200
DEVICE_DTS_DIR := ../dts
DEVICE_DTS_LOADADDR := 0x47000000
DEVICE_PACKAGES := kmod-usb3
DEVICE_PACKAGES := kmod-usb3 kmod-mt7986-firmware mt7986-wo-firmware
IMAGES := sysupgrade.bin
KERNEL_LOADADDR := 0x48000000
KERNEL = kernel-bin | lzma | \

View File

@ -103,7 +103,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
ret = mtk_mdio_busy_wait(eth);
if (ret < 0)
@@ -730,6 +773,7 @@ static int mtk_mdio_init(struct mtk_eth
@@ -729,6 +772,7 @@ static int mtk_mdio_init(struct mtk_eth
eth->mii_bus->name = "mdio";
eth->mii_bus->read = mtk_mdio_read;
eth->mii_bus->write = mtk_mdio_write;

View File

@ -14,7 +14,7 @@ Signed-off-by: René van Dorst <opensource@vdorst.com>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -4259,6 +4259,7 @@ static const struct net_device_ops mtk_n
@@ -4261,6 +4261,7 @@ static const struct net_device_ops mtk_n
static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
{
@ -22,7 +22,7 @@ Signed-off-by: René van Dorst <opensource@vdorst.com>
const __be32 *_id = of_get_property(np, "reg", NULL);
phy_interface_t phy_mode;
struct phylink *phylink;
@@ -4387,6 +4388,9 @@ static int mtk_add_mac(struct mtk_eth *e
@@ -4389,6 +4390,9 @@ static int mtk_add_mac(struct mtk_eth *e
register_netdevice_notifier(&mac->device_notifier);
}