|
@@ -36,7 +36,7 @@
|
|
|
|
|
|
/* Registers */
|
|
|
#define MVNETA_RXQ_CONFIG_REG(q) (0x1400 + ((q) << 2))
|
|
|
-#define MVNETA_RXQ_HW_BUF_ALLOC BIT(1)
|
|
|
+#define MVNETA_RXQ_HW_BUF_ALLOC BIT(0)
|
|
|
#define MVNETA_RXQ_PKT_OFFSET_ALL_MASK (0xf << 8)
|
|
|
#define MVNETA_RXQ_PKT_OFFSET_MASK(offs) ((offs) << 8)
|
|
|
#define MVNETA_RXQ_THRESHOLD_REG(q) (0x14c0 + ((q) << 2))
|
|
@@ -62,6 +62,7 @@
|
|
|
#define MVNETA_WIN_SIZE(w) (0x2204 + ((w) << 3))
|
|
|
#define MVNETA_WIN_REMAP(w) (0x2280 + ((w) << 2))
|
|
|
#define MVNETA_BASE_ADDR_ENABLE 0x2290
|
|
|
+#define MVNETA_ACCESS_PROTECT_ENABLE 0x2294
|
|
|
#define MVNETA_PORT_CONFIG 0x2400
|
|
|
#define MVNETA_UNI_PROMISC_MODE BIT(0)
|
|
|
#define MVNETA_DEF_RXQ(q) ((q) << 1)
|
|
@@ -159,7 +160,7 @@
|
|
|
|
|
|
#define MVNETA_INTR_ENABLE 0x25b8
|
|
|
#define MVNETA_TXQ_INTR_ENABLE_ALL_MASK 0x0000ff00
|
|
|
-#define MVNETA_RXQ_INTR_ENABLE_ALL_MASK 0xff000000 // note: neta says it's 0x000000FF
|
|
|
+#define MVNETA_RXQ_INTR_ENABLE_ALL_MASK 0x000000ff
|
|
|
|
|
|
#define MVNETA_RXQ_CMD 0x2680
|
|
|
#define MVNETA_RXQ_DISABLE_SHIFT 8
|
|
@@ -242,6 +243,7 @@
|
|
|
#define MVNETA_VLAN_TAG_LEN 4
|
|
|
|
|
|
#define MVNETA_CPU_D_CACHE_LINE_SIZE 32
|
|
|
+#define MVNETA_TX_CSUM_DEF_SIZE 1600
|
|
|
#define MVNETA_TX_CSUM_MAX_SIZE 9800
|
|
|
#define MVNETA_ACC_MODE_EXT 1
|
|
|
|
|
@@ -1579,12 +1581,16 @@ static int mvneta_rx(struct mvneta_port *pp, int rx_todo,
|
|
|
}
|
|
|
|
|
|
skb = build_skb(data, pp->frag_size > PAGE_SIZE ? 0 : pp->frag_size);
|
|
|
- if (!skb)
|
|
|
- goto err_drop_frame;
|
|
|
|
|
|
+ /* After refill old buffer has to be unmapped regardless
|
|
|
+ * the skb is successfully built or not.
|
|
|
+ */
|
|
|
dma_unmap_single(dev->dev.parent, phys_addr,
|
|
|
MVNETA_RX_BUF_SIZE(pp->pkt_size), DMA_FROM_DEVICE);
|
|
|
|
|
|
+ if (!skb)
|
|
|
+ goto err_drop_frame;
|
|
|
+
|
|
|
rcvd_pkts++;
|
|
|
rcvd_bytes += rx_bytes;
|
|
|
|
|
@@ -3191,6 +3197,7 @@ static void mvneta_conf_mbus_windows(struct mvneta_port *pp,
|
|
|
}
|
|
|
|
|
|
mvreg_write(pp, MVNETA_BASE_ADDR_ENABLE, win_enable);
|
|
|
+ mvreg_write(pp, MVNETA_ACCESS_PROTECT_ENABLE, win_protect);
|
|
|
}
|
|
|
|
|
|
/* Power up the port */
|
|
@@ -3250,6 +3257,7 @@ static int mvneta_probe(struct platform_device *pdev)
|
|
|
char hw_mac_addr[ETH_ALEN];
|
|
|
const char *mac_from;
|
|
|
const char *managed;
|
|
|
+ int tx_csum_limit;
|
|
|
int phy_mode;
|
|
|
int err;
|
|
|
int cpu;
|
|
@@ -3350,8 +3358,21 @@ static int mvneta_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (of_device_is_compatible(dn, "marvell,armada-370-neta"))
|
|
|
- pp->tx_csum_limit = 1600;
|
|
|
+ if (!of_property_read_u32(dn, "tx-csum-limit", &tx_csum_limit)) {
|
|
|
+ if (tx_csum_limit < 0 ||
|
|
|
+ tx_csum_limit > MVNETA_TX_CSUM_MAX_SIZE) {
|
|
|
+ tx_csum_limit = MVNETA_TX_CSUM_DEF_SIZE;
|
|
|
+ dev_info(&pdev->dev,
|
|
|
+ "Wrong TX csum limit in DT, set to %dB\n",
|
|
|
+ MVNETA_TX_CSUM_DEF_SIZE);
|
|
|
+ }
|
|
|
+ } else if (of_device_is_compatible(dn, "marvell,armada-370-neta")) {
|
|
|
+ tx_csum_limit = MVNETA_TX_CSUM_DEF_SIZE;
|
|
|
+ } else {
|
|
|
+ tx_csum_limit = MVNETA_TX_CSUM_MAX_SIZE;
|
|
|
+ }
|
|
|
+
|
|
|
+ pp->tx_csum_limit = tx_csum_limit;
|
|
|
|
|
|
pp->tx_ring_size = MVNETA_MAX_TXD;
|
|
|
pp->rx_ring_size = MVNETA_MAX_RXD;
|