Commit e2859980 authored by David S. Miller's avatar David S. Miller

Merge branch 'bgmac-fixes'

Jon Mason says:

====================
net: ethernet: bgmac: bug fixes

Changes in v5:
* Rebased to the latest code and fixed up a compile error due to the
  mac_addr struct going away (found by David Miller)

Changes in v4:
* Added the udelays from the previous code (per David Miller)

Changes in v3:
* Reworked the init sequence patch to only remove the device reset if
  the device is actually in reset.  Given that this code doesn't bear
  much resemblance to the original code, I'm changing the author of the
  patch.  This was tested on NS2 SVK.

Changes in v2:
* Reworked the first match to make it more obvious what portions of the
  register were being preserved (Per Rafal Mileki)
* Style change to reorder the function variables in patch 2 (per Sergei
  Shtylyov)

Bug fixes for bgmac driver
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 2ddbcea7 fa42245d
...@@ -51,8 +51,7 @@ static void platform_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value) ...@@ -51,8 +51,7 @@ static void platform_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
static bool platform_bgmac_clk_enabled(struct bgmac *bgmac) static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
{ {
if ((bgmac_idm_read(bgmac, BCMA_IOCTL) & if ((bgmac_idm_read(bgmac, BCMA_IOCTL) & BGMAC_CLK_EN) != BGMAC_CLK_EN)
(BCMA_IOCTL_CLK | BCMA_IOCTL_FGC)) != BCMA_IOCTL_CLK)
return false; return false;
if (bgmac_idm_read(bgmac, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET) if (bgmac_idm_read(bgmac, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
return false; return false;
...@@ -61,15 +60,25 @@ static bool platform_bgmac_clk_enabled(struct bgmac *bgmac) ...@@ -61,15 +60,25 @@ static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
static void platform_bgmac_clk_enable(struct bgmac *bgmac, u32 flags) static void platform_bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
{ {
bgmac_idm_write(bgmac, BCMA_IOCTL, u32 val;
(BCMA_IOCTL_CLK | BCMA_IOCTL_FGC | flags));
bgmac_idm_read(bgmac, BCMA_IOCTL);
bgmac_idm_write(bgmac, BCMA_RESET_CTL, 0); /* The Reset Control register only contains a single bit to show if the
bgmac_idm_read(bgmac, BCMA_RESET_CTL); * controller is currently in reset. Do a sanity check here, just in
udelay(1); * case the bootloader happened to leave the device in reset.
*/
val = bgmac_idm_read(bgmac, BCMA_RESET_CTL);
if (val) {
bgmac_idm_write(bgmac, BCMA_RESET_CTL, 0);
bgmac_idm_read(bgmac, BCMA_RESET_CTL);
udelay(1);
}
bgmac_idm_write(bgmac, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags)); val = bgmac_idm_read(bgmac, BCMA_IOCTL);
/* Some bits of BCMA_IOCTL set by HW/ATF and should not change */
val |= flags & ~(BGMAC_AWCACHE | BGMAC_ARCACHE | BGMAC_AWUSER |
BGMAC_ARUSER);
val |= BGMAC_CLK_EN;
bgmac_idm_write(bgmac, BCMA_IOCTL, val);
bgmac_idm_read(bgmac, BCMA_IOCTL); bgmac_idm_read(bgmac, BCMA_IOCTL);
udelay(1); udelay(1);
} }
......
...@@ -1223,12 +1223,16 @@ static netdev_tx_t bgmac_start_xmit(struct sk_buff *skb, ...@@ -1223,12 +1223,16 @@ static netdev_tx_t bgmac_start_xmit(struct sk_buff *skb,
static int bgmac_set_mac_address(struct net_device *net_dev, void *addr) static int bgmac_set_mac_address(struct net_device *net_dev, void *addr)
{ {
struct bgmac *bgmac = netdev_priv(net_dev); struct bgmac *bgmac = netdev_priv(net_dev);
struct sockaddr *sa = addr;
int ret; int ret;
ret = eth_prepare_mac_addr_change(net_dev, addr); ret = eth_prepare_mac_addr_change(net_dev, addr);
if (ret < 0) if (ret < 0)
return ret; return ret;
bgmac_write_mac_address(bgmac, (u8 *)addr);
ether_addr_copy(net_dev->dev_addr, sa->sa_data);
bgmac_write_mac_address(bgmac, net_dev->dev_addr);
eth_commit_mac_addr_change(net_dev, addr); eth_commit_mac_addr_change(net_dev, addr);
return 0; return 0;
} }
......
...@@ -213,6 +213,22 @@ ...@@ -213,6 +213,22 @@
/* BCMA GMAC core specific IO Control (BCMA_IOCTL) flags */ /* BCMA GMAC core specific IO Control (BCMA_IOCTL) flags */
#define BGMAC_BCMA_IOCTL_SW_CLKEN 0x00000004 /* PHY Clock Enable */ #define BGMAC_BCMA_IOCTL_SW_CLKEN 0x00000004 /* PHY Clock Enable */
#define BGMAC_BCMA_IOCTL_SW_RESET 0x00000008 /* PHY Reset */ #define BGMAC_BCMA_IOCTL_SW_RESET 0x00000008 /* PHY Reset */
/* The IOCTL values appear to be different in NS, NSP, and NS2, and do not match
* the values directly above
*/
#define BGMAC_CLK_EN BIT(0)
#define BGMAC_RESERVED_0 BIT(1)
#define BGMAC_SOURCE_SYNC_MODE_EN BIT(2)
#define BGMAC_DEST_SYNC_MODE_EN BIT(3)
#define BGMAC_TX_CLK_OUT_INVERT_EN BIT(4)
#define BGMAC_DIRECT_GMII_MODE BIT(5)
#define BGMAC_CLK_250_SEL BIT(6)
#define BGMAC_AWCACHE (0xf << 7)
#define BGMAC_RESERVED_1 (0x1f << 11)
#define BGMAC_ARCACHE (0xf << 16)
#define BGMAC_AWUSER (0x3f << 20)
#define BGMAC_ARUSER (0x3f << 26)
#define BGMAC_RESERVED BIT(31)
/* BCMA GMAC core specific IO status (BCMA_IOST) flags */ /* BCMA GMAC core specific IO status (BCMA_IOST) flags */
#define BGMAC_BCMA_IOST_ATTACHED 0x00000800 #define BGMAC_BCMA_IOST_ATTACHED 0x00000800
......
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