All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/5] net: lan743x: PCI1A011/PCI1A014 Enhancment
@ 2022-01-27 17:30 Raju Lakkaraju
  2022-01-27 17:30 ` [PATCH net-next 1/5] net: lan743x: Add PCI1A011/PCI1A041 chip driver Raju Lakkaraju
                   ` (4 more replies)
  0 siblings, 5 replies; 11+ messages in thread
From: Raju Lakkaraju @ 2022-01-27 17:30 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, UNGLinuxDriver

This patch series extends PCI1A011/PCI1A014 chip new features as part of LAN743x chip driver.
PCI1A010/PCI1A014 chip provides a high performance and cost effective PCI-E/Ethernet
bridging solution alone with following enhancments.

  1. PCI-E pipe interface supports 1 Lane at 5GT/s
  2. Supports Multiple - 4 TX and 4 RX channels
  3. Add MSI-X interrupts increased from 8 to 16 and
     Interrupt De-assertion timers increased from 8 to 16
  4. Add support of selection between SGMII and GMII Interface
  5. Add Clause-45 MDIO access


Raju Lakkaraju (5):
  net: lan743x: Add PCI1A011/A041 chip driver
  net: lan743x: Add Tx 4 Queue enhancements
  net: lan743x: Add MSI-X interrupts increased from 8 to 16 and
    Interrupt De-assertion timers increased from 8 to 16
  net: lan743x: Add support of selection between SGMII and GMII
    Interface
  net: lan743x: Add Clause-45 MDIO access

 drivers/net/ethernet/microchip/lan743x_main.c | 277 ++++++++++++++++--
 drivers/net/ethernet/microchip/lan743x_main.h |  57 +++-
 drivers/net/ethernet/microchip/lan743x_ptp.c  |   8 +-
 3 files changed, 305 insertions(+), 37 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH net-next 1/5] net: lan743x: Add PCI1A011/PCI1A041 chip driver
  2022-01-27 17:30 [PATCH net-next 0/5] net: lan743x: PCI1A011/PCI1A014 Enhancment Raju Lakkaraju
@ 2022-01-27 17:30 ` Raju Lakkaraju
  2022-01-27 17:30 ` [PATCH net-next 2/5] net: lan743x: Add Tx 4 Queue enhancements Raju Lakkaraju
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Raju Lakkaraju @ 2022-01-27 17:30 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, UNGLinuxDriver

PCI1A011/PCI1A041 chip is enhancement of Ethernet LAN743x chip family.

Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com>
---
 drivers/net/ethernet/microchip/lan743x_main.c |  6 ++++++
 drivers/net/ethernet/microchip/lan743x_main.h | 10 ++++++++--
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index 8c6390d95158..49eeff8757e5 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -2758,6 +2758,10 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
 	if ((adapter->csr.id_rev & ID_REV_ID_MASK_) == ID_REV_ID_LAN7430_)
 		/* LAN7430 uses internal phy at address 1 */
 		adapter->mdiobus->phy_mask = ~(u32)BIT(1);
+	else if (((adapter->csr.id_rev & ID_REV_ID_MASK_) == ID_REV_ID_PCIA011_) ||
+		 ((adapter->csr.id_rev & ID_REV_ID_MASK_) == ID_REV_ID_PCIA041_))
+		/* PCIA011/PCIA041 uses internal phy at address 1 */
+		adapter->mdiobus->phy_mask = ~(u32)BIT(1);
 
 	/* register mdiobus */
 	ret = mdiobus_register(adapter->mdiobus);
@@ -3056,6 +3060,8 @@ static const struct dev_pm_ops lan743x_pm_ops = {
 static const struct pci_device_id lan743x_pcidev_tbl[] = {
 	{ PCI_DEVICE(PCI_VENDOR_ID_SMSC, PCI_DEVICE_ID_SMSC_LAN7430) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_SMSC, PCI_DEVICE_ID_SMSC_LAN7431) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_SMSC, PCI_DEVICE_ID_SMSC_PCIA011) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_SMSC, PCI_DEVICE_ID_SMSC_PCIA041) },
 	{ 0, }
 };
 
diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/ethernet/microchip/lan743x_main.h
index aaf7aaeaba0c..a9d722f719f9 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.h
+++ b/drivers/net/ethernet/microchip/lan743x_main.h
@@ -16,8 +16,12 @@
 #define ID_REV_ID_MASK_			(0xFFFF0000)
 #define ID_REV_ID_LAN7430_		(0x74300000)
 #define ID_REV_ID_LAN7431_		(0x74310000)
-#define ID_REV_IS_VALID_CHIP_ID_(id_rev)	\
-	(((id_rev) & 0xFFF00000) == 0x74300000)
+#define ID_REV_ID_PCIA011_		(0xA0110000)	// PCI11010
+#define ID_REV_ID_PCIA041_		(0xA0410000)	// PCI11414
+#define ID_REV_IS_VALID_CHIP_ID_(id_rev)	    \
+	((((id_rev) & 0xFFF00000) == 0x74300000) || \
+	 (((id_rev) & 0xFFF00000) == 0xA0100000) || \
+	 (((id_rev) & 0xFFF00000) == 0xA0400000))
 #define ID_REV_CHIP_REV_MASK_		(0x0000FFFF)
 #define ID_REV_CHIP_REV_A0_		(0x00000000)
 #define ID_REV_CHIP_REV_B0_		(0x00000010)
@@ -559,6 +563,8 @@ struct lan743x_adapter;
 #define PCI_VENDOR_ID_SMSC		PCI_VENDOR_ID_EFAR
 #define PCI_DEVICE_ID_SMSC_LAN7430	(0x7430)
 #define PCI_DEVICE_ID_SMSC_LAN7431	(0x7431)
+#define PCI_DEVICE_ID_SMSC_PCIA011	(0xA011)
+#define PCI_DEVICE_ID_SMSC_PCIA041	(0xA041)
 
 #define PCI_CONFIG_LENGTH		(0x1000)
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 2/5] net: lan743x: Add Tx 4 Queue enhancements
  2022-01-27 17:30 [PATCH net-next 0/5] net: lan743x: PCI1A011/PCI1A014 Enhancment Raju Lakkaraju
  2022-01-27 17:30 ` [PATCH net-next 1/5] net: lan743x: Add PCI1A011/PCI1A041 chip driver Raju Lakkaraju
@ 2022-01-27 17:30 ` Raju Lakkaraju
  2022-01-27 17:30 ` [PATCH net-next 3/5] net: lan743x: Add MSI-X interrupts increased from 8 to 16 and Interrupt De-assertion timers increased from 8 to 16 Raju Lakkaraju
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Raju Lakkaraju @ 2022-01-27 17:30 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, UNGLinuxDriver

PCI1A011/PCI1A041 chip support the 4 Tx Queues

Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com>
---
 drivers/net/ethernet/microchip/lan743x_main.c | 85 +++++++++++++++----
 drivers/net/ethernet/microchip/lan743x_main.h | 10 ++-
 drivers/net/ethernet/microchip/lan743x_ptp.c  |  8 +-
 3 files changed, 80 insertions(+), 23 deletions(-)

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index 49eeff8757e5..ce97c8ce8b1c 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -18,6 +18,18 @@
 #include "lan743x_main.h"
 #include "lan743x_ethtool.h"
 
+static bool is_pcia0x1_chip(struct lan743x_adapter *adapter)
+{
+	struct lan743x_csr *csr = &adapter->csr;
+	u32 id_rev = csr->id_rev;
+
+	if (((id_rev & 0xFFFF0000) == ID_REV_ID_PCIA011_) ||
+	    ((id_rev & 0xFFFF0000) == ID_REV_ID_PCIA041_)) {
+		return true;
+	}
+	return false;
+}
+
 static void lan743x_pci_cleanup(struct lan743x_adapter *adapter)
 {
 	pci_release_selected_regions(adapter->pdev,
@@ -250,7 +262,7 @@ static void lan743x_intr_shared_isr(void *context, u32 int_sts, u32 flags)
 		}
 	}
 	if (int_sts & INT_BIT_ALL_TX_) {
-		for (channel = 0; channel < LAN743X_USED_TX_CHANNELS;
+		for (channel = 0; channel < adapter->max_used_tx_channels;
 			channel++) {
 			u32 int_bit = INT_BIT_DMA_TX_(channel);
 
@@ -447,6 +459,7 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
 {
 	struct msix_entry msix_entries[LAN743X_MAX_VECTOR_COUNT];
 	struct lan743x_intr *intr = &adapter->intr;
+	unsigned int max_used_tx_channels;
 	u32 int_vec_en_auto_clr = 0;
 	u32 int_vec_map0 = 0;
 	u32 int_vec_map1 = 0;
@@ -461,9 +474,10 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
 	       sizeof(struct msix_entry) * LAN743X_MAX_VECTOR_COUNT);
 	for (index = 0; index < LAN743X_MAX_VECTOR_COUNT; index++)
 		msix_entries[index].entry = index;
+	max_used_tx_channels = adapter->max_used_tx_channels;
 	ret = pci_enable_msix_range(adapter->pdev,
 				    msix_entries, 1,
-				    1 + LAN743X_USED_TX_CHANNELS +
+				    1 + max_used_tx_channels +
 				    LAN743X_USED_RX_CHANNELS);
 
 	if (ret > 0) {
@@ -570,8 +584,8 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
 	if (intr->number_of_vectors > 1) {
 		int number_of_tx_vectors = intr->number_of_vectors - 1;
 
-		if (number_of_tx_vectors > LAN743X_USED_TX_CHANNELS)
-			number_of_tx_vectors = LAN743X_USED_TX_CHANNELS;
+		if (number_of_tx_vectors > max_used_tx_channels)
+			number_of_tx_vectors = max_used_tx_channels;
 		flags = LAN743X_VECTOR_FLAG_SOURCE_STATUS_READ |
 			LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C |
 			LAN743X_VECTOR_FLAG_SOURCE_ENABLE_CHECK |
@@ -609,9 +623,9 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
 						  INT_VEC_EN_(vector));
 		}
 	}
-	if ((intr->number_of_vectors - LAN743X_USED_TX_CHANNELS) > 1) {
+	if ((intr->number_of_vectors - max_used_tx_channels) > 1) {
 		int number_of_rx_vectors = intr->number_of_vectors -
-					   LAN743X_USED_TX_CHANNELS - 1;
+						max_used_tx_channels - 1;
 
 		if (number_of_rx_vectors > LAN743X_USED_RX_CHANNELS)
 			number_of_rx_vectors = LAN743X_USED_RX_CHANNELS;
@@ -2489,9 +2503,12 @@ static int lan743x_rx_open(struct lan743x_rx *rx)
 static int lan743x_netdev_close(struct net_device *netdev)
 {
 	struct lan743x_adapter *adapter = netdev_priv(netdev);
+	unsigned int max_used_tx_channels;
 	int index;
 
-	lan743x_tx_close(&adapter->tx[0]);
+	max_used_tx_channels = adapter->max_used_tx_channels;
+	for (index = 0; index < max_used_tx_channels; index++)
+		lan743x_tx_close(&adapter->tx[index]);
 
 	for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++)
 		lan743x_rx_close(&adapter->rx[index]);
@@ -2537,12 +2554,19 @@ static int lan743x_netdev_open(struct net_device *netdev)
 			goto close_rx;
 	}
 
-	ret = lan743x_tx_open(&adapter->tx[0]);
-	if (ret)
-		goto close_rx;
-
+	for (index = 0; index < adapter->max_used_tx_channels; index++) {
+		ret = lan743x_tx_open(&adapter->tx[index]);
+		if (ret)
+			goto close_tx;
+	}
 	return 0;
 
+close_tx:
+	for (index = 0; index < adapter->max_used_tx_channels; index++) {
+		if (adapter->tx[index].ring_cpu_ptr)
+			lan743x_tx_close(&adapter->tx[index]);
+	}
+
 close_rx:
 	for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) {
 		if (adapter->rx[index].ring_cpu_ptr)
@@ -2569,8 +2593,12 @@ static netdev_tx_t lan743x_netdev_xmit_frame(struct sk_buff *skb,
 					     struct net_device *netdev)
 {
 	struct lan743x_adapter *adapter = netdev_priv(netdev);
+	u8 ch = 0;
+
+	if (adapter->is_pcia0x1)
+		ch = skb->queue_mapping % PCIA0X1_MAX_TX_CHANNELS;
 
-	return lan743x_tx_xmit_frame(&adapter->tx[0], skb);
+	return lan743x_tx_xmit_frame(&adapter->tx[ch], skb);
 }
 
 static int lan743x_netdev_ioctl(struct net_device *netdev,
@@ -2701,6 +2729,15 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
 	int index;
 	int ret;
 
+	adapter->is_pcia0x1 = is_pcia0x1_chip(adapter);
+	if (adapter->is_pcia0x1) {
+		adapter->max_tx_channels = PCIA0X1_MAX_TX_CHANNELS;
+		adapter->max_used_tx_channels = PCIA0X1_USED_TX_CHANNELS;
+	} else {
+		adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS;
+		adapter->max_used_tx_channels = LAN743X_USED_TX_CHANNELS;
+	}
+
 	adapter->intr.irq = adapter->pdev->irq;
 	lan743x_csr_write(adapter, INT_EN_CLR, 0xFFFFFFFF);
 
@@ -2731,10 +2768,13 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
 		adapter->rx[index].channel_number = index;
 	}
 
-	tx = &adapter->tx[0];
-	tx->adapter = adapter;
-	tx->channel_number = 0;
-	spin_lock_init(&tx->ring_lock);
+	for (index = 0; index < adapter->max_used_tx_channels; index++) {
+		tx = &adapter->tx[index];
+		tx->adapter = adapter;
+		tx->channel_number = index;
+		spin_lock_init(&tx->ring_lock);
+	}
+
 	return 0;
 }
 
@@ -2790,8 +2830,17 @@ static int lan743x_pcidev_probe(struct pci_dev *pdev,
 	struct net_device *netdev = NULL;
 	int ret = -ENODEV;
 
-	netdev = devm_alloc_etherdev(&pdev->dev,
-				     sizeof(struct lan743x_adapter));
+	if ((id->device == (ID_REV_ID_PCIA011_ >> 16)) ||
+	    (id->device == (ID_REV_ID_PCIA041_ >> 16))) {
+		netdev = devm_alloc_etherdev_mqs(&pdev->dev,
+						 sizeof(struct lan743x_adapter),
+						 PCIA0X1_MAX_TX_CHANNELS,
+						 LAN743X_MAX_RX_CHANNELS);
+	} else {
+		netdev = devm_alloc_etherdev(&pdev->dev,
+					     sizeof(struct lan743x_adapter));
+	}
+
 	if (!netdev)
 		goto return_error;
 
diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/ethernet/microchip/lan743x_main.h
index a9d722f719f9..d7b1b5e44518 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.h
+++ b/drivers/net/ethernet/microchip/lan743x_main.h
@@ -545,10 +545,12 @@
 
 #define LAN743X_MAX_RX_CHANNELS		(4)
 #define LAN743X_MAX_TX_CHANNELS		(1)
+#define PCIA0X1_MAX_TX_CHANNELS		(4)
 struct lan743x_adapter;
 
 #define LAN743X_USED_RX_CHANNELS	(4)
 #define LAN743X_USED_TX_CHANNELS	(1)
+#define PCIA0X1_USED_TX_CHANNELS	(4)
 #define LAN743X_INT_MOD	(400)
 
 #if (LAN743X_USED_RX_CHANNELS > LAN743X_MAX_RX_CHANNELS)
@@ -557,6 +559,9 @@ struct lan743x_adapter;
 #if (LAN743X_USED_TX_CHANNELS > LAN743X_MAX_TX_CHANNELS)
 #error Invalid LAN743X_USED_TX_CHANNELS
 #endif
+#if (PCIA0X1_USED_TX_CHANNELS > PCIA0X1_MAX_TX_CHANNELS)
+#error Invalid PCIA0X1_USED_TX_CHANNELS
+#endif
 
 /* PCI */
 /* SMSC acquired EFAR late 1990's, MCHP acquired SMSC 2012 */
@@ -727,8 +732,11 @@ struct lan743x_adapter {
 	u8			mac_address[ETH_ALEN];
 
 	struct lan743x_phy      phy;
-	struct lan743x_tx       tx[LAN743X_MAX_TX_CHANNELS];
+	struct lan743x_tx       tx[PCIA0X1_MAX_TX_CHANNELS];
 	struct lan743x_rx       rx[LAN743X_MAX_RX_CHANNELS];
+	bool			is_pcia0x1;
+	u8			max_tx_channels;
+	u8			max_used_tx_channels;
 
 #define LAN743X_ADAPTER_FLAG_OTP		BIT(0)
 	u32			flags;
diff --git a/drivers/net/ethernet/microchip/lan743x_ptp.c b/drivers/net/ethernet/microchip/lan743x_ptp.c
index 8b7a8d879083..e0e8bc352134 100644
--- a/drivers/net/ethernet/microchip/lan743x_ptp.c
+++ b/drivers/net/ethernet/microchip/lan743x_ptp.c
@@ -1307,21 +1307,21 @@ int lan743x_ptp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
 
 	switch (config.tx_type) {
 	case HWTSTAMP_TX_OFF:
-		for (index = 0; index < LAN743X_MAX_TX_CHANNELS;
-			index++)
+		for (index = 0; index < adapter->max_tx_channels;
+		     index++)
 			lan743x_tx_set_timestamping_mode(&adapter->tx[index],
 							 false, false);
 		lan743x_ptp_set_sync_ts_insert(adapter, false);
 		break;
 	case HWTSTAMP_TX_ON:
-		for (index = 0; index < LAN743X_MAX_TX_CHANNELS;
+		for (index = 0; index < adapter->max_tx_channels;
 			index++)
 			lan743x_tx_set_timestamping_mode(&adapter->tx[index],
 							 true, false);
 		lan743x_ptp_set_sync_ts_insert(adapter, false);
 		break;
 	case HWTSTAMP_TX_ONESTEP_SYNC:
-		for (index = 0; index < LAN743X_MAX_TX_CHANNELS;
+		for (index = 0; index < adapter->max_tx_channels;
 			index++)
 			lan743x_tx_set_timestamping_mode(&adapter->tx[index],
 							 true, true);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 3/5] net: lan743x: Add MSI-X interrupts increased from 8 to 16 and Interrupt De-assertion timers increased from 8 to 16
  2022-01-27 17:30 [PATCH net-next 0/5] net: lan743x: PCI1A011/PCI1A014 Enhancment Raju Lakkaraju
  2022-01-27 17:30 ` [PATCH net-next 1/5] net: lan743x: Add PCI1A011/PCI1A041 chip driver Raju Lakkaraju
  2022-01-27 17:30 ` [PATCH net-next 2/5] net: lan743x: Add Tx 4 Queue enhancements Raju Lakkaraju
@ 2022-01-27 17:30 ` Raju Lakkaraju
  2022-01-27 17:30 ` [PATCH net-next 4/5] net: lan743x: Add support of selection between SGMII and GMII Interface Raju Lakkaraju
  2022-01-27 17:30 ` [PATCH net-next 5/5] net: lan743x: Add Clause-45 MDIO access Raju Lakkaraju
  4 siblings, 0 replies; 11+ messages in thread
From: Raju Lakkaraju @ 2022-01-27 17:30 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, UNGLinuxDriver

PCI1A011/PCI1A041 support upto 16 MSI-X interrupts and 16 De-assertion timers

Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com>
---
 drivers/net/ethernet/microchip/lan743x_main.c | 37 +++++++++++++++----
 drivers/net/ethernet/microchip/lan743x_main.h |  6 ++-
 2 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index ce97c8ce8b1c..daba17b0ad6c 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -422,7 +422,7 @@ static u32 lan743x_intr_get_vector_flags(struct lan743x_adapter *adapter,
 {
 	int index;
 
-	for (index = 0; index < LAN743X_MAX_VECTOR_COUNT; index++) {
+	for (index = 0; index < adapter->max_vector_counter; index++) {
 		if (adapter->intr.vector_list[index].int_mask & int_mask)
 			return adapter->intr.vector_list[index].flags;
 	}
@@ -435,9 +435,12 @@ static void lan743x_intr_close(struct lan743x_adapter *adapter)
 	int index = 0;
 
 	lan743x_csr_write(adapter, INT_EN_CLR, INT_BIT_MAS_);
-	lan743x_csr_write(adapter, INT_VEC_EN_CLR, 0x000000FF);
+	if (adapter->is_pcia0x1)
+		lan743x_csr_write(adapter, INT_VEC_EN_CLR, 0x0000FFFF);
+	else
+		lan743x_csr_write(adapter, INT_VEC_EN_CLR, 0x000000FF);
 
-	for (index = 0; index < LAN743X_MAX_VECTOR_COUNT; index++) {
+	for (index = 0; index < intr->number_of_vectors; index++) {
 		if (intr->flags & INTR_FLAG_IRQ_REQUESTED(index)) {
 			lan743x_intr_unregister_isr(adapter, index);
 			intr->flags &= ~INTR_FLAG_IRQ_REQUESTED(index);
@@ -457,10 +460,11 @@ static void lan743x_intr_close(struct lan743x_adapter *adapter)
 
 static int lan743x_intr_open(struct lan743x_adapter *adapter)
 {
-	struct msix_entry msix_entries[LAN743X_MAX_VECTOR_COUNT];
+	struct msix_entry msix_entries[PCIA0X1_MAX_VECTOR_COUNT];
 	struct lan743x_intr *intr = &adapter->intr;
 	unsigned int max_used_tx_channels;
 	u32 int_vec_en_auto_clr = 0;
+	u8 max_vector_counter;
 	u32 int_vec_map0 = 0;
 	u32 int_vec_map1 = 0;
 	int ret = -ENODEV;
@@ -470,9 +474,10 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
 	intr->number_of_vectors = 0;
 
 	/* Try to set up MSIX interrupts */
+	max_vector_counter = adapter->max_vector_counter;
 	memset(&msix_entries[0], 0,
-	       sizeof(struct msix_entry) * LAN743X_MAX_VECTOR_COUNT);
-	for (index = 0; index < LAN743X_MAX_VECTOR_COUNT; index++)
+	       sizeof(struct msix_entry) * max_vector_counter);
+	for (index = 0; index < max_vector_counter; index++)
 		msix_entries[index].entry = index;
 	max_used_tx_channels = adapter->max_used_tx_channels;
 	ret = pci_enable_msix_range(adapter->pdev,
@@ -561,7 +566,21 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
 		lan743x_csr_write(adapter, INT_VEC_EN_SET,
 				  INT_VEC_EN_(0));
 
-	if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) {
+	if (adapter->is_pcia0x1) {
+		lan743x_csr_write(adapter, INT_MOD_CFG0, LAN743X_INT_MOD);
+		lan743x_csr_write(adapter, INT_MOD_CFG1, LAN743X_INT_MOD);
+		lan743x_csr_write(adapter, INT_MOD_CFG2, LAN743X_INT_MOD);
+		lan743x_csr_write(adapter, INT_MOD_CFG3, LAN743X_INT_MOD);
+		lan743x_csr_write(adapter, INT_MOD_CFG4, LAN743X_INT_MOD);
+		lan743x_csr_write(adapter, INT_MOD_CFG5, LAN743X_INT_MOD);
+		lan743x_csr_write(adapter, INT_MOD_CFG6, LAN743X_INT_MOD);
+		lan743x_csr_write(adapter, INT_MOD_CFG7, LAN743X_INT_MOD);
+		lan743x_csr_write(adapter, INT_MOD_CFG8, LAN743X_INT_MOD);
+		lan743x_csr_write(adapter, INT_MOD_CFG9, LAN743X_INT_MOD);
+		lan743x_csr_write(adapter, INT_MOD_MAP0, 0x00008765);
+		lan743x_csr_write(adapter, INT_MOD_MAP1, 0x00004321);
+		lan743x_csr_write(adapter, INT_MOD_MAP2, 0x00FFFFFF);
+	} else if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) {
 		lan743x_csr_write(adapter, INT_MOD_CFG0, LAN743X_INT_MOD);
 		lan743x_csr_write(adapter, INT_MOD_CFG1, LAN743X_INT_MOD);
 		lan743x_csr_write(adapter, INT_MOD_CFG2, LAN743X_INT_MOD);
@@ -646,7 +665,7 @@ static int lan743x_intr_open(struct lan743x_adapter *adapter)
 				LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR;
 		}
 		for (index = 0; index < number_of_rx_vectors; index++) {
-			int vector = index + 1 + LAN743X_USED_TX_CHANNELS;
+			int vector = index + 1 + max_used_tx_channels;
 			u32 int_bit = INT_BIT_DMA_RX_(index);
 
 			/* map RX interrupt to vector */
@@ -2733,9 +2752,11 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
 	if (adapter->is_pcia0x1) {
 		adapter->max_tx_channels = PCIA0X1_MAX_TX_CHANNELS;
 		adapter->max_used_tx_channels = PCIA0X1_USED_TX_CHANNELS;
+		adapter->max_vector_counter = PCIA0X1_MAX_VECTOR_COUNT;
 	} else {
 		adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS;
 		adapter->max_used_tx_channels = LAN743X_USED_TX_CHANNELS;
+		adapter->max_vector_counter = LAN743X_MAX_VECTOR_COUNT;
 	}
 
 	adapter->intr.irq = adapter->pdev->irq;
diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/ethernet/microchip/lan743x_main.h
index d7b1b5e44518..9c6bb8be2013 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.h
+++ b/drivers/net/ethernet/microchip/lan743x_main.h
@@ -265,6 +265,8 @@
 #define INT_MOD_CFG5			(0x7D4)
 #define INT_MOD_CFG6			(0x7D8)
 #define INT_MOD_CFG7			(0x7DC)
+#define INT_MOD_CFG8			(0x7E0)
+#define INT_MOD_CFG9			(0x7E4)
 
 #define PTP_CMD_CTL					(0x0A00)
 #define PTP_CMD_CTL_PTP_CLK_STP_NSEC_			BIT(6)
@@ -618,13 +620,14 @@ struct lan743x_vector {
 };
 
 #define LAN743X_MAX_VECTOR_COUNT	(8)
+#define PCIA0X1_MAX_VECTOR_COUNT	(16)
 
 struct lan743x_intr {
 	int			flags;
 
 	unsigned int		irq;
 
-	struct lan743x_vector	vector_list[LAN743X_MAX_VECTOR_COUNT];
+	struct lan743x_vector	vector_list[PCIA0X1_MAX_VECTOR_COUNT];
 	int			number_of_vectors;
 	bool			using_vectors;
 
@@ -737,6 +740,7 @@ struct lan743x_adapter {
 	bool			is_pcia0x1;
 	u8			max_tx_channels;
 	u8			max_used_tx_channels;
+	u8			max_vector_counter;
 
 #define LAN743X_ADAPTER_FLAG_OTP		BIT(0)
 	u32			flags;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 4/5] net: lan743x: Add support of selection between SGMII and GMII Interface
  2022-01-27 17:30 [PATCH net-next 0/5] net: lan743x: PCI1A011/PCI1A014 Enhancment Raju Lakkaraju
                   ` (2 preceding siblings ...)
  2022-01-27 17:30 ` [PATCH net-next 3/5] net: lan743x: Add MSI-X interrupts increased from 8 to 16 and Interrupt De-assertion timers increased from 8 to 16 Raju Lakkaraju
@ 2022-01-27 17:30 ` Raju Lakkaraju
  2022-01-27 22:08   ` Andrew Lunn
  2022-01-27 17:30 ` [PATCH net-next 5/5] net: lan743x: Add Clause-45 MDIO access Raju Lakkaraju
  4 siblings, 1 reply; 11+ messages in thread
From: Raju Lakkaraju @ 2022-01-27 17:30 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, UNGLinuxDriver

PCI1A011/PCI1A041 chip suuport SGMII interface

Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com>
---
 drivers/net/ethernet/microchip/lan743x_main.c | 39 +++++++++++++++++++
 drivers/net/ethernet/microchip/lan743x_main.h | 15 +++++++
 2 files changed, 54 insertions(+)

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index daba17b0ad6c..6f6655eb6438 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -2801,6 +2801,8 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
 
 static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
 {
+	u32 sgmii_ctl;
+	u32 chip_ver;
 	int ret;
 
 	adapter->mdiobus = devm_mdiobus_alloc(&adapter->pdev->dev);
@@ -2809,6 +2811,43 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
 		goto return_error;
 	}
 
+	/* GPY211 Interface enable */
+	chip_ver = lan743x_csr_read(adapter, FPGA_REV);
+	if (chip_ver) {
+		netif_info(adapter, drv, adapter->netdev,
+			   "FPGA Image version: 0x%08X\n", chip_ver);
+		if (chip_ver & FPGA_SGMII_OP) {
+			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
+			sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_;
+			sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
+			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
+			netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
+		} else {
+			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
+			sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
+			sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
+			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
+			netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
+		}
+	} else {
+		chip_ver = lan743x_csr_read(adapter, STRAP_READ);
+		netif_info(adapter, drv, adapter->netdev,
+			   "ASIC Image version: 0x%08X\n", chip_ver);
+		if (chip_ver & STRAP_READ_SGMII_EN_) {
+			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
+			sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_;
+			sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
+			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
+			netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
+		} else {
+			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
+			sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
+			sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
+			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
+			netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
+		}
+	}
+
 	adapter->mdiobus->priv = (void *)adapter;
 	adapter->mdiobus->read = lan743x_mdiobus_read;
 	adapter->mdiobus->write = lan743x_mdiobus_write;
diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/ethernet/microchip/lan743x_main.h
index 9c6bb8be2013..233555dd5464 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.h
+++ b/drivers/net/ethernet/microchip/lan743x_main.h
@@ -29,6 +29,16 @@
 #define FPGA_REV			(0x04)
 #define FPGA_REV_GET_MINOR_(fpga_rev)	(((fpga_rev) >> 8) & 0x000000FF)
 #define FPGA_REV_GET_MAJOR_(fpga_rev)	((fpga_rev) & 0x000000FF)
+#define FPGA_SGMII_OP			BIT(24)
+
+#define STRAP_READ			(0x0C)
+#define STRAP_READ_SGMII_EN_		BIT(6)
+#define STRAP_READ_SGMII_REFCLK_	BIT(5)
+#define STRAP_READ_SGMII_2_5G_		BIT(4)
+#define STRAP_READ_BASE_X_		BIT(3)
+#define STRAP_READ_RGMII_TXC_DELAY_EN_	BIT(2)
+#define STRAP_READ_RGMII_RXC_DELAY_EN_	BIT(1)
+#define STRAP_READ_ADV_PM_DISABLE_	BIT(0)
 
 #define HW_CFG					(0x010)
 #define HW_CFG_RELOAD_TYPE_ALL_			(0x00000FC0)
@@ -218,6 +228,11 @@
 
 #define MAC_WUCSR2			(0x600)
 
+#define SGMII_CTL			(0x728)
+#define SGMII_CTL_SGMII_ENABLE_		BIT(31)
+#define SGMII_CTL_LINK_STATUS_SOURCE_	BIT(8)
+#define SGMII_CTL_SGMII_POWER_DN_	BIT(1)
+
 #define INT_STS				(0x780)
 #define INT_BIT_DMA_RX_(channel)	BIT(24 + (channel))
 #define INT_BIT_ALL_RX_			(0x0F000000)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 5/5] net: lan743x: Add Clause-45 MDIO access
  2022-01-27 17:30 [PATCH net-next 0/5] net: lan743x: PCI1A011/PCI1A014 Enhancment Raju Lakkaraju
                   ` (3 preceding siblings ...)
  2022-01-27 17:30 ` [PATCH net-next 4/5] net: lan743x: Add support of selection between SGMII and GMII Interface Raju Lakkaraju
@ 2022-01-27 17:30 ` Raju Lakkaraju
  2022-01-27 22:23   ` Andrew Lunn
  4 siblings, 1 reply; 11+ messages in thread
From: Raju Lakkaraju @ 2022-01-27 17:30 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, UNGLinuxDriver

PCI1A011/PCI1A041 chip support the MDIO Clause-45 access

Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com>
---
 drivers/net/ethernet/microchip/lan743x_main.c | 110 +++++++++++++++++-
 drivers/net/ethernet/microchip/lan743x_main.h |  16 +++
 2 files changed, 123 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index 6f6655eb6438..98d346aaf627 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -793,6 +793,95 @@ static int lan743x_mdiobus_write(struct mii_bus *bus,
 	return ret;
 }
 
+static u32 lan743x_mac_mmd_access(int id, int index, int op, u8 freq)
+{
+	u16 dev_addr;
+	u32 ret;
+
+	dev_addr = (index >> 16) & 0x1f;
+	ret = (id << MAC_MII_ACC_PHY_ADDR_SHIFT_) &
+		MAC_MII_ACC_PHY_ADDR_MASK_;
+	ret |= (dev_addr << MAC_MII_ACC_MIIMMD_SHIFT_) &
+		MAC_MII_ACC_MIIMMD_MASK_;
+	if (freq)
+		ret |= (freq << MAC_MII_ACC_MDC_CYCLE_SHIFT_) &
+			MAC_MII_ACC_MDC_CYCLE_MASK_;
+	if (op == 1)
+		ret |= MAC_MII_ACC_MIICMD_WRITE_;
+	else if (op == 2)
+		ret |= MAC_MII_ACC_MIICMD_READ_;
+	else if (op == 3)
+		ret |= MAC_MII_ACC_MIICMD_READ_INC_;
+	else
+		ret |= MAC_MII_ACC_MIICMD_ADDR_;
+	ret |= (MAC_MII_ACC_MII_BUSY_ | MAC_MII_ACC_MIICL45_);
+
+	return ret;
+}
+
+static int lan743x_mdiobus_c45_read(struct mii_bus *bus, int phy_id, int index)
+{
+	struct lan743x_adapter *adapter = bus->priv;
+	u32 mmd_access;
+	int ret;
+
+	/* comfirm MII not busy */
+	ret = lan743x_mac_mii_wait_till_not_busy(adapter);
+	if (ret < 0)
+		return ret;
+	if (index & MII_ADDR_C45) {
+		/* Load Register Address */
+		lan743x_csr_write(adapter, MAC_MII_DATA, (u32)(index & 0xffff));
+		mmd_access = lan743x_mac_mmd_access(phy_id, index, 0, 0);
+		lan743x_csr_write(adapter, MAC_MII_ACC, mmd_access);
+		ret = lan743x_mac_mii_wait_till_not_busy(adapter);
+		if (ret < 0)
+			return ret;
+		/* Read Data */
+		mmd_access = lan743x_mac_mmd_access(phy_id, index, 2, 0);
+		lan743x_csr_write(adapter, MAC_MII_ACC, mmd_access);
+		ret = lan743x_mac_mii_wait_till_not_busy(adapter);
+		if (ret < 0)
+			return ret;
+		ret = lan743x_csr_read(adapter, MAC_MII_DATA);
+		return (int)(ret & 0xFFFF);
+	}
+
+	ret = lan743x_mdiobus_read(bus, phy_id, index);
+	return ret;
+}
+
+static int lan743x_mdiobus_c45_write(struct mii_bus *bus,
+				     int phy_id, int index, u16 regval)
+{
+	struct lan743x_adapter *adapter = bus->priv;
+	u32 mmd_access;
+	int ret;
+
+	/* confirm MII not busy */
+	ret = lan743x_mac_mii_wait_till_not_busy(adapter);
+	if (ret < 0)
+		return ret;
+	if (index & MII_ADDR_C45) {
+		/* Load Register Address */
+		lan743x_csr_write(adapter, MAC_MII_DATA, (u32)(index & 0xffff));
+		mmd_access = lan743x_mac_mmd_access(phy_id, index, 0, 0);
+		lan743x_csr_write(adapter, MAC_MII_ACC, mmd_access);
+		ret = lan743x_mac_mii_wait_till_not_busy(adapter);
+		if (ret < 0)
+			return ret;
+		/* Write Data */
+		lan743x_csr_write(adapter, MAC_MII_DATA, (u32)regval);
+		mmd_access = lan743x_mac_mmd_access(phy_id, index, 1, 0);
+		lan743x_csr_write(adapter, MAC_MII_ACC, mmd_access);
+		ret = lan743x_mac_mii_wait_till_not_busy(adapter);
+	} else {
+		ret = lan743x_mdiobus_write(bus, phy_id, index, regval);
+	}
+
+	return ret;
+}
+
 static void lan743x_mac_set_address(struct lan743x_adapter *adapter,
 				    u8 *addr)
 {
@@ -1053,6 +1142,9 @@ static int lan743x_phy_open(struct lan743x_adapter *adapter)
 					 PHY_INTERFACE_MODE_GMII);
 		if (ret)
 			goto return_error;
+
+		if (adapter->mdiobus->probe_capabilities == MDIOBUS_C45)
+			phydev->c45_ids.devices_in_package &= ~BIT(0);
 	}
 
 	/* MAC doesn't support 1000T Half */
@@ -2822,12 +2914,14 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
 			sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
 			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
 			netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
+			adapter->mdiobus->probe_capabilities = MDIOBUS_C22_C45;
 		} else {
 			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
 			sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
 			sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
 			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
 			netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
+			adapter->mdiobus->probe_capabilities = MDIOBUS_C22;
 		}
 	} else {
 		chip_ver = lan743x_csr_read(adapter, STRAP_READ);
@@ -2839,19 +2933,29 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
 			sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
 			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
 			netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
+			adapter->mdiobus->probe_capabilities = MDIOBUS_C22_C45;
 		} else {
 			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
 			sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
 			sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
 			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
 			netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
+			adapter->mdiobus->probe_capabilities = MDIOBUS_C22;
 		}
 	}
 
 	adapter->mdiobus->priv = (void *)adapter;
-	adapter->mdiobus->read = lan743x_mdiobus_read;
-	adapter->mdiobus->write = lan743x_mdiobus_write;
-	adapter->mdiobus->name = "lan743x-mdiobus";
+	if (adapter->mdiobus->probe_capabilities == MDIOBUS_C45 ||
+	    adapter->mdiobus->probe_capabilities == MDIOBUS_C22_C45) {
+		adapter->mdiobus->read = lan743x_mdiobus_c45_read;
+		adapter->mdiobus->write = lan743x_mdiobus_c45_write;
+		adapter->mdiobus->name = "lan743x-mdiobus-c45";
+	} else {
+		adapter->mdiobus->read = lan743x_mdiobus_read;
+		adapter->mdiobus->write = lan743x_mdiobus_write;
+		adapter->mdiobus->name = "lan743x-mdiobus";
+	}
+
 	snprintf(adapter->mdiobus->id, MII_BUS_ID_SIZE,
 		 "pci-%s", pci_name(adapter->pdev));
 
diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/ethernet/microchip/lan743x_main.h
index 233555dd5464..12facf905eaa 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.h
+++ b/drivers/net/ethernet/microchip/lan743x_main.h
@@ -149,6 +149,13 @@
 #define MAC_RX_ADDRL			(0x11C)
 
 #define MAC_MII_ACC			(0x120)
+#define MAC_MII_ACC_MDC_CYCLE_SHIFT_	(16)
+#define MAC_MII_ACC_MDC_CYCLE_MASK_	(0x00070000)
+#define MAC_MII_ACC_MDC_CYCLE_2_5MHZ_	(0)
+#define MAC_MII_ACC_MDC_CYCLE_5MHZ_	(1)
+#define MAC_MII_ACC_MDC_CYCLE_12_5MHZ_	(2)
+#define MAC_MII_ACC_MDC_CYCLE_25MHZ_	(3)
+#define MAC_MII_ACC_MDC_CYCLE_1_25MHZ_	(4)
 #define MAC_MII_ACC_PHY_ADDR_SHIFT_	(11)
 #define MAC_MII_ACC_PHY_ADDR_MASK_	(0x0000F800)
 #define MAC_MII_ACC_MIIRINDA_SHIFT_	(6)
@@ -157,6 +164,15 @@
 #define MAC_MII_ACC_MII_WRITE_		(0x00000002)
 #define MAC_MII_ACC_MII_BUSY_		BIT(0)
 
+#define MAC_MII_ACC_MIIMMD_SHIFT_	(6)
+#define MAC_MII_ACC_MIIMMD_MASK_	(0x000007C0)
+#define MAC_MII_ACC_MIICL45_		BIT(3)
+#define MAC_MII_ACC_MIICMD_MASK_	(0x00000006)
+#define MAC_MII_ACC_MIICMD_ADDR_	(0x00000000)
+#define MAC_MII_ACC_MIICMD_WRITE_	(0x00000002)
+#define MAC_MII_ACC_MIICMD_READ_	(0x00000004)
+#define MAC_MII_ACC_MIICMD_READ_INC_	(0x00000006)
+
 #define MAC_MII_DATA			(0x124)
 
 #define MAC_EEE_TX_LPI_REQ_DLY_CNT		(0x130)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 4/5] net: lan743x: Add support of selection between SGMII and GMII Interface
  2022-01-27 17:30 ` [PATCH net-next 4/5] net: lan743x: Add support of selection between SGMII and GMII Interface Raju Lakkaraju
@ 2022-01-27 22:08   ` Andrew Lunn
  2022-01-31 18:09     ` Raju Lakkaraju
  0 siblings, 1 reply; 11+ messages in thread
From: Andrew Lunn @ 2022-01-27 22:08 UTC (permalink / raw)
  To: Raju Lakkaraju; +Cc: netdev, davem, kuba, UNGLinuxDriver

> +	/* GPY211 Interface enable */
> +	chip_ver = lan743x_csr_read(adapter, FPGA_REV);
> +	if (chip_ver) {
> +		netif_info(adapter, drv, adapter->netdev,
> +			   "FPGA Image version: 0x%08X\n", chip_ver);

We try to avoid spamming the kernel logs, so:

netif_dbg()

> +		if (chip_ver & FPGA_SGMII_OP) {
> +			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> +			sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_;
> +			sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
> +			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> +			netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
> +		} else {
> +			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> +			sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
> +			sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
> +			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> +			netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
> +		}
> +	} else {
> +		chip_ver = lan743x_csr_read(adapter, STRAP_READ);
> +		netif_info(adapter, drv, adapter->netdev,
> +			   "ASIC Image version: 0x%08X\n", chip_ver);

Here as well

> +		if (chip_ver & STRAP_READ_SGMII_EN_) {
> +			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> +			sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_;
> +			sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
> +			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> +			netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");

And def initially this and the next one.

> +		} else {
> +			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> +			sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
> +			sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
> +			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> +			netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
> +		}
> +	}

  Andrew

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 5/5] net: lan743x: Add Clause-45 MDIO access
  2022-01-27 17:30 ` [PATCH net-next 5/5] net: lan743x: Add Clause-45 MDIO access Raju Lakkaraju
@ 2022-01-27 22:23   ` Andrew Lunn
  2022-01-31 18:14     ` Raju Lakkaraju
  0 siblings, 1 reply; 11+ messages in thread
From: Andrew Lunn @ 2022-01-27 22:23 UTC (permalink / raw)
  To: Raju Lakkaraju; +Cc: netdev, davem, kuba, UNGLinuxDriver

On Thu, Jan 27, 2022 at 11:00:55PM +0530, Raju Lakkaraju wrote:
> PCI1A011/PCI1A041 chip support the MDIO Clause-45 access
> 
> Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com>
> ---
>  drivers/net/ethernet/microchip/lan743x_main.c | 110 +++++++++++++++++-
>  drivers/net/ethernet/microchip/lan743x_main.h |  16 +++
>  2 files changed, 123 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
> index 6f6655eb6438..98d346aaf627 100644
> --- a/drivers/net/ethernet/microchip/lan743x_main.c
> +++ b/drivers/net/ethernet/microchip/lan743x_main.c
> @@ -793,6 +793,95 @@ static int lan743x_mdiobus_write(struct mii_bus *bus,
>  	return ret;
>  }
>  
> +static u32 lan743x_mac_mmd_access(int id, int index, int op, u8 freq)
> +{
> +	u16 dev_addr;
> +	u32 ret;
> +
> +	dev_addr = (index >> 16) & 0x1f;
> +	ret = (id << MAC_MII_ACC_PHY_ADDR_SHIFT_) &
> +		MAC_MII_ACC_PHY_ADDR_MASK_;
> +	ret |= (dev_addr << MAC_MII_ACC_MIIMMD_SHIFT_) &
> +		MAC_MII_ACC_MIIMMD_MASK_;
> +	if (freq)
> +		ret |= (freq << MAC_MII_ACC_MDC_CYCLE_SHIFT_) &
> +			MAC_MII_ACC_MDC_CYCLE_MASK_;

All callers of this function appear to pass freq as 0. So you can
remove this.

> +	if (op == 1)
> +		ret |= MAC_MII_ACC_MIICMD_WRITE_;
> +	else if (op == 2)
> +		ret |= MAC_MII_ACC_MIICMD_READ_;
> +	else if (op == 3)
> +		ret |= MAC_MII_ACC_MIICMD_READ_INC_;
> +	else
> +		ret |= MAC_MII_ACC_MIICMD_ADDR_;

> +		mmd_access = lan743x_mac_mmd_access(phy_id, index, 0, 0);

It is pretty opaque what the 0 means here. How about you actually pass
MAC_MII_ACC_MIICMD_ values?

lan743x_mac_mmd_access(phy_id, index, );

> +		if (adapter->mdiobus->probe_capabilities == MDIOBUS_C45)
> +			phydev->c45_ids.devices_in_package &= ~BIT(0);
>  	}

A MAC driver should not be modifying the phydev structure.

>  	/* MAC doesn't support 1000T Half */
> @@ -2822,12 +2914,14 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
>  			sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
>  			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
>  			netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
> +			adapter->mdiobus->probe_capabilities = MDIOBUS_C22_C45;
>  		} else {
>  			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
>  			sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
>  			sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
>  			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
>  			netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
> +			adapter->mdiobus->probe_capabilities = MDIOBUS_C22;
>  		}
>  	} else {
>  		chip_ver = lan743x_csr_read(adapter, STRAP_READ);
> @@ -2839,19 +2933,29 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
>  			sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
>  			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
>  			netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
> +			adapter->mdiobus->probe_capabilities = MDIOBUS_C22_C45;
>  		} else {
>  			sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
>  			sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
>  			sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
>  			lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
>  			netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
> +			adapter->mdiobus->probe_capabilities = MDIOBUS_C22;

This manipulation of adapter->mdiobus->probe_capabilities based on
SGMII vs RGMII makes no sense. It should be set based on what the bus
master can actually do. I assume the PCI1A011/PCI1A041 can do both C22
and C45. So it should look at the reg value and either do a C45
transaction, or a C22 transaction. Do the older chips not support C45?
In that case, return -EOPNOTSUPP if asked to do a C45 transaction.

	Andrew

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 4/5] net: lan743x: Add support of selection between SGMII and GMII Interface
  2022-01-27 22:08   ` Andrew Lunn
@ 2022-01-31 18:09     ` Raju Lakkaraju
  2022-01-31 21:38       ` Andrew Lunn
  0 siblings, 1 reply; 11+ messages in thread
From: Raju Lakkaraju @ 2022-01-31 18:09 UTC (permalink / raw)
  To: Andrew Lunn; +Cc: netdev, davem, kuba, UNGLinuxDriver

Hi Andrew,

Thank you for review comments.

The 01/27/2022 23:08, Andrew Lunn wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> 
> > +     /* GPY211 Interface enable */
> > +     chip_ver = lan743x_csr_read(adapter, FPGA_REV);
> > +     if (chip_ver) {
> > +             netif_info(adapter, drv, adapter->netdev,
> > +                        "FPGA Image version: 0x%08X\n", chip_ver);
> 
> We try to avoid spamming the kernel logs, so:
> 
> netif_dbg()
> 

Accepted. I will change

> > +             if (chip_ver & FPGA_SGMII_OP) {
> > +                     sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> > +                     sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_;
> > +                     sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
> > +                     lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> > +                     netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
> > +             } else {
> > +                     sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> > +                     sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
> > +                     sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
> > +                     lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> > +                     netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
> > +             }
> > +     } else {
> > +             chip_ver = lan743x_csr_read(adapter, STRAP_READ);
> > +             netif_info(adapter, drv, adapter->netdev,
> > +                        "ASIC Image version: 0x%08X\n", chip_ver);
> 
> Here as well
> 

Accepted. I will change.

> > +             if (chip_ver & STRAP_READ_SGMII_EN_) {
> > +                     sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> > +                     sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_;
> > +                     sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
> > +                     lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> > +                     netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
> 
> And def initially this and the next one.
> 

I did not get "def initially" means ?
Can you please some more information about this comment ?


> > +             } else {
> > +                     sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> > +                     sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
> > +                     sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
> > +                     lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> > +                     netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
> > +             }
> > +     }
> 
>   Andrew

-- 

Thanks,
Raju


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 5/5] net: lan743x: Add Clause-45 MDIO access
  2022-01-27 22:23   ` Andrew Lunn
@ 2022-01-31 18:14     ` Raju Lakkaraju
  0 siblings, 0 replies; 11+ messages in thread
From: Raju Lakkaraju @ 2022-01-31 18:14 UTC (permalink / raw)
  To: Andrew Lunn; +Cc: netdev, davem, kuba, UNGLinuxDriver

Hi Andrew,

Thank you for review comments.

The 01/27/2022 23:23, Andrew Lunn wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> 
> On Thu, Jan 27, 2022 at 11:00:55PM +0530, Raju Lakkaraju wrote:
> > PCI1A011/PCI1A041 chip support the MDIO Clause-45 access
> >
> > Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com>
> > ---
> >  drivers/net/ethernet/microchip/lan743x_main.c | 110 +++++++++++++++++-
> >  drivers/net/ethernet/microchip/lan743x_main.h |  16 +++
> >  2 files changed, 123 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
> > index 6f6655eb6438..98d346aaf627 100644
> > --- a/drivers/net/ethernet/microchip/lan743x_main.c
> > +++ b/drivers/net/ethernet/microchip/lan743x_main.c
> > @@ -793,6 +793,95 @@ static int lan743x_mdiobus_write(struct mii_bus *bus,
> >       return ret;
> >  }
> >
> > +static u32 lan743x_mac_mmd_access(int id, int index, int op, u8 freq)
> > +{
> > +     u16 dev_addr;
> > +     u32 ret;
> > +
> > +     dev_addr = (index >> 16) & 0x1f;
> > +     ret = (id << MAC_MII_ACC_PHY_ADDR_SHIFT_) &
> > +             MAC_MII_ACC_PHY_ADDR_MASK_;
> > +     ret |= (dev_addr << MAC_MII_ACC_MIIMMD_SHIFT_) &
> > +             MAC_MII_ACC_MIIMMD_MASK_;
> > +     if (freq)
> > +             ret |= (freq << MAC_MII_ACC_MDC_CYCLE_SHIFT_) &
> > +                     MAC_MII_ACC_MDC_CYCLE_MASK_;
> 
> All callers of this function appear to pass freq as 0. So you can
> remove this.
> 

Accepted.
Yes. Currently frequency is not programming.
I will change.

> > +     if (op == 1)
> > +             ret |= MAC_MII_ACC_MIICMD_WRITE_;
> > +     else if (op == 2)
> > +             ret |= MAC_MII_ACC_MIICMD_READ_;
> > +     else if (op == 3)
> > +             ret |= MAC_MII_ACC_MIICMD_READ_INC_;
> > +     else
> > +             ret |= MAC_MII_ACC_MIICMD_ADDR_;
> 
> > +             mmd_access = lan743x_mac_mmd_access(phy_id, index, 0, 0);
> 
> It is pretty opaque what the 0 means here. How about you actually pass
> MAC_MII_ACC_MIICMD_ values?
> 
> lan743x_mac_mmd_access(phy_id, index, );
> 

Accepted. I will change

> > +             if (adapter->mdiobus->probe_capabilities == MDIOBUS_C45)
> > +                     phydev->c45_ids.devices_in_package &= ~BIT(0);
> >       }
> 
> A MAC driver should not be modifying the phydev structure.
> 

Accepted. I will remove this change.

> >       /* MAC doesn't support 1000T Half */
> > @@ -2822,12 +2914,14 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
> >                       sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
> >                       lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> >                       netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
> > +                     adapter->mdiobus->probe_capabilities = MDIOBUS_C22_C45;
> >               } else {
> >                       sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> >                       sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
> >                       sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
> >                       lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> >                       netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
> > +                     adapter->mdiobus->probe_capabilities = MDIOBUS_C22;
> >               }
> >       } else {
> >               chip_ver = lan743x_csr_read(adapter, STRAP_READ);
> > @@ -2839,19 +2933,29 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
> >                       sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
> >                       lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> >                       netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
> > +                     adapter->mdiobus->probe_capabilities = MDIOBUS_C22_C45;
> >               } else {
> >                       sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> >                       sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
> >                       sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
> >                       lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> >                       netif_info(adapter, drv, adapter->netdev, "GMII operation\n");
> > +                     adapter->mdiobus->probe_capabilities = MDIOBUS_C22;
> 
> This manipulation of adapter->mdiobus->probe_capabilities based on
> SGMII vs RGMII makes no sense. It should be set based on what the bus
> master can actually do. I assume the PCI1A011/PCI1A041 can do both C22
> and C45. So it should look at the reg value and either do a C45
> transaction, or a C22 transaction. Do the older chips not support C45?
> In that case, return -EOPNOTSUPP if asked to do a C45 transaction.
> 

Yes, Older chip does not suuport C45.
I will change code such that without upate the
"adapter->mdiobus->probe_capabilities" variable, assign the read/write
functions based chip id.

>         Andrew

-- 

Thanks,
Raju


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 4/5] net: lan743x: Add support of selection between SGMII and GMII Interface
  2022-01-31 18:09     ` Raju Lakkaraju
@ 2022-01-31 21:38       ` Andrew Lunn
  0 siblings, 0 replies; 11+ messages in thread
From: Andrew Lunn @ 2022-01-31 21:38 UTC (permalink / raw)
  To: Raju Lakkaraju; +Cc: netdev, davem, kuba, UNGLinuxDriver

> Accepted. I will change.
> 
> > > +             if (chip_ver & STRAP_READ_SGMII_EN_) {
> > > +                     sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
> > > +                     sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_;
> > > +                     sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
> > > +                     lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
> > > +                     netif_info(adapter, drv, adapter->netdev, "SGMII operation\n");
> > 
> > And def initially this and the next one.
> > 
> 
> I did not get "def initially" means ?

I suspect that was my spelling checker getting confused, or me picking
the wrong suggestion. I meant 'definitely'. You don't want to spam the
log with SGMII vs GMII operation in the normal case. This should be
netif_dbg()

	Andrew

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-01-31 21:38 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-27 17:30 [PATCH net-next 0/5] net: lan743x: PCI1A011/PCI1A014 Enhancment Raju Lakkaraju
2022-01-27 17:30 ` [PATCH net-next 1/5] net: lan743x: Add PCI1A011/PCI1A041 chip driver Raju Lakkaraju
2022-01-27 17:30 ` [PATCH net-next 2/5] net: lan743x: Add Tx 4 Queue enhancements Raju Lakkaraju
2022-01-27 17:30 ` [PATCH net-next 3/5] net: lan743x: Add MSI-X interrupts increased from 8 to 16 and Interrupt De-assertion timers increased from 8 to 16 Raju Lakkaraju
2022-01-27 17:30 ` [PATCH net-next 4/5] net: lan743x: Add support of selection between SGMII and GMII Interface Raju Lakkaraju
2022-01-27 22:08   ` Andrew Lunn
2022-01-31 18:09     ` Raju Lakkaraju
2022-01-31 21:38       ` Andrew Lunn
2022-01-27 17:30 ` [PATCH net-next 5/5] net: lan743x: Add Clause-45 MDIO access Raju Lakkaraju
2022-01-27 22:23   ` Andrew Lunn
2022-01-31 18:14     ` Raju Lakkaraju

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.