mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
net: phy: air_phy_lib: Factorize BuckPBus register accessors
In preparation of Airoha AN8801R PHY support, move the BuckPBus register accessors and definitions, present in air_en8811h driver, into the Airoha PHY shared code (air_phy_lib), so they will be usable by the new driver without duplicating them. Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com> Link: https://patch.msgid.link/20260526-add-airoha-an8801-support-v5-3-01aea8dee69b@collabora.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
dddfadd751
commit
5226bb6634
|
|
@ -42,22 +42,6 @@
|
||||||
#define AIR_AUX_CTRL_STATUS_SPEED_1000 0x8
|
#define AIR_AUX_CTRL_STATUS_SPEED_1000 0x8
|
||||||
#define AIR_AUX_CTRL_STATUS_SPEED_2500 0xc
|
#define AIR_AUX_CTRL_STATUS_SPEED_2500 0xc
|
||||||
|
|
||||||
#define AIR_PHY_PAGE_STANDARD 0x0000
|
|
||||||
#define AIR_PHY_PAGE_EXTENDED_4 0x0004
|
|
||||||
|
|
||||||
/* MII Registers Page 4*/
|
|
||||||
#define AIR_BPBUS_MODE 0x10
|
|
||||||
#define AIR_BPBUS_MODE_ADDR_FIXED 0x0000
|
|
||||||
#define AIR_BPBUS_MODE_ADDR_INCR BIT(15)
|
|
||||||
#define AIR_BPBUS_WR_ADDR_HIGH 0x11
|
|
||||||
#define AIR_BPBUS_WR_ADDR_LOW 0x12
|
|
||||||
#define AIR_BPBUS_WR_DATA_HIGH 0x13
|
|
||||||
#define AIR_BPBUS_WR_DATA_LOW 0x14
|
|
||||||
#define AIR_BPBUS_RD_ADDR_HIGH 0x15
|
|
||||||
#define AIR_BPBUS_RD_ADDR_LOW 0x16
|
|
||||||
#define AIR_BPBUS_RD_DATA_HIGH 0x17
|
|
||||||
#define AIR_BPBUS_RD_DATA_LOW 0x18
|
|
||||||
|
|
||||||
/* Registers on MDIO_MMD_VEND1 */
|
/* Registers on MDIO_MMD_VEND1 */
|
||||||
#define EN8811H_PHY_FW_STATUS 0x8009
|
#define EN8811H_PHY_FW_STATUS 0x8009
|
||||||
#define EN8811H_PHY_READY 0x02
|
#define EN8811H_PHY_READY 0x02
|
||||||
|
|
@ -245,183 +229,6 @@ static const unsigned long en8811h_led_trig = BIT(TRIGGER_NETDEV_FULL_DUPLEX) |
|
||||||
BIT(TRIGGER_NETDEV_RX) |
|
BIT(TRIGGER_NETDEV_RX) |
|
||||||
BIT(TRIGGER_NETDEV_TX);
|
BIT(TRIGGER_NETDEV_TX);
|
||||||
|
|
||||||
static int __air_buckpbus_reg_write(struct phy_device *phydev,
|
|
||||||
u32 pbus_address, u32 pbus_data)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
|
|
||||||
upper_16_bits(pbus_address));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
|
|
||||||
lower_16_bits(pbus_address));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
|
|
||||||
upper_16_bits(pbus_data));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
|
|
||||||
lower_16_bits(pbus_data));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int air_buckpbus_reg_write(struct phy_device *phydev,
|
|
||||||
u32 pbus_address, u32 pbus_data)
|
|
||||||
{
|
|
||||||
int saved_page;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
|
|
||||||
|
|
||||||
if (saved_page >= 0) {
|
|
||||||
ret = __air_buckpbus_reg_write(phydev, pbus_address,
|
|
||||||
pbus_data);
|
|
||||||
if (ret < 0)
|
|
||||||
phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
|
|
||||||
pbus_address, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
return phy_restore_page(phydev, saved_page, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __air_buckpbus_reg_read(struct phy_device *phydev,
|
|
||||||
u32 pbus_address, u32 *pbus_data)
|
|
||||||
{
|
|
||||||
int pbus_data_low, pbus_data_high;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
|
|
||||||
upper_16_bits(pbus_address));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
|
|
||||||
lower_16_bits(pbus_address));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
|
|
||||||
if (pbus_data_high < 0)
|
|
||||||
return pbus_data_high;
|
|
||||||
|
|
||||||
pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
|
|
||||||
if (pbus_data_low < 0)
|
|
||||||
return pbus_data_low;
|
|
||||||
|
|
||||||
*pbus_data = pbus_data_low | (pbus_data_high << 16);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int air_buckpbus_reg_read(struct phy_device *phydev,
|
|
||||||
u32 pbus_address, u32 *pbus_data)
|
|
||||||
{
|
|
||||||
int saved_page;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
|
|
||||||
|
|
||||||
if (saved_page >= 0) {
|
|
||||||
ret = __air_buckpbus_reg_read(phydev, pbus_address, pbus_data);
|
|
||||||
if (ret < 0)
|
|
||||||
phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
|
|
||||||
pbus_address, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
return phy_restore_page(phydev, saved_page, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __air_buckpbus_reg_modify(struct phy_device *phydev,
|
|
||||||
u32 pbus_address, u32 mask, u32 set)
|
|
||||||
{
|
|
||||||
int pbus_data_low, pbus_data_high;
|
|
||||||
u32 pbus_data_old, pbus_data_new;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
|
|
||||||
upper_16_bits(pbus_address));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
|
|
||||||
lower_16_bits(pbus_address));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
|
|
||||||
if (pbus_data_high < 0)
|
|
||||||
return pbus_data_high;
|
|
||||||
|
|
||||||
pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
|
|
||||||
if (pbus_data_low < 0)
|
|
||||||
return pbus_data_low;
|
|
||||||
|
|
||||||
pbus_data_old = pbus_data_low | (pbus_data_high << 16);
|
|
||||||
pbus_data_new = (pbus_data_old & ~mask) | set;
|
|
||||||
if (pbus_data_new == pbus_data_old)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
|
|
||||||
upper_16_bits(pbus_address));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
|
|
||||||
lower_16_bits(pbus_address));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
|
|
||||||
upper_16_bits(pbus_data_new));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
|
|
||||||
lower_16_bits(pbus_data_new));
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int air_buckpbus_reg_modify(struct phy_device *phydev,
|
|
||||||
u32 pbus_address, u32 mask, u32 set)
|
|
||||||
{
|
|
||||||
int saved_page;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
|
|
||||||
|
|
||||||
if (saved_page >= 0) {
|
|
||||||
ret = __air_buckpbus_reg_modify(phydev, pbus_address, mask,
|
|
||||||
set);
|
|
||||||
if (ret < 0)
|
|
||||||
phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
|
|
||||||
pbus_address, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
return phy_restore_page(phydev, saved_page, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __air_write_buf(struct phy_device *phydev, u32 address,
|
static int __air_write_buf(struct phy_device *phydev, u32 address,
|
||||||
const struct firmware *fw)
|
const struct firmware *fw)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,192 @@
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/phy.h>
|
#include <linux/phy.h>
|
||||||
|
#include <linux/wordpart.h>
|
||||||
|
|
||||||
#include "air_phy_lib.h"
|
#include "air_phy_lib.h"
|
||||||
|
|
||||||
#define AIR_EXT_PAGE_ACCESS 0x1f
|
#define AIR_EXT_PAGE_ACCESS 0x1f
|
||||||
|
|
||||||
|
static int __air_buckpbus_reg_read(struct phy_device *phydev,
|
||||||
|
u32 pbus_address, u32 *pbus_data)
|
||||||
|
{
|
||||||
|
int pbus_data_low, pbus_data_high;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
|
||||||
|
upper_16_bits(pbus_address));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
|
||||||
|
lower_16_bits(pbus_address));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
|
||||||
|
if (pbus_data_high < 0)
|
||||||
|
return pbus_data_high;
|
||||||
|
|
||||||
|
pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
|
||||||
|
if (pbus_data_low < 0)
|
||||||
|
return pbus_data_low;
|
||||||
|
|
||||||
|
*pbus_data = pbus_data_low | (pbus_data_high << 16);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __air_buckpbus_reg_write(struct phy_device *phydev,
|
||||||
|
u32 pbus_address, u32 pbus_data)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
|
||||||
|
upper_16_bits(pbus_address));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
|
||||||
|
lower_16_bits(pbus_address));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
|
||||||
|
upper_16_bits(pbus_data));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
|
||||||
|
lower_16_bits(pbus_data));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __air_buckpbus_reg_modify(struct phy_device *phydev,
|
||||||
|
u32 pbus_address, u32 mask, u32 set)
|
||||||
|
{
|
||||||
|
int pbus_data_low, pbus_data_high;
|
||||||
|
u32 pbus_data_old, pbus_data_new;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
|
||||||
|
upper_16_bits(pbus_address));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
|
||||||
|
lower_16_bits(pbus_address));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
|
||||||
|
if (pbus_data_high < 0)
|
||||||
|
return pbus_data_high;
|
||||||
|
|
||||||
|
pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
|
||||||
|
if (pbus_data_low < 0)
|
||||||
|
return pbus_data_low;
|
||||||
|
|
||||||
|
pbus_data_old = pbus_data_low | (pbus_data_high << 16);
|
||||||
|
pbus_data_new = (pbus_data_old & ~mask) | set;
|
||||||
|
if (pbus_data_new == pbus_data_old)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
|
||||||
|
upper_16_bits(pbus_address));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
|
||||||
|
lower_16_bits(pbus_address));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
|
||||||
|
upper_16_bits(pbus_data_new));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
|
||||||
|
lower_16_bits(pbus_data_new));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int air_buckpbus_reg_read(struct phy_device *phydev, u32 pbus_address,
|
||||||
|
u32 *pbus_data)
|
||||||
|
{
|
||||||
|
int saved_page;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
|
||||||
|
|
||||||
|
if (saved_page >= 0) {
|
||||||
|
ret = __air_buckpbus_reg_read(phydev, pbus_address, pbus_data);
|
||||||
|
if (ret < 0)
|
||||||
|
phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
|
||||||
|
pbus_address, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return phy_restore_page(phydev, saved_page, ret);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(air_buckpbus_reg_read);
|
||||||
|
|
||||||
|
int air_buckpbus_reg_write(struct phy_device *phydev, u32 pbus_address,
|
||||||
|
u32 pbus_data)
|
||||||
|
{
|
||||||
|
int saved_page;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
|
||||||
|
|
||||||
|
if (saved_page >= 0) {
|
||||||
|
ret = __air_buckpbus_reg_write(phydev, pbus_address,
|
||||||
|
pbus_data);
|
||||||
|
if (ret < 0)
|
||||||
|
phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
|
||||||
|
pbus_address, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return phy_restore_page(phydev, saved_page, ret);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(air_buckpbus_reg_write);
|
||||||
|
|
||||||
|
int air_buckpbus_reg_modify(struct phy_device *phydev, u32 pbus_address,
|
||||||
|
u32 mask, u32 set)
|
||||||
|
{
|
||||||
|
int saved_page;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
|
||||||
|
|
||||||
|
if (saved_page >= 0) {
|
||||||
|
ret = __air_buckpbus_reg_modify(phydev, pbus_address, mask,
|
||||||
|
set);
|
||||||
|
if (ret < 0)
|
||||||
|
phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
|
||||||
|
pbus_address, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return phy_restore_page(phydev, saved_page, ret);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(air_buckpbus_reg_modify);
|
||||||
|
|
||||||
int air_phy_read_page(struct phy_device *phydev)
|
int air_phy_read_page(struct phy_device *phydev)
|
||||||
{
|
{
|
||||||
return __phy_read(phydev, AIR_EXT_PAGE_ACCESS);
|
return __phy_read(phydev, AIR_EXT_PAGE_ACCESS);
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,29 @@
|
||||||
|
|
||||||
#include <linux/phy.h>
|
#include <linux/phy.h>
|
||||||
|
|
||||||
|
#define AIR_PHY_PAGE_STANDARD 0x0000
|
||||||
|
#define AIR_PHY_PAGE_EXTENDED_1 0x0001
|
||||||
|
#define AIR_PHY_PAGE_EXTENDED_4 0x0004
|
||||||
|
|
||||||
|
/* MII Registers Page 4*/
|
||||||
|
#define AIR_BPBUS_MODE 0x10
|
||||||
|
#define AIR_BPBUS_MODE_ADDR_FIXED 0x0000
|
||||||
|
#define AIR_BPBUS_MODE_ADDR_INCR BIT(15)
|
||||||
|
#define AIR_BPBUS_WR_ADDR_HIGH 0x11
|
||||||
|
#define AIR_BPBUS_WR_ADDR_LOW 0x12
|
||||||
|
#define AIR_BPBUS_WR_DATA_HIGH 0x13
|
||||||
|
#define AIR_BPBUS_WR_DATA_LOW 0x14
|
||||||
|
#define AIR_BPBUS_RD_ADDR_HIGH 0x15
|
||||||
|
#define AIR_BPBUS_RD_ADDR_LOW 0x16
|
||||||
|
#define AIR_BPBUS_RD_DATA_HIGH 0x17
|
||||||
|
#define AIR_BPBUS_RD_DATA_LOW 0x18
|
||||||
|
|
||||||
|
int air_buckpbus_reg_modify(struct phy_device *phydev, u32 pbus_address,
|
||||||
|
u32 mask, u32 set);
|
||||||
|
int air_buckpbus_reg_read(struct phy_device *phydev, u32 pbus_address,
|
||||||
|
u32 *pbus_data);
|
||||||
|
int air_buckpbus_reg_write(struct phy_device *phydev, u32 pbus_address,
|
||||||
|
u32 pbus_data);
|
||||||
int air_phy_read_page(struct phy_device *phydev);
|
int air_phy_read_page(struct phy_device *phydev);
|
||||||
int air_phy_write_page(struct phy_device *phydev, int page);
|
int air_phy_write_page(struct phy_device *phydev, int page);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user