diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2012-01-21 22:44:09 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2012-01-21 22:44:09 +0000 |
commit | 31a1cdad82a50cb32e707c4d30054ed03d6c1f30 (patch) | |
tree | 35f870b36c51f407dc141823212c7376ae45793a /target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | |
parent | 69ece6cfdcf643830894e34b1072363fc95f762b (diff) | |
download | upstream-31a1cdad82a50cb32e707c4d30054ed03d6c1f30.tar.gz upstream-31a1cdad82a50cb32e707c4d30054ed03d6c1f30.tar.bz2 upstream-31a1cdad82a50cb32e707c4d30054ed03d6c1f30.zip |
generic: rtl8366: add rtl8366_smi_write_reg_noack helper
After issuing a soft reset on the RT8366{S,RB}
switch, waiting for the last acknowlegement fails
in rtl8366_smi_write_reg. Add a _noack version of
the function and use that for issuing a soft reset.
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@29844 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic/files/drivers/net/phy/rtl8366_smi.c')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c index 971c95f83d..e48ca99ce8 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c @@ -157,6 +157,12 @@ static int rtl8366_smi_write_byte(struct rtl8366_smi *smi, u8 data) return rtl8366_smi_wait_for_ack(smi); } +static int rtl8366_smi_write_byte_noack(struct rtl8366_smi *smi, u8 data) +{ + rtl8366_smi_write_bits(smi, data, 8); + return 0; +} + static int rtl8366_smi_read_byte0(struct rtl8366_smi *smi, u8 *data) { u32 t; @@ -228,7 +234,8 @@ int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data) } EXPORT_SYMBOL_GPL(rtl8366_smi_read_reg); -int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data) +static int __rtl8366_smi_write_reg(struct rtl8366_smi *smi, + u32 addr, u32 data, bool ack) { unsigned long flags; int ret; @@ -258,7 +265,10 @@ int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data) goto out; /* write DATA[15:8] */ - ret = rtl8366_smi_write_byte(smi, data >> 8); + if (ack) + ret = rtl8366_smi_write_byte(smi, data >> 8); + else + ret = rtl8366_smi_write_byte_noack(smi, data >> 8); if (ret) goto out; @@ -270,8 +280,19 @@ int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data) return ret; } + +int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data) +{ + return __rtl8366_smi_write_reg(smi, addr, data, true); +} EXPORT_SYMBOL_GPL(rtl8366_smi_write_reg); +int rtl8366_smi_write_reg_noack(struct rtl8366_smi *smi, u32 addr, u32 data) +{ + return __rtl8366_smi_write_reg(smi, addr, data, false); +} +EXPORT_SYMBOL_GPL(rtl8366_smi_write_reg_noack); + int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, u32 data) { u32 t; |