Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Fun set of conflict resolutions here... For the mac80211 stuff, these were fortunately just parallel adds. Trivially resolved. In drivers/net/phy/phy.c we had a bug fix in 'net' that moved the function phy_disable_interrupts() earlier in the file, whilst in 'net-next' the phy_error() call from this function was removed. In net/ipv4/xfrm4_policy.c, David Ahern's changes to remove the 'rt_table_id' member of rtable collided with a bug fix in 'net' that added a new struct member "rt_mtu_locked" which needs to be copied over here. The mlxsw driver conflict consisted of net-next separating the span code and definitions into separate files, whilst a 'net' bug fix made some changes to that moved code. The mlx5 infiniband conflict resolution was quite non-trivial, the RDMA tree's merge commit was used as a guide here, and here are their notes: ==================== Due to bug fixes found by the syzkaller bot and taken into the for-rc branch after development for the 4.17 merge window had already started being taken into the for-next branch, there were fairly non-trivial merge issues that would need to be resolved between the for-rc branch and the for-next branch. This merge resolves those conflicts and provides a unified base upon which ongoing development for 4.17 can be based. Conflicts: drivers/infiniband/hw/mlx5/main.c - Commit42cea83f95
(IB/mlx5: Fix cleanup order on unload) added to for-rc and commitb5ca15ad7e
(IB/mlx5: Add proper representors support) add as part of the devel cycle both needed to modify the init/de-init functions used by mlx5. To support the new representors, the new functions added by the cleanup patch needed to be made non-static, and the init/de-init list added by the representors patch needed to be modified to match the init/de-init list changes made by the cleanup patch. Updates: drivers/infiniband/hw/mlx5/mlx5_ib.h - Update function prototypes added by representors patch to reflect new function names as changed by cleanup patch drivers/infiniband/hw/mlx5/ib_rep.c - Update init/de-init stage list to match new order from cleanup patch ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -341,8 +341,8 @@ void bcm_phy_get_strings(struct phy_device *phydev, u8 *data)
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bcm_phy_hw_stats); i++)
|
||||
memcpy(data + i * ETH_GSTRING_LEN,
|
||||
bcm_phy_hw_stats[i].string, ETH_GSTRING_LEN);
|
||||
strlcpy(data + i * ETH_GSTRING_LEN,
|
||||
bcm_phy_hw_stats[i].string, ETH_GSTRING_LEN);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bcm_phy_get_strings);
|
||||
|
||||
|
@@ -1452,8 +1452,8 @@ static void marvell_get_strings(struct phy_device *phydev, u8 *data)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(marvell_hw_stats); i++) {
|
||||
memcpy(data + i * ETH_GSTRING_LEN,
|
||||
marvell_hw_stats[i].string, ETH_GSTRING_LEN);
|
||||
strlcpy(data + i * ETH_GSTRING_LEN,
|
||||
marvell_hw_stats[i].string, ETH_GSTRING_LEN);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -635,25 +635,6 @@ static int ksz8873mll_config_aneg(struct phy_device *phydev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This routine returns -1 as an indication to the caller that the
|
||||
* Micrel ksz9021 10/100/1000 PHY does not support standard IEEE
|
||||
* MMD extended PHY registers.
|
||||
*/
|
||||
static int
|
||||
ksz9021_rd_mmd_phyreg(struct phy_device *phydev, int devad, u16 regnum)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* This routine does nothing since the Micrel ksz9021 does not support
|
||||
* standard IEEE MMD extended PHY registers.
|
||||
*/
|
||||
static int
|
||||
ksz9021_wr_mmd_phyreg(struct phy_device *phydev, int devad, u16 regnum, u16 val)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int kszphy_get_sset_count(struct phy_device *phydev)
|
||||
{
|
||||
return ARRAY_SIZE(kszphy_hw_stats);
|
||||
@@ -664,8 +645,8 @@ static void kszphy_get_strings(struct phy_device *phydev, u8 *data)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(kszphy_hw_stats); i++) {
|
||||
memcpy(data + i * ETH_GSTRING_LEN,
|
||||
kszphy_hw_stats[i].string, ETH_GSTRING_LEN);
|
||||
strlcpy(data + i * ETH_GSTRING_LEN,
|
||||
kszphy_hw_stats[i].string, ETH_GSTRING_LEN);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -946,8 +927,8 @@ static struct phy_driver ksphy_driver[] = {
|
||||
.get_stats = kszphy_get_stats,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
.read_mmd = ksz9021_rd_mmd_phyreg,
|
||||
.write_mmd = ksz9021_wr_mmd_phyreg,
|
||||
.read_mmd = genphy_read_mmd_unsupported,
|
||||
.write_mmd = genphy_write_mmd_unsupported,
|
||||
}, {
|
||||
.phy_id = PHY_ID_KSZ9031,
|
||||
.phy_id_mask = MICREL_PHY_ID_MASK,
|
||||
|
@@ -617,40 +617,6 @@ static void phy_error(struct phy_device *phydev)
|
||||
phy_trigger_machine(phydev, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_interrupt - PHY interrupt handler
|
||||
* @irq: interrupt line
|
||||
* @phy_dat: phy_device pointer
|
||||
*
|
||||
* Description: When a PHY interrupt occurs, the handler disables
|
||||
* interrupts, and uses phy_change to handle the interrupt.
|
||||
*/
|
||||
static irqreturn_t phy_interrupt(int irq, void *phy_dat)
|
||||
{
|
||||
struct phy_device *phydev = phy_dat;
|
||||
|
||||
if (PHY_HALTED == phydev->state)
|
||||
return IRQ_NONE; /* It can't be ours. */
|
||||
|
||||
phy_change(phydev);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_enable_interrupts - Enable the interrupts from the PHY side
|
||||
* @phydev: target phy_device struct
|
||||
*/
|
||||
static int phy_enable_interrupts(struct phy_device *phydev)
|
||||
{
|
||||
int err = phy_clear_interrupt(phydev);
|
||||
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_disable_interrupts - Disable the PHY interrupts from the PHY side
|
||||
* @phydev: target phy_device struct
|
||||
@@ -668,6 +634,83 @@ static int phy_disable_interrupts(struct phy_device *phydev)
|
||||
return phy_clear_interrupt(phydev);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_change - Called by the phy_interrupt to handle PHY changes
|
||||
* @phydev: phy_device struct that interrupted
|
||||
*/
|
||||
static irqreturn_t phy_change(struct phy_device *phydev)
|
||||
{
|
||||
if (phy_interrupt_is_valid(phydev)) {
|
||||
if (phydev->drv->did_interrupt &&
|
||||
!phydev->drv->did_interrupt(phydev))
|
||||
return IRQ_NONE;
|
||||
|
||||
if (phydev->state == PHY_HALTED)
|
||||
if (phy_disable_interrupts(phydev))
|
||||
goto phy_err;
|
||||
}
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
if ((PHY_RUNNING == phydev->state) || (PHY_NOLINK == phydev->state))
|
||||
phydev->state = PHY_CHANGELINK;
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
/* reschedule state queue work to run as soon as possible */
|
||||
phy_trigger_machine(phydev, true);
|
||||
|
||||
if (phy_interrupt_is_valid(phydev) && phy_clear_interrupt(phydev))
|
||||
goto phy_err;
|
||||
return IRQ_HANDLED;
|
||||
|
||||
phy_err:
|
||||
phy_error(phydev);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_change_work - Scheduled by the phy_mac_interrupt to handle PHY changes
|
||||
* @work: work_struct that describes the work to be done
|
||||
*/
|
||||
void phy_change_work(struct work_struct *work)
|
||||
{
|
||||
struct phy_device *phydev =
|
||||
container_of(work, struct phy_device, phy_queue);
|
||||
|
||||
phy_change(phydev);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_interrupt - PHY interrupt handler
|
||||
* @irq: interrupt line
|
||||
* @phy_dat: phy_device pointer
|
||||
*
|
||||
* Description: When a PHY interrupt occurs, the handler disables
|
||||
* interrupts, and uses phy_change to handle the interrupt.
|
||||
*/
|
||||
static irqreturn_t phy_interrupt(int irq, void *phy_dat)
|
||||
{
|
||||
struct phy_device *phydev = phy_dat;
|
||||
|
||||
if (PHY_HALTED == phydev->state)
|
||||
return IRQ_NONE; /* It can't be ours. */
|
||||
|
||||
return phy_change(phydev);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_enable_interrupts - Enable the interrupts from the PHY side
|
||||
* @phydev: target phy_device struct
|
||||
*/
|
||||
static int phy_enable_interrupts(struct phy_device *phydev)
|
||||
{
|
||||
int err = phy_clear_interrupt(phydev);
|
||||
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_start_interrupts - request and enable interrupts for a PHY device
|
||||
* @phydev: target phy_device struct
|
||||
@@ -710,50 +753,6 @@ int phy_stop_interrupts(struct phy_device *phydev)
|
||||
}
|
||||
EXPORT_SYMBOL(phy_stop_interrupts);
|
||||
|
||||
/**
|
||||
* phy_change - Called by the phy_interrupt to handle PHY changes
|
||||
* @phydev: phy_device struct that interrupted
|
||||
*/
|
||||
void phy_change(struct phy_device *phydev)
|
||||
{
|
||||
if (phy_interrupt_is_valid(phydev)) {
|
||||
if (phydev->drv->did_interrupt &&
|
||||
!phydev->drv->did_interrupt(phydev))
|
||||
return;
|
||||
|
||||
if (phydev->state == PHY_HALTED)
|
||||
if (phy_disable_interrupts(phydev))
|
||||
goto phy_err;
|
||||
}
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
if ((PHY_RUNNING == phydev->state) || (PHY_NOLINK == phydev->state))
|
||||
phydev->state = PHY_CHANGELINK;
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
/* reschedule state queue work to run as soon as possible */
|
||||
phy_trigger_machine(phydev, true);
|
||||
|
||||
if (phy_interrupt_is_valid(phydev) && phy_clear_interrupt(phydev))
|
||||
goto phy_err;
|
||||
return;
|
||||
|
||||
phy_err:
|
||||
phy_error(phydev);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_change_work - Scheduled by the phy_mac_interrupt to handle PHY changes
|
||||
* @work: work_struct that describes the work to be done
|
||||
*/
|
||||
void phy_change_work(struct work_struct *work)
|
||||
{
|
||||
struct phy_device *phydev =
|
||||
container_of(work, struct phy_device, phy_queue);
|
||||
|
||||
phy_change(phydev);
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_stop - Bring down the PHY link, and stop checking the status
|
||||
* @phydev: target phy_device struct
|
||||
|
@@ -1012,10 +1012,17 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
|
||||
err = sysfs_create_link(&phydev->mdio.dev.kobj, &dev->dev.kobj,
|
||||
"attached_dev");
|
||||
if (!err) {
|
||||
err = sysfs_create_link(&dev->dev.kobj, &phydev->mdio.dev.kobj,
|
||||
"phydev");
|
||||
if (err)
|
||||
goto error;
|
||||
err = sysfs_create_link_nowarn(&dev->dev.kobj,
|
||||
&phydev->mdio.dev.kobj,
|
||||
"phydev");
|
||||
if (err) {
|
||||
dev_err(&dev->dev, "could not add device link to %s err %d\n",
|
||||
kobject_name(&phydev->mdio.dev.kobj),
|
||||
err);
|
||||
/* non-fatal - some net drivers can use one netdevice
|
||||
* with more then one phy
|
||||
*/
|
||||
}
|
||||
|
||||
phydev->sysfs_links = true;
|
||||
}
|
||||
@@ -1666,6 +1673,23 @@ int genphy_config_init(struct phy_device *phydev)
|
||||
}
|
||||
EXPORT_SYMBOL(genphy_config_init);
|
||||
|
||||
/* This is used for the phy device which doesn't support the MMD extended
|
||||
* register access, but it does have side effect when we are trying to access
|
||||
* the MMD register via indirect method.
|
||||
*/
|
||||
int genphy_read_mmd_unsupported(struct phy_device *phdev, int devad, u16 regnum)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL(genphy_read_mmd_unsupported);
|
||||
|
||||
int genphy_write_mmd_unsupported(struct phy_device *phdev, int devnum,
|
||||
u16 regnum, u16 val)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL(genphy_write_mmd_unsupported);
|
||||
|
||||
int genphy_suspend(struct phy_device *phydev)
|
||||
{
|
||||
return phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN);
|
||||
|
@@ -172,6 +172,8 @@ static struct phy_driver realtek_drvs[] = {
|
||||
.flags = PHY_HAS_INTERRUPT,
|
||||
.ack_interrupt = &rtl821x_ack_interrupt,
|
||||
.config_intr = &rtl8211b_config_intr,
|
||||
.read_mmd = &genphy_read_mmd_unsupported,
|
||||
.write_mmd = &genphy_write_mmd_unsupported,
|
||||
}, {
|
||||
.phy_id = 0x001cc914,
|
||||
.name = "RTL8211DN Gigabit Ethernet",
|
||||
|
Reference in New Issue
Block a user