|
@@ -39,7 +39,9 @@
|
|
|
#include <asm/irq.h>
|
|
|
#include <asm/uaccess.h>
|
|
|
|
|
|
-/* Convenience function to print out the current phy status
|
|
|
+/**
|
|
|
+ * phy_print_status - Convenience function to print out the current phy status
|
|
|
+ * @phydev: the phy_device struct
|
|
|
*/
|
|
|
void phy_print_status(struct phy_device *phydev)
|
|
|
{
|
|
@@ -55,10 +57,15 @@ void phy_print_status(struct phy_device *phydev)
|
|
|
EXPORT_SYMBOL(phy_print_status);
|
|
|
|
|
|
|
|
|
-/* Convenience functions for reading/writing a given PHY
|
|
|
- * register. They MUST NOT be called from interrupt context,
|
|
|
+/**
|
|
|
+ * phy_read - Convenience function for reading a given PHY register
|
|
|
+ * @phydev: the phy_device struct
|
|
|
+ * @regnum: register number to read
|
|
|
+ *
|
|
|
+ * NOTE: MUST NOT be called from interrupt context,
|
|
|
* because the bus read/write functions may wait for an interrupt
|
|
|
- * to conclude the operation. */
|
|
|
+ * to conclude the operation.
|
|
|
+ */
|
|
|
int phy_read(struct phy_device *phydev, u16 regnum)
|
|
|
{
|
|
|
int retval;
|
|
@@ -72,6 +79,16 @@ int phy_read(struct phy_device *phydev, u16 regnum)
|
|
|
}
|
|
|
EXPORT_SYMBOL(phy_read);
|
|
|
|
|
|
+/**
|
|
|
+ * phy_write - Convenience function for writing a given PHY register
|
|
|
+ * @phydev: the phy_device struct
|
|
|
+ * @regnum: register number to write
|
|
|
+ * @val: value to write to @regnum
|
|
|
+ *
|
|
|
+ * NOTE: MUST NOT be called from interrupt context,
|
|
|
+ * because the bus read/write functions may wait for an interrupt
|
|
|
+ * to conclude the operation.
|
|
|
+ */
|
|
|
int phy_write(struct phy_device *phydev, u16 regnum, u16 val)
|
|
|
{
|
|
|
int err;
|
|
@@ -85,7 +102,15 @@ int phy_write(struct phy_device *phydev, u16 regnum, u16 val)
|
|
|
}
|
|
|
EXPORT_SYMBOL(phy_write);
|
|
|
|
|
|
-
|
|
|
+/**
|
|
|
+ * phy_clear_interrupt - Ack the phy device's interrupt
|
|
|
+ * @phydev: the phy_device struct
|
|
|
+ *
|
|
|
+ * If the @phydev driver has an ack_interrupt function, call it to
|
|
|
+ * ack and clear the phy device's interrupt.
|
|
|
+ *
|
|
|
+ * Returns 0 on success on < 0 on error.
|
|
|
+ */
|
|
|
int phy_clear_interrupt(struct phy_device *phydev)
|
|
|
{
|
|
|
int err = 0;
|
|
@@ -96,7 +121,13 @@ int phy_clear_interrupt(struct phy_device *phydev)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+/**
|
|
|
+ * phy_config_interrupt - configure the PHY device for the requested interrupts
|
|
|
+ * @phydev: the phy_device struct
|
|
|
+ * @interrupts: interrupt flags to configure for this @phydev
|
|
|
+ *
|
|
|
+ * Returns 0 on success on < 0 on error.
|
|
|
+ */
|
|
|
int phy_config_interrupt(struct phy_device *phydev, u32 interrupts)
|
|
|
{
|
|
|
int err = 0;
|
|
@@ -109,9 +140,11 @@ int phy_config_interrupt(struct phy_device *phydev, u32 interrupts)
|
|
|
}
|
|
|
|
|
|
|
|
|
-/* phy_aneg_done
|
|
|
+/**
|
|
|
+ * phy_aneg_done - return auto-negotiation status
|
|
|
+ * @phydev: target phy_device struct
|
|
|
*
|
|
|
- * description: Reads the status register and returns 0 either if
|
|
|
+ * Description: Reads the status register and returns 0 either if
|
|
|
* auto-negotiation is incomplete, or if there was an error.
|
|
|
* Returns BMSR_ANEGCOMPLETE if auto-negotiation is done.
|
|
|
*/
|
|
@@ -173,9 +206,12 @@ static const struct phy_setting settings[] = {
|
|
|
|
|
|
#define MAX_NUM_SETTINGS (sizeof(settings)/sizeof(struct phy_setting))
|
|
|
|
|
|
-/* phy_find_setting
|
|
|
+/**
|
|
|
+ * phy_find_setting - find a PHY settings array entry that matches speed & duplex
|
|
|
+ * @speed: speed to match
|
|
|
+ * @duplex: duplex to match
|
|
|
*
|
|
|
- * description: Searches the settings array for the setting which
|
|
|
+ * Description: Searches the settings array for the setting which
|
|
|
* matches the desired speed and duplex, and returns the index
|
|
|
* of that setting. Returns the index of the last setting if
|
|
|
* none of the others match.
|
|
@@ -192,11 +228,12 @@ static inline int phy_find_setting(int speed, int duplex)
|
|
|
return idx < MAX_NUM_SETTINGS ? idx : MAX_NUM_SETTINGS - 1;
|
|
|
}
|
|
|
|
|
|
-/* phy_find_valid
|
|
|
- * idx: The first index in settings[] to search
|
|
|
- * features: A mask of the valid settings
|
|
|
+/**
|
|
|
+ * phy_find_valid - find a PHY setting that matches the requested features mask
|
|
|
+ * @idx: The first index in settings[] to search
|
|
|
+ * @features: A mask of the valid settings
|
|
|
*
|
|
|
- * description: Returns the index of the first valid setting less
|
|
|
+ * Description: Returns the index of the first valid setting less
|
|
|
* than or equal to the one pointed to by idx, as determined by
|
|
|
* the mask in features. Returns the index of the last setting
|
|
|
* if nothing else matches.
|
|
@@ -209,11 +246,13 @@ static inline int phy_find_valid(int idx, u32 features)
|
|
|
return idx < MAX_NUM_SETTINGS ? idx : MAX_NUM_SETTINGS - 1;
|
|
|
}
|
|
|
|
|
|
-/* phy_sanitize_settings
|
|
|
+/**
|
|
|
+ * phy_sanitize_settings - make sure the PHY is set to supported speed and duplex
|
|
|
+ * @phydev: the target phy_device struct
|
|
|
*
|
|
|
- * description: Make sure the PHY is set to supported speeds and
|
|
|
+ * Description: Make sure the PHY is set to supported speeds and
|
|
|
* duplexes. Drop down by one in this order: 1000/FULL,
|
|
|
- * 1000/HALF, 100/FULL, 100/HALF, 10/FULL, 10/HALF
|
|
|
+ * 1000/HALF, 100/FULL, 100/HALF, 10/FULL, 10/HALF.
|
|
|
*/
|
|
|
void phy_sanitize_settings(struct phy_device *phydev)
|
|
|
{
|
|
@@ -232,16 +271,17 @@ void phy_sanitize_settings(struct phy_device *phydev)
|
|
|
}
|
|
|
EXPORT_SYMBOL(phy_sanitize_settings);
|
|
|
|
|
|
-/* phy_ethtool_sset:
|
|
|
- * A generic ethtool sset function. Handles all the details
|
|
|
+/**
|
|
|
+ * phy_ethtool_sset - generic ethtool sset function, handles all the details
|
|
|
+ * @phydev: target phy_device struct
|
|
|
+ * @cmd: ethtool_cmd
|
|
|
*
|
|
|
* A few notes about parameter checking:
|
|
|
* - We don't set port or transceiver, so we don't care what they
|
|
|
* were set to.
|
|
|
* - phy_start_aneg() will make sure forced settings are sane, and
|
|
|
* choose the next best ones from the ones selected, so we don't
|
|
|
- * care if ethtool tries to give us bad values
|
|
|
- *
|
|
|
+ * care if ethtool tries to give us bad values.
|
|
|
*/
|
|
|
int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd)
|
|
|
{
|
|
@@ -304,9 +344,15 @@ int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd)
|
|
|
}
|
|
|
EXPORT_SYMBOL(phy_ethtool_gset);
|
|
|
|
|
|
-/* Note that this function is currently incompatible with the
|
|
|
+/**
|
|
|
+ * phy_mii_ioctl - generic PHY MII ioctl interface
|
|
|
+ * @phydev: the phy_device struct
|
|
|
+ * @mii_data: MII ioctl data
|
|
|
+ * @cmd: ioctl cmd to execute
|
|
|
+ *
|
|
|
+ * Note that this function is currently incompatible with the
|
|
|
* PHYCONTROL layer. It changes registers without regard to
|
|
|
- * current state. Use at own risk
|
|
|
+ * current state. Use at own risk.
|
|
|
*/
|
|
|
int phy_mii_ioctl(struct phy_device *phydev,
|
|
|
struct mii_ioctl_data *mii_data, int cmd)
|
|
@@ -358,13 +404,14 @@ int phy_mii_ioctl(struct phy_device *phydev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/* phy_start_aneg
|
|
|
+/**
|
|
|
+ * phy_start_aneg - start auto-negotiation for this PHY device
|
|
|
+ * @phydev: the phy_device struct
|
|
|
*
|
|
|
- * description: Sanitizes the settings (if we're not
|
|
|
- * autonegotiating them), and then calls the driver's
|
|
|
- * config_aneg function. If the PHYCONTROL Layer is operating,
|
|
|
- * we change the state to reflect the beginning of
|
|
|
- * Auto-negotiation or forcing.
|
|
|
+ * Description: Sanitizes the settings (if we're not autonegotiating
|
|
|
+ * them), and then calls the driver's config_aneg function.
|
|
|
+ * If the PHYCONTROL Layer is operating, we change the state to
|
|
|
+ * reflect the beginning of Auto-negotiation or forcing.
|
|
|
*/
|
|
|
int phy_start_aneg(struct phy_device *phydev)
|
|
|
{
|
|
@@ -400,15 +447,19 @@ EXPORT_SYMBOL(phy_start_aneg);
|
|
|
static void phy_change(struct work_struct *work);
|
|
|
static void phy_timer(unsigned long data);
|
|
|
|
|
|
-/* phy_start_machine:
|
|
|
+/**
|
|
|
+ * phy_start_machine - start PHY state machine tracking
|
|
|
+ * @phydev: the phy_device struct
|
|
|
+ * @handler: callback function for state change notifications
|
|
|
*
|
|
|
- * description: The PHY infrastructure can run a state machine
|
|
|
+ * Description: The PHY infrastructure can run a state machine
|
|
|
* which tracks whether the PHY is starting up, negotiating,
|
|
|
* etc. This function starts the timer which tracks the state
|
|
|
- * of the PHY. If you want to be notified when the state
|
|
|
- * changes, pass in the callback, otherwise, pass NULL. If you
|
|
|
+ * of the PHY. If you want to be notified when the state changes,
|
|
|
+ * pass in the callback @handler, otherwise, pass NULL. If you
|
|
|
* want to maintain your own state machine, do not call this
|
|
|
- * function. */
|
|
|
+ * function.
|
|
|
+ */
|
|
|
void phy_start_machine(struct phy_device *phydev,
|
|
|
void (*handler)(struct net_device *))
|
|
|
{
|
|
@@ -420,9 +471,11 @@ void phy_start_machine(struct phy_device *phydev,
|
|
|
mod_timer(&phydev->phy_timer, jiffies + HZ);
|
|
|
}
|
|
|
|
|
|
-/* phy_stop_machine
|
|
|
+/**
|
|
|
+ * phy_stop_machine - stop the PHY state machine tracking
|
|
|
+ * @phydev: target phy_device struct
|
|
|
*
|
|
|
- * description: Stops the state machine timer, sets the state to UP
|
|
|
+ * Description: Stops the state machine timer, sets the state to UP
|
|
|
* (unless it wasn't up yet). This function must be called BEFORE
|
|
|
* phy_detach.
|
|
|
*/
|
|
@@ -438,12 +491,14 @@ void phy_stop_machine(struct phy_device *phydev)
|
|
|
phydev->adjust_state = NULL;
|
|
|
}
|
|
|
|
|
|
-/* phy_force_reduction
|
|
|
+/**
|
|
|
+ * phy_force_reduction - reduce PHY speed/duplex settings by one step
|
|
|
+ * @phydev: target phy_device struct
|
|
|
*
|
|
|
- * description: Reduces the speed/duplex settings by
|
|
|
- * one notch. The order is so:
|
|
|
- * 1000/FULL, 1000/HALF, 100/FULL, 100/HALF,
|
|
|
- * 10/FULL, 10/HALF. The function bottoms out at 10/HALF.
|
|
|
+ * Description: Reduces the speed/duplex settings by one notch,
|
|
|
+ * in this order--
|
|
|
+ * 1000/FULL, 1000/HALF, 100/FULL, 100/HALF, 10/FULL, 10/HALF.
|
|
|
+ * The function bottoms out at 10/HALF.
|
|
|
*/
|
|
|
static void phy_force_reduction(struct phy_device *phydev)
|
|
|
{
|
|
@@ -464,7 +519,9 @@ static void phy_force_reduction(struct phy_device *phydev)
|
|
|
}
|
|
|
|
|
|
|
|
|
-/* phy_error:
|
|
|
+/**
|
|
|
+ * phy_error - enter HALTED state for this PHY device
|
|
|
+ * @phydev: target phy_device struct
|
|
|
*
|
|
|
* Moves the PHY to the HALTED state in response to a read
|
|
|
* or write error, and tells the controller the link is down.
|
|
@@ -478,9 +535,12 @@ void phy_error(struct phy_device *phydev)
|
|
|
spin_unlock(&phydev->lock);
|
|
|
}
|
|
|
|
|
|
-/* phy_interrupt
|
|
|
+/**
|
|
|
+ * phy_interrupt - PHY interrupt handler
|
|
|
+ * @irq: interrupt line
|
|
|
+ * @phy_dat: phy_device pointer
|
|
|
*
|
|
|
- * description: When a PHY interrupt occurs, the handler disables
|
|
|
+ * Description: When a PHY interrupt occurs, the handler disables
|
|
|
* interrupts, and schedules a work task to clear the interrupt.
|
|
|
*/
|
|
|
static irqreturn_t phy_interrupt(int irq, void *phy_dat)
|
|
@@ -501,7 +561,10 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
|
-/* Enable the interrupts from the PHY side */
|
|
|
+/**
|
|
|
+ * phy_enable_interrupts - Enable the interrupts from the PHY side
|
|
|
+ * @phydev: target phy_device struct
|
|
|
+ */
|
|
|
int phy_enable_interrupts(struct phy_device *phydev)
|
|
|
{
|
|
|
int err;
|
|
@@ -517,7 +580,10 @@ int phy_enable_interrupts(struct phy_device *phydev)
|
|
|
}
|
|
|
EXPORT_SYMBOL(phy_enable_interrupts);
|
|
|
|
|
|
-/* Disable the PHY interrupts from the PHY side */
|
|
|
+/**
|
|
|
+ * phy_disable_interrupts - Disable the PHY interrupts from the PHY side
|
|
|
+ * @phydev: target phy_device struct
|
|
|
+ */
|
|
|
int phy_disable_interrupts(struct phy_device *phydev)
|
|
|
{
|
|
|
int err;
|
|
@@ -543,13 +609,15 @@ phy_err:
|
|
|
}
|
|
|
EXPORT_SYMBOL(phy_disable_interrupts);
|
|
|
|
|
|
-/* phy_start_interrupts
|
|
|
+/**
|
|
|
+ * phy_start_interrupts - request and enable interrupts for a PHY device
|
|
|
+ * @phydev: target phy_device struct
|
|
|
*
|
|
|
- * description: Request the interrupt for the given PHY. If
|
|
|
- * this fails, then we set irq to PHY_POLL.
|
|
|
+ * Description: Request the interrupt for the given PHY.
|
|
|
+ * If this fails, then we set irq to PHY_POLL.
|
|
|
* Otherwise, we enable the interrupts in the PHY.
|
|
|
- * Returns 0 on success.
|
|
|
* This should only be called with a valid IRQ number.
|
|
|
+ * Returns 0 on success or < 0 on error.
|
|
|
*/
|
|
|
int phy_start_interrupts(struct phy_device *phydev)
|
|
|
{
|
|
@@ -574,6 +642,10 @@ int phy_start_interrupts(struct phy_device *phydev)
|
|
|
}
|
|
|
EXPORT_SYMBOL(phy_start_interrupts);
|
|
|
|
|
|
+/**
|
|
|
+ * phy_stop_interrupts - disable interrupts from a PHY device
|
|
|
+ * @phydev: target phy_device struct
|
|
|
+ */
|
|
|
int phy_stop_interrupts(struct phy_device *phydev)
|
|
|
{
|
|
|
int err;
|
|
@@ -596,7 +668,10 @@ int phy_stop_interrupts(struct phy_device *phydev)
|
|
|
EXPORT_SYMBOL(phy_stop_interrupts);
|
|
|
|
|
|
|
|
|
-/* Scheduled by the phy_interrupt/timer to handle PHY changes */
|
|
|
+/**
|
|
|
+ * phy_change - Scheduled by the phy_interrupt/timer to handle PHY changes
|
|
|
+ * @work: work_struct that describes the work to be done
|
|
|
+ */
|
|
|
static void phy_change(struct work_struct *work)
|
|
|
{
|
|
|
int err;
|
|
@@ -630,7 +705,10 @@ phy_err:
|
|
|
phy_error(phydev);
|
|
|
}
|
|
|
|
|
|
-/* Bring down the PHY link, and stop checking the status. */
|
|
|
+/**
|
|
|
+ * phy_stop - Bring down the PHY link, and stop checking the status
|
|
|
+ * @phydev: target phy_device struct
|
|
|
+ */
|
|
|
void phy_stop(struct phy_device *phydev)
|
|
|
{
|
|
|
spin_lock(&phydev->lock);
|
|
@@ -659,9 +737,11 @@ out_unlock:
|
|
|
}
|
|
|
|
|
|
|
|
|
-/* phy_start
|
|
|
+/**
|
|
|
+ * phy_start - start or restart a PHY device
|
|
|
+ * @phydev: target phy_device struct
|
|
|
*
|
|
|
- * description: Indicates the attached device's readiness to
|
|
|
+ * Description: Indicates the attached device's readiness to
|
|
|
* handle PHY-related work. Used during startup to start the
|
|
|
* PHY, and after a call to phy_stop() to resume operation.
|
|
|
* Also used to indicate the MDIO bus has cleared an error
|