* [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.