mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-03-09 15:40:20 +00:00
Update 6.12 kernel patches
This commit is contained in:
parent
bdb9b0046f
commit
9d83c70ced
247 changed files with 53301 additions and 589 deletions
|
@ -19,7 +19,7 @@ Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
|||
|
||||
--- a/block/blk.h
|
||||
+++ b/block/blk.h
|
||||
@@ -424,6 +424,7 @@ void blk_free_ext_minor(unsigned int min
|
||||
@@ -564,6 +564,7 @@ void blk_free_ext_minor(unsigned int min
|
||||
#define ADDPART_FLAG_NONE 0
|
||||
#define ADDPART_FLAG_RAID 1
|
||||
#define ADDPART_FLAG_WHOLEDISK 2
|
||||
|
@ -41,7 +41,7 @@ Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
|||
strscpy(info->volname, subpart->name, sizeof(info->volname));
|
||||
--- a/block/partitions/core.c
|
||||
+++ b/block/partitions/core.c
|
||||
@@ -392,6 +392,9 @@ static struct block_device *add_partitio
|
||||
@@ -373,6 +373,9 @@ static struct block_device *add_partitio
|
||||
goto out_del;
|
||||
}
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
|||
|
||||
{
|
||||
struct device *ddev = disk_to_dev(disk);
|
||||
@@ -451,6 +453,8 @@ int __must_check device_add_disk(struct
|
||||
@@ -452,6 +454,8 @@ int __must_check device_add_disk(struct
|
||||
ddev->parent = parent;
|
||||
ddev->groups = groups;
|
||||
dev_set_name(ddev, "%s", disk->disk_name);
|
||||
|
@ -57,7 +57,7 @@ Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
|||
if (!(disk->flags & GENHD_FL_HIDDEN))
|
||||
ddev->devt = MKDEV(disk->major, disk->first_minor);
|
||||
ret = device_add(ddev);
|
||||
@@ -552,6 +556,22 @@ out_exit_elevator:
|
||||
@@ -553,6 +557,22 @@ out_exit_elevator:
|
||||
elevator_exit(disk->queue);
|
||||
return ret;
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
|||
static void blk_report_disk_dead(struct gendisk *disk, bool surprise)
|
||||
--- a/include/linux/blkdev.h
|
||||
+++ b/include/linux/blkdev.h
|
||||
@@ -741,6 +741,9 @@ static inline unsigned int blk_queue_dep
|
||||
@@ -735,6 +735,9 @@ static inline unsigned int blk_queue_dep
|
||||
#define for_each_bio(_bio) \
|
||||
for (; _bio; _bio = _bio->bi_next)
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
|||
|
||||
--- a/drivers/mmc/core/block.c
|
||||
+++ b/drivers/mmc/core/block.c
|
||||
@@ -2455,6 +2455,56 @@ static inline int mmc_blk_readonly(struc
|
||||
@@ -2517,6 +2517,56 @@ static inline int mmc_blk_readonly(struc
|
||||
!(card->csd.cmdclass & CCC_BLOCK_WRITE);
|
||||
}
|
||||
|
||||
|
@ -83,7 +83,7 @@ Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
|||
static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
|
||||
struct device *parent,
|
||||
sector_t size,
|
||||
@@ -2463,6 +2513,7 @@ static struct mmc_blk_data *mmc_blk_allo
|
||||
@@ -2525,6 +2575,7 @@ static struct mmc_blk_data *mmc_blk_allo
|
||||
int area_type,
|
||||
unsigned int part_type)
|
||||
{
|
||||
|
@ -91,7 +91,7 @@ Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
|||
struct mmc_blk_data *md;
|
||||
int devidx, ret;
|
||||
char cap_str[10];
|
||||
@@ -2568,7 +2619,9 @@ static struct mmc_blk_data *mmc_blk_allo
|
||||
@@ -2626,7 +2677,9 @@ static struct mmc_blk_data *mmc_blk_allo
|
||||
/* used in ->open, must be set before add_disk: */
|
||||
if (area_type == MMC_BLK_DATA_AREA_MAIN)
|
||||
dev_set_drvdata(&card->dev, md);
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
From ae461cde5c559675fc4c0ba351c7c31ace705f56 Mon Sep 17 00:00:00 2001
|
||||
From: Bohdan Chubuk <chbgdn@gmail.com>
|
||||
Date: Sun, 10 Nov 2024 22:50:47 +0200
|
||||
Subject: [PATCH] mtd: spinand: add support for FORESEE F35SQA001G
|
||||
|
||||
Add support for FORESEE F35SQA001G SPI NAND.
|
||||
|
||||
Similar to F35SQA002G, but differs in capacity.
|
||||
Datasheet:
|
||||
- https://cdn.ozdisan.com/ETicaret_Dosya/704795_871495.pdf
|
||||
|
||||
Tested on Xiaomi AX3000T flashed with OpenWRT.
|
||||
|
||||
Signed-off-by: Bohdan Chubuk <chbgdn@gmail.com>
|
||||
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||
---
|
||||
drivers/mtd/nand/spi/foresee.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/drivers/mtd/nand/spi/foresee.c
|
||||
+++ b/drivers/mtd/nand/spi/foresee.c
|
||||
@@ -81,6 +81,16 @@ static const struct spinand_info foresee
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&f35sqa002g_ooblayout,
|
||||
f35sqa002g_ecc_get_status)),
|
||||
+ SPINAND_INFO("F35SQA001G",
|
||||
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x71, 0x71),
|
||||
+ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
|
||||
+ NAND_ECCREQ(1, 512),
|
||||
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
+ &write_cache_variants,
|
||||
+ &update_cache_variants),
|
||||
+ SPINAND_HAS_QE_BIT,
|
||||
+ SPINAND_ECCINFO(&f35sqa002g_ooblayout,
|
||||
+ f35sqa002g_ecc_get_status)),
|
||||
};
|
||||
|
||||
static const struct spinand_manufacturer_ops foresee_spinand_manuf_ops = {
|
|
@ -0,0 +1,106 @@
|
|||
From 081c9c0265c91b8333165aa6230c20bcbc6f7cbf Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Thu, 10 Oct 2024 14:07:16 +0100
|
||||
Subject: [PATCH 3/5] net: phy: realtek: read duplex and gbit master from PHYSR
|
||||
register
|
||||
|
||||
The PHYSR MMD register is present and defined equally for all RTL82xx
|
||||
Ethernet PHYs.
|
||||
Read duplex and Gbit master bits from rtlgen_decode_speed() and rename
|
||||
it to rtlgen_decode_physr().
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Link: https://patch.msgid.link/b9a76341da851a18c985bc4774fa295babec79bb.1728565530.git.daniel@makrotopia.org
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
---
|
||||
drivers/net/phy/realtek.c | 41 +++++++++++++++++++++++++++++++--------
|
||||
1 file changed, 33 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/realtek.c
|
||||
+++ b/drivers/net/phy/realtek.c
|
||||
@@ -80,15 +80,18 @@
|
||||
|
||||
#define RTL822X_VND2_GANLPAR 0xa414
|
||||
|
||||
-#define RTL822X_VND2_PHYSR 0xa434
|
||||
-
|
||||
#define RTL8366RB_POWER_SAVE 0x15
|
||||
#define RTL8366RB_POWER_SAVE_ON BIT(12)
|
||||
|
||||
#define RTL9000A_GINMR 0x14
|
||||
#define RTL9000A_GINMR_LINK_STATUS BIT(4)
|
||||
|
||||
-#define RTLGEN_SPEED_MASK 0x0630
|
||||
+#define RTL_VND2_PHYSR 0xa434
|
||||
+#define RTL_VND2_PHYSR_DUPLEX BIT(3)
|
||||
+#define RTL_VND2_PHYSR_SPEEDL GENMASK(5, 4)
|
||||
+#define RTL_VND2_PHYSR_SPEEDH GENMASK(10, 9)
|
||||
+#define RTL_VND2_PHYSR_MASTER BIT(11)
|
||||
+#define RTL_VND2_PHYSR_SPEED_MASK (RTL_VND2_PHYSR_SPEEDL | RTL_VND2_PHYSR_SPEEDH)
|
||||
|
||||
#define RTL_GENERIC_PHYID 0x001cc800
|
||||
#define RTL_8211FVD_PHYID 0x001cc878
|
||||
@@ -660,9 +663,18 @@ static int rtl8366rb_config_init(struct
|
||||
}
|
||||
|
||||
/* get actual speed to cover the downshift case */
|
||||
-static void rtlgen_decode_speed(struct phy_device *phydev, int val)
|
||||
+static void rtlgen_decode_physr(struct phy_device *phydev, int val)
|
||||
{
|
||||
- switch (val & RTLGEN_SPEED_MASK) {
|
||||
+ /* bit 3
|
||||
+ * 0: Half Duplex
|
||||
+ * 1: Full Duplex
|
||||
+ */
|
||||
+ if (val & RTL_VND2_PHYSR_DUPLEX)
|
||||
+ phydev->duplex = DUPLEX_FULL;
|
||||
+ else
|
||||
+ phydev->duplex = DUPLEX_HALF;
|
||||
+
|
||||
+ switch (val & RTL_VND2_PHYSR_SPEED_MASK) {
|
||||
case 0x0000:
|
||||
phydev->speed = SPEED_10;
|
||||
break;
|
||||
@@ -684,6 +696,19 @@ static void rtlgen_decode_speed(struct p
|
||||
default:
|
||||
break;
|
||||
}
|
||||
+
|
||||
+ /* bit 11
|
||||
+ * 0: Slave Mode
|
||||
+ * 1: Master Mode
|
||||
+ */
|
||||
+ if (phydev->speed >= 1000) {
|
||||
+ if (val & RTL_VND2_PHYSR_MASTER)
|
||||
+ phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
|
||||
+ else
|
||||
+ phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
|
||||
+ } else {
|
||||
+ phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;
|
||||
+ }
|
||||
}
|
||||
|
||||
static int rtlgen_read_status(struct phy_device *phydev)
|
||||
@@ -701,7 +726,7 @@ static int rtlgen_read_status(struct phy
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
- rtlgen_decode_speed(phydev, val);
|
||||
+ rtlgen_decode_physr(phydev, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1007,11 +1032,11 @@ static int rtl822x_c45_read_status(struc
|
||||
return 0;
|
||||
|
||||
/* Read actual speed from vendor register. */
|
||||
- val = phy_read_mmd(phydev, MDIO_MMD_VEND2, RTL822X_VND2_PHYSR);
|
||||
+ val = phy_read_mmd(phydev, MDIO_MMD_VEND2, RTL_VND2_PHYSR);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
- rtlgen_decode_speed(phydev, val);
|
||||
+ rtlgen_decode_physr(phydev, val);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
From 68d5cd09e8919679ce13b85950debea4b2e98e04 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Thu, 10 Oct 2024 14:07:26 +0100
|
||||
Subject: [PATCH 4/5] net: phy: realtek: change order of calls in C22
|
||||
read_status()
|
||||
|
||||
Always call rtlgen_read_status() first, so genphy_read_status() which
|
||||
is called by it clears bits in case auto-negotiation has not completed.
|
||||
Also clear 10GBT link-partner advertisement bits in case auto-negotiation
|
||||
is disabled or has not completed.
|
||||
|
||||
Suggested-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Link: https://patch.msgid.link/b15929a41621d215c6b2b57393368086589569ec.1728565530.git.daniel@makrotopia.org
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
---
|
||||
drivers/net/phy/realtek.c | 22 +++++++++++++++-------
|
||||
1 file changed, 15 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/realtek.c
|
||||
+++ b/drivers/net/phy/realtek.c
|
||||
@@ -949,17 +949,25 @@ static void rtl822xb_update_interface(st
|
||||
|
||||
static int rtl822x_read_status(struct phy_device *phydev)
|
||||
{
|
||||
- if (phydev->autoneg == AUTONEG_ENABLE) {
|
||||
- int lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
|
||||
+ int lpadv, ret;
|
||||
|
||||
- if (lpadv < 0)
|
||||
- return lpadv;
|
||||
+ ret = rtlgen_read_status(phydev);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
|
||||
- mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising,
|
||||
- lpadv);
|
||||
+ if (phydev->autoneg == AUTONEG_DISABLE ||
|
||||
+ !phydev->autoneg_complete) {
|
||||
+ mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
- return rtlgen_read_status(phydev);
|
||||
+ lpadv = phy_read_paged(phydev, 0xa5d, 0x13);
|
||||
+ if (lpadv < 0)
|
||||
+ return lpadv;
|
||||
+
|
||||
+ mii_10gbt_stat_mod_linkmode_lpa_t(phydev->lp_advertising, lpadv);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static int rtl822xb_read_status(struct phy_device *phydev)
|
|
@ -0,0 +1,30 @@
|
|||
From 5cb409b3960e75467cbb0a8e1e5596b4490570e3 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Thu, 10 Oct 2024 14:07:39 +0100
|
||||
Subject: [PATCH 5/5] net: phy: realtek: clear 1000Base-T link partner
|
||||
advertisement
|
||||
|
||||
Clear 1000Base-T link partner advertisement bits in Clause-45
|
||||
read_status() function in case auto-negotiation is disabled or has not
|
||||
been completed.
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Link: https://patch.msgid.link/9dc9b47b2d675708afef3ad366bfd78eb584d958.1728565530.git.daniel@makrotopia.org
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
---
|
||||
drivers/net/phy/realtek.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/net/phy/realtek.c
|
||||
+++ b/drivers/net/phy/realtek.c
|
||||
@@ -1026,6 +1026,10 @@ static int rtl822x_c45_read_status(struc
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
+ if (phydev->autoneg == AUTONEG_DISABLE ||
|
||||
+ !genphy_c45_aneg_done(phydev))
|
||||
+ mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
|
||||
+
|
||||
/* Vendor register as C45 has no standardized support for 1000BaseT */
|
||||
if (phydev->autoneg == AUTONEG_ENABLE) {
|
||||
val = phy_read_mmd(phydev, MDIO_MMD_VEND2,
|
|
@ -0,0 +1,107 @@
|
|||
From a2e1ba275eae96a8171deb19e9c7c2f5978fee7b Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Fri, 4 Oct 2024 17:18:16 +0100
|
||||
Subject: [PATCH] net: phy: aquantia: allow forcing order of MDI pairs
|
||||
|
||||
Despite supporting Auto MDI-X, it looks like Aquantia only supports
|
||||
swapping pair (1,2) with pair (3,6) like it used to be for MDI-X on
|
||||
100MBit/s networks.
|
||||
|
||||
When all 4 pairs are in use (for 1000MBit/s or faster) the link does not
|
||||
come up with pair order is not configured correctly, either using
|
||||
MDI_CFG pin or using the "PMA Receive Reserved Vendor Provisioning 1"
|
||||
register.
|
||||
|
||||
Normally, the order of MDI pairs being either ABCD or DCBA is configured
|
||||
by pulling the MDI_CFG pin.
|
||||
|
||||
However, some hardware designs require overriding the value configured
|
||||
by that bootstrap pin. The PHY allows doing that by setting a bit in
|
||||
"PMA Receive Reserved Vendor Provisioning 1" register which allows
|
||||
ignoring the state of the MDI_CFG pin and another bit configuring
|
||||
whether the order of MDI pairs should be normal (ABCD) or reverse
|
||||
(DCBA). Pair polarity is not affected and remains identical in both
|
||||
settings.
|
||||
|
||||
Introduce property "marvell,mdi-cfg-order" which allows forcing either
|
||||
normal or reverse order of the MDI pairs from DT.
|
||||
|
||||
If the property isn't present, the behavior is unchanged and MDI pair
|
||||
order configuration is untouched (ie. either the result of MDI_CFG pin
|
||||
pull-up/pull-down, or pair order override already configured by the
|
||||
bootloader before Linux is started).
|
||||
|
||||
Forcing normal pair order is required on the Adtran SDG-8733A Wi-Fi 7
|
||||
residential gateway.
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Link: https://patch.msgid.link/9ed760ff87d5fc456f31e407ead548bbb754497d.1728058550.git.daniel@makrotopia.org
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/phy/aquantia/aquantia_main.c | 33 ++++++++++++++++++++++++
|
||||
1 file changed, 33 insertions(+)
|
||||
|
||||
--- a/drivers/net/phy/aquantia/aquantia_main.c
|
||||
+++ b/drivers/net/phy/aquantia/aquantia_main.c
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/bitfield.h>
|
||||
+#include <linux/of.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#include "aquantia.h"
|
||||
@@ -71,6 +72,11 @@
|
||||
#define MDIO_AN_TX_VEND_INT_MASK2 0xd401
|
||||
#define MDIO_AN_TX_VEND_INT_MASK2_LINK BIT(0)
|
||||
|
||||
+#define PMAPMD_RSVD_VEND_PROV 0xe400
|
||||
+#define PMAPMD_RSVD_VEND_PROV_MDI_CONF GENMASK(1, 0)
|
||||
+#define PMAPMD_RSVD_VEND_PROV_MDI_REVERSE BIT(0)
|
||||
+#define PMAPMD_RSVD_VEND_PROV_MDI_FORCE BIT(1)
|
||||
+
|
||||
#define MDIO_AN_RX_LP_STAT1 0xe820
|
||||
#define MDIO_AN_RX_LP_STAT1_1000BASET_FULL BIT(15)
|
||||
#define MDIO_AN_RX_LP_STAT1_1000BASET_HALF BIT(14)
|
||||
@@ -485,6 +491,29 @@ static void aqr107_chip_info(struct phy_
|
||||
fw_major, fw_minor, build_id, prov_id);
|
||||
}
|
||||
|
||||
+static int aqr107_config_mdi(struct phy_device *phydev)
|
||||
+{
|
||||
+ struct device_node *np = phydev->mdio.dev.of_node;
|
||||
+ u32 mdi_conf;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = of_property_read_u32(np, "marvell,mdi-cfg-order", &mdi_conf);
|
||||
+
|
||||
+ /* Do nothing in case property "marvell,mdi-cfg-order" is not present */
|
||||
+ if (ret == -ENOENT)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (mdi_conf & ~PMAPMD_RSVD_VEND_PROV_MDI_REVERSE)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return phy_modify_mmd(phydev, MDIO_MMD_PMAPMD, PMAPMD_RSVD_VEND_PROV,
|
||||
+ PMAPMD_RSVD_VEND_PROV_MDI_CONF,
|
||||
+ mdi_conf | PMAPMD_RSVD_VEND_PROV_MDI_FORCE);
|
||||
+}
|
||||
+
|
||||
static int aqr107_config_init(struct phy_device *phydev)
|
||||
{
|
||||
struct aqr107_priv *priv = phydev->priv;
|
||||
@@ -514,6 +543,10 @@ static int aqr107_config_init(struct phy
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
+ ret = aqr107_config_mdi(phydev);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
/* Restore LED polarity state after reset */
|
||||
for_each_set_bit(led_active_low, &priv->leds_active_low, AQR_MAX_LEDS) {
|
||||
ret = aqr_phy_led_active_low_set(phydev, led_active_low, true);
|
|
@ -0,0 +1,31 @@
|
|||
From ce21b8fb255ebf0b49913fb4c62741d7eb05c6f6 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Fri, 11 Oct 2024 22:28:43 +0100
|
||||
Subject: [PATCH] net: phy: aquantia: fix return value check in
|
||||
aqr107_config_mdi()
|
||||
|
||||
of_property_read_u32() returns -EINVAL in case the property cannot be
|
||||
found rather than -ENOENT. Fix the check to not abort probing in case
|
||||
of the property being missing, and also in case CONFIG_OF is not set
|
||||
which will result in -ENOSYS.
|
||||
|
||||
Fixes: a2e1ba275eae ("net: phy: aquantia: allow forcing order of MDI pairs")
|
||||
Reported-by: Jon Hunter <jonathanh@nvidia.com>
|
||||
Closes: https://lore.kernel.org/all/114b4c03-5d16-42ed-945d-cf78eabea12b@nvidia.com/
|
||||
Suggested-by: Hans-Frieder Vogt <hfdevel@gmx.net>
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
---
|
||||
drivers/net/phy/aquantia/aquantia_main.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/phy/aquantia/aquantia_main.c
|
||||
+++ b/drivers/net/phy/aquantia/aquantia_main.c
|
||||
@@ -500,7 +500,7 @@ static int aqr107_config_mdi(struct phy_
|
||||
ret = of_property_read_u32(np, "marvell,mdi-cfg-order", &mdi_conf);
|
||||
|
||||
/* Do nothing in case property "marvell,mdi-cfg-order" is not present */
|
||||
- if (ret == -ENOENT)
|
||||
+ if (ret == -EINVAL || ret == -ENOSYS)
|
||||
return 0;
|
||||
|
||||
if (ret)
|
|
@ -0,0 +1,53 @@
|
|||
From a274465cc3bef2dfd9c9ea5100848dda0a8641e1 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Thu, 10 Oct 2024 13:54:19 +0100
|
||||
Subject: [PATCH 1/4] net: phy: support 'active-high' property for PHY LEDs
|
||||
|
||||
In addition to 'active-low' and 'inactive-high-impedance' also
|
||||
support 'active-high' property for PHY LED pin configuration.
|
||||
As only either 'active-high' or 'active-low' can be set at the
|
||||
same time, WARN and return an error in case both are set.
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Link: https://patch.msgid.link/91598487773d768f254d5faf06cf65b13e972f0e.1728558223.git.daniel@makrotopia.org
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
---
|
||||
drivers/net/phy/phy_device.c | 6 ++++++
|
||||
include/linux/phy.h | 5 +++--
|
||||
2 files changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/phy_device.c
|
||||
+++ b/drivers/net/phy/phy_device.c
|
||||
@@ -3358,11 +3358,17 @@ static int of_phy_led(struct phy_device
|
||||
if (index > U8_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
+ if (of_property_read_bool(led, "active-high"))
|
||||
+ set_bit(PHY_LED_ACTIVE_HIGH, &modes);
|
||||
if (of_property_read_bool(led, "active-low"))
|
||||
set_bit(PHY_LED_ACTIVE_LOW, &modes);
|
||||
if (of_property_read_bool(led, "inactive-high-impedance"))
|
||||
set_bit(PHY_LED_INACTIVE_HIGH_IMPEDANCE, &modes);
|
||||
|
||||
+ if (WARN_ON(modes & BIT(PHY_LED_ACTIVE_LOW) &&
|
||||
+ modes & BIT(PHY_LED_ACTIVE_HIGH)))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
if (modes) {
|
||||
/* Return error if asked to set polarity modes but not supported */
|
||||
if (!phydev->drv->led_polarity_set)
|
||||
--- a/include/linux/phy.h
|
||||
+++ b/include/linux/phy.h
|
||||
@@ -877,8 +877,9 @@ struct phy_plca_status {
|
||||
|
||||
/* Modes for PHY LED configuration */
|
||||
enum phy_led_modes {
|
||||
- PHY_LED_ACTIVE_LOW = 0,
|
||||
- PHY_LED_INACTIVE_HIGH_IMPEDANCE = 1,
|
||||
+ PHY_LED_ACTIVE_HIGH = 0,
|
||||
+ PHY_LED_ACTIVE_LOW = 1,
|
||||
+ PHY_LED_INACTIVE_HIGH_IMPEDANCE = 2,
|
||||
|
||||
/* keep it last */
|
||||
__PHY_LED_MODES_NUM,
|
|
@ -0,0 +1,108 @@
|
|||
From 9d55e68b19f222e6334ef4021c5527998f5ab537 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Thu, 10 Oct 2024 13:55:00 +0100
|
||||
Subject: [PATCH 2/4] net: phy: aquantia: correctly describe LED polarity
|
||||
override
|
||||
|
||||
Use newly defined 'active-high' property to set the
|
||||
VEND1_GLOBAL_LED_DRIVE_VDD bit and let 'active-low' clear that bit. This
|
||||
reflects the technical reality which was inverted in the previous
|
||||
description in which the 'active-low' property was used to actually set
|
||||
the VEND1_GLOBAL_LED_DRIVE_VDD bit, which means that VDD (ie. supply
|
||||
voltage) of the LED is driven rather than GND.
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Link: https://patch.msgid.link/86a413b4387c42dcb54f587cc2433a06f16aae83.1728558223.git.daniel@makrotopia.org
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
---
|
||||
drivers/net/phy/aquantia/aquantia.h | 1 +
|
||||
drivers/net/phy/aquantia/aquantia_leds.c | 19 ++++++++++++++-----
|
||||
drivers/net/phy/aquantia/aquantia_main.c | 12 +++++++++---
|
||||
3 files changed, 24 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/aquantia/aquantia.h
|
||||
+++ b/drivers/net/phy/aquantia/aquantia.h
|
||||
@@ -177,6 +177,7 @@ static const struct aqr107_hw_stat aqr10
|
||||
struct aqr107_priv {
|
||||
u64 sgmii_stats[AQR107_SGMII_STAT_SZ];
|
||||
unsigned long leds_active_low;
|
||||
+ unsigned long leds_active_high;
|
||||
};
|
||||
|
||||
#if IS_REACHABLE(CONFIG_HWMON)
|
||||
--- a/drivers/net/phy/aquantia/aquantia_leds.c
|
||||
+++ b/drivers/net/phy/aquantia/aquantia_leds.c
|
||||
@@ -121,13 +121,13 @@ int aqr_phy_led_active_low_set(struct ph
|
||||
{
|
||||
return phy_modify_mmd(phydev, MDIO_MMD_VEND1, AQR_LED_DRIVE(index),
|
||||
VEND1_GLOBAL_LED_DRIVE_VDD,
|
||||
- enable ? VEND1_GLOBAL_LED_DRIVE_VDD : 0);
|
||||
+ enable ? 0 : VEND1_GLOBAL_LED_DRIVE_VDD);
|
||||
}
|
||||
|
||||
int aqr_phy_led_polarity_set(struct phy_device *phydev, int index, unsigned long modes)
|
||||
{
|
||||
+ bool force_active_low = false, force_active_high = false;
|
||||
struct aqr107_priv *priv = phydev->priv;
|
||||
- bool active_low = false;
|
||||
u32 mode;
|
||||
|
||||
if (index >= AQR_MAX_LEDS)
|
||||
@@ -136,7 +136,10 @@ int aqr_phy_led_polarity_set(struct phy_
|
||||
for_each_set_bit(mode, &modes, __PHY_LED_MODES_NUM) {
|
||||
switch (mode) {
|
||||
case PHY_LED_ACTIVE_LOW:
|
||||
- active_low = true;
|
||||
+ force_active_low = true;
|
||||
+ break;
|
||||
+ case PHY_LED_ACTIVE_HIGH:
|
||||
+ force_active_high = true;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -144,8 +147,14 @@ int aqr_phy_led_polarity_set(struct phy_
|
||||
}
|
||||
|
||||
/* Save LED driver vdd state to restore on SW reset */
|
||||
- if (active_low)
|
||||
+ if (force_active_low)
|
||||
priv->leds_active_low |= BIT(index);
|
||||
|
||||
- return aqr_phy_led_active_low_set(phydev, index, active_low);
|
||||
+ if (force_active_high)
|
||||
+ priv->leds_active_high |= BIT(index);
|
||||
+
|
||||
+ if (force_active_high || force_active_low)
|
||||
+ return aqr_phy_led_active_low_set(phydev, index, force_active_low);
|
||||
+
|
||||
+ unreachable();
|
||||
}
|
||||
--- a/drivers/net/phy/aquantia/aquantia_main.c
|
||||
+++ b/drivers/net/phy/aquantia/aquantia_main.c
|
||||
@@ -517,7 +517,7 @@ static int aqr107_config_mdi(struct phy_
|
||||
static int aqr107_config_init(struct phy_device *phydev)
|
||||
{
|
||||
struct aqr107_priv *priv = phydev->priv;
|
||||
- u32 led_active_low;
|
||||
+ u32 led_idx;
|
||||
int ret;
|
||||
|
||||
/* Check that the PHY interface type is compatible */
|
||||
@@ -548,8 +548,14 @@ static int aqr107_config_init(struct phy
|
||||
return ret;
|
||||
|
||||
/* Restore LED polarity state after reset */
|
||||
- for_each_set_bit(led_active_low, &priv->leds_active_low, AQR_MAX_LEDS) {
|
||||
- ret = aqr_phy_led_active_low_set(phydev, led_active_low, true);
|
||||
+ for_each_set_bit(led_idx, &priv->leds_active_low, AQR_MAX_LEDS) {
|
||||
+ ret = aqr_phy_led_active_low_set(phydev, led_idx, true);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ for_each_set_bit(led_idx, &priv->leds_active_high, AQR_MAX_LEDS) {
|
||||
+ ret = aqr_phy_led_active_low_set(phydev, led_idx, false);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
|
@ -0,0 +1,332 @@
|
|||
From 78997e9a5e4d8a4df561e083a92c91ae23010e07 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Tue, 1 Oct 2024 01:17:18 +0100
|
||||
Subject: [PATCH] net: phy: mxl-gpy: add basic LED support
|
||||
|
||||
Add basic support for LEDs connected to MaxLinear GPY2xx and GPY115 PHYs.
|
||||
The PHYs allow up to 4 LEDs to be connected.
|
||||
Implement controlling LEDs in software as well as netdev trigger offloading
|
||||
and LED polarity setup.
|
||||
|
||||
The hardware claims to support 16 PWM brightness levels but there is no
|
||||
documentation on how to use that feature, hence this is not supported.
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Link: https://patch.msgid.link/b6ec9050339f8244ff898898a1cecc33b13a48fc.1727741563.git.daniel@makrotopia.org
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/phy/mxl-gpy.c | 218 ++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 218 insertions(+)
|
||||
|
||||
--- a/drivers/net/phy/mxl-gpy.c
|
||||
+++ b/drivers/net/phy/mxl-gpy.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#define PHY_MIISTAT 0x18 /* MII state */
|
||||
#define PHY_IMASK 0x19 /* interrupt mask */
|
||||
#define PHY_ISTAT 0x1A /* interrupt status */
|
||||
+#define PHY_LED 0x1B /* LEDs */
|
||||
#define PHY_FWV 0x1E /* firmware version */
|
||||
|
||||
#define PHY_MIISTAT_SPD_MASK GENMASK(2, 0)
|
||||
@@ -61,6 +62,11 @@
|
||||
PHY_IMASK_ADSC | \
|
||||
PHY_IMASK_ANC)
|
||||
|
||||
+#define GPY_MAX_LEDS 4
|
||||
+#define PHY_LED_POLARITY(idx) BIT(12 + (idx))
|
||||
+#define PHY_LED_HWCONTROL(idx) BIT(8 + (idx))
|
||||
+#define PHY_LED_ON(idx) BIT(idx)
|
||||
+
|
||||
#define PHY_FWV_REL_MASK BIT(15)
|
||||
#define PHY_FWV_MAJOR_MASK GENMASK(11, 8)
|
||||
#define PHY_FWV_MINOR_MASK GENMASK(7, 0)
|
||||
@@ -72,6 +78,23 @@
|
||||
#define PHY_MDI_MDI_X_CD 0x1
|
||||
#define PHY_MDI_MDI_X_CROSS 0x0
|
||||
|
||||
+/* LED */
|
||||
+#define VSPEC1_LED(idx) (1 + (idx))
|
||||
+#define VSPEC1_LED_BLINKS GENMASK(15, 12)
|
||||
+#define VSPEC1_LED_PULSE GENMASK(11, 8)
|
||||
+#define VSPEC1_LED_CON GENMASK(7, 4)
|
||||
+#define VSPEC1_LED_BLINKF GENMASK(3, 0)
|
||||
+
|
||||
+#define VSPEC1_LED_LINK10 BIT(0)
|
||||
+#define VSPEC1_LED_LINK100 BIT(1)
|
||||
+#define VSPEC1_LED_LINK1000 BIT(2)
|
||||
+#define VSPEC1_LED_LINK2500 BIT(3)
|
||||
+
|
||||
+#define VSPEC1_LED_TXACT BIT(0)
|
||||
+#define VSPEC1_LED_RXACT BIT(1)
|
||||
+#define VSPEC1_LED_COL BIT(2)
|
||||
+#define VSPEC1_LED_NO_CON BIT(3)
|
||||
+
|
||||
/* SGMII */
|
||||
#define VSPEC1_SGMII_CTRL 0x08
|
||||
#define VSPEC1_SGMII_CTRL_ANEN BIT(12) /* Aneg enable */
|
||||
@@ -835,6 +858,156 @@ static int gpy115_loopback(struct phy_de
|
||||
return genphy_soft_reset(phydev);
|
||||
}
|
||||
|
||||
+static int gpy_led_brightness_set(struct phy_device *phydev,
|
||||
+ u8 index, enum led_brightness value)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ if (index >= GPY_MAX_LEDS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ /* clear HWCONTROL and set manual LED state */
|
||||
+ ret = phy_modify(phydev, PHY_LED,
|
||||
+ ((value == LED_OFF) ? PHY_LED_HWCONTROL(index) : 0) |
|
||||
+ PHY_LED_ON(index),
|
||||
+ (value == LED_OFF) ? 0 : PHY_LED_ON(index));
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* ToDo: set PWM brightness */
|
||||
+
|
||||
+ /* clear HW LED setup */
|
||||
+ if (value == LED_OFF)
|
||||
+ return phy_write_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_LED(index), 0);
|
||||
+ else
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const unsigned long supported_triggers = (BIT(TRIGGER_NETDEV_LINK) |
|
||||
+ BIT(TRIGGER_NETDEV_LINK_100) |
|
||||
+ BIT(TRIGGER_NETDEV_LINK_1000) |
|
||||
+ BIT(TRIGGER_NETDEV_LINK_2500) |
|
||||
+ BIT(TRIGGER_NETDEV_RX) |
|
||||
+ BIT(TRIGGER_NETDEV_TX));
|
||||
+
|
||||
+static int gpy_led_hw_is_supported(struct phy_device *phydev, u8 index,
|
||||
+ unsigned long rules)
|
||||
+{
|
||||
+ if (index >= GPY_MAX_LEDS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ /* All combinations of the supported triggers are allowed */
|
||||
+ if (rules & ~supported_triggers)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int gpy_led_hw_control_get(struct phy_device *phydev, u8 index,
|
||||
+ unsigned long *rules)
|
||||
+{
|
||||
+ int val;
|
||||
+
|
||||
+ if (index >= GPY_MAX_LEDS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ val = phy_read_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_LED(index));
|
||||
+ if (val < 0)
|
||||
+ return val;
|
||||
+
|
||||
+ if (FIELD_GET(VSPEC1_LED_CON, val) & VSPEC1_LED_LINK10)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_LINK_10);
|
||||
+
|
||||
+ if (FIELD_GET(VSPEC1_LED_CON, val) & VSPEC1_LED_LINK100)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_LINK_100);
|
||||
+
|
||||
+ if (FIELD_GET(VSPEC1_LED_CON, val) & VSPEC1_LED_LINK1000)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_LINK_1000);
|
||||
+
|
||||
+ if (FIELD_GET(VSPEC1_LED_CON, val) & VSPEC1_LED_LINK2500)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_LINK_2500);
|
||||
+
|
||||
+ if (FIELD_GET(VSPEC1_LED_CON, val) == (VSPEC1_LED_LINK10 |
|
||||
+ VSPEC1_LED_LINK100 |
|
||||
+ VSPEC1_LED_LINK1000 |
|
||||
+ VSPEC1_LED_LINK2500))
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_LINK);
|
||||
+
|
||||
+ if (FIELD_GET(VSPEC1_LED_PULSE, val) & VSPEC1_LED_TXACT)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_TX);
|
||||
+
|
||||
+ if (FIELD_GET(VSPEC1_LED_PULSE, val) & VSPEC1_LED_RXACT)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_RX);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int gpy_led_hw_control_set(struct phy_device *phydev, u8 index,
|
||||
+ unsigned long rules)
|
||||
+{
|
||||
+ u16 val = 0;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (index >= GPY_MAX_LEDS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_LINK) ||
|
||||
+ rules & BIT(TRIGGER_NETDEV_LINK_10))
|
||||
+ val |= FIELD_PREP(VSPEC1_LED_CON, VSPEC1_LED_LINK10);
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_LINK) ||
|
||||
+ rules & BIT(TRIGGER_NETDEV_LINK_100))
|
||||
+ val |= FIELD_PREP(VSPEC1_LED_CON, VSPEC1_LED_LINK100);
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_LINK) ||
|
||||
+ rules & BIT(TRIGGER_NETDEV_LINK_1000))
|
||||
+ val |= FIELD_PREP(VSPEC1_LED_CON, VSPEC1_LED_LINK1000);
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_LINK) ||
|
||||
+ rules & BIT(TRIGGER_NETDEV_LINK_2500))
|
||||
+ val |= FIELD_PREP(VSPEC1_LED_CON, VSPEC1_LED_LINK2500);
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_TX))
|
||||
+ val |= FIELD_PREP(VSPEC1_LED_PULSE, VSPEC1_LED_TXACT);
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_RX))
|
||||
+ val |= FIELD_PREP(VSPEC1_LED_PULSE, VSPEC1_LED_RXACT);
|
||||
+
|
||||
+ /* allow RX/TX pulse without link indication */
|
||||
+ if ((rules & BIT(TRIGGER_NETDEV_TX) || rules & BIT(TRIGGER_NETDEV_RX)) &&
|
||||
+ !(val & VSPEC1_LED_CON))
|
||||
+ val |= FIELD_PREP(VSPEC1_LED_PULSE, VSPEC1_LED_NO_CON) | VSPEC1_LED_CON;
|
||||
+
|
||||
+ ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_LED(index), val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return phy_set_bits(phydev, PHY_LED, PHY_LED_HWCONTROL(index));
|
||||
+}
|
||||
+
|
||||
+static int gpy_led_polarity_set(struct phy_device *phydev, int index,
|
||||
+ unsigned long modes)
|
||||
+{
|
||||
+ bool active_low = false;
|
||||
+ u32 mode;
|
||||
+
|
||||
+ if (index >= GPY_MAX_LEDS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ for_each_set_bit(mode, &modes, __PHY_LED_MODES_NUM) {
|
||||
+ switch (mode) {
|
||||
+ case PHY_LED_ACTIVE_LOW:
|
||||
+ active_low = true;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return phy_modify(phydev, PHY_LED, PHY_LED_POLARITY(index),
|
||||
+ active_low ? 0 : PHY_LED_POLARITY(index));
|
||||
+}
|
||||
+
|
||||
static struct phy_driver gpy_drivers[] = {
|
||||
{
|
||||
PHY_ID_MATCH_MODEL(PHY_ID_GPY2xx),
|
||||
@@ -852,6 +1025,11 @@ static struct phy_driver gpy_drivers[] =
|
||||
.set_wol = gpy_set_wol,
|
||||
.get_wol = gpy_get_wol,
|
||||
.set_loopback = gpy_loopback,
|
||||
+ .led_brightness_set = gpy_led_brightness_set,
|
||||
+ .led_hw_is_supported = gpy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = gpy_led_hw_control_get,
|
||||
+ .led_hw_control_set = gpy_led_hw_control_set,
|
||||
+ .led_polarity_set = gpy_led_polarity_set,
|
||||
},
|
||||
{
|
||||
.phy_id = PHY_ID_GPY115B,
|
||||
@@ -870,6 +1048,11 @@ static struct phy_driver gpy_drivers[] =
|
||||
.set_wol = gpy_set_wol,
|
||||
.get_wol = gpy_get_wol,
|
||||
.set_loopback = gpy115_loopback,
|
||||
+ .led_brightness_set = gpy_led_brightness_set,
|
||||
+ .led_hw_is_supported = gpy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = gpy_led_hw_control_get,
|
||||
+ .led_hw_control_set = gpy_led_hw_control_set,
|
||||
+ .led_polarity_set = gpy_led_polarity_set,
|
||||
},
|
||||
{
|
||||
PHY_ID_MATCH_MODEL(PHY_ID_GPY115C),
|
||||
@@ -887,6 +1070,11 @@ static struct phy_driver gpy_drivers[] =
|
||||
.set_wol = gpy_set_wol,
|
||||
.get_wol = gpy_get_wol,
|
||||
.set_loopback = gpy115_loopback,
|
||||
+ .led_brightness_set = gpy_led_brightness_set,
|
||||
+ .led_hw_is_supported = gpy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = gpy_led_hw_control_get,
|
||||
+ .led_hw_control_set = gpy_led_hw_control_set,
|
||||
+ .led_polarity_set = gpy_led_polarity_set,
|
||||
},
|
||||
{
|
||||
.phy_id = PHY_ID_GPY211B,
|
||||
@@ -905,6 +1093,11 @@ static struct phy_driver gpy_drivers[] =
|
||||
.set_wol = gpy_set_wol,
|
||||
.get_wol = gpy_get_wol,
|
||||
.set_loopback = gpy_loopback,
|
||||
+ .led_brightness_set = gpy_led_brightness_set,
|
||||
+ .led_hw_is_supported = gpy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = gpy_led_hw_control_get,
|
||||
+ .led_hw_control_set = gpy_led_hw_control_set,
|
||||
+ .led_polarity_set = gpy_led_polarity_set,
|
||||
},
|
||||
{
|
||||
PHY_ID_MATCH_MODEL(PHY_ID_GPY211C),
|
||||
@@ -922,6 +1115,11 @@ static struct phy_driver gpy_drivers[] =
|
||||
.set_wol = gpy_set_wol,
|
||||
.get_wol = gpy_get_wol,
|
||||
.set_loopback = gpy_loopback,
|
||||
+ .led_brightness_set = gpy_led_brightness_set,
|
||||
+ .led_hw_is_supported = gpy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = gpy_led_hw_control_get,
|
||||
+ .led_hw_control_set = gpy_led_hw_control_set,
|
||||
+ .led_polarity_set = gpy_led_polarity_set,
|
||||
},
|
||||
{
|
||||
.phy_id = PHY_ID_GPY212B,
|
||||
@@ -940,6 +1138,11 @@ static struct phy_driver gpy_drivers[] =
|
||||
.set_wol = gpy_set_wol,
|
||||
.get_wol = gpy_get_wol,
|
||||
.set_loopback = gpy_loopback,
|
||||
+ .led_brightness_set = gpy_led_brightness_set,
|
||||
+ .led_hw_is_supported = gpy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = gpy_led_hw_control_get,
|
||||
+ .led_hw_control_set = gpy_led_hw_control_set,
|
||||
+ .led_polarity_set = gpy_led_polarity_set,
|
||||
},
|
||||
{
|
||||
PHY_ID_MATCH_MODEL(PHY_ID_GPY212C),
|
||||
@@ -957,6 +1160,11 @@ static struct phy_driver gpy_drivers[] =
|
||||
.set_wol = gpy_set_wol,
|
||||
.get_wol = gpy_get_wol,
|
||||
.set_loopback = gpy_loopback,
|
||||
+ .led_brightness_set = gpy_led_brightness_set,
|
||||
+ .led_hw_is_supported = gpy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = gpy_led_hw_control_get,
|
||||
+ .led_hw_control_set = gpy_led_hw_control_set,
|
||||
+ .led_polarity_set = gpy_led_polarity_set,
|
||||
},
|
||||
{
|
||||
.phy_id = PHY_ID_GPY215B,
|
||||
@@ -975,6 +1183,11 @@ static struct phy_driver gpy_drivers[] =
|
||||
.set_wol = gpy_set_wol,
|
||||
.get_wol = gpy_get_wol,
|
||||
.set_loopback = gpy_loopback,
|
||||
+ .led_brightness_set = gpy_led_brightness_set,
|
||||
+ .led_hw_is_supported = gpy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = gpy_led_hw_control_get,
|
||||
+ .led_hw_control_set = gpy_led_hw_control_set,
|
||||
+ .led_polarity_set = gpy_led_polarity_set,
|
||||
},
|
||||
{
|
||||
PHY_ID_MATCH_MODEL(PHY_ID_GPY215C),
|
||||
@@ -992,6 +1205,11 @@ static struct phy_driver gpy_drivers[] =
|
||||
.set_wol = gpy_set_wol,
|
||||
.get_wol = gpy_get_wol,
|
||||
.set_loopback = gpy_loopback,
|
||||
+ .led_brightness_set = gpy_led_brightness_set,
|
||||
+ .led_hw_is_supported = gpy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = gpy_led_hw_control_get,
|
||||
+ .led_hw_control_set = gpy_led_hw_control_set,
|
||||
+ .led_polarity_set = gpy_led_polarity_set,
|
||||
},
|
||||
{
|
||||
PHY_ID_MATCH_MODEL(PHY_ID_GPY241B),
|
|
@ -0,0 +1,28 @@
|
|||
From f95b4725e796b12e5f347a0d161e1d3843142aa8 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Fri, 4 Oct 2024 16:56:35 +0100
|
||||
Subject: [PATCH] net: phy: mxl-gpy: add missing support for
|
||||
TRIGGER_NETDEV_LINK_10
|
||||
|
||||
The PHY also support 10MBit/s links as well as the corresponding link
|
||||
indication trigger to be offloaded. Add TRIGGER_NETDEV_LINK_10 to the
|
||||
supported triggers.
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Link: https://patch.msgid.link/cc5da0a989af8b0d49d823656d88053c4de2ab98.1728057367.git.daniel@makrotopia.org
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/phy/mxl-gpy.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/phy/mxl-gpy.c
|
||||
+++ b/drivers/net/phy/mxl-gpy.c
|
||||
@@ -884,6 +884,7 @@ static int gpy_led_brightness_set(struct
|
||||
}
|
||||
|
||||
static const unsigned long supported_triggers = (BIT(TRIGGER_NETDEV_LINK) |
|
||||
+ BIT(TRIGGER_NETDEV_LINK_10) |
|
||||
BIT(TRIGGER_NETDEV_LINK_100) |
|
||||
BIT(TRIGGER_NETDEV_LINK_1000) |
|
||||
BIT(TRIGGER_NETDEV_LINK_2500) |
|
|
@ -0,0 +1,58 @@
|
|||
From eb89c79c1b8f17fc1611540768678e60df89ac42 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Thu, 10 Oct 2024 13:55:17 +0100
|
||||
Subject: [PATCH 3/4] net: phy: mxl-gpy: correctly describe LED polarity
|
||||
|
||||
According the datasheet covering the LED (0x1b) register:
|
||||
0B Active High LEDx pin driven high when activated
|
||||
1B Active Low LEDx pin driven low when activated
|
||||
|
||||
Make use of the now available 'active-high' property and correctly
|
||||
reflect the polarity setting which was previously inverted.
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Link: https://patch.msgid.link/180ccafa837f09908b852a8a874a3808c5ecd2d0.1728558223.git.daniel@makrotopia.org
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
---
|
||||
drivers/net/phy/mxl-gpy.c | 16 ++++++++++++----
|
||||
1 file changed, 12 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/mxl-gpy.c
|
||||
+++ b/drivers/net/phy/mxl-gpy.c
|
||||
@@ -989,7 +989,7 @@ static int gpy_led_hw_control_set(struct
|
||||
static int gpy_led_polarity_set(struct phy_device *phydev, int index,
|
||||
unsigned long modes)
|
||||
{
|
||||
- bool active_low = false;
|
||||
+ bool force_active_low = false, force_active_high = false;
|
||||
u32 mode;
|
||||
|
||||
if (index >= GPY_MAX_LEDS)
|
||||
@@ -998,15 +998,23 @@ static int gpy_led_polarity_set(struct p
|
||||
for_each_set_bit(mode, &modes, __PHY_LED_MODES_NUM) {
|
||||
switch (mode) {
|
||||
case PHY_LED_ACTIVE_LOW:
|
||||
- active_low = true;
|
||||
+ force_active_low = true;
|
||||
+ break;
|
||||
+ case PHY_LED_ACTIVE_HIGH:
|
||||
+ force_active_high = true;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
- return phy_modify(phydev, PHY_LED, PHY_LED_POLARITY(index),
|
||||
- active_low ? 0 : PHY_LED_POLARITY(index));
|
||||
+ if (force_active_low)
|
||||
+ return phy_set_bits(phydev, PHY_LED, PHY_LED_POLARITY(index));
|
||||
+
|
||||
+ if (force_active_high)
|
||||
+ return phy_clear_bits(phydev, PHY_LED, PHY_LED_POLARITY(index));
|
||||
+
|
||||
+ unreachable();
|
||||
}
|
||||
|
||||
static struct phy_driver gpy_drivers[] = {
|
|
@ -0,0 +1,379 @@
|
|||
From 1758af47b98c17da464cb45f476875150955dd48 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Thu, 10 Oct 2024 13:55:29 +0100
|
||||
Subject: [PATCH 4/4] net: phy: intel-xway: add support for PHY LEDs
|
||||
|
||||
The intel-xway PHY driver predates the PHY LED framework and currently
|
||||
initializes all LED pins to equal default values.
|
||||
|
||||
Add PHY LED functions to the drivers and don't set default values if
|
||||
LEDs are defined in device tree.
|
||||
|
||||
According the datasheets 3 LEDs are supported on all Intel XWAY PHYs.
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Link: https://patch.msgid.link/81f4717ab9acf38f3239727a4540ae96fd01109b.1728558223.git.daniel@makrotopia.org
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
---
|
||||
drivers/net/phy/intel-xway.c | 253 +++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 244 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/intel-xway.c
|
||||
+++ b/drivers/net/phy/intel-xway.c
|
||||
@@ -151,6 +151,13 @@
|
||||
#define XWAY_MMD_LED3H 0x01E8
|
||||
#define XWAY_MMD_LED3L 0x01E9
|
||||
|
||||
+#define XWAY_GPHY_MAX_LEDS 3
|
||||
+#define XWAY_GPHY_LED_INV(idx) BIT(12 + (idx))
|
||||
+#define XWAY_GPHY_LED_EN(idx) BIT(8 + (idx))
|
||||
+#define XWAY_GPHY_LED_DA(idx) BIT(idx)
|
||||
+#define XWAY_MMD_LEDxH(idx) (XWAY_MMD_LED0H + 2 * (idx))
|
||||
+#define XWAY_MMD_LEDxL(idx) (XWAY_MMD_LED0L + 2 * (idx))
|
||||
+
|
||||
#define PHY_ID_PHY11G_1_3 0x030260D1
|
||||
#define PHY_ID_PHY22F_1_3 0x030260E1
|
||||
#define PHY_ID_PHY11G_1_4 0xD565A400
|
||||
@@ -229,20 +236,12 @@ static int xway_gphy_rgmii_init(struct p
|
||||
XWAY_MDIO_MIICTRL_TXSKEW_MASK, val);
|
||||
}
|
||||
|
||||
-static int xway_gphy_config_init(struct phy_device *phydev)
|
||||
+static int xway_gphy_init_leds(struct phy_device *phydev)
|
||||
{
|
||||
int err;
|
||||
u32 ledxh;
|
||||
u32 ledxl;
|
||||
|
||||
- /* Mask all interrupts */
|
||||
- err = phy_write(phydev, XWAY_MDIO_IMASK, 0);
|
||||
- if (err)
|
||||
- return err;
|
||||
-
|
||||
- /* Clear all pending interrupts */
|
||||
- phy_read(phydev, XWAY_MDIO_ISTAT);
|
||||
-
|
||||
/* Ensure that integrated led function is enabled for all leds */
|
||||
err = phy_write(phydev, XWAY_MDIO_LED,
|
||||
XWAY_MDIO_LED_LED0_EN |
|
||||
@@ -276,6 +275,26 @@ static int xway_gphy_config_init(struct
|
||||
phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2H, ledxh);
|
||||
phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2L, ledxl);
|
||||
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int xway_gphy_config_init(struct phy_device *phydev)
|
||||
+{
|
||||
+ struct device_node *np = phydev->mdio.dev.of_node;
|
||||
+ int err;
|
||||
+
|
||||
+ /* Mask all interrupts */
|
||||
+ err = phy_write(phydev, XWAY_MDIO_IMASK, 0);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* Use default LED configuration if 'leds' node isn't defined */
|
||||
+ if (!of_get_child_by_name(np, "leds"))
|
||||
+ xway_gphy_init_leds(phydev);
|
||||
+
|
||||
+ /* Clear all pending interrupts */
|
||||
+ phy_read(phydev, XWAY_MDIO_ISTAT);
|
||||
+
|
||||
err = xway_gphy_rgmii_init(phydev);
|
||||
if (err)
|
||||
return err;
|
||||
@@ -347,6 +366,172 @@ static irqreturn_t xway_gphy_handle_inte
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
+static int xway_gphy_led_brightness_set(struct phy_device *phydev,
|
||||
+ u8 index, enum led_brightness value)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ if (index >= XWAY_GPHY_MAX_LEDS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ /* clear EN and set manual LED state */
|
||||
+ ret = phy_modify(phydev, XWAY_MDIO_LED,
|
||||
+ ((value == LED_OFF) ? XWAY_GPHY_LED_EN(index) : 0) |
|
||||
+ XWAY_GPHY_LED_DA(index),
|
||||
+ (value == LED_OFF) ? 0 : XWAY_GPHY_LED_DA(index));
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* clear HW LED setup */
|
||||
+ if (value == LED_OFF) {
|
||||
+ ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDxH(index), 0);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDxL(index), 0);
|
||||
+ } else {
|
||||
+ return 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static const unsigned long supported_triggers = (BIT(TRIGGER_NETDEV_LINK) |
|
||||
+ BIT(TRIGGER_NETDEV_LINK_10) |
|
||||
+ BIT(TRIGGER_NETDEV_LINK_100) |
|
||||
+ BIT(TRIGGER_NETDEV_LINK_1000) |
|
||||
+ BIT(TRIGGER_NETDEV_RX) |
|
||||
+ BIT(TRIGGER_NETDEV_TX));
|
||||
+
|
||||
+static int xway_gphy_led_hw_is_supported(struct phy_device *phydev, u8 index,
|
||||
+ unsigned long rules)
|
||||
+{
|
||||
+ if (index >= XWAY_GPHY_MAX_LEDS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ /* activity triggers are not possible without combination with a link
|
||||
+ * trigger.
|
||||
+ */
|
||||
+ if (rules & (BIT(TRIGGER_NETDEV_RX) | BIT(TRIGGER_NETDEV_TX)) &&
|
||||
+ !(rules & (BIT(TRIGGER_NETDEV_LINK) |
|
||||
+ BIT(TRIGGER_NETDEV_LINK_10) |
|
||||
+ BIT(TRIGGER_NETDEV_LINK_100) |
|
||||
+ BIT(TRIGGER_NETDEV_LINK_1000))))
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ /* All other combinations of the supported triggers are allowed */
|
||||
+ if (rules & ~supported_triggers)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int xway_gphy_led_hw_control_get(struct phy_device *phydev, u8 index,
|
||||
+ unsigned long *rules)
|
||||
+{
|
||||
+ int lval, hval;
|
||||
+
|
||||
+ if (index >= XWAY_GPHY_MAX_LEDS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ hval = phy_read_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDxH(index));
|
||||
+ if (hval < 0)
|
||||
+ return hval;
|
||||
+
|
||||
+ lval = phy_read_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDxL(index));
|
||||
+ if (lval < 0)
|
||||
+ return lval;
|
||||
+
|
||||
+ if (hval & XWAY_MMD_LEDxH_CON_LINK10)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_LINK_10);
|
||||
+
|
||||
+ if (hval & XWAY_MMD_LEDxH_CON_LINK100)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_LINK_100);
|
||||
+
|
||||
+ if (hval & XWAY_MMD_LEDxH_CON_LINK1000)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_LINK_1000);
|
||||
+
|
||||
+ if ((hval & XWAY_MMD_LEDxH_CON_LINK10) &&
|
||||
+ (hval & XWAY_MMD_LEDxH_CON_LINK100) &&
|
||||
+ (hval & XWAY_MMD_LEDxH_CON_LINK1000))
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_LINK);
|
||||
+
|
||||
+ if (lval & XWAY_MMD_LEDxL_PULSE_TXACT)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_TX);
|
||||
+
|
||||
+ if (lval & XWAY_MMD_LEDxL_PULSE_RXACT)
|
||||
+ *rules |= BIT(TRIGGER_NETDEV_RX);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int xway_gphy_led_hw_control_set(struct phy_device *phydev, u8 index,
|
||||
+ unsigned long rules)
|
||||
+{
|
||||
+ u16 hval = 0, lval = 0;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (index >= XWAY_GPHY_MAX_LEDS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_LINK) ||
|
||||
+ rules & BIT(TRIGGER_NETDEV_LINK_10))
|
||||
+ hval |= XWAY_MMD_LEDxH_CON_LINK10;
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_LINK) ||
|
||||
+ rules & BIT(TRIGGER_NETDEV_LINK_100))
|
||||
+ hval |= XWAY_MMD_LEDxH_CON_LINK100;
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_LINK) ||
|
||||
+ rules & BIT(TRIGGER_NETDEV_LINK_1000))
|
||||
+ hval |= XWAY_MMD_LEDxH_CON_LINK1000;
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_TX))
|
||||
+ lval |= XWAY_MMD_LEDxL_PULSE_TXACT;
|
||||
+
|
||||
+ if (rules & BIT(TRIGGER_NETDEV_RX))
|
||||
+ lval |= XWAY_MMD_LEDxL_PULSE_RXACT;
|
||||
+
|
||||
+ ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDxH(index), hval);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDxL(index), lval);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return phy_set_bits(phydev, XWAY_MDIO_LED, XWAY_GPHY_LED_EN(index));
|
||||
+}
|
||||
+
|
||||
+static int xway_gphy_led_polarity_set(struct phy_device *phydev, int index,
|
||||
+ unsigned long modes)
|
||||
+{
|
||||
+ bool force_active_low = false, force_active_high = false;
|
||||
+ u32 mode;
|
||||
+
|
||||
+ if (index >= XWAY_GPHY_MAX_LEDS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ for_each_set_bit(mode, &modes, __PHY_LED_MODES_NUM) {
|
||||
+ switch (mode) {
|
||||
+ case PHY_LED_ACTIVE_LOW:
|
||||
+ force_active_low = true;
|
||||
+ break;
|
||||
+ case PHY_LED_ACTIVE_HIGH:
|
||||
+ force_active_high = true;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (force_active_low)
|
||||
+ return phy_set_bits(phydev, XWAY_MDIO_LED, XWAY_GPHY_LED_INV(index));
|
||||
+
|
||||
+ if (force_active_high)
|
||||
+ return phy_clear_bits(phydev, XWAY_MDIO_LED, XWAY_GPHY_LED_INV(index));
|
||||
+
|
||||
+ unreachable();
|
||||
+}
|
||||
+
|
||||
static struct phy_driver xway_gphy[] = {
|
||||
{
|
||||
.phy_id = PHY_ID_PHY11G_1_3,
|
||||
@@ -359,6 +544,11 @@ static struct phy_driver xway_gphy[] = {
|
||||
.config_intr = xway_gphy_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
+ .led_brightness_set = xway_gphy_led_brightness_set,
|
||||
+ .led_hw_is_supported = xway_gphy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = xway_gphy_led_hw_control_get,
|
||||
+ .led_hw_control_set = xway_gphy_led_hw_control_set,
|
||||
+ .led_polarity_set = xway_gphy_led_polarity_set,
|
||||
}, {
|
||||
.phy_id = PHY_ID_PHY22F_1_3,
|
||||
.phy_id_mask = 0xffffffff,
|
||||
@@ -370,6 +560,11 @@ static struct phy_driver xway_gphy[] = {
|
||||
.config_intr = xway_gphy_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
+ .led_brightness_set = xway_gphy_led_brightness_set,
|
||||
+ .led_hw_is_supported = xway_gphy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = xway_gphy_led_hw_control_get,
|
||||
+ .led_hw_control_set = xway_gphy_led_hw_control_set,
|
||||
+ .led_polarity_set = xway_gphy_led_polarity_set,
|
||||
}, {
|
||||
.phy_id = PHY_ID_PHY11G_1_4,
|
||||
.phy_id_mask = 0xffffffff,
|
||||
@@ -381,6 +576,11 @@ static struct phy_driver xway_gphy[] = {
|
||||
.config_intr = xway_gphy_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
+ .led_brightness_set = xway_gphy_led_brightness_set,
|
||||
+ .led_hw_is_supported = xway_gphy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = xway_gphy_led_hw_control_get,
|
||||
+ .led_hw_control_set = xway_gphy_led_hw_control_set,
|
||||
+ .led_polarity_set = xway_gphy_led_polarity_set,
|
||||
}, {
|
||||
.phy_id = PHY_ID_PHY22F_1_4,
|
||||
.phy_id_mask = 0xffffffff,
|
||||
@@ -392,6 +592,11 @@ static struct phy_driver xway_gphy[] = {
|
||||
.config_intr = xway_gphy_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
+ .led_brightness_set = xway_gphy_led_brightness_set,
|
||||
+ .led_hw_is_supported = xway_gphy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = xway_gphy_led_hw_control_get,
|
||||
+ .led_hw_control_set = xway_gphy_led_hw_control_set,
|
||||
+ .led_polarity_set = xway_gphy_led_polarity_set,
|
||||
}, {
|
||||
.phy_id = PHY_ID_PHY11G_1_5,
|
||||
.phy_id_mask = 0xffffffff,
|
||||
@@ -402,6 +607,11 @@ static struct phy_driver xway_gphy[] = {
|
||||
.config_intr = xway_gphy_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
+ .led_brightness_set = xway_gphy_led_brightness_set,
|
||||
+ .led_hw_is_supported = xway_gphy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = xway_gphy_led_hw_control_get,
|
||||
+ .led_hw_control_set = xway_gphy_led_hw_control_set,
|
||||
+ .led_polarity_set = xway_gphy_led_polarity_set,
|
||||
}, {
|
||||
.phy_id = PHY_ID_PHY22F_1_5,
|
||||
.phy_id_mask = 0xffffffff,
|
||||
@@ -412,6 +622,11 @@ static struct phy_driver xway_gphy[] = {
|
||||
.config_intr = xway_gphy_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
+ .led_brightness_set = xway_gphy_led_brightness_set,
|
||||
+ .led_hw_is_supported = xway_gphy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = xway_gphy_led_hw_control_get,
|
||||
+ .led_hw_control_set = xway_gphy_led_hw_control_set,
|
||||
+ .led_polarity_set = xway_gphy_led_polarity_set,
|
||||
}, {
|
||||
.phy_id = PHY_ID_PHY11G_VR9_1_1,
|
||||
.phy_id_mask = 0xffffffff,
|
||||
@@ -422,6 +637,11 @@ static struct phy_driver xway_gphy[] = {
|
||||
.config_intr = xway_gphy_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
+ .led_brightness_set = xway_gphy_led_brightness_set,
|
||||
+ .led_hw_is_supported = xway_gphy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = xway_gphy_led_hw_control_get,
|
||||
+ .led_hw_control_set = xway_gphy_led_hw_control_set,
|
||||
+ .led_polarity_set = xway_gphy_led_polarity_set,
|
||||
}, {
|
||||
.phy_id = PHY_ID_PHY22F_VR9_1_1,
|
||||
.phy_id_mask = 0xffffffff,
|
||||
@@ -432,6 +652,11 @@ static struct phy_driver xway_gphy[] = {
|
||||
.config_intr = xway_gphy_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
+ .led_brightness_set = xway_gphy_led_brightness_set,
|
||||
+ .led_hw_is_supported = xway_gphy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = xway_gphy_led_hw_control_get,
|
||||
+ .led_hw_control_set = xway_gphy_led_hw_control_set,
|
||||
+ .led_polarity_set = xway_gphy_led_polarity_set,
|
||||
}, {
|
||||
.phy_id = PHY_ID_PHY11G_VR9_1_2,
|
||||
.phy_id_mask = 0xffffffff,
|
||||
@@ -442,6 +667,11 @@ static struct phy_driver xway_gphy[] = {
|
||||
.config_intr = xway_gphy_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
+ .led_brightness_set = xway_gphy_led_brightness_set,
|
||||
+ .led_hw_is_supported = xway_gphy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = xway_gphy_led_hw_control_get,
|
||||
+ .led_hw_control_set = xway_gphy_led_hw_control_set,
|
||||
+ .led_polarity_set = xway_gphy_led_polarity_set,
|
||||
}, {
|
||||
.phy_id = PHY_ID_PHY22F_VR9_1_2,
|
||||
.phy_id_mask = 0xffffffff,
|
||||
@@ -452,6 +682,11 @@ static struct phy_driver xway_gphy[] = {
|
||||
.config_intr = xway_gphy_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
+ .led_brightness_set = xway_gphy_led_brightness_set,
|
||||
+ .led_hw_is_supported = xway_gphy_led_hw_is_supported,
|
||||
+ .led_hw_control_get = xway_gphy_led_hw_control_get,
|
||||
+ .led_hw_control_set = xway_gphy_led_hw_control_set,
|
||||
+ .led_polarity_set = xway_gphy_led_polarity_set,
|
||||
},
|
||||
};
|
||||
module_phy_driver(xway_gphy);
|
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue