Commit 7d7549ed authored by David S. Miller's avatar David S. Miller

Merge branch 'r8152-phy-adjustments'

Hayes Wang says:

====================
r8152: code adjustment for PHY

These patches are for adjusting the code about PHY and setting speed.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents e8eb36cd aa7e26b6
...@@ -602,7 +602,7 @@ struct r8152 { ...@@ -602,7 +602,7 @@ struct r8152 {
struct list_head rx_done, tx_free; struct list_head rx_done, tx_free;
struct sk_buff_head tx_queue, rx_queue; struct sk_buff_head tx_queue, rx_queue;
spinlock_t rx_lock, tx_lock; spinlock_t rx_lock, tx_lock;
struct delayed_work schedule; struct delayed_work schedule, hw_phy_work;
struct mii_if_info mii; struct mii_if_info mii;
struct mutex control; /* use for hw setting */ struct mutex control; /* use for hw setting */
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
...@@ -619,6 +619,7 @@ struct r8152 { ...@@ -619,6 +619,7 @@ struct r8152 {
int (*eee_get)(struct r8152 *, struct ethtool_eee *); int (*eee_get)(struct r8152 *, struct ethtool_eee *);
int (*eee_set)(struct r8152 *, struct ethtool_eee *); int (*eee_set)(struct r8152 *, struct ethtool_eee *);
bool (*in_nway)(struct r8152 *); bool (*in_nway)(struct r8152 *);
void (*hw_phy_cfg)(struct r8152 *);
} rtl_ops; } rtl_ops;
int intr_interval; int intr_interval;
...@@ -627,8 +628,11 @@ struct r8152 { ...@@ -627,8 +628,11 @@ struct r8152 {
u32 tx_qlen; u32 tx_qlen;
u32 coalesce; u32 coalesce;
u16 ocp_base; u16 ocp_base;
u16 speed;
u8 *intr_buff; u8 *intr_buff;
u8 version; u8 version;
u8 duplex;
u8 autoneg;
}; };
enum rtl_version { enum rtl_version {
...@@ -2499,8 +2503,6 @@ static void r8152b_exit_oob(struct r8152 *tp) ...@@ -2499,8 +2503,6 @@ static void r8152b_exit_oob(struct r8152 *tp)
rxdy_gated_en(tp, true); rxdy_gated_en(tp, true);
r8153_teredo_off(tp); r8153_teredo_off(tp);
r8152b_hw_phy_cfg(tp);
ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML); ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, 0x00); ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, 0x00);
...@@ -2678,8 +2680,6 @@ static void r8153_first_init(struct r8152 *tp) ...@@ -2678,8 +2680,6 @@ static void r8153_first_init(struct r8152 *tp)
ocp_data &= ~RCR_ACPT_ALL; ocp_data &= ~RCR_ACPT_ALL;
ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
r8153_hw_phy_cfg(tp);
rtl8152_nic_reset(tp); rtl8152_nic_reset(tp);
ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
...@@ -3040,6 +3040,27 @@ static void rtl_work_func_t(struct work_struct *work) ...@@ -3040,6 +3040,27 @@ static void rtl_work_func_t(struct work_struct *work)
usb_autopm_put_interface(tp->intf); usb_autopm_put_interface(tp->intf);
} }
static void rtl_hw_phy_work_func_t(struct work_struct *work)
{
struct r8152 *tp = container_of(work, struct r8152, hw_phy_work.work);
if (test_bit(RTL8152_UNPLUG, &tp->flags))
return;
if (usb_autopm_get_interface(tp->intf) < 0)
return;
mutex_lock(&tp->control);
tp->rtl_ops.hw_phy_cfg(tp);
rtl8152_set_speed(tp, tp->autoneg, tp->speed, tp->duplex);
mutex_unlock(&tp->control);
usb_autopm_put_interface(tp->intf);
}
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int rtl_notifier(struct notifier_block *nb, unsigned long action, static int rtl_notifier(struct notifier_block *nb, unsigned long action,
void *data) void *data)
...@@ -3088,9 +3109,6 @@ static int rtl8152_open(struct net_device *netdev) ...@@ -3088,9 +3109,6 @@ static int rtl8152_open(struct net_device *netdev)
tp->rtl_ops.up(tp); tp->rtl_ops.up(tp);
rtl8152_set_speed(tp, AUTONEG_ENABLE,
tp->mii.supports_gmii ? SPEED_1000 : SPEED_100,
DUPLEX_FULL);
netif_carrier_off(netdev); netif_carrier_off(netdev);
netif_start_queue(netdev); netif_start_queue(netdev);
set_bit(WORK_ENABLE, &tp->flags); set_bit(WORK_ENABLE, &tp->flags);
...@@ -3518,6 +3536,7 @@ static int rtl8152_resume(struct usb_interface *intf) ...@@ -3518,6 +3536,7 @@ static int rtl8152_resume(struct usb_interface *intf)
if (!test_bit(SELECTIVE_SUSPEND, &tp->flags)) { if (!test_bit(SELECTIVE_SUSPEND, &tp->flags)) {
tp->rtl_ops.init(tp); tp->rtl_ops.init(tp);
queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0);
netif_device_attach(tp->netdev); netif_device_attach(tp->netdev);
} }
...@@ -3532,10 +3551,6 @@ static int rtl8152_resume(struct usb_interface *intf) ...@@ -3532,10 +3551,6 @@ static int rtl8152_resume(struct usb_interface *intf)
napi_enable(&tp->napi); napi_enable(&tp->napi);
} else { } else {
tp->rtl_ops.up(tp); tp->rtl_ops.up(tp);
rtl8152_set_speed(tp, AUTONEG_ENABLE,
tp->mii.supports_gmii ?
SPEED_1000 : SPEED_100,
DUPLEX_FULL);
netif_carrier_off(tp->netdev); netif_carrier_off(tp->netdev);
set_bit(WORK_ENABLE, &tp->flags); set_bit(WORK_ENABLE, &tp->flags);
} }
...@@ -3665,6 +3680,11 @@ static int rtl8152_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -3665,6 +3680,11 @@ static int rtl8152_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
mutex_lock(&tp->control); mutex_lock(&tp->control);
ret = rtl8152_set_speed(tp, cmd->autoneg, cmd->speed, cmd->duplex); ret = rtl8152_set_speed(tp, cmd->autoneg, cmd->speed, cmd->duplex);
if (!ret) {
tp->autoneg = cmd->autoneg;
tp->speed = cmd->speed;
tp->duplex = cmd->duplex;
}
mutex_unlock(&tp->control); mutex_unlock(&tp->control);
...@@ -4122,6 +4142,7 @@ static int rtl_ops_init(struct r8152 *tp) ...@@ -4122,6 +4142,7 @@ static int rtl_ops_init(struct r8152 *tp)
ops->eee_get = r8152_get_eee; ops->eee_get = r8152_get_eee;
ops->eee_set = r8152_set_eee; ops->eee_set = r8152_set_eee;
ops->in_nway = rtl8152_in_nway; ops->in_nway = rtl8152_in_nway;
ops->hw_phy_cfg = r8152b_hw_phy_cfg;
break; break;
case RTL_VER_03: case RTL_VER_03:
...@@ -4137,6 +4158,7 @@ static int rtl_ops_init(struct r8152 *tp) ...@@ -4137,6 +4158,7 @@ static int rtl_ops_init(struct r8152 *tp)
ops->eee_get = r8153_get_eee; ops->eee_get = r8153_get_eee;
ops->eee_set = r8153_set_eee; ops->eee_set = r8153_set_eee;
ops->in_nway = rtl8153_in_nway; ops->in_nway = rtl8153_in_nway;
ops->hw_phy_cfg = r8153_hw_phy_cfg;
break; break;
default: default:
...@@ -4183,6 +4205,7 @@ static int rtl8152_probe(struct usb_interface *intf, ...@@ -4183,6 +4205,7 @@ static int rtl8152_probe(struct usb_interface *intf,
mutex_init(&tp->control); mutex_init(&tp->control);
INIT_DELAYED_WORK(&tp->schedule, rtl_work_func_t); INIT_DELAYED_WORK(&tp->schedule, rtl_work_func_t);
INIT_DELAYED_WORK(&tp->hw_phy_work, rtl_hw_phy_work_func_t);
netdev->netdev_ops = &rtl8152_netdev_ops; netdev->netdev_ops = &rtl8152_netdev_ops;
netdev->watchdog_timeo = RTL8152_TX_TIMEOUT; netdev->watchdog_timeo = RTL8152_TX_TIMEOUT;
...@@ -4222,9 +4245,14 @@ static int rtl8152_probe(struct usb_interface *intf, ...@@ -4222,9 +4245,14 @@ static int rtl8152_probe(struct usb_interface *intf,
break; break;
} }
tp->autoneg = AUTONEG_ENABLE;
tp->speed = tp->mii.supports_gmii ? SPEED_1000 : SPEED_100;
tp->duplex = DUPLEX_FULL;
intf->needs_remote_wakeup = 1; intf->needs_remote_wakeup = 1;
tp->rtl_ops.init(tp); tp->rtl_ops.init(tp);
queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0);
set_ethernet_addr(tp); set_ethernet_addr(tp);
usb_set_intfdata(intf, tp); usb_set_intfdata(intf, tp);
...@@ -4270,6 +4298,7 @@ static void rtl8152_disconnect(struct usb_interface *intf) ...@@ -4270,6 +4298,7 @@ static void rtl8152_disconnect(struct usb_interface *intf)
netif_napi_del(&tp->napi); netif_napi_del(&tp->napi);
unregister_netdev(tp->netdev); unregister_netdev(tp->netdev);
cancel_delayed_work_sync(&tp->hw_phy_work);
tp->rtl_ops.unload(tp); tp->rtl_ops.unload(tp);
free_netdev(tp->netdev); free_netdev(tp->netdev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment